neo-0.3.3/0000755000175000017500000000000012273723667013361 5ustar sgarciasgarcia00000000000000neo-0.3.3/setup.py0000755000175000017500000000270112273723542015066 0ustar sgarciasgarcia00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- from setuptools import setup import os long_description = open("README.rst").read() install_requires = ['numpy>=1.3.0', 'quantities>=0.9.0'] if os.environ.get('TRAVIS') == 'true' and \ os.environ.get('TRAVIS_PYTHON_VERSION').startswith('2.6'): install_requires.append('unittest2>=0.5.1') setup( name = "neo", version = '0.3.3', packages = ['neo', 'neo.core', 'neo.io', 'neo.test', 'neo.test.iotest'], install_requires=install_requires, author = "Neo authors and contributors", author_email = "sgarcia at olfac.univ-lyon1.fr", description = "Neo is a package for representing electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats", long_description = long_description, license = "BSD-3-Clause", url='http://neuralensemble.org/neo', classifiers = [ 'Development Status :: 4 - Beta', 'Intended Audience :: Science/Research', 'License :: OSI Approved :: BSD License', 'Natural Language :: English', 'Operating System :: OS Independent', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.3', 'Topic :: Scientific/Engineering'] ) neo-0.3.3/neo.egg-info/0000755000175000017500000000000012273723667015634 5ustar sgarciasgarcia00000000000000neo-0.3.3/neo.egg-info/top_level.txt0000644000175000017500000000000412273723667020360 0ustar sgarciasgarcia00000000000000neo neo-0.3.3/neo.egg-info/requires.txt0000644000175000017500000000003612273723667020233 0ustar sgarciasgarcia00000000000000numpy>=1.3.0 quantities>=0.9.0neo-0.3.3/neo.egg-info/SOURCES.txt0000644000175000017500000000676312273723667017534 0ustar sgarciasgarcia00000000000000MANIFEST.in README.rst setup.py doc/Makefile doc/make.bat doc/source/api_reference.rst doc/source/authors.rst doc/source/conf.py doc/source/core.rst doc/source/developers_guide.rst doc/source/examples.rst doc/source/gif2011workshop.rst doc/source/index.rst doc/source/install.rst doc/source/io.rst doc/source/io_developers_guide.rst doc/source/specific_annotations.rst doc/source/usecases.rst doc/source/whatisnew.rst doc/source/images/base_schematic.png doc/source/images/generate_diagram.py doc/source/images/multi_segment_diagram.png doc/source/images/multi_segment_diagram_spiketrain.png doc/source/images/neo_UML_French_workshop.png doc/source/images/neologo.png doc/source/images/neologo_light.png doc/source/images/simple_generated_diagram.png examples/generated_data.py examples/read_files.py examples/simple_plot_with_matplotlib.py neo/__init__.py neo/description.py neo/version.py neo.egg-info/PKG-INFO neo.egg-info/SOURCES.txt neo.egg-info/dependency_links.txt neo.egg-info/requires.txt neo.egg-info/top_level.txt neo/core/__init__.py neo/core/analogsignal.py neo/core/analogsignalarray.py neo/core/baseneo.py neo/core/block.py neo/core/epoch.py neo/core/epocharray.py neo/core/event.py neo/core/eventarray.py neo/core/irregularlysampledsignal.py neo/core/recordingchannel.py neo/core/recordingchannelgroup.py neo/core/segment.py neo/core/spike.py neo/core/spiketrain.py neo/core/unit.py neo/io/__init__.py neo/io/alphaomegaio.py neo/io/asciisignalio.py neo/io/asciispiketrainio.py neo/io/axonio.py neo/io/baseio.py neo/io/blackrockio.py neo/io/brainvisionio.py neo/io/brainwaredamio.py neo/io/brainwaref32io.py neo/io/brainwaresrcio.py neo/io/elanio.py neo/io/elphyio.py neo/io/exampleio.py neo/io/hdf5io.py neo/io/klustakwikio.py neo/io/micromedio.py neo/io/neomatlabio.py neo/io/neuroexplorerio.py neo/io/neuroscopeio.py neo/io/neuroshareio.py neo/io/pickleio.py neo/io/plexonio.py neo/io/pynnio.py neo/io/rawbinarysignalio.py neo/io/spike2io.py neo/io/tdtio.py neo/io/tools.py neo/io/winedrio.py neo/io/winwcpio.py neo/test/__init__.py neo/test/test_analogsignal.py neo/test/test_analogsignalarray.py neo/test/test_base.py neo/test/test_block.py neo/test/test_epoch.py neo/test/test_epocharray.py neo/test/test_event.py neo/test/test_eventarray.py neo/test/test_irregularysampledsignal.py neo/test/test_recordingchannel.py neo/test/test_recordingchannelgroup.py neo/test/test_segment.py neo/test/test_spike.py neo/test/test_spiketrain.py neo/test/test_unit.py neo/test/tools.py neo/test/iotest/__init__.py neo/test/iotest/common_io_test.py neo/test/iotest/generate_datasets.py neo/test/iotest/test_alphaomegaio.py neo/test/iotest/test_asciisignalio.py neo/test/iotest/test_asciispiketrainio.py neo/test/iotest/test_axonio.py neo/test/iotest/test_baseio.py neo/test/iotest/test_blackrockio.py neo/test/iotest/test_brainvisionio.py neo/test/iotest/test_brainwaredamio.py neo/test/iotest/test_brainwaref32io.py neo/test/iotest/test_brainwaresrcio.py neo/test/iotest/test_elanio.py neo/test/iotest/test_elphyio.py neo/test/iotest/test_exampleio.py neo/test/iotest/test_hdf5io.py neo/test/iotest/test_klustakwikio.py neo/test/iotest/test_micromedio.py neo/test/iotest/test_neomatlabio.py neo/test/iotest/test_neuroexplorerio.py neo/test/iotest/test_neuroscopeio.py neo/test/iotest/test_neuroshareio.py neo/test/iotest/test_plexonio.py neo/test/iotest/test_pynnio.py neo/test/iotest/test_rawbinarysignalio.py neo/test/iotest/test_spike2io.py neo/test/iotest/test_tdtio.py neo/test/iotest/test_winedrio.py neo/test/iotest/test_winwcpio.py neo/test/iotest/tools.pyneo-0.3.3/neo.egg-info/PKG-INFO0000644000175000017500000000577012273723667016742 0ustar sgarciasgarcia00000000000000Metadata-Version: 1.1 Name: neo Version: 0.3.3 Summary: Neo is a package for representing electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats Home-page: http://neuralensemble.org/neo Author: Neo authors and contributors Author-email: sgarcia at olfac.univ-lyon1.fr License: BSD-3-Clause Description: === Neo === Neo is a package for representing electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats, including Spike2, NeuroExplorer, AlphaOmega, Axon, Blackrock, Plexon, Tdt, and support for writing to a subset of these formats plus non-proprietary formats including HDF5. The goal of Neo is to improve interoperability between Python tools for analyzing, visualizing and generating electrophysiology data (such as OpenElectrophy, NeuroTools, G-node, Helmholtz, PyNN) by providing a common, shared object model. In order to be as lightweight a dependency as possible, Neo is deliberately limited to represention of data, with no functions for data analysis or visualization. Neo implements a hierarchical data model well adapted to intracellular and extracellular electrophysiology and EEG data with support for multi-electrodes (for example tetrodes). Neo's data objects build on the quantities_ package, which in turn builds on NumPy by adding support for physical dimensions. Thus neo objects behave just like normal NumPy arrays, but with additional metadata, checks for dimensional consistency and automatic unit conversion. Code status ----------- .. image:: https://secure.travis-ci.org/NeuralEnsemble/python-neo.png?branch=master :target: https://travis-ci.org/NeuralEnsemble/python-neo.png More information ---------------- - Home page: http://neuralensemble.org/neo - Mailing list: https://groups.google.com/forum/?fromgroups#!forum/neuralensemble - Documentation: http://packages.python.org/neo/ - Bug reports: https://github.com/NeuralEnsemble/python-neo/issues For installation instructions, see doc/source/install.rst :copyright: Copyright 2010-2014 by the Neo team, see AUTHORS. :license: 3-Clause Revised BSD License, see LICENSE.txt for details. Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: BSD License Classifier: Natural Language :: English Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.3 Classifier: Topic :: Scientific/Engineering neo-0.3.3/neo.egg-info/dependency_links.txt0000644000175000017500000000000112273723667021702 0ustar sgarciasgarcia00000000000000 neo-0.3.3/examples/0000755000175000017500000000000012273723667015177 5ustar sgarciasgarcia00000000000000neo-0.3.3/examples/simple_plot_with_matplotlib.py0000644000175000017500000000204112265516260023345 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ This is an example for plotting neo object with maplotlib. """ import urllib import numpy as np import quantities as pq from matplotlib import pyplot import neo url = 'https://portal.g-node.org/neo/' distantfile = url + 'neuroexplorer/File_neuroexplorer_2.nex' localfile = 'File_neuroexplorer_2.nex' urllib.urlretrieve(distantfile, localfile) reader = neo.io.NeuroExplorerIO(filename='File_neuroexplorer_2.nex') bl = reader.read(cascade=True, lazy=False)[0] for seg in bl.segments: fig = pyplot.figure() ax1 = fig.add_subplot(2, 1, 1) ax2 = fig.add_subplot(2, 1, 2) ax1.set_title(seg.file_origin) mint = 0 * pq.s maxt = np.inf * pq.s for i, asig in enumerate(seg.analogsignals): times = asig.times.rescale('s').magnitude asig = asig.rescale('mV').magnitude ax1.plot(times, asig) trains = [st.rescale('s').magnitude for st in seg.spiketrains] colors = pyplot.cm.jet(np.linspace(0, 1, len(seg.spiketrains))) ax2.eventplot(trains, colors=colors) pyplot.show() neo-0.3.3/examples/generated_data.py0000644000175000017500000001142512273723542020473 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ This is an example for creating simple plots from various Neo structures. It includes a function that generates toy data. """ from __future__ import division # Use same division in Python 2 and 3 import numpy as np import quantities as pq from matplotlib import pyplot as plt import neo def generate_block(n_segments=3, n_channels=8, n_units=3, data_samples=1000, feature_samples=100): """ Generate a block with a single recording channel group and a number of segments, recording channels and units with associated analog signals and spike trains. """ feature_len = feature_samples / data_samples # Create container and grouping objects segments = [neo.Segment(index=i) for i in range(n_segments)] rcg = neo.RecordingChannelGroup(name='T0') for i in range(n_channels): rc = neo.RecordingChannel(name='C%d' % i, index=i) rc.recordingchannelgroups = [rcg] rcg.recordingchannels.append(rc) units = [neo.Unit('U%d' % i) for i in range(n_units)] rcg.units = units block = neo.Block() block.segments = segments block.recordingchannelgroups = [rcg] # Create synthetic data for seg in segments: feature_pos = np.random.randint(0, data_samples - feature_samples) # Analog signals: Noise with a single sinewave feature wave = 3 * np.sin(np.linspace(0, 2 * np.pi, feature_samples)) for rc in rcg.recordingchannels: sig = np.random.randn(data_samples) sig[feature_pos:feature_pos + feature_samples] += wave signal = neo.AnalogSignal(sig * pq.mV, sampling_rate=1 * pq.kHz) seg.analogsignals.append(signal) rc.analogsignals.append(signal) # Spike trains: Random spike times with elevated rate in short period feature_time = feature_pos / data_samples for u in units: random_spikes = np.random.rand(20) feature_spikes = np.random.rand(5) * feature_len + feature_time spikes = np.hstack([random_spikes, feature_spikes]) train = neo.SpikeTrain(spikes * pq.s, 1 * pq.s) seg.spiketrains.append(train) u.spiketrains.append(train) neo.io.tools.create_many_to_one_relationship(block) return block block = generate_block() # In this example, we treat each segment in turn, averaging over the channels # in each: for seg in block.segments: print("Analysing segment %d" % seg.index) siglist = seg.analogsignals time_points = siglist[0].times avg = np.mean(siglist, axis=0) # Average over signals of Segment plt.figure() plt.plot(time_points, avg) plt.title("Peak response in segment %d: %f" % (seg.index, avg.max())) # The second alternative is spatial traversal of the data (by channel), with # averaging over trials. For example, perhaps you wish to see which physical # location produces the strongest response, and each stimulus was the same: # We assume that our block has only 1 RecordingChannelGroup and each # RecordingChannel only has 1 AnalogSignal. rcg = block.recordingchannelgroups[0] for rc in rcg.recordingchannels: print("Analysing channel %d: %s" % (rc.index, rc.name)) siglist = rc.analogsignals time_points = siglist[0].times avg = np.mean(siglist, axis=0) # Average over signals of RecordingChannel plt.figure() plt.plot(time_points, avg) plt.title("Average response on channel %d" % rc.index) # There are three ways to access the spike train data: by Segment, # by RecordingChannel or by Unit. # By Segment. In this example, each Segment represents data from one trial, # and we want a peristimulus time histogram (PSTH) for each trial from all # Units combined: for seg in block.segments: print("Analysing segment %d" % seg.index) stlist = [st - st.t_start for st in seg.spiketrains] count, bins = np.histogram(np.hstack(stlist)) plt.figure() plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title("PSTH in segment %d" % seg.index) # By Unit. Now we can calculate the PSTH averaged over trials for each Unit: for unit in block.list_units: stlist = [st - st.t_start for st in unit.spiketrains] count, bins = np.histogram(np.hstack(stlist)) plt.figure() plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title("PSTH of unit %s" % unit.name) # By RecordingChannelGroup. Here we calculate a PSTH averaged over trials by # channel location, blending all Units: for rcg in block.recordingchannelgroups: stlist = [] for unit in rcg.units: stlist.extend([st - st.t_start for st in unit.spiketrains]) count, bins = np.histogram(np.hstack(stlist)) plt.figure() plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title("PSTH blend of recording channel group %s" % rcg.name) plt.show() neo-0.3.3/examples/read_files.py0000644000175000017500000000211012265516260017626 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ This is an example for reading files with neo.io """ import urllib import neo # Plexon files distantfile = 'https://portal.g-node.org/neo/plexon/File_plexon_3.plx' localfile = './File_plexon_3.plx' urllib.urlretrieve(distantfile, localfile) #create a reader reader = neo.io.PlexonIO(filename='File_plexon_3.plx') # read the blocks blks = reader.read(cascade=True, lazy=False) print blks # acces to segments for blk in blks: for seg in blk.segments: print seg for asig in seg.analogsignals: print asig for st in seg.spiketrains: print st # CED Spike2 files distantfile = 'https://portal.g-node.org/neo/spike2/File_spike2_1.smr' localfile = './File_spike2_1.smr' urllib.urlretrieve(distantfile, localfile) #create a reader reader = neo.io.Spike2IO(filename='File_spike2_1.smr') # read the block bl = reader.read(cascade=True, lazy=False)[0] print bl # acces to segments for seg in bl.segments: print seg for asig in seg.analogsignals: print asig for st in seg.spiketrains: print st neo-0.3.3/README.rst0000644000175000017500000000345312273723542015045 0ustar sgarciasgarcia00000000000000=== Neo === Neo is a package for representing electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats, including Spike2, NeuroExplorer, AlphaOmega, Axon, Blackrock, Plexon, Tdt, and support for writing to a subset of these formats plus non-proprietary formats including HDF5. The goal of Neo is to improve interoperability between Python tools for analyzing, visualizing and generating electrophysiology data (such as OpenElectrophy, NeuroTools, G-node, Helmholtz, PyNN) by providing a common, shared object model. In order to be as lightweight a dependency as possible, Neo is deliberately limited to represention of data, with no functions for data analysis or visualization. Neo implements a hierarchical data model well adapted to intracellular and extracellular electrophysiology and EEG data with support for multi-electrodes (for example tetrodes). Neo's data objects build on the quantities_ package, which in turn builds on NumPy by adding support for physical dimensions. Thus neo objects behave just like normal NumPy arrays, but with additional metadata, checks for dimensional consistency and automatic unit conversion. Code status ----------- .. image:: https://secure.travis-ci.org/NeuralEnsemble/python-neo.png?branch=master :target: https://travis-ci.org/NeuralEnsemble/python-neo.png More information ---------------- - Home page: http://neuralensemble.org/neo - Mailing list: https://groups.google.com/forum/?fromgroups#!forum/neuralensemble - Documentation: http://packages.python.org/neo/ - Bug reports: https://github.com/NeuralEnsemble/python-neo/issues For installation instructions, see doc/source/install.rst :copyright: Copyright 2010-2014 by the Neo team, see AUTHORS. :license: 3-Clause Revised BSD License, see LICENSE.txt for details. neo-0.3.3/neo/0000755000175000017500000000000012273723667014142 5ustar sgarciasgarcia00000000000000neo-0.3.3/neo/io/0000755000175000017500000000000012273723667014551 5ustar sgarciasgarcia00000000000000neo-0.3.3/neo/io/blackrockio.py0000644000175000017500000004305112273723542017401 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Module for reading binary file from Blackrock format. """ import logging import struct import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import (Block, Segment, RecordingChannel, RecordingChannelGroup, AnalogSignal) from neo.io import tools class BlackrockIO(BaseIO): """ Class for reading/writing data in a BlackRock Neuroshare ns5 files. """ # Class variables demonstrating capabilities of this IO is_readable = True # This a only reading class is_writable = True # write is not supported # This IO can only manipulate continuous data, not spikes or events supported_objects = [Block, Segment, AnalogSignal, RecordingChannelGroup, RecordingChannel] # Keep things simple by always returning a block readable_objects = [Block] # And write a block writeable_objects = [Block] # Not sure what these do, if anything has_header = False is_streameable = False # The IO name and the file extensions it uses name = 'Blackrock' extensions = ['ns5'] # Operates on *.ns5 files mode = 'file' # GUI defaults for reading # Most information is acquired from the file header. read_params = { Block: [ #('rangemin' , { 'value' : -10 } ), #('rangemax' , { 'value' : 10 } ), ] } # GUI defaults for writing (not supported) write_params = None def __init__(self, filename, full_range=8192.*pq.mV) : """Initialize Blackrock reader. **Arguments** filename: string, the filename to read full_range: Quantity, the full-scale analog range of the data. This is set by your digitizing hardware. It should be in volts or millivolts. """ BaseIO.__init__(self) self.filename = filename self.full_range = full_range # The reading methods. The `lazy` and `cascade` parameters are imposed # by neo.io API def read_block(self, lazy=False, cascade=True, n_starts=None, n_stops=None, channel_list=None): """Reads the file and returns contents as a Block. The Block contains one Segment for each entry in zip(n_starts, n_stops). If these parameters are not specified, the default is to store all data in one Segment. The Block also contains one RecordingChannelGroup for all channels. n_starts: list or array of starting times of each Segment in samples from the beginning of the file. n_stops: similar, stopping times of each Segment channel_list: list of channel numbers to get. The neural data channels are 1 - 128. The analog inputs are 129 - 144. The default is to acquire all channels. Returns: Block object containing the data. """ # Create block block = Block(file_origin=self.filename) if not cascade: return block self.loader = Loader(self.filename) self.loader.load_file() self.header = self.loader.header # If channels not specified, get all if channel_list is None: channel_list = self.loader.get_neural_channel_numbers() # If not specified, load all as one Segment if n_starts is None: n_starts = [0] n_stops = [self.loader.header.n_samples] #~ # Add channel hierarchy #~ rcg = RecordingChannelGroup(name='allchannels', #~ description='group of all channels', file_origin=self.filename) #~ block.recordingchannelgroups.append(rcg) #~ self.channel_number_to_recording_channel = {} #~ # Add each channel at a time to hierarchy #~ for ch in channel_list: #~ ch_object = RecordingChannel(name='channel%d' % ch, #~ file_origin=self.filename, index=ch) #~ rcg.channel_indexes.append(ch_object.index) #~ rcg.channel_names.append(ch_object.name) #~ rcg.recordingchannels.append(ch_object) #~ self.channel_number_to_recording_channel[ch] = ch_object # Iterate through n_starts and n_stops and add one Segment # per each. for n, (t1, t2) in enumerate(zip(n_starts, n_stops)): # Create segment and add metadata seg = self.read_segment(n_start=t1, n_stop=t2, chlist=channel_list, lazy=lazy, cascade=cascade) seg.name = 'Segment %d' % n seg.index = n t1sec = t1 / self.loader.header.f_samp t2sec = t2 / self.loader.header.f_samp seg.description = 'Segment %d from %f to %f' % (n, t1sec, t2sec) # Link to block block.segments.append(seg) # Create hardware view, and bijectivity tools.populate_RecordingChannel(block) tools.create_many_to_one_relationship(block) return block def read_segment(self, n_start, n_stop, chlist=None, lazy=False, cascade=True): """Reads a Segment from the file and stores in database. The Segment will contain one AnalogSignal for each channel and will go from n_start to n_stop (in samples). Arguments: n_start : time in samples that the Segment begins n_stop : time in samples that the Segment ends Python indexing is used, so n_stop is not inclusive. Returns a Segment object containing the data. """ # If no channel numbers provided, get all of them if chlist is None: chlist = self.loader.get_neural_channel_numbers() # Conversion from bits to full_range units conversion = self.full_range / 2**(8*self.header.sample_width) # Create the Segment seg = Segment(file_origin=self.filename) t_start = float(n_start) / self.header.f_samp t_stop = float(n_stop) / self.header.f_samp seg.annotate(t_start=t_start) seg.annotate(t_stop=t_stop) # Load data from each channel and store for ch in chlist: if lazy: sig = np.array([]) * conversion else: # Get the data from the loader sig = np.array(\ self.loader._get_channel(ch)[n_start:n_stop]) * conversion # Create an AnalogSignal with the data in it anasig = AnalogSignal(signal=sig, sampling_rate=self.header.f_samp*pq.Hz, t_start=t_start*pq.s, file_origin=self.filename, description='Channel %d from %f to %f' % (ch, t_start, t_stop), channel_index=int(ch)) if lazy: anasig.lazy_shape = n_stop-n_start # Link the signal to the segment seg.analogsignals.append(anasig) # Link the signal to the recording channel from which it came #rc = self.channel_number_to_recording_channel[ch] #rc.analogsignals.append(anasig) return seg def write_block(self, block): """Writes block to `self.filename`. *.ns5 BINARY FILE FORMAT The following information is contained in the first part of the header file. The size in bytes, the variable name, the data type, and the meaning are given below. Everything is little-endian. 8B. File_Type_ID. char. Always "NEURALSG" 16B. File_Spec. char. Always "30 kS/s\0" 4B. Period. uint32. Always 1. 4B. Channel_Count. uint32. Generally 32 or 34. Channel_Count*4B. uint32. Channel_ID. One uint32 for each channel. Thus the total length of the header is 8+16+4+4+Channel_Count*4. Immediately after this header, the raw data begins. Each sample is a 2B signed int16. For our hardware, the conversion factor is 4096.0 / 2**16 mV/bit. The samples for each channel are interleaved, so the first Channel_Count samples correspond to the first sample from each channel, in the same order as the channel id's in the header. Variable names are consistent with the Neuroshare specification. """ fi = open(self.filename, 'wb') self._write_header(block, fi) # Write each segment in order for seg in block.segments: # Create a 2d numpy array of analogsignals converted to bytes all_signals = np.array([ np.rint(sig * 2**16 / self.full_range) for sig in seg.analogsignals], dtype=np.int) # Write to file. We transpose because channel changes faster # than time in this format. for vals in all_signals.transpose(): fi.write(struct.pack('<%dh' % len(vals), *vals)) fi.close() def _write_header(self, block, fi): """Write header info about block to fi""" if len(block.segments) > 0: channel_indexes = channel_indexes_in_segment(block.segments[0]) else: channel_indexes = [] # type of file fi.write('NEURALSG') # sampling rate, in text and integer fi.write('30 kS/s\0') for _ in range(8): fi.write('\0') fi.write(struct.pack(' 128) and (x <= 144), self.header.Channel_ID)) - 128 def get_neural_channel_numbers(self): return np.array(filter(lambda x: x <= 128, self.header.Channel_ID)) neo-0.3.3/neo/io/baseio.py0000644000175000017500000002014112273723542016353 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ baseio ====== Classes ------- BaseIO - abstract class which should be overridden, managing how a file will load/write its data If you want a model for developing a new IO start from exampleIO. """ import collections from neo.core import (AnalogSignal, AnalogSignalArray, Block, Epoch, EpochArray, Event, EventArray, IrregularlySampledSignal, RecordingChannel, RecordingChannelGroup, Segment, Spike, SpikeTrain, Unit) from neo.io.tools import create_many_to_one_relationship read_error = "This type is not supported by this file format for reading" write_error = "This type is not supported by this file format for writing" class BaseIO(object): """ Generic class to handle all the file read/write methods for the key objects of the core class. This template is file-reading/writing oriented but it can also handle data read from/written to a database such as TDT sytem tanks or SQLite files. This is an abstract class that will be subclassed for each format The key methods of the class are: - ``read()`` - Read the whole object structure, return a list of Block objects - ``read_block(lazy=True, cascade=True, **params)`` - Read Block object from file with some parameters - ``read_segment(lazy=True, cascade=True, **params)`` - Read Segment object from file with some parameters - ``read_spiketrainlist(lazy=True, cascade=True, **params)`` - Read SpikeTrainList object from file with some parameters - ``write()`` - Write the whole object structure - ``write_block(**params)`` - Write Block object to file with some parameters - ``write_segment(**params)`` - Write Segment object to file with some parameters - ``write_spiketrainlist(**params)`` - Write SpikeTrainList object to file with some parameters The class can also implement these methods: - ``read_XXX(lazy=True, cascade=True, **params)`` - ``write_XXX(**params)`` where XXX could be one of the objects supported by the IO Each class is able to declare what can be accessed or written directly discribed by **readable_objects** and **readable_objects**. The object types can be one of the classes defined in neo.core (Block, Segment, AnalogSignal, ...) Each class do not necessary support all the whole neo hierarchy but part of it. This is discribe with **supported_objects**. All IOs must support at least Block with a read_block() ** start a new IO ** If you want to implement your own file format, you should create a class that will inherit from this BaseFile class and implement the previous methods. See ExampleIO in exampleio.py """ is_readable = False is_writable = False supported_objects = [] readable_objects = [] writeable_objects = [] has_header = False is_streameable = False read_params = {} write_params = {} name = 'BaseIO' description = 'This IO does not read or write anything' extentions = [] mode = 'file' # or 'fake' or 'dir' or 'database' def __init__(self, filename=None, **kargs): self.filename = filename ######## General read/write methods ####################### def read(self, lazy=False, cascade=True, **kargs): if Block in self.readable_objects: if (hasattr(self, 'read_all_blocks') and callable(getattr(self, 'read_all_blocks'))): return self.read_all_blocks(lazy=lazy, cascade=cascade, **kargs) return [self.read_block(lazy=lazy, cascade=cascade, **kargs)] elif Segment in self.readable_objects: bl = Block(name='One segment only') if not cascade: return bl seg = self.read_segment(lazy=lazy, cascade=cascade, **kargs) bl.segments.append(seg) create_many_to_one_relationship(bl) return [bl] else: raise NotImplementedError def write(self, bl, **kargs): if Block in self.writeable_objects: if isinstance(bl, collections.Sequence): assert hasattr(self, 'write_all_blocks'), \ '%s does not offer to store a sequence of blocks' % \ self.__class__.__name__ self.write_all_blocks(bl, **kargs) else: self.write_block(bl, **kargs) elif Segment in self.writeable_objects: assert len(bl.segments) == 1, \ '%s is based on segment so if you try to write a block it ' + \ 'must contain only one Segment' % self.__class__.__name__ self.write_segment(bl.segments[0], **kargs) else: raise NotImplementedError ######## All individual read methods ####################### def read_block(self, **kargs): assert(Block in self.readable_objects), read_error def read_segment(self, **kargs): assert(Segment in self.readable_objects), read_error def read_unit(self, **kargs): assert(Unit in self.readable_objects), read_error def read_spiketrain(self, **kargs): assert(SpikeTrain in self.readable_objects), read_error def read_spike(self, **kargs): assert(Spike in self.readable_objects), read_error def read_analogsignal(self, **kargs): assert(AnalogSignal in self.readable_objects), read_error def read_irregularlysampledsignal(self, **kargs): assert(IrregularlySampledSignal in self.readable_objects), read_error def read_analogsignalarray(self, **kargs): assert(AnalogSignalArray in self.readable_objects), read_error def read_recordingchannelgroup(self, **kargs): assert(RecordingChannelGroup in self.readable_objects), read_error def read_recordingchannel(self, **kargs): assert(RecordingChannel in self.readable_objects), read_error def read_event(self, **kargs): assert(Event in self.readable_objects), read_error def read_eventarray(self, **kargs): assert(EventArray in self.readable_objects), read_error def read_epoch(self, **kargs): assert(Epoch in self.readable_objects), read_error def read_epocharray(self, **kargs): assert(EpochArray in self.readable_objects), read_error ######## All individual write methods ####################### def write_block(self, bl, **kargs): assert(Block in self.writeable_objects), write_error def write_segment(self, seg, **kargs): assert(Segment in self.writeable_objects), write_error def write_unit(self, ut, **kargs): assert(Unit in self.writeable_objects), write_error def write_spiketrain(self, sptr, **kargs): assert(SpikeTrain in self.writeable_objects), write_error def write_spike(self, sp, **kargs): assert(Spike in self.writeable_objects), write_error def write_analogsignal(self, anasig, **kargs): assert(AnalogSignal in self.writeable_objects), write_error def write_irregularlysampledsignal(self, irsig, **kargs): assert(IrregularlySampledSignal in self.writeable_objects), write_error def write_analogsignalarray(self, anasigar, **kargs): assert(AnalogSignalArray in self.writeable_objects), write_error def write_recordingchannelgroup(self, rcg, **kargs): assert(RecordingChannelGroup in self.writeable_objects), write_error def write_recordingchannel(self, rc, **kargs): assert(RecordingChannel in self.writeable_objects), write_error def write_event(self, ev, **kargs): assert(Event in self.writeable_objects), write_error def write_eventarray(self, ea, **kargs): assert(EventArray in self.writeable_objects), write_error def write_epoch(self, ep, **kargs): assert(Epoch in self.writeable_objects), write_error def write_epocharray(self, epa, **kargs): assert(EpochArray in self.writeable_objects), write_error neo-0.3.3/neo/io/tools.py0000644000175000017500000001507012273723542016256 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tools for IO coder: * For creating parent (many_to_one_relationship) * Creating RecordingChannel and making links with AnalogSignals and SPikeTrains """ import collections import numpy as np from neo.core import (AnalogSignal, AnalogSignalArray, Block, Epoch, EpochArray, Event, EventArray, IrregularlySampledSignal, RecordingChannel, RecordingChannelGroup, Segment, Spike, SpikeTrain, Unit) from neo.description import one_to_many_relationship #def finalize_block(block): # populate_RecordingChannel(block) # create_many_to_one_relationship(block) # Special case this tricky many-to-many relationship # we still need links from recordingchannel to analogsignal # for rcg in block.recordingchannelgroups: # for rc in rcg.recordingchannels: # create_many_to_one_relationship(rc) def create_many_to_one_relationship(ob, force=False): """ Create many_to_one relationship when one_to_many relationships exist. Ex: For each Segment in block.segments it sets segment.block to the parent Block. It is a utility at the end of creating a Block for IO. Note: This is recursive. It works on Block but also work on others neo objects. Usage: >>> create_many_to_one_relationship(a_block) >>> create_many_to_one_relationship(a_block, force=True) You want to run populate_RecordingChannel first, because this will create new objects that this method will link up. If force is True overwrite any existing relationships """ # Determine what class was passed, and whether it has children classname = ob.__class__.__name__ if classname not in one_to_many_relationship: # No children return # Iterate through children and build backward links for childname in one_to_many_relationship[classname]: # Doesn't have links to children if not hasattr(ob, childname.lower()+'s'): continue # get a list of children of type childname and iterate through sub = getattr(ob, childname.lower()+'s') for child in sub: # set a link to parent `ob`, of class `classname` if getattr(child, classname.lower()) is None or force: setattr(child, classname.lower(), ob) # recursively: create_many_to_one_relationship(child, force=force) def populate_RecordingChannel(bl, remove_from_annotation=True): """ When a Block is Block>Segment>AnalogSIgnal this function auto create all RecordingChannel following these rules: * when 'channel_index ' is in AnalogSIgnal the corresponding RecordingChannel is created. * 'channel_index ' is then set to None if remove_from_annotation * only one RecordingChannelGroup is created It is a utility at the end of creating a Block for IO. Usage: >>> populate_RecordingChannel(a_block) """ recordingchannels = {} for seg in bl.segments: for anasig in seg.analogsignals: if getattr(anasig, 'channel_index', None) is not None: ind = int(anasig.channel_index) if ind not in recordingchannels: recordingchannels[ind] = RecordingChannel(index=ind) if 'channel_name' in anasig.annotations: channel_name = anasig.annotations['channel_name'] recordingchannels[ind].name = channel_name if remove_from_annotation: anasig.annotations.pop('channel_name') recordingchannels[ind].analogsignals.append(anasig) anasig.recordingchannel = recordingchannels[ind] if remove_from_annotation: anasig.channel_index = None indexes = np.sort(list(recordingchannels.keys())).astype('i') names = np.array([recordingchannels[idx].name for idx in indexes], dtype='S') rcg = RecordingChannelGroup(name='all channels', channel_indexes=indexes, channel_names=names) bl.recordingchannelgroups.append(rcg) for ind in indexes: # many to many relationship rcg.recordingchannels.append(recordingchannels[ind]) recordingchannels[ind].recordingchannelgroups.append(rcg) def iteritems(D): try: return D.iteritems() # Python 2 except AttributeError: return D.items() # Python 3 class LazyList(collections.MutableSequence): """ An enhanced list that can load its members on demand. Behaves exactly like a regular list for members that are Neo objects. Each item should contain the information that ``load_lazy_cascade`` needs to load the respective object. """ _container_objects = set( [Block, Segment, RecordingChannelGroup, RecordingChannel, Unit]) _neo_objects = _container_objects.union( [AnalogSignal, AnalogSignalArray, Epoch, EpochArray, Event, EventArray, IrregularlySampledSignal, Spike, SpikeTrain]) def __init__(self, io, lazy, items=None): """ :param io: IO instance that can load items. :param lazy: Lazy parameter with which the container object using the list was loaded. :param items: Optional, initial list of items. """ if items is None: self._data = [] else: self._data = items self._lazy = lazy self._io = io def __getitem__(self, index): item = self._data.__getitem__(index) if isinstance(index, slice): return LazyList(self._io, item) if type(item) in self._neo_objects: return item loaded = self._io.load_lazy_cascade(item, self._lazy) self._data[index] = loaded return loaded def __delitem__(self, index): self._data.__delitem__(index) def __len__(self): return self._data.__len__() def __setitem__(self, index, value): self._data.__setitem__(index, value) def insert(self, index, value): self._data.insert(index, value) def append(self, value): self._data.append(value) def reverse(self): self._data.reverse() def extend(self, values): self._data.extend(values) def remove(self, value): self._data.remove(value) def __str__(self): return '<' + self.__class__.__name__ + '>' + self._data.__str__() def __repr__(self): return '<' + self.__class__.__name__ + '>' + self._data.__repr__() neo-0.3.3/neo/io/winedrio.py0000644000175000017500000001073512273723542016741 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Classe for reading data from WinEdr, a software tool written by John Dempster. WinEdr is free: http://spider.science.strath.ac.uk/sipbs/software.htm Depend on: Supported : Read Author: sgarcia """ import os import struct import sys import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Segment, AnalogSignal from neo.io.tools import create_many_to_one_relationship PY3K = (sys.version_info[0] == 3) class WinEdrIO(BaseIO): """ Class for reading data from WinEDR. Usage: >>> from neo import io >>> r = io.WinEdrIO(filename='File_WinEDR_1.EDR') >>> seg = r.read_segment(lazy=False, cascade=True,) >>> print seg.analogsignals [] """ is_readable = True is_writable = False supported_objects = [ Segment , AnalogSignal ] readable_objects = [Segment] writeable_objects = [] has_header = False is_streameable = False read_params = { Segment : [ ], } write_params = None name = 'WinEDR' extensions = [ 'EDR' ] mode = 'file' def __init__(self , filename = None) : """ This class read a WinEDR file. Arguments: filename : the filename """ BaseIO.__init__(self) self.filename = filename def read_segment(self , lazy = False, cascade = True): seg = Segment( file_origin = os.path.basename(self.filename), ) if not cascade: return seg fid = open(self.filename , 'rb') headertext = fid.read(2048) if PY3K: headertext = headertext.decode('ascii') header = {} for line in headertext.split('\r\n'): if '=' not in line : continue #print '#' , line , '#' key,val = line.split('=') if key in ['NC', 'NR','NBH','NBA','NBD','ADCMAX','NP','NZ','ADCMAX' ] : val = int(val) elif key in ['AD', 'DT', ] : val = val.replace(',','.') val = float(val) header[key] = val if not lazy: data = np.memmap(self.filename , np.dtype('i2') , 'r', #shape = (header['NC'], header['NP']) , shape = (header['NP']/header['NC'],header['NC'], ) , offset = header['NBH']) for c in range(header['NC']): YCF = float(header['YCF%d'%c].replace(',','.')) YAG = float(header['YAG%d'%c].replace(',','.')) YZ = float(header['YZ%d'%c].replace(',','.')) ADCMAX = header['ADCMAX'] AD = header['AD'] DT = header['DT'] if 'TU' in header: if header['TU'] == 'ms': DT *= .001 unit = header['YU%d'%c] try : unit = pq.Quantity(1., unit) except: unit = pq.Quantity(1., '') if lazy: signal = [ ] * unit else: signal = (data[:,header['YO%d'%c]].astype('f4')-YZ) *AD/( YCF*YAG*(ADCMAX+1)) * unit ana = AnalogSignal(signal, sampling_rate=pq.Hz / DT, t_start=0. * pq.s, name=header['YN%d' % c], channel_index=c) if lazy: ana.lazy_shape = header['NP']/header['NC'] seg.analogsignals.append(ana) create_many_to_one_relationship(seg) return seg AnalysisDescription = [ ('RecordStatus','8s'), ('RecordType','4s'), ('GroupNumber','f'), ('TimeRecorded','f'), ('SamplingInterval','f'), ('VMax','8f'), ] class HeaderReader(): def __init__(self,fid ,description ): self.fid = fid self.description = description def read_f(self, offset =0): self.fid.seek(offset) d = { } for key, fmt in self.description : val = struct.unpack(fmt , self.fid.read(struct.calcsize(fmt))) if len(val) == 1: val = val[0] else : val = list(val) d[key] = val return d neo-0.3.3/neo/io/tdtio.py0000644000175000017500000003443612273723542016250 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Class for reading data from from Tucker Davis TTank format. Terminology: TDT hold data with tanks (actually a directory). And tanks hold sub block (sub directories). Tanks correspond to neo.Block and tdt block correspond to neo.Segment. Note the name Block is ambiguous because it does not refer to same thing in TDT terminilogy and neo. Depend on: Supported : Read Author: sgarcia """ import os import struct import sys import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Block, Segment, AnalogSignal, SpikeTrain, EventArray from neo.io.tools import create_many_to_one_relationship, iteritems PY3K = (sys.version_info[0] == 3) class TdtIO(BaseIO): """ Class for reading data from from Tucker Davis TTank format. Usage: >>> from neo import io >>> r = io.TdtIO(dirname='aep_05') >>> bl = r.read_block(lazy=False, cascade=True) >>> print bl.segments [] >>> print bl.segments[0].analogsignals [] >>> print bl.segments[0].eventarrays [] """ is_readable = True is_writable = False supported_objects = [Block, Segment , AnalogSignal, EventArray ] readable_objects = [Block] writeable_objects = [] has_header = False is_streameable = False read_params = { Block : [ ], } write_params = None name = 'TDT' extensions = [ ] mode = 'dir' def __init__(self , dirname = None) : """ This class read a WinEDR wcp file. **Arguments** Arguments: dirname: path of the TDT tank (a directory) """ BaseIO.__init__(self) self.dirname = dirname if self.dirname.endswith('/'): self.dirname = self.dirname[:-1] def read_block(self, lazy = False, cascade = True, ): bl = Block() tankname = os.path.basename(self.dirname) bl.file_origin = tankname if not cascade : return bl for blockname in os.listdir(self.dirname): if blockname == 'TempBlk': continue subdir = os.path.join(self.dirname,blockname) if not os.path.isdir(subdir): continue seg = Segment(name = blockname) bl.segments.append( seg) global_t_start = None # Step 1 : first loop for counting - tsq file tsq = open(os.path.join(subdir, tankname+'_'+blockname+'.tsq'), 'rb') hr = HeaderReader(tsq, TsqDescription) allsig = { } allspiketr = { } allevent = { } while 1: h= hr.read_f() if h==None:break channel, code , evtype = h['channel'], h['code'], h['evtype'] if Types[evtype] == 'EVTYPE_UNKNOWN': pass elif Types[evtype] == 'EVTYPE_MARK' : if global_t_start is None: global_t_start = h['timestamp'] elif Types[evtype] == 'EVTYPE_SCALER' : # TODO pass elif Types[evtype] == 'EVTYPE_STRON' or \ Types[evtype] == 'EVTYPE_STROFF': # EVENTS if code not in allevent: allevent[code] = { } if channel not in allevent[code]: ea = EventArray(name = code , channel_index = channel) # for counting: ea.lazy_shape = 0 ea.maxlabelsize = 0 allevent[code][channel] = ea allevent[code][channel].lazy_shape += 1 strobe, = struct.unpack('d' , struct.pack('q' , h['eventoffset'])) strobe = str(strobe) if len(strobe)>= allevent[code][channel].maxlabelsize: allevent[code][channel].maxlabelsize = len(strobe) #~ ev = Event() #~ ev.time = h['timestamp'] - global_t_start #~ ev.name = code #~ # it the strobe attribute masked with eventoffset #~ strobe, = struct.unpack('d' , struct.pack('q' , h['eventoffset'])) #~ ev.label = str(strobe) #~ seg._events.append( ev ) elif Types[evtype] == 'EVTYPE_SNIP' : if code not in allspiketr: allspiketr[code] = { } if channel not in allspiketr[code]: allspiketr[code][channel] = { } if h['sortcode'] not in allspiketr[code][channel]: sptr = SpikeTrain([ ], units = 's', name = str(h['sortcode']), #t_start = global_t_start, t_start = 0.*pq.s, t_stop = 0.*pq.s, # temporary left_sweep = (h['size']-10.)/2./h['frequency'] * pq.s, sampling_rate = h['frequency'] * pq.Hz, ) #~ sptr.channel = channel #sptr.annotations['channel_index'] = channel sptr.annotate(channel_index = channel) # for counting: sptr.lazy_shape = 0 sptr.pos = 0 sptr.waveformsize = h['size']-10 #~ sptr.name = str(h['sortcode']) #~ sptr.t_start = global_t_start #~ sptr.sampling_rate = h['frequency'] #~ sptr.left_sweep = (h['size']-10.)/2./h['frequency'] #~ sptr.right_sweep = (h['size']-10.)/2./h['frequency'] #~ sptr.waveformsize = h['size']-10 allspiketr[code][channel][h['sortcode']] = sptr allspiketr[code][channel][h['sortcode']].lazy_shape += 1 elif Types[evtype] == 'EVTYPE_STREAM': if code not in allsig: allsig[code] = { } if channel not in allsig[code]: #~ print 'code', code, 'channel', channel anaSig = AnalogSignal([] * pq.V, name=code, sampling_rate= h['frequency'] * pq.Hz, t_start=(h['timestamp'] - global_t_start) * pq.s, channel_index=channel) anaSig.lazy_dtype = np.dtype(DataFormats[h['dataformat']]) anaSig.pos = 0 # for counting: anaSig.lazy_shape = 0 #~ anaSig.pos = 0 allsig[code][channel] = anaSig allsig[code][channel].lazy_shape += (h['size']*4-40)/anaSig.dtype.itemsize if not lazy: # Step 2 : allocate memory for code, v in iteritems(allsig): for channel, anaSig in iteritems(v): v[channel] = anaSig.duplicate_with_new_array(np.zeros((anaSig.lazy_shape) , dtype = anaSig.lazy_dtype)*pq.V ) v[channel].pos = 0 for code, v in iteritems(allevent): for channel, ea in iteritems(v): ea.times = np.empty( (ea.lazy_shape) ) * pq.s ea.labels = np.empty( (ea.lazy_shape), dtype = 'S'+str(ea.maxlabelsize) ) ea.pos = 0 for code, v in iteritems(allspiketr): for channel, allsorted in iteritems(v): for sortcode, sptr in iteritems(allsorted): new = SpikeTrain(np.zeros( (sptr.lazy_shape), dtype = 'f8' ) *pq.s , name = sptr.name, t_start = sptr.t_start, t_stop = sptr.t_stop, left_sweep = sptr.left_sweep, sampling_rate = sptr.sampling_rate, waveforms = np.ones( (sptr.lazy_shape, 1, sptr.waveformsize) , dtype = 'f') * pq.mV , ) new.annotations.update(sptr.annotations) new.pos = 0 new.waveformsize = sptr.waveformsize allsorted[sortcode] = new # Step 3 : searh sev (individual data files) or tev (common data file) # sev is for version > 70 if os.path.exists(os.path.join(subdir, tankname+'_'+blockname+'.tev')): tev = open(os.path.join(subdir, tankname+'_'+blockname+'.tev'), 'rb') else: tev = None for code, v in iteritems(allsig): for channel, anaSig in iteritems(v): if PY3K: signame = anaSig.name.decode('ascii') else: signame = anaSig.name filename = os.path.join(subdir, tankname+'_'+blockname+'_'+signame+'_ch'+str(anaSig.channel_index)+'.sev') if os.path.exists(filename): anaSig.fid = open(filename, 'rb') else: anaSig.fid = tev for code, v in iteritems(allspiketr): for channel, allsorted in iteritems(v): for sortcode, sptr in iteritems(allsorted): sptr.fid = tev # Step 4 : second loop for copyin chunk of data tsq.seek(0) while 1: h= hr.read_f() if h==None:break channel, code , evtype = h['channel'], h['code'], h['evtype'] if Types[evtype] == 'EVTYPE_STREAM': a = allsig[code][channel] dt = a.dtype s = int((h['size']*4-40)/dt.itemsize) a.fid.seek(h['eventoffset']) a[ a.pos:a.pos+s ] = np.fromstring( a.fid.read( s*dt.itemsize ), dtype = a.dtype) a.pos += s elif Types[evtype] == 'EVTYPE_STRON' or \ Types[evtype] == 'EVTYPE_STROFF': ea = allevent[code][channel] ea.times[ea.pos] = (h['timestamp'] - global_t_start) * pq.s strobe, = struct.unpack('d' , struct.pack('q' , h['eventoffset'])) ea.labels[ea.pos] = str(strobe) ea.pos += 1 elif Types[evtype] == 'EVTYPE_SNIP': sptr = allspiketr[code][channel][h['sortcode']] sptr.t_stop = (h['timestamp'] - global_t_start) * pq.s sptr[sptr.pos] = (h['timestamp'] - global_t_start) * pq.s sptr.waveforms[sptr.pos, 0, :] = np.fromstring( sptr.fid.read( sptr.waveformsize*4 ), dtype = 'f4') * pq.V sptr.pos += 1 # Step 5 : populating segment for code, v in iteritems(allsig): for channel, anaSig in iteritems(v): seg.analogsignals.append( anaSig ) for code, v in iteritems(allevent): for channel, ea in iteritems(v): seg.eventarrays.append( ea ) for code, v in iteritems(allspiketr): for channel, allsorted in iteritems(v): for sortcode, sptr in iteritems(allsorted): seg.spiketrains.append( sptr ) create_many_to_one_relationship(bl) return bl TsqDescription = [ ('size','i'), ('evtype','i'), ('code','4s'), ('channel','H'), ('sortcode','H'), ('timestamp','d'), ('eventoffset','q'), ('dataformat','i'), ('frequency','f'), ] Types = { 0x0 : 'EVTYPE_UNKNOWN', 0x101:'EVTYPE_STRON', 0x102:'EVTYPE_STROFF', 0x201:'EVTYPE_SCALER', 0x8101:'EVTYPE_STREAM', 0x8201:'EVTYPE_SNIP', 0x8801: 'EVTYPE_MARK', } DataFormats = { 0 : np.float32, 1 : np.int32, 2 : np.int16, 3 : np.int8, 4 : np.float64, #~ 5 : '' } class HeaderReader(): def __init__(self,fid ,description ): self.fid = fid self.description = description def read_f(self, offset =None): if offset is not None : self.fid.seek(offset) d = { } for key, fmt in self.description : buf = self.fid.read(struct.calcsize(fmt)) if len(buf) != struct.calcsize(fmt) : return None val = struct.unpack(fmt , buf) if len(val) == 1: val = val[0] else : val = list(val) #~ if 's' in fmt : #~ val = val.replace('\x00','') d[key] = val return d neo-0.3.3/neo/io/spike2io.py0000644000175000017500000004553412273723542016653 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Classe for reading data in CED spike2 files (.smr). This code is based on: - sonpy, written by Antonio Gonzalez Disponible here :: http://www.neuro.ki.se/broberger/ and sonpy come from : - SON Library 2.0 for MATLAB, written by Malcolm Lidierth at King's College London. See http://www.kcl.ac.uk/depsta/biomedical/cfnr/lidierth.html This IO support old (v7) of spike2 Depend on: Supported : Read Author: sgarcia """ import os import sys import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Segment, AnalogSignal, SpikeTrain, EventArray from neo.io.tools import create_many_to_one_relationship PY3K = (sys.version_info[0] == 3) class Spike2IO(BaseIO): """ Class for reading data from CED spike2. Usage: >>> from neo import io >>> r = io.Spike2IO( filename = 'File_spike2_1.smr') >>> seg = r.read_segment(lazy = False, cascade = True,) >>> print seg.analogsignals >>> print seg.spiketrains >>> print seg.eventarrays """ is_readable = True is_writable = False supported_objects = [ Segment , AnalogSignal , EventArray, SpikeTrain] readable_objects = [Segment] writeable_objects = [ ] has_header = False is_streameable = False read_params = { Segment : [ ('take_ideal_sampling_rate' , { 'value' : False })] } write_params = None name = 'Spike 2 CED' extensions = [ 'smr' ] mode = 'file' def __init__(self , filename = None) : """ This class read a smr file. Arguments: filename : the filename """ BaseIO.__init__(self) self.filename = filename def read_segment(self , take_ideal_sampling_rate = False, lazy = False, cascade = True, ): """ Arguments: """ header = self.read_header(filename = self.filename) #~ print header fid = open(self.filename, 'rb') seg = Segment( file_origin = os.path.basename(self.filename), ced_version = str(header.system_id), ) if not cascade: return seg def addannotations(ob, channelHeader): ob.annotate(title = channelHeader.title) ob.annotate(physical_channel_index = channelHeader.phy_chan) ob.annotate(comment = channelHeader.comment) for i in range(header.channels) : channelHeader = header.channelHeaders[i] #~ print 'channel' , i , 'kind' , channelHeader.kind if channelHeader.kind !=0: #~ print '####' #~ print 'channel' , i, 'kind' , channelHeader.kind , channelHeader.type , channelHeader.phy_chan #~ print channelHeader pass if channelHeader.kind in [1, 9]: #~ print 'analogChanel' anaSigs = self.readOneChannelContinuous( fid, i, header, take_ideal_sampling_rate, lazy = lazy) #~ print 'nb sigs', len(anaSigs) , ' sizes : ', for anaSig in anaSigs : addannotations(anaSig, channelHeader) anaSig.name = str(anaSig.annotations['title']) seg.analogsignals.append( anaSig ) #~ print sig.signal.size, #~ print '' elif channelHeader.kind in [2, 3, 4, 5, 8] : ea = self.readOneChannelEventOrSpike( fid, i, header , lazy = lazy) if ea is not None: addannotations(ea, channelHeader) seg.eventarrays.append(ea) elif channelHeader.kind in [6,7] : sptr = self.readOneChannelEventOrSpike( fid, i, header, lazy = lazy ) if sptr is not None: addannotations(sptr, channelHeader) seg.spiketrains.append(sptr) fid.close() create_many_to_one_relationship(seg) return seg def read_header(self , filename = ''): fid = open(filename, 'rb') header = HeaderReader(fid, np.dtype(headerDescription)) #~ print 'chan_size' , header.chan_size if header.system_id < 6: header.dtime_base = 1e-6 header.datetime_detail = 0 header.datetime_year = 0 channelHeaders = [ ] for i in range(header.channels): # read global channel header fid.seek(512 + 140*i) # TODO verifier i ou i-1 channelHeader = HeaderReader(fid, np.dtype(channelHeaderDesciption1)) if channelHeader.kind in [1, 6]: dt = [('scale' , 'f4'), ('offset' , 'f4'), ('unit' , 'S6'),] channelHeader += HeaderReader(fid, np.dtype(dt)) if header.system_id < 6: channelHeader += HeaderReader(fid, np.dtype([ ('divide' , 'i4')]) )#i8 else : channelHeader +=HeaderReader(fid, np.dtype([ ('interleave' , 'i4')]) )#i8 if channelHeader.kind in [7, 9]: dt = [('min' , 'f4'), ('max' , 'f4'), ('unit' , 'S6'),] channelHeader += HeaderReader(fid, np.dtype(dt)) if header.system_id < 6: channelHeader += HeaderReader(fid, np.dtype([ ('divide' , 'i4')]))#i8 else : channelHeader += HeaderReader(fid, np.dtype([ ('interleave' , 'i4')]) )#i8 if channelHeader.kind in [4]: dt = [('init_low' , 'u1'), ('next_low' , 'u1'),] channelHeader += HeaderReader(fid, np.dtype(dt)) channelHeader.type = dict_kind[channelHeader.kind] #~ print i, channelHeader channelHeaders.append(channelHeader) header.channelHeaders = channelHeaders fid.close() return header def readOneChannelContinuous(self , fid, channel_num, header, take_ideal_sampling_rate, lazy = True): # read AnalogSignal channelHeader = header.channelHeaders[channel_num] # data type if channelHeader.kind == 1: dt = np.dtype('i2') elif channelHeader.kind == 9: dt = np.dtype('f4') # sample rate if take_ideal_sampling_rate: sampling_rate = channelHeader.ideal_rate*pq.Hz else: if header.system_id in [1,2,3,4,5]: # Before version 5 #~ print channel_num, channelHeader.divide, header.us_per_time, header.time_per_adc sample_interval = (channelHeader.divide*header.us_per_time*header.time_per_adc)*1e-6 else : sample_interval = (channelHeader.l_chan_dvd*header.us_per_time*header.dtime_base) sampling_rate = (1./sample_interval)*pq.Hz # read blocks header to preallocate memory by jumping block to block fid.seek(channelHeader.firstblock) blocksize = [ 0 ] starttimes = [ ] for b in range(channelHeader.blocks) : blockHeader = HeaderReader(fid, np.dtype(blockHeaderDesciption)) if len(blocksize) > len(starttimes): starttimes.append(blockHeader.start_time) blocksize[-1] += blockHeader.items if blockHeader.succ_block > 0 : # this is ugly but CED do not garanty continuity in AnalogSignal fid.seek(blockHeader.succ_block) nextBlockHeader = HeaderReader(fid, np.dtype(blockHeaderDesciption)) sample_interval = (blockHeader.end_time-blockHeader.start_time)/(blockHeader.items-1) interval_with_next = nextBlockHeader.start_time - blockHeader.end_time if interval_with_next > sample_interval: blocksize.append(0) fid.seek(blockHeader.succ_block) anaSigs = [ ] if channelHeader.unit in unit_convert: unit = pq.Quantity(1, unit_convert[channelHeader.unit] ) else: #print channelHeader.unit try: unit = pq.Quantity(1, channelHeader.unit ) except: unit = pq.Quantity(1, '') for b,bs in enumerate(blocksize ): if lazy: signal = [ ]*unit else: signal = pq.Quantity(np.empty( bs , dtype = 'f4'), units=unit) anaSig = AnalogSignal(signal, sampling_rate=sampling_rate, t_start=(starttimes[b] * header.us_per_time * header.dtime_base * pq.s), channel_index=channel_num) anaSigs.append( anaSig ) if lazy: for s, anaSig in enumerate(anaSigs): anaSig.lazy_shape = blocksize[s] else: # read data by jumping block to block fid.seek(channelHeader.firstblock) pos = 0 numblock = 0 for b in range(channelHeader.blocks) : blockHeader = HeaderReader(fid, np.dtype(blockHeaderDesciption)) # read data sig = np.fromstring( fid.read(blockHeader.items*dt.itemsize) , dtype = dt) anaSigs[numblock][pos:pos+sig.size] = sig.astype('f4')*unit pos += sig.size if pos >= blocksize[numblock] : numblock += 1 pos = 0 # jump to next block if blockHeader.succ_block > 0 : fid.seek(blockHeader.succ_block) # convert for int16 if dt.kind == 'i' : for anaSig in anaSigs : anaSig *= channelHeader.scale/ 6553.6 anaSig += channelHeader.offset*unit return anaSigs def readOneChannelEventOrSpike(self , fid, channel_num, header ,lazy = True): # return SPikeTrain or EventArray channelHeader = header.channelHeaders[channel_num] if channelHeader.firstblock <0: return if channelHeader.kind not in [2, 3, 4 , 5 , 6 ,7, 8]: return ## Step 1 : type of blocks if channelHeader.kind in [2, 3, 4]: # Event data fmt = [('tick' , 'i4') ] elif channelHeader.kind in [5]: # Marker data fmt = [('tick' , 'i4') , ('marker' , 'i4') ] elif channelHeader.kind in [6]: # AdcMark data fmt = [('tick' , 'i4') , ('marker' , 'i4') , ('adc' , 'S%d' %channelHeader.n_extra )] elif channelHeader.kind in [7]: # RealMark data fmt = [('tick' , 'i4') , ('marker' , 'i4') , ('real' , 'S%d' %channelHeader.n_extra )] elif channelHeader.kind in [8]: # TextMark data fmt = [('tick' , 'i4') , ('marker' , 'i4') , ('label' , 'S%d'%channelHeader.n_extra)] dt = np.dtype(fmt) ## Step 2 : first read for allocating mem fid.seek(channelHeader.firstblock) totalitems = 0 for _ in range(channelHeader.blocks) : blockHeader = HeaderReader(fid, np.dtype(blockHeaderDesciption)) totalitems += blockHeader.items if blockHeader.succ_block > 0 : fid.seek(blockHeader.succ_block) #~ print 'totalitems' , totalitems if lazy : if channelHeader.kind in [2, 3, 4 , 5 , 8]: ea = EventArray( ) ea.annotate(channel_index = channel_num) ea.lazy_shape = totalitems return ea elif channelHeader.kind in [6 ,7]: sptr = SpikeTrain([ ]*pq.s, t_stop=1e99) # correct value for t_stop to be put in later sptr.annotate(channel_index = channel_num) sptr.lazy_shape = totalitems return sptr else: alltrigs = np.zeros( totalitems , dtype = dt) ## Step 3 : read fid.seek(channelHeader.firstblock) pos = 0 for _ in range(channelHeader.blocks) : blockHeader = HeaderReader(fid, np.dtype(blockHeaderDesciption)) # read all events in block trigs = np.fromstring( fid.read( blockHeader.items*dt.itemsize) , dtype = dt) alltrigs[pos:pos+trigs.size] = trigs pos += trigs.size if blockHeader.succ_block > 0 : fid.seek(blockHeader.succ_block) ## Step 3 convert in neo standard class : eventarrays or spiketrains alltimes = alltrigs['tick'].astype('f')*header.us_per_time * header.dtime_base*pq.s if channelHeader.kind in [2, 3, 4 , 5 , 8]: #events ea = EventArray( ) ea.annotate(channel_index = channel_num) ea.times = alltimes if channelHeader.kind >= 5: # Spike2 marker is closer to label sens of neo ea.labels = alltrigs['marker'].astype('S32') if channelHeader.kind == 8: ea.annotate(extra_labels = alltrigs['label']) return ea elif channelHeader.kind in [6 ,7]: # spiketrains # waveforms if channelHeader.kind == 6 : waveforms = np.fromstring(alltrigs['adc'].tostring() , dtype = 'i2') waveforms = waveforms.astype('f4') *channelHeader.scale/ 6553.6 + channelHeader.offset elif channelHeader.kind == 7 : waveforms = np.fromstring(alltrigs['real'].tostring() , dtype = 'f4') if header.system_id>=6 and channelHeader.interleave>1: waveforms = waveforms.reshape((alltimes.size,-1,channelHeader.interleave)) waveforms = waveforms.swapaxes(1,2) else: waveforms = waveforms.reshape(( alltimes.size,1, -1)) if header.system_id in [1,2,3,4,5]: sample_interval = (channelHeader.divide*header.us_per_time*header.time_per_adc)*1e-6 else : sample_interval = (channelHeader.l_chan_dvd*header.us_per_time*header.dtime_base) if channelHeader.unit in unit_convert: unit = pq.Quantity(1, unit_convert[channelHeader.unit] ) else: #print channelHeader.unit try: unit = pq.Quantity(1, channelHeader.unit ) except: unit = pq.Quantity(1, '') if len(alltimes) > 0: t_stop = alltimes.max() # can get better value from associated AnalogSignal(s) ? else: t_stop = 0.0 sptr = SpikeTrain(alltimes, waveforms = waveforms*unit, sampling_rate = (1./sample_interval)*pq.Hz, t_stop = t_stop ) sptr.annotate(channel_index = channel_num) return sptr class HeaderReader(object): def __init__(self , fid , dtype): if fid is not None : array = np.fromstring( fid.read(dtype.itemsize) , dtype)[0] else : array = np.zeros( (1) , dtype = dtype)[0] super(HeaderReader, self).__setattr__('dtype', dtype) super(HeaderReader, self).__setattr__('array', array) def __setattr__(self, name , val): if name in self.dtype.names : self.array[name] = val else : super(HeaderReader, self).__setattr__(name, val) def __getattr__(self , name): #~ print name if name in self.dtype.names : if self.dtype[name].kind == 'S': if PY3K: l = np.fromstring(self.array[name].decode('iso-8859-1')[0], 'u1') else: l = np.fromstring(self.array[name][0], 'u1') return self.array[name][1:l+1] else: return self.array[name] def names(self): return self.array.dtype.names def __repr__(self): s = 'HEADER' for name in self.dtype.names : #~ if self.dtype[name].kind != 'S' : #~ s += name + self.__getattr__(name) s += '{}: {}\n'.format(name, getattr(self, name)) return s def __add__(self, header2): # print 'add' , self.dtype, header2.dtype newdtype = [ ] for name in self.dtype.names : newdtype.append( (name , self.dtype[name].str) ) for name in header2.dtype.names : newdtype.append( (name , header2.dtype[name].str) ) newdtype = np.dtype(newdtype) newHeader = HeaderReader(None , newdtype ) newHeader.array = np.fromstring( self.array.tostring()+header2.array.tostring() , newdtype)[0] return newHeader # headers structures : headerDescription = [ ( 'system_id', 'i2' ), ( 'copyright', 'S10' ), ( 'creator', 'S8' ), ( 'us_per_time', 'i2' ), ( 'time_per_adc', 'i2' ), ( 'filestate', 'i2' ), ( 'first_data', 'i4' ),#i8 ( 'channels', 'i2' ), ( 'chan_size', 'i2' ), ( 'extra_data', 'i2' ), ( 'buffersize', 'i2' ), ( 'os_format', 'i2' ), ( 'max_ftime', 'i4' ),#i8 ( 'dtime_base', 'f8' ), ( 'datetime_detail', 'u1' ), ( 'datetime_year', 'i2' ), ( 'pad', 'S52' ), ( 'comment1', 'S80' ), ( 'comment2', 'S80' ), ( 'comment3', 'S80' ), ( 'comment4', 'S80' ), ( 'comment5', 'S80' ), ] channelHeaderDesciption1 = [ ('del_size','i2'), ('next_del_block','i4'),#i8 ('firstblock','i4'),#i8 ('lastblock','i4'),#i8 ('blocks','i2'), ('n_extra','i2'), ('pre_trig','i2'), ('free0','i2'), ('py_sz','i2'), ('max_data','i2'), ('comment','S72'), ('max_chan_time','i4'),#i8 ('l_chan_dvd','i4'),#i8 ('phy_chan','i2'), ('title','S10'), ('ideal_rate','f4'), ('kind','u1'), ('unused1','i1'), ] dict_kind = { 0 : 'empty', 1: 'Adc', 2: 'EventFall', 3: 'EventRise', 4: 'EventBoth', 5: 'Marker', 6: 'AdcMark', 7: 'RealMark', 8: 'TextMark', 9: 'RealWave', } blockHeaderDesciption =[ ('pred_block','i4'),#i8 ('succ_block','i4'),#i8 ('start_time','i4'),#i8 ('end_time','i4'),#i8 ('channel_num','i2'), ('items','i2'), ] unit_convert = { 'Volts' : 'V' , } neo-0.3.3/neo/io/brainvisionio.py0000644000175000017500000001133612273723542017772 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Class for reading data from BrainVision product. This code was originally made by L. Pezard (2010), modified B. Burle and S. More. Supported : Read Author: sgarcia """ import os import re import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Segment, AnalogSignal, EventArray from neo.io.tools import create_many_to_one_relationship class BrainVisionIO(BaseIO): """ Class for reading/writing data from BrainVision product (brainAmp, brain analyser...) Usage: >>> from neo import io >>> r = io.BrainVisionIO( filename = 'File_brainvision_1.eeg') >>> seg = r.read_segment(lazy = False, cascade = True,) """ is_readable = True is_writable = False supported_objects = [Segment, AnalogSignal, EventArray] readable_objects = [Segment] writeable_objects = [ ] has_header = False is_streameable = False read_params = { Segment : [ ] } write_params = { Segment : [ ] } name = None extensions = ['vhdr'] mode = 'file' def __init__(self , filename = None) : """ This class read/write a elan based file. **Arguments** filename : the filename to read or write """ BaseIO.__init__(self) self.filename = filename def read_segment(self, lazy = False, cascade = True): ## Read header file (vhdr) header = readBrainSoup(self.filename) assert header['Common Infos']['DataFormat'] == 'BINARY', NotImplementedError assert header['Common Infos']['DataOrientation'] == 'MULTIPLEXED', NotImplementedError nb_channel = int(header['Common Infos']['NumberOfChannels']) sampling_rate = 1.e6/float(header['Common Infos']['SamplingInterval']) * pq.Hz fmt = header['Binary Infos']['BinaryFormat'] fmts = { 'INT_16':np.int16, 'IEEE_FLOAT_32':np.float32,} assert fmt in fmts, NotImplementedError dt = fmts[fmt] seg = Segment(file_origin = os.path.basename(self.filename), ) if not cascade : return seg # read binary if not lazy: binary_file = os.path.splitext(self.filename)[0]+'.eeg' sigs = np.memmap(binary_file , dt, 'r', ).astype('f') n = int(sigs.size/nb_channel) sigs = sigs[:n*nb_channel] sigs = sigs.reshape(n, nb_channel) for c in range(nb_channel): name, ref, res, units = header['Channel Infos']['Ch%d' % (c+1,)].split(',') units = pq.Quantity(1, units.replace('µ', 'u') ) if lazy: signal = [ ]*units else: signal = sigs[:,c]*units anasig = AnalogSignal(signal = signal, channel_index = c, name = name, sampling_rate = sampling_rate, ) if lazy: anasig.lazy_shape = -1 seg.analogsignals.append(anasig) # read marker marker_file = os.path.splitext(self.filename)[0]+'.vmrk' all_info = readBrainSoup(marker_file)['Marker Infos'] all_types = [ ] times = [ ] labels = [ ] for i in range(len(all_info)): type_, label, pos, size, channel = all_info['Mk%d' % (i+1,)].split(',')[:5] all_types.append(type_) times.append(float(pos)/sampling_rate.magnitude) labels.append(label) all_types = np.array(all_types) times = np.array(times) * pq.s labels = np.array(labels, dtype = 'S') for type_ in np.unique(all_types): ind = type_ == all_types if lazy: ea = EventArray(name = str(type_)) ea.lazy_shape = -1 else: ea = EventArray( times = times[ind], labels = labels[ind], name = str(type_), ) seg.eventarrays.append(ea) create_many_to_one_relationship(seg) return seg def readBrainSoup(filename): section = None all_info = { } for line in open(filename , 'rU'): line = line.strip('\n').strip('\r') if line.startswith('['): section = re.findall('\[([\S ]+)\]', line)[0] all_info[section] = { } continue if line.startswith(';'): continue if '=' in line and len(line.split('=')) ==2: k,v = line.split('=') all_info[section][k] = v return all_info neo-0.3.3/neo/io/__init__.py0000644000175000017500000000647112265516260016660 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ :mod:`neo.io` provides classes for reading and/or writing electrophysiological data files. Note that if the package dependency is not satisfied for one io, it does not raise an error but a warning. neo.io.iolist provides a list of succesfully imported io classes. Classes: .. autoclass:: neo.io.AlphaOmegaIO .. autoclass:: neo.io.AsciiSignalIO .. autoclass:: neo.io.AsciiSpikeTrainIO .. autoclass:: neo.io.AxonIO .. autoclass:: neo.io.BlackrockIO .. autoclass:: neo.io.BrainVisionIO .. autoclass:: neo.io.BrainwareDamIO .. autoclass:: neo.io.BrainwareF32IO .. autoclass:: neo.io.BrainwareSrcIO .. autoclass:: neo.io.ElanIO .. autoclass:: neo.io.ElphyIO .. autoclass:: neo.io.KlustaKwikIO .. autoclass:: neo.io.MicromedIO .. autoclass:: neo.io.NeoHdf5IO .. autoclass:: neo.io.NeoMatlabIO .. autoclass:: neo.io.NeuroExplorerIO .. autoclass:: neo.io.NeuroScopeIO .. autoclass:: neo.io.NeuroshareIO .. autoclass:: neo.io.PickleIO .. autoclass:: neo.io.PlexonIO .. autoclass:: neo.io.PyNNNumpyIO .. autoclass:: neo.io.PyNNTextIO .. autoclass:: neo.io.RawBinarySignalIO .. autoclass:: neo.io.TdtIO .. autoclass:: neo.io.WinEdrIO .. autoclass:: neo.io.WinWcpIO """ import os.path from neo.io.alphaomegaio import AlphaOmegaIO from neo.io.asciisignalio import AsciiSignalIO from neo.io.asciispiketrainio import AsciiSpikeTrainIO from neo.io.axonio import AxonIO from neo.io.blackrockio import BlackrockIO from neo.io.brainvisionio import BrainVisionIO from neo.io.brainwaredamio import BrainwareDamIO from neo.io.brainwaref32io import BrainwareF32IO from neo.io.brainwaresrcio import BrainwareSrcIO from neo.io.elanio import ElanIO from neo.io.elphyio import ElphyIO from neo.io.exampleio import ExampleIO from neo.io.klustakwikio import KlustaKwikIO from neo.io.micromedio import MicromedIO from neo.io.hdf5io import NeoHdf5IO from neo.io.neomatlabio import NeoMatlabIO from neo.io.neuroexplorerio import NeuroExplorerIO from neo.io.neuroscopeio import NeuroScopeIO from neo.io.neuroshareio import NeuroshareIO from neo.io.pickleio import PickleIO from neo.io.plexonio import PlexonIO from neo.io.pynnio import PyNNNumpyIO from neo.io.pynnio import PyNNTextIO from neo.io.rawbinarysignalio import RawBinarySignalIO from neo.io.spike2io import Spike2IO from neo.io.tdtio import TdtIO from neo.io.winedrio import WinEdrIO from neo.io.winwcpio import WinWcpIO iolist = [AlphaOmegaIO, AsciiSignalIO, AsciiSpikeTrainIO, AxonIO, BlackrockIO, BrainVisionIO, BrainwareDamIO, BrainwareF32IO, BrainwareSrcIO, ElanIO, ElphyIO, ExampleIO, KlustaKwikIO, MicromedIO, NeoHdf5IO, NeoMatlabIO, NeuroExplorerIO, NeuroScopeIO, NeuroshareIO, PickleIO, PlexonIO, PyNNNumpyIO, PyNNTextIO, RawBinarySignalIO, Spike2IO, TdtIO, WinEdrIO, WinWcpIO] def get_io(filename): """ Return a Neo IO instance, guessing the type based on the filename suffix. """ extension = os.path.splitext(filename)[1][1:] for io in iolist: if extension in io.extensions: return io(filename=filename) raise IOError("file extension %s not registered" % extension) neo-0.3.3/neo/io/micromedio.py0000644000175000017500000001554312273723542017252 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Class for reading/writing data from micromed (.trc). Inspired by the Matlab code for EEGLAB from Rami K. Niazy. Completed with matlab Guillaume BECQ code. Supported : Read Author: sgarcia """ import datetime import os import struct # file no longer exists in Python3 try: file except NameError: import io file = io.BufferedReader import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Segment, AnalogSignal, EpochArray, EventArray from neo.io.tools import create_many_to_one_relationship class struct_file(file): def read_f(self, fmt): return struct.unpack(fmt , self.read(struct.calcsize(fmt))) class MicromedIO(BaseIO): """ Class for reading data from micromed (.trc). Usage: >>> from neo import io >>> r = io.MicromedIO(filename='File_micromed_1.TRC') >>> seg = r.read_segment(lazy=False, cascade=True) >>> print seg.analogsignals # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [=triggers['pos'][0]) & (triggers['pos']0) & (epochs['start']>> from neo import io >>> r = io.NeuroExplorerIO(filename='File_neuroexplorer_1.nex') >>> seg = r.read_segment(lazy=False, cascade=True) >>> print seg.analogsignals # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> print seg.spiketrains # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> print seg.eventarrays # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> print seg.epocharrays # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [, ] """ is_readable = True is_writable = False supported_objects = [Segment , AnalogSignal, SpikeTrain, EventArray, EpochArray] readable_objects = [ Segment] writeable_objects = [] has_header = False is_streameable = False # This is for GUI stuf : a definition for parameters when reading. read_params = { Segment : [ ] } write_params = None name = 'NeuroExplorer' extensions = [ 'nex' ] mode = 'file' def __init__(self , filename = None) : """ This class read a nex file. Arguments: filename : the filename to read you can pu what ever it do not read anythings """ BaseIO.__init__(self) self.filename = filename def read_segment(self, lazy = False, cascade = True, ): fid = open(self.filename, 'rb') globalHeader = HeaderReader(fid , GlobalHeader ).read_f(offset = 0) #~ print globalHeader #~ print 'version' , globalHeader['version'] seg = Segment() seg.file_origin = os.path.basename(self.filename) seg.annotate(neuroexplorer_version = globalHeader['version']) seg.annotate(comment = globalHeader['comment']) if not cascade : return seg offset = 544 for i in range(globalHeader['nvar']): entityHeader = HeaderReader(fid , EntityHeader ).read_f(offset = offset+i*208) entityHeader['name'] = entityHeader['name'].replace('\x00','') #print 'i',i, entityHeader['type'] if entityHeader['type'] == 0: # neuron if lazy: spike_times = [ ]*pq.s else: spike_times= np.memmap(self.filename , np.dtype('i4') ,'r' , shape = (entityHeader['n'] ), offset = entityHeader['offset'], ) spike_times = spike_times.astype('f8')/globalHeader['freq']*pq.s sptr = SpikeTrain( times= spike_times, t_start = globalHeader['tbeg']/globalHeader['freq']*pq.s, t_stop = globalHeader['tend']/globalHeader['freq']*pq.s, name = entityHeader['name'], ) if lazy: sptr.lazy_shape = entityHeader['n'] sptr.annotate(channel_index = entityHeader['WireNumber']) seg.spiketrains.append(sptr) if entityHeader['type'] == 1: # event if lazy: event_times = [ ]*pq.s else: event_times= np.memmap(self.filename , np.dtype('i4') ,'r' , shape = (entityHeader['n'] ), offset = entityHeader['offset'], ) event_times = event_times.astype('f8')/globalHeader['freq'] * pq.s labels = np.array(['']*event_times.size, dtype = 'S') evar = EventArray(times = event_times, labels=labels, channel_name = entityHeader['name'] ) if lazy: evar.lazy_shape = entityHeader['n'] seg.eventarrays.append(evar) if entityHeader['type'] == 2: # interval if lazy: start_times = [ ]*pq.s stop_times = [ ]*pq.s else: start_times= np.memmap(self.filename , np.dtype('i4') ,'r' , shape = (entityHeader['n'] ), offset = entityHeader['offset'], ) start_times = start_times.astype('f8')/globalHeader['freq']*pq.s stop_times= np.memmap(self.filename , np.dtype('i4') ,'r' , shape = (entityHeader['n'] ), offset = entityHeader['offset']+entityHeader['n']*4, ) stop_times = stop_times.astype('f')/globalHeader['freq']*pq.s epar = EpochArray(times = start_times, durations = stop_times - start_times, labels = np.array(['']*start_times.size, dtype = 'S'), channel_name = entityHeader['name']) if lazy: epar.lazy_shape = entityHeader['n'] seg.epocharrays.append(epar) if entityHeader['type'] == 3: # spiketrain and wavefoms if lazy: spike_times = [ ]*pq.s waveforms = None else: spike_times= np.memmap(self.filename , np.dtype('i4') ,'r' , shape = (entityHeader['n'] ), offset = entityHeader['offset'], ) spike_times = spike_times.astype('f8')/globalHeader['freq'] * pq.s waveforms = np.memmap(self.filename , np.dtype('i2') ,'r' , shape = (entityHeader['n'] , 1,entityHeader['NPointsWave']), offset = entityHeader['offset']+entityHeader['n'] *4, ) waveforms = (waveforms.astype('f')* entityHeader['ADtoMV'] + entityHeader['MVOffset'])*pq.mV t_stop = globalHeader['tend']/globalHeader['freq']*pq.s if spike_times.size>0: t_stop = max(t_stop, max(spike_times)) sptr = SpikeTrain( times = spike_times, t_start = globalHeader['tbeg']/globalHeader['freq']*pq.s, #~ t_stop = max(globalHeader['tend']/globalHeader['freq']*pq.s,max(spike_times)), t_stop = t_stop, name = entityHeader['name'], waveforms = waveforms, sampling_rate = entityHeader['WFrequency']*pq.Hz, left_sweep = 0*pq.ms, ) if lazy: sptr.lazy_shape = entityHeader['n'] sptr.annotate(channel_index = entityHeader['WireNumber']) seg.spiketrains.append(sptr) if entityHeader['type'] == 4: # popvectors pass if entityHeader['type'] == 5: # analog timestamps= np.memmap(self.filename , np.dtype('i4') ,'r' , shape = (entityHeader['n'] ), offset = entityHeader['offset'], ) timestamps = timestamps.astype('f8')/globalHeader['freq'] fragmentStarts = np.memmap(self.filename , np.dtype('i4') ,'r' , shape = (entityHeader['n'] ), offset = entityHeader['offset'], ) fragmentStarts = fragmentStarts.astype('f8')/globalHeader['freq'] t_start = timestamps[0] - fragmentStarts[0]/float(entityHeader['WFrequency']) del timestamps, fragmentStarts if lazy : signal = [ ]*pq.mV else: signal = np.memmap(self.filename , np.dtype('i2') ,'r' , shape = (entityHeader['NPointsWave'] ), offset = entityHeader['offset'], ) signal = signal.astype('f') signal *= entityHeader['ADtoMV'] signal += entityHeader['MVOffset'] signal = signal*pq.mV anaSig = AnalogSignal(signal=signal, t_start=t_start * pq.s, sampling_rate= entityHeader['WFrequency'] * pq.Hz, name=entityHeader['name'], channel_index=entityHeader['WireNumber']) if lazy: anaSig.lazy_shape = entityHeader['NPointsWave'] seg.analogsignals.append( anaSig ) if entityHeader['type'] == 6: # markers : TO TEST if lazy: times = [ ]*pq.s labels = np.array([ ], dtype = 'S') markertype = None else: times= np.memmap(self.filename , np.dtype('i4') ,'r' , shape = (entityHeader['n'] ), offset = entityHeader['offset'], ) times = times.astype('f8')/globalHeader['freq'] * pq.s fid.seek(entityHeader['offset'] + entityHeader['n']*4) markertype = fid.read(64).replace('\x00','') labels = np.memmap(self.filename, np.dtype('S' + str(entityHeader['MarkerLength'])) ,'r', shape = (entityHeader['n'] ), offset = entityHeader['offset'] + entityHeader['n']*4 + 64 ) ea = EventArray( times = times, labels = labels.view(np.ndarray), name = entityHeader['name'], channel_index = entityHeader['WireNumber'], marker_type = markertype ) if lazy: ea.lazy_shape = entityHeader['n'] seg.eventarrays.append(ea) create_many_to_one_relationship(seg) return seg GlobalHeader = [ ('signature' , '4s'), ('version','i'), ('comment','256s'), ('freq','d'), ('tbeg','i'), ('tend','i'), ('nvar','i'), ] EntityHeader = [ ('type' , 'i'), ('varVersion','i'), ('name','64s'), ('offset','i'), ('n','i'), ('WireNumber','i'), ('UnitNumber','i'), ('Gain','i'), ('Filter','i'), ('XPos','d'), ('YPos','d'), ('WFrequency','d'), ('ADtoMV','d'), ('NPointsWave','i'), ('NMarkers','i'), ('MarkerLength','i'), ('MVOffset','d'), ('dummy','60s'), ] MarkerHeader = [ ('type' , 'i'), ('varVersion','i'), ('name','64s'), ('offset','i'), ('n','i'), ('WireNumber','i'), ('UnitNumber','i'), ('Gain','i'), ('Filter','i'), ] class HeaderReader(): def __init__(self,fid ,description ): self.fid = fid self.description = description def read_f(self, offset =0): self.fid.seek(offset) d = { } for key, fmt in self.description : val = struct.unpack(fmt , self.fid.read(struct.calcsize(fmt))) if len(val) == 1: val = val[0] else : val = list(val) d[key] = val return d neo-0.3.3/neo/io/neomatlabio.py0000644000175000017500000003467112273723542017420 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Module for reading/writing Neo objects in MATLAB format (.mat) versions 5 to 7.2. This module is a bridge for MATLAB users who want to adopt the Neo object representation. The nomenclature is the same but using Matlab structs and cell arrays. With this module MATLAB users can use neo.io to read a format and convert it to .mat. Supported : Read/Write Author: sgarcia """ from datetime import datetime from distutils import version import re import numpy as np import quantities as pq # check scipy try: import scipy.io import scipy.version except ImportError as err: HAVE_SCIPY = False SCIPY_ERR = err else: if version.LooseVersion(scipy.version.version) < '0.8': HAVE_SCIPY = False SCIPY_ERR = ImportError("your scipy version is too old to support " + "MatlabIO, you need at least 0.8. " + "You have %s" % scipy.version.version) else: HAVE_SCIPY = True SCIPY_ERR = None from neo.io.baseio import BaseIO from neo.core import Block, Segment, AnalogSignal, EventArray, SpikeTrain from neo.io.tools import create_many_to_one_relationship from neo import description classname_lower_to_upper = { } for k in description.class_by_name.keys(): classname_lower_to_upper[k.lower()] = k class NeoMatlabIO(BaseIO): """ Class for reading/writing Neo objects in MATLAB format (.mat) versions 5 to 7.2. This module is a bridge for MATLAB users who want to adopt the Neo object representation. The nomenclature is the same but using Matlab structs and cell arrays. With this module MATLAB users can use neo.io to read a format and convert it to .mat. Rules of conversion: * Neo classes are converted to MATLAB structs. e.g., a Block is a struct with attributes "name", "file_datetime", ... * Neo one_to_many relationships are cellarrays in MATLAB. e.g., ``seg.analogsignals[2]`` in Python Neo will be ``seg.analogsignals{3}`` in MATLAB. * Quantity attributes are represented by 2 fields in MATLAB. e.g., ``anasig.t_start = 1.5 * s`` in Python will be ``anasig.t_start = 1.5`` and ``anasig.t_start_unit = 's'`` in MATLAB. * classes that inherit from Quantity (AnalogSignal, SpikeTrain, ...) in Python will have 2 fields (array and units) in the MATLAB struct. e.g.: ``AnalogSignal( [1., 2., 3.], 'V')`` in Python will be ``anasig.array = [1. 2. 3]`` and ``anasig.units = 'V'`` in MATLAB. 1 - **Scenario 1: create data in MATLAB and read them in Python** This MATLAB code generates a block:: block = struct(); block.segments = { }; block.name = 'my block with matlab'; for s = 1:3 seg = struct(); seg.name = strcat('segment ',num2str(s)); seg.analogsignals = { }; for a = 1:5 anasig = struct(); anasig.array = rand(100,1); anasig.units = 'mV'; anasig.t_start = 0; anasig.t_start_units = 's'; anasig.sampling_rate = 100; anasig.sampling_rate_units = 'Hz'; seg.analogsignals{a} = anasig; end seg.spiketrains = { }; for t = 1:7 sptr = struct(); sptr.array = rand(30,1)*10; sptr.units = 'ms'; sptr.t_start = 0; sptr.t_start_units = 'ms'; sptr.t_stop = 10; sptr.t_stop_units = 'ms'; seg.spiketrains{t} = sptr; end block.segments{s} = seg; end save 'myblock.mat' block -V7 This code reads it in Python:: import neo r = neo.io.NeoMatlabIO(filename='myblock.mat') bl = r.read_block() print bl.segments[1].analogsignals[2] print bl.segments[1].spiketrains[4] 2 - **Scenario 2: create data in Python and read them in MATLAB** This Python code generates the same block as in the previous scenario:: import neo import quantities as pq from scipy import rand bl = neo.Block(name='my block with neo') for s in range(3): seg = neo.Segment(name='segment' + str(s)) bl.segments.append(seg) for a in range(5): anasig = neo.AnalogSignal(rand(100), units='mV', t_start=0*pq.s, sampling_rate=100*pq.Hz) seg.analogsignals.append(anasig) for t in range(7): sptr = neo.SpikeTrain(rand(30), units='ms', t_start=0*pq.ms, t_stop=10*pq.ms) seg.spiketrains.append(sptr) w = neo.io.NeoMatlabIO(filename='myblock.mat') w.write_block(bl) This MATLAB code reads it:: load 'myblock.mat' block.name block.segments{2}.analogsignals{3}.array block.segments{2}.analogsignals{3}.units block.segments{2}.analogsignals{3}.t_start block.segments{2}.analogsignals{3}.t_start_units 3 - **Scenario 3: conversion** This Python code converts a Spike2 file to MATLAB:: from neo import Block from neo.io import Spike2IO, NeoMatlabIO r = Spike2IO(filename='myspike2file.smr') w = NeoMatlabIO(filename='convertedfile.mat') seg = r.read_segment() bl = Block(name='a block') bl.segments.append(seg) w.write_block(bl) """ is_readable = True is_writable = True supported_objects = [ Block, Segment , AnalogSignal , EventArray, SpikeTrain ] readable_objects = [Block, ] writeable_objects = [Block, ] has_header = False is_streameable = False read_params = { Block : [ ] } write_params = { Block : [ ] } name = 'neomatlab' extensions = [ 'mat' ] mode = 'file' def __init__(self , filename = None) : """ This class read/write neo objects in matlab 5 to 7.2 format. Arguments: filename : the filename to read """ if not HAVE_SCIPY: raise SCIPY_ERR BaseIO.__init__(self) self.filename = filename def read_block(self, cascade = True, lazy = False,): """ Arguments: """ d = scipy.io.loadmat(self.filename, struct_as_record=False, squeeze_me=True) assert'block' in d, 'no block in'+self.filename bl_struct = d['block'] bl = self.create_ob_from_struct(bl_struct, 'Block', cascade = cascade, lazy = lazy) create_many_to_one_relationship(bl) return bl def write_block(self, bl,): """ Arguments:: bl: the block to b saved """ bl_struct = self.create_struct_from_obj(bl) for seg in bl.segments: seg_struct = self.create_struct_from_obj(seg) bl_struct['segments'].append(seg_struct) for anasig in seg.analogsignals: anasig_struct = self.create_struct_from_obj(anasig) seg_struct['analogsignals'].append(anasig_struct) for ea in seg.eventarrays: ea_struct = self.create_struct_from_obj(ea) seg_struct['eventarrays'].append(ea_struct) for sptr in seg.spiketrains: sptr_struct = self.create_struct_from_obj(sptr) seg_struct['spiketrains'].append(sptr_struct) scipy.io.savemat(self.filename, {'block':bl_struct}, oned_as = 'row') def create_struct_from_obj(self, ob, ): classname = ob.__class__.__name__ struct = { } # relationship rel = description.one_to_many_relationship if classname in rel: for childname in rel[classname]: if description.class_by_name[childname] in self.supported_objects: struct[childname.lower()+'s'] = [ ] # attributes necess = description.classes_necessary_attributes[classname] recomm = description.classes_recommended_attributes[classname] attributes = necess + recomm for i, attr in enumerate(attributes): attrname, attrtype = attr[0], attr[1] #~ if attrname =='': #~ struct['array'] = ob.magnitude #~ struct['units'] = ob.dimensionality.string #~ continue if classname in description.classes_inheriting_quantities and \ description.classes_inheriting_quantities[classname] == attrname: struct[attrname] = ob.magnitude struct[attrname+'_units'] = ob.dimensionality.string continue if not(attrname in ob.annotations or hasattr(ob, attrname)): continue if getattr(ob, attrname) is None : continue if attrtype == pq.Quantity: #ndim = attr[2] struct[attrname] = getattr(ob,attrname).magnitude struct[attrname+'_units'] = getattr(ob,attrname).dimensionality.string elif attrtype ==datetime: struct[attrname] = str(getattr(ob,attrname)) else: struct[attrname] = getattr(ob,attrname) return struct def create_ob_from_struct(self, struct, classname, cascade = True, lazy = False,): cl = description.class_by_name[classname] # check if hinerits Quantity #~ is_quantity = False #~ for attr in description.classes_necessary_attributes[classname]: #~ if attr[0] == '' and attr[1] == pq.Quantity: #~ is_quantity = True #~ break #~ is_quantiy = classname in description.classes_inheriting_quantities #~ if is_quantity: if classname in description.classes_inheriting_quantities: quantity_attr = description.classes_inheriting_quantities[classname] arr = getattr(struct,quantity_attr) #~ data_complement = dict(units=str(struct.units)) data_complement = dict(units=str(getattr(struct,quantity_attr+'_units'))) if "sampling_rate" in (at[0] for at in description.classes_necessary_attributes[classname]): data_complement["sampling_rate"] = 0*pq.kHz # put fake value for now, put correct value later if "t_stop" in (at[0] for at in description.classes_necessary_attributes[classname]): if len(arr) > 0: data_complement["t_stop"] =arr.max() else: data_complement["t_stop"] = 0.0 if "t_start" in (at[0] for at in description.classes_necessary_attributes[classname]): if len(arr) > 0: data_complement["t_start"] =arr.min() else: data_complement["t_start"] = 0.0 if lazy: ob = cl([ ], **data_complement) ob.lazy_shape = arr.shape else: ob = cl(arr, **data_complement) else: ob = cl() for attrname in struct._fieldnames: # check children rel = description.one_to_many_relationship if classname in rel and attrname[:-1] in [ r.lower() for r in rel[classname] ]: try: for c in range(len(getattr(struct,attrname))): if cascade: child = self.create_ob_from_struct(getattr(struct,attrname)[c] , classname_lower_to_upper[attrname[:-1]], cascade = cascade, lazy = lazy) getattr(ob, attrname.lower()).append(child) except TypeError: # strange behavior in scipy.io: if len is 1 so there is no len() if cascade: child = self.create_ob_from_struct(getattr(struct,attrname) , classname_lower_to_upper[attrname[:-1]], cascade = cascade, lazy = lazy) getattr(ob, attrname.lower()).append(child) continue # attributes if attrname.endswith('_units') or attrname =='units' :#or attrname == 'array': # linked with another field continue if classname in description.classes_inheriting_quantities and \ description.classes_inheriting_quantities[classname] == attrname: continue item = getattr(struct, attrname) # put the good type necess = description.classes_necessary_attributes[classname] recomm = description.classes_recommended_attributes[classname] attributes = necess + recomm dict_attributes = dict( [ (a[0], a[1:]) for a in attributes]) if attrname in dict_attributes: attrtype = dict_attributes[attrname][0] if attrtype == datetime: m = '(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+).(\d+)' r = re.findall(m, str(item)) if len(r)==1: item = datetime( *[ int(e) for e in r[0] ] ) else: item = None elif attrtype == np.ndarray: dt = dict_attributes[attrname][2] if lazy: item = np.array([ ], dtype = dt) ob.lazy_shape = item.shape else: item = item.astype( dt ) elif attrtype == pq.Quantity: ndim = dict_attributes[attrname][1] units = str(getattr(struct, attrname+'_units')) if ndim == 0: item = pq.Quantity(item, units) else: if lazy: item = pq.Quantity([ ], units) item.lazy_shape = item.shape else: item = pq.Quantity(item, units) else: item = attrtype(item) setattr(ob, attrname, item) return ob neo-0.3.3/neo/io/brainwaref32io.py0000644000175000017500000002511412273723542017733 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' Class for reading from Brainware F32 files F32 files are simplified binary files for holding spike data. Unlike SRC files, F32 files carry little metadata. This also means, however, that the file format does not change, unlike SRC files whose format changes periodically (although ideally SRC files are backwards-compatible). Each F32 file only holds a single Block. The only metadata stored in the file is the length of a single repetition of the stimulus and the values of the stimulus parameters (but not the names of the parameters). Brainware was developed by Dr. Jan Schnupp and is availabe from Tucker Davis Technologies, Inc. http://www.tdt.com/downloads.htm Neither Dr. Jan Schnupp nor Tucker Davis Technologies, Inc. had any part in the development of this code The code is implemented with the permission of Dr. Jan Schnupp Author: Todd Jennings ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function # import needed core python modules from os import path # numpy and quantities are already required by neo import numpy as np import quantities as pq # needed core neo modules from neo.core import Block, RecordingChannelGroup, Segment, SpikeTrain, Unit # need to subclass BaseIO from neo.io.baseio import BaseIO # some tools to finalize the hierachy from neo.io.tools import create_many_to_one_relationship class BrainwareF32IO(BaseIO): ''' Class for reading Brainware Spike ReCord files with the extension '.f32' The read_block method returns the first Block of the file. It will automatically close the file after reading. The read method is the same as read_block. The read_all_blocks method automatically reads all Blocks. It will automatically close the file after reading. The read_next_block method will return one Block each time it is called. It will automatically close the file and reset to the first Block after reading the last block. Call the close method to close the file and reset this method back to the first Block. The isopen property tells whether the file is currently open and reading or closed. Note 1: There is always only one RecordingChannelGroup. BrainWare stores the equivalent of RecordingChannelGroups in separate files. Usage: >>> from neo.io.brainwaref32io import BrainwareF32IO >>> f32file = BrainwareF32IO(filename='multi_500ms_mulitrep_ch1.f32') >>> blk1 = f32file.read() >>> blk2 = f32file.read_block() >>> print blk1.segments >>> print blk1.segments[0].spiketrains >>> print blk1.units >>> print blk1.units[0].name >>> print blk2 >>> print blk2[0].segments ''' is_readable = True # This class can only read data is_writable = False # write is not supported # This class is able to directly or indirectly handle the following objects # You can notice that this greatly simplifies the full Neo object hierarchy supported_objects = [Block, RecordingChannelGroup, Segment, SpikeTrain, Unit] readable_objects = [Block] writeable_objects = [] has_header = False is_streameable = False # This is for GUI stuff: a definition for parameters when reading. # This dict should be keyed by object (`Block`). Each entry is a list # of tuple. The first entry in each tuple is the parameter name. The # second entry is a dict with keys 'value' (for default value), # and 'label' (for a descriptive name). # Note that if the highest-level object requires parameters, # common_io_test will be skipped. read_params = {Block: [], RecordingChannelGroup: [], Segment: [], SpikeTrain: [], Unit: [], } # does not support write so no GUI stuff write_params = None name = 'Brainware F32 File' extensions = ['f32'] mode = 'file' def __init__(self, filename=None): ''' Arguments: filename: the filename ''' BaseIO.__init__(self) self._path = filename self._filename = path.basename(filename) self._fsrc = None self.__lazy = False self._blk = None self.__unit = None self.__t_stop = None self.__params = None self.__seg = None self.__spiketimes = None def read(self, lazy=False, cascade=True, **kargs): ''' Reads simple spike data file "fname" generated with BrainWare ''' return self.read_block(lazy=lazy, cascade=cascade) def read_block(self, lazy=False, cascade=True, **kargs): ''' Reads a block from the simple spike data file "fname" generated with BrainWare ''' # there are no keyargs implemented to so far. If someone tries to pass # them they are expecting them to do something or making a mistake, # neither of which should pass silently if kargs: raise NotImplementedError('This method does not have any ' 'argument implemented yet') self._fsrc = None self.__lazy = lazy self._blk = Block(file_origin=self._filename) block = self._blk # if we aren't doing cascade, don't load anything if not cascade: return block # create the objects to store other objects rcg = RecordingChannelGroup(file_origin=self._filename) self.__unit = Unit(file_origin=self._filename) # load objects into their containers block.recordingchannelgroups.append(rcg) rcg.units.append(self.__unit) # initialize values self.__t_stop = None self.__params = None self.__seg = None self.__spiketimes = None # open the file with open(self._path, 'rb') as self._fsrc: res = True # while the file is not done keep reading segments while res: res = self.__read_id() create_many_to_one_relationship(block) # cleanup attributes self._fsrc = None self.__lazy = False self._blk = None self.__t_stop = None self.__params = None self.__seg = None self.__spiketimes = None return block # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # IMPORTANT!!! # These are private methods implementing the internal reading mechanism. # Due to the way BrainWare DAM files are structured, they CANNOT be used # on their own. Calling these manually will almost certainly alter your # position in the file in an unrecoverable manner, whether they throw # an exception or not. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- def __read_id(self): ''' Read the next ID number and do the appropriate task with it. Returns nothing. ''' try: # float32 -- ID of the first data sequence objid = np.fromfile(self._fsrc, dtype=np.float32, count=1)[0] except IndexError: # if we have a previous segment, save it self.__save_segment() # if there are no more Segments, return return False if objid == -2: self.__read_condition() elif objid == -1: self.__read_segment() else: self.__spiketimes.append(objid) return True def __read_condition(self): ''' Read the parameter values for a single stimulus condition. Returns nothing. ''' # float32 -- SpikeTrain length in ms self.__t_stop = np.fromfile(self._fsrc, dtype=np.float32, count=1)[0] # float32 -- number of stimulus parameters numelements = int(np.fromfile(self._fsrc, dtype=np.float32, count=1)[0]) # [float32] * numelements -- stimulus parameter values paramvals = np.fromfile(self._fsrc, dtype=np.float32, count=numelements).tolist() # organize the parameers into a dictionary with arbitrary names paramnames = ['Param%s' % i for i in range(len(paramvals))] self.__params = dict(zip(paramnames, paramvals)) def __read_segment(self): ''' Setup the next Segment. Returns nothing. ''' # if we have a previous segment, save it self.__save_segment() # create the segment self.__seg = Segment(file_origin=self._filename, **self.__params) # create an empy array to save the spike times # this needs to be converted to a SpikeTrain before it can be used self.__spiketimes = [] def __save_segment(self): ''' Write the segment to the Block if it exists ''' # if this is the beginning of the first condition, then we don't want # to save, so exit # but set __seg from None to False so we know next time to create a # segment even if there are no spike in the condition if self.__seg is None: self.__seg = False return if not self.__seg: # create dummy values if there are no SpikeTrains in this condition self.__seg = Segment(file_origin=self._filename, **self.__params) self.__spiketimes = [] if self.__lazy: train = SpikeTrain(pq.Quantity([], dtype=np.float32, units=pq.ms), t_start=0*pq.ms, t_stop=self.__t_stop * pq.ms, file_origin=self._filename) train.lazy_shape = len(self.__spiketimes) else: times = pq.Quantity(self.__spiketimes, dtype=np.float32, units=pq.ms) train = SpikeTrain(times, t_start=0*pq.ms, t_stop=self.__t_stop * pq.ms, file_origin=self._filename) self.__seg.spiketrains = [train] self.__unit.spiketrains.append(train) self._blk.segments.append(self.__seg) # set an empty segment # from now on, we need to set __seg to False rather than None so # that if there is a condition with no SpikeTrains we know # to create an empty Segment self.__seg = False neo-0.3.3/neo/io/asciispiketrainio.py0000644000175000017500000001031712273723542020627 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Classe for reading/writing SpikeTrains in a text file. It is the simple case where different spiketrains are written line by line. Supported : Read/Write Author: sgarcia """ import os import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Segment, SpikeTrain from neo.io.tools import create_many_to_one_relationship class AsciiSpikeTrainIO(BaseIO): """ Classe for reading/writing SpikeTrain in a text file. Each Spiketrain is a line. Usage: >>> from neo import io >>> r = io.AsciiSpikeTrainIO( filename = 'File_ascii_spiketrain_1.txt') >>> seg = r.read_segment(lazy = False, cascade = True,) >>> print seg.spiketrains # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> from neo import io >>> r = io.AlphaOmegaIO( filename = 'File_AlphaOmega_1.map') >>> blck = r.read_block(lazy = False, cascade = True) >>> print blck.segments[0].analogsignals """ is_readable = True # This is a reading only class is_writable = False # writting is not supported # This class is able to directly or inderectly read the following kind of # objects supported_objects = [ Block, Segment , AnalogSignal] # TODO: Add support for other objects that should be extractable from .map # files (AnalogSignalArray, Event, EventArray, Epoch?, Epoch Array?, # Spike?, SpikeTrain?) # This class can only return a Block readable_objects = [ Block ] # TODO : create readers for different type of objects (Segment, # AnalogSignal,...) # This class is not able to write objects writeable_objects = [ ] # This is for GUI stuff : a definition for parameters when reading. read_params = { Block : [ ] } # Writing is not supported, so no GUI stuff write_params = None name = 'AlphaOmega' extensions = [ 'map' ] mode = 'file' def __init__(self , filename = None) : """ Arguments: filename : the .map Alpha Omega file name """ BaseIO.__init__(self) self.filename = filename # write is not supported so I do not overload write method from BaseIO def read_block(self, # the 2 first keyword arguments are imposed by neo.io API lazy = False, cascade = True): """ Return a Block. """ def count_samples(m_length): """ Count the number of signal samples available in a type 5 data block of length m_length """ # for information about type 5 data block, see [1] count = int((m_length-6)/2-2) # -6 corresponds to the header of block 5, and the -2 take into # account the fact that last 2 values are not available as the 4 # corresponding bytes are coding the time stamp of the beginning # of the block return count # create the neo Block that will be returned at the end blck = Block(file_origin = os.path.basename(self.filename)) blck.file_origin = os.path.basename(self.filename) fid = open(self.filename, 'rb') # NOTE: in the following, the word "block" is used in the sense used in # the alpha-omega specifications (ie a data chunk in the file), rather # than in the sense of the usual Block object in neo # step 1: read the headers of all the data blocks to load the file # structure pos_block = 0 # position of the current block in the file file_blocks = [] # list of data blocks available in the file if not cascade: # we read only the main header m_length, m_TypeBlock = struct.unpack('Hcx' , fid.read(4)) # m_TypeBlock should be 'h', as we read the first block block = HeaderReader(fid, dict_header_type.get(m_TypeBlock, Type_Unknown)).read_f() block.update({'m_length': m_length, 'm_TypeBlock': m_TypeBlock, 'pos': pos_block}) file_blocks.append(block) else: # cascade == True seg = Segment(file_origin = os.path.basename(self.filename)) seg.file_origin = os.path.basename(self.filename) blck.segments.append(seg) while True: first_4_bytes = fid.read(4) if len(first_4_bytes) < 4: # we have reached the end of the file break else: m_length, m_TypeBlock = struct.unpack('Hcx', first_4_bytes) block = HeaderReader(fid, dict_header_type.get(m_TypeBlock, Type_Unknown)).read_f() block.update({'m_length': m_length, 'm_TypeBlock': m_TypeBlock, 'pos': pos_block}) if m_TypeBlock == '2': # The beggining of the block of type '2' is identical for # all types of channels, but the following part depends on # the type of channel. So we need a special case here. # WARNING: How to check the type of channel is not # described in the documentation. So here I use what is # proposed in the C code [2]. # According to this C code, it seems that the 'm_isAnalog' # is used to distinguished analog and digital channels, and # 'm_Mode' encodes the type of analog channel: # 0 for continuous, 1 for level, 2 for external trigger. # But in some files, I found channels that seemed to be # continuous channels with 'm_Modes' = 128 or 192. So I # decided to consider every channel with 'm_Modes' # different from 1 or 2 as continuous. I also couldn't # check that values of 1 and 2 are really for level and # external trigger as I had no test files containing data # of this types. type_subblock = 'unknown_channel_type(m_Mode=' \ + str(block['m_Mode'])+ ')' description = Type2_SubBlockUnknownChannels block.update({'m_Name': 'unknown_name'}) if block['m_isAnalog'] == 0: # digital channel type_subblock = 'digital' description = Type2_SubBlockDigitalChannels elif block['m_isAnalog'] == 1: # analog channel if block['m_Mode'] == 1: # level channel type_subblock = 'level' description = Type2_SubBlockLevelChannels elif block['m_Mode'] == 2: # external trigger channel type_subblock = 'external_trigger' description = Type2_SubBlockExtTriggerChannels else: # continuous channel type_subblock = 'continuous(Mode' \ + str(block['m_Mode']) +')' description = Type2_SubBlockContinuousChannels subblock = HeaderReader(fid, description).read_f() block.update(subblock) block.update({'type_subblock': type_subblock}) file_blocks.append(block) pos_block += m_length fid.seek(pos_block) # step 2: find the available channels list_chan = [] # list containing indexes of channel blocks for ind_block, block in enumerate(file_blocks): if block['m_TypeBlock'] == '2': list_chan.append(ind_block) # step 3: find blocks containing data for the available channels list_data = [] # list of lists of indexes of data blocks # corresponding to each channel for ind_chan, chan in enumerate(list_chan): list_data.append([]) num_chan = file_blocks[chan]['m_numChannel'] for ind_block, block in enumerate(file_blocks): if block['m_TypeBlock'] == '5': if block['m_numChannel'] == num_chan: list_data[ind_chan].append(ind_block) # step 4: compute the length (number of samples) of the channels chan_len = np.zeros(len(list_data), dtype = np.int) for ind_chan, list_blocks in enumerate(list_data): for ind_block in list_blocks: chan_len[ind_chan] += count_samples( file_blocks[ind_block]['m_length']) # step 5: find channels for which data are available ind_valid_chan = np.nonzero(chan_len)[0] # step 6: load the data # TODO give the possibility to load data as AnalogSignalArrays for ind_chan in ind_valid_chan: list_blocks = list_data[ind_chan] ind = 0 # index in the data vector # read time stamp for the beginning of the signal form = '>> from neo import io >>> r = io.PlexonIO(filename='File_plexon_1.plx') >>> seg = r.read_segment(lazy=False, cascade=True) >>> print seg.analogsignals [] >>> print seg.spiketrains # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> print seg.eventarrays [] """ is_readable = True is_writable = False supported_objects = [Segment , AnalogSignal, SpikeTrain, EventArray, EpochArray] readable_objects = [ Segment] writeable_objects = [] has_header = False is_streameable = False # This is for GUI stuf : a definition for parameters when reading. read_params = { Segment : [ ('load_spike_waveform' , { 'value' : False } ) , ] } write_params = None name = 'Plexon' extensions = [ 'plx' ] mode = 'file' def __init__(self , filename = None) : """ This class read a plx file. Arguments: filename : the filename load_spike_waveform : load or not waveform of spikes (default True) """ BaseIO.__init__(self) self.filename = filename def read_segment(self, lazy = False, cascade = True, load_spike_waveform = True, ): """ """ fid = open(self.filename, 'rb') globalHeader = HeaderReader(fid , GlobalHeader ).read_f(offset = 0) # metadatas seg = Segment() seg.rec_datetime = datetime.datetime( globalHeader['Year'] , globalHeader['Month'] , globalHeader['Day'] , globalHeader['Hour'] , globalHeader['Minute'] , globalHeader['Second'] ) seg.file_origin = os.path.basename(self.filename) seg.annotate(plexon_version = globalHeader['Version']) if not cascade: return seg ## Step 1 : read headers # dsp channels header = sipkes and waveforms dspChannelHeaders = { } maxunit=0 maxchan = 0 for _ in range(globalHeader['NumDSPChannels']): # channel is 1 based channelHeader = HeaderReader(fid , ChannelHeader ).read_f(offset = None) channelHeader['Template'] = np.array(channelHeader['Template']).reshape((5,64)) channelHeader['Boxes'] = np.array(channelHeader['Boxes']).reshape((5,2,4)) dspChannelHeaders[channelHeader['Channel']]=channelHeader maxunit = max(channelHeader['NUnits'],maxunit) maxchan = max(channelHeader['Channel'],maxchan) # event channel header eventHeaders = { } for _ in range(globalHeader['NumEventChannels']): eventHeader = HeaderReader(fid , EventHeader ).read_f(offset = None) eventHeaders[eventHeader['Channel']] = eventHeader # slow channel header = signal slowChannelHeaders = { } for _ in range(globalHeader['NumSlowChannels']): slowChannelHeader = HeaderReader(fid , SlowChannelHeader ).read_f(offset = None) slowChannelHeaders[slowChannelHeader['Channel']] = slowChannelHeader ## Step 2 : a first loop for counting size # signal nb_samples = np.zeros(len(slowChannelHeaders)) sample_positions = np.zeros(len(slowChannelHeaders)) t_starts = np.zeros(len(slowChannelHeaders), dtype = 'f') #spiketimes and waveform nb_spikes = np.zeros((maxchan+1, maxunit+1) ,dtype='i') wf_sizes = np.zeros((maxchan+1, maxunit+1, 2) ,dtype='i') # eventarrays nb_events = { } #maxstrsizeperchannel = { } for chan, h in iteritems(eventHeaders): nb_events[chan] = 0 #maxstrsizeperchannel[chan] = 0 start = fid.tell() while fid.tell() !=-1 : # read block header dataBlockHeader = HeaderReader(fid , DataBlockHeader ).read_f(offset = None) if dataBlockHeader is None : break chan = dataBlockHeader['Channel'] unit = dataBlockHeader['Unit'] n1,n2 = dataBlockHeader['NumberOfWaveforms'] , dataBlockHeader['NumberOfWordsInWaveform'] time = (dataBlockHeader['UpperByteOf5ByteTimestamp']*2.**32 + dataBlockHeader['TimeStamp']) if dataBlockHeader['Type'] == 1: nb_spikes[chan,unit] +=1 wf_sizes[chan,unit,:] = [n1,n2] fid.seek(n1*n2*2,1) elif dataBlockHeader['Type'] ==4: #event nb_events[chan] += 1 elif dataBlockHeader['Type'] == 5: #continuous signal fid.seek(n2*2, 1) if n2> 0: nb_samples[chan] += n2 if nb_samples[chan] ==0: t_starts[chan] = time ## Step 3: allocating memory and 2 loop for reading if not lazy if not lazy: # allocating mem for signal sigarrays = { } for chan, h in iteritems(slowChannelHeaders): sigarrays[chan] = np.zeros(nb_samples[chan]) # allocating mem for SpikeTrain stimearrays = np.zeros((maxchan+1, maxunit+1) ,dtype=object) swfarrays = np.zeros((maxchan+1, maxunit+1) ,dtype=object) for (chan, unit), _ in np.ndenumerate(nb_spikes): stimearrays[chan,unit] = np.zeros(nb_spikes[chan,unit], dtype = 'f') if load_spike_waveform: n1,n2 = wf_sizes[chan, unit,:] swfarrays[chan, unit] = np.zeros( (nb_spikes[chan, unit], n1, n2 ) , dtype = 'f4' ) pos_spikes = np.zeros(nb_spikes.shape, dtype = 'i') # allocating mem for event eventpositions = { } evarrays = { } for chan, nb in iteritems(nb_events): evarrays[chan] = np.zeros(nb, dtype = 'f' ) eventpositions[chan]=0 fid.seek(start) while fid.tell() !=-1 : dataBlockHeader = HeaderReader(fid , DataBlockHeader ).read_f(offset = None) if dataBlockHeader is None : break chan = dataBlockHeader['Channel'] n1,n2 = dataBlockHeader['NumberOfWaveforms'] , dataBlockHeader['NumberOfWordsInWaveform'] time = dataBlockHeader['UpperByteOf5ByteTimestamp']*2.**32 + dataBlockHeader['TimeStamp'] time/= globalHeader['ADFrequency'] if n2 <0: break if dataBlockHeader['Type'] == 1: #spike unit = dataBlockHeader['Unit'] pos = pos_spikes[chan,unit] stimearrays[chan, unit][pos] = time if load_spike_waveform and n1*n2 != 0 : swfarrays[chan,unit][pos,:,:] = np.fromstring( fid.read(n1*n2*2) , dtype = 'i2').reshape(n1,n2).astype('f4') else: fid.seek(n1*n2*2,1) pos_spikes[chan,unit] +=1 elif dataBlockHeader['Type'] == 4: # event pos = eventpositions[chan] evarrays[chan][pos] = time eventpositions[chan]+= 1 elif dataBlockHeader['Type'] == 5: #signal data = np.fromstring( fid.read(n2*2) , dtype = 'i2').astype('f4') sigarrays[chan][sample_positions[chan] : sample_positions[chan]+data.size] = data sample_positions[chan] += data.size ## Step 3: create neo object for chan, h in iteritems(eventHeaders): if lazy: times = [ ] else: times = evarrays[chan] ea = EventArray(times*pq.s, channel_name= eventHeaders[chan]['Name'], channel_index = chan) if lazy: ea.lazy_shape = nb_events[chan] seg.eventarrays.append(ea) for chan, h in iteritems(slowChannelHeaders): if lazy: signal = [ ] else: if globalHeader['Version'] ==100 or globalHeader['Version'] ==101 : gain = 5000./(2048*slowChannelHeaders[chan]['Gain']*1000.) elif globalHeader['Version'] ==102 : gain = 5000./(2048*slowChannelHeaders[chan]['Gain']*slowChannelHeaders[chan]['PreampGain']) elif globalHeader['Version'] >= 103: gain = globalHeader['SlowMaxMagnitudeMV']/(.5*(2**globalHeader['BitsPerSpikeSample'])*\ slowChannelHeaders[chan]['Gain']*slowChannelHeaders[chan]['PreampGain']) signal = sigarrays[chan]*gain anasig = AnalogSignal(signal*pq.V, sampling_rate = float(slowChannelHeaders[chan]['ADFreq'])*pq.Hz, t_start = t_starts[chan]*pq.s, channel_index = slowChannelHeaders[chan]['Channel'], channel_name = slowChannelHeaders[chan]['Name'], ) if lazy: anasig.lazy_shape = nb_samples[chan] seg.analogsignals.append(anasig) for (chan, unit), value in np.ndenumerate(nb_spikes): if nb_spikes[chan, unit] == 0: continue if lazy: times = [ ] waveforms = None t_stop = 0 else: times = stimearrays[chan,unit] t_stop = times.max() if load_spike_waveform: if globalHeader['Version'] <103: gain = 3000./(2048*dspChannelHeaders[chan]['Gain']*1000.) elif globalHeader['Version'] >=103 and globalHeader['Version'] <105: gain = globalHeader['SpikeMaxMagnitudeMV']/(.5*2.**(globalHeader['BitsPerSpikeSample'])*1000.) elif globalHeader['Version'] >105: gain = globalHeader['SpikeMaxMagnitudeMV']/(.5*2.**(globalHeader['BitsPerSpikeSample'])*globalHeader['SpikePreAmpGain']) waveforms = swfarrays[chan, unit] * gain * pq.V else: waveforms = None sptr = SpikeTrain(times, units='s', t_stop=t_stop*pq.s, waveforms = waveforms, ) sptr.annotate(unit_name = dspChannelHeaders[chan]['Name']) sptr.annotate(channel_index = chan) if lazy: sptr.lazy_shape = nb_spikes[chan,unit] seg.spiketrains.append(sptr) create_many_to_one_relationship(seg) return seg GlobalHeader = [ ('MagicNumber' , 'I'), ('Version','i'), ('Comment','128s'), ('ADFrequency','i'), ('NumDSPChannels','i'), ('NumEventChannels','i'), ('NumSlowChannels','i'), ('NumPointsWave','i'), ('NumPointsPreThr','i'), ('Year','i'), ('Month','i'), ('Day','i'), ('Hour','i'), ('Minute','i'), ('Second','i'), ('FastRead','i'), ('WaveformFreq','i'), ('LastTimestamp','d'), #version >103 ('Trodalness' , 'b'), ('DataTrodalness' , 'b'), ('BitsPerSpikeSample' , 'b'), ('BitsPerSlowSample' , 'b'), ('SpikeMaxMagnitudeMV' , 'H'), ('SlowMaxMagnitudeMV' , 'H'), #version 105 ('SpikePreAmpGain' , 'H'), #version 106 ('AcquiringSoftware','18s'), ('ProcessingSoftware','18s'), ('Padding','10s'), # all version ('TSCounts','650i'), ('WFCounts','650i'), ('EVCounts','512i'), ] ChannelHeader = [ ('Name' , '32s'), ('SIGName','32s'), ('Channel','i'), ('WFRate','i'), ('SIG','i'), ('Ref','i'), ('Gain','i'), ('Filter','i'), ('Threshold','i'), ('Method','i'), ('NUnits','i'), ('Template','320h'), ('Fit','5i'), ('SortWidth','i'), ('Boxes','40h'), ('SortBeg','i'), #version 105 ('Comment','128s'), #version 106 ('SrcId','b'), ('reserved','b'), ('ChanId','H'), ('Padding','10i'), ] EventHeader = [ ('Name' , '32s'), ('Channel','i'), #version 105 ('Comment' , '128s'), #version 106 ('SrcId','b'), ('reserved','b'), ('ChanId','H'), ('Padding','32i'), ] SlowChannelHeader = [ ('Name' , '32s'), ('Channel','i'), ('ADFreq','i'), ('Gain','i'), ('Enabled','i'), ('PreampGain','i'), #version 104 ('SpikeChannel','i'), #version 105 ('Comment','128s'), #version 106 ('SrcId','b'), ('reserved','b'), ('ChanId','H'), ('Padding','27i'), ] DataBlockHeader = [ ('Type','h'), ('UpperByteOf5ByteTimestamp','h'), ('TimeStamp','i'), ('Channel','h'), ('Unit','h'), ('NumberOfWaveforms','h'), ('NumberOfWordsInWaveform','h'), ]# 16 bytes class HeaderReader(): def __init__(self,fid ,description ): self.fid = fid self.description = description def read_f(self, offset =None): if offset is not None : self.fid.seek(offset) d = { } for key, fmt in self.description : buf = self.fid.read(struct.calcsize(fmt)) if len(buf) != struct.calcsize(fmt) : return None val = list(struct.unpack(fmt , buf)) for i, ival in enumerate(val): if hasattr(ival, 'replace'): val[i] = ival.replace('\x00','') if len(val) == 1: val = val[0] d[key] = val return d neo-0.3.3/neo/io/brainwaresrcio.py0000755000175000017500000016603712273723542020145 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' Class for reading from Brainware SRC files SRC files are binary files for holding spike data. They are broken up into nested data sequences of different types, with each type of sequence identified by a unique ID number. This allows new versions of sequences to be included without breaking backwards compatibility, since new versions can just be given a new ID number. The ID numbers and the format of the data they contain were taken from the Matlab-based reader function supplied with BrainWare. The python code, however, was implemented from scratch in Python using Python idioms. There are some situations where BrainWare data can overflow the SRC file, resulting in a corrupt file. Neither BrainWare nor the Matlab-based reader can read such files. This software, however, will try to recover the data, and in most cases can do so successfully. Each SRC file can hold the equivalent of multiple Neo Blocks. Brainware was developed by Dr. Jan Schnupp and is availabe from Tucker Davis Technologies, Inc. http://www.tdt.com/downloads.htm Neither Dr. Jan Schnupp nor Tucker Davis Technologies, Inc. had any part in the development of this code The code is implemented with the permission of Dr. Jan Schnupp Author: Todd Jennings ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function # import needed core python modules from datetime import datetime, timedelta from os import path from warnings import warn # numpy and quantities are already required by neo import numpy as np import quantities as pq # needed core neo modules from neo.core import (Block, Event, RecordingChannel, RecordingChannelGroup, Segment, SpikeTrain, Unit) # need to subclass BaseIO from neo.io.baseio import BaseIO # some tools to finalize the hierachy from neo.io.tools import create_many_to_one_relationship class BrainwareSrcIO(BaseIO): ''' Class for reading Brainware Spike ReCord files with the extension '.src' The read_block method returns the first Block of the file. It will automatically close the file after reading. The read method is the same as read_block. The read_all_blocks method automatically reads all Blocks. It will automatically close the file after reading. The read_next_block method will return one Block each time it is called. It will automatically close the file and reset to the first Block after reading the last block. Call the close method to close the file and reset this method back to the first Block. The isopen property tells whether the file is currently open and reading or closed. Note 1: The first Unit in each RecordingChannelGroup is always UnassignedSpikes, which has a SpikeTrain for each Segment containing all the spikes not assigned to any Unit in that Segment. Note 2: The first Segment in each Block is always Comments, which stores all comments as Event objects. The Event times are the timestamps of the comments as the number of days since dec 30th 1899, while the timestamp attribute has the same value in python datetime format Note 3: The parameters from the BrainWare table for each condition are stored in the Segment annotations. If there are multiple repetitions of a condition, each repetition is stored as a separate Segment. Note 4: There is always only one RecordingChannelGroup. BrainWare stores the equivalent of RecordingChannelGroups in separate files. Usage: >>> from neo.io.brainwaresrcio import BrainwareSrcIO >>> srcfile = BrainwareSrcIO(filename='multi_500ms_mulitrep_ch1.src') >>> blk1 = srcfile.read() >>> blk2 = srcfile.read_block() >>> blks = srcfile.read_all_blocks() >>> print blk1.segments >>> print blk1.segments[0].spiketrains >>> print blk1.units >>> print blk1.units[0].name >>> print blk2 >>> print blk2[0].segments >>> print blks >>> print blks[0].segments ''' is_readable = True # This class can only read data is_writable = False # write is not supported # This class is able to directly or indirectly handle the following objects # You can notice that this greatly simplifies the full Neo object hierarchy supported_objects = [Block, RecordingChannel, RecordingChannelGroup, Segment, SpikeTrain, Event, Unit] readable_objects = [Block] writeable_objects = [] has_header = False is_streameable = False # This is for GUI stuff: a definition for parameters when reading. # This dict should be keyed by object (`Block`). Each entry is a list # of tuple. The first entry in each tuple is the parameter name. The # second entry is a dict with keys 'value' (for default value), # and 'label' (for a descriptive name). # Note that if the highest-level object requires parameters, # common_io_test will be skipped. read_params = {Block: [], Event: [('sender', {'value': '', 'type': str, 'label': 'The ones who sent the comments', } ), ('timestamp', {'value': datetime(1, 1, 1), 'type': datetime, 'label': 'The time of the comment', } ) ], RecordingChannel: [], RecordingChannelGroup: [], Segment: [('feature_type', {'value': -1, 'type': int}), ('go_by_closest_unit_center', {'value': False, 'type': bool}), ('include_unit_bounds', {'value': False, 'type': bool}) ], SpikeTrain: [('dama_index', {'value': -1, 'type': int, 'label': 'index of analogsignalarray in ' 'corresponding .dam file, if any'}), ('respwin', {'value': np.asarray([], dtype=np.int32), 'type': np.ndarray, 'label': 'response and spon period ' 'boundaries'}), ('trig2', {'value': pq.Quantity([], dtype=np.uint8, units=pq.ms), 'type': pq.quantity.Quantity, 'label': 'point of return to noise'}), ('side', {'value': '', 'type': str, 'label': 'side of the brain'}), ('timestamp', {'value': datetime(1, 1, 1), 'type': datetime, 'label': 'Start time of the SpikeTrain'}) ], Unit: [('boundaries', {'value': [], 'type': list, 'label': 'unit boundaries'}), ('elliptic', {'value': [], 'type': list, 'label': 'elliptic feature'}), ('timestamp', {'value': [], 'type': list, 'label': 'Start time of each unit list'}), ('max_valid', {'value': [], 'type': list}) ] } # does not support write so no GUI stuff write_params = None name = 'Brainware SRC File' extensions = ['src'] mode = 'file' def __init__(self, filename=None): """ Arguments: filename: the filename """ BaseIO.__init__(self) # this stores the filename of the current object, exactly as it is # provided when the instance is initialized. self.__filename = filename # this store the filename without the path self.__file_origin = filename # This stores the file object for the current file self.__fsrc = None # This stores the current Block self.__blk = None # This stores the current RecordingChannelGroup for easy access # It is equivalent to self.__blk.recordingchannelgroups[0] self.__rcg = None # This stores the current Segment for easy access # It is equivalent to self.__blk.segments[-1] self.__seg = None # this stores a dictionary of the Block's Units by name, # making it easier and faster to retrieve Units by name later # UnassignedSpikes and Units accessed by index are not stored here self.__unitdict = {} # this stores the current Unit self.__unit = None # if the file has a list with negative length, the rest of the file's # list lengths are unreliable, so we need to store this value for the # whole file self.__damaged = False # this stores whether the current file is lazy loaded self.__lazy = False # this stores whether the current file is cascading # this is false by default so if we use read_block on its own it works self.__cascade = False @property def isopen(self): ''' This property tells whether the SRC file associated with the IO object is open. ''' return self.__fsrc is not None def opensrc(self): ''' Open the file if it isn't already open. ''' # if the file isn't already open, open it and clear the Blocks if not self.__fsrc or self.__fsrc.closed: self.__fsrc = open(self.__filename, 'rb') # figure out the filename of the current file self.__file_origin = path.basename(self.__filename) def close(self): ''' Close the currently-open file and reset the current reading point. ''' if self.isopen and not self.__fsrc.closed: self.__fsrc.close() # we also need to reset all per-file attributes self.__damaged = False self.__fsrc = None self.__seg = None self.__cascade = False self.__file_origin = None self.__lazy = False def read(self, lazy=False, cascade=True, **kargs): ''' Reads the first Block from the Spike ReCording file "filename" generated with BrainWare. If you wish to read more than one Block, please use read_all_blocks. ''' return self.read_block(lazy=lazy, cascade=cascade, **kargs) def read_block(self, lazy=False, cascade=True, **kargs): ''' Reads the first Block from the Spike ReCording file "filename" generated with BrainWare. If you wish to read more than one Block, please use read_all_blocks. ''' # there are no keyargs implemented to so far. If someone tries to pass # them they are expecting them to do something or making a mistake, # neither of which should pass silently if kargs: raise NotImplementedError('This method does not have any ' 'argument implemented yet') blockobj = self.read_next_block(cascade=cascade, lazy=lazy, warnlast=False) self.close() return blockobj def read_next_block(self, cascade=True, lazy=False, warnlast=True, **kargs): ''' Reads a single Block from the Spike ReCording file "filename" generated with BrainWare. Each call of read will return the next Block until all Blocks are loaded. After the last Block, the file will be automatically closed and the progress reset. Call the close method manually to reset back to the first Block. If "warnlast" is set to True (default), print a warning after reading the last Block. ''' # there are no keyargs implemented to so far. If someone tries to pass # them they are expecting them to do something or making a mistake, # neither of which should pass silently if kargs: raise NotImplementedError('This method does not have any ' 'argument implemented yet') self.__lazy = lazy self.opensrc() # create the Block and the contents all Blocks of from IO share self.__blk = Block(file_origin=self.__file_origin) if not cascade: return self.__blk self.__rcg = RecordingChannelGroup(file_origin=self.__file_origin) self.__seg = Segment(name='Comments', file_origin=self.__file_origin) self.__unit = Unit(name='UnassignedSpikes', file_origin=self.__file_origin, elliptic=[], boundaries=[], timestamp=[], max_valid=[]) self.__blk.recordingchannelgroups.append(self.__rcg) self.__rcg.units.append(self.__unit) self.__blk.segments.append(self.__seg) # this actually reads the contents of the Block result = [] while hasattr(result, '__iter__'): try: result = self._read_by_id() except: self.close() raise # set the recorging channel group names and indices chans = self.__rcg.recordingchannels chan_inds = np.arange(len(chans), dtype='int') chan_names = np.array(['Chan'+str(i) for i in chan_inds], dtype='string_') self.__rcg.channel_indexes = chan_inds self.__rcg.channel_names = chan_names # since we read at a Block level we always do this create_many_to_one_relationship(self.__blk) # put the Block in a local object so it can be gargabe collected blockobj = self.__blk # reset the per-Block attributes self.__blk = None self.__rcg = None self.__unitdict = {} # result is None iff the end of the file is reached, so we can # close the file # this notification is not helpful if using the read method with # cascade==True, since the user will know it is done when the method # returns a value if result is None: if warnlast: print('Last Block read. Closing file') self.close() return blockobj def read_all_blocks(self, cascade=True, lazy=False, **kargs): ''' Reads all Blocks from the Spike ReCording file "filename" generated with BrainWare. The progress in the file is reset and the file closed then opened again prior to reading. The file is automatically closed after reading completes. ''' # there are no keyargs implemented to so far. If someone tries to pass # them they are expecting them to do something or making a mistake, # neither of which should pass silently if kargs: raise NotImplementedError('This method does not have any ' 'argument implemented yet') self.__lazy = lazy self.__cascade = True self.close() self.opensrc() # Read each Block. # After the last Block self.isopen is set to False, so this make a # good way to determine when to stop blocks = [] while self.isopen: try: blocks.append(self.read_next_block(cascade=cascade, lazy=lazy, warnlast=False)) except: self.close() raise return blocks @staticmethod def convert_timestamp(timestamp, start_date=datetime(1899, 12, 30)): ''' convert_timestamp(timestamp, start_date) - convert a timestamp in brainware src file units to a python datetime object. start_date defaults to 1899.12.30 (ISO format), which is the start date used by all BrainWare SRC data Blocks so far. If manually specified it should be a datetime object or any other object that can be added to a timedelta object. ''' return convert_brainwaresrc_timestamp(timestamp, start_date=start_date) # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # All methods from here on are private. They are not intended to be used # on their own, although methods that could theoretically be called on # their own are marked as such. All private methods could be renamed, # combined, or split at any time. All private methods prefixed by # "__read" or "__skip" will alter the current place in the file. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- def _read_by_id(self): ''' Reader for generic data BrainWare SRC files are broken up into data sequences that are identified by an ID code. This method determines the ID code and calls the method to read the data sequence with that ID code. See the __ID_DICT attribute for a dictionary of code/method pairs. IMPORTANT!!! This is the only private method that can be called directly. The rest of the private methods can only safely be called by this method or by other private methods, since they depend on the current position in the file. ''' try: # uint16 -- the ID code of the next sequence seqid = np.fromfile(self.__fsrc, dtype=np.uint16, count=1)[0] except IndexError: # return a None if at EOF. Other methods use None to recognize # an EOF return None # using the seqid, get the reader function from the reader dict readfunc = self.__ID_DICT.get(seqid) if readfunc is None: if seqid <= 0: # return if end-of-sequence ID code. This has to be 0. # just calling "return" will return a None which is used as an # EOF indicator return 0 else: # return a warning if the key is invalid # (this is consistent with the official behavior, # even the official reference files have invalid keys # when using the official reference reader matlab # scripts warn('unknown ID: %s' % seqid) return [] try: # run the function to get the data return readfunc(self) except (EOFError, UnicodeDecodeError) as err: # return a warning if the EOF is reached in the middle of a method warn(str(err)) return None # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # These are helper methods. They don't read from the file, so it # won't harm the reading process to call them, but they are only relevant # when used in other private methods. # # These are tuned to the particular needs of this IO class, they are # unlikely to work properly if used with another file format. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- def _assign_sequence(self, data_obj): ''' _assign_sequence(data_obj) - Try to guess where an unknown sequence should go based on its class. Warning are issued if this method is used since manual reorganization may be needed. ''' if isinstance(data_obj, Unit): warn('Unknown Unit found, adding to Units list') self.__rcg.units.append(data_obj) if data_obj.name: self.__unitdict[data_obj.name] = data_obj elif isinstance(data_obj, Segment): warn('Unknown Segment found, adding to Segments list') self.__blk.segments.append(data_obj) elif isinstance(data_obj, Event): warn('Unknown Event found, adding to comment Events list') self.__blk.segments[0].events.append(data_obj) elif isinstance(data_obj, SpikeTrain): warn('Unknown SpikeTrain found, ' + 'adding to the UnassignedSpikes Unit') self.__rcg.units[0].spiketrains.append(data_obj) elif hasattr(data_obj, '__iter__') and not isinstance(data_obj, str): for sub_obj in data_obj: self._assign_sequence(sub_obj) else: warn('Unrecognized sequence of type %s found, skipping', type(data_obj)) _default_datetime = datetime(1, 1, 1) _default_spiketrain = SpikeTrain(times=pq.Quantity([], units=pq.ms, dtype=np.float32), t_start=pq.Quantity(0, units=pq.ms, dtype=np.float32), t_stop=pq.Quantity(1, units=pq.ms, dtype=np.float32), waveforms=pq.Quantity([[[]]], dtype=np.int8, units=pq.mV), dtype=np.float32, copy=False, timestamp=_default_datetime, respwin=np.array([], dtype=np.int32), dama_index=-1, trig2=pq.Quantity([], units=pq.ms, dtype=np.uint8), side='') def _combine_spiketrains(self, spiketrains): ''' _combine_spiketrains(spiketrains) - combine a list of SpikeTrains with single spikes into one long SpikeTrain ''' if not spiketrains: train = self._default_spiketrain.copy() train.file_origin = self.__file_origin if self.__lazy: train.lazy_shape = (0,) return train if hasattr(spiketrains[0], 'waveforms') and len(spiketrains) == 1: train = spiketrains[0] if self.__lazy and not hasattr(train, 'lazy_shape'): train.lazy_shape = train.shape train = train[:0] return train if hasattr(spiketrains[0], 't_stop'): # workaround for bug in some broken files istrain = [hasattr(utrain, 'waveforms') for utrain in spiketrains] if not all(istrain): goodtrains = [itrain for i, itrain in enumerate(spiketrains) if istrain[i]] badtrains = [itrain for i, itrain in enumerate(spiketrains) if not istrain[i]] spiketrains = (goodtrains + [self._combine_spiketrains(badtrains)]) spiketrains = [itrain for itrain in spiketrains if itrain.size > 0] if not spiketrains: train = self._default_spiketrain.copy() train.file_origin = self.__file_origin if self.__lazy: train.lazy_shape = (0,) return train # get the times of the spiketrains and combine them waveforms = [itrain.waveforms for itrain in spiketrains] rawtrains = np.array(np.hstack(spiketrains)) times = pq.Quantity(rawtrains, units=pq.ms, copy=False) lens1 = np.array([wave.shape[1] for wave in waveforms]) lens2 = np.array([wave.shape[2] for wave in waveforms]) if lens1.max() != lens1.min() or lens2.max() != lens2.min(): lens1 = lens1.max() - lens1 lens2 = lens2.max() - lens2 waveforms = [np.pad(waveform, ((0, 0), (0, len1), (0, len2)), 'constant') for waveform, len1, len2 in zip(waveforms, lens1, lens2)] waveforms = np.vstack(waveforms) # extract the trig2 annotation trig2 = np.array(np.hstack([itrain.annotations['trig2'] for itrain in spiketrains])) trig2 = pq.Quantity(trig2, units=pq.ms) elif hasattr(spiketrains[0], 'units'): return self._combine_spiketrains([spiketrains]) else: times, waveforms, trig2 = zip(*spiketrains) times = np.hstack(times) # get the times of the SpikeTrains and combine them times = pq.Quantity(times, units=pq.ms, copy=False) # get the waveforms of the SpikeTrains and combine them # these should be a 3D array with the first axis being the spike, # the second axis being the recording channel (there is only one), # and the third axis being the actual waveform waveforms = np.vstack(waveforms)[np.newaxis].swapaxes(0, 1) # extract the trig2 annotation trig2 = pq.Quantity(np.hstack(trig2), units=pq.ms, copy=False) if not times.size: train = self._default_spiketrain.copy() train.file_origin = self.__file_origin if self.__lazy: train.lazy_shape = (0,) return train # get the maximum time t_stop = times.max() * 2 t_start = pq.Quantity(0, units=pq.ms, dtype=times.dtype) if self.__lazy: timesshape = times.shape times = pq.Quantity([], units=pq.ms, copy=False) waveforms = pq.Quantity([[[]]], units=pq.mV) else: waveforms = pq.Quantity(np.asarray(waveforms), units=pq.mV) train = SpikeTrain(times=times, copy=False, t_start=t_start, t_stop=t_stop, file_origin=self.__file_origin, waveforms=waveforms, timestamp=self._default_datetime, respwin=np.array([], dtype=np.int32), dama_index=-1, trig2=trig2, side='') if self.__lazy: train.lazy_shape = timesshape return train # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # IMPORTANT!!! # These are private methods implementing the internal reading mechanism. # Due to the way BrainWare SRC files are structured, they CANNOT be used # on their own. Calling these manually will almost certainly alter your # position in the file in an unrecoverable manner, whether they throw # an exception or not. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- def __read_annotations(self): ''' Read the stimulus grid properties. ------------------------------------------------------------------- Returns a dictionary containing the parameter names as keys and the parameter values as values. The returned object must be added to the Block. ID: 29109 ''' # int16 -- number of stimulus parameters numelements = np.fromfile(self.__fsrc, dtype=np.int16, count=1)[0] if not numelements: return {} # [data sequence] * numelements -- parameter names names = [] for i in range(numelements): # {skip} = byte (char) -- skip one byte self.__fsrc.seek(1, 1) # uint8 -- length of next string numchars = np.fromfile(self.__fsrc, dtype=np.uint8, count=1)[0] # if there is no name, make one up if not numchars: name = 'param%s' % i else: # char * numchars -- parameter name string name = str(np.fromfile(self.__fsrc, dtype='S%s' % numchars, count=1)[0].decode('UTF-8')) # if the name is already in there, add a unique number to it # so it isn't overwritten if name in names: name = name + str(i) names.append(name) # float32 * numelements -- an array of parameter values values = np.fromfile(self.__fsrc, dtype=np.float32, count=numelements) # combine the names and values into a dict # the dict will be added to the annotations annotations = dict(zip(names, values)) return annotations def __read_annotations_old(self): ''' Read the stimulus grid properties. Returns a dictionary containing the parameter names as keys and the parameter values as values. ------------------------------------------------ The returned objects must be added to the Block. This reads an old version of the format that does not store paramater names, so placeholder names are created instead. ID: 29099 ''' # int16 * 14 -- an array of parameter values values = np.fromfile(self.__fsrc, dtype=np.int16, count=14) # create dummy names and combine them with the values in a dict # the dict will be added to the annotations params = ['param%s' % i for i in range(len(values))] annotations = dict(zip(params, values)) return annotations def __read_comment(self): ''' Read a single comment. The comment is stored as an Event in Segment 0, which is specifically for comments. ---------------------- Returns an empty list. The returned object is already added to the Block. No ID number: always called from another method ''' # float64 -- timestamp (number of days since dec 30th 1899) time = np.fromfile(self.__fsrc, dtype=np.double, count=1)[0] # convert the timestamp to a python datetime object # then convert that to a quantity containing a unix timestamp timestamp = self.convert_timestamp(time) time = pq.Quantity(time, units=pq.d) # int16 -- length of next string numchars1 = np.fromfile(self.__fsrc, dtype=np.int16, count=1)[0] # char * numchars -- the one who sent the comment sender = str(np.fromfile(self.__fsrc, dtype='S%s' % numchars1, count=1)[0].decode('UTF-8')) # int16 -- length of next string numchars2 = np.fromfile(self.__fsrc, dtype=np.int16, count=1)[0] # char * numchars -- comment text text = str(np.fromfile(self.__fsrc, dtype='S%s' % numchars2, count=1)[0].decode('UTF-8')) comment = Event(time=time, label=text, sender=sender, name='Comment', description='container for a comment', file_origin=self.__file_origin, timestamp=timestamp) self.__blk.segments[0].events.append(comment) return [] def __read_list(self): ''' Read a list of arbitrary data sequences It only says how many data sequences should be read. These sequences are then read by their ID number. Note that lists can be nested. If there are too many sequences (for instance if there are a large number of spikes in a Segment) then a negative number will be returned for the number of data sequences to read. In this case the method tries to guess. This also means that all future list data sequences have unreliable lengths as well. ------------------------------------------- Returns a list of objects. Whether these objects need to be added to the Block depends on the object in question. There are several data sequences that have identical formats but are used in different situations. That means this data sequences has multiple ID numbers. ID: 29082 ID: 29083 ID: 29091 ID: 29093 ''' # int16 -- number of sequences to read numelements = np.fromfile(self.__fsrc, dtype=np.int16, count=1)[0] # {skip} = bytes * 4 (int16 * 2) -- skip four bytes self.__fsrc.seek(4, 1) if numelements == 0: return [] if not self.__damaged and numelements < 0: self.__damaged = True warn('Negative sequence count, file may be damaged') if not self.__damaged: # read the sequences into a list seq_list = [self._read_by_id() for _ in range(numelements)] else: # read until we get some indication we should stop seq_list = [] # uint16 -- the ID of the next sequence seqidinit = np.fromfile(self.__fsrc, dtype=np.uint16, count=1)[0] # {rewind} = byte * 2 (int16) -- move back 2 bytes, i.e. go back to # before the beginning of the seqid self.__fsrc.seek(-2, 1) while 1: # uint16 -- the ID of the next sequence seqid = np.fromfile(self.__fsrc, dtype=np.uint16, count=1)[0] # {rewind} = byte * 2 (int16) -- move back 2 bytes, i.e. go # back to before the beginning of the seqid self.__fsrc.seek(-2, 1) # if we come across a new sequence, we are at the end of the # list so we should stop if seqidinit != seqid: break # otherwise read the next sequence seq_list.append(self._read_by_id()) return seq_list def __read_segment(self): ''' Read an individual Segment. A Segment contains a dictionary of parameters, the length of the recording, a list of Units with their Spikes, and a list of Spikes not assigned to any Unit. The unassigned spikes are always stored in Unit 0, which is exclusively for storing these spikes. ------------------------------------------------- Returns the Segment object created by the method. The returned object is already added to the Block. ID: 29106 ''' # (data_obj) -- the stimulus parameters for this segment annotations = self._read_by_id() annotations['feature_type'] = -1 annotations['go_by_closest_unit_center'] = False annotations['include_unit_bounds'] = False # (data_obj) -- SpikeTrain list of unassigned spikes # these go in the first Unit since it is for unassigned spikes unassigned_spikes = self._read_by_id() self.__rcg.units[0].spiketrains.extend(unassigned_spikes) # read a list of units and grab the second return value, which is the # SpikeTrains from this Segment (if we use the Unit we will get all the # SpikeTrains from that Unit, resuling in duplicates if we are past # the first Segment trains = self._read_by_id() if not trains: if unassigned_spikes: # if there are no assigned spikes, # just use the unassigned spikes trains = zip(unassigned_spikes) else: # if there are no spiketrains at all, # create an empty spike train train = self._default_spiketrain.copy() train.file_origin = self.__file_origin if self.__lazy: train.lazy_shape = (0,) trains = [[train]] elif hasattr(trains[0], 'dtype'): #workaround for some broken files trains = [unassigned_spikes + [self._combine_spiketrains([trains])]] else: # get the second element from each returned value, # which is the actual SpikeTrains trains = [unassigned_spikes] + [train[1] for train in trains] # re-organize by sweeps trains = zip(*trains) # int32 -- SpikeTrain length in ms spiketrainlen = pq.Quantity(np.fromfile(self.__fsrc, dtype=np.int32, count=1)[0], units=pq.ms, copy=False) segments = [] for train in trains: # create the Segment and add everything to it segment = Segment(file_origin=self.__file_origin, **annotations) segment.spiketrains = train self.__blk.segments.append(segment) segments.append(segment) for itrain in train: # use the SpikeTrain length to figure out the stop time # t_start is always 0 so we can ignore it itrain.t_stop = spiketrainlen return segments def __read_segment_list(self): ''' Read a list of Segments with comments. Since comments can occur at any point, whether a recording is happening or not, it is impossible to reliably assign them to a specific Segment. For this reason they are always assigned to Segment 0, which is exclusively used to store comments. -------------------------------------------------------- Returns a list of the Segments created with this method. The returned objects are already added to the Block. ID: 29112 ''' # uint8 -- number of electrode channels in the Segment numchannels = np.fromfile(self.__fsrc, dtype=np.uint8, count=1)[0] # [list of sequences] -- individual Segments segments = self.__read_list() while not hasattr(segments[0], 'spiketrains'): segments = sum(segments, []) # char -- "side of brain" info side = str(np.fromfile(self.__fsrc, dtype='S1', count=1)[0].decode('UTF-8')) # int16 -- number of comments numelements = np.fromfile(self.__fsrc, dtype=np.int16, count=1)[0] # comment_obj * numelements -- comments about the Segments # we don't know which Segment specifically, though for _ in range(numelements): self.__read_comment() # create an empty RecordingChannel for each of the numchannels for i in range(numchannels): chan = RecordingChannel(file_origin=self.__file_origin, index=int(i), name='Chan'+str(int(i))) self.__rcg.recordingchannels.append(chan) # store what side of the head we are dealing with for segment in segments: for spiketrain in segment.spiketrains: spiketrain.annotations['side'] = side return segments def __read_segment_list_v8(self): ''' Read a list of Segments with comments. This is version 8 of the data sequence. This is the same as __read_segment_list_var, but can also contain one or more arbitrary sequences. The class makes an attempt to assign the sequences when possible, and warns the user when this happens (see the _assign_sequence method) -------------------------------------------------------- Returns a list of the Segments created with this method. The returned objects are already added to the Block. ID: 29117 ''' # segment_collection_var -- this is based off a segment_collection_var segments = self.__read_segment_list_var() # uint16 -- the ID of the next sequence seqid = np.fromfile(self.__fsrc, dtype=np.uint16, count=1)[0] # {rewind} = byte * 2 (int16) -- move back 2 bytes, i.e. go back to # before the beginning of the seqid self.__fsrc.seek(-2, 1) if seqid in self.__ID_DICT: # if it is a valid seqid, read it and try to figure out where # to put it self._assign_sequence(self._read_by_id()) else: # otherwise it is a Unit list self.__read_unit_list() # {skip} = byte * 2 (int16) -- skip 2 bytes self.__fsrc.seek(2, 1) return segments def __read_segment_list_v9(self): ''' Read a list of Segments with comments. This is version 9 of the data sequence. This is the same as __read_segment_list_v8, but contains some additional annotations. These annotations are added to the Segment. -------------------------------------------------------- Returns a list of the Segments created with this method. The returned objects are already added to the Block. ID: 29120 ''' # segment_collection_v8 -- this is based off a segment_collection_v8 segments = self.__read_segment_list_v8() # uint8 feature_type = np.fromfile(self.__fsrc, dtype=np.uint8, count=1)[0] # uint8 go_by_closest_unit_center = np.fromfile(self.__fsrc, dtype=np.bool8, count=1)[0] # uint8 include_unit_bounds = np.fromfile(self.__fsrc, dtype=np.bool8, count=1)[0] # create a dictionary of the annotations annotations = {'feature_type': feature_type, 'go_by_closest_unit_center': go_by_closest_unit_center, 'include_unit_bounds': include_unit_bounds} # add the annotations to each Segment for segment in segments: segment.annotations.update(annotations) return segments def __read_segment_list_var(self): ''' Read a list of Segments with comments. This is the same as __read_segment_list, but contains information regarding the sampling period. This information is added to the SpikeTrains in the Segments. -------------------------------------------------------- Returns a list of the Segments created with this method. The returned objects are already added to the Block. ID: 29114 ''' # float32 -- DA conversion clock period in microsec sampling_period = pq.Quantity(np.fromfile(self.__fsrc, dtype=np.float32, count=1), units=pq.us, copy=False)[0] # segment_collection -- this is based off a segment_collection segments = self.__read_segment_list() # add the sampling period to each SpikeTrain for segment in segments: for spiketrain in segment.spiketrains: spiketrain.sampling_period = sampling_period return segments def __read_spike_fixed(self, numpts=40): ''' Read a spike with a fixed waveform length (40 time bins) ------------------------------------------- Returns the time, waveform and trig2 value. The returned objects must be converted to a SpikeTrain then added to the Block. ID: 29079 ''' # float32 -- spike time stamp in ms since start of SpikeTrain time = np.fromfile(self.__fsrc, dtype=np.float32, count=1) # int8 * 40 -- spike shape -- use numpts for spike_var waveform = np.fromfile(self.__fsrc, dtype=np.int8, count=numpts) # uint8 -- point of return to noise trig2 = np.fromfile(self.__fsrc, dtype=np.uint8, count=1) return time, waveform, trig2 def __read_spike_fixed_old(self): ''' Read a spike with a fixed waveform length (40 time bins) This is an old version of the format. The time is stored as ints representing 1/25 ms time steps. It has no trigger information. ------------------------------------------- Returns the time, waveform and trig2 value. The returned objects must be converted to a SpikeTrain then added to the Block. ID: 29081 ''' # int32 -- spike time stamp in ms since start of SpikeTrain time = np.fromfile(self.__fsrc, dtype=np.int32, count=1) / 25. # int8 * 40 -- spike shape # This needs to be a 2D array, one for each channel. BrainWare # only ever has a single channel per file. waveform = np.fromfile(self.__fsrc, dtype=np.int8, count=40) # create a dummy trig2 value trig2 = np.array([-1], dtype=np.uint8) return time, waveform, trig2 def __read_spike_var(self): ''' Read a spike with a variable waveform length ------------------------------------------- Returns the time, waveform and trig2 value. The returned objects must be converted to a SpikeTrain then added to the Block. ID: 29115 ''' # uint8 -- number of points in spike shape numpts = np.fromfile(self.__fsrc, dtype=np.uint8, count=1)[0] # spike_fixed is the same as spike_var if you don't read the numpts # byte and set numpts = 40 return self.__read_spike_fixed(numpts) def __read_spiketrain_indexed(self): ''' Read a SpikeTrain This is the same as __read_spiketrain_timestamped except it also contains the index of the Segment in the dam file. The index is stored as an annotation in the SpikeTrain. ------------------------------------------------- Returns a SpikeTrain object with multiple spikes. The returned object must be added to the Block. ID: 29121 ''' #int32 -- index of the analogsignalarray in corresponding .dam file dama_index = np.fromfile(self.__fsrc, dtype=np.int32, count=1)[0] # spiketrain_timestamped -- this is based off a spiketrain_timestamped spiketrain = self.__read_spiketrain_timestamped() # add the property to the dict spiketrain.annotations['dama_index'] = dama_index return spiketrain def __read_spiketrain_timestamped(self): ''' Read a SpikeTrain This SpikeTrain contains a time stamp for when it was recorded The timestamp is stored as an annotation in the SpikeTrain. ------------------------------------------------- Returns a SpikeTrain object with multiple spikes. The returned object must be added to the Block. ID: 29110 ''' # float64 -- timeStamp (number of days since dec 30th 1899) timestamp = np.fromfile(self.__fsrc, dtype=np.double, count=1)[0] # convert to datetime object timestamp = self.convert_timestamp(timestamp) # seq_list -- spike list # combine the spikes into a single SpikeTrain spiketrain = self._combine_spiketrains(self.__read_list()) # add the timestamp spiketrain.annotations['timestamp'] = timestamp return spiketrain def __read_unit(self): ''' Read all SpikeTrains from a single Segment and Unit This is the same as __read_unit_unsorted except it also contains information on the spike sorting boundaries. ------------------------------------------------------------------ Returns a single Unit and a list of SpikeTrains from that Unit and current Segment, in that order. The SpikeTrains must be returned since it is not possible to determine from the Unit which SpikeTrains are from the current Segment. The returned objects are already added to the Block. The SpikeTrains must be added to the current Segment. ID: 29116 ''' # same as unsorted Unit unit, trains = self.__read_unit_unsorted() # float32 * 18 -- Unit boundaries (IEEE 32-bit floats) unit.annotations['boundaries'] = [np.fromfile(self.__fsrc, dtype=np.float32, count=18)] # uint8 * 9 -- boolean values indicating elliptic feature boundary # dimensions unit.annotations['elliptic'] = [np.fromfile(self.__fsrc, dtype=np.uint8, count=9)] return unit, trains def __read_unit_list(self): ''' A list of a list of Units ----------------------------------------------- Returns a list of Units modified in the method. The returned objects are already added to the Block. No ID number: only called by other methods ''' # this is used to figure out which Units to return maxunit = 1 # int16 -- number of time slices numelements = np.fromfile(self.__fsrc, dtype=np.int16, count=1)[0] # {sequence} * numelements1 -- the number of lists of Units to read self.__rcg.annotations['max_valid'] = [] for _ in range(numelements): # {skip} = byte * 2 (int16) -- skip 2 bytes self.__fsrc.seek(2, 1) # double max_valid = np.fromfile(self.__fsrc, dtype=np.double, count=1)[0] # int16 - the number of Units to read numunits = np.fromfile(self.__fsrc, dtype=np.int16, count=1)[0] # update tha maximum Unit so far maxunit = max(maxunit, numunits + 1) # if there aren't enough Units, create them # remember we need to skip the UnassignedSpikes Unit if numunits > len(self.__rcg.units) + 1: for ind1 in range(len(self.__rcg.units), numunits + 1): unit = Unit(name='unit%s' % ind1, file_origin=self.__file_origin, elliptic=[], boundaries=[], timestamp=[], max_valid=[]) self.__rcg.units.append(unit) # {Block} * numelements -- Units for ind1 in range(numunits): # get the Unit with the given index # remember we need to skip the UnassignedSpikes Unit unit = self.__rcg.units[ind1 + 1] # {skip} = byte * 2 (int16) -- skip 2 bytes self.__fsrc.seek(2, 1) # int16 -- a multiplier for the elliptic and boundaries # properties numelements3 = np.fromfile(self.__fsrc, dtype=np.int16, count=1)[0] # uint8 * 10 * numelements3 -- boolean values indicating # elliptic feature boundary dimensions elliptic = np.fromfile(self.__fsrc, dtype=np.uint8, count=10 * numelements3) # float32 * 20 * numelements3 -- feature boundaries boundaries = np.fromfile(self.__fsrc, dtype=np.float32, count=20 * numelements3) unit.annotations['elliptic'].append(elliptic) unit.annotations['boundaries'].append(boundaries) unit.annotations['max_valid'].append(max_valid) return self.__rcg.units[1:maxunit] def __read_unit_list_timestamped(self): ''' A list of a list of Units. This is the same as __read_unit_list, except that it also has a timestamp. This is added ad an annotation to all Units. ----------------------------------------------- Returns a list of Units modified in the method. The returned objects are already added to the Block. ID: 29119 ''' # double -- time zero (number of days since dec 30th 1899) timestamp = np.fromfile(self.__fsrc, dtype=np.double, count=1)[0] # convert to to days since UNIX epoc time: timestamp = self.convert_timestamp(timestamp) # sorter -- this is based off a sorter units = self.__read_unit_list() for unit in units: unit.annotations['timestamp'].append(timestamp) return units def __read_unit_old(self): ''' Read all SpikeTrains from a single Segment and Unit This is the same as __read_unit_unsorted except it also contains information on the spike sorting boundaries. This is an old version of the format that used 48-bit floating-point numbers for the boundaries. These cannot easily be read and so are skipped. ------------------------------------------------------------------ Returns a single Unit and a list of SpikeTrains from that Unit and current Segment, in that order. The SpikeTrains must be returned since it is not possible to determine from the Unit which SpikeTrains are from the current Segment. The returned objects are already added to the Block. The SpikeTrains must be added to the current Segment. ID: 29107 ''' # same as Unit unit, trains = self.__read_unit_unsorted() # bytes * 108 (float48 * 18) -- Unit boundaries (48-bit floating # point numbers are not supported so we skip them) self.__fsrc.seek(108, 1) # uint8 * 9 -- boolean values indicating elliptic feature boundary # dimensions unit.annotations['elliptic'] = np.fromfile(self.__fsrc, dtype=np.uint8, count=9).tolist() return unit, trains def __read_unit_unsorted(self): ''' Read all SpikeTrains from a single Segment and Unit This does not contain Unit boundaries. ------------------------------------------------------------------ Returns a single Unit and a list of SpikeTrains from that Unit and current Segment, in that order. The SpikeTrains must be returned since it is not possible to determine from the Unit which SpikeTrains are from the current Segment. The returned objects are already added to the Block. The SpikeTrains must be added to the current Segment. ID: 29084 ''' # {skip} = bytes * 2 (uint16) -- skip two bytes self.__fsrc.seek(2, 1) # uint16 -- number of characters in next string numchars = np.fromfile(self.__fsrc, dtype=np.uint16, count=1)[0] # char * numchars -- ID string of Unit name = str(np.fromfile(self.__fsrc, dtype='S%s' % numchars, count=1)[0].decode('UTF-8')) # int32 -- SpikeTrain length in ms t_stop = pq.Quantity(np.fromfile(self.__fsrc, dtype=np.int32, count=1)[0].astype('float32'), units=pq.ms, copy=False) # int32 * 4 -- response and spon period boundaries respwin = np.fromfile(self.__fsrc, dtype=np.int32, count=4) # (data_obj) -- list of SpikeTrains spikeslists = self._read_by_id() # use the Unit if it already exists, otherwise create it if name in self.__unitdict: unit = self.__unitdict[name] else: unit = Unit(name=name, file_origin=self.__file_origin, elliptic=[], boundaries=[], timestamp=[], max_valid=[]) self.__rcg.units.append(unit) self.__unitdict[name] = unit # convert the individual spikes to SpikeTrains and add them to the Unit trains = [self._combine_spiketrains(spikes) for spikes in spikeslists] unit.spiketrains.extend(trains) for train in trains: train.t_stop = t_stop train.annotations['respwin'] = respwin return unit, trains def __skip_information(self): ''' Read an information sequence. This is data sequence is skipped both here and in the Matlab reference implementation. ---------------------- Returns an empty list Nothing is created so nothing is added to the Block. ID: 29113 ''' # {skip} char * 34 -- display information self.__fsrc.seek(34, 1) return [] def __skip_information_old(self): ''' Read an information sequence This is data sequence is skipped both here and in the Matlab reference implementation This is an old version of the format ---------------------- Returns an empty list. Nothing is created so nothing is added to the Block. ID: 29100 ''' # {skip} char * 4 -- display information self.__fsrc.seek(4, 1) return [] # This dictionary maps the numeric data sequence ID codes to the data # sequence reading functions. # # Since functions are first-class objects in Python, the functions returned # from this dictionary are directly callable. # # If new data sequence ID codes are added in the future please add the code # here in numeric order and the method above in alphabetical order # # The naming of any private method may change at any time __ID_DICT = {29079: __read_spike_fixed, 29081: __read_spike_fixed_old, 29082: __read_list, 29083: __read_list, 29084: __read_unit_unsorted, 29091: __read_list, 29093: __read_list, 29099: __read_annotations_old, 29100: __skip_information_old, 29106: __read_segment, 29107: __read_unit_old, 29109: __read_annotations, 29110: __read_spiketrain_timestamped, 29112: __read_segment_list, 29113: __skip_information, 29114: __read_segment_list_var, 29115: __read_spike_var, 29116: __read_unit, 29117: __read_segment_list_v8, 29119: __read_unit_list_timestamped, 29120: __read_segment_list_v9, 29121: __read_spiketrain_indexed } def convert_brainwaresrc_timestamp(timestamp, start_date=datetime(1899, 12, 30)): ''' convert_brainwaresrc_timestamp(timestamp, start_date) - convert a timestamp in brainware units to a python datetime object. start_date defaults to 1899.12.30 (ISO format), which is the start date used by all BrainWare SRC data blocks so far. If manually specified it should be a datetime object or any other object that can be added to a timedelta object. ''' # datetime + timedelta = datetime again. try: timestamp = start_date + timedelta(days=timestamp) except OverflowError as err: timestamp = start_date warn(str(err)) return timestamp neo-0.3.3/neo/io/elanio.py0000644000175000017500000002725712273723542016377 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Class for reading/writing data from Elan. Elan is software for studying time-frequency maps of EEG data. Elan is developed in Lyon, France, at INSERM U821 An Elan dataset is separated into 3 files : - .eeg raw data file - .eeg.ent hearder file - .eeg.pos event file Depend on: Supported : Read and Write Author: sgarcia """ import datetime import os import re import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Segment, AnalogSignal, EventArray from neo.io.tools import create_many_to_one_relationship class VersionError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value) class ElanIO(BaseIO): """ Classe for reading/writing data from Elan. Usage: >>> from neo import io >>> r = io.ElanIO( filename = 'File_elan_1.eeg') >>> seg = r.read_segment(lazy = False, cascade = True,) >>> print seg.analogsignals # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [] >>> print seg.spiketrains # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [] >>> print seg.eventarrays # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [] """ is_readable = True is_writable = False supported_objects = [Segment, AnalogSignal, EventArray] readable_objects = [Segment] writeable_objects = [ ] has_header = False is_streameable = False read_params = { Segment : [ ] } write_params = { Segment : [ ] } name = None extensions = ['eeg'] mode = 'file' def __init__(self , filename = None) : """ This class read/write a elan based file. **Arguments** filename : the filename to read or write """ BaseIO.__init__(self) self.filename = filename def read_segment(self, lazy = False, cascade = True): ## Read header file f = open(self.filename+'.ent' , 'rU') #version version = f.readline() if version[:2] != 'V2' and version[:2] != 'V3': # raise('read only V2 .eeg.ent files') raise VersionError('Read only V2 or V3 .eeg.ent files. %s given' % version[:2]) return #info info1 = f.readline()[:-1] info2 = f.readline()[:-1] # strange 2 line for datetime #line1 l = f.readline() r1 = re.findall('(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)',l) r2 = re.findall('(\d+):(\d+):(\d+)',l) r3 = re.findall('(\d+)-(\d+)-(\d+)',l) YY, MM, DD, hh, mm, ss = (None, )*6 if len(r1) != 0 : DD , MM, YY, hh ,mm ,ss = r1[0] elif len(r2) != 0 : hh ,mm ,ss = r2[0] elif len(r3) != 0: DD , MM, YY= r3[0] #line2 l = f.readline() r1 = re.findall('(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)',l) r2 = re.findall('(\d+):(\d+):(\d+)',l) r3 = re.findall('(\d+)-(\d+)-(\d+)',l) if len(r1) != 0 : DD , MM, YY, hh ,mm ,ss = r1[0] elif len(r2) != 0 : hh ,mm ,ss = r2[0] elif len(r3) != 0: DD , MM, YY= r3[0] try: fulldatetime = datetime.datetime(int(YY) , int(MM) , int(DD) , int(hh) , int(mm) , int(ss) ) except: fulldatetime = None seg = Segment( file_origin = os.path.basename(self.filename), elan_version = version, info1 = info1, info2 = info2, rec_datetime = fulldatetime, ) if not cascade : return seg l = f.readline() l = f.readline() l = f.readline() # sampling rate sample l = f.readline() sampling_rate = 1./float(l) * pq.Hz # nb channel l = f.readline() nbchannel = int(l)-2 #channel label labels = [ ] for c in range(nbchannel+2) : labels.append(f.readline()[:-1]) # channel type types = [ ] for c in range(nbchannel+2) : types.append(f.readline()[:-1]) # channel unit units = [ ] for c in range(nbchannel+2) : units.append(f.readline()[:-1]) #print units #range min_physic = [] for c in range(nbchannel+2) : min_physic.append( float(f.readline()) ) max_physic = [] for c in range(nbchannel+2) : max_physic.append( float(f.readline()) ) min_logic = [] for c in range(nbchannel+2) : min_logic.append( float(f.readline()) ) max_logic = [] for c in range(nbchannel+2) : max_logic.append( float(f.readline()) ) #info filter info_filter = [] for c in range(nbchannel+2) : info_filter.append(f.readline()[:-1]) f.close() #raw data n = int(round(np.log(max_logic[0]-min_logic[0])/np.log(2))/8) data = np.fromfile(self.filename,dtype = 'i'+str(n) ) data = data.byteswap().reshape( (data.size/(nbchannel+2) ,nbchannel+2) ).astype('f4') for c in range(nbchannel) : if lazy: sig = [ ] else: sig = (data[:,c]-min_logic[c])/(max_logic[c]-min_logic[c])*\ (max_physic[c]-min_physic[c])+min_physic[c] try: unit = pq.Quantity(1, units[c] ) except: unit = pq.Quantity(1, '' ) anaSig = AnalogSignal(sig * unit, sampling_rate=sampling_rate, t_start=0. * pq.s, name=labels[c], channel_index=c) if lazy: anaSig.lazy_shape = data.shape[0] anaSig.annotate(channel_name= labels[c]) seg.analogsignals.append( anaSig ) # triggers f = open(self.filename+'.pos') times =[ ] labels = [ ] reject_codes = [ ] for l in f.readlines() : r = re.findall(' *(\d+) *(\d+) *(\d+) *',l) times.append( float(r[0][0])/sampling_rate.magnitude ) labels.append(str(r[0][1]) ) reject_codes.append( str(r[0][2]) ) if lazy: times = [ ]*pq.S labels = np.array([ ], dtype = 'S') reject_codes = [ ] else: times = np.array(times) * pq.s labels = np.array(labels) reject_codes = np.array(reject_codes) ea = EventArray( times = times, labels = labels, reject_codes = reject_codes, ) if lazy: ea.lazy_shape = len(times) seg.eventarrays.append(ea) f.close() create_many_to_one_relationship(seg) return seg #~ def write_segment(self, segment, ): #~ """ #~ Arguments: #~ segment : the segment to write. Only analog signals and events will be written. #~ """ #~ assert self.filename.endswith('.eeg') #~ fid_ent = open(self.filename+'.ent' ,'wt') #~ fid_eeg = open(self.filename ,'wt') #~ fid_pos = open(self.filename+'.pos' ,'wt') #~ seg = segment #~ sampling_rate = seg._analogsignals[0].sampling_rate #~ N = len(seg._analogsignals) #~ # #~ # header file #~ # #~ fid_ent.write('V2\n') #~ fid_ent.write('OpenElectrophyImport\n') #~ fid_ent.write('ELAN\n') #~ t = datetime.datetime.now() #~ fid_ent.write(t.strftime('%d-%m-%Y %H:%M:%S')+'\n') #~ fid_ent.write(t.strftime('%d-%m-%Y %H:%M:%S')+'\n') #~ fid_ent.write('-1\n') #~ fid_ent.write('reserved\n') #~ fid_ent.write('-1\n') #~ fid_ent.write('%g\n' % (1./sampling_rate)) #~ fid_ent.write( '%d\n' % (N+2) ) #~ # channel label #~ for i, anaSig in enumerate(seg.analogsignals) : #~ try : #~ fid_ent.write('%s.%d\n' % (anaSig.label, i+1 )) #~ except : #~ fid_ent.write('%s.%d\n' % ('nolabel', i+1 )) #~ fid_ent.write('Num1\n') #~ fid_ent.write('Num2\n') #~ #channel type #~ for i, anaSig in enumerate(seg.analogsignals) : #~ fid_ent.write('Electrode\n') #~ fid_ent.write( 'dateur echantillon\n') #~ fid_ent.write( 'type evenement et byte info\n') #~ #units #~ for i, anaSig in enumerate(seg._analogsignals) : #~ unit_txt = str(anaSig.units).split(' ')[1] #~ fid_ent.write('%s\n' % unit_txt) #~ fid_ent.write('sans\n') #~ fid_ent.write('sans\n') #~ #range and data #~ list_range = [] #~ data = np.zeros( (seg._analogsignals[0].size , N+2) , 'i2') #~ for i, anaSig in enumerate(seg._analogsignals) : #~ # in elan file unit is supposed to be in microV to have a big range #~ # so auto translate #~ if anaSig.units == pq.V or anaSig.units == pq.mV: #~ s = anaSig.rescale('uV').magnitude #~ elif anaSig.units == pq.uV: #~ s = anaSig.magnitude #~ else: #~ # automatic range in arbitrry unit #~ s = anaSig.magnitude #~ s*= 10**(int(np.log10(abs(s).max()))+1) #~ list_range.append( int(abs(s).max()) +1 ) #~ s2 = s*65535/(2*list_range[i]) #~ data[:,i] = s2.astype('i2') #~ for r in list_range : #~ fid_ent.write('-%.0f\n'% r) #~ fid_ent.write('-1\n') #~ fid_ent.write('-1\n') #~ for r in list_range : #~ fid_ent.write('%.0f\n'% r) #~ fid_ent.write('+1\n') #~ fid_ent.write('+1\n') #~ for i in range(N+2) : #~ fid_ent.write('-32768\n') #~ for i in range(N+2) : #~ fid_ent.write('+32767\n') #~ #info filter #~ for i in range(N+2) : #~ fid_ent.write('passe-haut ? Hz passe-bas ? Hz\n') #~ fid_ent.write('sans\n') #~ fid_ent.write('sans\n') #~ for i in range(N+2) : #~ fid_ent.write('1\n') #~ for i in range(N+2) : #~ fid_ent.write('reserved\n') #~ # raw file .eeg #~ if len(seg._eventarrays) == 1: #~ ea = seg._eventarrays[0] #~ trigs = (ea.times*sampling_rate).magnitude #~ trigs = trigs.astype('i') #~ trigs2 = trigs[ (trigs>0) & (trigs= 2.2 - quantities Quick reference: ================================================================================ Class NeoHdf5IO() with methods get(), save(), delete() is implemented. This class represents a connection manager with the HDF5 file with the possibility to put (save()) or retrieve (get()) runtime NEO objects from the file. Start by initializing IO: >>> from neo.io.hdf5io import NeoHdf5IO >>> iom = NeoHdf5IO('myfile.h5') >>> iom Now you may save any of your neo objects into the file: >>> b = Block() >>> iom.write_block(b) or just do >>> iom.save(b) After you stored an object it receives a unique "path" in the hdf5 file. This is exactly the place in the HDF5 hierarchy, where it was written. This information is now accessible by "hdf5_path" property: >>> b.hdf5_path '/block_0' You may save more complicated NEO stuctures, with relations and arrays: >>> import numpy as np >>> import quantities as pq >>> s = Segment() >>> b.segments.append(s) >>> a1 = AnalogSignal(signal=np.random.rand(300), t_start=42*pq.ms) >>> s.analogsignals.append(a1) and then >>> iom.write_block(b) or just >>> iom.save(b) If you already have hdf5 file in NEO format, or you just created one, then you may want to read NEO data (providing the path to what to read): >>> b1 = iom.read_block("/block_0") >>> b1 or just use >>> b1 = iom.get("/block_0") You may notice, by default the reading function retrieves all available data, with all downstream relations and arrays: >>> b1._segments [] >>> b1._segments[0]._analogsignals[0].signal array([ 3.18987819e-01, 1.08448284e-01, 1.03858980e-01, ... 3.78908705e-01, 3.08669731e-02, 9.48965785e-01]) * dimensionless When you need to save time and performance, you may load an object without relations >>> b2 = iom.get("/block_0", cascade=False) >>> b2._segments [] and/or even without arrays >>> a2 = iom.get("/block_0/_segments/segment_0/_analogsignals/analogsignal_0", lazy=True) >>> a2.signal [] These functions return "pure" NEO objects. They are completely "detached" from the HDF5 file - changes to the runtime objects will not cause any changes in the file: >>> a2.t_start array(42.0) * ms >>> a2.t_start = 32 * pq.ms >>> a2.t_start array(32.0) * ms >>> iom.get("/block_0/_segments/segment_0/_analogsignals/analogsignal_0").t_start array(42.0) * ms However, if you want to work directly with HDF5 storage making instant modifications, you may use the native PyTables functionality, where all objects are accessible through "._data.root": >>> iom._data.root / (RootGroup) 'neo.h5' children := ['block_0' (Group)] >>> b3 = iom._data.root.block_0 >>> b3 /block_0 (Group) '' children := ['_recordingchannelgroups' (Group), '_segments' (Group)] To understand more about this "direct" way of working with data, please refer to http://www.pytables.org/ Finally, you may get an overview of the contents of the file by running >>> iom.get_info() This is a neo.HDF5 file. it contains: {'spiketrain': 0, 'irsaanalogsignal': 0, 'analogsignalarray': 0, 'recordingchannelgroup': 0, 'eventarray': 0, 'analogsignal': 1, 'epoch': 0, 'unit': 0, 'recordingchannel': 0, 'spike': 0, 'epocharray': 0, 'segment': 1, 'event': 0, 'block': 1} The general structure of the file: ================================================================================ \'Block_1' \ \'Block_2' \ \---'_recordingchannelgroups' \ \ \ \---'RecordingChannelGroup_1' \ \ \ \---'RecordingChannelGroup_2' \ \ \ \---'_recordingchannels' \ \ \ \---'RecordingChannel_1' \ \ \ \---'RecordingChannel_2' \ \ \ \---'_units' \ \ \ \---'Unit_1' \ \ \ \---'Unit_2' \ \---'_segments' \ \--'Segment_1' \ \--'Segment_2' \ \---'_epochs' \ \ \ \---'Epoch_1' \ \---'_epochs' etc. Plans for future extensions: ================================================================================ #FIXME - implement logging mechanism (probably in general for NEO) #FIXME - implement actions history (probably in general for NEO) #FIXME - implement callbacks in functions for GUIs #FIXME - no performance testing yet IMPORTANT things: ================================================================================ 1. Every NEO node object in HDF5 has a "_type" attribute. Please don't modify. 2. There are reserved attributes "unit__" or "__" in objects, containing quantities. 3. Don't use "__" in attribute names, as this symbol is reserved for quantities. Author: asobolev """ # needed for python 3 compatibility from __future__ import absolute_import import logging import uuid #version checking from distutils import version import numpy as np import quantities as pq # check tables try: import tables as tb except ImportError as err: HAVE_TABLES = False TABLES_ERR = err else: if version.LooseVersion(tb.__version__) < '2.2': HAVE_TABLES = False TABLES_ERR = ImportError("your pytables version is too old to " + "support NeoHdf5IO, you need at least 2.2. " + "You have %s" % tb.__version__) else: HAVE_TABLES = True TABLES_ERR = None from neo.core import Block from neo.description import (class_by_name, name_by_class, classes_inheriting_quantities, classes_necessary_attributes, classes_recommended_attributes, many_to_many_relationship, many_to_one_relationship, one_to_many_relationship) from neo.io.baseio import BaseIO from neo.io.tools import create_many_to_one_relationship, LazyList logger = logging.getLogger("Neo") def _func_wrapper(func): try: return func except IOError: raise IOError("There is no connection with the file or the file was recently corrupted. \ Please reload the IO manager.") #--------------------------------------------------------------- # Basic I/O manager, implementing basic I/O functionality #--------------------------------------------------------------- all_objects = list(class_by_name.values()) all_objects.remove(Block) # the order is important all_objects = [Block] + all_objects # Types where an object might have to be loaded multiple times to create # all realtionships complex_relationships = ["Unit", "Segment", "RecordingChannel"] # Data objects which have multiple parents (Segment and one other) multi_parent = {'AnalogSignal': 'RecordingChannel', 'AnalogSignalArray': 'RecordingChannelGroup', 'IrregularlySampledSignal': 'RecordingChannel', 'Spike': 'Unit', 'SpikeTrain': 'Unit'} # Arrays node names for lazy shapes lazy_shape_arrays = {'SpikeTrain': 'times', 'Spike': 'waveform', 'AnalogSignal': 'signal', 'AnalogSignalArray': 'signal', 'EventArray': 'times', 'EpochArray': 'times'} class NeoHdf5IO(BaseIO): """ The IO Manager is the core I/O class for HDF5 / NEO. It handles the connection with the HDF5 file, and uses PyTables for data operations. Use this class to get (load), insert or delete NEO objects to HDF5 file. """ supported_objects = all_objects readable_objects = all_objects writeable_objects = all_objects read_params = dict(zip(all_objects, [] * len(all_objects))) write_params = dict(zip(all_objects, [] * len(all_objects))) name = 'NeoHdf5 IO' extensions = ['h5'] mode = 'file' is_readable = True is_writable = True def __init__(self, filename=None, **kwargs): if not HAVE_TABLES: raise TABLES_ERR BaseIO.__init__(self, filename=filename) self.connected = False self.objects_by_ref = {} # Loaded objects by reference id self.parent_paths = {} # Tuples of (Segment, other parent) paths self.name_indices = {} if filename: self.connect(filename=filename) def _read_entity(self, path="/", cascade=True, lazy=False): """ Wrapper for base io "reader" functions. """ ob = self.get(path, cascade, lazy) if cascade and cascade != 'lazy': create_many_to_one_relationship(ob) return ob def _write_entity(self, obj, where="/", cascade=True, lazy=False): """ Wrapper for base io "writer" functions. """ self.save(obj, where, cascade, lazy) #------------------------------------------- # IO connectivity / Session management #------------------------------------------- def connect(self, filename): """ Opens / initialises new HDF5 file. We rely on PyTables and keep all session management staff there. """ if not self.connected: try: if tb.isHDF5File(filename): self._data = tb.openFile(filename, mode = "a", title = filename) self.connected = True else: raise TypeError('"%s" is not an HDF5 file format.' % filename) except IOError: # create a new file if specified file not found self._data = tb.openFile(filename, mode = "w", title = filename) self.connected = True except: raise NameError("Incorrect file path, couldn't find or create a file.") self.objects_by_ref = {} self.name_indices = {} else: logger.info("Already connected.") def close(self): """ Closes the connection. """ self.objects_by_ref = {} self.parent_paths = {} self.name_indices = {} self._data.close() self.connected = False #------------------------------------------- # some internal IO functions #------------------------------------------- def _get_class_by_node(self, node): """ Returns the type of the object (string) depending on node. """ try: obj_type = node._f_getAttr("_type") return class_by_name[obj_type] except: return None # that's an alien node def _update_path(self, obj, node): setattr(obj, "hdf5_path", node._v_pathname) def _get_next_name(self, obj_type, where): """ Returns the next possible name within a given container (group) """ if not (obj_type, where) in self.name_indices: self.name_indices[(obj_type, where)] = 0 index_num = self.name_indices[(obj_type, where)] prefix = str(obj_type) + "_" if where + '/' + prefix + str(index_num) not in self._data: self.name_indices[(obj_type, where)] = index_num + 1 return prefix + str(index_num) nodes = [] for node in self._data.iterNodes(where): index = node._v_name[node._v_name.find(prefix) + len(prefix):] if len(index) > 0: try: nodes.append(int(index)) except ValueError: pass # index was changed by user, but then we don't care nodes.sort(reverse=True) if len(nodes) > 0: self.name_indices[(obj_type, where)] = nodes[0] + 2 return prefix + str(nodes[0] + 1) else: self.name_indices[(obj_type, where)] = 1 return prefix + "0" #------------------------------------------- # general IO functions, for all NEO objects #------------------------------------------- @_func_wrapper def save(self, obj, where="/", cascade=True, lazy=False): """ Saves changes of a given object to the file. Saves object as new at location "where" if it is not in the file yet. Returns saved node. cascade: True/False process downstream relationships lazy: True/False process any quantity/ndarray attributes """ def assign_attribute(obj_attr, attr_name, path, node): """ subfunction to serialize a given attribute """ if isinstance(obj_attr, pq.Quantity) or isinstance(obj_attr, np.ndarray): if not lazy: # we need to simplify custom quantities if isinstance(obj_attr, pq.Quantity): for un in obj_attr.dimensionality.keys(): if not un.name in pq.units.__dict__ or \ not isinstance(pq.units.__dict__[un.name], pq.Quantity): obj_attr = obj_attr.simplified break # we try to create new array first, so not to loose the # data in case of any failure if obj_attr.size == 0: atom = tb.Float64Atom(shape=(1,)) new_arr = self._data.createEArray(path, attr_name + "__temp", atom, shape=(0,), expectedrows=1) else: new_arr = self._data.createArray(path, attr_name + "__temp", obj_attr) if hasattr(obj_attr, "dimensionality"): for un in obj_attr.dimensionality.items(): new_arr._f_setAttr("unit__" + un[0].name, un[1]) try: self._data.removeNode(path, attr_name) except: pass # there is no array yet or object is new self._data.renameNode(path, attr_name, name=attr_name + "__temp") elif obj_attr is not None: node._f_setAttr(attr_name, obj_attr) #assert_neo_object_is_compliant(obj) obj_type = name_by_class[obj.__class__] if self._data.mode != 'w' and hasattr(obj, "hdf5_path"): # this is an update case path = str(obj.hdf5_path) try: node = self._data.getNode(obj.hdf5_path) except tb.NoSuchNodeError: # create a new node? raise LookupError("A given object has a path %s attribute, \ but such an object does not exist in the file. Please \ correct these values or delete this attribute \ (.__delattr__('hdf5_path')) to create a new object in \ the file." % path) else: # create new object node = self._data.createGroup(where, self._get_next_name(obj_type, where)) node._f_setAttr("_type", obj_type) path = node._v_pathname # processing attributes if obj_type in multi_parent: # Initialize empty parent paths node._f_setAttr('segment', '') node._f_setAttr(multi_parent[obj_type].lower(), '') attrs = classes_necessary_attributes[obj_type] + classes_recommended_attributes[obj_type] for attr in attrs: # we checked already obj is compliant, loop over all safely if hasattr(obj, attr[0]): # save an attribute if exists assign_attribute(getattr(obj, attr[0]), attr[0], path, node) # not forget to save AS, ASA or ST - NEO "stars" if obj_type in classes_inheriting_quantities.keys(): assign_attribute(obj, classes_inheriting_quantities[obj_type], path, node) if hasattr(obj, "annotations"): # annotations should be just a dict node._f_setAttr("annotations", getattr(obj, "annotations")) node._f_setAttr("object_ref", uuid.uuid4().hex) if one_to_many_relationship.has_key(obj_type) and cascade: rels = list(one_to_many_relationship[obj_type]) if obj_type == "RecordingChannelGroup": rels += many_to_many_relationship[obj_type] for child_name in rels: # child_name like "Segment", "Event" etc. container = child_name.lower() + "s" # like "units" try: ch = self._data.getNode(node, container) except tb.NoSuchNodeError: ch = self._data.createGroup(node, container) saved = [] # keeps track of saved object names for removal for child in getattr(obj, container): new_name = None child_node = None if hasattr(child, "hdf5_path"): if not child.hdf5_path.startswith(ch._v_pathname): # create a Hard Link if object exists already somewhere try: target = self._data.getNode(child.hdf5_path) new_name = self._get_next_name( name_by_class[child.__class__], ch._v_pathname) if not hasattr(ch, new_name): # Only link if path does not exist child_node = self._data.createHardLink(ch._v_pathname, new_name, target) except tb.NoSuchNodeError: pass if child_node is None: child_node = self.save(child, where=ch._v_pathname) if child_name in multi_parent: # Save parent for multiparent objects child_node._f_setAttr(obj_type.lower(), path) elif child_name == 'RecordingChannel': parents = [] if 'recordingchannelgroups' in child_node._v_attrs: parents = child_node._v_attrs['recordingchannelgroups'] parents.append(path) child_node._f_setAttr('recordingchannelgroups', parents) if not new_name: new_name = child.hdf5_path.split('/')[-1] saved.append(new_name) for child in self._data.iterNodes(ch._v_pathname): if child._v_name not in saved: # clean-up self._data.removeNode(ch._v_pathname, child._v_name, recursive=True) self._update_path(obj, node) return node def _get_parent(self, path, ref, parent_type): """ Return the path of the parent of type "parent_type" for the object in "path" with id "ref". Returns an empty string if no parent extists. """ parts = path.split('/') if parent_type == 'Block' or parts[-4] == parent_type.lower() + 's': return '/'.join(parts[:-2]) object_folder = parts[-2] parent_folder = parts[-4] if parent_folder in ('recordingchannels', 'units'): block_path = '/'.join(parts[:-6]) else: block_path = '/'.join(parts[:-4]) if parent_type in ('RecordingChannel', 'Unit'): # We need to search all recording channels path = block_path + '/recordingchannelgroups' for n in self._data.iterNodes(path): if not '_type' in n._v_attrs: continue p = self._search_parent( '%s/%ss' % (n._v_pathname, parent_type.lower()), object_folder, ref) if p != '': return p return '' if parent_type == 'Segment': path = block_path + '/segments' elif parent_type == 'RecordingChannelGroup': path = block_path + '/recordingchannelgroups' else: return '' return self._search_parent(path, object_folder, ref) def _get_rcgs(self, path, ref): """ Get RecordingChannelGroup parents for a RecordingChannel """ parts = path.split('/') object_folder = parts[-2] block_path = '/'.join(parts[:-4]) path = block_path + '/recordingchannelgroups' return self._search_parent(path, object_folder, ref, True) def _search_parent(self, path, object_folder, ref, multi=False): """ Searches a folder for an object with a given reference and returns the path of the parent node. :param str path: Path to search :param str object_folder: The name of the folder within the parent object containing the objects to search. :param ref: Object reference """ if multi: ret = [] else: ret = '' for n in self._data.iterNodes(path): if not '_type' in n._v_attrs: continue for c in self._data.iterNodes(n._f_getChild(object_folder)): try: if c._f_getAttr("object_ref") == ref: if not multi: return n._v_pathname else: ret.append(n._v_pathname) except AttributeError: # alien node pass # not an error return ret _second_parent = { # Second parent type apart from Segment 'AnalogSignal': 'RecordingChannel', 'AnalogSignalArray': 'RecordingChannelGroup', 'IrregularlySampledSignal': 'RecordingChannel', 'Spike': 'Unit', 'SpikeTrain': 'Unit'} def load_lazy_cascade(self, path, lazy): """ Load an object with the given path in lazy cascade mode. """ o = self.get(path, cascade='lazy', lazy=lazy) t = type(o).__name__ node = self._data.getNode(path) if t in multi_parent: # Try to read parent objects from attributes if not path in self.parent_paths: ppaths = [None, None] if 'segment' in node._v_attrs: ppaths[0] = node._f_getAttr('segment') if multi_parent[t] in node._v_attrs: ppaths[1] = node._f_getAttr(multi_parent[t]) self.parent_paths[path] = ppaths elif t == 'RecordingChannel': if not path in self.parent_paths: if 'recordingchannelgroups' in node._v_attrs: self.parent_paths[path] = node._f_getAttr('recordingchannelgroups') # Set parent objects if path in self.parent_paths: paths = self.parent_paths[path] if t == 'RecordingChannel': # Set list of parnet channel groups for rcg in self.parent_paths[path]: o.recordingchannelgroups.append(self.get(rcg, cascade='lazy', lazy=lazy)) else: # Set parents: Segment and another parent if paths[0] is None: paths[0] = self._get_parent( path, self._data.getNodeAttr(path, 'object_ref'), 'Segment') if paths[0]: o.segment = self.get(paths[0], cascade='lazy', lazy=lazy) parent = self._second_parent[t] if paths[1] is None: paths[1] = self._get_parent( path, self._data.getNodeAttr(path, 'object_ref'), parent) if paths[1]: setattr(o, parent.lower(), self.get(paths[1], cascade='lazy', lazy=lazy)) elif t != 'Block': ref = self._data.getNodeAttr(path, 'object_ref') if t == 'RecordingChannel': rcg_paths = self._get_rcgs(path, ref) for rcg in rcg_paths: o.recordingchannelgroups.append(self.get(rcg, cascade='lazy', lazy=lazy)) self.parent_paths[path] = rcg_paths else: for p in many_to_one_relationship[t]: parent = self._get_parent(path, ref, p) if parent: setattr(o, p.lower(), self.get(parent, cascade='lazy', lazy=lazy)) return o def load_lazy_object(self, obj): """ Return the fully loaded version of a lazily loaded object. Does not set links to parent objects. """ return self.get(obj.hdf5_path, cascade=False, lazy=False, lazy_loaded=True) @_func_wrapper def get(self, path="/", cascade=True, lazy=False, lazy_loaded=False): """ Returns a requested NEO object as instance of NEO class. Set lazy_loaded to True to load a previously lazily loaded object (cache is ignored in this case).""" def fetch_attribute(attr_name, attr, node): """ fetch required attribute from the corresp. node in the file """ try: if attr[1] == pq.Quantity: arr = self._data.getNode(node, attr_name) units = "" for unit in arr._v_attrs._f_list(attrset='user'): if unit.startswith("unit__"): units += " * " + str(unit[6:]) + " ** " + str(arr._f_getAttr(unit)) units = units.replace(" * ", "", 1) if not lazy or sum(arr.shape) <= 1: nattr = pq.Quantity(arr.read(), units) else: # making an empty array nattr = pq.Quantity(np.empty(tuple([0 for _ in range(attr[2])])), units) elif attr[1] == np.ndarray: arr = self._data.getNode(node, attr_name) if not lazy: nattr = np.array(arr.read(), attr[3]) if nattr.shape == (0, 1): # Fix: Empty arrays should have only one dimension nattr = nattr.reshape(-1) else: # making an empty array nattr = np.empty(0, attr[3]) else: nattr = node._f_getAttr(attr_name) if attr[1] == str or attr[1] == int: nattr = attr[1](nattr) # compliance with NEO attr types except (AttributeError, tb.NoSuchNodeError): # not assigned, continue nattr = None return nattr def get_lazy_shape(obj, node): attr = lazy_shape_arrays[type(obj).__name__] arr = self._data.getNode(node, attr) return arr.shape if path == "/": # this is just for convenience. Try to return any object found = False for n in self._data.iterNodes(path): for obj_type in class_by_name.keys(): if obj_type.lower() in str(n._v_name).lower(): path = n._v_pathname found = True if found: break try: if path == "/": raise ValueError() # root is not a NEO object node = self._data.getNode(path) except (tb.NoSuchNodeError, ValueError): # create a new node? raise LookupError("There is no valid object with a given path " + str(path) + ' . Please give correct path or just browse the file ' '(e.g. NeoHdf5IO()._data.root.._segments...) to find an ' 'appropriate name.') classname = self._get_class_by_node(node) if not classname: raise LookupError("The requested object with the path " + str(path) + " exists, but is not of a NEO type. Please check the '_type' attribute.") obj_type = name_by_class[classname] try: object_ref = self._data.getNodeAttr(node, 'object_ref') except AttributeError: # Object does not have reference, e.g. because this is an old file format object_ref = None if object_ref in self.objects_by_ref and not lazy_loaded: obj = self.objects_by_ref[object_ref] if cascade == 'lazy' or obj_type not in complex_relationships: return obj else: kwargs = {} # load attributes (inherited *-ed attrs are also here) attrs = classes_necessary_attributes[obj_type] + classes_recommended_attributes[obj_type] for i, attr in enumerate(attrs): attr_name = attr[0] nattr = fetch_attribute(attr_name, attr, node) if nattr is not None: kwargs[attr_name] = nattr obj = class_by_name[obj_type](**kwargs) # instantiate new object if lazy and obj_type in lazy_shape_arrays: obj.lazy_shape = get_lazy_shape(obj, node) self._update_path(obj, node) # set up HDF attributes: name, path try: setattr(obj, "annotations", node._f_getAttr("annotations")) except AttributeError: pass # not assigned, continue if object_ref and not lazy_loaded: self.objects_by_ref[object_ref] = obj # load relationships if cascade: if obj_type in one_to_many_relationship: rels = list(one_to_many_relationship[obj_type]) if obj_type == "RecordingChannelGroup": rels += many_to_many_relationship[obj_type] for child in rels: # 'child' is like 'Segment', 'Event' etc. if cascade == 'lazy': relatives = LazyList(self, lazy) else: relatives = [] container = self._data.getNode(node, child.lower() + "s") for n in self._data.iterNodes(container): if cascade == 'lazy': relatives.append(n._v_pathname) else: try: if n._f_getAttr("_type") == child: relatives.append(self.get(n._v_pathname, lazy=lazy)) except AttributeError: # alien node pass # not an error setattr(obj, child.lower() + "s", relatives) if not cascade == 'lazy': # RC -> AnalogSignal relationship will not be created later, do it now if obj_type == "RecordingChannel" and child == "AnalogSignal": for r in relatives: r.recordingchannel = obj # Cannot create Many-to-Many relationship with old format, create at least One-to-Many if obj_type == "RecordingChannelGroup" and not object_ref: for r in relatives: r.recordingchannelgroups = [obj] # special processor for RC -> RCG if obj_type == "RecordingChannel": if hasattr(node, '_v_parent'): parent = node._v_parent if hasattr(parent, '_v_parent'): parent = parent._v_parent if 'object_ref' in parent._v_attrs: obj.recordingchannelgroups.append(self.get( parent._v_pathname, lazy=lazy)) return obj @_func_wrapper def read_all_blocks(self, lazy=False, cascade=True, **kargs): """ Loads all blocks in the file that are attached to the root (which happens when they are saved with save() or write_block()). """ blocks = [] for n in self._data.iterNodes(self._data.root): if self._get_class_by_node(n) == Block: blocks.append(self.read_block(n._v_pathname, lazy=lazy, cascade=cascade, **kargs)) return blocks @_func_wrapper def write_all_blocks(self, blocks, **kargs): """ Writes a sequence of blocks. Just calls write_block() for each element. """ for b in blocks: self.write_block(b) @_func_wrapper def delete(self, path, cascade=False): """ Deletes an object in the file. Just a simple alternative of removeNode(). """ self._data.removeNode(path, recursive=cascade) @_func_wrapper def reset(self, obj): """ Resets runtime changes made to the object. TBD. """ pass @_func_wrapper def get_info(self): """ Returns a quantitative information about the contents of the file. """ logger.info("This is a neo.HDF5 file. it contains:") info = {} info = info.fromkeys(class_by_name.keys(), 0) for node in self._data.walkNodes(): try: t = node._f_getAttr("_type") info[t] += 1 except: # node is not of NEO type pass return info for obj_type in NeoHdf5IO.writeable_objects: setattr(NeoHdf5IO, "write_" + obj_type.__name__.lower(), NeoHdf5IO._write_entity) for obj_type in NeoHdf5IO.readable_objects: setattr(NeoHdf5IO, "read_" + obj_type.__name__.lower(), NeoHdf5IO._read_entity) neo-0.3.3/neo/io/winwcpio.py0000644000175000017500000001231512273723542016754 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Class for reading data from WinWCP, a software tool written by John Dempster. WinWCP is free: http://spider.science.strath.ac.uk/sipbs/software.htm Supported : Read Author : sgarcia """ import os import struct import sys import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Block, Segment, AnalogSignal from neo.io.tools import create_many_to_one_relationship PY3K = (sys.version_info[0] == 3) class WinWcpIO(BaseIO): """ Class for reading from a WinWCP file. Usage: >>> from neo import io >>> r = io.WinWcpIO( filename = 'File_winwcp_1.wcp') >>> bl = r.read_block(lazy = False, cascade = True,) >>> print bl.segments # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [, , ... >>> print bl.segments[0].analogsignals [>> from neo import io >>> r = io.RawBinarySignalIO( filename = 'File_ascii_signal_2.txt') >>> seg = r.read_segment(lazy = False, cascade = True,) >>> print seg.analogsignals # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE ... """ is_readable = True is_writable = True supported_objects = [Segment , AnalogSignal] readable_objects = [ Segment] writeable_objects = [Segment] has_header = False is_streameable = False read_params = { Segment : [ ('sampling_rate' , { 'value' : 1000. } ) , ('nbchannel' , { 'value' : 16 } ), ('bytesoffset' , { 'value' : 0 } ), ('t_start' , { 'value' : 0. } ), ('dtype' , { 'value' : 'float32' , 'possible' : ['float32' , 'float64', 'int16' , 'uint16', 'int32' , 'uint32', ] } ), ('rangemin' , { 'value' : -10 } ), ('rangemax' , { 'value' : 10 } ), ] } write_params = { Segment : [ ('bytesoffset' , { 'value' : 0 } ), ('dtype' , { 'value' : 'float32' , 'possible' : ['float32' , 'float64', 'int16' , 'uint16', 'int32' , 'uint32', ] } ), ('rangemin' , { 'value' : -10 } ), ('rangemax' , { 'value' : 10 } ), ] } name = None extensions = [ 'raw' ] mode = 'file' def __init__(self , filename = None) : """ This class read a binary file. **Arguments** filename : the filename to read """ BaseIO.__init__(self) self.filename = filename def read_segment(self, cascade = True, lazy = False, sampling_rate = 1.*pq.Hz, t_start = 0.*pq.s, unit = pq.V, nbchannel = 1, bytesoffset = 0, dtype = 'f4', rangemin = -10, rangemax = 10, ): """ Reading signal in a raw binary interleaved compact file. Arguments: sampling_rate : sample rate t_start : time of the first sample sample of each channel unit: unit of AnalogSignal can be a str or directly a Quantities nbchannel : number of channel bytesoffset : nb of bytes offset at the start of file dtype : dtype of the data rangemin , rangemax : if the dtype is integer, range can give in volt the min and the max of the range """ seg = Segment(file_origin = os.path.basename(self.filename)) if not cascade: return seg dtype = np.dtype(dtype) if type(sampling_rate) == float or type(sampling_rate)==int: # if not quantitities Hz by default sampling_rate = sampling_rate*pq.Hz if type(t_start) == float or type(t_start)==int: # if not quantitities s by default t_start = t_start*pq.s unit = pq.Quantity(1, unit) if not lazy: sig = np.memmap(self.filename, dtype = dtype, mode = 'r', offset = bytesoffset) if sig.size % nbchannel != 0 : sig = sig[:- sig.size%nbchannel] sig = sig.reshape((sig.size/nbchannel,nbchannel)) if dtype.kind == 'i' : sig = sig.astype('f') sig /= 2**(8*dtype.itemsize) sig *= ( rangemax-rangemin ) sig += ( rangemax+rangemin )/2. elif dtype.kind == 'u' : sig = sig.astype('f') sig /= 2**(8*dtype.itemsize) sig *= ( rangemax-rangemin ) sig += rangemin sig_with_units = pq.Quantity(sig, units=unit, copy = False) for i in range(nbchannel) : if lazy: signal = [ ]*unit else: signal = sig_with_units[:,i] anaSig = AnalogSignal(signal, sampling_rate=sampling_rate, t_start=t_start, channel_index=i, copy = False) if lazy: # TODO anaSig.lazy_shape = None seg.analogsignals.append(anaSig) create_many_to_one_relationship(seg) return seg def write_segment(self, segment, dtype='f4', rangemin=-10, rangemax=10, bytesoffset=0): """ **Arguments** segment : the segment to write. Only analog signals will be written. dtype : dtype of the data rangemin , rangemax : if the dtype is integer, range can give in volt the min and the max of the range """ if bytesoffset: raise NotImplementedError('bytesoffset values other than 0 ' + 'not supported') dtype = np.dtype(dtype) # all AnaologSignal from Segment must have the same length for anasig in segment.analogsignals[1:]: assert anasig.size == segment.analogsignals[0].size sigs = np.empty((segment.analogsignals[0].size, len(segment.analogsignals))) for i, anasig in enumerate(segment.analogsignals): sigs[:, i] = anasig.magnitude if dtype.kind == 'i': sigs -= ( rangemax+rangemin )/2. sigs /= (rangemax - rangemin) sigs *= 2 ** (8 * dtype.itemsize ) elif dtype.kind == 'u' : sigs -= rangemin sigs /= (rangemax - rangemin) sigs *= 2 ** (8 * dtype.itemsize) sigs = sigs.astype(dtype) f = open(self.filename, 'wb') f.write(sigs.tostring()) f.close() neo-0.3.3/neo/io/neuroscopeio.py0000644000175000017500000001011612273723542017624 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Reading from neuroscope format files. Ref: http://neuroscope.sourceforge.net/ It is an old format from Buzsaki's lab. Supported: Read #TODO: SpikeTrain file '.clu' '.res' EventArray '.ext.evt' or '.evt.ext' Author: sgarcia """ # needed for python 3 compatibility from __future__ import absolute_import import os from xml.etree import ElementTree import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.io.rawbinarysignalio import RawBinarySignalIO from neo.core import (Block, Segment, RecordingChannel, RecordingChannelGroup, AnalogSignal) from neo.io.tools import create_many_to_one_relationship class NeuroScopeIO(BaseIO): """ """ is_readable = True is_writable = False supported_objects = [ Block, Segment , AnalogSignal, RecordingChannel, RecordingChannelGroup] readable_objects = [ Block ] writeable_objects = [ ] has_header = False is_streameable = False read_params = { Segment : [ ] } # do not supported write so no GUI stuff write_params = None name = 'NeuroScope' extensions = [ 'xml' ] mode = 'file' def __init__(self , filename = None) : """ Arguments: filename : the filename """ BaseIO.__init__(self) self.filename = filename def read_block(self, lazy = False, cascade = True, ): """ """ tree = ElementTree.parse(self.filename) root = tree.getroot() acq = root.find('acquisitionSystem') nbits = int(acq.find('nBits').text) nbchannel = int(acq.find('nChannels').text) sampling_rate = float(acq.find('samplingRate').text)*pq.Hz voltage_range = float(acq.find('voltageRange').text) #offset = int(acq.find('offset').text) amplification = float(acq.find('amplification').text) bl = Block(file_origin = os.path.basename(self.filename).replace('.xml', '')) if cascade: seg = Segment() bl.segments.append(seg) # RC and RCG rc_list = [ ] for i, xml_rcg in enumerate(root.find('anatomicalDescription').find('channelGroups').findall('group')): rcg = RecordingChannelGroup(name = 'Group {}'.format(i)) bl.recordingchannelgroups.append(rcg) for xml_rc in xml_rcg: rc = RecordingChannel(index = int(xml_rc.text)) rc_list.append(rc) rcg.recordingchannels.append(rc) rc.recordingchannelgroups.append(rcg) rcg.channel_indexes = np.array([rc.index for rc in rcg.recordingchannels], dtype = int) rcg.channel_names = np.array(['Channel{}'.format(rc.index) for rc in rcg.recordingchannels], dtype = 'S') # AnalogSignals reader = RawBinarySignalIO(filename = self.filename.replace('.xml', '.dat')) seg2 = reader.read_segment(cascade = True, lazy = lazy, sampling_rate = sampling_rate, t_start = 0.*pq.s, unit = pq.V, nbchannel = nbchannel, bytesoffset = 0, dtype = np.int16 if nbits<=16 else np.int32, rangemin = -voltage_range/2., rangemax = voltage_range/2.,) for s, sig in enumerate(seg2.analogsignals): if not lazy: sig /= amplification sig.segment = seg seg.analogsignals.append(sig) rc_list[s].analogsignals.append(sig) create_many_to_one_relationship(bl) return bl neo-0.3.3/neo/io/klustakwikio.py0000644000175000017500000004255312273723542017645 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Reading and writing from KlustaKwik-format files. Ref: http://klusters.sourceforge.net/UserManual/data-files.html Supported : Read, Write Author : Chris Rodgers TODO: * When reading, put the Unit into the RCG, RC hierarchy * When writing, figure out how to get group and cluster if those annotations weren't set. Consider removing those annotations if they are redundant. * Load features in addition to spiketimes. """ import glob import logging import os.path import shutil # note neo.core need only numpy and quantitie import numpy as np try: import matplotlib.mlab as mlab except ImportError as err: HAVE_MLAB = False MLAB_ERR = err else: HAVE_MLAB = True MLAB_ERR = None # I need to subclass BaseIO from neo.io.baseio import BaseIO from neo.core import Block, Segment, Unit, SpikeTrain from neo.io.tools import create_many_to_one_relationship # Pasted version of feature file format spec """ The Feature File Generic file name: base.fet.n Format: ASCII, integer values The feature file lists for each spike the PCA coefficients for each electrode, followed by the timestamp of the spike (more features can be inserted between the PCA coefficients and the timestamp). The first line contains the number of dimensions. Assuming N1 spikes (spike1...spikeN1), N2 electrodes (e1...eN2) and N3 coefficients (c1...cN3), this file looks like: nbDimensions c1_e1_spike1 c2_e1_spike1 ... cN3_e1_spike1 c1_e2_spike1 ... cN3_eN2_spike1 timestamp_spike1 c1_e1_spike2 c2_e1_spike2 ... cN3_e1_spike2 c1_e2_spike2 ... cN3_eN2_spike2 timestamp_spike2 ... c1_e1_spikeN1 c2_e1_spikeN1 ... cN3_e1_spikeN1 c1_e2_spikeN1 ... cN3_eN2_spikeN1 timestamp_spikeN1 The timestamp is expressed in multiples of the sampling interval. For instance, for a 20kHz recording (50 microsecond sampling interval), a timestamp of 200 corresponds to 200x0.000050s=0.01s from the beginning of the recording session. Notice that the last line must end with a newline or carriage return. """ class KlustaKwikIO(BaseIO): """Reading and writing from KlustaKwik-format files.""" # Class variables demonstrating capabilities of this IO is_readable = True is_writable = True # This IO can only manipulate objects relating to spike times supported_objects = [Block, SpikeTrain, Unit] # Keep things simple by always returning a block readable_objects = [Block] # And write a block writeable_objects = [Block] # Not sure what these do, if anything has_header = False is_streameable = False # GUI params read_params = {} # GUI params write_params = {} # The IO name and the file extensions it uses name = 'KlustaKwik' extensions = ['fet', 'clu', 'res', 'spk'] # Operates on directories mode = 'file' def __init__(self, filename, sampling_rate=30000.): """Create a new IO to operate on a directory filename : the directory to contain the files basename : string, basename of KlustaKwik format, or None sampling_rate : in Hz, necessary because the KlustaKwik files stores data in samples. """ if not HAVE_MLAB: raise MLAB_ERR BaseIO.__init__(self) #self.filename = os.path.normpath(filename) self.filename, self.basename = os.path.split(os.path.abspath(filename)) self.sampling_rate = float(sampling_rate) # error check if not os.path.isdir(self.filename): raise ValueError("filename must be a directory") # initialize a helper object to parse filenames self._fp = FilenameParser(dirname=self.filename, basename=self.basename) # The reading methods. The `lazy` and `cascade` parameters are imposed # by neo.io API def read_block(self, lazy=False, cascade=True): """Returns a Block containing spike information. There is no obvious way to infer the segment boundaries from raw spike times, so for now all spike times are returned in one big segment. The way around this would be to specify the segment boundaries, and then change this code to put the spikes in the right segments. """ # Create block and segment to hold all the data block = Block() # Search data directory for KlustaKwik files. # If nothing found, return empty block self._fetfiles = self._fp.read_filenames('fet') self._clufiles = self._fp.read_filenames('clu') if len(self._fetfiles) == 0 or not cascade: return block # Create a single segment to hold all of the data seg = Segment(name='seg0', index=0, file_origin=self.filename) block.segments.append(seg) # Load spike times from each group and store in a dict, keyed # by group number self.spiketrains = dict() for group in sorted(self._fetfiles.keys()): # Load spike times fetfile = self._fetfiles[group] spks, features = self._load_spike_times(fetfile) # Load cluster ids or generate if group in self._clufiles: clufile = self._clufiles[group] uids = self._load_unit_id(clufile) else: # unclustered data, assume all zeros uids = np.zeros(spks.shape, dtype=np.int32) # error check if len(spks) != len(uids): raise ValueError("lengths of fet and clu files are different") # Create Unit for each cluster unique_unit_ids = np.unique(uids) for unit_id in sorted(unique_unit_ids): # Initialize the unit u = Unit(name=('unit %d from group %d' % (unit_id, group)), index=unit_id, group=group) # Initialize a new SpikeTrain for the spikes from this unit if lazy: st = SpikeTrain( times=[], units='sec', t_start=0.0, t_stop=spks.max() / self.sampling_rate, name=('unit %d from group %d' % (unit_id, group))) st.lazy_shape = len(spks[uids==unit_id]) else: st = SpikeTrain( times=spks[uids==unit_id] / self.sampling_rate, units='sec', t_start=0.0, t_stop=spks.max() / self.sampling_rate, name=('unit %d from group %d' % (unit_id, group))) st.annotations['cluster'] = unit_id st.annotations['group'] = group # put features in if not lazy and len(features) != 0: st.annotations['waveform_features'] = features # Link u.spiketrains.append(st) seg.spiketrains.append(st) create_many_to_one_relationship(block) return block # Helper hidden functions for reading def _load_spike_times(self, fetfilename): """Reads and returns the spike times and features""" f = file(fetfilename, 'r') # Number of clustering features is integer on first line nbFeatures = int(f.readline().strip()) # Each subsequent line consists of nbFeatures values, followed by # the spike time in samples. names = ['fet%d' % n for n in xrange(nbFeatures)] names.append('spike_time') # Load into recarray data = mlab.csv2rec(f, names=names, skiprows=1, delimiter=' ') f.close() # get features features = np.array([data['fet%d' % n] for n in xrange(nbFeatures)]) # Return the spike_time column return data['spike_time'], features.transpose() def _load_unit_id(self, clufilename): """Reads and return the cluster ids as int32""" f = file(clufilename, 'r') # Number of clusters on this tetrode is integer on first line nbClusters = int(f.readline().strip()) # Read each cluster name as a string cluster_names = f.readlines() f.close() # Convert names to integers # I think the spec requires cluster names to be integers, but # this code could be modified to support string names which are # auto-numbered. try: cluster_ids = [int(name) for name in cluster_names] except ValueError: raise ValueError( "Could not convert cluster name to integer in %s" % clufilename) # convert to numpy array and error check cluster_ids = np.array(cluster_ids, dtype=np.int32) if len(np.unique(cluster_ids)) != nbClusters: logging.warning("warning: I got %d clusters instead of %d in %s" % ( len(np.unique(cluster_ids)), nbClusters, clufilename)) return cluster_ids # writing functions def write_block(self, block): """Write spike times and unit ids to disk. Currently descends hierarchy from block to segment to spiketrain. Then gets group and cluster information from spiketrain. Then writes the time and cluster info to the file associated with that group. The group and cluster information are extracted from annotations, eg `sptr.annotations['group']`. If no cluster information exists, it is assigned to cluster 0. Note that all segments are essentially combined in this process, since the KlustaKwik format does not allow for segment boundaries. As implemented currently, does not use the `Unit` object at all. We first try to use the sampling rate of each SpikeTrain, or if this is not set, we use `self.sampling_rate`. If the files already exist, backup copies are created by appending the filenames with a "~". """ # set basename if self.basename is None: logging.warning("warning: no basename provided, using `basename`") self.basename = 'basename' # First create file handles for each group which will be stored self._make_all_file_handles(block) # We'll detect how many features belong in each group self._group2features = {} # Iterate through segments in this block for seg in block.segments: # Write each spiketrain of the segment for st in seg.spiketrains: # Get file handles for this spiketrain using its group group = self.st2group(st) fetfilehandle = self._fetfilehandles[group] clufilehandle = self._clufilehandles[group] # Get the id to write to clu file for this spike train cluster = self.st2cluster(st) # Choose sampling rate to convert to samples try: sr = st.annotations['sampling_rate'] except KeyError: sr = self.sampling_rate # Convert to samples spike_times_in_samples = np.rint( np.array(st) * sr).astype(np.int) # Try to get features from spiketrain try: all_features = st.annotations['waveform_features'] except KeyError: # Use empty all_features = [ [] for _ in range(len(spike_times_in_samples))] all_features = np.asarray(all_features) if all_features.ndim != 2: raise ValueError("waveform features should be 2d array") # Check number of features we're supposed to have try: n_features = self._group2features[group] except KeyError: # First time through .. set number of features n_features = all_features.shape[1] self._group2features[group] = n_features # and write to first line of file fetfilehandle.write("%d\n" % n_features) if n_features != all_features.shape[1]: raise ValueError("inconsistent number of features: " + "supposed to be %d but I got %d" %\ (n_features, all_features.shape[1])) # Write features and time for each spike for stt, features in zip(spike_times_in_samples, all_features): # first features for val in features: fetfilehandle.write(str(val)) fetfilehandle.write(" ") # now time fetfilehandle.write("%d\n" % stt) # and cluster id clufilehandle.write("%d\n" % cluster) # We're done, so close the files self._close_all_files() # Helper functions for writing def st2group(self, st): # Not sure this is right so make it a method in case we change it try: return st.annotations['group'] except KeyError: return 0 def st2cluster(self, st): # Not sure this is right so make it a method in case we change it try: return st.annotations['cluster'] except KeyError: return 0 def _make_all_file_handles(self, block): """Get the tetrode (group) of each neuron (cluster) by descending the hierarchy through segment and block. Store in a dict {group_id: list_of_clusters_in_that_group} """ group2clusters = {} for seg in block.segments: for st in seg.spiketrains: group = self.st2group(st) cluster = self.st2cluster(st) if group in group2clusters: if cluster not in group2clusters[group]: group2clusters[group].append(cluster) else: group2clusters[group] = [cluster] # Make new file handles for each group self._fetfilehandles, self._clufilehandles = {}, {} for group, clusters in group2clusters.items(): self._new_group(group, nbClusters=len(clusters)) def _new_group(self, id_group, nbClusters): # generate filenames fetfilename = os.path.join(self.filename, self.basename + ('.fet.%d' % id_group)) clufilename = os.path.join(self.filename, self.basename + ('.clu.%d' % id_group)) # back up before overwriting if os.path.exists(fetfilename): shutil.copyfile(fetfilename, fetfilename + '~') if os.path.exists(clufilename): shutil.copyfile(clufilename, clufilename + '~') # create file handles self._fetfilehandles[id_group] = file(fetfilename, 'w') self._clufilehandles[id_group] = file(clufilename, 'w') # write out first line #self._fetfilehandles[id_group].write("0\n") # Number of features self._clufilehandles[id_group].write("%d\n" % nbClusters) def _close_all_files(self): for val in self._fetfilehandles.values(): val.close() for val in self._clufilehandles.values(): val.close() class FilenameParser: """Simple class to interpret user's requests into KlustaKwik filenames""" def __init__(self, dirname, basename=None): """Initialize a new parser for a directory containing files dirname: directory containing files basename: basename in KlustaKwik format spec If basename is left None, then files with any basename in the directory will be used. An error is raised if files with multiple basenames exist in the directory. """ self.dirname = os.path.normpath(dirname) self.basename = basename # error check if not os.path.isdir(self.dirname): raise ValueError("filename must be a directory") def read_filenames(self, typestring='fet'): """Returns filenames in the data directory matching the type. Generally, `typestring` is one of the following: 'fet', 'clu', 'spk', 'res' Returns a dict {group_number: filename}, e.g.: { 0: 'basename.fet.0', 1: 'basename.fet.1', 2: 'basename.fet.2'} 'basename' can be any string not containing whitespace. Only filenames that begin with "basename.typestring." and end with a sequence of digits are valid. The digits are converted to an integer and used as the group number. """ all_filenames = glob.glob(os.path.join(self.dirname, '*')) # Fill the dict with valid filenames d = {} for v in all_filenames: # Test whether matches format, ie ends with digits split_fn = os.path.split(v)[1] m = glob.re.search(('^(\w+)\.%s\.(\d+)$' % typestring), split_fn) if m is not None: # get basename from first hit if not specified if self.basename is None: self.basename = m.group(1) # return files with correct basename if self.basename == m.group(1): # Key the group number to the filename # This conversion to int should always work since only # strings of digits will match the regex tetn = int(m.group(2)) d[tetn] = v return d neo-0.3.3/neo/io/pickleio.py0000644000175000017500000000216512265516260016714 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Module for reading/writing data from/to Python pickle format. Class: PickleIO Supported: Read/Write Authors: Andrew Davison """ try: import cPickle as pickle # Python 2 except ImportError: import pickle # Python 3 from neo.io.baseio import BaseIO from neo.core import (Block, Segment, AnalogSignal, AnalogSignalArray, SpikeTrain) class PickleIO(BaseIO): """ """ is_readable = True is_writable = True has_header = False is_streameable = False # TODO - correct spelling to "is_streamable" supported_objects = [Block, Segment, AnalogSignal, AnalogSignalArray, SpikeTrain] # should extend to Epoch, etc. readable_objects = supported_objects writeable_objects = supported_objects mode = 'file' name = "Python pickle file" extensions = ['pkl', 'pickle'] def read_block(self, lazy=False, cascade=True): with open(self.filename, "rb") as fp: block = pickle.load(fp) return block def write_block(self, block): with open(self.filename, "wb") as fp: pickle.dump(block, fp) neo-0.3.3/neo/io/elphyio.py0000644000175000017500000046702412273723542016601 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ README ===================================================================================== This is the implementation of the NEO IO for Elphy files. IO dependencies: - NEO - types - numpy - quantities Quick reference: ===================================================================================== Class ElphyIO() with methods read_block() and write_block() are implemented. This classes represent the way to access and produce Elphy files from NEO objects. As regards reading an existing Elphy file, start by initializing a IO class with it: >>> import neo >>> r = neo.io.ElphyIO( filename="Elphy.DAT" ) >>> r Read the file content into NEO object Block: >>> bl = r.read_block(lazy=False, cascade=True) >>> bl Now you can then read all Elphy data as NEO objects: >>> b1.segments [, , , ] >>> bl.segments[0].analogsignals[0] These functions return NEO objects, completely "detached" from the original Elphy file. Changes to the runtime objects will not cause any changes in the file. Having already existing NEO structures, it is possible to write them as an Elphy file. For example, given a segment: >>> s = neo.Segment() filled with other NEO structures: >>> import numpy as np >>> import quantities as pq >>> a = AnalogSignal( signal=np.random.rand(300), t_start=42*pq.ms) >>> s.analogsignals.append( a ) and added to a newly created NEO Block: >>> bl = neo.Block() >>> bl.segments.append( s ) Then, it's easy to create an Elphy file: >>> r = neo.io.ElphyIO( filename="ElphyNeoTest.DAT" ) >>> r.write_block( bl ) Author: Thierry Brizzi Domenico Guarino """ # needed for python 3 compatibility from __future__ import absolute_import # python commons: from datetime import datetime from fractions import gcd from os import path import re import struct from time import time # note neo.core needs only numpy and quantities import numpy as np import quantities as pq # I need to subclass BaseIO from neo.io.baseio import BaseIO # to import from core from neo.core import (Block, Segment, RecordingChannelGroup, RecordingChannel, AnalogSignal, AnalogSignalArray, EventArray, SpikeTrain) # some tools to finalize the hierachy from neo.io.tools import create_many_to_one_relationship # -------------------------------------------------------- # OBJECTS class ElphyScaleFactor(object): """ Useful to retrieve real values from integer ones that are stored in an Elphy file : ``scale`` : compute the actual value of a sample with this following formula : ``delta`` * value + ``offset`` """ def __init__(self, delta, offset): self.delta = delta self.offset = offset def scale(self, value): return value * self.delta + self.offset class BaseSignal(object): """ A descriptor storing main signal properties : ``layout`` : the :class:``ElphyLayout` object that extracts data from a file. ``episode`` : the episode in which the signal has been acquired. ``sampling_frequency`` : the sampling frequency of the analog to digital converter. ``sampling_period`` : the sampling period of the analog to digital converter computed from sampling_frequency. ``t_start`` : the start time of the signal acquisition. ``t_stop`` : the end time of the signal acquisition. ``duration`` : the duration of the signal acquisition computed from t_start and t_stop. ``n_samples`` : the number of sample acquired during the recording computed from the duration and the sampling period. ``name`` : a label to identify the signal. ``data`` : a property triggering data extraction. """ def __init__(self, layout, episode, sampling_frequency, start, stop, name=None): self.layout = layout self.episode = episode self.sampling_frequency = sampling_frequency self.sampling_period = 1 / sampling_frequency self.t_start = start self.t_stop = stop self.duration = self.t_stop - self.t_start self.n_samples = int(self.duration / self.sampling_period) self.name = name @property def data(self): raise NotImplementedError('must be overloaded in subclass') class ElphySignal(BaseSignal): """ Subclass of :class:`BaseSignal` corresponding to Elphy's analog channels : ``channel`` : the identifier of the analog channel providing the signal. ``units`` : an array containing x and y coordinates units. ``x_unit`` : a property to access the x-coordinates unit. ``y_unit`` : a property to access the y-coordinates unit. ``data`` : a property that delegate data extraction to the ``get_signal_data`` function of the ```layout`` object. """ def __init__(self, layout, episode, channel, x_unit, y_unit, sampling_frequency, start, stop, name=None): super(ElphySignal, self).__init__(layout, episode, sampling_frequency, start, stop, name) self.channel = channel self.units = [x_unit, y_unit] def __str__(self): return "%s ep_%s ch_%s [%s, %s]" % (self.layout.file.name, self.episode, self.channel, self.x_unit, self.y_unit) def __repr__(self): return self.__str__() @property def x_unit(self): """ Return the x-coordinate of the signal. """ return self.units[0] @property def y_unit(self): """ Return the y-coordinate of the signal. """ return self.units[1] @property def data(self): return self.layout.get_signal_data(self.episode, self.channel) class ElphyTag(BaseSignal): """ Subclass of :class:`BaseSignal` corresponding to Elphy's tag channels : ``number`` : the identifier of the tag channel. ``x_unit`` : the unit of the x-coordinate. """ def __init__(self, layout, episode, number, x_unit, sampling_frequency, start, stop, name=None): super(ElphyTag, self).__init__(layout, episode, sampling_frequency, start, stop, name) self.number = number self.units = [x_unit, None] def __str__(self): return "%s : ep_%s tag_ch_%s [%s]" % (self.layout.file.name, self.episode, self.number, self.x_unit) def __repr__(self): return self.__str__() @property def x_unit(self): """ Return the x-coordinate of the signal. """ return self.units[0] @property def data(self): return self.layout.get_tag_data(self.episode, self.number) @property def channel(self): return self.number class ElphyEvent(object): """ A descriptor that store a set of events properties : ``layout`` : the :class:``ElphyLayout` object that extracts data from a file. ``episode`` : the episode in which the signal has been acquired. ``number`` : the identifier of the channel. ``x_unit`` : the unit of the x-coordinate. ``n_events`` : the number of events. ``name`` : a label to identify the event. ``times`` : a property triggering event times extraction. """ def __init__(self, layout, episode, number, x_unit, n_events, ch_number=None, name=None): self.layout = layout self.episode = episode self.number = number self.x_unit = x_unit self.n_events = n_events self.name = name self.ch_number = ch_number def __str__(self): return "%s : ep_%s evt_ch_%s [%s]" % (self.layout.file.name, self.episode, self.number, self.x_unit) def __repr__(self): return self.__str__() @property def channel(self): return self.number @property def times(self): return self.layout.get_event_data(self.episode, self.number) @property def data(self): return self.times class ElphySpikeTrain(ElphyEvent): """ A descriptor that store spiketrain properties : ``wf_samples`` : number of samples composing waveforms. ``wf_sampling_frequency`` : sampling frequency of waveforms. ``wf_sampling_period`` : sampling period of waveforms. ``wf_units`` : the units of the x and y coordinates of waveforms. ``t_start`` : the time before the arrival of the spike which corresponds to the starting time of a waveform. ``name`` : a label to identify the event. ``times`` : a property triggering event times extraction. ``waveforms`` : a property triggering waveforms extraction. """ def __init__(self, layout, episode, number, x_unit, n_events, wf_sampling_frequency, wf_samples, unit_x_wf, unit_y_wf, t_start, name=None): super(ElphySpikeTrain, self).__init__(layout, episode, number, x_unit, n_events, name) self.wf_samples = wf_samples self.wf_sampling_frequency = wf_sampling_frequency assert wf_sampling_frequency, "bad sampling frequency" self.wf_sampling_period = 1.0 / wf_sampling_frequency self.wf_units = [unit_x_wf, unit_y_wf] self.t_start = t_start @property def x_unit_wf(self): """ Return the x-coordinate of waveforms. """ return self.wf_units[0] @property def y_unit_wf(self): """ Return the y-coordinate of waveforms. """ return self.wf_units[1] @property def times(self): return self.layout.get_spiketrain_data(self.episode, self.number) @property def waveforms(self): return self.layout.get_waveform_data(self.episode, self.number) if self.wf_samples else None # -------------------------------------------------------- # BLOCKS class BaseBlock(object): """ Represent a chunk of file storing metadata or raw data. A convenient class to break down the structure of an Elphy file to several building blocks : ``layout`` : the layout containing the block. ``identifier`` : the label that identified the block. ``size`` : the size of the block. ``start`` : the file index corresponding to the starting byte of the block. ``end`` : the file index corresponding to the ending byte of the block NB : Subclassing this class is a convenient way to set the properties using polymorphism rather than a conditional structure. By this way each :class:`BaseBlock` type know how to iterate through the Elphy file and store interesting data. """ def __init__(self, layout, identifier, start, size): self.layout = layout self.identifier = identifier self.size = size self.start = start self.end = self.start + self.size - 1 class ElphyBlock(BaseBlock): """ A subclass of :class:`BaseBlock`. Useful to store the location and size of interesting data within a block : ``parent_block`` : the parent block containing the block. ``header_size`` : the size of the header permitting the identification of the type of the block. ``data_offset`` : the file index located after the block header. ``data_size`` : the size of data located after the header. ``sub_blocks`` : the sub-blocks contained by the block. """ def __init__(self, layout, identifier, start, size, fixed_length=None, size_format="i", parent_block=None): super(ElphyBlock, self).__init__(layout, identifier, start, size) # a block may be a sub-block of another block self.parent_block = parent_block # pascal language store strings in 2 different ways # ... first, if in the program the size of the string is # specified (fixed) then the file stores the length # of the string and allocate a number of bytes equal # to the specified size # ... if this size is not specified the length of the # string is also stored but the file allocate dynamically # a number of bytes equal to the actual size of the string l_ident = len(self.identifier) if fixed_length : l_ident += (fixed_length - l_ident) self.header_size = l_ident + 1 + type_dict[size_format] # starting point of data located in the block self.data_offset = self.start + self.header_size self.data_size = self.size - self.header_size # a block may have sub-blocks # it is to subclasses to initialize # this property self.sub_blocks = list() def __repr__(self): return "%s : size = %s, start = %s, end = %s" % (self.identifier, self.size, self.start, self.end) def add_sub_block(self, block): """ Append a block to the sub-block list. """ self.sub_blocks.append(block) class FileInfoBlock(ElphyBlock): """ Base class of all subclasses whose the purpose is to extract user file info stored into an Elphy file : ``header`` : the header block relative to the block. ``file`` : the file containing the block. NB : User defined metadata are not really practical. An Elphy script must know the order of metadata storage to know exactly how to retrieve these data. That's why it is necessary to subclass and reproduce elphy script commands to extract metadata relative to a protocol. Consequently managing a new protocol implies to refactor the file info extraction. """ def __init__(self, layout, identifier, start, size, fixed_length=None, size_format="i", parent_block=None): super(FileInfoBlock, self).__init__(layout, identifier, start, size, fixed_length, size_format, parent_block=parent_block) self.header = None self.file = self.layout.file def get_protocol_and_version(self): """ Return a tuple useful to identify the kind of protocol that has generated a file during data acquisition. """ raise Exception("must be overloaded in a subclass") def get_user_file_info(self): """ Return a dictionary containing all user file info stored in the file. """ raise Exception("must be overloaded in a subclass") def get_sparsenoise_revcor(self): """ Return 'REVCOR' user file info. This method is common to :class:`ClassicFileInfo` and :class:`MultistimFileInfo` because the last one is able to store this kind of metadata. """ header = dict() header['n_div_x'] = read_from_char(self.file, 'h') header['n_div_y'] = read_from_char(self.file, 'h') header['gray_levels'] = read_from_char(self.file, 'h') header['position_x'] = read_from_char(self.file, 'ext') header['position_y'] = read_from_char(self.file, 'ext') header['length'] = read_from_char(self.file, 'ext') header['width'] = read_from_char(self.file, 'ext') header['orientation'] = read_from_char(self.file, 'ext') header['expansion'] = read_from_char(self.file, 'h') header['scotoma'] = read_from_char(self.file, 'h') header['seed'] = read_from_char(self.file, 'h') #dt_on and dt_off may not exist in old revcor formats rollback = self.file.tell() header['dt_on'] = read_from_char(self.file, 'ext') if header['dt_on'] is None : self.file.seek(rollback) rollback = self.file.tell() header['dt_off'] = read_from_char(self.file, 'ext') if header['dt_off'] is None : self.file.seek(rollback) return header class ClassicFileInfo(FileInfoBlock): """ Extract user file info stored into an Elphy file corresponding to sparse noise (revcor), moving bar and flashbar protocols. """ def detect_protocol_from_name(self, path): pattern = "\d{4}(\d+|\D)\D" codes = { 'r':'sparsenoise', 'o':'movingbar', 'f':'flashbar', 'm':'multistim' # here just for assertion } filename = path.split(path)[1] match = re.search(pattern, path) if hasattr(match, 'end') : code = codes.get(path[match.end() - 1].lower(), None) assert code != 'm', "multistim file detected" return code elif 'spt' in filename.lower() : return 'spontaneousactivity' else : return None def get_protocol_and_version(self): if self.layout and self.layout.info_block : self.file.seek(self.layout.info_block.data_offset) version = self.get_title() if version in ['REVCOR1', 'REVCOR2', 'REVCOR + PAIRING'] : name = "sparsenoise" elif version in ['BARFLASH'] : name = "flashbar" elif version in ['ORISTIM', 'ORISTM', 'ORISTM1', 'ORITUN'] : name = "movingbar" else : name = self.detect_protocol_from_name(self.file.name) self.file.seek(0) return name, version return None, None def get_title(self): title_length, title = struct.unpack('= 2) : name = None version = None else : if center == 2 : name = "sparsenoise" elif center == 3 : name = "densenoise" elif center == 4 : name = "densenoise" elif center == 5 : name = "grating" else : name = None version = None self.file.seek(0) return name, version return None, None def get_title(self): title_length = read_from_char(self.file, 'B') title, = struct.unpack('<%ss' % title_length, self.file.read(title_length)) self.file.seek(self.file.tell() + 255 - title_length) return unicode(title) def get_user_file_info(self): header = dict() if self.layout and self.layout.info_block : # go to the info_block sub_block = self.layout.info_block self.file.seek(sub_block.data_offset) #get the first four parameters acqLGN = read_from_char(self.file, 'i') center = read_from_char(self.file, 'i') surround = read_from_char(self.file, 'i') #store info in the header header['acqLGN'] = acqLGN header['center'] = center header['surround'] = surround if not (header['surround'] >= 2) : header.update(self.get_center_header(center)) self.file.seek(0) return header def get_center_header(self, code): #get file info corresponding #to the executed protocol #for the center first ... if code == 0 : return self.get_sparsenoise_revcor() elif code == 2 : return self.get_sparsenoise_center() elif code == 3 : return self.get_densenoise_center(True) elif code == 4 : return self.get_densenoise_center(False) elif code == 5 : return dict() # return self.get_grating_center() else : return dict() def get_surround_header(self, code): #then the surround if code == 2 : return self.get_sparsenoise_surround() elif code == 3 : return self.get_densenoise_surround(True) elif code == 4 : return self.get_densenoise_surround(False) elif code == 5 : raise NotImplementedError() return self.get_grating_center() else : return dict() def get_center_surround(self, center, surround): header = dict() header['stim_center'] = self.get_center_header(center) header['stim_surround'] = self.get_surround_header(surround) return header def get_sparsenoise_center(self): header = dict() header['title'] = self.get_title() header['number_of_sequences'] = read_from_char(self.file, 'i') header['pretrigger_duration'] = read_from_char(self.file, 'ext') header['n_div_x'] = read_from_char(self.file, 'h') header['n_div_y'] = read_from_char(self.file, 'h') header['gray_levels'] = read_from_char(self.file, 'h') header['position_x'] = read_from_char(self.file, 'ext') header['position_y'] = read_from_char(self.file, 'ext') header['length'] = read_from_char(self.file, 'ext') header['width'] = read_from_char(self.file, 'ext') header['orientation'] = read_from_char(self.file, 'ext') header['expansion'] = read_from_char(self.file, 'h') header['scotoma'] = read_from_char(self.file, 'h') header['seed'] = read_from_char(self.file, 'h') header['luminance_1'] = read_from_char(self.file, 'ext') header['luminance_2'] = read_from_char(self.file, 'ext') header['dt_count'] = read_from_char(self.file, 'i') dt_array = list() for _ in range(0, header['dt_count']) : dt_array.append(read_from_char(self.file, 'ext')) header['dt_on'] = dt_array if dt_array else None header['dt_off'] = read_from_char(self.file, 'ext') return header def get_sparsenoise_surround(self): header = dict() header['title_surround'] = self.get_title() header['gap'] = read_from_char(self.file, 'ext') header['n_div_x'] = read_from_char(self.file, 'h') header['n_div_y'] = read_from_char(self.file, 'h') header['gray_levels'] = read_from_char(self.file, 'h') header['expansion'] = read_from_char(self.file, 'h') header['scotoma'] = read_from_char(self.file, 'h') header['seed'] = read_from_char(self.file, 'h') header['luminance_1'] = read_from_char(self.file, 'ext') header['luminance_2'] = read_from_char(self.file, 'ext') header['dt_on'] = read_from_char(self.file, 'ext') header['dt_off'] = read_from_char(self.file, 'ext') return header def get_densenoise_center(self, is_binary): header = dict() header['stimulus_type'] = "B" if is_binary else "T" header['title'] = self.get_title() _tmp = read_from_char(self.file, 'i') header['number_of_sequences'] = _tmp if _tmp < 0 else None rollback = self.file.tell() header['stimulus_duration'] = read_from_char(self.file, 'ext') if header['stimulus_duration'] is None : self.file.seek(rollback) header['pretrigger_duration'] = read_from_char(self.file, 'ext') header['n_div_x'] = read_from_char(self.file, 'h') header['n_div_y'] = read_from_char(self.file, 'h') header['position_x'] = read_from_char(self.file, 'ext') header['position_y'] = read_from_char(self.file, 'ext') header['length'] = read_from_char(self.file, 'ext') header['width'] = read_from_char(self.file, 'ext') header['orientation'] = read_from_char(self.file, 'ext') header['expansion'] = read_from_char(self.file, 'h') header['seed'] = read_from_char(self.file, 'h') header['luminance_1'] = read_from_char(self.file, 'ext') header['luminance_2'] = read_from_char(self.file, 'ext') header['dt_on'] = read_from_char(self.file, 'ext') header['dt_off'] = read_from_char(self.file, 'ext') return header def get_densenoise_surround(self, is_binary): header = dict() header['title_surround'] = self.get_title() header['gap'] = read_from_char(self.file, 'ext') header['n_div_x'] = read_from_char(self.file, 'h') header['n_div_y'] = read_from_char(self.file, 'h') header['expansion'] = read_from_char(self.file, 'h') header['seed'] = read_from_char(self.file, 'h') header['luminance_1'] = read_from_char(self.file, 'ext') header['luminance_2'] = read_from_char(self.file, 'ext') header['dt_on'] = read_from_char(self.file, 'ext') header['dt_off'] = read_from_char(self.file, 'ext') return header def get_grating_center(self): pass def get_grating_surround(self): pass class Header(ElphyBlock): """ A convenient subclass of :class:`Block` to store Elphy file header properties. NB : Subclassing this class is a convenient way to set the properties of the header using polymorphism rather than a conditional structure. """ def __init__(self, layout, identifier, size, fixed_length=None, size_format="i"): super(Header, self).__init__(layout, identifier, 0, size, fixed_length, size_format) class Acquis1Header(Header): """ A subclass of :class:`Header` used to identify the 'ACQUIS1/GS/1991' format. Whereas more recent format, the header contains all data relative to episodes, channels and traces : ``n_channels`` : the number of acquisition channels. ``nbpt`` and ``nbptEx`` : parameters useful to compute the number of samples by episodes. ``tpData`` : the data format identifier used to compute sample size. ``x_unit`` : the x-coordinate unit for all channels in an episode. ``y_units`` : an array containing y-coordinate units for each channel in the episode. ``dX`` and ``X0`` : the scale factors necessary to retrieve the actual times relative to each sample in a channel. ``dY_ar`` and ``Y0_ar``: arrays of scale factors necessary to retrieve the actual values relative to samples. ``continuous`` : a boolean telling if the file has been acquired in continuous mode. ``preSeqI`` : the size in bytes of the data preceding raw data. ``postSeqI`` : the size in bytes of the data preceding raw data. ``dat_length`` : the length in bytes of the data in the file. ``sample_size`` : the size in bytes of a sample. ``n_samples`` : the number of samples. ``ep_size`` : the size in bytes of an episode. ``n_episodes`` : the number of recording sequences store in the file. NB : The size is read from the file, the identifier is a string containing 15 characters and the size is encoded as small integer. See file 'FicDefAc1.pas' to identify the parsed parameters. """ def __init__(self, layout): fileobj = layout.file super(Acquis1Header, self).__init__(layout, "ACQUIS1/GS/1991", 1024, 15, "h") #parse the header to store interesting data about episodes and channels fileobj.seek(18) #extract episode properties n_channels = read_from_char(fileobj, 'B') assert not ((n_channels < 1) or (n_channels > 16)), "bad number of channels" nbpt = read_from_char(fileobj, 'h') l_xu, x_unit = struct.unpack('= self.end : tagShift = 0 else : tagShift = read_from_char(layout.file, 'B') #setup object properties self.n_channels = n_channels self.nbpt = nbpt self.tpData = tpData self.x_unit = xu[0:l_xu] self.dX = dX self.X0 = X0 self.y_units = y_units[0:n_channels] self.dY_ar = dY_ar[0:n_channels] self.Y0_ar = Y0_ar[0:n_channels] self.continuous = continuous if self.continuous : self.preSeqI = 0 self.postSeqI = 0 else : self.preSeqI = preSeqI self.postSeqI = postSeqI self.varEp = varEp self.withTags = withTags if not self.withTags : self.tagShift = 0 else : if tagShift == 0 : self.tagShift = 4 else : self.tagShift = tagShift self.sample_size = type_dict[types[self.tpData]] self.dat_length = self.layout.file_size - self.layout.data_offset if self.continuous : if self.n_channels > 0 : self.n_samples = self.dat_length / (self.n_channels * self.sample_size) else : self.n_samples = 0 else : self.n_samples = self.nbpt self.ep_size = self.preSeqI + self.postSeqI + self.n_samples * self.sample_size * self.n_channels self.n_episodes = self.dat_length / self.ep_size if (self.n_samples != 0) else 0 class DAC2GSEpisodeBlock(ElphyBlock): """ Subclass of :class:`Block` useful to store data corresponding to 'DAC2SEQ' blocks stored in the DAC2/GS/2000 format. ``n_channels`` : the number of acquisition channels. ``nbpt`` : the number of samples by episodes. ``tpData`` : the data format identifier used to compute the sample size. ``x_unit`` : the x-coordinate unit for all channels in an episode. ``y_units`` : an array containing y-coordinate units for each channel in the episode. ``dX`` and ``X0`` : the scale factors necessary to retrieve the actual times relative to each sample in a channel. ``dY_ar`` and ``Y0_ar``: arrays of scale factors necessary to retrieve the actual values relative to samples. ``postSeqI`` : the size in bytes of the data preceding raw data. NB : see file 'FdefDac2.pas' to identify the parsed parameters. """ def __init__(self, layout, identifier, start, size, fixed_length=None, size_format="i"): main = layout.main_block n_channels, nbpt, tpData, postSeqI = struct.unpack(' 0] for data_block in blocks : self.file.seek(data_block.start) raw = self.file.read(data_block.size)[0:expected_size] databytes = np.frombuffer(raw, dtype=dtype) chunks.append(databytes) # concatenate all chunks and return # the specified slice if len(chunks)>0 : databytes = np.concatenate(chunks) return databytes[start:end] else : return np.array([]) def reshape_bytes(self, databytes, reshape, datatypes, order='<'): """ Reshape a numpy array containing a set of databytes. """ assert datatypes and len(datatypes) == len(reshape), "datatypes are not well defined" l_bytes = len(databytes) #create the mask for each shape shape_mask = list() for shape in reshape : for _ in xrange(1, shape + 1) : shape_mask.append(shape) #create a set of masks to extract data bit_masks = list() for shape in reshape : bit_mask = list() for value in shape_mask : bit = 1 if (value == shape) else 0 bit_mask.append(bit) bit_masks.append(np.array(bit_mask)) #extract data n_samples = l_bytes / np.sum(reshape) data = np.empty([len(reshape), n_samples], dtype=(int, int)) for index, bit_mask in enumerate(bit_masks) : tmp = self.filter_bytes(databytes, bit_mask) tp = '%s%s%s' % (order, datatypes[index], reshape[index]) data[index] = np.frombuffer(tmp, dtype=tp) return data.T def filter_bytes(self, databytes, bit_mask): """ Detect from a bit mask which bits to keep to recompose the signal. """ n_bytes = len(databytes) mask = np.ones(n_bytes, dtype=int) np.putmask(mask, mask, bit_mask) to_keep = np.where(mask > 0)[0] return databytes.take(to_keep) def load_channel_data(self, ep, ch): """ Return a numpy array containing the list of bytes corresponding to the specified episode and channel. """ #memorise the sample size and symbol sample_size = self.sample_size(ep, ch) sample_symbol = self.sample_symbol(ep, ch) #create a bit mask to define which #sample to keep from the file bit_mask = self.create_bit_mask(ep, ch) #load all bytes contained in an episode data_blocks = self.get_data_blocks(ep) databytes = self.load_bytes(data_blocks) raw = self.filter_bytes(databytes, bit_mask) #reshape bytes from the sample size dt = np.dtype(numpy_map[sample_symbol]) dt.newbyteorder('<') return np.frombuffer(raw.reshape([len(raw) / sample_size, sample_size]), dt) def apply_op(self, np_array, value, op_type): """ A convenient function to apply an operator over all elements of a numpy array. """ if op_type == "shift_right" : return np_array >> value elif op_type == "shift_left" : return np_array << value elif op_type == "mask" : return np_array & value else : return np_array def get_tag_mask(self, tag_ch, tag_mode): """ Return a mask useful to retrieve bits that encode a tag channel. """ if tag_mode == 1 : tag_mask = 0b01 if (tag_ch == 1) else 0b10 elif tag_mode in [2, 3] : ar_mask = np.zeros(16, dtype=int) ar_mask[tag_ch - 1] = 1 st = "0b" + ''.join(np.array(np.flipud(ar_mask), dtype=str)) tag_mask = eval(st) return tag_mask def load_encoded_tags(self, ep, tag_ch): """ Return a numpy array containing bytes corresponding to the specified episode and channel. """ tag_mode = self.tag_mode(ep) tag_mask = self.get_tag_mask(tag_ch, tag_mode) if tag_mode in [1, 2] : #digidata or itc mode #available for all formats ch = self.get_channel_for_tags(ep) raw = self.load_channel_data(ep, ch) return self.apply_op(raw, tag_mask, "mask") elif tag_mode == 3 : #cyber k mode #only available for DAC2 objects format #store bytes corresponding to the blocks #containing tags in a numpy array and reshape #it to have a set of tuples (time, value) ck_blocks = self.get_blocks_of_type(ep, 'RCyberTag') databytes = self.load_bytes(ck_blocks) raw = self.reshape_bytes(databytes, reshape=(4, 2), datatypes=('u', 'u'), order='<') #keep only items that are compatible #with the specified tag channel raw[:, 1] = self.apply_op(raw[:, 1], tag_mask, "mask") #computing numpy.diff is useful to know #how many times a value is maintained #and necessary to reconstruct the #compressed signal ... repeats = np.array(np.diff(raw[:, 0]), dtype=int) data = np.repeat(raw[:-1, 1], repeats, axis=0) # ... note that there is always #a transition at t=0 for synchronisation #purpose, consequently it is not necessary #to complete with zeros when the first #transition arrive ... return data def load_encoded_data(self, ep, ch): """ Get encoded value of raw data from the elphy file. """ tag_shift = self.tag_shift(ep) data = self.load_channel_data(ep, ch) if tag_shift : return self.apply_op(data, tag_shift, "shift_right") else : return data def get_signal_data(self, ep, ch): """ Return a numpy array containing all samples of a signal, acquired on an Elphy analog channel, formatted as a list of (time, value) tuples. """ #get data from the file y_data = self.load_encoded_data(ep, ch) x_data = np.arange(0, len(y_data)) #create a recarray data = np.recarray(len(y_data), dtype=[('x', b_float), ('y', b_float)]) #put in the recarray the scaled data x_factors = self.x_scale_factors(ep, ch) y_factors = self.y_scale_factors(ep, ch) data['x'] = x_factors.scale(x_data) data['y'] = y_factors.scale(y_data) return data def get_tag_data(self, ep, tag_ch): """ Return a numpy array containing all samples of a signal, acquired on an Elphy tag channel, formatted as a list of (time, value) tuples. """ #get data from the file y_data = self.load_encoded_tags(ep, tag_ch) x_data = np.arange(0, len(y_data)) #create a recarray data = np.recarray(len(y_data), dtype=[('x', b_float), ('y', b_int)]) #put in the recarray the scaled data factors = self.x_tag_scale_factors(ep) data['x'] = factors.scale(x_data) data['y'] = y_data return data class Acquis1Layout(ElphyLayout): """ A subclass of :class:`ElphyLayout` to know how the 'ACQUIS1/GS/1991' format is organised. Extends :class:`ElphyLayout` to store the offset used to retrieve directly raw data : ``data_offset`` : an offset to jump directly to the raw data. """ def __init__(self, fileobj, data_offset): super(Acquis1Layout, self).__init__(fileobj) self.data_offset = data_offset self.data_blocks = None def get_blocks_end(self): return self.data_offset def is_continuous(self): return self.header.continuous def get_episode_blocks(self): raise NotImplementedError() def set_info_block(self): i_blks = self.get_blocks_of_type('USER INFO') assert len(i_blks) < 2, 'too many info blocks' if len(i_blks) : self.info_block = i_blks[0] def set_data_blocks(self): data_blocks = list() size = self.header.n_samples * self.header.sample_size * self.header.n_channels for ep in range(0, self.header.n_episodes) : start = self.data_offset + ep * self.header.ep_size + self.header.preSeqI data_blocks.append(DummyDataBlock(self, 'Acquis1Data', start, size)) self.data_blocks = data_blocks def get_data_blocks(self, ep): return [self.data_blocks[ep - 1]] @property def n_episodes(self): return self.header.n_episodes def n_channels(self, episode): return self.header.n_channels def n_tags(self, episode): return 0 def tag_mode(self, ep): return 0 def tag_shift(self, ep): return 0 def get_channel_for_tags(self, ep): return None @property def no_analog_data(self): return True if (self.n_episodes == 0) else self.header.no_analog_data def sample_type(self, ep, ch): return self.header.tpData def sampling_period(self, ep, ch): return self.header.dX def n_samples(self, ep, ch): return self.header.n_samples def x_tag_scale_factors(self, ep): return ElphyScaleFactor( self.header.dX, self.header.X0 ) def x_scale_factors(self, ep, ch): return ElphyScaleFactor( self.header.dX, self.header.X0 ) def y_scale_factors(self, ep, ch): dY = self.header.dY_ar[ch - 1] Y0 = self.header.Y0_ar[ch - 1] # TODO: see why this kind of exception exists if dY is None or Y0 is None : raise Exception('bad Y-scale factors for episode %s channel %s' % (ep, ch)) return ElphyScaleFactor(dY, Y0) def x_unit(self, ep, ch): return self.header.x_unit def y_unit(self, ep, ch): return self.header.y_units[ch - 1] @property def ep_size(self): return self.header.ep_size @property def file_duration(self): return self.header.dX * self.n_samples def get_tag(self, episode, tag_channel): return None def create_channel_mask(self, ep): return np.arange(1, self.header.n_channels + 1) class DAC2GSLayout(ElphyLayout): """ A subclass of :class:`ElphyLayout` to know how the 'DAC2 / GS / 2000' format is organised. Extends :class:`ElphyLayout` to store the offset used to retrieve directly raw data : ``data_offset`` : an offset to jump directly after the 'MAIN' block where 'DAC2SEQ' blocks start. ``main_block```: a shortcut to access 'MAIN' block. ``episode_blocks`` : a shortcut to access blocks corresponding to episodes. """ def __init__(self, fileobj, data_offset): super(DAC2GSLayout, self).__init__(fileobj) self.data_offset = data_offset self.main_block = None self.episode_blocks = None def get_blocks_end(self): return self.file_size #data_offset def is_continuous(self): main_block = self.main_block return main_block.continuous if main_block else False def get_episode_blocks(self): raise NotImplementedError() def set_main_block(self): main_block = self.get_blocks_of_type('MAIN') self.main_block = main_block[0] if main_block else None def set_episode_blocks(self): ep_blocks = self.get_blocks_of_type('DAC2SEQ') self.episode_blocks = ep_blocks if ep_blocks else None def set_info_block(self): i_blks = self.get_blocks_of_type('USER INFO') assert len(i_blks) < 2, "too many info blocks" if len(i_blks) : self.info_block = i_blks[0] def set_data_blocks(self): data_blocks = list() identifier = 'DAC2GSData' size = self.main_block.n_samples * self.main_block.sample_size * self.main_block.n_channels if not self.is_continuous() : blocks = self.get_blocks_of_type('DAC2SEQ') for block in blocks : start = block.start + self.main_block.preSeqI data_blocks.append(DummyDataBlock(self, identifier, start, size)) else : start = self.blocks[-1].end + 1 + self.main_block.preSeqI data_blocks.append(DummyDataBlock(self, identifier, start, size)) self.data_blocks = data_blocks def get_data_blocks(self, ep): return [self.data_blocks[ep - 1]] def episode_block(self, ep): return self.main_block if self.is_continuous() else self.episode_blocks[ep - 1] def tag_mode(self, ep): return 1 if self.main_block.withTags else 0 def tag_shift(self, ep): return self.main_block.tagShift def get_channel_for_tags(self, ep): return 1 def sample_type(self, ep, ch): return self.main_block.tpData def sample_size(self, ep, ch): size = super(DAC2GSLayout, self).sample_size(ep, ch) assert size == 2, "sample size is always 2 bytes for DAC2/GS/2000 format" return size def sampling_period(self, ep, ch): block = self.episode_block(ep) return block.dX def x_tag_scale_factors(self, ep): block = self.episode_block(ep) return ElphyScaleFactor( block.dX, block.X0, ) def x_scale_factors(self, ep, ch): block = self.episode_block(ep) return ElphyScaleFactor( block.dX, block.X0, ) def y_scale_factors(self, ep, ch): block = self.episode_block(ep) return ElphyScaleFactor( block.dY_ar[ch - 1], block.Y0_ar[ch - 1] ) def x_unit(self, ep, ch): block = self.episode_block(ep) return block.x_unit def y_unit(self, ep, ch): block = self.episode_block(ep) return block.y_units[ch - 1] def n_samples(self, ep, ch): return self.main_block.n_samples def ep_size(self, ep): return self.main_block.ep_size @property def n_episodes(self): return self.main_block.n_episodes def n_channels(self, episode): return self.main_block.n_channels def n_tags(self, episode): return 2 if self.main_block.withTags else 0 @property def file_duration(self): return self.main_block.dX * self.n_samples def get_tag(self, episode, tag_channel): assert episode in range(1, self.n_episodes + 1) # there are none or 2 tag channels if self.tag_mode(episode) == 1 : assert tag_channel in range(1, 3), "DAC2/GS/2000 format support only 2 tag channels" block = self.episode_block(episode) t_stop = self.main_block.n_samples * block.dX return ElphyTag(self, episode, tag_channel, block.x_unit, 1.0 / block.dX, 0, t_stop) else : return None def n_tag_samples(self, ep, tag_channel): return self.main_block.n_samples def get_tag_data(self, episode, tag_channel): #memorise some useful properties block = self.episode_block(episode) sample_size = self.sample_size(episode, tag_channel) sample_symbol = self.sample_symbol(episode, tag_channel) #create a bit mask to define which #sample to keep from the file channel_mask = self.create_channel_mask(episode) bit_mask = self.create_bit_mask(channel_mask, 1) #get bytes from the file data_block = self.data_blocks[episode - 1] n_bytes = data_block.size self.file.seek(data_block.start) databytes = np.frombuffer(self.file.read(n_bytes), ' 0)[0] raw = databytes.take(to_keep) raw = raw.reshape([len(raw) / sample_size, sample_size]) #create a recarray containing data dt = np.dtype(numpy_map[sample_symbol]) dt.newbyteorder('<') tag_mask = 0b01 if (tag_channel == 1) else 0b10 y_data = np.frombuffer(raw, dt) & tag_mask x_data = np.arange(0, len(y_data)) * block.dX + block.X0 data = np.recarray(len(y_data), dtype=[('x', b_float), ('y', b_int)]) data['x'] = x_data data['y'] = y_data return data def create_channel_mask(self, ep): return np.arange(1, self.main_block.n_channels + 1) class DAC2Layout(ElphyLayout): """ A subclass of :class:`ElphyLayout` to know how the Elphy format is organised. Whereas other formats storing raw data at the end of the file, 'DAC2 objects' format spreads them over multiple blocks : ``episode_blocks`` : a shortcut to access blocks corresponding to episodes. """ def __init__(self, fileobj): super(DAC2Layout, self).__init__(fileobj) self.episode_blocks = None def get_blocks_end(self): return self.file_size def is_continuous(self): ep_blocks = [k for k in self.blocks if k.identifier.startswith('B_Ep')] if ep_blocks : ep_block = ep_blocks[0] ep_sub_block = ep_block.sub_blocks[0] return ep_sub_block.continuous else : return False def set_episode_blocks(self): self.episode_blocks = [k for k in self.blocks if k.identifier.startswith('B_Ep')] def set_info_block(self): #in fact the file info are contained into a single sub-block with an USR identifier i_blks = self.get_blocks_of_type('B_Finfo') assert len(i_blks) < 2, "too many info blocks" if len(i_blks) : i_blk = i_blks[0] sub_blocks = i_blk.sub_blocks if len(sub_blocks) : self.info_block = sub_blocks[0] def set_data_blocks(self): data_blocks = list() blocks = self.get_blocks_of_type('RDATA') for block in blocks : start = block.data_start size = block.end + 1 - start data_blocks.append(DummyDataBlock(self, 'RDATA', start, size)) self.data_blocks = data_blocks def get_data_blocks(self, ep): return self.group_blocks_of_type(ep, 'RDATA') def group_blocks_of_type(self, ep, identifier): ep_blocks = list() blocks = [k for k in self.get_blocks_stored_in_episode(ep) if k.identifier == identifier] for block in blocks : start = block.data_start size = block.end + 1 - start ep_blocks.append(DummyDataBlock(self, identifier, start, size)) return ep_blocks def get_blocks_stored_in_episode(self, ep): data_blocks = [k for k in self.blocks if k.identifier == 'RDATA'] n_ep = self.n_episodes blk_1 = self.episode_block(ep) blk_2 = self.episode_block((ep + 1) % n_ep) i_1 = self.blocks.index(blk_1) i_2 = self.blocks.index(blk_2) if (blk_1 == blk_2) or (i_2 < i_1) : return [k for k in data_blocks if self.blocks.index(k) > i_1] else : return [k for k in data_blocks if self.blocks.index(k) in xrange(i_1, i_2)] def set_cyberk_blocks(self): ck_blocks = list() blocks = self.get_blocks_of_type('RCyberTag') for block in blocks : start = block.data_start size = block.end + 1 - start ck_blocks.append(DummyDataBlock(self, 'RCyberTag', start, size)) self.ck_blocks = ck_blocks def episode_block(self, ep): return self.episode_blocks[ep - 1] @property def n_episodes(self): return len(self.episode_blocks) def analog_index(self, episode): """ Return indices relative to channels used for analog signals. """ block = self.episode_block(episode) tag_mode = block.ep_block.tag_mode an_index = np.where(np.array(block.ks_block.k_sampling) > 0) if tag_mode == 2 : an_index = an_index[:-1] return an_index def n_channels(self, episode): """ Return the number of channels used for analog signals but also events. NB : in Elphy this 2 kinds of channels are not differenciated. """ block = self.episode_block(episode) tag_mode = block.ep_block.tag_mode n_channels = len(block.ks_block.k_sampling) return n_channels if tag_mode != 2 else n_channels - 1 def n_tags(self, episode): block = self.episode_block(episode) tag_mode = block.ep_block.tag_mode tag_map = {0:0, 1:2, 2:16, 3:16} return tag_map.get(tag_mode, 0) def n_events(self, episode): """ Return the number of channels dedicated to events. """ block = self.episode_block(episode) return block.ks_block.k_sampling.count(0) def n_spiketrains(self, episode): spk_blocks = [k for k in self.blocks if k.identifier == 'RSPK'] return spk_blocks[0].n_evt_channels if spk_blocks else 0 def sub_sampling(self, ep, ch): """ Return the sub-sampling factor for the specified episode and channel. """ block = self.episode_block(ep) return block.ks_block.k_sampling[ch - 1] if block.ks_block else 1 def aggregate_size(self, block, ep): ag_count = self.aggregate_sample_count(block) ag_size = 0 for ch in range(1, ag_count + 1) : if (block.ks_block.k_sampling[ch - 1] != 0) : ag_size += self.sample_size(ep, ch) return ag_size def n_samples(self, ep, ch): block = self.episode_block(ep) if not block.ep_block.continuous : return block.ep_block.nbpt / self.sub_sampling(ep, ch) else : # for continuous case there isn't any place # in the file that contains the number of # samples unlike the episode case ... data_blocks = self.get_data_blocks(ep) total_size = np.sum([k.size for k in data_blocks]) # count the number of samples in an # aggregate and compute its size in order # to determine the size of an aggregate ag_count = self.aggregate_sample_count(block) ag_size = self.aggregate_size(block, ep) n_ag = total_size / ag_size # the number of samples is equal # to the number of aggregates ... n_samples = n_ag n_chunks = total_size % ag_size # ... but not when there exists # a incomplete aggregate at the # end of the file, consequently # the preeceeding computed number # of samples must be incremented # by one only if the channel map # to a sample in the last aggregate # ... maybe this last part should be # deleted because the n_chunks is always # null in continuous mode if n_chunks : last_ag_size = total_size - n_ag * ag_count size = 0 for i in range(0, ch) : size += self.sample_size(ep, i + 1) if size <= last_ag_size : n_samples += 1 return n_samples def sample_type(self, ep, ch): block = self.episode_block(ep) return block.kt_block.k_types[ch - 1] if block.kt_block else block.ep_block.tpData def sampling_period(self, ep, ch): block = self.episode_block(ep) return block.ep_block.dX * self.sub_sampling(ep, ch) def x_tag_scale_factors(self, ep): block = self.episode_block(ep) return ElphyScaleFactor( block.ep_block.dX, block.ep_block.X0 ) def x_scale_factors(self, ep, ch): block = self.episode_block(ep) return ElphyScaleFactor( block.ep_block.dX * block.ks_block.k_sampling[ch - 1], block.ep_block.X0, ) def y_scale_factors(self, ep, ch): block = self.episode_block(ep) return ElphyScaleFactor( block.ch_block.dY_ar[ch - 1], block.ch_block.Y0_ar[ch - 1] ) def x_unit(self, ep, ch): block = self.episode_block(ep) return block.ep_block.x_unit def y_unit(self, ep, ch): block = self.episode_block(ep) return block.ch_block.y_units[ch - 1] def tag_mode(self, ep): block = self.episode_block(ep) return block.ep_block.tag_mode def tag_shift(self, ep): block = self.episode_block(ep) return block.ep_block.tag_shift def get_channel_for_tags(self, ep): block = self.episode_block(ep) tag_mode = self.tag_mode(ep) if tag_mode == 1 : ks = np.array(block.ks_block.k_sampling) mins = np.where(ks == ks.min())[0] + 1 return mins[0] elif tag_mode == 2 : return block.ep_block.n_channels else : return None def aggregate_sample_count(self, block): """ Return the number of sample in an aggregate. """ # compute the least common multiple # for channels having block.ks_block.k_sampling[ch] > 0 lcm0 = 1 for i in range(0, block.ep_block.n_channels) : if block.ks_block.k_sampling[i] > 0 : lcm0 = least_common_multiple(lcm0, block.ks_block.k_sampling[i]) # sum quotients lcm / KSampling count = 0 for i in range(0, block.ep_block.n_channels) : if block.ks_block.k_sampling[i] > 0 : count += lcm0 / block.ks_block.k_sampling[i] return count def create_channel_mask(self, ep): """ Return the minimal pattern of channel numbers representing the succession of channels in the multiplexed data. It is useful to do the mapping between a sample stored in the file and its relative channel. NB : This function has been converted from the 'TseqBlock.BuildMask' method of the file 'ElphyFormat.pas' stored in Elphy source code. """ block = self.episode_block(ep) ag_count = self.aggregate_sample_count(block) mask_ar = np.zeros(ag_count, dtype='i') ag_size = 0 i = 0 k = 0 while k < ag_count : for j in range(0, block.ep_block.n_channels) : if (block.ks_block.k_sampling[j] != 0) and (i % block.ks_block.k_sampling[j] == 0) : mask_ar[k] = j + 1 ag_size += self.sample_size(ep, j + 1) k += 1 if k >= ag_count : break i += 1 return mask_ar def get_signal(self, episode, channel): block = self.episode_block(episode) k_sampling = np.array(block.ks_block.k_sampling) evt_channels = np.where(k_sampling == 0)[0] if not channel in evt_channels : return super(DAC2Layout, self).get_signal(episode, channel) else : k_sampling[channel - 1] = -1 return self.get_event(episode, channel, k_sampling) def get_tag(self, episode, tag_channel): """ Return a :class:`ElphyTag` which is a descriptor of the specified event channel. """ assert episode in range(1, self.n_episodes + 1) # there are none, 2 or 16 tag # channels depending on tag_mode tag_mode = self.tag_mode(episode) if tag_mode : block = self.episode_block(episode) x_unit = block.ep_block.x_unit # verify the validity of the tag channel if tag_mode == 1 : assert tag_channel in range(1, 3), "Elphy format support only 2 tag channels for tag_mode == 1" elif tag_mode == 2 : assert tag_channel in range(1, 17), "Elphy format support only 16 tag channels for tag_mode == 2" elif tag_mode == 3 : assert tag_channel in range(1, 17), "Elphy format support only 16 tag channels for tag_mode == 3" smp_period = block.ep_block.dX smp_freq = 1.0 / smp_period if tag_mode != 3 : ch = self.get_channel_for_tags(episode) n_samples = self.n_samples(episode, ch) t_stop = (n_samples - 1) * smp_freq else : # get the max of n_samples multiplied by the sampling # period done on every analog channels in order to avoid # the selection of a channel without concrete signals t_max = list() for ch in self.analog_index(episode) : n_samples = self.n_samples(episode, ch) factors = self.x_scale_factors(episode, ch) chtime = n_samples * factors.delta t_max.append(chtime) time_max = max(t_max) # as (n_samples_tag - 1) * dX_tag # and time_max = n_sample_tag * dX_tag # it comes the following duration t_stop = time_max - smp_period return ElphyTag(self, episode, tag_channel, x_unit, smp_freq, 0, t_stop) else : return None def get_event(self, ep, ch, marked_ks): """ Return a :class:`ElphyEvent` which is a descriptor of the specified event channel. """ assert ep in range(1, self.n_episodes + 1) assert ch in range(1, self.n_channels + 1) # find the event channel number evt_channel = np.where(marked_ks == -1)[0][0] assert evt_channel in range(1, self.n_events(ep) + 1) block = self.episode_block(ep) ep_blocks = self.get_blocks_stored_in_episode(ep) evt_blocks = [k for k in ep_blocks if k.identifier == 'REVT'] n_events = np.sum([k.n_events[evt_channel - 1] for k in evt_blocks], dtype=int) x_unit = block.ep_block.x_unit return ElphyEvent(self, ep, evt_channel, x_unit, n_events, ch_number=ch) def load_encoded_events(self, episode, evt_channel, identifier): """ Return times stored as a 4-bytes integer in the specified event channel. """ data_blocks = self.group_blocks_of_type(episode, identifier) ep_blocks = self.get_blocks_stored_in_episode(episode) evt_blocks = [k for k in ep_blocks if k.identifier == identifier] #compute events on each channel n_events = np.sum([k.n_events for k in evt_blocks], dtype=int, axis=0) pre_events = np.sum(n_events[0:evt_channel - 1], dtype=int) start = pre_events end = start + n_events[evt_channel - 1] expected_size = 4 * np.sum(n_events, dtype=int) return self.load_bytes(data_blocks, dtype=' 0 : name = names[episode-1] start = name.size+1 - name.data_size+1 end = name.end - name.start+1 chars = self.load_bytes([name], dtype='uint8', start=start, end=end, expected_size=name.size ).tolist() #print "chars[%s:%s]: %s" % (start,end,chars) episode_name = ''.join([chr(k) for k in chars]) return episode_name def get_event_data(self, episode, evt_channel): """ Return times contained in the specified event channel. This function is triggered when the 'times' property of an :class:`ElphyEvent` descriptor instance is accessed. """ times = self.load_encoded_events(episode, evt_channel, "REVT") block = self.episode_block(episode) return times * block.ep_block.dX / len(block.ks_block.k_sampling) def get_spiketrain(self, episode, electrode_id): """ Return a :class:`Spike` which is a descriptor of the specified spike channel. """ assert episode in range(1, self.n_episodes + 1) assert electrode_id in range(1, self.n_spiketrains(episode) + 1) # get some properties stored in the episode sub-block block = self.episode_block(episode) x_unit = block.ep_block.x_unit x_unit_wf = getattr(block.ep_block, 'x_unit_wf', None) y_unit_wf = getattr(block.ep_block, 'y_unit_wf', None) # number of spikes in the entire episode spk_blocks = [k for k in self.blocks if k.identifier == 'RSPK'] n_events = np.sum([k.n_events[electrode_id - 1] for k in spk_blocks], dtype=int) # number of samples in a waveform wf_sampling_frequency = 1.0 / block.ep_block.dX wf_blocks = [k for k in self.blocks if k.identifier == 'RspkWave'] if wf_blocks : wf_samples = wf_blocks[0].wavelength t_start = wf_blocks[0].pre_trigger * block.ep_block.dX else: wf_samples = 0 t_start = 0 return ElphySpikeTrain(self, episode, electrode_id, x_unit, n_events, wf_sampling_frequency, wf_samples, x_unit_wf, y_unit_wf, t_start) def get_spiketrain_data(self, episode, electrode_id): """ Return times contained in the specified spike channel. This function is triggered when the 'times' property of an :class:`Spike` descriptor instance is accessed. NB : The 'RSPK' block is not actually identical to the 'EVT' one, because all units relative to a time are stored directly after all event times, 1 byte for each. This function doesn't return these units. But, they could be retrieved from the 'RspkWave' block with the 'get_waveform_data function' """ block = self.episode_block(episode) times = self.load_encoded_spikes(episode, electrode_id, "RSPK") return times * block.ep_block.dX def load_encoded_waveforms(self, episode, electrode_id): """ Return times on which waveforms are defined and a numpy recarray containing all the data stored in the RspkWave block. """ # load data corresponding to the RspkWave block identifier = "RspkWave" data_blocks = self.group_blocks_of_type(episode, identifier) databytes = self.load_bytes(data_blocks) # select only data corresponding # to the specified spk_channel ep_blocks = self.get_blocks_stored_in_episode(episode) wf_blocks = [k for k in ep_blocks if k.identifier == identifier] wf_samples = wf_blocks[0].wavelength events = np.sum([k.n_spikes for k in wf_blocks], dtype=int, axis=0) n_events = events[electrode_id - 1] pre_events = np.sum(events[0:electrode_id - 1], dtype=int) start = pre_events end = start + n_events # data must be reshaped before dtype = [ # the time of the spike arrival ('elphy_time', 'u4', (1,)), ('device_time', 'u4', (1,)), # the identifier of the electrode # would also be the 'trodalness' # but this tetrode devices are not # implemented in Elphy ('channel_id', 'u2', (1,)), # the 'category' of the waveform ('unit_id', 'u1', (1,)), #do not used ('dummy', 'u1', (13,)), # samples of the waveform ('waveform', 'i2', (wf_samples,)) ] x_start = wf_blocks[0].pre_trigger x_stop = wf_samples - x_start return np.arange(-x_start, x_stop), np.frombuffer(databytes, dtype=dtype)[start:end] def get_waveform_data(self, episode, electrode_id): """ Return waveforms corresponding to the specified spike channel. This function is triggered when the ``waveforms`` property of an :class:`Spike` descriptor instance is accessed. """ block = self.episode_block(episode) times, databytes = self.load_encoded_waveforms(episode, electrode_id) n_events, = databytes.shape wf_samples = databytes['waveform'].shape[1] dtype = [ ('time', float), ('electrode_id', int), ('unit_id', int), ('waveform', float, (wf_samples, 2)) ] data = np.empty(n_events, dtype=dtype) data['electrode_id'] = databytes['channel_id'][:, 0] data['unit_id'] = databytes['unit_id'][:, 0] data['time'] = databytes['elphy_time'][:, 0] * block.ep_block.dX data['waveform'][:, :, 0] = times * block.ep_block.dX data['waveform'][:, :, 1] = databytes['waveform'] * block.ep_block.dY_wf + block.ep_block.Y0_wf return data def get_rspk_data(self, spk_channel): """ Return times stored as a 4-bytes integer in the specified event channel. """ evt_blocks = self.get_blocks_of_type('RSPK') #compute events on each channel n_events = np.sum([k.n_events for k in evt_blocks], dtype=int, axis=0) pre_events = np.sum(n_events[0:spk_channel], dtype=int) # sum of array values up to spk_channel-1!!!! start = pre_events + (7 + len(n_events))# rspk header end = start + n_events[spk_channel] expected_size = 4 * np.sum(n_events, dtype=int) # constant return self.load_bytes(evt_blocks, dtype='= layout.data_offset)) : block = self.factory.create_block(layout, offset) # create the sub blocks if it is DAC2 objects format # this is only done for B_Ep and B_Finfo blocks for # DAC2 objects format, maybe it could be useful to # spread this to other block types. #if isinstance(header, DAC2Header) and (block.identifier in ['B_Ep']) : if isinstance(header, DAC2Header) and (block.identifier in ['B_Ep', 'B_Finfo']) : sub_offset = block.data_offset while sub_offset < block.start + block.size : sub_block = self.factory.create_sub_block(block, sub_offset) block.add_sub_block(sub_block) sub_offset += sub_block.size # set up some properties of some DAC2Layout sub-blocks if isinstance(sub_block, (DAC2EpSubBlock, DAC2AdcSubBlock, DAC2KSampSubBlock, DAC2KTypeSubBlock)) : block.set_episode_block() block.set_channel_block() block.set_sub_sampling_block() block.set_sample_size_block() # SpikeTrain #if isinstance(header, DAC2Header) and (block.identifier in ['RSPK']) : #print "\nElphyFile.create_layout() - RSPK" #print "ElphyFile.create_layout() - n_events",block.n_events #print "ElphyFile.create_layout() - n_evt_channels",block.n_evt_channels layout.add_block(block) offset += block.size # set up as soon as possible the shortcut # to the main block of a DAC2GSLayout if not detect_main and isinstance(layout, DAC2GSLayout) and isinstance(block, DAC2GSMainBlock) : layout.set_main_block() detect_main = True # detect if the file is continuous when # the 'MAIN' block has been parsed if not detect_continuous : is_continuous = isinstance(header, DAC2GSHeader) and layout.is_continuous() # set up the shortcut to blocks corresponding # to episodes, only available for DAC2Layout # and also DAC2GSLayout if not continuous if isinstance(layout, DAC2Layout) or (isinstance(layout, DAC2GSLayout) and not layout.is_continuous()) : layout.set_episode_blocks() layout.set_data_blocks() # finally set up the user info block of the layout layout.set_info_block() self.file.seek(0) return layout def is_continuous(self): return self.layout.is_continuous() @property def n_episodes(self): """ Return the number of recording sequences. """ return self.layout.n_episodes def n_channels(self, episode): """ Return the number of recording channels involved in data acquisition and relative to the specified episode : ``episode`` : the recording sequence identifier. """ return self.layout.n_channels(episode) def n_tags(self, episode): """ Return the number of tag channels relative to the specified episode : ``episode`` : the recording sequence identifier. """ return self.layout.n_tags(episode) def n_events(self, episode): """ Return the number of event channels relative to the specified episode : ``episode`` : the recording sequence identifier. """ return self.layout.n_events(episode) def n_spiketrains(self, episode): """ Return the number of event channels relative to the specified episode : ``episode`` : the recording sequence identifier. """ return self.layout.n_spiketrains(episode) def n_waveforms(self, episode): """ Return the number of waveform channels : """ return self.layout.n_waveforms(episode) def get_signal(self, episode, channel): """ Return the signal or event descriptor relative to the specified episode and channel : ``episode`` : the recording sequence identifier. ``channel`` : the analog channel identifier. NB : For 'DAC2 objects' format, it could be also used to retrieve events. """ return self.layout.get_signal(episode, channel) def get_tag(self, episode, tag_channel): """ Return the tag descriptor relative to the specified episode and tag channel : ``episode`` : the recording sequence identifier. ``tag_channel`` : the tag channel identifier. NB : There isn't any tag channels for 'Acquis1' format. ElphyTag channels appeared after 'DAC2/GS/2000' release. They are also present in 'DAC2 objects' format. """ return self.layout.get_tag(episode, tag_channel) def get_event(self, episode, evt_channel): """ Return the event relative the specified episode and event channel. `episode`` : the recording sequence identifier. ``tag_channel`` : the tag channel identifier. """ return self.layout.get_event(episode, evt_channel) def get_spiketrain(self, episode, electrode_id): """ Return the spiketrain relative to the specified episode and electrode_id. ``episode`` : the recording sequence identifier. ``electrode_id`` : the identifier of the electrode providing the spiketrain. NB : Available only for 'DAC2 objects' format. This descriptor can return the times of a spiketrain and waveforms relative to each of these times. """ return self.layout.get_spiketrain(episode, electrode_id) @property def comments(self): raise NotImplementedError() def get_user_file_info(self): """ Return user defined file metadata. """ if not self.layout.info_block : return dict() else : return self.layout.info_block.get_user_file_info() @property def episode_info(self, ep_number): raise NotImplementedError() def get_signals(self): """ Get all available analog or event channels stored into an Elphy file. """ signals = list() for ep in range(1, self.n_episodes + 1) : for ch in range(1, self.n_channels(ep) + 1) : signal = self.get_signal(ep, ch) signals.append(signal) return signals def get_tags(self): """ Get all available tag channels stored into an Elphy file. """ tags = list() for ep in range(1, self.n_episodes + 1) : for tg in range(1, self.n_tags(ep) + 1) : tag = self.get_tag(ep, tg) tags.append(tag) return tags def get_spiketrains(self): """ Get all available spiketrains stored into an Elphy file. """ spiketrains = list() for ep in range(1, self.n_episodes + 1) : for ch in range(1, self.n_spiketrains(ep) + 1) : spiketrain = self.get_spiketrain(ep, ch) spiketrains.append(spiketrain) return spiketrains def get_rspk_spiketrains(self): """ Get all available spiketrains stored into an Elphy file. """ spiketrains = list() spk_blocks = self.layout.get_blocks_of_type('RSPK') for bl in spk_blocks : #print "ElphyFile.get_spiketrains() - identifier:",bl.identifier for ch in range(0,bl.n_evt_channels) : spiketrain = self.layout.get_rspk_data(ch) spiketrains.append(spiketrain) return spiketrains def get_names( self ) : com_blocks = list() com_blocks = self.layout.get_blocks_of_type('COM') return com_blocks # -------------------------------------------------------- class ElphyIO(BaseIO): """ Class for reading from and writing to an Elphy file. It enables reading: - :class:`Block` - :class:`Segment` - :class:`RecordingChannel` - :class:`RecordingChannelGroup` - :class:`EventArray` - :class:`SpikeTrain` Usage: >>> from neo import io >>> r = io.ElphyIO(filename='ElphyExample.DAT') >>> seg = r.read_block(lazy=False, cascade=True) >>> print(seg.analogsignals) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE >>> print(seg.spiketrains) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE >>> print(seg.eventarrays) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE >>> print(anasig._data_description) >>> anasig = r.read_analogsignal(lazy=False, cascade=False) >>> bl = Block() >>> # creating segments, their contents and append to bl >>> r.write_block( bl ) """ is_readable = True # This class can read data is_writable = False # This class can write data # This class is able to directly or indirectly handle the following objects supported_objects = [ Block, Segment, AnalogSignalArray, SpikeTrain ] #, AnalogSignal # This class can return a Block readable_objects = [ Block ] # This class is not able to write objects writeable_objects = [ ] has_header = False is_streameable = False # This is for GUI stuff : a definition for parameters when reading. # This dict should be keyed by object (`Block`). Each entry is a list # of tuple. The first entry in each tuple is the parameter name. The # second entry is a dict with keys 'value' (for default value), # and 'label' (for a descriptive name). # Note that if the highest-level object requires parameters, # common_io_test will be skipped. read_params = { } # do not supported write so no GUI stuff write_params = { } name = 'Elphy IO' extensions = [ 'DAT' ] # mode can be 'file' or 'dir' or 'fake' or 'database' mode = 'file' # internal serialized representation of neo data serialized = None def __init__(self , filename = None) : """ Arguments: filename : the filename to read """ BaseIO.__init__(self) self.filename = filename self.elphy_file = ElphyFile(self.filename) def read_block(self, # the 2 first key arguments are imposed by neo.io API lazy = False, cascade = True ): """ Return :class:`Block` filled or not depending on 'cascade' parameter. Parameters: lazy : postpone actual reading of the file. cascade : normally you want this True, otherwise method will only ready Block label. """ # basic block = Block(name=None) # laziness if lazy: return block else: # get analog and tag channels try : self.elphy_file.open() except Exception as e: self.elphy_file.close() raise Exception("cannot open file %s : %s" % (self.filename, e)) # cascading #print "\n\n==========================================\n" #print "read_block() - n_episodes:",self.elphy_file.n_episodes if cascade: # create a segment containing all analog, # tag and event channels for the episode if self.elphy_file.n_episodes == None : print("File '%s' appears to have no episodes" % (self.filename)) return block for episode in range(1, self.elphy_file.n_episodes+1) : segment = self.read_segment(episode) segment.block = block block.segments.append(segment) # close file self.elphy_file.close() # result return block def write_block( self, block ): """ Write a given Neo Block to an Elphy file, its structure being, for example: Neo -> Elphy -------------------------------------------------------------- Block File Segment Episode Block (B_Ep) AnalogSignalArray Episode Descriptor (Ep + Adc + Ksamp + Ktype) multichannel RDATA (with a ChannelMask multiplexing channels) 2D NumPy Array ... AnalogSignalArray AnalogSignal AnalogSignal ... ... SpikeTrain Event Block (RSPK) SpikeTrain ... Arguments:: block: the block to be saved """ # Serialize Neo structure into Elphy file # each analog signal will be serialized as elphy Episode Block (with its subblocks) # then all spiketrains will be serialized into an Rspk Block (an Event Block with addons). # Serialize (and size) all Neo structures before writing them to file # Since to write each Elphy Block is required to know in advance its size, # which includes that of its subblocks, it is necessary to # serialize first the lowest structures. # Iterate over block structures elphy_limit = 256 All = '' #print "\n\n--------------------------------------------\n" #print "write_block() - n_segments:",len(block.segments) for seg in block.segments: analogsignals = 0 # init nbchan = 0 nbpt = 0 chls = 0 Dxu = 1e-8 #0.0000001 Rxu = 1e+8 #10000000.0 X0uSpk = 0.0 CyberTime = 0.0 aa_units = [] NbEv = [] serialized_analog_data = '' serialized_spike_data = '' # AnalogSignals # Neo signalarrays are 2D numpy array where each row is an array of samples for a channel: # signalarray A = [[ 1, 2, 3, 4 ], # [ 5, 6, 7, 8 ]] # signalarray B = [[ 9, 10, 11, 12 ], # [ 13, 14, 15, 16 ]] # Neo Segments can have more than one signalarray. # To be converted in Elphy analog channels they need to be all in a 2D array, not in several 2D arrays. # Concatenate all analogsignalarrays into one and then flatten it. # Elphy RDATA blocks contain Fortran styled samples: # 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16 # AnalogSignalArrays -> analogsignals # get the first to have analogsignals with the right shape # Annotations for analogsignals array come as a list of int being source ids # here, put each source id on a separate dict entry in order to have a matching afterwards idx = 0 annotations = dict( ) # get all the others #print "write_block() - n_analogsignals:",len(seg.analogsignals) #print "write_block() - n_analogsignalarrays:",len(seg.analogsignalarrays) for asigar in seg.analogsignalarrays : idx,annotations = self.get_annotations_dict( annotations, "analogsignal", asigar.annotations.items(), asigar.name, idx ) # array structure _,chls = asigar.shape # units for _ in range(chls) : aa_units.append( asigar.units ) Dxu = asigar.sampling_period Rxu = asigar.sampling_rate if isinstance(analogsignals, np.ndarray) : analogsignals = np.hstack( (analogsignals,asigar) ) else : analogsignals = asigar # first time # collect and reshape all analogsignals if isinstance(analogsignals, np.ndarray) : # transpose matrix since in Neo channels are column-wise while in Elphy are row-wise analogsignals = analogsignals.T # get dimensions nbchan,nbpt = analogsignals.shape # serialize AnalogSignal analog_data_fmt = '<' + str(analogsignals.size) + 'f' # serialized flattened numpy channels in 'F'ortran style analog_data_64 = analogsignals.flatten('F') # elphy normally uses float32 values (for performance reasons) analog_data = np.array( analog_data_64, dtype=np.float32 ) serialized_analog_data += struct.pack( analog_data_fmt, *analog_data ) # SpikeTrains # Neo spiketrains are stored as a one-dimensional array of times # [ 0.11, 1.23, 2.34, 3.45, 4.56, 5.67, 6.78, 7.89 ... ] # These are converted into Elphy Rspk Block which will contain all of them # RDATA + NbVeV:integer for the number of channels (spiketrains) # + NbEv:integer[] for the number of event per channel # followed by the actual arrays of integer containing spike times #spiketrains = seg.spiketrains # ... but consider elphy loading limitation: NbVeV = len( seg.spiketrains ) #print "write_block() - n_spiketrains:",NbVeV if len(seg.spiketrains) > elphy_limit : NbVeV = elphy_limit # serialize format spiketrain_data_fmt = '<' spiketrains = [] for idx,train in enumerate(seg.spiketrains[:NbVeV]) : #print "write_block() - train.size:", train.size,idx #print "write_block() - train:", train fake,annotations = self.get_annotations_dict( annotations,"spiketrain", train.annotations.items(), '', idx ) #annotations.update( dict( [("spiketrain-"+str(idx),train.annotations['source_id'])] ) ) #print "write_block() - train[%s].annotation['source_id']:%s" % (idx,train.annotations['source_id']) # total number of events format + blackrock sorting mark (0 for neo) spiketrain_data_fmt += str(train.size) + "i" + str(train.size) + "B" # get starting time X0uSpk = train.t_start.item() CyberTime = train.t_stop.item() # count number of events per train NbEv.append( train.size ) # multiply by sampling period train = train * Rxu # all flattened spike train # blackrock acquisition card also adds a byte for each event to sort it spiketrains.extend( [spike.item() for spike in train] + [0 for _ in range(train.size)]) # Annotations #print annotations # using DBrecord elphy block, they will be available as values in elphy environment # separate keys and values in two separate serialized strings ST_sub = '' st_fmt = '' st_data = [] BUF_sub = '' serialized_ST_data = '' serialized_BUF_data = '' for key in sorted(annotations.iterkeys()) : # take all values, get their type and concatenate fmt = '' data = [] value = annotations[key] if isinstance( value, (int,np.int32,np.int64) ) : # elphy type 2 fmt = '0 else "episode %s" % str(episode + 1) segment = Segment( name=name ) # create an analog signal for # each channel in the episode for channel in range(1, self.elphy_file.n_channels(episode)+1) : signal = self.elphy_file.get_signal(episode, channel) analog_signal = AnalogSignal( signal.data['y'], units = signal.y_unit, t_start = signal.t_start * getattr(pq, signal.x_unit.strip()), t_stop = signal.t_stop * getattr(pq, signal.x_unit.strip()), #sampling_rate = signal.sampling_frequency * pq.kHz, sampling_period = signal.sampling_period * getattr(pq, signal.x_unit.strip()), channel_name="episode %s, channel %s" % ( int(episode+1), int(channel+1) ) ) analog_signal.segment = segment create_many_to_one_relationship( analog_signal ) segment.analogsignals.append(analog_signal) # create a spiketrain for each # spike channel in the episode # in case of multi-electrode # acquisition context n_spikes = self.elphy_file.n_spiketrains(episode) #print "read_segment() - n_spikes:",n_spikes if n_spikes>0 : for spk in range(1, n_spikes+1) : spiketrain = self.read_spiketrain(episode, spk) spiketrain.segment = segment create_many_to_one_relationship( spiketrain ) segment.spiketrains.append( spiketrain ) # segment return segment def read_recordingchannelgroup( self, episode ): """ Internal method used to return :class:`RecordingChannelGroup` info. Parameters: elphy_file : is the elphy object. episode : number of elphy episode, roughly corresponding to a segment """ n_spikes = self.elphy_file.n_spikes group = RecordingChannelGroup( name="episode %s, group of %s electrodes" % (episode, n_spikes) ) for spk in range(0, n_spikes) : channel = self.read_recordingchannel(episode, spk) group.recordingchannels.append(channel) return group def read_recordingchannel( self, episode, chl ): """ Internal method used to return a :class:`RecordingChannel` label. Parameters: elphy_file : is the elphy object. episode : number of elphy episode, roughly corresponding to a segment. chl : electrode number. """ channel = RecordingChannel( name="episode %s, electrodes %s" % (episode, chl) ) return channel def read_eventarray( self, episode, evt ): """ Internal method used to return a list of elphy :class:`EventArray` acquired from event channels. Parameters: elphy_file : is the elphy object. episode : number of elphy episode, roughly corresponding to a segment. evt : index of the event. """ event = self.elphy_file.get_event(episode, evt) event_array = EventArray( times=event.times * pq.s, channel_name="episode %s, event channel %s" % (episode + 1, evt + 1) ) return event_array def read_spiketrain( self, episode, spk ): """ Internal method used to return an elphy object :class:`SpikeTrain`. Parameters: elphy_file : is the elphy object. episode : number of elphy episode, roughly corresponding to a segment. spk : index of the spike array. """ block = self.elphy_file.layout.episode_block(episode) spike = self.elphy_file.get_spiketrain(episode, spk) spikes = spike.times * pq.s #print "read_spiketrain() - spikes: %s" % (len(spikes)) #print "read_spiketrain() - spikes:",spikes dct = { 'times':spikes, 't_start': block.ep_block.X0_wf if block.ep_block.X0_wf < spikes[0] else spikes[0], #check 't_stop': block.ep_block.cyber_time if block.ep_block.cyber_time > spikes[-1] else spikes[-1], 'units':'s', # special keywords to identify the # electrode providing the spiketrain # event though it is redundant with # waveforms 'label':"episode %s, electrode %s" % (episode, spk), 'electrode_id':spk } # new spiketrain return SpikeTrain(**dct) neo-0.3.3/neo/io/brainwaredamio.py0000644000175000017500000002242612273723542020105 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' Class for reading from Brainware DAM files DAM files are binary files for holding raw data. They are broken up into sequence of Segments, each containing a single raw trace and parameters. The DAM file does NOT contain a sampling rate, nor can it be reliably calculated from any of the parameters. You can calculate it from the "sweep length" attribute if it is present, but it isn't always present. It is more reliable to get it from the corresponding SRC file or F32 file if you have one. The DAM file also does not divide up data into Blocks, so only a single Block is returned.. Brainware was developed by Dr. Jan Schnupp and is availabe from Tucker Davis Technologies, Inc. http://www.tdt.com/downloads.htm Neither Dr. Jan Schnupp nor Tucker Davis Technologies, Inc. had any part in the development of this code The code is implemented with the permission of Dr. Jan Schnupp Author: Todd Jennings ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function # import needed core python modules import os import os.path # numpy and quantities are already required by neo import numpy as np import quantities as pq # needed core neo modules from neo.core import (AnalogSignal, Block, RecordingChannel, RecordingChannelGroup, Segment) # need to subclass BaseI from neo.io.baseio import BaseIO # some tools to finalize the hierachy from neo.io.tools import create_many_to_one_relationship class BrainwareDamIO(BaseIO): """ Class for reading Brainware raw data files with the extension '.dam'. The read_block method returns the first Block of the file. It will automatically close the file after reading. The read method is the same as read_block. Note: The file format does not contain a sampling rate. The sampling rate is set to 1 Hz, but this is arbitrary. If you have a corresponding .src or .f32 file, you can get the sampling rate from that. It may also be possible to infer it from the attributes, such as "sweep length", if present. Usage: >>> from neo.io.brainwaredamio import BrainwareDamIO >>> damfile = BrainwareDamIO(filename='multi_500ms_mulitrep_ch1.dam') >>> blk1 = damfile.read() >>> blk2 = damfile.read_block() >>> print blk1.segments >>> print blk1.segments[0].analogsignals >>> print blk1.units >>> print blk1.units[0].name >>> print blk2 >>> print blk2[0].segments """ is_readable = True # This class can only read data is_writable = False # write is not supported # This class is able to directly or indirectly handle the following objects # You can notice that this greatly simplifies the full Neo object hierarchy supported_objects = [Block, RecordingChannelGroup, RecordingChannel, Segment, AnalogSignal] readable_objects = [Block] writeable_objects = [] has_header = False is_streameable = False # This is for GUI stuff: a definition for parameters when reading. # This dict should be keyed by object (`Block`). Each entry is a list # of tuple. The first entry in each tuple is the parameter name. The # second entry is a dict with keys 'value' (for default value), # and 'label' (for a descriptive name). # Note that if the highest-level object requires parameters, # common_io_test will be skipped. read_params = {Block: [], RecordingChannelGroup: [], RecordingChannel: [], Segment: [], AnalogSignal: [], } # do not support write so no GUI stuff write_params = None name = 'Brainware DAM File' extensions = ['dam'] mode = 'file' def __init__(self, filename=None): ''' Arguments: filename: the filename ''' BaseIO.__init__(self) self._path = filename self._filename = os.path.basename(filename) self._fsrc = None def read(self, lazy=False, cascade=True, **kargs): ''' Reads raw data file "fname" generated with BrainWare ''' return self.read_block(lazy=lazy, cascade=cascade) def read_block(self, lazy=False, cascade=True, **kargs): ''' Reads a block from the raw data file "fname" generated with BrainWare ''' # there are no keyargs implemented to so far. If someone tries to pass # them they are expecting them to do something or making a mistake, # neither of which should pass silently if kargs: raise NotImplementedError('This method does not have any ' 'argument implemented yet') self._fsrc = None block = Block(file_origin=self._filename) # if we aren't doing cascade, don't load anything if not cascade: return block # create the objects to store other objects rcg = RecordingChannelGroup(file_origin=self._filename) rchan = RecordingChannel(file_origin=self._filename, index=1, name='Chan1') # load objects into their containers rcg.recordingchannels.append(rchan) block.recordingchannelgroups.append(rcg) rcg.channel_indexes = np.array([1]) rcg.channel_names = np.array(['Chan1'], dtype='S') # open the file with open(self._path, 'rb') as fobject: # while the file is not done keep reading segments while True: seg = self._read_segment(fobject, lazy) # if there are no more Segments, stop if not seg: break # store the segment and signals block.segments.append(seg) rchan.analogsignals.append(seg.analogsignals[0]) # remove the file object self._fsrc = None create_many_to_one_relationship(block) return block # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- # IMPORTANT!!! # These are private methods implementing the internal reading mechanism. # Due to the way BrainWare DAM files are structured, they CANNOT be used # on their own. Calling these manually will almost certainly alter your # position in the file in an unrecoverable manner, whether they throw # an exception or not. # ------------------------------------------------------------------------- # ------------------------------------------------------------------------- def _read_segment(self, fobject, lazy): ''' Read a single segment with a single analogsignal Returns the segment or None if there are no more segments ''' try: # float64 -- start time of the AnalogSignal t_start = np.fromfile(fobject, dtype=np.float64, count=1)[0] except IndexError: # if there are no more Segments, return return False # int16 -- index of the stimulus parameters seg_index = np.fromfile(fobject, dtype=np.int16, count=1)[0].tolist() # int16 -- number of stimulus parameters numelements = np.fromfile(fobject, dtype=np.int16, count=1)[0] # read the name strings for the stimulus parameters paramnames = [] for _ in range(numelements): # unit8 -- the number of characters in the string numchars = np.fromfile(fobject, dtype=np.uint8, count=1)[0] # char * numchars -- a single name string name = np.fromfile(fobject, dtype=np.uint8, count=numchars) # exclude invalid characters name = str(name[name >= 32].view('c').tostring()) # add the name to the list of names paramnames.append(name) # float32 * numelements -- the values for the stimulus parameters paramvalues = np.fromfile(fobject, dtype=np.float32, count=numelements) # combine parameter names and the parameters as a dict params = dict(zip(paramnames, paramvalues)) # int32 -- the number elements in the AnalogSignal numpts = np.fromfile(fobject, dtype=np.int32, count=1)[0] # int16 * numpts -- the AnalogSignal itself signal = np.fromfile(fobject, dtype=np.int16, count=numpts) # handle lazy loading if lazy: sig = AnalogSignal([], t_start=t_start*pq.d, file_origin=self._filename, sampling_period=1.*pq.s, units=pq.mV, dtype=np.float) sig.lazy_shape = len(signal) else: sig = AnalogSignal(signal.astype(np.float)*pq.mV, t_start=t_start*pq.d, file_origin=self._filename, sampling_period=1.*pq.s, copy=False) # Note: setting the sampling_period to 1 s is arbitrary # load the AnalogSignal and parameters into a new Segment seg = Segment(file_origin=self._filename, index=seg_index, **params) seg.analogsignals = [sig] return seg neo-0.3.3/neo/io/neuroshareio.py0000644000175000017500000004113512273723542017622 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ NeuroshareIO is a wrap with ctypes of neuroshare DLLs. Neuroshare is a C API for reading neural data. Neuroshare also provides a Matlab and a Python API on top of that. Neuroshare is an open source API but each dll is provided directly by the vendor. The neo user have to download separtatly the dll on neurosharewebsite: http://neuroshare.sourceforge.net/ For some vendors (Spike2/CED , Clampfit/Abf, ...), neo.io also provides pure Python Neo users you should prefer them of course :) Supported : Read Author: sgarcia """ import ctypes import os # file no longer exists in Python3 try: file except NameError: import io file = io.BufferedReader import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Segment, AnalogSignal, SpikeTrain, EventArray from neo.io.tools import create_many_to_one_relationship class NeuroshareIO(BaseIO): """ Class for reading file trougth neuroshare API. The user need the DLLs in the path of the file format. Usage: >>> from neo import io >>> r = io.NeuroshareIO(filename='a_file', dllname=the_name_of_dll) >>> seg = r.read_segment(lazy=False, cascade=True, import_neuroshare_segment=True) >>> print seg.analogsignals # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> print seg.spiketrains [] >>> print seg.eventarrays [] Note: neuroshare.ns_ENTITY_EVENT: are converted to neo.EventArray neuroshare.ns_ENTITY_ANALOG: are converted to neo.AnalogSignal neuroshare.ns_ENTITY_NEURALEVENT: are converted to neo.SpikeTrain neuroshare.ns_ENTITY_SEGMENT: is something between serie of small AnalogSignal and Spiketrain with associated waveforms. It is arbitrarily converted as SpikeTrain. """ is_readable = True is_writable = False supported_objects = [Segment , AnalogSignal, EventArray, SpikeTrain ] readable_objects = [Segment] writeable_objects = [ ] has_header = False is_streameable = False read_params = { Segment : [] } write_params = None name = 'neuroshare' extensions = [ ] mode = 'file' def __init__(self , filename = '', dllname = '') : """ Arguments: filename: the file to read ddlname: the name of neuroshare dll to be used for this file """ self.dllname = dllname self.filename = filename BaseIO.__init__(self) def read_segment(self, import_neuroshare_segment = True, lazy=False, cascade=True): """ Arguments: import_neuroshare_segment: import neuroshare segment as SpikeTrain with associated waveforms or not imported at all. """ seg = Segment( file_origin = os.path.basename(self.filename), ) neuroshare = ctypes.windll.LoadLibrary(self.dllname) # API version info = ns_LIBRARYINFO() neuroshare.ns_GetLibraryInfo(ctypes.byref(info) , ctypes.sizeof(info)) seg.annotate(neuroshare_version = str(info.dwAPIVersionMaj)+'.'+str(info.dwAPIVersionMin)) if not cascade: return seg # open file hFile = ctypes.c_uint32(0) neuroshare.ns_OpenFile(ctypes.c_char_p(self.filename) ,ctypes.byref(hFile)) fileinfo = ns_FILEINFO() neuroshare.ns_GetFileInfo(hFile, ctypes.byref(fileinfo) , ctypes.sizeof(fileinfo)) # read all entities for dwEntityID in range(fileinfo.dwEntityCount): entityInfo = ns_ENTITYINFO() neuroshare.ns_GetEntityInfo( hFile, dwEntityID, ctypes.byref(entityInfo), ctypes.sizeof(entityInfo)) #~ print 'type', entityInfo.dwEntityType,entity_types[entityInfo.dwEntityType], 'count', entityInfo.dwItemCount #~ print entityInfo.szEntityLabel # EVENT if entity_types[entityInfo.dwEntityType] == 'ns_ENTITY_EVENT': pEventInfo = ns_EVENTINFO() neuroshare.ns_GetEventInfo ( hFile, dwEntityID, ctypes.byref(pEventInfo), ctypes.sizeof(pEventInfo)) #~ print pEventInfo.szCSVDesc, pEventInfo.dwEventType, pEventInfo.dwMinDataLength, pEventInfo.dwMaxDataLength if pEventInfo.dwEventType == 0: #TEXT pData = ctypes.create_string_buffer(pEventInfo.dwMaxDataLength) elif pEventInfo.dwEventType == 1:#CVS pData = ctypes.create_string_buffer(pEventInfo.dwMaxDataLength) elif pEventInfo.dwEventType == 2:# 8bit pData = ctypes.c_byte(0) elif pEventInfo.dwEventType == 3:# 16bit pData = ctypes.c_int16(0) elif pEventInfo.dwEventType == 4:# 32bit pData = ctypes.c_int32(0) pdTimeStamp = ctypes.c_double(0.) pdwDataRetSize = ctypes.c_uint32(0) ea = EventArray(name = str(entityInfo.szEntityLabel),) if not lazy: times = [ ] labels = [ ] for dwIndex in range(entityInfo.dwItemCount ): neuroshare.ns_GetEventData ( hFile, dwEntityID, dwIndex, ctypes.byref(pdTimeStamp), ctypes.byref(pData), ctypes.sizeof(pData), ctypes.byref(pdwDataRetSize) ) times.append(pdTimeStamp.value) labels.append(str(pData)) ea.times = times*pq.s ea.labels = np.array(labels, dtype ='S') else : ea.lazy_shape = entityInfo.dwItemCount seg.eventarrays.append(ea) # analog if entity_types[entityInfo.dwEntityType] == 'ns_ENTITY_ANALOG': pAnalogInfo = ns_ANALOGINFO() neuroshare.ns_GetAnalogInfo( hFile, dwEntityID,ctypes.byref(pAnalogInfo),ctypes.sizeof(pAnalogInfo) ) #~ print 'dSampleRate' , pAnalogInfo.dSampleRate , pAnalogInfo.szUnits dwStartIndex = ctypes.c_uint32(0) dwIndexCount = entityInfo.dwItemCount if lazy: signal = [ ]*pq.Quantity(1, pAnalogInfo.szUnits) else: pdwContCount = ctypes.c_uint32(0) pData = np.zeros( (entityInfo.dwItemCount,), dtype = 'f8') neuroshare.ns_GetAnalogData ( hFile, dwEntityID, dwStartIndex, dwIndexCount, ctypes.byref( pdwContCount) , pData.ctypes.data_as(ctypes.POINTER(ctypes.c_double))) pszMsgBuffer = ctypes.create_string_buffer(" "*256) neuroshare.ns_GetLastErrorMsg(ctypes.byref(pszMsgBuffer), 256) #~ print 'pszMsgBuffer' , pszMsgBuffer.value signal = pData[:pdwContCount.value]*pq.Quantity(1, pAnalogInfo.szUnits) #t_start dwIndex = 0 pdTime = ctypes.c_double(0) neuroshare.ns_GetTimeByIndex( hFile, dwEntityID, dwIndex, ctypes.byref(pdTime)) anaSig = AnalogSignal(signal, sampling_rate = pAnalogInfo.dSampleRate*pq.Hz, t_start = pdTime.value * pq.s, name = str(entityInfo.szEntityLabel), ) if lazy: anaSig.lazy_shape = entityInfo.dwItemCount seg.analogsignals.append( anaSig ) #segment if entity_types[entityInfo.dwEntityType] == 'ns_ENTITY_SEGMENT' and import_neuroshare_segment: pdwSegmentInfo = ns_SEGMENTINFO() neuroshare.ns_GetSegmentInfo( hFile, dwEntityID, ctypes.byref(pdwSegmentInfo), ctypes.sizeof(pdwSegmentInfo) ) nsource = pdwSegmentInfo.dwSourceCount pszMsgBuffer = ctypes.create_string_buffer(" "*256) neuroshare.ns_GetLastErrorMsg(ctypes.byref(pszMsgBuffer), 256) #~ print 'pszMsgBuffer' , pszMsgBuffer.value #~ print 'pdwSegmentInfo.dwSourceCount' , pdwSegmentInfo.dwSourceCount for dwSourceID in range(pdwSegmentInfo.dwSourceCount) : pSourceInfo = ns_SEGSOURCEINFO() neuroshare.ns_GetSegmentSourceInfo( hFile, dwEntityID, dwSourceID, ctypes.byref(pSourceInfo), ctypes.sizeof(pSourceInfo) ) if lazy: sptr = SpikeTrain(times, name = str(entityInfo.szEntityLabel)) sptr.lazy_shape = entityInfo.dwItemCount else: pdTimeStamp = ctypes.c_double(0.) dwDataBufferSize = pdwSegmentInfo.dwMaxSampleCount*pdwSegmentInfo.dwSourceCount pData = np.zeros( (dwDataBufferSize), dtype = 'f8') pdwSampleCount = ctypes.c_uint32(0) pdwUnitID= ctypes.c_uint32(0) nsample = pdwSampleCount.value times = np.empty( (entityInfo.dwItemCount), drtype = 'f') waveforms = np.empty( (entityInfo.dwItemCount, nsource, nsample), drtype = 'f') for dwIndex in range(entityInfo.dwItemCount ): neuroshare.ns_GetSegmentData ( hFile, dwEntityID, dwIndex, ctypes.byref(pdTimeStamp), pData.ctypes.data_as(ctypes.POINTER(ctypes.c_double)), dwDataBufferSize * 8, ctypes.byref(pdwSampleCount), ctypes.byref(pdwUnitID ) ) #print 'dwDataBufferSize' , dwDataBufferSize,pdwSampleCount , pdwUnitID times[dwIndex] = pdTimeStamp.value waveforms[dwIndex, :,:] = pData[:nsample*nsource].reshape(nsample ,nsource).transpose() sptr = SpikeTrain(times*pq.s, waveforms = waveforms*pq.Quantity(1., str(pdwSegmentInfo.szUnits) ), left_sweep = nsample/2./float(pdwSegmentInfo.dSampleRate)*pq.s, sampling_rate = float(pdwSegmentInfo.dSampleRate)*pq.Hz, name = str(entityInfo.szEntityLabel), ) seg.spiketrains.append(sptr) # neuralevent if entity_types[entityInfo.dwEntityType] == 'ns_ENTITY_NEURALEVENT': pNeuralInfo = ns_NEURALINFO() neuroshare.ns_GetNeuralInfo ( hFile, dwEntityID, ctypes.byref(pNeuralInfo), ctypes.sizeof(pNeuralInfo)) #print pNeuralInfo.dwSourceUnitID , pNeuralInfo.szProbeInfo if lazy: times = [ ]*pq.s else: pData = np.zeros( (entityInfo.dwItemCount,), dtype = 'f8') dwStartIndex = 0 dwIndexCount = entityInfo.dwItemCount neuroshare.ns_GetNeuralData( hFile, dwEntityID, dwStartIndex, dwIndexCount, pData.ctypes.data_as(ctypes.POINTER(ctypes.c_double))) times = pData*pq.s sptr = SpikeTrain(times, name = str(entityInfo.szEntityLabel),) if lazy: sptr.lazy_shape = entityInfo.dwItemCount seg.spiketrains.append(sptr) # close neuroshare.ns_CloseFile(hFile) create_many_to_one_relationship(seg) return seg # neuroshare structures class ns_FILEDESC(ctypes.Structure): _fields_ = [('szDescription', ctypes.c_char*32), ('szExtension', ctypes.c_char*8), ('szMacCodes', ctypes.c_char*8), ('szMagicCode', ctypes.c_char*16), ] class ns_LIBRARYINFO(ctypes.Structure): _fields_ = [('dwLibVersionMaj', ctypes.c_uint32), ('dwLibVersionMin', ctypes.c_uint32), ('dwAPIVersionMaj', ctypes.c_uint32), ('dwAPIVersionMin', ctypes.c_uint32), ('szDescription', ctypes.c_char*64), ('szCreator',ctypes.c_char*64), ('dwTime_Year',ctypes.c_uint32), ('dwTime_Month',ctypes.c_uint32), ('dwTime_Day',ctypes.c_uint32), ('dwFlags',ctypes.c_uint32), ('dwMaxFiles',ctypes.c_uint32), ('dwFileDescCount',ctypes.c_uint32), ('FileDesc',ns_FILEDESC*16), ] class ns_FILEINFO(ctypes.Structure): _fields_ = [('szFileType', ctypes.c_char*32), ('dwEntityCount', ctypes.c_uint32), ('dTimeStampResolution', ctypes.c_double), ('dTimeSpan', ctypes.c_double), ('szAppName', ctypes.c_char*64), ('dwTime_Year',ctypes.c_uint32), ('dwTime_Month',ctypes.c_uint32), ('dwReserved',ctypes.c_uint32), ('dwTime_Day',ctypes.c_uint32), ('dwTime_Hour',ctypes.c_uint32), ('dwTime_Min',ctypes.c_uint32), ('dwTime_Sec',ctypes.c_uint32), ('dwTime_MilliSec',ctypes.c_uint32), ('szFileComment',ctypes.c_char*256), ] class ns_ENTITYINFO(ctypes.Structure): _fields_ = [('szEntityLabel', ctypes.c_char*32), ('dwEntityType',ctypes.c_uint32), ('dwItemCount',ctypes.c_uint32), ] entity_types = { 0 : 'ns_ENTITY_UNKNOWN' , 1 : 'ns_ENTITY_EVENT' , 2 : 'ns_ENTITY_ANALOG' , 3 : 'ns_ENTITY_SEGMENT' , 4 : 'ns_ENTITY_NEURALEVENT' , } class ns_EVENTINFO(ctypes.Structure): _fields_ = [ ('dwEventType',ctypes.c_uint32), ('dwMinDataLength',ctypes.c_uint32), ('dwMaxDataLength',ctypes.c_uint32), ('szCSVDesc', ctypes.c_char*128), ] class ns_ANALOGINFO(ctypes.Structure): _fields_ = [ ('dSampleRate',ctypes.c_double), ('dMinVal',ctypes.c_double), ('dMaxVal',ctypes.c_double), ('szUnits', ctypes.c_char*16), ('dResolution',ctypes.c_double), ('dLocationX',ctypes.c_double), ('dLocationY',ctypes.c_double), ('dLocationZ',ctypes.c_double), ('dLocationUser',ctypes.c_double), ('dHighFreqCorner',ctypes.c_double), ('dwHighFreqOrder',ctypes.c_uint32), ('szHighFilterType', ctypes.c_char*16), ('dLowFreqCorner',ctypes.c_double), ('dwLowFreqOrder',ctypes.c_uint32), ('szLowFilterType', ctypes.c_char*16), ('szProbeInfo', ctypes.c_char*128), ] class ns_SEGMENTINFO(ctypes.Structure): _fields_ = [ ('dwSourceCount',ctypes.c_uint32), ('dwMinSampleCount',ctypes.c_uint32), ('dwMaxSampleCount',ctypes.c_uint32), ('dSampleRate',ctypes.c_double), ('szUnits', ctypes.c_char*32), ] class ns_SEGSOURCEINFO(ctypes.Structure): _fields_ = [ ('dMinVal',ctypes.c_double), ('dMaxVal',ctypes.c_double), ('dResolution',ctypes.c_double), ('dSubSampleShift',ctypes.c_double), ('dLocationX',ctypes.c_double), ('dLocationY',ctypes.c_double), ('dLocationZ',ctypes.c_double), ('dLocationUser',ctypes.c_double), ('dHighFreqCorner',ctypes.c_double), ('dwHighFreqOrder',ctypes.c_uint32), ('szHighFilterType', ctypes.c_char*16), ('dLowFreqCorner',ctypes.c_double), ('dwLowFreqOrder',ctypes.c_uint32), ('szLowFilterType', ctypes.c_char*16), ('szProbeInfo', ctypes.c_char*128), ] class ns_NEURALINFO(ctypes.Structure): _fields_ = [ ('dwSourceEntityID',ctypes.c_uint32), ('dwSourceUnitID',ctypes.c_uint32), ('szProbeInfo',ctypes.c_char*128), ] neo-0.3.3/neo/io/axonio.py0000644000175000017500000007543312273723542016424 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Classe for reading data from pCLAMP and AxoScope files (.abf version 1 and 2), developed by Molecular device/Axon technologies. - abf = Axon binary file - atf is a text file based format from axon that could be read by AsciiIO (but this file is less efficient.) This code is a port of abfload and abf2load written in Matlab (BSD-2-Clause licence) by : - Copyright (c) 2009, Forrest Collman, fcollman@princeton.edu - Copyright (c) 2004, Harald Hentschke and available here : http://www.mathworks.com/matlabcentral/fileexchange/22114-abf2load Information on abf 1 and 2 formats is available here : http://www.moleculardevices.com/pages/software/developer_info.html This file supports the old (ABF1) and new (ABF2) format. ABF1 (clampfit <=9) and ABF2 (clampfit >10) All possible mode are possible : - event-driven variable-length mode (mode 1) -> return several Segment in the Block - event-driven fixed-length mode (mode 2 or 5) -> return several Segment in the Block - gap free mode -> return one (or sevral) Segment in the Block Supported : Read Author: sgarcia, jnowacki Note: j.s.nowacki@gmail.com has a C++ library with SWIG bindings which also reads abf files - would be good to cross-check """ import datetime import os import struct # file no longer exists in Python3 try: file except NameError: import io file = io.BufferedReader import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import Block, Segment, AnalogSignal, EventArray from neo.io.tools import create_many_to_one_relationship, iteritems class struct_file(file): def read_f(self, fmt , offset = None): if offset is not None: self.seek(offset) return struct.unpack(fmt , self.read(struct.calcsize(fmt))) def write_f(self, fmt , offset = None , *args ): if offset is not None: self.seek(offset) self.write( struct.pack( fmt , *args ) ) def reformat_integer_V1(data, nbchannel , header): """ reformat when dtype is int16 for ABF version 1 """ for i in range(nbchannel): data[:,i] /= header['fInstrumentScaleFactor'][i] data[:,i] /= header['fSignalGain'][i] data[:,i] /= header['fADCProgrammableGain'][i] if header['nTelegraphEnable'][i] : data[:,i] /= header['fTelegraphAdditGain'][i] data[:,i] *= header['fADCRange'] data[:,i] /= header['lADCResolution'] data[:,i] += header['fInstrumentOffset'][i] data[:,i] -= header['fSignalOffset'][i] def reformat_integer_V2(data, nbchannel , header): """ reformat when dtype is int16 for ABF version 2 """ for i in range(nbchannel): data[:,i] /= header['listADCInfo'][i]['fInstrumentScaleFactor'] data[:,i] /= header['listADCInfo'][i]['fSignalGain'] data[:,i] /= header['listADCInfo'][i]['fADCProgrammableGain'] if header['listADCInfo'][i]['nTelegraphEnable'] : data[:,i] /= header['listADCInfo'][i]['fTelegraphAdditGain'] data[:,i] *= header['protocol']['fADCRange'] data[:,i] /= header['protocol']['lADCResolution'] data[:,i] += header['listADCInfo'][i]['fInstrumentOffset'] data[:,i] -= header['listADCInfo'][i]['fSignalOffset'] def clean_string(s): while s.endswith('\x00') : s = s[:-1] while s.endswith(' ') : s = s[:-1] return s class AxonIO(BaseIO): """ Class for reading abf (axon binary file) file. Usage: >>> from neo import io >>> r = io.AxonIO(filename='File_axon_1.abf') >>> bl = r.read_block(lazy=False, cascade=True) >>> print bl.segments [] >>> print bl.segments[0].analogsignals [] >>> print bl.segments[0].eventarrays [] """ is_readable = True is_writable = False supported_objects = [ Block , Segment , AnalogSignal , EventArray ] readable_objects = [ Block ] writeable_objects = [ ] has_header = False is_streameable = False read_params = { Block : [ ] } write_params = None name = 'Axon' extensions = [ 'abf' ] mode = 'file' def __init__(self , filename = None) : """ This class read a abf file. Arguments: filename : the filename to read """ BaseIO.__init__(self) self.filename = filename def read_block(self, lazy = False, cascade = True ): header = self.read_header() version = header['fFileVersionNumber'] bl = Block() bl.file_origin = os.path.basename(self.filename) bl.annotate(abf_version = version) # date and time if version <2. : YY = 1900 MM = 1 DD = 1 hh = int(header['lFileStartTime']/3600.) mm = int((header['lFileStartTime']-hh*3600)/60) ss = header['lFileStartTime']-hh*3600-mm*60 ms = int(np.mod(ss,1)*1e6) ss = int(ss) elif version >=2. : YY = int(header['uFileStartDate']/10000) MM = int((header['uFileStartDate']-YY*10000)/100) DD = int(header['uFileStartDate']-YY*10000-MM*100) hh = int(header['uFileStartTimeMS']/1000./3600.) mm = int((header['uFileStartTimeMS']/1000.-hh*3600)/60) ss = header['uFileStartTimeMS']/1000.-hh*3600-mm*60 ms = int(np.mod(ss,1)*1e6) ss = int(ss) bl.rec_datetime = datetime.datetime( YY , MM , DD , hh , mm , ss , ms) if not cascade: return bl # file format if header['nDataFormat'] == 0 : dt = np.dtype('i2') elif header['nDataFormat'] == 1 : dt = np.dtype('f4') if version <2. : nbchannel = header['nADCNumChannels'] headOffset = header['lDataSectionPtr']*BLOCKSIZE+header['nNumPointsIgnored']*dt.itemsize totalsize = header['lActualAcqLength'] elif version >=2. : nbchannel = header['sections']['ADCSection']['llNumEntries'] headOffset = header['sections']['DataSection']['uBlockIndex']*BLOCKSIZE totalsize = header['sections']['DataSection']['llNumEntries'] data = np.memmap(self.filename , dt , 'r', shape = (totalsize,) , offset = headOffset) # 3 possible modes if version <2. : mode = header['nOperationMode'] elif version >=2. : mode = header['protocol']['nOperationMode'] #~ print 'mode' , mode if (mode == 1) or (mode == 2) or (mode == 5) or (mode == 3): # event-driven variable-length mode (mode 1) # event-driven fixed-length mode (mode 2 or 5) # gap free mode (mode 3) can be in several episod (strange but possible) # read sweep pos if version <2. : nbepisod = header['lSynchArraySize'] offsetEpisod = header['lSynchArrayPtr']*BLOCKSIZE elif version >=2. : nbepisod = header['sections']['SynchArraySection']['llNumEntries'] offsetEpisod = header['sections']['SynchArraySection']['uBlockIndex']*BLOCKSIZE if nbepisod>0: episodArray = np.memmap(self.filename , [('offset','i4'), ('len', 'i4') ] , 'r', shape = (nbepisod), offset = offsetEpisod ) else: episodArray = np.empty( (1) , [('offset','i4'), ('len', 'i4') ] ,) episodArray[0]['len'] = data.size episodArray[0]['offset'] = 0 # sampling_rate if version <2. : sampling_rate = 1./(header['fADCSampleInterval']*nbchannel*1.e-6) * pq.Hz elif version >=2. : sampling_rate = 1.e6/header['protocol']['fADCSequenceInterval'] * pq.Hz # construct block # one sweep = one segment in a block pos = 0 for j in range(episodArray.size): seg = Segment(index = j) length = episodArray[j]['len'] if version <2. : fSynchTimeUnit = header['fSynchTimeUnit'] elif version >=2. : fSynchTimeUnit = header['protocol']['fSynchTimeUnit'] if (fSynchTimeUnit != 0) and (mode == 1) : length /= fSynchTimeUnit subdata = data[pos:pos+length] pos += length subdata = subdata.reshape( (subdata.size/nbchannel, nbchannel )).astype('f') if dt == np.dtype('i2'): if version <2. : reformat_integer_V1(subdata, nbchannel , header) elif version >=2. : reformat_integer_V2(subdata, nbchannel , header) for i in range(nbchannel): if version <2. : name = header['sADCChannelName'][i].replace('\x00','') unit = header['sADCUnits'][i].replace('\xb5', 'u').replace('\x00','')#\xb5 is µ num = header['nADCPtoLChannelMap'][i] elif version >=2. : name = header['listADCInfo'][i]['ADCChNames'].replace('\x00','') unit = header['listADCInfo'][i]['ADCChUnits'].replace('\xb5', 'u').replace('\x00','')#\xb5 is µ num = header['listADCInfo'][i]['nADCNum'] t_start = float(episodArray[j]['offset'])/sampling_rate t_start = t_start.rescale('s') try: pq.Quantity(1, unit) except: #~ print 'bug units', i, unit unit = '' if lazy: signal = [ ] * pq.Quantity(1, unit) else: signal = subdata[:,i] * pq.Quantity(1, unit) anaSig = AnalogSignal(signal, sampling_rate=sampling_rate, t_start=t_start, name=str(name), channel_index=int(num)) if lazy: anaSig.lazy_shape = subdata.shape[0] seg.analogsignals.append( anaSig ) bl.segments.append(seg) if mode in [3,5]:# TODO check if tags exits in other mode # tag is EventArray that should be attached to Block # It is attched to the first Segment times = [ ] labels = [ ] comments = [ ] for i,tag in enumerate(header['listTag']) : times.append(tag['lTagTime']/sampling_rate ) labels.append( str(tag['nTagType']) ) comments.append(clean_string(tag['sComment'])) times = np.array(times) labels = np.array(labels, dtype='S') comments = np.array(comments, dtype='S') # attach all tags to the first segment. seg = bl.segments[0] if lazy : ea = EventArray( times =[ ] * pq.s , labels=np.array([ ], dtype = 'S')) ea.lazy_shape = len(times) else: ea = EventArray( times = times*pq.s, labels = labels, comments = comments ) seg.eventarrays.append(ea) create_many_to_one_relationship(bl) return bl def read_header(self, ): """ read the header of the file The strategy differ here from the original script under Matlab. In the original script for ABF2, it complete the header with informations that are located in other structures. In ABF2 this function return header with sub dict : sections (ABF2) protocol (ABF2) listTags (ABF1&2) listADCInfo (ABF2) listDACInfo (ABF2) dictEpochInfoPerDAC (ABF2) that contain more information. """ fid = struct_file(self.filename,'rb') # version fFileSignature = fid.read(4) if fFileSignature == 'ABF ' : headerDescription = headerDescriptionV1 elif fFileSignature == 'ABF2' : headerDescription = headerDescriptionV2 else : return None # construct dict header = { } for key, offset , fmt in headerDescription : val = fid.read_f(fmt , offset = offset) if len(val) == 1: header[key] = val[0] else : header[key] = np.array(val) # correction of version number and starttime if fFileSignature == 'ABF ' : header['lFileStartTime'] = header['lFileStartTime'] + header['nFileStartMillisecs']*.001 elif fFileSignature == 'ABF2' : n = header['fFileVersionNumber'] header['fFileVersionNumber'] = n[3]+0.1*n[2]+0.01*n[1]+0.001*n[0] header['lFileStartTime'] = header['uFileStartTimeMS']*.001 if header['fFileVersionNumber'] < 2. : # tags listTag = [ ] for i in range(header['lNumTagEntries']) : fid.seek(header['lTagSectionPtr']+i*64) tag = { } for key, fmt in TagInfoDescription : val = fid.read_f(fmt ) if len(val) == 1: tag[key] = val[0] else : tag[key] = np.array(val) listTag.append(tag) header['listTag'] = listTag elif header['fFileVersionNumber'] >= 2. : # in abf2 some info are in other place # sections sections = { } for s,sectionName in enumerate(sectionNames) : uBlockIndex,uBytes,llNumEntries= fid.read_f( 'IIl' , offset = 76 + s * 16 ) sections[sectionName] = { } sections[sectionName]['uBlockIndex'] = uBlockIndex sections[sectionName]['uBytes'] = uBytes sections[sectionName]['llNumEntries'] = llNumEntries header['sections'] = sections # strings sections # hack for reading channels names and units fid.seek(sections['StringsSection']['uBlockIndex']*BLOCKSIZE) bigString = fid.read(sections['StringsSection']['uBytes']) goodstart = bigString.lower().find('clampex') if goodstart == -1 : goodstart = bigString.lower().find('axoscope') bigString = bigString[goodstart:] strings = bigString.split('\x00') # ADC sections header['listADCInfo'] = [ ] for i in range(sections['ADCSection']['llNumEntries']) : # read ADCInfo fid.seek(sections['ADCSection']['uBlockIndex']*\ BLOCKSIZE+sections['ADCSection']['uBytes']*i) ADCInfo = { } for key, fmt in ADCInfoDescription : val = fid.read_f(fmt ) if len(val) == 1: ADCInfo[key] = val[0] else : ADCInfo[key] = np.array(val) ADCInfo['ADCChNames'] = strings[ADCInfo['lADCChannelNameIndex']-1] ADCInfo['ADCChUnits'] = strings[ADCInfo['lADCUnitsIndex']-1] header['listADCInfo'].append( ADCInfo ) # protocol sections protocol = { } fid.seek(sections['ProtocolSection']['uBlockIndex']*BLOCKSIZE) for key, fmt in protocolInfoDescription : val = fid.read_f(fmt ) if len(val) == 1: protocol[key] = val[0] else : protocol[key] = np.array(val) header['protocol'] = protocol # tags listTag = [ ] for i in range(sections['TagSection']['llNumEntries']) : fid.seek(sections['TagSection']['uBlockIndex']*\ BLOCKSIZE+sections['TagSection']['uBytes']*i) tag = { } for key, fmt in TagInfoDescription : val = fid.read_f(fmt ) if len(val) == 1: tag[key] = val[0] else : tag[key] = np.array(val) listTag.append(tag) header['listTag'] = listTag # DAC sections header['listDACInfo'] = [ ] for i in range(sections['DACSection']['llNumEntries']) : # read DACInfo fid.seek(sections['DACSection']['uBlockIndex']*\ BLOCKSIZE+sections['DACSection']['uBytes']*i) DACInfo = { } for key, fmt in DACInfoDescription : val = fid.read_f(fmt ) if len(val) == 1: DACInfo[key] = val[0] else : DACInfo[key] = np.array(val) DACInfo['DACChNames'] = strings[DACInfo['lDACChannelNameIndex']-1] DACInfo['DACChUnits'] = strings[DACInfo['lDACChannelUnitsIndex']-1] header['listDACInfo'].append( DACInfo ) # EpochPerDAC sections # header['dictEpochInfoPerDAC'] is dict of dicts: # - the first index is the DAC number # - the second index is the epoch number # It has to be done like that because data may not exist and may not be in sorted order header['dictEpochInfoPerDAC'] = { } for i in range(sections['EpochPerDACSection']['llNumEntries']) : # read DACInfo fid.seek(sections['EpochPerDACSection']['uBlockIndex']*\ BLOCKSIZE+sections['EpochPerDACSection']['uBytes']*i) EpochInfoPerDAC = { } for key, fmt in EpochInfoPerDACDescription : val = fid.read_f(fmt ) if len(val) == 1: EpochInfoPerDAC[key] = val[0] else : EpochInfoPerDAC[key] = np.array(val) DACNum = EpochInfoPerDAC['nDACNum'] EpochNum = EpochInfoPerDAC['nEpochNum'] # Checking if the key exists, if not, the value is empty # so we have to create empty dict to populate if not header['dictEpochInfoPerDAC'].has_key(DACNum): header['dictEpochInfoPerDAC'][DACNum] = { } header['dictEpochInfoPerDAC'][DACNum][EpochNum] = EpochInfoPerDAC fid.close() return header def read_protocol(self): """ Read the protocol waveform of the file, if present; function works with ABF2 only. Returns: list of segments (one for every episode) with list of analog signls (one for every DAC). """ header = self.read_header() if header['fFileVersionNumber'] < 2. : raise IOError("Protocol is only present in ABF2 files.") nADC = header['sections']['ADCSection']['llNumEntries'] # Number of ADC channels nDAC = header['sections']['DACSection']['llNumEntries'] # Number of DAC channels nSam = header['protocol']['lNumSamplesPerEpisode']/nADC # Number of samples per episode nEpi = header['lActualEpisodes'] # Actual number of episodes sampling_rate = 1.e6/header['protocol']['fADCSequenceInterval'] * pq.Hz # Creating a list of segments with analog signals with just holding levels # List of segments relates to number of episodes, as for recorded data segments = [] for epiNum in range(nEpi): seg = Segment(index=epiNum) # One analog signal for each DAC in segment (episode) for DACNum in range(nDAC): t_start = 0 * pq.s# TODO: Possibly check with episode array name = header['listDACInfo'][DACNum]['DACChNames'] unit = header['listDACInfo'][DACNum]['DACChUnits'].replace('\xb5', 'u')#\xb5 is µ signal = np.ones(nSam)*header['listDACInfo'][DACNum]['fDACHoldingLevel']*pq.Quantity(1, unit) anaSig = AnalogSignal(signal, sampling_rate=sampling_rate, t_start=t_start, name=str(name), channel_index=DACNum) # If there are epoch infos for this DAC if header['dictEpochInfoPerDAC'].has_key(DACNum): # Save last sample index i_last = int(nSam*15625/10**6) # TODO guess for first holding # Go over EpochInfoPerDAC and change the analog signal according to the epochs for epochNum,epoch in iteritems(header['dictEpochInfoPerDAC'][DACNum]): i_begin = i_last i_end = i_last + epoch['lEpochInitDuration'] + epoch['lEpochDurationInc'] * epiNum anaSig[i_begin:i_end] = np.ones(len(range(i_end-i_begin)))*pq.Quantity(1, unit)* \ (epoch['fEpochInitLevel']+epoch['fEpochLevelInc'] * epiNum); i_last += epoch['lEpochInitDuration'] seg.analogsignals.append(anaSig) segments.append(seg) return segments BLOCKSIZE = 512 headerDescriptionV1= [ ('fFileSignature',0,'4s'), ('fFileVersionNumber',4,'f' ), ('nOperationMode',8,'h' ), ('lActualAcqLength',10,'i' ), ('nNumPointsIgnored',14,'h' ), ('lActualEpisodes',16,'i' ), ('lFileStartTime',24,'i' ), ('lDataSectionPtr',40,'i' ), ('lTagSectionPtr',44,'i' ), ('lNumTagEntries',48,'i' ), ('lSynchArrayPtr',92,'i' ), ('lSynchArraySize',96,'i' ), ('nDataFormat',100,'h' ), ('nADCNumChannels', 120, 'h'), ('fADCSampleInterval',122,'f'), ('fSynchTimeUnit',130,'f' ), ('lNumSamplesPerEpisode',138,'i' ), ('lPreTriggerSamples',142,'i' ), ('lEpisodesPerRun',146,'i' ), ('fADCRange', 244, 'f' ), ('lADCResolution', 252, 'i'), ('nFileStartMillisecs', 366, 'h'), ('nADCPtoLChannelMap', 378, '16h'), ('nADCSamplingSeq', 410, '16h'), ('sADCChannelName',442, '10s'*16), ('sADCUnits',602, '8s'*16) , ('fADCProgrammableGain', 730, '16f'), ('fInstrumentScaleFactor', 922, '16f'), ('fInstrumentOffset', 986, '16f'), ('fSignalGain', 1050, '16f'), ('fSignalOffset', 1114, '16f'), ('nTelegraphEnable',4512, '16h'), ('fTelegraphAdditGain',4576,'16f'), ] headerDescriptionV2 =[ ('fFileSignature',0,'4s' ), ('fFileVersionNumber',4,'4b') , ('uFileInfoSize',8,'I' ) , ('lActualEpisodes',12,'I' ) , ('uFileStartDate',16,'I' ) , ('uFileStartTimeMS',20,'I' ) , ('uStopwatchTime',24,'I' ) , ('nFileType',28,'H' ) , ('nDataFormat',30,'H' ) , ('nSimultaneousScan',32,'H' ) , ('nCRCEnable',34,'H' ) , ('uFileCRC',36,'I' ) , ('FileGUID',40,'I' ) , ('uCreatorVersion',56,'I' ) , ('uCreatorNameIndex',60,'I' ) , ('uModifierVersion',64,'I' ) , ('uModifierNameIndex',68,'I' ) , ('uProtocolPathIndex',72,'I' ) , ] sectionNames= ['ProtocolSection', 'ADCSection', 'DACSection', 'EpochSection', 'ADCPerDACSection', 'EpochPerDACSection', 'UserListSection', 'StatsRegionSection', 'MathSection', 'StringsSection', 'DataSection', 'TagSection', 'ScopeSection', 'DeltaSection', 'VoiceTagSection', 'SynchArraySection', 'AnnotationSection', 'StatsSection', ] protocolInfoDescription = [ ('nOperationMode','h'), ('fADCSequenceInterval','f'), ('bEnableFileCompression','b'), ('sUnused1','3s'), ('uFileCompressionRatio','I'), ('fSynchTimeUnit','f'), ('fSecondsPerRun','f'), ('lNumSamplesPerEpisode','i'), ('lPreTriggerSamples','i'), ('lEpisodesPerRun','i'), ('lRunsPerTrial','i'), ('lNumberOfTrials','i'), ('nAveragingMode','h'), ('nUndoRunCount','h'), ('nFirstEpisodeInRun','h'), ('fTriggerThreshold','f'), ('nTriggerSource','h'), ('nTriggerAction','h'), ('nTriggerPolarity','h'), ('fScopeOutputInterval','f'), ('fEpisodeStartToStart','f'), ('fRunStartToStart','f'), ('lAverageCount','i'), ('fTrialStartToStart','f'), ('nAutoTriggerStrategy','h'), ('fFirstRunDelayS','f'), ('nChannelStatsStrategy','h'), ('lSamplesPerTrace','i'), ('lStartDisplayNum','i'), ('lFinishDisplayNum','i'), ('nShowPNRawData','h'), ('fStatisticsPeriod','f'), ('lStatisticsMeasurements','i'), ('nStatisticsSaveStrategy','h'), ('fADCRange','f'), ('fDACRange','f'), ('lADCResolution','i'), ('lDACResolution','i'), ('nExperimentType','h'), ('nManualInfoStrategy','h'), ('nCommentsEnable','h'), ('lFileCommentIndex','i'), ('nAutoAnalyseEnable','h'), ('nSignalType','h'), ('nDigitalEnable','h'), ('nActiveDACChannel','h'), ('nDigitalHolding','h'), ('nDigitalInterEpisode','h'), ('nDigitalDACChannel','h'), ('nDigitalTrainActiveLogic','h'), ('nStatsEnable','h'), ('nStatisticsClearStrategy','h'), ('nLevelHysteresis','h'), ('lTimeHysteresis','i'), ('nAllowExternalTags','h'), ('nAverageAlgorithm','h'), ('fAverageWeighting','f'), ('nUndoPromptStrategy','h'), ('nTrialTriggerSource','h'), ('nStatisticsDisplayStrategy','h'), ('nExternalTagType','h'), ('nScopeTriggerOut','h'), ('nLTPType','h'), ('nAlternateDACOutputState','h'), ('nAlternateDigitalOutputState','h'), ('fCellID','3f'), ('nDigitizerADCs','h'), ('nDigitizerDACs','h'), ('nDigitizerTotalDigitalOuts','h'), ('nDigitizerSynchDigitalOuts','h'), ('nDigitizerType','h'), ] ADCInfoDescription = [ ('nADCNum','h'), ('nTelegraphEnable','h'), ('nTelegraphInstrument','h'), ('fTelegraphAdditGain','f'), ('fTelegraphFilter','f'), ('fTelegraphMembraneCap','f'), ('nTelegraphMode','h'), ('fTelegraphAccessResistance','f'), ('nADCPtoLChannelMap','h'), ('nADCSamplingSeq','h'), ('fADCProgrammableGain','f'), ('fADCDisplayAmplification','f'), ('fADCDisplayOffset','f'), ('fInstrumentScaleFactor','f'), ('fInstrumentOffset','f'), ('fSignalGain','f'), ('fSignalOffset','f'), ('fSignalLowpassFilter','f'), ('fSignalHighpassFilter','f'), ('nLowpassFilterType','b'), ('nHighpassFilterType','b'), ('fPostProcessLowpassFilter','f'), ('nPostProcessLowpassFilterType','c'), ('bEnabledDuringPN','b'), ('nStatsChannelPolarity','h'), ('lADCChannelNameIndex','i'), ('lADCUnitsIndex','i'), ] TagInfoDescription = [ ('lTagTime','i'), ('sComment','56s'), ('nTagType','h'), ('nVoiceTagNumber_or_AnnotationIndex','h'), ] DACInfoDescription = [ ('nDACNum','h'), ('nTelegraphDACScaleFactorEnable','h'), ('fInstrumentHoldingLevel', 'f'), ('fDACScaleFactor','f'), ('fDACHoldingLevel','f'), ('fDACCalibrationFactor','f'), ('fDACCalibrationOffset','f'), ('lDACChannelNameIndex','i'), ('lDACChannelUnitsIndex','i'), ('lDACFilePtr','i'), ('lDACFileNumEpisodes','i'), ('nWaveformEnable','h'), ('nWaveformSource','h'), ('nInterEpisodeLevel','h'), ('fDACFileScale','f'), ('fDACFileOffset','f'), ('lDACFileEpisodeNum','i'), ('nDACFileADCNum','h'), ('nConditEnable','h'), ('lConditNumPulses','i'), ('fBaselineDuration','f'), ('fBaselineLevel','f'), ('fStepDuration','f'), ('fStepLevel','f'), ('fPostTrainPeriod','f'), ('fPostTrainLevel','f'), ('nMembTestEnable','h'), ('nLeakSubtractType','h'), ('nPNPolarity','h'), ('fPNHoldingLevel','f'), ('nPNNumADCChannels','h'), ('nPNPosition','h'), ('nPNNumPulses','h'), ('fPNSettlingTime','f'), ('fPNInterpulse','f'), ('nLTPUsageOfDAC','h'), ('nLTPPresynapticPulses','h'), ('lDACFilePathIndex','i'), ('fMembTestPreSettlingTimeMS','f'), ('fMembTestPostSettlingTimeMS','f'), ('nLeakSubtractADCIndex','h'), ('sUnused','124s'), ] EpochInfoPerDACDescription = [ ('nEpochNum','h'), ('nDACNum','h'), ('nEpochType','h'), ('fEpochInitLevel','f'), ('fEpochLevelInc','f'), ('lEpochInitDuration','i'), ('lEpochDurationInc','i'), ('lEpochPulsePeriod','i'), ('lEpochPulseWidth','i'), ('sUnused','18s'), ] EpochInfoDescription = [ ('nEpochNum','h'), ('nDigitalValue','h'), ('nDigitalTrainValue','h'), ('nAlternateDigitalValue','h'), ('nAlternateDigitalTrainValue','h'), ('bEpochCompression','b'), ('sUnused','21s'), ] neo-0.3.3/neo/io/asciisignalio.py0000644000175000017500000001734412273723542017742 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Class for reading/writing analog signals in a text file. Each columns represents a AnalogSignal. All AnalogSignal have the same sampling rate. Covers many case when part of a file can be viewed as a CSV format. Supported : Read/Write Author: sgarcia """ import csv import os import numpy as np import quantities as pq from neo.io.baseio import BaseIO from neo.core import AnalogSignal, Segment from neo.io.tools import create_many_to_one_relationship class AsciiSignalIO(BaseIO): """ Class for reading signal in generic ascii format. Columns respresents signal. They share all the same sampling rate. The sampling rate is externally known or the first columns could hold the time vector. Usage: >>> from neo import io >>> r = io.AsciiSignalIO(filename='File_asciisignal_2.txt') >>> seg = r.read_segment(lazy=False, cascade=True) >>> print seg.analogsignals [>> from neo import io >>> r = io.ExampleIO(filename='itisafake.nof') >>> seg = r.read_segment(lazy=False, cascade=True) >>> print(seg.analogsignals) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> print(seg.spiketrains) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> print(seg.eventarrays) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE [>> anasig = r.read_analogsignal(lazy=True, cascade=False) >>> print(anasig._data_description) {'shape': (150000,)} >>> anasig = r.read_analogsignal(lazy=False, cascade=False) """ is_readable = True # This class can only read data is_writable = False # write is not supported # This class is able to directly or indirectly handle the following objects # You can notice that this greatly simplifies the full Neo object hierarchy supported_objects = [ Segment , AnalogSignal, SpikeTrain, EventArray ] # This class can return either a Block or a Segment # The first one is the default ( self.read ) # These lists should go from highest object to lowest object because # common_io_test assumes it. readable_objects = [ Segment , AnalogSignal, SpikeTrain ] # This class is not able to write objects writeable_objects = [ ] has_header = False is_streameable = False # This is for GUI stuff : a definition for parameters when reading. # This dict should be keyed by object (`Block`). Each entry is a list # of tuple. The first entry in each tuple is the parameter name. The # second entry is a dict with keys 'value' (for default value), # and 'label' (for a descriptive name). # Note that if the highest-level object requires parameters, # common_io_test will be skipped. read_params = { Segment : [ ('segment_duration', {'value' : 15., 'label' : 'Segment size (s.)'}), ('num_analogsignal', {'value' : 8, 'label' : 'Number of recording points'}), ('num_spiketrain_by_channel', {'value' : 3, 'label' : 'Num of spiketrains'}), ], } # do not supported write so no GUI stuff write_params = None name = 'example' extensions = [ 'nof' ] # mode can be 'file' or 'dir' or 'fake' or 'database' # the main case is 'file' but some reader are base on a directory or a database # this info is for GUI stuff also mode = 'fake' def __init__(self , filename = None) : """ Arguments: filename : the filename Note: - filename is here just for exampe because it will not be take in account - if mode=='dir' the argument should be dirname (See TdtIO) """ BaseIO.__init__(self) self.filename = filename # Seed so all instances can return the same values np.random.seed(1234) # Segment reading is supported so I define this : def read_segment(self, # the 2 first keyword arguments are imposed by neo.io API lazy = False, cascade = True, # all following arguments are decied by this IO and are free segment_duration = 15., num_analogsignal = 4, num_spiketrain_by_channel = 3, ): """ Return a fake Segment. The self.filename does not matter. In this IO read by default a Segment. This is just a example to be adapted to each ClassIO. In this case these 3 paramters are taken in account because this function return a generated segment with fake AnalogSignal and fake SpikeTrain. Parameters: segment_duration :is the size in secend of the segment. num_analogsignal : number of AnalogSignal in this segment num_spiketrain : number of SpikeTrain in this segment """ sampling_rate = 10000. #Hz t_start = -1. #time vector for generated signal timevect = np.arange(t_start, t_start+ segment_duration , 1./sampling_rate) # create an empty segment seg = Segment( name = 'it is a seg from exampleio') if cascade: # read nested analosignal for i in range(num_analogsignal): ana = self.read_analogsignal( lazy = lazy , cascade = cascade , channel_index = i ,segment_duration = segment_duration, t_start = t_start) seg.analogsignals += [ ana ] # read nested spiketrain for i in range(num_analogsignal): for _ in range(num_spiketrain_by_channel): sptr = self.read_spiketrain(lazy = lazy , cascade = cascade , segment_duration = segment_duration, t_start = t_start , channel_index = i) seg.spiketrains += [ sptr ] # create an EventArray that mimic triggers. # note that ExampleIO do not allow to acess directly to EventArray # for that you need read_segment(cascade = True) eva = EventArray() if lazy: # in lazy case no data are readed # eva is empty pass else: # otherwise it really contain data n = 1000 # neo.io support quantities my vector use second for unit eva.times = timevect[(np.random.rand(n)*timevect.size).astype('i')]* pq.s # all duration are the same eva.durations = np.ones(n)*500*pq.ms # label l = [ ] for i in range(n): if np.random.rand()>.6: l.append( 'TriggerA' ) else : l.append( 'TriggerB' ) eva.labels = np.array( l ) seg.eventarrays += [ eva ] create_many_to_one_relationship(seg) return seg def read_analogsignal(self , # the 2 first key arguments are imposed by neo.io API lazy = False, cascade = True, channel_index = 0, segment_duration = 15., t_start = -1, ): """ With this IO AnalogSignal can e acces directly with its channel number """ sr = 10000. sinus_freq = 3. # Hz #time vector for generated signal: tvect = np.arange(t_start, t_start+ segment_duration , 1./sr) if lazy: anasig = AnalogSignal([], units='V', sampling_rate=sr * pq.Hz, t_start=t_start * pq.s, channel_index=channel_index) # we add the attribute lazy_shape with the size if loaded anasig.lazy_shape = tvect.shape else: # create analogsignal (sinus of 3 Hz) sig = np.sin(2*np.pi*tvect*sinus_freq + channel_index/5.*2*np.pi)+np.random.rand(tvect.size) anasig = AnalogSignal(sig, units= 'V', sampling_rate=sr * pq.Hz, t_start=t_start * pq.s, channel_index=channel_index) # for attributes out of neo you can annotate anasig.annotate(info = 'it is a sinus of %f Hz' %sinus_freq ) return anasig def read_spiketrain(self , # the 2 first key arguments are imposed by neo.io API lazy = False, cascade = True, segment_duration = 15., t_start = -1, channel_index = 0, ): """ With this IO SpikeTrain can e acces directly with its channel number """ # There are 2 possibles behaviour for a SpikeTrain # holding many Spike instance or directly holding spike times # we choose here the first : if not HAVE_SCIPY: raise SCIPY_ERR num_spike_by_spiketrain = 40 sr = 10000. if lazy: times = [ ] else: times = (np.random.rand(num_spike_by_spiketrain)*segment_duration + t_start) # create a spiketrain spiketr = SpikeTrain(times, t_start = t_start*pq.s, t_stop = (t_start+segment_duration)*pq.s , units = pq.s, name = 'it is a spiketrain from exampleio', ) if lazy: # we add the attribute lazy_shape with the size if loaded spiketr.lazy_shape = (num_spike_by_spiketrain,) # ours spiketrains also hold the waveforms: # 1 generate a fake spike shape (2d array if trodness >1) w1 = -stats.nct.pdf(np.arange(11,60,4), 5,20)[::-1]/3. w2 = stats.nct.pdf(np.arange(11,60,2), 5,20) w = np.r_[ w1 , w2 ] w = -w/max(w) if not lazy: # in the neo API the waveforms attr is 3 D in case tetrode # in our case it is mono electrode so dim 1 is size 1 waveforms = np.tile( w[np.newaxis,np.newaxis,:], ( num_spike_by_spiketrain ,1, 1) ) waveforms *= np.random.randn(*waveforms.shape)/6+1 spiketr.waveforms = waveforms*pq.mV spiketr.sampling_rate = sr * pq.Hz spiketr.left_sweep = 1.5* pq.s # for attributes out of neo you can annotate spiketr.annotate(channel_index = channel_index) return spiketr neo-0.3.3/neo/io/pynnio.py0000644000175000017500000002221612273723542016432 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Module for reading/writing data from/to legacy PyNN formats. PyNN is available at http://neuralensemble.org/PyNN Classes: PyNNNumpyIO PyNNTextIO Supported: Read/Write Authors: Andrew Davison, Pierre Yger """ import numpy import quantities as pq from neo.io.baseio import BaseIO from neo.core import Segment, AnalogSignal, AnalogSignalArray, SpikeTrain from neo.io.tools import create_many_to_one_relationship UNITS_MAP = { 'spikes': pq.ms, 'v': pq.mV, 'gsyn': pq.UnitQuantity('microsiemens', 1e-6*pq.S, 'uS', 'µS'), # checked } class BasePyNNIO(BaseIO): """ Base class for PyNN IO classes """ is_readable = True is_writable = True has_header = True is_streameable = False # TODO - correct spelling to "is_streamable" supported_objects = [Segment, AnalogSignal, AnalogSignalArray, SpikeTrain] readable_objects = supported_objects writeable_objects = supported_objects mode = 'file' def _read_file_contents(self): raise NotImplementedError def _extract_array(self, data, channel_index): idx = numpy.where(data[:, 1] == channel_index)[0] return data[idx, 0] def _determine_units(self, metadata): if 'units' in metadata: return metadata['units'] elif 'variable' in metadata and metadata['variable'] in UNITS_MAP: return UNITS_MAP[metadata['variable']] else: raise IOError("Cannot determine units") def _extract_signal(self, data, metadata, channel_index, lazy): signal = None if lazy: if channel_index in data[:, 1]: signal = AnalogSignal([], units=self._determine_units(metadata), sampling_period=metadata['dt']*pq.ms, channel_index=channel_index) signal.lazy_shape = None else: arr = self._extract_array(data, channel_index) if len(arr) > 0: signal = AnalogSignal(arr, units=self._determine_units(metadata), sampling_period=metadata['dt']*pq.ms, channel_index=channel_index) if signal is not None: signal.annotate(label=metadata["label"], variable=metadata["variable"]) return signal def _extract_spikes(self, data, metadata, channel_index, lazy): spiketrain = None if lazy: if channel_index in data[:, 1]: spiketrain = SpikeTrain([], units=pq.ms, t_stop=0.0) spiketrain.lazy_shape = None else: spike_times = self._extract_array(data, channel_index) if len(spike_times) > 0: spiketrain = SpikeTrain(spike_times, units=pq.ms, t_stop=spike_times.max()) if spiketrain is not None: spiketrain.annotate(label=metadata["label"], channel_index=channel_index, dt=metadata["dt"]) return spiketrain def _write_file_contents(self, data, metadata): raise NotImplementedError def read_segment(self, lazy=False, cascade=True): data, metadata = self._read_file_contents() annotations = dict((k, metadata.get(k, 'unknown')) for k in ("label", "variable", "first_id", "last_id")) seg = Segment(**annotations) if cascade: if metadata['variable'] == 'spikes': for i in range(metadata['first_index'], metadata['last_index']): spiketrain = self._extract_spikes(data, metadata, i, lazy) if spiketrain is not None: seg.spiketrains.append(spiketrain) seg.annotate(dt=metadata['dt']) # store dt for SpikeTrains only, as can be retrieved from sampling_period for AnalogSignal else: for i in range(metadata['first_index'], metadata['last_index']): # probably slow. Replace with numpy-based version from 0.1 signal = self._extract_signal(data, metadata, i, lazy) if signal is not None: seg.analogsignals.append(signal) create_many_to_one_relationship(seg) return seg def write_segment(self, segment): source = segment.analogsignals or segment.analogsignalarrays or segment.spiketrains assert len(source) > 0, "Segment contains neither analog signals nor spike trains." metadata = segment.annotations.copy() metadata['size'] = len(source) metadata['first_index'] = 0 metadata['last_index'] = metadata['size'] if 'label' not in metadata: metadata['label'] = 'unknown' s0 = source[0] if 'dt' not in metadata: # dt not included in annotations if Segment contains only AnalogSignals metadata['dt'] = s0.sampling_period.rescale(pq.ms).magnitude n = sum(s.size for s in source) metadata['n'] = n data = numpy.empty((n, 2)) # if the 'variable' annotation is a standard one from PyNN, we rescale # to use standard PyNN units # we take the units from the first element of source and scale all # the signals to have the same units if 'variable' in segment.annotations: units = UNITS_MAP.get(segment.annotations['variable'], source[0].dimensionality) else: units = source[0].dimensionality metadata['variable'] = 'unknown' try: metadata['units'] = units.unicode except AttributeError: metadata['units'] = units.u_symbol start = 0 if isinstance(s0, AnalogSignalArray): assert len(source) == 1, "Cannot handle multiple analog signal arrays" source = s0.T for i, signal in enumerate(source): # here signal may be AnalogSignal or SpikeTrain end = start + signal.size data[start:end, 0] = numpy.array(signal.rescale(units)) data[start:end, 1] = i*numpy.ones((signal.size,), dtype=float) # index (what about channel_indexes, if it's an AnalogSignalArray?) start = end self._write_file_contents(data, metadata) def read_analogsignal(self, lazy=False, channel_index=0): # channel_index should be positional arg, no? data, metadata = self._read_file_contents() if metadata['variable'] == 'spikes': raise TypeError("File contains spike data, not analog signals") else: signal = self._extract_signal(data, metadata, channel_index, lazy) if signal is None: raise IndexError("File does not contain a signal with channel index %d" % channel_index) else: return signal def read_analogsignalarray(self, lazy=False): raise NotImplementedError def read_spiketrain(self, lazy=False, channel_index=0): data, metadata = self._read_file_contents() if metadata['variable'] != 'spikes': raise TypeError("File contains analog signals, not spike data") else: spiketrain = self._extract_spikes(data, metadata, channel_index, lazy) if spiketrain is None: raise IndexError("File does not contain any spikes with channel index %d" % channel_index) else: return spiketrain class PyNNNumpyIO(BasePyNNIO): """ Reads/writes data from/to PyNN NumpyBinaryFile format """ name = "PyNN NumpyBinaryFile" extensions = ['npz'] def _read_file_contents(self): contents = numpy.load(self.filename) data = contents["data"] metadata = {} for name,value in contents['metadata']: try: metadata[name] = eval(value) except Exception: metadata[name] = value return data, metadata def _write_file_contents(self, data, metadata): metadata_array = numpy.array(sorted(metadata.items())) numpy.savez(self.filename, data=data, metadata=metadata_array) class PyNNTextIO(BasePyNNIO): """ Reads/writes data from/to PyNN StandardTextFile format """ name = "PyNN StandardTextFile" extensions = ['v', 'ras', 'gsyn'] def _read_metadata(self): metadata = {} with open(self.filename) as f: for line in f: if line[0] == "#": name, value = line[1:].strip().split("=") name = name.strip() try: metadata[name] = eval(value) except Exception: metadata[name] = value.strip() else: break return metadata def _read_file_contents(self): data = numpy.loadtxt(self.filename) metadata = self._read_metadata() return data, metadata def _write_file_contents(self, data, metadata): with open(self.filename, 'wb') as f: for item in sorted(metadata.items()): f.write(("# %s = %s\n" % item).encode('utf8')) numpy.savetxt(f, data) neo-0.3.3/neo/__init__.py0000644000175000017500000000041712265516260016243 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' Neo is a package for representing electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats ''' from neo.core import * from neo.io import * from neo.version import version as __version__ neo-0.3.3/neo/test/0000755000175000017500000000000012273723667015121 5ustar sgarciasgarcia00000000000000neo-0.3.3/neo/test/test_recordingchannel.py0000644000175000017500000002015612273723542022033 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.recordingchannel.RecordingChannel class """ try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.recordingchannel import RecordingChannel from neo.core.analogsignal import AnalogSignal from neo.core.irregularlysampledsignal import IrregularlySampledSignal from neo.test.tools import assert_neo_object_is_compliant, assert_arrays_equal from neo.io.tools import create_many_to_one_relationship class TestRecordingChannel(unittest.TestCase): def setUp(self): self.setup_analogsignals() self.setup_irregularlysampledsignals() self.setup_recordingchannels() def setup_recordingchannels(self): params = {'testarg2': 'yes', 'testarg3': True} self.rchan1 = RecordingChannel(index=10, coordinate=[1.1, 1.5, 1.7]*pq.mm, name='test', description='tester 1', file_origin='test.file', testarg1=1, **params) self.rchan2 = RecordingChannel(index=100, coordinate=[11., 15., 17.]*pq.mm, name='test', description='tester 2', file_origin='test.file', testarg1=1, **params) self.rchan1.annotate(testarg1=1.1, testarg0=[1, 2, 3]) self.rchan2.annotate(testarg11=1.1, testarg10=[1, 2, 3]) self.rchan1.analogsignals = self.sig1 self.rchan2.analogsignals = self.sig2 self.rchan1.irregularlysampledsignals = self.irsig1 self.rchan2.irregularlysampledsignals = self.irsig2 create_many_to_one_relationship(self.rchan1) create_many_to_one_relationship(self.rchan2) def setup_analogsignals(self): signame11 = 'analogsignal 1 1' signame12 = 'analogsignal 1 2' signame21 = 'analogsignal 2 1' signame22 = 'analogsignal 2 2' sigdata11 = np.arange(0, 10) * pq.mV sigdata12 = np.arange(10, 20) * pq.mV sigdata21 = np.arange(20, 30) * pq.V sigdata22 = np.arange(30, 40) * pq.V self.signames1 = [signame11, signame12] self.signames2 = [signame21, signame22] self.signames = [signame11, signame12, signame21, signame22] sig11 = AnalogSignal(sigdata11, name=signame11, sampling_rate=1*pq.Hz) sig12 = AnalogSignal(sigdata12, name=signame12, sampling_rate=1*pq.Hz) sig21 = AnalogSignal(sigdata21, name=signame21, sampling_rate=1*pq.Hz) sig22 = AnalogSignal(sigdata22, name=signame22, sampling_rate=1*pq.Hz) self.sig1 = [sig11, sig12] self.sig2 = [sig21, sig22] self.sig = [sig11, sig12, sig21, sig22] def setup_irregularlysampledsignals(self): irsigname11 = 'irregularsignal 1 1' irsigname12 = 'irregularsignal 1 2' irsigname21 = 'irregularsignal 2 1' irsigname22 = 'irregularsignal 2 2' irsigdata11 = np.arange(0, 10) * pq.mA irsigdata12 = np.arange(10, 20) * pq.mA irsigdata21 = np.arange(20, 30) * pq.A irsigdata22 = np.arange(30, 40) * pq.A irsigtimes11 = np.arange(0, 10) * pq.ms irsigtimes12 = np.arange(10, 20) * pq.ms irsigtimes21 = np.arange(20, 30) * pq.s irsigtimes22 = np.arange(30, 40) * pq.s self.irsignames1 = [irsigname11, irsigname12] self.irsignames2 = [irsigname21, irsigname22] self.irsignames = [irsigname11, irsigname12, irsigname21, irsigname22] irsig11 = IrregularlySampledSignal(irsigtimes11, irsigdata11, name=irsigname11) irsig12 = IrregularlySampledSignal(irsigtimes12, irsigdata12, name=irsigname12) irsig21 = IrregularlySampledSignal(irsigtimes21, irsigdata21, name=irsigname21) irsig22 = IrregularlySampledSignal(irsigtimes22, irsigdata22, name=irsigname22) self.irsig1 = [irsig11, irsig12] self.irsig2 = [irsig21, irsig22] self.irsig = [irsig11, irsig12, irsig21, irsig22] def test_recordingchannel_creation(self): assert_neo_object_is_compliant(self.rchan1) assert_neo_object_is_compliant(self.rchan2) self.assertEqual(self.rchan1.index, 10) self.assertEqual(self.rchan2.index, 100) assert_arrays_equal(self.rchan1.coordinate, [1.1, 1.5, 1.7]*pq.mm) assert_arrays_equal(self.rchan2.coordinate, [11., 15., 17.]*pq.mm) self.assertEqual(self.rchan1.name, 'test') self.assertEqual(self.rchan2.name, 'test') self.assertEqual(self.rchan1.description, 'tester 1') self.assertEqual(self.rchan2.description, 'tester 2') self.assertEqual(self.rchan1.file_origin, 'test.file') self.assertEqual(self.rchan2.file_origin, 'test.file') self.assertEqual(self.rchan1.annotations['testarg0'], [1, 2, 3]) self.assertEqual(self.rchan2.annotations['testarg10'], [1, 2, 3]) self.assertEqual(self.rchan1.annotations['testarg1'], 1.1) self.assertEqual(self.rchan2.annotations['testarg1'], 1) self.assertEqual(self.rchan2.annotations['testarg11'], 1.1) self.assertEqual(self.rchan1.annotations['testarg2'], 'yes') self.assertEqual(self.rchan2.annotations['testarg2'], 'yes') self.assertTrue(self.rchan1.annotations['testarg3']) self.assertTrue(self.rchan2.annotations['testarg3']) self.assertTrue(hasattr(self.rchan1, 'analogsignals')) self.assertTrue(hasattr(self.rchan2, 'analogsignals')) self.assertEqual(len(self.rchan1.analogsignals), 2) self.assertEqual(len(self.rchan2.analogsignals), 2) for res, targ in zip(self.rchan1.analogsignals, self.sig1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.rchan2.analogsignals, self.sig2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.rchan1, 'irregularlysampledsignals')) self.assertTrue(hasattr(self.rchan2, 'irregularlysampledsignals')) self.assertEqual(len(self.rchan1.irregularlysampledsignals), 2) self.assertEqual(len(self.rchan2.irregularlysampledsignals), 2) for res, targ in zip(self.rchan1.irregularlysampledsignals, self.irsig1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.rchan2.irregularlysampledsignals, self.irsig2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.rchan1, 'recordingchannelgroups')) self.assertTrue(hasattr(self.rchan2, 'recordingchannelgroups')) def test_recordingchannel_merge(self): self.rchan1.merge(self.rchan2) sigres1 = [sig.name for sig in self.rchan1.analogsignals] sigres2 = [sig.name for sig in self.rchan2.analogsignals] irsigres1 = [sig.name for sig in self.rchan1.irregularlysampledsignals] irsigres2 = [sig.name for sig in self.rchan2.irregularlysampledsignals] self.assertEqual(sigres1, self.signames) self.assertEqual(sigres2, self.signames2) self.assertEqual(irsigres1, self.irsignames) self.assertEqual(irsigres2, self.irsignames2) for res, targ in zip(self.rchan1.analogsignals, self.sig): assert_arrays_equal(res, targ) for res, targ in zip(self.rchan2.analogsignals, self.sig2): assert_arrays_equal(res, targ) for res, targ in zip(self.rchan1.irregularlysampledsignals, self.irsig): assert_arrays_equal(res, targ) for res, targ in zip(self.rchan2.irregularlysampledsignals, self.irsig2): assert_arrays_equal(res, targ) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/tools.py0000644000175000017500000004753512273723542016641 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' Tools for use with neo tests. ''' import hashlib import os import numpy as np import quantities as pq import neo from neo import description def assert_arrays_equal(a, b): ''' Check if two arrays have the same shape and contents ''' assert isinstance(a, np.ndarray), "a is a %s" % type(a) assert isinstance(b, np.ndarray), "b is a %s" % type(b) assert a.shape == b.shape, "%s != %s" % (a, b) #assert a.dtype == b.dtype, "%s and %s not same dtype %s %s" % (a, b, # a.dtype, # b.dtype) try: assert (a.flatten() == b.flatten()).all(), "%s != %s" % (a, b) except (AttributeError, ValueError): try: ar = np.array(a) br = np.array(b) assert (ar.flatten() == br.flatten()).all(), "%s != %s" % (ar, br) except (AttributeError, ValueError): assert np.all(a.flatten() == b.flatten()), "%s != %s" % (a, b) def assert_arrays_almost_equal(a, b, threshold): ''' Check if two arrays have the same shape and contents that differ by abs(a - b) <= threshold for all elements. ''' assert isinstance(a, np.ndarray), "a is a %s" % type(a) assert isinstance(b, np.ndarray), "b is a %s" % type(b) assert a.shape == b.shape, "%s != %s" % (a, b) #assert a.dtype == b.dtype, "%s and %b not same dtype %s %s" % (a, b, # a.dtype, # b.dtype) if a.dtype.kind in ['f', 'c', 'i']: assert (abs(a - b) < threshold).all(), \ "abs(%s - %s) max(|a - b|) = %s threshold:%s" % \ (a, b, (abs(a - b)).max(), threshold) def file_digest(filename): ''' Get the sha1 hash of the file with the given filename. ''' with open(filename, 'rb') as fobj: return hashlib.sha1(fobj.read()).hexdigest() def assert_file_contents_equal(a, b): ''' Assert that two files have the same size and hash. ''' def generate_error_message(a, b): ''' This creates the error message for the assertion error ''' size_a = os.stat(a).st_size size_b = os.stat(b).st_size if size_a == size_b: return "Files have the same size but different contents" else: return "Files have different sizes: a:%d b: %d" % (size_a, size_b) assert file_digest(a) == file_digest(b), generate_error_message(a, b) def assert_neo_object_is_compliant(ob): ''' Test neo compliance of one object and sub objects (one_to_many_relation only): * check types and/or presence of necessary and recommended attribute. * If attribute is Quantities or numpy.ndarray it also check ndim. * If attribute is numpy.ndarray also check dtype.kind. ''' assert type(ob) in description.objectlist, \ '%s is not a neo object' % (type(ob)) classname = ob.__class__.__name__ necess = description.classes_necessary_attributes[classname] recomm = description.classes_recommended_attributes[classname] # test presence of necessary attributes attributes = necess for ioattr in attributes: attrname, attrtype = ioattr[0], ioattr[1] #~ if attrname != '': if classname not in description.classes_inheriting_quantities: assert hasattr(ob, attrname), '%s neo obect does not have %s' % \ (classname, attrname) # test attributes types attributes = necess + recomm for ioattr in attributes: attrname, attrtype = ioattr[0], ioattr[1] if (classname in description.classes_inheriting_quantities and description.classes_inheriting_quantities[classname] == attrname and (attrtype == pq.Quantity or attrtype == np.ndarray)): # object is hinerited from Quantity (AnalogSIgnal, SpikeTrain, ...) ndim = ioattr[2] assert ob.ndim == ndim, \ '%s dimension is %d should be %d' % (classname, ob.ndim, ndim) if attrtype == np.ndarray: dtp = ioattr[3] assert ob.dtype.kind == dtp.kind, \ '%s dtype.kind is %s should be %s' % (classname, ob.dtype.kind, dtp.kind) elif hasattr(ob, attrname): if getattr(ob, attrname) is not None: obattr = getattr(ob, attrname) assert issubclass(type(obattr), attrtype), \ '%s in %s is %s should be %s' % \ (attrname, classname, type(obattr), attrtype) if attrtype == pq.Quantity or attrtype == np.ndarray: ndim = ioattr[2] assert obattr.ndim == ndim, \ '%s.%s dimension is %d should be %d' % \ (classname, attrname, obattr.ndim, ndim) if attrtype == np.ndarray: dtp = ioattr[3] assert obattr.dtype.kind == dtp.kind, \ '%s.%s dtype.kind is %s should be %s' % \ (classname, attrname, obattr.dtype.kind, dtp.kind) # test bijectivity : one_to_many_relationship and many_to_one_relationship if classname in description.one_to_many_relationship: for childname in description.one_to_many_relationship[classname]: if not hasattr(ob, childname.lower()+'s'): continue sub = getattr(ob, childname.lower()+'s') for i, child in enumerate(sub): assert hasattr(child, classname.lower()), \ '%s should have %s attribute (2 way relationship)' % \ (childname, classname.lower()) if hasattr(child, classname.lower()): assert getattr(child, classname.lower()) == ob, \ '%s.%s %s is not symetric with %s.%s s' % \ (childname, classname.lower(), i, classname, childname.lower()) # recursive on one to many rel if classname in description.one_to_many_relationship: for childname in description.one_to_many_relationship[classname]: if not hasattr(ob, childname.lower()+'s'): continue sub = getattr(ob, childname.lower()+'s') for i, child in enumerate(sub): try: assert_neo_object_is_compliant(child) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from %s %s of %s' % (childname, i, classname),) raise def assert_same_sub_schema(ob1, ob2, equal_almost=False, threshold=1e-10): ''' Test if ob1 and ob2 has the same sub schema. Explore all one_to_many_relationship. Many_to_many_relationship is not tested because of infinite recursive loops. Arguments: equal_almost: if False do a strict arrays_equal if True do arrays_almost_equal ''' assert type(ob1) == type(ob2), 'type(%s) != type(%s)' % (type(ob1), type(ob2)) classname = ob1.__class__.__name__ if isinstance(ob1, list): assert len(ob1) == len(ob2), \ 'lens %s and %s not equal for %s and %s' % \ (len(ob1), len(ob2), ob1, ob2) for i, (sub1, sub2) in enumerate(zip(ob1, ob2)): try: assert_same_sub_schema(sub1, sub2, equal_almost=equal_almost, threshold=threshold) # intercept exceptions and add more information except BaseException as exc: exc.args += ('%s[%s]' % (classname, i),) raise return if classname in description.one_to_many_relationship: # test one_to_many_relationship for child in description.one_to_many_relationship[classname]: if not hasattr(ob1, child.lower()+'s'): assert not hasattr(ob2, child.lower()+'s'), \ '%s 2 does have %s but not %s 1' % (classname, child, classname) continue else: assert hasattr(ob2, child.lower()+'s'), \ '%s 1 has %s but not %s 2' % (classname, child, classname) sub1 = getattr(ob1, child.lower()+'s') sub2 = getattr(ob2, child.lower()+'s') assert len(sub1) == len(sub2), \ 'theses two %s do not have the same %s number: %s and %s' % \ (classname, child, len(sub1), len(sub2)) for i in range(len(getattr(ob1, child.lower()+'s'))): # previously lacking parameter try: assert_same_sub_schema(sub1[i], sub2[i], equal_almost, threshold) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from %s[%s] of %s' % (child, i, classname),) raise # check if all attributes are equal if equal_almost: def assert_arrays_equal_and_dtype(a, b): assert_arrays_equal(a, b) assert a.dtype == b.dtype, \ "%s and %s not same dtype %s and %s" % (a, b, a.dtype, b.dtype) assert_eg = assert_arrays_equal_and_dtype else: def assert_arrays_almost_and_dtype(a, b): assert_arrays_almost_equal(a, b, threshold) #assert a.dtype == b.dtype, \ #"%s and %s not same dtype %s %s" % (a, b, a.dtype, b.dtype) assert_eg = assert_arrays_almost_and_dtype necess = description.classes_necessary_attributes[classname] recomm = description.classes_recommended_attributes[classname] attributes = necess + recomm for ioattr in attributes: attrname, attrtype = ioattr[0], ioattr[1] #~ if attrname =='': if (classname in description.classes_inheriting_quantities and description.classes_inheriting_quantities[classname] == attrname): # object is hinerited from Quantity (AnalogSIgnal, SpikeTrain, ...) try: assert_eg(ob1.magnitude, ob2.magnitude) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from %s' % classname,) raise assert ob1.dimensionality.string == ob2.dimensionality.string, \ 'Units of %s are not the same: %s and %s' % \ (classname, ob1.dimensionality.string, ob2.dimensionality.string) continue if not hasattr(ob1, attrname): assert not hasattr(ob2, attrname), \ '%s 2 does have %s but not %s 1' % (classname, attrname, classname) continue else: assert hasattr(ob2, attrname), \ '%s 1 has %s but not %s 2' % (classname, attrname, classname) if getattr(ob1, attrname) is None: assert getattr(ob2, attrname) is None, \ 'In %s.%s %s and %s differed' % (classname, attrname, getattr(ob1, attrname), getattr(ob2, attrname)) continue if getattr(ob2, attrname) is None: assert getattr(ob1, attrname) is None, \ 'In %s.%s %s and %s differed' % (classname, attrname, getattr(ob1, attrname), getattr(ob2, attrname)) continue if attrtype == pq.Quantity: # Compare magnitudes mag1 = getattr(ob1, attrname).magnitude mag2 = getattr(ob2, attrname).magnitude #print "2. ob1(%s) %s:%s\n ob2(%s) %s:%s" % \ #(ob1,attrname,mag1,ob2,attrname,mag2) try: assert_eg(mag1, mag2) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from %s of %s' % (attrname, classname),) raise # Compare dimensionalities dim1 = getattr(ob1, attrname).dimensionality.simplified dim2 = getattr(ob2, attrname).dimensionality.simplified dimstr1 = getattr(ob1, attrname).dimensionality.string dimstr2 = getattr(ob2, attrname).dimensionality.string assert dim1 == dim2, \ 'Attribute %s of %s are not the same: %s != %s' % \ (attrname, classname, dimstr1, dimstr2) elif attrtype == np.ndarray: try: assert_eg(getattr(ob1, attrname), getattr(ob2, attrname)) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from %s of %s' % (attrname, classname),) raise else: #~ print 'yep', getattr(ob1, attrname), getattr(ob2, attrname) assert getattr(ob1, attrname) == getattr(ob2, attrname), \ 'Attribute %s.%s are not the same %s %s %s %s' % \ (classname, attrname, type(getattr(ob1, attrname)), getattr(ob1, attrname), type(getattr(ob2, attrname)), getattr(ob2, attrname)) def assert_sub_schema_is_lazy_loaded(ob): ''' This is util for testing lazy load. All object must load with ndarray.size or Quantity.size ==0 ''' classname = ob.__class__.__name__ if classname in description.one_to_many_relationship: for childname in description.one_to_many_relationship[classname]: if not hasattr(ob, childname.lower()+'s'): continue sub = getattr(ob, childname.lower()+'s') for i, child in enumerate(sub): try: assert_sub_schema_is_lazy_loaded(child) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from %s %s of %s' % (childname, i, classname),) raise necess = description.classes_necessary_attributes[classname] recomm = description.classes_recommended_attributes[classname] attributes = necess + recomm for ioattr in attributes: attrname, attrtype = ioattr[0], ioattr[1] #~ print 'xdsd', classname, attrname #~ if attrname == '': if (classname in description.classes_inheriting_quantities and description.classes_inheriting_quantities[classname] == attrname): assert ob.size == 0, \ 'Lazy loaded error %s.size = %s' % (classname, ob.size) assert hasattr(ob, 'lazy_shape'), \ 'Lazy loaded error, %s should have lazy_shape attribute' % \ classname continue if not hasattr(ob, attrname) or getattr(ob, attrname) is None: continue #~ print 'hjkjh' if (attrtype == pq.Quantity or attrtype == np.ndarray): # FIXME: it is a workaround for recordingChannelGroup.channel_names # which is nupy.array but allowed to be loaded when lazy == True if ob.__class__ == neo.RecordingChannelGroup: continue ndim = ioattr[2] #~ print 'ndim', ndim #~ print getattr(ob, attrname).size if ndim >= 1: assert getattr(ob, attrname).size == 0, \ 'Lazy loaded error %s.%s.size = %s' % \ (classname, attrname, getattr(ob, attrname).size) assert hasattr(ob, 'lazy_shape'), \ 'Lazy loaded error ' +\ '%s should have lazy_shape attribute ' % classname +\ 'because of %s attribute' % attrname lazy_shape_arrays = {'SpikeTrain': 'times', 'Spike': 'waveform', 'AnalogSignal': 'signal', 'AnalogSignalArray': 'signal', 'EventArray': 'times', 'EpochArray': 'times'} def assert_lazy_sub_schema_can_be_loaded(ob, io): ''' This is util for testing lazy load. All object must load with ndarray.size or Quantity.size ==0 ''' classname = ob.__class__.__name__ if classname in lazy_shape_arrays: new_load = io.load_lazy_object(ob) assert hasattr(ob, 'lazy_shape'), \ 'Object %s was not lazy loaded' % classname assert not hasattr(new_load, 'lazy_shape'), \ 'Newly loaded object from %s was also lazy loaded' % classname if classname in description.classes_inheriting_quantities: assert ob.lazy_shape == new_load.shape, \ 'Shape of loaded object %sis not equal to lazy shape' % \ classname else: assert ob.lazy_shape == \ getattr(new_load, lazy_shape_arrays[classname]).shape, \ 'Shape of loaded object %s not equal to lazy shape' %\ classname elif classname in description.one_to_many_relationship: for childname in description.one_to_many_relationship[classname]: if not hasattr(ob, childname.lower() + 's'): continue sub = getattr(ob, childname.lower() + 's') for i, child in enumerate(sub): try: assert_lazy_sub_schema_can_be_loaded(child, io) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from of %s %s of %s' % (childname, i, classname),) raise def assert_objects_equivalent(obj1, obj2): ''' Compares two NEO objects by looping over the attributes and annotations and asserting their hashes. No relationships involved. ''' def assert_attr(obj1, obj2, attr_name): ''' Assert a single attribute and annotation are the same ''' assert hasattr(obj1, attr_name) attr1 = hashlib.md5(getattr(obj1, attr_name)).hexdigest() assert hasattr(obj2, attr_name) attr2 = hashlib.md5(getattr(obj2, attr_name)).hexdigest() assert attr1 == attr2, "Attribute %s for class %s is not equal." % \ (attr_name, description.name_by_class[obj1.__class__]) obj_type = description.name_by_class[obj1.__class__] assert obj_type == description.name_by_class[obj2.__class__] for ioattr in description.classes_necessary_attributes[obj_type]: assert_attr(obj1, obj2, ioattr[0]) for ioattr in description.classes_recommended_attributes[obj_type]: if hasattr(obj1, ioattr[0]) or hasattr(obj2, ioattr[0]): assert_attr(obj1, obj2, ioattr[0]) if hasattr(obj1, "annotations"): assert hasattr(obj2, "annotations") for key, value in obj1.annotations: assert hasattr(obj2.annotations, key) assert obj2.annotations[key] == value def assert_children_empty(obj, parent): ''' Check that the children of a neo object are empty. Used to check the cascade is implemented properly ''' classname = obj.__class__.__name__ errmsg = '''%s reader with cascade=False should return empty children''' % parent.__name__ try: childlist = description.one_to_many_relationship[classname] except KeyError: childlist = [] for childname in childlist: children = getattr(obj, childname.lower() + 's') assert len(children) == 0, errmsg neo-0.3.3/neo/test/test_recordingchannelgroup.py0000644000175000017500000002376612273723542023122 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.recordingchannelgroup.RecordingChannelGroup class """ try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.recordingchannelgroup import RecordingChannelGroup from neo.core.analogsignalarray import AnalogSignalArray from neo.core.recordingchannel import RecordingChannel from neo.core.unit import Unit from neo.test.tools import assert_arrays_equal, assert_neo_object_is_compliant from neo.io.tools import create_many_to_one_relationship class TestRecordingChannelGroup(unittest.TestCase): def setUp(self): self.setup_unit() self.setup_analogsignalarrays() self.setup_recordingchannels() self.setup_recordingchannelgroups() def setup_recordingchannelgroups(self): params = {'testarg2': 'yes', 'testarg3': True} self.rcg1 = RecordingChannelGroup(name='test', description='tester 1', file_origin='test.file', testarg1=1, **params) self.rcg2 = RecordingChannelGroup(name='test', description='tester 2', file_origin='test.file', testarg1=1, **params) self.rcg1.annotate(testarg1=1.1, testarg0=[1, 2, 3]) self.rcg2.annotate(testarg11=1.1, testarg10=[1, 2, 3]) self.rcg1.units = self.units1 self.rcg2.units = self.units2 self.rcg1.recordingchannels = self.rchan1 self.rcg2.recordingchannels = self.rchan2 self.rcg1.analogsignalarrays = self.sigarr1 self.rcg2.analogsignalarrays = self.sigarr2 create_many_to_one_relationship(self.rcg1) create_many_to_one_relationship(self.rcg2) def setup_unit(self): unitname11 = 'unit 1 1' unitname12 = 'unit 1 2' unitname21 = 'unit 2 1' unitname22 = 'unit 2 2' self.unitnames1 = [unitname11, unitname12] self.unitnames2 = [unitname21, unitname22, unitname11] self.unitnames = [unitname11, unitname12, unitname21, unitname22] unit11 = Unit(name=unitname11, channel_indexes=np.array([1])) unit12 = Unit(name=unitname12, channel_indexes=np.array([2])) unit21 = Unit(name=unitname21, channel_indexes=np.array([1])) unit22 = Unit(name=unitname22, channel_indexes=np.array([2])) unit23 = Unit(name=unitname11, channel_indexes=np.array([1])) self.units1 = [unit11, unit12] self.units2 = [unit21, unit22, unit23] self.units = [unit11, unit12, unit21, unit22] def setup_recordingchannels(self): rchanname11 = 'chan 1 1' rchanname12 = 'chan 1 2' rchanname21 = 'chan 2 1' rchanname22 = 'chan 2 2' self.rchannames1 = [rchanname11, rchanname12] self.rchannames2 = [rchanname21, rchanname22, rchanname11] self.rchannames = [rchanname11, rchanname12, rchanname21, rchanname22] rchan11 = RecordingChannel(name=rchanname11) rchan12 = RecordingChannel(name=rchanname12) rchan21 = RecordingChannel(name=rchanname21) rchan22 = RecordingChannel(name=rchanname22) rchan23 = RecordingChannel(name=rchanname11) self.rchan1 = [rchan11, rchan12] self.rchan2 = [rchan21, rchan22, rchan23] self.rchan = [rchan11, rchan12, rchan21, rchan22] def setup_analogsignalarrays(self): sigarrname11 = 'analogsignalarray 1 1' sigarrname12 = 'analogsignalarray 1 2' sigarrname21 = 'analogsignalarray 2 1' sigarrname22 = 'analogsignalarray 2 2' sigarrdata11 = np.arange(0, 10).reshape(5, 2) * pq.mV sigarrdata12 = np.arange(10, 20).reshape(5, 2) * pq.mV sigarrdata21 = np.arange(20, 30).reshape(5, 2) * pq.V sigarrdata22 = np.arange(30, 40).reshape(5, 2) * pq.V sigarrdata112 = np.hstack([sigarrdata11, sigarrdata11]) * pq.mV self.sigarrnames1 = [sigarrname11, sigarrname12] self.sigarrnames2 = [sigarrname21, sigarrname22, sigarrname11] self.sigarrnames = [sigarrname11, sigarrname12, sigarrname21, sigarrname22] sigarr11 = AnalogSignalArray(sigarrdata11, name=sigarrname11, sampling_rate=1*pq.Hz, channel_index=np.array([1])) sigarr12 = AnalogSignalArray(sigarrdata12, name=sigarrname12, sampling_rate=1*pq.Hz, channel_index=np.array([2])) sigarr21 = AnalogSignalArray(sigarrdata21, name=sigarrname21, sampling_rate=1*pq.Hz, channel_index=np.array([1])) sigarr22 = AnalogSignalArray(sigarrdata22, name=sigarrname22, sampling_rate=1*pq.Hz, channel_index=np.array([2])) sigarr23 = AnalogSignalArray(sigarrdata11, name=sigarrname11, sampling_rate=1*pq.Hz, channel_index=np.array([1])) sigarr112 = AnalogSignalArray(sigarrdata112, name=sigarrname11, sampling_rate=1*pq.Hz, channel_index=np.array([1])) self.sigarr1 = [sigarr11, sigarr12] self.sigarr2 = [sigarr21, sigarr22, sigarr23] self.sigarr = [sigarr112, sigarr12, sigarr21, sigarr22] def test__recordingchannelgroup__init_defaults(self): rcg = RecordingChannelGroup() assert_neo_object_is_compliant(rcg) self.assertEqual(rcg.name, None) self.assertEqual(rcg.file_origin, None) self.assertEqual(rcg.recordingchannels, []) self.assertEqual(rcg.analogsignalarrays, []) assert_arrays_equal(rcg.channel_names, np.array([], dtype='S')) assert_arrays_equal(rcg.channel_indexes, np.array([])) def test_recordingchannelgroup__init(self): rcg = RecordingChannelGroup(file_origin='temp.dat', channel_indexes=np.array([1])) assert_neo_object_is_compliant(rcg) self.assertEqual(rcg.file_origin, 'temp.dat') self.assertEqual(rcg.name, None) self.assertEqual(rcg.recordingchannels, []) self.assertEqual(rcg.analogsignalarrays, []) assert_arrays_equal(rcg.channel_names, np.array([], dtype='S')) assert_arrays_equal(rcg.channel_indexes, np.array([1])) def test_recordingchannelgroup__compliance(self): assert_neo_object_is_compliant(self.rcg1) assert_neo_object_is_compliant(self.rcg2) self.assertEqual(self.rcg1.name, 'test') self.assertEqual(self.rcg2.name, 'test') self.assertEqual(self.rcg1.description, 'tester 1') self.assertEqual(self.rcg2.description, 'tester 2') self.assertEqual(self.rcg1.file_origin, 'test.file') self.assertEqual(self.rcg2.file_origin, 'test.file') self.assertEqual(self.rcg1.annotations['testarg0'], [1, 2, 3]) self.assertEqual(self.rcg2.annotations['testarg10'], [1, 2, 3]) self.assertEqual(self.rcg1.annotations['testarg1'], 1.1) self.assertEqual(self.rcg2.annotations['testarg1'], 1) self.assertEqual(self.rcg2.annotations['testarg11'], 1.1) self.assertEqual(self.rcg1.annotations['testarg2'], 'yes') self.assertEqual(self.rcg2.annotations['testarg2'], 'yes') self.assertTrue(self.rcg1.annotations['testarg3']) self.assertTrue(self.rcg2.annotations['testarg3']) self.assertTrue(hasattr(self.rcg1, 'units')) self.assertTrue(hasattr(self.rcg2, 'units')) self.assertEqual(len(self.rcg1.units), 2) self.assertEqual(len(self.rcg2.units), 3) self.assertEqual(self.rcg1.units, self.units1) self.assertEqual(self.rcg2.units, self.units2) self.assertTrue(hasattr(self.rcg1, 'recordingchannels')) self.assertTrue(hasattr(self.rcg2, 'recordingchannels')) self.assertEqual(len(self.rcg1.recordingchannels), 2) self.assertEqual(len(self.rcg2.recordingchannels), 3) for res, targ in zip(self.rcg1.recordingchannels, self.rchan1): self.assertEqual(res.name, targ.name) for res, targ in zip(self.rcg2.recordingchannels, self.rchan2): self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.rcg1, 'analogsignalarrays')) self.assertTrue(hasattr(self.rcg2, 'analogsignalarrays')) self.assertEqual(len(self.rcg1.analogsignalarrays), 2) self.assertEqual(len(self.rcg2.analogsignalarrays), 3) for res, targ in zip(self.rcg1.analogsignalarrays, self.sigarr1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.rcg2.analogsignalarrays, self.sigarr2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) def test_recordingchannelgroup__merge(self): self.rcg1.merge(self.rcg2) chanres1 = [chan.name for chan in self.rcg1.recordingchannels] chanres2 = [chan.name for chan in self.rcg2.recordingchannels] unitres1 = [unit.name for unit in self.rcg1.units] unitres2 = [unit.name for unit in self.rcg2.units] sigarrres1 = [sigarr.name for sigarr in self.rcg1.analogsignalarrays] sigarrres2 = [sigarr.name for sigarr in self.rcg2.analogsignalarrays] self.assertEqual(chanres1, self.rchannames) self.assertEqual(chanres2, self.rchannames2) self.assertEqual(unitres1, self.unitnames) self.assertEqual(unitres2, self.unitnames2) self.assertEqual(sigarrres1, self.sigarrnames) self.assertEqual(sigarrres2, self.sigarrnames2) for res, targ in zip(self.rcg1.analogsignalarrays, self.sigarr): assert_arrays_equal(res, targ) for res, targ in zip(self.rcg2.analogsignalarrays, self.sigarr2): assert_arrays_equal(res, targ) if __name__ == '__main__': unittest.main() neo-0.3.3/neo/test/__init__.py0000644000175000017500000000015712265516260017223 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Contains tests for neo.core The subdirectory iotest contains tests for neo.io """ neo-0.3.3/neo/test/test_block.py0000644000175000017500000001336512273723542017624 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.block.Block class """ try: import unittest2 as unittest except ImportError: import unittest from neo.core.block import Block from neo.core.recordingchannelgroup import RecordingChannelGroup from neo.core.recordingchannel import RecordingChannel from neo.core.segment import Segment from neo.core.unit import Unit from neo.io.tools import create_many_to_one_relationship from neo.test.tools import assert_neo_object_is_compliant class TestBlock(unittest.TestCase): def setUp(self): unitname11 = 'unit 1 1' unitname12 = 'unit 1 2' unitname21 = 'unit 2 1' unitname22 = 'unit 2 2' channame11 = 'chan 1 1' channame12 = 'chan 1 2' channame21 = 'chan 2 1' channame22 = 'chan 2 2' segname11 = 'seg 1 1' segname12 = 'seg 1 2' segname21 = 'seg 2 1' segname22 = 'seg 2 2' self.rcgname1 = 'rcg 1' self.rcgname2 = 'rcg 2' self.unitnames1 = [unitname11, unitname12] self.unitnames2 = [unitname21, unitname22, unitname11] self.unitnames = [unitname11, unitname12, unitname21, unitname22] self.channames1 = [channame11, channame12] self.channames2 = [channame21, channame22, channame11] self.channames = [channame11, channame12, channame21, channame22] self.segnames1 = [segname11, segname12] self.segnames2 = [segname21, segname22, segname11] self.segnames = [segname11, segname12, segname21, segname22] unit11 = Unit(name=unitname11) unit12 = Unit(name=unitname12) unit21 = Unit(name=unitname21) unit22 = Unit(name=unitname22) unit23 = unit11 chan11 = RecordingChannel(name=channame11) chan12 = RecordingChannel(name=channame12) chan21 = RecordingChannel(name=channame21) chan22 = RecordingChannel(name=channame22) chan23 = chan11 seg11 = Segment(name=segname11) seg12 = Segment(name=segname12) seg21 = Segment(name=segname21) seg22 = Segment(name=segname22) seg23 = seg11 self.units1 = [unit11, unit12] self.units2 = [unit21, unit22, unit23] self.units = [unit11, unit12, unit21, unit22] self.chan1 = [chan11, chan12] self.chan2 = [chan21, chan22, chan23] self.chan = [chan11, chan12, chan21, chan22] self.seg1 = [seg11, seg12] self.seg2 = [seg21, seg22, seg23] self.seg = [seg11, seg12, seg21, seg22] self.rcg1 = RecordingChannelGroup(name=self.rcgname1) self.rcg2 = RecordingChannelGroup(name=self.rcgname2) self.rcg1.units = self.units1 self.rcg2.units = self.units2 self.rcg1.recordingchannels = self.chan1 self.rcg2.recordingchannels = self.chan2 def test_block_init(self): blk = Block(name='a block') assert_neo_object_is_compliant(blk) self.assertEqual(blk.name, 'a block') self.assertEqual(blk.file_origin, None) def test_block_list_units(self): blk = Block(name='a block') blk.recordingchannelgroups = [self.rcg1, self.rcg2] create_many_to_one_relationship(blk) #assert_neo_object_is_compliant(blk) unitres1 = [unit.name for unit in blk.recordingchannelgroups[0].units] unitres2 = [unit.name for unit in blk.recordingchannelgroups[1].units] unitres = [unit.name for unit in blk.list_units] self.assertEqual(self.unitnames1, unitres1) self.assertEqual(self.unitnames2, unitres2) self.assertEqual(self.unitnames, unitres) def test_block_list_recordingchannel(self): blk = Block(name='a block') blk.recordingchannelgroups = [self.rcg1, self.rcg2] create_many_to_one_relationship(blk) #assert_neo_object_is_compliant(blk) chanres1 = [chan.name for chan in blk.recordingchannelgroups[0].recordingchannels] chanres2 = [chan.name for chan in blk.recordingchannelgroups[1].recordingchannels] chanres = [chan.name for chan in blk.list_recordingchannels] self.assertEqual(self.channames1, chanres1) self.assertEqual(self.channames2, chanres2) self.assertEqual(self.channames, chanres) def test_block_merge(self): blk1 = Block(name='block 1') blk2 = Block(name='block 2') rcg3 = RecordingChannelGroup(name=self.rcgname1) rcg3.units = self.units1 + [self.units2[0]] rcg3.recordingchannels = self.chan1 + [self.chan2[1]] blk1.recordingchannelgroups = [self.rcg1] blk2.recordingchannelgroups = [self.rcg2, rcg3] blk1.segments = self.seg1 blk2.segments = self.seg2 blk1.merge(blk2) rcgres1 = [rcg.name for rcg in blk1.recordingchannelgroups] rcgres2 = [rcg.name for rcg in blk2.recordingchannelgroups] segres1 = [seg.name for seg in blk1.segments] segres2 = [seg.name for seg in blk2.segments] chanres1 = [chan.name for chan in blk1.list_recordingchannels] chanres2 = [chan.name for chan in blk2.list_recordingchannels] unitres1 = [unit.name for unit in blk1.list_units] unitres2 = [unit.name for unit in blk2.list_units] self.assertEqual(rcgres1, [self.rcgname1, self.rcgname2]) self.assertEqual(rcgres2, [self.rcgname2, self.rcgname1]) self.assertEqual(segres1, self.segnames) self.assertEqual(segres2, self.segnames2) self.assertEqual(chanres1, self.channames1 + self.channames2[-2::-1]) self.assertEqual(chanres2, self.channames2[:-1] + self.channames1) self.assertEqual(unitres1, self.unitnames) self.assertEqual(unitres2, self.unitnames2[:-1] + self.unitnames1) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/0000755000175000017500000000000012273723667016430 5ustar sgarciasgarcia00000000000000neo-0.3.3/neo/test/iotest/test_klustakwikio.py0000644000175000017500000003570712265516260022564 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.klustakwikio """ # needed for python 3 compatibility from __future__ import absolute_import import glob import os.path import sys import tempfile try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq import neo from neo.test.iotest.common_io_test import BaseTestIO from neo.test.tools import assert_arrays_almost_equal from neo.io.klustakwikio import KlustaKwikIO, HAVE_MLAB @unittest.skipUnless(HAVE_MLAB, "requires matplotlib") @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class testFilenameParser(unittest.TestCase): """Tests that filenames can be loaded with or without basename. The test directory contains two basenames and some decoy files with malformed group numbers.""" def setUp(self): self.dirname = os.path.join(tempfile.gettempdir(), 'files_for_testing_neo', 'klustakwik/test1') if not os.path.exists(self.dirname): raise unittest.SkipTest('data directory does not exist: ' + self.dirname) def test1(self): """Tests that files can be loaded by basename""" kio = KlustaKwikIO(filename=os.path.join(self.dirname, 'basename')) if not BaseTestIO.use_network: raise unittest.SkipTest("Requires download of data from the web") fetfiles = kio._fp.read_filenames('fet') self.assertEqual(len(fetfiles), 2) self.assertEqual(os.path.abspath(fetfiles[0]), os.path.abspath(os.path.join(self.dirname, 'basename.fet.0'))) self.assertEqual(os.path.abspath(fetfiles[1]), os.path.abspath(os.path.join(self.dirname, 'basename.fet.1'))) def test2(self): """Tests that files are loaded even without basename""" pass # this test is in flux, should probably have it default to # basename = os.path.split(dirname)[1] when dirname is a directory #~ dirname = os.path.normpath('./files_for_tests/klustakwik/test1') #~ kio = KlustaKwikIO(filename=dirname) #~ fetfiles = kio._fp.read_filenames('fet') #~ # It will just choose one of the two basenames, depending on which #~ # is first, so just assert that it did something without error. #~ self.assertNotEqual(len(fetfiles), 0) def test3(self): """Tests that files can be loaded by basename2""" kio = KlustaKwikIO(filename=os.path.join(self.dirname, 'basename2')) if not BaseTestIO.use_network: raise unittest.SkipTest("Requires download of data from the web") clufiles = kio._fp.read_filenames('clu') self.assertEqual(len(clufiles), 1) self.assertEqual(os.path.abspath(clufiles[1]), os.path.abspath(os.path.join(self.dirname, 'basename2.clu.1'))) @unittest.skipUnless(HAVE_MLAB, "requires matplotlib") @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class testRead(unittest.TestCase): """Tests that data can be read from KlustaKwik files""" def setUp(self): self.dirname = os.path.join(tempfile.gettempdir(), 'files_for_testing_neo', 'klustakwik/test2') if not os.path.exists(self.dirname): raise unittest.SkipTest('data directory does not exist: ' + self.dirname) def test1(self): """Tests that data and metadata are read correctly""" kio = KlustaKwikIO(filename=os.path.join(self.dirname, 'base'), sampling_rate=1000.) block = kio.read()[0] seg = block.segments[0] self.assertEqual(len(seg.spiketrains), 4) for st in seg.spiketrains: self.assertEqual(st.units, np.array(1.0) * pq.s) self.assertEqual(st.t_start, 0.0) self.assertEqual(seg.spiketrains[0].name, 'unit 1 from group 0') self.assertEqual(seg.spiketrains[0].annotations['cluster'], 1) self.assertEqual(seg.spiketrains[0].annotations['group'], 0) self.assertTrue(np.all(seg.spiketrains[0].times == np.array([.100, .200]))) self.assertEqual(seg.spiketrains[1].name, 'unit 2 from group 0') self.assertEqual(seg.spiketrains[1].annotations['cluster'], 2) self.assertEqual(seg.spiketrains[1].annotations['group'], 0) self.assertEqual(seg.spiketrains[1].t_start, 0.0) self.assertTrue(np.all(seg.spiketrains[1].times == np.array([.305]))) self.assertEqual(seg.spiketrains[2].name, 'unit -1 from group 1') self.assertEqual(seg.spiketrains[2].annotations['cluster'], -1) self.assertEqual(seg.spiketrains[2].annotations['group'], 1) self.assertEqual(seg.spiketrains[2].t_start, 0.0) self.assertTrue(np.all(seg.spiketrains[2].times == np.array([.253]))) self.assertEqual(seg.spiketrains[3].name, 'unit 2 from group 1') self.assertEqual(seg.spiketrains[3].annotations['cluster'], 2) self.assertEqual(seg.spiketrains[3].annotations['group'], 1) self.assertEqual(seg.spiketrains[3].t_start, 0.0) self.assertTrue(np.all(seg.spiketrains[3].times == np.array([.050, .152]))) def test2(self): """Checks that cluster id autosets to 0 without clu file""" kio = KlustaKwikIO(filename=os.path.join(self.dirname, 'base2'), sampling_rate=1000.) block = kio.read()[0] seg = block.segments[0] self.assertEqual(len(seg.spiketrains), 1) self.assertEqual(seg.spiketrains[0].name, 'unit 0 from group 5') self.assertEqual(seg.spiketrains[0].annotations['cluster'], 0) self.assertEqual(seg.spiketrains[0].annotations['group'], 5) self.assertEqual(seg.spiketrains[0].t_start, 0.0) self.assertTrue(np.all(seg.spiketrains[0].times == np.array([0.026, 0.122, 0.228]))) @unittest.skipUnless(HAVE_MLAB, "requires matplotlib") @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class testWrite(unittest.TestCase): def setUp(self): self.dirname = os.path.join(tempfile.gettempdir(), 'files_for_testing_neo', 'klustakwik/test3') if not os.path.exists(self.dirname): raise unittest.SkipTest('data directory does not exist: ' + self.dirname) def test1(self): """Create clu and fet files based on spiketrains in a block. Checks that Files are created Converted to samples correctly Missing sampling rate are taken from IO reader default Spiketrains without cluster info are assigned to cluster 0 Spiketrains across segments are concatenated """ block = neo.Block() segment = neo.Segment() segment2 = neo.Segment() block.segments.append(segment) block.segments.append(segment2) # Fake spiketrain 1, will be sorted st1 = neo.SpikeTrain(times=[.002, .004, .006], units='s', t_stop=1.) st1.annotations['cluster'] = 0 st1.annotations['group'] = 0 segment.spiketrains.append(st1) # Fake spiketrain 1B, on another segment. No group specified, # default is 0. st1B = neo.SpikeTrain(times=[.106], units='s', t_stop=1.) st1B.annotations['cluster'] = 0 segment2.spiketrains.append(st1B) # Fake spiketrain 2 on same group, no sampling rate specified st2 = neo.SpikeTrain(times=[.001, .003, .011], units='s', t_stop=1.) st2.annotations['cluster'] = 1 st2.annotations['group'] = 0 segment.spiketrains.append(st2) # Fake spiketrain 3 on new group, with different sampling rate st3 = neo.SpikeTrain(times=[.05, .09, .10], units='s', t_stop=1.) st3.annotations['cluster'] = -1 st3.annotations['group'] = 1 segment.spiketrains.append(st3) # Fake spiketrain 4 on new group, without cluster info st4 = neo.SpikeTrain(times=[.005, .009], units='s', t_stop=1.) st4.annotations['group'] = 2 segment.spiketrains.append(st4) # Create empty directory for writing delete_test_session() # Create writer with default sampling rate kio = KlustaKwikIO(filename=os.path.join(self.dirname, 'base1'), sampling_rate=1000.) kio.write_block(block) # Check files were created for fn in ['.fet.0', '.fet.1', '.clu.0', '.clu.1']: self.assertTrue(os.path.exists(os.path.join(self.dirname, 'base1' + fn))) # Check files contain correct content # Spike times on group 0 data = file(os.path.join(self.dirname, 'base1.fet.0')).readlines() data = [int(d) for d in data] self.assertEqual(data, [0, 2, 4, 6, 1, 3, 11, 106]) # Clusters on group 0 data = file(os.path.join(self.dirname, 'base1.clu.0')).readlines() data = [int(d) for d in data] self.assertEqual(data, [2, 0, 0, 0, 1, 1, 1, 0]) # Spike times on group 1 data = file(os.path.join(self.dirname, 'base1.fet.1')).readlines() data = [int(d) for d in data] self.assertEqual(data, [0, 50, 90, 100]) # Clusters on group 1 data = file(os.path.join(self.dirname, 'base1.clu.1')).readlines() data = [int(d) for d in data] self.assertEqual(data, [1, -1, -1, -1]) # Spike times on group 2 data = file(os.path.join(self.dirname, 'base1.fet.2')).readlines() data = [int(d) for d in data] self.assertEqual(data, [0, 5, 9]) # Clusters on group 2 data = file(os.path.join(self.dirname, 'base1.clu.2')).readlines() data = [int(d) for d in data] self.assertEqual(data, [1, 0, 0]) # Empty out test session again delete_test_session() @unittest.skipUnless(HAVE_MLAB, "requires matplotlib") @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class testWriteWithFeatures(unittest.TestCase): def setUp(self): self.dirname = os.path.join(tempfile.gettempdir(), 'files_for_testing_neo', 'klustakwik/test4') if not os.path.exists(self.dirname): raise unittest.SkipTest('data directory does not exist: ' + self.dirname) def test1(self): """Create clu and fet files based on spiketrains in a block. Checks that Files are created Converted to samples correctly Missing sampling rate are taken from IO reader default Spiketrains without cluster info are assigned to cluster 0 Spiketrains across segments are concatenated """ block = neo.Block() segment = neo.Segment() segment2 = neo.Segment() block.segments.append(segment) block.segments.append(segment2) # Fake spiketrain 1 st1 = neo.SpikeTrain(times=[.002, .004, .006], units='s', t_stop=1.) st1.annotations['cluster'] = 0 st1.annotations['group'] = 0 wff = np.array([ [11.3, 0.2], [-0.3, 12.3], [3.0, -2.5]]) st1.annotations['waveform_features'] = wff segment.spiketrains.append(st1) # Create empty directory for writing if not os.path.exists(self.dirname): os.mkdir(self.dirname) delete_test_session(self.dirname) # Create writer kio = KlustaKwikIO(filename=os.path.join(self.dirname, 'base2'), sampling_rate=1000.) kio.write_block(block) # Check files were created for fn in ['.fet.0', '.clu.0']: self.assertTrue(os.path.exists(os.path.join(self.dirname, 'base2' + fn))) # Check files contain correct content fi = file(os.path.join(self.dirname, 'base2.fet.0')) # first line is nbFeatures self.assertEqual(fi.readline(), '2\n') # Now check waveforms and times are same data = fi.readlines() new_wff = [] new_times = [] for line in data: line_split = line.split() new_wff.append([float(val) for val in line_split[:-1]]) new_times.append(int(line_split[-1])) self.assertEqual(new_times, [2, 4, 6]) assert_arrays_almost_equal(wff, np.array(new_wff), .00001) # Clusters on group 0 data = file(os.path.join(self.dirname, 'base2.clu.0')).readlines() data = [int(d) for d in data] self.assertEqual(data, [1, 0, 0, 0]) # Now read the features and test same block = kio.read_block() train = block.segments[0].spiketrains[0] assert_arrays_almost_equal(wff, train.annotations['waveform_features'], .00001) # Empty out test session again delete_test_session(self.dirname) @unittest.skipUnless(HAVE_MLAB, "requires matplotlib") @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class CommonTests(BaseTestIO, unittest.TestCase): ioclass = KlustaKwikIO # These are the files it tries to read and test for compliance files_to_test = [ 'test2/base', 'test2/base2', ] # Will fetch from g-node if they don't already exist locally # How does it know to do this before any of the other tests? files_to_download = [ 'test1/basename.clu.0', 'test1/basename.fet.-1', 'test1/basename.fet.0', 'test1/basename.fet.1', 'test1/basename.fet.1a', 'test1/basename.fet.a1', 'test1/basename2.clu.1', 'test1/basename2.fet.1', 'test1/basename2.fet.1a', 'test2/base2.fet.5', 'test2/base.clu.0', 'test2/base.clu.1', 'test2/base.fet.0', 'test2/base.fet.1', 'test3/base1.clu.0', 'test3/base1.clu.1', 'test3/base1.clu.2', 'test3/base1.fet.0', 'test3/base1.fet.1', 'test3/base1.fet.2' ] def delete_test_session(dirname=None): """Removes all file in directory so we can test writing to it""" if dirname is None: dirname = os.path.join(os.path.dirname(__file__), 'files_for_tests/klustakwik/test3') for fi in glob.glob(os.path.join(dirname, '*')): os.remove(fi) if __name__ == '__main__': unittest.main() neo-0.3.3/neo/test/iotest/test_elphyio.py0000644000175000017500000000133512265516260021502 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.elphyio """ # needed for python 3 compatibility from __future__ import division import sys try: import unittest2 as unittest except ImportError: import unittest from neo.io import ElphyIO from neo.test.iotest.common_io_test import BaseTestIO @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class TestElphyIO(BaseTestIO, unittest.TestCase): ioclass = ElphyIO files_to_test = ['ElphyExample.DAT', 'ElphyExample_Mode1.dat', 'ElphyExample_Mode2.dat', 'ElphyExample_Mode3.dat', ] files_to_download = files_to_test if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/tools.py0000644000175000017500000003465312265516260020143 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' Common tools that are useful for neo.io object tests ''' # needed for python 3 compatibility from __future__ import absolute_import import logging import os import shutil import tempfile try: from urllib import urlretrieve # Py2 except ImportError: from urllib.request import urlretrieve # Py3 from neo.core import Block, Segment from neo.test.iotest.generate_datasets import generate_from_supported_objects def can_use_network(): ''' Return True if network access is allowed ''' if os.environ.get('NOSETESTS_NO_NETWORK', False): return False if os.environ.get('TRAVIS') == 'true': return False return True def make_all_directories(filename, localdir): ''' Make the directories needed to store test files ''' # handle case of multiple filenames if not hasattr(filename, 'lower'): for ifilename in filename: make_all_directories(ifilename, localdir) return fullpath = os.path.join(localdir, os.path.dirname(filename)) if os.path.dirname(filename) != '' and not os.path.exists(fullpath): if not os.path.exists(os.path.dirname(fullpath)): make_all_directories(os.path.dirname(filename), localdir) os.mkdir(fullpath) def download_test_file(filename, localdir, url): ''' Download a test file from a server if it isn't already available. filename is the name of the file. localdir is the local directory to store the file in. url is the remote url that the file should be downloaded from. ''' # handle case of multiple filenames if not hasattr(filename, 'lower'): for ifilename in filename: download_test_file(ifilename, localdir, url) return localfile = os.path.join(localdir, filename) distantfile = url + '/' + filename if not os.path.exists(localfile): logging.info('Downloading %s here %s', distantfile, localfile) urlretrieve(distantfile, localfile) def create_local_temp_dir(name, directory=None): ''' Create a directory for storing temporary files needed for testing neo If directory is None or not specified, automatically create the directory in {tempdir}/files_for_testing_neo on linux/unix/mac or {tempdir}\files_for_testing_neo on windows, where {tempdir} is the system temporary directory returned by tempfile.gettempdir(). ''' if directory is None: directory = os.path.join(tempfile.gettempdir(), 'files_for_testing_neo') if not os.path.exists(directory): os.mkdir(directory) directory = os.path.join(directory, name) if not os.path.exists(directory): os.mkdir(directory) return directory def close_object_safe(obj): ''' Close an object safely, ignoring errors For some io types, like HDF5IO, the file should be closed before being opened again in a test. Call this after the test is done to make sure the file is closed. ''' try: obj.close() except: pass def cleanup_test_file(mode, path, directory=None): ''' Remove test files or directories safely. mode is the mode of the io class, either 'file' or 'directory'. It can also be an io class object, or any other object with a 'mode' attribute. If that is the case, use the 'mode' attribute from the object. If directory is not None and path is not an absolute path already, use the file from the given directory. ''' if directory is not None and not os.path.isabs(path): path = os.path.join(directory, path) if hasattr(mode, 'mode'): mode = mode.mode if mode == 'file': if os.path.exists(path): os.remove(path) elif mode == 'dir': if os.path.exists(path): shutil.rmtree(path) def create_generic_io_object(ioclass, filename=None, directory=None, return_path=False, clean=False): ''' Create an io object in a generic way that can work with both file-based and directory-based io objects If filename is None, create a filename. If return_path is True, also return the full path to the file. If directory is not None and path is not an absolute path already, use the file from the given directory. If return_path is True, return the full path of the file along with the io object. return reader, path. Default is False. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. ''' # create a filename if none is provided if filename is None: filename = 'Generated0_%s' % ioclass.__name__ if (ioclass.mode == 'file' and len(ioclass.extensions) >= 1): filename += '.' + ioclass.extensions[0] # if a directory is provided add it if directory is not None and not os.path.isabs(filename): filename = os.path.join(directory, filename) if clean: cleanup_test_file(ioclass, filename) try: # actually create the object if ioclass.mode == 'file': ioobj = ioclass(filename=filename) elif ioclass.mode == 'dir': ioobj = ioclass(dirname=filename) else: ioobj = None except: print(filename) raise # return the full path if requested, otherwise don't if return_path: return ioobj, filename return ioobj def iter_generic_io_objects(ioclass, filenames, directory=None, return_path=False, clean=False): ''' Return an iterable over the io objects created from a list of filenames. The objects are automatically cleaned up afterwards. If directory is not None and path is not an absolute path already, use the file from the given directory. If return_path is True, yield the full path of the file along with the io object. yield reader, path. Default is False. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. ''' for filename in filenames: ioobj, path = create_generic_io_object(ioclass, filename=filename, directory=directory, return_path=True, clean=clean) if ioobj is None: continue if return_path: yield ioobj, path else: yield ioobj close_object_safe(ioobj) def create_generic_reader(ioobj, target=None, readall=False): ''' Create a function that can read the target object from a file. If target is None, use the first supported_objects from ioobj If target is False, use the 'read' method. If target is the Block or Segment class, use read_block or read_segment, respectively. If target is a string, use 'read_'+target. If readall is True, use the read_all_ method instead of the read_ method. Default is False. ''' if target is None: target = ioobj.supported_objects[0].__name__ if target == Block: if readall: return ioobj.read_all_blocks return ioobj.read_block elif target == Segment: if readall: return ioobj.read_all_segments return ioobj.read_segment elif not target: if readall: raise ValueError('readall cannot be True if target is False') return ioobj.read elif hasattr(target, 'lower'): if readall: return getattr(ioobj, 'read_all_%ss' % target.lower()) return getattr(ioobj, 'read_%s' % target.lower()) def iter_generic_readers(ioclass, filenames, directory=None, target=None, return_path=False, return_ioobj=False, clean=False, readall=False): ''' Iterate over functions that can read the target object from a list of filenames. If target is None, use the first supported_objects from ioobj If target is False, use the 'read' method. If target is the Block or Segment class, use read_block or read_segment, respectively. If target is a string, use 'read_'+target. If directory is not None and path is not an absolute path already, use the file from the given directory. If return_path is True, return the full path of the file along with the reader object. return reader, path. If return_ioobj is True, return the io object as well as the reader. return reader, ioobj. Default is False. If both return_path and return_ioobj is True, return reader, path, ioobj. Default is False. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. If readall is True, use the read_all_ method instead of the read_ method. Default is False. ''' for ioobj, path in iter_generic_io_objects(ioclass=ioclass, filenames=filenames, directory=directory, return_path=True, clean=clean): res = create_generic_reader(ioobj, target=target, readall=readall) if not return_path and not return_ioobj: yield res else: res = (res, ) if return_path: res = res + (path,) if return_ioobj: res = res + (ioobj,) yield res def create_generic_writer(ioobj, target=None): ''' Create a function that can write the target object to a file using the neo io object ioobj. If target is None, use the first supported_objects from ioobj If target is False, use the 'write' method. If target is the Block or Segment class, use write_block or write_segment, respectively. If target is a string, use 'write_'+target. ''' if target is None: target = ioobj.supported_objects[0].__name__ if target == Block: return ioobj.write_block elif target == Segment: return ioobj.write_segment elif not target: return ioobj.write elif hasattr(target, 'lower'): return getattr(ioobj, 'write_' + target.lower()) def read_generic(ioobj, target=None, cascade=True, lazy=False, readall=False, return_reader=False): ''' Read the target object from a file using the given neo io object ioobj. If target is None, use the first supported_objects from ioobj If target is False, use the 'write' method. If target is the Block or Segment class, use write_block or write_segment, respectively. If target is a string, use 'write_'+target. The cascade and lazy parameters are passed to the reader. Defaults are True and False, respectively. If readall is True, use the read_all_ method instead of the read_ method. Default is False. If return_reader is True, yield the io reader function as well as the object. yield obj, reader. Default is False. ''' obj_reader = create_generic_reader(ioobj, target=target, readall=readall) obj = obj_reader(cascade=cascade, lazy=lazy) if return_reader: return obj, obj_reader return obj def iter_read_objects(ioclass, filenames, directory=None, target=None, return_path=False, return_ioobj=False, return_reader=False, clean=False, readall=False, cascade=True, lazy=False): ''' Iterate over objects read from a list of filenames. If target is None, use the first supported_objects from ioobj If target is False, use the 'read' method. If target is the Block or Segment class, use read_block or read_segment, respectively. If target is a string, use 'read_'+target. If directory is not None and path is not an absolute path already, use the file from the given directory. If return_path is True, yield the full path of the file along with the object. yield obj, path. If return_ioobj is True, yield the io object as well as the object. yield obj, ioobj. Default is False. If return_reader is True, yield the io reader function as well as the object. yield obj, reader. Default is False. If some combination of return_path, return_ioobj, and return_reader is True, they are yielded in the order: obj, path, ioobj, reader. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. The cascade and lazy parameters are passed to the reader. Defaults are True and False, respectively. If readall is True, use the read_all_ method instead of the read_ method. Default is False. ''' for obj_reader, path, ioobj in iter_generic_readers(ioclass, filenames, directory=directory, target=target, return_path=True, return_ioobj=True, clean=clean, readall=readall): obj = obj_reader(cascade=cascade, lazy=lazy) if not return_path and not return_ioobj and not return_reader: yield obj else: obj = (obj, ) if return_path: obj = obj + (path,) if return_ioobj: obj = obj + (ioobj,) if return_reader: obj = obj + (obj_reader,) yield obj def write_generic(ioobj, target=None, obj=None, return_writer=False): ''' Write the target object to a file using the given neo io object ioobj. If target is None, use the first supported_objects from ioobj If target is False, use the 'write' method. If target is the Block or Segment class, use write_block or write_segment, respectively. If target is a string, use 'write_'+target. obj is the object to write. If obj is None, an object is created automatically for the io class. If return_writer is True, yield the io writer function as well as the object. yield obj, writer. Default is False. ''' if obj is None: supported_objects = ioobj.supported_objects obj = generate_from_supported_objects(supported_objects) obj_writer = create_generic_writer(ioobj, target=target) obj_writer(obj) if return_writer: return obj, obj_writer return obj neo-0.3.3/neo/test/iotest/test_neuroshareio.py0000644000175000017500000000056012265516260022533 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.neuroshareio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest #from neo.io import NeuroshareIO #~ class TestNeuroshareIO(unittest.TestCase): #~ pass if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_tdtio.py0000644000175000017500000000246312265516260021157 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.tdtio """ # needed for python 3 compatibility from __future__ import absolute_import, division import sys try: import unittest2 as unittest except ImportError: import unittest from neo.io import TdtIO from neo.test.iotest.common_io_test import BaseTestIO @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class TestTdtIOIO(BaseTestIO, unittest.TestCase, ): ioclass = TdtIO files_to_test = ['aep_05'] files_to_download = ['aep_05/Block-1/aep_05_Block-1.Tbk', 'aep_05/Block-1/aep_05_Block-1.Tdx', 'aep_05/Block-1/aep_05_Block-1.tev', 'aep_05/Block-1/aep_05_Block-1.tsq', #~ 'aep_05/Block-2/aep_05_Block-2.Tbk', #~ 'aep_05/Block-2/aep_05_Block-2.Tdx', #~ 'aep_05/Block-2/aep_05_Block-2.tev', #~ 'aep_05/Block-2/aep_05_Block-2.tsq', #~ 'aep_05/Block-3/aep_05_Block-3.Tbk', #~ 'aep_05/Block-3/aep_05_Block-3.Tdx', #~ 'aep_05/Block-3/aep_05_Block-3.tev', #~ 'aep_05/Block-3/aep_05_Block-3.tsq', ] if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_alphaomegaio.py0000644000175000017500000000110012265516260022445 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.alphaomegaio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.io import AlphaOmegaIO from neo.test.iotest.common_io_test import BaseTestIO class TestAlphaOmegaIO(BaseTestIO, unittest.TestCase): files_to_test = ['File_AlphaOmega_1.map', 'File_AlphaOmega_2.map'] files_to_download = files_to_test ioclass = AlphaOmegaIO if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/generate_datasets.py0000644000175000017500000001324112273723542022455 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' Generate datasets for testing ''' # needed for python 3 compatibility from __future__ import absolute_import import numpy as np from numpy.random import rand import quantities as pq from neo.core import (AnalogSignal, Block, EpochArray, EventArray, RecordingChannel, Segment, SpikeTrain) from neo.io.tools import (create_many_to_one_relationship, populate_RecordingChannel, iteritems) def generate_one_simple_block(block_name='block_0', nb_segment=3, supported_objects=[], **kws): bl = Block() # name = block_name) objects = supported_objects if Segment in objects: for s in range(nb_segment): seg = generate_one_simple_segment(seg_name="seg" + str(s), supported_objects=objects, **kws) bl.segments.append(seg) if RecordingChannel in objects: populate_RecordingChannel(bl) return bl def generate_one_simple_segment(seg_name='segment 0', supported_objects=[], nb_analogsignal=4, t_start=0.*pq.s, sampling_rate=10*pq.kHz, duration=6.*pq.s, nb_spiketrain=6, spikerate_range=[.5*pq.Hz, 12*pq.Hz], event_array_types={'stim': ['a', 'b', 'c', 'd'], 'enter_zone': ['one', 'two'], 'color': ['black', 'yellow', 'green'], }, event_array_size_range=[5, 20], epoch_array_types={'animal state': ['Sleep', 'Freeze', 'Escape'], 'light': ['dark', 'lighted'] }, epoch_array_duration_range=[.5, 3.], ): seg = Segment(name=seg_name) if AnalogSignal in supported_objects: for a in range(nb_analogsignal): anasig = AnalogSignal(rand(int(sampling_rate * duration)), sampling_rate=sampling_rate, t_start=t_start, units=pq.mV, channel_index=a, name='sig %d for segment %s' % (a, seg.name)) seg.analogsignals.append(anasig) if SpikeTrain in supported_objects: for s in range(nb_spiketrain): spikerate = rand()*np.diff(spikerate_range) spikerate += spikerate_range[0].magnitude #spikedata = rand(int((spikerate*duration).simplified))*duration #sptr = SpikeTrain(spikedata, # t_start=t_start, t_stop=t_start+duration) # #, name = 'spiketrain %d'%s) spikes = rand(int((spikerate*duration).simplified)) spikes.sort() # spikes are supposed to be an ascending sequence sptr = SpikeTrain(spikes*duration, t_start=t_start, t_stop=t_start+duration) sptr.annotations['channel_index'] = s seg.spiketrains.append(sptr) if EventArray in supported_objects: for name, labels in iteritems(event_array_types): ea_size = rand()*np.diff(event_array_size_range) ea_size += event_array_size_range[0] labels = np.array(labels, dtype='S') labels = labels[(rand(ea_size)*len(labels)).astype('i')] ea = EventArray(times=rand(ea_size)*duration, labels=labels) seg.eventarrays.append(ea) if EpochArray in supported_objects: for name, labels in iteritems(epoch_array_types): t = 0 times = [] durations = [] while t < duration: times.append(t) dur = rand()*np.diff(epoch_array_duration_range) dur += epoch_array_duration_range[0] durations.append(dur) t = t+dur labels = np.array(labels, dtype='S') labels = labels[(rand(len(times))*len(labels)).astype('i')] epa = EpochArray(times=pq.Quantity(times, units=pq.s), durations=pq.Quantity([x[0] for x in durations], units=pq.s), labels=labels, ) seg.epocharrays.append(epa) # TODO : Spike, Event, Epoch return seg def generate_from_supported_objects(supported_objects): #~ create_many_to_one_relationship objects = supported_objects if Block in objects: higher = generate_one_simple_block(supported_objects=objects) # Chris we do not create RC and RCG if it is not in objects # there is a test in generate_one_simple_block so I removed #finalize_block(higher) elif Segment in objects: higher = generate_one_simple_segment(supported_objects=objects) else: #TODO return None create_many_to_one_relationship(higher) return higher neo-0.3.3/neo/test/iotest/__init__.py0000644000175000017500000000007212265516260020526 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Contains tests for neo.io """ neo-0.3.3/neo/test/iotest/test_neomatlabio.py0000644000175000017500000000106712265516260022325 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.neomatlabio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.test.iotest.common_io_test import BaseTestIO from neo.io.neomatlabio import NeoMatlabIO, HAVE_SCIPY @unittest.skipUnless(HAVE_SCIPY, "requires scipy") class TestNeoMatlabIO(BaseTestIO, unittest.TestCase): ioclass = NeoMatlabIO files_to_test = [] files_to_download = [] if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_hdf5io.py0000644000175000017500000002453612273723542021221 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.hdf5io Usually I run these tests like that. I add neo root folder to the pythonpath (usually by adding the neo.pth with the path to the cloned repository to, say, /usr/lib/python2.6/dist-packages/) and run python /test/io/test_hdf5io.py For the moment only basic tests are active. #TODO add performance testing!! """ # needed for python 3 compatibility from __future__ import absolute_import from datetime import datetime from hashlib import md5 import logging import os import sys try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core import SpikeTrain, Segment, Block from neo.test.tools import (assert_neo_object_is_compliant, assert_objects_equivalent, assert_same_sub_schema) from neo.test.iotest.common_io_test import BaseTestIO from neo.description import (class_by_name, classes_necessary_attributes, classes_recommended_attributes, implicit_relationship, many_to_many_relationship, name_by_class, one_to_many_relationship) from neo.io.hdf5io import NeoHdf5IO, HAVE_TABLES #============================================================================== TEST_ANNOTATIONS = [1, 0, 1.5, "this is a test", datetime.now(), None] def get_fake_value(attr): # attr = (name, type, [dim, [dtype]]) """ returns default value for a given attribute based on description.py """ if attr[1] == pq.Quantity or attr[1] == np.ndarray: size = [] for i in range(int(attr[2])): size.append(np.random.randint(100) + 1) to_set = np.random.random(size) * pq.millisecond # let it be ms if attr[0] == 't_start': to_set = 0.0 * pq.millisecond if attr[0] == 't_stop': to_set = 1.0 * pq.millisecond if attr[0] == 'sampling_rate': to_set = 10000.0 * pq.Hz if attr[1] == np.ndarray: to_set = np.array(to_set, dtype=attr[3]) if attr[1] == str: to_set = str(np.random.randint(100000)) if attr[1] == int: to_set = np.random.randint(100) if attr[1] == datetime: to_set = datetime.now() return to_set def fake_NEO(obj_type="Block", cascade=True, _follow_links=True): """ Create a fake NEO object of a given type. Follows one-to-many and many-to-many relationships if cascade. RC, when requested cascade, will not create RGCs to avoid dead-locks. _follow_links - an internal variable, indicates whether to create objects with 'implicit' relationships, to avoid duplications. Do not use it. """ kwargs = {} # assign attributes attrs = classes_necessary_attributes[obj_type] + \ classes_recommended_attributes[obj_type] for attr in attrs: kwargs[attr[0]] = get_fake_value(attr) obj = class_by_name[obj_type](**kwargs) if cascade: if obj_type == "Block": _follow_links = False if obj_type in one_to_many_relationship: rels = one_to_many_relationship[obj_type] if obj_type == "RecordingChannelGroup": rels += many_to_many_relationship[obj_type] if not _follow_links and obj_type in implicit_relationship: for i in implicit_relationship[obj_type]: if not i in rels: logging.debug("LOOK HERE!!!" + str(obj_type)) rels.remove(i) for child in rels: setattr(obj, child.lower() + "s", [fake_NEO(child, cascade, _follow_links)]) if obj_type == "Block": # need to manually create 'implicit' connections # connect a unit to the spike and spike train u = obj.recordingchannelgroups[0].units[0] st = obj.segments[0].spiketrains[0] sp = obj.segments[0].spikes[0] u.spiketrains.append(st) u.spikes.append(sp) # connect RCG with ASA asa = obj.segments[0].analogsignalarrays[0] obj.recordingchannelgroups[0].analogsignalarrays.append(asa) # connect RC to AS, IrSAS and back to RGC rc = obj.recordingchannelgroups[0].recordingchannels[0] rc.recordingchannelgroups.append(obj.recordingchannelgroups[0]) rc.analogsignals.append(obj.segments[0].analogsignals[0]) seg = obj.segments[0] rc.irregularlysampledsignals.append(seg.irregularlysampledsignals[0]) # add some annotations, 80% at = dict([(str(x), TEST_ANNOTATIONS[x]) for x in range(len(TEST_ANNOTATIONS))]) obj.annotate(**at) return obj class HDF5Commontests(BaseTestIO, unittest.TestCase): ioclass = NeoHdf5IO files_to_test = ['test.h5'] files_to_download = files_to_test @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") @unittest.skipUnless(HAVE_TABLES, "requires PyTables") def setUp(self): BaseTestIO.setUp(self) class hdf5ioTest: # inherit this class from unittest.TestCase when ready """ Tests for the hdf5 library. """ #@unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") #@unittest.skipUnless(HAVE_TABLES, "requires PyTables") def setUp(self): self.test_file = "test.h5" def tearDown(self): if os.path.exists(self.test_file): os.remove(self.test_file) def test_create(self): """ Create test file with signals, segments, blocks etc. """ iom = NeoHdf5IO(filename=self.test_file) b1 = fake_NEO() # creating a structure iom.save(b1) # saving # must be assigned after save self.assertTrue(hasattr(b1, "hdf5_path")) iom.close() iom.connect(filename=self.test_file) b2 = iom.get(b1.hdf5_path) # new object assert_neo_object_is_compliant(b2) assert_same_sub_schema(b1, b2) def test_property_change(self): """ Make sure all attributes are saved properly after the change, including quantities, units, types etc.""" iom = NeoHdf5IO(filename=self.test_file) for obj_type in class_by_name.keys(): obj = fake_NEO(obj_type, cascade=False) iom.save(obj) self.assertTrue(hasattr(obj, "hdf5_path")) replica = iom.get(obj.hdf5_path, cascade=False) assert_objects_equivalent(obj, replica) def test_relations(self): """ make sure the change in relationships is saved properly in the file, including correct M2M, no redundancy etc. RC -> RCG not tested. """ def assert_children(self, obj, replica): obj_type = name_by_class[obj] self.assertEqual(md5(str(obj)).hexdigest(), md5(str(replica)).hexdigest()) if obj_type in one_to_many_relationship: rels = one_to_many_relationship[obj_type] if obj_type == "RecordingChannelGroup": rels += many_to_many_relationship[obj_type] for child_type in rels: ch1 = getattr(obj, child_type.lower() + "s") ch2 = getattr(replica, child_type.lower() + "s") self.assertEqual(len(ch1), len(ch2)) for i, v in enumerate(ch1): self.assert_children(ch1[i], ch2[i]) iom = NeoHdf5IO(filename=self.test_file) for obj_type in class_by_name.keys(): obj = fake_NEO(obj_type, cascade=True) iom.save(obj) self.assertTrue(hasattr(obj, "hdf5_path")) replica = iom.get(obj.hdf5_path, cascade=True) self.assert_children(obj, replica) def test_errors(self): """ some tests for specific errors """ f = open("thisisafakehdf.h5", "w") # wrong file type f.write("this is not an HDF5 file. sorry.") f.close() self.assertRaises(TypeError, NeoHdf5IO(filename="thisisafakehdf.h5")) iom = NeoHdf5IO(filename=self.test_file) # wrong object path test self.assertRaises(LookupError, iom.get("/wrong_path")) some_object = np.array([1, 2, 3]) # non NEO object test self.assertRaises(AssertionError, iom.save(some_object)) def test_attr_changes(self): """ gets an object, changes its attributes, saves it, then compares how good the changes were saved. """ iom = NeoHdf5IO(filename=self.test_file) for obj_type in class_by_name.keys(): obj = fake_NEO(obj_type=obj_type, cascade=False) iom.save(obj) orig_obj = iom.get(obj.hdf5_path) attrs = (classes_necessary_attributes[obj_type] + classes_recommended_attributes[obj_type]) for attr in attrs: if hasattr(orig_obj, attr[0]): setattr(obj, attr[0], get_fake_value(attr)) iom.save(orig_obj) test_obj = iom.get(orig_obj.hdf5_path) assert_objects_equivalent(orig_obj, test_obj) # changes!!! in attr AS WELL AS in relations!! # test annotations # test naming - paths # unicode!! # add a child, then remove, then check it's removed # update/removal of relations b/w RC and AS which are/not are in the # same segment class HDF5MoreTests(unittest.TestCase): @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") @unittest.skipUnless(HAVE_TABLES, "requires PyTables") def test_store_empty_spike_train(self): spiketrain0 = SpikeTrain([], t_start=0.0, t_stop=100.0, units="ms") spiketrain1 = SpikeTrain([23.4, 45.6, 67.8], t_start=0.0, t_stop=100.0, units="ms") segment = Segment(name="a_segment") segment.spiketrains.append(spiketrain0) segment.spiketrains.append(spiketrain1) block = Block(name="a_block") block.segments.append(segment) iom = NeoHdf5IO(filename="test987.h5") iom.save(block) iom.close() iom = NeoHdf5IO(filename="test987.h5") block1 = iom.get("/Block_0") self.assertEqual(block1.segments[0].spiketrains[0].t_stop, 100.0) self.assertEqual(len(block1.segments[0].spiketrains[0]), 0) self.assertEqual(len(block1.segments[0].spiketrains[1]), 3) iom.close() os.remove("test987.h5") if __name__ == '__main__': unittest.main() neo-0.3.3/neo/test/iotest/test_baseio.py0000644000175000017500000000152512265516260021274 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.baseio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.core import objectlist from neo.io.baseio import BaseIO class TestIOObjects(unittest.TestCase): def test__raise_error_when_not_readable_or_writable(self): reader = BaseIO() for ob in objectlist: if ob not in BaseIO.readable_objects: meth = getattr(reader, 'read_'+ob.__name__.lower()) self.assertRaises(AssertionError, meth, ) if ob not in BaseIO.writeable_objects: meth = getattr(reader, 'write_'+ob.__name__.lower()) self.assertRaises(AssertionError, meth, ()) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/common_io_test.py0000644000175000017500000005431212265516260022013 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' Common tests for IOs: * check presence of all necessary attr * check types * write/read consistency See BaseTestIO. The public URL is in url_for_tests. The private url for writing is ssh://gate.g-node.org/groups/neo/io_test_files/ ''' # needed for python 3 compatibility from __future__ import absolute_import __test__ = False url_for_tests = "https://portal.g-node.org/neo/" import os try: import unittest2 as unittest except ImportError: import unittest from neo.core import Block, Segment from neo.test.tools import (assert_same_sub_schema, assert_neo_object_is_compliant, assert_sub_schema_is_lazy_loaded, assert_lazy_sub_schema_can_be_loaded, assert_children_empty) from neo.test.iotest.tools import (can_use_network, cleanup_test_file, close_object_safe, create_generic_io_object, create_generic_reader, create_generic_writer, create_local_temp_dir, download_test_file, iter_generic_io_objects, iter_generic_readers, iter_read_objects, make_all_directories, read_generic, write_generic) from neo.test.iotest.generate_datasets import generate_from_supported_objects class BaseTestIO(object): ''' This class make common tests for all IOs. Several startegies: * for IO able to read write : test_write_then_read * for IO able to read write with hash conservation (optional): test_read_then_write * for all IOs : test_assert_readed_neo_object_is_compliant 2 cases: * files are at G-node and downloaded: download_test_files_if_not_present * files are generated by MyIO.write() ''' #~ __test__ = False # all IO test need to modify this: ioclass = None # the IOclass to be tested files_to_test = [] # list of files to test compliances files_to_download = [] # when files are at G-Node # when reading then writing produces files with identical hashes hash_conserved_when_write_read = False # when writing then reading creates an identical neo object read_and_write_is_bijective = True # allow environment to tell avoid using network use_network = can_use_network() local_test_dir = None def setUp(self): ''' Set up the test fixture. This is run for every test ''' self.higher = self.ioclass.supported_objects[0] self.shortname = self.ioclass.__name__.lower().strip('io') # these objects can both be written and read self.io_readandwrite = list(set(self.ioclass.readable_objects) & set(self.ioclass.writeable_objects)) # these objects can be either written or read self.io_readorwrite = list(set(self.ioclass.readable_objects) | set(self.ioclass.writeable_objects)) self.create_local_dir_if_not_exists() self.download_test_files_if_not_present() self.files_generated = [] self.generate_files_for_io_able_to_write() self.files_to_test.extend(self.files_generated) self.cascade_modes = [True] if hasattr(self.ioclass, 'load_lazy_cascade'): self.cascade_modes.append('lazy') def create_local_dir_if_not_exists(self): ''' Create a local directory to store testing files and return it. The directory path is also written to self.local_test_dir ''' self.local_test_dir = create_local_temp_dir(self.shortname) return self.local_test_dir def download_test_files_if_not_present(self): ''' Download %s file at G-node for testing url_for_tests is global at beginning of this file. ''' % self.ioclass.__name__ if not self.use_network: raise unittest.SkipTest("Requires download of data from the web") url = url_for_tests+self.shortname try: make_all_directories(self.files_to_download, self.local_test_dir) download_test_file(self.files_to_download, self.local_test_dir, url) except IOError as exc: raise unittest.SkipTest(exc) download_test_files_if_not_present.__test__ = False def cleanup_file(self, path): ''' Remove test files or directories safely. ''' cleanup_test_file(self.ioclass, path, directory=self.local_test_dir) def able_to_write_or_read(self, writeread=False, readwrite=False): ''' Return True if generalized writing or reading is possible. If writeread=True, return True if writing then reading is possible and produces identical neo objects. If readwrite=True, return True if reading then writing is possible and produces files with identical hashes. ''' # Find the highest object that is supported by the IO # Test only if it is a Block or Segment, and if it can both read # and write this object. if self.higher not in self.io_readandwrite: return False if self.higher not in [Block, Segment]: return False # when io need external knowldge for writting or read such as # sampling_rate (RawBinaryIO...) the test is too much complex to design # genericaly. if (self.higher in self.ioclass.read_params and len(self.ioclass.read_params[self.higher]) != 0): return False # handle cases where the test should write then read if writeread and not self.read_and_write_is_bijective: return False # handle cases where the test should read then write if readwrite and not self.hash_conserved_when_write_read: return False return True def get_filename_path(self, filename): ''' Get the path to a filename in the current temporary file directory ''' return os.path.join(self.local_test_dir, filename) def generic_io_object(self, filename=None, return_path=False, clean=False): ''' Create an io object in a generic way that can work with both file-based and directory-based io objects. If filename is None, create a filename (default). If return_path is True, return the full path of the file along with the io object. return ioobj, path. Default is False. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. ''' return create_generic_io_object(ioclass=self.ioclass, filename=filename, directory=self.local_test_dir, return_path=return_path, clean=clean) def create_file_reader(self, filename=None, return_path=False, clean=False, target=None, readall=False): ''' Create a function that can read from the specified filename. If filename is None, create a filename (default). If return_path is True, return the full path of the file along with the reader function. return reader, path. Default is False. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. If target is None, use the first supported_objects from ioobj If target is False, use the 'read' method. If target is the Block or Segment class, use read_block or read_segment, respectively. If target is a string, use 'read_'+target. If readall is True, use the read_all_ method instead of the read_ method. Default is False. ''' ioobj, path = self.generic_io_object(filename=filename, return_path=True, clean=clean) res = create_generic_reader(ioobj, target=target, readall=readall) if return_path: return res, path return res def create_file_writer(self, filename=None, return_path=False, clean=False, target=None): ''' Create a function that can write from the specified filename. If filename is None, create a filename (default). If return_path is True, return the full path of the file along with the writer function. return writer, path. Default is False. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. If target is None, use the first supported_objects from ioobj If target is False, use the 'write' method. If target is the Block or Segment class, use write_block or write_segment, respectively. If target is a string, use 'write_'+target. ''' ioobj, path = self.generic_io_object(filename=filename, return_path=True, clean=clean) res = create_generic_writer(ioobj, target=target) if return_path: return res, path return res def read_file(self, filename=None, return_path=False, clean=False, target=None, readall=False, cascade=True, lazy=False): ''' Read from the specified filename. If filename is None, create a filename (default). If return_path is True, return the full path of the file along with the object. return obj, path. Default is False. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. If target is None, use the first supported_objects from ioobj If target is False, use the 'read' method. If target is the Block or Segment class, use read_block or read_segment, respectively. If target is a string, use 'read_'+target. The cascade and lazy parameters are passed to the reader. Defaults are True and False, respectively. If readall is True, use the read_all_ method instead of the read_ method. Default is False. ''' ioobj, path = self.generic_io_object(filename=filename, return_path=True, clean=clean) obj = read_generic(ioobj, target=target, cascade=cascade, lazy=lazy, readall=readall, return_reader=False) if return_path: return obj, path return obj def write_file(self, obj=None, filename=None, return_path=False, clean=False, target=None): ''' Write the target object to a file using the given neo io object ioobj. If filename is None, create a filename (default). If return_path is True, return the full path of the file along with the object. return obj, path. Default is False. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. If target is None, use the first supported_objects from ioobj If target is False, use the 'read' method. If target is the Block or Segment class, use read_block or read_segment, respectively. If target is a string, use 'read_'+target. obj is the object to write. If obj is None, an object is created automatically for the io class. ''' ioobj, path = self.generic_io_object(filename=filename, return_path=True, clean=clean) obj = write_generic(ioobj, target=target, return_reader=False) if return_path: return obj, path return obj def iter_io_objects(self, return_path=False, clean=False): ''' Return an iterable over the io objects created from files_to_test If return_path is True, yield the full path of the file along with the io object. yield ioobj, path Default is False. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. ''' return iter_generic_io_objects(ioclass=self.ioclass, filenames=self.files_to_test, directory=self.local_test_dir, return_path=return_path, clean=clean) def iter_readers(self, target=None, readall=False, return_path=False, return_ioobj=False, clean=False): ''' Return an iterable over readers created from files_to_test. If return_path is True, return the full path of the file along with the reader object. return reader, path. If return_ioobj is True, return the io object as well as the reader. return reader, ioobj. Default is False. If both return_path and return_ioobj is True, return reader, path, ioobj. Default is False. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. If readall is True, use the read_all_ method instead of the read_ method. Default is False. ''' return iter_generic_readers(ioclass=self.ioclass, filenames=self.files_to_test, directory=self.local_test_dir, return_path=return_path, return_ioobj=return_ioobj, target=target, clean=clean, readall=readall) def iter_objects(self, target=None, return_path=False, return_ioobj=False, return_reader=False, clean=False, readall=False, cascade=True, lazy=False): ''' Iterate over objects read from the list of filenames in files_to_test. If target is None, use the first supported_objects from ioobj If target is False, use the 'read' method. If target is the Block or Segment class, use read_block or read_segment, respectively. If target is a string, use 'read_'+target. If return_path is True, yield the full path of the file along with the object. yield obj, path. If return_ioobj is True, yield the io object as well as the object. yield obj, ioobj. Default is False. If return_reader is True, yield the io reader function as well as the object. yield obj, reader. Default is False. If some combination of return_path, return_ioobj, and return_reader is True, they are yielded in the order: obj, path, ioobj, reader. If clean is True, try to delete existing versions of the file before creating the io object. Default is False. The cascade and lazy parameters are passed to the reader. Defaults are True and False, respectively. If readall is True, use the read_all_ method instead of the read_ method. Default is False. ''' return iter_read_objects(ioclass=self.ioclass, filenames=self.files_to_test, directory=self.local_test_dir, target=target, return_path=return_path, return_ioobj=return_ioobj, return_reader=return_reader, clean=clean, readall=readall, cascade=cascade, lazy=lazy) def generate_files_for_io_able_to_write(self): ''' Write files for use in testing. ''' self.files_generated = [] if not self.able_to_write_or_read(): return generate_from_supported_objects(self.ioclass.supported_objects) ioobj, path = self.generic_io_object(return_path=True, clean=True) if ioobj is None: return self.files_generated.append(path) write_generic(ioobj, target=self.higher) close_object_safe(ioobj) def test_write_then_read(self): ''' Test for IO that are able to write and read - here %s: 1 - Generate a full schema with supported objects. 2 - Write to a file 3 - Read from the file 4 - Check the hierachy 5 - Check data Work only for IO for Block and Segment for the highest object (main cases). ''' % self.ioclass.__name__ if not self.able_to_write_or_read(writeread=True): return for cascade in self.cascade_modes: ioobj1 = self.generic_io_object(clean=True) if ioobj1 is None: return ob1 = write_generic(ioobj1, target=self.higher) close_object_safe(ioobj1) ioobj2 = self.generic_io_object() # Read the highest supported object from the file obj_reader = create_generic_reader(ioobj2, target=False) ob2 = obj_reader(cascade=cascade)[0] if self.higher == Segment: ob2 = ob2.segments[0] # some formats (e.g. elphy) do not support double floating # point spiketrains try: assert_same_sub_schema(ob1, ob2, False, 1e-8) assert_neo_object_is_compliant(ob1) assert_neo_object_is_compliant(ob2) # intercept exceptions and add more information except BaseException as exc: exc.args += ('with cascade=%s ' % cascade,) raise close_object_safe(ioobj2) def test_read_then_write(self): ''' Test for IO that are able to read and write, here %s: 1 - Read a file 2 Write object set in another file 3 Compare the 2 files hash NOTE: TODO: Not implemented yet ''' % self.ioclass.__name__ if not self.able_to_write_or_read(readwrite=True): return #assert_file_contents_equal(a, b) def test_assert_readed_neo_object_is_compliant(self): ''' Reading %s files in `files_to_test` produces compliant objects. Compliance test: neo.test.tools.assert_neo_object_is_compliant for all cascade and lazy modes ''' % self.ioclass.__name__ # This is for files presents at G-Node or generated for cascade in self.cascade_modes: for lazy in [True, False]: for obj, path in self.iter_objects(cascade=cascade, lazy=lazy, return_path=True): try: # Check compliance of the block assert_neo_object_is_compliant(obj) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from %s with cascade=%s and lazy=%s' % (os.path.basename(path), cascade, lazy),) raise def test_readed_with_cascade_is_compliant(self): ''' Reading %s files in `files_to_test` with `cascade` is compliant. A reader with cascade = False should return empty children. ''' % self.ioclass.__name__ # This is for files presents at G-Node or generated for obj, path in self.iter_objects(cascade=False, lazy=False, return_path=True): try: # Check compliance of the block or segment assert_neo_object_is_compliant(obj) assert_children_empty(obj, self.ioclass) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from %s ' % os.path.basename(path),) raise def test_readed_with_lazy_is_compliant(self): ''' Reading %s files in `files_to_test` with `lazy` is compliant. Test the reader with lazy = True. All objects derived from ndarray or Quantity should have a size of 0. Also, AnalogSignal, AnalogSignalArray, SpikeTrain, Epocharray, and EventArray should contain the lazy_shape attribute. ''' % self.ioclass.__name__ # This is for files presents at G-Node or generated for cascade in self.cascade_modes: for obj, path in self.iter_objects(cascade=cascade, lazy=True, return_path=True): try: assert_sub_schema_is_lazy_loaded(obj) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from %s with cascade=%s ' % (os.path.basename(path), cascade),) raise def test_load_lazy_objects(self): ''' Reading %s files in `files_to_test` with `lazy` works. Test the reader with lazy = True. All objects derived from ndarray or Quantity should have a size of 0. Also, AnalogSignal, AnalogSignalArray, SpikeTrain, Epocharray, and EventArray should contain the lazy_shape attribute. ''' % self.ioclass.__name__ if not hasattr(self.ioclass, 'load_lazy_object'): return # This is for files presents at G-Node or generated for cascade in self.cascade_modes: for obj, path, ioobj in self.iter_objects(cascade=cascade, lazy=True, return_ioobj=True, return_path=True): try: assert_lazy_sub_schema_can_be_loaded(obj, ioobj) # intercept exceptions and add more information except BaseException as exc: exc.args += ('from %s with cascade=%s ' % (os.path.basename(path), cascade),) raise neo-0.3.3/neo/test/iotest/test_brainwaresrcio.py0000644000175000017500000003325112273723542023047 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.brainwaresrcio """ # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import os.path import sys import warnings try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core import (Block, Event, RecordingChannel, RecordingChannelGroup, Segment, SpikeTrain, Unit) from neo.io import BrainwareSrcIO, brainwaresrcio from neo.io.tools import create_many_to_one_relationship from neo.test.iotest.common_io_test import BaseTestIO from neo.test.tools import (assert_same_sub_schema, assert_neo_object_is_compliant) from neo.test.iotest.tools import create_generic_reader PY_VER = sys.version_info[0] def proc_src(filename): '''Load an src file that has already been processed by the official matlab file converter. That matlab data is saved to an m-file, which is then converted to a numpy '.npz' file. This numpy file is the file actually loaded. This function converts it to a neo block and returns the block. This block can be compared to the block produced by BrainwareSrcIO to make sure BrainwareSrcIO is working properly block = proc_src(filename) filename: The file name of the numpy file to load. It should end with '*_src_py?.npz'. This will be converted to a neo 'file_origin' property with the value '*.src', so the filename to compare should fit that pattern. 'py?' should be 'py2' for the python 2 version of the numpy file or 'py3' for the python 3 version of the numpy file. example: filename = 'file1_src_py2.npz' src file name = 'file1.src' ''' with np.load(filename) as srcobj: srcfile = srcobj.items()[0][1] filename = os.path.basename(filename[:-12]+'.src') block = Block(file_origin=filename) NChannels = srcfile['NChannels'][0, 0][0, 0] side = str(srcfile['side'][0, 0][0]) ADperiod = srcfile['ADperiod'][0, 0][0, 0] comm_seg = proc_src_comments(srcfile, filename) block.segments.append(comm_seg) rcg = proc_src_units(srcfile, filename) chan_nums = np.arange(NChannels, dtype='int') chan_names = [] for i in chan_nums: name = 'Chan'+str(i) chan_names.append(name) chan = RecordingChannel(file_origin='filename', name=name, index=i) rcg.recordingchannels.append(chan) rcg.channel_indexes = chan_nums rcg.channel_names = np.array(chan_names, dtype='string_') block.recordingchannelgroups.append(rcg) for rep in srcfile['sets'][0, 0].flatten(): proc_src_condition(rep, filename, ADperiod, side, block) create_many_to_one_relationship(block) return block def proc_src_comments(srcfile, filename): '''Get the comments in an src file that has been#!N processed by the official matlab function. See proc_src for details''' comm_seg = Segment(name='Comments', file_origin=filename) commentarray = srcfile['comments'].flatten()[0] senders = [res[0] for res in commentarray['sender'].flatten()] texts = [res[0] for res in commentarray['text'].flatten()] timeStamps = [res[0, 0] for res in commentarray['timeStamp'].flatten()] for sender, text, timeStamp in zip(senders, texts, timeStamps): time = pq.Quantity(timeStamp, units=pq.d) timeStamp = brainwaresrcio.convert_brainwaresrc_timestamp(timeStamp) commentevent = Event(time=time, label=str(text), sender=str(sender), name='Comment', file_origin=filename, description='container for a comment', timestamp=timeStamp) comm_seg.events.append(commentevent) return comm_seg def proc_src_units(srcfile, filename): '''Get the units in an src file that has been processed by the official matlab function. See proc_src for details''' rcg = RecordingChannelGroup(file_origin=filename) un_unit = Unit(name='UnassignedSpikes', file_origin=filename, elliptic=[], boundaries=[], timestamp=[], max_valid=[]) rcg.units.append(un_unit) sortInfo = srcfile['sortInfo'][0, 0] timeslice = sortInfo['timeslice'][0, 0] maxValid = timeslice['maxValid'][0, 0] cluster = timeslice['cluster'][0, 0] if len(cluster): maxValid = maxValid[0, 0] elliptic = [res.flatten() for res in cluster['elliptic'].flatten()] boundaries = [res.flatten() for res in cluster['boundaries'].flatten()] fullclust = zip(elliptic, boundaries) for ielliptic, iboundaries in fullclust: unit = Unit(file_origin=filename, boundaries=[iboundaries], elliptic=[ielliptic], timeStamp=[], max_valid=[maxValid]) rcg.units.append(unit) return rcg def proc_src_condition(rep, filename, ADperiod, side, block): '''Get the condition in a src file that has been processed by the official matlab function. See proc_src for details''' rcg = block.recordingchannelgroups[0] stim = rep['stim'].flatten() params = [str(res[0]) for res in stim['paramName'][0].flatten()] values = [res for res in stim['paramVal'][0].flatten()] stim = dict(zip(params, values)) sweepLen = rep['sweepLen'][0, 0] if not len(rep): return unassignedSpikes = rep['unassignedSpikes'].flatten() if len(unassignedSpikes): damaIndexes = [res[0, 0] for res in unassignedSpikes['damaIndex']] timeStamps = [res[0, 0] for res in unassignedSpikes['timeStamp']] spikeunit = [res.flatten() for res in unassignedSpikes['spikes']] respWin = np.array([], dtype=np.int32) trains = proc_src_condition_unit(spikeunit, sweepLen, side, ADperiod, respWin, damaIndexes, timeStamps, filename) rcg.units[0].spiketrains.extend(trains) atrains = [trains] else: damaIndexes = [] timeStamps = [] atrains = [] clusters = rep['clusters'].flatten() if len(clusters): IdStrings = [res[0] for res in clusters['IdString']] sweepLens = [res[0, 0] for res in clusters['sweepLen']] respWins = [res.flatten() for res in clusters['respWin']] spikeunits = [] for cluster in clusters['sweeps']: if len(cluster): spikes = [res.flatten() for res in cluster['spikes'].flatten()] else: spikes = [] spikeunits.append(spikes) else: IdStrings = [] sweepLens = [] respWins = [] spikeunits = [] for unit, IdString in zip(rcg.units[1:], IdStrings): unit.name = str(IdString) fullunit = zip(spikeunits, rcg.units[1:], sweepLens, respWins) for spikeunit, unit, sweepLen, respWin in fullunit: trains = proc_src_condition_unit(spikeunit, sweepLen, side, ADperiod, respWin, damaIndexes, timeStamps, filename) atrains.append(trains) unit.spiketrains.extend(trains) atrains = zip(*atrains) for trains in atrains: segment = Segment(file_origin=filename, feature_type=-1, go_by_closest_unit_center=False, include_unit_bounds=False, **stim) block.segments.append(segment) segment.spiketrains = trains def proc_src_condition_unit(spikeunit, sweepLen, side, ADperiod, respWin, damaIndexes, timeStamps, filename): '''Get the unit in a condition in a src file that has been processed by the official matlab function. See proc_src for details''' if not damaIndexes: damaIndexes = [0]*len(spikeunit) timeStamps = [0]*len(spikeunit) trains = [] for sweep, damaIndex, timeStamp in zip(spikeunit, damaIndexes, timeStamps): timeStamp = brainwaresrcio.convert_brainwaresrc_timestamp(timeStamp) train = proc_src_condition_unit_repetition(sweep, damaIndex, timeStamp, sweepLen, side, ADperiod, respWin, filename) trains.append(train) return trains def proc_src_condition_unit_repetition(sweep, damaIndex, timeStamp, sweepLen, side, ADperiod, respWin, filename): '''Get the repetion for a unit in a condition in a src file that has been processed by the official matlab function. See proc_src for details''' damaIndex = damaIndex.astype('int32') if len(sweep): times = np.array([res[0, 0] for res in sweep['time']]) shapes = np.concatenate([res.flatten()[np.newaxis][np.newaxis] for res in sweep['shape']], axis=0) trig2 = np.array([res[0, 0] for res in sweep['trig2']]) else: times = np.array([]) shapes = np.array([[[]]]) trig2 = np.array([]) times = pq.Quantity(times, units=pq.ms, dtype=np.float32) t_start = pq.Quantity(0, units=pq.ms, dtype=np.float32) t_stop = pq.Quantity(sweepLen, units=pq.ms, dtype=np.float32) trig2 = pq.Quantity(trig2, units=pq.ms, dtype=np.uint8) waveforms = pq.Quantity(shapes, dtype=np.int8, units=pq.mV) sampling_period = pq.Quantity(ADperiod, units=pq.us) train = SpikeTrain(times=times, t_start=t_start, t_stop=t_stop, trig2=trig2, dtype=np.float32, timestamp=timeStamp, dama_index=damaIndex, side=side, copy=True, respwin=respWin, waveforms=waveforms, file_origin=filename) train.annotations['side'] = side train.sampling_period = sampling_period return train class BrainwareSrcIOTestCase(BaseTestIO, unittest.TestCase): ''' Unit test testcase for neo.io.BrainwareSrcIO ''' ioclass = BrainwareSrcIO read_and_write_is_bijective = False # These are the files it tries to read and test for compliance files_to_test = ['block_300ms_4rep_1clust_part_ch1.src', 'block_500ms_5rep_empty_fullclust_ch1.src', 'block_500ms_5rep_empty_partclust_ch1.src', 'interleaved_500ms_5rep_ch2.src', 'interleaved_500ms_5rep_nospikes_ch1.src', 'interleaved_500ms_7rep_noclust_ch1.src', 'long_170s_1rep_1clust_ch2.src', 'multi_500ms_mulitrep_ch1.src', 'random_500ms_12rep_noclust_part_ch2.src', 'sequence_500ms_5rep_ch2.src'] # these are reference files to compare to files_to_compare = ['block_300ms_4rep_1clust_part_ch1', 'block_500ms_5rep_empty_fullclust_ch1', 'block_500ms_5rep_empty_partclust_ch1', 'interleaved_500ms_5rep_ch2', 'interleaved_500ms_5rep_nospikes_ch1', 'interleaved_500ms_7rep_noclust_ch1', '', 'multi_500ms_mulitrep_ch1', 'random_500ms_12rep_noclust_part_ch2', 'sequence_500ms_5rep_ch2'] # add the appropriate suffix depending on the python version for i, fname in enumerate(files_to_compare): if fname: files_to_compare[i] += '_src_py%s.npz' % PY_VER # Will fetch from g-node if they don't already exist locally # How does it know to do this before any of the other tests? files_to_download = files_to_test + files_to_compare def setUp(self): warnings.filterwarnings('ignore', message='Negative sequence count.*') warnings.filterwarnings('ignore', message='unknown ID:*') super(BrainwareSrcIOTestCase, self).setUp() def test_reading_same(self): for ioobj, path in self.iter_io_objects(return_path=True): obj_reader_all = create_generic_reader(ioobj, readall=True) obj_reader_base = create_generic_reader(ioobj, target=False) obj_reader_next = create_generic_reader(ioobj, target='next_block') obj_reader_single = create_generic_reader(ioobj) obj_all = obj_reader_all() obj_base = obj_reader_base() obj_single = obj_reader_single() obj_next = [obj_reader_next(warnlast=False)] while ioobj.isopen: obj_next.append(obj_reader_next(warnlast=False)) try: assert_same_sub_schema(obj_all[0], obj_base) assert_same_sub_schema(obj_all[0], obj_single) assert_same_sub_schema(obj_all, obj_next) except BaseException as exc: exc.args += ('from ' + os.path.basename(path),) raise self.assertEqual(len(obj_all), len(obj_next)) def test_against_reference(self): for filename, refname in zip(self.files_to_test, self.files_to_compare): if not refname: continue obj = self.read_file(filename=filename, readall=True)[0] refobj = proc_src(self.get_filename_path(refname)) try: assert_neo_object_is_compliant(obj) assert_neo_object_is_compliant(refobj) assert_same_sub_schema(obj, refobj) except BaseException as exc: exc.args += ('from ' + filename,) raise if __name__ == '__main__': unittest.main() neo-0.3.3/neo/test/iotest/test_exampleio.py0000644000175000017500000000366512265516260022024 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.exampleio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.io.exampleio import ExampleIO, HAVE_SCIPY from neo.test.iotest.common_io_test import BaseTestIO class TestExampleIO(BaseTestIO, unittest.TestCase, ): ioclass = ExampleIO files_to_test = ['fake1', 'fake2', ] files_to_download = [] class TestExample2IO(unittest.TestCase): @unittest.skipUnless(HAVE_SCIPY, "requires scipy") def test_read_segment_lazy(self): r = ExampleIO(filename=None) seg = r.read_segment(cascade=True, lazy=True) for ana in seg.analogsignals: self.assertEqual(ana.size, 0) assert hasattr(ana, 'lazy_shape') for st in seg.spiketrains: self.assertEqual(st.size, 0) assert hasattr(st, 'lazy_shape') seg = r.read_segment(cascade=True, lazy=False) for ana in seg.analogsignals: self.assertNotEqual(ana.size, 0) for st in seg.spiketrains: self.assertNotEqual(st.size, 0) @unittest.skipUnless(HAVE_SCIPY, "requires scipy") def test_read_segment_cascade(self): r = ExampleIO(filename=None) seg = r.read_segment(cascade=False) self.assertEqual(len(seg.analogsignals), 0) seg = r.read_segment(cascade=True, num_analogsignal=4) self.assertEqual(len(seg.analogsignals), 4) @unittest.skipUnless(HAVE_SCIPY, "requires scipy") def test_read_analogsignal(self): r = ExampleIO(filename=None) r.read_analogsignal(lazy=False, segment_duration=15., t_start=-1) @unittest.skipUnless(HAVE_SCIPY, "requires scipy") def read_spiketrain(self): r = ExampleIO(filename=None) r.read_spiketrain(lazy=False,) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_rawbinarysignalio.py0000644000175000017500000000106512265516260023555 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of io.rawbinarysignal """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.io import RawBinarySignalIO from neo.test.iotest.common_io_test import BaseTestIO class TestRawBinarySignalIO(BaseTestIO, unittest.TestCase, ): ioclass = RawBinarySignalIO files_to_test = ['File_rawbinary_10kHz_2channels_16bit.raw'] files_to_download = files_to_test if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_elanio.py0000644000175000017500000000131012265516260021271 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.elanio """ # needed for python 3 compatibility from __future__ import absolute_import, division import sys try: import unittest2 as unittest except ImportError: import unittest from neo.io import ElanIO from neo.test.iotest.common_io_test import BaseTestIO @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class TestElanIO(BaseTestIO, unittest.TestCase, ): ioclass = ElanIO files_to_test = ['File_elan_1.eeg'] files_to_download = ['File_elan_1.eeg', 'File_elan_1.eeg.ent', 'File_elan_1.eeg.pos', ] if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_asciispiketrainio.py0000644000175000017500000000106212265516260023540 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.asciispiketrainio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.io import AsciiSpikeTrainIO from neo.test.iotest.common_io_test import BaseTestIO class TestAsciiSpikeTrainIO(BaseTestIO, unittest.TestCase, ): ioclass = AsciiSpikeTrainIO files_to_download = ['File_ascii_spiketrain_1.txt'] files_to_test = files_to_download if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_winwcpio.py0000644000175000017500000000101112265516260021657 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.winwcpio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.io import WinWcpIO from neo.test.iotest.common_io_test import BaseTestIO class TestRawBinarySignalIO(BaseTestIO, unittest.TestCase, ): ioclass = WinWcpIO files_to_test = ['File_winwcp_1.wcp'] files_to_download = files_to_test if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_axonio.py0000644000175000017500000000143212265516260021324 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.axonio """ # needed for python 3 compatibility from __future__ import absolute_import import sys try: import unittest2 as unittest except ImportError: import unittest from neo.io import AxonIO from neo.test.iotest.common_io_test import BaseTestIO @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class TestAxonIO(BaseTestIO, unittest.TestCase): files_to_test = ['File_axon_1.abf', 'File_axon_2.abf', 'File_axon_3.abf', 'File_axon_4.abf', 'File_axon_5.abf', 'File_axon_6.abf', ] files_to_download = files_to_test ioclass = AxonIO if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_asciisignalio.py0000644000175000017500000000123612265516260022647 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.asciisignalio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.io import AsciiSignalIO from neo.test.iotest.common_io_test import BaseTestIO class TestAsciiSignalIO(BaseTestIO, unittest.TestCase, ): ioclass = AsciiSignalIO files_to_download = ['File_asciisignal_1.asc', 'File_asciisignal_2.txt', 'File_asciisignal_3.txt', ] files_to_test = files_to_download if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_micromedio.py0000644000175000017500000000113412265516260022155 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.neomatlabio """ # needed for python 3 compatibility from __future__ import absolute_import, division import sys try: import unittest2 as unittest except ImportError: import unittest from neo.io import MicromedIO from neo.test.iotest.common_io_test import BaseTestIO @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class TestMicromedIO(BaseTestIO, unittest.TestCase, ): ioclass = MicromedIO files_to_test = ['File_micromed_1.TRC'] files_to_download = files_to_test if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_blackrockio.py0000644000175000017500000002060412273723542022316 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.blackrockio """ # needed for python 3 compatibility from __future__ import absolute_import import os import struct import sys import tempfile try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq import neo.io.blackrockio from neo.test.iotest.common_io_test import BaseTestIO from neo.io import tools from neo.test.tools import assert_arrays_almost_equal #~ class testRead(unittest.TestCase): #~ """Tests that data can be read from KlustaKwik files""" #~ def test1(self): #~ """Tests that data and metadata are read correctly""" #~ pass #~ def test2(self): #~ """Checks that cluster id autosets to 0 without clu file""" #~ pass #~ dirname = os.path.normpath('./files_for_tests/klustakwik/test2') #~ kio = neo.io.KlustaKwikIO(filename=os.path.join(dirname, 'base2'), #~ sampling_rate=1000.) #~ block = kio.read() #~ seg = block.segments[0] #~ self.assertEqual(len(seg.spiketrains), 1) #~ self.assertEqual(seg.spiketrains[0].name, 'unit 0 from group 5') #~ self.assertEqual(seg.spiketrains[0].annotations['cluster'], 0) #~ self.assertEqual(seg.spiketrains[0].annotations['group'], 5) #~ self.assertEqual(seg.spiketrains[0].t_start, 0.0) #~ self.assertTrue(np.all(seg.spiketrains[0].times == np.array( #~ [0.026, 0.122, 0.228]))) @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class testWrite(unittest.TestCase): def setUp(self): self.datadir = os.path.join(tempfile.gettempdir(), 'files_for_testing_neo', 'blackrock/test2/') self.fn = os.path.join(self.datadir, 'test.write.ns5') if not os.path.exists(self.datadir): raise unittest.SkipTest('data directory does not exist: ' + self.datadir) def test1(self): """Write data to binary file, then read it back in and verify""" # delete temporary file before trying to write to it if os.path.exists(self.fn): os.remove(self.fn) block = neo.Block() full_range = 234 * pq.mV # Create segment1 with analogsignals segment1 = neo.Segment() sig1 = neo.AnalogSignal([3, 4, 5], units='mV', channel_index=3, sampling_rate=30000.*pq.Hz) sig2 = neo.AnalogSignal([6, -4, -5], units='mV', channel_index=4, sampling_rate=30000.*pq.Hz) segment1.analogsignals.append(sig1) segment1.analogsignals.append(sig2) # Create segment2 with analogsignals segment2 = neo.Segment() sig3 = neo.AnalogSignal([-3, -4, -5], units='mV', channel_index=3, sampling_rate=30000.*pq.Hz) sig4 = neo.AnalogSignal([-6, 4, 5], units='mV', channel_index=4, sampling_rate=30000.*pq.Hz) segment2.analogsignals.append(sig3) segment2.analogsignals.append(sig4) # Link segments to block block.segments.append(segment1) block.segments.append(segment2) # Create hardware view, and bijectivity #tools.populate_RecordingChannel(block) #print "problem happening" #print block.recordingchannelgroups[0].recordingchannels #chan = block.recordingchannelgroups[0].recordingchannels[0] #print chan.analogsignals #tools.create_many_to_one_relationship(block) #print "here: " #print block.segments[0].analogsignals[0].recordingchannel # Chris I prefer that: #tools.finalize_block(block) tools.populate_RecordingChannel(block) tools.create_many_to_one_relationship(block) # Check that blackrockio is correctly extracting channel indexes self.assertEqual(neo.io.blackrockio.channel_indexes_in_segment( segment1), [3, 4]) self.assertEqual(neo.io.blackrockio.channel_indexes_in_segment( segment2), [3, 4]) # Create writer. Write block, then read back in. bio = neo.io.BlackrockIO(filename=self.fn, full_range=full_range) bio.write_block(block) fi = file(self.fn) # Text header self.assertEqual(fi.read(16), 'NEURALSG30 kS/s\x00') self.assertEqual(fi.read(8), '\x00\x00\x00\x00\x00\x00\x00\x00') # Integers: period, channel count, channel index1, channel index2 self.assertEqual(struct.unpack('<4I', fi.read(16)), (1, 2, 3, 4)) # What should the signals be after conversion? conv = float(full_range) / 2**16 sigs = np.array([np.concatenate((sig1, sig3)), np.concatenate((sig2, sig4))]) sigs_converted = np.rint(sigs / conv).astype(np.int) # Check that each time point is the same for time_slc in sigs_converted.transpose(): written_data = struct.unpack('<2h', fi.read(4)) self.assertEqual(list(time_slc), list(written_data)) # Check that we read to the end currentpos = fi.tell() fi.seek(0, 2) truelen = fi.tell() self.assertEqual(currentpos, truelen) fi.close() # Empty out test session again #~ delete_test_session() @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class testRead(unittest.TestCase): def setUp(self): self.fn = os.path.join(tempfile.gettempdir(), 'files_for_testing_neo', 'blackrock/test2/test.ns5') if not os.path.exists(self.fn): raise unittest.SkipTest('data file does not exist:' + self.fn) def test1(self): """Read data into one big segment (default)""" full_range = 8192 * pq.mV bio = neo.io.BlackrockIO(filename=self.fn, full_range=full_range) block = bio.read_block(n_starts=[0], n_stops=[6]) self.assertEqual(bio.header.Channel_Count, 2) self.assertEqual(bio.header.n_samples, 6) # Everything put in one segment self.assertEqual(len(block.segments), 1) seg = block.segments[0] self.assertEqual(len(seg.analogsignals), 2) assert_arrays_almost_equal(seg.analogsignals[0], [3., 4., 5., -3., -4., -5.] * pq.mV, .0001) assert_arrays_almost_equal(seg.analogsignals[1], [6., -4., -5., -6., 4., 5.] * pq.mV, .0001) def test2(self): """Read data into two segments instead of just one""" full_range = 8192 * pq.mV bio = neo.io.BlackrockIO(filename=self.fn, full_range=full_range) block = bio.read_block(n_starts=[0, 3], n_stops=[2, 6]) self.assertEqual(bio.header.Channel_Count, 2) self.assertEqual(bio.header.n_samples, 6) # Everything in two segments self.assertEqual(len(block.segments), 2) # Test first seg seg = block.segments[0] self.assertEqual(len(seg.analogsignals), 2) assert_arrays_almost_equal(seg.analogsignals[0], [3., 4.] * pq.mV, .0001) assert_arrays_almost_equal(seg.analogsignals[1], [6., -4.] * pq.mV, .0001) # Test second seg seg = block.segments[1] self.assertEqual(len(seg.analogsignals), 2) assert_arrays_almost_equal(seg.analogsignals[0], [-3., -4., -5.] * pq.mV, .0001) assert_arrays_almost_equal(seg.analogsignals[1], [-6., 4., 5.] * pq.mV, .0001) @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class CommonTests(BaseTestIO, unittest.TestCase): ioclass = neo.io.BlackrockIO read_and_write_is_bijective = False # These are the files it tries to read and test for compliance files_to_test = [ 'test2/test.ns5' ] # Will fetch from g-node if they don't already exist locally # How does it know to do this before any of the other tests? files_to_download = [ 'test2/test.ns5' ] #~ def delete_test_session(): #~ """Removes all file in directory so we can test writing to it""" #~ for fi in glob.glob(os.path.join( #~ './files_for_tests/klustakwik/test3', '*')): #~ os.remove(fi) if __name__ == '__main__': unittest.main() neo-0.3.3/neo/test/iotest/test_brainvisionio.py0000644000175000017500000000161512265516260022705 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.brainvisionio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.io import BrainVisionIO from neo.test.iotest.common_io_test import BaseTestIO class TestBrainVisionIO(BaseTestIO, unittest.TestCase, ): ioclass = BrainVisionIO files_to_test = ['File_brainvision_1.vhdr', 'File_brainvision_2.vhdr', ] files_to_download = ['File_brainvision_1.eeg', 'File_brainvision_1.vhdr', 'File_brainvision_1.vmrk', 'File_brainvision_2.eeg', 'File_brainvision_2.vhdr', 'File_brainvision_2.vmrk', ] if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_neuroscopeio.py0000644000175000017500000000113312265516260022537 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.neuroscopeio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.io import NeuroScopeIO from neo.test.iotest.common_io_test import BaseTestIO class TestNeuroScopeIO(BaseTestIO, unittest.TestCase, ): ioclass = NeuroScopeIO files_to_test = ['test1/test1.xml'] files_to_download = ['test1/test1.xml', 'test1/test1.dat', ] if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_neuroexplorerio.py0000644000175000017500000000127412265516260023274 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.neuroexplorerio """ # needed for python 3 compatibility from __future__ import absolute_import, division import sys try: import unittest2 as unittest except ImportError: import unittest from neo.io import NeuroExplorerIO from neo.test.iotest.common_io_test import BaseTestIO @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class TestNeuroExplorerIO(BaseTestIO, unittest.TestCase, ): ioclass = NeuroExplorerIO files_to_test = ['File_neuroexplorer_1.nex', 'File_neuroexplorer_2.nex', ] files_to_download = files_to_test if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_plexonio.py0000644000175000017500000000127412265516260021670 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.plexonio """ # needed for python 3 compatibility from __future__ import absolute_import, division import sys try: import unittest2 as unittest except ImportError: import unittest from neo.io import PlexonIO from neo.test.iotest.common_io_test import BaseTestIO @unittest.skipIf(sys.version_info[0] > 2, "not Python 3 compatible") class TestPlexonIO(BaseTestIO, unittest.TestCase, ): ioclass = PlexonIO files_to_test = ['File_plexon_1.plx', 'File_plexon_2.plx', 'File_plexon_3.plx', ] files_to_download = files_to_test if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_winedrio.py0000644000175000017500000000115412265516260021650 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.wineedrio """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.io import WinEdrIO from neo.test.iotest.common_io_test import BaseTestIO class TestWinedrIO(BaseTestIO, unittest.TestCase, ): ioclass = WinEdrIO files_to_test = ['File_WinEDR_1.EDR', 'File_WinEDR_2.EDR', 'File_WinEDR_3.EDR', ] files_to_download = files_to_test if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_brainwaredamio.py0000644000175000017500000001333412273723542023021 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.brainwaredamio """ # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import os.path import sys try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core import (AnalogSignal, Block, RecordingChannel, RecordingChannelGroup, Segment) from neo.io import BrainwareDamIO from neo.io.tools import create_many_to_one_relationship from neo.test.iotest.common_io_test import BaseTestIO from neo.test.tools import (assert_same_sub_schema, assert_neo_object_is_compliant) from neo.test.iotest.tools import create_generic_reader PY_VER = sys.version_info[0] def proc_dam(filename): '''Load an dam file that has already been processed by the official matlab file converter. That matlab data is saved to an m-file, which is then converted to a numpy '.npz' file. This numpy file is the file actually loaded. This function converts it to a neo block and returns the block. This block can be compared to the block produced by BrainwareDamIO to make sure BrainwareDamIO is working properly block = proc_dam(filename) filename: The file name of the numpy file to load. It should end with '*_dam_py?.npz'. This will be converted to a neo 'file_origin' property with the value '*.dam', so the filename to compare should fit that pattern. 'py?' should be 'py2' for the python 2 version of the numpy file or 'py3' for the python 3 version of the numpy file. example: filename = 'file1_dam_py2.npz' dam file name = 'file1.dam' ''' with np.load(filename) as damobj: damfile = damobj.items()[0][1].flatten() filename = os.path.basename(filename[:-12]+'.dam') signals = [res.flatten() for res in damfile['signal']] stimIndexes = [int(res[0, 0].tolist()) for res in damfile['stimIndex']] timestamps = [res[0, 0] for res in damfile['timestamp']] block = Block(file_origin=filename) rcg = RecordingChannelGroup(file_origin=filename) chan = RecordingChannel(file_origin=filename, index=0, name='Chan1') rcg.channel_indexes = np.array([1]) rcg.channel_names = np.array(['Chan1'], dtype='S') block.recordingchannelgroups.append(rcg) rcg.recordingchannels.append(chan) params = [res['params'][0, 0].flatten() for res in damfile['stim']] values = [res['values'][0, 0].flatten() for res in damfile['stim']] params = [[res1[0] for res1 in res] for res in params] values = [[res1 for res1 in res] for res in values] stims = [dict(zip(param, value)) for param, value in zip(params, values)] fulldam = zip(stimIndexes, timestamps, signals, stims) for stimIndex, timestamp, signal, stim in fulldam: sig = AnalogSignal(signal=signal*pq.mV, t_start=timestamp*pq.d, file_origin=filename, sampling_period=1.*pq.s) segment = Segment(file_origin=filename, index=stimIndex, **stim) segment.analogsignals = [sig] block.segments.append(segment) create_many_to_one_relationship(block) return block class BrainwareDamIOTestCase(BaseTestIO, unittest.TestCase): ''' Unit test testcase for neo.io.BrainwareDamIO ''' ioclass = BrainwareDamIO read_and_write_is_bijective = False # These are the files it tries to read and test for compliance files_to_test = ['block_300ms_4rep_1clust_part_ch1.dam', 'interleaved_500ms_5rep_ch2.dam', 'long_170s_1rep_1clust_ch2.dam', 'multi_500ms_mulitrep_ch1.dam', 'random_500ms_12rep_noclust_part_ch2.dam', 'sequence_500ms_5rep_ch2.dam'] # these are reference files to compare to files_to_compare = ['block_300ms_4rep_1clust_part_ch1', 'interleaved_500ms_5rep_ch2', '', 'multi_500ms_mulitrep_ch1', 'random_500ms_12rep_noclust_part_ch2', 'sequence_500ms_5rep_ch2'] # add the appropriate suffix depending on the python version for i, fname in enumerate(files_to_compare): if fname: files_to_compare[i] += '_dam_py%s.npz' % PY_VER # Will fetch from g-node if they don't already exist locally # How does it know to do this before any of the other tests? files_to_download = files_to_test + files_to_compare def test_reading_same(self): for ioobj, path in self.iter_io_objects(return_path=True): obj_reader_base = create_generic_reader(ioobj, target=False) obj_reader_single = create_generic_reader(ioobj) obj_base = obj_reader_base() obj_single = obj_reader_single() try: assert_same_sub_schema(obj_base, obj_single) except BaseException as exc: exc.args += ('from ' + os.path.basename(path),) raise def test_against_reference(self): for filename, refname in zip(self.files_to_test, self.files_to_compare): if not refname: continue obj = self.read_file(filename=filename) refobj = proc_dam(self.get_filename_path(refname)) try: assert_neo_object_is_compliant(obj) assert_neo_object_is_compliant(refobj) assert_same_sub_schema(obj, refobj) except BaseException as exc: exc.args += ('from ' + filename,) raise if __name__ == '__main__': unittest.main() neo-0.3.3/neo/test/iotest/test_pynnio.py0000644000175000017500000002013312265516260021342 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.io.pynnio.PyNNNumpyIO and neo.io.pynnio.PyNNTextIO classes """ # needed for python 3 compatibility from __future__ import absolute_import, division import os try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core import Segment, AnalogSignal, SpikeTrain from neo.io import PyNNNumpyIO, PyNNTextIO from neo.test.tools import assert_arrays_equal, assert_file_contents_equal #TODO: common test fails. from neo.test.iotest.common_io_test import BaseTestIO #class CommonTestPyNNNumpyIO(BaseTestIO, unittest.TestCase): # ioclass = PyNNNumpyIO NCELLS = 5 class CommonTestPyNNTextIO(BaseTestIO, unittest.TestCase): ioclass = PyNNTextIO read_and_write_is_bijective = False def read_test_file(filename): contents = np.load(filename) data = contents["data"] metadata = {} for name, value in contents['metadata']: try: metadata[name] = eval(value) except Exception: metadata[name] = value return data, metadata read_test_file.__test__ = False class BaseTestPyNNIO(object): __test__ = False def tearDown(self): if os.path.exists(self.test_file): os.remove(self.test_file) def test_write_segment(self): in_ = self.io_cls(self.test_file) write_test_file = "write_test.%s" % self.file_extension out = self.io_cls(write_test_file) out.write_segment(in_.read_segment(lazy=False, cascade=True)) assert_file_contents_equal(self.test_file, write_test_file) if os.path.exists(write_test_file): os.remove(write_test_file) def build_test_data(self, variable='v'): metadata = { 'size': NCELLS, 'first_index': 0, 'first_id': 0, 'n': 505, 'variable': variable, 'last_id': 4, 'last_index': 5, 'dt': 0.1, 'label': "population0", } if variable == 'v': metadata['units'] = 'mV' elif variable == 'spikes': metadata['units'] = 'ms' data = np.empty((505, 2)) for i in range(NCELLS): # signal data[i*101:(i+1)*101, 0] = np.arange(i, i+101, dtype=float) # index data[i*101:(i+1)*101, 1] = i*np.ones((101,), dtype=float) return data, metadata build_test_data.__test__ = False class BaseTestPyNNIO_Signals(BaseTestPyNNIO): def setUp(self): self.test_file = "test_file_v.%s" % self.file_extension self.write_test_file("v") def test_read_segment_containing_analogsignals_using_eager_cascade(self): # eager == not lazy io = self.io_cls(self.test_file) segment = io.read_segment(lazy=False, cascade=True) self.assertIsInstance(segment, Segment) self.assertEqual(len(segment.analogsignals), NCELLS) as0 = segment.analogsignals[0] self.assertIsInstance(as0, AnalogSignal) assert_arrays_equal(as0, AnalogSignal(np.arange(0, 101, dtype=float), sampling_period=0.1*pq.ms, t_start=0*pq.s, units=pq.mV)) as4 = segment.analogsignals[4] self.assertIsInstance(as4, AnalogSignal) assert_arrays_equal(as4, AnalogSignal(np.arange(4, 105, dtype=float), sampling_period=0.1*pq.ms, t_start=0*pq.s, units=pq.mV)) # test annotations (stuff from file metadata) def test_read_analogsignal_using_eager(self): io = self.io_cls(self.test_file) as3 = io.read_analogsignal(lazy=False, channel_index=3) self.assertIsInstance(as3, AnalogSignal) assert_arrays_equal(as3, AnalogSignal(np.arange(3, 104, dtype=float), sampling_period=0.1*pq.ms, t_start=0*pq.s, units=pq.mV)) # should test annotations: 'channel_index', etc. def test_read_spiketrain_should_fail_with_analogsignal_file(self): io = self.io_cls(self.test_file) self.assertRaises(TypeError, io.read_spiketrain, channel_index=0) class BaseTestPyNNIO_Spikes(BaseTestPyNNIO): def setUp(self): self.test_file = "test_file_spikes.%s" % self.file_extension self.write_test_file("spikes") def test_read_segment_containing_spiketrains_using_eager_cascade(self): io = self.io_cls(self.test_file) segment = io.read_segment(lazy=False, cascade=True) self.assertIsInstance(segment, Segment) self.assertEqual(len(segment.spiketrains), NCELLS) st0 = segment.spiketrains[0] self.assertIsInstance(st0, SpikeTrain) assert_arrays_equal(st0, SpikeTrain(np.arange(0, 101, dtype=float), t_start=0*pq.s, t_stop=101*pq.ms, units=pq.ms)) st4 = segment.spiketrains[4] self.assertIsInstance(st4, SpikeTrain) assert_arrays_equal(st4, SpikeTrain(np.arange(4, 105, dtype=float), t_start=0*pq.s, t_stop=105*pq.ms, units=pq.ms)) # test annotations (stuff from file metadata) def test_read_spiketrain_using_eager(self): io = self.io_cls(self.test_file) st3 = io.read_spiketrain(lazy=False, channel_index=3) self.assertIsInstance(st3, SpikeTrain) assert_arrays_equal(st3, SpikeTrain(np.arange(3, 104, dtype=float), t_start=0*pq.s, t_stop=104*pq.s, units=pq.ms)) # should test annotations: 'channel_index', etc. def test_read_analogsignal_should_fail_with_spiketrain_file(self): io = self.io_cls(self.test_file) self.assertRaises(TypeError, io.read_analogsignal, channel_index=2) class BaseTestPyNNNumpyIO(object): io_cls = PyNNNumpyIO file_extension = "npz" def write_test_file(self, variable='v', check=False): data, metadata = self.build_test_data(variable) metadata_array = np.array(sorted(metadata.items())) np.savez(self.test_file, data=data, metadata=metadata_array) if check: data1, metadata1 = read_test_file(self.test_file) assert metadata == metadata1, "%s != %s" % (metadata, metadata1) assert data.shape == data1.shape == (505, 2), \ "%s, %s, (505, 2)" % (data.shape, data1.shape) assert (data == data1).all() assert metadata["n"] == 505 write_test_file.__test__ = False class BaseTestPyNNTextIO(object): io_cls = PyNNTextIO file_extension = "txt" def write_test_file(self, variable='v', check=False): data, metadata = self.build_test_data(variable) with open(self.test_file, 'wb') as f: for item in sorted(metadata.items()): f.write(("# %s = %s\n" % item).encode('utf8')) np.savetxt(f, data) if check: raise NotImplementedError write_test_file.__test__ = False class TestPyNNNumpyIO_Signals(BaseTestPyNNNumpyIO, BaseTestPyNNIO_Signals, unittest.TestCase): __test__ = True class TestPyNNNumpyIO_Spikes(BaseTestPyNNNumpyIO, BaseTestPyNNIO_Spikes, unittest.TestCase): __test__ = True class TestPyNNTextIO_Signals(BaseTestPyNNTextIO, BaseTestPyNNIO_Signals, unittest.TestCase): __test__ = True class TestPyNNTextIO_Spikes(BaseTestPyNNTextIO, BaseTestPyNNIO_Spikes, unittest.TestCase): __test__ = True if __name__ == '__main__': unittest.main() neo-0.3.3/neo/test/iotest/test_spike2io.py0000644000175000017500000000115312265516260021554 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.spike2io """ # needed for python 3 compatibility from __future__ import absolute_import, division try: import unittest2 as unittest except ImportError: import unittest from neo.io import Spike2IO from neo.test.iotest.common_io_test import BaseTestIO class TestSpike2IO(BaseTestIO, unittest.TestCase, ): ioclass = Spike2IO files_to_test = ['File_spike2_1.smr', 'File_spike2_2.smr', 'File_spike2_3.smr', ] files_to_download = files_to_test if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/iotest/test_brainwaref32io.py0000644000175000017500000001334712273723542022656 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of neo.io.brainwaref32io """ # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import os.path import sys try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core import Block, RecordingChannelGroup, Segment, SpikeTrain, Unit from neo.io import BrainwareF32IO from neo.io.tools import create_many_to_one_relationship from neo.test.iotest.common_io_test import BaseTestIO from neo.test.tools import (assert_same_sub_schema, assert_neo_object_is_compliant) from neo.test.iotest.tools import create_generic_reader PY_VER = sys.version_info[0] def proc_f32(filename): '''Load an f32 file that has already been processed by the official matlab file converter. That matlab data is saved to an m-file, which is then converted to a numpy '.npz' file. This numpy file is the file actually loaded. This function converts it to a neo block and returns the block. This block can be compared to the block produced by BrainwareF32IO to make sure BrainwareF32IO is working properly block = proc_f32(filename) filename: The file name of the numpy file to load. It should end with '*_f32_py?.npz'. This will be converted to a neo 'file_origin' property with the value '*.f32', so the filename to compare should fit that pattern. 'py?' should be 'py2' for the python 2 version of the numpy file or 'py3' for the python 3 version of the numpy file. example: filename = 'file1_f32_py2.npz' f32 file name = 'file1.f32' ''' filenameorig = os.path.basename(filename[:-12]+'.f32') # create the objects to store other objects block = Block(file_origin=filenameorig) rcg = RecordingChannelGroup(file_origin=filenameorig) rcg.channel_indexes = np.array([], dtype=np.int) rcg.channel_names = np.array([], dtype='S') unit = Unit(file_origin=filenameorig) # load objects into their containers block.recordingchannelgroups.append(rcg) rcg.units.append(unit) try: with np.load(filename) as f32obj: f32file = f32obj.items()[0][1].flatten() except IOError as exc: if 'as a pickle' in exc.message: create_many_to_one_relationship(block) return block else: raise sweeplengths = [res[0, 0].tolist() for res in f32file['sweeplength']] stims = [res.flatten().tolist() for res in f32file['stim']] sweeps = [res['spikes'].flatten() for res in f32file['sweep'] if res.size] fullf32 = zip(sweeplengths, stims, sweeps) for sweeplength, stim, sweep in fullf32: for trainpts in sweep: if trainpts.size: trainpts = trainpts.flatten().astype('float32') else: trainpts = [] paramnames = ['Param%s' % i for i in range(len(stim))] params = dict(zip(paramnames, stim)) train = SpikeTrain(trainpts, units=pq.ms, t_start=0, t_stop=sweeplength, file_origin=filenameorig) segment = Segment(file_origin=filenameorig, **params) segment.spiketrains = [train] unit.spiketrains.append(train) block.segments.append(segment) create_many_to_one_relationship(block) return block class BrainwareF32IOTestCase(BaseTestIO, unittest.TestCase): ''' Unit test testcase for neo.io.BrainwareF32IO ''' ioclass = BrainwareF32IO read_and_write_is_bijective = False # These are the files it tries to read and test for compliance files_to_test = ['block_300ms_4rep_1clust_part_ch1.f32', 'block_500ms_5rep_empty_fullclust_ch1.f32', 'block_500ms_5rep_empty_partclust_ch1.f32', 'interleaved_500ms_5rep_ch2.f32', 'interleaved_500ms_5rep_nospikes_ch1.f32', 'multi_500ms_mulitrep_ch1.f32', 'random_500ms_12rep_noclust_part_ch2.f32', 'sequence_500ms_5rep_ch2.f32'] # add the appropriate suffix depending on the python version suffix = '_f32_py%s.npz' % PY_VER files_to_download = files_to_test[:] # add the reference files to the list of files to download files_to_compare = [] for fname in files_to_test: if fname: files_to_compare.append(os.path.splitext(fname)[0] + suffix) # Will fetch from g-node if they don't already exist locally # How does it know to do this before any of the other tests? files_to_download = files_to_test + files_to_compare def test_reading_same(self): for ioobj, path in self.iter_io_objects(return_path=True): obj_reader_base = create_generic_reader(ioobj, target=False) obj_reader_single = create_generic_reader(ioobj) obj_base = obj_reader_base() obj_single = obj_reader_single() try: assert_same_sub_schema(obj_base, obj_single) except BaseException as exc: exc.args += ('from ' + os.path.basename(path),) raise def test_against_reference(self): for obj, path in self.iter_objects(return_path=True): filename = os.path.basename(path) refpath = os.path.splitext(path)[0] + self.suffix refobj = proc_f32(refpath) try: assert_neo_object_is_compliant(obj) assert_neo_object_is_compliant(refobj) assert_same_sub_schema(obj, refobj) except BaseException as exc: exc.args += ('from ' + filename,) raise if __name__ == '__main__': unittest.main() neo-0.3.3/neo/test/test_epoch.py0000644000175000017500000000333112273723542017620 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.epoch.Epoch class """ try: import unittest2 as unittest except ImportError: import unittest import quantities as pq from neo.core.epoch import Epoch from neo.test.tools import assert_neo_object_is_compliant class TestEpoch(unittest.TestCase): def test_epoch_creation(self): params = {'testarg2': 'yes', 'testarg3': True} epc = Epoch(1.5*pq.ms, duration=20*pq.ns, label='test epoch', name='test', description='tester', file_origin='test.file', testarg1=1, **params) epc.annotate(testarg1=1.1, testarg0=[1, 2, 3]) assert_neo_object_is_compliant(epc) self.assertEqual(epc.time, 1.5*pq.ms) self.assertEqual(epc.duration, 20*pq.ns) self.assertEqual(epc.label, 'test epoch') self.assertEqual(epc.name, 'test') self.assertEqual(epc.description, 'tester') self.assertEqual(epc.file_origin, 'test.file') self.assertEqual(epc.annotations['testarg0'], [1, 2, 3]) self.assertEqual(epc.annotations['testarg1'], 1.1) self.assertEqual(epc.annotations['testarg2'], 'yes') self.assertTrue(epc.annotations['testarg3']) def test_epoch_merge_NotImplementedError(self): epc1 = Epoch(1.5*pq.ms, duration=20*pq.ns, label='test epoch', name='test', description='tester', file_origin='test.file') epc2 = Epoch(1.5*pq.ms, duration=20*pq.ns, label='test epoch', name='test', description='tester', file_origin='test.file') self.assertRaises(NotImplementedError, epc1.merge, epc2) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_unit.py0000644000175000017500000001462512273723542017511 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.unit.Unit class """ try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.unit import Unit from neo.core.spiketrain import SpikeTrain from neo.core.spike import Spike from neo.test.tools import assert_neo_object_is_compliant, assert_arrays_equal from neo.io.tools import create_many_to_one_relationship class TestUnit(unittest.TestCase): def setUp(self): self.setup_spikes() self.setup_spiketrains() self.setup_units() def setup_units(self): params = {'testarg2': 'yes', 'testarg3': True} self.unit1 = Unit(name='test', description='tester 1', file_origin='test.file', channels_indexes=[1], testarg1=1, **params) self.unit2 = Unit(name='test', description='tester 2', file_origin='test.file', channels_indexes=[2], testarg1=1, **params) self.unit1.annotate(testarg1=1.1, testarg0=[1, 2, 3]) self.unit2.annotate(testarg11=1.1, testarg10=[1, 2, 3]) self.unit1.spiketrains = self.train1 self.unit2.spiketrains = self.train2 self.unit1.spikes = self.spike1 self.unit2.spikes = self.spike2 create_many_to_one_relationship(self.unit1) create_many_to_one_relationship(self.unit2) def setup_spikes(self): spikename11 = 'spike 1 1' spikename12 = 'spike 1 2' spikename21 = 'spike 2 1' spikename22 = 'spike 2 2' spikedata11 = 10 * pq.ms spikedata12 = 20 * pq.ms spikedata21 = 30 * pq.s spikedata22 = 40 * pq.s self.spikenames1 = [spikename11, spikename12] self.spikenames2 = [spikename21, spikename22] self.spikenames = [spikename11, spikename12, spikename21, spikename22] spike11 = Spike(spikedata11, t_stop=100*pq.s, name=spikename11) spike12 = Spike(spikedata12, t_stop=100*pq.s, name=spikename12) spike21 = Spike(spikedata21, t_stop=100*pq.s, name=spikename21) spike22 = Spike(spikedata22, t_stop=100*pq.s, name=spikename22) self.spike1 = [spike11, spike12] self.spike2 = [spike21, spike22] self.spike = [spike11, spike12, spike21, spike22] def setup_spiketrains(self): trainname11 = 'spiketrain 1 1' trainname12 = 'spiketrain 1 2' trainname21 = 'spiketrain 2 1' trainname22 = 'spiketrain 2 2' traindata11 = np.arange(0, 10) * pq.ms traindata12 = np.arange(10, 20) * pq.ms traindata21 = np.arange(20, 30) * pq.s traindata22 = np.arange(30, 40) * pq.s self.trainnames1 = [trainname11, trainname12] self.trainnames2 = [trainname21, trainname22] self.trainnames = [trainname11, trainname12, trainname21, trainname22] train11 = SpikeTrain(traindata11, t_stop=100*pq.s, name=trainname11) train12 = SpikeTrain(traindata12, t_stop=100*pq.s, name=trainname12) train21 = SpikeTrain(traindata21, t_stop=100*pq.s, name=trainname21) train22 = SpikeTrain(traindata22, t_stop=100*pq.s, name=trainname22) self.train1 = [train11, train12] self.train2 = [train21, train22] self.train = [train11, train12, train21, train22] def test_unit_creation(self): assert_neo_object_is_compliant(self.unit1) assert_neo_object_is_compliant(self.unit2) self.assertEqual(self.unit1.name, 'test') self.assertEqual(self.unit2.name, 'test') self.assertEqual(self.unit1.description, 'tester 1') self.assertEqual(self.unit2.description, 'tester 2') self.assertEqual(self.unit1.file_origin, 'test.file') self.assertEqual(self.unit2.file_origin, 'test.file') self.assertEqual(self.unit1.annotations['testarg0'], [1, 2, 3]) self.assertEqual(self.unit2.annotations['testarg10'], [1, 2, 3]) self.assertEqual(self.unit1.annotations['testarg1'], 1.1) self.assertEqual(self.unit2.annotations['testarg1'], 1) self.assertEqual(self.unit2.annotations['testarg11'], 1.1) self.assertEqual(self.unit1.annotations['testarg2'], 'yes') self.assertEqual(self.unit2.annotations['testarg2'], 'yes') self.assertTrue(self.unit1.annotations['testarg3']) self.assertTrue(self.unit2.annotations['testarg3']) self.assertTrue(hasattr(self.unit1, 'spikes')) self.assertTrue(hasattr(self.unit2, 'spikes')) self.assertEqual(len(self.unit1.spikes), 2) self.assertEqual(len(self.unit2.spikes), 2) for res, targ in zip(self.unit1.spikes, self.spike1): self.assertEqual(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.unit2.spikes, self.spike2): self.assertEqual(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.unit1, 'spiketrains')) self.assertTrue(hasattr(self.unit2, 'spiketrains')) self.assertEqual(len(self.unit1.spiketrains), 2) self.assertEqual(len(self.unit2.spiketrains), 2) for res, targ in zip(self.unit1.spiketrains, self.train1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.unit2.spiketrains, self.train2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) def test_unit_merge(self): self.unit1.merge(self.unit2) spikeres1 = [sig.name for sig in self.unit1.spikes] spikeres2 = [sig.name for sig in self.unit2.spikes] trainres1 = [sig.name for sig in self.unit1.spiketrains] trainres2 = [sig.name for sig in self.unit2.spiketrains] self.assertEqual(spikeres1, self.spikenames) self.assertEqual(spikeres2, self.spikenames2) self.assertEqual(trainres1, self.trainnames) self.assertEqual(trainres2, self.trainnames2) for res, targ in zip(self.unit1.spikes, self.spike): self.assertEqual(res, targ) for res, targ in zip(self.unit2.spikes, self.spike2): self.assertEqual(res, targ) for res, targ in zip(self.unit1.spiketrains, self.train): assert_arrays_equal(res, targ) for res, targ in zip(self.unit2.spiketrains, self.train2): assert_arrays_equal(res, targ) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_spike.py0000644000175000017500000001014212273723542017633 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.spike.Spike class """ try: import unittest2 as unittest except ImportError: import unittest import quantities as pq from neo.core.spike import Spike from neo.test.tools import assert_arrays_equal, assert_neo_object_is_compliant class TestSpike(unittest.TestCase): def setUp(self): params = {'testarg2': 'yes', 'testarg3': True} self.sampling_rate1 = .1*pq.Hz self.left_sweep1 = 2.*pq.s self.spike1 = Spike(1.5*pq.ms, waveform=[[1.1, 1.5, 1.7], [2.2, 2.6, 2.8]]*pq.mV, sampling_rate=self.sampling_rate1, left_sweep=self.left_sweep1, name='test', description='tester', file_origin='test.file', testarg1=1, **params) self.spike1.annotate(testarg1=1.1, testarg0=[1, 2, 3]) def test_spike_creation(self): assert_neo_object_is_compliant(self.spike1) self.assertEqual(self.spike1.time, 1.5*pq.ms) assert_arrays_equal(self.spike1.waveform, [[1.1, 1.5, 1.7], [2.2, 2.6, 2.8]]*pq.mV) self.assertEqual(self.spike1.sampling_rate, .1*pq.Hz) self.assertEqual(self.spike1.left_sweep, 2.*pq.s) self.assertEqual(self.spike1.description, 'tester') self.assertEqual(self.spike1.file_origin, 'test.file') self.assertEqual(self.spike1.annotations['testarg0'], [1, 2, 3]) self.assertEqual(self.spike1.annotations['testarg1'], 1.1) self.assertEqual(self.spike1.annotations['testarg2'], 'yes') self.assertTrue(self.spike1.annotations['testarg3']) def test__duration(self): result1 = self.spike1.duration self.spike1.sampling_rate = None assert_neo_object_is_compliant(self.spike1) result2 = self.spike1.duration self.spike1.sampling_rate = self.sampling_rate1 self.spike1.waveform = None assert_neo_object_is_compliant(self.spike1) result3 = self.spike1.duration self.assertEqual(result1, 30./pq.Hz) self.assertEqual(result1.units, 1./pq.Hz) self.assertEqual(result2, None) self.assertEqual(result3, None) def test__sampling_period(self): result1 = self.spike1.sampling_period self.spike1.sampling_rate = None assert_neo_object_is_compliant(self.spike1) result2 = self.spike1.sampling_period self.spike1.sampling_rate = self.sampling_rate1 self.spike1.sampling_period = 10.*pq.ms assert_neo_object_is_compliant(self.spike1) result3a = self.spike1.sampling_period result3b = self.spike1.sampling_rate self.spike1.sampling_period = None result4a = self.spike1.sampling_period result4b = self.spike1.sampling_rate self.assertEqual(result1, 10./pq.Hz) self.assertEqual(result1.units, 1./pq.Hz) self.assertEqual(result2, None) self.assertEqual(result3a, 10.*pq.ms) self.assertEqual(result3a.units, 1.*pq.ms) self.assertEqual(result3b, .1/pq.ms) self.assertEqual(result3b.units, 1./pq.ms) self.assertEqual(result4a, None) self.assertEqual(result4b, None) def test__right_sweep(self): result1 = self.spike1.right_sweep self.spike1.left_sweep = None assert_neo_object_is_compliant(self.spike1) result2 = self.spike1.right_sweep self.spike1.left_sweep = self.left_sweep1 self.spike1.sampling_rate = None assert_neo_object_is_compliant(self.spike1) result3 = self.spike1.right_sweep self.spike1.sampling_rate = self.sampling_rate1 self.spike1.waveform = None assert_neo_object_is_compliant(self.spike1) result4 = self.spike1.right_sweep self.assertEqual(result1, 32.*pq.s) self.assertEqual(result1.units, 1.*pq.s) self.assertEqual(result2, None) self.assertEqual(result3, None) self.assertEqual(result4, None) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_eventarray.py0000644000175000017500000001076612273723542020714 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.eventarray.EventArray class """ try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.eventarray import EventArray from neo.test.tools import (assert_neo_object_is_compliant, assert_arrays_equal, assert_same_sub_schema) class TestEventArray(unittest.TestCase): def test_EventArray_creation(self): params = {'testarg2': 'yes', 'testarg3': True} evta = EventArray([1.1, 1.5, 1.7]*pq.ms, labels=np.array(['test event 1', 'test event 2', 'test event 3'], dtype='S'), name='test', description='tester', file_origin='test.file', testarg1=1, **params) evta.annotate(testarg1=1.1, testarg0=[1, 2, 3]) assert_neo_object_is_compliant(evta) assert_arrays_equal(evta.times, [1.1, 1.5, 1.7]*pq.ms) assert_arrays_equal(evta.labels, np.array(['test event 1', 'test event 2', 'test event 3'], dtype='S')) self.assertEqual(evta.name, 'test') self.assertEqual(evta.description, 'tester') self.assertEqual(evta.file_origin, 'test.file') self.assertEqual(evta.annotations['testarg0'], [1, 2, 3]) self.assertEqual(evta.annotations['testarg1'], 1.1) self.assertEqual(evta.annotations['testarg2'], 'yes') self.assertTrue(evta.annotations['testarg3']) def test_EventArray_repr(self): params = {'testarg2': 'yes', 'testarg3': True} evta = EventArray([1.1, 1.5, 1.7]*pq.ms, labels=np.array(['test event 1', 'test event 2', 'test event 3'], dtype='S'), name='test', description='tester', file_origin='test.file', testarg1=1, **params) evta.annotate(testarg1=1.1, testarg0=[1, 2, 3]) assert_neo_object_is_compliant(evta) targ = ('') res = repr(evta) self.assertEqual(targ, res) def test_EventArray_merge(self): params1 = {'testarg2': 'yes', 'testarg3': True} params2 = {'testarg2': 'no', 'testarg4': False} paramstarg = {'testarg2': 'yes;no', 'testarg3': True, 'testarg4': False} epca1 = EventArray([1.1, 1.5, 1.7]*pq.ms, labels=np.array(['test event 1 1', 'test event 1 2', 'test event 1 3'], dtype='S'), name='test', description='tester 1', file_origin='test.file', testarg1=1, **params1) epca2 = EventArray([2.1, 2.5, 2.7]*pq.us, labels=np.array(['test event 2 1', 'test event 2 2', 'test event 2 3'], dtype='S'), name='test', description='tester 2', file_origin='test.file', testarg1=1, **params2) epcatarg = EventArray([1.1, 1.5, 1.7, .0021, .0025, .0027]*pq.ms, labels=np.array(['test event 1 1', 'test event 1 2', 'test event 1 3', 'test event 2 1', 'test event 2 2', 'test event 2 3'], dtype='S'), name='test', description='merge(tester 1, tester 2)', file_origin='test.file', testarg1=1, **paramstarg) assert_neo_object_is_compliant(epca1) assert_neo_object_is_compliant(epca2) assert_neo_object_is_compliant(epcatarg) epcares = epca1.merge(epca2) assert_neo_object_is_compliant(epcares) assert_same_sub_schema(epcatarg, epcares) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_base.py0000644000175000017500000010342112273723542017435 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.baseneo.BaseNeo class and related functions """ from datetime import datetime, date, time, timedelta from decimal import Decimal from fractions import Fraction import sys try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.baseneo import (BaseNeo, _check_annotations, merge_annotation, merge_annotations) from neo.test.tools import assert_arrays_equal if sys.version_info[0] >= 3: _bytes = bytes long = int def bytes(s): return _bytes(s, encoding='ascii') class Test_check_annotations(unittest.TestCase): ''' TestCase to make sure _check_annotations works ''' def setUp(self): self.values = [1, 2.2, 3 + 2j, 'test', r'test', b'test', None, datetime(year=2008, month=12, day=3, hour=10, minute=4), timedelta(weeks=2, days=7, hours=18, minutes=28, seconds=18, milliseconds=28, microseconds=45), time(hour=10, minute=4), Decimal("3.14"), Fraction(13, 21), np.array([1.1, 1.2, 1.3]), np.array([1, 2, 3]), np.array('test', dtype='S'), np.array([True, False])] def test__check_annotations__invalid_ValueError(self): value = set([]) self.assertRaises(ValueError, _check_annotations, value) def test__check_annotations__invalid_dtype_ValueError(self): value = np.array([], dtype='O') self.assertRaises(ValueError, _check_annotations, value) def test__check_annotations__valid_dtypes(self): for value in self.values: _check_annotations(value) def test__check_annotations__list(self): _check_annotations(self.values) def test__check_annotations__tuple(self): _check_annotations(tuple(self.values)) _check_annotations((self.values, self.values)) def test__check_annotations__dict(self): names = ['value%s' % i for i in range(len(self.values))] values = dict(zip(names, self.values)) _check_annotations(values) class Test_merge_annotation_annotations(unittest.TestCase): ''' TestCase to make sure merge_annotation and merge_annotations work ''' def test_merge_annotation__different_type_AssertionError(self): value1 = 'test' value2 = 5.5 self.assertRaises(AssertionError, merge_annotation, value1, value2) def test_merge_annotation__unmergable_unequal_AssertionError(self): value1 = 5.6 value2 = 5.5 self.assertRaises(AssertionError, merge_annotation, value1, value2) def test_merge_annotation__str_unequal(self): value1 = 'test1' value2 = 'test2' targ = 'test1;test2' res = merge_annotation(value1, value2) self.assertEqual(targ, res) def test_merge_annotation__str_equal(self): value1 = 'test1' value2 = 'test1' targ = 'test1' res = merge_annotation(value1, value2) self.assertEqual(targ, res) def test_merge_annotation__ndarray(self): value1 = np.array([1, 2, 3]) value2 = np.array([4, 5]) targ = np.array([1, 2, 3, 4, 5]) res = merge_annotation(value1, value2) assert_arrays_equal(targ, res) def test_merge_annotation__float_equal(self): value1 = 5.5 value2 = 5.5 targ = 5.5 res = merge_annotation(value1, value2) self.assertEqual(targ, res) def test_merge_annotation__dict(self): value1 = {'val1': 1, 'val2': 2.2, 'val3': 'test1'} value2 = {'val2': 2.2, 'val3': 'test2', 'val4': [4, 4.4], 'val5': True} targ = {'val1': 1, 'val2': 2.2, 'val3': 'test1;test2', 'val4': [4, 4.4], 'val5': True} res = merge_annotation(value1, value2) self.assertEqual(targ, res) def test_merge_annotations__dict(self): value1 = {'val1': 1, 'val2': 2.2, 'val3': 'test1'} value2 = {'val2': 2.2, 'val3': 'test2', 'val4': [4, 4.4], 'val5': True} targ = {'val1': 1, 'val2': 2.2, 'val3': 'test1;test2', 'val4': [4, 4.4], 'val5': True} res = merge_annotations(value1, value2) self.assertEqual(targ, res) def test_merge_annotations__different_type_AssertionError(self): value1 = {'val1': 1, 'val2': 2.2, 'val3': 'tester'} value2 = {'val3': False, 'val4': [4, 4.4], 'val5': True} self.assertRaises(AssertionError, merge_annotations, value1, value2) def test_merge_annotations__unmergable_unequal_AssertionError(self): value1 = {'val1': 1, 'val2': 2.2, 'val3': True} value2 = {'val3': False, 'val4': [4, 4.4], 'val5': True} self.assertRaises(AssertionError, merge_annotation, value1, value2) class TestBaseNeo(unittest.TestCase): ''' TestCase to make sure basic initialization and methods work ''' def test_init(self): '''test to make sure initialization works properly''' base = BaseNeo(name='a base', description='this is a test') self.assertEqual(base.name, 'a base') self.assertEqual(base.description, 'this is a test') self.assertEqual(base.file_origin, None) def test_annotate(self): '''test to make sure annotation works properly''' base = BaseNeo() base.annotate(test1=1, test2=1) result1 = {'test1': 1, 'test2': 1} self.assertDictEqual(result1, base.annotations) base.annotate(test3=2, test4=3) result2 = {'test3': 2, 'test4': 3} result2a = dict(list(result1.items()) + list(result2.items())) self.assertDictContainsSubset(result1, base.annotations) self.assertDictContainsSubset(result2, base.annotations) self.assertDictEqual(result2a, base.annotations) base.annotate(test1=5, test2=8) result3 = {'test1': 5, 'test2': 8} result3a = dict(list(result3.items()) + list(result2.items())) self.assertDictContainsSubset(result2, base.annotations) self.assertDictContainsSubset(result3, base.annotations) self.assertDictEqual(result3a, base.annotations) self.assertNotEqual(base.annotations['test1'], result1['test1']) self.assertNotEqual(base.annotations['test2'], result1['test2']) class TestBaseNeoCoreTypes(unittest.TestCase): ''' TestCase to make sure annotations are properly checked for core built-in python data types ''' def setUp(self): '''create the instance to be tested, called before every test''' self.base = BaseNeo() def test_python_nonetype(self): '''test to make sure None type data is accepted''' value = None self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_int(self): '''test to make sure int type data is accepted''' value = 10 self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_long(self): '''test to make sure long type data is accepted''' value = long(7) self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_float(self): '''test to make sure float type data is accepted''' value = 9.2 self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_complex(self): '''test to make sure complex type data is accepted''' value = complex(23.17, 11.29) self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_string(self): '''test to make sure string type data is accepted''' value = 'this is a test' self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_unicode(self): '''test to make sure unicode type data is accepted''' value = u'this is also a test' self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_bytes(self): '''test to make sure bytes type data is accepted''' value = bytes('1,2,3,4,5') self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) class TestBaseNeoStandardLibraryTypes(unittest.TestCase): ''' TestCase to make sure annotations are properly checked for data types from the python standard library that are not core built-in data types ''' def setUp(self): '''create the instance to be tested, called before every test''' self.base = BaseNeo() def test_python_fraction(self): '''test to make sure Fraction type data is accepted''' value = Fraction(13, 21) self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_decimal(self): '''test to make sure Decimal type data is accepted''' value = Decimal("3.14") self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_datetime(self): '''test to make sure datetime type data is accepted''' value = datetime(year=2008, month=12, day=3, hour=10, minute=4) self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_date(self): '''test to make sure date type data is accepted''' value = date(year=2008, month=12, day=3) self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_time(self): '''test to make sure time type data is accepted''' value = time(hour=10, minute=4) self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_timedelta(self): '''test to make sure timedelta type data is accepted''' value = timedelta(weeks=2, days=7, hours=18, minutes=28, seconds=18, milliseconds=28, microseconds=45) self.base.annotate(data=value) result = {'data': value} self.assertEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) class TestBaseNeoContainerTypes(unittest.TestCase): ''' TestCase to make sure annotations are properly checked for data type inside python built-in container types ''' def setUp(self): '''create the instance to be tested, called before every test''' self.base = BaseNeo() def test_python_list(self): '''test to make sure list type data is accepted''' value = [None, 10, 9.2, complex(23, 11), ['this is a test', bytes('1,2,3,4,5')], [Fraction(13, 21), Decimal("3.14")]] self.base.annotate(data=value) result = {'data': value} self.assertListEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_tuple(self): '''test to make sure tuple type data is accepted''' value = (None, 10, 9.2, complex(23, 11), ('this is a test', bytes('1,2,3,4,5')), (Fraction(13, 21), Decimal("3.14"))) self.base.annotate(data=value) result = {'data': value} self.assertTupleEqual(value, self.base.annotations['data']) self.assertDictEqual(result, self.base.annotations) def test_python_dict(self): '''test to make sure dict type data is accepted''' value = {'NoneType': None, 'int': 10, 'float': 9.2, 'complex': complex(23, 11), 'dict1': {'string': 'this is a test', 'bytes': bytes('1,2,3,4,5')}, 'dict2': {'Fraction': Fraction(13, 21), 'Decimal': Decimal("3.14")}} self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_python_set(self): '''test to make sure set type data is rejected''' value = set([None, 10, 9.2, complex(23, 11)]) self.assertRaises(ValueError, self.base.annotate, data=value) def test_python_frozenset(self): '''test to make sure frozenset type data is rejected''' value = frozenset([None, 10, 9.2, complex(23, 11)]) self.assertRaises(ValueError, self.base.annotate, data=value) def test_python_iter(self): '''test to make sure iter type data is rejected''' value = iter([None, 10, 9.2, complex(23, 11)]) self.assertRaises(ValueError, self.base.annotate, data=value) class TestBaseNeoNumpyArrayTypes(unittest.TestCase): ''' TestCase to make sure annotations are properly checked for numpy arrays ''' def setUp(self): '''create the instance to be tested, called before every test''' self.base = BaseNeo() def test_numpy_array_int(self): '''test to make sure int type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.int) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_uint(self): '''test to make sure uint type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.uint) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_int0(self): '''test to make sure int0 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.int0) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_uint0(self): '''test to make sure uint0 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.uint0) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_int8(self): '''test to make sure int8 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.int8) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_uint8(self): '''test to make sure uint8 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.uint8) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_int16(self): '''test to make sure int16 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.int16) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_uint16(self): '''test to make sure uint16 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.uint16) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_int32(self): '''test to make sure int32 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.int32) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_uint32(self): '''test to make sure uint32 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.uint32) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_int64(self): '''test to make sure int64 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.int64) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_uint64(self): '''test to make sure uint64 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.uint64) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_float(self): '''test to make sure float type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.float) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_floating(self): '''test to make sure floating type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.floating) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_double(self): '''test to make sure double type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.double) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_float16(self): '''test to make sure float16 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.float16) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_float32(self): '''test to make sure float32 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.float32) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_float64(self): '''test to make sure float64 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.float64) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) @unittest.skipUnless(hasattr(np, "float128"), "float128 not available") def test_numpy_array_float128(self): '''test to make sure float128 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.float128) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_complex(self): '''test to make sure complex type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.complex) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_complex64(self): '''test to make sure complex64 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.complex64) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_complex128(self): '''test to make sure complex128 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.complex128) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) @unittest.skipUnless(hasattr(np, "complex256"), "complex256 not available") def test_numpy_scalar_complex256(self): '''test to make sure complex256 type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.complex256) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_bool(self): '''test to make sure bool type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.bool) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_str(self): '''test to make sure str type numpy arrays are accepted''' value = np.array([1, 2, 3, 4, 5], dtype=np.str) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_string0(self): '''test to make sure string0 type numpy arrays are accepted''' if sys.version_info[0] >= 3: dtype = np.str0 else: dtype = np.string0 value = np.array([1, 2, 3, 4, 5], dtype=dtype) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) class TestBaseNeoNumpyScalarTypes(unittest.TestCase): ''' TestCase to make sure annotations are properly checked for numpy scalars ''' def setUp(self): '''create the instance to be tested, called before every test''' self.base = BaseNeo() def test_numpy_scalar_int(self): '''test to make sure int type numpy scalars are accepted''' value = np.array(99, dtype=np.int) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_uint(self): '''test to make sure uint type numpy scalars are accepted''' value = np.array(99, dtype=np.uint) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_int0(self): '''test to make sure int0 type numpy scalars are accepted''' value = np.array(99, dtype=np.int0) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_uint0(self): '''test to make sure uint0 type numpy scalars are accepted''' value = np.array(99, dtype=np.uint0) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_int8(self): '''test to make sure int8 type numpy scalars are accepted''' value = np.array(99, dtype=np.int8) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_uint8(self): '''test to make sure uint8 type numpy scalars are accepted''' value = np.array(99, dtype=np.uint8) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_int16(self): '''test to make sure int16 type numpy scalars are accepted''' value = np.array(99, dtype=np.int16) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_uint16(self): '''test to make sure uint16 type numpy scalars are accepted''' value = np.array(99, dtype=np.uint16) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_int32(self): '''test to make sure int32 type numpy scalars are accepted''' value = np.array(99, dtype=np.int32) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_uint32(self): '''test to make sure uint32 type numpy scalars are accepted''' value = np.array(99, dtype=np.uint32) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_int64(self): '''test to make sure int64 type numpy scalars are accepted''' value = np.array(99, dtype=np.int64) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_uint64(self): '''test to make sure uint64 type numpy scalars are accepted''' value = np.array(99, dtype=np.uint64) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_float(self): '''test to make sure float type numpy scalars are accepted''' value = np.array(99, dtype=np.float) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_floating(self): '''test to make sure floating type numpy scalars are accepted''' value = np.array(99, dtype=np.floating) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_double(self): '''test to make sure double type numpy scalars are accepted''' value = np.array(99, dtype=np.double) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_float16(self): '''test to make sure float16 type numpy scalars are accepted''' value = np.array(99, dtype=np.float16) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_float32(self): '''test to make sure float32 type numpy scalars are accepted''' value = np.array(99, dtype=np.float32) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_float64(self): '''test to make sure float64 type numpy scalars are accepted''' value = np.array(99, dtype=np.float64) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) @unittest.skipUnless(hasattr(np, "float128"), "float128 not available") def test_numpy_scalar_float128(self): '''test to make sure float128 type numpy scalars are accepted''' value = np.array(99, dtype=np.float128) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_complex(self): '''test to make sure complex type numpy scalars are accepted''' value = np.array(99, dtype=np.complex) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_complex64(self): '''test to make sure complex64 type numpy scalars are accepted''' value = np.array(99, dtype=np.complex64) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_complex128(self): '''test to make sure complex128 type numpy scalars are accepted''' value = np.array(99, dtype=np.complex128) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) @unittest.skipUnless(hasattr(np, "complex256"), "complex256 not available") def test_numpy_scalar_complex256(self): '''test to make sure complex256 type numpy scalars are accepted''' value = np.array(99, dtype=np.complex256) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_bool(self): '''test to make sure bool type numpy scalars are rejected''' value = np.array(99, dtype=np.bool) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_array_str(self): '''test to make sure str type numpy scalars are accepted''' value = np.array(99, dtype=np.str) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_numpy_scalar_string0(self): '''test to make sure string0 type numpy scalars are rejected''' if sys.version_info[0] >= 3: dtype = np.str0 else: dtype = np.string0 value = np.array(99, dtype=dtype) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) class TestBaseNeoQuantitiesArrayTypes(unittest.TestCase): ''' TestCase to make sure annotations are properly checked for quantities arrays ''' def setUp(self): '''create the instance to be tested, called before every test''' self.base = BaseNeo() def test_quantities_array_int(self): '''test to make sure int type quantites arrays are accepted''' value = pq.Quantity([1, 2, 3, 4, 5], dtype=np.int, units=pq.s) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_quantities_array_uint(self): '''test to make sure uint type quantites arrays are accepted''' value = pq.Quantity([1, 2, 3, 4, 5], dtype=np.uint, units=pq.meter) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_quantities_array_float(self): '''test to make sure float type quantites arrays are accepted''' value = [1, 2, 3, 4, 5] * pq.kg self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_quantities_array_str(self): '''test to make sure str type quantites arrays are accepted''' value = pq.Quantity([1, 2, 3, 4, 5], dtype=np.str, units=pq.meter) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) class TestBaseNeoQuantitiesScalarTypes(unittest.TestCase): ''' TestCase to make sure annotations are properly checked for quantities scalars ''' def setUp(self): '''create the instance to be tested, called before every test''' self.base = BaseNeo() def test_quantities_scalar_int(self): '''test to make sure int type quantites scalars are accepted''' value = pq.Quantity(99, dtype=np.int, units=pq.s) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_quantities_scalar_uint(self): '''test to make sure uint type quantites scalars are accepted''' value = pq.Quantity(99, dtype=np.uint, units=pq.meter) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_quantities_scalar_float(self): '''test to make sure float type quantites scalars are accepted''' value = 99 * pq.kg self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) def test_quantities_scalar_str(self): '''test to make sure str type quantites scalars are accepted''' value = pq.Quantity(99, dtype=np.str, units=pq.meter) self.base.annotate(data=value) result = {'data': value} self.assertDictEqual(result, self.base.annotations) class TestBaseNeoUserDefinedTypes(unittest.TestCase): ''' TestCase to make sure annotations are properly checked for arbitrary objects ''' def setUp(self): '''create the instance to be tested, called before every test''' self.base = BaseNeo() def test_my_class(self): '''test to make sure user defined class type data is rejected''' class Foo(object): pass value = Foo() self.assertRaises(ValueError, self.base.annotate, data=value) def test_my_class_list(self): '''test to make sure user defined class type data is rejected''' class Foo(object): pass value = [Foo(), Foo(), Foo()] self.assertRaises(ValueError, self.base.annotate, data=value) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_epocharray.py0000644000175000017500000001155012273723542020661 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.epocharray.EpochArray class """ try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.epocharray import EpochArray from neo.test.tools import (assert_neo_object_is_compliant, assert_arrays_equal, assert_same_sub_schema) class TestEpochArray(unittest.TestCase): def test_EpochArray_creation(self): params = {'testarg2': 'yes', 'testarg3': True} epca = EpochArray([1.1, 1.5, 1.7]*pq.ms, durations=[20, 40, 60]*pq.ns, labels=np.array(['test epoch 1', 'test epoch 2', 'test epoch 3'], dtype='S'), name='test', description='tester', file_origin='test.file', testarg1=1, **params) epca.annotate(testarg1=1.1, testarg0=[1, 2, 3]) assert_neo_object_is_compliant(epca) assert_arrays_equal(epca.times, [1.1, 1.5, 1.7]*pq.ms) assert_arrays_equal(epca.durations, [20, 40, 60]*pq.ns) assert_arrays_equal(epca.labels, np.array(['test epoch 1', 'test epoch 2', 'test epoch 3'], dtype='S')) self.assertEqual(epca.name, 'test') self.assertEqual(epca.description, 'tester') self.assertEqual(epca.file_origin, 'test.file') self.assertEqual(epca.annotations['testarg0'], [1, 2, 3]) self.assertEqual(epca.annotations['testarg1'], 1.1) self.assertEqual(epca.annotations['testarg2'], 'yes') self.assertTrue(epca.annotations['testarg3']) def test_EpochArray_repr(self): params = {'testarg2': 'yes', 'testarg3': True} epca = EpochArray([1.1, 1.5, 1.7]*pq.ms, durations=[20, 40, 60]*pq.ns, labels=np.array(['test epoch 1', 'test epoch 2', 'test epoch 3'], dtype='S'), name='test', description='tester', file_origin='test.file', testarg1=1, **params) epca.annotate(testarg1=1.1, testarg0=[1, 2, 3]) assert_neo_object_is_compliant(epca) targ = ('') res = repr(epca) self.assertEqual(targ, res) def test_EpochArray_merge(self): params1 = {'testarg2': 'yes', 'testarg3': True} params2 = {'testarg2': 'no', 'testarg4': False} paramstarg = {'testarg2': 'yes;no', 'testarg3': True, 'testarg4': False} epca1 = EpochArray([1.1, 1.5, 1.7]*pq.ms, durations=[20, 40, 60]*pq.us, labels=np.array(['test epoch 1 1', 'test epoch 1 2', 'test epoch 1 3'], dtype='S'), name='test', description='tester 1', file_origin='test.file', testarg1=1, **params1) epca2 = EpochArray([2.1, 2.5, 2.7]*pq.us, durations=[3, 5, 7]*pq.ms, labels=np.array(['test epoch 2 1', 'test epoch 2 2', 'test epoch 2 3'], dtype='S'), name='test', description='tester 2', file_origin='test.file', testarg1=1, **params2) epcatarg = EpochArray([1.1, 1.5, 1.7, .0021, .0025, .0027]*pq.ms, durations=[20, 40, 60, 3000, 5000, 7000]*pq.ns, labels=np.array(['test epoch 1 1', 'test epoch 1 2', 'test epoch 1 3', 'test epoch 2 1', 'test epoch 2 2', 'test epoch 2 3'], dtype='S'), name='test', description='merge(tester 1, tester 2)', file_origin='test.file', testarg1=1, **paramstarg) assert_neo_object_is_compliant(epca1) assert_neo_object_is_compliant(epca2) assert_neo_object_is_compliant(epcatarg) epcares = epca1.merge(epca2) assert_neo_object_is_compliant(epcares) assert_same_sub_schema(epcatarg, epcares) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_segment.py0000644000175000017500000011054712273723542020174 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.segment.Segment class """ try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.segment import Segment from neo.core import (AnalogSignal, AnalogSignalArray, Block, Epoch, EpochArray, Event, EventArray, IrregularlySampledSignal, RecordingChannelGroup, Spike, SpikeTrain, Unit) from neo.io.tools import create_many_to_one_relationship from neo.test.tools import assert_neo_object_is_compliant, assert_arrays_equal class TestSegment(unittest.TestCase): def setUp(self): self.setup_analogsignals() self.setup_analogsignalarrays() self.setup_epochs() self.setup_epocharrays() self.setup_events() self.setup_eventarrays() self.setup_irregularlysampledsignals() self.setup_spikes() self.setup_spiketrains() self.setup_units() self.setup_segments() def setup_segments(self): params = {'testarg2': 'yes', 'testarg3': True} self.segment1 = Segment(name='test', description='tester 1', file_origin='test.file', testarg1=1, **params) self.segment2 = Segment(name='test', description='tester 2', file_origin='test.file', testarg1=1, **params) self.segment1.annotate(testarg1=1.1, testarg0=[1, 2, 3]) self.segment2.annotate(testarg11=1.1, testarg10=[1, 2, 3]) self.segment1.analogsignals = self.sig1 self.segment2.analogsignals = self.sig2 self.segment1.analogsignalarrays = self.sigarr1 self.segment2.analogsignalarrays = self.sigarr2 self.segment1.epochs = self.epoch1 self.segment2.epochs = self.epoch2 self.segment1.epocharrays = self.epocharr1 self.segment2.epocharrays = self.epocharr2 self.segment1.events = self.event1 self.segment2.events = self.event2 self.segment1.eventarrays = self.eventarr1 self.segment2.eventarrays = self.eventarr2 self.segment1.irregularlysampledsignals = self.irsig1 self.segment2.irregularlysampledsignals = self.irsig2 self.segment1.spikes = self.spike1 self.segment2.spikes = self.spike2 self.segment1.spiketrains = self.train1 self.segment2.spiketrains = self.train2 create_many_to_one_relationship(self.segment1) create_many_to_one_relationship(self.segment2) def setup_units(self): params = {'testarg2': 'yes', 'testarg3': True} self.unit1 = Unit(name='test', description='tester 1', file_origin='test.file', channel_indexes=np.array([1]), testarg1=1, **params) self.unit2 = Unit(name='test', description='tester 2', file_origin='test.file', channel_indexes=np.array([2]), testarg1=1, **params) self.unit1.annotate(testarg1=1.1, testarg0=[1, 2, 3]) self.unit2.annotate(testarg11=1.1, testarg10=[1, 2, 3]) self.unit1train = [self.train1[0], self.train2[1]] self.unit2train = [self.train1[1], self.train2[0]] self.unit1.spiketrains = self.unit1train self.unit2.spiketrains = self.unit2train self.unit1spike = [self.spike1[0], self.spike2[1]] self.unit2spike = [self.spike1[1], self.spike2[0]] self.unit1.spikes = self.unit1spike self.unit2.spikes = self.unit2spike create_many_to_one_relationship(self.unit1) create_many_to_one_relationship(self.unit2) def setup_analogsignals(self): signame11 = 'analogsignal 1 1' signame12 = 'analogsignal 1 2' signame21 = 'analogsignal 2 1' signame22 = 'analogsignal 2 2' sigdata11 = np.arange(0, 10) * pq.mV sigdata12 = np.arange(10, 20) * pq.mV sigdata21 = np.arange(20, 30) * pq.V sigdata22 = np.arange(30, 40) * pq.V self.signames1 = [signame11, signame12] self.signames2 = [signame21, signame22] self.signames = [signame11, signame12, signame21, signame22] sig11 = AnalogSignal(sigdata11, name=signame11, channel_index=1, sampling_rate=1*pq.Hz) sig12 = AnalogSignal(sigdata12, name=signame12, channel_index=2, sampling_rate=1*pq.Hz) sig21 = AnalogSignal(sigdata21, name=signame21, channel_index=1, sampling_rate=1*pq.Hz) sig22 = AnalogSignal(sigdata22, name=signame22, channel_index=2, sampling_rate=1*pq.Hz) self.sig1 = [sig11, sig12] self.sig2 = [sig21, sig22] self.sig = [sig11, sig12, sig21, sig22] self.chan1sig = [self.sig1[0], self.sig2[0]] self.chan2sig = [self.sig1[1], self.sig2[1]] def setup_analogsignalarrays(self): sigarrname11 = 'analogsignalarray 1 1' sigarrname12 = 'analogsignalarray 1 2' sigarrname21 = 'analogsignalarray 2 1' sigarrname22 = 'analogsignalarray 2 2' sigarrdata11 = np.arange(0, 10).reshape(5, 2) * pq.mV sigarrdata12 = np.arange(10, 20).reshape(5, 2) * pq.mV sigarrdata21 = np.arange(20, 30).reshape(5, 2) * pq.V sigarrdata22 = np.arange(30, 40).reshape(5, 2) * pq.V sigarrdata112 = np.hstack([sigarrdata11, sigarrdata11]) * pq.mV self.sigarrnames1 = [sigarrname11, sigarrname12] self.sigarrnames2 = [sigarrname21, sigarrname22, sigarrname11] self.sigarrnames = [sigarrname11, sigarrname12, sigarrname21, sigarrname22] sigarr11 = AnalogSignalArray(sigarrdata11, name=sigarrname11, sampling_rate=1*pq.Hz, channel_index=np.array([1, 2])) sigarr12 = AnalogSignalArray(sigarrdata12, name=sigarrname12, sampling_rate=1*pq.Hz, channel_index=np.array([2, 1])) sigarr21 = AnalogSignalArray(sigarrdata21, name=sigarrname21, sampling_rate=1*pq.Hz, channel_index=np.array([1, 2])) sigarr22 = AnalogSignalArray(sigarrdata22, name=sigarrname22, sampling_rate=1*pq.Hz, channel_index=np.array([2, 1])) sigarr23 = AnalogSignalArray(sigarrdata11, name=sigarrname11, sampling_rate=1*pq.Hz, channel_index=np.array([1, 2])) sigarr112 = AnalogSignalArray(sigarrdata112, name=sigarrname11, sampling_rate=1*pq.Hz, channel_index=np.array([1, 2])) self.sigarr1 = [sigarr11, sigarr12] self.sigarr2 = [sigarr21, sigarr22, sigarr23] self.sigarr = [sigarr112, sigarr12, sigarr21, sigarr22] self.chan1sigarr1 = [sigarr11[:, 0:1], sigarr12[:, 1:2]] self.chan2sigarr1 = [sigarr11[:, 1:2], sigarr12[:, 0:1]] self.chan1sigarr2 = [sigarr21[:, 0:1], sigarr22[:, 1:2], sigarr23[:, 0:1]] self.chan2sigarr2 = [sigarr21[:, 1:2], sigarr22[:, 0:1], sigarr23[:, 0:1]] def setup_epochs(self): epochname11 = 'epoch 1 1' epochname12 = 'epoch 1 2' epochname21 = 'epoch 2 1' epochname22 = 'epoch 2 2' epochtime11 = 10 * pq.ms epochtime12 = 20 * pq.ms epochtime21 = 30 * pq.s epochtime22 = 40 * pq.s epochdur11 = 11 * pq.s epochdur12 = 21 * pq.s epochdur21 = 31 * pq.ms epochdur22 = 41 * pq.ms self.epochnames1 = [epochname11, epochname12] self.epochnames2 = [epochname21, epochname22] self.epochnames = [epochname11, epochname12, epochname21, epochname22] epoch11 = Epoch(epochtime11, epochdur11, label=epochname11, name=epochname11, channel_index=1, testattr=True) epoch12 = Epoch(epochtime12, epochdur12, label=epochname12, name=epochname12, channel_index=2, testattr=False) epoch21 = Epoch(epochtime21, epochdur21, label=epochname21, name=epochname21, channel_index=1) epoch22 = Epoch(epochtime22, epochdur22, label=epochname22, name=epochname22, channel_index=2) self.epoch1 = [epoch11, epoch12] self.epoch2 = [epoch21, epoch22] self.epoch = [epoch11, epoch12, epoch21, epoch22] def setup_epocharrays(self): epocharrname11 = 'epocharr 1 1' epocharrname12 = 'epocharr 1 2' epocharrname21 = 'epocharr 2 1' epocharrname22 = 'epocharr 2 2' epocharrtime11 = np.arange(0, 10) * pq.ms epocharrtime12 = np.arange(10, 20) * pq.ms epocharrtime21 = np.arange(20, 30) * pq.s epocharrtime22 = np.arange(30, 40) * pq.s epocharrdur11 = np.arange(1, 11) * pq.s epocharrdur12 = np.arange(11, 21) * pq.s epocharrdur21 = np.arange(21, 31) * pq.ms epocharrdur22 = np.arange(31, 41) * pq.ms self.epocharrnames1 = [epocharrname11, epocharrname12] self.epocharrnames2 = [epocharrname21, epocharrname22] self.epocharrnames = [epocharrname11, epocharrname12, epocharrname21, epocharrname22] epocharr11 = EpochArray(epocharrtime11, epocharrdur11, label=epocharrname11, name=epocharrname11) epocharr12 = EpochArray(epocharrtime12, epocharrdur12, label=epocharrname12, name=epocharrname12) epocharr21 = EpochArray(epocharrtime21, epocharrdur21, label=epocharrname21, name=epocharrname21) epocharr22 = EpochArray(epocharrtime22, epocharrdur22, label=epocharrname22, name=epocharrname22) self.epocharr1 = [epocharr11, epocharr12] self.epocharr2 = [epocharr21, epocharr22] self.epocharr = [epocharr11, epocharr12, epocharr21, epocharr22] def setup_events(self): eventname11 = 'event 1 1' eventname12 = 'event 1 2' eventname21 = 'event 2 1' eventname22 = 'event 2 2' eventtime11 = 10 * pq.ms eventtime12 = 20 * pq.ms eventtime21 = 30 * pq.s eventtime22 = 40 * pq.s self.eventnames1 = [eventname11, eventname12] self.eventnames2 = [eventname21, eventname22] self.eventnames = [eventname11, eventname12, eventname21, eventname22] params1 = {'testattr': True} params2 = {'testattr': 5} event11 = Event(eventtime11, label=eventname11, name=eventname11, **params1) event12 = Event(eventtime12, label=eventname12, name=eventname12, **params2) event21 = Event(eventtime21, label=eventname21, name=eventname21) event22 = Event(eventtime22, label=eventname22, name=eventname22) self.event1 = [event11, event12] self.event2 = [event21, event22] self.event = [event11, event12, event21, event22] def setup_eventarrays(self): eventarrname11 = 'eventarr 1 1' eventarrname12 = 'eventarr 1 2' eventarrname21 = 'eventarr 2 1' eventarrname22 = 'eventarr 2 2' eventarrtime11 = np.arange(0, 10) * pq.ms eventarrtime12 = np.arange(10, 20) * pq.ms eventarrtime21 = np.arange(20, 30) * pq.s eventarrtime22 = np.arange(30, 40) * pq.s self.eventarrnames1 = [eventarrname11, eventarrname12] self.eventarrnames2 = [eventarrname21, eventarrname22] self.eventarrnames = [eventarrname11, eventarrname12, eventarrname21, eventarrname22] eventarr11 = EventArray(eventarrtime11, label=eventarrname11, name=eventarrname11) eventarr12 = EventArray(eventarrtime12, label=eventarrname12, name=eventarrname12) eventarr21 = EventArray(eventarrtime21, label=eventarrname21, name=eventarrname21) eventarr22 = EventArray(eventarrtime22, label=eventarrname22, name=eventarrname22) self.eventarr1 = [eventarr11, eventarr12] self.eventarr2 = [eventarr21, eventarr22] self.eventarr = [eventarr11, eventarr12, eventarr21, eventarr22] def setup_irregularlysampledsignals(self): irsigname11 = 'irregularsignal 1 1' irsigname12 = 'irregularsignal 1 2' irsigname21 = 'irregularsignal 2 1' irsigname22 = 'irregularsignal 2 2' irsigdata11 = np.arange(0, 10) * pq.mA irsigdata12 = np.arange(10, 20) * pq.mA irsigdata21 = np.arange(20, 30) * pq.A irsigdata22 = np.arange(30, 40) * pq.A irsigtimes11 = np.arange(0, 10) * pq.ms irsigtimes12 = np.arange(10, 20) * pq.ms irsigtimes21 = np.arange(20, 30) * pq.s irsigtimes22 = np.arange(30, 40) * pq.s self.irsignames1 = [irsigname11, irsigname12] self.irsignames2 = [irsigname21, irsigname22] self.irsignames = [irsigname11, irsigname12, irsigname21, irsigname22] irsig11 = IrregularlySampledSignal(irsigtimes11, irsigdata11, name=irsigname11) irsig12 = IrregularlySampledSignal(irsigtimes12, irsigdata12, name=irsigname12) irsig21 = IrregularlySampledSignal(irsigtimes21, irsigdata21, name=irsigname21) irsig22 = IrregularlySampledSignal(irsigtimes22, irsigdata22, name=irsigname22) self.irsig1 = [irsig11, irsig12] self.irsig2 = [irsig21, irsig22] self.irsig = [irsig11, irsig12, irsig21, irsig22] def setup_spikes(self): spikename11 = 'spike 1 1' spikename12 = 'spike 1 2' spikename21 = 'spike 2 1' spikename22 = 'spike 2 2' spikedata11 = 10 * pq.ms spikedata12 = 20 * pq.ms spikedata21 = 30 * pq.s spikedata22 = 40 * pq.s self.spikenames1 = [spikename11, spikename12] self.spikenames2 = [spikename21, spikename22] self.spikenames = [spikename11, spikename12, spikename21, spikename22] spike11 = Spike(spikedata11, t_stop=100*pq.s, name=spikename11) spike12 = Spike(spikedata12, t_stop=100*pq.s, name=spikename12) spike21 = Spike(spikedata21, t_stop=100*pq.s, name=spikename21) spike22 = Spike(spikedata22, t_stop=100*pq.s, name=spikename22) self.spike1 = [spike11, spike12] self.spike2 = [spike21, spike22] self.spike = [spike11, spike12, spike21, spike22] def setup_spiketrains(self): trainname11 = 'spiketrain 1 1' trainname12 = 'spiketrain 1 2' trainname21 = 'spiketrain 2 1' trainname22 = 'spiketrain 2 2' traindata11 = np.arange(0, 10) * pq.ms traindata12 = np.arange(10, 20) * pq.ms traindata21 = np.arange(20, 30) * pq.s traindata22 = np.arange(30, 40) * pq.s self.trainnames1 = [trainname11, trainname12] self.trainnames2 = [trainname21, trainname22] self.trainnames = [trainname11, trainname12, trainname21, trainname22] train11 = SpikeTrain(traindata11, t_stop=100*pq.s, name=trainname11) train12 = SpikeTrain(traindata12, t_stop=100*pq.s, name=trainname12) train21 = SpikeTrain(traindata21, t_stop=100*pq.s, name=trainname21) train22 = SpikeTrain(traindata22, t_stop=100*pq.s, name=trainname22) self.train1 = [train11, train12] self.train2 = [train21, train22] self.train = [train11, train12, train21, train22] def test_init(self): seg = Segment(name='a segment', index=3) assert_neo_object_is_compliant(seg) self.assertEqual(seg.name, 'a segment') self.assertEqual(seg.file_origin, None) self.assertEqual(seg.index, 3) def test__construct_subsegment_by_unit(self): nb_seg = 3 nb_unit = 7 unit_with_sig = np.array([0, 2, 5]) signal_types = ['Vm', 'Conductances'] sig_len = 100 #recordingchannelgroups rcgs = [RecordingChannelGroup(name='Vm', channel_indexes=unit_with_sig), RecordingChannelGroup(name='Conductance', channel_indexes=unit_with_sig)] # Unit all_unit = [] for u in range(nb_unit): un = Unit(name='Unit #%d' % u, channel_indexes=np.array([u])) assert_neo_object_is_compliant(un) all_unit.append(un) blk = Block() blk.recordingchannelgroups = rcgs for s in range(nb_seg): seg = Segment(name='Simulation %s' % s) for j in range(nb_unit): st = SpikeTrain([1, 2, 3], units='ms', t_start=0., t_stop=10) st.unit = all_unit[j] for t in signal_types: anasigarr = AnalogSignalArray(np.zeros((sig_len, len(unit_with_sig))), units='nA', sampling_rate=1000.*pq.Hz, channel_indexes=unit_with_sig) seg.analogsignalarrays.append(anasigarr) create_many_to_one_relationship(blk) for unit in all_unit: assert_neo_object_is_compliant(unit) for rcg in rcgs: assert_neo_object_is_compliant(rcg) assert_neo_object_is_compliant(blk) # what you want newseg = seg.construct_subsegment_by_unit(all_unit[:4]) assert_neo_object_is_compliant(newseg) def test_segment_creation(self): assert_neo_object_is_compliant(self.segment1) assert_neo_object_is_compliant(self.segment2) assert_neo_object_is_compliant(self.unit1) assert_neo_object_is_compliant(self.unit2) self.assertEqual(self.segment1.name, 'test') self.assertEqual(self.segment2.name, 'test') self.assertEqual(self.segment1.description, 'tester 1') self.assertEqual(self.segment2.description, 'tester 2') self.assertEqual(self.segment1.file_origin, 'test.file') self.assertEqual(self.segment2.file_origin, 'test.file') self.assertEqual(self.segment1.annotations['testarg0'], [1, 2, 3]) self.assertEqual(self.segment2.annotations['testarg10'], [1, 2, 3]) self.assertEqual(self.segment1.annotations['testarg1'], 1.1) self.assertEqual(self.segment2.annotations['testarg1'], 1) self.assertEqual(self.segment2.annotations['testarg11'], 1.1) self.assertEqual(self.segment1.annotations['testarg2'], 'yes') self.assertEqual(self.segment2.annotations['testarg2'], 'yes') self.assertTrue(self.segment1.annotations['testarg3']) self.assertTrue(self.segment2.annotations['testarg3']) self.assertTrue(hasattr(self.segment1, 'analogsignals')) self.assertTrue(hasattr(self.segment2, 'analogsignals')) self.assertEqual(len(self.segment1.analogsignals), 2) self.assertEqual(len(self.segment2.analogsignals), 2) for res, targ in zip(self.segment1.analogsignals, self.sig1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.analogsignals, self.sig2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'analogsignalarrays')) self.assertTrue(hasattr(self.segment2, 'analogsignalarrays')) self.assertEqual(len(self.segment1.analogsignalarrays), 2) self.assertEqual(len(self.segment2.analogsignalarrays), 3) for res, targ in zip(self.segment1.analogsignalarrays, self.sigarr1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.analogsignalarrays, self.sigarr2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'epochs')) self.assertTrue(hasattr(self.segment2, 'epochs')) self.assertEqual(len(self.segment1.epochs), 2) self.assertEqual(len(self.segment2.epochs), 2) for res, targ in zip(self.segment1.epochs, self.epoch1): self.assertEqual(res.time, targ.time) self.assertEqual(res.duration, targ.duration) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.epochs, self.epoch2): self.assertEqual(res.time, targ.time) self.assertEqual(res.duration, targ.duration) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'epocharrays')) self.assertTrue(hasattr(self.segment2, 'epocharrays')) self.assertEqual(len(self.segment1.epocharrays), 2) self.assertEqual(len(self.segment2.epocharrays), 2) for res, targ in zip(self.segment1.epocharrays, self.epocharr1): assert_arrays_equal(res.times, targ.times) assert_arrays_equal(res.durations, targ.durations) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.epocharrays, self.epocharr2): assert_arrays_equal(res.times, targ.times) assert_arrays_equal(res.durations, targ.durations) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'events')) self.assertTrue(hasattr(self.segment2, 'events')) self.assertEqual(len(self.segment1.events), 2) self.assertEqual(len(self.segment2.events), 2) for res, targ in zip(self.segment1.events, self.event1): self.assertEqual(res.time, targ.time) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.events, self.event2): self.assertEqual(res.time, targ.time) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'eventarrays')) self.assertTrue(hasattr(self.segment2, 'eventarrays')) self.assertEqual(len(self.segment1.eventarrays), 2) self.assertEqual(len(self.segment2.eventarrays), 2) for res, targ in zip(self.segment1.eventarrays, self.eventarr1): assert_arrays_equal(res.times, targ.times) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.eventarrays, self.eventarr2): assert_arrays_equal(res.times, targ.times) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'irregularlysampledsignals')) self.assertTrue(hasattr(self.segment2, 'irregularlysampledsignals')) self.assertEqual(len(self.segment1.irregularlysampledsignals), 2) self.assertEqual(len(self.segment2.irregularlysampledsignals), 2) for res, targ in zip(self.segment1.irregularlysampledsignals, self.irsig1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.irregularlysampledsignals, self.irsig2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'spikes')) self.assertTrue(hasattr(self.segment2, 'spikes')) self.assertEqual(len(self.segment1.spikes), 2) self.assertEqual(len(self.segment2.spikes), 2) for res, targ in zip(self.segment1.spikes, self.spike1): self.assertEqual(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.spikes, self.spike2): self.assertEqual(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'spiketrains')) self.assertTrue(hasattr(self.segment2, 'spiketrains')) self.assertEqual(len(self.segment1.spiketrains), 2) self.assertEqual(len(self.segment2.spiketrains), 2) for res, targ in zip(self.segment1.spiketrains, self.train1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.spiketrains, self.train2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) def test_segment_merge(self): self.segment1.merge(self.segment2) create_many_to_one_relationship(self.segment1, force=True) assert_neo_object_is_compliant(self.segment1) self.assertEqual(self.segment1.name, 'test') self.assertEqual(self.segment2.name, 'test') self.assertEqual(self.segment1.description, 'tester 1') self.assertEqual(self.segment2.description, 'tester 2') self.assertEqual(self.segment1.file_origin, 'test.file') self.assertEqual(self.segment2.file_origin, 'test.file') self.assertEqual(self.segment1.annotations['testarg0'], [1, 2, 3]) self.assertEqual(self.segment2.annotations['testarg10'], [1, 2, 3]) self.assertEqual(self.segment1.annotations['testarg1'], 1.1) self.assertEqual(self.segment2.annotations['testarg1'], 1) self.assertEqual(self.segment2.annotations['testarg11'], 1.1) self.assertEqual(self.segment1.annotations['testarg2'], 'yes') self.assertEqual(self.segment2.annotations['testarg2'], 'yes') self.assertTrue(self.segment1.annotations['testarg3']) self.assertTrue(self.segment2.annotations['testarg3']) self.assertTrue(hasattr(self.segment1, 'analogsignals')) self.assertTrue(hasattr(self.segment2, 'analogsignals')) self.assertEqual(len(self.segment1.analogsignals), 4) self.assertEqual(len(self.segment2.analogsignals), 2) for res, targ in zip(self.segment1.analogsignals, self.sig): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.analogsignals, self.sig2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'analogsignalarrays')) self.assertTrue(hasattr(self.segment2, 'analogsignalarrays')) self.assertEqual(len(self.segment1.analogsignalarrays), 4) self.assertEqual(len(self.segment2.analogsignalarrays), 3) for res, targ in zip(self.segment1.analogsignalarrays, self.sigarr): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.analogsignalarrays, self.sigarr2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'epochs')) self.assertTrue(hasattr(self.segment2, 'epochs')) self.assertEqual(len(self.segment1.epochs), 4) self.assertEqual(len(self.segment2.epochs), 2) for res, targ in zip(self.segment1.epochs, self.epoch): self.assertEqual(res.time, targ.time) self.assertEqual(res.duration, targ.duration) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.epochs, self.epoch2): self.assertEqual(res.time, targ.time) self.assertEqual(res.duration, targ.duration) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'epocharrays')) self.assertTrue(hasattr(self.segment2, 'epocharrays')) self.assertEqual(len(self.segment1.epocharrays), 4) self.assertEqual(len(self.segment2.epocharrays), 2) for res, targ in zip(self.segment1.epocharrays, self.epocharr): assert_arrays_equal(res.times, targ.times) assert_arrays_equal(res.durations, targ.durations) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.epocharrays, self.epocharr2): assert_arrays_equal(res.times, targ.times) assert_arrays_equal(res.durations, targ.durations) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'events')) self.assertTrue(hasattr(self.segment2, 'events')) self.assertEqual(len(self.segment1.events), 4) self.assertEqual(len(self.segment2.events), 2) for res, targ in zip(self.segment1.events, self.event): self.assertEqual(res.time, targ.time) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.events, self.event2): self.assertEqual(res.time, targ.time) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'eventarrays')) self.assertTrue(hasattr(self.segment2, 'eventarrays')) self.assertEqual(len(self.segment1.eventarrays), 4) self.assertEqual(len(self.segment2.eventarrays), 2) for res, targ in zip(self.segment1.eventarrays, self.eventarr): assert_arrays_equal(res.times, targ.times) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.eventarrays, self.eventarr2): assert_arrays_equal(res.times, targ.times) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'irregularlysampledsignals')) self.assertTrue(hasattr(self.segment2, 'irregularlysampledsignals')) self.assertEqual(len(self.segment1.irregularlysampledsignals), 4) self.assertEqual(len(self.segment2.irregularlysampledsignals), 2) for res, targ in zip(self.segment1.irregularlysampledsignals, self.irsig): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.irregularlysampledsignals, self.irsig2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'spikes')) self.assertTrue(hasattr(self.segment2, 'spikes')) self.assertEqual(len(self.segment1.spikes), 4) self.assertEqual(len(self.segment2.spikes), 2) for res, targ in zip(self.segment1.spikes, self.spike): self.assertEqual(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.spikes, self.spike2): self.assertEqual(res, targ) self.assertEqual(res.name, targ.name) self.assertTrue(hasattr(self.segment1, 'spiketrains')) self.assertTrue(hasattr(self.segment2, 'spiketrains')) self.assertEqual(len(self.segment1.spiketrains), 4) self.assertEqual(len(self.segment2.spiketrains), 2) for res, targ in zip(self.segment1.spiketrains, self.train): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(self.segment2.spiketrains, self.train2): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) def test_segment_all_data(self): result1 = self.segment1.all_data targs = (self.epoch1 + self.epocharr1 + self.event1 + self.eventarr1 + self.sig1 + self.sigarr1 + self.irsig1 + self.spike1 + self.train1) for res, targ in zip(result1, targs): if hasattr(res, 'ndim') and res.ndim: assert_arrays_equal(res, targ) else: self.assertEqual(res, targ) self.assertEqual(res.name, targ.name) def test_segment_take_spikes_by_unit(self): result1 = self.segment1.take_spikes_by_unit() result21 = self.segment1.take_spikes_by_unit([self.unit1]) result22 = self.segment1.take_spikes_by_unit([self.unit2]) self.assertEqual(result1, []) for res, targ in zip(result21, self.unit1spike): self.assertEqual(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(result22, self.unit2spike): self.assertEqual(res, targ) self.assertEqual(res.name, targ.name) def test_segment_take_spiketrains_by_unit(self): result1 = self.segment1.take_spiketrains_by_unit() result21 = self.segment1.take_spiketrains_by_unit([self.unit1]) result22 = self.segment1.take_spiketrains_by_unit([self.unit2]) self.assertEqual(result1, []) for res, targ in zip(result21, self.unit1train): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(result22, self.unit2train): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) def test_segment_take_analogsignal_by_unit(self): result1 = self.segment1.take_analogsignal_by_unit() result21 = self.segment1.take_analogsignal_by_unit([self.unit1]) result22 = self.segment1.take_analogsignal_by_unit([self.unit2]) self.assertEqual(result1, []) for res, targ in zip(result21, self.chan1sig): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(result22, self.chan2sig): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) def test_segment_take_analogsignal_by_channelindex(self): result1 = self.segment1.take_analogsignal_by_channelindex() result21 = self.segment1.take_analogsignal_by_channelindex([1]) result22 = self.segment1.take_analogsignal_by_channelindex([2]) self.assertEqual(result1, []) for res, targ in zip(result21, self.chan1sig): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(result22, self.chan2sig): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) def test_segment_take_slice_of_analogsignalarray_by_unit(self): segment = self.segment1 unit1 = self.unit1 unit2 = self.unit2 result1 = segment.take_slice_of_analogsignalarray_by_unit() result21 = segment.take_slice_of_analogsignalarray_by_unit([unit1]) result22 = segment.take_slice_of_analogsignalarray_by_unit([unit2]) self.assertEqual(result1, []) for res, targ in zip(result21, self.chan1sigarr1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(result22, self.chan2sigarr1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) def test_segment_take_slice_of_analogsignalarray_by_channelindex(self): segment = self.segment1 result1 = segment.take_slice_of_analogsignalarray_by_channelindex() result21 = segment.take_slice_of_analogsignalarray_by_channelindex([1]) result22 = segment.take_slice_of_analogsignalarray_by_channelindex([2]) self.assertEqual(result1, []) for res, targ in zip(result21, self.chan1sigarr1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) for res, targ in zip(result22, self.chan2sigarr1): assert_arrays_equal(res, targ) self.assertEqual(res.name, targ.name) def test_segment_size(self): result1 = self.segment1.size() targ1 = {"epochs": 2, "events": 2, "analogsignals": 2, "irregularlysampledsignals": 2, "spikes": 2, "spiketrains": 2, "epocharrays": 2, "eventarrays": 2, "analogsignalarrays": 2} self.assertEqual(result1, targ1) def test_segment_filter(self): result1 = self.segment1.filter() result2 = self.segment1.filter(name='analogsignal 1 1') result3 = self.segment1.filter(testattr=True) self.assertEqual(result1, []) self.assertEqual(len(result2), 1) assert_arrays_equal(result2[0], self.sig1[0]) self.assertEqual(len(result3), 2) self.assertEqual(result3[0], self.epoch1[0]) self.assertEqual(result3[1], self.event1[0]) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_event.py0000644000175000017500000000321012273723542017637 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.event.Event class """ try: import unittest2 as unittest except ImportError: import unittest import quantities as pq from neo.core.event import Event from neo.test.tools import assert_neo_object_is_compliant class TestEvent(unittest.TestCase): def test_Event_creation(self): params = {'testarg2': 'yes', 'testarg3': True} evt = Event(1.5*pq.ms, label='test epoch', name='test', description='tester', file_origin='test.file', testarg1=1, **params) evt.annotate(testarg1=1.1, testarg0=[1, 2, 3]) assert_neo_object_is_compliant(evt) self.assertEqual(evt.time, 1.5*pq.ms) self.assertEqual(evt.label, 'test epoch') self.assertEqual(evt.name, 'test') self.assertEqual(evt.description, 'tester') self.assertEqual(evt.file_origin, 'test.file') self.assertEqual(evt.annotations['testarg0'], [1, 2, 3]) self.assertEqual(evt.annotations['testarg1'], 1.1) self.assertEqual(evt.annotations['testarg2'], 'yes') self.assertTrue(evt.annotations['testarg3']) def test_epoch_merge_NotImplementedError(self): evt1 = Event(1.5*pq.ms, label='test epoch', name='test', description='tester', file_origin='test.file', testarg1=1) evt2 = Event(1.5*pq.ms, label='test epoch', name='test', description='tester', file_origin='test.file', testarg1=1) self.assertRaises(NotImplementedError, evt1.merge, evt2) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_analogsignal.py0000644000175000017500000006024212273723542021165 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.analogsignal.AnalogSignal class and related functions """ # needed for python 3 compatibility from __future__ import division import os import pickle from pprint import pformat try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.analogsignal import AnalogSignal, _get_sampling_rate from neo.test.tools import (assert_arrays_almost_equal, assert_arrays_equal, assert_neo_object_is_compliant, assert_same_sub_schema) class TestAnalogSignalConstructor(unittest.TestCase): def test__create_from_list(self): data = range(10) rate = 1000*pq.Hz signal = AnalogSignal(data, sampling_rate=rate, units="mV") assert_neo_object_is_compliant(signal) self.assertEqual(signal.t_start, 0*pq.ms) self.assertEqual(signal.t_stop, len(data)/rate) self.assertEqual(signal[9], 9000*pq.uV) def test__create_from_np_array(self): data = np.arange(10.0) rate = 1*pq.kHz signal = AnalogSignal(data, sampling_rate=rate, units="uV") assert_neo_object_is_compliant(signal) self.assertEqual(signal.t_start, 0*pq.ms) self.assertEqual(signal.t_stop, data.size/rate) self.assertEqual(signal[9], 0.009*pq.mV) def test__create_from_quantities_array(self): data = np.arange(10.0) * pq.mV rate = 5000*pq.Hz signal = AnalogSignal(data, sampling_rate=rate) assert_neo_object_is_compliant(signal) self.assertEqual(signal.t_start, 0*pq.ms) self.assertEqual(signal.t_stop, data.size/rate) self.assertEqual(signal[9], 0.009*pq.V) def test__create_from_array_no_units_ValueError(self): data = np.arange(10.0) self.assertRaises(ValueError, AnalogSignal, data, sampling_rate=1 * pq.kHz) def test__create_from_quantities_array_inconsistent_units_ValueError(self): data = np.arange(10.0) * pq.mV self.assertRaises(ValueError, AnalogSignal, data, sampling_rate=1 * pq.kHz, units="nA") def test__create_without_sampling_rate_or_period_ValueError(self): data = np.arange(10.0) * pq.mV self.assertRaises(ValueError, AnalogSignal, data) def test__create_with_None_sampling_rate_should_raise_ValueError(self): data = np.arange(10.0) * pq.mV self.assertRaises(ValueError, AnalogSignal, data, sampling_rate=None) def test__create_with_None_t_start_should_raise_ValueError(self): data = np.arange(10.0) * pq.mV rate = 5000 * pq.Hz self.assertRaises(ValueError, AnalogSignal, data, sampling_rate=rate, t_start=None) def test__create_inconsistent_sampling_rate_and_period_ValueError(self): data = np.arange(10.0) * pq.mV self.assertRaises(ValueError, AnalogSignal, data, sampling_rate=1 * pq.kHz, sampling_period=5 * pq.s) def test__create_with_copy_true_should_return_copy(self): data = np.arange(10.0) * pq.mV rate = 5000*pq.Hz signal = AnalogSignal(data, copy=True, sampling_rate=rate) data[3] = 99*pq.mV assert_neo_object_is_compliant(signal) self.assertNotEqual(signal[3], 99*pq.mV) def test__create_with_copy_false_should_return_view(self): data = np.arange(10.0) * pq.mV rate = 5000*pq.Hz signal = AnalogSignal(data, copy=False, sampling_rate=rate) data[3] = 99*pq.mV assert_neo_object_is_compliant(signal) self.assertEqual(signal[3], 99*pq.mV) def test__create_with_additional_argument(self): signal = AnalogSignal([1, 2, 3], units="mV", sampling_rate=1*pq.kHz, file_origin='crack.txt', ratname='Nicolas') assert_neo_object_is_compliant(signal) self.assertEqual(signal.annotations, {'ratname': 'Nicolas'}) # This one is universally recommended and handled by BaseNeo self.assertEqual(signal.file_origin, 'crack.txt') # signal must be 1D - should raise Exception if not 1D class TestAnalogSignalProperties(unittest.TestCase): def setUp(self): self.t_start = [0.0*pq.ms, 100*pq.ms, -200*pq.ms] self.rates = [1*pq.kHz, 420*pq.Hz, 999*pq.Hz] self.rates2 = [2*pq.kHz, 290*pq.Hz, 1111*pq.Hz] self.data = [np.arange(10.0)*pq.nA, np.arange(-100.0, 100.0, 10.0)*pq.mV, np.random.uniform(size=100)*pq.uV] self.signals = [AnalogSignal(D, sampling_rate=r, t_start=t, testattr='test') for r, D, t in zip(self.rates, self.data, self.t_start)] def test__compliant(self): for signal in self.signals: assert_neo_object_is_compliant(signal) def test__t_stop_getter(self): for i, signal in enumerate(self.signals): self.assertEqual(signal.t_stop, self.t_start[i] + self.data[i].size/self.rates[i]) def test__duration_getter(self): for signal in self.signals: self.assertAlmostEqual(signal.duration, signal.t_stop - signal.t_start, delta=1e-15) def test__sampling_rate_getter(self): for signal, rate in zip(self.signals, self.rates): self.assertEqual(signal.sampling_rate, rate) def test__sampling_period_getter(self): for signal, rate in zip(self.signals, self.rates): self.assertEqual(signal.sampling_period, 1 / rate) def test__sampling_rate_setter(self): for signal, rate in zip(self.signals, self.rates2): signal.sampling_rate = rate assert_neo_object_is_compliant(signal) self.assertEqual(signal.sampling_rate, rate) self.assertEqual(signal.sampling_period, 1 / rate) def test__sampling_period_setter(self): for signal, rate in zip(self.signals, self.rates2): signal.sampling_period = 1 / rate assert_neo_object_is_compliant(signal) self.assertEqual(signal.sampling_rate, rate) self.assertEqual(signal.sampling_period, 1 / rate) def test__sampling_rate_setter_None_ValueError(self): self.assertRaises(ValueError, setattr, self.signals[0], 'sampling_rate', None) def test__sampling_rate_setter_not_quantity_ValueError(self): self.assertRaises(ValueError, setattr, self.signals[0], 'sampling_rate', 5.5) def test__sampling_period_setter_None_ValueError(self): signal = self.signals[0] assert_neo_object_is_compliant(signal) self.assertRaises(ValueError, setattr, signal, 'sampling_period', None) def test__sampling_period_setter_not_quantity_ValueError(self): self.assertRaises(ValueError, setattr, self.signals[0], 'sampling_period', 5.5) def test__t_start_setter_None_ValueError(self): signal = self.signals[0] assert_neo_object_is_compliant(signal) self.assertRaises(ValueError, setattr, signal, 't_start', None) def test__times_getter(self): for i, signal in enumerate(self.signals): targ = np.arange(self.data[i].size) targ = targ/self.rates[i] + self.t_start[i] assert_neo_object_is_compliant(signal) assert_arrays_almost_equal(signal.times, targ, 1e-12*pq.ms) def test__pprint(self): for i, signal in enumerate(self.signals): prepr = pformat(signal) targ = '' % \ (pformat(self.data[i]), self.t_start[i], self.t_start[i] + len(self.data[i])/self.rates[i], self.rates[i]) self.assertEqual(prepr, targ) def test__duplicate_with_new_array(self): signal1 = self.signals[1] signal2 = self.signals[2] data2 = self.data[2] signal1b = signal1.duplicate_with_new_array(data2) assert_arrays_almost_equal(np.asarray(signal1b), np.asarray(signal2/1000.), 1e-12) self.assertEqual(signal1b.t_start, signal1.t_start) self.assertEqual(signal1b.sampling_rate, signal1.sampling_rate) class TestAnalogSignalArrayMethods(unittest.TestCase): def setUp(self): self.data1 = np.arange(10.0) self.data1quant = self.data1 * pq.nA self.signal1 = AnalogSignal(self.data1quant, sampling_rate=1*pq.kHz, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') def test__compliant(self): assert_neo_object_is_compliant(self.signal1) def test__slice_should_return_AnalogSignal(self): # slice result = self.signal1[3:8] self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(result.size, 5) self.assertEqual(result.sampling_period, self.signal1.sampling_period) self.assertEqual(result.sampling_rate, self.signal1.sampling_rate) self.assertEqual(result.t_start, self.signal1.t_start+3*result.sampling_period) self.assertEqual(result.t_stop, result.t_start + 5*result.sampling_period) assert_arrays_equal(result, self.data1[3:8]) # Test other attributes were copied over (in this case, defaults) self.assertEqual(result.file_origin, self.signal1.file_origin) self.assertEqual(result.name, self.signal1.name) self.assertEqual(result.description, self.signal1.description) self.assertEqual(result.annotations, self.signal1.annotations) def test__slice_should_change_sampling_period(self): result1 = self.signal1[:2] result2 = self.signal1[::2] result3 = self.signal1[1:7:2] self.assertIsInstance(result1, AnalogSignal) assert_neo_object_is_compliant(result1) self.assertEqual(result1.name, 'spam') self.assertEqual(result1.description, 'eggs') self.assertEqual(result1.file_origin, 'testfile.txt') self.assertEqual(result1.annotations, {'arg1': 'test'}) self.assertIsInstance(result2, AnalogSignal) assert_neo_object_is_compliant(result2) self.assertEqual(result2.name, 'spam') self.assertEqual(result2.description, 'eggs') self.assertEqual(result2.file_origin, 'testfile.txt') self.assertEqual(result2.annotations, {'arg1': 'test'}) self.assertIsInstance(result3, AnalogSignal) assert_neo_object_is_compliant(result3) self.assertEqual(result3.name, 'spam') self.assertEqual(result3.description, 'eggs') self.assertEqual(result3.file_origin, 'testfile.txt') self.assertEqual(result3.annotations, {'arg1': 'test'}) self.assertEqual(result1.sampling_period, self.signal1.sampling_period) self.assertEqual(result2.sampling_period, self.signal1.sampling_period * 2) self.assertEqual(result3.sampling_period, self.signal1.sampling_period * 2) assert_arrays_equal(result1, self.data1[:2]) assert_arrays_equal(result2, self.data1[::2]) assert_arrays_equal(result3, self.data1[1:7:2]) def test__getitem_should_return_single_quantity(self): result1 = self.signal1[0] result2 = self.signal1[9] self.assertIsInstance(result1, pq.Quantity) self.assertFalse(hasattr(result1, 'name')) self.assertFalse(hasattr(result1, 'description')) self.assertFalse(hasattr(result1, 'file_origin')) self.assertFalse(hasattr(result1, 'annotations')) self.assertIsInstance(result2, pq.Quantity) self.assertFalse(hasattr(result2, 'name')) self.assertFalse(hasattr(result2, 'description')) self.assertFalse(hasattr(result2, 'file_origin')) self.assertFalse(hasattr(result2, 'annotations')) self.assertEqual(result1, 0*pq.nA) self.assertEqual(result2, 9*pq.nA) def test__getitem_out_of_bounds_IndexError(self): self.assertRaises(IndexError, self.signal1.__getitem__, 10) def test_comparison_operators(self): assert_arrays_equal(self.signal1 >= 5*pq.nA, np.array([False, False, False, False, False, True, True, True, True, True])) assert_arrays_equal(self.signal1 >= 5*pq.pA, np.array([False, True, True, True, True, True, True, True, True, True])) def test__comparison_with_inconsistent_units_should_raise_Exception(self): self.assertRaises(ValueError, self.signal1.__gt__, 5*pq.mV) def test__simple_statistics(self): self.assertEqual(self.signal1.max(), 9*pq.nA) self.assertEqual(self.signal1.min(), 0*pq.nA) self.assertEqual(self.signal1.mean(), 4.5*pq.nA) def test__rescale_same(self): result = self.signal1.copy() result = result.rescale(pq.nA) self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(result.units, 1*pq.nA) assert_arrays_equal(result, self.data1) assert_same_sub_schema(result, self.signal1) def test__rescale_new(self): result = self.signal1.copy() result = result.rescale(pq.pA) self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(result.units, 1*pq.pA) assert_arrays_almost_equal(np.array(result), self.data1*1000., 1e-10) def test__rescale_new_incompatible_ValueError(self): self.assertRaises(ValueError, self.signal1.rescale, pq.mV) class TestAnalogSignalEquality(unittest.TestCase): def test__signals_with_different_data_complement_should_be_not_equal(self): signal1 = AnalogSignal(np.arange(10.0), units="mV", sampling_rate=1*pq.kHz) signal2 = AnalogSignal(np.arange(10.0), units="mV", sampling_rate=2*pq.kHz) assert_neo_object_is_compliant(signal1) assert_neo_object_is_compliant(signal2) self.assertNotEqual(signal1, signal2) class TestAnalogSignalCombination(unittest.TestCase): def setUp(self): self.data1 = np.arange(10.0) self.data1quant = self.data1 * pq.mV self.signal1 = AnalogSignal(self.data1quant, sampling_rate=1*pq.kHz, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') def test__compliant(self): assert_neo_object_is_compliant(self.signal1) self.assertEqual(self.signal1.name, 'spam') self.assertEqual(self.signal1.description, 'eggs') self.assertEqual(self.signal1.file_origin, 'testfile.txt') self.assertEqual(self.signal1.annotations, {'arg1': 'test'}) def test__add_const_quantity_should_preserve_data_complement(self): result = self.signal1 + 0.065*pq.V self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) assert_arrays_equal(result, self.data1 + 65) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], 74*pq.mV) self.assertEqual(self.signal1.t_start, result.t_start) self.assertEqual(self.signal1.sampling_rate, result.sampling_rate) def test__add_quantity_should_preserve_data_complement(self): data2 = np.arange(10.0, 20.0) data2quant = data2*pq.mV result = self.signal1 + data2quant self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) targ = AnalogSignal(np.arange(10.0, 30.0, 2.0), units="mV", sampling_rate=1*pq.kHz, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') assert_neo_object_is_compliant(targ) assert_arrays_equal(result, targ) assert_same_sub_schema(result, targ) def test__add_two_consistent_signals_should_preserve_data_complement(self): data2 = np.arange(10.0, 20.0) data2quant = data2*pq.mV signal2 = AnalogSignal(data2quant, sampling_rate=1*pq.kHz) assert_neo_object_is_compliant(signal2) result = self.signal1 + signal2 self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) targ = AnalogSignal(np.arange(10.0, 30.0, 2.0), units="mV", sampling_rate=1*pq.kHz, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') assert_neo_object_is_compliant(targ) assert_arrays_equal(result, targ) assert_same_sub_schema(result, targ) def test__add_signals_with_inconsistent_data_complement_ValueError(self): self.signal1.t_start = 0.0*pq.ms assert_neo_object_is_compliant(self.signal1) signal2 = AnalogSignal(np.arange(10.0), units="mV", t_start=100.0*pq.ms, sampling_rate=0.5*pq.kHz) assert_neo_object_is_compliant(signal2) self.assertRaises(ValueError, self.signal1.__add__, signal2) def test__subtract_const_should_preserve_data_complement(self): result = self.signal1 - 65*pq.mV self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], -56*pq.mV) assert_arrays_equal(result, self.data1 - 65) self.assertEqual(self.signal1.sampling_rate, result.sampling_rate) def test__subtract_from_const_should_return_signal(self): result = 10*pq.mV - self.signal1 self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], 1*pq.mV) assert_arrays_equal(result, 10 - self.data1) self.assertEqual(self.signal1.sampling_rate, result.sampling_rate) def test__mult_by_const_float_should_preserve_data_complement(self): result = self.signal1*2 self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], 18*pq.mV) assert_arrays_equal(result, self.data1*2) self.assertEqual(self.signal1.sampling_rate, result.sampling_rate) def test__divide_by_const_should_preserve_data_complement(self): result = self.signal1/0.5 self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], 18*pq.mV) assert_arrays_equal(result, self.data1/0.5) self.assertEqual(self.signal1.sampling_rate, result.sampling_rate) def test__merge_NotImplementedError(self): self.assertRaises(NotImplementedError, self.signal1.merge, self.signal1) class TestAnalogSignalFunctions(unittest.TestCase): def test__pickle(self): signal1 = AnalogSignal([1, 2, 3, 4], sampling_period=1*pq.ms, units=pq.S, channel_index=42) signal1.annotations['index'] = 2 fobj = open('./pickle', 'wb') pickle.dump(signal1, fobj) fobj.close() fobj = open('./pickle', 'rb') try: signal2 = pickle.load(fobj) except ValueError: signal2 = None assert_arrays_equal(signal1, signal2) self.assertEqual(signal1.channel_index, signal2.channel_index, 42) fobj.close() os.remove('./pickle') class TestAnalogSignalSampling(unittest.TestCase): def test___get_sampling_rate__period_none_rate_none_ValueError(self): sampling_rate = None sampling_period = None self.assertRaises(ValueError, _get_sampling_rate, sampling_rate, sampling_period) def test___get_sampling_rate__period_quant_rate_none(self): sampling_rate = None sampling_period = pq.Quantity(10., units=pq.s) targ_rate = 1/sampling_period out_rate = _get_sampling_rate(sampling_rate, sampling_period) self.assertEqual(targ_rate, out_rate) def test___get_sampling_rate__period_none_rate_quant(self): sampling_rate = pq.Quantity(10., units=pq.Hz) sampling_period = None targ_rate = sampling_rate out_rate = _get_sampling_rate(sampling_rate, sampling_period) self.assertEqual(targ_rate, out_rate) def test___get_sampling_rate__period_rate_equivalent(self): sampling_rate = pq.Quantity(10., units=pq.Hz) sampling_period = pq.Quantity(0.1, units=pq.s) targ_rate = sampling_rate out_rate = _get_sampling_rate(sampling_rate, sampling_period) self.assertEqual(targ_rate, out_rate) def test___get_sampling_rate__period_rate_not_equivalent_ValueError(self): sampling_rate = pq.Quantity(10., units=pq.Hz) sampling_period = pq.Quantity(10, units=pq.s) self.assertRaises(ValueError, _get_sampling_rate, sampling_rate, sampling_period) def test___get_sampling_rate__period_none_rate_float_TypeError(self): sampling_rate = 10. sampling_period = None self.assertRaises(TypeError, _get_sampling_rate, sampling_rate, sampling_period) def test___get_sampling_rate__period_array_rate_none_TypeError(self): sampling_rate = None sampling_period = np.array(10.) self.assertRaises(TypeError, _get_sampling_rate, sampling_rate, sampling_period) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_spiketrain.py0000644000175000017500000020671112273723542020702 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.spiketrain.SpikeTrain class and related functions """ # needed for python 3 compatibility from __future__ import absolute_import import sys try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.spiketrain import (check_has_dimensions_time, SpikeTrain, _check_time_in_range, _new_spiketrain) from neo.test.tools import assert_arrays_equal, assert_neo_object_is_compliant class Testcheck_has_dimensions_time(unittest.TestCase): def test__check_has_dimensions_time(self): a = np.arange(3) * pq.ms b = np.arange(3) * pq.mV c = np.arange(3) * pq.mA d = np.arange(3) * pq.minute check_has_dimensions_time(a) self.assertRaises(ValueError, check_has_dimensions_time, b) self.assertRaises(ValueError, check_has_dimensions_time, c) check_has_dimensions_time(d) self.assertRaises(ValueError, check_has_dimensions_time, a, b, c, d) class Testcheck_time_in_range(unittest.TestCase): def test__check_time_in_range_empty_array(self): value = np.array([]) t_start = 0*pq.s t_stop = 10*pq.s _check_time_in_range(value, t_start=t_start, t_stop=t_stop) _check_time_in_range(value, t_start=t_start, t_stop=t_stop, view=False) _check_time_in_range(value, t_start=t_start, t_stop=t_stop, view=True) def test__check_time_in_range_exact(self): value = np.array([0., 5., 10.])*pq.s t_start = 0.*pq.s t_stop = 10.*pq.s _check_time_in_range(value, t_start=t_start, t_stop=t_stop) _check_time_in_range(value, t_start=t_start, t_stop=t_stop, view=False) _check_time_in_range(value, t_start=t_start, t_stop=t_stop, view=True) def test__check_time_in_range_scale(self): value = np.array([0., 5000., 10000.])*pq.ms t_start = 0.*pq.s t_stop = 10.*pq.s _check_time_in_range(value, t_start=t_start, t_stop=t_stop) _check_time_in_range(value, t_start=t_start, t_stop=t_stop, view=False) def test__check_time_in_range_inside(self): value = np.array([0.1, 5., 9.9])*pq.s t_start = 0.*pq.s t_stop = 10.*pq.s _check_time_in_range(value, t_start=t_start, t_stop=t_stop) _check_time_in_range(value, t_start=t_start, t_stop=t_stop, view=False) _check_time_in_range(value, t_start=t_start, t_stop=t_stop, view=True) def test__check_time_in_range_below(self): value = np.array([-0.1, 5., 10.])*pq.s t_start = 0.*pq.s t_stop = 10.*pq.s self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop, view=False) self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop, view=True) def test__check_time_in_range_below_scale(self): value = np.array([-1., 5000., 10000.])*pq.ms t_start = 0.*pq.s t_stop = 10.*pq.s self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop, view=False) def test__check_time_in_range_above(self): value = np.array([0., 5., 10.1])*pq.s t_start = 0.*pq.s t_stop = 10.*pq.s self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop, view=False) self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop, view=True) def test__check_time_in_range_above_scale(self): value = np.array([0., 5000., 10001.])*pq.ms t_start = 0.*pq.s t_stop = 10.*pq.s self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop, view=False) def test__check_time_in_range_above_below(self): value = np.array([-0.1, 5., 10.1])*pq.s t_start = 0.*pq.s t_stop = 10.*pq.s self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop, view=False) self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop, view=True) def test__check_time_in_range_above_below_scale(self): value = np.array([-1., 5000., 10001.])*pq.ms t_start = 0.*pq.s t_stop = 10.*pq.s self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _check_time_in_range, value, t_start=t_start, t_stop=t_stop, view=False) class TestConstructor(unittest.TestCase): def result_spike_check(self, train, st_out, t_start_out, t_stop_out, dtype, units): assert_arrays_equal(train, st_out) assert_arrays_equal(train, train.times) assert_neo_object_is_compliant(train) self.assertEqual(train.t_start, t_start_out) self.assertEqual(train.t_start, train.times.t_start) self.assertEqual(train.t_stop, t_stop_out) self.assertEqual(train.t_stop, train.times.t_stop) self.assertEqual(train.units, units) self.assertEqual(train.units, train.times.units) self.assertEqual(train.t_start.units, units) self.assertEqual(train.t_start.units, train.times.t_start.units) self.assertEqual(train.t_stop.units, units) self.assertEqual(train.t_stop.units, train.times.t_stop.units) self.assertEqual(train.dtype, dtype) self.assertEqual(train.dtype, train.times.dtype) self.assertEqual(train.t_stop.dtype, dtype) self.assertEqual(train.t_stop.dtype, train.times.t_stop.dtype) self.assertEqual(train.t_start.dtype, dtype) self.assertEqual(train.t_start.dtype, train.times.t_start.dtype) def test__create_minimal(self): t_start = 0.0 t_stop = 10.0 train1 = SpikeTrain([]*pq.s, t_stop) train2 = _new_spiketrain(SpikeTrain, []*pq.s, t_stop) dtype = np.float64 units = 1 * pq.s t_start_out = t_start * units t_stop_out = t_stop * units st_out = [] * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_empty(self): t_start = 0.0 t_stop = 10.0 train1 = SpikeTrain([], t_start=t_start, t_stop=t_stop, units='s') train2 = _new_spiketrain(SpikeTrain, [], t_start=t_start, t_stop=t_stop, units='s') dtype = np.float64 units = 1 * pq.s t_start_out = t_start * units t_stop_out = t_stop * units st_out = [] * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_empty_no_t_start(self): t_start = 0.0 t_stop = 10.0 train1 = SpikeTrain([], t_stop=t_stop, units='s') train2 = _new_spiketrain(SpikeTrain, [], t_stop=t_stop, units='s') dtype = np.float64 units = 1 * pq.s t_start_out = t_start * units t_stop_out = t_stop * units st_out = [] * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_list(self): times = range(10) t_start = 0.0*pq.s t_stop = 10000.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units="ms") train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units="ms") dtype = np.float64 units = 1 * pq.ms t_start_out = t_start t_stop_out = t_stop st_out = times * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_list_set_dtype(self): times = range(10) t_start = 0.0*pq.s t_stop = 10000.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units="ms", dtype='f4') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units="ms", dtype='f4') dtype = np.float32 units = 1 * pq.ms t_start_out = t_start.astype(dtype) t_stop_out = t_stop.astype(dtype) st_out = pq.Quantity(times, units=units, dtype=dtype) self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_list_no_start_stop_units(self): times = range(10) t_start = 0.0 t_stop = 10000.0 train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units="ms") train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units="ms") dtype = np.float64 units = 1 * pq.ms t_start_out = t_start * units t_stop_out = t_stop * units st_out = times * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_list_no_start_stop_units_set_dtype(self): times = range(10) t_start = 0.0 t_stop = 10000.0 train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units="ms", dtype='f4') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units="ms", dtype='f4') dtype = np.float32 units = 1 * pq.ms t_start_out = pq.Quantity(t_start, units=units, dtype=dtype) t_stop_out = pq.Quantity(t_stop, units=units, dtype=dtype) st_out = pq.Quantity(times, units=units, dtype=dtype) self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_array(self): times = np.arange(10) t_start = 0.0*pq.s t_stop = 10000.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units="s") train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units="s") dtype = np.int units = 1 * pq.s t_start_out = t_start t_stop_out = t_stop st_out = times * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_array_with_dtype(self): times = np.arange(10, dtype='f4') t_start = 0.0*pq.s t_stop = 10000.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units="s") train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units="s") dtype = np.float32 units = 1 * pq.s t_start_out = t_start t_stop_out = t_stop st_out = times * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_array_set_dtype(self): times = np.arange(10) t_start = 0.0*pq.s t_stop = 10000.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units="s", dtype='f4') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units="s", dtype='f4') dtype = np.float32 units = 1 * pq.s t_start_out = t_start.astype(dtype) t_stop_out = t_stop.astype(dtype) st_out = times.astype(dtype) * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_array_no_start_stop_units(self): times = np.arange(10) t_start = 0.0 t_stop = 10000.0 train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units="s") train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units="s") dtype = np.int units = 1 * pq.s t_start_out = t_start * units t_stop_out = t_stop * units st_out = times * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_array_no_start_stop_units_with_dtype(self): times = np.arange(10, dtype='f4') t_start = 0.0 t_stop = 10000.0 train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units="s") train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units="s") dtype = np.float32 units = 1 * pq.s t_start_out = t_start * units t_stop_out = t_stop * units st_out = times * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_array_no_start_stop_units_set_dtype(self): times = np.arange(10) t_start = 0.0 t_stop = 10000.0 train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units="s", dtype='f4') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units="s", dtype='f4') dtype = np.float32 units = 1 * pq.s t_start_out = pq.Quantity(t_start, units=units, dtype=dtype) t_stop_out = pq.Quantity(t_stop, units=units, dtype=dtype) st_out = times.astype(dtype) * units self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_array(self): times = np.arange(10) * pq.ms t_start = 0.0*pq.s t_stop = 12.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop) train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop) dtype = np.float64 units = 1 * pq.ms t_start_out = t_start t_stop_out = t_stop st_out = times self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_array_with_dtype(self): times = np.arange(10, dtype='f4') * pq.ms t_start = 0.0*pq.s t_stop = 12.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop) train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop) dtype = np.float32 units = 1 * pq.ms t_start_out = t_start.astype(dtype) t_stop_out = t_stop.astype(dtype) st_out = times.astype(dtype) self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_array_set_dtype(self): times = np.arange(10) * pq.ms t_start = 0.0*pq.s t_stop = 12.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, dtype='f4') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, dtype='f4') dtype = np.float32 units = 1 * pq.ms t_start_out = t_start.astype(dtype) t_stop_out = t_stop.astype(dtype) st_out = times.astype(dtype) self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_array_no_start_stop_units(self): times = np.arange(10) * pq.ms t_start = 0.0 t_stop = 12.0 train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop) train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop) dtype = np.float64 units = 1 * pq.ms t_start_out = t_start * units t_stop_out = t_stop * units st_out = times self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_array_no_start_stop_units_with_dtype(self): times = np.arange(10, dtype='f4') * pq.ms t_start = 0.0 t_stop = 12.0 train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop) train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop) dtype = np.float32 units = 1 * pq.ms t_start_out = pq.Quantity(t_start, units=units, dtype=dtype) t_stop_out = pq.Quantity(t_stop, units=units, dtype=dtype) st_out = times.astype(dtype) self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_array_no_start_stop_units_set_dtype(self): times = np.arange(10) * pq.ms t_start = 0.0 t_stop = 12.0 train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, dtype='f4') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, dtype='f4') dtype = np.float32 units = 1 * pq.ms t_start_out = pq.Quantity(t_start, units=units, dtype=dtype) t_stop_out = pq.Quantity(t_stop, units=units, dtype=dtype) st_out = times.astype(dtype) self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_array_units(self): times = np.arange(10) * pq.ms t_start = 0.0*pq.s t_stop = 12.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units='s') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units='s') dtype = np.float64 units = 1 * pq.s t_start_out = t_start t_stop_out = t_stop st_out = times self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_array_units_with_dtype(self): times = np.arange(10, dtype='f4') * pq.ms t_start = 0.0*pq.s t_stop = 12.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units='s') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units='s') dtype = np.float32 units = 1 * pq.s t_start_out = t_start.astype(dtype) t_stop_out = t_stop.rescale(units).astype(dtype) st_out = times.rescale(units).astype(dtype) self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_array_units_set_dtype(self): times = np.arange(10) * pq.ms t_start = 0.0*pq.s t_stop = 12.0*pq.ms train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units='s', dtype='f4') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units='s', dtype='f4') dtype = np.float32 units = 1 * pq.s t_start_out = t_start.astype(dtype) t_stop_out = t_stop.rescale(units).astype(dtype) st_out = times.rescale(units).astype(dtype) self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_array_units_no_start_stop_units(self): times = np.arange(10) * pq.ms t_start = 0.0 t_stop = 12.0 train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units='s') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units='s') dtype = np.float64 units = 1 * pq.s t_start_out = pq.Quantity(t_start, units=units, dtype=dtype) t_stop_out = pq.Quantity(t_stop, units=units, dtype=dtype) st_out = times self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_quantity_units_no_start_stop_units_set_dtype(self): times = np.arange(10) * pq.ms t_start = 0.0 t_stop = 12.0 train1 = SpikeTrain(times, t_start=t_start, t_stop=t_stop, units='s', dtype='f4') train2 = _new_spiketrain(SpikeTrain, times, t_start=t_start, t_stop=t_stop, units='s', dtype='f4') dtype = np.float32 units = 1 * pq.s t_start_out = pq.Quantity(t_start, units=units, dtype=dtype) t_stop_out = pq.Quantity(t_stop, units=units, dtype=dtype) st_out = times.rescale(units).astype(dtype) self.result_spike_check(train1, st_out, t_start_out, t_stop_out, dtype, units) self.result_spike_check(train2, st_out, t_start_out, t_stop_out, dtype, units) def test__create_from_list_without_units_should_raise_ValueError(self): times = range(10) t_start = 0.0*pq.s t_stop = 10000.0*pq.ms self.assertRaises(ValueError, SpikeTrain, times, t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _new_spiketrain, SpikeTrain, times, t_start=t_start, t_stop=t_stop) def test__create_from_array_without_units_should_raise_ValueError(self): times = np.arange(10) t_start = 0.0*pq.s t_stop = 10000.0*pq.ms self.assertRaises(ValueError, SpikeTrain, times, t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _new_spiketrain, SpikeTrain, times, t_start=t_start, t_stop=t_stop) def test__create_from_array_with_incompatible_units_ValueError(self): times = np.arange(10) * pq.km t_start = 0.0*pq.s t_stop = 10000.0*pq.ms self.assertRaises(ValueError, SpikeTrain, times, t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _new_spiketrain, SpikeTrain, times, t_start=t_start, t_stop=t_stop) def test__create_with_times_outside_tstart_tstop_ValueError(self): t_start = 23 t_stop = 77 train1 = SpikeTrain(np.arange(t_start, t_stop), units='ms', t_start=t_start, t_stop=t_stop) train2 = _new_spiketrain(SpikeTrain, np.arange(t_start, t_stop), units='ms', t_start=t_start, t_stop=t_stop) assert_neo_object_is_compliant(train1) assert_neo_object_is_compliant(train2) self.assertRaises(ValueError, SpikeTrain, np.arange(t_start-5, t_stop), units='ms', t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _new_spiketrain, SpikeTrain, np.arange(t_start-5, t_stop), units='ms', t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, SpikeTrain, np.arange(t_start, t_stop+5), units='ms', t_start=t_start, t_stop=t_stop) self.assertRaises(ValueError, _new_spiketrain, SpikeTrain, np.arange(t_start, t_stop+5), units='ms', t_start=t_start, t_stop=t_stop) def test_defaults(self): # default recommended attributes train1 = SpikeTrain([3, 4, 5], units='sec', t_stop=10.0) train2 = _new_spiketrain(SpikeTrain, [3, 4, 5], units='sec', t_stop=10.0) assert_neo_object_is_compliant(train1) assert_neo_object_is_compliant(train2) self.assertEqual(train1.dtype, np.float) self.assertEqual(train2.dtype, np.float) self.assertEqual(train1.sampling_rate, 1.0 * pq.Hz) self.assertEqual(train2.sampling_rate, 1.0 * pq.Hz) self.assertEqual(train1.waveforms, None) self.assertEqual(train2.waveforms, None) self.assertEqual(train1.left_sweep, None) self.assertEqual(train2.left_sweep, None) def test_default_tstart(self): # t start defaults to zero train11 = SpikeTrain([3, 4, 5]*pq.s, t_stop=8000*pq.ms) train21 = _new_spiketrain(SpikeTrain, [3, 4, 5]*pq.s, t_stop=8000*pq.ms) assert_neo_object_is_compliant(train11) assert_neo_object_is_compliant(train21) self.assertEqual(train11.t_start, 0.*pq.s) self.assertEqual(train21.t_start, 0.*pq.s) # unless otherwise specified train12 = SpikeTrain([3, 4, 5]*pq.s, t_start=2.0, t_stop=8) train22 = _new_spiketrain(SpikeTrain, [3, 4, 5]*pq.s, t_start=2.0, t_stop=8) assert_neo_object_is_compliant(train12) assert_neo_object_is_compliant(train22) self.assertEqual(train12.t_start, 2.*pq.s) self.assertEqual(train22.t_start, 2.*pq.s) def test_tstop_units_conversion(self): train11 = SpikeTrain([3, 5, 4]*pq.s, t_stop=10) train21 = _new_spiketrain(SpikeTrain, [3, 5, 4]*pq.s, t_stop=10) assert_neo_object_is_compliant(train11) assert_neo_object_is_compliant(train21) self.assertEqual(train11.t_stop, 10.*pq.s) self.assertEqual(train21.t_stop, 10.*pq.s) train12 = SpikeTrain([3, 5, 4]*pq.s, t_stop=10000.*pq.ms) train22 = _new_spiketrain(SpikeTrain, [3, 5, 4]*pq.s, t_stop=10000.*pq.ms) assert_neo_object_is_compliant(train12) assert_neo_object_is_compliant(train22) self.assertEqual(train12.t_stop, 10.*pq.s) self.assertEqual(train22.t_stop, 10.*pq.s) train13 = SpikeTrain([3, 5, 4], units='sec', t_stop=10000.*pq.ms) train23 = _new_spiketrain(SpikeTrain, [3, 5, 4], units='sec', t_stop=10000.*pq.ms) assert_neo_object_is_compliant(train13) assert_neo_object_is_compliant(train23) self.assertEqual(train13.t_stop, 10.*pq.s) self.assertEqual(train23.t_stop, 10.*pq.s) class TestSorting(unittest.TestCase): def test_sort(self): waveforms = np.array([[[0., 1.]], [[2., 3.]], [[4., 5.]]]) * pq.mV train = SpikeTrain([3, 4, 5]*pq.s, waveforms=waveforms, name='n', t_stop=10.0) assert_neo_object_is_compliant(train) train.sort() assert_neo_object_is_compliant(train) assert_arrays_equal(train, [3, 4, 5]*pq.s) assert_arrays_equal(train.waveforms, waveforms) self.assertEqual(train.name, 'n') self.assertEqual(train.t_stop, 10.0 * pq.s) train = SpikeTrain([3, 5, 4]*pq.s, waveforms=waveforms, name='n', t_stop=10.0) assert_neo_object_is_compliant(train) train.sort() assert_neo_object_is_compliant(train) assert_arrays_equal(train, [3, 4, 5]*pq.s) assert_arrays_equal(train.waveforms, waveforms[[0, 2, 1]]) self.assertEqual(train.name, 'n') self.assertEqual(train.t_start, 0.0 * pq.s) self.assertEqual(train.t_stop, 10.0 * pq.s) class TestSlice(unittest.TestCase): def setUp(self): self.waveforms1 = np.array([[[0., 1.], [0.1, 1.1]], [[2., 3.], [2.1, 3.1]], [[4., 5.], [4.1, 5.1]]]) * pq.mV self.data1 = np.array([3, 4, 5]) self.data1quant = self.data1*pq.s self.train1 = SpikeTrain(self.data1quant, waveforms=self.waveforms1, name='n', arb='arbb', t_stop=10.0) def test_compliant(self): assert_neo_object_is_compliant(self.train1) def test_slice(self): # slice spike train, keep sliced spike times result = self.train1[1:2] assert_arrays_equal(self.train1[1:2], result) targwaveforms = np.array([[[2., 3.], [2.1, 3.1]]]) # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(self.train1.t_start, result.t_start) self.assertEqual(self.train1.t_stop, result.t_stop) # except we update the waveforms assert_arrays_equal(self.train1.waveforms[1:2], result.waveforms) assert_arrays_equal(targwaveforms, result.waveforms) def test_slice_to_end(self): # slice spike train, keep sliced spike times result = self.train1[1:] assert_arrays_equal(self.train1[1:], result) targwaveforms = np.array([[[2., 3.], [2.1, 3.1]], [[4., 5.], [4.1, 5.1]]]) * pq.mV # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(self.train1.t_start, result.t_start) self.assertEqual(self.train1.t_stop, result.t_stop) # except we update the waveforms assert_arrays_equal(self.train1.waveforms[1:], result.waveforms) assert_arrays_equal(targwaveforms, result.waveforms) def test_slice_from_beginning(self): # slice spike train, keep sliced spike times result = self.train1[:2] assert_arrays_equal(self.train1[:2], result) targwaveforms = np.array([[[0., 1.], [0.1, 1.1]], [[2., 3.], [2.1, 3.1]]]) * pq.mV # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(self.train1.t_start, result.t_start) self.assertEqual(self.train1.t_stop, result.t_stop) # except we update the waveforms assert_arrays_equal(self.train1.waveforms[:2], result.waveforms) assert_arrays_equal(targwaveforms, result.waveforms) def test_slice_negative_idxs(self): # slice spike train, keep sliced spike times result = self.train1[:-1] assert_arrays_equal(self.train1[:-1], result) targwaveforms = np.array([[[0., 1.], [0.1, 1.1]], [[2., 3.], [2.1, 3.1]]]) * pq.mV # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(self.train1.t_start, result.t_start) self.assertEqual(self.train1.t_stop, result.t_stop) # except we update the waveforms assert_arrays_equal(self.train1.waveforms[:-1], result.waveforms) assert_arrays_equal(targwaveforms, result.waveforms) class TestTimeSlice(unittest.TestCase): def setUp(self): self.waveforms1 = np.array([[[0., 1.], [0.1, 1.1]], [[2., 3.], [2.1, 3.1]], [[4., 5.], [4.1, 5.1]], [[6., 7.], [6.1, 7.1]], [[8., 9.], [8.1, 9.1]], [[10., 11.], [10.1, 11.1]]]) * pq.mV self.data1 = np.array([0.1, 0.5, 1.2, 3.3, 6.4, 7]) self.data1quant = self.data1*pq.ms self.train1 = SpikeTrain(self.data1quant, t_stop=10.0*pq.ms, waveforms=self.waveforms1) def test_compliant(self): assert_neo_object_is_compliant(self.train1) def test_time_slice_typical(self): # time_slice spike train, keep sliced spike times # this is the typical time slice falling somewhere # in the middle of spikes t_start = 0.12 * pq.ms t_stop = 3.5 * pq.ms result = self.train1.time_slice(t_start, t_stop) targ = SpikeTrain([0.5, 1.2, 3.3] * pq.ms, t_stop=3.3) assert_arrays_equal(result, targ) targwaveforms = np.array([[[2., 3.], [2.1, 3.1]], [[4., 5.], [4.1, 5.1]], [[6., 7.], [6.1, 7.1]]]) * pq.mV assert_arrays_equal(targwaveforms, result.waveforms) # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(t_start, result.t_start) self.assertEqual(t_stop, result.t_stop) def test_time_slice_differnt_units(self): # time_slice spike train, keep sliced spike times t_start = 0.00012 * pq.s t_stop = 0.0035 * pq.s result = self.train1.time_slice(t_start, t_stop) targ = SpikeTrain([0.5, 1.2, 3.3] * pq.ms, t_stop=3.3) assert_arrays_equal(result, targ) targwaveforms = np.array([[[2., 3.], [2.1, 3.1]], [[4., 5.], [4.1, 5.1]], [[6., 7.], [6.1, 7.1]]]) * pq.mV assert_arrays_equal(targwaveforms, result.waveforms) # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(t_start, result.t_start) self.assertEqual(t_stop, result.t_stop) def test_time_slice_matching_ends(self): # time_slice spike train, keep sliced spike times t_start = 0.1 * pq.ms t_stop = 7.0 * pq.ms result = self.train1.time_slice(t_start, t_stop) assert_arrays_equal(self.train1, result) assert_arrays_equal(self.waveforms1, result.waveforms) # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(t_start, result.t_start) self.assertEqual(t_stop, result.t_stop) def test_time_slice_out_of_boundries(self): self.train1.t_start = 0.1*pq.ms assert_neo_object_is_compliant(self.train1) # time_slice spike train, keep sliced spike times t_start = 0.01 * pq.ms t_stop = 70.0 * pq.ms result = self.train1.time_slice(t_start, t_stop) assert_arrays_equal(self.train1, result) assert_arrays_equal(self.waveforms1, result.waveforms) # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(self.train1.t_start, result.t_start) self.assertEqual(self.train1.t_stop, result.t_stop) def test_time_slice_empty(self): waveforms = np.array([[[]]]) * pq.mV train = SpikeTrain([] * pq.ms, t_stop=10.0, waveforms=waveforms) assert_neo_object_is_compliant(train) # time_slice spike train, keep sliced spike times t_start = 0.01 * pq.ms t_stop = 70.0 * pq.ms result = train.time_slice(t_start, t_stop) assert_arrays_equal(train, result) assert_arrays_equal(waveforms[:-1], result.waveforms) # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(train.name, result.name) self.assertEqual(train.description, result.description) self.assertEqual(train.annotations, result.annotations) self.assertEqual(train.file_origin, result.file_origin) self.assertEqual(train.dtype, result.dtype) self.assertEqual(t_start, result.t_start) self.assertEqual(train.t_stop, result.t_stop) def test_time_slice_none_stop(self): # time_slice spike train, keep sliced spike times t_start = 1 * pq.ms result = self.train1.time_slice(t_start, None) assert_arrays_equal([1.2, 3.3, 6.4, 7] * pq.ms, result) targwaveforms = np.array([[[4., 5.], [4.1, 5.1]], [[6., 7.], [6.1, 7.1]], [[8., 9.], [8.1, 9.1]], [[10., 11.], [10.1, 11.1]]]) * pq.mV assert_arrays_equal(targwaveforms, result.waveforms) # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(t_start, result.t_start) self.assertEqual(self.train1.t_stop, result.t_stop) def test_time_slice_none_start(self): # time_slice spike train, keep sliced spike times t_stop = 1 * pq.ms result = self.train1.time_slice(None, t_stop) assert_arrays_equal([0.1, 0.5] * pq.ms, result) targwaveforms = np.array([[[0., 1.], [0.1, 1.1]], [[2., 3.], [2.1, 3.1]]]) * pq.mV assert_arrays_equal(targwaveforms, result.waveforms) # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(self.train1.t_start, result.t_start) self.assertEqual(t_stop, result.t_stop) def test_time_slice_none_both(self): self.train1.t_start = 0.1*pq.ms assert_neo_object_is_compliant(self.train1) # time_slice spike train, keep sliced spike times result = self.train1.time_slice(None, None) assert_arrays_equal(self.train1, result) assert_arrays_equal(self.waveforms1, result.waveforms) # but keep everything else pristine assert_neo_object_is_compliant(result) self.assertEqual(self.train1.name, result.name) self.assertEqual(self.train1.description, result.description) self.assertEqual(self.train1.annotations, result.annotations) self.assertEqual(self.train1.file_origin, result.file_origin) self.assertEqual(self.train1.dtype, result.dtype) self.assertEqual(self.train1.t_start, result.t_start) self.assertEqual(self.train1.t_stop, result.t_stop) class TestAttributesAnnotations(unittest.TestCase): def test_set_universally_recommended_attributes(self): train = SpikeTrain([3, 4, 5], units='sec', name='Name', description='Desc', file_origin='crack.txt', t_stop=99.9) assert_neo_object_is_compliant(train) self.assertEqual(train.name, 'Name') self.assertEqual(train.description, 'Desc') self.assertEqual(train.file_origin, 'crack.txt') def test_autoset_universally_recommended_attributes(self): train = SpikeTrain([3, 4, 5]*pq.s, t_stop=10.0) assert_neo_object_is_compliant(train) self.assertEqual(train.name, None) self.assertEqual(train.description, None) self.assertEqual(train.file_origin, None) def test_annotations(self): train = SpikeTrain([3, 4, 5]*pq.s, t_stop=11.1) assert_neo_object_is_compliant(train) self.assertEqual(train.annotations, {}) train = SpikeTrain([3, 4, 5]*pq.s, t_stop=11.1, ratname='Phillippe') assert_neo_object_is_compliant(train) self.assertEqual(train.annotations, {'ratname': 'Phillippe'}) class TestChanging(unittest.TestCase): def test_change_with_copy_default(self): # Default is copy = True # Changing spike train does not change data # Data source is quantity data = [3, 4, 5] * pq.s train = SpikeTrain(data, t_stop=100.0) train[0] = 99 * pq.s assert_neo_object_is_compliant(train) self.assertEqual(train[0], 99*pq.s) self.assertEqual(data[0], 3*pq.s) def test_change_with_copy_false(self): # Changing spike train also changes data, because it is a view # Data source is quantity data = [3, 4, 5] * pq.s train = SpikeTrain(data, copy=False, t_stop=100.0) train[0] = 99 * pq.s assert_neo_object_is_compliant(train) self.assertEqual(train[0], 99*pq.s) self.assertEqual(data[0], 99*pq.s) def test_change_with_copy_false_and_fake_rescale(self): # Changing spike train also changes data, because it is a view # Data source is quantity data = [3000, 4000, 5000] * pq.ms # even though we specify units, it still returns a view train = SpikeTrain(data, units='ms', copy=False, t_stop=100000) train[0] = 99000 * pq.ms assert_neo_object_is_compliant(train) self.assertEqual(train[0], 99000*pq.ms) self.assertEqual(data[0], 99000*pq.ms) def test_change_with_copy_false_and_rescale_true(self): # When rescaling, a view cannot be returned # Changing spike train also changes data, because it is a view data = [3, 4, 5] * pq.s self.assertRaises(ValueError, SpikeTrain, data, units='ms', copy=False, t_stop=10000) def test_init_with_rescale(self): data = [3, 4, 5] * pq.s train = SpikeTrain(data, units='ms', t_stop=6000) assert_neo_object_is_compliant(train) self.assertEqual(train[0], 3000*pq.ms) self.assertEqual(train._dimensionality, pq.ms._dimensionality) self.assertEqual(train.t_stop, 6000*pq.ms) def test_change_with_copy_true(self): # Changing spike train does not change data # Data source is quantity data = [3, 4, 5] * pq.s train = SpikeTrain(data, copy=True, t_stop=100) train[0] = 99 * pq.s assert_neo_object_is_compliant(train) self.assertEqual(train[0], 99*pq.s) self.assertEqual(data[0], 3*pq.s) def test_change_with_copy_default_and_data_not_quantity(self): # Default is copy = True # Changing spike train does not change data # Data source is array # Array and quantity are tested separately because copy default # is different for these two. data = [3, 4, 5] train = SpikeTrain(data, units='sec', t_stop=100) train[0] = 99 * pq.s assert_neo_object_is_compliant(train) self.assertEqual(train[0], 99*pq.s) self.assertEqual(data[0], 3*pq.s) def test_change_with_copy_false_and_data_not_quantity(self): # Changing spike train also changes data, because it is a view # Data source is array # Array and quantity are tested separately because copy default # is different for these two. data = np.array([3, 4, 5]) train = SpikeTrain(data, units='sec', copy=False, dtype=np.int, t_stop=101) train[0] = 99 * pq.s assert_neo_object_is_compliant(train) self.assertEqual(train[0], 99*pq.s) self.assertEqual(data[0], 99) def test_change_with_copy_false_and_dtype_change(self): # You cannot change dtype and request a view data = np.array([3, 4, 5]) self.assertRaises(ValueError, SpikeTrain, data, units='sec', copy=False, t_stop=101, dtype=np.float64) def test_change_with_copy_true_and_data_not_quantity(self): # Changing spike train does not change data # Data source is array # Array and quantity are tested separately because copy default # is different for these two. data = [3, 4, 5] train = SpikeTrain(data, units='sec', copy=True, t_stop=123.4) train[0] = 99 * pq.s assert_neo_object_is_compliant(train) self.assertEqual(train[0], 99*pq.s) self.assertEqual(data[0], 3) def test_changing_slice_changes_original_spiketrain(self): # If we slice a spiketrain and then change the slice, the # original spiketrain should change. # Whether the original data source changes is dependent on the # copy parameter. # This is compatible with both np and quantity default behavior. data = [3, 4, 5] * pq.s train = SpikeTrain(data, copy=True, t_stop=99.9) result = train[1:3] result[0] = 99 * pq.s assert_neo_object_is_compliant(train) self.assertEqual(train[1], 99*pq.s) self.assertEqual(result[0], 99*pq.s) self.assertEqual(data[1], 4*pq.s) def test_changing_slice_changes_original_spiketrain_with_copy_false(self): # If we slice a spiketrain and then change the slice, the # original spiketrain should change. # Whether the original data source changes is dependent on the # copy parameter. # This is compatible with both np and quantity default behavior. data = [3, 4, 5] * pq.s train = SpikeTrain(data, copy=False, t_stop=100.0) result = train[1:3] result[0] = 99 * pq.s assert_neo_object_is_compliant(train) assert_neo_object_is_compliant(result) self.assertEqual(train[1], 99*pq.s) self.assertEqual(result[0], 99*pq.s) self.assertEqual(data[1], 99*pq.s) def test__changing_spiketime_should_check_time_in_range(self): data = [3, 4, 5] * pq.ms train = SpikeTrain(data, copy=False, t_start=0.5, t_stop=10.0) assert_neo_object_is_compliant(train) self.assertRaises(ValueError, train.__setitem__, 0, 10.1*pq.ms) self.assertRaises(ValueError, train.__setitem__, 1, 5.0*pq.s) self.assertRaises(ValueError, train.__setitem__, 2, 5.0*pq.s) self.assertRaises(ValueError, train.__setitem__, 0, 0) def test__changing_multiple_spiketimes(self): data = [3, 4, 5] * pq.ms train = SpikeTrain(data, copy=False, t_start=0.5, t_stop=10.0) train[:] = [7, 8, 9] * pq.ms assert_neo_object_is_compliant(train) assert_arrays_equal(train, np.array([7, 8, 9])) def test__changing_multiple_spiketimes_should_check_time_in_range(self): data = [3, 4, 5] * pq.ms train = SpikeTrain(data, copy=False, t_start=0.5, t_stop=10.0) assert_neo_object_is_compliant(train) if sys.version_info[0] == 2: self.assertRaises(ValueError, train.__setslice__, 0, 3, [3, 4, 11] * pq.ms) self.assertRaises(ValueError, train.__setslice__, 0, 3, [0, 4, 5] * pq.ms) def test__rescale(self): data = [3, 4, 5] * pq.ms train = SpikeTrain(data, t_start=0.5, t_stop=10.0) result = train.rescale(pq.s) assert_neo_object_is_compliant(train) assert_neo_object_is_compliant(result) assert_arrays_equal(train, result) self.assertEqual(result.units, 1 * pq.s) def test__rescale_same_units(self): data = [3, 4, 5] * pq.ms train = SpikeTrain(data, t_start=0.5, t_stop=10.0) result = train.rescale(pq.ms) assert_neo_object_is_compliant(train) assert_arrays_equal(train, result) self.assertEqual(result.units, 1 * pq.ms) def test__rescale_incompatible_units_ValueError(self): data = [3, 4, 5] * pq.ms train = SpikeTrain(data, t_start=0.5, t_stop=10.0) assert_neo_object_is_compliant(train) self.assertRaises(ValueError, train.rescale, pq.m) class TestPropertiesMethods(unittest.TestCase): def setUp(self): self.data1 = [3, 4, 5] self.data1quant = self.data1 * pq.ms self.waveforms1 = np.array([[[0., 1.], [0.1, 1.1]], [[2., 3.], [2.1, 3.1]], [[4., 5.], [4.1, 5.1]]]) * pq.mV self.t_start1 = 0.5 self.t_stop1 = 10.0 self.t_start1quant = self.t_start1 * pq.ms self.t_stop1quant = self.t_stop1 * pq.ms self.sampling_rate1 = .1*pq.Hz self.left_sweep1 = 2.*pq.s self.train1 = SpikeTrain(self.data1quant, t_start=self.t_start1, t_stop=self.t_stop1, waveforms=self.waveforms1, left_sweep=self.left_sweep1, sampling_rate=self.sampling_rate1) def test__compliant(self): assert_neo_object_is_compliant(self.train1) def test__repr(self): result = repr(self.train1) targ = '' self.assertEqual(result, targ) def test__duration(self): result1 = self.train1.duration self.train1.t_start = None assert_neo_object_is_compliant(self.train1) result2 = self.train1.duration self.train1.t_start = self.t_start1quant self.train1.t_stop = None assert_neo_object_is_compliant(self.train1) result3 = self.train1.duration self.assertEqual(result1, 9.5 * pq.ms) self.assertEqual(result1.units, 1. * pq.ms) self.assertEqual(result2, None) self.assertEqual(result3, None) def test__spike_duration(self): result1 = self.train1.spike_duration self.train1.sampling_rate = None assert_neo_object_is_compliant(self.train1) result2 = self.train1.spike_duration self.train1.sampling_rate = self.sampling_rate1 self.train1.waveforms = None assert_neo_object_is_compliant(self.train1) result3 = self.train1.spike_duration self.assertEqual(result1, 20./pq.Hz) self.assertEqual(result1.units, 1./pq.Hz) self.assertEqual(result2, None) self.assertEqual(result3, None) def test__sampling_period(self): result1 = self.train1.sampling_period self.train1.sampling_rate = None assert_neo_object_is_compliant(self.train1) result2 = self.train1.sampling_period self.train1.sampling_rate = self.sampling_rate1 self.train1.sampling_period = 10.*pq.ms assert_neo_object_is_compliant(self.train1) result3a = self.train1.sampling_period result3b = self.train1.sampling_rate self.train1.sampling_period = None result4a = self.train1.sampling_period result4b = self.train1.sampling_rate self.assertEqual(result1, 10./pq.Hz) self.assertEqual(result1.units, 1./pq.Hz) self.assertEqual(result2, None) self.assertEqual(result3a, 10.*pq.ms) self.assertEqual(result3a.units, 1.*pq.ms) self.assertEqual(result3b, .1/pq.ms) self.assertEqual(result3b.units, 1./pq.ms) self.assertEqual(result4a, None) self.assertEqual(result4b, None) def test__right_sweep(self): result1 = self.train1.right_sweep self.train1.left_sweep = None assert_neo_object_is_compliant(self.train1) result2 = self.train1.right_sweep self.train1.left_sweep = self.left_sweep1 self.train1.sampling_rate = None assert_neo_object_is_compliant(self.train1) result3 = self.train1.right_sweep self.train1.sampling_rate = self.sampling_rate1 self.train1.waveforms = None assert_neo_object_is_compliant(self.train1) result4 = self.train1.right_sweep self.assertEqual(result1, 22.*pq.s) self.assertEqual(result1.units, 1.*pq.s) self.assertEqual(result2, None) self.assertEqual(result3, None) self.assertEqual(result4, None) class TestMiscellaneous(unittest.TestCase): def test__different_dtype_for_t_start_and_array(self): data = np.array([0, 9.9999999], dtype=np.float64) * pq.s data16 = data.astype(np.float16) data32 = data.astype(np.float32) data64 = data.astype(np.float64) t_start = data[0] t_stop = data[1] t_start16 = data[0].astype(dtype=np.float16) t_stop16 = data[1].astype(dtype=np.float16) t_start32 = data[0].astype(dtype=np.float32) t_stop32 = data[1].astype(dtype=np.float32) t_start64 = data[0].astype(dtype=np.float64) t_stop64 = data[1].astype(dtype=np.float64) t_start_custom = 0.0 t_stop_custom = 10.0 t_start_custom16 = np.array(t_start_custom, dtype=np.float16) t_stop_custom16 = np.array(t_stop_custom, dtype=np.float16) t_start_custom32 = np.array(t_start_custom, dtype=np.float32) t_stop_custom32 = np.array(t_stop_custom, dtype=np.float32) t_start_custom64 = np.array(t_start_custom, dtype=np.float64) t_stop_custom64 = np.array(t_stop_custom, dtype=np.float64) #This is OK. train = SpikeTrain(data64, copy=True, t_start=t_start, t_stop=t_stop) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start, t_stop=t_stop, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start, t_stop=t_stop, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start, t_stop=t_stop, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start, t_stop=t_stop, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start16, t_stop=t_stop16) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start16, t_stop=t_stop16, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start16, t_stop=t_stop16, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start16, t_stop=t_stop16, dtype=np.float64) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start32, t_stop=t_stop32) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start32, t_stop=t_stop32, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start32, t_stop=t_stop32, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start32, t_stop=t_stop32, dtype=np.float64) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start64, t_stop=t_stop64, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start64, t_stop=t_stop64, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start_custom, t_stop=t_stop_custom) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start_custom, t_stop=t_stop_custom, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start_custom, t_stop=t_stop_custom, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start_custom, t_stop=t_stop_custom, dtype=np.float64) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom, t_stop=t_stop_custom) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom, t_stop=t_stop_custom, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom, t_stop=t_stop_custom, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom, t_stop=t_stop_custom, dtype=np.float64) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start_custom, t_stop=t_stop_custom) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start_custom, t_stop=t_stop_custom, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start_custom, t_stop=t_stop_custom, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start_custom, t_stop=t_stop_custom, dtype=np.float64) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom16, t_stop=t_stop_custom16) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom16, t_stop=t_stop_custom16, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom16, t_stop=t_stop_custom16, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom16, t_stop=t_stop_custom16, dtype=np.float64) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom32, t_stop=t_stop_custom32) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom32, t_stop=t_stop_custom32, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom32, t_stop=t_stop_custom32, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom32, t_stop=t_stop_custom32, dtype=np.float64) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom64, t_stop=t_stop_custom64) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom64, t_stop=t_stop_custom64, dtype=np.float16) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom64, t_stop=t_stop_custom64, dtype=np.float32) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start_custom64, t_stop=t_stop_custom64, dtype=np.float64) assert_neo_object_is_compliant(train) #This use to bug - see ticket #38 train = SpikeTrain(data16, copy=True, t_start=t_start, t_stop=t_stop) assert_neo_object_is_compliant(train) train = SpikeTrain(data16, copy=True, t_start=t_start, t_stop=t_stop, dtype=np.float64) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start, t_stop=t_stop) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start, t_stop=t_stop, dtype=np.float64) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start64, t_stop=t_stop64) assert_neo_object_is_compliant(train) train = SpikeTrain(data32, copy=True, t_start=t_start64, t_stop=t_stop64, dtype=np.float64) assert_neo_object_is_compliant(train) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_analogsignalarray.py0000644000175000017500000007135112273723542022227 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.analogsignalarray.AnalogSignalArrayArray class """ import os import pickle try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.analogsignalarray import AnalogSignalArray from neo.core.analogsignal import AnalogSignal from neo.test.tools import (assert_arrays_almost_equal, assert_arrays_equal, assert_neo_object_is_compliant, assert_same_sub_schema) class TestAnalogSignalArrayConstructor(unittest.TestCase): def test__create_from_list(self): data = [(i, i, i) for i in range(10)] # 3 signals each with 10 samples rate = 1000*pq.Hz signal = AnalogSignalArray(data, sampling_rate=rate, units="mV") assert_neo_object_is_compliant(signal) self.assertEqual(signal.shape, (10, 3)) self.assertEqual(signal.t_start, 0*pq.ms) self.assertEqual(signal.t_stop, len(data)/rate) self.assertEqual(signal[9, 0], 9000*pq.uV) def test__create_from_numpy_array(self): data = np.arange(20.0).reshape((10, 2)) rate = 1*pq.kHz signal = AnalogSignalArray(data, sampling_rate=rate, units="uV") assert_neo_object_is_compliant(signal) self.assertEqual(signal.t_start, 0*pq.ms) self.assertEqual(signal.t_stop, data.shape[0]/rate) self.assertEqual(signal[9, 0], 0.018*pq.mV) self.assertEqual(signal[9, 1], 19*pq.uV) def test__create_from_quantities_array(self): data = np.arange(20.0).reshape((10, 2)) * pq.mV rate = 5000*pq.Hz signal = AnalogSignalArray(data, sampling_rate=rate) assert_neo_object_is_compliant(signal) self.assertEqual(signal.t_start, 0*pq.ms) self.assertEqual(signal.t_stop, data.shape[0]/rate) self.assertEqual(signal[9, 0], 18000*pq.uV) def test__create_from_quantities_with_inconsistent_units_ValueError(self): data = np.arange(20.0).reshape((10, 2)) * pq.mV self.assertRaises(ValueError, AnalogSignalArray, data, sampling_rate=1*pq.kHz, units="nA") def test__create_with_copy_true_should_return_copy(self): data = np.arange(20.0).reshape((10, 2)) * pq.mV rate = 5000*pq.Hz signal = AnalogSignalArray(data, copy=True, sampling_rate=rate) assert_neo_object_is_compliant(signal) data[3, 0] = 0.099*pq.V self.assertNotEqual(signal[3, 0], 99*pq.mV) def test__create_with_copy_false_should_return_view(self): data = np.arange(20.0).reshape((10, 2)) * pq.mV rate = 5000*pq.Hz signal = AnalogSignalArray(data, copy=False, sampling_rate=rate) assert_neo_object_is_compliant(signal) data[3, 0] = 99*pq.mV self.assertEqual(signal[3, 0], 99000*pq.uV) # signal must not be 1D - should raise Exception if 1D class TestAnalogSignalArrayProperties(unittest.TestCase): def setUp(self): self.t_start = [0.0*pq.ms, 100*pq.ms, -200*pq.ms] self.rates = [1*pq.kHz, 420*pq.Hz, 999*pq.Hz] self.data = [np.arange(10.0).reshape((5, 2))*pq.nA, np.arange(-100.0, 100.0, 10.0).reshape((4, 5))*pq.mV, np.random.uniform(size=(100, 4))*pq.uV] self.signals = [AnalogSignalArray(D, sampling_rate=r, t_start=t) for r, D, t in zip(self.rates, self.data, self.t_start)] def test__compliant(self): for signal in self.signals: assert_neo_object_is_compliant(signal) def test__t_stop(self): for i, signal in enumerate(self.signals): targ = self.t_start[i] + self.data[i].shape[0]/self.rates[i] self.assertEqual(signal.t_stop, targ) def test__duration(self): for signal in self.signals: self.assertAlmostEqual(signal.duration, signal.t_stop - signal.t_start, delta=1e-15) def test__sampling_period(self): for signal, rate in zip(self.signals, self.rates): self.assertEqual(signal.sampling_period, 1/rate) def test__times(self): for i, signal in enumerate(self.signals): targ = np.arange(self.data[i].shape[0]) targ = targ/self.rates[i] + self.t_start[i] assert_arrays_almost_equal(signal.times, targ, 1e-12*pq.ms) class TestAnalogSignalArrayArrayMethods(unittest.TestCase): def setUp(self): self.data1 = np.arange(55.0).reshape((11, 5)) self.data1quant = self.data1 * pq.nA self.signal1 = AnalogSignalArray(self.data1quant, sampling_rate=1*pq.kHz, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') self.data2 = np.array([[0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5]]).T self.data2quant = self.data2 * pq.mV self.signal2 = AnalogSignalArray(self.data2quant, sampling_rate=1.0*pq.Hz, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') def test__compliant(self): assert_neo_object_is_compliant(self.signal1) self.assertEqual(self.signal1.name, 'spam') self.assertEqual(self.signal1.description, 'eggs') self.assertEqual(self.signal1.file_origin, 'testfile.txt') self.assertEqual(self.signal1.annotations, {'arg1': 'test'}) assert_neo_object_is_compliant(self.signal2) self.assertEqual(self.signal2.name, 'spam') self.assertEqual(self.signal2.description, 'eggs') self.assertEqual(self.signal2.file_origin, 'testfile.txt') self.assertEqual(self.signal2.annotations, {'arg1': 'test'}) def test__index_dim1_should_return_analogsignal(self): result = self.signal1[:, 0] self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, None) self.assertEqual(result.description, None) self.assertEqual(result.file_origin, None) self.assertEqual(result.annotations, {}) self.assertEqual(result.t_stop, self.signal1.t_stop) self.assertEqual(result.t_start, self.signal1.t_start) self.assertEqual(result.sampling_rate, self.signal1.sampling_rate) assert_arrays_equal(result, self.data1[:, 0]) def test__index_dim1_and_slice_dim0_should_return_analogsignal(self): result = self.signal1[2:7, 0] self.assertIsInstance(result, AnalogSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, None) self.assertEqual(result.description, None) self.assertEqual(result.file_origin, None) self.assertEqual(result.annotations, {}) self.assertEqual(result.t_start, self.signal1.t_start+2*self.signal1.sampling_period) self.assertEqual(result.t_stop, self.signal1.t_start+7*self.signal1.sampling_period) self.assertEqual(result.sampling_rate, self.signal1.sampling_rate) assert_arrays_equal(result, self.data1[2:7, 0]) def test__index_dim0_should_return_quantity_array(self): # i.e. values from all signals for a single point in time result = self.signal1[3, :] self.assertIsInstance(result, pq.Quantity) self.assertFalse(hasattr(result, 'name')) self.assertFalse(hasattr(result, 'description')) self.assertFalse(hasattr(result, 'file_origin')) self.assertFalse(hasattr(result, 'annotations')) self.assertEqual(result.shape, (5,)) self.assertFalse(hasattr(result, "t_start")) self.assertEqual(result.units, pq.nA) assert_arrays_equal(result, self.data1[3, :]) def test__index_dim0_and_slice_dim1_should_return_quantity_array(self): # i.e. values from a subset of signals for a single point in time result = self.signal1[3, 2:5] self.assertIsInstance(result, pq.Quantity) self.assertFalse(hasattr(result, 'name')) self.assertFalse(hasattr(result, 'description')) self.assertFalse(hasattr(result, 'file_origin')) self.assertFalse(hasattr(result, 'annotations')) self.assertEqual(result.shape, (3,)) self.assertFalse(hasattr(result, "t_start")) self.assertEqual(result.units, pq.nA) assert_arrays_equal(result, self.data1[3, 2:5]) def test__index_as_string_IndexError(self): self.assertRaises(IndexError, self.signal1.__getitem__, 5.) def test__slice_both_dimensions_should_return_analogsignalarray(self): result = self.signal1[0:3, 0:3] self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) targ = AnalogSignalArray([[0, 1, 2], [5, 6, 7], [10, 11, 12]], dtype=float, units="nA", sampling_rate=1*pq.kHz, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') assert_neo_object_is_compliant(targ) self.assertEqual(result.t_stop, targ.t_stop) self.assertEqual(result.t_start, targ.t_start) self.assertEqual(result.sampling_rate, targ.sampling_rate) self.assertEqual(result.shape, targ.shape) assert_same_sub_schema(result, targ) assert_arrays_equal(result, self.data1[0:3, 0:3]) def test__slice_only_first_dimension_should_return_analogsignalarray(self): result = self.signal1[2:7] self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(result.shape, (5, 5)) self.assertEqual(result.t_start, self.signal1.t_start+2*self.signal1.sampling_period) self.assertEqual(result.t_stop, self.signal1.t_start+7*self.signal1.sampling_period) self.assertEqual(result.sampling_rate, self.signal1.sampling_rate) assert_arrays_equal(result, self.data1[2:7]) def test__getitem_should_return_single_quantity(self): # quantities drops the units in this case self.assertEqual(self.signal1[9, 3], 48000*pq.pA) self.assertEqual(self.signal1[9][3], self.signal1[9, 3]) self.assertTrue(hasattr(self.signal1[9, 3], 'units')) self.assertRaises(IndexError, self.signal1.__getitem__, (99, 73)) def test_comparison_operators(self): assert_arrays_equal(self.signal1[0:3, 0:3] >= 5*pq.nA, np.array([[False, False, False], [True, True, True], [True, True, True]])) assert_arrays_equal(self.signal1[0:3, 0:3] >= 5*pq.pA, np.array([[False, True, True], [True, True, True], [True, True, True]])) def test__comparison_with_inconsistent_units_should_raise_Exception(self): self.assertRaises(ValueError, self.signal1.__gt__, 5*pq.mV) def test__simple_statistics(self): self.assertEqual(self.signal1.max(), 54000*pq.pA) self.assertEqual(self.signal1.min(), 0*pq.nA) self.assertEqual(self.signal1.mean(), 27*pq.nA) def test__rescale_same(self): result = self.signal1.copy() result = result.rescale(pq.nA) self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(result.units, 1*pq.nA) assert_arrays_equal(result, self.data1) assert_same_sub_schema(result, self.signal1) def test__rescale_new(self): result = self.signal1.copy() result = result.rescale(pq.pA) self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(result.units, 1*pq.pA) assert_arrays_almost_equal(np.array(result), self.data1*1000., 1e-10) def test__time_slice(self): t_start = 2 * pq.s t_stop = 4 * pq.s result = self.signal2.time_slice(t_start, t_stop) self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) targ = AnalogSignalArray(np.array([[2, 3], [2, 3]]).T, sampling_rate=1.0*pq.Hz, units='mV', t_start=t_start, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') assert_neo_object_is_compliant(result) self.assertEqual(result.t_stop, t_stop) self.assertEqual(result.t_start, t_start) self.assertEqual(result.sampling_rate, targ.sampling_rate) assert_arrays_equal(result, targ) assert_same_sub_schema(result, targ) def test__time_slice__out_of_bounds_ValueError(self): t_start_good = 2 * pq.s t_stop_good = 4 * pq.s t_start_bad = -2 * pq.s t_stop_bad = 40 * pq.s self.assertRaises(ValueError, self.signal2.time_slice, t_start_good, t_stop_bad) self.assertRaises(ValueError, self.signal2.time_slice, t_start_bad, t_stop_good) self.assertRaises(ValueError, self.signal2.time_slice, t_start_bad, t_stop_bad) def test__time_equal(self): t_start = 0 * pq.s t_stop = 6 * pq.s result = self.signal2.time_slice(t_start, t_stop) self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(result.t_stop, t_stop) self.assertEqual(result.t_start, t_start) assert_arrays_equal(result, self.signal2) assert_same_sub_schema(result, self.signal2) def test__time_slice__offset(self): self.signal2.t_start = 10.0 * pq.s assert_neo_object_is_compliant(self.signal2) t_start = 12 * pq.s t_stop = 14 * pq.s result = self.signal2.time_slice(t_start, t_stop) self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) targ = AnalogSignalArray(np.array([[2, 3], [2, 3]]).T, t_start=12.0*pq.ms, sampling_rate=1.0*pq.Hz, units='mV', name='spam', description='eggs', file_origin='testfile.txt', arg1='test') assert_neo_object_is_compliant(result) self.assertEqual(self.signal2.t_start, 10.0 * pq.s) self.assertEqual(result.t_stop, t_stop) self.assertEqual(result.t_start, t_start) self.assertEqual(result.sampling_rate, targ.sampling_rate) assert_arrays_equal(result, targ) assert_same_sub_schema(result, targ) def test__time_slice__different_units(self): self.signal2.t_start = 10.0 * pq.ms assert_neo_object_is_compliant(self.signal2) t_start = 2 * pq.s + 10.0 * pq.ms t_stop = 4 * pq.s + 10.0 * pq.ms result = self.signal2.time_slice(t_start, t_stop) self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) targ = AnalogSignalArray(np.array([[2, 3], [2, 3]]).T, t_start=t_start.rescale(pq.ms), sampling_rate=1.0*pq.Hz, units='mV', name='spam', description='eggs', file_origin='testfile.txt', arg1='test') assert_neo_object_is_compliant(result) assert_neo_object_is_compliant(self.signal2) self.assertEqual(self.signal2.t_start, 10.0 * pq.ms) self.assertAlmostEqual(result.t_stop, t_stop, delta=1e-12*pq.ms) self.assertAlmostEqual(result.t_start, t_start, delta=1e-12*pq.ms) assert_arrays_almost_equal(result.times, targ.times, 1e-12*pq.ms) self.assertEqual(result.sampling_rate, targ.sampling_rate) assert_arrays_equal(result, targ) assert_same_sub_schema(result, targ) class TestAnalogSignalArrayEquality(unittest.TestCase): def test__signals_with_different_data_complement_should_be_not_equal(self): signal1 = AnalogSignalArray(np.arange(55.0).reshape((11, 5)), units="mV", sampling_rate=1*pq.kHz) signal2 = AnalogSignalArray(np.arange(55.0).reshape((11, 5)), units="mV", sampling_rate=2*pq.kHz) self.assertNotEqual(signal1, signal2) assert_neo_object_is_compliant(signal1) assert_neo_object_is_compliant(signal2) class TestAnalogSignalArrayCombination(unittest.TestCase): def setUp(self): self.data1 = np.arange(55.0).reshape((11, 5)) self.data1quant = self.data1 * pq.mV self.signal1 = AnalogSignalArray(self.data1quant, sampling_rate=1*pq.kHz, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') self.data2 = np.arange(100.0, 155.0).reshape((11, 5)) self.data2quant = self.data2 * pq.mV self.signal2 = AnalogSignalArray(self.data2quant, sampling_rate=1*pq.kHz, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') def test__compliant(self): assert_neo_object_is_compliant(self.signal1) self.assertEqual(self.signal1.name, 'spam') self.assertEqual(self.signal1.description, 'eggs') self.assertEqual(self.signal1.file_origin, 'testfile.txt') self.assertEqual(self.signal1.annotations, {'arg1': 'test'}) assert_neo_object_is_compliant(self.signal2) self.assertEqual(self.signal2.name, 'spam') self.assertEqual(self.signal2.description, 'eggs') self.assertEqual(self.signal2.file_origin, 'testfile.txt') self.assertEqual(self.signal2.annotations, {'arg1': 'test'}) def test__add_const_quantity_should_preserve_data_complement(self): result = self.signal1 + 0.065*pq.V self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) # time zero, signal index 4 assert_arrays_equal(result, self.data1 + 65) self.assertEqual(self.signal1[0, 4], 4*pq.mV) self.assertEqual(result[0, 4], 69000*pq.uV) self.assertEqual(self.signal1.t_start, result.t_start) self.assertEqual(self.signal1.sampling_rate, result.sampling_rate) def test__add_two_consistent_signals_should_preserve_data_complement(self): result = self.signal1 + self.signal2 self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) targdata = np.arange(100.0, 210.0, 2.0).reshape((11, 5)) targ = AnalogSignalArray(targdata, units="mV", sampling_rate=1*pq.kHz, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') assert_neo_object_is_compliant(targ) assert_arrays_equal(result, targdata) assert_same_sub_schema(result, targ) def test__add_signals_with_inconsistent_data_complement_ValueError(self): self.signal2.sampling_rate = 0.5*pq.kHz assert_neo_object_is_compliant(self.signal2) self.assertRaises(ValueError, self.signal1.__add__, self.signal2) def test__subtract_const_should_preserve_data_complement(self): result = self.signal1 - 65*pq.mV self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(np.array(self.signal1[1, 4]), 9) self.assertEqual(np.array(result[1, 4]), -56) assert_arrays_equal(result, self.data1 - 65) self.assertEqual(self.signal1.sampling_rate, result.sampling_rate) def test__subtract_from_const_should_return_signal(self): result = 10*pq.mV - self.signal1 self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(np.array(self.signal1[1, 4]), 9) self.assertEqual(np.array(result[1, 4]), 1) assert_arrays_equal(result, 10 - self.data1) self.assertEqual(self.signal1.sampling_rate, result.sampling_rate) def test__mult_by_const_float_should_preserve_data_complement(self): result = self.signal1*2 self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(np.array(self.signal1[1, 4]), 9) self.assertEqual(np.array(result[1, 4]), 18) assert_arrays_equal(result, self.data1*2) self.assertEqual(self.signal1.sampling_rate, result.sampling_rate) def test__divide_by_const_should_preserve_data_complement(self): result = self.signal1/0.5 self.assertIsInstance(result, AnalogSignalArray) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(np.array(self.signal1[1, 4]), 9) self.assertEqual(np.array(result[1, 4]), 18) assert_arrays_equal(result, self.data1/0.5) self.assertEqual(self.signal1.sampling_rate, result.sampling_rate) def test__merge(self): self.signal1.description = None self.signal1.file_origin = None assert_neo_object_is_compliant(self.signal1) data3 = np.arange(1000.0, 1066.0).reshape((11, 6)) * pq.uV data3scale = data3.rescale(self.data1quant.units) signal2 = AnalogSignalArray(self.data1quant, sampling_rate=1*pq.kHz, channel_index=np.arange(5), name='signal2', description='test signal', file_origin='testfile.txt') signal3 = AnalogSignalArray(data3, units="uV", sampling_rate=1*pq.kHz, channel_index=np.arange(5, 11), name='signal3', description='test signal', file_origin='testfile.txt') signal4 = AnalogSignalArray(data3, units="uV", sampling_rate=1*pq.kHz, name='signal4', description='test signal', file_origin='testfile.txt') merged13 = self.signal1.merge(signal3) merged23 = signal2.merge(signal3) merged24 = signal2.merge(signal4) mergeddata13 = np.array(merged13) mergeddata23 = np.array(merged23) mergeddata24 = np.array(merged24) targdata13 = np.hstack([self.data1quant, data3scale]) targdata23 = np.hstack([self.data1quant, data3scale]) targdata24 = np.hstack([self.data1quant, data3scale]) assert_neo_object_is_compliant(signal2) assert_neo_object_is_compliant(signal3) assert_neo_object_is_compliant(merged13) assert_neo_object_is_compliant(merged23) assert_neo_object_is_compliant(merged24) self.assertEqual(merged13[0, 4], 4*pq.mV) self.assertEqual(merged23[0, 4], 4*pq.mV) self.assertEqual(merged13[0, 5], 1*pq.mV) self.assertEqual(merged23[0, 5], 1*pq.mV) self.assertEqual(merged13[10, 10], 1.065*pq.mV) self.assertEqual(merged23[10, 10], 1.065*pq.mV) self.assertEqual(merged13.t_stop, self.signal1.t_stop) self.assertEqual(merged23.t_stop, self.signal1.t_stop) self.assertEqual(merged13.name, 'merge(spam, signal3)') self.assertEqual(merged23.name, 'merge(signal2, signal3)') self.assertEqual(merged13.description, 'merge(None, test signal)') self.assertEqual(merged23.description, 'test signal') self.assertEqual(merged13.file_origin, 'merge(None, testfile.txt)') self.assertEqual(merged23.file_origin, 'testfile.txt') assert_arrays_equal(mergeddata13, targdata13) assert_arrays_equal(mergeddata23, targdata23) assert_arrays_equal(mergeddata24, targdata24) assert_arrays_equal(merged13.channel_indexes, np.arange(5, 11)) assert_arrays_equal(merged23.channel_indexes, np.arange(11)) assert_arrays_equal(merged24.channel_indexes, np.arange(5)) class TestAnalogSignalArrayFunctions(unittest.TestCase): def test__pickle(self): signal1 = AnalogSignalArray(np.arange(55.0).reshape((11, 5)), units="mV", sampling_rate=1*pq.kHz, channel_index=np.arange(5)) fobj = open('./pickle', 'wb') pickle.dump(signal1, fobj) fobj.close() fobj = open('./pickle', 'rb') try: signal2 = pickle.load(fobj) except ValueError: signal2 = None assert_arrays_equal(signal1, signal2) assert_neo_object_is_compliant(signal1) assert_neo_object_is_compliant(signal2) self.assertEqual(list(signal1.channel_indexes), [0, 1, 2, 3, 4]) self.assertEqual(list(signal1.channel_indexes), list(signal2.channel_indexes)) fobj.close() os.remove('./pickle') if __name__ == "__main__": unittest.main() neo-0.3.3/neo/test/test_irregularysampledsignal.py0000644000175000017500000004525212273723542023463 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ Tests of the neo.core.irregularlysampledsignal.IrregularySampledSignal class """ try: import unittest2 as unittest except ImportError: import unittest import numpy as np import quantities as pq from neo.core.irregularlysampledsignal import IrregularlySampledSignal from neo.test.tools import (assert_arrays_almost_equal, assert_arrays_equal, assert_neo_object_is_compliant, assert_same_sub_schema) class TestIrregularlySampledSignalConstruction(unittest.TestCase): def test_IrregularlySampledSignal_creation_times_units_signal_units(self): params = {'testarg2': 'yes', 'testarg3': True} sig = IrregularlySampledSignal([1.1, 1.5, 1.7]*pq.ms, signal=[20., 40., 60.]*pq.mV, name='test', description='tester', file_origin='test.file', testarg1=1, **params) sig.annotate(testarg1=1.1, testarg0=[1, 2, 3]) assert_neo_object_is_compliant(sig) assert_arrays_equal(sig.times, [1.1, 1.5, 1.7]*pq.ms) assert_arrays_equal(np.asarray(sig), np.array([20., 40., 60.])) self.assertEqual(sig.units, pq.mV) self.assertEqual(sig.name, 'test') self.assertEqual(sig.description, 'tester') self.assertEqual(sig.file_origin, 'test.file') self.assertEqual(sig.annotations['testarg0'], [1, 2, 3]) self.assertEqual(sig.annotations['testarg1'], 1.1) self.assertEqual(sig.annotations['testarg2'], 'yes') self.assertTrue(sig.annotations['testarg3']) def test_IrregularlySampledSignal_creation_units_arg(self): params = {'testarg2': 'yes', 'testarg3': True} sig = IrregularlySampledSignal([1.1, 1.5, 1.7], signal=[20., 40., 60.], units=pq.V, time_units=pq.s, name='test', description='tester', file_origin='test.file', testarg1=1, **params) sig.annotate(testarg1=1.1, testarg0=[1, 2, 3]) assert_neo_object_is_compliant(sig) assert_arrays_equal(sig.times, [1.1, 1.5, 1.7]*pq.s) assert_arrays_equal(np.asarray(sig), np.array([20., 40., 60.])) self.assertEqual(sig.units, pq.V) self.assertEqual(sig.name, 'test') self.assertEqual(sig.description, 'tester') self.assertEqual(sig.file_origin, 'test.file') self.assertEqual(sig.annotations['testarg0'], [1, 2, 3]) self.assertEqual(sig.annotations['testarg1'], 1.1) self.assertEqual(sig.annotations['testarg2'], 'yes') self.assertTrue(sig.annotations['testarg3']) def test_IrregularlySampledSignal_creation_units_rescale(self): params = {'testarg2': 'yes', 'testarg3': True} sig = IrregularlySampledSignal([1.1, 1.5, 1.7]*pq.s, signal=[2., 4., 6.]*pq.V, units=pq.mV, time_units=pq.ms, name='test', description='tester', file_origin='test.file', testarg1=1, **params) sig.annotate(testarg1=1.1, testarg0=[1, 2, 3]) assert_neo_object_is_compliant(sig) assert_arrays_equal(sig.times, [1100, 1500, 1700]*pq.ms) assert_arrays_equal(np.asarray(sig), np.array([2000., 4000., 6000.])) self.assertEqual(sig.units, pq.mV) self.assertEqual(sig.name, 'test') self.assertEqual(sig.description, 'tester') self.assertEqual(sig.file_origin, 'test.file') self.assertEqual(sig.annotations['testarg0'], [1, 2, 3]) self.assertEqual(sig.annotations['testarg1'], 1.1) self.assertEqual(sig.annotations['testarg2'], 'yes') self.assertTrue(sig.annotations['testarg3']) def test_IrregularlySampledSignal_different_lens_ValueError(self): times = [1.1, 1.5, 1.7]*pq.ms signal = [20., 40., 60., 70.]*pq.mV self.assertRaises(ValueError, IrregularlySampledSignal, times, signal) def test_IrregularlySampledSignal_no_signal_units_ValueError(self): times = [1.1, 1.5, 1.7]*pq.ms signal = [20., 40., 60.] self.assertRaises(ValueError, IrregularlySampledSignal, times, signal) def test_IrregularlySampledSignal_no_time_units_ValueError(self): times = [1.1, 1.5, 1.7] signal = [20., 40., 60.]*pq.mV self.assertRaises(ValueError, IrregularlySampledSignal, times, signal) class TestIrregularlySampledSignalProperties(unittest.TestCase): def setUp(self): self.times = [np.arange(10.0)*pq.s, np.arange(-100.0, 100.0, 10.0)*pq.ms, np.arange(100)*pq.ns] self.data = [np.arange(10.0)*pq.nA, np.arange(-100.0, 100.0, 10.0)*pq.mV, np.random.uniform(size=100)*pq.uV] self.signals = [IrregularlySampledSignal(t, signal=D, testattr='test') for D, t in zip(self.data, self.times)] def test__compliant(self): for signal in self.signals: assert_neo_object_is_compliant(signal) def test__t_start_getter(self): for signal, times in zip(self.signals, self.times): self.assertAlmostEqual(signal.t_start, times[0], delta=1e-15) def test__t_stop_getter(self): for signal, times in zip(self.signals, self.times): self.assertAlmostEqual(signal.t_stop, times[-1], delta=1e-15) def test__duration_getter(self): for signal, times in zip(self.signals, self.times): self.assertAlmostEqual(signal.duration, times[-1] - times[0], delta=1e-15) def test__sampling_intervals_getter(self): for signal, times in zip(self.signals, self.times): assert_arrays_almost_equal(signal.sampling_intervals, np.diff(times), threshold=1e-15) def test_IrregularlySampledSignal_repr(self): sig = IrregularlySampledSignal([1.1, 1.5, 1.7]*pq.s, signal=[2., 4., 6.]*pq.V, name='test', description='tester', file_origin='test.file', testarg1=1) assert_neo_object_is_compliant(sig) targ = ('') res = repr(sig) self.assertEqual(targ, res) class TestIrregularlySampledSignalArrayMethods(unittest.TestCase): def setUp(self): self.data1 = np.arange(10.0) self.data1quant = self.data1 * pq.mV self.time1 = np.logspace(1, 5, 10) self.time1quant = self.time1*pq.ms self.signal1 = IrregularlySampledSignal(self.time1quant, signal=self.data1quant, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') def test__compliant(self): assert_neo_object_is_compliant(self.signal1) self.assertEqual(self.signal1.name, 'spam') self.assertEqual(self.signal1.description, 'eggs') self.assertEqual(self.signal1.file_origin, 'testfile.txt') self.assertEqual(self.signal1.annotations, {'arg1': 'test'}) def test__slice_should_return_IrregularlySampledSignal(self): result = self.signal1[3:8] self.assertIsInstance(result, IrregularlySampledSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(result.size, 5) self.assertEqual(result.t_start, self.time1quant[3]) self.assertEqual(result.t_stop, self.time1quant[7]) assert_arrays_equal(self.time1quant[3:8], result.times) assert_arrays_equal(self.data1[3:8], result) # Test other attributes were copied over (in this case, defaults) self.assertEqual(result.file_origin, self.signal1.file_origin) self.assertEqual(result.name, self.signal1.name) self.assertEqual(result.description, self.signal1.description) self.assertEqual(result.annotations, self.signal1.annotations) def test__getitem_should_return_single_quantity(self): self.assertEqual(self.signal1[0], 0*pq.mV) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertRaises(IndexError, self.signal1.__getitem__, 10) def test__getitem_out_of_bounds_IndexError(self): self.assertRaises(IndexError, self.signal1.__getitem__, 10) def test_comparison_operators(self): assert_arrays_equal(self.signal1 >= 5*pq.mV, np.array([False, False, False, False, False, True, True, True, True, True])) def test__comparison_with_inconsistent_units_should_raise_Exception(self): self.assertRaises(ValueError, self.signal1.__gt__, 5*pq.nA) def test_simple_statistics(self): targmean = self.signal1[:-1]*np.diff(self.time1quant) targmean = targmean.sum()/(self.time1quant[-1]-self.time1quant[0]) self.assertEqual(self.signal1.max(), 9*pq.mV) self.assertEqual(self.signal1.min(), 0*pq.mV) self.assertEqual(self.signal1.mean(), targmean) def test_mean_interpolation_NotImplementedError(self): self.assertRaises(NotImplementedError, self.signal1.mean, True) def test_resample_NotImplementedError(self): self.assertRaises(NotImplementedError, self.signal1.resample, True) def test__rescale_same(self): result = self.signal1.copy() result = result.rescale(pq.mV) self.assertIsInstance(result, IrregularlySampledSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(result.units, 1*pq.mV) assert_arrays_equal(result, self.data1) assert_arrays_equal(result.times, self.time1quant) assert_same_sub_schema(result, self.signal1) def test__rescale_new(self): result = self.signal1.copy() result = result.rescale(pq.uV) self.assertIsInstance(result, IrregularlySampledSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(result.units, 1*pq.uV) assert_arrays_almost_equal(np.array(result), self.data1*1000., 1e-10) assert_arrays_equal(result.times, self.time1quant) def test__rescale_new_incompatible_ValueError(self): self.assertRaises(ValueError, self.signal1.rescale, pq.nA) class TestIrregularlySampledSignalCombination(unittest.TestCase): def setUp(self): self.data1 = np.arange(10.0) self.data1quant = self.data1 * pq.mV self.time1 = np.logspace(1, 5, 10) self.time1quant = self.time1*pq.ms self.signal1 = IrregularlySampledSignal(self.time1quant, signal=self.data1quant, name='spam', description='eggs', file_origin='testfile.txt', arg1='test') def test__compliant(self): assert_neo_object_is_compliant(self.signal1) self.assertEqual(self.signal1.name, 'spam') self.assertEqual(self.signal1.description, 'eggs') self.assertEqual(self.signal1.file_origin, 'testfile.txt') self.assertEqual(self.signal1.annotations, {'arg1': 'test'}) def test__add_const_quantity_should_preserve_data_complement(self): result = self.signal1 + 0.065*pq.V self.assertIsInstance(result, IrregularlySampledSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) assert_arrays_equal(result, self.data1 + 65) assert_arrays_equal(result.times, self.time1quant) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], 74*pq.mV) def test__add_two_consistent_signals_should_preserve_data_complement(self): data2 = np.arange(10.0, 20.0) data2quant = data2*pq.mV signal2 = IrregularlySampledSignal(self.time1quant, signal=data2quant) assert_neo_object_is_compliant(signal2) result = self.signal1 + signal2 self.assertIsInstance(result, IrregularlySampledSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) targ = IrregularlySampledSignal(self.time1quant, signal=np.arange(10.0, 30.0, 2.0), units="mV", name='spam', description='eggs', file_origin='testfile.txt', arg1='test') assert_neo_object_is_compliant(targ) assert_arrays_equal(result, targ) assert_arrays_equal(self.time1quant, targ.times) assert_arrays_equal(result.times, targ.times) assert_same_sub_schema(result, targ) def test__add_signals_with_inconsistent_times_AssertionError(self): signal2 = IrregularlySampledSignal(self.time1quant*2., signal=np.arange(10.0), units="mV") assert_neo_object_is_compliant(signal2) self.assertRaises(ValueError, self.signal1.__add__, signal2) def test__add_signals_with_inconsistent_dimension_ValueError(self): signal2 = np.arange(20).reshape(2, 10) self.assertRaises(ValueError, self.signal1.__add__, signal2) def test__subtract_const_should_preserve_data_complement(self): result = self.signal1 - 65*pq.mV self.assertIsInstance(result, IrregularlySampledSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], -56*pq.mV) assert_arrays_equal(result, self.data1 - 65) assert_arrays_equal(result.times, self.time1quant) def test__subtract_from_const_should_return_signal(self): result = 10*pq.mV - self.signal1 self.assertIsInstance(result, IrregularlySampledSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], 1*pq.mV) assert_arrays_equal(result, 10 - self.data1) assert_arrays_equal(result.times, self.time1quant) def test__mult_signal_by_const_float_should_preserve_data_complement(self): result = self.signal1*2. self.assertIsInstance(result, IrregularlySampledSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], 18*pq.mV) assert_arrays_equal(result, self.data1*2) assert_arrays_equal(result.times, self.time1quant) def test__mult_signal_by_const_array_should_preserve_data_complement(self): result = self.signal1*np.array(2.) self.assertIsInstance(result, IrregularlySampledSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], 18*pq.mV) assert_arrays_equal(result, self.data1*2) assert_arrays_equal(result.times, self.time1quant) def test__divide_signal_by_const_should_preserve_data_complement(self): result = self.signal1/0.5 self.assertIsInstance(result, IrregularlySampledSignal) assert_neo_object_is_compliant(result) self.assertEqual(result.name, 'spam') self.assertEqual(result.description, 'eggs') self.assertEqual(result.file_origin, 'testfile.txt') self.assertEqual(result.annotations, {'arg1': 'test'}) self.assertEqual(self.signal1[9], 9*pq.mV) self.assertEqual(result[9], 18*pq.mV) assert_arrays_equal(result, self.data1/0.5) assert_arrays_equal(result.times, self.time1quant) class TestIrregularlySampledSignalEquality(unittest.TestCase): def test__signals_with_different_times_should_be_not_equal(self): signal1 = IrregularlySampledSignal(np.arange(10.0)/100*pq.s, np.arange(10.0), units="mV") signal2 = IrregularlySampledSignal(np.arange(10.0)/100*pq.ms, np.arange(10.0), units="mV") self.assertNotEqual(signal1, signal2) if __name__ == "__main__": unittest.main() neo-0.3.3/neo/description.py0000644000175000017500000001457712273723542017045 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ This file is a bundle of utilities to describe Neo object representation (attributes and relationships). It can be used to: * generate diagrams of neo * some generics IO like (databases mapper, hdf5, neomatlab, ...) * tests * external SQL mappers (Cf OpenElectrophy, Gnode) **classes_necessary_attributes** This dict descibes attributes that are necessary to initialize an instance. It a dict of list of tuples. Each attribute is described by a tuple: * for standard type, the tuple is: (name + python type) * for np.ndarray type, the tuple is: (name + np.ndarray + ndim + dtype) * for pq.Quantities, the tuple is: (name + pq.Quantity + ndim) ndim is the dimensionaly of the array: 1=vector, 2=matrix, 3=cube, ... Special case: ndim=0 means that neo expects a scalar, so Quantity.shape=(1,). That is in fact a vector (ndim=1) with one element only in Quantities package. For some neo.object, the data is not held by a field, but by the object itself. This is the case for AnalogSignal, SpikeTrain: they inherit from Quantity, which itself inherits from numpy.array. In theses cases, the classes_inheriting_quantities dict provide a list of classes inhiriting Quantity and there attribute that will become Quantity itself. **classes_recommended_attributes** This dict describes recommended attributes, which are optional at initialization. If present, they will be stored as attributes of the object. The notation is the same as classes_necessary_attributes. """ from datetime import datetime import numpy as np import quantities as pq from neo.core import objectlist class_by_name = {} name_by_class = {} for ob in objectlist: class_by_name[ob.__name__] = ob name_by_class[ob] = ob.__name__ # parent to children one_to_many_relationship = { 'Block': ['Segment', 'RecordingChannelGroup'], 'Segment': ['AnalogSignal', 'AnalogSignalArray', 'IrregularlySampledSignal', 'Event', 'EventArray', 'Epoch', 'EpochArray', 'SpikeTrain', 'Spike'], 'RecordingChannel': ['AnalogSignal', 'IrregularlySampledSignal'], 'RecordingChannelGroup': ['Unit', 'AnalogSignalArray'], 'Unit': ['SpikeTrain', 'Spike'] } # reverse: child to parent many_to_one_relationship = {} for p, children in one_to_many_relationship.items(): for c in children: if c not in many_to_one_relationship: many_to_one_relationship[c] = [] if p not in many_to_one_relationship[c]: many_to_one_relationship[c].append(p) many_to_many_relationship = { 'RecordingChannel': ['RecordingChannelGroup'], 'RecordingChannelGroup': ['RecordingChannel'], } # check bijectivity for p, children in many_to_many_relationship.items(): for c in children: if c not in many_to_many_relationship: many_to_many_relationship[c] = [] if p not in many_to_many_relationship[c]: many_to_many_relationship[c].append(p) # Some relationship shortcuts are accesible througth properties property_relationship = { 'Block': ['Unit', 'RecordingChannel'] } # these relationships are used by IOs which do not natively support non-tree # structures like NEO to avoid object duplications when saving/retrieving # objects from the data source. We can call em "secondary" connections implicit_relationship = { 'RecordingChannel': ['AnalogSignal', 'IrregularlySampledSignal'], 'RecordingChannelGroup': ['AnalogSignalArray'], 'Unit': ['SpikeTrain', 'Spike'] } classes_necessary_attributes = { 'Block': [], 'Segment': [], 'Event': [('time', pq.Quantity, 0), ('label', str)], 'EventArray': [('times', pq.Quantity, 1), ('labels', np.ndarray, 1, np.dtype('S'))], 'Epoch': [('time', pq.Quantity, 0), ('duration', pq.Quantity, 0), ('label', str)], 'EpochArray': [('times', pq.Quantity, 1), ('durations', pq.Quantity, 1), ('labels', np.ndarray, 1, np.dtype('S'))], 'Unit': [], 'SpikeTrain': [('times', pq.Quantity, 1), ('t_start', pq.Quantity, 0), ('t_stop', pq.Quantity, 0)], 'Spike': [('time', pq.Quantity, 0)], 'AnalogSignal': [('signal', pq.Quantity, 1), ('sampling_rate', pq.Quantity, 0), ('t_start', pq.Quantity, 0)], 'AnalogSignalArray': [('signal', pq.Quantity, 2), ('sampling_rate', pq.Quantity, 0), ('t_start', pq.Quantity, 0)], 'IrregularlySampledSignal': [('times', pq.Quantity, 1), ('signal', pq.Quantity, 1)], 'RecordingChannelGroup': [], 'RecordingChannel': [('index', int)], } classes_recommended_attributes = { 'Block': [('file_datetime', datetime), ('rec_datetime', datetime), ('index', int), ], 'Segment': [('file_datetime', datetime), ('rec_datetime', datetime), ('index', int)], 'Event': [], 'EventArray': [], 'Epoch': [], 'EpochArray': [], 'Unit': [], 'SpikeTrain': [('waveforms', pq.Quantity, 3), ('left_sweep', pq.Quantity, 0), ('sampling_rate', pq.Quantity, 0)], 'Spike': [('waveform', pq.Quantity, 2), ('left_sweep', pq.Quantity, 0), ('sampling_rate', pq.Quantity, 0)], 'AnalogSignal': [('channel_index', int)], 'Unit': [('channel_indexes', np.ndarray, 1, np.dtype('i'))], 'AnalogSignalArray': [('channel_indexes', np.ndarray, 1, np.dtype('i'))], 'IrregularlySampledSignal': [], 'RecordingChannelGroup': [('channel_indexes', np.ndarray, 1, np.dtype('i')), ('channel_names', np.ndarray, 1, np.dtype('S'))], 'RecordingChannel': [('coordinate', pq.Quantity, 1)], } # this list classes inheriting quantities with arguments that will become # the quantity array classes_inheriting_quantities = { 'SpikeTrain': 'times', 'AnalogSignal': 'signal', 'AnalogSignalArray': 'signal', 'IrregularlySampledSignal': 'signal', } # all classes can have name, description, file_origin for k in classes_recommended_attributes.keys(): classes_recommended_attributes[k] += [('name', str), ('description', str), ('file_origin', str)] neo-0.3.3/neo/core/0000755000175000017500000000000012273723667015072 5ustar sgarciasgarcia00000000000000neo-0.3.3/neo/core/recordingchannel.py0000644000175000017500000001032612273723542020743 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`RecordingChannel`, a container for recordings coming from a single data channel. :class:`RecordingChannel` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function from neo.core.baseneo import BaseNeo class RecordingChannel(BaseNeo): ''' A container for recordings coming from a single data channel. A :class:`RecordingChannel` is a container for :class:`AnalogSignal` and :class:`IrregularlySampledSignal`objects that come from the same logical and/or physical channel inside a :class:`Block`. Note that a :class:`RecordingChannel` can belong to several :class:`RecordingChannelGroup` objects. *Usage* one :class:`Block` with 3 :class:`Segment` objects, 16 :class:`RecordingChannel` objects, and 48 :class:`AnalogSignal` objects:: >>> from neo.core import (Block, Segment, RecordingChannelGroup, ... RecordingChannel, AnalogSignal) >>> from quantities import mA, Hz >>> import numpy as np >>> >>> # Create a Block ... blk = Block() >>> >>> # Create a new RecordingChannelGroup and add it to the Block ... rcg = RecordingChannelGroup(name='all channels') >>> blk.recordingchannelgroups.append(rcg) >>> >>> # Create 3 Segment and 16 RecordingChannel objects and add them to ... # the Block ... for ind in range(3): ... seg = Segment(name='segment %d' % ind, index=ind) ... blk.segments.append(seg) ... >>> for ind in range(16): ... chan = RecordingChannel(index=ind) ... rcg.recordingchannels.append(chan) # <- many to many ... # relationship ... chan.recordingchannelgroups.append(rcg) # <- many to many ... # relationship ... >>> # Populate the Block with AnalogSignal objects ... for seg in blk.segments: ... for chan in rcg.recordingchannels: ... sig = AnalogSignal(np.random.rand(100000)*mA, ... sampling_rate=20*Hz) ... seg.analogsignals.append(sig) ... chan.analogsignals.append(sig) *Required attributes/properties*: :index: (int) You can use this to order :class:`RecordingChannel` objects in an way you want. *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. :coordinate: (quantity array 1D (x, y, z)) Coordinates of the channel in the brain. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Container of*: :class:`AnalogSignal` :class:`IrregularlySampledSignal` ''' def __init__(self, index=0, coordinate=None, name=None, description=None, file_origin=None, **annotations): ''' Initialize a new :class:`RecordingChannel` instance. ''' # Inherited initialization # Sets universally recommended attributes, and places all others # in annotations BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) # Store required and recommended attributes self.index = index self.coordinate = coordinate # Initialize contianers self.analogsignals = [] self.irregularlysampledsignals = [] # Many to many relationship self.recordingchannelgroups = [] def merge(self, other): ''' Merge the contents of another RecordingChannel into this one. Objects from the other RecordingChannel will be added to this one. ''' for container in ("analogsignals", "irregularlysampledsignals"): getattr(self, container).extend(getattr(other, container)) # TODO: merge annotations neo-0.3.3/neo/core/unit.py0000644000175000017500000000616312273723542016421 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`Unit`, a container of :class:`Spike` and :class:`SpikeTrain` objects from a unit. :class:`Unit` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function from neo.core.baseneo import BaseNeo class Unit(BaseNeo): ''' A container of :class:`Spike` and :class:`SpikeTrain` objects from a unit. A :class:`Unit` regroups all the :class:`SpikeTrain` and :class:`Spike` objects that were emitted by a single spike source during a :class:`Block`. A spike source is often a single neuron but doesn't have to be. The spikes may come from different :class:`Segment` objects within the :class:`Block`, so this object is not contained in the usual :class:`Block`/ :class:`Segment`/:class:`SpikeTrain` hierarchy. A :class:`Unit` is linked to :class:`RecordingChannelGroup` objects from which it was detected. With tetrodes, for instance, multiple channels may record the same :class:`Unit`. *Usage*:: >>> from neo.core import Unit, SpikeTrain >>> >>> unit = Unit(name='pyramidal neuron') >>> >>> train0 = SpikeTrain(times=[.01, 3.3, 9.3], units='sec', t_stop=10) >>> unit.spiketrains.append(train0) >>> >>> train1 = SpikeTrain(times=[100.01, 103.3, 109.3], units='sec', ... t_stop=110) >>> unit.spiketrains.append(train1) *Required attributes/properties*: None *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. :channel_index: (numpy array 1D dtype='i') You can use this to order :class:`Unit` objects in an way you want. It can have any number of elements. :class:`AnalogSignal` and :class:`AnalogSignalArray` objects can be given indexes as well so related objects can be linked together. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Container of*: :class:`SpikeTrain` :class:`Spike` ''' def __init__(self, name=None, description=None, file_origin=None, channel_indexes=None, **annotations): ''' Initialize a new :clas:`Unit` instance (spike source) ''' BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) self.channel_indexes = channel_indexes self.spiketrains = [] self.spikes = [] self.recordingchannelgroup = None def merge(self, other): ''' Merge the contents of another :class:`Unit` into this one. Child objects of the other :class:`Unit` will be added to this one. ''' for container in ("spikes", "spiketrains"): getattr(self, container).extend(getattr(other, container)) # TODO: merge annotations neo-0.3.3/neo/core/spike.py0000644000175000017500000000715012273723542016552 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`Spike`, a single spike with an optional waveform. :class:`Spike` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import quantities as pq from neo.core.baseneo import BaseNeo class Spike(BaseNeo): ''' A single spike. Object to represent one spike emitted by a :class:`Unit` and represented by its time occurence and optional waveform. *Usage*:: >>> from quantities import s >>> spk = Spike(3*s) >>> spk.time array(3.0) * s *Required attributes/properties*: :time: (quantity) The time of the spike. *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. :waveforms: (quantity array 2D (channel_index, time)) The waveform of the spike. :sampling_rate: (quantity scalar) Number of samples per unit time for the waveform. :left_sweep: (quantity scalar) Time from the beginning of the waveform to the trigger time of the spike. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Properties available on this object*: :sampling_period: (quantity scalar) Interval between two samples. (1/:attr:`sampling_rate`) :duration: (quantity scalar) Duration of :attr:`waveform`, read-only. (:attr:`waveform`.shape[1] * :attr:`sampling_period`) :right_sweep: (quantity scalar) Time from the trigger time of the spike to the end of the :attr:`waveform`, read-only. (:attr:`left_sweep` + :attr:`duration`) ''' def __init__(self, time=0 * pq.s, waveform=None, sampling_rate=None, left_sweep=None, name=None, description=None, file_origin=None, **annotations): ''' Initialize a new :class:`Spike` instance. ''' BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) self.time = time self.waveform = waveform self.left_sweep = left_sweep self.sampling_rate = sampling_rate self.segment = None self.unit = None @property def duration(self): ''' Returns the duration of the :attr:`waveform`. (:attr:`waveform`.shape[1] * :attr:`sampling_period`) ''' if self.waveform is None or self.sampling_rate is None: return None return self.waveform.shape[1] / self.sampling_rate @property def right_sweep(self): ''' Time from the trigger time of the spike to the end of the :attr:`waveform`. (:attr:`left_sweep` + :attr:`duration`) ''' dur = self.duration if dur is None or self.left_sweep is None: return None return self.left_sweep + dur @property def sampling_period(self): ''' Interval between two samples. (1/:attr:`sampling_rate`) ''' if self.sampling_rate is None: return None return 1.0 / self.sampling_rate @sampling_period.setter def sampling_period(self, period): ''' Setter for :attr:`sampling_period`. ''' if period is None: self.sampling_rate = None else: self.sampling_rate = 1.0 / period neo-0.3.3/neo/core/epocharray.py0000644000175000017500000001047012273723542017573 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`EpochArray`, an array of epochs. Introduced for performance reasons. :class:`EpochArray` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import sys import numpy as np import quantities as pq from neo.core.baseneo import BaseNeo, merge_annotations PY_VER = sys.version_info[0] class EpochArray(BaseNeo): ''' Array of epochs. Introduced for performance reason. An :class:`EpochArray` is prefered to a list of :class:`Epoch` objects. *Usage*:: >>> from neo.core import EpochArray >>> from quantities import s, ms >>> import numpy as np >>> >>> epcarr = EpochArray(times=np.arange(0, 30, 10)*s, ... durations=[10, 5, 7]*ms, ... labels=np.array(['btn0', 'btn1', 'btn2'], ... dtype='S')) >>> >>> epcarr.times array([ 0., 10., 20.]) * s >>> epcarr.durations array([ 10., 5., 7.]) * ms >>> epcarr.labels array(['btn0', 'btn1', 'btn2'], dtype='|S4') *Required attributes/properties*: :times: (quantity array 1D) The starts of the time periods. :durations: (quantity array 1D) The length of the time period. :labels: (numpy.array 1D dtype='S') Names or labels for the time periods. *Recommended attributes/properties*: :name: (str) A label for the dataset, :description: (str) Text description, :file_origin: (str) Filesystem path or URL of the original data file. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`, ''' def __init__(self, times=None, durations=None, labels=None, name=None, description=None, file_origin=None, **annotations): ''' Initialize a new :class:`EpochArray` instance. ''' BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) if times is None: times = np.array([]) * pq.s if durations is None: durations = np.array([]) * pq.s if labels is None: labels = np.array([], dtype='S') self.times = times self.durations = durations self.labels = labels self.segment = None def __repr__(self): ''' Returns a string representing the :class:`EpochArray`. ''' # need to convert labels to unicode for python 3 or repr is messed up if PY_VER == 3: labels = self.labels.astype('U') else: labels = self.labels objs = ['%s@%s for %s' % (label, time, dur) for label, time, dur in zip(labels, self.times, self.durations)] return '' % ', '.join(objs) def merge(self, other): ''' Merge the another :class:`EpochArray` into this one. The :class:`EpochArray` objects are concatenated horizontally (column-wise), :func:`np.hstack`). If the attributes of the two :class:`EpochArray` are not compatible, and Exception is raised. ''' othertimes = other.times.rescale(self.times.units) otherdurations = other.durations.rescale(self.durations.units) times = np.hstack([self.times, othertimes]) * self.times.units durations = np.hstack([self.durations, otherdurations]) * self.durations.units labels = np.hstack([self.labels, other.labels]) kwargs = {} for name in ("name", "description", "file_origin"): attr_self = getattr(self, name) attr_other = getattr(other, name) if attr_self == attr_other: kwargs[name] = attr_self else: kwargs[name] = "merge(%s, %s)" % (attr_self, attr_other) merged_annotations = merge_annotations(self.annotations, other.annotations) kwargs.update(merged_annotations) return EpochArray(times=times, durations=durations, labels=labels, **kwargs) neo-0.3.3/neo/core/block.py0000644000175000017500000001373712273723542016541 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`Block`, the main container gathering all the data, whether discrete or continous, for a given recording session. base class used by all :module:`neo.core` classes. :class:`Block` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function from neo.core.baseneo import BaseNeo class Block(BaseNeo): ''' Main container for data. Main container gathering all the data, whether discrete or continous, for a given recording session. A block is not necessarily temporally homogeneous, in contrast to Segment. *Usage*:: >>> from neo.core import (Block, Segment, RecordingChannelGroup, ... AnalogSignalArray) >>> from quantities import nA, kHz >>> import numpy as np >>> >>> # create a Block with 3 Segment and 2 RecordingChannelGroup objects ,,, blk = Block() >>> for ind in range(3): ... seg = Segment(name='segment %d' % ind, index=ind) ... blk.segments.append(seg) ... >>> for ind in range(2): ... rcg = RecordingChannelGroup(name='Array probe %d' % ind, ... channel_indexes=np.arange(64)) ... blk.recordingchannelgroups.append(rcg) ... >>> # Populate the Block with AnalogSignalArray objects ... for seg in blk.segments: ... for rcg in blk.recordingchannelgroups: ... a = AnalogSignalArray(np.random.randn(10000, 64)*nA, ... sampling_rate=10*kHz) ... rcg.analogsignalarrays.append(a) ... seg.analogsignalarrays.append(a) *Required attributes/properties*: None *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. :file_datetime: (datetime) The creation date and time of the original data file. :rec_datetime: (datetime) The date and time of the original recording. :index: (int) You can use this to define an ordering of your Block. It is not used by Neo in any way. *Properties available on this object*: :list_units: descends through hierarchy and returns a list of :class:`Unit` objects existing in the block. This shortcut exists because a common analysis case is analyzing all neurons that you recorded in a session. :list_recordingchannels: descends through hierarchy and returns a list of :class:`RecordingChannel` objects existing in the block. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Container of*: :class:`Segment` :class:`RecordingChannelGroup` ''' def __init__(self, name=None, description=None, file_origin=None, file_datetime=None, rec_datetime=None, index=None, **annotations): ''' Initalize a new :class:`Block` instance. ''' BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) self.file_datetime = file_datetime self.rec_datetime = rec_datetime self.index = index self.segments = [] self.recordingchannelgroups = [] @property def list_units(self): ''' Return a list of all :class:`Unit` objects in the :class:`Block`. ''' units = [] for rcg in self.recordingchannelgroups: for unit in rcg.units: if unit not in units: units.append(unit) return units @property def list_recordingchannels(self): ''' Return a list of all :class:`RecordingChannel` objects in the :class:`Block`. ''' all_rc = [] for rcg in self.recordingchannelgroups: for rc in rcg.recordingchannels: if rc not in all_rc: all_rc.append(rc) return all_rc def merge(self, other): ''' Merge the contents of another block into this one. For each :class:`Segment` in the other block, if its name matches that of a :class:`Segment` in this block, the two segments will be merged, otherwise it will be added as a new segment. The equivalent procedure is then applied to each :class:`RecordingChannelGroup`. ''' for container in ("segments", "recordingchannelgroups"): lookup = dict((obj.name, obj) for obj in getattr(self, container)) for obj in getattr(other, container): if obj.name in lookup: lookup[obj.name].merge(obj) else: lookup[obj.name] = obj getattr(self, container).append(obj) # TODO: merge annotations _repr_pretty_attrs_keys_ = [ "name", "description", "annotations", "file_origin", "file_datetime", "rec_datetime", "index"] def _repr_pretty_(self, pp, cycle): ''' Handle pretty-printing the :class:`Block`. ''' pp.text("{0} with {1} segments and {1} groups".format( self.__class__.__name__, len(self.segments), len(self.recordingchannelgroups), )) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) if self.segments: pp.breakable() pp.text("# Segments") pp.breakable() for (i, seg) in enumerate(self.segments): if i > 0: pp.breakable() pp.text("{0}: ".format(i)) with pp.indent(3): pp.pretty(seg) neo-0.3.3/neo/core/__init__.py0000644000175000017500000000335612265516260017200 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ :mod:`neo.core` provides classes for storing common electrophysiological data types. Some of these classes contain raw data, such as spike trains or analog signals, while others are containers to organize other classes (including both data classes and other container classes). Classes from :mod:`neo.io` return nested data structures containing one or more class from this module. Classes: .. autoclass:: Block .. autoclass:: Segment .. autoclass:: RecordingChannelGroup .. autoclass:: RecordingChannel .. autoclass:: Unit .. autoclass:: AnalogSignal .. autoclass:: AnalogSignalArray .. autoclass:: IrregularlySampledSignal .. autoclass:: Event .. autoclass:: EventArray .. autoclass:: Epoch .. autoclass:: EpochArray .. autoclass:: Spike .. autoclass:: SpikeTrain """ # needed for python 3 compatibility from __future__ import absolute_import, division, print_function from neo.core.block import Block from neo.core.segment import Segment from neo.core.recordingchannelgroup import RecordingChannelGroup from neo.core.recordingchannel import RecordingChannel from neo.core.unit import Unit from neo.core.analogsignal import AnalogSignal from neo.core.analogsignalarray import AnalogSignalArray from neo.core.irregularlysampledsignal import IrregularlySampledSignal from neo.core.event import Event from neo.core.eventarray import EventArray from neo.core.epoch import Epoch from neo.core.epocharray import EpochArray from neo.core.spike import Spike from neo.core.spiketrain import SpikeTrain objectlist = [Block, Segment, RecordingChannelGroup, RecordingChannel, AnalogSignal, AnalogSignalArray, IrregularlySampledSignal, Event, EventArray, Epoch, EpochArray, Unit, Spike, SpikeTrain ] neo-0.3.3/neo/core/baseneo.py0000644000175000017500000001421512273723542017053 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`BaseNeo`, the abstract base class used by all :module:`neo.core` classes. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function from datetime import datetime, date, time, timedelta from decimal import Decimal import logging from numbers import Number import numpy as np ALLOWED_ANNOTATION_TYPES = (int, float, complex, str, bytes, type(None), datetime, date, time, timedelta, Number, Decimal, np.number, np.bool_) # handle both Python 2 and Python 3 try: ALLOWED_ANNOTATION_TYPES += (long, unicode) except NameError: pass try: basestring except NameError: basestring = str logger = logging.getLogger("Neo") def _check_annotations(value): ''' Recursively check that value is either of a "simple" type (number, string, date/time) or is a (possibly nested) dict, list or numpy array containing only simple types. ''' if isinstance(value, np.ndarray): if not issubclass(value.dtype.type, ALLOWED_ANNOTATION_TYPES): raise ValueError("Invalid annotation. NumPy arrays with dtype %s" "are not allowed" % value.dtype.type) elif isinstance(value, dict): for element in value.values(): _check_annotations(element) elif isinstance(value, (list, tuple)): for element in value: _check_annotations(element) elif not isinstance(value, ALLOWED_ANNOTATION_TYPES): raise ValueError("Invalid annotation. Annotations of type %s are not" "allowed" % type(value)) def merge_annotation(a, b): ''' First attempt at a policy for merging annotations (intended for use with parallel computations using MPI). This policy needs to be discussed further, or we could allow the user to specify a policy. Current policy: for arrays: concatenate the two arrays otherwise: fail if the annotations are not equal ''' assert type(a) == type(b) if isinstance(a, dict): return merge_annotations(a, b) elif isinstance(a, np.ndarray): # concatenate b to a return np.append(a, b) elif isinstance(a, basestring): if a == b: return a else: return a + ";" + b else: assert a == b return a def merge_annotations(A, B): ''' Merge two sets of annotations. ''' merged = {} for name in A: if name in B: merged[name] = merge_annotation(A[name], B[name]) else: merged[name] = A[name] for name in B: if name not in merged: merged[name] = B[name] logger.debug("Merging annotations: A=%s B=%s merged=%s", A, B, merged) return merged class BaseNeo(object): '''This is the base class from which all Neo objects inherit. This class implements support for universally recommended arguments, and also sets up the :attr:`annotations` dict for additional arguments. The following "universal" methods are available: :__init__: Grabs the universally recommended arguments :attr:`name`, :attr:`file_origin`, and :attr:`description` and stores them as attributes. Also takes every additional argument (that is, every argument that is not handled by :class:`BaseNeo` or the child class), and puts in the dict :attr:`annotations`. :annotate(**args): Updates :attr:`annotations` with keyword/value pairs. Each child class should: 0) call BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) with the universal recommended arguments, plus optional annotations 1) process its required arguments in its __new__ or __init__ method 2) process its non-universal recommended arguments (in its __new__ or __init__ method Non-keyword arguments should only be used for required arguments. The required and recommended arguments for each child class (Neo object) are specified in :module:`neo.description` and the documentation for the child object. ''' def __init__(self, name=None, file_origin=None, description=None, **annotations): ''' This is the base constructor for all Neo objects. Stores universally recommended attributes and creates :attr:`annotations` from additional arguments not processed by :class:`BaseNeo` or the child class. ''' # create `annotations` for additional arguments _check_annotations(annotations) self.annotations = annotations # these attributes are recommended for all objects. self.name = name self.description = description self.file_origin = file_origin def annotate(self, **annotations): ''' Add annotations (non-standardized metadata) to a Neo object. Example: >>> obj.annotate(key1=value0, key2=value1) >>> obj.key2 value2 ''' _check_annotations(annotations) self.annotations.update(annotations) _repr_pretty_attrs_keys_ = ["name", "description", "annotations"] def _has_repr_pretty_attrs_(self): return any(getattr(self, k) for k in self._repr_pretty_attrs_keys_) def _repr_pretty_attrs_(self, pp, cycle): first = True for key in self._repr_pretty_attrs_keys_: value = getattr(self, key) if value: if first: first = False else: pp.breakable() with pp.group(indent=1): pp.text("{0}: ".format(key)) pp.pretty(value) def _repr_pretty_(self, pp, cycle): ''' Handle pretty-printing the :class:`BaseNeo`. ''' pp.text(self.__class__.__name__) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) neo-0.3.3/neo/core/irregularlysampledsignal.py0000644000175000017500000003215312273723542022545 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module implements :class:`IrregularlySampledSignal` an analog signal with samples taken at arbitrary time points. :class:`IrregularlySampledSignal` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`, and from :class:`quantites.Quantity`, which inherits from :class:`numpy.array`. Inheritance from :class:`numpy.array` is explained here: http://docs.scipy.org/doc/numpy/user/basics.subclassing.html In brief: * Initialization of a new object from constructor happens in :meth:`__new__`. This is where user-specified attributes are set. * :meth:`__array_finalize__` is called for all new objects, including those created by slicing. This is where attributes are copied over from the old object. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import numpy as np import quantities as pq from neo.core.baseneo import BaseNeo class IrregularlySampledSignal(BaseNeo, pq.Quantity): ''' An analog signal with samples taken at arbitrary time points. A representation of a continuous, analog signal acquired at time :attr:`t_start` with a varying sampling interval. *Usage*:: >>> from neo.core import IrregularlySampledSignal >>> from quantities import s, nA >>> >>> irsig0 = IrregularlySampledSignal([0.0, 1.23, 6.78], [1, 2, 3], ... units='mV', time_units='ms') >>> irsig1 = IrregularlySampledSignal([0.01, 0.03, 0.12]*s, ... [4, 5, 6]*nA) *Required attributes/properties*: :times: (quantity array 1D, numpy array 1D, or list) The data itself. :signal: (quantity array 1D, numpy array 1D, or list) The time of each data point. Must have the same size as :attr:`times`. :units: (quantity units) Required if the signal is a list or NumPy array, not if it is a :class:`Quantity`. :time_units: (quantity units) Required if :attr`times` is a list or NumPy array, not if it is a :class:`Quantity`. *Recommended attributes/properties*:. :name: (str) A label for the dataset :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. *Optional attributes/properties*: :dtype: (numpy dtype or str) Override the dtype of the signal array. (times are always floats). :copy: (bool) True by default. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Properties available on this object*: :sampling_intervals: (quantity array 1D) Interval between each adjacent pair of samples. (:attr:`times[1:]` - :attr:`times`[:-1]) :duration: (quantity scalar) Signal duration, read-only. (:attr:`times`[-1] - :attr:`times`[0]) :t_start: (quantity scalar) Time when signal begins, read-only. (:attr:`times`[0]) :t_stop: (quantity scalar) Time when signal ends, read-only. (:attr:`times`[-1]) *Slicing*: :class:`IrregularlySampledSignal` objects can be sliced. When this occurs, a new :class:`IrregularlySampledSignal` (actually a view) is returned, with the same metadata, except that :attr:`times` is also sliced in the same way. *Operations available on this object*: == != + * / ''' def __new__(cls, times, signal, units=None, time_units=None, dtype=None, copy=True, name=None, description=None, file_origin=None, **annotations): ''' Construct a new :class:`IrregularlySampledSignal` instance. This is called whenever a new :class:`IrregularlySampledSignal` is created from the constructor, but not when slicing. ''' if len(times) != len(signal): raise ValueError("times array and signal array must " + "have same length") if units is None: if hasattr(signal, "units"): units = signal.units else: raise ValueError("Units must be specified") elif isinstance(signal, pq.Quantity): # could improve this test, what if units is a string? if units != signal.units: signal = signal.rescale(units) if time_units is None: if hasattr(times, "units"): time_units = times.units else: raise ValueError("Time units must be specified") elif isinstance(times, pq.Quantity): # could improve this test, what if units is a string? if time_units != times.units: times = times.rescale(time_units) # should check time units have correct dimensions obj = pq.Quantity.__new__(cls, signal, units=units, dtype=dtype, copy=copy) obj.times = pq.Quantity(times, units=time_units, dtype=float, copy=copy) obj.segment = None obj.recordingchannel = None return obj def __init__(self, times, signal, units=None, time_units=None, dtype=None, copy=True, name=None, description=None, file_origin=None, **annotations): ''' Initializes a newly constructed :class:`IrregularlySampledSignal` instance. ''' BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) def __array_finalize__(self, obj): ''' This is called every time a new :class:`IrregularlySampledSignal` is created. It is the appropriate place to set default values for attributes for :class:`IrregularlySampledSignal` constructed by slicing or viewing. User-specified values are only relevant for construction from constructor, and these are set in __new__. Then they are just copied over here. ''' super(IrregularlySampledSignal, self).__array_finalize__(obj) self.times = getattr(obj, 'times', None) # The additional arguments self.annotations = getattr(obj, 'annotations', None) # Globally recommended attributes self.name = getattr(obj, 'name', None) self.file_origin = getattr(obj, 'file_origin', None) self.description = getattr(obj, 'description', None) def __repr__(self): ''' Returns a string representing the :class:`IrregularlySampledSignal`. ''' return '<%s(%s at times %s)>' % (self.__class__.__name__, super(IrregularlySampledSignal, self).__repr__(), self.times) def __getslice__(self, i, j): ''' Get a slice from :attr:`i` to :attr:`j`. Doesn't get called in Python 3, :meth:`__getitem__` is called instead ''' obj = super(IrregularlySampledSignal, self).__getslice__(i, j) obj.times = self.times.__getslice__(i, j) return obj def __getitem__(self, i): ''' Get the item or slice :attr:`i`. ''' obj = super(IrregularlySampledSignal, self).__getitem__(i) if isinstance(obj, IrregularlySampledSignal): obj.times = self.times.__getitem__(i) return obj @property def duration(self): ''' Signal duration. (:attr:`times`[-1] - :attr:`times`[0]) ''' return self.times[-1] - self.times[0] @property def t_start(self): ''' Time when signal begins. (:attr:`times`[0]) ''' return self.times[0] @property def t_stop(self): ''' Time when signal ends. (:attr:`times`[-1]) ''' return self.times[-1] def __eq__(self, other): ''' Equality test (==) ''' return (super(IrregularlySampledSignal, self).__eq__(other).all() and (self.times == other.times).all()) def __ne__(self, other): ''' Non-equality test (!=) ''' return not self.__eq__(other) def _apply_operator(self, other, op, *args): ''' Handle copying metadata to the new :class:`IrregularlySampledSignal` after a mathematical operation. ''' self._check_consistency(other) f = getattr(super(IrregularlySampledSignal, self), op) new_signal = f(other, *args) new_signal._copy_data_complement(self) return new_signal def _check_consistency(self, other): ''' Check if the attributes of another :class:`IrregularlySampledSignal` are compatible with this one. ''' # if not an array, then allow the calculation if not hasattr(other, 'ndim'): return # if a scalar array, then allow the calculation if not other.ndim: return # dimensionality should match if self.ndim != other.ndim: raise ValueError('Dimensionality does not match: %s vs %s' % (self.ndim, other.ndim)) # if if the other array does not have a times property, # then it should be okay to add it directly if not hasattr(other, 'times'): return # if there is a times property, the times need to be the same if not (self.times == other.times).all(): raise ValueError('Times do not match: %s vs %s' % (self.times, other.times)) def _copy_data_complement(self, other): ''' Copy the metadata from another :class:`IrregularlySampledSignal`. ''' for attr in ("times", "name", "file_origin", "description", "channel_index", "annotations"): setattr(self, attr, getattr(other, attr, None)) def __add__(self, other, *args): ''' Addition (+) ''' return self._apply_operator(other, "__add__", *args) def __sub__(self, other, *args): ''' Subtraction (-) ''' return self._apply_operator(other, "__sub__", *args) def __mul__(self, other, *args): ''' Multiplication (*) ''' return self._apply_operator(other, "__mul__", *args) def __truediv__(self, other, *args): ''' Float division (/) ''' return self._apply_operator(other, "__truediv__", *args) def __div__(self, other, *args): ''' Integer division (//) ''' return self._apply_operator(other, "__div__", *args) __radd__ = __add__ __rmul__ = __sub__ def __rsub__(self, other, *args): ''' Backwards subtraction (other-self) ''' return self.__mul__(-1) + other @property def sampling_intervals(self): ''' Interval between each adjacent pair of samples. (:attr:`times[1:]` - :attr:`times`[:-1]) ''' return self.times[1:] - self.times[:-1] def mean(self, interpolation=None): ''' Calculates the mean, optionally using interpolation between sampling times. If :attr:`interpolation` is None, we assume that values change stepwise at sampling times. ''' if interpolation is None: return (self[:-1]*self.sampling_intervals).sum()/self.duration else: raise NotImplementedError def resample(self, at=None, interpolation=None): ''' Resample the signal, returning either an :class:`AnalogSignal` object or another :class:`IrregularlySampledSignal` object. Arguments: :at: either a :class:`Quantity` array containing the times at which samples should be created (times must be within the signal duration, there is no extrapolation), a sampling rate with dimensions (1/Time) or a sampling interval with dimensions (Time). :interpolation: one of: None, 'linear' ''' # further interpolation methods could be added raise NotImplementedError def rescale(self, units): ''' Return a copy of the :class:`IrregularlySampledSignal` converted to the specified units ''' to_dims = pq.quantity.validate_dimensionality(units) if self.dimensionality == to_dims: to_u = self.units signal = np.array(self) else: to_u = pq.Quantity(1.0, to_dims) from_u = pq.Quantity(1.0, self.dimensionality) try: cf = pq.quantity.get_conversion_factor(from_u, to_u) except AssertionError: raise ValueError('Unable to convert between units of "%s" \ and "%s"' % (from_u._dimensionality, to_u._dimensionality)) signal = cf * self.magnitude new = self.__class__(times=self.times, signal=signal, units=to_u) new._copy_data_complement(self) new.annotations.update(self.annotations) return new neo-0.3.3/neo/core/analogsignalarray.py0000644000175000017500000002572012273723542021140 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module implements :class:`AnalogSignalArray`, an array of analog signals. :class:`AnalogSignalArray` derives from :class:`BaseAnalogSignal`, from :module:`neo.core.analogsignal`. :class:`BaseAnalogSignal` inherits from :class:`quantites.Quantity`, which inherits from :class:`numpy.array`. Inheritance from :class:`numpy.array` is explained here: http://docs.scipy.org/doc/numpy/user/basics.subclassing.html In brief: * Initialization of a new object from constructor happens in :meth:`__new__`. This is where user-specified attributes are set. * :meth:`__array_finalize__` is called for all new objects, including those created by slicing. This is where attributes are copied over from the old object. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import logging import numpy as np import quantities as pq from neo.core.analogsignal import (BaseAnalogSignal, AnalogSignal, _get_sampling_rate) from neo.core.baseneo import BaseNeo, merge_annotations logger = logging.getLogger("Neo") class AnalogSignalArray(BaseAnalogSignal): ''' Several continuous analog signals A representation of several continuous, analog signals that have the same duration, sampling rate and start time. Basically, it is a 2D array like AnalogSignal: dim 0 is time, dim 1 is channel index Inherits from :class:`quantities.Quantity`, which in turn inherits from :class:`numpy.ndarray`. *Usage*:: >>> from neo.core import AnalogSignalArray >>> import quantities as pq >>> >>> sigarr = AnalogSignalArray([[1, 2, 3], [4, 5, 6]], units='V', ... sampling_rate=1*pq.Hz) >>> >>> sigarr >>> sigarr[:,1] >>> sigarr[1, 1] array(5) * V *Required attributes/properties*: :signal: (quantity array 2D, numpy array 2D, or list (data, chanel)) The data itself. :units: (quantity units) Required if the signal is a list or NumPy array, not if it is a :class:`Quantity` :t_start: (quantity scalar) Time when signal begins :sampling_rate: *or* :sampling_period: (quantity scalar) Number of samples per unit time or interval between two samples. If both are specified, they are checked for consistency. *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. :channel_index: (numpy array 1D dtype='i') You can use this to order the columns of the signal in any way you want. It should have the same number of elements as the signal has columns. :class:`AnalogSignal` and :class:`Unit` objects can be given indexes as well so related objects can be linked together. *Optional attributes/properties*: :dtype: (numpy dtype or str) Override the dtype of the signal array. :copy: (bool) True by default. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Properties available on this object*: :sampling_rate: (quantity scalar) Number of samples per unit time. (1/:attr:`sampling_period`) :sampling_period: (quantity scalar) Interval between two samples. (1/:attr:`quantity scalar`) :duration: (Quantity) Signal duration, read-only. (size * :attr:`sampling_period`) :t_stop: (quantity scalar) Time when signal ends, read-only. (:attr:`t_start` + :attr:`duration`) :times: (quantity 1D) The time points of each sample of the signal, read-only. (:attr:`t_start` + arange(:attr:`shape`[0])/:attr:`sampling_rate`) :channel_indexes: (numpy array 1D dtype='i') The same as :attr:`channel_index`, read-only. *Slicing*: :class:`AnalogSignalArray` objects can be sliced. When taking a single row (dimension 1, e.g. [:, 0]), a :class:`AnalogSignal` is returned. When taking a single element, a :class:`~quantities.Quantity` is returned. Otherwise a :class:`AnalogSignalArray` (actually a view) is returned, with the same metadata, except that :attr:`t_start` is changed if the start index along dimension 1 is greater than 1. Getting a single item returns a :class:`~quantity.Quantity` scalar. *Operations available on this object*: == != + * / ''' def __new__(cls, signal, units=None, dtype=None, copy=True, t_start=0 * pq.s, sampling_rate=None, sampling_period=None, name=None, file_origin=None, description=None, channel_index=None, **annotations): ''' Constructs new :class:`AnalogSignalArray` from data. This is called whenever a new class:`AnalogSignalArray` is created from the constructor, but not when slicing. ''' if (isinstance(signal, pq.Quantity) and units is not None and units != signal.units): signal = signal.rescale(units) if not units and hasattr(signal, "units"): units = signal.units obj = pq.Quantity.__new__(cls, signal, units=units, dtype=dtype, copy=copy) obj.t_start = t_start obj.sampling_rate = _get_sampling_rate(sampling_rate, sampling_period) obj.channel_index = channel_index obj.segment = None obj.recordingchannelgroup = None return obj def __init__(self, signal, units=None, dtype=None, copy=True, t_start=0 * pq.s, sampling_rate=None, sampling_period=None, name=None, file_origin=None, description=None, channel_index=None, **annotations): ''' Initializes a newly constructed :class:`AnalogSignalArray` instance. ''' BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) @property def channel_indexes(self): ''' The same as :attr:`channel_index`. ''' return self.channel_index def __getslice__(self, i, j): ''' Get a slice from :attr:`i` to :attr:`j`. Doesn't get called in Python 3, :meth:`__getitem__` is called instead ''' return self.__getitem__(slice(i, j)) def __getitem__(self, i): ''' Get the item or slice :attr:`i`. ''' obj = super(BaseAnalogSignal, self).__getitem__(i) if isinstance(i, int): return obj elif isinstance(i, tuple): j, k = i if isinstance(k, int): if isinstance(j, slice): # extract an AnalogSignal obj = AnalogSignal(obj, sampling_rate=self.sampling_rate) if j.start: obj.t_start = (self.t_start + j.start * self.sampling_period) # return a Quantity (for some reason quantities does not # return a Quantity in this case) elif isinstance(j, int): obj = pq.Quantity(obj, units=self.units) return obj elif isinstance(j, int): # extract a quantity array # should be a better way to do this obj = pq.Quantity(np.array(obj), units=obj.units) return obj else: return obj elif isinstance(i, slice): if i.start: obj.t_start = self.t_start + i.start * self.sampling_period return obj else: raise IndexError("index should be an integer, tuple or slice") def time_slice(self, t_start, t_stop): ''' Creates a new AnalogSignal corresponding to the time slice of the original AnalogSignal between times t_start, t_stop. Note, that for numerical stability reasons if t_start, t_stop do not fall exactly on the time bins defined by the sampling_period they will be rounded to the nearest sampling bins. ''' t_start = t_start.rescale(self.sampling_period.units) t_stop = t_stop.rescale(self.sampling_period.units) i = (t_start - self.t_start) / self.sampling_period j = (t_stop - self.t_start) / self.sampling_period i = int(np.rint(i.magnitude)) j = int(np.rint(j.magnitude)) if (i < 0) or (j > len(self)): raise ValueError('t_start, t_stop have to be withing the analog \ signal duration') # we're going to send the list of indicies so that we get *copy* of the # sliced data obj = super(BaseAnalogSignal, self).__getitem__(np.arange(i, j, 1)) obj.t_start = self.t_start + i * self.sampling_period return obj def merge(self, other): ''' Merge the another :class:`AnalogSignalArray` into this one. The :class:`AnalogSignalArray` objects are concatenated horizontally (column-wise, :func:`np.hstack`). If the attributes of the two :class:`AnalogSignalArray` are not compatible, and Exception is raised. ''' assert self.sampling_rate == other.sampling_rate assert self.t_start == other.t_start other.units = self.units stack = np.hstack(map(np.array, (self, other))) kwargs = {} for name in ("name", "description", "file_origin"): attr_self = getattr(self, name) attr_other = getattr(other, name) if attr_self == attr_other: kwargs[name] = attr_self else: kwargs[name] = "merge(%s, %s)" % (attr_self, attr_other) if self.channel_index is None: channel_index = other.channel_index elif other.channel_index is None: channel_index = self.channel_index else: channel_index = np.append(self.channel_index, other.channel_index) merged_annotations = merge_annotations(self.annotations, other.annotations) kwargs.update(merged_annotations) return AnalogSignalArray(stack, units=self.units, dtype=self.dtype, copy=False, t_start=self.t_start, sampling_rate=self.sampling_rate, channel_index=channel_index, **kwargs) neo-0.3.3/neo/core/epoch.py0000644000175000017500000000403412273723542016533 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`Epoch`, a period of time with a start point and duration. :class:`Epoch` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function from neo.core.baseneo import BaseNeo class Epoch(BaseNeo): ''' A period of time with a start point and duration. Similar to :class:`Event` but with a duration. Useful for describing a period, the state of a subject, etc. *Usage*:: >>> from neo.core import Epoch >>> from quantities import s, ms >>> >>> epc = Epoch(time=50*s, duration=200*ms, label='button pressed') >>> >>> epc.time array(50.0) * s >>> epc.duration array(200.0) * ms >>> epc.label 'button pressed' *Required attributes/properties*: :time: (quantity scalar) The start of the time period. :duration: (quantity scalar) The length of the time period. :label: (str) A name or label for the time period. *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. ''' def __init__(self, time, duration, label, name=None, description=None, file_origin=None, **annotations): ''' Initialize a new :class:`Epoch` instance. ''' BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) self.time = time self.duration = duration self.label = label self.segment = None def merge(self, other): ''' Merging is not supported in :class:`Epoch`. ''' raise NotImplementedError('Cannot merge Epoch objects') neo-0.3.3/neo/core/eventarray.py0000644000175000017500000000737212273723542017625 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`EventArray`, an array of events. Introduced for performance reasons. :class:`EventArray` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import sys import numpy as np import quantities as pq from neo.core.baseneo import BaseNeo, merge_annotations PY_VER = sys.version_info[0] class EventArray(BaseNeo): ''' Array of events. Introduced for performance reasons. An :class:`EventArray` is prefered to a list of :class:`Event` objects. *Usage*:: >>> from neo.core import EventArray >>> from quantities import s >>> import numpy as np >>> >>> evtarr = EventArray(np.arange(0, 30, 10)*s, ... labels=np.array(['trig0', 'trig1', 'trig2'], ... dtype='S')) >>> >>> evtarr.times array([ 0., 10., 20.]) * s >>> evtarr.labels array(['trig0', 'trig1', 'trig2'], dtype='|S5') *Required attributes/properties*: :times: (quantity array 1D) The time of the events. :labels: (numpy.array 1D dtype='S') Names or labels for the events. *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. ''' def __init__(self, times=None, labels=None, name=None, description=None, file_origin=None, **annotations): ''' Initialize a new :class:`EventArray` instance. ''' BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) if times is None: times = np.array([]) * pq.s if labels is None: labels = np.array([], dtype='S') self.times = times self.labels = labels self.segment = None def __repr__(self): ''' Returns a string representing the :class:`EventArray`. ''' # need to convert labels to unicode for python 3 or repr is messed up if PY_VER == 3: labels = self.labels.astype('U') else: labels = self.labels objs = ['%s@%s' % (label, time) for label, time in zip(labels, self.times)] return '' % ', '.join(objs) def merge(self, other): ''' Merge the another :class:`EventArray` into this one. The :class:`EventArray` objects are concatenated horizontally (column-wise), :func:`np.hstack`). If the attributes of the two :class:`EventArray` are not compatible, and Exception is raised. ''' othertimes = other.times.rescale(self.times.units) times = np.hstack([self.times, othertimes]) * self.times.units labels = np.hstack([self.labels, other.labels]) kwargs = {} for name in ("name", "description", "file_origin"): attr_self = getattr(self, name) attr_other = getattr(other, name) if attr_self == attr_other: kwargs[name] = attr_self else: kwargs[name] = "merge(%s, %s)" % (attr_self, attr_other) merged_annotations = merge_annotations(self.annotations, other.annotations) kwargs.update(merged_annotations) return EventArray(times=times, labels=labels, **kwargs) neo-0.3.3/neo/core/analogsignal.py0000644000175000017500000004773112273723542020107 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module implements objects relating to analog signals, :class:`BaseAnalogSignal` and its child :class:`AnalogSignal`. :class:`AnalogSignalArray` is derived from :class:`BaseAnalogSignal` but is defined in :module:`neo.core.analogsignalarray`. :class:`IrregularlySampledSignal` is not derived from :class:`BaseAnalogSignal` and is defined in :module:`neo.core.irregularlysampledsignal`. :class:`BaseAnalogSignal` inherits from :class:`quantites.Quantity`, which inherits from :class:`numpy.array`. Inheritance from :class:`numpy.array` is explained here: http://docs.scipy.org/doc/numpy/user/basics.subclassing.html In brief: * Initialization of a new object from constructor happens in :meth:`__new__`. This is where user-specified attributes are set. * :meth:`__array_finalize__` is called for all new objects, including those created by slicing. This is where attributes are copied over from the old object. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import numpy as np import quantities as pq from neo.core.baseneo import BaseNeo def _get_sampling_rate(sampling_rate, sampling_period): ''' Gets the sampling_rate from either the sampling_period or the sampling_rate, or makes sure they match if both are specified ''' if sampling_period is None: if sampling_rate is None: raise ValueError("You must provide either the sampling rate or " + "sampling period") elif sampling_rate is None: sampling_rate = 1.0 / sampling_period elif sampling_period != 1.0 / sampling_rate: raise ValueError('The sampling_rate has to be 1/sampling_period') if not hasattr(sampling_rate, 'units'): raise TypeError("Sampling rate/sampling period must have units") return sampling_rate def _new_BaseAnalogSignal(cls, signal, units=None, dtype=None, copy=True, t_start=0*pq.s, sampling_rate=None, sampling_period=None, name=None, file_origin=None, description=None, channel_index=None, annotations=None): ''' A function to map BaseAnalogSignal.__new__ to function that does not do the unit checking. This is needed for pickle to work. ''' return cls(signal=signal, units=units, dtype=dtype, copy=copy, t_start=t_start, sampling_rate=sampling_rate, sampling_period=sampling_period, name=name, file_origin=file_origin, description=description, channel_index=channel_index, **annotations) class BaseAnalogSignal(BaseNeo, pq.Quantity): ''' Base class for AnalogSignal and AnalogSignalArray ''' def __new__(cls, signal, units=None, dtype=None, copy=True, t_start=0 * pq.s, sampling_rate=None, sampling_period=None, name=None, file_origin=None, description=None, channel_index=None, **annotations): ''' Constructs new :class:`BaseAnalogSignal` from data. This is called whenever a new class:`BaseAnalogSignal` is created from the constructor, but not when slicing. __array_finalize__ is called on the new object. ''' if units is None: if hasattr(signal, "units"): units = signal.units else: raise ValueError("Units must be specified") elif isinstance(signal, pq.Quantity): # could improve this test, what if units is a string? if units != signal.units: signal = signal.rescale(units) obj = pq.Quantity.__new__(cls, signal, units=units, dtype=dtype, copy=copy) if t_start is None: raise ValueError('t_start cannot be None') obj._t_start = t_start obj._sampling_rate = _get_sampling_rate(sampling_rate, sampling_period) obj.channel_index = channel_index obj.segment = None obj.recordingchannel = None return obj def __init__(self, signal, units=None, dtype=None, copy=True, t_start=0 * pq.s, sampling_rate=None, sampling_period=None, name=None, file_origin=None, description=None, channel_index=None, **annotations): ''' Initializes a newly constructed :class:`BaseAnalogSignal` instance. ''' # This method is only called when constructing a new BaseAnalogSignal, # not when slicing or viewing. We use the same call signature # as __new__ for documentation purposes. Anything not in the call # signature is stored in annotations. # Calls parent __init__, which grabs universally recommended # attributes and sets up self.annotations BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) def __reduce__(self): ''' Map the __new__ function onto _new_BaseAnalogSignal, so that pickle works ''' return _new_BaseAnalogSignal, (self.__class__, np.array(self), self.units, self.dtype, True, self.t_start, self.sampling_rate, self.sampling_period, self.name, self.file_origin, self.description, self.channel_index, self.annotations) def __array_finalize__(self, obj): ''' This is called every time a new :class:`BaseAnalogSignal` is created. It is the appropriate place to set default values for attributes for :class:`BaseAnalogSignal` constructed by slicing or viewing. User-specified values are only relevant for construction from constructor, and these are set in __new__. Then they are just copied over here. ''' super(BaseAnalogSignal, self).__array_finalize__(obj) self._t_start = getattr(obj, '_t_start', 0 * pq.s) self._sampling_rate = getattr(obj, '_sampling_rate', None) # The additional arguments self.annotations = getattr(obj, 'annotations', None) # Globally recommended attributes self.name = getattr(obj, 'name', None) self.file_origin = getattr(obj, 'file_origin', None) self.description = getattr(obj, 'description', None) self.channel_index = getattr(obj, 'channel_index', None) def __repr__(self): ''' Returns a string representing the :class:`BaseAnalogSignal`. ''' return ('<%s(%s, [%s, %s], sampling rate: %s)>' % (self.__class__.__name__, super(BaseAnalogSignal, self).__repr__(), self.t_start, self.t_stop, self.sampling_rate)) def __getslice__(self, i, j): ''' Get a slice from :attr:`i` to :attr:`j`. Doesn't get called in Python 3, :meth:`__getitem__` is called instead ''' obj = super(BaseAnalogSignal, self).__getslice__(i, j) obj.t_start = self.t_start + i * self.sampling_period return obj def __getitem__(self, i): ''' Get the item or slice :attr:`i`. ''' obj = super(BaseAnalogSignal, self).__getitem__(i) if isinstance(obj, BaseAnalogSignal): # update t_start and sampling_rate slice_start = None slice_step = None if isinstance(i, slice): slice_start = i.start slice_step = i.step elif isinstance(i, tuple) and len(i) == 2: slice_start = i[0].start slice_step = i[0].step if slice_start: obj.t_start = self.t_start + slice_start * self.sampling_period if slice_step: obj.sampling_period *= slice_step return obj # sampling_rate attribute is handled as a property so type checking can # be done @property def sampling_rate(self): ''' Number of samples per unit time. (1/:attr:`sampling_period`) ''' return self._sampling_rate @sampling_rate.setter def sampling_rate(self, rate): ''' Setter for :attr:`sampling_rate` ''' if rate is None: raise ValueError('sampling_rate cannot be None') elif not hasattr(rate, 'units'): raise ValueError('sampling_rate must have units') self._sampling_rate = rate # sampling_period attribute is handled as a property on underlying rate @property def sampling_period(self): ''' Interval between two samples. (1/:attr:`sampling_rate`) ''' return 1. / self.sampling_rate @sampling_period.setter def sampling_period(self, period): ''' Setter for :attr:`sampling_period` ''' if period is None: raise ValueError('sampling_period cannot be None') elif not hasattr(period, 'units'): raise ValueError('sampling_period must have units') self.sampling_rate = 1. / period # t_start attribute is handled as a property so type checking can be done @property def t_start(self): ''' Time when signal begins. ''' return self._t_start @t_start.setter def t_start(self, start): ''' Setter for :attr:`t_start` ''' if start is None: raise ValueError('t_start cannot be None') self._t_start = start @property def duration(self): ''' Signal duration (:attr:`size` * :attr:`sampling_period`) ''' return self.shape[0] / self.sampling_rate @property def t_stop(self): ''' Time when signal ends. (:attr:`t_start` + :attr:`duration`) ''' return self.t_start + self.duration @property def times(self): ''' The time points of each sample of the signal (:attr:`t_start` + arange(:attr:`shape`)/:attr:`sampling_rate`) ''' return self.t_start + np.arange(self.shape[0]) / self.sampling_rate def rescale(self, units): ''' Return a copy of the AnalogSignal(Array) converted to the specified units ''' to_dims = pq.quantity.validate_dimensionality(units) if self.dimensionality == to_dims: to_u = self.units signal = np.array(self) else: to_u = pq.Quantity(1.0, to_dims) from_u = pq.Quantity(1.0, self.dimensionality) try: cf = pq.quantity.get_conversion_factor(from_u, to_u) except AssertionError: raise ValueError('Unable to convert between units of "%s" \ and "%s"' % (from_u._dimensionality, to_u._dimensionality)) signal = cf * self.magnitude new = self.__class__(signal=signal, units=to_u, sampling_rate=self.sampling_rate) new._copy_data_complement(self) new.annotations.update(self.annotations) return new def duplicate_with_new_array(self, signal): ''' Create a new :class:`BaseAnalogSignal` with the same metadata but different data ''' #signal is the new signal new = self.__class__(signal=signal, units=self.units, sampling_rate=self.sampling_rate) new._copy_data_complement(self) new.annotations.update(self.annotations) return new def __eq__(self, other): ''' Equality test (==) ''' if (self.t_start != other.t_start or self.sampling_rate != other.sampling_rate): return False return super(BaseAnalogSignal, self).__eq__(other) def __ne__(self, other): ''' Non-equality test (!=) ''' return not self.__eq__(other) def _check_consistency(self, other): ''' Check if the attributes of another :class:`BaseAnalogSignal` are compatible with this one. ''' if isinstance(other, BaseAnalogSignal): for attr in "t_start", "sampling_rate": if getattr(self, attr) != getattr(other, attr): raise ValueError("Inconsistent values of %s" % attr) # how to handle name and annotations? def _copy_data_complement(self, other): ''' Copy the metadata from another :class:`BaseAnalogSignal`. ''' for attr in ("t_start", "sampling_rate", "name", "file_origin", "description", "channel_index", "annotations"): setattr(self, attr, getattr(other, attr, None)) def _apply_operator(self, other, op, *args): ''' Handle copying metadata to the new :class:`BaseAnalogSignal` after a mathematical operation. ''' self._check_consistency(other) f = getattr(super(BaseAnalogSignal, self), op) new_signal = f(other, *args) new_signal._copy_data_complement(self) return new_signal def __add__(self, other, *args): ''' Addition (+) ''' return self._apply_operator(other, "__add__", *args) def __sub__(self, other, *args): ''' Subtraction (-) ''' return self._apply_operator(other, "__sub__", *args) def __mul__(self, other, *args): ''' Multiplication (*) ''' return self._apply_operator(other, "__mul__", *args) def __truediv__(self, other, *args): ''' Float division (/) ''' return self._apply_operator(other, "__truediv__", *args) def __div__(self, other, *args): ''' Integer division (//) ''' return self._apply_operator(other, "__div__", *args) __radd__ = __add__ __rmul__ = __sub__ def __rsub__(self, other, *args): ''' Backwards subtraction (other-self) ''' return self.__mul__(-1, *args) + other def _repr_pretty_(self, pp, cycle): ''' Handle pretty-printing the :class:`BaseAnalogSignal`. ''' pp.text(" ".join([self.__class__.__name__, "in", str(self.units), "with", "x".join(map(str, self.shape)), str(self.dtype), "values", ])) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) def _pp(line): pp.breakable() with pp.group(indent=1): pp.text(line) if hasattr(self, "channel_index"): _pp("channel index: {0}".format(self.channel_index)) for line in ["sampling rate: {0}".format(self.sampling_rate), "time: {0} to {1}".format(self.t_start, self.t_stop) ]: _pp(line) class AnalogSignal(BaseAnalogSignal): ''' A continuous analog signal. A representation of a continuous, analog signal acquired at time :attr:`t_start` at a certain sampling rate. Inherits from :class:`quantities.Quantity`, which in turn inherits from :class:`numpy.ndarray`. *Usage*:: >>> from neo.core import AnalogSignal >>> from quantities import kHz, ms, nA, s, uV >>> import numpy as np >>> >>> sig0 = AnalogSignal([1, 2, 3], sampling_rate=0.42*kHz, ... units='mV') >>> sig1 = AnalogSignal([4, 5, 6]*nA, sampling_period=42*ms) >>> sig2 = AnalogSignal(np.array([1.0, 2.0, 3.0]), t_start=42*ms, ... sampling_rate=0.42*kHz, units=uV) >>> sig3 = AnalogSignal([1], units='V', day='Monday', ... sampling_period=1*s) >>> >>> sig3 >>> sig3.annotations['day'] 'Monday' >>> sig3[0] array(1) * V >>> sig3[::2] *Required attributes/properties*: :signal: (quantity array 1D, numpy array 1D, or list) The data itself. :units: (quantity units) Required if the signal is a list or NumPy array, not if it is a :class:`Quantity` :sampling_rate: *or* :sampling_period: (quantity scalar) Number of samples per unit time or interval between two samples. If both are specified, they are checked for consistency. *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. :t_start: (quantity scalar) Time when signal begins. Default: 0.0 seconds :channel_index: (int) You can use this to order :class:`AnalogSignal` objects in an way you want. :class:`AnalogSignalArray` and :class:`Unit` objects can be given indexes as well so related objects can be linked together. *Optional attributes/properties*: :dtype: (numpy dtype or str) Override the dtype of the signal array. :copy: (bool) True by default. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Properties available on this object*: :sampling_rate: (quantity scalar) Number of samples per unit time. (1/:attr:`sampling_period`) :sampling_period: (quantity scalar) Interval between two samples. (1/:attr:`sampling_rate`) :duration: (quantity scalar) Signal duration, read-only. (:attr:`size` * :attr:`sampling_period`) :t_stop: (quantity scalar) Time when signal ends, read-only. (:attr:`t_start` + :attr:`duration`) :times: (quantity 1D) The time points of each sample of the signal, read-only. (:attr:`t_start` + arange(:attr:`shape`)/:attr:`sampling_rate`) *Slicing*: :class:`AnalogSignal` objects can be sliced. When this occurs, a new :class:`AnalogSignal` (actually a view) is returned, with the same metadata, except that :attr:`sampling_period` is changed if the step size is greater than 1, and :attr:`t_start` is changed if the start index is greater than 0. Getting a single item returns a :class:`~quantity.Quantity` scalar. *Operations available on this object*: == != + * / ''' def __new__(cls, signal, units=None, dtype=None, copy=True, t_start=0*pq.s, sampling_rate=None, sampling_period=None, name=None, file_origin=None, description=None, channel_index=None, **annotations): ''' Constructs new :class:`AnalogSignal` from data. This is called whenever a new class:`AnalogSignal` is created from the constructor, but not when slicing. ''' obj = BaseAnalogSignal.__new__(cls, signal, units, dtype, copy, t_start, sampling_rate, sampling_period, name, file_origin, description, channel_index, **annotations) return obj def merge(self, other): ''' Merging is not supported in :class:`AnalogSignal`. ''' raise NotImplementedError('Cannot merge AnalogSignal objects') neo-0.3.3/neo/core/recordingchannelgroup.py0000644000175000017500000001721512273723542022024 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`RecordingChannelGroup`, a container for multiple data channels. :class:`RecordingChannelGroup` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import numpy as np from neo.core.baseneo import BaseNeo class RecordingChannelGroup(BaseNeo): ''' A container for multiple data channels. This container have sereval purpose: * Grouping all :class:`AnalogSignalArray` inside a :class:`Block` across :class:`Segment` * Grouping :class:`RecordingChannel` inside a :class:`Block`. This case is *many to many* relation. It mean that a :class:`RecordingChannel` can belong to several group. A typical use case is tetrode (4 X :class:`RecordingChannel` inside a :class:`RecordingChannelGroup`). * Container of :class:`Unit`. A neuron decharge (:class:`Unit`) can be seen by several electrodes (4 in tetrode case). *Usage 1* multi :class:`Segment` recording with 2 electrode array:: >>> from neo.core import (Block, Segment, RecordingChannelGroup, ... AnalogSignalArray) >>> from quantities import nA, kHz >>> import numpy as np >>> >>> # create a Block with 3 Segment and 2 RecordingChannelGroup objects ,,, blk = Block() >>> for ind in range(3): ... seg = Segment(name='segment %d' % ind, index=ind) ... blk.segments.append(seg) ... >>> for ind in range(2): ... rcg = RecordingChannelGroup(name='Array probe %d' % ind, ... channel_indexes=np.arange(64)) ... blk.recordingchannelgroups.append(rcg) ... >>> # Populate the Block with AnalogSignalArray objects ... for seg in blk.segments: ... for rcg in blk.recordingchannelgroups: ... a = AnalogSignalArray(np.random.randn(10000, 64)*nA, ... sampling_rate=10*kHz) ... rcg.analogsignalarrays.append(a) ... seg.analogsignalarrays.append(a) *Usage 2* grouping channel:: >>> from neo.core import (Block, RecordingChannelGroup, ... RecordingChannel) >>> import numpy as np >>> >>> # Create a Block ,,, blk = Block() >>> >>> # Create a new RecordingChannelGroup and add it to the Block ... rcg = RecordingChannelGroup(channel_names=np.array(['ch0', ... 'ch1', ... 'ch2'])) >>> rcg.channel_indexes = np.array([0, 1, 2]) >>> blk.recordingchannelgroups.append(rcg) >>> >>> # Create 3 RecordingChannel objects and add them to the Block ... for ind in range(3): ... chan = RecordingChannel(index=ind) ... rcg.recordingchannels.append(chan) # <- many to many ,,, # relationship ... chan.recordingchannelgroups.append(rcg) # <- many to many ... # relationship *Usage 3* dealing with :class:`Unit` objects:: >>> from neo.core import Block, RecordingChannelGroup, Unit >>> >>> # Create a Block ... blk = Block() >>> >>> # Create a new RecordingChannelGroup and add it to the Block ... rcg = RecordingChannelGroup(name='octotrode A') >>> blk.recordingchannelgroups.append(rcg) >>> >>> # create several Unit objects and add them to the >>> # RecordingChannelGroup ... for ind in range(5): ... unit = Unit(name = 'unit %d' % ind, description= ... 'after a long and hard spike sorting') ... rcg.units.append(unit) *Required attributes/properties*: None *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. :channel_names: (numpy.array 1D dtype='S') Names for each :class:`RecordingChannel`. :channel_indexes: (numpy.array 1D dtype='i') Index of each :class:`RecordingChannel`. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Container of*: :class:`RecordingChannel` :class:`AnalogSignalArray` :class:`Unit` ''' def __init__(self, channel_names=None, channel_indexes=None, name=None, description=None, file_origin=None, **annotations): ''' Initialize a new :class:`RecordingChannelGroup` instance. ''' # Inherited initialization # Sets universally recommended attributes, and places all others # in annotations BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) # Defaults if channel_indexes is None: channel_indexes = np.array([], dtype=np.int) if channel_names is None: channel_names = np.array([], dtype='S') # Store recommended attributes self.channel_names = channel_names self.channel_indexes = channel_indexes # Initialize containers for child objects self.analogsignalarrays = [] self.units = [] # Many to many relationship self.recordingchannels = [] self.block = None def merge(self, other): ''' Merge the contents of another RecordingChannelGroup into this one. For each :class:`RecordingChannel` in the other RecordingChannelGroup, if its name matches that of a :class:`RecordingChannel` in this block, the two RecordingChannels will be merged, otherwise it will be added as a new RecordingChannel. The equivalent procedure is then applied to each :class:`Unit`. For each array-type object in the other :class:`RecordingChannelGroup`, if its name matches that of an object of the same type in this segment, the two arrays will be joined by concatenation. ''' for container in ("recordingchannels", "units"): lookup = dict((obj.name, obj) for obj in getattr(self, container)) for obj in getattr(other, container): if obj.name in lookup: lookup[obj.name].merge(obj) else: getattr(self, container).append(obj) for container in ("analogsignalarrays",): objs = getattr(self, container) lookup = dict((obj.name, i) for i, obj in enumerate(objs)) for obj in getattr(other, container): if obj.name in lookup: ind = lookup[obj.name] try: newobj = getattr(self, container)[ind].merge(obj) except AttributeError as e: raise AttributeError("%s. container=%s, obj.name=%s, \ shape=%s" % (e, container, obj.name, obj.shape)) getattr(self, container)[ind] = newobj else: lookup[obj.name] = obj getattr(self, container).append(obj) # TODO: merge annotations neo-0.3.3/neo/core/spiketrain.py0000644000175000017500000004647312273723542017623 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module implements :class:`SpikeTrain`, an array of spike times. :class:`SpikeTrain` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`, and from :class:`quantites.Quantity`, which inherits from :class:`numpy.array`. Inheritance from :class:`numpy.array` is explained here: http://docs.scipy.org/doc/numpy/user/basics.subclassing.html In brief: * Initialization of a new object from constructor happens in :meth:`__new__`. This is where user-specified attributes are set. * :meth:`__array_finalize__` is called for all new objects, including those created by slicing. This is where attributes are copied over from the old object. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import numpy as np import quantities as pq from neo.core.baseneo import BaseNeo def check_has_dimensions_time(*values): ''' Verify that all arguments have a dimensionality that is compatible with time. ''' errmsgs = [] for value in values: dim = value.dimensionality if (len(dim) != 1 or list(dim.values())[0] != 1 or not isinstance(list(dim.keys())[0], pq.UnitTime)): errmsgs.append("value %s has dimensions %s, not [time]" % (value, dim.simplified)) if errmsgs: raise ValueError("\n".join(errmsgs)) def _check_time_in_range(value, t_start, t_stop, view=False): ''' Verify that all times in :attr:`value` are between :attr:`t_start` and :attr:`t_stop` (inclusive. If :attr:`view` is True, vies are used for the test. Using drastically increases the speed, but is only safe if you are certain that the dtype and units are the same ''' if not value.size: return if view: value = value.view(np.ndarray) t_start = t_start.view(np.ndarray) t_stop = t_stop.view(np.ndarray) if value.min() < t_start: raise ValueError("The first spike (%s) is before t_start (%s)" % (value, t_start)) if value.max() > t_stop: raise ValueError("The last spike (%s) is after t_stop (%s)" % (value, t_stop)) def _new_spiketrain(cls, signal, t_stop, units=None, dtype=None, copy=True, sampling_rate=1.0 * pq.Hz, t_start=0.0 * pq.s, waveforms=None, left_sweep=None, name=None, file_origin=None, description=None, annotations=None): ''' A function to map :meth:`BaseAnalogSignal.__new__` to function that does not do the unit checking. This is needed for :module:`pickle` to work. ''' if annotations is None: annotations = {} return SpikeTrain(signal, t_stop, units, dtype, copy, sampling_rate, t_start, waveforms, left_sweep, name, file_origin, description, **annotations) class SpikeTrain(BaseNeo, pq.Quantity): ''' :class:`SpikeTrain` is a :class:`Quantity` array of spike times. It is an ensemble of action potentials (spikes) emitted by the same unit in a period of time. *Usage*:: >>> from neo.core import SpikeTrain >>> from quantities import s >>> >>> train = SpikeTrain([3, 4, 5]*s, t_stop=10.0) >>> train2 = train[1:3] >>> >>> train.t_start array(0.0) * s >>> train.t_stop array(10.0) * s >>> train >>> train2 *Required attributes/properties*: :times: (quantity array 1D, numpy array 1D, or list) The times of each spike. :units: (quantity units) Required if :attr:`times` is a list or :class:`~numpy.ndarray`, not if it is a :class:`~quantites.Quantity`. :t_stop: (quantity scalar, numpy scalar, or float) Time at which :class:`SpikeTrain` ended. This will be converted to the same units as :attr:`times`. This argument is required because it specifies the period of time over which spikes could have occurred. Note that :attr:`t_start` is highly recommended for the same reason. Note: If :attr:`times` contains values outside of the range [t_start, t_stop], an Exception is raised. *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. :t_start: (quantity scalar, numpy scalar, or float) Time at which :class:`SpikeTrain` began. This will be converted to the same units as :attr:`times`. Default: 0.0 seconds. :waveforms: (quantity array 3D (spike, channel_index, time)) The waveforms of each spike. :sampling_rate: (quantity scalar) Number of samples per unit time for the waveforms. :left_sweep: (quantity array 1D) Time from the beginning of the waveform to the trigger time of the spike. :sort: (bool) If True, the spike train will be sorted by time. *Optional attributes/properties*: :dtype: (numpy dtype or str) Override the dtype of the signal array. :copy: (bool) Whether to copy the times array. True by default. Must be True when you request a change of units or dtype. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Properties available on this object*: :sampling_period: (quantity scalar) Interval between two samples. (1/:attr:`sampling_rate`) :duration: (quantity scalar) Duration over which spikes can occur, read-only. (:attr:`t_stop` - :attr:`t_start`) :spike_duration: (quantity scalar) Duration of a waveform, read-only. (:attr:`waveform`.shape[2] * :attr:`sampling_period`) :right_sweep: (quantity scalar) Time from the trigger times of the spikes to the end of the waveforms, read-only. (:attr:`left_sweep` + :attr:`spike_duration`) :times: (:class:`SpikeTrain`) Returns the :class:`SpikeTrain` without modification or copying. *Slicing*: :class:`SpikeTrain` objects can be sliced. When this occurs, a new :class:`SpikeTrain` (actually a view) is returned, with the same metadata, except that :attr:`waveforms` is also sliced in the same way (along dimension 0). Note that t_start and t_stop are not changed automatically, although you can still manually change them. ''' def __new__(cls, times, t_stop, units=None, dtype=None, copy=True, sampling_rate=1.0 * pq.Hz, t_start=0.0 * pq.s, waveforms=None, left_sweep=None, name=None, file_origin=None, description=None, **annotations): ''' Constructs a new :clas:`Spiketrain` instance from data. This is called whenever a new :class:`SpikeTrain` is created from the constructor, but not when slicing. ''' # Make sure units are consistent # also get the dimensionality now since it is much faster to feed # that to Quantity rather than a unit if units is None: # No keyword units, so get from `times` try: units = times.units dim = units.dimensionality except AttributeError: raise ValueError('you must specify units') else: if hasattr(units, 'dimensionality'): dim = units.dimensionality else: dim = pq.quantity.validate_dimensionality(units) if (hasattr(times, 'dimensionality') and times.dimensionality.items() != dim.items()): if not copy: raise ValueError("cannot rescale and return view") else: # this is needed because of a bug in python-quantities # see issue # 65 in python-quantities github # remove this if it is fixed times = times.rescale(dim) if dtype is None: dtype = getattr(times, 'dtype', np.float) elif hasattr(times, 'dtype') and times.dtype != dtype: if not copy: raise ValueError("cannot change dtype and return view") # if t_start.dtype or t_stop.dtype != times.dtype != dtype, # _check_time_in_range can have problems, so we set the t_start # and t_stop dtypes to be the same as times before converting them # to dtype below # see ticket #38 if hasattr(t_start, 'dtype') and t_start.dtype != times.dtype: t_start = t_start.astype(times.dtype) if hasattr(t_stop, 'dtype') and t_stop.dtype != times.dtype: t_stop = t_stop.astype(times.dtype) # check to make sure the units are time # this approach is orders of magnitude faster than comparing the # reference dimensionality if (len(dim) != 1 or list(dim.values())[0] != 1 or not isinstance(list(dim.keys())[0], pq.UnitTime)): ValueError("Unit %s has dimensions %s, not [time]" % (units, dim.simplified)) # Construct Quantity from data obj = pq.Quantity.__new__(cls, times, units=dim, dtype=dtype, copy=copy) # if the dtype and units match, just copy the values here instead # of doing the much more epxensive creation of a new Quantity # using items() is orders of magnitude faster if (hasattr(t_start, 'dtype') and t_start.dtype == obj.dtype and hasattr(t_start, 'dimensionality') and t_start.dimensionality.items() == dim.items()): obj.t_start = t_start.copy() else: obj.t_start = pq.Quantity(t_start, units=dim, dtype=dtype) if (hasattr(t_stop, 'dtype') and t_stop.dtype == obj.dtype and hasattr(t_stop, 'dimensionality') and t_stop.dimensionality.items() == dim.items()): obj.t_stop = t_stop.copy() else: obj.t_stop = pq.Quantity(t_stop, units=dim, dtype=dtype) # Store attributes obj.waveforms = waveforms obj.left_sweep = left_sweep obj.sampling_rate = sampling_rate # parents obj.segment = None obj.unit = None # Error checking (do earlier?) _check_time_in_range(obj, obj.t_start, obj.t_stop, view=True) return obj def __init__(self, times, t_stop, units=None, dtype=np.float, copy=True, sampling_rate=1.0 * pq.Hz, t_start=0.0 * pq.s, waveforms=None, left_sweep=None, name=None, file_origin=None, description=None, **annotations): ''' Initializes a newly constructed :class:`SpikeTrain` instance. ''' # This method is only called when constructing a new SpikeTrain, # not when slicing or viewing. We use the same call signature # as __new__ for documentation purposes. Anything not in the call # signature is stored in annotations. # Calls parent __init__, which grabs universally recommended # attributes and sets up self.annotations BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) def rescale(self, units): ''' Return a copy of the :class:`SpikeTrain` converted to the specified units ''' if self.dimensionality == pq.quantity.validate_dimensionality(units): return self.copy() spikes = self.view(pq.Quantity) return SpikeTrain(times=spikes, t_stop=self.t_stop, units=units, sampling_rate=self.sampling_rate, t_start=self.t_start, waveforms=self.waveforms, left_sweep=self.left_sweep, name=self.name, file_origin=self.file_origin, description=self.description, **self.annotations) def __reduce__(self): ''' Map the __new__ function onto _new_BaseAnalogSignal, so that pickle works ''' import numpy return _new_spiketrain, (self.__class__, numpy.array(self), self.t_stop, self.units, self.dtype, True, self.sampling_rate, self.t_start, self.waveforms, self.left_sweep, self.name, self.file_origin, self.description, self.annotations) def __array_finalize__(self, obj): ''' This is called every time a new :class:`SpikeTrain` is created. It is the appropriate place to set default values for attributes for :class:`SpikeTrain` constructed by slicing or viewing. User-specified values are only relevant for construction from constructor, and these are set in __new__. Then they are just copied over here. Note that the :attr:`waveforms` attibute is not sliced here. Nor is :attr:`t_start` or :attr:`t_stop` modified. ''' # This calls Quantity.__array_finalize__ which deals with # dimensionality super(SpikeTrain, self).__array_finalize__(obj) # Supposedly, during initialization from constructor, obj is supposed # to be None, but this never happens. It must be something to do # with inheritance from Quantity. if obj is None: return # Set all attributes of the new object `self` from the attributes # of `obj`. For instance, when slicing, we want to copy over the # attributes of the original object. self.t_start = getattr(obj, 't_start', None) self.t_stop = getattr(obj, 't_stop', None) self.waveforms = getattr(obj, 'waveforms', None) self.left_sweep = getattr(obj, 'left_sweep', None) self.sampling_rate = getattr(obj, 'sampling_rate', None) self.segment = getattr(obj, 'segment', None) self.unit = getattr(obj, 'unit', None) # The additional arguments self.annotations = getattr(obj, 'annotations', None) # Globally recommended attributes self.name = getattr(obj, 'name', None) self.file_origin = getattr(obj, 'file_origin', None) self.description = getattr(obj, 'description', None) def __repr__(self): ''' Returns a string representing the :class:`SpikeTrain`. ''' return '' % ( super(SpikeTrain, self).__repr__(), self.t_start, self.t_stop) def sort(self): ''' Sorts the :class:`SpikeTrain` and its :attr:`waveforms`, if any, by time. ''' # sort the waveforms by the times sort_indices = np.argsort(self) if self.waveforms is not None and self.waveforms.any(): self.waveforms = self.waveforms[sort_indices] # now sort the times # We have sorted twice, but `self = self[sort_indices]` introduces # a dependency on the slicing functionality of SpikeTrain. super(SpikeTrain, self).sort() def __getslice__(self, i, j): ''' Get a slice from :attr:`i` to :attr:`j`. Doesn't get called in Python 3, :meth:`__getitem__` is called instead ''' # first slice the Quantity array obj = super(SpikeTrain, self).__getslice__(i, j) # somehow this knows to call SpikeTrain.__array_finalize__, though # I'm not sure how. (If you know, please add an explanatory comment # here.) That copies over all of the metadata. # update waveforms if obj.waveforms is not None: obj.waveforms = obj.waveforms[i:j] return obj def __getitem__(self, i): ''' Get the item or slice :attr:`i`. ''' obj = super(SpikeTrain, self).__getitem__(i) if hasattr(obj, 'waveforms') and obj.waveforms is not None: obj.waveforms = obj.waveforms.__getitem__(i) return obj def __setitem__(self, i, value): ''' Set the value the item or slice :attr:`i`. ''' if not hasattr(value, "units"): value = pq.Quantity(value, units=self.units) # or should we be strict: raise ValueError("Setting a value # requires a quantity")? # check for values outside t_start, t_stop _check_time_in_range(value, self.t_start, self.t_stop) super(SpikeTrain, self).__setitem__(i, value) def __setslice__(self, i, j, value): if not hasattr(value, "units"): value = pq.Quantity(value, units=self.units) _check_time_in_range(value, self.t_start, self.t_stop) super(SpikeTrain, self).__setslice__(i, j, value) def time_slice(self, t_start, t_stop): ''' Creates a new :class:`SpikeTrain` corresponding to the time slice of the original :class:`SpikeTrain` between (and including) times :attr:`t_start` and :attr:`t_stop`. Either parameter can also be None to use infinite endpoints for the time interval. ''' _t_start = t_start _t_stop = t_stop if t_start is None: _t_start = -np.inf if t_stop is None: _t_stop = np.inf indices = (self >= _t_start) & (self <= _t_stop) new_st = self[indices] new_st.t_start = max(_t_start, self.t_start) new_st.t_stop = min(_t_stop, self.t_stop) if self.waveforms is not None: new_st.waveforms = self.waveforms[indices] return new_st @property def times(self): ''' Returns the :class:`SpikeTrain` without modification or copying. ''' return self @property def duration(self): ''' Duration over which spikes can occur, (:attr:`t_stop` - :attr:`t_start`) ''' if self.t_stop is None or self.t_start is None: return None return self.t_stop - self.t_start @property def spike_duration(self): ''' Duration of a waveform. (:attr:`waveform`.shape[2] * :attr:`sampling_period`) ''' if self.waveforms is None or self.sampling_rate is None: return None return self.waveforms.shape[2] / self.sampling_rate @property def sampling_period(self): ''' Interval between two samples. (1/:attr:`sampling_rate`) ''' if self.sampling_rate is None: return None return 1.0 / self.sampling_rate @sampling_period.setter def sampling_period(self, period): ''' Setter for :attr:`sampling_period` ''' if period is None: self.sampling_rate = None else: self.sampling_rate = 1.0 / period @property def right_sweep(self): ''' Time from the trigger times of the spikes to the end of the waveforms. (:attr:`left_sweep` + :attr:`spike_duration`) ''' dur = self.spike_duration if self.left_sweep is None or dur is None: return None return self.left_sweep + dur neo-0.3.3/neo/core/segment.py0000644000175000017500000003237312273723542017106 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`Segment`, a container for data sharing a common time basis. :class:`Segment` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function import numpy as np from neo.core.baseneo import BaseNeo class Segment(BaseNeo): ''' A container for data sharing a common time basis. A :class:`Segment` is a heterogeneous container for discrete or continous data sharing a common clock (time basis) but not necessary the same sampling rate, start or end time. *Usage*:: >>> from neo.core import Segment, SpikeTrain, AnalogSignal >>> from quantities import Hz, s >>> >>> seg = Segment(index=5) >>> >>> train0 = SpikeTrain(times=[.01, 3.3, 9.3], units='sec', t_stop=10) >>> seg.spiketrains.append(train0) >>> >>> train1 = SpikeTrain(times=[100.01, 103.3, 109.3], units='sec', ... t_stop=110) >>> seg.spiketrains.append(train1) >>> >>> sig0 = AnalogSignal(signal=[.01, 3.3, 9.3], units='uV', ... sampling_rate=1*Hz) >>> seg.analogsignals.append(sig0) >>> >>> sig1 = AnalogSignal(signal=[100.01, 103.3, 109.3], units='nA', ... sampling_period=.1*s) >>> seg.analogsignals.append(sig1) *Required attributes/properties*: None *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. :file_datetime: (datetime) The creation date and time of the original data file. :rec_datetime: (datetime) The date and time of the original recording :index: (int) You can use this to define a temporal ordering of your Segment. For instance you could use this for trial numbers. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. *Properties available on this object*: :all_data: (list) A list of all child objects in the :class:`Segment`. *Container of*: :class:`Epoch` :class:`EpochArray` :class:`Event` :class:`EventArray` :class:`AnalogSignal` :class:`AnalogSignalArray` :class:`IrregularlySampledSignal` :class:`Spike` :class:`SpikeTrain` ''' def __init__(self, name=None, description=None, file_origin=None, file_datetime=None, rec_datetime=None, index=None, **annotations): ''' Initialize a new :class:`Segment` instance. ''' BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) self.file_datetime = file_datetime self.rec_datetime = rec_datetime self.index = index self.epochs = [] self.epocharrays = [] self.events = [] self.eventarrays = [] self.analogsignals = [] self.analogsignalarrays = [] self.irregularlysampledsignals = [] self.spikes = [] self.spiketrains = [] self.block = None @property def all_data(self): ''' Returns a list of all child objects in the :class:`Segment`. ''' return sum((self.epochs, self.epocharrays, self.events, self.eventarrays, self.analogsignals, self.analogsignalarrays, self.irregularlysampledsignals, self.spikes, self.spiketrains), []) def filter(self, **kwargs): ''' Return a list of child objects matching *any* of the search terms in either their attributes or annotations. Examples:: >>> segment.filter(name="Vm") ''' results = [] for key, value in kwargs.items(): for obj in self.all_data: if hasattr(obj, key) and getattr(obj, key) == value: results.append(obj) elif key in obj.annotations and obj.annotations[key] == value: results.append(obj) return results def take_spikes_by_unit(self, unit_list=None): ''' Return :class:`Spike` objects in the :class:`Segment` that are also in a :class:`Unit` in the :attr:`unit_list` provided. ''' if unit_list is None: return [] spike_list = [] for spike in self.spikes: if spike.unit in unit_list: spike_list.append(spike) return spike_list def take_spiketrains_by_unit(self, unit_list=None): ''' Return :class:`SpikeTrains` in the :class:`Segment` that are also in a :class:`Unit` in the :attr:`unit_list` provided. ''' if unit_list is None: return [] spiketrain_list = [] for spiketrain in self.spiketrains: if spiketrain.unit in unit_list: spiketrain_list.append(spiketrain) return spiketrain_list def take_analogsignal_by_unit(self, unit_list=None): ''' Return :class:`AnalogSignal` objects in the :class:`Segment` that are have the same :attr:`channel_index` as any of the :class:`Unit: objects in the :attr:`unit_list` provided. ''' if unit_list is None: return [] channel_indexes = [] for unit in unit_list: if unit.channel_indexes is not None: channel_indexes.extend(unit.channel_indexes) return self.take_analogsignal_by_channelindex(channel_indexes) def take_analogsignal_by_channelindex(self, channel_indexes=None): ''' Return :class:`AnalogSignal` objects in the :class:`Segment` that have a :attr:`channel_index` that is in the :attr:`channel_indexes` provided. ''' if channel_indexes is None: return [] anasig_list = [] for anasig in self.analogsignals: if anasig.channel_index in channel_indexes: anasig_list.append(anasig) return anasig_list def take_slice_of_analogsignalarray_by_unit(self, unit_list=None): ''' Return slices of the :class:`AnalogSignalArray` objects in the :class:`Segment` that correspond to a :attr:`channel_index` of any of the :class:`Unit` objects in the :attr:`unit_list` provided. ''' if unit_list is None: return [] indexes = [] for unit in unit_list: if unit.channel_indexes is not None: indexes.extend(unit.channel_indexes) return self.take_slice_of_analogsignalarray_by_channelindex(indexes) def take_slice_of_analogsignalarray_by_channelindex(self, channel_indexes=None): ''' Return slices of the :class:`AnalogSignalArrays` in the :class:`Segment` that correspond to the :attr:`channel_indexes` provided. ''' if channel_indexes is None: return [] sliced_sigarrays = [] for sigarr in self.analogsignalarrays: if sigarr.channel_indexes is not None: ind = np.in1d(sigarr.channel_indexes, channel_indexes) sliced_sigarrays.append(sigarr[:, ind]) return sliced_sigarrays def construct_subsegment_by_unit(self, unit_list=None): ''' Return a new :class:`Segment that contains the :class:`AnalogSignal`, :class:`AnalogSignalArray`, :class:`Spike`:, and :class:`SpikeTrain` objects common to both the current :class:`Segment` and any :class:`Unit` in the :attr:`unit_list` provided. *Example*:: >>> from neo.core import (Segment, Block, Unit, SpikeTrain, ... RecordingChannelGroup) >>> >>> blk = Block() >>> rcg = RecordingChannelGroup(name='group0') >>> blk.recordingchannelgroups = [rcg] >>> >>> for ind in range(5): ... unit = Unit(name='Unit #%s' % ind, channel_index=ind) ... rcg.units.append(unit) ... >>> >>> for ind in range(3): ... seg = Segment(name='Simulation #%s' % ind) ... blk.segments.append(seg) ... for unit in rcg.units: ... train = SpikeTrain([1, 2, 3], units='ms', t_start=0., ... t_stop=10) ... train.unit = unit ... unit.spiketrains.append(train) ... seg.spiketrains.append(train) ... >>> >>> seg0 = blk.segments[-1] >>> seg1 = seg0.construct_subsegment_by_unit(rcg.units[:2]) >>> len(seg0.spiketrains) 5 >>> len(seg1.spiketrains) 2 ''' seg = Segment() seg.analogsignals = self.take_analogsignal_by_unit(unit_list) seg.spikes = self.take_spikes_by_unit(unit_list) seg.spiketrains = self.take_spiketrains_by_unit(unit_list) seg.analogsignalarrays = \ self.take_slice_of_analogsignalarray_by_unit(unit_list) #TODO copy others attributes return seg def merge(self, other): ''' Merge the contents of another :class:`Segment` into this one. For each array-type object in the other :class:`Segment`, if its name matches that of an object of the same type in this :class:`Segment`, the two arrays will be joined by concatenation. Non-array objects will just be added to this segment. ''' for container in ("epochs", "events", "analogsignals", "irregularlysampledsignals", "spikes", "spiketrains"): getattr(self, container).extend(getattr(other, container)) for container in ("epocharrays", "eventarrays", "analogsignalarrays"): objs = getattr(self, container) lookup = dict((obj.name, i) for i, obj in enumerate(objs)) for obj in getattr(other, container): if obj.name in lookup: ind = lookup[obj.name] try: newobj = getattr(self, container)[ind].merge(obj) except AttributeError as e: raise AttributeError("%s. container=%s, obj.name=%s, \ shape=%s" % (e, container, obj.name, obj.shape)) getattr(self, container)[ind] = newobj else: lookup[obj.name] = obj getattr(self, container).append(obj) # TODO: merge annotations def size(self): ''' Get dictionary containing the names of child containers in the current :class:`Segment` as keys and the number of children of that type as values. ''' return dict((name, len(getattr(self, name))) for name in ("epochs", "events", "analogsignals", "irregularlysampledsignals", "spikes", "spiketrains", "epocharrays", "eventarrays", "analogsignalarrays")) def _repr_pretty_(self, pp, cycle): ''' Handle pretty-printing the :class:`Segment`. ''' pp.text(self.__class__.__name__) pp.text(" with ") first = True for (value, readable) in [ (self.analogsignals, "analogs"), (self.analogsignalarrays, "analog arrays"), (self.events, "events"), (self.eventarrays, "event arrays"), (self.epochs, "epochs"), (self.epocharrays, "epoch arrays"), (self.irregularlysampledsignals, "epoch arrays"), (self.spikes, "spikes"), (self.spiketrains, "spike trains"), ]: if value: if first: first = False else: pp.text(", ") pp.text("{0} {1}".format(len(value), readable)) if self._has_repr_pretty_attrs_(): pp.breakable() self._repr_pretty_attrs_(pp, cycle) if self.analogsignals: pp.breakable() pp.text("# Analog signals (N={0})".format(len(self.analogsignals))) for (i, asig) in enumerate(self.analogsignals): pp.breakable() pp.text("{0}: ".format(i)) with pp.indent(3): pp.pretty(asig) if self.analogsignalarrays: pp.breakable() pp.text("# Analog signal arrays (N={0})" .format(len(self.analogsignalarrays))) for i, asarr in enumerate(self.analogsignalarrays): pp.breakable() pp.text("{0}: ".format(i)) with pp.indent(3): pp.pretty(asarr) neo-0.3.3/neo/core/event.py0000644000175000017500000000340612273723542016560 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- ''' This module defines :class:`Event`, an event occuring at a particular point in time. :class:`Event` derives from :class:`BaseNeo`, from :module:`neo.core.baseneo`. ''' # needed for python 3 compatibility from __future__ import absolute_import, division, print_function from neo.core.baseneo import BaseNeo class Event(BaseNeo): ''' An event occuring at a particular point in time. Useful for managing trigger, stimulus, comment, etc. *Usage*:: >>> from neo.core import Event >>> from quantities import s >>> >>> evt = Event(50*s, label='trigger') >>> >>> evt.time array(50.0) * s >>> evt.label 'trigger' *Required attributes/properties*: :time: (quantity scalar) The time of the event. :label: (str) Name or label for the event. *Recommended attributes/properties*: :name: (str) A label for the dataset. :description: (str) Text description. :file_origin: (str) Filesystem path or URL of the original data file. Note: Any other additional arguments are assumed to be user-specific metadata and stored in :attr:`annotations`. ''' def __init__(self, time, label, name=None, description=None, file_origin=None, **annotations): ''' Initialize a new :class:`Event` instance. ''' BaseNeo.__init__(self, name=name, file_origin=file_origin, description=description, **annotations) self.time = time self.label = label self.segment = None def merge(self, other): ''' Merging is not supported in :class:`Epoch`. ''' raise NotImplementedError('Cannot merge Epoch objects') neo-0.3.3/neo/version.py0000644000175000017500000000005312273723542016167 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- version = '0.3.3' neo-0.3.3/doc/0000755000175000017500000000000012273723667014126 5ustar sgarciasgarcia00000000000000neo-0.3.3/doc/Makefile0000644000175000017500000000606412265516260015562 0ustar sgarciasgarcia00000000000000# 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 pickle json htmlhelp qthelp latex 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 " 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 " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @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." 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/neo.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/neo.qhc" latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." 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." neo-0.3.3/doc/make.bat0000644000175000017500000000577512265516260015537 0ustar sgarciasgarcia00000000000000@ECHO OFF REM Command file for Sphinx documentation 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. 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. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter 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" == "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\neo.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\neo.ghc 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" == "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 neo-0.3.3/doc/source/0000755000175000017500000000000012273723667015426 5ustar sgarciasgarcia00000000000000neo-0.3.3/doc/source/io_developers_guide.rst0000644000175000017500000001343712265516260022172 0ustar sgarciasgarcia00000000000000.. _io_dev_guide: ******************** IO developers' guide ******************** .. _io_guiline: Guidelines for IO implementation ================================ Receipe to develop an IO module for a new data format: 1. Fully understand the object model. See :doc:`core`. If in doubt ask the `mailing list`_. 2. Fully understand :mod:`neo.io.exampleio`, It is a fake IO to explain the API. If in doubt ask the list. 3. Copy/paste ``exampleio.py`` and choose clear file and class names for your IO. 4. Decide which **supported objects** and **readable objects** your IO will deal with. This is the crucial point. 5. Implement all methods :meth:`read_XXX` related to **readable objects**. 6. Optional: If your IO supports reading multiple blocks from one file, implement a :meth:`read_all_blocks` method. 7. Do not forget all lazy and cascade combinations. 8. Optional: Support loading lazy objects by implementing a :meth:`load_lazy_object` method and / or lazy cascading by implementing a :meth:`load_lazy_cascade` method. 9. Write good docstrings. List dependencies, including minimum version numbers. 10. Add your class to :mod:`neo.io.__init__`. Keep the import inside try/except for dependency reasons. 11. Contact the Neo maintainers to put sample files for testing on the G-Node server (write access is not public). 12. Write tests in ``neo/test/io/test_xxxxxio.py``. You must at least pass the standard tests (inherited from :class:`BaseTestIO`). 13. Commit or send a patch only if all tests pass. Miscellaneous ============= Notes: * if your IO supports several version of a format (like ABF1, ABF2), upload to G-node test file repository all file version possible. (for utest coverage). * :py:func:`neo.io.tools.create_many_to_one_relationship` offers a utility to complete the hierachy when all one-to-many relationships have been created. * :py:func:`neo.io.tools.populate_RecordingChannel` offers a utility to create inside a :class:`Block` all :class:`RecordingChannel` objects and links to :class:`AnalogSignal`, :class:`SpikeTrain`, ... * In the docstring, explain where you obtained the file format specification if it is a closed one. * If your IO is based on a database mapper, keep in mind that the returned object MUST be detached, because this object can be written to another url for copying. Advanced lazy loading ===================== If your IO supports a format that might take a long time to load or require lots of memory, consider implementing one or both of the following methods to enable advanced lazy loading: * ``load_lazy_object(self, obj)``: This method takes a lazily loaded object and returns the corresponding fully loaded object. It does not set any links of the newly loaded object (e.g. the segment attribute of a SpikeTrain). The information needed to fully load the lazy object should usually be stored in the IO object (e.g. in a dictionary with lazily loaded objects as keys and the address in the file as values). * ``load_lazy_cascade(self, address, lazy)``: This method takes two parameters: The information required by your IO to load an object and a boolean that indicates if data objects should be lazy loaded (in the same way as with regular :meth:`read_XXX` methods). The method should return a loaded objects, including all the links for one-to-many and many-to-many relationships (lists of links should be replaced by ``LazyList`` objects, see below). To implement lazy cascading, your read methods need to react when a user calls them with the ``cascade`` parameter set to ``lazy``. In this case, you have to replace all the link lists of your loaded objects with instances of :class:`neo.io.tools.LazyList`. Instead of the actual objects that your IO would load at this point, fill the list with items that ``load_lazy_cascade`` needs to load the object. Because the links of objects can point to previously loaded objects, you need to cache all loaded objects in the IO. If :meth:`load_lazy_cascade` is called with the address of a previously loaded object, return the object instead of loading it again. Also, a call to :meth:`load_lazy_cascade` might require you to load additional objects further up in the hierarchy. For example, if a :class:`SpikeTrain` is accessed through a :class:`Segment`, its :class:`Unit` and the :class:`RecordingChannelGroup` of the :class:`Unit` might have to be loaded at that point as well if they have not been accessed before. Note that you are free to restrict lazy cascading to certain objects. For example, you could use the ``LazyList`` only for the ``analogsignals`` property of :class:`Segment` and :class:`RecordingChannel` objects and load the rest of file immediately. Tests ===== :py:class:`neo.test.io.commun_io_test.BaseTestIO` provide standard tests. To use these you need to upload some sample data files at the `G-Node portal`_. They will be publicly accessible for testing Neo. These tests: * check the compliance with the schema: hierachy, attribute types, ... * check if the IO respects the *lazy* and *cascade* keywords. * For IO able to both write and read data, it compares a generated dataset with the same data after a write/read cycle. The test scripts download all files from the `G-Node portal`_ and store them locally in ``neo/test/io/files_for_tests/``. Subsequent test runs use the previously downloaded files, rather than trying to download them each time. Here is an example test script taken from the distribution: ``test_axonio.py``: .. literalinclude:: ../../neo/test/iotest/test_axonio.py ExampleIO ========= .. autoclass:: neo.io.ExampleIO Here is the entire file: .. literalinclude:: ../../neo/io/exampleio.py .. _`mailing list`: http://groups.google.com/group/neuralensemble .. _G-node portal: https://portal.g-node.org/neo/neo-0.3.3/doc/source/io.rst0000644000175000017500000002311412265516260016556 0ustar sgarciasgarcia00000000000000****** Neo IO ****** .. currentmodule:: neo Preamble ======== The Neo :mod:`io` module aims to provide an exhaustive way of loading and saving several widely used data formats in electrophysiology. The more these heterogeneous formats are supported, the easier it will be to manipulate them as Neo objects in a similar way. Therefore the IO set of classes propose a simple and flexible IO API that fits many format specifications. It is not only file-oriented, it can also read/write objects from a database. :mod:`neo.io` can be seen as a *pure-Python* and open-source Neuroshare replacement. At the moment, there are 3 families of IO modules: 1. for reading closed manufacturers' formats (Spike2, Plexon, AlphaOmega, BlackRock, Axon, ...) 2. for reading(/writing) formats from open source tools (KlustaKwik, Elan, WinEdr, WinWcp, PyNN, ...) 3. for reading/writing Neo structure in neutral formats (HDF5, .mat, ...) but with Neo structure inside (NeoHDF5, NeoMatlab, ...) Combining **1** for reading and **3** for writing is a good example of use: converting your datasets to a more standard format when you want to share/collaborate. Introduction ============ There is an intrinsic structure in the different Neo objects, that could be seen as a hierachy with cross-links. See :doc:`core`. The highest level object is the :class:`Block` object, which is the high level container able to encapsulate all the others. A :class:`Block` has therefore a list of :class:`Segment` objects, that can, in some file formats, be accessed individually. Depending on the file format, i.e. if it is streamable or not, the whole :class:`Block` may need to be loaded, but sometimes particular :class:`Segment` objects can be accessed individually. Within a :class:`Segment`, the same hierarchical organisation applies. A :class:`Segment` embeds several objects, such as :class:`SpikeTrain`, :class:`AnalogSignal`, :class:`AnaloSignalArray`, :class:`EpochArray`, :class:`EventArray` (basically, all the different Neo objects). Depending on the file format, these objects can sometimes be loaded separately, without the need to load the whole file. If possible, a file IO therefore provides distinct methods allowing to load only particular objects that may be present in the file. The basic idea of each IO file format is to have, as much as possible, read/write methods for the individual encapsulated objects, and otherwise to provide a read/write method that will return the object at the highest level of hierarchy (by default, a :class:`Block` or a :class:`Segment`). The :mod:`neo.io` API is a balance between full flexibility for the user (all :meth:`read_XXX` methods are enabled) and simple, clean and understandable code for the developer (few :meth:`read_XXX` methods are enabled). This means that not all IOs offer the full flexibility for partial reading of data files. One format = one class ====================== The basic syntax is as follows. If you want to load a file format that is implemented in a generic :class:`MyFormatIO` class:: >>> from neo.io import MyFormatIO >>> reader = MyFormatIO(filename = "myfile.dat") you can replace :class:`MyFormatIO` by any implemented class, see :ref:`list_of_io` Modes ====== IO can be based on file, directory, database or fake This is describe in mode attribute of the IO class. >>> from neo.io import MyFormatIO >>> print MyFormatIO.mode 'file' For *file* mode the *filename* keyword argument is necessary. For *directory* mode the *dirname* keyword argument is necessary. Ex: >>> reader = io.PlexonIO(filename='File_plexon_1.plx') >>> reader = io.TdtIO(dirname='aep_05') Supported objects/readable objects ================================== To know what types of object are supported by a given IO interface:: >>> MyFormatIO.supported_objects [Segment , AnalogSignal , SpikeTrain, Event, Spike] Supported objects does not mean objects that you can read directly. For instance, many formats support :class:`AnalogSignal` but don't allow them to be loaded directly, rather to access the :class:`AnalogSignal` objects, you must read a :class:`Segment`:: >>> seg = reader.read_segment() >>> print(seg.analogsignals) >>> print(seg.analogsignals[0]) To get a list of directly readable objects :: >>> MyFormatIO.readable_objects [Segment] The first element of the previous list is the highest level for reading the file. This mean that the IO has a :meth:`read_segment` method:: >>> seg = reader.read_segment() >>> type(seg) neo.core.Segment All IOs have a read() method that returns a list of :class:`Block` objects (representing the whole content of the file):: >>> bl = reader.read() >>> print bl[0].segments[0] neo.core.Segment Lazy and cascade options ======================== In some cases you may not want to load everything in memory because it could be too big. For this scenario, two options are available: * ``lazy=True/False``. With ``lazy=True`` all arrays will have a size of zero, but all the metadata will be loaded. lazy_shape attribute is added to all object that inheritate Quantitities or numpy.ndarray (AnalogSignal, AnalogSignalArray, SpikeTrain) and to object that have array like attributes (EpochArray, EventArray) In that cases, lazy_shape is a tuple that have the same shape with lazy=False. * ``cascade=True/False``. With ``cascade=False`` only one object is read (and *one_to_many* and *many_to_many* relationship are not read). By default (if they are not specified), ``lazy=False`` and ``cascade=True``, i.e. all data is loaded. Example cascade:: >>> seg = reader.read_segment( cascade=True) >>> print(len(seg.analogsignals)) # this is N >>> seg = reader.read_segment(cascade=False) >>> print(len(seg.analogsignals)) # this is zero Example lazy:: >>> seg = reader.read_segment(lazy=False) >>> print(seg.analogsignals[0].shape) # this is N >>> seg = reader.read_segment(lazy=True) >>> print(seg.analogsignals[0].shape) # this is zero, the AnalogSignal is empty >>> print(seg.analogsignals[0].lazy_shape) # this is N Some IOs support advanced forms of lazy loading, cascading or both (these features are currently limited to the HDF5 IO, which supports both forms). * For lazy loading, these IOs have a :meth:`load_lazy_object` method that takes a single parameter: a data object previously loaded by the same IO in lazy mode. It returns the fully loaded object, without links to container objects (Segment etc.). Continuing the lazy example above:: >>> lazy_sig = seg.analogsignals[0] # Empty signal >>> full_sig = reader.load_lazy_object(lazy_sig) >>> print(lazy_sig.lazy_shape, full_sig.shape) # Identical >>> print(lazy_sig.segment) # Has the link to the object "seg" >>> print(full_sig.segment) # Does not have the link: None * For lazy cascading, IOs have a :meth:`load_lazy_cascade` method. This method is not called directly when interacting with the IO, but its presence can be used to check if an IO supports lazy cascading. To use lazy cascading, the cascade parameter is set to ``'lazy'``:: >>> block = reader.read(cascade='lazy') You do not have to do anything else, lazy cascading is now active for the object you just loaded. You can interact with the object in the same way as if it was loaded with ``cascade=True``. However, only the objects that are actually accessed are loaded as soon as they are needed:: >>> print(block.recordingchannelgroups[0].name) # The first RecordingChannelGroup is loaded >>> print(block.segments[0].analogsignals[1]) # The first Segment and its second AnalogSignal are loaded Once an object has been loaded with lazy cascading, it stays in memory:: >>> print(block.segments[0].analogsignals[0]) # The first Segment is already in memory, its first AnalogSignal is loaded .. _neo_io_API: Details of API ============== The :mod:`neo.io` API is designed to be simple and intuitive: - each file format has an IO class (for example for Spike2 files you have a :class:`Spike2IO` class). - each IO class inherits from the :class:`BaseIO` class. - each IO class can read or write directly one or several Neo objects (for example :class:`Segment`, :class:`Block`, ...): see the :attr:`readable_objects` and :attr:`writable_objects` attributes of the IO class. - each IO class supports part of the :mod:`neo.core` hierachy, though not necessarily all of it (see :attr:`supported_objects`). - each IO class has a :meth:`read()` method that returns a list of :class:`Block` objects. If the IO only supports :class:`Segment` reading, the list will contain one block with all segments from the file. - each IO class that supports writing has a :meth:`write()` method that takes as a parameter a list of blocks, a single block or a single segment, depending on the IO's :attr:`writable_objects`. - each IO is able to do a *lazy* load: all metadata (e.g. :attr:`sampling_rate`) are read, but not the actual numerical data. lazy_shape attribute is added to provide information on real size. - each IO is able to do a *cascade* load: if ``True`` (default) all child objects are loaded, otherwise only the top level object is loaded. - each IO is able to save and load all required attributes (metadata) of the objects it supports. - each IO can freely add user-defined or manufacturer-defined metadata to the :attr:`annotations` attribute of an object. .. _list_of_io: List of implemented formats =========================== .. automodule:: neo.io If you want to develop your own IO ================================== See :doc:`io_developers_guide` for information on how to implement of a new IO. neo-0.3.3/doc/source/gif2011workshop.rst0000644000175000017500000000766212265516260021027 0ustar sgarciasgarcia00000000000000************************************ Gif 2011 workshop decisions ************************************ This have been writtent before neo 2 implementation just after the wokshop. Not every hting is up to date. After a workshop in GIF we are happy to present the following improvements: =========================================================================== 1. We made a few renames of objects - "Neuron" into "Unit" - "RecordingPoint" into "RecordingChannel" to remove electrophysiological (or other) dependencies and keep generality. 2. For every object we specified mandatory attributes and recommended attributes. For every attribute we define a python-based data type. The changes are reflected in the diagram #FIXME with red (mandatory) and blue (recommended) attributes indicated. 3. New objects are required for operational performance (memory allocation) and logical consistency (neo eeg, etc): - AnalogSignalArray - IrregularlySampledAnalogSignal - EventArray - EpochArray - RecordingChannelGroup Attributes and parent objects are available on the diagram #FIXME 4. Due to some logical considerations we remove the link between "RecordingChannel" and "Spiketrain". "SpikeTrain" now depends on "Unit", which in its turn connects to "RecordingChannel". For inconsistency reasons we removed link between "SpikeTrain" and a "Spike" ("SpikeTrain" is an object containing numpy array of spikes, but not a container of "Spike" objects - which is performance-unefficient). The same idea is applied to AnalogSignal / AnalogSignalArray, Event / EventArray etc. All changes are relected in # FIXME 5. In order to implement flexibility and embed user-defined metadata into the NEO objects we decided to assign "annotations" dictionnary to very NEO object. This attribute is optional; user may add key-value pairs to it according to its scientific needs. 6. The decision is made to use "quantities" package for objects, representing data arrays with units. "Quantities" is a stable (at least for python2.6) package, presented in pypi, easy-embeddable into NEO object model. Points of implementation are presented in the diagram # FIXME 7. We postpone the solution of object ID management inside NEO. 8. In AnalogSignal - t_stop become a property (for consistency reasons). 9. In order to provie a support for "advanced" object load we decided to include parameters - lazy (True/False) - cascade (True/False) in the BaseIO class. These parameters are valid for every method, provided by the IO (.read_segment() etc.). If "lazy" is True, the IO does not load data array, and makes array load otherwise. "Cascade" parameter regulates load of object relations. 10. We postpone the question of data analysis storage till the next NEO congress. Analysis objects are free for the moment. 11. We stay with Python 2.6 / 2.7 support. Python 3 to be considered in a later discussions. New object diagram discussed =============================================== .. image:: images/neo_UML_French_workshop.png :height: 500 px :align: center Actions to be performed: =============================================================== promotion: at g-node: philipp, andrey in neuralesemble: andrew within incf network: andrew thomas at posters: all logo: samuel paper: next year in the web: pypi object struture: common: samuel draft: yann andrey tree diagram: philipp florant io: ExampleIO : samuel HDF5 IO: andrey doc: first page: andrew thomas object disription: samuel draft+ andrew io user/ io dev: samuel example/cookbook: andrey script, samuel NeuroConvert, doctest unitest: andrew packaging: samuel account for more licence: BSD-3-Clause copyright: CNRS, GNode, University of Provence hosting test data: Philipp Other questions discussed: =========================== - consistency in names of object attributes and get/set functions neo-0.3.3/doc/source/usecases.rst0000644000175000017500000002112412265516260017761 0ustar sgarciasgarcia00000000000000***************** Typical use cases ***************** Recording multiple trials from multiple channels ================================================ In this example we suppose that we have recorded from an 8-channel probe, and that we have recorded three trials/episodes. We therefore have a total of 8 x 3 = 24 signals, each represented by an :class:`AnalogSignal` object. Our entire dataset is contained in a :class:`Block`, which in turn contains: * 3 :class:`Segment` objects, each representing data from a single trial, * 1 :class:`RecordingChannelGroup`, composed of 8 :class:`RecordingChannel` objects. .. image:: images/multi_segment_diagram.png :class:`Segment` and :class:`RecordingChannel` objects provide two different ways to access the data, corresponding respectively, in this scenario, to access by **time** and by **space**. .. note:: segments do not always represent trials, they can be used for many purposes: segments could represent parallel recordings for different subjects, or different steps in a current clamp protocol. **Temporal (by segment)** In this case you want to go through your data in order, perhaps because you want to correlate the neural response with the stimulus that was delivered in each segment. In this example, we're averaging over the channels. .. doctest:: import numpy as np from matplotlib import pyplot as plt for seg in block.segments: print("Analyzing segment %d" % seg.index) siglist = seg.analogsignals avg = np.mean(siglist, axis=0) plt.figure() plt.plot(avg) plt.title("Peak response in segment %d: %f" % (seg.index, avg.max())) **Spatial (by channel)** In this case you want to go through your data by channel location and average over time. Perhaps you want to see which physical location produces the strongest response, and every stimulus was the same: .. doctest:: # We assume that our block has only 1 RecordingChannelGroup rcg = block.recordingchannelgroups[0]: for rc in rcg.recordingchannels: print("Analyzing channel %d: %s", (rc.index, rc.name)) siglist = rc.analogsignals avg = np.mean(siglist, axis=0) plt.figure() plt.plot(avg) plt.title("Average response on channel %d: %s' % (rc.index, rc.name) Note that :attr:`Block.list_recordingchannels` is a property that gives direct access to all :class:`RecordingChannels`, so the two first lines:: rcg = block.recordingchannelgroups[0]: for rc in rcg.recordingchannels: could be written as:: for rc in block.list_recordingchannels: **Mixed example** Combining simultaneously the two approaches of descending the hierarchy temporally and spatially can be tricky. Here's an example. Let's say you saw something interesting on channel 5 on even numbered trials during the experiment and you want to follow up. What was the average response? .. doctest:: avg = np.mean([seg.analogsignals[5] for seg in block.segments[::2]], axis=1) plt.plot(avg) Here we have assumed that segment are temporally ordered in a ``block.segments`` and that signals are ordered by channel number in ``seg.analogsignals``. It would be safer, however, to avoid assumptions by explicitly testing the :attr:`index` attribute of the :class:`RecordingChannel` and :class:`Segment` objects. One way to do this is to loop over the recording channels and access the segments through the signals (each :class:`AnalogSignal` contains a reference to the :class:`Segment` it is contained in). .. doctest:: siglist = [] rcg = block.recordingchannelgroups[0]: for rc in rcg.recordingchannels: if rc.index == 5: for anasig in rc.analogsignals: if anasig.segment.index % 2 == 0: siglist.append(anasig) avg = np.mean(siglist) Recording spikes from multiple tetrodes ======================================= Here is a similar example in which we have recorded with two tetrodes and extracted spikes from the extra-cellular signals. The spike times are contained in :class:`SpikeTrain` objects. Again, our data set is contained in a :class:`Block`, which contains: * 3 :class:`Segments` (one per trial). * 2 :class:`RecordingChannelGroups` (one per tetrode), which contain: * 4 :class:`RecordingChannels` each * 2 :class:`Unit` objects (= 2 neurons) for the first :class:`RecordingChannelGroup` * 5 :class:`Units` for the second :class:`RecordingChannelGroup`. In total we have 3 x 7 = 21 :class:`SpikeTrains` in this :class:`Block`. .. image:: images/multi_segment_diagram_spiketrain.png There are three ways to access the :class:`SpikeTrain` data: * by :class:`Segment` * by :class:`RecordingChannel` * by :class:`Unit` **By Segment** In this example, each :class:`Segment` represents data from one trial, and we want a PSTH for each trial from all units combined: .. doctest:: for seg in block.segments: print("Analyzing segment %d" % seg.index) stlist = [st - st.t_start for st in seg.spiketrains] plt.figure() count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title("PSTH in segment %d" % seg.index) **By Unit** Now we can calculate the PSTH averaged over trials for each unit, using the :attr:`block.list_units` property: .. doctest:: for unit in block.list_units: stlist = [st - st.t_start for st in unit.spiketrains] plt.figure() count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title("PSTH of unit %s" % unit.name) **By RecordingChannelGroup** Here we calculate a PSTH averaged over trials by channel location, blending all units: .. doctest:: for rcg in block.recordingchannelgroups: stlist = [] for unit in rcg.units: stlist.extend([st - st.t_start for st in unit.spiketrains]) plt.figure() count, bins = np.histogram(stlist) plt.bar(bins[:-1], count, width=bins[1] - bins[0]) plt.title("PSTH blend of tetrode %s" % rcg.name) Spike sorting ============= Spike sorting is the process of detecting and classifying high-frequency deflections ("spikes") on a group of physically nearby recording channels. For example, let's say you have defined a RecordingChannelGroup for a tetrode containing 4 separate channels. Here is an example showing (with fake data) how you could iterate over the contained signals and extract spike times. (Of course in reality you would use a more sophisticated algorithm.) .. doctest:: # generate some fake data rcg = RecordingChannelGroup() for n in range(4): rcg.recordingchannels.append(neo.RecordingChannel()) rcg.recordingchannels[n].analogsignals.append( AnalogSignal([.1, -2.0, .1, -.1, -.1, -3.0, .1, .1], sampling_rate=1000*Hz, units='V')) # extract spike trains from each channel st_list = [] for n in range(len(rcg.recordingchannels[0].analogsignals)): sigarray = np.array( [rcg.recordingchannels[m].analogsignals[n] for m in range(4)]) # use a simple threshhold detector spike_mask = np.where(np.min(sigarray, axis=0) < -1.0 * pq.V)[0] # create a spike train anasig = rcg.recordingchannels[m].analogsignals[n] spike_times = anasig.times[spike_mask] st = neo.SpikeTrain(spike_times, t_start=anasig.t_start, anasig.t_stop) # remember the spike waveforms wf_list = [] for spike_idx in np.nonzero(spike_mask)[0]: wf_list.append(sigarray[:, spike_idx-1:spike_idx+2]) st.waveforms = np.array(wf_list) st_list.append(st) At this point, we have a list of spiketrain objects. We could simply create a single Unit object, assign all spike trains to it, and then assign the Unit to the group on which we detected it. .. doctest:: u = Unit() u.spiketrains = st_list rcg.units.append(u) Now the recording channel group (tetrode) contains a list of analogsignals, and a single Unit object containing all of the detected spiketrains from those signals. Further processing could assign each of the detected spikes to an independent source, a putative single neuron. (This processing is outside the scope of Neo. There are many open-source toolboxes to do it, for instance our sister project OpenElectrophy.) In that case we would create a separate Unit for each cluster, assign its spiketrains to it, and then store all the units in the original recording channel group. .. EEG .. Network simulations neo-0.3.3/doc/source/conf.py0000644000175000017500000001472212273723542016723 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- # # neo documentation build configuration file, created by # sphinx-quickstart on Fri Feb 25 14:18:12 2011. # # 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 os import sys AUTHORS = u'Neo authors and contributors ' # 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.append(os.path.abspath('.')) # -- General configuration ---------------------------------------------------- # 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.todo'] # 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' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Neo' copyright = u'2010-2014, ' + AUTHORS # 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 = '0.3' # The full version, including alpha/beta/rc tags. release = '0.3.3' # 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 documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = [] # 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. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. #html_theme = 'default' html_theme = 'sphinxdoc' #html_theme = 'haiku' #html_theme = 'scrolls' #html_theme = 'agogo' # 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 = 'images/neologo_light.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 = None # 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_use_modindex = 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, 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 = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'neodoc' # -- 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', 'neo.tex', u'Neo Documentation', AUTHORS, '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 # 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_use_modindex = True todo_include_todos = True # set to False before releasing documentation neo-0.3.3/doc/source/core.rst0000644000175000017500000003007512265516260017103 0ustar sgarciasgarcia00000000000000******** Neo core ******** .. currentmodule:: neo Introduction ============ Objects in Neo represent neural data and collections of data. Neo objects fall into three categories: data objects, container objects and grouping objects. Data objects ------------ These objects directly represent data as arrays of numerical values with associated metadata (units, sampling frequency, etc.). :py:class:`AnalogSignal`: A regular sampling of a continuous, analog signal. :py:class:`AnalogSignalArray`: A regular sampling of a multichannel continuous analog signal. This representation (as a 2D NumPy array) may be more efficient for subsequent analysis than the equivalent list of individual :py:class:`AnalogSignal` objects. :py:class:`Spike`: One action potential characterized by its time and waveform. :py:class:`SpikeTrain`: A set of action potentials (spikes) emitted by the same unit in a period of time (with optional waveforms). :py:class:`Event` and :py:class:`EventArray`: A time point representng an event in the data, or an array of such time points. :py:class:`Epoch` and :py:class:`EpochArray`: An interval of time representing a period of time in the data, or an array of such intervals. Container objects ----------------- There is a simple hierarchy of containers: :py:class:`Segment`: A container for heterogeneous discrete or continous data sharing a common clock (time basis) but not necessarily the same sampling rate, start time or end time. A :py:class:`Segment` can be considered as equivalent to a "trial", "episode", "run", "recording", etc., depending on the experimental context. May contain any of the data objects. :py:class:`Block`: The top-level container gathering all of the data, discrete and continuous, for a given recording session. Contains :class:`Segment` and :class:`RecordingChannelGroup` objects. Grouping objects ---------------- These objects express the relationships between data items, such as which signals were recorded on which electrodes, which spike trains were obtained from which membrane potential signals, etc. They contain references to data objects that cut across the simple container hierarchy. :py:class:`RecordingChannel`: Links :py:class:`AnalogSignal`, :py:class:`SpikeTrain` objects that come from the same logical and/or physical channel inside a :py:class:`Block`, possibly across several :py:class:`Segment` objects. :py:class:`RecordingChannelGroup`: A group for associated :py:class:`RecordingChannel` objects. This has several possible uses: * for linking several :py:class:`AnalogSignalArray` objects across several :py:class:`Segment` objects inside a :py:class:`Block`. * for multielectrode arrays, where spikes may be recorded on more than one recording channel, and so the :py:class:`RecordingChannelGroup` can be used to associate each :py:class:`Unit` with the group of recording channels from which it was calculated. * for grouping several :py:class:`RecordingChannel` objects. There are many use cases for this. For instance, for intracellular recording, it is common to record both membrane potentials and currents at the same time, so each :py:class:`RecordingChannelGroup` may correspond to the particular property that is being recorded. For multielectrode arrays, :py:class:`RecordingChannelGroup` is used to gather all :py:class:`RecordingChannel` objects of the same array. :py:class:`Unit`: A Unit gathers all the :class:`SpikeTrain` objects within a common :class:`Block`, possibly across several Segments, that have been emitted by the same cell. A :class:`Unit` is linked to :class:`RecordingChannelGroup` objects from which it was detected. This replaces the :class:`Neuron` class in the previous version of Neo (v0.1). .. image:: images/base_schematic.png :height: 500 px :alt: Neo : Neurotools/OpenElectrophy shared base architecture :align: center Relationships between objects ============================= Container objects like :py:class:`Block` or :py:class:`Segment` are gateways to access other objects. For example, a :class:`Block` can access a :class:`Segment` with:: >>> bl = Block() >>> bl.segments # gives a list of segments A :class:`Segment` can access the :class:`AnalogSignal` objects that it contains with:: >>> seg = Segment() >>> seg.analogsignals # gives a list a AnalogSignals In the :ref:`neo_diagram` below, these *one to many* relationships are represented by cyan arrows. In general, an object can access its children with an attribute *childname+s* in lower case, e.g. * :attr:`Block.segments` * :attr:`Segments.analogsignals` * :attr:`Segments.spiketrains` * :attr:`Block.recordingchannelgroups` These relationships are bi-directional, i.e. a child object can access its parent: * :attr:`Segment.block` * :attr:`AnalogSignal.segment` * :attr:`SpikeTrains.segment` * :attr:`RecordingChannelGroup.block` Here is an example showing these relationships in use:: from neo.io import AxonIO import urllib url = "https://portal.g-node.org/neo/axon/File_axon_3.abf" filename = './test.abf' urllib.urlretrieve(url, filename) r = AxonIO(filename=filename) bl = r.read() # read the entire file > a Block print(bl) print(bl.segments) # child access for seg in bl.segments: print(seg) print(seg.block) # parent access On the :ref:`neo_diagram` you can also see a magenta line reflecting the *many-to-many* relationship between :py:class:`RecordingChannel` and :py:class:`RecordingChannelGroup`. This means that each group can contain multiple channels, and each channel can belong to multiple groups. In some cases, a one-to-many relationship is sufficient. Here is a simple example with tetrodes, in which each tetrode has its own group.:: from neo import * bl = Block() # creating individual channel all_rc= [ ] for i in range(16): rc = RecordingChannel( index= i, name ='rc %d' %i) all_rc.append(rc) # the four tetrodes for i in range(4): rcg = RecordingChannelGroup( name = 'Tetrode %d' % i ) for rc in all_rc[i*4:(i+1)*4]: rcg.recordingchannels.append(rc) rc.recordingchannelgroups.append(rcg) bl.recordingchannelgroups.append(rcg) # now we load the data and associate it with the created channels # ... Now consider a more complex example: a 1x4 silicon probe, with a neuron on channels 0,1,2 and another neuron on channels 1,2,3. We create a group for each neuron to hold the `Unit` object associated with this spikesorting group. Each group also contains the channels on which that neuron spiked. The relationship is many-to-many because channels 1 and 2 occur in multiple groups.:: from neo import * bl = Block(name='probe data') # create individual channels all_rc = [] for i in range(4): rc = RecordingChannel(index=i, name='channel %d' % i) all_rc.append(rc) # one group for each neuron rcg0 = RecordingChannelGroup(name='Group 0', index=0) for i in [0, 1, 2]: rcg1.recordingchannels.append(all_rc[i]) rc[i].recordingchannelgroups.append(rcg0) bl.recordingchannelgroups.append(rcg0) rcg1 = RecordingChannelGroup(name='Group 1', index=1) for i in [1, 2, 3]: rcg1.recordingchannels.append(all_rc[i]) rc[i].recordingchannelgroups.append(rcg1) bl.recordingchannelgroups.append(rcg1) # now we add the spiketrain from Unit 0 to rcg0 # and add the spiketrain from Unit 1 to rcg1 # ... Note that because neurons are sorted from groups of channels in this situation, it is natural that the :py:class:`RecordingChannelGroup` contains the :py:class:`Unit` object. That unit then contains its spiketrains. There are some shortcuts for IO writers to automatically create this structure based on 'channel_indexes' entries in the annotations for each spiketrain. See :doc:`usecases` for more examples of how the different objects may be used. .. _neo_diagram: Neo diagram =========== Object: * With a star = inherits from :class:`Quantity` Attributes: * In red = required * In white = recommended Relationship: * In cyan = one to many * In magenta = many to many * In yellow = properties (deduced from other relationships) .. image:: images/simple_generated_diagram.png :width: 750 px :download:`Click here for a better quality SVG diagram <./images/simple_generated_diagram.svg>` For more details, see the :doc:`api_reference`. Inheritance =========== Some Neo objects (:py:class:`AnalogSignal`, :py:class:`SpikeTrain`, :py:class:`AnalogSignalArray`) inherit from :py:class:`Quantity`, which in turn inherits from NumPy :py:class:`ndarray`. This means that a Neo :py:class:`AnalogSignal` actually is also a :py:class:`Quantity` and an array, giving you access to all of the methods available for those objects. For example, you can pass a :py:class:`SpikeTrain` directly to the :py:func:`numpy.histogram` function, or an :py:class:`AnalogSignal` directly to the :py:func:`numpy.std` function. Initialization ============== Neo objects are initialized with "required", "recommended", and "additional" arguments. - Required arguments MUST be provided at the time of initialization. They are used in the construction of the object. - Recommended arguments may be provided at the time of initialization. They are accessible as Python attributes. They can also be set or modified after initialization. - Additional arguments are defined by the user and are not part of the Neo object model. A primary goal of the Neo project is extensibility. These additional arguments are entries in an attribute of the object: a Python dict called :py:attr:`annotations`. Example: SpikeTrain ------------------- :py:class:`SpikeTrain` is a :py:class:`Quantity`, which is a NumPy array containing values with physical dimensions. The spike times are a required attribute, because the dimensionality of the spike times determines the way in which the :py:class:`Quantity` is constructed. Here is how you initialize a :py:class:`SpikeTrain` with required arguments:: >>> import neo >>> st = neo.SpikeTrain([3, 4, 5], units='sec', t_stop=10.0) >>> print(st) [ 3. 4. 5.] s You will see the spike times printed in a nice format including the units. Because `st` "is a" :py:class:`Quantity` array with units of seconds, it absolutely must have this information at the time of initialization. You can specify the spike times with a keyword argument too:: >>> st = neo.SpikeTrain(times=[3, 4, 5], units='sec', t_stop=10.0) The spike times could also be in a NumPy array. If it is not specified, :attr:`t_start` is assumed to be zero, but another value can easily be specified:: >>> st = neo.SpikeTrain(times=[3, 4, 5], units='sec', t_start=1.0, t_stop=10.0) >>> st.t_start array(1.0) * s Recommended attributes must be specified as keyword arguments, not positional arguments. Finally, let's consider "additional arguments". These are the ones you define for your experiment:: >>> st = neo.SpikeTrain(times=[3, 4, 5], units='sec', t_stop=10.0, rat_name='Fred') >>> print(st.annotations) {'rat_name': 'Fred'} Because ``rat_name`` is not part of the Neo object model, it is placed in the dict :py:attr:`annotations`. This dict can be modified as necessary by your code. Annotations ----------- As well as adding annotations as "additional" arguments when an object is constructed, objects may be annotated using the :meth:`annotate` method possessed by all Neo core objects, e.g.:: >>> seg = Segment() >>> seg.annotate(stimulus="step pulse", amplitude=10*nA) >>> print(seg.annotations) {'amplitude': array(10.0) * nA, 'stimulus': 'step pulse'} Since annotations may be written to a file or database, there are some limitations on the data types of annotations: they must be "simple" types or containers (lists, dicts, NumPy arrays) of simple types, where the simple types are ``integer``, ``float``, ``complex``, ``Quantity``, ``string``, ``date``, ``time`` and ``datetime``. See :ref:`specific_annotations` neo-0.3.3/doc/source/developers_guide.rst0000644000175000017500000002425712265516260021505 0ustar sgarciasgarcia00000000000000================= Developers' guide ================= These instructions are for developing on a Unix-like platform, e.g. Linux or Mac OS X, with the bash shell. If you develop on Windows, please get in touch. Mailing lists ------------- General discussion of Neo development takes place in the `NeuralEnsemble Google group`_. Discussion of issues specific to a particular ticket in the issue tracker should take place on the tracker. Using the issue tracker ----------------------- If you find a bug in Neo, please create a new ticket on the `issue tracker`_, setting the type to "defect". Choose a name that is as specific as possible to the problem you've found, and in the description give as much information as you think is necessary to recreate the problem. The best way to do this is to create the shortest possible Python script that demonstrates the problem, and attach the file to the ticket. If you have an idea for an improvement to Neo, create a ticket with type "enhancement". If you already have an implementation of the idea, create a patch (see below) and attach it to the ticket. To keep track of changes to the code and to tickets, you can register for a GitHub account and then set to watch the repository at `GitHub Repository`_ (see https://help.github.com/articles/watching-repositories/). Requirements ------------ * Python_ 2.6, 2.7, or 3.3 * numpy_ >= 1.3.0 * quantities_ >= 0.9.0 * if using Python 2.6, unittest2_ >= 0.5.1 * Setuptools >= 0.7 * nose_ >= 0.11.1 (for running tests) * Sphinx_ >= 0.6.4 (for building documentation) * (optional) tox_ >= 0.9 (makes it easier to test with multiple Python versions) * (optional) coverage_ >= 2.85 (for measuring test coverage) * (optional) scipy >= 0.8 (for Matlab IO) * (optional) pytables >= >= 2.2 (for HDF5 IO) Getting the source code ----------------------- We use the Git version control system. The best way to contribute is through GitHub_. You will first need a GitHub account, and you should then fork the repository at `GitHub Repository`_ (see http://help.github.com/fork-a-repo/). To get a local copy of the repository:: $ cd /some/directory $ git clone git@github.com:/python-neo.git Now you need to make sure that the ``neo`` package is on your PYTHONPATH. You can do this either by installing Neo:: $ cd python-neo $ python setup.py install $ python3 setup.py install (if you do this, you will have to re-run ``setup.py install`` any time you make changes to the code) *or* by creating symbolic links from somewhere on your PYTHONPATH, for example:: $ ln -s python-neo/neo $ export PYTHONPATH=/some/directory:${PYTHONPATH} An alternate solution is to install Neo with the *develop* option, this avoids reinstalling when there are changes in the code:: $ sudo python setup.py develop To update to the latest version from the repository:: $ git pull Running the test suite ---------------------- Before you make any changes, run the test suite to make sure all the tests pass on your system:: $ cd neo/test With Python 2.7 or 3.3:: $ python -m unittest discover $ python3 -m unittest discover If you have nose installed:: $ nosetests At the end, if you see "OK", then all the tests passed (or were skipped because certain dependencies are not installed), otherwise it will report on tests that failed or produced errors. To run tests from an individual file:: $ python test_analogsignal.py $ python3 test_analogsignal.py Writing tests ------------- You should try to write automated tests for any new code that you add. If you have found a bug and want to fix it, first write a test that isolates the bug (and that therefore fails with the existing codebase). Then apply your fix and check that the test now passes. To see how well the tests cover the code base, run:: $ nosetests --with-coverage --cover-package=neo --cover-erase Working on the documentation ---------------------------- All modules, classes, functions, and methods (including private and subclassed builtin methods) should have docstrings. Please see `PEP257`_ for a description of docstring conventions. Module docstrings should explain briefly what functions or classes are present. Detailed descriptions can be left for the docstrings of the respective functions or classes. Private functions do not need to be explained here. Class docstrings should include an explanation of the purpose of the class and, when applicable, how it relates to standard neuroscientific data. They should also include at least one example, which should be written so it can be run as-is from a clean newly-started Python interactive session (that means all imports should be included). Finally, they should include a list of all arguments, attributes, and properties, with explanations. Properties that return data calculated from other data should explain what calculation is done. A list of methods is not needed, since documentation will be generated from the method docstrings. Method and function docstrings should include an explanation for what the method or function does. If this may not be clear, one or more examples may be included. Examples that are only a few lines do not need to include imports or setup, but more complicated examples should have them. Examples can be tested easily using th iPython %doctest_mode magic. This will strip >>> and ... from the beginning of each line of the example, so the example can be copied and pasted as-is. The documentation is written in `reStructuredText`_, using the `Sphinx`_ documentation system. Any mention of another neo module, class, attribute, method, or function should be properly marked up so automatic links can be generated. The same goes for quantities or numpy. To build the documentation:: $ cd python-neo/doc $ make html Then open `some/directory/neo_trunk/doc/build/html/index.html` in your browser. Committing your changes ----------------------- Once you are happy with your changes, **run the test suite again to check that you have not introduced any new bugs**. It is also recommended to check your code with a code checking program, such as `pyflakes`_ or `flake8`_. Then you can commit them to your local repository:: $ git commit -m 'informative commit message' If this is your first commit to the project, please add your name and affiliation/employer to :file:`doc/source/authors.rst` You can then push your changes to your online repository on GitHub:: $ git push Once you think your changes are ready to be included in the main Neo repository, open a pull request on GitHub (see https://help.github.com/articles/using-pull-requests). Python 3 -------- Neo core should work with both recent versions of Python 2 (versions 2.6 and 2.7) and Python 3 (version 3.3). Neo IO modules should ideally work with both Python 2 and 3, but certain modules may only work with one or the other (see :doc:`install`). So far, we have managed to write code that works with both Python 2 and 3. Mainly this involves avoiding the ``print`` statement (use ``logging.info`` instead), and putting ``from __future__ import division`` at the beginning of any file that uses division. If in doubt, `Porting to Python 3`_ by Lennart Regebro is an excellent resource. The most important thing to remember is to run tests with at least one version of Python 2 and at least one version of Python 3. There is generally no problem in having multiple versions of Python installed on your computer at once: e.g., on Ubuntu Python 2 is available as `python` and Python 3 as `python3`, while on Arch Linux Python 2 is `python2` and Python 3 `python`. See `PEP394`_ for more on this. Coding standards and style -------------------------- All code should conform as much as possible to `PEP 8`_, and should run with Python 2.6, 2.7, and 3.3. You can use the `pep8`_ program to check the code for PEP 8 conformity. You can also use `flake8`_, which combines pep8 and pyflakes. However, the pep8 and flake8 programs does not check for all PEP 8 issues. In particular, they does not check that the import statements are in the correct order. Also, please do not use "from __ import *". This is slow, can lead to conflicts, and makes it difficult for code analysis software. Making a release ---------------- .. TODO: discuss branching/tagging policy. Add a section in /doc/src/whatisnew.rst for the release. First check that the version string (in :file:`neo/version.py`, :file:`setup.py`, :file:`doc/conf.py` and :file:`doc/install.rst`) is correct. To build a source package:: $ python setup.py sdist To upload the package to `PyPI`_ (currently Samuel Garcia and Andrew Davison have the necessary permissions to do this):: $ python setup.py sdist upload $ python setup.py upload_docs --upload-dir=doc/build/html .. should we also distribute via software.incf.org Finally, tag the release in the Git repository and push it:: $ git tag $ git push --tags origin .. make a release branch If you want to develop your own IO module ----------------------------------------- See :ref:`io_dev_guide` for implementation of a new IO. .. _Python: http://www.python.org .. _nose: http://somethingaboutorange.com/mrl/projects/nose/ .. _unittest2: http://pypi.python.org/pypi/unittest2 .. _Setuptools: https://pypi.python.org/pypi/setuptools/ .. _tox: http://codespeak.net/tox/ .. _coverage: http://nedbatchelder.com/code/coverage/ .. _`PEP 8`: http://www.python.org/dev/peps/pep-0008/ .. _`issue tracker`: https://github.com/NeuralEnsemble/python-neo/issues .. _`Porting to Python 3`: http://python3porting.com/ .. _`NeuralEnsemble Google group`: http://groups.google.com/group/neuralensemble .. _reStructuredText: http://docutils.sourceforge.net/rst.html .. _Sphinx: http://sphinx.pocoo.org/ .. _numpy: http://numpy.scipy.org/ .. _quantities: http://pypi.python.org/pypi/quantities .. _PEP257: http://www.python.org/dev/peps/pep-0257/ .. _PEP394: http://www.python.org/dev/peps/pep-0394/ .. _PyPI: http://pypi.python.org .. _GitHub: http://github.com .. _`GitHub Repository`: https://github.com/NeuralEnsemble/python-neo/ .. _pep8: https://pypi.python.org/pypi/pep8 .. _flake8: https://pypi.python.org/pypi/flake8/ .. _pyflakes: https://pypi.python.org/pypi/pyflakes/ neo-0.3.3/doc/source/api_reference.rst0000644000175000017500000000020312265516260020730 0ustar sgarciasgarcia00000000000000API Reference ============= .. automodule:: neo.core .. testsetup:: * from neo import SpikeTrain import quantities as pqneo-0.3.3/doc/source/images/0000755000175000017500000000000012273723667016673 5ustar sgarciasgarcia00000000000000neo-0.3.3/doc/source/images/neologo_light.png0000644000175000017500000001505712265516260022230 0ustar sgarciasgarcia00000000000000�PNG  IHDR�)W��sRGB��� pHYs  ��tIME�  ;0����IDATx��y��՝�?�����UT�T�˪�b���I�1��NNw��frNzLw:�c��t:=3풰���hm���"��@��B���|珷�(�%�8!3��_���w�s�{���ߒm��:�3Kp�΀� ����j�3�ﴐ��=��������o���"�����/ ��^WWW^^��Ғ��1hР��������E ��+ŏ�D�x��N���ɹ��+�Z[[�����c�=���;v��j2d������o|����x�soRMMͫ��:o޼e˖%��<999�gϾ��{Ǎ�������;��o߾~�����ן����}��w���%ƻ�;kaa��(�l�����={��P�ϝ;w���]]zO۶m��{������Ǐ����h������w�����AC���۽kw�Z�V$���t���Ԗ��瞻�z�����aÆ���ޜ�$�s�=w�w���������>%%�3 ���;�}� �^H��� W�]����� � �02�ڡ�� R!ڠ�Q_���C�B��C-ԚfH�:Hu[q�D��g�! 2P7�!�A�Z�b�-����� @��A+[.7�0T��6��C+�C�h4��3-��F"Ǥ��&S�)����3�+���HRYY�޽{�/���������\�>}6l�P\\��~������XTTԯ_���l� ���UUU=x�̙��SO���^�7�|�ֿ���`� D �2�I��ٱk�hmR�����'F�W���0\l4���'�@�8��aH@.d����A��0�P 9�iV��4u�.Ҡ AЌ��n;] �PdgK�8��/A�(���� b,��`�8�b��fQhD�6����8 U��[\���Ճ:>8F��e˖���ׯ��� �?333����_t�E���x뭷�|��cw��oL�܉�-��>��~����YYY?����Ӌ����Ecc�C��/_~������vg�;w�/�˓�#����G����U��D4�j��)Ӧ�2�� ��gee�b���������,��G���#B�r*J7��0� i�i1h�O�Q|�j�3�V� ��@����i� �U�d�|h�sP��b�� �n��:Ȳs�t�,jq��|If�ȁL|eCԙB���һ���Z� J`;�@ 2�0%�%��z���Ƿ9ƍ�}q��������+++�=��cwe���'��I�d�ʕ=�L�>=�Hk�$VTT <�G�%K��Q#c� �"��p�%��ض�k����_�����h��_B����QR��Wʐ@\*�$�J�(AR4P�@}R �"DL�ҥ ���0Q��D ���4�H)� R��v��HEYG�HA��Mi�=�3J�����x6G�&N���G����/^|��מȹ���k_x��]n��� ��X755 <�СCݑ�t������vI6��֞w�y[�n�j�6mZ�׉��3o.����(�p�srs~6�gw}��;�� � �����|��9��E  �V�HM{�&�"����O`��G�C��A�� \��)V�h�V���M��A9�@#����/�+e�q6��D�X�`��T��ç�g�XV�+!��b �*�͸�jm�h��lQ��Ea'�c��}�ݡ%C��V.���իW�X��K�^~��'�ۛ6m�4iRuuu/#Ws�Ν7o^����̪������X�7�tS{{{W�ƍG�}�.;��|�����5BTQا�'�G�#�ݾ"��|���Z�#1����o~���O=�[��ֳ�>۽eŊ3g�<���7���}�5��.�ӑ��9k֬Gy��e޼y?��Oz��T�\��򇙄��mD9r?���]_ ����F�r�i����' 4�� �J��؅� ���aF�\�������5P�1�RȮ��H�z�[)**�0aBoV��K/=�&=n�rɒ%�'M������pg��m2�_QQѽ{�-�����E�(_� ����}�;^�d��1(@ �,^dnwB�� P >��xQ,b"n�7W�*� JL�1��6xG�'o0���x�e��[M��1h�����D*ц(zۮ��b �Nћ�����|,�g���Uf5^P.�G��<1��w�\�w�P�%���3�u"�2jԨ^ �(��#�2u���tg[�p�g qv��'饗^:�-==�S��W���sGT�s���[���t�,��������@J���0Y��R��Σ�44蚠��CN�!� y�?ᯂ�Ea�+w�&u���@3i�>K��u!|%�Y ��S�Tu)G�E�;�;z�Vrrrz%�%����jlnn>�m���=�ֵk�644�2�*�Gw�����U+Wu��(�pʴ)�?3)�ͼ���TE@� QSDEgd��/���L��a�"Sx6"Vp��uh�9� G�t~͐e����a���Xm]!�l |-����ٲ�]-���E4⤽qY�c+њ(d��) �WC���� �8���,M/)�:9�Y��G�O��S�?]���� ���#F��+Ǝ������mr8���Ǩ6�����!�X��!���1?َ]�VDn2W�U(�E�W�!�:�y��!Z�!1��BH~�\���4�����H��ȃa'��,i�5$x��U��{L&j��V���Q�¹���OF�p��evJmP,E��R�ћӿm۶?AiG�v �F_��nԩXVV����t��"�E�3��c�Q�FS�L�� Q�@����ǜc�D�\h����4x�����X��+�J—C��0-p�iט<��H���M4(L ���P���aL#�D�H���L).Yα a�}��h.��IE���������S~�t�Wk�t�9���}!������8X1\(�'��)!�L�`b;���H�l�4"P�rM�! �"�F;��F�����p6 �,k�4o��H ��y����W����,g�t�h�F&jQ>D8���#ԉ��O�� M�v�'j�Z�©{�*I7�tSNN������ʞ�Ixl{�棵�u���=�����b��n��"�"�����+�r8l�Y�a-��O�0mb*Z+J��v\�����*�<�N1L2�r���3�v9���G>9��\f�>��Uh�BE�D��ڮ�xM��R�������MyLE{�Yv��7;Q��M �+چ�E�/��|�����Ȃ*H�>p�pU�|p̘1_lYWfU&�b����'+�~��nkjK�G��k� ����3f�-��M���#�B�rd~#�G����y��/W�B+S�S6���Gaw�HEQ�6+Z��%F��$(���NS7��3������B�.��`5j��'��4��ؘ�Ђ^WhR�9�ߞ>p 6�G�Ν;O= �eΊ�h�k�p��>X}��G��4X��4+z5��NQy�����b��t( ��o%�Pz�#�8��*/�k:Jq��*]N������m��N@ЈڥL���#���Dx ��E�"��_$��hcD��›�hC��v�?��qlx~�ڵ_�[���(:{��9�����}����ZM ��E��;M ���#|6��Q����"��VJ��|-S��(��#i�9�h3�+�L1�Df]!��f+\&�4�1W�)r��-1�w�nB�^uGa�f.���@j��G�����(&c�Vk��"M�lj��c�*++?���Spy��ۛ�K���� �7�?(f(\�� �8�A����h;�F��@í)��s皉6F=O�.�C�2�� ].���X� ��7�0�^A�!3ԙ�?��$s�Ҭ���ȶ�s(�I������X1N$��4Q~����\CĹ�~dգ�(S��|Q��&�E����怈�V�<�O,�����lu���EAS5�G�i�����3DQ<:m�fϞ��D������}9�g��3f�<�}=^��ƍ%}�W$������~t��[�a{����̃��{ R�sM0ؘ��A!���p |ŏ,� ��󤻥P,���K����&Z����W"�2�����2��͞ s�&�z4�[���O#MW�V\����n68z�j!*p{}���̙3KKK��<��#�-J"��!����?��iы�@ 3�2�%�����V�Z����l���|i�TIt��a$p����`�#�%O�G����:h�W���jL���F?�B�{p���(���D��-`|�|j�ͨ�]�cZ�n�BEby�u�3#��0X���!�K���1�'^KkI;��())��w�ۣ�[n�?~���2{"�$�����ǣ8;�����7�~c�=�K|$��s�Λo�P!�V����F�#� ���LQ �A>�֑�A�[�T� ~ ���a�x��7�*��z ~a� ������D?��2E�4�S�[�}�����%K�̞={������w�WM1�97�x���J%W#��?�p�…/���>��2��`�,j��Z'�0�4]!�r3�,0�D�m%��3�˷�8��2�!(��!�&����]l5�t\�b&��v� �#d\n>�����:t��� �(�<skJ�iGR���mܸqΜ9�>�l�T�;555555�|��_�$�H�w~~�[o���/��O_e���n����߽�ފ����I�2�QY{����7o�|�s��.�[�q�Y�H]��dN ���j�I*�zh�H��u�� ����z9a�A��� #p�A\�(�x|�$ ���ID¹�@����x#� 82,�C�ʍ������!ŤBLwT�$�<1������j'��e.,Z�hѢE�f����4iR׵�?j����+���-�+�XmOF�Q��Z��^�^�{G!#)�_I��*� \�VC�[���{�-�=P o�fh�,ӊr��݂K9�2Y(G�E㤳�h��sP��p�x���}���&���B��::n[�~�����d�sQN���ns*f���H�P�5~B�1cƌ�}�����T&�Y�v��믿����*//_�p�O>�iӦ���f̘q�5�̜9��� ++��RJҽ��{�����{��F�^[��0H��& "�CE6쵟���n4�d���֤ܳ�j�P��`�@�R�F��f)4�I� �Y���(�,�* a� -8m� ��7��[m0\� �C��'d��!)XτA8G����r� 4VL�׬�A����[�'�P�Y󢟩ﱜ�֭۽{wmmm"����((((--=묳��������|��W�]����� �׷׷'�$�a_��4��G���>��t�Ɲ�3�8C�����-�*P�IEND�B`�neo-0.3.3/doc/source/images/multi_segment_diagram_spiketrain.png0000644000175000017500000010242612265516260026165 0ustar sgarciasgarcia00000000000000�PNG  IHDR���y�gAMA�� �abKGD������� pHYs � �B(�xtIME�  ;«�" IDATx���w�����זּ��ް���@�1�f��1�j !�J!H(/!$BK���j%z7L1��1���{�&i�?Εw���JڑV���<���F������ѝ[@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$,~��p�c�fk�����!E���( �x|�+�|���� Lk�1]��)��N���ꁑ�����F���:���w_�����lۋ��<�G1;��$j(+�vv�N ,��a5n��mD�������f�K�Qͷl��jTEDD�P��`�������e�+��\�n(���xX|��N��m�ǁ��5�T�����)Xm�L�ڔD9�܍^�a5�������f$V��u���*�kO>t��&��؍^r��w���lp+�?���9����S%��`0'%1y�%r�(zep+ iwv��&X�k�1�#i�w�6�7Ǹl�{�`�Y�p�KD�I��-������}���:�L��>���5eK�j�O���u������.Y}.���=v���y�a.� p�KV�re����t�L�����t�K�}]2�/�?���n��n�+[�>�#�TS� !�/.1[����� ,����5� O�j;���9n�u�ov�Ǧ���.� ��[���T��핒��.�K��K��~���l�]����N���\ ���sd�^��T��ED���읩��ǰ�ݓB���)�dS> aK�}���� `��n��g��JFӼG�S �Jx� ֋����lt(V�HJ�u~�o1�fʾ��j?l?�6�%��V�Un; S�� �w%V�<�%�}]�{���sd�^��TDD�C����bm �uI�e.Qk߸ �ܛ���pH-�V�����L?s V�6�%?`���I0�d6��r���M�>u�O� | x+�of�������~�=f` ��~P��r�fa5� u.i �=�%��b5��$�[�#��2=�"""Rg�Q}��ӟ쒟�_�p��m�v'�v��a�"��p�SPk�w�K�nr�T�D2�ȭ7���q���ڑ���[=��D��*5A�� 4"���%�;c�`vI�nk�]:gw�������S%��$��]܂��]����ጂ��#X���z��}鿥�����+�tO���wV�Z��|�K��a����v[�} �� : ����k��,��إ�`5��S���cLF3<�"""JT;�+����B��]����a�� �e�撝E�V��=���6֋�K��b�:u�;��?�%�oatV�.g?��k����aO��5��ހu4�6p:��][�إ�װ����S���t ���L�j�T�9&3=�"""���J6��l�� X���.��>�O�(�(�\d��!�V�w�Kb��%U^7 �)1���gJ u�VS� �@���{L�� 6tӾn�G���C��/���'����\,��n���rW��ۗ4�*l�S)B�Dx��BDD��Хio6�.�O�jQ���j��xDDDD����:T-�.�M(P��Io��sl*���8��b���~�����k���7cc��*�唺�"""҉t��Nw��d�V`6c�w����� �_ ܍�L�p`�Gm�����`f��W��r {EDDD��'�,l��T�i�%j/.���VkkTs-�r��������N����3�湺v�����hlN���|������K�%�M�Jl�Q�m�'�E��wac�f� �Ǧ.]��s7l����eX�������&�5�}�%���V�*���(Q�(�~Mnm=[R���V�~n\\ ����@� ���l,p�Kwv��&�en�c�G�,�-���ۻ���'�d�)�� �u�KZ6��WYDDD:�M�6�Q�R�'.ajjv�l/���:Mi?ovϏKI�׸}Ih���xk���|�I &�;b5�2,�ľ�͠ܮƚ:4��>�W`��nٖ k����v����Ꝉ�Z�\�]~������l�G!�g=V |��K��i�=�����h�K��q�z�('|��9�-��I�7\r| �$`,V�[�]�/MyϠ���)�����\_i���������X ��@�����8�����+`}ʲ���-l{c��>HRb��~���m�K 3��{]�)X ��Xs�����R�f���=xw�����Վj2�pT�:����m|��9藲l�ns>N�. ,_�����r�8/�}��Yv&p�KV�p��� CI謗���q��~. {/��u�?����{>���z��=���7֦��v�*����H�W�y W��vv����J���HgOT��:��]��k���k�_�n���E� X-����.�̴G�]إ��n��oaC^���̱X��Gs�\1lD��]2\�k/+"""ҩ�s�K�g˱KχO�������e= !�lاL���\�z3��G� ��~ �|���v9�x�%�ϸ��^}-EDDD:��g�is�L%""""JTEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD���x� ��7G�x � �x X��^�+�$�cq �� ���u���[��5���$�����"���b�����-[�"��`Wn/���J� ��U���=~�=�S��&�^�$���≯�E��pXX���WD�1ʝ�}�4�o��`�NSA��K��_*ܲ ��w�+�c���������y���*�D�������;6�?R�H�.v'�TEq����N�v��Wn=Řb����];OT_�_]�y�n�OtԂ+Q숄n#���^��xk�4���kw�PV��]�g� lX`�-'�J�*������N�u��.���Dž���}(.��.ſ ����.�؏�K�WfP�c�?�i�����}�8@1��1�tS|�3���y�.�ws���L�q'�@y���ƽ�xX�/vN󚳰Kt��d�Q`�{�K͜�u'pxX���]R��=��u����C���><(����������s��b�X�3(�3�k�k�����?Q�)�r��T��FU�U��t������+"�*q'��I�jWcп�ה3݉�t��[������)���OZ�N� }]����I>�����qϽ��(=�mZ ��=75����4� ���^���0�5��l�{�ڋ�x�7���c�1t�_�U���aC}��\D$c�_�|�'LNm�V��nb{����]�ݟf��p����5h��sW���������}S�S�)�D�U��#�?��hl��K��H��t'����eB�$��闁�i:�C�Ԕ����h�~����$�)QU�G����*�-�N\=�����:4%�"���;�/?}� �� x(���q����z�m�LMD�r��B���ݻ��G���c�1Q|�M��a���� ��6�"�ki��c� ������}>p�O�\���e�s����e�ӗ�ˈ��~�� Ga㩾�S��>��U|u��� <�5A��n�SP�*���H�% �F�$z�{��ݝ�7���W;�c�(U�݄��w�{���S�Ϛ�~�b֓v ���2�mX'���/w�K���c�1�X�1�s��+��� ��?•���߬����4 ]�g�]�M�4�&����j����5��u�{���,l��Z������b|lƕ���*�,�6����;�r�[ڇ�pR{�,��-_ <��;:�c���S����_�a@�i~�BŘb,'a|��j }�sϛ�� ŗ�+���0P�SSb*q���"��^����ؠ��݉�S����f^�r�U`��>�����Ҽ��El����k�>,w����I>����$������������q W������3�X���oHs4�m��K�C|]�Al��_���'��~vŘ(�DD� 6�q���]턏�w(�ŗ����KT�cm�f�p)�uZ�+�ŗ�������_a7�`m�Σ��,�1Q|�����������������������������������������������������H{�DD����*��=��6|�=�>: �`�Ui��~*���"ٗ��<��갴{;em��c P ���h���v�]��.������WU�ޑ��"JT>��C���⫭�������?�U�֝4nR1�{�T""ũDE """"JTEDDDD�������U%�""""�DUDDDDD���S�]T """�D��~�V1�U<|��%���p6���� I�_Á-�g��T$"""�D5�"����n�q�� . <�<�b%���`����U,��x� �b�ΐ��� � x��-p0P����� �����k.���#�2�9�<��c���q������ey*���������IDDD:z�ڝ��G)�L���*�l��T<�R"��()��%��p$�}���.������.�>x 虲���`(p�K�����}7���&���b�z���<��Y$צ^������ݏ��ܱ�E���t 0X ܛ&�Z��(ނNt礵dveD�8J�J��f-�*��Fq$�PE�g�<�Ҳz�z���.�K��2`�_2x�������J������K�� ^��Q� ,��-;%�l �L�6��9����}v,��[�}~�� ��[�4R�� <~k��3��<�C"q�/pG�qE���;q����y����v}ip��A\,&��� ;�v�{V����-3ǹ�-MF(�n����sG��&�T mksJ"1J�j����3p�9x%q�i@ض�D�w�.]� ��-Mx�%��C�秱!����_�W�\>�R~Y��D�*��}L�K4ci�l�&?a����!�/�7Q�G�%L�0QU���D5�q�����H�jkۥ���J�D^�.A�S܈����?�.G��|��� ����� q����,�v'�a!��Ɂ���Gu�`�F�*��|�Vn� vI����]\�a}Q�2>���Ѯi�7)��]'����ͷQ��뙴~x<�k_�:Re� �싵��P��� � y���,_F�c���<~ Ǡ�����N�o�縭~���e�������xk ś�(?��F�QI�ITߢ�,F}�H�]�$���v��]���!���X���s��R��t2p6cӤ/{��d�A}�6X�վ��N���t��b���&~�, a}Q����MqԒ_��VIGJTWѣ�B��*"�E��M��^���M�+�!R��uݨ���Ta:4p?Jn؏����.Ɔ�J ���Z�~/��Y��=���Y�qI���\���ƚ���� k<=��E���7�Qs.q��~-ă�H�e� ���^�~H�ދ��F,6�C}���bQZ�����R[s0ֆ4L� ��a���Zlȗ��_�lw,�v�� l���k�37���?k/,Vq-�a�;�����D�C�]��u����)��1ذ/��X_o͉�sFY����xSe��T���|��8����^-[�/�_@/`06]�jb�yĢ �/�|$���tχ��Iؘtb퀖�d�*l(�X�?��7d�>���ڎ��GbÍ�5�j6�I�k��$� Ta�{7�j�_��z-�q�q�<���_�3�k�U�.""�D�y3�<��wǦ7M�F<�CJ">ֱ*,��*4�M�,><>2LT}*��݀�7b����i{�|�0�$҅��w(�������mX�� ?Nu�O�)��H�&�*H��n ��㫏u?�F��K^�w�^��VDDD ��kT��%�V{��ۅx|g�jFѳOw�ח��`$p��m��� ζ4 �(<�� ܏[���|n��M|��3�o��>�JY��ҿ�_����Թ��ͼ�D�� I���qlb�J��{�����>�LZ�~/:��Z�Y[C�l/�����v��)���9I�A�: �c�q�׎#������mx��vE+����J`��#��)��*�{n\ ���~@<�����t���������ӓ�xTs�s�2�=B��u�Y9_�!E�a �e�q9�&�m�"�jIG�">���5ei��B��v3pJ��Z��W�<��!y�����ک��X$� `u��e�t�q�5��Q+�}�3�O3�/t�X�J�[(3S�f+D6��P��v4[[��9x��N����xi:ey,�g5P�Ht�6�� �� H�EDD:\��{��( kVBy�=�b�{�2�![����G�fͲ"*�/�@o�x/����l|� �f`���b�����[�&F%�M'�O��>�����z]ee�TTVQ[�x�_�Ay�3Xo릌.h��^"�٩|����h$����I�(�%5X'�t��xF��x�7<��S�1�Z I�/$�[���Τ��S_�;���1��=��U�K��^jkv6�j2��u�j�y0h(�YkV@�m��$�����&I�P �L���_��)�k��n�-�癋5��\��ڧ>^���B !�]�̚դSO�L��2 >�oŶ:�w8?�"�Ŗ����w�������[��b;'Շ��x�����m��{Tv��5+� ,�H�M���u�M#�غ�D�E��T��.]�=�tϟx��!�p������4���܉-1"�Y&�S�|�c�6��M�}�[C��5��Y�x� �m���-;�� V����s[�ڭ�&�<a����^9nk�q��VzI��q���)!��YY-o��<������s� 6$ԕ!��t`>g�>ÛY�!l�����>?���;�e���'�0��4m � IDAT�t<p;�n#��y���!�����.��� �.�Ł����c�5*���I��:�L�C�p���R,&w�t���S2O�:�J����ܩ��F�w��؜�[����a�in�p[�{�WV d�7��y1|��<���0[���Gߏ �a�2�<�b�bOT&�[k4��P�"�z�T]˺5���`��':`�D5Ix��I$�r�m."""�VI�; �ܐz��6���<� %��D,6�uk.�Ӿ�����G`ㅶ$�d���� ��n� 0X | �9Mc9�;�淞����A짯�����ڻ�O)�X�͗>-�-Ӟ�lE"�SZ6�%��)��W�?r�?8��ސ�\�Gc�o�f�z 虲��X���X[���f�ʥ����s]›oOc�x%|W_% [ؗ�G�z�u@�H�2bѹi�Y�ᶺP^� �Ҟt�>���SZVM �;s'�\B<�"ɃЇ�el2����.��4���ں>�ϣ�;��`�i��E�%�K��䰿O�����#�7u�}?���Iv�T����4+�գ�/�W�'�E����=��v����ҥ,[�%_ͼ�ٟ��Y���ۿA<^��r�a�%9 ��6_}0q���<���:c� 9�O[̤�p�~o�󛈈�H�&����<"e������>��~�&=�|�3�/��jU�I�`� "a7l�5����+Ģ�V�L��ݨ��F��9�׎0� ��k���b5��e��2l��`��< G�+%"""a ����V5۱?�^��g�r�3���[���kj�?/P��N������>m�55X��X{�_�0���.��N�o�Z< ���~������ �F�b���ϥ���X�������`�F?/`��I��`l�LMn.�ڦ\�5�*Ͷ"�O�Y =���pbɏ0jT7#�v�`���Ԫ�e��ʁ�״e=I�ئ}�A�_���W?�jU/�jY/p�Gb5�_��M�~��rl-�Y�*�c��i��� XǪDG�À7���bp/�S��t�t���OiY5�M+�*�:���7�^b ��4�݊]��X�;֌�3`��KP簏��)�� PF/���N��a�H�w5pv��Dl�:i��s�#���RDڿW�W-èQ�v��˴��Vx%�@e�������W�I���s�s�׸@����-���$�o�أK� ��U��N�)�D�bw � �x�8�P�ʥ{�Yga����@���¦���{a��XDDD���|�Q}aCr�bqS�*Q�$p��-V��-���JTEDD���+��-8֬�r��fŒ�3'�7����o��U؜�?L��#.�-����+QM����V����H1$��6�U�mEߍ�,[TG<���ueTT�ѭgw֭����kS{��-[�r �&ňE�`��7��5R���?���mU��J�N��Hy�HDDD���G�B�H���.qꪗR_�5����c��^w"�յx^ �/��f�>,]PMy�yX��籦���o�耴 l~�Ly\��I�e��oT$"""R �jжԬ�P��z���'))y�x�F4��D�J��y��u�c�.�.��@y�GݲBulJ��?G������z�C�����V�S��`��}X�up�GE�ͩ��^�)��Y�k�w���w�5� 6��n�� ��_9����Q�Ԡ�$�': X�b�bKT'QR�3��}{��X�>jk*Y��,��Hi�:���6�?�8T�[X� )Iݐ�z��]�\>]�;����T�l��Ӂkh�� ��*)�D�I��;��9�7�= �N3�X���'c�7ŪaK˾E��>R�{���U�M`��DrS�9d?�iG�96Q���dA^��JDDD�1Q� �'� 6��VXs�����v��CYy=u5۹m�k Zƚ��C�IQ?�2�����)ϯ���� E``�����[�΍X�:��LTc������k��q+��JIɣ��G�$����������� ��^�`�[C��r��KJ��1Q��fSj� �h���� �*�\ej�k���:���H1'�k�i_�81�ʥ?�W�1�\���9e�3�EPZћ��m�YWNiY �u��l��?� �r��$:�u<�]���7�����s�2���H��=<�\ �Њm�g���7�"�PW� ��j�� ~�z�N�~$�n���[�Z�?u�$�{����%���5����~��E���A�3�~�o 02��'�du邓��w��E���o���{ӳا9~�ӰK�?�:p |��O�66��6��m��.�C,���H'������R�t���Od���i�9�?��U��r�n^v��}]���M����"�k7���Z� ���n��\�l���Mt�ڍ�)d��?{b�h�.)�Du�+�4���f�����=\��:����� ��� y��]���>��$6ֹ�r���@�8�C`|ҏ�1ADDD��� i���<\C�����šS�w ���X��q����6��M�YU������Nw��j���WKDDD�-Q،��d�����@Yy-�7�7���1ͷLL���| �_��>�5S8�-�k�z�Bg���AC���(Q�bLT�P�u*�H��%�|��x������-�3�~-$� ��|Va���0 �)JT����a��ݱ��E*i��{j�DIIobѥ�c[�nL<֏X�h�jj�f�>X�l�~ <��2�V�wv��h=��㝱 ��#)1���DDDD�-Qݎ�k#TV� �2�� JJ�%�����>����j�F)CI�U���Ӕ�}��s�wvsSP����H�%�+�t�}S�{Tt���_��zPV�$�X�ʗ�E��'�':<B�>wka���Z��G�eXG�tFa5�3�ٽ>Ɔ�����Ǧ.� ,�:6M��㾦�QL_-)�D�U"��Lg��}�=ƞ�N{�Ɛ�>��v#J�ֺ�-��Ӎ��.yȪ��ܽm TN��7e:e���PN'o�<��p\S���~��.�-Ͼu96�֝�%X��ǰ)_ )��y��Z"""�Zaw�z�X�1������1��_ZVO,Z��͙�*J<����@<陲����� TNۦ<�"��=��'\��K^�p���p�,�k"/~���O&y���g�3\��@�C������ �F��K<��{�a�^$Z�w|v�:S���q�ݱ�6��ģǸ��A���ݲ��{ݑ�e�c� Σ���-�.�n*ه�v�� G#R�g��Z"""�Z�G�?V�x V�Vl�ޫ��p;3���u��bu�;D��󎤤�8�-���� jk�(P9��Br��!X'�9�e�/kB��ݰA�g0���P_+ C�5�����}` CUc��Oc���~�ƒ��?@���f�:�槩 ۡ��_��k�5X3�S���1>�X<���Y�Ӝ���~���b6tٽ�Pd�,����:��,�-��Q�)�R p�O�N�Ǯ��5��Erv)�㞯�,/�[��.�w�b{����9lF����<�%_�_����u�qT+�pI�o˞Ɔr�ފ}�5��l\������H����(֯�L����2��`�f��l��]��J��^7�pe�j 7�]&&bC�e"�k�(�;���lKS��mC����q������u a_�ϋ�ɴ��c� �}ȉ��� �և�_כ��%ؠ��)�z�ew�y?���F�|F�<��í��$�p_��M��\DR֏`�hͩĚ" v��M���w�K�_�ֹUW�ډ�[��.�e����w?�F��o!Ǜ(��C���q}��¾�?��3���L}~ ��XK�J���u�מH�|�"Z{"%%% ��o̝�t�_��N�&�|�[;����fb�^����jp�q����Uwa�.vr��W�E,�������P.��Ƴ�;����~���e˱˭�U�r��b(����w�<�/����lI�c�/]M�m1�|z�~��>C �5 ����MMw�?�V��U���ݱ)T?s �'.Am���\�n�~p�˧��3^���/��ꎍ��f ��2ZW����v�&��Z]��L{��v��&~o���K����_���#�~g�K�!z�>6 �.��f� �y���n��Mr���x��K��Z=͝����Nh[a�ҷ�.����l�{�t�g�\>������C�Z\�u�;(��Wc폃��;�Du��WB�7��b��x��*��E�j������~͍*�x���Տ���,���'�a�:������H����.޻c��.�z��z�z��8�rؕ�SX'+�z� "Xm~�{\I��}Q���R�(�C-�8�;1��CE31���҉�cf�M���nV,=��\qv)�X���vf}tj���ϋ��](��I�n�OY�Y��(�`��?쒼4�x� MS��Tc���� ����cmKs���*���s$7;�]J8�%e���4���%-ŏ�M1ԜnX? H�<]���L� M_*�.��m%����bTt�'y���N���~��j�y{�>�ؔ���m�S�gT',�Lۨ�t�G���t�6�����ۨ*��W�l�v��D��ҽ�W�^1��q�>#�Am����� ��,v�.hj�|��?*p5�4U0q�Cv��J���@o�%�������&V��5����� ��{s����&{S?A�NQ�UpH��#貿�����Du9�H�^��e��Iϔ�n��}���<���x�팗��3X#�0턵�IxLa�d_�MQ“*i��#D�����#)-߆ht��}�̼Y����Em͗o��뿈�O$��O[i�U�$X�ZO��yjo �_�5�)�D�E�����Z�����7ˣ$��ښ�d~�xk���m������k�*�I�����%�""""E����x|6��V��y�+�c7�ݠ����ҽ�+̝qN�ʣ6�p�� �$}������ž�ɷ��f�2�f����ܬ �m^L��~�6#�pn��ñ�(v��y0P�YDD��&�`���]2���YM��LUSЙ��H)�I �${��N��_� <>� �� ^;�ak��\�t�EDD�GI�� l��� c�6f�&�񼯀=3�^bf�}(��T{�>P�$ ���Q��Z����Oy0؃��ilEDD��%�]zN��|0���l�n���'�ѐ��9����,�z��y@����g����Sn��c"�j�\"�y�ʇ�}���X���ć}�*e�k|7��k>p����=�L������3��<�G�a`m��6Uf>�q��� 4>���G��}��Q��>t���������b��[��J�Opy�e��0�k��z��;�\��v;U> �`�R߮~����>l�����O?��f�����|�0���ϲɛ��mF�ڻ�����-��HY���E�dGJ"����^�cC�l�������G�>=��1�%��mD�e�G�� �F�������جA7c��7��v×w`M6s�3ڨ�N~W�mclf��z���߽kV��K��Y~ �tD'p�_���/{�����Y^(/bmгя��K�� <���=�66s����<��6�S�����7�������Ӿ�8R)F���5~� x��_� d��� ��c��%Ģ{�r��3vf�a@��c] N6��_���={?��u���"�]����ԕ=X��Lb�^v�DDD��&�È�J�]��,���OU��^7+��&f��kC8��U��`s�a���+<�-�x��$��~��j�>�!Q��k'�j�� K��e,�|�uIdy���]N�sVE% ��/�E� �����2p���L&Оm�_On5�54�� ����lG�Aܷuz�p���(Q��p�0�v3I�%�Vd��M�F/�+�ʮ�Q�v4��[D�*Y�f{"�5Ģφ�����si<�@g� �(���k8^�%�k0�Ӂ�k%V#���C*��y�N��F���bWƩ��j�;�`\͡�:|�w�`I�<\^(si|�iI��9ب&��\�C����� ֫#?M�ji�\ZA�)��i���_D�&�Y莍��C�%�Lo�d������N�+�20x󙔖ŀ���9� ��d�F�(�i�l��C\O��,�C� ,��O�>>,��7��z��ǿ��������gvO�8Sa�!\ �]D�3�[��C8����a �+��}z��>t5�����2�"��l����U�:<"���F��"Zif8j�)��$Y���e�l���}�D�v�zlߏ�>��zV��'�P$�`=՗y�E�i9 c�*|8�=��Y"""�?Q=?O��4]���z�����x��-y����ׄ�~�q�T ��Ӛ��.v �u�G�c��^8?�����8M��x0eY�����:�"""�;Q͗u�p�ל lKY�zjk6���;�Z�=v :̱�*CJ�:�`������^�nͭ��&��Ky|.�� =kg�{wki_�R�vR"""����޻�_\���zU=O!�Ï�LK�q����NI��4k;L�w��߮i�{`MFc�c�'0~���W�2�������t�Du;�R��z������7;p�֞�5�a�\����%��s���΀�C���b���Ç)�G*Q�|*�^�����P�+���x�Vno)V[:�u6+S؎Ǧ���_��D>8�������HgMT? ��_���Ir��]Z������`�!� � l�a!���X��s��b���|�)��������H>ۥ�C�����#�Jy���׽���S��� ����#�ٍ��:���K�^��\��%��i};Մg�����ۋ.�ƽGO��� M�ըn� do7ߏ�z�������ݶ ��� �ߋp����p!�6�"���h<�S�mN�١������y.�G��� ���H�[��SXMf�� �Z����yll�D"8�OH۾�V�z!V�z�[>x���'�����ߏ��X���ڏ����a��61��4t U�ը~�]������|����s��h����i[N q�s���iN��Wa����8 x��;+=� q�Wˁb�TU����S�#� DDDD:�n=�a�Q>�]���ƠA��h)#v���.*����]�|L <����m�nH:fp��DDDD:z����Gm��ͮ�j�d��6{T>\�?k�) n�ƆM��T,"""ґ���q()i~X�H�|l��|x��!���(\6X�5�x��MDDD��&�o���׎��1LK�����?%O��x< ���%� $ת^ tU����HGMTѫ�sĢ]�D���*���ɚU�Q^9�*_����p0T!��j����A�X�""""�(-�=Z��d�����U��y_SV���B"彉�mK}}9�e5��L���̗8�@2��¥�ہ�`S����ǵ%�Ee1kWmI�A��l��ՎFsc�w��*kV� |^�}y���,��¥�p��Wq���HGOTV�d�1@`'��%E��f����� �f-R���HgJTVc31����H'��DDDDD�������UQ�*"�l\����5 � ��FHh�mb{p 0e�^�g3�%��xjM��)�2��� U�6���M1�\ e�!I�TE ��`�U�|��nvP�r�X��G M��s�� i���\�:�����| ���&y�[Q�5oˀ��2�śb��1����L��d��:��&��r� c2��C���7�<�x 6)�� ��b�c�kZWS\��M��b�|�[�2�QU��w��Aٖ�#�0�r� �Pc��:ۇ֥��E�c�K���.I} ��KE�:�9�*W;�y+���,�^`��.&Gd��]�Otho�xS �6&C��U8���9 xx�|@| �U�x �ƾ��8Ýl���q[����ll˱˳�3x�π=�f�x�7śb��1������cӛ�K/������#�]o�EX���_c����p'������-r��R�7���@_`I ���;._�(��L�jmL(�$I1&]�Ւ"ɾ��� ȭ�VG48!�����p-֋� �3T6��9X���n�NX'��ͼ���~9��t�x˕�M1�ژP I�HT5�m� �^��`�9(s����*� ���}�L�7�IX���9n�z�|�C� l(���NV��;-P�q ֑c0��!fjuxo���w�;^���(�Cj)&C�nU�J���c�`�]���O=� ��k��#�b� ��Z|� � ���\ҷ=0�����*�}-w����?�G�����'��:mP�b�^`S`6.��X��\�a�*���!8��P7��m��ǥ6�p��9�`���Hh�*�C-�$&CҎm��|J�jh~Ș�6�ݰ�*��_����� ��[�������S�f�Æ z��v�����X| Ӂ�4�|�;�����?���nm���_~��� ���v<���}�'��/���� O��c�1${�}x*�[�j/�S)�� OU4z��X��}ɛ�2����}����6��~�Wx~����{�����.��}�b��/(�:-p�Cw"l+ �KU g�@^�]v�k5x ���ތ �xś(��](�K�N���� �-Uk˒�ܟ��l���i/��$I+������c� n��إ�i::Á���ݶ��]�5�����;#��3������iC�:����{ΰID�ז�?4��n��t�e3��SUSu�����s�=K#��_*��ow*���,����Y*�c����)���KEkL�,����c��չ�X�S��s�d2p^���8�˵fҟ쁄Qx7��n���{Q*.�����`�N�W�r���]��&]?�G���eO������m+b���l' Մ�)�-�}N�����Y^ m�:�X�B����ˁ����햇��� �c�� L��^_!��c��"�^�!��B��> \���N�9'�,���<���m�KY4���M���b7�Sv�:��r����<���_ʍ���>G~�sB!�(2�����WVS�M���ݕ��%l5��s�dn-�Ȕ�wi�m%*�`� ��#;�dGtR���������1����о˰ ��{&p�WDs �ڃ�'��c��C)<�G⟓��YJ�M�}>�E+�Mmg&��nY����wp��)������Q�Q*��_%�� â�����p꣗���B�n������XU�EX����*Z=E�zL�"�G��`6f]��\p��_�-?�����:0�E��7��c��R�����в�މB!D��5|T�?�B�:��+�m�W]�u�ߦ0?Ҷ��y�q�_��Uҫ:�e8����i�J�v���l�X��|~1� ���R ��[;;��NB!��ъ��O�l�y��� ��,��W>�W���G ���V�!���t�`��b� �ss>��^�6#���[O��r= �ˀ��*��W�Jv1%�#���2�� !��G+��_�##Fc��ײ�u�;z�����X��T����%,���l )��B!�(%���J�����i��o\7�����������9��[�тp��uG$��cyy7c�I��!����J{0X,�"��q�+�����;�H�"�ۙX���6���I�ڒ�k�W� = L����dH�Jg��6�*ӵVc>���%|o��к�'�cV�s��c�Oc������:��� -����~�������Z9�1��/���4��X�!ykO�V7C�#\_�&�d�o� Ln� C7J�DG)��6���j��轩��E�)}�D:��ǩ;ڥp�ɿ����Hw7Iz�m��o��������lŽ��5�gB�u��7H�F�Q�RE/��x�7�P&_�L�ֆ�*%WT�G���a�*����#`Ň�y#�o�lz��l��pD;�K�W�{�0��� �h�B���T���&�r�L�V,Y��� ��{)��e�`�VU��)����g�h$o%D�&j�}�Rג!�R��>G,�@e�c˦w4�l;� y��zG,���Q�P]'?�m���4@�2`�c ���[�}~h}W�G��� �I]�G��X��ױ������P���о��L��6��3��������X$o%D�&j�o`�K�!�a�8��[A��vҡ�`~,?b�A��rRT�`��.�W�&�E��4;��Уl�pҝ����}�O �~��0+t����v����� �}����S��c�u�1n���P-T��G�`*�[:]��j1e�b�l�G2�*�Z$FSQ o�x�-[�(����{s�޶,A X0U���Ql޸ ;��(������|�Z��03Y����r�s�� [��-α1�r��kvIp�����@:�Q��s,u����s|˹��'o��5�X�l���'��M�q�V�M褐E��Py+�7�X������7$C����G�io`�����7�O$��������Uv� � 0 n1G�a����_�*�%b)�. G�ҹf9��_�ˀk�ǜ�;o�a�%���L��/�*��<ۼ����L�R��-4���eH}�/v��r��|��K�����8����oא�cZ�&j�끯`Ʀ%^~�%C�#�7���A5A� U�oR��*�V��Ý�\j�nձTլ�|arg��oU����,�d�Xg����n�e�a7��y� �� �'A�σ���i����TY�-X�o���G� ��0��|�)��e�o�,�e����b���y�7X���(�����}�+�[�2T�&�@_�`4����uzg�����p7�z�>�}�?�Y@��ʞ���ǥ/� &��X�1C����B���e �!�O���'�2�����y�8�9��+��V��%㼭S�� ���)��g��� ����;;ǩ~}�s���s�cTƾ�ε�v�3�c��v_��N�7��B�Ϻ�sSj�q����g�~���s��>�9>��5�u�I�R>��1�9��nt�0�M�PXPe�LY�>�\n>}�1�9�Ͳ��80�[��>�α�s�w���:)����c;�,��s��r��� ���s���:G�s|ܹ߯�����jQGeK}���A~tt�-��x �7���v�����÷��SۑL:lZ���-�P��L^�#�Ǘ�Z�1 �� �n����]�+�X�|=�ˤ�s�p����AZ*�B��*������,/���{����^��ݱ��Qؿ��/�d����)�ǐ�������>�J�p�/����XY`3�2]L������Z�8���D�d�~mǍ����Y������hN��_.�l��9�X�-��@�ۢJ]�j�B�'�B�b86M��%9�+���Ɍ�� �{�J�^�Ŕ�u�˧��0x�+��/:�� HK�@��9� A��r� �М7�oB!D+a۩\l���*ze�6,��ǟ�O��c������� fu*6/b�)>'1i�_3���:�I�R2�~�(�uN���&̂��s[�G�B�A�ƢZ�{� ���X��Z�7z��'��?��d��Xl=�Kqn���H�K���=�+��NM�4I\��D���c��"�WKz�p�^�,ŷ8�-�A@�9j)r9� ت ?�O�ze�=j!��{)����� �x���o�����Rfy����Uhj� p%�u�@�'>���"�tI�U|{)Eu0���e+k���D�`�M��-�9GUP�Bn,ʳ�y�J)�������,��,�ط��ɴE�o�,�K>�������{����Dz֍G��ˇ�H���N,�|�;��~���Ȕ�b�_���Xb�L��vF���@�[�\�n>�93���w#��\��2�B=�q4�"=�l�(#��"��/B[1*�������s�ì��J��`)4R����p�I�������Y���_���~����I-�.�s>/�k��8�Gԟ���s�:�M�}����,m�t�ɡ�̄�3��&�ϲ���EU�S�JtN�ke*��t��T�s�#��KaQ�g}mC�JR]�Hc} vy}����/����a�(�ѧ?� YTN�,��_.�J����]\��� �&�|󕍒&�l`sh{Q�d�~,�|e��f� `�s��t�����s���(�ׁ��q��� �m�ع���Vb�#���^��B���P���5x��0��,��7�w� v��}&|.G�v/CF4RU��ҙ��H��0j���E5싹��NM4 �b�-,{q��v����vd��GC�i �9j��*�x�969����s�qXT+�� �x�9��ʣ��u��c�/�z�s���#|YT����R!��(&=ҢZ &�%^���r#A��G����z �5���x|�W�JU��7����(�`. ��g+ɿ�SXQ��g�r���FHQ��*EUHQRTKL)����l2�i��>�Yq( �q3���c�h�뾅U������Y̚��D}�s�O%B> ��O���^� �9�o(�>yew1p7pPW&���5�(�N;��B!���>�,��Z;&j����K_Tn~RTGa96��xn߿��ZǍ4[Ty�{a����=�%�?���Ԗ����*���=8}��B�݉QQ��R<�:��5X�Sjj���dF�;��:f�g����rN�|)���)�(S�c��Q/c�w�3�!{Ɔ��d#���.����`0�#���'�҂�2�_ly;�6���1����jS�Ŗ�k��ԍ��g2ьN���h�&7�ӧ�i�K2ph-+���j��;�X-��� �}2��/�#�`�}1��t,�|�X�)����2��B���A���P�kwv��f�����g����.�ۭY����}������k�>����!$o�w�MX��s�ɛd(�p��z�]���r�dH����me.�Gl7ƀ����C1|䗀�2�#J�پ�qs|�`�ý�:9�o6�X�_���s�����{�̷gQ��_�Q��>�'��d�)���|�wl��yd�h��`Q-���8.�A�NW���R�¿��I��F�h�K�Ft�u���W�Ѭ_���O��WgcS ���g�'rlc.6}2 [\�U��Y��%Z�~�zK;�.�����Ke���XU�Ke$�+��$R�xgbg��V�F�6-~�/cSd��{&AH�V�/y+1�7�P{�K8�dH�QQ]�E����v�.l����fLJ� ����5����%|+"p����G��1�E�ql:�U�O�4`O,�^�����Qd/���"�6�ul�k���A���?�ڷڿ̇�r�7���#�8$o%F�&j�oc^&I�DG(��`AQy��l�����a�u��r�z�2��_C��n�����<��6_������Gd��=���Z򖏼��M2��߹�i}�M2$JJ˺�U�q{8 s�����c�����.Oy�_�OGu�:̂��|]���֭I�dtƵ��#o����y�|�|���%�\|Tg���uճ�|�+���?�5D d�Itׄ���[�(>����t���Ő�����w\2T=�G5V����_�#k��O����e��0r���$���ʹ��t�[?d����]�E~��ӄY�з�j��,���>f�M���/-xM���0�r���L��/�*�F��C>�>������CV��5'�娐�c=�[�جV�߮!=HT�&j�� ���x��� �\(���^8WI�q��N�� �������'i��d�ۻ�a�J�� �� d�#�5n����Y�1�M�y�f�� ����"H7�H$��D"�2-W"�-�9�}s�h"���q�������H9o��TaS���{-�-�~l�:Ob�ī�l��d&� |[:v��F0��pն��wu�ĵ�Q y; � _#�Ь��I�ڡ/�����ЀG2$ʦ���砱�M2�V|8�>Iv�f֬��v��7�-��ҠUO�����W�c�]�2#��,e[����� `�siJ��~$~[��\��xk1��(��8��v���}����� tݓR��/h{zW�&j���d@2$:DQ}� ���}�)�T��~4֟O<�hjj+�Z���s4O�7[RSl3f�_+Wd`8�V?�N ¾�M�%Ur����骼��*vhld �xW~�K ��MH��նY�6��a�� �Me�[��45N`ղj**���Ԗsy=�I�+��-Y�9b/���X��� �'%:-84��>V�+o f��w������qn�� � �u�߻|��OUJy0��Ķ���ȍ���z�B!D�!V�V?Z|8�G�M,�D}ݮ�m�DcC5}������0�~� �.���6�q&6�z��jB�2.�| 85��h�����b1��651���b��X���X>�V�6�l��6 IDAT��VU1��tf"��Ӧ��O���ӦE+a�H����9���\"A���cW]��[N"���\S�l]�D���& L$x����M�iӸ�X�6m�N������h:�}u%�M��i�8=����HpM�� �N�Ƒ���;'��D��l�*�������8�Dq�-�I� �a�b�Q����� ?���c-�XE��Ht��7�͑�M����� ���_M�� ��cg�`|+/��Xn݆D��~i� ڏL/��:eJ�\�Ŷ�1 ��:�f�d�>%������C�;:�6 � ;9W�ٞ��``Uq���ȁ��m-*Q ;���w4���� α�s j�s0���R g�s�������e1%�?C�`��X0� 9������;�<6�=���b��X�����bU���_�U���T��%�j���������%U��� x�H�X$��6%�Az���X��)���w�v=N!��g(�UY�- u�����k?Nu�#l\��ڴ�����X �I�Pt�ʘN �{��t=�ˮ�7���-��cX�֨%������fq"���H�L$��6j�@�=��7ޠ_"���v���^ˀɓ�E!��n��;$��� =|.,��v��~+/ �w�G�?c���f,��꿼�f �[��q:V}+�0�Ǣ��#��GmM;,�ed�$Kg0,��*�hq�(,gnYhld,f-0�/�"wGm-7An9]�B���� �:��*b�gq��il̴L=I� �$�jxOh���RĶ��ӏƢ�?Ѭ��-�4� ���+����������8G 8����D�Q����l ZYݗ�����w3b1���1����V����$�E<�˘[N�٧���]Q�Æ��]��9p���}��V~��׳���縵�7�wd�}imG�Y�+QUŕ�XKC�s����׮�䂪*��{~�c��v��E��"��ɤ|8G����as� R�ae ��L��M��v�YJ��Vk�Y�������\?t�����!�I��|x"��9�P_Yɮ�_�2�,`�D�}3�_ \�Hp��άLu� �;��x�UW\���m�Y��T?�J�ݦ�H��:,��͝�~���ꈮ�)��qf��?�o�O���l����f�*Jԑ�����[;���K5�d�� �F1�����]t�tT��˱J&?�}�_�X�t�s�X�����RJj���w�Ӂ75��C!�B�.F)˓m�-�`4�1�'�9�Kw�:o}h�-�����Z�7R�JK����� ��P� w��2����E��u~��Ȣ�}�EU� YTE1�E��|�x�^�Xo,uQ8��|�ɟ���x~����/������X�G�W+��\��ߠ<9[;��������Gz�t���&O�?�B!��NQ������׏ꚅ��s**��u"o�;����hlx���Uᜀʼ�Y��GY8��{[�n���Tt���1��ˡ�6:9���~� �ƿ.���~��]!��S�A���o���{~����p�s��.e���^�� ��OA�H�Y�+��y�����% -K��p�a���~:�|�cV�(���2 l��;���6��6WS����o��JV������V�kg0[n�����-ogb���8F�S���#�'��^�S���U7b��i}&S2�:���i�%T��46�Afp͊g��CM�#N��'��5+��і��οù8��>s-�G/�Ӝ4n@�5�lN���R�ӹ�؟����_ڵ�e�Z����Jm�$��B���Y���1��q���X$o�mpS��Zɛd(�p���3T}��dHD�S�oX���>�4z*xj ��p45�����:� hĹ��غ�W�;ɞ���8�$h�/X��ӱ +a�~MsU�C�%[����xi�wĖԠ(EK��^�oy���߾��fX��9Q���l<����}H�$Ca�Z����5,PY2$ڤ�E �"�U��+�PU�&ս^��j1���@,���S!լYYIҁ�@j�c����/C?�<�%��%2���a@ou ����3�ub\���¦�^���ؽ��N���~�Y�k�h$o%D�&j�}��%C��UX��0z��3�ũ�ە�-�hl���& �A�J�TU7QQ�$3!}S�I~���]w�� 3}W��d+_􃝯����śC��p�����lk.5�'��23��{I�J��M2�����+���~�t(6e�;#����m���^g cP�^��vcj)����iv�^�Gۂ��tV��?o.�Ta���}�S����R��E/��_���E�����T�d��݂��)oa�#Z0�䭙�LU*����g$C��`�"r(f����ܳ���sj��_bݪ�bv�ռ��|����Fu�-��m�C�#_�{�r��~���*��D~t��:���,�!���� ��D�R�ـ��|�re ���b���7"�Q�q=�[��I���?/��]%%QT{S������t0� jTV�P�7u[.�Ĺ945� �:h(S_��`-�p�I�/�}Xz�gi�B�2?���[P�Ǫw�Uzj��`U�n�r�n�c�C������V��g���L��/�*��<ۼ�`��Z���R�T��t2)������Ln�`B��8�X�kH���I���z�+X1�%^~�%C���$ਮi�(=j썘��.��^��J��m����_�{�}��M¢ge%Ʊ�Cm1�i����!q�"�?=�(Bԩ���� Rx� �l�c�N��򨾇��̣z�$�x���+�ߤ�3^@Y�"8�=������ps���]�p� m�p߈x���,�.����At�ѽ}T%oRT �Q� IQ�PJa�{�X��԰�WZ������[�b�dr^�֎9{�͇ [�@�� #�I���b����ڷ��rC��4KKt>f}�Y}������b���r����G��m9�q�������zw��� ɐ��������,[|��c�+�%�o��a��W�ZA��w�[[0���\:�Xl3��+�L��� �t\�b������; ���MYTC����X��D�,��`�W�7�Q�� �?Y�g@@p����9 X�ׁBѹ(M����}����C�Q_� u�'��PME��4�H.V��ߞH}}�d�,�ڧ2����Odž���v���n�� ̷��^�,q` �?6 ��9 ���� �N�g4�]�Fn��=�pG:�?n����p�d�u���n.&�����z%M��p;;\�Ǎr�mJp��7̯�Q���n��&��>%����&u���� p���z?��9�1�:\��}}n�,ǎw����J��X��6��F���9����;��R��W�;ԝ(�����:��<����b��?jnB�����T�Ψ�B=��>�Ɔ��a��l�|0�n�TQ�9.Iz%�r�#���D<�H���R��9���5X��1��R,�*<;��?���N��PĶ�c����)���(�S1����ر�_Ol���-r�%R�~��n�oc���2����e/�����/�9\)��TOw���a��4����Y����f`�9~��؛1��Csx�e�`J�`�Ƕ��� c�w��1����n�<�e�)��H�]˅'�<� �e���}Ezl�ȃRG�o�/H��?��u����2���� E��{�j|�i��M�_���o�B�G~~��a�AT��K@�8%��O���J�€�i?:�x���og�v��@C@�0B����3�Zg��]ʬ� !�" �4�Ŧ���%�?KL��ڈ�x�X �3U�O��Q�gd������\o�R"/{ @>�~���t�Hp,Ȫ��S"����^�L1K�rD1�/ �$ �7 �# 8K=vJ����B�RYT'����O�&�b*�n���0���"�{�~�n1��ޅ��l�������3���ں8��N���?������d7,xk$$�cV�;��ش��.r9[S��ZZ��Jы��z��dH�L:\-���� �\��� zE!��KQ�Ce՟pɾT�|D]���#�����{,�+73B[��\��j�,e��I��&�������x�:s ��K叛K��@k$1kꏱi�XZ��b���A��k.�a;�/�9\U@��6���]E����7���{(E���G~}����Ha�?x�v%��$�\|o��JS���r��t)J�h��?2WO�)�R,+��x>����w� >�Z��5�󟯻Q���;Xq>����v6���PK�f8EMEU�~�c���tTCG|�o��E>�+4'�\�6�=HO����Np�c|$�9�G9\����7�����J����L�?��"��8\E�}����W;�w��"7��_� %��D ��D u�K�Ţ���T4��<��K�T����£��1��i���;���4<�l�?5 ��ps�;�l�n��e�����:0��.�� Z�4�ý ��Y�O����`��B��՗q. M{'��WQ_� L�nFo�2�z���S3��%.i|>�>���±X���1��2,���j�aA^������ʱs�t3)�|K_s��B�]�n���70I<^ 8�`��&�Q��-ZZE[g�^/PU�@,� ��=���*G��4Ok?����Xҧ���}����E��Կ(&=r�D��}��������է5��u[%Ze'c�;{��T��2� %�;����>}?�'�v�ET���_�9�o�,�w`\Kk]V�`�F�ڟU���Va�$w�H�"�ۙ^��H� Cɛd(̵���F,��d�W%C�MJ��������R1��捃��ٴ.�d�վ2U#卜 � Mb��D3Dž�_��I��#�c��b��c�� �/��bQ�����g����6��������1S�r����-���n�rc����7�P&��{�M`VMmK�$B8�f�4�P���e��� ��գK��Y�����Q���x+C�"�ay\�cAF��T;�r�l,��Nw��/����Q,���f���)e(�ɞ*M2�6��/�?��;ӏ�G����L��b� Q��`��L��V*S}�ȟa�W�S�Uߍ4>��HO�7uI�l¦�fz�ĸ���?/��������9a9 ��r��LzE1!y+&�7�P{�ŁH�D���A,�@8**� �� ��������8 ��!����k�� ��f���2�O̺"�3��W7�����@��G:;�S�����Y���Ra�c����}f�ו�G%���aI�?��y���g��SS��D��J����T��!� ����$C��#-��b0����lb섟1�W�P�70v�$�����̕޴��/u��̐"��R�u]f����=����|���)��~/��_���e�Q ���Y��8\��-�b�[����{(�����1 ��!)�Q)�5l����7�-�{�<�v�og궜� VS�y�+Ѷ���j���)v�˃B�O�Y��gæ�S�K]�3������wr< 6%6��ܾ���F��S��2� �[)��I�Zc*�U�vڐ ��G1�l���C��{O���)����x�@���A�x�X�1����,�Ōȯ�yJKgglZ&���g������ � �̕7��)X��������?7b,�Ƣo���B B��q,-Q�߮� �7�PD�����x��� �(ˢ���v�u+7���������׎"j���&V.�gԸJ6�o���"��Č/���42�7�Q���,��7��R,��4̵$~�@fbY%� al�(�]���b~����: $omq.$�FJ�Y)y� �C_,U%�B��Bɐ(9�c���4����e_j�]�l��ߏ���j�q���?��c?�7IO\�W�6�i��Y����3W�z-q��*SI�J�*SI���|T�����oE���ٴ�h�%�dS P������]�x����`U4D3�\�o�;:-�� ��MH���f�����"Wǀ!�Y�r0��XɦJ` ��T"E�M�G ��Drv�H��'V�$���$r�b'��鸄v �i�1a՚��q"fM����������#B!����Q�gn��լ]yp5�.eղ� ����@���ܻE�Z��;���c�QRX�`~h�ј�H$E5aeH��R���i��hRT�B�n����yO�8�Hc����b���y�Q���I��mh]��[N �)|T�4��|�M�(࿁����Tg7�Q !�OWHf�s+���py^��Ȓu �f�oH����8��5v��K�07��� �BHQm�Ϝ���1���ߩ�#�PKAu�v��#�F?(H�(�1m��PQ�$�6%���+ ��+�A���� �s���؅B����O�/x��^6�Xl3V�tN��D���Ў�*`sh�W�[u����28X��bx%2 Ժ�$[ ��69J]c!��}B!��@:�E���?F}}���2)a���������kX���1�`&���Ģ�b�'��o�:s�#[����5%裵��>4���P������"�ܬ��Ϧ�AT���"]�jX��f��ͥ!j{7g��jsG�Y�� ����j�e%x&SaM5l���e���|���1x� ~V�{���M�����/c�^�h^ `C�m�JL�%���V{�\���O\�dQ>z� (�4��˃:��a������þ8�b���^�O0�˳������mqpr��K�REq>Ƛ�N�c�NxF%�6J ��Q��m$`e&���F�����?� 8���I�}3`���^���\BU�J��R������j'd �6�am5�����Z��p���Q�7�+�^�����'a9<�UE 'MŢ�S3����B��hIh=���+avª�ݙ������e��Ҕ�ByK�s���a�6P���X�� �?�M�m`C�H�D!��c�>��Xe!� ��`�6Q�����qpX���E� ^��N �� �-#蛰(�\ Z��{8�i��;z,�0ęU�P���ˋ35y_S�����b H��Oci�Nu0�+����*U !�B�1��)xGsl3�QQ�Z����N��P�m���k2�H�4�o%pO��X�ј>��3�~�,����>h�_� M��b���NB�(l\�-i��b�|��$���V߿��K��N���!10�z�T����?a����B!���tFEu#V2��SD��9b���Hג%��Q��`E�, C5��4�D}�708����}�O5��)�[L!�b+�3����|�~�A��al�uU进���O����\`D������:ҟ)�:��d�k�gS��> ��-���[h����*�B�E�o\ɰ��ij\����+���$������� �'=�\!���Ɗ܀M�������l� ��88�7����B��b� B!�=DQ]�㺞cIDAT��H�a���l�����k֯�E��GC�GyE�P�w`Q�D�c�_gf�FK5�#����2=�G�-��s�5B!DOQTkذ&NC}_, ?;U5��aMŏ<_sZ���+�`�RV��H��a�a�`�׫0��6��|u�Z��x ��_�_�K!��K)�I�I�&Z�mf̸J�I;��Մ3��O�������%fB!�B!�B!�,��K@!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���B!�B!�BȂ�XO!�B!�B!�,���H�R���O3�����~���?���/2�j�g��t�yB�&a�P{�\��������,���:%�}��HB!�B!��#�P� G����P�.��!3\ED�/R����c���:]�k�����[s/KY��P����k��3��#s>�x�?�����u]�4��!���?M!�B!�rx�XO��nRJ����WD�N���^���~������r!dS1B�=����ڋ�F��|7�̃y���W��i۶u�x��k|qN���!�B!�B��am�|_��+�����֊�)%�Jٜ�?�6[_d�� ! �v̹Z�ͬ�g�ByM��gn�ƓC��:n�L��1��8_��LO!�B!��#LrdVѼ��tM_�Xr:��O��E_�G/����E�i���t��}�[_ts����zB6-��� �]���wᔒ?������g��i������ ֬|?���|a2��[�>����щnB!�B!�!�YO�sٲ�<�Z+��wq�������^��4��s�z=!����~=g��G�G�\���w�q�w��ϯ�N� &!��t:���i�~vI���~U��w�^�=!�B!�B�a��% Gϣ���t: (�W?�~�Ν"2 8p�w~���u�,�� ����0�R�F��������㥥�g<�'�t���+��d0�3'ٖr�YW�1��y���8p���o_^^��׾��~3�������m�gϞ��yv<��^������m���|U}� _���Yg�u�'�m�3?�3M��ȏ��i��B�G ��B!�B!���zrD�Ow]��/}��������~�������{���o>p�@_����\]��D����V�4]����px�Yg ���?���������'�|�gRV#ds���]��~����{��>��o�����7�����޽� W���4���Of����\=���:���J��O|����?� Ox�S���g=���?��x !�B!�r��tb}_����n.9tΒe��O~o�v��y�v���t�~>,�]�v�|�������W�r�m��߿ka��A���<�̧>��g�y����g?��O��g;�t?�I�*�>�ڕ�|�����q�g��@�u��&���>D�ݻwϞ={���򗿼o߾�n�ͭo���x����?�y�{��g����>����� ��F@d9j��u���c]��_]l�.?W4�.��>Z�B!����ZK�ͳߤ���_��kO[���̺�s��7�u�Y�9�姾�{M�߳gϮ]�\z����je�C�Q9ܶ�?�t:����v�s��s�9�����'~�~���_?z5r��ԫA�12i� թ���\�z��ߛ��{��r�-_��>�������s�H����|���������;���>��O9���u��kv�^�<1�H!Gk�Y����k���U�\?=�ֿE39!�B9F�_���,�M'��餛�#�&�Vu{�o��� uu�_��o�-��r�u�}�����׿��L&骟`ۗ���v?�Y�n�������E/z����9�<�9��u)7ʵg�+9'��p��g�x�����_���;n������w�SE|��k�|8F���#����N;��^���}��g�q���_��uD�� 8�r�V;�̃���|a#"��W���@WKd�]_B!�B6�� -^6cf���-�������N�T�jy����z���~�=��x��\s�Ν;���_���\���|N�?�m�g�S�=����M�L�S� c�Ozғ�?��_��_9��O:��:sI�k3a ��d�`M�Xɜ�Uu�B��{���������{キߕ���8F󛓍|��B�m������_����?����;�\��V9��û"�cݺkS���,�~}�ɪ�tvsB!�B6!u��H7��}3f����Mk�9x���m �5�ﻬ�m�׾���}�c�]w�-��Rx.i��n���9��({RWK��G�F��U��p���蕯|�K_�R7��:O�Mj�W7��jzj��'>񉫯�z׮]����l��������7[E��*��F�]!����_��_>���_�W<� O�~�?3�����:�K����~�}�pa��֖�L��M7����F��n������'�B!d���c���{�7w�v�l��X퟾�3�SJf�E�����P���~��_}�����O|b߾}�]ϱE/�tN�K��g�㨈q���-�V���m���/}��_�����m۲:96�kO� �(��\���w��O|�v�Vk��R>���r�jky�'����C�B���/����׾��\p����*��}��#4���߷��K��������n;p��}�ݷgϞ�����o��VU ����y��w�񭿜�|��B!�l� 6�u�(0;�o�馟�ٟݜ7��_RJ���lRj.g?[���}��]w�u�_~��}������e�*��i��^���z�aN���^�~�SN9��/~��_|�g2�;sU_�rU˟ܻw�'?��|��w�FO��jt����k�k}�7��H�;?��0��������?���~���~�O}j��8C�B=_�<���7�t�׾������ٽ{�������]{��XO`�ϸ�������Ց�)�A��g�m�e���z�ģ>��g>�mo{۫_�jg���+������O~��k����j���s= k|��rU�\�"[���D7�<�^u����� "/~�_��W����:�r�֙8p�-��޽{���{��ݵk�'�O&�uW}X���p�l+�"�B!��i������ g�&3�-�U�s��ܹ瞻�[`�[�9{uUz�+���s˜ӂ���������W\q�]wݵE�=5��ǽ�Moz����'>�_%�����D��٘������>b\���]w�>�^�#4����)���W��o}멧��c����h4�ߗ���O��Z�O�scV{���c���!�]�v�ڵ�+_���7�|��wSL'�B!�e ��Q����l���?�?���¢��Zs�o~�g�q�b����\c�)��|lf7�x�_��_}����n��Mj|� ox�%�\��'?�6׹�毵@�\���;V�T��l���}����ʫ����;��z��GnN�A��w�yo~�/���~Q�:t�UHzܓcg ]�^s�Q�F�j������o���~��_��o��f/ �~�B!��ca����M����]E�EP�6��\�x;w�|� ^�(�dΓ�/`_�s��s��W�������?�vgK�����׿��K.y�S��^~=X"�l��&���I}�eU�����/��k���;�|E#~m��C^����駟��w��e/{�I'�T�����/!��L&��`P��Z$֋�m����/~��_��>��;�sN��[�sD!�Bȱ ���E��"FxWϐ�?�X'йR�;v�8�s%��� ��I�!�+���������<����u���v�5�y�����v�i�>];��F6sY�.x�UJ)������/>���3�N}f�9F��X}�� ��{�����?~��W�z������XO!�B�1��������q?�~S�F�=�3��� _����9�V�Y|+{�W^z�w�u�ܵ]��8Y�j�֣����5�y�;�y�g�i�l��g�%=�L�������/߿�������6O�xR�R�[�����'��[��[o{��F����S- 9X7:ef�]w������ӟ��w�[f޿��#a50�v-��K!�Bȱ�f�ئ$���{AU�9�O���4��w�������X�u�Z��k�u���ر��O~��O�u��q{1�.�<�UDN8�w��]��w�\3&d��8`f����7���׽�u>&ԃ ުCUc��e0��[�j����[#"�{��.��|���t:e�&�+++�1m���W^y��^�����m۹�Y]��-{�rB!�Bȱ)�o66���&��3�'�I՚��\���^���z�GP��l��/|� �{����o}��7������m?���:׽}��U �����K.���3����?��?�T��뺔�`0�w�ދ.���O�?�Ao�]��O䨪�V�z:����:n�3|k��:>�w�}����?�×]v� 9������{�?��?��%/y����׾��k��!���;���c���/x�SO!�B�2��� ���yGb<�{g��d���cU�?x��;��Χ=�iW]u��Ąev��q�E�|��/~�?��Ou]W�V�F��L���ꗈk�B!�B6�:��8����Z�g}���;1�����w\��d��1�K/����}���:�lz�O��R��Y��7�$�]�v�~��]vٺ���bmɼ��QPǟug��2�S��~����,�۞�D��`�������8�j���;�|��^� �� �w���s�J�d9q�Z�\��~��?����]w]z�g<������+�|��� �)E �z:������{��)� |�� ����_����H��:e��������:o_6�c�<�F������Ef_��P����>�������u�6ԋַ�h]�/����a��C�F�hM~�R�����(�Du\����u;�y��H����S���zJ��?��y�׭߉��ۭ��_�M�zl���.������=��� �q��^x��t:�N����S�^ ���g����q��Y� !<�Y���4�&�/P�o��Ǯ�� .�@�4��OY���0E@9Ԧ��G�Ҷ�bu�z��JN}��(���=̏���Ȅ�`�<G��0FU]w���Ͳ[�2��^O�*M��@թ&G��s�=G!��W�~���vc�7�� /zы��o`u}H�(T��[o�����w����S���)~0s�<�ws�b�i�]׵m;�L��Qտ�˿<��S������{קּ�88li��#���F"�����O~�W\QMu��Qu7��F�,jA�&��OD9�Q1U]^^�����8�W����������� _�&}�3����vn�ɱ6��I���R���,PDÆ?L���y��!��� ��I��[�:�u���ŝ�Y��a���#[���G�u� ���V�H��y[�\r��z0��:�NC�_����^q���I�^ƛa���G�Gg�y��w�ݷ-J)�y�jQ�+F��z���_��c�F5 v��y�g��Mo:x𠏜뚮�-#o�PC��j��́~�7~��λ�;��u|�=�#^.�����[��A#/����B�"�o߾�.�褓N������c�B����w��1 �܏�;r�B?g��,t�6֒����폺߉��*�1t��l�:�Gn�y�C������<��g��Q��t�\DA�H,��L�����GtT�����"�ҳz�z�Q�ߩG3�ײ�����6�z���0��M8����;[}���m?ҟk�y|�?j�SE��vs����;�]M&]�j�����<:���.�,//��e/{�K^r���Wَl�A��I)�z��zֳ����t�U�L�9_B1��e�k��}��Η����{�-�j�� g+R��z+��M��Ν;�:������,-��mU����џ��u!�����;v�����~�G>���!o�ɤ6uo�G�%��/�#^9i�=/!����X����Y _�4�q��u�\�w�JܱY�!H���S�f�r�f���: ���s�W���ۓ�ɠs_�{G=ik=�0�<�l�H������ "���U_b& !!X��G;����S�j��x���K�""$"D aչ�u��ndž��J��>[��~����W�z��W���De�,n����?� W�}�o#ƘRz�S��w�ޣ ��6�������.��������k�Ƴn��/o~$�$"�}�k��� o9�Ǧ�i� �!ǁ�XU�Z��]�zן�ɟ,//{����܀P�\�U�[ֶm?�ן��[>��{�W^y�i���E��0��, �<�ԟ�>������ߵk��������L��[ J�m���6��*�z�.c��n�W��`� &���" H0�i�D.�D���G���:��G�G��lG�Y�:9��-��š�YvE��:���e�שf���|�G�_��.HnO����U�x��D5����@a��[��'}�m�a��G�8l����ߏ�wU��z��K6����:� "�^��!v��57�x� ^��T�K�s�G������q���[���/�|�p���5b���;W�=� ��}��^��'=�jg�[�b���򫻖��~��_��� w���������]�E/��`ޖL�-���R��u�I'�����+_��'/&9j�P��q>^�X�я~��o�����~��\[���綬��u4����@�� ��0�`}����Wo�)%����7��"M �$�?У� k�ݨ�Ɇ$�Z`D�*[��Z��S`�[�����b1+��V���1���{ݪDf�,A��f񞙾����q�>� "G�� B>S��*�[/(��df�� ~_��m�� k���wv���]Q�!@ �u��Cȗ�����H�/�;��w'�Ooa�� �Z�-k$�I��;�*dZ��~�)<�Sk]gw��}����a�Y/��7,�:l��w_6�+� IDAT�-V#�������ڰ��5��6\'׈U�}�@D,d#�4�l"��-#��ܹ�/|a�k� �ž���U���kf��z�E]t��7�)5̜݄ �Z y���p� 7�x�3��L ��Q X����������~�\�������`���`�:�!d��׾�������=�ER���'�zȣ뺏|�#�^z�w޹nF�7[���L @�v��9߹��W�j.�~1�����>�,�_�?�п��M�������Af&ҙu�� ��#�4%���56�wU��Uځ���!�$�3(��P�u�rr��,"Ⱥ�;�c�p�?a2� LF)g��"m���z;�( �ADL:�5ZR_��|b}3�0������ٶW��R��E�����D f��d��]��9]E�� �C��m�2A� "bs+�^֥.H &�J��alPet�f�~{nl��� )�MS��H�J��xYP�Y�j6�@���+k�:�*`�ݷ�DQ��C����6t lg#���B�x;^��&G�������n�c81p�v��W�9D;��r�d�dS<�ϵa;V���_e�WH:���:�k4U�a:��L$�Mㆳ���s�=wm>�bE���؇�Fh�l V���C�����uz�U7�kW]u�k^���ZFu5!Dz�������;w�|����o~�W��;�<��Ͼꪫ��g���}{��y��c��э�,f0@$hW^y�;�y�]w�-�y�fwfU,s���Sr$�L|� E013��?_7��Gy��@`]�rD��f��^D�D�����)y;��a ��`�`�@r��P�����R�J��wV���n ��@e���kSC����E ����5����H0?h/I,��,���8�MvA�\&��= .v���I�"��&�߂�79[�W��SE{�xn� b�R'&f~��_��\���=��f�kE�1)ʋ�XАJn�̲�J��`0���F��gYt�ϻ������X0�$o)��gw��v��%��۱�J�y�$ Dk��B��G �ј���7�u�/��֡y�W����!�U ���anX6,+��;�m���l.�y�0��� 1*"LCjڿjY�1�(*_� @M�A��$ E�T !�B�!m���8�.����(,��T@��TL� f*p眲ɭ ^�'�X�@ 3 ���͹��$�z�V]� u����Zɬ~7{^�AV����3T!���&=uL���f�(c����ぅ*���j�K!Ka�HZ�mM����"`�J1`Q���`XR��� t $�H!H�2-Y,䫝��R;��`�O��eI�%BcRT�3�`?�1h�t�)0�� �?���%D@�y��|`b}O�Ҡ"j�Jd��qix��h ��eCI�.4bi���&@:�h���c��T8/ږ1����emK����|�+�\�D��$B>�����`��gf����CDA0 ��br�|�ȇfD$/H�!�EZ�X�6��4��Ҧ�N,"0B�Q��_o���> ��!�,�:Xn�u��0�$Dˁ ��c(�"!vD��OO,V��,юX�C i�ڞ��"��, H�$�8�ϧ�|Otj�=�f����+&��?)���|��O�I�}J֪4�(& I�.X��f_by Y��C9�Պ ��W`ЙL�����f������=��:%�+j3����,�� �6>>f3{A2���~�@�̍%���R�\�����O9�Wѽu��}٦Q�ٸPƇ�-���[W&���� ]#�)�nʿ"���Τ(�T<�>�e"b��֔_QH�:�� i�u{�����N;�p),�SJU������}������m����(ih��� /��[������ɺc�ژ 9�V��Ẻi�Xݛ��������I�����x�r�-�s�����W��U��4�X�{�RO;)Y� ���$jlB�S������K_��e��� 7��v�� B��� 7s'�1xN�� ���E.+%(J�+���E�=�k��G�/T��"Ek� 0�4��)� �06� j��=�r�5am � ��;�@#h,�Fy��X ,)�Y:���R%K�p�Nbވ�&�B��'��a �Z����1 $xn���o��iUa�R���m���]�r}���_g����]��5����"T-���NM �BF��F ��bR�4:����>S�g"zQig3�I���dA���\H��FWu^���@�� ,���b�B�Q+5��0�NR@R+S�کPr\w#TF��`�.��^P� !���~h ����Alj6�L >��F�5�(��2��F�k �H�q`�3@�7Q���� �Io d�-�{4��V�:F&&H h �H��iԁB��A���|�i�ʛ7�N��IH� E",+E�)��V����S���Z%ci% ���A�X5iD�l�0�x�YRWCE,��T;�L�C���Ϋ�9_�o(}��u�SBN�~�%���N�`*֙L ��u�*b9X�f�^tS >��� �F��_%�h6�T�W��U��8��\zDM��@b=�>�V�P����s�xṩa*�wM��ƠY��g�xö�Z���M��!��N�� U�/0B�!Di��`@T������*� M��h��I�= ��D,!�y�:)T<�c64��Ȓ��bbu�"��5i�9��S��0 �)-ᣅ� ,�ebZ�Ш *谌� "R� �P�_�SO=uS��WgUWC\U��;�X��z�h+"��{����˿����"2�L֞�"[7�}��߽��~��~]�� ���xP��5tW��z�^x�={�� �BT.9p���_��/���~���������!��" ISl�ԦtҙHBw���z�������?�F$" hJ��Y-�{FS0���`����8����A�j H"�!YHbs�TU"�̧r�h�GI0�#�YO٦ha��Gmc�e� ��1�%�:���&�z��"�,���КD�D�^SL�` X��"0�u5�pM š]+��Q ��( �)H+� ������`=��PLi#$���LT3O�:����&_�rcԅ�rn�f�[QO�-�\��ș�R$C�U鐶��T�"�Z9s �Z��MZCO�w9�b��GK����7����rC ���~?\}��wk5���"��qנ�k�j��ЀdH����jlï���^� u5eA<'7��F���y�'��"�/�iɫW6 �x�`.gi&P��4�%�q��mےa"ڊA��\d��N��IM�K2�SCӢV��S��k��Uh���SM�"�S��H����YD�& R��"l��x`�I+����!�iт�� :��l K���V ��< )z b����d!Ah�Ш5E����ɠ��_�͒����ǯ���SO6���/�J&��0���P \ɱ�Zr��?2ZX�D����Iͨ���������+�F�f ��Q��{wv;�a���c` �x(HШ5f�H ��C�`� l;dI�8�0�W�2�Y�u" K�ǤƤ���6k|���C�")�4"��в07VT,���K��� �0QG,'�:�*,��@-�5��^��Q�m��Z�ev(�y2k /J��&*�D��B k��Q��K��T������2;6�jN�Y��YU����j9�rj����a�<_�HO4k�6� a-��r��&��`�oP�Y."� ��J �60F"�Z���M� L�b��Z0�0 -$��L��Ȱ�9̂��d�b,�"ҩ5���v�v�`a,��04߬�)���:YO�u�r�Ah$ �@�}vK� �&�`a��[� �i�]�D",��4 K`�540SS�xxi�% w>��\ U�̏�� �c��^�y����1���Pr�KMsFvB�),��m����,�I�ܢb�7h�[�͖1�n[�l{Q�'ސLb���+c��3#V�y��Y���ZG~v��PQē6�*����,ư���NP�Pb��N�XiY����T��J!�܏$��k��`h, �~��e���H��L$i���h�f � L���$C���>O)��jL�g�M�` tj�&b]>@��'��y�ĊL��a���j2�8����Р� f8[F�!���,6����Y����-���]��޽��~�������=A��:*,[����Cڷo�?��?�x�.�U�4*��x AϢ���H)��_���������lB�X�=�y�W�����|=�Sk�r�Ƕ0�)]R'�<=ش�w���w���^��О�t+]�!��؆d�j�STא7�&�`#͹�`�� ���) ��*�"d=��b�GV-E"BȻ����%��`0ĭ���Hd{1fu�s%�D�MR�J��|޺�����Yk/@Fbۀm�0�5� XE����A�`+<:��KY�)���/(g F b#�v`0�$65 �F9���!e���CH#6t�.��r5$���$�T,�i���ʛq��Y"�!�$�o6�$f����Ijƨ'��ߵ$0�Y?���j�*�@������Y�^�1�:D 1� �V�Zf^5.6�m�JD��8&7��X���K֓lkB�� *��\p/U�)��%�Z�%�3ݞ*�T��_s�&׶����wɼ���"��sq �ƒa%e8+P2���S[�y�L�yw!?#@Z�uaQU�@h`K��Ķ F0�M��S����X>xR<| ~EA���b�T0���P- �ؒa ��)�~h�� 0�xꫮ_rV�!�"�"�A��I'��<� �D� ZXk��@�h�� �F�"S���1��p�~W�L��a"�0i$4�Z�Ie�� &�� ����D&�iH)e����E��K�G���FC�Aͩ�jH&�"�L &ɲ�@c҈Ēv= �&���WgC0�x2�L`��TP~9Cڼ�4�!B#`�d�[$xd�� �[)I��;F&#`�@,C������0'8�[1�a�0�n�;!�0؊����$����s�4X�,��#�m�!tT4��ز�I�ljn�< �= � �Z` 8�l[���lw�'��3q%���W�f�me(�15Q1��Q�7G/=�����!B)�j�aK���H4�x��[��F�G�LU�-�$��HrQ�]g+���1�&���jX=>"X���XŸ�M���!�Xƒ���`�*�Ȳ�A;��J�A�Q�1���a��L�@#�S���!+���$��C ��Cp�a�fX4�,Ȥę���20D�������=�8`;L%�(����P}�BL� ��&`���DL:�ΰ����$��! ����$�DH��0lI1Du��� ����⇣0��]��3I�B'��kUi���!lIl�dd�2,�i�5�d$�$h V� ��U����/���n7{��(8�;XYZ�2���{��ܓtfY���T���^���J"~hm���@��ڒJ?�&-��uz&�O�*�|R�F�M�d�����j��r �â�Ջ�"s�=���'�r���w������鶺�,�%H�10��f �.?�j�B��VTmIe��}���XJI�S����Br��3?Zx I�(���<$��<`4�D�A^�,�-#֧�< ���_,5�~v)�f<޿�ܧ?�� /�p���>�6M�u�t:��Hz_lE�헪��1�;v���/ܱc� '�Pk�y�+��]�ˬ_��Uו���.��ꫯ����p���ܹ�sιꪫ�<��z��J=9�!t:MA�:�������/���W���~9YҎ�` i��0$�,�ޢ�u$��Ȱ]�ݰ 2�X@R����9= :`b�B9�P H��tVr0̊�k�¶���-��3�ٝps��b���h9� HC�y9+6��f����e;l ��%`"hK cE�R���K0 L�B�����H`���<�d21�xnTv�@cA`��;�4K:w�Y�����DH�J��N��� �%`lH���"%���ՠf��u@0�hY tӉ�5i ��.�J��b;$"���9V7�!�����*�G}R�3P�������Ձ8���FTL2@hC:.�� ��� �Ĵ�LB����$��n�`��8�y*}6� ��˙e�8�= #lL���Lf����̤s5�����@�� '�bX~.���\�;�m��X��I�|d�Z�JOV�G,с�5���c�e؊D��#��0 q��OeI�5H���}�`�#V2�%Ί�L��/Zgȥq-�(dE�&@��6�5��:�Ȳ����{n���Xԥ�eư��{� ��40k���f?��Y�ԡ��� ^��5��&٨�����D�0g����I�Țf� �����h/�(<]`r��6p�P�ӱ��@@�N]2���gǰ l���D[ ���'��Y�l����f:Z>O��C���X����l��g7Qks"��c�bڔ�X��T]XsӉ�B�`�\��!���&$4�֤䱶`�R�s�a�^1h�]OO!"Bc<�9���àb3���q�r����j>W���"���A��;�Z���� x �J��` LL�C�2l�) Z�x�)g�$'o�,!�И3�󱗉e�}b��!��p�+����5m ���Е40��Q,A}*T7@֘{�#���?�D�w�bXo��Z� �����'z�Zخ��C�~p'ڼ�I0լ��š���+-7�J�F@=9ZJ�O3��PK&�`K�̙O6*(�;��`2� D�S SX�E�/�* �&�LB�a$or*�C��Ö��[�<2����)VcV�0!���@5���|@ɏ:�GShE��F�V�{���2XB�r&,��hD-聜/��jr���/nJ=��`6򷊢��3V�U��-kE�,8!r�a3Q��vt�fh K����W��$2U���hX 65K%$�X���S�ϕѤ @ZX-��q�(y=И4*6�R�E�T�8���# ��F@ 週���X�-���6�T�e��k��D�\�D�ϩ���u����~�����D������^�:U� �A `0L& [K�m۶�:o<.��|���s�Ν;O<�Ī�W#r,+�54�����������c��eը��Ӷm �W�`Ϟ=�s� 7���<ǧ0����2����Nb �������7�o����o��c?8i��$��.�����d{�b� ۀm�I�p��a�[u= �q��+y�:-;E1s���*���ؠ��H1�y;gV�&��VeP���*کM�m�sVc�� ��ԅ�j.>�21�����t�\�Β��R�G _�A4 IDAT�&�ķ�+�k*02,y��bI�?xN��4´��,�r��"�4+�h�M��`Q- k�9�Z �����M �r[]��fYi6��F�մ����N3C/�f����\U�ِbx" Sx\Gf��Xh%��vq�Qo�H���gw!����7L +E��������U�;:-�dm�x�(�{��`�H��Uu(h�N����+�L�u�1���� �BR��G�,f�."�ڼsֿ�� ��v��� �7��bD-'����#['�a*�٬HC0m$4�F�b�`���L� D�y����E�)�"Ҙ�� c?IS�I�����3F�3'W�����X�!t��ql��c�U�3K՟)��j�����W���͞,��!��w���!6�Y���0�� �w[�z�2w��J�;뉽�`�ΰL��(F�Vd �l�`� ��2������:*�L+eK=cѕ��)�V�[�X1��lZn�Ge���z2� +6�!n���}� �Nr�I��� ��Zj�a{N�͙�����M��E�����A ��m��ԅH@ �����Ǖ0�X$ �"��$mq�S������\�C͗��n�^�]���""�H�b[2��8�(�rљE͚�{��$ D�����tjk`~bLtvp���M�g����Tb�G�K��aM��_��o�ǰS����;�*�2 MF�A��%�e�ed3��h�Rv�6?�!�kE�Ϊ\�2 �@żh3w�qè�M� ��j���l��>F��kb���d]�&t "fu�)�?��z����`���I�q�Z���{�=��o}�{��Ϧ��5�����ػy=�������]ׅDd����{�;�NM��E;6e��8�p��_|�ŵ��"��d->Ȥ�|��ȟ ����Yg��7�7�{��x���Q��M���{��?���O��6��! ���i�5�1d;����`V]���]G���5�"^������� m������,���5�3�[�o��x������\�Ν�͐�� �t�,�N��F��9vΊ=�ME��,3z��!g}�4 ۂ-F��� 4��5�����]s�إ��j��^ Բ���4�d���l�S�`�๷��@�܂�rE��f�d8�}Z̊|)�h� 2��� is1@Q��f��YZ��JW���UM2�0������;X��zmi:�X�`b#C ��*��PoQm�P��֢T�3Y�"�A:�5 m4��Щ_�2����f�.A����d(�jԂLgf�.#�Á0� ۘh��=������|������rC���Eqj*�� ��^������+��:�Sm����������J�5Gr��9�_{��}�C�W�����Y�xe��k_����������?s���y� ��{�F�cf�� �� ���}�c3���z�����x��o���_������V�/6_ܛ�P=�h~��}����L^]�BW0*��u�@�,���kn$�1��l&�D�����R�,֠F�AaG�]hU�\I��s$�G�3;{�Ѩ4h��%�fF�1�q���܁ x�:�U)���V�|U8�j�,9��x>r��'�8�z�3{��5z ��n��r��M p$��e`F�� k&d{u��B )�*@ĝ� ��|Ԍ� @d�%��U9���LA�����d.�%��R�O�j����g��!,����k ;$v�,,�tB���j82 VOm"{�e7�e5�id$^#�!��Ӎ���<4���������">E� ������G��;�\ʼ����]�LX ��\��BZI� �)(��)J�-��>�'�\\�T�aF��"�WO@b�"B�!��' `W�hv�=��(^�:���P F��.Yġ��|5;'��f�8d�D|�D���������K�ĮFj�/�/Rw�'�'i���W�C{6�Q��24BaW���Y -�P�j�Q��6Ҳq���w�巜�L� ��7LN��h�ބ#�t�� ]� ���>I]���pw`� |F�\ �!2�A��";�wԝn7b�֒D3�R b����X���0��9Q�jI{�1p$L�Ȱl�B�!t��n��=�>iw�Ѽ9�ƅ�ԭ�y��Y�� �*��^�nfX�c0ǀ�m�8�օ�2*�����&^#�/�p7b7U�h7 B���+u���er���v��t*���Q��� lDKo�Ѕ�Q5HC�f�ݏ�U2ˁ������N��Fx������gZ*I�%���� �� ި8�ʓ�6�#�5+(K��iƅ�C�0�/ۨ[gB[_R�U&r/��rMt��ǔ×@��xC�2���2� .t�t��d�6رj ��XO`O���� ��2ZT��<�+l ݾ��34�E�QKI;ah�����{Fr��ʯ!�X3@�t����:rwπe�ѪxD���v̏;�����v$����G`�h�I�XF��QފY�m��DzN�8�]_�̭�ò���¦�2@f@0j�$ipT�C�`f�5��1_�� �\N�ˆ���!Dj  u;�A�}�Zf<�R�)�2�ד���jv @Ө��}n �X}ZS�+�濥<��0@IG���r���f� �%�/7'��W�n��K�ms�%��H����+z�n^;�h4�^y�8M���C�.� �#�5 &�,h��8�QG_a^�K"�k�.��xa(r��lW�j�������j��VԜ{96�A��G���vEĺ����ﺍ��Ӛ0�o[��圤����ğ�ɟL��[� nn����d���af���zB*^z�鯟i�s�=b+�a��sw3�Kk��������_������sB��P��>�4� �9Ę X��p�G���ejq����_,��%�/!�4�g�+E�i �f�!n�!�RZ�� D��\�C������k͟܁����)FPh�;���q�0#�1�7Y �����G�R'v���� ��c�RRGX����L:�'�X�RO�rp1��AZw���0E�͛ifB8@OG�� ��1�'�cӋ��Y�Y�Ԃ gKVA��`�Ow8���xi)�Gg c��}E}��vY%� �h)ć� օF_R�Ȅ���!F$��yɏ-\+�T- �� �Ӣ Bl�׸� r�V��E�>��M�y'�2e�q������kB�7�L�j����m�r�r� ,��$�v�@$޺��M� }��C ���&*�F5C�,"*�s��8������f���S��� ��g�a^Ph5�hP`��7s��(TN��lT�`��f�� :Fw��,��� t1����2 Zˢi�F^�q �Zp KȐL�@MNN�/n�q?��}di�m6+�r��=����:FE !�a]��i0#Z�*�Tu�t���g��P�Z��p��2�C��Ϭ�*��"��eh���W����EE����� �9��<4,K��TG�W�u��;�=�'�����}�����#`0j15`��,� ��Ee"�V�+2[5gM���K�ȸ��\����� L�N� �L����(���`���-�Ev&��J<�-���0�X�8�A‘�E�ـ3�`z7h�4XT�u�#���v�Bue��hw�;����~���m^f�B7ۍ[�?�LZ�+� �� D�[.O�T'e]h2y�4�Ɗ`��\�lf�"��.ۉ^�,ZB�R ��t�m���6U�n�n���w���R+-YU��Nh��������w&)̵V�-�dq;�1���,�i�q�ŏ=�;%e�����8VKȌAB�΃ $ ���{n3���<�svhi:�IMNGv���� K`�����E�U�E*'Le�T��� {�� �``'��3y����6 ѸK��t�X|�� ��Ka��!���E�x�b!�f�ƣX�o��l۶[_�w]����)�������7I.A�I���?�c?��/�ݧ�2����z�_�w���/��/�������A��d�>~P�kja >e���˿��G?z:�0:lq7��w�xݖ�_y�u]���`]W���a�������}_�u�;�O��͚:����o����_�v,8��E<�A�E�L1���&�Ѭ�%q��0^f�.m�/��.�XX& ��"�p�,�� e?tZ�,;=�hv�f��b��D������ۑ��M3�&���$i��m��84v���SV�}��(�!�[������>�+��4� �R$��`�)��#��!�.7#��-l�]�;#�%8yV-�I�'���-��h��E �PZ lI��3�����i@c/���l0xD��9 [&�8=`QI�ٯm‘XG��ê[��J�t�1h��+;�Sb�Ĥ$�/L�:+Ә�tB3ϣy�t� 1������lo��3�o�R6���7aa�J�R,�0�BY�d("Zv]t��]��� [�/a���.m5�c���J5��Ɗv��X��߯�af�cp�Vp�ba�`���@�v()U[*P�9���b3g؆�NQ�c�kk�� �pd1��[���i-�~eh U%>;��,2%�H��S� �kXF�5�*��ϾyA0��l���N��e��3��#�'�EZA��0�X���4@2!�u6ex@�"A�e��h[!�x���C M�*�|%�1!��pe�W1��O.gA4�h����!W�%���S`�i ����Z�X(�<�5�f�����뾨��s�A��I_�M��4|� *���W� �U�X�� "-�+�B� �P- P6�H�h�B���9�5�&XH��zg�oP�y���Щ���-0�c���h6�3^�D0r��4�W%}S�q�ٌ%gv�T�|�!í���b�9%إ]������)>b�_G�� g�u'� M*̰�z� F��3 ^��&Ur��N��8 g����8���ܢ����3�����)3Ֆv��6��� z�!xg:��%Ƈ�Q(-It�u��d8�`V�c�I�ݵ����z�˨~�'��:�9m.D�8�-�����CWaG��3-k�n�,�K`�I�}c�aZX�����t<@���Pn����r�^�n�'�\Y�+�ɠל"v4VC�F-a�B��s񒕏3gYrC_�#�U�k �hǟU@�tqZ���*�&v���U�ju�<{������G��_���̏�4b*�� � N�͹�&?:��wX1�p�{���j��� hr�r��=\��\���3�k��k|���_�l�̙'?�K➜��L�Rv�\�H��*�'0��sun�^J���*���Iv)t�m:�!.¥�c��oN�8��ճ�]c�@��'p��<9��u�}���o' N�� ���k�U �3��_���}�N��7����?����,�Ѩ��w�5��#�K_��-��9C�s ������82�_����/��/�,q;�<����>�+K2�>��������|���Ē��98�waQg]��-�̗��5s���˫���?����j�~���/�����S�,�0�y TS���S6�˔��P�j�]�SG`�R�}�섒��xb�*2-P<��4"�Z�A�d��6�$��{*Cu�yJ�;@(R���� "&d���(�����S�u�YI�ӓ>% �<E)W� M >�7v����rU��b�[@aܤ�H�\f�W�S� &�T �@t�G��8�)�c3z1Ӌ ��d�hfl.J��=ԅNzvR��$]��r���fi��.t� Opd���ݰ�N!�T4�8"�f�^Р�N���+���9��Mmc-�r���}m���&gu^��=3�~���c21Z6$sH�j�g�����RGaq?�ViM=�e�������gȉ.����0�aL�#'s�u�;�8�faD�(Ry�Լ��'�~� �&R]���ّ���J.�2ZY�9n��p�O�(Ь'm8��&D>U�V:\��# V��3UE��ʀBBCJ�C]*F�O)D��iEڛ�P�'lI_}H ��Qf�f��\_Ib�r �C����,rc�9��|�k��&��{��Е�֬��sf+�R�" 5��J<(m@��R����LO���4F��r�rN����y�?:�ЫX��� ��4{ֶ@�,M���I)H}:| �.��r�Q�+�QWD�c�z��w�-��(َ؁3�B�; ��B;b �EW� [ mXhvdI ������Ŝ�]%���E>��g��� IDAT:0/�a �\@UVg���1�J-�Yܵ��ⶰ��wВc.u�lڄ��J![2��h��OY兀�@�x ��ݸ���Y�8�xO`%��#�Dh"-������-����o4�ڭ"��x�b�!�k�̱�ص3�Kg� Y� ����+y��Qmy�" � d��^�r���n΀��b�.��L�F�3�<�]B�� ڮ�̐�� ��L���� �z3*�����x.�A��JU<%6�R��mDDHX�=?��1K1�cF��t(�"�U�'� ?I�}�ޜ��`��m�}��G)��:�P8�_�l�bvp��F� �@rb��p���.�<�Bn��=*F�A��Br�N@<�ӫ���� ��t����"�̌�-rEL�I����?k#���X�1�i�!�/����o׾�/��n�������!��e��6��pL�������𫯾��ݔ��v v��;�ʪL�}��g��O|��_Ne����Կît�f�.g�O}�S/�����>�Gg����.���{� ���?��ϙ�g?��\�ZkIa��j�wg)1��tY������ 8��)a.� � � q�؋J��p'���i���:$ke�����8Ԩ��N��ѰJMe��j�O���LZ �@�� `F�h�ab]�+X,D^����E��F�mA�"UE�1���� ��,��yv�=a�r��k�I'��D�~j&�`�$�]!G�nk���6"C��� !��Nvp�N� 8�U���Xu�����J�V ew�gr-XG��d�y��,%q�\��A���Js�Q@����@8tv6�� �0gM� ��Ё�p!��� �qh���j�-v�$^���0����VN��X��hH�w�Yu�PK3y��- V��=�V��@G�j�"%�i f�U/����]���X�'��P��Ae�c/�9 ��*xI������)��Tퟝڤ\HTz��v�Z�� ���F�w�2��.���=�TVv`��Ԧ��,��[� �v�@yD)�B t%i0 g)#G��2L. ���<����芤��8�RӕY����J�1ƒ�+&]&I,��#OI���������� �HϬ\���a������� ��<������20sEM K��G?�,�����`B<�+%y]n��!$�4� ���#�����C��ڀt��I6�"�U8��gb����!� :HG�H,�.��7�FP��,K�i�z{Uv�JdM�� �� �t P:x�d��#�@��3p eն*4�:J��E"��l�����d�� �`�� �3�d2%�0g99p�ĝA`�VT�K�-�M`��M�4G󐊰�B0�a l�-�?#��ew�mB�Ѐ%�P���hb7vh�,�[2Rx*�%��Bb����Bu�<�.f̪�Ӑ��l�aq �XuL���+�D�).O�~�9�'ކYɆ!�;��}- � kIC���V����5�0 �&��H�l�U f�O1� ��N��� ���XO�: �Y��t�� )�2{��<�q�����H[��F�[�����d�Ld�w�����'R��39�������������-�շ!���������*���W^y���o��o�\������}_�u��ď�����k���+�����J�c����ίIWK�>3H���QD|�3�I8[���w�{-3;S�43@��/��3?�3��}���ah �,��>�>���6zc��=� �Ϛ���څ]����ɴ�0i�Q��u�4�pVV_|�w�=�ry;b+�y��h��7.��%6� �K�a;D^h.'�q�C���2�W�d�UR&� �G�0� x�NSS詃Y�v0(���U�iZ�� taw��Vd kb���'➸��?�X���N�� 'N�Ex��V��1Nz�5�C+����N]Ɏ�Hw�O��qu#֗�ذ��P2�R���N�OJ�{�HR��aQ�[X��f���oi ��������D�6���<|g�Q�بłE��BX�I�#R�]��j�E8���8g!e�m�pm�nA��6pK��rvac{�{ e0C���)�/�T/�d���8K t�ŝ �P��(�nL ��-�;h��)0݅� Օ�DŽG�CP� C��7v��(�-�;�h��3@�4:d�HMM8�w`f!jd3�h��7O�1����ʜ{�!� �<�O@�P����F����FV��u���X�Al(�o ��"�'��?��>�3x������ )�ٙ� ��n��h6 �b*bb�5{�U{!� r$�e���:g~����������SjߠSN2,&9.� &��G{J��-�$��� ���&xl��L�� �{� vD#/R>�Ɏ���l׎?=5� t�g� e!!��x(��0)&�'�l��K�4�;̊�vjx�V�E��cx���� �@q"�JP̵[�)�� �#W�z`�(h%}�l��e<4�f}h�'}&�L���@�,�9����2Z5�P�n�|(e9�ëu �ԑ��U�o�/)v� k�ؘ�q-���g`���F�n���22��k�=�w���U),8�t) B!��ڭ>�i���q���Ȁ��;c(�� kX p|��=b�������g��H�O��6�q���^{��8 �s���xz���[ΣR�n�R�M-ˌ��;���������d���}?�ُ�+%�$����?�S?�7�7S)��B�x�E���;��$�M<2�����H~�3�i����q�ˇ���/������$YcPpD�m�PHߥ/��:7�Y�¤��ē^�\L��-�&�&D.yN�u�}H�=:v�E9_�K�`H�v�@�:yK��x�䔦�Ea��&��?���AA({��Kmb ���l�A.��F38y@E��L,'� C�y#a�� � Ԣ�v `���4ͱ�� %{#ρ p;��*dsjp��M}�Ll�{DF#z% T€C�]h@��^��M-�u�x��.��ƉW6��P�l���44� ݹ� �a�J���ٿr!d ��ڄ xI�$Qy��r���X2� 0�)�l1a2K>��hV���劍xN*\Gi�]ܝ`e[�ۄB;�I[d�.�&@� (O�2� vOuE��m�'6E�.�`��"�������FN`���R���*RMh����L��Q��O�R�e�-Kͭ0����I<���K%� l�Qf� d}(X�$�h'v� ?F�Yk/4J�:{��q/�}<��Dn���]�!�,����G ��������I���náB7l@����n��i8����!��:|Q����V˜�?��:�%���][��IO��!��Rkb�LE����i������A �� ����Q]�9$����g�;p�l�+�@�#C��y�� 2 -($HRWՑ( �� ���<��D`/�Kr�\L�|�z��6b�8쨽�����Ѥ�8g�$��.t�_��S�q7�1��QGS �����N�#��y�.���b�b:`��Qآ���R�w��AO�U�505_�y�K@�l$�37dЂ������Vف��F[ꆙs;t� �����^�`$]�����J=wbW�J����'�,�4��D]r2��T'�����*ղ�&��9����*!�ݬ��Y���_�'FB�P��~1�X��C�nҮ쌩�e� �0p�9~�dr���y,�Lp�\pi�N�=��l+{�ة��Oi�1Z�RΏQS�k�D�����)n����4p3lQ�w;GFE`B���)�یf�B�Uŕ��;�6���f��7�3�&� 즈+ ,~.�;�� U������ Op�W�W~@��0��j$�X�:��YJ�\Xߪ:Zu�)���K�N̬R3��%�5������Gc�a&����g��C޾~�-3ϼ�ٱBV)]��B��CH� �U��A�dū��Q,���ǭ�" o�v��K�뚒ƈٟ��p��������*]��m���W�ʒ�6�O2o�jw�2R#n�(����=�]� ��zY�g�����"�����������j�\�@�����w�8Br۶�Bj���o�������h������+|���7>�����-�m��&��qx������j�����_~y۶?��?~��?�� gf���7>��O����(/l��aw�E��w3 ���qBc��8&��Y�U���u(���hf���Ht+i/��~ȿ����E�d�`f������ ��.��Y�gd�+�52R/b�3��]xn2LCS'DXR.�Z�Ű2qu��&��:�K֬G[G��f�.t�!�x]�Џ�㖥YRh#3x6��ځ�QX���<:T1j�EZ�ʰ�o�S��:38˯kp��O�B ,��FNl�hPb�]ٕ�J��p=q8�S��G5D�(���{�FFy[��2l^��rO� �M�U�S����4�g��� 0|�0���_���،��Ƴˇt�#��0���@�YF0�6�(�r �#�蠨7b�� ���ׁ����ؙl Ѵ����l}uIa(��Y�ZF���z*�%�"���d��{�2x�)"��^����V�@�_� ���Oݟl�׸�pd���ɇ��K��� ��_v��ng�{�X6p�#�$�adK8c��d�g>P#���dĢB�_G��؉�t;Z��:0� -da��:��.L2Cj�<��~��`W�023K3�W���R�i�7`am2� ��C�@IPI�*��Sw\܉+��B�@ݚu3� ��1��c�t%+��6���B8 ���˖+36�,d~F'����=(N4�"F �@�n�I��(�*�� N��ٲ{�N�: ��D'm��ܥ�j+k�ʸ΃x0�!Bg��d�裚ۅE&�q/�T$e~'U*0:��X�#^^P �#�"��:oV�p��W�76���K0eÓb����+�[�k�I��_Bor z ���cs�/W�J��c(�!e�� x9!�Ԣ^�l�qTS�Tk��-8^��gtm\5�1�Įts,���xQ ��p l�âK*���.��y�@�@u�L!��y1�ʎ!!��;�r��0 �1i춐A�p��&��p���DU��!1d������Qۺie,�o�=�D����ϓ�CP��VA���U�� ev\�b^��d���.� ��a �[�9p�@�j �F�G��M'H���#��3J}%�߮�ĕst�jk�٪��(fq;����}N}��g�9�zǷ���@r�����_ ��A�x*���Ur�'E{l�������`ϫ��ܱ���r��2�i��b s�p���o(�e��-��s�d{V���AJ����L�QEsI �ڞ���[�ƹ�7B��)ah�k���V>,9sI �����z��)�������k���Z�w+����'���/d����w�X��ᤞ�]׏��E��8o����_��G>���O�>�l�G���$���믿�?�o��FN&1��[g����x}��m��ɯ����/|� ?�#?�+��+��O|�ޝK��������G>�|�+Ϟ\���ޱ�� g@B����s�T���;�����p�0-4��̍�!,u����<�ä=a�AB��8P��*;�7`6�ӊ�D�YR7w\��\u�1 Լ��T�E�b�( ��Պ.Z��H�& �q ߞ�܀@Qn�ɣ����D>;�S++�� �|?^�G���Y�B�K9������2M �S��,����P3�rC��x��=)?~���V^]C �V�On�h��*� o����zI�x�C����8Z��J.��s~D~6LjWyq%�����`-�Ļ�xr�>myJ�@�M�s8g�����^:�|:c�CY��3m��h�"v$��J��0��y"����R�D/��*j�mk8Rg�!C�3��7 �Ԑ��z�Y��0O?���^5>`��]L9a� S d�P�P���EZ�à� �elg�vĈ��.�py�~��S�Ϲe�7��@y��;6D/�Y����&����fp��귌��EP֐*݁�v`CdTczTO��dE ȳ�8�d5� �#�q�R�s� �L��M׎fG҃K��U�� ��6�0�SQ�q��|� ���5)[��j�%�ϭ�A��e�L�>�d��X8�p!�|Z�0�O�%!�)�'.߀'��R/=��z.� Ȥӄu\\��H\}`"СMZ�>��.�H�$�p�r�.�<})k?\��l�0w��%1� �xh�=���Ƈ�;� ��T�CU��X����(��x�DQhf �2�\�{=cA�S�����W�0�M�\���@q�������3�MT�f���������u�1�ԣ�7�٥���N��{ʜ&� \��Z�yq[ �gaC\z�����ڠ�j����Z�P����tqt�t�eA2����� �+]=� N�{1S�svֶ�d�ӡ j���� | K�A���������9�܆d<*��u!$#ẩ���}�������7�M�էs��_������(�H]�aqe�&x��R��F���u��˥TƧ�b>l<�a@7�@o ҉�y2� ~��Ӥ�;�����Й�d�sV�EuK�� ���0L��Z��b��۲D:��p�+ �cLA9� [����| ��"\���{�ŮtR��S9�%$�Ijrѥq����b�Хh*�V�����,� � �۾�� �z�)x���.�����z�.�_�;��BSqd���g�XP������Cd���ʥ_�ADs4؂x/�4?� IDAT}�;� �v8Ǟl��X]���&C�"��L��>��h:X�c��`O����]����<[���u ��@�����s,X��"c�1.ŽC��U���� x�V{�S2+CG�=��Ё���7Ѿn���95���H�(w�X�9#C}�2�����𰻸�ݴ́h qG\���*F>�^�|;�*�M�!$�Y #���]FY>�J̋.��خ�x��.�L��0���7:�P~�B� >���u8�N�9�g!����z�E򠹹���Q<P���eG�Q��d�,���Ņ.WI�N,`,�N�)�!pZ���vW=h�,3-dQ��f�u����J�Eu~���a���a�膛�!f��� ҍ��}�%өs:C��}�H��n�:��!�0�������=��ե��82�Y0ao�6��N��;�<�e}�e΀q��w�������=cA�P�N��-�[طv�����/�������@����B4�.ͨh������Z �c�>X���1R�I�KG b�ޠ��@�_��?*k ] �> X<�I�U���(�,�����@� � ��Wb��6̴�K��V��xAxa$��o�� .GƷ;z��Z:p����<`��1����̉z�c7-�-�zcg�=|��A4�a��@�I ��.{ �K��6�r�N��v1���8�%M�w�� |!�C��a�:y\��9$:D�\�V�M�g�Tj�9������HP�3��AY j+H�F]��3���(�ŭ#��#PU4��Q1K�FĬ}?k�hk��k�a'�{��!\`�H�]�D������tB�ȴ�8B/O|D/��c��5� ��m ���ڊ�[䚸���W �*x �Z&Af�!NtL��i �Aw��Aͪ���LD2g r�� �?���X� ��n�=_J����+p.;r8���,Ru�:��� Uh0$��x�l��� ���atd�~���h0U ,�\��n��VƝǝ�S43o��G�-_���EaE��ڊ��h���'M!U{��}��H�i�m��"�dS�1x��<����+�S\��J���/����,S�J!���S�^~��_��_�&�đ�,�(<^�)���k�}�ӟ�����i�}�d�^W [�������S��U��>�|�s��h�_�}]�i�Ցg��4������^z������~����"A�_��W���i�w3���8k��p�Է S2{N��o�)�PO�ZH?�s?��K/}����Y��1�L�S�;gjB��u�!��7���_��_���|>U3�J�V3��T Ƙ`O]��L�qn����}�^�@/;�37^��g�̓_�zN�Uq�M+��U�˿�S�����9�<7?�������n}�����|��9p��+=�(s�˩oNJ�Oe��Һ��{������j��b��Q��pn�'���y�*�*l��(� |$U�"ф�;��^���)� '�[��K�}�j���N�+f6i�yV�h������a�]~-ɮr��3^���̲�v�TelѰd�\2��T�p1 d���ƸC�p�m�h# �� q�q�94� � ,�rV�~�G��m̈ȕYe��չU�\�TV�ʕ{E�3���}X�ΰ�J�Tw� _���C��'8'g\>r�����h;]$��%��VH�FcZ������4d��X�nP�m��-�8�d��d6QT>��s� �ڸ�����/] "�Oд���� liں-�Ƶ�A샞�� �`:³G�1�<����/��F��T#q���c�)��q���1����٣*_�'ʙ�Q$~T�/��s(��β� ̊d3�6$zy�3�9e0N�4)N �L`�ʼ�K5Tx����� *y�<��|9� � �h ����A�|8�\��3٣0S�|��K)p�B���#�B̠6V��[7W�K"� Zx�M�4F0a3Fӽ�nV+]�Ӛ��q�:�j�5���p��)���E�C���'~�Bi�7�� J*lT�Jc�,C>-���3y���$��"5�t]X:3K>\e�z<[!�'�,���o��/��(i��B#F�A�� 4䓴�tL'/����b��l_���p��#�ɾ�yW�ٶe�ll鞜�i�Cze�/'��&+D�԰�3�z� "e���E��'��-�􌓫w�M���l��"��eS�'��BS�d,���^\KA>N���f�I����njЩ y ����f��F6v:FaR�4m�E��Ij1��(�|*�#�e�+�,jh�V�m�!j\؍d���M�@������Xq�8ȭN�K�gPD���0r}�1� ��$� �+^Ft� W�����caPY��ϱC羶|�=�s �U�sS� �[�7��R���6Z��Q����#���jL�Q��U��#�P 3OU1���ad%$��9�ڭv�`��0l��#n\���nclikɍ�i��1�hl՘��p+ 1l0�z�Û\6�,V^ ���R8|Y�p�4����h�+,�i�aP�N�-��Hx�!i/��TL�n%M7A�� �׉9Բ�k K�2<_�rkfY�ψYGY�C 3G��5��*�������W� X�+�TB��@�W!�<��㯜�z�~�w���޽[USb��:?��稿����ԧ>u����{������k^Be}�3�y�g~�g~�t�����u*����1M�<���E�?-o���G��5���k�}_�嬌WU��w��-oyˇ>��;w���O�����{�����L�k����0������^x�����w��/|����t�gY�t�yD�~DG{���r��.��UU��/�—���'�|���ew{�Q}�z}���|\�eO�{�O�����s?���}�NU����jhQ I���z7ʼnc}$����O�2h��u��Yo�*b�<�:>�ύ=�E��W��'���Y�����f�#E`^��c�мά�Q�}����9g�99�n��ϵe�+�w�ji�Az�,�4�;}�|�l1��4;N������;>����MFY33uЖG�1��zEQ+������PG�Z�V���̃��<*�>P�5翕^G�d�x(�i�W�����JY��l:��&l�HəE���xf�D�r���5ΰ �2q-�%�����`��e� �A��(L�*\��I�1|��ԥ�����Jv�z9pc���S�ٌ�v''W��-�Jk� ֺW���#�Y>���y;m��t��(�S������a�<�^������Y ��� �|�4�^NL�:�L�jwqd��o�DM�Ba6���3c��OA�Q�#���2 �om6:��\Q" e���+g���S�n� �� ��1#:��;�3�>d���~2���Q�*q n�Խ�s�#�CЫDL�a�Z`��G�>/Zd��!&���㱙br�!��=W����D u�ạ਑M��*zЂq��(�����IE:-��Ww��<�ȸ&����>F*��Z�9`���}�̐Y�!Ќ� b���=$<�l�8q�ݞnr8��|�eN�����87���Qq��P��O��-ɝ(}�qc�P"��4�.�mpxKTaIV����;��L\�R�Ë�''9=�B�6�ĭ�M�2q����ˣ }\�����D�ֲ�k#w���;8{��l�R�P�dkSCB��gV�J��e�� ���RG��TF%,��.�!ΰ�|�d��{a��"�,)F�K �#OoK��JF�1�D��� �9a���2��2�D�t�ʭK�zK��0��0���v-C��Me�����0��PZ�9���$tC��p{�l�~��ZT�҃�޹q"ld �Zә�ԅ�=Ȧ^6�4<���h[�³ ��,*��l "ϸ2����J�F,` �.��]�a��"�kJ\{݈�)�'�|� #��נ82�pf��:{i�����pw��}�g.//�.�{�����u��E���_���{�mo{�c���(���Vj��������>�t��^^�J�,���6CiN)7����-oy������������>0놳�^l�3��NM��1/r�����������-�۷������������/}�K_��׿���=�~e�a��x8 ���*_��[�`����}�C�������#���f���+�����$7���|r��_���Ͼ�ݗ W�d�% ,`��PQR�R���)'1�*5B]F��V��X��]����8�\�]�C��Y�q��'�;=0�«(�����ޙ�P�����X- ��_��>62^K횑7��h�S�X����g�u.8s)��+���L"�B�L*~�u�9>d�Y�(��ڭ6#IR?�smT��R�h`�m,�d��u߸*������!t`#u�"E�3�W�^� �O�#�3U��Y5f�`�9�·����hsn!�"X7�U���r��Q�� �"&�����J ,�6:t�Yv�2��Ev��jr U��(k�r�g�A�-m�� D�UT��o��'X�^#��*�*�����24nkt'x:C]�� �v�O�"����;NE��P�b"��O{'��XM ��JI���D��P����ey94�q!�i�#�Ap2�c�H�|�n� �P�23L�'H./ll�@K�KJ*r_̗�xhSp�=���h�2W(���@G��5g %��Y�5�z�A�*X[q�·q ^�-�ݷ(���} ��-4�^����'�0͗ ��pc���"c]oVl�WƍIƍ���k$QɫBm5eUKa��2XC �\�MY9��k�"�2:��`\����8'g� ��&��TtIq��f'=��R�*d�?m?h6��$�?�A�;)H3;� #F:��ٔ��OQ�XKA�FvL��dU�a��Ș%Z��,qî=��ܫ8�DGh`�� WF!�X�3qF>���|����J�d�DjD3�oE���}X����:a�bg� 𲷎�Ć��Օ��n�7AK\�� �L�t��� �L��^�i,nh6��vʧznck̓,�);ۭ�� ���^p��.�=�LNVV�S�(���)����R�\����ݑ�Fm��� �c*��� 6DDɩ��a�{���|S$'E�x)�>�'���p�BY�y�K%�ج�*Ԉ�B~�"�r-ve���U���B`Q&*s��g��9�2n�-��q�s�J2�,�u�sqkC�^�c�5Rt���J#��l_|�J� �j6(��Y�%4��H�*R�J\��a�e� L�8����9��l [� q ��(Q41F������e��h��F������5q~E��16l�,�#zt9� Ǡ�1N$���t�S����� j�Emp��"�"�E�5�zjK���^ ��<�R���M�NvCHN +��5���`7b�p���~�q/��.X�lK�&��bG\*��+�/c����˕n��Fl�6���Jъ�!�hA���X��tOJ�n�+����m�-�&0� ��N-��!�[��z�8I�UA債 �D��{΋�}؉���F܆7� �A1��^���ד�����U麯A1���ofE*J}y�3�<���/� ��oV��0��ǯ�oE��6�ݻ�+��+����;[_���,7_��W�y晛��y�f.w�VI_�O�m�i��S��]�z��>���~��?�S?��O�������REO#@~�X<����R�g�����y�;��}����{��_���?��/��/���,���|ʻe8����sb�-ͤ�nnn>��� _8??�p9)���7H1�4.���� ���������lK�L��sР5~�]xݛ��>*+��5&��� #E� ��m|k!q� �R� f�T|�e�{�5���pe�r�jH��R�6`}�<�����=�ѝ��v�B���}�� �f������S5�����R��._��:)q�#G3��Um�� ������-J� �V�g�J���,o���R�p�);�F-Z�LV+qa~��<���HXc���O�+W��73Ӭ_g+8�����:l��-Z��Y"f�� �ęl�*M9���MZ��b�c6�hFNm�{VB *G�A֗,��򖃝IP��ؙ�t� E�ů=O�Q�1������Y)��e��2�\�9�8:7!���l��؊v���c�#t�L#}8�Vk��q&-�*���L��j�4� �5�5�* �2��P %���.����� Nh�CTŒ[� f��6jX �� ^l�������փͣ=C�9KS���d׊݉�?�����R��%�L-vU�0��A*�F+��%,a��>,d> @>��G���(S���X��FQ��d�6���8=�Q�Ґ�Q���,��Nm�����ڸ�ܔ%c���� ��EB �Ƥn�l���>\y^G,4N ��{�&��di̳��궐\�d� ��ck�la�Ch/z0�Lb�f&݈T��BV��%�`wP�dY�v�>���alE��f�|ii�h�FQ�)�[�~�d��EG��\Y�����=��x[9�� �,��,)��F+�A� �2_�V��nF\���eXi컴�2ɭC[Ih���B_������X�/P]&�;Gc�w�TV�bi��n�scm�$�E�b��ٮр^�p�����gVj^���̬��\d���?��������c��>���z������,PF�����}�������༞D�ɘ�կ~����ݻw9I̞��7�G{�{s?r�\~��~��g?�񏟝���K�;�ޝ;�ON��i����닸����9�����Y�U��d�?ꩧ�z�)I�������������_�e�ST��h��S��ye���>��'�|��~��f��qf�����s ����K?����_�����9��mmd��|@��� �9ш,d�"�w����S=��F����Q4�:+�Φ����C��~T�0��%і�<�K`T �4nKm�6�.J��R�,��_�I Ψ���$���s��i����?����O?�R����7����~���}�C��G�X��M�P�i��lm#6���Cc���ս�� �F�rUZeP��K�=Q?�ԕ�G��7@ Ԃ��>R֧*T�;��t& t֠��q���c?���;�� '��up!��#U���X��|�h�*,[�D���k��k��bJ5�a�Un{�������F�T���T:j��d �� �S��4PIh�5Z=�X��`�2�CQʘ(��&��R�q��֢2\U���"G@K4yty��+DWJ���J#�߈�8Fc��ZN��ӟ~�A��3��.`���7��z� : ]E�!�(FQX�^vO���02�j�U��qԃb��wE3�#ބ��e,��C����rӳ��`�=�mr�9���ۉU�a��� ��-��5���x_�q��iY�-34��-eUXc^y���:�U�Y�hg�jiW��V�5V���MG�+��h+����`��6F�=�gV���6qA� ��q$vBpG�Ɯ��D�7�_��MK��)ؖ�. �`ar�9|�Xfր�۠���:7�̪�]���c���|��Lj% ��t5��|7娚Z����>efV9��P=�1S);�ǘ�VCc�Kd�E箳�i(^r)� �edp���ҁ8`=^� lLK�T`��vt�,PEd�$�֘�[,C=!��Z�]D#*\Ʀ�'�2�K� B�.sDnl�ji��G�v�����wkl9]�-yAԙ¢�6��m��V��ª!#h�d�ls�k�[�z2Ǖ'��,���u5 I�����=��s��ԧf���82���R���*b��|>+�}�����W�����uSJ��ַ>򑏔���?͕}$�����4 �;�������z��g�ܹ3��O�$3C*���_����<���6q�g���ln$p�~�ՒigW����mo�ԧ>����?��g?��?��?���\����t/ ��iQd�����|ꩧ>��=����D̑�z�_�/������մ�L��ٙ�9��+�����jb�:r�X�6[Hx�^Y �>8��R��E&۵�eu��4a�R,"70@����fFZIGcO�C��[wlcQ'%c�t����bY�M�R�$ y� kܒ�*����k js3�\f9�A��@:��������>��<��S�z׻�|����}�[���T�y�ԋ�y`�h�fl%ֵ���男UU��~(̀�.�q�}��o|����߿��/>�����O���s���R�j��TxABI� W!~x�R�����%�"�y�p����k�`֫D�ڬMC;�B��p�3 �|�Et2�Cy����7���WN�S��O��<9f��g��V��Q��dV���o�`=� iW)g�b'��=�)c�F����ٮ�oȇ�Q��d+t���1��n�c�djg�����be� M�\VY�cĐLj�Œ�#�I�c�h����itXe),�%טۜ��ͩ�X*�A���6������6:˕�ܓ^�+���5�N�J��� V%w�����o2�EF\a]�ϊ2�N�K��e3.D�-�jr�9�a�R\x���Nn��������3��<��O�D���,���!�$*���M�yS�ڗ�Wy�N\� �,.�Knj���@-���ڹ ֤C�G�5P�Ur�2�`�lbge��(<�BV��uԨ7Z؊'`�f�vaM������:ց�谞Ӷ+�R�`r� āl�����C9:���e2Vx�4D�5�6�x�}e��'��e"�~����@���t�#c.ngZ��BKp� �6���@Cj-/� V�e��V�V�U�>XG:K�,�v,cx�XȺd�Mq�05pP�z���V� c��j���� jpA�<#���s0��:U�ԛ,߄�"C�������BX�e�f)b#o!M��}�M.�'��c��g]g�V b�4��{���PFK���*o-ڠ��� ֡��53˻� �G�SR1�GL�*�̣ k�M: [z�dedvL���6��h\C�a-�H Zƒ�bc֡l��"k?�c�#L�bl���+Xc+L��c�������RG�/MV�ľ�c�Y���:�6����� �*ӹ8 m��pc���t/�A��,��Yjs�#@ q�F� �h?�H/�5�JԊ�]F.ׯ�6� m�:y6����V�[R+�q҈�69*�̅!�0�T9 �8�1�R�Y��q˵ �b �Ā��$CH���l�6�����G�<�*�Ru�A�� 2�����P�&��=���aK�뀖9n��h�y�X� �k���kt�Ċr��Ť��[+)��l����5�"Τ��FT�jg~6x�ɝ*{�5Nm�����u�u 1da^bo�D�UF��>G�´(��[��a��=]G���d)��e(��*R�c��!�����(��j�V}�#t�8B�*r��h��i �L�3Q��$9W��N\�UIiV�m� $iLd9�xT� �nЁT#��D��*=!�*��(U1*�й-�Q���J�a&\�&i!�LC�5i��Pu�J��2_x#.����A#�~�Š�[�VEbͰ�t��*~?�� ѐ�V2)��\‡������&b(q��o�����a�m@+ł��8V 4X�º 4$Qyxp4jcH���&�����:O���s��BI\[���<ԍ��*��!��P c�����ޫz}=O���^˸����X/��s���O~���ݛ�G gP����9�I3{$`&���Sak�Ho6������0ܾ}��'��M���ƿ�����������79��?̩7?�>bh}��pʪ~cX�O[A�����~�ӟ.0�G��c����g�'b�������w�΋����_Y�����'<��N�7����'?�����O?��|��}��^�s&��X�J=C��~q��g@���:��G��\��ofn�SO=�G�G���g������������͂��2:ݧN������n���L�E�'>�o~���vf�.��^��z3��$ ����!�|L��������q�tu_��&�`o�'P 7��hG��VEu��·���j����r�rC�ܔ�e�Ũ�ȕi��8�1��LTe2y���e�K��5y߫U�ѹl�Ո���� �` ��4h�Ye�� �j�iJ������5ܟ"l�C�'~������}�{߻���y����t� �Hť���͡M��^���y��{�����=O?��l�������|�+�?�����o�ۏܧ���JZh�@�h-�^ɝ�i��r�zD�<��eN���8�D%1�e��c �#�T���9�X/ۥ|?x)t�O)Z��h�+�.$*�v��������n �d��ޤX���� MNq�PK�u�n��gq%���`�5!2��8"]� YR�k���X�� o=C�����{|IU,s>[Һ6��%�����S��<�A� z�NUe�- g%\e0��X ON6b��F;�:���,{�>�pW�I�Ņ��~�x�/���p�w�%tc�뜎��.���gw���F+:i���t �V��������t�3�#.�uq�ɭ���6�3��ۡ���e�F�rɈD� �Q���p�HUނ�� ��� 0�cQ�W�e�C�|���f܊�t#1YWЅ���9�PA*���G�C�ުl����Ոa��2���pE ˅��"��nPc��ם`��cI$����E�VF�z�c�┧�sy.�u�&Ӌ��CmZ �9c^�ڞ�%)Z�M�{R�^qW�xx �Xf#�B{�뢂��x�=Pp=A.@�tL���F�F�7F�*�=+̰^�D�8v�ЊaC;�3-Q�YD��T��<��]������ΜI��l�1�!Ů"Mܦm�� F�E�X-NU[��j"� ��8.N ��$�ĵe{dAi+�l�0"�q��9���^빯�����(qh)��D��Ϟ���]k=�Y�s�����2.:fb�RA]��$�Wޚ5�=�ߖa7F�yԋ�,IT��.LRԧ�}��qZL��g��s����U��A��%ϊ�c{��d-}� rY� ���Lb*�AM:��Rɳ�� e�7��]7��䙙 S���ZM٣ �0�k�#F��<�[��j�^�C,(�J�����]_��\�X� �ʺJ'��ժ���kd����Чf� �T�®�v̧��}�i�>��+��B:�m���B=���^��#����| y�!#H�HN���G���x�i�I�\�J��$)w�"�gF-75��Z��\A��;�6�m�����(�E���b�N,Ӊd�8�\��ē1oю��zI>�8������V�P%��v6��Y�Q��\>{�1�UaV���(�.�I���`tڒ�Rv�uL�KJX%ӝ�v��'a�S�ˮ� �y�j`;(����fQ��[s�:�ˬ���R�S]��S�����|go�Gt�f�(%b㱺x\M.�ڇgc{��|̥��@A�ԋ�)ǚ�i�cR��Ѕb^��0p �0Hvk4�Y�8�rlMo,�{���%��ۏ���v��1U�D�����s�;�_Z����DD}�SmZ�I�{�����S�O}�������o��o}���� �� ���쿱�qJwl�ww���~v�^��o�֯�گ}���'��<�V;yָ�W�����/ޠ���f_~��~�}�{��#�t�_��^W��ih�l6�w��]����y�<��*I'��C�~;�a�8|���?����W��|>ofҦ����7��=;;{�{�����W~�W>�|�3���o����9q��NS��R�����/�����?��̓�p����� p��2��jU]k�m>��O|���;���R�����g���aw�Z3���΃��J�\�E���K0�Ufv5A�=�a�e5��!f�Y)Ρę]j��[�g�Y�UxF���P���ͬ��(R��,k���b9��������:���x,R�ώǣ#ʬԻ�����w��]�?���}۷E��p��秱��)���������͆?����ݧ?���|�3�� ��ۿ�ۯ��[(c�"Exf͈(y�97g�٣f��:��tBr��d����*Y�Eݼ����@j�r�$�d [T𢪂E���%�Q�a�� x�Kam��27�̉�c�,'�C�q_���+g˸�n&��=9x��xƵTUط� M6�%����� �bFm�ֽ0.��ĕ���KSd�C��䉨ӣ�=eۦ���`^ b�r��1�NrF�¤�08GZ �9񨳆��̀���yT������������De���^�(p��X¹��V0c|<�e���`�ά�:�Թ��ތ8�KX�B�1��-1Xm�� a)a���3�{�Q▝P A!��G���ף��A}a��+q1�>4Dց���E�f zeg ��_VzbVR-3YUd���y��$�*k�!�gd�����a��CB�Y�jw� �iޜA�s����䉜��L:�}e%:;EK�,��(ϊ]�P��9��zHV�HsY����V;�}�tvfQJ�i|4��Bj�q�v�j��3� IDAT��f�"��B�}>���*ŵbS�1�B�nJPou��e��G-ð��M�t��D��{�*6�� 3��^��h���N�TZ�*KT�x�x.E�H��*I�SԻ;�kp��C�����`.�B�b �ԡ�����K������LnnC�u�������9[����%Z��Յ�YLK����}�u%fU�=C�GCxg��ֵ�'I,�L�Q�k\V�p�$�F�{�]V�c!4�[dV�8=��aIY��*s^�+kF�)�tb�8k�V�7�vFxZ#���P<�B5*=�T���k7�3�cx����-��YY���3��e��ڡđE9�*l�6�=����>����o�PG���1���8�t�I��r�餠���0g��1\�"u�$��;� cT:8����q]�=U:�p��5,% sT���jNI!�S�ѻ�'�Q��Z��u���v��K�*��j�.�<0��� �J�� ��Q�5�6iB�R��c�1ɤG�D�\X��u�l�B���d��&S ,"=CW�xHv��a7"�M� ��Y2StA�g.]qמS�U�3wx���� XW���~�ƠB_�� EDG.���s#�ek��u��­�q��>#��c8R N����k����h�@=,�暘03����D3���>d��+�9J� ��,9�k�)�ڬ'�}=� 52�簞��1�Ԗ ��x!��bF.�U��3@�Gs��a�h��M���8WY��8��(ݚ;R�ex�$;8�J_�R��D�cY�WG���BT��Ǘ�}�m�R,gi8�-���⬕׫��Z��x~~�u�u(�?���R�?����c��Ɉ�,�����v�퓨�Т~r���������x�;�����ۿ�������� '�$����d�=)��...��ۿ��������e��᳟���>��O}�S����/�ſxx�Oņv �8��G���;�����/��� ���.�ᷴ!�� /��o�f������oѶ�mNe�|��}�?���������a9���i��T�iE�7P�����>���~��?�#?rz:���4����1o���U��YJ�{?�S����y�n��8�\d�U�(f��+�%w��+�(�pg����ϥ ��n��b|~Oڭй�����38s���^�jrLŘe�c�J�NJ�D��(w�b���UN���?���2�2ft��X��<�MֻU ��o�C����y�������8��m�n�Ʀԟ\��̌?�a�O�S<��3��]��� /�����^z饟�����?�O��~��U�1s��4����>���7x�ʈR��I���T�1�]��p4{�'}Gzt�r�Q��;xwp����% ��u8#/�H'F'��q�m��t��躮�������TYhl�ٶ�\��;�:�M6�c�@F��S?��F �F&P� |�J��8�*�.z����l��,�]8����n�� � �Q�02�:� � ���YGӇ;qh �<��rW*;�_�U��(��)�fN���rc�6��x���T���qd��^Z�C��#|����w��]1K9����^^��Z�]���i͞R%��i��{{g@=���j� ���o���Ͳ�`%^Y3y��]�����`,�\�#�����9Z*Km�JFQ�,�g4��<��.���)ˡm�婉P�$ܚh��L��j��}�`6� >�, ��#���Ȇ!��� fKnQ��c��薪*hVC������E��(�w��I^�g���Z�pm0�\�Q� 5�5��pvg��ҭ����%�9ϱ+�d��,�N)�[�`�Q���lO�r@�GgcAT��8�f1M�/�A�G���`Z��4�)��G�I�)R*�(�Dg��3��ʆ�sX�3pU"�Q9�kN%���%n����\�՝5L�I�K�l4b4[|��Cg�e�J)v���IH���Et&5��w��8�>D��S!-#D ^� ����)jZhNΒH.���F�d#SQƖO�����v�h#?5���s�Q��Q�fJ`�UM�}�&Cwř��W���r�ZOG^�+.�E�� ;��fB�tc���ɭ�w� uL%)�%Y�]��@�ȣ2��>�2'�s���#s gxF+ ���I�_�%�-?&G�ŋ{����6Z"oqΤy83��5cG�D]��f��Tu�XD��eaF����E�<����6�C����+�P�\OG����S�fpI�Q."�uD�;{�<57��pF=]&` �L< Mx8��A�cx�\����[��_��Z��!jdxL+���W�׉�������C����ɟ��_��_>����ӧ���'O���7'W��\w{�= I��^����?��w�w�WuC�����+wۻ��������[����������?�����?��O��ӧ��/�M1{�M����O��{��/�_?_�.8�1�=���O��O~1�� Tb91��oyi�Qf^]]������~��G_�>�����m?��O�����?��3�����7P����ʯ���|���� ��{ ��f��L��O����?���t��-������ �� ��1s�{ZƗ+��E+�g� p�<�����s�9ѵ���hW<�J���8��s��t����f �����������DT�9��bov��Yxُ͋���h�u �Ԕ�)�������Ÿ��?�Ǿ���u�(�K�Vi;�mN.��e��9�B1�c��o|��������_x��g����s�\u>˜'R������^��5�~�RR�������_��a 祜���z /�ܩ �\�L�(��+g�[x�r��K����t� \�/�_ce=Qp�9���� w�j�=���]�M�!"�庬\��� _y,�E+�c���E��Q�Ցg� f�JT�P;b�}��/(P��n�h� Z�J̭B��s {���{""�� V���vBX�htͼ�L:�I��#wpQ�4s���,G,8G��TQ���%�s�{p���e�[�_��č�}x��3s o���c��O]��#�ʅ��0���ڦ�s���{آ��54��EK���J*줍#��% 8Ϛ����aNw׏ǁ�t���;#9���G} o�+13{X�F�PL?E�NH��zh"Z�o;�9� {)h�uҘ�Eqn�L?*T����D�X r �lOv�h�����@��*��'f}�\A_u ;h�-�Y�k�3�3�q�ym���PF,<�Y�U�t��ߦ�/�ix:���D?/�ym����05βj4鿁���ܙT���`��2r��F� �A҅��>�>�7j�㦲�$^�3襽�&� K|)?f�b+��#=�mNH��r;�1��.Q�$L�����N�غ���c8G��h k�!S��ψy���4�2f���m{�"����/���bؠ���5�Uzt!�h��2%ZsD�����e��r(�?��y���,eHU�cxo�F�9�2g�������$"���i�ƽ�7���@� �����k��=�77��C��e�5�K5Pe�.�o5_E|�8��<��NZ0�ǛB��ᬕJ3�.O�IWp�VRG֖�i��� Q;ݠ����������H$��K�2�����`��)N����Tb�W�Gw�Kq�l9�y�� �]�.c�مı#�Ё �0�l� ҿ��B�3ʣR�p��:�\��h�&.���x ��=����LΉg W�!�9��F�)k��aI\��-GP��f��c�s�]� ����s�"��8N�:L�~-pkx^�����n���mfւ�S'=Q���3{i/�1�'��+4SVs�����#[6{���{�{/�a����h�/��Ί/+��tko��R�y�2r���V������ ���YC!UH�$W��� x�-5]�'��~�z�چ� ��u��S �Ϡ��[�6Z�Dg�;7�`����Z~O���B�:� ��VA%sF��L� @�B����kZ!�U\M3�6r�%Z�­����~B&Mt9uC�������G�U�s� �Q*o�K�%b���f.���a���WfYH3&�iUOk ��u����;�<�fe�1;���z�=���x��;Zϗ18��D����I��a�_ ��ߓ�/���t}}��o����h�����z<_x�����}����N2��}ߟ�O?x]�mb�)L��v� �wk��/�'_��_��~�������/��/����������x���P���f�Ї�����=z 8��__گS��|>�������ɟl���F?�����H�u�������C:������u��J�)x�a�D�������/���/��?���;�s��&�������N��p�����s�����A���g����B!4�cW�����?���ѿ�%*��ٽ�FQ��1 �i���B��܊[�VT�����[q O��{BN���zó �N��<k؉����&�8��R�9KV$y�#n��Kf�S �g]����k�9�]�J�8<83�_������?��;���g�22�b�1�Ko�)���O����K�ڿ����χ̱6]˟��o���я~�7��o�O�g~�ӟ��ÿ�t,�-��D�jFYt�aOn&7�$�t�z�a$�H�g\9��]��]��-�{��{r'/�<����@�@g�3��(��ٲb��ۂ�f;MQMy������� �‘zH�d��!z�-Y*�*]hE6��>�jGO.�{sK�C�RϪf���m���75_U�ذ0Bs�y��8�Þ��=�FeeaJ��=� >�[��jP�2�[�C�Tf�7sXZ3j��|��r�0��M�FGkt��G�vi���)o&�Wp)��>[+cD3X� �F�� "��aY#l�S|Cli/3��� E�6�%��P�W0������L�9�t��HKaM�����n*��^td��ai���)���I/��n`�=ڐ- !�E k����(�`�ڻ�iۓ^@ ?�����d���b����p�mh��3���Y ������hW��z�b�!�RJ1e����Lݖo#�R:��[�;la �%6�]�@��QQ��\�M�!}� ��$�����CQ�Pi��da5����4�����Ed`� �k��f������r�l��s*��֑V�iWJRj� �����#XN���Q{���%�ދ;jCҍ�3"'��j��q���c�Y�'`}[|��{�簻oE���ɛoݟ�k���lPDI�X�{�E{�ܢ-Ij sr��*9ۣ��Zg�G� �����U]�N��7[X�ޥ�� ���v�P���!���8+�,�"lO$k�W�%[�Ǯu��Nڣ��=D�N�{� 4��B ݕ�M�S[�SP<�xZ�m[���2�m ����tнa������$���W3T����'>�O|�'E�Q/���%� |���}���������;��g��>l�!ܦ0��ovڦ��F~�w:�O[܇��~����ӯ[.���=���������>��O�����_|��vJO�IJ{Ӌ/M�����������}��F޸���������+寜�wS�[�5�7�^�u]���_�y�{>�|��|M��9�C���6�蹧��6ۜT�vfJ)�|�;��?�g�o�������yHEk�� w�O�%�(>��Ͽ����ٟ���L�V�/O�Ǜ����1���������$hܙc�I�gJ���qp!�b+�I0���T/%�pcW����2�v����Œ�0��� O���������(�D�}@��c[F�R����Z�#7�� �l�wf�:Vue����!g]�(�����~����o�C_�zgv�d�� e���� ��K��s2��:�&y��T�����H�( -����?���~�3���O��'�����Ӯ�u�,+ �3h�������*̀ ћ�G�Nޘ M�`���\T��!�!�n��9\��#\���ˤ'�vg.�AXQJΫێ����;+�����[Iޣi���r�� x��=,G�}+���̌,8���'�ʐV�^�<ӛ����������K�E?��4�^ ����+G�� �#9���bo��)KvշpOQ�{7=7�ə�����u�f ڎ�O���6M�:[|���J&� 7�7�9��G�^�䐹\i;fA8o�ьXQ{5�8�k�e|M���I�[ң�Vk���������� �"��]z� :��Sb�����ع���k�����ѧ��ZܢQ�� bnF� �p݃�1:������ʳ����;�O�Q�`��C�̈��l0�����ͣΝs��1���͈;�Y�4!�������8ʵ!�BJ��C��m͝��S��+{�"qPn*wbh�v{�2�� 29�C�ı�&��sT��X+�R.*��%>�c�A��w�{�G]��)����.i���ЊP��q�z]���4;MX����yA\�baf�h�]�o�S�!I�'��fx��^�c�U�uԔf���=��:�rjpw�Ql�;X�]fӬ[�v�y��S�tl�f�)�<� �0���p�5ͤ"��^�f9O[G{ wnʩ�j��y��n�˞o�l�'��[�/�fN��L�?,�y�ٛ�٣��ʇ�k�l(�>����� �:(�J�e'U����&�KﰰGj$p@7"C1Wk���XG�A�Z�yܪ,���)��UJ�*<)�f���%����X���{����19�c��P|+�K���P���N�p�7%�E֩B�"���6���*QaSr��~֢�;�}��&�Ў�8߬ܲme(�G�;t�+%�!�]m�+>�1��NEʼn��foov�lJ=[4�8�� b�n�n�=��&�c� �O��y�6�IU���1f�� IDATl��)V��Z�^7�j��aJ�!�sl���wf+�����lB��cZ�4W���vӲ�t��;\�^�w�0^�0Xc���3J�D�ǁ���w�'�V5�Lm �d���k��"��\��w Q�•j�� �A ��J�h�EuhDؔܧF�3d�ro�����9��==b˘�vu��:��,��GNv��3:�DmR�ӧO��!����O��/��< ������}���}��o{��-��,"��iׇ,��/���Ó���5�T�@7���$-������~���w�G~�G>��O��ܜ�^���f_�ah�#��_���k��k�,H�~���D��_����:)��AN�BY��>vS�����?��?��w���E���a��tP_l�|`pN�{�\�&�Shv���_�k�~��?����/��){���7�R��캶��?���ǿ뻾�a?_ֿ�'%�ӒƱ�7?�_����L:�`'B�C+y�٬;��������mP�NM�����rV�d��U�v(�XIyG,�-�cR����>7w*[��b^��8 �gS�����[��-�� �b�M��Љ���Pf���s����������o��o�aV �OՂJ�:�.̺y��5J��N8���J��%�?�C���%�Y#4������������o���������������o�_Gy��s�A�f��K�װIVV����̤s]���F[|��m8!�:�?���J�a U�Y5��b��,<��6%��ϒ������$K�����I���F�Q��Q{��֦n��œR "K5p���<O"F���d�$lҷ����f�3s��ĿБ �ЙJF�D �gf�Swb�{�e���6/׊!�6ٚ[�E���]F�GK��2Z���Ql����k` ��;b��g�,X�ف:I����t���þ�I߲"��[OFr��Fsf:\cRQ� ���jH)��m�� Ol�4��`��V�˪�xn�̃8�L<›�Z��̃�^�=y~i�hn�v���[Sq�$O�È����!�,��M��uV�Fjq)v�5q�\���U�C�uCr�!���ٵ���k�Z��+;�&J˔6sb����Hq^꒨�1�M�bcv�뤇'�G��Vn�'P��a.���1���ܚj��F��k�6X�1�ٚ5�yRA6��ܺ[�\�cLQ��ھ�[�>T �1�o�k���X!n)�Q�j�Ħ��;<�Q>�ф���J19L %7n�Tkl����4����IZHvR��7v�h����6�V�;X��€��#�t��k�z�k���u���6�I�C0�z}� �R���-V�}��"��>=d*�++�����I}���f�ѡ-�݅�ɀj�^]pO�ב�)Z&s���6�%�9���b�N�����,��*��k��j�v�]� �8�+X�����5�TZ����9�W᣽L��<�l�ឞ�Iha#� E�F��{r� #9��AQg���h4�<��k��-ĸ �Z<&���%8D�x����O,��d���f����w�a���h+͈[�L�P�1Z����\�u �EQ��F�����U����f eHk��Vqa\2yo����Dl�ݘƉ��M ��)���m�X(�X ˶�����@bHS �ċ;@!�W�5�y�'@��w�A�c��S�A9��������]���\k�sN�G�z��N�D(�ɣ� ��� H�R� ep:R;$1��� q�t�!�(��\���[�H,�"uB��o_�s���]u�g���F��s���>�T�첩�=K%�|ꜳ�Z�ߜs|��<8V�H�!�Pg�G���KL��e�-WJBU�0bE��w�ľ��j�N  ;�J�� ��x���;��93��.p�߄O�����Ǟy�o��{�Gx� M���?򑏼��o=r�H�ZQ��dؽ���7��=3��S0}��ږd�JSL�����������O}�S���'���[�/^�j��+��|��{��u�ۼZ����;����mt�F����Z_D�������C�P�r�a�"�ݤ���h{q.��m��]��M}-�5�p�UW��?��������ӧO'@�͓�f}�)��������]w��Ç��A �����~�-�|� _`=* B���a��0�ص]�&x �$j�N 5�fk5�����'*� b"�VI���.P�C��i`'b� �'��"�@,H��Cm�˸"j6���*V`�4g�������x��n�����~(�+ e�qA�:XA��R�r+ΐ̻���l9^�Aܻ�j[v�n�\ ��U� �@�����������ÿ=�o������_z�'�O���E �Ү�GADs���7 ���1J]ܔ5 �#4���XX%���X�4�,�� �b��yӜ�L^��b�6'V`?����8�j�AR�I���g>�o�QZ>���""0��n�֓�H����]�s�I]dW��(�@�����ZI}.�̔����� Ї"�F� b�L֫�ʸ+m%]o�����l���U)�l�9�K;k(����(H0��3+�B��Q}���y�{!3�GҶ�t�v�1 ��=`Q��!X!2G�C, �!lG�� �[L�D2�c�֧�q'r[LE �QȊ�J�?��o@Ϻ=�p*p��bv��+��mG���XA��wD�@©Z����3l� y,��1&^s�V� �bȔ�b�U�%P��Q�'!{: G�!S�� �P2�!��S��a��*ȑ|���`��ܘ�x�� !�R�r�����Z �  �������S�M=W��}�=��1�G5DK��0r��D*i �!�b=���W�EhS�IgV^ÆN��P�$D��a��:�Oi� ��1��1{.���f�I�bA*DWRR�,��^0�"[��.0�$ B5|�C��q��3�q+fGh��Y2�� �v�0"jC��ȁ�up@ M�Q�� ������PR>� }����uㅐp�B(`%�f���*�*9�؅�8�W��m���E��z��T�0, �BEnG�}G>�A�5bG�,�M�dM��7���[6b1�ᄛ�X+��L�ZLvܰ`V[�*h8 �C#�s%��戅c� ��H=� n:4�E����S�Č " Ch�cRJ<�c ��qZ؀����莰��)�+/���0D���� �r�&0"��RJ*��QG�R�۷`����0w�"E�H�P�v� �U��A���v� @�I���!����S�\���,5ap#ka ��{���Ѥ["�u��;�>�B6X5��`j�*8-a�fm���H�e�2�Ҹ=�ՈL*On�y��N���璑��a��P��1TJ�$N���@;`�"FԆc��}�8�du��&L�/2ټ�� w�;�&����� n�m� .m ��-�"����A6|y�U���8~ c�Y,BUЮ�+ ��t�R�����]��#��7^��V$�d���(dg)ơ+m��.�=�� G�8�@Ėp a>l��"@.�@��1>�*�61V YʢY�Z�q���?P�D�&a%��5��eS����DۤcJ�Y�}z�T���ㅇ9\\PfRY�*�_�w�"����_���w%#^j�뙿2]u�Uw�q�{��V���mll|����g>����mhh��{��b �5�|���Bf Pxe ��_��4{a�k������F)��c7��Mo�뮻R�At=���G}�{��o|co.����KJ��k��w�w �o'��p_ �¶��������/~��T�eDO��d++ ����i��i�8�`�* �/�0���"�����\U2�K�U���!�v [1>ً��'�&� #����;ԫ2���6���ȫF�֒Q��n �����w�v�m�{���F3�-��6��mߎ!>Y=�<|�?>�~����.��ֶm��e��X������1�� !���Yv)m��x�Wj6���X���%U*�GdY�#5� }�-����S��P��CQ���/Fە�ۑIpg���вa��3�[�F5�F�.��U>B�2���(��N@[���C�ݯ~v9�� < ~�tYᲚW�p��ͨ�g�+<~��}�9H�>Y�D=4 �A,*��=`�x���:N#���8�4�����F�'�� n�l1؊ׇ#�� ����u����瀁�!�c"|�Y�0���|i43MHW��� �no$��) E�K#���JaWv�A41� m#��d@�6��j�*�*�� H� �(ʳ�^s8g�D� M3�����ԫ��+d���0Ga���^\Q�51.9*�)��c�Mz),�a�i؎���C�P��|NZu��5��Mv,>���'P�#Ș�npȬoFjT�����䫉K�C���w�B���x�oKC�C��q>+�B%�P��W���w�:��0�vs0Y`k�#�톌� u Ҥ��+��Q%�fR���s/hα ,[�T��5*rG�晒?D���b.�0��<+K4Ý���~�ˮ%Ci* �\a�ܡ�h� D��N��m��0+�{�!` a����i۱)ۡ�Ѓ�#l@ߕ�{��pv8h���ܕ��b8�Z��hOX��� ��K�+`W~iĂ�<>a:�.������UP���8�M�Y,�:��G ׽�,|��$��H��(�KA�i�� �e9Z���]��`fU�Q=�O��]�����&LAOk�A���5.G�*��p�/���'�'`O�o��@�fe���(6�4.�6�T��i�>��� �[�7�@�jX4�a˹�ش�������}��!�؃�A� �}+��Cŭ�Ljp�-@�D$03Y^M�Ү)�+�&��pSJWj���ZZ�r2����}���a@ҧg3�`���.m�@�X��at��A�'��D �W*��J�rm:7�]x}���L/��`s$�*�ʋm� ��`8�o{�??��������#���9�;�oEN:�4�i�x�ĨݑK�!�P��,d������"�������.Dl�"��n=fӪ�#4h=���o}�~�B�_�׿���� �;�n��t:͆����;��]�z�^��WƵ��������7Ӛy�2O�FL���`�ʸ��o|�C=4��t�H���J�'uҤW�:K��>��?��?kג 3_�!���.m>����?���u��p��#�1�;���;�l�Oۺ���(�����巿����A�n���;�z����n���}�s]�w�Ǯ�c8Ԉ��K� �,��,��+�8���f��%ZA̬�Q4*��@`r����ØH�f�Q���5 �z�3 fJ��*7��+M�#G�����Orp��Y�z2���b8�`�kZr�_�����������iX ^�4��; � fyc��<��I�q>b8WB�T���G@�8 �`[���C������KP ��P�F �*�$xF�����2��!6:ԍw��)��R۾Z�a�>t�L�vY�?|v*�9.�.kڎ�����Q���NCB6��Z��qX�����p�{�� -��FwLIKx}ro^V���a��ja��C�ia I����9l!�B���-:�$��`&Xo��"�'�#B@&h�"�.���Dž���n��Z aV8�`����?����6��oXw]����g�R���˗� ����q�F� ��0 ��Q C�繰L� ������R�@(��j��2tq%�*+�U����+<�0�BO8 ��}Ɂ┸�=`>����U��5���28���;qd[c6�ӡ�)�[�"&d "�/ Ă�>U��&�bCp�HY�h6Z1 ����x糒@33�钏� 6����%���x�:�C"��� ,�XM��>��Q6S�Ai MƼ���1��U�2`�aO��W�S�px5��B�E-�����c�)qD��_q$�>mX$��0��5B:I/h��8�gbh��9�'����~�P� �"�����o���O�<���d����;��~]ׯ}�k?�я����N_o��]H����~p�������}���BKh�<..����j;�_��W����.���9qa�[�o�x�}���mo�X�.�d���}�UW}��_�����m"=�>{�y��|�;��l�7�����!.*m�������o}�[ǎ��\/��Z^��^W��~�����>� ��B��T8�i��`�p��]h͸fo( �ٴ ��B>�3�v ;P 5�K�a����c݀,���,)`�&������������}�;q��A��x�9��;�̩�]l�j �� KO=���������.��G`�>��c�Q���9����� .��/ܽE$�4'�����S�3_s$ِR�5G�Q��8 !���#�����D��F/�/{귏EO����5`�x4�>�$\ ���R�%p�Tģ�i��c�K��a��-���As�7`�l]|N� 9;���G���V�tP����4R�<��Ḣ���'�e�r�1T�o8�N ;`̘j�Wqt����~�?5-��� ��?,,B��I�m����H2���� Z�WE����j���� �����-p@8�p��%V/ժ�g�����MPh@v�0j ]I�"�� �?�8��][€��DA�mf�+Gp8a��W�.. 6/W O2>&> m*G����+ö�]�F]B��C��Kġc\�v�;2�l��NWb����4}o��1h�,�~=zH�\��55*RQ��\H���s�Xw�'�Ƭ�1GP;+�6�b�"p�Xjp�zR8��/���� �\Zt[ ���]�)`X���� φz;�&�ļgA�aD@_9�$��XO��`���V�w��E����Y�p�1d�)��,��8��'T�D���xx �!�z���RU�ttj����f�`�!��U��(�E=��?����d?�A�`�.�n.�x�%|�ߛ�[)��+>�g[^Ϙ�_r\�S�K����ӿ�v�":_��0� �IƬƒ]si?�T�t�BT�T���Nj[J�uZo�%�� ��ї�r�� ɔ��g����N���&��_�p���+e�|ֿ�+!G��� M^h��o|�ox�����|���2`�]hJ���;������Ç'�g �uO_G�.��������߾��֕��+E˾�Ǵ\�믿��_���8 �/5�N��=��#�_��ӧ�G��b���M���������WWW��Yk�z�=�%,��c�=�ַ���GA�j8%ZrQ��O&��dt�b]5�d�-(��r����kh�Ѩ=��ݵH�B2�e.oT�$tߜ�3`,x����ޏ�׼�5w�y�﹡��Ў� IDAT#x�����R�+�DŽՌ0�⨰� ���w��{w|���o�&L�;�=� }p����|�5f��bo���U∳�2���3Vo;wA�C�eM��nM�88b(�UB��̭}ƌ����@��P��#��1j �~�z X#$,�V����]h�}��+p@nC#Ŕ���ܪ`̺�� ������gaL�`=�:��k\(�YPvd[A۞�y�����(�z �%��4˳cD֥���Rz�y����!Q\te��L�f��)���il�45���A�UR吨}����kg�.�ʗQ��/�jp�9��]#Z`0*�����")�Z#-��V=��5�pR�t�7�K!X!w@��ԉr��Cp{zv�qPGBHQ#�Q�jz@����Er�� �.�:`o�ѵ���&��� �>H`t�� ��;"g�����6$�:$b7�M�f�`��Ϝ)Mt��:���Qq���)S� Bv%L I}$�f$��K���s�R�B�l@_s�����.^C�R~Wt����e@��r�q��<�)�s42$a~!v�Z�7�QW��l�p���Y�)U|�b1�kJn'Pg�ُ}r��p����&/C�le���0vP^1��[A"5ͤOO�d?���}l��~(2��B����L,������=έ9?���AD�l�jj�%�ml�Ym�G����?�� sW��5��]�z����W�� ��k�֢�o~����굯}m��i?Ŋ}�,S^p �ꩧn�馯}�k�U8^W�Yz�k��6���1=/^Ґk����k����GI���md3��'>�{��{)~Z ��T���h�" �T�H�f���~�����L\��EH�����~��Zs���G��ڴc��{n���nt%�~fR�����t�l�95&͡!�e����>��З��BgA�[�>�n�+K�o���������8&��V�� �WDhD�&�Dpy������cw���_���iԊ’V�٘���/0�Tj�����( ��EG ��mq�U�U"Ü��c+Ts��i��!�D�����ĀO�����Q�05��֐5L"0[�'��� ���XU��.#R�a����.��#6����-`�J��@�(?��aDD���4&����U˄��GHo��犟4ۡ���?i��an��Xan�! LLg�D�C Ԝ$Xeܦ�F�S���*��F��9}�!�B��ۂ�3�2��R��]�x��Cj�,�.�{��壍)�H�aE\JH�-�l�bm�ʽ�$��I�)S$��9'��4�|�����������.�=�'�"�w�ޢȘ�9 d�ij�?1�;�G�>b�S��7�@���|#L�g4^�?�LJOL��d���H����i�q p9p�lO�߇ր]��<Ї�l�z�D�&�VV% R���|���|/������Qք2��O1@s� �e����#qMxxa�P�ն�m � ;�"&ʁ�������=K�M@��-(��_�絆�9�g���dc��<)����R�� �w[͒?)B6%<䎓����?X���9�Z�km�9���V�4o��&?�g9����j&Mv2�}l�V����^ ��&�z�],�QUUEQ������,c��CoI^/�{n?����_��_1���>���u]'"��}��[�3��?��[o�5AK/砼 #�΅�����-<�@B�ҳp]_��[�j�׭����O��ź�.ѣ���_��_j��1Y�hٻ��O��N�D��N^J+�]w�u��7���n.w���pOj8��|�U�Z �n'�����(1���`�Q�,...�����m�ݶ��ЪK�U�:��Ϟ�P�.3���oRn�ߙ8��G��m��v�_J�XV׾�9{�01��e�BU A�ű&l�!�D��i֥g>�[�Ys⤌�4�=kq�9<Ӳ�@-9�ed��p0���� �T`s��;8M�c�%�x��4���;� ';�57�h��6�_%}�j,.�?x��{�6М�0iU�]/��$���7-9V����i�V��~g�/�DTzD��Y<���aR#�T�&��](�0��Q ����|<[D(��BJ,�n�F! P�l�Tٞ�c@4���:�<2��N��u�M{օ���yW6K��y\���28�����7u?ؓ(f����Y H����b*�� x��SI, ����qh������� 1W��ZJ��3w�A���:S�Iu�D�+�mR>�M�Oj�1�V`=c��� `^�h~ĭgp���Nl����_��P��z � ���Rٞy��g�B�Y:�g\V��V���|���6%�����T^�.�%��U�'T6�����:�$�ӓ3+�������2�z*��]��l]!��bx>�?3 M� ?��o�ߛ�^!����E_�����/��/m�����/'H��MM���(�����s���b:}��k��b։�����nٝS���8I�W^��A�<𖷼eb�q�\�4W�U��������i,R*�H��k����{���+[�4,���H���i�����)y�w���Q���Xۿ<)H��>�����}c}ᄜ������|g��wQ��9s�J��a���bD�:듈�u4 ҙgR��cw�t�M���'WVVr"R �hw/]���kfT�j�����c�J���q��|�c�؃>��wP Km&G�N�LrL@���"��hȌ����o�(^�]� Tֆ��2A/I|�!@s��DX�#��GQ IϢі?&]P ��u~ɱ]s;e`=�tLl��{� ��r-%H���x.XA���%���Y��M+ 5�� �����;���䃝u��DY��&��G�U�;.N�Cx���� :���[���͒�F�R�,Pެ�M<� ���P�8����W�Q'�D��Y�r(<�PbOS�� mi-I� Zݐ�'�oB�ert���-�4H�v�C��%��}<���b4��C�%�>1�fI��x����i���}6�-�h^�.���M�,l�L� S����>�\`X*�r�yq`�4�0��!��m�͘{�^�c�Yc��P6�b|깦�,�R��~���7-��y� c'Ozn 9�� k|���v�i�Ra��.�؇K�|㫼 nA ٱC�\t���4n�zIO(��lK� ���"H�����'� �-A{�{��y�����kz�� �}���~����_�� ��\L���s�]��ѣG?���T (`#��kƬ;�xL�ߖ r7E̅��֓�.�ަy��Bj�\A{: ��U#S�'�h�ݥ�0 �C3f3[T����-;�(xUwRT`/��E���΃��L��@��϶j*�a�H'dbi�U֬�~CuW.�� ����z�B_����4�0��My���6]R�RHU*)de���n������ ��͊� ����Lg��oMDz*���4�Q�b`��2M�w5���i c)�Ʌ�L5!�ﴌ�h­��������0���{�q�|P���P&�|�jb$8�V G�K rߕo8ց]`Ա�}�ȩ���w6&!H�� t԰�n���Z� (B0sw�R%TJ��/�~9��O�Yn�! ��FX}�m ��05�p*�Q�ʼn6�3�C��*�=�w���;:?FT��c99�45ElO\���֗ �;�_�u���?��C'�)��)�ԟ����җ��c?�c�ս8~zo�{�����/�TRze����w��?���0O� 3��J _���/��2��O�<��/~�`p_�+���n��-��p\p�3~�#��?���K��u��wJ��R�� ���^�������u׽�ԩ ���G�P:� I("N���: ��{0�k'���J�P� h��Q�JPLd���=�eڦ�YZZ��g>s� 7 �r�I}�ԩ�|�3��Gg�&�U4�ˑ�DO�bKq�]֭P$�Xbv?l��37r�A�x���I� 8+E�Csb3Stˮ�"i �"$$!�Ƅ����ϩ�)夘::r��vV����V��dmJ����U�aî�C�Q� �4ld�E�5 e֛w����􁳣���Q g���A�C#`�oN�)렦��{�9 ɉ ���rT@v9�j�j� ~`��M|�I��@�����lɒ��%�'�ł� ���hY�$=�u�߬uΎv�:Z�M�Y���A<ѳ����hI��zT2W�r�)��(5�x�)�N&9���A��?n,��Y��}0�!�tօ�ڊ�I�Xw��fd�>9� �p���K@ :� m�[fU��n������X���@�JԎV>�ބ��Ώ���9�q�O(�~O #� \�l�T�Q#N��H�EH�3.�T�Z�U>��~u�� {���ϟ���rY�r�[�] b��+W�� ��e�:�,b`r�ޫ'��`��f$/�ҙMb)Lf(��A*�/�@�L}E�(@u���nt�'ͅ� �NH�7"J6U;l=z��6�!ћ�H!�k� @4���+�G8 �:�> � ��d]j�n*~���b�V��g��n3j���a)]0����� �4��X%gs�}�C�_ ���j��lO��6��+�gXG��jԚ*��]�9�-A�qVwr"��>���2�(j1��]����ٓA��,���5Hc��U&' 2��� �L1�T��b�>�WBd�)[��ԥ�fam�#����o6to&�]e��螇�Me�N[�Լݯ����}�N��zp����V���(v��Hi'P �4b��E�L���f�#�}���Ҭ�E�T�� 5b�}�n��;.���w����}��cR�boQ�n���[o���{�]]]M:����2�%�o{�۶�����o�c����x/3���J�--�){��ʄ\|����������=����?��� �˄�6�c�\s�W\�|�TSjق�/�l����?|�7������eY�6!)�����%iL_@�Z�\{����{O>��{�^��"BCgk�ش���g&�ٺg�&'�|�(�y`9�l�\� �H�H19+&������^�l���r������׿�`?s!�n�maa� ox��7�����������x���I������2Dc-�T���;+AK�2���'f��W5�ۆw'Εn���� ���v$��'J �9>.�{�I�=lJ���W���ޔ�� �����e^\xĬ ��mq�j���������*��=}-So����[ʄc�(��%aȲ���T ͤ9`8�*��ļ�2�U�KKq�ÆE4 i���q G [�J�HF�gH��]��m64�U�"�&�����3���T�-Y��;��Yr}�#�6���"4��\j��vG�枚i��H����g�c͊ԉ���� ��p0ow!�f.�Z��L�6�j\Ph u�G����WNNۙMKlS>��[bl�7�d� I.���\��&q�Eor���g��ͼ���{��~ ,��8敶��Ϸ�10^�����['i��쳿�˿��?��ɏ��l�^I )n'\��o~������_n%b��x��Jz�GN�<������@��%B�3��G}�;�9�Ҭ������7���/|��2��4a�g�(��z(�O ��k!kp���򧤍��_��_M_O�PʱA��z��m�H�v��5������������G�`�vs,}�Ng� w3�� ᰴ�+�M�G�1� +�J�iݧ�(�cmf�\s������r�-sss�� 'Y��H�=��������رc���7��!:��Ժ/�,Kw� �$ظ@4�Cuv���� ��@�y���Q4q��gѦ�}�'M��p:�����h� c ���[���j,�}�S�y3dW �h:� ���X���-m;���I���}���o���iY�|��(�� �Iǹ߼�������UPKđ�WE���#0x�p�0[�_ 7��4�N ��-��L�V���ϱ��7� �|���}0�L-�~nL4�rE���3 �Bq ���Ȝ��E�!�Ẍ��/4��-3�3�f�`\`ӫ�� ��a^�5Ѝ���@��)����tD� �"����h����zVGΘ�L"dm�@+3J�T[nw�aKoH�,cO��U#��������g14�b �.�����?��&�I��{6쾁}����4�OP�=`ɰ$���d%��ud��1&3��g�tGO� *�e`�q�q�#��M ���/�d*�^���2�_�z�2�B6���Z�z�4U�<���b�9av�}EX��’p��<�U���%Y��"pvtE�%�@ؐ6���0��Y�j� ���}`\ �~�;�)��u'���k�I � r ��b=K`�p)q���H��%�"\��*�%���'�啣�{��p��u��e"=�$�F�I)�,ʎ@� G�y)$��i��}��>&���p l�З h�h��^�D;��8��g�v�y�Ώ��Y^@=i^�J�C]���T�!��k���Il<��]�h�T�'Z��X�����-��Ma���D�.A+��U��ß���\Oe��B ,��‘dރ���m�0��@�����<�b�b['-x�y�k���k��&A��^���q� ���T�������oLﳮs/�E�:s3dfw�u�w�1�z�^��;���>���w�{kk�3.n�B7�p�]w�u$?�QH���?�����w�}��w��S̅)�� �i�I8�]w���~�u�{��g�n����u~����e�@��ۿ�[��������գ ��k�3� �b�/�4��<���&�0>�˧���p�$�U�q� ؄�AlE=�DT�5�����~�w��O��������a IDATp�U�Q&e�[n���o|�{���/}�����+��^� ��#½�K�L�$�e T�Nrn��;Р�>'�5� c��Rt7Qh%����_�B7�G4�IX O��e0�$�Pg�1���ӣC��P5R�2��d^�� '',�V%3y\=`^:z��Sb΢5 ��>OQ��2��p��o���oY��`��Hs!���(`s�eز����6}[0�s��5�\"��#���#�6=D�@% *�����UD3��B�'�eg w �c"2�[�`Qs� �8 tf�Q��O��ŮKs�v��=B��+�Ludd�b%”�d�$� `��� ͬ�L#e.�>i���Q� �� ���Úx�>��ToF����?����E`XH �� $ŅQ� S��=�"P���D���'K�o;v���f��#v�5�� NC)�)i�Ȉ*r��A��X�Ai�3g� B�Z�Qp�`� +��˝��u*:6J�F��B�y)�BU�(��r�!c�ɽ���k���uF�a�O�ͤ�d=" )i��V�b��%=�V<�y�O���n*wIӛ��}�{�:7K7`.bv � X�.6- ��_N�����P�l�z�J���i*�K <ˮ��e�$Ę�p&��� pE�|�q�2aY�j�H��9�Eh9�Ү0K������IJ�d���\�'J`έG��%��R�m��m����+$$��V��6�uP�C��c^^%b/�aE� ��aׂ0T�.� �<�X����ܵ�`OnJ`��S(� I��� G�s� ����Vi���m��Ǧ Md��k�qp �:t �pl'k����tn�vh�O�q�r�*���d��Es��)�A��m`EQ&u����S4{��"� �����y�{VFk� `��%.�#�@E�\M03E�� 3J=��lŴ�5)��)Y�N��}<�u "N�%�ޘ�;�h�9GM������2,7�9e.��y:r$������������p�[�t��PN���]�zW]�7�|sbܷ��+�ac���~����z�����KV~�S�z��lqq��������w�uW�G�b/g���> ����p�ԩ��/%��Va��\��������>�` �w=���{E%�x�����O�s���p̰ D�97(;Ar��*���ֶo�ɻ|�G[G�f� ڒ��ڳw:�$$N�� ��� ��X�֑H� �q�p��g�����/-�-���2�[f}�쩦��������}��ѧz���kieŜ�u̮�����艕��R��4ʥD��^k*�k0'��kWx6;d���a� �T)�Ž��mI@�z�y` \��k����-�����=ϻ���C�=2 QrEv��b����$�P��&32��(a"YXA%C� $l�`�2�&s5�V�W (p��]]_}���Z���s񮽫��p�&�T*}������z׳�����^1\��>d���> }(E�k�_�A���Z l<�QuLVe,2~@V�RP�L�=آN�`�P�t��)�Ko�hWz�ST���طך�165��"'���AI�Go��K��(ޤ���.-��k"c;1��P�I9om;��n��2{��ֳu�"�c�ט�R+ �5b�l�/��p���0�/�S,ǝP)�4���c���� uB��p/�΍Q�"Á����n�W�R�R(F�2�3�=�%)a��7$`+; ;�לE�C1o<�P�`�U��+��3�Ԉb�Z�L.2�p��y�c���l19�i����EH�N��7u�"t���\��#��T`#V�L�m���ks�8@+��-�)9h��:u�-�v�띅��"�� �P�S���ltkC3�:���%�15�#*�$���U(�e�ڠi$� ��Cx �p<������\3�!�oe˛�iO9�:�#4�њ����F���dh'��?$��LV�����f�WVa�G�I�����1���y��gj�X�RB X����=vkvk���J.#9{N��4t���E��eȸ���L([1��e������;7��ͽI���L1s����s?�C#��zϬ��љ7����ݻR�9I�9����������fS���m%�T���$�O���iNB�G>��^{�~��q�i�]� x�����/��/|�w|����w����ާ>��� �9�}_Q�bR[V/���I�x.��_����|�/���>������>�����5N˦6"��W_}�W^z�gս�M��x񴄧��YS���O�����o�K��{����ϳ1Ja��:ᐉ��P����oR �6��)t��xj�;ڑ�a+� m)K5�IM@4�%Z�ۙ�V���kh�{?���?�K� ���x'l>O���5�4aVJ��o��_��_��G?��+��v�Q����7����3� �'�4��6�G�[�R.*�&E��V�yF�/<צ�۾��R�t� �'�mhG�G�Y��䞾;u�2�D7�����]�CYB��r#���b����t pt�+q-]�X>��#k�OuQ=���Q���TGC)&.��C�ۢ���F$)�1��+z�Q�#`�<�,Ʃ2��K�� fA�[���#�0�D��@@���)�#�ŀ�Ѐ��xQ��(�(�N�`���Z�ت3z��;^��T,( �hpo��E�=rr�#��|l� �D ���qW�⍅aY�h)��p��r�%ܲfh�zMؖQ��8�� ���#%?j���}��$UCe�� ��Qz�̈́��6)Gff)� =��Up���FD �bg� �ZqO�V�d��7'9?��+�IrA( O�-P ��PߥJ��X��`�F�[v�r1� P�6X�<����-ư��0w<�I�h�N�X��Ցh�, �5 ���PZX��:���mL}���-��+�������a�����XH <�VEs���Q��(�3Z��*�Ӂ�8��?I��M���=۝s]5���tq�,I�p��k�w��k�rv1��O}7�6O� e�"�p�$R�IǍ ��RQ�g�4f�1V����q�%�AHMЉ7�vP�8�T_u���b�ʸ'�Ľ� �6=c�r�5���0�f�~e Vo(��p�"�[l�u��ޢ�:+� ��G�`2oR&�D9�媉̡ͱ���I��D+x[�+��lf��(���[�8��ؠ� �o��B�Pg��a����}�7�� leX�ʭl0K���Cr7�A� n� ���șd�<3��v�If��U�R�`����D%ݘ��`^{f�}��5؁�`�A�����CY&�3�����YR�53���un���ŝpbb�(��>���������1�VnT4\���_3�@] g�ω��L�����Mp�Se�1�yzU:�����t)+ �����6�󻂭q.��)�6�ڍ�c_|�#����w���I>���O�T�AN�K{�\�K59�lW$�ɬ�����;��;���g���o�����3��L럋ILJ?��'O�pĀ�wFIҷ}۷����,G�}�@?_-�ǩqX+�v���_������WWWu-պ�m6�(%<ú��'?��K/=[y�+�����h�V`���[�������=q�����}�0�Q�t���"$8�+���i����E��+��q�׶��S�2�`�+|�D]��n*����s��j����n����������;O���x����t�C�Q'7��~Q/�Z�J)_�5_�k��k?��?�����ͺ~?����u07���1M!~�G�/��C�� ��Y�f������Z�-TY�~{r�8=��iK�R*���xQ\B��5���ŨIΨ����skS����J@ �;C=�������xѸ-��G�+�ܸO�1Q�U���&����;�� n�~z����ۑ�8�0d�P 31 �zJJys�E�bq�/�mp��nQ{|���*at�ep����Z����o��x�� t�ÈU�~�ָ��(���)b)X�z�8s��:�j�R`�桌L��zX%��5p�����m�C� ��ǣB&��LI,aI�j#������<��.` ������M�� '��Jf?�:�P�(&��)_7 �C0�<����)H�+%�)1���+��pE�0ޓ��Pt�1����u�{�@jQU��7��bY��f0���Qae !8�O+�0�W�S 6\�2�4����&�=�N����[1�� �;��-�!��� �&�|����`�l�"v��a_?I� f�������UP�����j�^��p�]�q��\m�¦w�M ��M� u�eOk�[���FyL���F1���t�g�ߔ���_N��Q�lR�YO�j]<�u�� ��xk D� :+y#;|�̉~{��ЛhHO��oٷL@�g*y���MI*b���!�SJA:��B9.u�VZ�3XQ�GP�����b�ԋ��BS�@m������_����b�nIk++)5!Ǐ3�œR7ZwȰ���V�M)I4V�W,P2+��u�3�R�58V�,�n�"��qY�fl�8��$�^îEA38���!�jl�ڬV֙�1 �X d��wP�,��"٭���̃M�o{�:�3I�Q�֚ 8�#ס*�ov�e r��XH��{L�av�;~���דraEYf_�`� vn ά�����F{b'n�-��W~�Q���;�`�lf��b�)�i�C�B�7����=3]b<����S .5n}\� c{,� ,"V�Ä����lj\��9�ӟ�b��ӿ��j6ՙz���!��2o ����:}�4��Р�ppQH��i�\s����C�n 2v�� ��VbClk[?(v�`�]���;̂�P{pGb* �)��W[dl�o`��&�EVCjiR8fzgh!���w��R-��������|�#�2̬bOx:��o�o����?�ӥ��_~�o���1���/~�K_��{�����߿���_~��W+=���~�p>��}���}�V�_�}o7m�4>���xD��#�w��6Xb����cL�I}���9��S�+^/�A�X6���w������X�K�(:y��hm�9-��D� BFd� 3�� +�zb&f��.�9�� ��b�����>>)�·�p�RJ�`:�b(Mc��8(Y��Ը֑�5�YK�螋�Ϗ?ᡈg�N���"�g~�g>���O}��|~?���?U����%H�U�'Ms����_��o�/��� ��1q-�!���v���c�-^Ț�k��6�G�G Flb|�es� C�4zVҊ������0�24����3�ɽ�wq;�y��Y�B���h�������O�CJ�!��Hx�4�����_���+�~�����;�{߯�����������>���Y�^��n��X�X�tnZ���U�r)q� ؎�d��_/]hMYDi��<��&1/Z:}$Wd�k�# �p�@�����s|]Ⓒ��\QD�@���n�nYR�5�y�.�1 ��uq:K���N�(���#�Q��(�v��X���hXe'Dޠe1;�3eʈ ^u��R�B���[�3Q��tq6�ň�c�`ftp'��-�'�v�F ]M&�6؆�#R�w�R&>Fgr!�p'b��I���at�5�΋�C /"������̵�܋�BP�{�P��.�>�.��* ����bR��j����$��H6f���Vd���K)��`�68�*G�Z�,�C��NjE}��YD3�ob�G�/��g|���(ɱ�f��ȋ�`��!Ð4�3t��AO.9-`F�@���̱>����3 ���4h��5D���-?,�+���`V�3�%� �8�k�:�� pKw��VZu�uf�;��X�j;��2Ň.� ��:rW�ڛ�xD�}G81W� #�ឆ��U�,�5"{7�%6*QqX�!���IFoe�d� �~�Ң�:�pwe�4�2؞�ޣ����)=~'��_o�������h(�{4�6��I�x�x�X'r��< �Kњ�L�j��g��^Tz�mCs̰]�Y IDAT��t�=�ǒ�y���Bz1x�?4;Gk0Ȕ.Bp��"Gt�f�'�>�� �F5��Į�cn�W0RU�k�fd\�����p��'IHtK�3���7�Tf�%1���1_y��������b��3��������t��+I��R�4̂%��M�fi�Q����푙5H��c� �t��ž�W�d{X�l��d�$���t0�hY�^�( �Ш>H���j(ir ���lZ��#�Do��vKx`:s�c�d=Q�BfɖQ�9�` [�u�k�F�D3թ+��OE�ҋyan�����^�l�H��F����J���1*! RI>6�����"����^��q�I%پ��(�`͜Vt"�����,�m҅�,|��"M3J�6��]a3�����������-J��b0�؉+����)R�s�u�5�#���ae1jn�ɋi7&��%|e�� %�� �8��;c�4��,��s��c�}��h�E)�I�q�ډ�&(�Y$y���R^ � ��/�`#���஑,f�ߚ�[�sX)͉UИe�����ԇ���ؼ�9##xBz��u��]�|�0�Z �k��׈���k�eҹ�&��j����0X���y���+fn��Vc3b}� ���g��v� Z8��*�����V�sF�|����k˳Q�CX�x �'�q�6��"u��q�� ss Wf���������t�7�� ���p����h��m�q�i�m�a�R��?������^U��8�?��|��6��/��/������I5��R�)x�|�n9����g>��O~��^�/�?��z�M圛��������۪}?�K{���5��ڔ�b����?�X,NFHޒ����k� ��'>�/|� ����XOǻ�eX�+��������^z�����3~���� ,Y!� *�M��?����>�)����x�!�X+-Q s����Q�NJ�#O�����i������Ę�۲RN�V,���Lq�~03��4���@w�h�@���֍Hn���s�������<�M��B��\���s\\\����~�������f,��(�`s�5���,H��HgD� �b'F�Q$oa�m�3W/˦[x�XC�-�9�F�F� H�͕ˍ��E��X���c%�\K1}R1΅ɒ�hڋks�q' ު,��ƛFc0�D9�o\b�ٝ�̈3�*�|�. �%M���[i�q�ۛM*R�WAC�����]^d�����ժ8� a�r1p�x/b�u�[i�ݸ���c�r.�n&��&�9 �6=����]Y��´�����9I��y�c۽͈N��T�b67V�*T�!�Y��6a}Cce��Ѣ���*tES�mC����m�tE. *L�D����.�8�|���Cc`ı�F$Y1Dt�,����Ѡ��+��AD���!m���,��{l�z�j��_4�+�p�2 �g��Э�|� M036p�������1X��DT���م�;�0}a��s�Ȍ�87{A�2���Р'�`]����yk��0Kjr�D+fh�5n��j�ς �!G��@5�Q��D�V���<��_$���NeW̥m�~����h(��JӦ� �&�CV2v(V<�@kJ�9jo-��ˈ)U��0�u���auN"$����2w�A���ά5�)��B*�5�N�Ţ֙���ki%n�� Àn'�C���X+��se�-�38K\��̝'ƣ̿�<��V3B���~4���(9� Ӧ� J%�[2�^���y�p3sK� ��P��7\�l2����G�G� v��*�\�� ;s-�����(���mil���V꼸)��p#��`�$y��EM�����;Kti�_z̃>�U�`����eo�RJ �פ>[�^����̶^���lnE���P�Q���!)�lT�= +�Tl�a�(���7�\��f�̬�+|�b(V���8OD������ <=�}��&8��̰�bf4w�h�q*� �N�0�*!�L��q�L'aF&�Ɲ8>���NϟҾ�W\��Q���p7K�;���/��N9���l�i� t��J l�5@��9ɼ�xP�t�"������H�Z�$K���N��hL��Qvj���a�I��r�xo���� �/9a S�E��M��D�rd�e-Q�\�c�E�1gy��bK�\ԮA^|H�/\�p�1XCK��t#�Э5l�Eêxݢ� �^1k�F�n�fD�IWV��� �֬ǜ0Y�h�;co�B�� �H���[Is��㙻��X���h s|��a��Z��4��x�}�M���HxCj� �=qM< 5�.ၥmS�4��:ؙ��Ll� �,Go�J�~��sqؙ���1�bnˆ�!�w���s��-V��*�0��ʏ����~�s��_�M�4��_����+��|��EzǪ��L�w�^_5e����_}��o��oH)=?�f���s ���PQ暈T��w� 9y�k�f�\������+����;���/>��O���+o��ƻ��}z�?�C?��K/յ������mQ���+q���JRc��������)������ �AG�N�Ez���`K���8�j�a����!�=�� ���M��;�]�w��ȴ�oӸ�)cy�<���h�R�(�Ex�k-�4wd����]�3�c+SkQ��sl!u�>���C��gnK1�!��+(2�*�T=*G�'��i$B&�p�w���p����Јl���҈�1,�.��*i+��P�n�\9����S�4���f���6A�U� +���V�A�䦜�.�r�WҲ�粅E�,8�V�:؈}�-<����X�z��2W p{Ґ�;pj���a�5SԬC+i/����R�XI��*�F�@����G�]kO�܆���s?�#�s�̓��י[�@���f��� 8o� mQ����`@cD 3��{�&�%fhM9��t\¹|CiCa<����n�&3C����6{�>�@OXk�`�H���s���+�T}0�|n������>��������N��j���������ԧ>u ����ݲ~N�?">��O��|N��s���8�r�?����4�w��z"��z�?�����n�'*�ǨƳ���_~�C�лk��^m���������~��}�i������SU��2 iҰc����۾�ۣ �4e��=��r����-� b (Nk�M�lMn����,���N�J�i����� ֐���mRת�P��4'v�+g.nWjw~�-�I���o������&� OɁ��S23�T�����~4m{ڣ��|����������K�_l���`kd��ۜG;���M�m��es��!3Y�F\�����Q# �`,��ҹ���e����� ���ɐx�WH����0�������9e��,YE�<�`��k����k�e����gf&)n�" ��ZE�!=a�w���1����J#�����Xg[7��i;�ž$M �h=�D���<1�=j0c2�a���H1Wu����1q�'��u`m̍Y0'zq"��}XQ� �k�b)s)��[)-�;:��R ��ӔH �0т(Y�h`�%W����i� d�p�WC�b �s�]e��'m� n�� ��if�*f� �T���I}!`/\�23b>������ � �fjWT�e��B.\�c�p .Q6ö�cRj ��st).�K�L1L �x$�I���iZ��k�7����f�:gN��]������"�&��K�^,�}���Z,�%��F��P�F:Pz�ȈH���CK؈5e�A�\�Ě�x,��L+� P� �̖��bsp�5�O�f�3�2�`&\6"99��@\oݱ�S;j5������k���$��s�t�E@����X��E\J�1�Tl��:e#;�p6�M��e����5:#�Anx�Ŕߨ�iQ|�q'"���IQ�s��1�mjU��֢sZ Y�6�K����f���"Ͱ��A ���� �]y��o�,�/�����Hw�+��s�_!��F��K=j�ޘ�F�\Y�"�t����xQ\�7 b'Ud������궝�}��s��s}콏m���FQ� A ���[b �! K��D���ۛ l�BB�K�V�1�"Bk�((�H�VTT�*U±}������s<Ͽ�]��I ���k�#-�k��u�;�xǘ����߿�|X*g��L+��[80���� v0�F4���h�sjx���^��l�0���p�,*@H'�$7�E�XK��.]W�7�w��[�M)��`0͌��*4�^�( ��X�O̞z���w (�:#`ob/] .�1�&�U[g�� Sޘߊ ~�����By���2@o�.KfpO2�NCK�R�M�r��̒�15����I��в��Z�+�����?��O?�y ��a�JQ���}�gf����G?�����������N��gN����o��Z1�:����m|�3���?��/�׷J�o�y����{��{۷���/;�W���ge�-����������'?��ഉ4M��?���ԧJ)�����|�Yqs��8i��v�{J�W�����+֩��\@O��������$k��64� rJa,җ��l�U �a�C�Z�6�.�3xKc\u�ֻ�1k��yt�޲I�{iC�'8ो}��������;W,�n�0Nu��I��Z|��&�77�0�o~������W>������寏Y��̣�r��rf�x� ��pw-��j�TK ��w���Z��g9br[�?�.��L�N�C�3���i��f�l�H�k�2[R�0rk荥t0����|�?#Z��Fc!N�ҳ�;�b��d�9��O��s43�]�h�'r�oL��>#�Xb�ٲp%�%K3����E^U_Xn�`�8�O���'�1klaÅ�� W�щ��������b'm�[�`�E\��0yG\BʮM���КroV�������|g��8��M���Ej�cc,捄���mJ��)N���������䄍�>�f�9�Φ�OAѸ.�D�`�Qe�S�!��f�� :T�B�q�hg�k /��R�,m���� �ƨ�K��t��=pp�}19� ^���3�2;p|��T�溊�Fх��]�}"�µN� �J8\�^S�xB\���X2Ǟsy��9j�.�O�̵O�:�#�S�� =��C� Z�XMt����K� � 3���87.��.����w䡶��l��p�.�l�:��� ��.Y������*ى��i�-�Pv����n� �����AH�?/2nn �er��N�R'��E��̥6we��5֣�[؀�G{Za�,MGi�f��Եe'.�E#�ÅaN.�e�F] ��V�Ѐ�E2�UK�F��fkx����„���L��'�b 2b�\f\�7n]'� k��9��[q��9a+T�7�oRF\KӐ�����H� (��� ��E�Y���*胾���{re�dr��*i`���%��v�z�����ØL3�0�����y���;8�X�� �ɘ9X.� .tb�]�Z��V�L�cC���6����VMd��JC�c �#HO�q�ha�R3>a;�A�swWK 1y'�eʃ꺆K�0z�x���x4Y��W]w���q/Rڈ�k�v�Z����'�,�p��X-:Z!�ʙ�F�6�WƠ֝�D ���q�����n�LU�Y�|&��N�6�h�Œ��f� �OJ�a�g���yMy��=�+X��YkS�E�j]��l�zp�p=k�@+� �^0ڹ�턀��N���+�1�`.����z_R�D����^\#'GX��YR�NMȦ#/�*=��ԛð�ya&k)�Y�ݦ�V�4��Z|���67�D��%����<�T��q�n o��Mr���5�҅bm����ݬL�W[Ol�yoV�ӿTb�ʙ۵���6V���WT,�B �t��e�����`2��`��;�됄�=.�v0�θ7�(/�ܸ�b��؄M�]��A�qt�ʐu�u�(d��p���� ��,D2)� )��e�'���L��@�k����b>Z�0��� h�����X�j����&�>�A~�w}ק>������J��+��9���=:�����>�-��-/_�l�f��ZOF)��e����������ݯ��W,>�63����ЇKh_&p���9��������'>�x�oM�~e�[�@k5Ÿ�����g?��o�������?��������|��j�Շ����F���66����_�����3��&�\����6pg����n�9C��0vbU�$�4KMLGs��6�Ğ�k���r�y�~R�& �D� &���K3O�Ϻٸ�������~�r��i�Y?��綒W�4_#�as�X70m�ڏ}�G��z���;S=�*���m--Sѡ�.i��u���kove�P�YU�Dx2�g���-�ȷ�!��\ˁג� �"8 ���bR�����!��A1E���X�#L�'��|nj��i� ����@� �8V��-ٝ�F�%=����r�!A������4�^U,��+�ױKg�W�� �c��$�T�uc�jZ�<�/��Co�� 5���R13�$^b7�NVJN�ϰ5����Eb���� Lu05 ��V�c�,d+ TɆ�_����ɴ���L�F�c�$HH�#6��WM IDAT�*�5ǔ�8��Z�Z`���R���ZJ� �v�G���ne��)��YO6�gV�p�evE+i�^�%��wJK���@^��J�Д��l�-�4]t�Cp��3��:X9�y8�y�$ �IR`4.�:8��dI�\�׌%k���< X������祌���i����]d��� �0sl�܊7�]j�*YL �R,�s冱��P�f�`��dI=�{�T�$�@�y*� ԓ���,���q��}*��氄+� �f�ضb�Α���"�?�Su02�yg1�V:���rR9�P`�=�F�N6Gsa�h�3m� �3�4��X������`Wh�Z����[�9���z�5|i�%�ӣ�y�-a�l���y�j]y%��!�^�k q�s��{)�d2퓗pt��ܛ?��ʲ�>�,� ;��a 3… 9g����a�f�m�/�=2q�:H=S�R�^� ���F��;�ӷpc�R�%�Q<���j 4�JIGط��1�F8$����u��hF&'�>Y�Sx7�[~Iغ�j�c����,X =��dii�m#�6��J�N�s,��ʺ0�Cf��\Q�`O`�;9Abs� �`k��ѹ5a�K�d�Z�r�Sc )��`�\�xg��d�ܨ�Qժ�s8�Ҳ��֞�%�hm4������3K���A�2Զڝd��H�8dl`��Pk�����YbS{�"�{?דږ���r'l���� 4b�l�,�>9���'��r.2�dl�M�<� �~�̜z����V�`V5Ңz�c����'q�M(�#���0V�[�%q g@S=��'�e\� � tK�p�̚�������3�����lLQ5�fG�舚�5P��h�F �4 ��bŽ��bW-�3w�l�V&�&#Y��(�����ֿ�߾���MA��o���_���6ɣ�Ҳ.��)���W&j7�M��H������}�c����Ux }g1��W3���>�J��j��c]�~�noo[���f��|z������_���Ί/[=^-#o���[��j���'?�����J���������^u�}���rȘlR�����������.oj�i �}��f��^^Kaq��ẕI:���s1W�5]]���A� ��%�ae>���a�θI����5Z���'�NYj�������o��}�,���l�nA%���33�"�}-��(^Iq�g6��/?�w?�7��o��o|: q+{���m T��tkl�.����cZ�tfGco���ATddL�=�"�~��k:$� L�j._Y��%�e�F�½ʮu�{1�%�(���T�B 3)w��!��Q8���[�a�B*O[�V<�+}�I'3���{؆�{����p�� �D g��%em1(+L���Vy̬ޒlϝO��+��}#8kԧ����ߘ��-vgy���,��-��|viZ��<�B'����{�p6ŏ�6#e��e � E���]���d���VhH9��u�f!;{�4���?;�O�|�2-sx2F���M��,�wТGtJ��,Z���z� ��Y�3QlJ�R�F�IJa%]��Y�%�m��%�KH>{H��gӏFB�Y��tUY�<� f �,K�QM1�u�"�Y0@U��K��N�����']�J�`Fk�?`l4�e��$�yȆB�fo���ywҁ� ����}�)4����47�0���D� �4�O��Ҵ��B�,��HzH�K�͞;�"r�,R��A'�l%�=L���̞6�2r ����*��|�N��)2%\�� �G��`��CpۑA�X�wh)Fhu���pt 1q&h.3� ��;�=�,{i-[�s�tNP��;���B� &S��v�|+��R�2�\-'K��Jva�M��xg6�:H�Z�d��� L��Mp#;�]�2�`VpArtNVҳ���ڸ� +&�&x���A�� �w�̈��b��;C�N�"g0/d�=�g�K{ ذ�ڪk�kc>Cs��i9�h�a�-�Z<���j��v� >xΤ��7���7�N:�6���[+V�A��19Z\�b b�;��s�g�͊,�ɩ��'cW�V���19������]2�F���� F�rV9Y4�u���ö�F�B��M���i!+f�Y�ō�*�X9����=����o��d�Ywovcڊ@�69��|���ɸ5ݤ�;T A`�Nz��6C�->�"rg�� � x�]�ڔ� �����NRr�������9���[I.��-��{��`�.�%�ʐ�� AYOv��,��˜���ɴ���n�֨�V�i����=S�2'iL{*�9���:c��p7�7���5��=�)�55'���MB�i:�ƅ�Yڻ�\x\�� �%�N�T����`��ZS����˺�M��|�/��T��q{�8�����4�WƲ�ָ�� ���X$s����/� j�-�Q^x>ϼ?����q�ۂ��J�[��������߽��~4Z�R�#����D�gx�v>�����������=���,[k;�&�e��گ�����دx��Y�'�'��G���@��}���V��/��k���(��?9�_%a����j�^�x����xV�-�->���'>����ڧ���'��0̝�~��g���9�mU�n�����a>=?�{�cG,đ܋�r�8찗؛��m��X�_J�^�E=y 3��م�3�u��`�Z����4��&���qY[�`��ž2�S|�7��������)j_�,�� �2}3a[f��'_Kg�Z(�S��ޱ��{����m{�^����S�s�>�L;˚`�ֆ� YV�s�Uۃ�{ɡ6��1�f���Ø�����_(�$�%�#�͞9��8��4* ��ቅG�{��i �ĜX��'�aAO7�F�=�؇F�jY|dtV�{ٞ�f朔7�s�y1/L��9eI���۳�UVфFؓ5�Kl�O&Jz����mQX& l.�ؽ'ֽ��=�X��Y��+�0��<��+�� t����Ɂ�$=�ƴ �Q��� z�Љ<�!g5���FJ��1w[��Ų�1���TF��KT��c�2�{�c��ь��B���:���J7LY����`} �| >s�5 �3)I�0���Y�P� 9֌u#�潲s��h�Ɂ<'$ �����$�rF̱�l�l��~T��l���� �!���A�g��c�S�-���م�=�9]t�Q�"���`���J��H�K��r�r�x�4��ȳ�C�E��7��p�Q=�.��)5 :'����Q+�Y�}�X��B'� *���[!���:��; pJ���2�Pɀ�٦�Ȋ �cV0�"8��#9e ��x7Sֹ{MѤ��x 1��5Z�v�Qכ�?�V�̤ރ$X\1�ө ͌�1�V��u�ɝ�j\�� ֙�$͜y��yL�u ��V��۴���+��Ja޳�:�xl�1��{Q&Fa=qi�N����7� �z�K���!#�7f��U�pQ���2"wb o� ���0��c�6V�R"�F���ͤn�S����d��qqT�����I������\�KbmVa'n�| N�\\�S�6���B �K�e��*�ؗҿ v��Z�M��6��)�&���t��)n���a�Ϭ�)�Ra��<��ۍ�6)�T��%�Q:� 0T�hpk��`��(�� �ɩrLfh-��:7o��F���8������-���L��7��'[��e��s�7���`��a�̏�H��N��5c�RlᄛE��/�A)1R����NaT�Ԩ��`"�Q"g�a)e�4e�&�'Tl��.��Of`�����ң��'[���%��A$�ʃ|'���LbN��IDR�#y;�e�霾~�[���p�������*N�A�c�#��/2�7�C�.M�b~�v�܊�T�]c�lQ�H�wF)LaVMD����u�Ar�c���{���8�����ۘ&1�MH#�r�ى+L�)�/���*b�=�(�u��xI7�l҅t }��l�%J��t�~i�D��Q��xd�T��4�Ӿ�``����@y'��M�xL�����t��ު4Q����������\�V����W�+;�_��Q)�������7}�7=��4�+:�s����s���>��&�>J���=Q�n�̣�������-����i���ߣR�h���R��C�з�����������������xAk����'�7�U���۳�������>��|������#����������^�ܗ���_�����U���]/DZ�8۝�D�)5U�5���i��ϓ��)�N�*K���d��N�g.������ݪ�(ߡ���S�ž��|F�RJ7�U�6 �PP�C�c���}�o��o?}�t�a����g ��w1�$_k��c��'ɵ֋XL���� ������������7�eӳ�N �K�1���)R���٦�'4+<�>�t<��ܻ�K/�vU#������]̳^:���AF��2���Ǎ�d[+/���x͸"�d-zR# D��RGE�.c�9T�div�<��5H$��O���>����i+��4Q�f�qj>/k����.�d���5�]v1�����S�bGY��{]jzO�?�ֵ2Jw��y�:��Q�`Fw;�n�|3�Qٓ#��d'�'����(Ue��EW�!&������Z�>����M��Lk넞)�hƩ����\�C���q��!��{�������v��ы�a�m�}ow��.�z4'D� q:ҙ�g T)d�]ڎQ�D1Oͫ�3�V'�`%�%��EⰏ�)�E;Ȋ9����+�� j7F��*~I�[���Od7�����(����Xd:V{]���.�L�Cw��q";�5S'���6��:�Sw��p3�� ��&q�nJ��i'�y��U�Cp[�hvau��`I)%J���`���F�)Lh��JsX�U�>m�,bUYT;��-v��VV�`IK��N��l�أ�R�_�G^��AQv�E�)s/�>��{�Y�z6�y�Gq��, �2��:�z2���y����L{u#���r^'�~Kyq��̵�-��뚮Ѝ}�O��j�ea�B���6C�Ɖ}�f�Hdac�N�J���jl`�q/��cӒ�hn�Tn�O��ܠ΍� 3�2j�$Fr̲In�=�{_�+S9R`E��KaS�-~䴇��-�$J�f��B�Y6�G���r(�� ���{�M�Ў���P�fG33Y*d.�z�2��:��M7 �E����%�Q���� ԛ��:�ue*�/�n��O�݅��Nv7�����BdZ�{9���Mrg�U>Y �~�$�,AL( ��JW�I�Ԑ-�%���I�lᥕi ���7���A�e��;��u�J>#N�24@G�*�RK�� �ȅ�����_�O6�dY��Ε���M_TLt�b#y��l����ܐ$2��߅�y� .�%\�&�.�'� wf��ҝ�3٥�L$L��C2լ��WE��_��8}�t�����gUz�`M�]�x Kc[��Ec��¬�N�8�v���ܓ-�$�+'c�s��P���N���^l,���\T���&K�LM�m)N��Ho5�%�,� �|^y�5ۙ����\��5���,��0��dyJ��� r�.ʶ� ��i ����q�x��tN��M��le2�&xIl)�!Z�v�j�����p�!9ʾ_�^�R��Rg�@)&Y�hRwG,ܷ� �K�e&)$�Ýz{#�8�0��q=������&�a{|T��ރ)Te �R8���� ����lv�N&�~׳��E�EX�߁KGٮpLV�;gY|2'��Q!������ �Q��;���W���~R:f��_�^���E�˨�m!������`����R�5a} �h�vYo�g���d;���H���9��F:�U�� s��β�j�p3F�IqRL)%+��np.�N"�.��X�>��2��;����y͹�M�Ў8I���,3,eb"�C��V�f�{�9�!mA� �����[��ԫj:7��`�Y&�|2�H�# ;K��?�t T3L��W�˥t�0w�]�E��-�YًC2�L��h�C#�R�S�.� �`�V��rN��O&���@��:��zgu��$��-�5�)�����Q��Uɤ���H1��Q|g���7��H�ɱ�3�I�ڑhT��1�3a��j �I=9��0��LJ��u�� @=��3S �}ҝkZi�f�����U���r0P�d�y89G�FMN��`#B�bA�0���N�N"���V>'��/3��=�Im���`F�C=���G�"�zD ��5�26�[ؓ������O��ԋ�s��w�A;���E/�� �1�-��[�X�X�Zy��>��s«�t�F�7��pH�a�-L��Q K ��0�)�����#�ep����1m��[s�o06�#���j Q+;����I�'c�n*�����L����=�� ��� ϖ1볢yh�-M �E;�vd7��a���!|rJ�ƙ|���끦I&�B#�RGR.o�d8:�m �e��IVXgV`�H8�=y F�B�d��Y����J���P��� 6� �x)Z�&��r�6�{8H{&M̰��;i+���� �L�bg��4�%6XYY����[��1��j��18'Ya� ��O�›��p@��ZՂ� T�orf�2k�V��,������w�}Ωs�EEl�i��lbzFE�t&f�bm�D�F���`����1:�;�b4�ǟ��1Q�5�8!��&f�*i����ϵ���g���}NT�Uu�)ޕM���k=��<�}��%��Zyg�q v��Eq�^̰�ƪ'����­�4��I;±ڇ+�f�3H�{pA��~�p�t��P��:U�{������^¥ (��@'�0�WT�* �����J��h3�c�E��#���V(�y�/��G��f�; ̠����!<"�c#�&H(+X`-��� [��'�,�Ch��B�c:�}Q��.����-�A;��<�@Sl�5"����R�����Ů��G�\j�[�e� Z�"�[l��)1G��L�j@�6�pP����Pc�dV����tY�����B����Lim9ɦ��e��63����9t���7�g�y9VR`g�]��09n�����2�;�5k.��  V�h]}q�Z!�< k���KY4)��k�ZJ�e=W( .Y���K�0'�bi�l:�拞�H�0���n�$M�$Yg��X���:�y�Rta��T-S��������9�A� ��\o�m�l���L���� �ʫ`���:*�E��yC�ަ���y3��*�@�*�m��#�!U�\�CsK�oɖ��q �A����L��HXc��8l?騪�@=չ�Y�������T椆|�k+�>:t����Dw����_V�ނZ�2�{$�L���`L�3n��E�l:�0��ኸH� ,I�vH��Yia�գU��s=+ة�,��h���"5�J� w�Tkz2tF(v ;p���ĵ'�7.�v���q �7- ��nje� %��묥��u֊6���01n��Y�%Zk�0[�T%P���sJ63��FX��������-�"+E%��v������9im����\�p)�̓����b�,��dXuD8iꡑ9Uq&0Xb�0GfMC[80�B��=r����˪����H�����ߐ��}�ap�/�,�bjK /}� ��i-ܴn���9)U���/|�G>�z� �lȠo:�V���;�|���_gwww{�{��[Ο?����}�kG7Λ ������ᓟ��_��QI�x�<�M`�B unVI���_��_}�#�鴱��Fk���Zi��3{�[�Z�s��z���3VWl�47��`�U__�p�W~�W��:2SJ]����w��SJ�z׻���1����?�`N)����?���x�=��E�]1�䰄�pв��JU���1���d�̬��Q�X�얢��ST�F]p��5њuf���d�\f���Ί����=u�3{����=��o�������j\aq�,�\�&5���-/�>���������@^��\�x6�;�\ȅ5��ʀ)��V�9섊bn��͖1@ �Gu`38����y�A t �`�����L���Ң��l�Tdq�X�\�! 217:z�劖K�X�L�@�ӟ��b�Q T�X�*�~�"h��!���M�T�L�y�d�#��t��3�Z(��fK�b��!�Ȳ�b�AU,��[w����@�s�7���k\���Z�{pN: KL�P l�j���Z#�ct�Q7�A{� ��/]���9�y���i�h�d��~���TnHNu[U���a���@��^V��P�� Khz��^�'�����X���l�����*4��23"˓�4�.W�j,l� ŭ@�R� ���~�NPSՑP"�2��`�0��z�o2ǎ�%�Q���lfk��iHY�WDo���Gϗ0��het2��X�c�Gg�����W٨pŠ�`G�~"̚�i0��tN�+c&��4[**-,����Ң��ʵ � ��.��C�q$�����T�)Vh&Z��X��|���s,�C/ZV7U��A��9ؑ��EQk�3uFgZ;%���� �k*d�-E�K8�^Xc3���S�B����*��2�-� ���pfӡsgm�tVQ�NfFr�BnjD�%� �IK,U�teE���RzuD- ����J���j�!�K��s��28��X�J �]q�b����f$�%�8.:�;F-�Mk1�����M��#d�X�ָ��EB�h�WW���cl��VJUf7�k��B�{���=q�� 2����V�X-�؇����d%X�U*~��gJ MЮz(o�f��V$����}���d,�;�v��(�ڊ�+&89,��$�Z߲�v��)VK"�Y'�`f\TD����R��̍5�y8U��z�D��h)��.9G�D1��td~�؇5^"E�1���ޱq����In����~��V��p�*�~��W�������{/֦#q{�{��F�]��؏��;��O��7㸺 Ȼ���_��� �-R-�=��=|�?�.�I�麖E�zVr֣�2+XG�� E�P6ˣ<� ` J ��Y ��ݍ&��i!���hC�+���4�򵻧���Lefv�6�(� kh�Bjak'Ɠ$���/ ��8�Šo;����H2� W��9��Tn �&j��}ʾ�"E���ܟ���*q :_� S��$�5 Y��U��.T}����I 3���5�)1����g������(��+67V�(b� �qBL�%�|�o�>C� �� �YӇ n�)H ��$*����)�0i��!޸&�����p^��+�NA���튱̬����%�c��ua�-�2 ۺ!���Э}]��Q��%Qѱ��֬SUӎ�*�"XQ�A� �8~j$l �Y�'T�n�' ,*&kE[���aS���cX�pR���*�_�V�$��/?N�C �`n\q���:6]ǰ�8v2�5���J}ڣ%���A��c`���D7(G��cq��dNJR� ��u�ŋ�fJs|f�4Y�<󘉥hkYd�s1 v!���ZX���S� ��A�O$�Uo��� 2��tX<�,�2D*P J��V�x\q��P3��ڵ,�F���J�G ��$ N"9����^�Zu����Z �F�SX�4S]�%�V��7� �}KV�M��a�R�5TJV+Yؠ s#+9���R���[��60OۀI;h�[sk�\�n��$&�M�t/h�� ��b% �w�t�`,�k�NV܊[��,��cb���Z��G����zXf�@զ�>��� 4�#M���#4#Z*�Z�f���D�d�]ۉClP`-,���V|���������j�c&�В�4}���a��aѕ�I����vdц��Ǻ�u��phZÁ��Kɭ6ml�-QK"�ʈË���ec�G�>�^��I 6������S��ǹM?��A0�Fs����O�۩Q���+lLֈ��7B���?���G��m�*Nn�>����W�JM��maQK�� ��禤~�-a-�m#�-`�,��->4��BR�<�� �-�)C��LޛD�:�uc]7��l�4��D��I���D?��?��7�a�؞o��k��#�'~�'~�~���o���9�*V{�}�U���x�"��mF�I?��??B��E�����5����7��E/zQ���ѵӷ!��j��v�r:�����/��/<��C��o�qxm*�7~�7���1��������Ǜ��Ͽ�-����qo,,��W�-����h%-�����v�I��כ�Q$S�.�C�`&��R������V&p����]�z�`j��{^�w�g�D��d�f/���u]�4ۮ�'��G����PѤ p�������ÿ���z�ݻ� h�)����o<J�ɲ�6��j��C���TL�*��I�"I�Cq�����X�I��^�NJKץ�4ˡ�}=H�љe��� (>�+m3�p �?��8������,�F�Kg�3)Ηf�kX���l� J X��A~ g��R�SY5B Y��09(�jiCemW!��� /!�E0H�y�� ���|fes|I�z�� Re�@U�� 8�ɪ*~��[�@��25�)ʲ�v4�n�"e)',�u��Z�ei-[��<�l�>KE��%��k%��q�#�21�؁�b�L�"Ν��Z��^�f�����)��T�� ��C�z�h�ә�w]е�L���=��bd7�հwPx@Y�k7 U�joﲚZ �s-<�Dc�-V���#=s�`W�p;\��+^��C���"e�0��MDž�4�μZ�@�,����Yk,�h�����5�ͥ��Z�E���1��]�� ���xki?��e�3^Vp��@1+���UY����`kl�ֲ^2[}k�h`"?V�c}"%z��M��*�#d=Ř\u]*kWKHgX:-ބ���.5�6a�\MѴ�,9c�e7�a�P�h��KVj�0_ ��b.)L8Zas��Yv���0Kud��L�3c1~O�P�L���J�d�c�r,�Nq;}���k"��Z"BӨlz�b,Ï�C���aҢh YR&�7$�ˣZlnV+l�Z±�as���"bf�P�:Jk�+�I�r�+ -�&Ʈ,��(���-�k�a�E���bCz�z�jTvڿ�ȅ�'��XH��;�����Q�%}ϱH��܋&���}�{���4z���B�&�]���BK� ����@�Y��Ϫ�5��s��m�M�8�D1�g� 7�:g�� �U��[�&�j��q=�F�6@z�x/��W%N�N�@���t*�8U�q6�Hü#c���tz�H��ө�n=JJ�����)���!y���� ��'�Qjҵg�R� �?|t:�46�Z�*��V.���)�*�ou��c��ύt<��p�Z�?2F��3��U�3�������z�5p����|��0#D�������}�M=��}�������:��T�k3���u�w�}�����PE�y�{�[ߺ��֎�7�e4��!h���7k8z��^w�ilV���V���������y�s�ʞmG?�����g����XM���EOE)���D�v�11�kS=m��W�EJ�PPN�#0�Jc���H�T(}1���WƝ���������Dr�Z,�!m���L&���Wժ�y�K>����ԏۙݽ菾뻾�����Mi˄��87���*�zD+:��Z+�>�����(1V���wO��dzј�SG&֦yp��tM�RU��uPT�-ޙ����RU���� QՔax �뇎�q��<�O�ꉶO��z��,Ĭp�\�V��j�0�c�[�YZ�7� +�. �*�]��W�&��E֨'�S��z��%���HYj����i�9х�0��xkt*. n�HA� V��R6�8�z1}m��z���;R���c��+� �e[VѤ�+���n$�ӭ2 ��kF#�� �XSbI����.��w�� �gqbDR���r�:�k�Oi2Q"���RU��ȂU� h ���n��}�VN �T���DS(�|�JT���]L����y� U�� &��X�u J��T�3�B:v�Ƭ'`�_5���)��6 %�#��5tu+���U�znAI�uδDs�3a�U�#�R떥�%i ��R���-H�\��%m�.tp�p�� �V�W��d�{��+5�r�Z���z���+9&҉D��$o��aCa�6T�4h�gL�(��ܨ뵋�N���j�R0�ʹI���b�:���P�Y�5��zV�n�TP�ǀ���>WŜD�PU�s��cA��c1�^��7��U��Y��e����Ae�b Ԫ��AS3F*�`N�p9��leV��}�!*����,V1n�\C34�X��X�FT|�"�n}�r3��>���4����ԭ�^e{��'���&� IDAT�]�^#T�1� �ɮ��G.���E��p�v�����SM8=;���ԯ[���WF�!��󄌲��S"h +��V�N*���(�!�p���� ��5�X��U�������V�l�&Ro5E ��5�d��ۓ�p|�kuo��!u�6he$�k#�a�Qme�����͝�i��8�鿛N�ԽP.X_��7:]p��ô���K^V�o춬�<٘<�x��s0m���᠁x1PJ��T�V4��v��`��Wik��R<�3��ʵ~N(Ajx6�!nה_� U�Y�K���������o�f6�����{�+_�=�� ��d���?��>� �k� Hh}<כ���_��_�DO�b�v�����^�������'�Ї^�Wl;� {E� ^���|�37]����w��]c�k�)��}=���~��~�c�T��5��M�l�6��/zы>�я�z��Ț�<��z�oD������_�򃃃��v՘*k Hh����9�<�1��e��~��z��SO�F��~B> ����E�&�����]�yا��">��.��SvЭ�׸]h�����,1�E1�;�l��9$,��p�ULyC�K�w��9�?K� _ �a��y0i�H���${��;���v�x���c4ήpw�e�-���I�1M�$3��JN���`� ���������am(�U�!�T���X+W���i��H=p���M��я�;�:̶H�f�%�k��w�}��y��j�~�w���A�j�q����-w�}�M�����_��My�-^�6� ������}��Wϊ]ץ��#R�P��o/}�K�����… �hd�������[�/y�K������/�b���1?��=�����%EakU"W� r�6O���?�w�լ��V���B�y�O^ گ��j�������V- J���WVT���Ip�,��o�"UE���0�R5�2:�����^��,`��Tѕ�*�tI�QW�=J(z���8��"> �b �`����s��|��q}%��O�.b���p��n�~�Ɠ�����M�f�0���4�ۖq\�7��|��� ����׼�5�����V�����t�…��ɟ����r����������k������˿��O}����u���Q�{�…��������۶u���e�ha{m��3�7��׾������[ �6�N�XO��)N�|���I��m ���ŁGK��TB��]Jv1�O3��A�:�C���0c��}NsD��I3Ok���WHM������VU� 7a�wϰ�[M&�?0.��)q� �P�b��a���ޙ _lX/�� �֧_;J�&��O��e4�Sr�&{�"z=��aj�v�񃔮���-��bT*u?�%�v"9�K"٬�J���Zʁ:l�������K�3��z�Q"�S}�Q��Q��{sʀ�UsG���9�s��d�@3�=q�7`Oe?m�=��0�+E��2�����e�_�[I��If�bP�f���uf�Ɓsh�`�xRv��R������ϊ��<G� o��Z�u�%��ۓ����]�Xi�k|A:N~�lyhm�'9@T��H��C�"�_��p;���� M����=5��꽍����][����ku%�n�������@�Mg�Z���W�jgggM����v7M�O|� ��m_o�G�mۈ�L&�x�;����}�;�9v�3I8u{mf %��O��M����?��Q�b;8�j�Q��v�g>�_��_�N���F��1�������w�ygDL���6������|��zB��i]��s�=��s�(L7��<=���F����(�0%���^��<���`5���RGt+��-CE�r���E���-eEY�uQ��"���Flu�C����/�E�xP:�X6:|�D ���le��H>3[T�?#E�& ��ѧȽ�ր�C��:��~��V]��I�kd}�>?"���f���������te]��IY�r&"�2؁�ק_��eY�Ȕ��z�:.<���QQ�ZXJ�+�2:�X�R� �����n^5��Ii�EN�UM/Cg�6��W�Ri7�L �zꌜ>e?h�^�k4G�p�b��|�ޥ�G�Q+�[%�Ě��Ժ��4�2���̠f:1GW���� ="�Ċ��z�JRK�I��Uu�~�*yL�$�n�zZC"��� ���`Yڙ�`V;�l�m.e�u���SM� ��Cb��K��u�o�ຯU�nf�~��GXm�_��Uz�$�����?�#?2 ����M��6�����&Is;ޮ�;N�Sw��߿��{Gt�f���<�9ϩH�8n�=����!�y�{��}���D�ݚݜ�f�'�4M�u��ym�j哙���oﺮm۔Ҧ��uo�q(���������Q��"�9�����^��5z!�|9�ۿ��?�C?T�W�)�&��N�͕�o���Fш��S�n23{DI�@�PJ��:n[l �#To�z���D� ɉ, U��k[�K���haei��̛�dǮc��Ϊn}(��W$Ϲ�)�J���!N���q��`�z~�~�*�{�E�,�{���uuk��[���8��wd��oڵod�7j'd [�&'�֗�ģ~ �s� �X��cDAkb���f}����'�J�a��N��@:N��t�� ��� e�n��ub�U��2K�Ь���UԯX+"�������*{�,���]M8Ⱦ��0�`�/a_<�|.���Ci��΋S!��i���V�QXɔLd��ʩIa<�jI���� אּ%��:�\gř��'M�u�]�h��v�C�^���m��^T_ٻ�k<�n��k��M����W`�o.1��P��G���v�]���i�w���l�G��m���3?�3fVJ�L&m��^<׋��q���^���__�ѯ��L&��d������1{z�������L&M��g�"���z�N��~��_��l.��&G�����k{}������SJ��[��җ�t u?�4(F�ƀ�)�֋D�_���8&|�j����j�g|�$�M4�Љ�� ^�G̓�xB��JdX�ǮK���G���[�T A(ӑ`�P�d��^0��T��Qr$��g��ct���'4;|�XQ��ro���{%���_Y���i �� �=�h��6��{u��kV�V����,�@� �x?����.\��)��u�ʭ�K�2.9�<�!�t���� ��h+��i�# *�WBc�X��ї��\� U�����KWw�U����7�d\�#��Q�w��Նr*ӓ����h���$��L�?)zrA�XY���*ԫ�)��t#$�S۔�.7�i��N���a+۹����x���~�q<~�|��u}����*O�W�����롑 ��M�wRَ��=�X�R����*'���7�?��U�������L��tZ��dr�]w�z�7W\���O��OG��-��䐐Ҧ6��������9���A��������"��#�����Mo�'��l��5M�zֳ���<�Y�b�3>]X�D4�Mn� �y`{��S��N��Vy��G���a�7>���rHX�`Qi� F�պw܀����|n�]��XZ��Y�������(G�EQV�H��fz�ߐ�Y�s�%�9��� �>�z1}@�b$�?� �rݏL33Kf�1��� 6�o!"������0�R6|a�IDՖ��h�7�ɘ!%�3q&V��r�������UGf�(?���~Jq�{�O�N���K�Gk�)��������`��i�� ֟ʝ�4�axlt��B)d��#�%��M�$t��ɤ�L|ܗ}ه:y�Zl6�/���D�k�R5�F25�'u}Q�����k~.ٮ3�9UO4��{Or?� x�F�{��C!��t�*��[J���M�n]�IױN�V�z{]���m����@m���w�u�w~�w��l��o�C���OO�]wݵI����� ���'6eͷ��/�������=��C��� ;D��y�m���Mo�1��[�g�U;�bX@����ޜ�7����w�ʕx`�)���>����c�ظʌY��&B� ԩ� ����Y�2���;����E���vs��u��^_�eNu ���/�����Dѵ�������������e�^�w�xɏǬ i��`b4X$�+���D���itۼê�:\B�s��7�e_a���N=)���`�y��X]��]'�������o���� Q�n�Xl*Dk��)N�|S'���uR��a�~a����S�E��ψ�(&���B�3��v��R�þ'5%!pL�0��=� �� �Z�40���5�m���$& �2 ���*蝆��F� 4ƴ���, <=7�Q�H��5x㤦��~f%������s��f���T�D\K'��H� ��!kHEtE��V '0�&"i���[�/r���oj�C�H�j�%��4l��wR%JG��˿�˳�U��U'�Wyi�\�+�o�b{Z�B0㚋���"�P�XD���4��כur����Y�DHj�$�Z�#��.E/��h/���,qp��1�@ Z$��~!���l�](��r�9�\ m"��q��]���鿵<��]��E�$=4�����R@5��P���Tk?� / pD(���JK�6�TXs �i�F�C;���zS)�+��j$Bų� �Hr0z�f���8��A���B\�۔-r�$7���[&ܓU���_�+����}�a� g6��R������+� ��i�u9]3�SI&y�ԑ@S���DXEg'�y6�`x��\W�s��H,������������g�v7�-�� 2��@��v��w0G4)T�C�5I=�▴���x/��b�H>��M'x�������m"���$g/son�2?�{�B��8��������/ R'��#���Dx\����y[+��x�ᰥk;��|"�A�C���|gf���D��Y~}������t��^�\kLdչ��4���q���A����J���UP�i�iܴ6�CMRH"%�z�"Q�� �b����$Y����.�&�9�ijp�^��E�(��� �&����ŀ[H������xB�ő��'��T2!�}2�`�/��#Ť�*·[\r�d*Q��V�o��Qé�x��DS�b��e�5�Yɩ�D�- �|R��e��ê2�K�[��FJ�0x��_��TB{BR �X$�ɲFM�b5�՘^�N#��9f�Vw�o� ����(�����o7H:�ڬ�~��>|�p��lk�v�a��Ç�}��_�җ���� �*bPDJ����o���,��7�A�g�O�<�����i�+��u������>����—�2��zr�7���#G�<���W��<���nf��>���#;9���������{��WLxwS�߄4��}=�̦_}�_��_{������}���5�����������}�/��/r�U l����֟���Nt ���+����%�bld�Q�(m�H�5��M���*��T)��/;Za��@�7��\�O��$dϥRA��u�+���ncJ�;���.�"�P�p����-�nc!q����� �*�%�&x �s�� ��_j(��I*�Yp�C ���G����Vx+�`k���/���P^2���h��3��QT�{��:01SFr�Y��|�N�|2��V�*�4�� ��O]���mXc�w0�?����+Ζ�刘��G`�ň9Ϯ�oz:R�0��O6����8�^ϥ=]fHB)d��-��%�P�@����R�ā9�DL 6�ޜ2�f�6�u;�8�]}�8_xV�_ Ncj t���`���q�!�Mo�] ���[s)!�P��O���5y�����{]� ���I�C�}��_Aa7\*��ރ���#�� IDAT�xdKNaV��������5ȉv�.nW2F�D���a�s�A��^b��Ri�,r)�(�(xeB4�z��&Z�q���.F��C����KX9�sZ�v�p���@�, \4œ�hv�%M ��,4�j�k�KȐ~Źvc�SbO�6�50� )�1����q![͜���$���"�^]��}���f�<#������Ѿͬ������P�~���x<���[��*��n�q��ɟ����B����ƒT�s���� p���_��_��vޘJM�T�r���|����3�v8���Jf�H���C�S�*���֔�#��������,�[]���n���A�N�?��?X]]��-%۳3�����+��^U��_��T���\,����DtD���GJ����m�_�X Tq��r�N�CS n/�o񍳿lO�(yy���N!��Z/&2�4�:Jf� V��� �ѕ�� ]ktɄ;�A_-'���3�w� �;�+�d'$���oet���<#��VȤN̈́�R�&��������3�@�"C �4�”��z��B�J�jE���Y��V�U�D�BJq� �1Uq�hG��j�a tJe5�e|�Ej!V��U�h"�HCD��ZT��YA�T�:ZҲ9�fO���W0I����Uu�p�::��Z�I����z�ک�&B0DD"kUmh�f��}�]��� ˔ �� �+pW�V����J��@/�"�N������ |ҙ�8$lX<=\�K�X�E��Cz�R�ãj{b�Z� �IVI�$�=�]�,����ò��Њ�3Y=!U�kWeZ�K�q9&���� EoZL'DJ�S$�x���"�:Y'���~��h���^YD���I��i���|o�,8V��n�f"�X� ��u�= drTY��]v�K�3�GRAB*f��2)2��zIcO��ʬ j�&�&��t }��c�+�����l���������\��N=����w�$WRw䘩{��n�x�aϢ0��xWjX��������b#Kh^ ���H��w�� :�P�dlR�&_ъ���֮-B/�ړG�H񪧆M�R��정���1g�图��Um����E���~0��5���3R&�*����/�%W(څ��3�LN��TOhq�d�_!�a�n�5ɮ�J��$���c����׀oH���"��}�{���`��t�FV0�n� FD������,��e����/n��ۭ�}������{cq��9��fO����ե_����ް��ҙJ��p���-��r�7l��?����֭��w�w�|��Y�\�d�D��:�LI���ٔS�[o��7�7��RDԤ���v{�-3_��p���|f뾶�����ʥL�%�붰'��i"G?!O����\��cr���+�ף#�3Y�n��$&���o����J�1s5H�z�kW��)�^�{�2��T$�%��Y��g�/��' ZVŇWF�ʈ;ZP��[�� �'ގP��օ�P�GJ,E9��*��I�K;�C�y8�����r����!Y�&W�gR����{���j��������K�<�(�>�|� ����;A�L`z��#������r�Y�Β��0��8z�*�N�H�d'b���TX�YK6f� 毰�sT���%p�O��e��&��%% 5<汣p?�nxn�9�Z�T՚Zg?�{3?D|��WC&"�8%"Ki�<�QNO��H ��`~b�0� 1$�x'��eb��C2Id3Ut�z0h�*Pd�Y1�jHB�E�! �cp/�r3,�T'i2�O$!׹�UI{ ��t�sb{K��j����*S�kOKybK@����6�����E�ڰ�����T�?�I��q;���)���^O�OY�Cp [�H�.:� w`�����`����}�f<�MϨ��)"��� ���B؂[��&� �& �HH�8 L����`9۩�O��Er�ѩ��l'�����4&��%Y"�aaO�> �B"-'6���Ȟ��������M���P�Lt�%9;���~bZT�TJ=B��Z�՛�ʿ8S��W{��7�KB�&h����4!������GU�g4�tU����y���n�m�;�.�0�xM�P��Hw����֞5r��.R�er8��ى R�$������n8�����ל#���|�q�A���*�R��گ�ʯT&��껵�|�ݘ#X�ǎ;q�DD�� <�2[��|�����\�pa낽AOU�z�J��G>r�ر���[bn�5�̶�� �{���ѣ[= nLc��H�����3��6%?�O�ofve���H�}H�&�+����m."~�7~cmmm6g�Y�`�v{��]u� ��w��]���'gߺ��2��]GJU%2Q���NU�7ü����dZ��Z�U񅄊g�W�F�䪫ps�H���"x��������_ڿ�O��M̕hE���z��r��wrת���5���<�b/Xi�W�,*Ҋ�&U�O�� n�;����p"�1����{��D�d��@$�� �+�l�)�dX�f}Q�2������|��J 5T�"��A�Gл����S���h�ꎨ8�Ģ��6�|���,�˰HT�=l�0�N������!�L���5�6*�: ��JER�O��K%�` ނ�W�k� �Id �V�B�i����B&��ݍ�-�tk�%�H�m�٤{%�/���zhL�_5L�S�����\�+B<�E( �Z�G�z{4�G�;.#��@��E$���nG�H=�m��C坉�0�A����.�,9�����I��ZÒ�!�>��� ���&PH������A��10͝�^��H[T޾~u׾�h����n�>��� ��IH���vb$*hX*���5-��H�j�� M�L-~{�NX��g�G��8�)�fd�c�IW~M����=�w)w�ݚ."��b\ ��(���t-�]Ӌ,�*�4��i�E�M��ʒ���a�-��$4���1��(�KͿÀ�M�!��=�_FW���ՃImȪƝ�H?�nc�1Pm�j�H��:�{z�8h:o"��i���y�� �՗���S&S.��.5�Z��V�b+������o� V����p�v�1/�"����}��}� _��~f��F���r�O��O?�#?�=ٮj��ۿ=c�ֱ�aWUE���|d6�[5p�a��V�۫��������S��M�<��wm�����v�������S�&gٶ���:��p<���X��B��:��3|�������[F�ʶ��v{�CG5HP�_��_�_��=��C�pW]�X�!W���:P���iۇ��'�G`����v63�AC �FNO��ϯmr�X-�o��dP`6B�D�W&(= .")u+E��p�x�r.�x�ڭ��5١��% Q��!��/��9�����=+�h(X�X�#���"C�3 �K�M�\�q�g�A3��w� �G�l�R�`H8�T#�VY�f�tM�c��8qDc����c�9�MU�7�,=�i�%r�ߥ�@;ඤߋ7}!�ƔS.%Oa}<��C�6ҝ��S�M�ˡ�����O!�-��E��Xp(�� �Q���� (����@��M������l�$bY@�,��6�@�/+ .�Ja�~'c�Zq��z ,9;au�q�j_8`C� w �e�!�J<a#Su��B��pHƇ;mՖ:;��d0 \��:h�u��+b7�^c$ܪ���.m ��� I���@aH��J�&0v�&���3�F��H`T]�� n9�K�4^� wG��c�؄S�'�nNǥ�/U!ISa��������F�F�v�Y��ĝ&o�҄\T�d�+�c��+���$��U�j1}��W���TOg��������ƾV�L�Zܜ7��v;��l����Qh�>���ƺ��2�.�X�.Ή����/�\z,"�̚����mo{�'>񉫲D/����ڞ�k�G������|������F���IW�ܦ��>32�d��[l�'�[ss<���?���W���� _�sΣ_�;� �H�wΕC]�ӟ1�F\��?���M=�LR�9�w�斅�36�����Y\z%pj�'x���$9bb���-�� �̇� ����y��p 措-P�H����D�� ��K�K�aY��OmW�)e$<�AM�*7�rb�N� �'}!������VM���|�͂��h�C�²�����l�Pe�qٗ�C��x*��.S{P,3|�@����-���Q�$���LQm4j�&�B���F��97��6�1|TA1�&�t��7�=�q|`�A���]M����%���_��iA۹Ɠ��b��h:�b�&DD��hUZ�x�2�����;���� /��fi����i�p�����b,�M4�Z��~��~Ӽ�+�B-i�MN�r�'��h��� ��lDD��X��|�հ&/:-,2ܓG��󂉆����Y�T㗍�NҎV�΋Z��z���e�d�Y �! � ���{�t4�e���x8�tL�Y�v~`��Y�h�$;=D�R��e�e:P6�����v���6�Gh2��A."���j�M �鏗��=��E�)ϵ�q�t$��ˡ�!>���v��v���1O_��-զS C+y����`%�^ږ�sȳ&O��+M��M��8��7�r���n]]@�b��v��.Ϥ�B�I:sr�jN�H;��h<�=�r`] �Iڑ�膦N�+������ϳ��^RU4je��f����,_���$k���i��#�\v��o�S�t?dz'���n�g)�`�CDА*���C���e��݉^ʓn��)C#*�C���ܧCtX�Bn.q�4��[��,l�zV3{�%�Kb�R�6 ����=NKj�yN���/ }Տ�P!9�HǑ�ɋ�hp�8�j'h�$2�=p r����}"u�ed:6�HD�������:$cviڙD⪳�,Vk��� �m�ܳV|{t�W��u�8���ċ�-Y�#pLʊH�֜t{�\��h�3�}ul���ir�݁�mT�����o [���C-k�:( ��jW^&e\\\B\�QHH�`����Qw����}�CW�o���7������{�Ν�ϟ)��.��������]�̰����?]ѱ�ٍY91���~�>�,�wv���'���V��w��ݫ��gϞ���2>��N׿���z���}U�Ỳ~G��9 ��@��������?���D`�!M��̠`PP'��lrT�����d̓;`�z�MGa:&E�U�io�~<ࣣ�t��,|������ �G� �І蓦�7%����� XL�>��$c�m����rU Z��� �� nC�+�\�B��������6�ِ�Y��䱖��'����e��.��7�4����������n񍷬s3i��Yd}���A�N �H�&�r1��HѾ����ҽ=������\(��5�~���Ro���3"=K��8��}�l0��H= ��0�((�#BH�h�6��Z��M��"�(i#�H*�.�u,"a%���}�Ȝ���p^�v�b{a�hR#�U����`�����[�t��{z��p�o<)�,���P��ry��]8���H_l�.�A ��&���W.2�8�/�9G�lm��]$%���Xӎe8:���H�sĿ�7���,���㝌n�`?�O F�]$Œ��]Œ��]�1da�߷d�8l���%�D��!���[t^@�!Ɖ����>�oL߰�<��tȨ�>d���I�F�LG�c��w`�����b'�+p�oJ<�ᑒt)rx��3���x34"ڱ�q�����ч�����1w�)b��Q��2lc��])�'.* ͂t� �H�`E��7�L�s����kdk�-"��7F���.9�A���\4bN�3`@�%�����7��v��[;� F�h�u9`�{6Y�����S �n��KPڋM����q(hBɞ{i���q %Ó�e�Se�k�q��4:�_k��n�H�^he�ˋ�/s$��w��ȋһ ]GUg}^8�r)��T"",��*���/sA�m���34� *�%�0_�F.8�x����D��$ �� ��h� M���rK�*�A��~���sp�x>b����5��)VBtq'��E/7���շ����5��M�6��9�{ƞ# ܪ� �@Z���.�t@�&AO�F�W�R����d|)8�膸�8(��� ��݌5�>Vx��B���~���Ɩ{�.��4v��޳r>�( O�d ���vw2�;Q��M���kG�)��1�U-,ѻ@4��j�x9�WOtw G ���\FX�X �k�Q��TV�����5��º�_�k�!�/4F?N��\��]$����&��mR���=oX��0l��/�r���F߂�8j\FJ�_��J�n�S�3�7_�^�͊�hӜ-w�f_3:WP�e�[�G>ٔ.�2����)�{��,��Ϲ����T�N'��͋$B�� U�{���"�� �K����=+�l�D -� FyE�CN"A;��j{Mv�-��I��mʢ��d6����<��o曤�lc��I�״�&��e � ���6���7i�R����6ǒ��q����ȏ�"�S ��;K:8�0tX�r��"�A�}���nW�6|�͓�K�����.Js���lu��4�%��f�(��c�Pu�j��'�A%���>K+�g��A9����Տd��.yg7���O��O,,,lw�/��҃>���~���l0�ӧO�"���� sמ������H}�?7&���^WVV~�G4��-g�����w�ٟ�� ;cg�1�T�|�3���_��7Z��̾sCP�!t)g ����OFh8Z�*���Xz��"�@��、R /$� T&�7�LL�&���y�t�����t���e=��[��Է���y_ BE����ヒim�66��n���?���������> ��q��_.U9��>WkU�A�����zn��B�6��=��fD���䦕o�� U��bkz�h�$L#��jd+ � �]��H����ƿ�s�7��^���� IDAT��e]߱g�����9����1͸l8�R|*{��q��効�J5 )9Ԥj�x�������ٝd\bG�E�t���A��B����M\t O�5�L)�q����� o�'�=�c�屏с��=:z�`c�ag�B�Coj�r�籯:�՘wYH�c�ص�n�a�K��� X�͆^� �O�xt�}�MȞb��J:�cv�!���ca��$q�y�˰&�v����Зγ.~�e2��,.�s�s5���ͩyk��f��8S�IB�!9g��/�=���m��f�"E㴮��e.�}�ޑ}�ɾ��>�I�r����ĩ� `^9�|�\�4WzE��ڤ��G҆D�!�ԕS#��"� S��A*يC����ui��ry��Ό��AWU�n/��M:���p28iqP��9����9�$O���� ;�v�<o4eg/�Н��X� �EX��E؀%�U�9_���p�:KD[�k��I�5��|��i,�����.�w��{��d:"��N�!.x�4�yd_J����E��]�R�|\�Ow���n��Y��1�?�̻ E�Rd�R�y66����Ζy�� ��"���r�8M�@�$xψy8刲��E��`�:�H�d1�����4t�K�Ex6�Xk����6�US��iw����p*�L�fV]���>6��8�j�D�����$6�<�?_8��8)R��$��d����s��1h��-�n[�֭Iȱ��&�Yӥ����v�KģxCg1Ǿ�N�XB��!㦤�槍'�� �4��� _�x�� ��q���$ֈ��m�vR.�A��5n�ړ.��(���� �������a���#"m���U�]�tli �W�є/� /H:; ���1KY׊�bg ��[X�C4ǴO�3�׊_D�4)˪ex;�mpz���_�'�ؿd%KF{x��)���o-hk1�O��OϘ�۝�E{SJ�Ї��O�䍘7��衇����y����T �����N�<���**r�)���۹sg}��x�]�~�~೟�lι�r�i�2��_�җΝ;���\�nE绮k��;x2�V�ԆyJ*#�Fӧ��O=rr.�b�RR .E�S0�vIX�<�>�pׄ�CKT���D/���?�'�N~�������.��?q;_�-2��2�X�����O�_�Ls|{�m��\�[��[����s����U*+� H��x�pi�=-�8P���{c�x!8�}/4�����4[��&h����N�c�9aO���s�N#g��z�� n1N���`���!�2�G�>��>�"�.o&�({9Z�(\�(�Fz�|��8!dJ�-@�!�ՌB%�ȁyt�r3r���Y ��f�1���}�o��n�A<���C�&��H�X/$u5a����2���n���p����8 �X�3!)D����O��p_q; K�E���Ϝ�e�] W�"g��#.�,+��>?���ǐ� w��y�2�BڅI��" �Vх̋��F�ٓd�r�����U��C���]�F�'�vH|Wa7<���E��B{���8���)����Ed/6�8�D�d �'.{r���4IJ����V%����w��x!�pR�kʆE��{�C&�r1۳���� b�pe`��u8o� q�t�X�u<�V&<dO�cƭpK)G��  �ãس�G �PB��kl4I��(��H#�:�k�fż�J����^��� ��27�ϙ�Do�ec),hO#_a<o��C�>t#�ĦӁ����F ��'�Ed%낰sL��C& s,¹ �'.E�j� %�k�D4�C����v"��I� ���u㢰+|oa�ʦ���P����X���Wܟ�<��CP� �DvĒ�6l@��f�{��;�ǐs��;��I�BQns?�uA�d�C]��%D��[X@�z�.B�@t�6�-� ���@OA�|G�֮��p\��y���ϔ�X��@�:�5�N�I ��9v����s ���A�.�h,�~�m��S��ƞ�c�� (㔞,����5��7�8�^�FR���N�Ҹ6����'3�Rx$��HX��Yg;��зk��b��WJcR�iC����. ��-���Zt\�Ǖy�=��` ���Anκ3�Cƣp-�� p��g�Mb-K�3�����{�<�/��Ȍ���DY��*���Jm�kH �Z�V B�zՐ�fiU-�V PR�@Q"��y�Ș�E�y~��s��zq�QT�[�E�H2�w�ﺻ����t�R*����/i�� Z:Z��W�C�G �� �E|�܂�����u�Cr_��0�Tl�T� �6V� U�֯ �[ċ����1q,��"�(1 �}j����=���b�K�^�~��3��`�H�h��,�{,���� dq��>�*���n���F$RJ�ʸ�6 e��6�ygAc����k0 ���X#�|��:XO��1 {`�x+��|�r3��e�9�-�}� ��ʿ� �N�T"YR��� �I�Ka��w��:i��m�6Ff��~�TN{�~ �%8�l٘ v ��X���/�y��a��F���B�l�d �t7F��39��l��U�g=��WS9W�3?h�CZ�G���ύ�'?�7��*3���h��܅�B�Ky��%d)7_v.�ށ��N$����_��y���~�C�%H�B� �z�o���&��v�2��y�Ux �[> �O��?���`�O�� ��� ���O��?� �ʯ������?��ɘ���?�38����"��?��'��O�?�H�p#��~���J�?�a|�k_���$m>�0 ��?��?��o�Ɠ��j]��\+�i�~J�i�TW�͉�o���&r{�/c5�~x�|�&{ �xX�ݮ8��)�-xƉ/W�)�qKF�~D�P�t���t���("�c���"�bH������� �F�5�*>��g�L,Y}���Šw�%o�Ɯ+�^��z�)� �"�y}�j�oJ z��*�I��� �i�k}��`F������]i�E95��K��̅� 0p��| ^0:� �aS��VZ�&���u�b²�?�{�O(g�d�Ѭ/Ë"]�Q���/~}(1��W��k�z����@݈#��`��D"�;���-���l#ǹ���l������z��K #���#՛j�ef�2L�g/�����6�e=�Ҋ����K�%:C�x���D�����,���LJ����͜��#��h�Lx� 7ጘ�2��=�"�d�D�<��l�8r�Fƒ� S�4T/�HKR^!�H��u<�n��$q��W��,��lCBL(#J*��z�*]�e�Uҗ5氋I���2'��&�X�ǔ�y����_�z4�w�� �2���I� �_ƥ�"��hw���?�O`(�4Gz9�kʕ��ȩ�{ �\� ��'n���(�e�9gz><'�A�8�P#GI���^l�1�PC;S����:A ��M�� p��ѱH�i�Ot�D<,d�2Ӆ�S�3���D��4,cȉ�%&,�� mԗ�Ѱ���Ă�ͬ�1V` �Fë�����M��&&�F񏃷���z��f�b����h$�Q����#�����6�O>f�<ށMhFtj�ι ��8.� Ͱ^54C�v,�P̭ 睯+� �;Q�g�(� ����z � ?�T6����Jj��Q� �z�8O>ȥ.�Ŋ_.����x$r���������n���0�� }��zj�y>��M��n���B���r���#�\�����Smf�;p@���Ds�! 9ܹ��/n*�M��^�0��"���-s�� �ׄ��h�Z��G�n�~�~J·�*�>�nnG /��+ϥ������2Р���)���h����~D�t��v k�s"�G�z����w�#pd ��(U-���#�I�%W�{a/M� }�L�f}�v�|GK�8P 'w(������1�8!v8���O�� �Nڇ���Y2�@\�� ߇��$�º������n���WSY1y���]���|���� � �s�f��ON� )�J�Rn� 3-3�Tb����Ɯ�5K�� �����ֿ��h�ElPz�H�b�P�����r��P��D���x,אW—=FC��;��Hf�b9�f����"sR�R*[�W�(r�Y*HK� ҅�����ک��'�� �2j�~��nwRce�D�TY|.*M�+R���ƄY���Gԟkm:3+���V�&O&ژf� a�d�aE� �k1?#� \���g$����KU���p�'c:R :O���Q��)CsΔ��a0��_��Pg~�k0�s�v����ׇ~ ��c(�����/..nmm񯅞>k�����������ä:T��'i��/�bZ��i@��ݿ}����{� ۤ�M6�� zZ�`s�U�7�Ua;�.�?��?�����7�|s��������^���(�R9s-�G�yT)V�ʖ���ե�_ [����t���uL��>#"�ׂ7<&r��Kn9mET[�QXN��uV�����֋\]��<=��Nj�ڰ��u�lP>Dޤ>�Vį;�� yC˱� ��2@���A�P.�P����BEG+ş3օ�棁�Pサ3�g�5?�to`A��~%�H�23�a7�ou��aH�N����B��iޓ|�6�M�b�J �׌7���]�ꜳf1*1@�4�����_Ǟ����D{9R����x]y�c֒�O�1�>ވ��c kpq��=m(�Ε��h�Bh�J���,t��p�Y�Ù�1�L�((��d)S�|X�`��lGĺ�"L � �22�2=|3�a0�\�)d6�Q�U�5*�i� ��'%J�S8s�zT��$���LX� �`���4�+B6���an5�$ç�vd����``���^Q�51�CE�`�x6�1K�v-�6��s�/�A_��Gʢ�<�X��� �"�)�s醭�N%���hE�����2<�M�����J&"�r��d�Z����&V�בW�t�`�T��V: �ÜU�k4��bt�S�;�{�?�횳���� {�㋠�C���od�x~�n�-V��-��2�q~!�E�K �tI[Z�i��#v���� :�FX$�1e�cIn����uY;M���d�.T�S�� �Zx ]�$Ky�}���� ���, nc�R ��TxmSN�Φ�,��)1���1��Q� :���m9Π&�W6�r Dr�D��D/�!�#)؂�?r)���p�I7��|*q9يE10�K~ٸ�Vβ�b����:�Ү���?`hR��O�p ���! $�s)S�� �X�w��r��Q�L&Y��݅mGD^K�[�`����V���T;�-�g�5���~k��p�"K>FOR�h�J5����=t�g_^�NCz䍪�(�H�j�yi��%��ට;�Ǵ���U��9�OEl�D�G��(����b��~�`��2��,ށt˰����LK�e⦳!��v���4X�4�nC.�L�,R��%?��iߝ��R�� �����0X ^.�JJ�Is{�e����U\2�i���B�N�M|X����[Y�sN��-с�pUf{��_�b�%JԷG�㖩6^�J�$���v[i��Ұ�i]�N��Sp.|z-a�CZ�ic����!���k�=x��g �{�ONN>��p�{3��.����w�������'s�=E������ �{���A����x㍿����Ta�3���D��2\����0D�SJO$�~�׳�����)h9������U�sR�#�/��[�����JM��2�<6� �"_�e��c�e��� )h�6J=_�^�r�)Q���ϑ΋�U�v#?�}IE�Z�^$-we�!��b��%�^�Y;��{�������]5�So���Yy�������}�C�ߐz6�W��(J�=���\��-n��U�i��n�r��a�`���tw�e��#�hcъ�� 0 �Č����RѦ0I�&�ud4句|��H���5����|�9$>�XTv��� >t��/<�I��>.��A�+"*/Y�Fz�a)C�C��Ʉ�)~޸��Hu[�����8��B`�+�\B��'�[ ����q<ȧ����u��\$�m<��m�o��Z�9c����` �k�� ���7J�]$� �e'�sҝ���zd��`��~�4�%����L��2�, ��>$�cS���e��P�r6�/ደ�� HF�f�EI{�NlH>�WqT��q| �Q�v�����›�`G���7�v�X�].��K�����b�+I�� H�$�B�� ��Hf�>����'F��¾�!���)ϣ�9�-��:��M1� æp�9�n7]+p�KW݇ZK;L���S����@�idBe/�0��z����L5�����CN���HC����� t���kx IDAT��m9p�3�Ֆ)�1�Dt�Yڑ�fX �iZm1ƄѠA��3X&a���Is�xp���Qbf��)P8 �Q<�ڠ�xE{2�!C4YV�I�,X �'W�����K9.R���;cj���N3�v��=�3)ҒEJ �� ����c"#Zh��$%9����c�v�p��G&XHD�c�moJ�W,�]x��2� .^�G�q�7y-�kmL����lZ|�q����Uڗ=��%�&~h �l}��9O��;��B�Wa���t` VKѸ}���R�:��˔�ʮ�68&-��JC� a�\7�&�<�B��2��,�95, ��/�݄��qa��܈�e[N�68�PǬD�@���C,V� �~���Q�f�ź�3־�^#F[y'����� ���E#��R*���M���iQh=؁mX�E|!Y]���y�F(��Q`�a)h��)��jč0�K�8�0�Ӎ�b./���A�w��u�ާ�H�Y���`.��p��$��������+y��s��8s�����#7~n�LPVI��%��|�-��+�J�Pʰ�9˧y��(�����}©�~�xnS�&:�cg�8/�/qDZ"_�����]�N׵�M���,�ac�;�� =Gw�����̇/Ž31`��Wő���s�my< .�������Va�L����'_,̉-F� �p�#(���9�0p���y�5�Wa �2>���z ]���D��K�ND�I{�22ML��EQM0&�C'���,x�FT�N�u�e�*q|�}��.<�J�DO%��g�����"��z������?�c<���Y/�|��_�����3�� �f��[ �'~�ˡ���ַ~��6��gV'"r����7~2�<-~��/���گ�������l��Å:�\C������ ?2�>�D�H� c�ܺ{����/g��c^_gƫ�~Z��j�.P���G�˩,5L�<����m��<��Y�9ʶU8ъFE����ra �%�±��b�]Hz��<2G,CP� s���o�\M헄�/��lD)�<�/S��>N|dl�#���&1�y�X��a=�;u��}1��+��y����8�V�4v���������0O I��|"�X|]J>n��1C���Ւ�x�2,P��J3qR_�4��DPG�#�(��q��X8 �I�5�͞5�aI�s��Q:"[!�g�6���-i>�Y�m� �Tf���DD,��p�I;L�P��U�<���}���T�����r���\�'0���q���z��V{^I��1����6� a:ɡ�CgWR������S���9�5�����p ������Q�M�,8�0 ]����IN1����O$I�K��� �A�h:�L�-E���RYM�%<(R�z���)(��=cu�!�]����+&�)��睻�����D����D�����ZfB��)J��p-tJ���l��ם���.�,��������򨥨��R�S�d�<����}D��p.|i#�{�$��}gN�����-E�$?�r>�[���2n�c�4�,��-`21&�)t�4A�aN��q�r�,c�I�N��k��֑!���F��#�a3h�젏5��Zx�3��81��H83V��a �p&�t4z���7H�Ĭ���8�D�i�E��T.�O��@B��D�'Q��#}$Ѹx����cM��]km�-t�U|�pL~[۞��.�)����eH�����"�:�y�K�Q���؃�D��3GuAYs��ܸf���h�|V�-X����F��S�-$��I�i�F(!��� �F�E�b��e��oz�=tSd0d?��3a��5��hw�6J�� �5�vn��K1�� �X���&�cĴ��M7��ʟmY�g��wi�]��T��R]W^�jr�w,}D�=$d�#&�$�p!�ٹ"Ihc�а��,�OGn�j'�#� �mE~,�Ep�����o��5^ �����$��5�GV��w#����fV¯ s��~▰���J‡�����S�)����/�3���o����{{{�7��������͏������YO�o|��<�̓Z�pZ����-X?|x��׆�(�YW���*� ߃�������~闆����󜗴8ɑ\H����+�h�zU^N�p��p�r ��N�l��>4�g|�]6��qIYu�4�7 �#�e��|�׊�S�`S��2i����N[>h�V�E��:<;�K�1o��}��}ޘ���?�w� �N���S����v{��"eD�ٟ�ٷ��탃�#��y�R�Zes����]o��G�ܨ��p.�%����n<���q��_$^��I��;Q� r+7+-�}��w~�sE�7y=� G�Jsd���K|��c��� �<2?8�M���bV�7�?�֒�4�%��G��eU����I�8�cb�c���Sy�� ���M��smѮ�<2��2�Hu�𲖉�햏�M�%O�c� ����b���Ut[�;�=䓪�֣�P��pP7� ����q��xK�=��,#�o9�%���ie'�'A[�J���+ԣ]�4��{�"�\�`Fiw��: ��&~�ҁF��)�^����s�Ӕ���IP)S5��~iv���s6�w�^ζ�c6z~�i�%���b��Q����rj ��4�6R��:��� |W96��aئqF��,�L4֠��iij�S8�#g�د���Tf�Q��@�QOSx+�'��N��|�0�i��&[ ����g����p�iB��F�c��S�=8(��6>���n�k�c~ ]�EX�;�f�D�÷�F�A�3ѵʦ��6�*�K~��Q�jʃ�uXa$�޶�k�����s�-��)(>T�O9�xԳ�����([��[�#'���^b�XJ��Ԗ(m۾���X��c^��F�F�Hg�Q��w�z#y:�5�S�WktW(��ed����uy����"�F��9���T�/��$�-�/~\�~�,y�jhEN��%��|��������8��2.� �9�ٵvO9բ��WZ�;�{.��dP`��I���'ǣ� 6`�Y��\M8/]�c�' �bq .���:5������˧�t}���HM �oY���%Hx *R�U��ll�~��&%�s�i�4*:.̈́�����H ���È���:G�)v�z0R��b��t��ȉq�J1oY��Ж‰y[�1��0Z>UN������nȁ������Ҽ�H�z?q�q�Xj�Z廖�sD���X�[u��*�L栉eT�-�ܫ� ��"��� ����us����3�=�!���)�OFw��w�~����d�G�F"���\�p>eZj)t; ���9���Qn�}dlH{��<4P��6�'|Ru��4Zh��E;��&�x���w�fdPF�i���[�g��bݛj�)�����%�\�9a����Ï�����%��N�sj��;�q6��5ohw�����2ӗ $%I6ڦEd�*%�|��5�%��>��C�I�*�zo����YSQ�d\�Vc�t��Eх�2>(���£� $yީ�Vص�֔e�n�z �#��HB�,����4�C���V���������u��l��a ST3���^?:���潰��}/c�W%��������Z2 ]3�Ѳ퍆5�B.�\l�~p?x�Iܪ88A�إ���W�Ϗh �Y{���6N��t�6=Y�`r�e��+�gUG�=��ā�+i��/�M� �A�{��dv�F�� 8����e�2₏��~� �mV�L����&�Jҕ����`Nm�=�1[XO��Q-$��q;2;C��U�'����h��^�h�� ��Ҥm�3�J�@`:�e3 �/l+g�_V�0\��r�{��vΒ�5�n�`-�:~��W }xG�ap&�f::�0Z�4��0� �{���Lʄ3�X5�� �m�۔A7�}%j��"h�gB��)X�Ӻ��e��7s�Q��������� U}�����3Qlx�0���o�cC���T>�}f���~w��/� ����'WדB�7���'��S��i �_������_V�z�_��_��^�t�s\A,Ze7�X� ������E��.��:^����Л�u*�Q� ;�;�� ��w1�s�5��đ�n��G�v3�6�i�2,v��3�'F`��9(�R�g֗�PbՐ-���gH/�i?k~7�������?u���a1?=.>����z�033����d�d���VGn�X��"���1[� �'���;�f 9��hq�X��>$>΃9� �Y k-��o[%O4y ���H7��UxD�#��vS4�S�Өvh�vi��ОU�u��?t�/��'>�@���(Vґ�mOKL�t��>"��=�g(o��lq�7��m�j1��K�P�F��&�%d4�ޫ����x������� �^l�εڛ�{��rP�|(�L��PWm� .�-8�4?R�oe��GCgG� ��d�lK 7��!$����h�j�=������/@-��E���u'7��=o7|����GUl �x��e��r˸��Q*��&Mfo�C�I�A;�f����t�[�Y�Ne��I��f��'5��>�0�L"S� H�,���"�o�<�0��}���\��>���'R�T�c[#rT���)�{��`��,Q)R�f�n/��4А=7�T�K,'��Fòs�4&<���i'B����GW#��I���º���&���%��wĎ��v� �!����%�l@ϋP=��3� X�Z�{�Zy���Ax���g{\�Ezu[���s߭�gٳX5�y|SRt�~||� �'w�m��#9�"�af�d�LQOU� ��ds�m�L��}�t^L��A� ���O�~-��t�V�Km�E8�5�J����$�����t�����.�v�Y�jE��#�O��V�DnR4�i�蔜�y��_s��=J[����v��t�!YLG+��5�C��e�^W��1��W��UQ��L�2���(�d&=�20�WQu��~��,c�@���>N��EJ�SK��,bF�&\��zQvԎ��8g0 3j]����d��`�c��F's�K,�&p"�Y�w�9���b����L�X�cx��N%&�3�Z�SN2�{okY���}k�s�k"�E��VFFfV��UERH�E�2i��DԀC��6 �� ˶4��0d)؆<�D� �"�R��U�md��׷��s�^�����2�HqHD2c.���4��ֿ�5����j�(d*����D�^'t��r��:I�ű5�g�o6�T�T^��"�:���>iG;!�j�g�oN�O��\�[VO��tu ]a������n�F�ӟʬ�Rˁ�9֍[.���W�������1n�b:,:� �^6ep���g��شp����-ivU�+D`1����0���Wŧ�DiK�L}�"�R΍F����aw8e���K�X����d�l���g,������:^w�:�T�^ڬ�b���>�6�q�+�� ��H߫� �"�P(��f3���n���^�4�0�'��Ë����P�`c����H&�" $�J���=������_ .�ܰ���i��j��4�}�Q��~O�]�7����������g�3Ud�S��j������.�OO�8�y�/��ߘ�-Ջ���+|��� ��[=M�kQW���<��UJ���,���o������8FX1��|��# ����#VC��g�Z���H �j�ڸr:�����wg~]@�4��-�P�6~?s͢�Y�T����)<�l�Ϭ���p�|�^ʘ��FvS�u-<��q�I� `8�����<̮���~�L��� �1����Ό:�G�J���j��} ��"��x<��W�z�ڵ��y_?�/V� R? ��|�;���w������6������.]��%|�Ǥ�i��/��z����o�Ϳ�r�mp^�2�������ź�������������<,s�����s�<'>�1��m�a�#f%X�G`�����١�$whN��7�?�xL�uE�Jm�b�q;m��Q&�I"ȵ��� њvOz�h.���u�z��.����޸���1���������{��������|��K ,9���Fo��������|�I{�g ��l��N̸nBe�x| g� �2,��J��H+�Shdz�O(��Y���>,:C�����y�У�_�6:�u�|&��VƊ�;E�L���[#�ݛ���8P� ���17>U]��ES'�)��s��=��^��r� g[����K�l���ځ)MG�5&h.�+��_��FS/Et�la}��b��'-O�st�$��A��$�&�Zy�ݚrѹAl:g+'�������!em\''�laY�'7b[pu�mR��n��)X�rc��7VO*S��b�$"z���`F�T�I�D��%��!��l;bϹn��~���(K�7��u�ӊ��*e_�AC=h����R��Ҩ�Fl�Lp�4f�M�W�D��U�-:�~E�G�7cJ�q[�Ӯ�� �j����Dk NG��,���l�C�0y>�!�[�#.B��r�3�284֕�[��Jy/��4 �3�ݤ{I�ơ�f�S8W�[1jK\,u=����R���E�&�;���Ҽm~W�:R��PJ{a�eXt�ۢe�Զb�m/�G\s?��ˆÖ�T?_��L��`+��)�F����8���C[ 8������ɲ��쒚>8�tpH�h�hޤ���zH$eb�S�H�d��,REL���~�$ tJ~ ; ���=�{p?�ZQ,�f�J��O�`�TI\��l�[�]��D\,q�a&N4����2��3ġ���,4�Fτœ����Fe�T�����R�hW�l��h���k�b�u����=�\���nʥ&��n��s*�����i�HlR.��4��!]��ؑ����s�[^���%�6��ѵ-k�E@* ��$��ނ+���sl���4ƲX����Zv�)Y���Ӟ5���m��j�����؄���:�6����[���RSHb~�2���<%��33�%�����G��sŹ��N�k�8��QZ�����:�:������Q_�K���FoS�ux�Q�:{��"���!表� �ҕϩ[�;X�3��qC-��f����uq�ϖ�ۭ���]�Ō5�آ���+=��^� ��~jF�.ۆԵ�pAvTƆ���$�H*�|�W�]X�m� <-G:TlW���`c��{����� IDATF�~��Z�׬7�7j�F�2�� Ц�����7 D�AF̯�(f���ӰY� ����-�9�a�6�i� S� ���Ng�[�('�av��Jɯ�NC{ԃ�b�3@DBT�b�-�L���5;'`V�Z�.�I�Y�n2�4�+�����;� �T�FZ0l���ۖ^��h��yF'Fպ$+E�}݄Ʋ�<\it�aYy����!�y��W����qЭ�_��_��(�r�z~� �����~���}Yt����c��Z�p �}��ŋ��]��Rk`�+\��=�7�7O�>}�h4��k��|^F����ϼ���/�E�~��?��/UjH������O�-�U~�� ��r��g��������:M�Ñi�햏�ܗ�#�+�1�@U*�`ۯ:G��/�]�< i�M{"|��[;��ÿ��J[Z�&�rE����?�s����u{uW��G��������_��_C,��,��͉����V�9i��I��Q~N�6e�xJ�!��ؗ�c��$�����7{9l�"���o�!�xLٰ�Yml��},Q6JY!�L�T��9�8�V.$9&2��""�`6� q�y�$��U�"�E\$.�yX"�&�.U����ȇ�G��tx� ��۝�[������1y���(,6ܩ������O�l��EO���g�Pe�H�؃�b%�3W~(=��Ěd5nd̒ i �t&���U�%���z2�]t(>��ܕ�i��t����bF���'N�N�9�uv����}x�܆[�����t+r%y��C7�QT(9�i�!^�,:�|��7z�&S�*� S6f��h��������i����i��=8��L�ld����K]���G �5��t��ʀI��:�]� g�*6�m�)&�S9~�9'�3?U8Hl�~���0��~�t }3� [����<��OA�=�2'�Ʌ�_/<����)��Lϕ�� ��;�c�A#��L\G߁����y���LXI�x��� �3&=۲):��Q��ֱU4�V֒����� ��`�����y,��a< �ïx] N�>s`g-����'/��巨Ӫj��0�^�iּ��J�Sy��?�y�r���F�IV����z�Z�Z*�:zlN�o���|�sH��ȩ�+fX�F�WdL�g��W�׌7�.|�s�C���Oȷ�30���=H#�=����#�hCk�,���Ɍ ����s�Hs�F:�N�4A<����U(&E����O5�b�:�ei�����u��+�����7 O���p@C��a��6p������%��1�ݾ(�e�t���o�v����.�/˱۶�����O>y���+��~��������[�w1�|M�_�/��o|�C}�/ �^�x���7ğ� �Q?���?�����gY��i�wZ/!'s6�`J����~7��p��0��ɷŽ���� �o��#xN�3�Y� 2�ƭ�֒��?j�S{����/O�]���[���UnC}����0��گ�گ�ʯ���mK�Qd,�Br��5� ~?"߄�0{��I���%�T�î Ě���<����!W]�����a��c��r8Oڀ+$�d���Z�|�8�$sP��- �g��"k����4 ��d6K�N��5(�B]� K�Ym�6�G�G�����La6��4�p���~��UN�a�[^ڙMk":�S�G��q�����u� �<'V�2�s��D��+���IXK����*�k���A����~����}��������Y��8ޓ�|fڒ&pΡ�;{Yڶ���Q��267�ͩ��;��:������3W_��US��R�b��,4y��*Z�b���P�-�ym� ��[�����p�4m2ڶ����s�Y�3��8�� y�t��66#�3.��)��� �j����궴�.g{N���N�J��>3u�[5+��[���TW��8Tn�\S�.WM5^�@��J���#���$��CoL�ݒ���"6;N��B�h���O��4۔�~�y���Eif�v���-���i�k�����q�MS���OӗP�,�ջ�  6��N�Yhi�3X�� W�!> V����[JSX���x��,�O���|i�LB֣u����݈w2�!�IJ��ٜ[l�cvjfb9N������D�N�_I5Ȓ=�+և,��e}Fn9Oeo87��u�W�u�a��^�Vof9�S^�8��?$���bU8)�A�Ʋl�P�f4��Ôԓ�',�'+��܃c"_ �P��tF,�|�or_��ә���1�]؇�M���ͅz*��[�v�af�y��U����ǙOv4�� �C�܌؈xW� ��E� ��y��J��d��T�v�>e}��X�T~���'`l� �������zx>u�,g� N˶S߃�0�=�rO�ux ���̤��gh[VşSmr�?��h��n8���@��$5��$���Oޅ[iՙ���6(�_��S�n-�Hl,�I��:��������/�>������=O�ϰ}\�V8ħ}Y�ܳ5�D�P��f*�.~H�7�m|��uR8�k�O�9�~�h>x��s�M{S��~�>W᎕�4S+՞P���2�[� m3,jd���拪pF��)�G6i�q���i�Qm>*��_��a=E�փ���O���~�ُz���\>�`�d�ڴ��u�NG��4��K�����uR�: ǃ=P�RF���B�܍u<�ϢLFi$�����K]JY���^! j#���P:e>c���H�%i�hG��*�L�E�C02��(��;�Q�V�ՎM�!�w�Ӛ���ʯ'ס��ƪl��#(�aCE�@�m��!&+<<��w�ѵZ/6q)���ӡ�g�AgF�_�}~C%�af��L/I+]ȕ)8,<�6���M�^Ԛ:'Hv�-o�ԭ>a�b3�v���\�M��҅'_����[)�~��Ah?�_?�/�{<��ÇZ�;��gr�WP���e��'~��P��K����o�Ϳye����=��˿�����`�k��K � �� _ L?�Z�~���|�;q��_�. F�����OaMɚ�B�)2�0,)X%eù6��Ao�j`= Z*88�s�Jjr݂�`�7�vP�\�k����w�u����=�[��,�YX����u�&�{�3�h���\�<�5Yr۸'�'?�m��Y��ô5��b��Ux<_��IG��Ҫ5�%'��0 �B3� |l����Q�(q��Ō�@عSl�؅�X �Ȑ:f����%�h�Oa�hm���O�fӂ�ߎ�hԾS-�:�6�-3�y?���3'b:�'�g#*C��=۴-o>�X����a�EY1���C)��$�#t��5�fꧡ5��raT�9��N[g4��pj��ԧ�c���j�~� �3�O%�n��JM���p���n�Ǯ����7=� q���� ��'��~`9K�T�r [p����̐�t�S��e�sp��q�4}ͩrjc��7-/�>*y��Aғ�GK�C���fA��;�d� ԃ�6lb���ai� �38@�<��‘��v2LsE�.�&�8�t�;m�Ml�3�ǔ �#Z+m��a��]�05�Ѥ滩k���9�0N����c�]�,���^Z�)����;6����(����u|����Tَ�각�Ki�sյ�Hz�O���h~S,7i>�X�|���z<�9T5��Q�C�'Q�u~Û�����Q>혒�yv�l�8��hJ5Ao4�Mt5�e����ʚ����Fٷ��4i9��5�j�T�zLY-9 %z�8��PH� ��ֽZ�Gd��Π�+��H�n�S��#�y�CH�y�Y�����^���=������w�,��O��Q�Sg3�CSxw���~�gm]%Z�<2�� B��X�s9?/��S�z���{��9H�#z�`�!{�vH��TS�!���z�J}�c�Q� {� ��ܼj�gH-(P�5��nT���B��@6���r���������m6�.=���[�J�?.�*�4�Q��H��H~|�?���!.�|U\����;7;��y`H>��1b���u�i�ކ[������p���` o �%�/�Զh�VΣrO�n��W������R�/��/���M꿈����˞�?��??���gD �_A��2��F/^���w��R~�ww �_�I��ַn޼Yk�z�פ��3��o~�Ç����}�����w��$�/-d������_xȐ�o�%�#��rs���jȒ���L6��&81Ⰿؾ��'�%ʎ��Q�Ut�\R�N�1KƋj�����W�� ����a��aA��_����o�ƿ��5��dD.��5�Q�-6��`�X &��8���M����"�`g�5�PTJ4�}g���'���?�Z{���X�$��h�����mQ3?F+����%�?���C>F��L��7�7MoYۅ����jv�:*�͍��!�s�[��οZ��1w���~�yJm� 0�g�����o�㯕�_��P��4��܏����.� 7T�����k��^���E�<+z�Y*!�@7�/m,�B��E�Y6� ��3pQ��El�v���V�>l������3�Y�I�h�UF�J�����,�퍎w��cm�<$w�N�ps��ؕ���5x ?�|�<�4��7t���UV,.�Ye+��}�a ��帝�N��u���Q���z֝A�+�XF�� r Л���K��&��:0��:���g����� x��ߣL���K���]�C�Xv�(��r3�@��-W���f?��_#�W9�[ .�|�z��9���C/d�8���[lk�m��h��R3��ccJ��'f3q=�*��N_q���5 |pG^�gX��}�W��f�V�j>��B��`�3�ub���C2kO�+>븉} ��"M�8�s�B�#�|�D&��nt�k�w���E�>r�d��G:\����؇��FD���0d���Aq��g� �0߳�s.J���tZ�(����|��s�!���^�,.�ވ�bW%�� ��Ű�3���C�M&�.�Sږ�w%��������4�� [0uF�k1ibY,�=)��N����c �7� <�yb�ˋ��g��CA�FQkQ�+��yY��:1dd��l�t�����qhNQ ��49�RM�+Ç +�~ 7`l�O`�L2�����9�-�(!�,ؠ�8�Bn�Fo!��>�%�7�G~>�Rɵ�K�7�)`t�U�x&��G�5[��wU�(�A(a߲�}���T �Ä8�C  ��J�,)C��!_��u7�}4Rs�鞴|�m�U��J�!B9.8��^%0˴B�԰��)|X!�Fk@�\��*9���,(v�s��$�=�G�*d��4*����n�3�C�R3�1|ܓ��nG���Ԁ�}��}�$6��N���-H�`�d��E�;a6x �G�#��9���j�Rb�!z��}�5��)���̢4���Uk��� �󸀎b�/��0�bJ�|���<�����f�[�� �Q h,z�}+�Z>�Ѯ��0y��@�!(h�9������8'#Sp���8Wy��֠miϬuB�K�6� V�n���Tz|R�ӆ������l=m=��62�N4� <���w�$w��<���q���|�v��'="�B�3ضܣ�7�� ��V;��b*O3�0kK�g�ظ�x�~W���A���6K6��Z�$n�!�*0�m(���v���n��`�m�=�c�$Da�����%/�M��}����_�[�Fx��@F��?P� ����Rc�J.��Y���[ Dž��z��>�CJ.�=�Ӵ��*�t�j�[Ė����egdR��toZ�GQ+�QV��S����hb ���4�b��̚��Nu�����MŸ`���X�Z��V�� "�Y���;��Ţ.?���sv���H�}�d�<�u ����|K�͞�I�*v�����0F5�� ��d�@��)���Qg� J\!�>8��toTF���0��3E�]�������E�Pna��b{��,'��᳒]�A4���g�����2~A�[cMz�E��%w���Ү��a�h3��Ϲ��Q�Y*��t��0s�� M9D�2Kz뭷?~|�Z_�7;�ܽ���ij������l��e��{��{����~]�������h�~�]�u��K����m������N��?|���I�'>�e�� ����9e,��5 }M7Ru0�.�(�������q3�&w���(�8"`_� 5p����m�sO�b��Yn#�/�������F.��a���z�^�6,ǩ���v�s�o�������/P�@.�����r�ij�} 4�Ʌ6[����T�su�M��7d��������h�ʼn�� �-u� u�b�N\���M�I�0T��e|8��A�p�;%��(i1�܂�K�,f�дE��%�θ�Q�i8��7qX�� L�a�ܯ�G��r�`�Z��9����R;��Cp�d�S� �Ɖ�4�p(�����.� 4�v�&�*-%#����aF=���$�n&�� ��d?��3V.�s�����J�3| �I7-�ښ{���e�(�Er��̨4��� \�9U�R�A2TA�e�,, ����gN�"�{,ޣ��Q5��a2A�/Y��2VY��M��6?G��)�Wf�$(c�3Hr(79���7&�%�&�z �~&P���#24I�Z��j6�徙0��B ^�x'�=瞱E�wv4�u s�F�D�$���9>� �X�ٙ�l�-W��ܳ@=/�IU7G� q+9Fu���զֵd�){4jf�]GL��2��}�2�U FQDɮoF�X��A�ѻcV�9��/̂����J�I�~踐7�Y�!���0�Qc��o%�����$wg�!�'� ]eD�@�����<����4ƶ������9��7�<��n�Eh %'�lH�X�By����(��- AX��8�����I��XaȂD��bS;)q����7�j�����Z��ϽU�d7��{��=�Յ�z����������p\A< ���g��6.ѿ�\R�.�`����h��xg�ث1 Y!g���!i��den,V`=1 љrW�n�l�yآ�7}����IR�&����̃.8Ew�FcϢ��(�B���jp^��p�e��P�Y��2�F�O��o4;���4j=��y�ݑ ����^&;Qqzp?�,�C�Ņ��ڄ�zq ��ǃp��r"��6����D����l]�� ��21��c����Yn��(�%YO�Z�M�2Ih��V��c�W�<��������S��=]���(.�j#�uva6�x�1��*�F�ҋ����GL����"��M�[hcF���H�b3U�è��gN����3sL���V�����W�&�$K� LۢN�$�EX�M�=�y�*�6�Щ���"�D�q�ILY-VU�{r�0!������TQ�P*��ޏ�|��ni7w��z�b$��Z@c�j깒+tS�+����A��q�� .ú- b$tD�]=E�#"R�PGkb!nNm�q2n!)Fw$T��*�I�E����I]�}��!��-?��_E2Pp$�����@$\�����4ͺbCZ���W��`�����41D$_��l)�������p��|gC�� ej|(�m��\$(#_0 �N@ܒ_ � {O�q�7t��\��� �������sy )-4�����|��}ߊZ�03��n/;����#��'?���h~��8j�� �ѧ߶ *m�~��{5FGp���8\uy���|���l�q�I��!������ۨ��<� `fw�Tr��8 &F�H޻~�_���� 7�:Y ϵ��e>����e;H�q{}^nF��ص��� �ݙ�/ԍK>���W���^/.���O����GK7��F��v������_�W�����VC8���]����"�Sk25񚡦��)���#�^�/��Q���C�Ek v�������*1����+���+���:hm��JANw�R�=�����5�I� ���;���7��rWv���� �P��G=�0Zۧ�Δ�g�t�j�]� ����>�H�Jg^��T�,?,��[}P�-;�ق9ck�Z �AS6�QE�#�E��.!.- ^�<.E������IG��uc�]����X���u���5�76 u��\˜��r�Xf^y ?�y3���d�):��f��E��y��Z���`���r���V��}��y�D�p\j��(1'�DT� �'�]�*Ec��BKv7�-�B���C��}5��� ���׈�}.����E�.u{;�@/�zf! �S>�-8�^�#,�y����9J�~��J6QvF�Bo��TN�̗)خ�,�D��t��J�9-��^j�Y-6uY:ǃ�� ��b�^�80L,S�l^f�pjS���D�}���.�E)�y��ehKc��k ����ߘ����`F�ΝO����0"� dLe4�Ǻ�������D�ֱ��Ѯ�3F�\s���}��Y,ߤZ��v�h����ۡ̀ePa��W�a6v�Gj:���f_�k��Ƣ��!����h��k�-� �1u�T��$�ڶ�R&���Ԉ.GI"#idL3|Ul�3T�n�E����w������j�����v��w7��E.� �ztl�Y���Ν;�m���~�7sUmp4 �G}D�����ھ�n��6����w����k=~��������՜�3�y��ei+��˿�ˇkn�~a&\�x ����q�y��e���-V�a���+�ⵓY�m����Ǟ�K?�����������:�-� ;D������wk��GKu$��x��5.�hl�] �l� ���k�4��K�%Z��7�d�I0b'�(�df ���*2�z߰C��B �#�ٓ?@%���1��Mb��{0bQ�VI���/SJ)_6*��}^����z-G�߇K1�)�� l���W�� :o�-N�(���3>�Q&��%^5y�uWX�&�C2n�$�������,��s�����GD'}[� �5.�_$4ԯE=7�Z���������Y$Ӹ��l��v�����%��� ���ǂ?��%�8��Z�4��p�,�_�S��P/]�X�k���a5u�f��n��ٱ& q�J�Yɤ��1a��a5-�o^�(s���^/u[[6k��f���"'`��s�T����`��|�V�]); 7�K���6�1�Y,���\ӫ��� c��Jܯ�k�V��q�`?]�U���z�Z��BM<"�-�9򋰅^H~�|�R5���qQI-^U�"���KA�,�lf�Jf6�g��C�t�\�"|1�|X��M��������]�}�o������U�^�1�fs�[]���N����E�W|7��p�X6F��ٖb�N��N����r�f��r��R���r$vH�dM�}���q����5��M�wfW�Cѽ^����"�I<�L�� �I�W�p�*�"d�Xqjt`�!痺�U�'�;��2�{�-�K����q^@v�F-*��*ZJ�s\�/�b�?����`��8�����oR6��;�P�p�Q�H���;c�����R�Z���&|���O?���ɩ� ��G��~��� п���ӧO���-lvd+!��������X/��}ݥ��3�=��m�ԯ��ٳ-�}�D��P�t���_��Äi76X�d�y �k݃�`/7ݧ��j���r�������W�"k �����{����������9O!O�F7��� /W�Й� t��8R�|٦��a0�:��W�z��+.�|��E|^��=�I��}ӠmL<46�����$=��V�q��T���Y�ƶwC���@ .�5B�,D�]�"�LMa��B.K,‰��A2����Iը�)�P^�7\U%���+�g��I� � _�W��� ]ot*.��R@��$�h�� � ;����v�m6��[�����t��U*�2qj �e�j�/�Ïө�K����1�X��n�-��+) �^�r���ˢ���$bncJ�t�z,d$@"���I] \2��u5��Ij���+�ҽ����c�B��b�}��a A�%��!��7����:��V�%|d�D�s�G�c��䏉�� �g���{z���������?ڕ�.W��hyMt���j\ ^C�� �~՗ßA�d�)�%��H�H�v������̽��P�"E�$�3�yW\\e'����<&_A�"�8 ��f G+m-U@��BdŎ� oj�����WCw{?1�~ �a;���o���~���W�1��#w?}��g>���~�Gʨ�El���>Rr��(�p(����/��/�L��2땵���v�;�����~�~_��^��� ��}�$!� ;�'5_��z,9�w�?����:�@\�,恳��)"x�؊J���6EM��b' ��\��&����a.k��l���f�����5~f�_�,��Ԕ�AD;�y|�I����sR�P�����Q�UQKJ@8��e�k�m ��ዔW =�c\%-�bl�²�P'2��#�vicW^�~� �5���bx$"Q��\Lr�(+=S@��ѵ�/���@0LHoK�)��������UJo�<��u�Ÿ�R�<����.$��@q�7��f��P�����6 �8 9�1�%�n�R�I��8�3�߮�cen8z=8#� � v)8WI5{ ^�te��ԯ.ba<�\On�^�����0�����B�6�r<"T���Y�˥�d3Qo��'�c3|�1����LI�5Aǘ�Q�-�[ب��{�Bf�ƇG�RJ�+��aM�-r�M�{�?��(2��A*ӂI�xTn�U� �MA}�6t�֏4��0��­鸐A=Ƣ��D��Y���oUvP�䮟 {��C�$``$9�@%6f�t]C�p,����C�� �M7��䁮�뵠��2<��>p}�y���E'C2����o#�����6%�7��nco�u�b�#����9W+W��؅ �I��b�nk�����@CE["��������_�+��fj��m߶pL�q��_��6@�֣I��� m�>��Ï?��D[�l���婧�jb��S|������>L`�#��_��� ���7��jXfG$V�cv��h�Q�'N�Ϳ�7;���Y��kM�t�?���������'xQ���*~]%�0�!K����b�n�$�R\��UR��,�0�����eM�B}B���G2����x��C�"�9�`�u�Dj� 7�1� ����{��ϩ�����}�+{.��E�>�*�2zAYؔ���$?HCk�n��� � �R������4Zw�`�7 ����X��M#�_���V9{ğ����Q�0;`Miȿ��E�a�).���_E_���s��5i���5��8_L13 젥3*�#zU|�V��s�g>��f���?��5����;=X�D�}�裏�^J�����_���w�1Ud�j���O�Ɋ����T ����W`+����g���㺴��+k[�m��VA�����S��˟�� ��R3C�H^�&�����[d"��� �$� ŐR�4Q*4ڐ����ߜ^zf�q�+��:=�+�[ �!����a� �0��a4���Sg��x��Fe�8c�!�;Χ�/aW�q�R��u�E,�u�}`��ymO�Z�T�V����2�i%�%.KQ�Cb��py_~��Řr�����U�������d�Vxn,ay�$�07�)��|q�a�v{I���V�i���P��[X8ߒTL�y9}=pA�tX���6h�4([�e�H�RR���pON%�ZFd���*�qm���dzE�� ��]��q�O���6Moh�L*���`SY&M��ե�4�uq�2�b�^�qB���D��;�v]��C�}:�-�Fg��C����-9�G���^ȗ5v)��jw��<\D�:�4�C]م�]�0p�%�����8J�ـ�ɕ��FP���ZAD�.��җ*FrHT��UTZ�̛�Y~}lPY�H�=����ǜ�B��5b��;0}�ÄF���V�7� j�9��7�r5 �P�vOv�Գ ����('���p�[�T `UBe�D��j/ �b�ҿ'�]��M��g� f>s�^��:��6��9ԋ#;�Z2�!���P���l ��?���o<�=�o�� ���.� sǍjRC�Z7p]�1��>@�ШݐDΑe ~ d?�x����#�Ȫ��0_ʺg�{׻����2ҴjaD��Z#Ϝ9��6X��G�G�.]j2�Gy�cy�@g ����n��uѬ��ێ���g�����4����?��3�<��U���u>K�(̽�k�N��0R����?��é�]���ݎ�F���7����/�e�{�� !0;�O<�3|���bG�]#��A>hR����f�7:�o^-Mq�p�W���/�'Idz���-��D���$��{z���_Ю���8���/�j����|G���21_�)�h�4CY�M}e�E#(��t����zWD%7����D� �ƔM/�� 8�Sj #���o<�fȿ�Ϣ������CW� ��K�c9<����K#�6mL"R]���9,��6�Z�i�+ɧo#d��~x��O)#�&�v�Ɠ ���`5Gg���4�N\��[J��#c��QS���7j%oE��b<"L����Vݚ��<�C��1�5 �!�R'�޻zk IDAT*&�"F������[�Ω>�J�����C�BG �Ww���S�9#f�)��2 %a��\����#��:�C�w��j�6 \<2��cJ�ϡ-����6}�pl��ݛ��Iن.}��u��c�Ҝ��+Y����YHy$]��zJ���t�zhu�H��H�.45���d(�7�l�ɢ Z��1%/,��n*ُx�l�0ʜ������@��`#�����]�3� �Jv uF!��]��� ���x��}eY�FJ�ITa�{��J0Ծ�����o8^-,'�RSVq��f-Ш�Z�L1�D�Q�d:��Ʒ���GMˁ�d�ƣۇ�i􎁃 �7�7�_��N���s�= i:�G�u-Jdf� �Q��g?���h}�s>�K��M�gU�����5����;O����{J�C��m���P�ҙ3g�$z�U{{�����ӟ~C���?ō.�r�� ����:)ʶ�u]�#?�#�>�hk[󇍦o���v�Z����������b����+��?R��m��Yv������r��tV&��Z�7�$�(�d�B}m�2�(�Hᗎ��I�=8����/�u)���lYⷪ}���2����_j�tD�� "��2}[@�(���]g�֌e��[�*l] �"����˪���YjRs�L�ȵ�t����6T���;�Y�h�q�V"! ���vB��3O5t��2(֩g�S���\wH�&ǒ��Z6MUW, �=�޵���T�Z�I��b�W�Dl���y�1�FI������al?��M�NWu|�9K7$�e)�i��T"�(�Is���9��wV�2��V��"U�4\��(�e T� E��IKы�H�L���#w��'���O�`� ���}H�AL+���[���m[���� ~��%��>O}. c�|xK��*mi/�O�%XHX�k�ᝦCOusmѸw$�HZ�Q���!"�IA��B=����,�&����3���C����l���Ab����2����lI#K�I67��V�F$!��t-w�tl$݌�� d��k{�񢆶�I��+W�ƅY�Qyq�$M�����@�I��M"S�vX����+���)����w��?�����*�~���a������@�u�v����r[j����X�P��ԧ��ϵ�#�� �����.^ۭ�wRJm����=sK���^z�-�;,^!ㇵ1~�Wu\�����R)����[�[�s�w4����+O��4Z����66!"�L��c��?���T4��?�Q��F��+������h���HԱ]�cJ �%p�vXK&yBms���6Ff�c�z���9�Ee3� I �ۛ�d��� ����:f�N�:�)�+�r��E�|ʭ����j��)��N�V�0jT�/��j�P^�Z�&0K8aS�MD�e���:_��A;�_��E% jPl��3%��#��V��������g��҈���>��Vp�p;}�y,s�q�L�Z *�J&�J�!�ߛ��Hi�A2�~b� �%2Z#i��U8t�#�"ӵ�I�̫5jB3�� C��D��%�������Yڛ�De�J���o�� ȍ>J���'��םO �mI���pђ<�EV��V[�������&X�"y���Vcm��M�z����}��x� ��4�'�"��Qb�]��%7�Q5��Fl�9�Ll��S����z`p��xz�SԦ�x�ް^"b"|�Œ.� \�Wx���9�+s�K�&^�� &*�?E��㈡Aȸ�sw�g�����r�~��/�ա�'��Ь���d����VM��q�C7E3�"���U�q5�7]�FR���G�V��cR�H���.6Ln\���lYY­h'� �Y�B��L����!7�qo�t�k�z�c�BtÃ�ݪ���>d�vL3,�Eb{��]���o�i̕����!�یY�[JgRȖ�L�8���ɂ��zzz��%D��]B;�@+&��-�HB`���&��ψ��v� ���q��Վ���I8bպ�?����r2�R͑ �݂�!�����S�!���� #T�b�5^|S��w���lmm���j��� �v����zp� ?rwX��Ȭ�_�uwvf}+ X}�1?��O�AW��j �6���0늜���FYԲ�Q����I�x�|&d |#TW#Vx-��0�d�cK�K{9�9.�m�X;���e���mo�� �T��`Ie��`���2��R�T7�i��\Qv�l���Z?����A9�z�{���W4=/����"�Z�t�n�� �����X�;l��TC����;���8�����iB�����[.�YѪ_Z`��� ����<׀��Ma:��HM�(7�ߤ�bZFa��^7��-;� )4�30�@���e!�"#� ��PS�s��9|+�g-!dݲ~ r/0:0]�^��v�v- ������6��������jR�ݜ,Q@Pe�e�X�@$(b� z"�bd�a�K����s�6�Yx��ꙮw�$M)�.���`�9M+%^��뜄璩3*I3�(E���s !A"���%Yg���>ب�������z�����T�����8;��Hl�k����VD��g#�t:YU���"�'������]�Αci�IXJ��|g�a����W�\9}���_�́4�������3^����T������Վ�� /4-�;cs\EMVt[��_��[[4к��CJ)������Y۝� ��{��'����6��L�Y ����;b#PI��o�ܕF{Uջ�1����Z�i���;�ɁFט:�]��ɻ_�M��$U>o� ���#��t3ЂF��͹>�� ��-3X�(x$�B֖?�2q�+�8�J�s�r1�H�� �De������CӀ�����W���*]JybN;cZ�OT\Qқ�����[g�Dn6 �&�$�� g��N�����N2;�s�c��\�L#Z1�ݺ=U�r8����Q��):8tU�T�H�_��m�(��!z��D�����a�>Ѕ��;[�$��K_�������6�8���h�$���I8�A���~`��5@g�q"��ޕ:�������m6^�t����~xD>��O�Z� =];�`�J����*+p�������pP�������x����H��"���+��+�0޶R5h�U"�3?�3k�rmw�3\m��֟����� G ��&��z�J�|k�ke_Z��b6D4�@T�q68E��v�zR0��r�^f�2�.1���(�����W�Wz:/ޚ��͘��7�;`�I4���a�̢�E'b��� �fxH�s�w�t�"��&��I �y?Ef.�po���{O���4]��vGj#���X�H��"�2���� �e4!$?r��Zᵨ_���*��_�W���O���ڭ�1Q���H��>����ќȪؒ��m���z�����dBJ˥���@��2+��N|&U3 ]�|��IQNj|�I�:�oeņM|N��nE`N�����7���#�H����_����;RJ��8��mb�R����@1,�8�G�b�x�;��R���潳�3>_ 8�W�b0��F��Ilx���Q� �+_q^N�����DI�����?̛�|�ƻSjL�B 4=�;vU K"d$�=�$�I����"�Bo5S��|~�&��:p�Ő/�Hwn����sM�n>N.���k^?��b+� �5X�Of+B����RZF���*�y�cw��ZR��h���]e[S�x��Ô����~��mtr�+��#�W,="��O�a��}� �M������}��W�$�$"-(�r2����{ 3�[B}ι?>�я�:uj-���;���j�s����{��p����>+�p/�̮���ʽM�Q|�p�����OG^���.� ���� �)��*�s���2��{�"M�c��rםK�ܽ�����}�kʑD&UI���}���*U��]g�x�#c���Vdz�!��ƷM�S]�k)�_�~ʼ1��g��U|�3�E�T����44e��{��� K�TJ��!G���{' �u��(�C��KП�ɘGp�: 8�|�=~�4&}V|�T�IJ���i(4}���I�j�������Zmʷ� �M 7�(�ܒXHQ!Cb�Z���1��U߉�T3hlPPR���a{��nbirp 2&���ڔP��Д�o\yl����!���ϱ�+�忮�� �F2_�A��I2�U�xdz鱌���E 0c3�nn�Uq�[EMxM�� T4���-�P��c9�r�!�u��!K=i;T�r�Sy>Z�?v9��(�i.QP��a�@UB����<��s/��ҭ����憈|�c� ڶk[ۑ8��(�;�я~�pv�ת�u���]7{B5^X����I*��hbyx�r��-#��#4�:�-'ZM� ��%s�a�^��d�\O5╘�8NJ���3�u��l�-�2o�� �D�Mԭa�[C�_� [�ZD� [hch�┏[�>`�u�|��n�sE���h�8��ک�HR2MTSuK�ixm�Cxe��I Nz;�����S� � ��!"�mBA����s�~:���G6d������{� <��X�MP��I��^�$�nAE�d86ͅ��Q��:^%"�TO����)I�e��%�8 �s�RQ�6���� �e� �fU?r\$��%p��`��B�h�47�3y�o����]5}���ЉC�n��Q��0�A��tFgy˶V�*�M�^��Y�,|ˏ3ˌ��K�; ]��o ���+���ׇ��u_�a�~�}�fS9�C�b`h�oC��`��ñ��]k���>�@�#>d�u���裏�]����G&����F n[�/�Xk�c�YVb���|������+ b�ԩS?�c?��/^۝gM)�����O�T�j?`_�X���my��\6� ����qG�ЅQ[F��Y_a���ָA���^&5f��3���?���֤:���� �+�l�V�R���������L3��Y��(�5aԼ�j�r\ِ���!B �T�d@���{�!q��?*��."���CC��@nRۓ�K&s�Ή�]q �F�]R} �`� ��q�5! R(F�Ot�E/�pe���Mu?$*�6ߓ٫O�C{ �S�X>a��!��Κn�T����[+4��zÙ�-������yX��Φcj����Z�ٳg�]��ʩ_���g��<��S+~��r[��ŧV;���n��7/����sns��KmDRJ�Zk��������S�3�_���M�uf���Cxs ���0���}�G�<\��l8�o�����t}�f� Ғ�R1�ND@c�M>��s�~���8�k6kJ�B2��Ȥ��뻎�f3�z�!�2�gӯ1��ǥv�3����ޘq� �nD@��D��R7���k�e�u��[kU���}���&�o�2��d;�I�Ȕ5��x$ˣ��f`<�W��7��RyHjr�����Ñ]�ǖ7�\ QpҽCZ�����\�oE�h���xĶ0��<+D�9���0[:?���� ����4�Ўh��?���]�����:�7�*Z����e �w�>vq���+�=�!�u�@.��Z$"9�o_ggѡe���`�f�>"3E ���3<S=��.$���]YK�6�$�660{si{G� ��G�f��,KS醴B��l� �.�,���>WϢ���4�5�,�!"��t�D&hG#��� ����4u6�P�^��-4�>侁�P2�����0 t��� ����r:�n8<B-�`�ѫ��p��-œ�Y�����M�n����8���;FOn���y�_���`M'ώ/3��կ~��]������ٔ���'�'�gڟ�����1������H7^HJ��~����ݸ9�ԧ>��ի�$Nⶤ�0��~��=1/�o�� a�<����mj��q,3���cw,d�Q��z��j$��F!)�Z�-PM�i����%��(�@"T4)%(,�����z��G�H ��%u�C%8X��ژ�P���U�)�dQ$�,�BF#+QA��d�g��~"� B�oYe@����Ӗ�A�<���Aj7���R��'u�}� �8��7��J��_�����)]�'����l�Uىk�9�W�.i6�%T]��Y��4�"uv��k�ȶ_E�[KO;Wk{"{��9m��Q, TL�Lۗw�"��Y� � ��D�\͠�S����?GmK٦{ ��� $�M66 ��I.e�PZ�)�hˆm|#%'����*�,hevh�I����3�<��]t��T�����4$2 ��;juj0�A6��U�:�������$��J�}Dszes4�!,4]�P7Fקv?�?J@KH ����'���w����Mym��)�w�W4s �P4c(��e�럞0�[A0bco�H��d� T*�6��U�ռ��%R`-X�#j�:׫Xʢ|?�࿅�>G�W��X�GknT��oU2`\`�wF�-mq�o\�:��2@dGi�>����u�Od�$�7� Kk�E*�%D����x�Ц�'��P3"�D& (�kpyг�{*� ;�"�e��h�bM�L6��m[��!�PS��JQ$��0�d��0�"��؄���c���O��9�!+��T�?Äj�}d��ߩ7<�H�U>��^1�qF�)��k5�P(���s�n��Y����cS,}�iC�o��dH�.)��_vM�4B����}��P�/̔�g�٦c�b�+�H#u�Tt�8ȋ��=R��jCIo ���9���m�G>���ד"�;7j�w�����;�(+�V ��������h��f#8�\*㽉=���#�u�D�w!I~� ]� Y�p�L�{Eà��z�'2�:��QG�9�idR��u.W��j�;2���d��S>Z���V�>�I��h�H�e�1D�枙SS�X 1�h�ܱ}�K� L)ݗ̭]*!���,���r���4ț����dL�R;1��|ݝ@��o�-����r�|qd d���.q�J����x�T��m?��*�?H<�qB���⶝�Ć�}6����GG�&�aei$'ټ~��[������#�ا�h����}�ͨ�т����SMꂖ��$�"�%#�)`��:�[�u�s�-I�Fy >��Ol�=�����l��{u�k5%O��L��Xd�@3SIP�k�>�a�D�aO�$/����ֺ繺��u)�=�~9���Ug�&�!����;J�̞�b\#��H�8�-4Xbf�!�y�-%B����PQ $|ٛ�T�6�Q*�,p(^f����/$~+���`8��u�"%X%��+@ �:�Y��$�[K� ��A����H�1�&7~#�t�M��4i|hT�� �;��9%�y3��ؚt�l�qh�Ƌ\S�E�j��%L�FJ���I�m�lɧƴw�r�p ��#^����D{ۜ�Oi'q� Y�V����!��N�q�c������y�}Y��>����E'O�$�):�}����B�{����ً/��]�t���?���6�Α(�R`?�S?u#�y'��?�?p��^�R�t�*�� ME���ե��7�w�o�c��$�w{K��u�B;U��as TѪ��Y��W����z&r=R�M]k#v�����q&RDU"@< I��L�Yx�B����� x��x�*y����^�E\�aH�g���t���`C�w��H&�2~4�Y�����$�X��0��� �6.�woX0�%UH��G�H�$}Pe���!A=�E;��� �A���$Ck�56���k���Z�i24�"�F��"8�(�ĵYu�hNP R4�*A��ʿ�L��ؓ���;sq/��c�נ���D^��fg�휻~�{���g�4e Ou���դv��ReW��� � �O �s�Z"ޢ�U�ePȾ�ZH��T#L"|�B�� Vc�|�����D��l��4��)o �?�C+y�E����4Z�Y��&i�tp+�T�{�Vr�eړ08�-�����z����Q(�fo7b��o�ϣh'������nR�0,�L� m)�0j�R ��4XKi;.^v�jWGv� �k�����c�$���*��69����'q� �DZ�mfO��F�����2��_��;h\�Z�G}��3r�r'���oCEd������{�:f��>DdY�㆒�#z��o��o�q��gΜ���1N\sN�,Zk�����cw��w�~�%d��B!Rf^���JI$���Q��cyxV#����R�WfZ#[k�#������Ƚ���J*�h�j]�cjrA�=�ݦ���O�B��,�����@z^�< L�����]�"�T2�)�����ЏV��x���R�G���?�aέH$;�uKPJ��M�DK �3�v������hh�[�K+��k�e��Pʆ� qj;��N�݆�7��4T�`��n�K��Ʈ��"pU �H�*���7�)�=� rD ��4h mb�Ѱ��E����@R�������5a�8� �+~��Ӻ:�`� guy�y�ӡ��Ri|��/���fq{w9LE�;�[�ah�N#MlN���]gx���"J ���� k ���-�蹮�*1��m/HpYӳ��I���4���nh~TU�a�j��K`��}*��)q��� �#���D&�JrZ ��:�1���?������+�,Р��[#%������r}rn,����\+!��<�^�A���#�D�p\7wP}�C�����|���#�H��l ����V.�e%eo�p1䬶a�å�WP1��j! �9LHM���I*��LM�S��nҍz�H��m�\��Уa�)!!הKH��8c=yD |d����h_ ;�8�(�B�X'%�tn�G���4��,�8RX���������K�}a<��ZɉK�������ǿ� ��%��6P ��᫇q���c��c�(Z��F�V�1���a��������țN�K���~hf���J�����.�E�9�Գ��71J�(x��b�Ȟm�˻kI  am�\��:�6b�O���8��sT��F�1�trO��R�us�����ʯ��; �Qդ3@'�'�mq�1�w��g�q��ݑB��Оy�W^y�[��[��<��S9�8�;��0���z��ٳ�ۣo�ފ�ml4m �aA�� ���Gq<������N�LF%5�%~�0Ҙ $"D(�"��.�u�u�a��H`��Ck1�f���>KWA]Hr���N�^Y�a���!6V�]��k=�XH����b���r�bmc#Su��'�^����!��2sE.�)Y�I��뀭A x��|c��� w�n?Z$h*-��C(�����l��H� ���ˣ�S���������5�[l7�.o��О���g�S`����N8���m���H�E6^�8#�����Q���ZM7�$�WPh��C.b"� 6��6(���*׈o��\cy`��`a^X%hg��m�.��P���R2+8��v�� B)_q{Y�!ej{��f��i�+c��V��\T7�2�!�smU��Iˑ5x���}�ȭ�C�zlĺ۹h��kP���~��˄9�PÙB�� B��9���K��D��̓�h�1h7p�od���s����[����Nø6W��t�XPD�\��ٖU�(�V7� �����g*̖�X��{U{K� �ѽ��l����u��v�C�z��v�Ȓ� �`�8�0�J8l��āp8��� �{��p�́�h8� �C ����qZd��!�š.�a 믬M�I��"��&19�L^!]�68�����e�f�\�q;���Z%����&v�[ ���P���C./�羛�1O-�aY���c�D�^�]���@��u�C}�i�44��^��@D��^��m��� ��7 ���Kh������]��$�j���U�&ǺCD���66�c^�Y��(��ֺ�A �Ds�W�sԜՓ�� �ұ���n;���d�~'q�pa� �J)�������������X��� ��*9�c��i�$��P�s9>��|w��_TD������a������?}�^xR;'q���q?�O��d�Ƌ돛��i�������R��%>���m?3��ـ � w��̭,,l!�r����sM�2�3�Ѩ �""[)�<��T�>�c���D�`�T��M�=Fh?�w�{#�.qF�����A$"�d�S����u������6[ �:Jp/~J��f�n��7�xeS�e�V�����}MSt��sLMݲ�lǹ_�$�=�׻u�,J�#�<� 5Vlu{X��*� 3�Q�s����.��Т�PDp.�I� �.�sSDp��^���Ş�d��l�F�G�����tx��,VG����o�V��Nt��C6��k�*.Uk� ���nL�C���[�u���6�F��Lw��I��آ-��I�D�Z�� |�^So��ŀ���,��]^��rpϢJ�n݁J���d��i��C'�l��o۽�c wD���8�[�S�N��K�r��H}%�%���5;��A /T�]V�x�G��7��_6#��x㎢�h�I��J��o�.���ĤV��a�]�A�kX_�t����A&A������!�a�<�Im쐼鑭�k�qd�Ѻ�Uݚ��ϒ4?�Q��xr=���ܠ�DsH�냾���`{*gly�y��+��qN�{h<�#F}��:��v���aD���diK��m~e�)l"yBi4FQU�c�9ְ����CD�]��^H!.�@<�wsha���\?]���16�� Q���Ôm�K�HIa�,q��.���,y�l~a�b� �H���{����pp���NTz<��Hˑ�����Iρ)O���� %p�,�3�Gtr�P҅A/Xz�tA{f��E�^ىE�Tv˰̩��Q-��@I\7Lz�C�3��*�p���6u�o�C� �x'q�@�8���-��w���Z뛃����|��}�ٲ,]ԛ��$n�8f�G�;h���RJ�=�\���#va�/|� = ��碪��ǎ��cq��8��>�P����� yk�������)���̑}I\!�e��\V�ڏxl����������G��#�NV^��,��mU���vu�P$��\)�K�*4��PB6�#�D���1��-<�3�� �Y���5��m=�`��� ��F��s����b-KK�Tk)�:3�%[���-�O����S�u���Ƈ��6���ҡ:%N���m|\�q���C)�x?g��Y� �{���*B �=��ּ՞�9��3[�_x �I��| �1`זCM*�x�0�VvD�LgO��X�R�J�8��%-|��x��H�$��Y)(�=�ӂ�1v_���e�`O�M��������#0���;�t �DS7PD�����pk��� oA�)@k�V��m��g��3|�h��YZx �e��מ)����!4Fn�vI�c���7u��}� u�I�fd�T|��zd�Z�-�k���GE����!�j kh9=�}�w���\?S�$cE%qkw�׌#*��g:�L�2���F�\H�5 � ����@�]q �^Fw�̊�y�,�x�eGK.�y�a}A��|�9��~Y�Z�a��G�|j���^u~����}�F�*@�TD^i��bx`�{��!r]�a���Qo�vDC/��m�L�7� �jx�K��8��7�& �D���|m�}�������Mط�u����c �ZkJ�����~���F��/�ax��uw# cDHX��d�<�JՁ$"�Ї����{ܻs'����n�p�����;}~M$�kh����D<��c�W�'^Ol~�P`� dN��#���4��L��XTP�($El�\~+�pe0HG�V�&D��nL@�4`��$~f�h|Ū-� �����TI��ST�V �)C˗���-��k"&��H����Klxn�܂G�m�S��T�Z�GD��!C{��ǰ=��g*ΐ�ir��4�o=�_fu���)�D1�Y]�2/�Q�� M�v?���m���Wa��;6�!-%�ny�C�ZiiڅS�|9�7��A���$cJt"�z� B���;���U���e��0�������q� ��K��]I���0k�R0!�f��%=A{�����h���{��)<�0����X�x�m���� �il����6�U(�$���u�^2;�g ���T�N�uX���{�)F� M ���U�D@��\3V3���D i�F�ЦJ�ZC��`&��(|������� �%=e����!���.&�D�b���*������d����210�ǐ�n8�=?�Z2@e���"�Z z(›O2mT�u��Q��B$�-1@���H��xB�� �O��f�䈎[���>�H� G��Hcc;�B������HNt�Ix3���a��=7��������f{��l1@�/�M����bG��*��H�t7,�����WC���� �����n[U.õ�d�ߒ���������[��G�y�9�uk�*u �^؃5��$^� ƀI�ȗH5��,�)"� Mb��*��W2Ҋ!�M�T&�`���x.����N`�� cd���0`h�)�����Ɓ6m#�� \MeG�6r��U%3E� Y���SDu�<��2:��z�����_>w�@e��������6H5��]JDl i#QU�\b�R%{͒Qs��y�L�n���K��U|0�b��gv�m�����r ���Kq��)t�����L�B�V��Xڐ�]�E�ju�0"IL��5%��^9>�&���Z�>��U��4e�ǀ$C��1aO|BC�HdD�@foa/%�r�ܻI$ -"j�P��k4g��{�$�Fb�鎩)4�a��sK �Hq� �d������o��]���z^Xv,�C-K�*Ke��-*ȇ�8A�FPj$4�"@{) Jx��B~֟�I�����q�ҥG��8��!������=Y�-� ��'I�*.�N��f�{��Y�e�@%�.�^u�UEԕ��G^=K�j��|x�5I&�t�ܹ'�x��R���� M������_���ݻV�=4��� ��,�XDM��+Zg"����l������7���m@�����r"��Q�z�"�8ӹ�M�s5����nPma�CL�1]��z�󄹇� IDAT#�B{�p�9�)�ѻH�͒�g�o/��N�~� � �N����r�X5ISZ�p��3�Y$*P��*���gu.@ۑx��7����#�x��/j���|4��[���Ay��gҎr?"F�xk�����X� (vD8�� ��ɝEDH*�ݠ��t�' �"D$l��!�iM�A vY� �\sC[iT��y�8�������A--�"�)��W��\�iuq2��������+HK����u��Ri�������z�aK[�9\�p_6%,A�6�`�o%H�5U[�q$d��ҊE���V+>H^�Va��{��lT��N�=�����ۈx*�H����oQ�u]�4�:o�GZy���p�ގ�|h:��Tfq?KD��YK#h��c�6P���s�YÂ8m������O����V~���Z��<�|��N �ұN�w��a����f�ˬ��*��WI�����σ�\>�*�$�~l/Kn�|�gM=6� ���q~Tm=R��b��u��%�ZT%�p����&F����-���u�����y֟�I��I��q\@ڥB>��ϟԧ��I�=�4����� �;&\����/,V�؋�F1��l�Ba�u�.1�@p�� �)b{�>��O3������'�]�a�a��G?ʟ�CBUA*Ǣ��ٿtλ���"W*vS÷���-f �R'׵b�������ޙ"N��.�w��[�;Lk���mڦ43��.4B-U������ & ���ѐ� b��;��/��亊�iZ��*F�&���Cm�����=������Z�!N ��b�.#TQ��q>���û�As��N���2\�D�����ٖW9" 4|cl���F�h��;^uԑu!Z3&t\�3>��d��@ �9�7��f$� !�-���~6���W^�\n��y=xdX����������y��^�گ�V��������»!�Jj�᱊�",-��k�w��t��*t�d�LQ.� +<6�#� A\��#�u�q��F'Á��ty�w�~�gF���X[-��H�ڝ���T�(_s��jS�2.+ X4F�-I$���(�-���5�Y3�Od�:,�W�(˅u T^�uI�J�Q���yE�7.���������D���*�p"7��u�>���J<���� nEƍ�[�k-�`>�D���f�B��Ѐ������ۛ�h��.���`�a�5&��$�Q�%���-2hQ���1������)H����S�ي$��@�H����k l�zܥ�"����{g���7W��j��zq�����e�*gɝ�j�A�FM�T6�O������i� {���5iE��H�$D�OYV��ӈ����YcxI*�&����W*�@2�|ވ& -c+�Y�����8̌��o� i�.ň����t�_cgi����#�m5�IyV���LG�@%]�D �UK Gwo/D��M�� ��0�7 ƌPp,�� ,-��#E�cS���ج �ڰ�-j����i�M�9'Hxk��'K�^*�_^l�tq���=�hJ��Dz��K+^δcz'"�|!�9����C+m�QU���-C��iQ ���O���\���N}�؞-�P7�|���v����ؘ��>���kI��g��@9�����َ֙��5Ҿ�gX���/�O0��ס���Զp�� ��b� h#1Ć��GY��2�� 3����#?� AK��u�,Z6jZ�9�*��IS)C� k�Xl�ms=�O�$N�n>�w���������޻�ږe�]�1Ɯk�����sߏzw�����w��i�㎉�cE�Q0H�!%��DFID�@P@H)R������+��ݶ�n��������֭�{��s��k�9�����V�C�S�v��>C�ý�={���|��c����ݓ�8���xP��կ~����Mѯ��7�Jׂ% ���JM�� �I���8���s�F�[iu�YU?�O<�\�)�g��b������f�W�襝��<`ھ�����r>7rh�DͿ�i�u`m�I$�� �xD�S�9�qmmf�c���71�"{��\�Tc67���Mi�)H�24F$cY��yY퉥4�[���𵊱��@i����^�^E����� ��G�R|� ԨW+[���HW�ԡz����j.�a�JF':�X5��eh/���n{�#��fT�����Px��^lu}���t��~��� a ��d2��3-� 'T��^d��D/��0�k�GJ�{���v~j?71"�u�^��I��p�������r>�t��S=�o��Ι.����������! ��`���xy�׼����7�0b�)Sis��T%p%_��_�l�a ���� ���up�ߩz�"�v�床Q>�|��\�f�����MH���#'��;Nu[%t�a��-�����OZC���1��KԹ�QkW<�Ǘ�)�`O�4Z�o-�J�ģ�g��m_X���vSd��M(��j�wn�Ik��SÐ�g·0� �r ��M|g��=��%˨7d�$�IR�NT<�q�|-����n����B��w�V�UZ+�)W�b�E�_��{.`hԁMv�C���V\jH"�j���|WN{=��d �J��q\k�P�ğM��+��P�!Bl�F�;�FG6���j�����=oCס��L3e�k�����Eyn#��9Dİ���s[�4�� *���%��ZB��P� ��Ѣ�����!��B�����0��{�Zk�%����M��^:}�>��g��2�R�uo��י�̌��&C.��3g�I�ՅO�~�����TOȑ�Ш�^N���†hQ�Zs<0���(�����o������S\G�k&�x�ZqwA�h�Ev�/zK!�ؙ@(��t��l���G�iؘͤB#�#a 炢R<��ox"X7��3 45�?��n�5��W�Z����*���x�4i�݆�7E'�*e���m->l9w�2���> v�A�a# �B���Ļ���h���v���������e��Jfqn���{-6��J���c��]�� �� $��!|_��gb�Y��Y��@w�uW���/��z��8���>T�J)�ٳ�—~�75��m���>��� ���@N�sd��jD�m&ljQ>��_�|�0rƬ?��W3��� ��V���x2�r~�[ݸ��<_���bs��e��ހ�DH����c��:Z�[��>���P-��<}Z�������K4�j!�ī��鼬�b;��sDG�;�ߢ��; E�pxz���c����#w����4l{��NW�lt|)q�yUXD� �\�L*p�D$��p�,u�  �H�0�#�K �sAP#ŕ�-5�����.�P��q�����c ��,%�I��]� �|+ު��y����?`f�����6(RKo�� >�14��Ή�����LJ���j ���#��P�j�[�vx�����&��v�3�g ��0�-_����V�~��H����9v��z�|Cp�UOwU�p�.�t�T�w�M����݌%Z�7�㳾8 �����\�8���h˹>�z��iNo�?��̽<�֖���x�����j��'=!��Q�e�1*�-d6n`E"ɗE��(�k3;0�[>H��{������7��x�(�F�� t&L;���Y��:�'���\̒�g3��v����ׄ�����d7�c����3N�FՂ���`���v_���8��F�<�]�D�����?�I?7r���涚�F���mCcT�U�*݁����u��8f�S�;E�龅b>���W(���L����$�ݭ�ː��ުl��w_��I��F���G԰^�_�˹��yew���R_ m�#��&�wב��8]�Do�a�ת̚�{ه�3T�B��a�i����$��{c$�I�UT1�W��F�D τ��.����8�B�H��"�+����D��d$U�(��Vr�+��j�^�W��YV����0�v_�+����@���m��W� d]p�½�ޓ��$ ���{D8A��D"����w�^݃-~ 6�B%5s�����8:�����l���w�?�&�"��&+�g_�2�DT�ֶݛR��V�����$�i���)ĮÃ7�� �IJ��h�?Cp��4J�H��XµA��n���za���B��\W��%Z�m54�p�R�^⛤,ryQN���4������:�����B)�� � OH���J�ys�u�|�b�k���8������d�J����Ư�F��~���e���:%צ���.u]9�'E� Y�Y�=�H� ޾ON�gb�Y��Y�g#��Z����|� _X,g��,���6z^��a,a���?�j�7�\����ݬ�\��($ޏ5�@j��H8�h���q3���O~�7.��8M�����Y���s�i���>���Լ�*�9.��5��R�o�� 5Y<�|w�Z��<��TZ�����_��pMA<�5��;���^�N�>�m�]ik�H- ���7����N͈ƔI% {B!uS= ��:�aNJ���O�^�����ܚY���B�PA�`L����\n9��ŁSJ� I3Cbl:�Nc���5��f$���E̙��EY����z�Cu*8M�X�+#�p�j���wc'%��v�x� �8-Tl�  l�7 ? �<4�y�@v�)`|�Ã#xk�uf�B��V��X ʎ�+�*�x�S��.B��ŋ"��a8��䐞I�S��;�y|LY��)_),�GqsQu� 4r���t~6X�uj/Y44��2D�c��{�@�P��ل2D2`M-=�Sў��Ӈ�H�̲����~��򢄸�nzB[�)��-���\Q��5�O�c��c/Z~��r%�7>��J� ���|e_9����3�IGZ��g��~g�Qp?hEZ�Ec�T `loHT��q��Ԁ�HQ�)#۴Mel96�?�����/o埗�ў���6���t�(�����b٫#��Q��nh�����fn"�k���]��A���퀞x�i�8��� ��f�P�R�]ipsT�.�&KvM�S�kh2�e�^�EAB\�]$�;Oݴ[gv�_K�+C��m ��rRo:צʚb;b�Pd6܀��G�:̥gNؒˊ�p~���˲G����[ ����,(�p�#4\��D��T��A�KL�k��g��jk��dD��[|F�� ��TEPGt��Y�}D4ՀU&g [X�*�0��]<��^)/z����h�S����&uݦW�~� �J�g��}����� ��Q��D�I�G�2�h�������{�gb��� ��]z^'��ಷ�ġ�;���׳���#3����U04I�誝�� ���~,cՀ������#Էv�v/@x����9�D����B��z�|~D� �z�pĦ�Uj��A��A�-�]�D��d%Wfb}�~��ΙXgqg���� q��n���fs��9���~�F�]M��u��_\���t��|�\*�p ���[�_�&�!�r_>��^9�� C��vU�w�_��A��g?�s~`0��l��Y���^M��O|�A������P�@M��{�����p$�D ��K�穷f�drIV������C7Jnl[��`��� 72� �����o���P҇DW`TOu��`H�/"����E�{�Q'���xke,ު�02������ �""m��&���Ƣ(����ۣZ.&������¿�����'�v��Oe>�@�����-�@'�F�Ҙ���������]����D�呁�E����� Ð�M�P0����ӭꨡ�D�֪�Mܛk�4C &�!����!Fd�_xmm�#qt���{/� �zJ��@9��������V����$@��S�W:�4$�I�jy�V�%�tڝ�j��ٙ��D*�ZnO��t��� �]�Q������b��N�ͳS'M �f�P0�W���ɘ�]Z��vF����$�� �uK�3�`�j�I� -�4Q��ʃ�Kvs*�`6GڤuP�Ǖx��98u]ݕXR����LBѴ�9Z���#[���o��v���MN�i��s�j� ����\i9� ���љhugq���j��~� _8����Y|�N�7�������o~i� �r�&������� ��{�@���~o��ȓ���N�����i���ǃ?�.�8z����J� f�3��,��&ܽ�����G?���-�]�Oh��n0�����?<����S�H"7D��4�B�"K $��Q�xh �������n轼]yE��cy�`�x��8�B�>�M�U�H��r$a��R�׌ �xc9F����'f��u�m*u��@Mu��K��&��jFi_�Z�O¤Y�oLh# ��cY������Ld�u����m����v���bD��Mp�V��Z[�Y�R+����kr�T!�����P�=꣥��Ja�M�4am[�:9���D��������67� �7���$�<o ��TC��%�dn,�zę��Z� ��kFE�1��������-nְU�@�|�[hh��F�S�pa��`ܕ������2��Gʀ�4㩍*ԏ 8�5�MF�F��?ז4HB�d&Ja�-�L�؈i=^�����EZ.��0�Q���3�] �_^��S Uu��d�ц2�yA�W&�!�Rcbt&Z.s�m1I�!9Ej[�!�9�v����7��v* �� �c���Qw7)�8�Ԋt��bQR� ���V��l5oZ��s"�ǃC[���#�n��So ��K$}&M�܅���\o'p��Q4���O�b)�@&��L���A��Sh ��n�k$�&�d�Cf���-7�?@<&��Q%r��Ҵ��2���%�A����� �zYX0�r� !3� y��~���`N}10Tvf�$�Ƚ��L\h�b_UY1_lġ���ES��k<��X�S����D �Js�E�5�t��Ҹ[y\�� �.����� R�����Zj4U�Nl�6!�k�XtގN��/sb3��Q[���� ���ɚιHMa����������:6 ��k��V��Y.�&Hȣ ?�rKȑ^m���&�� �8KPO'u$� �6�wi�F�Z�Tq�%��H� *�!o)zV!���cʚ8�pBF^�[��_rY�դW�?uR�����r���݈�2[6�)G��&m�O��4�?U> C�M�J������5>I��ap��x���<���VmRAu��c�hX0c0#m�x��s�w����>��� f{?�ş&WO��@2i�>SlZ�ڸZRii�[.�H�>�QU���o ��1Qb�ՙq%�E��5��\�ėtHą�Dh��\Z� /j�aw�t�S�4AZ�,�4$Sb`v{m 1��`$THb��c�k�A4'��B��ۥ�q��3�r�t�n�4�Ȳ~n���M�QtUz6_���0�����X�>7-����� �8N���% ~K�:�d�����-�d�4��*S�MOC%>#<�L�����nG��r4� � ДX ����T�2 %�'�N���|��Xpd ���A�}f�s��=D�4�k�+�;���2c&��d&�oO����en��pmVR#�<r|��μ;�Y�/��3��,��,�ˇsN��Uu��>�'=��8��� A�������9v(�w���B ?�¨�n 'T%P�nt�C�%\�;H�i�j�f����=���A��$����~�75޽żã T*W4y��[�9���f�_,�?��WM�����*C ���<��y�V�^񤩖 ���@m��#9��#��S儼�Ɗg��N⍴uE��jf�{= ��d���vq������� O+�I��w���[Ԍ�;�yk ɂ� ��A~�zw./lĉ��ق��J�� �#dd "�gN�)�ՊISCB�P�S�7���Ae�&A� ���/ˆ���ziCf���PD��q2����4���{^ң�p�X�h�P+jx�V��̋=V?6�4��Ĕ�*mq�#���Vw���S���;b��9�?�~`�%�����51�.X"�8���+c�K˝Zܯ�A,d��S�@^�ؖ���:&|����H�T}����غ�ұ��F�Z�j�dB�`�h�hiz�����y���-��y5S�>�2p⵺&i��Hpü��\^� uh�I������l���"a*\%Ձנ(�i�E�����B�RJ{e��;6�)�-�����Ćk�����lz� ��#��KE;{��J�}�̸UFi�WH�Z���f����*�������m�cR��S5���u��N���&�ΐL9)�b����n��S�B4@h4�3���*4� h�l�K&O ��W�H�}Dͼr������{��I h4���꿲���v�+�����t� �썒mM���넫����<%����[{5R`���/FˮԼy4Ƚ:������BtË%�� �pN��|��'M��}��oE�O(�����c�]� ���b�̔`Ƨ��3��/t�LDD��C�~�i_����O�����O۸ ��i��Ζ�kSy}�r��Q%�p��ͮ�!�7����QT;v&R�-M�.<�/f�6��ma�A��c�dA4����ߟ���Lħ�q��!]L� a%[�6�{ieY^/�? �H��/�}b�ֺ�q��8���<�UQש�1�����������h����W ez}mE�u8�­a4K-u">�ҴR� 3eU+�8+�}��}}k�� XJeb��A;���cY0\+��;(Z�P��秨���4��z���ZN<�����jE�y�uOg���-9{�)�� ��T)֞�-Z"e ,n�l/��?نA�5�?W��f�D�`a ���N����K����Y�'S�Q���h������Q��B�A��C w�ن�|s�8{7�HzQ��V�  BDL��g���_;��x4(��&�6:��u��e�5Q�K[�=ǐ��uցE��yTT0l�ſ5G%���C��B�h�V��B��ZK�q�#z�M �*$M��w�x�6 ���N~&Z��Y��{W,{�}\k��~���*���,��{������gx �4<�@���FӬ�0��+��H��mشs5��f��2V�D%�H�7��-�S?v�D��9�����Z�쓟�dk�m:KuC��<.T��,�C~h�!8���SZ�W�8��>��� �;�ir�ƫ�MҾ��cY����i/y�������>��PD?������1�Š�9��heq���-�@mTs��G��������߾�O��#N�0?%�7f��d�xG�HD�@ ��nE̹ �s��J��pJr��*�+)-�x�)�m6�4<�[���������Ҝ�1!���#)^�]�ͼ��G]. Ý��qyi���{[NM��mD�MXx[��7-�//9k�Eˋ�HD���7����p�Ö���������]��S�Dy�#�˼��M���e�C�����uiH/���]��K�(�����Pc����$k�Lr�X�ię�l�jO��/��8���� �e,��"�_F� �������d�����Q����m[�q^�7s�ܪ�7^�����e���@T� �r�K^^��Ҹ�nmZ�Z�1㲶�s!�W�B,�K@�y梔&�3���F�C�S�s�}�6_N]�*D,f_P �p��4���,Kkހ�����}��D��/'�I0���T�_��&�V�aN��DD$� ?��S��p�;c��2ܧ�U�' u�o����|H"z�������9��}ŞPL�����3�G�Kp� �R$T��zzR�(��]��P9_�_���� )�p*T'�͆���C���etQk�"�N�w�D"W�Z�To9+��ā�q����ó'�Fՠ��;�6N3J(r9kBU��l ��[�>��ۓ?W����GWA���۩)�"��G:�����i�B��$�?a����u���HW��BB���o��.,cK����E��#��tG�� ��r7AT�X�p�`C�SpN�lp���][�*�K�E�RI����:�F;����ӡ"po?W���!V�Rd�%�a� �X��5} y }b�R�?�V?9���ݟ��&��A?�j�O���ik�������7�P����B$��L%���T.��U!DQ�hű��)��Ҹ����C��[ �)R�%�חv�r�yL��5dGoi"X�^�FB� 5�HՃ��T[���=Q�t�Y;53Q�ݒҤ�B�Y���\�䇲���^Ƚ1�����N]T48�NXC�<�񘅐"\�W�wּ8������#�C7���2u�?�w��$"0��\�9����`B��.��6| ��Y�t?G;$f�%ZŭO�^�.-��S���h�o�ED�F�2Rc�$yT�k�_fޟZ�P4��K��"L���-Y�8��-�JV̒Z��E/$���V�t�0��A���'�\���yͮ��o�鰝aƙXgqg���?������pgq�#q����x`�0-ۻ�m)(>4��|U�J��5Hp��~qCB�PZXJ���ͧ�h]~���=���A3�f�T�����}^�I1�m��Qg����Q���p� qZC$m���V� ���'�=N,�݉�E�!f��΄��:Q� 8�E����!?w��d�㝢c~H�Uq �+��yc���1a��k�?%�&.��������x� ��$D���R��}��&�r*� v��~�^���U�j����H� �6�����EM�1��h**8�s �1� T·��� �33!�"�L�ֹ��,�&�'����ex�����O^�;�E���Ɩ��E�՞Q���pY0e���v�*eh�L�����Ӗ����og^w��%�T_9 n!]&�Ta;��ma�Ӧ�v!�!�A�s'�sI�r��.ŁLMß���^:���U2�1��ſr���.��X��-7] u��P�qQ��Db�_f���[ �+aN'�l��i:��%Gj�J����[���Af��WuuU��I�H�e�tɆ��1,1���%�� $ry� Γ�8$��F.Fۈ�X�e�����fߪ����z��{�9�yX�4�6��t��B�*ԩu�Zk�5�1��۰T�D3�eB��2){*V�-r+��מ�7,"M;�}^�.��X,5Tn�p�Ȍ+ynʦ�]���}3I����299�)Q"�K٭���W�[{��I�PCö|���$� rWt?�[�C��]?ϰ�8b�g�1�~�dR��+�L�'�/A��?�k�c��vR%Pפ�З�J��`�& ���q�;�)�{�I��p���C@=�c�+�w6���O�#���\�T߈ ���tA?�G-1݂fЄ&��2���]�T�>@%4� >d��z�0-���;)oRSI��N� ,�h��Q;�w=��L4�i�'/���nh����:e;�U���˰���NRL�26��b҅E���S�UE�ߙ���� ����9<0�Ob2��RW*`/Aކwб�!>ӽ�Y��-��kbKpn;�s,�y�n��H�hCY� Ɂ��k�B�c?�� ����7�R.�V�kO�n4��~�R�O� ��a ��S�GKL��[�������L��yE�&5i��� K`ű2��?��3J0k���Bc��H���mK�B�#��Ofl���S��%�z��|xo���r�,p|�PE��6]O���S`־4�[,Y̒����SRPG��1��&�3��LJ�%dh�.��J�{o|1�+P��Ƅ���k*܆ � W�θ[��X��,�;%g��E.�����b��˵�� �h�P����,�}� ���0�/t� ]���s�_��o�R>��^�B��wU����� �����0�?�bta6�2�N�"��U�*� ���˱7_r���T�T���'_����Ѕ��=��k��R>�Y���I��J��g�CʮpqGT�X��{����C#Zf�������72�yP|�i� q���������`�b�ڕ���P��G���_쐼 5\N�w������y�϶s�� �P�5����A�����"u՗���l9r�=��g}1鴙�p�>�rICU-7���s�V�p����{v�BDИن ��h�?~�A������Q�lY��w�.d�,��*q��'D�hM�Sr��4�,�\u�<�#��Z9E��6q�iI�se\:�'H���*<����a�Q� /(���v�-R(1.��}w={yd��ըB��+��Ey �7{:��=އ����O�ڟ��4���ř?�~�����ݍ��m��@�:I�*��;���� 8��@���އ�X����cL�]��Q��^�3��mK`�UL���*�1���L��p0�f FP�_I��, PBRI|ic��J���$Cc)唥���ܬ��,^P�y8 ��W�9� 4e|u�FI|��?�#�h$�6.K�ȓ.+X�P��L �t&.��8�cd=L+�DLS�������p�[ķ&)^o��v9%�]9k:�u�?�� SHL�-�2l�[�W?&�z�4�}�v�A��(aUJ���!���G� 4���+e��]��c"�Ty��@�.R�������S���;Ј/@=�>YB��U���c˳,!�Kp��d%l.����]�%���;���%�؃��';�"�@h��K�rGj�x�ˢ׵?���]d�{>�+}�&���H�vI��vo����N�6|T#��F��ɔ�P��&�o�J����O�$���� t�����x�ywg耕,�8靴����!���R�ٿ*\mz����F� )"��Q�*%���gJ 9NYj � 2�^P��=]>RD�,aw�GL ���5�ۥ+��4 ��<���#1<s�����[椤~H?t��X�d��`���p�YJ������e,UO�6p�>�U�� �b���܊\`p.t� ]軬ŝ�7�|s٥��x� ]�B������z��L�\n���,���({�Q]�L����M�FR378bx��:2 w;b�'���ٱ�/|�^�� �~��诵��c?�c���)�w|����x!9����? y�#�̰f沣��K~ϴ�S�B��"��"��@ߍg��.�4���T���Y�����P� �`�r���C �D,�A����>(�I���Xu� a�q^�Ϣ}���r ٓ B�����/�?b��D� �V�1yJ�U&��|�(䣩� �iݑu[w�-?L��zrb�UVFl�H ~ O��������A!�̙�^x ���� � tTC��R�O��'V|K�O�_YW����".�r8c�~�=����&V!�������*�� &-O� �r�)"*�axs-O;�� �U����oX�d�WfH,li4TRQ�!5-��TN�N� d�jCH��g��@��I���������)B��� �*��R]�u���N�x���~S��Jxiu�HϺkC��: �����!� �"���H�]��P�Q�U_�z���$��k���������Rl�Ȟ��X!N�S�������A�+�p�.�B}2R'��� �~a I�RN+����Z�ou}f����gQޥ�`�#�#���E"Rr1�\��̒��U�V�c�K[/�W�Y7Ux�6���jK�B_''.JCv�,,G�d����bA�����5ѓ��L��)���-���-?{x�ެ@ �H�ݣS�������9�Z<�M�euQ)�HQ�~�1xFn;���S�a��Ώ�����l��Ɏo�*§�`r 3N��$߮Jh�2<0���8u"B�c�dB�̵8>~���yq�ܪ>d���<�:�!z�L~�*>D�ٯxa�"��3yd����A��?G}�|,�� /)s�~!�̹�/ ���p:Z��}�����B#��1-̙,��D�������랁t���yrF����&S:C�!�*�u;��m�m��8�T�@�,�j�b`P���þP8bH�>��̌tX��G_��< �>&�a�fn�;D��|ns\"�����kg����� ζ�֧���t�2��v_������=[��8���r7*��Ca�S� ��������H���`�p�Ka΀R�������� ]�B��?���9C���l���|'�.4����ߍ��Ն��CY�9���W�)����K{}w.��?�������s-�|f������||�^��n��2��� vM�=H�w �&w�>��߀3��9���*���%T��<�~o&���(�����n6��JP��r����[_r,N{�e��,P�y*�t��eYM+y���^�L ��z$�0�,�Dm2�ivnDh�bC������r��M�Rs���������1�B���mrLT*�h$��䐜~{e,��b�D\)��;�o�O���rSCv�ѽ��vo��"Omk� �������C���q:1%�2 �q�"U��ȟ/�|��� /J�^���c���g���%9�KG�'d`wm��h?��:|��؛p�*ޖ�*h�#p�Z�?��捥�� ��勵�F��������?�lQ���"���?���7����ʡ}�7ڕm� m��&�U�o���i4��qv?@��;3�wB̵��m���@}eY��I��3��y��#���b��b��g儣<��ǽ�h��Lt@�xd���=\qS8'�� ������L�ܬ{e�C�YMtfi�x���#J<�!�^iݱ��Z�1�6�$M���g�}w���Rx��� (��3igv���X9-)px^�� w�=������s�cִ�%wio�X�~�z�a���'4�������q<0�Y8����������� ���u���v ��LSb��϶�GzS�Ol���H*���m����&I#���-�DD�{���>�m����E8�K����� �~g�O����ֽA�o�39( ��M�E�R�1 _������i�Ce�H�B�tk政K�N�sU.;h��� ��":���r ��ӻg��>9�*�0���6��C �� �5��#qpI:E�&����tRU݉� ���fhWK��>���"r\� �d0z�� ~�=��%� Gp;�l�72A�L����s�u�w"�LGQ�کϪ�p B�v���ݑ��Nj��١�k�"�L�� g�(�,�`%O��#� W*��(�I,�E^Rܹ'��ؕs�W{�gPd��C1>L�� 6����{)'pҸ�u�����Ł�κ�!τ��Bdi��V!��-:��G��)lX���g�Y��� ���Pn�(� 7�"K��8w*s9}A��d�zG�,�ANQRDȔ3РF�Gs��4˄��� %~��.|� ]�B��7����G�r�̅.t�ﶾ����<�8�����9�����f��xu^���B�k�6�n��crG_;cA(D�qt����Ly���Z�`"bf�y��]�m��i�� I�bu� :�C��'�H�\R<5��۶=�k��`�$�C,|g��e}}-���j�ra.��\ �Uj�k�p� '�3d-��&6�+8�F���aݻ�)��3�Ry3�7w��-{^�e��#�?to�*��n�q��h��ڋ@%���Im9,�����(��Yt6Y����������6��͏���n�G�1�(�#�۷)��a�, Cd쒇 ���-��Q��T5���n���(�ߝw�g>��Z���:��W���UD��d%�Lһ~��Y��z���o���+�t��ʩ���d;Z����;��>����%~Q[Pom��EI  `ͪ�G`�؀�O�Ё�•��om��g��?��g��5�Id�|��:�-<��طy�ApM�õ�(.�7��p5~4�����?VV��� ?34��n�]t��Q�iF���P�Ҿ]�P�\=����0­u!���z�p���ȧM��I�c�fT�� 5���y��>�0Y�HP�ĕ�le ��I����V��:�����&�!�"�ڽ���9'��� O �DJ)��x"�F�uP���p���%�zO���i����X�Rd~������BX�mSY�������'���3�C�>8��:~�c9���z~�p���0�:$I2�q�,�|�x;vo�I�k���ޗ���D�$��i��@9���|3����j���٬G�V������X�,*G�������v�T���N�/F�i�gֲA0�u7�w��z���Ȓ�Vb�D����-���I)�`��l�$� ���_�<=<��t){>��-�K@v�m�����O�A���Qĩ"��Z���tN���{�1SE� }a5?��R�����3�ł��v��e�k%kƱ[g~�t��Lp�ʡ,U=-�)��E|;�w�-���T!�N��O�|s�_������~��w)�����U�Fb��~��W��U��{�?����=���h !�a*%Q�~6�Ʊ�ߤ_iY�bPyI�"��K�k"�^x�Pk+4�܉��B[FPЅ4��jw"��'m~g� z}M%MiH8q@ER�kdM8�I���l���AkƊ%��5��F�*���g$��-�� 2j�(��w����P����-6k��jFAi�����J�f���Je ���F�8����}d+q�Q�$�2��֋#2,0�"����3�X_;`������*��(������-F{mP��i1&ԫVn(����O������0F��^� =yH��lt�W8�Uih���X��[� �t��N�$�ؙߛ3|��K�ub�k˿:ve��58�P�eށ��`u���8��sJ��y��)�L\ͥu@���I�jJA�������r{�,�D��0D_�4f��.t� }�7�if�?��x� ]�w��,~�4�?x��}�3���{���Z (������Vj]� �P��p��E�.�[�;��o�����w(ǝ;��dG���緞���G�_\]���%��s8�?���>> ��d���� ��/f[�y}����]��> �}�J� ��6��u*�\��.A�=O�Z����݂o�y~������K+W|��%F�ad.�9�j8�������~���y4W4L~d+��_P��|�ċ;�U =U0qx��+}6T�;Eb:�|��+�5�K�h��hR�5���3_���F!�>�S�K2�r!ox���D��G햏����"B���'�`� ���(]MS:���?G�@���gd�}���^p�S�(�(�̌�%�s;� 1��Ҏ�uZ�����J�P� u#�L������U�oG$�FZf3���~'X�hS�, 3ww�T�� ��y��1�7:J���TzS�8��g�, �l�[r,���I���Ϲ����V�oA��P g?�]�_W�� �ۅ�E���4 ������NG��������89d��8`���P�* J=,����⧖��B4~po�%� �5� B�^���Rx�l^2�tۆ��hxZ*��*t�!.�v��9��`N�4e�Ć>���Tf�Q\��kX=c��!�*w��IW�v��ڟ5>C� �6�QD{��+��!�/m�7��2(�li� �-p�є��\R��O������҅��2�C�4��KlnJR�A�d���ic��dq0̻�jtE':�4�D� �:q�5��Oi;�"1����o�wb�)�9MTq�E�3�a{w���G�G��W�ݵ����_G����nQ}_+0�c�Oy����؇�.]���'[-� ���w��VM�\Gh �*j>��n�V���V߂d��l�̼D�qբ�h��)i�e�E����3�7T˶}����~m�!.?/���w-;���ҙX��Ҋ��o�����ƪF��C��W�H���Qr�WK'?/5q���8�8�*K��옐,�o��z����� ,��F. ���tmd��Q(S�a�~��o� r�y����cv�d����W�QW֬�Y�LՈD�g��F����Wsx&v�П�U�`L�v�j� �M� ��⒔na>K_(�%� Yҥ�{��jɈ�7Y���� u�㛹��A���}]��)v��<����™�'�Q�.ܮ4q�M�g� �M�!��4��\�>4I�Z#� ���9$��$��'W:= "�s�ڜ^��6]ntt����Xam�%�AW�3�NR�������W{��I��ԲP�ޯ z�ʓ1���AD�Q����u�<^�� ���@SH�F�0�U�"*'U�Gc�s�+�?S�GH�/1��_8[���]�ڛpO����I��a�Ի3��o���T�� yWQ����|Z]{���;Њw!�� �25z�:��_�KGԉ;�I�uL2�`^�d[�#��u�Q�&����,zr}&+ŲR�������C�)�(H �_�^�B��wys�ѯ�53��� ]�B����E�lY~����;�T椡� ab��*�Z�U�����,�B��%�!J#R�l���BX�냬U�4X+ ��������)D�)� 8��k5� ]h��a������:���u��7'ߘk+j�����X�/������s�w�U�"]K�%��:���l�.Hp�7@�p��~���y� vk#�|8�{e��g�L�]U#��Un���� ��;��^��G&"XI�'AR�Ҟ6 ���%�qi��P����^"%*��@m!�k578�� qq r^C@ft4:HV|��,M�s�;��\�:j�>��6'���]�T�Z���R8x��؍*"�:=މ���H�)̔Lj�3� ��� 6K��YE�K���{I�9x�m,��*U��2zL���ٔ��x�Vo���!~ sI<�&t~��ID�Z��=�{�C@�C������#4P�s���|6�ҾP8�ɨ��;�+x?�i��}�c�e��2�� M)wV���S ��#�!q��b�ϯ ���g�� �_�ï�|v,��~���ā �t ͍Xd�g� ���a;���B����T��_�������4\;�2�@��")���T,�iL��}�(h'Q��CQ���1��}FUU3}2i���(����!۔�M����Z�V�]<#f��IJ��Y@bi�>��"�U��aN7!�9�E�^�^��W���bN���;F��~��H�3j��1쮖�(5�q��0h�e���9��3~v[�C_ ��!������5��F?�����΢�A�[� �"te�������� ��+�{2z ��ʸ�uTj"tD� ޟ��3�f��Y�K��ҌP���wR�RoK��^p�$�;����sa�`��O�s��NW|����2�?nyH��'�|f�ߞy �b�p��q�-DWE2� U��|�5��荁n�4�w�z���\��.�5s��I�cf�NI�<{��i�/'h-f�2Q��GVr(D��~�lGH�^*I�1t"���1k��W�����t���8��V�%㌔qy�$ �D��O��� T�μ�x�Չ5�s��6sG2�g�>�ԥm�����>�83Ʈ�lM/�&o��r��Ni�3�1r���� "�E�e��T���.U�$�%���\��l��d.�ۘ�̤����+�фĭ/�s�����Z ��lD�'� �N��" 8MU2@���p}��A2"/�)`�cY<{�!�C'��^^���i[� ��1��]t}�?�_&-�4 ���|��z�(E�)���|`��KP+V��!Ѡ�͞�����kT�BDY�� v=!� �P��8��z���ԍQ2�Dͼ��0�Ir�k�w�C ��u�MM���-*� 3 �rF����8�s�E� �KW�6,���y~ss0{� ]�B�e-�n���;�,����� ]�w�>�%�EJ����ZW�F�a*k����m�g��d�HG�k�̥���������敒co�ǝu�7a�=glp����)F%u.3� �ux�Hy��u��������5G�.�Qf����#:���:����� ��5U �+_'Ʀ�$r^F�Z^�1^_%�o7����~��]/Kgz'����!$����D�F?qF�Jb�@�M�$�@�y������ �B"�8���j������Hh����\:DK>�<Ȩ o��r��<־���=x����퍬��D�����2�sX�\��w<����tA��%����I�N8OaC0އ-�����>c(O���j"����CE�o����/����t�;Vs Z��*�} ��g�|��h*Sk�;��H�-�݁|M�Õܑ|�Y������I��� S�A�K��Zm ���r������k'��M-O�����0T��_ e���6�� $����4��7˚/!���jta� Hd›���h�}�� �g�ԹP�zI0ҰP�GD�,�,�bbJ��UH�3���i��p.Q��N� �i�\؅���>��DE��1���o�1ӽIV/��ĕ <�^��*+5W�ߜ;7d��H���Ym�;�}������ju��� ��k����L��<�~��cfw-U�H�^?YbL� �NKAnV���|��o���#�WGg�u�/k(���W�P����?aˈx�0�!��"�N��>~ئWt���*�����ύM�m����*$�ts�{�e�W�� �+��=`�M���3���lI�J��G�$���9�6��������� �W�~pԱ0����,�3"E�9��cOG�ڈ1��}���eM"I��N�����rb}��z�+aj�ęs�Ӎǁ���'��#T IDAT�%%M����ˣ�*wFS������S�j� �����S�"��������n�B�>_T�  �(%s!Ri���ީY0��u�)M8���l�V�e���2��C1�G�`ۃ3@�Rn�v"��0� �[��r�`%#_�M(v�֗�cuw2�7���mL���D���(i���;s�o�f��b��3P��h/\nl�$,�cKY��4K�R%���o;��AO�����@��dM�K��h���8IЈ!������V���L�)��W�~a�е0� ��gŽ��#�.�ȑ�nW���`��,�?�Md�.p��g,jz3��O���~� \�g ����9��#��/1lD��7������q>v*��rQ��j��<9�Uݢ�D��=���u��(jbz��c,�3�eqY�HڌR7W���^�?w�S���|)��-OY2�v�U���҅�%����������2S+?��[�Ʊ,�1�fZ�E��e�U�D}���������b��%�*^�˥�W:��k�3_Ô�pmï���S;���x��[�E� Z��$�k��~�#c!�HX?���������H=��(�f�5�<[G��ӌ!��J�� �&=�i@`�$|#~\؃� uv��(�x�&�8��K[)9�� 'H�i9#Q�LH�}ˆ}ܬ��<�ٽ�⋎9�D��'������wC�u�Xj=�U�zv�e�]>$m�{� ���[�؍0/��\�c98�0� G�����K߉~w�R��$���Dޯ���l�����?���7;��������3C�ӄ���� ��鮡vD~+������j�����*|[-��w%2м Aښ_��f�/3���_X��&I2�c����d&�wT˻���#���Di�Q]��dc� �@#����w�b����#.qw�ަ/��� ���ۍ�Щ�U�eV�KUd �4n�B������0�媽��� ,H�ng���9�G�DGcB��+��i~yr驉�aW���Ꝥ�<���7��A����J�s�� Y�ә�3����h� W,5��J��Ī�c��z�\�C$�g۵�̃L��2l�d� *��?J`�p�t�D���쇷� h=��Ō�(����Gx}��g�7[���Y1"ca���@�$]�70i=� 񼩫�7������ة�Ùy ����D,�o�/IM�A†~��epB~B�߰ y�p�iŭ�!,Y���_2��N�b\�h��k~!��w��RF5г�[�Z�}�u[�&�>Hv$�^C@U�`g�+c��d�ץ$d��/1��g M�-5�)�J!A��BZhz���J�؟�j��1��N9�o<��Q�2�?-�Ie������ �K��RNE�wC����@0)��l���a{yBQ�An�0<�qj�Q��ʮ绥���w {F1�8P�=232R�P�Uc;)��lK�cbx� ^B��p� ��XR��ǁ�!+udq��%17H���I��Mjr�\�m�  ��Y���I���}��MpKR5)]'U�*���P�[K׀!�A��|a¶v�1�p�YX���vL%��СD�a��u�~�gğ��J�O�rZ�w�|���ۼ��<53A5f xY��lAe� �9 ga�,��9��s��pA�at�� J������&|�N"��f�3g-v���L0ꡲ��އ��!麿�o�#p�tJ��O�`��>e���"���}�b��VL�6�6�);xA�r7Y���5��s����{ZJB<�z�[��Y���[�9�g�QRxJ$<]}I3������B`ă@~�8�V�D�κpD҂��aM�e �d[d����V�u���+��Ev0����O���"��ia}���KP�?���_b���c��}�(�s ��2���-�l��S�""� �>&��&}��yY8�4��η&�}��o�B��T3F�g�b���=<�*�5���Ǭ�|�������mO'2�)CgG|��6�1����7�}h=>Ķ��ܔ�a-w��e��$g�� �N*=o���i��Up�h�1�-tUe%�w�'[>������Y��7�ߏ�> �]_�ݱ |A� ˢ�u�+���1��*��r����Y��|���Rd*2s�#A3r��|;�A�)!���2:�H!>t�����A�I�Gx6��s�d\_�ꋘ� d�#Q©' �� ܀�H�<��n��� ��|�h� /��Z�4Ϝ-❳�?w6p����=������Buq�A��$�A�);�H�߯C2SgM�X"QO|q�� ��krM^]���s�ߤe瘁w� ��e�B�O3�-�Z�N�A~A���ݮ�.����{���/�s�d�~KIq�{dA��Z��!�}Bު6�e�tz2%p2��Mʷ(0_m� <���f������ށ�I�n���< �U���g�#���K�o�u1�J�B���}M���=�2S�VT��|��L��V|���3�%��lt���u�t��6u��rs��N�؎gc����4� ����.��e_JY�� � \�g�D{���{�������+��o����EG�2��2l����k�6WM�r5\��w}�w��:�4*t���l��������n g���c��7���4ȇ+�|Cn�EC�.n2�����Z�;���y1&���o=>L��<�]V76.��D�<�r��[�Y��LX%�@�L����o S�k�6��Ĕ�1���T��w�1�����N�l`�΄�zE��Z˚���}4�`=�Sۚ�D�W@�9�r|�S�cޤ����i%ÊTZ.6���k�zw��v{��u@�G��������@���� � ��V�9,�e'ޒ�{�IC�� ��`�gJ�#�@�;63w� �ka���VB�����"��\ �G-�M�*ry*J����|������M0ӆ�-Hʓ* Ƥ�6�D�d�J��RK�����* j�Mu<]�^��cp%ز��G�1���5H��A-�_Y��v�I�˼A�'`��|�񄠋5�G�� ��M�}0�;Ӥ� ��������6>`_܅X�73��{��3Ǒ2��u���*NpM����w_��'ƛ�+pmϘ��X+ҟl�(;2#���e��KڋN�_8+�÷���e���NRՊ��C��P��݌r��fTxM��Ɉ^Q Y8[���(��g�K����� ��kNz�޲�",!2o �$ktR��쩦��EZ�#��a�m�0�FZѳQD�<��!~:�������ż���Yx�P�(d� �iK0D�h��3�}K�k�����Zn �k�F����=����)��������!PҜ�|;����:�!����M�3�$7�Z�(���.L��N|�� c��=�MoO2q�"���A�G�d�6������s��,r�BTZm�b���PZ~0P�� D��w�g�m� \F�˶�]7�`F�����Y*K�S��L�k�4��x3v���r.�oRC��b�Q�n���)w�ZI@��|Q�A��Xu��Y�4|�i�������?*9R�~9,�����A*H��"�V_�6�[�0�YZ $� �A�"�3��nI\;�)啞M�:顲7�L_��y���x4���5�#�!D� �� �}UP43]E�wt� ��p�UD���)�,B�Ne�g$�G3�l�y��k+�*�)��Sp��`�MQ)���;KI����Agν���~���Cu臉�8YٷR��!��ജ$�Nf���{KQ|H��A��|�ߚ�$� ݼ.]_,���9�n��B[B2*��A�7bT�����h�U�z���s�=3�3p�>���&����dR���淚�/��Π�Uz�� #\����_'" ����銔|��B�s���ĩ.KTo���@��xD{�� v0#G�o�<�r�8^K5�= ����V* GW�7�g�B��T{���9Z ^�ƍbט��񦿍(�|یsA�_���_. �['�Ǐ/�68���������ݻ�ss\&��w�zYvp��*PK����S&,�>oF�ku�o4�K��j䁱���į���H }�@�(�I+�%��db1��֗8��qv��[y�d��}�/\����t���>�{�H³�q�w�]��U)���~<���Ca#��\�o�_��`��R�ʙQ�6zT�ԧ�gђ+z�~y �1��m�ۛ��5v�����B��e���>~�~��o� �bY�L�7� �+F�+i�z.��* zi�7�ɧSF"�"]AI���<�P87�$�0�Ov��}]�do�mN*�b����T����{��E��BYH�zVk�c�B�^ƃ�¸l�d�N�R���˸�ez�2���|�P�^���+���z&���O��ò�"��ܽ�T� "��u'㛕^C>�t�O�D���;�hv��f7I��v��IG&h��l�9���xyͣv����>�N�wU���Ui��N�>y(��8�!6+?��Uy��+II� �Q�Unj_��00>��* �ΒH��y�!��o���,�j���#f�ϓ��>m����F�B������䉷W���U��`����IG����̜\��+P��dY��{C�$d!%L�(���� RIo�ޞ��ʵ��|KP5`"� I"���WK%��є�ā���{FIdO|.�[�BX9�׳܂��fbm:���+�C�S�_��q�Lx*C���p5����3K�Z�U��y��OZ9��I�M&���Pf�tV�����PKpF�������ȏ��ڴu:��,O�K�u�&�-+��=��ȋ.߂�$ Ǩ=���@���+�Ȍh1R��xf�h\[�M�w$�#N�m)̅ND�]d ��k�qn�)���w�� ����? ���� 3蒠��m�I;d`~9��Y�7�9҈�f�8Jg�$�eDI��u��ٞ"�t�)�] v� �W�u���Y�s�i�H�c������L?�x愫���%���ӫ�_�8�\����Kh��Ǫ���� ��~b&o��\�`m\f�j���nhH�'�aoL�PS3��-�E�E�o�U�.C;^)w`]�;��'mh�3Ȍ+s2��u��J(A �a��\�z{w�$�>��U1H��d2ف$θ���i(� �7����_�1vvH��P��g�k�4��}=CSD��%����%���dzm 5�p_��u|�FiO��p͡���4U��`��\�{��{��@�P:*�H@I���H����?�BAŽ�����K�:�K�!�t~~O�wx3���Re�+˹��Ӣf�� )Q��$iF��vY�e���!�g���m�|��Ч���gs����r#�+(���W5� &�0�*tB_���E QsOt|��*3K�Y���D��n}?���R���7��Lٽn� �m�98lRM� �C��S�;�h_*~&Dcd�.p��sp��'�'�������p��z�US����G��J�͇�5囅7��k�@cGⶩT���ʥ�;��E �3�OP!p��c�g�B�8g>�<�R��d�|x� K.:�.�����l.]���3e��i��k&x�ƶ��ޗ�S\8���e�g�N���r檰f��j��#7���X��8oۧ;.1���}�-�镕M�Se�ݺ��ζ$&�<�� �)Cr����,m:۶ױ��^�wAPM �.�@� B��,�I&DF9�g�e�D"��T������* ]�H�:�ʋ��R���YL�G6�Q��˶���o9�?kX���Jڣ&WĎ�K�f�~x����(�J�Zh�t߻*H��Z8|t�(���I����t��\;dG<ўm��z��R����ƣ������'�<"o��3���y��=����%�0�xP�~P�x�aާ*�*(+�͜@*���zYS~e#���Z t��!�Ӱ\�� J�i��?���d� !j.H��c�r�Go�y��1�����J�MQ�{$����ѷ{�������q������ؒ�4�l)�]k����KY$���� ��� ��O3gE�r��y+7_�Z`�#DP�?��ٮ^��E)�\��;<���&Y�Æ�4��$ ]d�JY����-{���q�:���do�X"�b �a�LD��yF��hEX�G|�a�p����� �?o�x7Go/:�B�f��N�hF$�p��0 W�q<���NdG�.JD�?r��B)�uA:eҲ�r,:4���a��j����jT�%����yԫ�9� ���"{�z͸��d���y����*`7 ���;jG+5��\�u?�x�� �\9�|�������`�l�y�J���a���k+�φw���ǃ�->r&�����.t �}i� wƥ��L� �U�=w=�˷/ !zsȵ���f!��\N����?v�ʯn����~m+�!�t�݀�]%脈Ucqا��{����pO�s��\2��-�U�m�N�Q� ~�H/æWgz���9��@��܍7�Z���h���슨���n Z)�8����w��ك.�p$��Q�i�Deo�����&JVI"3k*AJ�i�j�b�Db!p�f������phR���������Y� \� ��m�;���YCf.�/���ǟa*�K�O>�����>��z��z�ow���ym[;YZd%��v�į"G'��kPc�Z�>���"H��3dy��ფ�� �]�|3jZd���;~���e��b�]�3�f����޻�("T� ���zD*lc�S;�ݳ60�6��g�r�����2 ISo�x;:���^-N��=���jwM�� IDAT)�A��ј�>�u凌?}�v9��:)�gX/C�$д�i����x�&R[����pn��Z�2|��rMY!�u^��I�15$ᣙ�c���zZ�H�nY��|{����%� %�3�-69f��P�R!ѭ�QO.��,3�� K�����+���N�Q��@����7�t@����:���&+���e_>߁��r���v�N;2��c���u �U��f^S�(ޭ�>������֨O/E7�����s��M�~�:?1��������9~]�Ud���B�N��h�>�*�'T�;�\�,��i�5��q�+�rV�E5׳��l:"�����L6�P|Sk���� �H'��^rhU��� ���x>��kHԓ�4�F+���X�� ��F_5���߫}��OT'a��T%\����� �� 6WXB��E��;ٕ�=5��Ñ��τu�� �� T�8L�$Dd��-�sC�U9Uсr��d��>�y��\>�~wvu )�R:H�d�"x e3piCa-����$����Ge^���>���0���kA:����� ���IVf/����+P�Fb��^g�˴��QF:����IH�� H�x�~%�v֏g}��l|�k2��������b�k��Vv����!t^[z����$��u�!�����K�u��[���o���[�ty7�?��3�[�`�h��R��?�=���^@��)�_l ��z�2�%y5�?t��$�KlF? N8��9Lە�y��N�kyQ,A��ג��Wf<�O���߈ �Q5H�X "��g$�_>e �8J�5ţS���c�c)׻^-D����G"� �&������|獣 A�&�E�c��m��bR3;Mĩ}Ŷ����� �la��$�!����.��k���+�bݭ'����<��>"����Qu�c ��[!��m���DH�i�@�1�&�$��׵���0u�J��2�k�-�k8 V[z�2$LC��q�@�gm[MI% �h N�� �2���ښ�g�mɹ�P�W�!��q� IXL];�ڤ�[[M�W�!D*��%���2�K��@p�l��.���9�w�$--V�g�-uq��j�ߝ���� ���ι�����H���k�h�ԧ��uͲ:U������e��5��k/��E0a�/"���Pn'�)�����XFD�������G����:9"�,e�VJ�W���� �mz0Ɏ���/��Y-�m>C�����$��ͼvj*�*s�8�R�1������ki�|�M�~2N��91��y�z����ےh�F�R�� �2V�`m==l���/�zJ�� g���_����~n�>�*��W������օ�WտB���G]�+3s1��\=��3Q.�j �I�`{\ Ӄ��J�X=��GE���I%Z��b�i ������F3��~��+�A>�������jAAb�ov�q��u��2��x �T�Յ~�M�-:)���9����5uM��k9�Nc�y��'/!O�+}��� >ے�"ѼEd�8kX���rU�V$�i�f ��VL�JI�W�ư�rKME�}<@)&����i�&d33�y�.ш�b`���,�Ч?���x(C]����A7#��#�N����-�V�.q���S?+#6~\t{�}�����o�{�kۺ�u�Zk���s�5�m�.�~9U�.����B �HD�/��}Pb0) # O��D�b�A��@Y\�J�T�Sg���ٷ���_�m�޿���CkU=� H��?�̇�5������Z��o����������}���BŇ�-W֐��ׄMOi!��(?;�V~`\e!ټ: ?Nl����B�d�0}��y�L��3�憷����T�\#"��m �n��Y�d�N,��m�҆�rljn�E��Xn��!�`n��$w]��Cp#�!NGzIpm]f6�C"�CO!_��XW��@�;�69L�$� {�Z���/���,��[Ѷ���s��\��G&QU3[~���s��W��� _�����DD�y4nD�HII*����[��o7��G9(� ��X4^��{~�����$=�=d.z:��W��z���d�אw8{���o�'2.�l���$M���Qƃ.���Э��[,x@1�"=�o��Q���� (.,���y;��`��%���у��(��d6� ��qd�1Ȱ�cz**�kYF%X�� ?9L��ö�해|J�� _�\hϓ��E��k|���1�T��6���j�t�S���E���)�PJ@�#x?Y�yN]V*����]�e��'H�+����N�y.,�P'��mI|�#�-�پJ&��T�l:�/��Dĉ{��ƛ5��Be�oG���ڑ�p����9<�q���y���-�q��P� ;`� ݥ/k?�4�9�Tm:ؒp�r&?�x�*�,��c��z4QEA�a��]����BX�� '�o7��A��F4�������u�\�i�`g��!��D�+:}��ù&�˪a �-� �f'{�]�n��gH Y�2ۦ������/GxF,�iI5v)��zX;�4���W7�.�X"ɳ�S�|�92���h�q�Ȋ�������(���ѐ�3xQ#/}y$�G��U2 A7��S�����>fa�$tI�g9���<�ߠ$����+��M��=�Xq1 ���1Nؾ? WJ1��c��I�[ ��A�a��A |�+�|gƱW���� ���ix{�C�.���1} �jR=û0t�>����V��SP�p�2�_�M9B�����ZO֔�( 7wo����W����M�.#�� �5Eq ��La���Ӳ�kK����6�T���L���”2����fX������)9̋��k%_e����V�y���-"$Ɍ%�I�O���Ǔ?��:�u�L~�4���;���9�2}kDl���F�&Íy�t|\h%>3�@�Kf?T�?�p�Ň���������m *��}�-җ8�{��(;��± .�g]��+�����ׯ���Ki��*��ZKy{� ���7a^�|��ԛ�2�qj�P�XlZ�f(�r�9¡��_O"�L'�,�͈����А&͗�v�p�q�o���2CCsHU��i�,� m�����#�t��\�B���4�ey��EzB��Y�tYI�-e[�d d�� m&5�QkM\��p�Xb���IKD�yTר���zf�u�G�&ra M�N^�>�>uctL�B$�l�̧8�~&2�8���}m�K�B`�ٱ^��RJ"���RsH��B_m���J��܂3��\�F�`sU+������ %�� ���i'��x�8rUV{�/&'����N���p}P��"��z� ��_ICe@�M�5�0� ��E�dIQ&���W�̰������ 2�2A7K��"�F*���g 䥾$�.d�Lb ��TU1�@Ծ4<���.EyiX,�.'�^%�e@�(NHHE0�.P�yJ�S�Yy�����./U� ~����� �\w-��d�& 铤��'�����\T70F[�����lw[t�8��ߥ��,�� W�}�8�S��n���y���~��;J�����7�6�U�.'�G�7wZ ��4���?�发�Y�[UR� LŊ6i��:Υf�t����k�0�W��� ���"��Z�S���ٹ��9�J,s�G"����J�G)���(���Uo/�^&� pv��%^�du�Ɯl�Eߕ H�W����/�gj��B��ڤ���������e}1RԺ1.)�K�B��\�� a����p�d! |0�����"��ӧN���,���_[V0��jg��8��Lc ��W�����k�������ц �WR�Vňe�3In~Ϟ[�^ /g-+�C�D-t�����ޚ����������HIvE�S��e�o���)� M����<>�+�[���#�.D��J]Q+!�= �� ��,YD �z�*rY�� �~ Izz��'�u�eY�!�YqL�a���e�����-�.�'A��)�����Ӆ���Up8s�@;4R�;jY����4;t���B�� �W�1��H����'2�^�� q�S���݂)�@ײ��Y ֝� �_�9�� 6 Qw��%��R�p'(H�>۲�� /��T��G�7��P7 J�K C�&���l)ʦ "��\�:׹��j����w��9׹~ާ��K)ea�/�����/���Zk?��?����1r��"��G���Åʋ����ס��g�O�'1�I�$�^P�3�X9Q. �K�=!$��‘��I��z-z��*z��;�w��ֲ�<����[���}[�u����L ;�/!�I�M��W�“*ٖ����1�_˸�I��=�%�̷�S�s؁�|1���o�N�T��|�OlCO>F&xB �/�����J�d���߉�ⴝI� ���'� �����%W j�����\Q���AR7�]�t�zq&�=�=�M�NC-R�2 ��!��ʛt;CC/!G�xƼ�a1����s��\��'c���lf� �s��W�����W�>��|�|)�g���g�u�v��(c('���;�J�E�#�W�exNI"�I�B^����e��3$otRmv���=+7�+Pŏ�pD�Vw,��^ �Nx�����| �\���կ�.��7�x��ے�+�tl��(F�^?}��g$�uP��-9[h&�E��)���,� �K��]o��Ҿw�U����69QK]b]�7(^,�n�O\y�r�>q�ن#�.}����1|D@�_��a������?*d�H��;+f����Q�t�K߿ gC��� ��z�*bˢ �j=��K��bW�h�p��[2��bہ+��ʢ7$/��N���,�0��P.&+ˈ0b/������?L[�],��Ec��é'N���I��:�#7a?ٟ)�=hd��NrB}����I8�5�y|���:U=$���M��̠`�2�� V��9n�2�[_�����p��M}�@�t�)����z��+�x^�,s>sn�,�K�qN�c�h� <<���`�1 IDAT|����W}Y}�g����)�l؎\��\��m�,� Y���. Λ��;t2R��]�<���Œ }8����]GP���/; &�Q����S����ǘV��8��e#�&��w��$#�zS� g%vY8Ə��� �<����7��ل�94�^����w��C��/��S�66�͕mo.j7l���ti�/\��9}R*6��=q�t K�ή�Q��i�_�2/ذ�ۭ �7�]�h��&9���O��<�̚R�*�tk���n�ri��-5��d��w��E^rަ�}p�!��&�v���ΫC�@�K4�Pg�D�D����Ӣ��`i-�w7�.+� ����"����i8)�o������ܡ<(�p2|=�?��wh�7�����y6�P2iHj�*. NÏ�}l���KЫ�L>�)*y����j��� �޷�sb��(8n;]T���3�6��n��O�4UQұ�)5ے� �����F�?���X;��B ٰ�P�ח ��P��9o߁=�-���a����� m�?[���+�ߑ��~`��,�܆�Ƭ\CΪcTs��i=�|�䲩�xʮ����qMK�Hw�Ύs�:��gُ��m쓷Z<��9����LE��,�?�躊^��X>��� �\@.Hq�TIOv�x%3踆.�?ϵ$�� PMo 9��v�NI��}��m8$wa��J����Y]������~�-����ʑ�ۙ�\��Ky�d�n5�ʳ��1Ctb��g(�߆�S������۪�km��*�� C�o�� �����t^.��A7C����~|�=�7N�ڙ�=��!�%Dž1�{��-2�g|yN`Ȅ�q�x)0ʧ�G�xe].R�,��@bw�R9�ʈ3�� A+��.E�T��0�!���B��R�'q����O�N�1�gJ(��4�Dq�`�vG�[���>=e[���#�r6葈��;�(�Ym�ܬ?׹�u�| �3 �{��������\����D�_���y�aYX����V����?�v��kV8{���auq�3)�i�M� ��P�׭rh�$�6'.<��_���fC��A��(�8�^�u���k�k�,��\����RH{~����st�{Q+�;5m�m������d�/��`_��>|�]�D5���?A��+�5hپ��)8g�/�l=~��/N�(?#��U��4'}�B���d�C�s�|8WI}˦��-���zp�BX� kn�ee�_NJ�)��w2�:T��, ZN �;���j�G�)��q�$�%1u�W�����|�����h_�Df}��j��c����{�I��?�U����B|�4�ff����׫�,��8I�R�� D��0:-}�Ff����A�$�g� ��|�o��u�� fd���ڗ7�j��˕�{�������ݙ� �j�t��vۏ5�CZy�x�7�0}7�_��{�n\f� �B�&�3���� �Dei�5��x��[.���a��*A_�l^i�SͪŎ .��� ����e����a�}��HU��HJ,�^&hT�D"��*|W UK�&�n]������ٔ1^dž��><�%_7Q-����vֆW����c$�F�㞆^�%c��b�ag�C�f}�� R$��I� �"���B���� ﷅ����I�h=�@����k��T��`���9w�� ˂CьX/P��W��Ē�'@r@��[���A�4�F��\V�08�� ?�<��#�����'�o8�0[������Ou�x�������*�?pyI9�p;���/���a�S�%�x�Y�x�|Cِ�z##����B.W��T�n�e��1m+�on./v�p��JF�-P��c�����+k�ӽ���=�g RHiH��B�\ي�D��DACo@H}2�y�D���6 �-�j�8�����_� _i$`�r�\�D� �\�U4�S� l�u�X(ʒ��O��ߪÿ*�=_�k~j��S�Wȇ�,/�� A�!��T�z��foxO�6�Q�jY����7��������0?p�s~����y���գ�[G1�K�a�\Ϸ���q[9ٕ������ �4�g�m��NJ�/�8�É�&��WE݁�yxT:=""!o�W(w�����oL8������ל=������do���G�D��nRa�˨���K���$�u�LFx�·�y����K'� ":���Zk}u�G �F�#�V�+ #)��i�| ݐ^ " �R�+�׉��8�F,�����"y�Y�s��\����{��=7�I8�:ׯB��9�""`ŷ����n�\�r 2ں\�v��s��;X˪�,2�TU���z�&i�Y�@����O��r������~Y���k�`! ��*�CEm8�_����9#����m�j�K9?@I\( ��u �b)� q(���Nnm�M=�N6|"h���6i*�P�$, I�w�����vrM�<��,��t�>ka؅5�f���9~���Xz�N���}۶�TVJe���AA R���y�z'�+!���� ۳Le�Y$�g�����,a�F����0��#��BV/��� +�����:��D�Ӊ�ء�U�*��~4�>�Z��3b��n7 ��9�$��C�E�9t��]+~ˠ��Y�n��,�m6����}�G Dɝ�f�ڂ��+\�A�,���c5^3^Y���t��HH�ؿ9��Vo��s#yAb;��r?�q��9;�R�ݿ�l������ �+�K����1tא��t�YnJ�7����TaȈ��̄U�����4=Q �<�P&��Ҟ����>gG� dm=}3ؾ���1��8ahv���LA��⽹6�uXaod׳O7��`t<2-8�`�f 3\�5�?;����Dv������M�ˑ< u*�c<З��r/ �NAѷ�|e�\��ӑ.���@�]D�0���!?xE��u+���a\c��t��6����+Qq���[R���*n�6:UBq,� �\k�����e��$l@�O�wOJ��YB � hrL?�v��g� ʒ$�R�oC_-�4rJ�!�.��: �f�7�ڧ-��d@Q.��δM2}��X��-�^Ka���^]���N۵m�r�����z�h$��T|$ע�F�.)�����M�+�l���: Ry \YK�t�ս�؉��X����t�܈:�j��:̘!҂vV��,�,�W2��[��Kɟ�����O�cͶ�2� _;�8x��0�r�<�9�[���\p��5���cO�[&��� -���t�V���R��@D�}$���>�w9�9���� :;ܿ���f�4����3�&�������h:Y���݌�Q��,ݽo<� ٤aBof�/�+IN�z'���� ]]2�/�r;nY���NHj*� ��<��`� ���)���G��ư�^���W�‹F��Y�S$� �5e\ݨ�d�VAe�_^Fč��������C�R�]�v ���KJ�ؒ���@j�Wa�*�l����O����׬�p��n��-�W��'���l�v�\�q�?�w�I��2w��4�Q� �:��Z��y�Y5W)�%���o��j���T[�y��|��>�]�?�PI��o(o:��!�;�;^�� �E���>J�Za$�LR�$g����i�����ۖ3�Gg8��k)� �,�'dNlG������:/����?l���iq:7��u�s}GX�� �o;�?�h��v2������s�럘-"~���w�e!��lJ��� G^����X�/�� ��4z������k��` &�<�0� �BɏR��$���94{����v$_�G}�ka�eز�,����2;��N`���6@U7��CŨ�?Ɂ�ނ/m�H�F��}��q(�j��x�}�N�����c���h�e 3���G�?z6��鐟�s ��I���&��������.{q@P,���ν��wmgNJQ�]T�K)�ı��T:]�<�$C)c�q��d�ʈc��U�acQ|��v ����ڨ�c�R���=�[������ ��]�+ �S���u�fGGjZe�)KiD3πNV���"����&b�-���Uv��) ��I!�!Yo��^�?���o����:�xTT+���B�������',�G>Ą���x6��r���L'��,�I��-�������[�us�~�k�B��\��� ��ȍIb�I�J�S��^T�d-:^�v �2f,��}D���2f�ʇ2)� }�m�7�S=�:�C�:շ�"]d[�>:d���W-_2^��������[H��S��M�����&�9����ΈLwb�Z�`������l�4Њ�h�����޼�L��W&���Rcp�K1�Lk8Y�������{�^H��Γ�v���f�T� c�IS���#��V/F{�t�ƓQ��/�e�Ҹ��c����f@j��^ywȑ��].��R�!���y�����0e� 6-6$�F�6��qݷ/�e[�Jl�,^��|`�l"M�`$�ŕm��`"���h�� ���L�� i#FI���"��g����C���mk�W����Ë{�����mƐY��گoE��o��}��i?2�C�{F�8[b��`÷�_��l �0�:տ?F�ka �3�������[W+V&"��y��j~0�?o�c��,J�ՉY�L�Ixq�d=�-/Bw:�Fr��xo<����D?�|{��� �4?��F�P��2��L�����-f�,+�{Ƙs�����χ��u�#M��Ȳ�D�"GV���rr�/97Q�"E 1�'Ȏ���8"�#���p�!40 4}���j��]��}�O߷֚s�����]E-.7]��jk_����������x���̄O��A4�* ����%ݏ�F_��?��k��wv��� ��a :{�"��q�W����� ��) �P�"����`�s��@�z���ͻis�9����}<:Eqb ��!&��n$�eW�[���b.�'���+�O\0�I�<ѐ2 j�Y�OAۛh �sibxhK��R�L�cr# !.��3KNj��<�)3ŋ��댮�� s�]��E"pF֟� g8��b�{��-������,<�?����w�Ss�3��3|���2��������~_���ֱ�� ��K; 1�h8(ĩL~ �V�H�aNP���s�h����S k �B�҈/��F�e�.�C��qQ�F���G`�_6�y�q\��r���f~� �?���ulC��)�H���'����6V�HԮl$u��+�~ 6�Ë���οNG#�4�QP��r��Z�oi� �)k&��ا�}W���ߧI�֊�ǒ��܍\sZt�Q�v }�kA-R2�!��F�W%:���2�i���/;8���☳���# XE�,&n����$�e��F{8y'���Bf����H� a�8v:�H�����ڧ.kb���BޤT��Q��[a��u�F#ᘠ��<�H�{6���� =�i���BUI�4Z�C1�Q����2t�L%P�RNWsa�����G#�vm5��6��)oR�e�g W��F<��r���ʨ�\�Ɉ�l�x�'�갮L�3ysn�©*K�� "��LS���<�����l�?!KNᜲ���d�pT�A���V�$�1�kl¾�yݺyo�FAil��pc`�/� ���j^�� p2�7L:�4/ઞ\[��G��v�dO�U�ݎk��}��$a g�,O���S���]���@Q%ܖ�WEe{ -Z��LN+*4N�:�H��A���T��H#{�S���v�H�C6m~�+�xB\��.��ȄDR��Y�pcZƼ*�m7�R�}�CSv�D˙V������}��!���p�qG��mxk��g���NM�mt]t���4<��«F�u���̄��9ԫ�.*��m��������2pٺ{�2l* m���uM�ŕ$�I%��"3�Տ��>�G���HѴ�����60���e�NM�T��������G��T�6ܣt��SG�}�R]}���ƳI���^7���'::&i��o���!S��2E~�T���:h�51F���e�016|kx��)�/G���d@�;���՝�v侸�!������G�/��hUp¹Fpb�=�_B;�/��L���HlGBlW��x�0����v�/�}kR�X� �ݭ�����a5,��8��Z肋������rJ*|��v�@�(&�n����`�D�҉~����,��-Cr ��Y�%=�h8<���'w�+e�<�d����0͉p�$$�NMడ�]ە� ��1 i��Q��KH�Y�ԲKe���9��ՔRQ%�Bb}w=M�~���o��g dZN��}���q���0V�|ܛ�;j�ˉ�j��S~“'�L�ɝ�iR�T�����y��4u���Z�I`����q.w{�:?��7K�0w���a.���q�mA��̯��Dvڝ4��'�/KY���aIU� � �ј:����.]T�_������0��>,fr��gnin�9h��m�ǔGl^�|]�Xg��3�� ��$�B@o��>X �S��)��n��y,� �ݟ~��~� �x:�>����R�V�q�:"sFz����F�i��!ȒD��ֹ~3� i���H�(am ��0{���`Eo豒�2Mt�+t�z�.�+S���;����F�������m�,<�ii}��T�Z��:�#9��\u��Q5��}Y���T� ���F1�sIV�Qw_�!�C��G���4aAN���a��Y��n��w���EGI��H��3oU�6Զ�s؊�%!x�1�VE�p�z&��f���p�i� Ť� )�_����_8�����-��H�}��>���Zc�X�AUIY��\O��&�o��C�� I���h<��Wl��ln�$4���t/ DDT�]ZL��j�0��Ͼb�&�yja�Y�^�Eb9�^���H����9�k�o��‹賁g{�X��d�ƴSn�te�7�����@�rƒ5/dyv��"�$CD�4x81�x��,��ʼ����E$ހ����Z�����d+�ݣ��]����8\�3��E��d���T��s�,�C޲l�8�3�08��bb@���K�ģV<-  ��C�J:/\�#�&Pf$�qD�#��ڲ��NK�j"3z�tQ�n��X�����WE�����k��%�ASɒ�U��9�9��r��Z�Zva�t�8M$ ���j2$t+���Dv)i*��_�@������_��M���\q�&r��f��+� ;�.�����ӟ ?���] �va�����s��Ÿ��^�<@q ��в�_�bU��E��K|ĒS!�I"�)@��i��Pɋ+�:J�8G=��p����Xj����:�'N�G<����/g[o�%�a19�p��S�p�X�2����?w����ݞ.p&�w++�L�O�>���wd���K�#�+�̳��g��{|~�CeF`�?C��ɗ�{�A,e�x���u�Hs9"{�R_�R�!�B�t���QG3��a�m=s{�X�D؋X�$�B�O|�8���@$�Z,��eH7�Q����� �%�D��+7!�.VzX����&�*b�@dD&��ɱ^1y��_�};g�2cx�2C"5�M7)uy��Q���# 6˗bnM$/:����O.�{p��%�?���p*c��]O�ZE`MB�󌱡����h���?~�����C"2�̱5��Vj�+����R���2:S�����O4]먴��%�℗:;HwU�A�&�ו�_�{�3�� g8ß �)+����^��{y��� 헒�Y���F�C� /�0M����}�1f��m���'�@���D��@����xíp�\5�k� ��H���6f�ۓ6p 2ԛ��V�=�*�;n�g8���"K�[5��ZR��C���*�V�&RSJ$2�8"�Ҩi��S*wnfw���x#���;ȧS��!A&���4�-R�40 6�2�VC�a�� �\���*S��˸���:���k�x��SYٲ�9��ԗV(�(7zv�7j�Y�mQ�G�li�g��s#�� u2 O��i��as ��+�v�-�z]|��u�F} O�2! B#����YJ�+d� T��T��|A��d]���oot�V�;��9�V��6�er(F�!�E;w��� 81�m@��]H�����0�}�� ��x�)GL�D��o�D����5k{� ]ȎЄ���صrz�G�{u��Քґr� ��xCtD���‰r��˾��!�Q�����9�I|���H]<���/d���b��>%��S���d|�:�b��T�X��s ��9L&�IYdҜ"�S�V�:'Ŕ ��=�Wɚ� ���-c�m"�[��;3��^PAB 1"]�ٸ�D��"h ��֣Z�pfd)���4�u 2 ڸᄴ[\ۤu�E�"�W_iJHN� ��6Pv�@�j�S�Q�Vt�+<�"��t�$�����+�k�t$�h%�=��~��7<�������ɘSפ�? �M;�OOU;�_} ��������}l>���S��悂���zi��xȃ�]�W��2��ȹO�V�Gnм� ^k��&�1�fR�Oh�>�����P2�T�"�Yj�n�-5��!��ȹ�w�G�C�C?�����M���i��M�}�.3�2n���G÷ �+��+����Y\ϴ���xS�3���f*���<�I�$�f��>�t��ᔶ��뮭���K���k�&��s�O1]m���ZXF֟� g��f�f�=��+y"���}����/��g�� _c,[���7�7�}� S4�2���ü�N_ɫ;�ml���I*�.�* ���� ����X�9ˊ!����a|���Ȧ +�2��wD�,���W������^��u@�Y����G������D�����{�Zi$���ȵ�w�V�_�բ���ZHC��sE�~���j?�"WB;��Ie��"E$�*���f�%�#���4�;���S~��P��� �x"|:eN������&�H��Zʋo�uO��p���ˮC�EfM;�m�jѽD(Aݛ-���඼��S���`���D����4���ɥ� qf��Mj$:)���)+��ݨ�k��tf+¶�LJ9�-;�I��M�Y�4�px%D�� ���P�MIR��Uܐ��znߏO��EDb��VAxD�r��Ǟ����Jf�f�������_���iz�B{�:I�6��M$�ܪ:��V��8%�L M���NsD4v�o�����m���fW��`����G:�t֋K���1,#�͖ʁr^�r҄:԰:l s��$ g�=B��|!�J�:p�(�J��:��0��e(F 4T1uԅH�b-+z}��}��S)�P_��{ӄt�l�.���.�5��S ����2��֕9��5իY.�U���KYô���(� �!��ɼ��������(�|D��xf�f�*�~�"vZ�e?�MR�_��$�R{Baʅ�c �}i��Zk��D��)lޱ\}�:����5t��%���B�Hh������Fˉ�>\FD�,��p=-ٔyK���\%�e�v�ǰ�|�v��%6c�?J���;R^cg�B�2��!XB�?��u��q���IQw" �)M�{�C���J�&�R!9}-7s�"v'�͵O�_��/IB�B�J�}5mzZ�hn!N�Y�BzA���lC�C��M�;�V�u�]��c&��w6qnK�n ��®��6�5)t�`u��8��V�R�eN�K#� �ք�mJ�K)EO��6��D�|"i�V r�C��y}�zS�؃���֤�hc:g��w*;RIS��fӨ�v � de�7�}�C��A ��e��$��q1���>\Dr���jBҘ a�r�O�J�?�Ú*8!��!f�t*�P��휟��p��<����6�6��p_8?�^k��cQY��>I�}O�m�1�Jww� I���E�]��y�� }��52"O�'��NF]�_A�x�3�� ��T��/8,2ZUݟ��_Q �-����3����/��"� :H��^�����׭�C)��!.h$zɹ�܇D~ ����䑘\f�%j�ٙ�P-�i�!3,�H �Uj ��E��~-]#ͳ|N�yPS�]O� ��ۚXI3�Sb����+�����N:Z���jq�t�xbߺ�U�*� ,= �:b�%��Cx �g׭� ��(�I��8V�Mo���sd�z�ڗb�lk=�R�zml�Ē]hD{"��ƌ���h{�t�%"X��]��� �焒����ݩ�m+QҔ��� �ٜ'�"I�~^��pؑ�m#�n��diT��D˜��s�;yx�h�j]|4Ȭ�a�{�#Z ����,m���.ɡ�w�<������N�r�kb0n�e�H�A:�+���yS�sp�9hr��U��[�u�${���Q�p��U�M�ǒ8�"[Ns"/�l!���A���]��DS2� `����)��W���i� L�\ /��6��S�*A�юI�]� �'Է�ċK�-�%B,�^� :JL��tXXؔ����s;v�3��kjS���<��1ϩr�| w6�9G.��X�!9y񭁿�X��@D<���g��ʽ 7�K��2�F�������Lii��~�f �dl�D(,�Z�����V�j� �V2.!d�%�9}7���H��|���6�;/,TX6�Ŗ�C�ɘD �,���>�������9��@K(/�l����Ix������_��j^'��J���w#����)M���,"��CtҤ���%?:���J�G����LM~��:�:����]p�_��3=2zMH*�?����n<�Њ����yn�a���2{��}lE.V�e�b.Ȼ�Id�u���gX�� �C�}���Yy qLZ��?���{'�Z�7�2j|ɇ���^o�mw���DZd*a.�>�fr�s��)$����Y�HY� ��ez�݆�8��i�Q�O��۠д9����QhH�H�d�,�`+bbJZ�j���5�d�8��L�nk���UF�W��|g�љ�{UEy�*��0/��K'��Qg�!wͫ40m4�[x̙[��3_����`�r� p��P���u�o!"���fu����9(����-xu=��'�G�We'�(K�#-%RU���Jɒ��?��Z$}O�[_���ϋV��:m�-l�:�Y�Oz��?U�T]]A��beRf>���I~6�9��%ז@'��.\��ء>����b_�@� "e��if����9��2��P��=Ff�9��e����D猬?��p��5���;;;|�� u�R�9������H)=5!yJܟ��3����������bd5X5�$������ ��"&��� �\.E�S��`��v�K*{��2a���mq���:�����:M�D0N.�9P"5E���J�I���z��Z�G��8I ����H�I�3����p�t>�T���e�1H��8�pl���~�� /䲓�G��V�g��*~]$���# Hei߀�Ҥ�LO�"7MS�t��⿃��K�Ҝ�]��B7#fQh` �{�-�&���Iz�� �j��##�G�(�rC�p�����h�~K\��2ݢ�g��f���"1�N1_�%�%+�e�4^k�h+:����� ��݂ߙ� j�&����>i�AN��t���+�7���k蕎���A����]* � �??���f���TG~��t~��yͿZ�Oh�#]��W���Z�@Pn��M�S�*Z�Fi�:�D��Pu�d��T�ds1q� �}]P�մ$(�E�������9«�_����e��=�z��\s�]�7ʣ=�+�(Lⴂ�M7�D��K�D.Д�ƛ2���:��*� ��_���Ys� ��;��6��6�������:�Ğ���3��`���е" ݘ�>��W���c��� ��.M9�_hj�D0g7� k�K�<~Z�� ]H�Z�r����r�o��YZHռĂǢ��W��)"���FfM�5A,��%�^L�1 $�Z�{=wX� ��7� �-��Ӻ=dm���E�sSGB� _A�ȓ_@E �az�t�|�C�=ۀ�'_u�wyֳMQ�4�����ա�������=�_�5πLN�Ԋd�9U����!��I���bJ���VZ.�=�\��q��.���淉u���}�JO��� i_�{Գ��3�� �� ��^�t)�df8�����/_�re!�[k�#����;w�|�_43� ��𧄥�仾뻖1ɻZI>�$�L�.&7q%=�n��գ��%0rH[���z��R���:E.��B���h��1ǭ�D�=�#(���KX(�sM6��L��H�h����ޝ� �80K���2"�]�'Wb�s~Sl�[��+6����H�&��I��j���Hi{S:V �Q��MQ�I��eJ{���7ό-�͜ �k�v��<�Oj����k:���!�a�:]����Җ�J�m`�x.�j.�]Ks6�!��:�������Q�X�c��p� Ռ,�rR� �ZM ��x��ϋ��#��F��#7���2�(�5t’�΀ΓWkh��%E6�P����.H��ކ��.….�bm��9SZ��=r�bQ�Z�� �+�Q�IH���|�ra��6������D�H#�S㨽�5�Z��=�S@Tu�|� i��,�C�i�U�V=%�_���_���/�i9\�_� k(3�Ùg�A�]��h 4I����C�v������zA���7�/5��pkw$ �Ō>�?��S>�<�<� s�j������ �~�F\,6[?v�n'�'�,��:Y�F����s���F�F ��ζ� ��j���`�DRvo'�5�bn/ 7[4��5�C�bΚ�tx�:�j�cp#r�oE�]5�U��n�O��W���:T��P���TR2��R�u���]��j�T���-�XU�.i3����7���(�� R�6[�B��|1�if��5 &�H��D����:���x��:��`����o�9�j�ߚ:gO�Ն9�#�\649��]{<�Y�[��/�ާ�oA��Z��d��Τ�vn��-]������5�%�c�V���G�B�07q�����2�@�SnKW�wU�%��O�6G�_����{�3�z�o6S�g^�p�d~�d�����%@ê�]��i�S�dJotq4sA������Ӊd=� ��㚓��=ԥ+�EH��d�{�{���Nz��j�{��*�w��đ9|����Edww7���A�����Z,���eúf�i�m"��ۍ��Krb&�礭wI�Θp��;=���4i�+�:��p������Za�2x ��N+o ���Ϸ��� A��ζ|g����r��,fV�n�y���IߘW���*&Ɔ��::���Ćc��8�0��`�d�9����$I�Py�c˹�&�0�=���N��#��5Ş�1h��r�\��g��A:��m9���FF"���/��y�Bٴ�s�H��x�萚�{*����ib�2�V�Ύ��B'��x;x�qg���(B�9���f�SM���T�P<�]�N�+��X>� ��$4��2�q��G澖نH��)��ݻ-�F�JJi�,�HK�kjm|��k�lZֶҝ#�S % *�BE�9a=P#�MT��]�59Pk�����J^���B�,4 wBwXo�ӔM��g�]c4Ͷ���Z{��yߪ��\������}l�H �E� Q$+��H YB|�B�"G(F" |�� �Db �0'��o'>�9s�t������������~���s���fΜ9S�Z��U�>Ͼ��Z��W�e�EB<�Ш���׆���y�u��t/#-t� '[��l�=IV;�Z�x�5�w��s��j\a�Z�՝����F�A���N�Om�� 7b��0��\����Z�� ɸڲkCIM\��� 8�6S��FJs۪���)�$X���[�!���� �yx��OP�x�� C-��� KH�)�'��1������|.�:Z ���n g$md�Uj׭|��L��Uߊi��O�[c5�3?�%�Z�4l�B�� j��\ir��n4�W��f�Yt3�w�a��jY�1������<���Ԝ5+N�1z��̄�����'(��԰%�J�&����?��͇gn9���S�7���DZ��9j��.��y� ؜#�7w����H�o�l��l�����_�s���m���TJ�v�f��5��r�8�ɭ)�sڈ��!�qY�Y[�v>�^��.p� |�3�D��,��ل���/���b�����<��SO=�R��ힽ��?�#?�s����Z������Ϣh} ��ხ?skG�U�wk�̊�S6�����z�|��R�k��q�r���1J<�Ԛa]��ꈧ��1��D�S {:�OG���@0o]pd���P�l�&q��4��f���iS�cŷm�Z���F�U䗈�P�N�������\^�V�' ����m�, U՟s& �{= 1& clDj� �?:Y>^�����͗'bD�M{������z5��Se�����!��۟O���F�jyNU۞S��{ �����^j�P%u=�fsB�=�"V-�W��c3�#y�1�7zkq��}J[��ȵ6\��V��./��{�����"� 헷[u2�AnR�����+�*��iF e�Ԉj ӆK0�zj� X� RK�E�e��#0U��,:�t��/;�;��DfnR>�?͛�땉���VMlע� �K��%x �%�-�|��i�T��a�-�R ��e�I`��V�1@�a*�Yg6w��/$)ܒJ�$*V�*�k��y{��"�����W�B���}�0��ڹl��b�h��#4�B��ۀ܀f壹^�t�~����r�#�.Wύ���\$˵�[��Z"K4�6lE��1S4��9�"�q��!}<�����پS���3+����0ƫ5V��v�3��C�k��H�ۍ�AL�а;��0�,�s����R�[`;���owa_�]�r��K-u�֊ڥ�v7���.�&y O e�s���Å�V���k@R������)W�X)�f<����k� jM�kf�Hk� pMH�yN���ZcA��=Vbԓ96!���${) ��"sD��oZyt��,b� r�f�'���WU���0�<,�4��ܽ���A{��������%؊��.���b=i���e�ʽ��Q�Z���v q��MQ���3�R_6����GƓ������� qﱥ�Hx����7\7@(T1B9g>� E�-�T� ��%����9�݁�#��&�*�5ѽy��_��� �\���эh/�� \����hʵ��^y��� ���'g4��t�s;���u?�o�8/��=��V������=0�a̰�y�"����ݚ#y3�e8F.�L��l����^��~� ���`�%-�mH������?�{ҕf#E����Uu�� �!k|�����x��{����S��ܠ�D��˺�#�[���El� ]!��$�:���a�������*����(�<�9q���p�sǧ}+S���=��\I�ANӳ�l�Y�Ԉ$0���f ��!��PbS{�x� H�0+ �ɩ���T��\�KBs��Y$�D���5�*�θ�[�� ��-��� >Nl������"��B�5馸��,�Cƌ�Г멌y��m�5��:� �c�O]%m� ��LzVm��N��ȑ�%�E�喛���t> GQ#�S=�62���Sp���.zu�>�^C�Ct��H #�%O�*��,�4X��D{����('ce}>ѳ3Pv��v��qjkL �MeN�*3���e��H�qX|Է2m.!�RbMܥ�4���Ʌ^j�f��K��4SŹώ��8�uE�<�������g?O�$�#�Kw��?�OM�o᪜�W!���FC��S%]nӵ�g�# A=�7^v3'�x�n�A:�ޜ�-��8n�A?���:�0 q-1 y��%[ܻ�|��xL�hG�Udaó:k�M�u�Ə,�M\\V8��X��@OV�5�l/������VD%� �0F,�d��WW��i��`������V�XZ�gT�A�p*l�\=τ,C7��v���u�����"� �z�4$��.z �k�"��e��BH�����ٱ򲝇�I���J���;'��Q���4���dZ�H��6v�xd�5! �$��]��IE�d�A��T�!�K��f�{��JwޓX��Wt���r�Q�3�.wO��T�Pܨ�H�k�Ţ��= �ƷqJ������w2z������/��7L����$hU��'´���vĢ�F| X3��C�;�/9˩�4w)����O���%��D���B�8�Q;��f���� 6�!���@d�ޯ$����Ӛ~f8���� r>�+�� <"��z��������2̙]���@������k��-�#�Z������q�k}ù_��>6r�CN?�z9s��d�c�FE��R �DH��]� �C���Q�aPdK�]^\�Խ�Ǣ%ؠ�B���4F�����/W�����ѿ���7r/�G"R�����������:ܛ^%�x ��x3�m1c���n�)�O <=����s7 =)���4�V#% ;�iR3{�%����ɄBޏ66r��X�ۚ_Y V����4!�� �E�mr�����=���UIa��Pցtc���p2iВ��NP�!�+10+��� �o�qB~��'�D$�P�z%P�kɕ��<����[��t{M|EC� }�ş^z���]>ѝ*���%��_ �铹 �l���Q�L�>y��H �ȯ�%����o*�h�3�}���cµr�y"�q��'/3\���b���NWڮ.%F��B8A �0?Ykj� �(��?��#��rʷ�WM��w���H#mhuAu�'�e j��xw�/ �͈�?�";���N1��h�VH"�1�l�5�e23�d������� �8�e�TFbV ��E3B�u'�J����\�*����s�g Eޤޝ����9��������A:є����������?���lG�*���.N� ��O*���W\F�Ҳ�gO��, I����+%��',Xj��I��75&w"�������/��, $����i(B�}A�̬�Տ� g�e�t�H� �h��w�9� ���S�]B��oH(χ ���p~�o]��[.�>�$ҡwe���W�E��(���.>6�1sL���Qm���&�w>�?V ��ep.no����q?��Ù�Ӽ� �Gdq'�/ �$�;��-x�s�A���f�j�^�s�z������,�͟Px� �wSBS[g ?��S�4�� " �f*೯-f�� �DjjT�N�F������q�~\��0����́`���³���D��K����$�c�Pq ��k� PD� #���!��##�9[]� �d>�H � ��ʒ:⤔�[�2�qPڣ����}��g2 � x�s�ظE���h�M*�`�G�Duh���N�� n��2�GF�O�=���!���ɑ�߸��H�IT�����y5ҿW�׉�J�T����>�ԡ��ˍ��t�챊Xz[{�z�3D�#����8�}+�S]n��ڱ���g�,E�ػ�8�Dww'G+��d`I��U�+��J[I�%�(uJ��*��I=i��<���>5ى�{�naDf��M��"!����1iXi���i�7� ڇ�|o�?��ϟ��FkU#�{��ý#xMy-r{��;>�XR��c҄�3���_"$$2uN��0\��[�J#[�mL�\�%�Wr���z�7�� �iL���g1���g���9���n�#�2�W��Pp��%м�5J��|U��07��v[k>�����-���c�*�v~<��Y�@��<��C���)d�,�b��f��'3�-�t�x �i�����ͩ���d�����G��1<�dӍ����$8�1�o��_>�~�Ĝ�&$���s{�B‘EQ��I�wMIŨd��(b=����H��##��ˊ�ė-;{k�f��䤝���u���~Z|r!��>��t'N�8��� u��!0��Ǣ@�C@M� K���X������M]��.p� |Ǣ�}=׵�R|�x��)������8�EϾG���m�!l�N:�<��ŷx�s��t��J����ܯY��֋�6oM��>$� }ZeE{�����a��5��"�I%k���@x�L���4m�Fb�$�JE���Η,��>�Ϣߣ<�g"�^��Ε [��9��g]/e�� P��p���W|�(͖��̞r:B�����IdI,=��M�,sMq�t� ����{�E���(��{�_��.!����)��.CVn�=hq���'���:$����+���q�o9��� �l���oT;�wkŝ]݀�_�JVY_�?�O@�*[$�2��y��Tr���qHQ�P�B�xDEw^����#����4� J^#��u��ۭ�r�9�c֐���%���P7`>�'`� ���T��w-s��e&���$&uh�]ih��vʹh��Eoƾ�MY��t�i��+r��dQ�a��-�� �t�1I I�%�RA�㽷��yFAڜ��Pӑּ�j��t�Y� \�;g�|D< �����Uu�^w�ONqѳ�.Β���[?��|f?u��[������z/|�%g����$�:#�RB�%��˽̑���ޫ�F��P�� �x C�<ͥ����"�J�9�dc+�H�� )2��y~� ���}�޺u�P �5)}r�̠5m_{�ʢ�-s-E<���A�1ѩ�3�$Tfg�Y�s�PI�`P��T�!���R�V��ﴭ��� x�R�9m��g���䛬�!�+p�А�{���fD��]�a_����� ^�ۑ���+�[W1q>�B2\'2Fc0��/~�~b�,�0��IL�ْwu3&�E�p"��r)NhΚf�daCzSۏ{�1�O�q�"�� �J�H�+bO��pX8�+:�*62_ْho"�3�G,a��7=��ZR�ͻy8��E3BS���"��]‹yrǝVQ��a�n G��*J�W�'�t/|(� �~n,��?���'Rh�n�Pt�����Kb��,���! �67���L�9��ȟ��Ox O�g�֙$��sΓ0cx6*Ӥ������rƆ�t|D�< c�_/�pI)Hݺ�u�����;/���z�N�x��/y�E��{I I� 1@�m_�*����o�����Eic\2��7R k�[��C�.���$j��=����Jە���ߏ���wWê%��}�DK�2F��V�Aa��v��qܮe}"'z�֘"�H��\��t0��D��$%^���O3�4�r����� J�(��8N���� �8i` J3"+��".)�����0X"�@ m�I)ĻN �b9�PH"��qBF�J^_�� �I�uׁ�E�=w�ƹi=~,�ʫ��H�� ܉�;�M3H��7B����@\i}�z�6�� �/p� |��L[U�~��3.������*��_dֿ�H)u��L������H1k�C�Ck�]��k��ڭ;�����|���F8!��M�$=�� ��gҼ����`��x�Q��Y�V��R�2��e�� �4OC��M�+��1^.ȑ t IDATf�>�8[��~� _�e����u�������M�#[���dfܴT[ ��䈓�fIW���Fz�Q#��"4��e���p�;w�Y���=j'�:��d�Oe���**������R�Y��f`�����F$��XJ�^���L�S�7I!���x ��,)O,�@3��h��@�e� ���""��5J�(9Ç���*Ӿ�:F��X4���m�ٶ�,i��<��ߙ��"?��)㺙����u$Yy�Ž�D�H*~��}H�u���qJ��&y�����D����#L��R@�3>�ȵI��;�b�$>⬒�8H>�(�K@�� �� 垘A��õ�����/\�1ʣ:|�c�*ff�H !�傰z�d����,[�svT*lBVX�]O"� ��yv����0������ �)��z�鎑vQu�AJ�`p���Мvg��yr���5�xt 9���d9)�"ji��� �$ � 9i��&��J�]�7L�������/�����$p� �U@��������H ���D���sj�>��E50i�W�g�}9A}y>�Ek��VF�'�b��D�}��e|b)�'%rW�FQ%��%�#�a�xy1��s���>��?�"] f#�$a$���!�y�Z�ק�N�����&>�pt&���-�|�4#z�5ڍ-��޹����%��F ��Q��YO~)�d�"���7YƐȐڬ^��l=�Ţ�SPD�l���My���>���*[SfYviuz��z��*���k[1��b�?Od&�%�i6o�p�%�**���nc���;��L���Oc�Uݰ���B�߾YY ����C�ЁN�=�M ���n��e���}i�]F��5�H)�m �f5�P̛썋���C�77��k�WW��*5O��e.��`���Ð*A�c+��Ol���x�(8�������v���=���#������WI ����C~���(�<,��󻱐9��s���C 'b��"�I�����y��+�B����PWqC������Ld�.p����yJ��gg��+c��_xᅳ���=�^�g 0|Xe�Ϥo��\y��R����� �Z�~�G��-��D^�vI0�;�rc�u^{������>����ЬE�ȕ^ܺs�7#4�J��ń������_\�sL��>���^#b�\�2��<�X\N/Vߜ��a�j4s�9����Mm�)�*ْ�5�O:> ���NX�h�iC?c\r����y�Pu� U[�d�/H������O:w���~���qp_����*A���i`��YSF'aJ�M� 8�-�T<[vf%�6�/,�@�ߺcw���)՘�X�I��uTU ��4��QQox�*���9���Е����'Ark��^��#p=�G$e_�e��� ���NDf�PGy��O�Lb��3,�{����X/4�F�dA��@e�ϝS��]q�dv ���pbL�D��|�+F��D@4Z�i8�ɏ�����e������}n��_���s>��ު��V=x��w�&d"ug��3bt����ck����~�j�R�7�԰=�~��^܇��$��F&B��b���Փ�s���eO�F*���x�xՇ�Œ��㥕���5ۚ* /U�T%MM�Lcn�����-&nH� ��a�9�P�NX�T�x����h,�AF~���`����r���1�t߀�b%*6!�\�* �^d"-mB��v�q��W���~0�+�؎�J��B׎Od\#�1m�n��u�e�әGjiY��a�# �*v Y��ϛ��5$����l?r�t���ۈ�!2�R��# �E!E� &�`�7����]��Ku�li�SN���s�!*6�]:���{��k��-�ig�W�Y�������p0N��8͍F��`�=��q��KK��O�G�*#�q���F�EZL�?#M�,�?���������#q����G��\�UbY�fm<��V�(/#�ئ���jz�L��Ħ�U�M��j_�Y�����l3/�4ԜD���B�H vM����"�Rw�-/:��CRj��3�aPH ah��M|d݀#�ID�zOs��?��k`�}o�y���z�ن�A8�ڻw~q*}+�� �;A��������ڧ�o8�Ŀ ���Ɩh�5�85m �T�@��r���.q,W�19��m�� �|�N;�r�.Lli���b�B�o��Y� \�;�r~�{ϛ��%ןYn^x�^�,t*�l�y{����w6$Y>��u��Da���f�N��V�[�G���L�~o~���7"���}�8��� \�lc��7�x���/w�<�����9�6]mv�N��H1�ˡ����l� ��P�th{a�'�ۻ��Zk��� p_�n��A� ��[�e������.�&��}�^�V��=s��J�k]c'�j�}��$<�*�V(�*�מ��ܰ�����A� ��D g'�/{��_=�\IS��QD� ���&f��H�&�<�}��zk��r�s�`�����Q�2�zI����m䤦��,���1}��.���2�]�]��Ў��l���_3��˺HS^��?� "%��X�"x�:��+�S��0������޼��#��tDd��J e�G( � 1Wo$�T���@+��e+�i �pZL�W�|N�8p����W�,��ec(�A�+-S�KY�f��[gD�9�lg���^)_�� ��m�D�j���qع+�Ј���=�ڭH�D�u.�cm�Ġ$��� �&�����z�+çu�����x�عS��Qd� ^M�/��P���� Ȋ��p��ne./j���/g>�[����']�zlf�Vx��_����x�eM� u &8$���k������V�/� ��9������y�iZ} {�������x�������.&�!� ]�{P��`E��3܍�fK�T�[��"i���&+��?;��4�O�����,i2�h�'+��޹�_1��C����9��WN�JI]��l<��B����m�֐FRy��� �T�N��L�M�1�]c �^n�R�did�h=]�o}DF$p��F��Kl��2�`"��`���Ikn� ==>am�Bj�p��p���z��X��x97(��*0iLj�ס�_�������d*�.d��<��S��7S��5_c\�Ӛ��d4���@��ئ�X��!�8��8ud�����:?���՟lr�wL~JȠ1�~�}�=� ��F���g!�8�v �"��)>_ܴW��(�ݓ��Ҧ�E�t�/o����y4� 2�1��}(xr�Ҿ:}���UHM����g$�!���!{VUD����~����|��M���I��Y�zՖÇIv�����ۏeǕ��[kE�}NfVV�X��7��,Q���ƌ�ӭc��y��1 ��8� 6��al�a ������`�ml�M-�`�-��-�jQj��(R$�UYYY�y�����'����$ �JI��DeU�yr�kG|k��Ӹ�Y4�/���� �S��(֖���Ի�DƝ򪧐�t�;� ;4A ��;#t�^�"ʱ�ņ�F�&�Σw�ث� [�&�LԺ6���?�G�����t��|����27����CQ�1�����t#�&��潧��o��T��df��O�b:Uu?��Z+�/}����"Yw��nl�ˏO}�S����ߣM_�k�bpL��(���Qp�Ȥ�@��Q�y�iޕ�q��z�s��v�5�l�l��{��6��kJ�7�H)M��R�[���C�(\��2=Cw׿x ʾ�.���[09���@kPyV��Ty�'�N�su�.<�򃉛w���E Vpr��d��^�� ɳKqH[�� �a�f��|8X�9�#.0�%��\, ���`IB�덹W �}�݋��%R����<�0�B5s�1R�p���J�`�0��ƙ��zΊ/�x?Z:�y�ڤ��O�ڨ(�������P�K("�҈*AϪ8�׹�#�FB�bH�<����v�tc8�G ��hBr��Ȕ��4��=i=?-*e� B��'QHnV"���99N �MAOU.'y�Ƽ ǕyQO�JK�>���qꫩ~�2w�A(��ClU~r�n)�yL�*Y�正�{X���2�Y� � ��[��XɜB�^p���F��E�nu�v[@F�na�Hܞ�ڿ���*���%�����݀$<Ce��cS�WĞ�?��+�[�L���$bh��?����7+(�K��^ ���u��/�x�(���P������Q�T�J� �,4E��_��+��<��=��{s6�����̸o/5��ǥ�:�̌�Q��. ��a��%n���Z���v bH�EW��t���:��T/��.B���������OGK�QӕN�f�ګS{e��A��+7��y:1h��u�G���I7����8��ŏ�j�7 ]glC�P��t�7�7a� O��8�&�g�i�Me�l�a8��ֳ��w6��n�ɦBv� �._���0"�DU�9Q�-��ч�B�>'�j}�1[���������l�T[k��sv�R� /��i���CY�R8�Zs��_~�֪f������Tk�I�d<;w����cp��'T�ǔ�� D��J�D�R�|�}{9���?�8P�(:��C#O����h�8�Qۂ9�oϥ�M�B�4$"���8�kH��(�*�>.<@ ���#��z�" U_!o���*K��w0����qO�y��<�J�.`P���1�Q�"�M#8�c�) �:~#2����,����� ��YWu1u�!�~VX6�2���}�Ij�6�{ �e�Ѹ���7M, 7'Gp�J�&�P�T�9���i�8��q� �`"��$��p)RO��Q��H'[_�H��y؉���N�B�VQ�>�8ñ2�D�5sMx%��ǭ[�>��ƭÑ�����p�H{����棻�:��ϐ$���CV��uT��V��f��X/!�&�:��r]�÷6��~�k� ܀ =I��z��<��i���'CFڲ��2���S�����$��9�HM�c�����S� L �E���H���߅��{IuG U!3c�Y��NE2� i�HR0/���W�lL#&10�R��< �ބ� ��ڿx{�&�4������N����ڟ,�-j�@�oxed���Tk������HE�8�v~��Ӄ�YA��s�g��7��C� .];���^DDAS��0� ?�z�*��*��� �\���sb����曈(�t�������pB٫�����"�k ���EO�q���q��G=w�j�� � ���N&L�AE5����㫇�� J��ֵ����!�{u�)|��f�qwnyl�"UuK*����c��#���%.�&AnɅ))]� ���D��� �{�� �Y*���,C���.��ͻ���i@R�-\ vi�5Lb2.�pH�d+��ENUe����KMB| �F�a����$)eYA�Љ�ʊ\��N:Y`A4�mV;�e�}J��'���1`-���o��G�ڄ�2b�ݐ0A��h^�:z�3P���1Ż�}����y�r�=�>�H����#H�y�w�Ӛ8+��foX������-�c���;��oO��<��ӌa-��2�����O�+[��hP2�U�E,[�Vb�����U�i�Y}�BC�)6+�+��'Y�}�I�,$v�e`*�ē�!T���8!.*���| �]�Ƅ-�QÈR��^�HS�� �)��#����~�|+g柴�r ����.�$�K�| ���o��Ԧ��<oc%�ixDY��>�t�o ��O��ć�oi��e�"q���?��@th*�8�$� �ipƵ-��p� �6��V���0)c���{u�}�X�7E���K�щ�5��݉�24��tn/ٜ�'���%��cs�ߖ�Ր�J����Dk��ꁣ��c �s8�U� ����� �~�f4s� M�$6�=L~�,��frl���cy�O�ԧ>uzJ?+�j-���}�;Fn�t� � �{�;tg���*쵦��AUPx�rk����.LA� nx���{��uɝnz���?��f86ؠ+�����1%� ����q`����UW9 b]��ZV7zไoW�3 ����,=��]|qG�'���^X?&���Rv]=�H�fU�k�[�R���1�8�7��ޜZ�\T������! (u�q�j�E��0� �r�la��qr*;���0�w��:� !����� �l�9|���E����4�-��fe��p�����,e�e��>��Z��RB�����Z�ve�@B�8����˃-�F�5'E��J@�X�p��mqA;��D��aI< �9ĐP �J���!qtM��4&����A&�� l"�D�+G���j� R�E�dҦ�¿�i� oQ�TcF�3[�0 .�k?����uaj����z�D�)3�)֚�q��ߢE�&z$�M< ��q�����4}���]��~ ><�<����%�`0zl���_���` ���"s|�f",X����h _֦�R)�����1�s���X���1)�M �����ߪ�{du�}'�eEPi4t�������@��^ث~.*�w��7/�~��!?����F�V�,Х�x�(-�դ5�#�O r,4&�{�<�j�����q�����:�ҽ4��A��D�M l�r����^��kn��]9tY��8���E�v �>��@D�"~�^�n�]�� O���ٶ�~-FF�9��c�2O�<�l���8�0��MsZ�m��_�j�j�0�dE��D��5BDC�2-esA"��2��k�Z��5�����nE+�n���_ij���ǔ�&IU�y>��%�����B��fPYH k���\{Mz � ���[I@PP�8 ��k�PC\՛��sL�;����( oAA�8�~���s��s��!��AC+�4 3,*�HkQ�Ҕ�D����϶$�gЖ��R���49$��љ��U����^N{`�(7u�O8���@��T� Um�N�G��� #6��G0{��8�%u������U��84F�R�S9�f�1���A�DԵ �'�w\7A4 �d��\��ܷj�F��r|��c��`�** '�44��z����Pq���� �����a�j�]��5=yF�a�ZEr�Rs����N��(Z(�q��j��a��� f%�'ͦ�gj��j� ��q一���}R���`��W�015y� TQI�c�VX���8�7�*b�A�N$�‡L�&7C|�w*�4Qu�1w�� qQb��H��.dQ#h� G�P���@�-��l��T�I�����.\�p�DqV��N���_w���� 6��L�s��\g�UFϽiJ4�=�q���☯$�Rn��B8"�h�q���)��n��d�U���hk�ƻm�~̖㭷ު�n�c��~������7����锎�_��'�_YاF}r��%����u���/뚶���tu��X'����Mt���޽Fp?�g���ժ]去0��ۀ�2����w$cd4�9䜈f iZ����~L��Q��� ��U���5��A,����&B�]�RZ��_���A����|T����WAB��'.�M��Y:v��G� 4x$tG҅�� �-��x4��T=Q����U4$H�I��)=����`�"b�Q�V��m��0�!�P��BT{L|�߆���9Z���1��^6|����j��=�b'\�sG2�l]i+�`Ɔ ��ZI��ľ��?���F� �H�;�- W�,ZK%�"!"ݕW̩�Dcf$R 'R#�'|L����� �.�#\�����^�m���oG���p���#p������߳�!1�ƛǾ��WUi���=��.�;V��-/���:xr; v��$.�v AA�J�s�]x���&w/�H��4�o�JzN��7��#”s�dJ�Y< K��:�pG*�=�^�j�TA�[�U8��/��kR�@"���ªrU����� X�.`W������ rv�����&kkv�1x �-o�Z��O��<(<�xBGZ�i�_��ss^�'m�6�`� 6��⴬��W���g#� �At ��ի�ډ�����<���� �m=@J�y��͟��uf���ꍪ>���>^��ǥ��j_k!�*��&����O�U�=�L����Ǜ���C}๣���_z���6��٧E�Cp���(�S�DW0�{��� �@]S��Y��vS�51�nQ��YmW!F~�l�?IT�KD�'�Һ��D�#��2��?m��?q���/y~�����@����y���H�o��I���͵Oֵոқ��"{�S/��7Z�ׂ��M@�-�I�����c�%-��1C�H����)�hq��҈�� v#F���S����A�O3ܓ�A�� ���Ү㬸XE��SE�֛�a��H2h��i��8{�]I\���2�rs�n{m$�Ac›���}��M�C���o��Uw��I�=����tA�uo�q��D�w,����!��m� 3n n�$� 72�`ª����v1���k��@�;�^J,P�����'� �H���E�m�Ƣ�,��x��9�B��X�����ilUv�Ǔ������T�����i�f��(����%��Ժt�ֵ��α��D�W GOO�.�\����9x(|��Fá���k�'OX��E�P�6���ß-{=WM+�>��_1��-q�Ӹwڵq��ka-t�Q *�����Eno�2��G��$t}��8mg� +�_?7���<��D釔�H��L�ױ����թ�nUó��5� �q�s!=� �H�O=�a��W�`� 6���Tb��5�'����""RJ"�/} �����~� ���7~�7NcQ_��V"��#e [��`��D�GoP�%��c��������Po���"�c��w�^U���ooFd�͒T֤��*e�XպW�b|zK��O _�]�K$]�7�l}-�+Ѵ뼼ˇ��\49����t��`�� B�<� ������Zp e˹B|L�s�T+;���o��/��ug�J�A�������wl�1@E�Un� 2��o���Yͤ�v����+�b�O�C�" ��Hr�w�@$��[���6� �'t���s�&I�^��[�����1�@jՊ�U��9]�& )�ډh�� ���m����1[�XFF\U � ~(}A�J ��3��Vk4(��va��G�� �:u��0W�[�x�n_xǥ��K���DYDH��$#DU�}͸�Tڲ��� ��Xl��l�: 0�R�9���Հ$P��H�Ã��� �.L��.�~��L�I��NëHW��؊��ů�|�P��f���[|6U��Gs�oL��f��h�Yxv %��7��D2�`4��K�X�u,���_A�K<K�xe֬�t�'_/����=�'��o�S��J3}KEq�r"���#��$��Gz~��u�q�n��I�WTq���1���e��>��SR��ՆF�M0��۬Ç]� 0���hħ�_5}\�=I�ɶf;�_�5��Oy�Ee��Ҡ%D�z�Whl�����#�`� >���c� _�����961f��.����ow[�͘n����`�����0�f E�y�oz�^�ѭG����^_M�ܺ��c)�J����U 2�Th��tW�.�':�Zs�^xa3"|�av��}��繯�j'�R�@ɰ@���'4�mQ�{a!�q� bךm����[�gc;���,v�%���~���Ӻ2��~P���ۖp��0`��)��7� 7Q�Y��Z�5H�9�ɤ�l�%ڵ��dxC��/h�L�V�D��$i�I�����]Z;�fD`v9]!�p �\C����t�i� ��]�6��֢�94�ZD����vU��:~f^b��WX���`���|���l D!pob'<��� T�v�a�8m��z��o�������X��,:�b�m OԴ�=O�'�*�*{�e�Q�BDrANJ���&J������-�UA�z������RED/�%�#n�H�N�!Hn�$�`�H��<q�[C^ϋ�R�^�[�h�����s���AG# ������)i+�ĕ�MюE��t���� 7Ѫ�q��(NAz��,a��N�k�����G���4�{��;��}�At�����b?�x��>�@� -"� ��,8R�~�ȑ�gv#u?�ꎠ�\o�l�Ђs(��B���j�F���շ}>.��mߙĉC�u�t��Hi������Z\{�I�:�}d�<�6���p�MD��u�c����A��j�z�;.�PM�.ϿB��:��؅!�!�ׅ=��� �$b�s� ��I�!i��>F�'.�#FH�h1���*��L��}��.�ŋ@ �h;�-زuH������p7l����Z���h��ϐ>����]��t,��� �p�iR��;;�2����O��#}.�R�Tx���?���m�&-N���|��V�|�����[h�g��E�]�V] w����h��w {�!\=�����$ŌkeK A�PN������Q�a�Ǒ�ľ;����9� hau�'�Yx�9���յ~�㽱�]��z9�V"�k7H���!��ǃmB7޲wy�G��|Pѩy3�����3�Y��+_���`v� ��K��G�����^�f�R�ų�D����߿��K�<�ˑ�$e�dLff�zЧr���^���{n4��D��*�n��{��m���D^ü�㷵��� ��8�Z���Q.&�[; �5Cd�ísHQ�hjl�2�fїk�4���{{��k��,�8�ȉ��O}p�q�QMYQ���v���ks� +�S�^�,4����5 Ʃoi��8�.<�|~מ۲G8S���K� ,-�L4�%ôO��=�5I��GB5�۟*��l1�o��$U�^����NZ��R��Gis�\���$�6�9���ɛ�X:(!�M�a�M�hBK��I{����* ]K�6�z��N��S %�2sD�m��.$?�BN�*�xSH n�N���?�C�j�1�K�ɶH�ۄ n{�IcΩ.�e,C�r䬂4ֵ�I�Ǝ��'�4tE��䪂 �/� �#���v� "�^p�*a �BXH q2���l�jq89�� ȵ1v�6�|��%�tP#�kc �l�C������N�PT�a��M|��9�'��Ա���9����|&�8�h5j�v"/��f?0�o�j-�$KKK��A��a�}?�b�+�^D(��8Q�zQ�c8�4%-'9r�k8a2����8��jw�?|��kŽ!����G�V}h�؂�� �"�RJ�̰�i��\��@��.�yv�$6��]��l��� s�K�.q�4�O�|���w��o�p6����hϱ��c�HbU^�}N�3�5� (�6L�2V�F� �ܭ�f��t�R�ۼ���G��S���0m��8d�>F����^�㽒��A"'����±�hk��S$����V+cx^ v[�,�DdAO�]�>�ˌ(�;f�wF���Ø|&��E� ��)�s��J�A ��ܤ��K���S��� Cg���ǧ�\巚=��0����f��U; �,��l� �_��}��|�$�uڲ��TS�� �$�H6�u��5C��B���Uu"��n�[n�YnJ���M���ބ[ccN@��1��y:�~Ȱ��|��NC0AicQd���D��՛�׎ڃ�s5�A;�m��Ry��^J-���Q��c�� Mk ��d~���J���98O\���F�Z�em ň�'p�J�Jxx���W�i����@\K㘗����bK��6�H s��6ӂspkD�\��P��գJVL�c�j^x�~>�=�H��u����ߕ�On���uj7�-�/~+�.K�ڷ��)���‹�i,p�@�I�-���E4�Ģ�0[:m�HY5 �&2i�qz��{�!I�O�r�$�ԡ���^�o�6�cC���>�Ξn� [ V��v�'��V����ʌKrڲ�i� Fb���,�c�А�D�J�/�(���^�b�Ț�K�$$��/��:@f�Y���0Ё��ZL �k ~9IA���� s��eش���Z��k�X4�8� �]�,�Ld�T��6�������eB�Z��@�k00�5����`@�j�(�,� s�f�4��4S�Yߦ�\��(��-�e-�6�y��~sQ�B��w��^9���Ϊmwů�R��~��'2������x)�Z���/�&������ ���v� E�P��}q��h�0�\�m�.hM�N�|�PY�`lǜ/���z��|!��n�X $���=�6�]ad>_�CIP��u��.���>;�0�LK*���O\!l��h��V3��'?if��ֳ����կ~�N�o� 6��GD���۳$�y�����3��έ�@�F�H�H���,�%+���a�����Ï�6~�9v�X����, ��%Ҵ$�H� �kw��ϩ���[~�Y�M5��@� \Nש��}[��������?��?��hqI � � ��AЋ �ˬ${ ��m^��o<��ӧ��m&��';�Uh��׿�u3k�x��ۤM�f��N�6���7j�2��H�����v2Ԍu�z@�q2���R��ͦ)�u� QKy&���M)�j�E�hm$R$�QF�0Y�d�H�>:"��-�z�$Uv��o�F��;|d��@��RJ<������r|����O�w�a�$}�s�kC�t�Y���I��g�E� O�N����� �g�B���NY��]3�z����ַ"��8�Y�֎Ƅ+����?w�3��:���Y��3�k�wd[��w���D�ծM��A��J��D�"�����"ӣq�1�����WD��$� �aQuާ+�Je݌L��&�����^�7��{7<��)Q����{ Cd�z�ū���?���+���R�0��Z�-��/YW{Ki�k��}�Bi���9�n5I�����[9���+%������t�#�X������c�����4�+�W����NZVp�����<��Q�Ȃ� ����r�ߝl���dQq�P�X�Td5VS=��x���\����u<��_��������q��'�o.)�3���h�;� *�ITp#uF�{J�Q�7�d����8dͶ�n�s���m�|gJ��E�F� ��]�0�7�PCU���IX�ek��#�"BdX���\����^b*�A\�JRȪ�`{p-++�?2뙭�g��=�wؐ�w2�޲��H������<��4�6�|�N_[j���K�>j�a[� . .��'���D�j=���v� �D,�+̡Ȏ[� �,I����ط�y�n���m�O8�Ao��Q���^�j��������` �m`��G�������#x�7�� }��L�X��5��o�Ƨ-;��Xp��,���$ c�����daP�?�l�iԠ��X�E�)��!�yύ�{�)X2q�*�Zn|���I�j��*� ����t���n[�RDWX@�&c��{�� �ث���#��rŤ�q���S���eDĩ�����O~�����} 3�r����?��#�|�2rw��n&�����m,�"pj�^����4]���M�l�4�5���o|��%n��w���4���뿾z�*�s:���\k���>.os� �D�H�TI�Y��մM��-ϳ}���������NJ�FHV+o+(����� մq���jaa�>�͙2t�.���a�*� . �^��"��r�y�IV��J�[;�x�:S��&L�-��[�J �Rd8'���WQ�d'6;�͛�o���8o�r�mv�U� %Jև�u��H��L�#,5��浚���ar'�YX�F��·�ѐ5�(H�����K�gЗ�9"�F���p\����;I"K#k��C�8�$?K�u���*Qj���t@i����2�pJL�+�"k�a�c;����F������H�R-( ��2��a�êT�orIP�����y�;�Di<;�ћZ,�N:��R���Σ�H1;���<0�2�a}R��h�n�V��Z�����^W!��՚0���E� V�ê%�q��L���S:Yoꑣy����VW3�� ��w�N�V���ut�ov<��1�S� �� Q�����q�qj}�����486� �:��c�Qo �� ����w��3K�E��Q!�ɲ1Hy�Z�-3d2�\�zM{aɲr����`p n�A�:M��A˺���}ٵD� +NtJC�4�Y�ۯ�Pq����@9��䴽��#@�� Q2:r?�x}ҕ��M�Ga]MSW�p����0�+�7\ɧ(�9��t�����a�I�^D'�� ��$3��j�('�5s�}$Mq$. 1Ps5\�����v�a��8Yv��)�/��.��Ʀ���w����cw�v����/|�6���`���O&�I���F�i���q��s����?�7;�~�� m���~��@�u?���*" Ws�fz�VvI�&! \�"��V�NU���өg�l�ɥw�-�G��%]!� d���R�3�8'. (���߃ǒ�u(kg2��k���U��D�;�Ip���p ��-c0�\�%cfܡ�W�b�/�E'V��h��k�c�'�g�~~�����ux6Ձc��PE��;���`hj\�b��x��� SP�:)��0t��4��/<�ik�f�;>�Mg#.����o$*t�#Nu#��ϕ���CI�S �e����X�OndR��I���p�mN��ljM-F�� D��L�*�`,M9�\�����Ȉ�'�Un�H�dE��a�x��5�R� ��~��!x�� ƃb��^��Cpd�s� J[#y������@Ђz^\ĎR���d,��/9i���zr����i�,r�=���D��=�h��Z�Ѭ�0�daP���4 �����眇���Q�-���E\L\���� �a�(Qr���p�B�����6Q#��G7��x�6��#�YL � ��pk$�d�2V����u<��F7�K��]��J`“�@?��/@(����c� p :���y�u���n��\���e�� ,��uy��NY��;|d�D��8�}ߎ�O<�ć���T ���������ڱl;��a��/}��i��p�tӎ���z��� 脸���z�Nf���>����B��:uv�{PkM)���1[� ��?�au/b߈�����h?k(g ��f��ȓ���ͧ�tx�aFi�f���:���U���8/U>�A�(&�p}{���`�;�I �41@�i#�Vc� ��������M�V���� �I�Eb&�峿CWt�n��f𞲥��LfF�`��t,�Wbv��fFdl ���dȩA٦�t�:J8T�����GX+X0�p�EE�o��Tp�s�㰇�~d��A�j�1��`X�_$Z�������ÉW��, ���ۻX oY���^|Cͭ`�l�%RAֺ*�rI �q<"pE� 1����jU�KW~\I��0�M�=�A�2-��������O��D%]���o��r����4�����ל9]�Y�.�&N��0;i�E���MA.CR�je��5���A�M Ut-^e�p�**�R Pp'�&^-��Xs����3V�J�b��u��k�$~l��0r�c��"�[�)ߦQ�tRrX�ta⚱ k�Dm���j�5f�":���W-˺�Hx�����:֦�A�,�*� c��B��<�}1��"�S٤��a�p����?�契5�0�������z{*���"�Lk�T1|�&3Cﯴ~2e��1��ɳ�;�p��T_lHXm�E]�F����|�˔��G�>�+/ɪ�|0@�܀�$��@�e�ZQ�}D2���q�� ol�לB���nEw�`�v��Np���=[-�#�<��"��2�f���}mG���Ç�����'�����j�Ǫo���{�d���i ���>M��������]璉�-�׾���E��݊�N����� H��x9e`�gp�;�e��舽�;0�(T���P-�C)�ae,�����/�O����j�A̞��ş3$G��^��}Z�ˮ8U�>�J� �������L���u�9x��xK�TS��&^��y�\e �����x�����[���� ����� ��t���^�3q�-�ԙ��8txrS�#�d:p�?�>�>�N�!��m9;�9|Ks�@� D_�>�˟3u������c�g�>E�Gƻ���V��ܾѕ����X �:��L���VSFT�z��6Q����r]Q�R.O����L@��(Ɣ4�Ƒ��[���;��Q�L:|ګ �ֶl+sQ!�m&h��@.zl��Hꍈ �y�7�� �`�V`�M�ߌ��A�"�� T��;n��Z�G��)�p�s����u���9�׬+�s"UByʼ�R�Χt�s`��L�Cg�f`��ٜ�q�N��#*��9 �/�A�f���b��N�p��q`8y�y��/���SMh�%,`h�Lh �(����(y*�bA �4q>��|j����W�>��tZ�98�M��f��.Y�2�Y���w,)�:'��%��L:_��i�` V�#�{6,��k��5��,��M��1�30jҔ*�F���~<�'��wax�$+9�9\X3���_�i��۬���PcDv�%~�t�$�N��j�-η�T�Zfu��ᬠ��Li��� �n f��i�w��v��#~8J)9g�W�W�MIw���\JI_���w7t�>,h��8~�_��w�ے-%EU2��6oL�5�!�ݛeRjrG0�g�{=�}��&.��"l�>��L�̾��o_�|��ۥ�k�P����S9���{i(�����5�n* ��K������z&yT۾ێn/w�~�q��⧇�[O��e�����~ �L�zA�0(��H�bS�d�*�_Y��(f�0�K^7�Q���I.��uk�:�@���ys f���H���w�zn�ƭu�'�s�����h���W �^�F���_a�)ic6�m�A�P@FK�G��@䦀vR�Ϛ�o9ؔ�Mѥ�� �>8�~*�D��N����z8��^�V�~l����]��Y/��c����U.�u���F��z�����ox#�����E!S�ò�IE5�*&� ��1��B��(�N��p���ʸ3]$+nAo���^PQƍliԴ��1��$��[=A��E��E�Zs �Fj&B�N�0��=P��]V�R����bD)LHA��#�9�Q��(ԭ"�n���;�s�K��ɆY�qkw�Z�5��ň+'�2x� ���} �/�pL�'��a�׺�Y�1��B>5Cͫ2S�S�d�T���������S�Ku�֌O*kc6�5�SQ�Eh&t��pHn�����!+�w�bIsv���������#�v��v�᣿���>h��@��ض䜾ɿ�����L~�Ż������,wI9��~���\qf�@��q���W,@�f|~���ڦ��B���N&�=�\��� �w�+������'E��s3x����Cb����~Ot+6� ]�pR�:l~�Dn(f����X����p�}���ju�\������M�˚�E*���)�܃�7���:�G�mX�9�����R6E�s�G=1K���_ .�^�k�^0��;�l ω\�:ֺ&��6p���ֻVaJ"ZB�{����J �Ib�6/L>e�2�جk5_��{6�Ú�a��C>-UUp�I�p��(�f���M����uq+פF?�f��!#����6�z �$R{x�&:1�u �(Agپ��6��H�$͆Z9E_�����"�6Y�g�i����؄&�ftO@4#nd�!�̨%�6Ʃ���x��� �}3̑�Y$�Lq�������X��J'�]e!�����S�l~.�1�Ϥ�\A�Z͞ʵ�+cOt�#q-�F�M�ZՋ��y�!��ݡq��PRe�����9�T��ҁ�Y8ȥT/5�H�&��@�UxMen���Ѣڀ%l5��˂��-A9Z��v���f�E9���5�.�`��V�6� ~����er�2�_xyOơۅ藔u���::�5H9�馍��?9᧰�{��R�:—V��&"a+y����%n]�� ƌ�D5�R��p 3d��aO���8�ߢ�Ȩ�vs���\��N������D�`�S���Y�:ɞ��|� _�UV����w �`������o_i����v��?[k�_��_ﺎ���Bj. '��=-�����|�gx?�֯|�+�����p�`���x��JP�F�&�n���ŕy����#��S�p3�Q �H�)r�,Ǭ��)�>zH�|���Ñ�����B����������b�2ԭ V0PW���p���◪>_��'�3����*���bx9���u����wOX�Q�~Q|*����0lA�ѱ6�i��˰�f����%��@0��V�Ӄ:����J%�T�N����#��X�q���6|�����|R|=�qzQ�Q���M��-{-��j@����ը?����=���� �ݎf�%q��dO��+��̲1+8g�һ�F�M���ciG���]Z-Z.%A]#�J�5\A7²��E��|/ل2&~4��%LDIk_�O����7/~͡��%e*�cXzw��q�V��nK��2�ɭKݐ�2�����-�4��&"�� IDAT5��Rr��t(:f�p��e�>�dk���(���31` � S���t��Ss#Z�*4wS�����`��L�L��#%ǥK�>�嗉`�ʬ7z�s3!,���|�� Z?SY����KC� ��9��g&=��㣞B���2�)�!�X��Ze/��m��6�21M,��)9хU�:nV�rTۄ���U�*%W-��d��vF�I�9ң['.��p�I�L�c�,�Z�%�����drN����3�#o�!�m�n��" u���� iנ��P{8爤�Rы�U�5���9�hO���뤗�����l�tƊ�_�e�:d�-q��#2┬Ϯ~��O,L�£p��o��9>Y]�^�Ӥ�L��E}0��'���;����5[�Lns�9n+��!-�;e�;��^���͖���_��S�������nM�lo����f��?�ƹ���-v��΃������/=��m.ꊇ��P��s|cy����n!��?��?���ϟ?�<�[��;|������w�Q�Qk������U���z���)� ��V؞w}*Vgz�I�g�8a���Q�D�Z��ӥ�r%/q#�/��H��_�>Vl���RD�%�H�ډ ��D1�C�=� �P�l��eX ��F7������;��}���W^y����3��}?4�#e�xLA�2�nĻ*R+.����X.T�L�.��p���‚��˲� 20��8�@�Xz�Jt0���.*]�4������� 6'��%� _�X�2laJJ�co��4��RM�b-o7B�T�jK6Yj*o�|S �X���{j��� ����7 �6��+��X�F��Z+�n�o�N:�\��% �/��pC�e]�Q���dU01A�� �� �/�MUaСNʒ1oO�@V��CU� �ڲg�*��1�LwF�$_[���&}�0cF��LX+G�r�D.y��~ľ�`A�p�:�H^L�o�R��¹�/�Jv^:l�_�Kp�-M�-\$�ALfX&�dɭT�Ԗܠ]Cv��L@���)L��bu�|���I�VP�+�7��4�� _�z���Z�����=��3�o~���Ý<�45�����Sr|JA��cC �1����{��$}�+_������~�ݝ�ᮀ��_���ك�7q��4{6�3ݭ4gH�)�V����T�%�K�X+Of�PT�7�P�/���^j�kd�"ߋ�%�umОkQ� 꽓�/�����.wZ��3XO�����y,8��k(���D�U�����#&7j�-C��-����=O�Ulfg�8[�2�l�SXL��_$Qy�|��C1@/.@�z �P\fʹy{��v%�ߢm�=��|7�G0U�y�Pk����6���_���E��n8�>Y4'��u�w�TI$Që��qX@�қV�/�����/[\G���:�մÆ��;<�|�– ����"Ed��� �~d,df?+���B�-��))�ED7�p��B�;��HF��c���k��B�Zf �ms�5s�%�ܗ�(�4fH��������A��OLs�� �R�2l�դ�0��g�D������ �*,���W��E2�KU�f� XY�{�$V��`$�Tj���q���K�XQ*�+0�NT�%EXA�L� �%HHb���jJ�Y3�j��$ �uV������� p��a������=�y4 ��7W� c��'�ǝxYu%� M�3�7/�� �<��SZy�B9D�TȤ����:�U�Gf'�~��E���larq���Q�[�?�^�� �]7��s��Y��Zb{P[me�@PI�lO<�嗜��5ف��Uh��' �Yz�M)&2t�f֞��,�4�n�U�n����@�Sfl51ͽ ;�����!�F���&+2֤��8K\���':·^�\��ƛ�]��^�B���oz�Pm�@D�]�P� s�@���}Ѿq/<�6�2{���9�a�s2mp��282s�"#vD�Xg����s �z���nV�ɔ^ϟmN�$򏗜䀘і��b�-��8'�'��t���'?�� /LL���g�7����O?~�_������p�s��w�b��m�N�=��O~��Zk�XI��V,jc-6��K�'��/}�K���.\���n��������A��X�v��19e��OF��i�&@D��n0��sG�1�C�]��8 �a�'�-�U�Q0��9��4�qE�bF?�3�'�^��n(����q?c.��qR� �%�4{�jԠK����9=�e���!At��+f�†X�&S򿇍���rr�V�;�=XD�S��S�FZ�y���@�H�OLSPp��'V��F�+9K��+�T���#��<͜�}p~J���38� p�V���&'37�$�?���>�"�l����.�{�;����"KrHv�N�ěc��fq�m�T���[l��;�4��=�������DQ�1"�>� ��y�/~2���W��\.���󜷷|�b�-~���*������C����ءk#T�� B���q�?��?:����݀�����y��3o��52ό��Y�wu�i�)&5dό�c.1+L���d�Z,�� �L������7����v�"*���]ڄ��:�j( 5s!�'�'Rz�X�f�r=[�t� \�f�)Q�@Z�q�� � ��q:G�z9W�Ŋ&��UU0� •��k��=�3��Ny��O��oy_�hN��� yܸ�_ �d^r���W�%�N�A44Y�t����Mcs�(a��ӮOz�W L��7��?��R�$|6"�~�YV�H}����?��,�g��{a&����I�$A�2&.����!#�M��j���I'S��Y�?���Yk���<�YK�m3pJґ��&tu�Dnz$ZP�K�:��#�@����̤ul�p��AN4rʰ��*1��I ��RPQ�̥�ʘx��)g�ઊ �J� ��'�R�G� �ْd����)}"E���o��s���x�'��o��= E�t�}?b0�.jef��(9�'pt��(�$*��t>$ˌ��ۭ�*s�J}��w��,��(-�C��dS'+�U)ICO+�©��Yu��3��'�+|�5������? ��;ejn@��O'V�"��d�9%v���?�:ޅ�G��Kxu�,�=j��V�[��?�~�:�"�D2"K�(��������h_s{�-�I�@�W����EZkk�05�*�@�|>�~��cE�y0���קtR;����tzhv�",2%�n�����&+]�?��iJE{��]wq6���������~�-�xw,̪�;�������h��w��N��/���/�ʯ�ʛ?���l����q�~驧���\�p�� i�����?���}�s"����❆!�HZf�؝�������<"m�\Aƚ���=�0o��s�#���G����D�+c�|��.޻��(�Þ�>꓌#�&Fˁ��ub�����-;��Z��V� ��� ��'%.eW�F�e������t�mod�I���.�^k���}�>o;0�N���3���-�q֮v���Si���$Ι⤄�4�5�7gje�(� -�t���ܤ?bX�����d�I#��Gٍ�C�t>���v�JYZ[z�8�5#{0�GL�ЦC���z�'%�#A!��H�B| dԑJo�>:e�Xpy�:9�q)�$RX7u�����!Zz�a����<9!��I���!KJ{�}bQqg�j���CkF��k)a����$�ʚz�#��44KD�$�L]3k0C��2R�R�"�n��z����<�� - ��7���J 'V��[�{�"�t�yIm��݆Z�o�n'�^�MzB�LVN@����)v��hs�&8�c�F����8;ո\`�=�J�)�t�Gc��&��=���E ]0��__�ڽr�L�>l*RSv�����w�I̋k�w�rt[������q��l�h��2�&�́L� �=�|��$Nik�GW%��eoT�D`c�1��̀*u�u� K��i��Z�d$Ƒu�t4 ᒙ��-v�tg����m|���d�vUx������c0Gf�,���h�fר`��u,��1pz���뱺�Ĥ��Pm��V���D���XV9;bF*(^B��=�.�d�ҏ�1t�Y^2]���"T�K�Ӓ!RW��Yx�O�AS���۶ .��� �-�_,�owP���#�"d����Sf5R�rO}%�4*vD�j������#��3�}���C�i�%����� ���%K��:J���RjƓ�U��ꏌ�(��y�.|���S^�]N�E���$1�J��BÈ]��R25���1���c�P�s�񡔏 ~^�o�Ϛ��d��h��T����b�-�u��g>sNp��J����K_���?���h��Rʖ��b�� Ӭ2���Z���������|������ݻ���[�~�w� 3������ K)"}f�̄�eu`�� \��}�񯶲>i#<(\�`x��p��YD�ϔ+ʓ��hɛVۘ)m�a?�T�:Q��5���Ǟ;p]��>�����dl~�**E���DE�ňݤGj�x<�|<塪�{|�yi͍��U}�q|���T��+A�����u��G�nw7�8x�3�k~�����=_l���x��O!s��~�d�,H���5�ؒ�[l�Ż���g�����\Yֿ��O����/�Lٳ[�~�-�+����8�Z?��O�GF�D`f��چ�������ۦ�-�qGpWӄhh -��_���2f)3rN�� TBa��� ܄����'D�� %����H���sg_y��r�1�YSǒ �\b��Ђ���� �h�r m����1���A� �U�c= &*"^Sf�\��1��.�#fd� �� � '%��R�L�Gn�?y�L�4����(�dc�W��g����)�Xx�g�����՟$�2�-ɻ���d�-3�9�˨ �Ȉ!X�� w4.(}�*bt�A(-$DΥ���p�$���im��%�o:��k�T�8���D�������p����������� ��ټ���fx�QL>���HM[�1y��m�hE/ 8���hZ�T����d���xO x��d�+"�Bl,��Xv~��T��9S4h�T(�+1][�|H�}%���&s��Q����S$>Ճ�g�ߏy�J�BLգ2%��c�Vk���X'#|�-�Nl@ Asza"�PZfKH)dMjԖ �����ru&�o��Ơ� \�!L�h2f� �/A4H�*)�R�����ӡ*�N�� #�P�,�2�M�����G��`����e�ݻ5;I5&S~��e��w��)G9!O�F��.֛�;��~ͥ&�$_U�ѹ�F�����&3��䙥�I�DrB9� ƾp�Ҏ$�0��-�y �����EL�W!di�Y%u� ��X��Uu� IDAT$��:Rv5��7�ɑ���hO�"�� �]gm)~^uE�bRȄ1��"��P`{��i ��&c{_�A�Us�R��$ �o�Ĉ�͸��Oh�����*2�!�,���p(�F��,�b�l��ez.��@�2"6��MWrF֓�����޸���jJ�>Hb� d 6e���x�ᡔ��_y�K�dؐXB"p^DQRHI~��� y����W6��w(V�j��� ���?o��[l,~��N6��H����Tj*�I��\�Q$��R9 RNՆ��f &��-��$t�\c#9�49H����g�Dd�ϸ =���grva�:�0�M��<{Q��u�hw�ܡ�`/؋IG���9�P�)͵ -�$;(2q�B�G8D^^Z��5va!:)�jk�3���$��3*�P}Z��Ό�bJ#����p�����U�n7V�V��!�����>�[)g��2�zq���q#� ؾ0��;��Kl�f��BSH��j"�A�,�%%���Qg���Mᙉz���{V���|U�_�<8 ��n�e�4�b�����YT -E��`6�;�p*�����]H�Ѧ.�PJ]�ǰcy����lҏ D�A���k�@ik�=��,�_;My�8M��W��zU� �N}6��i|ɐ"������TFIL��D��bm�7�^�!)�>�� W�d�[l�C)�3���d[�Կ�H������=Μ|���-����: ����EL���/��Op�N�����ݿ�<��S�Ǵ�;5ά�W9Ƚ����U>�>�rErsXd,�C�$;-��ʞ��pٸB�S�s��/�y�ښ�������O�=&�{�e�'�P�G�� � ~����a� ���y���3�ő��W�e�k�^��� =Zȝ��{��IW���H��̡��!]J\�������c��uj+��L|���QS)��P �(J���$R§d6�p�l�ӊ"s�G��z~�y�Y��L� Ԥ�9ҡ���x ^QNa��E���R���,�Ɏe��q��s����8���|^�N�,P��Pe��V�Yx�����W�]�14&�Q�͡�o�Kfx��y^!_ ��Fރ��S�s���rك9����c��JRHU(q�I�4$S/�NL���j��;s:��*tB���q��?K����WL�L�%����7�М�� v��o�F7�m�����U�����I�M�_�3�ϧx���7)!:��&����3��=�@�a�7l+���W3O"��q��8�*�4�����6��D �о�d�)�c �8�'A'��%�A _��T$�@4 ��������H�v�^(x�+�ߵ�M�x��!�S�1Q�&b$g�Ad�V^����=&���M��.�&��*9 o���x ��u�L�aJ�n�I�Bx�h�Jn� � �����D��@ä���j'�������LN�( � J��Z6��>Mw�F��� ��'5EN2[f�.DAd� h�|���F`�P�a"�q �����}�D��IM����O��kه9�h�b+X�6��ĝ�%ђu2D6\@#h2��� a.�Є��*{�ì}f� keI�H�M��$+.�$|�%_����y�]�:�l�B3�T��)�yZOp%O ff�(3r@� �0CR��H�������b�-�uh�}����hWշ���w�w���TuG3��c���>��%�������?�+�a�O&q��m���r��8��?�����W�j2cr{g��ʝ�c6���Ff0Cw�\ ��v�9��d��L���s���ώ������H��#G�#o ������8�F�����F��Co��lW9�^���V�iJSF�������G�>1P��1!EњRR e�Lg�>��y�"��,cهK#]%�f�`O�Z�= KT�D�)�q7�t�����U��}��Ub/��1�pns06qv�a�T��QI�Vȡ�;=��[�,Ya�TAѩ������� }�#�A�M�3�'�Ms�a&8,a-�F SjSNl��~^�9� f�I�D�s:/?sA1��[�?��,�늈P��X�s%�V�I'���0��tz)M��d��qp�t�z�B�"6���SeK�8yAx9@O���=3%��lS�-�'� ,�$���-@��.�B#]b�q�@eR�ˎ� ��e�(��TD�9~Y|A��� �*��L�/�W���=x9U���@��Yu#��n�L��%�v<�|M��]��9\���"8%��>݃%������< n��rU��T#����X��$���\y}]Dz������s�RE���$E�`�X��Ƚ����CUs �đ&>�[LՅ4����~��%��,K2f;��:�H$���H�1�����]:-�� �iU�㴲�E�f��:�\�|��D�##Wi;��B�h�0���isG�B��Qi7*��Px �"��˔e�����|~ :��ڞ��5������O��ы� ���i��#�Q��>ڨ���H0���o�5 @�ud��������:��m*��%��b�-~2�T���ԧ��ǔ��vZDE2�����ZkĶuo�-�?��8��w]w�ʕ�}�c?�K��������������❵�#�$٨����_�r�*���E��1-3�#4){pv*��O����ۦϫ�;T��-�V7&�������=����跔��{�8��xH�2��1��~��ou������+����?:ZDL�n�U��< �S�&t� ��D'#23#�e�h޶<4p ��soW2'����&;�2����_�6_��� j�dJ�)pf{�;BG�f�@��*va?��gGK�B�f�Q��(�d6DZ�N�o�<��B�//+�5��2��@����E��:272���ZTB{�� F e��默�4l��K �dM��#�!cҶ�H��(�v��.� |��B���g����o w(k��\��t�@�-� ��5�}���Fz��T�!TB��l��b ��� 2r�g����T���\&r��o����̬�?�a6�r���2n�����04m\��]Ȑ��.�ު��u�S�L7��Y5ҐN�Z�{p��J*Ct��x�;�W�~ ^@�I��ͻg0�̈́9f��8�B�{d:����>��� ��� ��U�:���C �0w,Xe.��p�1Ҭe"�-�{"7En���E����ئ�H9���e>����_���Z[�`a�􈩄X�3v��ɥ������-|=�n�咝�'�b�ir��f�p�� qO��4MX92Nɖ��g��ӿ� `Mue ��Q��z��L�8��M���i��$Ql��P���`2����2�� #��4�l�zHCEueu�` �냏�s����zw.' > ��X�ё�uj�pRF��bwgv0�'�u!ml���ʫp��Xr�ҝ(� w�׌� ���������5�묞���I�n�Jr^GMf0��H���֒DL9s�ڼ���#�=,��­"K�.Y��%�lܵ�'� ��b�-�u���/��/��_��d 1E/��H@U��������9���>�-���I�^J��g�u�������/����|�f��w�~�K_���?�}X[�c0n��°��������r�ѐ��I��K�!$1dW�Q���I�!�Je>f/y+y6x3�{���S�i n��t�w`!���7��>}��Ü�ؾ� ��a�,�F�C�M �ͼc2D�dg�����G^E�j�&�dr_̈́�gk0$����������.��;�7*��3[�'������O����j�J�սU! C2%��R��Nf��� z-�j1�B��������=R$����B�S�&�e�K.�t�9}5b�v�,�Ć3�)^s���"^��$?���l��ɼ����� �"&� ���6ÔI�O�� �QsE��|18b���h����׍Ud '.w�F�5�'v2� T$LDP31R���~Ҵˆe ��?��]H��)��ɔ�D�[��hW���W,b�20ݱ�x�j"0��$�*S��� �����J���+��A��-|�,<�؁�Ҏ'3��hhI�ƙO�ƿ%��qr@�$ͦ�OރgaM��=�2#6#��ū'�1�v ��zɪI?f��;S����#)�A�V���@��>+%TqK,I�`� 5�e��(N��N˻P�a���d��y�h�J� ":d�|�:�"q�xҢDg&2�6g�z�,�J�8��XVҽ+��!�h��'Z�!��r9��)��U��)]� ��8�~ս��L1p���-9 �Qz���,{���,hT�iJ�!���GDĐȴ����4$��Lu��*>I�Q��n� ��^?��`�����i�>R���.{�OJ�-�Kĸ�������&����/4����N��C����w�C8&�L�*�/z�F՚��$w�1yQ��:��l�BN3 $��Jd��T���\��9JNw�.������^Y��^�q�5�.�e��ͮ�~Q�o��-���]�Bg)�ӟ�4oS��?��?��oܸ��6fv�-�7L�Z���گ�گ��o�V)��6}>��2�:�p, ��xS@J� E� o�N�b�@��͖_S;N)�7�7?���M�:��l'�-��(�4Eq�_�����T>k-�U� �;���z��,P�<��_&W��� �.�� ��ENT�jK+:�;O���l����L�M�XfhJL�r��Hl���$�����2j��s����(Y��Y�7*U]����O������%t^�� N�����}̹m��1�q� ��pj��L�W�2XaA��c��6���F��\�i6�GgPmq��"�k;t[�2� #ʽ�n��͂H줤�`^s6ƌ�@&k�Se��l,+�u��.�&.�8�o���g~80g�_q�r���E�Ȑ�a^B����_��3��G�!>F�M��א��]Ʌ�h9Y��8;E�Rw)G���xa�u��2�6#�'NY#%�!�(��W1*DVlĩM�*̜�p�2������T@e�CƙbA�(� �u'c��hs�S�F�ϸ�1�*�5Y 6Eȶl�����ЫX�E��"���2C�.s !%�$��6�D�@R�i֕$b�ȶ$��0��t��bz�'W���p�s����X�I�[Soq}�DPH��-�@EG�����`��1q2%��.!�6�>������x�O�/E.9��4xZ�T#�1X',���6�e���M_i #�!J���G�F�\�:^�6��ſ.��\�<�������в�v�^-�TN����;����ޛ�ږ]�y�s����nW}Y ��H5e�0���M� z���H�ң�ȂlXq��#%�L �z��� /4w�h)RQEV�ܪ۟s���Zs�?s�so������3P(��O��^k�9����O}u�yb��9hA����`�z{h�`�7�,p��謷��ݰ *�<<�1��nT[p��,s,'Wi�@��b�y��y|�kR���g_|���_�+�gN��]kk�ʯ��?��� �}�q�N\:��k�����>��O���g��a�>rXw;�w��`�rp�T�5��������r�~H��?��?��7��/}���ی:���8�{�%���m�[����M���D�&5�̼�e�͔cݣ��u�У�'d�cX'ǩ����ʄ���璿b�����o�{c��������3w�fI�OZ,|:�Zi�”F�=bH���ny�-�U�ǫ1Z����Q�`UXd�P�h�6\)�����s� ������`���yk7(� _3��W�G�/;�[�B,ܿߘ�-�K�)�n��u��3X.���N`%&��!R��l.�s�E���#�Y��y�2ZX�� �rq�a�k(P �l7�PL��ԙWlB-��=c�܈dJ#�{�z���U���L�G7VMn�De�ψLy�BVP�M > ���C��KV�&/�Cr����>3�|��?h:X3[2�tb5qU����2A���p#�:}��z���|��ej:�v�2Ha�BF$��Y������;�L̶�}~�4�'��/ '�&y���a w`��$�(�L��7������0�+����h��.��m���MаU�E�F.E�U��u�5[`�E{؎T�Z2��)�jLZ$;l��X���|��m"V",���Y��? [�s��<��<>� Z���_��+��r�}?4ktk����������]�o��z>���y�b�y<�a>tNʭ[7��'�d��D: �(�fn�]2)��� ^� {6݉�f+l ǖ�3�j��� �c�4��n����3�e��M���oy4�spc%�` k�5��{gwp�HY7_�v .�+��%�2�Uf%\� �l��$$�p�^�Kb����i� G� \DOa���ƌ���ߟ�2������J�.�I� �(�\p ްxe�M����Ŧy F��9T�� 7;p�7;��)�W,]N60 ��|ف� IDAT�F1 OS�M� ��� �cZK2�H���K�D�[�ɘ̊鑦��E�9��u���A�'�ƶ�hw(�,�թ�[�Rj"���ƥ��[S��B9�l5�N�i��֭v����<�<?B~^�cW<�q��XA�T���J���J��+b?=O֗�O§`߹��m�e� /� �ӟ.�H nV���T(ͪ��ЉB�E�y�͠8�iӃ}�0�_J[�p՞H�^�L��F��z���#�mNiC��� ��Q���$�[p�� �.�o�:�K)ZD�$�3*G�: ,]�L[���u�;G��մ9@.� �Ab���&|�mh G�qj�ʧ�7�&i� i� �)F�T5W|�`Z�<���zn�K0�HJR(I;�n�uQ�:%a�*�: Tl0�sK�2��v��[P�MEDb-m*��o�]�E�瓙���qSf�I�Kb��ƞ(�&���x#:��ds�l�/�u�* 4� ŞM����f��bt&�MSS���ԯ�iM�}�F�Mh]3��L6�P��l��0l��j �mFr�`&��P��B y��:�t�m5��p.��τ����ek��va������g�FU sي�.1jYFZa�n���IM���z4��L�iS8�-���b��;�/[��\;�2ߢa۱:�&c��OeL�)�����̤1�Rn���~�w�+�m�����ʼn'�6j���v�� ��1���1f�>�3K�Gг� �2�' ��7aIyz���SD��8��-^���L�G�P��`;�JB���t/ȤE�@4/�t�$���" PzV�� >a9J���L�[ޞ8i�P4`�x �^��x�4 3�dKp�_~���>����zp�c �u ,�u���:f�&.��?l��,<#7񙙙�O�Ƿ��[w�P�Z ����/;������q��u�:Tmb�Xr� ��Pw�}�9�O&�1���[-ODF3��@re�SV!`vO�F��7o� g��%.�PQaZ�� X%+2u:C�F��r4k+"p��JN��Ͱ]�Y!��L��Ʌ�&s��C�a: ��-���ݘ� DKSo&P�%�ke�.���!���\%KUi���.ٶX�"� �97�����fƢw#Гr�КX��E�)��=f{�O� ӷ����#�I�۳jjbD5��_�\I�� ��Vf mĚ,pn�֕1���ڣ] ��h[�>m= �H6��r��t̶s�[�9��2S�AX��ء�!O�FH���x ���އ��U�g�L���|�������I�"uh �q��d}g_~�<=���i�!�r��r��mF/���n!/�s΁q;x [��a�]K�r�8P�cyU܂��l�䐸�e5)@d�f�8�t'�oJW�[ �H���-���ؑ �@p 6F+u�h�AK�<3} w&��(�`W)��G�-"��%��`?h����i Fb,�X:�` cPЄz����;�q��q��l�/~�],�>��Cq��3 "��?�'?�S?u^V���mN)�gN�]�����sϽ���W���m}i��Å�T��L�䓍��>e���������e��L�a�����w�!�{�����Og�Ћ�� ��� ���K��KH�>ն���L]�͋� |;*y) ��N�k�o��K�%�F�i��� tDžc�n[��)b" �A�� �u�$%�w�e�e���M��'}H�&�Jz�ץMAE���� i;�Gi�]��'OxU�'�����w(Oո�t �y\r��C��DE�� �I�E�K�`��� ��%r4�$� o� ��epJ0��Qء=/> ��X#�}l���[�)��U˩�nl��C��z��f��bF> 8���F��Ҍ�A Ƒet�J#�nd�1�͘n&�Y�X&r7;��.�މ�)�A0ѡKL�����D�&Mi�1l�.��ʋA��'Q#ߓ�앫n���NZӷ*Le �9�������x2e�/7aP�hh%+h�4� [@�@�Y�����]��Bb��w���H��`f2���DP� \ƞp)��*l�(�>�ig��_iǿu�or�Y�y�Io��EtCV���?�~>Qu58 ^�4� 3��eJ��^I˚��`iS�)Q�t�Y�./��#��Ifc�ed��p#|�j�[�I�ֻ������s6� d*bfT�F��{�•��SO'w�8����c)��0�*'� dћF��c67���\C�|�c��3���g�(���: d��n���j2A#3qd�&8�C�N��M��J�\���I���+S�)��H@�1����� ��!����@8�.��t6f�1���\.�M]�4�zw�LTmż �Cɶo��4�FvX�weV{س�Z�[�ڽ��)�F�-�g�>_qk/'akmydv��-7�v����uW&�&��3��Bym�w���o����6�K_�#���� ?m�I<ͨQ�*�r��l�1 7$R3���/�}�� k���[�c��1QyAQ�� E�m�c�w~��� r��=ӫYO<d�x�Z�[�+y�Ϳ��׋�l�i�����[��J���C���R����^���XD!ۖ���@<;��쓇�lmv �t�| M�U�n�3�ϙ������Q �{��*y�mF�~��>�5D��ul��d�1��qO��$�0|n��Ux��N�w��p�iy�p�+��aX(NdK4�3q6I�|3v�q�� �?��]�z���3���|�>��x0癳,`g��q��?�������a>�Sh���E˧���˓�O7�F��@F+?P�5����O.N��Hܻ�gɃ��������ׯ���j?�3<���;��1�<#~��}|) O&�Eg'm��'��~(x�~���� TT���I*J,�c �g`¢[���&��� ���:���b��%8�g�(mfB ���j��:7�ߝ�Qv�����������3�mKW�!��pE��2B���w�C/�J"��c������o²�u�mY��r5�\��\� �ph�<$���]�iLx���6yfҨު%�,�]+�Pg�Bn�W�UL7���3]#7[{m*�MT8�hR?J]��9��ixX��! �i�����uڰ�s��9�?��5���s�.ftH�{7�~����fl���|�`p=TE�&Lni���\!�GO�E`S! F%�g�G�7>���k�%S����".caA�,�� o� ��a�Frܗ����� %�̐\d"�49����&�^@OB޻�V,�o)l=�XQ_As+�j�j�3���O *p�%&�܊3`�Q��f�]�96�w s��$�-��H�{FGȹX�q������/�L�~h��i��;����_����/�y���UJ�s��3̏�؏}���v2��c�{F4a]������/�����]�ǝ=״����� �&��Q'eu$��������ݾ}��P��W�<�������^{m���%&T��Q��I�GO�g� �� LX����[�w����� �(����-�߇������T J�3]�Ws��]{�y�Ei��`C���.�eq)��y�a��5,����-� ޤ\��3�Ҩ�b�c����A���5����(�ŏk���JlЈ���m�+�� ��NRL���,C*��� �Xx  �ڍ��G�5e�w^����x��l�//�v%�R�\�v�X3yhkxg�� ��.G��y��ݳ���{�����E���ꭋ_��G�m��2Uk��橡�\N]�Q��ʙ�� �����f���X���g���T����H��z���BD������j�_U�/��t��@sk%7�L�od���T�2�@��=��Uk�!��� �U]g��;������_/}�q[��k�`�vj'���[<��Rz��� �PNW�x .���*�(Y� n��샢v2�G��c��~$�9�CE�>{��N� ��T^&^����5'Y��E�R�R�K�+\��'����<�f@�8�U��~����|�s6<��]A��{�jՙ3�������JP�PsN�wϸ� %�_�B �d�^s�����~3J��*��ۣ�͍b T�u�S`2T�b���{7Lp �R;������Fi���:3c^4/,�=gN�������;!H�_�����s�q�8�[��������o~��C|&��S�����k��kgV����9�<��?�֩�������կ������|�&�6�\J�=?���'�@>�����ϋgӦ�K3���F��i�c�{F��� ��F��"� `�g�M]~t������s��t�{��y��=]�}6�@�_���y�aMZ)��̮�M�GW�*�T���u��"����,�]��;��4m�-�[Л�Yc���AM�Ȧw��i�ڽ�k��� �.�&+�^� ��G(��R��ef�!^�|7�٦)�̴36mlmv�ƣ�+<� �&6r�����y��N�fou��V&������C�w�:Õ��d~bô.�qL�N�A�Vo�c�41�~)WmxKq[S+�M����'�P�E�3a��1o�qJ�U�12BxNIR�H��WU��E�� �黤�?O�72e�d#���y��{�o�xw�&b��� 5�`�0�����9k�L 8@�ю�R�� ��').d�V�����9�]q��|�����k��)����Ly��2}nÊz�u$vѮ<�rq�"�f�dR���AE��c��;ʃ���m=)*�V��12-�lh>=���+nפ2�Lc�LX1?7`6XRY�p�(�,��"�����VR�eKJN8 3�U&v�GK>Ѹ����b��N %��ˈ%�a��d�<����E'�o݅�æ���J� �e�ޫ����;ţ9�U�K�)|,9f >lbgSj�!:�gZ[��ؑ��l���J)�r��f�"�I���r.֟�y���1Π̒��կ��������}'l�O������t���3un�����<����_�����������P��P+hQ9h󃙞Ƌ��+����[|;8D�%>���e|�9v�ck��;+ �e�a# ,�E)������������I!�S}��@��3��Y�����?���/�e�ψa(��ؼ��[�(������'���e,qAX���TM��)��T��0��˔2<���g��w� 3�~� IDAT�:L[~�l{��eX�����X+O�5�`��� x�܈Dn ��Rg ���v��27����QS�6�E8��f�S��pN`��^-w�kc�D�řc;�.��&E�y\BR���S��[��W�rb�Tb뮌�|,��M��F�/��O~*�f7]oz�X���\�u/�3�p�(9�����0͂�|״�$[��[������?�#sj�W��"#n�;pX���V��� T���.�I��S�Yna)����ҥIm �W������,�� ?P�r{���XO� c��b4��MI��N�#86hj�S�iN�G�2��Uj$��f�\ĞA/v�,q*�w�g ��C_sJ[EQ���<3�U���F���Hs��5S(�;�&���T���g �y;�>��$�3�� ��� �(II� �EG�)وIg �<�S����FL�h�gK�=��b�s�dfn��1X� ��d�>�v�'n�M�Π�44�Ě�|nX@�O��G��� ��Yb�}�� _�j0��WiA7t�I#m�XQvl��!ȉ8i�{����+�m�:\�s{r��?���7�Dg5�R���q�;�7�W��)�?u5<���s[j`ٕ}Y��������x���%(�>x�$��ux��yw�(��BѴ)�̄$�p���b).K3���g=�Y�c-F4%#���=�����p����?,ʴ��TYgHe�����F~�|Ǧp[�ꀏ]�4�ʛ��XK 0� ��%&J������5}By 9܁KP ��>� �h��]tYTlDKg�����!�N2b����;�v[�1p���n&׌��m�W�?�݂)I���d� �_p�\�E�{f�A�]<�=��5 t_\f��A���e�݂-��*����\k�}.�YY�Y�*�T��nZ���nlpG8x�C6�*D )h�h��F� =��6M����x�-��Q����n �nUR��ny��(��k�E�[[#%Nđ즳L���h���;����qc�`�%�GT�5�`Ʋ6�%{H��w��v��o�QǮ�"����k����wfw�����������}���ݽ�����a��j���3?�3�x�;�^������rh���r�����^��#�` ~�u������R������^v�j������K��?B�ww�9����>�;�s������!�J>�$}�c��\6�� ��t\�Y w .^E���#�>��S��A�\6����S�NS�K�U7��������l2Sh���s�3͜��}i�����K��!7�cX�N�p �@Q ���De�-S�2!�� 6��)�2q=Z9{Q7�`���z�W a�YT�h�K�)n�|�������)뿎��vȆ6H��+�u�ι �`ɐV�j��� �-82{4+�Nr����^���°�+��cC�̪ر����h.l�#,II^�<$��\�~��g4��qGv-�qT�x�^S��x�9�I�G���ʞ�B�=��%u GU��<�v��̂S�c� �f���Z�Ex6�:�bC�^��K��/�����d/��h�VH� ���# 7��a�;}U'֊���q����ќXa�V.R!F"�i�YpQ�ڎ�q ��6����H�Q_;�����9�CP`����cߙ6���Ӊ&y�+^�/Qo��� 1kXÊ��j\�M[! �UxI�XI�F���aW��C��>:���2^-g� ����%��B�;3��f��� �`�7���D]G�7� � V������JF�?�q�уEǍ=s�7ֲb:�naK�R�`�}Ӽ6ϜV���� 3�y��rK��[k$�� ���B̢v��xv�t��Z���啘��o��\����iD��{��2$c��� 33���RF��@����*�`��w���09���p2�`����m�k�K��t��{,�׆ ���[�@ t ^�[dQ BxF��m��Y'-�}�A��;4�k�����ݽ\؃�@��QN��9Tx��~�<fĀm��uԀւd[�~�#ٟ�K%j�s����ՐDO�g� e)�f{ԕb�D*+c0:��j��*��g�v�����;�u];���/�¯���߻w��qH��97���h�8�>��O��o��;���3 �}ٙ��;��0�ߔ����?��|��x�C`��T�=|f��!Ȍ��t`�{�֨���)vl^) 4�Sԃ��;��w�0�zN�21=��<��x��u<��?��?��_��?�c�������Y�oI)}��x���1f��fXQ�`��6p+q��� ��ٳ���)ِk&�hL^�g$��e��>�_��� Z��dqoP'+Z4��XB���<M��킏T&j$j�y�e��:\Ǘ��"���M����Xv�19x �\ue5�+8���RX���uT��G�g�0ǒQEA�F�Wþ�_s�ĉ�w�:\���#C�1< ؐN�� ��i�wN@9LW;���mU�E�Z)8���b%�B�o�<��!�d�P"R����'������\��b��j1a�۪���0sU��!�4�^)��ͅI��w"�3pX��q��a�n6x"�1��n����[��r���р笛p�X ���š{�%.��գLJ�՞Ǟ��E���c�fx�,��)EU%� p��[�k�~�bU��o���&��·~ށ��/�۶��ß��ތF]�b@2�a���x+���syn��N�]k� At�2�a���n��I9 ��ZHCQ��)i��A�eȾ�ě�M6�E���z��q�z���g�m���fpY�S�^o�����=ʺ�K�p�3ǎ"�MԈ֧T�;A�p��|p [��$��*Ph�ݴ�l���C�.K��Vp���5&�?�rù�x�r�e�+Z����C�jK h!�|S��������H�}���m��* ÷�hnQ��M$}�,���:�i�yU�ܗUs4���h����V�.qW̐W�,���Z�X�� 7��L��YL���dJ?�x��+nG�^��`F$0�ay�oڧ;�5�I�#�l:���hf�l�Z�D�"I1��}�067Xy���{�������� �W����ݍ~���`y��� t�~4���Z�AZ��Be�����$�VafvQz���.��^U�2�T���ۿ�ۥ�7����3��-�p�'�#�HD%\��:��9�������118j��h���Gk��?����Fj���9~������������ #%Eؙ�Q>F�͊F����!�lO��Z߱��1o�x��Ω٦X��2�av����骑��p�1E�F�)k��&r��P���O6�D��JD��8��~�~�k��,ɭQZafgu�m�����C`� v�}�I�j�Z�{���x4p1k�P�PDFq��E�s� ]���e�[aNJ��/2�r�����nd]���l�jQ��+��L�M] ih��F�r'k6XK�m�6]���ٖ�ԾQ&�_V�y���v߂4���A�7��N\�(��y�bҟN [ ������L�X��SX�T�`F� U���)l3��" �9�Upk�:q�4>�;��G�* ���G�W��b�zx���?^�|�~^>���q��G�Ru� �1ݬ�����<�8�h��*����� ������2 �„ڗl���^T�Sc���l03Z�IrT�ԥ�*܁s�`%RJ�H㡚�$��̙�-�^��>��Ǐ�x;�j�:Ǖ9�=Q�St�,`��yԣ��X��݉pzlB����r�P���`��j��$P%�m���^�{ݮ�;,�o�ryň�pI�CY�-��<���|�}���{�������O?��?�����l��H�a�x_8�0y,��ƈ)�a�/H��;�⩅x���ܛ���΃�3.'��3�w�?��������n�vx��ga��k�v���m�e�5I� �f�!�^�g��E�K]�� �ᩝ�<�_C��u;�&���G+�L�=/R�;3&�T�}^ ���2)Md= �S�&�[t��bo�J,+'� �4�H�4ɜ0�mܼ e��r�g��?Ngo@x�[ҽb����l�t�/W^�kp�%�v�QL��5�ڜ獫���i0��]��-�6�.�-�6y�l̬(/��R�fıM�}'���g�����>zs$ l�VΊ�F�!sws�vG5���7����;rn�@r<��0K}(X�֝��1P��=害�ZG�����m_O�Y��d�V��lf$�8%Q��BUT�Z%�f��U�g^��2\�v�4lzYAˑS��y�8g��x@�/gw����Vx����ʑ���Iu�t��x��h�BM����o�%����q�4zB��d�� o���<����ӂP)p��t.û�]�qNt�"u�g�>T}�B�r�G��6��fPG� �h�` ��D��y�����o�~9O/9��/����=33����4��������Y�f1t��1Z���Yx��N!h\�(��X�v�ip�UK�u�x��H��K�g#�,� ������:,ysk1����Z�Fb�M� �To^>2����9�4��r̿���k�7����n�I H[O�@������I"�E@�(�u�M�����w��RS�M��V�J�F�ʱ�S'P��gMs�od�L,H�1#�׸ W�rpΘa g����7r"C��.x�����/��U��נL�8�����X���I :�as��0z#A��YʚѼ��lpM���G�th/Vs��.OO��@2Ǔ�f��]�6깰.�E�P1� .�A�X�-��g��mJyQ�9��:r�v���q[�)v��*��k�6kcj��}ϋ��#� �tc$K�9aMj�֤��֎'�l/v4�6 +؆�@�ǽ�����K�`���@�-���N�>����b�Ұ�Cm磇�y�#�w�a��uh;����VN��?��O?��ٿ���h���G�&�����٦��Qj�;��}���:�����)��=9{���nMTg%�X�.���x���^�K=?�?��:�ª#F�d�}l�{� xO]��Ĺ��h���fD�s3�O쫟ϻ4�̂=��?��?%P={���� � J)�1���}���Z�����8�L!B(T#�s��t��_��f�`�ПvD���K#������'��m�*7Kn�mN=�r���Cl�̬3� ���֔D�-g):͝f� IDAT��H������)�b���셸�c-�T�m���N2ԀJ%jsIPs]3ܫ�h6���矙-��ܟ1N���)�tS��^���̸�����M�l� {�)��J��j��dX�ը���y��/�u��嚕r5���c�!O�~F��vb͆����j��4 �Ya f�����Ɏ�������̰���T�* �WT=�zÆ���E8�l�*�BTF12�)���!`�ڣ�ާ�茘Zgd��ua;�1*���׀� 5F l ̖t�TӘR�LT,r)�J�I����üg �8/2�o�OIs�Aenڗ�6�`��3�ą�)������Pļ�a,Q�O�{s�y� �#s]�I�����a t�t ="�\�����/�?P����1��%�ۦ�#n�g�|г���o���L�=��3��>��|q���=܃TN+�H3���]���n m����w����U ����cܞs�u +�=�6��S��tPx,�'O�;M��'d%=��Ts�ii ������u�bg� �0F[�⤷�{�_��r�ޑ�;��>��6Az���֦�3����=��s�����;�~�6Ԩ0����O�����6w�z�*�Ⱦ���^�BfJ��E �)� 1�w�߅�Q�S*6���LF�6�؊��e�^��EhVIj�1C7\�zq�s�� Q��ʭ���o��D{s�w����:����~��Me��-g�mDA����1�T�Z�p�_�n������ġM��=�T��ַ>9ijh�0��L\t� ���|ɿ?��c�p&?�ot��o�������V^������f�ZǸ5��Ĩ:V*4�:"*��~��r?��3�]l�4����<{�^�Yo^,܂%��Q�:Cs`�oD)�d�Y��G݀��VO&�n,m�|�?T��&|a?;�y��@����S�n �H��nra�����>��jSt�M�B�rZ�t��Dēp��@�i���DD���e,d��[��(EuC=c3��� ��&�Ċ�8��n�1'9�RO�A c�9��J=��N jt�����ɴ�,�P[-�5L �0�H$�[u �T�i\���_�x0�Y^4y��T�3e���C^�D��'�����zҬ dd��;�51t�+���0�+����Fzu�lS�Cb��jXQ�w�#n��=�]Lŝ��sץDN��;���FR,P��s=<���Q��ɘ���J3l�/2 F�M���?أ�������)NRD 7��7}��Arw_'B��Y$�����@bI܃U O��I�U���ؑ�;��>��7��aRJ�޼��D������ދ/���؍�;�G���q|�J��\���8���?�=N�'�ʹ�'���F�x��,Z��$�V�O�؃�mi܂�>��2�i�%�gM_�;X+�<���~��j��M\P��4l�e�Fϟ���et�F�|���6��҉qB= �4�5��lK�שm}n����)تC���&��6ƀ����j�� �� �g�쌬W!J�f���񬉡�%}�����1��L�;3�:)=ޛz'ᘵ��h�z�Y����߶�z3E^M��Ν;������9睲~�*$Og`ϩ�����+�Ӆ������b��x ��g�6�ɺc��-E���ɞI�j�z"t��[���L�g:~�ًؑ� ̰=,�-���8�%k6��9sbVq����_�%�&Nj�;�~��h*��ꫯ~��?c�޸8ݬ��E8��l�j��X�����l��)slO���@6�N$k��$,&��� 5�����έ��fBQ�(��>�zEj��[�4;������<��\��������gbr�56��y��F�D��� �6�bVI�y���渪�����S�;W��z��א��4B�L�L�b�3*�����8�3f���̲Y���w��S� ϑ�w��8�3&*‘5v>��D�����\tFU�XMy�o4�(�T�9x�����Aϻ� �}�lD�63[�"�Ā-�c��G:1�8��M���ހS� �qN(Q녪 ��I�4�M��Nz��ݗ�%Vܳi�j*�5�ik���d��`�)�O#V���"��� ��b5aqTx#VIS��v�N��c���o!Ι�mc�)�GըVj�X�s�{����<���I�{n��ߊX��������?��}�� .�S��߶t�#g�����+Vl'H��H�Cƅ4��t�C_��^Q��X��U��৯߃�N��گo]��$?��g�e�����=�Ư[~��/;ϩ�"��[�vQ��˷�A�ݬ6�qR[��� Tk ���C�F�����F@1k @N_#�;��N�VC�0���D ?�5J��lJ�����暴�k��p��� ��It����v̂ �m���,-� �MY"SgD�-k��g��M��x"9I��!�"pw.���e�{R�5�F݅��}Ÿ ����(=Z���c0ouJ0�,ʢT�8h [a�[�,3yu^A��?��ѱ��3|���G=��с*bl`]1]��cF"������Xrm�ӎ�k�HQ`4[:��@t��PnFEx8����k�ӟ��E����a�=��;�p���?��O5u^�}s9�4�����|�ӟ��������~�N c��l� ~���ۏ����X7�Ñ���C�:�|�32��� WD�Sܢ�*����V{��M�9^]��\�ʐ��⫊��EfX�0��hϸWY�n֏�kKf�p������������U�ނp�\�F;�ME�L����;w������M�S8 ��z�� ��k��Gsv��=�E�(Qg��`=$��|�ې�����u���A��uĘLz@��>�Gs� ��M�'>Y�����������C`�f1q���f*!D�δ��+�p�d�@�#�S���F�d9'R}�9J�̉ް�T_����}��$XA�"9��� �N�3�È�;-d�A1p��+i�f�7z��ʬ*��"a�l��Q{��5��J� ju�5��ݢ�1n�n$q����.9��/�Wj.���8%pٜ0���&x�w�/��3��^�4_�X����DF��1u,\����� �p#F�.6Dt�#� ^�z��ƨY���{��J��C�A5���^ ��h/LxJH����)�6���m׭�q<[\��c9xޅ�R}��tJ ���b�ZÈ�`�J�h&��*>�s� �^>�Z�)�c�FR�Y����S�f��=��~X�x�o�1DN�Mk���HbD�͆���+��č��0�S*#��r�5���0++RG�������*�ޔ������ ��_Y8���*�`kc 1�ccl #�V�6|�����j�gZ���Sk��;�~�v��>~�~��o�իW��[�DL}�bl����>���_~���p7�;��� jM��.�-f5~�������˱nҜ�(��nZ�jp �ul�Ot*'p��k��!n_B/�.K�&Z���:�b�}p��2�Uw ? ,�^�9�5?��SC���I)�(��٪[k���G>���v��^립��w|�ӟ��?�C��8o�� M49� ����(օN��ML(=�lD'���l&��dO/���a)�ƕ�\qlh.4C1ٴK�fa��B"rP��ͦ��\tƞ����A�������&�\�k f h�ڧkfAӵ���f�㕘�D`DR�"U��bq�$< h |��� �� �ܨ�������0����/�lЩ�i�(��Q��Q��gҞ���%���K_�V`f�^�G�����k�e�Y��|�s��޻v���j�ݸ1�1&�[.'� ~$q?P���`��)�@R�c.�����( EJ�H@HdE�ON�$�W�n������ˮڗ���{�c̵����� U��T��Uݻ���1�|��{ަ��1�*�����Z5ɮFm�����+{��5~F!����c �e(��F&�P��=8�0Fi �L�M�idd7�#�[�p��b� �YK��܂���Ғ$aτcm¦Y��Q!=����dB��p���2��HV��s�R�v�F�F!���jW�k�C��y'�w�Y�N\91�|;���FKl��;�5ۭ�1iV��y x��S� O�-H����=�1�Nx�� 2�uΙ=;�k���w���Ţ��jf�8� �s07F�Z��M���.����X=�s��o���3�e�����Tm>����^}��Ɖ� J�"�K��&��en����s��q`��C�HmΉ�$���[�q�׈chY'0�5�T�c5n3��8ѩsۃ(n����hB�k�I�a� �[��M�q[�����6刄5�]�`�ZR��!�l ������J�E��H�;>*��q�_���fX�-�F��bn��z�ȭ��ϰ������x"��CY��!�$3SK&�A�}I�d�$�W;��$��!��i��`��Y0�0y��Ǚ�M�ȳ̯$�[̂5bCs;�}qX�L�4��d/T�Ñq,aխ����C����i���l��+�ok[����C����~闞|��&|7�}D�9u�K:::z�{��я~t{d���{���R2�}ą ��?�O��O�w�]��R������#��5�ybQ�5�v�Y��������<��;g6b�9NA����u�S�C�y,��U�� �֠����e�݁'�k���u�u\}��O��O����n��][x���:88x��'[�l���Q`�6���qpb�P&A���o���|� y����:,9.%�-�O6��8}�Gsl�4��qb=|��i��d65��k�8NWY��:���Qk�5�~S�3f6% 6 �mP�.�mN�SNa�-1v���6�wXԼ�f̼I ��HV�6�­%����u�� 5�����m�n�9�b��=�ƓE���6�V:��!4b��B�z�6��j��Ro �1}eڀ��h�7���O������^��<,LU.�^2t�F�Y� ��)b�`ś�{��K�ua�c�2v����l��NL#�F9�Jx�ˆ��͞�\�xB���"�T�V���E<'�����vu#ga�� �L$�n�<�D����{W^��ux�|𰊫.���P�ɲ�Qx�P�� �Q� 0��m*��؈(��K�w��!���C�Q��%$8&�G�v6�"�Y�A+1xcn,�����s��S5�:b�<� ;�n���`�����w�d�b�E"d�y݋��22�'"y�5Rk������U�.�4����f)�(�&utjv�u*�I�S4�?�Gz�+@V����>�k|�[H��k0���M�� ��h�A4k�)� �������� bM~!ٗ�&��� �/*+(�3u ku�V��3�фFk�02�0(:���5vMC�*�aϘ�R-��R �s�b�m��2j��Q�I��Q�qJ�� 6G�������v]}�d _��d�"��z����˺:la�I�•(]b�،�u�S:�^�h�y]٤>���� �y���:"8�2Tko�淪L.ݬ J�ի��h<Ʋ���1R羈X�Wn7R�^���8��Hu:����SB���Q�W�_���u�p�Ơ3v�S�֛g(�+:��o���S�^x������mm��������K����r΍�f���������=����=U)�6����B������Wj�\�kf=��x��P���8��0u�&> ���G�?c~-5�"Nx���f�f��Jkt��W׼�t ���-^R�X�1[e���ᙡ�+�K��λ�_̛���������� ��o�z��'�_�^J�H٫O~�zOͼNJ����� Y�x��p�Tt�$Q�DF�H&7�Ej�d�\u1��t�}��"��N}�f&��;ȩ�b ӫ�Ij��.:o�z�qκ�g�M,�C KX�8΍�6)Sp(`r�ǡj(9)�����.�1�[�͠�G�1K��:�f/��;� 2>shṋ%m��dOۤ�g�� |�}'��mnؼO�;��͌�f���ܝ�3'%�&�����@%%��^�%$Mf��ܢ}�0"�������N����O*�Ս��&����T�u��ξ`|.��H�����H^��8i0.����1���N��{.lܣW_�^��:݂�\�aa�蜌eW�[6��Y�,�QW�\ ������{����%�d $X�%��s��g�9�����ǡ�k�g2��U+���T����M>�(h'0�;�UH�����N|*��"N5���. IDAT����7r+oCA�z�ڬf OӢ�2��ֆsa�(��7Y�Ӵ������)̦�{Tn4@.�#��exj�OQ���<��'��/�ېVUDL�ڛ���R��Q6�vz�E�Gt�� ��[��7.Ӕy����.3��N��,���o��YFO�[�gz��霧�[f:��y����}��9�ns��}l�%��Rb���V`��,��X"� !,�c�-���� 8 ��M� ����ߝ�;�v�b�I�^�������\� j ���U4B�:��[�Z"��׮�Z�S|^�|�V��T,��{���;�7�fm(����q|.tmБlH�T=S\N��T�H-<�����#��)w|>������{���_������mm�o�8 �0�$H�����������OqhT�]��N�w�N���*�8v^����,��#e��t�\�\���?9�O��1F�X��:��H���K�2�p˻ ���'���5�V�5IԞ'�������?�q�� �S��ڸui��֛W� J���R>���������kw��`��)[_ :��n�R)F��X���� �� �9S�d�%�3)��}iv�"Wr�9%��c�˝u�*���[�fg7�pd ���Ⱥܿ�� �1j�P ʾlK�"���;���@�ȕ������2��&���G���Z��^��� IM/6E?��^&pG5RHX�{Y��k�9�g�j��T��dV�vKȜ�d;Խh�L���b�8[�cu��:�X�+u���頣��9$#dn�m�p���OIM��N#������AtupH2`�H-�Q �!�22`����,����:҉kd̔�^O���0�xae7�Y�s�\���;N�<�aGk�IX�0Q^�B�v0 x&�'��`<�����˨� ;�u�x�u?^u��2ըd�A�I�%��5��Gֻ+:���V0�z�����U߭�H�K�\MǪ��^�Hu���c�}t��qx.��H��͸���e����j�*ã�<�ʻ+QR}��Eҗ�����7�̟} �ͫbQ�I�bN}��պx8�̆��C�'w�������>����H��:��?���¥D�j��d/�8;�n�`�՚`��HM%[�|D�̾��eb�T�Ӕ�`M&��:n�:)Zl��t�j��o���7�sI���z���OQjh,H���ť����r/��p5�~3 e,�6mF^����ڸKB���O{��DŽ� �UqH�׹�����0��H��������� ��`�t�� �W���[���`����Ry�I�Î���K�o�符dV�{I�jɶ�jQ.me��8 �����f�Iӑ��D�TYXK`~��������,��#\I�/;'����M�������;c̀���/" Ե�aA5L�^�[pՕc|���[�㻥�����=�xYI?"�{�YW��sc5[3Z�bʡ��a�Y�U�h�XbdzX���Ow���>�"_[�=�ߋ��)6�nq$� ��I��kn��N^��ZODq��aMm��잒ɷ��mmk[ۺ��7-�g~�gRJ)�S�}]O>����ASꁔ�0 [�~[ۺ����g��+�2�~��3X�識�t �J�V�]}��'�:<�>��ǫ�ӣ.�o$� ��"wb��<��'�<����DV7�F�p�ڵ���I� ��汮+��P �*��z��t� �IZ�V��^�e�p,5r��$Y�DZ��I�K�,5ǢٝJ�i���:�5�f39���v�P*��dDCp:��%;� ݦ����pN���pw�P���)�_�r!hJ�5�s>��5�ߌ̱aј s3{i|k��O����d=̰n�]�� �^Bx �h��wf =��Ι�sK{n{Ύ�H̬� ��s��UL����SxSW�>������d���Nfy�,�� �A_���X�!���[�Ɍ(:E��! Ҧ0q�x 0*^���^����Ց배X��`Dca�XS*��a�c��U� �c�x�=��2^��3�N�a�]���î�s����vI{���#�VK�w�=K������K6o��N��T��� �D�H��9$�%�X��q/�������n����y��� �y�1�98Vݩ�m�2�c������o�x�����%7�8��TCu{��fݗ�qZ�������^�~���X ��_$�}c�Ʃ �.�%o�������2��5� n2���&�7X��8 n�u�j�U�κ��!��|}o��ee� j@8�1Qd#O�ԥ�o�  w������S�Ħ;_4�����m���]��w0�����4�8N1�w�:j$��c��'���� ��ؗ��c�ڛ�F��Nd���^�N��T�7��!�4����ni�C�hl��,���b�ԍ1C=��xTh��j�~���s�naTj )<�;�F�N4��L��%�K�n�X&�[ډ 6� �����U8��4|���CX�}����.�G<�s?c̜���֛;���΅��7�aۭ� v�=�Ɠ� |�❡�ռ�M�,/�z���j;yY=�� 8 {��b��ϫ�e�LJ�x��8�D� �7���th�b�����MͪS�ӫ������qa����h1+���X6+qR |F�!-s��!�b3lf$� ���ě;y t�t�I.�DI3�v;pM����)�� }z�����{�?��l�a���c��ӌ�� ˕�;���GA���f�X��:���K��Xre� �)t��G����� �.ժ����t�b����"��ƺc� ���М8��0�ue �/��?�����&^��Z�4v���ϓ��]�!�[�W=��U��ц��=�)��ֶ������կ�ʯ4Q��e�������Sx�}����m���r�!���h���?�<p�X�Lu�xƪQ�h��/[u��П����S����.�n�B�R?��؇�k���n&}}�3��-�qQ�����?�Ʉ����,R�gӛ��qr[o��)�v���7~�7>�я�R��9ıN�` {�=؅��M��~�~������fa����v��޽Q3�',op�.��jU��C�W��s$ ��*�oU#� ���3�>@�v�-`��U,��&�� ��f�l�f�ӈ�k8;�{�͆�FAy�$u�91�~��'鶬��8�p��Ev22� � ���֛�\Hm��c��/��/����ɸ�������N�g�Y�2 7�<��D�� ��9-�����R�`C�h^%���]� l"P�����8 np����k����o�v}G�$a!C�$ ^��ݝδ�3�9��r1�\� yRvl���9���m}���߬�M㵯Wi-A%#�Be�' ��I������d�M>��@�RU5 | s��Y�0�s#����2j�m^�FZ�7�||'f��F!3�XO�j���i� ǒ嶽�q$+�d�F�M�|hҋɩ�p7�^ �������F�H�Ě��.8Oݥ��C�|����_:�c+�&�����Ep^<�_��c썶D;���{���6��}?g �]x��������1�ng�3Ӆ9Ϲ�y%���ew���j�� �z��y�I;�N��Y��$�"�?�v�1����á�5�-� �pA��*"ո�7�7��B��2|U�^�D���4���1�,$ TQ�G����5סZ�Wn�߹��r��3p��9�Es)߫6�W]W61�jW?��4�c��"$���䖪��n�G߆�EL���H`.P��1K �*���T��b�r���l�/\��g���؀W�d1G�4bk'Pgu�q6Bbeb�X�� d�}���a"$>�O��/��)�2���������[�������u���L�� �y�'v�i��`I��# 3�`�����l��Pj�Sy��7Y�ܕ��~��0��:D�X�b6��L�p,'�#N=��v�Sj|�]Dxd�'w�������<簙S�56����4;���L];e�y��g��]_��=0��F�oF�47�&t �&\��J==֛Ϧ�R�Lě�M�7#��S�x�-�Oс o�7��EjP %X@�$�Jխ�h2}��W�@;��E��A4�� wA�' �1:@W�k������WNu$0�c�m�c43��Yx ����k��Oq�v��&yE�6%0�H{�.�3,����u�����¨�U��ޓ����1�5X±q¸��Q��a���8'f�s��-�}����$47z�8���Ċ�$�4.��v�y ��zę�2豳�Ep�Z� � i���c��C肋p�81��MZ�kiݧkس΁��R4�#���7(G�3�����OJ� ��B���������b��C� ��30GYf��K�F�ߴ�z���V�I�����á�q�����^��t�o��k#���p�H�*�� ���Sd�6t��*�N� *�ڄ�O�5�F��r��� �- 0����X��Z��7fΈv�|J�t\1NB��oD�F0s#.M�_z��S����K��K�xhOF�$RsәZ!.�ps��E�D�8��a$i�r ��~\�.K�����7ES�+��0�k�%l��z�B����>d��T���c�W� TŦ�� ��1�Z��|��_(> ��� ��9� 6��t?��˪�y��U�$��o7���m�^ޖmmk[��V{������ҥK����w~�~�.I��l�^_�v��~�>򑏜;w��cb`[���YRB�sa�������ί�O�����m�;��p�֕#��a�W�Y�b��6"��k!Уs`��"�/� �V� Z�Ρ9�� �N�4K�����ቿ������Hs)��f����֛PM$����O�ĕ+W�%�4a=����>f���C��h��2����l�v`w�)춁ѾNF���>��k�vX�*da�4 ����N[ ��=�����|������ ;��Ջ���k�Zm��+�`tb��k�E��W{��I��xu�x�D��^��iP�6�IV^��OJ}��/��뼓�N7��z�����qYt"i�\F2����E����\��M���ʶ��<���z}�:� F�j�#-S}��=�W*+��v������<�N��������M�� 3q;$Q�����?hu��P�a��d�M� h�wp�$�+5��Ƈ��֟Y���t5T��V���q��lpvLt;�k'�;Dϩ>W� ��?��x���Ӟ��/�ol~���b4��¡��Z�k�M�����^nDlŚmmk[���s#�L߼{f����b�z��������ȏܺu��`b`[��v*!�(�?������S�/�x�s�0�G�H���̬�0H"+7p'U�s�2�����V�J��XQ�"�v��n��{��}�-�ʯ���ώ9�`�{�1�mm�[}���~��>������m>웫d��{����d�3������9#�4�f�@� ��d;��M"�) ~�IAm`���wŔN>�Gl�� (\� @�c(�[�O�Ʒ�����B3؁}�"��L�sv�$ց��P��1�gF�^��o�ُ� w�6��Qd��aS��a>a�OU��ϓ/gg�v�%�����wM��9��ti�n�&ֻ�&g�_�Ҭ3���v��nxg�|W�� 0c�-�w � v��a+�X)�伍T�)ԧ��`��� �νW��i��N��8�l4Ρ ��T�m{:�����lTg�\&����\�u]��NF`�م�O|�����&z�(� ��l��u�*����M�,Yτ�c�N���{`>�l WB_)<vH��I ���+��T��_x�'�ЋQq�ifD�-����1K��Xq(��5Nj�1�Mt!D IDAT��O��G<����.ܢ�1�kmZ+�X���Y�Oz�2v�·o`��p�6"����K�1-h�W��7��3�y�yf�0�e�C &n{����� �,����4ha�'��&�nh�P�����i�O��)��ǘ �1�Z$5P��a�y��Ā ffsHNPb-Kf=t���Ի-3�LJ)� �R�2���$�#Ȥ�R�v�O7��g�� amX8�4˼��D��3D���;׻��ۼ�;�V�_��3B3�3�$w�D���d����e~���� Ĝ�hĪC/|z�0L�J\��}���ğ���O��ͬ��³�Y�"$"9���:���4�݂_ >_����5[ GX�7v��=��M<�t�L��]�&�u�ϕ�4�s�MP:�w���;�����mM ���Zk�9"��Gy��'�#r�����#滤���@��O~�}�{ߝ��֜h۾= �������:�F����g��O9��x���2��C���eL��hV� �2����Ԓ6�\��D��s�r�`�A�ov��'G�b�!{�ԍL����i���������CA�т���a���z��o��<��v�'��˿�����������w�{c�F1�8��@��~��jK|!��>\���>�ٙ5����2��.C�o|�"�*��J�ʊYլ�F��M �C�4o���u���<{��j{g�m=��4��n�+�d���N�4� ���4�]8�dx��C�<�:j�T8���#b�rFuG�0�6��>�� eڠEt����R K6idM��f�����E��N.ǘ�%� {��� {k�Ch�<@��ƒ��̃Nt ](W�_EҘ E��L����5-�K6%�Z!E�`�Iĝ'��FE����ե�\g0 z�uוN���U� �1r�8랅��qg :HI�U�p�vː���$y1(VW��b���Lt]D��L�n�BqQ� 3\��R�T��ZoM<�8�P�:,�w�����}j�N���n����7��U ��w� �=�����h�3[P��f0�;؋��H��k���F�=K�9����jG c��!�������C�~�2&���d tE{�$��2���k�+�Fr ��|�_�M��F��*��(�W:�c&�t�0�̻N-��L��Ȕ�!���J�0<�b��G���St���N�Pe��OSc.��w<`6�Μ�SM��Е �����y�%�603�]�B�XN GNɑR�B�C嫶��v��c�;�y�kΉGU �cR[t��X�XQm^���k˩NWݮ�_^r@: ;H������dӖ����s��8%1C�Z���zM�w�ϒ��8�x�w �b�����mq�Y�YJ�Y�#"���}HR��Mh���|��Sk��G>�?���39�Zk���i��m�-���mԅ�����}����1�9�Uu�\ǧl�������{]�s��������ztݒ�$��UJi��o�kݐ���RA���?���?��u\I�m�󁧜Z���l�C� �1�q��}|n��b/6�:�6��^_b��€6����1�bd����ݗ� ?g6��G�ncUx5 ���J�⓿~IU4%�d65v�v��M�a���0��1\*�rp���sc�M���*Wնp�4*����!��U�����4�p;�o�E�E����J+0v9���m��A�!�9�dڸU�0{9��ו��vT��k7*-���bՠրtv��̦v@JUG%��aj�6��\+� 8(˞������� E�� ��L��&�%.ᗍ������*�LS!�pjG�i�#�4]���V��k� ��[K�3��4�m�J�ϗ|8�������!v�� �Q!�-���0a:F?X�CJ���&����G� �9��ca=���S�$���@�Y��zge�h�s�sV�G�U8�B� l�W��],� �s�{bU?��.�8<'�Ѓa���H "����qC�N.K6��O�&x[-��[�[�ͤ�a�<| ��,��'80;h80��l��0��P"�A�{x��f?�����,�R/R��:�H��0�V�wx�8FX��9�k҉X��j����+��:� }6tpJO01f�A���=٤�9���I+ c�z�����hW�L�n��r��q�ZA���-]�f��UڌH" lmM�����@�ܮ��6��Zo�}q΋������{���֙���b.�f��#iiT�S���hg��#b�U��,�U?�243��_=���4����� D�l�g䨓Y׈����_�9A����ocK�(O���O���B�<�뷱�mlc���on�J)��w�o��o���M�� Ĭ_jD�:�r���?���￿���mlcߴ���J�����-'m��g�簥y�I3���F#�o(Ƅ8����%� �hq"��{b?ʛ��[���������Q���_�̯���\�A�ΤuҦ_�6��QJY���Y�ݯ_�������� ���moc��Cr��8���1��#��sb�؉��*��d����ɖV�AHc�{S_�j@��bL��?R�e1�@ڀ�*g����I{��U� ������Hl����v`ňVjp�ԓ��')_�\�f��`�ӵ)�MG�Ҵk�[C������o�Un}J� ۇ ���/8Ύ�̔�kyF��Q�f��v�ݯ�j%D%�쮾�)����mK� ��Eĺ�)���`b)����Q��4�������S�P���� �,�XB8�Ğn�<|��,Wݍ[>��)� �B�Xo��I��ğL���֏��*Y/���7��������Гg�}b�jJ_jy4qB�� ��s ��W��.\��'��L�Y:m��l�֜���~y���f �VJ+2Z�u�{���V)��cG�y���.���;���)uN�{�#8J<�< �̋�l��bp�1�bxf���܀�$WcVN�V̠V_t�;���_��Q�5�A �Y��{~A���ZH�fCi��GԱ�&��n�M�E��)Vj3S1�M t���39����A+�E2k�m�_ y7�֬���ZkvŅ���w4�H�8�% .�+�@�9Vb;'͆>0�{q_9S��E"r�#<�T��;��D�8��T�M�����R�Ŭ^g�)���p�2�΅]H�&�ʔ2-�2���̃�`��x���O�f���^�'pP���"�R�$�iJs���]h_eR4��{q-EEf�#� �K ka�� V�ވa�!�A8f�� �y�U҂T���x��# .��&?���՞x�:� 8߾*��Uc��8�)M:���Ʀ�ۃmlc�Xc�u]Q� �?������K�6A�7��{� �ϫ��}��?��OSJk�m���7|Ef�\�>����/���?�/�S_�T��F3W�<,J���.�0ћ�.�;�KD��V(T�.I��V�Y�x �����wK���o'�M�uiŸ��G������o��}�Ӛ@��놞���ƫF���kռ�D�y�{�z�:���Ǿ�_3 4� �-�I�4��(�|���.��k�I��Tm G ����^�B�T�f�:R�)��d�$Ka��F \�$��iBcM �� ��Zmx���^e��5����7<�`*��LejjD��o��i�p��8��!:�;�,J�r�;�VP�! �T�o}4Εn����Uh�60U�cq��W�E��B_���6/��k�`�F�&8 W���Df(�1�����K�P�����%Xa f�B�n9<-��U�H;�&���ё��#Q�������&ddt$�S������A�\�.�j%�*shv�ӗdO�2��{U~p*�b��&�Q��L��a?���1��T��p�a̭�LJ)�U>��`�N��#�%x��#J�K'� ���X�P�a(kë{4`���В�r'VV���.ʡ�z�n$;ʶ��k(�Rpj~��S+ӳ��=fz¸he% 2Z`�ы �(���L*U+0Ka��]��vd;�:*[�7���r4�ڂM��m �o�.�j����LnBV0̊A�B���\��E�&��b?Ȣ��h�d����E���לP�2|H"-��jJ�F?h��*���S47է�� �& ��n�NCR�j!Y�G������OB,��� ��e�jv0�#LI �hky�(X 7�������;���1`�S|b$�/V wIj`����ҔR�U�$�5�ih�7Û����S�f��6Rĥ�#ng���Pk� �P�}�=�ݮ�WzV%�-��m`�/�,��lf���ES� fPL=�w���� e1TA�-�5 �~<��}Au��5��]��ͥ�+�gUI��3hGp�>��"�����Ox]^��t�뷱�ml㍒��7� <5Ms���_��_����Y�����'���M��~����|0���}۶�a��m|��S5�LJ� �������x�+�39��S�t��|m�ˆ��T�spZ�R��WVP�^�R=�-\�{ �S�^t�`�����c��.'�����o���������s����m��!��6���������w�Z�k���<)�A#l�r��$�`�ӊb>�hK@Ԯ��c� g��P��(id����kL�T�*�N-��dC���6�aCo��<���$UYs,s���lE�G�9Ki� �� L�Dn�b�4�^������v�,p��N�N{������Ҁ�)9~kҶf���!i��U���4+̠���(Y�Jc���e]�m(U� #,θ�k,~�/G �j����A����� sU͖��j�Z��8�p7*X����T< �:�)� ��@�ɩc� �ԋ�jQ��7�'N��-<�.C �I°P�� d"��vp/��t���hl����\�����^:�k�5؃Z¡5�)7�gN��B d�:�+�{�A`�3�eF�9�����۰�V��.ycq����� N-�袸�yQx��U���� 7ž��0-�zX���R�P=dJ�K1�g�����J�1�T����ے�9�o(%B3 f�G���o�NL���D4"P6\�G����s�����l�/(yۆ� �X5�ޤoc/�2C51N#&�F�����-��,u�!f�=��-M���;sI�.�4I�:�c��hW)�pXe�Ds�.�% � [�Q���\'� ֋"S2&��Ti�VDs�3h�LQ ��)�)o� ���5J��b)n�aKhZ���{=�a$R&c�T��r�ŵ®̓��E(A���c��M�Aciw�W�N�U�-63�3��9q7�eK��$�h ��`G8�<U�K��jkc�*�.#���<`�-�����*7`1\�TF_*1>4� ߷_������j'��.�r����6������+"P7l�����w���2� G?_����>�O����*R��I����6��C��5Q���\H�������?뫤/��?����~;)�����s��>K���u�XTP�ua_�6��[����V�~�>� )�p�#�X�J���ÿ����_�~�ً ����׀U�u}��/��/<���u���W���_wh���xu^.PH$�,m j�-ތ�>r�}lϷ��ݢY��&ЪtZՈ�D�f0�)4��=�F�R�T��0�R��֩�R�,nuA־��p���p}U�{�n�i ���z��V|�LZ���5� � [ ���Z��Θ���G�y��.l�ـbT��z��E��K4*UBA���Z0#j����>+��@�΀4�� y3¡�=`ci��n�m ��LNE� ^eP�� U#%��"��0�[���-��VMR��!r�ً:�">e�4G�~n�]z���LL�V>b�'���x!qV7� F T�t��qj����)v��Y��F���-%��;��]Gy��Ɵ�Cca��4N��Hq$�4�L��מ0|i�Gӈ��*��cA-2шc&��+�PԚ��f�-����KYg,Po�Y����x���<���?+?���A+�Sc����N1…W`��&��D"&�f̰=� �GG���k��Z���%?`��j�i�䨕v�\� �/��D��&����.b�aG�w;��S�òS�l�-����52�f� U��{�9q�G��W8v�A�}�C�Ю4�Ü���.� x��5�� !Ug�c81��ֽ����5WX�0�:�Ș��ñ%Z8+�U/t��^dhan����@Cf� c���DW�D'ؑ7=rc����;�{���6�� �){�����]����HC��6�� ��]c����;*�� J1!��3�� pvέ�,Iz����t͹-��8Z�Vg�p�L����<�D�hFO��3_n�8��(2��,��o�ĸ�����3<�BS�M��ڇ��mlc��؈��5!h���~���o�S[C�5�Y�R>�O<��7n��9o�����7%JP�nI�H���?�?������nKs�J��v�Q!-N C�L�'��^Ȼ ��H:.fp/��"t�!~2i������p ٓ\9~�~�C=�hZ�¶�Z�x H�8%Ֆ����u�#��_U��v�e�(US5�+�ؼ�B!�� &� �I��1�`E8����6 ��.�� ��� 3h+��Y���^����fpz2z�7Nn-O1`M)�)�����0��}�����>�3L m|ð ���º��AI�D�������^~;9��~hSX����l������x��䃚� ,4�f����k�Y�򀃍N��.��ۭ^ l��3�d�j;,1�-աnC%��#��58�]�E 8��v�Cƃ0d���bX�3k!Gk�d�b�2�{H� ���ŚCӳ���Ǜ�5e�/��� �����'ų��E� �0���߈G��h�s 7h/5< _a�H�g��.|]v�+| �EpTxB��=� ӯ$!� �La��B� $�v��;o��~��m��S ����]P��(�+A�8����O���w�?N��1�K�3���Y8�X�:��������?6; Y^Go�����C�'�h����� _��u����ʙ�Y��f�P֏]͖U��.�h��v���Qp&��>L@�4;"N�S�@�襂E"���"�-l]�[_Z���I�b�80����d�K���aOM�C9S�C]��Py��_T��-��� �C�z�.<�D�p!3�z߽o�`��@ :�%,�,�C+#c��R��,�x@cL�$VP���ƬOU��mGZa�G��\3�E����(�fv������r�h�h!���6q/�!:��(J���rRrHX -eRb��G�`ͅ�$ɮ���"Q+�K��`2V�� _�u�Rm?6pY �h�1ݼ_�����G�l��9��y��}��[�ق����6�1N\R���Utx����S?�S�c�&VU�����iXʃ>��w�����X���6� "Q�v�J�b�(���o�� � ��9dX%NЂ.���� �K �V�T��EKq�I��ė�������N�wf��iH�No����l��SJ@����;���iC�^q����<����S�T�̌-b���|p���[ V̢z ��֬hB���7�Z5����M`M����-4�n�;V9��YB3�I�����l6��O�pF�&�m��[�RM/�.�k>і�w IDAT7f#���a�|/*�0�o���>�Ҩ�`��F���|j6#M�V$ǹɒ������������L�V;�R�oȚY�lxJ�j㾶�,p_��}C� ;;� �4���A��� L�����$v\��rK(D���^|���hhPS�9�M��꒙�V꯭�T�Y�'r\W}��S؇,�����=�s��+c׽{T��hVz�XX�!��%��ᯈO7��t�Qy z��:�+ы%�l�w����}�g�K���4KL �4�'��g���mt��>k����q� �,2�x��� �ʎ�"V�㒟��/���]��JO�2/���d�VM�hZ�V��l ���d�h�J5��]6.\N6�D�P*�h�Ws�W�����W3lym�PȾ5����` ;�^��M:�iǙ9-� J>�:sg71�K�)h+�^��} C�Lլ�3;��K�ޘ�� vs��{c�c��e���y�l �M�va��`�`�k�{�+�*BGe0vvb�s�)ѣ%L=ͧ$A���1��D@�c=U��Εa$�FuQ�qܝ�õ-X17Z�EN&VD�H0qk[K�Y�"���5o���əN�sgc�=��3�S�� �[Cz=�v� �m0�waǢ-�T�f]QY�(#�#N"-�D�:SpW?,� d��Ŗ�%%�v@���=[���G�*+!����\˷v��U%����f�M�G 9�o�}�V�~���6��6�kD�b�f����x����Z�b �j�8֜�5�� �������?��?���3[K���\�TA�uUc;r���;���LJ���������������O~򓅞3��׶�V�<�=lqJZ��os^�R��iP��Y�/:�j*���/�S��x�4K��� -�J�'���1���ի�{���x���� ���X��:��$����Q�ͱQ'�O|�����[ ��ֳꦣ�-# ���eX��k�N�(aV��� �eՌR- i�I!y"J��c�"�[UV�5hF���r^܀�*�a�Ა� vD#s���^��LTU��h��0�%<,�U��<&N� e7X��l͕R���8��fl��,U<�7�3r� U����d��;9�Z��ԘJ�\[�QJu6�;���1�Ƽ(�ZHj&M��`�k��U���U�-Q,��%b�Z�J���&������>6�!�,� ���C��B�H��=R�^�B�����VRQ����b ��w�mX� #!ɂ�sL4��h�VI+� A*��v�&=$!�Oe�L��|5ɥ�@��E�⅂�V �y �f������RŒJ"%{(��JWbA6L!�⅍\���v�㔙�v�ձ���VNR�'vv }���鯰 /V� v���3]�+�%�"[� J��i/y?)�$�²hwV�<�|Oa&zڧ��I}S.X�s��x��o_���s���Z���#�V�¹R�#��UK�8��HϮ���!\���� dd��9G]�4\�͗{�up����y<�YzR��Z;[�@�l�g����h,ܸG�x���r�z��,� $�J� ��Y�W��R� ��DC�B��� `��jw1���~,6�EF�:U��`�j���f4Ci��-�T8K�H�[�������]p|��Бq �A��m���<�4�)v��¤�z��A�_�#U ��x);=S|�h�@3r3tih�*�C ��,�*�� ����9��$�c��U3V�~$Gp��M�'����F���e UK��^�+��$�&Ԝ|y/�A��f�jz:S֭ۗsNB��K�.�u��W�{5�Y.�Ai&��"��g�YŎQ,�h���M�;�+)��K*��,{�$���i&͒��:G�$(�bjc�=����w�Ɣ\/a<�����G[]<jhW��t�)�hN� f��d5��ݑe{ ~�m_m�\�;9\hWq^6�k�s���qZ��Y6��Y�Cg/�P� �bv-k�9K�݋���X^߼&���e���Z�� l���_���E�kT�YO�[�~���6���R�9��}���������;�SE^TL�B o�S[S+|��C��}��������j۶��Ka���d=�-m����R����ӟ���k�x���!��5������������Pd�Rŭ�mD���gJ�EV�յe&��yV�txx��w��S���ŋku���/:�m��N� зm�sn�f��K��?���￿���H��yW-[}�,�A���T���lmVjUW��Jgƌ����;�&r�k�ʏ�p�����Nx��ꋠn������Px=<T��p@s��N�e���5�X���j��[uS�%B#�&7e�x�Ѱ\�؇r������W�ѐT�:�!MH(CB�ݖ�UO�,j��l�� ����0��u�5nR��uo@��ml� f������~뷀�mo�4�O�M�_���G衰g���r�z�#n��|%���i�����i8fJ�kE�qW�Rz�������'��XMk�~���n<���Qǀ�W_��~�W�W�SRU��zg�Mh��lxCU���ś�R�Uֹj��f��O�F�*֓*8^�Y}n����v��3hM���*#tҊ������� �{����` �`��s�P�/�d�+x3\0��ZH#��"c�މ���R o#P ���pG�'De�+�Pը�ߩ�Z�ʝ�����U��31�ҼhGL�5���/Q~��ۻޝFUoW�����=�u�������Lh(ΰ��yb]��LPlxk�5$��Q3(������� dU��k�G&��Z#f�9I�HMG2��g����=6i�xx|}���P՛X �=���A�a|��c@�z8�n����ܕ|iv"?K�8�)M?i�i:��pçy:�2���)Za1!h�I=,`i,�%$4#�{?��{��$� ڻ#���3��|W�O�?³�:8 ��]5.Ó� �tJ˥���Y���Ɏݲ�R}n%#T����y�Kx�ӓ ��|��{�4��>���{��1%�\c�J�^XQrRH;d��nRv���l`;ؾl_��v�?_{0��z~�f�DC�y�as4��Y�|l�f��;ƞl��5f�i�)1 �q�`��0��]��G�1\w�d<��/$�b,�e�hB� w n��J���mD;PV}�j~ ��4�����pK�RC�(��s����0�����Oԋ�Y� �g@��{�Y3T-~��NU|�*X� �С>�eưd ȡ(�f�E+Q 5xJ� ������ DQ�� kݦ��z:�j�bç �X�������ơ&��v a'�e������qݹ|8V� V��K8�0�1�XJ� Ypz8A���?1��,�y���ٱ���&��6�`�6���ml�pvE�������菚�Y{�Vuf����P�,��d}�����/��/U�ي���|`�C]���S���m�*��s��_����������*�e'��=��㖞���5�l���ux���\�d貱��˰�JQ(E��I��?��w�km3��0k����wxԹc-I�4����w���7nܨ�Q�qg�A�A�`Lja�UK^r�hU�~lH���KL�DUk�}���b�f��(�b;�9L�� w� =t�W�2��FL*str9�&F��<�@���:;�O��8��@����n��g.��M,&fl����iR���O�X8C��M/I�U�E���`���Z�Hk�^c ��/v`^����n��>?'|�`Vv�j ���� �h�%L;�I�ld�� o���Ĭ ��g��;���`���T11��݈=�q�, R �2,C}5)����Ghqf�8�Lɔ���MF�&1��&)5��F�<��tN�ˑɶ̕W*�Q�E�������n�� �FȔ�+�ki�h�)P���w�]���{໓���e���#��1�,Tƥ�'����m�?_'fF�'LŽP̴��V͐�=����`)�H�)֍8w\xM���c^��#.�q&C5 ��B��ު�'�P�(K�x��,�su�D9ӏ������t:�/�� Cg(9%��+XZiB3Cw���o'��]1� <��uX"�0�f�G�ge�K<��񹊁Q]����\,�4�d���Id"Q�&���S�/��MdYW��P�e*�U$�G�,�7�G~��k�����?���&�~��F 38��bp��.q�8o� .�� �ϸ�gU4ǧ�9�af=]h�<��f�t�3-�ZMR+M����J���|U\�����I��i�]�rX⸰0VP9n��P�&f�q��z�����d�H��0/�d&K��hǴ+�Sc�h��ƭM�6�� �M�1lœM��I����i[�!���h4t0�V5��&n���{�,���/f� �Te',c�� D{����]�PV������%�֔�p�J��>"�a��>'Fmb��E�P���Y�u�Z��6ﷱ<�A��47�coBo�X��5����x{��X�!�4�-�Ӥ�2�D��zS/��K�u�s �2+!��\��!"���z[�~���6��]Y卦��������WQ� 9�-X_���_���DjY��?�ϼ������>��+�Xۦ��t��6^�'��Io~��ww�y^S4� �6 'q\gbׄ�p�< �C���/R�=҄y���ڍ3��jR��~���ɟ���>WE�-ku��m����$R'��~�����rI����v��A�� �aC� �Ye��ܱ�41�05&�ANT���%�� ?��ɨ<` �lZb'�醳��~���k�^�\I�6�f�]�}lf0�'U�f�,Q�%��7�;�0��`}m�Y��W6}�1)xIV� �$��J&�潓��̠�Cbp4L�$�K��>��@�oa*va7ةrМi�Wɍ���`H;j�B��ΗZ�v ��� S�Q�CU���)�Mr��V� b��<9�6N'�z�T�1GFVEf��=��F��7M��r�);P(��g�ƛW��7�����X{��Ȭ#�������]�<*��#O�ձtD|����fSkn�Ut��e�Ê�����r� ��e|7�݅=l�W�bN_"�Ȧ�H7�D|}V<��1INx[;�(�s�̓��4�i�[�,��y��^S%pNjn�c��ܐizk���k�~��F�� ځt7�'�M��FDMk�^o>���he5ٶ�C����q NP��� ����}D5��x�!O�юb��N05�m�e%�W 2S�"�Z����K�;��S1�f�ihR?�����F�QC�N��OM������R��I �� ל9g�|�G߸W��Z��b �� ��ޭ�e,{�I�<K�٭3�:�'2Ȭ3:85���H�����‰)��kz�hL�����"� x��e,`��F���Ajb(�ܖ�f�\v3�%�*���Ej��и^���V���I[�H��[�����a�dj����d\ƾj��s�tù��Q� � +"�<=m�;7�����6��FŬ'��l6���?��?��}߯U�X��l��>��Im�V�����x�����>�����Wg�-1v����Ց��?��������/���|V���!��+�˨7a$QT����,��x��"4ݰ5Y�8V��\=���|�R���>����������G��+����~��;�MJ�C��/��/nz0�����9O&������#���"�aț�L�%4@L^�~Fk \���T�����f1�d�y���q��P�J�H��%��A2��@�m�݂@�À�TS�`ؚl?Jp ��Rh5 [D��آݶ!�4��j��Ym�,�E��u�ω���~����*NE��*��D�̼'OF�ر#�_k}?4N#Y� �&1@Z!��XT��a~(��=�*��'��ž۞�Bj��䆋Z�F#��ʵW��O3��j�Q48C�T��Nы^��C�k� Z���6a\J�ܴg�@g��3�氨��P�x��ɇ���ct�� ӈ ��抂"�A�:��6Q;pMf��F��UG�4�d[�� & ��!/���[���*�4�ǖN $�ֽW�p��ư�g�cr�JW�3�:���ͻ6dT���j��,.T�-�\�]w��k9�׎�"���g���'̺�S.U�VDHa��)�Y����v�j�)--±��:�ޖQ.�%�*��>Ӕ��?�D��. ���Mh�,qNj��P���ڄ �*�%��*M���Ԓ���)J������T�0�P�5����0]�/��Mo���.�c�����>:������G{cί �idrir40Z�W(��n8���tf��R�"��G)áib|sy۔�8�3���M�LtN�̪��ɨn�>��V�:f(������<��,��T"��Ř�݃CX��Y�u�+X�RO;;0��E�����6F'��I �N��Tv��Ҡn/��8�[/ԜD_�ԝ|w.+���D�2\\Ի�^=���o�Ze^�N�S�s��A%5m�� �6�3��݃� ��H��}D����3�7�������T�ބ��J³���{24����K�<��'f����of IDATq$6���J��p�����h�.�ա�8�y�"�b9�+�>'_�ǃ����3{�g�T>N���.���\���^{Ye� 񨕏�0N$J�H��[$�F��nY��ys~U��~��+_��w��݌�8Ӳ�;��̗T�-oy����ZDϖ��t��9m��I[�T�E����FT�Bd�)ugr�3�>cM�(��d9 d����� ���Hg�A��?����5�q���sb��d�V5R�0�;7{F�[޷����ma4�����������tA��P'z�Q�%�[��!�`d#�f��X&���+l�dH6T�6Fb�t�4�ݕ������VO����$��>>Ë5:d�u!��X��!��V�R5�X�/� �_�N�n��5�B���ӑ��u�)e�C��Hż�5ڄ��>X�9��7�$t��?��'��@h���7޶>!Mݖu���bɲ�My�|4��������O��D8X�e�^K� Z���2��W�`�9Z>t)U#�ٌyƘ�3Νs��8�8x��=��<��º��4�5�h�LD!:z�}2a"��Ij�+��Y�2���érY�s<,�'�ʅz~;*�$���r���:������x[bi"�G���+��f�s����m�4X6f0�0�f#��L�L�%��@qK�G����f�a��k~�9�����U]�j���y�\�h��Y��p] ]��uf�4`��e�8�a�/F��扻��)]��cF�m���|��Ky?��R�'�}�H�y�wc����l�`����t��a�=c 3Y����l�0����_��g��n�O�3���:ΣK��g�]����2 �aI���k>E�=��5�ak��V��06=-yS8�O���}Z~��uV[�"�����-����R[W���^�� ���p��R"��[����/?23�;��_���d{0s�1���F�(��f��{_����jɂ���$0�+j!�����X��QJ]cܮ{|8x/��g��]�������c���lw����X��]�b_ZԞ>眧��-o��������Fń�KP����;�k׮���/�k^stt��o�_�S�:ZD��p�$�ㇻ�zܨ�O������_��;֨/��h�u� ��T��:��E�*ã_�K�#��^��W�=T�"�@|x��=C�]���W��mo{[� �hm�ld���ηj ��JlD:�|����׾.5�*��2[e�u&�|�� ���f�]��>���B �����,DX���J%EC��H�It��l&͂O��!RE:�U_Ձ��s�T4#�DVxx�;�n��碌5�r����!��>*�W��2���[Ȋ�3�$)a@Add�1A��̙Yw��W��W��B����^��k��a�J�dg�q�'�-l`�tι�M�9~-��?�t�d���h N�Q�}�W��ݰB�]v��*ݨ��OH�b Wq��S!�"x�\9"���u� �m9ؤT�䆅�&H$ɒUo�~!]��{3U�I�um�!/P���Rp�<�DJ`�] T�~�a�\�U ����LB�C�{˽h�3$���g�2�d;jԑo��)�A�����?�9���QN�׎\{}�X��m6;���y�QQ_m.[mjcG!��G�F�� �(t��_��KΡ�Z��⌬OC{��DK�6������.}n�.I+���>�yW�����j���$�9�AG��w& Q+��]>z�-��>���4|�Oɮ@�w�b� �X6���\��9��x.����YO%�q�Ϋ�4�kc=����j�� +�a/KH�Q@�!0�1���V�E�y� f�csSm��N���r721/]j�,Y"[,��w���>tO�ވˑf�fQ�]�P� I������c�Ythv-��%��q �NoVMT�N�(��S\{f���Z�s��#�w���gǼ�Y��Ï�R��˷D�}{���-�{�%�U���[:Cs�gqU�}m�m����� }[a���q9��2�**���D���_�!q�ʪ+�PSyi�4%s���t���0���� �b��|FGŲ����FǤ#tB9_I4J���.Ĺ�뙷���M������R,Gƭ�PX���%�KI����У��3����'���,�s7+$5E�P�/51�Ku�!A���X�Jf� :/ K��� C�o�r�q�C��Gz?�3Ri��]|k��Y3�kC��A��[3B�䌧!�h�!1'����3�,���ҽ)�@�3���6������}ze�f �)l�m���G�3������{���j�U9�(��^ū���;��^��� �؉����.v�_#�7���ϕ��NZ���o����?���ɉ �3��Nw{������ �u2o��V���y�gu�6��\_J�9����������5�q��Csrr�W��_����� ����S�u&)v[��ų}E� � ��h{�k7���^��o� �䟧_�ż��1�\El\���x]PR*��&��Lj�3�j�~r��������K�� 3Q�:E���B�u���R$ ��"\�@C4Nu" �S�D���6�G�����Xev[rs�۪kKA-:N{N �p��E���8F�*�}�{zI��$l��3�~;��}��A�R�o�� ��E (��Z�Fz��/�3�M��46 qak��/�Y[�EX�O�Y-�v��Z㚏� ,�����ih_p=���S�UF�*�n[@(��F��Q =�e�qD|����m�Z6����+M\���щK� �9��*����D�'��#EO��b6� �MI��ߞw��"�k���B�.@T6e�S��W������g�c�L cՂ[�h���1��~X2�+������|���`�10؇lk]י,"�EBt�M�M�M� � ��s���q/d�}�K�e��:KX�<���&�3�����t��^O���ev.�홯�y]�ƿ�`��9��cϘ�եx�-�x��Hp�;�'#Y2����Z�){wD\���Qt�`�.$!6 �s������?n|��<~���u�y��)�]뼯�I�p�2�"�S�m��p��]\��?$��f>��3! ���U���`�8�����5$P�U^C�V�V� [����X��ؠmwD�r�s,�e�݉�Sq=Yd9�D�*�N�1�!�7J]�7���v����{�"�Oe�)�N�8�u��y?�����Pmhk�m:���#g�:�&֒D"��]�k�R�ۡ���ڞ]|���w��]��鋛/������[��Te����7o�|�k_��W����p_��T�]Uݪ-�fȳ+�l�0��UV�m%;���9����3�b�X�����C=Tלg8�.?�?�s?�s�v��ä�V��ui��%U���X���I9��扣?yū���z�o �E_�ތ�M�2�˚��x��o]�e�"��M�R�1b[I ��?-��#��� ����4���Ag��ꨢ�o�����U�� K9�ms3�bl�ְ�� �ΐ 0�����|Nj� I�J ����-t=t ��M�?� v*��N� �l�,L �t�� �F��1�iЭ�B�� �qd���3�33�ٸ�M<�Z;t8�$YX}зJ�-�H��Tmo��%Q�є�a��}����3VQ�&Yd� '2����C�"����U)�_��2�;J�ފ��)���ham�0>�� �ͺ&Z�VP?���3�]%=�<8'��%��,��.�[�-8J���w&�Μ�8���4������Ȅ��Հp¶p+!ELRx�J�sPv�=1���ܕ�Hx�e�LY�h݃g�R�D��z�X�r(��r0[Zٗ�Ģ0S�(i���d0�Q��Wg{͌�b��bx��/1Sʈ�2h�g��¥���e�P�%1�~�CB�h!Z�庿p_�<�]؁�'-�BC������W�+�X�FU���b!�0�# ��h66�����ghvq �;�:�ԋ~���,ňā3Ԋ5v��Ɠ��� �7��ħhN����� �@G�>�fLHȰf���q ���¶�q��w�V#5�Ckt3q(.��^$�J��Q�/�Mmrq�#�"�� �`^l����_"͍�8���g�u�K-�S��ɫ�m]V�&ا̌�8�,���]�{#��0�j%�eӟ��K:���N��l(E���j��c�fx n����� *�'�DZ�f�g��x�.�1|X-�p���TͰ�/3v���]�b_U��Mo����3:�=��̪���ݿ�w/}�K�g����b�+��*n���g�#�T˴���dfP�F�]�������~��v������ �)��������R,��x\&�Д����W���'''@-�����>w� z�Ih]���p�9��������? �%"z1&y�H}yS �4�W�v<Ǔ�0�Nv����4z$Wy�JW�𾔍U[U\*Uy�[*�:U�С�1Qu+����w8M�V��h��1wt��q��e�+�Js�C%4�f0�fDrQI�ċ��c�q �ž����ة�1k�v?�����X�-�yT?I垬j�[�H:b4o�V��j��rH�%W$#�|j� 93sME����&t��h[� F}_[0�!�a1P�t�],L�1�_�CP�:yeh��2܍.��EŒ�W�|�1�P3=�UcL��i�y`�8-�bΌGᣤOgP���6�<�����u���� rŞXFZù��,,;I�܆�ƾ�{Q�w�M��#�9�s�`��������.~b1Xkt񐅞T�������� C��&����.�˰o,��" R5s��JC��l�����'�eƅzXW��\�N�b-�����E$��H��X�1G �G��+��*��ʪ�`.V�Ap��r�K�Z�j 3��ƆdjX�����`9z}���̆���$@�q]�c �ځ,�l�'���^P�� i���b� �y�v YE?]������z>JTh�>#���?7��6Csi$��'��[�f7�5T�X݇�eY98���+�Y��=���ng��9�[�����-빙�ʳ����� �^@�U,��%�WBw�D��3n(�����r�\� ��>�w�K�Owa V�~m�68�|7�,�� Ó�w�Wf�B�]�^���t��� v'�iNGn�Hg��[�+5/=d�M潫�� �\2�_jF?�c�cw<�U.��]�.��؉����.v��E(�m�����իW%=�+��USh��W�Wx��_��_�@�UFܕ�?{�s�P��N���w�� oxË^��׾����+�����>�K���Ր������|��X��s����1��k�_����?���<��ԑ���|n���T�G��X�'�g��~�_�����O����L�(���/w�n����[8��fN�4O�'d��f�R��Y���9�L��+���WJ�` �"!��m�X��XC��-Y�(���,��\�"�P��t�XD��ZrL�Gz��T"G�eUs� r�u�������9/6�qTlw� �A��X.�=1��O3]z������D�.GO0‰�u�69mPGDX'p��a�d���L�����:��q'�}X����ά����o��!%�o�D]�� ѡ��A<�d�t� �!1�'Ͽ��s�MȰ�UY?o�e �p�)����.�{�*\�U���G hk�jE����4dI-�<_�i�������c����4���J�!�$�B��JcZ: c�e���K���F��=Ҟ��cs���4X�ֺ�������4�r_�5�9[N�yL��A���-��>�=b��o[Iͭ%��,�+����;�:�F7�5t,)�:�όO��)�����]����)�"�ov [�p�!���O|�C��[܁��9O������ۯy�k�� 3K)m6�i/����}���o��o����3�Z��sh�F�f����_�����o��������ى��<�8�w���A ۘ��;�x�>WG� 5t�]����P�W��Q���R(@��Ղ�J*z=�" �0�ܕ�Yx ~D#Vp�_�K�aa�:8 ;������ ��� g���*iA�a|�Z�FX�:��uM���Y��� ��`-:��zbcv�� �c!2��"�,Jpǐ����'����Uu{<Ж���8�e �s�%o(է�ΠY76Lx�,~ܩF��ab��ee��{����H*��ګ�]ݮB!Z�5Z�v@��Q������̞ӌ���x��h��� V8�9�I�ؓ/-�%�6c|��g �,�;�� �(��Xt_��Oi*� F�WulUjۓT`.�FˇI�ϵ|�y#�pW�=pv�ػ�����և#�7бhG��XYO�����Mq�W�����F�/|k5j��c�P6ss��I��E \J����̰�h�,y͆j)V���g,��k��n �p@�UD�����p�5������cXlk ��\ ����]}�t��j�:<���~ X�?��4��g�}�����u��K��2:�9��>�>�>WtJT�LE��i�k�EV �CX!���ւ�ʘ��� ���]�_Η�1 E��^�AY�ož�.�-L�u��Eb��3�V��J�S��ͳ/���^ ?Lz�"��E���� ���k8!3~��k��=ȥG�IZ�Y�t�Xy!�EĽ�tJ<^�p��*�}�rC ���֕Ȍ�T���H"?�n����i4�s��a�~a���꿊a��.v��]|ّR�e����������s[���'�{SՊ��|��ɟ���?��o~�w��+ ��O����������}�_���򓟜@+�s���_�*��!i*@��d�������xf��F O)ӊafO<��k^�ڔS{qj�a7��3Q�%��=��_{���ko����b��.���Zfz����w��rp<��a��DR٪�ޖ�}gD�[H��FpU��H]С�ܶ�>�Ž���Q�� ��c���j�% 0�TJ���P���8;��I6<��38��з�a�F����`��u��=��QS�a������S��8 n`����p=8V-�� v��]w�GX�+sb���Y�f(S��"��:�Lq$�Щ�ڨf��� �KV�-Qo .TK�A�Z�ɔVf�!�P�������o.�� '��;���x��C�tX �����3c��j��k棗&O�$���0Z�u���f�8�9�=tm��& L�h�L]��o[�oF��I�ɽ��q4��@k�<(����h�� @�g�>XU ��a�4���Qm� lqRc�B�e�:,&[���S�q=���s�,eX�v ��]6;0j+ռD��;���FJ��n�'n]���,�l��x�1R�'C,U~=�I�(���]�H�!�pi@􈹘Q,Y�R"4s͠AI���� [���K�D��P_���؇C�*\�a����I�� v�d�g|��2�#���m���c�!R��VtFOl�Z�$k�G>�ǃfH$����NDQ�Q����A�ݲ�� �Wx}�5|�k��� m3�z�����k��0$��9eK�(p��j83I,�2�DB������ IDAT�#�1�����y��+�aKWR� ma��6Ħ�J^��B�����;������p����@&V��S����%��0���d]�C0K����ػ�� >g�E�.̜o[�E��./#�6�g� ������9���*\�4�v��Wso��]�b��򵳩,4��+��+/{�˾$�Z_?���Tҧ?�������o������� {Ϣ��'>�7�����?���?����?���LL=�}������n��!QM#&U�|�]w���ϯ^���]1�$_�*MZ�/��/���899�ޙ�ec������J@ą���;�c�t:(�V����X�xܔn�1��h`��g��93c�]0%Q��� Na��B�������iEZ���Dc�٨��y�kzg�v��ak�鶣��N����q�<��i4����2 5f�k4�3R�m����GD�-:���o����P_ʘ�(ɧZ�q�=��s��t8#��7N$u�8�@�(`Q�-��Yc}2�����|��J���2�����v� ��ѱa�&�ʶ��WmQO^�ctF0̆�P�9���u���c1t����F�H�J�!�DgE했i���x��m{J�m��}��k�X����L��ӯ�H ����@v5IM���Tڊ��b�P��9@�vK�����@�jjS)���!�:���b^�fɬ!�pk�!z��Ƿ&O�bԔ�z+���z���?�yn@r[5���&#�|�-"���8�jBb�cMƔ{oN���ڨ#�DJ�_�C ��t���r�S��8f�9ء彜�y��gF_8/�� ~��K�(BEщRH��h.c�f�)�6����-^X��Z;?d8ݍDi ���ν��Z��U oC���|^��dV��T��H��|�g��=-��u7�;�>��0+F1���^�͌��8��Au�vϻ��� �nv��]��i�P�e�U8������zh[�����LL�3+�w����|�u�{��������'~�'x��Z3[���㪽d�I�,�:�u�v��U��r��O��(�m;��J)����Ϳ�7o}�[����)�o2�������;�|w��n �d�=�/{��~��׿��ۧ�tb��o����oSJ�|�;_����mo����;���o<��vs���Z^�WKX�/u�P/���~����v��PYut�y��*�)S f��?o�` j��:'yQ_k �\N,#{\��2���锡Ȓ�]V �4�"� Eȉ-n�"uާ��%���(V��q+P2�d�zHXO8�S�� �o�ѫ�Y�ZO_��K��K/:�L��΅щ����֏a%I%���� ��~�:v =��D�D��rD� �1�RР�Y�D�AB%a"̊����F��E[ԩ���j/��68�����&/�B�����Jb���.���XEX������e��v޳O�Q*�q#B s��0��ρ�ѫ�� �r��C!��%�;�CN� ��h6ubHo�|���ԫ��u$�xQq�~x�Ȑ) 1�RB�� �<�dq;���Ԝ�6I ��`�ѽs?k>��q�F�K��ōU{t��rӟ��5�x�Z�H1��ps�� �( ��U���-�B����DJE�j�&c��L4� ��SWi:2���Յ�3%��;/�P.�Kt︢&ˆ$/d���^�I�d1�u��& #4�v�\$,�1�J��zbf���"�A�¼GF?�,(M���8c���}�%�Bk؀��âϪ���(^70��k1s�Q[C|eIi�H 3,P ��J â1D�S�ޅ�E�^��Y��]+�p��r����� ����U�E���<�4��&�9��P:��aF�pZ�W׈H�z!�,IIea�E[S� =]�Xxt ږM��|+m�^��ϧ�����qHɅ��o9�l����#�좿�gN�:���t�7��/�9p��q?����L�fNs4�Ǣ|k��WW~�gʣM:SZ���̍C�oDC�B:(,�7M|{w��3>�}���]S�.=ڔԥY_��a�hns뭗> }5���-�/p+�;�wPy?�e`<�L)J!+YJ\)\!'��Z�:�y�Dr^�϶�C�؊ݓ�.v��]| 43�������z׻�� t�Q��f��E)�����|����7��;���I\����-&2�|���G�햎m t���u�T�\� �FR�B���~����~�;��;^�����w�P�$��f\J�������rl�I^�����O��Tn_��h�o�R�%#�|�������_���f�n����7�~��73�!i.�Xji[{�yt�����������7r�e�,j�� \E�0'�2�jEH}��� H������m�^�{�n�� �b5H�:�\:7(7�r��Ya�zJ���B@p�I�T ��̆^��|e,� K�W>��9:S���XC�������`/i �L,-/R^���zTv���^�U�I k�BQfC�I�A+� ؠM��l�ʠ0k������T����F�Ƙ�[� k�<��X�n��p6�u�.�ʀ�1wfNcd4Y��Ea������y^���6������.�7oe����ޱ�LTM��i�j�dD"���O���=R�Q��zu��m�1�Q��@.����x�n��0wڠC���-��b7��¯�9��(���}�m�)k��:N��r�Ya>��j s7ф�d1T���z���:덓ͳ��g���P�m�3�-g�MЍ|�t{E��3>�C%Lj�sϩ1b��2��4V���a�gS�P��3���9C��Q�qa� k�������4��� ��/�ERyB���k��l5 m�x-�/[�X_h����PJ��t����b�"ra.�����J6*[�ڕ{����<�@S ̶L�KP� �����c��'w5�P������F�5�I.�9��ūٟ^�^� Sܺ�Eߎ����X���?c��P��{DF�pM����J)����o�r�!l��LP��;�����}ҧ������[=��j�E������vh�sʣ% �(Y�����k�:�2h��h�β����bw��R�{���.v�����4�Nm۾��/���*�U�t���G���4�R����?�K�/}��}ߛ���k׮աh�f��p�=>�d�s����A�+��4�ƭi�ڬP5��������ַ��կ�����~��o|�#�<—�$m�iO���o�6��v��W�.�� �8�S<���/��딨�w]�����,,�T����������=���~p��Sjj��{�̷�o���Y:Rw~���߿�ϼ�߾����Kw�.u,���KO����s+�!�q�LeZ��SJ異��� ���]�� `�c��UtX��jxh���p�<�R���pL��8�y�1h�U=�N�p�Q|���\q+�����-�%�Se+���6ι٩�)vfl�#6z����6"�a�ϓ7�Wx,8"z���i�4���������� D�e]p�G����b �o/��d]�������<�j:BDkt$�a�J���|���6��D� k�l�ֵC&2�r0��s�(���6�?da�A?�`�� $�q�ڽ-=����K���X� <�?�q="��s�k�oA��ӈ��w�Y�w��*f���D�p�%��q��imMĘ� �)C�����؃� ���_��>�0�ͱY�@?e|��D����CTm�����_ȟk�鳩m"Ɩ���T�P�I$e &Ʋ�)�)��^u��b;ٳ%#��ɱ���b���ӌIK)�}�s��f��������~����}?]��OI[���>"���������ٟ��׿���~����~�*�UV��w��� 1s�y�@�$�I��e�9� %4 {��n޼���x�;�տ�W����(�����e ~�ww�@m�W��$ϴ�n6�}�W �mo{��_�������UJy�&�j�뺺��Ї~�G~�~�~����TιN�i���3d�Iiĩ �2~��7�� o�׿M�2,(�Š|��Y�{� � ��6�t�F,�j�W��8�ϕ̒i_\����b%��q���}��t�M���d� �hml�a���,���W*�U���+��B.f��ٔ��3��}������[�L^�-:�ӑ-�v�â���0Z�6p.�Q�~S�T~�un�sYrcڣ��Z�8� �U���2cV�α���]YHZ�F^���`�o)�n�u�[�V��D`����z\ ��Zc#6n�� �9�ZYZbV���x� ���B{��$@Sm���bo�*� =�QI�U>��"xH�LU�TC3{�(�SHu�Ώ{I�\�5\dw���Q4�+�, �ʑ�5cZ�L5���D�i��l���޻��r]���j�˹���mw�NZ��H��!����A�K��@? �� ʶtvN�΃e�jn��l �a�bZ�ݍօ��ĔDQ%�<�}[kU�9�~��j���9�dG�1�&��7׭��U��|l]��)�8q�Xװ5� �� �3�g��DXn����� tF��f��R틚�"�*]��w�E�,��NdkW�^�rmZ�3��~+\�3:��զ��u�j��� +Sˎc��,��V} ��ЃB5��!�{���$I.�u�� ����JKM�&W��$ec%;1eap�G�����os���)���+�� ˢ3:�Lr;�gf����(��m�\�z"�eP�H���kx���+��X�j�W��E���hvQ+*����s��:�C��j���R��t��ɼ�^,��CTb̺5��� ���A c"�@w}^��w����{��a7�\�7���T|��i_)P����H�c�"|G*we��~�PqN�.��c_L�� ���� �}��&�%�㋈��`D��]���/p��~��h�B#�,xM���)SSy]����B���$g���4�pmk�ߊ�۱۱߲1ˣU��D�����̗�����9���q|+������ܔ�?���?���˗�G~�G~�G����[�>k�73з����&UĬ�#w�q�\>��c�?��#�<��O~r:�Ļ��,��N�=WA��~�ӟ�z��=��3�m��+?�R/i�u]�x��������K���;�X8W�6�rׯ_�g����o���?��7�qǪ�o��;d�����Ȱ�-|�7>�?���É���1.+v�}��b?m`� ^���B�f�C2�K�\�(�͏L&�E��Ǯ�� ��v�[X"E?����I�2�ւ��m���!X�XY��E�T��H �,���;���, ��x��d�e}��4�o���re;1�N/�n^(!&#��� �Zӿbi_ ^�k�'+h�v�2�).� 4Y��cZ�l�ñ���Cbmon�"� �`�*h�̝� '�&u���B�;�)�F/^(��sۑ9,H{���`�&OeQq �o�� VL��3�v�ϔE�����\��(9��&�R��[kS?٩���&�M�z��M.�MNY5��S�� l�m5�Fv�c�H�yiMJ:+W W� D悱�����hW�/{|��N��{�J�CB�^����Fș��������z�/��!:k���>u/����z�� ��N�1�B� )������L ��I�#F�����a��@6E�ʾ��WC�ԟ;�5��X%)�Ն'5������Q p�� v\� P��4��ˆhe G���Јu���� z;��+�KN 0E�*�I�4S�ic�Zl|�#jF� �c/������8 !Y��@�45=hni�)�� 0>��9�VI�y�_�>_X���Y"7Ք�Z˭�]bH$ 4�k���|Y|��� �}޿��ꀈ��e/� �B�4$JN�R�;���/Z�X�#��\1Q�bW|�JD0h,�e@�I J֚0PO� �qU��E�{�/����<����1N����5�Yry�Ћ������i�ۭW��؊�۱۱ڋ㉴>�c��s2j�>��|�ӟ��'?Y1/w89�Ou���C���믛>3����������7�����������z׻.]�4kv3c�ԟ^O�sc�a�:�~�w�?�����O|b3vSn�u�s�|����d����O������_k-ۤ�o��pD�Jͳ�����������_�;vݘ ���z��G���{����=��C@��ݷK��s֫��Pr��7��������n7�O�����B\t��XT�B��l�n��]�]㒪+���z ZH���� pY�c��X1Um:My3ͼ�I��*�xO�ĀSg���yY��i�k:GE�E�P)X��ى��'i�M�Uz�v‰��&ɖ���"&�= c�ۉŵ��4�%:�*�v��GeG���N�B��2��b�� ʰ�*�^Ʊ��b>i�v�ق���P���YB5<% �2 �&/m� V�2�7I��a�DE�W#k���h�61 s(ȢP�N��L��N����6��ubl����ƶ�M��mNe���)�3f����O�q�lrn�q� �\�i�Qk(ӆ�5���!^{,��� ���yb� �ȰCq�B��j���f�� p��jX�L��FY�+e�t�?,��.C;��x����)U�Ij���'�Y�y�N�/|&�4�}�}���^���C&F7u:��ճ�ʿ�8��+i��;�7�18���OY�&�k!s7\Cر��l�c��n���Z�3�e'�"J��a b�bɢ"���%o5�m���x%i)�6�j-'4����h�_�� a���ʊ�,���[���'Í�Z�6ʽ간M-D���3����0����T�CDa������\*�& 7���C��{7Ņ��H^�8�/'�� �$zg�J.!W'v�;���`/����:����%��쁭��� ��H܀#"4�{|���z���D*��g����ӛ����=��,)���89�,�K�6�h2��D�S���3s���� 7�&K�f�|;�b�vl�vlǷbT8C����u�����}��|��$����J���׽Q���N��t��}�k?��?����{�����?�C?�?�U�U��4�e�a���眿�կ����>��Gy�'�`2�n2v�3��>���Q��N������l5�K���������Gn�+6�Ѭ՗96�*��z׻~��������U���q~�m6g��O��O��/�‡?��x`{��%�R��t�<���w�����O>������.~���뻲ȶ�����O���ٛY%O�G_�~�H�4�l��p)�{=���#�b�22"e�h��ۨY�rvY� G�s"Ny9�J��)2*� �1p��9i���FF�U�KiT +fc�e!�BHZ�銝v�W%z���͊�%l����X��.XT��Q���hy�0&��:Xˇ`�,ec-�iiҀ-ј���%p� ���� IDAT�[`Y�_K���  $�n�5]�&ґB��U5q�*�gO��u' �ъ^��L���`jz�~��3�����N;xr֧� �8�G?ׄTs&5ӊڔPS%�Q�S��Uvk�X%�j�Ռ\�5��Y�q�,r���ԈM�>a�:�v5��({h0 ��RI�\��!R`X�?�r�L��\� �;%ᚑUW�9Ts�F�V���Yԯ�Eq��F �6ǜ*�f�<��|T�꼆i�� ��is95_�3��L�3�+e��<��su�b!�)���%�����A^S����zb�U`Ȭ��e�Wz����[ �,�a����t$?&�F�2��( 'E[g�9�`�)�V�rj����k�-K�Y)6���j��%�3�z�-�� Ƌ�P �#E$� ����(P5��ҁ{�xJ������6gZY{����g �<�p`��ZXN�`���q_ē��\aC�:�H,2�� ��'a� u��͋+���Œv1�%|�uC�u_���h-�I�JZIQ��_!��4~1�t�� &[$-�y�܍^,�LG ��E��{��d�X�!��hm �FrD;�r�5i�ov�H +$W��tg"g�c+�o�vl�v|kn&ɬ�W��Z������_�տ����իW_������-�Df�z\�<��������گI���{x��|��տ��7�y먭��{ꩧ�\�����0WAnw �)W�8���;�����~s�|�����]�i��[���Իg��|(�a����g�}��������֟:��7+�s����� /���o�{���?��w�u���[o�j@����v�������?��S �sҎeW$q��Uw�\aG%w{}Y��jd���oA֢��c��|vI+cWew/����K�e��f ��`4I���lz��C�wܢ���l�>��P�����Z4�S�X�o��5*„a�Y�ܣ!;�ٲȈҞEn���s'�b� Z�B6:KX��<��1��-;�>���h �ʭo��Z/�$A���%�K�k�H!�k,���r���J��T- T����T��Q���ێk�df��3�'h���,��놘(�܋��4���׆��*�!�e|�;��?+�ox^�i��0s%4�n*�%��ڵ�#d��K�*f�/��G�€�Jy�p2�HZQ��>Z���t�b����R�Ż_����')���^PkO����$Y�VQ�̄V�a]=�g�Z�j�g޲!���k��)Y�r��,P� ��\*� [M��3!nbj9I�z,MHߴا��D�$� �1��R�FcT���'=h0�Jh+N�)kT��P�(8��Q�F'+fS~���`�Sv�;�m0zE�Ԯ�s�F-�ln�a=Z�1��0��&"A/��֣ެ�����# �DS�!�u떈k�����XlL��S���S&���F�ƹ��Ƹ,^�Q�0*h����.ٺkmsiAQ6X�5E�h� ����59�� �,3�4^��P�i�f�bҋ�3��a�3t� A�$�A��:�>"��vF.�wG�J\2��#t�N���1q崆�Z�Ij�qm�Q������������؎�؎?�=���\��s����������������k׮�Z��,߬�2�����|��[}��g�}��}�C)� .��]��+导������΂���������|<�<�a^�pK���/����o��7?�����\g����g�y�駟~��g�~��g�y�瞻��ݯ�4S���� �|�������'>�ַ������]^a���0S����?������?��́ϛ��s��"⟛fuZ�|�����?���Oz�sߔ��S����\ �-t���s� �r�s����o���E�%pb�Y��f�헼g�JN�BAx���Bf��d�z{�T���pۡx�}�P�Q�RcG��Hت�!Қ�CB _8�W����ؚ4SEg�����Q�I� kɥ��IxFX8, �'��&�X�FSF+Y5����Z#E6&<�n�|�B��SDc��1�=*��32Ք YRD%曲HƢd�n�-'� Y9�@���d�4�|@ W���CVv@^�l����Un_� �4ϻ��D2b);J��X������ �S�da�^"V��wt��6愯:�����*�В�OY��j+ԎJ��B��Y�B�Rc~;��9A`k���h%LZ�J-e��75n{m��1Vؓ�b�0�(��Q\�K�[*K-�*��i�x��t��ԫ&�N��aX R�RTR&s���!C���TZ����[���[�����~�օ��G0�.,��>l'�;��"gP�� ֆ�0����NZ����L��Hq\��R�J��}f +�y�ݧ.��Q>�\|����c��Y��=Z�}Z-�-Z�Botig(�p������]w� a~�~�r �‹�5��݉�E��`s"�^�k�i���A ij����H�e��=tM�@��� �j[Iu�?o���؎�؎W��_yU>{�����#�<���ׯ_��>7�۱y˱)!�R��������׫.�=��=�/��������������›���9n��g ��T��κ��{���\I`~���Ʌ��><+��^-��s^.����"���j�z��'>����{�ٖO>��}��ǔF0og���?����~��y"m� s�����}���_�����~���}�84 CJiN�>Z�/�����Yl�J��*���7������������~��o�� zћ-`�$�pP��6geB3�W�U'�=����M���j����.�1b ��_` c�L9�L���]��i�2�n� �k�F�77����D�/"�r��9J��+y���D)5{�J�\T��:+9�����t����i���Fj��K��h�&d�J�LKX��U�`*n/�\ ^��q!rh�5e5qu�+5 ���g� ���W��gmuX�0�#����KH7D�%kB�i�&)M� ��@XrR�u��z�@I��]J�9]D�R��+�RY���Ȅ;V,����1��s_蠘Y�n�dA���d��-�� ��� Z��d� [ �=^L��A$XC�GSV#�!G�%*wh��#���K�I؅VxӼ���Ҡ�uN�J�'�u�t��PkާV��՛��6�֙:��%S2�pw��< if����`��3�qg���d]<#��2�3ӎZHa�] @�`Zvʹ������)]JA�b}�Z�F�k���K 8��MQ�{�8>�:-�|��), (ĸ�� ]�ace7)z� p��.�u�`�q�J�ek�!� i���B���o���ptJ���;��;�Nl�؊�۱۱���JI)�ُ9緾�������7���<99��]�mO緼 �����X�Ɯ�+W�\�����/���x������w�����Y:������9��ͣ�}��w�u��惸^��ŬݗR����~��fv�ʕ/|� �8>��#��ⳟ��+W������d��Q�~�~�'~�杶��1'=Ԫ�/��/|�c���䯼x����ۭ_�җ�����/������x�*�9���ی��*���~�C���v=@����'~�'v/��c�������!�\JD��;�LE� �]-����e�c�/��ž�"��� G����N(������� ����z�� �cS�4�*/�-&GH�LDl���g�dk$NE���/F8`�v`%N`}��P�Ty;��=6?at�<���nV�z�7č�T��D�۱�R��4$l��.�0V�!��2���S���w|�\� ���)��դ�%����OF�̎�bu�����������sy�}!:�7R� �g����Uď�a�I�/S�l�r>�O�h󻱼ۜ���Y��$)3��%�|�X�Yt�Z�1tJ�(/�U��*�%�5��H\��F5i�U��E������Je;�E��Si�:׉‘��-��X"\���X{�>�C@g���掎.W��3�lrtG-: 3Uwvgr T�3�4w4�;��.��*��p�-Jfa���忉��ë�(����dX0Jd���-d� �(d�����,g/YC�p�0.����G�@�'5G�Tf�͊Քu7��K. [@gfF��*�-k���?Cߐ�̽�:�a ��HX��WD�����Ќ�9���)�URkv�s�� e 뉅�/�J"���;��ֱ�%/���?�,h��5�h:�u=�Y����}�q� ���58X���:�}�$��-����#q�p%��{����N Kk�K]���ܞ�]?���Z�ӟau�lWP=����=!ށ(׭X�۱���x�<�*�UE�mo{�G?�ѿ�7��j��9����Η�Y��2�,���SO=�u��?>�=����o|��}��ozӛ����{�^���������K�.�HUw���{��ޗ����s���իW+y���jLN)=�����|tt������0<��cU4\.�O>��9R����Nj��g�.�7�ķ�Ծs. ��#��|q����Q���ZԓO>y�������S��q����u��Ș������]�z����������9��Αۙ�������̈́���q�ݿ�w��_��/>�%L��k��~�]���#����ͼ�xg��6�!H��E6 �'��U��p���{�@���K��}(`I�4���%�L��lѭr0I;���'"p�Rj �3�}5���ZE+���=J��5, �CX�����x�;>��OUtLι�;��v��f���������������C����#��s��o�����W~�W�����<�L�H�No���]�'.b+c�l)����P�HA�ˊ%�f��0¬;%�{M��:M�%� 2�SK<7�:�Ƒl�޴+�-�`v�GI�pm6���g2��[�L��y�l���:=&��Ee�6m�3�*h��X۟S��6�2����4�광�7)~�����[x����m��Wh8�+%S��U�U}��5��J�B[��IA �UOoi �IH�<�Z]��O���51bר��4e�����W��N*x厵��B2S=Tx���� b k4F�r��`(���$�Z�����*mH̷��1���ו�J� s��nM� *k���4d����]y\#1C��VLk������<{� �bn�­�v�ԉ}��L�I�]덐�[G�|�Z���4KJ���܎�\�f{z��g.��+í-b��_dQ�:�k�W�[���j/Wݶ�(�W�����e�5>3����wv�Ǧ�g�P]�VُОq�S��ekTZ�� ɍV��r�u#C�p�� \6�����̢ � <Y\S� ^��0+��2X׀S���w�Y��虣�e�iW��T+Jw�M�Թ";���!q[�vl�vlǷfy��ݪ��_��?��O?���˗c[qs�f���)�� ����})��m�yB75�͟�R_��߈�7�o}�s����}���_�� ;��Y,s[�&z�x��I{���ң�>Z����E����~�꼪V�z�._���O��Mob���2V�_���k���B�c�=���>����>�h��vL���w�w�\#�Ї>��7�����?�ϴIe5�%�#�\�}b_�'v�KU�t��7Q��U�g��*��5�!U�yCh ����-Āaלݾj���U�V,ffZT�z��` �&q�b��4�W=���W�)��u��Q�C�c|m��x�(RF����qոGh�N9�-�!��np��d! �>q�7k~ ���oy��^�*��K}Tޱ ��X�*�ؤ�[�n^��}ӫ��B2��7!�7F����-���وg<�p����X�7g{���Zk�� c#���a�J�f��e��;�f��Rbf�^?��|ڮ3��헎��!G&3� A=�yK�*CPkZ;���R`ۥ���e܀�Z��Wx� ڤx����Jf�|��%g:�Bl�ҭ��q���i�n4/���L���4չ���,d���,d�S[�EWY"� \��ؖ�͖�[�3�g��d����+U�=u�>�W�r��FUh��#84ܯ�Ywҧ�Wt~]1���a���`Mӯ Z#���%`V��|�vh�_�/_�kX��NF$������7.�]Ԉu�`j/�EVB:؅�pvT�[@�^����R ��گ� n�JƦ� uͷ&j�S�͙�UT�� f��Q�8[Si�H���>uN�D�L�_����O5s���-�[���_"��1s1x�c6bC�mv���E��i���0J��w���X��3ژ���{���1Ȳ��v:q pahp9[���&97!���z��AR[=n��o�'�fv�q��:�c;�c;�%:�,�΄�ʯ�[������o�����[Ju���-���MY&̜s�o�99��?L�57�}�)?����P��Y ����a�^�M��̠�����;V|���G��뺪�V �v|{/���*K�t��G?���������x�քn�l~�9E6"}��'�x����'�䟼���~�,���ݮ�9��������Ͽ�� �D��Bnq���A'zcG��ر#�Q��4ɵ�$'d���?� �!�XB K��F�\���I.3#�A� N�:,1� ��CY��ٷxz������/&��S�<� �Ө(�Z��!\v�v%B���n����lPcf���m ����M�Mg��������I��v`rrP`���֦Q����2wɳ���W1\*�)i*'��P�n�Y� IDAT�)V���+eb���02�R�b�� Xr% 5F����eQ�n�H~�IgrbO18���u�) �Q?�k��s��o�����I^��M/$��z�U �r�Y*�8�?�����N� [ɀQ��aU돬��W�n���X�>���=��'�"\����3 la���u�˔�̱�K�潘B*xx)�%TFce~ܕ�hk�EV-��E��:���E ���E�$D���RX�5녻���qP��L��׿Y0�iWY�j1 8WG������vy+혫&�0�Ѵė����`�ia�>�&Ժ�< ��[�zB � ������]��I J����^�����K*�A��&21���`�us���^��D�N���5��D�����zb',YMV3�Z�̊�Uq]i�JR-xua�ܽ�k�N�T����)N��f��ZwL�������u�˶���؎�؎W�^��P:������-O<���˗�{is��s�Y��4���������JɨN���Z���sJ=Q��a3A{~bEߤ��Sf���:������T��{��?���Vn80};��c�om�c�^�����fA��_�G�R�׼~�r��������{�=�����v|1k�R(����?������~���W��y��SX,y�.�'��&���{��0V{3`��fv*����U�h�'�����Z�� F�D����A� t�8KD���Ƀ�����L���f���%�A��`:��� �Hʶ�V���`��ծ������ S�|��Ui�6#������ZC@%�S���;�;�+ (;cb�N�i%�b<{Sm�������$��M��jUv��V��w�*ԣih��`KbI��ͲJҟ��q�9�����žϠ�L��gg�(L/�Y�|�p�*��&���SQ��l�s���r�Ŏ=cg�{E��-��8�n�K�ЫZ����*�ޔܽ��ϝU7�߹�  i:�8 ��U����L�n���1㭪z�$�Ĭ��Fr:�~��=�_�Ih$n��W WK�:'bM��Uc��.}%"3��ͩ�_��:8�Y��K*_U|9x^�r-�u�KK�B+X�Vhe��c�D��Y���,�ٝ #1���8B7�#���v>8��:0ٽ�3_����Ԙ�Zm<�f�U ����v��p�f,�g 9�����\��vۦ��l�q0��7��#֢J"�v�3nj�� V���[3[}��KK�K𥱼8�xJ]���|���q����>�;0 �sK����Y�7Af�F!�G}��Dj�YdYd�+�bqwoa�%�� �(D�Y)x�X�{*�3�$���I-�}�ܒ�y&!Gna�v��¬ۊ�۱۱���4��������{�����M� �k�?�`n�A�� a��WEi��oi��ԧ�����9�����6`���f�͹�;Q�Y{�y�7�г��{��{w���.;��x��G?�����[F�n~��/>iS��SL���j���nM==}��:ܢ��̢�v{u�{g2���5�$O�[��8s�ʕ�������xϏ��O<��M� ��-e9��:]v# "r�K�ˉ����sR�yɯ�Z�"�7~�s���f�L蚷n���\cЇ>��w��?��?�K��K�|��a�R�n�Тą�� L������.Q��Wn) '�s�+YN�}Q2��<)p�Q��^����QG�P�ؑ���C��ott�t1z��.���%s���ED�ȓ��21U� �>��NH ���0T�'�]M��_î�� �'H&2�EA��N����s4P��n��E"�f�7�n֊��P�v<.��]�"���_��X;��03�u:�o?W�R��r��F�I�P93A�b�ru���\� ��ӄ�`E�C8�8t�MK��]� #���a�B��� +c�֖+7?̲; ���EQ��S�N�@Q�W,2{Ү���K��� ���nBE�i �YW�H� M9<�TaR�I�q_�����x}N�`��u�����W���-�v��a� 7<��e5#K�0�ʧ�$Fj ��lCnn;��X�Z�H�;=�K� Y�@�d�d�M�/��z��W'�3;"-Fґ� ��xz���,�u,�GR�RI%:yivu�� �X� �l�r,��n��U����(�p<�8��E��}�:&��*Eeь�Xd|��*qBc�5"�QV�rz{]��[D������/��s���.�T�zp{)ŵ�1�,�Bk��9����8&A�Y�E�5|���]:L���h��t��d�;���S��!ܑYg�C� .�v#.�ΰ� ����`���u��� �{n�[���J�56VDG��i%���)�9 ���u5ؓz0���BC���r4�YI�x>V�[1˕�(��4L��b9�#��.�e�r+�`�� ,�K�l|������he�n{e�������i��G ��y�Dt�Ѳ��K�D�>��"(u*#���T�]�;F(�اu��=����Q��^J��mQ V�-��Kk'���,e�1���J/|L��˦���O ��nP�C��TÙ��^c�S���W����WԄ�������wq=� �.ʢao���؎�؎�̨Zɬ/����{챷��m礖٠��c�qG_�Mm�?�8��y��c�\,��ݭz�lK�k�s���ǸY�&�FjQ3DŽ�L�&��3�R8/��ˠ���[(�*FIR�ĂX`����������o����������+W, \��|:“��U�� Sk��E$s�nr4K%�By����M��S��}��c�S·���c�q����um�_̹ \�~�z�����������w���'�����b^��dtFg�������Z&jC�kC�ӼOl&��]��yg��&&r��[�X`��h>�����2��;�c��X��\�ެ�oں�ʎw�����` ���Ss�|#�ʝ�gg}�믻7A�;o�L�Q��qG+�������:�^3�E�i����(��N K��4��ޞv*l��)���g��~��q������&�4����z�����zV�{���t3ñD�}؇ Ү����5����y�6�h!J �,D��1ê#�4�����7*U�CMINB�H�S���4�Ḽ�],�^t��A��PZKu���-硶��7k�3# Vj|k�@�!S�h�����S�tq��%���X��_�qǔ�Լzm�2E��Do��� ��ƃR���:qC\׈%�a��%�P�������ZY.EDP�8�4���a�9�������K�����1W� ,,rĠ���X3\�̎��/��%��¦YX2:l������ׁ5(^g��'�Ē%"����"(Ӣm]xGuN�n�h�^�NN`��Pju >��3e���9x��[º#�K�7^ڿ9�`��u�`{+�����(�(���KKYE-���y޵�������_��Uַ�ܤ�_�a �c��5�5�wJ��o;�c;����W��<��=��Uu���3� %�v�D2)@�â([@��)&�nlؖ��9D���?��|a�H�2�B�M�)0b�F#*��X#�s����sN���}r���U���gd g�d-4zzN��S�?���y����[(�5�’~����/�ſ�����{n J],��q_����n�[��- �uc{��m-W(�ܺu�W�W���[�;�ah�ӄ��|�} ֶ�D�p�����o�#+�:���gY ���� L���ܿ���s�u���������������?�������}�;�6���z�n��W��*C�\�u�(q��l�8�T���<߷S�FcO-��V6���l�L��;�4}�K_�'�����?���/���8��meۉh �ʬ�:��GtK���f�� U-o���[xa�;�;�M��e��1#"4�i�5Ȳ�i��o��" T�y����u"�r�)5t n�F{1+���NX���1L��첚*{&͞f�6<��7�*�B�gVFZ��.hkkE�Z�X���� �G#�&|�]lz��f���l�B�Y���-�[�C�1��U�p��XLb��%�B�R�Tz�av�P/Q �o�-� �w��i��d�2��hk�s��m�!���)l�:]z�9�C�s,�E4N̹�e`d�7x�v�`������ھ���,����G��7�2�uBu��b���v`T��4{-x-���Bm�r5%" WI�N�'�%+sZ�^�%��&F��T&�ԩ�kȰ�Y��8(��Adh�K4�5�ܪ�(b4[�&/�d\�+������!W�}��BD��H� �t��,��&q�[[����-\�ʍc�0�=�����v���鎚I��R��T\@�Z^���PjԖ��&��_�؈�q�w�y�@(,;�v �z� 3w���0�Ő,�`�E�B�Y�n�1!�kO��H��K�R�!��Q旼ٌ,F{�nd��������l 2�U]Q.�:M���L���n�p;��r�>��i�����z%tUI,Ť�9�”���|rܹ߸�ύsN����Q����� �8W��~���p��WI�9ȸfv���0^����������}����}���ޤ�����;�~��]�h��*9��pb[H4��J%V �6m͹�M� ���i�iWT��� Q*��Bj��A�*�<�a�p������Cem ��P�!`�8��Tf�%�*�������u��ρ#p�:�a��W�c�Rډ<��8�U��{�&{ ��ApeM]��ϳ�����j �,/˳oT�O��f�֢ԽJ5�+��W0���f��xp��9�%��Z�C��;����MQ��ׇ� ����o&�v�rd��сZV6پ[�/ť���%�s���H�4ȫd-��2_��h �븓r?S��-@�R=�6�b���c�������%UZ:���1������c����VS�Xѻ��$lj�۰m��e�P�#�~��[��hF9�2� �lMKE5[/^�=!�$CzT��v�5�L��=�]gSr�����IW�r�7~) e�Jl$�iW��+���4ѝK�Rm �y��;��U�G�6��I4ID^�w�� �����5T��k�;\�S��}1��a���s3��sI���hl%#e���l̉���l��)1���������v|�T��Dj��-p�Ϥއx���=r_�G��xpn`���,_o�7�� ���Ҷ��k�S��]·MJz�����T��ur..�Z#�Z];��JU���"��ԗ�6�����?��_��_��������z������o�V�ml��؛��`�1(�3"��&��\����y��DK�k��6l��o��o����ܧ?��g�}���p������^� ���>f������΢�ay��>�,J#+�� Km[%���v�Ϛk6�q���g�Gd6L�s ��L�M%�t�e����*��U��E���]#+%#��/����f�����Wc�� M��m�9���=„�>B��N� �� ���Ns�;QjO���Z��x�5=h��T������ۖ>�7hU�4G�:}Xh �nJ}���7�~�IUw��B�⍑����P���2{��]ZnH��������T��׊4�V�����@(���vK�R|�Qt���v���7n�[���G�������S]m� �D�N��W�>hj�Ƒ�+�2���9�ku�h•�ᚌ���Sϒ5� �ksm vt�~ Kc�ϝ[�qo-u� ��m��rA�T*#����\�W��}�U��U�J�n/��/���A���k�u@�*vf'&c�V�mB�)\s�Wh�m'\�M �<�[C�ܡ4�pmFlZ�+����d�d��k"E��h��Ж��+���}/��I�[�p�ִǴ5qKY�:|�g.��F�׺�$Ni���G��-��3#Te�����R�0�!��h�� p-��8��i7D�k�<�g'~��K��Wq����_�t��<���|���o�I��}���<�����K�� c�܃�el��G��oH��.� u��˃��|��nwb������pɕFv&�OD(�Q�?��8��xKŲE1�n���f���?�����}?��?yd����X ���������j_9���'�CM��rvv��x��O��v�]L�o�\��A�jgg�mЄ��!q��9Z{�h����ȟVX�>�'�-s.� �2G�=�v��N��fE-f�_�R��:՝s��~����������O|��������{��{��;�~{f�� �uݮ�jb=%�P0�u�����yI����xH�s7n ��X�5�9���?����o�Ϳ��'>�����^j\#J������,��׼�Hi�RTrj�xu������� �t=�%d�W���t�U�j��;:����aE��7��"�:u^�Đ"Z��&m4�KRa�1q��L�O_ ����$�MDnWuHȪM [��M��WI�m(�J�q�#ߊ#\'����������C�+L���t�KW�i�j��^���`+�L6��w�Dd�"�/{�fǫI�%���L��C���a�����9�B=�ښ5��+n��uS�J,� a���Fi��M-��2�`� � �~����J}�o�fn )5I��8�oX�^��w��\�.{��$-�q˄iA'��=̇���;G����qU�����p���ͬo2~�\�j���Z�O�V��Ԫ��'��)��%���D{'�JCU�-� ���q���ʏ��.Np/ �yZ8ė�,+�%�&�ھ��J1Gڷ6*���lg��6��s�g�hgO�F4͆�e���v���y^�9ǰ�O`�,�B�\|S��#�B���u ��rmp;ye������%-�vUJ�V����ꨱ�`U�� J��1���1��� 8�#��;!��؛��c� �zq�NÙq�!<�� �+O��y���ăʗU.��׻�z�_+C2��N!jL~���p���'^�^t�2�j�2����e�����a[��x(�_�7�䘷Q�_z�� �Bk|N�†�s��+����X�q��VmVt�ZkS��d����7���}������+��r<\��5!��mէ?��&����I���D������?~���g~��j�j���� g�L2��Kp���tڱ{�r���Mrm»�K��wٿZt(x��t�Op����+n� ��&�;pX��rt!�Y��U"�p���us���]��߽��?� ?���廿�����Ͼ���Ͽ���o�/�V�US����0�bز"����T��IE����&��ZZ#��Z���/>��3�<�̧>�����;������i�������ǔ��E�Z�;c؊�$��*�T��\k��D*�VX�DZ��)����3{*�M� 8Q�/o�QLMA��K$;<���^�)�"wY��^'s���d_h^��b��J(2�ߐn�m@ Tf}hV�̫��7O|�y�d� ��I���$#l)�U�fg\_�����]���j��9�n �:Ө�D/M�/mlFX� �V��:�+�ވ瞮9ZrN)��bue\�%�AM ����g�����p��x�9˨ \��h�e IDAT�Il��aˢ�����r�9�W�$��ڤ6Xfch�o�G�DS� ��dDJ���v�D>ZU�Z����������|Q���?�������?���8���~�W�IJ�jȻ�X+6�D�N�K�-�Hg�[֙m|ٷ���!��~3���3|&Β ���|��v�4���&�n�]zRd�5�M������4M������w�gô��Xgp�,���|���;��7?�[?�3?�5�ŷ�������|�ן�/���}���zæ0��9ɍ�R"VD�s6~S��G�#�?����>�����ԧ�}�ٯ|�+I�������\��9���$��֩�L�f�k�y�uS�V�ܻ�;me�q;�;�l��e��1H��g�\f�n5��5:W�o�j�Y�L;��x���I� JY��L^���0� n����d�l��z���+����(�Zb��Gy���W-E͞18�F��w�6�%���������h����:`v�5-h��ь��V�Ft�6�ku�i��4�!����'iZEo�����R�,�!�h1��`�� ��z��@7T-� �7�j��=syF?��T�E$��Vw��%�o<1�� ����Ql4�u���K���\Bc/kJv�fI�nƖ�~� �u�YeGU.q���'�*bRL= CD�5�T�ܞ���q1���ZW�:���f�����p)1�a�T�,B]��������$��v�Ż!c��T�ea���� �9�F��8�M�#=B� ��_�f��F �[v˹��{Oaڱ��XPk97$MQ��=����[�v?�lD��V�]�����Jа6�\�;�,�kf ����eC�{wM��Mڀ5��o,:p�%`���l���&J͊*9T4�͸c�}Ђ�/��L#��e����DmQ 5����]�rlh�Vo$�a�O�k]1K�" �KN���c��j�0�Iu�_�~��:�k|���nG*yL�~H���qVO���ZbPn�*@�D����8��8�o�є���L(�D�;�������O��O��^������т�-��8޲qxY~�|��߿\���dn���[up��j�?��?�]��]��_|��6�,�n�v��(��[Z����g��0]Tꤗ�$=8`5���6���x�4M\���P��� b���� ���|�7��۾����������w|�w}ϟ�u~+�+�(ko.tQ�6+�de��j��"�8���j�,9d��������_~��g�y��?��|�s�{�^���w�7���_�W�j��u�FQ�q�d�T�����e31w�xE;�Z�N@�m;� ye֩5�Y��U� AH ۢ Ӑrh���)2s��U�4�C��z?��n��6'�LPx7骹�K�f�;�gwvUw�D�Ju�"l��RZ;��P!�0�}^G��h��s�5�]#Vsj&T�j��)ˬ#�͎cd�2\]L��V��Ff :�6�oMTK�&�HT���FY<�L�A�j����Pc"+0f��A���Lؙ��Spu���D��w�hK-�4���}d+�BLs`�qxZjIR&���9�QJ�dLA�\M^!�R�2�Pu��}E,��V��:[*[t+���*�ƣ���ŠT]$����u�N����c�IJ� N��kh�|E�� �=��}y?����$���:�O?�m.x��cZ���&'l�]K*���9�����U�2��0�R1I*U�r �(��Rj������l��s���K���M�J�B'Q#�B���I���1L��q��8�E��Mj`�F!Yk��#��"1yP�'stR�.U�,Bj�,�9�������_st�a�ۼt࢝Z�ٯ��>�-��� ��"\��#y�@N�֟��h&gf��-��vH��S��w�Q5�4�29���$��J��rY�j r��s�̙�K�!P��D�TZk3�����L��I][��,�$�𔹮\�����I5�ĕ9 I���v�8"�jZaébU%"al.ɇTs>��� �6�?;y�z��kL�WF�k���+�{zP����0J�!����n}O�=��v� _�����U#닉�Hz�G��h��7�fD����i;��aط� 0>��?�r��-��G��Vr�+ӊOaor�VsX�z�b���R*;̎�9��&��+.��^+�ڰ����S���������o��� �����Ԝ&�5��7|��V?Cr�տ�WG[���h'��}�3�<�#?�#�?�|S�k���z�۵ڌ:5��Z��,�u�w� QU ׍N[٨��[p��בW�:��|W��a�Bk�V�կ���*�a�V{��#�E@��W�+�I�3�S���6��n�X�6�Kl�ڬ�"g�ԓ�+W/|����g?�\}0[j ��]��������o}�۾�l�͟�S���z�Lg����w}�[�V&��������g��w�^)������������s�}�_�����/~q�=��L��,i(o�֎�Mvb2�iŞ���r5�5�jf���R�*(�J��]�y �-G�� �P�#m���7���Ϋٽ�R�*cUT��LD0�+�bi.��L�L"3kRS�ք'k���ߪzہ.YQ�%4.L���\�P?�7��v�C�K?9wZ��5�ɤ�Ghf^� �C,X�5�%3�vP��`B�0���:/[�SLM�B�%�~[�@�]G������3��X8�J�R� o�\��q��� j�u��Ö����e݁����T5W�d�qIo�6�R&����|��Dۇ '�~2[�49�J��g0(V�v#�!NZⲟ�[B��=hD7���.���#9�mŕ=�YU���(�O�Kh-v�~R�@{U5*��>�ܚy7o캪��N��;� ��Lr#4������*�L�o�]1�֣��@k^�6��3�(޻�Z�C4��BJ/Eb�yN>��喌;_���gW�z�m�U�{K%�O4˛�`��LV-z�� y�n��g�}���2ǘ9�G�I޼�AI��:R�u�������ʶ������Bt�P���A��:��e艛��� �[��h��W��֮��,t�����{NR���dx��Ro�{H�&�G��|�֥TP��fR)�����(�'�Z��8��8�������I0���j����_�������W��o��o69���h4̞���z<���V��Է ﳟ������~�w~��\�57�,������=���g��_� ����&��n�RLk����J}���s�]�N���.���k|��e�5�z R����vm �m��m<�U��P5�"� !SE�Zh��m������bP��N��Е<��+��n%�bm�x� o�F �N�W=q9K����TVx�9�*�� �֯��a���ُ���Η��*;�1����Z����.}mEh@�V/)�4l�4M �fYx3�,�Yk8]2SdK��`���pE"�q�PЁ����Z%��a�xKt�J��e��m���f�[rd!�Y/�Sҷߒ�����{f� N�k�q�ߦ*�����M�Ǝ���� �I8A�Ա�|w�6�;�+�:�H�ae?1�=�)U ��p�g�Z����.�@ca��.\�դkܒ$�@�Nʰ�ZS�]Uv%Gk��e�+8'O��KCߵϤC�?Q���6�o:�D�����0���VK�.K�"�Jg��5�@$kZ�c-�M8��X�5����z>���9�֦C�e���,`��sW;� �.�9,��P�D5<&[��X'��Ha�nT�ә~Dܨp#�8��؊-u<���${SF!j&;x~O��K����z�d2j��q3kskBv�#�O���� �`J-;!ɪ�񕏔��0��4��$��l����1gl�Z��?��M��^5��LjD���dV��l`հUɨ5�6��a>;�8��8��8baM���&"��{��W�W��_�+`+�FSJi�ߴ��Ro�3����n۔_��_��;�?��Ӫ��T�~�;����~�'~�'�Xܴ��=ڛ�<4�>|&N�MzUY�krEC�S`��� ����5l�a��Re���ahO��25���hOm (5u,ܔ�Ʋ��f��p.���hѵ���r��9����:I6�<���ڞ���Ψ�pJ�#��;�m�`��*W57ɹXSk"J�aX?F�Z��d�M���L{��w�|��5�F2�u8'�5ӝÒ�(шwh+vh� �U9��8� � ��]�ܬԶ�0N��#?0������2����ksF=���pd�ڙ���L��&��с�?����\��Y^��}IM�����u�v�kO��a�e���*�~����.M�fs�k��� ]�+��*�K#�a檉ս�=�f�_��H/B���\�KH�����ts����:I�U����X� ���s��n��㯻�pH����ߨ���g�'�Bfd>ˤ�u��%("�>2��NN�;�O���;շ̙Y�����R�O�yp���Z ���5�_ ZQP��<�'���}���;���S���C��6�����+���3G�h��"E��b��fm�����dM�]�]���Q��IN�f�3��&[��e�7 ��r�ĺY��ן���}`�~��g[�>�]�o� W��� ��([.��]��J�'�&����H��A=Cyhhq�7/|Y���l�o"�V���A�?���G�˺��C)U5P��[�+}�\n�ۼ���~ �R��[}�+�:�g�H��Y4[��+�<�5��ߚ���7r�%��A�$dVp*���o��N.` �a��۶e{�d*i@���Tl��Lm�~U�'�E�x��u�d���E���e�^�Og�e����׆���Л+S�����mt�\� j7 �y�z�f�Z�x2t�X�q��6��SɌ8X��i�n߾�я~�c����i�%5��a>�q�[�1�[�h��~�x5~-��Cu��Ŷ��~��h��� K)KQpo�i�'�'�̮1���"=ʉ��%�#�)$ˆ�u�����QS��)h��4皎n�^���0��|������+ l̹�H.�\�9:�S����D�S��@����hX�rRtΨZ6r39u��y�ֳ�RD�u��� �OӴ������h�l}k�o ���= nP�+2.�"����쬝؅F5 h��~1x��\$'M�k����H��u��v���������$ h�pb�lz���h�L4�p��n��^y$v�k�.�&�$��%�»WZ]��*��=\�O�]��g���D+��/o�n�P죃'bc����Ex)�'.�Z�榇�O�78��[,eH��K��b� \ϕ��h_�����Ę9�#���)���:hȈ�y9w���s��*�� "��~n�����d�ҭ�j������D&5�&-�a���s��M�'t����*{�j���J:�o�]�|�Oa�A2UӅ�77�Z>�1��2���\�]|7��O����a^�֦p�=s���%��f�i�U����L��][ɫ�#���Zk��դ�IV�ׇL٤UQv\u[9���Ŵ�7�/Z*+�"8��x�9oϕMV�A�zm�UX ��������>��O7)��ae���q��:/&�_��_^�*��2ft��J;��4�������������/���ݝ�;���5lE�`��Tr��IE���T���FFQv�ͼ T��,��3qiM]w�]�]�؍{Nha����y:���H������·�[�fw �P�Lm$M3t~E6����l���X'ZkUke[YE1�Ʋ*�T�4��"^�VzXp]4�W������l��Œ"q�jw{�#e�a�3T�a��K�Ʉ�&F��<��L+27�S+{#��SyH���j��g=��Lz�u��ri����TR�;��A 3L�6�]��vbr�)�RU��p�xPj � �&L7�ICz���,��kO��o��P�e�Ț�!d k����E��Cy?��~��sB��S �`'��+U�DDN��b���z�����z��2Y�z2i_�̀�F@��z5K��g�[s���-����F���G��n��Uӂ��\2�='��b��Q����ԛ!:|���` ��<����Bq�e��V�)���0����7t�힌ᥗ"�zd����������&|+����Q+�\���̡���I�X��΍��h��#��$��Mj� �lpy�c�[ ]�ų�=s�Y��V��Q��CSk�VMw������ޚ��E�_�1ѱ]�&T��pO�}<�P�r�L�*$����qr;�i��0��8)��/�35;�N��Fq��am2߳��'�=�K�+=M$i�½�9�����sٳ��ޓ��x+ W� kkWWSL&�YzN.A�=}�J66�K��K��vĴw[�xTb&��|�,�D8����f>{�m̗m��=yZ�u�߆S��4� R{7�!, ��)ܞIG�p��d�wm��Vmk���V�2}�JI��P��Ǻ��4'�[��Ɯ�-�i_�몇�jbE:��I��q�q��?�M�f�Ȣ��Zo߾�/������?��S�z9 ��=*���v�5v�W���}�s�c�8��������~���?����o��w��R��`�WI�.}��P5v����V��Ƭhj��=ł�EѺp�1w�Npn�Xd6Aк�ks��%�����ѽ����������m�ܶn�s|�&WV��ʁuO8R�,��i���Ͱ>Y�x7�H�T�;O�clJͪ"�f.ˇT��:���,\�� <�h�0s�aX��V(���I��iě�׋� ��(o�]�.s���T�Ce�M]�����L=j�N�i=m��>��+��m�c� ���1m'.��w;b� _�x`�å}EC 4]%�H��%�g�d^6����Ԣ �f��U��#�ݯ��o?R��I B�D���C��7g�=��I�����^\+�//��p�\�5�d>���!��%%�)�-������}5�x͊���"�m�*��^A���p_}�hnS�8N=LpX�Z���P�Mu�m{���" ����W�^�<�P��d�EV�j��lL��Pe���7d�p��Aw��} �VDi�4[<����ku��j�t�y&3:p IDATw��!51kt�� ,�8 ��6�+� ����}p�Z���8҂Fk��#��t%�Е[ �f����٬ӝ����1����TO�ؙޒ����5�� �D����FJ�悚��Ǎ�V�g����AN�d��ھ�/��4[�rڜ��$�z�㡉>�ڡںО��ϙZBGfg��T� ��q�Rֻ��\���2]Vf�C�����h�W��ri{�\��=�z�c ���‡�̛8��A��ޡ�*�c�v .J�$c_n�"E�R6p&΃[p'�<-U �X'g��f��i�h5��a�O����\H����`�d�,Ͳ{��%("�!Y��i֜�����ЦMq(QC������!/���C�]���Clpi �[��(��q�qG��3��W�E�_���ЇZ���e��x[�Cbb�x|�<���S��+�����T����g�y�������}n{6���e�O�c߃�lz���ߴN^H�b�Э!n�gj�À�x����ޙ�n� QV���c�+���;�Q��9�ú��KQ)A 5Ź�_���=�u��krs�j��ɞ� kU�&{�Ё���3���t�l��I�u�u�Rq� ���_KYw�����h�ۭ(f�M ���H�x���"7ZZ�`SCs��8��A�O�Y����Nh��"�%b�C��7p.n���;C�`���� �[�Z6E��3q�6f���h��+�����Rk�=�3ʭX�a���K9 ���d�&����vp�pQ8/ �h�-͓擒�q���q�q���Ч��\���_l�jSd��;�㓟����������w^xᅇ��˖x�'�q|5F��%�����>��}��G���x���f�RJf�ݿ�w��������/��)�$Y#3�*=�� !�V��㋆�d[(a�9T��i0"�1Ŵ�z>��o���9�`gv�=q�1��W �v������`�$ �Úz��]h;�S�F%4��Q<%�R8!�i��FT7*}PX)׵��ƀ�r1�����X:1)��܂U���Ӳް9Kw����a���ߒ��v�1�HE��Em�ѡ2PI�(�v�톡�Xw�=�X�&�й�$Έ��{�Q�Ȧ�Ձzkn�V�Q��K�X'O1ECW�}�5�R/���W4���]\S��{������nz��*U�z� �ց=9��%���E/:����TYA5�2�Z���y��RY^��F䛵͌F��b�l��@���R=IX�J�@�7����܇��bj���<�pu�cVv���*����k��|��Z��R� JRv3e����Z��)� VA� ��-�k{���3Ui5'�D:&בl����%R���=�����Q�����(���X&�@ pd4 -t8WSaӏE��֔k��"J��@i�AxB��J�H�b�%P`�~7h���,�SxPY�аv�Ji���U���p��k9����5Y,u��5F�В�zq+�U�K�L��$9U fl� �UR�m��M�m|�3�VEP�j_W�soׁ���B3g\�� 53� {�v�#H��G^���Z��������`~� &��<�Ԉ��K�;��;��Y&M��#Cf��h�[���.-A햹_xypH����=�d�dO����`ud�p`G�r9Ԭ�,��5! C�IcrE�S聦�4�[MӘ�Ȗaɏ���׺�B�;f�G[���Z��C�*��E���۷�<���?{�k[�����1����so�[�vc#�y!��c�8����`d$�[j�i �B"�&(��7Ŋ�C��iE�"##"�y�6,�/�F�S,���Uuϟ��Zs|ys����nw���V��}���S瞻�^s�5�7����Br�ִ�� }}��fޠ��|8�R^��K{�Vyѹ� ��m�}A}]+�*wb�la mĮ{JAt���6":@v���XWՂ@dt&r �td�D���7��h�@�1�q[�u 2��,m�tnv��A���Eޘ *Њ'��Lf�U�d��дX�!��+���ynޝ�U�^�V�B11-\-\�����l�u0����6O�8x�Z ���\fR9�V�P�SQ�����[���խ��<����́�->)x!if�,� �L�d��w۩�Q��]�m����?��%{[I��g��G��mR�� N�Gx���l�����:�׳?Kn�����z�� y$��,��t /Ʉ��v&}$�ie3�W7�&�ju�R�݋z^�j��B:y>ѫ pW�J{�A����a� �⌇]z��/t[T'��ck�v�װ�]�#�Ͷ���{bU�L���u @3�=�,���B��x!���]_Q�)�n;s%-�k�)Ug��>C!N��� �^� W��t�l���I��7x%]�MZ�GN��I����XȽ��-zd����*��|�)PAM^�E�@��kk�JZw��jL������������l1ۋO��/TǺg,X�R g�O�_�e��R���6�V4��N���r����p��X���rM?��������I;|W� ��$��2L'��.�>��I�1��W8�� l�\�z�>��?�P� Ǔ�NJW���-��u��33-�go�"o����ة�5u��4���J��!��D�ꁨ�F{y����a<���0�g�����ӧO�~�c��'?��_��_?�KH�l6�I�0ƻ1N���i�O��s?�s����>MS����� ٿ��)x�<~��ӧ�������O|������/��������~�Dž-m=��)�c���O��P�P�����Ek�[�� I�耎�&��2�\�c�R�Ejz ;�M{��*�4I?���k���p�T���XJ$J�5��b2N��2�Y!��m�8���ݢiGyl���Dsx�������-ݰ���{ݥۧK23u�O��y�̆������@�A�>�9��x֦�e�Yz /���]��I�­�� ��� a��b�>>�f���,�9]��-,�* ������!ݧ� ��O�݃��������w���ALd[�6���He.�Ug�����{��[:h4�2�U�D��0�ʔ�N��^��K�T~,. �m��+��G�k�̵D��Q xT��`T��~6]��^��4y2[�S��+�^j�^p\���~�j�JҒ��x��6x���r�n��q-�|�2��퍒����P�;��1ɊF�2��ee��)��Sв�YD$���S��:�#L�I�������.��J �H��^���T�}a˚�A�HS�8u�97� 8B���}�s��l��ƍp���ؐsq�a�/P�/�&�9B��͛�[�߂+�v��Nܭ~^LJ)χ��J�x\���pY-4��Й�u`��*ϮN�k��ϵYN�&�mc��xQ���o>��(����g*���ƣ��^X!���x�b� -�9��(U����ؚ͛!�\AJU�8��r_Rk���z���/�~t���7����+��J_�%����zk{�Y�k�1z�e.�C��,�bZ��F����J4����:��G�W͓.%;�:�¹E^����~+�/�i7 n��7p)=�$1Ih��T� �W�� �?���0�n;�Z;E�~˷|�?����'~�'��_�˟��g����xJ�/e��M{���/��ܚi'-���������g���a��֙��I��>�ݳ���k���>��W�߿�n�3�4����tbR�Yzi-Ȑ.� u�<�s6�[���B\9K ��C�Z�x�f�\z��O�W�6d˸V�����m���,G/'.���%ьg� �����#)�s����\�#��V7�͟ �D\�Gv�;��������/ɳ���0��*���:���n�k��L���ȋ�#yr׊�=�����3{����a��$��{\-���G�s&��� t�ѭ=���5����?t���W��'�r�M�g& ��g1 �����K>_4)�#3c ���N�_}=����}��Pε��4sc֢�#V��c���w٥)��I^��+����e�� �r.Xt)G�����w���^&R&��������껬����O�V�4g���H��=��$��0��m�' �H/��P��B�����Ϫa��h� r!L$��r�vӥ���2��}z}�ܒ-~d=1�󺹅�[��d׺G�� pIN njo���� Uu�&:ے;���%[��dW`Cz,��X�O�Xu�1S¹�����a����\���Z��ogqt$[| �$�����<�mj����)W���}H�KA�r�2"���l%� ����U�������)Ɗ�⌣9�K��J�])g�f�Px��hc{�q���� K&���j� YT�z����Z�����+|�x��E��+���a����Q���U�Lw$�[�B^AM�p��&�[`*r�O/k'�'�Ҁ+���U�y5`�I�5#�Q��2*���?�os�u���\���/ͥ��g2C#���q:�^���X�0��x��U�$�O~����?��O~�ӟ*(23����NŢ�pf)��_����(i�ٜ&ꃳ��xq����ԥW\��o��o����W��������-7�wH_�vA����uE_��[�h"�Mx�q��"/� #诚����d�[�57w��ZȂ��YD3y�ը{$;Zֳcim)۱�<� �܊k��Fg���':|�9��j��M}��"�O�k����Y�,_����!:�t׀��z��2\g�r���!t(ƴ��"����: r�=,��7� ��1� ����S�WA��8ټ�ښA:��:s�S�����mݹh}_|߫�[��������+�$Y�L,x��9HN��w���y~a���h�f��0�䷝����e{Iͭ�m5��w��Ij͙8��oyõ>/���h+���Ύ�>#���*�V������,�i5Ǹ2"�wQw}/U��� ����? ���FA�)���v �}@FnC���ӾJ���OֲrHt/� �i_��)�V�}U����/�[bk�+e�}+������zrN[��-~$=�x���T?�f�Cc�֦5��)1~l���7�+bK��L�=��o*]]�;;ք� 5��b�A�%'0:�������_��G�+��pq�U�E�'�;�4��+xj�[�p�ؗs]�V_�ފ�4���*�i���3��{�O�q�x�/s�}gP8��Y\���*5^��a��ib������U�;�]�h3�U� ��|�e��2)��ich�lcc�*�R�݋��o-��y����Om$^�/�Z9����C�ĥR����>YJ���;7�Ğ��㌼ ^c��#ѧ��I9���y�S�y�%&�F��m����"�9'�[���f�z���x�}6�.RX����?��A�ߍZU^���w�m���<�����?�G_����C������-��GF`��j�K�@ԉ>׭�j�l�r&>B��#b�'ů(���K��K��m�<���j�}�j�v�2�P���]h�Ev��1G���5KW7z� O:�`��=��ᄱ������^�T�-�«�u�!�na����y����s���D=�R�o���)�ɂ��>�=#�⊼v{��̊0<*n÷=o���5���I�����q��ԏ�rlWM@+��6G� �`f����䆼4�A��7�{CmQ{�B?�� 6E�~�gY��Ʊs�n�V�\�$� >�v�◿�X��{��g�� ��5=r�f�:ߦ`pR`�<0�'tO�Y�6]/ȅ w����m��Az_A�j�)���f����U�_5�R��6��h��?"9�q�@[k~c�L� ua�ХS/���^�.f]�A��v� �N~g��‹���x���#����r�ԏ�)~���� �� � �5�d�,VZL�[[ң�Ej�~�x���n�~|_�] y�L�ɥ�mW�:��:�9Դ m�n���f��W��x�K�`�]�'�X4sD�a�˸.n55U�.�>��F��(u���v�i� �;�^U�^�ʷL��Ji��o͂�pO ��}�i�7M5�T��d��BU��*���J��&� ��ޣG|��K)fs�o��,�EV�[���LW��r ��Lо,��w����nn�N�2�҈��KTug�X�2��k�a����*~;@���#ha�<�1���4q� �x�m ��a#{��ʊ����p�A�F��p�"�G�eŗ�%��� N4֜x����c�h ѬhD�V΁bG>6ͱ#/`��(��g�:i��s!.�i��d���!�(ZS�BE$o�' �(O"���sf� ��&iae������;?{~� W�Q��߮y'�9f�L��s�� �p�<{���a<���0�"�I�/5�4������_�����_�K�~����]��⓿�f�7�7?{�����K����=M[���8'h�4���˲Ĥ�6�����������O�Ϳ�7��_�sn�lr��t.�ƶ}r)vV�9j�6�f��v�4�h��_8Ţ���y<���;� �[�鄼J�o�8qO-rA ��m�[ �>}��YV܎\�KT��VK���Wu#"����=�8��/���<� IDAT������G�1q-��F�f��*X:�n����b�����ܖR��swk����T^��c݉�Yo:ޜx}����}�r���YI�RP�!ã@�օl�U/��ҩ�c���(2:���ɥ���� ����"|i.�z��C7�`�yO�rd� ּ��-4��G�&#��3-���.~a�L�"��ǓH�w��f�*���3��g5�袻��ߩ�1��#�b�O{����X�\��Eg�r���x�qW����>��^A�B]-Մ����>��-{)��T����1XXļ"�w�!��^(��\1��43������e+�W�����ȡ���U�uoF�J\�K;�#���G�;��ZOp(�6Z�d�Xcw��ql9���;��b��PY�IX���ɦ�MX���F�=ƿ�ծ��p�i�{�W�d�#F��Z�(>�-�fВ�-��X����N|j��FN�ؘ T7�fd����*�Z����C#&�p�L�����Ij������5Ja��A�d��ßv���,����j�ċI���s!��Ն�jx�m�� �1�c��7� �e���&�W/�b�pr~�a<���Nz��,����e�#䏼��k?��?��O|�7�7ޱ����5�$}�����O���k5!ˑ} Wx�E�.ܩCbY�i�l�i�Φ�ɓ����������?������_��_���a����'�(�̕���mĮǘ|ѸD���W�+ٔag5�2e��`��y���M��e۩)�eڅ���} So'{�����K_�oaQ�o�3=Q���d^Oe�c��+{m0xK�iH�BKބ����psy�s ���[J�p?�;ӑKi2r�iF����Yr�V�����������]CC�pv�3M_�}������%��Ń��7|����������sv�@���V�:'&���ů��5Ze�J ���g}�ʱ�hE }��+|�Zy��W ��� �@��}M:Ԛ�|��j�=t��,�"ΔI� �Y� ��̵����HI�� Z7��&�S��n���6؍L<=���M� ܮeų�ƻ� �4��<[厼[8���%?w[i =N�aNX��V�e��Rar'����ɛ�֙P���l9$�m����\�źθ��\YF�%�>J;*���� ��!RfĤOh��؉��`0d��[<�ݮj���s�� GP��ݑ�w�5�GE���F݅i�?��Tj�z~���� � >!��J2��k��֙�X=�1h�����Y�o�z�H��{8��}Q�+��.��[=UUoc��|B�;�kE5]υ��� lɝc�)r�׃�� =��(�\�SwE�G��RU��Y�ȱt?��??]5����l��g���;bW��kv���;�G�N�r�>v_Æ����e�����RD,�qSl�<�'�e���λ�C��\��SF�;����SO7��l�5���%�<6��&i�Y��.�p�h�7U��$U���g�{�6��e�_�3����hb\Y���m�c﷝=q�Y�=�]+^� UV�����&�xIY����Yrw�ܦhZ{6_���X�0��x�Q����E��ea������������|�3?�#?����~k�lɩ��i��?~�a�{�P?���������E�a�ݼu3$���7|�7|�������'O���5�!Z�}��pV��E�Ja�e\tr���������?�Ə����fg��\Ot� � ��t�W�`�k4�ɒ"��;4�v�\�n{�����kg8m虚���[/,�Mƍ-�������&�^�&���k�:��f�h˕�X<�d$�"�E���e���H#�?��7Ɏ�Džr�<2��xD^Kwu�N"l������؀Gl��zK-�"�l !K[6}��t��X�D=c��4���ŗ��;O���͢ݤ]w�>��]�}.��A�){3�Ŀi������q�Ku���ֳ��;I!��]���>�G�����CY ���X�Gb/n�3�О�'c����S��N�q�c=Oʄт���C7���Z�n����������8��;�O ��������6���4pCY�;�=�����8XIZp�KoD���E���ga�sw'�9qF����^�ܚ��vG��E� 9݌���4���Qql;1���*����*qA��Q�Y�&�:ܧ����FK�>�9��7��|J^Bv��F�di��+���a�}�Ls���fEA�M�/�3q����^/z>��BB B��n,m��l����P�a&<�FK��R��� Y�O�t��怆�� ���R?����r�O�+�"&�Xװ��wɖ��Ɨ,����kW�#N|�o�2�<��m�cT9�޹�8[2U��}��L�~Ѳt��A��~;����F�H�p�n��wCet׸�� @E!)h��"�%�&��s�YF(# J���RV[��-b� ��(f7 '����i��I��7֏��qV(̨B"j,y�g�~��-��|���A��]��]XUt���Q������mTK01�>-�S�c!�+ʲF�1� ��$���HSX��p�r�h���,���{�M7���W�G-w=�$i�(Pe����r*�����z��/A�]��mS�2\'�� ����6�C��.��Dg��؃Lzί$;�'M\��46f����k#²7����y�3��^��t[E�?�&�����Y�oq_�7�I�)���|ǪU��K��������D���3i.�Kx��� P��;{���fK��j�l��1�p�b������� �����B��u>�?���Q���ҿ����O}M��'�B}�'O>������~�7~����?��R�0>��4e h��К�El��������������߶,�3��M;�n4�e,K�p�xJ������.�kū�W�8�`n�;8����k�����;ם9 �Q����n53c��7���3x�����әc�+p�P ��O����3 �l��=\��@]�x�j�%���܇�~樴{dF�l�@ax�{tX�Q����lt:o!��t���EϺ�������w�!��\̢|������%o2�x�'S�=�crH���H.}��kV���=g.ξƦ��2V�����#���.�ԙLq~�5P�i&z��۹�׌G+=h�=U1��3L�����7`�^9,������!)+�z��-���KO��"�94n��lhqzT�y╈�`�c��B{�O���'�д�C���EX|ޞ�4�i�ՠ0� �b'Y���me�R+�g�������Q%�ܢ7�s�:< ����jF��ݧŲ�MA����7Ԃ&"ʊ� ������Њ�95����\AL#��ɞ�F�����8{&*�����T��J��~}�u&�����<.�Z@����GI�^S��r�}y?۫*�C�ջ�_Z�`�*�� ��ڊpGb�bz|i� 5� U �5��2Nq4�9&h����J�{�[�v^�r;�0DU �>V]��8܇0s��b��4ve©�*���Z�⓴k�Z6��Y�^� .�eą��d���C9�9O��RI i{ |��#���\j_���5ҫғz��$q6����h�)<�ClT���mh�&i1�u��F����Ӊ�uڄ�x�͚ Nk�xԎ'~$��K�x�F|(�k'}$��M�[���kC��Ǵ����㥮��d�<���d ��9������%9�?���a<����+J��>���}�c����O}�S��K�����y �}��w�#�0>�J2<�<7џz)6��<���}�P��۾�O��?�я~�D�?����?��_'�6UĘ/[O��}ͣ�����?���o�����"6q�=`�wC�I��X]���@v6�J���g��7�u|M��!O���qIϤ�z[xW�6[S�#v���p�[x=� ��$�� ,x ��lw�p ���s��u��'�z��h=�E�r Mё�t ��C����K'�X�Gn������Ă�ʃ| Ɋ�=�hI������-t� x#�$� V4s�o����l�B�>����M�<��U���Et/j"���|���\�U%�F��#D��Q�4�#2�v�u��$��STf�N���V��ci�>�������]:!_"p/ֳ�Cz!�����x�Bۮ�|e�f��\).��I�z̀촕.-"8;��9M�� ���㧪�a6fN�$M�� �p�ȃ�����k����61�a�'n�}�&���<���Q�\CbQ�^���շ�y��j7�jfɛx�;."/��#�ɹ�-쭗����F�KZ% ;��PS�데�E�2���,~x4*�e.52u�S�I# &נ��1�Gd�����f�`����HVY���.�mrs�)C��������`�%��9��q';qb�&k����!����E����Fc��������J�� ���A������V��Z�S����^��i�0Rd=�䵐\�r��bہ'"�̜\r�O���xg��W��f�l�p��-񆽅��S�ƜUtRd����8�P7����|�.��7��������?����]?{c�b��bAOǣ��uc.��t{s o�g�u�&�<��V�3�1� �b��y�� RV�8���4�7��d��;sX�Gg��'@�1���a*Ro����F����B��#����p�7���Q��oC]�ԅ�k U�{1߃B���,f�A�mz&��y�ҝ�����ȩ��o�Z�&���d:B3��.f������J��h�\������[���+��.t|�;��𽃵�qj]��%(���0���&���?3wh �5��tgXti���{+�� �y��@�fe�{�}�7wNN��Li����Zp'�R�:������ C"�{gAU!h���a��1��~Ņ��gx���r�W�������k��&�����e]Z�T=��d��c�V�ӧ�Q񦁾�.�#�k��W>�%Pt�薸V��< �t� ����O��L��P�j�]�P�Tu)Axr6"�5���U1��,����9)��PZ�=-�t!��&7��b=`w��OMK� ̞�i-%^��>�d�ƔM�u.�M���m�9f�gG�-e��⯄�����>�pW�� �W���c�h�!.�+�{;�5��V}z ��c������fKn=L� ��:l�$7S�4 �q� ���Y>�;���]�oD_OOOɶ&t�+��k��vpi.�+|��ǚU;ío���c���`�#![1�3�����#ݎ�^����SG���wָ0N�u�������0wp'b�.[��|�� R�����{k���ՐACGq�tq6��R�W���$�S�=��q~/˸_u�����&��p~�V�qTҳ��}|�y�h�]i���pM����HM���UOpa��*�r�J��|j�/���G��#�8e;5��N�������z�[/�jnK͡L�]{н2�Z��E�9�5�V����Q� �71i������{�vb?�$�~��5^�֐؇���F��@�Mn�]��G��/��[�&v\�,�{k/v�4JGC��T��1ϴ��-[��H�+e�К]9 G{G���f��=���ʲ�'�!�r��� ᫺Ij�� �aLt��[�����z���G}eXo_��;h�uL�>�#�a �~��;�5,�66�S������G9��9E�aCLt� �F�F�l!+IHq0G���],Jf|0q��C�m���A&�>�(דgɪǧ<��E�Ɩ�����O����n�:]����h����#�N�H�G#�T�s��E^\��R�����a<���0>ࣰ$'ɾ�Tۿ����������������_��_� ����A�� ͇���������y��������?����� �P���9�4�����0��ϣK^MW[6o�7���a9l����O|������W��{���`�ҴL�8jӼK�Ɏ�D��t=��� �"_��e��神s/#�B�@�ȶz��o���pw&A���J�!D(���l���;\M��`�$���� ֡ e� ����0'G�O$�۟�yPV,`�Y��F�zO��j��^�2�l�0��+K:�a��]G$���_F��4A�S���@�Py˷���V�@�� ���=„�h^�f��gw��"��5��}e�vج��"=�T-�d�؍gi��y=�� �Ū=1��L��ۋu��a�r@���*Y#�b�/M�k'o<�R����lж{� �j��6 �<�֐��R��"�]�6�B<6B�h�3\���s���&[�I��.�K�?�(m-��#�@Xrd\�ڻ+�1$�-ܢ}�H�c���p�+�X�U��\�֓��b 8f.�n� L���7�#4�]���ݝ��Zj&� ��f�P+g?���O*���`�����D�3C�ֹ�1� l[ �짷Q'��I�\_��t��l4B�m ߭��c�Y��;��}?�ʴIb����5��i�%k�&/�`J���fd&�䝹Y�'FRf��F$r�"d�<�}��$�犋C�*.�kAk���.� ʷu��)��a�ך����ʳ��J����^?ns���|k�%�7�3]c�g�~��������="�V�&?���(�AP�C��-����@9��U�N��"n�{k_ ����;t�H�6�Y�I(�s��G�;`�79��tw��w\*.�&�쐦��D������;9Be��G�Uڧ̀pM�l+�>�,���=�*;�K��� �?���0�|���l^���- IDAT�@7�4}��|��~��������~�����}}=Z��4���������x�'���c컿��_{�����~ߩ���Ŭ4��,:'�?�Jfк~�P1m��i{�鏦+� w��y�o����o�������������\�bv��v�;�zC�&O�Ɛ�΀�V�L�[ŵ��lQ�rq���ٟ)f��X�$�2s W���� ���eWϯ4���{4��Ө%8��'�o�]�Hw���GH�|j}��I_�+q [RǑW�W��,%���n�� ���7���j�?P�>^�L�Jx�`TP�������ݱQ����8lY�{2^|��� U�"�!�Y'���"��0�^|+�LZ0k�F8��g��~m�γ���>�>UN%i�!6��ĸ*wv�'�$H-_ L� .�H-PD�A�@� E���n���i�P:�Q���n�H$P�PNJ]u>�^k�9ާ/Ƙs�sNU����ry�*����{ϵ֜c����{F��'<�Z���8ح?c�p8��[���.�#\��C����|���mb�XR�k�k.s��`9x@%�Ue��wUM�p�)f{4v�?�q��0 �%���|j؁p#�8������TQ��=�-��5�a����v1�������Ƿ�.~6� �a���m�b���H �؈ lEY���$/�� �D=iQj�v@�o;ܦ��Dq��("Pc��֨-��J{{@�`_��M�����f�8,�ɥ����Tg���.�µ���-M� :?��(�z�hȭ��\Ϸh#�V�Ǔ�t���V u�Ir��������^,��F#�{)����-N��I\�Ct�)�^`�}9篸��<WK-Ռ��F�Xئf4�i��+�=�^~Ւ��5hz�[���@��U���$��3�q\O����+�v�%lö�j���<��������|2%4�=�i�� �mi�ң�Vܒ�V�\[ *�Mʌ�cT���l����7pi�6�m�Fn��Ѻ���u=��59"��=�ڪ-r��x4[l$9�&� m�Ũ���y�t�4F)9uп���~��^x����g~�Y����������|�����}�C�}�{�y�����Ǯ�����W��u#��U�4%J�6�br �:E!E9�c���^�G/�_�������_�O�*��.M�5˰8�Gt �1���ʠ��B��,Z:��5>�ܜ�̸��e�(�2�����0vZV�d[��B�l?-'1�G2�-�*!_��/ֺݝ�\�d�૲�|}�B�F7�@w�;bOJ b[�=]�f�1(@����qM�P�D�U�`�,Rə4ͨ��7�K�WU�Lr�w�.=z�!���{�1G�V�v��'��7WF�W�r.�39�����R���H�4]�d��|�ڀ����ܤ�����iO��9�n�a8 w�ު��SH��E��9F�H�E kBKQ��Hj*}�L=~�j��N�1& ��4m��kSfּijKp`sC~�bk�����F)��s'ƨ��=c�v��ʪ)� �� *�P��G��A7�HGYg%�� �a�˼%�$����(��3,�+��D��qi�*��mE����ꡘ�i��-8Rn���r� -�}2;?�P����D��2w�[ ��>�:���l�R��0�D�BnŅ ���+�q�ґx��S@���i�nE�G>;N�1�{�Ȧ@� T3��F�v�����|�%z��V]|�����>$<�`�+V�~m��lP�7Ɏ��$��0p�ƒRvh��d ��3��k쪼�SKkB��Z�D/gz���»[r\�g�bSF�<���I[tͭbp�f�j(��S�M����\�$`VD���v���c�C�]b�'�b_�r!�wK����uC.3��?4��\��>��J�&<�ѭɬ�֊�T���k���V^F�J@� �6���٘N�������U� �nbv�����]�*.h�(E%�MF�����,R��bI�}S��f��֤ߺ�W�ÛV�t�9��+~�=~���?��}�x�瞜 V����3�?v^�m�_'��c{��G:][n�vM3N�(���>����������������˸�o1�̆rMV�j\7*�8-?l��Ǧ5u���b�3Ǎ��Lv�EY�h6/^��ɴ�*���N�@�dH2��uML��p�a��o�����L=�Ѿi�m�J ���=G��g�m��U'vq?�I{l�6 -JS�9�~��8fG���x�<��O�Q���v[ �7f��?�|:��d���L�'�=9AN�6Lz>$��t.�}�� -D`�-b���ōR���������c���|�_�`��Qn5��k����}�9��ޢ��dyr i�{�XI ��l�6��T�{�+�ʫ���j��\��y���I\+�F��t����?�R"�ۉNլ*����hNE��%�HT��p��)���34#�K!+)��V ��2g��&Hם�͘H�$ZB�"P��0C@v�X˺������K�< ��yP[�b_��Y7��u��j���3��ۊ�% ��%���2��`G�l�L*�5��� e^�A�������D�Pn��o��8�����{nIl��W��/V�A���6s3���1R��j; <ٕ������{�Z��P!���dɠ�apj��; s29�%u�Tǜr����e敹[������an��!k���$��lF����`6EZzɗ���X�:G�-�6�&4� �Ц���< Cf�)|���[{����x�)���m���������o�����������x��[�h���$?E��J����R�������^���{� Ħ=�4$�hs#֜|��w��]��}��}��}?�? �����<�� 9�(��P(��U������z�w}�7��?�/~ᓟ�o,��� �9ME�E�g=�#� `�q�:��c�|�����dgb,yh"iٰ>PT��(_����I-Ò�M�~ެ~RvW����1�PϽD��g+�#(�Z�����������\�� �_Q<=�'-���A�R�䧉��f���t�H��S=W���n���� ��b�<^����-�KD��%�J �ay|��2M1��4l@ �[�TM��Wҍc4������&ֵ�k�In���k� ��捋9,E�FtR@�Ź�P��p�ޠF��� Sp ��:xN����� �鬸�Sa5��[s)=O�����v\���)���%]�ѷ����A�ݟʢ�DtXT��[��H�7l�����palɰci�i������k7��yw��oL������SL(�Me���fֆ%��${ {�+����#�F�G4�AM�[��9+��]���M0� F�õ{�IA-���U� =���P�[�#�a��bݵ-�����V̌�/�=x��Ϣ�W_7p5G8�zrU^��ZG�<1��$?�"��p�J[f�6��OoUS��z3�b)��Q��ڪ��UF��8�G��������*���m)��c�� ��Vf�1_�u�9�/W.P�+�'X`!瓮��G�K��[u�#�g4)����M��U�.�p�2�(k��^���pB��ځr�-�d;�ilUS��Օ��<�kئk�7��g�&\�Bn��p6n�l�J�f��(��+hu멚�#��w%�dp��lH�Mv4�Z�/��hw�Y\�6�1j$[�t�䶶��(�����T�m��E�}͈�ͯ�*Do�fn��q�y.�H:3|����<���"����������c?�c����_|�#�� /����~v}r��ۙ�4�R��x���'g������Η�Gs�j��;Z�������������������M�o���{~o�ހ6��Ms�㈍Ȼw����?��s��������~��v��桖ȬM�nr��|� |R!͜m�1�9�1�����s�{��E�Rݚ�TM &7^�=s�'����{R�EaH��,�E�k�{u*����d�0t��O��n��aB�.k/�\m�}�f�M�y��>�o]T�Ǿr��7O\S�6�x���ȷ�][�'�O}`�v�|5�R��@7b: �8�.�7����hL���t��yt�}�J��q�Ix�Q�\ ٢9�9ZO� 8^ӎlq� R�����A�l驌ɖ����5��;!˭ ��5H-7r���v)��f�G�� �x<[4cn�Gkjn�����E��]� f�������k��S���h�jZ���GT���2D� �nF������{z`�/���W�Q����j�� qx� Ub����(�y�K`#�5aK�|io `3/���o��e����W��-�P��͙��Ah�:P3{tp[>WT�ʶA��-���Е�A��@ѕ�����%�׸Rݱ�= %B��B��Vdv� D�xh^�N�8&_��%��ë1p��pUԒ�]���i칞vz,v)�J���v��`HQ��h�݌�[\Z��Z��F�`ఄ�'�l��x �~f���a��P����Fߖ���vKUiy?v�:���k��#v8�~�̽%�t^ޡX '�̒��V��cW���&��:"7B�%�D[>�k�rh�শ6kA��! ����{iS��N�+{c_Y���:��4W�z t��n�K�P?=4/�_��G��M����%8�*�ۼҊ&{�Gs����B�� �#��N�(�[4��cbq������h�kE�B���<�[h���Fr��ZO�w�h�Ң�@�z����:���O ����86�h�Nj���u#q����x �S �JMi^����;����o��/��/}�����>6M���FY9����svֿ��$e�ɯ��e�[�p-��R�����������������޽�NPk�p��%�����%íd]#����b�Tj��׾��������?��~������?������A�D�Kv��&c���pf<Ôv0��uQ��Wۜyь�8�K�6��4�t ��g�@ �Bf���Ii^ ՋR�ئ�!�@Yt��c��n�XE]噂)�=1E�Y�G�N-��t�'���N�oN^���� yy��6w#/S98�l8Q�s��ھ�5 8<�5�*���y|EF�b���k�G��O.��w͍��S9�F��y�Էl�\�����h���7\i���$۪����4�"��e��ЮEy��<�M��…s�9�DK���]�I6����/�Z� ���|Fh��V���sc.�m����4*{ i��r092�\o0��R�9�5������`�Щ]2k��D�i�n��\�ܘB-���1z�*,���{ e�;�DF����C�C�;k��-���ZuհR����4L�3� _�����-��B ��)C�f�xE� .�mdyueH�X/;�g�5 ]hc��Ri�d@N�"�Yݳ�X>�=�=t���X�&X�P�Z;L<�N�X����� J���2�!>�ăs�H}sD�c�����u�t��ʒϱΖ���n��Q97H��^�=|��sm����+��$�Ԅ&�Û ��Q\� �+P��5��2��K`��G&�������� �58v� ��)�$�ɗ��8zQk�l��b�� iG�Lsm�vh�OS4�kV>~�J�r0l�bL�p)�@zCKw��fx�^��b��x���j��>( h���>��oQOf��`%sB�f#�ߢS@�L�܇�\�z� �VA����,� �El��f��j�&�s�4%���S IAjD�𬎉)���}x� ꢣ5��Ƀ�.����9�#l9�[��{Ӡ:���ҏ�Q+ ��Y����}�8y� QU%�<��`�ى�ޢ-�b�5G�1��p0�\�.����-��:\�B�ɱ'��&��<��7�S���4j�����t]�n�J���r���F�B�#���;�a#e���)H�DaTN�~C+�.x��� ~�� j�.�SpBĦ�Ѐ���١UC�T �jm����Vo`���s۪}<��/ո�U���B���+|�D�\��-G�� �(qF��p��X^`��[������0�O��#� ���fsi�{ �'/���$(���Er�����n�Yz��s�P�>��/�na�qKQ�9le�� �՛�ΛV��&�7����ݿ�c?�cM�hJh�#�V�L���k�>�XZ(V;>�rQ+Jg)���J�w���rb��h2;�q�ܢ@� r�D�%-싼���ԅ��Խ��w� �-��~�d'P���n��0a��u�(}�Z�N�o��S;'3t|j�^Lf&BBU���fv� ��]���.�����+4��WM�OH[�-}�$���k Tk �5�$ s�!���v����T�v��q,��D���Ȃc�qp#�7\ϗ<�j>���܂;�5e���^ ��e��0l�+3��:�A��M�j��{�+0�Ōc�3p(�����f��ի2<���/�{f�Jq��,A#�&{ UEA�DI��B��bv����ޮ��tWܵ�` �$��x����!zY>X#����|3L���H�K�Rٵ�p����v-"&a���L�� � WG�'Ư���&74m� oB��R�+6|�Y ���:����x���mur��rB|j������o����?�C?|����_��O|���+���O���j���J������k��������=�~����w|�w}���?_J�q�ݮ�f�iV��y�y)"���J7�*ͯ�km�<�� ��yl�!ښ��Ed�!��C�<���pk�|ߟy��~�����ß��?��������M�?�Au�R���[u�p�C2���E�7? c�B�mjh�Qx��}��>��S��4�Ԅ�l?s�Ǥ�(Dm��ektn�� ă�8��=������mp.�(vt� �ep'�-�]^�ż*��X�����Ҥ|�s$��8n�����U7��Z�D����#˜��;,+�g��<^����|񑫵g1Ǘ���%�5��|6EN�������FFvWRd�H�ډth�z �D-�9�I?g<������v��6����0�o�J����b��]���BAQ�Ío�ռ��� ][qKܵ��H���V��*�e͛j��.�!=D� b��Tp���^b��p69�Js��P�7�Xo�soT4������^UHi�FK�F!K����B�T�ȎrM��sk@S��z�:��4�"�T� 2���fT��s܈�"��#��`K�c���M �ԧ���T>�bn+q��*<�Q�S�ƺ�������̒���p�͵�H��l�c�t�4�^�)5j�^t��(��y|9�"{5��k�PXji7����Ɉ-?L���Tr�]�.DĐu�Lg�.t��n;ȥ�Α�}��P_�G@ ��r�>�Ni�)F��S���K���zD���ZhE#���m)p�@�} ���H���3@XCCc�� �YQ�}�\���2N/��{�6��^q��%V/?4Y�8���Z޸��͚��kSL)V���*��_��4Zv# 4� Fpc"ɹ��[��oB5�d"׌�ڥs rn�l���O}���g?��O}�3���^�%�ݻw�{�?�'��;���g�}��g�}����إ��Y� 륽RnV}{�:#�~X��q��<ހ�d�g\�޸�Q��"|ܱ\�Yv(�Ǝ|���G~�o�Ϳ��O����?�ܿM���,Q�i�u��0G1U�f}}[��M��i"ْ�u�M5#�;�i��f �n[ϩ v�68�m��ȷ����M�����A��t+|�r����;�Cq��ً*�[�m�p�x��j�ȵ�P�rD@A[��K)�Ԋ �qmM �pܠ��0_&�djۮD:s/���GpF՟Ǘ^l��/�׺�OH~m����z�3��V���J���Д�>�pu����&Id�o�|�m:5;��.���!J�Z� KKXE]�ź65YMI�+{�o�9n�/݌��g�������QT��RQ ��ؖT�A DDF2��}Zs����tJx�B^ұ�Vk7�wm�.P��6�$������l�����яp����������"B�x"��Ue4Am��Ɲh�DY;1(,���n�ߙX�C;�� ��.�˨G���g�t/ج%��x�'�s@���%n"W%�K�*�n9�K+_�͝��T�Dʱ09�8�aT�b�WW7X�w'��_�*�@��BOf&39�$��W0U�/��V��z&�Ê[VD3x-�?r �p|��&�������˓��wy��%�����\�ΥĵϠ+��c�<�l��i�_�.���J��ƭ���*�D_e�ҭK �a�n�Կ�J�B�ma��fg�D ��.��C���?�#.-��� --�zC�L>e��b*�2��h��~Pd�'s@��H'=D�����dW��n��[cj�]֤���2�) Ug���iP"����\�5\'׭���ûIk��L�%�g.d��6��y�w���V��jYS����G�j� ֢�BTz�슿�L���x�� ��T�� u�<���|~��[i�g��EI��i�9���������}�{�������������ۿ�o�Ϳ��'?����_��N�iW��i�*'a�k;�)Qg5�=���<���u�ӟ�~�)�냆��2��h�� ��-��-�����������?��s�=���������j������� �9���d�>(�;U��}b���A[��(}SQ��n����ɟ�ɟ�ɟ���>����?���?�jT��P�L*"�){��yi昛�R�t�7š���I0Ԙ�v�›��H˧ܤ��n���f�$mۉ�t,gy���@L�� S��� <ϖ�1��7�O���e�7A0�ӷ�n�������$�Ɇ��16S�dޚه�/+{�_&��^���:�sH�J߁�Fnm�1��6J�s��"&�H<�r984+Uf�-�q�+_)Q�,؟�Wj̏*_�{§�5S!��4<�=�b(��Ѓ=�6�@���6�]�E����Ȣ�;���M� l��Sf�1�v�i�*��b�4��!��P���$�� �gg%�� 4)��p��:���q�q��u5>��������#������>������o��o�������/��/�r g>���Hɦz�Ʈ�e�8��(*ٯ_\��� �᱌��_���ta�% �0Mӊ�o�w��o�ۿ�۾���?��w����?��3ϼ�]�:ͷ8�����HĿy�uM�������_����������������������7�x^;J�q��;�~���2D��_\�mKA:�e��d�9���� ��s߿� i���x�f� �;ݸ�S�0���JuD�Mx����H�e[j���>�e��<%�RoK��~@U{s�ȝ{�n�J�Х@m� � aBʖ 9�v� ��:s������*R�4�k<�H� ���\�r�~�1m�q_�a�P�;g�� �S2g��{���f4�G���(�d��0E�O +Ǟ� ��a� ����&���g�j���s\� �rإ���FV�����g�FW����,�u ��r�ls�C֒-T�F��Yd�tu*ɍU��:m9�Q��d�̤�JW���!��|���l;\��j��؊(05�[r ��El�P���ь����9'2Գ1�G��.]���k�)�+؋F�� b�>�~b�C�Er��2��0.vp�n`��T�Ŕ��,���+�W�!;�N�t�$G"�X4�p���#L"�۪-ފ�‘�Ok�o๙�-;c�Pp�xt=L���|WpP;ǸJp�iiu!z�PG�k!J�����bA,��W�_i%�G1�c��'O�=�F���sf�X�:e�pr&�F��c2/�75=Pk�]�j&zJ�}�V�%�Z�Bq�BH�M/V���lE�/݄�ָ^�|K�W��E�G�$:���դ��j�9��"�&M ڱ��W�z�d�)�W�嬨d$ qf�+٬O)� L��I���ىT��(l(f$��%�V���l�4s3q�2{g� ���8�ў�z�����f��#;�g)�{[1���`D���JQO5����F���*Лv�<���q�q��:N%i��<����?����o�GM�4���������տ��O~��������k��k��UF�n��8�Z����S��j_������q����\#^ן�������K����oݺu�Ν���=�����>�� �?5����ڠs���%�?��jz=K�N ��������_�?���?>��_��'���K�aj�:�m�1���8'�)�{�mU�� �I� "�@m�}ң���7�T� �z0��H0�t��L� ݙ=ڋ}��cؖ�5���FO��;ɥ��%����m�S��J�]��ܚ�|$ƾl�V�o�� E��.�T���*L�!N\�.;���� ��Q���8�7n�ԩ��8� ��0gK.�9���&�EX_�k3<��%�ʴ�[�m�&���K��m�ڥW�::�6����(0�98Z�ٞ�K��tk@ 9D���5.hcvbg�R�;r�ˣ��.͝�|m���0��&�I�y'/�F�̩VZLs���Tݑ�ؚ�j���B���?>it�x�Y����E0ȶ7.d�!����t�sP��O4�kh��ʙv]�  �K���64U�����]�k�r�qW\��OW��yu+�M�"�#jf�f3Y3z(�%�s����F���~.�� ��Ȭ�dC{ �`�a��VY4�\B���-+��IO�[p��xF��q��Al�W��E1�!��N�{��S(�ʍѢ�+�� �^�T�}�f���Lh9�_;�hN�QP���h�MT�-�!G�z>���6ɸ���7f#ƠdD��;�7�;�� �'����� �2�3� 9��$O��-n�ճ:�+�L�۵�� �=U ��b�V���e����M�I*L��0�ŏ������ʅPOJU-�=kR�����8 9U�3�>���q^>�5���sE������8*'��4�^�~��q+uc�� 7�!� �!.B YV A��I*���n�fU\[�2O g��<��<��<��ƩR��H��כ��}�{_)����C>}�o��o���������g>�i���[��[��?�������v{uu�������O��6���7|�7|���+�8��~�����C�<�v�q///��{��=��?���ԝ;wړ�o\��b�ؽ�I�P#���k<��8�G�~��������<��������c��~�>������-�cv����y����>A��r�t%[�j�� �T��&�#N4����BS�)Y�� �v��=���ľ�5�-\�[�V�r����rh���vSa�=�=6Y�- Ii���_�`��E�� �$qC,�h4n�̱�?V�X ړ���M4����C>�7���%RO���>�5�[��� F��]0Ys�FX@�nX��Z�fӞ1�v���C'��0;7�<[P�(���ym�E%<���SԢ� )vHu��ځ7� ;#��n��e�J4N�"4��6��h�7Ffv3�3#��l�w���H�a�噆�V�;���f���ѧ��7{�w��� ��6%� ���|��`j�Q�c����p�3;��9F%��:�ݓ����]�hg-�����8��8�=����ۧ�*O.s�+�5�G�p��C۞� *��oO��;�c/v�d��#�n{���zY[G>�y=,�H1�+�V� Wh�f y6��A��yM uY6i�������}��+Nb��u�9����p�����o�'8"K�}��Q1)I�{�Â�����woK�d�y�������=e� i2�z�t��y�o � �I�э�d�� �4�h6l@qH�H#s�ʌw�k����#�ݘ�=�볶���+U���=\WR�漞Aм?hQ�g�r�1[���}�;{i�([10P�)������d�y��:@�6s�۾�Ӌ����j��D4 �Ͱ9 j� ���E�q !c�j�@&�틬��^���70��_)1(���g5�z���\��7�֧�R�F]+��k?�:���I�4��n��o��o��o�f/������Zko�k߿�51�����Kn�{ jn����-��^o��O�ӛ���9C"��2��=���C��ɪ���?�������������g�������?�����||�����d��������7��q�òq�1<��K��(؀3��t.�����X�֯��GL�=;�^�^�;ħ"�pG� G�(L`:�o���I�@ (� 8�jo� ����� �����nb�Mc[����#Р��y���ȷ��w���ү���"��R���z�C���X� �R$- �&+��˨Ud���!�P�@�?� p�d+�6�)L������h0�U��ۨ̈́QY�o {���z �&c�O� ��ވ��1�сB���ͻFT�( =������V1�_G�.�1�S+{����� $q*}Q��P���@h&\ b6��<�E�Aшű���q^`���^��;�����{���PoV�] '`.'�l��^oz/l������p`�N�w� �������w`�#C�����{��W-����$z� �� q��O� N+U4:y�ݗ��k�.h��� 8 �!`S!�{��3�$=��^�718����2�}-���A���ס�{�¿"F�sR�.� h����f�Z��f��N�Y ����P>)��֠ ����ɪ��&�U�{�|����"��ccuA��j ��V�N2ܰe���`��4�� 2$Y�^��،[�B���B! azgk����1��"T��+6p��#�p���?L�>� ��Po���-�|�+6XC,�m��_S\w�<ߥ��bl��`���Q�l�}.-T�i�_W�V ��}���t���+t��D&!|_yڛ���W�֧�R�F]��^�ʯ���m=���`�s��o�޶w��ܿh��5 �I_/f��J����9�����_{L���{�����ymv[S�m�S���� ׏7E-um�T��ޑ��������?���X���?��?��������_���G��*e��k_���� �5���S7�� ����¶_ {���H�CN�f�J�1��Ѳ! T�OA� �#�VA������ϡ��[���A:���E�.���� R�Ѐ:XH�m1L�>�z�H`�q�־k(� X��aɈ>��y�)+�Nw�ޏ�&,����������؀ށ=�f�M\�7�e�'��Z�����Q]�:'Y ���=�|��� ���[�Y>�^�*z�>J�^�j`��#z���LA� ��{"Q 4p�y���ݥKp�@��R�"f���l��al���e��B ��7 J�1n�c4��Ds�O'h'�&\�%�hx$.�F6�B�zW�3�P�I�r"����t� �CI�}���I��",'���$� �0�����p'�� IDATL�{�D�Gq�9�z����X,�U�P�HK`�W�/��x%| ;R6 `G]��%`f��V�h���mw#�n��~%������L��~�m�:�B��70 \!'x�#i�V6� <���f p6D�d���M�q፡� tƨ=�F�� 6��G:�.�O�~��y��}���&� ���p;�b�dR��o��dž�+�kRߛ'n����iR�+���!\NŠ�H�!�h�lT�=��c>O �����1U0A�fX���@g\�'�-h�Xo�� �c,!s3��Ϯ��kܝ���f��n.���è��� `�������Ԡ>�C�������$�>a�0�M�E�pe�0g�� �͵��c>���RJ��e�MF����_o�诅�=��V��D��rm`} ӯ`�7��O{� ?���m1�5.�7��ڿ�����]�i�s{�K���ן�I}J�H�ױ��8ds�$ч�������g�}��g�����Z��?������?����������e[�@�� u�.™Z���U�m�|ŵ$���)�NH��I"��qҧSn�Fl� R�>�M!��f���xZ��ӱ��(�5�dO�_�~ k:�KDCD�-X��ɝd��T��^i�cW���(�ۛ���� {���4l���Y�����Y���}vO/(79��@4�1��Q ��QrV2����B� އ�.�^��A���Md#���莾y�&���I�֧���|?��<��=��M �k d?ۆ�ZB��7�[j����U�)���p�#dwF6`�.�J��M�t���!���&L�?��x���r�6��E3����>Iv?�.�cAu[�a�\X�El#�~~v��w%NB6ڌ6��*l������O�v��G۴�Y� �` bb��߱A��S�(��ނ ��_Y����w�vDL@1� $��8��};`�"6Z#j�S�ߩ���پ�Pq ڠ������υM��~��M�tE �֗�e�����a߆5�uɡU8#������b�a ������`�‹��C�m+��<�(&F4����x^����O�n�h��{_ٷD���*�������+� �����E_���!5�\+6�ٳ�~�$�m>MfX�RJ���<����^_S�k��b�۞6����m}s����O�������^ۜk���f8���|���^M=�-��M��k��&}�ò��/�J�YǺݝS`m��4)��B�1/V�se���g�}�_|�������������������?���������O���.�3tN�$��I}�ֈx�e�4s���$(3H�л�nc �l�����E�;�����P��f�6��u����������6'�8 {� 3PoY }��8���=���\ '� �ki(9�!(�R���P���L�2nN31�·M�޻z�=c\l�X [oa�����-� z �����н�J/�_�����,�$4`1�ϽgBo`� %� ]o;�9���#FӵIj7�ܲ���k"�x8���Јp�j�-�j�(�I�6 �5�ro3�^�:�?��(�� ����^�JIa=䢠6�]�P!l�8�O�9bݗ!��?��������>$S� e3\�#��17&��P�'� ,��\� �4����u[��@���C� ౷22��x rp�}{A�UڝpD��+�  G����qi�5������I~x.;�A�; ]���{�yD��>":Ɗ��D�M���!o�y5��ܞ��t]��K�Z��$�8E~�k=Y�=\F\�J�M�{0�����c���EAL�&���������炎�zX?ilR��P,����g��"� �3K�/�,��K1�fM�i}�N ��L>�����Ê6D������d�L?4�q�����;n��hZp3��RA��_��%���� R�>�@� 8K�*l�^�!�`�P@��7x~��ۤ}wX��Md}���� �� E��\�XBKhm ��ٵB @�+�Ұ���@H��<���?�3�O)��_'��w��y����K���׌���~�_�^����y������g.�҇i�W���D�y`ez��7��ޑ��h������������7�?�w?�����������/~������6��]VJZQ���!��s톯~1s�9��V�@Y�WǛb0]<� T��.�B�Q���?�����XxN�3*r5?E�!������B� �8 `�U��+0��ђ�ͩ�6oˆ*�"z�d`o�QI��ٰR�PQQgģ�D+hR#.���dܦF)}{�O���G?r��!��琼��C x��/��V`g��pj3U���|D5]���Lm� |B�`�PM�7F;�X N�ג��A1�6c� �BV����| <4 +KijZ�G��v��'-�� ��D�8�oL�@�z}��#�~��S:qӫK#���%�Ek��7�4� �J��U���3��dnX(6pg�cQ ���{�=�4���8k�G�Fo��߃`,��B[� {S1�G�\-FD^Z#%����l&�;(�16أ�dt`s���S���D,�Pi%1Ɗƾ��k{�7�Bʢ/Pm��@�x���"�J����Cg����+L�|dux �o��u��5��� _P �K���c|=ԛ^�3 L��1^${�F<�֊���8{ld�� v��M��c����G|�^b���u��O�v�)������e��/*qp SS��_t��h�?�ڛ���Ű���;?��6o��~� �SJ)���wZ������w����/����R.o�� �?�I�i?�W?�ٿ�����/�ſ|zz��O�����|���;�\��`�?tM� X\'�ƌ/T�<*�8��Mf�8 g��"|S٤ m�h� mm#�����JD�h��#ϒ4�h�-�ʋ���C%��h��p�Ia+�sw���k�ϔ~� ���|�"���f���l�s`}��Z�D��g��7\�7�\{ը�Ak�қ�COjO�Fܰ!�D?�1�W���`�����Y�,�&,У0 ����a4��^߀8 �o��� Z��D�L\B��l� �� 8Ju̷�s�]K�i� ��MprA\P���/_V`k �6��P�b-�y�xӻ��6�ƽ_�$x��Z`S}45" #�7�ޣ��8A ��;#�� ���A�h����xA<:^��2pN� p��6�klC�Y�>���J��*bgr�*GCl-��X��i����j�:�= E8� �l���wn�֊�V�,�����J룢Cq�߇����'e�o��q��q�A�C�w��"�̩ T��r \h�e~[ʹ�a�Y3��m�P��(��ո�|��� �y������0ɚ$�e>���ڥԷ�&3����v�iV �U[A/0j�6o^۴L�Xδ��b�����<#&������`Y��X��T/�7�����`�H"�3U=�!X�R�� s�>�����n��Tʹ�NJ�MЃ���?�h���|�|���+�`q��l�mV;Hհyi�~�a�8�9ݜ�ќ�i67��ո��,Lb��bQ���^[i�,Vߖ�T�bhH CɃ�;�FQ�Pq�3�� n�4� \a{;-Q承36�?����f� ���٢n�9�@�(���i�Dl����'.�h���c�j� �R�������L�]!U�����.�>�(��(�t R���5��^j]��J4�hN�x<����^g~mu��2�O)��RJ�m� 6�n�iq�$�j >��0�h!�:�����??Ͻ��5������$���������ۑ�Ǫ��%�Z`�)��+|�=}�wd��ǶY;�t�@E�t�b:���J/�l���~��9�c+(���O�y����~�_!� l�xr���{4���0FZ x@�Q�6�ƭ��0Y�l����3�+�g_QlBy����gMn�_��x�o�:Kz��O�O����iA�E�-';=�iť!*ʌ�����l(���j ������am8p����'G�O�;zt��Rڊ���O譞O [�O��� ��� ��o�V-m,�A̘�8TM_��pZp��;��HN���^q�ǽ��ܰ�q>�a�PQg�&֕K���Pe3�YS���6h݆v��o�x�E��W��^��n�����# t�����V�gL��3.o������ {�Wwx�~���Xpy��'������o�p���R�74,LT�q��l�&m�n�op! v�|�aBy�O ��N����Īm����� �8?���G�Z������@4��=�&�'Q��h`Nџ����{�l��H�d=��]��^�o����dȱ^�=�|�e� �+����f���Wp€�u�v�m �=�p��� ��Q�moV�jU1���E�m��\/��K��>�#����+�J�O��`*( ~�ӊ����;�&���6��`Eӄ�����_cX/��54��`��PMf0 �X�,8��G�%9a���G���+�� "�����p��벇چm��akXA� d�@�0`�R���sQ����Z�������,�?�� NJ)��R�n+ PQ+��� (w6���l�OSA�^K�>�qy�ʹ6�A��rB�. p� ~���>���g44��de}�v��(� MD��:�h�~�7c6����Kd�&U?�ֆ��q�U��/ ��u Ŵ_: �8�w 0T�.� KLV� XX*��8��L�9�Qj�! l�a�wf �#��ڸ�v�|w VX -�̘V���lB�0UԉS���B��(eF�5o��'��g&����]�/X� @�\TD�;;l�Za�����O,uraFd�@#>a�04�Ee����'e�p�0�-9}���*�{�q�b���U҄r�A� �h�|���(���� a��ϜgL�ٵ������πX���>�����b)<x�#"�,��S0&� �ǃ�W ��3��+a�Qgۜ5�} 8eUe�|�4a.4� �5��;����fNM���iXP�%���¸ŵ8�_<X/ ���aٝ�� ��~�=������h%l����$� AH�0��V`�IAL_Pǣ/��N�;p~���8 �l�^g,�Q�]��z�5y�� *�T% ���i��2�yP��u��5�"ΑY�Q(�u�v�Fp�7F�V���R9=/+B 8`P1C�����RU�&R��䊛�� x� �P�W������ {��챻�Q��� �`�G�$]#/{���zNI��b[p��e�q�\1U|Y�(�����'�O���:�r�鄧��x<���^9 �cm��*LQ�$]<�-چ-�G�ǣV5Qk{s��� ��U�3�f`Ayg�5}w��|���:s���)_��7Q������@ �`\�V4���P,ǘ E�.�퇓��]ad��c>�з ��z����x�u�A�z���B GDh�d0���@D H��PMc����"ƛ�~V|�9��-0vR�����'�C�B�F�/pmV&������˝i���C��cm6���1���WՔw�� �s���θ+֧�RJ)���L^R)e�����AF�{1�W��^��+�"����q���$G�\'�Ea,4W8�� ��R��G���u\��5��Vx�� [xX�h�j�ٗ_�����RB�;!��#���9�W�>�,� �3�_���*��E[�h�G"�`Z@T�3�zu�5N4���������yl�x ��z\��\�/9��f��M*w:����2�C �I���Z���a�[�Q;�8�L_� ����x<�d��p�+��K���H7gڀ6�M��%/��SE-���K�*�ߍ{x��� M҆�rY�8Z��ShM.�$�Qz���bhd ݾL�����k�k-�A��u��߾FR�������M�r܁^9|Xe�c��$�xS������9`�T��a�({JثKC*�o� @�����6 ��E�Ah�0Q����~�����^����~�M�E����x~�`�g<�SzH�����6���#p���X�Oa_�Zv��h�@`��#�=%@:A���f ��s�^�� zh\����z2�m�.���oύ��w���N��ܔ�2�OD|����4l}����b�]�����d�� 7sh!���e���R1݅�U@E�dž,���8��џ�9a_��5�;�����}z���e�cIv<����T��~g��C�f@*���>�y�ĻO����H��E��_�o��U��JI�! <���ڏ_g3�*c���L�#n����qs����?�����) �w�B@��J��PP��5]�IDATG��~M&�t�UT��v=���t�_�K��������y8�VH}������ �>�؋?\�7#�/���~�y��v�� |��6N�/FcKY�&��a�����Ȱ>��RJ)��RJiB�C�G�H �p�NJ)��Q9`6��RJ)��RJ������ѕ���RJ�oZ��)��RJ)��RJ�h�އŎ���l.�RJ�x �68)��RJ)��RJûm�?K�RJ)� ����RJ)��RJ)�7y}f�)���1֧�RJ)��RJ)�2�O)��B,��RJ)��RJ)�.���Rz)YY�RJ)��RJ)�tzuc٧�R�&�ٔRJ)��RJ)��RJ�e��RJ)��RJ)��RJ�eX�RJ)��RJ)��RJ)�� �SJ)��RJ)��RJ)��a}J)��RJ)��RJ)���2�O)��RJ)��RJ)��^X��)��RJ)��RJ)��� ˰>��RJ)��RJ)��Rza֧�RJ)��RJ)��RJ/,���RJ)��RJ)��RJ�eX�RJ)��RJ)��RJ)�� �SJ)��RJ)��RJ)��a}J)��RJ)��RJ)���2�O)��RJ)��RJ)��^X��)��RJ)��RJ)��� ˰>��RJ)��RJ)��Rza֧�RJ)��RJ)��RJ/,���RJ)��RJ)��RJ�eX�RJ)��RJ)��RJ)�� �SJ)��RJ)��RJ)��a}J)��RJ)��RJ)���2�O)��RJ)��RJ)��^X��)��RJ)��RJ)��� ˰>��RJ)��RJ)��Rza֧�RJ)��RJ)��RJ/,���RJ)��RJ)��RJ�eX�RJ)��RJ)��RJ)�� �SJ)��RJ)��RJ)��a}J)��RJ)��RJ)���2�O)��RJ)��RJ)��^X��)��RJ)��RJ)��� ˰>��RJ)��RJ)��Rza֧�RJ)��RJ)��RJ/,���RJ)��RJ)��RJ�eX�RJ)��RJ)��RJ)�� �SJ)��RJ)��RJ)���L��^z�IEND�B`�neo-0.3.3/doc/source/images/simple_generated_diagram.png0000644000175000017500000137730112273723542024400 0ustar sgarciasgarcia00000000000000�PNG  IHDR���sBIT|d� pHYsaa�?�i IDATx���w|U����׹7��ސ�� $�!�@dp�U���Q�j��U��RE��i[E+8pU�!�!! �0� !��}����䚐fH�������9�s��2������"�|����ի�k� hϞ=�a�^����n�zDDDDDDDDDDDDD�3�t"""""""""""""�|�������������\A�������������\A�������������\A�������������\A�������������\A�������������\A�������������\A�������������\A�������������\A�������������\A�������������\A�������������\A�������������\A�������������\A\Z��W_}��^z���Җ.ED�<<�a���N`�@B��0�W�pq;����^DŠ��:��pf����?3?�y���m<�_Z|Fc�ꚵ��^j�����6Ei"""RC���������H���"��?��E�@ey%Y�$�0|��s �p�����έ���S�v��^M~ͺ�7�s>��؃�&�2������s�دc?s�9Ͽ���Tӿ�""""""""�di)o9B^U%V+�6�UU� ��M��l�b�#�C��1�V�dpt�Qv�ލa:�Dmғ���䤦*�QQc����>~y<��^�QδW����*+v���ø���3`���lY���.!|��G�q����R^R��PDD�<�_R�f�AF���;�Y��KZNVj���C{�6����� $bDD��k�a��k���I��k�.N;AH�b��йg��Ɩuf�ƽ|���X����p����*�eEel�x� �H..n.wf�M��=�����u�=d��&���,�ΙJ�^mY���K>Fav!e�ex�x��ڏ���2`�z���%F�.y:|�p�Z�����8z����$zB4�z��stg:��3��^ņO6�����צ;ƈ����Q@("""""""�LF�|jjK�!��)�{7���?J��]�ّ��:�-�݃��]MaN!�a`��9��a>������;�~M�zc�.5�̞������j#�m ��|���d���ߦ8��q��� Rw���3�p�#7�����C���*��__�ޒ���9��(G��p�ӷ4v��I^F+�Z���: hР{���?WwW�~�n��U�'�~�����`v5;��(���W������5�d�c��y���9r~�p_��nn��v�ƝS8("""u������������*�|��w�H��Ʈ��]��N�x�C �੎��J9Si��Hە�t����л�:������/~Yo��db�c���%�%&�V�t����;��6��ç�������8z�֝Z3#��ѝcj�렮��صjG���%��Ӈ�M<�i٧��3�ƅ6EDD�q`���%::��k�dTUq��}||�x�,5� ��d��f�N�Og����_?��4z>??? LX�Xx�ͧ.� H�X3o k߯^t򓓉���\x��M��r|m����t9""r�����A("""""""r�b ���9\VT���߽�f��VǶ�^^|ӯ�,��+XDDDD������F��v^OOgp\��ʰ�l7m,� �b�՝�ヂ��p�rv��3EDDD.F� 99��L۳���� � ��aKa!��R�O�oϋ�;cRptY��C̴��.CDDD�( 9���=1��� Ƕ�e����综<�6�v����u������ �""""""""��������3�a���.����D���#4�&���ed@@K�,""""rZ EDDDDDDD�(�Z�#1�%99�OK���n��L���T��\]YI��W�,""""r����������$����vW�\�������}%%ب������~�hc�4{�"""""gK��������H�KK����2ǒ�F��iӆ32(�ٰ�l��}��㢏YDDDD�Ҡ������������\P��v� k�6`6 f�k�k����vGp�˰0�ս;.���EDDDD.> EDDDDDDD����L��G*��&��0�+$�9���b��<پ=��A��( �+ޛG��pr2��m&�b21�ߟ�fd8�� ��{��ΐ��UDDDD�|) �+��n穃y��@3�a6��Ãe���m^f3K��e����b��� U�U,�����/"�T��l���ED䢤�PDDDDDDD�Hv��'�e'᠗�L��+;���.�A��+##���yA��l��@@�����""M�}��6��T@("r�R@("""""""W����: ��fL����r�T/+��ˋe����v��qwwǧ�� &���s��#"r�6&$��VE��{K�"""�H��������\q^=|�gSR�m3�f3�V+V�+`ヂ��wo��� Z�[M�d�p� �Z""�coRTU9���K�B���}�(�;p��6�j�����5�lۖ׺v�l�]������cj�DDDDDDDD�ˇ��ܿo��}e����e�v��?/�p�����ڵ-]�ú�Tھ�*Vۙ?��5k�����&%ӬY���o�礹���\�8p��}�����͟~ʷ�������f�7r�+��E��~���.CDD䢥B�"|����={p���W&��0Xл7��jՌ՝�������Ӧ�۾����pum���˺u<8p f������"�k۷'��� ��<��N�&%�����#t��;����݇��O��̛G��ޛ4���u�\<�j�ڶe�C��ł���'�w��}����J*+��?������i���Uaå��w �Y�Ͻ�c{��z���g?�Z'4}n��'$ph����Ǐ��ڵ$ddp�� �FF6x�k�O�a��E{??���xb�:�w"""�C��������\������D��j�u�]\Xַ/ל& �X5a`v�6���!-�Oo����=]/���Lk/�s+�t�>�N����d����+c�� 1{�ռ�~� sJJ���w0 �G�$*4�����K�[o���7sk�������b�`�.��"�ߟI=z��M� ���w����.)�@n.ol�F�7�࿓&qw�~�F��Q@("""""""����"nڽ���4x�f���;+����E�9�вe����i�,�M����H�_{�QQ<����[��UT052����'�w��Md������<0p`���������u���b`۶L����^���t��8v�׷la��C䕕�9 ��F�fL�.�{�v�v�J��G���%'3k�Z�de���m}����Ḛ��ƭ8p��W�f_Nڴ�?&�50p��QT��+V�.5�� S��cZTT� m_NO�ZŶ#G�++�gp0sƌ������U��gLx8�O�ЬUw�',X���T֥�2?>�����ֱ#o����D6������Uaa,��G��#G��w���A��`�GFrGD��p��S`����ɭ�r{�>��C˖�>-��:tpZ���݊.(��c�9�6�2�cG +*x`�R�'�ӳ�N̓ߛ���?�neoM7��ӯ]j^c���;�M�ܶ���*~y�U�f�@����_b�cNj�,L��⿓&�벝�q�cI��q�N���'�w�����w�O�\��}�H|�A��1�M�i��;v�r�ZyyѺ�W�V���G~��W<�l�;v��%��""r�S@("""""""����J&��IU#� T/+��LJ���|-�٘٣F�]RBzA �L��&P2 �g&.ٻ���J�;q"ۏ���I/( ���G��ha!}� ���L��`QRw/\�s11����]��bRN�j��-�[P �L!�ݝ�Ǐ�Yg�vef2�k�z��x�8,�~�x}�8֤���M��v^9�1�xq1��X�ﯽ_���֬a‚$=���9),/g�ܹ �Ёw'N��b���ne��y�%%S������D������ n׎���\����-�}���r;)����<t�͌_��~~�>n��$eg��7�0���� 7PTQ���T�9�=�u�������EzA/�_��Ç�?yr�k�AD�� �;��S�0�}{�j^�Zyy�+3���E�X��zV�lVX�|�k#:ur�����{�d�^�޷���q���fYU:�^��.��ӱ���L����f6���R�������ΈGM�����O�^�-�z�\M�ڿM�==��G�nh�,IwG@��Ѡ�n�����u�Z���8�0�TrNV���{�t���=p3�ٓ�}V��u �_H_{������y��v;V+��z�#�]�0˒���С��͎p��kV�C��x��b6��������y;.�.ܳ�⊊S��竭�/> I99�"""���PDDDDDDD.KO8�ڼ�S>��v�x�KLƩ�"viչ3.&�����P,..�p�v�'�wP\Q���^ۼ��ۺ�1�n�SZUE|FQ��<:x0�|�״k��=��ٲKJ(�����o�Z>��Gn9�Yu�u��ˉ;v��0,.. ���1�O�ִ��eqR=����=�;���B_z�����*�س��;����n����vK�^�c�f�^y��ݺ1�O�w��袋;v�Š |^|��q%��,?p�ɍr�i��Kj~�)�� a�J�3�β�v_N�'$�>-���L�l6*m6�&';B�ѝ;��� ���ئ)�̀L��rJJ����Xn��w�&��3v����.����������egAf&����r̜.]�]���TQ�;�p�0 |���m3�N�U�l�j��� ㎈��l���_G�����d�n����ӫW��M7qs�^{z���FzAA�zj��5���㝱��D�n��n�����3�a�2,nj> �����,LJ���K���$�?^nn��vfDE9�4�:��Z����)u ��d�={��� �/ٷ� ��сg�y��5�'�~m�**����K��Zyp�@z���ʀ�s�3 ����2�L��}��v�B[__ދ�gR��MIa���6���9��OQE��tÊ��4�釈�������\:⋊�7)���&`~Ϟ�t8���NIe�9���B��@֤��9 ��/�:xm||x�kX�L�ٓ7j: àgp0�NZB��޽Y��\o��}��@���Jʫ�X[�y}??NzA{�pZs��023q3��[�,gTh(˒�)��rz�� �����bi��ڱ#�;���Ha! �� :,�U:���3�?7�� pr3���_?֤��]R�`�牉�Z,\ݶ-P=�nf3�ǎ9�l8|��:�����yq�zn�ӧ�8WW~�r%���W{�2u�"�9}� �o���~~���g����\֧����լOK�;" `��`�.��()�5))@u����ǻws������F���y���t22�.)��f�ݸ8މ�#!#�=YY��mp}�N�5���*�V�32��Ƞ�����R��';^\LFQ??Β�{��G����������%xEDD�����B���m?�HFEV'��L&VFFr��_����Fu����(���K���2o�d�FF6X��0�K�:�F�%Ko�у�����k��� )���K` 7�<��͍������䖖rUh(3��x����u��\?>����<�0�uk���N��nc?��Poo~ͬ��z��xy��Q��������e`�6|z뭍·��[�K��z5߰��DxK IDAT�~K��C;v�m͒����v�}�~�*[����Jz3g��z җG�f~B/�_ϵ�۳z�4��;y�o�Ӈ��Ln��c����izx0g�&~�r%.&����ছ�e� c�}��ի��ҥ����Ϗ�]�b�y��ɯ��k,ص�>�[sm���@FQO�8�g=<�y������a{��(����ݝ]��M��������֭����t�ѣ��h�c��0xw�D��y3#��ޭZ��ر���ޫ�Ee��A��/�ɻ;v��ҥL��俓&58624�'����V�b���<�3Ç����=�z�>�FF�v>���[�Z�c�޽����g��׌4w.�a��ˋ��� hӆ�=D����^GDD�B2{ll,���-]���������9{>%��RR�vy�Ll�ߟ>��l���%#��^^<���-]N���\��m��.ܳ���yO=Uo��+��n�כo������o�f���Ç�a�n�Ӈ�&Lh��^(C�}�ޭZ��ĉ-]�%�9s�W\Lyh(��,'+""����8-1*"""""""����"�o$�0��5p�E^����%�����"""""""rɊ/*�/)) ��P??� i��DDDDD.vz��������\�*l6�%$���v���1 �����) �K��n'f�2++�3�mK--*""""�B��T�lLع�M��N�����\�N�\�����ȥC� �KF���M�v�*/��1s�t��Ey�����4F�[�KBve%��+*r�� Dz{3=4�y ��( ��^JY#��I)+���+����1Fs�&""""r��3EDDDDDD䢶���A�����akd��� _��,M�͋��4kVK�qΦ/Z����t"""r���������E뇼<��ő[YI�)�ف�:uj��Z܅iL�f�~BB��/%/ӬY�KMm�s6�;v0|�ڹ�׶la_N��!���魷bqqa���~=����Ņ)�ӯ�BB} �f��;q"O�=;�c�ԩ i��������\8 EDDDDDD�2?#�II�O�J!��dWVb=i��a0!(�^^^�ZcK�=j�%%��p�|-����et b�)�����q<]]84s&!s����qL��pSa��;8�G��͍�p�W_���m}��;���3=*��ƍ��lfl׮ �;��S�0�}{�F� Sֆf)�}�3f �UU|�� �7�#�=F���c\Vq1O�Z�Ã���S�V��e����==�z�}����BC���۹���v�}�����l��ݝnAA��c��z���bc�н��p��q��]�=a=��9ZXHbV�c�+7���gjd$o��gxռ�������J~3`Q��䔔�N�ҭYO<�h�ߙ����b_��� bh�yz��5� K��������\4�8r�����m�10�%��N�W����c��(����憻� �f3��0-��$!3��� c@�6t t�oUs?w�z� ���C�:��Drn. ���wDD��:ckC�@������N��`\�r��=�ٌ�� 7����v�� lӆ=u����R��:�_ƊX��į pl/��dΘ1�.��]s �|�%���x��\�����&@�kPw�����ʦM<7|8f��#|�?K���|�W�m�خ]����55�UX�<�f ?�ۗ�L��8&�uk��u�0 ":,���������s��L竴���G�f���P���B�+̫���K/�DiiiK�""RO��N����==<�x�]�&On�B3��πF���'��<:x0�|�״k��=���N�;X��†�4�JJ��ٜy?k$@:�{��N�!�S?��Nu�z6���x;6����r�%���WU�49�^���Yo���0*�Vvdd4�ҙӣ�����|�o�z�䝸8���2���������O���rc�k ���J++��w�F�?ZX�w�`]j*�ǎQa�RZY����F�3�//77�]aa�����L������楗^"3?�[�'Nj+)*����a��C���O�t���;���<0p �����yz�j޿�&n�ի�c~HM�K�0{�H�EF��ϻ;v�����m��{���^�Z�,9� ��A���|�=Zo�N�a`=)�.���7��ܲ�m�� #F��u���ů������zǝ<�kB�*��Q�� ��`JDs��أ�����u7g�kG�#��x�^%%1|�<�u�ʧ��zF�?�=�����u��#���� �{]g:_����.S*"""�O����������:����Y%"�R�K�!pN��>> ;���]N���)��>�������5���5�p�…��u�# ��X(���7~n\�:v�k�ul�!5����S��|ΦtoT3RSY��ܠ������ٱmP۶�;ƌ������0�f�U�wv�����c ���t�0�۵;�����k��l�o `Ȼ�����(*�55����̭�{sk�ެ8p�q~Ȝѣ�����'&:�B,��d��]����_?���/'��M5_"""Ҽ�����\�,��z�.CD�Q��My^��}V����3 �.G#��y'.�-��t ��bq��Zrsy;.��ݻ��LJ�99�KM巃�t�N�X����.]�X�����p\���%&���{�����9岞��<=� �={�ݪ�nn�.i��=���X=mm�b��iQQ,޻�i����'&<�*������}�ޚ0�Am�:Ə�֍7�m����i����[�`1��=�0&<��NyU�ؼOWWN��v�Q��zx�������\]�s�n�Զ-�BBxt�r&��A���)���իF�V�(��`^|<�[Ӿ&H��ӫW�j21#* OWWV<�����ʠ�my/>����.(��7���~�{o���楀PDDDDDDD.9,��t-fT��L���/�dn.�&Ofjdd����؟��_|Ani)W��2#*�����1��k�aΦMD���X�y�;��eoNO�ZE��Ƅ���ۈܿti��7�>Û۶���7 ����̙N�嗗���{N�s.�2��v�`^Bϯ[GNI K�w�7����� ��Ņ� ��ݝԼ<ǘg� �o?���N��7�@��O�1Ηx=y����L��ˣG3?!�ׯ����Y=m�c����灥K�u���� �Y�����%"""-�챱�DGG�t-"""""� ���(0`i�B���~p6�Gˡ� ��I&��Νy�C��,�Ʌ��a��`���=�xK�s��,*b����Š{�����~������%&���[�����a^q1塡;v������� ,"""""""5��ĸ�@j�4�顡-Y�\�B��Y;}:{�`MJJK�s����X����m���Q�Z���h�Q��Y ��{�&b�6��˙L��[K�uQ��C�|���Ϳ�}Z�nƊZV��O��e��I�|���ǹ�����W��.GDDD.3 EDDDD.S�ss�`���ӳ�gC��\*�\\��O&��ţ�۷t9��{�bhǎ��o��ی�HSX3}zK� """�1�"""""��*��q;w��Ã':t��,&=e@D.]�|}�2�~�������K�B�K\��F��JaUV���|w�{KK��޽����d�^�����������\;-k篭7F�T���括,���W��L9[ EDDDD�C��J\M����M���8b8k��'w��,�Xw{�� �<<�Y�����A��k���l���&s�(���cxU ��!&�-�F>����n���8��{3��f�^�v����ߺ�[�|+}���`|���a`��K�:Y�T�1�:DBq1!nn�ԥKK�#""""r�Q@(""""rr*+Y����'�XP���RlT/�iP? ��tlm�� �Q�����j������v;���QV��a�b.������"JJ����ãӹ޺HeEe�ٗ�~���ɟ?`�ƽN�Z3?�I��x����0fZ ç o���ҷ�����b^>|�������U��ZJ^�_�5ӧ3�cǖ.�͋���ŋ�=�lK�""""MD������)��v�JJX��â�l6`���nן�ɱu���0�ߟ�����Ϗ����dY���L���))� �1 W��J��;����Ҟ���xzv��g�y_O�.������q�v' ,w/wʊ�ؿu���c�,؁orrH.-嫜�T��ܽg;$�ݽe�lf�-"5?��Mk�s�f�b���L��l�s^H��xq�zv?N^Y�[�⦞=y�k0��ҳ᯽ƌ�(���ql���G��P�}z�ͷ���\^��������f��|����eV��嘨���6�8y�P�v�� �N ���ݱ�bS��ʧ�h�Ż�Z�1�ܱ�J�X������F������0̎�E����p|]�UXo_AV��kw��Kh��z��<�(+.����T*W�"���vă��ж�67��ͦ�h,z�y�;���b�M�xb�J4��� #�Ã���ԪU,LJb��鸚[晻���7���l�T滩TX�����""""�� ���ors�*;�e��Y����;�.�j ��a��?���1����� <6[��{(*���2�� ��ɂ���xy��l��_��rAj��CP� �ׇc��1L�n��Js:����[��k�;#zԠ�7��r��ε��T��$���y�{����=�l�'$�]h�u��8v�׷la��C䕕�9 ��F�fL�.x��3/f�������gؒ�Γ�V������;?�ڕ������ߗ��'c�+~�����̤W�V�s�8�m����������� �q�ۻB����~pt��̛G��ޛ4�1��%3���x��o�!5���R�t�L�����yMJ #��gý�����lJOgXǎ<>�k�n�RZ�������c2y�t������;W�� Z�\���n������T�V��?&r\$Y��ؾd�c\���5�uC��:�>�t���r,^ ��9�a0�U+���r��� x��Q���s{���]^��=j�%%��p�|-�����et b�)�����q��$���K�� ���1�uknjՊP���S��n��<������0\0�,��xxt���*,�v�R�\�ܽ���8����N��d��&��9�k����y&K�v ŷ�/Y$oIf������4£������^Ϟ$�TR�Xb�.���D��7�==���|x����₫��t�JgJ++I����a�Ц ]���V5��sw�w�EII�Z,,��N �`xx8a>>��嗔WUaq�飥� �W��F��/��СF;�\M&z��Ϗܓ�M��״o�t�ͽz1g�FJ++�8Î�oo�P���{Pɹ�,LJjx�շ/�� ��Ç;w�.5�Q�;���d���픯Mc���������ʢW�V̍�czT��3��ٻ�������{o�ND��bT"v�T��5Z�P���UJ��5��gV�-��A��$H$$!K���G�67���~>y|�s>��=7�7��>����=�/�bm�����mU���y�È�Y5p�~�o����� ��%�빸���eV�-sۛ��,�.�S��n�������x�U��`y��t,��$-p��M^;s�9~~�78#��t��!!�Ҥ �w�(ˎ��-[�߫W��+�0i_^��N�7EQ�t�u+Wf����t��2��?N�*U��,M�j t�)��\��ȸ8��^�W����Ou�<��;J�d;WM��7杍�ܡ��Ѵ����ѱ����9�ȸ8V�<��5k0�h84r$�ff���BY9���73�S'^m�/;;&��7�/��Ͻ\/O;�{x�B!�x\�D)B!�B�&&,9v�Զ�W�p��u�j����D_�b0��S� �"gEGӦZ5�mْ>>�:9w_U�v��w�ޔu��ի���?+N�`�m��k]��:u��+�����'psc�����7+:����3�qc��W��ёm���M�>��%�B� B!�B񟐘��oW��SB�ss�Pv�P(�#��›�/��ҽR%�P)X\^^"�y�4*�j�����U-ll17w7j|BQ����ItF�KJ*�^ ;u�V����=��R�:����{�25���37�W̕�\j*���t�U [[N���=.�7�6���ެ9s��5j`gn���=���f �-�-8���׻v�l�ZX��V�q�> t:����"2+SS�{�_%��N�����Cz�C�gmgg&�oϻ�6�V��_��|�""x�Q#�i�B?�K͚|�c���I��7�w�G�^5��lW�:��]˲�ǩ���o11�NI����%DŽx{�56����8[YQ��6�e]o(l��ϻ�6Q����fNt4 ���3��0� �+��_����t_��a���qv&*>��..�����ۛY���l���q�>� ���;r��BQ1H�P!�B�k��-7n�K|<+��Q�')X^Q3�����x�ˋ�E7�I��"3������Q���jӱ����mc,,|P���B�R��Y�6G��8��EA����0��iVԫ���j���CX@���������ٓ���omf���T,_Njv6 ����͚�njiт)�w8s&yyhǍ��Ғ���x�fz-^���]j���J�cn���nG�^�n��l<��$-�u:N���^����x�ys�xx0i��-[ƥ�4� ⛎ �U����� ?p������k��5k�c>��RR�y3:�j�⋐�1P����  $)3��sI�y� o�Y渲��-#5�={Ұ�~.��8YZ2e�n�۴ �����YЫ^E�=�xz�s�P>��`�R�������]��Z�&�fg3|�j���P�>�+Ub~�V�����%�B��A( 00�ر!�BqW2�Zf&$�C|<�99��T�n�rknA33ޮR���܌^-��D��ϒ�����4{t�,�j+ll��i�FSv������']����9c�H�!��W�~EnB.v:;Ҋ@�]��%`�>��[5��:ux���������c��H��5�nj1v8wmnL C��ݧe�O�8hu:���Οg������-��a�st]��3��Nuc�#D)�LanV�nn\)��W!D�-�B!����V�� |Gz���e%o% ����N�*�tvƤ�<Ş��DF��b�D��鲰����mc���7���ؼ��YR�JT:7��i�98�an�#��F���޽�q�>�������_Y����O\ZDD0�qcI !�⑑�B!���ru:��GJ~>����V#���+�V�*4��}!���&��G�̌A��B�����:�����6�Ҳ&*U��؄B�����U�0�ҥ2�n�t =y�u �+Fwk^L ��[W��=/�D=�Gv��pmU*��S��h�ΝL޹����Ll����!��?L�B!�������-1��$�啛TQ8ߔ�� �yz2�ãBU�(����sE�D/cb��Q�<��Z`k�Fcc�0��_k��7�_�pf&%�i� ׯ3'1�a��F��q�]���U+w{����������$�۶e|۶�C!�OI !�B� �@Q�=)�q.p17W�,Ih��VV��R��]\��T� ���kdd�';�`�Fc�V���E ��`n�i���_�T�fq�z4ط�]ٳ�q� �na�{�p��7o������*���)�k�`��+� v�WQt��׷�hP�M�鲰�m��m &&��t��ѱ��mƎD!ʥ��A��e��ʺ�T�^����6-�=-���y���a���e* W22��B�+S�ݬ�B!� $A(�B!�FQ֥��������'˺���j>�V��^^XU�V����ddD��u���ƞ��4,-�ak�s���QQP[�S�|��l]BQq�P�@��ݍh�J�/�j�#-�+������;G'''jYY=�`��:�&%�ء!D��Q�yei�@�B�7I !�B�8��ɈS�؛�q�Ġ���oo\��_�wI��!3�����cj�DAA**�9��!X[�C��8q����� ���x��;!�(��-[��؁Y��?�`ob’�uiu�`�۵��'�X��5 i���#&M2v8BQ��6�v�&6�=!�wG�B!�ⱺ��216�o.]��1X^bP trr�5�km����K����s������\����ڂ��t��`k�SS'c�Y���)( f��������!D��8@>E�[����=����…R� �}|{��U���"}�4 ����C!ʥ�ĠB��I�P!�B<6SSv���N)��p��z��|��K;G������O%#�YY�Q�Ԙ�8RP���Elm�`a�S!ډ !ēꃪUY���ތ J̕�]�@�J��_@B!��QS�y�B!��Z^������wL�����N6n\!��:].���\�����Ø�أ(���`*Uꁥe I3w��|�=���1c�7p�#*��֭�{ƌ�~��/3�LJ��{��&��phŊ���%��Eu�b�VS�'��( :~�rw����o�>��틽�=����G�a���x{{; !�B�$�B!�#�( ���w/�w�*P~;Q+��/}|8׬�\]QW���(dg_ 9y57nl@�����:VV�qv]S4K#GZ� �q� W>��;w��|��:FI�W�"h���z��5&*�z]�����={���CZ|�#�J��*���GY)@-p(+�� �;���/�����|������0v8�EAAS�L!((GGG�U�F�n�عs�Q�ڶmj���/���wٿ�~y�ܹ���6���� ���kkkڴiÄ �v�~Lll,j�Z����B�F� ����%!�Bܞ$�B!�#q��M���v�$iZ-�2��Juwv�B�挭Z� 8�I~�u�_�BJ�_��]��ԙ�����R�R��������aVXvv����|L;��w=���Sˊ��vv������Q� J�2��\�a����{���|ݰ!s��'=1��Ç����Loӆ >>�e!�?�����Ғ�>�oj����c��AlٲSSSҋ>�t:NNN�����\�p�Z�ѣGX�h-Z���� ???ƏϹs���ǏO���K�k���T�VM����ȠA��Z�*5k���>�W�ݪV���fذa��j���kN�:E׮]�\�2���<���$%%�{k�;vЭ[7�����o��mG�!88'''�v���˗�x�"={���Օ!C�p��)��'M�D�6m�����Ã������I����b������Q�vm�7oδi�x�W���8}�4�O����� �Ѷm[� �_޴i�ڵ�r��T�Z�w�}�Te]XX�ڵc���4j�///>��C�\����� ����Z�_.�btٲe :@_�7d��̙���=7o�48�?������<�S�F � B@@իW�O�>���;̟?��>NNN���P�V-:u�ĢE����O7n��7A!��L�B!��ٝ�����||���Rf��-9Ѵ)]]+�|}����GJ�j�_ߌ�(��6$ci郳sO��[�����`�rkǍE���?3⯿h��ۘZX��:u**������ԉmӦqt�j�v�JU��h�r�s���W??Ι���5{~��M�&з/C�.�Fp0}��>a�{�4�R�[7�DE1&* �bs\m��[Tj5�gΤ���@�{�q�XF�]K�or*"��cǖIe�R�8�e �w��ĉ�{����e߂�1�g�&.*�gƍ��M�����ع���,[���?�o���wߥj�&��|9C�,��O��գ��?0��?E� Z!Xk4,�S��6�Z`nb"�n�PKE���)[�n ::�NG||b߾}|���8�_PC�s=Aaՠ�Z͌�5y�ͭ�% n��MV�1@��ԅ�����9��Ъ�b���3:?'��'h��kx4h�S�*�[��U�٢V`����%$pr�F�?�l�W⢢X}��MQ����9�m�_}����w�8xy����5P���-� ��It4��K*׬��nio���S��CQ����yz�c||�D�q�47Ƥ~7�daaA˖-����G�DDDЮ];�_�NDDC�կ��xuZ�5hРժU�ԩSԮ]oooZ�nͼy�h۶-������V�i4�͛�i��Z� ���$22�֭[��� ���=..����n�Jrr2'N�з�[�.���\�t�*U��c0`@��(G��s�=&nj��ɓy�������f���deeamm��ݻ�[�.={� +�5jt��Z�re�����M(���I||<��^�ۃ��pss�ĉ�t�[q�Ț5k����S�N��iii̟?OOO�p��3f��h�׻r�����$333���J�y�� 祗^`Ϟ=9r�ŋ��5t�ܙm۶���K�^�X�d�ݼtLLL�����ɓw5^!��G*�B!�ِ�J��{������ ���xӦ sw�p�A�.����\���h �.Zm���qvu�'&9`jaA�^bɨQ�{�y���+�eT��hݺ��ٿ�FW�ʡ�kg��_�ըQ�� @jl,yYYl��s&կ�����Gb��-��%�U��p����ٽz�U��֯��|���y�c��j�OBa�^|L�~��СD����s��l�2���X����~�W7m¶���w�Z�fTiԈ�Z�f髯rt�j����}€�<<F���gAÇs��~�҅MEՔ�J����g���T��f۴iL �����}hQT��0���P�J�r��v�"))I�^܊S�5|�*�����|� �-��_d���������k�~��5(~���H�W�:uf�̙����t�RF�qW�zxxP�^=^y�~��g6o�Ltt������ܹsԩS�A�B!�mH�P!�Bܳļ�s �_ԵR%�U����m9:�;��c��5��ޞ�>� ���hҤ YYYL�>�jժ�+�Ο?�֭[����߿?��ő��apL[[[z��ͼy�X�b:��~����СC������c�S�r�rc�۷/{��!55U�����$$$�aS�Tt�ܙ��pv���޽{�,��0 :��g�S�����K��V��՜U�T��ݝ��\�t�`���l.\�{�ǠA�hҤ ��p���{��V���;|g��[�wɨQ����� ��‚�}��s�E��iw� `���h�Z�92�B��I�P!�Bܓ�o��}�ؙ�v۹MT*>��fw�FԶ�z�!ޕ��8RRV�����0!??k�8;���6�����/K��c�W_qq�~�_��ٿ�&.* ߢ��n�~�"}��11l�4���=��~��(P�rDQ0����_��͍���'#) ��!�ˑU�X7~<������]�ڠ2�zP�$�� n��޶��G��YY�+<��'�;w.����R�JV��w k?�hsd IDAT��3۶�����9�v-՛7׷%=�a?�oOFR�m�s;'7mbϯ��p�).�lII��i&-8�jII䔨BB�6�fM�5�S�Z`AR��*�+*�FC۶m�?�>�djjJ�6m�7o�A{Qooo�U��?�@tt4���cǎŪ��簰0�l�”)S�ݻ76�*��x� �V�J�>}��ٳ�ر��?��;v�kpp0���<�쳬Y��� 2x�`�7on0�����7߰p�B�;Ƒ#G�駟pqq��<�?���}U�}��4k֌Ν;3o�}����A�V����011!::��c���y�cM���)������B�L��3�֬�M��ʕ+�؊�r�;��((#8�Ϗ�%�4}Լ�������ӓ�2��کS��ر#���,_���Uw���?�իWټy��C�|^ !Ŀ[tt�T !�B��ۛ�N�}��t��0S�XT�._רQᒃ���)(�����*u�����BQH�R1�v�2o�����ϓ��=��D�ڵ����I�&�ڵ���ܷ�ׯ�r�J�.]�W_}e�p�B��;!�BQ1)�Œ�xƜ;��(��Φ��iЀF���3ĻR�j��̍��t R��i��]c4�;D!�R KK&x{������*���<~���G4G���V��ƍ3v�aÆh�Z&N�H�ƍ��B!"I !�B�R� z�$+��o;N �ڲꩧp�`����l22����(��y��wssw��ca�s�y������yc� ��m//~���rn.��`bl,C��p455VxBUll��CB!�#R�z? !�B����$`�~��Cr`��+�6�p����8RRV������ʄ��dlmqve I !��\�fz͚��L4S�嫋{LB!�B�Ȟ o��6�=��[�f���l߾��}���[oѧOc�W������j�m�Ud��(���?�h�B�7I !�BW�c�1LkْIO=�/]�p.2R�}���.d�ر|۬�۴a�/�c�����#��5»w���0�8���w��d��ũ͛�i�i�{a�.���S�4a��?�{�$���z�%[��������ٓ/��aZ˖l�� �~�)�V� v�^&��0�LJC+V<���Ks;;�89aR��P���X�u6l�e˖899ѩS'-ZDnn��aaa 0�j5;vd���̛7�Z}��d[�l���������H�f͈���M�6�3F?vڴi��j�����ׅ��$�Μ9C�=pww��ߟiӦq��5�s�۷�:���L˖-�5k����Onܸ��M����@�8{��}\�;ۺu+ӧOg��Ɍ7���@�֭�믿μy���?�7o�~|��ՙ0a��1J�̼p�}����� '''BCCY�~��>s��E�Vs�� ڷoO�ʕ �����16E� 2�Z�FS��R������}�k��Z���gϞE�VY��رc��j�nSi?i�$ڴi���5 ,Qe�a�Z�n���NNN<���\�r���h�t邛�������+�ܹ����\�#G����K�.��q�B�'�$�B!�`�lm)P�@]kkvR��¨1�5�`~�U@���i��:ajZɨ1>I֎�B��f�_����1-�;�u�TT*�éөۦM������*��tKѢ��s�ӻ7�~~ �33kk���+�&M"�o_�,]J��`���C}N��ϟg���,`��|�0Ԛ�s x���1˗sd�*ڍͫ�6����q����{�Q�kW�4jĘ�(�DEQ�k�:�����ۛ��U��Š�dN=�PQ�\��>}�ЫW/�m�Fhh(�Ǐ��/�`ƌ|��w$&&���Ȓ%KhѢ���ׯkѢ�mϓ��ϐ!C�Z�*�7of�޽�=:t�@DD�~|DD�+W6X�e�ڷo��K�hԨU�Ve�ҥL�:� 6зo_�����ӪU+Z�jņ x���={6����AlW�^e̘1���̟?���T�u�v��s+iv�m6��7�j5���+��s�����0w�\�:�Ju���YYY�mۖ�k�I�z��֭���+56,,�����z�j�^�J�����.\�����ILL�'�svv�'�V�XAbb"�����ח:n0~�̙���Ӵi�2c߰a�&Mb���=z�իW�߾l�2�t�B�j�X�|9�v��瞣����� ���ǖ-[X�~=�������P������ի$$$��c !�Oc �B!��������4��ĸ��đ�����K�����呗wK����5�̬�Q�{����t�m^{ � p�V��8�j�xv�$<��IKH��ƍ�����(�EE�x�H� D�ѣ�����i�x��iT��s�U���d��\I��##)����{��5kP�X������s� �����iSxL//�`fm���9iK*�XC[[�8;�gr2��kT*��x�u�-��Ǝ�o����kР���駟2a���찳����E��������n'>>�K�.1d��֭ @�Z���CBB�0a������Ʉ �:u*�N�">>^� ��/�W�����5k���ח�/R�jU>��c�������hԨ���t�ܙ_~�E�*5;;�)S����OP�F �z�)N�<���_�����???��{‰'hҤ ��YXXйsg�m�vOǬ_�>����/׫W�ݻw�b� �4ib0��7����`„ 4k֌�g����K�ʅ/�����}u.��rrr27j�(^x�f̘���#���,X��IE��eٽ{7u�֥gϞx{{ӨQ#���c�Ү];�J���Ipp0����� �q�FV�\Ɉ#�<�\�7�x��C���B�$��B�m������m�Nc����7_7Z<ׂ�OU5Rt�ʯVrh�!B��R=�:B ��8�:��7kL�7sٽd7��]"�R Y׳�v���ۅ:���L*���}��~:<�8��ޣ[2�3صx��I��J֍,�쭰�lGu��� �����"28��r�I�--�P���V�MF���bP�h��x4k�ccS�J�t}�L-,h��K,5 ��@jw��>X����Ѻu��_~���u9I�kg��_��;�4|�~}jl,yYYl��s};O�V�6?��4����Ջ���� �vǎ4���bsi����~�����#F0�m[j�o��>�� B<9&z{�"9�`]���0)��իS��㗕���ӧ��� m�����MLL �o��ի3x�`7nLHH=z���^�'ؚ5k���xyyann�ȑ#�裏8s� [�l��ݝڵk��%:�����yt:+V�୷�"::����Rcn޼Ɇ �I)sss�$S�z������?�,7AؤI��g��;͇gs��9k�Z~��'"##ٵkiii���q�ܹRɹ�ݻ��X��JTT�E���{��8991�|�|�M�,YBAA� *w���P,X���]�v�^�M�6����?ޠ�lIiii����޽{�y�&����Y����\�Ν;�ǕB!�ۤŨB<����1��J�B��q#�'w�d���;g���Z���{�q��y����������_KG[�%�Z:g��aՔU�e畊S��5��ޣ]�w����ٳ|�1�d�d����L�$�d<;�d��{k�$�]kk�&K�5��ؐ�{K�8;���6@��F��;����� ���uL �D��}�J����� 8�j�7n�ݚg��ĉ�\�V��ʆ ��e �E7[{~�-#׮�+ �� �m�f\.6����հ!o��I���#+5����D;��RBT|u��y�յ�\�j���.^4RT�t:�1���>|�3gΔ��_����СC4oޜ�~� ������)mڴa���lٲ���,,,hٲ%�7o&""B_=x+�g�y� �C�q��i����c� Rj̙3g�С��Sk��Q�n]���G|||�m999�]���uj4���� �PX�p!��>!!!�������п�R��0�xk��[�:�F�a���̚5 ���pxۄ���7gϞe֬Y(�B�>}�خ��3f0u�Tz����ALL �[�&33��}��z����u,B!ēB�Bq�Nd�g�=(Y:c�rG�0.b/�|��� �u:{��5rdw�d2�<%���t˧��Ǜ _�`��V|�����'�N�:�<�e>X��������j�6twz������<��8�fn"?7�ZM�^M1k������-B��ҴgS�����IQ���]�EaCj*y���yVr�A �j��_CQ�qp�ɩ3ffw��L��c�?�����`�]�ٿj?����ҏ�n�x��28NlL,[�l�ꅫT�D�3�Z��mh[�L]C~n~����F�����q�t��� ���eV5*(D�E��ү�S�]}����Or�D� ����Z�5�ӳ��t�9��^ӝ�ϷĽ�?O�o_����ܼq�#G�L�,��sߚ��*9k$���ǹ��Pk�4�Ґ��4���� � �صd���L���́���  �������X=e�~98,�6����*��-ю46&�y���)��-k�k�.��%Ѣ �{����Ir\2�� c��IpX0���������ʭ��N��"�(�8ONfU�W��k� ��o�;=�g���-+��������7'��黊�tGQ��ɉ���{�昙�=�8������h�:t��Օ��牋��iQE�-�/^䯏>��s�q|�:NGD��o�������8��]zY�����bQ�Ɩ�$�؍�G#j��5Ē�hK�Ʈ1���QcC��`i* E���V��"X��<>��ޙ93;�����j>W�T��a� ]CC��Z�f__V�������֖&���?���O�Ν1��yp�:1�.����� ���S��i���%�W�p��5� �Y�__|�D"y�R�G�̡j��T�Q��DŽl݊��f��7�Ҳ%A�7����&&����z}� ��� V�*�cb��g�J�bYT3�Z�ΝK�=�裏�ׯNNN\�v ��]~:t`������������9:ŌI|��i>�����ք��p��>��sM��;2~�x"""4��:v숟�J�R�g�ԩSٲe ]�taȐ!4oޜ��v��Ř1cpwwg���4oޜ޽{��R�^=���ضm����$ �8q">��Ԕ3fP�f�b{P�;w�A��~�����]�v�;�I�&���B�N������ѣ���1m�4��y���{g��/˗/�aÆ���o$&&j%8۷oϊ+طo��2#� IDAT�,Y�����2�*������[o��\.׌7���� 6d۶mԩS,,Կ����ӥK>��3�����,�O?���� 6D�T�j�*lll4�͞=�>}�0`�� FժU9q���.ժU�]�vlٲ��mے������122*�a���_� ��: BA�RJ J!l|IG�������R>���������݁왿xR~�Q�#�������0-)��V����D"�Q�#.��I>������$3-S�F�� %>�;!w���E�q] ����֍[GNv�V�пW���M'5���%�R�V������Gv����D"A�R�?��!|�� Mr+, ��'����4�F4�7�����A�9JM��v��F"-<�c���� I�ٿ�r ��;'"��;������DlBt � \�����V�/��凵���e�n�:�������p>����͑�G8�Q�c(7��{��E�q��eV�V�n+@lX,�3��ץU�VE�-JX@�CQ�TZeZ��?���G5�$ qq�E�q��e���O�Fյ�UX�S�gED&n %>E�����N��pF���u �� �N��{JI�A@��֥���Kr�T٤����r�*�($}���cbR�T$X^zFF$������HOLĮn]<{�����Z����AAl1]CC���3�uyr�W��%����ק���l��Su�p�F� ��� ��� � ֮�4������`ί_�"- OO�|� u;=yH%9&��������}}�͟Obd$�VVToт��$>][�³W/��� ����9sh�_�� �z�vvfMl��9�Ҩ(���1�U�_ ��ҥ ��o����dff���F��� ̗W�޽ �K�.DFFr��1��q�133�̙3,]��ǏӬY3����ݻ��MÆ �����������7���+++�U��i���HPP�'Of���������@�4�*///�ꫯ5j)))899���~���lll���2e aaax{{�y��b�cZZ7o�,��]a�ϟO�X�p!˖-#66�ŋ3z�h��={�$>>�E�������3f ������OHHH`Ĉӯ_?<<<��@�J��?�9s����EJJ���i�y����,YB�Z�������ۚ�F�Ɏ;J�{��̌y��q��MLMMi߾=����fl�=z�{�n���;z��L&�iӦt�~t�ԩ̜9�>}�`gg���/U�V%<��������_� ��:����@̀Ƃ BA�q>S`zg:�j����>��L��� ������'ݾ�FlX,{����{H$zM�E��ux�C������ņ�'����QW���� �l�����۾�ƥ��u��e���l^���������w�7�%��ӈ6�}#�����8A]������Ѽ�VB��n���5���ħ ӑ�x�bM��OߡV�Z� ���c�����sCg OB;sM�Ѽ��$ >�W'/Nm>ſ� @�q]�ꤾ&.���{�w��m�� <4�}��i������< �ҡK5��zt��D���t�uy��-궫�������E$ ~�kc�M���H�,,101 -)���!Yy�o6����O��=���택��'��a�Ct�t���� ��w��>]@u���ٻ�m䄝 c۷�P�T87pf��C�^z��Q���.� ���-���j�˪OWq��=�}���O��f�Ճ�^�z�����d<� �q�G.W�/4����o������g9�������ϐ�� �-������O��������ԐKp7��Xy�]'��g5{�l2�3�+�$%%=��׷o����� ��Օ�ժ��͔��$��N��v+$�X ]��[��/Ɔ�(U�V%V�¸S'���3-k���H� ������[R����H�����p���5��ƒ���*���g���DEE���@dd�3/�u2}�t֮]˝;w*-�ǏӵkW"""8r�NNN�KyX�|9_~�%����<��Z�+A��[PP��A(�P?F���?�H��!�@�潡�!]�w�vu���w�V��p��G,?�� �Gя�����ٛ��o~�&n�n��k��iIi��T&�g����X�[y9�3����[��Ѽ�ֺ$ ��u��N=ވ��_$'[}��Þ��7ԥ��_p��ع�Ѻk�w��I�� ë�)q)��f��1�3', �KG.�y��qo�w7uI����r�T*�Άi�x�v���4a��x��� �e�E�=���jڽ��{q�v�a�C��� ��GK�΅i�� ���aK ,���{�d� �-�I���4M/@x�dpn�͢�T���t��:z�_g L 8��)�|nM��zO��}��7 �LzJ:��yx�!v��V²i�����m>l�I� ���Re�P�`���,��T��R���p��ۜJNfm�Zȋ)1V��IN>�B���YYq@ff-15m�TZ1�MA�Y��V�U���%�EF2��N�Tz͙���o�>,X�ѣG�����"55��7o��w����_�� � �� �A�(bĮ�%� b� G���2�[�E��$�^��G1� m��ߣ�G�%�iz����P�K�Lca˴��D��ɍ{�'�b�� `�d�I�J~��y]������5�yyc�5�ռN�^`�����نB�i�h�LG� S�T\9~�l��)y�kX0E����[˙mg��GfZf�;i�iO��$�V{=�'�3R� �G�%3*���I���V�:%>�{����p(S�����Y��z����`���'�o�z<9V$�ֱ���M�2��]�D"�:�.;9.��Y^(s""�?}���n�P�]��.����:�+��ϴ.�RAR������JB_ߙ��{��`e�ff-ErPAxi�66����֐*�Rj*'�����e����bjjZ俔��?�W�+_�����8q�K�3f o���[�f�ر�� � ω�A(�P��Y�(��x�Ԟ~�9P��� ��O:��3wB�u�V2�2����1�2��� �'c��i[���z�4006 #5��l���� �����} Q d�fj���ף5�YT-8Ι�E��S�6r��ڥ�r{*�U��Wa���]gBT�tz��y��Eh/�Iqn��� ��W�_����K��D"-x�"w�Ri�x"�F������g���s�]��걫����]\���L�����ے�F�U�2�s���Ԑ�u���?W4�\���e�c%��s�ɱ�R�����v�rC�4E�B�:<��X'�Q�TD߈��B�{\˫ȋ��a��G�JU���zL��4 dm�Z��)8�eI���IJ�����驓��B.o�����P�8��U$��:��� ���i:���Hژ�>�K�O>��?,�s� ����M�ƴi�*;�Wš5kX�fMe�!� �s����A�X�2�^M� #J [ ��w_Ujhe"ӕ���N���4�,>@ZR.�Oza]=~���ϒ�HZR�W"9��0k>_��Ͻ�������t�����ߋ����:�ۻJ�Trp�AE?���+�� % nM & �T�I�;/�F �v�#�a2��{��ajeJ�*�m�Qr���$�&z T��f^��� ]}u�ذX�L�BlX,�t��aٰe(���_C�'�,=� ����f�������Ip� �@(��8�1����y/[��Z`��IQ=C=:}�I�>`GG~;B\Dيlc5�oU��n+�kcWM���[� &�AGV�$#�U�TqQ��M��ag����S� (�;�+���%�f '7��L���E5�Ύ#��X����X��T���ƅ���T�� �JEZ�u��v����� �����$cn� ��ErPAxi�63����� �l௸8"22����aaa���k��^�^z� � ³=A��M�VrB H���G���������Fm\<]�r��� �Y��~�.�|����Q�T�_�����k�g�d�y������ţ�GĆŲ��m�� L xc��������1��HW�7���A�v��w< �?X3[3Z�i���O�T*ٷp��C"�`bi���E�\��R��>�}�}��(�Jv�+P�|�-�������%=�z�g�?z̕�W �-� ���Z�*���E|d< �/�G��U3�ɸj��ѺkNl���x���5 gO���L�$`W����Vdk��-JfZ&k�X�5��Ԑ�Cۗ:����ܜ�����|�3��E>���GFr69����a��WDkP*3HN %%���jdf�EO�����/~UA�#�H���D�˗��ˢ���Zp�gAAAxш� B��҉Y��6��&y� �7�� a�wR�迠O��Va���G�� �� �i��4���Z���$�< 16]]��r��;Q�M-������Z5����r��u�<"3-S+S\?�Rť ������q)�G1��7�Ǫ��ݼ�ӶN���Iu�K���H�����-m>l�壗 9R�������ڻy�1p�@��:�����t���OCE=��_guR0/�VT��Ω?Oy)���xRS167��Kj�����g���U�r��et�t�ѬM�5a��ϼ��� �/b9>�[7N�y���8�&c`l��F��� u��-y�@�m��f}N�q��w��@fZ&&�&ȫ�qi�G+��Y��m�ũ��&��G��ٚa�aO�Am��3���a���'�KG/alaL�vu1�2a���������#���02gP�N5���L�M���ESU_�<=�|�6s##�Pt�Y�IN�A@իG+��cD*�IJ����[��9�Re����Q]��Z��S���B�Q*���MNt4�N�,yA�J� YY(u^��ݬ�q10�n��9���(�:;c(�=� � � �$�*00//�ʎE�re�l~�����k�"�i8�.��d�����dR�*<7�t�W#qi�T&%[�ͽ�����f2�2����d�'�۽�c�����5�_G"�0����پ< ��cf���\)'))����>d�իd*��U� %E� ��5j0���D�J�$-�*II���IA_� �"�D��iSLM=�H^���;+++���Q�J��G�H>D�P`inN|||e����hF߸Q���<<��jէZ���#QQQ888��A � <'�|%��r =A �v#��?��J�#�ހ�.��'?{�\i!  -)����#�J1�0&51e��K�D"�g��H���2.�ˢg�*�76�ۥK�HK���s�z�&�)),vs@�8�ǏC��L��s #�.��U13k���SEm�P����Tbnd���++;A�"��׏�� �y�3�֖)�o�(���Խ�6A(� � E$A >3�L�*�I@���� GyVC��r�?(���� �j@�H'�ӹ��>y��(%p�M��)Х�s�(T�O�^�a/���Wvϝ�L��ڵimnΧ7o�R� ���CunS��$gf�e���F�j$�ܼ&& �H��K� «�c{{��{Wk� X{�>�]] �GAA^/�#x� �,bV��6P>��,�Z�#�OA^]�_{{N5j���yS}F��E^�@��X`��`FT*s�15m$����!C�о}�������cǐJ�DDDT�z��#�{�ݽ{�T����_�����boX/X����XΟ?�ܹs����cǎ���>s��X��*�J���AWW�\�[�:��㤯�5MG"auLL%E���{�`ccS�Ѩ�T*����^^^lݺ�R�+���)���F���̬�A�X"A(��̨Lb���=x�5�W�9WO ��Z��J )�}�o1¡&i��@, Xr���� e�"�*�lr2�����Ry� �j�ƍx{{cff��� ����M/�JŶm�hܸ1���L�2��<7�8p ...��rz��Ŷm۴�-��4N�>M׮]�R� ={��رcZ����0}�t�O�N�5�_�>�/&##C�݁hժ�������iӦ��Q��In�ݻw3`����x���ٱc��|�?f�С���P�V-�Ν[����ٳ���i�&M���` X�v-�N\͟?� `ee����9z���:�m�F�nݰ����ʊ�m��T��8�=I�^�Jǎ�R� C� !88X��T*��_e����������?�P��s���{�agg���-�G�����j�����ѣ�j� Ξ=�)���ФILLL���)q��F&���tuu���.t������_9r$իW/6Q��3���JǎY�d +W�d����ܹ����w�^6l���%��w�gjj �СC�J��d�SN�e/1 �H��u�%[�⯸8�1U��� 2'''�r9���}�^�z����o��� ���a������E�z�_2sӦM�h�KKKjժ���ӹu��<��y�ҥԭ[777f͚Ebb"[�neذa��^̹���3g�|� ���v3f����ww��;a��ԩS���}�6���ԬYcccj׮͆ 4�gdd0u�T�֭���1���|��W��.\���r��ƍ3g���[ S���p�B�ׯ���Y��A��&�� �����ރ�>R��#�~/��� A�R��F|�nRS�a`�L#c}fV3�n�Ӝ8�:o�@��eP�߯���r7w�\F�A�ƍ9x� G��m۶(� e�ҥ̘1�_���۷3m�4�癙�ԩS��۷s��yڷoϰaôJ��>|8m۶���ӥKyz�J$�,Y½{�ذa�|� �&Mb���6;v�gϞt�ޝcǎ1x�`�O����_����>��ݝ���ӠAz�衕t7nd�ԩ,]��={��{�n���J��Y�f|������FJJ }���o߾ <�/���_~���?��'NШQ#�t�I&$$0d�ڴiéS�8q�fޢ��`~ڤ͐!C�۷/�w������۷@�����T�Ν;�޽;ӦM�?�(q���s��#Gؿ?����mۖ���Y<`���1��/R�n]$ !!!,^��)S�p��,--K\�o����;�����:~��W:w�}��qi 8777����"##�ҥ 5k���ߟV�ZH�ܹsx�K1�fzDD&&&����/�W񁻡vvH�mW�J����:nj�J�b���3c� ���4��l�2.K&<\ IDAT^���ѣY�t)~~~�3m�4���ؽ{7M�6e�С��ߟ��x6n܈������JnK$v��������_���c߾}�7���Q�y��ܼy�E�1c� ,X�� �| 8��ݻL�J�65jԈm۶@ll����i�3C� )s�M�B�ƍi׮���>�ӧqqq�ٳ����/�����W_}E@@�-"88��]��gϞ=:t�%K���w߱p�B�.] @׮]������%66� h��cuܸq8::j�M�0��#Gr��]���o��]�f #G�,r[���+���Y�f �/_���⿒��{���~�O�>��R�ړ�BT*?��#���L�6�]�v1|��b�_i�����7o�.SA*�Ne ��"P�W�,Z�� @�D�7ܐ�����+>8A� �Tf��r��� $ ����LfLm�Nlp�ɀ���OH(r9@�Jŀ�W NIa��:�� �W�B�`�ԩ��ߟ_~�E3�^�zZ풒�X�n\�r�� j>���e��ɚ�5k���͛l߾�޽{k-��?��`�3g6l�����曀�����%+W�� �]�v�w�^��W��4i�}��Ǐ�A��T*�M���{�Y���[L�>����b� �������Q*��ڵ�3f���иq�7wK�q�8z�(}������LƲe����bɒ%������oP�N._�̆ h߾=.\ ;;�aÆaii�iScccjժ��l(��c�j��3fЬY3��´z�����|�r������`ǎ��ׯ�e��~o۶-m۶ռoԨdǎZ7�����駟�z �T*�1���Z�e���2w�\�O��L&#**�}���{��w�3�]�6W�^-��]�vaggǖ-[hѢ���Z�/�TQ?��K1���.\(u,...����F��ek��G7++v�ő��o���>��ozz:������ѤI��ܴ��MV�^ƌÒ%K��yyyi[�g�fժU���r��e@�3�x�b8���R�T����s�N���i߾=2���3gj]/J���~bb"'O���ߟ��z P_Cj׮]�u�����m���6�d2MҩJ�*Z���^g��� �1W��7o���C�= ��K�.����3^�����ѠA����~�:��{V(l޼===N�<�޽{�2e zzz�������bll�L&�jgddD�N�X�|9;v`������� ˙3g�0a-[���\��˺u�0`�fz�f�4�ǎ�y]�zu���h޼9��ɚ�y����m۶ahhXd�� ��=A�{s��)�{p�h��ЫJ�W�igA�������#9�4::��蘓�q G���`l\s]=vկ�4ggJ:3΋��'4���XfMx>nܸAzz:�z�*�]�F�4�AP�l����*��z�j���+���������XVާ�mllptt�ܹs�i��.]�h�����ٳgHMM�ƍ����Z��F�ɝ;w )�N(F�Xe2 6��q��Y�߿�Iځ:�Ҽys���ĺn�:�ݻǎ;ؼy�&qJNN={��ZƆ 4=_ڶmK˖-qqq�w�����%�����͕+W4��g�7^^^Z�#��o|||ؿ�������Nj���Ot��[[[LMM�|�r�c��ؘ7�x�@ 5j��J�v�C� !!!A����~��ёw�y��m~VJ���14w�ܩI�����)ղe2���%�{�rp�J���Ǐ�ZL�ͧehh����?z��I���� �=z�(�~�)�����r �)���{ァymee�����4�DB��� �j޼9�y����!66���zI�;��۷�L��s�������}���J{m��Y�3��=�*s���M���a�7n���G�v������ݝ������[oi���}�-�F�b�Ν�����+�{�.v�‰'2q�D�7o�̙3�~� AOO���}�?~<͛7��̌6mڠP(8|�p��v�i�F$A����A(�k/+.��EQz��@��~9@�Bʹ�e��c��=�0A��2C �t�P�T��]#9�����뻒��R����7rySd�'=�� ӫW��Ԕ�W���T�?�>Y6�Ob"�ΟǿA���/��>��|`��d���'N0|�pfϞ����qqqa�ʕ��9���}�LV aT\�ܞG~~~��D+�2���J�%���[μ,�������#$ �oߦaÆ���ر�Ȳu���������l�´i�����9s�V���dbb�y��x(Nq���z��hJ�}���L�4 [[[>��c?~�������6�M��e���ۗ+VеkWV�\���o�����]�F�6m��\"��j�&""�:u�{��H$$''?��_&���q10�n�1Qe������9$I���;F����֭[���cݺu��у��z��AϞ=��o�Q�7nܠ{�������M��s���L~�9���4�Z�����\���� �H���a۶m���ܽ{7 �B�/�����R�T��Q�F���Ř1c�����ؘ&M�h��H$�~?%�s����V�^M�n���8y�d��5�~���y�f�o��̙3�����OK��E�T��P�N&L�������x{{�G��Y��U��AA^T"A(�k���{(� �5?�&H�A��::4+�ԈJ��1J�9��J��%�PY�*�$�R�����Fr�9RSC�H���w&33S,,��ȨI�=O�Z[ؤ �/^�Nzz�I� *3��@6֮M�*��_(�XjԨ���1[�ly�N+V���7�`„ �i'N�x.=�MMMqww�رcL�2�ض����k֬666LJJJ����G����c��v���>��9�+VKݺu5�C�caa���/���L�2����kz�* v����� �w��1���8t���U��?6l~广A�E"�� �ֲe�sd�ރ�{���: ݭ�������� �j�c��iA^4G��s�$z����̌!)�_22�J�"#���n���FO��x2�yظ1�^ew��O��~j����|���t��t� MOO�3f��燮�.C���ȈÇ���[�Z�۷g̘1lݺV�^͍7J�$���3w�\z���G}D�~�prr�ڵk���kƼ+���B�Ri�)�J�ڵ+�|� ���ԪU��3g"�˵�[R�*��A������ٳ��d���?��׏'NP�Z5Ǝ˼y�HII�W�^��������M �V�Zѹsg���Kn߾M�޽INN&88�Q�FѤI������9r$ǎc͚5֓w��s � ‹D$Ax�E-�R���'��կ�U�"ˋ���J������!��9H����*����$'�A�L�����Jerys�ro�R�R/_��Îz��.<�iw�"A]Z4��i߆�����u� /co!�b}��X[[�`�6l؀��1�Z�b̘1�����n����p��u&M�Dvv6�;wf�̙J+������ޥK:�7�|C��������͍�ݻ9OI�&�y��P(�6m�1'''���K�9s8}�4�����u7n���???f͚Ŝ9s�Y�&˗/g���P�^=F� ���% .���'++�֭[�lٲbiiiܼy���e�WE���o9}�4]�v��Ȉ�S�j�닍��v�DKy���S�2s�L��郝����T�ZU�Mq�va�K��\�1�G�.�\`a:u�Y�D"�Q�FH$�=�56�������ժU��ÃC�:�b^����ڵ�)S���{�����ʕ+ �J?~}����ʏ?�������k�ʕ̟?��;R�N�͛��&w���YZZ2k�,V�\��ѣ4h�V�*0oÆ �0a�&M�ҥKL�>��S��r���>{��aРA�� �裏����N�:���L�8Q�f˖-|��7lڴ�ٳgckk�Y�\.g���,]��v��ѨQ#6l�@�z����g�_� �����@��� ����lN;�&'�����?���@)���V�0��̼�V�J�J�q�N���]� %�������c'�p�� ��ϐ�z����J��cf�CC�g���'>�~�/;.!�o�V74dO��x�{[x��������\ʴ BYI�R֬YS��WՔ)Sغu+7nܨ�P^x/��jeL ï_ךV�Ȉ+�(���lo����^�:�V���u߸q�Z�j�t�� ��Eu��):u�D�>}���_+;�gֲeK�ԩSb�O��񲜯A��Q�`2� ����1�<.����6�� �(49(��rR����!��9 �ꓙy��XYu�o��g{򹳕AM��jhHqg��Nz:�ϟgo1�IA^III���5��~Dvv<��ͱ�z=��;���o\��VVŶ�ҔJ:_�Ȭ�p1n�P�rrr011��Դ��'O���WH�n�x���6l=z���p���BW�w,-������*+�rW����ә8q" 4`޼y��ٓK�.!�˹}�v���_~��Bb�, 6dڴixzzVv(O��֖y��x�b+;AAx��_Ax-=��E����N�@3v�J��]YF�څ������~���V�n?�T��H$����ӧ�R��(?�n�g�޴;��c������ȸ���%ryG ݟ�M>S�׫Ǭ���s(~\�)w�����ڵ1=�� "�ɸp�B�����U`4�e~�x�;v��C*ȇ�����;^ l~��/��*/�rt��� [W�^��իW��999{�.b,y���^A�E �� �vT*?D<��%�S�u�l$@K�k]݊��,,*m��&&ej/j�����0 �07]��{�L*��3�LL�{� 99d����8���~}�>��!���ke� �+���R)y��������A%F�j����pAA��$J� ���I:�Djhj��X��!�Z���`�r./��T'@�֭���G��3g���ʽ� 6 �O���Q�=sFk��[��؂���G��;Gȶm�pue��+�g��i�dV�z�Ԥ  ";3�#��G���+u���u���7���_,��!1*�,�Ė�L���T9��xbi��sO����A��8.����F���9��XQ� � B�2���fe�5�VfTAAx��� ����" ?�I!t�!���*�n�\�&����4 �f��v-���l>�œ��y���1>ռ��׹3�ϝc��s8zyw���O�A����g������Qk=3\]5��2n���9sH�����~b����L���%نnތ�jUZ���M^�j��'B��Ju��h�LfT��ad��ƍ�Z¹5H���͐V��TLp� �P���ڒ�gl]����� HAA�%FAx��]O#�?���p��2�7�= q���v��u���=e v� ��9\[�.��@.G������yn�GcleE�.]��W*ծvm�y�]]1��,{�ynvD��㏩ָ1�y�747G*��gl�� �C"�C"��_Mut�V�.�#"���q s�~�:��Ҙ��L�+A^">����d��������d���|A�1AA^�� ��{?ߣ��v�zqT�19���,�����<�|S����yժD���i}��yC33�6k�__|��#G �0��a�,�r�k9r$�f����9�x1)��?��Ax�I$&;;�_�>&2�V����t��/]��7XA�e�/�ҫJ�� 8"Jh � � /� ᵑ�E�Xu���T�g���Y�_^@���2;[kZfjj�m�ML��JQ��渾� ������_0����ϏE�ۣHK+[�%�0���:�g�^��=��v�8�vm��C�WϻVV5i�{ �썏�EP��8�� � T�.VVZeFu$&Q�DAA*�H ��ڈZ�*��|�N��]S�y����.MLM�=�� ��|Yk��C�4c > }��� �̹iS|����������y}��R443�ɇ2p�z�ƙ�+K� �7wCC7��R�Kx-5���9��R1� � �3z��B�a�J�||�*�� � �� �� ��J"�|2�U^��T�] �d�T�H$���F�ƺ�Ѯo����ˉ�x�C�σ��Ku� ���]Z�$28�ثWIKH@��M������W��0,����A"�z���w�ȹu�J^w��{�HMe�ԩ�9}�G�9u��cǨѮ��i��-�{�4q�n��� n����D&cKݺLsv.�]6���E� �>|X1� � �30�ѡ��y���V(� � � �L$Ax-��x���B?ӱ��������U��R^�Z��t�=�����Ljded�~ܸ= �QXR���G��-�4|8s������9![����Xӯ1�.�}�<�U�j拿s���A�H$Z=��萑�̮/�d���f�ƵU+ڎ�i�կ�ά�׏9��$GG���Ax�H$�W���:uГH�,9�(T*z_�̬�p���P� B���+; A^"����=��`^a��,� �P6:�� ��R���1���Pm\5f%ǣ#���Ra(������"�Jiԧ���њ޸_?�k��͙z�V�yǞ8Q�{S[[���c��j��Ӵ۷K�{�MZ����济�>=~�����ԨA� J\� B����Eegk�۔+wʔ;w���� ���7�Œ�����~e�!� ������i�K� �qp���^c��,� ��&����K؟@���K�H �Te϶�8�U*d���C�y] IDAT7�A*��\Np�&�52*�Ս���>$���� ��u��#c۶m4n�GGG�L�BLL��Mbb"����\N�^�ضm��Oz�;v �T�ɓ'y��w����C�������ȇ~HժU�ٳ'Z1$''3f����qtt��/��ڵk�e{333�Y '&�s�8�>,��^@���,X��3f�h�"�6m�vjj*���' ��ǏӦM�ΦM�r�5j�(�t��֭[IOO�o߾ 8���/�j5}�ʹW�T�mۖ+W�0{�l�n�JJJ �5�a?��ׯ�T*Y�|y����ߟ���/�����ϳn�:�ׯ���~K߾}iѢQQQDEEicU(̛7�k׮�|�r��.�xq�Q���R�'��MJ*t��?K�,�B�$Ũ�\KO&~����JNc��56C ��q��vv%�B�\���ݝׯ�7r-�"SSiB��;�I?^�X�b���ᅅ����?k�;880a���u�N@@}��ѩk����=��?��޽{Ӿ}{��S�L�Q�F���S�N֯_ϥK�عs'�{yy�k�.x뭷��ldd������:�#G�дiS:>N����L���������###*W��s�F���ҒիW�=!ċ�KŊ̉�о6����M���Y�g!�B�g%3��ڝ�w��t�0��Ƭ�{� 2�y�Ɔ FF%�B��( f����~}� r)��U*:�>ͯ��%� �aÆڛ����DFFr��m��e˖��[o��ꊕ��-b۶m9��ܹ��{OO�\�e�� !99��������ښ�W��q��\cvtt$,,��ݻ�\G�Ɂ�]�6�1�N���q ��N�:�-!ċ�̳-c�����^韟N�g!�B�d�PQn�S��^r;3�ܓTP���y�������=��K.@!��ֿre6lH#�\S`���G��dh4%a�fee���� s�6k �0b�4h��ŋ9y�$cǎ���y֕U��mYu�T**U�ĩS� �~]�p�_���2S�f͸y�&�~�-111�nݚ~���QdK�]���B���RI';;�]N&%��R�^韥B!�xV2@(�(�bbP%�����V6X�[�)6V�!]t�����jbm��F��ga��7��"#�r�4��ob��d�Z�j����i߾=�k�����ި-�޽Ktt4���:_U�V-��s222�w�ެZ�� 6�~�znݺ��� ����Ү�|�`g��� 8^��E�g!�B� B�[��Df� }��>r`�ݻd !����ljZb� !�(8'{{��)th�����4$��))%� �M�6=z� 6p��qF�ͥK���,����ӸqcF���9s�x�"G���o�% ��"##qssc���joҤIlڴ��/r��q�-[���իW�m۶�9s��G�KZZ@����|kmkK���8��X�mJ�,��B!Dnd�PQ.=<���C��糠qUc*u�DDj*�?aj����B�\�00`��;�j�ȳ� ON���q'$�Lp�B��;�$������_лwo _�u��V�>J��}�����ǢE����W�^;v �\�KOO�ҥK$�滙�S�N�Q�F��� �����۷o�СCy뭷�\�2k׮��y!�KffT0�/Q�8T��O�?K�,�BQ @s�� ���K;!�(2��� ��0���]p���T�.\��:��M3k��S�jU�4,��7eJD.��c֗_�p�6�(ܹs���)2�GG3���M�.?�0P(�wsc��CI�Wf999���#��B䪼�W�ΞeKl�����!�-[j���� !�/鯄��"3��*YEԲ������@A���a쎋Ӯ?h�T��ʪ�,׏a��+ ��%�� ���Z�mf�y�8�Pj헴'�7𧟘�ꫥ�%k��A bkh�a.3�@�Fà��~횤BQj|mmu�!�������B!��@����uwQ=�3:h�T����Fî�8Tdv������X�ѵ+ゃK7��g��|[��.���g���ߟ-��GTB��f�ք4j�Kff�?r3�� ����H��|C!����zbB(�u�B!��G��N��\f̩��C'�>|H\F�v�kvv%� ����J�J7�B�Ҩը��~dQ���͙G�b267ǼB�R F��Q�Ԕ#>>�U��Բbbhu��ii%�B�-,�2��q#�B�B!D�0|z!�x~$�L�Aȃ�;`�m�U��4�{��GIf�95��ֶD�r�,��K�����G�=p�WO[f�q$DF�x�`.X���X<{��ɐ!XU� @Jb";�O�Fp0����xt��k��4̽k��z��_}Edh(FF87mJ�ɓ���ז��g��#�w�P�ۛ�#G�?`C׬��iSN�YC���D�<���)U�ק��%��pj��|�Ӯ^-P�3\]�:s&���sa�^��4Ϟ=�k����=��ٳ�=�;g�P�S'^�ޝ�i����7�����{�l�;�[+W�v- ��� ȡ%K�{�"� &&�:�<Ȫ!C���urҶsi�~֍�؃�rp l�Np��1 ��֥�ܹXW��ׯQ����H����/�p��!�_Ǫre D�w������Fp07��9�q#���D�獥��<<�|��ܼ�k95p*)��'N��ӓ���%�B��R���� ;��)��ǗvXB!��$3����E�ћ_N��V׾��M�cgh���E�ė����|�����{�<%$�߿��jQ��s|�*|ǎ���_s~�N�����HM�R���[��w�l�f�f����ߵ+׶�*��������f�ڄ ܽx�uァ-���#��]�A˖Q�LJ?��B;@{� ;�O�A��ܶ��V��N�v����:��=cc�/Z�[�Nl?����_��R>��Ϗ!��� L,,��ߟ11:�޻Ǟ�3��ߟQ;wR�n] Qaa�X����{;v`fk��:]_y;ggN�[��Ɖ��n۶X98�(>�-��S�qc�޸�a��g�^:�z�B��<�t)7���4u*������c]5sΞs�P���.]̸�`��� ՞�M�P0�Օnn*����n����� %$�d�B!^p�Od{8��!%��B!�(a2�PQnd$e�"�|�6�`�}��Yr)j5A��h�K|�B��U���C������\ڿ���Q�U+��Ԥ$ޘ=[;�,��e�����-��y������Օ��׹�k�~~z۾L����޻3���aQ�.$ܾ�M�j\ڷ+zϛ�SÆ�=|��� ��D�<�EŊxt튁�U����:�8���a�$�zx�a၁T��)��ˮfӦ�mF\Uww�8��={h4p�v{zJ �M��K��m����$z̞M�5 T�ϠA^���cǢ40 1*����À�K��puF ����� V�:utb��Y+��.m�D�<�K��4o�3����## MMK?-�E�*U�efF�3gHT��ГX$�T�9u�����#�lj!������A���8��D��j"�B!������.�G�;����#J��y$�H}|�X�/�����9�����ٳ���IOI!|�~��*��:i&����ERt�v�����\?|��Ǐ��:#��;}¶o����vp�J����.�o���\ڷז-u�si�Rg0�^�N��7f7mJ__ܻt�N�6����,/�o�󺪇��N��e���ȉ�k�Ldh(����F���:����87i����5k� �N�޽�?k�������Y��*U�ݺ5�M�R�LJ�^}�ڭZQ�S'�u�t�j��s*��Ç�e�8.�R�vx��]͚��W��A B5��ӧ������mz�^��1�NF;:�t�B!^0 ��0U*IQg~vQ'<�B!�BQ�$Ũ�ܸ��v����WM�����1�6�ն?���㏜ݺϞ=����m۰sv&-9Y���)O��yS�Ri�f�_P�͍�3g2�h6|8i�ڶB�@�g ��v��(������%���A�� 1�P�m�'3�M�琭��֩���J��R��>4��/��˗sd�R�:v��…�ܶ �ƍsc^���������:�ll��҅��k�h4������׹�W�fغuTtq!p��hA|DD���,�^{�O���;���Ν���7Eچe���)G��y�bEr�+�y�5&<�ϯ\A�K_)�BC�oKK�k�B��<�� !�BQd�PQ.$�'��ă�; ���0q2�n��M5�hl���Y�Ę��™-[h1r$ z����4�]�V�B֮ŹIZ��n�zw5kr�ر���ٳ'�-��)[�UZ�9����Q��)DYbeh�f>�����o�b`X�j=3҅B�"�������34N&%�rDB!��E#)F�����w3yx�~� ������{��>�H4T(�T��E�LMq������T�U��۷9�������A���lޜ�S��};�NN�ڰ�{׮�:C2��3�P�5#F����ā pj��j���v��9c?��&C�p�������Y�4�yzb`d��={@�Юq���ԙ�z�j6mJ����lڔ��4���Fff���R���nn���K^j��l�]س��[��Ѹ1&����GOO֏Þo����y�];�k��5׳=_u>�3`��t| ��nfcå}�X=lK�x� �w���W�3#��&bb t���ˮ�����;��ĉTru�Ӵi�}�;�ҢkF���F��u�D�� ����zww��\���\��ى�JI)��ӧO��ť����ח�ÇI]C��M�6ER�B�%{�Q����E�?G�g!�B�_ @s�� ���K;!�x&�G i�'e�j|^י��M�^�Ȳ�(m�Ѩ-px<��YT�Z�(� ??�M�����e����CK��yh(���e�βj�?�c��_ڡ�ܬ/���mTQ(�s�Ni�S�'$����22P�R�P���А=��4x�F����ɉ��H�x��O�O�Ί+�z�j1DW0���`��:�y���g��᨟H%����J�¶�'.j�������lٲ�E�"Q������h� "-۬������Y�g!� �B�EHH��B<��VE��ë�*C�h_j4�߻�|�ܼP�����Kqn�C���EȺux��Y���⨳�KIL��ŋ/_��f�v8B�'4��!�ۛ�Os+%E� a�Fý�t������/����.���%!55�"�Y\���ϻ��'�(� �<^��8��a��-���M�g!�B�I1*�x����D���98���V���o�JJ �ii@��r�W���p־�.����݋���7�}�U����[�9��}�P�S��G�Gss������M� x�V�14��QQ%^����θq�ptt��Ņ�?�<���cǎѾ}{*U�D˖-Y�d III��W�^��ޣnݺXXXP�^=V�Z�ݟ���ԩSqww���ggg&M���_�fM�O���ɓ�[�.��S2���2l�0m��4t+W����;;;z���ݻwذa�6�R�D�Tj_�Ka���VVVxxx��?��|�:f�ƍ�������ĉ�m�nll,�1 4��ܜZ�j1��(]�t!((��˗k�-((H{��/fԨQ���Э[�b�O�M��1|�^�y�=�>4P���:��޿��W��Y�y���:˺�kזvB�|�76�//�?���X�͹А9P8��"RS��F�k��g�f���~cܸq�iӆY�f�33������+L�0������fΜ���Y�|9�&M">>�U��ŋ�����ѧON�8�ȑ#�ׯ �}:�������r���,X��3f�P(���O���e��Ź^���@ڶmK`` �Z����c���1w�\\]]�~���f��ի�ܹ35j�`�ܹT��~g�����ӇM�6a^�g� �hhi��n��l����Y�g!�B�B!�s-jeT�\�'�U�(�ܷ�ζ�qq(ɼɫZ?��W!�(:flpwg��+����S&^�ƍ��׭���Q�mڴ�Q�Fig����Sf�����Ջ�ӧ���C�J�x���Y�h���9r����ӢE s�I���m�6V�X��o���޴iS���KKKV�^�ԘX�ju���bŊ��ٓ��$�������r��9��>��?���Ϗ���ШQ#���Y�n�� 脄V�X���#aaa����y�haa���[�o9r�v��ig�8;;k����`ll�����ssss�_~)P{B����D�̫�Q%���H�,��B!DaH�Q!�s+#1��ͱ9Q�}/{ m�{B�Ѱ��}m&҆����3B!2) f׮��ڵQy �-�s�7Μ�J�ʅ���۷9q�:t��ޡC��!!!lڴ +++�W�N�x��!;w���>��>�Y�f|���ܾ}[{��S�066�3��B��S>S6רQC{�2��)�Jv�ؑ�����غu+~~~:�;w�LPP111�m 6��|���&22R��Ըqc���hԨQ�c;v,K�,�A�L�4�˗/����_�@m !�����^���|�(����B!��%wDžϭ��1h��|�VC���E�'%���F��BAG;�� D�Fǝ����S!��:.�j00xz�؇NN�05���sdh49���̔�;��h}�$�4���qI�Y�4O��V�� 6�q���(�5SbԨQ��ߟu����_�w�}�|��o�$���d�VO�2x�w�=E_Q�޽;���lذ�M�6�����ѣ����zl~���d�*��57�|r�v[F!�/韥B!��/ B<���G�]T0��ض�M���} �|*�(�T��X�O�v�Y�]�S$u !Dq��~���t�v/FZ��x�R%�iؐ�O�&I��{�V �z��&'N��ˋ���H*O�U�����w����ȼ��g�,,,�弽�ٻw/ ,ȳ� *��{���{�1q�D�̙�|���iiilٲ���z��qߺu�K�.ig��V��34�Rإ��bbb��ccc�v��_���o��ݾm�6Z�n���}��|V��� <����x�b>��c���+������&9�`��l{�‚��ɨ!��J>Ф��Y!���d�P�\J�H%!(!�� J��vUJ���ⴳ@� �?��YXJ�� ^Q��n�w�~�B���W����5��昏��� IDAT�r3%E�LB��J�'�٠M��KY��o0k�,���hݺ5s��!##Cg�Ʒ�~K�f��ӧ� ��Ã˗/�q�F�̙�B���>�w��8;;s��uv�ء�!ܲeK�t����իW�ӧ����y�?���V�RI�Y�ƏϽ{��?>���+���c̘1�\�R[��ۛcǎ1i�$F�ERR5jԠcǎ����V��������&**����Ӿ}{>��3m�ׯ���k֬��o�������k���N�P�����Űa���/�����חE�i������7���o�����3x�`����/G]~~~�������������̴i�x�w�l?�x�$''ΣG��,��رc����f͚�mۖ�c�j���Ӈ��P�v�JDD����jժ�m!JF]33��`�F����?K�,�BQ @s�� ���K;!�ȷ㍎���ݍ �nn�������{��;s�L��?&:;IU�VE���)�I�BQ���%�nCQE��;wJ;��J�Z͛aal��͵L֭�_��a�s��������8::Q����C�r�� �����EQ�sp$1��!!��}����)��+���Ky�� AY�A!DA��N�98���ê�ؼ��} ?%��"[�<����u�+Go�ns��J@h@��r��\g��Y�mFq���O�07p��u��|��<�B��R���srʵ�������L�ruf�!�xq�yb [})��B!�(�bT�ܹ��=�;�P�G��n;��Ӧ��P*�y���(��q�X�ȵ+mO�JZ�1JE���q��ʬ7f�ӳgq�'D��T(��vmj���Ax8�s�,�޺ŭ�T���a����JZn)��,�hd������C���韅B!� B� T�[9G�}��g/B�RN/:n�8""�3�%��p��E�> ��̖�A�����G tv�Lo��4��@{lbJ"���́���x�*�U�d(C� :)��v}ű���Pe����䎓�iW�L�jn+�[��s[9z�(m�囮��w��|��{�$���ѓQ����� W~����z��.{{�`˙-��0�g���cbh�=n�?�Xwr� ��m�{w&o���iW�e�޻�w{��t�iS�U�;L�Y�f�2щ�L�>��'i�܄!M����?�φS�w��k�գ+o��������O�?���Ѝ�~c6������o�ٽ3C� ť�����1��=���ӳAOzz���&���X�?���̝3X�XѴfS~��s����W����ܝs,;�������H� ՙ��^��*�3��e<㷌G�Ppe�B�/ċ�[�JhؐN�O����w�P슋�}h(�4��P�v !�Я��9'��$��B!�(Q��H�\���&C��Jo��v0!A;cP���-���%,*��+x������l�l�`��z���cY=d5���Xڃ[�o���`���|�>�1j�v�+��R~���].�\f�k�����?�g����Ŧ혆��#����W��N�F��kEW�o��Ѩz#�o�7��3 +���N������ƃ�~���<�S[& 4��ţ ��-B����Q�����-�F��x�x� v����Vcr����/h�ܔ�o.��ȌkF��J���h4|��lo;���}����/r�����������d�z��t�i�n���� �ݗtG�Q�m�o��Ǐ\�w�����^7���A�z�W�n�6�F�b逥�8��\��l<�1�:�Q((��zN�> ~��+����}?���43�����i��9��Q�u !����5�}|�ijJn��@pb"������K)!�/������?.C�N�B!D�&�2 !�+1�b2mP�n�y�c���2����+��[X�@�yKJIbv��ԨP��'�i?;F���}^���7��|z3����g�r>�<놭�q���3�3�u�gn�a�{ۨ�P��N i<�1�n��sm��j6����k_�<�{K{~�� �սIJKb顥y��F���̆�}���{/�%0<��/w`�Žt�ב/�g�y:zr!��#���9?h> �xs�v_ֵɮ���y��;L�0�ͧ7|#�W\_`X�aڲ�+T��M5z,�ARj�v���� �(�;Lħz�ވ�#�d�'���`jd��c+Q*��zcF�im��h�c3�o�\�,!!Զ�M��_���v��ҐZ�j=S��,)�)��>ϘVc��O�휵�+ZT���JR� Q\����ۙ3NL|�_*�Br2�N��o//\��J:L!�e\]33�g!�B!J�  !��45����cp�r���E�22����}��� ex"�fŚ:`g�E��K{�KW�s��=>h���S٪�vp�I�öSź�vp��y�����Mg�ʷ��α{.���eiU��S �����^՝���d�ox��A�v��S��kKNE�Ҿ� ÷��NZR}ڿ�_[�,*Qպ*�������>�ֳ[9v�Wb��֨IW�����T�S�b�R���vp����t�E�ç�g��n�]~�P�ԌTv�ߩw���g/6��D��Ӧn��ܝ��M���XWa��=y^��152��fo3�Qx;y������셍�M��B���Ȉ}^^ cSll� ؐ9H��JӐ�{y�QVBQv�����  !�B�"�B��F|`<���g@�9gC'%io�*4�)�$U���V��* �0|���:� ���i9R�f�=�dv��q�v�q�F�-���4��ym�0 C���1OƪT(����m)�JT�̕Z�5m�����y�Ż�Vr%-#��K�����g=�b~��`��L �UN�QS�r]�]��8�T�P�����?캰���xg;g�xکȧm?���o���Vv��`�����1[;H*�(z&J%��3��%ݹ��� �KO�eH;4(3���B�>'���B!��8��B��F��X���u3kL���P}$1Q�.T�FCS�gO�X�� �9;��݋ԨPC竚M5ܫ�� ���z�|���D%Fq>�v[\r�������3��/��߫��l ��,������Wk����u��zPg �zU�HjF�3�u����]gj���^�u^����=s}O�QՃ���120��3�3���8�B�o_��� �o�Tĩ\���`����#X?|=���Ɗ��}�&����y�B��  ~�[�i�ι�QT*چ��+.��BQ�U42Ү�.�B!DI�B!�sA���1&gzQ�����&$�obeUl��Ou:����~`^�<.޽ș�gX��5'��Ž �����??gɡ%\�w��׏�9�,k=�O6}Ÿg�dߥ}����-����̮�K�yØ c8q�������Ɲ׌�,��c������NE�bʶ)ܺK�̘VcP�`��l9��q7�}a7G��w�/W{scsZ������gձU�s~ m:�j6���(֜X�����y���gs��1��,�w1[�l���K\����㫨hQQ�aTb��g^���vn=����5o��]�L����Wk�ʪ��[�DŽ�t�g.귈Z���j�W|��3*�W��!��h�IU�������^a��a�q��}�����R�{~=={2�Q�y�OF�I�:���cm��lNGG���kSk���~��Xp`�N�z�ʶ��Ċ���� ����{��s�3���k}�Z[�y�f�9�c� ��k'>��ȄH��:1�Z��������z���3��\̌2ל�Pgp��5�>��v^��w��؂q7�p�t��#���۫7C�і��;( 貨 �g�_�RQ8c��~} �@kȜ�> ,���o�tx�d޼y4m��Ν����qqq�����G�,-�_��R�$(�`��}}}>|x1E%�ys|��*�? !�B�g�4'N���ۻ�cB�\]�t�����ɥ�,},it�Q������ �Lݨ�W�D��G��U�jU4Q�,��2nJ��_���'��M#6�v(B�P���%�nCQE��\��Ekw\�Ϟ%M��1>��\\�X��S�(JNNNDFF���HDDD�e�ݻG�*U��_�޽;��֨�jRRR�X�"�yz����y�i�P�����R�B� 0#'>>��h�___\\\X�lYi�"D�*H�<�u�,�bc������?g#��eӋ�? !Dy�ai!���cp0���G��YY�E�0�m�ѼfsR���_�F��C�J;4!�(v����ˋ���$�T�r)7��53�V-�ep �}���R�1b��, �R�J���4����\Y�������CD%/55�2�5AQ0�LL0T(Г3%W�??_�B!DYS6�L!DҢ�H���s��{��=�pb"��o���&2@X*� %��F���a���ٳ�#B����ښ�>>T66� �rs""v�E�VjQ:t(���������s���'<<��ݻS�jU<==�3g111�n��ŋ���aoo���#$::Z�?00�R����ҥ �*Ub֬YzS�]�p�6m�`kkK���ٻw/5k�dƌ�2��� 6L��۴i�ƍ�����ɉ�'� ���X>��c4h���9�j�b֬Yt�҅�� �/_�R��9?�R��ŋ5j...t�֭X�B�j��9��̋���? !�B�� B�y���׻����Zfz�HH��dU��h:�����.�:�B�q37'�LJ��Nq�ѣ\g���&.#�?���� ��Ē���?����رc�����^��9�ݺu � ����IMM�~`������?O=^�RѺukj׮���ˉ���o��G�:tH�����:t(?��&&&�T9�����*UbժU���3~�xbccs�w�d����P,X��3P(|����Ʋx��\c �m۶ҪU���k�ٳg�ܹsquu����ڛݫW��s��ԨQ��s�P�B���'O�O�>lڴ ss�|�)�(;����!韥B!�(, B�y����bj��J��WQo��*aj_�13ò��hB�br21᰷7��>MHR��AB ���=^ e[����[ukkk���/HZ����www�͛��V�Nj׮�͛7�Q�F������7Z�ׯ���7�nݢz��ڲ���g�ĉ��ׯ_ש��ٳ\�v��;wR�N �&�믿���HHH`Ŋ8::��?���1����F�#Gh׮mڴ���Y����ccc����������_ Ԟ�l�fl\���?K�,�BQX�bTQ���y?���j��h����$ԏ�7T(x�ƦX�B!򣢑{yѮBr[iPM�:���<�ݴ�� �H������������ZM@@�S�_�~=͛7י����E�j���?t�>�F�֭[�^����3������u�6l��� ���Mdd$�o����ƍF�F��Zvcǎeɒ%4hЀI�&q���|����B���Z �M'����B!�YJ��d!��ãk�H�H͹�l}�/V812�Ti4ź��F�A��8uawŠ�!�(�8u*ThdFui�00ௗ_f� �~���2* ��C�����ˋ���%dP��t�ԉ9s��ؗ��rn �|���~�8���z��'R�<�H������ �{��DFF�a�6mڄ��'�G�������B����3����'��B!�+ B�i����n�ia�����܇�5@�b T��$��?�s4���B�� ���U��B�#�����aod���H�eT�͔��8�~//�[X�l�����ͺu�V���0�ٻwo-ZD\\vv�N�<��۷�۷o���ڵ+�&M"<<\;K%((��T= �2sss����Y�x1�1_}����X[[���\�! !��m ������H�,�B��H�e����snT@�����h4LHЦ5U*q/ƛ�FFF�����!���[;BQX:t =&##��EJ��9�k�`l��k���Q��� a��g�>�RԦN������ڵ+C��Y�fܼy�?���ѣGS�v�<�oݺ5�*U�k׮L�8���fΜI�f�tַ�\\\x뭷�2e ̞=sss��*�&߳b�����Y�r%�7��qcƌ��Ϗ:u����������񬢶m�2g�BCCqtt����2�N��h( L�JR��韥B!��"�X�e�F����{zv@����\OI!.[ZoKK ��Yd}p566��˫��B��ʺ����]��) &8;col̻/9��UT*|O��O^�ӿ�nqӗ.��pNNN���0a�&L�@ll,����m�6_)�J%���|��' :###|}}����+��۷o���c��������_2p�@�X�<'}�W�Y��� �ѣGO=�'�;���j֬I۶m;v�v_�>} �k׮DDDH�V� ܆��2�B韟�f韅B!t)͉'���.�X�B��s9�q,�v[^�� e���GG3��y� >trbV�Z�������8::Ql�!DaIU�m���_X*�F; >;%��K�ԯOo{�B����>�ڵ��_��۷өS��G�����~�0ݺ��A��~��H�,���EꟅ�< AY�A!Dn���=����A�#��=~r4]����חuC��M�6�F�$���@�J%7o�,�vEё�^pׯ_G�TT.�E���=�==1U*ѷ®��h�{��ݹS��=�V�^�����|�2 .dܸqԭ[�:�vhB�ee����L�g!�B��#�B�2K�����{z� �g[��yZ�)���/�q�lْ��(���J�]Q���랚�ʰa���������J�����///���Á�,�RɊ+ UGր`ր{�5����y��:�Ȁ����֖� bch�w�2S���x�_"#K2�"��K/aee��kРAE�^||<#G��A�����3�#G��T��!!D�aY�B!�xq��B�2I����~=�@������H��̃��v���01)��DN͓+g�gddD�ʕK�]Q� {��j5j�CCݷ"�����J���Ą�#Gr�С<��ΝK�~�x��׮]# �v��1|�p.\X�8��_Q��*��"��%���G}|h{�wRS�ȥܘ�pR�j>�^�D�+*{��!#C��YZZy{�G�f���E^�B%�20@(��B!ċC�B�IN=@�0�*L���1����ă���[[��YN�W��q�����P�re�x� RSS��5 7n���'''&N�ȝl�����y뭷�Y�&�����ݛ�7�|��J�y��a�u놽�=�z�"00P'��5k2}�t�O�N�:ux�嗙?>))):�v��E˖-����cǎ�Y�F'�x2�h� ��[���oR�J:t���͛u�{��Æ �r�ʸ��1{�l����ѣG111a͚5��'O���Ԕ�˗�Ws�̡A�T�X�!C����봱q�F�w�+V�u��D�l�J%�ϟ�]�v���3t�PN�<�SN�T�h�"F�A�j�1�G� IDATpuu��˳�!!!t�ܙ*U�������Ͽ���Sf��鸸����ӲeK,--9z��6]�ڵkiԨ���ܹs�u�ݻnܸ��ζm�022����z���ܜ� 2r�H\\\����uuu�]�v���/���o,^��-[��y}�oߎ��'vvvt�ԉ�ׯ��z��xذa(�J �膠�-j��q�ۛ����$w� _?�7�Q����z�d�[�6,�g��B!�xq���LJ<��s��:�^�Hb��SS�ll�%�˜={6��>>>�޽����Ӻuk���CCCCY�`3f�`ѢE0m�4����T�ׯO@@Ǐ�M�6 >�M�6�hoĈ�nݚ]�vaaaA׮]IKK��W(���/ܺu�U�V1f���� �e6o�L�^��ѣ��� 2��ӧ3s��"�6~�!�k�f�Ν4hЀ�={� �}���޽��S��`����/�nݪ3��X�6m�̙3y���|�2III��ۗ~��1d�>��.\�رc9p� 6�k׮�A¸�8�ʫ������uln�E�u�f�С��׏�[�r��]��뗣̔)SP*�lٲ�=z0m�4֮]�Ժ��g]�����s�N���hݺ5���:mݽ{�q����;�p�����Q(�:u����3q�DN�>����S�l߾=�k�f�ҥ:m,Z��.]�P�Z�]��z뭷�U����ȓ"""�ڵ+u��e۶m�lْaÆ锹v��9K1**J��͛7����5�W�Wve�AQxUML��ۛ���y�a�|�S�^���BQX���B!���Q��� !���� j��E�~��߫��O�D/miiiL�:���'����)�����+ptt ,,���Y����� &h_׭[���p�ӧ�N]� ��O?`֬Y�Z���� ڷod�V�����~2����O�o������ޝ��t���L6Y%BH""D����%��^R�-]������-����jK�j�Q�U��j�T�A��Ē����,��Gdn&3��I�y�^}5�=�<�$f9�y���L�<�^x��'вeKEa���̜9�\� @�^��1c-Z�`ɒ%���ό=������9s&�<� �Z�����de���W^���g���4n��F�… 8�< ,`�ƍ<�����r��!V�ZE�n�ؿ?:��Q�F���e\�$...4m�gg�;:7&L0�>fΜI�v�8v��76�Ӹqc/^ @�6m8s� k׮eȐ!%�<�{tt4����Ǒ����믬]��1c��srrx���޽�qLQ��|PP�m�s�ر̝;�3f��h8� !*����Y!�+I !*��i��ۻ[W��ii&O۸[^�VRRR���aРA%�iLDEEq��y.\�`��Z�|9[�neǎ\�r�N����پbbb�?שSv��mL�T*���g�MTT���,++���>��C>��c�:�����CBB�y&,+�F�!<<�]�v1z�hv��ťK��I;(H��o����vb]�r%M�6�����޽ۘ�KLLD��3p�@��t:���,[����h:v�H`` �{�f��� 8���/ԦM������DEE�{�n�a�sлwo&N��N�3���ھ��CAR{�����űk�.������c�ƍ& B�t�bCpp�Ir���1b���?��#?�0K�.��ߟ>}�X=��`0P���t�[��^�z������j[ܢ4�ٹ�� �Z�`HR�^�Z���s��1�88u�������BZ$ !Dy+^A_�j4P� ��B���~x}B��J�B�JG��'�X�ٸ��=�~��<������8�ɉ��`���Z�Q��u��d�s ���1z�hfϞ���� dٲe�s/�$�h4&s��Na�Ѵi�,V��g��q���R+���Ի�X�q�*��'N`|��k�ҰaC�ϩR�����HHH`���L�>�_|�������������.��P������0o�<>���z�-&O�����<� ���&�y{{[LVM���>===|�Ν;[]�R����3g -��B�R��n��ZT[�j5��7gxr2_]�l5I�Ʌ � , AS�{Λo��믿NFFF�,�+ p)?}��=O{{�K��B�����ƛo�i�0*��F�橧�/[99�98�:$!�(����,��U�z.�@F�動5;״��_E.�۩Tt��������ի��iɒ%t�҅I�&����*d27777nLll,S�N-q��~���k׮u����_5��LKKc׮]�DMYc�r� O>�$&L��ݝ��z�V�Z@DDj��]�vѣG�㋈� ""�7�|���@>��s^��r8�;�믿[�lڴ�|���AKn��,]���c��������?�4�4��R2���|��g�ر#�~�)���<��S�u��kժU�8q�>���:111̚5�dlӦMf빹����c2v�-F���N�be�f8k4,-�������k0��Y3�Jx]4hP��B��II|s���P�6ߔr��œ�F]�@�.�������H!�BTI !*��=����� ݕ���J�VQ�+ �*Y{QfΜɴiӰ��g�ȑ8;;�e�ƎK�[�Jӭ[7ƍ�w�}G`` ˗/'%%�LK��)�6s��e��<��S 2���>�ƍ�sޕu_�CQ�>�j5111��?�A��ѴiSf͚��������( 6 ???fϞ�F�a۶m 2���8�ׯτ x������`РA��ٱw�^.]�Ĕ)SX�n'O��s�θ��Dž JL��޽�aÆ���ӦM�r=O��?�رc5j�}�?��#˗/7.�2e {��a˖-%��N�{׮]Y�z5�����������|We�g۶miٲ%/��111�����襤$���IMM%??���DE1&� ݼy���T���8u�k׮e��Ō3Ƭ5oQ111<��� <� &��￳f����w��ƍ�ի���x{{K�QQ"�J��&MpQ���J�9���er � �^*�DZu�_I���HRC�;���LP��`/���B!D�+B�J'}���y��H��D{+q��*i��_~�O?��={�УGz��I\\��m�J��xA���c�=� /���ɓ4h*��Y�f�mW�~JZ��x�~�ؼy3'O�����M�6̘1�۔�N�x����ٳ'ӧOg�ر��Ӈ���ۊuΜ9���|��7��١R���/8q�ӦM3�3k�,~��W�v�JϞ=���ύ��yyy�a�|�Aڶm�?��… KL�eggs��Q�j�;9Wּ������w�}�o�a�j555�'N���;9�o��m۶��GeҤI���Я_?�uJ�۶4^�}z�g���7��$���?���b��Ť��I�V�ػw��z/��"����nݚ�^z���T6o��… Kܿ��?�ׯ����<��C��Ʋl�2��'N��F�!**�L�Ͳ���՛J��ƍ�`uXs�*"�`���w�xN�9b2�_��V�6�BT.j�I�r�O!�B��T��w�^���l�B���N���j�KVԎ��k��};W��ɖ���~.N���s��y���8w�\�?����jV�X��a�l�ML�:������[�R���U����Ӽv���j���'��¨q�F!ʃ�`�C|< ���Z��5h����+�(�W�0��!�㫝:Q��ކ !�B��*>>^*������<9���XM^�jM��>���$9(�����4�o�����ٳm���� ��Vu�%�7�?�z�����]o���<66��!Q)<�닳F���d���Uz`Oz:������w�Vː�$��B�6iBP�� K�j��':GI� !�B� $ B!D���;��{���v*ZEA�(�:;WTx� ���l�B�w���Z͐�$�b1I�?3�����S���a�*LQF$'s]�5&14��u�𤏏-C��0(����+ �B!�(O�iSQ���2Oj�48�w��MBf&�"_�C�ŨB����ڵY��Je�C�H�������o>߯%Yx��_7��P�Z�ܲ%j��$ቜ:��s./�^�'���YY�t�ɘ|���4���� t��B!��@�mNQi�˱8�f}N� ��d���ǵ��dn%!�������� �-��ss����:9�"LQE��� :x}�ą �H'�[X�re��[��k�ϧ�Fc됄�D5j���W_套^�u(B!�$��FN���s3���U�I{Q!���l���GB�z�Y�P\�ˣc|<�""��{a�+Ǐs4'����N�����5h`Ӹ��� �R�̹N`yvv!��<���y�w$A(�U�$��FvJ��q�P�I��YYh(��i�R���z��Bq?i�����(����M��b%��|:��GlD���+̬�z��.�G���BC��ևB�;@~>85����<�Baky�yprr,��-�����Ҹ� ƒ���* :E!T* �B�0vFE�����|tŖ��Z-���$l)7ڈ[���1<9� r��KBB�-�����ΎL^0ن�!D�f��M�M��Z!�2��B�B�2��4�콬�)������i�|�È#�֭��ømU5na݌3hذ��èr�j5+W��uB�h��̟QQ�::Z����:� �4/����xRYz�19�����1[�&D��(����B!���$�����.-�'����l�m�W�!PPYUո�uU�w��/Ҿ}{���Q�-� D�V�V���� ,,�~���aÆr�#00��3g��~�j5����cǘ1c���?pvv��חx�-[��1b#G�����C��;��tr��BDd�J*6������,��+N5���# ��m��֞�t<�og�ŋ�E!�B�G$A(���״2��u ����dn.yE��x���mo��PT,���BTw�;U�Vk6n0��7:,_��'�x�q��YMt�T*&N�Hjj*���g���lْ!C���C���tE%YG�A\\��� �b�ڵ��Ջ�ׯ��%Ix�:���ԓ'M�����q��*��NNd���x횭CB!��I !*�����tif�"�`���U�z��/��M�6xxxP�N���O^����+����O�V����g�ԩ\,r7�͛7:t(������3h� ���{��Kll,j��?�����j׮������5�%00�3f0c� ���iѢ���'77�d�M�6ѩS'����ݻ7_}��I̷���͛7���(���iժs��19E�:u*AAA3o�<����ᄆ��d� ���U�hݺ5��� 8� 6���˷n����������ӓv�ڑ��pG�\�#00��ӧ����� ����ĉKM���j�.]���?O@@:t��>3I~i�Z&N���� 6��W_5;_'O�dРA������������_L�Y�bj��н{wj֬ɷ�~klW���өS'\]]ٽ{7�N�*q�G�E�Vg�<�B�V�{�n��=o�<��y�7o^b���Օ:u�РA����5k?��3�6m2�-Y�g�ڷoO͚5�ҥ ���&����8}�43g�4V*�9s��}��Ν;ٹs'�/�G�aÆ�mۖI�&�裏�SE��L���$���j�0M��KBG��+�E��o0�XR��k� �H{ww�&D5���@OOO�!�Bq/I�PQ)Xj/ ��lu��YYƹ��U*ZT��ܹsy��iժ���+[�n%::�$����'�|�̙3Y�hk֬a�����yyy����f����o�u�ƨQ���̞o���DGG�i�&\\\�ׯ�����*�� p��YV�Z����}:�ׯg���f��?>iii|��� <��^z�#F�c�.\�s�=�رcM�L~�!�&Mb�ȑl߾�>}���3���j��9����l�®]�x�嗱+�r�ԩS��j>�� 9*�����s��I���KƎ�ҥK�3gN���6m�]��0r�H���O��9s�l�2�{�9��� �=����M�ϲ���ڵ+?��qqq4oޜ�}��g���:t(�<�����G��T*._��ĉy��9p����dff�����`z����ŋM��h�"���i۶�m���ҥ ݻw7�wP\^^=z���Օ~��A���O�������o�RLMM���(HL�����߹s�,>wpp0���|���d�0_�T k����Ak77�I�:����$ �+�9u���l o��S��rueJ�6�K����u��z�B!Ľ$=b��BN�� B�f��231ܺ�]�(�V�a~~>o���?�8�~��q<,,�d���4V�\���III&�L>>>L�2���I�&=z�5k����d_O<���� P�Z�j��={� �p^^^,[� �v�ڱ~�z~��'�q&O�� /��ĉhٲ%��0}����[���&L�`\�aÆо}{���q/R���� hժ���gݺu\�r;;;:v���ŋٴi���h�Z�x� �̙�3�<@��͹|�2�V�b�ȑ�?��g�2r�HBCC��$���4mڔ�5kV��P'''V�^ @�HOOg�ڵL�<��}�lْ�s�Ŋ+�駟�ر#?���>�,���k֬����daaa&�͛7��?�d͚5�i��d�^x�Q�F+�BNN��ݻw7�׬Y��}>��<��̛7OOOrrr����y���K;�w�Y�f|���V����o���n�:\\\�֭���޸�����X�X����K��^�zƟ��DP�vm�̙�;����_ڵkG���>|8������/_^�c�'w;;~ �Wb"{32�[�W�k�t޷��QQ4�Q�&q�{��t�:s�$A�V��o�BT�A�k3�� �׀��ү�����?Aڥ4T*NnNx�z��ȇ�������/㭝���_��p#�ٽ�\M��L�j��ͅBQ�I��R�:b>ב�I�C]��$dfRx�\B��'+���rrr4hP��EFF��P��9�<.\0�-_���C�����-b�ƍf����1�\�N���M�2�T*���g�MTT�v� ��RRR���M*�ƌ�ɓ'��fi��ݻ��'Ҿ}{<<<�ܹ3���lٲ�$��z��q˖-�ٳ�I�_DD��*��ѣdff���/�ӬY�ضm7n� 00��C�Һuk���˒%K�.����Ϗ��$~�� 9*��^�z�lӻwo���åK�ʼo(H���/\��޽{y��L�y��LZ���z>��c}�Q���qss㧟~��w��������ХK����3&&///cu��~�N�3��+o����Ǥu��ѡC\�ܘлw�2�?((���4K�]ƍ��ӧY�~=�:ub޼y�����矗9!����N�* ��J�ȱ|#����zOJ2�r�N�F4�䟯��.�j� �u�F2�g�d�v����3W�����iɸ����S�Z� m����eQ�U�jw �D!��oI��R�9n~�����j{�|����.VV� ²��sss3y\�$(�k..5�P� IDAT.�ѣG3{�l�N`` ˖-�w�1ۗ{���4�ٜu%�SX�4m�4� b�__�2�%�=�c�=Fhh(�&M"$$���<ڴic�R���*>�V��� ���t���j\�}�ӦM�o��O>aҤI���/�o�����$e�]Y�O��y��[�V�:wa�}~�嗼�꫼����7fΜi6? �V����6k�Z�}j4�~�i�,Y„ X�x1�=����%�����i֬���*����suu-�5!99�ؒ�Z �z��W�^̚5�~�����o3t��;�K� ��V+ �_�pGT�NN�ST�?���\�Wv*���y�� KB��S����`V״Z�u:��z��j����g���ȼQ�=��?[�qHG�k��~%� G.pp�AT�;��=���<����(�B��M�B�J!�b�٘S����)99&1�4|��+ ����� �W��O�>w��%K�ХK&M�d����������hܸ1���L�:��u���ccc9v��7o���y��.]zW�,L愄����Ž;>|x��3m�4�M�F�N�X�xq�%K�(�I�$��M�hӦ u�ֽ��������ڵ��6o�lR�d��رc����Ɩ8/ciʺϧ�~�����,^��?��Ӥ�nE���#66�?���:111,_����,�yڴi��z����Oo��hY�����O?��$DY& {&&o!I�S.�������$ ��-7n��H�(��yeӦ����b�ٳL>q ���E����+��nڹ)^~^x�y���EX����]˶��x���u3�[p�� |�|�:�+A��W�j�Ũ%Gva����uz�j�1�����Mnf.;����s��u�����#m �-�S!�B�{H�B�JAwü��)��ȃY�-IC��+$AV��9s&ӦM��ޞ�#G���̖-[;v,5�8�S�n�7n�}����,_�����2U3_�,�̝;���SO1d�8|�07nd��ŷ����ֺuk\\\x��w3f ����X���m������o��S�L��ɉ��S�fM8@||<��.;w���~�w��x{{�������y����������уٳgӿ��;x ,Cnn.�f„ ����,]��W_}ո|���,X������z����3g���܈���>@�ә�Э[7�,Y��?���� , ''�*�ʺO___���� /�@TT�Z�*u�ǎ#33�3g f�ILLDQ4h`��OQ222HMM%77�ӧO�y�f>��#���c2�`q=z���ёGy�)S�p��!-Zd�^�������9|�0���ԪU �JE�]�۰a_|�C� �I�&���c�.\H�>}$9(�H�$�>KIB�b^^A%ad$�%IX-������0��qcʼ�BT�g���K�8������ $ 5*��k���F5���#|��74jӈ� hв���Y�ܺl+�2��-�:˪�b��Ф���V[�ޒ��w���ހ��C�Jͺ5I����1�ɺ�e�O~N>������Ӵ�i�?_�g9� !�B�K� B؜!׀�g� q�u�����,�T*t���JE� n7X^^~�e����裏X�j...t�ԉq��ֿ�{��8r��'OF��ѷo_f͚e�²���1k��ׯ�7o�?���?�8yyy4jԈGy��6�)-6www�/_�'�|B׮]���dժU���Yݦ�X��=������2w�\>��sT*!!! 6 ��5k��_��'����I�v�6m��׿��V�%%%�������2G���?�<��� 2����Q�L*I�]�FJJJ�����'M�ĵkט?> .d����?�d>����s��u�~�i\\\2d!!!ƹK;K�e�'��1cX�v-cƌ)�����p۶m�珌�D�R�|�r��Y�R1w�\�Ν���+���'((�/���l���ټy3&L����hт�>��֭[��q��%����z�*'O�$ �L�`MXX^^^���k�={�8G�9s����+vvl)!I�.VFE��h�}ZT /=ʕ�|crP�RѽfM��� f!D�e������������j��dZ�PTk-{��%���Ӣ��8��1a�RӅ<��4�d�������4o�ίw�g�EaӂMf B�7Q*��-������@��uy�'q�,��l�{�ɺ��Z�&fR M�7!'#��>������J�Ȇ�{R�BQ�T��w�^���l��>�{&���e6�I0~�Z��&��~�v Ps7����(����????Ν;wϟ_�?6l�ȑ#y�7l�M,^��W_}�s��I����+QVi:=ؗ�i���������H|%IXe�p� 2s�hHn�?�� Q�E��˗y��q.I�Ro�Ax8��t}��`�-B6�u3�=��������zE�-�b�eϖ<2���Mm��wb�A�ӣR����<|'BT���&�B�w���l�B�����A!�����xI� ����9 ��:���UUVV �������_������[""�puEca�8��G�}����w����r~>O9B���O�4��`_F������d.�J�O;;�4�����L��.�js��B��]y�ۗxj�St~�3n�܌�7%�mS/���N�xx��.�-a��� ������A���i&���� ���q����B!*i1*��������9X���9[�d�$ *�^�����v��Ǐ���߾�QU�}�͊2n�8֬YC߾}�0a����Q�$왐@��JB��p:7�. l������{��|Ea��#��tƛ�4@�Z�x�N[�&D�s%?��'O���EԷ>�iT* �� ~~Loؐ�����tַh��Z��_�f���Z0���N��?����o^�/�~ ���̶�x�����|��� |w��Q��v��[-7R�����9��udW<�x�֨1� 8890� 8{�͹B!Du! B!���naR�i��?�0Y)h4���ou��Gپ� s'O��u6�b� V�Xa�0��/ռ�$쑐@��$�8��K�}�������W +/]bõk��*��Ύ�!!���(B�7���'.0��Ir�z�p�D'ww4iB�[78~ۼ9zE!��Ɇ [�y��ܼt�ȇ"�\�z��]N3�� �1�.��o�O@�v|����������^�^���y��'Y>a9��]c���P�UD�Fc��adC��}���|~��#�O#�.�q.�{�˃�?�_3�Ӄ!�������/Y� ����8���m򸩳�\ЪD���l�B�rR�Ύ�""螐�~+��'rr�NH .2o{��ݢr8��˸��1X" ^!������()99�15������`z{�|w����Йg8s���e�Ύt~���x ����&cj����z��ku�\<]6w�_X��K7��,�FE�'�3)�%c��y#����$oO6�\�� !�U�$�6�w�|�"�����;�rs�S��)  D�B!*LM;;���$�G���޷�?"#�%I�Jɠ( KN&��b 0�NԮm����&N���ұc��v��o1v**`r@�p�X��Uh?�=>�9p��Kid�e�R�p��N@X�t����l��a��f撰)�nP�a���JP��n�,L�YJ�T* '�u��^�$������.�E�Q������dz��}��o����Z˕: ��.�ځ�>"�BTE� B�\�9� B���/.���5��V��/�x�B� UZ�P�ΦkB�""�$a�3��y�����Z����]PBT�z=o�>�{g�R�>�A//>lܘ�5l��:�5�G�&��h�v��n`;��~�a~�a���[���y�z�������6��Fv���BQ9� �B��;k^Ahm�A(�;Ww��w�� my�B� W�Ύ���i�₥=���E��nh-�/,l�Hv6��73+�6�S��B�EQ���%���ϜA�(����/-[��E I !�B�JK�B��e����ܭ8�(RA�RA(�B����l�� ��$���,z$&rSg��.�=���DR�"�E���z�x�V-�&D��A�}�x"9��Z- Z��P�y'(��m��e�R�rq�%���'�B��%-F�6��O��v�|��^Q��gZqX_*�B�{��ޞ�#"薐���,��F�gf�+!��""p����4���33��Հ��#�7jd˰���nh�L>q�%/�VS�7�N�m�_�n"*X��]�:����B!D5 �B�3���45,�%���|� ��bT!��� ��%U��̤Wb"������^ٗ����'M�E3�7k��$n�(3EQ���e�w�b�ŋ(`�N�����HV��JrP!�BT)� B���T�*�^�I���\�B!��v��%$ �fd�w�~r �7���k0�XR�ɘ���Gך5m�U�ɜ���ϐ�$��t�)h'���i�&�kݚN�S!�B��& B!��)Z����ra�����̽P��1�nݺ�: !�w��ޞ�R��qii���!��$���8y��99�*' ���[AA� K�*Ck0��34۽��n��S�1�n]��o�__4�]D!�BTQ� B؜Ag~�P�l���tn.vE��7tr���D�Wl�I!��GiIB���5�>�A1�)H������9{���� ���8k,߄%���]��D��7�O� OQ�Sp�$�ɉ���Y޴)���m�B!�wE�B�ә�9[nZ���N��AKV�}����j� �N��ŋ��ܼy��C����;� ���G��߉���E�V�}�v|�AjժE���ILL��͛<��ԫW���g�����7n�7��ߟW_}�ÇW�����1e�ڶm���3���+�?��+W�m�6�j5j���+WȌ3�6mM�4�e˖�B��Q�$lf%I�__��s))(�$�P�Ò�M�詀��ww�UXBT �:�SR�ϑ�l �o5�Jjӆ6�R!�B��! B!��)z sְ��t"']� ���WEILL�O>a�̙,Z��5k�0}�t����c]�b_~�%o��&���|��7���0{�l}�Q:v�Hjj*����XU*�1'O���>�x�B!*/{{���T��Ŗ{ ���E&�8!I� �֙3�k-\��m����(��r��]�Xx� � E��ߺ5����!�B!���\�#�������a� B��P�*���X�r%~~~$%%1o�<�r�L�b|ܤI�=ʚ5k�׿�e��aÆ1n�8^z�% DϞ=�ۿ���nݚ�G���իIII�_~������6m�Ě5k:t�Ř���iڴ)5kּ�c�믿h׮�{��A�t��WWW�������N�:&�)����+_|��m=�B۪��@lD�㹐�g�I�=���S4���Uw23�u�4E?Y�M�⨖{C���Ln.ϥ����uT�̠Q�pP�x'(����d�A!�BQ-I�Pase� 4( ��EW� VFFF��QQQ�?� .��� ����ٺu+;v��ʕ+�t:�-�s��C�:�g�������';;�� ��'//����j���Ϗ����>�1c���#�иqc������É��(u;�JeL* !��Z|�I��x�h��-T �v�$�vv�/�~(�^Q~��Iu���G�&D%�S�?ϔ'�L�D�����&M�_oFB!���$A(��=���� ���|��.2V� B777�ǚ[�� ����c���̞=��ÇȲe�x�wJ�W�~,��[�����͎;P��F�w{hfڷoϙ3gX�nk׮%::�>}���7��)G!?�h,�UV���t��'M���V��G���0�n�{_u��s���4>V��d������fd����$i��<��Yؤ ���~F�h���Kӱa��� �e�KӁ *C�+ !���$A(���,|�<]��h!�*XAX�%K�ХK&M�d���+���Z��>�ҥKt����W��� 4�A��y�fz��͜9s�_�>dggߓ8�B�[!���A�}����-��3��a�4Ԯ}��N����ډ&c`YӦ�ʜiBe���~��?O�� �W|�^=�iԈ�v��Lb0���=�7n���B�+�s��0��Y�BQUI�Pas*;�δ2P�c^kp�X�����j8�N�n�7n�}����,_������awjȐ!|��G�=���~��z��7o���ӤI `q����ӣGfϞM�����|����[�&44��� �/_NXX����{��,]��]�vѨQ#���qpp(�cBa{-]]�Nׄ� �I��IIllт���y|ՁAQu�0�"��1z�9�h�ի�II�R~> IAаF �/$�η9�vEqrr�-;��j;:6kn�p�ª���l0�Ȩ����B����T�Y��v����8'�J��X Xt���ȑ#L�<�NG߾}�5kcǎ��MIcE��j~��7fΜɢE��:u*�jբ]�v%����jIII!==��C4Q�F �x� N�:E�:u�޽;+V�0.�ٳ'#F�`�С;v�+V0l�0��tBQ�ں��K˖<��H��P�_�`�-"�N2W�m[z�"qii��*��Ύ7�]PBT"����(k�^EMAu�ݭϚ�5h���+�M��rt䱾}m�BXw��a�錯[B!���ݻ���([�"��Om�ڎ��d,�� &���MI��.^D�(����ެ ��������������q��9��"�%��+ak��_���% �`��j5q��D��WXw./��]��6��f~٬����(*!*���� ���q� ��P;���,$�f..6�Ϛz��ᘚ�fL�xG�h��G�������r�N7b�ZN�������~�!##"�޵��CUЌ9sX��E^ݺ\�x���!��M���RA(��=��n��ioj��;����V�,;���*XA(�Bܯz{y�mh(�2K�\����쌊����-B�RE�#G�+�Z�N����'C�ԱadB�^bf&����L�pR��۸1O׫��t������駩aoo���N�Vˬ�86?��W���Bd�z��ڕP�W�"!�Q��a�>�d��D_�uxFl,�%&rr„{����F!�����GCq��8k�����-F���6( ���B!��#�k�Y�fX���u:���g6�0�����|��Ʌi��EM���^q��������D��7�n% /z<��MJ�v��������rvƹ &�eg�r�B�=t�w�D��1������h�%%�:D3n��Լ�o\���J_I!���T !lN�f� ԥ�~�P�syy��z��$�B�*�I��zƦ��-�״Z���ǟQQԓ�z����3.%�`��"��5jT%�h�<�r�:O9…�< ����, !��ۖᕻ�?����D�3g���������b == ��a�޽d��3,<�Yݻ�������\��f|�6<צ�I��c����|� m��΀f�p�+��I���+g��9���xߪ$o��E� ���繍�H-ggbO���g�q�� (2m�c������͑[ՈC��ڲ%�������6��,س�\��ё�<ۦ 5���.)�Q�֙������Tq�ٹ��l�f����h�_<ȱ^09�I�7�1%��q�,��7n��l=y��xx�Z��<ٲ%�:o���}r2�n���ٙ'[�dV���۵� �~��Z�x,,�'Z��^ ��o�|E֭˒�x�^�F�i��v�BQI�Pas���L� ��Z-��iC2i1*�BTMc|}���x���2p>?�n 숊�V���h�=J�^oLکT�qsc���M��R��y��QV>�Gh IDAT_�����Ś[��חYAA�W@2��f�����lΥ��f�`�o�Ta�m�#G��j�����p�7m�\z:�23y�G.dd0���vvfxDk��5k�ѵ+ ��O^�̌m�8|�3K��n�ڵl;}���l���|q��64&�z44� G��cJ�1>K�{�N�k�;��ۛ7n0�V'%q��L��1%����,x�!.fd�򯿢S;w&&$�����_~!�ּ�5��M>۸6m����7��3�������lfo��o'N�#(�x�+�ֹ��cym�Vn�沢|��8r�*�"s��k�j�^���V�FZn.�RS��E��^�h��Ɂ˗��s'��:������e9_��Rf&�?�u]]��O!��[���,��r4�� BC��䱥VcRA(�BT]�ԯO�N��ӧ͖��c99�JLd[Dn������p�*�\�b6�M�V���BeP�^��������\h� Y����Mi��n�+���Nvv�k4�qq)u}���ŀة�t�_�%��|�?�_~�[ ��IIl:~ܘ���e /�k�Ďh�モ(L��-1A���F�"geq��5��6���_H �W���~GFFn��EK|�!G�^%�VU��(���|3h����Ϟ姣G�ڹ3�1�j�\ެQ��{{4j��z���I���k�����/1��׹sL�ؑ���X��q��3gؘ���G1V���7�<�}{�� == ���ҥ�����N�@�V���>Ze�B!D��-��9;�"]�i�����v*u*4.!�BT�遁d���9w�l�؟��C�k˖�И�Pt�I��}䈱J �!3ij��F���PV����t�P�T� dR��ث��wp��]�s^�.�vv��`������Oʵk|��_|�{�qEQ���HHM%�n]���V���r����m&�R�]ceb"�Ϝ!��%tZ���G��$�z��Qu�x��� x�uk��5ײ����̢�{�W��%�_����y3+�פ ###��4!5�������p��d��3$_���V"tˉ h���6e=_�4��BQ H�Pasv��/E�*5\,��� w� !�U�J���F����Y|�"J��z`gZbmX����ǏsM�5&5@��3��U]"Du���3��i�9{֘0*��Ã�!!�g��|#R�T���R�R�ja��������֥ C�����[�>/x�Mׯ�Dr2z�x ����� �^�H�Y� �g͚I���/�v��{����3�=Irw��� !6"�Kz89��Ֆ��pst�����N��i��S9�~v�hx�eKbO��jv����II�;:������uq�h�{�q�g�r�ȶ'n����'y�[7��Q�.�����˻�� �y:]���X���T*ƴjŒ�x��K�:u��CK�Y�c[��סCy�}{>��/�����z�>lq��S�8v�:�����P���1��В�<_B!��䛤�����;���8��d�EIADETPp��,s+��\0�\Rj���m���f�[�2�3wB�E�Q�dgf~��&���y=Oͽ�{﹗q��s������A>������t��)�\LLJ#4!�B��B���t��+��X��cb�U =R�jO�һ6J`��#M��C<�ef�?:��QQ\HOG�_d��R���� �V �s�]��ٙcW�r��E����y.Ƽ��Z�6_�vq|١�Ν���~cۙ3�\�ί�N1��ߋ���;h�r�#���5��/g�ɓ�޸�����a�.]b�[o��C���m���r�>�Ν��Ǚ�};���^:[[S�ښ�""��|���7�w}���Q*�DEq��=R �� pq�jJ ��r-%E/Y8�qc�߾�W2�ǧ��df2��?���[����8:֮ @k'':ש�{۷33,��׮���E����I����?���+,:p�����=��q��BQ1H�PQ�Lj�O�i3�h��k钐kB�B��T !�����yx��Ʀ�)Z`yRϜy��s1#C�ZT 81�ť,���j��$%Q��~�r@��fhȟ ������K��ՕA����Ι��?0o�T�P��.p�-K�ԭ˶����u����4]�������Ҳȸ�����[%>[�1������޽4��[|W���ӧ98d���/y�U��U���u�߿�O�bf�[�T(X޵+����\�wG�0����v-,��g,?r�y��ys��z���Z�f����ϝ˜�ѭ�35�5ww �Jxyy- �Jn����o��`�R&o�F{WW�|}uc���E`���x�8>�����/\�wȩd��[7��]�o� ~��au��E���^/!�BT< @{��a����:!�s*=!��N��-o����� {�r��ݗ*�3WW&99�f�rtt$11.^��H� "$$����']�������������4h�ϟg׮]O 2!��z�WB��T��QQ�{W��fnsj�b�s2�ށ�wi��Zc���ml�$&!����� ����7t�T�$�;:� f*U���4U�V ��$��4qbY�S��IH��ڵ��_�o;w.�p[����R��v-�P�xlAs�"%��^�r�v�B!*���H� B�=��Wf\�o��۹�zP6yڜTt�%�ƍY�pa��Y�b��>Z�x16lxR�� ???�: !�x���Tl�����9�}�?��V߯(z�eh4 ����Ц���$�3����q?x�?s%���>>|����&E~�j� l�@���s�!s�g�RR�:"��+W��+�p�B!x��J !�#P���U���� �Ʀb�gM�ZMF�Vb6���WY�J������kk�'�O��hN��O!ēaa`�V//^��c,X��c�0`]�ve��$%%����ע4��6m�����iӦ �v��k׮�l�2��EEE�t�RfΜɷ�~Khh(3f�(򺆅��%����/�$<<�� ������#k֬�e˖���Gwn-[��m;}�t�J%6l`���%:�B��74dg�F�V���ݨ��h�E\ZZY���h�Z��> �n�1�V�L;�� L�',C�a�3�=ʥ� ��|I�&8:r�I���q�B!�B<�*�7�B�g��� �w��[���������� 60r�H]5_hh(���zc�O�N�= ���;;;:v�ȷ�~���1���gҤI�j� ȩ|`Ϟ=lڴ��+W��[o�7o�\��Z�sss֬Y�И�ܹ��ի�S��+W�{��$''caa���9U�Vͷm������N�:��W_ФIRSS�駟6l���V�\���'O�dѢEE�hff���;���=�����O@@��ұf͚�uVVVbbbR๹���dɒO!D��46f����!U�&wݽ�����倏���e����W ������R��:u�ͼ�B<���㍓'�IME�-E�����'��^!�B��T !���f��e^��� �K�.q��a:t蠷�C�z����H6l؀�����W^!%%���� �ɓ'3y�dZ�h�'�|¥K�t�=zCC�"�^* ^y�b����KBNR�R��͛��=@ff&���;�:u�[�ꫯεk�t�7n�Kx{{����w�y5mڔ�'OҤI�b�0n�8�-[���'ӦM#..���v�رD�B�����gÆ� H�����Erm�+���ٌ��%��*��]\p��n�3@��2��|�tj*�=��T���f�$9(�B!D)�x߰ !�If �'�og��j����ts�( U�FcW�� �F�!00��'����m�ȑ������O�����'�0{�lƌS�ʂ�I������ݿ����c���u�S�ҷ[�n$&&��/��a����5j_|��C�-��B�d�hmͺ��y��q��eR�SRx��q����PYqz�,���u�"g�1�wG<Φ��Vt4����-3LT*�խK��6<��i�\~F�XB<�=�� �B<}� B� &�&��!�\:7�٨ ����P�*d{��ի����֭[���r�c۶m������7۷og�ҥE���Ɔ#F0b��N�����3f �5"33�_�����?v� �>}ZWE�F��U�=h1����Q!� ���t�҅?�����~[�|ӦM���R�J�ǎ�Q���2`� @pp0�Ǐ��?���KKKRSS�,6!�����\�.Ccb�S�n�&��)Vի���W��{�o.]�K����u�T���Bh�Z�'%166��<_(���fU�z8J���m`3`~�FY�"���L��U��!�� $A(�(���r^�����}�뭲��lYW������k̝; |}}�?>���zUt��9-Z��W�^��׏ ����?> ��ɓ'ӳgOj֬ɹs�ؼy�.a׺uk:w��{��ٳg�իw���ȑ#�9(�*P���[geeŀ�>}:�o�棏>�]�v�J�-GCBB�֭���z �z��M���=z4dÆ ���̝;������0`�V��iӦ��n���t�ԉڵks��֭[���������g���DEE������5��'�ς!ժq%3������i��W��`d��j�~p�A��2$&%9IAȩ��� ���*�Ȅx�ܹsz�LG�T*133��ݝ�_~�U�V��v{�B!J��+B�6��'��Z��g�� ld�RSX�O!��<0R*��A���$Tk�t=v�#�ɥ[qm�y�_�]#�W�r�e^6Q��k4�_\�G�����t�ioωf�hkm]�!�R�u�V�u�F�Z�����9��233>��̟?___����������6l_~�%mڴ!+׍�����lJ���U�R)� ���G_�/_�ܹs̚5���H>���n�J```�����CRR111,_�\7�������A!��A�B�r��� (̺��AK���~`�Νe�BQ(K�xy�hd�A�/H�@�F�KQQ�?�<�O[�Z���eJ`���-,�*,!J�Hr2�""Xp�"Zr��*�K���=��S�x??�|ɲ����۷�߿?���XZZҳgO֯_Ov�9;\�}��ѵkW�T�B�= ӍiР�ϟg�̙�j� .p��9�J%�������R�D�Rq��]���Y�j�^�7n���ؘ���������ƍy��ש]�6�;w�믿����СCzcMLL�Z�*����nݚ��{�������_�߂B!�4I !� �B���I�厱����j�ŨB!����Q#�T�|��j�ZM@T��Q% �g.�����CQAN+��\\�2,!�M������4��$.-Mo>P?++N6kF� 0hEԪU+*U���+<22�FCbb"�ϟ`ǎT�Z� ���δiӈ��`���9r��]���9p�@��OZ���+W2p�@���iڴ)���˗�j�*N�:���/�[�����,\����$ƌ�Z���ח;w�œ9s8v����z�s�F�Q�z�|m,;v�X�>^}�U��{yy�,++����B�ppp��ɓt�֭�1�y��}��ƨ�߀R�y�~�����+|���z��rWz>h�y���D_�ƍӬY3]�����ӧ6lX��W�� 8����|�J���hd�{!���I�PQ�شן�^xG�*;�i1*�B�B����G��i���n1$Or���x�*߹C�&l ��o�ԑ/JE�v9#�W�c��Ӥk4d������!< ��O���?��ќ?��{�@@@;w�����\�z������#G�ȑ#ٵk������s��=ݘ�={��hX�~=������/��A�I5hЀ��(�����M�Vh� ��د�.�]� g�k���r����xxx����?��S�����Ӻuk 000�Grr���ݻw3d�<== �ȑ#�7N��񀥥��c�J�D�s�ȑ�Z����L��� �%�����I�޽������.�wW���h����]q)�B�'O�B�rŨ�J3��&�4���RA(�B����R�%�k�N ��r�i��b*m����W�ޫQ���bM�c�]���A�ݼ�[��޸1���b���J���VVV̚5 kkk���iڴ)))),\���5k�}�ШQ#Ο?�/ieaaA��� !44�FC�޽�����!���z?ZX�gϞ�߿����?G��ҥKz�/���틑�Q�jG�9��g�Ҿ}{ݲf͚�7��_ջ dٲe�mۖI�&Ѿ}{���ؽ{�#�(biiIjj�C�YXX�Cs�ݻ7Z��o�����P���}���ҵkWN�:Exx�^�؇���e�ڵ%��P!�O��{B�;V���g������J�P!�1���5k��� X|�b)F�cj|}:{��)4V___����ҥ �6mb�ڵ��ߟ-Z�(���qwwg�ƍ%ڮnݺ|��g,Y�� &p��bbb �S�N 6L7G �>=y�$s������L�4��Ǐ�UQ�k׎��/�p��!F���ӧ�Ui�w���?�v��ԩS\�~��}����i�&Ξ=����u�MLL8p �&M��Ɔ�^{���'''���/s��i�����P(HJJ"))����8SSS�r� �ݻ�9s�ЪU+�իǧ�~��sB!��# B!D����������K�Q!�B� gg�U��o>�ލ�c�ի����w���%�֢��:u0��O��d�[�;x��\r*p +����볢^=,��2�Z��k%�`Y��B�`��大��w�}Ǽy� ��k׮���;vL��(���9��ˋٳgӰaC�z�-Ο?_d{I�RIXXVVV 4��'���Ihh�޸ª� Z^�e�eeeq��i�޽[丂�7���0N�>M�޽�W������׏o��F���U�V|��w�_���]����ʬY���{��7;v,S�L�gϞ( >��|�P��:t(�j����{{{ 7q�DT*�������>|8YYY�KA>�޽{9�<^^^T�^]���_�����?S�Z5������wY�"�h24���C��{�7�B��o�����ё��D�X�*�ŋ�z�j:ļy�u�!!!��ou�b� �F�y��˹s�puu%,,��m�{;???\]]����btB��x��+!�j���'N�������@�`��/Z[?�8��Z��dJ�.Aht�\��6|������j��=˂�D���o��� +�ݩ&_�?����P����ߟm۶�}�v����:�Dzu�V:u�Dll,���e����J!*���H�V?!D��4RbR˄����F���?����ࣸq�&L`ɒ%���oXZZ��h3fLY�V '''������)�v7n|�]�e���~�ᇲE!�S�R(��Ã����w�^��F��˱cj�7��ǒ�D��j�`�T�����(+��ɼy�$q��)�*r�����Y�z�~?.ē�R�X�f K�,!<<OO� �o#--��������3r�HI !��i1*�(�*w���X�������0ڱcj��!C�`oo��� fffT�\������L�J%U�V�R ۺZ[[caa�"+=e�B�'�X�䏆 q75�w����V�!*�YYO���L={Vo�rv����S9�%��j���@�Ç9����T ��8ڴ)�88T��O�B�`��ь3���ۘ={6�7�Z�j|��Ge�B!J�$��R�w��=Vi��!��Qq_� �o����*��+W����K�����ҭ[7�U��������ڵk�>vLL �:u�J�*888зo_�ܟK ,, �Rɞ={�ܹ3vvv̝;�s�ΡT* ׍=u��ڵ��ښ�-[�}�v����9s�n������z�ޮ];֯_������L�:�˗/�J����?OOOLMM�U�s���s�΄���R��;?�RIpp0#G���Ņ�]�>���B�>+�yy�yk�����t�;F�Sh�=..No�J��Ą�O�XB<����t;~�IgΠ&�߄����4''"||p75-� �OEPPiii���X?�v�B!�(_*�7�B�g���)J %�\�R��`O��`ǢE�X�`III\�|��U�>t���|||prrbݺư7�-[�гg�bW�V���˝;w aΜ9;v��_=����ӪU+���O��� �_�N�HMMe��Ռ5�I�&q��u�;f E�;h���X�t)3g���o�%44�3f���e�eq|�嗄���p�B�������q��%�5khٲ%}��!))���$Z�l��v���(�J6l���ŋKt\!��[5##�{ya�R�� ��ݽː��ZmA�?�]�n�˵kz�M5@pݺ*��({������7t˔���{7f��+��*�B!�3�b��B<Ӭ[[s㯛���*��# ��aP����KKK�b%��O�_��^��v�ڸ��q�������><<��ׯ��K���ooo�Q��n�o��ԩSu�ϝ;����Ǐ�_�E��s&U�R��;>�<�ܹ�ʕ+qpp��ɓ,Z���m���pwwǴ�w��߿���ڵk@͚5u묬�044��Ĥ�߃��;K�,)��BTuMM��aC����Ij��W�P�Ą��L�Z-�bcQ�.A�ިZ?��eL���ͥK���C���%�{V��wu�bQ��� !�B! '� !ʭ�@�454�GCƥ�k^���H"##�����ԯ_�FChh�C�_�n-[��%5jD��������>,����S�F ]r��_����q4n�X����&11�K�.�MӦM9y�$M�4y��s7n˖-��ӓiӦW�m���BQ����f��{��g�;��\��U�KD���%^ �J�Ԫ����q�S���;��d�O*��ŵk�?I !�B�w�B�r���U8� .���q����¿�{�h4^y��ϟ�o]�_a E�[��N�������B�J�3Tvvv��/�nݺ����/��† ���bԨQ|��ݶ8�@!D���ޞ��t>��/p��S�p26����#��fVSϞ�[�f8;S�7��LI���9���[��ڠ-�w�B!�B<ۤ�PQn) l��\�-���|��*��ބ��Q�zu\]]�~�� �ٳ'�������ڵ9r�K�.ѻw��ҥK.\�@ll�nYxx8寪��Ԕ�a��ϟϒ%K���rڽ����q�B!��4''����H������˕D)��㹧��vP �02b��9q�( ��\���aΦ��ɵ��ښ�6��B!��I !ʵ�A���R �{nn�Y�FϘ?��RI�.]X�f gΜa׮]�?�X�3}}}����K�.lڴ��k�ҿZ�h�7�`q4h������ԩS155ի$�j�ŮZ,���qww'""�Dۍ=�͛7�޽{Y�n~~~��������������O��Q!D��P(�[���P�Y���j^���fVV��{��=�^���ZT,�]#�|�/]�aXL ���I�ht-E���5���]�Je�B!��4ɧS!D���j�m {ZCv�o���|8����]��ѣG��~�2��B� ���%?կ_������ʕB��IH�Rf&�g�5U��H����bF/9����Zr��J%k��cI�:2�3�aU�yݸq� &���os��%�������O)�g�o���K/����vvv������ߗuX(�JV�\���u��$%%�����s�P*�����E�����y!�B.�4BQn��gkx���32H�O��Ť�#+_�m�Fvvv��̟B�¨Q�5j�߯BQt��c����� \?��)���im����Bz:��?������J��R�B��z�&}N��Z�{.�~m�3�� O<Zm�W���ر�Z͐!C��'`���,]��iӦ1{�l���ٱc�ƍcӦM�_��L�����T�U�V}���qc�j�dggSI�6 !�RA(�(�2r��?��n������ӥT9��䄫�k�?}�B!D��utd��C�V�j���ǎq&-Mo��3gP�z�j��0�z����׮]�;fDD�۷��Ύ֭[�l�2���u���ܺu+͚5��ښ���W� �k׮],\��ٳg����퍇�cƌ!$$� 6�����̙3����ef||<={����[[[�_���͊+P*�DGG@�*U4hG�эyp�h`` J��J��~�:����k��R���+qqq(�Jv�ޭw�'N�T*9x�`����>�m۶���Q�zu�|�M��[�l��_���[[[:t���˗��y�^}�U^x����y�wػwo����\�cǎ���5�֭+r�B!��B�B�r+#W!��N����~�̫���B!� ��x��U�� 9;�������@��۬�v��<�׮M%��O���L^��b�� V-9�U�"77~����@�=6n�H�=x��� c����駟�h�",X@RRIII���ϴlْ>}�薵lٲ��dee���۷o���L�0��ϳ��۳c���;vP�J�e;w�$ ���|||prrbݺư7�-[�гgO��C�ѦMڴiÖ-[��;w&"""��A�ѧO~��w�^�J�>}t����X�p!III�$\nvvv�d_hh(IIIDDD���F��� ��������E�f� �}˖-|��gL�0��Ǐ���ӪU+��_~��W_}��5k�~�z���z��놓��L�޽ٹs'�����r����%�^������_�ȑ#����O!��y"���V��֗a�R0�ʵP 1�ch��a����˗u�8!DyT�CB�© ~�_�֑��HI�K���s��t;~�-���s�4���  ^���e[��\|x��,��;v,�.4~!��y$ B!D��7A�n �S��t��7~�A��l ,K�%����FCbbb�_!J������T*6{z���a�df���� �{��G�r"5Uo;�V�7�R�U<_�Z-s�r�,�S� ��Z[�U �,>Q�RRR8}�4 ,�K�i�Z���8z�(�5z"�rvv���4i��u�F�~�t ��͛cjjʎ;ptt��Ȉ#F0m�4bccٹs'ժU�nݺ@Nkɨ��|�Q4 ����7���H����IMMe˖-������^��~��8::�믿� lڴ)'O�|�k���J:'�Z�f�ҥ�޽����;w�ə3g�%�v���ooo<����ӵkWlmmY�r%��.?��3��ټ��[�n3p�@V�Z���#�:u�_�~�m��{��q��Y�ֳyݹs���`v��́HMM%##�M�6� ,���ر�#\ !���& B!D����ÖH�V~��?P �G��c�G�w߬Y�������h4ih�Z���4h�ZT*c�װN��aaa��Y��: !*�jFFl����äi4�}I���@�st�N +Q�(�[YY 8u�?n��-S��Ztz͚�pvF��6��٣�s����u� �VP��� a������O,]��I�&��_ѢE *U�D۶mپ};NNN���cllL�֭پ};;v��U>���W^a�����c{�[��X`��8��k��(<<�1ȩP ���X���=t PมC����̾}�X�h�C��P(�ر#;vdҤIԭ[�ݻw��/���ƺu�t��w�}Lj# r������=� �$��B���sΝ;G�^�ظq��Rm�Сzf&&&L�<�5k���o�1`��ԩSh{Q�i����NDDD�睗����.S�La֬YDFFr�� ���+�1c�{�֍��W #88�0t�Pn߾�צ�]�vlٲ�͛7�g����KZZ�C[���ߟM�6q��Y�_�^��ʕ+�������IHH�֭[�uիW�K�.�;ooo�� 2g�֮]ˉ'8v�K�.�jժ��>��s���o�z�-v��Itt4���$$$��u� c˖-��� SS�"��I^/!��y$ B!D��Q��z��F���߶+��$4Y���B���� ܻwCê(�Fdd\���+���ڍ !���W��T'�B�+?k�� H<�����X��Z��0�U��>oojRu%�m �B���K�.l۶���x���KӦM ���1�v���� �t�BժU���<������[�nxyy�t�R�O�N�^�tc���������WWW|||�����Օ5j��:::I�ʕy���iذ!Æ #55 ��0""���4F�I�F��0a�����U�jUfϞͼy��߿?666���E�Ojj*�����+����Y�n���t�ܙ� 2v�X>��Sf̘�7�G�|��',^��7�|��ի3j�(����ѣ�ѣC����ߦN�:��@�Z�N�8�J���7����n��Gq������%�Nfff�s�feeży�hժ;v����]�V77e������߉���{��iӆ 6`x��?��f͚ѻwo&M�D׮]�ҥ�^�y��O�z !��#�=|��nBc!�(/�\��[��z��֫Ǜ����s��/ͷ���9�6��'e����Tn����̫;��u�&;��9�!��F���#�{7�:�jb�!,��P<'RRx��q���t�API�仺u��K�lptt��iw��Ų�B "$$����2��޽{t�ڕ .�s�N�����"�����ŋ����u8����+!���"##��PQ~e�bT��e��c��wJ_\x���'31�%��|��� �� ��d��}K��B�gH�V��\��Φ����I4��L<�UII49|8_r��ؘI Q����y�f� Ʈ]��:�G����ѣG������$9(�B<�$A(�(� k1�@�%��o� '��|�a �OZZ<���а���hz�LM�17oX�� !�x��%$�XH�r���n���2�`[�F�И�:E�F��R�5;;�4iB��^v��Ւ8PY=����u[�t|�^�qh7 09+�� *T�D,��cPz:g�f��J��ք:{{�2))�p�����i�|�C�ڹ2;Vщ+Iqq&������p���!|}{������ !��oY��,8z��M@`fx81G��V�W�z������������ W�����OY,��%���@������E�����رc�С��������w�ٖϘ1���h������X�`gΜ�ۇF��>`„ ���������w�u�F߾}��/�8p �ƍ�7ޠ[�n�jՊ���SRRRk�5+ͪ��~��w� F˖->|87n����ѣ 6���`���Y�l�����۷og����|�r =z4�:u��ߟ#F�r�J�f3��� <���p4��{����s��W�M7�IJe�,!���Os��a~��wF�Add$�]wK�.妛n��G�ԩS@�U�5[f.[��������`����9s&���ۦ�u~���ٳ'����b� ƏT��4����-F�x� �����c[o֬Y̘1���H��2e =j�� ;;�Gy��]����K���Y�t�myyy9/��={���ח�;2}�t��s����? ��������3���k�ܹ��Ջ���:�)�B��$�nK��8<�y� B]��˜�P���1�e�'� &�q�������x��C� �߿��B�fhZv�][1���Kh����^���/����If�����jeRV���PY1Zeb�v���%�"�B�fҤI��ʪU�HKKc֬Y�TK<{yy�`��o�Σ�>�{�nj3���/ҢE ���+���˸q���8u��}�7�t��s999�mE���/�~�-��>3f���o��駟���x������Y�~=����v�m�Lܯ=���ݻ�y��1k�,�y��m�v��G�͝w�IZZ��h4ңGV�ZErr2� b��񶶘�{�f�ʕ$%%���ϪU����/>|8w�y'7n�/� 3g��W^�3��c�^t�M���g�}��� qX>j�(N�<�ڵk��O͖����L�>���$�͛GZZÆ s�f�ڵ|��������̝;���{�aÆ1g��������wޱ�*߫O?�4aaa���L�„ 8x� ������w���L�0��s�>}:999,^����L�̙CP���#G��G1j�(RRR��/h߾�m�����_�"##�_|�����<���u�~�z��o��IIIu�S!�p5�+B���� � hyWKBF�pr�����Y%}`:}v��9D��� 7c���]�d��R��ZJ`�uxx\�-s��9���YVר�S�v������?���x`�.����V�n�Fjb"�:�%F-��� �gf�ӹ���ܹ]�0)4�5��f������ f̘Abb"v�TO������ŤI�x��w�֋���%�^{�5>��222��� !!����~�z~�a�2�RRRš5k���eРAh�ZfϞ���Q�r�����o��K�.eӦM 2���~��֭[ǟ��'�v�J���/��?������s�=g�w׮]ٻw/�V�b�ȑh�Z[ҩe˖v�Q�M���?�3�<@LL ����/�U��Ԯ];�suٻw/��������n� �^ϮcΧzfDD111t�ؑ={�Э[e����)&>��s�z=��� _�5�?���n`ժU��������7o�̔)S0`PYY����d�x��x�~�l�����f�wxx8:t������R^/����r�J���k�_!�pRA(�p[z��.A����=�����B��.��s./@��o��4 O����*o�s����֢B� ��ʓ��Q�6\ ���r�eΛu��<۾=5M��F##23mm(EӴ�����~.(�]�j��obb$9(ꕷ�7O>�$Çg���̙3ǡ}� x�Lj����ߟx������'֜�� E�e4�QT��N�FSyC�Gk�>(�� B��f�ɓl-*��{�������ܙ?S�9��XP��}�.��5�=}�>))6m�-�ד������� O4S/��2�����[oeŊ�o����������2���e�>��3�����c0��j�N�,��X�� .U͊-�Vk��6�r�m��}���?����|@ZZO<���S���=�3��Ȱ}m۶��{�uѱեK�.xxx�ڝ���W_a2�lxZm�_��?/UU�k�ĉlڴ��'�a�RSS���[OQ�?����q�M7ʢE�ػw/?��S��E�b?|�0cǎ姟~"22�y���b���j��{�e߾}L�2�_��6�e]?� }�B�a!�M�|�)�p[���b��_����tY��LJvʼ?ž�j���w��2t�@ekQU-�߿��B�f��j����n�<�����ڼF�C�(�_�Dx{�Q�:G�9����z9�h��2'7�[�m��b�r.i�HIL$�ڜpBԷv����SO��/�0l�0�ϟ����1���� 6��ݻ��|h�7o�����ׯ�u����۷ގq��7c�Xشi�mlϞ=���^��?��C���:�L�!C������K0U%����lc����H6n�H�Ν����.;���z=��?7n�d��P�������Ќ��C�ד��b[��_�U�dgg�a�^z�%��n�����ɡ����z��F�y׫�:VQ� &���p�Bz��ikZ��� y����;�x� �~�m���M&k֬q��ƍٷo��Ç'::����:�U���B�N$A(�p[z'��\J� ��p|z:�p���R1�2]�~E�TT�NYYv�֢V�������ۻ���B���q����WU��sz].����G�qz3�О=�~�l�S4 ���C{���}�`��ߦ ?���B� d���<�����8p�o�������F����h4�����۷3{�l�/_~A�vV����ø��w�y'7nd������+�~��}nՏȵ�^����7�-[�ڵk7n����=���A�زe +V� 99�I�&���ew���8���Y�lG�����o��&6l��+��={��a͚5�9k��s�1dȐ����7ߤcǎ 0��+W�w�^~��gƌCrr2�ׯ�U ����|�M6n���δi����B�N��ر#���'55�E�9���5 8�Fç�~ʱc�����p� ?~�����'N�% ǏONN���?o�`II �&MbÆ dgg��?��7����W_}5��z+�>�,�f�b�Νl޼� ������/��׿ضms�����s8N����K!�p'� B����p� BEQ��ko��5�z���Bjb*Vӥ�[4/Fc.��)�t��h*?�3����[���WZ� !D3t�l����&��nM��_�/�ۛ���N���ʰ;8r�J �Z'L&����Zŧr�뭈>�����nB�___����=��Ctt4/��2�ƍ�� ""���{��������e�-ZtAI5g�(�b7�( ��~;C� ᡇb֬Y�x㍼�曵n�lߵ���K�ҥK}�Qf̘��ɓiӦ AQ���8��{/�?�8ӦMcĈ(���ٳ���h4����lܸ���p��Nn��6���{8�}��G�>}�9s&aaauƑ��Ovv��]%88�m۶1j�(^{�5z�����_�ڵkٺu��z�ʻ�K||<�F������W^�e˖v����S^^� 7��G}�[o�e�N��v��Qpp0���*�1�����`�mccc�2e ӦM�u�ּ���e!!!�q�xxx0f̘:_  ��_�Jtt4S�NeȐ!̜9Ӷ����7n˖-#!!�{��<���qѢE�ڵ���f��.]Z�9^��%�B�+PSRR���wu,Bag��Sܶ}��{���׶mY���+�Jv���N�LH��b�� f�W�l� IDAT�q��:L�#xyu>7VBE�1��o��G���9����k��U���}��ѡ�[�U��#L޻�a�CQ���˯�{�u|�I�֎�n޶��� zj4|ѳ'C[�pex�� �ȑ#����K͆2h� �����O��YYYDEE��{���#�4����o���СC5j .tu8�m����у�>��ա� �T~_ !�p.55U*��f����\AX�7ʗ��Ο�/�P�����������8���5Z������w���B�r�F�8|�.9�� k�� �����p۶�|4ɬ�d�H�Vw���:y��))�����lIH�䠸b4f+�u�ֱn�:����ҥK7n����w�}�r|w5`�6n�H�v�HOOwu8��ĉ,X���� �*@!�B4<W ���ٖ�ʥ��.��g�s`��eG����/�jw��MKyy��i��mQ��?�&�Q�������֢B�L����Rs^-���:th�c+�¼.]�,)asa�]�+���10��\������~�0�ε�z�h���������^���hl��J����_|��ҭ[7x���>������&&&��X^��f]eKll��ø,�[�&""���矷E�B!�$�nKW�&� �[�����HQz'��tX�5! ��]�sZ���b)���wTU��#��X1V�����xx��8B!� a[q1K��zzP�ީA:]�Ġ�h��W/z''�U�U��w/�~~��E�b�Zyh��;��֭��[7[o�<��� ��PE ��xO϶ }�C?!�h��?}�Μ�%��m�k�;��j�^~~|E��,�1��{23Z���u�hd@j*� lsTjO��U��L��A��B!�M�$�n�ia=�����A��x��w,�vmg�H���2��(,� h��0��EU����1!�͋��Lٿm�1 ��LJ�[�vUX�jՊ��¨yUb~,(`���.��ʴ���Ĕ����ھj�:���s��-B!�B4q� B�-������h��~���S�*fH�F���Qek�$�ƣxz���`4�����W��#B�P�p�Z����H�rm �B!�h�$A(�p[�Z�V4R;�7� zMt�I��A��-�������d���������OZ� !D3f�Zy�F����048����.��.����kW����u�|bV�EE�Wsq�d�ڴ4֟>mK+T�/>�ޝgڷ���hBƎˠA�\�B!D�! B!��r�bԤ���PEr[=W�t�P�=����\v��#._q�6��\<=C����*[�����=�G�Bԏ���3��ͪ�˝ݻ���V˚^���j�[��*����� ��֔e���'%����X΍io��ocb��ukW�'�h@F���!!�B�I !ܖFQ~I�T& K˻Z���z8�$8��!2���jj��Fq�L�c��ӵDQ*�0**��׷�`�� !�h�J-f>>t�Ё��~�ɓ'�d�~��'4 ��%K�ЩS'fΜɌ3�ڵ+111 �B!DS# B!�[��:6�*�v3�Z�݊^��B�p�@:��IR��`.hܸąSU EE�X�e�t�X�&,�B �D<<ܳ��B��1��Nը���*/��܃� mт;vt�ߞ9�윜�� Z}����)�X�*;{{���@lH Q]FF���f�b�…�Z��_|Ѷ�h4ңGV�ZErr2� b���^��a_'N��[o嫯�����Q�Fq�}��ڵk�Z��5ʶ��ba����߿�7�|�������r)))�5���h���O/�\/^���^z�%v����N�=x���5j ??���|[���0o�<8���~��܅B!�D�@!���A��b7v����z}�����'ǓvM�b�j����v�J��z��ݨ���++�Kii��a�1�)/�����02!� ��l敜��A`D�V���uUX��N��\X�g�`���Ń����M��.��)�����������?k{�"X�sYlB\��gϲd�BC+[��ܹ��s�ږ�nݚ�{��}׮]ٻw/�V�b�ȑv�3f �&M��'�dĈ 2Ķ����wٻw/]�ta���dee����@\\�ׯgժU�=�i�:����(/�\7o�L�~��馛�ر#W]u~~~xyy���hժ��v������g�}vQ�B!�hP�ւ=�c8�yv ���ꇾ���)�DRtg7�m��D],�b ��h��h�0� Q���h��@!�h���ͥ���F`f�N.��rh����A;OOj�XP��33�)/wEhnMUU�������C���qq�MV�޽m�A���x�9�ѣGmc�-b���t�����… Y�n�þn��ۿccck�j3���Jii)���  ���dgg�r��Zc e�Ν�~��u�&L��&22�'�|���� �NQ���?_Ա�B!�� B���N>�9a2� �J�a����o��k�������w~#G&jST��ɔ�^�U�b2���cWQ(���9UQ��Q��_ �iݚn>>� ��t���F[c�\+Pb�r��27r����={x��a�e��k��=���m�h� ����sS4T�1���?����|@ZZO<����u�j?�ƪ�m�X !==��� ���ݻY�`A=�e����s��!^{�5N�8���_��w�m�Nm�WO� !�B�Jr'$�pk-�z�_T �� ���A��Z m�|+�������RV��hLFc.%%���ۢ(���daK���\�B�����C�9I������m0�a7��fU%������uAT��jeĎ,�w|p럝;3�K�D��͇~�u�]ǔ)S2d������ϵ&�.FBBǏ�رct����m۶��#�NLj#X�t)+V�`���>�@@@��� r\!�B��H�B���a�����p�� B�^C�� }��'Q�/;�֨��TW�Z+(,LFU�xx�3b��`0$��a8��B4e�&srs�ǷmK�wӟ/xL�6<Ү�� �� /�O�$Ů$�f37ed�թSv-E5���(�v�P/ !�ݠA�زe +V� 99�I�&���������<�����Ã>��o�͞={زe ����V��u�#G�ŗ_~yQǛ>}:�W�fϞ=$''�h�"���i߾=�f���lٲ��'Ob:�y�>�U!��9��­9����U�B�w�1'��u���l����O�12PZ��������5s�����DZ�B!D��jN� +���;vtQD���H <�$�޳� '-�'L&�KK�׳gm b ��}��6m\��FQ����c��{/�?�8ӦMcĈ(���ٳ�;�~��h4���c�С,\����8�NRR���nWQQAVV����;E;��޼�� $&&r��w�����ŋmˇ �رc=z4�Z������.�<�B!�T ������X���ۇ3e�~�uj�Q�Z��GW����ړd��D5��tj˻[�qZ_m#Fve2� 8qb5�jA�o}n�,K!!!���)s�!Dsv����-[��Z`b�v����u�5�\��ؤ$ �f�j�0OO���!���U�5�C�� NO�`y���Q �5���a``�+�����8r�������:!�����B��-55U*��-X���,~V���V1�$�����w��[����[�o�$��#��JQQ*���Z��RQ���o�$�� �RN�CK9���|3�������h�q ���v��z����]ZJ��T�v�A�V˦޽%9(�B!��H�P��Z8i1�� B�N^��և6�ko[e�����x�2ׅ��b��;0w�dgSe�)*J@����Y�% ��1!������i4<ۡ��"jO��qWH��O?p�M�Sc�ߙ3\��N��bK {���lIH����+�B!�B�$ B!�[ vRAx�lv�����&q["��k�T8��)6�o&���n>MEq���s�� ������OF&��1d�����mdPy��DX��z��EaqT���� U�Q��n��եZu�޶ ��j�V�����������B!��mI�P�֜UV�*����݋ow_���K��-k]�Zje��ݤJ�<���k~**NR\��N�E�|ߘ�h4^ �1!��׌��H�yi4<Ӿ��"j\�۫:E���`���_v�jV%}��Lj�L,���ܘH0��wo�4�B!�B\I !�Z��!��&���WK��=��~�:���,[�n!w~.���|p�XT�JQQ fs!:]�m�d���/O�v.�P!DCK)*�˓'1ר�ҡ��9���(>����Մ���i�9r�aջ���={P�v����@~��#� �� !�B!ĥ��­�4|5����R�,EQ�JBR�ko9��T�=���>)��.m���������k-j2����?�XF&���L�Φ�cE~Z-O��9]�9٪��k��fo���$5zL�EUU�ݿ����v� p{H_���u6�B!�B��$A(�p{�N��Jau�x�������A�}���b�Fo���X+���(�XJ)*J�h�>X�F��2 �D�Z?�(���m-,d��3���i�g;t ��n��ۑ�t��qH���ʈ;(4��n��̪ʃ{��Ç��mӆ/z���ɃeB!�B!�ݓ��;iՔ*��xj�x-��� x�{վ��8HR�$ �6^�MPqq:F��6�F�a������Ņ� !�h,��f͘���_�ՃU�4VEG���0��F#��Ӥ�#4Y����dQ~�ò�����[7<�:��B!�BaG�B�ײF�PKӬ �ΐh�﮾��Vw5aٞ2R���yO&��/�&�dʧ�x:]k��a�����DۘB��+����O��RmL�u���j���v��0n�8q�O�$��Q���;v���I��_ 獈I �̙3 wu 8�����˾ƎˠA��e_B!���$�n/D���e�Q�&[AX��SCī� #�&N|~�-[80�梦��!�����d��2t� ۘɔ��_ z}G(��1�����FӠ��h�vN׿��ߺ5�۴qz�7)+�̒�F��b�Z, ݶ���OS����.]�ѱ�$���]�O|�嗼��;���ŋ�8i�,Vk�Z[HJJbȐ!���p��W��RTTd[����#�}�my�N��9s&3f̠k׮��V>�W�b��M���obcc 殻������X��֒T�Ѡ�hl�;k1�x�b���0 DGG��[o�%G��Y�r% ������ϓ��wɯy]N�<ɓO>ILL >>>DDD��op뭷�i�&>��S۹mڴ�v�|�'N$<<�aÆ5H|B!�5I�P���=<��x 6�UVgH��&�x=ū��@��Jɸ!�mC�Q����"t���L��ڈ����t��;҅� !�h,{KK����1W�F����:<\$���/ �vu���������� ���\Td�[�*9��gOF�j���po���1�>�(�}�{��e���v-F�����k��kX�~=S�N壏>b��ɶu�O�NNN�/&33�9s�d[>r�H>��#F�EJJ _|������CQ�͛ǁ���OY�j�m�f����t�͛��/�̜9sؾ};cƌ`ذa̙3���|����Z�V�׺u�0a�\s 6l`ذa̜9�?���x���{̚5�� �j�*^|��:_׍7�%�.ԛo�ɦM�x�wصk�|� aaa|��g\u�U�}�ݶs�ꪫl�Θ1�F��ի�7o�EW!��RI�!�� �����x3Mh��?Ӟ��f�����X����4[��J��P:>�}k}#E���))َ^�E�|Υ�� �7C"��uq�B!�+��U����T�����m��cAˎ���R��w��`������*����`WI�]rP�(��ٓ�BB\�ne���L�8�Vͷj�*Z�nm�Ό3>|83g� !!���n��f.\����7ofʔ) 0�����/��n�:�,Y�<`�ׯ��ߪ�����g�}vޘϞ=�ҥK�z-Zp�]wQTT��`����VN�^��_0t�P�ϟ@bb"���|���<���v�[�d ��*�w���ܹs���ח��(|||�{>�m޼�n��V�رcG۲���z=���N�-**�w�}���'�Bq���P�����!t�lv�f�o������o��/ޯpd�~o�;��ڇ1�y�[a��(*JBU�xxT~x��**����^��<{B�,/����Ճ�mKk}�~P�r(�‚�]���E��iT�h�2"3�����%�d�ڴ4�䠇����hI Q�ѣGIII��o�����i����^���`����LII �~�-S�Ne�ԩ��ߟٳgs��Q��������x�� IDAT�:�^*�Ÿ��� ��C��� T�!�h4|��7�=��d⫯�b�Сv��r �6m�ĉ��޽{ے����9r��k�ӧ;w�$11�cx�'������a���컈��7�|�EK!��>H�P��Z8iVl�P������Z�Gp݅�j�J�\6w�����b�m^�’����@���:�d���3?�F&��1����t|J��I��wn>BM�� ���粳]����SS�_VfKj����W/nn��%q �Ԩ5�f�Z��7��� ���{�2d�&N���Ç;v,?������6�5[��&��~�_}����`��V[�x��8����9r��<� ;w�$66��S�^ж�� !�B�'I !ܞ� B�2��(�6����`�Okuu�TA5������z4��C�kC��8Cqq ZmMe��b)�j-�`HD���@B!��\��O���Zdziӆ^^� �I���c^�.�*�Vn.�N�j�xr����JNy9UWw@���ML 77j>�~��Ν;;|���ѥ$((�Gy����'�x���~���8L&k֬���>LVV����7b�ZmtU-F���t����v�m�]��n|ݺu\���lٲ^b�>>>�3�իW���o���b:7=���?��W���B!�po� B��`'�P9G͕���Aī��ݏ�����\����G��y3{�Cف�� ����JQQ f�t�?��0�r����;…� !�hL�:�P!b��6ד8��۶ed˖�)�;w�[LJ��iYRS9j4�Uzj4���apPP��!DSt�w�����ꫯ��o�1j�(�f�����^{��2r�H���K���Ƿ�~�C=Dqq1%%%L�4� 6���͏?��7�|cK�]}���z�<��̚5��;w�y�f,X`;FmU���:, `̘1�]���K���O2h� [�_U��O?��cǎQRR�tߣF��믿f���$%%���ϳh�"����zM�n�JTTIII���ɓ��oطo���+˗/g����ϵ�D����TjQ�RS1�H*� ;23<�A������ii�Ͷ����j�!6�~��}}"DC �ȑ#��������p��رc���aÆ �EQ���+!�����J��i�9����p���ϫWE!��l�Cϕ=��v� ������I�Jr|2ǖ�j�6J���x;���� ���G�� ��/ƅ� !�hL'+*�w�}���p[��� �oE8��V��䰱��ޏ�VTĵ���A_�� qq�B!�B�F B!D���e� ˢ����/͙�QhyWK���K���W�W��+(N+f��]��gĔ�>�[M���ӵDQ*[�Z,�� �!�V�� !ĕbNn.&���,fU��2��e���-Z8��pTff����TX����Y,v�A�V�O�{�xn2!D�S[�O!�B�� B4 ���V���Y� tJ�(��������������3�2s��-�7v޿�­� i�TU��8�����m�h<��w7����B4Of3s�zzP �H�6�l���(*��5�#��+*�k�z��0���A���H�{x��wo���.�B��h�"~��GW�!�B!Α��I��鉥�SRAX7E�������ןn�tC�?�F*`��ˎ��/��>���1���o?j4�RZ�O�?晬�8���C"�"„�J1/7��Ճ��N�\Os�ӱ�gO�q ���޾̹�R���!#�2�Ֆ��* ��һ7�$9(�B!��J>]B4 �����:k�Pd6�$��D�Ph;�-������nxw=ז���>U�G���u�.~���3R~�q�}TU ������ܘ�����Ƣ׷l�8�B�^���N������@W��,����N�#xv�~�^Zw���b��Sj���Zxx�k|<=dI!�B!�ht� B4 ��ϧw��qV́F���_��ww_b��!pйU/`�����A6�o&��4��c)���KT^~������a�Pq��~~�� B!��G�Rd���#Ճ 穰0n v��*�#,�\������ JKsh+���s��t��ܐ�B!�B\I !������ޝ��U���3{&��m�tߗ��B tCd)P���(�~]��� ""~�!( ��쨔}G��R�ڦ������d��>����d�i�&�6I{��+W�g�9�L�ff������:z��(d��Aɻ%���dr���bT� ;� �8��͝|��!;��A��m���K�Iӂ������z�p�Ir�XE�B��7�t�Q��v;g��'jZ�5EQx|�d���7��2�ڲ�k[{; KKq�����%%L�pP!�B!FB!İ�f4�����R���p%OOf�#��W9���1��V/p�����O���zJ��v�Z�ݲ_�� ���&��l΍���X,�$%M8�� !�>�����v�p�Q(�J��!�4�X��z��p]/75�{��^/ 7n�Dž���JJ���B!�B$��B�aAQ �"4( ����š�u4�k�3�� X�v�t���k�BB���~��ucֱq�F��#�| �H��{#������w��4))�P��[� !�8��5�?��ߣzp��Ʋ��DM�qzjj4�=`\��s'u�`����zY�q#m��AH2XYRŒd� �B!��&�b�k��}�u�J@xD� �}?�Sv���W��zFj�<[t���5Nv^�т��4�ڌ�t���;�0�G�Ƃ���QX�c�h�B g���� ōi�M�F�J��1qCq1sSR0t�~�;�[;w��=[����X�q#-�P\8hUUޙ9��))�d�B!�B!NB!İ1�j�t� �2 � EU�\�ɬ�g1w�\ Z�1��qc?;w� �k�?]ϖ ��&c ۿ�����x{�, �Zio/�d�BQ��N#����\�(Bq� i�w@��BtM⯎��i�p����S�`9��Wx���jk���}>�ظ���A���ߙ3��p�y !�B!���B�a��jE;�J��@�׫�ő�4)����e~�|�>;���ңgiQU�y5�i`���X����_�J��� ��֕jo�J(Ԇј kHJ��:�>&!�Cۊ�F�ha��5 �TScl6����ז����`���7��-T���ƌ���zl&,� ��+��r ���ロ�����=:v���>���S?���CUUV�^=��-Zķ����4+!�B��1�B��*�X8��̯i4�B�0�2��jV��r6�_��_��:j�!X����u��]�4��D��M(F����ɸȂv�v̙9('~#�j$9y&�24Nj!�8�t]��UT�xji2q�ȑ}�&��+F�䕦&^lj�{-�u��};�N���M����G!Z�����,JKK���8�577���{w�_~�Á�i���?L��zUTTD]]������_�`0�Y�E�1z�hy�DOE!�bP$ B �Vk���~��ǘ��ʨ�GQ��bZ�i���_jF��0���ΰ0���F -�� �O���,��0����gb6�͇"�b�y������qc ���B�C� �D�( N�����P(�F���ׯ�]���A���´i�����I qx��w�D"|�;߉���� �U�� f����&:�8�� `�X= !�B�y�-�6��P gg0��i̫���;�b��s�E���� �k ����Ω�T�;��;rp}�BKY!�8Qܶ����򽼼��GDe�L<=eJ��9#��Z�+�3S��43����G•W^ɥ�^ ��h�`0P__ߣ�ho���X�l���̜9��������]�X�t)������s�e�Q__�}ժU��ʚ5k8�������O�S�-Fw����ŋIKKc޼y���;�5�[n�%�͢E��ַ���/^�s�=�I'�DAA7�p���z�455q�u�1c� ���;v,�ӟ8���Y�z5�=����=>UUy�����=z4^x�Q��B!ġ��P1l��=�2* ��| ����<�L�O 9��f��M�� 0�4EopX�=�����hb��Y����o���ZU��2!������ݶ��6���yy���I�-IO�lH�ה)\��}��%� �{��/� uuu����:�����N:���"V�X��w��[o���_<���D",\����c�=�w���-[�袋zl��o����v�Z.���^��t�R�^/O>�$˗/��?�9MMM�e ZŬ�>pӦM�w�}�r�-<��<����|���{gp9�5���?�z�j��nv���?��O xꩧ�7o_��W�������y������������� ����� !�Bm�.[1l��B��LU > � ¡EQ�8p��`�����I�h�W�p�LI�~��vO$�n�sM$MJ"�L2�� ��TT�\�"�ǃ;**0*J\5����D�H�ߏë--��z{���ɓ��Z !��p�p8ն������:uj\X5~�xƍGEEEEE����455�cǎ�Z�S�La���TVVRXX���K/�n�}�o߾�cmݺ���r�|�MƏ@vv6�{n����t��㏓�]�`����s�=��n�3i�$����=~wk׮��3�d����nKMM�l6c��z�9L�4�{�wP�'�Bq��U!İ2��6�a]g�TY���vF�6���Oc�;3��VGGI�a�C���ޝ^��bә�X�����o���j|���B W�~?�nh� ���W���l3.�=����}?'�6@�6l`Æ ����>�N���i<�����b� �͛ JJJ����g��۶���W^���0�q�Z�o֬Y�p`���TWWSSS��>s��a���|�����k����z�3fp�7�gϞ�;��S!�"Q��P1�������$�ml��ÂbTH?3��3әp�j^�@���h3ݫD��������\�P�k���B��-��9�L���-H#uA*�q�-��B =���1�u~�O5�8v���n����Y �;9u�\r��c;9!Āh��9��]w����__EA?�E�u�v��}ݗ����� '����6?,˖-����g�}�^x��3g�|�rn���~���@!�"Q$ B +� ( t{SZ�u  ����m�� a�,xVi{ހ�M#z@E1*�p@��O��A꟮���zLY&����0ڧ�Qԡ�r�wr���㓐[1 �l6���z���#~�p�����X{p^j*'pX$FP����[Y�ruڍ��p�+w���3�!��ٳg������<��P�}�������BFF7n����K.�dPǺ�� ���)++�U�^��@`�9����W\�W\��>�u�]���{�f3�om��B!�2 ��J���z ��'�i?6�x<[ ��&�(�8/���}�i��.��u�/4�F�a�u&�/�.5�h|���gAC����i�-��)�RP��9�y���S���B .��?��G% |������>\/ՃCBD���������)٪�4��Wg��V�j��b���o~Ê+��� ���+9��S�����_f���7��/\����,.��n���N'��8��S���iӦ1z�h.��rn��&�N'��IJJ���@��W-�'�|�W\�O<��9s��5�\�ҥK?~<����X��E�a^�d w�u�6m"??���4�F9�&�B��O^�!���>B��}> ��P����͘L�(Jt)\M �i~�3g�t�H��ɸ{������f�^jµ�-M0��t�>���z3ͯ7��M�q���E餞�J��d�)������E��4�$��֊B$J��6�J�sP��see\�c�V��N���:W���s��xz���|���m�z�wݞ=,IOgbRұ��'��Zt�mgAA6l�W����կhjj"??�%K� �Ũ���Z�����'\y啘L&-Zĝw�y�y�5���s�UWq�e�1i�$n��V.�첸���z{���N^�����Cz.���k���bԨQ,Y��k��6v�W��6m��\@UU�V�b����!�B�cM����3{��D�E!�U��2�Oz�?t]#9���p�k �\�C��9h! �N�_m���F�ѳ� �oG ���H��2�rtC�B��$ROM%eN )sR�O�'�5�B/t]����W-v�0�<''Q�n�����y��<��5nﶶ���=�F�R�����ǭc��y !����z���\���x�w���{�0a_��=5!�B���B�aŪ�d�4����t����LY����lDӂX,��x0XCR�x���K5��/I'}I:���w�������n+m+ۈ�#�� z�C�|�U&�a��M�x�y�y�&:�JrI2�S���6��ok#!�]�hia���*���Ru�P�UWsCyyܘ8����)S0v{�� �g�TN]�>n{��� ���d~j�1���pM�8����^o��� yꩧ�������������jN>�d�����կ��s�B!�Q'�b�)�Zi�xb_G�]^o�&$��߇׻�9?6�xPUSG�࡟H��D��$ ~X���l�к���wZq~�D�k��v�����_õօ{�=7$�ϴ�2+ږ�>ӎ}���pxw,�ǩ�**z�y6* ?���kq ������F���BE����l�3����b�{��� w������#~˗/g���G��B!���M1�LLJb��w2q�׋��VWbhѴO)��b0�b�@ ��%X,G�D�bPH99���S(�EZPõ�E��6Z�n��΍֏����� @���� �']�!*X -(&�싲)��c�<� !�gn7����vNY&Sb&%x���+v�3�@띙3I=H�w}Q�57���k5Z��={��IGm�B�#���(�SB!�Lj��B ;S��c^Mc���h���=D��|{���a������m �$'�8����U��H#�4F�<�H{��h`��<���:�G"0������@����CL��I�& !�����ۍ���D[~G:�Չvy�t=����6��`V,���>_��#@[$�ʰ�*fUŢ(�U5�_�1K�qE!�h$�h$�d"IU��� ���ʗ�m� 9�� IDAT���l���%%�0���AQxz��~� �Zע����:.���KYYGe�B!�B!GB!İ35)��N����% �"�FTՆ�F+Bt]'�#5u>fs�1���n �d|1�1��!��mu��8�8q�F��v�mIT��:ڷ�3���G��Bq�mko�c������cz��q��r���@��D����� ����1�h�}�},�h�p���\,ݲ�H���O�)+gΤ�j�q��V�8�oP���ڱ�S��%�b9�s�xT[[KAAA��!�}���M��B& ��δ^*���f��erU���޾�@��m|l,n�d��n����Eӌd]�Eօ��-�Ѿ��G���N�5A��U�׻Y?g}�L����U����qc����r��0�+�(�~|��z����M|��o2�d�,����i��_?>�s x|���Tn�������v��vF���3&SrN ������]����K��<���~F"޽&0�O���tPB�����:��0��0{:� ��(��u��iF#�&Y�> ,�, �V�,�,��A������6m"�i��� XT��Μ��^^{��G����fV44Į��w$�����kӧKu�}HII@�4���<!��_��-!�Ï�B�ag�͆YQv;���:�<��J�&v�޾ �1E1��B���c4�&x�=�&5��a���Wmj�>v���E��6<=�6�*�3��V�� ͠FO�4oG�� _���E4���h�kc�G����+(�Q��1���8A�(J�w����N^��5<���9�F�'e�ʘ�p {Wŏ�((�z� ���Ht�����`�-r�K����`�`:�,w$Be �"Z%�>���j'�2�(�Zm�Rd�Rh�Ph��>�6������>�KK�D"�Ǧ R_�>�9�C{���� ���F}0 #�--vuU�E� 1=w�Y��f�!zF���#]ws|(9��e�XFݞ:޸� *�V�i�]7, /��v�u� �2���W�|��ԧ�f����!&�>�W, �0w����|��{�w�܏W'��<�qX���s=���B!B!ֻ��HǺ��̊B���(��Q6[4<�V�Xh��bL�۲�@�ť����=�uyf��LO?�c���k�����횲2���N�����/���/�8��B!�' ��RIr2;�޸�Y��~��IC��%���x<[1�F�*'t=���IK���0�veC�jVq���q���k�� =<�׻q�Ƶ�E�!Ա���А�mt:)s�0�m�� $�q u9�r(9�����Դ��^��������z\�.Y�'���Ed�g�m �X��:v}����V�R�R{�X�^�4������'VS���֚V,v Y�Y���&/�ۮ����/��Q3G��ۋy���+�c��Xv�2�=�� �o�Y�$w|.g|�>oo-FK�,��_`�7�:"��^��֚V&�6���Ϧ`J��D�J����4�7�Y�I�9%�����,��"^��X8�36�K~wI�8�d�g0󬙽V5��|��'��Y���Ŵ�Ә}�lF��f�;����7�s��4 G����v�i�ύm۽}�?�o��-�n�����؏^�(�7�ઇ��ӗ>e�g{Q *�ΛŬsfaO��;S���������&<-�r�5s �����>6�wk].*�7�S_!bP���?�C�EQz�QM1����t��)v;������D�Պz����a�ܴ��@�G8����(���^���� �see\h�D��]�*�F�B!�"a$ B KӒ���!nL'��Ρ��G���x<�D",���x P��R���’k���B���ؘ������i~���F� �$OM#��b��,@�?]�:��3����W���]�]-1[k[i�ia��۹��W��,�:�Ε��x�^EA�u6���ҷJ�Ɋ��­=����_>�|��]C����5��b�+�䅓鍢�>�U�������g� �(}��_�� TC�w{�����tO\�R�BKM ;?����^\���߉{������x���>�.�7���}=��ʇW��SDS�|�+�i�hb˻[����%� �DZE�n���ܯ���t5�=��P�%DtG"|�vS��u�@�( 㓒��=8��k�bR�9$�i\�e ��� ���c�vnn���ߍ� MM��|�� ����d}=�K�Q!�B!�H ���Ԥ�^O�m��pH��zwƅ��@�$'�BU��b����� ;1�$� f4��1�� �i�)�����q�nO�oF[�)�„��h��o0b����/�Y�I��j����y�����_ ��� s��0���L8u�f7�Wo��틷� g�3�3�q5�kx�oo�i�� L:m�O���./cO��_?���y��ݴյ��cs?��0�Il|}#�[uH���Ǚ�9��Kg��>�������x7���୿� g�;��/`������7z����H8��S5���y?>��������d˻[���+�ǘ��0e��.�JF~�d+^���7KY��J"���C.����C��;[��/]�%r����ϟ�q#�J��ڽVn�����KFs���1���O��ܭ��x�O�p�_����D����u.*p�͒m���&aVU4�kF:����¾�x���ۅuO$�+���ok8L[8�3����D�u�B��y�����u�������Z��@tM��� 6�~:)h���;v����g���B~VXxdL�����ɜ�aC�ۖw�͕V�B!�Bq�I@(����{��4) [:N�����O)�`�j� �b���f�yr�x�io߂dz�Hă����G0,8s �дv��`���T�[���յf�-��?���gD+��m�G8�a_~���p68i�i%=/��ue��/|� ��3��‚o,�aW��T������b����Nն*�>������*���?=���42 2��ΖX��71��_� D�{�u=�f���/9�r8����~�t>�wtm�=��0{�l�Mn�*��C����4�|���+��>f��q�Y6�������-�Ξu{b!^ZN?�1{>ك�Ń��w����C>vws/�����3������a�7�3q�D�|�'�myi9�}��Ǩ�VI$�`�6�qsy9��W�렜�p� -�ls�kw M� ]��b��]�H��-���u� ��\T�׵��C�P�������X���K�U����II�HN��Qq��{Y��w<�fNst���:\_X�++���v�}EZ� !�b����;������|���B��f�q���s�u�t; ���(����׺NŅt�����tG��_�߿�9?6�x�u�����{�Ѵ >�n����  Et�����1��im}�cII�=�!�k�J-��\�������m�Z]C��*�h22z��>�픑����U͒7����.�����b�`'W�+�y��V}y����^�q0��n��b��<������%��c���# �,��`4 G�u�������gV���z�'� ��u��֎T%�� ���C9vw���mo�v�L~w4�l���wF�t� ��W��=?m�nh�Ѻ:>s�1�3��������c������9��8�a�EU�6�9���#j�Ajj����>�{�Ѫ?UQ�:}�0΁��@E����[�Ш(L��I2����1�%��<8a�Q�������n�F#�k--<����G�[�[b�5�wV��^5��(�� �u�v���k@�E4U��w���j/k�U������#R���]Fvq6��*y�Ǐ���s�m�ۚ����:���V���i2�_4L#�bL!�j��1�����[!h���������Ύ���� .�7�o/�@KW5O8�FU�$'�쨪;>��x<����DQT ���������Z��x���d`ܜq,��2���3@t}� �N`T�(�f#�`��w���uL�?��LKu ;��j{Ul=�q���UϽ��;�<>�����öU�Xp�ly��]��i�������N�vO-[ߋ�( cO�.��hZQ�:�vw-��� �N�Ć�7R{сH�L!�8����h�wx����g���q-6�[z�R�����!��Ա�+8�g������M�J>|�C�s�w�*–���F�63��׳�ᕇ�8��9cY��jt]��?eĨ������m�m���r�o.��O.6�q67��o��Y�v�d]O���D0����|����2~�w/W��pu^ӓ���{hQ�ш�hdRRR���Ns8L���n��]^/��^�y����bU� Ă�#U}ة%�;a21?5�S榤prJ �#Ҟ��¯���CEE�q�D�2��k/M�&��B1�Y�,���_&zBѧۖ�F�-0�m% B [S����Z�6��K@����}3�bCU�Z�B�$'��b�;���Gt���x<[�4/Fc:�P �j%5u!v�4 ���J��L^0�Q%��W����{�st.�\s����������Ϳ��_VQV���~|�;�i�m�nO���\�6k���G����/��� � ��� lx}Cl;EQ(9�����}I�ʼK���5h���������($g$�i齒`�g��m����_=��i|��|��@���j� ��� ���/�ꝯ�i��}�v���w�A���O�\�'�S����f��n ��bos̱�P�V8���/;����P ċ|��6��;�c�.��p����w��[--��~��GL�� �����,HKcqZ�&SG�ɢ�<9y2szi5z���,IOg��B!�B��N����3{��D�E!���x�ڸ1p�<9��|q��z��� �Z���zw��r��7�#��ߏ��i�:�)(�J8܆�Z��Nt�! ����T�<~�w/-�p��������ly��h�� ���qFZɆ�[j�\^έ��������� �jT!�C��B }��a�� B _� I��W��=���u�8*|�r�J,���X8��`H�n�����p؍dz����躎�4�P��1���%$'OEU���:�N/O�� TUŞn���-ұ���p��%��--=�A���"NOM���^kn���/���;�����J��������\�<R�F��������^����ӱ�*�\.�;� DÁ� ���S�������O���9))|1#�3��8���%���<����Z�����3��|uĈ�=p!�B!��"�b�R��II=�2������8b�t=L{��t�ڃ���30���ZB�����vJ P�ٜC8�"n�n���NT�؊�ǚle�Y3��^��Ń�l$uD*9cs�w�s����&v�a]�c��O\.n��ʂ�T��0,INFU̪ʓS�p�g��G�ڵ��ii���W!��؊�2M&��I� !�qOB!İV��¦���I)��0���2=99q;�������c���"�j�Ճ�P.�gx�;PUfs�`K�)��NT�c��l�_]��i���vV��ō��33)�Zccy 7�ˢ"�im���^njNiD��盚x����6�p�ȑ�O��<��sݞ=���W9�dfrW�p`���9qk77�Blp�Y������� t0�ag���4�nm��V4�a0���t���Ι���T\�-�Z��;��ݻynڴC�V!�B�K�o �l���"����}�Ӆb8:q�- !�KS�������lno������V��j3�')if��VҴ ���p��;�X����D�8�HI���`O�4�b��[uu��������^�7( ggdpvF��������*��zw���f��Ǐ����޽\1r$W��Sr�.�sU�TWǍ��RR�ה)� >�d�|�[h� ���aCG��Z��ʎ�p ?��5]�/55�B̑&��H$�Mx��� |EZ� !�b�t]'��G"�5������ݾ�r�y���B]0�O����������;B�aHB!İ6�n�q�IQ������ï��p�����߇�R�D�(���>u�T�U�\�����h��lA P��Z�Q5(o�b0��0���� `��Ƣ����̵X�Uq1��������y�#PhU�N�z�uu�U&軻v�(-�li5*�Bwt]'���>4��HO/c�}�Dp��x:��j�H�� jm��Ԏ���g$� ���Do'�U��������v�����\ gԿ�Ϯ������(��À�B�am��gEWH�)=`]Bq��F{�VE�� ����Ņ�CU$���وdz ]a� բ�&RS瓜< ����i !İ�H]��i�k Ω� ��A����j�^��3������͛���� ��\2b��$(\���7w�3)oϜI������!�b�k#G� �j�w:Y���ۭ�|~��aw�H������ �Bz:VY_Z!�2"��+�5������P�xK(DS(DK8�;Ƨi��)D_�V� IDAT�t��ԉ��}�~8\��I����ĉ����!�Vb��kq68 ��H@(����fR ܑ���% <�� |�r,��ؘ��u�E���_���1~fs��T`����8eX�B1i��_*+{�DIRU.��9��4��EQ?+,dU[���|S��jM�^/_߱�_����EE�on.I�x]��^/˶n�k��&U�3k;6��Z,\:b�v�� �ok���v�&E!4�v���\�e VUeiFeg�43��hmI!��h �:�a^k(�3��6� ��񹳣���gt� �t�k���t\���A�8����]p�gR,��YQ��*UŦ�X;�uE"lio�:����|5p���[�9%,�ŲDOc���991tȻ*!İ�( S�vֺ�_�5v\�v4������ڃ����x0X��Z��R�����p�7��G�5���U�����$'ό��B18o����c}�N�ssI>A��(,IOgIz:�� ������j>��T��y��:��{���r�-,��|2��놦P��7m���8�b�T�8 �� �A�ok����������~M�Ŧ&�kj�,LK����,��"�"��B!D'O$BC0HC(D}0�y(DM @]0Hc(�3�5XS���Y97��fE:���A�BW�_�R�$����l0�l4�0H��<�` �`��v�{LJ�#4+ j?��ɟ}������n�h��l<:��/N���s�w�`�Ic��߈��lpr���F�u�&����� @8f�sk���NZ�[�u���,f�=������v��޲��F���?~��x���Udf1{�l�.���l���R^����~�����y��G�� �/ ��� ���nw��K[<w[+G9�@~��L��1M ��a����(C�#�����ofs����c������B!�/UU�o~����+�l�g�������N'�԰��q�W��@[$�������������ia!�Vk��&Z@Ӹp���-��0��332����|u����w����x�������s͟�D���������X^VƬ�d���͗�����$WL !�8�Dt��P��P�G�W��yM @}0Hs8���6�]d���誳*�sN}Ǧ�����d�Ld�L��Ld�d�L����{fEI������LLJ�Q������9�!��T{䘑L.�jG��q7�I�L`�;[�;��t�I��q�?h�l�*���WQ�������.�q?�m��z�g n��D"^��1�u(�Nj�i���$U�Bq��zy��5n�,JKc�Q<��( ��X���=�O��q_M {|�aeo4 ���W]ͽ��\:b�1#9����p��wv�b��wrN!���Uyy}�:d�4��d�.��jk㕦&��������o�x���pCy9��V.1�/ee17%��*!�"Qt]�)�2����ڎ�-�����-��́�t��>*U �h$�h$�#������wܖf4b�k�v��DOA A�o�R�Vi�X��%,�~�ϟMՎ*4Mc˻[��|6��K���gN���ߎ��g]u3�0-���?ߣ��R�>)c��u� B��3���:��/�c�=F8f�G�8�k�Qrv %g��K������(�����o�8H@(�������X�$��@>߁Ճ!t=��>EZO-�P .��x�;1�1����˱Xrq8�c�%�ſ�_c�#�;!�8ͯ�]�������q��[�5�d��B�-(`U[wTV�FKˀڏv�����nh�����������C� �?TT�d}}ܘ8+=�;ƎM̤��n��(*b�g���v׹m��ϟ++�cEY&_����l�� ��B!�M�i�#����Q���3t��FEA�h�y��w�Gw�4) �&9f3�f3� #�fF�L�4����:+�R �!��G�������/�-��[��E�`�73����쪡qc�v�5��Aٺ���o��6o��v��ٷq_��PQκ�,F��^\�U�Eݞ:�wT����&�(bhZgq��L��{���5N籟�q.Z=� ]�`0tU��B�X,�X�C�J;]��zw�r�%j�j-&v V��<��T��ĭ����MO��2�й!��h�P�е�6W8��uu=NhX,���v����8=�����ho�Ϊ*���I�ο�ﶶ���Vf''scq1˲�0$�d�3 ���_׿� �`�sSg�σ���W�=�f��[,X,q�_,��L3%�b��}�l>}�St]���R��� @��\r�G;p�RG��Z�^����B���@줨��ߗ� b���w�B��i���������.WB��W���дCW�f0؀ٜ��6&�3���W�t~H P��R������b��!5���p3�L&�:��T�w^��#�}�l�zBt��ꅦ����;<�*}���N�LzB �C -�E���"��e]���?��ņ}�Etł����kh����$3�~d2d�5��yxHN��{�L2��}����f7�$1-<���t�P������’���m6�p�†ɾl������lfDGsOD�((�k63~Ϟf�� I�Ǿ}��d�.�$�09�~[�z�5-_��ph�P�$� ?���]Y� �'a[ 6�]��‹99<���0� �/ݺ؉�� B�j��f�#����������}6 �*�Dyy������E��Ѯ�#��Њ�؂p�9��°�aD��P!�?��t�?c �v��q݇tg��ۑe�eo/��)��EME E��رt�& ���>��Ͱ�a�K�ȲL��l�ĉ���&� H�Nᒀ~(/�hSIE����X���;�${Ё�QC`� ��]}_jk�`0lA�m�tݱZ��e������Rٹ&OA�+*+�6�=�T��m��t93���J���p~��`N^ ��S��r��dz�x!'��##y(*�p���:h�۹f��G���Oz�dd@�Y�vG�����fdf��d��j���l��ޝс�� ��D���Sy9?����`@�V�� m[ � ���� Ꮀ0� B-&gA.h-ef�Lv}�oT�!�i0�A�v%� t��3�H��_lC����??�E.H�V�b׊]��Z�����];��C��ࠗ�}���8��{�$wO.�y������y�\�$];�yZ��"7y~�qIn8�� �K�c�[SO|'���xU�S���l��.����wH:���A J����f+C� E�M�����a��z#F�^T� ��n��e��t! `Zm�X1ur6o��[o�u���SBCy$&����'��ɱ�2ݿ��&S�>=͔��'3�lx(*��������}�����|n e��P?���ۛ^11̌���fcYE?VT�sEf���`aÔ�M������ee�TL eJX�}}�{A��T��A���g�+x��,����k�ذ_`����J�Z-�-��Z�����й�����w�2&�_?�k�����S��4�ht��ߧ��.���*,& ���t��B�!݉�� Ir�ţ�������*#G6� ��>�(���6�� ��@_�'}� lN�X~���b���V7�t�pT��?�C3�,�B���c6��� 8]%E{x)jup��M89)&�c����Y�@���t�����蠩 ��a��UUm �Ϗ���ͅ`��?���Cv]o��3�����j9�YfaI �-.���������� n�>�:z�UU�����.]x)��(�}6)%������m�<�����>x�{�ƺ�����aa~,/糒~��t?�Mb7�����y�������fZX���q�DA��ɲL��J���A׿F#�M&��V�q'����I"V����7�u:u���]�1� ��SG3z��v��ix��GOx�R�䒿\�%���>����[����b�m�uۨ�[@A�$��JR||�m4z�[d��F#�/� ���x�����g���V���u�>ɲ����q:���c�Wb�W��F@�0 m��M85*//T=��Fi�3AR(� 9���s����f�t���QQԣ���1�G�����B�8v�R� �,l�R����%���Ե+/�Ǔt��NA�G�H����{��H�R}}��kǎ���h���|�/:����TrKh(���Rn��ui)��^S�j ҆�sM&��bVVc��Đ���3wAlN'�f�;�a4��h�Ʉ�Y��ߐ��R��}�LB?����^�`b�@`�FsѼ� � �� ����@�L���j < Vk)&��&{���^�R�s���p�a0l��v'J�^^qX,yH�������� I�kug�u���JF�Ւ2~<�n����d�1 %2ӦLa�P[^N�I �:�n�0 ,�Yr�ө��&q�(R&L��W�hc?��,~}�E v�F�V;t(W=�$�]���9�r%k�|CQ�2b�t�r�G9��q`�2�w�D��޻77ϟ��˫�l����&��2%��7�CCt�m�N��.�ў�k�*/� �摽i5��DD0����w� ���k��hkcrx�*�<��>���F��3甯/g�������f���?7z~��T<�CQQ|UZʫyy�7�Z (5h,}W^��2� 㙸8b�'�heEe%9�Ѧ��j����E�z:.�E���[,��dz��Ե+������"#�/2��:�p ��յ�e���������)��[7���qi@��LA8 �v�;��k4�k6�__���Mn+�<P-I8d�㵡�ZM�NG���� �VK�NG�y�7� � t ������MV�K�/�,���x�ӈ���}��� ��`����y��R���SW���W���l>�FF@�(�ژsާs�VW��ɓ KNƤ׳�Xp���ܾ�#�W�����?g�C�$��K/a��d����-B�wgشih���\��g�Bv:�3~|��v:,��_ ��c��c6X��|u�=���o����Wӧ�g�x&��2�7�㣏z��/��d���2a�lƿ�"V�����V�s{��`�o�o�Dn�7���Y2s&]��4���㜮�:��� �<+ ���4�ڹs���wN��g[c�s�8�~�i~y�yf��T'`�����R���J����NS�K�Pp{X�CCY���Z^�VU�Lj��O��YXR½<K�F��m�7��}�J`*%��}�}>x+�|ҫW����nw:���a���{��>��t<��11쪭��>+)��fk��m���s:������$h�<�԰0��Xh#�p1�e�|�ţ,�~��&�6��8u�}���G�$s��JE���УQ&`�V+��A���'A:��-d :���zdY������� ju�&��D��?��1��P]�v���;GK����D� <��9�z]y���.@x�>^�����~��Yjj������g|�=J����v�ʨ��;~��*sr8�bE����tLUU���o�\{�u�уy�^Kua!^� ��Pn|�]� �j4����v�'�N|�t!e�����amd�� B{���'� <%�݋sd�Zw�����X�Ν ��n�9�,4�&$1����lj��˵��(K*��>((@�s/7'�������#Iも�>��7���dYn3��a�� �������x$&�� �R�������t6�0�49�!�����|2.(��CC����=�v`ye%��ʸ�[��n�*I����??�$&�V����q�[�mf��66��#�W{����q�>f(.�����Pv~� 9�6��m��J�v;�6>`X�����A��޽� ���e\r�]^���#�$16(��AA|УK++����e��8d Ͻ(�P�t���B�/,���@����.]P��sA: �,s���� ���v��Rh�������[��!��qI�x��~>>���!����-�A�,BA: I�����ft��E��$�l�L-d���? �:����P]�����T]P�1�sP(� ��w�"����7�߹����˘3��ŴiXM&�㼚d-(\�Jc榧�ӣ�2v�,R'M"0*��_�bЭ�$Iȭ��s�K49�������=˗�����+X��(5�Y� ��wK>�9��n�A,)�@�;~��M�Lʄ ���g2~��u�ϸGe�ԩ���d����y��BTx���GDtP�νp//^JH���X�]Xȋ�����8��ɳ99���ϓ����V��Ç�VS��R��v�鸸�z_.!j5����� w� T�l<��ɿ{��L:���v�Ʈ]���X\V�’�WW��3P�'����Y�����?##�N��"���fc���W0p{M F#�{�J���,8��$����*�h��!Q�E�IJ� � …DA�T�������cսJ��`0pK����L����5x{/g��Q*����uN�`�����d���+��˵�`(���=2;3����%K��K���*sr���v��l�_~I�!���nw[�֭mY����m_|A�^�.���k���Ԕ��˒&���?��]���-�/v�b� a����L�/��:iR��N�m9��k2���v�o��U����O>9����IC�Q�ł��gd �������A�nj5�t��!}�H>J%���fzD�0;7���Y�1'�e�fff2'/���������ח��z��ô׭ݺ�����UU��A0�������(��L R��{D������’�/(��jmV����|��G��x2;�ɡ�<E�� ���.�6�������쬩�ĵO`Ӓ� NT�W����7}}}�ـ�}|����g� �pBA:�a��-��^�!��P�lU�P�=�=�ZK��Ԭ�l�ZK���b6C�Md�ꎢ�%8�:����|��j�LMe�7����������Z�fv'w�%,{�i,[F`T�/�"��}� IDAT;�� A���C� b�]w1����԰��0�W�Pϱc������2u*�[����/�'pM���+�e"RSQ��Z�$��K.i��9g{����������$_s ������9�v-=F�v���l��3����v����IܰaH ������ơ�����y�k��l�)��GD���'�|�Jf��poD��j^� e�ˡ7 *�`���}�����ׯ��D������;N��5�>^�Ry񭾿ꩧ�0o_�y'A11����.\�(�$���Y��}�����,~�3��N�ر��1��O<��m$��;���/�Ȓ�3Q�T� �UO>�>& 2��Λ��7���;�$j�.�׿X��� u��l�?����R��C���7�o��9gk���Ɏ�B��l0��YԖ�ѵGF�`�����Mz=��m���}j����D��Ga�W_����H�4����9�5�l�������[�=P/f�*O����H����c�0� Pؔ|��B��nQ�NNj <����=tG��x��1���=�}PIׅ�p]H�uu�+,��B��f%H�[ n>p��j5������4�{eAν����l��!�``���1�hV �?�5��$�������������_|�A� ��۷og����A�3"i����5k_��ʸ�s�oޅ�n����$I�Z}�L\]�Q||R��][������`�(���n�c����;����(�g�4<<�bY�g�xf<�TGw�[5g��g���g,��l�S�{��0.]J�$���R�m����,0�U��wL�sU6o���ƱcX��fYf�����+ \,21Z`�em��~��cLՒ���4zt������R�)(`[MM�}:k����kW��P??�8 �p��N'�\��� 2�ꐩ��h��ܔ��E? B�j��2�!��CoJ� ���Q+ע T��?���#�Ъݻv��;�|���i��;v� BA:��d���JNm���v0�p��j��mG- ��>g��N��a 55�P�Q�C�ZKq8j�����`$I�X;�m��cb� A��EƊ���+R'M:�@��8� �g~a�GF�O<��*9,4�V�||<FE��c������+)aJ�����˼�=����g%%���ϑ��fY� _�1���A��ⱘ� �O �E�!�2�<��{�Fwp��b��>7>F�P0���#����X� ���j�3��V�bx��[<-�p�6���ON;5Z� �BA:�a���Vh��&��,���V�L���*��z�����ǧ�Y �9�TU��d:�V�$�1�3Q* �NƯ)�׽��qNAN�����Y�L �-</1��n��F֞�¥�����!;v0�K^�����ŷ'oK���竲2 -w�P.*⃂��V�x>�2Pa��hV/���pt4DF|�?ւ�Y� l��f}u5�  �8-�~�to�8�������3ĵo��@A�DD�P�NG)I ����j�v �P]-��0c�����{��4#˜��A�� �~5fs>:]"fs&Zm,AAcQ��~�� 盦� �3�{�}Aۥ���ڽ{�u8�U;� )� ]�0;7�yEEȲ�j���$��EE|QZʋ�����"��*8�[�u��R��9���2�cϳ}��4����ј�UT�nA�UU�X2��p�|N����@d$GG*�� J��†�j6TW�^�^�ѝ���ׄ��@�,�RqI@C]���~~���pA��m��ߟ�/����������VW�f�Ԏ��)��;�;���ѣ;�+B''�� tJ#�h0xL�(%�����ف=;?9FL���TAH���E���6/��3z=���~Vk:]"���l�B�K (h,*U��� �pv8��ݍ �,�L������Sw��1=<I�x/)�Gbbx)7���(tP�%��ѣ�_P��II�;�a�����YZQAu�2� �C�8��v^fӨ$��BB�.$�}F#����EI�Gf����9��~�s�����h�۱�� �C��g4����)�Z��ف-=�7>�[� �Ϗa�R�C����h���p�k-8���Gw��M6/�[���L����LJ��<7z4��v��~-ص�iK��|���w���]}�ٵk�t�n�|�\w�H�$��sBA蔆��7�r��2k�d ���b�����p�9�dَ�o_$��M��͹TU���0��&"�6��l��� ����]KA8�|�Jn�� � ��<�+/�hS�}}y?)�c F�e^Ϟ<ˋ99����Y����uu\�{7�t���I�����8�u�hx�G�8x���r�f^���ń���\;����Yr2/���F^�h vVY惂>,,djh(���^��� �/ʅ���f�^�&����.��o��R�P����$���0�Ѿ�=��Q� bA�4�\�U7*L&�~�1�$1{�X���QXS�G۷3p�<>�4�{���nz�����.t8�ݎ���Z8�"B�4�߿��|��"��p�F���b4�C��k�=X�V�V{Ʈe2A�_��iE�M��`6���݋���Q*}�صA��K%IL ��<��:�,�����l�6�R�C߾h[) ���q�^<� 99,,)i6�ܠa_�啕,OOgft4����{�=>SBCYP\���j�b1x%/�[BC��s��׈�jy7)����x�����󛕥u�2 ���Oq1�t��㱱��� ]{˅�4�n\*4H���@F0" ����x]ĥ����Dze,ܽ�s��`�D���6+9z�⃂H e����Z�LIM�1c�r�>�ܴ�2����q_Z�G�ኣGy��?�(+#-2�;RS���|VB���W� <�0!� g��`.����j徥K�<.�.�ެ��a̧����C�����/ڻ�w��9��F�9%����#18�}���I�����[1���5`����ղ���-Y�1�w������#����y���=�{�˰9�|�oG��O��;s�J�>́��oq<�����a���)��!& �'F�br�~��v^^��o32��� ��fr�~�4f �l�‚]�8ZYI�.]�%%����%ܯ��'3^�˜�cG**0?�� ]�b'�� tJ� � �R.�m4���vp3�s]��xw��iC�-���E���K�Ѹ��w@�V��i�l���'����(�b� …�.��%ʋ��!�����߬]�OI!���u:$'�xl,333���ǃ��5L<�����EE����m��M�$I��ٓ>���~����8p�3�4^����h�1'/�2� �������ee|QZ�Đ���e`L� �ߙ,���偁� dd@I:�('��+��Qn2�o0��_� ����^Ke#:t������m��<�b�%���;�š��|9!��L���d�w�����|8~<�JKy���9XQ�sm�Yw�?�{n�I�ٴ:�o�^��ǻ�����wo~:t��v��%M��n�Q�H !�����n���}����a�f3���O����"���u={2��y�_(�1]�i���OK��h�}��v���j4T�L��~=����4au8X�kO���}yb�j�f3 &N$�ϏC��؝�ߙ���7l/,d��A�5%�j������˲̜+� 1(������q#krrXz뭭^�=���C�����W������� ��i� `qY��5�$���Z]dىɔ�$�=�6[MZm��NM�.��סP��hBq8LX,y���'0p ��?G�B"����:�Tm�3~��N'r���ս;�������Yҷ/k��x����L���m6�<Ȼ�ߣi�TX�l��t<�cYY��-55�/*�����S�����|VR�K����A�����P^ΕAA<Lj��� � �,�����UU���b}uu�˅J��{o�e@?__F���#�h�����j4hU*�J%�ڑ��e�7i*��K����c�۳���&��^��X����=��o�s�Pf @��PdY晵k� F��ѽQ�Y{����t2�W�>�gO4J%MJ�ȝ��N �_h(�s�r����!!@} ��p�Ս7�qU�X�ˎ��Q��(���kKc��,�S��Q�Q*�y0>)��v�p����h���ܜ����� @\������Xz�0 o���Q04*����Æ��� "& �a��bqߟS/�:��o�� v�K��BA:�K���̣�&����wP��?Vkfs.ju7w�,�8��P������=TW��R�Z��a�b���w�+8(>(��3fP]P��E�:�+'�k�b�<��de�������}�ܱh�C����u��͛���[yh�:"#O�<';6g�q9g�w��Xv�ߗ�ٽX��\s�2�8@���1��n ����yP���XP\̬�L���� &Ev��0d�����Jb�E1I�pT�s�d����L !�/����ù3,����x!7��F#J�-���z~ݹ��<��AA�oA8�9e��F#��zVUU�V����@A�sh[�B��U(��ߟK]%C���_t%�A85�P5*/���J�6�}�oF����ݼ�wUL�e�:��]��� k�Z/�{��/��{��d@�pE w�f}^�KJ�;�؜N�9��"!��G۷������/���d���7�o�>}Զ�����Ù�r% w�fBRw@��zî�b4J%��������h�>���Q^���-+�I��-ަ��5*6V��"�� tZ���[�,�U[K��N�ب��0�lC�<^&�nףR�����ڽ���7 �b���7���(�MK{]���Ζ~��}R&L�G�Iω�\F+ "���hۙ1��A� ��B�-ݺ����ثyy,���hSI}�����t�e唒�����K׮�����cǐe{ �6Lj^R�7ee<ǃQQh:�^Wj�������;<����⿭���(%���u�Ʈ]YYU�K���Q]� ܏��5Y����1�wseP�%&�Od� 9Y�9\W��*V���VU��n��5������T� d�+C0��u'~N��睞$I�5Y���$|[hk(a�t==y�ܜ���g��x�.]P)|����������Ç�:� <��=�����,��6��ޥK�9ܟ�Fϐ|�jϟ�q�$I�2� �ǹO�U��D����]���gO~��a��im��޴4nNI����.#��֭��q�x`��>�NY�o��w׮�>��!!X�vҚ��f�l�xE�2��I�� tZ�}}�H�&�_���*n��ˌ�lU��A��ڤ�?�A�T�W��h܇^����4a���?����gloË�� &�d���D�$����P�T��&�6� 'O�兪{��Ur�"�g��P��h��pv�$�[�u�O,�i՚�*����hS�J%K��Ew�J�T*^NH����䛲2�������dVV�N��� _#�#�ߟ##y���=��3="�ax�UI��28�+���b00;7�%��B����z�o����P^��'��U���d�ձZ�guU+���{y6.z��`�V[�`@�I�j;�s� �/@��t�%7���ˋ��������6��;S4J%��������dj��7����PWu��aah�J��`���1*��Ϫ�bMv6k�N岸8~�ʢ�b9��5-v;^m|>����fk�.I� b����ҧ[7w�ж�t�3x0� ��V����<0t(��°:,9x��SS��nmNG++Yy��ĺJ�~�dA[Sgr��)��I�N�K�`d@@��;*I�&+�/FuuY��ըT�k�;& 5��=N��F�~��֠P��Vw���b9���@}�ߵ�}ܾ�~��cvJ ����-V����k����)ܳ��噙|z�-�ү�L�D����9��o��>����������?�ܑ#�ݷ/_�w�/�i?�璳y3�%$��u+_��o�8����7;�n��g�j�>���Y���*+Y�� |x�5����;�]�Ə>r����d�$^�ߟ�Ǝe�ܹT��z�o��7�d�L6��?�?no ���_`�O?1�D�5����c3���E�u̟8�W��c���T��:>�ee|���[#F�������R]P�q̑5k��5��j��|>u*���f�پh��~;�SRxm�`>�2��Cîŋyε�����+��u�/�M#w��KH w��1�%$���/Y��3�5b�L�Įo�u���\��Oo��� �#X��˔dd�y�������'xw�^�ݛ�Ǎc��߷y����7�kcr`�2�<��>>����^h�]��[�mU����7{�!���C�Y ��i�|ݧ� pg��6u-�f3���={8��^������V{�����!w�]g0�ߟ���@Z������~6��22�EI ݷla�ѣT�0I&�A���g��L;x�ȍIز��⫲2�\��-� U5 ��k��=<�o���d�p�� �^��3<��:� �Ц1qq�--eK~>�&VG�3��佇�z}>Yo\y%krr�ۏ?�23�C��,9x������=�j�.<���2��O����TT�.7�)�϶�BVL��ҕE����Ș�ش��99|�o���ލ�^��{[����������h�����C!I|�{7%��[Yh<6>�R��eG�Pf4z � @�^�{��L4����V�_��5��dUU�:;��G�rM��y�11\��Ĭ�~㹵k9PV���|>ܺ���h4�ٸ�=%%��e �~��������� � ��������=^ ����Ȳ|�~�s:͘L�Q�<����J��A�i�^}{���נPx��t��`����۟���"8x:���+*X��� �:���4����$��H_��Q��Gפ$t��,~�j����CtKJ"��_���x`�Z�\�㾘6 � &��f����gc����;�$��n� !ݻ3l�44��d�_Ϗ�f!;��?���%�f����꧞B��4+��6y2?=�8W=��;��h�~ ��e�+�����MO�꧟&(:}A����u���t�NU^[.���e����:�j��:��3�½{Y������-/g�̙Ԕ����g����������ˌ��n���X;w._���y�% IDATo�cժ��R[���'&-��^y/__�?��7�̃��`(*b�]w�|�Ռ�%�6l`�̙�)��d���2a�lƿ�"V���F{R4�������3~<^~�����G[||W���&N��y��ڸ�%3g�%.�hׇ'[]�'O&,9�^�ί�b��73s��fY��s��:f������_h(�YYA�s���;�V�϶Ƥ�q\��������p��DFM����f�(]�"���M��chaO����s����A�����G�Rf����ж�����t���鸸NW��_����ݹ�Ѣ��h��"�w�`w�� ��y>>�����wQ4*=렾�����+*���X��<�Y��p��Z��ue���"ǵx�q �lQ����BU��*8��AA� "���.�pA�����s���s���'2%5��g-I��-�j� υ_z�d������s�w�a��I ��P/��%����O�NǞ{��u�xe�2��0�lj���^"�Tex�O��t���7$1�+����+$�O����6of�…��ڕ7�����Ƣ��q�f��';wr�ҥLIM�?�_�충aa�1�G��}��<;z4O_v!��L�Ջ�fJ Y�� �f3��G�kk�ݵ+�xd�p�1��t������� ��q���ˋ�^=l��� ��&�������/AhK���'��ĸ��'� �V��ѫIi���ٜ��V�V��n�e;�l��'I:�s�1�~ ��E���i�l���'���KQ(4'>�к&�6��+{��FoDeY�\S� o�APL �;wrx�j�]����Um�z�$/=�=?��e<@�CT;�m �%>�.]��w�v�}�ve�}���@eNW�h L��ZF�����Yr�W_�//���~ m�d�������6��߹���É����<�1ছ�_��ګsG��<+��Fv�����sQ�TDȎ/�dϒ%<�i����-#�?<�6��+�DWVePL ^}5噙�$��k���ϐ &��:J� ��^�xs�0r�Ӊ2�C���o׮����D������>O�Ν�t�Bʄ �󄵲�9��U�� ��w� j��F#����fdž��ŕO<@xJ �/��ڵ�a�+�t��ӇëW��q#�/����������v�������x���IC�Y�%=9�DD\� lN��l6  ��Կ��zN>����Pn ��cǘ���]�[-; 07?��3'1�;�����t7w�Ƈ��l2<��23��kW��;ߞ�1Z-�&%�pt4����yI J��u5������rB���v��]輪�vָ��VVr��h�7y��x����qAA�u��!�A8�|4��ӟ��g?����k�Nmv����Y�3�G�L���G��1�Un��Z:w{��j^3�nj`�c��� ����]{�DZ=CBx�O����}L|�e>����6Ɗ .{��ZE@D�;8���Jsf��;����M��۶ Se%N�E �ݛ|�iJ��ŀ�nbǗ_�6y2V��}?��UO=�>f�i,�1���Aϱc��7��T�����'o�VJ22p:8�v��^� L9�#�-,9�F�6����g�>j4�K��$���9�r%#[x��GMi)s �h�[,d��K}�p�JF���y⥗z����͟|�C��c�h�\{-=.���ɮëV���CT��-{6���B��]��kJJ����䦧S�o� ��̑ի[ �>���g����H;�7݄_h���C�LaȔ)-޶�NvL������$�Cy9�;�Ѧ�i4��wo�{�T�L\ 籬,w���@�������C����II�8�����$�aR�M�7�:<��ż�=;�gg_�N���d��ᱬ,~������b��;dN^�'&rM'ޗR�09e�ݵ�,��diE� ��8 �ߵ �pEp0cI����eA��bxt4k�N凃�U\L��S�DՑʌF8���n��X."@(B���$� �۲2��0 X^Q��M2V.KK>�gI-��_�A��3�QU�IҠф"�,�lt�]�R�;S�� j�|�_�7�N��JŴŋ�4 ��V�hV�@R*��S�V���~榧�ӣ�2v�,R'M"0*��_�b ʿ��A���Ə>�p�� e���{]q��7s`�r�X����'�n��+{ ��O=��n'��� IH@��1���6ڃK�$4>>��]�h6~�R�Q�-�M��N'ݒ��K��"p<� Ij�A�ұ�,_Nnz:W�`�O��h�gٲf�n휭�ѫI9II���k�|���;yl�1]` _L��1�M�M�Lʄ ���g2~��u�ϸGe�\�x�c"��V� �f[��̺:n��@��A��};:C-�ˋϒ��gd$�'<�p�5�,�HI�a�Qz�A11�\{/�7���B*��ݷ�MO��d����T ���h;��o-���Kb� a��w�0r$�qq�n�z�� A��$^z)�-bǗ_�z� ������H�4��Λ�UO=���>�a�R��G��M\��ä\{-a�{S]P�����������_������e�5OI�$#�Z������� �p��� tzW��n�e���\ ��l��e�Vwk�^��o*ju�c����~ ��D��D����Yh���E����у�|�U�z�5����u�حV�w�@��0�[薔DPt4�?�0�>���6}�1j��#��c�h~~�I�/ZDhr2;�����f6V�%����9�l�QQ�Z�����Ӛl|�m|s��8�v��U��-{�z\~���w��Q��ǿ�%��! �Q@D�xEE�*�µ]����S�JSED��" )���ޓ�l���,�dCQ��~���!�S��N�ɜ�=��p���Hؼ��!CP:9�ա^��į\��Օ��D�W����FdY>댽���Z~~�M���Ѹ���…�v��b?��3fp��z�l��z+�������]��>���u�h���2kz��3grr�^�n����5k@� ���ZM��?�$Y{16���k��W���G4}:���N&�G�V��ڻ7����.]�����>C�����]W]Ͷy�?��Pʲ�Hݹ��F%f�V� ~�*ܶ�ci�l�$|�$������u�h�\]��³p�ؚy$5���j���J�:__o�� $I▀n��㽬,���N���b� ����'���������$�6i���֫w�������9�i�L���{�!e�N|:��9y��e��Z�=���-��'�@�T�ܨ�F���3��+���Gp d�]w5;f�ف=o���3f�m�|�~��$F͙�laK3 �-�5 :��K���Q[��?]w?<�~��o�-)�0oF���w���k�0���ŵ�@{�����ח��<��~�wO<��ӓۛ̌k���\]��~=����Y���Ǎc��S��m-��ԥK):q�/f�$c�>n�7�f?�^^Z������S���/&���x7^�34�[/� 9�/��y��OZ�u�OM���^��ߟ/g�d��� ���bcm�i��B�BWQ��O?�Gc���ܹD ƈFM�k����B�K _��8{yq�SO��5�3t([^~�����V���Inn��`�FÊ��6��M�P�Lǎ� Œ� $,�7��h~[i)1qq|��}I϶��ߟឞ�YG ���浌 �M�f׀�V�x#"�{��Q����vd�t�XR–�b~.-��l�� l����rv�??���p��'Q*T F��� WW^�3���� ����fyu5���3��~��AQbT��a��7��4[�\[K�^O;3 /7:�I��qv>]�P�MȲW��sN�L����D�ϴ&�� �$ /�"9x ;�~=�x����g�V�۹3]���ѡY��F� ���w��ؑ�7���.i{?��N���hHܺ��k��{�d����0���>�^y�%z����O��@J uu-& �WV�k�~^ ��0ԗ��n��<ޡ�deYߣ �0;�Y�����O�޸(�<ձ#���L����(��D�(6�/9��99,�����օ�Kg6����KJ�X\Ljm-��_õd�ggC�P�Pp�����1�LJ�K��� � B['�� � W{yY�L�ymkI �\�=gd�HuuJ� �t����P�Z�F�� [�f6�Q^������������kpv��XoAh�� ~]����x�y�N�T[ X���LlH�k$��>>|ʼn��I2�w##����(!*� ��&\^C\A�`��Z���l�\ l--e�z]�jkS1�kQ*ì��f= ��}ۧQQ�����Y���N�ф��5�B{�o�f�%%�6*q&��֘KJ�l�K�|�f�e�LL�����w ���@� rTh����3�{����|IM��hl6[���,�����bGG3�߿�C=/�\]y",�������{YY�L7WWG���H��]AA�������y/+ E}�Ȇ����l�((`ad$SD��KL����������&��~���ҡ>*�����ߟQ^^8���� 3֯'���_�O?�m^޹��s���X~�wo؀�����~AhD�P�vC�P0�ӓm��6�L�EE���.������T���� �hB��$l������]Ȳ�Z��^��Z탗�HT*��{{`6�q-5��/�����pAZ䓞N�΀٧}>�/+�����TJ]�Z>��n7 ����x__�HMeU~> ��d=Pd00��1&�����999 �s�B�N��ˣ�`�Ά�$�����O�v���O�����̃���Z^��e6���{b"�rrXM�H��i'kk�P\�w���v��^��ps@7��1����~AN�X��۴%#�/���7�&Ntt(� �#� �]���6;�qVUQl0�V; �����$Fc Zm�u�,�0�kqu�v�Ҡ&S5ee�b0���Z���"IJ��F��p���) ܌�4���a�::A�-9���ƝH�K����;PY��ii͖�%��=z��g���լ��eZP��'S�o�$lH'l(*b[i) ����&�m�* ����h6�Q��������� �yZ��Օ_���ۢ"II!�~�m���{E=��� ������-�e�UUl(*���BkjP`��>;{�^����n�󣛋K���Ap4{e�/�6�"�ш�2��-�*�(B�r��w�X`� �VZʭ�� ��@M�1 7$�t������6��me�Hy�o�t�8;G"I&S&S9�ޣ�j;��;h?\�DE8: A��*���J��)ǎ���k��hoo �Ռ �:4O*�� ���Ǐ�*/�O�v���s��z6����'{��i�'���r���Hl��$IL��g��ofd0/3���h�̳�23Y��χQQL�� %0�2����]Q� �7lf ����u0�ˋ������K�V�A8ssy~���"7��rGϞ �رٺ?�8��;v�\\̀�]=�>>��S�������eg��ʌ޽��W/�[ᾴ����w�f{Z�%%��3{��\q��%�22ؕ���C��9c�;uB��+,��z������T�}}�z�=^A�Nt��]��ꊏ�QJ*IbkI�"�x��S����նIO���X�J��ɲLEE��:xXZ�|1y2C�¸�G���!o��v8����;PH��z+�^��� BA��$1�ǧYo �,����� �K�,���G��(�˦��(��8;wiqۚ��TT����B�E�e�z�LB��6�����,"^�`_�>번W"Xwx]���G�D�Avyv����T�P�ZK�+�gԶ��!8�������o� rrbq׮bT�����>���Y��ۇ���f�8q�!�Wuu�z���<f�G����G�uɉtvfs�^l�ٓ0���O��.{GY���x��IjM�RT�?a�ev��rR�{�p���,�ˣ��\��'ؐ�V���ƞ=)6�o{����@�/�6 � �mDx83�����?}���7z4=Y���z�o�Ý�zqC׮��4���b���x}�n�����\ٱ#�DD��_�bof&����9W��??\����YY\ӹ3Ww�L'//F��3�G<�Z��J�U*\] puEݨC���w�u� "�����+��#J� ���\���ꂂf� �����YF�_ �����қ�4 qv������l��w�P8�Ry��+��/�+Q*�^I0�틛�����a���a��������W������ݏ�ȑ ����Z�MJj�� ���/�3�.�$�Ph(}}y %������O�Ϫ*��������EI��Ί�< k�2�pJ ?��%���z__F̂�L^MO��mHP��������c|��g�`�I��]^���)(��hD%I�sm/)�P>��Fc�'x����� ��ϔ�t,9p�ݧN�/;����Ȧ��0���F�bD��-]���à II<�����\�����6�7�2�ylȐs�g`h( >x�������a?���]�٧�M��3y����� �������\l--�,�����L:4��5���:@�ť��m��r��va6ע�Zf� �� O�+Q��Z!r�\LT ��T֙�pR:�Ӻ~���q�Q�F�qt��Z�אЪ��fn9v C���Rx8�<=�%$L���=�������)1��&D�y�� 6���*6� �s��r1�)��ŭ �e&Y��R�/.f���yt>� ��ԉ�y"5�o��P`I��@�^��#G�̂.]���sf�e~k�,>��`ù������I���"�-�p���o����F�̕W��ʽ?�@U]�y��$ˌ���ݱc���� %�'�Đݥ k���qz/Ză2��kϺmh})RA�q�-B����Ւ���,������ sL`��XNMMR����P��S0Zm��g6�)+�E]]6Zmd�2Fc!��W��,Fz9ڜ�s�.���������$$���]x9{��ٜ����r��~S�L�WH/�� ���ݩ�ɭ�%�#��f0}�t�+�ym�kğ��h2ҧC��<�>ဥl����Y|�b6�Ⱦ�}��ś�z�_R~a������;�7����,��W"xk�[���&�|�J������Ш4���6���j�����X���f#�D_C���<��y�^J���V�Ƽm�8�}� ]]���ܘ�~z�d~E>/m~�?��dP�AL4���������Z2J2� �_=�ō=o$��� �s��a�ڂ0o���O��ߟ�}����{33ҨG��h�׌ �t���9VP@VE7t� ��̚c�qwG�A5.j5�z�fZ��,9p�Ƿn�Q�pR*��h���s+¥A4��]��k���@v��S}��B��M�h,C�:�pE�͘Lո�tC�lo"eY��"���$4��H�Y6��e���w�~���$�%�2n%\�[�߂���}���~㱑����/�w�g�'��,��h6rۊ�؝�����Ɩ�[�{�\ܵ�K~��ս���ܵ�1�|�j˸m�m�zr���%B=C�|����N�Yq� ����Z=�:�鑚�,�̵ϰ���<:�Q�'m癍�4��l1�T�0o�<���S>�H�^�����*}�N�,��{�\ޙ�'�O0u�T�� @g�1m�4<�=X2u �c����'��q+�,����fѭ�0�Mܺ�V*u��}��<{��$$q���[<^�����+�V�U���� ���|u�+���Ժ΋�_DF��[?��~�񑏣U��:g��Z�����Rw��os��{�:{+��� �;�`��i̺b���͉#nN����G�ڗ�%%���e���̂��[�f���y�T|�o}����{g���\�('';�/�$I| �>��n�ee9.���5��8�]��PX���@^]�>��IIT�g�Q;Ґ|4%���g��C,�ͥ��lKIA�hgg^ ���A�5h�v�$��� 02<�oؙ����Tn��\��fe؝�j���g�8r���~=Ѿ���W0xq��ĿV��#G8QR�/'O��֭����s�6 �+�%ǩ�U�`�:zw�Ϭ?ّ��-���@׀�ĝ�c���<<�a6���ļD��\���,3�'�d�fr4�(���Dl`,};�e���?ϠN���>��G?m�zU�*��������~a������?9���eOgO��0�>��-y;Sv2��D�%mcl�X�mI�������f�Z�����Xy�J�,��s��Ğ����1ϱ��z�2�2�Jf�i]7�;��&}2�J}��w�� Pk��1��?̒��5tO|�:��Z˪�U($o��6j��!|L` C�B\F���n����f#�o]��ڙ!�CP)T<���f���ɕ�&�g]���^JkJ���6<�-e����~�����r�����5*M�����?1���� :�yh�C���|lg[�Zg��]��ɘ�1��3���Z����B!ʒ �-������̓��]�ҩ�6]Άyzrt�@�:�����ل ��������u�n-���“:�Vf�u����o������r��*�B��aa�����Ǐ��� 8=�pin.�JJX���t6�Y�����o Y��O�y���rG` ���յ�z� ��'I�͠����ݻ��ors��vw'��w X���2o�h�۱�Ԓ���f��:<<8x�<�};�n�NQM ����٦���JG� ���P�7�<�u+Y�{y1�sg<����ݻs8?��^MVE;g�`���!m�x�+B�4���ڃ�1�$����M�t�����&��b<<��T�>h3�)/߃B�A��ԃ���G�p���*T*w��#�7�&�W�_��L�d��z����b�0�y��X��MmN�L�G�59���M�}ؔ��&a52r�Ͷ?'�lM�5�e�Y��$1:z�Ͳ�����K���~��q/ڬ3,b��Y�N�K`d�ȳ�������\���p�ak�Gs���ğ��D� ̲�����=��wN17�v�&z��`2p,�����W�_T�w~_���F=?&�h7A�=y;};��Y}z����a�֓$�Y)�� ���Ϛ�ԍ@�@6�dM�� I��~ޟ���ªB����g�=��z6�:�ct�����&�c���3L��M�o�#�1���\}5{Ndp��g�P��,�ܙ�@��h�Tw25 ��M���P�bx8���r�c��t����@JM �`A�.<��hχ��Y^E����3�y��I�t���Y8w�Z~�ݛ�yy<����dˆ����u�0��0�K\�AYWY��WY���.( ���I���;89qGP������M�Ap�e'�|��LJϚ,kꥑ#yi�H�F��楳�7_5J65�Of��s�c� ���g\Ǟ������}��^:�c ��:D�P�v�S����;�6ˍ��ׅ�|����Z��TW'"Ij�Y&S5 �g�.6��u����`(��4�j1�*���Fs�3����d��lF�P��8�ؼ���f�B��{��M�G`�m�fEQ΍��6Y����g��4V��8��7=�B��d��[1�f��Q"�#���{�����X�ĥ���9~J��f�zf�Lt@4���Y�l`�<����5"I�?��G�|� ���W�]�l���QOr��;���F�$la��,����h�¼����N~M���Ƿ����ɧ��Yw��!�?�deYg15Pb�[�AT�c��� pw�����9q�E99�fm��,�Hj*�KJXC�f�)�̋���$��>�����P��p�\H����`���poR�JJ�8=���6�*6��^^� ��I�����|���uI�@����0 twIAAAἉ�� �[���7��h���V�矪��E�?�Zm��1 �jÛ-���OMM2Zmx}��^ W���vk�Ѕs�49�#�2;-� ���m�5���ԝªB�2���s|���U䑘�h]VRS����L�6���:�=i{l��:���5NJ'��r���f�����l~�Ų3e'z��o��?H/I��q/2��x�t�Xޱ�����܃��D�Ju�������6�D_á�C6 ��N�fwݦ�ǎ�Ϭ?)�=��8�{���|&t�|�}B-�K�����s����%˲�ϻWH/�������5t��� ��\�ʸ�����$��Q#y�_o����:d���4n� � ~L��_Q�3'N�}��n�pW�1���R�����г'�*��{2��KJ�Ǐ��W�B�DOWW�����c��g�!�����={�el,�J��|��,����XJ 5�x���uu|��E�������͌ ��,��[J ��T���}ɹ� މ�d���H � � �H ��nM����#�$��������jj��eJ��2�f�Y6��c�࠶���pr B���A���h����$]�e�.���36v,om�v}@RAGs��"n�������-�O�4K_JZq�����e�UC��'�{��~�����{���w�[�]GSXU�Ck�@�>��![��5�sy�zM�5�t�'������¦�,ʹY��!!1��il8���� ~:���q����'������D��[�������Ō�3� a�׳Y}`5�%�ğ�g��ğ������@�T3����=����?�_�S������ͬճؑ�� G7��wOзC_k9�/���yo�{�<�W�j1��7�m>�5�X{���3w�\���Ofi&���J\F�Mi����s��;����X�g �n � �����|�����Z��<���b~I����b�,Ψ�h��c���@�V������K�A��?H„e���#Gx<%��iQҋK!I|es�h�ev��9,iy��$��9>x07�Y��6�M�Av6���/Ɂ|�&_0�����GSS9Te�����$^*���wo� ��h���D!��� � �?$�� �[�..D4j���(ˬ),�| � 7J��MA��o��'� 4�0�u��� I*T*Ko0��0��1�ڋPh[,MΛ?z�������l:��I�L����3e'�|,��� %_N����\���?g¢ <��Y��h�o]L�.���k<��)�]��r��͎�T�G0K�.�D� f~1�}��wü��b��������{2�����}�}_݇�l`��ixhO_����l��<����5&,��G�?�ٿ�c5Z�qg�����r����9�gޝ��ߊ�����uure����Ʋh�"�}<���=Nvy�My���h�ZV޹�r]9������6��5O�����BR�Ռ�p׸� �፟� &0�E�.�Y��)����Ŭճ�pt�'η�>��N�G��}�/��-}o��+��� ���~<�w}Ȕ>S�>x�u�U��*=�l�g:gM�v׺���O���f~1�ҚR޴�ڣ16(�{����m���@�����گ�����mΫ����',��̈́ ,�ɉ�={�8:�BaM�4h�#{?;�����P]ݪ� ���F??������vg{ �L��k{�`m��6�K��)����ɓ���^� Ͳ�β2�9~�={�5!��%%��\�M���k�]���@���E�a,�ڕ���/�� � B�&��ׯ��cAhuϤ����)�u>�ݷ/Wzz�y����8@y�/8;w�.�e���d||��ͭ7`�QXZ����qv��/-j��6��xy]騷�.#��Lp�� s^pt8m��O'#�2����ѡ8ܗ����M���?�ů��7��Zx7���GF<�*�ږW�~�M՛��$rss��2/��Ǐ�,�O��� "T�qL`�\rM S8TUe��R�P�EFrHH��V�Ã{������Aڴ2` �V\��PAZ���+糭"A(B�6�ݝ����f�Q�YSP�;]����:]C!Z�m��`(��c��d�N�Nee5�deqH�E���R��4&���8~���:�X>���� =x�g:v��p��:h�+�2/�o �1�Q�͔�|m IDAT���f �)����� ���oA.QJ���`� E��Ky����� ��$�eʌ�eCz}&j�_��h4qr F�e*+��g��t,�E�>�X��z:"tAAhuG��x��I��}խ.���:�U*>�������T*Q5I�4$ede1�����\�x� &���+E�y*-��W8�Z��}!!�ل20��)���O2t� ~�c��<��F�޽\s�0_Pc�\��f *�����aM�n��]��)��� � B� �� �{#<=q��@�(�|��ߦ�n�t�L5(�n�e�lF��pu�$I�tiTU��)�:˰�.����H��L.� \��f3�%$4��./������1� �d��? �1�����2�P]M��x���\��7�$�~d�MB��-,����rL�9w������٧a���� ���g|<�]��~�F#Ksr�?=��y��)����}�{��� 2��+�`s�^����� � �Дx*,B��V(����W���Ϯ�ce%�`�Q��@mm*���r���� ��&S�*�{�v:�������nj�s � �E�E%�̘Qr�ΰ{��IkjlJT*�^nn<۱����C�F�O�z�av6sN��$�6�:���&'�����11x�.������p��?��Z���#))������W_NFxy�0hϦ��~v6��]����c�x $���畜�e�?**X��������C��Ē$�S��Ĵ�@z���YSAA�� A&���y~~��*,#��b���.��''ۇ�Fc)nn}Q(\)+��>g�(��:]&��]qq���! M��fdJI�����S� B���ґ�a6�8:����r�gf�t��B��"6���+.,I�x�C����ք�UW7�\6�o�~6��I7W� �;��t���~mTU�����/�񄖹(�,��b��w%&Ra4Zy�rr�U^ηݻ��r�� ���cQNɵ��$��,A��b2Ib��?Ӄ���ۻY \AA`ƌddd��/�8:A� BA`��IB��!������m�WHM� d �u��l$��;�ӝ���MkiQ����w�A�e��( �12������9:A�-Zy�ok��/�DZ���� �>e�͍� �"$������+���œ'������~�`��3t:8���X���_��wuq���P�/;�z]I��'���g�ϲ�M������ܑ��/ee��H������,�ڕ;�$oͲ̎�2����]Q&Y�&��%�X��+<=�;(������TA�=���h4G�!트�A�2�x��?7{xxJ��Ϫ�6՛�h�@�KC���Yn0���B�Ni�@e�Oh60J����Ӆ}H&�3� QAA�C�E�`b��㩩d��6�#�$1�ݝ�:tpX\�?�P0�K���r{B�uu�J���fn>v����x="���Rx8���0Y�*�uu���ų�:]���.X�a[��,���ٴ4�rԚ�ܕ�ȶ��/:�R���yy,��!K��� ��!)���}!!L "\�m�7$� \�f�=��C������3m�4~�a���(++��f��ݔ��0f�n��6&N���~��Ν;5j�v����_'..�޽{���ҩS'|�Av���W\�3�<����1TTT��ϲu�Vt:w�q3g�$&&悿_�^��/������믿�����of��<��C�\�� �X�|9ӦM#<<�3f`4��믑$���� � -�t��A��&����+��Rf�-��31�*P*m��Lh�QTWF��E� ��VWw g�.��vo�pA�!6�i^�Mr@-I�����.#��86h74{�a���L�>L��p���V�j��4��d�Ռ ���.�q��$�ӱ#{����Fc��ce~>{��q�^^:y�,���T�������=�:����ErPA8'�棏>�W^a��Ŭ[���^z���^��[�n�[�����s��Ws��w��w�5���ٳ����ٸq#��[n���o��=z��?`6���[��L&F�ʼn'X�`7nD��1`����[�9==�B��+��._��/���W_}���D֬YC�n��;w.��r W\qyyy���Yc�$�>���'O�b� ��]��K� A�w���u�pc&`uA�w��&ʌʲ���$$��&����0QUu�&I�<1ː$ Q(�� � ��º:f?��zԽIgggG�%\$^*_��2�ӓGRS�e��N~-+����|ߣ}/Pe��!!����I�Κ��3�y��I�t��i��G���D�/.,�A��l�S }�4� afP��ԙ ��7����r�JBC-�x��������Z����&%%�u��q��7��kڴi<���<���L�2�ѣG[��0`)))DEE��7ߐ��̏?����}��a�֭�[�����n�j������������ <��c�ЩS'� ���Z��ZM@��\�,����_|q^���3A���� ����1]���FY����|��l�j?��CJ�/��)(N�Ң�l��.7��63 �Kˌ����g 5�W���bb�DE�������%!�_��l��&�$�ܕ�H|Eow���؜���(//v��c��]��$KMe[���zkE����$'���T�L��`�2Í)�BCy�S'�D� A��poR�@�� ]2-��w��ͬY��;w.ӧO'<<�O?��y��q_ ����a�&� ???�����>��"T�2d�N�bÆ �_��#F0n�8֬Yc]�����ITAZ��A(���D??��L���|d'h�f��)(��6ˍ�rdو�P��S�����Tȸ��I( �w��v���K���o��w��� �wJ����f�e���hBČ�v��ɉm�{�Lǎ�{$�Av6W:��J��¨(��s~#� �+.����K<�s� 0�<�y��ݻ������rL�g�|���� BÂ�\�rlh3ښt�L$I�$��d��1�ːeM�}��\�Z폷w/�����U,���ō�t啬�����?��-|�^ _�{/�t�ʃ..���K6fg3#)�M�G���U~H�ѣ̹�&B��U��Cf&����O O�f��n1 ��qJ�ӱ����ގ�LJb�������o�@���>���������|��*U��t����(^^�(jdق�R��� �TmZ#\�hz�Kg63���[�T�s�\�ȯ�Fo6�V�kNF��oF��S��L JIbҏ?ڷ�wA�gd�g�D��m @�� ����={�w�~��JV�s K���/��QJ /^{-bcOo��7qMn���*����%̧�B6���w�m@�P�W?�B[O�&-A�t����E�e`E�����?(������DMO��Ç�٨�>����c�Xܱ#n�1.a�F���h^��v���RN���ߧ��lfyq1 �7핚V˪$ �,�E�屰0���s����W�na!�<�,���q�ݻy%&�EF�7/A�S�b� �iIIIX���r�����o��o8,��#�4�@tt��4[�^^^���ۼ���-�;::�i;-1m�4�M���|OOO/^�4=''��%��%�PA�����à ��i^�NG�NGg����e4�a����v|gY���RQ(<�hB-[��{8��]�{�����ړ� ��a�Z�URB߈�IO��p<5�2������������V����~�h��Ϣ[oe��u\�+���4�����9�bOBݱ;FQu5�M��c�e� � �0,(�7r����ftZT�y�G�-�ti(����!��?��7@�V=`��;�����)�_^�PWI`��O¹�)�͆J��q���&��ssQ*UWs�h����{y7�I��XA�����OJM���<uB :th��� �$I<F��7C�Ǜk�y�쮩������ޝ~mN���B���8�޿�a�� x2<���H:^n�6_��� ?�55��@W��% c��y:<��!!�U���EJ�><�������+*蓜��=h_߭@AA.b BA� t�d�����|���X��X�Z}����f��f7*��CU��T��G��O��Q���ѩP[?8��YY�$�k��je������9|E��ڗ�t���w/�G��S��o�=o��>�7\�fs+G"�����1-'���q�.������>>��Ӈ�|}�ƽ�� 7��͂��f�S͹30��|}Q6�f�ef��aԗ�<�����i��_�LrQ��mci���LX��7n���"#Y3l?ge��~ ��L��Wn��S�[��V>6������GQu5U�)�W���U�}���� %�h�v ��k����D�F���x^�o��8Qh��z:+�@�b���H�����6�ˊ��8ϟ!/t�,��ѣ ٻ����ͼ<�Z,N�_��//��'��ɸ�*~�у[����8���-1�077��%(��V���;����0AA� ��{,���$I�Ӷ-*7����X����LT��79-�jt���T���@� ��O��;o� �$I7.n��Z���Jņ�#9f42t�j>߷�UC�:����w3!1����sՇr�g��Cf&q����VF|�I��<}��tmۖwo���6���%55d=z�������U!I�}�Ml��%f��\����+��gqa!�TW;T)�@����xoB �$��۷�����*U >?|�+���v1>us������@�1=�Ĵ��3��Rp�baQa!�m�Ɣ~8r�c 6|����{;Rܷ/���w[~���bW�����go�.�<��ПB�XAA.T '''����ڱ� \P�TV��n����ȹ�j�Ź�ӥQQ�w�8$I�,��ԤPS�o��xy�`2�"IJڶ� ���$[.�ڵí��1���x���G�Y3��aem-Ɛ���[;��z�mߎ��X��v�����V�J��e�tܱo:�S�� �*���֍���-�^�NG�mۜ����H����u.u�kkY\X�ʒ��ns�xJ�����p��is^>{7f�e^��av^�=Q�zzy�M��D���A��Naa!aaa�v8� �j�﫝;w� BA��\��_3�2����� �2���H���e��R��x���&���b���;A$A�K�,ˌMKs�L o�V$���A�eGb"#����Y���[��aA o v�j׮�CU� x1;���{���2k�ʸ~�.�o�����m6{U^c �?_���##ɹ�j�]qE]%�yN(%�Y��|խ���6`oM �;v��<\� � ¹"�� �PI���]�UI��C��\��T�Z]w�S����9X,5�Ձ���LŸ�G��v>�1 � Bk����߫���T��C�� L��y*�|ҥ �:t@%I�6�ZOge�Lf&��E7#:e�ϒ`�ѣl��<ۡ_pj�V���ܽ?�'Ӛ&��x�n��,�ԉ�}y#6�� �B﮶mّ�H��{ݸ�@��B�ݻYZT��� � � �i BA���&�E�Y]VF��rN�o0�jգTzumDM�b 5nnaH��͈,���N@�p;��� Bk�7x&+�i� ,�ؑ ���%\R$I��0~����Z�r\���ܽ�IǢ ss��p� o%0��A�$/FEF#S�� ��/���"�h\�/����+0���z��woƵk����Yo]]==�ٻ7�Է��QwM0>#� ��\�;AA� �H � �@///:zx��g��������f3�ק�R�����!Y��TjQ�� Ճ1��ǜ�XA�B �2���clr#^ ����!�t]��˞>}��ח��$d���r�v��l>�v^��ijQ�� 쨮�ۊ��sk�SSè���o������r|����*���"�kXݭ[�yn�6���W���+�`ft4p�%���b���M���j� � �3fsaܷIJJbܸqge[cƌ���ge[� ���A��'�ǵkǿ��i�L�����q�ڝ�}���Le��Eu�@��0��B��G�n��f@��xy�@�.�'�����e���[; A�f�\ �N����ѣN�� K;u��� ��'H����x���`I���6 ���>��l�ٓ�f*�S��Ŕ�l{�L�p� �8� ��Ȳ��G��V^�++QI����}^��OGDpO۶�).�g������$x{3b�~ 6V��cLj߱�ﯸ�Do��SA�](�U׭[����W�\ɸq�5yPo�…XO�Q�B���DLL +V�h�P� BA��x 8����N�m���#S���V{����׵OS(�mor IDATڈ��Q(ܱ��h4�����X�ݣ�������ĪA���H��+����h��L���nߞ� d�2�ң�$�ӱ#�Z�?x���}����G���q��Iaa����a���ϑz=���2:$�|�Ye���������H���mX]%��&GFrU3��bs{@;{�f�޽d��X�2���;w��sg�n�A� Lk�7����ѦM���M��衘��'�� A8�p77��i�NU�J`eI �bc��>-�* ���@ �|,��(��(�ju[�V= �����R�� ���a�믷v8� �Z���T�tx�Ҹ`�,3!#]���U�Dooo&���J\��C�$��� �ݝ�RS1˲�s�8f��o�.>�ڕ;۶uZ�C���XIO?�M��lF]4�tf3�)*b~~>��Ŧ���Q(x8$�g""�m���b�Q�eGb"������+`�e8p�]�ռѾ�E]!*� ����ԩS����h4 >�ebi���L�:�ݻwөS'ƌÈ#�I���l�z�-6m�Daa!������K<��� fϞ�W_}Enn.���<���̚5 ���hƌ��ba͚5( ��Ҝ*�ƌáC�7ns��!??���$��}������/�-I��Yƌ������n޼�~\+W�d���L���/���ֹsg/^|J���Ʌu"�p��R*�;0��eeNc��$����g-Ah2�`4�ф`�Tb0B���j�A��B��`�C�팛ۅ���pi���f�رL�>��;66��˗�rdBW�^�b3)3�c�CrP t�j��Za ��hww�IL�}��RY�TI����\���v�G� �;���Ů�{���ba^A/7��ך,�̗ee�������%2]%U��E���LJ##pYW����Ϯ޽�c�^�tucT�\�s'�^qI-��w�᭷�B�ן��Aΐ��/��"�<�Lk�r�(**"99���z�a��7��֭[��߹s�=�֘N�㧟~b�С��� L�<��>����3v�XB�[��޽�F�w��l,�$1p���iOB���B���d���-چ�d������v�~�m��x�b���h[ߊ�W�^�� @BB���ُ��>}����ڢX{��3f ?����<��ŵh�[o����'� Ah��!!|z���t�,�uy9G�f��B� �!�̈́B�Nmm:�lD� �h,�ӳs�,.fn~>E& ?]��J��� ��\Y_U @���y8=��� �Z�ܔ���N�r���z�-J�J����+�p&�U��7� �����g���jգ�g�V�a6�d*D��C�뒂ju&S1��W�Ѹ~�J�&���r0uWڴ��3q�/XN������� I�x��׉�������K�����'�|�=��Ӫ16����l���DGG3d��y�^�n߾������9x� �-�s��,_�ܡ� 4Ve��pz�SkQ�|D����--�V(��S':h�L��v�g���铜̆�=����_�6 �����J{g ����1��O��M%&���Y\X��f���97֯���(<�3�6H8N�T�i�.���bJv66�&ˌJK�^����f�n�����`pӶ�3� Bk0�P��xn"44���D~�������k� 6�٨�tBB7n���;������0a&L�_�����cҤI���c2���o9r�ǝ��OFF���p˖-�l6{]C���#�h4 <�����z�>}�������^=��Z-�F�bԨQ,]��g�y��^{ �F���:���b��$�� -��$Ƅ�07?����q��h,�l���=���}Ȳ �2���� ��B�p�ӳ��� }��̟?��� ����۷/�W���� Y��3g+W�$//�:���:$_�F#ӧO端�����nݺ1s�Ln��f�2��ь3��š5kP(������ń رc�:u�W^q�/))���{YC{�'�x�ٳgSZZʨQ��4i�ڵ����I�&��p��n��f��>� �J�bǎ� ����~6m���?��+���ӧcƌᮻ�jqR�T<��s���SXXH`` qqq\��TWW��c�ѿ��zlږ���>��w�%==��� F��ȑ#i߾��y�ӧ�/�`0���3q�Dڴi×_~ɸq�P�WS�3��˗;��3g��ukXn����f>��s����w��ɬ_���.�{��w��,[���m۶D׮]@�♈&��Њ�� I�x12�8HM�R�g:D�����:�9A��֍)�����AN��������a\��ʜ9s����_�~̛7������o���W_Ͱa�x���޽;YYY|��W̛7I�x���{���"77��ў����k����y�����fذa;v�]�v1q�D���leYv����˨Q��6m������+������iC��U�V1d����� ��]w��O<��ѣ���Y�bs��9��m�6F���L�>}Z��O<��A��С���|��$%%��h���7o)))���ѦMT��Ђp���<� �`dH�˛'2�R[�ޚ�3ھ^���Z���*�l6#nn��exxt�ͭ��G��̝;�Gy��$�M��ׯ����{�ǫ���СCټy3�\s =����}ӦMc���<������/�oߞ[o����t�2�$�p�BrrrX�jk׮`РATVV����������s�I�ݦ-GRRRx���9s&K�,a�ڵ���%-�v��ڵkٱc���gܸq|���@ݸ_}�PW�VRRb�iݺu�}���y�lٲ�ѣG3c� fϞ}�s9f�{���L&�~�)III��`cÇ���������iz� /��۷og�…�ڵ�i I�����ٰa�/��^��wߵ?iz�w0�|JJJ())a���<���<��s���ۗ�p���͒�"��$����t�DA߾�%�����m��W/��j���ii)7��p�Qg��� � �=�'Of�ر,Z��#F�O<�p-����������L�8���x�}�Y���pssC�RQYY�C=D���y�����1c�}_|�cǎ��>#11�#FP\\l��܃宮����y�ǘ2e �&M�[�n|��G���������,[����0&M��r[� �?��[�n���|��7L�>�Gy��?Q� t:����U����OӳgO}�Q:w�̻�k�7l�0n��LPP���)o_.V".�p �{zr��'{kk��)�%%�s����� �|��@ �\l6#ju V�����������p�1�L�������������ݻw��f�~�af͚�Uw�z�j{��_|��i�x��'���ٷok֬����7Pws��ˋO?�Ծ���T233IKK�� `���'������>��޷?55��xpp0S�N���cǎdff�v�Z� �R����8^��`ʔ)<���1z��,�L�>��3g6Shhh�$o�����j宻�r9���h48pJ�;v������ӣG���HOO�S�N@�kb2�X�z�� ǭ[���?����p8? n8zxx���R�tXN��2h� �.]ʀX�v-����=����T������MZZ�9ۇpq��2����q�3%0&$��s��X�D___v$&20%�\����fY�����Ǔ��ÚFclZ��%%L�����'��Ԯ�jf:���r���lŠJ���2W���bd$�P��g���;�e��u:���UU\�s'������J��̤��k[;TA�,P��̝;��s�:Loz�ڳg�>d����777f͚e��Tsc�o޼����͙��|W-Zt�����,_��iz�قp)�� �h\�v��E�pS�|� ��CX�Հ �������z ��-K ��Ѹ���/7���fǷ+))��?�dРA�o��6֭[��je۶m���9-3h� ֬Yc��$I�r�-�|��7DDDؓ�P���%m<{���0�wBB���٧�X���#G���7K�,a���'�nmm-̟?ooo��������a���ͮ;{�l6l�p��OEC�U�����`ڴi$%%���G\\f����o��&{r���?��s�כ8q"�|� ,Y��aÆ��q%E�d��w �W[딼�V�x�Q�]A�P���`[b"���:\p��_Oee�lVQ��L u�6TJ/5s3�t�YUŭ))$$'����c6����萀�IH`kB�Er�,�pw��n��G���!W��wr2S����٘����a � � �� A8E��L�XX��)oS�-���(�>���l�JO�7��RV<=�!I�W���L('jY�j^X��4�d� �4Pַ�X,���<�����у�K��k�.�~�ijNҮ��I�iӦ���b�ڳg���t����cv�C��T*{�Ӧ���;L&����8?�(˲�qM�8�����'�y�fv�܉����r�$�+(���zr�9$,,�+V����o��vNۋ���SSSC�.�*Z8.�`h692/.��P�H����ڳ'��?��������p�q�,�����l?v��/�2�9�����u�v�����V�J�Z�_y%_v�ΕM��g��J�wW\�S���,@��By}����� �p�j�� �>q�Y�k4��я���F��[�h,�d:�$�a04��A��l�����uF� �:����_|�r~HH�^{�Sk����3t�PT*W^y%���.�>|� ��w���OFF�}ږ-[0�|@�>��믿�ɓ's�7���pqҐk<΀��7qqqlٲ���X�/ww�3��1�F�<��-[(//w���_����UW]ԍߠ�hHNN�/���+����ټy3���*��{/���:t����S�����5���q9^�$I�?�>��%K�Э[7���{�q���3g���Í7�xN�#\\���t��W}}|�L�E.T��U�;3#��� |[^���T� s�0WJ/dg��>m�̺�r���g������ %��$Ƈ�r��Y޹3���گ�rJIb^��ס �� �Z,��X�� �y�b� 6m���a�� ��� �aLH?���?TTPj2ܨ����9� ���M�Z���R��G{���gw$I�ھi4fΜɴi�P�Ռ;�V�ƍ�0a >��S���j:t(+W�䧟~�ᄈogذa̞=�����_��ŋٿ�C�QW�]�v%..�|��_~���J�~�m<<<��e��Պ���ߟ��/�����hV�XAFF��v��������>��G���___�Ν�]w��C=Ĉ#���$--���׳t��f�9u�T�o��ƍO)ֹs�u�V����믿N�=())�>`ǎ������Aooo���:�ΝK`` ���,\�m�����DEE�h�"���IIIa����@��kRR ��U�V1d����\�;0`�?�>�a�Ç��h��� ;;����?lܸ�+V8U� ��u��|�(����N��S��EI�$����^�elZ6Y�!n���)1��R*9V_n�e�TV���Qn���d,���Çy57�t�ޞptU1��.y�Xh(�EDڂ���ٵ����33i��] �D�PAA8OĝfA��pG@� �͌7�Ii)�ED�h[V��� ���`�B��@��( $I�F��G�Y�_��<���`�>��<==���ky�ǀ�V�����\�� СC>��n��f�6^{�5 |��f͢k׮|���t��ɾLs7�ׯ_τ x���Сo��&'NtX�i[��ڔ4�v�}����Δ)S�X,�~��̚5� &ؗQ(���۬Z���_�k���M�61x�`6l��+�����ߏ�h�}���y�'<�%%%d�Fe���?{��a֬Y���8p�NG�6mػw�S�k��ż�� >���X�z�-F��p\˖-c޼y 0��]���;�8,�p�Nv���y���Y�l�=��F�b���N���ٓɓ'3e����nj3x�� d�С|���'��Aaa! �Xv���w�}�$I��� ����+�$��� """�ݻ7�����Ĝt?���babF ��_V�\D�Nq|OA��<L��w��K��jO�Y�B��co %0��Av&&�09n��XUR¬C��3�AW�P��B����<N�Sx�M8�< �� �'t[9A�e�~��7��3��!�Ϲ0�� n�S�=uN�1�|��U�N�4���a6����v����ʒJ,F ������!86����%02�l�}N�|z%����Ϟ�7���m���vȋC�x�a�I�?u IDAT´B���gS]^��M��WK`d ѽ��f�5�%Ƴ!ww.��]\�?�� ��%rrr��� ��2�������������?�>���o�Z�������%��#(�h4���݈�w��~ B� ������0 Ę3�����A�1|�p�,Y��ᜱ�}�ҵkW>����E�����W�fe����)9�ѐq�Ux*]5���O�N��={�7����%��~���[7�i��i;�V+K��x#/�����5G��J���`RX~b,��B�e��V� �F����i��T�O���A]�[�SO9�q;$o�g� �^ž i�S�=7 ��-���I�x�חOy}�&�����U7.o��ʆ��g ����XΫ�YEnJ.�$���:' BI���z� @��>�����5=�A�AL\~���UϬ�'�v�g�C����|��70��PU���R&��A�X����Ν;E� ��²���2�z�WWse��`'���b�1��P*�/_�j4������ gO߾}ٲe �֭c���N�5/eee|�嗤��8����aWu5� �#6ཎErP��t�jٞ���{�v�=)n������l� DQS��baQa!s��Z]V�5�?��##���J\��M�,Sl2���;$�' �Ft���H�J��6j3۔�s��Bf�X�m2*����,˘ f4�O��IoB�9��ML>hO�u��go'02]����2RO����j|���t��i�&��A� �S�N�iݨ,�${g6�vX~�<�N� �p�W� ��:__�4 M&�y*IbEq�I�Vk Fc.V� ���&�̈́B�F�d�ڮ�T���A8s={��gϞ�� �}��,Z������G��Xe����Q�8V�J���ǐ���u� �T�Z���x�OMe]y�=!�4id��z�*+���s��y����v�S�ZͿ��x�];�"�~F�,2t:2���u:��td��%U�I\W�E��u��2JI�_��2Wz{��TR}��L8�o|a�ʏ��%��Ce�|{$�C��N�v��Qz��k��I@]5�_k��<���#5� iCt�h�����>sw�i�&�& <��[�Q����o�7��}�͵�\��:R~I`�;����n��+��� �,��H F����v~$ J��M=P(��V�T���D������l^����:_��e��C)�X��J����=���+�(f鄺�;_י{_���C�����фą�����>����a������S�Y�F�Pk���� _��� z���!�۸���������LaZ!~���u[/� �Cڟi�o��(�+�[�n$ޑHpl���;��d'g��g:�Մv � 7ѮC�f�yc�����TT�����O\�8����sJ��۴�.��r�b��ꮫ��n١2T��w������ �b���o�Ũ�hf�ҍd����h&�G7O��O�pz�5m���.l��V���K ��>���9�o�~�4��ڣ�� &��� �ϝ}��O�� �p� BA�Ӥ�$ƶk��Ѵ9�E����aމ�sS�1������(J�����Z�$i�hB�j;�ãA[3� ¹�~Q�jj��+�E��?���P��[7ƥ��qii��I��� �6�$����wT�CBpS(�YZh�d�qP�?���I��%M���b_N%Iؚ���2 @-IX�$�U*"�����A��;Q�������o���xX���@ςM�6Q]Q��l�q�V��,R~IA���H������z��畳�׽<��#�ط��)��o�(����"�Î����6�^s�;47�sc�Gkٻi��r�Gk�9RC��|* *�������>�j�֭��n�zF�9�´Bl=@uE5�u��ٸ�g�;z�p|��V�E��<��nOx�p�zD9UmZLv���!~]����Z�2�(L+��iw;ť�ұ|�r ��3�)^PL��\��H�Kf�2ۿ�Nʆ^X�J�����7�Q]Qm?���a���p�:�8I�v�Z����~J�K)�.e尿�_:�����`����u R (H-�����m�&�r`�,& \H����NL| ~���z/ɲ�'/|B��<����S9����i��2��a]dY&��TRK���֥nh�#�GH�=�a���+;F��n�v'�� � �� BA�3028��r9��je]y9������`��j=�Fs���fӣR�����:��-� ���h�Ń��K���h����P�p�$���;�T�~Q��edpHP5����0�ݝ����/(�H �d�e�L&��3�z��r@���h�'�����wU ؐT5��R��A��;Q�I�hww��܈rwwY����w2/.����w^��Z�y=��'"�2w ��Ǔ�5Gj�޿;}G�ů����������n}�V|�|�ږ�W�~�Qg�9�1f�~^��=9���^\?�z��Dž?���d�+[���;Л�3��)�������|��g�����_���)1�;��}b{�{�:B;�Rs����}G��_`��H�6���I�6�}������^YlO(ʲL��|����vS?0���M�f�v�Kw�5�6u�):š��p���6�����IV��D�~���v�����n�*�z�ԓ��Il�p{7��l0��;שz@�Tp�+��6�-��o"��T,f ����wF5{N�m�gO^q�$�MB�%�~Z��ʎ��{�0t�PLz�>�d_�ߨ~$ J ��t~Z�����ԋ[�_�]?�b�O�hՖ��t��s�^ٿy�=9���-�n�mT[~��W��Lk���y�=W��޾��?�[�N�+ݞ � ����'$.����DAj�_^��b��� BA� BA�3�Q����7���Nm������f�KC��ZP��n��l&$IB�n�V+�A.MOee9�烺dG{���h�����v���;��ѣGY�j9���\��q��]�\rss���e˖-\��-^/))���X�/_~��\ BA�346$��j�B��oUU��tt�j���E X�z�*A��P���7��s� � ��+*����i� XکQ%\F$I��QQ쪩a�ѣ'\VI�g̞^^L��fp@��41h���W[���jv�ԐRSC�N��F�jI��%� �e�e��O���VK7OO{��VK���YM���T��.�[2qW�����NUvG��׮�1�6ٞi��o���zJ B����e7-�dO�5�ظ}�,��5� �'OF�$���j~x�j�ֲ�~n���W�U������*����H�-���2�wf���ݔ,`�/{� ����~������_뫵��l����j���5��`�1�<�v��w�ix݌:#6���#5���q�^K���ج6���O ��Lh�P� B���m�c� |l ����nIeߦ}��fL���?0�庀�~C;�ڿ��gs�zFٿW����7$:�}�[��us��H^\***x��gY�x1�~�->>>�l6&M��ڡ�III ~~���6gݺu(/౎������aŊ�� \�.�O�� �{��x*+�e"%��Bt��4�`��b9�$�(�/��m���$�_ӂ ¥Eg��hF�����/8��6-��*������x��!*O�J�A//f��2���c�]Jj�VRjj�YS���j�9v�t�+'�l�ִm��ps��lT�I�%@�vڎp���� �{�{:M�=^���޾�4��fׯ�8ޢ�H��ʩ´B��x�xPu� ���,����s��+{~���;������ܛ���B�a���(jT�j�V�EK�Cu�mi�T��a��oK�j�Z��FEb�HH�!d�q��$Wn� >�����9���Mr�y���sR��Q�F�⏡�!�]EvZ��{S���ې��D���(��Û�y%��;k��(-,���Fr���;O;�d阥��jr��h����L ���������$Fߨ���zҪ)��I�K� ���Lm�L&�af]�k���Z����z=ث޹��7��i��tK=_w����b�������^�+�9��!�]�V�U,�-t���TTd6�ݤk]U��2%�Ֆ�$1q�D��*֟\��2ʊ�ܿ�z�ٳ�J�O<��ڍo��7�3�N(++���{{��'�`�N޷���bhh��DAh�ĭ�� ��F_����u�q��NK�@��//Ϧ��,ju1r��7Tju)���� ##A��y+)��j�}U1��Y�S�m� �G%j5%'�~�0�.\ [��ծ�.� �Y[���`�RIDN\��c��t8r���'x6>�o�Ӊ�Lj@������dt75e��= ==�����^�(8��~���{w����q''�[X���m���G��=��1;c(�*� ��K1����v6�wf�f�y��V����nr���3��� u�C15 ��Q�)9��! ��_�&csc�� M )/)g��� &� }C}m,5.U�`�9��μ3gX��*�� )gS(�/&�z�~9�mGhao�M@U��*A�{T����tr�I�őy%Sg�@�n���݊Կ6�ř�3��w=� �.��-��t'P�V��yE�0���5���c�&�W�Xͦ�n"�P�6�r6���k��{7��J���w���'�r�W�np���$ #EE��$�025�8��]����6,<<��'����\.'==�� ��������3'''X�b���Q���8x����pqqaҤI���X'6""�LƁ9r$���,[����$d2���ڹ�Ν#44KKK�����ݻ���dѢE�9!!!L�6M��CCC����ѣ�����ꫤ��&��KFFs�Υ{�����òe�9r$����[��L�s~2��իW���O�����ѣoK|����A�f�3�y�V�V�!=��7ڑ���PZ�H��7>�U�53 DO��6,� ��V�-,��+Wj%���`o �g �[�Z�7W��()����&%�[�����)Ϻ�ޖ��rm��������rie�Ձ�o�Ӏ� P�Zՠ�LF�BAw33m[P?\ �u2��p��ƀI�k�_�������������(�����~����j��z�c����J�P�d7���w���`�[��3�CY�l��c�o���{����W�2Yi�0���B[��oh�l�=�7�weYEհ��=���u'I���]oJ�$?9X'��Cq����������a�nK��l�qI&����3�g�ǐ�jW�VN��u%�p<'w�$?3_��WW�<506 �?a�V������o���Q��Y{��R͙�3��8Sg�N��֭��C�9��1.��D�\~X�Pц���X}*w/ח4<���;�Z�f�sm-,1VS�_\�kHh�V�ZEpp0s����Պ��vvv�nw��z���ԩSy��)--����g�֭�߿���U*� ��חu�֑���;��رc9t�������p>��C Qո�����֖�����^|�E222t~�V�ĭ.&&�O?��E�!I/���^����#"" ��5�/_Ndd$+W���ۛ��$m2rÆ �1wwwV�\ ��B���^c���lٲ�:����H � 4�PKK���H,�{M����<��]K ?���������S� 14t�Դ�[A��Fì�xj^���ff<��T�f��.��լOO���DR�� ���n�fh�C���L�]�\B%j5/���z���h4���i[����h~>W+���Ջ�_��~#A�d��LF��}���P�S������]���U>�:|��k��O>=}8��!2.g�w=#S#���� ��?�_;ק���Mf�7�H�����5����͑-G��uvq��#j{�Q�ظ����~��O���:�$�꿐�U�Awj�)2.g��Ʌ!O a����^˭ <�=nbaB������z��Qk�o/_��¥��ȸ�AQn�2% �^����@��{�2v�XN�>Eʹ}>��?�ɸ�Ѥ��V�G�ERtg#ϒ���S'�>=G_G������}u,�v��/��Jɢ ��5�{x�5��vn�Q=043���&39[w[z��E��l���_k�#��± ��M!?3�b-?,�-�tO'�<�������񱥏��������T����'��&���k�q���X�pj�) � q��ʰY�X��z�|7>�n��昛W��}3m;/^���?}��v�C����r��e���IFFgϞ�&ºt�Bpp0W�\���M;w�ĉ�����'%%������$&&�c�:T.�cgg����=���\֯_��� ����Z���mLMM����D��Ç��� ���F'. 066�������'�|rS���H$A��$I<����.Ԫ��g��8��� ��L��*�`���yju)*U)&&~���� B��5#��99������:���B���hؐ����\.-��ں�8��ӓi����d80?�v���/^�X�� O�Vw�X��p��T[�O^���Y�Ƣ�$��ht�3WO VO�d�Hv���*dj!SC��3Г7����=<�h|���2�j5SWLE&��,Sr���}����.�U�>�|��ۦ���.�yyL������=G����sꊩ��Z:Z6z����\��i��S+Z��Z�p@�9�v���П��7x���N�!�u�<�{4�9�:����d�N %tZh�s�z.�� ��o�_�Ǩ�5�+]C����5ک':��Ԥ�6cZ|�'�g��ad�fs����?�O�܆���ƍ̌��p�?�����5���5�m���"&&�B�3�V�ټy3s��ip��7ү_?�*���@����駟x���%��mۆ���69p��6i���� mr 88���RSSq��Y��^�z��k�3g����ر�Q�F1m�4|}}ߐƟA�[�� B3 wtd�ŋ��h�'I|��� ��/QR�������2�����$��AAh��U*�MH@�nU����LP� !��֩4~�v���XR�M ��(N���x�ӓ����n������vͽ�^�D�Z�o�M��՜((`N99��%��U��$��ht�[Y��r�d��$��̌���� ~&&�d�]�(��o�}�L&��ʔœBm"F�$�y?�����u�x���g�SVR�$I�xn�&�_po���Ƿ'�� M ���)ʽ�3��զ�V��p��j5Æ cŊ�����OUǪ����kh ��>5�ry��-e�B�i̘1����i�&�l�B@@3g�d�ҥ�n۔�@��"A���t�R���[:A�vj5��L �l��14�0m�'3f�ԙ�Recb�c���b��K�.�o߾�E�&x��RJKk%GL�r��%~� �Z�����y-1���� &e�B.g��3]\0�׾AL�$Vv�����:���+��|��{ǒ�%j5G����e_v6���(Q��JkV� �z2�z�PO��fjJ_sszTVv11A�ZrT�{��}t�ʀ IDATHw�c�)�*@�@ { }��p?�:��n+�ə��2����<�3]ui�����q�G>�|ȹ�C�� J J0�5����.���stO� ���U����?��쌑��Mo?n�8��� ������h{{�� RSSy��oj_�F�b�����k�###)-�kn�f&&&L�2�)S��z�j�Ν��o��������q�� 7���`K�.%=7n�g� B�j�F>�_�|�SOݸ�V��є�P�@.7��1 �]����ImPA�}.����ҥ:$�����׿�1 Bs�h4l��d�ŋ�i�֗4��x�ݝ�\]1�k�c�}���37�H^^�V��RR(Q���c���z�@����\mB�h~>� r*��U�X=6=*چj���ljJ�jmB���b ��B=�̌;lK�q[����c^Sg�����}��v_��Ch��x� 6n�ȨQ��o߾\�|�_���3g6�:sРA���2j�(^}�UrssY�d }���Y�)�v튗��'O���_'77��˗cbb�sS�F�i�*�G�2e����[z�����f͚�<@�HOOg�ƍ���```@XX+V� &&,--�k�}� �m��wDqqqErВ6ߚA�����r��T��NyyzzV���PdBkWU17k�,�,YBzz:S�La���89U�E�����ٳ�믿���b�С<��#�3F�&8""���0"##Y�x1G�% �+V����̙3ٻw/����W^�ys�������ٹs'%%%<��L�6 ?���r3JKKY�p!{���������2~�x�/_άY�X�~=P�� �ڵk�2e �������T*�駟�$����f�O��{>!�VRC��T=�B[r07�y.p8/��*�*r@_&�yWW^psú��qI�x�ˋ��"X��F�Z�7~~�o1I�]^���<���7;���T\<������z����62b��%�*�����tڦ � �ݠ�� ��tuu%**����3�|222pqq!,,�I-Fe2<��󄇇���OHH|�A�q�7�}�v�z�)&M����o���&M҉��9�u� �JQQ�����;��9sHNN��ӓ��0��ǏOLL �F�"99���x����L4Ǐ'88��c��,,,ȓ�a�l�+������ ��ݙ�R�Z�BeHt���3������y$I\@�[��������� ��� � ��_%((��s�"I/��d��������7�p���cffƮ]�x��W�ꫯ?~}�`kk��O?���;k׮�믿&==SS�:�NJJ��ۛ5k�0u��&?7_|�K�,a���������Jll,���(((��'� 99�͛7`nn���^^^���1l�0f͚���]����M��Z��ϫ��dg3������k��Ah����ŋl��D�n¬:9 �$f���;��w�� �Fý'Np8/���H�8;;6t�|S�:�����KdN{��9[T�m���*�fBp��!VV ���IT��q}C�������ڜ��ܖ����ۋ�;w2|�p�o�ΰa�Z:A�ԟWQQQ���P�-�h�H��������H ���e����ŴcccY�j��q�ϟ��ǎ���g����a�)S�0s�L�Ν˸q�6z��f�I6''�� ���BϞ=�5k&L�.�!B� �� -@� ���K^�a@��f8�-���) ����r�ʊ����/�x� �}�]�N����'_�5��^����O]cU�V�T���r���Z����R� �/���֭[4hÆ ���Ωo��ITAZƵ�2^KL���/���}~n��R�V�IJ �MJ"_��s}A@�ft�� K���hb�챼��ŠjU�`(�Q�Vk�Rfg�����j�������Bг�BP$A��صk���yMfff�~��3gj� ��~�� B �Ir���@�̦��ff=Z:$����/8p /�xc}˿�������G��X����t�����k }}}ƍǸq�صk��?˖-��� ����H� ܼW.^�X��tQl������2A �MRk4lHOg�ŋ����JxW����cn����17�m1 ��d��*�5@�ZM'cc�W����KKu��~I���`U�୴BA��pwwo�Ah�D�P��:��4���}�����­ e�̙lڴ OOO֬Y���������fM�8��+W��O0}�tF�ANN����cǎ<��Cun����}��ǻ�˃>���-X���={ҥK���Y�f ]�v��� ���0���+�9������4˹ �pk������Z�`��/f�ʂ�Zi4vfg3/!�3EEHPor��ؘ�>>���i��r�7��8�3W\��6����7� AAAA�k�� B 25툩iǖCh$I��c��Gy���8^y��J%#G�d���<��S�n��Xu2��={��h�"��� ^}�Ulll�ӧO�k����s��y���;E��Ƽ��$%%aooOXXk׮�>>x�`��Ùv$8�޷��� ܊��b�_�Ȧ�בK�z*�倾L�|ww�ws���*���yy����/�VV3J�\r��r����Z/SSS􋊰����QK�#�P�����PnbBaaaK�s�u�ܙs�εt� M����ٳg�}<**JT mW����߯3&דcfm���-A#����>�(l��<��s�5�;y,AA�� W�dޅ ����c"9(�J�ee�7)�/RS�U�u%�$ �F�tggzz�``p[��*/gGV�ef�{f&y*�NE���۝�uu�yWW���r,/O���� 0��� '����<���P1R�G����o ��B�İM�$�.��᭷����_'??��CAh�B�୷�jt�H �$I�Ujr��{-� �/P�SHﱽkL��A��c � � ��EII�(��� d2���n���~�J%˓�y��e���DZ������ּ��C'�f�C��p����33�53�#yyh���^��T=�W��������2�c2�Ϭ,�����{wBN��Ta���O�š�˙ ���Z��gCC9���A�_ܹs�Tjn�w�ƍcܸq-� B� B�]Ș��P�_̞/�p������?��� � B��-,dUrr������'���J���|������(����Z㯇B����ca�l1�T��ήh���ղ�Zk VO�W�<�������ŕ�R�c�=}�?diy��&�>^+W2-0�7 j�P�z�E�X���L h�PAAj B�}��U�_L��h��G�G�������3_q-������d��&sj�)��� � *�U�D�a�ۛQ�����2%�q�\9}���ٿβ鿛P��X�X3���X:��B���.\ O���ؘ�v"q,� �;��ٛ�Sk\ ����P&��A B5� x.!�}994�j�zz����t''�o񵛫T�5#� �����FÍ���6a��C� y��J�^ ���mn�0++vU�"<]X���l�Y[�h`���@�EEq�� �� #N�dP=�[:O��o�ʥ�\�M��3�����H&�g�]c���D_�JzA�lm���k��ۢ��v-^VV�3Fg��y�W�����C��fH�-s����x� �W��]\̾�S��3'|�V���`�����9n������=0��A�n&� �B��h�� ��� #�6�fCĚmr��ߍ�O`�';I>�L��t���ǐC(�.d۲m��`��`�Fa�aGʹ��k@��c����Q��8�:��{�aje� g-���_'O�B��;G�B��]�ȷ �ж)5����j�(B,-)Z -�zYo$%�Ej*���j)*�e2^tsc���p��H���L6���=+ �F���Q}�ê� %���9��2��?���Z\��ŎjU�r`�K ����Ȉ�AA�"��\�H,U����`����'�M3���Zl��o�1�W/���K�ogB��������rq!< ��:w�V��HKc�#�ML$��o++��P�f=ߌ�"���w�����Ci�}������Ÿj+�ꪮ�HJ"l�:������{��mۈHJ"�����<ҵ+�t�>I99x�\�/'��3�x��<ӫ��0��t��K�X]q�rDx8='������!�r�6 �P��Ņ�]����O���ol�0��_AA�� څ�a��yi �2%I1I��ڏ����{��썹�y��e�U�i+I����.�\j��N�qW�OO�&]�R�+��v��&���V�JŤ�g�S��Ӷ�����fb"���N< � Bk��T��ŋ���@��#��"A��4 �ge�\|<�%%�N V��1k��5�����תR�!"'����x�:�*�Κ��js����r��g��=-,0h����yx0�Z�@x��e~��M;��Ԕ� ���H�B]g�R�M��$�p�;x0EE$�屹2�S��R��Z�W���QT^�7�G�Oj*sv�$9/��޹�>R����ؚ�05��&ۭ������, ��te{�s��,�L>�ܾ�66l�0+##N_��I# o٢E�9h�M���5.���b&���z��ԔA��|�_����{��O��;SS�;;SS�'%�`�^� x�FR��;��������I��G�̝���9z�����+� ����0�Ӧ���L�ڕy��`kbŒ=X}�8� ����Gfq1����VX�l��,ڿ�Z��h.� w%�@hW� ����[W7������o�lT|0H=��O�K�1ǩb����v��?��� 1�4�����?$bMD�NDh��$ ej�Ѯ����j��A��Yz� �Je�q}���zy�@D���La!Cbbu�I $|����{w�w�~S�A�F���\f�?���� ��a}z:���t`��t�ʿ %�����׮]�~�=|ީ����59fiI�����ؖ�Ila�μ ��?�w�P&��Ui4���MFyy��%�>f��i���MM1j�=�J�a�C��͍�}��ogdž�'Y��������yx����6���ͳ}�0��;80�[7�8� 'O-.c�ә��OOgg|�����w�c�dk��M&��fd` �3�c�:�Ϗr����,�Xc��%IbqX}\]�bZP/����s�j����yo�`����Pё����c==��B_.��kcc�2f�y2I�?AA��#�F���Ǐ3��烈������ZM|f�m;� � ��� ڇ�w���\����S��+�o����W����bb^�V��j����h���� #S#J K�����~'hD��O�(��Pݻ���yl�c�yn �ə��v?�Lb��Aw7� k##�����a^E���\��X�B�)�}[�p!�֭#11��C!$$ooo���[�Wxx8�.]b߾}�� �Cri)�_�\k=7𢛛�B�r�LL���Td��3h"���ˋ����ob�N��p����]�Ɔ�tR��t*�'�j�ge�dGG��ؠ��5 �J�$^��d����1=�˗Y׹���~l�ޝ�cb(�h�-X/3$:��AA����: ��֩ pt�PO33���U�� ��8��ɇ���ѣ�9��b���W ttdn߾��O?��Օѝ:15 �F�՞�9�_�GcI?�j�����z�ٳlOH����$��R�)U��*.�Y�pt�N��e28�����7y�9��1�Ϗ�QQ �Ё��v]���ɓoy� QW����A��%�� �B��h�wF��u�ŷ���`�O!�BH8����k\>}��g}�3��˞�i�@E5�y��k ��8�?���w\�Z B4`jeʔ�SX��r�s�X�$����[;i����kWzGE�R׾��2�˙��]�����6��|�ߺu+�:�n�ڵky���Q���裏P��J��!!!xyy�f͚�En�/ֹ����/��ձ� 4�r��OSSy=1Q�.S]�kRN���'�����W���;[X���]��t.���)X�_�XO��)��{_kk�*���d�s��_Z������o�ȼ���`�P|���}�"��o���L'Ah^���$��9��z�gO�|�-W �2* _kkBos5����ѓ��`m��dAA�%�bTh�*? U��P����o�t/SWL�Y�O�$�OP���L�|:�M�?��+�q�s������O�gp#��eP�Y� C������CC�;9�5�y,s;s�,���F�$ID����n�S#� �����ڝ�5���]�k��\PB�ӔvǷSi�KKK��n�B���ҲY��ڕָP%m���|�MO���m/�;R-%�ݶgf���Q�&$��R��p�š IDATZ���{��1={�iǎ�&��y��e���˱c,�t��%%��Q�*�`l�"//.����=����"�A�HX,��Ua���+u�ncÏ]��$�T��yy����o|�I���8����))u�ˑ�'��`a!ڵ����˙?>?��<�����8v����'::�N�:�ĉ�ɻ�/�t�R���KJJ ���,X���{ ����,Y��?�LRR���<��c,^�OOO���Q*����O�d2Ν;W�b��M��?βe˸r� !!!|�����۳i�&�qd�%�����o�l1�v�Z>��C.\�����?�8s���^���f֬Y,Y����t�L���ٳqrrj��GFF�/fϞ=$$$�����O?ͼy�9r$���DFF�n�:"""8p 2���?��'N�c�:v��Ν;�=>A���&$h�ѭ"<���~���Jla!sؕ����[ J���!+}}kk�`�}ji)�_��t���Gƍ������E ����$LM[M5?�#���z�")ee@�9|���k��u&H��c]��L9{V�|��?��x��Y�ץ �Vt~��0OO����Hr2>�֘b �׺�LSY%z���C?��~������[Xp.#����Y=j YY|��qV(���$��%��ݻ���}�1�{�ff#�11��#��e S�lazp0N 1W�2��w���C�h��Ё�~���v�bR�n�v�<{j�������HV?N~8}���.5)���i��'+&��U\�ͱ42�i骝��ž�$�ed`kb�����gȌ=xq�.d�Dx``�1\-(�jA����gfbnh�������T�"���ZMr^Qii�{� ���|1rd��WA��I$AZ�2"sr8STT�e�(T�x��9��޽U]��e˖���_3o�Ə���Ǚ1c&L 77�'Nh�$��>��aÆ�n�:,*/>TUqW�G}��o�Mvv6o��S�Laǎ�=�?��9s�p��U���q������3f0}�t���+6o��… 133��'��΋����O?eѢEH�� /�@FF�W���y��� ,,L��k��˗�ʕ+���&))���46l���#pwwg�ʕXYYi�}���?~<[�l��Ĥ���֠D�fnn�q5�Ϛ��� ܌��r%%�IJ��2��u�e2^���y77��y=���l����T�dg��7o�Ι3g�N�bϞ=�m���[._���� ��>�V��J���;�ԩSY�~=={��w^M�����Ջ�K���x�磊L&c��DFF6�X��T��ҳ�C��O:I9��ܜCAA"� 4�r���*�,���(�X�Q{{������� ���|����42��u��k��[[up`��5�m$^�R����dU��\.'��XWpŕ+<�B��\]y��G|�!NNN^�J��) ��k�pZ��v��c��:aC||Z:�[r.#�O?ex8��[:Ah��e�X[XH����fIA�툊�k � �LL��2�R�9 $��;m��/55��Ǐ3t�P��C�괐���b˖-( �aÆQXXȎ;x饗x饗�۷/�/&55U�}tt4�=��X$IbذaM����]� A&���4i{���2�m��<�3>b�"##�~��v,((H�&%%E�k�ի���7����_~I���Y�` M�v���7u,AhM�M� +��H�lGV�ǎ�\By�$�^q���8�w]��J���l�~�!11�9�{�/�Q����ƾ���XZ��Ϗ����O�����m3�Ac��ynn:��U*�l��!�\77���5�<9����.� �iK� ��#�JK��ZR�-)S������;w�@�"9(� ��v>�� �s�y������V��<�J�oVڣ��˨�j�M�FLL�Ο��x ��O?͕+Wg��������Gu�O�K�$�����j�j��*��* �m�X4f�RRR�7o�����K/5iۦ>���Icmm�Wm�#A���q�$�O��B7F�}}����O��^����,�x����Μa_v6jW V�� 63�C__���gw` S1oí��qq��ZRS�w�2e t�X����nn��_�x���ݔ#����@^0�Ͷ����)�>�����x#� � Bs BA�V��p32�3I����;��B�����у?��S;��hصk�NR/88�ݻw���]동��v���O=���'s��aŊRVV�/���,q_�r����3���@�Vk+����(--�w�5��~�Mg���gРA���5K����� S�La˖-�X��O>����2��܊��Z,6A�S4 �y{�tB;P�V�()��G��++ �{�A=*�/��q�O�::j�lj�`Շ` ���nn��ݛz��YWW n�9�Izz<���2��� �� n'I�x{3�F[{ ��Ѽ��V�r၁���:{�NŻںՂ � ��H � �" ==6��7X��zb"1w0*�5x������y�w8t�?�0J�R����w�%))���dzu�VرcӧO������BfΜɾ}��x�"{���?��&���F���/�̢E��������|��g�c�W��hj=faa��)S�������;w.����J�����֭#==����:�����}�vf͚űc�x��WY�f &L�����ѣ���q�ر��n֬Y���$$$p��A6n�HHH�����8|�0111dddܖ*FAhir�igg:���t(B�=3�NG��()�r���~bV}pnc��޽y��Ee�PS��*�_�R(��sg��s�������WW���SJ��K�P7R�/I�:t`����y�*��'Or����,� � #�� �L���j �F�#�����ڗ_|�iӦ���3q�D<==�5kV� �cǎQ\\��O?M`` �?���������/���o2}����P�U��������_��9g�x��'���cժU��ƏOXX�F���ޞC������3��x�ӳ��ڰK%%�9u�N�"�����V����ٽ;�v놯���Zpptt��4�ɘ��DLϞ�у�0jC� ��Lwr�Vj� %%�����2Ibm���17�n�rT*���k۵ʁ33��ѣIkg�����q.��h�g9p���wﮭ������W�nj��y�Z:A�z-\������::��T*� � QQQ��P�5�I�v�~�?�5�¤$.���'AA�`���\WזEh�vgg���Q$&RZOr��bm��#���)gg�ef6Z--r�%�G��9ĩ^����|W&<�����@�٫���"rr�����>���Ӿ'U���y6>���� � � �~��S��%j"�D�t$� �R�����A� ��K���Խ/�ɸ8v4�pA���k�)Bۧ����D.ot� TI)-eNB��_G����&&|٩.|���S-X�ڂrIB���ed�,�::b��;O�M����w����˩X�0�ʪI����[7EGW�9L����T:���Y@AAڤv� �h4 3E��$��X A��K��)��iw[��b��+&'��+*5������k<����� �-X�fMK� �m��ؘ���-��F��լJI���D���u�+%�$�%��x�01��99ȸ����"Q5�Ɔ�]\��D&nN����)�ml؞��R�A���!*?�`��I��ga��]�0���� x1����ٻ�������{o��H��� $bFk�ڊh��h���U�UU���W������*�v�Ċ ��AD����Gn�/7 IH��|<<8�s>�sn��sޟ��S=AA�*�B===��A�����;� �u�(�S�Г�0�,v'%i��RH��}�n��X��� �`aݺ�DF(���F��q++��R �]-,hljʒ�X���-�^WGO�Ѷ�����V_��N�%�>|�Y����b��w��`m�|77&߹�����P�4nL�rAAAx>�B]]]P��37�]����A�Ǻp�"��?���H&c��'m.]*� H�˙|��xxT^GA��R)�--���s.!/�I��l�_�+���@���=br�f���J���c���Q�&:"P]n���hknΩ�T��������gdT��|joOxV���5�F�J�]��ŦM����t�Lֿ�&C||��+�q�AA�n/E�P�e���9���cYll��\ `mBC�ԡM���=A�a.���E�ǒ�T���勻w�Q�-胂�P�edDhV{��Jݮ0����#mlek���a���e���3���m-�H�͚���} �D��D��p��#��Ir9ݮ^匟&b~R��\��'Np9!�Č �[Y��͍i�[cX��Vڭ_�������Z�0ifE���K�0�ח�۵{�6W_����׹�����l� J[gg�m����F�g����ff8����Ã�M���# � ��NZ�^L�w�`���f9��Yf���[����۷��8��S�#)���[�*K��GA*��T�>�;��F� N�RYj��0�l������� 0U���̌͞�$�j�\77|FjԠ����!�\�b}Bq��:��D�voo<��5�B�"43�A��(T�k[*�����[�}��_z��ҨQ|��kl�~�F?�Drvvuw��Z�� �U����|:��0�s�'��� �&qg�x6��G���Μ������Yi�A��$��_bŃxUɡI&afcS��/Y��֭��W��r),5Z�7%p';��QQ�u�AAx�%����͛�s� �����g�z.��32��� ���rӦ���cp��"0]I$ _99iU�P�T,����Lut8ШV����k `�Ç|Vl�B�j��|��##/��=J�+0��;ڬ[����yTF�L:s�&��а={h�a�ֺ��ἶv-�s��ƦM�v��E�Z�ϰ={p\��������� ~>����o���eS�~�qr��Ғ//μ�>�))|��?O<��Hg�$*5U�n�޽�����O�͛�x� �����#RR�Μ��[�xw�.�,X@�_e�͛�mzn�B`d$._F:s&ҙ3 ����s�+�LIa�Hg�D��7�{��%K�u�V_�J%� 2����^���l��[�����NW&���1���4����f͸��G�����'�+� ‹O�i �B�����q�.U�M����+��[̊�$,+�� � ��J��8�ΞeCBPz9���,J���]H�I$|dkKx�l����ĤJ����ceE=CCM6��16�GE��e����F�ЗJ5�S�bb�).��z,<�//$ ;BC��o�r�~�����`����=�6z47kƊ �v��S�Y4m�͛�߶��6��>>�8q��N��l3f�~T�����ҨQ�l��2J}Jg�d����ן�n�������%^�66���3[�]CQ��JY�z*� kcc~�ۗ+}�[^^|y�(?��v��Ե�����Ҩvm�m�JlZ��������4 a�$&M��޾�1���̌I�Z�0i�~�S��j҄_.]BU$3��[�x���p_�r^���44d|��� C.*�� �K�,(�:�֭�޿����������7uF[nz:G��'<0yn.����w����4Lj�x��f���]l��yc�tV��A�������%���o@��|B��E*��|�PZ ƹ�빴u+ ���|��[oi׮����u�x�K�V���O��푪�sX?p �6j��_E��K�ߦٻ�b`fF������g�,B߀�̛W��?���g�0x0N������+V~��׮�oj�s��_��3�Wsb�2����0����?u���*��Օ?�����-� ��Qaa��sD � �P%B33y��MΥ����V�Z��$��L�x{{���QK���T"�K''��p�U*Y�T'� ��� �4��իZ�0\ x�Ҳz-��XO����l�r�a�@QdJ ���z�=�v�ڴ������������+�f��x��ÌoтI�ZШvmT*_?��v�����Jb"�ڴ���-n��y�oe���q��u#) =������Ã#w�r;9+��R�D·:h�]-,H��e���L~�5�m;��2C=o`�Z�X���������=� Cj=�, �I����im�A������μ�r%��� C���B��w���‚._~���-Wv�`u��L:=##�sr�u��4a���� c�ĉ@ɺ�A7ҠgO��#7��Yć� �ɡ���ć����/���s��]���?�D�cqnْ��`��:��'�x�M;aG����F�o�!��}��=T*Z�C�N��:}:���I�n:�s|���4��s���ɓO}��9�r%}.���'�))D�l�2��ٷ�������S�%�c�� ����|��kr�xJ =|H/�ͯ����شi.\`ѢE>t��W�SSq07gÕ+8��i��d�ٳ�P$�N�R�-�s9!�:u��eK�oۆ��=���g��e�%zc̘����3.��X����o�`x8����IKC�T��P����e���]����2��ڵ�{'8 IDAT9�?� �AI�ML������`�իGDJ ����p� pUP�?�ŠSAAx��rwb�99$޸A��c�m��"#%C����{��~=F��mu�� �Ɓ���ǽӧQ�弽j���8�l�TG�}Ӧ�h��ʊ��|�MÆm���C��|�"R�4���s'0�-P��sl�b�L�J�A����NfR����U*��|~��z�m� �>~��c� ��C_]�ǸH����0�]Kg�g��1��X׭�G�.َ �k`���R�T�o� �_�5��֖���JdJ������S=��O>d�ĉ,_��?��333�J%�ƍ���ё��,,,*�ߞ={��deoXMڵk��� �֭��� ��N��2��M�dg���4R Qn��|����Z����j�+��#��5����|�?x�;�k?�1G��p7;����a�����W�p�iSj���*���Gu`pZ�6l�r�!>>���ss�m�==��}{�YZ��!}�n-1waQR�D�'@z�� �G�ڴa`�%��55`v�|ܬ����#4�iG���o_�yz>�y�eeE�B�_aa V?w(j�Ե����(�/��������€�ۙԪ��t��Ғ�w�2v�~2���f��Z��v����M���$dd�&8�����/cn�gu��t�R�,`AAx��rB]Z~��F���Ϗ��:�ӿ?��/��!!�gg��X��/O+H�"rrXDŽR�^LG�A�P0b��E�?��������ӣV�Z޷F�UУ�^nn.�� � ��R�r>�s�U���(;C�8�������k�D*2R���:u���=23GJ��� �U�3�f��p';����}O�ϧ�ի�l���xЋJ"��^�Fl�r��NN�}�HSn`{h(�r9˻wG_� b�ke�����޸19r9�ܹC3u�PS}}�ZZr<"��eLUbkj�D&���ή]�T�����S�Ȉmׯ�>��$02R+����;CCQ�T�ϣ?�d���t ss�t�Y�͉��O��Cf��d�c���m��ٙz5k����_��Ė-�Տr���u����D������� ��R{%�w��SƟ8�{����7�[��Ɓ��J�,,�o�߯�3��az̞]p����y�M��:���T*E���\�T�R}cV�w�o��j��w��&+P"�h��9�L���iϿ�X880��qz}�=*��m�/��Uj��3��X��^rB �M�w����Æ c������ ��HLLdƌ��1z�������|||X�x1<(w۷nݢG�X[[cgg����ILLԼ~��q�R)�N��gϞXYY�`�"""�J�j��y�&�۷�F����s��a����9s�f�v��1|�p�so߾=;w�I�&���3u�T����}����'�|B�F�022��͍ гgOٰaR�T���R)�W�f��Ѹ��лw�*� �iOR�����3��;�����?�da� __���x��J��::|dkKa�N \���tZ�SS*���ӓff��*T*.ed����3�r ��!<9� �#�E�7�ur"W�`���\KL���@����y������ ~�v� ޹}�Lk���.]8��ɡ;w����7o2r�^“����aNGEq��#��I��u�ضǏ?��H���idĊ��9ΐݻ9Ixr2;CCym�Z�ի��Ν��/-7��"8>�oN����d����D�����E�$$0��aNDF��?*�J�Zupv�lL WH��*�����Ņc�LJ")+K���&M���)������������B���o?|���SS���U(H�� 6-�s11�<�ƫVa��˪�=�u�� � ��^�!���1���o�~�Nm�d�e>|HfR��ZLՙ�;s�2yYY���9u��:���g�ꊞ��.�h���iF]��Je���{t�9��T�A����y�b._&R�E_�Ą���JoS^5�k֤��E���Y 3��� /�e˖�d����/Wv^tt4M�4��ё�۷�h�"e�Ӭc�5�ˣG�o�\]�U��V�Y���9��{�{���v�l�f�8���&zz�''3p�N�\���@���2���Ba�0;���a��7��F�-�3��?���Gl�Nc�8�"՗����6`W�i7��Xڵ��ui��¬���!(�n�7������K\�Ү�D"ѺV�����B��~�����y�����p�������^���"��>>�$�yzR�Ȩ���Ӆ ��ZE�-[�H$|�w/~�V����Z��7:�� q[��wv�b{h(��� ;�r�#� ‹�+1�I�o��ީ��k���]�Ο���a4�ݛ����s���^��䤥���tq��kW\Z�B��˶ѣy���H�s��RJ{�J!�R�Jd%�ӣ����7}}�{���̌��nB�/�(�q�[�D"�re�.�wꄞ�II%�?2(Hs�G��#��U�l�T�+Z�ӫWcV�6�==Q)�\޾�55�����|���öQ#��50x���U%�H���Ϡ�� `E\���������� 3�Ö������o���� VիW��u������ $))�7nh������Ϗ��h4�8��S�j�#""��½{�8p������ښnݺ�y���lܸ;;;BCCY�l��166���� >�8{�,;v�}��8�����=== K}<<90�ښ� �d����~�����.������E��rM���gh�p���P��"��մ)��6�Z��>]kYYl����!�ڴaZ��W�k��L;g�R_�cb�η�z���)ޗ��f�����b����s��nnZ�xy�奵��u��M�,v �n�\�F�}� ��lkj��>}JlW�\����ҿi�F|F� �����3�];f��4���a])�A����e������Y����#��P��H� ټ�����e ��wg����]�J ��P]�ݸ���T�����{����Zs�=n$��8+���С��`q׮���8�n�����x��5j��ϸ�u+����{��2� ���'��'��305��_~am@��'��#�/]������'����y�XЬgV�.�=AJ�fh����~�K�O����. ω��`���155�����F�T�k׮2�߾};����� ���/���l۶Mk۲}{�����Ahݺu���kܸ�&8���Gll,qqq�ݧY�f���Ҵ�Q M�0�5k�ШQ#���K�+���<�NA��խ�,�\�Ĩ�02�rg JS��/������Gww|�Ltp@^dY ���ǭkh��� �ˤ��g(c*1�sgVt�Np|<�ry�;<�� �>z�ă�Q���1�OA�"^� Bkk�Z�����y�T:Ʉ(��Ϗ{�h�/l��e��s�;y��~CK�4�3~�u^ݺ������7 �be�^9��F��ZW���֟��rnْ�w�h�� D�A��x�NS��iʔ2��lSY��@\n�֜� ��GHN���euuO�&J���]��x��� �=�D")5�4ExO:ޓ����TkY�.�-��=}��!66�;v�{�n|||3f ���+s��\A��M�Rɼ�hfFD��3�Pm]]>st�CLu^�[˗Bs33Z�������������奔�9[��p��f�R��oHW�6źH�GA�*C�1_��l˵k�ܻ���Y�q-� B%{�2+˅-[��p��;w8�f �W�����be+A� �2��գ�����n�F^��~‹��Ϗ�Ǐckk����֟�8{�,��ɚu�.]"..��*X2�W�^DEEq��mͺ��@rK�'��1d�v����ŋY�|9yyy@A�׬"s � ��Φ��s����C�R��5X8����!k��'�ߟ�"8������2K�d]BB�;�ښ����e%� /��CCQ�廬P�a���}�G�ŵ��AA*B�RZ|<�&L`UϞ�;}���~ʠ_~��n �� �U�&�,-K��+���lV?���r�>}:R��^�z�y�f�ܹñc���O�U:�m۶XYYѫW/���ǖ-[x��hٲ�����ѠA\\\x��4ǚ:u*FFFZ��*���,� ��Ã���Wh��c������ӧپ};�ڵCO��СCΞ=˕+WHJJ��,FA���.�3��mZs;+��� ���ۛ[͛3��=���|���¡H�o�0:��x���F�^V�SR�q�^�_AA��#��R�O?e©S|y��_O�7�D�����%�+L"��C�z�-���ݻ��`� ���O*�iooOpp05k��/��aÆ�9����reJ�R�?���9Æ cҤI4jԨ������+�~���2x�`�.]ʬY������K�s*���f���,n߾Mvvv��Y܄ ���a�ȑxxx�l�2�k �C���ՋZ�jq�̙ _�:�{���AA,��E�k�^_��\oޜ~��H�Y"Zx1�$>upК+0*7��>���K$�yx�fh�ȦfGE����AA��$���ŋ���Uw_���� *�=z0髯��;� ��`�,2����DB|||��1#"�o""JdH�o\\��ɩJ�*��ޞ��X��숉����������}�8{� �3��I����Ӷ�ŋ���ry����3��{��U��ؘ�u��kB�V�"��?ut��9e��1Ugm(�Jbcc��7� e3�fϕ�yy�s�=*s[0�ёY..H�����|y�� }}�ss��9*�GE�~�:���3�NΦ��:.%�Q�NN���(�tr�Զ�C�R��Khf&������CXVaYY�)�*� P�RQZ�/��A@ �H*���mذaDFFr�ر�� � � A_0����f���Ф ���0��,��Ǘ,��Ν����*�P��qvfsb��|S!�JŜ�H�ԫWM=f͚�W_}EzzzuwE�*���ڵH$��d�Ubپ�<��'OYJ�D����r��ԔY�fUj߄�#W�XUPN��735�� ���_�}^|2���L GE�gح�l�����¢��[Z�.�ӹ���ɮ���=���ҹ��-�P����Chf&�YY�ffr%#���lrԟ�R �EiA;� (�}}� p10���G}}����Lg'�%77}�y(� � ���|�::�6�V�����<ƢP������@�tu���+���� ��,���*s�V��1�������E@@@@uwC�*v 9�nW����ֆ �V�f��}*5�֗.�X/>wt�;W�*k[��=�7�-G9Q��U��W�_����:u�v�.��`� X]%B=��� ���yR�r�d�u�:W�5���੏��Tr��@���lM��p���ؾJ 2 +�xiQ)࠯�������gdD]CC��d`P0a13�����scǎ��#11�!C�0n�8l�%aSRR7n'O�$99�.]�0h� ��郎N�#��ǏӡC���o ��LJŋ���Ę1c8z�(�Z�bʔ)4k�LӇ��4��� l5]\4��x�����Ƞ t��hԯ���=�|f�ŋ�5��w�b���ӧ��G�R��R����}H$�9B�ݻ�3{6�W� ��ũE ޘ6 kk�dI�'�o�����C���(��iл7�>� ��&-��uέ[ǽ�%'- :�n�[?���RZ�ѓ+V~��׮�oj�s��_��3�Wsb�2M��M�@��㟺}��Lqt䧸8�ڏ>��,��ݫ�g� /���M)��$@+s�*m���Hd��E�K�Lrp�Ҷ�����ذ0��2�pi:֨�OO1Hx*f::|dk˒��$'s++��FF�ޞ��>�4����@Ap.]��_H����/#h��Tr;;[����Ռ ���h>{u$T*U�@`�岔�/, �32�I_� ��ƕ+WX�b3g�D"��駟�����ի��7�I IDAT�����|� &&&:t�������hk���|��G|��W|�����[���Ѻuk&N���ٳy뭷�w� ��:`ee�… qttd���4mڔ��D���K�sDD����[����g)�~�z�l���ի��� ..���P�̙CRR111�ڵ 333$ ?��]�veÆ �W��^AA��+ H %h�FZ�1���֨��q��x��v&P�ݝ����}�2��q,P��l4���l� �G�Τ'&�Rdި�G�D��G�S�71�Ԋ�4�OΜ�����_ӰO�lڄ��i���6b�]����o�{�4L�\jߋG"�p��_�ߩ}/&!4����5hاWv��Ԋ�:�nݸ�u+�-�:NJL �{���ۛ�S�`߸1�����;e ��n�ή]�o#F�Yp�&R�R�y�,����g֬!��Y�][�>d&'sx�\��i�Z�;��ӧ�ޯ������>}pl֌�s�obBІ �8�%1�sr�u��4a���� c�ĉ�^נ �۶-o.X���)J���o����3o.X@NZ�V�d�G��Ν�����-h�F\Z���ҥ�=}�׬���B�?}:5��y{�J �͹�n�ѳ{&M"�ܹg*�ȩ�+�p!�==�NI!:8�fC����DȾ}���t��a��߰��e��S��՚'E���g�� 5uu��{� /�c))%��^FF��T����]J0I|lk����!d*̍�����2ˉJ)�.�[�66"kPx&���Y�Y�KcbXQE��֨�77&޹|O������p���T�T����rF!���@`DN�&`�#��,�+T������ T/K)b�/�, �l`P�A�'IMMe�ƍة�����L=��v��|���ewwwn߾ͮ]�J� ˜1c��O�S�N�����+�6m��۷�W�۷o',,�`��T������ٵk��^�}�����Ã5jT�\Ϟ=K�-x�7prr��� ��եV��P���Ą͛7W�=AA���+ �IO��…X8:s�aG�2�￱V��U�~}�����gmǍ#d�^n�`�֭8�KjX:;S8u���h�]�}���� �}��,h֌���qj�\Ӿs˖t��s���_��ښ˗���G^z:g~����R�047��ܹ���v�0����n>��o�i��||H�y��G�4� ��G�Hxw�FM_�)�a�>���C�L���={� ����h9|�f[ �mm��o_r��5s'������t�:�&M�1��'���������Tʛ  S?������-� Һޅ�>�R.��U��54ĹeK�::�6��u�36�ߒ%�������c�P=�к^=V��Ij\涶Oz�J_G_���}�x}�h�srH�q�6c�j2X-����aZ��&3�i�c]�.]��mÆ��kd�T*eI_���XCb^�V�0_�be\ӊ�� � �.[��B)��J$���R}E͍�BJ *Mك�=�J����3!<�����ڧ��9=�_� �eI�x�kj�����`���z�|�ƍk��~~~������uݺu=z�ӧO����r9����ݻw�������Ο?O�z�&++ �"U~� kq�Ν� ���i2�*bԨQ��ۗ�u�ҫW/����o��I$MPQ����Gˋ�55���1�FF406ƺ��) � �� �tv� �Ň��J��}�jm���'��CڎG�֪� �?fu�h��F����o�V��n�vZ��:tHd+�֦M�B�D�{�NZ�l�� �믂���q��)�N�����k��.���ڵ+s���E�2����Ɔ�+W4}��v���{�:��;wP)�(��{�4�]���υ�,,4�A� P��p�:M�B����k�Xk?yn.7(5@v����[䡉�k���N"��(��?~~�� @//Lk����}��iyH$�R�����0�����m�h����ߩ>��k���1��ӿ?Ww�f��?���ӰO�Z�x�� �'C���NN��}[k�X�$ ��� /�s��>��W�x� K�E������%2ht$ժ��(;�\ NOg������V�R ��ynn���C*��J4���h��J����y)�I�ER~>�32����L�X�HJJ�}�+,>Ϡ�TJ}##|���66.x�ml���� �yk��[H&+8[��`x�ɓ'1bs��a�С8;;��/�0W=`�q�*kͪ��FUZ�h���#;;���"�P&CCC>��s>��'n�b~"W�:u���J%R�߱�be 焓P�K��E��}�j�.�o'@/�ob�}(� ���D��*�J��~�R)J��f*������u��j�H�\]��屦O�*����f�p;�RI-ww�Z���~�C%���n ���HԣK�D���T*�qs�7�%�q��~J�w�%d�^B���� �w�BM��2X880��q�O�����l��c,���@=g���nc��<(���,��)1�66��3A��S`J 2J��*� ��(��\�b��|n���c�ݻ���P��%��� ����d^8AhafFsSS.��k2����0�����j�T*"rr����s!=�D�wS)?�������UW"���_���md���1��L0}͚5�iӆ�E��^y���@@@��7�`��888`nnNV�g� �7d���N��9��ʙ�4�A6zz����P4�11��ȨZ�5�Ǽy�HLM���A�ni�i̝;W��/-[uv��[���\U�ۛ3?����^ݺqx�nܠ�:�0+9��+W�ʉ��~�N�T��,t'0�"gT*��n�[s��)|4��:�uCP�ӓ��{��料E�8gϒ�{7R������x� ���?�tu1+gPýcG.��A^V�&y�ԩr��٭�l!;%C�\ �ׯ����w�ة˛�_��) z�С�R�T�=}Zkݝ�@l5���Z�δvm�G���vM�@�ƍ� ���g�v��׮�F��ǎ5?��&&���Tj{B�2�J��ё�w�h�c�PP���:u^��%� ��))%��������,��yy���/�]t�����R �&O�dyl,�#"�R��Q�n��3�9:�#~w Uh��#�_�,'��3)����y+._�$4+��\���bz:�32�P���H$Z�&@�����P�eX�0ZG"����D ����+���}���3�;v���̺u� +s�ky 8��K�2b�>��C�w�NJJ ǎ��ݝ~����_ll,;vdΜ9����n��/��iӦxyy���κu�hР�/:t���ܹs���aff���^��� �g��C�Z�������lM0�0{�x�w|^ ��y�H�D���1�MMilj��:�h(�����.�}#Q�C��WnV.�P���W7@X�C�&x��G���QT]� ��#&8��M »gOάYß�N����߱#���O�~���vO���G�ol��+0��.5�XT�N��{� v�K��ù���8x��~�狮{ǎ�6�#���ѹ3�w��Qt��6mƎ%䯿�4dM��ח��na`f�s˖�j߶aC�8�z5M "��9.���T}.�Æ���l=��o����?H�6mJ-�Ҫ2]]���k}Dҝ;��[���ܢF�6b��1���\��ƍ5�Z��b����%Kh=v,��.R�(yn����u+�}����;�:aZ�6��%2(��Æi�?2o�W�2dӦ��|�^��ڵ���J�����׬���������}����gl���*��ekˬ�R�<�T����ON�g͚��9A��H�Rə���c�H$tP6� ?�Ƣ(廌�"�}�HNflXw�9(Kx��� ��oZYa��OLn.P���,&F+@�T����\Z���8�����,�L���+2W`Q&2���ilj��>�kh��g�T�DRj&`�u� �֭[L�2�\NϞ=���o�H}�Y�>OZW�T*�ȑ#̜9�U�V1u�Tj֬I�-�8�_~~>aaa����rQ���L�>���jժE�X�~���N�:1l�0�{�=���Y�~=C� y��� ‹�T&c��P��~7;�Ь,�gfr=3��� ��Z��B�J�� B23Q�ǣ�������MM�S }ML0����F�LY>�Z� ��$s��!7%�\۾�B�DRj9��˖qf�B���S+W�obBoo��rR���[�pt�.l�ıE�0������k����U�3{6�̞�R���qc�\��d�Ř��0p��Ο���ñ���ܹl|睲ϥ�J����׏��X.m���;poߞfC�pn�Z�6�vv|����{ΞM~v6Vu���/��V�u�����7��6�~� l���x1+�����%�K�W�ؘ{�pt�N��f���� ��͵ʃ�G���w7n��7߰u�(�xz�������z �J^V;ƏG�T����h5r��ܒ##�9~<�))����7 �C�j�������J^�'\��������/$GD�gl���?��.���X�ӓ�F���yܿu�v&�v��2��o&2�:80#"Bk����,B A���(K��ȫp��t��e11%��@#�VaYS�bnge��p�NN.�lq2 ���::2���W0"T��O�홤�@��MK�ǘ���75���tҋd��w�@hڀ�l�<������Y �i[�-^�֭+��]�v(� 400`Μ9̙3Gk���9J���ٹ�:(���(�ϟ������ogg��)�iӦ1���wQ���,/V� �޽{nK���#��nd���oZYi��U*�dg�����,�gdp93�����&Q7����fSb��w����MMibjJc��b����� ��C�.^����_u����ؐ�Raܣ�������B��_?T*#v��T� [��o�4�:�������֭�0@�^A f�"s�>�H$���W[?��c��d�rc��G33�j� ��e~TS��-�d^h�fxWz����5����ŀ2J U/M.gvd$�cbP�T�*�(\ ���E �;Z���(��������J+Z^:d6�(x0�fhH u�Hcu����.����^�@\n. �?���#�Y3,^��������bggGLLLuwG�*��*_��FV�fn� �(G �_���������g�� m��*5���ܜ4i��"�P��ۜ1sȍ��LiFjj�c� ~53_5�II\߷grRS ��/b�\�OF��L.l�B-w��c�Û*���tнw �Z(C�҂�� ��D���W���!T� � �P���w��t�����i�6-mS��\�ENθs�6'�~����Ύ��sz�z��t��� �\�UA�.;cc������H�=F��QQlm��P� � <2B��t.����)� �&�+�|Y��hhj��� uO�R��;wH���N ��7==��˫^��#<�T*�ss�73�32�+=�K���շMhɪ�6����5�@KK,����76��6m�|�,���zRA�o�d���h)��3�JikiI[KK�{f�T*���i��g339��IBa!��>��e��'%�}))ȋ����ʊEI�NVVx���� A�D��1 �J�v��˗#�Jiݿ?�n��C\5� 2��8���d��Фsg�gϦU�>u��ꃙ��,��Қ�JlOJ"<7��V�� B�)T*����II����r-�)!�Ģ'��ݨ2q�a0'32x��M�ge齍p75ec�V���PkR 9����������Ɍ 2*h���ۙH$����S�d����Ul�`iɪ-�x���)�5)�������R�A��K"��ef��������.% �geq:3����(Q����ܺ/�s05��ii��FFt�����5������ѓ �u����2������&��s{{�����è7zΞM�ٳ ÛǏ����db�wwV��h���_FG����P� � <�.ggkZ#��T-${�*�DD��(����cK��,ԝ��|޺s�M���[�W������fͰ2_ل��R����˱�4���s,-���|@w 7}��F���hnfƓ66t�����5��Ѝ� ���MNfoJ���u�͛t���q�5r A��r21�{{����,�V(����Nffr&3����}����0Y.g_J ���,iҠݬ��T�������{�޿��֭��c� <��_7A��؜F�X %.���qq|ڴ)梕� B�KKә�S�mlj�x������Wf����)���1�J�7��̽s����~u����k##6�jE�Z�Qx�)T*.egs,-��ii���q_�N啮�7(����WW�9;��ںVo�J$~����S$�� F]�Fh@���Ax Y�d��$��@� � �/h=N�K�ޅ{4 hR�� ���s����rHK� 4��W�:A�r$%AA�Z���|���ik�Ѵ4��#%p:3�KYY���JA�G]BA�E�z�d,�еڋ~����հa�O(�lf&c�]�jNN���R�����n����*�ZXȉ�t���s$5� YY((���t%�.%������ml�bc���4kР�Ͷ"S���"*��T����� ����8p�>W��Q�� q�*a:`&Z* � z0�HhciIKKƻ���P`wΩҾ�%w�.y� #�O��l�0�V��@a^!W�^լW\�v L��J�B^(�ش�A������%��#� 455�[ss6�����A(�ȑ#������U�����pZ��2#��ձ��h��@Q � <��-��d�JE��Ԅ�JM-����DS3�=��-W�`��{,���9�dy�ם��Βf�DBC�).?��E �?SS�Q��.=�>Ձ�J��TJwkk����ncC��U��23���=ܿ��h��bb�Ӱa�U��H�liݚ�ӧQ�T(�;���}�._y{�I � £�Pj��3��Ą�������Y;;��R��@^0��� |��4 lƨ/Fi�KOLg���Q�T��pg���9��$׏_�~�}T*�����O`�@$���s�\���-/�2�;H��h:Ҿ{Z���Ĉ �/���ݚ�T*�f[���������Q4���ǭ�������ѫ�}��VR��~{�違��N� IDAT�~;G��D���O�&,i9M��<>�#k�+��> ~{0g���ʑ+$G%�۟�N�4�kD���c�aOj\*+F�@�R�����_���!;5��Ö�T*qm���Փ�- �HJ��4�����3�8A��ݨ��p{����OSS���Jź�>k� sq�RAo'32���/֩���}��Xr�m1W�:��Ƹ�׉��ӫb�� �22b��k+<�!�&���ơ�T~OI�n��FM�֟����%�R)O��lkK[[�[Z>p���=<���}����|�HM�O�E�._y{3��M@�ZW��������D���ϟOHH������ �6mʚ5kx_cǎ%""�#G��@d� �����b�����6��r.�\����ʓ�kф�'3%+�w�K�.i������S 9*���/�j4�W����M^Z�R��d�e����)�+@"�y9��ˑd�Ϣۋ�t�;-������D"���?R����a�p��Uz�����sd�dj���:hbx"�g�G!W��]���o~!\+���R�S���u^[�vnv����J�b��s=���_VO�t�AglB��H$A�#�Hx�Ãw��պə�P�5)�1b.BA���������1�5XA~'7�mIIe�ˀn66tsqՊ �����Ỹ8d��α� [[6�j�[=�& Խ��228������9�������z$�U��LF��-AE �KKd5\���ޞ���D .���"��!�D77����[J��]�k׸֩�c}c���eui׮]Ȫ8�pݺu�?^sñ؊+P(�����������b�ڵ�E�rK�b���̅�p@{޾�� ~{0��'�Z4J��K^���\3s2rh،�/wǽ��&��qHGz��-&�&d������ԮS�f�rz�i���uDW����u;��4������9�m�n���%�C�����X��Ν;#��X�|9������K���u���G*��~��Z?NEJ���Yhh(R����H������ � T�77�J�L����& A���B��tff��R���u�޴]��b^�#�k�ޔZ��/?����vu��H"aI�f���/���)�Jť�,�FE�', �'�p�E���)J�~�2��nkd� GG�lޜ :�ֽ;��iì� ����� ����������YT�XW$ k||�76F�:I�ZX��74��#C����ı��-V54X��� �z4�{m��1�� �P>�D����"ɯ����������7bI�H��s��%�v��l��N���t�́x%� 9�9�D�s]}����m5�Qx�<� ”�f͚ń ���eҤI̝;�3g�:4�4i҄ T�b)�%���^�ݻ�T*�رcU޶���]�X�|yM�'u��ؘQ..ZIB%�of&��� � �C�jv6�ʲ5e���� �1>�L�J���^]W�<� y� /]"��P�� ��/33N2��h���|�����ի8��mϜa�;LM%��o�^ �?7FF urb��7�;v$�[7v���'���u�36��M+.)��(y^������W�`U���Y_�Ե��B�̙���^^^����e*�N�>��O?���#ݺu���'��`��w�2e�Z�h����Z�b�ƍ��������hݺ54nܘy��i�oҤ ������ߧE����ꁳ�ƍӬ7v�X���ٰa������3t�Pضm�f��T*E*�jo[Һu���� ???�.]��-�f�������{�G\-��&''3s�Lڶm���9͚5c��� 0�cǎ�ym�� �R)�W�f�ԩxyy1hРZ�O�Q�'���@���`lj��lK O$�N��zP"�hڋ*� 2���a�t±�_j\ٹ��m�q�r�<6i��'P�R�������a��;y9;���$<[yj�W�R��w��_vl䈭�� ��� ֽ����~�} � �K���������R^(��޳\:���H$ ��u ��c�b��?�D�P�ꫯjU ZXX0*�=���ң -,,��^�jr���2�Qx�L��dM��)F����,����CAP�?���T� ����(u\�(�w5�7��v*��͉�L�y�̢�v�^1J�֝�������|������Vb��mC�iK[�e���1���4-C[��Ջ�qGccF:;�91�J��6&�7Ƥ���~�Ύٞ�,��֜�i�n��֖�Es�?�/^̏?�Ȝ9sf��ń��j}=s� ݻw��w���>#::�O>��'N��y�HKKcݺu���s�� �r�fÆ ��ٳL�<�#F�������5�K$V�XA�>} ���F����� X�b}�������c����߿�A���_2c� ⋾���x�J�k߾}L�<��'��?�c��ϟ���%�&MҬ��_͂ �H$̞=���dV�^]�y �gϞ�����SO��~,Y��cǎ�|�r�6mʽ{�4��M�6ѯ_?5j�Llgg������gذa�ܹsss��)� T��������:����_��� 7o7dF2l�m4-@��0E+�W�ҕs��k����"/Er?������w��]��"Ac��,��������o���Iz�x�ܻ���Ё�?�صhW�����Ʃ�II��s�������'.M]*<�P�=v�cǎe�ȑ!��HHHЫ��[���ӧy�'���婧��ܹse��ꫯh߾=����x�b��m~~~DDD�`�ͨ�����xF�E�F���������3g�гgO����J����W�t�=z���ޞ���Mdd$C� ��Ņq��q�� ��+��6�]����6l���/�ΤI�hѢVVV��ۗ��ד�� �G�5m����`�R��1T<�r���,\�����{�p�B�����7o& WWW&O��B��СC���>��RS�G�T6�SjR��%]���>����xr�9?A��Ɍ�2횋u��6k�r9+��uV����0�Y�/�BŢ����/_�F�BQ��A#���]~~|۲�H>� �J����Ax8�Ξ��� �\�̷���� ��6�R&c��#ߴh��Ν��ڕ�|}���NKs�z�,6��C뵥���JN6H,7m�����<*��t��^��a�s�N�N�ʼy��ڵ+;v����܋��>�?�<���'00����t�Rv��I^���ɓ'8p ]�v�I�&��ݛ���p�� �����·~����;wfʔ)�c�T*,--ٴi]�t��׷ܘ���ٸq#d���|��9r���LLLL�.L��쌳��V�Ғ�z������ʕ+�С�|� �Ǐg˖-e��~�z @����0a�����k1 |||���;y�$�z�"88�ƍӣG��'LLL033Ӽ����V�" �-ZT鸂 ��J>�]������S�N�����~@{���wj�ޝJ�o�������×Y?{�f��pm����p�ϴ ��+˴L-������A�[��gdb���)Q���k�_�n�u���0=1��1�{�u��x�y�*�p%G�999U�]TT����3��s璟��_|��]�8z�h�����ӫW/:u��Ν;�t��F�*��J����?�Y�f\�t�ŋs�������c�`�ȑ̙3GGG233�ر#O>�$?��#VVV�X��=zN�v�ؾ};�?�<�O��aÆ���T�I�x���pww��7�dĈ����� /���o��[o1e��9Pi ������W_}� &0q�D~��g�M����S�R���Ć prr��ѣ̛7����Ν���#�N��S�N�ر��]�j&Q�l��i�HHH`˖-���E�)FHHK�.%::��ӧ���JBB3g�D*���k�!�������Aj� OOF\���,S�`Wr2/��QA� 9����ft� �1��K��bc�mc:�a�:��y�(U*���eΝ;�窦���aC�V���Iwssٗ��o����F�R� �9)�IJWJQW����Y{{:XY�;Р��deE[ .gg�D=yeL � 0P�T*�__ڝ9�B�B���dQd$�7n\��Զ��XΞ=������g��ĉ���Ν#33��\�999�߿�!C���[o1w�\֯_���7n��ꛩ.\��Ĥ¶���޽{�w�F��`AAAH�R~��w���> سg_|���~���j�*���4�yڵk����f����Cll��5�ֱcG���>��3f0v�X��߯9�͛7�k۾}�V�x� \8pAg���g`㢮hH�X� �����)mz��Z�٩�q1���d".F�a���% �t��,璯t�:�.�\��:����^Z�W����3�)e*����ON���l;���A���kGk2�3������%2ui�t�x��uኹ�9��Z?p,�a=v Bkkk�i����iݺ5+V��,����y��DFFҨQ� ����?���g���XXX�L&c���Z��曚�{yyѨQ#�x� 222�������L����V��V�B&���ֶm[<<<8~�8O>���}����^�}֬Y 6 ����3g�>��3�M��̙3y��������B�t��輝;wҹsgMk��;����5�H$>��c��M����Ζ-[�;w.�N����k���#-qtt�o߾|������aaa�L&��|fdd�KQ�e۶ml۶�����;p��!8�I�� Դ�q66&��P�LlJH BA� ����.�RP��DB��vk*O�䋨(�- -d2&����qW7srw�:��*�"2�מ�6m�,OO1��#�P��Dz:���gwR���Nʗ���2%ۆ6iЀ~E � [�@P�$ ozz2�����@�����`�V|���ԛ7���0<�g��j��s}V���R�dܸq��%��:u*#G�d˖-�ر��?���>���ӧ�]�Z2 W��jZ���N�.�B�� <����m��Ν;���gڴie����{�A�a�? �_O?��� r ԏ��01�.�113a��S8��׎_#56���|,�-qh�@�N��j��}P"�hb�Z�#��=Z���ͭ���������������G"������]g���8�� $ W�]��}�>�=/�Iy�9��׎_��΂VO��q�Ƅ� ѹ��HF������?����i5*<��o!p��9����\\*�Jv����3*�~���t��Ek�?]#�Ξ=��͛9q�׮]C�TRPP��C�:th�����boo��'O��$��}��7�� ��X*e��;�FDhnv)����bW�m� ��v:3S�R�JE��1�>>��8��P���~H� �&W�X����W��u��֭i_C�d�J((����ٛ������V*��T�_eiqe��LƳvvҴO���1Xl� ���1A:��+��� ��}���d�2� �B��]*]����\>f���M-Ly��'y�����>ݶ�c�{ؗ9^@�z�����m�1sm�J���7����K�QO�eljL��:U��� � �I�TҧO�-[V湒K�G"�Tz�A�T��/����ܹsiٲ%���t�ؑ��� �U(����m۶2�YW�T�/ţ�J&�J����*��9�w�Æ cΜ9,]��f͚q��!^�u���*L�3Ҳ*�ۏ��dZ�x������Z�P�ؑ��Q�"���Ɍ�2mA�D����Jŧ��H(���H$�!���|f&c�_�rvv�[����Xּ�#�|x�(U*�ee�/%����\��BZ��Ui*:[[ӧD�P�#ZUj.��_͍*����iӦ���H$�i��ӧ�_X����c���|ײe��S�� ��ŋ����G�,[� �\��=yѢE<�� 6��_~???n߾����Y�l����z�^x�ƍs��=~��wM®[�n 0���~��w�2l�02228�|8C����_g̘1�ܹ��kײx��>��N�b���lذAk@oe^�u���7 lݺ��� ��.={�dٲe�����ၭ�-Fb`� ��X?k=q����V�_46[W[G%�q%����۳e����iРA��4hk׮մ�8p���:���ܾ}��Ҹh��~��̾t�: d׮]������3��$]���W5A�jҠA�8x� ,�,+}N׬YCÆ Y�h�f�… ��)�"R���3���ں�Χ�1BmhanNG++Δ����n3*�� ���������DB�h��#)�{yye�I$���"滫�<������Y9I��I$�I������U��˔�9���ޔ����\XX&�_Y�ВmC�4������dk�XU�NuwgYt��q�R���D^5�u��� �Z���ŋ��=Z�@GG88$��0w�\RRRX�r%�|� #F����_gÆ��Mj߾=�O�f޼yL�:���L5jD�޽155E�T���Ƅ �����ח��~���zK���[��p�B6o�̢E�pqqa��њ��k_&�H�<��q�x�w���!((���N󼽽=�~�)?��#����G�f͚5e�տ������+֭[G�ƍ����8qb�ǯ(�b999ܺu�Z��g̘Att4M�4�gϞZݦ� FXX$::���P�z�*CA�Zj��媛��Ox�eX�U��������>���n����;v,O<�������L�6�҉�{�ꅩ�)�=���.W�\Ѻ�С|���L�<���P֭[Wf_={��ȑ#\�~GGGx�7����y���0a={�$>>����ӧO�w�N@@���l޼�I�&aaa�M ͇��.��7d��.]ʔ)S?~<۶m����Z'88��>��իWӹsg6o��ѣG��qpp��ߟ�۷��닥�%vvv�������W�^̙3��~���;bii����Α�աO �P[ƻ�q&3S�X ���_P���I� � <�T*���L2����D*}����$!�*s6|��?n.ee1��n���L�VF�[X��Ϗ��<(�͜����kJ '�ӑ�TZ�C��K�x}3��>������{{�<�? ������%4-M��sEt4\]����=ko�LOO�GG�,�i��k\�� �G�Z��ؘ%K��d���%тz*��{����M�6UxSSS>��c>��c�χ���\~���ˋ[p�g�ܹ̝;Wk�ڵkˬ7~�xƏ_�~tm�յG}��e�ʕ>���Κ5k�,W*��I$� u���o:��<؝��X�/)�F��|���ɹs�ppp��wߥM�6L�4����Z����r��A2222d?��3!!!Z�X[[�v�Z�]�FPP�w�f�ƍe�5q�D�5kF�=pqq!** KKKN�:���?�}�mڴaԨQDDDh&��J�|���������s�=��k�w�>1�R��y]�ve���9r��}�r��mV��,|� IDAT\�Spp0����X�b}��%**�U�V�y- .$22��FZ���2u�T�5k���������;w.��...|����R����Ω>1Bm�䤳ֶ�$D#�P����#]��Dc��n50 �Pj*���$��$���Ӫ**���11�=��j$�?gzz�w��"9��W*9x�>3nߦ�?����)�ܹ�Ѵ4MR��֡����ij�k���Ѷ-iݻ��Ϗ���ur��tOOM�U\���t��f��iӦ���#�HPr9�_����� � ����g�Ҿ}{C�Rm���������At��&� ������˗ٕ����#:YYq�(�.� �mJH`Եk:��ت/��<���Ο�Dz������ѽ�B<�� s�:�߿_��[�nhՊ���5�P�R ٛ�Ž�$�����TjU ꣸ը�\�C��@+ss�U��wr��F��C\A���y�ٙ�V� ���lڝ9CA����-���n�����}_��q����Ç � 5�Q�{���� � L�Myg�;�G�\��-"?6k�5����w��9�bTA(�WW�''k��33���U� %����X"�PG�S�|��u:#��:.�@��݊�������|�����ھ���6??Q)VO���;%����-jsYr>A}���ID ��~ rt���=��Ƶ�#�H"�u�/<%�s�sb"˚7�ހ���‚e͛3��-Ͳ7oݢ��-�����q��� � �`8�m�њֲeK���t�{�� � B������H{,�ؒ�h��A���:��V2���hߟFFb��bI �ۨ��f�@�R��۷�}�"� ��_���3����o/������\�DE��ٳx���ݼ��*�O�d��Ʀ�L���OR�w�֭��"��U4�� i��I�*��� ��Tww���#+z�P��p�h5*� � <�Da 9x� r�\�s���u� B�0�J��ª�X��{%�1!��52lp� �D�B����2�%��������î�dJ�–M4`�huY��99 �r����U�o�H"�AQK�!�<� *��+99�LJ◤$.gg#E���w��tOqU��bm�''88���L$�k��� /89�-) �J� X�LOO��_�D�:|N�"U.GOOgM|<�� � � � �H֐F�F� ��Ѯ�,���Zv);�99�m�A8����RI&������<2Pz� x�Q#d"�Q�J����8޸u �JU�� ��m,,�޺5^X*<�Jř�Lv$'�Kb"�yyZ�C�y�[�Z�d�wp`��}�� ���Q6�Ã�Kt����Dz:O��0*p21Ỗ-v�f��۷�������#AA� BA�B�,-iifƍ�\�2)�;9YT � ��PJ�D�\���$c��Y��P&9`od�hW�j��Q�RXȄ��ٝ�R��%���oxx�y�f�HŌ � W�8��Ǝ�d�&&�PX��%��i[�Dldj�0gg:8���c�ֺn�ִ03�fѵ��DqqO<��� ����r �ߺ��֭ � � � �9� A*$�H��Ƽ�w57�U�� B�22(�����U���<:Z��XR`VÆ4�-GRSy��U� ����@&#�LJ�NN5�P�<��C���HJbGR� ����V��R�lޠ#]\x��  �:��I$&��3��T��[��X�퍕�aoAH$�iт��N��P��%%�7%��MA�ߔJ%(@�.g��=�G�\�t9�RRy�� A*5�ёw���� ���m,-�ֺ5MEK�:��P�[J ۓ�ؓ�B�R��ԑ /��z��ܜ�μ�䄯�E�.T�޾{W��)����T/��s75eY��L�qPWO�q���:<�)� �_J����U��z���� ��a��T%��� �PZ���mfƭmF����TF:;.0A���'����r��Ʀ��ݒ�H��lzPLvss������+W���� ���(n)�zQKQSQ�Y��J~OIasb"�&'��Ri��,)()��,-����x�y��';8�;%�J�X[/�\]����U* ��W�ކMA��4h�UN�Ftm%ZS �P����� *]W$A� sr��HM5��D���d� ��oF���*x������9��x�ӳ��}T�T*�'$0��M U�*'A�lm �Ҫϋ���J�R�gj*�ؖ�D�R���d���*�m{G8;3�ɉ&z|� �Uww�''���Tf&�sr��\�D�Z�:���֕11����@� aŊlܸ�3gΰt�RRSS !<<�u��1~�xuk<�w�M�6%44���zJ�킂�hڴ)k֬���A*fR���Ԕ 0p4� �q�:�嚿[ BAA/�99�Id��\�boJ � ���G��Կ��Z-�)�Nռ�|:#� YYe�ˀ^vvx=�-0��r&ݸ�֤�j�C �YX��Ϗf����-J������91�͉����U�S�8A.���0�ٙ��05��ȅ��n&&�UYˀ�qq|֬�a+��̌��6eΝ;��gn���u��CRM���¬Y�X�j���+���(�J�O�n��tjԨ������Ui�]�v!��j)����k׮5t(� � U�p\�>�ƎKpp�Ac�w�R��cǎ4��ҤI,X`�֭[��!�R)� ��ĵ�ȓt��S�T�� <N��+M �����>����H�� �G����8��N�S��Q��`�Y���ο��"9X�T*g33�s����S.�:.�T�:XY�����R �֖�Z� �kW��k��"9���I$���y_��qqփJ�bozz����D�����QQ�Ko��' ��W_}��̰������С�QPP�T*����*�ɶ����ʪ�"�;����A�Z���G�: �.X���0C�!'2�����7�����˫Z�ҕ<+�ץK�j����H$U>�AAA�7���*/�:r�H��㫼?A��$ /89iݴ6�H؛�b��A �8�Ks33̫Q�p����t&R\���_o���J���p�:������X9`.���ukV�h!��Aײ�� <�f��K��gY���Sߤ��DBo{{����ԭ���mq��k�����k�\����,�Ҍ$���@�ϩ ��7sr �Ǝ�ȑ#022B&��������[�n1x�`������gٲe$Ua�ō7�߿?NNNxxx��K/����y>44�Tʉ'0`���,^�X����ׯ���-]�t�СCe�[���^<�z�������{�G\\�ޯ�*����9s&m۶��ܜf͚�x�b ��c� A*�j�>�T��ի�:u*^^^ 4�V����k�!!e���8�9]� ��w%1�a[��b֟~J��g����4��u��{w���s�0��sI6��K����1W�=K���q��s� p�޽2�ݵ �H,����^���!!���_������#�����*��Z���غg��'���{ؠA�żl�#�9GG�}r���Es�� >�t�ƾ�m�ꊽ�^���23#��V��?�R���ZZ�n�F��u�R���G������/�����x�����E`` �5b�֭,]���� /�u\�BA�=HOO'$$�/���K�.��sϕYw���t�ڕ�'O��+���_������a�ƍL�6��s璜��u�B� ర0���k,X�w�}ǎ;���+��8qY��IK�,�رc,_��k׮�f�<��޴i]�taĈ��Ǘ|����#�Jٹs'+V���qAx�8��c�^�l�r���Wc*���A��<���u�+Wh������5t�e8[X����תZlR���B����g��p�]6$~������__>��oZ�\Ibvv��#y,�ţ�~��g:t耥�%qqq���������ン�3ӦM�̙3Zۦ��3}�tZ�h���9���z_�eee1n�8������aɒ%e�9w�������^{�5���/��/f�…DDDhF�-\��Rɲe�h۶-�3�#G�h����#""� h�����9��x���ɓ�����ߟ-[�����lْN�:��/�h�_Y 5����<������ҹsg8Pf�͛7ӥK������a����)�g*񗑑��i�h޼9�������\�~P�"lڴ)���H�R���-FK���۷/��ٓ��0���x��qss�������Z�W� Ե'ml�.Us%'�h�.G���9�kW��R�beL �nI+�W�ܪ�χ���N��lV���Q..�۾�h)��� �*:�Ng��u�$����JQ��>U��Wǝ��X��M|׮����WW�Kܠ-���4? `_J��´�x�I���!C=?���t���0���X�u��쌳��^77?��cZ�n͊+�޽;�z�b������?D��o�<ǎ#99�={�Я_?^z�%6l��ɓ'�*՞u�ȑ���{4oޜ� ����˗ g�ƍ 0�Q�F�h�"r���LOOg��� 0����3a�~��� �������ss�J�_�ɓ'�ի���4nܘ=zh�7mll011���L�>�|���êU��E�U:� �����aa�wOS!V�ʲt�Zquۗ'O�j�*.[ƼÇ���e:}�=^˗����T��}�nk�`��g�޸�͗.iU����c�]4Z� �O?%��o����К�����}��ۼ9��ƍifo� ���=~<ii�������+C��Udz�f٤={h�bV�~J�M�X�u!]��=7n0j�\/�� �U�速~�XD!.hދc�v�Q���&"-�G�"]��…������/�_���r��%K�������|� �}�IzVR�o,��la����<|WWW:w�Lxx8r���� 8��ɓ�x�"?����lϞ=�?���>�������{��g������L���Çٿ?VVV���CӮcڴi̞=OOO��9s�0k�,���[f̘����i׮�$�;���'s���l[<�M�?����C�N�7n/��)))lڴ�޽{3r�H"����Cy�4iR�����'--� 60m�4�̙Cbb��:yyy̛7�ӧO�b� Ο?��ڣ� ���={r���,Yž={��ˣC�dgg���ȩS�رc���e�{�M�:��g� >|8/��~~~�ݻ�R����5�W� �5c�����e*X~mFAx ���,w���j�?�gj���$�����h��|���7n�ҵk�(��V��"E�>�koo���`V�����C\A������̸}�3E�u���,>�-����ˋ��;s20��<�,���\�r��7���=2� KKK�Z��oߞO>��E��f���¸R��ʕ+9p��&M�+��4o�www}N��իW�u�ׯ_׌�spp`���Z�L<6k֌�m�ҸqcnܸA˖-ˌ�+���?s��M��߯y�8p�;v���W^�,����뜎=�iӦ0s�L^x��~�i�}�]@]�١Cnݺ���7[�n�4A�kC���P⦎ؓ�¤*� � <��df�('q�_��ʘd���RS������ �t��E��%<'썍���GW�Z���V�Tr 5��qq����B���|�f$� W�p71�WW^vv�M5~'�GC��1��|�\�B ���e��g���zP]mlx�ÃU11(����n�U� χ�R��O�>,[���s� ~�H$z�_-���h=.�U�J}YQZ^ �6 <����m��Ν;������;��z}���$i��^@�B�{:@T� \(^QD�"^�W��?�u\��BEAE�u����/�2eS��6���6i���#iL۴M<��+�6'''ߌ����<3g�䥗^����B���O��K�sd��Ǣ�|r� �4F���^J ���C���N�}�i����p�w؃R���1��ϰd$���Ԇ <3v,e�����/f��8�[HH�c�F�cvv '�V�5�dIߐ��ϩ���#�~n���"�����q��]��)0Y���<|�Uֽ�kW�;�~����wG�r���zy��j����|/B���j4���U��ˠA<�q#�=ʕ��,�v������N �+<��ʑ�\zI{����abb�#8�Yt��2bĈ*�L&Μ9�O<��]����vb�֭dee9g`+E1r��*��h�"6m��֭[)--�h4����r��ֺ�ݻwc�X����,7��xzz��4x�W]u�����Pbcc�,S�~���}�v�O�ޤ1���O ��ի����R�c�ر5f>|�e˖�믿�{�n�f3|�����ٳ�����PZZZ����hd�ʕ� �9�~ �uYrr2���-2!�j|p0����~b� l��Ǣ�h��I!�hi�EE.n#=<k`o�S��|���r{�z=r〾#ؘ�� ��Qh���N� R��R���ۗ(�Pk�=��,5Xb0�g6��Vn�?�S �j�sDS���F� ��h�LOw\?RV�֢"F�Kd�/t����l &���|���5���=�f3x�`�/_NLL ^^^ ���I�X�p!yyy���7�ܹ����*�p�1a������1Al���m�}���S�Ne�ԩ,Z��|��{�^O@@�[eQ�•˺vE�Ԧh@T�:�#8X��?��Pb2q87�׷l�M��:UU)3��e000*�G����?gT\{������{RCcԷ���t|�������Q~MK�ta!���B^Y!N�c�ӹ]�FÀ�H���s��� |5E��q}R�RR�21����MM�>k��okK�D�u����X,�t:6oތo����2S�]շ7�|,X� /����>Jdd$ӧO���7��X�jU�`Rc���W}�F�q��k�1���/���� fΜIϞ=���e�Сn��aaa�����Xލ�_���U�pt���5m�1�T>Z-c�����Y���b��}%%�ʘB��(�d"�Z��iD���23�P3{P���'`�������doI�#�kS����p}XS"#�<8�����~~ ��eOI *������6 ��j� )�+��l���:������ }2�|�IV�X�� �6m#G�$--������3g�[%i̘1���1a�{�1 x�9r��>�u�۷/ �~��<����+����S��WU�f9�m�6�N��G}İa�ܾ߬Y���꣡F{ IDAT�ILL$++�+V0v�X��I(�ƍ��^c���������|^����޻�(�W�ЦU�\,�,7Y�v��baʁ$�Oz�"�� ��wo� �ࠨսN��ͪ�'YY�X\}�+BB�-2-��3&�?��ê���u�팋�#%%���P�ΝK�~��>}:���n��h4lذ���@�M�Ɯ9s�߿����M譾|͚5x{{s뭷��o��Ϣ�验��sr��z�J���9r�Q��<� `���$%%1�|�m7�t�ƍc„ DDD�y��o_ѱzyQ�b2as����{HN��kpp������>j��u�&%����T{�$�ǧJ��J�%%�r�$�9�˞�,G�`��CU�x�N�y�˸21���l>uʭ�T�_����{Q�zc�t!14��۷�d�.�7Cf�c�.�啕��mL����W�s@�4ٍ=�믿��s璚��u�]��h��~C��3}�t&O�̼y�뮻�1c&L 33����zK=j4&N��?��O�f3III<���T V�;�+V0f��F#���>>>Uֹ��K�3gk֬aذa�������ϫ��JQQ�&MB�ӱc����=�ƍ����9x� aaa�6�T��{�3���+�^z)#F�p��$�������U2�t�B�Νy뭷���g��ݼ������Tٖ���r o��w�}7��sW]u����_��=zp� 7ʀX�r%�{����ϭ�*w�3!Z�e��UN�j�����ٳBtD)EE.��U�� ̦^��C���Q��014��j�b;�Բ2&��ˁZ&�U��P{�P �xz�u�~��^UU�i/!�,+�|���� L�R�� `jT���\JW����G�b�?�Z����fj��z��|��K�ٌx3=�[##��2�M�ƴiӪ,{ꩧxꩧ�\'!!����?�~ܤ�$֬YS��cǎuTr֥K��{��������� �d2:������ ]Ǖ��z���cbbX�xq���f�`B�/�t�����>M��<=�k�5έ���v�gg��� ��_���[���S` sr���M��Ѽ<�KIab����s(7�_N��oÇ׹ݤ��b���̬g=g�>>,��*n��K�~�%� L��?� ���3W&&���;ֿ*1��|�?֮��~����a~�6�.]x�_X�c#bc�l�>6�<��x����t�-[�m0@��W�����X�sr��!���l�w�^���0���.��b ��d�T�����I���#��h��U\��j�ta!)�����������k�q�� �T�e���f����1c˗/gĈ\s�5�Y�Ʊc��jY�~=�Ǐg�� 8�{�R��^}�U.��2�z�)f̘�W\�ĉ����'�d����|��<���L�8� &TYg��<��Î�/��2��������d�ر\v�e|��GUv����u�Ƙ1c����}��;�:k���ܝ1������`�w �}������3e�^�u����]����P^^Υ�^���ϫ��Jx���f�i4~��g���j.\������INN�RB����'iii$%%1dȐZ_���ptw B�k�}} r��f���7{f!�h�v��hp����t�;�fU�je�;����};�JK�-)Z�)�K���5t�ka0�x��)�$'3d�dd�_Yξ���:��jW//�KH��ȑl<�11 ��qSx��s��V^�- ����=�A�΃���O���OX�nG���w�eΜ9��у��Ƿ�Є��.�ڕir��_��ˎ��.������2�f�M�ٓ�����g���/��{<�q#q��,~z=G��e�J������ w��#����\r�e}S�>��{/ef3w�^M�[oqӊ ��f�-���T25. ��o���YY\������+����\�����\›۶q�'�p��������s��Ko�Ӈq L��3"^~��L�{�[p0c�,!r���f}���~��_���t�ʔ)S��,/��R��gdd���G$�-�j�65����Ĵ΀���UKyyEaH���- .{�i�im�/WS,-e�޽��lQ}�����|կ_�>A����dfr�� ��`�����V�1z=wGGsGT]�`&��8Eazt4�?��g��� �i�������ڽ;�> ��w:�Ɓ;lVm'9�)�����F����ӽ{����\ة�O�����EH���̚5�)S��z{K̴B����ۛX��t� ���Yw�,��v�&B�R\�(��BU��Ӭ,�\���) ��� w���ޭ��a�����z�VuuŻ><����;�3۬��Og��nF_������\O_�������]��\��UE�uGT�w���zVEkϞ劐�VU�棬,�`6��`�/�ѭ=4!�B��i2��9����Ipp0�ղi����"$��YY���Y�(/'A��XJQ��R� �����j1�*3:H6�EUy��q�OK�33�.��^�֍��ŝדP &ff�NF��Ft�Ro��Re ��~~�����a�'���xzreH?��a�6)����6 �( �{��or2��y��B�F�,$� �*�6H�Pѡm-,t���}}���o���/-��\�y{sq``�������������Y�q�u��N���a�y:�)ق�A�P��;���3*��Ϩ-鞘��������\r**��h呹���ó <��� �Z,<~�8�z�l�ǪlMb�ZIOOo�� !Ds��JB�~I�P!D�� �r]�(l���p}���R��Bjy���z���Ѹ������f�͊�m�Yr{����w/�Fc�������Xշ/�^^�=�6�)ق ����P��!!x����\�:$�P��\��[Т�|�����p�����Yf0p����;13����6���;�}�Y�x� ����u�B����y��g[{B!I�B!-B������Y0fUeKaa+�J!Z���b�-��0�����&�gg� z( S##�4���YVw:DE� �͛��x�G���d V�{��pOt4S"#[���M��pWt4��:��w�Œ f�� :EaA��ٵ �e��>r�_l�1O�4�I�&5���B!����B4�Ł�++s��>� h�Ϲ��Bl��悂:K�֕Ӧ����2dH�L&�u�$]�l�O{��:7 � W��V�����7h��}�������*��O��������z⽼x�Kl��F#�:eB !�B�^H�P!D�����2cZ�(��∄�e�VG���b�z��Ҽ������f���[�Yj0p�Νd�LM�7xeh(�&�ۻ9��fXU���q�>�6o����9e[��H����n��=��z�bt``���Qݤ��*�� ?�=ۊ#rϜ�x�<=%��;y� �?�B����Z�%K�6�>Oo�@�o4����څ�g����D��3,۽���Ѯ4��Q�}��T�iӦq��I֯_��mi4�,Y�ԩS�ad�o�رt�ڕŋ��P��VQ���(+gVU������+)qӀ[e�����}^��@��F�m��M�9��*O�8��'O6y[s;u⹄40�U`6����Os��������R�kCC�/6�K��:�k$�o~Z-7���yv6fUE�(|l0pMhhk�N^ ��~�>LV+sSSYګW+�L!D[ј�6����r�$���� � xj��;��:Kv��ի[?�h:rA|<�E��n�S�֧�j�v�ް��'O���;�>ٳ������)6�� ���xM����|���'x�N��Mz|Q�y |��7�X�=4o�V�Z�V[��2~|�?ϱK��̰��NN��l��A��o�0����?2�vL��߾���YY� g�W0��c��7l`���,��:��'��=��}����It�<�������`N�##y��+jlk�֭,ٵ��yy$����}�ү�N1�.��δ�1[�|���h���f�y�޽�v |�(=BC������m_|Afq1?W�Bxӊ�L|7e���}eb"W&&��O?���G�?�~~��>}�l�2��Z���3���]ޯ�ba��?�پ}�Zn��O�������G���|���Y|��u��/o��-}���Q�e���\����m ���=�M��%�\����O�����M�=z4���̞=�#G�T�_rr2#G�$((��/������6�<���$%%�̙3پ}����￟��8rss�~�a���9c�5ٜƎ˝w��^��W�\ɐ!C�����#33��۷3n�8�h4��BQ�.N���H���$�VXO������O~;S��� i�N��3b��WP������ڂ����/;��0��|��WO���-Lܷ����@����C�P��G;w��ȑ��ߟkBC%8(�+:E���(G� ��`h�A����/�cc��ۊ�����B�oEF#7��ú;���)S���d̒%dWY�LI s~�������'���k>��q����,ZD��@V�t���ǎ1iŊZ{ɮ]|�w/�^r f�d��I� �s��V�jT�9EQ���a֦���UW��%�0�6�'�8��j�����ɓ������0�S�/���G~���Ç�|�$��ә�f��v��̥˖������L�ݛ۾���vTU��/g��<5f _:��_]㹼�m���Yz�u|1y���׭C�(|9y2o^y�[���al8q��yy�eY��|u�3� ��m�gƎ�ta!��鵮3o�f>ع���'7����\�ڶ�q|7�gOG��0g�9sx�~��M���׿����o��P��n��H��>;z��d�U�9/3��*;;�Gy�ٳgͣ�>�̙3���[���K/e���|���ݻ��n���v'O���`�駟�o߾|�嗌1��G������y������ԩS���oY�f ���:��=��wڴilܸ��Ǐ7�yV��w�f��<��3(��C=DNN�-bРA�\��o����d�����2�@!*����{x�]Q��������ٝU!΢��-)qy��VK|=e �<} �������fcK�QT�{�p������Z��+���Y���wK�E�KJx��i�deU-#Z��*3 / dfl,׆��ל��6�p�-2��O�lߓ���1�LD��cѧX���Y�x��1� ÷|� !�hc�ta���A���x���ޡC��**�7~<�u�[p0��y�C99� ��M���J�-۪������϶%=�����{w:1*>������W�Zt����,�O������S�Xs��]tQ�ug�t{`lpt4a/�̺�ǹ�>NWJ���h��5�ۿ���� �=<���q� �o�_��K�* �����v�9��{Bp0�����؏�TU�O��n�1���0޾�mst|<}#"x/%�_v��E��z����m�^�����Zʌ~y� � ��]|1_L�L�y���Z��u����z�С�ҷo�cp:V��?�#8��à� �`L�.�e� .tʮ����'�y�����a�򙥥�̛7�ѣG��Cq���SVV���7?��3F��իW����%�\�V�e��َmlٲ�o���={�лwo���˦M����y�'���`��� <�9s�l�2y�.���:�C�:� ����e˖kO�޿?���@�� @xxx�AK!���( ��:7+P��$�����٤��a�#{�������ZKV��F�-m|��\n��w*�V�Kf:��(|>!���:��ٟU�{� ��耚y��)��V�����CO����`??�{yq��ܱl��3��&P�t�ܭw:� �1�x)-�g�h�!��^Ay9�v�`SZ[��)���h6��#U��:c:wv\�A\@��aa�df�;+ ����������S��ҽC�p���t�?� ={rǀ �����>� IDAT ������]�:�����X�cG��*���^^���c��CuC}|�A�M ; F�dz��!F����4��O.��##�����״4��`�6JM�^��y�?9��ٕ���}C��� �0nEὔ�2x0�<>�ڏak;�(*bGf&/]~y���u�״�z���M��w���7��JFQ_:ďǎ1n�R�DD�|�=�d"e�;o�Յ��:����d2�s�NF���ի5j�NQ�?��OU��������1��r��ę3gx�'�֭o��w�q�F����g��{�����4h�#8�皞�NFF111��8B��ˈ��q*����UU���`!������AEa@=�E�IOG�(Uz��mG|ZT~m8���tf���7�;���h��W/���^m��VT�����Os�ht��/8X�-��ˋ��㹽���B�EQ�͓Ǐ;2�� �"@pgTo����� �bZ�����ߒB�����[Y�};/�ǣ^H��/ӿ��b��A۱�*Wt��k��I��?gd\i<��C�Xu� c�,���Y>iR��K]E��-��h�X]5(�JUU�;{T����<2۷_W��JVU��+W�;<��G��gXF��a�W����� Dl�V �nsJ�~�c�Z�|����i� !�h �߹�C�p�=Td4�۩S��6�h6���IGv��g�p������C��Y�������s����Vˤ޽�Ի7k��O̼�/'�EI�s��c�%F ��ٖ������5�gO>ܵ��ɑE��ѣU֩������l?�~JJ���m�{zr[��,ڱ�@//�LLl������B|` Ü������3�^�vl�.�-8�65_�xFe��h6����kh�Qw$�ӱ�`��9 B7M�8�?����G��~���������`�޽�z뭵n�O>��O?e���̘1����/�\��E���Yeee�<!D{���ɛ�ee Bt{KJ�Y��@�jÜ}d�OW����&g�V+����ʜ�FoC `U߾D��b�̪��99�v�4� \�k�� wFE�8��A`C��"�ۛQl-,Ċm��'g���dU[7*0��"#�,+ 3�yv6� ��O� !�h�v�Š��ӥ F��׶l��ãF�����X����==yf�Fz���d��zr�V��τ�>cڀ�����:|��Æ�����14:�����L|�k}#"� L���g����i��=O�iB]}�NN�l��d������N幓�z��Ç3s�p�\B�Z-�/_�� /���lV+o:4&_���6o��!C�p�Kv�r�\�5��m�:��ヒN��ɓ��v��đ�<���,.f���^��w� -Y�Ũ���ssyu��de�����S-y��uII�ۼ��1]��ږ-��z���3�Q���͵={����7��� ˗32.� ����goV磻`QU�k�ތ� tӸq�������g�ܹ����,\���:\p�����T���:�F#���z���ӧs��f̘��/�ȅ^������y����9sf��?w�\����駟4nUU�0p�@BBB��Ϙ>}:����A��Qz=�Z-E�?�*���2�fH !DK�U\Lm�qz� TU���O���v�v���Ϳ.��v���~��X|��n�B��:1����獭[�//g`Tu��c]�(�~���(��c���ci���8��Ӊ���e���NN�<ɺu�x�gX�t)����uN�8A�n�X�~=�ӛ�n�����ρ�ׯ���g�С,Y����̛7�O?����T4hs���� /dԨQ������_;k���̚5�-[�п�ZǼq��*ct�%�\BBB�/v��6l����^�����ԩ~�!K�.��~� .������}�ތر�m������qq�\KSg!�h/�V+���Ⲭd�NGޅ�����|��2s�_�%k�h��P?��ee�߽����zKh�Ry`�Z���-6�ݜ�O-+�S�x�`�d���N��L쨀���ڰ0t��9 �V�UT�ys������Q��O[�RZ���:&�,�ٓ;��[uLB!�.::O��i��<=gNk��Z�kw�^����Z{(���b!��7�{��&�T�6Oϛǒ��QQdffֺ^JJ�� B���ѿ��9t�%f{s� ����ׯ��%�M�����۷�����@~����M��Ϊ�l�wy��bcyݍ���o\�w/�fs��C xk���O�䢴Q[��������"' ������o��<��j���Ms�޽|���EU�) ���0� }_��h��k�6N���!:�#GЀ^QB!� 6��5@��*Y%%��m����Y�}�hn ��B�f����ѣK�����+)q��CQ�WKyQ��ė��.�N�ޘ��`�������1����sδ@'//��ߟ�m��UU�67�����Bt��_�T���t̎�cFL Qr@�"TU��j��b��l����T�^�t��l&�l��l��b��j��O�\(Vuz,���jcq^^�6��z��h��j��j��j �j ���_��j���Ѹ^n��Ѵ� ܖpGT_�����de�j���&C�S���D�޻��f3/�<ɋRUC!�V���8YP@�7ޠoD���F���͐�B�f��ǧ�����XT�y��'��8����(TT�EgVU�� �4+�e�A ����j�߹��*��>͜c�l�� �8(��}���{�V+ge��4�����_���i����2'>��x�����ɪ�dWT�a4�i2�a2�i4b0�(����f ���b����27ʼj���M�?Vc���BU)�Z�3��49�l�t'SU�d��hA�@��X��(OO��z"=<����H��]����U��U�Z���t�,W���d�=�+���)?�������C7o���BѪ� ȴ�[{�\����.kR� B�lzW;�]���2���,[!ڛ�%%U�aUR���W�C��e�� ̌�m��5�EU������h�v�=�h����� ����S��5�}� �h��W��x0.� �˙ή8�2L&[��L79e4�a4�SQQ�o@�((�(���g��k�8UlA��G�k����������X{ �z1J�'�ãMO���h�%"��e�u��C� ���H��d����e���B!�m��B4�X���R����J�PѮ�*.�5�������JJj-K��r}xx3���J,nٿ�o�%�년�ԩMΎ�����Ӽ����)#��P��h4̈�evl,�ϣ�_{�/�Z�/��3���L����_�,��\�Z���Ϩ;�TWeDk+3ZI�|<��P�2�����Jݯq��BaY�#KV�(.�� X�#J�'��ӑ�Xy���EwooBZ1+���H޳�K1+srXh����}�6�����cީS�U�չ��;{�q���=4!�B!  !�hF����LJ�Ŷ����2Ʒ��J,N�.o ��p�;��,��R#sH�(Lǫ�� &W����:��u�` :|ԫ�DD4��,����N�bev6���?� �{x�p|<�cb�u��$UUɪ��pi)���8\Zʡ�R~/)��X#��Z����Y�{cq�X������t�t��t�t�m�ž��ߵN�i��;����^�m��U��j��b��j��^&��ڲb��R����*�Mn�~��-��Y]ًV �l&�l���Rt���,�J��k�t��&�ۛ�>>t��v\"<ܤm<��]��j �Բ2^LK�C���R��hO������@|>�� ڳ�zy������j��W`6SP��~)��+��t^Vf�Pj�Rb�Yj��PnU�ѽ&Jq�Y���ti��� U������ϯ2���p"�z��r�=<��h��jk������Ѵ�D��:wfaf&� ������|ڻw�>�B���ܳm��یF#�m�4��m���]%@�!}��о�GF�3��0�Z���gθ<9�����~&I���#���|�T��U�=<�����r�[ y�� ���ST�Tfl���Ν�6, �9��L7�^-�[W0�A�{Ry�P��JY�^��`�^/eA[P]��������fr��Y,�X,u�4��o�R�*��i+�����϶B��a�p���Q��P��Zu:�u:�<<�� �~=�~��=��@��QF�.!<޹3sSS1�*��9�?:ub`+|� !�m��{��;/���f͚� /�@VVS�Ne���DGG�����ٳٴiyyy�?�?���\{����e�6l���q���_x���ٶm ��^�s��̜9�u��1z�h}�Q� �Caa!s���~����)S�p�w�������h4���O���?�o�>��¸馛x�W�5k˖-@c�a�d��N�J�.]�6mf���?�EQ8t�P��O��t���CQ�PU4�J� !D{������̙UU�]��ՇC�ۙ�"�sfUUf9»����������s�UUecAϜ8���|��I}�4�=pvyp0s;w���s$K+/gC~>�����YN���558�o�t� `D@�����O�^�\O�f�Zɶ��6�8��{�� f�}yNEE��=8>{�%8�2C�r���k�J��L���q�2 8&���w���h���A���z=z=�\H������ǎ�݀����꫼��K�9M�B����ۛGy�|���Ҧȹg9�,D{q^v��͂ x�gP��z���-Zؾ�z��̓>���k׮宻�����禛n����3f��O��#�p��7ӭ[7.��"������s�q��7s���0�b�0n�8���x�W�ԩK�,a�Сdee����r�'N��k׮|���q�n?�%K��駟�h�"������`���������p��i��� ہ�o��W\�ҥK tј^!\����8��U� B�K���k�v2����ڡ�Rv׺��-1<��r���|��ը�+���>�����SU����x�� �9��՗1X��>,��;wn�LG��ڳg9�t44�|/���~~� t�xyIV��*~g��ʋ��D�����\��J��J�A��@��$��aU�YtG��J�Ʉ�i�W�-3���YU���Y�%'��LJH���w��U���_�ޛ{o�N�$a�@’��0,{8pV�۪���j-��jK�Jm��2ԪU�F�����7 �޹�&����wp�� ! |���$��{��������|>_=˟y�ʊ0��KB�vUVZ�s�='ad�Y枅� .ـ����U�V��}�x������w0 IDATGFF�����uRR�f����Nҳg�����ࡇ���g���������e�С>|�޽{���r��!>��s���HMM�/�`����v�m ���ˋ�}�Ԣ׺u�V�΄ �޽;#G�����ш��u&�TU��Ϗ7�|�E�'��F�{�MUU�H@(��bTUe�9B���o��[]z�iAAtk�ʯj��[��cuAA��qot4/��ݬ�x�ˮ��-(`qf&�*+��`SUW:�67���dB}�Tp��,W X\��%%mjqT�q�L�����@���s��?���^�c���U������8UUu�cu5',NX,��ԴI�ג��(8^W�6�vg��S�8��VQ_�>:o�) ^Ώ��5�:�6UŮ�X�c�9���m����G[+^_C�#vͫ �SY�^Wպ�����#mք�W�� J���F�ܳ�= �\��A��'h��������ӧ���`���[�������|�V+^^^��5y�d��)�� ݶ}�vz��͎;0�L$&&��OUU��~�'阘��-q�=�p�5�ЫW/�M�Ɯ9sHMMm�q���O�B������V�#�%���������U�99 \v�vl/j�ٸn�^�(*j��k�|IϞ<���jVU坼<~���!������AW���n�x<>��m fZ,lp�_��������k-9��J0���V��~~x_�*�ά�n�Luu����1�b�dUy55�������:�s�,���z �n?��QM������������G���y��F�o��k���ܨ�� �tu@M�����n���y3/�c;+<��������=�?���mE55��X8]]Mnu5eM��m�gHۜ�ÖR�Vպ���c/=���"�m������D�i��=�ܳ]�%�����Z��C�ju��ߴiw�y'�>�,s��!!!��^{��{��r����\���l�����w�՛����>ߗVψ#8q�|�k׮e���L�8�w�yǽMc�B��Ȅ��⍵{"��5�]̞��F���������F�q^�µ�+v�Z����]��TZ���WE�[��qmxx{ ϭ�ngUn.��$��� 65f-����u�7��$��{�L� �����-�[z>.L�cd`�{�����70�s���*���8f6s�#�;UUE��BvUE��ъ���\�buÓ �J���\?F���ֱ����ΏA:��u�t:��������(�V�:E�O�evT���G����7��kU�Ye������������M�����8�����p��!��^�A�qN.��(�Z ��j7*���"s�2�,DWp��My��W�ꪫX�p���M�6��mC� a�ҥ���2jԨ��_sxyyq���s�����W_1a��,YB\\����L� 2!ĥ!Z�G�� �i1*��b�TV�:�����u���ͭ.��M���Ptm�v��jeBF?���8�) �Z-������l��ZN���Lu��b����=QQ<_�PU�np�!xށ g��D�� !!� bd` 1z�%�J���q��cf3�,���1�9l6s���V��S��]Ȋ?WH�X������M�'Z�'��� �)*r����@е�� Dzy9��`�w�egg���� ��2�ȴX����z]�ncǴ%�5���9��*� H�#�ˋh��(����H//"�z"�z"��G���J��Sn絜���NQx/?�Ua]����h������sw��Ə��l)-��R6���[O��V�}�b�dn.�sr���ͤ����#���p���|TTt�kI !��Zd�Y枅� .ɀPi�}��m7�|3���j�2u�T�~�i���Fs����r�Ct}�""x����3�Vn.�ѣ]�o�j�� btP��s�lfKY[JK�XZ�A� �Ċ��g�����ӧy1;-py@BB�:8�a��xi4�Y��}�]��[!DǓ�g�{��P���~b���=�V���%;;���N�:���B�F]J竴�;�PZ��:s��_��B�����n��h�wr�Hb f���'����:��0'2����fcʲX�s'��ol�:8�����:�'i+Uv;��9���L�kjZ 4����Pl,�-��ʎ� >*(`MA�++Q��lͺ^Z�� WruHもH��k��f���n�����񯲒�&M&�U�:EUmtݵ��X�Q_����D��x��8��8�G��X��6�Y]�UU���;w�Q��C�0��:OJ��ʶ�2�8ے~WZJ��6����\��0�y���#G��t�T��m౗k�!������Ru��{��_�.��!D����Վ;.� B!��/���q���2Y_E�E���45b�z kj�����@ʪ�m�^������t�[�����i�6�5v;+ss�����u��C�h�<���XB�Y�h������� Y[P@~M�{��k�{l\�p:E�r~¸�`.����ȩ�J~M ]!���~��=��dWU�������>m@58��֭<4( � �v����3l��;�š^�Q�ݼ� u:� ���q��ֲ2��eq1��ʰQ�ͱ�n���B>),�1 !�B�"y !�h!^^�A��F&ۅ��9d67z_�ш�(���_����//�r��;_{*+I۹���U��¸8��ѣ�*ᬪ�ss���㜨���{��h�� .�cc jF��l�A#�C[*�@__w xe``�WT����c ���!���V��Ugm4��j��Ւh4��LJ���� Ct:i'%�K�6���yy<�NmF[ʠѸے.NL��fcsi)늋����ݕ�����v����_>d�g;�_��3��9it +� kW�ߚO`d�yނl~s3'���,� ��ooBcC����;Ǻ�]��Z2��`��搐�pA��\%9%�p� $�$0g�Z�g�g����� !�]��B!�E����E*�]�!����5�]p�sr�.�����H�m0Q�Sy9��ө��Z��gO��;�q����;yy���q�Z,��{S�� � �G���et�9+�TW���B��糫�֡͝P��XG0�hd�3L jv�bG����[Y�>g����=��dZ,��ű�LCǣ�p�|x) �:��a^^���&�LJ�F#������'�ho������mFOTU�^Q���"<?���!!L ��={RTSÆ��))�ݼ�Z�}� ��Rþ �jݶ��]< t�'/��2?3�W�{����s۬6��Ք�pr��Z��j����^��<~��G���J�]��Rp��-ooa�=�� ��A !����B!�E��v�IJ� Bt�������Bo����P^��c۪����R&fd`��[����]�&㰫*k x��1�͸p6Ai���ǻw羘���s����:4���C5�mU`��?ׇ�3#,��>�wЮ�dZ,쪬dWE쨨 �bq_�Zt��Q�p��ҵG c0��LJ��_O����]��R\|�����wʀ��//� ���/eg�:��i�X傯z)ٿi?U�*�z��J�b2�3/h����_��G�͠I�� ��$��{Np��õ���� f<:わ�|ج6 � X��e��w\$��_?�x�q���CUe��B!� �B����֤�T !���&S��Y���y37�ք���F#�������..f���T�����C xi4�MNf�s=��RU�� y��1��L�`���ho��G���`����*>�hZ��֡8� ���AA\δ�P� �f���)�Z�� wUV����=����#�sV��=�mY Xw B/E���Hzy{ת�7�t�J!ښg�Q�V^O'&v�*'��*G@5�Ϗ ��g��|} �h(���]��?Ow>t�P����/2���m@�}�^����?E��0h� Mtl.����mG):]��܂�KK@x=��d�M��m^���~���N�B��fBbB���٣k=8�h�{my��� %ub*^F/>��@����Y��#M��n�FX|�'����Z��mv6���=��`*5{Y,���g�>��6�n�qw�cݿבs4���bs��Lf-�E�+�6�� !�� �B� �6nZ��>�Btf��kD5������ ����n��k�����ۻ����s��:_Ȱ��V?���|Q\��ǎ�������+������z�t�ӇNs�"!�cч�{�{,UUy��WI�D��x��t'"1��1y������.�ׇ�&kw���5�>(�h������ȶ#�v��{=���������v��Geq%E��{��S���s\�c=s� _��5YY$�$p<�8 � ���]�^ї���'8*��� !�����B��N��d�FQ�Ũ�K��*�-�F�/���l�~p�y����������N�-<=i�(��oRRHjeKMUUYWR�ǎ�Cyy��AEQ�et4��ޝn���f��O��x#'�O������hs��� ý��.,����a�� ���w�������9`2Q휨�) �:A�J�U�m?����^���}}���LU���X�Ѯ����E�;L������I�۸�jK5�6�#uBj�����f�3�֫�/|���|2�3�6W����sGB@x^/� ���_��~�N�������<�z����3�� D'E�a�2�̠�T��g�r�?�����~=�& �ۮ"+#�]9WW�T~X�v��js5{��Þo���;�2`܀z��l�zj�)w8h�10�$�&���M��dG��TX0ncnCޱ<�����r����s�����O�v����y���[���ly{ �g�F�ox:S��ʌGfP�]����L��4�-�ly{K��Bq���P!D��S="-F�]� ���Ǩ��yQQ�v�. �Vq���[��_q�޽� ����uJ Q�l�����Ǐgsi)��� �t�m�v��S ����n]q1o���~~>&��V;�憂���^��� gfXC���tPЕ[]͏���X^ζ�2���SPS�������� l��0�ˋd__��A��_�^&=ť�^���\~�� ��hT��v����?�H�ӟ}�9��<�р��k.�����֓��|��V���Meq�{�?����s��趣������'��]��ʙCg�TX���Ppұ?�VÄ�'`�1�-�#ۏ�gݞz��H���7��?��ӝ�JrKX�5���#�[P�c<�����z�:�q�&�r_d`�6~Q�F�a�&c�3��׈��‘mG����PY\��x����T�T� (UU�(��ъLj�&ϟ @Qv��|�=�˭�(�B\ !�h��*H��K8d67z_�������?s�uk�sn()a�����͚�F������ֲ2�8v�u%%�`��3��*'&���UU�ZV�ssy37�"���k �* U`��?ׇ�3#,�>���<55�� �������\g�PU���AXw߱�ζ��|}��LJ�>>�����n�ѣ �L&���6�Hq):��E��G5�N�#�H���h��6;Y��(�)��)�B�D��z�� 2,厮9GrX��J��V�c\�H]�卿�(>]��<�O��soo���)�.ro�j� ����EB�I� �A݂��� ��c,���9����څ�܌�����^��!egWȌN�v���J��FۭW7�~�Z��TZ�T��̰�ul��f��u�������}]Rxꛧ���Bq���.�-Z�ʕ+9~�x�����4z��������ܹs�����o�m�� !D�{T�T�R� Bt�L�Zk�h�`���o�h|���l-+cҮ]-^sPf����~�0�����J=z�O���k�5⹪�����=H��eoe%O;�빹���� 6�zNXqcも�6<�i�����l�����l����jq��? m�V��GU�����LJ��������@?�V��B\Jk3*�hH�����Me&^���zۜ+ �lM�h�W��߸��ه�N$�[Vm`����cp�ٵ��}�S�5�F��3�ϫLU�8w�d��� �]_�]�pڂi�O�������H��z� ѕ�ܳ�3��:=t�V$k׮E��6���+Vp���c�מ�Z�l�.^����Fbb"˗/��!Z��Ѹ'�U�����rB�q��h�^E�VQ(�Zk��t߇���[ [<�(/�� ���f��t�':����������SǏ�*7׽Ơ�����z��L��{y�v^7���>����hNx� _��Œ�0�gbH���+�Z�YQ� ,/gkY�{=Ɇ*(��t���t ��c���# �󣏏�N�w�]M�6�o��(!�C�$:�K �6�s��܏�Bmח��YA�-�uzo=G���l�>z�ɶ5�سn1�b����76�����ψ��Hx�p����|��׌�iYY�Zvzz�ɷ���LL!�G$���*d����m"zԿ���xyVR��(���M\r���T�������U�5����U�Aqѐ���I�ťLBj]�ZUUU �����R���m����u�����g��>� !Ds쯬lp �U���`hdf������Jƥ�c��Z.NH�ݻ7{�����g��x!;�󢍦��wy��M|<'����Ç����V�es�\��"0��ݺq]xx�Vșl6ҝa����|_V�Q��9��=�5@���PR]a��/���N31$�Šn�уf3�++�L��������ۋ���/�]�~UUy���)+(��L1��$�&Ժ�))RX��:j�jػ~�;t�֫E���羓F$1h� v~����2�]�n�m >f>6����_N࿿�/v���ng���� v�^�*=ծrx�ao;��k�d�5��9Ƙ�bx�@v}� K���Z 8*����(����M�����C���Ox���������6{�BtV2�ܵ<6�� IDAT�ܳ����E���� Cbb"�>�h���o����� �+���W_����}��cǸ��{IJJ��ח�.��7�x�}��bᩧ�������ҽ{w�x� �� ,Z��'�|���$RRR�U ���so7w�\ƌ�믿NJJ !!!\{����9Z?���{�~��h44��k�c=�X����T���INN�o�[�_P�Ǽ��� 2���X�qΜ9C{(((ࡇb������гgO�,Y�ԩSٸq#+W�t���7�_�+���}��Gbb"ӧOo�� !ZO�1 ڵ�'B\*��L����y�KQ�&,���q�d"-=�r����F����$�JHhV�d��x�� �o���N��FU� $���h\�Z-3����Ç���qEsMW���h���d���A��=*�M�AUU9f6�Fn.�>D��f��) �n��m=v�ؾ�?2�Y��EBja�z"{D2l�0X�������֓ۖ�F|r<Q�����D�F$�� � q>��1��5��~�F�e���g$"1�Q7�⎗�U ��g>:��sF���7���b�_g���tz�a���~�����/ub*S�O!~@<>�>���7�^�GpT�9�#Dg#s�2�,DWqIV.Y���^{� 0f��,Y����k]=��?r�W�����{�S�N�?��͛7�r�J�x� JJJX�b���ɬY�X�f >>>�~N!ą�р��D�v}B�٘m6�8ןkHCk�顡�n��i�0:=�⚚U�i�w�����&���*+srx��1�jj�������!�`������2vUV�j!ڜ�����-2��ݺ1�ϯM'��vv�������JK�TRB��=�g8�_����smEo������ `��?����a4���I!:L�6�yy�Vڌ �-���m��1��w��uۜ�s�6mNZ�mH��t�{J�z��N�J6�o�~���ot�&F ��j�v;s��A��`��rr�I���c0�NKl�X���5�kƣ3���z���e���cP^X�O����q�U|r���~P� ~��w ��Wo���m:���Ӈ2t��Z�7t�εo!:��=�ܳ]�%�Y�����}E��ի�����͓O>�u�]ǢE�2daaaL�4��_~���֭[Y�p!�F�We�l޼�O>��U�V�_��}���g�5�����o��f�c.--�7� )�q%Xhh(�^{-������@DD�~�Wh���cʔ)���`�С�L&�y�Z'���RV�ZELL �����_<�}}}�۷o�O�[�neܸq�M�w?��:00�^���w���o߾���K-z>!ąc�x�؜����#�X��5T9g~�����UU�޹����f��Z�[�����V@���aa! ������#P�CUUNUU�S]�kڡ9��8�G�(L enT�������j�/+cKi)KJ�QQA��6�*����-���}V��'��2*0����ߟ>>>-Z�Q����g2q�d"I&��E�Tj�����h� ����ҽ��(L�A�ڮ��ˁ�ذjz�����V�7ȗi ���s ���ܳ�= �U\r��ӧ�駟���\������l޼����;�'@O&���?���3g��#��p�BV�ZŴiӘ7o��р� �^��cEQ�0aB���>A��\����g�q� 74k���|��G��/�u��ɓy饗���'�yU��A��'h��������ӧݯ��aÆ�o߾�;����3w�\>��s�q�իW�;iҤ?����{L��B����9ڋ6�_�eRHH���UW���NvUU��A���7)) ��;綛KKYp�?���ۄ6u�U8[qWf����^�����(�'�<[��T�}����� %%��r���Pu���0&�\�H����F!����ڌ����UU�mF�^��K��������rj�)*�*��uFҭg7F�0����vy޸�8z �A~f>�23~�~F�kx/F\7���]�W��B�e�Y��� Sw�X��μy�X�`A�m]W�w�}�t�M���;�^����~��{�|��m�.,D뼭���UY��]�7���f����QQ�q��5��j��r�+-esI ߗ�Qi���h��V�ou�g��p//F0���?�pS�qj3*�����\�k.���ړ�C{^������g�{�3��.����fȐ!|����TU嫯��ub��M�}��I:��z�����v�U �2�*�� ���L�6��?����|� �G�v_��|||�={6k֬a�ҥ���KT;� �Ԋ+��ϳŨT !:��&S��ʳ�*��iTW����� �L- {z{������o��������o��"��`���<��ͩ�s��Z-�DE�u�`�Γݻ�8s�4��� �N�ʣ�>ʱcǘ5keee�ܹ���h�� UU����ٳy��')))����=cƌq_m�*�^�r%3f����__�z������ky���3gk֬a���,Y�伏�mۘ={6���:Æ k��x��L�B�޽�����w�%-- �^�رcY�t)����N&q����bTх쫬lQ(��u�u+m6&��Ů����|}�*5�0/�z�����<�6g�_s�ܒ����е���nݘR�uts��XX_R����*.�d#�BϷ�ܳ:���7c���L��F#� qQ��fT������=4!�� �{��g!��K��`�…̛7������t�M$$$��Ի�c����f��>RSSy������`0���())�;� 99�Gy���ǻ�x��w�7oo��C� ᦛn⌳� ��ꊢԻ/55�_��<��c<�����ߟU�V�� �g���^#&&�|��}M�2���l޼�1c�������������L&>��WjΟ?�����n���[kQ�Y�f1v�X�M�FDD[�li����3 �K@(�����=�NQ��[7���?���Lݽ�mee��4���6 T/4�l��� �o�ʒ�'�V�vi�쪼��ǿ���5�����֬p�TUo��r�t��{�ne�����u��p~�B5��#�KQ���8>0��+������3)�9ݺ���G�A!.�""� �q�B!:��=�ܳ]��?����豴Zll,������p�ԩ�N��;w.YYY|���=!�y���WuMڵ���n��;��� !DÊjj��=�!C\g� �j���{��EQQ�Zx�#�̚�d|�Z��6UeUN�?Nnuu��[B�#�%2�bb���jHvU��B�������r���}�K�(�j����rUPW2�߿�5 ������w{�]tl���Z'�#R�)�m౗���!D����Y�NW`��������.���{�����Վ;.��B!. Y�P�Un�U�����6��UU�y߾�� 0#,����s�]���YQ9�A����-iq���7x06�yݺ�@[SO����PR·Ζ�� P?<�pг�h���gxe`�T !�P��5<��CB!��S��� h��Z!:;�F�G���N� !DG8؂E������ޟ�U��������Ea�m���ַ�����J�>�7%%�V�mjq��ƒ11L i4t;SUņ�R�uVo�@е/ ���K�3�"0�h����B\z� �egk5X+�B�$�{��%a�|���B������y�)����͵*���\V�6UU���!���ע0���h^�����_]�o��3g��`[]\�X#P����h�Gm�r��-CKJ����cm*α�p�S;�ߟ��@pD@�:��D�z�����h���Q��JK)��!���h!��R&s�B\��/p!����\3 ����Bt6M�f�B�7����ZUU:r�W�U+��x|<LL�ZUYv�����Զ�hO�s{)~~�*6�����8[�v6���EQ���YI٦��Dž"WruHc���燗�(�hCz���������Dž�qKddG���v;��Zj�%u�p��Q�R+Ԁ]�~AB�UI@(���X�g�P�Pщ���lV��NQ�Q�ϓǏ�Bvv���=x4.�� !DW%�B�vS�1��-��B�Nʮ��V�M��j���Oge�'Z�|/���Ȁ�JOgsi)�f�A-���8��cb�E��55���Ǘ�*�ܚ�z-L�"T�T??~� � ��C�ܤ�P��Ъ�|RXH�ݎ���5���LL��uY���B4jKF٭��=!��$�B�vS� �"���:]]��޼+�Cu:F:��<ɓǏ7�q�z��{�b{y9>�f� j��̃��� b[y9KO��Ӣ"2**P��6�|��s?}||����`F$k !:X�N�UAAl()�T��l*-e\ppG�Y�z=�7O����B��s���m��-?o����cǨi�uU�Z-wEE1)4��&���f�޽��v��.����Ow�� !!� &-(�H�BtB׆����p��?,(�2�B!���s!�h7ծ�0J���jQ{��p>,(����G�_�N��yyX��� ]�Z������\��yy�����波"��jHk�i�9\��^^�Ɋ�}�1�̑#y�On���pP�iM u�n��*���Qϣ�rW�Y��U���33�,^̉��Z����`ث��h_s׮e�ʕ��fEz:�ŋ[<ζr��uC��ݻ�r%�?��������#i+V��X���+���:zB!D�"�B!�M��A(�����x)J�sVC|5��{�6k�@�Y� Y��Πk=��F#zEa�����V�O�֯e�ڏ�F�σ��yHゃ��퍢(M�@!:��F#ɾ�쩬�Tu5{*+����#��r, �`��a��U�?m��S�G���M�&�)9�ɽ{�n`�X����|��w�krۺ�:��癗������tLP�X��v���Ϲ�0޼�Z E��o�a�ɓ���k��w)2�y��o�|�G��� `XL 3����v{ަ,Z����կjݾ����z����v-Y��|;g�y?�Ƭ,����d��p���ߍ]�{��y�( Q���rE\�9��K��$��s�dgk�-[�����j���� ,Z����D��+V�@�I&�333�h4lܸ�E�KKK���oo�Q !D�j<��� B!Dgu�l��D8�� b��=M�.����6�s�95� �,��fs�ʘ��l����˂�86��Rr啬0��bbH��pP�e]�>�i�� ;r8"��c'Z�{�R^]͍������:��m���{������o�O���dbvJ �������xyq���<�iS���Pa!���?dg��رd�{/�&M"�������N�h��n� ��v �+��I����W_M7?�s~�s, ����[�?|8����⋬k�֢됹g!DW�y�)^@���<��ü��K|��`��y��;zh ���'''�����v�Z��xͯ��4Y�|yGE�N<�Z��P�Y2��l�i�/+��fkQ�goz�&��lE���'��X�pRH�BC�yp0Q���D!�ʌ�Pgf�s���|�޽C���v�9� ?�����)�X�̟������ 8�^��9��))�./�ޏ?f�$�p�(^��'��Y>cp���a������VT0;%�/��(J,��36eeQd6��=�99�}��;�{���#7��6+��y~�V��=0�� �#j�,*�zFK�������%$�Sݡ`C�~� Y��Wl��&�ח�))�b�@�=�����<�n��X�VDD�S9PPp���ٺtnj*�q��<�u�?�AVI �7l`� dΟO|` �l��gG��ә3 �NH��s��#G��ƍ���gXL sSR����0x��Ώ�֯�����z�E��y'���psr2C^y��2b����= ���o��9��#8�q=z���q�G�q���F+1��|����HO�HQ�CC�99�[ p�܁�2snj*o�ލQ��!C�s�`�:K�lq��mQZO�Mڊ��>���ֵ��3���1�TT���ٵ�:��w����[om�xL�ݛI� �G�������3�����Hf����U���v-��?i�~Q����A枅h�%~��7�l6���ZWj�v��f����F������È.���* 2q%D���VUUB!D�u�ln�v���&�%�V�6t� U��~~L cbH���k��B��Q��Qz=g��������j�]D����)�CCY}�������˫���z5g**X6iOo�ġ�Bzԙ����?���4��_~I���+ӦPe��/,��F��O�竣G������2�Ձ{��%9��m�:�=�]�����Y�?�֯�O���!C�ۥ��l�6�8f � ظ��k���/~��s�,-e�+�0'5���FQe��-[X{� ��`[v6�^{�ɽ{��i� g[v66���}���ĉ���sr,���՘��#�_���d�@��_9�3�7��kH����lf�ɓ�ǭ=p�_�^͢�4�9e {��X�a Y�Ѯ���`�Q�DFr�������".0�oo�BCؕ�{΀0m� EiQ��c��l���!C�ᠧY����o����'�������ʟ���������cɖ-|���'����FQ^ھ��}���5א��ï���oon0��� #���w���ǻ�pn�����gǏ��d�TY�o����ޡ��l�r��+$�܊ >|�3fEJJ K�.%??���}��A�L�Bxx8111�r�-����_�~=��͛73u�T���X�dI�e�`̘11r�H���kX�(wZZ��ͫ��nj���ϐ!C�������̙3�~ -QPP�C=������gϞ,Y���S��q�FV�\�F����4 ��� ��w���L�>�]�'�h��Ў�BtN&��B��Y�^�p��ϥp�uh�N�-�կ�W\��C��(!� !. ��pmX:�9O>��ڌ�kj�������Mϐf��˕�� n_b���� ^�8�[dZ�>��9���޶�UU��9��IILIJ�A�������~~��g?cpTI������KMe����7���b����d́ IDAT������1�wo�>y2C���Ӹq�>h���[{L o\{-���avJ �O������WU5�|Oo�D���M�ĕ���уW�M���'9QZ ���|Cbp0�|3����WH� @J�n�Z�����D��6�=e��7Z�?���X�����S� gf߾$3$:��w?����g��Q ���xꪫxs׮��W�'��;��U�������&欺ѽ���w��ھ}����.slWPТ��j����Abp0�����I����1�<�Ǫ����kӧ3<6�{�etB�> ����^^h5��o(4���1�txi���:���H����;��.OO'�LJi}������e��h�1���=�ܳ]�%WA��/2x�`�ϟONN��_��r��I� œ9sX�p!UUU��/a�ڵlp�/8����ѣ�ի+W�����g�y�k���-[������og�ܹ<��� l��׍O�2���0�x� JJJX�p!�Zp(�R��yFF���?X�x1����_����^y�FǾ~�zƎ����ꪫ�|�.��_ٸq#/��=z� 33�� ��7�d�������� /�*c��'�5kk֬��ǧ��)��\J��_x�M��j~���LJ !:;�뽖^���x�x[sU j��L ebH)~~�u ��R5#,��N�WGPP��QQ;�6����C#Fp������X���Ü�w`T�g���h�ʣ�j��0��u�V��lpT�ee�./'���q�Ν����'�7����x��@W(��j����/W_]k�ɽ{�����WV�ہ������( �9� T-�8s���\��y���vUe����1����<��1��9))��k��S���u�������C��<�u+˶ms?FUU�V+�99�v�֢�  �y��r�̖��f�=G5kC~:}����a��/(���T�l|}�;tT�iII�78*����i�q�7t(�֯�OcǢQ^ݱ�;n��U���e�狃�=�ܳ]�%�|Cڒ�駟~�����l�2�m�{��W�^�8q��F�����=�������ιI��iKO@[-��A�� g��YA��a��6�7��n�9��m���x��� '9C �S -zLi�&�4�iii˩>��#����}_���i���\W��k�RXXȞ={|F�����׏�G�ҩS'߲7�t�?������y��޽�Ç�b� �{�8���`„ -��n��w�%66���L����9��=z���rӦM�3�Q�F�����` M�=z�`޼ymڞ��S��{PU&���"����̪Jx���: T�m009,� 6�CC n��gBq��E����� |U\����|ϗ�=�_ ��w�If&O|�5�N�� SZCUO�Yo\)W?g��S7�~�t)Ϗ��>}� ��;w�����N�w�ܲ�A_k����z��2�[7^���S��S�(tt���P�?+�ӽ{��G��f�۟��=1b75���m�[V����g��ƒ�A��={��[�S_�gc�t��\���/Hh\��QUn^���:���p�].��&�a��Y�?���l���[{��ѯ��ӽ{ 6�)-�g}����[��*�gx�yݎ�0��Y�����H/B+�ر��� �})�x<,Z���z����㏹ꪫ�R!--���>��#~����o��v�ҥt���� 0|��V��ܷo_�4@�~�����رc���4��������{衇��;X�bS�L��;�[_�Қ?8B���ZS& �f�]q�vTC)Ш�b��nB��*��L���i6�/ͅ�4  ���XXP��VUV��0�2ꄏ ��W]ů���[-��-[� 't���amNc�v`_a!�eem��;v0".�G� �ݷ.'��:X,����/*b�w�=�V˔�$>߿���U�-ۿ�����A��S0���.���ƣ�Lh���_t4��1AA���MZT 33��5�4�x}U�ral�p�F#���S�W� ݻ3�{�� ��WY����8��l�������۴��8jk9V^� �Υ��PF�dzx�>�M��`BUU�$3���Ps��j{~>��N���k��5��(.��o������-�F#UM�ƂM&M �d4r[�޼�};�&�wo���\��ڵt f�_���H߳�= �$ l%������y��Oy,�ф�MQ��_�5%�_�nm�P�?2Z�9W+��i�iӦ����'�|§�~J�>}�3g/��B��m�1B\�j�~�i4���߶ck������<եM�c��5i4L�٘�İ0��8\יPU��C��C��M��M��M��C�����j�������G��=����e[x�FQ0( ��wmT� F��F�޻��o���g�h�h�j� ��� +�p]x8y�st��Ң��" 5r$gf2e���Ӈ!;r�ngIVs���Ƴ�G3�����`?�׏���l��#�C�DE��1}'#�iII X �V�� ���foa!�f3a��q#�V+}"#�*o��E�����ƍc�G��%K�)%�����-,d����1eJ��[/�{�{EF�v�Y�~��(mj�ɓ��� {�-�NO'),���R^��[��n�x�_���l���2w��>� N ���`1xa�F��ߟ5���ߵ����_mLB�%���g`L �z=��6�n0:>������\��lX�F �>�{ ����Fâolq��55�/.���� v?�A�=%�=QQ���**⯛6�݉,��&�KW�{n;�{��I@�J�����?$&&�����Ϝ9��_���bl6;w��رc�p� mZה)S���~����}��X�v-��L�ݞ�f3�f�b֬Y�����W���#��Պ��h�& !���Cec� !�h^}�`����L gTh(�f�tRU�U�x�a^�����>���].��nʽ�J��*��*��3�K�wTEir�.��f�h���i�>�_�¤�� j4Xu:��Zu:,�)�b�k�ǭ:�:���&ĕhBX���ե�|ZX��%&^���`�@q17-\HqU}���3-��n�9��>�{�-�˗̣Æ�ǵk ���h��οc��^��WT�oW����091�gG���e˚}�=���/��/cǢ�~VMJL䟓&��͛��kq!!�9���U*�Bߨ(�HK�+W�W^Nz|<�O���v�Z�q��<�j��ZE��A��������e�]w���Uܵx1.��>QQ�s�$�n(�?�ÿw��˖1�Oޚ6��m��y�~���`���:z��M&�����/.&�``TB���'�PhJR_�~;���nY��j���6�{�hp,�>Muڿ���L�޽���M9ZV���ݒ�aa�3��֬�U��WXH��MW���w�}�0�̜��7ofʂ��i�H}�5��V����M㵭[I�?�����wƌ�4���������a���ʕ�>y����yj��S��5]�pGZ��)����u���� ���r���I~T��z���y���׷m��mۈ �Ѓ�� ��Kh���@:3�sg>��F"[܎��I�󙑾g!Ύ����SO���3e���� ‘#GX�d s��i�|y�ȑ���3e��q�v;�=�C� i0tk����������ΓO>��n祗^��h�)UU[�ˑ�ٲe �f��?��l��~��_2i�$�w�Ή'���IOO������ѣy����� 66���t2w�����Z�6ndl+~�&�W���t`LH��V"�z�.����TVF��E��Eqm-�����R�rQ�v�j�w=- ;UU�M�ì��B�s���b� �;O���xpz<�4��3}�L �Z-�z=�z=�:6��P��7D��� �u:�u�K>0�)!:#BB���PX[˶�r��\�Y�B��g���� b�_eWVQ{ y�/T|��,=>�SO��m��x��kx��М?�߿��\����5k�����W/��w���]���ͿM�Nc�UU��a ��|�¼ƒbcY9kV��?2lX��T���X'GD��O~�ྻ���n�cԔ��x���}�����qv����;Yz��-�{���-.ӜЀ��7Dߧ{�p�…�}�f�1���bbxw���5>f3����h������m�榧37=��}��S��m����y'6�gP�vs������oU�Tz|�)mmlvZ���Z\��rI߳�= ���3��2�ӕNw�ؑ;v��c���c�QXXHll,�G�nU��F�a͚5��׿�;�@�ד���_���Ӷ����/_ν���-��B�=����-��Ҡ-����}<�6�9���OUUU����C=Dnn.���=��x��_=L�2���\֬YÈF_"�����0��e�!V�B4M�(u�t����*�WUA~��q�w�˜i]�.���Jr��[}�x�o�%�7hTw�!��)@�VK�NG�NW. ��>`�`0��e0��`��EqI�Κ�R��dIQ�%��eYY����\��m��n� ��'EQx��ye�����,(`iV�on�+ݻ�dh��5�gO���6�dg�]ZJ�w.�K��������-[��x�Ր!��$q ��疷YO���h? �n߾�~~�7\j:v�H^^������ws��_|�� X�|9�Ǐo��!�q�|^�������:y2�+1���B����s���X5V���U��ZQ��M��i���Q���:H����@��@��H��@��R$Fz�D�T(�v��t�i����f3?43W_{����x�8wX,<����tݟdf2w��KKI �޽��W/�.� �{�={���Wӳ�|oB�Evi)]��7R;t�Oc�0)1���tQ{���_YIuT�~?r�\])�9͑�g!.���ڱcǕ[Ax�{������s�ά\��y�摘�ȸFy !D{��+W�f!��as���ٿ�;��Mg@it}����"qf�^ <���S�vS^U���*_ի��44U�n��z=�F#�Fc��>H�2��}ճB� q&� �++�t8�v:�?�9�.eM �x9�x���n��Lć��8T�W �{�� �9���ıf:��N��{�wN�WZZ��O?M^^ ����%7�x#�Gqj��/0���!�8��0�{w>8q����y���)s�y�����g�n�z���`�h0j4�4L��^�A�.h��`����_Q|����O㷼�[��4��UU��ĥ����P�w��u���Ŀ��J����Ͽ��TU� ���8_h� U����;�f���Te��4�7�H���H'���&����2�h��DD���7u�%K ��c��n�B�*��,�8�U��W_}����w�u��ps��aΜ9�|�Bq.(��hz�wq�++(c �q� ;��` 2a���5�k��A�B?p������}�O�o�&�sHQ>LIa�wߵwS�L_h��wΟY������b���j ���tj�ԇx������)J��5�+f�I��R����xp��g|]�vSὮ�x�t���x��x�����x�f.�s�M��i�c55��asYE���=l�h�h4�`2P ����F#��~����Lv6P�9���B!.!��,�8�w��ܹs{7A!.*�m��ʀ�n�h��� ޼�M*J��_�j�k)+(#;#���FJ@H]@�ͻ���V$ � �����)C%^�@�(��NG�N�M���^O��H'��(��N���ݶh��T ���U�Z�Z����Z��r��R���K��EQm-%���\8<�����ފ� �� ���UUEVU��R�aզ�����t���a'�u�^�`�Yqy�H��@~M `�ݎ��jT!���{B��MX!�y�( � e���&�n����'�g�MC�FX)+(�ؾc��z7�F:Sk�6K\�ԋ�ڪ%*��Ƭ���dm-n��A�cPb�+�L&:�L C�����vA��F�M��v�!�KU)k"Hl.��r���|�{�������>��_��tlj8W(�������h唀3@����DO��nf3�|�h�AB�ˌ�(����|߰�_sC���4!�B!��e����Q�B\����ۻ B�VAN��v��=�����ڰ��H��`yg�� 6pp�A���t�wg��A$�Ln�lmu-+�XI��,j�k��Ǹ�����oc?i`��s�ޕ�;�~��k�H�*� l��H!1I1��}�i�=߯�����N�K����5^%?+�u�]lj�'(+(�n%�g,�w���`��5�����L�Q���U�SQ\A�T�M�G���N�Wnz��f�o���oީ{���#I��~f/������IF���W��v:9�t���u�xh�P��NF#]~ �B�H M.K:E��׷9`��*%.'��aS�y�՜�uM��y��ϕ�Ή*���8h���`T�M&z��tov4��ypI��<��M:Eaqa��B!�D������?_aPP�����vn�B���sK��MB��m���O~Hׁ]��G\�8��G7�,+(�{ޠ����e~MU 9���]�`�C���J��>�_�|���̵��|�����{~Sn;HƗ���y���\�%��m����*��Z͑�#����|�ݾt;���y����P|���o2���,:�:u���o��aw�ֽ�����b�.~�V��(���կ�.v�����wΛ�*�J��c�WV�k��J�(D ěL$�Lt�V#�4��i6�q��4i�0��0����X����/@�� �U�}�C�7خ^Q�l46ƙLW�����!!X4*=\���EE�TU^3!�-��g!ĥ�5�ϗE@��?��'�|�����n�B�(((�?���� !����ެzs�յ�j]�۸�ZB,\}�� ����e ���h��>2��!�T�W��o�9�� ۖl#yd2 }�a��p�ne��㉈�`՛�ػa�i�T^TΨ�F�gl������R[]KַY\��kI�Ă�-� ����r����`�$���V�!��=va��ۓ�O|@���E�.�:e���Z&>8���V���W���+�.��������.�y1��9{�9{����Xk��VUjT�j���C��R��P��P�ֳ��͟Bݜt u�z�a>�֪��1��r������l���4�� ��H�X�H�74L�X� s� �����h������Ǫ�����r�.��Nr�N�]�a���:jU��N'�N�%% ��:�$��$��$�ͤ�yp�0h4L caAn���f��Έ���n�B����? !.%���,™3g2s���n�Bq� ����ٺx+�o�UT�V�ż/��E��N�q���g�����wf��7��;��K�J��u�&��}M��5�ʈ�F�84����uae��](�)�U�����$ K"{g��:�d�I޸�S�m?i�8���P��ucഁ�������QU��Х���.ű'E�<׵k�������Ue.v��R� �w��ץ.E����n7է ���m���n�ݨ�E.k�v�-+k�X�Z�-zY,$[,���(��h�Q�!! ����f���x8VS� �:����N'G��)��=�!b��� �TW�S]����� �j}z}h�l6e0�ypM 磂�!�u�����'O�Y�;~�A����]��;��[&.�;>����ճg�wS�H�+�pgZs��ۻ)�"!��B���e !��ܱ�XH����[����OַY�Z���_Jf|��5Š��c�Ss�%�%@�p��bc|��:�a4�vT7۞N)�|� &��vl�X�mS��w�Y�l���Xz����0�o��>��!�*��m���i��`�h�z]5�1�� IDAT�Ab ������2�֞0��ך*�s�qhR�v����m�� *'� =�fz�� ��f�M&��P�Ƞ���9��55 ��VW�]Už�*��N�~�t���E���<���l,+ckyy��0�>8�XH�) ���BC}���Ì>ۥK{7����)5��ݻ�[[�Ě�lF���=D���vm����g׭㫃�[XH�����<��NrDD������&4�!Q���bW?��Bq9��P!�>� �/l��tL�H��tJ�������C'� F����x0� <��A���f�������|RF�Px��� �����f��_/4&�w;yd2�Ͻ����3�Dj� |��@�'�������QU�R�������Ԑ�t�S]���n�?=�U��CJ��Î� ���l��n� �� ]d�0�&z���&�� UU�dm-��8�t�]WU����@UE~�J�y���m������Z-=����{�X,�JpxV" ��YQ�w�������|抖���M:&]�wC�����A�ն�9����`����(�i�Ң�8V^�۷�������LNn�66Ԋ�/w�.Ƌ�=/�B4G�J !�����'J�;�/�ݣ ��~�N��e"�D��iI���m�q���K�s� W�5� ;���l�|;�@l�X�&�����^��ν;c�����m_����t�j\�Y��͋6�44 C���b���Knf.w�r��?�k��v��<�+�1Z�#D�/EQ�� ��I�X�]��[U� ��>�tr����55�\�j���VU~p8��p��C����dbPP��VY�� <'���ʤ( ��C���t�9�tr����UUt:9�p�UU�����]���>��E�n7[���YQqJ�/8�X�m��7(�p��8#~49,��**|�-_��pkdd���L����o�7���Ô:�t 共c�"����泽{�.-�_t47��rSj*�~C�j�y���<����|��E����W_͍��<�z5���F#� ))��ϟOBh()��c%UULNL�&`i&lm\iV_��ᮻ����|��ˈ�8�4���x�󎕗s�石���CBxd�P^߾���Pޞ6���T�݌{���+؞��?'Mbb�������.'��*�u��ͩ�L���Föc���;$��ou����!3�8p�߯]˞���rG�>����B���K������_n��Q^7��qq�����e�O���l�c�!3|�=߲�}�jěRS��wo��~Y��uü�[q�\��o_�8���O23�kqݜܚg����4ޚ6���/n������rsG�����ݻ9�� �����bYV�s�4y<���† |}�0y��t�wÇs[��8].�[���{��]ZJ���m�{�����}�f���Ł�b���qsj*���EtPP��A[�Wߨ(�ܱ��EE8�x��WW!�h? !���#����G�|�h62���L}d*o��&%�Y��=��4Xֿ�!eT [o%��'�,������=S�ѡ���x��� UUY�� V����2���x�Qݢ�FX)+(c����4�f�99@]�Ȋ��K2 ��|9���Xt㍄�L�>y�_Pl����It�Zٜ�dz�ֱ���y'6X��5k�3-��7��?�m��ŋY�o!&�͘��}���OK�w�FEQX�oG�v�o�$�?y�?�_�o�����<�M��K�+-����ye�&�,X@ѣ�b�V�ݶh��c��F#Ϯ[GVQ]BC[XsC��)?�ۗM��Y����"9<�_ B���Wrג%�KU�>%��QQ,��~��Gl�����k�g{�rۢE<���?'Mb�ɓ<��7�-*���Yw�g��MNN��٬q�y������ �ݐ���}��<+��iiͮ��N��� N��p����֭|�����E��|��E��ɼ��//��_~� <>|8S��xe�xZ���? @�_@Z��9r���w�f��wh0P�p�����:t�1ޡ~k�n����Ç7�/���kJ�N�_w1AA�+,��7\����cǸ�nLM��t���q�㪪��رt ���'yq�FVgg��[��fk���}�8QQ�_Ǎ#*0��� !� �B�3d��#�9���'�8���5�J��� �i�o�>k��_��l�p#��4�W����@:$t����D��8�m/����W���}��]tJ��Л����o�2 41o�Ҷ��O�Ol�Xֿ����ORz��I�5�J�^��1�G��n�-�u������[PYZy�� q�Q�^�M���i�+��%�;$c�ewe%��N_ r��f���T�]�PY�kǎ`�hh�r�74D� u&�1����/���E���q8�SY���*+�]Yɱ��2:�оg�7O�ֲ���/JJ|�i��2����b���h���R�v���Q�K�U��d�8�#F0 �n~g�J&�'F���N Ť�1g��S�~��<7f Ϗ�[;w�q�/��ͫ[������ݿ?P�T�԰���� �JH@�(<�n]��[{��7C���q����X���5]�P�t�����r c����aa��7�M�x`�`��۷�}���P�aa�/.f�޽\���V��U[FX,t����oW����y���ޑ�����5kN���v�w���_T���aF�M>>%) �V˞��6��N�c��f�wd$q��¾�B���~D��*5n7Μ� G�=����y|�p Z-V���M����S*@�Ǣף�h,gfRb"o��� ��CeM�i��M��<2t(C;��U� ����KV�N��(ܱ����C��n'���98�!��e�վ�9��u���n @���B\$ B!�Otb4щѭ^�h62��Q�����ц���3�����<�%�Jذ`w]�h|�x߲�i���z�)�H�6��kO�,H��N���&��-��O�l�}ͭ���$�M �oB���r��3X�g����~��r��d�_x�� JN����;��ğ�X�񰦴��v�/(��348����p@PV�H�Gaz=Wsu��K+�n�9u�����J������{��ό��9AU��n7��v6�������b�00(���@��;0K�c�����6� p�.�=������_ �O>���:vdjR���i0|��ÇY�w/�rr8TR�GUq�ֲ#?�~�?~ߛح��v��LlP�w�ݧ( �:t`�c��`Hǎ ���[7����ؒ�Ǡ��V��Ԥ$�� �V���qM�.�o�~� #��|�$��ө�!�[2�o?뽽s'_gg��� ��� [�������"^ٴ�l��_UU�\.v?NZTT�ϭbϥ��-m ����x7#��G��q�.��Z��e��7��v�� �EE�������}p�P�pf6����\��B�iF9xt�P��+���`Jb"w��K����u�8�������ǎ�`�n�9ž�B<� t�C��ٳ���x ���pP!�%C�G,�B� b���d|���lD���;|��u c�c۱uB�sM�($���F�n7Y��UUdy��WU���P׉6U��A���Z�����w�]�74i/���g(�3�VK?�P��j=9� ����d��A����Ei�<���Q���vwe%nUE��|�b210(��~C�^��N������ d�()��B�?��/�ݻ�$3�'���w�OgFϞ�WW3㣏�IϞ�~�(��ld1����bjT1��hj4��V���i�S�s5m�-�F�`�Ȧ�g���r�rr��ҥ$���ɟׯ?�z<�m?1b7����x�9~u C�Ѱp��0��ǗfeQ�v�*��JX��KU�S^���-���f���$��c���� �S��ק�{�l\۵+�V+o��Ŵ�$���f�]w��9� �M��|��,ڳ�g׭���\����R�GU�y�B�#"xd�P��év��h�O�f+�W�%�9"���&�B!.���Rz���#�8+�XíG�<2�S�3��!���$��r�����J���SYI��A^u��3�L�s���T�UUd;��{��w�}}� �[@� ,.�FC��L���u~�(���[]��8��p����L�����B��T���*p��$��䣂�S�5� �Y��\&���?\�ˊ��m���נ3į���__u�,\ȫ[�0�gO>�̤��b�ĉ���{�N��)7�ʚ_�ئ���L�����ڜ��� �-+;�u��c#��xd�0�}�rr|�ׇcU~��AF#�l6�dg��i��;W Z-����{�}G��q�<�gfb5�=�iQQ�Z������q�ѣ9~�qޡ�V>��ٳ��C�(�n����Ǩ���ך[��8�S�{����;8^QAJ���CO'4 �{ ��x|�*^޴��&-*����{�r{�>�y�?�_ϴ� ��Z��1�ǃ+V���<�n!&�Y���g���|��I|Ho��EVQQ���EEa `����ݿ?��`���ƍc�G��%K�)%�����-,d����1eJ��|l�*���r֬6���q�X�C��o�4f �##9^Q��;v���1���6�� � ���;w�o�%�l�DE�ز�_Ep|Hq!!��u+AF#Ǐ3o���@ӯ{c���h�w22���D���`��zcx��/Y�?cb4|Cq�շ/O�^ͫ[���q��^eM ��\�̞=� !����8�ﰸ�:wfrb"�o�J��p}J e�����羁��`������dg3׮S���>8��K!���\�|�B!�W4�FC��B��­��@�<�Y���γ ��S�v����eEE�@�N�X��kBCJ�i�H�|�`00�fc�_p��xȬ�����ɨ���]�u�O����A����[���/(�a~�a�FC^�&�����Q\��X]Z�T��͋��`�@q17-\HqU}���3-������k'���]�c���ؑ��Mc��o��7EQ ݨ( Ӓ���ϗ.���drb"/��;��r�u7�-��>�{�-�˗̣Æ�ǵk m��oS۹�W/��ە+qyy����yj�H��f��уϳ���D՟?�FC���O�,�xE�\ӥ ��[�����kײ`�n�߰�H�ŷ^����Ӧ��֭�ϟO��h�;c�����>���B!.V �n߾�~���w[�B\f���)Ӕa�1��y�m��!D����<�Ǫ�z�����n�8 ����r�WT����]� 4�������x��ѡ�� �CUB�7UUɩ��U���G���)��[�ֹ ���z=Â�� ��՞�]9�֔�2�[9�Sf^bb��)::����a�����k[Ng�;��[Ӧ]�mg���Wym�$�mbN�+�ƣG����ܐ���'�ws�������5uj{7E���/����J������o��!�h�;vH�B!���UzZ,��X��{�[U��p����m��l)/?���?D9Z]��Ǐ�c���̵6cBC���P\�E!�d"�db�_�\���w~Ն���ɬ����o˹�^�ֲ���%��x��#1�lf���p��JO�M;M:�jŬ���xp�*K���׮-�t\ȡ�ee�#<�oss��m���ו=t��N�X3{6���ˮ��I��j�&����J>��$�� >����n�BqE��� !�B!.kZE!�b!�b�vo�[U�� ��������*+�(4�F�8쯪��\4@�� ��l� ��`L�9���Xu:����`�}.Ue���4�R^�ֲ2*�xnxݮ?7�������V+C�V� f��Jh����7�F���P>/*�M]����n��� 9�b����5k�.-%),��z��^���*)��?���|�;���2�E�K4���t��xu�:6*U!���B!�B�+�VQH�XH�X���\u5 �-+cgy9n�ؒ��<���rvTT�lNE���`�z�~AAh۹�J��t~U�7{����*YUUl)+cKy9�v���ĥ�m���J��5�����q9��0�}շ�CB��C�N cIQP7����t��=�۽ԭ�=��mkfr23���|�sp0��w_�� 7��W��9�;��� �B\�$ B!�BꂑT��T����а��f��Κ�R�*)a��n�r5����R֔����2:$�1��� ����l��I�(�0��a6��j�� o�ᖲ26��r:�* ��S��U���ռ<�L&F��0�{�3��92�f� ��ˋ��#�%C���%4���!�BqI��P!�B!�a�jk�1�f�Y�����C�C�{(w�YZTĒ�"T B�g�����p���0k��oDŽ8KF��AV+��V�j�.W�<�eel)+ccY��@����K;��s��>~�(���!!���IgƙLt �@U���Rj< 2�B����"���d����"���$ Bq~y������5��!�h���i]����j����g��u��������m ��v��,8y���8�QQg�1#"��aa�_�ل8!:ׄ�r�_EW^u�oh�o�v������gؚ�����55|TP���'Q�P��Q����� <�a{����<\����a���(�JB�V��xHٺ���<б#����ɈBqI��P!�y��*h,x�r��ڻ9B�,���RTO놌�^�V˵6��l��K�].6����]m 뗩VU�����O""�.<�x�����P�����GDu��s8|C�����]Y��������Ņ�|VX��h4  !�� jU%�x���ss�ۆ�� !Dm��Yk�e00'6��GGy�Bq�$ Bq� ����B�ѣۻ9BѬ#_�{�z .�1�8;A:�m6��l<ߥ e.���peII�C��Z���m��ί �ba�7,�m�ȼ�⒢QzZ,������bSY��ʖ�2�U��h�t�n�ە_�eq1��( �ZI etHC��&�!!�jUť�,+*��]���]B�˞�?����0��a���ffD���e��*�W��"$�B��F�׃�b&}���n�B4k����������tL cBXe.��ÌV��sdOe%Ogg��h�zoX8,8���W���t��>j<vTT�����v;kKK)s�Qm ��X�����Yo�� `�hH �Z��kBCI1�Q�Fè�P_���������E!Za0p_\�;Fam�/,��*���ɓ���<ر#�DFb�9���!�B!�B\ V���aaL��vo`����%��쯪BC�@�)���ϭ��yy���K�N���p� glh(�'.Q��!V+C�V���y���:oX����c55������8 � IDAT��٨�0B�g�����P�Y�|Y\�{ޗ����V8 !�h�x&!�'���������nGǏ�Bg:ܝ��o�g���Cw��]�-�Z�_!���do��3]�`�˻�����'<ӥ�ݦ��~�wn������,���.]�ټ��nG!.W�:���x�kW������ԭÃ�}�Yk)��|+u��ωL۽ۆ �ؽ��?Nqm�y�!�7���l�pOL �%'�7t(G� ���=�Yt4I~�̺�h=�XeXP[˂'��w/Ofg���K �Ǯ��]��<�L{7����g�z��n����5��Ё�}�������Y���S����ﹹ$n��، ��n��B!� �B� $u�޲�}q��� ����-[�د_��o��T!.6]x�cG��ۗ�a�x�gOfFD�l)�� �K ��w/6��s'�����y��A� ����͑������A�(6���z�N��;W���Κ�f�� �c��fSYY�s�����h�y�w32����KK�<� ksr��:���Ν��?�������^b��Ò}���vO����)5��?�����l4�<���B7�ɀ��t�-���ȉa��gb"=�?��)���{uI Sw�&~�&^8r�B�A�B\p2ĨBq��FtFc�6���:�N�H l�v !ĕBB!����ֱ���8����d"u�$zO�NdϞ�e>{�a�yy �5����FEa!}f�`���u������=�49[�Pe��u�pR�L��رh��Ox��C���$/#�^O���\��FD�����W���_)�ϧS�~ ����|3w,X@���l_������ݹ��Dtr27��&:��]�|��Ge�CmZ�3]�0��8�g{W��I�[o�ό������J�a��s��o)?~����ϙC������S����F�h�1�Z��ŏ>��G���3��� g�}!��\�5F��2:4��v����%EE,*(`[y9*�60���ͨ�d���$�C>xN���]��l�^�x#���ỿot4����K�%%12>�w��;>����ճg�#?�'�������Oz���^�ֹ��9O�Y�;�{�u���+9XR� ))<0h���(t8��5���w��ŋ�̝˶c��}<��|z|<�>�����|����v�eeq݇���C��r<�].���V:��' 7��>%��ƍ�-��w�����da�j����w��5��?��콇L1b��wK��Z�Vʏ-J[5:P�Zf��ѢF��R$F(����=nr$��H"�B}߯W^r�}�s��qsr���>.l��}�2��1.��`��C�z�ܠ ���|*3^?����Ç �����!�tq)��� �����47gav6?FE�mX�����<��u11������9�\]y�� ��f !�xH�P!�!'#�&��P�鉉l�Ȫ���t�L��^��˜^����ǃB��/� =>��g���¦fM|G�@�Ȉ�c��>y2��<�^z��}��沪_?����5o�����6���7�����G���K��5��Ǐ�}ʔbw���{� z̞�K�Nvz:���H��͟O�^��t)AǏ�m�$���q������X{}��������Sh�ȢE���7���Uޘ<׹3]�Mcϧ�jK�������Y�(X����1S\]���fg\�ccٓ�@f^^�����}�:�o��E++�98�5z2�C���Tt�����%�=p���5��Ԕ)0n�.� �����F���98����x��_95j.���TXP�ښ|֡����3g�^�v��A��u.��{wfܾq�U�������f��;}yx�W��-3A��OzB����b�m�Z,�ޝ��̫U��������w�b�5";-�cK�h� ��ښz=z�*���P� ���Y��ӓ�?��z�8�i׏�&+:~E����7�}X8;{��� �5ʌ�"�5&� �,�B�?;==�;:2�ё̼<'$�=6��cc��ɩ��B�F���x���a�R1�ޞ!435�ϖQ�6K]]z�����j�"<+�� |Ht�u����-M�$���4.���ip0V::������ ],-1+����2���@G]� ;c� m������h��mK�j��ae�}ݶ�s�b}ڛ��a�6�ǵ���ϖ+W�J��W����-L:Y�3N ='�y�?��7�E ��;99��bS�+��UJ%���@�{P���8��v�P)��''��� v P�q� ���/Ԭ ���- ����eڑ#�^�>K�w�nS�� Pl&��4vtd�k ��YRE�+#'���t�c��e�/�*�B[:0#�%,�� -7W������kט�8''�99Q����B��I !�x"�DG����y�"�99�dfr�Сb .//mr�a�QQ�DGcZP�&�߸u�!�O�O�Z����i�v�¥qcmr��n]L����k-F�����x�jUl��ZK���ڕ�+W2�ysj�o�W����С� ���s�;{�X����Uz��j9z4�g����-��ԉF���C�fC��lȐR���ʎ�B�c�T��ښn��|_�6���((E�OZ �gɔ���-�����˲�H������#do�����aN�� qp�vN���"SS.���������;e��-L�ǫլ��aUt4: ����im�K��Ԯ�S�������+��J ggz>�C6�&���S@�n���n�����+5�׭�RE���,��� �ݧ!?�ZI��,;s��!!������C�Z���׋%�������l��Hvn.QQ�t�0oo>>t�?�]�eOOV�=���]���>>�޸���|C���ػ��kqqd��зn�2��HI�ǀ� �Ld$ٹ�d�����2�/c==ں���h�����|U����Y���PnefjorJ���ː憆2�Ύ�e�B!�x(�n�B�'�� ��c ��a�U�޹+77��Ӌ��/q筲�N��Ҙ����2;OOz̚��?��w�����ܷB�(��y�J�)���71a����[�#KKvN����:�"ܳOm�%J)��b�@+:~E54���ǻo_�����}{� �?yX*=&B!�BAcSS���s�iSB[���ڵ�di�����Ό ��䓛7q;y�v���"���!�k�ZYi�� MMMIl��ƍ��Ãv����s�S��!�Fß��L �9��<�{7np0!�켲�&V\eo���cG�y��k���%\.d����ns48��;v��Ύe=z0z4�}}I�ξ����Y%#zpulm�u�:ٹwϕMJ�tD���XS*�����bc��� N����'���ǹѣi��v�1�L<� �����Xү^=��=�F�ae@�7.w_ggBƏgN���NK�ݪU�۴ ����'����E�4lȞ�97z45��J}� Ut�l���,S*��J�[NN6o��z�h]p��BA.���룣it�4�����,���䷲B�*���Ʌm�h9z4 z�ƩaC�h��y��}�ݰ�f�h��x�n���;��N�;c�N�n�����}.��I��֖%�ݩAǏ�.�رR�sk֌>��������={JmW�>�S��+1���48��?����\�������Ƥ�Ĩ:+��W!������V�} ٲ%_׬I�����V�)��},)��W�`��� �t�}���Y�B�W�52¦��D�Fþ�T M�̘���aoo�۴�`ÆLrq����6�RV�& w�������p:�?��c��x��"#�.'�Rsҋ�C��j���ߢ�F��eOO�-�f���>%�\~�,m�ܘԪ�=<�ie���� U�0-H����a��Mjv6��_��M�.���C�\3''�DFjg��� ,�݊����0�Q#Z��`gl̉��J�V��/\?��v�k҄=7n���i�RSy�Q�{�WW��oݺ��Ӈ�^}�����Ф$jY[c���o�RRFN�.\���-ԠM��А?�<k��(�T(�acÑF�8פ ����Q(��),hs,)��.P�Ϗ%��r��B��I�Q!�UN���� 9��o�ԨArD'�3��f�݋{��6�K�va��̹M���y�ܲC�͛cdi���#i=v,Y))��{�5¼`}��:ub�̙l~�]� J��ߝ�_�ő�7�FC�� Q��ru�~P(�ޢE���H�Q��+x���Ɓ/��N�nX89�ƍ#G�վ�����՜��g�8P�XJ�ט����P*9�e �u�1zUXzK!�vzz�������\OO痘VGEq+3����j� Y ��İ.&;]]�:80���z\M�'�B����%�ݾ�Z��FFQ��8�)f�T��Ғ������ 6'�}��쌋cg\I�H˺T]��+=/O�^(@#Rss���Z��Yq�,~aa԰��L_��u� �dz��Yz֮M5SS����Wp0�4kv�����y�:]j��L_##:��3n�.6]����?�;ǵ��rϯ Y����͗/S��=�2K��~�2<ȡ�C�V�zFy�z{���U�n���:���u^;�_�˿�fi��4srҶ�V-�;u�V..T35�k??�U�b�cۻ��ۥK�sw'K�f�ɓ��Y^�A����+CC�_�ț>>��b^Pֹ�� ��yo�^z>���(���C4qt���-)�٬:w�zvv��Ěپ=SBW�d��7F�� bL�&����ɉ�Ν��Ɔ��d�<���A�����K��441�'OO�xx�$"�o�ˆW���%�E�)|�ٙqժ�(� !D�H�P!��O>��KY7|8����3�Sk�K�)�RgE�^�߳'qAA�;�<��ڝ:�q�Dv~�q��(�J�m����?gۤI(utp��兩S�m̝��t)���g���87jD� ����ڵ -,8�|9�����ysz/X���c���H�e)9�?�����l�<��۷��U �V�h9z��}zbb�fq��{���{�����>�������'4�Ӈ��ν�>�B<<�������t77�SR�%:����$��e& �ޏ��aAh(_��R�ؘ�� ��þ��} �$�di�����#�����+����.����=� �RR����X�)(s_V°�s�����u�����0oo��;7��YիC6,����7���y3�4rp`��7o7o�m3�E �8A�KI��&w�4ԯ�ո8�8�:/��k�Eǎ�ٹ�X�e�(��}{�;u ����ؘ�w�-�]RV����<�~��) �U����_WP�~ǀ�T�v���6�i::�լ��&2�m[�8z��~� �4i���i�6e�i.9e�vJ����ta����>v�V..:T���>>�ݹ��>>� C�9­�D쌍�X�:�z�Ҿ�~���k��c==Z��0�`\��s���׭��Ғ)�Z���SŎU�P{� �%DE���1�ݝɮ�l��᫐.��[�pNp0_���z�:� �:� ,`�ܹddd<�>��Q144d��ɼ��{�S�3g���5̅B��rtt$J��������'U�Cwp�\�/_����ڬ�Gѧ���}�i;w�PY��Ϫ��<$$�st4��ƒ��WB��_��b��=ml0����S�fF~~@��W#X��s��WdV{ f'-/���;���[|<Ì��1q���3/:5�.?�����Ƣ`6��ꣃ�t���~��CBkƼy�JK#���JΟ5 G�ʮ�x��9O)��mgn�$WW�YY��D���888� O�lj�Y� ���DEE����ٳ2�P!���+V�֬:��\޻��7ҰO�J�=�>�B���T��ښn�֤��56����؟��mSZzCS�/>����T ��c����]�B�B���D�b��=�����fcL ���HM�g����\VFE�42������L/t�.~!���X�Z��Vf&�YY8=��V�J%�-,hoa��5��dw|<��r01���(�Y��s�xk��2_?��x�S*����А�m�Vu�� �ÈF��S�NU�#�����k��3VDF�04���l��LA�����5��3㜜��ս�}��3�)/x!�x�挛CVbV��J�P!����_~�T�)�B<*�zz����;��\KOg]L �"# ��*{�‚�N$%q,) ==�rrb��#v�V�xBu����"%�'&2���������1ժ1�Z52���31�>P��O�:�qs+�u3���[T�#ÆUuBM����+1�FC�Z��ѣ|R�� !ģ%%F�B!�B<�J%/Z[�5)j5k���&<�+�饖 -||.5���/����urbt�j8?�zoB<���XI�FCXV����=�Rt� �))�e_Bq?RK)+�$s30`a�ZLsw燈懆�V�[p�ؓ�@SS�vr"%7�)AA���Z�U�l��B!�B���TG��991�Z5�NN��p6ݾM�FC�y�����jf3+8��66���Lss��,�Q�hi���LJ�������L������~�&��ʰ��$K]]>rs�}~��bNHA���;Ϧ�0��m�a�/S�Ȩj�B�GL�B!�B!�BAkssZ���(;����|Ndv6*�MX����X6��W-�� IDATR�Ȉ��� ���H�P�Q����y�P�R���1z��G�/!�xK��%)=���w��Rɨj�x�ё�qq��?%���j��.TI�B�I�P!�B!�ca���Gnn|��ʮ�8��s !��D�������y�y�Z5�V�����6_A<��uu�gl�Ŵ4����4�c�ѪR�ptt|��B���zJ�%) z����Ɔ���x��uΤ�j_�³�P�偲���בUG�s͟e�n`l���cD��q&�����*�F��˥ݻɻG�ؠ ֍�W>>,��e��z�v�6W���n���ۛu#F���L����mά_�σ3�^=�j҄�C���ʿϰ���s��g7l`���,lՊ�}�pn��b0*2~%E^��/Ç3�iS�5m��O>!���bm �r�>>8;;��G�}=11������}��e��ͨ��;������W�8f��MbXG�ƶfM��.>>l�2�������1��{3z�N��3�:u*s��С��Q����R<�veۤI��=[��+*+- ��^b�u \� }ccV��Wb4-.���fѸ��gv�k�P(��t �5kh3v,cv�����}z�n���7�Ǚu�ݱ#���d$&�m�$\�6�͛��4|�b��nͶI��<��8�b���t�6�q���s�\� J��Y��ƍ�׽;�����s���?!��O�P��ʊm����ˇnnX�f/�,�%�䆘�N���ŋ�KM}�!�����*xr�!�?>�F���LJ}��q��!ڵk���p��y���{fΜ�ҥKٲeK�R�YYYԭ[�-[�p��i:t���#�������ȑ#i׮{����ؘ=z����}]�P��w��ڵky뭷�2e [�lѶٺu+��� �{��ȑ# :�3f0k֬�:6��5k�dϞ=4hЀ>}�^d�� &�o�>�M��������;����+��͛3k�,ƌÍ7HII��^�_�~ -��}abﯿ�z(�Z����_����ĉ���"** g�/( !�(�B�(�E)���l�h?�=f�f4}�)N�N���r!���7��[l�s]g��:���;��Or1�����R�l��>�;�u��7������^���eL���\�������Lͼ��RbT!������[�^^\;t���ǩٶ�����z͟����o���*��&���;�N_�ߺŕ�{�z�R���OzB�����Z�Xڽ;I�W�Ƶ�1������87jDvZǖ,�����5�z�@�� �C�:esE�,d���� �c�z�ߴ��G����S��+ʽysh�\���ˋ��G��?M^]�|Nf&]>���-[j��h4d���{�|,]]+է����X��v�ǣT�H���Ɵ2`� ��\!O���k�aha�EY��cjo_��VHX@�[��z�X�Xb`f�JW�Қ6B!>�^�O���˂�P�RR�*?Z������X�YY�- ~� QQ-���Q(Pk4(�_�pL�jUSvv6ӦM���_gI�s�z��k���Ě5kprʿHy��%��������|���ǵk�����lٲ�W_}�X_d„ ̛7��k���_ѹsg ����ʊ�+W� ��۷�k�.^/8�2e ��'N�A�h4�O��̙3��t�҅3fP�~}�/_��ݻ9r$yyyl߾��3g��o���s�:��u„ >|�~��Q�fMT*?��C������C*}_��bee�J����䡖bB�g�wWo^���{��V��]�C�  )& ������ ��X{�眴��)�uP�I� ��627®���{== �wtVZ&�/U-��$A(�≐M�����O�ŋ��䐓���C��%�����A�O@%GE��M���N� ��i����S�Q$�Jsi�.\7�&����ޞK�v�b�H�<�G���ګ�jU,�W�kWN�\���ͩվ=^ݻS�C�2O�*�g�� .�h��^=�ϝ������̙ ��'��yr22Pggs�Сb B=##ܚ5�k{kw�b�����ݷ/����ڡCxv��ٍ1sp�f�v�5o����ڴ�f۶��ڕ:]�j��C֮-��*���l�8���s�:�ݷ/V��ܯB��CO��5;;^���hb"_�7!A��)T8�~_|<���ign�tww�[X��\�B U*|��8��D.p� X��ڵkdddзo�r�5j�H�hܸ1���DDDP� ���O?q��!���on߾�Z�F��s�={j�������m�P�PУG�b�4nܘ 6���Ƶk�X�h� n������;woo�J�D�ƪR�hذ!~~~�9???���y�� v������jW&�5k�����ŋ����g�iӦ\�t�'��}B�xD\�(��ڝ��v�כ,�Ys3�FCĵj�� ��Y�X9Yi� <X�s]�⿿J9���B!��,��4�Ӈ��V1z�N����NO/�N�ظ�c�*��Xa)�`vL����'=f�b��;b��A�P(���W��y�J�)yb�ob˜ݻ�d F���:��:�u E:�g�ھMM��S*������z5'W����d �w�ĭiӻ�1��D�s�=E�E�����ܜzݻsv�4 ��J�������_~a�ƍXW�Α� Yز�]�>(�.]x��IZ�����Y���=���C!����‚= Ф �mlJ]��pvᱤ$:�?��ٳ슋+�@���XZj���j.�s��8T49iZ�RUp�\���ѣG9r$ 4`ٲe0~�xRK)�kffvW_����kSX�t�ԩ�?^���?�p��u<==+tLQ2�RInnn���,�L��ϟ'� i�Ў��*�!�x}�jW�>�s���q#>Ҩ�|TVj*�g��ܨQ�v\�Պ��d�@V����_~!��m���]}9ԭ�Cݺtx�}�i������oW,� �54�a�>4�Ӈ3�׳����8a*==�ML���x��B�hy���722��OQQh4�b�G �?���K.P�ؘ������A)3 E:ZZ2��-��:�^%n\{�jժ���1���]�v��~�/_N۶m�Tdm�G�>�ّ���ԬY�#G���G���a�h͛7��Ύ}��iK�&%%���G�6m*��۷4h��.fff�������Z��FU233#���B�4;��������w׽[챹�9��GV)���+��Y�퇷�� bn�r1��o�,�֮��w��˜{�������qf��������|�����9s&S�NEWW��Çcddā3f ����C��7�M�6����O?�ĵk�*t!�d��l3�|����o�A���quu�ʕ+�ܹ�e˖U����h4�>�J%={���O?E�V����_|���Y���+V�FÐ!CprrbΜ9�T*���O����ѣG��5K���gȐ!����4m���g�ձcG>̕+W������Z�+ !Ľ|L��yY�ꍫӠs�\�'сјٙ���F��r�����.������\9z���x ���gOZ�m�J����b�a�ѵG��IbT" �kk\��O�p c��}Q��%����'���ҥ�>KWWZ�é5k�%��Ov�>�)z�S�gO₂80w.yj5�;u��ĉ����2�Q(� ۰���ζI�P������ S�jۘ;9�o�R͟Ϻ��qnԈ&�����kZXpb�r�ϙ��G���^�3G�R�[�>�Rr,�g�ھ�G�����z [[���:�vv$���Q�c^��곀π���| (����9��Vq��������iS^��s�6ԶI ������~�)�QQX8;S�E ���}�����|��#G�ɰ��qk޼�} !�x�T��竚5��͍��ÙJrnn��� ��722|�21�͍!�+eU�OO����9�%&���T�������k֮]���1�Z�bܸq@��Pi�>7`��^�ʔ)SP��t�ޝ/���1cƔ�MYϕզ��=z�`���|�駼���deeQ�F zT�(/��O , ;;��ӧciiɨQ�puu%88�±Λ7�'N�N�Md��� ���L�:��e��OOO����d�G���kQ�F�"::�v���͛7���B�$j?�=퇶�g��Ȅb��7�N�����FGO��Z�z@� �b�bM�{��f���>?t�� �C<���̙34nܸ�cB����H�F��K/1�O�:����ܹ_����ϣgd�����:��W\ڽ����P�`�g���s' ���U��I��eEd$sBB�������D����uu��͍����1H<[憄�aP�6�Ф �&&u��΄�����D�C^Y!�g����ܜde2�����ݔ�G}(��(�|�e&'r���W����:!��c��w�� ����������ƅ ���߸��|B�Z���O������8��P^s!�B<#���xZI�Q!���n_�Ή+�JM�f�v��=�Z:�6��&1׮���W�ӵkU�#����T2�ё!l���[�8����;kB~�0A�棠 �f�� �9;c*k�>���`�R����Sr0!��\\�_�������y�����*���B�8�{��Y�S����U#�BTP�/�|*�|� ۰��CB!P)�bkK$$�yp0%%ݕ(�Rrs�y�_���y��ttDW�(|�� :ZX�G\y��II�j4�d��#�R����|��kv !�B��I�P!�B!�3M�P��ʊ.VV�%'�Ep0;���Q(Pk�R�īՌ�~�y��̭Q�>66RV���Ғqq���r!-���C(������B!���vG!�B!��@s33�ׯ�ŦM�og�P���ff&}����g�r41�q�)�Hss�:� �襤� G!�B��& B!�B!��/cc~�S�@__ެV �K�&�Φ����9z\��崴*�T�S�y� YY�=N�x�(�43CA�{���B!�O)I !�B!��P�А ^^��񡃥%P���Z�A������I�޼I�Z]%��G�����bJDv6�B!�O!I !�B!���Ԕ} r�ۛF&&@�?�s�,�������<�7aad��UI���hmn��9 ��B!�x:�ܻ�B!�B!�joa���[cc� (�(��6a��V3�� 懆2�F ^��E�PTa��ahff����XG���$^���간B`zP�����m�2l�zܚ7�U�['O�����(�NN��Oe��a�/��Q� ����ϋB<� �mm�acÚ�(>�y���lm����YY��t�9&&,�QC[�T<��U*�����Z��OY�P!�����0Oˌ\�.Uu8BQ&��\� �H�B!��f�@#���ף�ڷ�� ��j՘��y��Wu�T!�: #`g�w|v������& /�����y^���5�_P�T<}�[Xp1-��� ii���b�R�{C!�O%L���ԡe��G!�t��yv�I10�g[I !�x"����&/M^J�⿺rsrP��x �u�fgWu�):�����Wmͽ�<��R����#݇B��g�R1�Ņ���|���P��v���&&���i����Y��T��w�dimn�°0 �Ԩr2efh�6l���>|��CB����`��π�ݫ8!�(��+W@��~n�Gy�B!�c�u�DV�}|d�"�nӆ�'N�c߾���"�܃� 1 IDAT9m��;v��gOf׫GjL �,͟Ϸ�:�U�&�6���)����@V�� X٧Aǎ��uk�|���M��Ec)Kfr2���>�Z�fv���:v,�v�&O�ֶ�u�$3=<9u�uo���ƍ9�|�]}���l�<��痿�2;�N =>���}�ݺ�E�:|ӮǗ-Ӷ��};+���Koo��ԉ#�\��U���m�$N��#�u��–-94ow�`y�^|ݦ Ǘ/''3�^�6�Xi�#�ݕЬ����Ν�:m���X�3#���q���ڵ�Ҽ9� f���� dk4|���, %KJ�?���p/������a��С�7o���ggg>��#"##�m���-[i�!3%����c�� @X@���wc[�v�=G��?�l�J���&��UBC�j�ի`dm�/Æ=p�&���;V���Ã�[���w/^/�T�m���i3n��q�Yru�ve�g���֭44�3���԰!u�h��z˖To� g�b}4z�U��Vnn�{z��ukb���)������g�"�::�4n�� �g�6�?q[[.��E�_���+��r23y����Q0���Օ�v%60�5��S?��B��׼y�tu���d��/����5k��0�������qc�SR8�b���������ף����1)͵�1������87jDvZǖ,�����'��1���q~�&�9�����?�mk 8zyq��!���f۶��?, ��o������ddeU�xUƽƤ�t��%B��U�А_��8�����LLDŝ��y@Rn.Y��ڵy�ʪ #��‚���Qk4OJ"W�A���ޟ?�����3g�P(�0a���,+�.���Eݺuy��011a����1�+V�j�sF�����3�O>��ɓ'��k�Q�F ڴi������k���͛7��ͥcǎ���0�|\]]Y�jM�4!::cc�Rc�u����O :��Ǻj�*֭[Dze����$""�K�.0g�bcc c˖-����7.^���]��z�j�+���Bܯa[������q�G�°�ﶧMzN��ٻ�������s��4"!��"b� �ڻt�Qm�.��-Z����Zj���Z�c'�� A�Yd�������d���u]��s�Ϻ?�I��s?��0i�>��?ϙ�d*������������q�H��éݮ>�{c��ݞr��aa\���Fl,��|Tyy��ڥ� tk�RgMǪ���j��m1�������R��K�l�N�^�cbH�y�6�i���&v�� ���qk�Rg{�V�t������E����{@�:wƽM�R�4�۹�-t�\[�(1AX;0P罃�WO�оO�q��k�p)"��11���{�>q�v�� l��l�<���P<ڵ�a�>XT����$(�&AA%[^��'B!*V# v�����F�?�� �>>=N�Ph��B�}�y3ˢ�PN�@H��y{�2c�||�8��� �U�0��12rr��fR۶����C�����G~~|��3�p[|<߆�{�~�� ������3I�篿������?�^���Z���rv&='�7m��� v���IH��ҥ$|�5 ��,z�+O�bVDg5��yyѿAj��P�?~ժ�Kd$���Ұ!����66f��� ޸Q������[7�Y��jK��7�ukrU*V����':�;j�v6�;��B՟ �p�?8������N ++ƾ� �hJX�������>6���T�MMy�A&�m ��#G9q��۷q���M//ޮ_�"�% {��jX�* ���KI���q�tſ�$�B�|�$}�yy����ͳg�߭[��� dWp0)/jg^�� /'Gg?Goo���贝ݱ��db��U�pn҄￯m��س�l�W�f�V[����X�{��@��M�{�ĻgO��\ɶᆪ��CZRb�ʕ���pa�~�5 �T^N�""�%Fo�;G����f�p����_�g`��Vba�٧)/Z�|xx��:7i�s�&�Ap���n݊wϞ���h׎�s��]ؿ���WT����ڸ�N�&i׍���@�ŋ��ZE>s++��6��~��S�rxѢ�� ,PZ�$`�ї�B�BQ(��T�n���$%�Յ ����&�{*�Οg��������G�q%�-���I��C �{�a��uσE���zzz�5���ǐ!C�2e  ��ŅE���?�y����Vp���|���9p�@��&&&Ozk�4mڔ˗/�q�F6l�@�֭y���Y�z�v�Ҿ;>��E��5%0��,����KͿ�J*��ٳd�沸kW�^��g۶���ƍ� &�kǵ�t>ڲ{SShEl8s�wBC���N���y� {�r&%��eT-�a{/]z�2�9���8u������`aoԭ�g���s��JR�����1��W��;���ӧ����- ��?ϝ#��}~�ؑ���|��_��1��B�ڵ����|�u+I#G`R(AZp��~~���duL G5�m� I��b����p�v�jK9����8�8�󎒌ݵ���� �ޝj�MN&���}֮�صk|��K_//�޿�qM�x0���W_��� �n�$��Av'$�魷J�fy� ���g����O��F�����[cc��9�v-�5k�v��/��Ҳxj��df�����kGGR�߳�B�X�X������cG�c)�a}�Ҵ) ����Pjbhf&3 ����P0���7*UbbB3Q�������,Z�8AP�*L�Y��O�D�x2 ���VV���B>�75��C*f���jՊQ�Fi�����Tʑ���2}�tnܸA�Bk�?K��ݛ޽{�}�vڷoOpp0իW��ʊ�2�;!��`nh���>zzT.e-����jV�쉾RI���YŊ�'����T�$x֞>Ͷ�� �/w��Fj~�6�R�Z��={�LV����#�q��B�JE�:uJ�ޥvm ��MN~��*�IM[[T����MN���l�Z�&'?�ս{c�����6��1�W0���&_K����`f`��R������<<��M��ƒ��Sf��pb"��7�y�������e6�;Dz=�3 �����?m�T���ƆVV4]����l����͍6���O?���R��g�d���t)9YYx��_��D���C�~׮�\���D���G�v�9�Mcǖz���=ڶ���kGG*׮]l��o�%-) k''\�5����R*���^��eo�M%wwڏ��h����ľ-���Ύ�/�d�ԩܾt�j �{��R���̌!6�+8����։1��ǹIm�XK�-X���SY1h���t�������<&��Z���S������ߟ?��3+��u��;o��M���԰!m���}�1&�J���h_���k̛�� ¦F Z J�e:�>F�����4~�� 2nݢ��;n-Z�����g���r�b�q�����'&�ִ=��W�����ٓn?���k !�x�,���V��v����E���[��7n���nn�_�z��l�{�ښ?RR���õ�l��@��۴i����Y�n...,Y��s��=�@����c�̙ 2���{��;�����ݻ���g �^�J�v�2e ݻw/��ƎK�ƍ�[�.���,Y�///�kжmۖ� r��j֬���%���O�^��Y tsC�Pq�U1���& �Vi*e��p.%��3;"B��Z��^^'���)�,K���k���/�k�� �s)),��f���D߸A�JE�JŦ�8��׫nn�� @��U���� ָ1�W�"%+ ;SS�;F�z��.Rũ��͛3j�v�EG��ÃA RM3��DR�zzt-�9N�c׮�2&���/���J��q�===K<�������$�#��B�B��Su�|�)%��(�_=^��C^)R^�0{77�\�}NvF�..�6cc�D�A�t���3�k�޽���[�^�Ȉ�/� ��/t����O�ڥiS�9�XL�NN%��OK#;#�ƅd:jj�Ƶys\����t�>�����@I}[��P�U+j�jU��K�W3;;�L�\f�m�⡩�_��y<۷dz��c�~.�ti�ҧ;���֚I�/\(v��}���U, Z�C�R��72���� ��maE�����������딿B�b�gf�^Vߺŧqq$);���χqq,�~���kӸ��jij��� U�����]��s�vI�� � ��曜={�/�����<:w�̤I�:th�ǔ�V�R�d�ΝL�8�y��1f�������/sͿ��\Ν;GZZ��nQ��� �|� T�\��m�������߿?��񄄄�TfK !ģ*�o�B�E��z �%���Tir�Z����W�sV{�� ����W*Y����ǹs���kg� ^�/TrS�V�Qdy�a�6����p??j��cf`@� t�S(�f��)�:�~R�k���Ғ%'NЭvm�&$�_3�4���������&46�I���C` ��?�sW�ռ�~=u+UbT��Զ�';/�"�^���/G�^(�$�B�k�ܰ�ʕ��V� �|9v��ڵ�^��<2n�b����֨A�GU-�;�p!�M��odD�mD�^�wϞRfS!� M�PЯre:���ݥK�t� ��3 Nfd���1>�V����b#��+DCss� ��j� ܽ���K�,)�@~����3e��L����{��l=��ťX���CYsss�N���R���ť�y�cܸq�7���fff�RdMk���� �O���1Y�Xr��,���ek˞��<�g�zz�ݠ+N�$9+��:�kO�����Z�>U�b��DZ��q�����+�*}��v_���h�����ҳ�9��bv^F���:,�����[�]�P���/ ��H�Ƞ^���ҡe�11ah�� mܘ1;w2��a>��ǧjUr���x� �����'!��۷�޿?ΚҤ ��ʼ���/!�R>|!���~Z���8����1$, ����sx��Qf�lɭ�8:O���x.����V\���E�zq��Y�L�L�￯谄B�r����ǚ59���+��H��yP~t��k�P�� pqA�P�4:�d�2 ���+733�ǭ�L�d��� �����|��[��2sr�y3�/^�;�x�-��tpw�E�t����;��g�o��pb"s##h\�f���x� 'o�`֑#��l+z�Ϣ��(Jf !���hD�����L��"}Q��,拤�?TtB!��43c��7�n���xn���M��c��3̻v�y�k�efV���봶��PZyj5'32���Ǵ�zIB!�]����C��0�o�&�{w���K\_������-Yڥvm���Ϸ{��Vh(�yyԴ��G�:eƕ����;w�~lML89t(���cʁ�޺EVn.��Ɯ6 G�@��t�Ȭ��X�7~|�UlؠݮT(XԵ+��ݲeԭT��ڷ�٧��(h/��v�Xt�8n�D��7��u+v�wժ�jт/w� ��M&�M��؛�ҽN����;IԭT�@77FZ�em�>|�ʘ�8@33�y-��Xҭs"#  ������ל9�����eQ�cǎѨQ���E!�?���Ij5f�:1��+:!�(U�wߑ�iU �_�^��!D�2�󙔐@pb"j�Z��f~���xWW�%I�\l�}�'Oj����!@3��Q999q��UILL���� IDAT|Z! !�S�o�}����QR�̘0rdE�S�^�B����7��c^���k�hu+Uba׮�OlBp0!��dW�Z�󍨨()1*�B!�B�,����\�&1~~�$TᲣ*��Dj>̺[����s���R���ޭ�p�B�g�y���0�j��HJ��pۭ�L�FF}�*:!�;)1*�B!�B�dj����ۛ��d>��#�P�Qp37�>�M�� s��q75��p�Ѭ���45�tV*`_j*8;WtXB!�3�]�*�U�VtO�Jp05mm��C���J��@�B!�B!�KH�PгR%^��志.�Õ+���ܓ�J��H�Ԩ��5j`"eG��666�ݻG�Z���4Tj5J��$�B��T��WtBT()1*�B!�B��L����͍�~~�+Rv4O�&O��K����۷+.���VV�jʹ���s:+��#B!��l� B!�B!��MM�Ҡ��p42���H�����'r� iyy�?RK++�k��B!�x�I�P!�B!���P(t���\�&�sv�@����h��K�����`ם;�?���� �S($A(�B!^x� B!�B!�aL�����Jl�&�nk ��Q���C��h��;Gf~~���O`m�ʺ�IM��&L����k�\�����T�5p�@ڴi�T�%�B!��B��hْ=3gj߇����ѣ+0"!�B�S�41�� X_�6���f�z�u#"�WA ���VV�~����͜� �C�P<|��`Æ �,����ЄB�ճR%���ӧre@w6abv6�O����x��l����� u������Z�~�N�Pvv6���XXX<�sZXX`mm�T���+�?!�B�gM�B!D ���kcKK���阊~�#�B�����+��%�� �"� ����D�GFr$-��|y�35�H�R_�x� ���\F����#���|���T�b�EFF���=-Z�`�����… :��������~�n��>�|� ������ gggƎ�����„ 7nx{{�g�� ]�|9������ҳgOn޼ ��u�%I�J%J�R����!!!���`aa���?����w�c֯_���/NNN�3��ׯ?v��%99�#FРALMM�Y�&���t�ܙ��p�.]�����p��Ο?�aÆ���J׮]�I|B!�EI�P!� �dX�v�oo� ��;PiF��1�-[;�h{ƭ[����-�ݦ {g���ի�� �3�͍+QQ�2�����6��Ç���iߞԫW�;s&�ܘ��=Ǿ9sXҷ/��[�i�����'��~��8j������f�ȑLoт����kǎ�߷��֫��Q����Ʒ5k>���B����ޞs���+a6a���4������.!�$Jg�T����V?�Dkpp0�-��?dŊ������?� t;z�(-[��e˖l۶�ѣG�p�B>��#�>cǎ�ҥK������3c� lll������… y�78v�k֬�z���� ��ٳgs��E�.]J���EѪ'N�`���|���̘1�S�N@׮]�1cIII$%%�(-|�M�6��вeKv��M׮]�0a ,й^tt4s��a�ĉ̛7���PƏ_f��ٳG'�W^ӦM#<<��3g��ŋqrr`Ŋ4k֌�}�j�Y�f�cǍ�R�$,,�ٳg?�u�/� {�����=���T�'~�RE�����+:�Ǧ�8�e���x��+:!�������W^��#\�6�JT�C�Q�hا޽z>{6 ��Ҵ)�`]th(�={�����nݨ��G�)S027'b�RB���SM���_~�O�>|��/f�!���B�АA�W�k�Nxu�L�����֖��p�ϝK�iӨ��ɽ�T�DEiϙ����V��6u*>�z��� z���o�sq��ܹ[Yq��9 ���4<�`??^?�N����B�gk`�ou��F�ʼ{�,wrs� ��p� a�ɬ�[ߧT&�ߠ��Q�j�j���U� cذa��|���T�REg�q��ѫW/&L����/���t�Ёy��all��Ç5j͛7�,��~6m�IJe�x�w�������j�sssV�X�И�޽�o�����vvv��ٓ��t,,,�����&y]X�فk֬�S�N����4nܘ��,V�^��￯s�e˖�����ӧ�5kV�1���Q�NLMMz?�>|�v��ig::;;k�YYYahh���I��V�N~��G�����W�u�1�A>>�жհ�"i�Hl4�^d����ݻ��2��ܡ��%~��|ߦ խ�*,� {��4:���~�Ӿ�_?� ���a���e���;D!�Mf !��p����>��#hDe|���/(�S6`S�:5���^�^{��R�������Q(�t��+��԰!]&O�~Z�""t�Y�[7���^^�6f 9YY�}L��Q*���afo���= ��Ĩ(*ժE��^æzu�կ��/zJ}}�k��X�`�q�޿ύ�X�u�L� �uv�Ϋ�R��3;;�-,�� !�B<�����m҄�4����j ��=�;���ɑل��gaA�&�u'/���h=�k׮q��1^{�5���^{M'�EXX��^�u233ٺu+�G�f���4mڔI�&q��5��'N���а̲� ���_�\qרQC��eH�J%[�l)��999���t*2X�cǎ���s��-m[Æ ��A�F�q��U�{,��ϏӧOӸq�r���g��`�4h�رc���/��:tx�k !^NOc��켼r�[��BAe33 ��J8��q.%�_~��իLjۖ�C�ݡIx͝ˁ˗+:�b����02��0*ԣ�|��� BQ�n'$���ɶ��I�����|�ss�w�.&VVx����o���w�a`l̉����M�\��!��M~l�P��y���n݊s�&ڶځ���f��X:8p5:�ʘ��Ջ�aa�Ԭm�P�[7� ����Z��۷?Q_���wY3lN�Q;0�^�0���qB!��g�50`��'oT���3g�]d6�w�.����<=����&��4)2P,2=��8K��:�*��A�1r��b��d6l���c��Մ��2i�$~��>���r�~,��{������(2�UO�@<�<��֭W�^eݺu�������������zly�O�r���竝;Y���oԫ�Q��\I��RSq�9�=�J3 Y9q"�v���$����agǶw�a֑#��8A��۸���oׯ�����ל9\JMe�޽Lܻ���?� �Z]�����|�6�]�Ln~>�NNLoߞZ��:qm�׏��͎ hP� ��ѽN�g҇��'�&3�llh��ϯ�2�?�:C==BN�`�ƍ����VN�HH��i��}X���Y�}|Xq����|��ːF�0��'��A����r�D&�M�����jcÒn��h�fm�΂��t��� ����NMy�}֮%#'�-o�]b�~��G����ER����Ɔ_}��4��ܽ�q�w�->�Ĵ4--��I>�<��kΜ!!5�F���E?//lLLJ� ���T*���7 ����ʘ��$�BT��u;~�-Κ�r�iD��Ё-&�e �����-[x�믵��U**{x�Ɯ9�����J�RGil�W��={�߻�3۶����uv�]�:+OK����w�!�?8�e ��M�Ǵix�sd�B!���lg��&M��7P�`����̤ѱcLtqat��?���/;7cc,��H��G_� 2-�ޕ*=��T�V ___���/4���j5۷o���L�_�F�رcsJ�~\��� C�e�С�3��ӧ������CNN7n���O��+W8w�v�={P�T�t%F���1*e���!]�t��?���w�նoڴ�֭[S��wy���DPP���gĈ|���biiIVVV��&�x~�d���l֌6��<Ȟ��� )�_�q�vѧ^=������x�;��W_��� �n�$��Av'$�魷4�_���#5%��MM�|�n��w[���<�_}K##��?!!\1Bg��'[�2�ۛ�͛��ɓ�\��+#F�XF��� �#�ټp�{x�׷ę�}����ݻ9t� � ��~���<�u�Kd$]k��=8����� [ު_��~~���duL G5%�� ���֔�@���HLK#�o_,��p���%K��}[�������gϲFS�$�7o��Ύо}�16&��M��B�JE�ҥd�����/����Zz:�RS����3�S'�,-��ܷ��[���c�'���^�K�w��%(]+tI�P!D��ws��Ԕ+G���v���9����IȩU*�*-���ř��B��K�'���ܜ�{���+ �p�����s�v\��Й��4XT�B�!Ch6d��}FIJe����9���?�� !�B���M8��R �&T�w�"��n����B�(�B����%���!O��pZ�3�V��� ��‚֭[3}�t���tf�M�2��M�ҧO�~�m������g���L�>�B��ѣ�ݻ7���$$$�e�m®E�t�ܙ/��� .ЧO���8~�8Æ J��V��m���"((�q�Ƒ��ʷ�~K�6m�3� J�.]��nݺann���,��oгgO>��# @XXK�,!88���5""��� �/_�_ �K��GѩS'��ݹq�k׮% C̓�m�2}�t���qtt���}}y,'�?Qؙ3 kܘ��Zڷ/UJ��T�9�u��%r>m�T���ƆVV4]����l,���51AO���А�e���x�Ǯ]��С4Дo��D��`�_��+��S}�͍ �A)�+WfAT[��ҨQ��w��~�c5��{�2;���'_��Mlr�#%�g��o��� �4��������96���V���`f`��RYf��b�������~ͫW�K�w?h*[-9q�J��t�]��s���%�� ƵjE�j���I.���!:)��A�h���U�� }v�4?��n����͛�L���� Yѳg��/6�&"�����v�(v��#�FF���cKKn�=���^��+��>�{��2SR�l��B_��$j�*� Fþ}qm֌�[���V�V�u�JR��k��$:D�����`bc�� ��R�*���U*N�]������ -)�eo�M�_P��z0e]K�V���vBQ�V��E�*�\����� ���5kFܮ]�l�#ssL }1B!�x:��q�ߟ��$%�T�n�ӧ���t�҅��D���C�Bl�� ���9v�:?���N�k5k��1���P�V��c׮�2&���/���J�&'?�.��ӳ��^{�4����� ���)�NN�9}Z'AصPKO�ĻJ�\�Zf�pi����Q�ifЕWy�L�PХ�Z��X���ָ1���mۢT(XŻ���]����M��k��99ѵvmx{k˃�HJ���B�,�� =s�}�.q��Tj5Y��D]�N�Rؗ���kʜ���$�B�� ��re-\�ɰ0P(�ws�A�QH.͚a���ͳgi?n��6C33�l����`��+['N����&M��ZU�_y4�׏��dB��#��m>ٻc -Z�� ��pm֌^3gb��R���#��E�32ʼע�R(�i343���K���R�^=|z�ƿP9�f�ǡ �׹39��|s�|��B!�x���,�S�7*UbЙ3$kf��Ռ<�u�ل��X��ߦ��%y��_�*��ݣ���S����ӦMcڴi:�5k����O�ZN%Y�bE��122bҤIL*�Vxa/^,�}���%���,ͨQ�5j�Nے%K��7x�`\�yJ:& ���,+P�}J���?���Z�j,^��X�J�z�k !^>E �)���?=;��c���T�ռ�~=u+UbT��Զ�';/� ���y&��Yc�%���PWS*z}l,�KH��������v��Z��>o)ڗ��gE�SO� �1ﳤ�����3z�v�Μ��ȈK�� iذ��|߶-���*&�u�O3n�.���AOOO E�k��gg�s�zyz�m�6���r.%��W����(��Xd�_�r��B�F���)gT�B�g������Ύ.�'��ݥi�j��ۧ󾒻;�f��i�}�M|�|��s[;91�…R��v�+Wj_�W��s�y|�ƍ�Ѹ�C�#�B�4t��&�<>�ŅfD��Q?2��5k�a�j�d���Ưȃ�ȴ�g� B��fa����?O����Z�f�� :3������w/�23��������r]cOB�o�����XUl?K##�rs���/6I !�B!��\���r�Ii֫)�P�f6�))� ���z@�Z͡���煰d�v��U�a!�37�ys5l�ϑ��[�kk>j�D�ܤ��>��#=;�����΋�ߥK�RX��[7bo�" $��g��[��Y�kԈ�66� �Jp0W4��^cC߾xV����Š��35ew�eNJ:���a�^IK��ݻ������>''�ڹ�zs������߾͑!Cp����U��ؙ��e�JV�:��n�t�[���J�OtK�zW�ʨ-�r��3��A���� tsc����¨���{��-Z�֖9;�9.��˖q��U�t�V��ړ��x�(��c�hT�b�B!��ppp I�ƬS'F~�uE�#�� ��;27m��B����+:!�x)�u�6Ϝ�FN���P�;91�� C�s\r�+|q�<*�P� �W0(G_899q��UILL|�� !�c����rpp�()��ffL9����W ������ת�Z���p�Hn~>�g3�Q���^ċgBp0!��dW�Z�󍨨(�A(�B!�B�G��f6Ớل�A�鉉���"�_Zr����6i��V�wVV��#�B��zxz��w�W�HHM��p�Z�&)#��{���R1�iӊI��I�P!�B!���R_���kZ�zzڵ ����LDF�!9�"C��,,�\@��B!�Xk��bm]ѡ<�Kw�Rm�4~?{���;c�Y�X��" B!�B!�B<��*q��?KK��;yj5����Ӹ8�U�2��Ob�����)z ����B!*���5���99l�<<*:!$A(�B!�B�'W�ؘ} `q f IDAT2�F Eg� 8�6mڰ~�z|}}qrrb̘1\�~����(���1b 4��Ԕ�5k @�Ν g�ҥ(�J��S*�̟?�aÆ���J׮]�I|B!��K�B!^�/f������͠�k�ٺ5�Cth(޽z�v��N"O�V�wϞdgd��[7�*]�L��O?�r��{�+8��W��}�T>��/�� �VV���̘���?�ϟg˄ 4�у6m���帷k@��@^��m��B!�(�P(��@T��x��jJ����,;�Ҥ�� �jbi����SZ�p֬Y̘1���$�_�N�ʕzܕ+W����F��]���~��m۶�[��a���iݺ5w��e�ҥL�:�S�NѣG�b�<��͛s��a���_��:u�DVV���ÇgԨQ$''�T�P(Ū{DGG3g�&N�ȼy� e���e�^��|�5�M�Fxx83g�$66�ŋ�����+h֬}��%))�X �q�ơT* cv�B!�M��B!�ss�=}:����oP�Ã��dNm�@�>}��^�~~D�_�KӦ\�� 51Q�$�\��RI��`mY�*u��SӦ\����I�5�w�F����1c8�a�""pk�kk�J%�ff������v�H�k�5�NO��?��������Ҵ)�_|�}��5�:w���� �x���f�w/����|u^{ 3M ����i���T���Z�Т���-�5k��)<\������ե���zzj�i��)�gB!�E�53㘯/��?ϯ׮��A��|���gΰ���xx`����S��܌����#-?= 2=��66O|^KKK,5���$ L�4�z���$���ݩU��/_�F�eNrr2����h�nݺ4jԈ+W�P�zu�����c̘1�� :犉���ŋlݺwww*U�D�zw��eٲe8::p��if͚U�1fffԩSSSӇ���ÇӮ];ڴi����v�����������9ԩS�_~�呮'�x� ܰ�Kw�{��r3a��FGs��O���!'N0x�FT4!� B!�/�� �df�����k�$m�*?���\�ݽ���޽z���o���wsb�zj��a�y�q=&���7��aC���eg�u�N��v`�����=�\��ƭ�2���n�F���\>z����1��p/��ػ��������|%:H�r���mT��ٜmFƘ���/3�_3f|��avp>l�a�L #��CD(�"Tt>ܿ?�{�Pw���x܏G�u}���}ݶ���}}ޟ �����ye���q}׭K�Ν _��&>>�\���#Gxs�ju�G�f�̙DnڄS�N���I�z��m���С����iֵ+�?��\oo���ТgO���V�z�B!�x~hi��� �ڵ~�<��ULX��ı�46���bd��H�9�B���)ܽ� ��u++<<������+((`ӦM>�� 6Ю];ur��� kkk~��W�����?.ѷm�64h�N���K���=�:�����A���q�����Ӻuk����wY����{�nz������qtt�йIv !����_�5�/k���iT�6�z��t(B� ��B�+^g���K�֭8^<3�y�n�:�s�vѬkW�v��맟�۩ �trb��E��a�J�R�ä\�Ά�ci���t�����q�������䤧�J��HΕTvE��2�Uo���[�_��: ҨD���C��ҫg�o����^���>»O,>���1���E\H���a�'�����;;w�[�'��B!���[/�=K�{�(,9z93ϰ099�V��5������HI!O�☆�t�ڕy��=p�vf6*�Re��d�Q�=j�a�&8��f��U��%��ݛ��x6n���͛quue�ر̞=���V�=B�;U���ϩ�����Ӗ��Ձ��(�B�,�54�ZXn}�>����1ͺtQ�K�*(�E���V..�߻-L���(&=ccr33K�;��Բ�*U:��'\K��}�{{cnoO�ڵDl�H�#hcP�^o���o��� ��*Mkئ ۴�g�x�xyqn�n\��Q']�Ѯ���B!����s�ݝ���̼z�*#�� �{�1��%Gۘ��gF&��p3'K]]������/�����5����>�_�~|���ܹs�:u�p��Inܸ��*�W�^��2e /^T�" " ����xY[��gO�>o.޾̈́}�����ȈWW��jE�g0�>9#�����eb����Ą1^^Lhߞ�k�r(.�Cqq����`@6D9mKz��db"�cbp27gϐ!O=^!��)�D!�x��tu�8�ӿ�ή�S��� 8�m�f�,�֭_?�=��~�Y�.���@-kk~3���q'6����͝����G�P�I�F��{�ɗ.�q�*� �v�H���ĺu$�;�_}E���Ot������9�h�))�ur22���g\9v��W�r��QbT�W�b K�U�'������I~-5ϥK��U� ���Ν�s��6l�T<ccQN�ơ��J�7��1��1�kW΍�ϯ��m�z�k���]� tq!q�'L������O��P*l8�R~Y�jC�B!��a�xu�n�>ͺ#X6`Ǘ-ì̍�v�0���ftt�$���#�l�^�f��d ��ve�����cR���]y�����4�� �|� �nMڍ4j��> d� ����@����¥���_�>\��A�TҬkW K��Rji�����&��K�͚�� /б���))ܾr�ܸc�m33"6nd���,4��3gx��S��403�Ӈr�_�_�v�:��� !�B��_�6g۴�����|�bFaaLI�\p�@=]]���I� �U� ,�ۣ��������9�'O�e˖�5���� �U*�j�b\�x���d ��ՕQ�FѴiS���[��������G�^������ѣ��_����ޞ77�׭���_��Ӳ^=��?_�]fn.s:wfH�V���̪�^����D''0��aZXZ��[7^�����K{��صk\MM�p|�����II�)�]�X lۖ���u+�^��l=���[i`jJ/gg����*�b�����w�R�)�Mc���_z��cBz�E�1j�v���T��|���������c������ջiS�7fcT�ϟ�u�ƶn��_~�6E�H��K��-�B<�N��;������M��>�t8B!�ϔ_�ڄ{y�dhX�&�҄�""�U����flL^�:zW����������쌉�I��7�x���KIIa��ѴjՊ�k�2n�8���Qր��BTԏ'O�'���iߠ�FF�v�v�yy�Yb]��7or=-�W����`l,�&&8Ԯ]�U����\���C]]�

PPP@��g��aC>��G����ϚB���ؘ#��h+D޿�鐄B<%�z�.�ݸN~.����}|����.��mרvm�?��P��nn���ޞ��|�wݻ?򸵉I��Y���K�lH�P!�B!�5J7ss�==�q�4�33)^�oZ\���j� 㢒gՅ�� ����U��w�m���}F� !D�%$$h:!�OH�B!�B!��q�����α��m��m��x�8��V��/QrM�܌��U�8u&=��ꁙ�&&&@�����g�BTV��B��G�B!�B!���L������cc����u �32p c�� ��4&P� ,�UP���L��j3}�t>��S�=f����T���|���9.J��Q*1��F���(��LLL�>}���B�I�P!�B!�5�R�`j�F����zT9�iyyt���;''ޱ��t�434D[� �()���@��_�~�{��RB�'���11l�}%PP����ai��ƍ����\�B!�3 B!�B!�B�x�ZX��I�ӧ����^�p̅ D޿Ϸ���(��OW������h+D޿O��u5��+G~oْ}w�0��E.df�?3�߼�o��L��'��= ~n���JE���BTc��̐I !�el�0���x��[��ǚ��@ﯿƭo_��n���������B!��6-����dPT��ޥ����7np6=�M..X��h,��&&Dgf��R!7��Ш����l�6,�q�)�/���O>�����&_�̒7��ё���(���s/��X�V!��]~^T��$�B��<�?�J���� ̄��_��R�_g~��[GCo��B!D�R[G���Z1��e��v (\{�hj*�aa�hْV%�|��LLX��� 8q��FbB�M[�`�� �--���ݸ���$� ����+g��r��,h��2e���CKK�T��Ԕ�3gj:!�x����!5#c-�Ƕ��BQ�֮]�s*^8@!�����P0�qc�LL8w�<��| !;��p�6k�k(��fl�^�,!'�;������F!D!s�srb��5�]�ȟ����' �{�!!���=��rK�y���������B��Ҫ@b���6BQm�ڼ��e˸G���q�ۗ&��(�~�-4�� P�I�ׯ'3- '??�M��n�'9#6n$�矹{�*�llp�ߟ�#F���wj��/[��+W��ե���,@�x!z���]�8�h���q�Ӈ6Æabi @^v6Ο��G��a�:��ޝ�S�<�{�͋/�ֿ?>��\9z�k�{�8�99�7jD�/�Ĵ~}�w�����0����z��B!�MYZ��А��N���C>PPP@��g�fo�' �|��#\��\<������3_�h-��9��Ɩ�d�/&���٨�{}�yׯ�<1��7fX�����C!��j�ʮB�j!���7s&n��1|�w����?&r�&u�BA�s�=f̠øq�<��3�m.�}��Z�f�ڵ8��sp�|�ׯW�9��l�<+��\ɰ5kh�퍪�"�����z5>����1�s�wsp�<���~�������ݷ�~ `��>�4�����P(ԉ���\�~�!���ys�*Fn�Lۑ#QjiaX�oo���%K���[�Vj,!�B�灛�1'��h_� ����yl,�Ϟ%=?�Q�W)3mmltu��2�RfT�jG�P�Zݺ\��fF�F�+���(n���Vt4�O��xZ�&CB!��� B�q����7���g�l8K''ғ�9�e ����R����`�ҥ�Ҩ];J%�.�gQ�0j�����}�4�[�"73��۷�9x0�99�7���{���tv.S��{�:w.���p+&�������O����ǢY|f��4��P�10��qct *�$p��%%�z�n��S�I��� ����V-�,,��8B!��vuuu�����K���޿%9�����m� ��JO��� �o�T($A(D5��T2�aC�կ�G�/�*) -��My�>m��^�>�7�B� !��ad�B��KNz:{����..��� �=~���Tu[[w�R�D;t���[�GD���C���4��-�__�BBH�}��W����E�n�S�-��A�-HKL�^R������P���a���$FE�:��Օ��Oa� IDAT��aݪ�?~_�lmq}�5��� kG������ff����B!�g:J%�4i²�M�Q(Тp6й�tڄ����L�p71A�P��Rq�޽g2�⟳��ce�f�����L����+i�� �d�x!� ���}!D� B!�WPT֩���;;w�_����{AA�\�����.Z�5"�Jm��X��&*�� �?$�����q��Ql���ܹ��s'�nn��Z�\oo��

���ψ�h^��s����l�7oΦM� ��ח��z�͛7?�ט1c�ٳ'۶m#77�����������)((`����������q��%�Ν˶m������ˋ�G�p���E�T�bŊJ]����Y�v-ӧO�ܹs���/4o��Y�f1`�ڷoObb"����X  ,�ʕ+�X���kB<]ښ@!��6 KK���#�6o� Z��n�P(p~�e,7f���d�����G�)S�m����1}:Ǘ/'b�F�ll����x �n�n�H �����e�ڲ]CCxz���7��W�TQb�����#��u���iԮ�~���xnVwbcɫDұ����ğ�|����>���n�&���Ϗ<���g�ǎ#�B!ʧ�T��Y3����u�z�g��\��f��ZU�$�41�XZ�*'e�5�B������inΔ+WXr�J g�}�w���=����(�������]���� >>�7n`]Tyhٲe��_q��-������y���ݻ�vuu}���P�4iBxx84jԨT?������oM���U�k=z4��������ՋaÆ������ �:�(�� ��$���P�TP��B!�UA�P0�qc6i���R�?$$���2�x-17ccr��מ�w�J�BhFm99q������򀬂&]�L��0���!� &E�g�i��.^c���Ì9�V�Z�t�RN�>��M��e˖J�7e�6o�Ltt4aaa,[� 4h����O�����$''�S�PLU\���H�P!�B!�������xx`���6�7�/ge��� NWA2OW����!ZH�P��z���j֌nn460P�/�R��y+:�O��Lz�&�UL�P�;����������Gѯ_? 3f�x���S�R�����ѣ��=nnn��ۗ����%,)77� .�����K,�����>� ///���˗/W���' �7�|KKK֯__��B<} @u�� <<<4�B�+++U*�z�`§�j:!�x�9ӧ��c� 4�B�j�fN�O�����P��3��b{˖t43{���:�UII�T*YZ��y�*�YQ=�����|K�JE^�����iЀ���1��zx'Bclmm�����Ɔ�ׯk:!�x��~^���� B!�B!�B��X���;���AAᬟ��|�##�p����flL�JE>z�^U�+���t�J>���|�6t�S���h>0��5�����dM�)��9" B!�B!�B��0��bK˖��� �$�S�ł'�E�flLA��1��d<���ߡ��>[[�d[˖X��o� 99�>s�WN���5O�B����B!�B!�#h+,vrb���z� x?&�ɗ.�**X���� ��U����inNt�6|lg��B�6��+�nߦiH ��)��/B!DEH�P!�B!��1 �ٱ�Y3� � �Y׮1��yr+9���6�uu��g�ӫ0Z!DM`���tδn͋E�*�< ���q/��ɓD�B!�I !�B!�BTАz��ݪ�J%ZE�V'%���i���W�/W##t I �s64$�Օu͛c����l�w����|W��B�G��BQƖ X1x���Ш���V��Vlp0�H���`TB!��C�ڵ9�ၹ�� * ��]^ ')'����26FG� O����9�B� KK.z{3�h�S%��R��R�ɕ+���~�fB�! B!��< ��#�Vxz2!$Ӣ?T��7�0����rTB!���jlL��'�����3��x�8���� ��bdD�J� ���i�+��!̴���ٙnn4��W߼UQ�Vi�'���%2+9cY!�(K�B!�3�_��*����\ DSqZ::YX�P�W!�B�b �� ���}�Z()\7�zv6mN� ��|Z����-7��j>ff�mݚIvv(A� B���k� �PJ�f�BQ��]>!��Ʃ͛Y��+|��ʯc�����I�|� �N��ѥK��Ϗ�������Y�=b�F�t��Lu�±D�R�k�~�ݛY�Z��G�"/;��*Q�v��W/�׮����{7o�g���������ٲ%���.Q�vQ���nS\��jh(kG�`��-]�.ߙt�<+^��\]�ڹ�}f���e�Dn�T�Z2��� gg���@�ٳl�0�y/��̖-Yҽ;�~���J�^��e�e����������ҥ�������3���i����O4�B!Due���>WW�׭ ��O�ˣ�ɓ������ )�[Q<;H!�hi�'��p)�@A��ELjމ�&��ߡB!DEI�P!D�����9�~��a�;vd���J�) �����C��1cƍ#��A�Θ�ns!(��S�`׺5�֮��ߟ����~����~`���X��0d�J��YCCo�RI��s�[���@zΘ��ݻ98o��x^v6�� \��Q[�b߶-�O�Ĺ={����&��Ã��6���k���?���]�0z�v�o��>�MMi��+�� ���75�Y�.���3P��x1��o�g�xt�����L����?c���Ŵ1�1{�0�������С�9S++&��0!$�v#G>�xB!�ՙ�R������A�0I�]P@��H�ܹ��� �����So����n�Ƅyy�u���)h+�1!�vܾ��ţM�:�F�i: |||x뭷�����|}}��/!ij����B���\̛G�?�s�`,��HON���-��������`�ҥ�Ҩ];J%�.�gQ�0j�����}�4�[�"73��۷�9x0�99�7���{���tv.S��{�:w.���p+&�����Ǎ���w�Uo�;8p'6��{�ТG�R}����Kc�>p���Pj����2���zq+&������_�[�~(�����"��9:��u�V�iذ�&��Q����x*�zx8uiڹ3�4��eKt���14D�Tbda�D�!�B�J���7�FO������Q��y�4[���C��s5;m������6h!D���P0�A^��`dt4�f(�I99�<}�A��|��H]]]�+ʥP(��زe ZZZ�:g�����[�ڿ`��kxyl5jIJe�4�Ϝ$�Bhܝ�Xr������f�瓟�Kfj*�j`�����c��:����7oN����yֲ�������̬��411�������O�I !�и�u����4l����z��o��/��/��#I���ʢ���� a�G�i�$\����֖���ʑ%K�˴�A&����+ڧא!�1�I�_��F��S��N}��?����!�ٶ��]��;���ΥY׮����ݠ���V�{���u-_��o���K�.ѰaC�z�-Ə��AY|θq����/IJJb�С���{X��Y����1c���'&&+++ƌÄ �ٳ'��СC�X���ҡC�J%K�,��ɓ�޽'''�����5�$�Bh������\ ío�G��ANF�za̡C[X`���s�N\ �c�@�9��������}t �ڹǎ�q����ӰM^5J�/.4�J�T��=z���/[��s�w�Z����ԫG��#i7r$� Y��J�PX���M||h?j�u�D\H ۴A�ؘܬ�*O!��&�[�.�Z���ӧ�-J���&=?��lm��\J<�V��S�4=C�� ����3�!��\�9s���O?1a�|}}�3g,5s/,,�_|�ɓ'��W_q��u���K�9�NTM�2����/_���5����=� пN�8��ѣ8p ������ƒ����5k�޽;vvv̟?�ڵk����O�߿?�7oưD5+!�-$A(�B�tu�8���g���G��=�75�ft4 gΔ*�kh�/�G��ر܌�����8����x�=�u�v~�9�}�p~�^Nn�H�?V��H�ܹ(��q��}}.��^o���~�׶o׎��}F�Ν����q#��\y��!�SG_׾}�7s&ff�u����nN���ԫ��˗� �M@����ٳ�?u���W��X�Z��z��׬��"6l���\�a�^`�_r���[�B�Ȩ��B!ĿE�:u���J�S��*( x?&���&U�p20@��uĊ����4�BTȬ���N��t���͛3f S�L`ӦM�+SY�O>�o߾L�:OOO,,,�֭��=���3q�Dڷo�,v��v���ʕ+�3 �K,��R�066f͚5��955�իW������9}���޽{���`jj �e�JH�����_�ѣ�}�^^^ddd��/��J����r�Jlll�����o�}d�FFF4mڴ҉���`:uꄯ�/ 6T�U�����{mM�6e�…�O��D�B!��a�0���؏?rj�fP(�pp�U�>�6 ��_Ƣqc�M�LVZN~~t.�� ���G���9�|97bfcC����c� u�v#GbX�Ǘ-�Ԗ-���ӓ6o����R�%��k��+ܾ|�?fϦ /�N��0�%b){���W�O��_'��q��_]� �w�������LI�~������a�6�o���ի����Kn뛘p짟�����ڵ�����=EX�Y3^5�?f��ft4>��t|��ǎ)�B�o��������|�._&=?�i���*����sI�/!D�w�� N�8��ٳK��ܹ3G�Qo�����o%edd�{�n^}�U>��C&N��ʕ+�իÇ���(�񧫫�+����X ]�t�P�vvv�� ���J��]�v1`�� ����öm����K��޽; .�֭[ԭ[wwwur��Ã��xnܸ��ƲZ�nMTTT�b))00���v�ޭ~+tn�n�*=�5�$�BTͻu�y�|�0z4/��������/��}��Z"�XR�2_f�۶�K����zz�O����I��y�HD�=��[�~��������Y,5>��V��'�qݺ X����*V��=.Ʋ��9x0��?���>��#y�]!���Ą�<<����N^y*���H����ԔKYY(�^�B!DuV�2PAAÇg„ �-��6f� �/��¦M��1c_}���^��7)���L|U�l�e�ZE>�,�ZUz��M||<7nd��͸��2v�������'DM��tB!DE�T*x�_Z��ܬ,�/]b���x��f%֯B!��Ws##�=<���E���� ���$9(�����xzz�w�^�>�Jž}�J%�<<<��?pppx�ell�nW�vm�y����K`` �����͍���n�Z%q_�v� .����L9��� ��'��B!D�a��������H�P!��&N��������4h����7�����dff2f�������066FOOmmmRRR1b...|�����3u�Tu6l`���[�OOO DBB����ʐ*����������G��{�ѢE V�\�>^�NfΜ�O?���� ��^�}��уŋs��|}}ٺu+��9o���#�T��222�x�"����lW���@\]]5jM�6��o�U�߿?~~~��� KKK�=Z�������ĉxxxh:!��2VVV$�T����O?�t8B�Ps�O'}��+���B!�ZRN�v�gO�IG�Z���Z�B��k��Yd��ƴ����TM��������� ׯ_�t8U* ���88��P�U���W���h?ø�B!�B!�k::�cm͒7�V(�{�������9��z�㰎� �y�1,\Nܩ8�R�^�g2n��d��9µ�k��LCKG �mͱv��o����Y[�� ��� ������XQ)�)�}>��� �7�6�V����n]��=��3����FIJ����!��*I�Q!�B!�B�gDK�`���:��eK�֫G-���hnV.QF��wj�gGqy�Ǖ��J�bo�t�R"�Er'��y��d�z3�K'.q|��b,���^��R�QF���� zr7��d�����JS�S�T$_M��ٿ�������gj��⩐�B!�B!�Ϙ�RIssz����ٙs�Q*���J5߹����� oT�T*�&�%6"��ΐSi`&�U������Ў�wsǨ�)�)\=s���.�j�{R�9ۮ���W�s����uNVQ��p��V�>�r�Pj)Qj�?�AU�"/7=�*��X~^>�q�,��-�}�v�D\���3����2��q�x��-[���" B!�B!�B �R(p12BG�x.��#�?{��E��P�p�Y�a�2�����[C�v �����w-L�;���B.q����e����i]S{5�������T(�s���%���o�y/�:6u�kiGǡK���'�~ �敛�ۚ��� }��� �.�z+�P�,s�sQ������������~X�т��:ę�3d�f`�̖Nowbׂ]�M-[��۝�1��K��4�����/8�p�n�c��}$^J����dg&�j[�ƣ��^n��d]Y����@����=�K!��x�"�����5�[�=5�cB��pn^�I�z��ō� vs-��I�d��B�@Ӻ�4}�)m��E�X��=�l�j / |��������+���������n eׂ]��ޑ���ڟ�/4��{ �BT� B!�B!��z3�؈XL-L����]'���#��(��� ]�r�]9a%��h��O\do�zC��ܟ�H��������V�-n���± ���;��iVv}D�BA��$�.'qj�)F,A݆u� �a�Gkճo\��� 7�cS���K��t�p �r*�����S['�Z��е!��,Sْ�[��ʩ?�.�z1�"q�������&^Jd��-� ��0��bBb��i?Z�� �n:��N��#�n:������kܾ~�N#;=�=�ҥd�u���DžcH��Jܩ8RS0�oV�[��ʽ��ʽv���᥏�Ǒ{#ճS��g�y/���I\ �B��Z��$�� �n��3��>h��2-~O ��x�p1�?��A\d���\�����=�n�� M��Om�ڏ}/�B��@�B!�B!�B#"�D��i�}��k��S['�E=������Nz����Y5q��nKNf�:1�1�#u��`Z�=Ғ�طx玜�΍;����Yz%]��N����el����s���ӖY[x{����n��zܻ�����EƩg����͍㛎SPP@Nfg��́3��3�o�-;�|༒�P�G]W'�� ��:�+�n�^s����)L����߷|�y�&�?]@��hu���„�`�l�a-C � �y�&리#�^&G���Ў��Ô,%���}c}Z����GQ�TD�PϬ,+'3�Q��?{�WU�p�s/���VQDYNzT�̽5G��,-ڰ�q4�Ԝ�e�*�̽ʍ#�DQP� q��{�?�[��}߯���s���~�s.��{�����t�!�Vf%�x�J�E���hֻz�z��g���`�f���Z5��H�`�W�~�س�\9y_��iή�v�u+��=a�t�!�v6�G J�:y9aY˲`V��%=>�AZ\WN]��������o�+Lf !�O#I !�xn�0sGGz̜ �� Ȉ�cH``5GV��V���׏6��Dǽq��[�fh` u�7`�� =g�ƫw�'�B!�P� ��Z  R �6$�@�L��JOi֫n-��۴.�c����Ǖ�Wp�w��܈? �Bw��h��+��Ri|��/i~n�b#M��v�̮3��j.&�};���wI�ZПRKI���5���֌��(��=[�kgk���m��?���'K�v��t� �7P�a� g�\9qE�sݦu��Xp�:�Ձ�;N���_�J-%��wF�Hs;s� �Ⱦ�MTp�����w����u�ǧs�Ɲ J�ZMZ\Z�3�dyѢ�cö B�3;�T� lЪ/ xAOif6ftz�S������\����I�N�]�^�Ĥ���_W?�:@Nf!C���ù�s��~����׫�H�K��d��c�L� )���I�B!��.E�,��E�t�jŀ�׮M�Y����Fm�L =�G��Ø��q��]�>z��������:8<�ȄB!��.6,���4� ����MbT"Ɩ�(����U��T(8�8k�u�����}+�ĨDV�����<�9E�H�dݪ|����t��v�v�����1�7'-.MӮh�������m�z��&�l���VڍhG��8.���]gȺ�uϙu7Sn������� f�U���=#��d��&�v�f�ޟ�r��C����Q�V�u���X���RK�IM�Qj)105 3#��t�OE�Yw���k���5w+�/�X$��5q���ƭk��_7?�~�ĨD���J��0� �ܠU�2�;y;1y��J�B!�f� B���31)��؇��)/'m]�{7 ̟�5) kּ�s�O� !�B��[�e�73�~��e�T� +^�Q�,�`���5�A���t|�#f�f�_���AU������  x�� Kœ����%f'�ť�(uw!����ogkt5tk��턓wA9�� ��|������?1^L�����CJl�3$K��,�>����چ�&t�a@Ct tY����˴/O�R��|��/��]y B#s�J�747,��잳�1����fH�-�����t�`M�33-���q��aҢ�1���ɫ��?z�C���%F����3���B���^=zϟ���dV��֭pjт!���P� !�B����w ���V�S��(�SY�����k~���FG_�K!��Z�>�6�K��`��=���v�v��&>�zv��g��U+��\G��b�����O��%;���������WG/l\l0�6%�Z*��i�X��-�Y�~�Iy)�a�è�Y���������M�5�u t��}��k�V99���-{��{�?���;SC�F���w=���8��t�i��薮�#��& B!�O��'c��D�%K�35%���2e8�͙C����t)�n%h�\���� (��X��c�vʥK�:��-�6cJ--�.[���}G�q�pjт�'N�u�$�M��O�~��;�_���ޞ�� J����t��o��a�����{M�j����y�:$GDp���>z�A˖ IQ�C�B���޽d߼I��>�Vr2;���jZ� ��$&8���'c^�67�⸝�ϓħ֮eӇ>T�Ϭ7�4q"m�y��>��Jŵ�O��6l�+K����7�i�vvh��ܣG!�B!�w��y�z{vnv����oj��y��q3�f��'�R�«�{��ݜ�� :�I�ٺ�r;�vaGe�+�w������ɿNr3�&L��D[]]z~�S�����ɯ�T*B6��9s;s�����V�� �$28��k0�6�y���������sf���d�~�z�`F�����o��^��ߤ{�������%VM�M�Hθg_�K���ޚ�����i�O\ �Fnv.���+���V0iҽ �����#Y{��!Hgk�.'�{�N��'�Y�i]LmL�m+�1��U�����aC< ����7Z�p!��� ���̙3���tV�\ɕ+k��X���Ç�R=|�aEGG���BPP� ����\\\XV��!ijE�B!����l�Ο���q�7n �E�:e�YԩC�3p��"#>� ;wj��R�� ��1ch:x0m����w�7w./O�����X׫ǝ��6nħ_?�LLЪQm=�rKq֬[�Ο}Vb_�a�4?�׮���=?��Eέ[���V�ɿ{�� j�nWCC� �$��<���?�-[`V�V�>�LL�Y�.�5xPI.�����W�7+X���ퟵ<� ���T�T!�B�"E3� ޝ��W(xu����( N�,(=Y��]�Ye ���7��կ^��'�<���>�|���f�כ 0,9fy}w��;��] �Bڵ4�ogcno���#�_o���?�/�6��k�_c߲}$]N����^�ǥslCA����BӾ��\\ �V�Z�8�w�_k� _@Mǚ �b�w���X���Z�t%���I�g�l�kSW�B f|6�ޤ��E j�Bf&>���uu�M{������(����hr��a�_���/5�U���߽KVFF��KsmӦ̾��0�n�BlH)�.�V�ȿ{���M��+���?�)1#϶aC�j��Φ �:p�_Ļo_,��4���2�_~��x�N�����c^�V��nM��iб#Z�tB!��<��~�mڍhG��J�2wH�m��[���W�x�}��� �{� ����6��r�rQ�T �;�����<���ʾe���֢��?��9XU=>�A��z�ٟt9�F/6�܃[��8��8��8z:j6f�fL�;�����/�O[G�&ݛ�I��w������t�ؽ�����o��*��"���}�s�w��߽ľ�TX�6/7��� ʩZձ­�[���?������j�FF�=5����c�/�:�g����9r$�beW ��ٕ������`m]���>X�����AWW����ZHah!�O�v|�;��S�];���������믇�S�P`bg�}�Ɯݼ��74�T�K�w��3�l߮��֎��w/�FFu�abk[b[�R�n�xҢ��=������$_nff�q�O�����~����(��Fq=2��:wfW�l�GE�P���� ��w,�� �;����ܸv푎#�B!��*3#��'�̗�dN�9��2�U�"'3�BA��0�}�_�_8t�o_���g�M�o��o�����!�&VRuEp��M�}�[������(�J�O����WU�ZZ ������WZ ��ّ�V}�U��C�2`�������"))��S����\鹑�����;;;����;w.ׯ_���t��+++4hII��� B�Tr��!�v�J͚5�={6���(�J8�i{��ڶm���-[�d���8991m�4M������4t�Pڶm˺u����V�ZL�4����*_��HII��ޣq��P�n]fϞ @׮]9p�+W�D�T��>�R�ҥKy��7qvv�{��`�y& B!�O cZ���?��~���ZU�����l��iS��A�Z����W�D�Ąr'%��..�p54sG�2���e2t�����U����%-:���'�ѩ���$�;w���B5����ݛ��O������&?7���_��Ãv&0v�n�tt8�a�&�y7'瑏)�B!��@�H���cfgFNf�:�Xձ�Q�F�Z2��=�>�qk{����]C]�ogcdn�)3:n�8L�e�ʨ�U�^KE�P���L�����)*��A~���HK m��| =/��g��^d$�O�:{Oʂ �7o���$$$Tiv�իW�����ё?���9s�c����[�q���iӦ �\��Y�fF�^�ʴ>|8���=z��^+6w�.]����_~a�رL�8����I��J�>}�ŋ3m�4���{֯_ϔ)��X.R��,����o���0�|Ο?ϲe˨U���իiٲ%���'11���DZ.������RɆ X�p�}�+��DJ� !��vi11� ��K/alcC�����l����cc������G��rq�z̚�9�V����j55���l�����������n�D�̜���. �vE�Ą�Ξ��'�����џ~"��yLll�31�0!i߸1:^����>v�Skזi�.c�q��}��ڶ��ɉ�))�oߎS�����w�`�̙�k{v���ի86m����!!�JJµp�r[���8�y3~RC_=�K!�B�瑞��>)����V�I]�6����}^TVvUT�+�ִ41����9��AQJpA\;��YӰ! ������� &����l�_~IÆ K$����puu%66GG�J�?p�)))�?^��������\�z�ڵkk�0�I�&i����K�u��Y�\��_���[A�]+++:u�t�����`ժU888΂ *=��А���c``p���;z�(/��"m۶�N��I���������~��C���Y�h�}�'��Hf !��v:��İ�wXҡ���}i>��m����\G�"��?i��;xv��T�B��RO�mk��2`�R���X޿?qq42���gF��,��-_�Y�7� ;w��ߟ��#�դ W���:t���1s&ף�X1p �v�{��2�J?aW:�����3��ܙ��&Q�Ņ�Ş�˹u���hTyy�W^��雚rq�VƏ={ra�N�|�^^�*������e~���>fL�c !�B!������G��73]\�V(�T@Df&���|W�YQ�ĉ�8qcccͿ� �R�X�~�=���?hٲ�&9��퍽�=k֬)��^��-[�P�vmMr�U�VUZ����G����%..���� �iڴ)���4iҤ�6�y��w��hܸ1�~�)QQQU>�*�N!� d�B�jgde�+K�ܳ���n�����W�t[�5���w%�yt�G%o �ml�1sf��S._.��G��xt�\i��J�����o_����\��yJ�/�Y�ZL�t����4k��WWڇO�~���Wi!�B!��NJ������dnN��p.ee��ռɶ�TV֯�ua5Q@�RѱcG��q�_E E����x��W�vE���Klk.ߒw���D�=���c�ڵlذ///Ǝ��r��)�*�@��A(�B!�B!���16�T�&�����zWZ ���35���{ ������=...%�U%Aطo_�=JZɹ�� IDATZ�f�ɓ'����W^��X�u�Fll,����} ''��y x���ٰas��eѢE����^333�9B!�n� B!�B!�B�Hhi��^=�5j���6Z@>p#/��aa�I�Ju�n�&O��R��[�n�^��K�.�o�>�{�*��lӦ 5k֤[�nl۶�_���^{�-Z�X�*<==qvv��^��5i�$ J�$T�Տ�dlpp0���'$$��7n��'QQQ��������S8;�]�v=z�ӧO����Xf1 ��B�g”˗��ݻ��B!�B!�}�li��f��`a�K�(.��P�n߮����JtVV��V�Z�8qKKK>��5j��ѣ��̬� B�RIPP��� :� &иq�2�VT*����۷���ϠA��?>��9���%b)}M�]cec���$22����{^gi��.^^^�=����`�ͱ~��Ѯ];�u놵�5�����x�)���������X�B�U������ff�k֌7/^��dԅ����gOz:�<=ihh��?��;!�sH�B!�B!�O��u�,uuصk5G#���p��4����6�t��䍈�U*򁨬,�BCY\��lmQ(�B I !�B!�B!��V������)���s��M�|���MO�;ww����hBB�jժ���2 Un+ B!�ύ`��H��3�8aqq �ָ������u�?x�Skײ���r�r��%�B!�_�i�Xѳ'�{y=񱃢�i�r%�ヒ���f��ӧYLȨQU�k�ƍ�dd�oȐ ۬8u��6��2��~PO�^�w/��Xz���2�Y3�--���Y��}����WU�{��R��_1�iSV��. ��I{�p��U�k�~��I��b�}���Rz:�MLh���m�R�XR�I���ӧ�2~|�� @��g��$��j�ɓ�|� g����Ң��}4�����M���R����GSS^�]�Z�Ħ^O3-���NN�63�s�H�{�| :;�&Ǐ�#��h���?�����ܺu뉍)���ؘ�?����$A(�⹡gbRv�Z]v_u(���.�Oї5B!���cmhX�!����9n��ҿa�G޷��6z���W�{�8��?݄�Ǔ����^^��%0�ח/d۠A�%�����Z�GSS�l׎VV\IOg���x.Y��A�x��������[�����U�>�۷G[�䗰0�1n.��%�&N��Z�&��"RR�}��BB�2p 휝[�Ϫ33�5m�k�ϳ#=]Srt�ŋ�q����a�����۷/}��}"c !ē" B!�O��s�8�|9W�!��M�kצ�'�P�U+�����/�?s��}�����o� �3f���`^�6=f�*w��ׯ��ZX�o�"t 9�aG�/'=&g�����m[���\9|���J��c���b��L��ӱ��x�k-]b4/'����s��a�#"0���a�μ��l�2����k�@�ٳ������B!�Ͼ� �?v��W�p#;ssf�o��u�e�^�ߺŘ�[9��������q���Y^Xv�hVո�M�~�I�o�o7k�]a�Fv6o��'cbH����u��I����.]ͣ�%���Ұ!Z�ڬ8u�yG�r)=�:�� ���-J$���ϧO3���fd���w]�js����LMe®]��amh�P//7n�U�d^H\�����$���hdm�w]�r!%��^Ӧ�o� �S�מ�s����g����R�3�Ϩ(�'$`��K''�����#*������4up`���4@�X��L ���],��ȑ4sp`��'~K�w�&�=D���غ��ÇS��s���9/�����w�ܲ��cƠ��U�L�ҿ� �cũSD���fi�@OO^m�H�{33�z{�:, =mm���c��/z���>|XsO�^��Lnӆ�+4���og���%�-�у]�/�p�6{^�D�����۹�����ޏ�{�*��ek��+W���u�\�X�﬍��ml�װ!/�Z�Ѝ ;#�{��+�7n�7W��I�g�|���d�ݼ�zOO�e�B<I !�x*l�<K''�/Y���)�/R��S���̡~�� X��s[�4w.fxv�>�[�i���K�X=t(N-[�m� �ZZ]������V���ԢWO�`�I��8�~�ȿ{�M~H�Νy�����!!<\�<����B�x��֭#l�f�N�NMn%'s=2��>��̴4n&&��t�PC\!�B<��nߎ��%����\O����ԨQa���דp�6 ;u�DW�/�bjj�N�Yʴ��;w��������9yyxԬ�{-Z`��îK��y3?����dv���dyz�ط��E�غ�Q���ؽ;�ϟgjPF::���Ӵ;�����`�hۖ��l>?p��7l�����jF~K�2�ۛ������1��a6FD��pm��8����nn�ЭVV�ő�R��ݝy;��_�8a�U��t`�0������L�����;���q��z���Ɔ��,_��9o� ^���,�҅���Lݿ� ��L+V��h�D�ll�f !�FQ�� }}�YZp&)��a��(��*�y9=���ь���$����������ի�qr�r�j�����S�ܜ��df>̾���  �BB����/�zq*1�v��B_�A�1�iS������g =@�pS(���W/�DJf&�n�d}������fiI��ˉJK�����۷�����9�R�QU��ʹ�Z-_NH\mea�� iefF߳gI��%��Φ����wue���-9*��I !��vw��I:����a߸1u�igQ��f���ˋ��x.�ܩI�K�&&8��nj�����}�}���e�ܹ�}���B!�x��ר�{-Z�g�Z֪Ewww�xyiF����RI�b�׬I�R�|lmK�:�#��M�o�Ҭs���I�FG�wl,�33�S��QIy�، j�77?�-�j߾D��nn, ���;�r������ @��J��?��x���䉄N'%a\�pa�Z����y�E N%&2��'a��?�9C�9s�R��6j�y=���r15�yG���X2V�V���ǩ�D�mm�k�Z&&���������/�� +��Z�����=ˡ�XΧ��R����g����n�(�ح^�������ٳ�,�7�4ajP�۵C�P�É���EYŇB7]���;w��kW�W�Ϣ��2��j�k�`��'���y7* �ZM>���uB K��J�!��I !�x*������-[��O�~� ����;>p� �;;j8;sv�f|��C�� (Ht��3�4mZ�\��5 z~� �ƍ��֭���3��Og�ʕ���y�J���û�MĮ]\ص��ں5}�����<��B!ij�v�x�iS~;{�����w�^V��I�T�����g����Rp0&��[��Ջ/2�� '33~:y���p�:����ݼY"�Wո�V��*�������С̱�2�J���}���D��6EE�����Y���GF��$��ۺ5J�a4���q��M�=��= g��;���e��;� +�h~�Q�՚ح����j�[�����q�Y���<����ssK�5)���Ph~7�Wy��^mԈw�bÅ ���s�#���ﷳg�i�w��k�k+VEѬ�R1�� c�71�Ϲs�dg�\�ɡ���uue��B�{���.!�� 3����ȑ ���oO�U%�_:x�̶k�6�T���1x�J�LLX1p wRR��₎�WCC1wt,��:���δ~�m�ض �z�8�� VD�F <:w��ܹ�[��s۷����1w����B!���fol��-[rh�pzԯϷ�f���͍|��11�}))\�y����� Zש��^�%\-,8S��ֆ�X���٧��E7ww���]d[d$m��4��`M���� ��F�Vө��* �����s��� �9���e]xx�1%�r��*���y�n�� ��Nnn,�֍�Çs��5��`�����A��e�u17G�>K&f޽K��[�dޣ�lnN''6EDp���"j�����ԯYS��l����M�M%� ��&*-��;���OkkN&&>P|&��d�s�K3��+�52��ep��,=~��'N��ͭܙ���p�8�6mbUϞ�~�A�����)M :ccN7i�kk�<���##�s�7�_!��7��B�j��"64���W�ڿ���`\K�����O?%��)v͘��={���˚�j�J?�VSC_�A˖abk�����������&N$l�f��:���P�/^��-�*,Et��q�/\HܩS���r���H�p�6m4�ox�}6~��C]��ٳ9�c)�/� �֮�����5I���I���کSd���_�)Z!�B��r)-��v����X����WTbb*L����ѪN����aal�x�a�6a��w�3l�:9q��5ֆ����۹��Z�l����p�X���GF2n�vB�☴g�O������zz��a[/^�3gxo��:9��� ��6mP*t d��3\JKcߕ+��cQii|ٮ1t dsD����>s�Ӆ���2�+O�&��m���{�v��싎�BJ )����jf��7���q.9���$��bmh�Y��_f_t4#6ofץKD�����Fo�R�q�%S��T��� �q�}���kW� ˖�=2�Kii�|�ο�JN~>� дu�Yss�q��U~ٳ�O��!%3�9;k����Τ={�iy*^��,)|�o��ό_䧓'yk�6^��bY��Y�(__�nߦ͊�dfr��w0��cΑ#D��a��C[gg~��G����ή�^����~=9yyԵ��W��%�E�ק��aatrs+��cy�޼Y��}/n���;��AA|�g))���S�‚�G�)�[߾,8v�n��4��aY�x.^�9n����=XB������K��%�Tt� J� ���e� /���ݜMNfj@�۴)s�^rqa��7�m�@TZ+���klcC3�oݢ���=�ǂ�`Tj5c�ne�֭��Nff\?^'��7ߠT(�52���)��ؿ?6�K\��P(fgG�’�33��sr�?y��u�򎃃�B�R������>����B�;��ّ�Vcإ �����k���$Ƅ����?�ζm�*$+�%�Bw��q[��������U�3��ŏ�b�niɊ��1���B��'�ĨB!�B!��n�ŋl�x�Kii�r� �6m�B_�A�8YW�B�����yǎ=�~ï_g�ŋ��[�����Zu�4�ml�hr�W��<�|���7��؏�Z�&��m����]���Z����0���ww=<0P*�.�5�-5�F!!���B�!%F�B!�B!�sYyyL "�� �--ܸ1�5*S�qz�ˋ� �8>*�~��� 0�e�G��jL�&OdFhy�89��ɩZ�~b22p�?Okk�v튡�Nu�$�kk����Y���!H���'�U�.�֪%%G��z� B�L�r�ru� �B!�3���}=<�;�G���I��xN8����2�������>������%��š����.q(#����c�]����̙�̙3���z�1 !ģ����G}�{�(�. B!�B!�B!��]��ynn�57���繣R��V�)%��P65j����=��9s&II���B��t3�&_��$�B!�B!�B�{��Y�3M����YN߾M>��M�����ݝWml*=?++� 9h�O�4�Bܯ���A�f�| _�b�������\WWt��J��5���E?����|5�+rn�T��|"����˃7� b׹s��BT(��u��%�̬�CB!�B<&�J%����SSFDDpW�&_����x�o�d��'�zRGT�� B!�����.�T���O?Uw8BQ����]�wK!�B�\dc���=Ξ�RVqd�X IDAT*���;x���[Æt�����H2�޾��B��B�B!eai}}}ڷo_��!D������n !�B!�o 9Ѥ �#"LN&O�&#?�Ng�0�ɉ�qq�57��H���o@�B!�B!�B��ii��A����P�����hM��W�TWxB�XI�P!�Sc�…4o�---�ϟ�ԩSqvv�_�b��ݣT*Y�j�c�2���Y�R�$66�Z�`�����B!Ŀ�Ԡ ����l�8u �i��x��n�Hە+�;��4oӂ��; �( �tp���/�::h�/����d���B�hhh��\��T��< 33�G֗B!����������Ӯ����j5y*5���ݸ�9�)53��?��B�`Ƌ/�mkK��[,=~���޽���Q�1�f��[�!T���ۿ��74���߽{q]����Nܵ �E�*�����u+�.�p�t,Z�/g�h�g��1y�>.^����ԙ7�O���_p����Ɍ�-]��ÇI��{���_ ��ђ%�~�U�}��O �jܘ1��xP��Du)�������N��ϸN�u��vzB:ѧ�]�m������f��L(,�T�fMnݺEӦMiժ?�����,\��6m�p��|||X�n}��!$$�ڵk���SịG�歷���ޞ���ӿttt�۷/}�~�!cƌa߾}���"AAA�k׎�� Z�n}�{Y�ȑ#�9�#F0j�(~��7Ǝ[b��Z���ʊ��+++���ϧ�~JRR'N�f͚ӬY3֯_���?Z�Ox�������O>������k׮1}�t:�ʕ+;v,III�����FFF@�e�N�>�ʕ+�3g׮]����&==���$�{�=�J%o��ZZZL�2�J1!�B< c�o��Ғ���c�����d j�����fI�.�21�X\_<����YԹs�~�1�ۛ-�$4�a�6�)"3==V��ͦ��]Ks�VdP(l���jF�u�BXr23⃝;��k�����[�0�ۛ��;z�n���~�!:����_O���,�� ]]����h��LM�2�_��`KD[/^d��w���~/���ǧ�Z���;,��{��ww�iRD�"��(��b/)F�Kb4��'&�1������5K�]����`�  P��X�^�?� K �s>��v枙3��ev���nia��۷Yt�8��9��k��~�w��Yܯ���3m�.����u#�Ņ��}�7w�T���+3b��h�==I}���g�rb� ��I��䳃�s� =J�-(`��S��֭�s��޽���f��A462��͛��.����HJb��#۴�nv6'K�gB���^�p25�LZ�&,.�/�P�1k�_�]�HjF z�ƺ�{�xr( ������ ���BNgdp5;��J%�������;�3��èsy�yD��'KG�G�Da�n_�}������V�mr�r�֫��x�I�P!D�366���KK�o��'�кuk���[�2ggg�7oNBBvvv�n�g�rrr ���???T*S�L�h�F�/����ѹsg�ݻ���1fff�T* 5�_�x1*��5k֠Ur��]�v���r���u�iɍ�F���ܧM�����7nӧO���?g������[<���Hҥ$��A��¼�9ޣ�iսb��;)w���.�$`�Ĝ�u��_khk�h�8ONfm��s$���D�ԾI�S;O�E��m�1>�Iڕ4����n�,|�x�W{7{����*���\�qe�;�����sܼv����r�F�ص�����֌�ɷ���o)**��ՖW�������,����B��[3q��ڿa��H�P!�+22���(���4��e��|��j� �K�.s���ӧB���~��W<����),,$77���P� Rm|III��� �����͛�L�U�_�:nnn�.���#** oo����'��ѵ�/((��^cY�>}4�P�H ����$&&RPP@NN�nݪkY���ܿ��{���IHH� �U��۷W'����9�N�.���Y B!������[�;3t��4iB�� c��� -���W�r���r�6�EEd����Lu�~͛�6����Ȉ~���e �����OJR':7i�A��}�7g�p��u:����\\\�?[��ؘcׯ��ё?bbP)�to�L���‚� �x����9�R�N�do\����Y<7����x��r)=�����c��ˋ������TJ ��֕n[���K�#K j������ڨ(&$��J~a!y��숉�Hx�rtT':X[�<"�n�^�ؑA�֑�����>�""޺5&��Un�oof���ڨ(�hA`��4.�6?����J��{U^DR��=����߼IaI"4����lY�65��n͚IrP�K ���=KԮ��M��H��FȒ�ߧ��^�����]MP��N<�H��D��9�+K^Q'�΅�c��[(,��P(���'�b��^�� ̼����ɺ��B����$�M �V]��Ѷ���B����J����Q�f��?�>�?@�{$��﫷U��k�v5��o�� �@�k������1�<=1���t.��k�^��ƔV>�8~���s��ul]��֟�{V�:��=�I !�xb�����W_UXgZ��CeK5Tw���V�Z1c� \\\�����ӓ���j�-((�M�6lڴ�º���U6�YZv�l��tY~��'�"��ԤO���>|8ӧOg��899�믿NFFF� ���Bե\˪���R�����T*�>.]VPP��bB!��;>���5OO֝=˦�hf������Ҳ%�sr�aC[��C??��̸�������(7O�Q�S*��re�UJ%eJ8B���>T�[*�R�\dev�Y�rw�������GƸ�aob�ʓ'����j�SXr�Yݻ3�M� ��;�?�lnN�����3�c���/]"��@=OUr����UTTT�}u�� ��鉋�ZZt��{�v ��������?��� [ccV�:�@���qpܸj�y�ӓQmڰ��9��?�'�yϞL��z�4_�EE<�y3�5b��7.����Y��+���e[���j�BNq*Ds�>�>� |G��hƭ |^���s�x�";�����#���q@GL��*\�lں)�_� @���'�z%��Ua��؋��}�vuR�C���מF�q��u��k�� ���K���5��Y��yk �y�\<|Q#Ax7��z�A=c=;8R�_@���g�Ψ*�����iP': 鄮�.����u/#�^&NN<��34vi�N&z���eL�M���&�V���ضcd����������{�7�‹�$>��8��'��9����z�C��3��?�P�Miҳ|�t�Ё��P�,YRe ��Ə�?k�B!Ŀ���ӺtaZ�.��y3��cH˖l��&'?�����S2'��g��鱏$&� 7W=�0$6+C�Z�|�����?>^]b��͛$޻����}d$ݛ5cF׿n����AQ����S/3�ѡ���qq��7*�Ԗ�Jŋ��������̬0���h�ut�*�wwkk�U*"��q(yh�еk����r��m®^%l�|���r��99�����r��տkU�+ۏ� =<�>2��� Z[Z�K�V�TO�I;2�cG�۳���a������t��K*��G�[�=Z=����j�U��%��[e?��Tlc��߱�x��L����FaA! g0mlJ�Xu�g^|�&���t}�+��_����5� g�%@�-���vu��U��kR/,�*�hfAJl ��_';#]��{ZQ!Q�`Zuo�B���� ]C]�3��?ϝ�;�X�T8��� }���Xv'�F ����ּ������'�Q�d�� 7K�a�� �%��4��ݞ�Sq� ?G��z�u?���Юg;�te����� B!�cl���(�J ��?���˗ 㭷�"66������LXX�-b�ҥm:v숁�_|��O��o��41���OXX.\��͛1u�T���:t(˗/'66��2k�,�<�������+IIIܽ{�n:�DMb�̱c�puu����:ޠA�8v��&M�رc��?�����m������g���DEE1s�L��ۧ����7776o�̵k׸}�6�}��z�mۈ��e�Ν�?^=��G����̍7��¢�����yy5�A!��Q�|�r(!���o�36� �2�>͚�SP��q&5�O��gc ��Wv�TTTTaĠ��6�ׯ'<.�Eǎ���� ���cM�=���.ݚ5㍝;���~�t��� Ltu+��%?{{�&&�):�IIL�Rz���ݭ�1���׳gI�����s3��ݛ��8����}�2o�$��&l�^�1�ݳ��k��:���{����+�MLz:��yy�VN$%��K�JJ�����������8֟=���P�˔��71��� ��'29�U'OVh������ۣT(XEjF����������ƃ��q�����cb�2��y�����`®^�����z�?bc�[R����[����P憇}�G���{M�ƍ1���Ç9���7G�������sڶm�K/�D||<�%O�*�J���K���qpp`���5:��.�I ����$&&��#񼽽Y�|9aaa��ۗ��X-Z����}��~�-}���ڵk,^��¹|��$$$���Gɍ�:p��q���x��Wqwwgڴi�S�����3f�`�̙XYY��_����1����iMbB!�x� ����u�Q�7����x�~�ݙ�����K��#8&��k9z�:���M̪���^tq���#�og�}�vrb~�����@��s}����8���Zp0�����N��64ĴD*;��m�2�ˋ��� ۰����F[�B���z��… ^_<�d�� �G����ۼ�e ��Ϝ}�h��)\�}��6�1�����I�hݚ����e��^��.q�W�*W)dq�~t��a�ƍ|u����A�2e�� +��ϧ�ڵ�8y�}�h����{��ec�=z���Il,`�T����53�vefh(V���e��-����J���+�WV��;����o��f���{7=���n�q�p۷�׳g�X��Q�6�\� ���������^M�ŋ�Tɼ���I !�W��$�ח�z�вxN[��������4�_�x]���Mq3ۿ�E�|�r�D.?�N���i�p&�[I�ԯ����MXƲ ˈ=��C�w�����.�n}��Xu��Ֆɫ''Zߩ�hp��L�f����./ڤU���=�x<)����:t�P߱!�x�4i҄�ׯckkKbbb}�#�U��+!��tRRk`��J�;~\��Y��� ? ���t)=�E�X��sL�dN����]�_~aD��,�߿���ǼW��U�F���PD ͙7���cmMrrr}���5lؐ{�{�4�a����������[[\����Kŝ�cʹ���K�~��x�";�A�j�b�ɘژ�{�no(~p����&� dI�����Gz�Ax��F/"�A�r����m�����D��k��:��jU��,M��e���R��VL�0"oϊ=��x����(���+�i-���c c�ݼG��x���u�����ٖ�+�r?�>�����m]e{�x��B����� III�� ����#B!����o�R�����p�����ܜ�ڵㅶm1�����۴��*K�~٫�S=�����'41X�j�<���XԷ�CK� !D���Jf�_����v=۱o�>R/�bliL�~��<������㗎���#\8p�[׋K}�ٚ��͕.ú��R�۷�i���~:@rL2wR�P*0ojN�6M+�S.��K�{��yr2sP(�8�TZ��}���� �������ڷF�Q�z�J��>O�?pSZvoI�v�X3mM�۩��4�{���[7��O)1*�⑩�} ���W����KK�J� !�����BON���E~a! Քβ���X�⑐��qV�Ĩ��� �Ͽ_�i�}�v"�#����U�abmR�!�2�ĨB����wB!�B�G��R���i}�!�B�OX;m-�1���}��Jr� ' B!�B!�B!�BB!��~�>u e=_�c�m�o͚�C!����%B!*�P(j�~Μ9888��cU�<���#%%�.]���}>n E����ח���Z����Q�HII����B!G�"I��;��QQu���;wPΝ����:�gU~8y�իi��4�?�^?��o/>��V���զ )ӧ�_��š�;���w�����]� !��qԠ�B!*���G� j�T�+EEE�ڱ*;G�R�����Ө�{������n=E#�B�d����܂�:�gU��_O�+|��ϒ~��-(��K��q#�==YЧ�#=��T�.m��o����A��iaQ�EE4� B!D���B���رc���g�ĉ̛7�3g�p��U����裏شi�n�b���ұcG��w��e֬Y���������-S�Neʔ)=nFFS�Laǎ���1~�� m"##�5k���1t�P^|�E�v� ��y�����%,�̙��ٳ),,d�…�Z���ׯӿ��mڴ!>>��s�G���QXX���#���t��]��K���������#G�����gÆ 4lؐ�ӧ3b�u�������2i�$N�8�����o����_��o�x�"����5�ѣG���@���ٿ?���gMɓ�}q��=�}�]BBB�����_$00WWWn޼���#�������r� �W�fܸq�����������O8v�nnn|��W4k֌ɓ'�w�^����9s&�������A!��Q{=8X=ү�T��A�x�ͭ��N&'���Q�^�ʝ�lMM��W/z;9a���B��`�lnge1u�N��s++��NN<ߦ ]]�ɝ�8�׬a` �<ȑ�D��ܙ����#�ML���u��O�bۅ l9�Ae�����`���ۻv1��{{u�﫱۶�.ac���̬�{�LN�ڲ%/�mKW;;�6s��Y��A�x'4�˷o3�uk�vꄳ�9733q\����_}�も(��N$%�_�ޡ����=��֍^?���7ޠ�����;.]b���Ŀ�&���*�GN~>s��cϕ+�MK�B_��[3�wou��O���G�����J�wӦ�6 � �}�2�<�ٴ4�4`d�6�n׎vVVU�������dB_~�M�}�x\B���g�����BT)�n>�A���m%A(��q��)-Z�{�G�֭133c�ȑ���0g�ڴi�֭[���"66���������L�8�����DBBB�����o�k�.fϞM�V��裏8}�4nenܿ�#F0o�>>\�~+++&O�Ljj*�ׯ�ĉ0m�4����y�:w�̮]�0`۷o��Ϗ������ΨQ��^Rf��¢��?��پ};�}����abb��?�LPP�F���ˋf͚�(��������ǪU�jԗ��{�9�������}�6ӧO'--M�Mvv6���iٲ%W�\aѢElܸ�s�����?ӯ_?���XXr���Ԕ��������`�����ٱz�j:v�Hjj*;v�N�:�e����Q�T���ꫯ2i�$��}�y�F����ݺucڴi|��nj1��W�<4�Z��B!Dm}ֳ'733I�w�-#G`�����&�lnΖ�#1���lZ�ZZ\}� ���c��2�M�6�����Ν1��f��ˌ��7V1�uk��� b��;_?�,�*}�7���߳e�H��6EUMu�ҤYܛobװa��⇓'1�ѡ��s�u�[�f��ݬ��R'�R6��99�hݚy�{���Ϻs��Y���ӦaUr�p��� eJ�N�134�����= }}�����oom��#�a�Ǐ�iÆh�T����lnΊ�'���5�����hQir���3gX޿?�$ݿO�������0^vscQ߾����%����jǎ�[[���Ɋ�ҭ7f̨r�_M�+�����͔N��fg���~������Bf�iV����;!��R��nB��$�B>>���۷g׮]l۶��'������*�J�,����Y�x1;v�w���Z��ܹs���O���aff�J���аF%E;t���%Ow��g���DEE�k,Z����&L�P��Ҽys7n\��T���&&&� .ТE ���0`�F��s :99Ѯ];�5k�ŋqqq�aÆhkk�����/�֭�ҥK�ܹS�>���–-[=z�z���Y����_f������[ 6��={�������ӱcGbbbpvvf�ƍ�A!��Q2��F�A�T*,k�pRV^Q����ޝ�%�xNff���J��PWWc�V���ۭ��u ssbn�b˅ ��ڴ�2mK�Nfzz��DWW �jYr��͛�svF���š�ٸ1��$ȪR�d���=>e^���a���l�p��e*�d��1�wo�(���ta�֭d�塧��EI���W)������A�v�<<������A�Tr��=���e���WyG�_��֖>%߉���Х$�܂f���B۶,��_�M�2��eGabnNv\�Ğ+W��,������Ǘ�z��7�n�>���b��Ie�[�~�BQOGE��0��5�fG�B!����� �.�����.77���4��}N�:����:9XG�%55U�8hذ!�;w�hw��]�/_΁8z�(������c�&N�X�����(((`�С�������a�ʕ���_�~���ͱ���X�P(h۶-'N�`„ �(����Z�DӦM��A___t�=�~��%֮]������"??�������СC��W��[�)���H+[V�O�:!�B���fW^��ߟ�<=Yw�,�����w/kfH˖Uns >�W�o�=�憽� +O���+��56�eD�\�F���!����(�kw�r")I�D�R���P�����\�����Q��8�����|�� ����d��jlW>�*I��>��WM���1�M���$�Ņ�'O2�L­2��4!��7 �x�m.�z5�6o��a�j���~XGy��g���3==��� �^VM��B_��2�B!����_e!����9���8s� ������<�۾}{RRR8p�@����入�%�v�R/�{�.G��h�b� &M�D`` ���XZZ��j�166&++Kc���;J���G�V���HIccc233kU�&�jC] �ڵk\�tI�,<<�����+W��G}�ȑ#qww'>>����k쫲~��� --���� �bcc���+�~ԕ�� �B�5��%3/���562bZ�.7����,:vL��HG��r��>2��͚1�kWz::��̌��5z0̨$�V~�ui��;����TX�)�x���e�{;�����~���Ϯ˗5�[q�$�<<l��M�40��k�j[MϿt���ڽڱ#;ccYz�)�_��=��JŰV��i�6��s�v�.���hk�1���Ӳ���������K���ikK�#�SW�%���a�B>ܷ����r�\�FE�wB�;A(���������y��w�r� � "''�?��mmm&L��ȑ#�7o�ƍcҤI 0���dZ�Q�T��~H~~>���|��'k$+}}}ٸq#>>>�����W_����ѦG�L�>���`<==144�iӦ���,X�����3l�04h@DD����9���� �… XXX`nn^�>�l�dQQ�zyMc�L�=���R�yX�Z��y����K̞=�;w���_j������Y�f,Z�###���X�x1�%s�����端�"** [[[LLL5j .�W^a�����׏;w�F�-2d��渹��y�fZ�j���!���5>���I B!�����=+"#9������::���W��[,��$�E q1=����L���}:8�#&�^NN��`�����=������� �N��Rzz��x����fm����iը���U�4�z�<�����1ch\�BFuƸ�t�"c�m�c??|���/,dGL �:IJ���T�RI?gg?NצMild�£G�Q�4� ���gct4>������Ց#�kiQۺ%5=wkk������Y&xx`��EÒy�:����ʊ�BBpq��а�c�w�^:��ЪQ#�����)�XZҴaC���2k�^��J�����"��&u숞��lmYu��\�w����DW��s����i1v�6���%l���'ƏG�����\Zs���TJ ��XX��ɉYݺ��9��^���)��X�2}��� ���&�ݝ|}��1�GD���9N��p;+��1c��h3v�6u�R�A���ؘ���L��@���mĿCF !�x,(�J�B^�n�&Mb���xyyѿ���i^2��J�",,�޽{�d����?~�CKU�Z�`={��>`ҤI<��h�2{�l:u�Ĉ#�1c 0@����3f�P� ���/�7o�|� �v���ח�={��?��?~��s,--��J%+W�$;;�=z�b� ,X@�F�4�3|�p���0`���>|�Rɞ={x��X�l��� :��Ǐk�P���IHH����*�����NMcB!�x�z::2�ݝ�[�b�嗬;{������޺Ũ͛i��w|�?���L)3���.]P)�tX� �y�x�m[�zy134�a6�>����u����$ܽ����x,_^e|wsr��u�o���2r$_��æ���_���˙ƺ�Cy�C���==��������;�����򛳻w���-#6nd�����Th���������/�N�P�e�^����p!�ׯ���r �X溶*z 0;<�����M�0��f��A��Ӻtai��OJ��ڵ���G$$�,��>}�64��/����CL��7kk�sW(ꬿ��_b����S� �x��/GG�be@''N䝮]�p��.��#���OX�[& W��Rj"+/��|٫W���nڔ��ӹ�̒��5��4����*�R+��feŲ�2rsy�͍O��Yw�, ���������k��#�Bbc�p�~�߸���-c��Ҳ�z����d=�ޫW������)_��Eo'�:헛���.Z�3vvl5Jcݍ�]��۵S��ltex\�k���ؕ�v��};�qq$gd���Ϸi��V��}w�� 4j�ϝ#���YY�'�\]���/�O��K�f�PΝ�~_�,YB��6 ���)S�]��Wڷ�}����B���7;w�?]�V�7�1����F���ʢ���x7m�֑#�ݿU���sdd��B!�B!�O+CC������ ��S�,~�����LZ�;ƚ2�����z��ff&��$�SZʲ��I�/^$3/�8��ě!!$޻GjF��G�����?��B_�1��l�p���la��/�=�gK�{^HOgnI�qrp0���l9S]]Φ�=t��r�\>��U���.^�VV#[������>���r� + @�,.f���zEEE420����id`���8��w/��(����s'c�ܘ���O�O3d�z���������#���*�'%%aT��M�B!�x\�9u�������G���h]�����TO�Yݻ�w���u�8��Ƹ��Ҳe}�#��Cmmt4@K������ ���y�(�tiڔ�##���i�O���stct4!�/��3CC���Nf��������Ù��KV^Q����ޝ���df��X\,,hT���:�&�*�[��t�WW�\�B̭[�ZX���Rz:_9·ǎ�����ϩ�ܭ�y�sg�n�@�&Mpqa���zz��r~��}K���X�����?Opl,H�w���Br ����Y��pqQ��R*q��������;� �����H�:;w���\!t������f]΋(DU$A(��ejj���i}�!�B!�#g���QI;!���&��B�����2�B�a%�� ���G��wgT�6�ٸ�J�������ɺ�g�ͬ�{Y;xp��FneaAnA�_�� m�VX���y���ѴdnA�R�>�R�sr4^�ݹ������͂޽q23#��^W#Ah\��R�������W;v�׏?�������473������_��7n�@�Ĺ�>������B!�B!�BQ�꒙��H�m��Cs33���p45��O��_�1�K��@WW�qXW\\0��gùs��x������ttT/��tj�:� t��v?�+**zhi����ݛ!6���ƨ֭�kؐ 7o�#&��{��GFТ���������x�v�T�~]-bJ�NL~H�����Yү��n��[ߡ6FFD����=�uv��^����9;3������ݼж-�_�Ğ�W5��go�����<"/[[~={�}��5��|�����Ց#D��`kl����FIWu;���p�&����驓�=<��{7J���%�@V'%#��� �J��Ǥ�c������z$%@NA���x����|v�zZZ,�߿F�+�?% B!�B!�B�����0=��CB�*�A��U����o����XwwFo�J�[�4����*�nS(F�U� ��f\\�=z4��� [��������]]0��&��-Fm�̭�,�[[���/�j㾔�NzVV��wx�ִ����p����s�¢"��n��a�4�616f���,��`mT=Y�� ^�^�����������1�df�����~�4�@�s����[��ʀ_%��=�ǎ�{%����ЁԌ |V��ff&W�x��d�77f��2�eK����KO���}���߾�����0p�z��׮a3>�*M���kؐ�]�0������PA�:+�B4i҄�ׯckkKbbb}�#�U��+!���ҿG���DFF�w8BQ�:����?s�lcc�NJ c �3}z}�������,>~�m#G��ɩ���G.ܼI�%K�7v,����w8B<Ԝy�X��9��$''W�.22RF !�B!�BK�.e�ĉ888T�]���QGGGz����ŋY�r%˗/'((��� ��� 333�}�Y���4֗~� D�T�R���_MI�Q!�x�I�P!�c�|���/}���+++�L�BLL��vǏ�s�Θ��н{w"##+�;''�Y�f��ꊥ�%�'O�ĉ��o��M�4!==]�lƌ��ؐ��V�����K``��u�Wu��ĉ�������R�T�B!����ϟ�������`׮]�ݻ �m���X�d s��eٲelٲ�>�@�>''�V�Z�e�N�8����ƍ����+�����!!!0`�rss�� �/�ڵk���O����̜9�-[���l۶��C�2x�`���3f s����O?�Ӿ�:u*͛7g�Ν�k׎!C�h$��~�mv����ٳY�d ���;۷o���X������O�4i���ܿ�#F0r�Hƌ��i�X�t)o��&�}�� 0@�$�u�cǎ�[�n>|����JiR��&mƎ�ȑ#پ};iii�9�B����RIPP��>`ݺu�w]�{i?�ݻ��;wbdd�������JKKc���?�3g�кuk �N�bѢE���{�>}33���gϞ4oޜ+Vhcٲe��ߟƍת�kj���899i�?R^bb" �E��ر��]�j|��z�*��(��� bddT�����r�B!����BQ����7n��;�0e�lll�9s&�'Of׮]@� �=zЩS'�n�ʙ3gx饗*�w�ȑ���0g�ڴi�֭[���"66�͛ǡC�x��ٱc���|����ܹKK�*�;v,���S!��y�?ײ7o o��67o�d���oߞ͛73t�P�?NӦM��֮�1�B!��#77�ٳg�� /�t�R��6m�h��{�.k׮������h����z+++�}�]��-ZÖ-[>|�ƾ^|�E�~�m�͛�O?������ٳ'P}:�ڵ���w��5]����D2�" ESc$1�H��ƶ�4R5�p��6���K�6��Z�UU5cCAc&h��V �D������ !����y� ���fΜɊ+x��g�Y�&��� �|� �۷���t���y���e�boo���vvv�tm�j�}L�0����Z�j�2ժUcΜ94hЀӧO�t�Rz��g݅q�[�hA�-̯�ׯϚ5kX�t)���7o�~�:~��Ń�&���7_�j��9`��L����㱲�"!!��+W�|��_����SOq���\����<���,\��&M�p��e�ٗ�˗�7K�6777��ۗ�X<<<���ȳL�DD��B)6�Lɒ��Bhh(M�6n~�իׯ_�T�R�_����T�-[���=XYY1d�sQQQ����۷��e�v��lٲ�o�����X[[�`�|||1b����wޡe˖y�[�bE�/��#��7VVV�-[���/�AK��;r�ׯ_�k׮y��_��� ���CBBgϞ5ϊ cÆ l۶� .�����c�:u2���₻�;;w�4 :v�hq����y�ٵk�8r��13f�0�1�L\�~��{����]�+����ZYYQ�^=v��A߾}ٱc�ϟ7��́�ƍ�_$�y�����Łعs�y�.66��� ^|�E����ӱ����/��E�4m�ڴiË/�ȋ/���o 4 ..�P����;w��^����iӆ#F���N���J���7�͙3�-[��c�RRRHMMeŊ����4o�<[ իW��o�AAA�=���Ν;��_���N۶msmoa����s �e˖Ѻuk�mmڴ�5-nVVVVٮ���HVJ1*""�V�r�̃�p� lZZ�y��e˖ѤI����eڴicQGLL &��F�Y�Qٴi�/6�{�'��O�裏�^�:��׿�ߤI�X�v��6��捈���HV�Mxg���k��^cp˖-��ۗ�u�2g����ðaøz�j������Օu�»��=�h̘1��ƚ��۷��G���啯6�ǝq�ƻΌ���bAb����?��d2q�� ����[�t�E���yY������ټy35j�`ܸqT�T)�s�������y��Z��{��O��G}���?ϒ%Kػw/͚5��7����`e��T��lٲ��у�?���ė_~�o�q�6߯C���SO��`0��:��I1z��LDD-�A(""�V�/��� l~�,eddP�D �o�n1�d{2w�ƍXYYq��Y._�L�2e� �v��7"""""�U�^{{{.\x_3�>��s�7o�ȑ#�۶l��@�!stt�Z�jDFF2jԨ<�����רQ#\\\X�f�9�err2;v�Y�f��… ��� :'''^�u|}}�\�2����Fv��q��$���x{{��{������_�?���Bh��Y�f�9U(��իi׮]��sR����_0`��:{W�\���6�079}?�o��iӦ̚5���D^��������N�8�ԩSs-өS'&N�h�m�����9::r��u�mM1*���H���rr��"�#��%�N�FdPͫT)�X%��R\i�PDDZ�:u",,�k׮��������Í7ؿ�y���̟?�o����72`�^�u��E����w~��G��� &L`̘1X[[ӧO���X�n �T�R��' �A��h�"<<< �ȑ#���tg��3e�^x�^�uz��I�ʕ9t�+V�0�y�ߺ �d2��4�t�ԉ��_�������ĉqrr�8��b5�L���777&O�����6m�gϞlٲ�J�*1t�P>��#�\�B׮])Q��w����󄄄�l�2N��N�:Q�B���GZZ��������d2��v��%�v����,]��9s�п�l�y��ԩC� �G� :��7��\`` +V��u��899�����P�?z�7��?���7�����*�.M��-Y�/���m;}���n��o�q��?�Y�<�{y�f�&X呺�A��u7N�@x�.��W��9q�fV?Nlb"W�҈6�ʥK[��g�S������Uʔ��:ux�n]��� )��bTDDZ���������ϳq�F>��f͚eQ�駟���'$$����8p�ݻw��'��oB=z�0y�d�y����{V�^�̙3�<HH�y͕���E9����y�����8{�,���>������}���̚5���hZ�lI�V�زe�9��`�q&^�m/�����?x��w�ڵ+���'f;�n��U&���;�v�ZN�<��/�L� ?~<���s7��G}D�V�7n �m۶t�ԩ@�������?�`�J�(��``����8q�1cƘ�L�8�5k����O�V�������=��c,_��v��ѰaC�,Y�g�}���_JJ G����{]�{�=RSS�ԩ�-b�ر���Ӽ?11�"�jnu��u;v, 6�{��9�N�:ѱcG�2y�m�=?u�֯_?���,�;�K������aΜ9$&&R�~}|}}ٽ{�E�aÆQ�bE���>|8����]���>�,�������8t��=����|���b1bVVV����k`3��l�GYa<��Z�,C9���.��X���xXM��gZ��S����o׮�|� ���2��y&,�wIo� ��1i��ty�I��6kָzԮM�<�/;u"�Ãa�W�;g*��#��v��m^�XDD��������������k�e���éS�ذa&L`�ܹ_<���y�'ظq�yA�;v0t�P}:~~~���ӻwonܸAhh(�~�-'N���ɉ���3b��y��4iBŊY�|��\_}��&**��u���M��}9����<==�ꫯrl;@dd$-[���ɓT�\���0�Ν��?���O?mQ^D�OAޯDDD}IQ3�ߥ5�F�bѢE9r��C)���+WWWl ��g��y����A���|w�6VVt�U [++�޷Ϝb4���9��4N���ؓ�ȪcǨQ��_}��;v�w/�~������R�ڼR����/����]�`W��ad�L��q���\��-�Os##�F��Lmӆj�=fײ�=Y��/�;q��*� �%˚�N�d���D�Ǔ��A�r�ݡޏ?~�W�ҡ�$�g�b���1�zϹs�Ιø-�3�����,[��Ν�����%x�22Ǎ�ҟ2d�J��:��ׯ��O�R��t��ĭو���Ν˶�`�ߺ�����U�0�aC�=<��_w�I�H�q�\�`0��;�Pq�>kߞ^Yf^LI��������t�U+�ks;Ɯf̝�g�2|��:�x�z�f��Ϗ�m��Y�<Ƈ�~���?ιs�r-��""R���V�ܧ޳fѳvmF4m ����s�F����%5=��֭q��e�֭���sf�p��p�X�����cDӦ|�o/,X����qsr�FF}�-�{�Z��� �%�s�yp-'��:w�5o�|^ �v�~�22��`Y}WW�x�1�cc�����:5=���� o��?N�?���D�;��w�r�������QQt��;.��66VV���'��Bh(�ڶ�G��8���r�:̉�� �K��%yᩧ�}� �z�r�R�.j���B)V222(]�t�)����G%W�;w����� /u8�[r���}+�QD�T �V.��%������sۆ6nl�ٳlY*�.M�/��rj*N�����,_�����.k�/g�l�ws0) WGG�T�����z���۹~��n ��MB�53��Q�G���C�� �R�o�� }�Y�ٷ�ͧNѪj�|_����.YҢ�@??|����� h��b��O<��ӧ��v��-�j�ٳ|w�[O��`R�&i�;q�@3������d(ggG#ww���� ���柭�F�U��������Q� ����o�==��䓼R�n��MnNN� ��X����}%K���րZ~�� ۳� ��l;}� ))�gfb�à\���bo���;hU�jZ�����4tscNL S۴aS|��sD��s��ߙֶ-/֬Im�$&f+�dkKʍy�յfM._&6��I))�LH�{͚y�S ����1�ys���O-��ޝ�6�˵kc[����K�}{Ν��X��k��F̹s�>l��114�R��O?M��U���cl9u*�4�y��up���z�ת� ��k����CII8��Q�T�le��-�oŊ�Z���g���֖I[�𸃃Ezќ�L&s���9��'hS��vv�MLd��� k�(��._��yLnՊ.^^�j;���μ߲%#׮�h0УV-ʔ,Iԯ��~=�|}y�Is��Wg�֭|�m������_8��o�$<<��O,��ãL�����ŋ�JOzg��\���V=J�'����g;;JY[�Z�z�\��r�J��ڜNN����9������o�~�:�� IDAT�:�Tpp0Ǚr��^%-#����l?s��o�)gg&��<���B�B0�iS.^��'��|�k=j�fpÆ|k.c[��z�dft4m��������ؑfaaw���֖�Ν�4:��p껺�� /P��O-ʽ�����WiNRJ '����[ڣo�YÛk֐��Icww�v�bQ&��tY׬+S�$Q |�kW��h��Ƙf��V�V�����ɑ���Kjռ kܘ+��֭t_��3���մ)ޱ�c�J���S'�����;v��ˋ��b���Ku�p��E�]����L:Ԩ���@�2y]���{�G4iB��?�3{6W���;ּ���/GEѧ~}�Z�y�q#�n�} ��-���ۢ�y��������B)kkܝ��(S���}�W���x�%��gL�w���ǧ�c��wwwpss���w^D����JDD�}����Q{�ruu�61� {{ƏQ���223�d kO�`]�^�{��龬9~���~��!C�(S��Ñ����P¯]#���9wGzݬbbb�������������<���F���Z�`�S�J Z]�q�CII��_�@?? ���"""""""""""��2 nذ�ø/�ٶ��l�FKOO�P���#@�""""""""""""Eh��?����: y�(Ũ�������������#D�"""�PPPJ'!""""�/�?�����EDDb���E������CC�g��4@(""���'~/^���/���5�s�Ι�\�t�^�z��ၓ�]�ve��Ť����DFFb4ٺu+�ڵ�\�r˥K�x�Wpuu��_$::�"�˗/3h� �U����;���z �MMM%$$�� bggG�ʕy뭷��Q�Y�g�{�B)6�ׯo�����CBBgϞ�bŊ����a��m�ƅ HOO���:[]�=����z���-::��իCJJ ��������x��\op���W���ߟ��jժѱcG^{�5����z��`0��G����?�����+��b����ⵕ��y��-[�зo_�֭˜9sسgÆ ��իy�u����ݮ;##ggg���Kll��ߡC���� ��75nܘӧO3y�d.\�@�-�ѣ�E����Yo����ȣK�g��E�� Z����Q��i�}��{1N�p����'L`^llQ��P)��G)�4�PDD��9͛7g�ȑ�m[�l��F@A���2u�TΟ?OӦM﻾�����k׮t�ڕ�k�ҦMBCC�T��K�&%%�/�CDDDD���)��.{����w���)���3����NNf\�����(�w/�˖`4put�r��<]�o5iB�����92��s|/�GF���)6���y��}�X}�8�O��jZ�NN<]�s:v ��%�N�F��aT.]���/�i���<4رc�-b׮] 4�#G�`2���={ҠA����ԩS9|�0;v�`���DDD�z\BB^^^,]��@�=z4K�,�����ڵ���0j׮M�J� d����ر���$��� ��""""�hP�Y�g)��Σw��+�����n/,��Ҩ����[�C��$�A›o���֨�N�����l8y��x?�?Nвe��q~�ٓ]o����@2����� B) C����^z�%>̻�Kzz::t`�ĉ 0 �c�ږ��hd���L�0�ٳg3j�(ʕ+G�F��\��ƍ9r�˗/߭�J�*�رc�����Ņ��@�����[�jEPP�z��رc���ӻw�By�[DDDD~�?��,"��s��a1��a^|�)^�S��+W�Vv���ٰ�#/�W�"�:t��c����x�kײ3!{{����պu)oo��S���i�O���o��lgG�Z���쳅�N��p<˖�AŊ̌����t�֯�� (S�$�h�����V���y�*_��m�� �t��##�˼.]xg�:����k�� R�\9s����\ɡ�$�V���m�f�k�����˱��z�r�T�6�ԩ�k���L��7陙|��/  �q�fu����DV;F�r�X��w��Ո�]���޽-b�p!W��X��+9��]�괫^�w֭���������@� �V����#h�R� ���&��ndd�~=�8����k���VZq�Eqq���x+}m��7_u�g<�������]��M���U/W��^^�]��ED�X ˶��ߟ�� ��%K2y�d&O�lQ�7����l�233-^;88�����;n�l��ǘ1c3fL�����9sf��'��_""""��Q�ْ��"R\]IM�{�Z�>�,������_hN›oZ����5F�Y��O?���-�##����<�3���Ι�k�ތlڔ��t>ܾ����)((�s���˷��3�C���9{� q.�o�ҥl:u��C�������ҟ2��8w� o�Y� լ�E��K���ח���͛i����6r$6Y��t��5�Y��! ���Ȼ��1觟Xӫps0��y4tscI����7^�aF��d�֭y�lY����۷�1>�/�lі;wҶZ5�v�B�[�c6l�[�Z,��;k�|�� �,,�c��n�=�*?>��]��:������@��g�eB�o��={Ѥ ���n�Nd|�yP�ӓO�q۶ [���#(U��Ҥ-[x���,�>�O�-K��>�pRO:;3q�j��0�];�1�˕����NN�q}�����ѦZ5��)C�[��sS���b�b~�L&�22Xе�y�o�3�t�h��! ���WW�?�� 'O��V�9I�u}�ފ��&M�d �oܠ��5�O�$5#�e={bocC��'VCV���gh���=˖�r��4�� .���dkkn��� �_x![^���|��ٴR%j���yL �i� ���{)ogG�'����އ�ʗ�PRR��Kb����7 �G*�����XY����3U��ѳv��d�]�Q� c�ޥ�r�4@(""""""""""�$��'sv�f����HH �� R��Yq����m���R����� �NN,;|�����9w����q|�}��3M&"dX�A��������T�>��O>�k������y�;�e�{nk�U-f�<�8sv��V�� (@�%i��βÇ� ,ggg���i�IL�i�J,;|�&���gI��&��v�=�w���i&%�yk`s݉���S��km�ĘU�{�s���##���`��^����g��^�/�xg�\a��s|к���g�x���Oߵ���JQ�T�{��R�����˜�r�f���ΝK-��x�F�=�-��B�`��|�k�y��g�`oO��jZZ���0�h[�SsX�l��Y5vw���a,;|����"<��ժ����4 ����F2�V�d2q�a�;�г�5x�~�~`�K�&/-^L���ٴ)O:;���N��?���p˲&��v'�{��:ux{�Z�:Di[[N]�D������9x+��S��:�d�ە���)FsS�ё~~ ��#:!�F_|������N���B���={��K�[�AWRS�����[�KMOgөS��u����^�L�[)(}]]Y��/Ttt�d���ַ���k͚t�Y��Ǐ��omݚJ9�$���9~ܜb4��?ٙ���[).�U�'�$l�^����g�>v̢Ld|<�~����zQ�L�������NG[[^�[�9�wS�dI�U����ڼ�J�K���-��������98��� �o���K����m������ϲe)Y�{5@������������������¸8Zxx����Ԩ(쬭��v+em��k�r��5mm��i5ʕ���쯱-Z�0.���}GP�z7g&'�Ñ# j� �uGo؀��+5˗�JZa{�R��%ρ����NH`]��j��d�� ��fFG����׭����i�e�<�O>aHÆ j�0������ʊ�, �g���fߑ�ԯbE�ml�`�v���O�޽9�%��N�~~xϚE ���=�Z���4���;psp��ի�ML��ʊ������ի�n���E>��b���x�e� �ݩ���۷�hcC �FE���i�����h0076��O>��� �66��b� h���ӕ*��������<&� ��.pmF� �������������`�.sl��Lܲ�� ���put�ԥK�;�`o�Z�bԆ ��wT�h� ��ɉ�~�Y�����IJI��ɉ@OO��Yכ+U�c##��t {{== ��%���^���w�s���Ν�r%~����˳�W/���]x��E.^���:n�˫�%J��W/��ZE� �����.]�3�\��֖�Ν�4:��p껺�� /P��O�sn�Y'@� h����+Wh_��]�>{���s�1�޵�ٻv�Q� '����VY�)S0 <��@�ҥiV�2K{����C��ٴ)�_��h>۵��k3�aC���5�y�T)�oْ/����V��w�z|չs>�P��W���qqL۱�K����ӬreF5kF�,�MʃcL�w���ǧ�c��wwwpss��_-�pDDr��+)�y$"�G�������D���?bDQ��� ߻��e��7��C)722�>c}}|�;��HnƇ�~���?ιs�r-��""""""""""""��d���k|�s'723޸qQ�$(Ũ������������ �����Tr2U�M��� s:t��Ʀ�C�X�����f���xfY��(���\(uP(u�����ܦ����gA��d�[�a��<ʔ!s�8� H�5�:3� �b��f���L�4����ӻwo� ���k��>����8q"�ׯ�رc���2p�@F�A�ؼy3�7of�ܹDFFҼys�F#�f�bϞ=�Z��5j�z��B�ODDD�Q�����"�׻j2q�ʕ�CD$WW �ED�X ��/�dĈJdd�œǻv��g�!$$����?���L�4��[���h�=�K�.NŊ9|�0����:�u���ݻ�߿?=z� 99�={��� f̘A۶m�;w.�K�6o�3]�޽{�1c������?x���ݻ7�V��S�N|��� 6���DJ�*eq��V�XA���y�7��/���`���888Я_?s���X>��S&L���`୷�"))�9s��z]### 4߀ȯ)S��y�f�M�FժU����ܹs̟?��{�ʕ+3m�4ʖ-k>v̘1t�֍%K�`gg��s����H���������.+���:�\����U��D�""RL,Y���2z�h"""�P��E�1c���/2~�x|}}qvv�]�v̞=��%K�ȑ#iڴ)p��۶n�ʊ+�7o���h�F��6�L8880���Ɯ���7�|C�[ L�+W�^x�+W���舓�...َ͚���￧}��|��'������‚ ,np$''3o�<������c���y�hoo���W�o4DEEѲeK�R��y_�ҥ����T�R9���ˋ�3g�|""""R0�?��,"+++��RNN����GD$W�W�&9%�|��B)rgϞe���|��۟}�Y�n�j~c�y�UJJ �V��K�.���ی9�y��ѱcG���CŊ��O,���ЩS�\c1 �i�&_qW�\�|s������ʕ+�޽{��HKKc���|��۟{�9fΜɅ (_�<����7�����!!!��gϚ�x� ��X�6lAAA�Z��|�U���c۵kW�󉈈�H������� ++���XD��X�c`�6��CDD侘�ș���I�>}�����w��QZ�j���9s� AAAlڴ�jժ1c� �l)�r��&BA�+lw�獝��YS@�Ν;�����#����^�z�����:6��ODDDD ����?�����ED��U�X___֬Yc�f2�X�v��M ֭[GժU��spp0�+[�, `͚5 6��S����MZZ˖-+��Ϝ9Ñ#G̯###���4?|;ERjjj�u���бcG~��G��+V��E�槟�����{�fɒ%L�:��3g����l[JJJ��&"""�(S�Y�g���B)�t�¬Y�x���پ};ݻw'==��)�ɓ'O�n�X�t)ǎcժU���\�z�k׮1h� 6n�ȉ'ذa+W�4�px���С��&L ..���(>��3�9r{��d2e�W�tiz��͏?��7�|���� 0?�|;e�ܹs9�<׮]˱��ݻ��O?1x�`���5jaaa���㾮)�Ν;���"::�@� <��+Wr��1�m��… ���������@������%))�<�-""""�S�Y�g���B)F�I�>}��O�ٳ' <8�����\�~�����͛o��������(Q�K�.���S�vm�~�mZ�j�����u,\��>}���w����KϞ=9w�yni� C�}���������.C� �V�Z̛7ϼ���������/���͍!C��XW������غu+,[��q����o�y���-%%��G�r���<��dذaԫW�~������������u�F`` ;v��Ņ�۷�~�w�?��,"�0 " ������ݻ���)�XDD�o��ݝ��������_�:�BĩS�ظqcQ�""����~%""������"/����>޼lA���������{�q��A,X@͚5��k�v�ޝ�M����Hbb�9V����38y�$s��ͱ�"�`�(�DDDFaaaE������CC�gy�$''3o�<�������X��B� ����_רQ��G�A�n�,��ݻ7� `���t�ڕV�Z����?����G���/IDAT�z��,\��#G��j�*�����k��^����z��c����xyyQ�L��5**�F�ѦM�T�B�&Mppp�dɒX[[���bq��d��������|"Rx4@(""""""""""RH�ׯo���!!!��g�R�bE��6l`۶m\�p���t�������sϙ�W�^�ۢ���^�:111������iQOjj*�/�u���͍�������<���T�V��;��k����}�� �yPQD��EDDDDDDDDDD �����k+++��[�l�o߾L�<��^{ ���K����Y��zr�v� ���ٶm[��ΥJ��ߦeӸqcN�>Ͳe�X�t)-Z��m۶,X��\&��YQE䯧B����N���9r�yۖ-[ e�V___�N�����iڴ�}ח���t�ڕ�]��v�ZڴiChh(�*U�t�Ҥ���%q�H��:�GE@@;v�`ѢE�ڵ�A�q��L&�}�ݳgO4h@߾}�:u*�fǎL�<����\�KHH��ˋ�K��|�G�fɒ%>|�]�vF�ڵ�T�����߿�;v���DZZ@��UD�EDDDDDDDDDD ��`�q&`�m/�����?x��w�ڵ+���'f;�n���h4�~�zڷo��ٳ�����_$:::ۺ�Yݸq�#G�p���5�B�R�;v,~~~���{{{�����[�jEPP�z���Ņ�����j���;����_ �"7}�t>��c9w�\��.>s� ���T�\�� ��G�z�j�v횯�fddТE ����;w.~�!�������V688��M�E�^�r��}�������7�0h� F�IRR��\�`0X������O?e„ ̞=���ƍ�g�o�t �)S��y�f�M�����ꫯpww`���4i҄=z���Hbb"M�41;f��F#K�,aƌ:���������_J1*""E��� '''���8q"�jղ��]�zu�U���ӧ�\�r��o޼���$}z�������兝��]��***��-[@�*U��J�.��� �J��������̙3 t>)|�?��,"""r�4�PDDZ111������h�W�V-233������ .�I�&����T�X���ޢ��nT,_��J�*�on4k�,_�ԯ_�|s��LJ��Ξ=��1 4 ..??��֟հa����ϩ[�.�G��رc�>6?7kDDDD��R�Y�g��4�PDDZ����mۖ�S�fۗ��En &�)_��z"���z�GGG��VVV��������ܹ3 ,Z��%K�P�^= �|p�c�s DDDD��R������+� ��������T�X��U�Z��� ��]����n޶g�Ξ=K��� Kǎ9}�4G�5oۼy3�����`ggG�޽Y�d S�Ne�̙���7�U���q�""""� ��|o���5~�x<==�: ��� .������)�E��Byh�;��Hǎ�?>Ǐg�ƍ ><_�Z�h���3;vdŊ|�����Ջƍ[����k���ӓ^�z��5jvvvOB�L�|?u���;w���Ettt������y����&O�.���Du��A&�I�O�V||��u�aÆٻ4����@c�;vh޼y PLL����*t����z�W�p�B�Y�F������Ou��Y%$$H�/^���"�޽[�|�r�m�CCC����ٳgk�ĉ*..օ �� �6mڤ#F(!!A��������駟�i�&}��'�����0���j̘1ڰa����TPP Ij֬Y�u8z��fϞ��3g�/�Prr��/_.WWW͚5�z^vv��l٢+V�`0�>Paa��o�^��������@k�g����+==]qqq�ܹ�rrr���/鿿�F�%��d�v��.�%K�(44T)))rqq�yM�YA@h��w﮼��*��3F�����^QQ��/_.�Ţ~��)22R'N�r�~����_JJ���õx�bIRrr�ڷo_�%K���7�����%I}��U�6m4r�Hm۶M�=��2224�| ]����svv֘1c���`0h���6�m2���$����h4���㕶�Nii��9�u��Ux}ԨQ����͛7նm[IR�>}��$��fY,���Y��Q����ŋm��aQQQ�6m�RSS��c�.]l;r��:�]��ͫt�N���pM�4IPrr�V�Z�5k�hΜ9�����!\]�o���h0���$I�����;v�,�:������)""�R�[[�?�YŞ <&���W'O���V^^�S�NU��f�N�>�Ν;Wz<ܱݪU+���:y򤢢�+I�ݻ�JKK���_�K�ׯ_�o��f}������2k݃-F�޽[���� ַ�~[���G�jȐ!��A{pqqQXX�RRR���x���J���JJJ�V`Ot����|yyyٻ �փ/��!��@C��s�ƍ������iȐ!���ս{�*tѭ^�ZThh��L��^�z��ի:|��bcce0�`�����S�N������ǭ���/��ѣG��?�����P��p����%U�X^^^阻����´d�i�ʕ �v�=�r4!!Acǎ�����7o^i� &h��񊌌�[o�����ڵK111����;wNaaaڻw����o���H�k׮�q㆒�����/gggIR``�bcc���-OOO�l�RM���1�'��<��,++��b�s5P�G���i���������ϟ�[�ni���ںu�&N����H�ݻ�z��l����x�b�������2�L>|��6m���2����VAA�z���_] ,�Α����+W��/���իվ}{���Y�W� ��`�t�w�ޚ>}�>��#Y,���k۶m���?������iǎz����;wV�+((H[�n�ƍ�{�nu��I˖-�̙3k\��z())ѕ+Wt�ΝϫJTT�rss�� /(00PQQQ�c������Vpp�rss�����^{��k�"�����L��f{�hd:��K������.j�����h���ػ������đ��d�X�����\{�S��M�����KgΜ�w)ꁭ�WYYYt�������P���b�w��n�O��8�]�vٻvB!�@B@8B����p ��! ��lڴI �������|�ry{{[��޽[Fc�������F����i����f̘��44�w4�n���￯��x}��7jѢ����4g�{�V%�ɤ���jժN���+999=����������k�.{�4X�ԃ��N����;�S�K�y��v��j���rvvV�v��<�e˖O�����ݻjڴ����a�1� �6m�&M�$IjҤ����t�ƍJ[�V�ʕ+;v�:t� ???�����͛6�}��e�m۶�����ɓu�� ��4�F�={V�G�V�6mS������ԲeK 4H�O�� /��+VX��������+\{@@�>��}����K�-R~~���P����;w�|}}���_|Q111��ѣG+==] 2���h4j��� ����ƌ�D���<��7jÆ ��������ԝw��u���W&�IIII���t�� ���ش����5d�+!!A�֭��?��7�x�ҹ3f����������S�V9_PP�JJJ�o�>EDDh���*,,��`��c0*<����lmٲE+V�жm۔���e˖�X��ಮ߁�~�z���+..N�.]�Ν;���%IJLLԠA�4q�D���@� ��]�d��F�RRR�iӦ:� 4&l1 �cjѢ�Z�h!IuڶsժU�ٳg���k׮�ҥ��]�&��T����t�ҥK���ѣ��f��_���;Zϝ4i�-Zd}���Sa�_~�E���RSSյkWIR۶m5r��Z����X{�쑧��$��ŋڸqc�c�7o.����:��2224t�PH�:u�d=���.ggg5k֬������i=�1��;���RVV���ܬ��={���L��ɵ�OJJҠA���$���[:x�`�sk ��9��;Z�AIz��Wm���>}�X�AI2�ͲX,��˫vL���u��E��ׯ����?�\���Z�x��^�j�X[�N��A�����iĈ����t��Я:�A���6��p�W�|5=����[��NNN��{���4�.Ǝ+�ŢC�)%%E~~~����ڵkkk�{8:��٬��4yxx�s����!!!������m}�… ���ӄ �TKpp��]��+W�X_KOO�ݻw�4����⢰�0���(66V���*--���v�%%%v�h����?�XF�Q���JLL����3g�h�ܹ6m�9d��i�F���:z����߯�S�j������z������N�j�kѢErqq��IX^^ns�bMΝ;'�?�N�"##u��q]�zU���������/gggIR``�222�������'��<��'Um�YӶ�^^^���R�֭�p�B���K�5k�JJJl� 4�JKK�����M��y����׷��V�U裯;vL͚5��ɓ���h5iҤB-�^SU�XӚ����ʕ+�s�N������(���i֬Y����ƍ��BCC���`�k�N?��C��;�����L��f{�@����%��"OOO���ڻ���ĉ9r��;�#Fػ5���*++KM�b]�KLLT�d2�t��i��ǫ[�n6l��KP��b��{��rss��1eʔz_���H�gϖ�����߯��Hedd�h$N:h�N�:�{��Uy��յ�׋��PDDD�� �a! ��2�L�.@#DO0�@� �������wP���|��% �nnn����2Y,;W�{�UB���K������.j������Z�3H*��̔�l~�U����,�]����p ��! !�@B@8B����p ��! !�@B@8B��4��K�.ٻOإK��J�����IEND�B`�neo-0.3.3/doc/source/images/base_schematic.png0000644000175000017500000030731012265516260022325 0ustar sgarciasgarcia00000000000000�PNG  IHDR�����sBIT|d� pHYsaa�?�itEXtSoftwarewww.inkscape.org��< IDATx���yXT������� ����o���憚ffn����XfYZ���diY�k*������ ����� �����sl���<�8s�=�w@}�̹�EQB!�B��@!�B�K�t!�B!JI҅B!�(a$IB!����$]!�B�F�t!�B!JI҅B!�(a$IB!����$]!�B�F�t!�B!JI҅B!�(a$IB!����$]!�B�F���gӧO'-- ///�w��p�X�t)QQQ�����[o�;!�BQ@*EQ}Q��z�-rrr�=fii��� ...���+X[[?�-;;;���9r$ ,(�p�I�6m�Y�f>|X��!�B�*u#�˖-{h��_��֌=������ԽMB!�B�Jm����@׮]u����p����$$$0u�Tn߾������B!�(�Jm�^�zu�.]�ﱀ���������~�7ޠE���B!�(�du�|�nݚ�ӧk_9rD��!�B�ҦԎ�?��������矩�ӧO�~�zBCC9u��ʕ�^�zxyy1dȐ�y���fժU�8q���p.^����...�mۖ޽{S�R�'�-99��3g��������>*Tx��B!��D�􇈍��>wvv~�v�͛�'�|Bzz���ܹs��V���OV�ZEժU�Fpp0Ç'$$D��ҥK�i�&&N�HJJ��K�n�8q����,]�Tt!�B�@��|������?k_?x�iAM�8�iӦ����ȑ#iҤ ����ر����s��15jĩS�pqq���޽{�ҥ ��� 8�-Z�����[�8w�6l�ܹsOۙ3g�ڵ+QQQ��ذq�Fڶm�T�)�B! W�M�9z��NY||</^dѢE0v�X�4i���_�t�Y�fP�V-v�ء��>�_��ѣG����_|����u�����> ;;+++V�Z��I�&M"((���8p�^�z��� ۷o�v��O|�B!��h��$=44�f͚=�xӦM�����ٳ�S���_���h���7J���e�v���ʕ+��O�W�����?�̙3g��������g��Z�n�&##������?�<�t!�BQ�du��8v��g��ԩSOU����$Ϗ�F����( ����9�m�6ʗ/����Tq��̙30`t�ԉH�.�BQ��$�e˖(���HII!<<�ٳg�����}�hѢ��&ςJII!&&�]%&?�7�>����9vo�A����}��� Ǝ��{�@ !�BЌ�׫W�_����P����q�`ܸqO�����v��}���?�o��扮O�rrrt^[YY��o�k�.@3�}��ᲂ�B!�K�vN��k״ ��4jԈ~��;�>ʢE�044���???���P�T(��=��Ɔ?����^z)�6��J�bܸq$$$0z�h�<���C�� #GBJ��//���̇��A�R��/U!D�#�]�%׶m�o�n�Z ~~��z��Í��) �kנwo���PX��� ^{MS���-�5 �u����[��5m�h^{z€p���2�n �k�{{�e !��� !J�:u�'���T��w��~ �7k��lڤݮWO���a�ȹ��E� �(f����ad`��� K��j�^�����]�p9�����$�_�����Ξ�=6���l���;��z�>5�0��t�c�Y�s �2��L�����p{s{�Wnϗ��������d�I~���N_q)q��:�O�B ������$�B���A�M���y�5m���W/8zT3��]������=__X�J�<����q�W���7hNN�_�k�YO��a͍�&&�� ��J֕�p燌~i4��i�W��d��=����W�qyG�:�e��Hb�cYxb!G�a�P�~������j�ULզ k8 �K~|��s����p8��+�ع1�сt�� 3#3��щiI�z�썵�5o�{�_��¬γ0U�j�9x� ד�3�� ���CW��X�X��+Y��NU;�Y��p0w 69�����:�conϡ+�X����`v �@�r5xo�{������������{q/+z�(���x�)�PƎ[�M !����0Ua2�� �<���+EQ��� ����ʗ~_�ԭ5��2d��놿7T��V_��K� �Q��۪(����U���}uw��-h��_�^�z��� �Q�������&��ܡ(����}^a2ʚ�5:�[�Na2��ؓ:�7 ԩ�(��V+LF ��-��k e䖑�׹J�R��*ʨ-�۞(>111 �L�6Mߡ(2�.�B���]��0T�5����@:��@V�\�7��A���������蓮fv+����|��#�^;�m���KcK����V��^}j��髭[[6��\�X�/��ҙ�U:�n�Ns��,^̀:tέhU�z���afdF[��y�3Y�� w.���@VN�w"��P�w��a��$f�< c v_��������N�����"�B��4���G�8:��~9� ����֭-KC�RŶ �][u7 ��>l;�M����3�J�N�GY��6�6ddg<6���t֜ZC-�Z������̞-�p%� ��+i��}�xP�� 014�);{�,-���Ԛ�P�lu� �HHO��^��Ľ���_���m-�I�&4(�@{Npl0'bN`eb������4rj�\ݜ+ ��ԅ�A��������P����B���ɓ:uXvr�\��&l 㚎�.��b����:�Y�l�n�]�'^燃?�3P���2&���-{XR��3�@�Rq�X[p�������y6�6 �3�?���[�nl>����s��yV��"1#�ČDn����И�j�����e%�R�@�!D�����1�Y3Ͳ�B��6��P|N��&l w��2���1GsGj��ɲ�e�җ��;1I��/ ^B}��D�����W�KC���77�yփ� bž ��1�����j��s�� 踼#�VwcX�aؕ��J������-�ӪR���Щ!�f���>�=�5���[[�^������z��Ysj�vJΓTo]Wu�K�/iQ��O.'�F>�R^�^x9{�sڇ�|����#�6PСr:T��(�Q�ZҊ^5zQն��)�?�� !D~�j�3G����Çj����B�Z��Ƶ ǯ�s,%+E絣�#4����`Ƽ4&���*�"xT0_�}�g{>#>-� V�T��v���9m\�`mj�'�f.ʹ�U����N������۵�0��Ԋ���?��s�μ\�eN�8I[��4(� O?5�դ�Y�<�/W}�_��šSkX���.�������(����u�(�Q���0^�^�5+��{?gݫ램�x>�Ey��w�kL�b�ر̙3���B�;u ��U5����;"!�s����ddg�o�'����� (�����8991m�4&L���XdHH!�N �l\�� ���;"!�s&$6���Ğ�{�����[Y���Tȑ��J�t!�(++ظ>���a�`���wTB��D��-��ğ��<�FN��� KSK�3� 92QRI�.��R�@DdeA��`��>���TK������;/��ҳӉI�y��� I�B<)''X�֭�Y��ys�wTB��Z�&3;S�a�b"I�B<��!4T�����U3ڷ�$�B��9�l��@��X��C����IzN:s����c?�}�ݖoA_Tj} �=�O��Z�jO���Ç��? ����T�V ///���+���󭓖��ԩSٷo���4hЀ�m�2~�x/^���Æ �s���:۷ogٲe�mۖ�#G2s�L��� �q����у��~�JEnn.�/f׮]|�+V���J�b˖-lٲ���D>��cF����󱷷��ؘ�� ���8s� ˗/�s-gϞe�����`llL�j����a�֭l޼�-[��r�J���}�^��ڵk�}�6���|��WXYYQ�\9"""g۶m���@\\�����0��f�nݞ�gP�����u���⧡( �ϟ�z��]<��׬Y�1!�B�.�_$69���b�c�K�#;7�P�O�J%>=���w�O��������%�k���u_Z��О���6�L��2��j�U:T���=��fq������N�&�N$)Y)�d�������粫Piv3#3̍��<�5���� WW��V��sc�R��hI�.J�.]��~�zΟ?O�V����X�d ӦM+�+����'��������1b#����׏S�lu�[��>�o����S'�J�ۘ��yؚ�����GfP�A쿼���t�����f���,W���J�6aO�J%%3��3���� �������z��HϑX�<� �( ��رc �IQ����*���S�C�V+ 4P>��ce߾}Jvvv�z��񊃃��V�����|��ݻ�(?����,<<\100P�j�r��[� IDAT�ҥ�Bnn��9rDY�f�2m�4eذaJ�f�[[[E�R)�*UR:w7N����e˖);w�TN�<����*999Jbb�����_ʷ�~���曊���ҪU+% ��1lڴIquu-� ~��孷����� ��Y.��\we�������Ik֑Y��lW�v�me�����ONʕ�+�Gvn��������J�y��� W�=���ʴi���"#��P�T�[���7�`�������$$$���fΜ���˖-�������G�-���̷��_��7r��qm���?������+����ӱcG�U��������W���4jԈM�6Q�n]�4i��x�&MX�r%W�^�)_�f ��~��ժU�z��q�� .\�@�ڵu�;99ѣG�<��7ohF�sss:�i������LJJ ���:���$�������>._�Lzz:�ʕ��� WWW�U�F۶m�U�5j������ZZZҨQ#5j�-�{�.�f͢{��4k֌�S���啧�ɓ'�|�2�����[���G�t�w߅��� !�����黮/?w��! ��B�V��b��$�ً];�����+��[=~��##�(�X U�����ތ�>�拚�Nve�-��D�tQ���ݛ޽{�������ٿ? .$::���@ڶm˙3g�����p��Y7n\�mޛ�r��m�ŋ9'�qIz�*U�-/[�,�+W~��7o��[����f�����MHH 222O���x,--133#55��w�j߻�5f�|||��ynn.j�sss,,,077�>ʗ/���=z����M�077�8�ccc�7�|øq��駟h߾=o��&���·��G��z�j�&�*�g��رp�����RP�e$[Mdh�����W�d摙�v�U}W�R�����v�K���;�u��X�g%�����ʀ__��� ��f�7��2���.M$I%����۷�}��L�4�ŋ3j�(n޼�̙3�7�^�t ���0������۷�����U����%�.yϽd�q�Eіݹs���D/^��~A�Zh��x�ϧ��0dȐ< ����3�]X�������;v,]�ve����X�###BBBX�r%�f�Ҿ?z��ǰh�^���HQl6����ԛ�}i�^��=�����9v���N�b�B�j]�x?"ߑ��;�n#�����������x�m��ӏ4ZЈ�-�S��B��]���⹠V�9r�v�80�����V�y�wHKK{���6�qqq 66���>�Xa������Ќ�?�Z� Rl�=�z��xzzR�F *V����m�J�A���K�ppp��Ϗ+W����MZZ���ڟmRRG��o�����O���T��"D)�#r� �Tm����ݡ�_��e�&�|��+�~x��c/2�y��Jbeb�꾫��P�A*ƨ5j��Im���v���. $Iϕ{�v'%%i���O�������&������Wvv6�Ÿጁ�5j�4� <�Z �_����Bi��pvv��� Z�j���;���4mڔ;vhrssY�r�����WWX�PߑQ�E������2�w�J.D0�� z��My���o�I����:S��毡SC�c��T<I�E���E���Y�~}my˖-133�رc�ٳ���u�� 333:��Ç�_�b111n�0����L�6�ؒ�{�N��L�E�����Ç�С�N�bŊ\�v���p��망ޒ���_���W�W��7>���;��/�[���e�dFC'�.'\.��v_�͉��� [Sۧn��̞��۳���B��`�oHp�$�EA�tQb 0���۳i�&RRRt����0b��=�J���W_��P��'O`���lٲ%O�7o�dƌ�رC[���]k�gϞ������ȭ[�X�p!��.���w#��I��T�ǎ��7��sc)����=zt������� 8s��Ga����9���L�<###RSS�~�m��]g�dNDFj��쩹y4�d<%���xc����nV���) � ���WkWm��c�M苂�%?�W�^(�ۛۓ��PQ=��N � )�~KI�E��( ������ *T�@ӦMqww�R�J,Z���S��ٮ��?����&66��={���F�.]x�����B� |��DGG�ԛ!^=3'�sw�q��yҳ�1Pٔ��&�o������$�\Ŋ �M�6>|���tLM��E��o����ב��{8B��Z���|nW��͢�[�~cաrmr����s��،>5��-*zz�de�Jҳӹt��9�((�(9��Ԣ���kk��4����f �,E37��ȌNU:I���$�B�gr��-�F��2e >>>L�:��-[�%��ժa���R9���>ΟH����# �:�ϓ���|78O��y=��=�Mh��Wg���E޷�� ����h����:J͎�;�?�T7Ԩ�!������U���3��0� �����딧d��\R�q���Q�j֬�g���$�B�g���I<������ʎ������W�^lڴI�a�8_|�;w��w/��@7�������ߧ��q1�=k��<�Z.�~�j~5����������)�)��1>!ϷJ� ^����ǘ={6�ƍ�[��I�t!D����\��S�7Rb��֋�fQ��s�>���5k�]�EQ�����D���Ȋ�����B�ָqc�-��ψ��oKr�}j5>?��a�Q�}� f�����L M�m �>��� ����:e�Ɔl�� w+�g��Q���������*z���Ԉ�E����|����$]Q(*W���X $�’�^ �0�$��֬�����Ą�]�P�Y���ٽgE���̞��Ъ{�.'cO`alA������jJ5����N���d3��p<�>�����C �NJf����Ċ�M�J��22a$�N�ί/�.C߆}�w����.BQҌ�Yv 5Un� �=C͜��Z%?�*��g�Re=014AA���L�t!�xB������\ .ڎ��^s�2RR�9�xݺr��Ӧ�����k� \�����M���(DAU�����~�Pw���Pv�T���V37\SN�l�P�����!I�B<��-[8�(�N�(��v�|v���nāD�=�?s璕���ӧ��Ĥ�-���x���n�攟�=z��N�BBP�ucΝæ|y�ʁU����zlQ����o��"�'#5���D"(�J�����HM 62�ŋ���G�tQ(B��v�U>���̌4�l_���ˑ܊����˥��]ŕ�ay�S���!��G��������t�6���st�qW/�{Nfz���q|�Fn� ';���!��j�ӻq��ע������:e�W��s%w��{?.Ѷ�R`S�yR��҉j6'q�^#SS~�m\jצ�Gq��)� X���\]�L�l �����aC�=<�ܰ!/��[Æ������C��O�˃��lAml�gw͎�U5"3=�k�O?��9s�٪ �t��֖���=u��E<�JA��.�rh(��7slÆ���( n7��y�cb����7.\ !.�b~PnN�*T�B``��[�Ŝ?ϊ��Ԣ���ܸp�k���w�վ�����iM���!t��b���Q�;�b��ך��ߺ3�[����Ŵ�;T��>�u9G2��;�CC5i) �0�o����Zq9�$�\�{�Ԥ: ����xd 6���I����) �t�#M��J���Ջ��vw�GF`_э;����L�L�׫���R[��9�R�HMJxdiɉ|ڣ!�.�ū�f�刓�0��c�b_э�;��7�kV�0�9���\Ń��4>�ѐ���n�)$'�cj���h����q|Ц2&e̱�/�� gP����Ѧ��'��Bp!0gL�̴ee]\�u� ��w��]� ��\=u���&ݾ��?���ʊA��qz�~M�^���RS���8s�c׬����ڵ9��CTH�ii��݋g��*G�Զ�V�>������e+V���������� n^��ϔ)�޿��#G�2Ќ�Q�Y3"p�];O���TR����sg�������Eo9p '�n��o8Q�Nl�FzJ �v}�����|� ����P�s ��� �=P�]�;��Y�̜I�֏ߴ'��%����>���͛������`W�F&&D;�g��m��R��%>:�3R�˫��-����� uڷ'd�Ғ���鉱�)�Lld$5Z����S�b�x|�-&��:�,_Nl�kTjX�H�Urs�����jE�HI�������3�6}���b/�]��؎ T�Ր?�D��h4-{���9_��xW{΀�����mf�8Ţ�[|��r���'�v<|�&&�<�?Nö]��?��\a��߱e�L��Ҟ��������u���_��˶ųu�rp�L�&�Y���x�77��V��W�P�y��ʶ?n f��K|��:6-���������/f���X~���љ�~�B{ܤ�_.������PޤU�A,��=Qד���Tn�H��^��;}:�����hХ wccI�}�@�^���� \ �nݸu�v$`�,�y�z�4k*�<��˗u�$6��sb�V�\�Ν�יz�-^][׵~}m����Iҭ[� ��ܙ�� :�E��t�;�պ5'w�I�w�&���?t��?b��Ȝ�g�v��X��S����d���������'d�NBw=��Q���0l�\� ���3�ff���O@���#��%�� 4 �g����� ��#�11�:9Q�F ���}@)�� {�Nj��S �=�#Fpr�N.R�ӓvÇBî]u�9�~=+Ə�i#>:������<ޭ�ghZ݋D�t��nYCnN-{�q�^�YZ�o��<�YZ�꘯0�����%�� '#-���Li��R[�F����|��3+�� IDATZv��{MN�h {�����,~�e�\013����c_��+�#�����9��l܊��io�oy���:����V�|ڣ!g>4�K�'�:B�#p����m��پ{���o�2/u鋡���xu������噚YhGճ2���H���F����㿶̜ɪ ����l�9�ݿ�����9�a�۷���@�GDp��e�n�"#5���CXP�ǏS�$��� ������c|{� -�f��8T��3}�Q��9�G�$߹��i�(ce�����H�e�r:�[�Š "�����};�ťvm���0���{�&4���ʕ)ceEK�'��y� ̬��b�>�T�h��v�PN�ݫ]�}�ҥn�L|t4����}�\^;�2���:U5"62�����!�^���|޸1'�mc�����p��I�WOb��et=��#G�ٽ;oϛG����___.���?��;:��k��wf� � �4��B ��.R��4�"vTD���W� b�ҥ��)@*!$RH�����IƄT�Ip�bA�ܹs&�g��g�7z�b�����78w� :���?�Pf\+^x���h�����+W�������!=8��� UGVZ��.ԁw����Մ�srhD�޽I��������mK��#G���Ʋ���dҒ�سbE������6-D�ӑ��ə]��ژw-]��M����k#)w�m���hѭ?v�n��[�i�hv��=c�y�����{�115~�h�|!3�Y��}������={�Nk<��P�.ǝ���7O�RǛu���m��v�]��:�e���Y���1k;�N{�!S�#>�4�����_�� }y� ��C����p������Ң[�R_{6'7+����=���B6.���L���� X*���� ғ����1���&?'���K��x�K�Rafe����AA4 �=0��sPP���_�p� g��a��ť�� ��?&;=kf~� �I������Ҭwo rs1��,�ڗ""� �aP;���Ǿ�dž ��*���C��5�K�3�������u�Z�\�F�x�D�����.^�QQ����Z�|��/[V�f'OOF��K�~��w������u:�,-i����.�[gg6$��)�������+�/\�����;'z����bW��(��gͻ����' ��I��"��%�ݫ�� g�u��ϔg�fx6kFbD˟{�OǏ��ر�Z� �^ϦO?��ٙN�G��������9��˗�o��F�8�a��o�iϞ$�9Crt4�iid��b_4�y�t~v6ׯ\a������ѻ7���q[��z�L|�5��N���4 ��013��ёAO?͆� �.��8yzb��H�ի|�䓘YZ�Ѥ ��D�ߏ���2�k��|��g[{�$�i�hڳ�ovz:Ϟe�…�tg6� $���y��c�[Y3��?��咛�I�m�t�g�b3��!E�*�O�h�69���>�F0��O�� ��΁��^_q/^�^���i��� zŰь����R����Tx]�Z�wp��!���{���ߛV������Z�]�Ư��[X�������+�c���1��i޹�tZ��t�v_��V����Th���HbD�""8�f �\������ܳ�j܁+11���јܛ�����K |�q��J�]�YZ�cҤR_����ϴi�ֽ;z������%K����^;1"���ݢ;����}�^���0��=qK[[�����-[����U�dž �=�~l�z�,-iѿ�� |� �|�% |� 8�u+��u�����*7���m˂A�xr� � V��Ҏ��'���*�g��O�ذ!�Z�ߧԸ8�����Ɔ�����#t�6B�m+�g�"�5��g�f��S�ť�� �����''=�G>��F�[�ͬY����|���.��5#b�>l��И����B�A�H:w����� ���=��>�\��u�>v��˗q������e���Co(��G֭þ�M{�䋘���p��E�<�篥�.�i&ff���amo@}���Q꜂�\���H�� 1"���;i ,1�/t:��7ǿ];|۶ſ];<�6���]����IQQ�޾��E���ѨU+� �߿�F���g㧟2tΜr�w���"A]�����|����3��0���89�0��]��LH?�n]z��E�SS_��o�x���=F�m���7<����?�bK�z���;%�ߢ��r22X2cgv�� 7��/�P�Mjl,N���ff2歷Ⱥz���G�R�}{�B��wޡ�ر�ݳ�g~���s���Ep�n����o� �v�`�{�`�`���hѯo��{` ��N%�S'|BB���U�����v�_۶8��s-1����9�0Aݺ�0(���d~�3��ÇS�ߟ��d���q �����ŋ��x�,� w?���p $�ԩ*C��?�,sw ��/�;g�P��Ke>��$�V��M�H8s����Rw�̭�xq��2wa������~m�������>���Wy}�.\5���2 9:� 2��7o�΍"��y߾��j�.ZĴŋ�|�<+�x�W�nE[PP��NB��e:m!{��@��,���ʥx�|�.Y�װ�w��5�Cڣ( �N�]�a�\�`էoVL{�z���>a��o���aam�_�~Cr���x[g�=0�ݫ���/�.��eߺ�8�iU�k�?u������i�:�kd^Keէo��o��߄���y�g85�U�A���N���7�C�sx���]�����q����g�t�;�����L�m��o�n�?����ǎq�����˟{]a!>-[�׮~m��׮�wl�~vZ?ΝK�G�+3*:��e�>K���ss���>�b�u�α �HN�����>��9����ddЩ*���7�_���л�ՠAƶ�Uq��1.V�Jľ}��?����s����v������lɫݺ��k��{�r���M~v6G׭����.��.nٱȼ�J��o��e�8~��5��������54 �]���4jښKё��L����lܔ)�?a���r`�/X��q��Ez��L�Q�ϛ���,�<��/=�ׯ���љ�/��/��������^�c�����<\�1��&)& ��)�fΥM��[=����?�>~j,� � �;�m�yu�V�>�<݆�g��������·a�ӯ^�ň�6�J�k�F�6jD� o����p�(�a���|=s&j��6m����m���qk���� G�d~׮��m˘�ޢ����ܬ��C���<��O��|W__Nl܈J�bǷ�kԭ��8�y3�z�6ΰ;yzVx��4hܸ�� ������XV���dRcc �tsv���cjn�+E%/� �҅�&L��f_T,%&K[[r�_�i�^d��W�o �`XT\��K\h(�-ZP���X����2��������;�M�����$%:gooRcc�NO�Èƀ^�iϞ��n��Θ��g~��������D;v�;�F��O�$��H2�j���Q槹s��㏌y�MFΟo<�W_� '�]˖1�J��G8@P�n86lH؎Ɛs�{����a�X�I�;i�'��u�"L-,0��ijY3\||�|^q�^a^�T����}���􄑓��nR>ނ^�cϊw$�'EE�-,$��1����#� c�Q\MH ���+Ϟ����(w�<���w��w^9sp����*<'��>%��EQ%�� �⹳��j ���;�̴+��_<�l�i�qt��-,P�”����ǯ]NT��S���Y�l��+���C�+51NI8wF����گ����Eɼ��ϸ ����(;V~����c��U����5��q\��REQ����2.���}��tJ���Jz��R�I����ܩ��z�1�N����Cٱ�;��1���Rc��<��G�U�^�M�6)�^��uZ�{���7�(Kf�T^l�Fgf�Lq�W����Ks����\ WtZm�����Y�(Pƙ�+O*~���?���rǎ�ΥKo��+�xC��Q��qff���W&��*[/VEQ^��C����?�CE9y�_�"z�^��ᡜش����^�R�ۮ�����V��ޭ(�����Cy����k�E Pz�衼կ�r�ߔ��\e�����*��6UEQ2RR�����Ջ�#2SS�/yDJ~NN��}�e�_T��ׯ^UF����+���w�}�df*����E���2��Dy�yse���2 �k���znFJ�2Z�V��ӕ{(��ϟ���7+�89)+�xCy��B���ǔF�4>^�����h���~[y* @���R�̘�(����3AAʡի�����G]]������833eN���ci�i ��$]O����̢#��K{�9����L��W� V�7h��^�\ٺh�-�Ny�����5e����C��ʌ� ��ʑ?���5ӓ�EQ���K_8z�򰵵��A�cyYY��'*3==��|R�`�H�!sse�����,��wf����ʂۼΝ 3�▹y����W�9ŭc[’4�v�Y�xC� ���l\z�7w����U5��iWИ���n���x�,{֬�q������)���ܮ��=-% +[;��Îqp�*����8��R��}�vN��9�R�iڱ%�}P���;<����M���ݢ�-Z�m��l ��=@Lr ����H8sϦM�*:�;$�-ʝ���ᇄn�Jrt4�"#�b�d�?��_��&T:c\���,���i�����k�8ԬO�%&�a�B��u��ڵ4�ٓs�1{e�z�&�JE�Q�8�jU�w�>��l�إ �P�?�5�f���9�w/���,~�Q򲲘��7�z�z..w���u��6~}��OpKr�2��<��g#�Z�C�O��S{���g�!=�2I1Qx6g�KRs[Sss�ڶ��h���u:.�?OܩSą�r�����H��ñaCc`/� xa�Z^l� �^OANWsr���'���9>�}��n�U ߻g//\��o����t��@:�ť�(���˟{��K��iԨY\�m�x��ۗ�_|a,#�Qbxx��!�kW�Yîe�PIP��iV�|�ҧ�f��?� �-��֭[������n]����ڵ��5��nj\.>>w<���?g�����y�ضx16NN\��4��U$;=�M�}V������f� �&/�?oܡ7.4���157�����\� Μ�i���3��u�Ga�#�p)* �������d]�ƞ~`�{�����U g��o�/^��֖Q��������N�1i �0bYii|1i�=[eY]؎�շ/W/^�؆ �{�6|�!!��/��Ӗ]��15�ap0�:ą#Gp d'p5v��+$����f]�0�6��P����OA��anY��V�.C���шK1�� q� �I��zË�Qk4��H�ѣ��s22� %>4���P6~� �aa�Z<�4�Q��D;f�G���O/��/��3���逸ʝE�Q�ɓ�w�p[�A��4���&Mp���J|< ��I��#l�F���m]�V��i���3����#F�H��g�2��g��X�t�Y�031��٭+L���)Z#0��� �!����K/a��̧QQUv?�oߞ����gg���Xjll� kZ�I��~���]l5Co[����י��W�����0/�� 8{yj���w7�S[�r-1��^z���z1�h'0�%���qmԈ����ۦ �^Ϛ n+���cjn��(\��N�F���$)*��nd1ǏӨU+�Fb��u�J֡|� ~{�U#"J�{�Q����8:r-1��=Ī7�$��i�.^�{Ewx*�3���m�H�ߡ�Q[�s5�BTF�1!�U'��y��&>IH�w,����ӤC���΀ �Ӽs �w����ݺ1��Ǚ��W�s� ˯_�ð0F�� ���κ��䐛���w�eZ���0g���΅�GI������m���� ��څ��+�^^��7g//�Zm�~�5����Y�0ܪ�Ӫ�E�{��[�����լVvv��o��իw���2��,|ZJ5&&L(�3�wH�\\��X֫W�5����=0��[�TxNj\\� ��<��z����Vy~ҹs�4�Z�S �<=�;oƟ>m\`۬woƽ�N�ܼ�LKF^X��_���.��4�Ё�ӧ 1����[2RR�5����慐2SS�u�|��5�Ծ�ϝccQ'���bN��֦ew�J�£I�R;�����Ct5�YK�2飏�o׎K��L��j����IHB�y*� ;77����*��.�ˣ0/��|�tww�u�H� ; f]�ƺ���Rd�MuM�[''4&&8{yanm��_��:�V�qz�v�&$���a�]�D�޽\������������S�� y�9&-\��ի���� ����m��x����='O��c�U��G���U>��k5����FCˁ�LM�Bm/�?��4n̥�HE!��I��B�Z��ǤI��+,,��h�!Chڳ��ˋ��'�NN�Y���}����W��F����T�0���tV��?�E�/�kA^.���>}8�q#>5�<�6%�(��ظ���=Dž�G�?}�xN�޽v�B�I��sue���<�b�Ɨ�9�D�]�u޹C��p�H��]C[PP�9���hLL����vbf\��d�;�`eg�W�昘�qf�.B�mC�V��^��������$�n �҅��l��<��Æa��@��=�:��g��+���F̛�bb�����(�414�Tc��1o�uS�|u9�׺w� 7�FSfc���0>Q�V�5��‚�C�rl��J;�JHo3dۗ,��m[ ��J}H�N��'OVz�aT�݃�ڵ����4m44�%FDT���� h޷/�m���+�0`�,�,�1� ��^�#.4��={�3�55������la�p)2��K�����̙����K�>}jl����t!D�����~�]V��z�3KK� z��z���_g//�q����� 'OO�<=qhР�"���\f��Ӭwo,��#;=��w)�7�ѣ�g�5����9�s�1l�\�v뀡EӦU\��)�����-t��O01ẟ_�������Ӳ% ���'�|�<��؁^���̌�� R��itC8�m�����?������ғ�n:��5����y�FM7.�l;th�����б#��,mx IDATyy�;O��Y�����R�f.EF�u�"u.��W�7s&���ğ>������#&��X��6x�:�Ը�-�h҄e�?̙C�iT�E*p�y�,/�v�����6��}�xu�vTj5A]�Vq�8�7���͕��[����=u*SS��vX�& �Bq��ltt/k?b�V���a�й3��skk&}�z��v�I�:����HI1֏����G�GS��GۡCkx�����,�=��k��oߞ�{h��b�nj��!�9�']!D)���<0gNMCԐ�AA��:�V��G����U_`�.$EEѨuk��qskk�n�Ջo���nj;d����y�].���^R��f�* �B!ʸg�D�5�F/��ȻE ,mm �ܹ�����Q�ո���*�R�yy�&f-]J`�.5=QKH��B!� j��Y˖�و��С䤧�tk���Ą��'��0D-"!]!���#F�9ܭ�ݺ��h��uR�"�B!D-#!]!�B�ZFB�B!����t!�B!j �B!�B�2҅B!��e$� !�BQ�HHB!�����.�B!D-#!]!�B�ZFB�B!����t!�B!j �B!�B�2҅B!��e$� !�BQ�HHB!�����.�B!D-#!]!�B�ZFB�B!����t!�B!j �B!�B�2҅B!��e$� !�BQ�HHB!�����.�B!D-#!]!�B�ZFB�B!����t!�B!j �B!�B�2҅B!��e$� !�BQ�HHB!�����.�B!D-#!]!�B�ZFB�B!����t!�B!j �B!�B�2҅B!��e$� !�BQ�HHB!�����.�B!D-#!]!�B�ZƤ� �B��E1�B�BU�C�6�J�JUWF[3���[�^��NB�B�� EQ�a�ԕ�LWg(um����yqh��.�" �B!�yJ��V���UE�E)=�^�r�Z�F�Q�W�5=��A��'��Jѝ��Ԍ�"A]�A҅B�ӊ�R��z��3�JQ򫍓�j� S ���J-Q��>P0s�JU*�O����.�➦R�P�ⷂ��W���E]�^��W��`����0gfn��BAaAM�V0�n��¥��I�R�V�P�j�j5� �(%f݅��$� !��g)�YTCi��(���zt::�����z�qƵ��~�[Z�ZMvnnM�VP�T�pT��*4j5��F�FQРB���v!� �B!�Y�����E�ף�j)��(�����j���z��ҋRzm 閶6�X����]�C�T����h]��`�1�D����3��Ee.j�t~u��t!��,E)Q�f� uZ� )(,$� ����u��E����u�zh�Z2��jz(�Fq��Z��D����SS,�̊>d¸�(����ԅ�$� !��'g��Pw�ף�i��t��_@n~��f�uz��z]�Ժ0gmW�NGF����L4�*5f�&�k�07�a����/jtz=��N��BB�B�{V�~�z�r���B� ����7u�V�ָ����tK[E�r�b��J�F�Qc�1�@�A�ӡ�k�M5&�5z�L:�|p�rQHHBQF��˜��s�_~��UM���z�b�1���] �+�'���B]!�Z�?����o`ni��(�p��@�2�q�u��Uj4 f&��;#�m6%���DB�B�2.�[G�;�`�����5=��b�M�X�n\@��Q��R�Ւ_X@����E�ն�nfn�������*LL�(z5P�5�T�C��-����(�KPu��t!�ed�;W����͌EA_��(��t:"sU��a[{C�bg��Z-_ (�0W��{�kQ��P�sP��;����C[co��� q$� !�(#'>3GG�cbjz(wD�]E)�eU��YQ��)x�ٲ�o���+��9������ ҅B���s׮d����P��j�Kΰ[jT��Z����]bR[�Q ��#����+W���9 8w�vυ�b�uq�B��.��r)�̬�aܒ��0ֹ���O5=�jQ�Z�p�ܙ��W��������?GB��Flo׎S�=W�suyyli҄�9s���k���iS���zT[[�௎�fW�g;71�6mP���{��1D!�%HHB��Ν#��q��,A��S���g�R����������o'#,�]�2�#"�tw';:�_y����cl7F��G�������E����ͱtw7���I��EaF�]!��+$� !�u�g�b���3W��3BC� !3<������K��o�`��뇢�������K����}~�m������+W����4<���+=?'>+//�<=��L����m�[��Y3Tu�n_!�& �B�) �۷S��V#/����/.�z��sg��g�>�K�^X��p��2��o�>]_X��_�ӪUh,,� �wBNB.=z���\�;%�4��}����'o݊����=q�֍+��Uz~NB���Xzx�s�Cz�-(Z-f��ԓ�w!�$� �ߤRa�����@��jE�;�~��m]2/<��=V�����/�m�V�u3BC�k� �v�8��lmޜ�����j�ܳg�{�1�����ss��]�5iBv\\��F�cb(LOǮY3܇ aDN���]^�oa���ӧ�k� ����~�V�}���'z�ξ�& ��rS�M?q�c3f��p���������1wu�������}`�a�fR�M����^��ԩ��9w�R&�_=x���t���̳g�״)`�I��.Y.���ʁh��ph����m�ο�ĉ���2}�t�/_NXXK�.eذa<��÷tͼ��2?%%� YL+���t!��Z�����h��@�B���fg��t\=t�����֢���86cI�YnI���^cǒZ����}}1wu��ё��{t�T|�L1��XX�21�6 �둑�>G�������NJKgJ�2�֋����|�-�>��#S��T��eˈ^�����^�xN|<��Rf�o��%=;����~^1E�'e�v�f�*uܩsg׬����������؇����d���GV��d_�p[1i����}{vt�\�:�7m���AP�v��0aiii9r���d���K\\���L�2單9o�<�_Q�IM@qw(z=���&&���D��ˆ�0�R� �V�P�Tx�K��ߗ ���\�SR���b�.E��������{{`ٴ)m�P��Fֹs�4n\�r/^D���m���-[��C�e��fe��s'�W�.�u�F䔳�.'� �F��+�=�<{����<���ᄽ� �f̠� �8���P�SR�MJ�wڴr�O���h,4 u�.|&O6/�)��Օ�rfғ�m�^�&X6lX�xzN����a�fd�9�m``��n��j�ׯ��ˋ�W^!3<���<É'����s�Z�@������R��7#������zdd��\޼��y�n�5!--�3g�0v�Xڶm[걀��_gff�z�j�v튙�7n$>>�N�:1dȐR�=u�'N�`r�?;����d͚5���r�}���S7m�ıc�(,,�C� <�μa!D���t!�1�۷sx�$ֻ���{wB_x���&3"���4 �]���5�\!?5���dC���@�VW:����(z=���^�D�ɓ裣1̙����֭˔R� �ަ �{ �F��� �[�v� +7p� ���X�1-�N��ǧ�-�=�6+��ի c-y��E��׷��Tj5=���>R�@�[�"�� μ�:�g͢��5�Y�ϓrCYOvL �&��kW��%Czy5�/��v��>?�� � E�j����!8��g�3�éפ����Kww������7Iݽ�x�C۶t��w:����\��).ݺq��J7J;~�?�����_޼ϱcq�ԩԟ ]n.�O�ء�M���baa�Z���ٳ(U�]HNNfʔ)|��t�Ё���m۶1t�PF��N�3��v��*g��֭��.�E�����ٳ'���o�姟~����g���23/D'!]�{D~J nj���1Xyz�e�z���3��Yz��~��6���㫯 ?�,!`�l��oG�Ֆ)GPi4h��Pi48�kG�wޡ�ɓ��ˣ˺u�t�Fɹw�N��z�`��%��+9��$m�`X�Y�>$�Kk�rd� �}�'N+^`Z�F�Ȏ�)s�ڡC4<�x'!;&��9s�feq=<�ƍQi4�^������Q�֭Iٵ���'1wq��-��Nϝ˞��IH(5V�q�Ȼ|���� �7���h�{(�&=3"??̜��޶-[�6寎9���U*l��o9����cUt��d�?���e˸�~=����* 7�2�.� X���u�:|y��4�?��_�����.�Օ��� �z��μ�j��9qq�Y���k����+���CmfV�yn��a����[KO��r�� _( �7o��[o�q�q��� �өd�;a�>�8�C�V������oy�W���g�����'''&N�Hj9�O>� =z�S�5m�4�7o��ŋ��z;w�k׮�mۖ��� '''Ο?ϪU��O���Ц �K�V�{�p�p.�[G�a�C���q��4�v˖�G��k����#���طl���H�<<�XYa߲%�N�֨T��<�}�֕�nmdii�[o�śo���ӧپ};_}�+V���ɓ;v SSS����y�:t`e5�~�޽�e˖1u�T>��s�%>x���Y������;w�^_�9B��C�� q��aAs��t@�իKKM�N��+��A��� �=��:�p��"}��{�D2Ϝ���xO�Xa�I1��s1�ص%;&� f�-=<(��,�kjnb"y�/�Ц�����c��߬Y\=p����j/~������4w.�-[���!.,ZD�w�a��S�.��Y�������9nI�I�ŋ�E��դ����������( �W�T8��'0��%u����.Q_�*\L[R���#�D��Ճ1��!y�v2�° @mf�m`�q��zT6E�)m7����� �>y��-+}��L�RѢE fϞMDD ����켡ÑUQg��������Aú�իW bccɿa��kE�$\]]���/��O�>̜9��� !j/�I���OM�zd$.ݻW�9�^Ofx8����������xQh��>#����Zcn}���z5A/�Dvll�3�fh��Ƚx��0{���5m���5�]�`���O`��Ғ��G�=��JE��^3~i׬�C���8�o�u�F\) ����� ƾE �XmRc����ut��h,-C��S '�]\(�v E�C�ѐ�u+��5���E�#'!��c��o_�.49qqXWR��9f �?���Tz�c��_�J������s��a�'L ��Ɏ�%#,�ض��ߟ�E�/]��4v�Q��؅��v��~~d�>�}HH��[W�T*�Ζ-[�t�R���K�J�p�>>>U�r�jՊ/���0h� ֯_��� M�>H>�#Fܡw"��-d&]�:.u�n�CB0����sTj5 ��+�F7�A�����._�� f�,6,�f�m��� ��� ��� =�U*\z�Ĵ^�[�C�p�0򒓱 ��ۛ����Y·�^��ѫ�춙�3*���lzN|<�U,�4wqE���5��3p g�|���$�Ϣ�^L��EAZZ�3�m�pBm�Tz���Ƕm��q��a\{��>$���MFX��B�m@�?!=* �m ��ҳ��@�/�������`9 �c x� wk~��Gr�Z��!�oݺ�T�5۵k�Ν;9s� ���3nzԲeK���y����j�e�WX�^B��AB�u\�K��r� �G�� d��S��QiH���(����͛q�۷�s�,ZD�]�*\Y�ﻏ�ٳi4e V�ކ�.�RaHW��abkk�Z�Vc��\j�hy�.7�XZbbcC~j*iG���p�((�$$`��K���������aZ�^��+o�c��\;r��:1, �v�p�Ёk�JW�f�m76�p +*�Tw�Ё��;�v�0m�TYU����ЩS'ڵk�ܹs��믙;w.�۷g�޽ >�7�qqq�W�^,_��%K�гgOlmmy�嗫��!!!�ڵ���Xz��͕+W���`��Ŝ8q�6m���g��� IDAT��f�>��sF�u˻� !j �B�q���R�h,-�kޜ�~���ո�hy,=<�[�_=x���Wq�ի�s�]]���N" B>�k__,=$İ���V��Ņ��D���m�krbcKͤk���?p �?�D�ѣ�]�_�G�wƌ*���5kF�ŋU�w/������fȐ!5=�����EǎILL����$$$���Dff&�w���_�y��,\�///^�u.�q !� �B�q��L�J�&`��*KA�5k�����ĵ��.w���7��lc��oՊ�3g�fgs=<��-!�]\��o&VVXzx`��Cv\\� �ϓG��s�y�����yO>�$���|��������˚5k�%"��!D�@0̑*#N���B��ĉ4WU�,�8�t.���F����I$��U�N�Y��}}�k�w�W{{S��Dcq�Q�J��g�k�1c�v8��ȅ�v��9�g;�����/�d���|��g�n�0{�l�n�JBB������v�uU �Q�E �H��gw��}���2���.��N�g3���X��_�MZ��_g�B"������ �n�T�}�P���3{{};�B�����+�����,��>��3��}��Ϗ�[���r���r�]w�� /`v{�2"�. s.�L:�g�g��s{]k+���2�T������TB�MP Xx�T�7W�;�I�����񡭩��͞���v�Z�/_�UW]u�}�Y���Ǐ��~"""�����K!��aΥ.��Kڛo��ˋV�vH�P:8e����5�����E�Jܯ�n0�������I�4������x��ϻ/8��%K����7�@7�J� ����0�R��$��_�<8 }�a�ĉ��(��_�r9�<� QQQ����,X������[ �"] ��Lz]f&���'���uio�ѭ��ܡ�.#c@�J$R�E��l��?�FCmz�P�"�>����{���2e ��������>�c#!��a�H,�hH����Sq�X��i��"���H{��.����S��9�a LP�믴��R"�}\��۷�����st_Q�լ_���������t�RQW] �!��a�H��Ȑ����X����EE}��>7�����O�th ������@��#���S��<ԡz��>��[nA�R �8�]w������"��A�. sFZ&=�?rh�r�XdV�ݔ)XxzR��ڧ>rs�=���2곳��KKikn�n�d�7��P{�4N�gS��5ԡL���¶m����|A�spp૯��>ࡇ⪫�����dl�`8!D�@0�i����'��:u t:��;M@�}��Q���f�h�Ǎ�<:Z\[P�\���ߟ������GkC�9Mjt--h p�>�:�ɒ��"::�Z��~�;,[�����1c�/��ѣ4��bFlf$ sFZuma���d�>� m��h�����>'�O}���b�၅�7��O[S^7�HCA*T��h/b��v-*��:�R��o��O�����u ��Hd2�""Hz�A���RTT�s�=GKK������賩c:�����?�����������/,X�`H�vpp���_������*s��a�̙<��SL�2eHb.�H�9#-��-.�&<��}�����2 �B�/�ސ��z�(���D�r 9_|���ڢ"�]]�Ezaa��F"�;�m�ͤ��&rKK����:J�����'p�3������b���ח��RZ��YX b����N�>�\.G�P�P(���T*����?@~~>�ٳ���,���Y�l���? ����s�N��� >�!NNN����<�裼���,X�www-Z�W\�̙3Q*�C�@p�"] �H t����<���<�7��x�c�? //J�S���8Ξݾഺ���~���!d��\]1wu����Ʋ2�}곭��W_����7m:��땊�d��h��hts�b�%G��tr�&%��"���� R����<4C B>����///�_|���pV�\��O?���������;v�y��]��z����_|�����#**�;v�f�JKK�={6�-b�����b���z��� ���}�=��6h*+���ki��$��O���2�s���,,��>�""�NJB[X���R�3[�>[^*O���_������-[���DU|<6�ᘻ�R��8h���ֆKJp�9S_c�����`�� ����R��Ãw�y���D�5k���d�ݻw3n�8/�x}��Ғ%K�����Mtt4s��a�֭����T*�����ٗ-[�=����O?ͻ�;�� ���0�s3]k�Gr�4V��� ���+VP���sG����S_Z�7������3���D�EE���P���I�W�űg�4*�#�믱�4��Ç��EE��jr��\Mj*��@Ծ�C"�u������?7��!S��?��"�!7������W���Kooo>��S�����{.Ș;w�2?z ���;�w說����"�����o���w�ʹiӰ��"''�_EM~�A�t�`�#m�c�kk�@z@��&9Y_V��2PX[#37g�{�(1M` ���Y����h*+���s��3�ڴ4��0��殮}��q#^�V1��Q4AA؄�Qu��|�g�ѐ���;�:)���z�6- M@�9��m�����i*/?����}��l�@}^�퓤sͤ����Lz�شi{��PK�)bbb�6mڠ�3�H�R���7n���cժU<��ì[���7���_u��� D�@0̑t�t�)�[jk)ؾ����A�ʘ�_��1c����i�@�� �\��r�h�9��9JG�.����\�M��ssQ�� ���S���TJűc�\]�\���A�.�\��l�^�����~���}�m��+O������q��gg�����LJ�s����Qz�`����w���Ã�ݻ��L���ݖa<��#�|�n����s����͛7�����6h�477���HXXؠ�!�!��a��3�rKKZ��ٙ�S����+T��F��<@��?���P�w���g�~��G�;{��'^��kdu��g� �U�E�Q1�/"������Xg���;��9U'&b��ܹGE]_��î�9��#=�cH]v6�ޘ��S������w���Qܯ�Ψ>|_h��&��������i�W�1@[XH�o��q#۷w�>7W�I7����,�~�%g��~�9�8;;3}��Ag��٬Z���~��HJJ���������!����y�]<�/'�O�8z�S�������ё��n#��>g�e@��<_�UHH��5���ٴH�tx� �8z3;;�n�}��݈��p�lm۳����R~����F�Y�\UEÙ3��ڨNN�j��""�8q���Su�$�t�d�{������J,���3�g�tma!I/�@kCC�������p��Z*���4&��ĺw�,�v�"�o����c�ӑIW9;�\YI�Av�26M@�x��w�1공����2�;2隀jRR���cb8��[î~zxx�� gCn��v�l�B}}�������I���C�t�`�s� G=�/g�W_�T������R�?��#�V���V�e�NH0ه�;v�����X<���W��-�����'��e ?RMsu5���<�0�;vTv9���_gnt��L�a&�>;�̏>�2�)=p�(� S�����:>���,t--X��&(�6��hg͚�l'M�&%�Hܚ�>'�� k��j(g���o�M�ڵ� ��Ԧ�b��Mx8� F�s���90���������ʕh��oNs�bBcq1M��4��c�鉙��mQ����S�� ��O�h�.Z �d}n.rKK�lm���M]f��M�}8ΜIMJ M�>�K� &��������A�?66VX]��!��aιz� �X���_|������������J��$<�4;�Œ��>kPg�0T��!?��*�23q��:Μ1�Ж��մHw��2*�����̏>��� ,����V�cbh*/7�Abfo���{x����=�I/���5k���{�k�v��q��.}YwX^��=�\�T�@dT��&5�s�[ZR��l�:�������NcK mB�"&�� ��e �IIA3z4��F�km�.#h�����&!�=��YF��3?�Hur2�6l��rKKT��Ԥ��=�H$����DzMJ VAAX���tv6� S��c�=�\\0����c�W��X��S~�H���Re���|�駃ҷ��ō��0������Lr����u�H�׿�?��O���?�!� hmh�gٳ6m���׳�ښ�^^4~���N��&5UM���6N�w�~~X��"���>�4����-�ٓn7e Wee��۔;�+L�ښ�T���V����u���7��;�V��ڎ,{ɾ}���=@�H�8q����?�:;eҵ��z{�ݔ)F��������N��Υ(*����󱋈�*8X?����A�K��K OOO�M��_|1�����P[[˘1c�_�@0p�. s�bw�ܰ��s��z��,��d~l,�_��/���>�(e����3�H���H�R�BB�v-sbYc#��ֱ0�/Vlkj���A&��}�q� //rsi,-�.3�� 2��-���� ��7�;v`;i���S�}; g��m�y���/ٛ7c��ˢE���r�� }�U�����Rۉ�2�� V!!�����C5v�hV�^͗_~9�}����B��~��!D�@0����R�����?3�o'�g��*�g�̙�44�žT�Djf��� ��˙�~=���YO�?��ݔ)F�U`�^�פ� U*���g��w�-����N�D��& @/�ښ�i�l���g�B�R��Q�q�LKKQh4=.>5�n�T2?��9s���OL��{ܗ,��:����磰�5遁� &�ii(0���~�4�x\=. R�s'�o��ֆ��u���3,Y`mnNU��MKC3z4r� OO�J)�Z-�99���c�R��FcI u���M��okFe\�G�`���� �&9������� �3�t��\;�/��0Zjk����]���UP�Q��޸\q)/�LPGmu�����:u��vc���Y�p!G�����{CTv.~���,��S"=������.��^W�L����͘1x,_��Wb;iR�>��1 ��ƍT'$`��6�)�e،�\����Q\��mq))�9���ǿ�:�O=�ߴHfn���՘����z�E��ڸ��K�3�>������Z[����?�55h �II��#�m?u*3v��a�4�ss�}�!���̍�f��?����8kV�L���9��&5U��Sg9C��3��O#S����*8��$J�*8��؄�QEsE��ݐΝ^�ǎ�S9;�--����ZZ�o>d*Ns�P������S��hd�$�oh���ǣ ������,jO���`MeeT%$`e��� //*cci�j� EacCIG9�ƢR�v�iB`fg�E�OZ��_1{^=�!!���+I� ��ܼ=˝������~�Up0!�<������j\.�x�n�Oo/wh�I�S�9q�mMMF~sÌ}'5))F6�Q�е�����8ϟo��f�xR_{���\Ƭ]���i����^< ,?Jgg��F��B��쐚��ϻ/]J���c��[��%�Ba��I 4�GS�?M����f���8p`@E�<0 } ��A�WF���LzKm-��V��������,��$��o�Z��:�L���ۛʓ'�NH0�z҉z�(�������&, ���� ����"��m���ztf�k���D�!�O=��W�8g�{��p� �t�����Y[X������A��td��BB�8v��/��{�+O��Ơ��D.�m�b���p;ka�Mx8ڂ�N�����M�K�[o�8s����'�Џމϭ����+���X�K֦MX���"�[f̘������*�����E ���t�`$ �v����FGgg�喖���� �&4���8����.�m�é��D"�c;a kk���}��yX��J~Q� �:1���X�o������fq쮻�IJ���S��u�I���q���������tmm,���<&�eˌ� {� �V��i�\�� ++��z @��P_P��I?[�K�J���P��k�e� ��N>�~w�e<0c� |�AZZZ�w���?�����免��E'!����L�� ��R IDATn���������;���zAi���=��F!����� (޳����!�f�$������L�̶)�>>��ّ�y3��Zx.X@��OӪ��3�j__B׭�j�X���'�}�����U9;�xq�㚲���ٙ��Z����;���r%Uqq>��~{�� ��‚'N0��� �!���D*�֓n$�/6����� J'�n�̌�Bj� t��*������8�u{ɰ�y�<�W�Fdd]� ��H���=�|.�]������!5�h��o@��|ׄ x�r�I{�@�tp@"��-,4)��sww"iW͑D�/]�t���@�t�`$ЗL��n�t��]*rv��m�~�;��-�s9� ����bbP::���i��߲�n�Kd2�2�+h�S�?��C��O\\�\s�E% !��@��. //%'뷑� �&`��Emj �#d[wb�'�o���]��Sv��볳�ᆡ�bƌ�[���IMM%�/~ �!E�t�`p��]}-��0m�VZ*R1�-��.~�NN<��P��'4AAԞ>M}vv�U��Gxx8UUUdgg�mP��?RWWǨQ�8:�@0Ј��@"�u�I��~�ZZ.tH�B������S ���)?rmq���\θq�8~��9�������'*�j#����H�%����@޷�^�����v�D �o������P�s�1a��;v�ן>}����K \x�HF�'}����;Z��3?�8ԡ\�8͝��ĉ<��P�rI2a„�Τ���`D�`�"] ��#�� x��%����ܜ�C��:���B����ϩκ�� ?o�.2���@�t�`$`"�~u�I�U �^y%5#`�KmA���b@�>;mQр�'�?������q��n �. �HF��. Dz_i���.3���� u8�M����3d�ѵ��3,��挀b���JŘ1c�ٗ.<���A�t�``��H�r!��@}v6 ++�Ǝ"���)�H�NJ��*��H$���R��0 } ΍s����Ѐ����W �"}(i�_���T ��sm“�+��ܫ��G���.3�I��IN���~���.�q�l����>�ƹ��;�/*��A�J  4B�0gZ�ܖJ�N7ԡ.%L�`aw�+ڢ"T�Ψ��ikj���l�C:/�22p��J�H��<�ôi�GFR���ҧ��8�L�� � !���F4Jd�6ނ�O��taw���t�F���ma�P��+�ii4��u{�.#�E�h*+�����\kC�,�`۶>�ՙI����L��!%,,���|����u����B��&��� �Y�ڶ57S�w/����U��;{6�qq�6������(��}��wߥ`۶.���������C_8���[���s��Ք��KMJ�����ѓ.� z F P��w1�XT��������CO��ORXY�c��7���� �o,.������Q��v��R�{7EQQ$>�|�bi��C[P�]Dv4��P����� (��ѣG�;�.� � !���F�X���W�m{����3h��ԸZ�ZJ~���^��?W�22�e�X�͟O�SOq���8��?�#U*���v�3g(ٷ��s����9s8�x���<��.R ��A���w�+�{�h Q:;`fo?�v���D�����|�m��:u���Tj�Ҍ��fd�rqAfn�& �ˤ�(* �U��IJ��矍;��h��6:T���؄�!37G�V�b'���������f�ĹX^�FF��B���?"=s�l��h�j���A�lp9�f �99�?~����,LH`Ie%��|���A�n�o�1᭷�0Ҟ�ڸ�ɓ�IM��������dw�^�K+`w��}�m��t���oق�����;i���}�o����$���F�=�vhϤ���|�8~��o��~;)޳M@���&�V�ǣ���y�< v�0:W����Qh�=kb\��ҥ���2�V� ��/����O~pr���Q�_z���x�nf�Է {�uVV���_(;rd�'ޗ"&L�WF�N'2��0C>��4�����]�k )ܱ�I�ד���dn܈ϟ�lԦ��Qʏ�o��?���ÇQ991�{P����5��Q��OT?NKu5�Q��^� O�^�NJ"�겲�3�o� �N����ܰ���dl���^����[Q���0}:eG��b6���� ��]g�W��ߣtt�� ��-,$�㏩���v�d�o��� ��2E�_޷�"W�� '��ϩNJ�&4���F�P���IM���3� ֡���z+2���gQ���Ԥ�0����~;Y6�0m�Q��]�h*+�e�"r����c���>Z��NN�k�Jr>����V��q�,ʏ�(*��� ���GF�b���҃�:u�Qw��%��w��&<���cj� �f� J^|��69�7s��;k��f�����&ۧ��?�-^L�޽����������m�b�M���v3{{0����'d�)vS��ス��8~�e��x���Ұ�8�k�cǰ ��+(ؾ���߯?W{��"= ��Ç���sr�IN�q��lm��T���*�7�@��?b9jGV��!/3;;��s��3{{.۲�Ÿ�8* M@��=�����>�9�3i�$��������3g�j����@0���D۪#����׶ٟ|�T��c�r�o��������.ڵ�S�=��n ��'i,)!�嗉�<���:}��u�H}�5Zjjе�����BE/�B���� ���?�;CC��)�%%쎈��#��\Y�����}����S���};�)S(;|���c�o�����ϵ��DM�H��O�R[K��rh�rN>�(����[o���K�:c�_~I��Ӝ��~�o�ɨ�#+WR��OHd2�sr�{�!�&M����Ǹ27n�r�(�M������k�� ���$>�,�, ���h�ji���̶m�?��,!��'h������V����Υ��1dj5������\i���{��}ɾ}��^��"�s��T'&r���)��Z��{�̃��MO����d��_~!��Ǚ�y3S>���_~1ٶ>'������4WW�TQѯx���M7��� }j�-,D�G�����_�����Q��Qu�d��צ�a���U�Owۦ��ql��q��jJ��5���$%� ����R��̞�H<��3[[<�����'���D��Fub"�ysWW&�_ϴ~`�;�M� ���4�� '{������:�~.%&M�D~~>E},������7ff}[3%�!�m�H2���X37n�}�R� n�\���-Y�6ui�\]���'Weeq�w�1��a����� }�1O<���X&}�!�7m⚂,<<�� ��7WWs��{q�5�+�����\����ё����]�K/Q��â��~� ��q�6��?�����22��Օߗ.%����S}��'�@��ƕD|�)W��afg׭-�t�~��x�������W���_�~� �99�6���a�Ν���ӷmcA|<5IId��~�q��ד��Wx�|3ޫW�RW׭ �:) �k����8k�.�ƌ᪜">���K�)�\SP�e[����0���|�9�_~��Ӧa=n|`4N�{�a��ԩ�>GSB\[XH]f&���]�Yc?u*���ﭭ�=e �/�D�ѣ&OȬ����*>�d�ʸ8l��q��j\�����T� 4s>��E�� AacC}���a�͟O]VG︃�}�(ٻ�Ri4�4����ƒ�?�.������/!!�wd�{����ʸ8�}��>P���&0+�����n�Tv�t���� r>�\�:1͘1؄�R��L[c#ٟ~���iD|����\��&,�҃���@���0}:������?�;�4�]D�11ݞ+;t�cw�EZoKZ�Z2?��F3`��^ h4����1���&99����A�J  $B� ��:�0����,;t���d|n��R���D��w+����L�MXX�j kkښ�(��&������k�CC{��Rz��%%x�^��� ��+�K�P�/�vf�6�O׿:�H���zk��<�/�ʬ,}�ʸ8�~��nj��e�z\[�};���c����, �W���'�W]���z啠���PX[�TVFɾ}�~�511X�Z�&��oi��Տm��Ӝ9dm�ص�D��5�����nCj���H�k4���PE�W_�kiA�RU�u���~��> �XZJޖ-������M&����-\��ҥX��t{�۵�2��C"�PM�ϲg�4������W����ԙ�ݡ��.3S�9�gH�׿����5))X����-�~~T�8�m_EQQ����˫�,kֆ ���{g�$��/8qt�݋ˢE�egw{Mytt{�]����][J'���z��d� ��Gw]t� eG�`��˂}ʤ�j�h��P���ܜ�n������S��������2'}���[i�^�N����7r++���)ر����k�e�>LuR���n�MaAmjj��������W_���KC^;Ǐ紁M#���P���w�]�8��q0y��>�����9"�@0��>�4��PI{�Y7bfk���;5���$'cIC~>E�Oh�Vg��j��i$|�v��'__�DF������{T�����k�N��4o��q�ٳ��w���,f�0jc�3����1���2#�� x�|3�[����S���XZJKm-� ��OG"�\�l_v����Y$��"�<<ط`I�?O�{��TV����6`=n\����Ng͢d�>jϲX�m����cjtL��‘U����áe�H}�52֯G���hP��{�j$R)ٟ}@֦MH�r�β󘢹� ��%о��%K�{��^y%S6o��Z�+�`ƎH�JZikj������ۉ����������vy�~ۣ�I���x���H}�5�}���F��[Z��� �26���X�9��yF�VK���8ϝ ���zb��� ��~3;;"���������D!��a�X8:�4��P�z΢w�*�������f� �,Z��,�M��t^��ɓ���id���z�qRz��љ=o��7� �F�q��޾�Hm*+����V��Lް��(�v��>kk$r95ݔ��v�c/Ϣ��Q�x��u�������]ES�ed��d�����"`H֦M�5�'-W��������O��3k�n������Κ��5�V�"s�z���2>�ϕ+�ߓ)ʣ�I}�u����l�����3��~;W����P��ܹ�ڵ�} Ҫ�Bǎ���|ma!�L��_�R_��Q8͝�>�2X�i���xצ��kiAacC��S����Y���0�w�&�����Z�=����AT..�;��}|�lM���ڨNH`�g�1���5��(��W��ϧ�����j�g���@���XSv�0Vc�-��ɓ^���'�S��h����CZ�Zy�eː[Zb��FMj���������J�������H�27�.5���F�[����{��m�� +V���B�M71���v���v�'cfg�%V�I����C����q&���O=���n����;��'NV�����q�>��FEL ao���9s���{�fϦ��!�~�2����L$��R%""���~�Om���o���E����"=��h��f���z�I�G���+4��w�iw4UV�TV��M7�:�k)��lY�Ν����QQH�J���v�$�v�2��p�ή����Ƕ�&�ZZL�Z�B�Mhh{������Y���J�d�����.#��'p�� ��emڄL�d���F� ~�Z�>���g��}�d"&���Ѣ����ۅ�Y���2�����ڴ4�x�Μ��c�Q��J}N�������Vt���5�G�b��U` �D�tm--�:~:��������6�@?][�^�מ>M���d��>��c�,����[*�� �j����h�������ˉ�I\���� ���q�Vo����ۛ�#GL>c@/rB�y�y��ڂ#�^�?�nnx�XAel, �����$�ƌA����ښ��* u���g���_���}gmj*Ns����t)ǎqeGm�},�ff����mBϮd�>}e%C�V��}ɒ.�Ǟ7�@��/�{���ޓ& �Rə��������� �,���Q��Ry�6�&h�t�Q��������[��p�?_��ѣQ��z�K���Pjjj�������d���r E&] f�>��$�ֽ�ѓ�q#6��w[)�o��^x���?�����4���-ӧ���G�O�������_�g�Ma;i�����(llp_���w�%o���Oo�^��=Ӧ�'2��oK֦M����¨���3���2.��O?��������d�O?��k�e����~�A���!�V��a_q^��RIꫯ���T?N�?������5��6�6m��꫱�&��s��l�LѮ]�t��co�-^L�o����/YB���G�s�u{6��cI�ڵ�N����I�s2� M` J��ݑ��4WVbfo������j$r9�i�������^����ښ���'�ɐ*�蚛q�9��������I�:&A�v���xlƏ�a� ��}]k+?lԧ�e�1+* ����22�s?��x�3?ng��o�۩������N���T�:�Up�I���;ڂ}�h�(�^u6��s���r�h#���ޤݥS����#Q(h���2�n*/��ĉ.�M@��z����*>�����~wމ�@�X��P�����'f66 �P���R�g t�q㸮��x��! vEE ���8s&����%�^Mel,��]�m[�+��I���{� ��Q�܃�������?~<111=����D��ܰ���p� ��F���I)����6t�v�.3��{ 5�b��}d$�6�Y�C{�0�G����\�˂�{�%�z���l�L�-�p��{8~�=H�R�����a7e ӷm���s�؄�3e�f.Y�������ĉ$>�,�%%�cfvv�<�,��)V�)ڵ�{���O�����&ƽ�+V�XZ����&�;L ���iӌ����q�lJl�'N0�{�m����a�tKJp��Z���>H�֭t�fLѹxt��� g#�.��D����L�TeM-8*�>Z��/+zy�{��.�A�?N��wi3����Ns�2��q겲P���7n1��D��Ê�l JGGf��͕����a���m��e�"#�T�w/MeezK �^�M�C[X�����*7�.��Ϫ�u�x�x��s�_��܌ڠ���lf����rO��;?ܾ���_� P��K/�����҇!��k ��'o��m�q/�ȸ�6�H��ᇄ�� yy��L"�cٲn�i��Gaee�<��*~�9��NvK 2 Z�Z,}}��ӟp[����>�k7��7��Q���ߝwb����^@��t[ �K/Xx�8 ['�̸UH�UU���O]f&S����͛���ʎ�m�b�}����"=y�:Ծ���Y��Y��ڐ�d�� IDAT��C�?����s�DSYY�^���u�����S����+$2�>���IFf��@���S���αcQ��1�Ϩ:u��w�iv%T;q�>�C�<����d}� *�&O>��M=�t��&k����pR^~���j32z�<����H��F&����6vW���hT ��>�HG��"mk�"}�Q��'66X�ؘ<��q#��]�L��`�R^~sww�r�H$�\]�vC퍖��v��5�p�H~�E�Ǎ�u�MSH�����p��TF�����$��W�v��n4ش�ֲ��˩NH@"��0m�7܀�5�`�����$2^^T'%Q{��~�C�c�����/H�w���T>�͕�?�4JZHy�곳��+&�Ӌt����h���o}IJ�T�Up0G�v� wZ^Ծ��c�%%4�����th�\�{�j������a��w�X4���ef����x�p�;ĕ�ĉ4���XR���� �N����)Ծ����L���ti����v�D���)�������m����̣�4�w�}���"3�LXf"1 .^D c�qV�)j�-�/$�O>�V��h�}�RZ�����u�}�/m����>���d�� Gn��� ��|sIe�v����1c��d�ֆbn���`"���%�9p���;'�މ�Ϗ��~B��YHΗ��=G������k������sMց�?�.��O��Ԅ� ]:�����={�hSy9E�v�=Z?�2̤W'&bB��sMA65� ���C�V���GX�� �T;FC~��� �c�"W�q[����DVVVr���I�!B�0#Q�C���|��K$Xx{�W�v�cv�����b;q"��~[�1�P�iw�����wL�%�v��^v�mMM,..F��oәI�MOo����rfj1���I�ٺ���j��ff�@����[�IM�c���a�…���[<ӱV��$p4��ÃK�Op��v��?x\=�|b�D���S�כ�0spЋ���(\-2���'���)4AA�eѲ�<��}�P�� �I�7���yy�db$1�|�=JY7����E ��>���L�@�W�j5ޫWȚ��@��LcI u�Z\mX+��ԩ.1A�ݥ�����~;�!6aaz��@����;v,���x�رcL�e�e�@pq"D�#D�@pq�rvF��Fytt�D��#ڢ"�}Q�U7�H��f���}���,�2ss">���R�A/,\�������ݻw3�`�^�@0|"}�qR�(nl�0A2ss� ����Z����6=���&jO���D�ٳi,*�i޼����q�1����D���,X��_~��6��8rss���b�̙C�@ 8W�H`�rJ�'] ����H����k,G����ijRR���&NO��#���a%�g ��7ŬY�P*�|��7�c�w�&22� ��@ X�H`�2J�D&] ���?��S���=��󣹲��_���҉��Z�ȇ ��\��Y*���8kw�\Σ�>�K/��?����3o����A����LN]K�V�[� � ���^���u�����ᅬ�E��8v�;>�0� ��[*��!�;�2dR)R���'��n�����۷�g�����w�1�a]4��7(������"D%�`)�R�$,/�ł��������y�\������Ν��3���\R�ym�CH$��� ��L�L*C.��G&� k!�R�x�Ǹ��;Y�f O=�.gm�u)�Ӊ�`x!63�2J7W u(��<��~T..x�x�P���E[DZ� @[�v�����H$б��3s.�J�Ke(�r� Z[[Af -��K�9<�TTTp���u8�y&�4�$E�����TP�BK�;��V ��fr�KF�c�^t~�ƪ �lG�Hs]�P�sѣ��ڳ�?R��L�B!G�fFk����d���H��_� �K7H��B� � ��H_�nEv}3+�"�@�����\�bI����W�$T �.��*T��D>� �>,J��i��E*�vX\��� �2)M ��!�&��@ +.I���h{t:x8���Z��x2�k���\-Y�fuNY��6�*�L�=�/g�\[��������ơ碦S�f��2��M�vx�r9�m�X�BSe#��MC�`0hm��>�.���;<�2m�3}&3�6�=!��;*����u-�����Z>˺��]u]�����"� ��{BK����d2�|��I&3�)As_�%�����9��<�s?�~�$��cx���WLy6��|\j���>?#�4\ԃ(�G�fR� �"T�u�}�C~�p��QFD!Si��iһ ����L��/G���I���y1E�8hif����B�����`8�#�������W�Q�d��W@ڇS�j��D���kp������ަV��)�>;���dCH�}yM+�*-|p�̇�SN�u������<��#,\��d��6��G!Wi����q!S��BǨ� ���}2�2>��χ����4 o�u\����&f15�w��n� ��ɻ�{���K �����6Y�L?�=�v._^���'J6�}Q�>�*�Փt?peF$�k[YZ�B8{s{�(����y�P32A���(�6$�(�����������K�]�>��h�u�V�v��F:�t�Ǩ#㐫�̞���#�A r*3?�er��A&���P��~?�MP��!��J���^��\'N��J}���k ~�~����_�L@�������7~~�(Y�.)S��as��Hz����F;�lh����.y ]e�䂀B��gd��� \�b`Xd���6o �V[�vS%v����?AWԇ>�ر��Ç��a������]v�D�}.�'yT����H�d���m�u���P�x? �6�^���H�H�I};,ډ�ب���E 7RGn�.t�և_ Z����;�0�d��W�K���dA���e��NԌ��ra��3�#���:��`s\�B���'Q�`n���IzN��@#�� �%X<%�Y��A�&�҇> v���u�]w��[�c%q#g���*p�,(#�r�\ѧK�&‘4?�����L��'���f`��?��dw������0�`�}>�>rY_Ž�@�M�txqgwM���é��e�Q��#\v?�#���oػ�݊���$����K���?dfA��]� <6$�s���nA��۶V���R&������T#3���{�F�E&lm�3&Z{��}81رcÆ ;��m>X�G����V���{A��ւBwjH���^h+$ ��#���%fE+Z�<����&�'Rur^��6�|� Eg9�XTR������)���߃�\�1}PX��ji���N�Ў;~q$�����^,j`�I�]�1�M1bPG>.5s��r|@�V٭hyw ��jJm�>�އS 477ӯ_�~ngs� ?��׃�iG�&oI�ɭ��� R�3x�_O�8z��H��?�*R#4�TP�C�2����>g�P��<`ٜQ�ҥ�݇���i�Gdx�-a�qYD�^�r��� �/��;}~^(l��}���Ұ���.I�W�-,,3��IG-?��^�Կ�[ۇ_!���Ev���D���v�S �2B$���\� ��}�j��4n>�H����W��:.������v@��?��M�a����/�ʸ���ŰJ�8;5���ܫ>���iG���Mb�F���-��{�6�}�,I�fQ�q �_��E������ ��|2!��Ӻ&�3��,�����b�9AQj��Y�>��7�n���}&h�_.�a���S��3�V.�җ}F}�j��Z,b�8����Nꘜ�zl�����#o� ����˒:�YWt��r�a-/�l�BZ�b�,>���������Յ�"8�͛]>ǜM5� 1$�:;l$�mk�ck!v�dZ=1�0�S��/�la��L5E�qz6g'��Gq���N/&uI�é �ݎNw�n���b��ߣ}��w�����x�a���ti�� F}�j��g�Bg�2|��4��q4T��q�HU �Ο�dP�h=�#:yh�'*��~b�C�pY�N��^'�:-���R��]kq��N�0N�\�EՆ��\�X��m������!�M5h�R1 ��'L$�c�"W�ȝ{'ѹ�97�����~�������ۍ�9&��G$���f�ۇ�����ύ�{l��ڣ}Z�K��&��������߼y��;e�YH?� �o�V��~r ����������d R������ xrk���I��B��7�^GKy!?����; à��c�������a�mc�7Tv{���<���ˎ��zlue�֔p`��֔�ݦ�p3�k��~�6K�:Gc5ژ$�Z�$���ÊB�B�'~�t�}r�ށ76�̾z~:3�y)��#���!J%�+V��)��C�}^�����VWF���p�E�����^O��k�d����4���)�AD��qѰg����Z�Hʖ�Vj au�' [ >�MtB���� �r6^4���b�j����~��G��l��x��4�� �>���N�q9_w�iq �t����V[��OR��G4n�|0�[����4��6��8����fO[�������` 5[�����6 -�{��=l|��A�9{C��d1 .�nkA����#�>�~򱨲�?l�f��t{������E��)�R�����~�U��x�x�];�����޼���ú�^��P0�����_���� ܭf�v�x����|�����7o��,M�4�n�Erv��H���F��~���M߆]�6!S(њRB^��P��+��0>��X�B��1�d���1�?����w�5[+�)Y�.��z�q9��l�$ٰ��e�m�De��rh�Q�em�R��g���jNK��Y��.*�~ @]�*Z���߻�I<6s����"u;<��8X+�c� ���+��J����|㾐LK���3I=�R� �T��gS{V�^W�6& �![�!J�����nE�V��������)G� [\\���ƥ2�t�;�uF�Ӄ��٥�8������~�6����c��)���K ��\O���X��l��z����@�����8�\&�c�+��{��������x�6�&j^��3���6�E����?�o=�����!i�p��Z�I��6�t,��������a�U�_�R�2" W���^W����e�Ǐ�R��x ��C�����x|��^b�}g���k��q��X|E[_�5�zw��Id�gϣO�A�~?Q�ÉH��V[��/~�//��z������1��Rc~�1����-(4Ҥ�s����@���B��ݾ����݊���\��ng&��f��ji�w���ml2��L��fZk��VcH�eƒ 0�����^�b��@��!c JC4;^�cP�}�'OK�� �����d��mU\��ܔ��<���!A� ����W�����"�Φ�~�HJ}THaT��4n��L$i~�G��F��~��R�}e�� h?� �׮�f���q?U��ӟ���0�(����6���5X� �:m���l|ng���h��a�z.}��?P����tED�H�q֤��ps� ʁ�_Ge�F������f��x��1���������K���3��ml�=���x�a�:I�q��-R�7Tb�+���7B�b9��� �t�����n_IT��rF���1f Ae�9*���j�'������ ���T���Jo\�F�����>0d�^��V�~Jȳ�i�Ð>������RK�����n_��7�γ�����0�nm��r����-�ז�5���O��6㱵`.)�|0{}�8��s����b�@�M5hb�ӯ��j�,�Z}P�oT�$�@��3ӂތS�����B���c�OLA�Ѡ��%�/�އSQQQ�@ss�4��}�> u� g[Qaŋ^�|�g��ʂ����ODv��6���4�u%�ڍ..����6؉��#�m1�_�e���x�v��~���B"���4P���h*�B�w��^��݊�dΦZLCO�n�X��a� ���+Iw�����ΰ�XgKʈ(���.? ����w�gǫwK�d�� �L�a鼶��f{�B�tk)����Z�L�'bP�r!u;d�{�����Yy�T<�V��/��jF��Aڙ�!��A�:2��g$��h %K�E�+���=����e�8�"I�Օ���l~��Q�;p����@ܰi!����kA��M<��N;�fM��B ��U��@�ލ��m<�-�����Ӱg}��ie?|��g�~窠u ���o$��di�����7��]��[m)�x���s{e8�kКRq� ���wx���� ��2"�TM%G{+zN�n���{G5ύHĨ��#�}$��>z*y�R�Te�_֝^B�V3{>E��e�C[O��I��4�*}4*C ��Pb��zh޿�ı�WG��ǁ�_'��+�+���Q�n�oCÞu�;v���%]j�a2��NsZS iSE�p�qGW��W��I��i�p�6��y��:�����T�B�.>���!۹���M��� �)��۟��B�ލ�ZI�z �䜠Z��^�Y��ތs�by��A<�����ŷՖJ2CZ��H8�$=v�$�'�aۿ� ��7�߆�����������f��������ML�8RO���)�P�q�0�^��C�֔`�t�$������b��s�����E� q[��(�𹝇����A�5�����g2�o�1f �|Um\��%o�oέT��\Z�h�E��I=�� ���p��cGc5.K__�A����G�gᓬ�sb��/ ���s������ߏ������ƊDA��҈��k�~�W}J����.1�S��@�:�j�D'H�51I�jE����8Zɽ�Nq]l���9��܎^���v;�?e��r.O�<�C9,j�}$�� �T�⵷��U���i�|㾠�w@w�|`1'���vCx��.. {mY�r�� ��Ed�0����g8�{���x#���Ө��#�V3�� :w�#�����r��� s�X���ߜȸ:*�>*dyg��+�y\��� ڸTdG�>Z� ���#�,{uT<�ؤ�{]��c�.Y�^�i�T� �a �]���*]��o|���c�����K�l]~L���� \��{����2�G��i�i$O��|:�j��$2즿c�+�i�&i]Ky!Q9#�>�����1��4i�.E�P�s�X���G�dU�rj�:m�n_A����w�4���e3��߼�ޅO���H�Ps��d�w���롵��)s��?yEP&���t$��_�����Ѱk-ŋ_���m_���//��\R@K�^������I*C��Pb�A�H�Eݪ���l�Ee�A@i {��6� `�+���*~���t�����FAG+;߼��e�v���Tj���I?[ B,6�}�֐ g � ���NIb�j �"MhM)h������҈�ڌ�`>�L�i�$�Xq�O�q�|+~?�ϋ&�=0�����<���D��� �����6�+4=�G�� I�@7fG��a5O�ܥ��4��Y��u$�>�!F���: yZ-� �$O�Å�ZȜqM��iL����C���V3�\ADB�q��{l-292�� �9D")����Ke�=�:�b iy4��J�ɤL����ؕ�3`�$PF�����C!��� 7�5�H��Ya� ݅��PȲ!߷�i��G'R�� �9kE�L.��#M(�:�/�w�Ś�e����E���\���n�F�͂��������Y:G�/�X�t̊KWE� IDAT]�&)�(�淋�����ϭB��V��h�Em4��KC�4�n�*&2kh0Ios�p�,$�9�a7> mv ҉��өܰ8��6��D}����Z�!?�;MLc�y���W����fVM5l~���z �EeuU3��+������O�ZY������3PG'P��;�u�#��v@P�O�s;iڿ�� _S�� �jK�{g�(�m��송����t�Q��V��E�]-�D��..��+MD� ���R1*|$8�k�'e�Y(�����8�� V?83lMI�����ܭf���Fe n�&����?D�V���l���cl�!��(�Z�V�eil�o2� �&�)�9��&"9gs����1f��C�s���n�*�NqæI�sC����s��}'�YCd��:�S����hvpUFC��.��~�A�gժU�ٳ�����+<���̘1#hټy��ӟ�tB��p8ضm��>���*+V��lN}~��L�0���^�} �?��y��վGIWc���>)Ӑ)���A$�m��m{iEf ;��ɘ�w��l�)ww��> �1���מ�c�d�4a��$b���R^H�ȳ��������iGm47�4�n :��\G�O���qS�~1�����K�%q�,��� �cg2�*�:#��W���g�ӿe�e����D�V&s$,�i8�?|,d��i}� ��66��߼I�[tئ��i�H/؄�3����Z�Aб��ft�2�&���[Ϳ�H:�J&�r��W�9��q,hz�;�ܿ�ߋ�����,@�0���l����ʈH)B�u9pZDi���}��3Q� ���#�< ��Txh9������O]4�n�'�N"3E����h��l�D4;k�?(�bp�^�ZX��E�>S i�.���H����+p�4�\�>����J/z���+i*�–nbK[s5k�Ɂ����W�Y�l)����.K*C 2��>��_�ķ� ��h�T(izZ�uv����Ȭa29�E[{�[�VQ���h��P��]"��� ��.E�F�MCO��E-$O<K� ]���9$S�l�Ř>�J$�Ζ��{` v�QG����M���4a6�`�z]\2����M&}��A�SO�uT<��� nk3�_���q*��.,�pI��He�-��P�b6�9�3B���jn���y��Je�={?8����:�m۶�R�N���� n��fjkk��d��j�v;z���o����z �\Nuu56l���e�7�m[�T瑐��ݏ�zm-� 1bt� #�S�r!�#�DP(���D$f�Y��~���&:���Ux]*�|Nd�@$u�6�z bs<౷ �@���9 ��OR������ '�v�Df �4d2Ns=- �:V��ul|�L��:��i��4�'�&eʅRR�إ߸�R���J�y7��S�C�4j�|Gd�� �z8���$o^ʠ��'����Ȝq ~�s�.,�{h)ۋ!m.K��K����8��C4�.ks��+�I�������rQ��+�;g ��lC��.�G�L����\�I�� Z�qXA�%d"�m��:u�U�`Qj��G�6S�u9��]BFЄ��ڌ!-���)�g%���L��VD����t/��j}�!�/�[�>� ����ɤ�β��N�C@��W<���n��D� a��4m�f���X +d-�����q�PG�a)��BAÞ�����m������, �3�1�E��$�ii��&:��������E匀#(�� �hM)���޼4(�v$X+��辭�$H*��O���H�~%��|�B�2��&ÉC�P��žO�N�闑4n ���մVD�B��Z�u��D�E_R e�͵Rt>���/�q�FM�Ly��A ��C(]�1�/��ԩ���?CZ���� 2Ͻ����T�)I���� ��=�#����p��._|1{��a׮]��曌=�^x�G}�8���aɒ%<�tx ���?μy����d��մ�����®]����{�׿����X/���RU��".�݌�M@t�h�W}J㾍��1y�����GLQ� �RZ�c3��Hz��ݴ��+�e�Ml~�z�~�$�wqg����^ 9sn!~�t�ze+g�VZ��N ��{1� "1 {}E������Zh*ކ66�i�~/y�]�>:l����MT<2E(�Sbp4V��ӿ��fv+?=r>U�tymu;d���Ji��NM�}�!)�/d�C 1f "2k(��?Jk�j�|�$D����ť�1���WK���D�K[t�ck�ML";^�#��H�ׂ�H�u����n���_\�&���?|7�N����ܹw W�����a��&�v7ıV�'���+���}}���f�VBk��{Z-(�QLz��̾�˱����;�yܴ��a���Oɕ"� ��b�)A���IO�0��/�t��߾M��^��6#�k-��~�2AҲ�,{{C%��$�)�L}j��� �F������h���dϾI��4d nk�4)qf�{.�c�i��= :F��~e�DV�n����)�ڶ�:� 郮|X��ng�z*���0�lbO q��V��v�~�o$ٍRgD%�&!�0nk3�������_���N���(�* ���͵��N6����� ��F� �0tB���o�1}P�lM��h�������J���$�������Ը�׸�3�^�r��g"##0`� �w��}�� �駟�?W]˗/g͚5X,]�`].�v�bѢE�Z����PK;��Gaa!�/f���8��>ύ�����J�ܸq#�}�]�6�����o����k[<�шN��Y��nJJJhmӌ�믿f���}N�f3+V�`�ƍ��n|>%%%A�a���<��cL�:��~��)S������ 4�Gy��[��V�F%�^/۶mcٲe�ֆ�<��n6m�ė_~ɪU��� -`������HҚ��*�,YBAAAȶ�����V�X�����������ku:Ē%Kغuk���� !!����V�m�Țu= ��bÓWQ��G�:c��H8(������4A��nk�Io;W�"2����W��x-�{8���X���{�8�#��S$�#����0��MF�+$�j�+�4� ��;x2�����lO�w�W"���2�w�~/{?y��<���8l���K����)���"���X���=!E�ԑq�H��N��C�d�Zw�V@��#�-Wki�>��O���b�U���{]9:~Y٬#��s�1=5�L8��mh޿��oߑ��\h�[Cȑ..M�!�Xj�-�4x2 �]��&ѫ_�qr�.X�d����B��B�u��� ��i��,x�A�6.!n�4t��I�����V3�ϟ1���S��x���*��},�$�-�߈�d� �)�n�JJ�����碥;�w�ݑ]��rF`-/�rh7��A���!�U�͵��K�9K��U&@��f���g�w����~� ����ɧRk�,��~p&՛�Em�Dr����.Kƶ��aME[�����CD$e��k�.g��G�y��(:�Rr��: N����0 iwBQh �ۮ q�9��yE���ڌ�f� ~+�/�4l��^m��i��i��i�[s�;�� ���.ǝ9��G�!���`��3���!�_"z=I_�`'Y� U��% N/&ձQeff����Sm6��?>���}�ٜv�i$&&���/��o�!''�!C�0w�\�M�F||d����L�2���L�;�J�b�o$n{����V@�� W��q�ٞ�~����Ѱ{mX7����Ms�v|���w֤w��..Ur\���%"!m\*��6I���9��7�b���{G�}�1T�[���&|�k�ZQ���� ����I�����KC��`��7��=-e{�:�AQr]R�^,�x��e��4�(t�R�~���M�b�q��4To������jF��@i���b�_WvK%�qE�(K�f�.^.8��z�W���?��G�=�� �� O^���H�K�4Q�� �.��CRN�H"� 4��H}�F�� c~�:rM;I?��5j�,���]\�Dl���!hc�)��?���=��a�=oc<9��D�T�KȠb��8�jp6���y�:��i�;h"՛�Ҹo����e�a�P�}%�?C���!m��4 iy�c�O��݇q4��T����l�����4l�%��A��-ٳn��߁赻�L�9�J�����oC����<� Oʤ �< ML"���g�LV��Aku  ��� T�v�(�:��c[� ����R�+ˡ]$���1cp� �\���E��9�߂L.�tx��ڲ ڸT��z��<*M�@t��Ֆ�6��D�z�E!��4dJP �=�B�S������^O�74�����rA�� �[����J�<�̠�]v_~�%O<�d˖-\p��v�mA��M�61{�lRSSٺu+.�����x� �F1}��z�3gEEE,]���AAA���̜9����������k���wߥ��N"�w�q˖-��w��j�R^^NYY ��M�{�� 6l��֭[�={6/��2+V��q��3a����p8���{\{��!�+((@��2y��n��ꫯ淿�-���|��Wdeeq���M�t:/�����\.6l��UW]�C=IJe�B���/RWWDze�(,,����믿�w� ����d2�v�Zv����^�[o�Œ%�҅��V�M�FMM ���:uuu,Y����,�Ν�#��ᐘ�أH���Y� uD���1 �BkՁ=XQ��i�����"p��B)2�2�`)_>u���:������@1d@o��-�z,aS�݁&&I�u����%d�O̦�x�a�����ػ�I����~�a��:�:�8���A�e�kQ��yZ�.|���5�*�7/%q�h�R)��<�V�lm�:E�eJ5Q��q�4�h�F����Vh X+�S��{� ��T�E�N�# ]��$�?A@/�w��5�� ���Ђ���g-� Rr|�_�:m��>� MK�>��"��HME[����ijس�����P��é�����dϾ �΀B��e�VWƎ���i��w�>W[��\Ǡ��$��$b>���/_���I�ƶ��rdq� dϺA"�.k1j%����c��'�\�]|:i�.%���3>gsU��4���#������-j�4���&�As�l��mm�a�YJvIR��R���� y�����Z�Օq`�T�����v+��j"��H�f��G�H̢�p >�[*��\���w��8����i�GOd� g&�\:���ͽ��W<�L'��;�kq4T2��e���6) ��8IfS��s\-���a1هãד�j���)QߊZ.��I߻w/���*/��2W_}5�wiii�}w���e�X�t)��r <�����5���{���� ��}�݇�``��Ō9�BA||��CRSS���̞=���+�x���###A�~ ������#;;�ٳgs뭷����ƍ�n��~:�\s )))( ƍNj/���h ���('���O9��������G�T��z�L&��}&N�Ȱa�x�gB��s�=GEE�>�,7�p&���3g��k�����K/�ԣk� &� �͆��}�J8*��4��I�w��(u��t�!A&���;PG��ji�ei�r�"���>�?��w�Y�R'��l9 �6mfs����}x���C�@�Ȅ$��ɒ���� ml2��L�^�TL��cB&.K�yc��'Pp��IĘ9��~#��RՆ���|Ff��#o{Qz�3���{QFD��uˍ8���D�jA�m��-����}�X���"\��.w1 9���-u ԚR$�Cj��l�TB�Nͫ����xnG)�*�� &��X�{}9#ny��� Ep��x{>~�� MpW@��T(J+�EAЀ���2��;(x�!�sG���G� 1A$=y�V��):�t�|�O_ �L�"��H41I��y�u�����bҒ��Jz{]|:�|��y � ��"{�M4�!ȶ�|T�� �Q���&m\*羽Gle��)��q�F���.�q2��V��C�ݒ��w���[���š~�n{ k:�-��Դ�~�OD$f���G��f�U���GI�wGC%��]��}�~ɉ�ei�����4�7kya��=��J8�"M4�����.5ƌ�$�>u���w��뎵H1��b�-��T+�}�p������axԩaL�� ؽ�'��~�z6oތ�����T*Y�t)cǶ��׮] ����Y�b~��χ��g��������q�F.��bccÞ`�vы��E����8p [�����;/X�c��^/�g�ZͤI��#.�䒠�� Bll����w���$%{˞{���5���C&����8N?�t��q�(���)--����ߏN� �2g�4���^�g̘1!� w�~�����BYY{1�ڵk����`0�|�jޏ2����x����� ��������Q� _io2}J�.���`���w dr4Q �n_)���6Қu�u4�YGKy!��*R&_��\OS�� �����oCd�<�~u�?o�i�g��bdy�o%:w����!����Hzc�DD�����:Ci�� ~?���#X�E�g �����{ܔ,{�]���_�N�y7�;Z"�����l�A�+P�QFD�~���pP�;h|F�6w�p�1�h����wN����76H�;���Ql|J$`ZS�I��7��{��LN����{��1�ۜ�r�8d~ƌ���n�HSp�&�UDd�Uc�~��'�/���H�4m\*o?$�y�"郮|]\Y3���V���%��9��n,��%v��� �� @m�%��;��s�� ��h�. *c,ڸT�:#�'0���QcQ �w��5!��-�ؙ��&U1^�-�2�n|����ĤG��.����{���qS��1��i:�_H;���e��D2g\s�B���)TDe�v��x�6)��QJ��"[��J��hM) ����{@i¯�Bfm��X��ڌ.>������#����ߑl� 1�L��t�:�Ĩ�^a�Ub�� Y��9û�� ���~�)e:Z+������ѹ���}���Ǘ0�Η1��I������SۃN��Ġ&D�}�Eegҟ?��jƘ1(䳘�C i_�gZ��aHؽЇ.��I��K���71�)�@���d��]w���_�?���ѣ���|��ׇ�W.�3l�0�/_~X=q�|u�R,//gϞ= v��� �R�7��Ά ��O0n�8v����������!��w�}(�Jz�.������q�"��Ayy9s�� r����;f2�#a���ў�砪��[o�� /����!y�@Z� �Y�x�X�E$f1����d���(]�1ƌAh�)���=K�.�g<���|@�ٿE���CWB��r�$]�����ӆ�����#���M�ұ1��ԭ�'��Fd��~��=����ť��,E�M���p�=o3�ڿ�=�&:��Hݎ����:F��O�j]��|wƚ;��(#"I��}�~E�f@2[/�խ@�S㒫�H���^ {� ��~��w�,jb��)T������׍����H�����z�� T��A&���ZS �#�3���z�I�L�b��FƯ�e�{��ثy�6��:��Gl�eH���W3�Η�2��8���� ��dr��+q�O?���O��9�t�Ks��D��""1WK{���R��kc����D� q�L�* ZS ^���]kٻ� JML"�u:��#A�+0�E��ݟ�g�L�SO����3�|��pt��$�������(���–c����?����y�.��"Ǝ�����曠m׭[T����SYY����ill��ݼy��A~�UW����}��GQ�h�f6�����z���<�srr8���y饗������������� ���cݺuTUU���/�uI0`<�+V�`ڴilڴ �Á�磨����~�aÆ��[\�ѐ���_|!I}����?� �Vz�}�ͥ�^41�x<|��!�������iӦ����ȑ#y������1��T�IG��h���)Ռ��k!/��g��y�Rⱃ&2��%;3�Z�ϯ&mڥL}f92�Hr4щ��ZRO����gK~�ME[h)���.T�\-����C���v���+Jڢ�~�_�x�D [�Kط��.�|��\���f)�"���GN��rI%��Q�G85��'qZ�D�C�Y��S|>yyydeeǺu�x뭷4hPWC ¿��o233�8q"������R\\̕W^yL�C���R��I�&���� /���~���裏����{�nƍ�^�G��ӿ{�1n��֠�J��s�=GMM ��员�Hff&3f�8&�y$��dzx�b�n7C�%))���l�Z-��� *2�)4 �f�bԨQ,[��M�:�|H����>ow0��� ;PG���y#�/ nb��cW���L�Be� &'���Ǿ�4d )�.���>z-e�B�tJ}~���}���\��OgD�P���;(_�)���� �sn&���m��@t�1G}��]p#o�Q����:#p�����m�Z��� ^#�!u)�ť1���i�U�X�N{��ޱ�1m>�Cj���݁^)�q9���T�h�j>��g�Nz �8�kž{KH&Me�A�3bH�Cm4��Qx]v,y�� s�z2���q6�Ҹw#e+�r�n�3udg�ml�=B�1�-.�C�Ы�o��C�J����N6��t��GFF�r��ǒ~�af͚Ej���KOOg�ҥlٲ��;wRWWGrr2&L�_��B��o���s�v�Z���OLL S�La���Ըq����g����޽��� �L�Bbb��뮻�����w8KMMe�ڵ|����߿��#G2q�DJJJ�����]�p!C{j,''��+W��,X� h[��S�R^^Naa!Z����tIj�����o~Ü9s���'??��N���?~|P��y�:t(&Sp5z||<+W� *��K5j�}�� 0v�XF�EAAA��H�R�r�ʰ�(�<�LPQlZZ+W� �lx���j� �&N�����Y�n8�N��Ҙ6mqq�2�Gy�G���������w�}<��#�w�},^����Ot��vD��m *��N�,�!�.2k(�ҽ�}^)-|4D� 29�?�k�V�;Pc)[��!�$�/�خ��:����Ѹw��Z�]� ���q�ԉ�XC� f��n��v�P0�^�B&����Rg��i��f#=�!uT<��ֵ9���c��]<�~?o�1��@���s𛷰V��Ή������Z.Jݶ��LZʔ �6A&�W��T�h�^/>�7� k�p6ײ�?��j��9��߿�<Ӈ�^M��^�S��0Р擲��< �d�F�1��ѣG3z��#?111�b�3�z=3g�d�̙]n����|�Z�6Ć���!n%�Ǐ�;""����-��fC�ӑ�'Fg<�>�,F�1Ȯ�#�z='Nd�ĉ]�?%%%�P@�V�_NN99��u}~2���k���j�]n��u)�J�N��ԩ]W�w7�� p��w���Fkk+G�y�$#@ҳϻ���=���Y���>��̈́�?9��� ����^_b�v$���8�����y�%ޥ�H0���3�wo�-�H���D�ǯ��T��/�d����Jp���W��+p�4��PG�Ph��M������g��۪��5-��c;q�&{0B�La�Y�(� ʏ�J!�PvK�2 �ZJ3 $$����������C�bEv,O���y?��=���j�Gg�+ ^w���������(�6��ƛ���l��lv�_w�Z�����C��aaW��BEa1�T؄�aC�����M-�*��gzN�=B:IW+�u�o��`�i�]�� .����d�J}}=+V�`��ݼ��k�6�ʩ"&&���:��ԗ�N�֢TkZL��3@j���74��'q�� "up���4&�����5��2"q��� �)sGȯ�Tkq�v/̠���v!Q)<6��m�� ɯ��Ș�N<�w�vC��S�pJĶ�ݨt�U�Mxa1�(՚�C(D�F��&i��Ѭ��=�dz��c<�kMX* �'��%�"����Q���t�j����nH��$���̛݃7�N��իټy3'Nd���-�/:����^�z���*]x�Sѵ$v�D� 3I>}V��>�O�a� �3�ʘ2�B�MnN4U] “������;�ר�=ca8Ѳ��4��������ij���e��NBG����N;Wv���M�q�z4�Q�� N����~���g�6�g�*��J�BC���q$�>���g��M&q�����B!ݒnT{�!�."�!}?��Q���� 6��ꪫ�V�]�n�SYY٣��s^Zݦ��iӮ!�o� :�n��G=p,��V]�R������G��o�M&����ȱa����F�����:+�� �7'�vΎԜ�V�c�i�~��0QO�o�FM#{�G��sm��W4|�~�����:�ۅB���� B[�H�='I�dQTTDll,juHL�PT��7j\��D� v���À����OA�����O�P�ȺC��U����rg��� �2pQ���As~צ�z����q���x ��K���.��)Ю"t����j��0����K�dPTT�7���N�����E��#�l�ja*%�;�;���>�l��(�����9�t��#0�3�n:����B�yڨVR'I�ݮ������`�ѭ�j-ɓ.��`M!�M�R��U�q������ڥ���W+�;�n��4�\��G��PD��tK:4$�m�^J�9JKKO��t� ��dqVr4kf�'^�� �۝�kT�+`�)�T��a�-�;�%]Ѭ��z���EB�tz�� *����� 0��aP/�!�s�SSI�O��h!��������@aל���|����X �L*(�5�H�"�����)C�4���5�@O2�n{��[�;�$�P_�x�V����Y���7�R&��� �kn���g���%!��GkUT��C�SN~~~�%������n����#�K B!� �-�r���.�E�� 5��F���pq�vJ2y������C��̒c6���u0������2��'Z����o�BN�ϒ�O�S��̒� �����IN�y���cL|(b�!!����ר����5x]��z@��&�lvB�r����"��εyI�[yb��!����S���5R�),�_�� y��� ѝ\.����� q �Шɭ�����`������?� ��!�[�O����pTZ҅�V%%%�F�z}�T0 �Sw���VWOBiF�P�g�b���ɷMϑ �F����vcw��!��ͬ� ��]�W�� ����D4����2 ���6��� � 8�� zB��h��ŕ}O$������Fɜ��%!��{ZҥO�ݩ˻���Sw�w[�[�D�P�g}��.��3p��;��W*���a�avU�����,K�s;���ԣU��e���Z6͙������q�K��/������♽�#^����er���� �=왡����o�k~�҅�A�'�z5&��Z� ��M�[��  q�K6���� TZ=�cuVz���k��.MFD���I���w��N�JI���|�&D� ��7J�"B����Bt#�R��%�� q* S)I2h)�ؙ��&�ٛ�mu?�%��v����e!���ty����z����}��i�X�xq���曙?���ٳg��+��m�?>s���۾j�*� ��x�c����~+���h�ҥ�z-III�_��w��Z���Nj�3w��f���B��dj�y�o�NRR�: �L`Xl8.w�r>��S�y�-�_�~=�ٝ�:��]�,Y��ѣ*���(--���{��bƌ,^��ɓ'�����F��5{lRR�v���=y��f�7o�>�h�����ѣY�dI��STT�W_}P���l E�EI�e���`0`6�j��d�l�̤hj�NF�kk ۞���[S�[aT�S\I��2 ��H��K�.��2jT�c�0v��tY��\E���e��� ����74��G�OqR�hw!��gB�H&���pq��}<;�?���s���:'��1j�=���Gd���Zz�{���'�޽{SVV&��B?z��)��<�9���9@�"ᛷ:�|B� $�B������׏={�0~��6�u�1lذ�q��ӫW/��s�̡_�~~�O?�t����9==����7��=RRR���{����1�ׯ_�^˽��KJJJ����ߒ�����E׹��Z|n�j5�<�H�O$11���lS�K��a�����\70 � ��>묳���mv���w�d��4�[n�%�������X}���3f aaa 6��n��oTT���f�{�>�m7�tS�u�����]���r�- 4���1� �jBQQQ<��#��T�p�;0\���)���-�6?YY]n��]� X�n�J�/�lv�7� ��:��r�R�ZF�w��s�r����ҥK�9s&����ج#�l��ƘA�9_��x�'�…0jT�#�6ӦM#::�Sf�8�̘1��r��v����澵Ȫ6��Ş%>uo�d���GQQ���<���]:�N ��%}��’�j��������z�E��E ��� $�p��UaO�����hR*קGuK .7|[X�6����V�j%��Z�L�����H����Rns�����Ww�]��[�F�������l,/�cO��<��4��AF-W�E�+L�LjɨQ�عsg��B�0�B��S�`jX�hOE��. h���E���c�2�2L!z�nMҟ�[J�FE�J�����B��_ o���%Ȼ�J�Y���Z���ڸyS>k��Iԩ9-JGn���V��Kxhp�G&vK,���v�׃�<����� ����ZV���a��QģC�yz�w �I�,X�0�=@t�7����I�Q|r�(��Ą���}e���聺��)\�;�֕��E,̬djB8�vS�sW�iv�,�Rewr�Y�\n�99��i�C��͛�+X^\�-������򧽥\���c�|Z�k.����M20�%'N��+� vB�B�����^��]!h��+pf����s庣�)��Kҏ��Y^\��iz5&�|ט�E��0Y(�x�3LO22��n4+̬)����`H��K{G�p\w�/���fb��eŵl�03.F�)�쭶����.Ί���p�XLv'K�k8;�@�p��};�,l��pC�(�TYYQ\����x3��~�8�|�WŞ*+#��H2bq�Y[V�)�Dj<t��SJ���Wg�qyC��T � �㖾1�>fˋkY[V�N���������t�}q�L*lN� ��Θh�r9�v~,�cV�L6'K�jɭ�36F��iQ4�>aO��Mf�M��P���ŵ�Y�o���f��a��SY=��vGh��A���/�5V^�_ƙ�>���ߨV���DL����q��!a � ciQ-�+͜���}�wVY������vF�qq��T����ʫ&I�fJ�o�І 3�km>]�>;ZE�^èh�ְ�d�_���)A��]w���B�SU�;�ƅy�D=�k���&��VH����(�j�(v�ژd��w,�,�:�nC��y�jԩ�"��w�j�7A�������T��T�������%|~z�O2��E���S�p���LF��Z��+R"�0��o��Q1"*�7WpsF��5��;���|MJ�&��)����%X]n��ZH�AC��Ο��ylhq��E����59l��0.FǪ�:��S���Ѽx��3� Dj���w2+无7eT���w����H�Z��xzo)_���%M��6䱬���F-:��7[x�D�-���̯7����$����H��j��Z��/����i޲K�jyhGf������WShv���2~7(��F<�~������V(Ƃ�����q5 IDAT�T�&�� 5�(� ���S�Nܕ%��9yo�\���Q쩶r��F�A�A����p^9T��w��_��w�L<����'����;�,ܾ��+R"xqT} �,��^�}� � 1ܛ�޿��ե�|qzsR�%�?��{�eE�<���;����(��O[�� �80c :ձ��%���5 ��NIG�P��,~���i �|}f�������Phq|ͯ*��iL�7Plqp���,8PƼ���V�g�������)}�-�ˋk�hM�Ϲ���1;]��i}}S�M� ��@��]U�Y��w��$� �磉�D4$�&��;��خb�H��o�?�+埓S��d����[ �4��͕f��_����>LK��h�v���{��?�����İ� �#F�b_���7�q˦��@X ���x����$��lO���P�Y�Zi��E�I��I�h� ʬN��)��6�sd�@b��[�㋼jǂ��C�6������l8��A!�B���}1�ʘ�>�K����~�ʯ�ὸ�I��?�+<-�} ��I:5O K��r�(� ��:�������$���J�襃��hU,8-ћ��4<;���v�n2� @/���F%y��S�I��N F%bh� 6B�d�im�{w{�o k�N͵iQ�\nvWy�J��ά����4&��k<\k�>F�rO����Y_FF�8?�Ȯ*+�&3r�o�&��iu�Ðxl.7?���F9'%�K�#P)Dj�����fK�ů�-}c�������hn7;���}fo)i ��M��F�qπX2�l�*i����Zz���0��yS��Gw���\�����&��y�[�_��j3>L�_G%Qis�Q���XZ����^G�Z� �cc�� �g^!�8%u{Kz�Å������o��9�����o��d!I��ln<��緛p���Jژ�^��ߧ���5V�F�?���� �dyo��J��t~-���5y\����z��[s|���q�[㏚��;]L��o�㳣U޿����8\��n�06��:&����h�) }�+mN^?\���Z ��F��v��^�z��y����_�����c}�V�]��ۙ��O{K}^&����Z�[��(� �˅����J�Ygcq��1,�9�u�����2b�����2(B����x �_Cm1.F��M� ��C5V&5�ZB!�ɭۓ�'���ޞ-�lg���L�)��3x[m�,�*;L�-��� gHÀ�҆yY�o-=^����f�"D5�G.���k�|�6g��� �Oksk����U��Ђ]�0���~��� jD�Yg ���b�cc��.7���p���U�Q\���- ����X��7�Zߗ���楹[���z�o���ᦥ��j�upY�O��в����z;��MZ�4̀s����U�wl\3�s���_�xZ��JI���/P1��_k���݀ !����>�)z NLa�O9<���;hp`���͒3[^��&_�u6Ίoy�Ռp �ʹ��=�`�p��"͵�� װ�������em�7���ѓ��O�s�|�!B�dhd+K�(�::u6��f6U�yvD/�oh±�y�BF��B��xC��П��*�4��'�%�~@�}1�Ǡi�91ٝ��.���T �m�����t�Ϸ'~��4}ۺ2 !�����}ҏwa������y����d圄pvVYZ��zt��h���3�[C��k`K���5�I֢\O?�3N��7:#΀����5>ۿ̫n��1���o���*�tc�u����~�/�J�����>����.>ͭ��ޚ�����g�g;��Z��3� ,)������5����(/(cgU��q[L�3�So�r߾���#Έ;�%%E�fmY=�&}�s���+�������w��e~5��q12��Bq* z��İ^X]n�k0���z�4\�s.�eUr��Fv����sKK�=�r�Fų#z�sY=W�r�u����-���m����O L�䲟sYYRGv��W�33�����'ruZ$�"�ܵ��o k(�:�*��'���Wu������ٜ��2�w�*y'��3Vf���љIF���9&N�!���*Y_nfEq-/,g��#���4g|��R��������<������\����$*lN�Y�� j8Zo�@����◣'��V(����TJ&|���;�Y�_�v��U�u�x��eE���f[Ώ���q�iU�]��w��y���U�#;��gv����������l�0��� f��CR s�Gk�\�s.�*��,8P�{Y&n�CZ !����y�&�Ꙟd�ݬJO�A�������"��R��B<.F�8��b��(ypG��,-MF�4�9'��6�s��l���� }�x}Lr@1� �?;�+~9ʬ�����T|>9��7�u�����``�� �]�C;�`�r{��n7�*�~}�_�̅�F�U��[ ��ʵJפE����6��Ǡa��ܷ���� �c�> ^z�����Q:6�׏��r�Ϲޛ.�R��C�c&���;c�(��J^��r\��=�Plq�ov04R�l x�ŃZ�1͠a���8Zo���bpD �`�`�r#��p_5�g�� M����hx�Y���jZ�϶_o�ǨV��c0�w�zG`v��_c#B����nj��}����,w����/#�k�"�_m#E���lr|�W�F6{ ��o����|Bj�ߨm���u�|n_j.�X W)I7h�fꩻbh���U�������g��nдتm�3����I�x^?�mN��l �kv��^��_��QdqPhq0<2�;0����LJ&���x�V[���-�$�B�SKH����V�x��>M�s�'�ԭ.)ߚ��P�tq��ƨ& �,+�哆9�OD�R2� ��ĠR�M� j�߂Hm�[��.��qZq��cIҩ[�h�V�h��KB!�8��|�~*������Zz�=����29N����6S�B!��y$IAI:5���Ǻ�z��b�*�F�qqr���M=�o��0�a�!�B�F��� ��:'��J�'�?����B�Bb F!�B!�1�� !�Bb$IB!�"�H�.�B!D��$]!�B�#I�B!�!F�t!�B!B�̓.��4{J���(jױZg #�m���R�:7�j��̡��PW�P��F�i�/; !��� !:����(�����c��z,�b\ ���Å�Y��Q�@�T�=��H�t!�hB�t!D��s+���@[6T�����A����z$�dO�>*ؑt�#o����`�!�!E�t!NaW-�J�E�I!�8�v@�CB!2pT�S�Zidp��dV��� �ۃ)l-������t��}��;��ًy�u̘����c]623+>�M�,��u�}���e|����E�vz���C<��jヌ^���9-�}������;����p���a˖�6_���k������|��z뿹���,Y��'�+�����j����_�u�}�ݟ�e"!�/<������&ol�����:�zjw��n��y,����������o���_-�K>%3������կ�x�,\������3q�-�0a�;-���60~��=V���1v�۬[��KS;w{��nw1c�"��j���'گ����K�I^^�w���og��-�����k|�X��|�X������W�bE&���;����^{>��;�l)������2m�TVZx�ռ��6���s�r���?����hI��++-̘�����߆�� 8N���:.���m:�Qe���_��/�y�}��N�������*/����?���o��G�>��i|싋�HI�+���-�mZ�x<����_���oo�ؗ^Z�|�����o�n_�:�XF~~ ������'�������s.8��������Wz�����ٙ1cuu��s�p�=��� q�Ӫb������gPk?DV��d�>���g8���9$G�Ĩ�9ss�ؽ���hO��eˎ`6�𮮶r�P��&V����&q�P9���?|س��\[���e��|ƎMn���%9�Ț5��c͚��p썶o/",LŁ�>�w�(��ē|dg�|b���Ljkm��5�,�\���_Sc���̖-��Nol����U���`��2�†���l�-;���h1���e��ljj�TW[�X�^��-�o_)�wc����7��[[�{�P�ߵ�����C��(.������ ��:�N˖a���l�Z���"N���|��#��ڼ�(�b�v~�9�R�ѣU����eҤ�����lܘ��a ���z׮b�ZϠ���S�S3k� �:��=ߚ�?����ju�uk!6����O��sZ���9����[���дi>�~׮bv�*&2RKYY�w{aa ����Pf��� hN� 48p� �ɷ���g��� ��9�v'˖�nw�gO �|��J�t!ZU,������gPg���� �,��� �fv��0u/R".#9r� �P) A�Z!�8yI�.�)��v�r[q�-��. .�(P2)���ϻ�z{..���1a�8 ɬ|����p���&�1����B!NJ�� уٜ��X�Q��Sc݇�U���I�}����>�˄�B�n�p�X�'o+�J��@��L�o��B�B�S�$�B� n����dU�OY�OX%4iD� %"l���QE�R�P*�P)u(:T�0�Jݱ� Je�o��{~��ʚ��(�����A�JE�B�Г>����a�B6���v�#!�B��$I����p����>�O� ��=�a�P+�[9:0.��59SV� �& �B�D���t��֏"%�J�#f� (X�w)5��>�?�7�\3� z��S��H���̙3�ɓSy�3HM��s�z�O���P4~|o�co�y4#F�j�:�s<�y��瞉-::�+����dʔ>>ۯ�v�w�ɓSIJ:����G�">��^�Z�C��ݟ��ԩ}��������/�b�瞉�2�g���ʴi����z�t:5O>9��� ���y�&S^^OR���ży��ef��L��ө��30aBJK���s�� ><�!C��a �KS���T��<��T&MJ%99XP=�eM_�?~6���ƌ�~?� &w�9��D�����n��|����7���ଳ��jU���cϧZ�d��X�j���Ϸ�ǦP[k�h�2w�bbt;��s�����[Kn�y�7~�Q˓ON嬳�}�;^��m[%9:Z�㏟ݦc�Z���駧z��sN���5k�g!>����(*�E�ny�;�π�DG�>�?qq�p�������b�:<8��cg�Bl���#{��p���#zq�mc�s��d#:]�i�����l �>�>�7�pZ������:��K.�…���(�nw��m��d ��?���Jg�R�S^�yks/&�0��1��~! ��S�p�m�ͽ���q�(:��ZN��"R"/#1�4�h�c�.]�̙3ٷo���􏹳���� c̲�Q�ɓa�Buj,f4kpӦM#::�%K��~�)fƌX,V�Z�PN���g}�z����כ�b"� ,$ɘ����-�^̪�Wu<�6zj�S�/���+w{�M) ^~�e��k��A ���HNN�����G����NZ҅aE��X�jF%���1�vI.���s/��v ���ǒy%IƙD�F�.�W!�-�$]�U^� �^�ĔI���K�p�ml+��&������Zաs�-}���m�6M�rp.�Ãqɍӝ6���m���4W JE`s+ !ĩB�t!B���20��.K����w:��|x��؜��:V�(����nI�P*�u5�����2�B��$]���EAͿ��׳]ZOә]:CZ�5�?ؖ G�_���'���R"/�ؓ�O�B-B��Q��� \�/ء!�"$I"iUqL���[��B�3H�.DR*4D� vB!�I҅B!�1�� !�Bb$IB!�"�H�.N9�M���೭ں��ڥ�ܶ E�9L�m�. vB!�� �']��z{���Saތٞ�J�G�J$�p�QW����s�*~�J�f��n;\�:G*�b��Bt�/�Y�6��_\���w�L.{K�!�f W ww�\B!�I�Eȩ0odU�T�n M�����z���/cv���Y�ϯפaw�tV�Ͳ9+��g�l3��q�j �d�T���s�9˾�5)D� �s !�"x$I!gS��q�-LJ�����|��ٲ������'�|ء�1$�Q��?�헣W�_�5g�E�nL��;&��.9�B!��$�"�؝&��{��"=�Z���ھ�k��l�0o�᪦W�y�ٳ)�� ���X�$ SE��[�v;(�[�7 ��Q)���V���ʲ7.btcH��WW���Eq�rt�d�u����,��&<��m��n55���]U�k2�3��Q;��|&�6,�b��3��jl��eo��)�� �y;Fm?�#.A�4�)f!�Bt=I�EHq��Kmq��tY�I�4�1���!�^�J�����v�u z��s����7��e�ѫ)�[Θ��I2N�ʺ� y�Se���G�r��~�R?A�N �z]nkrf�5�pM���(P)���fG�;4�ˌB�F��ۂR�ax�g�Z�듞]���^`J�����.�l�(P�ƅQ;���c�� 8f!�Bt=��E��*��X�Nkrg�cZ��U��qw[ ~�i_2{���C*�{G�>co��m���(fU�4J�WqF�W��-�i�_�}v���?p�03��eb�G���̖�ߴ�.�šo)�]ƹ��1g�����@�ง�1`s�Z�lh%S����xv?F�ys�ulȻ�Aqr��j.�������fO�S�Y!�]G�tr&�~H�v�u�٘#K�G���hv���Zۑf�q�� ���#.E��2���o6�C�au�\��+3'So�aj�JzG\�ݷ��OX%LJ��^��@�R��O� ����Si���kv�����5q��(o��:�὞!"l � �BG�q�%���2�p}c~̀ػQ+�4霖��2�����9^!�Bt-��"BNT�.��š�PT������,;0Yvp��%�%�E����K���o[z���*�U��A/�_˖�;Ш�9��/�}��ԭD�N&*l8v��g_�~���זK&Z7�pMF��k���0o������Rꩵ��d�%>+� gQT��ۊR�‘B!��n�����R�H����ȫ����pśdV�͖�;�?�'�U*4�5���cФ�Yao���ysQ��~����v���%�cZ<��~�����Lkv��mcC� �U�Q*44�(j\n;VGI�u47��g��˂R%I�B*$I=B��4��^�ɲ� ���~"<:û��v�r;P*4>�5� �T��gd���U��gJ��hUM�qJ���/z���9��}&���n�����E���2 �^���k�f|��B!D� I��Qb�c�0o�L��E��0�aC}��X�'�}�o �`c� ��>��3V�:� G� �Ҽ�X�dT&�Q\�=je#{=�F��nu�`s���/�B��M���bwUSV���}N9�ED�F��Ϭ|��o���,�{�ս��G<-�jNO��j�>VeM��(<�/�j\n�K�p���p]�p�m��v�m�_��:�BZ�%]���ďYS�֍�w�eD� B����'�k��p��+�<��g��T��_�5 T�F^��Y���g�:J���6�z����3ӿᗣ��c��L�X�A�ƀ�{ȭ����OSk;LZ��4i���4o!��!����yǓ#�QN, IDAT.�¼���7�/�7hU1��5ߠQEuJB!�=�����U�2 ��k�����}e$��dh�c(*�}*ES3~���K���*�����o̭�%�8�)�߱6w?fMaZ�Jµ�������Os��5r�>�W+�$g�QF��m3$�Qjm��1-��v)��?-c5��[��F!�=�$�"���F�$���YA�=���&�:��嗬Q۟��`��cv��]���+���M�;c���=!|���٦R��8���Qg��l�G��Aӧ�������6�B�:�� -S>�� }U�p�l�:ҿ��62q>#��3!�&�|�b�B!�I�E�ҪbѪb�|�^��^���R�Ĩ��T��O�ND�N��z�Bd�B!�!F�t��iU��I+�B!N"��E�x��}��B!:��� !�Bb$IB!�"�H�.�B!D��$]!�B�#I�B!�!F�t!�B!B�$�B!�B�I҅B!�1�� !�Bb$IB!�"�H�.�B!D��$]!�B�#I�"$m>���������~�� �.ݾ���x S]5���Y7E�9�۶����K�טx��/|��{��'��Cvi_o\~�2�r�l�O�>�'k����<��޸�#Ź��~����=P�FG�s�z�rj�u����6�����r�R~9�ջ���>Z�u����v����~�q9٥y�^��$IB��o����U_r� �'?�e�X��7��E�R�y�� ����݇�;�-�at���<��>����{'�����}������a�/�}�'�>��-~�̒���YȦ�;*����î_*�h�᝼��B�k+��;lӱ�^�f!�������oz����z����?i�z_�f!۳�uzݢg�$]!�B�#I�B!�!F�t!�B!B�$�B!�B�I҅!)�I|d,:�����V�Fe�@���'>��"���qu�`��%�j-��}�%Eǟ�� ������4�����&� �����u���&D�i0T�Q�NOrtj��> �{�'G'E�1ڻ������޶����&G'`��:�n�3���B4g�ſ����'��삛c�M�p���4����� �B��:�� ��ٶx�kA���t�)\8j� ��r�U�r�U�>��?}p<_����˾~˓�m4k�y�w�o6����8�|R㒼�����v��5o���6�&��� !�Bb$IB!�"�H�.�B!D��$]�PRrޙ �{>ؑ!�"�$I�%w������?�S��p��+�͟��վ�M���[�wy��B!Dȓ$]��8����s�Bk��Q���w{�~�䷰���!�B��'S0 JRF��; !�B�$�Bts��>���Z ��A�G@X��1.'Xj@�9��V�:Ͽ6�7+��zZ߅BqR�$]���`�'�~�޻�}�I������.�������02 ��-�l{�W�� Ͽw��9V~��㋮�!�Bt+I҅�Jn��2(̈́K���$8�lXo_O��'>Ǥ�� k����O��ؾ��]�B!�B�t!���������c�W���x����e������g{�Ȭ}�ÌG�>n!�B���"DW�����g���]����B!Dȓ$]���>�[L��we^��"�B�A�t!Z���箆� ��>���Y\�a��N[�bB!�II�t!Z���]U�r��Jp9|� !�Bt�$�B�$a��wYv�e*�z~G$�.� �ih�w���!�B� I҅hI�h�� ��o���;uT����]z�k�B!DH�$]��L��S<3�|v?8���7~ �������tm,q�PB�n8�]ZԅB���̓.DK����w�������O q�g0h�!�<�I�g���޵��a��Cxv b@ �g���ں�B��$I�DF̄��÷OC�z�� $�1Wx�>�?v�٠�4�O��AS���]�ٞr��17��� S�g���^�>!�B�$I҅hMd"\������-�����U�ۓ�6�@���7y~�BqR�>�B!�B�I҅5�> G~ vB!�"I҅5�jX-�A�B�S�$�B���n��_B�)ؑ!�"H$I"�$��1�)�BqJ�$]�Pt�m���`G!�B� �$]�P4�j(=9���B!�@�t!BQX8�u;|�x�#B!DH�.D����g��-� v$B!��f�� �tp����`� v4B!��F�� ��_���?O;!�Bt#I҅u׾ ?-�Ck��B!��$�B���A0�uxsd�v4B!���` �������τ��CƄ���I`��o�qx~??b:p�ot�� �8����9^��l������0̋v$�g8�Ǧ3鬠v�1U�!xb0�?_� ���\��J� ��������=������I҅�)ξ\xu:����ܽ�כ��{��x���v���p�S�ѻ��y�5@Ӂ�D���?�S�I�Y� D���;�г�y����'�����7`: ��z��Ê[� �������4��C_@m�����n��k=�\;�w����Z��:@�t!z�iw�� =ξ.��[.��� a�9�5t��g��پ�ʣ��0�"2���eî�`�U��u$ʓ��O�ϨQ����D���0an�# =Q��"�Mg�f��<��'I=�I?��5��s-u��L��k!}�Y�hpB��.DOs�=�[��6xr(l���ic`�a^ �8~x�t_�B!�hI҅艒����`�s��oa�ٰ�m�+�-�Pxf��|^ _=O����^t��l��R�ѣ����y��W�h������+��ݏy����'>��K�������c�x��?���f���˯r83��zs�e�ͷp83�G�z��_~�g^\�Ͽ�����ƭ[y������|��̺�F��t9o}�a���̋ ��.)+�_�ʶ��Nx앿���k��_X�Ͽ�j}��]�����]��**+���x��7ظu+o��^yk!��������k���px�=����{xm�;����>��{����_��E�0��y�/����x���J���<�s}�����[��5k��y��gy��W�t��_Mm-��L����Y�˺�6�J���ß�̯?]�S��/�d����'�`��]���?��N6O�� ?� �]����n�+��_y�?M��U*M&V�Z�ko�˛����p8�m��xw�'-���+�RZ^����J�ʹ�λX�~�=�y� >‚7��+o-��u�c�Ok�l�j���h��v��OVn�����J+��>�.,�M�(��lv�o���#G�j�-�ݵwcN;��#��n�l1����S�HV6G��1۬��x��UT��|��7l��r�7=���Br��).)a�޽~��mފ�j<���dRo>�x�r�ؽw�ƈ�ܰe+�2�[��T����Y��xb;x�0�QQTTV�i�6�Z-.��ܼ|6m�FRB�l�9W��_HUU5[w�dЀ��=( 6m�ƹS�jv��j�БL��B�t!z>}�������, 6���޿ɓ���)#��Y����W�� .�V�#?{��|�0�<��i�`���B!NA�� q2�� 3����`����l\�9�h��[c�^] kށ���������B!��$�B����|�M�T�[�����9�it`�Bx,�����@'��+�B��H�.ĩ�D �J*�gzǁSa����1i��U!�8�I�.ĩ��=,lf��c���{�AW�o!���XN�8���$z'&�+!���t&��-3t� {%p���TVU��x����͡��W(9l(�*�5nKK ��aCacm%�?#�>+KK�U*�=�ꎛ���x{�ϧ)Z�������^#gaa����ktj��\�Km۷Gxԫ[<=x n�ǣ]�@�6�۴�B!�N'��^����ã��~Tܨ��!'7�~h�� h����ӽ[��������'���V�P��g �!}z�u����̠A����ˏ����:u�_����:���n��a��( 8թ����E�C���w#<3h�lmѾM+�8;c@�>�jP�Ū�� ��sɿ��VV�ѥ3����ǙL�*+4��dx뭷0w�ܪꒈ*� O�Ji�!1�+��=�ļy�Pv�)y�����Ōv�܉��\�z>�����*�3*���u1�=z���7n4v(&������Á��c��#_#�V(6���߷��t8|〄i p����v�7��� &�|piցY��U�W�߸�d2���x��� O�y[��ћ;��#11����W_}�3fTS�Ùt��YA.��Pq1h��ly�Ώ<[NDDD5�I:��,�:0�ϊϖ�I`�N�8{� �j��[8���8����ZFx�x�r��W��]w����x7Q���*2t�Ђ�MU��*=p�� @]4�U�{��0����J (`� ���{�z�LE�|�'�J`�ND��Z�H:v��90��ӽ$�����r������@�'h��6V�����9�9��&�1v$��� @j���o�������3���� �? 7��G�* +h;���.��a@���s����u��x*�I:UL������fm|z�^8��8\8*R| 4��D-��\�ξ�e`����{S���]�q�ӼtqC+��@,�6H�j�ג~� ���toaqT�R.=HDDDDD��$�������0I'""""21�I�'ZL p�F�������Z�JLF���h׮��'"""�c�NO� ��+�ܴi���N�����@ZZ͏MDDD��I:=񬬀�w�W��DDDd$LC�����������~=����<�t�G�;v���V��q���a�X�  ����́�Áz� �9l���Æ=zT�eQ-���D0k0{6Щp�4p���3�;���3��X�B�-�U�m[�~�۷�6m�7������ˁ?�4�k�J���5�A�������R����p&��x���B�M� t�p���,y�N� �}|�9�� @���+b2������*�x,(��`�"��w���K��"���1?4T\�Z��8���#0`@��DDDdb8�N�����BaئY31A� x�E1Y߸Q<�i���'� :��ݺ6�� �Y�7�4LЁ�%1#F� : ζ��U������tq&��xff�_�߮{w�� ���8@l,��"֗գ�m��)��h�b�^�������3<-������e���?\��c�NTA�o>�j�����c[[q���l1!.�<�B�)���ef�?���s��%1YYb_�Ϭ,q�_&�z0�����K���NNſU ""���$����Y ��P1�������yѺ���6KV\\��Ν�/����ֽ4� ~p(-�OO?l$'QQ���[F���;:&�nn����@n.�!""�j��JO<�NL��� �n}�qA0~��X4.�>]l��s��1c�Ťӧ��Q�o�.^�.�������/b���p�w�Z��O&g̭�Wׇ{n~�aҞ�,�LHV��&&�p/�����r����"""�8&�����BB�8غ���7�k�}|�R� �Z��D��\L�G�������c���祗�}����D����V=Ize�����A��۬]�/F��=z��ݻVX�XL���OO�eK�6L,��n;v��ׯ������ �tz�}��x��X�N,�{W\4� __qV<) HM���RH&�Lg�cc� �O�����M�*�L��M�C=: >>.��1Y /^{M\|;|��!�n������Y|? ?0=�������q F��do_r�^����,>��%���b-��XR�з��m������?nn@Ϟ�ܹ����� ��+�3k�X���&~�9z��v<""���$��jD��b�|옘�?�X.Ԭ�X�ѧX��Y�9#Gzz��j�8|X��Պ���� ��#�=?a�x������ڳ' �\��L�o�������Q�܅�6o�R���������2۷�v(�o�;��A��d1�n�����[L���ś���S�.y��́�����qa. �-_.�.�t�l����,��E��kq�tn��F�sg�kW�rZ�10I'�����Pղ������.vZ�"+���Ⅲ �:�Njk���m%qw�„�h�^x�X`�qw�B:���o�*n���/�3x����C� �%2yy%,�f��F���.i��&�Ddr��ń9 ��6Z�8 ��!&�?��������d%'�� δ�"װ0��/�]y^{ HI�aϞ,XX\��Z�t=�w�Chn����Y��IDDU�I:�JJ�x�%G��ۜ= ��!΄���[X���*������@�^�b�B�� ��m�u�j~OG�~r���Z�*�{���*���t"z,;&֛�������\��׋�,��{�Z�R���d�R)����f`pkk9P c��z���40I'��ο�� A �����{� zi N��g�a�l�7`#���^^|����1I'���֭���0�3�]�����I��h�ޢj�4|P�%"�G�$��99bG|<��`�h����t"zlXZ�e.DDD���&�DDDDD&�I:��a�NDDDDdb���&�DDDDD&�I:��a�NDDDDdb���&�DDDDD&Fi���u��d��x����V5zKg��k����e�����;72Ѱy]�:YTs�DDD�$`�NF�t�A��S�7� A�[�pD���<\:xy� ?�q�~,C��Ë����興��I�$���qW|}dL��J���<���T��G�v�����x���P(YEFDDD��$��J&�Am^���V���_ϢM�72�����hh5:t����kr�5\:tZ�͂��m�/dr�A��{\yq�@&��Qkt� ��j�v'6E���ס6W��84lQ��x{�\���%�Z�כ/��m��0��A�����w+XX�qbSnG��?����+p���sC;[��WR0�^P�)pnO��GFr6���"hh4j�"����˰s�D�~^cݽy��G��h_ػ�|�U N��I������}X��a|�w5���đ�����*����A��nŜ!p���~�.�n+>�Z��ҕ�$���'��9M�Z��=��{� �Z9��N؎��l�Zt�:����T�6z���_F�1~h��fAnس�b����G���P���o�����<���X�U(�wZ��+�"7K��|-Nm���o�EZB��J\y��/���/K}^�t���\ IDAT&l�N�7k��X����qdm<Qmƙt2���4|;js��/~� �����s{����p�V�üv����H_Xٛ��?Q8�� &��_o � 8�;3�����a�N;z?O�{W+|�o,l�Ϝkr��&da��נ�P"���]��_�0��>R��]�H���^�����c��"=)��,�������qh�������q��}8ڄxK�Z��B�g�|��حX"""2mLҩVH�o�PzR6tZ�4#nik��kiŞ�z; ��f+;�gNf~���Xl���+�@��a˼3�2�L��'д}=鱹��X0�R;��k{����)o¦�9񛂯��A�߮��Fpt�ƞ?Σ�?\>tozZ:�j 6�p J�B��������璡��B�V@e&�K���Z��j3�JXձ�}] �Y��2S@m���\���.f� q�j�e�0�P��R3K�̓ w����|LҩV����㳻� ��Y��~�8�#�qp��b�.������� �a;cK,=y{�\D�^ �����{��r�]|� I������fR�G�Ek'W��oRv�vYi�p�Aہ���js%�6k� o���"���9���L �:=tZ=�Z�Y����t  ����]�*�>}��R_�X�$�L.�B%�R%�/�WBm����s�+P�o�R��BU䃅J��s������"�Kxl��������Ȕ1I'���ȗ�Q�r�{�:��[�X�� {�.컁�_��I�z���x������Y̝���� K[5V�< Mn����s����[c�W�pnh��aM���Q��ZJ������ɘ�l�􁠨.#|���Kx��^�j�+����8�>��o'�����+�m�K-���cؾ�,F}� r������#?����D� HM�Ɲ���pg��������j�F}-���q�\<=����E~N�s���@��C~N4�Zh򴸗����{H��BZb6ғ�������\��օ��.�6���j %t:h ���-?\h t��.��@��yZq����hűr�Ҹ����6Tf �^]$�0�W[(aigW+�V��V�w��ʬv��ODD� �t2���T� Y[����DŽ���?�U7Xq8A/�qW�X7D:��a��ۇ��q��A��ksL_=M�ݟў�MwXX�0�.�8~��3�'[��p�{�\���J�U�A�F�b�OgplC$z<�W�~ |��_���m��x���b�?��:ԳF�!��1 }'�|�*J&���������䎐)���i�3�؅�x�W��w��#o����++�����?��^B��h٫!Z�j�6��`n]�<�ah5�����������&�҇�"�S�}& � YHK�BzRtZ=�� wW+ػZ�N=+8�Z��� N6��7�T�DD�da�NF���nk�h�o��EzR6�=���kӢG,�� ��gBW����}���Z��fw��Y]p;*2� .^vP���ж��Y�^�������s��s�bm 5 r3�c��7Jl���K<^��f����l�d2�9[@�q@J|� j '���IuR�+4� �ͣ1>�'xmvǕ=�1m� ��s|���,h�V�t������򡛸��:V�<�y�#hXS�� �\��&�*fA2�����g#-1i YHM�B���xjB4�Z8y��3�^u��π�pk����U�����l ����_�����fi�P� �t�U*r͊�n"W������dM��k=��2��N�ܳ�?�2�A�X��֤bZ��1e~�z�y����U�ݠFh7�&�9��}�.�q۠P���9��_�2��&��%TvΖ�*g�˜�|�]����Ɉ;�|w�/��5l��g��ٲn�-B�L�&U��!��t������D�MA�P��� &�D��ͫ)��n 4: �  �'Q-J���ϻ�u?/���Y |�u�����ޭ\�·=pvw�/��w�.C}?G���'�x�55��� ~]<���C:&�܎JC��dĜK��m�X��q��΂��=���3� �L;""��`�ш�cn�·��­���C1).�v���(�7�cr�ξ������4x 4��b{�W�B)G��h;�9�8�6��a嬣2�-�����?-���ެܛ�A�>��{)��=��� �c[K,r��ա�-*]�OTU�>u���]���r�V�/�4�B�fAn���-�h��Ѷx� �ۺb�ޑ���jhr��I�j��� �/�D�K-qz{ �}�u_����[c�[m`W��բ�8Z��X�!��8ǟ� ��*V|z�/���7۠n^�����`�K����H;�����_��T1I'�jѨ� ���O���^'`����:^����#���PL��}'�İwۗ�и6��t����#��ml��$^n��4Ɛ���ӑ`�8�'9�|M��Uȸ�$�j/����j3�g��w6�x V\��1��x��m����琞��)Mᗗw!�NN��_]|:�aƺ�X��Y���5��u%b�%;4"�$SȠ03�Dea�ND�ʳe]���)���.D�H��q���ު�0����gaJ�E�6? z�P��M���&�퍿n��N��i9�����4�����Z�� x��1�����*�I:՘)�􅅍?>� B���{���y5��V��J��gaA�K��dx�����tZ}��[z��ǂ���e�7[.���O;$""�&�DTc*9>X?q�������R�+�[#q8�[cڊA��}8,����D����:Yٛa�/}1g�(l�{�^��Fg찈��0I'�e�h��ۇc��K���Y�L��\�1.�|�v�����?�~�ڸ��%�MMw������q�q9��]�{)������t"�q���������qjk4�R�Tˡ������h,*3^���.�_���//�*V3_9Գ�WG����-G|D��C""���$����Y��.���lAtX�2\>|�/ީ�x�?�?��#��N�e�~�n��P��JL_=]G�ཎ�qa�uc�DT)��kLՂtro; �嘤Q�+��a��N�1[���X9���;���t� ߞ��p� X5��Q�tt�ƜG��h_L�;~;g�8��L�����9C�y,���'׭58l�6o����j�t�OJc@D�?��OO�]��㏷�E~�*� ��Z�N�aEW�����|=� mk�������_ ـ������h�T���#�Z>�߆��Msc�D�P�ȽU���)Uҟ}�7|2�J��� �=���L�D��$��j���5>�5W^��SvC[�GA��B͂|�.���������H�vΖ���h����]�O�>k�ڝ�>7�+����0{�(� c�DTa�l= 2�H �����:�)G�����);����k�ɴ1I'"��>��}=���8�-���Nr� ����9]����F�Y;��wc���n+�ٮ��fmԘ*C&�Z��{���I;��ҁ���¬�հ�3C�*�*�������wG���� E�����Ui����E�DT��յ����5C`SG �����&W���N#/Kc�E*3f��N��ynG�;�JQ�+���a��#k��I:]��c�Ձ����*9d2�@�]�.7����2��{?�x��wY�谤ۅ���7�����Zb�=���}��4�!��p�e������\ ��G�����j9&�Dd��Ux��՘�m�]��T)P��êϏBW�7vx��s�bć�i��H�V|F����8�'��{������+>=l�P�*��Y �@�_����܅�T9L҉���Xp����lл>~�6��ZB&�!;=�~ {�q���Ħ�ʄZ��o�A��1{��d���q�.��z��Ʈj����]@�ْ� ""�`�ND5f�7'p�Ff��̭T��K_|sx ,��X��qQAr;* ������o���ެ��Š��敻8�-�R�u���ެ��� ^�c�P���&�Dd�|:�����<)gw�;20m�@ܽuK���'_� ���+F��a=�aG$\K����%G"�' �����K�ÂW���V]�C�;x�#���5�j�_4(�X<�}Z�qr25�몿���Z�O6?�i��F��u�aHc��an�% ��h]�1T���_Ħ��Ч���!""0I'�df�B�aMJ�$��*�oRK��J�s;* [�?\{Ez7�����j �OgO;�X?�\�V�Z�F���tĞO�W�s��Q�� ��G|d*ܛ�1v8D&� C�so%��"7�U2c�S�[k3�����y{c�B��I:����}=�,ȭ�I�p��� ��� ���헪_�)�ː����z�� .^v�l^�u�k�?M��R�F�\�]��c���UGu��f��Ûa˼3��K툙�t�▦��on@�/�LJڙ\h�uL�k)֤Q����s�����P�aeW�����n��<���mu2{_��O��ߥ���SMn@��a����jt��h:�z�-�-��}Ӊ�Lg҉����>�F�i�� "^�������"!��/�F����9����2$�f��Y�*���J�$��� �V*��k0|;{��T�p�ʮ���;`p8tc�}ZE���j>�6o�\���\�u���J$\Kc�Nd�t�z@c�̺=d Y����$1���DDF$��`�l Gwk8�Z���6��v0����V*�-�P�P(�0A7[' ��; Ju�? z���h֥���$�rac�Q��W�#�W�t"�2t� �V�Ào'wL�ۻZ������Be�� O�xn�HDTcX�BDT���i���s����e���&���eDA��� �~�N��ID�.?I U�-Zg#<�n����f9��V�������$����2�-�.$���p�bG��F���J�� OU�I�tE^��o�l�|ҵe��I�A�W��O:&�DDT���ǭ�TD�I��@���,�u�Z\xO���T!��.v�X�'����w��w�1u��e�;5!� T5U�ǚt""*�B%ǧۆ��� �z=p�f���""z"0I'"�R��1��{F@�Rp�wx!25M�:"��c�Q.�O��x{c�Qk0I'"z¼�r n\���2G|��0�숮���|w�����Ȳ� z�|c�Q.�FjX��Һ���=a2�s���mxcܜ���+�g#/�9��P?�=atz\��q�[K}'ĜMB�ƨJ�+<������$��� ���bϒ�0�|�?a�b+5~ʭ,�x�U�"���t"�'����,�@g�����"-1�(c��I'""""21�I'"z�L��u�m�v�!����Qɘ�=a���1���ۺu|"�ڀ�.DDDDD&�I:��a�NDDDDdbX�NDUb���prrz��)�ѪA?���� #��Z��!f�*d��C�1qqq 4v&����|��N�� ���S�c�~�AV��iʹЪ��[�EP p7��t"��J;;;,_���z ��~�����2v&�o߾pu�[�������aT&�DT)�{�Fzz��� z�M�6��!Q bM:��a�NDDDDdb���&�DDDDD&�I:��a�NDDDDdb���&�DDDDD&�I:��a�NDDDDdb���&�DDDDD&�I:��a�NDDDDdb���&�DDDDD&�I:��a�NDDDDdb���&�DDDDD&�I:��a�NDDDDdb���&�DDDDD&�I:��a�NDDDDdb���&�DDDDD&�I:��a�NDDDDdb���&�DDDDD&�I:��a�NDDDDdb���eUw�U�VUu�DDDDD�*##��!H�p��e������-Z�0x�D�0�T>� ����4o�\��t� �]�%��߿X�������?J}��� T��L&&N�(����oll��s�]�&�[�f�t��ťR�K� ��>�� =��ҡ›���0m�4A��Kmo޼)�W*�©S�{{{�ح[�A�����c¬Y������,Z�H�ٳ�Aۀ�!))Ij_R�ˮ]�J-� L�//���غu�t�^�z��?��#G�,7���X�\.7�ImҤ�t?)) �����W���t$$$H����W�� �///����>�,�7o�B���||���X�pa����t�۷�� 6$''�[�n�{ NNN����B�@AAA������ؿ�������1gΜ ���>}!!!�������cǎ���8����̙3R������C��� @&��hYˇ~h�~z�W���ߢ��fff� /[� #F�����Ȍ�)��H gϜ9# ///A�є:�>c� �x�n��V+� \�r�`�err� �0{�l鸛����s˖-�R��έ^���x�,Y"�upp08��,�� ���j�€�>� R���?~�ر��N�s����3�ggg�/�bcc�Ç YYY¸q� �شi���h�׺o�>���3�vvvŠ+�Vk0����+�/k�h�Ŵ�/.��ڶm+���O����ϗ�Iǻu�&o֬��w�^�=�x�p��I��ĉ��s��)6veg�cƌ�;&DFF /^:d�mR||� ����/���H�֬YS,"z��&��L�L&×_~� 66�ԙ_8x�t����-����"119998{�,���q��!������A��}���bգG��9kY�г"�- .9r$�o��իV�^]laei����p�B�={w��Avv6�����׮]+��3f��ԩS@��/���5�`����g�u� ��1cÇ�f�o޼Y��Q���l�Yr ���o`�ZO�:�F�\n0�>y�d���[zܼy�J��0����b� �c_|�t����7o�ׯ_����#G���g���@��h���I A׮]q��a̙3����� �,[���v6h_���ҥ������@Æ ������`�cQEKaʓ���A��ԩS�}�7m�dP2R����Ν;��y������<�������K=_��Ip��5M��(Mdd���> ���D���ڵkP�T�>��(σ�*�� T�X��ͳg��W^)�!�FL҉�d}��W�ҥ K�MwssCZZ��g�-u��3��ܤ�ܨ�(�6���ʽxP��c�N���8i��� ���lll����!!!��� 6 +V����E�����&�m۶ŬY���� .H���F�T�q������Q�N������ ���Y���TT�:�BӧO/�}rpp���5d2��؇���xXEw���͕�߽{���UI|}}�sss��bȐ!%>�av "�ڋI:��Ν;c���ضm�A CQ-[���˗�3�E�E,t����'N��ك�?�*� ���ؿ���-Z�[�F�СC�������w��[�NjWX�����ѣ���ʕ+R�z��q <)))���z ?���C'�.\��O������ֳgO�>���Ki�oE����4��ãX����KmJ�7~ԨQB�&M)IA�z��ЪU�2�l�R�'"z|�܅�L�̙3�2�덿�� �����@��#F�@pp0�-[��W�"..vvvpssCǎѧO�T*��3�<��={b�ҥ�r� �����鉀��?��j�_�ut��۷oǹs�`aa�֭[c������0hkgg��3gJ���5O�0���$��@�v�p��y̟?qqq���Ő!C���+]�S���O����SYe/��"� ������ላ���8:z�h��ĉ ������Q���666��K{6l���l۶ 7n�@~~~�~������X�n"##���ggg4h��z�B�.] ����0v�X�\�����u�t��H�����-[� ..N�;o߾��f����駟p��q��ؠo߾3f ,X���$���ǎ�:(�;\����O��ڵkq��)DEEA&��^�zhѢ����P ����� �#�Q��G�����L �t"""""�$�������0I'""""21L҉����L �t"""""��'kB���C�IEND�B`�neo-0.3.3/doc/source/images/multi_segment_diagram.png0000644000175000017500000025470312265516260023742 0ustar sgarciasgarcia00000000000000�PNG  IHDRJ��GʍsRGB���bKGD������� pHYs � �B(�xtIME� &�� IDATx��y��Շ�ꞁa�esAQ�� 5*:�{�F�M��-�ML�&.1��7���"�"���� ��l3}�?�)���z���az8����3�U�շn����{.�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�Q\ ��kp=�w��e�`�1pн�^oC�8'��ߴ<�l�����<���U��aF�RP�cF����Y�@g`M`�+�������@��=`�z���\o�������!�;�0 ��|MQ`��vv`�>@�z�I�5����4I�Y�G���ν3��a���������� �m7��˵� Rܹo�����K�q@����O���� ����o ުπ[���/.��? /�����*�9�W �����+���{:���G��ɽ�������k����^ ~Gu~o���0 �0�L(u:_&5�/��� �@�,^9������0�L �"1Nw'�衟<�.V!tI�yvn��C���&�Z/&��T� ܬ�t� ���9 xX���*�^9u��@ ����=U�8S��d-����l�����aF����:�<��� �}��>7��{Πrv�ױ9�^T,K^{��S`�k��H%�f��'(>.�k��8������ �}���Qr�AI"����ME^�?$�������#� ��0n���wd�_��Ԇ� �0����+�m�� d�iJ���$!��Y9��0���� b>���9P�2�!�Q�4�>��@f�M�m�a� #��BRcE�o9�Vҵ�����O���\W�{�F��3C_��ۑ*;h�{Z�ʫ�;��/�{j�a����p$��2m��W�߲n�)�!��3�����n�S�R�ે6� �� C�O'S�^���:wl���'��� ��t�[Y����x����ߏ�i��X �|�5�w���&-�X��U@NNF<@תHjY�ߑ�~��S�0 ��HMO��'%̳R�{�L��|����:���Y�S�0 ès��'�g�(]���*�>x�D��c�a�t��2}���{ 2��2�m�6�Ñ��'��ː�l Td����� '=���P$0�Y=.�T�܉:�K�x���$25 �q7���' ��޻0�9^��g�@�:����S�0 �HK$�X�䨹 �E=k#�S�����P�ʿ9�z?�R��ϵ��6����L������o�S ����5H���~R�4�:?D�?J����7���� psu���%I����ݨe:A_ �� �d{O �0 �0B�\�XO+ �0 ����`��32�6�"���x�X��a��-� �^� ?�EZY��a�a�a�a�a�a�a�a�a�aF~1I�xb�}#���,�)���[��\Q�+�gS�u} � �0 �ΩI��Țg�$�a���d_�^�|`"��z�z���\o��m�.E֏3 �0 ��� ���j�6d�O��X�!�5i�כK�ғҐ�uk��a�a� 5�(���i�_�)pr�>���8�$�TϿ1��Y�d8�&� ��T�~퇬�YP�^d1[/�5��]�xzn�j�ӑ�5V� ��r���k�H���u]�a�Ѩ���/�5��!|8k

�}�&�s����*���y���l�5U�L��r0 �0 �� �#��yz~�0 ��{ �����)H�� �)@)2í���0 �0 ��h�\�@���!�� ���a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�a�8����z`�>pp�O�S��k�}�n�:f��^\LV��l�� �Á�k����T+#_�F �*Ը|����YU���^���E�3z�5j`������VǬ�զ����%�_ �~���*\ l�h�k��԰8��C�p�_+�zm����S��������s�cV�j[Ǯ՞��y.��~5<�4�_������<+b#��V+�KV ��D�����'��q`��gu��ث98מy.��~5���,�g���>�͉"v�Bg}�Z�c���Aơ?��9�85h�����́���3��.����+�.{p?�?��ϑa���L�8G���B�z�md(�-�Ĥ�/S�p(��6nʢLS#5�:鳯���ì�Y�a3f��.���4�������5����4��qK������w�� `@�1".��k���z�+i���j@����q�^��,п���9���5<(�o������������E�^��ޚ����_X�:V�:��

d�32�w�������YS`��������5b����V922�f��������1JV��~��J��Y�XZ��ѐx ��s���@\��"�Z/��ߛ��a����=p�����M�p}߇7ج?���F$��r@tM��g-�bҶM��[w�FVǬ�Y������H��1��eF �^ �����Zo�b�|d�|��3�{2��G��^i��bĝ�;�y��:ȏ�*� �N�F ��jr�>o��Jfa��Ԇ���>�����:fṵ�Ր������E��� JFC�352]�r02~v�_�0>͡L��?%jsݛ�ܗ& ��$���5�:f6��W}�+D�8 ��5&��|�)52A��ldZkK`B���R{C�A���咚\w}����C�}��1�c�կ��P_g$8����b���B���N ��|��?���|��CC>���@5�V�k���+�?5���x�O��cV����l�~5���x���6&���­��T�%#s&�Y�Y�R��3�;�zH;"��[�݅��8�?�{.���Z�� k��$�P��. n��� �G�7��#H�� �cV�jX�̆Y�����b�C��w�����$���E�l�Gb�ܑȦd?$Щ��Y�q$Po�no�t̅�t׍�,�'�iϓX�s������a|C��.���kyݙ����@������@L���=i�F�!��^!�P�9�/`u��X6�������xu��e�����@��H�S��5kz�|�-p ��tl�>���� G�9�2��u`��B>�^�r�O���4����5�� uld�{�552Ԁ0^�Y^� �$�}�>O�V�^���9��^=�~Y��A��E��`M�aT�� �kV� �_�al3��jp��9$߉aX3�~��Mr�"~��G�;�̳W ��a��0�F��H�EH�� d��r�\��0��V� �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �0 �h �"3�:��� �zp���ߪ(�ZB�?z�B>���53��U�����:^�u(�,F��������mg������ �����w� �Ԇs}`����jL��F��o?��m�݁I��Cb�nB�����[=_���<�I�[�1��!� $v�g!m����9�>m�}A����)I�+TH����w�0�dlK'�� N~1J���~ɏ3&i�UH��H�ٹ*�!C½��;h} ���'��h�v�߭�_k�}�ķ %� N� N.������j�{}�����鐴�R�7@��L$W�ċX���@��6Iu���ķ����w.7�mB�1��+����_�� ca'� ���^%���3�� �$0��;���C�.���S�g��1�-��i'���|�ķ ���O����w� �b�w�� ca'8[�s����\R�TJ�u��C��?��aIۣ���S9>��6�wD;���"���V|? �b�D0 �Gf_�m����� �)�Ҽ��A����dpr1��A�H�A�R�U��Z }�[�6~������W�Ex��E����Bx�@;'"-Ӭ�����d��I7Q�$���V���<��z�� �Ԓ_sB7��N�R$=��_]���`i0������Xݯ�Y�Yo��I��8$d�+�����[x�}�o˲�?@{ۏf�S���=�\���pp�'�tG����r�v_�}&c��L$8�_�d���iᅪ��ge���Pk8��2����k��%$fw�W�AA�F��x ����{~�QwD��&��.��W�ԾZ�F�}Z"��L��TT���*���a��g�������_hߠ����w�V�U}��AZύm��!������۪Gik����Sϻ�~)�E{i�l���,��\�?̀���3���� a� �4Bf[>Jᄧ�����d�O�%���Q]G�WK�C��^n��F G�`\ ��3��Qz��=u����T�<���U�$$��!�Lܢ��U��:1i��B(ȥ��m$W��Ȍ�w� �rc0[mU]��i '�߇��Ѳ����28�5yap���x5>�n�B�ƌ�H V���I/<�0������`�n˴��AZw�ٖ�@ ^���y� �Z�oDto�NbJ���Q���n ?m)�mU�����1��`rCJ6�V� �6e/�1�yJ>F��OE��'!��RO�2d(�>i�������Ȭ��*�~�&�l�E֒K{�,� ��no�֤����U����+�S�V z�`S?Vm�v �b�,lÛ���XQ���,�|�8�����ܓ$�{2���>΃K��Z~� ��w2�$4�?���}3���к �X s΃�ɟO�с�j_�7�o���"�Q$��6^.�b'+�͗…��ܻi��^�7W���c0g�,s�{ �F��aH��H6�u�18�s�­��}� u�x�] ����4��D�w�?*�Fv�?�\��H򓊾K��%�A� �U{�]�¸Q�J����e�� �v����_�\?�{;x�"���dH�X �= ��)��o���.�qТ�trg�O1y�>7��o�P���O�8����Y�T1�-=���=ݔQO�)��W�ʊRQ �����^j����� �<�{blȳ��ԵΈ�!�C4z��a��H\z"Dt���g�ƪ;��0n/��: A�E���Vx�.��ӏ�O�����c\�i߂��\Ef�[��K龱ϼ�:�Q�֐���M�2�����NzM;gq Mbp�U۰Lށb��spB���&���zD:����{�`mL�+M(� �l���MfT�Ŏf����jpu�� ��`��g��#�޾�x�w��A������)�C�vz8���G"�} -�� %/GB�1�q?wRb}�F�]�Ϧ��&O�lV&�3�!�8x��]~��9 �'��7!Ge)޳Ԉ�������%� �Ϣ�}��: tx8m�i�qDD�"`]䋩o<8� �|,�Ub"�����e9����nw~���8 {x���@�g�,��qO�7M>wO`E�V��=G��H��^&���R�L\K�`�YH���S�?Hts�!���oM+�v�>���j9K/�I�hD=��H�h� �#����.�8�l�����N+����X"Adm��Ku�'C9y��x5 ����1>+ �=�7Bq����##q&2�9}�VV��ƾ+۵h�`����H�=*�0k� �NG�c�B�k��|���f���~���K�Q��^b���4�Yt�zN�\�44�=Q��w7���� �8��&�V�������e��q д����$R�X'B-���.Y<��6+�� �C<���t��U:�1����|��N] �J<�mSB��P��"�ߩ����q:��ܸ_������9iL�fC|E*V�`�C{�kY\%{���Q�L�~) �@�a�ʓ� �x�z"��7[��Nf���� �I�i��m���h(|O�����x��$��͞�iz���Ә���;E�W��z���b%0�T5l�ԣ�ԃ�=x̃�=]�=�B��������4�C�9� ��l�Ի�{I����P&9n��;����^�C[@Ѹ�L��fepqY���nY\_`��N�W) l�Z�Z�������K��L /��=xܥ�- ڔ������bx..�|^ n�����L�1�>��K��H��!x�J��~ٞ8���b�>LFNތT������4>)�Y�?V�S��ep�����@GO�!!.&�����]�s<�����P6U���|�>�$7"��� S[���Kc{���6D���v=����D�3L(}�޳�� ���_+��%p��;�=�9l����Ñ��D�'�����̏I��(��71�]*��x `s���'�g�>{�g��^ �]���� 2^�'�yk� IDATrM�ܻOTL-tY���<�Jῥ�%ԋ7x*��2(�����=ͮ��bx�N+O�" .�ah����r�6�U��x=7��m[�t�,����N�g�� y��{,��(l�E]�M�7\v�+^ �U�g�!كs����_����dzL���p�I���0�� *��Z8x��� ok�h7$�,`ϱI�h��OA �k\��* �?"An/K #P[�%��)0�I��_w0��*�c�x�q�v�v���(�����i'���}�&�<&i��t�Q1�@�r_���q��;`V�\�z�7�G�c��`�>�9ńRݱU+��Ho�&����*z#2{9Ug}U B���� � r2�rj-��Ű�����E�z�"M�D�F8�D�c�0�!�s���IC[p��D�HhW��9HdL\U�b:n;����z=���T(y��]bUs� D�CD�p+C\`�d\ޜ�)���=�n�4í�F�r��ï<8˓^����X��Vy>S��)@�zm�.��{ ������&�Q!|�]T@m�T�i/!��'��oH=�|(����d���6^�<���岎!�C��z=�������M/}bb��:l�� 0�I����\��{T[�0����8����XX."Կ^������yAkJ � �.�u۫p xnG�IJ�6������/bpb�����oԺ1�.8�_?��bWufX?�f�H�yo}���w��f����3�v��t@O�C��Ez�P[�6sY >�]&�^:���I�i6��V $U-6vg`� ɛ�����4��l�spD��� � ���ԓT1_x��� su��ۄR�撝Y��uמۗIb�%r���'Us�WoO�Z����ŝ���bpxL�Byҋ� ����g�?���q�5�6��� �3.��@�N����|�����س�x�u��!&^��w<�Q���%���ޕ=����z�v��l��>-�?�D���qТ���qh�k�U�k"0�T,*�l����)�X����{2t��8h����_���":[ 8R��J~��S�)�H�p�B��2����^�K�5��Ro��B�a��<����%����M���I)�ݘ�T��"ʯ�{�(��Zn#�zP��ت��8X�.�Ä[b 5l�wzp�'+"�� �-�ʟ��s�v2��BU��T�A���m�\�O/`�zb�yS��%%I�ˉ�N���75$"����@�����ٍN&0Q�~/�IĄRޱgȶY�<Ƿ�-zM=G��Y�߄� �' �b'=��7����w'��%p^ ��IS�@�����~ ��d�62#��^Z���� ��ɲ)�U$��V�P�N����M[`���׵��;�� ݧ�����GO��.р�^�������t?���7RQٓ4>��X� wq�#�N�� �B�kz\�c`\bM�)0P�Y�]�<�[�}�‡�u i|/�@w��[�A�"X�.ģT���\�W�"����4'�� ��Ώ�u-� �� d��&bRF_�Ȑ��$rt�AV�\����s���B�8t������H� ��j�U�HN��F�]��d�d��t�,ܻDE���(���W:2�ah�YE��x^^�^)dɗ �}�F�AqYdzp�h[����(X��j"p�����%٪���ҏw�}�ҙ��� *6��B4�^=������r�P_�L�Yt��۝=�<P,�som=�}�ܯվ��k��{�J$D��b��B;�ɶ**��p��t ��4}7�y�����\�v�� ��z�,���D���뉗��u�t� ��!B���O�y��H�vRa�'1��Z�<=s|�K ��@��|1�D��;8��w����P.Ƨ÷p�S���B/T�!�go8���\S��?�/�7��2�+d�rmP�hop�X�kC�_�������^Z� ] �(� �}�����l���� X�޳J��M��)>��am�Ak tj/�~�Є����b|6����t�oi�"�<JN�P �spu ����O��v~:��O��E�L\��e����eDTX;�Y��F-sI�z��~'�B�j��y"�+��`���T�������<��A��R6]�ē��&��y�`�g��� �폃]O�"!b}p |X �KT �1���N�w��w���M���<����ɑ���C��������)0�4q�j������*���7no=H~'_�vWq^�]�Y�Ã��v�0�j��ry�˅w�@���_$��Nzn_U[u��Z ���Ē�B���bw/!$�U/�@��au��ЄR�Ћ��S6����c�z�nQ��AfR n���6����oZ��/(��b7Zz�)9U�oZ\ƮC=JN���b�;{�ҏ��S���/��?d��`�?����y���N��.p �'��Uz-[�`etۜ"I=t�Gd��5>��%V��/�܈�lw��Ճ�_:W�� _� D�ٿ+���"0�㯶�f���Lsi:������Z/g���i�eF�p��N�^��q�"Ɯ����].bf����a`Q|��㉉ F���;�_<o�"�������8�(0M� �i�;.3��H=���^+�kO�Q�J�o�m�0�W,�C' �?� ��|� �*/EQ��ၓS�`��͍�p䁈�[�d�z�ڲ/ԛ�'�x����cު��k��� a�Is��ڝ�L׿Y�u%��{��:A����.HO\���Œ�����c�o>��c%��Kd�`P8u9g�x����AT�^j�\�z‚b�4fC�٫�Oh�遍���� $��d��� 5�����;��׺�֓@�M�ᓵR/����p��@��X�/^��oX�`��~�_,�J�����Q8@�P��(�7�u���z��vi-�O�$�Iq��:C���lMU�]=�� �6 �4����`LD�����'"^�o�{q��[��Am=�] kb��8R�Z���d�`4����\�^#�� Bi�^�ʝ ��$��Q������Qb@���n O���K��5���H���e�98�H�V��O�U7�:]vW}Od�7�� տ�"3D> ���uv���*�zy�H>�ybP�r�:��Wo@�u����O=JN �ĐJ8=Y ���/�+�k�X�����4wZf�@E �9 �.�V%�wD��wAb�����_D��� |Q�M �A{/�������? �!�(�|N�d�bW^�����w�=t�Pf\/B&64v���U�ت#���5UK�,��� ��%�X����CgsN�z��U�nl\���z��fB�nˈ[�� �^��*�%�����W�}�����1q��.�Z�����u��Ɨ�9ؼ:�A�����ց�2x���qeN�__`f ̋I@�5@S��ȓd�eк%L�Ft˽��9ф��0�Q#|�o�Ǔ����03���ND����Nq2{gn�-�;��Y*���Z��H\���=� &��N�P'C�u�| �� SQ�A�gu�$���RD݁�%�a�f3\�4,y"u��K �� ä+R�2On)�qhuԩ�e���@��FzO�i[U���Ed����“$��4���iI5�����18�Kaã�v\���������R� �V,56@��y���Iҋ 3Sj)�f�{@�(���$�ZJ��iP�������� �-��-k�����������2q�GOj�b�^�2$�ur�?Z��y�x�Pʤ�e���.��h�u=��`���uj �~�:��ց�S��%��4Mɑ�k]�I�b �8 Tt��,Ȭ��rr������$"��.mUڜ}-�uD5��i������Gg���-I4#2Q�� M�[�N�#M�����c� ~m}�WJuS�;�P���+�4��:j��z� oFAWQ x2�i4MLWTֻ�X�k�Kď�j �\+I�6+v� v5N�S�8 ��$�mSؔ�`�\*����ӦZ'a]6��Ɍ���e8������Ec�V���g��?�49˶Ut���x'�2�J�{�'Ǘ��76���"R��*N<�ɿ�/4�ٵP�t��h�]exj� &��C�uu�`P,��S`�c�mCn�N���(��4^�0o�d&~{,�IO�����h���Z ����ػ���]QW�j�{1:dޖ��:>�4cuv�=�Ȅ^��C�6�T�mˁ�uc�`�Fn��m!y4�ڨyOF{��r�I�̞ͬ'n�X���a'/7�|��z���ਊ�Y}&����-�P2�����+ �-�ҌƇ�s<�IW�7���L(ٰ}ȶ��X�t�6�0�e�؆��F�%��=�C�}c�b�a&��p��܊�0 �0L(I+›P2�A;$�NM�_d�8���1���T&<$7�D$�!���C.�a� �K�Gi��alUNG���d�2[k���C��Hv�c�%�2E���,R�%`rq��t�#i  KLA"��o#�X��0��k���\�������#��)�w �z��Ɏ��ec �Uؤ�}$�� H��!��K��!��}��ϫa���9R�����B1[1�7� ��H��:Rg�(�# koV�3N�?�ŵܭu� ���Q����l&e��+�ŏ�lC6k*0Ț߆ņ��ي%�P�/��6�q=Ǖ�=�:F����۲��G���ޯKU�ā?������1�ו ��S�T6�kc#XlB��B�����T]���09��[]|�Pj��N��'|�~}�$D$9tm#�P�/��Y��]d1T�1z�K��4:��O$�B��$�Yr���Z~� 5:�T6���,���J�J[S|�C�i���n�B)�c��l��A"�yH��O�E�Wl�� �Fl&�Z[�����_����߫�/�rt�� � ���s}`���j�fy�_�m� ����' H2�����}�!�@7�����D6?���y�|=v�Ũւ1��!��? iS����ˡ��i�� �v�-����O�U+��9��^��v1�t�\s"��2om��ΪY�2:��=9)^���A��a�Ob��mb�=`�q \T�v�餕�xσ��~����Vo@ ~� 9�*I�n�P�"�\'i��ڌuk�Y�X����a��"`}���[�<7�m��ѹM �2������0� �oU�8� �E����P�BiX�P����s*φ�&(��n�cpE�L��w�@b��K��DJc���E����&�<0G�� ���Q���P: ��I�Z��������z'�jq���g �8�G�#�4��P6�=(=�e>ږ��|�mg�i6S���"��<��Dz��j�vئ�"������w}s�p&�2��������e)SC���m妇r�� '� �A���_�=8�K����a�O��h�^�� ֍ۘ��o�0'B�Jcu�����`ث�����!��z0���D�c�y��UtV��Y~�C\�Y~�ρ����Q�� ����Ojq��iՊ6h�s|��$]�3��0�x4��R|��������x�h�3�O���+$��������\�!]2�s�WI��h�6��?&m �]ߌ�v�?$M��n;6�J�1��}h]�R�����~��X��jq���p"��qs#����>tt^h�ؼ�j3*��up�(x�)�� ��Lx} ��{�KC���o�WjM��aұ��.1��$���I�Oi@(ի��1IDz�&��� ��&mQ�z��-]�%k��Q�qH2�Ӂ�I�\�d���!:ɫq�6��e��*�����< _t�B� p�� IDATY���@4"��H���|���������t[Wt��m2�r��%қ�p(�ct2�?꫽8���_%��dh:v�'���qТ.+�X6��2���ϴq#�د_$����e#�C��wD��f�0�M��z2���d%��Y�n�����h�m�)�:��t� ��A�߃��)L��Ɗ��,e�T;XÁG���<�� x�TlQk�9Q &9A�7��j��T��7 \��g�z"��˙��AO/�5���7����"2/7��oي�Y�����g��T��B��h�gm�/D���\� /U��$fa����I�??@��ͻ��t��w2%����Fwdݶ~�+1q]w����c����Z�уߴ�:{{]W�f2�v�����3�*��} �9I��Kn�6���c�����Eq.�T��x��5����~h� vLѫ� 7�b���G���YZ����q"�_ؒ�5�1oq|��6�r'�>��g�{zdq}=�����4�TO9��Y(m@���H�ʹl�&k���}���)�{���}�SuJ�~�K4Ҥ�w����X!=��H ��F݁E�‚�̆�h�dF��t�'���'<��3��&3� Mc00E82 /4ƫ����l�H���K���j�{�{�;����7D*��*�U� ���a�pȣ���l`����R�;����8'E���(���|��:����D��Ջi#I4 �w���)����X�����̌�;S��R���nY�ҨQ�F ��N� da9.a�Ǝ%����G�]\��$���¸�Y}u�g0w����%Lv�s���z�^�Af�Mi,��-���4E̎ ��KD��[��r�� �RY �$zi ��|�-}�bi���^�Nq����#����G�8;"��3�~��7U/��v~���k��ɐ��YUy f���^�Gj��< �c�L &ũ ��Oþ�F0���8�?���$�=�� �x��p��9�����W��m.�2=;w���PNoO��G�9Go�Of1u ��w�ЪK�LJA�*�S/D+ϓz��r�j�O�H�Kɫ�#���8�:��x/�y�hZ㱯���x�`s�!����92k���T<�^����r�֪7OB�ǩ:T�d�ID&����K�%�N�"���X�DĶL��|w`���c�KL�Yp���%����t��v�Q>p��Q�3��D�߃�{pi\��,8M������3'��!�0���5��C��cr���O=�'�0߭�TF�����mmT4�����g������A�W&3/p�t������(����BYy�"J���,8N��y���k��=�Fd�P*B�'���˝L{��D 6Ce���骼oA*�A�:g>礼j���UBR�Ĕ�T��2�#.��[ &�d���� O\���ԉ�Q08�Βt�����m)�j|e�q(0�T1D4gUD2�n��|���<.������Ϫ���8�u�|�>���Z����dh�$���=ep[ ��u��o..���%Vo��I2=�m��U(�5�{P��yA������iN\�85f���h�Ex�pg<��<�-6�����D�-���"�+�q��cJ�9�z���������Y`� ,��/x��긙��v�q<��^`���P:�?�l��q.���92��%�%� �q��p}���� �Ir@y�^�cx�K,�ں=���XP�=@K��X1M\<2v,q/��@�@�s�A�'��/��6���K��鯥.q�N��)6:���J��d�q���g�M��{㉵�^�dH�{���n4�>Zf��u[ �F`VLg�N����4':uQ�� ����d^`t%JU!�'α�ZA7�Yv�:"����< � 1\���ވA{M{p�c4v�3 ��:�*��N��I(z�R�+����P�}��P�.*�6:�&7X���ռ �vI3�+��]��O!�r�$��$����+UݩQd=���n�����yxT���?���MD\p���D�� ����J����Z�%�ڪ��Vm�j��HnwQA�q�P� � I澿?��fr�� ��<�&w&����~��lyp�+!��v(�CpM`il*�h�_ �����*���Pݾ{1V��G�%p�� �&� �5R-$O�DC#���� �1��0(N�H���ܡ�J'ޢ���xìF�}�Rw��b�b~�\>~m���b�o~u�4�Xha����z��鯆�U��/!jq�`uW�3X�̣\/o��ݮ�1��_�}��1t1!�s,�������b �1�Z�R��5d�V �M��)M��S���q���?��s,[i�o`v� nMO�Fc�a��xx:w����b�|E!���)�2�Mcg�4<��|lQѓC�쎥�)�;_�F�a�䑜CzO��|��@����F��hk��JG ����'�X�MX~�yLI���bOQ�D�'��f`�5<�����s�����pOx�T�^0���z �e�' ��#�S�Tg����������HuzA%�Y�@������"����F�3#�7� ��GY4k���J����h^,��P�Ҭz_���qm�08���t�-+��J�4�=��O�T�|~��� o�z�ļ��֎=*�`�'ύ��Ke��AX� a��).>����IK�����d&2��Z�V�Ls�^����,��~6�b,[�>{�p.�Am3�5�E�� +� �t�����k�w�ܡ��z6]��mx��� [#��rsq��> ����>wݑ�l��%��)7�°f�|ea�5<�!�^���-���Q�j��s���ߛ�X�Fst�)k��ݍe��'ZS���#������K�$|��e o(����pܤ���mU� ���5������rJ�%�a+�C�HG߳��.�I ����#p�ge�L��V�o��a5 �T��f]�%R$��P�Ȑ{�UL}��Ɯ�08G�EE�8u��fN ˄�k ��]���-\c��Ѱ& ��Y�ȶ=� 7�Q�.�Z�������' �J%d?�³H�1��V$�7�)0Xm�w�p�|��������W�^�-�н*�꠶�T��w��:𩉍�*��E��c� W� i���\_S�0<� ? �������I����n�Hv��()���پ)�u��1x�KX�A,vِ�R ��Yg��U�? XP�_�<���8�T��S P�v����Z�3_�ֶ9�aT(���ʌTT.�Mِ����J���ِ� �,ܠ�g�>��5>s5�v���~�������B7��4]�'Ƨ �ގ[����G��M8�]ω���e�|F~4,ˆ�p,��T��9�$a:(���b�<�'0xW )�nDh�m�S���E�$�u@��Se��R^͗<�AH��� ��M��\�G2�������j����x����d���Q�x.��e�I�H�G�s���� ̗sw #t6�<�r ����ݑ�k�a� 3 ��Jݯ�m �eǚ?�e"����ʨ$/��:�k��T{���K>=�(�Ҫm)Ƅ�P��r�4�������_�����h-%q8(E � /u��>��+�O�s�P�Bb8ˉ6������qx}�@��_)�5�v�H(.��Դ��0����PP�ZBO_Ί�Z��<>�����_a�[ � |b�MEBK�n�v�gP|�FMP�,`)�XΣ��c�Jky��7�m$ߤ��LD�N�@��ԢGa�Ҫ�RG�Z�*��d��9����>m� 50t�_�@}�xHO)�Xc9�Z����;���٬s�&���ʈ���%����͜�;������A��g� ���9�b@x���g&��Gq���~m�_�Q�6���,�_�g�W��h8�#ݫ��ȳ�Uu�0 K������r+���0<���T�Ve"M$�������nO�L���d����mGB�w�;4���=��Tݾl�A�K�@i�H�eU���@��) ̭�k(%P�/�� �h�zդ�R�}@�{KzKP65��.X��I�T%P�/��i��)����w�<�Z&]הQj�YcJ�f�V��y5��3��Q�@�A��,p{ҭDJ �W�����a��q{R��@)HRqB�PV����0I��wԑ' R%�����^���$N*���DAMo���� �w��JO��(ݡ��GH߬��BdlBu$����tؚW�~R``��MI(5�^=��T�x�4.�-H:`z��5y�CZ+� �����I�TKi-Co��(}��z�w ���� �'I�T(5����k�Z� �'�M��h�&���3>��0ӭe�w�̃��Pr��ŕ�|�e�ދ.�n�L$��̼jK3X�NF���ܣk8�n�/!�'��� ډDJ �W���6`ǁ͓4�ʤ���yh�BąȄ�7��۩�.��ʭ�ƽ� �[��NB)�%-�Yo{���n0�X���@�L��и��x��t5?��sf�`p�П�U�w�Fȟ=��@���Bs�_��� �K$��_�������M3��#r�yS��H�eK��~]���K$�:]A�5��ڨ�Ϋ�߾�~�Bf����\�k��D(�E߫�����o��ٗ�_^�V����w��k$� e 1�YX��&����սpFW�v=.���Jt���j/ p�R9Ml�G5����R�C���i�r�P�t9dk�u� ,���� ��t���4�/II��] ���ۿ�/f��V���zt#S�,ZptM�RKl%�h |������Vr��zǩn� ���^��#��ɵ�iȦFI�����g۪�ي����?�����aWO�@i��H#ع�O�Ձѫ�Q|���� �h�2��N G�(y�=#{g;O�U(�ZB)��a��c�/�I�>b�(�?�8ϭ>eY�{}��(a6��~W?Y���k����2�e�> ������}��K��g�H�����ME��y�ᾟ?������\у�^nȑF�Q9 ¿�����"��נ��R@Q���Oq�KX�v$�������S,|b`PVp�׫|��]��o��a���<f�N�g�LΊt� �-t5�g( �j��|�w:r�WM(����doї�mߎP�}>��R�����@)q�+�(H��L�0�g��������m>Pg �(��c ��r 9�4+Љzi���g2���E����>50��}S��E��KJ��=��N���0eb^m��觻\�ѯ/k��C��3�s~c�a.��r�������E�Z �7!��Xѥ$��C%��^���J��p�x@�u�|����y���@_+�v��U\ma��^��� 0��D��O�Zx2n�`���+E? &��3����'Ӷ�Kx^3vn;��߲��(Xy,�H1�3��\cP�D����o)�>I�T�7����v)+�/4g�9[�� �BB5�uuQ�k.�q%�5`��pG����F���/W֦���"�����Jh�\/�o�Ҭ�5n�]���c���(���9�Gh��wK$�sk)����IpD��PZ�0�]�~wu�r�MP"죐��̗�d~�;Lׇ�9%.<���<8���u��H��u��a,���V��w؎����p�$8~j�e��-f�bc��D� ��.����R�ʇK\x���b8 ��ydf�H�XWe3l>N������y��J�Е~g��u��V�����+�U{#˃K]��V2W�I/�o����8YB���=Y�����S5_�HE�t���p���P�.L�(�^+�] �R`�'�3��B���F����� Ǹp�[G�K�v����Y��I�ԛ/�O�=e�g��A� ���T�f�= ΣL����@)�c�Q`l><�6��������s@�۳� |���x�ވ?fd)���T���-�v%��B�dc�*Կ�U�VZ�\�����1��c�M���#�Q`a�'�� ��}�h���ũEpIHX���y��c�ѰҀ́g��5l�$�&����p�kR�S'���j��⊩��e�7�}����2�������3Oј��ʤ���C��W�a� D�a�a� �v��Y� RV�׎��F*ھ�p�s0k�/�̕�雑�ݙG �YS������3p~�4���Q���mf/C����bS|OX���T�+����wg�7J�c��g�x|��a��<��/�R��[h�a�>�{���Y�j�m�|#� �mva�����/������}�$�a�`h�E��ω�š�e����C<��5Ȉ��ߕ��A�h�@�ݩ5s�\>�4,9gAr^�������R4�� DC�KQFi���H+�����.��^�ӕ�B� ��z�u�OV��\��0�ba����]������́;"p��]��9��0�B{OZq�B�8�=�7r�&+��WV@X>=��z5��Z6y�;�In�:wWG=,`�:SQ���J���ӕI\�G D����˓���|�y�H�60��a�����α��*\I�!,�>��WzZ7�=�66��}b���;��S��؀R jֻeO]2"5���gO�*O�s`�ʟ��[Ź.ǦE�������MAh���F�6��OVe�O�{] �b�}���x�}@d��$��wz�έ�{H�.������SPR:� 6E�t�g��8څ�a�"` !����HW/�x�ca���0rͯ��|P�5�y{�>�e��n �@N���_(��T¨Zx���/B� ��x*t��X��V�����c�>�t#���02_(�}C������,� \�"}U.�۸��pvQu��|�5�8���]): �ƀx�*_�@��� #��"�z,r��U�>�ӯU�6+��4a��>ۋ��]y^�7PP�Kn���T�ˍHHf��b �&� �J`bu�1Or[u�?K}ZE���5h�S��Y����,�섯3��3���Z�|n�>]������W��H���W���r��~��y�.ų�X�������� ��?~C\H-N�"y�FlP[|2F��'qΟUg�CO�FF�ڲyks���l%��*� ��$�EmQ3��<Ձ���X?`O:\�G�8{댄��$P�vᮮll@�t �{"����#��;����]RG��6U�����#�dS���g9�4_��O�Z�1�ՃI܉< ��-H���;K ���p��y��t�0-"l�������9N Dq@I7��F��ׁQ.� �9�Ko�;#F�B�ï^�wc%lv!0q�0m��.��.,PJ?��&}+��HXm~���s�� T,��4Eҿ�p��� L�%�'γr.�')#�P��n���%F��a�w2��l���k`� �? i-�>O��]�h����WA ��ƒ��0���p�'���pUй�J�4z���( ��yQ�����%��J`��"eB�_E���b�!�� ����n�!�Ͻ�@�P�G����� ��[߀��A�BF�}��r�YV�k]�<��{�B7 8���/r�� N�R�����V�[�_�W��_��L�j���p�|�/�e���V�-�CέR�����B����+a��xL����a\���'�3���҇Ɩ��Gbu_6�Z��1P�@��g�y��,3�MuE��T���b�����v}h��QN.��å�3,ԇ�S�jJ\x�C1 ��Y�l���i�0�a�l���"}�o�I�0M�"�Ѯ�Z(�0Ŏx�y e� 8����+������h�G�i>�w�l�)��+}w�W��=�ְۛ麱��l |���T�\��*"����,�3Y�� K4w�$�?k�)����F¯��L��/g%�d�8 ���ua�$ٔ��P��������d!a���p�2-�5�����}�z肛��QJ�O6�6��GD�+}0.( [�]F���S����E _o�>�ea�4�����+�����ð�JnfG��V(}h`��~* ���}�g���*n��£.����H�o-���}�!� Ƥ�5�(Y�%;�j�Gm�L�Z 3�EB>��b��w�5:F7ߗ��W�pH����۪Ta�B�gt����X��c�s��R'��̗}#��Os���kJ�9�����'��#�ю�� ��cG-�dïK��s�C����C���`ED��q�ց�|���If��ذ�kZ��O���U-�����,��Q��l*k_��}������ꊺD,��;b|z ƨ%�Y|ዩ�O�� �}�C�0(ua�Oo����q�_��̓���'!`h��ب�r ���R#�7.$�#Y� �Sn,�z0'O��̈́�:^)�E)�M$��_L�N����GNJ!;5n-�9���"�;Z�@��܋l�҅�;�)a�a Z����$�o�H�|���LWBu���[[�`~2�Ņt�'��wDJ��{GG�#���g �\�.���2g�Na�M�84�|��0e�[9�i-�1-} �>��u~a+�VL�n��Wk |�T����x�A[�;z 8�HH�|T*�B{�#c�C�ϓ�F����~-�Ҿ9�"��C���x�S,\?Y�%V��3��U׹�Q=�gy���� ��D�� ?�i�(Sؒǀ� `�@q(J����2݌����� ���gU� ��E���3E�:�1FGj��0MS`d�I>ٹ�wRg, u�����]�7�G������ZM̦.� oi#Ƚ�"�O.�u��ř�+�q\��wv+�fC�q��gql����>k�i# �����a�W5U�T���^�+��$��״���vy��s'"�H<�D�W6j)����ѯ���JpS+y��P/s(1�9��M����h� 4�5q\�q��_�j� � �^��;���H� �w0�2����/Y�O�0i6����*ia)<�-�ӴD5�F�ɒ�� �h���h�3|�Qؓf�J ���o��o�����YZ໾��E����� �۔�ܢ�Ls+ݦsa�[�X�cK� S�1^,/$�T�� ��2��$�3��L�0�Hyg�q0𵕄��ڇ(ڣ^��>����C#q�6+nY�A����$8ӁO�a���|�����}��k�� `[&�.m�v9r?�xܓ$�%����X�u\a�Fx0;�rE��o��Q{�R�ZDGM�A���&�W?U���r! p�v���^!h�y�'�&B��m����E�QO��F�Rd�6 ���2^��,�v�'��5�߉���kњD .��ńec�ޯə�>�/���|TW��؁R3���Ⱥ�i'� ���j�!;�5SC�P1�Ո��?���0�&��}e`�F�� ��9[+�jE��Z�F��P�[�����t�� <� �� �DM��K`cX��v���4�Y��J~ҷ��f��5|Г��SM��[�c�:��t��tċ��QH�dc���G����[h�́r� f���x���/�2�ޯu���~mD;>?\��D`�nN7�1�$�Kl�X�A��}.2�+�V��'��(N�Y"����?�A�$X����JHh��j�#����ЕUw���"��kO��>c]����� ��w.8aH�i1›��5Gt��T��AoO�m���~�F��ڈ$��$~��hÀ��|�J6��+�$�)��4������g�l�?0R ��_5jd��D#�Y�����4��K�Q(Ű:M{CY�<��)�Ł�ϻ�� #��'!���S~�d4���#�=���a��Ƙe��ɯK)�x��+�3S0��~u3�pF׺˕P���a���J��;��p�]=q6��5�ߌ2�s⫦��G��/�Gb�chuVѱ���&G�BFv܆�c7#��>Fr'n�c�B�TV������$��=e;l�}1 |�-���JK\�U)��L�ʆ��\�A6`n��f��>���ca�$HW��}�z�V�P��,Ƚji�3+�7��\�L YDly�9_�Ѻt諆f��1�p�#Iٸ�����u��BX4P�,`���a΍FV�X� [ �q`�����G�6W�K��P���g0�=l�h�NO���:Yo����”f�e+��Q����*g"ɵ�����Bj���1{ 4��-�~��^e��W�X���*1p�'����A�+�|[��x[s���K,���w%��Tm=�l��Dѧ"JG[�k���{_E\������N]3$�bQtȰ�Xbˆ�7եI�v� =�Z�E�C�YIK\ /���mZ%��������6󥲶O�Z���3 �� О�1�V-E��6)eW 0��(�i�5.�(�E��?�|������0yA)�#�{@iZ�K��_���QO�u�A�P-�Qe:���g� #�rZ�;ld��ms�m�X�ɵ ��� IDAT����,#�߅`N�x�h,L'N?�$�N��h��%��2k ���Pи�@K.x��$g��.���M6��\-Wp�*6�U�r���#y���� H/(�Y��%��O���\ɕ;2�K�O��v���@C�+�� ���󌅴4��h4h$_����K �ܬ�N[4$�h�3�f������'�����>r X뺒-�����o�}�-��BE��:u���}�ܗ�/$�t��$oz�z  �| )�")(�V���|c��"!�-�����`��K����%g�g0�" �%�j{�� ����"5�7�y��,�zRJw�ֆ5�d �+Ew�8�����0s�6���P�g:Z����ѻ�%��m�Zm)��}�t?�i��޽4YǺ1��!?�R�6�r{����2�–��@vȗ.��Xa��s/R��q�Ft]��"���c�C����%Z�a� ��=���nk-|��C��? S�W��S���1�-���ڄ�n;���s�cNaԞ�l�?(|��� �e�v?r�9m V���v���R��PZRv�jia��7 ���;��W��H_�Av-�zh}\��a]8� �@I6l�`�Z �Q8}=��O�Y�ՙ��_�k�2��5h׼��OP0��D |�?/���Y�w_ p��W@��x���m:j'���nW :2�o�����q����F\�������Z����}>ll�����o�g]�?_���h��/-�\2�Y�V��,*!xQ�R�@R ��ѹ�d���a�ο)cZ�����0� �%{��Ts�s�R��d��RMg����KO��H�y��Og�|�4�\���,�A-[��Np݅�ܴ�6�� �d,tp�ʰ�����t�����k�I`_�H�BY۱I���솂����� ��B�&�6���dÊ|K��1�Ւ1B.���P� /�e�t��G&�Mk�����Lo�."��޷oҖ�3�IJ������OV��I�+��%# H�L������p�EC���l��%�j�F�$�X�6��z�O�>��6:2�/)�T4?n-�={q�/Q]9��0�2�}�W4 ��R®?D(�!X�"^R��1֝�qv�{�_6����'�*��[ò]��� l�ϡʖ\��%/gR�@I� �^��f`��ߝm\!���|��_�|��A����_�̲�M�dci%��!Ý�����9D�M�����b+x����1�|��d��$�:t�&������eK�#����Z�}T�6mɎ 9�T�Rr>�5|z��%�RU��Yҗ�I»��$��،3��K�)գ���̔j> ���i�I9h$ k�Sq�t{$Gcfm���H�M�Mi��,Kl�A��'��=t�GI�����vG�8����9Ȝ���<����y��T����?)&� �|+�y,��z$AR��,P:��3Y����iC$4�s}��pπ��%,� �Q��F/�膶)3��z!��'�4�K�2�"5hS �-���lArG2��h����/,�� �P���c�{)H7�{��Eg�� zR��@�����`�H��`�2��F��AlNfR��'��� �E1��#���{�6Vy.�\�}�D����X� ϬP�͸J>�^=� H��V$V�����d�V$a�A ����t���]�ɉ�����W��W�H�'3��݉�� 8�ߪ��V�T���Z���K�a� ������˻E���A�[�4<�;aI�:I׈�����9�q���SO%m�p�'�>�C�O`��13J�lZ��yX{"7lh ���>����뙡��?��{��{�ջ:���L��3��bh�c�ؙ5��JJ�����2��6d��⎋nFAU���� I���k)Ѽ���[ڤtjZ��2�j�X��t*?�����$�21�%�X�ٝ�� !s��Y�^M�U�(՗g�Z�Ч��ߨ\�����̢2�,��Y����ݙH��0��0���Dzb9q�ݤ��7��օ�a�j(�, B�~���y�ۉ��(5�NEe�~��B�^>�n��,J���pI��Qr�ô�Vm���pb�3R�אL�.�=�W߻*ฺ��.C��=L�6�CF\�޾�� Pdk�IJL���/����1d�;a)�F�S}H��B�7������J��&�S��Y�[���:ө��d[�!���y�IcJ����h��&N�]����d��*����\��y Y�F�����������E�� �� a��j�_Y��!56u� ��`n�SOr�����"M)��;v Rhq?�{�c����0k�z^�l�خGZ[|�l&شu��w��=nCC蔗B&��X��$�R�JK��ꉵЮc&��H�dR�Q�Ϭ��dX6�Ӑ޾g,;0I�TG@|2^�0}��~�P �a�G��.Cʨ���$�5�l� �û8��ߓ�ttʨ� #i�5�N�"�((:؝�Ɯ̽I��u�M�d�A�3�%�M��ٛ�ٯ�J����@�g�!�^٣���h1@G�73+�uS�s�zf��]�_>������0�(�����沨�c.E�b�d 2T����l�+�9r������LQ@>:-�Su�S>b�?���}�_��ԩ�v ���i�(�"8�7%h��KR�=���=�����H�۹HBc�3;���� �e��6���xfQ��/$�x�zf��Ċ�8�rO��d����U������ow�SnS{R;@�ѱ{�.2*� �j�/�;�������XlM���֩'��hFG�p>ŕ|WMt�Ar8�n��fG�Z�<Ñ��a/�����>X:sCb���T"� J4v$�U�3�8�Ύ������3�N��Dy��c�1 ��[����Ph�$��� a�yT�7v$���|�0����3���9�^��)3��=�xZǐ`���_��:�����W�� F��R��h%.�p�W��~˅F�S_o��'�������mE: !�)���m�_A� �� ی��1�ƪI��hr�QC�3wa� :s$P*@���_�n�+��Y���jC���M)��E}�J!��b�V�ջ�o=Z��BÁJO%�P(6��ξ�MF"�kOTnsf�e�&��?��P� d"����� ��t����p�^���R�H!�/��Xu'�v�l��m�ٽ �V'�,=n-һ�ъx�#�:u����zJ'V+���)Y��IHuE:/���|��*>����Щ�l ��eT�Fp��h~���J�dۖ���4[B��u�7sۙ8����]ҧ��Zy�k �ף]��3{I���"}�r5w5���Z[��a޾p����m4�|��X��hj%�|��ϸ#�ק��/�ҭp�{��[nh��7����93�?�AMR;�wܟ��O}@)E�����|Nu�4��ڵH/��ӈCoL�85�FV��<��{#�ҩ��l�ߞRNF�F#�HO���^���t*^��lϟ�0�(էN��a{z�y���zP��0dUT�@)N��e�!X�̽#�׻,(��|�zS�}���EO�qd��r�g�y��|���2)m��ûJXS �l�zc��g5U���H�.��wo�Ų}ܛ�v��i��D�����_;���Nc�A�c��<�p�?�.�z�t\� ����[X�wEm{� �0D�v�o>��V܁�$$_��q£�F!� e ��k��9����}�4�6� �k�~�r;3i8�8�;����|��[~�_ ���`���S���x�l��l�eˁ�5f$e�wC�����9�g�PɎF�ޠ���4M����1�����r����һ���C��a]!��F�TA� �]����hU��~���)8�$9�� de��\��nB�W��w2�n��Q�*�?=��Fxb|��M�S���?���Ê�3�r;�a[��T����c�oA2Lu�պ<���7S����.K[T��Ɖ�����?kh���� GY�l K��A�L��n��e�*w-m�22*�O1�\~���N@���"�(U";iն���Z�qK��XI����:z6�(������?Na�'����3ʏx~(m�Sy �U���6�g�� �����@�|()a�������)Z�Π�ܴ�X�����h�H=Hȥ��hv4��m� x�H'��ђm[8��|v}�.WC�v�Ha�~�;eLP�R ��-wR�7�X��c�PA�p�H:���^��x�n8)���i��qR�|g��h�AJuhS���l�Y���lJy�{�p��Y���<�n +[�r���*��1t��+�J�������&_���ٙ�����i l���P�eWJJ� Y�d��MY.�c�,s���V��:)�Sf]��+������;Fr8(����$|l�E��7��Q“�������~OOb���z���Z�{}�E�N� ��c<��b�D���V���X���|~y�׳��^�p�ݱ�ݲ�7��S� �.ݱu�Ko�PR�8�=�vύ�ǎ��qvi�G,7�r�'o?���x܌�GU��2����6�2� N{��e�%��}�Y�-��lW ���j�Ҋ=��Z�������}{�7��SSJv?�p�#p-��Y�?�<�3VO�)k�����Ȧ ���л�!�#�cJ}����3�C��g��^<�V��ʙ��\�f�:���aF�|A⌏a��������]��i%�f���T�1�� �4�P`� �Tx0�@ɩ���V)�e�����بO�b���(�ʃ�\X�_��&֒`��f������p��W5h�vy��<�-��!�X_/`�� SR�pp7����$�o�wǜ:7���#�e �y����g�r���K�'v�,�2���P�����h�� ���b��3c_.�aaPu�1��ჴH0��1#�q>Pja�5������%��\ �m8� �J�D'd&���^l�A�ӳ�N�f��6��_/�)g������Pl쾹�Q��#��� ����Mg��<� ����L�∦�v"Ƀ��&��[�_�(��zyb狭��C(z�������������C�݋Tm�G:�N���g弰0_������jT7�3�Y����d|���tǖ��Zˑs ,��Kk2��?��HJ 0�x�s�sb�F,V�1x˱A��Z:[�#0�M&�`uRG�#8�N��'��*�J� �U�6I�������W���T'1m� �.�m�C*��T��nF�}2 J�U��, ƃ9|��f�(��M (� K��ڊ%$a|��\( |a�XW���Xxp0�z�I>ʭ�n[a���b�dx6�s]c�����Wt��a�P ;�B�+U���2�2�U/+� 8��k��5.�wlBH�A�m KB��h���r |b�S��wXF�g���T��_}[j�e���p��1؅�`�� ²pr��fn6�ۙa-�m ��4�>��I,,w"��L���;��[��&���6�{� �@=m <����.��g�Α=�I%�ѧmV�!��s7���M�C����h�ۡ\;{���J������"��GJ��P�u�8u܎x�U|�# ���T�]�4�;F?_碕 �za_X˝�PZ�C�Z7�� �Ә��f�f��^,t��WGL�������q�� ��� ���F*�5���_c����xo���r�3q,}�N�a ��h��{Ö�1�V���1|9��r�Mf^2m �.����;�����;I;a�E�(XW�p�Z�Z�L�K��֥u��j[�Z���n�Z�rP���(����(;Ȓ�������9����L&!� �y�<���̝{�{����s�g4���~{@���xjs&�� ���'���C�} �� B��wA �Ghie��� ���mnֿ]m�����1KF��� ��{� �zVF&���wDX,���)j��\�eF�+�M_� ��̍�mc�du��]h��Bp���%�V����lEL� �==�������9Ԩu�ca��R�8D�8�!��ZS�A�������eap:����,�w�:�rO��� �<�8��X��Q��ZD�RQ�#������r�ݸ���~��_ �e�1l����ynH��Ǥat2��, |�s���ߜ���.)��(D���Xn�� `K khF�am��E� �VK��C�0Wo�����"�v@��y;�l�@)ǶM=��[�!y9��R�o��lU'�IV���3~��ߦz�2h7S{$J����FG 4������-�K����7��ꔼ���]4�P���*���J�Bw�<�������d�1��,�P`\�t���`����~�f�t;�\��Gc9���Z����9���<�!�•6�YՎ�c9�LM��O1�]��Dz6f�{�nچ}���ߛ�š�^��C��v�T<1D6]�����k"\ T���(���,9VT�;;q��n�/�Vt�����Z�6Ղ�c�+�?�kQ��k��v�*v�g$8���L��G�0l a�>5�� ^��;@_+�U+gsL1�e�ώ�~ i�d �0p��G=��=\8���� |Q)c�<+������(PBc?� �t`�v6v�>��N��*����d�d �2U<,w�U��`�5�-��@���F��5�_n �%;!��䈯�7bxh�!J#�&�}q2���1cp��x�ZX����XF��'��s��)9�\���B �FψusZX��.ϞM��A�&;�V�J����9t,� ���R�UMg��3���Dkk����$|�L*�H��>bwM���c�R�u���QUy��w��X�b?�:����d��D�N�|��ԞUv40��W"o���>**����x2�68��E��6�W�J4i,�E�2'�[��pM�� ? �I;�s��G��9�Z�?��o9�I�����¼��յ+D"��CGN32��y��X4�[�Sy��[�&����ґ�U�Y�6��˄�9�-����1 ?X��Go`��G-<����z�:WE���n��gƜ��9��� �y�i��R�C:ү����t� -����ҋV�@�)�…?��(�v���(�S����9�z+u�(���EZ �0*Xi�<�'��s<�*s@��X���<آ���hl��Lm~��:��)�6}L (a���9u�1=�@i�J�<�[8��+Oya�}�XY/\,�+�i{eL�5���4r����$E��Ez�ӀC�X:��@�E廐��e}ps�3٪���>���*�M���� ��QGVj|�7qwm&�9 �=�~n!���\�����lEr� P<�7�ӸKa���D�Ә��Ic��aY;�t &��h,G9���?�g�3��+��������Sv��9�(�#v0f ��8�D����>*v�H��ml Pj���HD�%� f� IDAT� H �ڡ������I��n\o [:9�ǰ9Lãd|!!��M.sS�2 �ښ�K���Fb�t� r;pj��X[�*dsx�������ٞ�t�Lv ��j��t6!l�0[C?��P!�Y8Ա ��'�g�׸�-3�@��y #���ΡB��an�wX�JL�w�1�:�Kc}��h���l����a��E�̥�uN%݉ ����[ʝ*ڸ�8�����q� ~�����g�V �:ph@ �[��7Wm�� �j`���zx��V�Xo���+��Ws�!�'�@g |e��m 0ε��S�k\=����k�D�Fi�n��z�����tm �L���7�� ��s���,5��2U_�����A�C����P�)��-̊S�^��b�ŰͅM�������j-7�`�|�"=?Sd/�6� �-��C[���d N��?%^<�����5���xz� �J �� �xt���@i�*Cus�0���]�0\��� H~,���X���g$���ai8L_`���w[����I���7�v�t�D���L��=7�q&�(��S<�|�^��I�-a˵�Y!)9�X���t��{���R`[s�!�cZ�0gk�ƌ�3oҩ�����-�e;��o���Qny�P��=�Q*�k��X���= �q�#/Îys��E�����n��'#���!]9�Br�t'�Z�8��;R[��'��+�&n�K?�)H�x�\ZM9�@$b(���� (���&n�sg�a ���]M� 8�tưL���0H7����.�7e��|�����cj�q t`�AF������h4}%�1 �q�r ���*)�o�q4�������<�k:�?��c0��������g�]Y��ZP����V�ʡ�cDlj�kW�0a= *�pK1�;��1T3n��`P��&�� ʺ<9Z���5�8�p ��2"lp�`��52��!�_�����4���H*~��?�Q����84��32�@2�H�@ ZJ�ϳ"Vi �9 *�:2����l���{�'��0��sy�R'y��ۺPٮ |c���5W=/����3H:��T#��,�DI�A���Xf���8Ё���X�yc9��p)��&���W��E;N;֑� ă���Dz�)}��|�9r]��Z��1_�p��)#f�d��� ;v0�K��O�N�U�6�׀J g3��6cy�#���ɿ�{2�a�*���9�� p�����6H��11݀W�p���]���ây���k)�\Z��W�%��d�'J���a���Mzc��0e�8�6������~���&����K)��oёu���`�h�vzm�b �E��,]�����v�͡�X�\�J� �fR��0�!�7�ZV)[�'��U��k9��C>�-��Mc��u����@�nV�G|���B��H}��08�����|L�to� �Z��K�¸q�l ?� ����Rթ�o+"Tx����i��* J�2`��������ژ����<8։uj%e��`r� @���cd0EW�(9���k��t� �� ��A�p��V:����3���� ���a�>��~����Q�$c�?����j��2��N����6,����H]Қ��fa�X����C~Xbc��k t� �W���%M� ���,���0�fz�*��;����8�ښ���v>�`R�ky�ˆ�"��/�0�"�����s8C��Vb98��R'�a%{:��%��3 �W�S�M߲ʘ�_��u��y}�?K)&��8R��k�])"�\��H'zN��H%�頁ikD�u��q?�`��0�5|UUe@G,�Xw� [�r �+���X)#��~y>@e���N�l�@魗C�^�dl�j�J�o-d͊�xv ���7W����IA�ӎGRpQ{_�T�F<���xOj�0�ȚکH��[�)�l��'kY��e��^P��[W�3�-/�EG�u;Y�?!�@�X�o���G�ؗ�����T^�{T!��ӑ��;�����d߷X�|ۄ���c�3(@R�5�ᙌS]��Ԋ�񳑯��ҁoq-��e��}�˔a��B�����;�2�ٳ)�B�� ;���he(��qj���>Q̫Jo�9�%Mv6�L����<��;x`$,ve4�u�e�a��e�=����W"��mV��Y���<-:7/OS�å�'��ff8d���8�� x���U͆M�S@g ���A��((q �yp���R�5Lʭ`��h� K.�XN¡a�,���.�(G��,q��`@�������$��Db�ySΤ��Jʇ���E ����Og^�4n��jhbY���ŔS��mv�������B�ԮE��W�p it�*k ˟ ��>�4���C����;�5\Ҥ��x[H��� �D�OC:����ݨ��#���H]� H�aҩӳ��n(_H���P����ɤw9���R�r�u��c����Z�����,�hQ�<�#���s�up�H�� t1������Ta����K�����\��BZj���ܗ��=�k����.õυ:�H������@�G,�3�˙� ~;� V퐲���<����r���hp"^�T�`��a��jo�Z3�"��x/����u���R��|d�-hۺ�?oYx��P#�QkH�ޝ��e�����5�\;\a$O�ץ:�v�U*�vj$�JT?��_�h*,(�R��87uq��E�y�;�O,��Ҿ�[�E�w��c��wSO��z���%U7�l��G 5* Q��0�ϑ�{��Z��5� �n�������a p��p0>\E��e\����5�:ph|�T��X��*��Ӆ��l�4���l�px�� �[�;� �r��Vq�C؞ ��8q�L6������ܺ��y|��#�l M<�P2����v���O���-��zwӱ6PZ���H:n��I���D��e �ꢇ_�l��6�W�����&�����3f�h:+C�TyN)�%����gXڜ���_��9�#�}S��k��!��-�'nB� -� �r�˱��VhN�7�]@N�I� �ltOc �����磦�1���c�U�$�a�{.��7�5S+��U,=�[�!F�+�r�YGk�����EER;1��^͗��ԝ�����-��f���;�a�Wp�!�{��Oc��5FX�U�鳫$��� I����4��j�a�c�G����� r�u��k� �-)�V����)�[�� �`8̃99���� ����u4���V�T��P�wt*9�Q��/�g�a }�e� ;�����lef�?��7�Mf'�Cy%[�p�]�:t�7P��࡬Y�<��D����0���p8U������~ ��;�K�Z�П]b�i<�ܐ��X X.��D�����p� ����S ~�{�+��y����ǝF��eԦ��8�R�q�1i�҃g�7�T����ޗ����',���͠�Hͪz���Dh��}��M*D�p��n3-�s��Ű-��6�G3��i��4�?x�C��`W��t7;&S�z��7/C1j�I0%�h�0����a"�j�W-�c��s�w9-s���Q��P��$ ���?D�-$����֓�1\���� '��Ԋg�$��Ξ��a�3�]�{P�T�$�׊��ED�_Eh�tAȮ�<O�^�^h�g&�l�3�k�vJ��<���,u �ba�I dY4]���O�#�t����J1�l�1� ����+0����(��d��ۍa���R�[��};{�K˩���]��\�D~���.��G��*��\����by��g�J���@e.gi+|bwc�±���=RC(_�C$�4�a�<�q ���y����J�F��[ȼ�6<j�@�������b�U����R��m;dNm�^`��آד �WZ�ί��{,�������`�Y��r�5�P�/b ���^��{��O�'�e�5� �̕T���nì�sS��f�(��:}�{���Fĭ��[�������г��jÁ?���פ��|<�`Ly3I�%xl����;lu8���3�"�#�����y� nRݕ:��� ��`��$,��_�B�~9�y�uų���bA ����S�rCT�?��� �<^4�����3�R4���?vlڔ\`5�m �u�@���,P�Ŷ����ض�-p8�'.oC<67�v��^�xf� ��,7�a��Z�W�X 3+��m �������em�DŽQ�"{&v�FN������2��m��X�fE3v��Wٮf�067�����czѢ�t*+���g�2��-�a��ge]BF� c��*�#�|g�#��K֒Z"ܗ�tw�K�NHq��QA-���C�(��]d��A��i*鵓Ǿ��{�U�r�Ukj}�3���ۀ��!^z�T^�Y����;�R;�����t�ĺonK��L�zN��aH�gm���<�c��=�.� m"}�hS��vD ��FB���9榱������eA#��Ho&d���5u3p%������H���^opytvM��@i ��u�$m�Ȅ��<|m�>�5u}o�̢6��F�� ZS��ãh�f#�=�.G�Ɉ@i_jw�ފHx����c9���WX�h'�"]� �St����N���55�o���x)�N�t�k����f�m~� �+ӟ)�oE4D��/@Txw�� ���G��/idF��l"�y�Ffh�~6"���] �;y2��*`& �����2ߎD�%�2}Y���Oqo����M k,���t���^ƽvM�Bm�ưfU�Ϯ��U�a'�I��-N <��MԺҵǷt�j �%(��~� ���|Jz�p�4{��j�#�R�F�)�M���ݚ����v+�!2��Z�� ��=D ݲ��� ^�A�S��?����M�����������x.���>�aw#��]����5V�bu���Bg2pME�*}�+�k*������E֣�F��/Ø�IĈ��Ց�����w�n^�!Ӱ�A������D@�H=/����sG���������G�V#�ˁ}wP�����&�J��v��a�*��]SY��7��<�@�6R�Eǟ�7Z���{�œ�sm�����Z"��+#�G�=�%xn�>�rO��ƀ����D��hK��E�;2?qA�};-ɺi �� ��o#]tY��Y@iw�)��c�Q�5��@���(u&6x� EӉ�bdz�(w��k��ЇH��)).��d��\F#Cy�Z �z�q�} �Q�)�nHd�S'*�_���"�[�����<@���&�D��i\�?����?�v7��F��;?��z�g:�BO���pI�_�&�3����5U$�����ה m2��7����X�������j��lm�����\�|`����1�e��+{�5� ��,t���\��'j�z�oBf�]A�B����.���:H(�Iw!��va�>���F�c��0��������"Y`u���j�}�0�-�?Kj!?B:.{��] �."2���HJqt�>���� �7e]H�YS>?� �_S~���vҟט�k�D���\�`]���(m�c׭X�Z�qb۶�X�՘C"Gc��$�pZ� i��L�Y?�[#��HڮugB Qs������f��v�Ή�YH�.��|�$��)Y�+2K$�w�|"1��T�EX������ӫ���`gb��ۅ��eQ}Q�盅��qps�wvM)P������t>'\S �~I_���=���>v(�5�B���2��5��8g�R#�vJ�B���l�n(�K��\�R�5�RY��4�M׺+��ұ��������V����� bFf[���X{l]�i����v���c��1"�3D�=�V�I��dh[!����� ��0�����$o0�S�r�=)�k>��g�Z5t� ��B�7em9�%򟥛cI �p�K��\�> �~-��������>���������c!w�?O4Ú�\ac��kåc5� ����_s^S�A���\U�)���0|���c�z�A[�5oQ@�߷��V�Ju�)� �ۅp��l-t�� ���@�9%�26����>���_c�T��iG�O����������p��W�8�Y(�0Ad��\]����k�J�4{�u8,.�͂�����iP��Kj� ��Ki���z��WH�KoOX�[x(���k���;.�ѩ�Yׯ.]����5V���D����߃�?��6�7͟L�4�Ffy]�J�v#�;�q�xr��c�z�ߥq�k�Ni0��rᘠ�&5�Y�/,k�:^�G ������5� i%��d�5�����?B�؏���:ה���G���4�T}͂ �}4�G0��Hz ���F��ܫ�*S#��l�$��v��|��k׾^7�S��M��o#���Pu��)�h�xh� �o��"��F�o�L���1�����w.\�x�s�F�@�W0�S�(�[y�-qAD���gD���`��7�\����k]f`��9P�LJ :�IZh�f��^�A:vs[h{@�F'd�Y������4�d��K�u�Ң=�0Rh6Dj�o� �{!� =�s3� 6inp�.��p�n����ھ��M���4X�p�1A���l�쯇��=���Q'��ܕ1]��P�����tS��ǘzb������щ�sNl-��v�I���]����Ȇ��:���x����y�i�$:�C4��o��?Qh�k� ���/�¸%r���� ���q7��-��«F�W��l�u� l�fs����t�58�χC�������N��;�4ٙ�"Iq��My`�dS��N���@�zll�p^��� ��#5@��R��@Q -���u�=���W���kf��M�8?�aZ�\/���@��=GY���*\o˓=�8����R���^�������U�{���^�w�W����k�&�)�k��J���X�:��r;5�\�w*xHd��>ɗ�������_�7����Ȧ8Y����)�Ƣ�瑄��(mn1\�s: ?����� l Ÿ�\�q%�F�1��������K|��Ţ�wH�����ݾ��i�� ¬���w|-�V�_�4�Rj��:��6.���s�@��u�jj� ���B����P��ƃ� o T��6I&��X!� ������ (����:��W91��P��(�� �~K����S?y)VOU׺���,W����z�:R9�r�A���I���^+��Q���1����$�����&�< �Gb�,�$k���[����]���M�qW�íG��d������ �O��%���Jj�Α ��6R��9�'=����l�5ќ��f�[m ��e�7�o�Jn�K�j[7CNn-[o pp� bv��!c6 I�~��3]�8WAօʬ��{�-H���D~��e��~���I�ƶ��D�-���H�<lp!� �jɝO\zӅ�%p��8�llV���+V���7�J�/���n��)V$ ��:��c}�/�n�6��k{�s�&�~�)F�#��-\��xu���3���”,'������Q��� �<`�W�L찣4w|J����5#�"�tT����~iF��s�K�yʈ����Q�i F�D��� ���S�u9^����F?��Pz3�a$�U'P�-,�. 4p����sa�#�܁~��>��l�r D0޵�+��/-�j��3�q6i�y"�EA��妼��4�P���H+ �<%A������ЅI� �lL�e��g o�b`�6xܷ���by�ksJ�ٱ=��Ω i#���ﱭ�?x�������lw�fo+S�G��������=�G Q�ʂ� vX��ןy:XQD� ��5|fcuI�G`�x���Xj�O�/��mN�l�8a<W�(���k�? *��:���B.�`�s�Ԯ��*?�<�� �G#M�uh�:�ֲy�l��xӅ%F��6��siLW��HbD�pP��Z#L�����qG� �J�Hx¦���_$>�7��;| ��1`�e�S�0��d�M�(�w2���wN}���SC�n�փ�4��B�f�s�t'������A7Ο,�!�����_�Ӌm�st}�����y�R�����l�Jc�ab�.�Z������M�� ����e*��-����N}�l�����~�Ъ��^�>,�������a�{z�w+6�] w‚��N�@���o᳈r������M�Miͺ�E���`8Y��P| g�U[1�de� �jE�oU�o��86��j�z�(3���6O����� !^~^�����F| �4J &�>���# ���sND���ʽ<��185Y��B�_���R �N�A��*sM4g����\cZ㣧ŕ���@��a�����t���������_oj+K����覜�t�ovՉ1�p�2-OV�wz/}��_�7 v$ Ybdl VRs���o�"��㘄���l�ZO��Rt��X��@Wn�c�=������"�d�"��|@��?�P�a�'ή0."�3Uq@i"�ra�+��,7�ǧ�E6�%�"�ښ�6z�&B��ɺH��NE�c�� 6�g��*�;7�~&;��!�< ��%JQ�MFI��7,�`D ���tE\0m�nBZ��' l� aM��2��7�i`+�!���'VA��k�Pz'I��U_W]���;Y���q�� `��4�@W���H�u-0ޅ�!a��iJ=qV /���{�/���auAҍ��;}��?�\�����E~ɖ�W&Aiu �@��Z���M|�V+���y�����v�p��̸ta� /���^ �b��u�r����v�o�ɓ��h0� (u���Z�ki �@I�x#��U� _E�u��n��Ja-�|s*G�{�g�^ x�l~=*V�oD�#���ې��qz`��41&�r4M���7P���]r[8��G���ѭ׃��o�4�H$ Ld��h����x��'x�h��ّ��6���.�ɱ@�N; [������WH�,�hd�O#����p���~�;�[�dbL�~^P�"Qt$J/kD��HڭL�Ld��Z��E�9hO1R�t��*}��K��nB�����7�����/T)���N���\�e3�1*Q�3L��}7l_�Q�XN��$�� �ÙF�Mk�6[�=�q�D��/;Ɇ�]A� ໢��;�9�<�� � �Vr�砳 ��z_F$%e1JZ0D��a�7V�S�u[��} �2R#�T�Gx���T H� ��ˠ��>�9 <����g`����`]�}�0J�@i���i�k����Pk������M5:�TSr�������Z��͎�G�L{�=�����U R��4P�W7OkE���v�SI���kC� S][!�j�<8"��b(�a�N�Z�?U�������}�����O�qd�Dw�Z�6��,*�`��1�'���WF�7*��b��,��z�����pd@R���a���@N� � �4��?Us�!�t�������$��!x•ԡ�|���eX5��D�(M-�i�@�9��7K@���Tv �6��./5� k�|Ć5�� l�n<�Y�����PRO��چ�T�i��*���F٨�w�� �C_A��&S0��-��@:;q���v���@c��p̩���{J�~14qgb������q�&?I��e��kA����}j��*�r%��g��'A�뷪# �IN��m� ��8�w��""�05��s� J�'H��p�/��lp��2��`� t��ӏ��̷>2< ��V&��ھoe�RG}������½���ɯI�2�i�ɿ���r 0�8�/���^��lh 獊�H.�m��#��ʠC���� �M1/��X������"��ƒe�8<� ��2?%�8���_``��5r�V� �E!ay��p�v�o ��_����UB��2to�kGs�����وR��H��.����w����?���+`�_A)d'.��X���-��q�W�2/ΧD\Xe��FjO�! �-��.�(퀷[����� �n���VHw]Ft8���]�<�(0Hͯ���:p���4zzɍ�v����O�>d�Y��� �/ݧ�� �'jk��$JgA� ��j��N�J#7�a���g�!K8�i��X�%����U��T��9�hD��(X���x��F���4��|&;�v0+Ti�|O`M�27n���(N�p\D�/�$.掂����*�rW���^�����`v�ܣ֭Cs��u�_���#@�q+�K����V�v�E�����5�L��b �Wuv�����6ݨ�[x���F��9�+��\����g |��ef���$���V����P���H��y�����l��`��%���]aZw�����>b2��VH�3����O�@� Y����L�D��-�Rd ����^/��0�Su]���R\f�&�֚�C��G��щ?r��Z��@q���D�~� �5ۦ`��qT�${r̬�Tߩz�*�V��3xɁ1���h$����ʦF�܁R�>�� ��f&JG���oK�,$�?]ӽ��� ��R�:�~�v���G �6��4��[& a����J�����5���� #9q,�H�a�Fũ�Pk�X*��I��FQ4�7��s N~F"�.4P�H7�w�ԣ ��p���� �aw��i�w��R/e�M��3Z����W���X�JS �8r�i��Q)��Zb$FVA�)<�����i��긑} ��Hjg�� _*��8� �ƒm��`������1�Vi��ɓ�� xo��q�F XT���x����� V6��}�A��8��B���*`���,_6��\�u��o�ɢ7 �ZWR��@R�K܃+�%GR�k�����1�4�zL=�  �р�T����1%��:�Ҋl�:#>�� \�+�cd�[m�����I�O9 ����3��졠�8=�[��Ea�/��R�t.�#+��I�'���^�.�G����ݑNJb�����5��}�P�e�6jd�F �P�� h������:a<=���Oˤ��m���%����� %�Tc~���V)�.��Q+[�E��M�^\��{���ma����|��W;4����sx��7���Z�P,]z7�*���3�!�H�� �o��"���=�6�`k}����u�~gf��RY�����7��$p�`��R�d� (�Q���׬4 ����7�H��E�l?���_MM�����I0�k�z0�A=0*e� �g���#�U�l���# R7��f :B8Iob�#�rw�߀�27x����t���[��yQ���ur]��Wi ����,C�{t~i'�ݷUk����Y�?�^������<}����t�Lzػ��~��z�$�v�%I��<���j�.��'�"Q]}�c��8�0}�0'�H����.��)��w�֜�Fs_�����'vl�n���(^���j$[��m~7�J�D�(�bRܯ#ֺ��������ρ[�8V�k�p�h�e��FI�z�@��XӫZW��\ KF����-X�����������s62T�R+�eF��x��EB��R��9|:P�Z�_Ek��r8V7R26���Z���� ��b�z��G�+/��~����owݭ�պv6��( �*��9� g��Ek������^!b�0/M����!ʢ�:�k��P�Q<�NAPe��e��?0 ��a�����_ i�-l0�C��ˑt�y@եb�,���U;��@�o�6> �%9y_)����ˠ��Mċj�hPZ�0%�"�*6*�4 ����tY� Խ�!6RZp/�$���H�A��7х\j�P|A]��ߨ&&u��:#�'� ̴���u`�x?$��u��)&��i�aNk�� y2F"��4GR- E�9�e��S u�\�O������ÍH*rZ&~+�:S�]�1�R?t�t���Q��&(;x@��0�“���>�,��]���;��^ˊ��HM��fc;�|�k��k;W j�7��9P� (� �^��h ���c��)�5��@����a^́���Z�����m �6!�f= ��Óƃ6�>�'��6g�Ԋ�u=�J�= ���t+M�X����䳁~��f|��l��:f6�N+J�N˅w���#������M�i���D��p�@�X��|�>����_[����́k��d�χ�Ï�u|�L����V)\^=2.Qݖe .�!)���]TH�N /8�����+w ?���X��́5���E��^fö��Od��*���4R��LO|�5��ǎd5ND������$S�j�9���ua�����|`��}iH��VE;��`���Ҋ�)j �@)f-��� ��fr̛� ��VO�6�0����MT�z<-M�AX_�����a)^�*y�p��R7���{ݔa�ܜ׀���i8�HH �O ���������<-T��{so�AE)�/��˜ur����9�$U�n0����H��4�J=�N�[}|����H㸡���Mt����]�J-��]yM�3P�H�6aʷ ];�7�cޞ�e����&maW�"-�DuI6�)Z�4=:h%���[��\6���O�v�Z����䑺0x��1R�|��F4Q�v�U�|�@n(�K�2#,��S�̢5������S��a���k�ȿ��4ysJ��~�1=i�r&��ㅷ&`pΠcN����#kZE����f�����g*�0��ge�H��I%6TG(�@�5��^�N�&�:·�Wv�KqsJ�o�)��҉u�ܞ�5����`��e��%rL�ʞ��5C�2�gE�T�9��f�)���� ;�f����M�bX��~� �w(e-kY�#L��,H�íx7��e�R���Y\�� <�9{�e-kY�Zֲ�J�a��MRO�2�F�s��6d�aֲ���e-kY��V@��3�F) �����e-kY��&�X]Rz�]���Y������ k5���?��u��3� �#cV#e����d���?}1�^�8�$WT�d���e- ���[��.���n�e��5�]� i2.P� �xyI���P �AK�Q;q�s�-J����P�N(��s*�Y�e�{}�3u-nC$^B�*��; ����Y=^��̩�O�v+e/��ߍ'j#t �h� �۲g���Q�Ɉ�L_j�0��0B�&�}����nl�a��t]7��#����A��?�,Pj&��fd��\df_04<8�����|g�RfYG�(��;ʡ|+t���`�F)�LJ�Kp�:�A�!���!�կ�CIn�:�=ΎGfQ��@�2��q�믿M��^�����m,_QБs�\l�`L6Pk�{2�5��������)�]�; �2�j�(巺��܎�[]A^�9���<���~��n#\5/���w���d��.u8�?�����_ie���*\o�(�Rd(�_�%�?����8��K_P�p;;!)b-:���`�[}d-s��+I��!`0ph=�R�����fv���aF ؾ�RUq�6�Φ �|�j>f*ֶ&�ƃ����%X�p%� �,�����h����@��n@��){ 3ڢ��|�5p)�{�S B�ER��Q���.>f� 4�O��xI97�� ��ʫ:68%����{�|���q%?!�d���hsвz�����6#;�}�J~�ʎ�,[��5�U�A"a���.�౥�%�K�������#��=�R�u8��.� ��'!�!�'�B�e� �V i�~��7G(;�p�S��`e1d���5|�;�ف��|�n�5;yw��,P�l�H^��=0��3���c ����@i�;���{]���ǽ&�p� �A����0�K��n�s?��z��n�b��Ni�83 ���f ���G��{���Y�t��o6�y�-�Ѿ�st�� }��@���T�8���l�n������+��0w( IDAT ��G�y8=<��8��� � �<��p�%yw�}�^���D��[��k�'��b�+�x �;�O���0�q��&���`�W=�k����c.���k��������k�xv7�[HWl"���U�>@}V������,��vCH�= nm������_#|�a�^�����M���y�Y��K�&��,�*Z�i�(�]�K�-</R��ݯ�9�E�bog�vi�o$� �11@m�,��h?k�n���r�n��? �T.�p��"i�~��˓w��9[}�N�6Z('��%�����S�0�O\|�� y ��,)�x���$���D�;�B���{�~�_�HQ�}��}�Tp�o�]$��<W4��|W��L�t�a�kdVڭwP���[�;�p�:�Dvq]hc!�� �ۣ��<��~��$�޻@�: _$#�~��^��4s�Z�y��$���1�Q�o��o�<>�{]��wcw������G�c~��31����"�(� ��l��N�a�kO�����iI�њ3�N4��n���]p[FI�+�>�=���VŒ�����a�}߷��uxҽ�Q�{WZ�,W���7�����JK��]�L�<���p�v����=��p4�.�U�]����ER�X렋Z@��khp�t�t8~�9�� �߁v "����#P� i�i�y��ut�����4�&���{P��6pѻ`�IMӤd�� �a�)O�ٷ(P�a�u��zћ� ��L߻ˌ��GD� �,P���;N�������zG�HT@P[�J�7pg��X0�F�1��Ē����ML���w;*E� b�&,��������9w���m,[`�뵯��)w�}�y>�s>��&��8Ͱ^}?�CC���ת�#��}��ߏ)/��'�� k�:��}���4����N����.���N�E9�,~1 (] =��2%���i�w��b��ڙG�5�ʩ�9г�kk�2LO�u�~�y�>�����{n(���Jz�kzNCX�}��z�T��9�a%A�e��C�F%�c辏��ac�t9y�s�zt]"�Kh���c ���R�􍂦�&}�WH�S�������Ƈ5d����͋ؾ�=����c �� ��B�S*ڇA?���ALJ$T�7��x5'�������K��b��ڌD����Hڮ�2W�����p�v��>dXc9�Z2_A���ݛM2q�t�:s��}�C�b�O�Ҟ��f�%ӘW�g�T�c<h ܛ��+T�仌=s�����Qx+,.@�a[�K)\�Ik�`o_0��mb ��-O��!� _�߀z�K�o��AΠg��5"��,�-2��D��@�GߣV�wM�KЪ�E+h���5���Zi�ѐ��-��k�dX�}L�f�!U���ɱ��E�x�o)]�3�?���9ޘ�����IxW�]BxE� u�p���]��-Э��= �1Y�Ǩù<�Z���)��$8��\(�U���T���T��J��%�9����܆��>��?�z��Ԃq�q��K����t�Ik�6v-m �X�`~���;������,�p���ը��`k�i ���(�7����Ԫ ��2�I7��Z��.���2B�j�;�ˬ��Kl��d#��R�n��t�p��� �qk�����k�n����1�xx�`���ĕ����|W �� ��+���jse��H���M�3����<��Fz,' �( L��Fޚ ��^7..�Ͷګ�r�#�����5l����*;wo��տyN}��V]���p� _��F���`:B*)�G4P}�̧�ϚK�����/ߋ�R�͕�;�2��d���uѐMF��nHiv'��<���3�Gp����\H����: OY�%WT�U˃�����P�R�nz��p�ߋ2P�x|��B(�a ���1��˜+�d�s����'�QsE�XS�� gk�c�0-b��E8?��y#ޑ�m�0�a� X:�,���xV����C�o��2�� DZ�>Ë� [3@I��!�gjDŲC�����H��"�UB�4\s��M������׿u �J�;#D����,�1p�'~ka���\8.����thΧ�c����N���G�xn7=���O��s��& �B,1�m�T��T�� �mU�қ�:2W�SO���"����x0B�*�J����6;�OD�9�n�]�-�j��Z���_a��x�B*n,yzX��T�}v�D|{��\�7�Pj(E�xu(�=��(���E�0�������a�&I��ƍ9u�N�� ��'��U�����֭8�A�M}���ZN��k�qã�O�ٍ�z��D"���L�#�����–��ձ!�əZ��JF�RQ6�2w�P�͡��J����n 5X c���r���4p�Rj���4�]���^�������y��HO0� ��<_5 � �:� �Cs�Pܬ)�C� �kܬ�g�`����M��{����.�� ��Zp�۳ �!�����T��I�4҅�� ?C���=�4i���4j�� s�Ug�DS Ch3�O��FAOy7U7+ra�� �D�V;��-c�[d��[�ʑ[M�?B�g-9�s"-*��z.=q>�� ����@� �秅F������Q1���':-Q�e`�M*��8���ͬ�0� d=��p�� &�LG��0tN�W�z�駑�T�2��o�֘ut"��l�V������£#�� ���z�v�t, ݡe����H?����i�Pٓ� q��V ;�,<��s�R�OY��W�� ��rK�߻L����dv��8M�M�U�)lQ�:���ŋUXO�!Å��͆}�Dg��U���BՖ�j� '� -�NÉ̗����W1�r�̲؞��˜�(ݬ�D��m�u�F���`�����yz vS��8�Q�0�?�PFIo�}�Ot26�����8���YQi��Q�S �q��0b��j�x�n��mY�\��AO�#i��1)��<����O!���N]Q�N*ֵ�wk���F`��!4�����p��L���L�mY�)�pJ��{�X�IMXvt*gzW!�Ӎh�f(��(�P�7����7C�)����fX� ��c��k?|����ƈc�{�]��~n� `�&�-�33�k�aK���Χ ��.����P�,ǜ؁3�り�0�)��jju.L��ȑ�����o ��.����ܻ"�xy(��-Ӡ���a��7R��������� �\h�R!���Y�W��˂ə�1&�� m�d�ia��~_����Ι1�&�����}o��{�W5l�������F$���-�в�K�.�Ѩq6����>��"����|�Lk�ʖ�!;�(���ϭ�Cّ5n. ����Ds���P��d4A�.#I��C���A��8�L��Ǒ^>Ӷ�X��x���:���"�j�{�O�P�%ߡ"��`��#�n#ps> <�!�U*s.O~j� +�+�� �c�p�9�0��,[�늆�(h��U$�5�g;�-���=1Lɝ����Y��5|�@�����ȎG+#������U�0ᇍ,�o@k8�s�9:��`��<嘒�L:�l�l�gX�q�  l�G� ��1���AyC����e՚���aɺʰ�n-Yo9d!�tg[w�Ć�(@�G; ���������Є6�`����)Lð�g���E�,z�Ǎ���0#[��.?�OK���8,/���)(Z�8v(��{�N�<��Q�J�a��}���(�����w�"���� �v!E*]+ �I:N���J����V���k�� �j�X�Y���D�M�W-�Fx�B���<��taCJkV�ʶ<�v������aC.k�����N��&H����0��ڏ ������ �1{ CJV#�_rH=��60��:�\N�ћ9����*؞t3/!�²��v���ItvT�X��90���Lڻz�~�@���H��\Szh��&heK�E���*��B��� O��ܪ��/F��I�u���8����4r��H��6](��;?m��P���6�$xx2:�Q���@_w(����燎/�,e ��p��%���3lư�1�c5��Y����������lʝ,Z�q�1<�E�ki[ 9�"�D�������/����T<}�� s^�ʆL/�bC^�u���0 ���^����2y�-�7v(�����d6g Ӏٞ���YLk|=��N�l܎G�F�;�m^<�V:��1�G��?V}M��f'�e�R%{�88^A� ӓ��+�U�'.����Z&�������"�"`�WuQ��H��wFz��\��-��Q(���@��X-�ȃ���޸�kfB_���gi��I�� ��'`s��ў���È��� ґL�6 ߔ��v��s_!�S ��2���4PJXv�r�v�����߈jI R ��`��WJ��OB+�Y� �k��}��Q5��?�"iC;Z��Q�Sa�R~��h�Ÿ���6��.���x�j�H����H�ڽM��7�<9�;�J��wr�������(Y>V�U^�f=��K�R �� [ca����� �~ Z��!w���45�#}Tnϑ��Ju���7�i���;���h?J����[0V���IE�cF���:�h�B s-�i��2�E������-�S���nZ9[�l�g&lp�5�7�_�C������i�zp�XaM��Û9Sy.:�κ���L�?�NH�, �:Y��YN�N� g�J�o�ؔ(�wO����d���ư�~���r��X����$vg�C���к� �q�y�����&�i��@ψ�����3� �_�\�¬X�Q�,� �yW {%��|[o ا����>5��HVN*���a�h�Ѡ�B @w{ Y�A��}����_��V�c���L���T��چ ���<�&�!3�#Z�G�.��!�9�B��.J�u� �e���g��ӑ��=$(�� ��?Qv��@�&tja�����g5yB��\�1oI��8e����n^ ��;�EiQX���8����y(�rӬLU�`�3���t��w,��Z�2�.�$}�� m �0YL*q0�� � �����Xn2FA^1;���ؼ[[�}�V-� p�^/�B'�- ��tl���� ��B��9Ɔk��{�=��_���`��0�U9��H5� �3 EEC ���A��٣�s������5�՟���xZ��c48 4���0]�Q����lڮ��$ZC ���A���8���8Zz��B�~�t �@Q@'�#�� ���E�WIp\d��h���1�N�N�߾�`��s���X�yC.k����K'�M��i}��S�m�:�=�� S�*}�P��#���Q��A�F�����Go�\_;�`���$�j[w���JJ�H���-4�#�`w�4K�y�@d�3����fa9�Y��'�:`%p���s�Ҩ���G�$V��� �t�Ҋ��2�S]�u�q�諻MD��Z�N��F�M�@�T�w[�\�U]� |�O���ю8�U�@dI�.@k�2J�������-~�LQ G��pab޳�!n�_Ya�fTT�[�6~(Gci�ܤѴ�)`��Էk �� &`�鳣�{|j#|�;��ʐ���9-��1�.MWX~���p��a�Ԭuh��|�2 +�����ba�e�s�s7:D�hKG ޸1�&?/w������ܧk�o���=���2�w���|�,�9�K%6K[����%�h�B��5<�(�L��c%`�౜��{�z;+���^8�l:~o�6��{�܃���ͅ_D�ҋ}r��q�D�(���~)���`������9$���F� sR4��R�1ՊoE��≯�l��<�ʔ=�۾��dx��|)&�Έ���^J���ma��*~��4���Y��&�����~�'�N��`���N��z��˄��_S��/����9P�M�(8��aH'��c�(�7PY[�Ңx�e bn�JҨc�.�'�f���uFS����S��^[�'cl�]�Z-�Gi�M�+���zc���R��O��70�t9��OsS�&*)���)���Qh�C��^z,�Z�˨��ra��X�7�Js�)K�G&)m��$R[_�7J��m�#��4��|4J��<+�X_�J���T�r>[/��6�zS����'i�hJ�f���c.V�-"�<�}%ZԕM:���B���{�Bk�/g �+z��)���ql�r\���>���ɼg�yGR&3D���w���uʄ��t�E�r��=��������U!AfY�X�)[��o���i�a�u��������_�e�ux1w8���8��G��1ҹ��r�1|j�G@�J�ޞ�.I��t���NH7�mX�b(2�3�Op� ��o��X�0�3W�`��B ��Y��mr �Z ;[Co#��b��������.+�DRu9�z�F !�n7R�j�� <�fFaVT�H������/#���G�1�����"h�-,�F$��W�8ٳ�π�Fi�_�?O+�zX����ݾ_RM�)>xJ:�YBΖ�b�:n�8 �����Ņ����p|�G��)�g�&X�m���ƫ3\��`LJ�@!�����ʏ ��[�Qˇ�GBoG��E�JGR�I���0p�ߕ�<��"W��+�_A�pM\�Ȥ��[o�?&=����h�8 ��&&|_�[��[�z�,�n��>�Di��3z-��V�5�*�f�a�S+y�����+�]�I#x�$�'�[h�����H ��5R)��I����+��ts�׶#Nw[�nΝ&Hel�h��XCkl���8�341�/��k,��0p h����{Z���%SX��Yx��<�e�x*w*o�H� ���aN#�)�Y��(x�4"��2�+k�e�I���E��o�e�s�I�ÁM�n'�~[��ɐBt�m%%�`C�\G�>K IDAT����A��"��S ����_5��V�y��= �\��X0Z*��C������喒N�fa�����ܸo����*�X=GV*Ӣ�50[I���7 ������ �c�F�^�|>�k�K�mG ���lY(�:�%��; �q��dj��~���D'���-F�A�RXw4 �d� ��ž RJ psq�U��*8���ؤ�MAr�_U��XJ#�ho$E�����+%����_��uok��6�J�+kt� �"0=��S�v .#0�X�t�&X4�D�pA�5���h�;�(��0R�{W���i�x}�3����d�CX���ٳeK̶�w% �0%��VZ&X�'6Y�7�?{���ǗLc^lí�XD`����n������e+ ����݉$5�,�m�j[���ʟ���'&��X.2I���x?���U��eC������t��e=r�0V�����_������� ��\m��e��XI�w�$��'�idt� ڠ��y��7 ����)�9�V+�����3�a���Ӂ1# ߕ�>�!{��W�A]xp;��u���/[�Á�9��Ia�FA�A�N���T��~`�+�i�JY,_�Ok�����L�����? ��.�R�4PJ��B�P��t�lDW5K�ٻ��F����6�Y��e �\�/Vp��g�\�F"�4 cҥ�Fࡸ��� �F�sK������:�6� 债|u�G!�t��=�ڨa�'#2bѐi���v9�h[�!�U1^π����y�T�7��#'Ks� ����~,Wf�$r�X��"��<2��u�`��?�������a���á^����Y��Nrs�,� ,G��Ҭb�������J"3(��j=6�r�c˦����/5�7m�|G�hg'}��-���Fd�S?�ok%��) ��w��� |귨P_�pN �r!4ʒa�?^V9�k�4�w���ɷ�i��8�՘��� �����@�5E��l�z�J��Y3?b��1 ل�6�o��"��ˆhvf%9�,��r�UX���u�ɺ��&!�����$�)���Ni*�O�(��P���)ڏ���CX�J5.� _��A�(�JL�DgY a�)�Q#6rj���Iç�1o0���=ʤ�O�َ��H�ݍ��>���"Qyӳ1�1��UT�'��X��֓�4��+�d�;�1F6�ѩ姰�,wjI���#L��u����;��QB?�ޫo"?L�o $�H�i�ŚË�aK\Xp[�~Oۣ�bb������곢‚�p]ܶ�j՛T&���r\\�!� ����9l�@i-M����5R�Q�_2� c�ں%=([� �4�G+� ��N1��"*�~��L��_|1��ajҢ��9h����W1N��� �=�򒟜#L�15|��(�9V�QV����[�,�NM���p&��!d[�7ݘ35I]�5���ݍYj��\˴�-�, ��dU��H�f��X�~o5j9S+��{�v@��p���R���nW��k���O�1=��_v7�8�Ā��뗆�PP���J2J���O��������*�w �q�Ӭ�4j���&C�=���������M]^B=�wԆ�'��V�}�Jd0��2T�\Da�+ЪEŹ��fW�VW"�AHo��(�F��FHuO�J��HT}�����Fؿ)��U*����n=׃�F��P}���rlqi�"�e#��3.�ɑ ?G#��^t� ��C؀a�ÓMV�f��Cl(������]���{�a�A�V�������r��R��� �V~{��O����ؼ>��Z��k"�D�-�����ػrv�D�����RO��!��U�=����rIۑq6a@�"Tm��,�G���T e�J9S���%@oB��R#AT/rztF��r�u�����A�d}F��EY��lK�:�G ��º�'�;𝴗\�T��k�5��A���� %�{2kF]�Pe����H�����d���fV' ��˰��PyZ{/Y��ǾK��:u8ƍ� �BtQwA��-����4J���5v-"�|E�[w�R�w!���C� Ö˳b���{}��k�/���D#�r�oH1�p���J�6:�����>9 ��|���w��Z���g mU*�� |מ� 8ðgk8m �^F�l����s�(�J����A �qݐj�bF� �����*y 7K`�l���Mh����IX�3���� �ge���`��� {�P�Kj��@�V�")q��I`�B��#ճ%�MLۼ!\_�k����'x���U��r�[�HƠ ���6�A]S�C��/��w� **3��l�Yd�k?��έ�w�>�bHaF �{�>s�~ Bn�r'2��.m^P��_�T@��N $ 6��,9�m��-i��O��I�@*/��d�[u�I͍i)�*i��q��0`�4@� �J�(�%��yK�R���{�J�i����4�jI㦅��H��4�i2P�Je�Rm:���{�$���B&��NCJ��ʜ`��e)�6���"թO*�>�����z ����3���7 �j(�%��m�����x�� ��s����w���0�(��������#����|t(՝�yJ�#L?6A��8�p�)�����o��� l��wJ�u�7��[���)�X�km�6�Y߁R]�o��"Dkt@|��Rꅒ�W��R@�g����u%\=>(-%m�@���$}}Ӑ���ʱ~�{��Ѐ�4����z��Azy��׶:]���^��{6�ӷ�[�Ju��~�����|�1Pr�oK<�`��g�������F�a=��oem8�J��o��?�&=wR��:��n�+��p�"��ª�������Y���GX����f��-�7�T����{q�'���r^� )8�ѝI%�M����*�3��I�0m�o�"E��� 0�Z� ���I Ѿ�4aԫ ����{�+��mc X VP�CD��IKC�I�����8�iA�pF��U_�ѱ�m���˭��F$m�(�����g��ktc�^Y��ET�|_��)�pܟ���:U���|;^�I��1 ��V�u��*-�xD"��1�i�e:Y���_GG�Wh~��`�Ro=�ϖ�S�*�O�zW�pRj��(5=�b��G}����������Z��ԛ�����y�}z����'�Ql����_������=[� Fʿ����uH �{f 5/ �OV�So��:��|$�,$9Ñ������ ���V�`c�v*k#���R��ٷ������F4i6'"bnDZ8_���:<�WC6���8�P� ���k*S��vu�W�����4$�t�^���yM?}ο�� ��_��w7��zZ�+���������`s����OB"�])�O!�&~\Y�B�h?��(��������^�(�]��x8"���R��c�Fk�ߵ��g�J���r8-�� stKFR4�j�����]��ay����l.tW�^S� P�UrM,������'�k�� D~Y���fI���3t=��t~ �:R����{��ɓ6���%��Z�R6����T���@����_����¿rx�.~�H?�z�-6��X�j�R�4u���`s�4PJa�:��r�Bd��e)Ju�ߪ��cD��o���g(}]�}f�r|�U��K\�b5�R��:�<�� ����ɬ� $ZMԉ��r]Wk������珮9�k}Ju�_�|�¸����A�l�hG����������(5�Yo͑��A/��II�N�R�m; �!��^����J��4N*1��mb9��R�ߥ�m��{B��L�Z$=�4ᩰ0�2�F�j$�5��\�H�Q���ъ���<����c��TD���^:g}5b�W煲IV�wrz ֎YO ��Nbm����{���σC���1��*&#��]@��0� S�����$��յ���F��@�h�q��X�X��r@�{{����w?��U]Oہ]�0��ԇ ���R�nپ�mv�h@v���޹��l�П���df}AQ��up��D ��j��խ� ,����Ӭ�����A����י� ���i���_5n�S��s����ՎuB�:;y��=D��O�M�@�D��Up�9���k�YU\�s'��� ������;�1p~�Sj |��C,�� ^F������ 㠧�;��S~�| ����N�ie`� �^�5ٍ��]�7��6�lۗ�͎��v*cp(E��|:�&�s�ck�����kf� �.�h�9"�����8��tv 糎��\�ʕtdy����J�j�P:�k��d�|D5�[{(Ya�9�Ls���;�u�$��f.�q��Ep��E�- L"� S����T6ha%�m�������'���4@ك{�} jm|���/ho��E2�>����q�u�I!c�6_��5FY�Ǥ#�\i�p����LJ8…�]8utc���2Y��/E�qv���W�G���Mv� V-�FQa.�K��E]YPZ��#b����GBUq>�5�R�M���פ� ��w¶��d�t p�-U���� z�C!C6���y��42{_pۀ�c�H ����A���=��b0ʅ9a@�:�ν�#@i�f��k�eE߭�0���Tf] D�ڏ���^V�8����)t8 Xm��p�C�<���D`qP\��ra� �F7�}���Ï����p��s�=��kv�ng ꭬%O���/'��U����.���XR���5uN�����'�6A_�����`F�L$#���<M�@;^q{�M����N� �T`Fѵ��R�A��k�jt k��cGċvS��� �Ru�I���ho>RVd��+뛅���I�/B�\o���:к&O��bR�Gr���؅sc)@J,��~ŭ�ؚ��Ɍ9"�����1.�+'�~Z ���!�ƪC�]�:�"+w���� ,��Sb0ld��̅o����\����(l��D�,\�_�+@i,̀Hq�Cu�� 3\x].yNc G�J��u�����W���(m���t,*��c����vN��H�8rd]Ł]��� ʶ��%[3֍n�>|�[m�鈰����w���909*��ۀ���pu^m�v��{kh�u�d�o��湩ۘ��׉������n��&;�~�^]�|�#mP�������K�&%#�7Xl��u���z��BKWY��� �O2D�}p�0y'0�‡�Cq�[ �6�Qł��u Nvk����l�l;K��� l� ����c���( �6�\�yr$�k$2�T�ܨ��*�� ��F�QvR��1�*�8>�~���f�O������H�Yc��H ���a�vȧ��:[}�sp��x��i1��$!�n\=dWRh��Ȉs��a��? �˕ʽ/-ܱM޳�8�@� ���/sLO�U�� ������>���P�����TG6���f�|�R���6d�%�F�_�R��S�o(� �tcp��f��O�@3'�y���r�A�lL�|0�h9�Q��o�o�]8��#^�����d-|b� �0 �4k̈n/n��Gg48.���Wc�rz�*�M 9���d�>IuM���"`b�>��}����1��������XOx!k*��T A��z]��A�NRp��ɳ�$� 1 )�2�N>�"��_Td(�,\`�=7���u�B�(@� ����� ���m^J,^��降��P���(�$�|�������)��5{��o"��בf��*xzF�>��B�H����i��E_��2V�������Y+����܄_���h�����M�8�Xz"��q�&Gf�-Hr'[�Z�đH�2���%I��t��#�|�"�F"���T`���~��Rv� ���Ga��|�^�cu�<�� &+�+]�΋鐱�4�Q�].N2�,F[��'����`����Ľ���_��U�_ ]x��t�8=��}���2?eۉp@�����ݒ��ZH��51 �W��NFJ���`L@������\��)�S�E�OHq3�2��#��};�»�l �c0Xע���b��t���Z���q.r�{�X�k�Ϲ�Έ����%m�wg��W�Iq�w)�Դ�ɺ���lx��VXv�B�4)�_G����g�0�>��"� lT��9��;I~Ñ��U�B]OAA��ze�k����@ɓ�O_� ���~�^�z�H�2�%��C�����j[�U��0.&��t��TV��:��#���O�����/��(�f��/���<�3�i ;�D&�ށF���p�'kj5��k�y�vHT�p�� >���ڴ�P �gJES3)�# $��?*x�[�/�$��Nη�2�������ǚ+����Q���'���#��::�̈́ ��&uP�C��$�)g���5:ȏ ��=�Q�m�4�<(UZF��H�}S0z̻��Ѻu'�٭�5�v�����GQq4��8���o��g�q����;����� ^�pC&���]X��\h��� ``3u���6�=XS�ﻒ>:J�ԁ7YC�A?e3Z� H�ݒE��V�")�����p�@�ۥ6�����T�#]��Xv�!�{��HE�B]c��$=��.�����00'G��\b�U� �|8l�6.50)"-|`�8�@pS�MN��6=��[�jdc�x-"i��Fz��յ5�����:̓�q����=x����9�}) �6��y�{_�l$��l�-$�M� �YW 7� m�S�V+�5p� ��࿺q >�$�Y� h��"�؟V��+���Y�~.S�ͯLX��|���E4B9,d3���_T�I�h��j?�, 83+� ?�Ba.�� ~؜��'2K����H6�b�U�|.���n�MM�|�r��-�M�75F��gF�z�� �� 9�����o5��!@�o:������u�a$�_ 4�X�2p�^���F��Mz���� ��������Ҕ����e��`#`�a`���O`��C^�&� ��j]����d ~>P��% WXxSS�t����xe�(g#�:�J���;�&h 0H��w2�\wX97͍H��Ե]of�-Q��̵�|�dm��ِ��ʳ ���<�����^[+�R�����/����,�I��?��*�6�zkj�{���Ɂ��w�5�HN5rO8�Os��6H���w6"��h�W�o�_/������8�?_����"y=����CT��I��?wd���IފBvT�� �����f��Zhh�� ����'�:��k��j�nT�$6���.ۃ���1@٧u�9��&�1*|��"�z���h������,/)���e�ő�a���d�3�š��O4mt=p�+`�v?��:��zOA�*�ٲΧ����Kf���(������3�C����� �́a1cZmd�M�fj��d$ `��i��`�q$�8!@es>�pšU����pN_x5����h﨣�L7�k,]fs7�%P������� �'���/VF���+@i���ZR{o�KR�*}�ڑu0t��8�����+��$���Cq��. ���}���m_J*�\�^��Y��Fi <�>ϕ ,�����mφ���9���s{�/��=�Qz_ ����xet� ���u`{�~1lq�� �#p�I��xc�&#�;�߾�V���6M���kl�52h� DO���'F���I���S�@XY ?���� �M�� ���#��N����4#��\?�_���^,]ʃ�g���٧�V IDAT>����0;&�O�Y���ǟ���7�e�E�>rJ ���=�oHJ� M^�{h$�(��4��TsT9���(�M�'��Z�G%���26w"�h����tWp�����|��I,��Š�$غM"&�P�>��F��B�Xe��@�,e�,4�Zq��Վ:�8ܧ�a1q����,�Z��+X/�k������X�M��s-t5��;ZF�����x8��97��MT�v���·�`�Ίuo�n��{�n�M<�4�FT�(���Sa�/��K��8,C��a�#��W�ηu��M� �%W ��Ke�Z�잣�����2}�XoF�� �����1���[`!�%�2���>�Ru����V=[��0�����{��^n�)tg_�G}�V+cJ��\�+`� �Bm\% )h�*�S�ILϩ�i�L{�^�!�H��⁆���ޠJ47�_8&"��㬤�?���~�Ιm����a�VG�G�4��k�J���Z/��"��< �ws��|{�v=zp�+��)zMn+ɂc`�F��5�`��b�ɽ����j���@R�N�E��J�;H1��g��o:�&G4��J���Q���hez��V��Hj�����s��2dS��4P2� ���d� �CS${�x�/,� ��u[�g�츔�+�}�F_ɢ�|+����4��͖e@ii�&W=a�#O6��/@� xӓ�X��4��‘1x̊c���x#�;#����B|�8���=�9"��CU^S �EdqݪQ�'I����B0�j��H�w׷o�%#k���y+Lˀ-��f",R�< �.�� 3�s�0;�^��ɷ�u�6�ʯ��h�\qΧez�4%F��6���9�c�gF�� /�����x�B��a���IY �ɂ� e���4��TFV�t�{�����F!=�� 9�oQZp^�;ա�G+�{^"L�I��_V�� �r�� 9g�Z��?��+s}������!I���XI v�p�Z8B���C�|~ �Jy��@a��/Cֲ_�z��uս�L�����쉛��o��st �$�tO�yyfo,�4P�Y�&��~O�5��ҿS0=���`�9��)-E��dw&!�=5+7핀������V�_M�i�B��O/�O\aB/E����(ô���0I�(������Q��=:؃:R:N#��0�������g����\X��W��h�:��ի�YICz�j�ϥ�҅5F���M7KlD�S�^��?G��GUtƖ��Վk��z'���&���:� 8����Vؠ� �� `��g� v`��+=�� /-`q�|�C�����<(4򚋀u�Y? �U#�Ֆ?6b��#�~ ����483�D�8��0/h:��=�rN��N[ZlR}�j�Vǒ�~�(~�< ^1|�>�8Z���ª�,�R����}��P_�RA�\`�+҇cM5��Z{X�^X��6i?�ۖJ5ka]N �YM�tD�|6"�X�(5|��BI�� �( 2�H8Ԟ�ȯ��Z�b�w���jeܓ��.3p�M�5ɛF��E���]x�–�Dt�h���8�FD���w��m�> ���h%���Q�ʈ��j�x�2h^� wZx�T0�d/�'��r�W�HE�̚x��� 9��������|f���GE t��M�Lѧ�Q�g��*���SzC�؝'�d'�h��a�>J����6���ց��>��9$m��G�ES���N+o=�?O$��R�*3�� �3�0c�������uz_oIU��nn �� h\�W]��$�{_]]e��FZ/��J ך�����#%÷+`��[�,���z�:���[�Z=��_�#��m��3���O4�Χ� �Z�����g� �h���7O��i���G+PˑP����SRE�Z��+ɩ}���6)�M��u�h <����܃�"5��%�$�J��1�ME��X2�e������;R� �� �.��됛�C) ;�3��&D3� �U�2;����ެ�Vc3�eGm|�'�7&F���������}M����F9�i ��&�GF�R~��nDK�KI�jas���Z�oF�hoT6�]D�p5" ^� ��ߟ C�|Q$���U��郿D�Au+�m�����7n�BW�Q;`����~w�����\M� ����ǁ��h΍R�H���i���0*����)`|V���o02��D A��e6h}^�c�e�h���>Yn��Ժ�P�����l�/J\�e<}=�".mEL��,�eSE�^�� 6P��[(�oF�A� ���'hS�����6��|m�(-�������r�:�o�B �o_‚�𤑹X�ҷʾa�z�mI%������zti]�W�4�*���3E��q��4lS��N$=[�zZ�0�g[�o�r���\IZ�~BZY�>}5�@ioYm1Ji�P�o#Q�,�>9/y���b��J�uS�� �PZ�@)ެ�P�=Oژ�L�,���ʜ��|�1-}5�[�6��Z�k�`I����d����L[(ժՖF)mU4�ul�Z�X�k6 (Fi�2[mt��68k�h� �HYe��r;K�@��n6��kJ��;aQS ��k��A���������F��-mRՐVjޯ�})�Hek)�9�R�?�* :< ܲ����'�� =g�Yt{���� {DAg}�\�a�8���̿�\���ݪ��Njn��t ���zl���DU,�� 6a���V����~�i���{i�[$�[]�]@����0w+�a�����=R�Ǭ�9齻F-#E$��������5!ϫ�h�Jdj��n��?�r��u�����b�F�e�@����t��H/-?z� Iz�sK�0����"#Q�ڮ�u�l��� ����<� �@�'�~���߾���˪���H����‰�8�Z� t!^*��'- �j��n��F��8��{z�5zI�U禯��)�X �E�}��Ԓ � %�'"SͯMz�&����|��T�@R�u9�ӈ�ut�{��{��i����I5��8�x��D�@)miۗ�?�k]���'=�n�}�ba�@�����{�Od��E��������@���u�� �iK�o��q(2�s]m�oϡ�1�2��Z)VH��U��u���RoN[�= k������Ƣ}�4�aX��) ���z ���!i�Ł�(�\Q��7/ ��ϐ��.����W2�9m��6$F��غ����� ;��;]�V�V�>�{�p| :��!�v����b�w8�T�y��]���R���h?��-x���QZ-�5��\��;�DR��U���NAZQ��q�'W[x.�����"�ƯO�ې�y��o��㣬ξ�=� K�6qC���B)�".@& ����j[k}k��v�.�U�jm��c��Ƿ.�����@���V٬q ��d��?Ι̒�$@���O`r��=g��:�s�k���k*!�g`�w�%��gw����oX���[�qk� %e�P�R�68�J��h�&�o�1�}����*�݇��ic�^D��e�˙0��c7ۅN�v_�9I��4�lw��\�u�3���Y4ck����a�����ߝ�5S�6��`�i��@lK�*���b=��6]��h� �x��.�_�A���c��f�8���D(j�q�����#|3��E�~���mt�m"��B���a�#m���ls� %J��2���d'r;>� ���y�e�N/r�_Ԫ[H�np�rݻ�x�o�P�)��z˃L��5��w�_� H��q�b����r4.�c��|�[Ѿĸ�wbEA3��q��C�sg�^����`�J���3�g>��q�/G�6��J&��|����c�V�c�lֈP&��e]��� �n��L��(��Ԏ̜��Ң&K���DbL>;��'�v5e[�ⶻ�T(��P��~r�����(h\�q�8��-�$��1�� �����e�Qw�V38������i���RVD��9oD����� 2'wP�:+���O� �q�� �r���c<{�~/���1V(mõ�1Pn\� {�f�8B��i�آ� /�?��%� �_�8�BG��}g�����;�X �ϰ�b�����$����-B��}��k?��Fи�$��af��q�܄�#D�Nj��j�� �E�^�_1grҳ���D:���ݸT��I�^��)3#������&�ۤ ZF�V�a�G(/+Lo,� ��[��'@Y�S��U��Q�bJ��n6�:4�F� � �m��B)�Q �1�3� �6��lm�� <�z�[�Kwi�=>�>��sV��'/b$��6��M �B��n�R���˵Jۚv-�#��8��� �������Bi�DzbA<ܢ�0�� � .y G�X�Ϻ��v~���J&�G)�||�;nY�oa[n@$�Gɷ޼����5�����3=x�+�\��6:d�?| -J��-n2��d��Ç�m+V0�G5w�n,?\D.o];����eLR���ϘH�aX�;�Ǵ�|��f�y�w'���G�����C�m�t����z~�����n�F�#|��e~!E����j�*n�^C'�1�9�ԺN# 0:����� q%6�bˎ� ��3�.^�=�B�'�{��M�U�)�`��xR��E|�����dl��cʢ�mݣ@�� ��ꃺ��=^ٌ"�� ��ipGI��W�B��l��#�BFfF3w�Pl��!?��Y��da�n��N�t�'akO��X(�����6��r��~���O䈣q�O���(�e@.����H�Gɇ��WNp��� ����(/��� |�M#�ީ�Cmy L�Vf�55ٜԉ-U���t56 ��8Li�v��M�mrEww�O���6�}I<�!�k:$�l ֍�K;��U���>����sǴ�؍��Db���\�"X� ˃��cl����>礿g�w�8`���D8������<_���$�i&����~�X��c��5Cu�)���{���Ɛ��"�>�&����S�x�*�%�<���kJ��l-0�6���C��Y �F�쒑@6}~�pߟ0�MP��>�?������al�-�x� l-�" �!��R��Ĉ�]��|�*�N(7!�h�ӍK�O�Ͱ;f�"�U�.s�?�f�]�T`���6�M ob��c��g��)©Zb�����'.�'�8k<���y���UC�� ���vKH���Xe� ��cJi|��[Q8Gb[�d����G� ܔ��2l���$d��8��u0T�k�ج��d��ɰ�`3�6�#]a��B���{�t��I��B_J�s1\�M��%�Vˈ����R�S��ub�p�1��c2���p�Ĺ0FX����?��w�XbmU�1,�.�x��=��V�'3�����_ijq��ob���~�G�x������ox�#�Z�U� ?Ұ��B�����f8L&����e�R}xɭ�Ŧ����ټ���������p��k����$�(����UX��}��Yb��x;Y�i�R6VX�f��, �n^�M�60^l��z�A1|` Á�:~��%挦;���V#T!�϶���au�� B�c��ᠡԮ�m#|�]mG�B�֢�{/�Ą�$ sb�g�s���'�&k�1!�R�H��2� }���Q3p��|�r�~�� ��Q���2����10V(� ������[IrKͫs� r��5>�r�y�03�W�H�~1Io�bqc4 N����Rl|����W}�A�g��[�焒��\?�vo LO����}�eN�!$�u ��y{�X�]ĬM[�ظ��K�:0`J��k%��'�'�\��N��Ւ(�� K��y�` � �Oq��yV 7j��w�"��E\�<�������e&��c�f�a�;$m��U� � $�]�56�3$��lw���|���HV�b<#2��E+��so���=����������Њ��a�����_�Z��sn�� 6����V�������a�?���7Z{�B5`+�nw��Cg\"jgqWO�H�z}� ����i�C�3���1��^��Is�%���b��av��k<{C3wLl�BE^]���`��O T�f�O_�=2��F���"��{�>�rcj��x�Õ� 뻅y���=b ��z�m���[�=%��+�׳[y���k��ng4���C��XA��Hn�'�и=���kl��IX/�<�&�ϸ ����2j�%��q:>?�'���g���"��N��s��{X������q�*8� ��d��|�{ߵ��c�@Id������`�� ���X�q��W ��� gp^߾j'��߉+�i\�I �A�z�*�1%� ����>g�g?cO���ծ������W&� �� ����x��G�k�1 x{f� ݚ���U�Y��B)��& ܃08�vq������=e�NAx���U�!j�o�IDAT[�#���{� 3M�gS?o�=��5�99�F�-cK�����&����k�,��Y |L�=�Y�I���QV�Ӄ�B��(��/����;����i\�,���rp,��cm���-�)�8�^0�D�CC���jĶ��u� �,d]� � O�������g��������D<`��G�h�� I7�a�t�l��f���n�Eq�7�Eҋlv�1 ��)��*L2����{r|nc��:`�g�N.Hy�#�:c�!�Sӵa"�y3O;��s��5\�b��=��.�;`ń2+?2���.-�:B�U��al�hk�|'&\hz1`j%+�+�zz%DX �6Yi!��zc���j~}y���9��&�I�8�������A��_?0���?�K�@��00A�B���C8��7��L�����{��7lo��� >�4A��}{Cpyl��x�pn�����^��b[����D�c��Cpb�c�-%W�pD� �ͣ��/�߯�Ž���w�J��_����p �+��NjRZ}�no���{��û����2�e?q�h)�� �g���^kvڬ�08�ܶ{��8x�sզ;6��EӬ��hl�߹�>A��X]b�7����ǃua���9�m{�����-Ű�E{!�c�}"w7�6f{�6%���`ಝ1n6W0��|��+t�&i 0q�a#�f� g�c���m]���˘�F���?�@,���r���QXw�B7g�I1���"�4 [%^R(=q!�!�t[6�a0Ϗp-�X���*Փ<����q����*{?>��_���]H � �# �١��I驺k7'�B�s5��~��ãnq���猵R�t�j�RWkW8��3��UL�3�kZ�3$|�i�2��K1>S���v8�t�RΌD�[��vcr؂o�6;�?��f3� ����j���57��t�9�� �2�z�5k5k�@�(6�I9�ړ��Y0�����47�a��Y7����b#LJ�X0��� 3�E���G�6��IVW�H�9�ȟ9�a�U��r>��c6��E�r�5Ua�A@���Gu �mX��+��Z���w�g3Ȇk���.��$�e�4�Z<'��d�Nl/�Ql��Q��n�;������v�?EaT.��H��U"��V�� �� �~G�^����+0p����JT�`�^� ����i��D��Vp 2��d��ڎm�${j�ˍ��!�� %�9�]�}���d��^��������1.�Z &��Ըk�iG�o�G��Iڪ�v����_�9OW�}�����N�`c�x:��r_p[�iMM���S��+�z��.m���h���Q��A�P�B�cE�-0[<����8.����a��a?�V�PMJ\��z��� �%깥&S��S}K?�>�1~1! qc��N�d��ͩ�J�00֣��.`9v��-g+���Ud�J�p��q���5�=�d��\y�{c(0�����Bm�P�G�.��k��E�}���r����qD���T(�yB���Q!��Mns��y�X��q�t�W9�\�Vd S=J� ���0M����`Xn~��iM'���41<7��M�b|�x t�"�AJ��Pһw��X�g� ����Ы���'7g>��!��('h�K���S �f��I�� F�' �kޠ�e\�,�A(��H�#�E����mݼfl�R��.dB��0��)��m�*-�#����������c`��Z6��Ҳ��7�����,I<��l��k��Fv�jK�q��}f:l��};���_�^��Z�r,Ģֻ�h�L�\���I����.L����.��}�t�{��nb��xp{�z�y�^�<��6 ����*�백Ii��u���~���^��=��ۊ3��X� ����O���7Ď�3�y`�/��3S+xu�y,Cx���%����Ŀ�����J��:��~�rY�k;'3���&i��r��p,�8a��Br�i ]�~�bB&ϑr/� ��1D 7���x��{�CFXE@ b�)p�H��� b�h�� O�a;6��Q�-/��9����8P�y���`;�w޷�UJ�Ϛ,�M�3k�����k��9؀�����״퐵<��f�6�� c�*��k�a�5�D��m� <'P��p�q7�׊�I�p5Pa���p�?��b��R7�J����e�M��m���MX+I�a�X�| ���`W��{lt}�� /��9\o���`��ʼn��sF��e�t�&���W>�v�����e����ҍ�gE�z#܁�x��K����h<��a����ź��g��� �#�nA�'Ur����(��y\ک�{�⿻:E�exe��c��Jh�Myۖ����WY���. ��j!���-�)�t&�̆�^�B(J��5��J�G$�2���6 ���$������K�i"�k?�;SN�n22�t��Γ�"^Exc���c��j���u�a1� �ХW���>k'`�pw|�U���8�0-�Ձ�0�1H ����Zq._�:ݵGl3}��R�`�lr%7�|�|!M)�Yc����g����P���s��B�*Z�c@uȤ_�zJ�C=��S�_�b��o��W��/H�+�?ZAQГ�^�d;����ˁ �֧��+����hֽx ɖ�:/��4���ٶ�s5�6�v�s$�Aؒ-)Z����-/G��!\ �BO�U`X`���w�g�604�~���3V���?Ob㋎-+ʞv�[��8֕+��^Ɇhy��M~��Hz���\���/�rq�D���Xۙ��F7`7!�g�Y7\�O6{x xɚ��.�t��rϣX ӣ�|}�������{J9wM�����K7��k��54>��Ŀ_���u�����1;ݱ����NE� `����i�˒��z'�#�C�@��'���]1���ˌ�Ij <+�:y6�sgt/�\Ó���/��� �d�9e��� Zsx��u�԰h^�j �|������D����/�w�@���?DlVY8D>�r�dB����{��Y����W�9���/��o��;%~Svp?�%g0ß/�Ǻiϳ&Z�+y�|*£�ܥ�ۛ� �Ð�:���+�-�����G+)�#~Zo�ߗ��a�5m�Ш���h��Ķ��/'��ĺ����Mzڝ�l��Q��D�U�X�g�j`��Ί�>���[�8�QK�����`��+]��{~�u&��c��L��+*�@Y�mb������H�u���sq����!�i��˘���][ i��D+Y�Gx�0�q�1,t)ː��nX:� %%\�CD�%p��҅Rq9�5{��~�5�'#���퀷 �#�.k�"�bc)x�� �!���h��`�[ph)6���� ����s�?�F����~��`6�1Aެ�O��O\�k��Q�PZ\��ǦW���p�1�Vܦj����(XO��՞a�p�3�>�yVy�,�p� ���1���w������O����pW��v�LN܋׹���� �Nc��k��#{�.h���d�۾�g���GY�B�������1`�ۖ"Û�kg|�����gMi�9f��F�AZ��\�V��llI�z��� ���w�xB�`4Y̳ET�R[����5{h<۟�x+�aR��ް��f=�6*-r�� �0ԓ�i�xL���U#̍Œ�[l�`k��d.�.$�G��0��@m����Ts>�;:��7�Ó����UlY�%)H�r���O�a90�n�'�r��ܵr� � x�Ol�o����n�Z m*lW��d�l�Z�p��73Ж|ZC�u��}KޕC���������sBq�E�uXȴ!�g6g�–o����-l>,|xF��=۞��Q'v���9��bīk��N�G�mȖ q��e{�y��+���pgSA�Yo$�o�:�.�h~���\<lj��ZD^g�\S�g��χ��_��~�b��ґ�;�}��l�����"|7��8�he˷�c�������=�P ǘ_��[JmÊ,� �V�ީ�s �ǹхM����*L] �Z54���-�� @��_��N��N��Ƥ����2=g���(%.า����� �_��[Z{$|+SD[��?�e�~t�/*�چ����4p�]���g���U�3q{�kE���T0o� �[gFQ�������{��VT(�7V`���2T�R�F`f����R���y��H�P:���)�s�T؆���(���֖d��s���(���PR��<�L�QEQE��a�[4�p�2��+��(��B�0���C�(��(*����o��(���P:�Y�BIQEQT()-J�y:4��(��B�p�]h�6�0Z�FQEQT(���,���(��(� %������(��(� %%�P��(��(J�F{��=��)��� ��txEQ�%À�: ==T(��U�2��q��P�����g�V�A9Dy=��VN6[U(���n=P�*�qx8K/�C�g��u�C���(*��/Oak*-�z�W*ݏ�(���PR��~Ei;���a8�D��s�r�0:�����a8dX����(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(��(���鷜2�,PIEND�B`�neo-0.3.3/doc/source/images/generate_diagram.py0000644000175000017500000002413012273723542022513 0ustar sgarciasgarcia00000000000000# -*- coding: utf-8 -*- """ This generate diagram in .png and .svg from neo.description Author: sgarcia """ from datetime import datetime import numpy as np import quantities as pq from matplotlib import pyplot from matplotlib.patches import Rectangle , ArrowStyle, FancyArrowPatch from matplotlib.font_manager import FontProperties from neo.description import class_by_name, one_to_many_relationship, many_to_many_relationship, \ property_relationship, classes_necessary_attributes, classes_recommended_attributes,\ classes_inheriting_quantities line_heigth = .22 fontsize = 10.5 left_text_shift = .1 dpi = 100 def generate_diagram(filename, rect_pos,rect_width, figsize ): rw = rect_width fig = pyplot.figure(figsize = figsize,) ax = fig.add_axes([0,0,1,1]) #calculate height all_h = { } for name in rect_pos.keys(): # rectangles htotal = (1.5+len(classes_necessary_attributes[name]) + len(classes_recommended_attributes[name]))*line_heigth if name in one_to_many_relationship: htotal += len(one_to_many_relationship[name])*line_heigth if name in many_to_many_relationship: htotal += len(many_to_many_relationship[name])*line_heigth all_h[name] = htotal # draw connections for name in rect_pos.keys(): #~ pos = rect_pos[name] #~ htotal = all_h[name] #~ if name not in one_to_many_relationship.keys(): continue for r in range(3): relationship = [ ] if r==0 and name in one_to_many_relationship: relationship = one_to_many_relationship[name] color = 'c' alpha = 1. elif r==1 and name in many_to_many_relationship: relationship = many_to_many_relationship[name] color = 'm' alpha = 1. elif r ==2 and name in property_relationship: relationship = property_relationship[name] color = 'y' alpha = .3 for c,children in enumerate(relationship): if children not in rect_pos.keys(): continue if r ==0 or r == 2: x = rect_pos[children][0] y = rect_pos[children][1] + all_h[children] - line_heigth*.5 x2 = rect_pos[name][0] + rect_width #~ y2 = rect_pos[name][1] + all_h[name] - line_heigth*1.5 - line_heigth*c #~ x2 = rect_pos[name][0] y2 = rect_pos[name][1] + all_h[name] - line_heigth*.5 connectionstyle="arc3,rad=-0.2" elif r ==1: x = rect_pos[children][0] #+ rect_width y = rect_pos[children][1] + all_h[children] - line_heigth*.5 x2 = rect_pos[name][0]#+ rect_width y2 = rect_pos[name][1] + all_h[name] - line_heigth*.5 if y2>=y: connectionstyle="arc3,rad=0.7" else: connectionstyle="arc3,rad=-0.7" a = ax.annotate('', (x, y), (x2,y2), #xycoords="figure fraction", textcoords="figure fraction", ha="right", va="center", size=fontsize, arrowprops=dict(arrowstyle='fancy', #~ patchB=p, shrinkA=.3, shrinkB=.3, fc=color, ec=color, connectionstyle=connectionstyle, alpha = alpha, ), bbox=dict(boxstyle="square", fc="w")) a.set_zorder(-4) # draw boxes for name in rect_pos.keys(): pos = rect_pos[name] htotal = all_h[name] attributes = classes_necessary_attributes[name]+classes_recommended_attributes[name] allrelationship = [ ] if name in one_to_many_relationship: allrelationship += one_to_many_relationship[name] if name in many_to_many_relationship: allrelationship += many_to_many_relationship[name] rect = Rectangle(pos,rect_width ,htotal, facecolor = 'w', edgecolor = 'k', linewidth = 2., ) ax.add_patch(rect) # title green pos2 = pos[0] , pos[1]+htotal - line_heigth*1.5 rect = Rectangle(pos2,rect_width ,line_heigth*1.5, facecolor = 'g', edgecolor = 'k', alpha = .5, linewidth = 2., ) ax.add_patch(rect) #relationship for r in range(2): relationship = [ ] if r==0: if name in one_to_many_relationship: relationship = one_to_many_relationship[name] color = 'c' pos2 = pos[0] , pos[1]+htotal - line_heigth*(1.5+len(relationship)) n = len(relationship) elif r==1: if name in many_to_many_relationship: relationship = many_to_many_relationship[name] color = 'm' pos2 = pos[0] , pos[1]+htotal - line_heigth*(1.5+len(relationship)+n) n = len(relationship) rect = Rectangle(pos2,rect_width ,line_heigth*n, facecolor = color, edgecolor = 'k', alpha = .5, ) ax.add_patch(rect) # necessary attr pos2 = pos[0] , pos[1]+htotal - line_heigth*(1.5+len(allrelationship)+len(classes_necessary_attributes[name])) rect = Rectangle(pos2,rect_width ,line_heigth*len(classes_necessary_attributes[name]), facecolor = 'r', edgecolor = 'k', alpha = .5, ) ax.add_patch(rect) # name if name in classes_inheriting_quantities: post= '* ' else: post = '' ax.text( pos[0]+rect_width/2. , pos[1]+htotal - line_heigth*1.5/2. , name+post, horizontalalignment = 'center', verticalalignment = 'center', fontsize = fontsize+2, fontproperties = FontProperties(weight = 'bold', ), ) #relationship for i,relat in enumerate(allrelationship): ax.text( pos[0]+left_text_shift , pos[1]+htotal - line_heigth*(i+2), relat.lower()+'s: list', horizontalalignment = 'left', verticalalignment = 'center', fontsize = fontsize, ) # attributes for i,attr in enumerate(attributes): attrname, attrtype = attr[0], attr[1] t1 = attrname if name in classes_inheriting_quantities and classes_inheriting_quantities[name] == attrname: t1 = attrname+'(object itself)' else: t1 = attrname if attrtype == pq.Quantity: if attr[2] == 0: t2 = 'Quantity scalar' else: t2 = 'Quantity %dD'%attr[2] elif attrtype == np.ndarray: t2 = "np.ndarray %dD dt='%s'"%(attr[2], attr[3].kind) elif attrtype == datetime: t2 = 'datetime' else:t2 = attrtype.__name__ t = t1+' : '+t2 ax.text( pos[0]+left_text_shift , pos[1]+htotal - line_heigth*(i+len(allrelationship)+2), t, horizontalalignment = 'left', verticalalignment = 'center', fontsize = fontsize, ) xlim, ylim = figsize ax.set_xlim(0,xlim) ax.set_ylim(0,ylim) ax.set_xticks([ ]) ax.set_yticks([ ]) fig.savefig(filename, dpi =dpi) def generate_diagram_simple(): figsize = (18, 12) rw = rect_width = 3. bf = blank_fact = 1.2 rect_pos = { 'Block' : (.5+rw*bf*0,4), 'Segment' : ( .5+rw*bf*1, .5), 'Event': ( .5+rw*bf*4, 6), 'EventArray': ( .5+rw*bf*4, 4), 'Epoch': ( .5+rw*bf*4, 2), 'EpochArray': ( .5+rw*bf*4, .2), 'RecordingChannelGroup': ( .5+rw*bf*.8, 8.5 ), 'RecordingChannel': ( .5+rw*bf*1.2, 5.5 ), 'Unit': ( .5+rw*bf*2., 9.5), 'SpikeTrain': ( .5+rw*bf*3, 9.5), 'Spike': ( .5+rw*bf*3, 7.5), 'IrregularlySampledSignal': ( .5+rw*bf*3, 4.9), 'AnalogSignal': ( .5+rw*bf*3, 2.7), 'AnalogSignalArray': ( .5+rw*bf*3, .5), } generate_diagram('simple_generated_diagram.svg', rect_pos, rect_width, figsize) generate_diagram('simple_generated_diagram.png', rect_pos, rect_width, figsize) if __name__ == '__main__': generate_diagram_simple() pyplot.show() neo-0.3.3/doc/source/images/neo_UML_French_workshop.png0000644000175000017500000052743712265516260024130 0ustar sgarciasgarcia00000000000000�PNG  IHDRq`jK+1bKGD������� IDATx���yXT��?��0,�.�0�(�hh���`J�����)J�FOZ��4�oY�}�]��wC3�21����MٔQ������y800303�}^�5�5�{��sf��{0���������SWu����Exxxk�A!�B!����B!�B!�Bi�fkTJ��i��7=!�B!�B��QO\B!�B!�Biè�B!�B!�B�0j�%�B!�B!��6�q !�B!�B!� �F\B!�B!�Biè������pttlQX�|��""�B!�B!������???hkk�v�B!�B!���� *//�ɓ'1~�x����|�rTVVr����!�H0q�DDDD48������������ &&&��W�xe�3k׮���'���akk���x�޽����q���-�8!�B!�B!��qې��8|�ᇰ��Ŷm�0u�T����u��_�����/^��͛�����Ι3��������۷q��)�ر�Wll,"##������L���z����T�޽���HMMEjj*�ϟ��544�ɓ'���K����ԩS�F^???�����ǧ��o�~���Eaa!RRR������,�]��A{��ŗ_~���$��������lll���'''��� 77��#�8!�B!�B!��qۀ�W�bРA������nܸ�?��s�΅������g����c�ر �������bDEE��?����b1�Ν�~��ǴiӠ��mmm������r����/z�� �Ř8q"�����՟�����H���"�AAA8u��2j�066�������f��\(���B�s8w�6n܈��hjj���ӦM�;S�gff��ݹ�u���K"�4YGϞ=���۷o#..eee '�B!�B!Dݨ'n���"==�'O��͛!��t�R����u�i�MII�Z����>}�����Bǎ�S �1�`~~>����b� ���!55���R�6���5��⸩��Ґ��&5�����///t��7n�@HHЩS'�� !�B!�BiMԈ�Ft��3f�@TT�_�x{{sS �:>w�\8p�����޷.\`ԨQشi��ʐ����{�bҤI �haa��� �����������}�����-^�\���pwwGPP�����Ɉ���+�֭[�i�&xxx����ػw/\]]�>N!�B!�BHk�F�6H"�`ݺuHII����\��~�m�ڵ K�.�H$B�>}x=U��ߏ��\t����Θ4i/^�P\� ��ɓ����X���P��� ������aĈ Ĉ#xy� �D�cǎ!,, ��ƍ���#G���� ݺu�H$„ �����.Y�W�^ży� �>N!�B!�BHk0e�y���Ç���___�����ZB���{�B!�B!D��'.!�B!�B!��aԈK!�B!�B!m5�B!�B!�BHF���B!�B!�҆Q#.!�B!�B!��aԈK!�B!�B!m5��K�\������с��-�M��;w���O�>�K�������Q!�B!�B!� 5�Nyy9���q�� ����ѣG�!�B!�B!�zԈK��g����O�<����%%%8r�H+GF!�B!�B�F\mmm�D"���b��������yo޼ oooXZZBKK ����͛7����ìY�`kk mmmbȐ!���n��;w���������w�^�N�B!�B!��vJ�� ����/^�@aa!Μ9��0`@��~��Gx{{����ۗ������={?��<==��� &N����2.mEE�_��{��aĈ ʿw�Ǝ���X[[#** ={�l��B!�B!�ҮPO\�����������t�`���1cF�y*++����B��N�BYYN�: ��*̛7�k����ϑ����/_��F�^���1c� //�;wƥK���B!�B!��+Q#.���ٳ�u�V��o߾���,��������� ///�5 �����w�����HOO <k׮��� ���0~�x.}]3f�@NN�v���ht��MgI!�B!�BH�G���ׯc ���سg ++ �f�j4ONN�\,����pϳ������m���C��JJJo��F�� !�B!�B�7�F\��С�Ν ---��P\\,5���������m ^ڄ��bqssP�#x�ܹ`��w�B!�B!��f��p ����b˖-������AOOOjgggX[[~��w?~%%%8q�.^����F߾}ѯ_?�7�_��5k� 77��ň��DTTT��w������x�b��7!�B!�B!�5�na3sssq�! �����Į]�������j���@__ӦMCuu5�P(Ğ={�����gnnCCC�?^j�\MMM�8qC�PӨ�j�*�=!�B!�B!m5��@ ����m۶!88�������z�*���`nnMMM���cҤI�r� <==���ƍCLL fΜ �X MMM���c����ݻ���uuu��O?��� �q�F|���;aB!�B!�B�S�d�����|}}��j !JB�aB!�B!������B!�B!�҆Q#.!�B!�B!��aԈK!�B!�B!m5�B!�B!�BHF���B!�B!�҆Q#.!�B!�B!��aԈK!�B!�B!m��1��U��ŋ�}�vuUGQ�D������B!�B!�_�z�B!�B!�BH��FܡC�|}}��=�������2!�B!�BQ=�K!�B!�B!m5�B!�B!�BHF���B!�B!�҆��F��СC-.g۶m���Dǎ�p����|����b1��� Z�6nܨ�{���Ľx�"._��:`���X�n]�_e>|�^�z5����‰'����;���???4+6___hii!%%����ڵk�������G��իW��c�b���qCCC���+W"!!A����/��TTT >>Æ Cii)`oo����B��Oc���_�^_���-((�7o涏9��ӧ+\η�~�?���^�~}�SϤ���K�. �w��III͚^���W�\i��ڵk|?��3��ۇI�&�$�ɓ'��Duu�\��ݻ�  44����ѣ�J�"�k�ƍ�!Jegg�'N ::Z���Vo�ݱc֬Y(..ƅ �ş�_��nݺ׀ ���Q�Rdff��ݹ}UUUr���ͅ@ ���������s�q�F���@SS�6m�ZⓇP(P�%���O�P���J��O׏B���� 7��߿_5�BQ���l߾��vttDXX� �}WU�'O�`�Ν Ry]����68fcc�.]�������x�� RRRxi~��'���gΜit�������������>���[���ųg�p��%�xaa!|||��/�୷�Rz<׮]�ڀkbb+++�ٳgx��1���[�0r�HDGG�{��J��B���������!��q���1q�D@`` ƌ��S��a�ٳg����lXXX�5�ڡ��1�0Rkkk���A$)\���9c(**�������;���///�8q���X�d JKK�W3e ���5��%c-�>���#�����CII �ĉغu+�����[]]��T�,B^'=z��W_}�mS#iOΝ;���` :U���/���NNN iV���9���777dgg��Ϟ=�-���䉏�GXX�mۆ��J5�󺻻��ŋ�߿�b���� ��.���w�Ehh(�UQQ>��c�޽P^^///<|�fff*� ��Fi֬Ypss����Xzz:BBB�y�f���ӧO��ヘ�hhh�,.BQ�9s��� ����M$A,C,CWW&&&�v�9m��ۇ��l<�;w�W����맲�R:u�---DGG��������AAA��A��Ɉ����\{{{899!<<@�|Mu�(--EEE��� �@��O�rs��eaa��� ���5+���"ק9���!����ѣ�)]�����m�ŋ������<==U#!��K�.X�r%����k��۝;w��:th0=����/''�� ��222˜1c�����j�܊� ̘1�׀kll��~� ���ڀ �z�BHHn޼ �X��/..������� �|;v�@rr2����S�N�p�����s�r����y?\)�P(��������"00�A.P3M���_�9s��:�s�>���!DU�̙�={�@(b�ʕMN��ꍸu͞=����#G���666�H$� u%''�z��kȐ!�H$8v���� �H0n�8^CCC����ŤI� ��e��ؑ#GPUU�nݺA$a„ �?��8v�8��" ��K��� ������aĈ �:�uРA������q�"""آE�xe_�vM�8� ֬so�Ο?�;�_���C"u���!�=����^�vvv*�G������y��/_.����4^ooo��U��ɳgϘ����;v4��ӧO�����J���_~ip/�b� ^���N�q5Ǔ'Ox1Y[[�vHDIj�)!��;v�� 6ؿo�>& �q���[}N\B!��}Ç���=����ynW�Z�d��Ǐs��v�����RG�j�����7o")) ���022B�n�����뱤l���ţG�PPP�W�^AOOb����-��������w������� hkkC$���ppp��e�DVV�������f�>}��W�^j��.U��Z������?�ESmllЧO�{�)*##׮]��ǏQRR333L�>���Rӫ�ԕ���7n ==������BNMINNƵkא���@kkk������Z���RQQ������?���Auu5LLL���A�A___��-$�.���Gpp0������������Ԏ;PVV�m�����~��z��w���s���Y+#$$;w�TJ�p�����3�����M�6qۧO��M��lmmadd�M?W>bBi/dΑ��fο��ڵk}����vx�(���&�������1�n�:n_�=d����ʥ_�t)c��6=qϜ9���ܘ��/ƺ�@�����6m�Ċ�����hOܻw�U�V�7�|� �F���u�ƶl��***�>����n�:&��,322b���쯿�R{�-�����w���c?��3cL���m�^֊��a#F�h������+|�;w�䥽�>c���7o�ѣGK����]�נ����lڴi�ٳg ʻz�*�oZ���ԩSYff�\��Dvv6 b��ƍ^+]]]6k�,����h9YYY2ߏ��ƍkq��}�kq#�={���f��\�zUm�@Z|�bZZZ2�H$,##�+k����?RM=�v������?���_�����תC��uok��UUU�7���kjj6���q>|�+_WW��x�EeVUU�N�:�ʽ|��R⭬��M� �H�?r�H^\u�/�����ݻw��C�����Ո˘�\�N�B!r�H$x뭷���Y�lРAR�8p�{޻wo���O!�TVVF����D�~kkk >�B������p��-n: U�ҥ �x� H$���999�s�o��7n`„ �z�*�����UYY��'�ѣG�>===�9�z���� ����=;w����&�SE�-TUUq�������{{{���!...\@YY֭[�����y/k}��wX�d o���%&L��.]���� ����˗/�~���odd$>��#nX��� ���`ll���ܸq�1�^��.^���K����pqq���455�7np���������>�E��B!��ݻCKK ������׹�JNN�ܹsq�����,���+�y����s�ttt0f���� ���HLLą ���s��W�0o�}�~^�444�a�L�<@�ߏ5k� <<\eu*ӟ���vvvVxJ��4440d�����z\]][T.����~���S(�Νy� �:������vwwo�H!Dy�M�@=q !r��0!�זz�2V�p�~�C;�������.88�;�^{▗����ⱱ�a'N�`UUUR󔔔�~��������(�i��ٷo_�}�v����&�MHHh�c�믿n4�ѣGyi'O���������l���l���j+���={֠�%KXIII��iiilԨ��[F IDATQ @�^��쉫�{�XMO��C���>�����5H���ͼ��>��=]uuu����~����_�|ɛVD�נ~|��,zxx�����oܸ����xyBCC�H$b���'KMMm�ﯿ�b����|/^l26E=}����������:}CQQ[�`/���&�}�v�uxxxp�ս�Y]� � ���K-����]�t)���)�Z��/�l�z5�ŋy�Μ9S���W���߿�R�j������ܹ�j�媽���nv����?%�Q�;�!�B�4e��wQAA~���i.^��������̙3��*lݺ7o�����q��ML�2ҿN���b������������D"�ܹ�>��A/��z��s��������m޼�� ���~��{njj����F����� 6��>P[�͵n�:���q�K�.Ŗ-[���� �X,ƹs�0t�P^�GeR��5k���˗��� ��_H��jnn��Ǐc�ĉ-:���R���W�\��z��Ӄ��!���kP_II �N����������ü}��>^�x�3f����R{+����F {�������9s�:uj��������^ؕ��������|���s�V�^��z�\��@��cÆ R˫��P�gkc�7���\��ż���My�O��ŋ��\�-�]��۷��!�y̝;���HJJ��HKK����]4�0�j�0�f�̙���O�s��i8::6�Ny�`���ͮC]��BH��D�����7^5�,�7n,--���TTT�V� �8z�����4�ЫJB�_}���������i����oHm�T�*�l�/^�����q��&�t��{�쁦fۘyL�{y��In�w���7�صk���Z�C�n R�|y��4&&& k����'''n�1��;"44��|�ƍC��ݹ�+W���,EEE��� �P(l2��_��]�rۗ.]������TeԨQ=z4���O?�ڵk��|�6�����Rʭ_N�z���<���\?}k5�nݺG��������߶J,�����(��I#.Q???n*�8�~�������… x������ ��}uӶW���;�>}�mO�< hň���oBKK�ۮۛ��� >�͕�\�(�9���x��,X W�EϞ=�Լ����_~��ףv�…2��S�N�h5~���`.y��4���r5� 6��={�l�����=z���J�ckJdd$JKK��3g�����n�9�#""����� �V�j�H�W�g�H$RJ��˩�︥꾦(4�4P���Ty�p��y^s�@�����J��B����F�)S��z��u��888������R qqqi�C~̘1X�v-<==aoo[[[�������333��� �^���?z�(��� �`gg��{��}^ 4hD"��ܐ���;�k�.������������˹/~���H$X�`��� �H �H��o*~y򇇇C"�`�ĉ �ܝ>}={�D�n����+V���K�.������?t�d_?Bi+F�� ���䍖9q�����������2]�x������J��ݹs�7oF`` <==����Ç��Օ{ >�[� �Y�I���g�0u��/2��2��~/>E^�����ÑJ�����m+�ݒF�q��5;/��k �ȑ#�JW����{���FQQ���5���W�S�L�m_�zU)1���� �>>X�v-W���������~�رc����۷o����F���W�"::cǎ���144�ɓ'ѻwo���c��᰷��… ѫW/�������X�r%��T�����󃟟��_QQ���x 6 ���HHH���=BBB  e^�Z��]���!������X�~=��)>��#���O�ޠ�N{T��o�!C��R$5�=�u��I�L�����Y�faݺu����={�Ν���+ƍWWW 0@����(�9�߿�=���AϞ=�Ϋ�yUq/���������!�����G�8j��ݻY�Tq �����+]�Ƹ��{������ � >�m���O�b���&��j�6l؀3g�p���W����;�R�722���^���.,,TJ��ˑ5����^�@R�筲z����ۘ0a�S����� ��@i{���U�����M�7o,--add�� �j�*,,l�'/L�6���ill 333���!22���044�H$BPPN�:��۳g���1v�X���oa��$&&�޽{���! ��憡C������rq��bL�8qqqr�/O�-եKhkk����������@ @aa�B�˺?���#���i�������Xܹs��ɸ|���4�Yݩ455[m����j̙33f�hV��F�x�̙3�ر#����h�^�o�����0p�@�������1[e6G�9$MMM��VU�Z������{njj�P�WKk�j��*��4� 2�R�z57cL��d������Gu�^�;Ou[׫W/ޢ��n�j�ߏ����'O�(�ܴ�4޶2~Z>MC���jč�����;���>�k׮UK���R�����LL�0�����+���F�*cd�����x�b�=�;w����y?���,�|Y�ei��hyF>˺�M����������ک��}�G����jF�yxx������:t��y����ꍸ;v�@ǎѱcG�={K�,��tu�D[XX���K�J����j���ސ�s��dff*ԋ����\��<666�4�Ν����!�!�H��~����K�Σ������# QYY�����B���Q�6��<��l��G{{{���r�������={�ӷgu���۠� �ׯ�-p���� �ĉ���C^^�����=���T�Ґ!C�%K���ظ����J���૯�B������*sNRU����_����ߪ��u_�-��R�֥�����w���6�����֭㽮>��3������7��m+��^Sꗣ��b���]��X������������ѣ����������I��w�^|��HJJBll,׆�����B��� -- YYY���ڑ�!!!x��n޼ kkk���9s`jj���\ܾ}�N�Ž;��#o ����w���^�:.+>���Ddd$������p�� ���"�Y�QQQ���ʗ�_�ڑ�/_�DLL N�:�5r֎l޽{7��푚����T̟?_��u5v������ �Fc�ٟ�����T�[�N�s�'>Y�w�ƍ���Dvv6rss,u���"++KfL�>����?&N� Ę1c0u�T�5��]4%;; �%�'���5�����S�NHIIQ�>077c EEEܗκ=$������'N����K�,i0DE H��*O�M�o Ƙ��7]?Bȿ]������ȫ~>E{�I3{�l����Ç�^�^���[Y�**//�7�N�.]%׏̊�lee�-[�`ӦM�����˗q��U���_ z \�rÆ É'��;Ve*��竢�O�[����� E�^(k�$Y��z~�mXoι�}����m$ �ϟ��۷��-v��A���{�YCu�j�x.))i�t1��� �D�_Osu�����\�E��4Vd���x��F���M>g�l۶M�������k��F�>x������� ,\���jj�uqq1���p��]���@,c�ܹ����#�y+�xII���jϭvaOdgg����عs'����կ_?|��' �okk wwwq�2���ɥ�;w.8��~� @�Oy'׷������KIjj*����㥥����@߾}!���S�]�-,,������Q�����R��4����#���՟���|���;�Pΐ�iӦAWW@͐��544x�`ۻ�Ñ+++y?,��O?����r���r5x���)4伖��Ǝ�/��QQQ(,,�_��իW�z�TTT���_��GU�)�����|���*�e�aݹ�� 5�)ڐ�\�~=�g����� �� �;Ls:���O?�����矷���ϊ����ވ[��ٳ�`9r$\]]acc�D�5k�4H���ܬ/�G�AUU�u��H� &�~]|����k�.,]�"�}��Qh�ɱc�p�� 8�߿?w����|� ���0b�bĈ �4h&O� ��b�������C� �D"��c��D�� ���4����#��������7���������RWJ;v��_۲7�x���+�߻w�{���!���ʚ�@(���6l@bb"<<<�cϟ?DZc��D����!VVV�[�L��w�*%��T}/�.|U]]��k�ƍr�m��~=�'u�(4wtFF�w�=���XYYaٲe���'O�k׮V��q�9޶m[�F���e����⩐��?c W�\�+߽{�x�����,�?���222�}^^^8x� 44�TSid��� ����k�ij䵙��Y�VVVV�y������?2����Rw�r��#�e�/+�,�#�W�X���4�����߿����,����h���~MMM�Q��h�<#��FFFزe ����{��}����f�����++>Y�722����2����db���|X%��_�� L��5j``�m�޽�����ܿ���Rb�K�����ݺu�8�͝ה#G� 66V�:Z����۲��~���:ě�1�^��֭[y��MG���?涳���T����`Ŋ ^$%%a���}�g�VzO�#G�zFDD������s�*�:::��(ʒ���Q�F!99����'Or�"����޿?rssѱcG8;;cҤIX�x��ⓥ����/+S�12Z��M�gdtS#�W�Z���899�ddwll,�CCC���>>>R�W�{�z �J�:��[�vm��������z�Ä�׮]��D�����h���yy544Xbbb�y��SJ^��'.c�}����X���Yff����������ݻy邃������� :�A/��z.޺uK�sa��_��W�5k�Rfs}�����.]�d�Ʈ�2z��^2�؎;xi{��ɞ>}�h�7n0###�η%=q�q ^����1�p�B^ٓ'Of���M� ��9rd���rO\�{��%�����ijj�����1VVVƜ��yu����?��C����7�۪��Mqq�J� �����o7�y�X���~���:&M������o���d���lֳgO^=nnn���D��#�_�k����φ�[9�4����!By� <�����(//���'���$uA���|��7 ~���O`oo�������QQQ �344���K��^�h�9���� @MO��b������:OWYY"##�u�V�Z� �G�nv�&L���7g��իakk�iӦ5H���C̙3׮]���c2��6m���//�&�4�v�Z�����SE�͵f�;v�[�g˖-��7�z9@zz:�̙��W��VoWU�K ��Ç����Uܻwo|��ܽ���ƒ����#$$���pqqQ˼�����?�ǎ�5������7v���[������'�`�Ν�>MMM����5fe�����ի���[�h�� P3������c���8z�(� �-|TPP777̙3�-���-!!aaaزe �� p��1�D�f�*ˢE��m�6nQ���Hx{{#44�7g���ϱb� |��w�>�Z�JfYYYx��1���(���R�;�7w���%�-[&����� �[ �B^ԈK!��۷oG\\��OEE6mڄM�6����;w����?���d$%%5(��������������a�ر ��߿��?���DDD��]ی� L�26661b��젡����$$$ &&���jV�m ,\��k|,++���6n܈Q�F���ϟ?Ǎ7p��ETUU֯_����J�" �ݻwK�.Ųe�УG����;w���1��������ׯ�֭[�|��~� 婢�水�DXX�L����j5 ����x�w`oo���r����… x�� 88K�.UZ�z��?�Q�F!!!����e˖aٲe���DUUo�kkk|����!۵�h+�:������G����'��BDDΟ?��cǢW�^ �HJJBddd��u�V��۷5BW� ���/�����<���5z������;�y�nH-c ���þ}� �ѵkWt��x��1oڀZ���8s�BC�աC�9sÆ Ë/�L��#G�����ٸt�o13---���|��W �������`���n��LEM�<�{������Á����0k�,�7�깗�:u��������O�c�{12ǎk�h[w�ZeS���u��g�bƌ\��W�^��ٳ8{���<:::ؾ};�͛��PUF[[�֭��ٳ[;�z��[�na�ҥ >��ӑ���d� & 44��\�ЧO�������ӧOԼ�"##��722�w�}�Q�F�<6B!|��!��N����СC�v�&M�==�&�`ƌ�{�.�l٢�^u�&����������1d���(������A��m�6 2��ukkk#22�ׯ���I����틳g�6XЮ){��Ň~�>}�@C�鯇ZZZ�����˗���Je�����޽��c�6z�q��9�[�N%1���uYZZ��ٳ����ܹsѽ{w�D"�D"888`�ԩ8}�4���akk�M7Q��ظY��C]��u������cٲeMޛ:`�̙���{mpk͜9o��Fk��� IDAT�!��;���È�������Etuu1e�\�t �ΝSKn-777���b����Ʃ����ӧ���V���B�'`u�Q���Ç���__����2`�a�̙-�? ���nQ93g΄D"�� ZT�����N�>��+W��C��{5�=LQ��� ܺu �=B~~>^�x�����������VŞ>}�7n %%�����҂��1������ 333�����+\�v ���(,,����b1��ݻ�����b���q�䖔�@[[���ܔFFF�^fKeff"::j�x��7ѫW/�ơ�{����z9��Ĩt(w��t ڋ��rܼy���rrr���� z�����lU�|������q��}<}������с��z�����C[[���Dii)._��'O� ''�������ꄨS��jl�"�M���Ó'O�]�)�����FUy�ϏB�������v(�ZVVV�8q����С�������� 0d���Ve�-emm��ӧ�v*���:}�4�\GG}��QK�m�����6l� �ڡ9ijj���j�a�%tuu�����aB��MM�0e��߿_�+W���������������2���!�H0q�DDDD48>x�`,^��G�F�Ν1~�x���r�0h� �D"���q+��*((���?���`bb���nA���bt����=����r�/KK�/>>� ,@RR$ $ �����B!��O7o�ę3g��q��AKK�#"�B!u��Fܦ\�x�/_Fzz:RSS��S���Cdee5������T���4Z~ll,"##������L�Pq 6 EEEX�f ���xy}}}QXX������!++ k׮P����������$&&b׮]x���;�_���_�^�����ݻw������HMM������B!�� ����{��\iccc�����jn��ŋU!�Bi�vӈ;o��\(������ �@+++� �<33@�j��S̝;eee��g͚��� :���J�]��!�By}]�|˖-���3ttt```�H===�1۷o���:`��V�BȿJS#� q��I�|�1118u��s������000@ii)�{�nTUUhz�6!�j�������A1f�L�:x �Ϟ=�ggg���B-񙛛�1���"n�䂂�5���\600�Ǐ����q��a�����뾮������ ]����T�����o�]'ONN�ڌ�#G��J�BII ��������={����Zŵo�>���kعs'���1d�����8,[� NNN����\.Dze��Ν����q��������+V���i�p��i�?��_������������011�[o�����&�BDDDDm��� �͛�y���:""�'�ԩSO��[�n������'$ /^�� QCA�z�6���� ���g��Ϟ=�U����z�}���2� ;w�7m���� �˗/������m(~M�����={�4�}"""""""��IEE*++1p�@H$ܸqIII�4i�V�k�����ann���\�xQ�:�j��v DDDDDDDDDm���=֯_www�;���;vl�ꈋ�Cuu5��� �J1e����=���iצf��M+�#""QoYooox{{���K�~�CD[�M�T��KDDDDDDDDDԆq����������� � .Q�A\"z����q�F�;K�,Azz:A�uXDDDDDDDD�qu`֬YX�jU����� n��$�1�v�j�v�%��acc�D��P�$m����|%''�W�^Z�q�>���= ����8v�X�{���K��!"""""""z��:�?���022�umεkא���޽{�:�6I����JJJ������x=z���SSSxzz����u�8��W�b�ƍظq#z��̜9}��}b��Wmj&���_�g�zxx ** ���ptt��������� ���d2���q��=�����pqq�T*E�n�#�`ʔ)033���"##�*m���Ά��+�R)���Q\\�V666 �^^^HJJ�ӷ#F`ѢE?~<�v�ɓ'���BL�p�X����N�Zg�oc��K�.a�С�СC�����ѳgO����������:>M�ڼ��h���ޏ���י� ,@xx��}����ȑ#ѧO̚5K����x饗`nn�Ν;��� w�ܩӏ�Çc�ʕZ�[[�~��/++ ����Ǖ+W�d���˗�����/0e����"44G����|||���"���a�ʕذarss������0����ҥKx�����������t�R�?""""""��4�rZמ��Z]� ��iS���+&&k֬��+W���kkk@@@��ʐ�����|�T*DEE����{���`ӦM�s�Μ9;;;1��W_E�ΝQ\\�_����زe���O�>�F�Byy9�~�m����� �R������[FFRSSq��e 66VL�9s&F����2�^��}��ZYM��o��_�5rssq����;v숄����8{�,�}�v��Ӕ���h���5z?ھ������رc���ĭ[����ik׮������P\\��7B__�N/^�J�jR������X|}��R�Ķm����͛7 ��� kkk̙3)))�ɓ'c���(,,���1c� <��sj�I$���a������Ǐ?����PXXX���/V�Zggg :7n�իW[���������i��S�x�q���ѯ_?@�N�`aa���|���b�ƍ�ر#�R)��Ñ��(�۱c�����/���0i�$��۷�����˗�C����;w.<�U��/_����|�r������nnn�ꛡ�!���0|�p\�p�����~� o��& 0j�(�=Z�lc���ꫯ���vvvpww� ���K.���� ���Zŧ)]���m�_;��������̘1���C@@����4cccܺu J�R�411�SGYY�N�&�&���Jܹs�}� ==III��>��ݱu�V�T*:tAAA077ת�߉��h�T*��� ((�����_ �B�D‹/^�x��ŋ/^M���jGzzhZ9�i�6+o5��nl尦���� ���Z�B�B�6)OS�ڬ\nl�5�,��nٲ��������_�ŋ��k�lkK�PԹWPP�0a��;w�\ܿ_-���?_o�%%%666�=[[�:�� �_\\ �D�V���^�.�LMM��������A"���J�}�_�N�:�� ���G�tnj�\�B�]�v���Zŧ)]���m�_���Ӕ�ۘΝ;��e2�����+V���A����Ν;#44���ӥ�ѓ�i崦�ÚV�j�2hx�6+�Z�ו�J�J�!!!bYM�k�rY��lj9:?�,((^^^���Pxxx`ڴi�6�� �DR瞝�$ 233!�J�-gkk����z�,,, �Hp�� XYYT*,--�j�K�.��������R���IM�EEEb|���ptt�4�?Mnݺ___8p����H$X�xq��ˊ6���g+��s֦���6mޯ���ڠtyy9����ꩽ �J�B�.]�������O<�K���/���oS5�|��M|FFF055ŢE�p��I�5 VVV8t��9�#G�`ѢE�����3���/k5���G�ž}�������1mȐ!�1c�M��nݺ5�ODDDDD�l[�v-g�R�jVN>|�ޕ�5+�/\���;��ñp�B�[����Vgg�:+��Y �]9�5+��G���ׯ�?���&�Q�����Ν��ry���j�@�+����|&�T*�\.�\.��� d2�����q888`„ Gyy9�GK�SSS�,��Z3#�C�u�>G�ERR���`jj OOO����n��+�ѣ���1s�L��۷Y�'"""""�gөS��UN��imVkZ٪��覮������5u ���z��2�Z�ЊbccB@@@k6��y饗��>�H�a�Lk���B\\\���K���T*a���¨Q��D"P��v�*DDDgϞm�ȉ�����Y���+V�:j���|�\\\���_� Bnn�`bb"����'N�(̛7O(++A�\�"����驩��R�A �\.$$$��)))�T*���A���b!55U-���� �~�i�qΛ7Ox�����0`�лwo���P(--�*�Z�J-ω'SSS�������?^�5k�p��=!??_�޽�����鮮��Ν;��’%K� 5]׮]�ηS����/����s��;vL�o�Y���-���AXX�?�R� 6`̘1u��uV:Qkٷov�ލaÆ!88������š��NNN�J��2e ����� �3;v���1}�t����WFK�R������Z�7r�H( �۷۷o�B��ĉ��Ԭ vpp@Ϟ=�V������r�[�nպ�]�v������4h�����2�ZV��N�>��N�i���-z8T{��� ///TVVB*�b���pqq�uX��Y�[׵kWDDD ""Bס����ӧO7�.�ɰs��ӵ����@6�����`�ɓ'�ƌ���_ ����aϞ=ͪ_.�#%%����ne�h}�x�� .=���???]��3����s�t�6=���Q��g��:� ~�p&.=Qyyyظq#Ǝ�%K� ==� �:,"""""""�v���mDrr2z�꥓��r9lll �H���ét�?j}7n��'�|�ѣGC�P 22ǎ�s�_~�u�DDDDDDDDm�S \�v ����ݻw��add�JQQ{SRR���D�����ѣ������������ǭ[�p��\�z7n�ƍѣG���c�̙�۷��{ADDDDDDD������~~~صkW��⥗^���9:w� 777ܹsGL/--EPP,,, ���{���.\���+�R)<<<0u�T�Z� ����{����z����H���!,,L��G��E�a����ڵ+&O���� @VV �ϟ�+W�@�P@�P`���Z�����ñr��&??Mbcc�P(��兤��:�ŧM���*//�_|�)S�������8r� ��ヸ�8!..+W�Ć ������t�������.]����������ǥK�t�5""""""zF|��g������%.\X'����ڮlֵ�YY��e<3q׮] ����N������CCC���BOOӧOGTT֭[�9s&ƌ���t�>}���8p�X���YYY5j***��� GGGlڴ ������� ���A 6 ���F�>}�T*����+V ;;����q��E��ӧ%-�G3p\ozc�i�?j�^� ___:t���b��ɘ1c^~�e����[V"���� nnn�裏p��Q�۷ ����U�VaժU2df̘�iӦ�[�n��=""""""z��_�;v쀧�g�� �L�ve��=��j��n��L��266ƭ[��T*�"@~~>RSS�q�Ft��R����HLL�����~Ûo� �5 �G�V��{��022���#z��{{{H$���i�����? add��Ç�… -ҿ���ʚ5��qi�_���Grr2>��3@zz:���p��}���c�֭P�T8t������+}}}���#::*� ))) ���1~��DFFB�P@"���ŋ/^�x��5f̘'�g�!>>>P(�~�:�ϟ�B��K���V&k�i�&�2e ���`ee���Hq��������'������,��ole�6�N-O烸[�l���%,--���_c�����˗/kUNJ+0h� xyy�s�� Ń<��� &@��/�;w�8{�������b}�?g����@�WUU������j�UVVj���_[���#"""""""����$(�Jt���R�ĦM�����@(�JL�>�Y���� �����χJ�BTT���_}�Ut��������_����-[����5k��ʕ+���ǵ4�?s�L�1eeeX�z5���;�tm�������T\�|���պ�4:�N!((^^^���Pxxx`ڴi��077�'�|�|�2����� / vvv�H$��̄T*�S�K�.EEE����h�WGGG�� ���~mI$���������-� ����M|���ھ:���w���ɓ'1j�(XYY�СC8r��9�E����C�v �UWW�m�PRR"�q;"""jMǏ�,\""j15+�/\���;��ñp�B��7r��m����ܹs�С�r9�Ν��b���jy���ѯ_?@�N����fezJJJ�+ӵQ��@�W�S��|&�T*�\.�\.��� d2���f֫&��իW�ߌ�:0a������������T���# � 6��Ç8}�4��ӵ�_S�ڲ����������_m��o�Ѥvk������G�mrYm�k���t�� Daa!v�ލɓ'�(C IDATRRR0g�X[[������{��ZYAp�� ,Y�7n�n݊�������.^���g�"""��DDDDDDԠ#F�[���{�G���톔��@� ����(..��W�P49>mV�k�qV�S��|&nms�����?��r AYYLLL0{�l�����qqqX�l���PQQ�\�e˖��A&����'Nl�lTM�k���>>>pvv��� �z�-���jտ999(,,lR�5:v�?���ި��Ě5k9r$T*JJJ�����������:���G헹�9������$&&">>G�ERR���`jj OOO����n��A�ѣ���1s�L���W��!"""""���ԩS:m���͏�r����7n�W��T*XZZ6CS<��tҍ65���)��DDD ""��t�L��;w6�޻wo�9sF�>u�Tt����� ooo��_~)�s�����?(���u����aϞ=���Կeee�4f���u���ɓ'-�M|�����?>�ϟ�7n`���ؿ?N�8���x��Njy�v� ̘1C� �a�DDDDDDD�W{e� /� ޯ�r��?���9rrrp��EL�4Ic�fff7n6l؀;v��͛�����%KZ$��+�׭[�3g� ==nnn-R?��65��+��� :w��ݻ�… 8v�֮]�밈�-���!,, yyyؿ?���+ 4���psskֿ�M+���W6?���]�v!$$���066��ٳ�hѢ�_��tm�O������; �9;;���^������Bee%�R)6o� �Ǯ��ͺ�v69Qk�q�F��5�L����fM+�5���HIIi4OZZZ�i��ole�6�YyN-�]�???���=�v�����������Lo_�� .�Ӥ5V�k•��K��8q�w�^�ݻ�5�&�T�LDDDDDDDM�+�5����EO�Q�Zu��� Ax���ή��X��e""""""""z�8����������� � .Q֪�ikݺu��H����p���������ڨ+V�:�6���DDDDDDDDԦ������M�� �޽{�w�^]4MDDDDDDDDm�ڵkuQ�ƒ͈���������ڰV�������l�����������]�L\"""""""""�6���DDDDDDDDDDmq�����������0��a�%"""""""""j�8�KDDDDDDDDDԆq����������� � .Q�A\"""""""""�6���DDDDDDDDDDmq�����������0��a�%"""""""""j�8�KDDDDDDDDDԆ�:""""���޽{��0H Ǐ�D"�uԈ�]���ի�����Uq&.Qƙ�DDDDD�$ ������]���C�n�t�Np&.Q�A\"""""""""�6���DDDDDDDDDDm��m�VK 9�<����0���������)™�DDDDDDDDDDmq� �xAξ%"""j㒓�ѫW�Ǫ#88-�����add��0����ę�DDDDD�b>...�J��֭bbbĴ��L�2fff���Bdd$�����#F`ѢE?~<�v�ɓ'�������B�����ʕ+P(P(ؾ}�X>::={����)lll���*1=66 �^^^HJJ�ӧ�����R���2� ����w�Z������'������,l۶ �������}ޚ҉�����A\"""""zl���X�t)��g�aڴi�֭�V���=BBB�i�&ܹsgΜ����X��W_E�ΝQ\\�_����زe�Z�HMM��˗QPP���X@�>}�T*�m�68::B�TB�T"$$D,۱cG$$$��?��ٳg����6��R��ӧ7����������!77���P�T����SGLL ֬Y�+W� ##��֘:u*���lڴ ���bM�DDD�t� .5ۉ'���W^y�����O?a�ܹ022Ҙ;v�@PP^|�E���&M��}�6��Ұ|�rt��r�s�������������!���0|�p\�pA�>�g��rxyy!33�Iϡ����󑚚��7�cǎ�J�Gbbb�u��ѩS'XXX���o��6.]���[�";;}�����nݺ�1���������������͛�r� ƍ���޾I�����^o�%%%666�=[[�:�MMMM��������Ժ�~�-֮]���\������Z�o������ ���[AԦP(m�w��4h~��Wdff����MJ'""���3q�b+V��D"i�Z�`��C̘1C����˺��������_Ƶk����͛7C.�#,, gϞ�*x4(���[o��H$�q�xO�R��ҲIqJ$�P���[������H���C�T"((�޼�agg�D���Lq+���|�����_=x�III���E�=���?cӦM��Ά����t"""z:p���������1fΜ���4�:u 2� ��򊸥����s�b�����<�}{��a���ƍ� 6�����v�bbb���ݤ���p��u����ݯ��@ee%(�wxYs988`„ Gyy9 ''���Z����O�a����K�z�*bbb0z�h�Ӊ�������AAA�9s�ڽ�]��(""""zZ) �^�QQQx��V�&MBtt4���p��U���c���b�]�v!$$���066��ٳ�hѢ&���� 8;;���o��BCCaoo������������d;v�Zّ#GB�R���zzzHHH@Ϟ=ŁfM���l�2899���r�˖-Ӫ��ŋ���7;������}F���C<�>3f���}����.΄�:u*6oތ.]���Ϝ9��k�����u�d2F���+Wbذajugffbݺu�駟PXXccc����֭��rYYBBB�������c„ ضm�Z�DDDD�����AO��M D```�y�r9RRR��ԩSjߣ���moϞ=�����@DDD���}�Z��t�G?Z;v���/�������w�Ż�+����O9�KDDD� :}�4֬Y�'N���&&&�ڵ+\\\0g�L�2E�!�ԯ������ 0u�T :T���qO\�#!!�f͂��9�R)f̘���FFFOOO�8q����ҥ ХKx{{#==���b]'N�ٳg1k�,��r���Æ �DDDDϠ'N`�ر�ꫯP\\���jܹsYYYؿ�8x�,���_�z�j�^�gϞ�u8DDD�p&�Sl�ڵX�vm��YXX`Ϟ=��6l����ť�����_�~BB�V�Q��~�z�ŋ����T���������%""""�Vs���&�X����9r$�̙�={�`�ƍuʜ;wӧO���-���`cc���@\�t�N�]�v������0`���L�:��D<����O�w��q���������۷o���:t��Ç�̙3͎mƌb{?��#�O��N�:���>>>�y�&`Ĉ �-\�P,��3.��������DDDDD�j�r9233QRRwwwx{{c�С:t(�����OII���7|���`��D�駟PUU���LƎ�������[�lAVVV�1�^�������=�.] ��v��.���0m�4���O���hRl�����oB*�B*�b���(((@uu5 �P(��P�����A\"""""jU ��_~ A������QQQ(//Gnn.�=� &���H,�R��-j���Byy9����{jyĭY���sω��w�=�G k��l�Д�,,,�����СC���������)Q��9� x4c�w��X�d fΜ)���?VVV⽀�q[��^�����^V#//�јjkk���??|��NzSb����� єNDDD��Q��7o�>���=Μ9�={�����b��={ $�{��A����y����駟��������p��Q�߿��6oތ���-ޏ���T�ggeeq�.q;���!���t�R�'��������o�՛���%�=e``�m۶������Ë/��.]�n޼ x�Wļk֬�ܹs���CL�>���666��f-�7|Sbk��ÇC"�@|�����O�o߆T*m������}�L\"""""j56l@dd$F� �����À����c߾}j�_z�%�>}3f̀��JKK���O�>V����k�!&&NNN022B������,�y+�H ��Z�/M��)���C�PԻ�={8�1������߿?222УG]�BDDDԦ 6 Æ kR�A�!..Nc��7o���/^g�~��W8y�$���Mܪ !!�Nycc�z��_�`,X�X����#>>��������P���j������ �%""""���իW1|�p����K�.(//Gii)��� �7o�q�DDDD�õ9DDDDD�T�����/��N�:�ڵk�{�.����`�����2d��C$"""j��%""""��������uQ��L�v$99�z�j4Opp0"""Z)""""""""""z�8�)###]�ADDDDDDDDD-�3q[���v��Uo��������� GGG888 ++K-���ñr�J�{YYYP(�?>�\��B�B��۷�ybcc�P(��兤�$������ݻ7���ЫW/DFF��� aaab���R���2� ����w�^�>��6����� /@*���� ~~~j'�j�>ѳ����,&&k֬��+W���kkk��/B�R���ӧ�J%�m�GGG(�J(�J����y�T*1}��zۭ��DVV���PQQ���ll۶ ���������!77���P�T����SO}�ic޼yx���QZZ�-[� 55U-]������������5�N������_�~�N�:�I/++{"�v��FFFpttD�^�`oo�D���2ܽ{����p�:v��… �nݺǎ������������Ĕ)S����|��'"""j�N�8ػw/��ݫ�h�ڷ��]�@DD��8���lق��~���Ç����:u NNNb^�B�����000����x���J�#h„ b���-���� ��:���Fee%<������������3ⶀ�� xyyBCC���iӦlll��J$�f�#�H B��� ����D"Aff&�Ri���H$(,,�������;w�'�>������_����p�ڥ��Bee%~��w:t�Y�=k8����̙�aÆ5�|NN �Msuu������!�˱u�V1m�ȑP(طo�o��B��'j�n\\�������T�)S� //�I�5����7._� �L�� b����j����������Y��Z���g�iiii�7vp������So�ɓ',��� ooo��_~)޿s��Y&�a�Ν�_c �;&~ǽ{���>ѳ�3q�����ڨ�C���#|s}��g������%.\X'=88X<��6�\��:ס)f͚�U�V5�Lrr2z����6�)���ik������^��KDDDD��[�~=v���઱��@չ��5dgg�w��O:�6���C���#""z|��K:���#::Z�a� ~~~صkW�i���pvv���p���:y���+Wֹ����B��ׯc���P(X�t�� �B///$%%59���R���2� ���j[fi��� WWWH�R������X-=::={����)lll���*@VV �ϟ�+W�@�P@�P`���ZŧM�ƞOrr2z�� '''��� ���033CXXX��OC��O���˗7�=-8�KDDDDԆ9rǎõkנT*�z��:y.^��JU�~RR�J%�t�@�TbӦMbz`` �J%�O�ެ�PVV���\���C�R!**J��ӧOǨQ�P^^���~��;vDBB���O�={���� a�>}�T*�m�68::B�TB�T"$$D���)���TVV"++ fff���@vv6�mۆ���&=�����z�EEEM~FDDDO n�@DDDDԆ͛7����� ���'֭[������>���|����… �ر#�G��.\��N|��|�2Ο?�ÇC__���pssS� ~������Bfff�ħ��ݻ�������ի���!�HPVV��w�j�~s�߳���͛�#G��H�DDD� q�����t`˖-x����o���Ç�ßN�:'''p��� 7o�l�`�QPP�0a�x�f�6���!�H`cc#޳��W�����b�ڵ��ͅ��JKK����*�iC__```�^UU�o�Y|~�<��///ݺukѶ���� �K-*00>>>������͓J������011�L&���J��;w�����>��s���֩k���x�7�H����044�ѣG��;88`„ Gyy9 ''���Z����� �&c IDAT���J�Z������!�Hp�ƍz_�������QRRҬ�*����|�����痗�עm�'�ma��,��ၨ�(xzz������R���ɴ�N�1b�Z� ,@xx���?�ɵ�N6.((��)S`ff+++DFF�-�1b-Z���ǣk׮�+V��u(DD-�{�2���ЩS�:���L��ɳ����\���۷����s�ΡC����;w.<�ŋ��fhh�ь� .ԩ�9'�޾}?��~��wb����2e���'�5q[��' �B�hr�ڜ<������k5)))� j���������T��������m�������b��q�.ѳ�w�i0���Ym5���-@ۓ����-M'�����ڠgyy9�����U_��{r�&�a 5�)�T*XZZ6���i���Pl����;w��'+Q]� �Q�p�H�Rq�����1x�`���j��k�<����]�`�=zh<����#""�}|����={�ԛv���F���r���4�~��)�������k��f�����;&~ǽ{���2� ;w�lV�DDDDD����"��t�3��� .Q5t�P�����@�w�f͂B��{ァu���d�X�����jS������ԩ6n�ج6Z �_��ڵ+��߯�0���1cp��q]�A�s�%""""�gZ`` ���tF���GDD����:"]���ܲ���������a׮]��������fff�ݻw��>|8V�\YoyDEE������ppp@VV���AAA����L&Cpp�ږSH�Rt�� 111Z�+;;����J�pwwGqq�Zztt4z�� SSS��� ""UUU���,( ̟?W�\�B��B�������ůM���X( xyy!))I-���d���NNN�ի"##aff���0�گ�������q�����ڴ#G��رc�v��J%V�^]'�ŋ�R��#&&k֬��+W���kkk@@@��ʐ�����|�T*DEE����{�����yTǾ��� ( �*�bP\w5�� �Aыc��Q��h��D�I��Q#��J�@�Q�}I�JEYAe����� 0l��sΜ��U]�릻������O?���/_�����֭�ܱ{xx���X�|y�9444�W�^�ƍ8x� �Hطo_���`۶m033CJJ RRR����m_W��l��퍔�xxxȌ������������kܿ۶mCyy�\ǯJ}:~u?B!��p �B!��js���]�͛�o��k׮��S�����t��������X$&&BCC@�������߱c|||0n�8���.�;)) �o��ɓ'������J���ܲH$���s���V�'���޽;���aff�޽{���<���(**����L�KǏB!�Q#.!�B! �i�&,_�PXX��'O"00p������\��5;;��u����X���S����uU=$��6lX������x<���s� ��?~k֬Arr2�|>�?www�ʗ'��RRR��|��|n]YYY��OǏB!�Q#�;�ԙ�E"������30��\�͡�3���̹�Bi�|||��� �;w.Ǝ��>���={�-K$���6�.�Wc]�n����p��]�B�� 99������c(((���&��1P������� ��)S���`��~��F�>�]�7cL����!u��CBH{Cc�8w�\����x{{���U�aB!�@(B$A$�S�N�����W�Z�_~��/^���͛���V����c�ҥ �����ǏǢE�PPPx��1bcc�<���سgΜ9����ɓ'�*��� ���Chh( %%qqq\��ׯQZZ�����!++���X@e��'O� 77���׵}S�[?и�?BZ=B�j�mf-9�p]ꚙV���kf������3L�4 ����ҥ lmm���K�͌ �=�r]3���� �ϟ�1c����NNNR����ǎ�ɓ'#88���I!�"ˬY�`ee%3��?���= ajj� �P��Ǐ�z��+,, ����ѣ�B!&N����4.���[�lA@@�B!�����t�ˏ����={`ee??? 2�K344����9s���ȑ#k�amm WWW���C$a�֭r�_��Ç���)"""�}�v���b„ r�<������#�VRR���(899��Ç ��~��A(����v��Ҟ>}��'B]]������ϥ�Ө��L��������|(��smϧ۶m�ܹsq��5�dz�tBH;�H�`��iӦ�_~����!C��^�z���,���φξ���455٬Y�d�}�޽Z� e�o�f�1����LMM٦M����ёM�2����B6q����U�<��eѢE��ٙ�y󆕗���/���"�<�f�z����1c�0�H���ϟ��������Cy��k{>}�� [�r%�ѣ���`?��#���涫/�=���gX||��C!D��'�;T5����&�͛�C��ȓ��_kO޺��bn���f������iׯ_ �B,Z�lp���cǎ���CJJ x<lmmѩS������]�vmж����6lT���믿�l�2��|�����޾��B!�BHkv��%X[[cڴi�ڵ+�]��s��������r�ٱc|||0n�8��r8::���������/����H__��ǵ=��C�����VC��e=�v�� ˗/�Ç�u�Vܿ�>}:����M'��_4�Y3x�3 �F��ik��5� ���� ��ΐH$pww�ƍ��5���Ըe%%%�����@���I��˄B!���_]k���9�b� ��,������#�= ���a��<}�Æ �YGnn.cR8 ''G*_m�g����>��ߐ����O���A���?��ݻwQ\\ܠtBH�B����]�,\5�0cLj�ayg������L+��栩�� 6�������Q�FI}��gf�� ����Տٳg�`ff��uB!��u5�Bڦ�S�b„ 8|�0BBB���www���`�Сr�100@rr��:�v��M�W�|��� mm��Z���Ǎ%��sU�o+))�����믿����:u*~��'�מ��B�/N����� �f�䟙�������卿.'O�Djj*��~㩢�"���fƭ��� �u�֡��W�^�ŋ�i �B!��.t��^^^8}�4�\�---L�6Mj8������bϞ=8s� ��޷'O����c���X�n�������]�v��ťAq��|(��qc���\��7bݺu�4iRSS�k�.���� !�5�6���YXCC?��\\\  �����L[W��� [[���_�;w�`Ĉ���������WWW�� пܹs�o���'�B�������~�����c��߿����� Ut8��Iiii011���1�+��X!�aF�� . >>�z%�v�z�"��7orc:%&&">>��i�B!�� :���kr9~~~�ĻM1c� 7���֔����F�޽�9"B!���E�"���d8;;���B�!!!�ׯ���"�B����7���F�y���B!�z�"��ӧ�ɓ'�H$x��1fϞ��!���>}:v��-3��ŋ077���:�b1���j�6l����X SSS8;;˜�������ǘ1c`ll '''���߿kkk�B888 ''Gj��ϟ���]�v���������@aa!z��_���?m�4����}�����LMM����ѣG055���)�o���8!�BZ5�B!�Ҋ�={������@JJ V�\Y#σ���Yc���7RRR���Qk�w��All,������S�1{=<<`gg���,_��O���V,#??���HOOGff&V�X�r���H,^�IIIزe |H�B!�Y͙3zzz�y���o��ڵk�����7�|www�=bIII�}�6N�< %%%888��֖�.==���HLL���`ѢE�7oߠA��r�J���@"� ..�:u�CS�o��B!��%��B!�شi��������G�b������$._U.���";;�Y�PSS㖕��PZZ ����ǃ��>�nhh�-?}�0~�xn(___K�?s�L333��׏C6%%qqq\���Ə�E�q ��?Fll,�g�֭�y�&�oߎ��0̟?_�p-��tuu������*�~��())AZZ���Í%M�&""����_���?x��%JKK����_~�����Q����ЧO|��������� ���!77/^ĪU��y�fE�Ii&ԈK!�B��͚5 VVV2�>��C���������X�|y�<�?��[e���055EDD�o�SSSL�0A�"""�g�XYY���C� �J Cyy9z���P��'"-- p��-|�� ��������>��_��+��4u�������077�H$�֭[i����㯿���Ç��򙙙8|���#���ס<�.]��G���ѣ�֭[ D�_W�\��3�8�N���G��ڵk8x� fϞ ee���5�r� �b1^�z7n8�k׮��ٳ �رcѡC��>�9! �H�`t�Hu��� �}���C!�B�$�X����PE��"BCC&� !mVjj*����^�ҥK���U�Vq���+W���毿�b���L__� �����b1{��A���ܹ�f̘�D"L]]���ذ���sy�]����ܘ��.���LGG�����k׮I������t��y6m�4����z����ٱc�ٳ'SQQa���gG�e�&M�KOO�Q�Çk�;s� swwg���LUU����0�D"�/��"W]�G���͚5K��!??_�~^�~����1---�qDDD0[[[�����|>SVVf&&&��ח�_V���_C���焬�>f�n�̙3e�{���rj;�=�F�ŕU��P}}aaa�zO�<�\\\���:SWWg^^^5������_g>B�w���!�B!�B��P(]�v�cbb��ₒ�())AOOϞ=����q��1\�p��g�ԩSpvv��$���W�\��۷1r�H9rӦMCYY�';;��ѣGq��!L�2�F|���\�w�������syn߾ ���4x��������� ����T���[o]���8�<�~Ŋ2���Ԕ����Mj|��v�.]� �D"���!55�v�™3g��?�@UU���א� 9'�VXX�s��q�W�\)3����\/�\h�y���j��m��� ��ԩ$ ���p��=\�z�]��&D4�!�B!��H/_�DVV�\��M�' ��� (++���?JJJ`hh���$�����AII Dqq1<�:H��MYYgϞ�D"��}�PVVƍ+������|��� ++������ 999�����[8v�^�~���2��?�����˗2�JOOGyy9�ʆ��ݻ7(UUU\�r�ϟ�z��*X��� 99ϟ?��HMMšC�� =��T?>R�g�رR� �B�e�:{^�3dC�I�&��ӧx��)���T��'�$�����MАo�!�B!��֮]��k�r�{��;vp w�����O��֭[:t�T��}�>��C���nݺ�D����X,P9���?�����7�X,[� B�B���ӧOQ^^�gϞ!??���9r�H��6mڄ���Au��テ��5���111\���������DZs�Ndff���D�!Y���ퟩ���y����>'���nNo� M9�b�…PRR|�駈���9s�g�n��P#.!�B!��Lrrr���s�}U#)P9�YUCYueee(((��۫W/��gggs�"�H*���Pf�U\#�*&&&Ri��� nĭސY�g�eeeRuImgdd$Ոkdd%%%���s�e��o߾�r�N���`����Ǐ�u��&��k���!�D�a9�T?>/^�@JJ W_U�u�=��bY�>�r^UWQQQg��������!D6N�c����WmcB!�B�O�V�Bqq1BCC������sxzz")) ������ŵ>Kt��U*om ���T�ڕ��z�*�@�}�F���<�����Z��6u�Z�z]oǝ��&�^]]�F����6�kAA���U==e�t�� ���� ���`���~�5���jlކ���}|V�Zb�, IDAT�- t�ر���>z^U?���o~�o��Ǐs�����r��"5�B!�"���4�_�#G��… q��E0�!�PVV�X,����o޼�ҥK� �V8t�N�>�m'�H�q�F|��g*{GV���z�*�/_���"66�O��*�?�@dd$���p���={Э[7 8�޸����5ʝ={�k8�z�*n޼����v]������8DFF�ŋ ��{�j�_�j7���={����Ǐ����8|�0fϞ��3g68��Ճ ���1 ""�1��( 9'jS���ڵ ...8r�n޼�'N��˗��I��z�ܓ'Orq����Yϊ+����G��o��֏;�A��Q#.!�B!����† `ooSSS|��爏�����;� �޽[a��D"�����;��������#::�{�nԶ�� �&�:t��_�>��m۶A �͛77ntuu��� === ==@e��;vp?�_�jttt���'''ܿ|>[�l��GEE<<<���wwwTTTH�ׇ��c���*�8p ��� {{{�!���Ƿ�~ \ܚ��X�d ׸ �����-v����*�����ɓ1l�0���aϞ=())ip666����ܹ�'O����\=q�KCΉڼ}|~��7L�:C�ŤI��^��{��SC�+OOOn�3f@[[s�̑�B���L���=z���������\qҞQ#.!�B!����b۶m=z4D"��VUU������o�w�СCann���`$$$(zڍ�� �;w��|���puum��H�׵kW�.��?�L�4 W�^���'�u��ϟ�իW�۷/����z]N�07n���3 ���󡦦+++n��)S��ҥKpss����|>ttt��₋/bʔ)r�����۷��� `�a�֭=zt3���׿��]�v�G�PVVF����=z�l��j`*�ݻw�" }�􁪪*�w���_\tChjj"66666PRR��˗ѧOlٲ���S 9'j#����|�������~�m��'5会8q"BBB �  �p�� 6��:���0c� hjjB(����N������q�n1B!�BL,3,44T!����={�0'''&����0WWW�^�z%�MEE�x�" `�6���[�z5{��c����P����f�;//�͜9�u�҅u�ܙ͙3��~��K0`���b666�O�>��ۛq�O�|8+,,��VVV,((�Q��޽{��ǚ}��1& ْ%Kj��_BB311a:::���3fbb¶m�֨8Iӥ��2��ظM�ўI$v��5VQQ�����ߘ������i)��LJ6x{{{{���Ƿ@t����B!��KEEE������0k�,�������g�<{� ����'TUU����x���EHH�����`�ܹ�ڵ+ sss :��YЛB,#??���HOOGff&V�X!�'-- ���{�.�����w�qi�g�F�.]����?��ĦM���������駟���K\�~�3�����q��Q$''#11���\ښ5k���!�H���������i�d���T���HII���������۷/RRR�m�6���!%%)))���o�8 i/RSS1l�0����{���ҥ �N����r���#$$D�!BH�E���B!�������{'/555xyy����(..����n݊��L�8q>>>�ؖ�QRR����lق��L������;v�͛7��~���6l@VVV��Uzz:bcc�~�zhhh@(bѢE8x�T>OOO��|t��b�������B�>}_|�TTT ����C�q��ر>>>7n��Y��ʟ={6 Э[7888 11�K�ر#��򐒒�5z�/1??_!c��!�yt�� S�NE�Ν������"����|� ���o 2D�!BH��_�v��c �(����1h� E�A!��K666�z�*��I��������ӧ*��W)//���K�.ܲ��$ �ʱcR  ''G����7�ܹ3�,PZZʽ �W_}gggH$���c�ƍ�f���!�nݺq_$��#<<�����6���! ���A���B*44T�g��BQQ�9���H�8qgϞ�ٳg1�|�;����:u�\�q������DEE!77�K2dz�����cܸq���ʕ+���[�n��x�{�.�Ba���S��� �0�xPO|B!홪�*<==��鉂����o��ӧ������`�ĉpww����Ը��1\�|8p��Tc��������={b���ܐ �����ǏǢE���?@SS�?ƃ��<عs'fΜ eeelݺ...uuu�=�֭Î;����]�va�…ܶ����裏���1c� 777n��� ���ɓ�ݻ7LLL���PQQ��o���7n\�>�@  ..�F�jж�ħ���'O� 77]�vmp|�B!́k�]�f�"� �(��/�y�fE�A!�(���&|||�����\kkk�������:u�W_}��s�6*VB!����`�'B��C�~�)6oތM�6a޼y��Biu������H\�t��gfccc�����ӳ� y���ooo���w:l���OO�wV'!-%-- &&&066���9%&&�w����>��E� �4�O?�8v�&M���hQ~�Y!�Bi����������!22G���A����[[���Ji��?�-W5BZ���򆐶�q !�B����1�N����kM377o���!�:v��-��G ��R��� �D���Ϩ�B!��V��F\yݺu��Ҏt��@�6��� ��#F��� `bb��PQ���B!�B!�BH��� ������j}}��'�����Ŕ��$�vUc�U��ݻׂQB!�B!�4��� (: B� 5��=z�˗/K����_ !�B�⥥�a���9r$.\��/�1��!���c�|�2-Z�Hmmm899a�޽ԠK�>>����z(:�F۷o_�u����A����MJ'�Bi ����a���������9���k��y�CU�޽[�a�Z"������xu����k�y����ݻw��%�yϵ�֔s�)Z���V��^��b�ҥ�޽;lmm���L���!66�f͂��\]]�W�^),VB�q�IϞ=���(��۷/�^}H�S�N�����ЀX,Fvv�Tyׯ_ǴiӠ���@]]]�������5�{�.fΜ ###(++CCCÇG\\\��������G�.]���WW�u@hh(�S�N�������(��~���a�����������J���������!���SSS̙3\=�����y�!�_�~��x���AIII�$B!�9���b۶m=z4D"��VUU������o�w�СCann���`$$$(zH+����s��՛������-yo�{��4E�˭e�[���^�����˗�W�^2d���{������K�,���ב���m۶���eee������tuu���Ç�͛7��B��0�pK�.eU���LJ���H������\^UUU����tuu�ud��Ō1�~��7����/>�ώ9•{��I���"3�ƍk�mddT#�ԩS������\���+��������I�^����ܫW/�җ,Y�0 fjj�444�<&&&�իW�1���c���?W��۷���}�Ys�iۍy��1lӦM��BQ���|�g�������BEE�������0�sI��� v��E� �>_YXX�իW�0� e�X,nָ����̙3Y�.]X�Νٜ9s��ׯ��0///fcc����ü��YQQ�������ĄB!���a������L����0faa���Ԙ��1۹s'�fmm͖-[Ɔ ”������T��7of���LUU����%K����R��njÖ/_�&O��>��&�XBB�\�u���=&XNNW�͛7���*+((`�1����&N��444���>|8+,,�q����XPP���j�ݻW��־}����  �lɒ%5��/!!����0��󙉉 311a۶mkT�mAjj*�����\�] �������7=z4322jԵT׹Vߵ~��}6l�0����ƌ�&M�ľ��K.��k��s���[z��^Զ�E��� ���g>d�W�f���R�w�������م XEE��r233ن ���׾�ijj2v��qVRR�lq�����L��݋�{�J�������c���&MBXX@,#22�n�����1c� |��'(++���"##1y�d;v }������'���� <s��Aqq1�믿F@@TTTp��y���Ԩ[UUW�\Aqq1���QPP�cǎ�����ԩ��O��1cƠs�����GTT~��g�e+++��ٳ���@jj�\���Θ3g����r�� �[����8t�f̘sss899�ĉ �?�uuu���s������G"�:u�^�x��0! �h�"��cB�|���p��DFF�ĉ�g*�@'''xzzb�ԩ��Ԕ�=�ǃ��-lmm��?"..���BBB����!C��W�^-�b������С<<<�b� �]��˓�����xt���'O�w�}�o��0{�l���"''���9r$����`����:t�ƍ�D"���)���������}.���@TT,--����#F��� ��͓*c׮]8q�,--������r���*�w�����'���K/zы^�����֭[�zK5FII ���a>>>�cǎRu��谐��������iii KLL�֝:u����q� ��:�1�~��Wfii�c�ŋ��㱿���K_�j����������O?�5kkk��O?q�}}}Y```��j�7f��x��Z��/���l��}N.++c����\zPP���g��߯��VS����ʜ9sd�~�'�Çs�r{ߵ垸o{�\���f?��3���ϯ��Rm�Z}���G����ť;88H����Z�u.�S~K�ӽ��݋���fggW�����;v�X���}��!�?��?�4�U������'n3Y�j����ʫ��-s��[�*"�Hj;CCCnY"�HM2&o����U�����2@ll,rrr�FZZ`�����_T~k8}��eW�s[���cpvv����kݦ�h�ƍ����u�V 2�=@�p�j���4h��� �ȩz;BH�gcc��W�h�gʧO��T���{�@�.]�e---H$�c�2Ơ��ϥp���6lX�qt�ܙ[(--��?~k֬Arr2�|>�?ww�e����YGm�������>� IIIx��1F�ͥ᫯����3$ ��ݱq�F(++�ϻ���ko{��] jjjܲ��R��%Y��% x<�������@��Ey�Zn��=݋dST|ضm���έ���͛xxx`�С�*?//Dxx8Ο?/�&�`ll }}�z{�*ڝ;w���5�*��Ǐ�F���dn���6tuu���'�z�����T#��l�����)��p��eXZZ�����<���C{]�N�q�׀kee���(�ȑ#�:u��2.\��?��n��f�TWW���G�u�������S$B��Y�F�!�^x{8��g���ٳ�?>Ǝ[�p Օ��K ����˥U ���~�7R�^�r�Q�w�� <w�ޅP(�5_ff�Բ���ʟ��x�l�777�����aZ���W��v�؁�S�����V�ªU���7n�رc�އ��(��Bww������;�s�}��5�禍� ������s�ܹO� 555L�2���G^^8 5�kϞ=���///XXX�����°x�b����_��H$��ŋ��888���YYY�:u*���K.m���������6:v숙3gb���\���#�lق�����BSS+W��+6CCC|���ppp���!���0r������?v�X����_�~�ѣ�Tڝ;w�����|t�� 3g΄��k�2?~�gϞ5*N ���pqqAii)���[�7���Ñ�����\t��QQQ�ի�P.O|���puu���9:uꄯ�� s��mT��e4�Z�w��ε�����0���@KK ��֘0a�To���������o���{Q���^���0|�p >?�������"!!˗/����aii���l�իW�:����6m�ԯOi ���H�ob3;;;.o� ��\��f̘�455�� � IDAT�P(d���L"�H�}��5����ttt��g:::��Ņ]�z�Fw��a3f�`"����|���Ƭ��عs�j����Cn�iӦI�wpp��;v�F=�����А���ѣZ˖�߲ү^��lll���2�ҥ �5k���_�md ������|> �� �&6۴i��C!�BZ���L�����ǫ�y��ؘ�7n�YNhh(��b�;��ҀXXX�;��5�����;��ib��nҤI��l��Vt/j���������WZZ�bbb��ٳ���&�����1[[[ž>}���~wn߾M�#���m�5k�4j\®]�r������ ���~���Y^xx8���k�����z���YO�j��[[��6 �/_��~ƌ�n����M�����3!�BHS���# HKKCdd$�9�A������� [��[�ΝÝ;w����Pi�n޼�.]��{��HLLD|||������t/jy|>���ܯHbcc��� WWW���(:ӧOo��vt/"�4����c ���������1���\�t ���WtH�B!�B!��8j�%�B!�B!� (: B� 5�B!�"���4�_�#G��… q��E0�!�B�c �/_ƢE� ���� '''�ݻ�tI�G���B!��"++ 6l���=LMM���#>>�ƺ�7o*:T����F�޽R�H$���>x<^�����=!�"��E�1c���k�oʵ�666ؽ{�;�W^�ދ]��|/���?�t�Rt����� Aff&����Y�fAOO���ǫW�2! �Ml6q�DE�AQ���@zz��#!�BZ���\}����� ee�w!�/��d��^���߷�_BB"""�p덌����OOOt���BXX������h���������prrBǎ�'�ȏы^�j�/OOOF!��g���lϞ=��ɉ ���� suueaaa�իWR�TTT��/���f`` ����‚�^��=x��1�Xhh(��bq�Ɲ���fΜɺt��:w���̙�^�~�c�ƍL]]�q�O�8� Yyyy��3Ƙ��5�����F�͌�����#W^BB311a:::���3fbb¶m��m����&N��444���>|8+,,��VVV,((�Q��޽{ �̴}��1& ْ%Kj���<�Gޭ��T���:ƌÖ/_�&O��>��&�XBBc��k�1���˜��SSSc���l�Ν\ړ'O��� �LGG����2��w�6lSSSc~�!�0a���/�m뻖�W0�������nj�&M�$U~}�gmm͖-[Ɔ ”��k��y�ffnn�TUU���[�d +--�;�������u/�{a����3,>>�=|���^��YZZJ�����g���g.\`2����d6l`vvv���q�jjj2v��qVRR�����ܾ}�`������0�'�ҥKAi_֮] ��JB!��)**‘#G�'N��� ���OOOL�:���2���x������-~��G���!""QQQHHH@pp0���1d���իE�A,C  99:t���V�X��k�bȐ!�֭�?��ӧ������:Ի}�;w�����`���� ������C߾}������h����5�[�f �|>$ �\�%%���?���055���/�c �l؈��Aaa!�;###���<��cWQRRBii��1aРApvvF�.]0w�\���Ƚ}Kk��֥��ju���5��s->}�|���2sss���b���999r՟���'�������ĩ�^!�H��񠧧ǥW_�޿*U��@�/&�ߋ�?�#F@$����w�q-�w/�-]�{e]Z���������m۶����G�0o�<,[� 7n�ht�yyyؾ};�Ν�͛7K��D"������ }�Q�Wk�䍼���g!��J���R�rB!m���)�={gϞ����1v��z�S����\j8���\.��ػ󰦎���@P$DD�Ҳ�l�,�h�`E��aS�P�*E�o�Vk7���ὊzE\�E�+HE���k�(""�PY�f������%d;� ��y���'Kuu5���q��Q�����ba��Ũ��WH�L�+�}����������1����o�>>>�HsI���/?~qqq8{�,�Y����)S�������B���dgg���Va�$&�H\� � �ԳgO����رc(//ǁ���HII��3���ooo����ŋB�S���L|��W044ĸq�{�nTUU��� ?��3���p�� L�} ���\]]E��@HH֭[ש�AAt���HNNFii)v�� >����F$%%�������������|�r|��G5j���QZZ sss|����{�.�޽�o�����wLL ޼y333hhh`ҤIx���>>>>����СCEn�fr�,��򂅅x<v��M�egg������2d|||���%�GAA����*����&6o� OOOhhhУ�`�ȑ011A\\��� |��r�'�~�(�>�'NDDDBBB���[[[��QQQ������� OOO,Z��q�qqq8p������Ç ���,1�߅ ��r�z�j|��B�Ee�Olܸ|>cƌApp0ƌ�86�������]D� ��ba�ȑؾ};JJJ������`����޽{���`aa[[[���CWW���HJJ��ׯ�����O��m��uC]���և�3Y�0===z���Q��bd�S�Na�������~��e�������6mBYY����sss<|��{�FLL V�\���, <�ޯ��VVV���G�>}�Z���k�…صkv��)�rk[- ���� �MYY������L���FFF�����h�ȑ#���?=ڍ �>>��/��:�e:�Yw���\RG�N�:QQQb�\\\�f�����������������+W�ږ��̛7�=�'߻w/�Ott4LLL���!r����1h� ���a���X�|9z��-4�XMM ��� .���� �|��N///��ɓ��pЧO899����"u?O�<�رc���'''L�:��ϧ�#""0`���� ���òe����(w9۷oǜ9sD��5 >>>R'�g�����Chh(&L���[� ������� ���r�EA��ׯBBBp��%aӦMpvv�&�� �Cw��Mz����ŋpuu�⨈� ���ĉ��~zz��[�����/_��_ �wU�6���Drr2lllP[[�7o��������Rh���%������ @@@���Ė��Ѐ���5 �����ͅ��)�n� eee���CEE���PRR���֬Y���� 6��f���***��ʂ���H9��gbΜ9��㏑���{��a��ј6m���������ؠ�����055�:��gϞ�… طo���egg���X�����8~�8�҂ � ͣn�-[��~}����,,,��1�M�Ϫl������@CC444�}�vX[[wuX�{LUU�}�YW�A աN\�@@�����%�^[[ۑ�%�裏УG���b���000��Bmm-^�x�3g����������b��t'������QTT 899�-�=�����ܹs���ߡ���!C�`ҤIB���#�����ၻw��U��۷���ccc�cl�w��b�jkk�U�Vu8� � B~�:���>�gU��S�b�ԩ]A�;M�w�Ν���4wH���ң ���`ffF��va���e�,���ͦ�566��ӧ� &���!�b� �^�����@ ��;УG��VUU�����Go���CCC�����ذa �f�QSS�@ w9��x���Nl^ZZZx��9^�~���!� � ������4O��t��.�� �t��s�ćJ�700���`�����/��<'Xk�W����R�bjE���`�X�{�.444����p�������1v�X��梭� ����r���h���eq���jx{{��ѣpww����ŋ� Lq8���u8^�z�*���D����AMM�t�AA�A������]7� ��E$>t"��t秺�:�\.x<^�26l\]]�i Z��������*hkk�+q 1a����b����p8(((@^^&N�HMM���all�^�zh�/E��%�ݻ7�|>�lق={� ''���������hhh��!C�b�PVV���$:6�lllPWW���2�����&�~������K()) u�666�����ٳg���%R����1x�`��"� �x_=y����8y�$� �@''� l �{QSS��� f"�k=zv72A���Ή;c� |����μ�����b���� ���c����9���������0`����2*7&&K�.���������n�����ܹsQ[[ uuuL�>^^^r�/;}�0}�tp�\�����͍N300�ƍ���a``.��1c��]���.��푞�???���'O �G]]VVVB��CSSvvvHKKÐ!CD�8��ܝ�AA�2���#>>�����d/^Dxx8��� ����Çwq�]Cڂ�:����F���K� 1((ZZZ �� ����r������8� ����.]RȚ@�.�ډ���.1---Mf��SRR¡C�Ħ]�rE�q������>|�����s�9������%��tU��.�fbb��/үCCC���K�˗eѢE8p��H'������fff������Ejj*6o���8 � � �%UUUHLLDll,222��z��www��ڢ��G���Ǐ���0���C ���VVV]\ �;())Ann. $u���2�AAR)uuD������� 7n�Px�[�l��9s�=�AAĻ�ٳg8x� &M�}}}#==l6^^^���AEEbbb�r�Jlڴ ����|�2BBB�����b�ڵ������5֮]��vj�555 ���6�\.�����7oބ����� )))��xhjj�y<�8::bѢE?~<������F痓�̛7�=��� LLL�w�^���� 0�z�B�~��l�2466 ����k֬���;LMMahh���F������E�=PUUE�u��-��� ����+&O� ��>}����IhpH {{{�\��gH���h������III"���c��AA�?H'�;LII .\������^�`֯_��| � � ��/^ 66������Ì3���pssÁP^^�cǎ���={�:��b��� ۷oGqq1Ο?���`hkk�޽{X�j,,,0b��>}�S������Z������X�f `����߿�P�111��󃒒���[dgg�̙3����ӧO ���DQQ���SSS���s�Υ����DBB���oܸq���b;###�n�:@|>��������^xWYY|>|>;v���s����xܼy7o��={���"��ʫ��gΜ���N���P,X��^�7 111�:u*^�|��Ǐ###��� ����yD�����O?��x���Z��u666�����.+�Y�f!** .ě7o+4�������QTT 899��G{�Y�(��A��#��AAхq��U�O?��U�V1:��ӧ� &��Z��m�����ף�����044��er<�<p eee4440�N�>� 6���l6555"����H�GR���}}}�d���磠�***7n��b� �^�����@ ��;�����=��ٓ'Op��Ѯ� �.]���[ ��AtK���B�k� B�^�x��'O">>���HOOGzz:-Z�����>�Ñ�כ7o������8$$$��:|�p 0G����+BBB�����jW�������ݻw���!vSSS <III8q��:� �%v����jx{{��ѣpww����ŋ���m���2ړ?�Á��'>��� ���p������رc���<��dֳ-&�Ij���]p � ��B:q � � �RϞ=��� ___<{� 'N�@ll,��Ґ��������bҤI������(\�rqqq8z��М�VVV���@ ���9�9��� 1a����b����p8(((@^^&N�H���{���͛ؼy���ˢ���?��UUUB�P��ף��C� ��BYY�����[��Ϝ9���G���� IDATee%nݺ%��������ؘq���*Rְa����*4�S���PQQAFFƎ+ױL���D����_|�EW�A�:::]At�nщ;m�4�����~ke?~+V�@nn��}�����������׻f�رX�j\]]�m���X�~=nܸ ����i����Blvvv����1j�(�|CBBЯ_?���x;!� ���p���@TUU!11������@RR���ЫW/���������8z�(?~L�ann�@???XYY���cbb�t�R������<K�.����K�,����ȴL�����^^^������:V�^���``�ƍ���000��Ř1c:Ze��]\\���kkk��� �eggc�ܹ������:�O�///�< P^^ޮ8555�y�fxzz����֭�Gc�9���������0`����2�OR����������� � Dt�N��* ��7%ũS���� ԁ X�`JJJ�i�&��>|��{�FLL \\\��������+W�����ϟ�>}�tj=� � Z���Ƽy�0o�<���!>>������Dll,bcc�}��� ����Ç��X�\.���/u��}�J��V��m�z����GIIIh��֖-[�e˖I�/--���L�WRR�������u<���/^�ŋ�l�r����OR�A��P��8u�TDEE�Msqq��5k���SSS"''Gh{{{�\�R����\888@CC|>���B鎎�B�Ο?����ˏ����ЫW/���˖-Ccc# ''&&&�7o=z���`�޽t����011������D���)&M��޽{CWW˗/Z����-����add777������1y�dp8���NNNx���H9��O�'O�`�ر��Ѐ���N���������G۷oǜ9sD��5 >>>000�x,�͆��BCC1a�lݺU(]__NNN����;.� � E�ׯBBBp��%aӦMpvv���3.\@vv6����:� � �v��H���H$''������"��������R�8�?�����Ȁ��+F����555������������X�`,--QTT$u:��� ((Hl�3g΄��.*++��b̘1022��������4P;;;DGG��mذl6PQQAVV���Eʑ�~�̙3�1���p��=�=ӦM�ӥ�SϞ=Å �o�>��k���NhDK WWW?~���� � ��fdd�x�"|����,,,�� ��١�������p� � ڭC���666 �G��ێ���q�����BYY|>NNN -��Z�ܽ{�]e�UWW���4ܾ}�����x�={6�;&ԉ+����yD��4555TWW����ߞ۶���p��9����PQQ��!C0i�$�}�>�o߆��:���厱�޽{�����-V�Z��� � � �E�:q f�_���!AA(��t ;w�tttp��),^��~���/�oۅ������B�~��m�n��FR��O����3x<LLL�ׯ_�������@Q�P����"SB�� ���B�X�C���������`�ǧ��Gok�PL�TUU���($溺:�yiii���� k� � � � �x�t����۸}�6\\\��?ү�v��X,� �۷/(�³g��m555B���l�N����*������X�|9���QTT���@P%rl�mLhkk��b�����VZZ �yp8�������~�:������ w,��k�zn��LۇI����իWagg'����jjjdq9� � � � �&҉�����uuup�\�5�-�� Æ �7�|#������ֈ��!##Ch \�|���_~a\f}}=0d���U��d�����?PUU%W�z��q��aӦMx��JJJ OOO�y��������7bWUUUd?q��$>>��-[�������;����t��#��� ���:�[455��˗tG�˗/EF�666���[�l�ٳgE�����c���r�FA���p�\��;88��� PWW��ի 9r$JKKQUU%%%$$$`��HMMDEEa�ܹ��с���O��E�1�1;;s��Emm-���1}�txyy��'��dٷo�O�.� [[[����iL�G]]]���#==]d�ߓ'O �G]]VVVB��CSSvvvHKKÐ!CD�8�<&N�(wlAA�RVV���x���#33�x�"���add�@___�ߴ�����F���wi�uPP����V��.�ﮘ�OGΟ�� � �C"����]bZZZ���%-�eii��W�J<���\�B[��g�j���:$6�ʕ+R���xHII�����%�:""B����-l4�|��E�uhh(^�|)w��,Z��������#��̌����Z���b����� �]��}��uuA�m۶A]]����2UUUHLLDll,222����wP���������8z�(?~���0�������~~~�����Z(FII rss1hР.�# �K���.�ﮘ�OW�?� �x�P(����W_Q��� ��͛7������ׯ+<�իWSK�.Ux��� P��;wJ���ߟ@EGGwzL�QVtt4��]G�A�A���� �~W���R����(�-TUU)///*&&���ᅤ�ijj�._�L���P���BmheeE����T^^EQ��[���иw��EYXXP={����������jhh���/���7nehhHM�8�z����)���߿O��_��?(777JCC��۷/�l�2����N��ͥ����^�zQ�Ǐ�&O�L}���tzYY5i�$JSS��r��ȑ#���::���Ô��1���A}���"��ʿ��������S�}�5e���?�x<u��=F����>���BUVV�yݼy��ٳ'���3F����ΎZ�b��:�"�}d�?i�ݻw�266����K��l��ؘ200�PFFF튕 BQ�ܹC�lll�:�n ѹ�� ZQRR… ڵ��, ,������%�ݻwwuA�V��R�/^��ɓ���Grr2^�zPQQ���|}}��g����=��b��� NNNزe 222���ܻw�V�ªU�0|�p 0�S꠩������ؠ�����055ł �}��������`gg���h1>^��3gBWW������?1f�a���???8;;���˸z�*�|��4Z6l��FEETTT���eee:= t�m�ʿ�������H$''��������nY���8p � ���8,\�p��ax{{CSS�Q����˃��%�:�C������%�����Sx�� ���'AA� H'�`۶m�����V�䫯��)�6̛7��� ������Ϟ=���#G��ň�.>�___|���r_LVVV����ǎ;p��9��� >>7o��͛7gϞExx8����������<"Ӓ ���������������iii�}�6TUU���0{�l;v �/FAA~��7�����fcԨQ=z�Pjjj���FQQ,,,���ĸ�L�����s�@ ��� �%���֬Y����… ������ MǴ}�;�[Gu��AćF�� � � ����#X,X,~��g��=}�4������`bb���(�~�Zh�^�z�ϕ����� ��TUU��(��h}}}TVV***�b����G��~+V��СC���>}� 88�q�L�:���obb"5I�����������|�;w***7n�ޑ�}�{|Aѝ�N\� � B.��Ѡ(����߈�����TUU������`���cҤI8x�ԑɭ�y����?>�����憃��˗>|8=����!!!B�YYYtL�V�b|�������˗���EEE d���<ǷL��v���6X,����m���������E����N///ʃ�� <<<���ב�����F�3�_���_���5���t&�s8xzz����8|�0���H�2%�}�`��jW�A�!��AA��gϞ���űc�P^^���� ����3f@OO��ވ��ŋ/���( ����ꫯ`hh�q��a��ݨ�����~��g����ƍ����4_��������Q�F��k�رX�j\]]%�'��Z/��]M�2�������mGAć��� 00������Bbb"bcc������$$%%�W�^pww���-���q��Q� ���!���++�N����7n�χ���\.ƌ���555�y�fxzz����֭CHH ** s�΅�����0}�t,Z��>6&&����r�ppp���~*4R4;;s��Emm-���1}�txyy��#G�Dii)��������� 0��������w����� `mm 333�4Y�ۢ��@�Q̭I{�:L�spp���,,,УG�v��6]�zO�<��0���p0a„�� �)JÇ�:$�1mݿ_�r�K�o[@@����vu s��%*66� �����>|H�>|H���Q[�n���Ԩ۷o��s��Ij�ȑ2��~IIIԀ:V�N6y�dj�޽�r�ӧO).�K͞=�@�ܹSj^���*::���0�eEGGS(�nj9�j�~@���(,Y|||�r>|���eeeQ������LihhP����@ �N�>ݥ�1%+��<��aƌB�@]�x�KcZ�h�rtt���>}����,,,(uuu��fS���Ԝ9s���b���������P\.�����f͚E]�tI�� 6P��>������zܼy�Z�f �f����� )Gy>k��AOOO�]9�Լ8������6�t������۩Q�FQ,K�gddD-[���q��|���}4y�dj˖-�l�ݕ�����s�Ǐӟ���{�<ȃ}�����)���>���p��}����y���\�"��СCX�n]E�y233���y��9rrr���.��I�&ua����O'''�X,p8�.��ѣG����\��޾s�N�>}Zh���b�۷�O��o��&񮀆���Ԡ��w�������d�lٲ��g�…X�n �k�.,Y��S�q��-����~��aĈ*GѤ�������p�޽.[}�]ׯ_?��� $$O��裏���\�x6lxg�\�p��������P�6��⋮� �����n}W,AtW�N���q��E������ ?����� 퓗�Gw�CSS ���AII ���ajj� 0*���***(,,���|||�f���$i鰬����� ������,�_{�4i�����(���!::�������ǏGff&222���*�#�����H$''������x�� �ti�8Æ C\\.\8|�0���uඇ���H��g�p���۷Odi�gii���"��)0�ߓ'Op��E())aʔ)X�~=~��G�� �����v��OIǷpuu�ƍ��Cq��a�mG��ڵk߻�7n�Hw�[��ƍCSS��򐖖&rq��o�����߿�[��=:z>����4�I�l�ΝS�E�� Ccc#���/4�'������1k�,XYY!77ӦMCqq1��ʰs�N������@������������غu+x<�.] �y>N???�޽[�l��ŋ�.h*�ݝ�v8q�`�ĉ���D�aٲeX�l�[)��ᅲ�faaA/�֝��� �������amm�������١�������p�V���߉�(At���l���vu�N��� |�������E�>�ڸq#���������\C��� $$�Z�p!����S���!�)t2�Atܻ4���$�އ���S�S,D�Rjۣ�s�N���@GG�N���ŋ������~zzz�s]]]���R���s��i8;;������QQQB��J+��ӧ� &���&&&�={6^�zŸ�+V`�С���@�>},R~G��� ���hhhTVV��b �^j`` t,�� 4�8��e���������8w�TTT0n�8�<�b��b�:� []]��m�UUUbof�~�0�_�>}��\.d��q��m�Y竅�ޟZZZ�������,<|�@�ȵ֫<������'N��˗/��� ?~s�Υӯ]����L��׃��AMM �?Fdd$F�-��y['O�����;��� 466��?�DRR���p��)z����c֬Yx��!^�z�;w����7o�ɗ��h�L��|l۶ �.]�˗/�5����6�>��_�]S\:�xCBB���w�����ƽ{�ӧOo��-�7o������k��Cm������� ���Ҹ\���-��G}ĨN�/���!��;1Z��>z�h�������2�Oi�P�_~�#F���ÇQRR������!++ w���������PSS#��(�� � ��D:q[w2��������z�Ҋ� ����Up�?�m�9������7�/_���b!00Pd?I����, w��EQQ���P\\���bF��+$�������~�:������ W�ګo߾�( Ϟ=������ϙ��� �Kg�?�Á��'>�Ç#00P$���,P���j�*����ի������pPWW'����k�b�ĶYK޲�WZZ*��o߾d�����`mm-�QXXȨ=�����; Ç�u��ԩS1~�x��Ą������PYY���zQc�Z IDAT�����������a����gϞ���555X�|9����8v�Ę1�|466BYY���x�����$����H���b���ϟc���(++���o��; ��W,Y�����r����<彭6k���٣G������Blg��t��ZXX��� @��-�e���i�^G^ ���JJJ8z�(���o�ڵK��PD_�~�~ncc#u�Ǐc۶m����N$����J�.**�����ѫ���E^�ꑕ���{�үw��E�}�8q���y�s�̡�{��=������#99Y�4M={�DVV~��W�f�� ��v � � �{�8NCC��Q]]\.�������1c� ���a׮]����gذapuu;���>TTT�����c��������Ѐ!C���b��� III"�(I*���&L@hh(6o� ������� �!�|HMM���allL��UUU��~�ejj kkkDGGc�…(**BFF=�+��i/��Ϝ9���Gee%nݺ%WMMMx��5= ��˗PRRu���Hw��={YYYBy��ؠ��eeeB�ne�_ ]]]�������0��~����G��޽���d��1e����t�0���,��߇�����wMpp0��Z�E MCC���4��)S���www:t���8u��N�*r�?����sذax��)޼y���r���`���8}�4��ۇ��R�~�Z�S����u�}�����w���7n������Sܾ}l6�>�cƌ��b���/�s�N������'��ڵkشiΜ9���*͟�#G��ʕ+��ɑ8��ݻw�*�m�б�~�z|��'@_���.O����HNN��������ӱ�9���߽{��3e�رt��Ν���pܽ{Wh���1��~I��� KN�8���PSSCbb����H���R�����b>|8���d�\���[�n���@�]+k֬��Z:��Z�~=4/d���"�Yiw�vh���P����9���eda3� � ��H��fƌ���Ŧ}��'=z4JKK���N��i���@b���&6o� OOO444`ݺu ���6n�>�p�\�3F��cbb�t�R���ѷ��,�"�|���ֹs碶����>}:����_G���a֬Yؿ?8�N�1m��b���� `mmM��a��ɓB����+++��ssshjj���iii2d�P������Gzz��J��گ������`aauuu�^�Z�CPV��|>F����2|��g���o�4i�?MM�/���)����ahh�Nw��ٳG���9s����/�_-$��x�">��3��Ԁ���ĉ"P�ijj�o��F�n; CK��ca�Xr-�Ƥ��2� 0��1�;�[/��:f@|;�WTTT��x_���!>>�����̤/(\�x���022�@ �������:����F���K���ق����������ZnWןi�iI �AѽH��uww��ƍ�2������x�b,^�Xd��Ue���r��~�����'I�Q�B�---q��U��3�/--���L�WRR�����ӥ�'������fff� /Z��ĕ�~@s�-�8�ҥ��������Ŧ1}���"VŮ��Ejj*<<<�����s��5�۷Of>�o��r��[�SRRP]]-4/2 }��7n�evvvHHH���N�<��>�Lf\���i�'��Јö��tb����#����u4h ���\�����m����U^k��f@��g�ܢ��MoO�_}��͛�۷oӟ�޽{���Gv�$h}>ڎ�l�Zm �T�����1m�4�|�<)))r��c�����pD..VWW��BQ=e�͖9WZ=d��,))��Ke]�l�yf�aҺSYZ,�ڡ��m�&�aܖ��}���Ϊ��������Xddd�͛7��4pww���-���q��Q<~�aaa ���9���`ee�ŵP������bРA]G@@@�� �?��}�;Pą���PD!�9q �� . ;;[��m���GYYY�tBv��u�-[�`Μ9��)�y��I}�]�N����Khq0I^�~M���TK� :FFF�8��C��sƞ?���x���=���t��12����������_���۷����"yϙ3Æ ����q��Y\�~�� U�hAy�c��m֙�S���;m�4z:����|}}E:A�ammMw^�xG�Auu5v��I/�֑�%�٢�� {��@ �˗/��r�m�6<�YYY��ʒ8R��ÇHII�����_ 44�N[�f z��I��(�^���֖�~��M���C]]����P=Z����#2��… ��򂗗�?.��aÆ�#�^����������Ù3gd^��DR;��̙3�~��{λ�ٳg8x� &M�}}}#==l6^^^���AEEbbb�r�Jlڴ ����|�2BBB�����b�ڵ�|�k׮��Kg�����ЫW/���˖-z�:::bѢE?~<������&4�^��<}��&MB�޽�����˗ӝ�@�����pqq��)S��K(//��ɓ��pЧO899����tztt4LLL��ၤ�$��e����� {{{zyE��>����Ɂ�� �͛�G�ы�� >���� �m"����������#""�^ �+())�… 077Wh�ݥ~�i��X�~}W�ѭ$$$��� zᢖ�/��B�+n�+i��r4ϧ[���������&L���=�[�=<<�.V՞��h�u��TT����7o�ж�L�4����@�����6���ј�7n}~333���������y�ɩS�b�ȑ�c�…b�l�H�1c��K�,��%K���s��8����\�3����=��c������b����EYY����)D~��'������pssk�("E�Ç�ŋ������7���0c� ���h�����(//DZc����+ԡ4�999a���(..���� mmmܻw�V����F�!u꒎���DBB���oܸq���"�p���8s� ������SDGG�u�43g�D�>}�u�s�N:����������?� �� 6l��FEE*++&4�< EEE�R��g�_V�-����UY�#->KKKaϞ=055��;w���$��_�FBB����^��� kkkhhh������t�� A�.�0�!�B�� !�.��� 00����r� �˗/��pqq��5k���SSSzʱ={� 88׮]�޲� ���N\Bnׯ_GUU�M��ա@KK�^�[Qd��������Uh�o���>�宍�y���"��Ǐ�����DAA�9Μ9GGG(++�ʕ+4h��T*Ҹ��#33����۷/�l6��� OOO\�|Yh��Y�f!22fff�ѣlmmq��qz��Ţ;�6mڄ�˗c�ȑ��ֆ��2z����c�ڵ�Fe�SSm��<�����/��o󷱱Q�-�s���޽{ajjJ��'N��㫈�%��}���rwK��� .� kkk̚5 �/_Ɩ-[D�;y�$@MMM�"�LI����)v��()��tj����f�yH�駟�ƍ�6mx<�l6z��;;;�M�QT;�+;;,�}��� ~~~HJJ«W����{�n���"99����g(++���#""���HIIA`` ���p��MzQ��g�"<<\h�������7<"� ����G����m��xI��ꐖ���������*x<fϞM��QPP@_(d��5jF�-�������QTTDw�K�ʣ5&�wf�剿���K��H�D��w�bɒ%044Ŀ��/|��066f�~��Y̝;[�n����q��u�3@�� @�&"d]��u!DZ�@�wHmm- Q\\���R�EK[DFFbݺux���������)S��������֭[�֛��Nć�� nҤI]A]�e��"V2ם?^j����Ȝ�������ٷ�������r��vq $�kgg���D�q� �Y[[#//�=x��I�|'''z4������d�)-6y�{[m����4]�x[TVVңMڎ�ej„ PRRŽ;莈�� �Q��v�RH��|���8{�,nݺ�;w�з��35�� �a���mjj4���b��#�^�HR= 88Xh��Ξ= X�r��B��X[[K��]�ϊ�v���Fuu5�ܹ�(.�k8::������OB��r��ilذ���`�٨���@ ڧ�4-���hhh��xI���@Q�Н���t'CEEX,�������`ŊX�z5<<9r����j��k׮�@�͛7ٵk����ݻ���Xbccy��������ߟ�Ç���{��=���ضmQQQdee)e=z��C�lݺ�A�jt�_7�U+;;???�oߎ��7���ӧ��V��E� ���8���h4��ӕ����ҔM�6m��` 33S)���P6Ԅ�Y˗/ 11OOO `4�R5�Wg�+�Z��7GM|�������ڵk\�p����SO)YLj���r ee�{T�ԃs*���T�W�^�?P/R|)��t:��6�|�I�w��ɓ'IHHP6gU[.�x<(��o��FM�!��EO�[�lYÑ��Լys����ǹ|�2�m�///�̙C�֭������?+++���ǪU�J��iʆ j$-ה͛7s��)ey��u���޽ggge���*o?���K�}����U����jР������������_"""8x� ���c߾}ԫW�aÆ������)���?���m�ؾ}�њ��;wf�ر��zڵk�֭[�%�ʭ[�(((���ML���Qf�U��...XYYǀ��vvv 8�%K��v�Z�]�ƺu�x��ׁ�K�<��S,Y��ŋs��1>����Rǁ�ر#�Z�RJ�֌6GM���������O3hР���0վ9j�srr�ʕ+dee)n 0|�p� BLL ˖-cʔ)��z����ٳ��r���-kˆ�Aj�� ����i޼9�����F����ݻ�ٳ��?������Ç���SY�\�����R�F!������?��� �=b�7o�Ν;���-wPݾ��j�_��V�@�Znnn��/P�&�QY�qG���DVV���DDDGLL 111������M�n����f���\�tI��]�v��zƎK�Ν�=�-Z��G���I�-ppp��g����6l��̈#(((��>Pfoذ�)S�ФI�ׯ����y��הk��� ����>}�0d������x�L�Bnn.��֌?�h��~�����FVVu��!**�:p��U�Ww���_��ŋ�o�}s�GM|}����ח���cmm�[o�U��1��S�~}Ǝ�رcINNf����9�/���:�-�4i�G���ח����,�?ΐ!C�>R���}�eN˖-} �ׯW^���^���7�иqcC�- �V�Rʖ,Ybx�' �رc �'OV����khժ�����аaCC�V� �V�~vv�a�ĉ�&M�lll :t0�^��(��ްbŊ��Ν;e�C5��G��Cm�Cm�ET���(�B!�C��ٙ��PBCCIII!22�]�vѽ{w�z=����^��qr�� 7nL�֭9{�,��� ��_QR�:u�S������@K=W�՚ܟ�k��Z������,t֬Y̚5���K��<�;88�~�z�u��ѫ� eB!�_� �B!�*�����J��N�e�۷��ͳ�KRR>>>`kk˲e��ҥ�CS�B!Dm!��B!�B�B�q�F�bԨQm�B!���2�[��R�����?5�q���n���?�\��!D핗���۷�����h�B!�E�Aܰ����C!�M�ݠ�����`$B�p�{�nM� �B�G\^^۷o��0*$>>��C�!�7�x��cB԰�ݻ�tժM�6���W���H��v �~��5I�$� !�U'%%�^_�a�а��[���f͚�ԩSk8!����̙C^^��]Lzz:���DFFr�� �b��帺��������G�5gpp0�5b�ҥ5CM�j������ljBM������+sv��IXXgΜ�L�B�Z��ޞ���t����Z�!�Ljll&�B!D1YYYDGGA\\������ooo�u�Fvv6۷o�ҥK,]���K�Ү];�z=cǎ�s��4�����r����˜9s�'�|�F㨩�_��W������jaaa%���[�.���xzz�`�Z�n]C�U��^z�={�����V���ߟm۶p��yڶm[�q$%%�|�r���KRRR�s�Z���{�W_}��={�Hlʃ蛫�+���U^���:5�B!�5-//�M�61l�0\\\ !66KKK|}} '33���p�Ν˒%KHJJ���Ä���������Y�p!]�t�K�.,\�����Wk�[�lA�����CLLL��xyy�`����iӦ -[�������u�_|�E���iܸ1���ܸqC�vժUt������5k�����3w}߾}y���x���quue�Сܺu��ڿz�*Æ ���'''fϞ� ��={�>}�`kk���/�����W���s��\���s��ݻ7s��U]�Z��N�>�N�c�ԩ\�p�N���{�����{�.)))lܸ����+T��۶m�;w�_���O��ƍ�������~���A�A\!�xDi�Z���ͮ�̬Y�PTUk�Νt�ر��B<�n޼IDD~~~4k֌ &�o�>��ƍ���`ǎ���ӠA��5 ���,[����T���BBBptt��~c����oߞ�={*3˪Z`` ��Ɍ3��y�֭�>�… ���+K -Z�KKK233�~�:K�.���B��aÆDEE��p��q���Y�f����\����ILL��իlٲ��ڟ8q"�7������������?���iiie>̩-�?�P�7�`����޽��͛WCT���ѣ�7N�s����޽��~����h&N�(�ʅ5Fq��u��e���[�����[� !�m4M�����a�ر���p��<==Y�z5iii�ݻ��� ���U����OOOV�Z�2�� IDATEZZ���#((����s�� �n� �W_}����IOO���\�^��k׮4j�GGG��&v���$''+������u�uZ�T���z�^���u�֥w�ޜ={�J��������̙3�z���j�4i;v���ŋ���ϼ��XZZҿ�y��:��S��_��/O����lذAu�U�2��q��쌛�#F� ((H9���btީS�3f ...�� ����f $$$0~�xZ�lIݺuiذ!���#..N9�رc�9�f͚aee���~~~;v̨.��ڸ�8F����=O?��r�g�}F����_�>O=�_|�E�}]�x1���x{{s������7�3�F�acc���/׮]3�cÆ %�z饗�:._� ��y���&L`�Ν���K��� ???֯_��^j����L�2�ƍ�Gdd$������+++�ի�N�c���J���?s�+�(�{BQ�� ��7jԨ2�p1��Z���ʤ��ܹ�'�|��m�ұcGfϞ��������nnnЯ_?:u�d4k@ s)��R<ͥ��a����?��X�t:��I999��舃����ܾ}�D M!MIIa��������ΨQ�x�W�ݾB���W����߯�6t:]������޽;>>>4nܘ���޽���ٳ�Z-:�� 6����z�{ �����, ����1�_�@ff&�F�� }��)j���e�j{| K����� ��}��ӧ���\�v��M�r��u�n�JϞ=���W����/�ٳ'�7o��������ѣG���_صk����ر���L �v�111����{��R����DGG���+�Y����`Ο?ϝ;w���_1b'N�(w�}||�����۷�y�&;w�dʔ)J����y��Ͷ����w�}��^�`A���p��Ϗ�kג��Sj?��G��֭[h�Z�ׯϥK�X�n�<� 7oެP��sny�B��Gq�Œ�RP����X�Ղ�N�>����n��̙3|��Fk����p��!�����?T�/5)��R<դ��Q��5uJK�LNN6��@nn.III������V�񊦐N�<�'�x���V�\������ն/��*,, ��P�_��������R�^=bcc ��ŅaÆ�i�&��K޻w���X^y�\\\:t(�6m������у�� Dhh����ѣG���k�Ų�ֱ��g���={�cǎ�w�^��������Ϗٳg���Jrr2AAA� �9���������#��h�sZZM�4�iӦ 233�� ���5��R��W6~�L�o���4M��~�ݸq���t�=������U�� �2e w�ޥE�$&&r��~��4h����̙3���~M�<�;w���;����޽{�ԩ������+baaAtt4w��!::�:u���Uݺu���%33�͛7SXX��[��hزe ���,[��BY �z�����\�|YYn�/��֭[*�ںq�F�m���*�����˽I\� 8z�(�}��2�[�`=}�4yyy$%%�����ٳ�t钒%P����^�}O!j'�B3�JA-RV beST[�nMݺuiӦ ;v�E�h4rss�s�������N�:�s�Ϊ�z�)�jSDնQ���L ijj*���g�ҥ4l�[[[f̘Attt�s+�B�����_�̙3�����͍aÆU�}!D�iР����ر��� 6n��СC����&L�@�f����#""��,)����#Gx���iٲ%d���deeѹsg��}Ν;����y��k��f8p�K�.�7#�^�z���+ pssSC˳�惺���+++��o;;;Ȓ%K�s��/_fݺu�1�6m���SO�d����O~��G>���������y���y�7TǦ�}s�����ĕ+W��ʪP|��ŋ���B�~�HII�]�v�ٳG���矹r� ��'���xyy���+��~�-����U��O�)�j�u��S��K}2d�ѬeS���s�Ww���_��ŋ�%��}s�GM|}����ח���ˆR&\�~����u�τiii�f���gtn�J�����Z�֨�E���[��:�E�iժ�Q�N��̙3��P��%�?(,,4j�e˖F��u���-[baa��{��ٲ噍[|P��č��B >>>&7�,kY4S�+Ϲ�yO�uҊ�v�A\!�c)((BBB���b���F)�Pv �9E)����xzz2`����۷���F�a���ִ-�RX��WZZM�6-5v��P�~��x�hю��iӦ�u����SV�e����h4$$$`kk[��)J����0�Ѡzu�/��^���L�:��S����Ndd$���9r���"""�s]]]������ӣG�k�Y\e9x�`�e�f�RbV��s�=z����U�*����ә>}z��Z��}���yݓO>i�!�K/�d��\������j�/��Se�o�����N�:�FR)))%�W��s��!**� &������?���m�V�|����/��W��-k��9݄��������2z]�� ���W\Ef\���[������M����0`�|� ��n��Zyyy���[|ٴ��t��qe�W�^DEE���ʮ]�>|x��VWE�-�{BQ;�r B�ǒ��-Z��V���5���C�QV bu��������$77�իW+)�E*��hJeSD�Q{�J�lٲ%�fƌ�z�/^,�n-T,����OOO>�� ��_ػwo��B�n��΄�����ߓ��̒%K���(q�&pE�8q���$�~*�C�4h�CS�x�խ[���ev��۷��4ݻwW�Vرc��Ü��LV�X����w��g��ٵ?��#o��6ׯ_'??����s��A�����"##�y�&۷o'66������l�]�tQccc�����B��k�h�F\\�������,[�����%�����6n܈��/{���رc���0q�DƏ_�8�Vw��WWW�m�V�nUHy�B��If� !{&L��'����e� Vg�jOOO���Ozz:Çg޼yF�Iq4�2)�樽?�S,���y뭷 Q�9s&m۶Uv.m�����~��g�?�u리�YDm�B�����k�g���;�SfY�����jJm�O���$|||(((��֖e˖ѥK���~!�ϟ�������cǎ;v�^�z�駟�����۷4h���U�4�ȑ#��3H׮]���ùs������R��+���bժU���QXXXbc\KKKV�Z�j2���%��>S�N�֭[�����Op��y�ի�*3M-KKK>��&M�ğ���maa������Y�gXwww6l�@pp0�o�f�Ν%��2dH���۷/�����g�q���]��o��V��gii��=!���dW�����.��T j��R+��:b�eV��͛��7n�0:��Ã���&�h���Os)�jT&��S,�������כ���)�:��C�)�g̘��۷�ݾB��� imP��ScԨQ�5ꡭ_���o���o� �ܹs9x� /��"?��#}�qqqdffR�n]:uꄻ�;'NT�2dǏg���|������S�^=:u�l4���͑#GX�h�"''����ܹs�ݻ�꘧L��F�aѢE���`0X�z5;v�0�nlE����|�����бcG.\��ŋIOOG����ࠜH߾}Y�|9_}��.]����V�s�=ǫ��Z����ٿ?���:'O��~��ۛ�ӧWhfoE��=!��}dW!D��8q�ƍӺuk%EtѢE5�B!�#iѢEe~֚;w.s��-q�{�����K�.e>/ҫW/���������KLpp�ѱI�&��������J�v�]�t�ܹsʌ�]�v)���iР��5mڴaٲe&�/o�{�.uŸq�*Uoy��� 5?C!ă%��B!*�T�裐b+�B!~�.]�w�����дiS��������s�f�V!j�B��ԩS�j�}S)��B�my��_�����,%%���Hv��E���������W�z�B!�^���>|8Ǐ����XXXжm[����3g�[����B�B!�� ���DFFɑ#G0 :t��˗���^���ߟ=z�p�L�F�X�t���0���kmJ�V������� �gS�����Ν; �̙3� UQC�7o^bs2!�x� �B!��deeMDDqqqܻw����֭���l߾�K�.�t�R�.]J�v�����;�Ν;�p/�'00��u��t�v��eΜ9ÓO>i򼇵B!�E��tB!�BԴ��<6m�İa�pqq!$$���X,--���%<<���L��Ù;w.K�,!))�Ç��� �ϟg�…t�҅.]��p�BΟ?_�qgdd��/booO�ƍqww�ƍJ�����׏N�:1n�8nݺ��oٲ�N���111&���ˣ��̜9S9���CPP���888��۷U�W�w�ޥn�TY��g*�ӧO���:u*.\@�ӡ��X�fM��)�Ba� � !D5ڹs';v�����y�&���ѬY3&L���}�:t(7n$##�;v���_b�r�F���;˖-#55�o��������ߘ?>�۷�gϞ�ٳ�Z��h�",--�������,]� �sRRR8t� dgg��*e���$''3f���dee1p�@<==��O����撔�Djj*iii,X��\��;w�����ކ2�럩�:u�Drr2�~�)mڴ!99���d�L�R�q !�B�#�)!�B�ZkѢE�2C�4������3r�H�u������xzz�b� ���k��É���ĉ�8q������˗���qvv�t����';;���dڷo���{�s��������? ��>�������������Ã��_9�������9{�, 6`ƌL�6�ŋ�� 77Wu�ݻw9p��:uR��ݻ7�?���̦ӧO3l�0n޼INN:��y�橞������I����ﱰ��cǎ|����ڪ�ժU����������1n�8eƑ����/��j���0~�xN�8A�n�h޼9M�4aժU����_�={���2r�H����ԯ_�\�!Dm׷o_~��G�{�=�ϟ��ڰ�0�z�-|||���D�׳b� ��_7n�|���@fff���������/�`�…888p��U��[�~py�I�=>��9{�,ǎ�رc5��[ud`�(�A\!�0cݺu�ݻ��]����[��s�� ����`VfG��)�VVV=z�D����6lHTT]�v����xxxЦM�M�f������/��jL�<�'�x����o���3�0n�8�< +++����S�cƌa����.!��%,,���̹y�&�v�"22��{�Kll,���^^^���3|�p�����u��=���ضmQQQ�l<�=zСC�n�ʠA� 5���ѣ�=˗/ 11OOO @@@�rN�?����hڴi�����%** ___&O�̎;��;�k4����p|���h0 ��j��O��`0�,^�h+� 0z�� F�Z*>>�3gΔ���t2�+�f��z�v� @�F�J�WW heS<����j���!!!��y��gNE������_�/�����nnn 6L)W��+��ՠA������'//�����DDDp��A���Ǿ}��W�Æ C�����c�.��`��~`۶ml߾�h��s�Ό;�^O�v�غu+[�n��>8p��;ҪU+lll�W���9�}��Ǐ�nݺ�^��#F���� ��k���SO�r�J^}�UZ�l�����1c�1���\�x�s���� /���駟fРA�7���+++���0`@��U���W�\!++���l��O�8q�[�l�҇B����jk��򂂂��� $$///F� `4p �Ȭ��M�b0��������n��͛��hHHH��ֶ�zBBB:t(G�e�֭�ni0�F��`��0��Rd&�B!�x����i�&� ��� !!!���bii���/���dff�ܹsY�d III>|���P\\\8�< .�K�.t�҅� r���j�;##�_|{{{7n���;7n�P�����_�~t�ԉq��mhdnà�����߿?3g�T����H�B�6tZ�j:t���gggf͚Eaa����m�d����L昋�T|�a������V�V����嵥e��T=��Ӽ��U_�6m�ҥ [�l 99���8��e˖ <�3f����ŋٿ�r��ի9q�k֬!<<��^{��� �#~�����r� YYY5ҾBT�B�2��ٓ͛7W[�}��-s���@m �Pgܸq̟?��è2����ֶ�L���D4 ��F�1h� >\f] ૯�2�^i��aH!~饗X�vm�\�|P�ܼy������h֬&L`߾} :��7�����;����A�F�k4���Y�l���|��7�������o������i߾=={�dϞ=�҇E�aiiIff&ׯ_g�ҥXXX����¡C�HHH ;;�?�P) $99�1cƘl'++������'�|� 77���$RSSIKKc��ʆB�~�)mڴ!99���d�L�R��u����p�����i֬ 6$**�?����Ǐm4H�&���x���Obb"W�^U���?��!SZZ��{T��7_y&L�@�^�*|�ŋ���(q�_�~�t:�m�ƚ5k��t 2Du�۶mc�ƍ��Ջ��`z��aTν{�h۶-��� 6���N�:Ŝ9s��Ɔ>}���ѣ����ߜ���O�>���Ҿ}{�Z-�W�.wBQ�d9!��R�*O���L�6�˗/�dɒR�9����$''Ӿ}{� �����+3��裏��?������L�{�9<<}�����ӓ�ׯ]o�� �S�͕���̙3ԭ[�(���ɓ�����→����3f���'eiiI�f͘1c����g�s�-[��ɓK7u�̥�韹����P��4���ww�����O߾}����I� �{�����иqcBBB�{���9�����,W�}�:t��/�0Z+S�Gj���Ӟ={���@�բ��ذaC���cj�#5��&����B��� �B�ˡC��|�2��ɼ��%�)+�򫯾bʔ)����ƍ;v��͛��g�v��MRRgϞ5J�4�B �SD͕�J��*��7׿��N�>����n��̙3|���C��)���7f����O^^o��v�6j~�Pv���rS�w�ؑ��~�m۶)�l޼???e6]U�իǏ7:���Ƿ�~���W��M�?s)�j�g*ż�~?BCC���(q\����� 4����V]�v�`0����?��חz��KHH... 6�M�6��aV�{���+����� C�eӦMܾ}�=z(3J Dhh��,ܣG�*1�w�{{{�/_�ٳg9v�{��%**����ƥ��Ѵi�r����KTT=z�0z�R|ã�����TRSS��W��PiK�dgg�����ٳIMM%99����*ݜH������U$n5�ɆMB!��Aq�„ɓ'ӬY3���6m;v�(qNnnn�3y׮]KPP��&���� /�`t�ĉqqq�y��xzz�x(��e����֭[�D����إK�ҰaClmm�1c����I&���\�Z�nMݺuiӦ ;v�E�h4rssU�_<�h�Jkk�1���L����_�3g��b��X5?ߢ6���5Ż�rs�����JZ�{����`�ĉ�j��ٕH�#33���\V�^͈#��F�R k׮姟~b�ʕ�� ��� ݺu�������h4�����|����?�܆L...XYYmU��ɆMB!��A��B<�V�\��o� @~~>`֬Y��Qm۶0�����ĵk�T�q��Uz��m����YYY�x�ٳ�E�������%999��z��M���*/�[�h�kU2����J���T,,,(,,TXXo��>>>dff���Y�bu�֭��]�~�Fc4������B�)������������w�x�"VVV 8Ш��}�*k���{�ژ-??{{{�cYYY%����g�����bn�����O���]㴪ޟ�5�ƍܽ{�J�ۏ#{{{��� "++���h"""���#&&���lll����[�ndgg�}�ve� �]�v��zƎK�ΝH����L�2���\���?~<���F�xzzҿ���>|8���S����GZZYYYԩS���(:t���J����ȦM�����g��[�n���3s�Lڶm˭[��j�̜9��� Y[[��[ob�o-Z�࣏>��ӓ-Z������>ktNy�����o��3#>��cF�AAA|���<�����W��+�B��� � !K�aBBB���b��р� L�?�233qrrR݆�� III��(�t���x{{��h�>}z�]~+�x ���m��O--յ�*�?���*��T�?���ӓm�S]�6m��` //O�,��dy�oJA6U���=#F�`���\�x����u�u������K��mooO~~~�s�ݿ"�R�����ss� 6�9�}��1ڵkWj�_㫊�g~~>��ח�*����ԩS�:u*���DFFɑ#G��� ""B9����^������Y�f)!���������R��m�h�"���?�P^��𨈹 �Lm�d����H����ol6}�t�O�^⸹���'6 !��YNA�X���E�բ�j������Ay]4�`���dff������??�u��b9i�$6n���_ ܟu�vfPu���M��L �)�ퟚ�D�lYڴiC�.]�5r�����au�|��?q�D6m��Ν;�0aB�����?�}��2�����%6�),,$33�O>������3f�w�ڕ��|��Ӎ���E̥��_Y)���_AAA�:u��/s3���}�������z��� ���� ���'99�%K����Q�XM � !�B�LJ��B<�&L��O���j��� 4̛7���o�������WK�111�:TKݵŮ]� �����0*��իCVVV��?�a#���!�)!���o�������`������9~�x��]�W�>��&O��V���P�B�0j�(6l�Pj��Çi߾=vvvp������ݛ�s�z}DD]�t��֖V�Z�n�:���ի 6 ;;;����={�ц����~v˂ ����M�6�lْӧOp����郭�-���\�~���-[�������)uy��}���k���������СC���_�j:t���gggf͚Eaa!�O�F��1u�T.\��N�C�ӱf��������ptt������`n߾]��kJJJ  ���wwwF��+���*��X�l�'O6:���O�v���9r$�������踝���� <�~��q��AΝ;�O?���ގ;���O�m�6^}�U6oތ��_���z��x������y{{���K�7h� v��ɐ!CT�-��?2�+���L ⊇ñc�j:Eu ���ߩS������ť�CBQE&O�L�f̀�����d���-�ڵk������䤬�������9u����C��2i�$v������͖����ڵ+��w'&&�믿r��,,,�����ݽ�����XYY�gĞ={V)+>9@�����c��)����߿��g�*��3f�`ڴi��)���|������/XYY���ưaÌΩL�EN�:���5�Z�*Qֽ{w�}�]F�Aff&qqqX[[����_fÆ ���ܻw������呖���ѣ���OK�֭��ϯP�B���B!��fE� ��/���ץK�h޼yM�:��ʕ+iҤ M�4a���L�>]y�����W4� �a�]�����W���IoVV�ggg嘋���䁹��t:]�cׯ_G��]ߢE ձ���Q�������@y�g�<<<�j��t:6l��ݻwU�[4k{����R �&M�Ν;厱4E���ϯ�����x;���e��?�+W����Nǎ�U���?��� ���|���XYY1p��r�PPP��ѣ b�ȑ��ӨQ#nܸa��B�'3qbw��-sM%!�����0j� .�SX����F!j���<�n߾m�E!�����@HH^^^�=�h�3##C�>33'''�m������Tj���#����t�δ�4�4i����Җ>jڴ)����<�����ձ�������۷o����F���Ӎ��-��`0���y��h4��o�������ܿ�� 7n\��ͱ��'??�����ѣGٺuk��6���gĈl޼��/T�e�f̘���- .,���|�ׯ�̺B�� �>�nݺEHHHM�!j�^xAq��?���yXU�����aPH�����Q�Lq���+��� ��S㚙��v�M�!���T��B�p�f�9�cZ(�!�� �7T�����}91���A��������Z���ܮ���s��Y#F"�����BQ6+++����[[�2 R�[��ѣGcaa�ʕ+2dH�s:uꄟ�_�4�ƍc�СҧO���9~�8�����ښ�_~�E��駟r��M���y���������L����a��ɤ����~����QPP@aa!�b�-[�t����v����:��[�lI߾}���dɒ%��jRSS�p�B�>ʻ������LJ�K��f�RRRرc������qss#??�7n�,��^��'N��?r��i ��/�H۶mu�{��wiڴi�4P�y�ĉdee��S�������عs'Ǐ�Ĥ��Ϟ=����!SB�Aq������CuĚ5k�B������z�j#F"�u[��F�D!�<�G�.7��K/�D�=HOO��ߟw�}��9���:����ߟU�V1m�4~��W�j5 ,P�ׯ_����iҤ �9�)S�ܮ�ƍ;v,�֭C�V��/�w�֍��t���111!!!��mے����o>��C|||ppp��֖^�z�:�k׮ҦM,--y�w���bcc�>}:�[�����F����K�Q���g�ڵ�9[[[:v�Ȁ*�>vvvxzz�w�^��?u�3g�d�޽4hЀ�]�2k�,�ʑ#Gtr�~��縻�������Kaa!:t�u����Q^��97nܠM�6ʱ�3g2s�L�����J/` !�Gq�j�Z��b׮]\�r��a�)�y�BCC� !���̙3��ˣ^�z�E!�8���e?~��A�WTx+,,����2�4 ;w�,�Z}�III嶹��r�ȑr��� �>|����U�V�|�1c3f̨��r�q��ڲnݺ ���6��\�P>GFFr���!�bʔ)|��g:��J*�be-�fff�믿����LLL�h4�9���+꣢��rssILLdɒ%5�rC���6B!�B!���BCC�q����%%%%ѻwo���Wf��}�HNN�Y �l�,]�����2Ӊ! #;q�B!�xD6l��� ��B�nj�� ����Rѱ���r��u�҅��TV�Z���M��0ĤI�t� !*Ov� !D�n݊���c��޽{��7ߔ:>m�4���Z_!�B����e��M[P]666�����رcdgg+��j�����k��d'�B<�m�Faa!~~~��fϞM���8q"�52BtB�t��&!�B�t���B��^PP�ׯ�9������������ NNN899��'��oFF��� j��F������۷ ����� 8kkk���x��7y�������Ahh(ݺu��Օ#FPPPP*��˗^f����x{{]�<<==�={���.v��z�����1q�D�=''�Q�FѸqclmm����)!�B!�%eeeq��]c�!�Q�"�xdf͚�J�*�W��c����?>��ϯR�x��suu%--�5k����LZZiii�?��>���033#33���,/^�������3�F����ŏ?�ȦM�X�b��W�\����>}�[�n�p�B����<��ۇ��o�q����}��r�/\�@zz���.N�V����aŊ�ڵK�=44���\._��o��Fzz:��ͫ�8B!�B�'׭[�X�v-~~~4k� {{{���ILL���"ēNq�(Ï?�Ȃ X�`�,�*����֭[����R�������Ҡk���IJJb�̙ԯ_�Føq�ؼy��y!!!���abbBhh([�n�i?u����<���ձc� ����کlH�{��a��阛����������~��]�v�x�b6l������lڴ�R�!�B���h44o޼J�jRDD3f�x��{���_����pԤ��|>��s������'""���$>|HNN������{{{&O��w�}�Ç���Jr� ���� IDAT�5jÇ�9���h�h��hŊ���@�Bbb��Pt��aZ�n]�1f͚�;�C@@������Ӡ�����h�Z�7o����'++K缒ylmmm���,Տ��666ܾ}�{���X�����5k�k֬���@Q���}�*��-�B!ģw��UΝ;G�v�GXX�Q _{���o���(�}�vbccٹs��*��̌~��1l�0��� ..���xRRRX�r%+W������C�����ѿ����N\a�?�<�������� �_��W%���Çu��ڵ+*� +++��󁢝�Æ S�]6oޜ��0.^��smHH����~˰að���A�r��M���t^i�4i�rݟ_��Q�Fq��)N�:���/�������I9O�R��j�4�Z���?����;v�;v����sNy�7n��Jō7�c���4i�D缒i���iڴi�����'?? �}(,�?##C9V��-Z�R�8}���J��~��~���B!��V��m۶4hЀ�͛3c� �߿��{yy1e���郣�# Щ���z}��i8�<]�v��� ___ �ܹs����D������D@@[�l)5���k{���/V�:��?խ�alw��e۶m���agg�СCټy3w��套^bŊ\�~�]�v1v�Xlllh۶-����̙3�:u���~�V�Zq��5�-[����Z�b��ٜ:u��S���N\a/^,� ڹsg�4i�رcY�l���xyy��/�p��Q�����5;w�d���ܻwSSS�5kFFF6l�믿��������? @����ݻlݺ�V[�Ut�䲲���� KKKlmm�h4�γ���ڵkdggӸq�J������� �>�, 4�~���omm��/�̢E����O�y�&��Ѽ���:ׯ]���#GR�^=V�^����u��������ƍ:�zK:{�,����ΣS�N�������Se7�ʕ+�T�5CmذA�U����$=z4�Z�*��k׮ҦM,--y�w�0a�A�&''3~�xrss���d�ȑ�����?~��2qsssILLdɒ%�^_�R'''8�|����Ν;�g[[[֭[W���B!'^^^9r����o:��پ};QQQ\�|333rrr�9���/SSS���חG_����LT*U�:%U�N�!�C�Ϳ��? u=���ի�ܹs���/�1f��՜��W�:5��ԔnݺСC.\H||<[�n��ѣ=z�7�|ooo�Ϋ��Z��}I�N�"..��7����oժ!!!W�>��INN�cǎ�C�A��+�$L\\�7oF�VE��=z4��8-R���ܿ����*� .�����a<��ϟ_n[�6mj����LLLطo_���'M�T�\�B!���(((���e1u˖-�0�z{{{���ٿ?�{�V�����쌻�;�-�>�رc:tH�~C�D�ǐ�ks����*u$ _����06�JŠA�4h�ܹ���8������6m>>>����� LII!>>���X.\�����h�ݼ���ƚ��Bq�Q�U���֖�]�*�ǍG\\yyy��_��_�~�h��^x�-Zp��u6o�LRR���@�.ݍ7����G}T���y��甔�2S2��[E���Je*���ؔy��޾��ѫ�`�B!�0���~�!>>>888`kkK�^�j��� �d�Laa!��>ӦM��i���eԨQʿ���맳y@_��nݺ���Nvv6&&&$$$жm[ 꿶�oH� �z }��?խ�QWXZZ2d�� ��۷ٶm����޽���$����4i�<� M�6�ҥKʵ͚5#((������1111�L��EZ������Z�Zm�P ��[oi�ru��]��hu�IHH�9�믿֚��+�M�6�6m�T��ꫯ*�6L9~��E�����Z���K��*��T�����x�jF�=���_�J����jmLL��s���������5�B<��j�����t��?���nnn��p�B-��5kV��_�X���U�Y�I��+�h�.]���/j_e������FGGk���533S� بQ#mxx�6))I{���G��S�gyzz��BQg���0f��{�=�4iB@@��9��� G���?d���dffR�^=\]]���f̘1U��ٙ�+Wŕ+Wx��au�#�BQ�\��K��ptt�y�N<�N�8A�F�x��8�< **��_�m666�;��cǒ����͛�h4���annn���x�dW<2QQQ���v��,X���s^x�bcc��G\\\�� e�?a„:���B!DI$,,��a����*�f�S���\�|��� ���b���t����_<>�4i�k��f�0�0Y�B�:J��p��}222*�&��� �/~��=:55�#F��������Rm�{�f�ܹ�����6m͛7���߮��B�( :��!��ܗ_~i�;u��Bu���/�� Y�B�:��ի�;w�v��Ux^XX���{DQ=z�=�m۶QXXXj`��ٴoߞ�'*�p��.����.ذa�� B!j���B<����X�~}�����+��j5j���7�o�V�W�ZE۶miР͛7gƌܿ��[�Ү];Z�n��� o��&���J�YBCC�֭����1����㎉���ɉ���l�R���ˋ)S�ЧO0`�N��ϟ�k׮XYY���ˠA��;w����?''�Q�FѸqclmm����Ν;:}���2o�<���qvv�e˖���4��ׯ3p�@��������7����J��s��������U�<�/_Nxxx�m���x{{]�}���d����ߨr\�r�޽{cee���7AAAL�8Qi7�� !�B�4�����ݻ�C��E\!�(GTTfffdff�����ŋ155U�6lHBB���9~�8�6m�O>Q� III��ښ��Ν;ǚ5kt�\�8}�4�n�b�…�FZZÆ +����dv��ťK��~���.��Ç���Enn. ,`����mH�������r��e~��7��ә7o^�>���y�����_HNN�Y�f�o̘14jԈ��,~��G6m�Ċ+��aÆѽ{w���x��wIJJ*�G^^�����׷�9����}��r�/\�@zzz��� �U�V���b� v�ڥ�n��B!��Iv��-֮]���͚5��ޞ��pu�m%ēNq��ܺu���4T*���XZZ*�������E�k8}�����s�Q�^=���qqq����JEnn�rNHHfff����֭[kt������S�^=<==9�<������l�cu�ؑ�Ǐ�۞��[�Nn}��ٳ��ӧcnn���T�+s��B�t���`ƌ���i4�7o�J�2jƺ�ƞeƯ�=ںu+...���������?���DDD����Ç���!::����coo��ɓ���x��a�b�q!9q�O�+V���E������Çiݺ5�f��w�! ���L�����?���gݾ};QQQ\�|333rrrV�(޵kff����r�8���g��֖����g� t�),, 33�J��zt~6Ty�_�~��}�*��}K���T�q����j�4o�\9foo��L���B�R�;88�ُZ��p,n߾ͽ{�j,7oq�����}*s��B�txR� Z����{�����QAA۷o'66��;w*������ׯÆ #00��� ��∏�'%%��+W�r�J:t(!!!xzz��!j�,�>��ݻ�5��ZFF���/^���B!ē-&&�9s搝�̈́ �޽{�s|}}�޽;?��#)))ܻw���D\]]���`ܸq��#�^����5#F�PҊ����E�Ν9{�,/^�}��l޼Yy�M���\�~���8���%�G�&**J�0q��yF�ř3g����������蝿�����ڞ����yzzҧO�J�g3��{TQ�))) 8�?���������� w��e��������W_)5HLLLx饗&((H��I666̛7�y����O?O\\���,[��e˖���DHHÆ ��ã��� �����n��� #F"ꢼ������ڢ�ht�ILL��Ņg�}V��Z�~}��[���B<<<���-[�п�Jűv�ZF�I�z�X�z5��i�����ܜ���ӻw�N�ggg���Y�h|�ǎ�СCe��J�-[��o߾DFF�d��j5���\�p����,��ּ���,Z��O?���7o�믿�̯C����0y�d���ؿ?�;w����͍��|nܸ��k���g����^n,�:u��Ϗ>��R�����t�R֬YCJJ ;v�`Ĉ@��?!�x�9������ONN���8::ҡCF���F�2BBBظq#/^�u��e��&M�����������S��ژ�x����FDDD��EGG�c�������U��)Y���ܜÇ�Y���͍�W�ҳgO����4i�A�PT�!)) �VK�.]���Q�5����3;;;����y�&�z���ё�S�Euz��ɡC�8r�>>>:�v�����뿶�/�b.\���ՠ>+K�=�(FWWW���غu+�f��ܹs���Oxxxp��e����*���]�2|�p����|������qww���G�e�ƍ��Ǔ��FTTQQQ������B@@�A}�����fN���"�c�䮰�^{͈���d͚5<��3F���1z�hZ�jU�xrr2�Ǐ'77KKKF�I`` P�j��~������ҫW�J����C��ݹq���_�3g�N{Æ Y�d ��������iӦЭ[7��������Ą��ڶmKbb�Ac���2j�(lmm�ڵ+������؊⏍�e���nݚ��4 ӧO7�o}�[�~=�Ǐ�I�&XXX0r�H�L��\�q�FƎ˺u�P�ռ�⋥ư����ӓ�{�2|��2����o+\8MMM%##��y+^����cǎ 0@����O!�������Gys ���ۤ��������m�q�e�s��b%�<�iӦԗ������e�y��^<���9�NC�/Oq�S�N���0u�T���Ν;˭�o�1��ڜe�/Yw�Q34F�V˂ X�|9����ގ�5kV�R������ӓE�q��A&O�̙3gHOO'==��{�V��Ga֬Y���Z<9d�1faa��z�j#G#�]�vq���7Q1�2�Ϙ1�����0(��ɓ'�ӧ999�����7�бcGN�:�… ٿ?���4jԈ>}�0�|��y^~�e���_š��輡�����������ohѢgϞ%>>��˗��/�(o����ӧO,X��wLYs+yo�����իILL�����}��f͚R9�E���/�kCyoTU��Cu�@T����@Z��:�_��֑�������[�ÐU*Z�SSS�u�@�X�p!���lݺ��G�r��Q�|�M���>|8�����̧N�"..��7����oժ!!!W��آ���={����c ��8._�L�=���c��,_��:0��rmذ�ȑ�,��ۧ����I�&�+MBQ� ��������l�2<���Ay���ﱴ�$??���X������A���???rrrhѢ���Spw��I׮]�����͛4mڔ��,6l�@�ΝINN�ڤ)z�zӦM����J!ӣG�����+�q,,,���_����G����������q������n������x:$&&�믿\硘�v} ��d��J�A�{�.W�^%::Zy�d���r��:d���1��ڜe��ԩo�����:�! ���Ύk׮��W�T 4����?ddd�i�&�J���9x� ����?���c�ڵܺuK�6%%����Ӷm[^x�>������h4���9r�_~����uzW�ʐ��Ba$�N�2��AAA��6�|��;��T^�{{�Gòe��XB<ɒ����� Ic o���~�-��������ҁ 2���(Z�lY浯�� ���@�����:u� 60f��c���Avv6����ٳG٭{��}ƏϽ{�ppp����899q��<==���ߙ>}:�|�M��]�^=���K���������i׮>d֬Y,Z��_��͛7+)�馃&� IDATҥ ۶m�Ν;���s��u����*�n�MW�\1�þ}��V��6~M�n���y�nC�����:����sڂ���aÆ)mT��۷O9>bĈR�^�x�Աg�yF h[�j�MKKӉ��ѣ�y����>}�(�4h��fff���B�������ׯ��Vr�/����}x�������Ҿ�����PmPP��G��5s��-����{�n��A�)�/_�\��4�����ؿ~��g�݃�<ˊ���+�h�.]����4���CNN�6::Zۯ_?������Q�F���pmRR������ ����g��>_U�yL<�d'��5aaau*ٺB!�\j���C�;�G�ʕ+uv7���;_|�Z��s�α{�n�͛G^^�/_f�����۷�uŹ.��sq!#}���o߾TN���L���j�v��}���hܸ�A�ԩS'��Z�����o�^�5����U%_U����A>���t������4���S�u���q���0v�XƎKVV�7oF����燹����⑒E�'XPP� *�3___�w�Ώ?�HJJ ���#11WWW�OOO��飓2%%��������#F���ɉ����l̊�������Ɔŋ�Z�{�f�ܹ�����6m͛7���߮���B<~�������:t(�;w��Ɔs�αy�f���?�7o�?�<*����{O9���k��+V�`ƌl߾����?XYY����^x�-Zp��u6o�LRR��off&7n$55��>���S�Q�� /����#7n�����ϐ:�b�yx�BC�"�S,88777��>����2�s�=G�z�pvv���T*�������ڵ����ӰaC"##�4iR�EԪė��Ϟ={�駟077��Ã�*������� QW�v�m۶QXXXj`��ٴoߞ�'ҨQ�Z�A!����ɓ�>>�r�yyy�\7q�D"##u����e޼y������L˖-III`ժU�mۖ мysf̘��KII��ɉ�^{�_~�E����'�(}������D@@[�l)����8p ��������o�����bʔ)���GGG Pf^��˗^潳����ۛ���2ۡ(���ٳ�m/ϕ+W�ݻ7VVVx{{�ĉ����F�E�ƍ���%""�;w�Tz!�5oѢE���t�֍ƍcjj�3�<���;���?*܉�����#P��XYY��ݻ+�����%_����sTT��>��� G�!$$�-Z������_\]]�����k�&_�Z�f׮]xyyajj�?�@�v픔B!*'++K�}.�Z�� 3j�(�0a���J���͛�[��Z*� �V[�@ˠ�jiѢ*��ӧOceeU��4n��JEFF��-##C�AX���˰a��ӧ��=�����ϏΝ;W���R�4lؐ����ܸz�*={���ٙI�&�H�1c�`ggGVV7oޤW�^8::2u�T���d����j�t�҅�������طok׮-w~~~~lݺ�3f��.�O���ӥK�t�R�k7n��^n{\\qqqz���ږ���^ 66�������}�-k�<==��J/�wZE}��BB�����p��-�l�B\\�~�-j����@������U6� 񤓝�O+++4 �KKKlmm��Ż^ թS'�z�2����v����5��e˖��ۗ��H�����v��T|屶���LJ�K�RXX�O?�Ď;�4�x�]�t�����3gbjj������U��ϩK��]���*�5 �>}�F����'))��3gR�~}4 �ƍ��EX���9�����ӓ���봟:u KKK�}��r��ر#Ǐ/�=77�̝���߳gӧO�0���ŋiذ!VVVDFF�iӦJ�#�B񴈈�(�K��[�����#*��hh޼��MFů�1�'�&??��?���퉈� ))�����Ctt4�����ޞɓ'��w����Cc�-D��E�'��ѣ���/322�l�ڵ+����i��F��ի��nݺ����ƍ��Oprr�_�~�˃hݺ5VVV 8�+W�T*���]��K�.akkˤI�0`@���7}�G���P�T:;��4Vy�K�o�NϞ=�h4899�~�z�ݻW�1��8uH�����K��hР�򳩩)�����Q���ecc��۷k,��q%��B!D� #00��a�r��U��ۧ�����9$$$�ꫯҬY3F���_�Ç�ׯ������p��9�ϟ���+7o�d�ʕ���K8::�׿��#G�����B��N� ���_n[RR���+*fbbR�kne�.Vl��� <�/��B9~��m�g[[[֭[W��*���ā�ϑ��:y4 _<���)N����,b�����aff��虗����E����Up��-� —_~���?*���S���I[��%ũCnܸ��IOO�I�&��G�V���_�9���XXX�hq5I}"�O}) �x�yyy1q�Dƌ�a���`ٲeJ{�Ν9{�,/^�}��l޼KKK���œ9s���f„ t��]�;%%��������l>�3g�Ǐ���ƍ���155��Ņݻw�z����O�>,\��F�_Q���3d~¸�޽��ݻ���㫯�R�LLLx饗&((H)B E�H�͛Ǽy��駟���'..���T�-[Ʋe�prr"$$�aÆ���a�� Q�dW�T���R��Sn޼Itt4�����}������ύ7J��.v��Y������S�N���U*Wm��'k֬!%%�;v(�K�>Y�d j����T.\�P� !�B<�*�sPQC�0DEEaffFff&���>|���U�����:�g��ģW���������+�eT*]�ve����&����R4��ѣlܸ���x��҈��"** {{{\\\��ەj���}�V�:!j�,� !�z�G��U�V��oܸ��cDzn�:�j5/���N��ٳ �C��iӆ^�z<���~�!>>>888`kk[��%S�XZZ��;�0a��(uIzz:��٘�����@۶mILL`����?�&M�`aa�ȑ#�2eJen vvvxzz�w�^�^�9�~�m� ��I}2r�Hlmm�رc��O�O�N�֭)((@��0}��J�#�B�+�s�Y�:,,,�u�iii�iӦ�:U}S�� �O߽{�X�p!˗/t�ȝ0a�f�*7�!<==���dѢE��yժUe�7e�>��2qsssILLdɒ%�#�O�B����R�+����1w���__���5k��dff�?���M�Uu=>�?���c�ܹ���+S��^���'O2l�0���uޒ4�V���ѣ��ƒ����k�t�۷oO˖-���6����dٽ-�Y�BQ���P/^����u�I,]�����*=d !�����l��푒 �0����})���_�W��u���: j���?��K�.���C�޽ ���h��z1$��֙5��ԔnݺСC.\H||<[�n��ѣ=z�7�|ooo��9�ȩS����c�ƍ���)�[�jEHH����+Orr2;v��uB�Y�BQ!���W���I�*��W!D�*~e���|��GF�F�"5�*��^CUT�!11�}�Ye�o���K�Q�:����177g�����ݻR�_U�L�ڥR�4h� �����;w��_���9x� ӦM��LJ���B�)))���˅ �>5�������XS�V�"�B�lll��:w�Ldd�R彲4 ���'##�J��{��P�M#""���a���5�B!�&m۶�R����9�۰aaaa��KQ3��a�W�@_���!u���ͦN��ԩSK�u�L����ʊ�Ç3|�prssٲe 7ndϞ=��呗�G�F� d�����K���;l!j�,�J�z�*�Ν�]�vO��5%,,L��?b6l�����a!D����g��B!666�;��cǒ����͛�h4���annn���x�d� ĠA�3fL��C���{����?�~�)�<��9�����Ӈ� Vj�U�V��Gq��U���1bQQQ����[E������믳}�v>|ȫ��ʿ���J'�j��7��bjj��� �w���ʊ����ANNNNN̙3����+}���ҽ{w~��GRRR�w�������Ü9s���f„ t��]g|///:w��ٳg�x�"�۷g���XZZE9�F�ř3g����������Wj�O�5k�;!�B!�?~�mmڴ���aB<�4i�k��f�0�0Y�}J�ݻ�`aa��X�`A��.\��յ�}7lؐ����ܸz�*={���ٙI�&4~hh(���\�|� Ƽy�*� ���/8gffbnn��Ç�W3\]]IKK3(�Btt4;v���͍��\����#�TTV��cǎq��1#G#Dݖ��n��x��"�fԨQ0a�|}}:t(͛7W����P~�����ήR�T*�Z��3��[�2d_~�%����T*�N�JAA����ߢE T*�O���Uy���Z�� ����w��:;�U*Z���~j:.��M���ju�YFF���5>�B!�H�(���j R#��[�ne���bff���?�V�b�ر�3�� �0(��5�\��ȑ#9q�;v�E�4i҄U�V�Հ�H�����+�333�5kFdd${��壏>b������x�7nLZZ���0!����dΝ;'E���$Y�}�XYY)�#�������FS�u��1z�h,,,X�r%C� )uN�N����+3����=����߿�޽{+� (,,����Jō7زe ���7h��-[ҷo_"##Y�d j����T.\���Gy�Eqqq��g�Uv�֯__�;;;�]�Fvv6�7�T����쌻�;�-�>�رc:t��)�B�t+/���j R#@_ ���BRRR�޽;�;wggg>��#LMM��H������ N�V�HJJ�̙3��у#F(�Ԁ�I]�t�p�W�m۶�ĉ���HQ2!ʑ��Lǎ���7v(B������ׯ�����Ʋo�>lmmy�w�ׯ_���B!ē��9����tnnn���|��W���θ������J�"77W���x�b6l������lڴI��d �J���w���~~>{��a��阛�������u� U�[y5 j���u��=!��� ;q�`���e74���ũS�2u��R�g̘���������[�No|�_�����011���?/�=))�ܶ~��¾>�����b�ڵ�ɯ5h� 5jTa�B!�xzZ#��ÿ:�w͚��))LMM���A5j��AY����j��j�(�j@Ԥ��|�ju��/�B��Oq�x̜8q�F���s�q��y8@TT���B!Dah��^CjT�V�5�F�!5 ��q�ƨT*222tjinh ��t�ȑr߰B!��A�)�|�2=z���Ύ�|�r:t�`찄BQGXYY��h�h4:54�����u�ԉ��z�̶�5jR� yyy@Q��]�v)�$&&�믿�[�@_�屶���LJ����;��)����-*ڮB*���,-Sa"�V�R���3�K����f0J�2�54Ț�� e���R��r�(��������m����xx<�=���|����}?��ټ������q��Y�]��QYY���Rvuoii)��ʄ�TTT //�7oƥK�P�9!��q�����0&L�� �i$�������w��&`ll�~���; �2e >��:�/m���{�����ᅦ����=rrrPPPDFF�{��p�L�:t ,��� JJJ`hh� �퉉��1c�|>������%��AM�K�{�nxyy���w��9r$�V}p�\�{@Hs��)�x���ЫW/���]�v���&,-- �Z_��cǎAYYY�a�,%&&�;BZ$J�`�o닋����%�hHs!�����s$�.�_�OOOy�Ai�g�Ǝ;���I�#�^�_@�������� \\\`��y�}]� ��a�}���k׮��PZZZ��%qqq�X���Ĥ��T�����(y�A!�#BI������ �>~HZ.A�BB���رc��BH#�����"�����C �E�؃ם IDAT$n V}�ݙ3g�1Ҝ���Z�n-�HH}xxx ""B�aBAHH�̙#�0!�4��s�b�ܹ��B�G���-���*���yw��)�hHsq��ydffB[[[ޡB!�|�l�"�!��S�w�B!�B!�B$�$.!�B!�B!�4c��%�B!�B!��f����B!�|b ��;�z۾};:t�]]]̞=[��>>>��ׇ������h�"TTT�����p��p����aÆ����sĄB���>��� �w����̔w�������͛����d��ѣI�4i�9HMM���I���5k��ƍ(**������`ff�)S�`ԨQr�MV��k�ԩ���߄�]�v �����4���ؾ};lll���^�|��qqq�{�.޽{ػw/�N�*t~`` ֭[ǾWVV���: `ii ��� ��n�:�K�.HNNf7�l��HHH��S�cƌ��d�COO����{---���z�I�n������_���$�PZooo�\�\.>Ę1c`ll ???�Ojj*444p��!8::"66}���cԄBȧ������!��Ǐ %p`���X�f��"j<7n܀������co޼Arr2�����r���[[[p8hii�-�Ǐ#44�d����gϰu��:�Y^^���"!)) {������y�f�Ϝ9s�f����#$$���o��HHH��U�T%e?L�J������>%oI�����~@NN����믿�u��B}���0t�P�]��=fdd����c���B}.\��o�bǎ Epp0�������ɓ'#((JJJ������rss���8w�f̘���L(((������Ctt4*++1~�xl߾������w����g�0s�L�����������ϟ���׮]����L���� (**��:::��� HNNFYY.\����,Y����PRR���BCC1m�4�g]nn.�O���ׯCQQ����x�"���k����̄�����ѻwo���CWW���%��ʢ�ߝ��!ڴi#����:t耀����ƾ}�ju�Ғ��� � !U(�ۂ�j� 3gΔw�����q�(�����O?����!�Ƴ~�z6��f� 2���HIIALL���/��ɓ���MoC�|�r��@���7������=z4{\[[���Fll,~��g�����ƤI�����3g��������`b�� |��Wعs'6o� �����H�����1.\�sl�4�?��׮]���*F��U�V ��������S蘽�=���D��qqqlIMMMDFF������8p ���1{�l���������Ƅ ��W_}��joPVVFzz:���+V�����1�������&L��򠬬���X����' |��g�������aoo���V����O?��-[����c�ʕ�����������uBHKUVV���@Ղ�]�vaƌr��|�BiF<<<LDDD�}0ۏ������!S��]�2555fҤI�=�믿������m�/_f���---�u�֌�� �����=r�ckk�t�ЁQRRbZ�j�t�ܙ�>}:���%q���T���[��q��1�۷g����v��1���̭[�D�a�޽L׮]�w����ӧ�ѣG�� �433c0:::Leee��FRl�����L�)S��}KJJD�����U�VR��6�IRRR�hjj2����Zb��kײ��ݻW�}���l��ի�ڶl�¶iii1o޼a�.]�Ķ�={�=��?���}||�|����8�9w�\�q|��l���ر��̞=��x��{��1sss���7�(�?5��wC�����������ጉ��L����/̸q��a���3�֭c���555��ӧbϙ;w.3g���?���QRR�hhh0w��a�a233̣G���/^d���E��Сs��5�c�^�b8�����V�^�|��B���,X�@d̓'O2��� �T��޶m�0 �������3 �0������=���C��M� A����c�M�8����x·�W�_�f������FWW����e�aRSSLzz:�w˖-���A�c���džbnn��w�R[�޽c����>r8&,,�Q���Nm?_���i�hc3Bi�bcc��� �j�ߔ)S�6i��8;;���Gii)޾}���(�o�oݺ�7n������PUU�ӧO�g������۷R�:u�lmmq�� ��塢�/_��ɓ'akk�ӧO�}��݋iӦ!55�޽ý{������x�q ppp��-[p��u����v�j9_S޳� �̙3������2����]�z�^�8884��Uuj;u�����իW�6{{{(++Μ9S�9�{ !M��Ɔݠ��i�С��}��x��L� V���|�}��.]Bbb"tuuadd������ahh��}�� �������s����k�9s�:u�����R0|�p�x<�x���]���0 ===�Xǎ���/җ��C��VII�]q����n���}����m۶������Շ ��?�_5�_Y�{xx��� ۷o������r-�C!M��� 'NĩS�����;w� 88 �����v�w��F�!����t3���8��VO�N�0C����6�|>"##�}�v�����gii�ӧO���}������q�����@MM ������a7G���D`` 6l؀�O��ĉB�tVWQQ�Y�f������8z�(ƌ�3g�`�ĉl�ȑ#�=R��`�رطo�����/^�?��eee�r� �\�PUUŸq��&%�V�����Eyy9�/_PPP��#G0j�(DDD�-������?�kss����зo_dee222�6UUU������B�Ԗ�눍�ů���&�CBB0k�,��*��6�c��5��%&&�;"Ell��������}��2�kff�������pssùs�p��e��Aaa!ƍ�cǎ��� ���())a�066F�>}p��I�������d������p���T��P:::�p8x��{M999����[��C ��ڼPP7-- !��&p/]� �K�����Qi"��%��zغu+<��󖗗�ȑ#�3���prr�������q��i��`uK�.���:���ѯ_?<��߿Gnn.x<����ݻw#''eeex��{��G�$ƕ�����U�Ǎ7n� ���<�w�ޅ���@4h����_�;v 99Yh�/���n�† p��yJKKq��Aܼy�����&%%�j���gu���Į�Ab��궆&H�������ҿ6q!K�܆�qq��ŋq���z�AH}�ݻS�L���*BBB؟�����Æ �������?��ׯ�ŋQQQ�-[�`�ҥ��������‚M��jjj��򂫫�H?I��&�w��\.z���>��~%QVVƙ3g��?������X�p���]�v���&,--#�� ���IM \J�y�$.!�4����y�����B��JR���͛7�>�~��9��_ H{t����l�������022©S�0v����(nvv�P[���۷Z5�a_q%*?~ ccc�z��=z��Ç ���V�V���k�{Vկ��ՠ�o��ڵkǾ.,,dW�5�m۶�7ZZZ"I���B�X�a�dV�])�����jqq����ñcǎz�AH]ݾ}[�~|>_��K��+o���EV�/\� .�:v�v�P^^.����b�޽5�W���� q��9����Ĉ=�����޾y�}-����_Mx<�]�ƾ�/�������H}*�B>&�&p(�K�66#���իWB��IRVVƖ\�� 9}��eW��:N߾}�����?p��Q�}�ǎß� ��֡�������ٯ^���G��իW��������}||Я_?�]��.]�?�������ĉl��ݻK����ɪ���.���؄��k�p��Abǎ��~��gffƾ���Bee%��󑟟/�Iڛ7o��⤦��ܹs�ĉ���b� �nݚ}�0 ��_�޽�����PSS�����������%''�]i+)B!�Ҳ�6�+@���������DFF�������$�.]�Ė8p�fϞ-��666�r�(**��ݻ���3�|�R$1(���BCC1n�8TTT���]l�`��5k0}�tTVV�}���Ǯ���:�Ν;B��W���,u�-%%�Z�'��޳�PRR?���3g����]������;�u�2�!C����aܸq���l[ff�H�������?��� �=Gxx��y�������ݻw�_� 6�V��zVVVl۶m۰m�6U�� 6Wj�8!�|\d-�E�2|�phii�m��&phE.�J�BH S��Nooo���C����Ϟ=Í7������������1o�<$$$��͛prr���?���d��� 7n�@PP�]����"p�\���aɒ%���b�N�6 @U2733����駟�n�:�x�\.�a�;v ׯ_GJJ �|>TTTеkW����T+�6�5�=��3f��� ((YYY055Ś5k"T�����ر#q��%����bkgօ��"455a``KKK������V�ߩS����b7_����066FHH����������F��Bjc˖-�������2��"�T�w����� \J䒦FI\Bia����� "5_>�Ç�􍌌9fee��7o��-˸���8~���8������̐��®�=u�;���-�����%,--kSZl�����YM�l۶������ ___�~!!!��O�o���.]BBB�ݻǖ��x2�O BPPP�歬��o���:u�P�}�����(�:��Ϗ�^�8ƍ���Bܻw�V�B��4�f��|��;&��*�+@�\Ҕ(�K!Dn�>} +++�i��ڵCqq1������[�| I��Mqq��b���/1x�`\�r�6mb�������ǏѺuk,[������:��q�ƍ:�@O!����၈�y�AH�ջwo$&&�e�N� P"�4J�B�}}}�;�o�Fvv6abbGGG,Z�Hl�Ֆ4_}�۷���wB8��w�u��B�.]p��i�����аAƬ�uH�CPS�B!�4?����D.i ��%�"7�������h瓇3g�4����� �H����E�~��v�!D:___hkkc�ƍB����Q��4 1mM�<<?��cEF!DV����D.il��%�B!�4K���hժ�';?!���i��%rIcR�w�B!���#,, ~~~�u�V�������ѣ�����m����o޼a�-,,����?�={���ɓQRR¶GDD������'O��:Wqq1���`��XQQ������.� ___����M������o��СCadd��#G ����CX[[C]]���:_Z|�_�F׮]��~�����E6�$�"]S'p �a���]�v5����@I\B!�Bk̘1000���'���,���IPP���������|lܸ���B}233q��5$%%���k׮e�<==���www��`Ȑ!ppp��͛�����HOOGVVrrr�b� ��e���D�?iiix����fV���Cqq1�/_����s�ŧ����G�b��HKKChh(RRR�m�6��'��O�����%���)BH3RPP8r�:t� �h!���ŋ��/_�9B�������˱|�r����G�^�0p�@����m۶5�������Bddd�[�n����3i�$vsA�_�?����q����/�����j�fee����x��455T�2={�l�[�N��k���eee���=zHKKý{�p��(**���A��e��o߾X�j\\\�����W�BMM��b'�c���@<|���c4T�kҼ�;�+@�HC�$.!�4#�_߿���`9GCiL<�w�gcc���8��ի��w߉��ѣ��틄�$%%�ݻw2���������˃���m�&T_�z2���"//�V�_�r���8s� ~��'p�\����Çg����VcˢM�6�kEEE��������p���Ƕ��e���� ˖-����ajj���B���Ǩ�$p(�KR�&q���r:BH3ddd�v���;�fKGG�}=q�D9FBi,ǎ�YH�.66V��2DGGc����r� Ǝ���`����<����n� �je��� �ONN�����?�����H������'N�P����� )) ����!�k� à��ZZZ�j� ����F����X^�|�A�������l���D��ĀaXZZ"""����ٳ'222��S���Ddd$��͑������ؘ�=������R7 �4?P�Y]YY���PPP���;V�X!R�eϞ=8{�,���������{�3/^����'TTT���///���@��D��g��ԩS�J�4����9s0�|U_8L�8���r���4r)�пyLK�#Z�O!�� ������o�5Fbb"f̘>�555xyy���U���������� �;˖-c�>��s��䠠� ���D���q����ttt'''��ۣw��8t�,X������ ,�9���/Α#G0m�4�ݻZZZ"��H���ݻX�h���O�i���� �ĉG�qI��q��ϟ>�///ܺuK(y[S;P�劷�7� h߾=�%��ׯ��w�BEE����>}:N�8Q�� IDAT!�ĕTwZ�W����III����M�m777����P�NZ��K��rqqApp0�ϟ���XXX4����@տY/^�.��$qo߾-�i !r4g�����; B!�Ԡ!�C.\� .��g�����_ĶݼyS�AAAB� �����}��r�w�^������ z߳gO�ް8�⳰�@qq�бE�aѢERc"���|��?Ɛ!CЧO��β�U�$�(((�0Bu�;v���|�~��N�"::AAAHOO���������&����M�mA�Ij�;^׺䟲�V����x -��� �B!�BH�0v�Xdgg���?��3 1w�\v1VM�@UR6==]��:::�p8x��{,''���8�9^XX�q�����������ooo�}�z]댌 ddd ++ YYYbc�PYYN�<�q�ơk׮�u�������Ct�ر�vR����a���a׮]r�����Q�B��BOOO���|}}k\��\EEE���� �\�R⟃�;}:�_�EEE�����ŋ�䡡�Fvv64440y�dAII QQQX�d ��ˡ��'''���bڴiغu+���~={�Dzz:���ѯ_?�ڵK��Y"""�l�2���vvvB�6660`DXX��&����v����PXXX�D���'222���.�Obb"Ο?���4<�l�W_}��|�Z� /^�y��$�_i��gϞ���@XX�����i�?���'r���* ����[[[�U�츆��pvvFRR�ޥK�j� ���055���8�|>�gҤIPRR���<<<Ր�777(++�U�V���bk�=y�w���ҥK���;;�:��tk�?�dee����ظq#455������?~\����?i^�~�˗/c��PVV���F�U�� !�Bi�;�K \�(�KEBBV�Z�U�VIM�>~�X�QI���ڱctuu����ӧO��ߟ}���&�W�~m�o߾pvvF۶m��燲�2�=::���!x<���'�.X����%%%�XEEۧm۶�k.�����:�*I�6m��)//������J�p���$�ߚ�4ϟ? ><<ӧOǻw��� �0���o�� !D�Z)Քd�p�& �!��ɓ��w��{B��5V"����PM����_}���1###9ESw9v��A���O2}h.))�ZS��vBZooo8;;�����舉'�������M---�~mZZ0x�`xxx����ƍñc���������8.�0���errrЮ];��3 S�_��k׮�A^^ڷo�����q���������}}}p8$%%�5����8rss��_�To�� !�%�u�͚І��Ҽ4t�\J���D+q[��]�bĈB�͟?�-M�aAvkkkp8��������vvwwGǎѪU+���������B�N�4���?����;���ѦM�����˗�VVT�!8{�l���0 jV���aҤI��O���ի�z�*&L�---���O���G����zzzPVV��� x<|||�������7߰���� �`ff��v��ɼŽ�����CCCBMM \.�}/X�*�~��a���"�/\���O����***�� )//���8^�x��'O��:v�ލ��<��|�ܹ...B�;v��������ell�>}�`Æ ���D\\����_��Ӿ}{<{� B�;u��Ç# ����J@|�����'����y�f�������ٳg�4?!��???ܺu�^�>|fffPWWG�Ν�g�����T 0***9r�З_����޽;ڴi===,\�P��|��7:t(���Dί�����������˅��/JKK�u��EDD������Y� 5����CX[[C]]���:_Z��_�F׮]��n?~<|}}��!�%k����%M���-Tjj*Ο?/�G��nڴil�C���?~�~�0a444p��9X[[��ѣx��%ڵk���|y666����^�Z��Y=z�@߾}������$�7=|��9��������f_+++�RU�t������%%%���M�|IZ��^}CG�����t] IR|����p8Bu� �ײ����e˖a���055m�� � 6����0`��#"���5ri.�'J�P�>h xxx��o�Eii)<�v��!99@U�����999B� TTT���:::Bǫ'ju3�eQ��C�~���v������:p���$��έ$�3 gggDGGK<�z �aÆ�W�^��>v�܉�������@�����������.���������r��������`�ʕ��֭<<<�(JBiZ� PVV���h�߿W�\�رc {{{���ر#����W}6Ԕ��:6ֆ�5l�Y\\ ---U5pd����#G�Dll, ��}�����H{������W���@P��7B!������?nܸ�:%p��MkCCC1w�\����w����ʒ�܆�PSY6t���fM�!�#G��o��������߿���߽{�-¡C�ЦMX[[#00'Nl��̄� �7��H��������-Txx8��Å�����������C�������lU��%%%���������6l���˗/�Ǐ�S|VVV�p8`۶mcw�}��5"##��nnn"��K�.�5�8P�U�666�r�(**��ݻ���3�|���ߗx���fΜ��kײǨ�!�B>�Z�j�q<==���)���R���B�.\�> U��kj�r�ػw���������_c�ݼySj{M����Sd�Fu�ⷰ�@qq�бE�aѢERc"�ccii�ӧO���}������q�����@MMM�ll,~��W6��Y�f5u�D�>\�[VV��/R�4 ��#�����S���uuu���,�g��ш��äI�������"����ٳ'|}}����!!!��xPP�Ϭz)ooo�s��n�p�� !�"m�IH�PUUe_��� ������ŭ��7�����?��TTT(�K�J����H,]�`�:u*CA!�B>]�↘��C�N������Bm�� �<�PM�m7�9��5a����022�.i��!���HMMP�)ř3g�6j#D�&L��}���msttĊ+���ccct��I�����,Y"t,99<3g���Ǐ�������B�������ѣ�����m����o޼�y���Pt��mڴ���.\(�JB���&~q�/���L <��갵�ń �j����:::�r����Eiii��!�B!U�Ζ�;y�$6mڄ�ׯc�ƍ���P�ϋ`?�� m�n�骾*�y����|��ח61#-֞={p��Y������%ARRRгgO�c={�DFFF��AII yyyPVVFll,e_SS���077Gvv6ccc�� �]������~Y�����>CLL �߿{{{�r,PVVFzz:���+V`ݺu���B!�T��]�lV�Z���ߋ��p����~* A����� 6!��%q !�#���sss����H;��o�yUUUQXX��� t�� ����:�z�@CCC8;;#))I�_M�W��\��ׯq��e���PVV���F�Ŷgee����x��455T�К={6%q !�B�a�ʕ�իBCCq���z� ����ׯ�̙�q��5�|� ������������B��)BH3�c����BWW�O����?�>--M�o� �R`` ��� ggg�m�~~~BN�$::���!x<���'�|y\_AA�A��c�_?�@�#�RӧOǻw� �a�0 LLL�㑑�"�%����Czz:޿϶�*\BHs@+q !��������3�������8q"@OOO�o}6c<:VZZZغu+ -- �ɓ'����fmm WWWt�� jjj�������'Ӹ����1c�|>������WWW��700�������p�\ 4���&K�Ү_�ݻw��� \.�{��ȑ#��:� ���%%%044Ă j=!�4cƌ��/��� ������ ���2�/ˆ����������lyy9���agg���<|�������"m(I!��O�\������Ǵ�9���P���ԝ���Ķ���ϗ��������_��.\XcMCi��r~M�'K�u�؍���ڵk���������\.���[�� !��������˱|�r����G�^�0p�@�����dS�.]ЪU+����p8���x��-m(I!��O�\���oߖǴ�9�3gBBBзo_y�B!�666����^��}��H�=z�o߾HHH@RRR�mڨ��PRR���{���BhCI����7I\�B!�B�B�j�ʕۺu�&�y!���#66V��2DGGc����r� Ǝ���`����j���p�a�P�B!�$J�B�JZ�S�e�y�@!�f۶m8~�8|||^�Di}6̔�6�$�QAA�ȑ#�С���!��JLL@^R��%�B!����������{iN~������AAA��ݻ�… 2�MJ���ѣG�J{�9B����y�@H��I$q��+��� mmmlܸ� #kY���Æ c�]�pk׮��۷����/^�miii�ڵ+@KK ���X�r%���Ɲ;w.����t�Ҧ�B!�"Q�V�diN޼yS�y...pqq8p�=^}�m(I����'N�(�Hiގ;T��:�$������l���ǚ� IDAT�ӧO���\(� T���={6����a��禦�BCC����#bccѧO�}ɒ%�իf͚�$�B!�BHC�޽;���r����w��HLLDǎ� !-����0a���'����+V�������ѩS'$'' ����’%K��%''���a�̙x��1x<x<v��������ǃ��3N�<)t~TTz��������4440w�\�OQQ������.� ___��������=z4���жm[��ڊ��".~Ydffb���PWW���-&L��Y�f������޽;ڴi===,\����������q;;;������@�JJJ�С0|�p�Nj:v�[[[�ٳ��qB� 0@h�RC�����3�9044���8��Ci����`jjZ�1|}}�p����B!�B���M�&{����5k���c$&&��OII��ҳgOddd ,, ������@FFf̘�����DFF�����[^^���dhhh���>DXX޿��V>����tdee!''+V�`� �����򐟟��7BQQQdq������}�����c��?^�]SS������p��m?~\(�-���b���_ptt�u|�����۷E�6 ������i����_�%�0>z���puu�w�BH�z��*++�!�"��$q���`nn�������7�*�.]��U�V066���) ��p��󑕕����c�ƍ��Ԅ��:p��q�|UUU"##���PSS��.�~��/_Ƃ ��� �5J����{� ��쌤��Z�s��]����s�ε:O ��|��{���%��������nݺACCx���Hi��> 333����s��"��SSS1`������ػ�����������&� �N�b(�&�\DTHɸ�*R�<�S����ZvAS�R!!�~�(�ɱ4�4 �FD��kxK������3����pQ����ǃ�k��k���Zk�w`` �߿ϖi����� `ҤI0`����ʵ���^����>}��!�ַ24����@�[/��Z�r����1v�X���cڴix�wtn'!��Q***�a��;vvv0`���q��Y0 ���B!]ۉ���kkkX[[���HJJb?���(�+��$F٬Y###��=z�[�n&O��>ϝ;��7{|JJ F������� x��^b����0 ���9C�СC���P(�H$�Ν;u�������z����I�,,,p���]B�E'N�@AA*** �H�r�J�}���?v��͛��>�w����s�Я_?�}:���� ��� �q��_XX�#G�����n�RZ/NS����AS����޷6d��V���>���"��mo�h�~QQQ���@CCV�\��G���FB!Dߪ���������c���x�7���?n޼��7���� �ҥKq���.����-��������v�[K6i�]�t⺤W{���Ky2tib����������f򴵵Uط=��x<���2 �~���������j3+����O>��������������� <��հ���z#"KVWW���0dgg#88<III ���077GSSS����g����Mi{SSLLL(�!��v�%&&bժU����Q5�mۆ��6y��� �N�����ٳ�~~~(..f������ccc�3N��T.{롸�fff���d$&&*��=4ŧ�}��ڸw����}���c�С���l�y��֋�Ǫ�~������_��w����^^^���nS|�BH{���#77YYY�����W>��iӦ!22���(,,Ğ={����D��k�b�ڵpttDdd$�������ŭ��IO��]㯨��իW����kܯ��Oy�t�L\�@�P�P>�KKK��l�+W�G��[o������7o�Dmm�>�f����'OFrr2�>�ʯK�����ׯz���ٳ�N�cjj ???lذ��͸t�>̖߿���puu��CUU���`�qvvFSS�����?~��������ٴ�=�T*ņ p��1$''+��ʕ+9r�α�,��ւ�L|ܾ}�s�n� A�4�#ߩgll��������Z�h�?^S9���AS|���޷6�K_o}��u�O*����i|k���::!fG��o]�f��OSS���k������8v������� H�R�ٳaaa���pwwGjj*�_���������۷/����r�J >���X�z5���:,vm��]]]!�1n�8899a֬Y �v�-�$���^^^X�x1�MӒP�X�Iے\�]ҩ��k�-~},�Eyvt�L\y���Z;4)--Euu�ʲ�c�b���:t(�|>�/_�����q�PYY���Z ''�������Toff&/^������� � � 1o�<444���#::ZeRM�k������hXZZ������l���=֭[???�������Ǐ׹����ĉ���R(���o����1|�p�jC� �����ܐ��WWW�:���{�Y��V\�Z��"�J��\��ٵ�D_�������76�i���Ԟ�q}k�������}^7�>}��a�����j888�.Bȳ�f�M�����o��ܹs8t������M###L�2��� ��扁������퍍7�ĉ��o�o�>\�t �.]²e�пP���=�L266ƙ3g�e�������6m֬Y�U�Vh�?0s�L���k�����'OF`` ��}v�X,���1���```����X�|��d���������W��=����q��a8;;�����-[������񁃃9�_XX���|0 777ddd��s�~@�V1�Z[������B� �&�Ypp0���,?? ,�x���`�ꫯP[[��� �~��'H$455������� eg�~��ט?>�Ν;llj��%v�؁۷o�Ν;�z�*^}�U��K�,Ayy9���/TWW#55ʗ����D" p����㏰��W(_�d ���O�:u ����ݻwc۶m:׳`��ڵKi{hh(�Q�'��ݩ1�,먄��f��7!��م�t���m�}�e�]G'�,//���/<==1c� �YH���ʿ��o̚5 7nDII ہ�b� ܺu G��ܹsu^:������ضm������Þ�ƍ��������/~��W���K����H���b����ש�T� &`�ر �\ys�.Q�>q˖t�ѣ�ҒX�h\��G!@7��%ݛX,FUUΟ?��soذqqq �z?7!O���X��J�� ��� {{{�D"���J����?u�Tl޼ .�@ ��� �0��������#!!�M��5���DKK  �@��� ���+�cff����#44�����^�h������QXX������Jo}ȿ�" ��_p>��q� ������[�B$aʔ)������ɓ'aii��˗cʔ)2����$�ԔPhBH�� /_����:�Y��sۺKBFu #5]. );:af\\ ���z���) ��R�d�>qkZ�#��Cw��ҽt��H�f``��'Ov�Cwbb";K�,88X�v�,�g�^�R�̙3 �7oެ�yɒ%��v��r�[�$%%!))I�~�Ƨ�}��� ��%�g�q����ʹ]�o�������짟~�xnm����ǹs���ӦMSx�$�t��$�ԖP�= !e���م��[��}E\:#!����\���K�϶�]ijj����q��%���AAA�������J��ܹ� 33G�E~~>��󑘘�.���K/�mQ����(((@VVrrr����"22&&&HNN�����ۑ��;� .K&�w�WVV�O�>:�1}�t���`��鈋�Cnn.ݖ�j˒M�$б��eڳ�����"�<h&�S��?Vzx� ������vvv�V!�<�~��v����b ���"��� 1��kOBH���.Ԧ32v��ÎN�Y[[ �aԶ����@ @TT���[TUUa���2e ����[[[����سgہ�0 Ξ=���d 0&L��M�p��m899���Cqq1~��W���[:w�r�eɤ��tH�R444��/�`����ܶm~��g����$T[�l��%���M4.Ӟ%���X���f�By����{jˆ�יD���2�������7nĈ#�:,B�Z��S���&���6���Z�3!c{f��}�� 3������P]]��~Y����w�ޭ�x����s����9sPSS���l�ٳ�N�Bnn.rss!�0 ����D�������DDD��ť�b�(���^^^����K/��e˖�e�$򶲲—_~���`x{{���Ek"o@s"qM�$�no"�N4(.���܌իW�k|k��K|m�����u�By�i��%�cƌ�1cFW�A�3C ��k� 1�iǎ�������Ƅ�J�����aذa8p���1u��N��S;����=z��](?����W�sk"���>��s�p��i�%#ڊ����}'����������������v��9�}�4155���6l؀-[�����ƬY����$���Fbb"q��-dgg#++ gΜ�0�{�.�����p�����ݽK��d���>��s�eږDZ�v���'��ݻ�g.KB�g�&m�k�N\���%�d�-�-~},�EyvP'.!�t#�פ������&!�{�%H���uB�*66� RY&K�YYY���`�bj�=�ev�f���Mff&bbb`ii��c��5!#��i��ّ@�g�:�---�����@�ru�w����Я_?,Z��-�D"��0j�(xzz���V $��=t�N�1c� 99��ՕP(ģG�P]]ݦ������6k�,�D"���vWyyyX�f Ο?�@���*����C� ��J����{�=xyy�<���/�y���8��~���GJJ �^���V�ߴi����x��p�B�W7�f��*---�裏�8BHG�r�JW�@��S���&�4�.�i���H�؞ه���w�0S$���������h���/���H$jS�Զ�%�!���w�WEE�^�������Y'������ |��*���?`jj���L����̙3J�u8���fJ��K�.����U�=E�ɿ.)[���t����K�Ci�_~��{��s�=�&d��k焴�>�|�x�b�!��D�6��3f���i�0{�l��ӧOcժU�^۶m����OawwwL�4 k֬ѩ�͛7㣏>BEELMM1k�,�]���Щ����z,Z����Ǐ���/��>��� �����1w�\�������!� ��G�*�����yxx`̘1�r� ��� >��������W�"66���;���гgO�,�\����?���p����Ç��˃����rM�z�*\\\PYY�vl]�p>>>����������f�~��7j�122B߾}����'N࣏>�Ν;�ٸq#��┎�t�����{���ݾl�2̛7�S�\]]��䄲�2466b���غu+��k�ϟ6\>5������'�8���� �������B:¦M���k��/!ݘ���4{�B!]��t�jr�� ������X�r����׮]c; uaff���8;;���>>>ppp@bb"���b1���QVVDDD`Ŋ���:,�R)���q��*�����k����a���!##�}�=""�&M?��S�N! cƌ�������q��a8;;���---��5�ذa=z4�����k�h}�.,,�Sn[���)u�666��ɓHOOW�_��srr�D"Q�����������6m֬Y�U�Vh�ϟ�… 1p�@��\>�/�u���!�B�]]=�PSB�g1a����!t���*����z��B��'�R\\��� sss$&&"77Wi����ٓ\��b8;;h]�6$$�/_�T��7p�������� ����ػw/��MLLPWW�D�OOOv��>����066F�=���ή�YRR��~� o��& ��秔u�����!����B�pM���?g�v-���|��7*gk닩����a/^��W��r���Ҿ��H���b�������/-- ���*����(�1y�dv�<�?�ꎗqqq�>�B!�۪���� 0v�X���a��HNN�ٳg���&�B�~]ډ+��t��$%%��d���ncc��ΠC����B�"�;w��Ç�QW��[��v`�D"�D"̝;��7��SRR0j�(����w��HHHP���z���~mhh���f@MM x<�B�){{{�c�\ K0���\��###q��%�������066�ĉ��������lMMM077W�V[[�� �v����>�$����J���������ŋ*�i�~������‚��#�B!�;���FZZƏ���7���?� �y�&6n� 4K�.�����2�^JJ "##� "n�B!lmm���4}\�߿Æ kӱ�ҙ�t9����������&�����f��J����ѩ�/|�a~����!,, �����CRR�߿�p��������˗/k\#T]�`nn�O>�@��N???���v�ZZ}���0hlld;)����r����?��ʹ����������QZZ����s�3�p{�={nnn ������Ԥ����'���Ԏ�si_ee��ײD8�~�v�܉w�yGe��ΝÐ!CT��3>}�|655���Pi� �_��xR�/���w�yG)��… akk���~�C�'�B�ӫ������������ޟ��|L�6 ��� Daa!��ك��,H$�]�k׮���#"##�����̙3ѣG��Cg\�?��#�]t�L\�@�P�P>�KKK��|�;v@*�⯿�¦M��t�ѣG㭷�RY������q��)�����Gss3\]]���PUU�}��)������c���HNNFcc#���G��T?��������7c�gϞ:���0b�6y�D"Q����i+��={6���K�߿���:����c��ݑ����ׯ������:�����b�\�Ç���+V�^��������/��"���ѻwoxzz�Ν;l���+�b1ƍ'''̚5KaRLFFD"BBB�>�566��� �/f����#&&VVV���D||<www,]��=�B%m��_QQD"^}�U����ۍ[�n�{����fM���X��2&L���7���!����*�SZZ�0cV���֯_���Pvf���=֭[???�? ?~�N�gff�����@ @PP���9��&��񁙙\]]��ӧ�Ծ����®]������x��� l���V\������f�1�֩�o��|>111�������ѣ�2d� �Ç#??��� �666pwwlj'�ί��Ɍ;ӧO�СC! ��_��>???xyy���pttIJe��2M?fff��?�s�~\>�����ѿ��#�f̘��>�>n@�{�w�� IDAT�{��-���666�׿��0�Z���ƍ�2F;;;xzzb���j������r���B ���3f������rm0�򬩨��ɓ'�}�u��a۶m�����M��y�566";;������@rr2� kkkDGG����x��1�L����tTUU��o��X,V�f��������g���͛8v����лwo\�t ˖-àA�����w�^�$�h������J��e��/_����:�Y��-�9s&$ """4�S[[��'���6l`���b444��� 7n�@ee%V�X�S|@k�n�7 �E[�4�'KD�e�888@"�@"�`޼yz��B��D�N��<%<<<����.�����b�L��a�W׾�#G2���Vog���g��͙��h�^����w�X,f0z9_FF���*�_~�efǎ*�����8::�����d&$$�y�����œ>}��w���03g�d��-9r$����4773---L`` �|�r�s4440����D"Q���L�0Am���9ˡŊ����ٳg3>d~��W�W�^LBB[>u�T&88�illd������ ��7�ԹB�a���LbbbW��%֬Y�`RRR:d�gM[�n��� ����!C�0�����b�޽�������k���������h�w�ތ���ܿ�- e�0���������d�a���g���Ӈ122b� 8�ٲe�������b���333��Ғ7n����0 ���ߟ9y��1o����R[���G��DEE1���?�̜9S��*�h���\�~�?~<ӫW/fܸq��/���wK[|E��cG������CU�V�X�H�R�����C&''����P����1�Ǐg.\���zRRRooo��ի��Ǐ��G��|���篾��qvvV�/..�y�7�����[���3b���K��� �����v��Q����s|���w����q��=��Dw��� ��~��P���NQ�J��y��k��'�z�f&.!�m�=�m�޾}� �HЧOdggC"�࣏>���q�f�y{{��ٳJǜ={��ޜ��Vh�)����A����iiiJ˹q��i��驔K���߇X,Fzzz��gjiiA^^�ϟ�y�桡�A�|���ؽ{7F��nkO"f.���%B��~���#<���K"��H���=>B�u�n��� /��26o� �.����'O�� Lݥ})11Q�C �.-- ��ְ��Ɓ����~.))�K�������0 )���PSS�������Z6I�:�s�^o�e���ۗ�&�5�By��šo߾077Gbb���ж���0��ipR�w„ X�n=z�_~����Z���>m�� >vggg�>}���hjj��ݻ ###���#>>����W_}����K��?~�~�������0u�Tl߾���puu�ڵk���aoo�p��3g�0 �Q�xXY����b�;w�FNN��>�!s5}�t�����^PX�J>��l0�ƍ�q�N�|�p]q�OS"jB�N���BH�9w�\W���NVm��x����lvvv]�/&&!!!�������W^����܀�np���~~~����X,�z~+++69�l�Kee�R2;m���hjj�gSSLLL��}Xuu5uu5��,�C3� !O���46�CSS���d���I�5���lllp��m��/?�%#�NzgHII�����T���p|���ѣ����z�j444�޽{8v�`mm������ھ�ΎTG��,�ow��݉@ @TT�����Ѐ}��!++ Ǐ���q��A��|"""������`?��3233�����7o��trrBxx8���0t�P��ݻ;$���< 6 T�h8==����ѣ�B"d�dIŷmۆ�#G"-- ����B"�����������v��N��9>�u�r@@>�����|�p___����|"j+++��#����%���ɄKy2�:u Tf�%� �������B�Pi��܀�����'Nć~�m۶����ؾ};-Z�p�� ggg455���J�sZޕ+W0r�H��h����)��c˖-(**��Ç1k�,��C!� ��?���R�T��sm�g�ɾ�7��Q��#F��ݻw��_"<<�}��?�.��-~��k��Huh��,,,0g�̙3555���ƞ={p��)���"77� àO�>�H$����@DD\\\:-���Bv�>����h�DòD�UUUx饗!�7���������rrr��舼�<�������_"88���pqqAff&/^������� �X�x�N��K�-�(����W��… 9��K|��|>�/_����6�J!�K:q�����ZBH7p�…���A��,k� h{opw�܉y�����&&&���Ƃ ����v����ĉj׈����5v���A��lii *�k{�!�����ߎ; lڴ aaaJ�hS7;N_�_58i``�q��aݺu8z�(=z��?�o��6�������H|�:���HLLDbb"nݺ���ldee�Kܽ{���Gxx8�������%q.Y���I����>��s�e?����c׮]��y�ĉ�{�.����;v�hW|���URR�����kk�� ��W_�+>B� ]҉�� /tE���.��/�h}� m���=7���� ����4��Cf��صk��N܆����a���j�o��H$BAA�999<`?k{�!���J��߄ �����J�K0��48�iv�>�:rp���EEEprrBKK �.]����?��i�h��ׯ-Z�E�A"����5j<==a`@id!�t]҉�)�8!����k�aӦM �z �'�X���T�?cƌQ(۰a���T�&#�����?������͎�:�UUU���#'�~�mv歳��Ҳ ����>.��4����D"�?����S[6t�P���B%6#���ܓ�```��'O*��(���H�&!����t���Ӑ�B7ԉK!O9}< ��.*�����+�>���N��B�n���IB!�}�N\B!�B��; Nj�ٳ#i��������kk���.C��B!�B!��n���yyy��������틀����������#��u�L\Y�zBȳ���B!��t�5kD"��}����񰰰@jjj��������c��ٝZ/WB��=Buu�R���T{����GJJ �^��i�Ǐ���YYY�����۷���󑟟��^{ �'OFxx8BCCajj�sl�>>ppp@bb"����k��h#�_�J�066ƙ3g:�e�]�'''N�ԅ����� �H��ӦMCyy9{.�P���pDDD���]kl}��Abb"q��M��� 33?��3v�ލݻw�W�^x����K/������*,,�iB:%6#����� TMM RSSn�d7�w������w�^lݺ�-onnFQQLMMq��}\�z[�laoЁ֎���\�|uuu:uΜ9�j�),,đ#GPRR�[�n!##�-�������r�J=z�s�\���hhh@YYnܸ���J�X�B�۷o��ի�����}���Ծٳg�w�ި���� �w�^��������Bcc#�}�]���+����'O������6�СCj˯]����J������aРA���GZZ�9�P���B:ߌ3�s�N�e�O��СCajj �X�{��)���K�*l+**�H$«���?��"�"�H��6���x��ann�޽{���w���|�͛7����z����-�,Y�0� h|[�b�������������H��U�����r���B ���3f���������z������ ������ǃt��<;������ ������nܸ�#G� 55fffHNN�޽{��mۆ���-L�:��Ԅ��|����ٳ'�B!�Ν���\N������~Ûo� CCC�����ӳMm366F�=�����b@ii)~��W����022���������>�ٳg���������{~��F�.�P���\�|�S|�ʹ|�111A]]$ x<<==UN�hhhP���#q�> WWW\�v ���Ç�~���ױ~�zN��doo�E��̙3(--EBB��ݻ�|�2����3{u������W����%k�B�/���C�*�@��b�kU7��=�z�� 6 �����xhhh��� 22�}�L,cݺuX�j��� ������S{υ��e7����033$''#11Qi��?`��= ]�xQ�)))�}�����t��E��| 8Pm]...x�wԖ744p����?~�.]���1\]]Ė�r�!�ˉ'PPPb�ʕJ�oU��R7�Jm��%���9@��A+++��uv�l�+??���;�����h��<�d����ٳg����5��VG�:�n�L�<��&?/�G]�Xmm-����-����555�ꯩ���S8���^c;T�ի����!���R�<�4��5��}2��l�������Y�k׮EYY���P__���pN�i+����&%%˗/GHH�R)����駟v���t�/((���Euu5�����X,ƌ3www�x<�c�����={������Y���C���accӦs0@�c�ԉK!�\ZZ�}�]�jyyy���gΜ������@i�A�=8����� ����Y����T*�k;�sυ��u��V����$�@���077�X����ܹ�����^�?��>P!]#..�������U�V)u"�e�� m���h��i���<�"�p�̙v�CU�S�~����p��e�5Re���PVV����� <UUU���TVV��ښS�}���0hlld�Q���9�I���R)_uu5�}4�O���:���!;;�����xHJJ�����?���k�0��u677g�7+))���|}}~��������c;::���������Ư���o�����ظq#6n��H���DFF*,��Juu5��݋��L���x��1��������ɓ�M�7!�E�)BH7��/��ŋ���ǪU��ϲNE� Tqq1Ν;�Ç#''��nP����ƍ�H$���ao�4��G�5���J�$u�7��$/#?zϕ���o�% $ nܸ�7n(��-#��H������dT=������Ic]MMM011�덪,~�k.��.׏�9���`mm kkk8pIII�璒v?��ܾ}��bLII��Q��޽{#!!>�|��C�����P�H��;w�<�-�o��n�KF~�K���ܹs���wz���ֿL�<����}Dii�²Gs��Ů]�p��q�?�yyyZ;�&N��?���7***�}�v���r����#F�`���H$8u��������#G��?��Ǐq��Y�>}ZaM������hnn���+{��o�>������vD��vyyy�~�:��MxP��k���x뭷��������� n޼���Z�펎�����?��gϞ�o��P�D�>��F����#�{�=�����!==����믿������ٳ'^y��ݻ������/1m�4��%O��%��nN @(B(�����Ғ�,�5��J_7����J�hhh�_|�t�ߞ@M���s�.~�7�m�������3���:���ʕ+J|�����~~~ذa���q��%>|�-���G���?@q@F~�W�t�i�Q��u��4�֞�5��/ҙ233��҂��C  ((H!Y�ԩS�y�f,\��... ?k;w�DMM ���1j�(���b�������®]������x��� ��ƍ�H$BVV�n� �H�)S��Ծ�'O���˗/ǔ)S�_kk�&���X�n���0~�x$$$`���c����к<���� �@��lZsF������ ���������ӕ�)--m�$m�k��q�o�ر�>}:� �P���:���ݑ����ׯ������:���k׮a�ʕ>|8�  ���">>���lR�ݻwC*�bϞ= �|��' -�@!O���X 4Hi{aa!�͛�����|DGG�7P�7�������l� ������PUU��^z ˖-S(��lnn��ի�p�B�7����������rrr����y�Dff&bbb`ii��c�*���7���L,^������! �x�b���־�;wb޼y������ �������0g��ر���J@@�,www�8qQQQ*����y�k� ~zz:���aii *����B�K ������ӎ; lڴ aaaJ��=*_�]%[?����< 6 �4{K���'5��S�K��گ���ז-[PTT�Ç�k��~�_����(--ŵk�tny6�Jx*cii�;vh<~�̙�9s��2�P������;99������O?i<�?��ؼy�����Νc?O�6Ma�,@s���ɒ%�2em9^[9��$%%!))Ii���dڻ���}���g``��������ₛ7o��������ظq#N�<���L�۷�}����S�La;�۲T!O*��%��'Hpp����n�4������B���kv�,K����>��s���P7��h��� ��m������Hf��صk��N܆����a���j�o� �H$BAA�999Y!�:�BH�S7�&L���7*++̮�.O�����*>���˗����4�������? ~ҵ~������=����QPP��k�vuX�bҤI�4yɦ� IDATi6mڄcǎ���aaa*�m&�Y@���B�=��o%��������c̘1 e6l@\\���v��g�������s:^���?gW�-��t=^���������H���ڲ�C��5yՓ��� !!!hnn�@ �ƍ1bĈ��t2ccc���<���BH����Yz200�ɓ'U.%������̄B�:��aH�3f`ƌ]!�t ԉK!D��/vi��n�<�uu���n�/;;�N���?!O�gip����Z�����۷��!��*,,��t!D;��%�B!�� �.TF�_O���b@KK >��.������C �C���B!�BH;�/i��+�ta$�to����@�ő��N\B!�B!��&!�����h�\\\PXXةK��0��!��߬Y���;�tj����ǰa�4��5�x{����رcJ�.\�իWwh݄B!�BHG�N\B!�f�̙�>}z�����hnnF@@�R�ҥK���������B�cƌ��_ݮsp����'�By�P'.!�><йB!�B!�&��%���@DD�����؈w�}���m:���۱z�j���(,,D߾}fff����ݻwq��y�ݻ���urr�D"��-[����D�D�y���9s&$ """T�;{�l���555�p���݋��4�} q������֭[J��566��ɓ���W۾��:tHm��k�ڔ)7..� B}}=���p���r�X�������ƍ���Ċ+t��Bt�n�N�>��C����b����S�G����;m�����/����{����'�ܹ�����\]]!�1n�8899a֬Y*�h��B!O JlF!O������o��˃��!������٦s������`aa�n����B�!!!�|�r���555!??/^DϞ=! 1w�\���"))I!6ccc����� �x�"�|>��.�k744�)��Ǐ�ҥK066���+�����7n�ȑ#(..��� 99������t��B��ĉ(((��� �r�J��K׮]�����6�����������W��\�ڵkadd�T ccc�9s�����?{�l��ؠ���o�����1`������(((����M��5k�`ժUZ�Džl�.??���;���1k�,�\,���eee000@DDV�XA������ ��0� �:B�XԉK!�\ZZ�}�]��yyylr�3gΠ��<����1���m�K$��~��!�]�eee022B}}=����T�?��ւa����씖��ի����!�����cnn��. ܹs>D�=�����Z��}���ݺu 0y�d�\~�!�t���8�wWbb"V�Z���ؖ�-.LLLPWW�D��C��4��u�/22FF��;b��֭S�ĥ�;�o���z�G"�B�Q'.!�ts111 $$$������ ���< à����Ĭ��W8����B�gcc#LLL����xJ�������l���!))I�TY������CUUlll��������<���hjjҸOSSLLL�ց �/���j6���j���Я_?�x<\�|�@o�B�:�� �O666�}�v�Ř����˗#$$R�������O9�~�:�'�= ����J�z���* `��!�i�|AQF����� �������B��-wpp��#�����^{ ��N�˜1c�}��ӧOc޼y�}�6�=���hN�߿���puue;[��ۇ�S�*�gcc��7o���VVV��gjj��'��?Ķm�p��ml߾�-�|pvvFSS�����]�r#G�T{�ѣG# @��R������Æ �e������k������ɓ��������������v��5$�}�6�'S]]�~-�Jف(��:x�>���'Z���󃯯���=���u�O~����J��ӧM�����˗/GBB�� 1o�<444���#::ӧO�|��;wb޼y������ ����������兪�*���KX�l�N��$==��Ѱ���������ŋc�����>�B!/^�s=�B!2ԉK!�!��������+,'6l@\\��R��S7�w��yN�k��4x�M{� ����>��s����!�B�ԉK!����w�aM_����ajX�,ASA�t��H � D���bG�J�2ԋS�t���j]:S�ꈴ.��-��N���+���Q,�"Al����?��B��~=�ĪU��� �c��\Q��$.Q+2b��1��i� �� �K@2���bx�(Q��$.� �gϞ�\�-[�9j�n݊��(�K"""j>&�N�������������$.Q+�I\"""""""""�V���DDDDDԠ�3g"!!��������Fˤ����˫���8���q��A��qqqHLL4BFDDD�"��fDDDDDԠ��(XXX;�Vzz:T*���4b�-B�>}0g����!;"""z�p%.Q�uEl`` /^���xxx�������-[�@&�!44{���x7//C� �X,F`` Ə�>�@��իW1h� t��cƌAUU 772� o��6�]��L�L�����ݯ���7�����������#8p@�LFF���q�� ���a˖-�޽{C�P`ݺu����B��B���Y���{�ҥ033Cii)�޽�+V���0b��9sF�3g�`Ĉ�\�R�7n���EEEX�x�PVWx�#""�օ��DDDDD�Tdd$�����������w�_��������߇���.L�>魷ނ�� \]]����f������݃B��H$�������O�5 ˖-Cmm-~��G�1���Ċ+`cc�X���x�޽t��M�2fff011�\.GZZ�Z<;;VVV�ڵ��~����Ν�W*�:�~Zee%>�������>>>;v�׷DDDԺ�L\""""�6$)) ~�!��z���.';}�4<==��2����KKK!��U��>׳��>���C�Rܖ6 .�_��W�����������?� �1���P*�����p��A���]�t&x�����>|(|.,,l4^��sl% JKK��eee���m�vvvx��jjj���Ჲ2���i�|��_��Q��I\""""�6$::����ٳg#00�&M8;;���D�ߩS'��ա��NNN�Q���aP="�uuu�������������?�r9���_�_}�"##�o�>>|XX-��� �H�����b��u��=y�AQQ:uꤑceee��������e�^����H�����O�����#""�օ�)�!b�R�R�VVV�H$�w3�g_����ooo,_��=™3gp�� ��qrr�/�����2��ݿ?n޼ �ر#�C� 6 ˖-�رc�իW �����F||<***<>"���X]�z6l@ii)�J%��� ����������Jk�ǥK�����5>p�@���{z� X[[# +W��J�… ���� q}�GDDD� 'q�����ڨ�ӧ������� �L��۷c�����dx��ׅxjj*��� �H�׿�������z� ��'�G��J���/�~��ŋ9r$lll���ɓ'c�ĉB|Ĉ033C�޽1n�8���/j�������Ç���X,�رcq��-����Ç���={��_��������G�j�Ǒ#G0z�h���ׯ���D�q��a����C"� 66cƌQ���?"""j]x�Q�5v��!��S�N5Zo�^���?�Ǐ�vF��ӧ�ʯ]�V�lڴ��v�IHH��m��ᅬ�����O� �H�q�F����ȑ#���7Zf�ܹ���/1u�T��R������駟j}_�T6Z�62� Ǐ���ǣ��Z��O�����u�J\"""""2ȏ?��7n���p��q9��G.�����Νӈ�\�111�J�FȌ���^4\�KDDDDD�q�BCC�R� ��f���۷Y������5֣G���fi�y011AVVV�GM�������Yы���DDmDuu5������scaa!\hDD�WDD"""Z���&q[���l�����5���ť���i���ϭ-"""j��%"j#V�^�E�; ��F.�c˖-�N��������q��� �H$�N��Ŕ��;"""""�犓�DDm�… �d�c�A�b�n݊��(c�ADDDDD�ܘ;"""""2�iӦ�>x�m�����˫�23g�DBBB����j<���Cbbb��MDDD�/��%""""�V)** -Vzz:T*���4b�-B�>}0g���۷XDDDD��J\""""�6*"")))�/_��!C�@,# w��U�:T��9s� >>^�L`` /^���xxx��������kעgϞ�ر#���������Z@nn.d2�~�m\�v 2� 2� �ׯ�޲e d2BCC�w�^�� 1v�XX[[��� ,�Ç��;w.^{�5t��cƌAUU�F=k֬ALLL�c���???$''7���7�R�[�n���b�~~~�����9s�xyy9�������D��3g�����v������$.Q;3y�d >���q�С&Փ�����D\�v /^D�Ν666صk~��W�;w�w�&i{�� �B�u����� � ��f�ꍊ��B���ɓl���ނ��=�޽��~� �w�FRR�Z��/"33���(,,Ė-[�����B``���!##Ck�ʕ+(**j|��nݺ���III���T���r(�Jܸq(**��ŋ n������@DDDDԎ���������ajj������5����H���`gg'<����g�T���P���<[��_ee%:���lt��R�3f���={0o�<�����<^1����VOvv6���еkW�m��߿ѳ��Je��?|�0.\�sss���`�رB��������˃�� >>�����O n�������%"��5 "�H��W�6vZz�J�pvv�H$z!�t������K/A,c������n�����3ƥID�URR�����t̛7O������w�B$���Yx��ͭIm�d��gdd`�ȑ�J���dHIIAMMM��xZYY�����wqq�8�cǎ�gSSS�T*�zlmmm���|�W_}�G�Ɵ��gt����i����۸|�2z��������#�7���رc���q��QC988@$���NNN���"8::T���-*++-SYY KK�f�\�>���!�����4WWW�D"���@,7[�DDD�b�J\"�v����v�˜1cp��U��VVV��011����b��-�^c���뺴%//O�t'00�ǏW[ɩϥ;�i��}����˗aaa���2��O?���;����:�/..ƍ7�D�X��� 8P�����ЫW/xzz��� ,���5����}|| ��1l�0���ӦMk��mt���4iݺu�={6Ξ=�`ݺ�D�8�X �T �T +++H$ộ�<<<зo_�X�B�cǎ��ѣG�8qp��8p@������R����#L�6t9���~���?+�amm�W_}˗/����۷o#99aaa�ӯ_?TVV���Xk�K�.���[k|���x�� j���X�r%T*.\��o��V����#88��񨨨\�~]��\"""j_8�KDԆ�����w߅��;���bҤIjg���Cۥ6��.m�:u*� �R��>�Ƞ }4v�!�k�����۷ �6oތ��p�|��t��2� qqq����o��fp�*� ������FUU._��u�֩��~��-?~999�w��,Y�3�z�~~�]�4~�x���!** }��ŪU��&yuʼnHӧO�������۷��/����/fΜ�?��j�E��ܹs�۷/fϞ�W^yE�6��ܰl�2��W^����!C0q�D���R�_|�6ld2�oߎ���C&����_�)))�{�.1`����a�ܹz�<�D|8F�Ѥ�����]����#RRR��;���Çضm6mڤ׻���8v�1}�t#,, ����]XW�/��2,,,���///���A$A�T���0e���� �-[� ����t��t]����?�~�!N�8���� }���ȑ#�n�:�q"�_HHH��{��3g�h}�{��:/"{�3OKHH@BBB��h�s�ԩS��+�J�o�>��ӧO�}_�vm���Ν�/��S�NՈ)�J�߿�~���v�r���,��Ǐ �����v3H$lܸ�IuQ�ĕ�DDmН;wp��5x{{���[��]qCh�Ԧ���K[JKK!��^����tGW���2e .\����|>|���x��W�~�����׿p��M\�t ���j��t�ojj �������jGFԟ�<�0(--�+7]??C.M�ի �.]� ''G��]q"�g!��Q\\�s��i�V�\���H�R#dFDDD����DDmЄ ���� IDATp��mL�8k֬�T*E\\��T]qC4t�������( ( ���ЩS'��թM*>�]��Kw�����9���,X�P(���n�������~��9aaaؼy36oތ��h�c�M�n���[o��68��=Y���H�s�N��ꟾ?�'&O^�TSS��{�"<<ݻw�ٳg�j�*\�|...:�DD����YYY�޽�F,66֠cf����Z'q���(KKKL�:���ӧ!�H��o //O�xMM ���QWW���ZTWW����,t]����ooo,_��=™3g� v��s鎋� ���5.����]��_ﭷ��W_}���4L�>]�z>|���\�t *� ���HII���5� 6���J�_|�ƥ@����ϯ�K���`���7nn޼���d��2tʼn�����lmm5���������z�j�G><���]��d�裏�x�b��3h��0|�pc„ ��_��w�t���oߎ?��ظq#lmm�.M�7o����[k^��D�i�Ν��!z�v��i�����,N��#&&&01Ѿ ��xVV�����FW\ץ-�z��?� |?~����\�<��7o��s}.��տ����T*śo����'�D"���5�XX�0��y�f����ʍ9��y��h럮�_c�&�Z���V��%*� ����N�����Z'q���U���aoo��_~yyy8~�8�.]j� �����/6x�9Qs�ҥ &M�d�4�� 2��)�9��%"�V�ƍ �J��X,ƚ5kзo_c��7___\�~k׮������!�6jĈ<3������$.�J���0vM��Q�Qvv��S """"""=q���H���QUU�l�5g]D/������; 2fDDDDD��$.���^��-2vD/�]�va׮]�N��������q����H$�\Gs��%j�,,,бcGc�AMdeee������^��%"2�� bɒ%�\�ҥK�ue�… ��'����|����9s���8y�$���aee�.]��o߾�>}:Ǝ�������ԩS����\������ǔ)S�}�v�իW���٢�2��;7}�D^زe�3�CDDDDD��q�����ɓ'����ك������\H$�g�Ľv��.lڴ ����Tok�<Ɠ������Z7N�Q��������-[&L8&&&��W_ţG�p��:tb����ڼy�Ƴ�[����;D"�3�ߚ:����M�puu}��Q�31vDD�b�2e D"D"�;������b�����,\�C� ��a�0}�tlڴ +V�P�oǎ>|8���ann�:@&�!&&�o�n0��-�VVV�2e ��͛8v��\�9�ɓ'���;v�ĉq�Νg��i?���x� t�����prrBxx8~����)))�ѣ,--���o���Ǐ�o�����O������3""""""ҍ+q����"##QRRpqqH�R��䠬�  àA�0h� XZZj�q��Y�|���x饗��O��իW�G����ӱm�6�W����7�khh(jkk���;���PWW����&�񴯿�o���ܹs{��Ezz:��ك���ƍ1c� ���?����0t��I�^Cdz!�����3"j>;w�4v D&M�d����� N�Q�YXX��ѣ�ӧn޼ ��v�#G�����}����;���%��ñt�R��� u���"&&F���ѣGX�p!�/_��7obϞ=����Q x���`gg�R�]�v���':t蠑���/���Q]] ooo�o���04�'���bΜ9������)v�؁����o���I����1c@��N$a��͘0aRRR0w�\�� φr3���5fDԼ"##������:c�@DD�fp����lɒ%5j�:G���g�b������DYY���[�nũS����+�"1b222�a�������Byyy�g�J��۷:t�������!!!شi�J%���������X �X�����>DII d2�Ay<���~BQQ ������p���8t� ��� 333a��+���\����/$%%!77W�nC��i999���ƌ�ZW>Rk���DDD͏��DD�d���>����7oF]]._��`��Ũ����7p��1�����������FUU��933w��ھu��ަM�<^���$�L&>?�R�����<���9�R�T-���&|.--����������� N��;� �/CګגcFD-cǎ�N���]2JDD��b3""j2sss�g�q��׫W/��O�ԩS������;wN�����͛7QWW�����m��'�R8u����~��!!!Ax�o�>ܻwO����BihOsrr>?}�דߝ����訵l���� φ�ޓZr̈�����H\�KDD�*&&���ǤI�0h� �������سg�P�gϞ�6�:`�t���#�t��}����l���۷oGll��9�GC WWW�ȑ#™�8z�(���>>>ggg�رcرcF���7�ҥKu2� �۷�A���Ynj��������I\""jv�ϟ���������_�~��C�B"����6l�/���;w��?����{�v���GFFjLy�Btt�F���^Ο=y�$�_��wΆ�MHHN�<���pt�� fff�ԩ���p�� ���e���?"99������@������OOO�'T% ��SC��Ws��+q���AK�.�ҥK5�o۶ ۶m�����/|}}�ng���8u���iӦ�}?r�H�����h���-�]�v59��������ݻ�x|Z߾}q��a��_-���燗^zI�Ӑ�l(7C�{�cFDDDDDD�q%.�sv��M <���x��aoo� &��Ç���ƚ5k^����Zڙ3g0a�a烵�5���ɓ'��o�mr�S�L�H$�H$B~~��gDDDD�W�=g����0aΝ;�۷o������ ğ��g����/t{DD-��ɓ@MM��������Enn.$ Ǝk� �����'q����3WWW��������ZҲe˄ ���D���x���\��C�A,7����{O8��յY�%"""j�!!! Aaa��Ο?{{{�D"t��?��������ɓ��� 8;;#** W�^m� ""�����DDDDD�J����2`�������Q]]��݉'��ɓ���Bee%RSS�v4�.?��3���P^^WWWdee����}��aȐ!رc�ܹ�N�:��ݻغu+ ��/6��DDD���8""""j�v�܉�; j�{�=9r555�����w�,--��K���ݽ�wǍ���T�\.ǎ;�����[�⭷���vnn.fΜ���2t������'����f�BMM �������C&��?������c���8x�`� � `�Νϵ=N�Q[�I\"�6���P\\�7n9����/����}�v�"##����F��ٳg�|�rdff��� P]]��[��ԩS��ͅ���ƻ�ӟ`jj x�w�c���Ç��ĝ:u*~��7t�� G�A׮]�����?�=z��3g 1�H���Bmm-����_���,Q�i������)))HII1n2D��ٳg��=^^^�4i���h����Gc�����͛QWW�˗/���X�x1***p�� ;v ����9::6���ݻz���o����#�P���T�\TT���"��kkkQQQ��{����.]��]""���I\"�6���\�,�H�� Q�*//�v���� CXX���h��Wz�׮]�������իz��˗/c�ڵ����7�����ѳgOP۵��ncp��Q���cƌHII����I('�˱e��;��ԯt&""�gǿ��Ç�7�|�� bɒ%�N���lݺQQQD"D"����'Nh�'�2#"""""�珓�DD�B�}�6������ѥ��C�R!((H��X,Fll,>��#��^�zyyy7nq�����E��b� ܻw�Er'"""""��q�������@JJJ����@,^�!!!������;rss�� <�-�x����ƍ���-�������kעgϞ�ر#���������Z@ZZz��OOOxyya�����F\\�𾏏�r9� �޽{cڴi���һ���刎����$ fΜ���j����]nݺ��b���!""s���k| �f����h<>|8&O� 777���s�Έ��Gpp����...���Crr��y۶m�PWW���:xzz;"""�&�$.�������k׮��ŋ�ܹ�Z�ʕ+(**�xo�ҥ033Cii)�޽�+V���T����`׮]���_q��9�޽�ׯ�*� ������FUU._��u����ÇB�[�n���������{��d���%�ˡT*q�� ����/�;]��%&&ݺuCyy9��������5>����@VV ��i���8w��� ddd 33yyy������#66�|�^���c*++q��a\�p�������رc���}dgg��� ]�v58ǧY[[7������>x���������p\�KDԆ%%%������HOOǼy�����jee2Y��X�p! ���P���c��٨���9r$�R)d2RRR����^��̄�ZSSS�#��������z�VXX�L&�L&Ì3������(++C]]�ڪ�W8�}۱��m��+++����� ���������C.��޽{�Ν;�H�y���u�m]]����c ���ЩS�s���S뇫�+D"rrr � ��Y988@$���NNN��[?)�,��t*++�9_8s� |}}5�WVV����������;""""j��%"j��b�0yiee�D�Tڤ���� ��z����v튎;:t�����J����D"����w�^�=ڠ�7l؀7�|��/�wqq���9�;ṻ�;����O?�����~�:�\�"��X����1����ʕ+�n�:�����o�ŴiӚu|�����JkL�?z�555P�T���j����M���֢���7o���q��i�6.]�ooo��"���� �����m�$.Q;1}�tt�֭��_�~%%%�/^��Y�fA�T��� o��&&N�pssòe�777H$���+���Ç���&L�_������ >��S���A�R!11qqq���T̟?�������T*U[��X���_�� h�D����c̘1B������ ��ѣG1u�T���_��+++���G����ݻ������8t�|||4�8r����D���� 2��;w;""�6���DD�DHH��ءC�t���b���$$$h}��xXX���v�������9r$>���F�7o�͛��\"�`�ƍM��IM�� x|����Dž���񨮮6�}]�Ν�/��Rc7,,L�h�'yzzj�=I�Tb������O�9O"jY;v�0v DM>��������fDDDm�\.Gqq1Ν;��u�\�111M>��������� W��&&&���j��O���ppph�z������H?��%"�V-;;��)4�իW�X�vvv-R���K��KDDDDDD��q DDDDD�$iii���j��̙3�������?<��\�����!11�%S#""�W�Q����������0���t�T*��E�ЧO̙3���-��(������� ���@JJJ����@,^�!!!������;rss�� <�-R{��� �L���~׮]�L&�L&����2[�l�L&Chh(��ݫ�~ZZz��OOOxyya�����F\\�P������ppp�D"�̙3Q]]�ч���ǭ[�����X ???DDD`Μ9B|�ڵ�ٳ':v�ggg$$$�����v֬Y����g����8???$''�.�-��%"�g���ͣ������ǨQ� ������χH$�H$������p�� �z���������D\�v /^D�Ν��W�\AQQ�ڳ޽{C�P`ݺu����B��B���Y��2QQQP(�bbbЭ[7���#)) ���jq�ڵ ���+Ν;�ݻwkL��RQQ���,�=�g��!##���Q������h��iuѶ�V,#66�o�����|��ի���Fjj*q��ix{{ qn�%��DFF�_�~� Q�T�H�/��2,,,���///���A$A�T��~Cff&���`cc���Gll,>��gί���ƅ `nn�;V��\.>K�R���"''Ǡv���aee��]��c�����>h��DDD�6p%.Q;�V�Ӗ��`ܸq������=�������>���m`���>���X�j�Z��q�ڟ��$8::������7o��=??_��L&3J�����fff&<���Eaa! 88X�oˌ3���7K�eee���S[u�� 䌌 �9R�2� )))���1�[[�g����<0�m"""j[8�KDD^���K�.���JKKq��]�X�B�Е�>��ݶ)|}}q��9��܎KԾDGG#;;��� ��,|z�V$5��H����g�V]]]\]]!����#������҆��D"JJJ�gO~�w���ñ`�@�P ::����ڢ��Rk\�񫬬���%w��s��%""��i��J�R�J�g��vڂ�dffbŊ����X,F||�w��%�#r����}�$.Q���.\� @hh(���1{��f�r�"m��WYY�`]܎K�~M�>���M~����j�T�4d�L�8=z�T*�_|!Ć �L��۷c�����dx����n755>���'�b1Ǝ�[�n�_c6l؀��|H$���b̘1B��� ˖-C@@^y�̞=����m899a���8z�h���Ưޑ#G0z�h��&""�����a��� ̞=����4i���Y�lk�N+�,gkk��>� ����������]H�TOn�urr�x�m��`��mw�܉���D"̛7UUU��k��!Μ9��d ���_!!!Zc���~c����`ӦM �N�:�����0���6o�,<�Ls�D��7>S~���d8~���=>>^�����$$$4��'͝;_~�%�N��kl���}ۿ?>���g΃���^l\�KDԆ��������͛7;vt������i �m=z���j�T*@uu��j���Z���b�ʕ8x� ���5��v\""���(..nґ6+W�DLL �Ri dFDDD/��%"j'�O��nݺ5�}}��ZYY��+fϞ ��vڢ�"�������v�BϞ=��~��MMM������鉪�*H�R̟?_�_�x�f͂R�����|�ML�8Ѡ��a���曐H$�߿����nnn�H$ϼ���Z_��Z���ЧO�sw�w�����СC����h��q������YYYM���qF=�O��%"j'��vZ}�����m��´U����1܎KD���ի[�n;;�&�����̙ы��)�ϲ�Vn�%"""""z�q%.Q+�,�mu�v\"""""�'q��� �������DDDDDD/6�@DDDD� 4H�<��?��Ot��������5v:����?<��l�ܹ�ڵ+���!�ɰf�!����H�H;;;�ĉ����!11���'"""��%""""�زe������ <۳��t�T*�=�����ݻѽ{wdee!222� &L�\�z���HMME`` N�> ooo!�h�"���s�́���s�Q{ĕ�DDDDDmXDDRRR��8q=z􀵵5�r9~��7�2�ƢE�Ԟu���}��Fل����;��kעgϞ�ر#���������Z��?�TUU ��۷R��=���#::�H$�9s&�����'N�L&�/�����~2� ���/,,�رcamm ''',X�>T�700�/FHH<<<�����\����W�^��􄗗,Xkkk����5>��u����!���燈�̙3G�76~�X�f bbb4��\�� ���-&L��?�����ʘ���s�Έ��Gpp0V�Z�wqq������ ΋��� �I\"�v����:T��Ak �J����"��iii���z�:fΜ����fʈ���ѣGq��qܾ} �}��F�+W����H�و#p����gΜ��#666صk~��W�;w�w���������ꊌ� ����TL�:&&���"�ˡT*q�� ����/��ݻ ��:u�Ν;�P(�&�z�-�����ݻ�駟�{�n$%%i䜜����D\�v /^D�Ν*� ������FUU._��u��iL74>����A�n�P^^���$dff��?}UTT ++ ��������D^^� �����/Ν;��<((H��HDDD-���DDԮݾ}YYY�N�͋���ĉ��=%&&�;w���-bcc�g��2J�R�qON�5 ˖-Cmm-~��GaW.��_�~��,44999BQQQHMMTWW#-- QQQ���dffbŊ����X,F||�������>>>;v�Z]㧏��lXYY�k׮Z����a֬Y��q㴖�����;��߿��]"""j^��%"j'Zb;m�m۶�o߾���ڵ�ƶʫW�bРA�Сƌ��}V�vѡC�b�ܹx���ХK��u�um�}V��o��l��7��n�-))��q�`kk {{{���������\�d2���۸v�d2d2��J0mۑ`˖-��d �޽{ ���< 2b����?~�E/^����L��磰�P�}]q]�q�Cc��꟮��������K�.���JKKq��]�X�B���ݻ7 ֭[( ( ̚5K�mۑ����P(0y��&��ԩS1t�P(�J|��G8p���}$j����������l��?�?9iYRR"|.--����^�������+���+DFF�ѣG8|��� �޽{ǂ PPP�B���h��� uxxx���{��Ejj�� \]]!����#��SPP�����spp�H$Bqq�𬨨���e =N��>4U}~O�����?}��ڢ��Rk<..������KK�F�:s� |}}5�WVV����FDDD��$.5y;-����Ftt�p뵓�F��V歷ނ�� \]]���>^��K�.�����܈���0��%"j�Zz;-�x�k�n�-cgg'|677�J���]�cǎ�gSSS���?�v\}5����5�]�y�p�B 0��������ٳ��%V�vd}h���R�D���޽GEy�y��p@t*H EQ$� �!�VP�+f6��h����oIJE"j-a�1z��B�H�6����bF�k� ��Ƒ����6�a`@��眞3�����y5X>��v��1umѢE��g��燑#GB.�c�ڵm����v�����X,���fϞ���*��;r�Hlٲ �3f�@BBf̘a0FLL Ο?�I�&����F[[��� �H��� �׽�~444����&MBDDV�XarS�?]ٻw/JKK!�J������!f��늓����q����w����ᅬ/������������/_��n�ر;v,N�8���|ḋ���� �񖈈�z���&DD��Z�p!���  �ܹs@���>N <S'���EEE������ ������H�6S�NEdd$���!�ɐ��n��>>>���8t�222 ��1s�L��ggg���R���n����� 0v��^;117n��q���ȐH��W%"�?}�����⣏>BVV����شiRRR�jժ^� Po�G�͙3R���_�T*�����)� ���D�v��HDd���=���&L���'���.�w�==��������K�. g.���������}�ѓ���~�z�1ww�nᆭ�+//Gxx8�Z-$ v�� ��N�������b���ȈΊ��dDEE!**J��G}�G�� q���jkk��ω���*��=ODO�iӦa���X�xq_��!�L������v������RSS)����C.����#�CDDDO'q������o����c���}� ������}� `�o���������?�8���<������DD�����Y*��a&D�Wss3@,���!z\��كK�.!..���=�?��?�?�j�X�n�,Y"Ŀ�����(**��/��O>�VVV�ݻwcǎ�}�6���1�|lڴI�oڴix��q��5|��7x���wonn�o�������x�������Ҳ������,�Y����HHH������]�w��u,Z�_�5�L����C.� �;˿���'O�ڵk�`��k���T�?��W�GDDDO��CD4@L�>��_��U�Va�ƍ}��c��G!66�� KDԹ9s栶������cxzz����������+��EEE��χN�Ô)S��wW*�077Gyy9����u��a��͏r�����������:�/&&��� ������ٳ ‹/�(��,kkk���Epp0|||����7n� ""���Y_'@DDDDD�ˈ#�v�Z|��7HOO������ / ** MMM&���b�… 899a֬Yzm/^ ggg�1 �%%%BL�T������i���Q\\��?::��氰�����^��╕����Ejj*lll �H�R�p�ȑ�ݨGd,���R|��Wx뭷0h� ( ��� �L�ҤI���~����]��v��ӇE\""""�gԴi� � ���0���ǤI�0j�(�~0i���j�3��6vvv�gsssh�Z�{NN���!�� �˱�~ܿ_���!C�σ ���Y��� �\�\�%K�����b,����D" >\��9R�lj� ,@UU|}}1nܸǹ"""z�x��3����^��>rrrp��A|����կ~�;v����䱝��Q^^ޣ�����ꫯ���� �H$BRR�޽ۣ�~nĈ�D(..�D"1�N$t:���I:t(t:ZZZ`kk ����矐�����?}��J�cϝ�����%"";v����/��ԩS�W�\� 6<�Ԉ��J��>�n݊ٳg�֭[����V�,Y��������F������ݻ�j����H$Bmm-�=��u�����`�T*�����ʐ����������8{�l��m WWW�?YYY�Z���)�����ҥK���@vv6V�Xap�==X�%"�g���ǡ�j��*%%���&��HD4�%%%���;���:��ٙY�fa���X�r%$ &L����J���9[�l�B���3����3f�(c������777H$������B���� �mۆ��H$���{&�����\�C�!##r�3g�4���C�p��L�2�����/ir��/_�[o����l 2S�NŪU�0w��^��LDDDO�S "zFDEEaΜ9X�x�p��ի ������f��r��5k�t�R�ƭ��Ò%K�� � ¸q��駟B"��4��ݻ�c�ܾ}��֘?>6m����Db������/q��Uܿ_��ej��v�B\\\�kpvv���/233����aooo���+ظq�I��]EE,X�K�.a„ 1b�{�n�}�7��������>��XZZvk"��daa�+����"66���Ϗrh���.99���dS�w�J�طo����%%%!))��v?��_t�*?\�p�h������v�{뭷��[ou��_܉KD� ����Z�ƞ={��� �Z �Zmr�Pp���GCCRSS1h� �Ƿ�������/^đ#G���a0Off&6l؀�7o���Æ 39��� 00��:������c4~�� ��Ԙ|_����a̘1hnnFZZ����J����娬�DMM ֭[��y������h��N\""z$���hjj�Z����;|}}����/Y��dGqq�A���hxzz���)._� +++�=�h� &��w�1�h4ݚZ[[q��i\�r������Bhh����Dnn.JJJ`ccP�THLL��͛�==�ׯ7sww� Ĉ���ױ�KD4����a�ڵ���GSϟ?77�G�cժUx��w���zDGG����7�Qܜ�lڴ �����hnnFtt�A���z���Qx��1vvv�s��߿�k�766B��aذaµaÆA��������B����W�&"�ǧ�".���".��p�B�����s��.��D��t=����Vx�Kii) �v!��� ���*>���0�D"$%%u���Hd4��򷵵Ekkk��hmm���e�p���"�uuuprr�� a{{{��# �P\\�����3q��0�D�L�L+++H�R��O_��䄪�*466v{���<ܺu 0d���������ݻ�j����H$Bmm-�=�������������5:Ƶk�0q�D��ɓ'�����V^���P(ؾ};�Z-�\��'NqC�R /�)++387��������m,�=#-Z�)S�t�:u*"##����L���t��-**���?lll��兘�DFF�4�ȑ#�e�( ̘1 �1cF���U�NNN���ƙ3g����g�a֬YF�eee����vn{��Eii)�R)����F[[��� �H����n�CDDDDDD�S "zF�����������=799Y8g�'��???���[�b8�y���4 ���m�6��{�b3��Y�����w�J�{�� ߥR)���ף�����cǎaժU�~���6��񰳳Cjj�̌������DD�LP*�����ŋ b۷oG\\d2YdFD�l���5x�������q'.��۷����^^�ߙ��������%&&�����""���كK�.!..�������U������Gss3�r9`͚5X�t) ++ k֬Acc#0}�t���cǐ���V �X���0�޽����*�L���o��rrr��?��^�|KK�G�DDDD� ��DDdTgEܧ���]�ם���X;w�|bs�Ԝ9sP[[���X <qqqX�`M�����Z��q ������E|||�ch�Z\�zӧO�ݻwq��u���bǎ4h�J%���Q^^333���`ݺuؼy�#������?�q DDDDD�gĈX�v-����������x�����'��/~� XXX����ƍ�ȑ#!���hPYY���\�������*� G�y"�=i,�=��M��H�H�?���y���1i�$�5 ������Hn� ��b��b�ڃP]] �\.�\.ǒ%K�XnDDDDO�S """"zF�?������GNN<��?���կ�c����uk|�H�N�� t:F��H��⯀:� IDATbH$�^�����?�N\""±c�0nܸ�v�v8u����+WbÆ �}~"�������֭[1{�lܺu ����.����������ث���� 88*� ---���2������s���vIII��������G��:u�TDFF���2� ���B���r��BFF�r9fΜi�����hkk���$ BCCQQQ��\�����3q���QQQؿ�޵�W�B.�cٲe�y�p�`FF������a��ٰ�����=|}}q���ǯ��Fhh(����������hkk�^^^P*���񁇇�ϟ��w��k�.���u����3|}}���it���HII1y��***�D___DEEa���B��� .����R)���q�޽n�CD�$YXX��8fff8x� q��m$$$�/��j����hii�Z�F^^ ""B�U����E��z�� > �J�o�>|����s��_��e˖�J�DDDD� ��DD�0��j�ٳ���P��P��X�t��clڴ b����hhh@jj��2S�_�x1�����Ѐ/��G�AZZ��(,,Dqq1����q�F�xKK h4Ϡ� ����߸q555&��]\\ƌ���f���<ʫT*��hP^^���J���`ݺuݞ��������],��#���DSS�j5D"|}}aeeeR���V���㭷�����!�ɰd�|��'z�^�u��b���A�T�رcz�˗/��� �G�6:ׄ p��E�q�Fc�Sٔ�O�>�7�|������Bhh����Dnn.RSSacc�D�J�#G�tk""""""z���KD4����������8~�8����便��2ǪU�0i�$������ ���I}���Gc��G444赳��>K�R����ckk��\vvv�s�ɹ��=�aÆ �~����,%�d������ |�N����� "<<������@̝;� �"�:��Gs���������B�P J���� �P[[ '''@MM �������� :� ����N�lmm���e����3���:!���:��ìY������PWWg���ݻ����J�HLLDHH�^<;;mmmpss�D"Ahh(***�==�x��3",,�h��� �Ѹ���HNN�Mg��d2��裾NO��� 0v�X�Xbb"6n��Y����(�߿��عs����kkk(�J|���m������bp����gφ��-������;w��ݻw��Ð!C0|�p$''����0}������q��᷿�-����r�J�����J%|||��������ݻ&�;++ r����8z��A|ڴiX�b^y��5 !!!z㗔�`�ԩ�H$ Ĝ9s��;�t:�L����,���y����s���… P(���2i����ĉ'��� �F����.��ju��)(�J������fff�����u�L���J\\ƌ���||�������;z�������wp'.�3*..Æ ���-��'���h4�䵴�DSS�j5D"|}}aee%ĕJ%<==<<�6<<���B���,,,���q��a�ȑ�Dzg�������033�R�ıc�zq�@tt4���aaaooo���x�����X�z5�b1�O�??���~���������ә��J���"55666�H$P�T8r�A[c�~�imm��ӧ��o���^^^ ���DDD�;X�%""""`������GGG?~III����R�ݰaÄ�NNN���oM�cժU�4i���aoo���ܿ_�������2� r����׋������µ�#���^�,�JQ__ߍ�е!C����j����Dz�租�C.�wx���ә��j@pp�p�’%K��?�(ǟkll�N�3���=?�q DDDDD�… HHH@`` �Ν >|�Ю��N�\__'''�簵��{�(--�B�@@@�J%����ꫯ���� �H$BRR�Ig��t:�sMM���C���DB��Ͻa�С��tz�����������L�?"�H�~�1bD"���!�H��SW �PWW������㞟��� q'.�?~�_��;�q��u�&>>��ɏ5����:u���ʕ+�aÆ�:7Qo�H$��d��d����T*���z�}����������?��Ox��W ƚ>>���8t�222 ��1s�L�����FAA�R)�}�]̜9��v��z�N����H���C&�!==]/���6���A"� 44c����޽{QZZ �T���D�����M�����z����)@��?ƔJ��.++��}7nܨ�[�jU����x����n߾}ׯ]������ 2D��K/�fΜ�[�f��:u�^����o��7�+���[�v�nΜ9�1c��d2��믿��t:ݟ��'�����_��_tÆ ���7��i�Z�N��}��׺ѣG���źѣG�F��۳g�0�_����ѣu�D����� ���*]HH�N"���KNN�=x�@/���ӽ���:ݬY�t����8�����?����t:��ٳu[�n5�2eJ�~-oݺ��1c�nȐ!:�k���KHH�MMM� ����uvvv���8�ݻw�=�@�����S*�}� Q���L�m'N�egg�u�ٳg�o���i��7�xC�ϧ� �ߏDD������W_��<==M�������N\"�g\LL �O�����]����='336l�͛7QTT$�����1���;\�xG�AFF���j�{�쁫�+�j5�j5�.]*� �Z�����]�x1�����Ѐ/��G�AZZ�^���"��梴�������ҋ���������F������7n��h���8�3���HKK3xU�TB�Ѡ����������u�=uϥK�P^^())Aaaa�Ok= |��3���_}����0h� ( ����h���hxzz����J�R�,������GK�����"??�/_����!�ɰd�|��'HJJ�������퍒��q._� +++�=��\&L���`�Fӣ�O�>�+W����^^^ ╕����EII lll*� ���ؼys��#""ӕ��#<<Z���v������ׯ7����]��>"""���".����&�o��ڊ��<��`�ϟGCCD"�ޛ�G�٣��ry��srr�i�&���C,������=��������wvvFCC�^�����A���j Ʊ���t.;;;ܹs��߇��E/d����w-��aÄ�������B����W�&"��._�ܧ�GEE!**��XgE܁j�Ν}��3�E\"�l�…$$$ 00s�� >"�:�---B���Yo �X�W�lii�����\�쥩� ���*>���0�D"$%%��ݻ}u:]����� ����� PSSGG�n�ckk����N۴����Ҳ� ��?󯫫򯫫���=`Ĉ�D(..�D"�y���������3q��0�D�L�L+++H�R�X,���+Ə/��V�q��Y�1���q��9���~�O?�����޽ �V ///��z��Q�vNNN���Bccc��gmm��_~[�n�?��۷o#33����������5��ڵk�8q����ɓ���owk^kkk( l߾Z�W�\��'���� ����R������[�~n. l,�=#-Z�)S�\?t�8�)S� >>���/��)))�x�"Ə���̘1��9G��-[�@�P`ƌF�O�:���pww�L&Czz����\.ǡC�����\��3g �����������4i"""�b� �s����q���m>��3̚5�h��� uuuݚ��݋��RH�R$&&"$$D/������6���A"� 44ݞ��������^Ȍ���}�6 y�-[���?DCC�^�����z��DDDx����cǎ5�%&&b�ƍ}�ѣ��������ݯ�� .����R)���������\.GUU�-[�\���\�zr�˖-�͛7!��!�ˑ��a��uuu�={6lmmaoo___ܹs0j�(|���}�����_�ڤ���{yyA�T����?���9���)))&��]EE �H��단�(,_����������".����������ugggXXX<�v��i��"�'I�TB�Ѡ����������u��ѣG�V�1t�P>|j�;v����Z�={����j�j�K�.5y�M�6A,��� HMMŠA�~~~t�������Wq�a�������hjj���nܸ������...cƌAss3��� ^ZiJ~DDD�����DDLss3����: �dž������J��梤�666�ٝ���͛7?�,--����Z www��� 1???�>}��K/!44o��&.]�??�.�7u}���:��eR*�زe ~�����ٓ3�[[[q��i\�r������Bhh��������q�����t����uDDԇ��Ұv�Z �yyy�K&ϟ?77�N�WWW����kmmm�)ێ�Z� ��.���Q__���h����������6l��F����N�BPP1j�(a����M]�����Y*�����W�����N�aÆ ׆ �Vۭ�������".�aii �T��i=1C� ������ "<<������@̝;0|�p��H$�t:�3�1"���ŐH$=�C$A�������-�{�=@ii) �T*1~�x|��w������h�}:\\\��s�a͚5y�������;���qii)�R)���ODDDw� `aaa�Ɠ�����dp]*�b߾}]�_[[k4fff��v�d����s|;�z�ja筧���� ]�o�������?���6=y���r �U*�ݻ׭���������DDDDDDDDDD�w���~�z�1www(��'� �S�E\"""""z�:+���/_~���ܹ��GDDDOq������7�|��S """�ǀE\""""�bǎ}�=,� s�����p���N���h�a�����h���_���)A$�u DDD�Y_'@DDDDDDDDDDƱ�KDDDDDDDDDԏ��KDDDDDDDDDԏ��KDDDDDF���#99����M�����w��رc7n\3{z�ԩS�W�\� 6�AFDDD���͈����Ȩ��XXXX�uO��ǏC��"((� ����^x˗/���}dGDDDO ��%""""������ ĺu�WWW�����ի���,��r�����ѣ}KJJ0u�TH$bΜ9x�w��|��7x��1x�`�����ݻ��W�B.�cٲe�y�&�r9�r9222L^W]]fϞ [[[������w���5 ���A���d��׿477c�…ppp�T*E||<�ݻ'��*����R xxx`�����~j׮]����p ������Eff��uz{{#%%Ŵ���D"���/����|�r��GDDD� ��DDDDDϰ��Llذ7o�DQQ� ��\�Z�����͛7ӦM�F���~�;|��mrrrp��q������YYY��j�ٳ���P��P��X�t��yoڴ b����hhh@jj* ���Å  �\�p~~~�R �F���rTVV����֭�vJ Q\\���&lܸQ/��҂��]GPPrrr��oܸ�����o�����a̘1hnnFZZrss�⦬�����q������a��������������>eee��?��իWC,c���Bq��/^ ggg�1 �%%%�����%����V�!���� +++�Eܗ^z [�l��p��%���������HMM��� $ T*�9]�۽�����033�R�ıc���/_���F�mt&L�ŋ��5M�g �\kk+N�>�7�|������Bhh�7u}DDD��L\""""�&-- k׮𰠗��'������pss����n�___�H$�������������Z���s�j�*���G}}=����������~~~ذa4 ���{�:u AAApttĨQ��opp�0^[[�𹺺��x���c+�JQ__�oll���m�밳�Ý;wp���^;{���:���ק����>"""�?X�%""""`.\���p@BB1w�\�����ڊD�n�?t�P�t:������ ��3j]]]�5�H$�N����`kk���L� �IDAT�{PZZ �B���(�J�?�}����?#::'O���ӧ���#F��H$Bqq1$���]�������� :� ����N���� KK�^}y���D"����~}ڋΦ�������@DDDD4�H$�d2�d2XYYA*� ���G����ꊉ'b�֭���q���;w���899��� ������[�n� >>زe BCC��;w E\C�R�����#"�ύ�*�n�޽����F�Azz:"""�➞�hmmEmm��u\�v 'N4�g��3bϟ?��~���c���������cLrr�p�oGV�^�իWx�#���6H�R�۷�h������?�񏝶Y�b8�y���4 ���m�6��5M��#��QXX(|W�T�w��ݔ�Q����DDDDD�m�.]Byy9������ ����R���Z\�x� �}�v���A&��AfDDD�4�N\"""""���r���C��B"�`׮]?~|���~�z�1www(��^��I033CAAA�GM$&&�����"""�� ��DDDDD�mQQQ���z,cwV��/._�lr[;;��;;;�V:]ڹs������z�S """""""""��X�%"""""""""��X�%"""""""""��X�%"""""̟?�����رc7n\�m��㑜��X���S� ��\�6lx�s��/6#""""�~+66�m��ǏC��"((� ����^x˗/����cˁ����+܉KDDDD4�EEEa���ׯ_���S�B"�@�P���A/>m�4�~˗/�J��k�u��!,, ���pqq�իW�w��s�=�!C�`���HNNƃW�^�\.Dze�p��M��r��rdddcgeeA.�#<<G�5ȿ�����������~��ߢ��M/�+V��W^��Q���w���k�.���ux����������퍔��qc***�D___DEEa���B��� .����R)���q�޽n�CDDD��DDDDDϠ��L�>---X�v-���{4Nff&6l؀�7o���Æ �����?�w�}��/�ȑ#B����j�{�쁫�+�j5�j5�.]*� �Z�����]�x1�����Ѐ/��G�AZZ�^���"��梴�������ҋ���������F������7n�����ԁ��8�3���HKKCnn�^\�TB�Ѡ����������u�= ��$%%��fnn��ْ��q._� +++�=��\&L���`�Fӣ�O�>�+W����^^^ ╕����EII lll*� ���ؼys��#""����DDDDDLZZ֮] �a�0//Ox9��������H��Ç }F�٣��ry��srr�i�&���C,������=��������wvv68bȐ!��A�A���ckk��\vvv�s��߿�kg��߾k� &�W]] �?=*�����=,� 0 .Dxx8 !!����;w.`����D��thii�����zc��b��gKK ,-- ��Dך���ꫯ���� �H$BRR�����yt���D"jkk���������c�Ʊ��Ekkk�mZ[[aii٫/WkϿ��Nȿ��Nxyڈ# �P\\ �D�k��Ӌg� 0�2� 2� VVV�J��w�X WWW�?^8#V�V��ٳzc����ܹs�o���~����߽{Z�^^^B�����999��� ����Z���5^~�elݺ?��n߾���LDDDtkOOO�������h�k׮a�ĉF�'O��o�ݭy����P(�}�vh�Z\�r'N��...�J�BKK ������\"""zv��KDDDD4�-Z�S�L1�~��!8pS�LA||<~��_��SRRp��E�? �1c��s�9[�l�B���3���:u*"##����L���t!����\�C�!##r�3g�����GCC1i�$DDD`Ŋ&�<,"{{{�̙3F�|��g�5k��xYY���5/�ݻ����J�HLLDHH�^<;;mmmpss�D"Ahh(***�= ��^=��q8��wD\�"۶M�ۭz�Zk�'�i�9���<6&�q����D\�`".@0 �� L�v�p�N��W�����%����{���D\�7<��~�W��D��k�ˆ�o��y��zpb�q����D\�`".@0 �� L�&�q����D\�`���Z��z|��z"���{���g�5��-�a�IEND�B`�neo-0.3.3/doc/source/index.rst0000644000175000017500000000475412265516260017267 0ustar sgarciasgarcia00000000000000.. module:: neo .. image:: images/neologo.png :width: 600 px Neo is a package for representing electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats, including Spike2, NeuroExplorer, AlphaOmega, Axon, Blackrock, Plexon, Tdt, and support for writing to a subset of these formats plus non-proprietary formats including HDF5. The goal of Neo is to improve interoperability between Python tools for analyzing, visualizing and generating electrophysiology data (such as OpenElectrophy_, NeuroTools_, G-node_, Helmholtz_, PyNN_) by providing a common, shared object model. In order to be as lightweight a dependency as possible, Neo is deliberately limited to represention of data, with no functions for data analysis or visualization. Neo implements a hierarchical data model well adapted to intracellular and extracellular electrophysiology and EEG data with support for multi-electrodes (for example tetrodes). Neo's data objects build on the quantities_ package, which in turn builds on NumPy by adding support for physical dimensions. Thus Neo objects behave just like normal NumPy arrays, but with additional metadata, checks for dimensional consistency and automatic unit conversion. A project with similar aims but for neuroimaging file formats is `NiBabel`_. Documentation ------------- .. toctree:: :maxdepth: 1 install core usecases io examples api_reference whatisnew developers_guide io_developers_guide authors License ------- Neo is distributed under a 3-clause Revised BSD licence (BSD-3-Clause). Contributing ------------ The people behind the project (see :doc:`authors`) are very open to discussion. Any feedback is gladly received and highly appreciated! Discussion of Neo takes place on the `NeuralEnsemble mailing list `_. `Source code `_ is on GitHub. The `bug tracker `_ is at:: https://github.com/NeuralEnsemble/python-neo/issues .. _OpenElectrophy: https://github.com/OpenElectrophy/OpenElectrophy .. _NeuroTools: http://neuralensemble.org/NeuroTools .. _G-node: http://www.g-node.org/ .. _Neuroshare: http://neuroshare.org/ .. _Helmholtz: https://www.dbunic.cnrs-gif.fr/documentation/helmholtz/ .. _NiBabel: http://nipy.sourceforge.net/nibabel/ .. _PyNN: http://neuralensemble.org/PyNN .. _quantities: http://pypi.python.org/pypi/quantities neo-0.3.3/doc/source/examples.rst0000644000175000017500000000043712265516260017770 0ustar sgarciasgarcia00000000000000**************** Examples **************** .. currentmodule:: neo Introduction ============= A set of examples in neo/examples/ illustrates the use of neo classes. .. literalinclude:: ../../examples/read_files.py .. literalinclude:: ../../examples/simple_plot_with_matplotlib.py neo-0.3.3/doc/source/install.rst0000644000175000017500000000611312273723542017617 0ustar sgarciasgarcia00000000000000************************* Download and Installation ************************* Neo is a pure Python package, so it should be easy to get it running on any system. Dependencies ============ * Python_ >= 2.6 * numpy_ >= 1.3.0 (1.5.0 for Python 3) * quantities_ >= 0.9.0 For Debian/Ubuntu, you can install these using:: $ apt-get install python-numpy python-pip $ pip install quantities You may need to run these as root. For other operating systems, you can download installers from the links above. Certain IO modules have additional dependencies. If these are not satisfied, Neo will still install but the IO module that uses them will fail on loading: * scipy >= 0.8 for NeoMatlabIO * pytables >= 2.2 for Hdf5IO For SciPy on Debian testing/Ubuntu, you can install these using:: $ apt-get install python-scipy For PyTables version 2.2:: $ apt-get install libhdf5-serial-dev python-numexpr cython $ pip install tables Installing from the Python Package Index ======================================== If you have pip_ installed:: $ pip install neo Alternatively, if you have setuptools_:: $ easy_install neo Both of these will automatically download and install the latest release (again you may need to have administrator privileges on the machine you are installing on). To download and install manually, download: http://pypi.python.org/packages/source/n/neo/neo-0.3.3.tar.gz Then:: $ tar xzf neo-0.3.3.tar.gz $ cd neo-0.3.3 $ python setup.py install or:: $ python3 setup.py install depending on which version of Python you are using. Installing from source ====================== To install the latest version of Neo from the Git repository:: $ git clone git://github.com/NeuralEnsemble/python-neo.git $ cd python-neo $ python setup.py install Python 3 support ================ :mod:`neo.core` is fully compatible with Python 3, but only some of the IO modules support it, as shown in the table below: ================== ======== ======== Module Python 2 Python 3 ================== ======== ======== AlphaOmegaIO Yes No AsciiSignalIO Yes Yes AsciiSpikeTrainIO Yes Yes AxonIO Yes No BlackrockIO Yes No BrainwareDamIO Yes Yes BrainwareF32IO Yes Yes BrainwareSrcIO Yes Yes ElanIO Yes No HDF5IO Yes No KlustakwikIO Yes No MicromedIO Yes No NeoMatlabIO Yes Yes NeuroExplorerIO Yes No NeuroscopeIO Yes Yes PickleIO Yes Yes PlexonIO Yes No PyNNIO Yes Yes RawBinarySignalIO Yes Yes Spike2IO Yes Yes TdtIO Yes No WinEdrIO Yes Yes WinWcpIO Yes Yes ================== ======== ======== .. _`Python`: http://python.org/ .. _`numpy`: http://numpy.scipy.org/ .. _`quantities`: http://pypi.python.org/pypi/quantities .. _`pip`: http://pypi.python.org/pypi/pip .. _`setuptools`: http://pypi.python.org/pypi/setuptools neo-0.3.3/doc/source/specific_annotations.rst0000644000175000017500000000161612265516260022354 0ustar sgarciasgarcia00000000000000.. _specific_annotations: ******************** Specific annotations ******************** Introduction ------------ Neo imposes and recommends some attributes for all objects, and also provides the *annotations* dict for all objects to deal with any kind of extensions. This flexible feature allow Neo objects to be customized for many use cases. While any names can be used for annotations, interoperability will be improved if there is some consistency in naming. Here we suggest some conventions for annotation names. Patch clamp ----------- .. todo: TODO Network simultaion ------------------ Spike sorting ------------- **SpikeTrain.annotations['waveform_features']** : when spike sorting the waveform is reduced to a smaller dimensional space with PCA or wavelets. This attribute is the projected matrice. NxM (N spike number, M features number. KlustakwikIO supports this feature. neo-0.3.3/doc/source/authors.rst0000644000175000017500000000254412265516260017640 0ustar sgarciasgarcia00000000000000======================== Authors and contributors ======================== The following people have contributed code and/or ideas to the current version of Neo. The institutional affiliations are those at the time of the contribution, and may not be the current affiliation of a contributor. * Samuel Garcia [1] * Andrew Davison [2] * Chris Rodgers [3] * Pierre Yger [2] * Yann Mahnoun [4] * Luc Estabanez [2] * Andrey Sobolev [5] * Thierry Brizzi [2] * Florent Jaillet [6] * Philipp Rautenberg [5] * Thomas Wachtler [5] * Cyril Dejean [7] * Robert Pröpper [8] * Domenico Guarino [2] 1. Centre de Recherche en Neuroscience de Lyon, CNRS UMR5292 - INSERM U1028 - Universite Claude Bernard Lyon 1 2. Unité de Neuroscience, Information et Complexité, CNRS UPR 3293, Gif-sur-Yvette, France 3. University of California, Berkeley 4. Laboratoire de Neurosciences Intégratives et Adaptatives, CNRS UMR 6149 - Université de Provence, Marseille, France 5. G-Node, Ludwig-Maximilians-Universität, Munich, Germany 6. Institut de Neurosciences de la Timone, CNRS UMR 7289 - Université d'Aix-Marseille, Marseille, France 7. Centre de Neurosciences Integratives et Cignitives, UMR 5228 - CNRS - Université Bordeaux I - Université Bordeaux II 8. Neural Information Processing Group, TU Berlin, Germany If I've somehow missed you off the list I'm very sorry - please let us know. neo-0.3.3/doc/source/whatisnew.rst0000644000175000017500000000415012273723542020161 0ustar sgarciasgarcia00000000000000************* Release notes ************* What's new in version 0.3.3? ---------------------------- * fix a bug in PlexonIO where some EventArrays only load 1 element. * fix a bug in BrainwareSrcIo for segments with no spikes. What's new in version 0.3.2? ---------------------------- * cleanup ot io test code, with additional helper functions and methods * added BrainwareDamIo * added BrainwareF32Io * added BrainwareSrcIo What's new in version 0.3.1? ---------------------------- * lazy/cascading improvement * load_lazy_olbject() in neo.io added * added NeuroscopeIO What's new in version 0.3.0? ---------------------------- * various bug fixes in neo.io * added ElphyIO * SpikeTrain performence improved * An IO class now can return a list of Block (see read_all_blocks in IOs) * python3 compatibility improved What's new in version 0.2.1? ---------------------------- * assorted bug fixes * added :func:`time_slice()` method to the :class:`SpikeTrain` and :class:`AnalogSignalArray` classes. * improvements to annotation data type handling * added PickleIO, allowing saving Neo objects in the Python pickle format. * added ElphyIO (see http://www.unic.cnrs-gif.fr/software.html) * added BrainVisionIO (see http://www.brainvision.com/) * improvements to PlexonIO * added :func:`merge()` method to the :class:`Block` and :class:`Segment` classes * development was mostly moved to GitHub, although the issue tracker is still at neuralensemble.org/neo What's new in version 0.2? -------------------------- New features compared to neo 0.1: * new schema more consistent. * new objects: RecordingChannelGroup, EventArray, AnalogSignalArray, EpochArray * Neuron is now Unit * use the quantities_ module for everything that can have units. * Some objects directly inherit from Quantity: SpikeTrain, AnalogSignal, AnalogSignalArray, instead of having an attribute for data. * Attributes are classifyed in 3 categories: necessary, recommended, free. * lazy and cascade keywords are added to all IOs * Python 3 support * better tests .. _quantities: http://pypi.python.org/pypi/quantities neo-0.3.3/PKG-INFO0000644000175000017500000000577012273723667014467 0ustar sgarciasgarcia00000000000000Metadata-Version: 1.1 Name: neo Version: 0.3.3 Summary: Neo is a package for representing electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats Home-page: http://neuralensemble.org/neo Author: Neo authors and contributors Author-email: sgarcia at olfac.univ-lyon1.fr License: BSD-3-Clause Description: === Neo === Neo is a package for representing electrophysiology data in Python, together with support for reading a wide range of neurophysiology file formats, including Spike2, NeuroExplorer, AlphaOmega, Axon, Blackrock, Plexon, Tdt, and support for writing to a subset of these formats plus non-proprietary formats including HDF5. The goal of Neo is to improve interoperability between Python tools for analyzing, visualizing and generating electrophysiology data (such as OpenElectrophy, NeuroTools, G-node, Helmholtz, PyNN) by providing a common, shared object model. In order to be as lightweight a dependency as possible, Neo is deliberately limited to represention of data, with no functions for data analysis or visualization. Neo implements a hierarchical data model well adapted to intracellular and extracellular electrophysiology and EEG data with support for multi-electrodes (for example tetrodes). Neo's data objects build on the quantities_ package, which in turn builds on NumPy by adding support for physical dimensions. Thus neo objects behave just like normal NumPy arrays, but with additional metadata, checks for dimensional consistency and automatic unit conversion. Code status ----------- .. image:: https://secure.travis-ci.org/NeuralEnsemble/python-neo.png?branch=master :target: https://travis-ci.org/NeuralEnsemble/python-neo.png More information ---------------- - Home page: http://neuralensemble.org/neo - Mailing list: https://groups.google.com/forum/?fromgroups#!forum/neuralensemble - Documentation: http://packages.python.org/neo/ - Bug reports: https://github.com/NeuralEnsemble/python-neo/issues For installation instructions, see doc/source/install.rst :copyright: Copyright 2010-2014 by the Neo team, see AUTHORS. :license: 3-Clause Revised BSD License, see LICENSE.txt for details. Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: BSD License Classifier: Natural Language :: English Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.3 Classifier: Topic :: Scientific/Engineering neo-0.3.3/MANIFEST.in0000644000175000017500000000023512265516260015105 0ustar sgarciasgarcia00000000000000include README.rst prune drafts include examples/*.py recursive-include doc * prune doc/build exclude doc/source/images/*.svg exclude doc/source/images/*.dianeo-0.3.3/setup.cfg0000644000175000017500000000007312273723667015202 0ustar sgarciasgarcia00000000000000[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0