PK;“×2EGG-INFO/dependency_links.txt PKñŠ’;ÍÒ11EGG-INFO/native_libs.txtpygr/cdict.so pygr/cnestedlist.so pygr/seqfmt.so PKñŠ’;“×2EGG-INFO/not-zip-safe PK;ˆ™>É‘‘EGG-INFO/PKG-INFOMetadata-Version: 1.0 Name: pygr Version: 0.8.1 Summary: Pygr, a Python graph-database toolkit oriented primarily on bioinformatics Home-page: http://code.google.com/p/pygr/ Author: Christopher Lee Author-email: leec@chem.ucla.edu License: New BSD License Description: Pygr ==== Pygr is an open source software project used to develop graph database interfaces for the popular Python language, with a strong emphasis on bioinformatics applications ranging from genome-wide analysis of alternative splicing patterns, to comparative genomics queries of multi-genome alignment data. Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Operating System :: MacOS :: MacOS X Classifier: Operating System :: Microsoft :: Windows :: Windows NT/2000 Classifier: Operating System :: OS Independent Classifier: Operating System :: POSIX Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: Unix Classifier: Programming Language :: Python Classifier: Topic :: Scientific/Engineering Classifier: Topic :: Scientific/Engineering :: Bio-Informatics PK;@vØ EGG-INFO/SOURCES.txtLICENSE.txt MANIFEST.in README.txt setup.cfg setup.py doc/Makefile doc/rest/conf.py doc/rest/contents.rst doc/rest/guidelist.rst doc/rest/sequences.rst doc/rest/team.rst doc/rest/whatsnew.rst doc/rest/guides/devguide.rst doc/rest/guides/libnclist.rst doc/rest/guides/testing.rst doc/rest/recipes/alignment_recipes.rst doc/rest/reference/annotation.rst doc/rest/reference/blast.rst doc/rest/reference/classutil.rst doc/rest/reference/cnestedlist.rst doc/rest/reference/coordinator.rst doc/rest/reference/downloader.rst doc/rest/reference/mapping.rst doc/rest/reference/metabase.rst doc/rest/reference/seqdb.rst doc/rest/reference/sequence.rst doc/rest/reference/sequtil.rst doc/rest/reference/sqlgraph.rst doc/rest/reference/worldbase.rst doc/rest/static/contents.png doc/rest/static/data-browser.png doc/rest/static/pygr-doc.css doc/rest/static/pygr-epydoc.css doc/rest/static/pygr-logo.gif doc/rest/templates/index.html doc/rest/templates/indexsidebar.html doc/rest/templates/layout.html doc/rest/templates/media.html doc/rest/tutorials/alignment.rst doc/rest/tutorials/annotating-yeast.rst doc/rest/tutorials/annotation.rst doc/rest/tutorials/annotation2.rst doc/rest/tutorials/compgenomics.rst doc/rest/tutorials/db.rst doc/rest/tutorials/db_basic.rst doc/rest/tutorials/develop.rst doc/rest/tutorials/gene.rst doc/rest/tutorials/graphquery.rst doc/rest/tutorials/sequence.rst doc/rest/tutorials/slice_pickle_obj.py doc/rest/tutorials/worldbase.rst doc/rest/tutorials/worldbase2.rst doc/rest/tutorials/xmlrpc.rst misc/pygrrc.example misc/debian/changelog misc/debian/compat misc/debian/control misc/debian/copyright misc/debian/pycompat misc/debian/rules misc/debian/watch misc/fink/pygr-doc.info misc/fink/pygr-py.info misc/portage/pygr-9999.ebuild misc/portage/pygr-VER.ebuild pygr/Data.py pygr/__init__.py pygr/annotation.py pygr/blast.py pygr/cdict.c pygr/cdict.pxd pygr/cdict.pyx pygr/cgraph.c pygr/cgraph.h pygr/classutil.py pygr/cnestedlist.c pygr/cnestedlist.pxd pygr/cnestedlist.pyx pygr/coordinator.py pygr/dbfile.py pygr/default.h pygr/downloader.py pygr/graphquery.py pygr/intervaldb.c pygr/intervaldb.h pygr/logger.py pygr/mapping.py pygr/metabase.py pygr/nlmsa_utils.py pygr/parse_blast.py pygr/schema.py pygr/seqdb.py pygr/seqfmt.c pygr/seqfmt.pyx pygr/sequence.py pygr/sequtil.py pygr/sqlgraph.py pygr/translationDB.py pygr/xnestedlist.py pygr.egg-info/PKG-INFO pygr.egg-info/SOURCES.txt pygr.egg-info/dependency_links.txt pygr.egg-info/top_level.txt pygr/apps/__init__.py pygr/apps/catalog_downloads.py pygr/apps/leelabdb.py pygr/apps/maf2VSgraph.py pygr/apps/maf2nclist.c pygr/apps/maf2nclist.h pygr/apps/maf2nclist.py pygr/apps/seqref.py pygr/apps/splicegraph.py tests/README.txt tests/annotation_dm2_megatest.py tests/annotation_hg18_megatest.py tests/annotation_test.py tests/blast_test.py tests/doctests_test.py tests/downloadNLMSA_megatest.py tests/graph_test.py tests/metabase_test.py tests/nlmsa_dm2_megatest.py tests/nlmsa_hg18_megatest.py tests/nlmsa_test.py tests/pairwise_hg18_megatest.py tests/pygrdata_test.py tests/restartIterator_megatest.py tests/runtest.py tests/seqdb_test.py tests/sequence_test.py tests/sqlsequence_test.py tests/sqltable_test.py tests/translationDB_test.py tests/worldbase_test.py tests/data/alignments.fa tests/data/bad_tblastn.txt tests/data/blastp_output.txt tests/data/blastx_output.txt tests/data/dnaseq.fasta tests/data/exontuples.txt tests/data/funnyseq.fasta tests/data/gapping.fa tests/data/hbb1_mouse.fa tests/data/hbb1_mouse_rc.fa tests/data/multiblast_long_correct.txt tests/data/multiblast_long_output.txt tests/data/multiblast_output.txt tests/data/partial-yeast.fasta tests/data/prefixUnionDict-1.txt tests/data/prefixUnionDict-2.txt tests/data/prefixUnionDict-3.txt tests/data/sp_all_hbb tests/data/sp_hbb1 tests/data/tblastn_output.txt tests/data/test.gz tests/data/test.zip tests/testlib/__init__.py tests/testlib/megatest_utils.py tests/testlib/pathfix.py tests/testlib/pygrdata_server.py tests/testlib/testoptions.py tests/testlib/testutil.py tests/testlib/unittest_extensions.py tests/tools/run_megatests tests/tools/send_megatest_email.pyPK; ׃™EGG-INFO/top_level.txtpygr PK%“ˆ;$büúGGpygr/__init__.pyimport sys __version__ = "0.8.1" try: worldbase except NameError: import metabase mdb = metabase.MetabaseList() # use default WORLDBASEPATH worldbase = mdb.Data if sys.version_info < (2, 6): def dir(obj): """provide Python 2.6+ style __dir__ support """ try: get_dir = obj.__dir__ except AttributeError: return __builtins__['dir'](obj) else: return get_dir() else: # Python 2.6 or later, just use the builtin dir() dir = __builtins__['dir'] __all__ = ('__version__', 'worldbase', 'dir') PKðŠ’;j´°D¨¨pygr/__init__.pyc;ò ‡ Kc@s‹dkZdZyeWn1ej o%dkZeiƒZeiZnXeiddfjo d„Z n e dZ dddfZ dS(Ns0.8.1iicCs<y |i}Wn!tj otd|ƒSn X|ƒSdS(s*provide Python 2.6+ style __dir__ support sdirN(sobjs__dir__sget_dirsAttributeErrors __builtins__(sobjsget_dir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/__init__.pysdir s  sdirs __version__s worldbase( ssyss __version__s worldbases NameErrorsmetabases MetabaseListsmdbsDatas version_infosdirs __builtins__s__all__(smetabases worldbases__all__smdbssyss __version__sdir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/__init__.pys?s    PKñŠ’;j´°D¨¨pygr/__init__.pyo;ò ‡ Kc@s‹dkZdZyeWn1ej o%dkZeiƒZeiZnXeiddfjo d„Z n e dZ dddfZ dS(Ns0.8.1iicCs<y |i}Wn!tj otd|ƒSn X|ƒSdS(s*provide Python 2.6+ style __dir__ support sdirN(sobjs__dir__sget_dirsAttributeErrors __builtins__(sobjsget_dir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/__init__.pysdir s  sdirs __version__s worldbase( ssyss __version__s worldbases NameErrorsmetabases MetabaseListsmdbsDatas version_infosdirs __builtins__s__all__(smetabases worldbases__all__smdbssyss __version__sdir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/__init__.pys?s    PKd—~;Æ.X¯lHlHpygr/annotation.pyfrom __future__ import generators from sequence import * import classutil import UserDict import weakref def getAnnotationAttr(self, attr): 'forward attributes from slice object if available' return self.db.getSliceAttr(self.db.sliceDB[self.id], attr) def annotation_repr(self): if self.annotationType is not None: title = self.annotationType else: title = 'annot' if self.orientation > 0: return '%s%s[%d:%d]' % (title, self.id, self.start, self.stop) else: return '-%s%s[%d:%d]' % (title, self.id, -self.stop, -self.start) class AnnotationSeqDescr(object): 'get the sequence interval corresponding to this annotation' def __get__(self, obj, objtype): return absoluteSlice(obj._anno_seq, obj._anno_start, obj._anno_start + obj.stop) class AnnotationSliceDescr(object): 'get the sequence interval corresponding to this annotation' def __get__(self, obj, objtype): return relativeSlice(obj.pathForward.sequence, obj.start, obj.stop) class AnnotationSeqtypeDescr(object): 'get seqtype of the sequence interval corresponding to this annotation' def __get__(self, obj, objtype): return obj._anno_seq.seqtype() class AnnotationSeq(SeqPath): 'base class representing an annotation' start = 0 step = 1 orientation = 1 def __init__(self, id, db, parent, start, stop): self.id = id self.db = db self.stop = stop - start self._anno_seq = parent self._anno_start = start self.path = self __getattr__ = getAnnotationAttr sequence = AnnotationSeqDescr() annotationType = classutil.DBAttributeDescr('annotationType') _seqtype = AnnotationSeqtypeDescr() __repr__ = annotation_repr def __cmp__(self, other): if not isinstance(other, AnnotationSeq): return -1 if cmp(self.sequence, other.sequence) == 0: if self.id == other.id and self.db is other.db: return cmp((self.start, self.stop), (other.start, other.stop)) return NOT_ON_SAME_PATH def strslice(self, start, stop): raise ValueError('''this is an annotation, and you cannot get a sequence string from it. Use its sequence attribute to get a sequence object representing this interval. ''') class AnnotationSlice(SeqDBSlice): 'represents subslice of an annotation' __getattr__=getAnnotationAttr sequence = AnnotationSliceDescr() annotationType = classutil.DBAttributeDescr('annotationType') __repr__ = annotation_repr class TranslationAnnotSeqDescr(object): 'get the sequence interval corresponding to this annotation' def __get__(self, obj, objtype): return absoluteSlice(obj._anno_seq, obj._anno_start, obj._anno_stop) class TranslationAnnotFrameDescr(object): """Get the frame of this protein translation, relative to original DNA.""" def __get__(self, obj, objtype): orig = obj.pathForward.sequence if orig.orientation > 0: frame = (orig.start % 3) + 1 else: return -((orig.start + 1) % 3 + 1) return frame class TranslationAnnot(AnnotationSeq): 'annotation representing aa translation of a given nucleotide interval' def __init__(self, id, db, parent, start, stop): AnnotationSeq.__init__(self, id, db, parent, start, stop) self.stop /= 3 self._anno_stop = stop sequence = TranslationAnnotSeqDescr() frame = TranslationAnnotFrameDescr() _seqtype = PROTEIN_SEQTYPE def strslice(self, start, stop): 'get the aa translation of our associated ORF' try: aa = self._translation except AttributeError: aa = self._translation = translate_orf(str(self.sequence)) return aa[start:stop] class TranslationAnnotSliceDescr(object): 'get the sequence interval corresponding to this annotation' def __get__(self, obj, objtype): return relativeSlice(obj.pathForward.sequence, 3 * obj.start, 3 * obj.stop) class TranslationAnnotSlice(AnnotationSlice): sequence = TranslationAnnotSliceDescr() frame = TranslationAnnotFrameDescr() class AnnotationDB(object, UserDict.DictMixin): 'container of annotations as specific slices of db sequences' def __init__(self, sliceDB, seqDB, annotationType=None, itemClass=AnnotationSeq, itemSliceClass=AnnotationSlice, itemAttrDict=None, # GET RID OF THIS BACKWARDS-COMPATIBILITY KLUGE!! sliceAttrDict=None, maxCache=None, autoGC=True, checkFirstID=True, **kwargs): '''sliceDB must map identifier to a sliceInfo object; sliceInfo must have attributes: id, start, stop, orientation; seqDB must map sequence ID to a sliceable sequence object; sliceAttrDict gives optional dict of item attributes that should be mapped to sliceDB item attributes. maxCache specfies the maximum number of annotation objects to keep in the cache.''' if autoGC: # automatically garbage collect unused objects self._weakValueDict = classutil.RecentValueDictionary(autoGC) else: self._weakValueDict = {} # object cache self.autoGC = autoGC if sliceAttrDict is None: sliceAttrDict = {} if sliceDB is not None: self.sliceDB = sliceDB else: # NEED TO CREATE / OPEN A DATABASE FOR THE USER self.sliceDB = classutil.get_shelve_or_dict(**kwargs) self.seqDB = seqDB self.annotationType = annotationType self.itemClass = itemClass self.itemSliceClass = itemSliceClass self.sliceAttrDict = sliceAttrDict # USER-PROVIDED ALIASES if maxCache is not None: self.maxCache = maxCache if checkFirstID: try: # don't cache anything now; schema may change itemClass! k = iter(self).next() # get the first ID if any self.get_annot_obj(k, self.sliceDB[k]) # valid annotation? except KeyError: # a convenient warning to the user... raise KeyError('''\ cannot create annotation object %s; sequence database %s may not be correct''' % (k, repr(seqDB), )) except StopIteration: pass # dataset is empty so there is nothing we can check... __getstate__ = classutil.standard_getstate ############### PICKLING METHODS __setstate__ = classutil.standard_setstate _pickleAttrs = dict(sliceDB=0, seqDB=0, annotationType=0, autoGC=0, itemClass=0, itemSliceClass=0, sliceAttrDict=0, maxCache=0) def __hash__(self): # @CTB unnecessary?? 'ALLOW THIS OBJECT TO BE USED AS A KEY IN DICTS...' return id(self) def __getitem__(self, k): 'get annotation object by its ID' try: # GET FROM OUR CACHE return self._weakValueDict[k] except KeyError: pass return self.sliceAnnotation(k, self.sliceDB[k]) def __setitem__(self, k, v): raise KeyError('''you cannot save annotations directly using annoDB[k] = v. Instead, use annoDB.new_annotation(k,sliceInfo) where sliceInfo provides a sequence ID, start, stop (and any additional info desired), and will be saved directly to the sliceDB.''') def getSliceAttr(self, sliceInfo, attr): try: k = self.sliceAttrDict[attr] # USE ALIAS IF PROVIDED except KeyError: return getattr(sliceInfo, attr) # GET ATTRIBUTE AS USUAL try: # REMAP TO ANOTHER ATTRIBUTE NAME return getattr(sliceInfo, k) except TypeError: # TREAT AS int INDEX INTO A TUPLE return sliceInfo[k] def get_annot_obj(self, k, sliceInfo): 'create an annotation object based on the input sliceInfo' start = int(self.getSliceAttr(sliceInfo, 'start')) stop = int(self.getSliceAttr(sliceInfo, 'stop')) try: orientation = self.getSliceAttr(sliceInfo, 'orientation') orientation = int(orientation) if orientation < 0 and start >= 0: start, stop = (-stop, -start) # Negative-orientation coords except (AttributeError, IndexError): pass # ok if no orientation is specified. if start >= stop: raise IndexError('annotation %s has zero or negative length \ [%s:%s]!' % (k, start, stop)) seq_id = self.getSliceAttr(sliceInfo, 'id') seq = self.seqDB[seq_id] return self.itemClass(k, self, seq, start, stop) def sliceAnnotation(self, k, sliceInfo, limitCache=True): 'create annotation and cache it' a = self.get_annot_obj(k, sliceInfo) try: # APPLY CACHE SIZE LIMIT IF ANY if limitCache and self.maxCache < len(self._weakValueDict): self._weakValueDict.clear() except AttributeError: pass self._weakValueDict[k] = a # CACHE THIS IN OUR DICT return a def new_annotation(self, k, sliceInfo): 'save sliceInfo to the annotation database \ and return annotation object' # First, check if it gives a valid annotation a = self.sliceAnnotation(k, sliceInfo) try: # Now, save it in the slice database self.sliceDB[k] = sliceInfo except: try: # Delete it from cache del self._weakValueDict[k] except: pass raise self._wroteSliceDB = True return a def foreignKey(self, attr, k): 'iterate over items matching specified foreign key' for t in self.sliceDB.foreignKey(attr, k): try: # get from cache if exists yield self._weakValueDict[t.id] except KeyError: yield self.sliceAnnotation(t.id, t) def __contains__(self, k): return k in self.sliceDB def __len__(self): return len(self.sliceDB) def __iter__(self): return iter(self.sliceDB) ########## ITERATORS def keys(self): return self.sliceDB.keys() def iteritems(self): 'uses maxCache to manage caching of annotation objects' for k, sliceInfo in self.sliceDB.iteritems(): yield k, self.sliceAnnotation(k, sliceInfo) def itervalues(self): 'uses maxCache to manage caching of annotation objects' for k, v in self.iteritems(): yield v def items(self): 'forces load of all annotation objects into cache' return [(k, self.sliceAnnotation(k, sliceInfo, limitCache=False)) for (k, sliceInfo) in self.sliceDB.items()] def values(self): 'forces load of all annotation objects into cache' return [self.sliceAnnotation(k, sliceInfo, limitCache=False) for (k, sliceInfo) in self.sliceDB.items()] def add_homology(self, seq, search, id=None, idFormat='%s_%d', autoIncrement=False, maxAnnot=999999, maxLoss=None, sliceInfo=None, **kwargs): 'find homology in our seq db and add as annotations' try: # ENSURE THAT sliceAttrDict COMPATIBLE WITH OUR TUPLE FORMAT if self.sliceAttrDict['id'] != 0: raise KeyError except KeyError: sliceAttrDict['id'] = 0 # USE TUPLE AS OUR INTERNAL STANDARD FORMAT sliceAttrDict['start'] = 1 sliceAttrDict['stop'] = 2 if autoIncrement: id = len(self.sliceDB) elif id is None: id = seq.id if isinstance(search, str): # GET SEARCH METHOD search = getattr(self.seqDB, search) if isinstance(seq, str): # CREATE A SEQ OBJECT seq = Sequence(seq, str(id)) al = search(seq, **kwargs) # RUN THE HOMOLOGY SEARCH if maxLoss is not None: # REQUIRE HIT BE AT LEAST A CERTAIN LENGTH kwargs['minAlignSize'] = len(seq)-maxLoss hits = al[seq].keys(**kwargs) # OBTAIN LIST OF HIT INTERVALS if len(hits) > maxAnnot: raise ValueError('too many hits for %s: %d' % (id, len(hits))) out = [] i = 0 k = id for ival in hits: # CREATE ANNOTATION FOR EACH HIT if len(hits)>1: # NEED TO CREATE AN ID FOR EACH HIT if autoIncrement: k = len(self.sliceDB) else: k = idFormat % (id, i) i += 1 if sliceInfo is not None: # SAVE SLICE AS TUPLE WITH INFO a = self.new_annotation(k, (ival.id, ival.start, ival.stop) + sliceInfo) else: a = self.new_annotation(k, (ival.id, ival.start, ival.stop)) out.append(a) # RETURN THE ANNOTATION return out def close(self): 'if sliceDB needs to be closed, do it and return True, otherwise False' try: if self._wroteSliceDB: self.sliceDB.close() self._wroteSliceDB = False # DISK FILE IS UP TO DATE return True except AttributeError: pass return False def __del__(self): if self.close(): import sys print >>sys.stderr, ''' WARNING: you forgot to call AnnotationDB.close() after writing new annotation data to it. This could result in failure to properly store the data in the associated disk file. To avoid this, we have automatically called AnnotationDB.sliceDB.close() to write the data for you, when the AnnotationDB was deleted.''' def clear_cache(self): 'empty the cache' self._weakValueDict.clear() # not clear what this should do for AnnotationDB def copy(self): raise NotImplementedError("nonsensical in AnnotationDB") def setdefault(self, k, d=None): raise NotImplementedError("nonsensical in AnnotationDB") def update(self, other): raise NotImplementedError("nonsensical in AnnotationDB") # these methods should not be implemented for read-only database. def clear(self): raise NotImplementedError("no deletions allowed") def pop(self): raise NotImplementedError("no deletions allowed") def popitem(self): raise NotImplementedError("no deletions allowed") class AnnotationServer(AnnotationDB): 'XMLRPC-ready server for AnnotationDB' xmlrpc_methods={'get_slice_tuple': 0, 'get_slice_items': 0, 'get_annotation_attr': 0, 'keys': 0, '__len__': 0, '__contains__': 0} def get_slice_tuple(self, k): 'get (seqID,start,stop) for a given key' try: sliceInfo = self.sliceDB[k] except KeyError: return '' # XMLRPC-acceptable failure code start = int(self.getSliceAttr(sliceInfo, 'start')) stop = int(self.getSliceAttr(sliceInfo, 'stop')) try: if int(self.getSliceAttr(sliceInfo, 'orientation')) < 0 \ and start >= 0: start, stop = (-stop, -start) # Negative-orientation coords except AttributeError: pass return (self.getSliceAttr(sliceInfo, 'id'), start, stop) def get_slice_items(self): 'get all (key,tuple) pairs in one query' l = [] for k in self.sliceDB: l.append((k, self.get_slice_tuple(k))) return l def get_annotation_attr(self, k, attr): 'get the requested attribute of the requested key' try: sliceInfo = self.sliceDB[k] except KeyError: return '' try: return self.getSliceAttr(sliceInfo, attr) except AttributeError: return '' class AnnotationClientSliceDB(dict): 'proxy just queries the server' def __init__(self, db): self.db = db dict.__init__(self) def __getitem__(self, k): try: return dict.__getitem__(self, k) except KeyError: t = self.db.server.get_slice_tuple(k) if t == '': raise KeyError('no such annotation: ' + str(k)) dict.__setitem__(self, k, t) return t def __setitem__(self, k, v): raise ValueError('XMLRPC client is read-only') def keys(self): return self.db.server.keys() def __iter__(self): return iter(self.keys()) def items(self): return self.db.server.get_slice_items() def iteritems(self): return iter(self.items()) def __len__(self): return self.db.server.__len__() def __contains__(self, k): return self.db.server.__contains__(k) class AnnotationClient(AnnotationDB): 'XMLRPC AnnotationDB client' def __init__(self, url, name, seqDB, itemClass=AnnotationSeq, itemSliceClass=AnnotationSlice, autoGC=True, **kwargs): if autoGC: # automatically garbage collect unused objects self._weakValueDict = classutil.RecentValueDictionary(autoGC) else: self._weakValueDict = {} # object cache self.autoGC = autoGC import coordinator self.server = coordinator.get_connection(url, name) self.url = url self.name = name self.seqDB = seqDB self.sliceDB = AnnotationClientSliceDB(self) self.itemClass = itemClass self.itemSliceClass = itemSliceClass def __getstate__(self): return dict(url=self.url, name=self.name, seqDB=self.seqDB, autoGC=self.autoGC) def getSliceAttr(self, sliceInfo, attr): if attr=='id': return sliceInfo[0] elif attr=='start': return sliceInfo[1] elif attr=='stop': return sliceInfo[2] elif attr=='orientation': raise AttributeError('ori not saved') else: v = self.server.get_annotation_attr(sliceInfo[0], attr) if v=='': raise AttributeError('this annotation has no attr: ' + attr) return v PKðŠ’;p#½Õ+s+spygr/annotation.pyc;ò |†Kc@sdklZdkTdkZdkZdkZd„Zd„Zdefd„ƒYZ defd„ƒYZ d efd „ƒYZ d e fd „ƒYZ d efd„ƒYZdefd„ƒYZdefd„ƒYZde fd„ƒYZdefd„ƒYZdefd„ƒYZdeeifd„ƒYZdefd„ƒYZdefd„ƒYZdefd „ƒYZdS(!(s generators(s*NcCs$|ii|ii|i|ƒSdS(s1forward attributes from slice object if availableN(sselfsdbs getSliceAttrssliceDBsidsattr(sselfsattr((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysgetAnnotationAttrscCsw|itj o |i}nd}|idjo!d||i|i|ifSn d||i|i |i fSdS(Nsannotis %s%s[%d:%d]s -%s%s[%d:%d](sselfsannotationTypesNonestitles orientationsidsstartsstop(sselfstitle((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysannotation_repr s  !sAnnotationSeqDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs$t|i|i|i|iƒSdS(N(s absoluteSlicesobjs _anno_seqs _anno_startsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSeqDescrs sAnnotationSliceDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs t|ii|i|iƒSdS(N(s relativeSlicesobjs pathForwardssequencesstartsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__#s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSliceDescr s sAnnotationSeqtypeDescrcBstZdZd„ZRS(sEget seqtype of the sequence interval corresponding to this annotationcCs|iiƒSdS(N(sobjs _anno_seqsseqtype(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__*s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSeqtypeDescr's s AnnotationSeqcBshtZdZdZdZdZd„ZeZe ƒZ e i dƒZ eƒZeZd„Zd„ZRS(s%base class representing an annotationiicCs>||_||_|||_||_||_||_dS(N( sidsselfsdbsstopsstartsparents _anno_seqs _anno_startspath(sselfsidsdbsparentsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__4s      sannotationTypecCst|tƒ odSnt|i|iƒdjoS|i|ijo|i|ijo)t|i|i f|i|i fƒSqˆnt SdS(Niÿÿÿÿi( s isinstancesothers AnnotationSeqscmpsselfssequencesidsdbsstartsstopsNOT_ON_SAME_PATH(sselfsother((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__cmp__Bs &-cCstdƒ‚dS(Nsàthis is an annotation, and you cannot get a sequence string from it. Use its sequence attribute to get a sequence object representing this interval. (s ValueError(sselfsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysstrsliceJs(s__name__s __module__s__doc__sstartssteps orientations__init__sgetAnnotationAttrs __getattr__sAnnotationSeqDescrssequences classutilsDBAttributeDescrsannotationTypesAnnotationSeqtypeDescrs_seqtypesannotation_reprs__repr__s__cmp__sstrslice(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys AnnotationSeq.s     sAnnotationSlicecBs2tZdZeZeƒZeidƒZ e Z RS(s$represents subslice of an annotationsannotationType( s__name__s __module__s__doc__sgetAnnotationAttrs __getattr__sAnnotationSliceDescrssequences classutilsDBAttributeDescrsannotationTypesannotation_reprs__repr__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSliceQs  sTranslationAnnotSeqDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCst|i|i|iƒSdS(N(s absoluteSlicesobjs _anno_seqs _anno_starts _anno_stop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__\s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSeqDescrYs sTranslationAnnotFrameDescrcBstZdZd„ZRS(sDGet the frame of this protein translation, relative to original DNA.cCsM|ii}|idjo|idd}n|iddd S|SdS(Niii(sobjs pathForwardssequencesorigs orientationsstartsframe(sselfsobjsobjtypesframesorig((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__cs  (s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotFrameDescr`s sTranslationAnnotcBs8tZdZd„ZeƒZeƒZeZ d„Z RS(sEannotation representing aa translation of a given nucleotide intervalcCs8ti||||||ƒ|id:_||_dS(Ni( s AnnotationSeqs__init__sselfsidsdbsparentsstartsstops _anno_stop(sselfsidsdbsparentsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__oscCsNy |i}Wn/tj o#tt|iƒƒ}|_nX|||!SdS(s,get the aa translation of our associated ORFN( sselfs _translationsaasAttributeErrors translate_orfsstrssequencesstartsstop(sselfsstartsstopsaa((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysstrslicews  !( s__name__s __module__s__doc__s__init__sTranslationAnnotSeqDescrssequencesTranslationAnnotFrameDescrsframesPROTEIN_SEQTYPEs_seqtypesstrslice(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotls    sTranslationAnnotSliceDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs(t|iid|id|iƒSdS(Ni(s relativeSlicesobjs pathForwardssequencesstartsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__ƒs(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSliceDescr€s sTranslationAnnotSlicecBstZeƒZeƒZRS(N(s__name__s __module__sTranslationAnnotSliceDescrssequencesTranslationAnnotFrameDescrsframe(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSliceˆs s AnnotationDBcBs|tZdZeeeeeeeed„Zei Z ei Z e ddddddddddddd dd dƒZd „Zd „Zd „Zd„Zd„Zed„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zededeed„Z d„Z!d„Z"d „Z#d!„Z$ed"„Z%d#„Z&d$„Z'd%„Z(d&„Z)RS('s;container of annotations as specific slices of db sequencesc Ks9| oti| ƒ|_n h|_| |_|tjo h}n|tj o ||_nti| |_||_ ||_ ||_ ||_ ||_|tj o ||_n| ouy-t|ƒiƒ} |i| |i| ƒWq5tj o#td| t|ƒfƒ‚q5tj oq5XndS(s“sliceDB must map identifier to a sliceInfo object; sliceInfo must have attributes: id, start, stop, orientation; seqDB must map sequence ID to a sliceable sequence object; sliceAttrDict gives optional dict of item attributes that should be mapped to sliceDB item attributes. maxCache specfies the maximum number of annotation objects to keep in the cache.sKcannot create annotation object %s; sequence database %s may not be correctN(sautoGCs classutilsRecentValueDictionarysselfs_weakValueDicts sliceAttrDictsNonessliceDBsget_shelve_or_dictskwargssseqDBsannotationTypes itemClasssitemSliceClasssmaxCaches checkFirstIDsitersnextsks get_annot_objsKeyErrorsreprs StopIteration( sselfssliceDBsseqDBsannotationTypes itemClasssitemSliceClasss itemAttrDicts sliceAttrDictsmaxCachesautoGCs checkFirstIDskwargssk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__s2               ssliceDBisseqDBsannotationTypesautoGCs itemClasssitemSliceClasss sliceAttrDictsmaxCachecCst|ƒSdS(s1ALLOW THIS OBJECT TO BE USED AS A KEY IN DICTS...N(sidsself(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__hash__¿scCs@y|i|SWntj onX|i||i|ƒSdS(sget annotation object by its IDN(sselfs_weakValueDictsksKeyErrorssliceAnnotationssliceDB(sselfsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getitem__Ãs cCstdƒ‚dS(NsGyou cannot save annotations directly using annoDB[k] = v. Instead, use annoDB.new_annotation(k,sliceInfo) where sliceInfo provides a sequence ID, start, stop (and any additional info desired), and will be saved directly to the sliceDB.(sKeyError(sselfsksv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __setitem__ËscCsgy|i|}Wn tj ot||ƒSnXyt||ƒSWntj o||SnXdS(N(sselfs sliceAttrDictsattrsksKeyErrorsgetattrs sliceInfos TypeError(sselfs sliceInfosattrsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys getSliceAttrÒscCst|i|dƒƒ}t|i|dƒƒ}yT|i|dƒ}t|ƒ}|djo |djo| | f\}}nWnttfj onX||jotd|||fƒ‚n|i|dƒ}|i |}|i |||||ƒSdS(s8create an annotation object based on the input sliceInfosstartsstops orientationisOannotation %s has zero or negative length [%s:%s]!sidN(sintsselfs getSliceAttrs sliceInfosstartsstops orientationsAttributeErrors IndexErrorsksseq_idsseqDBsseqs itemClass(sselfsks sliceInfos orientationsseqsseq_idsstopsstart((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys get_annot_objÜs   cCsr|i||ƒ}y5|o|it|iƒjo|ii ƒnWnt j onX||i|<|SdS(screate annotation and cache itN( sselfs get_annot_objsks sliceInfosas limitCachesmaxCacheslens_weakValueDictsclearsAttributeError(sselfsks sliceInfos limitCachesa((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyssliceAnnotationðs  cCsY|i||ƒ}y||i|g}x-|iD]"}|i||i|ƒfƒqW|SdS(s&get all (key,tuple) pairs in one queryN(slsselfssliceDBsksappendsget_slice_tuple(sselfsksl((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysget_slice_items¦s   cCs]y|i|}Wntj o dSnXy|i||ƒSWntj o dSnXdS(s0get the requested attribute of the requested keysN(sselfssliceDBsks sliceInfosKeyErrors getSliceAttrsattrsAttributeError(sselfsksattrs sliceInfo((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysget_annotation_attr­s (s__name__s __module__s__doc__sxmlrpc_methodssget_slice_tuplesget_slice_itemssget_annotation_attr(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationServers <  sAnnotationClientSliceDBcBs_tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z RS( sproxy just queries the servercCs||_ti|ƒdS(N(sdbsselfsdicts__init__(sselfsdb((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__¼s cCsyti||ƒSWnftj oZ|iii|ƒ}|djotdt |ƒƒ‚nti |||ƒ|SnXdS(Nssno such annotation: ( sdicts __getitem__sselfsksKeyErrorsdbsserversget_slice_tuplestsstrs __setitem__(sselfskst((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getitem__Às cCstdƒ‚dS(NsXMLRPC client is read-only(s ValueError(sselfsksv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __setitem__ÊscCs|iiiƒSdS(N(sselfsdbsserverskeys(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyskeysÍscCst|iƒƒSdS(N(sitersselfskeys(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__iter__ÐscCs|iiiƒSdS(N(sselfsdbsserversget_slice_items(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysitemsÓscCst|iƒƒSdS(N(sitersselfsitems(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys iteritemsÖscCs|iiiƒSdS(N(sselfsdbsservers__len__(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__len__ÙscCs|iii|ƒSdS(N(sselfsdbsservers __contains__sk(sselfsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __contains__Üs( s__name__s __module__s__doc__s__init__s __getitem__s __setitem__skeyss__iter__sitemss iteritemss__len__s __contains__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationClientSliceDB¹s        sAnnotationClientcBs2tZdZeeed„Zd„Zd„ZRS(sXMLRPC AnnotationDB clientc Ks|oti|ƒ|_n h|_||_dk}|i||ƒ|_ ||_||_||_ t |ƒ|_ ||_ ||_dS(N(sautoGCs classutilsRecentValueDictionarysselfs_weakValueDicts coordinatorsget_connectionsurlsnamesserversseqDBsAnnotationClientSliceDBssliceDBs itemClasssitemSliceClass( sselfsurlsnamesseqDBs itemClasssitemSliceClasssautoGCskwargss coordinator((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__ãs       c Cs/td|id|id|id|iƒSdS(NsurlsnamesseqDBsautoGC(sdictsselfsurlsnamesseqDBsautoGC(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getstate__óscCsª|djo |dSnŽ|djo |dSnu|djo |dSn\|djotdƒ‚n?|ii|d|ƒ}|d jotd |ƒ‚n|SdS( Nsidisstartisstopis orientations ori not savedssthis annotation has no attr: (sattrs sliceInfosAttributeErrorsselfsserversget_annotation_attrsv(sselfs sliceInfosattrsv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys getSliceAttr÷s        ( s__name__s __module__s__doc__s AnnotationSeqsAnnotationSlicesTrues__init__s __getstate__s getSliceAttr(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationClientàs  (s __future__s generatorsssequences classutilsUserDictsweakrefsgetAnnotationAttrsannotation_reprsobjectsAnnotationSeqDescrsAnnotationSliceDescrsAnnotationSeqtypeDescrsSeqPaths AnnotationSeqs SeqDBSlicesAnnotationSlicesTranslationAnnotSeqDescrsTranslationAnnotFrameDescrsTranslationAnnotsTranslationAnnotSliceDescrsTranslationAnnotSlices DictMixins AnnotationDBsAnnotationServersdictsAnnotationClientSliceDBsAnnotationClient(sTranslationAnnotSliceDescrsAnnotationSeqDescrsAnnotationSlicesAnnotationSliceDescrsTranslationAnnotSeqDescrsTranslationAnnots generatorssTranslationAnnotSlices classutilsUserDictsAnnotationClientSliceDBsTranslationAnnotFrameDescrsAnnotationSeqtypeDescrsgetAnnotationAttrsAnnotationServers AnnotationSeqsAnnotationClients AnnotationDBsweakrefsannotation_repr((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys?s*      # ÿ)'PKñŠ’;p#½Õ+s+spygr/annotation.pyo;ò |†Kc@sdklZdkTdkZdkZdkZd„Zd„Zdefd„ƒYZ defd„ƒYZ d efd „ƒYZ d e fd „ƒYZ d efd„ƒYZdefd„ƒYZdefd„ƒYZde fd„ƒYZdefd„ƒYZdefd„ƒYZdeeifd„ƒYZdefd„ƒYZdefd„ƒYZdefd „ƒYZdS(!(s generators(s*NcCs$|ii|ii|i|ƒSdS(s1forward attributes from slice object if availableN(sselfsdbs getSliceAttrssliceDBsidsattr(sselfsattr((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysgetAnnotationAttrscCsw|itj o |i}nd}|idjo!d||i|i|ifSn d||i|i |i fSdS(Nsannotis %s%s[%d:%d]s -%s%s[%d:%d](sselfsannotationTypesNonestitles orientationsidsstartsstop(sselfstitle((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysannotation_repr s  !sAnnotationSeqDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs$t|i|i|i|iƒSdS(N(s absoluteSlicesobjs _anno_seqs _anno_startsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSeqDescrs sAnnotationSliceDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs t|ii|i|iƒSdS(N(s relativeSlicesobjs pathForwardssequencesstartsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__#s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSliceDescr s sAnnotationSeqtypeDescrcBstZdZd„ZRS(sEget seqtype of the sequence interval corresponding to this annotationcCs|iiƒSdS(N(sobjs _anno_seqsseqtype(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__*s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSeqtypeDescr's s AnnotationSeqcBshtZdZdZdZdZd„ZeZe ƒZ e i dƒZ eƒZeZd„Zd„ZRS(s%base class representing an annotationiicCs>||_||_|||_||_||_||_dS(N( sidsselfsdbsstopsstartsparents _anno_seqs _anno_startspath(sselfsidsdbsparentsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__4s      sannotationTypecCst|tƒ odSnt|i|iƒdjoS|i|ijo|i|ijo)t|i|i f|i|i fƒSqˆnt SdS(Niÿÿÿÿi( s isinstancesothers AnnotationSeqscmpsselfssequencesidsdbsstartsstopsNOT_ON_SAME_PATH(sselfsother((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__cmp__Bs &-cCstdƒ‚dS(Nsàthis is an annotation, and you cannot get a sequence string from it. Use its sequence attribute to get a sequence object representing this interval. (s ValueError(sselfsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysstrsliceJs(s__name__s __module__s__doc__sstartssteps orientations__init__sgetAnnotationAttrs __getattr__sAnnotationSeqDescrssequences classutilsDBAttributeDescrsannotationTypesAnnotationSeqtypeDescrs_seqtypesannotation_reprs__repr__s__cmp__sstrslice(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys AnnotationSeq.s     sAnnotationSlicecBs2tZdZeZeƒZeidƒZ e Z RS(s$represents subslice of an annotationsannotationType( s__name__s __module__s__doc__sgetAnnotationAttrs __getattr__sAnnotationSliceDescrssequences classutilsDBAttributeDescrsannotationTypesannotation_reprs__repr__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationSliceQs  sTranslationAnnotSeqDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCst|i|i|iƒSdS(N(s absoluteSlicesobjs _anno_seqs _anno_starts _anno_stop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__\s(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSeqDescrYs sTranslationAnnotFrameDescrcBstZdZd„ZRS(sDGet the frame of this protein translation, relative to original DNA.cCsM|ii}|idjo|idd}n|iddd S|SdS(Niii(sobjs pathForwardssequencesorigs orientationsstartsframe(sselfsobjsobjtypesframesorig((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__cs  (s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotFrameDescr`s sTranslationAnnotcBs8tZdZd„ZeƒZeƒZeZ d„Z RS(sEannotation representing aa translation of a given nucleotide intervalcCs8ti||||||ƒ|id:_||_dS(Ni( s AnnotationSeqs__init__sselfsidsdbsparentsstartsstops _anno_stop(sselfsidsdbsparentsstartsstop((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__oscCsNy |i}Wn/tj o#tt|iƒƒ}|_nX|||!SdS(s,get the aa translation of our associated ORFN( sselfs _translationsaasAttributeErrors translate_orfsstrssequencesstartsstop(sselfsstartsstopsaa((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysstrslicews  !( s__name__s __module__s__doc__s__init__sTranslationAnnotSeqDescrssequencesTranslationAnnotFrameDescrsframesPROTEIN_SEQTYPEs_seqtypesstrslice(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotls    sTranslationAnnotSliceDescrcBstZdZd„ZRS(s:get the sequence interval corresponding to this annotationcCs(t|iid|id|iƒSdS(Ni(s relativeSlicesobjs pathForwardssequencesstartsstop(sselfsobjsobjtype((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__get__ƒs(s__name__s __module__s__doc__s__get__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSliceDescr€s sTranslationAnnotSlicecBstZeƒZeƒZRS(N(s__name__s __module__sTranslationAnnotSliceDescrssequencesTranslationAnnotFrameDescrsframe(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysTranslationAnnotSliceˆs s AnnotationDBcBs|tZdZeeeeeeeed„Zei Z ei Z e ddddddddddddd dd dƒZd „Zd „Zd „Zd„Zd„Zed„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zededeed„Z d„Z!d„Z"d „Z#d!„Z$ed"„Z%d#„Z&d$„Z'd%„Z(d&„Z)RS('s;container of annotations as specific slices of db sequencesc Ks9| oti| ƒ|_n h|_| |_|tjo h}n|tj o ||_nti| |_||_ ||_ ||_ ||_ ||_|tj o ||_n| ouy-t|ƒiƒ} |i| |i| ƒWq5tj o#td| t|ƒfƒ‚q5tj oq5XndS(s“sliceDB must map identifier to a sliceInfo object; sliceInfo must have attributes: id, start, stop, orientation; seqDB must map sequence ID to a sliceable sequence object; sliceAttrDict gives optional dict of item attributes that should be mapped to sliceDB item attributes. maxCache specfies the maximum number of annotation objects to keep in the cache.sKcannot create annotation object %s; sequence database %s may not be correctN(sautoGCs classutilsRecentValueDictionarysselfs_weakValueDicts sliceAttrDictsNonessliceDBsget_shelve_or_dictskwargssseqDBsannotationTypes itemClasssitemSliceClasssmaxCaches checkFirstIDsitersnextsks get_annot_objsKeyErrorsreprs StopIteration( sselfssliceDBsseqDBsannotationTypes itemClasssitemSliceClasss itemAttrDicts sliceAttrDictsmaxCachesautoGCs checkFirstIDskwargssk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__s2               ssliceDBisseqDBsannotationTypesautoGCs itemClasssitemSliceClasss sliceAttrDictsmaxCachecCst|ƒSdS(s1ALLOW THIS OBJECT TO BE USED AS A KEY IN DICTS...N(sidsself(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__hash__¿scCs@y|i|SWntj onX|i||i|ƒSdS(sget annotation object by its IDN(sselfs_weakValueDictsksKeyErrorssliceAnnotationssliceDB(sselfsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getitem__Ãs cCstdƒ‚dS(NsGyou cannot save annotations directly using annoDB[k] = v. Instead, use annoDB.new_annotation(k,sliceInfo) where sliceInfo provides a sequence ID, start, stop (and any additional info desired), and will be saved directly to the sliceDB.(sKeyError(sselfsksv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __setitem__ËscCsgy|i|}Wn tj ot||ƒSnXyt||ƒSWntj o||SnXdS(N(sselfs sliceAttrDictsattrsksKeyErrorsgetattrs sliceInfos TypeError(sselfs sliceInfosattrsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys getSliceAttrÒscCst|i|dƒƒ}t|i|dƒƒ}yT|i|dƒ}t|ƒ}|djo |djo| | f\}}nWnttfj onX||jotd|||fƒ‚n|i|dƒ}|i |}|i |||||ƒSdS(s8create an annotation object based on the input sliceInfosstartsstops orientationisOannotation %s has zero or negative length [%s:%s]!sidN(sintsselfs getSliceAttrs sliceInfosstartsstops orientationsAttributeErrors IndexErrorsksseq_idsseqDBsseqs itemClass(sselfsks sliceInfos orientationsseqsseq_idsstopsstart((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys get_annot_objÜs   cCsr|i||ƒ}y5|o|it|iƒjo|ii ƒnWnt j onX||i|<|SdS(screate annotation and cache itN( sselfs get_annot_objsks sliceInfosas limitCachesmaxCacheslens_weakValueDictsclearsAttributeError(sselfsks sliceInfos limitCachesa((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyssliceAnnotationðs  cCsY|i||ƒ}y||i|g}x-|iD]"}|i||i|ƒfƒqW|SdS(s&get all (key,tuple) pairs in one queryN(slsselfssliceDBsksappendsget_slice_tuple(sselfsksl((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysget_slice_items¦s   cCs]y|i|}Wntj o dSnXy|i||ƒSWntj o dSnXdS(s0get the requested attribute of the requested keysN(sselfssliceDBsks sliceInfosKeyErrors getSliceAttrsattrsAttributeError(sselfsksattrs sliceInfo((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysget_annotation_attr­s (s__name__s __module__s__doc__sxmlrpc_methodssget_slice_tuplesget_slice_itemssget_annotation_attr(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationServers <  sAnnotationClientSliceDBcBs_tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z RS( sproxy just queries the servercCs||_ti|ƒdS(N(sdbsselfsdicts__init__(sselfsdb((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__¼s cCsyti||ƒSWnftj oZ|iii|ƒ}|djotdt |ƒƒ‚nti |||ƒ|SnXdS(Nssno such annotation: ( sdicts __getitem__sselfsksKeyErrorsdbsserversget_slice_tuplestsstrs __setitem__(sselfskst((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getitem__Às cCstdƒ‚dS(NsXMLRPC client is read-only(s ValueError(sselfsksv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __setitem__ÊscCs|iiiƒSdS(N(sselfsdbsserverskeys(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pyskeysÍscCst|iƒƒSdS(N(sitersselfskeys(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__iter__ÐscCs|iiiƒSdS(N(sselfsdbsserversget_slice_items(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysitemsÓscCst|iƒƒSdS(N(sitersselfsitems(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys iteritemsÖscCs|iiiƒSdS(N(sselfsdbsservers__len__(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__len__ÙscCs|iii|ƒSdS(N(sselfsdbsservers __contains__sk(sselfsk((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __contains__Üs( s__name__s __module__s__doc__s__init__s __getitem__s __setitem__skeyss__iter__sitemss iteritemss__len__s __contains__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationClientSliceDB¹s        sAnnotationClientcBs2tZdZeeed„Zd„Zd„ZRS(sXMLRPC AnnotationDB clientc Ks|oti|ƒ|_n h|_||_dk}|i||ƒ|_ ||_||_||_ t |ƒ|_ ||_ ||_dS(N(sautoGCs classutilsRecentValueDictionarysselfs_weakValueDicts coordinatorsget_connectionsurlsnamesserversseqDBsAnnotationClientSliceDBssliceDBs itemClasssitemSliceClass( sselfsurlsnamesseqDBs itemClasssitemSliceClasssautoGCskwargss coordinator((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys__init__ãs       c Cs/td|id|id|id|iƒSdS(NsurlsnamesseqDBsautoGC(sdictsselfsurlsnamesseqDBsautoGC(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys __getstate__óscCsª|djo |dSnŽ|djo |dSnu|djo |dSn\|djotdƒ‚n?|ii|d|ƒ}|d jotd |ƒ‚n|SdS( Nsidisstartisstopis orientations ori not savedssthis annotation has no attr: (sattrs sliceInfosAttributeErrorsselfsserversget_annotation_attrsv(sselfs sliceInfosattrsv((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys getSliceAttr÷s        ( s__name__s __module__s__doc__s AnnotationSeqsAnnotationSlicesTrues__init__s __getstate__s getSliceAttr(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pysAnnotationClientàs  (s __future__s generatorsssequences classutilsUserDictsweakrefsgetAnnotationAttrsannotation_reprsobjectsAnnotationSeqDescrsAnnotationSliceDescrsAnnotationSeqtypeDescrsSeqPaths AnnotationSeqs SeqDBSlicesAnnotationSlicesTranslationAnnotSeqDescrsTranslationAnnotFrameDescrsTranslationAnnotsTranslationAnnotSliceDescrsTranslationAnnotSlices DictMixins AnnotationDBsAnnotationServersdictsAnnotationClientSliceDBsAnnotationClient(sTranslationAnnotSliceDescrsAnnotationSeqDescrsAnnotationSlicesAnnotationSliceDescrsTranslationAnnotSeqDescrsTranslationAnnots generatorssTranslationAnnotSlices classutilsUserDictsAnnotationClientSliceDBsTranslationAnnotFrameDescrsAnnotationSeqtypeDescrsgetAnnotationAttrsAnnotationServers AnnotationSeqsAnnotationClients AnnotationDBsweakrefsannotation_repr((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/annotation.pys?s*      # ÿ)'PKd—~;ržbVTVT pygr/blast.pyimport glob import os import tempfile import classutil import logger from sequtil import * from parse_blast import BlastHitParser from seqdb import write_fasta, read_fasta from nlmsa_utils import CoordsGroupStart, CoordsGroupEnd, CoordsToIntervals,\ EmptySlice from annotation import AnnotationDB, TranslationAnnot, TranslationAnnotSlice import cnestedlist import translationDB import UserDict # NCBI HAS THE NASTY HABIT OF TREATING THE IDENTIFIER AS A BLOB INTO # WHICH THEY STUFF FIELD AFTER FIELD... E.G. gi|1234567|foobarU|NT_1234567|... # THIS JUST YANKS OUT THE SECOND ARGUMENT SEPARATED BY | NCBI_ID_PARSER=lambda id: id.split('|')[1] def blast_program(query_type, db_type): progs = {DNA_SEQTYPE: {DNA_SEQTYPE: 'blastn', PROTEIN_SEQTYPE: 'blastx'}, PROTEIN_SEQTYPE: {DNA_SEQTYPE: 'tblastn', PROTEIN_SEQTYPE: 'blastp'}} if query_type == RNA_SEQTYPE: query_type = DNA_SEQTYPE if db_type == RNA_SEQTYPE: db_type = DNA_SEQTYPE return progs[query_type][db_type] def read_blast_alignment(ofile, srcDB, destDB, al=None, pipeline=None, translateSrc=False, translateDest=False): """Apply sequence of transforms to read input from 'ofile'. srcDB: database for finding query sequences from the blast input; destDB: database for finding subject sequences from the blast input; al, if not None, must be a writeable alignment object in which to store the alignment intervals; translateSrc=True forces creation of a TranslationDB representing the possible 6-frames of srcDB (for blastx, tblastx); translateDest=True forces creation of a TranslationDB representing the possible 6-frames of destDB (for tblastn, tblastx). If pipeline is not None, it must be a list of filter functions each taking a single argument and returning an iterator or iterable result object. """ p = BlastHitParser() d = dict(id='src_id', start='src_start', stop='src_end', ori='src_ori', idDest='dest_id', startDest='dest_start', stopDest='dest_end', oriDest='dest_ori') if translateSrc: srcDB = translationDB.get_translation_db(srcDB) if translateDest: destDB = translationDB.get_translation_db(destDB) cti = CoordsToIntervals(srcDB, destDB, d) alignedIvals = cti(p.parse_file(ofile)) if pipeline is None: result = save_interval_alignment(alignedIvals, al) else: # apply all the filters in our pipeline one by one result = alignedIvals for f in pipeline: result = f(result) return result def save_interval_alignment(alignedIvals, al=None): """Save alignedIvals to al, or a new in-memory NLMSA""" needToBuild = False if al is None: al = cnestedlist.NLMSA('blasthits', 'memory', pairwiseMode=True, bidirectional=False) needToBuild = True al.add_aligned_intervals(alignedIvals) if needToBuild: al.build() return al def start_blast(cmd, seq, seqString=None, seqDict=None, **kwargs): """Run blast and return results.""" p = classutil.FilePopen(cmd, stdin=classutil.PIPE, stdout=classutil.PIPE, **kwargs) if seqString is None: seqString = seq if seqDict is not None: # write all seqs to nonblocking ifile for seqID, seq in seqDict.iteritems(): write_fasta(p.stdin, seq) seqID = None else: # just write one query sequence seqID = write_fasta(p.stdin, seqString) if p.wait(): # blast returned error code raise OSError('command %s failed' % ' '.join(cmd)) return seqID, p def process_blast(cmd, seq, blastDB, al=None, seqString=None, queryDB=None, popenArgs={}, **kwargs): """Run blast and return an alignment.""" seqID, p = start_blast(cmd, seq, seqString, seqDict=queryDB, **popenArgs) try: if not queryDB: # need a query db for translation / parsing results try: queryDB = seq.db # use this sequence's database except AttributeError: queryDB = {seqID: seq} # construct a trivial "database" al = read_blast_alignment(p.stdout, queryDB, blastDB, al, **kwargs) finally: p.close() # close our PIPE files return al def repeat_mask(seq, progname='RepeatMasker', opts=()): 'Run RepeatMasker on a sequence, return lowercase-masked string' ## fd, temppath = tempfile.mkstemp() ## ofile = os.fdopen(fd, 'w') # text file p = classutil.FilePopen([progname] + list(opts), stdin=classutil.PIPE, stdinFlag=None) write_fasta(p.stdin, seq, reformatter=lambda x: x.upper()) # save uppercase try: if p.wait(): raise OSError('command %s failed' % ' '.join(p.args[0])) ifile = file(p._stdin_path + '.masked', 'rU') # text file try: for id, title, seq_masked in read_fasta(ifile): break # JUST READ ONE SEQUENCE finally: ifile.close() finally: # clean up our temp files no matter what happened p.close() # close temp stdin file for fpath in glob.glob(p._stdin_path + '.*'): try: os.remove(fpath) except OSError: pass return seq_masked # ONLY THE REPEATS ARE IN LOWERCASE NOW def warn_if_whitespace(filepath): l = filepath.split() # check filepath for whitespace if len(l) > 1 or len(l[0]) < len(filepath): # contains whitespace logger.warn(""" Your sequence filepath contains whitespace characters: %s The NCBI formatdb (and blastall) programs cannot handle file paths containing whitespace! This is a known NCBI formatdb / blastall bug. Please use a path containing no whitespace characters!""" % filepath) return True # signal caller that a warning was issued class BlastMapping(object): 'Graph interface for mapping a sequence to homologs in a seq db via BLAST' def __init__(self, seqDB, filepath=None, blastReady=False, blastIndexPath=None, blastIndexDirs=None, verbose=True, showFormatdbMessages=True, **kwargs): '''seqDB: sequence database object to search for homologs filepath: location of FASTA format file for the sequence database blastReady: if True, ensure that BLAST index file ready to use blastIndexPath: location of the BLAST index file blastIndexDirs: list of directories for trying to build index in ''' self.seqDB = seqDB self.idIndex = BlastIDIndex(seqDB) self.verbose = verbose self.showFormatdbMessages = showFormatdbMessages if filepath is not None: self.filepath = filepath else: self.filepath = seqDB.filepath if blastIndexPath is not None: self.blastIndexPath = blastIndexPath if blastIndexDirs is not None: self.blastIndexDirs = blastIndexDirs self.checkdb() # CHECK WHETHER BLAST INDEX FILE IS PRESENT... if not self.blastReady and blastReady: # FORCE CONSTRUCTION OF BLAST DB self.formatdb() def __repr__(self): return "" % (self.filepath) def __getitem__(self, k): 'return NLMSASlice representing BLAST results' al = self.__call__(k) # run BLAST & get NLMSA storing results return al[k] # return NLMSASlice representing these results def test_db_location(self, testpath): '''check whether BLAST index files ready for use; return status.''' if not os.access(testpath+'.nsd', os.R_OK) \ and not os.access(testpath+'.psd', os.R_OK) \ and not os.access(testpath+'.00.nsd', os.R_OK) \ and not os.access(testpath+'.00.psd', os.R_OK): return False else: # FOUND INDEX FILES IN THIS LOCATION if testpath != self.filepath: self.blastIndexPath = testpath return True def checkdb(self): 'look for blast index files in blastIndexPath, \ standard list of locations' for testpath in self.blast_index_paths(): self.blastReady = self.test_db_location(testpath) if self.blastReady: break return self.blastReady def run_formatdb(self, testpath): 'ATTEMPT TO BUILD BLAST DATABASE INDEXES at testpath' dirname = classutil.file_dirpath(testpath) if not os.access(dirname, os.W_OK): # check if directory is writable raise IOError('run_formatdb: directory %s is not writable!' % dirname) cmd = ['formatdb', '-i', self.filepath, '-n', testpath, '-o', 'T'] if self.seqDB._seqtype != PROTEIN_SEQTYPE: cmd += ['-p', 'F'] # special flag required for nucleotide seqs logger.info('Building index: ' + ' '.join(cmd)) if self.showFormatdbMessages: kwargs = {} else: # suppress formatdb messages by redirecting them kwargs = dict(stdout=classutil.PIPE, stderr=classutil.PIPE) if classutil.call_subprocess(cmd, **kwargs): # bad exit code, so command failed warn_if_whitespace(self.filepath) \ or warn_if_whitespace(testpath) # only issue one warning raise OSError('command %s failed' % ' '.join(cmd)) self.blastReady=True if testpath!=self.filepath: self.blastIndexPath = testpath def get_blast_index_path(self): 'get path to base name for BLAST index files' try: return self.blastIndexPath except AttributeError: return self.filepath # DEFAULT: BUILD INDEX FILES IN self.filepath . HOME OR APPROPRIATE # USER-/SYSTEM-SPECIFIC TEMPORARY DIRECTORY blastIndexDirs = ['FILEPATH', os.getcwd, os.path.expanduser, tempfile.gettempdir()] def blast_index_paths(self): 'iterate over possible blast index directories' try: # 1ST TRY ACTUAL SAVED LOCATION IF ANY yield self.blastIndexPath except AttributeError: pass for m in self.blastIndexDirs: # NOW TRY STANDARD LOCATIONS if m=='FILEPATH': yield self.filepath continue elif m == os.path.expanduser: s = m('~') # GET HOME DIRECTORY elif callable(m): s = m() else: # TREAT AS STRING s = str(m) yield os.path.join(s, os.path.basename(self.filepath)) def formatdb(self, filepath=None): 'try to build BLAST index files in an appropriate location' if filepath is not None: # JUST USE THE SPECIFIED PATH return self.run_formatdb(filepath) notFirst = False for testpath in self.blast_index_paths(): if notFirst: logger.info('Trying next entry in self.blastIndexDirs...') notFirst = True try: # BUILD IN TARGET DIRECTORY return self.run_formatdb(testpath) except (IOError, OSError): # BUILD FAILED pass raise IOError("cannot build BLAST database for %s" % (self.filepath, )) def raw_fasta_stream(self, ifile=None, idFilter=None): '''Return a stream of fasta-formatted sequences. Optionally, apply an ID filter function if supplied. ''' if ifile is not None: # JUST USE THE STREAM WE ALREADY HAVE OPEN return ifile, idFilter try: # DEFAULT: JUST READ THE FASTA FILE, IF IT EXISTS return file(self.filepath, 'rU'), idFilter except IOError: # TRY READING FROM FORMATTED BLAST DATABASE cmd='fastacmd -D -d "%s"' % self.get_blast_index_path() return os.popen(cmd), NCBI_ID_PARSER #BLAST ADDS lcl| TO id _blast_prog_dict = dict(blastx='#BlastxMapping') def blast_program(self, seq, blastprog=None): 'figure out appropriate blast program & remap via _blast_prog_dict' if blastprog is None: blastprog = blast_program(seq.seqtype(), self.seqDB._seqtype) oldprog = blastprog try: # apply program transformation if provided blastprog = self._blast_prog_dict[blastprog] if blastprog.startswith('#'): # not permitted by this class! raise ValueError('Use %s for %s' % (blastprog[1:], oldprog)) except KeyError: pass # no program transformation to apply, so nothing to do... return blastprog def blast_command(self, blastpath, blastprog, expmax, maxseq, opts): 'generate command string for running blast with desired options' filepath = self.get_blast_index_path() warn_if_whitespace(filepath) cmd = [blastpath, '-d', filepath, '-p', blastprog, '-e', '%e' % float(expmax)] + list(opts) if maxseq is not None: # ONLY TAKE TOP maxseq HITS cmd += ['-b', '%d' % maxseq, '-v', '%d' % maxseq] return cmd def get_seq_from_queryDB(self, queryDB): 'get one sequence obj from queryDB' seqID = iter(queryDB).next() # get 1st seq ID return queryDB[seqID] def translation_kwargs(self, blastprog): 'return kwargs for read_blast_alignment() based on blastprog' d = dict(tblastn=dict(translateDest=True), blastx=dict(translateSrc=True), tblastx=dict(translateSrc=True, translateDest=True)) try: return d[blastprog] except KeyError: return {} def __call__(self, seq=None, al=None, blastpath='blastall', blastprog=None, expmax=0.001, maxseq=None, verbose=None, opts=(), queryDB=None, **kwargs): "Run blast search for seq in database, return alignment object" if seq is None and queryDB is None: raise ValueError("we need a sequence or db to use as query!") if seq and queryDB: raise ValueError("both a sequence AND a db provided for query") if queryDB is not None: seq = self.get_seq_from_queryDB(queryDB) if not self.blastReady: # HAVE TO BUILD THE formatdb FILES... self.formatdb() blastprog = self.blast_program(seq, blastprog) cmd = self.blast_command(blastpath, blastprog, expmax, maxseq, opts) return process_blast(cmd, seq, self.idIndex, al, queryDB=queryDB, ** self.translation_kwargs(blastprog)) class BlastxMapping(BlastMapping): """Because blastx changes the query to multiple sequences (representing its six possible frames), getitem can no longer return a single slice object, but instead an iterator for one or more slice objects representing the frames that had homology hits.""" def __repr__(self): return "" % (self.filepath) _blast_prog_dict = dict(blastn='tblastx', blastp='#BlastMapping', tblastn='#BlastMapping') def __getitem__(self, query): """generate slices for all translations of the query """ # generate NLMSA for this single sequence al = self(query) # get the translation database for the sequence tdb = translationDB.get_translation_db(query.db) # run through all of the frames & find alignments. slices = [] for trans_seq in tdb[query.id].iter_frames(): try: slice = al[trans_seq] except KeyError: continue if not isinstance(slice, EmptySlice): slices.append(slice) return slices class MegablastMapping(BlastMapping): def __repr__(self): return "" % (self.filepath) def __call__(self, seq, al=None, blastpath='megablast', expmax=1e-20, maxseq=None, minIdentity=None, maskOpts=['-U', 'T', '-F', 'm'], rmPath='RepeatMasker', rmOpts=['-xsmall'], verbose=None, opts=(), **kwargs): "Run megablast search with optional repeat masking." if not self.blastReady: # HAVE TO BUILD THE formatdb FILES... self.formatdb() # mask repeats to lowercase masked_seq = repeat_mask(seq, rmPath, rmOpts) filepath = self.get_blast_index_path() warn_if_whitespace(filepath) cmd = [blastpath] + maskOpts \ + ['-d', filepath, '-D', '2', '-e', '%e' % float(expmax)] + list(opts) if maxseq is not None: # ONLY TAKE TOP maxseq HITS cmd += ['-b', '%d' % maxseq, '-v', '%d' % maxseq] if minIdentity is not None: cmd += ['-p', '%f' % float(minIdentity)] return process_blast(cmd, seq, self.idIndex, al, seqString=masked_seq, popenArgs=dict(stdinFlag='-i')) class BlastIDIndex(object): """This class acts as a wrapper around a regular seqDB, and handles the mangled IDs returned by BLAST to translate them to the correct ID. Since NCBI treats FASTA ID as a blob into which they like to stuff many fields... and then NCBI BLAST mangles those IDs when it reports hits, so they no longer match the true ID... we are forced into contortions to rescue the true ID from mangled IDs. Our workaround strategy: since NCBI packs the FASTA ID with multiple IDs (GI, GB, RefSeq ID etc.), we can use any of these identifiers that are found in a mangled ID, by storing a mapping of these sub-identifiers to the true FASTA ID.""" def __init__(self, seqDB): self.seqDB = seqDB self.seqInfoDict = BlastIDInfoDict(self) # FOR UNPACKING NCBI IDENTIFIERS AS WORKAROUND FOR BLAST ID CRAZINESS id_delimiter='|' def unpack_id(self, id): """Return |-packed NCBI identifiers as unpacked list. NCBI packs identifier like gi|123456|gb|A12345|other|nonsense. Return as list.""" return id.split(self.id_delimiter) def index_unpacked_ids(self, unpack_f=None): """Build an index of sub-IDs (unpacked from NCBI nasty habit of using the FASTA ID as a blob); you can customize the unpacking by overriding the unpack_id function or changing the id_delimiter. The index maps each sub-ID to the real ID, so that when BLAST hands back a mangled, fragmentary ID, we can unpack that mangled ID and look up the true ID in this index. Any sub-ID that is found to map to more than one true ID will be mapped to None (so that random NCBI garbage like gnl or NCBI_MITO wont be treated as sub-IDs). """ if unpack_f is None: unpack_f=self.unpack_id t={} for id in self.seqDB: for s in unpack_f(id): if s == id: continue # DON'T STORE TRIVIAL MAPPINGS!! s=s.upper() # NCBI FORCES ID TO UPPERCASE?!?! try: if t[s]!=id and t[s] is not None: t[s]=None # s NOT UNIQUE, CAN'T BE AN IDENTIFIER!! except KeyError: t[s]=id # s UNIQUE, TRY USING s AS AN IDENTIFIER for id in t.itervalues(): if id is not None: # OK THERE ARE REAL MAPPINGS STORED, SO USE THIS self._unpacked_dict=t # SAVE THE MAPPING TO REAL IDENTIFIERS return # NO NON-TRIVIAL MAPPINGS, SO JUST SAVE EMPTY MAPPING self._unpacked_dict={} def get_real_id(self, bogusID, unpack_f=None): "try to translate an id that NCBI has mangled to the real sequence id" if unpack_f is None: unpack_f = self.unpack_id if not hasattr(self, '_unpacked_dict'): self.index_unpacked_ids(unpack_f) for s in unpack_f(bogusID): s = s.upper() # NCBI FORCES ID TO UPPERCASE?!?! try: id = self._unpacked_dict[s] if id is not None: return id # OK, FOUND A MAPPING TO REAL ID except KeyError: pass # KEEP TRYING... # FOUND NO MAPPING, SO RAISE EXCEPTION raise KeyError("no key '%s' in database %s" % (bogusID, repr(self.seqDB))) def __getitem__(self, seqID): "If seqID is mangled by BLAST, use our index to get correct ID" try: # default: treat as a correct ID return self.seqDB[seqID] except KeyError: # translate to the correct ID return self.seqDB[self.get_real_id(seqID)] def __contains__(self, seqID): try: self.seqInfoDict[seqID] return True except KeyError: return False class BlastIDInfoDict(object, UserDict.DictMixin): """provide seqInfoDict interface for BlastIDIndex """ def __init__(self, db): self.blastDB = db def __getitem__(self, seqID): try: return self.blastDB.seqDB.seqInfoDict[seqID] except KeyError: seqID = self.blastDB.get_real_id(seqID) return self.blastDB.seqDB.seqInfoDict[seqID] def __len__(self): return len(self.blastDB.seqDB.seqInfoDict) def __iter__(self): return iter(self.blastDB.seqDB.seqInfoDict) def keys(self): return self.blastDB.seqDB.seqInfoDict.keys() PKðŠ’;½íÉõhõhpygr/blast.pyc;ò |†Kc@sŽdkZdkZdkZdkZdkZdkTdklZdkl Z l Z dk l Z l Z lZlZdklZlZlZdkZdkZdkZd„Zd„Zeeeed„Zed „Zeed „Zeeehd „Zd fd „Zd„Z de!fd„ƒYZ"de"fd„ƒYZ#de"fd„ƒYZ$de!fd„ƒYZ%de!ei&fd„ƒYZ'dS(N(s*(sBlastHitParser(s write_fastas read_fasta(sCoordsGroupStartsCoordsGroupEndsCoordsToIntervalss EmptySlice(s AnnotationDBsTranslationAnnotsTranslationAnnotSlicecCs|idƒdS(Ns|i(sidssplit(sid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysscCszhthtd<td<<thtd<td<<}|tjo t}n|tjo t}n|||SdS(Nsblastnsblastxstblastnsblastp(s DNA_SEQTYPEsPROTEIN_SEQTYPEsprogss query_types RNA_SEQTYPEsdb_type(s query_typesdb_typesprogs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_programs <    c Csètƒ} tddddddddd d d d d dddƒ}|oti|ƒ}n|oti|ƒ}nt |||ƒ} | | i |ƒƒ} |tjot| |ƒ} n$| } x|D]}|| ƒ} qÊW| SdS(sÜApply sequence of transforms to read input from 'ofile'. srcDB: database for finding query sequences from the blast input; destDB: database for finding subject sequences from the blast input; al, if not None, must be a writeable alignment object in which to store the alignment intervals; translateSrc=True forces creation of a TranslationDB representing the possible 6-frames of srcDB (for blastx, tblastx); translateDest=True forces creation of a TranslationDB representing the possible 6-frames of destDB (for tblastn, tblastx). If pipeline is not None, it must be a list of filter functions each taking a single argument and returning an iterator or iterable result object. sidssrc_idsstarts src_startsstopssrc_endsorissrc_orisidDestsdest_ids startDests dest_startsstopDestsdest_endsoriDestsdest_oriN(sBlastHitParserspsdictsds translateSrcs translationDBsget_translation_dbssrcDBs translateDestsdestDBsCoordsToIntervalssctis parse_filesofiles alignedIvalsspipelinesNonessave_interval_alignmentsalsresultsf( sofilessrcDBsdestDBsalspipelines translateSrcs translateDestsdsfs alignedIvalsspsresultscti((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysread_blast_alignment!s$   cCset}|tjo(tidddtdtƒ}t}n|i|ƒ|o|i ƒn|SdS(s1Save alignedIvals to al, or a new in-memory NLMSAs blasthitssmemorys pairwiseModes bidirectionalN( sFalses needToBuildsalsNones cnestedlistsNLMSAsTruesadd_aligned_intervalss alignedIvalssbuild(s alignedIvalssals needToBuild((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyssave_interval_alignmentIs    cKsÉti|dtidti|}|tjo |}n|tj o7x*|i ƒD]\}}t |i |ƒqUWt}nt |i |ƒ}|iƒotddi|ƒƒ‚n||fSdS(sRun blast and return results.sstdinsstdoutscommand %s faileds N(s classutils FilePopenscmdsPIPEskwargssps seqStringsNonesseqsseqDicts iteritemssseqIDs write_fastasstdinswaitsOSErrorsjoin(scmdsseqs seqStringsseqDictskwargsspsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys start_blastVs$      c Ks”t|||d||\} }z]| o6y |i}Wqbt j oh| |<}qbXnt |i ||||}Wd|iƒX|SdS(s"Run blast and return an alignment.sseqDictN(s start_blastscmdsseqs seqStringsqueryDBs popenArgssseqIDspsdbsAttributeErrorsread_blast_alignmentsstdoutsblastDBsalskwargssclose( scmdsseqsblastDBsals seqStringsqueryDBs popenArgsskwargsspsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys process_blastgs!  s RepeatMaskerc Cs ti|gt|ƒdtidtƒ}t|i |dd„ƒz~|i ƒo$t ddi |idƒƒ‚nt|idd ƒ}z%xt|ƒD]\}}}PqžWWd |iƒXWd |iƒxEti|id ƒD]-}yti|ƒWqæt j oqæXqæWX|Sd S( s>Run RepeatMasker on a sequence, return lowercase-masked stringsstdins stdinFlags reformattercCs |iƒS(N(sxsupper(sx((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys~sscommand %s faileds is.maskedsrUNs.*(s classutils FilePopensprognameslistsoptssPIPEsNonesps write_fastasstdinsseqswaitsOSErrorsjoinsargssfiles _stdin_pathsifiles read_fastasidstitles seq_maskedsclosesglobsfpathsossremove( sseqsprognamesoptsstitles seq_maskedsifilesfpathspsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys repeat_maskxs.  $    cCsY|iƒ}t|ƒdjpt|dƒt|ƒjotid|ƒtSndS(Niisù Your sequence filepath contains whitespace characters: %s The NCBI formatdb (and blastall) programs cannot handle file paths containing whitespace! This is a known NCBI formatdb / blastall bug. Please use a path containing no whitespace characters!(sfilepathssplitslslensloggerswarnsTrue(sfilepathsl((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyswarn_if_whitespace’s 0s BlastMappingc BsþtZdZeeeeeed„Zd„Zd„Zd„Z d„Z d„Z d„Z de ie iieiƒgZd „Zed „Zeed „Zed d ƒZed„Zd„Zd„Zd„Zeededeefed„ ZRS(sHGraph interface for mapping a sequence to homologs in a seq db via BLASTc Ks²||_t|ƒ|_||_||_|tj o ||_n |i|_|tj o ||_n|tj o ||_ n|i ƒ|i o|o|i ƒndS(sRseqDB: sequence database object to search for homologs filepath: location of FASTA format file for the sequence database blastReady: if True, ensure that BLAST index file ready to use blastIndexPath: location of the BLAST index file blastIndexDirs: list of directories for trying to build index in N( sseqDBsselfs BlastIDIndexsidIndexsverbosesshowFormatdbMessagessfilepathsNonesblastIndexPathsblastIndexDirsscheckdbs blastReadysformatdb( sselfsseqDBsfilepaths blastReadysblastIndexPathsblastIndexDirssverbosesshowFormatdbMessagesskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__init__¡s           cCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__ºscCs|i|ƒ}||SdS(s,return NLMSASlice representing BLAST resultsN(sselfs__call__sksal(sselfsksal((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys __getitem__½scCs™ti|dtiƒ oNti|dtiƒ o3ti|dtiƒ oti|dtiƒ otSn"||ijo ||_ntSdS(s=check whether BLAST index files ready for use; return status.s.nsds.psds.00.nsds.00.psdN( sossaccessstestpathsR_OKsFalsesselfsfilepathsblastIndexPathsTrue(sselfstestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pystest_db_locationÂs l cCsCx5|iƒD]'}|i|ƒ|_|ioPq q W|iSdS(sPlook for blast index files in blastIndexPath, standard list of locationsN(sselfsblast_index_pathsstestpathstest_db_locations blastReady(sselfstestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyscheckdbÎs   cCs<ti|ƒ}ti|tiƒ otd|ƒ‚ndd|i d|ddg}|i i t jo|ddg7}ntid d i|ƒƒ|io h}ntd tid tiƒ}ti||o7t|i ƒp t|ƒtd d i|ƒƒ‚nt|_||i jo ||_ndS(s3ATTEMPT TO BUILD BLAST DATABASE INDEXES at testpaths+run_formatdb: directory %s is not writable!sformatdbs-is-ns-osTs-psFsBuilding index: s sstdoutsstderrscommand %s failedN(s classutils file_dirpathstestpathsdirnamesossaccesssW_OKsIOErrorsselfsfilepathscmdsseqDBs_seqtypesPROTEIN_SEQTYPEsloggersinfosjoinsshowFormatdbMessagesskwargssdictsPIPEscall_subprocessswarn_if_whitespacesOSErrorsTrues blastReadysblastIndexPath(sselfstestpathskwargsscmdsdirname((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys run_formatdb×s"   cCs,y |iSWntj o|iSnXdS(s+get path to base name for BLAST index filesN(sselfsblastIndexPathsAttributeErrorsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysget_blast_index_pathîs  sFILEPATHccs¿y |iVWntj onXx—|iD]Œ}|djo|iVq+nJ|tiijo|dƒ}n't |ƒo |ƒ}n t |ƒ}tii |tii |iƒƒVq+WdS(s-iterate over possible blast index directoriessFILEPATHs~N(sselfsblastIndexPathsAttributeErrorsblastIndexDirssmsfilepathsosspaths expanduserssscallablesstrsjoinsbasename(sselfsmss((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysblast_index_pathsùs       cCs |tj o|i|ƒSnt}x_|iƒD]Q}|oti dƒnt }y|i|ƒSWq1t t fj oq1Xq1Wt d|ifƒ‚dS(s9try to build BLAST index files in an appropriate locations+Trying next entry in self.blastIndexDirs...s"cannot build BLAST database for %sN( sfilepathsNonesselfs run_formatdbsFalsesnotFirstsblast_index_pathsstestpathsloggersinfosTruesIOErrorsOSError(sselfsfilepathsnotFirststestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysformatdb s   cCsr|tj o||fSnyt|idƒ|fSWn6tj o*d|iƒ}t i |ƒt fSnXdS(stReturn a stream of fasta-formatted sequences. Optionally, apply an ID filter function if supplied. srUsfastacmd -D -d "%s"N( sifilesNonesidFiltersfilesselfsfilepathsIOErrorsget_blast_index_pathscmdsosspopensNCBI_ID_PARSER(sselfsifilesidFilterscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysraw_fasta_streams sblastxs#BlastxMappingcCs|tjot|iƒ|iiƒ}n|}y?|i |}|i dƒot d|d|fƒ‚nWnt j onX|SdS(sAfigure out appropriate blast program & remap via _blast_prog_dicts#s Use %s for %siN( s blastprogsNones blast_programsseqsseqtypesselfsseqDBs_seqtypesoldprogs_blast_prog_dicts startswiths ValueErrorsKeyError(sselfsseqs blastprogsoldprog((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_program*s  "c Cs||iƒ}t|ƒ|d|d|ddt|ƒgt|ƒ}|t j o"|dd|dd|g7}n|SdS( s>generate command string for running blast with desired optionss-ds-ps-es%es-bs%ds-vN( sselfsget_blast_index_pathsfilepathswarn_if_whitespaces blastpaths blastprogsfloatsexpmaxslistsoptsscmdsmaxseqsNone(sselfs blastpaths blastprogsexpmaxsmaxseqsoptssfilepathscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_command7s  / "cCst|ƒiƒ}||SdS(s!get one sequence obj from queryDBN(sitersqueryDBsnextsseqID(sselfsqueryDBsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysget_seq_from_queryDBAsc Csftdtdtƒdtdtƒdtdtdtƒƒ}y ||SWntj o hSnXdS(s;return kwargs for read_blast_alignment() based on blastprogstblastns translateDestsblastxs translateSrcstblastxN(sdictsTruesds blastprogsKeyError(sselfs blastprogsd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pystranslation_kwargsFs sblastallf0.001c KsÚ|tjo | tjotdƒ‚n|o| otdƒ‚n| tj o|i| ƒ}n|i o|iƒn|i||ƒ}|i |||||ƒ} t| ||i|d| |i|ƒSdS(s=Run blast search for seq in database, return alignment objects)we need a sequence or db to use as query!s+both a sequence AND a db provided for querysqueryDBN(sseqsNonesqueryDBs ValueErrorsselfsget_seq_from_queryDBs blastReadysformatdbs blast_programs blastprogs blast_commands blastpathsexpmaxsmaxseqsoptsscmds process_blastsidIndexsalstranslation_kwargs( sselfsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptssqueryDBskwargsscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__call__Ps  (s__name__s __module__s__doc__sNonesFalsesTrues__init__s__repr__s __getitem__stest_db_locationscheckdbs run_formatdbsget_blast_index_pathsossgetcwdspaths expanduserstempfiles gettempdirsblastIndexDirssblast_index_pathssformatdbsraw_fasta_streamsdicts_blast_prog_dicts blast_programs blast_commandsget_seq_from_queryDBstranslation_kwargss__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys BlastMappingžs$     !    s BlastxMappingcBs;tZdZd„ZeddddddƒZd„ZRS(sBecause blastx changes the query to multiple sequences (representing its six possible frames), getitem can no longer return a single slice object, but instead an iterator for one or more slice objects representing the frames that had homology hits.cCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__issblastnstblastxsblastps #BlastMappingstblastncCs“||ƒ}ti|iƒ}g}xd||ii ƒD]O}y||}Wnt j o q8nXt |tƒ o|i|ƒq8q8W|SdS(s2generate slices for all translations of the query N(sselfsquerysals translationDBsget_translation_dbsdbstdbsslicessids iter_framess trans_seqsslicesKeyErrors isinstances EmptySlicesappend(sselfsquerysslicesslicesstdbs trans_seqsal((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys __getitem__ns (s__name__s __module__s__doc__s__repr__sdicts_blast_prog_dicts __getitem__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys BlastxMappingbs   sMegablastMappingc BsGtZd„Zeddeeddddgdd gefd „ ZRS( NcCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__…ss megablastf9.9999999999999995e-21s-UsTs-Fsms RepeatMaskers-xsmallc  Ks|i o|iƒnt||| ƒ}|iƒ} t | ƒ|g|d| ddddt |ƒgt| ƒ}|tj o"|dd|dd|g7}n|tj o|d d t |ƒg7}nt|||i|d |d td dƒƒSdS(s2Run megablast search with optional repeat masking.s-ds-Ds2s-es%es-bs%ds-vs-ps%fs seqStrings popenArgss stdinFlags-iN(sselfs blastReadysformatdbs repeat_masksseqsrmPathsrmOptss masked_seqsget_blast_index_pathsfilepathswarn_if_whitespaces blastpathsmaskOptssfloatsexpmaxslistsoptsscmdsmaxseqsNones minIdentitys process_blastsidIndexsalsdict(sselfsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargssfilepaths masked_seqscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__call__ˆs   7 " (s__name__s __module__s__repr__sNones__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysMegablastMappingƒs s BlastIDIndexcBsPtZdZd„ZdZd„Zed„Zed„Zd„Z d„Z RS(s“This class acts as a wrapper around a regular seqDB, and handles the mangled IDs returned by BLAST to translate them to the correct ID. Since NCBI treats FASTA ID as a blob into which they like to stuff many fields... and then NCBI BLAST mangles those IDs when it reports hits, so they no longer match the true ID... we are forced into contortions to rescue the true ID from mangled IDs. Our workaround strategy: since NCBI packs the FASTA ID with multiple IDs (GI, GB, RefSeq ID etc.), we can use any of these identifiers that are found in a mangled ID, by storing a mapping of these sub-identifiers to the true FASTA ID.cCs||_t|ƒ|_dS(N(sseqDBsselfsBlastIDInfoDicts seqInfoDict(sselfsseqDB((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__init__­s s|cCs|i|iƒSdS(s’Return |-packed NCBI identifiers as unpacked list. NCBI packs identifier like gi|123456|gb|A12345|other|nonsense. Return as list.N(sidssplitsselfs id_delimiter(sselfsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys unpack_id³scCs|tjo |i}nh}xœ|iD]‘}xˆ||ƒD]z}||joq=n|iƒ}y4|||jo||tj ot||scCszhthtd<td<<thtd<td<<}|tjo t}n|tjo t}n|||SdS(Nsblastnsblastxstblastnsblastp(s DNA_SEQTYPEsPROTEIN_SEQTYPEsprogss query_types RNA_SEQTYPEsdb_type(s query_typesdb_typesprogs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_programs <    c Csètƒ} tddddddddd d d d d dddƒ}|oti|ƒ}n|oti|ƒ}nt |||ƒ} | | i |ƒƒ} |tjot| |ƒ} n$| } x|D]}|| ƒ} qÊW| SdS(sÜApply sequence of transforms to read input from 'ofile'. srcDB: database for finding query sequences from the blast input; destDB: database for finding subject sequences from the blast input; al, if not None, must be a writeable alignment object in which to store the alignment intervals; translateSrc=True forces creation of a TranslationDB representing the possible 6-frames of srcDB (for blastx, tblastx); translateDest=True forces creation of a TranslationDB representing the possible 6-frames of destDB (for tblastn, tblastx). If pipeline is not None, it must be a list of filter functions each taking a single argument and returning an iterator or iterable result object. sidssrc_idsstarts src_startsstopssrc_endsorissrc_orisidDestsdest_ids startDests dest_startsstopDestsdest_endsoriDestsdest_oriN(sBlastHitParserspsdictsds translateSrcs translationDBsget_translation_dbssrcDBs translateDestsdestDBsCoordsToIntervalssctis parse_filesofiles alignedIvalsspipelinesNonessave_interval_alignmentsalsresultsf( sofilessrcDBsdestDBsalspipelines translateSrcs translateDestsdsfs alignedIvalsspsresultscti((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysread_blast_alignment!s$   cCset}|tjo(tidddtdtƒ}t}n|i|ƒ|o|i ƒn|SdS(s1Save alignedIvals to al, or a new in-memory NLMSAs blasthitssmemorys pairwiseModes bidirectionalN( sFalses needToBuildsalsNones cnestedlistsNLMSAsTruesadd_aligned_intervalss alignedIvalssbuild(s alignedIvalssals needToBuild((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyssave_interval_alignmentIs    cKsÉti|dtidti|}|tjo |}n|tj o7x*|i ƒD]\}}t |i |ƒqUWt}nt |i |ƒ}|iƒotddi|ƒƒ‚n||fSdS(sRun blast and return results.sstdinsstdoutscommand %s faileds N(s classutils FilePopenscmdsPIPEskwargssps seqStringsNonesseqsseqDicts iteritemssseqIDs write_fastasstdinswaitsOSErrorsjoin(scmdsseqs seqStringsseqDictskwargsspsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys start_blastVs$      c Ks”t|||d||\} }z]| o6y |i}Wqbt j oh| |<}qbXnt |i ||||}Wd|iƒX|SdS(s"Run blast and return an alignment.sseqDictN(s start_blastscmdsseqs seqStringsqueryDBs popenArgssseqIDspsdbsAttributeErrorsread_blast_alignmentsstdoutsblastDBsalskwargssclose( scmdsseqsblastDBsals seqStringsqueryDBs popenArgsskwargsspsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys process_blastgs!  s RepeatMaskerc Cs ti|gt|ƒdtidtƒ}t|i |dd„ƒz~|i ƒo$t ddi |idƒƒ‚nt|idd ƒ}z%xt|ƒD]\}}}PqžWWd |iƒXWd |iƒxEti|id ƒD]-}yti|ƒWqæt j oqæXqæWX|Sd S( s>Run RepeatMasker on a sequence, return lowercase-masked stringsstdins stdinFlags reformattercCs |iƒS(N(sxsupper(sx((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys~sscommand %s faileds is.maskedsrUNs.*(s classutils FilePopensprognameslistsoptssPIPEsNonesps write_fastasstdinsseqswaitsOSErrorsjoinsargssfiles _stdin_pathsifiles read_fastasidstitles seq_maskedsclosesglobsfpathsossremove( sseqsprognamesoptsstitles seq_maskedsifilesfpathspsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys repeat_maskxs.  $    cCsY|iƒ}t|ƒdjpt|dƒt|ƒjotid|ƒtSndS(Niisù Your sequence filepath contains whitespace characters: %s The NCBI formatdb (and blastall) programs cannot handle file paths containing whitespace! This is a known NCBI formatdb / blastall bug. Please use a path containing no whitespace characters!(sfilepathssplitslslensloggerswarnsTrue(sfilepathsl((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyswarn_if_whitespace’s 0s BlastMappingc BsþtZdZeeeeeed„Zd„Zd„Zd„Z d„Z d„Z d„Z de ie iieiƒgZd „Zed „Zeed „Zed d ƒZed„Zd„Zd„Zd„Zeededeefed„ ZRS(sHGraph interface for mapping a sequence to homologs in a seq db via BLASTc Ks²||_t|ƒ|_||_||_|tj o ||_n |i|_|tj o ||_n|tj o ||_ n|i ƒ|i o|o|i ƒndS(sRseqDB: sequence database object to search for homologs filepath: location of FASTA format file for the sequence database blastReady: if True, ensure that BLAST index file ready to use blastIndexPath: location of the BLAST index file blastIndexDirs: list of directories for trying to build index in N( sseqDBsselfs BlastIDIndexsidIndexsverbosesshowFormatdbMessagessfilepathsNonesblastIndexPathsblastIndexDirsscheckdbs blastReadysformatdb( sselfsseqDBsfilepaths blastReadysblastIndexPathsblastIndexDirssverbosesshowFormatdbMessagesskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__init__¡s           cCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__ºscCs|i|ƒ}||SdS(s,return NLMSASlice representing BLAST resultsN(sselfs__call__sksal(sselfsksal((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys __getitem__½scCs™ti|dtiƒ oNti|dtiƒ o3ti|dtiƒ oti|dtiƒ otSn"||ijo ||_ntSdS(s=check whether BLAST index files ready for use; return status.s.nsds.psds.00.nsds.00.psdN( sossaccessstestpathsR_OKsFalsesselfsfilepathsblastIndexPathsTrue(sselfstestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pystest_db_locationÂs l cCsCx5|iƒD]'}|i|ƒ|_|ioPq q W|iSdS(sPlook for blast index files in blastIndexPath, standard list of locationsN(sselfsblast_index_pathsstestpathstest_db_locations blastReady(sselfstestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pyscheckdbÎs   cCs<ti|ƒ}ti|tiƒ otd|ƒ‚ndd|i d|ddg}|i i t jo|ddg7}ntid d i|ƒƒ|io h}ntd tid tiƒ}ti||o7t|i ƒp t|ƒtd d i|ƒƒ‚nt|_||i jo ||_ndS(s3ATTEMPT TO BUILD BLAST DATABASE INDEXES at testpaths+run_formatdb: directory %s is not writable!sformatdbs-is-ns-osTs-psFsBuilding index: s sstdoutsstderrscommand %s failedN(s classutils file_dirpathstestpathsdirnamesossaccesssW_OKsIOErrorsselfsfilepathscmdsseqDBs_seqtypesPROTEIN_SEQTYPEsloggersinfosjoinsshowFormatdbMessagesskwargssdictsPIPEscall_subprocessswarn_if_whitespacesOSErrorsTrues blastReadysblastIndexPath(sselfstestpathskwargsscmdsdirname((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys run_formatdb×s"   cCs,y |iSWntj o|iSnXdS(s+get path to base name for BLAST index filesN(sselfsblastIndexPathsAttributeErrorsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysget_blast_index_pathîs  sFILEPATHccs¿y |iVWntj onXx—|iD]Œ}|djo|iVq+nJ|tiijo|dƒ}n't |ƒo |ƒ}n t |ƒ}tii |tii |iƒƒVq+WdS(s-iterate over possible blast index directoriessFILEPATHs~N(sselfsblastIndexPathsAttributeErrorsblastIndexDirssmsfilepathsosspaths expanduserssscallablesstrsjoinsbasename(sselfsmss((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysblast_index_pathsùs       cCs |tj o|i|ƒSnt}x_|iƒD]Q}|oti dƒnt }y|i|ƒSWq1t t fj oq1Xq1Wt d|ifƒ‚dS(s9try to build BLAST index files in an appropriate locations+Trying next entry in self.blastIndexDirs...s"cannot build BLAST database for %sN( sfilepathsNonesselfs run_formatdbsFalsesnotFirstsblast_index_pathsstestpathsloggersinfosTruesIOErrorsOSError(sselfsfilepathsnotFirststestpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysformatdb s   cCsr|tj o||fSnyt|idƒ|fSWn6tj o*d|iƒ}t i |ƒt fSnXdS(stReturn a stream of fasta-formatted sequences. Optionally, apply an ID filter function if supplied. srUsfastacmd -D -d "%s"N( sifilesNonesidFiltersfilesselfsfilepathsIOErrorsget_blast_index_pathscmdsosspopensNCBI_ID_PARSER(sselfsifilesidFilterscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysraw_fasta_streams sblastxs#BlastxMappingcCs|tjot|iƒ|iiƒ}n|}y?|i |}|i dƒot d|d|fƒ‚nWnt j onX|SdS(sAfigure out appropriate blast program & remap via _blast_prog_dicts#s Use %s for %siN( s blastprogsNones blast_programsseqsseqtypesselfsseqDBs_seqtypesoldprogs_blast_prog_dicts startswiths ValueErrorsKeyError(sselfsseqs blastprogsoldprog((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_program*s  "c Cs||iƒ}t|ƒ|d|d|ddt|ƒgt|ƒ}|t j o"|dd|dd|g7}n|SdS( s>generate command string for running blast with desired optionss-ds-ps-es%es-bs%ds-vN( sselfsget_blast_index_pathsfilepathswarn_if_whitespaces blastpaths blastprogsfloatsexpmaxslistsoptsscmdsmaxseqsNone(sselfs blastpaths blastprogsexpmaxsmaxseqsoptssfilepathscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys blast_command7s  / "cCst|ƒiƒ}||SdS(s!get one sequence obj from queryDBN(sitersqueryDBsnextsseqID(sselfsqueryDBsseqID((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysget_seq_from_queryDBAsc Csftdtdtƒdtdtƒdtdtdtƒƒ}y ||SWntj o hSnXdS(s;return kwargs for read_blast_alignment() based on blastprogstblastns translateDestsblastxs translateSrcstblastxN(sdictsTruesds blastprogsKeyError(sselfs blastprogsd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pystranslation_kwargsFs sblastallf0.001c KsÚ|tjo | tjotdƒ‚n|o| otdƒ‚n| tj o|i| ƒ}n|i o|iƒn|i||ƒ}|i |||||ƒ} t| ||i|d| |i|ƒSdS(s=Run blast search for seq in database, return alignment objects)we need a sequence or db to use as query!s+both a sequence AND a db provided for querysqueryDBN(sseqsNonesqueryDBs ValueErrorsselfsget_seq_from_queryDBs blastReadysformatdbs blast_programs blastprogs blast_commands blastpathsexpmaxsmaxseqsoptsscmds process_blastsidIndexsalstranslation_kwargs( sselfsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptssqueryDBskwargsscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__call__Ps  (s__name__s __module__s__doc__sNonesFalsesTrues__init__s__repr__s __getitem__stest_db_locationscheckdbs run_formatdbsget_blast_index_pathsossgetcwdspaths expanduserstempfiles gettempdirsblastIndexDirssblast_index_pathssformatdbsraw_fasta_streamsdicts_blast_prog_dicts blast_programs blast_commandsget_seq_from_queryDBstranslation_kwargss__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys BlastMappingžs$     !    s BlastxMappingcBs;tZdZd„ZeddddddƒZd„ZRS(sBecause blastx changes the query to multiple sequences (representing its six possible frames), getitem can no longer return a single slice object, but instead an iterator for one or more slice objects representing the frames that had homology hits.cCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__issblastnstblastxsblastps #BlastMappingstblastncCs“||ƒ}ti|iƒ}g}xd||ii ƒD]O}y||}Wnt j o q8nXt |tƒ o|i|ƒq8q8W|SdS(s2generate slices for all translations of the query N(sselfsquerysals translationDBsget_translation_dbsdbstdbsslicessids iter_framess trans_seqsslicesKeyErrors isinstances EmptySlicesappend(sselfsquerysslicesslicesstdbs trans_seqsal((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys __getitem__ns (s__name__s __module__s__doc__s__repr__sdicts_blast_prog_dicts __getitem__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys BlastxMappingbs   sMegablastMappingc BsGtZd„Zeddeeddddgdd gefd „ ZRS( NcCsd|iSdS(Ns(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__repr__…ss megablastf9.9999999999999995e-21s-UsTs-Fsms RepeatMaskers-xsmallc  Ks|i o|iƒnt||| ƒ}|iƒ} t | ƒ|g|d| ddddt |ƒgt| ƒ}|tj o"|dd|dd|g7}n|tj o|d d t |ƒg7}nt|||i|d |d td dƒƒSdS(s2Run megablast search with optional repeat masking.s-ds-Ds2s-es%es-bs%ds-vs-ps%fs seqStrings popenArgss stdinFlags-iN(sselfs blastReadysformatdbs repeat_masksseqsrmPathsrmOptss masked_seqsget_blast_index_pathsfilepathswarn_if_whitespaces blastpathsmaskOptssfloatsexpmaxslistsoptsscmdsmaxseqsNones minIdentitys process_blastsidIndexsalsdict(sselfsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargssfilepaths masked_seqscmd((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__call__ˆs   7 " (s__name__s __module__s__repr__sNones__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pysMegablastMappingƒs s BlastIDIndexcBsPtZdZd„ZdZd„Zed„Zed„Zd„Z d„Z RS(s“This class acts as a wrapper around a regular seqDB, and handles the mangled IDs returned by BLAST to translate them to the correct ID. Since NCBI treats FASTA ID as a blob into which they like to stuff many fields... and then NCBI BLAST mangles those IDs when it reports hits, so they no longer match the true ID... we are forced into contortions to rescue the true ID from mangled IDs. Our workaround strategy: since NCBI packs the FASTA ID with multiple IDs (GI, GB, RefSeq ID etc.), we can use any of these identifiers that are found in a mangled ID, by storing a mapping of these sub-identifiers to the true FASTA ID.cCs||_t|ƒ|_dS(N(sseqDBsselfsBlastIDInfoDicts seqInfoDict(sselfsseqDB((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys__init__­s s|cCs|i|iƒSdS(s’Return |-packed NCBI identifiers as unpacked list. NCBI packs identifier like gi|123456|gb|A12345|other|nonsense. Return as list.N(sidssplitsselfs id_delimiter(sselfsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/blast.pys unpack_id³scCs|tjo |i}nh}xœ|iD]‘}xˆ||ƒD]z}||joq=n|iƒ}y4|||jo||tj ot||}‰¦| x=ŒŒ.¸N€ |¦BŸ}h¦|¦=kk=ì}i¦N€ |¦¿¡ÿô8€|}x8`”!ÿ°H•|~yA‚,£ëx8€H/ƒ~@¾Ãóx;ÀHI`8!PÃóx€»¡ÿô|¦N€ ``|¦¿¡ÿô|}x”!ÿ°``€cH£ëxHù8!P8`€»¡ÿô|¦N€ ```€C€8`ÿÿ‚Mœ @ 8`N€ 8`N€ ``,A‚\C/ŠA\HH`|R| p}k”Ub8}(.|h„HMž ‰ Aœ }j[xH8ë‡PAœÿÈ`8`N€ ``}Kp8àU`8}(.|h„H@žÿ¸N€ |¦¿¡ÿô8€|}x8`”!ÿ°H|~yA‚,£ëx8€H/ƒ~@¾Ãóx;ÀHÉ`8!PÃóx€»¡ÿô|¦N€ ``,A‚\C/ŠA\HH`|R| p}k”Ub8}(.|h„HMž ‰ Aœ }j[xH8ë‡PAœÿÈ`8`N€ ``}Kp8àU`8}(.|h„H@žÿ¸N€ 8€H,``|¦¿ÿð||x”!ÿ°``€/€@<;À`€WÂ8;Þ|Bƒ¢€}H¹£ëxH±€€ðAÿÔ€|HƒãxH•8!P8`€»ÿð|¦N€ |¦¿Áÿø|ƒ#xBŸ|¤+xè¦8”!ÿ <ß<¿8Æ9¨8¥!ä8á88Hµ;À/ƒAžX!8€I8BIa8€K8BKƒÁ8€^8Bÿÿ/‚^@ž €a8€C€| ¦| xN€!`8!`Ãóx€»Áÿø|¦N€ ``|¦¿Áÿø|~x”!ÿ°``€C8B/‚C@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ `|¦¿Áÿø|~x”!ÿ°``€C8B/‚C@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ `|¦¿Áÿø”!ÿ°``€ƒÃ /€@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ ```|¦¿Áÿø|~x”!ÿ 8a88<8¡@H‘€~€^/ƒ8B^Až Kÿû5€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`HA/ƒAž ÃóxH‘€^€a8€<€¡@8Bÿÿ^Hµ€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ `|¦¿ÿð|}x|ƒ#x;€”!ÿ°He|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦¿Áÿø|~x”!ÿ 8a88<8¡@H1€~€^/ƒ8B^Až KÿùÕ€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`Há/ƒAž ÃóxH1€^€a8€<€¡@8Bÿÿ^HU> /‰Až0€I8Bÿÿ/‚I@ž€~ €C€| ¦| xN€!€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ ```|¦|Œ#x|¤+x”!ÿ°``€c /ƒAž}‰¦N€!,@‚8`8!P€|¦N€ `|¦“áÿüBŸè¦”!ÿ°=?)6øc ‘# /‹€I8BIAž0€K8Bÿÿ/‚K@ž€K}c[x€| ¦| xN€!8!P8`€ƒáÿü|¦N€ |¦¿ÿð|}x|ƒ#x;€”!ÿ°Hõ|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦¿Áÿø|~x”!ÿ°``# /‰Až<€I8Bÿÿ/‚I@ž(€c €C€| ¦| xN€!```>/‰Až0€I8Bÿÿ/‚I@ž€~€C€| ¦| xN€!€^8!PÃóx»Áÿø€ | ¦| x€|¦N€ |¦¿ÿð|}x|ž#x|¼+x”!ÿ°€c /ƒAžÉ¦|¤+xÌóxN€!,@‚,€}/ƒAžÉ¦„ãxÌóxN€!,@‚8`8!P€»ÿð|¦N€ `|¦¿¡ÿô|~xBŸè¦”!ÿ°?¿€]4¤€c ^ /ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]4¤H€]4¤€~^/ƒ"9)‘"Až,€C8Bÿÿ/‚C@ž€C€| ¦| xN€!8!P8`€»¡ÿô|¦N€ |¦¿ÿð|}x|ƒ#x;€”!ÿ°HU|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦¿Áÿø|~x”!ÿ 8<8a88¡@H!>€^/‰8B^Až€iHá€~HÙ€^8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``HÁ/ƒAž ÃóxH€^€a8€<€¡@8Bÿÿ^H5> /‰Až0€I8Bÿÿ/‚I@ž€~ €C€| ¦| xN€!€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ ```|¦|Œ#x|¤+x”!ÿ°``€c /ƒAž}‰¦N€!,@‚8`8!P€|¦N€ `|¦“áÿüBŸè¦”!ÿ°=?)1Øc ‘# /‹€I8BIAž0€K8Bÿÿ/‚K@ž€K}c[x€| ¦| xN€!8!P8`€ƒáÿü|¦N€ |¦¿ÿð|}x|ƒ#x;€”!ÿ°HÕ|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦“áÿü8€BŸè¦”!ÿ°€˜| ¦| xN€!|kyA‚0<_€B0ÄK"9)‘"K`"9)‘"8!P€ƒáÿü|¦N€ ```|¦¿Áÿø|~x”!ÿ°``#/‰Až<€I8Bÿÿ/‚I@ž(€c€C€| ¦| xN€!```>/‰Až0€I8Bÿÿ/‚I@ž€~€C€| ¦| xN€!€^8!PÃóx»Áÿø€ | ¦| x€|¦N€ |¦¿ÿð|}x|ž#x|¼+x”!ÿ°€c/ƒAžÉ¦|¤+xÌóxN€!,@‚,€}/ƒAžÉ¦„ãxÌóxN€!,@‚8`8!P€»ÿð|¦N€ `|¦¿¡ÿô|~xBŸè¦”!ÿ°?¿€]/€c^/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]/H€]/€~^/ƒ"9)‘"Až,€C8Bÿÿ/‚C@ž€C€| ¦| xN€!8!P8`€»¡ÿô|¦N€ |¦“áÿü8€BŸè¦”!ÿ°€˜| ¦| xN€!|byA‚=?).4‘" €I8BI8!P€ƒáÿü|¦N€ |¦¿Áÿø|~x”!ÿ°``# /‰Až0€I8Bÿÿ/‚I@ž€c €C€| ¦| xN€!€^8!PÃóx»Áÿø€ | ¦| x€|¦N€ `|¦|Œ#x|¤+x”!ÿ°``€c /ƒAž}‰¦N€!,@‚8`8!P€|¦N€ `|¦“áÿüBŸè¦”!ÿ°=?)-c ‘# /‹€I8BIAž0€K8Bÿÿ/‚K@ž€K}c[x€| ¦| xN€!8!P8`€ƒáÿü|¦N€ |¦¿Áÿø|~x”!ÿ 8a88<8¡@Ha€~€^/ƒ8B^AžH %€~/ƒAžH €^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`H /ƒAž ÃóxH Q€^€a8€<€¡@8Bÿÿ^H u€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ `|¦¿ÿð|}x|ƒ#x;€”!ÿ°H%|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦¿aÿì||x|@&BŸ-|ž#xè¦|½+xA”!ÿ AŠ€C8BC-žAŽ€^8B^.A’€]8B]?€+@ž<€]8Bÿÿ/‚]@žh€]£ëx; €| ¦| xN€!HX`A’P<_€€B+€Až<<_<Ÿ€B+(8„d€bH õ@Ž@Hl``; ```@Ž ;+€I}>Kx8BI``<_<€B+‰Až˜€+žAž4<_<Ÿ-ž.€B+(8„€bH uKÿÿ€```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!<<_€B+$‰@žT<žãx€I}ß8`“Á8“Á<“¡@“D€-ГaL8€8 8ÀgÛxÈóxÉóxÊóxHHq|yy&A‚xHAEÓx$Ëx8ÀH|zy~à&A‚Œ€-Ð@H9H|€]£ëx€| ¦| xN€!``AŠ0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!A’0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€! A‚<€Y8Bÿÿ/‚Y@ž(€Y#Ëx€| ¦| xN€!```~ø A‚œ€Z8Bÿÿ/‚Z@žˆ€Z8!CÓxaºÁÿØ€}r }q | ¦| x€}p |¦N€ ~à&;@H,;À;`; ;@.M~à&V÷€&W€€]8Bÿÿ/‚]@žþ˜Kÿþt8!a€ºÁÿØ|¦}r }q }p N€ ```|¦¿ÿð||xBŸ|#x覔!ÿ°€C|ƒ#x8B\$9)‘$Hõ|~xH­/ƒAž4<_8t=?€B*¼b<_*´‘i*¸H ```€|ÄóxKÿæ©,@‚@<_8€8 €B$è€bKÿù9<_8v=?€B*¼b<_*´‘i*¸HD€cH½,A‚ |~xH<<_8w=?€B*¼b<_*´‘i*¸``<;À8c àKÿûÅ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!PÃóx€»ÿð|¦N€ ```|¦¿ÿð||xBŸ|ƒ#x|¤+xè¦;À”!ÿ°<ß<¿8Æ(Ä8¥ÜHy/ƒAžЀ\<Ÿƒãx8B\€„)lHµ|~y@‚,<_8o=?€B)b<_)‘i)HH`8€Hý|}y@‚D<_8o=?€B)b<_)‘i)€^8Bÿÿ/‚^@žHÀ``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëxHÝ|`y@‚D<_8o=?€B)b<_)‘i)€]8Bÿÿ/‚]@ž€H\``€]|x8Bÿÿ/‚]@žl€]£ëx€| ¦| xN€!HP€^Ãóx€| ¦| xN€!H$€]£ëx€| ¦| xN€!``<;À8c hKÿùe€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!PÃóx€»ÿð|¦N€ ``|¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8Æ&”8¥¨HþA/ƒAž9<_8`ƒÂ! 9)‘9€^8B^HýÑ|{y@‚8<_8iÝóx€B&è"<_&à<_‘"&äHP```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@;@>ß>_>¿>Ÿ:`k``€–'cÛxHÉ||yA‚˜9W^8€I|bð.H.|}x@²@M€U&è;À;M€’t&à&ä€\8Bÿÿ/‚\@ž¬H`9€I|Bò€bH1-ƒ|~x@®M €U&è;HL8`Hí-|xx@ª€U&èH0`“£ “Ã8`HÅ.|}x@²(M€U&è;À€’t&à&äKÿÿ```“ ¤ëxƒãxHE|~y@¢,M€U&è;À;M€€’t&à&äKÿÿ`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`;Z—Ð@žþ(`€[~Ûx}Ûx8B[Hü€\ƒãx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŠ`€X8Bÿÿ/‚X@žL€XÃx}Ûx€| ¦| xN€!H<<_8k}Ûx€B&è"<_&à<_‘"&äH}Ûx```<;À8cXKÿõ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóxa€ºAÿÈ|¦}r }q }p N€ ``|¦¾AÿÈ|xx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8Æ"8¥Hù±/ƒAžh8<_8`ƒÂ9)‘8€^8B^HùA|zy@‚8<_8_Ýóx€B"X"<_"P<_‘""TH ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€X‚â/—@„; >ß>_>¿>Ÿ:`a``€–"„CÓxHü9|}yA‚ì€XW+8"|kH.Hýý|{yÀ&@‚@N€U"X;€€’t"P"T€]8Bÿÿ/‚]@ž4H```8`Hü.||x@’€U"XKÿÿ¸`“c „ãx£ëxHý%|~y@‚À&€U"X;`KÿÿŒ``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`;9—È@žþ¨`€Z^Óx]Óx8BZHÌ€]£ëx€| ¦| xN€!Ø A‚0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!A’`€\8Bÿÿ/‚\@žL€\ƒãx]Óx€| ¦| xN€!H8<_8a]Óx€B"X"<_"P<_‘""TH]Óx``<;À8cèKÿñ5€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦¿ÿð||xBŸè¦”!ÿ°<Ÿ€C8BC€„èHùQ|~y@‚(<_8e=?€BŒb<_„‘iˆHD8€Hú|}y@‚D<_8e=?€BŒb<_„‘iˆ€^8Bÿÿ/‚^@žHÀ``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëxH÷}|`y@‚D<_8e=?€BŒb<_„‘iˆ€]8Bÿÿ/‚]@ž€H\``€]|x8Bÿÿ/‚]@žl€]£ëx€| ¦| xN€!HP€^Ãóx€| ¦| xN€!H$€]£ëx€| ¦| xN€!``<;À8c “¾“ž€[8B[“~€c $Hæ|`y@‚<<_8Ë=?€B ¨b<_  ‘i ¤€^8Bÿÿ/‚^@ž¨Hˆ€^|x8Bÿÿ/‚^@žœ€^Ãóx€| ¦| xN€!H€€]£ëx€| ¦| xN€!`A’P€\8Bÿÿ/‚\@ž<€\ƒãx€| ¦| xN€!H €^Ãóx€| ¦| xN€!`<; 8cíØKÿÚÕ€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!`£ëx€a»aÿì|¦}p N€ `|¦¿Aÿè|›#xBŸ||x覔!ÿ <_ƒB”#9)‘#€D8BD<Ÿ:€„´9)‘:€c Hâù|}y@‚0<_8ý=?€B\b<_T‘iXHÌ``dÛxHã½|~y@‚D<_8ý=?€B\b<_T‘iX€]8Bÿÿ/‚]@ž€H@``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`ÃóxHä½|}xHâu/ƒAž<<_8ý=?€B\b<_T‘iX€^8Bÿÿ/‚^@žøHÔ€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€|¤ëxKÿÄ9|`y@‚@<_8€8 €Bˆ€bKÿÕÉ<_8ÿ=?€B\b<_T‘iXHt€\€b|cP|cpHãA|}y@‚(<_8=?€B\b<_T‘iXH48`Háí|~y@‚(<_8=?€B\b<_T‘iXKÿþp€\<Äóx8B\“¾“ž €càHâ]|}y@‚(<_8=?€B\b<_T‘iXKÿþ¨€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€]¾ëxºëx8B]HP€]£ëx€| ¦| xN€!H$€^Ãóx€| ¦| xN€!``<;À8cë°Kÿ×%€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!`Ãóx€»Aÿè|¦N€ ```|¦¾ÿÐ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ<ß<¿8Æ 8¥âHÛ¡/ƒAžH9<_8`ƒbþ€9)‘9€[8B[HÛ1|zy@‚8<_8}Ûx€BH"<_@<_‘"DHP```€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€Y‚â/—@;>¿>ß>ŸÃxHà|}yA‚”8`HÞí.|~x@²06H8€I@UD€]8Bÿÿ/‚]@ž H€Y|dx8BY“£“# <€cÌHßQ|}yA‚€^8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`<ŸCÓx»ëx€„tHÝQ.|~xA’¼8`HÝý|}yA‚ €[Ãóx¤ëx8B[“} HÞ™||y@¢ 6H8€I@UDKÿþð`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`;—À@žþ`€Z^Óx]Óx8BZHü<_8=?€BHb<_@‘iDHD<_8=?€BHb<_@‘iDH €]£ëx€| ¦| xN€!A’x€^8Bÿÿ/‚^@žd€^Ãóx]Óx€| ¦| xN€!HT<_]Óx8€BH"H<_]Óx8€BH"<_@<_‘"DH]Óx```<;À8cçÀKÿÒu€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!pÃóx€aºÿÐ|¦}p N€ |¦¿aÿì||x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ <ß<¿8Æÿ`8¥ÝXHÖñ/ƒAžø€\8`8B\HÜ|~y@‚,<_8 =?€Bÿ˜b<_ÿ‘iÿ”Hx`8`HÛÝ.|{x@’@<_8 =?€Bÿ˜b<_ÿ‘iÿ”€^8Bÿÿ/‚^@žÜH¼`8`HÚm|}yA‚ÿ¸€\<¤ëx8B\“Ý“}“ €cÿ HÚý|`y@‚D<_8 =?€Bÿ˜b<_ÿ‘iÿ”€]8Bÿÿ/‚]@ž°H``€]|x8Bÿÿ/‚]@žœ€]£ëx€| ¦| xN€!H€€^Ãóx€| ¦| xN€!`A’P€[8Bÿÿ/‚[@ž<€[cÛx€| ¦| xN€!H €]£ëx€| ¦| xN€!`<;À8cã0Kÿϵ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!`Ãóx€a»aÿì|¦}p N€ |¦¿aÿì||x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ <ß<¿8Æý8¥ÚøHÔ‘/ƒAžø€\8`8B\HÙµ|~y@‚,<_8=?€Bý8b<_ý0‘iý4Hx`8`HÙ}.|{x@’@<_8=?€Bý8b<_ý0‘iý4€^8Bÿÿ/‚^@žÜH¼`8`HØ |}yA‚ÿ¸€\<¤ëx8B\“Ý“}“ €cüÀHØ|`y@‚D<_8=?€Bý8b<_ý0‘iý4€]8Bÿÿ/‚]@ž°H``€]|x8Bÿÿ/‚]@žœ€]£ëx€| ¦| xN€!H€€^Ãóx€| ¦| xN€!`A’P€[8Bÿÿ/‚[@ž<€[cÛx€| ¦| xN€!H €]£ëx€| ¦| xN€!`<;À8càôKÿÍU€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!`Ãóx€a»aÿì|¦}p N€ |¦¿ÿð||xBŸ8`覔!ÿ°€\8B\HÖe|~y@‚,<_8=?€BúÜb<_úÔ‘iúØH¸`€\<Äóx8B\“ž €cúdHÖÕ|`y@‚<<_8=?€BúÜb<_úÔ‘iúØ€^8Bÿÿ/‚^@žXH8€^|x8Bÿÿ/‚^@žL€^Ãóx€| ¦| xN€!H0€^Ãóx€| ¦| xN€!`<; 8cÞ¸KÿËå€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!P£ëx€»ÿð|¦N€ ```|@&|¦¾!ÿÄ|{xBŸè¦A”!ÿ€<_ƒ‚ó #|ƒ#x9)‘;€\8B\HÖ™|~xHÔQ/ƒAž(<_šãx8€Bùh"HH```/žAœ€ žAœ`8`HÔ‰|}y@‚`<_šãx8ƒ€Bùh"<_ù`<_‘"ùdHÈ<_8‡Ãx€Bùh"<_ù`<_‘"ùdHt```=?¤ëxiùì€K8BK<_€BóŒ)ùì‘= €bHÔµ|~y@‚LÀ&<_8ƒšãx; €Bùh"<_ù`<_‘"ùd€]8Bÿÿ/‚]@ž¤Hˆ`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`Ãóx8€8 KÿÆÕ€^8Bÿÿ/‚^@žþÔ€^Ãóx€| ¦| xN€!Kÿþ¸€€[;|Ö|ÖT:ÀJHε|xy@‚<_šãx8…€Bùh"KÿþŒ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€€[~À×@TÚóx:à>¿>>Ÿ>_: ‡`€•ù”ÃxHÑÉ|yyÀ&A‚4€z;ZHÓ‘|}y@‚(N€Tùh;€€Ãx’2ù`ùdHP`8`HÒ=.||xA’ýÜ“£ „ãx#ËxHÒá|~y@‚€TùhKÿÿ¸```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`:÷–¸@žþØ`€XÃxÃx8BXHÌ<_8‡Ãx€Bùh"<_ù`<_‘"ùdH”€]£ëx€| ¦| xN€!Ø A‚t;€.€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!A’<€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```<;À8cÝdKÿÆõ€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!€Ãóx€aº!ÿÄ|¦}p N€ `|¦¿aÿì|}x|@&BŸ|ƒ#x|¤+xè¦8A”!ÿ<ß<¿8Æì¨8¥ÔÐ8á88HË™;À/ƒAž,=a89)‘=€K8BK€}HÊé€a8HÑA|~xHÎù/ƒAž(<_8=?€BôHb<_ô@‘iôDH\“Ý€}HÐa|~y@‚(<_8‘=?€BôHb<_ô@‘iôDH$€a8ÄóxHÎ .||x@’<<_8‘=?€BôHb<_ô@‘iôD€^8Bÿÿ/‚^@žXH<€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€}Hϱ|~y@‚(<_8‘=?€BôHb<_ô@‘iôDHøƒãxÄóxHÍY|{yA‚ÿX€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!cÛxHϱ|~xHÍi/ƒ@ž¤€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!ÃóxKÿ¯ý=?})î€}>Kx€I8BIH¬€^Ãóx€| ¦| xN€!A’€€\8Bÿÿ/‚\@žl€\ƒãx€| ¦| xN€!HP<_8‘=?€BôHb<_ô@‘iôD€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!<;À8cØpKÿÃU€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!pÃóx€a»aÿì|¦}p N€ |¦¿ÿð|#xBŸ8€|¾+x覔!ÿ €˜| ¦| xN€!||yA‚Ø=<_<¿<ßkñX€Bñ\8£ëxÄóx8¥Õ8Æé8á8<89<9!@‘a@AD9ADHǹ/ƒAžH€\8B\!8€I8BIa<€K8BK!@€I8BIaD€K8BK€a8HÍ=|~xHÊõ,A‚(<_8k=?€Bð¬b<_ð¤‘ið¨H¸“Ü| €a@HÌù|~xHʱ/ƒAž(<_8m=?€Bð¬b<_ð¤‘ið¨Ht“Ü€a8€Kx8BIH8€^Ãóx€| ¦| xN€!```<;À8cÏKÿº…€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!`Ãóx€»Áÿø|¦N€ ``|¦¾¡ÿÔ|ƒ#xBŸ|¤+x; è¦;€”!ÿp<ß<¿8Æà8¥ÌÄ8á89<“¡8“¡<“¡@“¡D“¡HH¿M/ƒAž T!8?ß??ƒ~âD€I8BIa<€K8BK;€a8€™èd9)‘;HÂa/ƒa@@ž4?>ß>ÿ8 8è €I!@è/‰Vè@žxH¤€¿4€ADZ8€H<€a8€•èTH¿Ù|}y€&A‚ôH¾é/ƒÿÿ|{x@ž4H`!@/‰Až0€I8Bÿÿ/‚I@ž€a@€C€| ¦| xN€!!D/‰Až0€I8Bÿÿ/‚I@ž€aD€C€| ¦| xN€!!H/‰Až0€I8Bÿÿ/‚I@ž€aH€C€| ¦| xN€!;@€Xè ƒÞâD8; ,"è &‘6è€&H° &€Xè ƒÞâD8;@"è‘6èHŒ;@€Xè ƒÞâD8/š"è &W9à‘6èH`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!cÛxHÀ9|{y@‚0 &8è ƒÞâD8; ;@€&€IèVèHø€~âD€C8Bÿÿ/‚C@ž€C€| ¦| xN€!€™èd€a8H½í|}y€&@‚  &€Xè ~Ûx;@8"Hœ€<eÛxHÀY/ƒ@œ,;@€Xè 8~Ûx,"è &‘6èH\€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€•èT€a8H½Q|}y€&@‚( &€Xè ~Ûx;@8"è‘6èHô<Ÿ€„è8H½|zy &A‚p€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8`H½•|}y€&A‚0!<CÓx¤ëx€I8BI€< H¾%|~y@‚ 8è 8~Ûx€IèVèHT€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€[8B[!@€I8Bÿÿ/‚I@ž€a@€C€| ¦| xN€!;À€AD“Á@"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!“ÁD€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“ÁH|Ûx~ÛxHd &ƒÞâD; ;@€&!@/‰Až4€I8Bÿÿ/‚I@ž €a@€C€| ¦| xN€!`!D/‰Až8€I8Bÿÿ/‚I@ž$€aD€C€| ¦| xN€!``!H/‰Až8€I8Bÿÿ/‚I@ž$€aH€C€| ¦| xN€!``˜ A‚<€]8Bÿÿ/‚]@ž(€]£ëx€| ¦| xN€!```8 A‚<€Z8Bÿÿ/‚Z@ž(€ZCÓx€| ¦| xN€!```<;€8cÌàKÿ±€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!8!ƒãx€º¡ÿÔ|¦N€ ``|¦¿Áÿø|ƒ#xBŸ|¤+xè¦8”!ÿ <ß<¿8ÆÖÌ8¥Âô8á89<<8Hµ;À/ƒAžða8<Ÿ€K8BK!<€I8BI€„Þ¤€a8€¡Kx8BIH8€^Ãóx€| ¦| xN€!```<;À8cÃ8Kÿ®…€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!8!`Ãóx€»Áÿø|¦N€ ``|¦¿¡ÿô|ƒ#xBŸ|¤+x8@覔!ÿ€<ß<¿8ÆÔx8¥Á(8X8áHAXAHALAP8AT9L9!P9ATH³;À/ƒAžDaH<Ÿ€K8BK!L€I8BIaP€K8BK!T€I8BIaX€K8BK€„Ü€aH€¡LH·¡/ƒ@œ(<_88=?€BÛÜb<_ÛÔ‘iÛØH´<Ÿ€aH€¡P€„ÜKx8BIH,€^Ãóx€| ¦| xN€!<;À8cÁ0Kÿ«E€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!8!€Ãóx€»¡ÿô|¦N€ ``|¦¿¡ÿô|ƒ#xBŸ|¤+xè¦8”!ÿ <ß<¿8ÆÐÀ8¥¸”8á88H¯e;À/ƒAžH!8<Ÿ€I8BI€„Øl€a8H²™|~yA‚ H±­/ƒÿÿ|}x@ž@<_8>=?€BØ b<_Ø‘iØ€^8Bÿÿ/‚^@žœH|`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëxH³í,A‚|~xH\``<_8>=?€BØ b<_Ø‘iØH €^Ãóx€| ¦| xN€!`<;À8c½„Kÿ¨Õ€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!`Ãóx€»¡ÿô|¦N€ ``|¦¾áÿÜ|ƒ#x|@&BŸ|¤+x8è¦A”!ÿ€<ß<¿8ÆÏ8¥¶à8á88H­­;À/ƒAžà€A8?Ÿ"9)‘"€a8€œÖ¸H°á|}y@‚(<_8I=?€BÖXb<_ÖP‘iÖTHT<Ÿ€„Ö¤H°©.|~x@’lM<_8I~à&V÷€€BÖX;`;@;€; M&W€"<_ÖP<_‘"ÖT€]8Bÿÿ/‚]@žÐH´``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`ÃóxH®].@T<_; 8I;`€BÖX-;@;€~à&V÷@"<_Mˆ&W@‘"ÖT<_ÖPH<`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`A’@<_8€8 €BЈ€bKÿ£‰<_8J=?€BÖXb<_ÖP‘iÖTHÔ<Ÿ€a8€„ÖÈH¯%|}y@‚(<_8K=?€BÖXb<_ÖP‘iÖTH˜<Ÿ€a8€„Ö”H®é.|~x@’0M<_;`~à&V÷€€BÖXM&W€"H@<Ÿ€a8€„ÖˆH®¡-ƒ|{x@ŽH&W`<_M €BÖX~à&V÷`";@;€; <_8K‘"ÖT<_ÖPKÿþ8`H°)-|zx@Š,~à&V÷@<_;€; &W@€BÖX"Kÿÿ°€œÖ¸€a8H® ||y&@‚0~à&<_8K; €BÖX"<_ÖP<_‘"ÖTKÿý€8`H®‰|yy~à&@‚(<_8K=?€BÖXb<_ÖP‘iÖTKÿýH“Ù “y£ëx$Ëx“Y“™€A8"9)‘"€8H®å|~y@‚4M€<_;À&€BÖX;`;@;€NM"KÿþÈ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!=?)ЀI}>Kx8BIH<€]£ëx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŽ0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!AŠ0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€! A‚<€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```~ø A‚<€Y8Bÿÿ/‚Y@ž(€Y#Ëx€| ¦| xN€!```<;À8c»ôKÿ¢…€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!€Ãóxa€ºáÿÜ|¦}r }q }p N€ ``|¦¿ÿà|ƒ#x|@&BŸ|¤+x8è¦A”!ÿ<ß<¿8ÆÈ¼8¥´°8á89<<8H§E;À/ƒAžè!8??<<ŸYÊ08„µ¸€I8BIa<€K8BK<_*€cÏìƒbÐp9)‘*H§é|}yA‚@8`H¦™|~y@‚ N;€;@H°```<€cÏèH§)||y@‚ N;€;@HL```H¨á.|zx@’ ;€H(<Ÿ†ãxeÛx£ëx8„µÄGÓxÈóxH«m||x€^8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`A’0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!/œ@ž<``<_8Bƒ¹Ê0€BÏø"<_Ïð<_‘"ÏôHŒ``€yÊ0€C8Bÿÿ/‚C@ž€C€| ¦| xN€!`<Ÿƒãx€„Ð H¨•|}y@‚<_ãx8C€BÏø"Hà€a<¤ëxH¥©/ƒÿÿ|~x@žl<_;8C;À€BÏø.;`; M@&WZ€"<_MÏð<_‘"Ïô€]8Bÿÿ/‚]@žäHÈ```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/žAž8`H¨u|}y@‚,<_ãx8D€BÏø"<_Ïð<_‘"ÏôH4=?¤ëxiÐt€K8BK<_€BÊ)Ðt‘= €bH¨Õ|~y@‚@N<_;ÀM;`; @&€BÏø;8DM€"<_‘"ÏôH€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!Ãóx8€8 Kÿ›€^8Bÿÿ/‚^@žÿ€^Ãóx€| ¦| xN€!Kÿþü<_<ƒÂÏü€cÏèÄóxH¦|}y@‚@<_Äóxãx€BÊ8€bH¤­<_8G=?€BÏøb<_Ïð‘iÏôHø<Ÿ€a8€„Ð4H¦9|~y@&@‚@M€<_;`NM€BÏø"<_; ;8G‘"Ïô<_ÏðKÿýÜ<Ÿ€a8€„ÐXH¥á.|{x@’M<_M€BÏø"Kÿÿ°€ÿ€—ňHžÙ-ƒ|zx@Ž,M <_¹ëx~À&VÖ`€BÅ(:à;`"Ht€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`CÓxH/ƒÿÿ|~x@žP;`<_¹ëx;À,€BÅ(:à~À&"NM<_8.‘"Å$<_Å Kÿÿ``€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`ÃóxHŸ½.|~x@’4~À&VÖ€<_¹ëx;@:àM€BÅ(;`M"KÿÿpƒãxÄóx8¡€Ý <Ÿ<¿€B´¬8„08¥ ¤€é €bH’<_8N=?€Bº\b<_ºT‘iºX```<;Àÿÿ8c ÈKÿŠå€\8Bÿÿ/‚\@žÐH°€| €C€| ¦| xN€!€8€a< H•õ|~xH“­/ƒAž(<_8P=?€Bº\b<_ºT‘iºXKÿÿ€“Ü€a@H•µ|}xH“m,A‚(<_8Q=?€Bº\b<_ºT‘iºXKÿÿ@;À“¼|Kÿÿ@€\ƒãx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!8!`Ãóx€»ÿð|¦N€ ``|¦¿aÿì|{xBŸ|ƒ#x|¤+xè¦8”!ÿ<_?¿=<߃·̃½·Ä<¿k·È8ư8¥Ä8á89<“ÁD8“¡<‘a@9!@9ADHŽQ;Àÿÿ/ƒAž¤;a89)‘;€K8BK!<€I8BI=?a@€K8BKAD€J8BJƒÉ¶¸ƒ¡8/žAž„?Ÿ€±dAž €}žAžÄóxH“A/ƒAž(<_ƒÁDƒ¢¶°/AžD€±dž@žXHt<_=€Þ <Ÿ<¿€B±|8„š8¥¼€é €bHŽéH”<_<Ÿ€B±L8„™ì€bHŽÍHx`€~Až¤ëxH’±/ƒAž(ƒÁD€±dž@žx!8‰ð@ž$H¼`<_>€Ý <Ÿ<¿€B±|8„š8¥À€é €bHŽY`<_8)=?€B·,b<_·$‘i·(H```€^8B^;€I8Bÿÿ/‚I@ž €{€C€| ¦| xN€!`!D‘;€  i €K8BK;€I8Bÿÿ/‚I@ž€{€C€| ¦| xN€!€AD€ €a €bHñ|}y@‚H<_83=?€B·,b<_·$‘i·(€^8Bÿÿ/‚^@ž4H```€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!£ëx8€8 Kÿ‚€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<_83=?€B·,b<_·$‘i·(H˜`<_84=?€B·,b<_·$‘i·(Hp“Û€a@Hå|}xH,A‚(<_85=?€B·,b<_·$‘i·(H0;À“»{H0€^Ãóx€| ¦| xN€!`<;Àÿÿ8cÌKÿ„%€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€AD"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!8!pÃóx€»aÿì|¦N€ ``|@&|¦½áÿ¼8 8À8àôBŸè¦A”!ÿp<<Ÿ<_?8c—¤8„°x8B©(?_[°àHŒñ/ƒ|ixz°ÐAž@€C<??8c—¬8BIHŒ/ƒ|exy°ÔAž€z°Ð<Ÿ8„—¸H…/ƒ@œ Hø`€ž €~8„ÿÿHˆ}€~€/€AžЀ/€AžHˆa```ƒ¾;Þ/@žÿ´<_;¢(ÃóxHŠ5/ƒAœ$€z°Ð<ŸÅóx;°Ð8„—ÈHŒõ/ƒ@œ€[°à8N"<_A8HÄ=?<_ƒ‰«8;¢ Ô<_£ëx“°t“ H‰Ñ/ƒAœ €z°Ð<Ÿ¥ëx8„—ØHŒ•/ƒ@œ€[°à8"<_A8Hd<_=?;Ÿ€“©°l“ž ÃóxH‰y/ƒAœ €z°Ð<ŸÅóx8„—äHŒ=/ƒ@œ8€[°à8»"<_A8```<_°Ø<_‘"°ÜH<_=?;¢ž“ɰd“ £ëxH‰/ƒAœ €z°Ð<Ÿ¥ëx8„—ôH‹É/ƒ@œ€[°à8å"<_A8Kÿÿ˜<_=?;ÂD“©°`“ž ÃóxHˆ­/ƒAœ €z°Ð<ŸÅóx8„˜H‹q/ƒ@œ€[°à8'"<_A8Kÿÿ@<_=?;¢œ„“ɰ\“ £ëxHˆU/ƒAœ €x<Ÿ¥ëx8„˜H‹/ƒ@œ€[°à8L"<_A8Kÿþè<_=?;šȓ©°hÃóxHˆ/ƒAœ €x<ŸÅóx8„˜ HŠÅ/ƒ@œ€[°à8h"<_A8Kÿþ”<_“°pH‡Y|wy@‚(```€[°à8"<_A8Kÿþ\>¿€y°Ôƒµ±D¤ëxHˆ|~y&@‚lN<_¤ëxM€;€:À€B« €b<_A8H†!€[°à8=?b<_°Ø‘i°Ü€W8Bÿÿ/‚W@žTH8``8`Hˆ].||x@’ M€[°à"HL```“à <¿>_~ã»x8’˜0€¥±hH†Ù/ƒ@œ@;À€[°à,"&M€<_:À8A8<_‘"°Ü<_°ØKÿÿT<_>Ÿ8b˜8A8ƒ°èHƒ½|}yA‚`>?~ã»x¥ëx;À8‘˜DH†]/ƒAœ<Ãxƒãx~ä»xH‡%|~xH$€]£ëx€| ¦| xN€!,&@‚0;À€[°à:À8-ž"<_&W`‘"°ÜKÿÿP€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c¤@H…m.||x@’M€[°à:À8bHì8€ÅóxH„}-ƒ|vx@Ž€[°à8"Hü€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!>Ãóx~ųx€°üH‡A/ƒ@œ,€[°à;€8."<_‘"°Ü<_°ØKÿý°€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<8€8 8c£ìH„q.||x@’M€[°à:À8 bHð8€ÅóxHƒ-ƒ|vx@Ž€[°à8 "H€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!>Ãóx~ųx€“°øH†E/ƒ@œ,€[°à;€8 ."<_‘"°Ü<_°ØKÿü´€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€”°è€z°ÐÅóxH…Ù/ƒ@œ,;€€[°à:À8-œ"<_N ‘"°ÜKÿüì€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!H‚­.||x@’,M€[°à8=?:Àb<_°Ø‘i°ÜHP8`H„1-ƒ|vxAެ=?<¿ƒãx8’˜0)«$€I8BI‘6 €¥±lH‚¹/ƒAœx€A8>Ÿƒ°ä8b˜8HÝ|}yA‚\ƒãx8‘˜D¥ëx;ÀH‚/ƒAœxÃx~óx„ãxHƒI|~xH`€]£ëx€| ¦| xN€!,&@‚€[°à8"H(€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<8€8 8c£ÜH­|wy@‚,M€€[°à8=?:Àb<_°Ø‘i°ÜHè8€ÅóxH€±-ƒ|vx@Ž€[°à8"H 0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!€°üÃóx~ųxHƒy/ƒ@œ€[°à8"HŒ€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€”°ä€z°ÐÅóxHƒ%/ƒ@œ,€[°à:À8-–"<_‘"°Ü<_°ØH€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!Hù|wy@‚€[°à8$"Kÿ÷ƒÕ±D€y°ÔÄóxH€Ñ-ƒ|vx@ŽL&W`<_Äóx;À;€N €B« €bH~Ý€[°à8$=?b<_°Ø‘i°ÜKÿø¼8`H5|~y&@‚N€[°à;€8$bH 4’Þ <¿~ã»x8’˜0€¥±pH¹/ƒAœt€A8>Ÿ‚Ô°ì8b˜8H|Ý|}yA‚X~ã»x8‘˜D¥ëx;€H/ƒAœ ~ųxÃóx~ä»xH€I||xH x€]£ëx€| ¦| xN€!.@’,;€€[°à:À8$-œ"<_N ‘"°ÜKÿø|€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<8€8 8c£ÌH~™-ƒ|vx@Ž &W`€[°à;À8&bH 8€…ãxH}¥|~y&@‚€[°à8&"H $€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€°üƒãxÅóxH€m/ƒ@œ,€[°à:À8&-–"<_‘"°Ü<_°ØKÿöÜ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<8€8 8c£¼H}-ƒ|vx@Ž &W`€[°à;À8*bH8€…ãxH|©|~y&@‚€[°à8*"H(€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!=ÿƒãxÅóx€±Hm/ƒ@œ,€[°à:À8*-–"<_‘"°Ü<_°ØKÿõÜ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<8€8 8c£¬H|-ƒ|vx@Ž &W`€[°à;À8-bH8€…ãxH{©|~y&@‚€[°à8-"H(€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<ŸƒãxÅóx€„±H~m/ƒ@œ,€[°à:À8--–"<_‘"°Ü<_°ØKÿôÜ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€”°ì€z°Ð…ãxH~/ƒ@œ0;À€[°à:À8$-ž"<_&W`‘"°ÜKÿõ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!HzÑ-ƒ|vx@Ž$€[°à85"<_°Ø<_‘"°ÜH¬ƒµ±D€y°Ô¤ëxH{•|~y@‚8<_¤ëx€B« €bHy¹€[°à85=?b<_°Ø‘i°ÜH`8`H|.||x@’$€[°à85"<_°Ø<_‘"°ÜHГà <¿8’˜0~óx€¥±tHz/ƒAœt€A8??ƒ¹°ð8b˜8Hw±|~yA‚X8‘˜D~óxÅóx:àHzU/ƒAœ|¥ëxƒãx~ijxH{|wxHd€^Ãóx€| ¦| xN€!/—@ž$€[°à85"<_°Ø<_‘"°ÜHL€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c£œHyu|~y&@‚N€[°à;€87bHô8€~å»xHx….||x@’€[°à87"H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€°ü~ã»x…ãxH{M/ƒ@œ0;À€[°à87,"<_&‘"°Ü<_°ØKÿñ¸€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c£ŒHxy|~y&@‚N€[°à;€8=bHø8€~å»xHw‰.||x@’€[°à8="H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<Ÿ~ã»x…ãx€„±HzM/ƒ@œ0;À€[°à8=,"<_&‘"°Ü<_°ØKÿð¸€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c£|Hwy|~y&@‚N€[°à;€8?bHø8€~å»xHv‰.||x@’€[°à8?"H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€±~ã»x…ãxHyQ/ƒ@œ0;À€[°à8?,"<_&‘"°Ü<_°ØKÿï¼€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c£lHv}|~y&@‚N€[°à;€8AbHü8€~å»xHu.||x@’€[°à8A"H €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€“°ø~ã»x…ãxHxU/ƒ@œ0;À€[°à8A,"<_&‘"°Ü<_°ØKÿîÀ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<8€8 8c£\Hu|~y&@‚,N€[°à;€8Hb<_=?°Ø‘i°ÜKÿîL8€~å»xHt.||x@’$€[°à8H"<_°Ø<_‘"°ÜKÿî€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<Ÿ~ã»x…ãx€„±Hw5/ƒ@œ0;À€[°à8H,"<_&‘"°Ü<_°ØKÿí €\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€z°Ð€™°ð~å»xHvÅ/ƒ@œ0;€€[°à;À85."<_&W€‘"°ÜKÿíÔ€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!8`Hvq|`yA‚<_8`±xHvY|`y@‚€[°à8)"Kÿê<_8`ƒÂ«<_±|<_>“±€9)‘>Hv|`yA‚<_8`±„Huý|`y@‚€[°à8N"Kÿê4<_8`±ˆHuÕ|`y@‚€[°à8j"Kÿê ~<_=?8`±Œ“ɱ9k‘~Hu™,@‚€[°à8w"KÿéÐ8!<_a€¹áÿ¼b±”|¦}q }p N€ €W~ã»x€| ¦| xN€! A‚0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!A’0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!AŽ8€V8Bÿÿ/‚V@ž$€V~óx€| ¦| xN€!``€A88!€a¹áÿ¼8b˜8|¦}q }p KÿiÌ€]8Bÿÿ/‚]@žëèKÿëÌ€]8Bÿÿ/‚]@žï¬Kÿï€]8Bÿÿ/‚]@žò”Kÿòx€^8Bÿÿ/‚^@ž÷¨Kÿ÷Œ``?Ÿƒ¼¤P8¤P/Ažç@|xKÿæè`|¦¾aÿÌ|ƒ#x|@&BŸ|¤+x8è¦A”!ÿp<ß<¿8Æ8¥|ä8á89<D8<@9!@9ADHnU;À/ƒAžhHp<_:`8€B—-“"<_‘"—<_—HìM€<_8=?:`€B—b<_—‘i—HÀ<_8Ãx~ü»x€B—"<_‘"—<_—H”M€<_Ãx~ü»x:`€B—8"<_‘"—HX<_8Ãx~ü»x€B—"<_‘"—<_—Hß<<Ÿƒ–‘P€c‘\€K8BK!<€I8BIa@€K8BKAD€J8BJ<€„—49)‘<HoÑ|~y@‚M€<_8™ãxšãx€B—”ãx:`ãx"<_—<_‘"—: -@Ž ôH M<_8=?:`€B—b<_—‘i—Hà<_8Ãx~ü»x€B—"<_‘"—<_—H´<_;`8Ãx€B—.~ü»x"<_‘"—<_—H€<_8 Ãx~ü»x€B—"<_‘"—<_—HT`8`Ho}.|{x@’`M<_8™ãxšãx€B—:`”ãxãx"<_—<_‘"—€^8Bÿÿ/‚^@ž ”H t```€A8ÃóxdÛx"9)‘"€8 Ho±|}y@‚HM€<_8™ãxšãx€B—”ãxãx:`"<_‘"—<_—Kÿÿx``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`8`Ho-|~y@‚DM€<_8™ãxšãx€B—”ãxãx:`"<_‘"—<_—Kÿý|`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`<Ÿ€aD€„—pHlÅ|{y@‚@M€<_8šãx”ãx€B—ãxÙóx:`"<_‘"—<_—Kÿüô<Ÿ€„—`Hlu|zy@‚HM<_8M€šãx”ãx€B—ãxÙóx:`: "<_‘"—<_—H d€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!a@€K8BK<9)ÿÿ/‰‘<@ž€\ƒãx€| ¦| xN€!‚@ãxÙóxH~ü»xÃxÔóxyÛx~ƒ£xHj/ƒÿÿA¾ùÄ/ƒ@X~ƒ£x8€8 Hkm|~yA¢ùÐHj!.|{xA²û¸€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`cÛxHm]|xyÀ&@‚PHk-/ƒ@ž<_<Ÿ€B‘l8„~”€bHlÍWÞÀ>Ò WÞ@><_WÞ >Ñ WÞ`>€B—H”`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`cÛxHlÍ|wyÀ&@‚pHj/ƒ@ž<_<Ÿ€B‘l8„~”€bHl=WÞÀ>Ò WÞ@><_WÞ >Ñ WÞ`>Ãx€B—"<_:`: 8‘"—<_—H0€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`cÛxHl|iyA¢T€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€B‘l8„~”€bHkuH```Hi¡/ƒA¾ø<_: ~ü»xÃx€B—-:`8Mˆ"<_‘"—Kÿÿ(€[cÛx€| ¦| xN€!``CÓxÃxHiù-ƒ|sxA®÷¤?¿€a<€—X:½—XHhÙ|~yA¢÷ˆ$ËxHiÉ.|{xA²ùl€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```?ŸcÛx€œ—„Hhu|~y@¢Kx8BIHЀ^Ãóx€| ¦| xN€!`A²óD: -€[8Bÿÿ/‚[@žó0€[cÛx€| ¦| xN€!Kÿó`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`AŠ0€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!<;À8c~´KÿYU€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€AD"9)ÿÿ/‰‘"@žL€aD€C€| ¦| xN€!H0```€[8Bÿÿ/‚[@ž÷PKÿ÷,``8!Ãóxa€ºaÿÌ|¦}r }q }p N€ ``|@&|¦¾!ÿÄ|sx|”#xBŸè¦A”!ÿp>?ƒÑL#9)‘#€D8BD>9)‘>H^Ý/ƒÿÿ@ž4<_8=?€B…b<_… ‘i…ƒLÃxH`Kÿ@|vy@‚ˆ<_8€€B\€bH`å|~yA‚<8€8 KÿS€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<_8ƒ=?€B…b<_… ‘i…Kÿÿp```<Ÿ~c›x€„…hH^å|wy@‚ì<_8…=?€B…b<_… ‘i…Kÿÿ(<_8…=?€B…b<_… ‘i…HôM <_zÛx˜ãx:@€B…8†"<_‘"…HX=?:@<_zÛx)…-˜ãx€ 9 †…HÐMˆ<_zÛx˜ãx; €B…8‡"<_‘"…<_… HhMKÿÿÌ```8€H_m-ƒ|yx@Ž`M <_8…Úóx:@€B…Øóx"<_… <_‘"…```€W8Bÿÿ/‚W@ž°Hˆ``€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`#ËxH\-|wy@‚DM<_8…Úóx:@€B…Øóx"<_‘"…<_… H4```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`Úóx: Øóx`~ã»xH_-ƒ|yx@®0H\í/ƒAžPM <_:@€B…"H ``H[a-|rxAªýÀ€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`~C“xH^|{yÀ&@‚`H\m/ƒ@ž<_<Ÿ€Bh8„l€bH^ WÞ >Ñ WÞ`><_; €B…"<_8…… <_‘"…Kÿþ8`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`~C“xH]ý||yÀ&@‚`H[Í/ƒ@ž<_<Ÿ€Bh8„l€bH]mWÞ >Ñ WÞ`><_8…=?€B…zÛx; b<_… ‘i…Kÿý”€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`~C“xH]]|iyA¢T€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bh8„l€bH\µH```HZá/ƒA¾(=?<_; zÛx)…˜ãx-™€ 9 ……<_‘"… KÿüÄ€R~C“x€| ¦| xN€!``~ƒ£xdÛxH[9-ƒ|yxA®ûœH\©|}xHZa.@²û´€Y8Bÿÿ/‚Y@ž$€Y#Ëx€| ¦| xN€!``€VV¾8~ƒ£x„ãx¢ñ.HZÍ-|rxAªûˆH\=|}xHYõ/ƒ@¾û¨€R8Bÿÿ/‚R@ž(€R~C“x€| ¦| xN€!```€V:µ˜ãxzÛx|Bò“¢Kÿü˜€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!’¶<߀v~¤«x8 €ÆH~Þ³xHV HÔ€W~ã»x€| ¦| xN€!```AŽ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!AŠ0€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!8<8¡@8a8HYµ<8clØHU)€<€¡@|~x€a8HY5/ž@ž ƒÑL`Ãóx;ÀHVÙ€Z8Bÿÿ/‚Z@ž$€ZCÓx€| ¦| xN€!``€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€T8Bÿÿ/‚T@ž@€T~ƒ£x€| ¦| xN€!H$€R8Bÿÿ/‚R@žý Kÿüü``8!Ãóxa€º!ÿÄ|¦}r }q }p N€ ``|¦¿ÿð|œ#xBŸ8€|½+x覔!ÿ €˜| ¦| xN€!|~yA‚È=?<¿<ß8)vdƒãx¤ëx8¥`ä8ÆuD8á89<‘> <8€I8BIHSA/ƒAž8€^8B^!8€I8BIa<€K8BK€a8€Ò WÞ@><_WÞ >Ñ WÞ`>8ì€Bz¹ëx:à: ¸ëx"<_‘"z<_zKÿþ|`8`HN½|yy@‚D<_-8í¹ëx€Bz:à: Mˆ¸ëx"<_‘"z<_zKÿþ,`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€a8HP½|zyA‚ ¸ëxH@M<_8îM€¸ëx:à€Bz: "<_‘"z<_zKÿý¨ØóxCÓxHSé|~y@‚pHQ½/ƒAž4<_: 8îÃx€Bz-•;€:àN M "<_z<_‘"z€Z8Bÿÿ/‚Z@ž8H```€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`<Ÿ#Ëx€„z4HPÕ.||x@’8M<_8ïM:à: €Bz"<_‘"z<_zKÿÿ`€a<ÄóxHQ‰-ƒ|wx@ŽM <_: €Bz"Hp8`HQ-|ux@Š0<_8ï=?€Bzb<_z‘izKÿþø``’ã ~¤«xƒãxHQ•|}y@‚° W½€><_8V:à€Bnè"<_nàKÿþÜ`HEÁ.|wxA’Ì€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`~ã»xHHý|~y &A‚dHI |yxHFÅ/ƒ@žt€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```~ã»xHH|~y &@‚@HFm/ƒ@ž<_<Ÿ€Bi<8„Vd€bHH <_€BnèbHÜ``HHq|{xHF)/ƒ@¾ÿØ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!~ã»xHH |iyA¢T€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bi<8„Vd€bHGeH```HE‘/ƒA¾<_;À€Bnè, &b```8V<_=?nà‘inäKÿý €W~ã»x€| ¦| xN€!<W 8;€I"Y.<€I|BZ“bKÿýœ€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€\<ß8 ;À€Æi“€\`€‚€bHAuH €ZCÓx€| ¦| xN€!`¸ A‚<€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```A’0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!<;Àÿÿ8cVèKÿ;€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!/ž@œl€\8Bÿÿ/‚\Až0;€HP```€W8Bÿÿ/‚W@žþ@Kÿþ$€\ƒãx;€€| ¦| xN€!```8!€ƒãx€aºáÿÜ|¦}p N€ |¦¾ÁÿØ|{xBŸ|ƒ#x|¤+xè¦8”!ÿ€<_<ß<¿€Bh 8Æa$8¥P$8á89<8Aß???:à{`ƒÁ8€^€B4/‚Až0€ /€Až$Ãóx„ãxH?é|~xH````ƒãxHCÍ|}yA‚LÃóx¤ëxHBÙ€]|~x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/ž@ž€Yg쀒øgägèH`ÃóxHCý|}xHAµ/ƒAž,€Yg쀒øgägè€^8Bÿÿ/‚^@žØH¼€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`W‚:;œ;šà¢I.@žþÌ€aKx8BIH,€^Ãóx€| ¦| xN€!<;À8cP(Kÿ7•€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!8!€Ãóx€ºÁÿØ|¦N€ ``|¦¿ÿà|}xBŸè¦”!ÿ ??ƒY^ô#9)‘#€Z8BZc #€K€‰AœP<_8€8 XÓx€B^ì€bKÿ3u<_8Z=?€Bd¼b<_d´‘id¸HP```€/€@žXÓxH ```<Ÿ€k €„eH>å||y@‚,<_8\XÓx€Bd¼"<_d´<_‘"d¸Hä€\} =4KU)8/ˆ€J|‰.Až€ /€AžH<]|~xHd|ƒ#xH@M|{y@‚`&;ÀHTƒãxdÛxH?M€[|~x8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!``,`&@‚H<_8\ƒ^ô€Bd¼"<_d´<_‘"d¸€\8Bÿÿ/‚\@žÀHœ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€y^ôØóx€C8Bÿÿ/‚C@ž€C€| ¦| xN€!€/€AžÈ€}H?1||y@‚(<_8^=?€Bd¼b<_d´‘id¸HT8`H=Ý|~y`&@‚0<_8^=?€Bd¼b<_d´‘id¸Kÿÿ ``= <Äóx€I8BI€ “ž €cd@H>9||y@‚(<_8^=?€Bd¼b<_d´‘id¸H„€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€šãx/€Ažx8`H<Ý|iy@‚(<_8`=?€Bd¼b<_d´‘id¸H €X€y^ô}>Kx8BX“ €\8B\“‰€C8Bÿÿ/‚C@ždHH€\€y^ôžãx8B\H`€X€y^ôÃx8BX#9)ÿÿ/‰‘#@ž€C€| ¦| xN€!`=Üóx9)‘=€^8B^Hx€\ƒãx€| ¦| xN€!``x A‚<€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```<;€8cMKÿ1õƒÙ^ô€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!`ƒãx€»ÿà|¦N€ ```|¦¿!ÿä||xBŸè¦”!ÿ ?_ƒÚY$#9)‘#€^8B^# €C€ ‚AœT<_8€8 Ùóx€BYÛóx€bKÿ-¥<_8==?€B^ìb<_^ä‘i^èH ```€/€@žÙóxH°```<Ÿ€c€„_4H9|}y@‚<<_8?ÙóxÛóx€B^ì"<_^ä<_‘"^èH°```=| €\)4KTB8/‰|‚P.Až€ /€AžH6|{xHh|ƒ#xH:q|~y@‚À&;`H\£ëxÄóxH9q€^|{x8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```/›À&WÞà@žD<_8?ƒ:Y$€B^ì"<_^ä<_‘"^è€]8Bÿÿ/‚]@žlHH`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€zY$yÛx€C8Bÿÿ/‚C@ž€C€| ¦| xN€!€/€Ažh<Ÿ€|€„_4H7i|}y@‚0<_8AƒzY$€B^ì"<_^ä<_‘"^èH`=| €\)4€ TB8/‰|B€‚Až€ /€AžH4Ý|{xHd|ƒ#xH8Í|~y@‚À&;`HX£ëxÄóxH7Í€^|{x8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``/›À&WÞà@ž4<_8A=?€B^ìb<_^ä‘i^èKÿþd```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`ƒÚY$€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€/€Ažˆ8`H6¡|iy@‚(<_8C€B^ì"<_^ä<_‘"^èH„€Y8BY“) €[8B[“i€^8Bÿÿ/‚^Až }>KxH¸€^Ãóx}>Kx€H˜€[8B[>9)ÿÿ/‰‘>Až ~ÛxH|€^Ãóx~Ûx€| ¦| xN€!H\``€YzY$8BY+9)ÿÿ/‰‘+Až}{[x>ËxH$€K}c[x}{[x>Ëx€| ¦| xN€!<Ýóx9)‘<€^8B^H”€]£ëx€| ¦| xN€!``WÞ >Ð WÞà>Až8€[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!ƒzY$HƒzY$``<; 8cGpKÿ+UƒÚY$```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!`£ëx€»!ÿä|¦N€ ```|¦¾!ÿÄ|xx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8ÆX8¥5øH/‘/ƒAž¸8<_8`ƒ"Rp9)‘8€Y8BYH/!|wy@‚8<_8 =Ëx€BX8"<_X0<_‘"X4HÀ```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€X‚¢/•@:À>>Ÿ>_: ```~óxH3ý|~yA‚ü8`H2Í.|{x@²04X88€IX0SX4€^8Bÿÿ/‚^@žØH¼€X|dx8BX“Ó <€cW¼H31|zyA‚°€[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!``€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`<Ÿ~ã»xYÓx€„XdH11.|{xA’$<Ÿ€x €„X€H1|~yA‚0>xVÊ8)4€K/‰|Š.Až€ /€AžH.½|}xHT|ƒ#xH2­||yA‚¼Ãóx„ãxH1¹€\|}x8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`,€&A‚p€^8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``8`H0ý|~yA‚„“¾ 8`€Z8BZ“^H0Ù|}y€&@¢€TX8€’2X0X4Kÿþ`“Ý cÛx¤ëxH1e|~yA‚,€[8Bÿÿ/‚[@ž(€[cÛx€| ¦| xN€!```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`:Ö•°@žý`€W~þ»x~ý»x8BWH\€^Ãóx€| ¦| xN€!@’tH$€&<_; 8€BX8"H€&<_; 8€BX8"<_X0<_‘"X4H4<_8=?€BX8b<_X0‘iX4H; ,€&€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!˜ A‚x€]8Bÿÿ/‚]@žd€]£ëx~ý»x€| ¦| xN€!HL<_~ý»x8€BX8"H<_~ý»x8€BX8"<_X0<_‘"X4H ~ý»x`<;À8c@àKÿ$õ€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`8!€Ãóx€aº!ÿÄ|¦}p N€ |¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8ÆQì8¥/ØH)q/ƒAžh9<_8`ƒÂLP9)‘9€^8B^H)|zy@‚8<_8Ýóx€BR"<_R<_‘"RH ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@„;>ß>_>¿>Ÿ:```€–RDCÓxH+ù||yA‚ô<Ÿ€y €„R`H+á.|~x@²D &W½€€UR;`€’tRR€\8Bÿÿ/‚\@ž4H```#yW 8)4€K/‰|Š.Až$€ /€AžH)E|{xH\``|ƒ#xH--|}yA‚TÃóx¤ëxH,9€]|{x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/› &W½à@¾4;`€UR/›€’tR &W½àRKÿÿ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H+M.|~x@²€URKÿþ¸`“c ÄóxƒãxH+å|}y@¢ &€UR;`KÿþŒ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`;—À@žý¨`€Z^Óx]Óx8BZHÌ€\ƒãx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!W½ >° W½à>Až`€[8Bÿÿ/‚[@žL€[cÛx]Óx€| ¦| xN€!H0<_8]Óx€BR"<_R<_‘"RH]Óx<;À8c:ÜKÿõ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦½áÿ¼|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿp<ß<¿8ÆM 8¥+H$¡/ƒAž(9<_8`ƒÂG€9)‘9€^8B^H$1|xy@‚8<_8ÒÝóx€BMH"<_M@<_‘"MDH````€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚Â/–@:à>Ÿ>¿>?>>_:Ô9àÕ€”MtÃxH')|{yA‚´€y €•MH'.|~x@²H &W½€€SMH;€;@M€’M@MD€[8Bÿÿ/‚[@žÀH¤``#yVú8)4€K/‰|‚Ð.Až$€ /€AžH$u||xH\``|ƒ#xH(]|}yA‚LÃóx¤ëxH'i€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`-œ@®<;@€SMH;€/š€’M@ &W½àMDMœKÿÿ ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€y €•MH%¹.|~x@², &W½€€SMH;@€‘òM@MDKÿþ¬``#y)4€K/‰|BÒ€‚Až$€ /€AžH#5|zxH\``|ƒ#xH'|}yA‚TÃóx¤ëxH&)€]|zx8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/š &W½à@¾4;@€SMH/š€‘òM@ &W½àMDKÿýà```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H%=.|~x@²€SMHH4`“ƒ “C8`H%-ƒ||x@®( &W½`€SMH;@€’M@MDKÿýH`“à „ãxcÛxH%•|~y@¢, &€SMH;À;@N€’M@MDKÿý`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`:÷–¸@žü`€XÃxÃx8BXHü€[cÛx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŽ0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!W½ >° W½à>Až`€Z8Bÿÿ/‚Z@žL€ZCÓxÃx€| ¦| xN€!H0<_8ÔÃx€BMH"<_M@<_‘"MDHÃx<;À8c6(Kÿe€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!Ãóxa€¹áÿ¼|¦}q }p N€ ```|¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8ÆF„8¥$hH/ƒAžh9<_8`ƒÂ@à9)‘9€^8B^H‘|zy@‚8<_8ÙÝóx€BF¨"<_F <_‘"F¤H ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@„;>ß>_>¿>Ÿ:`Û``€–FÔCÓxH ‰||yA‚ô<Ÿ€y €„FðH q.|~x@²D &W½€€UF¨;`€’tF F¤€\8Bÿÿ/‚\@ž4H```#yW 8)4€K/‰|Š.Až$€ /€AžHÕ|{xH\``|ƒ#xH!½|}yA‚TÃóx¤ëxH É€]|{x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/› &W½à@¾4;`€UF¨/›€’tF  &W½àF¤Kÿÿ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`HÝ.|~x@²€UF¨Kÿþ¸`“c ÄóxƒãxH u|}y@¢ &€UF¨;`KÿþŒ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`;—À@žý¨`€Z^Óx]Óx8BZHÌ€\ƒãx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!W½ >° W½à>Až`€[8Bÿÿ/‚[@žL€[cÛx]Óx€| ¦| xN€!H0<_8Û]Óx€BF¨"<_F <_‘"F¤H]Óx<;À8c/¨Kÿ…€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8ÆA¸8¥˜H1/ƒAžh9<_8`ƒÂ<9)‘9€^8B^HÁ|zy@‚8<_8ßÝóx€BAØ"<_AÐ<_‘"AÔH ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@„;>ß>_>¿>Ÿ:`á``€–BCÓxH¹||yA‚ô<Ÿ€y €„B H¡.|~x@²D &W½€€UAØ;`€’tAÐAÔ€\8Bÿÿ/‚\@ž4H```#yW8)4€ /‰|B€‚Až € /€AžH|{xHX`|ƒ#xHí|}yA‚TÃóx¤ëxHù€]|{x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/› &W½à@¾4;`€UAØ/›€’tAР&W½àAÔKÿÿ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H .|~x@²€UAØKÿþ¸`“c ÄóxƒãxH¥|}y@¢ &€UAØ;`KÿþŒ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`;—À@žý¨`€Z^Óx]Óx8BZHÌ€\ƒãx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!W½ >° W½à>Až`€[8Bÿÿ/‚[@žL€[cÛx]Óx€| ¦| xN€!H0<_8á]Óx€BAØ"<_AÐ<_‘"AÔH]Óx<;À8c*øKÿµ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦¿Aÿè|š#xBŸ|{x覔!ÿ #9)‘#€D8BD<Ÿ€c €„=dH½|~y@‚4<_8Å=?€B= b<_=‘i=HÐ```DÓxH}|}y€&@‚@<_8Å=?€B= b<_=‘i=€^8Bÿÿ/‚^@žŸ>¿>?>>_:§9਀”9dÃxH|{yA‚´€y €•9€H.|~x@²H &W½€€S98;€;@M€’9094€[8Bÿÿ/‚[@žÀH¤``#yVú8)4€K/‰|‚Ð.Až$€ /€AžHe||xH\``|ƒ#xHM|}yA‚LÃóx¤ëxHY€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`-œ@®<;@€S98;€/š€’90 &W½à94MœKÿÿ ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€y €•9€H©.|~x@², &W½€€S98;@€‘ò9094Kÿþ¬``#y)4€K/‰|BÒ€‚Až$€ /€AžH%|zxH\``|ƒ#xH |}yA‚TÃóx¤ëxH€]|zx8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/š &W½à@¾4;@€S98/š€‘ò90 &W½à94Kÿýà```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H-.|~x@²€S98H4`“ƒ “C8`H-ƒ||x@®( &W½`€S98;@€’9094KÿýH`“à „ãxcÛxH…|~y@¢, &€S98;À;@N€’9094Kÿý`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`:÷–¸@žü`€XÃxÃx8BXHü€[cÛx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŽ0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!W½ >° W½à>Až`€Z8Bÿÿ/‚Z@žL€ZCÓxÃx€| ¦| xN€!H0<_8§Ãx€B98"<_90<_‘"94HÃx<;À8c"¤KÿU€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!Ãóxa€¹áÿ¼|¦}q }p N€ ```|¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8Æ2€8¥XH ñ/ƒAžh9<_8`ƒÂ,Ð9)‘9€^8B^H |zy@‚8<_8¬Ýóx€B2˜"<_2<_‘"2”H ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@„;>ß>_>¿>Ÿ:`®``€–2ÄCÓxH y||yA‚ô<Ÿ€y €„2àH a.|~x@²D &W½€€U2˜;`€’t22”€\8Bÿÿ/‚\@ž4H```#yW 8)4€K/‰|Š.Až$€ /€AžH Å|{xH\``|ƒ#xH ­|}yA‚TÃóx¤ëxH ¹€]|{x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/› &W½à@¾4;`€U2˜/›€’t2 &W½à2”Kÿÿ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H Í.|~x@²€U2˜Kÿþ¸`“c ÄóxƒãxH e|}y@¢ &€U2˜;`KÿþŒ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`;—À@žý¨`€Z^Óx]Óx8BZHÌ€\ƒãx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!W½ >° W½à>Až`€[8Bÿÿ/‚[@žL€[cÛx]Óx€| ¦| xN€!H0<_8®]Óx€B2˜"<_2<_‘"2”H]Óx<;À8c$Kÿu€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦¾AÿÈ|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8Æ-´8¥ ˆH!/ƒAžh9<_8`ƒÂ(9)‘9€^8B^H±|zy@‚8<_8²Ýóx€B-È"<_-À<_‘"-ÄH ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Y‚â/—@„;>ß>_>¿>Ÿ:`´``€–-ôCÓxH©||yA‚ô<Ÿ€y €„.H‘.|~x@²D &W½€€U-È;`€’t-À-Ä€\8Bÿÿ/‚\@ž4H```#yW8)4€ /‰|B€‚Až € /€AžHñ|{xHX`|ƒ#xHÝ|}yA‚TÃóx¤ëxHé€]|{x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/› &W½à@¾4;`€U-È/›€’t-À &W½à-ÄKÿÿ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`Hý.|~x@²€U-ÈKÿþ¸`“c ÄóxƒãxH•|}y@¢ &€U-È;`KÿþŒ``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`;—À@žý¨`€Z^Óx]Óx8BZHÌ€\ƒãx€| ¦| xN€!A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!W½ >° W½à>Až`€[8Bÿÿ/‚[@žL€[cÛx]Óx€| ¦| xN€!H0<_8´]Óx€B-È"<_-À<_‘"-ÄH]Óx<;À8cpKþû¥€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!€Ãóx€aºAÿÈ|¦}p N€ |¦BŸ}h¦=k|¦…‹"@}‰¦N€ |¦BŸ}h¦=k|¦…‹"$}‰¦N€ |¦BŸ}h¦=k|¦…‹"}‰¦N€ |¦BŸ}h¦=k|¦…‹!ì}‰¦N€ |¦BŸ}h¦=k|¦…‹!Ð}‰¦N€ |¦BŸ}h¦=k|¦…‹!´}‰¦N€ |¦BŸ}h¦=k|¦…‹!˜}‰¦N€ |¦BŸ}h¦=k|¦…‹!|}‰¦N€ |¦BŸ}h¦=k|¦…‹!`}‰¦N€ |¦BŸ}h¦=k|¦…‹!D}‰¦N€ |¦BŸ}h¦=k|¦…‹!(}‰¦N€ |¦BŸ}h¦=k|¦…‹! }‰¦N€ |¦BŸ}h¦=k|¦…‹ ð}‰¦N€ |¦BŸ}h¦=k|¦…‹ Ô}‰¦N€ |¦BŸ}h¦=k|¦…‹ ¸}‰¦N€ |¦BŸ}h¦=k|¦…‹ œ}‰¦N€ |¦BŸ}h¦=k|¦…‹ €}‰¦N€ |¦BŸ}h¦=k|¦…‹ d}‰¦N€ |¦BŸ}h¦=k|¦…‹ H}‰¦N€ |¦BŸ}h¦=k|¦…‹ ,}‰¦N€ |¦BŸ}h¦=k|¦…‹ }‰¦N€ |¦BŸ}h¦=k|¦…‹ô}‰¦N€ |¦BŸ}h¦=k|¦…‹Ø}‰¦N€ |¦BŸ}h¦=k|¦…‹¼}‰¦N€ |¦BŸ}h¦=k|¦…‹ }‰¦N€ |¦BŸ}h¦=k|¦…‹„}‰¦N€ |¦BŸ}h¦=k|¦…‹h}‰¦N€ |¦BŸ}h¦=k|¦…‹L}‰¦N€ |¦BŸ}h¦=k|¦…‹0}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹ø}‰¦N€ |¦BŸ}h¦=k|¦…‹Ü}‰¦N€ |¦BŸ}h¦=k|¦…‹À}‰¦N€ |¦BŸ}h¦=k|¦…‹¤}‰¦N€ |¦BŸ}h¦=k|¦…‹ˆ}‰¦N€ |¦BŸ}h¦=k|¦…‹l}‰¦N€ |¦BŸ}h¦=k|¦…‹P}‰¦N€ |¦BŸ}h¦=k|¦…‹4}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹ü}‰¦N€ |¦BŸ}h¦=k|¦…‹à}‰¦N€ |¦BŸ}h¦=k|¦…‹Ä}‰¦N€ |¦BŸ}h¦=k|¦…‹¨}‰¦N€ |¦BŸ}h¦=k|¦…‹Œ}‰¦N€ |¦BŸ}h¦=k|¦…‹p}‰¦N€ |¦BŸ}h¦=k|¦…‹T}‰¦N€ |¦BŸ}h¦=k|¦…‹8}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹ä}‰¦N€ |¦BŸ}h¦=k|¦…‹È}‰¦N€ |¦BŸ}h¦=k|¦…‹¬}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ pygr.cdict.IntTupleArrayholder for array of integer index valuesisDoneset_vectorreallocpygr.cdict.CGraphIteratoriterator for looping over elements in CGraphDictpygr.cdict.CDictIteratoriterator for looping over elements in CDictionarypygr.cdict.CGraphDictgeneral purpose graph in C; key_index supplies mapping to integer indexeskey_indexiteritemsitervaluesitemskeysvaluespygr.cdict.CDictionaryRefholds a reference to a CDictpygr.cdict.CDictionarygeneral purpose dict in C; key_index supplies mapping to integer indexespygr.cdict.CIntDictionaryboth keys and values MUST be integersget_more__getitem____iter____len____init____next__cdict.pyxselfOraise: arg 3 must be a traceback or Noneinstance exception may not have a separate valueraise: exception must be an old-style class or instancepygr.cdict.CIntDictionary.__getitem__pygr.cdict.CIntDictionary.iteritemspygr.cdict.CIntDictionary.itemspygr.cdict.CIntDictionary.keyspygr.cdict.CIntDictionary.__iter__pygr.cdict.CDictionary.__getitem__pygr.cdict.CDictionary.itervaluespygr.cdict.CDictionary.iteritemspygr.cdict.CDictionary.__iter__pygr.cdict.CDictionaryRef.itervaluespygr.cdict.CDictionaryRef.iteritemsgraphidictOiMissing type objectArgument '%s' has incorrect type (expected %s, got %s)pygr.cdict.CDictionaryRef.__cinit__pygr.cdict.CDictionaryRef.__iter__pygr.cdict.CGraphDict.__getitem__pygr.cdict.CGraphDict.valuespygr.cdict.CGraphDict.itervaluespygr.cdict.CGraphDict.iteritemspygr.cdict.CGraphDict.__iter__pygr.cdict.IntTupleArray.__getitem__npygr.cdict.IntTupleArray.reallocvector_lendimskipIndexOO|OOpygr.cdict.IntTupleArray.__cinit__pygr.cdict.KeyIndex.__init__kOOpygr.cdict.__getitem__pygr.cdict.KeyIndex.__getitem__qmlistpygr.cdict.QueryMatchIterator.__init__gqcompilermatchesdataGraphquery_fOOOOOpygr.cdict.QueryMatchList.__init__pygr.cdict.QueryMatchList.__len__pygr.cdict.QueryMatchList.get_more__import__OOOOpygr.cdict.QueryMatchList.__getitem__pygr.cdict.QueryMatchList.__iter__pygr.cdict.QueryMatchIterator.__next__gyieldKeysyieldValuesO|OOpygr.cdict.CGraphIterator.__init__cdcdrO|OOOpygr.cdict.CDictIterator.__init__cdict__builtin____builtins__CIntDictionaryCDictionaryCDictionaryRefCGraphDictCDictIteratorCGraphIteratorIntTupleArray__doc__pygr.cdict__module__dataTupleunpack sequence of wrong sizepygr.cdict.CGraphQueryMatch.__init__pygr.cdict.cdict_initdpygr.cdict.CGraphDict.__cinit__pygr.cdict.CIntDictionary.__cinit__vectorgotoNextO|Opygr.cdict.IntTupleArray.set_vectorpygr.cdict.CGraphIterator.__next__pygr.cdict.CDictIterator.__next__pygr.cdict.CGraphDict.itemspygr.cdict.CGraphDict.keyspygr.cdict.CDictionaryRef.itemspygr.cdict.CDictionaryRef.keyspygr.cdict.CDictionaryRef.valuespygr.cdict.CDictionaryRef.__getitem__pygr.cdict.CDictionary.itemspygr.cdict.CDictionary.keyspygr.cdict.CDictionary.values3À(#ÀPˆA˜AŒPxû3à@ì@Äe`4 $4î AP4 aÀAchange the number of hits to be loaded as one blocksave vector for continuing from this point, or next point0\ 0$ 4("pQtQLQ@Q0Eû4D"ð#@ÐñPQ ›°"4x R`R8R,REû4” À!@p÷ R žà€4ÈSD”DˆRøEû4à p[0D(DÜ5, 58XÐ5DVp5PýÐ5Xð5`QÀM°ð5h`S°EèEÜS Eû5„  K`E|H`58Eð5DC€5PÀ5X`5`0p5¤ðTXG<G0THEû5¼PBFÐÙà58?°5D=P5PÐ5X#p5`(@9€Ð6 UHpHdTðû6$7€H$ç 5X3°5P/ 58,ð+P`6L°6X†6dŽ€6p~6xz06„à6d°6xwÐ6x¾ð6XnI8get the integer index for python object k, or create one if needed6xkV NPV$ND V(N0V,N V0N V4N V8Mü V<Mð V@MèVDMÜ VHMÔVLMÈ VPM¼ VTM° VXM¤ V\M V`MœVdM VhMˆVlM€VpMt VtMh VxM`V|MXV€MPV„MHVˆM< VŒM4VM,V”M$V˜MVœLèV LÔV¤L 3V¨LXFV¬L0%V°KìAprovide queryMatch mapping based on a list of (node,edge) tuplesiterate over items in QueryMatchListprovides mapping of query nodes / edges onto CGraphDict nodes / edgesconstruct integer index for sets of python objectsindex out of boundscd or cdr must be non-Nonethis type cannot do slicing...typessortquery_fqueryNodeqmlistobjectmatcheskeyskey_indexiteritemsitemsisDoneindex_keysigqigqcompilerget_morefromNodedataGraphappend__next____len____iter____init____getitem__SliceTypeQueryMatchListQueryMatchIteratorKeyIndexCGraphQueryMatch66œ8È8Ð:@:@:h:t:x6œ6œ:Ð6œ;6œ;@;L;T;`6œ6œ6œ:Ð6œ6œ@>Hàà@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@P@@OX@OT@OL@OD@O@@O8@O4@O,@O(@O$@O @O@O@O@O @O@O@Nü@Nô@Nì@Nä@Nà@NØ@NÐ@NÈ@NÄ@NÀ@N¼@N¸@N°@N¬@N¤@N @N˜@N@NŒ@Nˆ@N„@N|@Nt@Np@Nh@Nd@KÔ@KÌ@KÄ@K¼@K´@K¬@K¤@Kœ@K”@KŒ@K„@K|@Kt@Kl@Kd@K\@KT@KL@KD@K<@K4@K,@K$@K@K@K @K@Jü@Jô@Jì@Jä@JÜ@JÔ@JÌ@JÄ@J¼@J´@J¬@J¤@Jœ@J”@JŒ@J„@J|@Jt@Jl@Jd@J\@JT@JL@JD@J<@J4@J,@J$@J@J@J @J@Iü@Iô@Iì@Iä@IÜ@IÔ@IÌ@IÄ@I¼@I´@I¬@I¤@Iœ@I”@IŒ@I€@I|@I4@I,@I(@I@I@I @I@Hü@Hø@Hì@Hè@HÜ@HØ@HÌ@HÈ@H¼@H¸@H¬@H¨@Hœ@H˜@H|@Hh@HH@HD@H8@H4@H(@H$@H@GØ@GÐ@G¼@G´@Gœ@G˜@G”@G|@Gp@GH@G4@G@G@G@G@Fô@Fð@Fä@Fà@FÔ@FÐ@F¬@F„@F|@Fp@Fl@Fh@F`@FH@FD@F@@F(@F@Eô@Eà@EÀ@E¼@E°@E¬@E @Eœ@E@EŒ@E€@E|@EX@E0@E(@E@E@E@E @Dô@Dð@Dì@DÔ@DÈ@D @DŒ@Dl@Dh@D\@DX@DL@DH@D<@D8@D,@D(@D@CÜ@C¸@C´@C¬@C @Cœ@C˜@C@Cx@Ct@Cp@CX@CL@C@C@Bô@Bð@Bì@Bà@BÜ@BØ@BÐ@B¸@B´@B°@B˜@BŒ@B\@BT@B4@B0@B,@B @B@B@B@Aø@Aô@Að@AØ@AÌ@A¤@A˜@A@AŒ@A@A@@ü@@ø@@ð@@ì@@Ä@@ @@|@@x@@\@@T@@<@@8@@4@@@@@Ol@Oh@P8@P4@P0@P,@P(@P$@P @P@P@P@P@P @P@P@P@Oü@Oø@Oô@Oð@Oì@Oè@Oä@Oà@OÜ@OØ@OÔ@OÐ@OÌ@OÈ@OÄ@OÀ@O¼@O¸@O´@O°@O¬@O¨@O¤@O @Oœ@O˜@O”@O@OŒ@Oˆ@O„@O€@O|@Ox@Ot@Op@[@p@md–d¤f¥<´€.DD ˜DœD  D¤D ¬D °D ¸DÄD ÈDÌDÐDàÂ$Õ@Þ@çÀèàøé€ø€"€5€_€n€†€­$hNø.DDD$D,®$À@É$DND.PDPD!PD#dD'tÊ$Pá@ï@ý€ €$(Nx.€D+€D/€D3ˆD2ŒD4D5 D6¬D8ÀD9ÐD4ÔD5ðD6ôD> $+€3@*<@*E@,N€Y@, d@, m@-vÀ€wàx$N.DCDFDCDF DC$DF,DG0DI8DJDDIHDJLDKPDO`y$CŽ@B—@D¡À¢àx£€´€Ê€ö€ € "€ J$hNx.€D^€Db€DfˆDeŒDgDh Di¬DkÀDlÐDgÔDhðDiôDq K$^€ b@] l@] u@_ ~@_ ‰@_ ’@` œÀ€ à ž$N.DuDv Ÿ$u ²@t »€ Ë$N. DS DU4DVPDUXDV\DdDlDUtDW€DXˆDZ Ì$S ß@R é@T òÀ ó@V üÀd ýàt þਠÿ$ˆN¨ d¨ d° *d° 7f 8< G€ U#À ‚Pˆ ¤A˜ ÈAŒ ëPx @ì 7@Ä ae` Šî »AP îaÀ A L0 z\  ¬$  Ö"p Qt 'QL LQ@ pQ0 “"ð Â#@ îÐñPNQ y›°©"Ó R`"R8FR,iR‹ À¹!@äp÷ BR lžà›€ÄîS D”.DˆNRøm ˜pÀ[0ìD(D:Ü`XÐVp»ýÐäð QÀ6M°eðŒ`ºS°ÝEèEÜ&S I x ¤K`ÔE|ÿH`)EðZC€ŒÀ¹`å0FpqðœTX¼G<ÞG0ÿTHKPtB¡FÐÉÙàð?°=PMÐw#p (@Ë9€ûÐ#QUtHp™Hd½Tðà7€H$;ç e3°‘/ ¾,ðï+P"`MU˜uUœšU ÃU¤ìU¨H˜E°uH¨«†ÞH¸Ž€AHÈs~¢HØÕz0Hè<àpHø§°ÛIwÐFI{¾ð­I(Ün I8 6I| bk ‹U¬ ³U° ÜIŒ îV !NP!V$!%ND!0V(!LN0!WV,!oN !zV0!N!˜V4!­N!¸V8!ÊMü!ÔV<!æMð!ñV@"Mè" VD"MÜ"*VH":MÔ"DVL"WMÈ"bVP"tM¼"~VT"M°"›VX"¯M¤"ºV\"ÇM "ÑV`"ÜMœ"æVd"úM#Vh#Mˆ#Vl#.M€#9Vp#LMt#WVt#jMh#tVx#‚M`#V|#žMX#©V€#¹MP#ÄV„#ÔMH#ÞVˆ#ñM<#ûVŒ$ M4$V$%M,$0V”$?M$$JV˜$VM$aVœ$mLè$xV $„LÔ$V¤$›L $¦V¨$²LX$½V¬$ÉL0$ÔV°$àKì$ëU´$úNd% Nh.°DT°DX¸DT¼DXÀDTÄDUÌDTÐDXÔDUèDXìDYüDZ D[D` DbP% $T°%Z@T%l@T%~@T%€U8%£@V%²&WNh%È€%Ô€%ã€%ý€&€&C€&R€&€&©€&Ó€&ä€+€+¡€+»€+Ì€+å€+ö€,€,"€,=€,N€,e€,v€,Ž€,Ÿ€,°€,Á€,Ò€,ê€,û€-€-'€-C€-T€-p€-€-²€-À-߀-ð€.€.€.3€.N€.j€.{€.Œ€.€.¹€.Õ€.í€.þ€/€/(€/?€/P€/h€/x€/ˆ€/˜€/¨€/¸€/È€/ç€0€0(€09€0I€0Y€0i€0†€0–€0¦€0¶€1€1€2€2€2 €20€6;€7J€7§€8/€8J€8\€8r€8„€8š€8ª€8Ä€8Ý€8ï€9€9€93€9E€9b€9t€9‘€9¤€9Æ€9á€9ÿ€:€:5€:Y€:l€:€: €:À:Ô€:å€:ö€;€;€;)€;:€;K€;\€;mÀ°;nàh;o$¸Nh.pD ´pD ·„D ½D ¿´;p$ ´p;¥@ ´;¹$\NÌ.ÐD SÐD VäD \ðD ^;º$ SÐ;ð@ S<$\N,.0D –0D ˜@D ™LD žPD  l<$ –0<;@ –€>€>K€>^€>z€>£€ “8>¯€ “<>º€ “@>ÄÀ>Åà>Æ$Nô.D ŸD ¢D £(D ¦<>Ç$ Ÿ>ù@ Ÿ?@ Ÿ ? @ Ÿ?@  ? €?+€?>€?Y€?jÀ?kàL?l$LNL.PD ¨PD ¬hD «pD ¬tD ­xD ¬|D ­ˆD ¯¸?m$ ¨P?œ@ ¨?¥@ ª ?®ÀP?¯àÐ?°$€NÐ.ÐD °ÐD ²ÜD °äD ²ìD ³øD ´D ³D ´ D ¶H?±$ °Ð?ß@ °?è@ °?ó@ ±?ü@ ²@ÀÐ@à`@$N`.`DE`DGtDHÀDIøDJüDIDJDIDJDI@$E`@<@E@E€@Ü$ÀN . DL DO<DPHDR`DSlDVˆ@Ý$L A@LA@LA&@LA0@MA9À A:àœA;$|Nœ. DX D\¼D[ÄD\ÈD]ÌD\ÐD]ÜD^D_D`D_ D`,DbXA<$X An@XAw@ZA€À AàpA‚$ÐNp.pDcpDe|Dc„DeŒDf˜Dg¸Df¼DgÀDièAƒ$cpA´@cA½@cAÈ@dAÑ@eAÚÀpAÛàAÜ$N.D÷DûD C$Dü(D D,D B0D D8D G<D JDD OPDþ€Dÿ”D˜Dÿ¤D¬D°DèDAÝ$÷B @÷B€B–€B©€BÁ€Bï€C€C€CJ€ú8CV€ú<Ca€ú@CkÀClà°Cm$N. D D 4D HD \Cn$ CŸ@C¨@ C³@C½@CÆÀ CÇàlCÈ$LNl.pDpDˆDD”D˜DœD¨DØCÉ$pC÷@D@ D ÀpD àðD $€Nð.ðDðDüDD DD8D<D@DhD $ðD9@DB@DM@DV@D_ÀðD`à€Da$N€.€D¤€D¦ˆD¤ŒD¦œD§¬D©´DªÌD¬àDb$¤€D‘@¤Dœ@¤D¥@¤D®€E€€E“€E°@¦ E¹À€EºàôE»$tNô. D® D° D± `D² ˜D³ œD²  D³ ¤D² ¨D³ ´D² ¼E¼$® Eï@®Eø$ÀN À. ÀDµ ÀD¸ ÜD¹ èD»!D¼! D¿!(Eù$µ ÀF-@µF6@µFA@µFK@¶FTÀ ÀFUà!<FV$|N!<.!@DÁ!@DÅ!\DÄ!dDÅ!hDÆ!lDÅ!pDÆ!|DÇ!´DÈ!¸DÉ!¼DÈ!ÀDÉ!ÌDË!øFW$Á!@Fˆ@ÁF‘@ÃFšÀ!@F›à"Fœ$ÐN"."DH"DJ"DH"DJ",DK"<DM"DDO"\F$H"FÍ@HFØ@HFá@HFê@JFóÀ"Fôà"pFõ$`N"p."pDQ"pDS"„DT"ÄDU"ÈDT"ÌDU"ÐDT"ÔDU"àDT"èFö$Q"pG*@QG3€G߀Gò$|N"ì."ðDW"ðDZ#D[#D^#,Gó$W"ðH(@WH1@W H<@WHF@XHOÀ"ðHPà#<HQ$LN#<.#@D`#@Dd#XDc#`Dd#dDe#hDd#lDe#xDg#¨HR$`#@H„@`H$€N#À.#ÀDí#ÀDð#ÔD ×#äDñ#èD Ø#ìD Ô#ðD Ø#øD Ù#üD ß$D à$D á$ D æ$Dó$@Dô$TDõ$XDô$dDõ$lD÷$pDø$ˆHŽ$í#ÀHÁ@íHÊ€ï8HÖ€ï<Há€ï@HëÀ#ÔHìà$pHí$ÜN$œ.$ Dù$ Dû$¬Dù$´Dû$¼Dü$ÈDý$èDü$ìDý$ðDÿ%Hî$ù$ I@ùI'@ùI2@úI;@ûIDÀ$ IEà%0IF$N%0IG%0.%0D—%0D˜%8D—%<D˜%DD—%HD˜%`D™%pDš%„Dœ%˜D%¨D %àD¡%øDÐ&D£& D¦&0D¨&4D«&PD±&dD²&pD·& Dº&ÐD»&àD¼&äDÔ&øDÍ&üDÔ'DÍ'$D¿'0DÐ'PDÑ'€DÒ'°DÔ'ÌDÒ'ÐDÔ'ÔDÒ'ÜDÔ'àDÒ'èDÔ'ðDÒ'üDÔ(IT$—%0Ig@—Is@—I€@—IŠ$ôN($I‹(0.(0DG(0DP(TIŸVDQ(`DR(hDS(pDT(|I¯V DU(ˆDV(DW(˜DX(ÐDY(ÜDZ)I¸VDj)TDk)`Dq)tDr)€Ds)ˆDu)Dv)°Dw)àDx*Dy*@Dz*€D{* Dz*¤D{*¨Dz*°D{*´Dz*¼D{*ÄDz*ÐD{*ØDu+D{+ IÆ$G(0Ià@GIð@HJ@IJ@JJ'@KJ:@LJN@MJ_@NJq€J„€J—€Jµ€JÔ€LZ€NÈ€NÛ€Nì€Nÿ€O€O:€OY€Ou€Qˆ€QÓ€Qæ€Qù€R €R*€RN€R_€SU€ShÀ(0Sià+DSj$N+D.+PDÏ+PDÔ+pDØ+tDÔ+xDÕ+€DØ+ŒSkVDÙ+ÐDÝ+ÜDÞ+äDß+üDå, Dî,`Dñ,pDò, Dô,ÌSt$Ï+PS­@ÏSÁ@ÏSÒ@ÐSå@ÑSô@ÓTÀ+PTà,äT$”N,äTUÄ.,ðD²,ðD·-D²-D·-D²-D·-D¸-4D¹-8D¸-@D¹-HDº-€DÅ-°D»-ÐD¼.DÆ.0D½.PDÅ.„DÆ. DÇ.ÀDÊ.ÐDÌ/T$²,ðTR@²Tf@²Tx@²TŠ@³T™@´T¨@µT·&¶UÄTÏ€TëÀ,ðTìà/Tí$(N/TîUÈ./ Du/ D/8Du/@D/DDu/HD/PD€/lD/pD„/tD/xD€/|D/„D„/D…/ÐDŠ0D‹0DŒ00D0DDŒ0HD0LD¥0„DŽ0 D0ÐD0ðD‘0ôD”0øD•10D—14D˜1pD™1 Dš1ÐD‹2Dž2D¥2(D¦2@D§2pD¨2 DŒ2ØD¨3D©3D¬3 D­3PD¯3€U$u/ U6@uUJ@uU\@uUn@vU@wU@xUŸ@yU®@zU½@{UÌ@|UÛ@}Uê&~UÈV€VÀ/ Và3¨V $ˆN3¨V!UÌ.3°D%3°D.3ÈD%3ÐD.3ÔD%3ØD.3àD/3üD04D34D04D/4 D04D34 D44`D94D:4˜D;4ÀD<4ÔDN5 D=50D>5PD@5TDA5€DB5°DC5àD:6DG6 DN68DO6PDP6„D;6¼DP6äDQ6ðDT7DU70DW7`V6$%3°Vh@%V|@%VŽ@%V @&V±@'VÂ@(VÑ@)Và@*Vï@+Vþ@,W &-UÌW%€WAÀ3°WBà7€WC$ÐN7€.7€DZ7€D_7œD^7 D_7¬D`7àDk8Da80Db8`Dl8Dc8°Dk8äDl9Dm9 Dp90Dr9\WD$Z7€Wz@ZWŽ@[W@\W¬@]W»À7€W¼à9tW½$ôN9t.9€D…9€D‹9 DŒ9¬D9¸D:Dª:4D‘:PD’:€D“:ÀD”:ðD˜:üD™;Dš;D ;@D ;|D¡;€D ;„D;œD;¨D;°D;ÄD;ÐD;ÔD;ØD¡<D¢<0DªDÿ>0D>@D>DD>LD>TD>XD>\D>`D>D>°D>äD?D?4D?PD?`D?X–$õ=PXË@õXß@õXñ@õY@öY@÷Y!@øY0@ùY?&úUÐYW€YsÀ=PYtà?°Yu$`N?°YvUÔ.?°DÐ?°DÖ?ÈDÐ?ÐDÖ?ÔDÐ?ØDÖ?àD×?üDØ@D×@DØ@ DÙ@@Dê@tDÚ@DÛ@ Dá@¤DÛ@¬DÝ@´DÞ@¸DÜ@¼Dá@ÀDì@ðDâADêADDëA`DìA”DíA°DðAÀDòAðY‹$Ð?°Y¿@ÐYÓ@ÐYå@ÐY÷@ÑZ@ÒZ@ÓZ$@ÔZ3&ÕUÔZK€ZgÀ?°ZhàBZi$`NB.BDµBDºB DµB$D¹B0DºB<D»BpD½BtD»B|D¼B„D½BˆDÆB¸D¾BÐDÆCDÈC DËC0DÍC\Zj$µBZ@µZ±@¶ZÀ@·ZÏ@¸ZÞÀBZßàCtZà$dNCtZáUØ.C€DvC€D|C˜DvC D|C¤DvC¨D|C°D}CÌD~CÐD}CÔD~CÜDDD’DDD€D`DDpD‰DtDD|D‚DŒDƒDD„D”D…D˜D†D¤D‰D¨D”DØDŠDðD’E$D“E@D”EtD•ED˜E DšEÐZö$vC€[.@v[B@v[T@v[f@w[u@x[„@y[“@z[¢&{UØ[º€[ÖÀC€[×àEð[Ø$pNEð[ÙUÜ.EðDOEðDUFDOFDUFDOFDUF DVF<DWF@DVFDDWFLDXF€DkF´DYFÐDZFàDbFäDZFìD[FüD\GD]GD^GD_GDbGDmGHDcG`DkG”DlG°DmGäDnHDqHDsH@[î$OEð\%@O\9@O\K@O\]@P\l@Q\{@R\Š@S\™&TUÜ\±€\ÍÀEð\ÎàH`\Ï$pNH`\ÐNp.H`D8H`D:HpD8HtD:H„D;H”D=HœDÜH D=H¬DÜH°DØH¼DÜHÀD=HÈD>HØDØHÜD>HàDÜHìDÝHøDßHüDÝIDÞIDßIDI DI(DßI@DñIDDßIHDñITDßI\DñIlDôIpDIDâI¸DãIÄD IàDãJDäJ0DçJ8DèJLDéJ€DìJ„DéJˆDìJDôJ´DõJÐD?KD@KDCKD\å$8H`]@8] @8])@8]2@:];ÀH`]<€Ø8]R€Ù<]f@Ú]uÀH ]vàH¬]w€Ø8]€Ù<]¡@Ú]°ÀH°]±àHÈ]²€Ø8]È€Ù<]Ü@Ú]ëÀHÜ]ìàHà]í€Ø8^€Ù<^@Ú^&ÀHì^'@ß^5ÀI ^6àI@^7@ß^EÀI^FàI¸^G@ß^UÀIà^VàJ^WàK^XàK\^Y$üNK\.K`D*K`D0KtD*KxD/KˆD0KœD1KÐDDLD2L D3L0D;L4D3L<D4LLD5LPD6LTD7LXD8LdD;LhDFL˜D<L°DDLäDEMDFM4DGMPDJM`DLMŒ^Z$*K`^@*^¤@+^³@,^Â@-^Ñ@.^àÀK`^áàM¬^â$LNM¬.M°DÏM°DÙMÐD×MØDØMäDÜMðDÙMôDÜMøDÙMüDÜNDÝN@D NpDÞNDßNÀD NøDàODáO@DåOLDæOTDçOlDðODñOÐDòPDöPDòPDôPDóPDöP D÷PTDøP€DýP¬DùP°DýP´D PÄD PàD QD QD Q@D QpD Qœ^ã$ÏM°_@Ï_,@Ï_=@Ð_P@Ñ_d€_w@Ó_†@Ô_•@Õ_¤ÀM°_¥àQ´_¦$NQ´_§Uà.QÀD úQÀD QØD úQàD QäD úQèD QðD R D RD RD RD RD R$D R0D RpD R D R¨D RÀD RÐD 3RøD SD SD SD S D S$D S(D S<D SpD !S D S¨D !S¬D "SÀD #SÐD %SÔD #SÜD $SäD %SèD &TD 'T@D (TpD T D ,T°D TÈD "TìD 3UD 4U(D U`D !UxD 4U D 6U°D 9UÀD :UðD ;V D =VP_¼$ úQÀ_ì@ ú`@ ú`@ ú`$@ û`5@ ü`I@ ý`Z@ þ`i@ ÿ`x@ `‡@ `–@ `¥& Uà`½€`ÙÀQÀ`ÚàVp`Û$°NVp`ÜUä.VpD PVpD VVˆD PVD VV”D PV˜D VV D WV¼D XVÀD WVÄD XVÌD YWD jW4D ZWPD [W`D aWdD [WlD ]WtD ^WxD \W|D aW€D lW°D bWÐD jXD kX D lXTD mXpD pX€D rX°`ñ$ PVpa%@ Pa9@ PaK@ Pa]@ Qal@ Ra{@ SaŠ@ Ta™& UUäa±€aÍÀVpaÎàXÐaÏ$`NXÐaÐUè.XÐD +XÐD 1XèD +XðD 1XôD +XøD 1YD 2YD 3Y D 2Y$D 3Y,D 4Y`D EY”D 5Y°D 6YÀD <YÄD 6YÌD 8YÔD 9YØD 7YÜD <YàD GZD =Z0D EZdD FZ€D GZ´D HZÐD KZàD M[aå$ +XÐb@ +b,@ +b>@ +bP@ ,b_@ -bn@ .b}@ /bŒ& 0Uèb¤€bÀÀXÐbÁà[0bÂ$`N[0.[0D [0D [@D [DD [PD [\D [D [”D [œD [¤D [¨D ![ØD [ðD !\$D #\@D &\PD (\|bÃ$ [0bõ@ c @ c@ c'@ c6À[0c7à\”c8$dN\”.\ D K\ D V\ÄD U\ÌD W\ÐD U\ÔD V\ÜD W\èD [] D ^](D _]4D y]lD `] D b]¤D `]¨D b]¸D a]ÀD b]ÈD Š^D c^ D d^PD e^`D l^D o^¬D p^ÐD u_D v_D w_0D x_HD Š_lD x_pD y_€D z_”D |_˜D }_ÀD ~_ðD ` D v`PD ƒ``D w`xD Š` D ‹`¸D Œ`ôD a0D a@D ‘apD “aœc9$ K\ cq@ Kc…@ Kc˜@ Mc©@ Nc¿€cÐ@ Ocá@ Pcð@ Qcÿ@ Rd@ Sd@ Td,À\ d-àa¼d.$Na¼d/N|.aÀD ¤aÀD ¬aØD ¤aàD ¥aäD ¤aèD ¬aðD ¥bD ¬bD ­bD ®bD ­b D ®b(D ±b4D ´b<D µbxD ¸b|D ¹b°D ÆbèD ºcD »c,D ¼c`D ½ctD ¾c D ¿cÌD ÀcäD ÁdD ÃdD ÁdD Ãd D Æd8D ÇdPD ¿d„D Èd¤D ÉdÐD ÌdàD ÍeD Ïe@dE$ ¤aÀdy@ ¤d@ ¤dŸ@ ¤d±€ ¥8dÁ@ ¦dÐ@ ¨dß@ ©dî@ ªdý& «N|e€e1ÀaÀe2àe`e3$ Ne`e4N„.e`Däe`DåepDäetDåe„Dæe”D ÓeœeIVÈD Ôe eSVÌD Õe¤D Óe¬D Ôe°D Êe´D Õe¸D ËeÌD ÊeÐD ÕeÔD ÓeÜD ÔeàD ÕeäD ÖeôD ×fD ØfD Ùf D Úf0D Ýf@D Þf|D áf€D äf„D åfÀD èfÄD éfüD g,D êgPD ëg|D g´D ìgÌD ígøD ðhD ñh@D ôhDD õh€D ùhˆD õhŒD ùhD øh”D ùh˜D úh D ûhÔD üi D ýi8D þitD ÿi D i¨D iàD iäD iôD jD j0D j@D jpD j D jÐD kDçk0Dèk8Dëkte]$äe`eŒ@äe—@äe @äe©@åe²Àe`e³€ Ê8eÀ Ë<eÜ€ Ì@eî€ ÍDf@ Îf@ Ðf$@ Ñf3Àeœf4àk0f5àkŒf6$,NkŒf7N˜.kDkDk˜DkœDk Dk¤Dk¬Dk°Dk´DkÈDkÌDkÜDkìDl D&l\Dl€Dl°D lðD!m0D#m`D&m|D'm D*m°D,màfL$kf{@f@fŸ@f±€8fÄ@fÓ@fâ&N˜fú€gÀkgàmøg$hNmøgN .nD1nD?nD1n D?nD2nD1nD?n D1n$D?n(D2n@D3nDD6nHD7nLD9nPD?nTD@n`DBndDDnhDBnlD@npDAn|DBnŒDDnDBn˜DDn DMnÈDDnÌDMnÐDDnÔDMnØDEnàDFnôDGo0DHo4DFo<DMoPDNo€DMo„DNoŒDQoÀDNoÄDQoÈDNoÌDQoÐDRoØDSoàDhoäDSoðDgoøDhoüDgpDhpDipDjp Dlp,Dmp<DnpLDop\Dpp”DqpÌDrqDWqDrq DsqDtqDWq DXq8DwqPDxqˆDyqÀDTqøDWr,DXrLDYrxDZr¤D[ràD`s Das@Dbs|Des¨DfsäDgsüDht(Dit<Dkt@DitHDjtTDkt\Dlt„Dmt°DntÜDquDsuDtuHDsuLDtuPDuu€DvuÄD‚uÔDƒvD„vPD…vD†vÐDˆwD‹w DŒwPDw€Dw°g.$1ng`@1gr@1g„@1g–€28g©€3<g¹@4gÊ@5gÙ€6@gç€7Dgõ€9Hh@:h@;h#@<h2@=hA&>N hY€huÀnhv@gh†Àoäh‡àoðhˆ@gh˜Àoøh™àqhš@ghªÀq h«àq h¬@gh¼ÀqPh½àqøh¾àwÈh¿$ ÈNwÈhÀN¬.wÐD4wÐD:wØD4wÜD:wàD4wäD5wìD4wðD:wôD6x D5xD:xD;x$D?x(D;x,D<x8D?xHDBxDCxÐDIy DDy0DFy`DIy|DJy DMy°DNyàDPzhÕ$4wÐi@4i!@4i3@4iE€58iX€6<im@7i|@8i‹&9N¬i£€i¿ÀwÐiÀàz(iÁ$XNz(iÂN¸.z0DÆz0DÏz8DÆz<DÏz@DÇzDDÆzHDÏzTDËzlDÇzpDÈztDÉzxDÏz|DÊz€DÏz„DÐz D×z¤DÐz¨DÑz´DÒzÄDÓzÔDÔzäD×zôDÚ{0DÝ{pDà{°Dá{ìDê|$Dâ|@Då|lDç|¬Dê|ÈDë|àDî|ðDï} Dð}PDñ}€Dò}°Dô}ài×$Æz0j @Æj@Æj1@ÆjC€ÇHjV€ÈLjo€ÉPj…€ÊTj€ËXj³@ÌjÂ@ÍjÑ&ÎN¸jé€kÀz0kà}øk$ÈN}økNÐ.~Dø~Dþ~Dø~ Dþ~Dø~Dù~Dø~ Dþ~$Dù~8Dþ~<Dÿ~LD~PDÿ~TD~`D~tD ~¤D~ÀD~ðD 4D PD`Dk$ø~kR@økd@økv@økˆ€ù8k›@úkª@ûk¹@ükÊ&ýNÐkâ€kþÀ~kÿà¨l$¨N¨lNØ.°Dˆ°D“¸Dˆ¼D“ÈD‰ÌDˆÐD“ÜD‰ðD“ôD”€D—€D”€ D—€D˜€PD¼€°D™€ÐDšD›`DœD”Dž¬D¤ÐD¥‚ D¦‚TD§‚´D¨‚ðD©ƒ4DªƒlD«ƒpD´ƒtD¬ƒ|D­ƒ€D®ƒ„D¯ƒ”D´ƒœDµƒØD¶„D·„0D¹„\D¼„xD½„D¾„ÀD¿„ðDÀ… DÁ…`DÂ… DÅ…°DÇ…àl$ˆ°lL@ˆl^@ˆlp@ˆl‚€‰8l•@Šl¤@‹l³@ŒlÂ@ŽlÑ@là@lï@‘lþ&’NØm€m2À°m3à†m4$XN†m5Nà.†D8†DD†D8†DD†(D9†,D8†0DD†<D:†TD9†XDD†\DE†lDG†pDå†tmJVDG†|D冀DE†„DF†DJ† DG†¤D冨DJ†¬DG†°D冸D憼Dë†ÄDì†ÌDð†ðDñ†üDó‡ Dô‡$Dö‡8Dù‡\Dú‡Dû‡ÀDJ‡ðDKˆ0DPˆ`DQˆDxˆìDR‰DS‰@DT‰HDU‰€DW‰„DU‰ˆDW‰˜DV‰ DW‰¨DX‰ôDYŠ DZŠ0D_Š`DØŠdD_ŠhDØŠlDÙŠxDÚŠ€D_ŠˆDÚŠŒD_Š˜D`мDa‹Db‹HDc‹dDd‹De‹ØDfŒDgŒDlŒDhŒDlŒ DmŒdDnŒDxŒÈDyŒàDzD{DD|tD}°D€ÀDðD‚Ž D„ŽPmS$8†mŒ@8mž@8m°@8m€98mÕ€:<må@;mú@<n @=n@>n'@?n6@@nE@AnT@Bnc&CNàn{€n—À†n˜@Jn¤À†tn¥@ßn·@ànÉ@ânÜ@ãnîÀ†tnïà†|nðà†|nñ@JnýÀ†€nþ@ßo@ào"@âo5@ãoGÀ†€oHà†„oIà†„oJ@JoVÀ†¨oW@ßoi@ào{@âoŽ@ão À†¨o¡à†¬o¢à†¬o£@Jo¯À†¸o°@ßoÂ@àoÔ@âoç@ãoùÀ†¸oúà‡ðoûà‡ðoü@_pÀŠdp àŠhp @_pÀŠlpàŠˆp@_p$ÀŠŒp%àŠ˜p&àŽxp'$hNŽxp(Nì.Ž€DŽ€DŽˆDŽŒDŽDŽ”DŽœDŽ DޤDޏD޼DŽÌDŽÐDØŽÔDŽØDŽäDØŽèDÙŽôDÚŽüDD@D,tD D"”D œD!¨D"°D#¼D$ðD,$D-@D/€D2D4Àp=$Ž€ps@p…@p—@p©€8p¼@pË@pÚ@pé@pø&Nìq€q,ÀŽ€q-@q9ÀŽÔq:àŽØq;@qGÀŽèqHàqIàØqJ$XNØqKNô.àDfàDrèDfìDrøDgüDf‘Dr‘ Dg‘ Dr‘$Ds‘4Dt‘8Dw‘<Dt‘@Ds‘DDt‘PDw‘TDt‘\Dw‘dDx‘ D·‘üDy’ Dz’`D{’D|’ðD}“ D~“dD“¬D€“¼D“èD‚”Dƒ” D„”8DŠ”`DØ”dDŠ”hDØ”lDÙ”xDÚ”ˆDŠ”œDÚ”¤DŠ”¬D‹”ÔDŒ•$D•pDŽ•œD·•àD•èD–,D‘–XD’–˜D“–°D”–ÜD•—D–— D——XD˜—„D™—ÀDš—ÄDŸ—ÈD›—ÐDŸ—ÔD ˜D¡˜<D¢˜hD§˜”D¨˜¬D©˜äDª™8D«™dD¬™D­™äD°šD·š(D¸š@D¹špDºš D»šàD¼›D¿› DÀ›PD›€q`$fàqš@fq¬@fq¾@fqЀg8qã@hqý@ir @jr@kr*@lr9@mrJ€n<rX@org@prv&qNôrŽ€rªÀàr«@Šr·À”dr¸à”hr¹@ŠrÅÀ”lrÆà”œrÇ@ŠrÓÀ”¤rÔà”¬rÕà›¨rÖ$ ÈN›¨r×Nü.›°D %›°D .›ÀD %›ÈD &›ÐD %›ÔD ,›ØrìVÀD -›ÜröVÄD .›àD ,›èD -›ìD .›ðD &œD ,œD -œD .œ D /œ D 0œ$D /œ(D 0œ0D 1œ<D 3œLD 2œPD 3œ`DœhDœpDœD 6œÀD 7œÌD œèD 3D H@D KPD 7hD 8€D ;„D 8ˆD ;ŒD <ÄD ?ÈD CžD @žD Cž D KžD Lž0D Mž`D NžD PžÀs$ %›°s6@ %sJ@ %s\@ %sn€ &8s€€ '<s˜€ (@s²@ )sÁ& +NüsÙ€sõÀ›°sö@ 3tÀœhtàœÀt@ 3tÀœètàtàžØt$(NžØtO .žàD SžàD `žðD SžøD TŸD SŸD _Ÿt-V¼D ]Ÿ t7V´D ^ŸtAV¸D `ŸD _ŸD ]ŸD `Ÿ D ^Ÿ$D `Ÿ(D _Ÿ8D TŸ<D ]Ÿ@D ^ŸDD `ŸHD aŸ`D bŸdD aŸhD bŸpD cŸ|D fŸŒD dŸD eŸ D fŸ°DŸ¸DŸÀD gŸìDŸøD D  D @D `D k €D { ŒD | D   D g ÐD n¡D o¡ D p¡@D s¡HD v¡PD w¡`D x¡D ™¡œD ¡¸D €¡ÄD ¡ôD „¡üD ‡¢D ˆ¢D ‰¢DD ¢TD Ž¢dD ¢hD Ž¢lD ¢|D ¢„D ¢ŒD ¦¢¼D ‘¢àD ’£ D “£D ”£HD ™£pD š£”D £˜D ¡£ÔD ž£ØD ¡£ÜD ¦£äD ¨¤D «¤D ¬¤@D ­¤pD ®¤ D ¯¤ÐD ±¥tK$ Sžàt€@ St”@ St¦@ St¸€ T8tË€tÞ€ U<tö€ V@u€ WDu$@ Xu3@ ZuB@ [uQ& \O ui€u…Àžàu†@ fu”@ fuŸÀŸ¸u àŸìu¡@ gu¯ÀŸøu°à u±@ fu¿@ fuÊÀ uËà @uÌ@ guÚÀ @uÛà €uÜ@ guêÀ  uëà Ðuìà¥uí$8N¥.¥ DŠ¥ D’¥,DŠ¥8D’¥LDc¥TD’¥\Dc¥dD’¥hDc¥lD’¥pD“¥tD’¥xD“¥€D”¥„D•¥ˆD”¥”D•¥œD–¥ D•¥¤D–¥¬D—¥°D(¥ÐD)¥äD+¥ôD,¦D'¦D™¦ Dš¦8Dœ¦pD›¦€D¦„D›¦ˆDœ¦ŒD¦Dž¦œD ¦ÐDŸ¦ÔD ¦ØDŸ¦ÜD ¦àD¡¦äD¢¦ôD¤§DD£§HD¤§LD£§PD¤§TD¥§XD¦§hD¨§œD§§ D¨§¤D§§¨D¨§¬D©§°Dª§ÀD¬§ôD«§øD¬§üD«¨D¬¨D­¨D®¨D°¨LD¯¨PD°¨TD¯¨XD°¨\D±¨lD²¨ Dµ¨¨D¶¨ØDبÜD¶¨àDبäDÙ¨ìDÚ¨üD¶©DÚ©D¶©$DS©@D·©`D¸©Dº©”D8©ðD»©ôD8©øD»ªD8ªD9ªD;ªD™ªD;ª D=ª0D?ªHD»ª`D¼ª˜D¿ªÄDÀªüDÁ«$D«PDë”DÆ«ÀDÇ«øDȬ DɬLDʬDˬ¼D̬üDÍ­(DЭTDÑ­ŒDÒ­ DÔ­¤DÒ­°DÓ­ÀDÔ­ÄD8­ÔDÕ­ØD8­àD9­èD;­ðD?­üD;®D=® D?®$DÕ®<DÖ®XD×®„DØ®ÈDÙ®ðDÚ¯DÛ¯DDܯpDݯ°DÞ¯ÜDá°Dâ°$Dذ(DÙ°4DÚ°HDâ°PDÚ°\Dâ°hDã°ˆDä°´Dæ°¸D8°ÔDç°ØD8°àD9°èD;°ðD?°üD;±D=± D?±$Dç±<Dè±lD뱘Dì±ÔDí±üDî²(Dï²hDò²”Dó²ÐDô²øDõ³$Dö³hDù³”Dú³ÐDû³øDü´$Dý´hDþ´”Dÿ´ØDµDµ0Dµ`DصdDÙµpDÚµxDµŒDµ¬DµàDµäD8¶D ¶D8¶ D9¶D;¶D?¶(D;¶,D=¶8D?¶PD ¶hD ¶D ¶¼D¶ôD·D·HD·ŒD·¸D·ðD¸D¸DD¸ŒD¸¸D¸ðD¹D¹DD¹ˆD"¹´D#¹ìD$ºD%º@D&º„D)º°D*ºøD+»0D,»\D-»¤D.»ÐD/¼D0¼@D3¼lD4¼|D6¼€D4¼„D6¼ˆD9¼¤D=¼¨D9¼¬D7¼°D:¼¸D9¼¼D:¼ÀD9¼ÄD=¼ÌD>¼ØD@¼ÜD>¼àD@¼äDA½DE½DA½DE½ DH½(DF½,DI½0DL½4DF½8DI½<DH½@DL½HDZ½dDM½huîVÐDZ½lDM½xDZ½|DS½ŒDT½¤DU½ØDV¾DY¾@DZ¾DDY¾TDZ¾XDY¾dD?¾hD'¾Ðuø$Š¥ v @‹v@Œv'@v6@ŽvE@vT@vcÀ¥ vd@¶vpÀ¨Üvqà¨àvr@¶v~À¨ävà©v€@¶vŒÀ©và©$vŽ@»všÀ©ðv›@5v­À©ðv®à©ôv¯à©ôv°@»v¼À©øv½@5vÏÀ©øvÐàªvÑàªvÒ@»vÞÀªvß@5vñÀªvòàªvóàªvô@»wÀª w@5wÀª wàª`wàª`w@Õw"À­Ôw#@5w5À­Ôw6à­Øw7à­Øw8@ÕwDÀ­àwE@5wWÀ­àwXà­üwYà­üwZ@»wfÀ­üwg@5wyÀ­üwzà®w{à®w|@ÕwˆÀ®w‰@5w›À®wœà®<wà®<wž@âwªÀ°(w«à°Pw¬@âw¸À°\w¹à°hwº@çwÆÀ°ÔwÇ@5wÙÀ°ÔwÚà°ØwÛà°ØwÜ@çwèÀ°àwé@5wûÀ°àwüà°üwýà°üwþ@Õx À°üx @5xÀ°üxà±xà±x @çx,À±x-@5x?À±x@à±<xAà±<xB@xNÀµdxOൌxP@ x\À¶x]@5xoÀ¶xpà¶xqà¶xr@ x~À¶ x@5x‘À¶ x’à¶(x“à¶(x”@çx À¶(x¡@5x³À¶(x´à¶,xµà¶,x¶@ xÂÀ¶,xÃ@5xÕÀ¶,xÖà¶hx×à¶hxØ@»xäÀ¾hxå@5x÷À¾hxøà¾€xùྀxú@ÕyÀ¾€y@5yÀ¾€y྘y྘y@çy(À¾˜y)@5y;À¾˜y<ྰy=ྰy>@ yJÀ¾°yK@5y]À¾°y^à¾Ðy_à¾Ðy`à¾ìya$ÌN¾ìybO .¾ðD“¾ðD¥¾øD“¾üD¥¿D”¿ D“¿D¥¿D—¿4D”¿8D•¿<D–¿@D¥¿DDÏ¿`DÔ¿D俸Dî¿èDñÀDöÀ@DÀpDÀ D¦ÀÌD®ÀÐD±ÀÔD®ÀÜD±ÀàD¦ÀäD§ÀðD¨ÁD©ÁD®Á D±Á$D®Á(D±Á0D ÁtD!Á|DÕÁˆDåÁ°DéÁÜDÂD²Â@DÂŒD³Â°DµÂ´D³Â¼D´ÂÈDµÂÐD¶Ã D·ÃPD¸Ã€D»Ã°D¼ÄDÁÄ0DÂÄ„DÃÄÜDÄÅDÉÅ4DÊÅDDËÅpDÏÅDÑÅ DÔŨDÕÅÀDÖÅÐDƒÆD„ÆD~Æ DׯDDØÆ`DƒÆD„ƤD~ưDÛÆÔDÜÇDŒÇ@DÇPD~ÇxD‘Ç DßǬDàÇàDãÈDäÈDåÈ4DæÈHDçÈ€DèÈÐDéÉDêÉDëÉPDîÉ€DïÉ”DðÉàDñÊDòÊ(DôÊ`DõÊDöÊœD÷Ê´DøÊàDùÊðDúË DûË8DüËpDý˰DþËÄDÿËðDÌ0DÌ`DÌtDÌxDÌ|DÌÀDÌðDÍ DÍ4DÍHDÍ€DͰDÍÌDÍüDÎD Î0D!ÎpD"ΠD#ÎÐD&ÎàD'ÏD(Ï@D)ÏpD*Ï D+ÏÐD,ÐD-Ð0D.Ð`DàРD0ÐÀyw$“¾ðy¯@“yÁ@“yÓ@“y倔8yø€•<z€–@z)€—DzA@˜zR@™zl@šz}@›z‘@œz¥@z´@žzÃ@ŸzÒ@ zá@¡zò@£{&¤O {€{5À¾ð{6@‹ {BÀÇ@{CàǬ{DàÐè{E$øNÐè{FÐð.ÐðDÐðDÑDÑ DÑ,DÑ8DÑDD8ÑpDÑ€DÑ„DÑŒDѨDÑ´DÑàD'ÒD2ÒLD@ÒtDAÒœDFÒÌD(ÓD]Ó`D)Ó€D*Ó°D+ÔD-Ô@D.ÔHD/ÔTD2Ô€D3ÔDƒÔÀD„ÔÔD~ÔàD4ÕD5Õ0DƒÕ`D„ÕtD~Õ€D8Õ¤D9ÕÐDŒÖDÖD~Ö8D‘Ö`D<ÖlD=Ö D@ÖÀDAÖØDBÖìDC× DB×$DF×(DC×0DF×4DG×DDH×XDI×DL×”DI× DN׬DQרDT×ÜD]×üD^Ø D_ØPDØ€DØDØœDؤDبDذDØÀDcØÌDdÙDeÙ0DfÙ`D=ÙDhÙ°{g$Ðð{@{¡@{º@{Ë@{ß@{ð@|@ |@ |!@ |0@|?ÀÐð|@@‹ |LÀÖ|MàÖl|N€8|\€<|j€@|w@|‚ÀØ€|ƒàØÌ|„àÙØ|…$èNÙØ|†O4.ÙàD „ÙàD †ÙðD „ÙôD †ÚD ‡ÚD ‰ÚDpÚ DlÚ(D ‰Ú,DpÚ0D ‰ÚHDmÚLDlÚPD ‰ÚTDpÚ`DqÚlDrÚxDsÚˆDvÚ˜DyÚ¨DzÚ¸D~ÚðD{ÚôD~ÚøD{ÚüD~ÛDÛ0D€Û`D ‹Û D ŽÛä|›$ „Ùà|È@ „|Ó@ „|Ü@ „|å@ †|îÀÙà|ï€l8|ÿ€m<}ÀÚ }àÚ,}€l8})€m<}AÀÚ0}BàÚH}C€l8}S€m<}kÀÚL}làÚT}m€l8}}€m<}•ÀÚ`}–àÛ }—àÛü}˜$NÛü}™O@.ÜDëÜDíÜDëÜDíÜ,DîÜ<DðÜDDZÜHDðÜTDMÜXDZÜ\DðÜpDMÜtDNÜxDðÜ|DZ܈D[Ü”D\Ü D]ܰD_ÜÀDbÜÄD_ÜÈDbÜÐD¿ÝD¯ÝD¬ÝDD¨Ý\DcÝDfݘDgݨDlÝàDhÝäDlÝèDhÝìDlÝðDmÝüDnÞDoÞ$DpÞ\DvÞ DwÞðD|ß D~ßtDß|D€ß„D¿ßÌDƒßðD†à D‡àpDˆà D‰ààD‹àäDŒá0Dá`DŽáDáÀD“áìD­â8D”â`D¿âœD•â¨D–âÔDœãDžã4DŸã<D ãDD£ã€D¨ã¬D©ãÄD¨ãÈD¬ãÌD©ãÐD¬ãØD­ãìD®äD¯ä,D°ä@D±älD²äˆDµä´D·äÀDºäìD¿äüDÀåDÁåPDÂå€DÃå°DÆåÀDÇåðDÈæ DÉæPDÊæ€Dñæ°Dòæ¸Dõæô}®$ëÜ}Ú@ë}å@ë}î@ë}÷@í~ÀÜ~€M8~€N<~)@O~:@P~K@R~Z@W~i@X~xÀÜH~yàÜT~z€M8~Š€N<~¢@O~³@P~Ä@R~Ó@W~â@X~ñÀÜX~òàÜp~ó€M8€N<@O,@P=@RL@W[@XjÀÜtkàÜ|l€M8|€N<”@O¥@P¶@RÅ@WÔ@XãÀ܈äàæ°åàçæ$ NççOL.ç D éç D êç8D éç<D êçLD ëç\DÖçdDËçlDÖçpDËç„DÖçˆD×ç”DØç DÛç°DÜçðDàçôDÜçøDàçüDáèDâèDãè(DäèTDíè€DîèÀDéDïé DðéPDñéDóéÐDôéØDõéäDøê Dùê0Dƒê`DûêtDüêˆDƒêÀD„êÔD~êàDþêøDÿëDë$DŒëPDë`D~ëˆD‘ë°Dë¼DëøDìDìD ìDìD ì$Dì8DìdDìhDìxDì|Dì”Dì°DìðDí Dí0D í`D ìíD íí˜DíÀD ííØD ðîü$ éç €,@ é€7@ é€@@ é€I@ ê€RÀç €S€Ë8€c@Ì€t@Ï€ƒ@Ò€’@Ó€¡@Ô€°Àçd€±@‹ €½ÀëP€¾àë¼€¿àí€À€Ë8€Ð@Ì€á@Ï€ð@Ò€ÿ@Ó@ÔÀíÀàíØàî $Nî !OT.î D î D 'î0D î8D î@D îDD &îHD 'îLD &îTD 'îXD îhD &îlD 'îpD (î€D )î„D (îˆD )îD *îœD -î¬D .î°D /îÐD îÔDîðDïDïDï Dï,Dï0Dï4D /ï`D 0ï€D @ï¨D 1ïÀD 2ïðD .ïôD 2ïøD .ïüD 2ðD .ðD 6ðD 7ð@D 8ðDD =ð\D @ðxD AðD Dð D EðÐD FñD Hñ07$ î n@ ‚@ ”@ ¦€ 8»€ <Ò@ ã@ !ò@ "‚@ #‚& %OT‚(€‚DÀî ‚E@ /‚NÀîÔ‚O@‚XÀï‚Yàï`‚Zàï`‚[àñH‚\$(NñH.ñPD añPD jñlD iñtD lñ€D oñŒD pñD qñ¤D rñ°D qñ´D rñÀD yñðD zòD òPD {òTD ò\D {ò`D òhD {òlD òtDò„DòDò˜Dò¬Dò¸Dò¼DòÀD {òðD ¼ó D |ó@D }ópD †ó D ‰ó¬D ŠóàD ‹ô D ô$D ‹ô,D Œô8D ô<D Œô@D ôDD ôxD ‘ô¤D —ôÐD ’ôÔD —ôØD ˜ôàD ™õD õD ™õ D šõ(D ›õ,D œõ8D õ<D £õTD ¤õXD £õ\D «õpD ¬õtD «õ|D ¬õ„D ²õ°D µõ´D ²õ¸D µõÀD ¼õÐD ½õðD ¾ö0D ÁöDD ÂöpD Ãö D ÄöÐD Æöü‚]$ añP‚“@ a‚§@ b‚»@ c‚Ì@ d‚â@ e‚ñ@ gƒ@ hƒÀñPƒ@ {ƒÀòPƒàòTƒ@ {ƒ(Àò\ƒ)àò`ƒ*@ {ƒ5Àòhƒ6àòlƒ7@ {ƒBÀòtƒC@ƒLÀòƒMàòðƒNàòðƒOà÷ƒP$ÄN÷.÷ D Â÷ D Í÷<D Ê÷DD Í÷PD Ñ÷\D Ò÷pD Ó÷|D Ò÷€D Ó÷„D Ò÷ˆD Ó÷D Ú÷ÀD Û÷àD ø0D Üø4D ø<D Üø@D øHD ÜøLD øPDø`DølDøtDøˆDø”Dø˜DøœD ÜøÐD ùD Ýù D ÞùPD çù€D êùŒD ùÐD ëùÔD ùÜD ëùàD ùèD ëùìD ùôDúDúDúDú,Dú8Dú<Dú@D ëúpD ìú°D íúàD óûD ôûD õûPD öû\D ÷û`D øûlD ùûpD ÿû D û¬D ûðD ûôD ûøD üD ü@D üDD üHD üPD ü`D ü€D üÐD üðD ý D ýPD ý€D "ý¬ƒQ$ Â÷ ƒ†@ ƒš@ ë@ ă¼@ ŃÒ@ ƃá@ È ƒð@ ɃÿÀ÷ „@ Ü„ Àø0„ àø4„ @ Ü„Àø<„àø@„@ Ü„%ÀøH„&àøL„'@ Ü„2ÀøP„3@„<Àøl„=àøÐ„>àøÐ„?@ ë„JÀùЄKàùÔ„L@ ë„WÀùÜ„Xàùà„Y@ ë„dÀùè„eàùì„f@ ë„qÀùô„r@„{Àú„|àúp„}àúp„~àýÄ„$¤NýÄ„€Uì.ýÐD uýÐD ýèD uýðD ýôD uýøD þD €þD þ D …þ$D þ(D €þ,D ‚þ4D …þ@D †þ€D ‹þ°D Œþ¸D þàD þðD ¶ÿD ‘ÿ0D •ÿ4D ‘ÿ8D “ÿ@D ’ÿDD •ÿHD –ÿ\D —ÿD œÿÀD ˜ÿÈD œÿÌD ÿàD ÿøD žÿüD D žD  D žD D$D0D8D@DLDPDTD ž€D ŸŒD  ÀD ¡ÐD ¥ÔD ¢ØD £äD ¥èD ¦D ¨D ©(D ª`D «D ŒÀD ¯ÐD ¶èD ·D • D (D ¨PD ·tD ¸¬D èD œD ¸(D ¹0D ¼@D ½pD ¾ D ÀЄ•$ uýЄÄ@ u„Ø@ u„ê@ u„ü@ v… @ w…!@ x…2@ y…A@ z…P@ {…_@ |…n@ }…}& ~Uì…•€…±ÀýÐ…²@ ž…½Àÿø…¾àÿü…¿@ ž…ÊÀ…Ëà…Ì@ ž…×À …Øà…Ù@ ž…äÀ…å@…îÀ0…ïà€…ðà€…ñàð…ò$ Nð…óUð.ðD ÃðD ÌD ÃD ÌD ÃD Ì D Í<D Î@D ÑDD ÎHD ÍLD ÎTD Ñ`D Ò D ×ÐD ØØD ÙD ÚD îLD pD ÛtD |D Û€D „D ÛˆD ŒDœD°D¸DÀDÌDÐDÔD ÛD Ü@D ÝpD ÞD à”D áÀD âðD ã D ØPD ç`D îxD ïD ðÀD ÙD ð,D ñ0D ô@D õpD ÷ †$ Ãð†6@ ÆJ@ Æ\@ Æn@ Ć@ ņ@ ƆŸ@ dž®@ Ȇ½@ ɆÌ@ ʆÛ& ËUð†ó€‡Àð‡@ Û‡Àp‡àt‡@ Û‡(À|‡)à€‡*@ Û‡5À„‡6àˆ‡7@ Û‡BÀŒ‡C@‡LÀ°‡Mà‡Nà‡OàÀ‡P$ÐNÀ‡QUô.ÀDÀD§ØDàD§äDèD§ðD¨ D© D¬ D© D¨ D© $D¬ 0D­ pD²  D³ ¨D´ ÐDµ äDÑ D  @D¶ DDµ HD  LD¶ PD  TD¶ XD  \D lD €D ˆD D œD  D ¤D¶ ÐD· D¸ @D  €D¹ „D  ˆD¹ ŒD  D¹ ”D  œD ¬D ÀD ÈD ÐD ÜD àD äD¹ Dº PD» €D¼  D½ ¤DÀ ¨DÁ àDà äDÄ DÅ PDÆ €D³ °DÊ ÀDÑ ØDÒ ðDÓ DÔPD´”DÔ¼DÕÀDØÐDÙDÛ0‡f$À‡™@‡­@‡¿@‡Ñ@ž‡â@Ÿ‡ó@ ˆ@¡ˆ@¢ˆ @£ˆ/@¤ˆ>@¥ˆM&¦Uôˆe€ˆÀÀˆ‚@¶ˆÀ @ˆŽà Dˆ@¶ˆšÀ Lˆ›à Pˆœ@¶ˆ§À Tˆ¨à Xˆ©@¶ˆ´À \ˆµ@ˆ¾À €ˆ¿à ЈÀà ЈÁ@¹ˆÌÀ €ˆÍà „ˆÎ@¹ˆÙÀ ˆˆÚà ŒˆÛ@¹ˆæÀ ˆçà ”ˆè@¹ˆóÀ œˆô@ˆýÀ Àˆþà ˆÿà ‰àT‰$”NT‰Uø.`DÞ`DçxDÞ€Dç„DÞˆDçDè¬Dé°Dì´Dé¸Dè¼DéÄDìÐDíDò@DóHDôpDõ„D ¼D àDöäD ìDöðD ôDöøD üD D D(D0D<D@DDDöpD÷°DøàDùDûDü0Dý`DþDóÀDÐD èD D 0DôtD œD  D°DàD‰$Þ`‰I@Þ‰]@Þ‰o@Þ‰@߉’@à‰£@ቲ@â‰Á@ã‰Ð@ä‰ß@å‰î&æUøŠ€Š"À`Š#@öŠ.ÀàŠ/àäŠ0@öŠ;ÀìŠ<àðŠ=@öŠHÀôŠIàøŠJ@öŠUÀüŠV@Š_À Š`àpŠaàpŠbà0Šc$ÐN0ŠdUü.0D0DHDPDTDXD`D|D €D#„D ˆDŒD ”D# D$àD)D*D+@D,TD@ŒD °D-´D ¼D-ÀD ÄD-ÈD ÐDàDðDøDD DDD-@D.€D/°D0ÐD2ÔD3D40D5`D*D9 D@¸DAÐDBD+DDBlDCpDF€DG°DIàŠy$0Š­@ŠÁ@ŠÓ@Šå@Šö@‹@‹@‹%@‹4@‹C@‹R&Uü‹j€‹†À0‹‡@-‹’À°‹“à´‹”@-‹ŸÀ¼‹ àÀ‹¡@-‹¬ÀÄ‹­àÈ‹®@-‹¹ÀЋº@‹ÃÀð‹Äà@‹Åà@‹Æà‹Ç$ÐN.DúD D,D8D€D´DÐDD@D pD |D„DœDÀD üDD DD(D0DDDPDTDXD€D°DäD D!@D$PD%€D'¬‹È$úŒ@úŒ@úŒ&@ûŒ9@üŒH@ýŒW@þŒfÀŒg@ŒrÀüŒsàŒt@ŒÀŒ€@Œ‰À(ŒŠà€Œ‹à€ŒŒàÄŒ$ÄNÄŒŽV.ÐDÐD$èDðD$ôDøD$D%D& D)$D&(D%,D&4D)@D*€D/°D0¸D1àD2ôDN0D PD3TD2XD \D3`D dD3hD lD|DD˜D D¬D°D´D3àD4 D5PD D6”D ˜D6œD  D6¤D ¬D¼DÐDØDàDìDðDôD6 D7 `D8 D9 °D: ´D= ¸D> ðD@ ôDA!0DB!`DC!D0!ÀDG!ÐDN!èDO"DP"0DQ"`D1"¤DQ"ÌDR"ÐDU"àDV#DX#@Œ£$ÐŒÓ@Œç@Œù@ @@-@<@K@Z@ i@!x@"‡&#VŸ€»Àм@3ÇÀPÈàTÉ@3ÔÀ\Õà`Ö@3áÀdâàhã@3îÀlï@øÀùààúààû@6ŽÀŽà”Ž@6ŽÀ˜ŽàœŽ@6Ž À Ž!ऎ"@6Ž-À¬Ž.@Ž7ÀÐŽ8à Ž9à Ž:à#dŽ;$”N#dŽ<V.#pD[#pDd#ˆD[#Dd#”D[#˜Dd# De#¼Df#ÀDi#ÄDf#ÈDe#ÌDf#ÔDi#àDj$ Do$PDp$XDq$€Dr$”D†$ÌD $ðDs$ôD $üDs%D %Ds%D % D%D%0D%8D%@D%LD%PD%TDs%€Dt%ÀDu%ðDv&Dx&Dy&@Dz&pD{& Dp&ÐD&àD†&øD‡'Dˆ'@Dq'„Dˆ'¬D‰'°DŒ'ÀD'ðD( ŽQ$[#pŽ€@[Ž”@[ަ@[ޏ@\ŽÉ@]ŽÚ@^Žé@_Žø@`@a@b%&cV=€YÀ#pZ@seÀ$ðfà$ôg@srÀ$üsà%t@sÀ%€à%@sŒÀ% @–À%0—à%€˜à%€™à(@š$ÐN(@›V.(@D’(@D›(XD’(`D›(dD’(hD›(pDœ(ŒD(D (”D(˜Dœ(œD(¤D (°D¡(ðD¦) D§)(D¨)PD©)dD½)œD )ÀDª)ÄD )ÌDª)ÐD )ÔDª)ØD )àD)ðD*D*D*D*D* D*$Dª*PD«*D¬*ÀD­*àD¯*äD°+D±+@D²+pD§+ D¶+°D½+ÈD¾+àD¿,D¨,TD¿,|DÀ,€DÃ,DÄ,ÀDÆ,ð°$’(@á@’õ@’@’@“*@”;@•J@–Y@—h@˜w@™†&šVž€ºÀ(@»@ªÆÀ)ÀÇà)ÄÈ@ªÓÀ)ÌÔà)ÐÕ@ªàÀ)Ôáà)Øâ@ªíÀ)àî@÷À*øà*Pùà*Púà-û$ÐN-ü(%V ‘ (&V‘('V‘.((V‘D€‘P()V‘a€‘r&U°‘£&‚U¨‘Ñ&ƒU ’&„Uœ’/&…U˜’_&†U¤’&‡U¬’À&Mh’Ò&ŽM’ä&MÔ’ö&Mü“&‘M “&’M<“,&“M¼“>&”MH“P&•Mœ“b&–MX“u&—NP“ˆ&˜M¤“›&™MÈ“®&šM4“Á&›N0“Ô&œM$“ç&N“ú&žM” &ŸMˆ” & Mt”3&¡M`”F&¢M€”Y&£M,”l&¤Lè”&¥LÔ”’&¦ND”¥&§MP”¸&¨L ”Ë&©N”Þ&ªLX”ñ&«L0•&¬Mð•&­MÜ•*&®N •=&¯Kì•P&°Mè•c&±M°•v(³V •–(´V$•®(µV(•Ð(¶V,•î(·V0–(¸V4–"(¹V8–:(ºV<–R(»V@–i(¼VD–(½VH–—(¾VL–°(¿VP–È(ÀVT–à(ÁVX–ú(ÂV\— (ÃV`—(ÄVd—8(ÅVh—N(ÆVl—c(ÇVp—|(ÈVt—•(ÉVx—©(ÊV|—À(ËV€—Ö(ÌV„—ì(ÍVˆ˜(ÎVŒ˜(ÏV˜0(ÐV”˜E(ÒV˜˜W(ÓVœ˜i(ÔV ˜{(ÕV¤˜(ÖV¨˜Ÿ(×V¬˜±(ØV°˜Ã&ÚIŒ˜Ý(V´˜í(V¸˜ý(V¼™€™+€™H€™d€™€€™œ€™¸€™Ô€™ð€š €š(€šE€šb€š~€šš€š·€šÓ€šï€› €›(€›D€›`€›|€›˜€›µ€›Ò€›î€œ €œ'€œD€œa€œ~€œš€œ¶€œÓ€œð€ €(€G€m€¶(VÀÆ(VÄÖ(VÈæ( VÌö( VО&I|žI€že&/I8ž›&0I(žÒ&’IŸ&3IŸN&SHøŸ&eHèŸÌ&ÅHØ &÷HÈ A&H¸ |&7H¨ º&‡H˜ õ& AP¡0& £A¡h& H$¡›& U¡Å& 9Hp¡ñ& FHd¢& LTð¢F& ¸FТv& ÁTX¢& íG<¢Æ& úG0¢î&TH£&kE|£H&tS°£r& E裞&­EÜ£É&³S £ó&D(¤"&(D¤Q&-S¤w&YD”¤Ÿ&fDˆ¤Æ&lRø¤ì&ÍR ¥&ÑR`¥G&ýR8¥r& R,¥œ&R¥Å&iQ ¥ø&mQt¦"&™QL¦N&¦Q@¦y&¬Q0¦£&@ì¦Õ&@ħ& Pˆ§0&8A˜§[&EAŒ§…&KPx§®&ƒU´§Å&\Nd§Þ S¨ ¨; º¨k s¨— ¨Æ ³¨ö R©%€©B€©_€©|€©™€©¶€©Ó€©ð€ª €ª*€ªG€ªd€ª€ªž€ªºd-0ÁB€èF D¼5C@YAÀGd©@CO\h€wPˆ– £€Ð¥ Ûþøþ þþ&þ2þ>þTþaþyþ†þ”þ®þ¾þÍþÞþïþþþ(þ;þLþaþtþ…þ—þ¤þ¸þÉþ×þçþôþþþ þ.þAþTþkþ€þŽþŸþ±þÉþÛþíþþþ%þ=þOþ^þrþ‡þœþ¸þÐþãþõþþþ&þ4þDþ³»TvuTN5jkwVbl\_9hY?CcUEna:g6r;mXW^iA7@OpB`=>s[dZRDqeSQfvuTN5jkwVbl\_9hY?CcUEna:g6r;mXW^iA7@OpB`=>s[dZRDqeSQfKF8GJ0toI<HPLM]__dyld_func_lookupdyld_stub_binding_helper__mh_bundle_header_calloc_int_cdict_alloc_cdict_free_cdict_getitem_cdict_qsort_cmp_cgraph_alloc_cgraph_free_cgraph_getitem_calloc_free___pyx_type_4pygr_5cdict_CDictIterator___pyx_type_4pygr_5cdict_CDictionary___pyx_type_4pygr_5cdict_CDictionaryRef___pyx_type_4pygr_5cdict_CGraphDict___pyx_type_4pygr_5cdict_CGraphIterator___pyx_type_4pygr_5cdict_CIntDictionary___pyx_type_4pygr_5cdict_IntTupleArray_initcdict_PyArg_ParseTupleAndKeywords_PyCFunction_NewEx_PyClass_New_PyClass_Type_PyCode_New_PyDict_New_PyDict_SetItemString_PyDict_Type_PyErr_ExceptionMatches_PyErr_Fetch_PyErr_Format_PyErr_NormalizeException_PyErr_Occurred_PyErr_Restore_PyErr_SetObject_PyErr_SetString_PyErr_WriteUnraisable_PyExc_IndexError_PyExc_KeyError_PyExc_MemoryError_PyExc_NameError_PyExc_StopIteration_PyExc_SystemError_PyExc_TypeError_PyExc_ValueError_PyFrame_New_PyImport_AddModule_PyInstance_Type_PyInt_AsLong_PyInt_FromLong_PyIter_Next_PyList_New_PyMethod_New_PyModule_GetDict_PyNumber_Add_PyNumber_Multiply_PyNumber_Subtract_PyObject_CallFunction_PyObject_CallObject_PyObject_Cmp_PyObject_GC_Del_PyObject_GetAttr_PyObject_GetAttrString_PyObject_GetItem_PyObject_GetIter_PyObject_IsInstance_PyObject_IsTrue_PyObject_SetAttr_PyObject_SetAttrString_PyObject_SetItem_PyObject_Size_PySequence_GetItem_PySequence_GetSlice_PyString_FromString_PyString_FromStringAndSize_PyString_InternInPlace_PyThreadState_Get_PyTraceBack_Here_PyTraceBack_Type_PyTuple_New_PyType_IsSubtype_PyType_Ready_Py_InitModule4__Py_NoneStruct_qsortdyld__mach_header/Users/administrator/Desktop/pygr-0.8.1/pygr/cgraph.cgcc2_compiled.:t(0,1)=(0,1)cdict_alloc:F(0,2)n:P(0,3)d:r(0,2):t(0,2)=*(0,4)int:t(0,3)=r(0,3);-2147483648;2147483647;CDict:t(0,4)=(0,5):T(0,5)=s8n:(0,3),0,32;dict:(0,6),32,32;;:t(0,6)=*(0,7)CDictEntry:t(0,7)=(0,8):T(0,8)=s8k:(0,3),0,32;v:(0,3),32,32;;cdict_free:F(0,3)d:P(0,2)cdict_qsort_cmp:F(0,3)void_a:P(0,9)void_b:P(0,9):t(0,9)=*(0,10):t(0,10)=k(0,1)cdict_getitem:F(0,6)d:P(0,2)k:P(0,3)l:r(0,3)int:t(0,3)mid:r(0,3)r:r(0,3)p:r(0,6)cgraph_alloc:F(0,11)n:P(0,3)d:r(0,11):t(0,11)=*(0,12)CGraph:t(0,12)=(0,13):T(0,13)=s8n:(0,3),0,32;dict:(0,14),32,32;;:t(0,14)=*(0,15)CGraphEntry:t(0,15)=(0,16):T(0,16)=s8k:(0,3),0,32;v:(0,2),32,32;;cgraph_getitem:F(0,14)d:P(0,11)k:P(0,3)l:r(0,3)mid:r(0,3)r:r(0,3)p:r(0,14)calloc_int:F(0,17)n:P(0,3):t(0,17)=*(0,3)cgraph_free:F(0,3)d:P(0,11)i:r(0,3)d:r(0,2)/Users/administrator/Desktop/pygr-0.8.1/pygr/cdict.cgcc2_compiled.:t(0,1)=(0,1)___pyx_tp_dealloc_4pygr_5cdict_IntTupleArray___pyx_tp_as_number_IntTupleArray___pyx_tp_as_sequence_IntTupleArray___pyx_tp_as_mapping_IntTupleArray___pyx_tp_as_buffer_IntTupleArray___pyx_methods_4pygr_5cdict_IntTupleArray___pyx_members_4pygr_5cdict_IntTupleArray___pyx_tp_new_4pygr_5cdict_IntTupleArray___pyx_f_4pygr_5cdict_13IntTupleArray_set_vector___pyx_doc_4pygr_5cdict_13IntTupleArray_set_vector___pyx_f_4pygr_5cdict_13IntTupleArray_realloc___pyx_doc_4pygr_5cdict_13IntTupleArray_realloc___pyx_f_4pygr_5cdict_13IntTupleArray___len_____pyx_f_4pygr_5cdict_13IntTupleArray___getitem_____pyx_sq_item_4pygr_5cdict_IntTupleArray___pyx_tp_dealloc_4pygr_5cdict_CGraphIterator___pyx_tp_as_number_CGraphIterator___pyx_tp_as_sequence_CGraphIterator___pyx_tp_as_mapping_CGraphIterator___pyx_tp_as_buffer_CGraphIterator___pyx_tp_traverse_4pygr_5cdict_CGraphIterator___pyx_tp_clear_4pygr_5cdict_CGraphIterator___pyx_f_4pygr_5cdict_14CGraphIterator___iter_____pyx_f_4pygr_5cdict_14CGraphIterator___next_____pyx_methods_4pygr_5cdict_CGraphIterator___pyx_f_4pygr_5cdict_14CGraphIterator___init_____pyx_tp_new_4pygr_5cdict_CGraphIterator___pyx_tp_dealloc_4pygr_5cdict_CDictIterator___pyx_tp_as_number_CDictIterator___pyx_tp_as_sequence_CDictIterator___pyx_tp_as_mapping_CDictIterator___pyx_tp_as_buffer_CDictIterator___pyx_tp_traverse_4pygr_5cdict_CDictIterator___pyx_tp_clear_4pygr_5cdict_CDictIterator___pyx_f_4pygr_5cdict_13CDictIterator___iter_____pyx_f_4pygr_5cdict_13CDictIterator___next_____pyx_methods_4pygr_5cdict_CDictIterator___pyx_f_4pygr_5cdict_13CDictIterator___init_____pyx_tp_new_4pygr_5cdict_CDictIterator___pyx_tp_dealloc_4pygr_5cdict_CGraphDict___pyx_tp_as_number_CGraphDict___pyx_tp_as_sequence_CGraphDict___pyx_tp_as_mapping_CGraphDict___pyx_tp_as_buffer_CGraphDict___pyx_tp_traverse_4pygr_5cdict_CGraphDict___pyx_tp_clear_4pygr_5cdict_CGraphDict___pyx_f_4pygr_5cdict_10CGraphDict___iter_____pyx_methods_4pygr_5cdict_CGraphDict___pyx_members_4pygr_5cdict_CGraphDict___pyx_tp_new_4pygr_5cdict_CGraphDict___pyx_f_4pygr_5cdict_10CGraphDict_iteritems___pyx_f_4pygr_5cdict_10CGraphDict_itervalues___pyx_f_4pygr_5cdict_10CGraphDict_items___pyx_f_4pygr_5cdict_10CGraphDict_keys___pyx_f_4pygr_5cdict_10CGraphDict_values___pyx_f_4pygr_5cdict_10CGraphDict___getitem_____pyx_sq_item_4pygr_5cdict_CGraphDict___pyx_tp_dealloc_4pygr_5cdict_CDictionaryRef___pyx_tp_as_number_CDictionaryRef___pyx_tp_as_sequence_CDictionaryRef___pyx_tp_as_mapping_CDictionaryRef___pyx_tp_as_buffer_CDictionaryRef___pyx_tp_traverse_4pygr_5cdict_CDictionaryRef___pyx_tp_clear_4pygr_5cdict_CDictionaryRef___pyx_f_4pygr_5cdict_14CDictionaryRef___iter_____pyx_methods_4pygr_5cdict_CDictionaryRef___pyx_tp_new_4pygr_5cdict_CDictionaryRef___pyx_f_4pygr_5cdict_14CDictionaryRef_iteritems___pyx_f_4pygr_5cdict_14CDictionaryRef_itervalues___pyx_f_4pygr_5cdict_14CDictionaryRef_items___pyx_f_4pygr_5cdict_14CDictionaryRef_keys___pyx_f_4pygr_5cdict_14CDictionaryRef_values___pyx_f_4pygr_5cdict_14CDictionaryRef___getitem_____pyx_sq_item_4pygr_5cdict_CDictionaryRef___pyx_tp_dealloc_4pygr_5cdict_CDictionary___pyx_tp_as_number_CDictionary___pyx_tp_as_sequence_CDictionary___pyx_tp_as_mapping_CDictionary___pyx_tp_as_buffer_CDictionary___pyx_tp_traverse_4pygr_5cdict_CDictionary___pyx_tp_clear_4pygr_5cdict_CDictionary___pyx_f_4pygr_5cdict_11CDictionary___iter_____pyx_methods_4pygr_5cdict_CDictionary___pyx_tp_new_4pygr_5cdict_CDictionary___pyx_f_4pygr_5cdict_11CDictionary_iteritems___pyx_f_4pygr_5cdict_11CDictionary_itervalues___pyx_f_4pygr_5cdict_11CDictionary_items___pyx_f_4pygr_5cdict_11CDictionary_keys___pyx_f_4pygr_5cdict_11CDictionary_values___pyx_f_4pygr_5cdict_11CDictionary___getitem_____pyx_sq_item_4pygr_5cdict_CDictionary___pyx_tp_dealloc_4pygr_5cdict_CIntDictionary___pyx_tp_as_number_CIntDictionary___pyx_tp_as_sequence_CIntDictionary___pyx_tp_as_mapping_CIntDictionary___pyx_tp_as_buffer_CIntDictionary___pyx_f_4pygr_5cdict_14CIntDictionary___iter_____pyx_methods_4pygr_5cdict_CIntDictionary___pyx_tp_new_4pygr_5cdict_CIntDictionary___pyx_f_4pygr_5cdict_14CIntDictionary_keys___pyx_f_4pygr_5cdict_14CIntDictionary_items___pyx_f_4pygr_5cdict_14CIntDictionary_iteritems___pyx_f_4pygr_5cdict_14CIntDictionary___getitem_____pyx_sq_item_4pygr_5cdict_CIntDictionary___pyx_ptype_4pygr_5cdict_CDictIterator___pyx_ptype_4pygr_5cdict_CGraphDict___pyx_ptype_4pygr_5cdict_CDictionaryRef___pyx_ptype_4pygr_5cdict_CGraphIterator___pyx_ptype_4pygr_5cdict_CDictionary___pyx_mdef_4pygr_5cdict_14QueryMatchList_get_more___pyx_f_4pygr_5cdict_14QueryMatchList_get_more___pyx_mdef_4pygr_5cdict_14QueryMatchList___getitem_____pyx_f_4pygr_5cdict_14QueryMatchList___getitem_____pyx_mdef_4pygr_5cdict_14QueryMatchList___iter_____pyx_f_4pygr_5cdict_14QueryMatchList___iter_____pyx_mdef_4pygr_5cdict_14QueryMatchList___len_____pyx_f_4pygr_5cdict_14QueryMatchList___len_____pyx_mdef_4pygr_5cdict_14QueryMatchList___init_____pyx_f_4pygr_5cdict_14QueryMatchList___init_____pyx_mdef_4pygr_5cdict_18QueryMatchIterator___next_____pyx_f_4pygr_5cdict_18QueryMatchIterator___next_____pyx_mdef_4pygr_5cdict_18QueryMatchIterator___iter_____pyx_f_4pygr_5cdict_18QueryMatchIterator___iter_____pyx_mdef_4pygr_5cdict_18QueryMatchIterator___init_____pyx_f_4pygr_5cdict_18QueryMatchIterator___init_____pyx_mdef_4pygr_5cdict_16CGraphQueryMatch___init_____pyx_f_4pygr_5cdict_16CGraphQueryMatch___init_____pyx_mdef_4pygr_5cdict_8KeyIndex___getitem_____pyx_f_4pygr_5cdict_8KeyIndex___getitem_____pyx_doc_4pygr_5cdict_8KeyIndex___getitem_____pyx_mdef_4pygr_5cdict_8KeyIndex___init_____pyx_f_4pygr_5cdict_8KeyIndex___init_____pyx_ptype_4pygr_5cdict_IntTupleArray___pyx_ptype_4pygr_5cdict_CIntDictionary___pyx_string_tab___pyx_n_CGraphQueryMatch___pyx_k11___pyx_n_KeyIndex___pyx_k26___pyx_n_QueryMatchIterator___pyx_k15___pyx_n_QueryMatchList___pyx_k34___pyx_n_SliceType___pyx_k17___pyx_n___getitem_____pyx_k29___pyx_n___init_____pyx_k4___pyx_n___iter_____pyx_k32___pyx_n___len_____pyx_k36___pyx_n___next_____pyx_k33___pyx_n_append___pyx_k3___pyx_n_dataGraph___pyx_k13___pyx_n_fromNode___pyx_k7___pyx_n_get_more___pyx_k37___pyx_n_gqcompiler___pyx_k12___pyx_n_gqi___pyx_k5___pyx_n_i___pyx_k9___pyx_n_index_keys___pyx_k2___pyx_n_isDone___pyx_k19___pyx_n_items___pyx_k22___pyx_n_iteritems___pyx_k20___pyx_n_key_index___pyx_k1___pyx_n_keys___pyx_k21___pyx_n_matches___pyx_k10___pyx_n_object___pyx_k27___pyx_n_qmlist___pyx_k8___pyx_n_queryNode___pyx_k6___pyx_n_query_f___pyx_k14___pyx_n_sort___pyx_k23___pyx_n_types___pyx_k16___pyx_k18p___pyx_k18___pyx_k24p___pyx_k24___pyx_k25p___pyx_k25___pyx_k28p___pyx_k28___pyx_k30p___pyx_k30___pyx_k31p___pyx_k31___pyx_k35p___pyx_k35___pyx_methods___pyx_filenames___pyx_argnames.7294__pyx_f_4pygr_5cdict_18QueryMatchIterator___iter__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_r:r(0,2)__pyx_argnames:V(0,3)void:t(0,1):t(0,2)=*(0,4):t(0,3)=ar(0,5);0;1;(0,6)PyObject:t(0,4)=(0,7)long unsigned int:t(0,5)=r(0,5);0;037777777777;:t(0,6)=*(0,8)_object:T(0,7)=s8ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;;char:t(0,8)=r(0,8);0;127;int:t(0,9)=r(0,9);-2147483648;2147483647;:t(0,10)=*(0,11)_typeobject:T(0,11)=s192ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;ob_size:(0,9),64,32;tp_name:(0,6),96,32;tp_basicsize:(0,9),128,32;tp_itemsize:(0,9),160,32;tp_dealloc:(0,12),192,32;tp_print:(0,14),224,32;tp_getattr:(0,16),256,32;tp_setattr:(0,18),288,32;tp_compare:(0,20),320,32;tp_repr:(0,22),352,32;tp_as_number:(0,24),384,32;tp_as_sequence:(0,25),416,32;tp_as_mapping:(0,26),448,32;tp_hash:(0,27),480,32;tp_call:(0,29),512,32;tp_str:(0,22),544,32;tp_getattro:(0,31),576,32;tp_setattro:(0,33),608,32;tp_as_buffer:(0,35),640,32;tp_flags:(0,36),672,32;tp_doc:(0,6),704,32;tp_traverse:(0,37),736,32;tp_clear:(0,39),768,32;tp_richcompare:(0,41),800,32;tp_weaklistoffset:(0,36),832,32;tp_iter:(0,43),864,32;tp_iternext:(0,44),896,32;tp_methods:(0,45),928,32;tp_members:(0,46),960,32;tp_getset:(0,47),992,32;tp_base:(0,10),1024,32;tp_dict:(0,2),1056,32;tp_descr_get:(0,48),1088,32;tp_descr_set:(0,49),1120,32;tp_dictoffset:(0,36),1152,32;tp_init:(0,50),1184,32;tp_alloc:(0,51),1216,32;tp_new:(0,53),1248,32;tp_free:(0,55),1280,32;tp_is_gc:(0,39),1312,32;tp_bases:(0,2),1344,32;tp_mro:(0,2),1376,32;tp_cache:(0,2),1408,32;tp_subclasses:(0,2),1440,32;tp_weaklist:(0,2),1472,32;tp_del:(0,12),1504,32;;:t(0,13)=*(0,57)destructor:t(0,12)=(0,13):t(0,15)=*(0,58)printfunc:t(0,14)=(0,15):t(0,17)=*(0,59)getattrfunc:t(0,16)=(0,17):t(0,19)=*(0,60)setattrfunc:t(0,18)=(0,19):t(0,21)=*(0,61)cmpfunc:t(0,20)=(0,21):t(0,23)=*(0,62)reprfunc:t(0,22)=(0,23):t(0,24)=*(0,63):t(0,25)=*(0,64):t(0,26)=*(0,65):t(0,28)=*(0,66)hashfunc:t(0,27)=(0,28):t(0,30)=*(0,67)ternaryfunc:t(0,29)=(0,30):t(0,32)=*(0,68)getattrofunc:t(0,31)=(0,32):t(0,34)=*(0,69)setattrofunc:t(0,33)=(0,34):t(0,35)=*(0,70)long int:t(0,36)=r(0,36);-2147483648;2147483647;:t(0,38)=*(0,71)traverseproc:t(0,37)=(0,38):t(0,40)=*(0,72)inquiry:t(0,39)=(0,40):t(0,42)=*(0,73)richcmpfunc:t(0,41)=(0,42)getiterfunc:t(0,43)=(0,23)iternextfunc:t(0,44)=(0,23):t(0,45)=*(0,74):t(0,46)=*(0,75):t(0,47)=*(0,76)descrgetfunc:t(0,48)=(0,30)descrsetfunc:t(0,49)=(0,34)initproc:t(0,50)=(0,34):t(0,52)=*(0,77)allocfunc:t(0,51)=(0,52):t(0,54)=*(0,78)newfunc:t(0,53)=(0,54):t(0,56)=*(0,79)freefunc:t(0,55)=(0,56):t(0,57)=f(0,1):t(0,58)=f(0,9):t(0,59)=f(0,2):t(0,60)=f(0,9):t(0,61)=f(0,9):t(0,62)=f(0,2)PyNumberMethods:t(0,63)=(0,80)PySequenceMethods:t(0,64)=(0,81)PyMappingMethods:t(0,65)=(0,82):t(0,66)=f(0,36):t(0,67)=f(0,2):t(0,68)=f(0,2):t(0,69)=f(0,9)PyBufferProcs:t(0,70)=(0,83):t(0,71)=f(0,9):t(0,72)=f(0,9):t(0,73)=f(0,2)PyMethodDef:T(0,74)=s16ml_name:(0,6),0,32;ml_meth:(0,84),32,32;ml_flags:(0,9),64,32;ml_doc:(0,6),96,32;;PyMemberDef:T(0,75)=s20name:(0,6),0,32;type:(0,9),32,32;offset:(0,9),64,32;flags:(0,9),96,32;doc:(0,6),128,32;;PyGetSetDef:T(0,76)=s20name:(0,6),0,32;get:(0,85),32,32;set:(0,87),64,32;doc:(0,6),96,32;closure:(0,89),128,32;;:t(0,77)=f(0,2):t(0,78)=f(0,2):t(0,79)=f(0,1):T(0,80)=s152nb_add:(0,90),0,32;nb_subtract:(0,90),32,32;nb_multiply:(0,90),64,32;nb_divide:(0,90),96,32;nb_remainder:(0,90),128,32;nb_divmod:(0,90),160,32;nb_power:(0,29),192,32;nb_negative:(0,91),224,32;nb_positive:(0,91),256,32;nb_absolute:(0,91),288,32;nb_nonzero:(0,39),320,32;nb_invert:(0,91),352,32;nb_lshift:(0,90),384,32;nb_rshift:(0,90),416,32;nb_and:(0,90),448,32;nb_xor:(0,90),480,32;nb_or:(0,90),512,32;nb_coerce:(0,92),544,32;nb_int:(0,91),576,32;nb_long:(0,91),608,32;nb_float:(0,91),640,32;nb_oct:(0,91),672,32;nb_hex:(0,91),704,32;nb_inplace_add:(0,90),736,32;nb_inplace_subtract:(0,90),768,32;nb_inplace_multiply:(0,90),800,32;nb_inplace_divide:(0,90),832,32;nb_inplace_remainder:(0,90),864,32;nb_inplace_power:(0,29),896,32;nb_inplace_lshift:(0,90),928,32;nb_inplace_rshift:(0,90),960,32;nb_inplace_and:(0,90),992,32;nb_inplace_xor:(0,90),1024,32;nb_inplace_or:(0,90),1056,32;nb_floor_divide:(0,90),1088,32;nb_true_divide:(0,90),1120,32;nb_inplace_floor_divide:(0,90),1152,32;nb_inplace_true_divide:(0,90),1184,32;;:T(0,81)=s40sq_length:(0,39),0,32;sq_concat:(0,90),32,32;sq_repeat:(0,94),64,32;sq_item:(0,94),96,32;sq_slice:(0,96),128,32;sq_ass_item:(0,98),160,32;sq_ass_slice:(0,100),192,32;sq_contains:(0,102),224,32;sq_inplace_concat:(0,90),256,32;sq_inplace_repeat:(0,94),288,32;;:T(0,82)=s12mp_length:(0,39),0,32;mp_subscript:(0,90),32,32;mp_ass_subscript:(0,103),64,32;;:T(0,83)=s16bf_getreadbuffer:(0,104),0,32;bf_getwritebuffer:(0,106),32,32;bf_getsegcount:(0,107),64,32;bf_getcharbuffer:(0,109),96,32;;PyCFunction:t(0,84)=(0,32):t(0,86)=*(0,111)getter:t(0,85)=(0,86):t(0,88)=*(0,112)setter:t(0,87)=(0,88):t(0,89)=*(0,1)binaryfunc:t(0,90)=(0,32)unaryfunc:t(0,91)=(0,23):t(0,93)=*(0,113)coercion:t(0,92)=(0,93):t(0,95)=*(0,114)intargfunc:t(0,94)=(0,95):t(0,97)=*(0,115)intintargfunc:t(0,96)=(0,97):t(0,99)=*(0,116)intobjargproc:t(0,98)=(0,99):t(0,101)=*(0,117)intintobjargproc:t(0,100)=(0,101)objobjproc:t(0,102)=(0,21)objobjargproc:t(0,103)=(0,34):t(0,105)=*(0,118)getreadbufferproc:t(0,104)=(0,105)getwritebufferproc:t(0,106)=(0,105):t(0,108)=*(0,119)getsegcountproc:t(0,107)=(0,108):t(0,110)=*(0,120)getcharbufferproc:t(0,109)=(0,110):t(0,111)=f(0,2):t(0,112)=f(0,9):t(0,113)=f(0,9):t(0,114)=f(0,2):t(0,115)=f(0,2):t(0,116)=f(0,9):t(0,117)=f(0,9):t(0,118)=f(0,9):t(0,119)=f(0,9):t(0,120)=f(0,9)__pyx_f_4pygr_5cdict_13CDictIterator___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_f_4pygr_5cdict_14CGraphIterator___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_f_4pygr_5cdict_13IntTupleArray___len__:f(0,121)__pyx_v_self:P(0,2)__pyx_r:r(0,121)Py_ssize_t:t(0,121)=(0,9)__pyx_tp_dealloc_4pygr_5cdict_CIntDictionary:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_sq_item_4pygr_5cdict_CIntDictionary:f(0,2)o:P(0,2)i:P(0,121)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_5cdict_CDictionary:f(0,1)o:P(0,2)__pyx_obj_4pygr_5cdict_CDictionary:T(0,122)=s16ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;d:(0,123),64,32;key_index:(0,2),96,32;;:t(0,123)=*(0,124)CDict:t(0,124)=(0,125):T(0,125)=s8n:(0,9),0,32;dict:(0,126),32,32;;:t(0,126)=*(0,127)CDictEntry:t(0,127)=(0,128):T(0,128)=s8k:(0,9),0,32;v:(0,9),32,32;;etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_5cdict_CDictionary:f(0,9)o:P(0,2)v:P(0,129)a:P(0,89)e:r(0,9)int:t(0,9):t(0,130)=*(0,131)visitproc:t(0,129)=(0,130):t(0,131)=f(0,9)__pyx_tp_clear_4pygr_5cdict_CDictionary:f(0,9)o:P(0,2)t:r(0,2)__pyx_sq_item_4pygr_5cdict_CDictionary:f(0,2)o:P(0,2)i:P(0,121)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_5cdict_CDictionaryRef:f(0,1)o:P(0,2)__pyx_obj_4pygr_5cdict_CDictionaryRef:T(0,132)=s20ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;d:(0,123),64,32;key_index:(0,2),96,32;graph:(0,2),128,32;;__pyx_tp_traverse_4pygr_5cdict_CDictionaryRef:f(0,9)o:P(0,2)v:P(0,129)a:P(0,89)e:r(0,9)__pyx_tp_clear_4pygr_5cdict_CDictionaryRef:f(0,9)o:P(0,2)t:r(0,2)__pyx_sq_item_4pygr_5cdict_CDictionaryRef:f(0,2)o:P(0,2)i:P(0,121)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_5cdict_CGraphDict:f(0,1)o:P(0,2)__pyx_obj_4pygr_5cdict_CGraphDict:T(0,133)=s16ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;d:(0,134),64,32;key_index:(0,2),96,32;;:t(0,134)=*(0,135)CGraph:t(0,135)=(0,136):T(0,136)=s8n:(0,9),0,32;dict:(0,137),32,32;;:t(0,137)=*(0,138)CGraphEntry:t(0,138)=(0,139):T(0,139)=s8k:(0,9),0,32;v:(0,123),32,32;;etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_5cdict_CGraphDict:f(0,9)o:P(0,2)v:P(0,129)a:P(0,89)e:r(0,9)__pyx_tp_clear_4pygr_5cdict_CGraphDict:f(0,9)o:P(0,2)t:r(0,2)__pyx_sq_item_4pygr_5cdict_CGraphDict:f(0,2)o:P(0,2)i:P(0,121)r:r(0,2)x:r(0,2)__pyx_tp_new_4pygr_5cdict_CDictIterator:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)__pyx_obj_4pygr_5cdict_CDictIterator:T(0,141)=s32ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;i:(0,9),64,32;d:(0,123),96,32;cd:(0,2),128,32;yieldKeys:(0,9),160,32;yieldValues:(0,9),192,32;key_index:(0,2),224,32;;:t(0,140)=*(0,142)PyTypeObject:t(0,142)=(0,11)o:r(0,2)__pyx_tp_dealloc_4pygr_5cdict_CDictIterator:f(0,1)o:P(0,2)__pyx_tp_traverse_4pygr_5cdict_CDictIterator:f(0,9)o:P(0,2)v:P(0,129)a:P(0,89)e:r(0,9)__pyx_tp_clear_4pygr_5cdict_CDictIterator:f(0,9)o:P(0,2)t:r(0,2)__pyx_tp_new_4pygr_5cdict_CGraphIterator:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_tp_dealloc_4pygr_5cdict_CGraphIterator:f(0,1)o:P(0,2)__pyx_obj_4pygr_5cdict_CGraphIterator:T(0,143)=s24ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;i:(0,9),64,32;g:(0,144),96,32;yieldKeys:(0,9),128,32;yieldValues:(0,9),160,32;;:t(0,144)=*(0,133)__pyx_tp_traverse_4pygr_5cdict_CGraphIterator:f(0,9)o:P(0,2)v:P(0,129)a:P(0,89)e:r(0,9)__pyx_tp_clear_4pygr_5cdict_CGraphIterator:f(0,9)o:P(0,2)__pyx_tp_dealloc_4pygr_5cdict_IntTupleArray:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_sq_item_4pygr_5cdict_IntTupleArray:f(0,2)o:P(0,2)i:P(0,121)r:r(0,2)x:r(0,2)___Pyx_Raise__Pyx_Raise:f(0,1)type:P(0,2)value:P(0,2)tb:P(0,2)___Pyx_AddTraceback___pyx_filename___pyx_m___pyx_lineno__Pyx_AddTraceback:f(0,1)funcname:P(0,6)py_srcfile:r(0,2)py_funcname:r(0,2)py_globals:r(0,2)empty_tuple:r(0,2)empty_string:r(0,2)py_code:r(0,145)py_frame:r(0,146):t(0,145)=*(0,147):t(0,146)=*(0,148)PyCodeObject:t(0,147)=(0,149)PyFrameObject:t(0,148)=(0,150):T(0,149)=s64ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;co_argcount:(0,9),64,32;co_nlocals:(0,9),96,32;co_stacksize:(0,9),128,32;co_flags:(0,9),160,32;co_code:(0,2),192,32;co_consts:(0,2),224,32;co_names:(0,2),256,32;co_varnames:(0,2),288,32;co_freevars:(0,2),320,32;co_cellvars:(0,2),352,32;co_filename:(0,2),384,32;co_name:(0,2),416,32;co_firstlineno:(0,9),448,32;co_lnotab:(0,2),480,32;;_frame:T(0,150)=s336ob_refcnt:(0,9),0,32;ob_type:(0,10),32,32;ob_size:(0,9),64,32;f_back:(0,151),96,32;f_code:(0,145),128,32;f_builtins:(0,2),160,32;f_globals:(0,2),192,32;f_locals:(0,2),224,32;f_valuestack:(0,152),256,32;f_stacktop:(0,152),288,32;f_trace:(0,2),320,32;f_exc_type:(0,2),352,32;f_exc_value:(0,2),384,32;f_exc_traceback:(0,2),416,32;f_tstate:(0,153),448,32;f_lasti:(0,9),480,32;f_lineno:(0,9),512,32;f_restricted:(0,9),544,32;f_iblock:(0,9),576,32;f_blockstack:(0,154),608,1920;f_nlocals:(0,9),2528,32;f_ncells:(0,9),2560,32;f_nfreevars:(0,9),2592,32;f_stacksize:(0,9),2624,32;f_localsplus:(0,155),2656,32;;:t(0,151)=*(0,150):t(0,152)=*(0,2):t(0,153)=*(0,156):t(0,154)=ar(0,5);0;19;(0,157):t(0,155)=ar(0,5);0;0;(0,2)PyThreadState:t(0,156)=(0,158)PyTryBlock:t(0,157)=(0,159)_ts:T(0,158)=s84next:(0,160),0,32;interp:(0,161),32,32;frame:(0,151),64,32;recursion_depth:(0,9),96,32;tracing:(0,9),128,32;use_tracing:(0,9),160,32;c_profilefunc:(0,162),192,32;c_tracefunc:(0,162),224,32;c_profileobj:(0,2),256,32;c_traceobj:(0,2),288,32;curexc_type:(0,2),320,32;curexc_value:(0,2),352,32;curexc_traceback:(0,2),384,32;exc_type:(0,2),416,32;exc_value:(0,2),448,32;exc_traceback:(0,2),480,32;dict:(0,2),512,32;tick_counter:(0,9),544,32;gilstate_counter:(0,9),576,32;async_exc:(0,2),608,32;thread_id:(0,36),640,32;;:T(0,159)=s12b_type:(0,9),0,32;b_handler:(0,9),32,32;b_level:(0,9),64,32;;:t(0,160)=*(0,158):t(0,161)=*(0,164):t(0,163)=*(0,165)Py_tracefunc:t(0,162)=(0,163)PyInterpreterState:t(0,164)=(0,166):t(0,165)=f(0,9)_is:T(0,166)=s36next:(0,167),0,32;tstate_head:(0,160),32,32;modules:(0,2),64,32;sysdict:(0,2),96,32;builtins:(0,2),128,32;codec_search_path:(0,2),160,32;codec_search_cache:(0,2),192,32;codec_error_registry:(0,2),224,32;dlopenflags:(0,9),256,32;;:t(0,167)=*(0,166)___pyx_f__pyx_f_4pygr_5cdict_14CIntDictionary___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_v_e:r(0,126)__pyx_r:r(0,2)__pyx_2:r(0,2)___pyx_argnames.7984__pyx_f_4pygr_5cdict_14CIntDictionary_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_argnames:V(0,168):t(0,168)=ar(0,5);0;0;(0,6)___pyx_argnames.7915__pyx_f_4pygr_5cdict_14CIntDictionary_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,169):t(0,169)=ar(0,5);0;0;(0,6)___pyx_argnames.7817__pyx_f_4pygr_5cdict_14CIntDictionary_keys:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,170):t(0,170)=ar(0,5);0;0;(0,6)__pyx_f_4pygr_5cdict_14CIntDictionary___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_f_4pygr_5cdict_11CDictionary___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_v_e:r(0,126)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8329__pyx_f_4pygr_5cdict_11CDictionary_itervalues:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,171):t(0,171)=ar(0,5);0;0;(0,6)___pyx_argnames.8283__pyx_f_4pygr_5cdict_11CDictionary_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,172):t(0,172)=ar(0,5);0;0;(0,6)__pyx_f_4pygr_5cdict_11CDictionary___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)___pyx_argnames.8798__pyx_f_4pygr_5cdict_14CDictionaryRef_itervalues:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,173):t(0,173)=ar(0,5);0;0;(0,6)___pyx_argnames.8752__pyx_f_4pygr_5cdict_14CDictionaryRef_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,174):t(0,174)=ar(0,5);0;0;(0,6)___pyx_argnames.8602__pyx_tp_new_4pygr_5cdict_CDictionaryRef:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_graph:(0,144)__pyx_v_idict:(0,9)__pyx_r:r(0,9)__pyx_v_graph:(0,144)__pyx_v_idict:(0,9)__pyx_r:r(0,9)__pyx_v_graph:(0,144)__pyx_v_idict:(0,9)__pyx_r:r(0,9)__pyx_v_graph:(0,144)__pyx_v_idict:(0,9)__pyx_r:r(0,9)type:r(0,140)type:r(0,140)type:r(0,140)__pyx_f_4pygr_5cdict_14CDictionaryRef___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_f_4pygr_5cdict_10CGraphDict___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_v_e:r(0,137)__pyx_v_cd:r(0,175):t(0,175)=*(0,132)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)___pyx_argnames.9523__pyx_f_4pygr_5cdict_10CGraphDict_values:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_cd:r(0,175)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,176):t(0,176)=ar(0,5);0;0;(0,6)___pyx_argnames.9320__pyx_f_4pygr_5cdict_10CGraphDict_itervalues:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,177):t(0,177)=ar(0,5);0;0;(0,6)___pyx_argnames.9274__pyx_f_4pygr_5cdict_10CGraphDict_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,178):t(0,178)=ar(0,5);0;0;(0,6)__pyx_f_4pygr_5cdict_10CGraphDict___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_f_4pygr_5cdict_13IntTupleArray___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_arg_k:P(0,2)__pyx_v_i:r(0,9)__pyx_v_data:r(0,179):t(0,179)=*(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,9)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)___pyx_argnames.10208__pyx_f_4pygr_5cdict_13IntTupleArray_realloc:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_n:(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,180):t(0,180)=ar(0,5);0;1;(0,6)___pyx_argnames.9961___pyx_d6___pyx_d7__pyx_tp_new_4pygr_5cdict_IntTupleArray:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_n:(0,2)__pyx_v_vector_len:(0,2)__pyx_v_dim:(0,2)__pyx_v_skipIndex:(0,2)__pyx_r:r(0,9)__pyx_2:r(0,2)__pyx_3:r(0,2)___pyx_argnames.6978__pyx_f_4pygr_5cdict_8KeyIndex___init__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_argnames:V(0,181):t(0,181)=ar(0,5);0;1;(0,6)___pyx_argnames.7026__pyx_f_4pygr_5cdict_8KeyIndex___getitem__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_k:(0,2)__pyx_v_i:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:(0,2)__pyx_4:(0,2)__pyx_5:r(0,2)__pyx_6:r(0,121)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_argnames:V(0,182):t(0,182)=ar(0,5);0;2;(0,6)tstate:r(0,153)tstate:r(0,153)tstate:r(0,153)tstate:r(0,153)___pyx_argnames.7252__pyx_f_4pygr_5cdict_18QueryMatchIterator___init__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_qmlist:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_argnames:V(0,183):t(0,183)=ar(0,5);0;2;(0,6)___pyx_argnames.7416__pyx_f_4pygr_5cdict_14QueryMatchList___init__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_gqcompiler:(0,2)__pyx_v_matches:(0,2)__pyx_v_dataGraph:(0,2)__pyx_v_query_f:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_argnames:V(0,184):t(0,184)=ar(0,5);0;5;(0,6)___pyx_argnames.7484__pyx_f_4pygr_5cdict_14QueryMatchList___len__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,121)__pyx_argnames:V(0,185):t(0,185)=ar(0,5);0;1;(0,6)___pyx_argnames.7665__pyx_f_4pygr_5cdict_14QueryMatchList_get_more:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,186):t(0,186)=ar(0,5);0;1;(0,6)___pyx_argnames.7575___pyx_b__pyx_f_4pygr_5cdict_14QueryMatchList___getitem__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_k:(0,2)__pyx_v_types:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_argnames:V(0,187):t(0,187)=ar(0,5);0;2;(0,6)name:r(0,2)__import__:r(0,2)empty_list:r(0,2)global_dict:r(0,2)empty_dict:r(0,2)name:r(0,2)__import__:r(0,2)empty_list:r(0,2)global_dict:r(0,2)empty_dict:r(0,2)name:r(0,2)__import__:r(0,2)empty_list:r(0,2)global_dict:r(0,2)empty_dict:r(0,2)name:r(0,2)__import__:r(0,2)empty_list:r(0,2)global_dict:r(0,2)empty_dict:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.7522__pyx_f_4pygr_5cdict_14QueryMatchList___iter__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,188):t(0,188)=ar(0,5);0;1;(0,6)name:r(0,2)name:r(0,2)___pyx_argnames.7326__pyx_f_4pygr_5cdict_18QueryMatchIterator___next__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_queryMatch:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,121)__pyx_5:(0,9)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,189):t(0,189)=ar(0,5);0;1;(0,6)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.9800___pyx_d4___pyx_d5__pyx_f_4pygr_5cdict_14CGraphIterator___init__:f(0,9)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_g:(0,144)__pyx_v_yieldKeys:(0,2)__pyx_v_yieldValues:(0,2)__pyx_r:r(0,9)__pyx_argnames:V(0,190):t(0,190)=ar(0,5);0;3;(0,6)type:r(0,140)type:r(0,140)___pyx_argnames.9611___pyx_d3___pyx_d1___pyx_d2__pyx_f_4pygr_5cdict_13CDictIterator___init__:f(0,9)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_cd:(0,191):t(0,191)=*(0,122)__pyx_v_yieldKeys:(0,2)__pyx_v_yieldValues:(0,2)__pyx_v_cdr:(0,175)__pyx_r:r(0,9)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,192):t(0,192)=ar(0,5);0;4;(0,6)type:r(0,140)obj:r(0,2)type:r(0,140)type:r(0,140)obj:r(0,2)type:r(0,140)type:r(0,140)___pyx_d8initcdict:F(0,1)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)name:r(0,2)py_modname:r(0,2)___pyx_argnames.7125__pyx_f_4pygr_5cdict_16CGraphQueryMatch___init__:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_self:(0,2)__pyx_v_gqcompiler:(0,2)__pyx_v_dataTuple:(0,2)__pyx_v_dataGraph:(0,2)__pyx_v_i:r(0,2)__pyx_v_index_keys:r(0,2)__pyx_v_l:r(0,2)__pyx_v_node:r(0,2)__pyx_v_edge:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,121)__pyx_6:r(0,2)__pyx_argnames:V(0,193):t(0,193)=ar(0,5);0;4;(0,6)item:r(0,2)___pyx_f_4pygr_5cdict_cdict_init__pyx_f_4pygr_5cdict_cdict_init:f(0,123)__pyx_v_d:P(0,2)__pyx_v_key_index:P(0,2)__pyx_v_i:r(0,9)__pyx_v_cd:r(0,123)__pyx_v_k:r(0,2)__pyx_v_v:r(0,2)__pyx_r:r(0,123)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)item:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_argnames.8158__pyx_tp_new_4pygr_5cdict_CDictionary:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)___pyx_argnames.9066__pyx_tp_new_4pygr_5cdict_CGraphDict:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,9)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,9)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,9)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_d:(0,2)__pyx_v_key_index:(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,9)__pyx_5:r(0,2)__pyx_6:r(0,2)___pyx_argnames.7741__pyx_tp_new_4pygr_5cdict_CIntDictionary:f(0,2)t:P(0,140)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_d:(0,2)__pyx_v_i:r(0,9)__pyx_r:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)item:r(0,2)__pyx_v_d:(0,2)__pyx_v_i:r(0,9)__pyx_r:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)___pyx_argnames.10046__pyx_f_4pygr_5cdict_13IntTupleArray_set_vector:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_vector:(0,2)__pyx_v_gotoNext:(0,2)__pyx_v_i:r(0,9)__pyx_r:r(0,2)__pyx_1:r(0,9)__pyx_2:r(0,2)__pyx_argnames:V(0,194):t(0,194)=ar(0,5);0;2;(0,6)o:r(0,2)j:r(0,2)__pyx_f_4pygr_5cdict_14CGraphIterator___next__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_cd:r(0,175)__pyx_v_k:r(0,2)__pyx_v_result:r(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)__pyx_f_4pygr_5cdict_13CDictIterator___next__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:r(0,2)__pyx_v_v:r(0,2)__pyx_v_result:r(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.9370__pyx_f_4pygr_5cdict_10CGraphDict_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_cd:r(0,175)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,195):t(0,195)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.9454__pyx_f_4pygr_5cdict_10CGraphDict_keys:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,196):t(0,196)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8848__pyx_f_4pygr_5cdict_14CDictionaryRef_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,197):t(0,197)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8925__pyx_f_4pygr_5cdict_14CDictionaryRef_keys:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,198):t(0,198)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8993__pyx_f_4pygr_5cdict_14CDictionaryRef_values:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,199):t(0,199)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)__pyx_f_4pygr_5cdict_14CDictionaryRef___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_v_e:r(0,126)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8379__pyx_f_4pygr_5cdict_11CDictionary_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,200):t(0,200)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8456__pyx_f_4pygr_5cdict_11CDictionary_keys:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,201):t(0,201)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)___pyx_argnames.8524__pyx_f_4pygr_5cdict_11CDictionary_values:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,9)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,9)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,202):t(0,202)=ar(0,5);0;0;(0,6)i:r(0,121)i:r(0,121)i:r(0,121)i:r(0,121)j:r(0,2)__pyx_m:S(0,2)__pyx_b:S(0,2)__pyx_lineno:S(0,9)__pyx_filename:S(0,6)char:t(0,8)__pyx_f:S(0,203):t(0,203)=*(0,6)__pyx_ptype_4pygr_5cdict_CIntDictionary:S(0,140)__pyx_ptype_4pygr_5cdict_CDictionary:S(0,140)__pyx_ptype_4pygr_5cdict_CDictionaryRef:S(0,140)__pyx_ptype_4pygr_5cdict_CGraphDict:S(0,140)__pyx_ptype_4pygr_5cdict_CDictIterator:S(0,140)__pyx_ptype_4pygr_5cdict_CGraphIterator:S(0,140)__pyx_ptype_4pygr_5cdict_IntTupleArray:S(0,140)__pyx_k1:S(0,204)__pyx_k2:S(0,205)__pyx_k3:S(0,206)__pyx_k4:S(0,207)__pyx_k5:S(0,208)__pyx_k6:S(0,209)__pyx_k7:S(0,210)__pyx_k8:S(0,211)__pyx_k9:S(0,212)__pyx_k10:S(0,213)__pyx_k11:S(0,214)__pyx_k12:S(0,215)__pyx_k13:S(0,216)__pyx_k14:S(0,217)__pyx_k15:S(0,218)__pyx_k16:S(0,219)__pyx_k17:S(0,220)__pyx_k18:S(0,221)__pyx_k19:S(0,222)__pyx_k20:S(0,223)__pyx_k21:S(0,224)__pyx_k22:S(0,225)__pyx_k23:S(0,226)__pyx_k24:S(0,227)__pyx_k25:S(0,228)__pyx_k26:S(0,229)__pyx_k27:S(0,230)__pyx_k28:S(0,231)__pyx_k29:S(0,232)__pyx_k30:S(0,233)__pyx_k31:S(0,234)__pyx_k32:S(0,235)__pyx_k33:S(0,236)__pyx_k34:S(0,237)__pyx_k35:S(0,238)__pyx_k36:S(0,239)__pyx_k37:S(0,240)__pyx_n_CGraphQueryMatch:S(0,2)__pyx_n_KeyIndex:S(0,2)__pyx_n_QueryMatchIterator:S(0,2)__pyx_n_QueryMatchList:S(0,2)__pyx_n_SliceType:S(0,2)__pyx_n___getitem__:S(0,2)__pyx_n___init__:S(0,2)__pyx_n___iter__:S(0,2)__pyx_n___len__:S(0,2)__pyx_n___next__:S(0,2)__pyx_n_append:S(0,2)__pyx_n_dataGraph:S(0,2)__pyx_n_fromNode:S(0,2)__pyx_n_get_more:S(0,2)__pyx_n_gqcompiler:S(0,2)__pyx_n_gqi:S(0,2)__pyx_n_i:S(0,2)__pyx_n_index_keys:S(0,2)__pyx_n_isDone:S(0,2)__pyx_n_items:S(0,2)__pyx_n_iteritems:S(0,2)__pyx_n_key_index:S(0,2)__pyx_n_keys:S(0,2)__pyx_n_matches:S(0,2)__pyx_n_object:S(0,2)__pyx_n_qmlist:S(0,2)__pyx_n_queryNode:S(0,2)__pyx_n_query_f:S(0,2)__pyx_n_sort:S(0,2)__pyx_n_types:S(0,2)__pyx_k18p:S(0,2)__pyx_k24p:S(0,2)__pyx_k25p:S(0,2)__pyx_k28p:S(0,2)__pyx_k30p:S(0,2)__pyx_k31p:S(0,2)__pyx_k35p:S(0,2)__pyx_string_tab:S(0,241)__pyx_d1:S(0,2)__pyx_d2:S(0,2)__pyx_d3:S(0,175):t(0,204)=ar(0,5);0;9;(0,8):t(0,205)=ar(0,5);0;10;(0,8):t(0,206)=ar(0,5);0;6;(0,8):t(0,207)=ar(0,5);0;8;(0,8):t(0,208)=ar(0,5);0;3;(0,8):t(0,209)=ar(0,5);0;9;(0,8):t(0,210)=ar(0,5);0;8;(0,8):t(0,211)=ar(0,5);0;6;(0,8):t(0,212)=ar(0,5);0;1;(0,8):t(0,213)=ar(0,5);0;7;(0,8):t(0,214)=ar(0,5);0;16;(0,8):t(0,215)=ar(0,5);0;10;(0,8):t(0,216)=ar(0,5);0;9;(0,8):t(0,217)=ar(0,5);0;7;(0,8):t(0,218)=ar(0,5);0;18;(0,8):t(0,219)=ar(0,5);0;5;(0,8):t(0,220)=ar(0,5);0;9;(0,8):t(0,221)=ar(0,5);0;30;(0,8):t(0,222)=ar(0,5);0;6;(0,8):t(0,223)=ar(0,5);0;9;(0,8):t(0,224)=ar(0,5);0;4;(0,8):t(0,225)=ar(0,5);0;5;(0,8):t(0,226)=ar(0,5);0;4;(0,8):t(0,227)=ar(0,5);0;26;(0,8):t(0,228)=ar(0,5);0;19;(0,8):t(0,229)=ar(0,5);0;8;(0,8):t(0,230)=ar(0,5);0;6;(0,8):t(0,231)=ar(0,5);0;50;(0,8):t(0,232)=ar(0,5);0;11;(0,8):t(0,233)=ar(0,5);0;69;(0,8):t(0,234)=ar(0,5);0;36;(0,8):t(0,235)=ar(0,5);0;8;(0,8):t(0,236)=ar(0,5);0;8;(0,8):t(0,237)=ar(0,5);0;14;(0,8):t(0,238)=ar(0,5);0;64;(0,8):t(0,239)=ar(0,5);0;7;(0,8):t(0,240)=ar(0,5);0;8;(0,8):t(0,241)=ar(0,5);0;37;(0,242)__Pyx_StringTabEntry:t(0,242)=(0,243):T(0,243)=s16p:(0,152),0,32;i:(0,9),32,32;s:(0,6),64,32;n:(0,36),96,32;;__pyx_d4:S(0,2)__pyx_d5:S(0,2)__pyx_d6:S(0,2)__pyx_d7:S(0,2)__pyx_d8:S(0,2)__pyx_mdef_4pygr_5cdict_8KeyIndex___init__:S(0,244)=xsPyMethodDef:PyMethodDef:t(0,244)=(0,74)__pyx_doc_4pygr_5cdict_8KeyIndex___getitem__:S(0,245)__pyx_mdef_4pygr_5cdict_8KeyIndex___getitem__:S(0,244)__pyx_mdef_4pygr_5cdict_16CGraphQueryMatch___init__:S(0,244)__pyx_mdef_4pygr_5cdict_18QueryMatchIterator___init__:S(0,244)__pyx_mdef_4pygr_5cdict_18QueryMatchIterator___iter__:S(0,244)__pyx_mdef_4pygr_5cdict_18QueryMatchIterator___next__:S(0,244)__pyx_mdef_4pygr_5cdict_14QueryMatchList___init__:S(0,244)__pyx_mdef_4pygr_5cdict_14QueryMatchList___len__:S(0,244)__pyx_mdef_4pygr_5cdict_14QueryMatchList___iter__:S(0,244)__pyx_mdef_4pygr_5cdict_14QueryMatchList___getitem__:S(0,244)__pyx_mdef_4pygr_5cdict_14QueryMatchList_get_more:S(0,244)__pyx_doc_4pygr_5cdict_13IntTupleArray_set_vector:S(0,246)__pyx_doc_4pygr_5cdict_13IntTupleArray_realloc:S(0,247)__pyx_methods_4pygr_5cdict_CIntDictionary:S(0,248)__pyx_tp_as_number_CIntDictionary:S(0,63)__pyx_tp_as_sequence_CIntDictionary:S(0,64)__pyx_tp_as_mapping_CIntDictionary:S(0,65)__pyx_tp_as_buffer_CIntDictionary:S(0,70)__pyx_methods_4pygr_5cdict_CDictionary:S(0,249)__pyx_tp_as_number_CDictionary:S(0,63)__pyx_tp_as_sequence_CDictionary:S(0,64)__pyx_tp_as_mapping_CDictionary:S(0,65)__pyx_tp_as_buffer_CDictionary:S(0,70)__pyx_methods_4pygr_5cdict_CDictionaryRef:S(0,250)__pyx_tp_as_number_CDictionaryRef:S(0,63)__pyx_tp_as_sequence_CDictionaryRef:S(0,64)__pyx_tp_as_mapping_CDictionaryRef:S(0,65)__pyx_tp_as_buffer_CDictionaryRef:S(0,70)__pyx_methods_4pygr_5cdict_CGraphDict:S(0,251)__pyx_members_4pygr_5cdict_CGraphDict:S(0,252)__pyx_tp_as_number_CGraphDict:S(0,63)__pyx_tp_as_sequence_CGraphDict:S(0,64)__pyx_tp_as_mapping_CGraphDict:S(0,65)__pyx_tp_as_buffer_CGraphDict:S(0,70)__pyx_methods_4pygr_5cdict_CDictIterator:S(0,253)__pyx_tp_as_number_CDictIterator:S(0,63)__pyx_tp_as_sequence_CDictIterator:S(0,64)__pyx_tp_as_mapping_CDictIterator:S(0,65)__pyx_tp_as_buffer_CDictIterator:S(0,70)__pyx_methods_4pygr_5cdict_CGraphIterator:S(0,254)__pyx_tp_as_number_CGraphIterator:S(0,63)__pyx_tp_as_sequence_CGraphIterator:S(0,64)__pyx_tp_as_mapping_CGraphIterator:S(0,65)__pyx_tp_as_buffer_CGraphIterator:S(0,70)__pyx_methods_4pygr_5cdict_IntTupleArray:S(0,255)__pyx_members_4pygr_5cdict_IntTupleArray:S(0,256)__pyx_tp_as_number_IntTupleArray:S(0,63)__pyx_tp_as_sequence_IntTupleArray:S(0,64)__pyx_tp_as_mapping_IntTupleArray:S(0,65)__pyx_tp_as_buffer_IntTupleArray:S(0,70)__pyx_methods:S(0,257)__pyx_filenames:S(0,258)__pyx_type_4pygr_5cdict_CIntDictionary:G(0,142)__pyx_type_4pygr_5cdict_CDictionary:G(0,142)__pyx_type_4pygr_5cdict_CDictionaryRef:G(0,142)__pyx_type_4pygr_5cdict_CGraphDict:G(0,142)__pyx_type_4pygr_5cdict_CDictIterator:G(0,142)__pyx_type_4pygr_5cdict_CGraphIterator:G(0,142)__pyx_type_4pygr_5cdict_IntTupleArray:G(0,142):t(0,245)=ar(0,5);0;66;(0,8):t(0,246)=ar(0,5);0;57;(0,8):t(0,247)=ar(0,5);0;51;(0,8):t(0,248)=ar(0,5);0;3;(0,74):t(0,249)=ar(0,5);0;5;(0,74):t(0,250)=ar(0,5);0;5;(0,74):t(0,251)=ar(0,5);0;5;(0,74):t(0,252)=ar(0,5);0;1;(0,75):t(0,253)=ar(0,5);0;0;(0,74):t(0,254)=ar(0,5);0;0;(0,74):t(0,255)=ar(0,5);0;2;(0,74):t(0,256)=ar(0,5);0;1;(0,75):t(0,257)=ar(0,5);0;0;(0,74):t(0,258)=ar(0,5);0;0;(0,6)PKd—~;9ôÈ[_[_pygr/classutil.pyimport os import sys import tempfile from weakref import WeakValueDictionary import dbfile import logger class FilePopenBase(object): '''Base class for subprocess.Popen-like class interface that can be supported on Python 2.3 (without subprocess). The main goal is to avoid the pitfalls of Popen.communicate(), which cannot handle more than a small amount of data, and to avoid the possibility of deadlocks and the issue of threading, by using temporary files''' def __init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, *largs, **kwargs): '''Mimics the interface of subprocess.Popen() with two additions: - stdinFlag, if passed, gives a flag to add the stdin filename directly to the command line (rather than passing it by redirecting stdin). example: stdinFlag="-i" will add the following to the commandline: -i /path/to/the/file If set to None, the stdin filename is still appended to the commandline, but without a preceding flag argument. -stdoutFlag: exactly the same thing, except for the stdout filename. ''' self.stdin, self._close_stdin = self._get_pipe_file(stdin, 'stdin') self.stdout, self._close_stdout = self._get_pipe_file(stdout, 'stdout') self.stderr, self._close_stderr = self._get_pipe_file(stderr, 'stderr') kwargs = kwargs.copy() # get a copy we can change try: # add as a file argument stdinFlag = kwargs['stdinFlag'] if stdinFlag: args.append(stdinFlag) args.append(self._stdin_path) del kwargs['stdinFlag'] stdin = None except KeyError: # just make it read this stream stdin = self.stdin try: # add as a file argument stdoutFlag = kwargs['stdoutFlag'] if stdoutFlag: args.append(stdoutFlag) args.append(self._stdout_path) del kwargs['stdoutFlag'] stdout = None except KeyError: # make it write to this stream stdout = self.stdout self.args = (args, bufsize, executable, stdin, stdout, self.stderr) + largs self.kwargs = kwargs def _get_pipe_file(self, ifile, attr): 'create a temp filename instead of a PIPE; save the filename' if ifile == PIPE: # use temp file instead! fd, path = tempfile.mkstemp() setattr(self, '_' + attr + '_path', path) return os.fdopen(fd, 'w+b'), True elif ifile is not None: setattr(self, '_' + attr + '_path', ifile.name) return ifile, False def _close_file(self, attr): 'close and delete this temp file if still open' if getattr(self, '_close_' + attr): getattr(self, attr).close() setattr(self, '_close_' + attr, False) os.remove(getattr(self, '_' + attr + '_path')) def _rewind_for_reading(self, ifile): if ifile is not None: ifile.flush() ifile.seek(0) def close(self): """Close any open temp (PIPE) files. """ self._close_file('stdin') self._close_file('stdout') self._close_file('stderr') def __del__(self): self.close() def call_subprocess(*popenargs, **kwargs): 'portable interface to subprocess.call(), even if subprocess not available' p = FilePopen(*popenargs, **kwargs) return p.wait() try: import subprocess PIPE = subprocess.PIPE class FilePopen(FilePopenBase): 'this subclass uses the subprocess module Popen() functionality' def wait(self): self._rewind_for_reading(self.stdin) p = subprocess.Popen(*self.args, **self.kwargs) p.wait() self._close_file('stdin') self._rewind_for_reading(self.stdout) self._rewind_for_reading(self.stderr) return p.returncode except ImportError: CSH_REDIRECT = False # SH style redirection is default import platform if platform.system() == 'Windows': def mkarg(arg): """Very basic quoting of arguments for Windows """ return '"' + arg + '"' else: # UNIX from commands import mkarg try: if os.environ['SHELL'].endswith('csh'): CSH_REDIRECT = True except KeyError: pass badExecutableCode = None class FilePopen(FilePopenBase): 'this subclass fakes subprocess.Popen.wait() using os.system()' def wait(self): self._rewind_for_reading(self.stdin) args = map(mkarg, self.args[0]) if self.args[3]: # redirect stdin args += ['<', mkarg(self._stdin_path)] if self.args[4]: # redirect stdout args += ['>', mkarg(self._stdout_path)] cmd = ' '.join(args) if self.args[5]: # redirect stderr if CSH_REDIRECT: cmd = '(%s) >& %s' % (cmd, mkarg(self._stderr_path)) else: cmd = cmd + ' 2> ' + mkarg(self._stderr_path) returncode = os.system(cmd) self._close_file('stdin') self._rewind_for_reading(self.stdout) self._rewind_for_reading(self.stderr) if badExecutableCode is not None and \ badExecutableCode == returncode: raise OSError('no such command: %s' % str(self.args[0])) return returncode PIPE = id(FilePopen) # an arbitrary code for identifying this code # find out exit code for a bad executable name, silently badExecutableCode = call_subprocess(('aZfDqW9', ), stdout=PIPE, stderr=PIPE) def ClassicUnpickler(cls, state): 'standard python unpickling behavior' self = cls.__new__(cls) try: setstate = self.__setstate__ except AttributeError: # JUST SAVE TO __dict__ AS USUAL self.__dict__.update(state) else: setstate(state) return self ClassicUnpickler.__safe_for_unpickling__ = 1 def filename_unpickler(cls, path, kwargs): 'raise IOError if path not readable' if not os.path.exists(path): try:# CONVERT TO ABSOLUTE PATH BASED ON SAVED DIRECTORY PATH path = os.path.normpath(os.path.join(kwargs['curdir'], path)) if not os.path.exists(path): raise IOError('unable to open file %s' % path) except KeyError: raise IOError('unable to open file %s' % path) if cls is SourceFileName: return SourceFileName(path) raise ValueError('Attempt to unpickle untrusted class ' + cls.__name__) filename_unpickler.__safe_for_unpickling__ = 1 class SourceFileName(str): '''store a filepath string, raise IOError on unpickling if filepath not readable, and complain if the user tries to pickle a relative path''' def __reduce__(self): if not os.path.isabs(str(self)): print >>sys.stderr, ''' WARNING: You are trying to pickle an object that has a local file dependency stored only as a relative file path: %s This is not a good idea, because anyone working in a different directory would be unable to unpickle this object, since it would be unable to find the file using the relative path. To avoid this problem, SourceFileName is saving the current working directory path so that it can translate the relative path to an absolute path. In the future, please use absolute paths when constructing objects that you intend to save to worldbase or pickle!''' % str(self) return (filename_unpickler, (self.__class__, str(self), dict(curdir=os.getcwd()))) def file_dirpath(filename): 'return path to directory containing filename' dirname = os.path.dirname(filename) if dirname == '': return os.curdir else: return dirname def get_valid_path(*pathTuples): '''for each tuple in args, build path using os.path.join(), and return the first path that actually exists, or else None.''' for t in pathTuples: mypath = os.path.join(*t) if os.path.exists(mypath): return mypath def search_dirs_for_file(filepath, pathlist=()): 'return successful path based on trying pathlist locations' if os.path.exists(filepath): return filepath b = os.path.basename(filepath) for s in pathlist: # NOW TRY EACH DIRECTORY IN pathlist mypath = os.path.join(s, b) if os.path.exists(mypath): return mypath raise IOError('unable to open %s from any location in %s' % (filepath, pathlist)) def report_exception(): 'print string message from exception to stderr' import traceback info = sys.exc_info()[:2] l = traceback.format_exception_only(info[0], info[1]) print >>sys.stderr, 'Warning: caught %s\nContinuing...' % l[0] def standard_invert(self): 'keep a reference to an inverse mapping, using self._inverseClass' try: return self._inverse except AttributeError: self._inverse = self._inverseClass(self) return self._inverse def lazy_create_invert(klass): """Create a function to replace __invert__ with a call to a cached object. lazy_create_invert defines a method that looks up self._inverseObj and, it it doesn't exist, creates it from 'klass' and then saves it. The resulting object is then returned as the inverse. This allows for one-time lazy creation of a single object per parent class. """ def invert_fn(self, klass=klass): try: return self._inverse except AttributeError: # does not exist yet; create & store. inverseObj = klass(self) self._inverse = inverseObj return inverseObj return invert_fn def standard_getstate(self): 'get dict of attributes to save, using self._pickleAttrs dictionary' d = {} for attr, arg in self._pickleAttrs.items(): try: if isinstance(arg, str): d[arg] = getattr(self, attr) else: d[attr] = getattr(self, attr) except AttributeError: pass try: # DON'T SAVE itemClass IF SIMPLY A SHADOW of default itemClass # from __class__ if not hasattr(self.__class__, 'itemClass') or \ (self.itemClass is not self.__class__.itemClass and (not hasattr(self.itemClass, '_shadowParent') or self.itemClass._shadowParent is not self.__class__.itemClass)): try: d['itemClass'] = self.itemClass._shadowParent except AttributeError: d['itemClass'] = self.itemClass if not hasattr(self.__class__, 'itemSliceClass') or \ (self.itemSliceClass is not self.__class__.itemSliceClass and (not hasattr(self.itemSliceClass, '_shadowParent') or self.itemSliceClass._shadowParent is not self.__class__.itemSliceClass)): try: d['itemSliceClass'] = self.itemSliceClass._shadowParent except AttributeError: d['itemSliceClass'] = self.itemSliceClass except AttributeError: pass try: # SAVE CUSTOM UNPACKING METHOD d['unpack_edge'] = self.__dict__['unpack_edge'] except KeyError: pass return d def standard_setstate(self, state): 'apply dict of saved state by passing as kwargs to constructor' if isinstance(state, list): # GET RID OF THIS BACKWARDS-COMPATIBILITY CODE self.__init__(*state) print >>sys.stderr, 'WARNING: obsolete list pickle %s. Update \ by resaving!' % repr(self) else: state['unpicklingMode'] = True # SIGNAL THAT WE ARE UNPICKLING self.__init__(**state) def apply_itemclass(self, state): try: self.itemClass = state['itemClass'] self.itemSliceClass = state['itemSliceClass'] except KeyError: pass def generate_items(items): 'generate o.id,o for o in items' for o in items: yield o.id, o def item_unpickler(db, *args): 'get an item or subslice of a database' obj = db for arg in args: obj = obj[arg] return obj item_unpickler.__safe_for_unpickling__ = 1 def item_reducer(self): ############################# SUPPORT FOR PICKLING 'pickle an item of a database just as a reference' return (item_unpickler, (self.db, self.id)) def shadow_reducer(self): 'pickle shadow class instance using its true class' shadowClass = self.__class__ trueClass = shadowClass._shadowParent # super() TOTALLY FAILED ME HERE! self.__class__ = trueClass # FORCE IT TO PICKLE USING trueClass keepDB = False if hasattr(shadowClass, 'db') and not hasattr(self, 'db'): keepDB = True self.__dict__['db'] = shadowClass.db # retain this attribute!! if hasattr(trueClass, '__reduce__'): # USE trueClass.__reduce__ result = trueClass.__reduce__(self) elif hasattr(trueClass, '__getstate__'): # USE trueClass.__getstate__ result = (ClassicUnpickler, (trueClass, self.__getstate__())) else: # PICKLE __dict__ AS USUAL PYTHON PRACTICE result = (ClassicUnpickler, (trueClass, self.__dict__)) self.__class__ = shadowClass # RESTORE SHADOW CLASS if keepDB: # now we can drop the temporary db attribute we added del self.__dict__['db'] return result def get_bound_subclass(obj, classattr='__class__', subname=None, factories=(), attrDict=None, subclassArgs=None): 'create a subclass specifically for obj to bind its shadow attributes' targetClass = getattr(obj, classattr) try: if targetClass._shadowOwner is obj: return targetClass # already shadowed, so nothing to do except AttributeError: # not a shadow class, so just shadow it pass else: # someone else's shadow class, so shadow its parent targetClass = targetClass._shadowParent if subname is None: # get a name from worldbase ID try: subname = obj._persistent_id.split('.')[-1] except AttributeError: subname = '__generic__' class shadowClass(targetClass): __reduce__ = shadow_reducer _shadowParent = targetClass # NEED TO KNOW ORIGINAL CLASS _shadowOwner = obj # need to know who owns it if attrDict is not None: # add attributes to the class dictionary locals().update(attrDict) for f in factories: f(locals()) if classattr == 'itemClass' or classattr == 'itemSliceClass': shadowClass.db = obj # the class needs to know its db object try: # run subclass initializer if present subclass_init = shadowClass._init_subclass except AttributeError: # no subclass initializer, so nothing to do pass else: # run the subclass initializer if subclassArgs is None: subclassArgs = {} subclass_init(**subclassArgs) shadowClass.__name__ = targetClass.__name__ + '_' + subname setattr(obj, classattr, shadowClass) # SHADOW CLASS REPLACES ORIGINAL return shadowClass def method_not_implemented(*args, **kwargs): raise NotImplementedError def read_only_error(*args, **kwargs): raise NotImplementedError("read only dict") def methodFactory(methodList, methodStr, localDict): 'save a method or exec expression for each name in methodList' for methodName in methodList: if callable(methodStr): localDict[methodName] = methodStr else: localDict[methodName] = eval(methodStr % methodName) def open_shelve(filename, mode=None, writeback=False, allowReadOnly=False, useHash=False, verbose=True): '''Alternative to shelve.open with several benefits: - uses bsddb btree by default instead of bsddb hash, which is very slow for large databases. Will automatically fall back to using bsddb hash for existing hash-based shelve files. Set useHash=True to force it to use bsddb hash. - allowReadOnly=True will automatically suppress permissions errors so user can at least get read-only access to the desired shelve, if no write permission. - mode=None first attempts to open file in read-only mode, but if the file does not exist, opens it in create mode. - raises standard exceptions defined in dbfile: WrongFormatError, PermissionsError, ReadOnlyError, NoSuchFileError - avoids generating bogus __del__ warnings as Python shelve.open() does. ''' if mode=='r': # READ-ONLY MODE, RAISE EXCEPTION IF NOT FOUND return dbfile.shelve_open(filename, flag=mode, useHash=useHash) elif mode is None: try: # 1ST TRY READ-ONLY, BUT IF NOT FOUND CREATE AUTOMATICALLY return dbfile.shelve_open(filename, 'r', useHash=useHash) except dbfile.NoSuchFileError: mode = 'c' # CREATE NEW SHELVE FOR THE USER try: # CREATION / WRITING: FORCE IT TO WRITEBACK AT close() IF REQUESTED return dbfile.shelve_open(filename, flag=mode, writeback=writeback, useHash=useHash) except dbfile.ReadOnlyError: if allowReadOnly: d = dbfile.shelve_open(filename, flag='r', useHash=useHash) if verbose: logger.warn(''' Opening shelve file %s in read-only mode because you lack write permissions to this file. You will NOT be able to modify the contents of this shelve dictionary. To avoid seeing this warning message, use verbose=False argument for the classutil.open_shelve() function. ''' % filename) return d else: raise def get_shelve_or_dict(filename=None, dictClass=None, **kwargs): if filename is not None: if dictClass is not None: return dictClass(filename, **kwargs) else: from mapping import IntShelve return IntShelve(filename, **kwargs) return {} class PathSaver(object): def __init__(self, origPath): self.origPath = origPath self.origDir = os.getcwd() def __str__(self): if os.access(self.origPath, os.R_OK): return self.origPath trypath = os.path.join(self.origDir, self.origPath) if os.access(trypath, os.R_OK): return trypath def override_rich_cmp(localDict): 'create rich comparison methods that just use __cmp__' mycmp = localDict['__cmp__'] localDict['__lt__'] = lambda self, other: mycmp(self, other) < 0 localDict['__le__'] = lambda self, other: mycmp(self, other) <= 0 localDict['__eq__'] = lambda self, other: mycmp(self, other) == 0 localDict['__ne__'] = lambda self, other: mycmp(self, other) != 0 localDict['__gt__'] = lambda self, other: mycmp(self, other) > 0 localDict['__ge__'] = lambda self, other: mycmp(self, other) >= 0 class DBAttributeDescr(object): 'obtain an attribute from associated db object' def __init__(self, attr): self.attr = attr def __get__(self, obj, objtype): return getattr(obj.db, self.attr) def get_env_or_cwd(envname): 'get the specified environment value or path to current directory' try: return os.environ[envname] # USER-SPECIFIED DIRECTORY except KeyError: return os.getcwd() # DEFAULT: SAVE IN CURRENT DIRECTORY class RecentValueDictionary(WeakValueDictionary): '''keep the most recent n references in a WeakValueDictionary. This combines the elegant cache behavior of a WeakValueDictionary (only keep an item in cache if the user is still using it), with the most common efficiency pattern: locality, i.e. references to a given thing tend to cluster in time. Note that this works *even* if the user is not holding a reference to the item between requests for it. Our Most Recent queue will hold a reference to it, keeping it in the WeakValueDictionary, until it is bumped by more recent requests. n: the maximum number of objects to keep in the Most Recent queue, default value 50.''' def __init__(self, n=None): WeakValueDictionary.__init__(self) if n<1: # user doesn't want any Most Recent value queue self.__class__ = WeakValueDictionary # revert to regular WVD return if isinstance(n, int): self.n = n # size limit else: self.n = 50 self._head = self._tail = None self._keepDict = {} # most recent queue def __getitem__(self, k): v = WeakValueDictionary.__getitem__(self, k) # KeyError if not found self.keep_this(v) return v def _splice(self, previous, after): 'link previous <--> after in queue, setting head & tail if needed' if previous is not None: self._keepDict[previous][1] = after if after is not None: self._keepDict[after][0] = previous elif previous is not None: # previous is end of queue! self._tail = previous if after is self._head: self._head = previous def keep_this(self, v): """add v as our most recent ref; drop oldest ref if over size limit. """ if v is self._head: return # already at head of queue, so nothing to do try: # check if already in _keepDict previous, after = self._keepDict[v] except KeyError: self._keepDict[v] = [None, None] else: # remove from current position self._splice(previous, after) self._keepDict[v][0] = None self._splice(v, self._head) # place at head of queue if len(self._keepDict) > self.n: # delete oldest entry vdel = self._tail # get current tail self._splice(self._keepDict[vdel][0], None) # set new tail del self._keepDict[vdel] def __setitem__(self, k, v): WeakValueDictionary.__setitem__(self, k, v) self.keep_this(v) def clear(self): self._head = self._tail = None self._keepDict.clear() WeakValueDictionary.clear(self) def __repr__(self): return '' %\ (len(self._keepDict), self.n) def make_attribute_interface(d): """ If 'd' contains int values, use them to index tuples. If 'd' contains str values, use them to retrieve attributes from an obj. If d empty, use standard 'getattr'. """ if len(d): v = d.values()[0] if isinstance(v, int): return AttrFromTuple(d) elif isinstance(v, str): return AttrFromObject(d) raise ValueError('dictionary values must be int or str!') return getattr class AttrFromTuple(object): def __init__(self, attrDict): self.attrDict = attrDict def __call__(self, obj, attr, default=None): 'getattr from tuple obj' try: return obj[self.attrDict[attr]] except (IndexError, KeyError): if default is not None: return default raise AttributeError("object has no attribute '%s'" % attr) class AttrFromObject(AttrFromTuple): def __call__(self, obj, attr, default=None): 'getattr with attribute name aliases' try: return getattr(obj, self.attrDict[attr]) except KeyError: try: return getattr(obj, attr) except KeyError: if default is not None: return default raise AttributeError("object has no attribute '%s'" % attr) def kwargs_filter(kwargs, allowed): 'return dictionary of kwargs filtered by list allowed' d = {} for arg in allowed: try: d[arg] = kwargs[arg] except KeyError: pass return d def split_kwargs(kwargs, *targets): '''split kwargs into n+1 dicts for n targets; each target must be a list of arguments for that target''' kwargs = kwargs.copy() out = [] for args in targets: d = {} for arg in args: try: d[arg] = kwargs[arg] del kwargs[arg] except KeyError: pass out.append(d) out.append(kwargs) return out PKðŠ’;3оû„„pygr/classutil.pyc;ò |†Kc@s dkZdkZdkZdklZdkZdkZdefd„ƒYZd„Z y,dk Z e i Z defd„ƒYZ WnÍe j oÁeZdkZeiƒdjo d„ZnId klZy%eid id ƒo eZnWnej onXeZdefd „ƒYZ ee ƒZ e d fde de ƒZnXd„Zde_d„Zde_defd„ƒYZd„Z d„Z!fd„Z"d„Z#d„Z$d„Z%d„Z&d„Z'd„Z(d„Z)d„Z*de*_d „Z+d!„Z,d"efeed#„Z-d$„Z.d%„Z/d&„Z0eeeeed'„Z1eed(„Z2d)efd*„ƒYZ3d+„Z4d,efd-„ƒYZ5d.„Z6d/efd0„ƒYZ7d1„Z8d2efd3„ƒYZ9d4e9fd5„ƒYZ:d6„Z;d7„Z<dS(8N(sWeakValueDictionarys FilePopenBasecBsStZdZdeeeed„Zd„Zd„Zd„Zd„Zd„Z RS(sCBase class for subprocess.Popen-like class interface that can be supported on Python 2.3 (without subprocess). The main goal is to avoid the pitfalls of Popen.communicate(), which cannot handle more than a small amount of data, and to avoid the possibility of deadlocks and the issue of threading, by using temporary filesic OsY|i|dƒ\|_|_|i|dƒ\|_|_|i|dƒ\|_|_|i ƒ}yC|d} | o|i | ƒn|i |i ƒ|d=t}Wntj o|i}nXyC|d} | o|i | ƒn|i |iƒ|d=t}Wntj o|i}nX||||||if||_ ||_dS(sØMimics the interface of subprocess.Popen() with two additions: - stdinFlag, if passed, gives a flag to add the stdin filename directly to the command line (rather than passing it by redirecting stdin). example: stdinFlag="-i" will add the following to the commandline: -i /path/to/the/file If set to None, the stdin filename is still appended to the commandline, but without a preceding flag argument. -stdoutFlag: exactly the same thing, except for the stdout filename. sstdinsstdoutsstderrs stdinFlags stdoutFlagN(sselfs_get_pipe_filesstdins _close_stdinsstdouts _close_stdoutsstderrs _close_stderrskwargsscopys stdinFlagsargssappends _stdin_pathsNonesKeyErrors stdoutFlags _stdout_pathsbufsizes executableslargs( sselfsargssbufsizes executablesstdinsstdoutsstderrslargsskwargss stdinFlags stdoutFlag((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__s2      "cCs‹|tjoDtiƒ\}}t|d|d|ƒt i |dƒt fSn-|t j ot|d|d|i ƒn|tfSdS(s;create a temp filename instead of a PIPE; save the filenames_s_pathsw+bN(sifilesPIPEstempfilesmkstempsfdspathssetattrsselfsattrsossfdopensTruesNonesnamesFalse(sselfsifilesattrsfdspath((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys_get_pipe_file6s  cCsat|d|ƒoIt||ƒiƒt|d|tƒtit|d|dƒƒndS(s-close and delete this temp file if still opens_close_s_s_pathN(sgetattrsselfsattrsclosessetattrsFalsesossremove(sselfsattr((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys _close_file@s cCs,|tj o|iƒ|idƒndS(Ni(sifilesNonesflushsseek(sselfsifile((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys_rewind_for_readingGs  cCs+|idƒ|idƒ|idƒdS(s"Close any open temp (PIPE) files. sstdinsstdoutsstderrN(sselfs _close_file(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyscloseLs  cCs|iƒdS(N(sselfsclose(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__del__Rs( s__name__s __module__s__doc__sNones__init__s_get_pipe_files _close_files_rewind_for_readingscloses__del__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys FilePopenBase s &   cOst||Ž}|iƒSdS(sIportable interface to subprocess.call(), even if subprocess not availableN(s FilePopens popenargsskwargsspswait(s popenargsskwargssp((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyscall_subprocessVss FilePopencBstZdZd„ZRS(s>this subclass uses the subprocess module Popen() functionalitycCsj|i|iƒti|i|iŽ}|iƒ|i dƒ|i|i ƒ|i|i ƒ|i SdS(Nsstdin( sselfs_rewind_for_readingsstdins subprocesssPopensargsskwargsspswaits _close_filesstdoutsstderrs returncode(sselfsp((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyswaitbs  (s__name__s __module__s__doc__swait(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys FilePopen_s sWindowscCsd|dSdS(s,Very basic quoting of arguments for Windows s"N(sarg(sarg((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysmkargps(smkargsSHELLscshcBstZdZd„ZRS(s=this subclass fakes subprocess.Popen.wait() using os.system()cCsW|i|iƒtt|idƒ}|ido|dt|iƒg7}n|ido|dt|iƒg7}ndi|ƒ}|ido?t od|t|i ƒf}qØ|d t|i ƒ}nt i |ƒ}|id ƒ|i|iƒ|i|iƒttj o t|jo!td t|idƒƒ‚n|SdS( Niiss is (%s) >& %ss 2> sstdinsno such command: %s(sselfs_rewind_for_readingsstdinsmapsmkargsargss _stdin_paths _stdout_pathsjoinscmds CSH_REDIRECTs _stderr_pathsosssystems returncodes _close_filesstdoutsstderrsbadExecutableCodesNonesOSErrorsstr(sselfsargsscmds returncode((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyswait€s$ !(s__name__s __module__s__doc__swait(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys FilePopen}s saZfDqW9sstdoutsstderrcCsT|i|ƒ}y |i}Wn#tj o|ii|ƒn X||ƒ|SdS(s#standard python unpickling behaviorN( sclss__new__sselfs __setstate__ssetstatesAttributeErrors__dict__supdatesstate(sclssstatessetstatesself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysClassicUnpicklerœs  icCsÁtii|ƒ o{yQtiitii|d|ƒƒ}tii|ƒ otd|ƒ‚nWqtj otd|ƒ‚qXn|t jot |ƒSnt d|i ƒ‚dS(s"raise IOError if path not readablescurdirsunable to open file %ss$Attempt to unpickle untrusted class N( sosspathsexistssnormpathsjoinskwargssIOErrorsKeyErrorsclssSourceFileNames ValueErrors__name__(sclsspathskwargs((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysfilename_unpicklerªs% sSourceFileNamecBstZdZd„ZRS(s‡store a filepath string, raise IOError on unpickling if filepath not readable, and complain if the user tries to pickle a relative pathcCsdtiit|ƒƒ otidt|ƒIJnt|it|ƒt dti ƒƒffSdS(Ns1 WARNING: You are trying to pickle an object that has a local file dependency stored only as a relative file path: %s This is not a good idea, because anyone working in a different directory would be unable to unpickle this object, since it would be unable to find the file using the relative path. To avoid this problem, SourceFileName is saving the current working directory path so that it can translate the relative path to an absolute path. In the future, please use absolute paths when constructing objects that you intend to save to worldbase or pickle!scurdir( sosspathsisabssstrsselfssyssstderrsfilename_unpicklers __class__sdictsgetcwd(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys __reduce__¿s (s__name__s __module__s__doc__s __reduce__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysSourceFileNameºs cCs2tii|ƒ}|djo tiSn|SdS(s,return path to directory containing filenamesN(sosspathsdirnamesfilenamescurdir(sfilenamesdirname((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys file_dirpathÑs   cGsBx;|D]3}tii|Œ}tii|ƒo|SqqWdS(szfor each tuple in args, build path using os.path.join(), and return the first path that actually exists, or else None.N(s pathTuplesstsosspathsjoinsmypathsexists(s pathTuplesstsmypath((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysget_valid_pathÚs cCsˆtii|ƒo|Sntii|ƒ}x>|D]6}tii||ƒ}tii|ƒo|Sq4q4Wt d||fƒ‚dS(s9return successful path based on trying pathlist locationss)unable to open %s from any location in %sN( sosspathsexistssfilepathsbasenamesbspathlistsssjoinsmypathsIOError(sfilepathspathlistsbsssmypath((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyssearch_dirs_for_fileãs cCsLdk}tiƒd }|i|d|dƒ}tid|dIJdS(s-print string message from exception to stderrNiiis Warning: caught %s Continuing...(s tracebackssyssexc_infosinfosformat_exception_onlyslsstderr(sinfos tracebacksl((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysreport_exceptionðs  cCs>y |iSWn,tj o |i|ƒ|_|iSnXdS(s@keep a reference to an inverse mapping, using self._inverseClassN(sselfs_inversesAttributeErrors _inverseClass(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysstandard_invertøs  cCs|d„}|SdS(shCreate a function to replace __invert__ with a call to a cached object. lazy_create_invert defines a method that looks up self._inverseObj and, it it doesn't exist, creates it from 'klass' and then saves it. The resulting object is then returned as the inverse. This allows for one-time lazy creation of a single object per parent class. cCs>y |iSWn,tj o ||ƒ}||_|SnXdS(N(sselfs_inversesAttributeErrorsklasss inverseObj(sselfsklasss inverseObj((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys invert_fn s    N(sklasss invert_fn(sklasss invert_fn((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyslazy_create_inverts cCsëh}xq|iiƒD]`\}}y>t|tƒot||ƒ||s   cCs8y|d|_|d|_Wntj onXdS(Ns itemClasssitemSliceClass(sstatesselfs itemClasssitemSliceClasssKeyError(sselfsstate((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysapply_itemclassIs  ccs"x|D]}|i|fVqWdS(sgenerate o.id,o for o in itemsN(sitemssosid(sitemsso((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysgenerate_itemsQscGs)|}x|D]}||}q W|SdS(s%get an item or subslice of a databaseN(sdbsobjsargssarg(sdbsargssobjsarg((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysitem_unpicklerWs cCst|i|iffSdS(s0pickle an item of a database just as a referenceN(sitem_unpicklersselfsdbsid(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys item_reducer`scCsæ|i}|i}||_t}t|dƒot|dƒ ot}|i |i düss__lt__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysýss__le__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysþss__eq__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÿss__ne__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysss__gt__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysss__ge__N(s localDictsmycmp(s localDictsmycmp((smycmps?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysoverride_rich_cmpùs sDBAttributeDescrcBs tZdZd„Zd„ZRS(s-obtain an attribute from associated db objectcCs ||_dS(N(sattrsself(sselfsattr((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__scCst|i|iƒSdS(N(sgetattrsobjsdbsselfsattr(sselfsobjsobjtype((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__get__ s(s__name__s __module__s__doc__s__init__s__get__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysDBAttributeDescrs  cCs3yti|SWntj otiƒSnXdS(s@get the specified environment value or path to current directoryN(sossenvironsenvnamesKeyErrorsgetcwd(senvname((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysget_env_or_cwds sRecentValueDictionarycBsPtZdZed„Zd„Zd„Zd„Zd„Zd„Z d„Z RS(s—keep the most recent n references in a WeakValueDictionary. This combines the elegant cache behavior of a WeakValueDictionary (only keep an item in cache if the user is still using it), with the most common efficiency pattern: locality, i.e. references to a given thing tend to cluster in time. Note that this works *even* if the user is not holding a reference to the item between requests for it. Our Most Recent queue will hold a reference to it, keeping it in the WeakValueDictionary, until it is bumped by more recent requests. n: the maximum number of objects to keep in the Most Recent queue, default value 50.cCsnti|ƒ|djot|_dSnt|tƒo ||_n d|_t|_|_ h|_ dS(Nii2( sWeakValueDictionarys__init__sselfsns __class__s isinstancesintsNones_heads_tails _keepDict(sselfsn((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__$s     cCs'ti||ƒ}|i|ƒ|SdS(N(sWeakValueDictionarys __getitem__sselfsksvs keep_this(sselfsksv((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys __getitem__0s cCs|tj o||i|d after in queue, setting head & tail if needediiN(sprevioussNonesaftersselfs _keepDicts_tails_head(sselfsprevioussafter((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys_splice5s    cCsÛ||ijodSny|i|\}}Wn&tj ottg|i|(slensselfs _keepDictsn(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__repr__[s( s__name__s __module__s__doc__sNones__init__s __getitem__s_splices keep_thiss __setitem__sclears__repr__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysRecentValueDictionarys     cCsqt|ƒo\|iƒd}t|tƒot|ƒSnt|tƒot|ƒSnt dƒ‚nt SdS(s¶ If 'd' contains int values, use them to index tuples. If 'd' contains str values, use them to retrieve attributes from an obj. If d empty, use standard 'getattr'. is%dictionary values must be int or str!N( slensdsvaluessvs isinstancesints AttrFromTuplesstrsAttrFromObjects ValueErrorsgetattr(sdsv((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysmake_attribute_interface`s s AttrFromTuplecBstZd„Zed„ZRS(NcCs ||_dS(N(sattrDictsself(sselfsattrDict((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__uscCsXy||i|SWn.ttfj o|tj o|SqDnXtd|ƒ‚dS(sgetattr from tuple objsobject has no attribute '%s'N( sobjsselfsattrDictsattrs IndexErrorsKeyErrorsdefaultsNonesAttributeError(sselfsobjsattrsdefault((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__call__xs  (s__name__s __module__s__init__sNones__call__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys AttrFromTupless sAttrFromObjectcBstZed„ZRS(NcCs~yt||i|ƒSWnOtj oCyt||ƒSWqjtj o|tj o|SqeqjXnXtd|ƒ‚dS(s#getattr with attribute name aliasessobject has no attribute '%s'N( sgetattrsobjsselfsattrDictsattrsKeyErrorsdefaultsNonesAttributeError(sselfsobjsattrsdefault((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__call__„s (s__name__s __module__sNones__call__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysAttrFromObject‚scCsGh}x6|D].}y||||this subclass uses the subprocess module Popen() functionalitycCsj|i|iƒti|i|iŽ}|iƒ|i dƒ|i|i ƒ|i|i ƒ|i SdS(Nsstdin( sselfs_rewind_for_readingsstdins subprocesssPopensargsskwargsspswaits _close_filesstdoutsstderrs returncode(sselfsp((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyswaitbs  (s__name__s __module__s__doc__swait(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys FilePopen_s sWindowscCsd|dSdS(s,Very basic quoting of arguments for Windows s"N(sarg(sarg((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysmkargps(smkargsSHELLscshcBstZdZd„ZRS(s=this subclass fakes subprocess.Popen.wait() using os.system()cCsW|i|iƒtt|idƒ}|ido|dt|iƒg7}n|ido|dt|iƒg7}ndi|ƒ}|ido?t od|t|i ƒf}qØ|d t|i ƒ}nt i |ƒ}|id ƒ|i|iƒ|i|iƒttj o t|jo!td t|idƒƒ‚n|SdS( Niiss is (%s) >& %ss 2> sstdinsno such command: %s(sselfs_rewind_for_readingsstdinsmapsmkargsargss _stdin_paths _stdout_pathsjoinscmds CSH_REDIRECTs _stderr_pathsosssystems returncodes _close_filesstdoutsstderrsbadExecutableCodesNonesOSErrorsstr(sselfsargsscmds returncode((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyswait€s$ !(s__name__s __module__s__doc__swait(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys FilePopen}s saZfDqW9sstdoutsstderrcCsT|i|ƒ}y |i}Wn#tj o|ii|ƒn X||ƒ|SdS(s#standard python unpickling behaviorN( sclss__new__sselfs __setstate__ssetstatesAttributeErrors__dict__supdatesstate(sclssstatessetstatesself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysClassicUnpicklerœs  icCsÁtii|ƒ o{yQtiitii|d|ƒƒ}tii|ƒ otd|ƒ‚nWqtj otd|ƒ‚qXn|t jot |ƒSnt d|i ƒ‚dS(s"raise IOError if path not readablescurdirsunable to open file %ss$Attempt to unpickle untrusted class N( sosspathsexistssnormpathsjoinskwargssIOErrorsKeyErrorsclssSourceFileNames ValueErrors__name__(sclsspathskwargs((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysfilename_unpicklerªs% sSourceFileNamecBstZdZd„ZRS(s‡store a filepath string, raise IOError on unpickling if filepath not readable, and complain if the user tries to pickle a relative pathcCsdtiit|ƒƒ otidt|ƒIJnt|it|ƒt dti ƒƒffSdS(Ns1 WARNING: You are trying to pickle an object that has a local file dependency stored only as a relative file path: %s This is not a good idea, because anyone working in a different directory would be unable to unpickle this object, since it would be unable to find the file using the relative path. To avoid this problem, SourceFileName is saving the current working directory path so that it can translate the relative path to an absolute path. In the future, please use absolute paths when constructing objects that you intend to save to worldbase or pickle!scurdir( sosspathsisabssstrsselfssyssstderrsfilename_unpicklers __class__sdictsgetcwd(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys __reduce__¿s (s__name__s __module__s__doc__s __reduce__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysSourceFileNameºs cCs2tii|ƒ}|djo tiSn|SdS(s,return path to directory containing filenamesN(sosspathsdirnamesfilenamescurdir(sfilenamesdirname((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys file_dirpathÑs   cGsBx;|D]3}tii|Œ}tii|ƒo|SqqWdS(szfor each tuple in args, build path using os.path.join(), and return the first path that actually exists, or else None.N(s pathTuplesstsosspathsjoinsmypathsexists(s pathTuplesstsmypath((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysget_valid_pathÚs cCsˆtii|ƒo|Sntii|ƒ}x>|D]6}tii||ƒ}tii|ƒo|Sq4q4Wt d||fƒ‚dS(s9return successful path based on trying pathlist locationss)unable to open %s from any location in %sN( sosspathsexistssfilepathsbasenamesbspathlistsssjoinsmypathsIOError(sfilepathspathlistsbsssmypath((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyssearch_dirs_for_fileãs cCsLdk}tiƒd }|i|d|dƒ}tid|dIJdS(s-print string message from exception to stderrNiiis Warning: caught %s Continuing...(s tracebackssyssexc_infosinfosformat_exception_onlyslsstderr(sinfos tracebacksl((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysreport_exceptionðs  cCs>y |iSWn,tj o |i|ƒ|_|iSnXdS(s@keep a reference to an inverse mapping, using self._inverseClassN(sselfs_inversesAttributeErrors _inverseClass(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysstandard_invertøs  cCs|d„}|SdS(shCreate a function to replace __invert__ with a call to a cached object. lazy_create_invert defines a method that looks up self._inverseObj and, it it doesn't exist, creates it from 'klass' and then saves it. The resulting object is then returned as the inverse. This allows for one-time lazy creation of a single object per parent class. cCs>y |iSWn,tj o ||ƒ}||_|SnXdS(N(sselfs_inversesAttributeErrorsklasss inverseObj(sselfsklasss inverseObj((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys invert_fn s    N(sklasss invert_fn(sklasss invert_fn((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pyslazy_create_inverts cCsëh}xq|iiƒD]`\}}y>t|tƒot||ƒ||s   cCs8y|d|_|d|_Wntj onXdS(Ns itemClasssitemSliceClass(sstatesselfs itemClasssitemSliceClasssKeyError(sselfsstate((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysapply_itemclassIs  ccs"x|D]}|i|fVqWdS(sgenerate o.id,o for o in itemsN(sitemssosid(sitemsso((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysgenerate_itemsQscGs)|}x|D]}||}q W|SdS(s%get an item or subslice of a databaseN(sdbsobjsargssarg(sdbsargssobjsarg((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysitem_unpicklerWs cCst|i|iffSdS(s0pickle an item of a database just as a referenceN(sitem_unpicklersselfsdbsid(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys item_reducer`scCsæ|i}|i}||_t}t|dƒot|dƒ ot}|i |i düss__lt__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysýss__le__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysþss__eq__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysÿss__ne__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysss__gt__csˆ||ƒdjS(Ni(smycmpsselfsother(sselfsother(smycmp(s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysss__ge__N(s localDictsmycmp(s localDictsmycmp((smycmps?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysoverride_rich_cmpùs sDBAttributeDescrcBs tZdZd„Zd„ZRS(s-obtain an attribute from associated db objectcCs ||_dS(N(sattrsself(sselfsattr((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__scCst|i|iƒSdS(N(sgetattrsobjsdbsselfsattr(sselfsobjsobjtype((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__get__ s(s__name__s __module__s__doc__s__init__s__get__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysDBAttributeDescrs  cCs3yti|SWntj otiƒSnXdS(s@get the specified environment value or path to current directoryN(sossenvironsenvnamesKeyErrorsgetcwd(senvname((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysget_env_or_cwds sRecentValueDictionarycBsPtZdZed„Zd„Zd„Zd„Zd„Zd„Z d„Z RS(s—keep the most recent n references in a WeakValueDictionary. This combines the elegant cache behavior of a WeakValueDictionary (only keep an item in cache if the user is still using it), with the most common efficiency pattern: locality, i.e. references to a given thing tend to cluster in time. Note that this works *even* if the user is not holding a reference to the item between requests for it. Our Most Recent queue will hold a reference to it, keeping it in the WeakValueDictionary, until it is bumped by more recent requests. n: the maximum number of objects to keep in the Most Recent queue, default value 50.cCsnti|ƒ|djot|_dSnt|tƒo ||_n d|_t|_|_ h|_ dS(Nii2( sWeakValueDictionarys__init__sselfsns __class__s isinstancesintsNones_heads_tails _keepDict(sselfsn((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__$s     cCs'ti||ƒ}|i|ƒ|SdS(N(sWeakValueDictionarys __getitem__sselfsksvs keep_this(sselfsksv((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys __getitem__0s cCs|tj o||i|d after in queue, setting head & tail if needediiN(sprevioussNonesaftersselfs _keepDicts_tails_head(sselfsprevioussafter((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys_splice5s    cCsÛ||ijodSny|i|\}}Wn&tj ottg|i|(slensselfs _keepDictsn(sself((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__repr__[s( s__name__s __module__s__doc__sNones__init__s __getitem__s_splices keep_thiss __setitem__sclears__repr__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysRecentValueDictionarys     cCsqt|ƒo\|iƒd}t|tƒot|ƒSnt|tƒot|ƒSnt dƒ‚nt SdS(s¶ If 'd' contains int values, use them to index tuples. If 'd' contains str values, use them to retrieve attributes from an obj. If d empty, use standard 'getattr'. is%dictionary values must be int or str!N( slensdsvaluessvs isinstancesints AttrFromTuplesstrsAttrFromObjects ValueErrorsgetattr(sdsv((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysmake_attribute_interface`s s AttrFromTuplecBstZd„Zed„ZRS(NcCs ||_dS(N(sattrDictsself(sselfsattrDict((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__init__uscCsXy||i|SWn.ttfj o|tj o|SqDnXtd|ƒ‚dS(sgetattr from tuple objsobject has no attribute '%s'N( sobjsselfsattrDictsattrs IndexErrorsKeyErrorsdefaultsNonesAttributeError(sselfsobjsattrsdefault((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__call__xs  (s__name__s __module__s__init__sNones__call__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys AttrFromTupless sAttrFromObjectcBstZed„ZRS(NcCs~yt||i|ƒSWnOtj oCyt||ƒSWqjtj o|tj o|SqeqjXnXtd|ƒ‚dS(s#getattr with attribute name aliasessobject has no attribute '%s'N( sgetattrsobjsselfsattrDictsattrsKeyErrorsdefaultsNonesAttributeError(sselfsobjsattrsdefault((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pys__call__„s (s__name__s __module__sNones__call__(((s?build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/classutil.pysAttrFromObject‚scCsGh}x6|D].}y||||Ëx; ?H\<Ÿ<¿<ÿˆãx8„0Ð8¥0¸8ç0Ì8a88À H%<_88€B£0€bH%)Hd;½8ÿÿœè;ÞAžLCÓx8›1Åóx8Þ8þ9 9>H&-/ƒAžÿÄ<<Ÿ¥ëx†ãx€c£48„18c°H%å8!`#Ëx€»!ÿä|¦N€ ``€C€‚Aœ$A0€C€‚AAœ8`N€ 8`ÿÿN€ ``8`N€ ``€C€‚Aœ$A0€C€‚AœA8`N€ 8`ÿÿN€ ``8`N€ ``€C€‚Aœ$A0€C € ‚AœA8`N€ 8`ÿÿN€ ``8`N€ ``,L |i¦`d8/‹@œ8ÿÿ```€(Až0€$ }kЀD‘d|Ð})Ð|BБ$D 8„Bÿ¨N€ |¦¿¡ÿô|~yBŸè¦”!û°AT<Ÿ<¿<ÿÈóx8„-Ð8¥.8ç.8À78a8; H#Y<_88€B ˆ€bH"åH````8€H#Í|}y@¢D<Ÿ<¿<ÿÈóx8„. 8¥.8ç.8a88À7H"ý<_88€B €€bH"‰`8!P£ëx€»¡ÿô|¦N€ ``5fÿÿ|jx8`@@| | p})”I|B*€Š@œ}+KxH``8iƒXAœÿȆ@0|E.| *‚ @œ€€PM ```8`ÿÿN€ ``4Æÿÿ|kx8`L || p})”U"8|B*€€X@}&KxH``8iƒ0AœÿÈN€ |¦¿Áÿø8`BŸ8€ 覔!û°H"a|~y@¢H<Ÿ<¿<ÿ8a88„,`8¥,H8ç,ä8Àv9H!‘<_88€BžÀ€bH!``8!PÃóx€»Áÿø|¦N€ ``|¦¿ÿð||y”!ÿ°A‚ŒƒÜ/žAž@```€~ƒ¾/ƒAžH!1ÃóxH!)/Až¾ëxKÿÿØ`žãx```€~ƒ¾/ƒAžH ñÃóxH é/Až¾ëxKÿÿØ`8!P8`€»ÿð|¦N€ ``H```|x€/€@žÿôN€ ``|¦|Å1Ö|©þp|ª+x|¢+x|å;x¿ÿð”!ÿ°|Ì3x|Ëþp|}x|œ#x} P|ëI|©þp‡HA,@žˆ(@A ```|^xH``|Ö|ÖÀ(P8` 8À|Œ|¬Ö£ëx|€"H‰ƒãx¦ëxÅóx8€Hõ8!PÃóx€»ÿð|¦N€ ``|¦¿ÿð|½+yBŸ||x|ž#x覔!û°@‚¬€d/ƒAP<Ÿ<¿<ÿ|hx8„)À8¥)ø8ç* 8a88À÷H9<_88€Bœx€bHÅHœ```8€H­|}y@¢D<Ÿ<¿<ÿ8a88„*8¥)ø8ç* 8À÷HÝ<_88€Bœp€bHiH@€8`8À| þp|€| Öƒãx)|‰"H]€¾£ëx†ãx8€HÉ8!P£ëx€»ÿð|¦N€ ```|¦¿aÿì|½+x|„+Ö|{x|ü;x”!ÿ Ä)Ö|ò€0@¾0PÄþpWÀ~WÅ88ÀT„8ƒãx|#xHÑcÛx¥ëx†ãx8€H=8!`Ãóx€»aÿì|¦N€ |¦¿Aÿè|œ#x|½+x8€…ãx|zx”!ÿ |Û3xH™|ëÖ|éÖÀàQA‚8ÞèQ@0; ``;½CÓx8€8 fÛxH]žè@žÿä8!`|~※Aÿè|¦N€ ``|¦¿ÿà|ü;yBŸ|xx|™#xè¦|»+x|Ú3x”!û A¡T<Ÿ<¿<ÿˆãx8„'€8¥'¸8ç(X8À¯8a8Hý<_88€Bš8€bH‰8`ÿÿHÀ```ƒãx8€Hi|}y@¢0<Ÿ<¿<ÿˆãx8„'Ð8¥'¸8ç(X8À¯8a8H@`ƒãx8€H)|~y@¢P<Ÿ<¿<ÿˆãx8„'Ð8¥'¸8ç(`8À°8a8HY<_88€Bš0€bHå8`ÿÿH``‰¦KÓx8àªëx ›@@œ(Tà8€K}>|^.‘ ê8ç``9J9kBÿȉ¦KÓxªëx`` ˆØA(Tà8€K}>|^.‘ ê8ç``9J9kBÿÈ/™@0HT``€/€AœT:|].C8cBÿäW…8ÄóxCÓxHµ£ëxHmÃóxHe8`H)¦ÃxKÿÿ°```8!`€»ÿà|¦N€ ```|¦¿!ÿä|#y|zx|¹+x|Û3x;€”!ÿ @l;À`~8€ÞÊ8 fÛx|cÒH™8~ÿÿA8}ÿÿc8€8 fÛx;œ|z8cHiðAÿ°```8!`ƒãx€»!ÿä|¦N€ ``|¦¾áÿÜ|˜#x|@&BŸ|{x|º+xè¦|exA”!óp<Ÿ8„%h;ÁLÃóxH<ŸÃóx8„%pH!|}yA‚Ø<Ÿ8¡88Á<8á@8„%Œ9D9!HH¹£ëxH1€H4`AT;¡L<Ÿ<¿<ÿ|hx8„$|8¥$´8ç%œ8ÀF£ëx:àH•<_¤ëx€B—4€bH!H``8€H ||y@‚TH;¡L<Ÿ<¿<ÿ8„$Ì8ÀF8¥$´8ç%œ9£ëx:àH1<_¤ëx€B—,€bH½H¸`€H/€@L<ŸeÛxÃóx??8„% Hñ8™%¬ÃóxH|}yA‚¼€¡Hƒãx8€¦ëxH £ëxH!8`8€0HU.|wx@’8;¡L<Ÿ<¿<ÿ8„$Ì£ëx8¥$´8ç%°8ÀS9H``!D/‰A8`??H4``<ŸeÛxÃóx??8„%¼H=Ãóx8™%¬HQ|}y@‚8`/˜Až¬<ŸÃxÅóx:à8„%tHH ```/šAL;¡L<Ÿ<¿<ÿ8„$|HÓx8¥$´8ç%È£ëx8À]HÁ<_¤ëx€B—4€bHMH`CÓx8€H9,@‚P;¡L<Ÿ<¿<ÿ8„$ÌHÓx8¥$´8ç%È£ëx8À]`Ha<_¤ëx€B—,€bHíH¸`|Г·(w“W $!D€8€A<‘7W€@}"Ö | Ö‘7‚Až 8 w“—<ŸeÛx8„%ÔÃóxHÙ8™%¬ÃóxHí/ƒw,@ž`/˜Až4<ŸÃxÅóx8„%tH¥H```ƒãxH­A’~ã»x:àHH`:à```8! ~ã»x€aºáÿÜ|¦}p N€ |¦¿Áÿø|~x”!ÿ°``€c,/ƒAžHy€~(/ƒAžHi€~/ƒAžH8€~/ƒAžH8ÃóxHñ8!P8`€»Áÿø|¦N€ `|¦¾áÿÜ|#xBŸ|yx|·+xè¦|ex|Ø3x”!÷P<Ÿ8„ Ì;atcÛxHu<ŸcÛx8„ ÔH…|~yA‚Œ<Ÿ8¡88Á<8á@8„ ð9D9!HH/ƒ@ž”ÃóxH€á<@|CÖ|ü;x|AÖ|8Q@ |@P‡€Á8!D<Ÿ¥ëxAHÃx8„!@H©/ƒAœd€H/€@˜<Ÿ%ËxcÛx8„!HÁ<ŸcÛx8„!HÑ|}yA‚Ø€H/€@XHP`CÓx8€8 ¦ëxHÁ/ƒ@žØ€¡L€ÁP<ŸÃx8„!XH!/ƒAœÜ€H;ÞžAœÿ¸£ëxH¡€D/€@¤<Ÿ%ËxcÛx8„! H!<ŸcÛx8„!H1|}yA‚8€D/€@dH¼`CÓx8€8 ¦ëxH!/ƒ@ž8€¡T€ÁX<ŸÃx8„!dH/ƒAœ<€D;Þ€ATž€X‚Aœÿ¬£ëxHõ/œ8`@X<Ÿ%ËxcÛx8„!8Hu<ŸcÛx8„!H…|}yA‚Œ;À;!\?_```#Ëx8€8 ¦ëxHq/ƒ@žˆ€¡\€Á`Ãx8š!p€ádh!lApHÅ/ƒAœ€;Þœð@žÿ°£ëxHI8`H°```/—Až|<Ÿ~ã»xeÛx8„ ØH¹8`ÿÿH€```/—AžL<Ÿ~ã»xeÛx8„!ˆH‰8`ÿÿHP/—Až(<Ÿ~ã»x8 .8„!¨HÅ8`ÿÿH,``8`ÿÿH;À;ALKÿý°;À;ATKÿþD8!°€ºáÿÜ|¦N€ ```|¦¾ÿÐ|xxBŸ|–#x|º+xè¦<ÿÿ8€ÿÃx`oP|!n;¡t£ëxHÕ/ƒAž,;!t<Ÿ£ëx8Á88„8%Ëx8á<9@9!D9AHH!/ƒ@žø:¡t<Ÿ~ųx&Ëx8„P~£«xH}<Ÿ~£«x8„\H||yA‚ €¡8€Á<<Ÿ€á@D!H8„`H/ƒAœôƒãxH•ƒa<€A@|Ö|Ö|ØQ@ |P{€H/€@¼<Ÿ~ųx&Ëx~£«x8„p>ŸHí~£«x8”|H|wyA‚€H/€@tH°`£ëx8€ÿÃxHµ/ƒAž ;T<Ÿ£ëx8ÁX8„€…ãxH/ƒ@žèƒãx8€8 ~æ»xHU/ƒ@ž$€H;ÞžAœÿœ~ã»xHµH>Ÿ€D/€@¼<Ÿ~ųx&Ëx~£«x8„ˆH)~£«x8”|H=|wyA‚P€D/€@|Hô£ëx8€ÿÃxHõ/ƒAžL;L<Ÿ£ëx8ÁP8„˜…ãxHQ/ƒ@ž(ƒãx8€8 ~æ»xH•/ƒ@žd€D;Þ€ALž€PbAœÿ~ã»xHé<Ÿ&Ëx~ųx~£«x8„ Hq8”|~£«xH…|yyA‚˜/›@€;€>ÿ;Á\`£ëx8€ÿÃxH5/ƒAžŒ£ëx8—¬Åóx8Á`8ád9h9!l9ApH‰/ƒ@ž`Ãóx8€8 &ËxHÍ/ƒ@žœ;œ›à@žÿ˜#ËxH18`HÈ/šAž <ŸCÓx~¥«x8„8H­8`ÿÿH¤/šAž|=?8`ÿÿ8IÀ)À€bB ‘:‘z‘Z €"bB‘:‘z‘ZHL/šAž$<ŸCÓx~¥«x8„àH18`ÿÿH(`8`ÿÿH;ÀKÿýT;ÀKÿþ ``€!€ºÿÐ|¦N€ ```,|hxA€˜T 88`|@:|§.B5jÿÿ|À2@@| | p})”I|B2€ˆ@œ}+KxH``8iƒXAœÿȃP@œ0|F.|Æ„@€ˆ@œ/ƒ|c*Lœ 8`ÿÿN€ ``|¦¾!ÿÄ|Ú3yBŸ|wx|•#xè¦|±+x|ò;x”!û€}Cx}8Kxƒa¸‚¼ƒÀ‚aÄ@€\5hÿÿ;À@ô```| ò| p})”U"8|B’€•@œ}+KxH``;ÉžXAœÿÈH¨€›š Aœ€»|*šAœlH€»|+Ö|½+x‚Ûƒ À)Ö|EòŠ@œ¾PPÄþpWÀ~8ÀWÅ8T„8Ãx|#xH í8€~óx¥ëxÃxH Y“ÛÄóx|ÐP€ÛT82XœPAœ;Àÿÿ;@:ÀHt*ãÖD0.~ÚãÖ|áÖŠAž;95yÿÿVÀ8;À|à’@@| ò| p})”U"8|B:€•@œ}+KxH``;ÉžXAœÿÈ}TSxƒ·/@ž¸/œA½P<Ÿ<¿<ÿˆãx8„`8¥˜8ç,8À78a8H 9<_88€BŠ€bH Å8`ÿþHÔ``ƒãx8€H ©/ƒ|}xw@¾H<Ÿ<¿<ÿˆãx8„°8¥˜8ç,8À78a8H Ñ<_88€BŠ€bH ]8`ÿþHl/žAœ¨~²‚þpƒãxÚ¢|áÖ| x| þp}Š}iÂþp‹A@ž$Œð@@```|ãÖ|áÖ€ðP8` 8À|Š|ªÖ~c›x|€"H ù£ëx~f›x8€…ãxH e|ʈãx“—“× “wH8~c›x¥ëxÃxKÿêi€8@W8@W|x``5hÿÿW8`@@| | p})”I|BR€•@œ}+KxH``8iƒXAœÿȈ@0|J.}*‘@€ •Aœ```8`ÿÿw8!€€º!ÿÄ|¦N€ `|¦½¡ÿ´}Cx|@&BŸ.|´+xè¦|Ö3x|ï;x}0Kx|ux|#xA”!÷`@‘@|Å3x|æ;x}CxKÿë‘/ƒÿþ@ž(?¿<Ÿ~e›x;½†œ8„0£ëxH½£ëxH¤:A@=ß<Ÿ~ƒx~C“x;®˜8„œH•~C“x¤ëxH©|qyA‚ø<Ÿ~ƒx~C“x8„´Hm¤ëx~C“xH|xyA‚Ð~£«x8€~…£xÃxH%|³Ö|±Ö  QA‚4½°Q@,;€`;œ~£«x8€8 ÃxHíà@žÿä]¢@‘ì}ü{x:à€8a88€8 ~&‹x“A8. /ˆU8}~.AÿÐ4€@48Âóx9 | ¦```€‘"8B})Bÿð@‘T8ÿÿ9,Šãx| ¦``h€J‹@ TB8Uk8|Bò|X."|J|Y.99JBÿÌ<߃ãxdÛx8 8Æà,Hu8@ˆi¦ˆãx8 8à8`8€ÿÿ``h8ȇXAœTà8}^€JH0U`89+ÿÿ}g[x|^.}^B|Bâ‘"|¾.|bxj8B8¥9J†Bÿ 8½ÿÿÃóx8žT¥8H H8`€ * }kЀJ‘j|Ð})Ð|BÐ ‘*J Kÿû°8!`Ãóxa€»Aÿè|¦}q }p N€ ```|¦¾áÿÜ|ž#yBŸ|}x|¸+xè¦|×3x€&”!û@(ɦ|jx``j/‹Aœ89JBÿð<ߣëxÄóx8 8ÆÛHÿù˜ @ 8@;@9bX@™Œ/‚AœxË|Ix`` |ý2€G}]B€ ‚A@ž$|@.|]0.‚@ž*H$``‘'}i[x9k;ZX8Æ@™/‰@œÿ }b[xKÿÿt`/š@üCÓx8€Hÿ¡||y@‚H<Ÿ<¿<ÿHÓx8„  8¥ ˆ8ç h8Àÿ8a8; HþÍ<_88€B}€bHþYHDɦ«ëx8à;`8Àÿÿ9@``€ 9 /€Aœ4|\R |êá.9J|]J€/€@œ“b;{`È8ç9kBÿ´<߃ãxDÓx8 8ÆÛ`Hþm/›AP<Ÿ<¿<ÿhÛx8„ P8¥ ˆ8ç œ8À8a8; Hýù<_88€B}€bHý…ƒãxHýýHhcÛx8€Hþm|yy@‚D<Ÿ<¿<ÿhÛx8„  8¥ ˆ8ç œ8a88ÀHý<_88€B}€bHý)Kÿÿ¤I¦ˆãx8 8€ÿÿ€(T(4T8)|ÀP|ý2|0.})ê€GgG H‘h‘H €€GH€ T8}9€I/‚@ž|¹.88¥9 ‡|1.Bÿ|ɦªëx8à;À8À` /ˆÿÿ@ž€ /€ÿÿAžT``‡ð@<€ *|]2j }1.‘"‘b € *‘"``;Þ8Æ8ç9JBÿ~º„ãx|}Hû­i¦"Ëx€|8BBÿðƒãxHüI“ØHl```“Ø8`8€Hü¥|yy@‚D<Ÿ<¿<ÿ8a88„  8¥ ˆ8ç œ8À)9HûÕ<_88€B}€bHûaHL;`“wH@```€ * }kЀJ‘j|Ð})Ð|BÐ ‘*J Kÿû 8!p#Ëx€ºáÿÜ|¦N€ ``|¦¾ÿÐ|œ#x|@&BŸ.|º+xè¦|Û3x|þ;x}Cx}XSxA”!û‚¨@’@8`8€ Hû¥|}y@¢0<Ÿ<¿<ÿ8À¦8„Ì8¥´8çP98a8H<|}x/œ:à@œ\HH<Ÿ<¿<ÿ8À¾8„Ì8¥´8çœ98a8Hú™<_88€Bx,€bHú%8`ÿÿH|Ð:àÿÿ\Ð|x€/€@žx5~ÿÿ“Ý9@@8| R| p})”I|BÚ€œ@œ }+KxH9I‹PAÿЊð@œ$ |[.};š@€ œAœ9@ÿÿ‘]; HH*j ;9|X}.â‘"‘b € j‘b=I9)|BÚ€‘=/€AœäT88àÕ|Õ.5hÿÿ}[@H``| :| p})”I|BR€œ@œ}+KxH``8é‹8Aÿȇ@@œt|J.}*š@`€ œ@œT/‡AœL~Ç2A€D€}/ƒ@ž 8`8€ Hùy,A‚þ}“£’Ã|}x€^€|™ @œÈ ëx|x€]/‚Aœ4€‚@œ(}.}@Úš@@€êœ8Aœþˆ`ƒÝ/žÀóx@žÿ´@’lƒ/œAž4€|ƒÜ/ƒAžHøQƒãxHøI/žAž ÜóxKÿÿ؃Ý€}/ƒAžHø%£ëxHø/žAžÝóxƒÞKÿÿØ; /™@h)¦ Ãxj8/‹@œ8ÿÿ```—Až0€ * }kЀJ‘j|Ð})Ð|BÐ ‘*J 9JBÿ¨€A¬8`“"!°“©8!p€aºÿÐ|¦}p N€ `|¦½¡ÿ´|™#x|@&BŸ.|¸+xè¦|Ó3x|ò;x}Cx}0Kx}OSxA”!û```ÁØ‚áÜ‚Áà‚è@’H8`8€ H÷}|{y@¢8<Ÿ<¿<ÿ8ÀX8„¼8¥¤8ç@98aHHÄ``|{x/™9 @œ|Ð9 ÿÿÐ|x€/€Až€[;;@: H$cÛx$Ëx‘á8‘Á<’á@’ÁDÃx8Àÿÿ~g›x~H“x~)‹x~ ƒxKÿé/ƒÿþ@žÿ´H\€ €I ;Z‘‘^^ € €I^;ƒ»€I/9i|Bƒ‚‘{@ž 8`8€ Höe|}yA‚°“}“»/œAœL†ãx£ëx‘á8‘Á<’á@’ÁD$ËxÃx~g›x~H“x~)‹x~ ƒxKÿèI|uyA€»ëxH`/•ÿþAž”``š ;Þ@œ¸{/‹Aœ8€‹@œ0+€[} .})˜@@I™PAœþìH€€[‹8B[@ž¬;‚H@œ¤|¹Ö€» ~âþpƒ»~ã»x| x| þp}Š}i|¢þp‹A@ž Œ(@A ~þ»xH|»Ö|¹ÖÀ(P8` 8À|Š|ªÖ~óx|€"Hô5£ëx8€Åóx~ƳxHó¡€[;8“ÛH;‚H@œ€AäÂKÿþè``ƒÛ/žAž€^>ÛóxKÿÿÈ@’lƒ»/Až4€}ƒÝ/ƒAžHô£ëxHóý/žAž ÝóxKÿÿ؃Û€{/ƒAžHóÙcÛxHóÑ/žAžÛóxƒÞKÿÿØ;``/š@hI¦Aäj8/‹@œ8ÿÿ```Až0€ * }kЀJ‘j|Ð})Ð|BÐ ‘*J 9JBÿ¨€Aì8`“B€Að“bHP<Ÿ<¿<ÿ8Às8„¼8¥¤8çŒ98aHHòé<_8H€Bt€bHòu8`ÿÿH 8`ÿÿ`8! €a¹¡ÿ´|¦}p N€ |¦¿Áÿø|~x”!ÿ°``€C8B/‚C@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ `|¦¿¡ÿô|~xBŸ|ƒ#x|¤+x覔!ÿ°<ß<¿8Æz\8¥ü¤Hö-8@/ƒAž€~€^/ƒ8B^AžHò€~/ƒAžHñõ8<_ƒ¢o4€]8B]>9)ÿÿ/‰‘>Až¢ëxH(`€^Ãóx€| ¦| xN€!¢ëx`8!P|Cx€»¡ÿô|¦N€ ``|¦8@”!ÿ°C`€/€@ž€C€| ¦| xN€!8!P8`€|¦N€ `|¦¿ÿà|~x|›#x|¼+x|Ú3x|ù;x”!ÿ }Cx`C€(€CŠ8BCAœ,€C8€€ | ¦| xN€!^```>j;ªiY.€^|K“‚>}+J“I€^|K“" €}k“ “¾€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!`£ëx€»ÿà|¦N€ ``|¦¿¡ÿô|~x; ”!ÿ°`€ƒ€C/„8BCAž@€(„@œ$„€cHôY€^H```€c8|}x8ÿÿ/€@ž€^Ãóx€| ¦| xN€!8!P£ëx€»¡ÿô|¦N€ |¦¿Áÿø|~x”!ÿ°``€C8B/‚C@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ `|¦¿¡ÿô|~xBŸ|ƒ#x|¤+x覔!ÿ°<ß<¿8Æw8¥ùTHòÝ8@/ƒAž€€~€^/ƒ8B^AžKÿØU8<_ƒ¢kä€]8B]>9)ÿÿ/‰‘>Až¢ëxH,``€^Ãóx€| ¦| xN€!¢ëx`8!P|Cx€»¡ÿô|¦N€ ``|¦¿Áÿø”!ÿ°``€ƒÃ /€@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ ```|¦¿Áÿø|~x”!ÿ°``€C8B/‚C@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ `|¦¿Áÿø”!ÿ°``€ƒÃ/€@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ ```|¦¿Áÿø”!ÿ°``C€€CŠ9‘@h€C  }@PPc}I¦€(})€ €XA8€ ‹@œ,€ € @ž € €(@ž;ÀH``9)Bÿ¼;À8ÿÿ/€@ž€C€| ¦| xN€!8!PÃóx€»Áÿø|¦N€ ``|¦¿Aÿè|›#y||x|º+x”!ÿ ``€C8BC@0|¾+x; `€~;½;ÞHëå›è@žÿì``CÓxHëÍ€\8Bÿÿ/‚\@ž8€\8!`ƒãx»Aÿè€| ¦| x€|¦N€ ```8!`€»Aÿè|¦N€ ```|¦¿Áÿø|~x”!ÿ 8a88<8¡@Hî€~€^/ƒ8B^AžHë%€~/ƒAžHë€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`Hì/ƒAž ÃóxHó±€^€a8€<€¡@8Bÿÿ^Hïµ€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ `|¦¿Áÿø|~x”!ÿ 8<8a88¡@Hí!€^€~8B^KÿÈÝ€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```Hë1/ƒAž ÃóxHòá€^€a8€<€¡@8Bÿÿ^Hîå>`$/‰Až0€I8Bÿÿ/‚I@ž€~`$€C€| ¦| xN€!€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ ```|¦|Œ#x|¤+x”!ÿ°``€c`$/ƒAž}‰¦N€!,@‚8`8!P€|¦N€ `|¦“áÿüBŸè¦”!ÿ°=?)eøc`$‘#`$/‹€I8BIAž0€K8Bÿÿ/‚K@ž€K}c[x€| ¦| xN€!8!P8`€ƒáÿü|¦N€ |¦¿Áÿø|~x”!ÿ 8a88<8¡@HëA€~€^/ƒ8B^Až KÿÒ€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`HéQ/ƒAž ÃóxHñ€^€a8€<€¡@8Bÿÿ^Hí€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ `|¦“áÿü8€BŸè¦”!ÿ°€˜| ¦| xN€!|kyA‚ <_=?)d¤€BpH‘+ K€I8BI‘+$``€I8BI‘+(€I8BI‘+,€I8BI‘+0€I8BI‘+8€I8BI‘+<€I8BI‘+@€I8BI8!P€ƒáÿü|¦N€ ```|¦¿Áÿø|~x”!ÿ 8a88<8¡@Hé€~4€^/ƒ8B^Až Hæå€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`Hç‘/ƒAž ÃóxHïA€^€a8€<€¡@8Bÿÿ^HëE> /‰Až8€I8Bÿÿ/‚I@ž$€~ €C€| ¦| xN€!``>$/‰Až8€I8Bÿÿ/‚I@ž$€~$€C€| ¦| xN€!``>(/‰Až8€I8Bÿÿ/‚I@ž$€~(€C€| ¦| xN€!``>,/‰Až8€I8Bÿÿ/‚I@ž$€~,€C€| ¦| xN€!``>0/‰Až8€I8Bÿÿ/‚I@ž$€~0€C€| ¦| xN€!``>8/‰Až8€I8Bÿÿ/‚I@ž$€~8€C€| ¦| xN€!``>@/‰Až0€I8Bÿÿ/‚I@ž€~@€C€| ¦| xN€!€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ ```|¦¿ÿð|}x|ž#x|¼+x”!ÿ°€c /ƒAžÉ¦|¤+xÌóxN€!,@‚€}$/ƒAžÉ¦„ãxÌóxN€!,@‚à€}(/ƒAžÉ¦„ãxÌóxN€!,@‚¼€},/ƒAžÉ¦„ãxÌóxN€!,@‚˜€}0/ƒAžÉ¦„ãxÌóxN€!,@‚t€}8/ƒAžÉ¦„ãxÌóxN€!,@‚P€},/‰Až8€I8Bÿÿ/‚I@ž$€~,€C€| ¦| xN€!``>0/‰Až0€I8Bÿÿ/‚I@ž€~0€C€| ¦| xN€!€^Ãóx€ | ¦| xN€!8!`€»Áÿø|¦N€ ```|¦¿ÿð|}x|ž#x|¼+x”!ÿ°€c,/ƒAžÉ¦|¤+xÌóxN€!,@‚,€}0/ƒAžÉ¦„ãxÌóxN€!,@‚8`8!P€»ÿð|¦N€ `|¦¿¡ÿô|~xBŸè¦”!ÿ°?¿€]Zd€c,^,/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]ZdH€]Zd€~0^0/ƒ"9)‘"Až,€C8Bÿÿ/‚C@ž€C€| ¦| xN€!8!P8`€»¡ÿô|¦N€ |¦“áÿü8€BŸè¦”!ÿ°€˜| ¦| xN€!|kyA‚à<_=?)Y”€Be@‘+ K€I8BI‘+``€I8BI‘+€I8BI‘+€I8BI‘+€I8BI‘+$€I8BI‘+(€I8BI‘+D€I8BI‘+H€I8BI‘+L€I8BI‘+P€I8BI‘+T€I8BI8!P€ƒáÿü|¦N€ ```|¦¿Áÿø|~x”!ÿ°``# /‰Až<€I8Bÿÿ/‚I@ž(€c €C€| ¦| xN€!```>/‰Až8€I8Bÿÿ/‚I@ž$€~€C€| ¦| xN€!``>/‰Až8€I8Bÿÿ/‚I@ž$€~€C€| ¦| xN€!``>/‰Až8€I8Bÿÿ/‚I@ž$€~€C€| ¦| xN€!``>/‰Až8€I8Bÿÿ/‚I@ž$€~€C€| ¦| xN€!``>$/‰Až8€I8Bÿÿ/‚I@ž$€~$€C€| ¦| xN€!``>(/‰Až8€I8Bÿÿ/‚I@ž$€~(€C€| ¦| xN€!``>D/‰Až8€I8Bÿÿ/‚I@ž$€~D€C€| ¦| xN€!``>H/‰Až8€I8Bÿÿ/‚I@ž$€~H€C€| ¦| xN€!``>L/‰Až8€I8Bÿÿ/‚I@ž$€~L€C€| ¦| xN€!``>P/‰Až8€I8Bÿÿ/‚I@ž$€~P€C€| ¦| xN€!``>T/‰Až0€I8Bÿÿ/‚I@ž€~T€C€| ¦| xN€!€^8!PÃóx»Áÿø€ | ¦| x€|¦N€ |¦¿ÿð|}x|ž#x|¼+x”!ÿ°€c /ƒAžÉ¦|¤+xÌóxN€!,@‚”€}/ƒAžÉ¦„ãxÌóxN€!,@‚p€}/ƒAžÉ¦„ãxÌóxN€!,@‚L€}/ƒAžÉ¦„ãxÌóxN€!,@‚(€}/ƒAžÉ¦„ãxÌóxN€!,@‚€}$/ƒAžÉ¦„ãxÌóxN€!,@‚à€}(/ƒAžÉ¦„ãxÌóxN€!,@‚¼€}D/ƒAžÉ¦„ãxÌóxN€!,@‚˜€}H/ƒAžÉ¦„ãxÌóxN€!,@‚t€}L/ƒAžÉ¦„ãxÌóxN€!,@‚P€}P/ƒAžÉ¦„ãxÌóxN€!,@‚,€}T/ƒAžÉ¦„ãxÌóxN€!,@‚8`8!P€»ÿð|¦N€ ```|¦¿¡ÿô|~xBŸè¦”!ÿ°?¿€]S4€c ^ /ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~^/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~^/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~^/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~^/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~$^$/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~(^(/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~D^D/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~H^H/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~L^L/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~P^P/ƒ"9)‘"Až8€C8Bÿÿ/‚C@ž €C€| ¦| xN€!€]S4H€]S4€~T^T/ƒ"9)‘"Až,€C8Bÿÿ/‚C@ž€C€| ¦| xN€!8!P8`€»¡ÿô|¦N€ |¦¿ÿð|}x|ƒ#x;€”!ÿ°H×µ|~yA‚T=£ëxÄóx€I8€| ¦| xN€!€^||x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!Pƒãx€»ÿð|¦N€ |¦¿Áÿø|~x”!ÿ 8a88<8¡@HÔ€~(€^/ƒ8B^AžHÑ¥8(€~,/ƒAžHÑ8,€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`HÒq/ƒAž ÃóxHÚ!€^€a8€<€¡@8Bÿÿ^HÖ%>0/‰Až8€I8Bÿÿ/‚I@ž$€~0€C€| ¦| xN€!``>4/‰Až8€I8Bÿÿ/‚I@ž$€~4€C€| ¦| xN€!``>8/‰Až8€I8Bÿÿ/‚I@ž$€~8€C€| ¦| xN€!``>Kx8BI``<_<€BE‰Až˜€DàžAž4<_<Ÿ-ž.€BE8„Ü €bHÆ5Kÿÿ€```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!<<_€BDð‰@žT<žãx€I}4/‰Až8€I8Bÿÿ/‚I@ž$€~4€C€| ¦| xN€!``>8/‰Až8€I8Bÿÿ/‚I@ž$€~8€C€| ¦| xN€!``>ß8`“Á8“Á<“¡@“D€E$“aL8€8 8ÀgÛxÈóxÉóxÊóxHHÀa|yy&A‚xH¿ÑEÓx$Ëx8ÀHÃa|zy~à&A‚Œ€E$@HÁ‰H|€]£ëx€| ¦| xN€!``AŠ0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!A’0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€! A‚<€Y8Bÿÿ/‚Y@ž(€Y#Ëx€| ¦| xN€!```~ø A‚œ€Z8Bÿÿ/‚Z@žˆ€Z8!CÓxaºÁÿØ€}r }q | ¦| x€}p |¦N€ ~à&;@H,;À;`; ;@.M~à&V÷€&W€€]8Bÿÿ/‚]@žþ˜Kÿþt8!a€ºÁÿØ|¦}r }q }p N€ ```|¦¿ÿð|}xBŸ|ƒ#x|¤+xè¦8”!ÿ <_<ß<¿€BEì8Æ2L8¥Î 8á89<8AKx8BIHL€\ƒãx€| ¦| xN€!H €^Ãóx€| ¦| xN€!`<;À8cΤKÿú%€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!8!`Ãóx€»ÿð|¦N€ ``|¦¿aÿì|}xBŸ|ƒ#x|¤+xè¦;À”!ÿ <ß<¿8Æ>48¥ÀtH¹ù/ƒAž0=<_€b39)‘=€C8BC€/€Až$<_||xƒÂ3`€^8B^Hˆ`?ß~A`€K8BK#9)ÿÿ/‰‘#@ž€C€| ¦| xN€!`8`ƒžA`H·™|~yA‚à€\Äóx8B\“ž <_€B3,€bHºÍ|{y@‚D<_8‰=?€B> b<_>˜‘i>œ€^8Bÿÿ/‚^@žÀH ``€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!cÛx8€8 Kÿ와[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!``<_8‰=?€B> b<_>˜‘i>œH €^Ãóx€| ¦| xN€!`<;À8cË`Kÿ÷e€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`8!`Ãóx€»aÿì|¦N€ ``|¦½áÿ¼|xx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ŸP<ß<¿8Æ,T8¥¾Ì8áH9LH·Y/ƒAž €X?<ŸÃxƒ»0p8BX€]€„<È8B]H´Á||y@‚<_8w=?€B< b<_<‘i<ƒ{0pH°~ &V1@<_;Ëx: ~€&V”@€B< }à&Uï@"H<_~£x~‘£x;Ëx€B< "<_8€:@:‘"<<_<Hä<_8€=?~/‹x€B< ;Ëx:b<_<‘i<H´<_8€;Ëx€B< "<_<<_‘"<HŒ~€&<_;Ëx:À: }à&€B< M~ &"Kÿÿ`8€H·|~y@‚tM<_8w~ &€B< »ëx;@:À: M€:@:~€&"<_}à&<<_‘"<€\8Bÿÿ/‚\@žäHÈ```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`Kÿ!|sy@‚(<_8x=?€B< b<_<‘i<Kÿþ8`’aTH³é|yy@‚(<_8z=?€B< b<_<‘i<KÿýÈ€]8Bÿÿ/‚]@ž(€]£ëx€| ¦| xN€!```€aT/ƒAž€Ø€ø 88AP89AX€H€¡L88TA<@Kÿ´Ñ/ƒÿÿ@¾h<_8|=?€B< b<_<‘i<;ËxHÐ<_8€=?€B< b<_<‘i<KÿÿØ``€—<¨#ËxH±y-ƒ|zxA®ÿÀ€~ÿðHµ%||y@¢\N<_8€; €B< "<_<<_‘"<:;Ëx:@: ,:À~€&}à&M~ &HÐ`€~ÿôH´½-|vxAªüd€~ÿøH´©|uy~€&A¢ü€€~ÿüH´•|ry~ &A¢ü¤€~H´|py}à&A¢üÀ8`H±M.|}xA²ü¬“ƒ ’Ã’£’C’8`H±%||y@¢,<_8€=?€B< b<_<‘i<Kÿÿ(`“¼ CÓx„ãxH´E|}yA¢üp€Z8Bÿÿ/‚Z@ž(€ZCÓx€| ¦| xN€!```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€P;{;Þ›AœþKÿýl~c›x>Ëx;ËxKÿŒm€Y8BYHœ€\ƒãx€| ¦| xN€!@Ž; .HD; .€Z8Bÿÿ/‚Z@ž(€ZCÓx€| ¦| xN€!```AŠ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!~˜ A‚<€U8Bÿÿ/‚U@ž(€U~£«x€| ¦| xN€!```~8 A‚<€R8Bÿÿ/‚R@ž(€R~C“x€| ¦| xN€!```}ø A‚<€P8Bÿÿ/‚P@ž(€P~ƒx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8cÈüKÿïu€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€X8Bÿÿ/‚X@ž@€XÃx€| ¦| xN€!H$€P/€@ûH;`;Áh>ÿKÿûØ`8!`°Ãóxa€¹áÿ¼|¦}r }q }p N€ ``|¦¿aÿì|{x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ<ß<¿8Æ$@8¥¶¬8á89Kx8BIHd€]£ëx€| ¦| xN€!Ø A‚4€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`<;À8c¾Kÿä¥!@/‰Až8€I8Bÿÿ/‚I@ž$€a@€C€| ¦| xN€!``€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!!Œ/‰Až8€I8Bÿÿ/‚I@ž$€aŒ€C€| ¦| xN€!``!/‰Až<€I8Bÿÿ/‚I@ž(€a€C€| ¦| xN€!H `;À8!pÃóx€»Aÿè|¦N€ `|¦¿¡ÿô|~xBŸ|ƒ#x|¤+xè¦; ”!ÿ <_<ß<¿€B,h8Æü8¥¶48á8A8H£Ù/ƒAž€€^a88B^+9)‘+€a8H¡Í/ƒ@œT<_8V=?€B(b<_(ˆ‘i(Œ<; 8c¶8Kÿâµ€^8Bÿÿ/‚^@žàH¼``AžP€~€ž8¾ 8ÞKÿš-,@‚t<_8W=?€B(b<_(ˆ‘i(ŒKÿÿ```€~€ž8¾ 8ÞKÿž±,@‚(<_8Y=?€B(b<_(ˆ‘i(ŒKÿÿD~=?)ô}=Kx€I8BIKÿÿ4€^Ãóx€| ¦| xN€!``€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!`£ëx€»¡ÿô|¦N€ ``|¦¿Aÿè|œ#x|@&BŸ8€|½+xè¦A”!ÿ€€˜| ¦| xN€!|{yA‚ð<_=_“<“¡8=J*l;Â88aÐ WÞ€><_86; €B&œ"<_&”<_‘"&˜€\8Bÿÿ/‚\@žtHX```€L8@/€A8@AL€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€L/€Ažh€a@H¢ý/ƒ@ž<_¼ëx87€B&œ"Kÿÿ <Ÿ8„ñ0Hš0Cÿÿ||~x/€LAžh€{ÄóxKÿt},@‚<_¼ëx89€B&œ"Kÿþ¼{ÃóxH›€1 ÿÿ|I/‚ALAžÌ<ŸcÛx€„(ÀHœ9||y@‚<_¼ëx8<€B&œ"Kÿþh8`Hœ±.|}xA’€¡Hƒãx¤ëxHžõ|~y@‚,<_8<=?€B&œb<_&”‘i&˜Kÿþt`€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@žÜ€^Ãóx;À€| ¦| xN€!ƒšHÄ<€@€c)LH %||y@‚<_¼ëx8>€B&œ"KÿýT€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8`H›q|}yA‚¼€\¤ëx8B\“ <_€BP€bHž¥|~y@‚(<_8?=?€B&œb<_&”‘i&˜H¸€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!Ãóx8€8 KÿЀ^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<_8?=?€B&œb<_&”‘i&˜H\€\ƒãx€| ¦| xN€!@’ ƒšH8ƒš€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<;Àÿÿ8c´|KÿÛ%Hƒš;À`!H/‰Až8€I8Bÿÿ/‚I@ž$€aH€C€| ¦| xN€!``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€AD"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!! €bH”9||y@‚@<_8™=?€B b<_˜‘iœ€^8Bÿÿ/‚^@žÐH´`€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!ƒãx8€8 KÿÆ €\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<_8™=?€B b<_˜‘iœH<`=?) €I}>Kx8BIH8€^Ãóx€| ¦| xN€!<;À8c¦\KÿÐÁ```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`8!PÃóx€»ÿð|¦N€ ``|¦½áÿ¼|xx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!Ÿ@<ß<¿8Æ8¥˜L8áX9\HÙ/ƒAžà€X?<ŸÃxƒ» ð8BX€]€„H8B]HŽA||y@‚8<_8†=?€BŒb<_„‘iˆƒ{ ðHð~ &V1@<_;Ëx: ~€&V”@€BŒ}à&Uï@"H<_~£x~‘£x;Ëx€BŒ"<_8’:@:‘"ˆ<_„H<_8“=?~/‹x€BŒ;Ëx:b<_„‘iˆHÔ<_;Ëx8“€BŒ"H<_;Ëx8’€BŒ"<_„<_‘"ˆH”~€&<_;Ëx:À: }à&€BŒM~ &"KÿÿH``8€Hý|~y@‚tM<_8†~ &€BŒ»ëx;@:À: M€:@:~€&"<_}à&„<_‘"ˆ€\8Bÿÿ/‚\@žHè```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`Kÿh|sy@‚(<_8‡=?€BŒb<_„‘iˆKÿýà8`’adHI|yy@‚(<_8‰=?€BŒb<_„‘iˆKÿý¨€]8Bÿÿ/‚]@ž(€]£ëx€| ¦| xN€!```€ad/ƒAž°€X€X€¡\€€Â9B€â"8€ <8hb,D8`8@L8dAH‘a@PKÿ’/ƒÿÿ@¾d<_8‹=?€BŒb<_„‘iˆ;ËxHÌ<_8’=?€BŒb<_„‘iˆKÿÿØ`€—(#ËxHй-ƒ|zxA®ÿÄ€~ÿðHŽe||y@¢\N<_8’; €BŒ"<_„<_‘"ˆ:;Ëx:@: ,:À~€&}à&M~ &HÐ`€~ÿôHý-|vxAªü$€~ÿøHé|uy~€&A¢ü@€~ÿüHÕ|ry~ &A¢üd€~HÁ|py}à&A¢ü€8`HŠ.|}xA²ü„“ƒ ’Ã’£’C’8`HŠe||y@¢,<_8’=?€BŒb<_„‘iˆKÿÿ(`“¼ CÓx„ãxH…|}yA¢üH€Z8Bÿÿ/‚Z@ž(€ZCÓx€| ¦| xN€!```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€`;{;Þ›AœþKÿýL~c›x>Ëx;ËxKÿe­€Y8BYHœ€\ƒãx€| ¦| xN€!@Ž; .HD; .€Z8Bÿÿ/‚Z@ž(€ZCÓx€| ¦| xN€!```AŠ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!~˜ A‚<€U8Bÿÿ/‚U@ž(€U~£«x€| ¦| xN€!```~8 A‚<€R8Bÿÿ/‚R@ž(€R~C“x€| ¦| xN€!```}ø A‚<€P8Bÿÿ/‚P@ž(€P~ƒx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8c¤xKÿȵ€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€X8Bÿÿ/‚X@ž@€XÃx€| ¦| xN€!H$€`/€@û(;`;Áx>ÿKÿûØ`8!`ÀÃóxa€¹áÿ¼|¦}r }q }p N€ ``|¦¿aÿì|{x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ<ß<¿8ÆýÈ8¥ì8á89a89)‘>€K8BK€a8HˆÑ/ƒ@žX<_<8z=?€B ð8c™D; b<_ è‘i ìKÿÄ€^8Bÿÿ/‚^@ždHD```8<8 Kÿf9,A‚ÿœ~=?)þT}=Kx€I8BIKÿÿ¬€^Ãóx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!`£ëx€»¡ÿô|¦N€ ``|¦¿aÿì|œ#x|@&BŸ8€|½+xè¦A”!ÿ€˜| ¦| xN€!|~yA‚€=?<_<¿<ß) l€B pƒãx¤ëx8¥–X8Æù,8á89<‘!8Aÿ=Œ€Bøì?i€b„‘wˆH}u/ƒ@žl•ãx!8/‰@žüH$`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z€a8•ãx^Óx“¡88BZH„<8c”ßH8>ß}#Kx€–Hzí,aƒ9)‘>@žƒ¾H````HxÑ/ƒÿÿAž>|}xH<<_<=?8’€Bú8cŠ; ÿÿb<_ú‘iú Kÿ´M>`8 ÿÿ/€@ž€^Ãóx€| ¦| xN€!8!P£ëx€»¡ÿô|¦N€ |@&|¦¿ÿà8À|{x8àBŸ9 8è¦A”!ÿ<_;ÂøÀŒ¡8aŒ8D8<@Åóx98Kÿ«M/ƒAœ´€aŒ€<¿Æóx8¥zøHt=/ƒ@ž´!Œ/‰Až8€I8Bÿÿ/‚I@ž$€aŒ€C€| ¦| xN€!``!/‰Až8€I8Bÿÿ/‚I@ž$€a€C€| ¦| xN€!``!8/‰Až€I8Bÿÿ/‚I@žô€a8;ÀHÌ`€[?Ÿƒ¼íˆ8B[=9)‘=€{@HvÝ/ƒÿÿ@ž4?ß???_8Y>ù$€I!<ù/‰Yù @žØHHt/ƒa €bHm…|}y@‚TM€<_8INšãx; €BñÔ:À˜ãx"<_ñÌ<_‘"ñЀ^8Bÿÿ/‚^@ž H|€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!£ëx8€8 KÿŸA€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<_šãx˜ãx8I€BñÔ"H@`HgA“»4<Ÿ€{8€„ôÔHn |yy@‚4<_šãx˜ãx8L€BñÔ"<_ñÌ<_‘"ñÐH(`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`<8€€cñKx8BIH0€^Ãóx€| ¦| xN€!`<;À8cuÈKÿœå€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!`Ãóx€»Aÿè|¦N€ ``|¦¿ÿð|}xBŸ|ƒ#x|¤+xè¦;À”!ÿ°<ß<¿8Æáh8¥c”H]/ƒAžÀ€]8`8B]H[=|~y@‚4<_87=?€BáÀb<_ḑiá¼H@```=8=<Äóx€I8BI€8 +ã°€I8BIkã°‘~€cá4H^!||y@‚H<_87=?€BáÀb<_ḑiá¼€^8Bÿÿ/‚^@ž´H```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€],"9)ÿÿ/‰‘"@ž€},€C€| ¦| xN€!“,=?)Ö$}>Kx€I8BIH4€^Ãóx€| ¦| xN€!``<;À8cr€KÿšÅ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`8!PÃóx€»ÿð|¦N€ ``|¦¿¡ÿô|}xBŸ|ƒ#x|¤+xè¦;À”!ÿ°<ß<¿8ÆßL8¥atHZù/ƒAž`€€]/„8B]A88`H\1,@‚È<_8G=?€Bß b<_ߘ‘ißœHÌ<߀}8 €ÆÓüHV±€/€A9€8`H`| ¦9`ÿÿ8 9€8À8€``€ý|G2€‹@ž0^}'R€ /€@œŒ€ /€Aœ€```/‹AœTŒð@œD>}g"|GJ|H.B" |!.‘K‘+‘ €" ‘+€ý9Œ8„|G2|¾+xbH<``€B€ ‚@$I€]}"2|BR€ ``8¥8ÆBÿ8lž`@L=^L}i| .|IR €ë€Ë | Q.‘â € +‘"`}HZm,A‚ |~xH<<_8Z=?€Bß b<_ߘ‘ißœ<;À8cpŒKÿ˜ ``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`8!PÃóx€»¡ÿô|¦N€ ``|@&|¦¿ÿà8€|}xBŸè¦A”!ÿ €C#8BC€ | ¦| xN€!,A€ôÀ]|bð.HYu||y@‚,<_8d=?€BÜØb<_ÜБiÜÔHè`€]|^€bHY5.|{x@’XM<_8dM;@; À&WÞ€€BÜØ;"<_ÜÐ<_‘"ÜÔ€\8Bÿÿ/‚\@ž¨H€€]|^€bHXÅ-ƒ|zx@ŽHÀ&WÞ`<_8d; ;M €BÜØ"<_‘"ÜÔ<_ÜÐKÿÿ˜```€]|^€b HXe-|yx@Š8À&WÞ@<_8e;€BÜØ"<_ÜÐ<_‘"ÜÔKÿÿ@`€]|^€bHX|xyÀ&@‚(<_8e=?€BÜØb<_ÜБiÜÔKÿþü8`HT½,@‚(<_8d=?€BÜØb<_ÜБiÜÔKÿþÈ|~x“ƒ “c“C“#“HD<_8€8 €BÑ`€bKÿŠ <_8g=?€BÜØb<_ÜБiÜÔHø€\ƒãx€| ¦| xN€!```A’0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!AŽ0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!AŠ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!Ø A‚<€X8Bÿÿ/‚X@ž(€XÃx€| ¦| xN€!```<;À8cmøKÿ”5€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!`Ãóxa€»ÿà|¦}r }q }p N€ ```|@&|¦¿Aÿè|š#x|{xBŸè¦A”!ÿ €C8BC€D8BD<Ÿ€c€„Û HQå|~y@‚,<_8œ=?€BØøb<_Øð‘iØôHh`8`HRM.|}x@’@<_8œ=?€BØøb<_Øð‘iØô€^8Bÿÿ/‚^@žìHÌ`€ZÃóx¤ëx8BZ“] HUI||yA‚ÿ¤€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€[~Ûx8B[Hd€^Ãóx€| ¦| xN€!`A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8cjLKÿ‘å€[8ÿÿ/€@ž €[cÛx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!8!`Ãóx€a»Aÿè|¦}p N€ `|¦¿ÿð|}xBŸè¦”!ÿ°<_€BÊô#Tc‰8 Až(€I8BIƒÃT€CHp```€8/€Až8 |~x|xHD8`HOÝ|~yA‚Ü=?ÄóxiÚ €K8BK<_€BÊè)Ú ‘> €bHS||y@‚<<_8ö=?€BÖb<_Öˆ‘iÖŒ€^8Bÿÿ/‚^@ž¬H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!ƒãx8€8 Kÿ„Ù€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<_8ö=?€BÖb<_Öˆ‘iÖŒH€^Ãóx€| ¦| xN€!<;À8chKÿ±€]``8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!PÃóx€»ÿð|¦N€ |¦¿ÿà|zx|@&BŸ|ƒ#x|¤+xè¦8A”!ÿ<ß<¿8ÆÅH8¥cÜ8á88HOÙ;À/ƒAžÜ€Za8?<ŸƒØÈð8BZ€K8BK>€„ÖÜ€a89)‘>HM-|{y@‚4<_8 Ýóx€BÔŒ"<_Ô„<_‘"ÔˆHÌ``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`??CÓx€™ÕHLµ|~y@‚<_}Ûx8¡€BÔŒ"H48`HM-.|}x@’@<_8¡=?€BÔŒb<_Ô„‘iÔˆ€^8Bÿÿ/‚^@žŒHd`€[Ãóx¤ëx8B[“} HP)||yA‚ÿ¤€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`CÓxdÛxHQ‰|~y@‚4<_}Ûx8¢€BÔŒ"``<_Ô„<_‘"ÔˆH €™ÕHKI.|}x@’(<_8¢=?€BÔŒb<_Ô„‘iÔˆKÿþ¼€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8`HK….|~xA’0!8£ëxÄóx€I8BI€8 HNµ||y@‚(<_8¢=?€BÔŒb<_Ô„‘iÔˆHÔ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8Èð}Ûx€I}>Kx8BIHÈ€^Ãóx€| ¦| xN€!```A’€;À.€]8Bÿÿ/‚]@ž$€]£ëx€| ¦| xN€!``A’@€^8Bÿÿ/‚^@ž,€^Ãóx}Ûx€| ¦| xN€!H``}Ûx```<;À8cf(KÿŠÅ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!pÃóx€a»ÿà|¦}p N€ |¦¿aÿì||xBŸ|ƒ#x|¤+xè¦;`”!ÿ <ß<¿8ÆÎð8¥QHJ™/ƒAž <<_ƒ¢Ã¤9)‘<€]8B]€|4HKÉ|~y@‚@<_<8]=?€BÏ@8cab<_Ï8‘iÏ9)ÿÿ/‰‘>@ž€^Ãóx€| ¦| xN€!‚ÝÏHH?¿}ÐH€K8BK>9)ÿÿ/‰‘>@ž€^Ãóx€| ¦| xN€!‚ÝÐH8`H@i|~y@‚<_Ãx8S€BÍ´"HÌ€\8B\“ž €X8BX“!8€I8BI€8€V8BV’ÞHD.|wxA’8<Ÿ€¡<€„ÎìHAa/ƒAœ <Äóx~å»x€cÍ0HB%|}y@‚<_Ãx8S€BÍ´"H €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!€a<»ëxH>õ/ƒa@@œ<_Ãx8T€BÍ´"HtAžD€]8B]<€I8Bÿÿ/‚I@ž€|€C€| ¦| xN€!“|<Ÿƒãx€„ÎDH=ý|~y@‚,<_Ãx8V€BÍ´"<_ͬ<_‘"ͰH¼8`H>e.|wxA’@€]Ãóx~ä»x8B]“· !8€I8BI€8HA…|zy@‚,<_Ãx8V€BÍ´"<_ͬ<_‘"ͰHä€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€]Ãx8B]H¼``<_/ž8K€BÍ´"<_ͬ<_‘"ͰAžàƒZÂ:à¹ëx.VÓx`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`A’0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!<; 8c_˜Kÿ}¥€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž<€a<€C€| ¦| xN€!H ¹ëx‚ÚÂ~Ú³xKÿþ```8!€£ëx€aºÁÿØ|¦}p N€ |¦¿aÿì|{x|@&BŸ|ƒ#x|¤+xè¦8A”!ÿ<ß<¿8Ʋ 8¥PŒ8á88H<‰;À/ƒAž<;a8<ŸcÛx9)‘;€K8BK€„Á¸H9ñ|~y@‚(<_8=?€BÁKx8BIHh€^Ãóx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8cSLKÿyå€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!pÃóx€a»aÿì|¦}p N€ |¦¿Aÿè||xBŸ|ƒ#x|¤+xè¦;À”!ÿ <ß<¿8ƾD8¥@dH9é/ƒAž0€@€\/€8B\Až88`H8|}yA‚ø=?¤ëxiÁ¬€K8BK<_€B²è)Á¬‘= €bH;)|~y@‚PÀ&<_8 ;`€B¾"<_¾ˆ<_‘"¾Œ`€]8Bÿÿ/‚]@žHð``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`Ãóx8€8 Kÿlå€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`<_8 =?€B¾b<_¾ˆ‘i¾ŒH°```8`H6Í|}y@‚4<_8=?€B¾b<_¾ˆ‘i¾ŒHp```H:±|{yÀ&A‚t<Ÿ€¼ €„ÀlH7õ/ƒAœ\<Ÿ€¼cÛx€„ÀÌH7Ù/ƒAœ@<Ÿ€¼TcÛx€„¿¸H7½/ƒAœ$<¤ëxeÛx€c³ €bH2Ù|}y@‚@<_8t=?€B¶0b<_¶(‘i¶,€^8Bÿÿ/‚^@ž¼Hœ`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëx8€8 Kÿd¥€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<_8t=?€B¶0b<_¶(‘i¶,H €^Ãóx€| ¦| xN€!`<8cHÌKÿoy€[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!``€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€\8Bÿÿ/‚\@ž@€\ƒãx€| ¦| xN€!H$=?€C<Ÿ)ª¬8„Hô€¢ €iH,e8!`8`ÿÿ€»Aÿè|¦N€ ``|¦½¡ÿ´|zx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿp<ß<¿8Ƴˆ8¥5 H/!/ƒAžH,<_84=Ëx€B³Ì"<_³Ä<_‘"³ÈH|:<_8`ƒÂ¨09)‘:€^8B^H-Å|yy@‚,<_82Ýóx€B³Ì"<_³Ä<_‘"³ÈH$€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`‚ú/—@x;>¿=ß>?=¿;€```€•´h#ËxH+É|{yA¢ÿ€Z(|bà.H/u.|}x@²h~&V€€Q³Ì;À:À:`9àM:€M~@&VR€€8@4’8M³Ä³È€[8Bÿÿ/‚[@žHä``€Z(|Bâ€bH.õ-ƒ|~x@®8~@&VR`€Q³Ì:À:`9à:€M ~&V`’A8€H¼€Z(|Bâ€bH.¥-|vx@ª8~&V@€Q³Ì:`9à:€~@&VR@€’8Ht``€Z(|Bâ€b H.U|sy~@&@¢8~&’A8€Q³Ì9à:€€8@5M³Ä³ÈKÿÿ```€Z(|Bâ€bH.|oy~&@¢(’8€Q³Ì:€€8@5M³Ä³ÈKÿþ¸`8`H*­|ty|&8@¢€Q³Ì€8@4M³Ä³ÈKÿþ„“´ “Ô8`’Ô’t‘ôH*i.|}x@²Ëx=Ëx8BYHl€[cÛx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŠ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!~X A‚8€S8Bÿÿ/‚S@ž$€S~c›x=Ëx€| ¦| xN€!H=Ëx~ A‚0€O8Bÿÿ/‚O@ž€O}ã{x€| ¦| xN€!€8| A‚4€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`<;À8cF¸Kÿh¥€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`8!Ãóxa€¹¡ÿ´|¦}r }q }p N€ ``|@&|¦½¡ÿ´8À|wx8àBŸ9 8è¦A”!ÿ`<_=;ž k±”¼¡À8a¼8À<‘a8Åóx9€„®@9)‘>H$õ|}y@‚ì<_8þÙóxÜóx€B­4Ûóx"<_­,<_‘"­0ú¡˜}ú{xHÄ: <_~|›x~›£x,€B­4~Ú³x: :8} &"<_M€}À&‘"­0HH} &U­`<_~|›x~›£x~Ú³xM €B­4:@}À&UÎ`"<_:: 8‘"­0<_­,H}À&UÎ@<_~|›x~›£x~Ú³x} &U­@€B­4"Kÿÿ¸} &U­`<_~|›x~›£x~Ú³xM €B­4:@:}À&UÎ`: 8"<_‘"­0Kÿÿ„}À&UÎ@<_~|›x~›£x~Ú³x} &U­@€B­4:: 8 "<_‘"­0KÿÿD<_}®kx~|›x~›£x€B­4~Ú³x: 8 "<_‘"­0Kÿÿ=?<_~|›x~›£x)­4~Ú³x€ 9 ­0<_‘"­,H|``8`H#.|xx@’€M<_8þ}À&U΀€B­4ÙóxÜóxÛóxÚóxM: :@} &U­€"<_:: Ïóx­,<_‘"­0€]8Bÿÿ/‚]@ž €H X``€¡<£ëxÃxH%e|yy@‚\M<_8þ}À&€B­4ÙóxÜóxÛóxÚóxM€: :@} &"<_:: Ïóx‘"­0<_­,Kÿÿt€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`<_<Ÿ€a<ƒ¢¡ô€„¯”¥ëxH"Y/ƒ@œ <_ÜóxÛóx8ÿ€B­4bHD<Ÿ€a<¥ëx€„®PH"!/ƒ@œ<<_ÜóxÛóx8€B­4b```<_=?­,‘i­0Kÿü$<Ÿ~ã»x€„®DH Ñ|}y@‚ <_ÜóxÛóx8€B­4bKÿÿ¼8`H!E.|xx@’HM<_Üóx}À&U΀€B­4ÛóxÚóx: :@M:: } &U­€"Hð€Y8BY“# H%-ƒ|ux@Ž} &U­`<_Üóx€B­4H<Ÿ€¡8€„®¬H"-/ƒAœ€<~£«xH&Ù/ƒ@œ<: <_ÜóxÛóx,€B­4Úóx:@:} &"M}À&HT£ëxÃx~¥«xH"©|sy@‚X} &<_Üóx€B­4U­À>}² U­@>"›ãxšãx}®kx:@:: <_8OÓx‘"­0<_­,Kÿü¼€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!ƒÚ¡˜€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8`Hñ|ty@‚0<_8~|›xÛóx€B­4"<_‘"­0<_­,Kÿù €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!~c›xHÉ.|xxA’Úóx:: ÏóxHH<_8~|›x~›£x€B­4"<_‘"­0<_­,Kÿù ``Ïóx:: ~Ú³xÃxH!ý|vyÀ&@¢pH-/ƒAž8WÞÀ>Ò WÞ@><_WÞ >Ñ WÞ`>8€B­4Îóx: :@:: Íóx"<_­,<_‘"­0~›£x~|›xHL`€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!?Ÿ~óx€œ¯¤H -|rx@ª,}À&UÎ@<_Mˆ€B­4} &U­@H0``€w H |}y@¢4} &<_M€€B­4}À&"~Ú³x<_: 8‘"­0H„;Á@~C“x¤ëxÅóxH ¡/ƒA¼÷È€@ @|@€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€@/€Ažd<Ÿ~óx€„¯¬Hõ-ƒ|ux@®H} &U­`<_~Ú³x:@8M €B­4}À&UÎ`"<_‘"­0H ```€wH]-|rxAŠÅóx~£«x~D“xH¡/ƒ@¼8<_,8~Ú³x€B­4}À&"<_} &‘"­0<_­,Kÿýô€@ @|@€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!€@/€Až0<Ÿ~ƒ£x€„­ÐHÁ|}y@¢HM<_~Ú³x}À&€B­4: :@8M€} &"<_‘"­0Hp```8`H -ƒ|uxA®õô€W£ëx~¤«x8BW’õ HE-|rxAªö€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!€R8Bÿÿ/‚R@žü€R~C“x€| ¦| xN€!Kÿûì```€œ¯¤~óxH™|}y@¢@M<_~Ú³x}À&€B­4: :@8M€} &"<_‘"­0HH`<Ÿ~óx€„¯¬HE-ƒ|uxA®õH€wHñ-|rxAªõ|€w$HÝ|py} &A¢õ¨8`H©|qy}À&A¢õÄ70<~$‹x€I8BI€0“±’±’Q’ 78€I8BI€8 €c¬¤H­|~y@¢DM<_~Ú³xM€: :@} &€B­4:8"<_‘"­0H\``€Q8Bÿÿ/‚Q@ž€Q~#‹x€| ¦| xN€!€O8Bÿÿ/‚O@ž€O}ã{x€| ¦| xN€!<Ÿ~ƒ£x€„­ÐHý-ƒ|ux@®P} &U­`<_~Ú³xÏóx:@M €B­4:: }À&UÎ`8 "<_‘"­0Hœ``8`H=-|rx@ª0}À&UÎ@<_~Ú³xÏóx:} &U­@€B­4"HD€^~£«x~D“x8B^“Ò HI|py} &@¢<}À&<_~Ú³xÏóx€B­4"<_: 8 ‘"­0<_­,Kÿù¸`€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!€P8Bÿÿ/‚P@žøÈ€P~ƒxÏóx:: €| ¦| xN€!Kÿø¬€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€T~ž£x~|›x~›£x8BTHH€]£ëx€| ¦| xN€!```A’0€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!AŽ0€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!AŠ0€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!}¸ A‚<€P8Bÿÿ/‚P@ž(€P~ƒx€| ¦| xN€!```}Ø A‚<€Q8Bÿÿ/‚Q@ž(€Q~#‹x€| ¦| xN€!```<;À8c@TKÿV…!9)ÿÿ/‰‘>@ž €^Ãóx€| ¦| xN€!`€Y08`‚Â?=ß>=¿9àº:à```€v€‘š H|~yA‚¤€Y,|Bº€bHÁ.|}x@²4M€P™l;€€‘í™d™h€^8Bÿÿ/‚^@žôHØ8`H]-ƒ||xAŽ “£ „ãxÃóxH¡.|}x@²€P™lKÿÿ¨``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`£ëxH.Aœ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`@’@9€Y,#Ëx~ijx€ |W€â€¢€Â | ¦| xN€!|zyA‚T€S8Bÿÿ/‚S@ž$€S~c›x€| ¦| xN€!``#ËxDÓxHi|{yA‚4€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!<ŸÃx€„šH%.|}xA’<ŸcÛx€„›ÐH |~yA‚´8`H™-ƒ||x@®,€P™lSÓxrÛx€8@ÃM™d™hKÿýô``“à 8`€Z8BZ“\€[8B[“|H9|~yA‚x“ž £ëxÄóxH||y@¢8M€€P™lSÓxrÛx;€€8@ÃM™d™hKÿýx```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\AžSÓxrÛxH$€\ƒãxSÓxrÛx€| ¦| xN€!:µ:÷”¨@žüt€XÃxÃx8BXHÌ<_;€8º=?€B™l-œb<_™d‘i™hH€M€<_8ÃSÓxrÛx€B™l;€"<_‘"™h<_™dHL<_8Ã=?SÓx€B™lrÛxb<_™d‘i™hH €^Ãóx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽÔ€\8Bÿÿ/‚\@žÀ€\ƒãxÃx€| ¦| xN€!H°<_Ãx8º€B™l"H<_Ãx8¾€B™l"<_™d<_‘"™hHp<_8Â=?Ãx€B™lSÓxb<_™d‘i™hHD<_8ÃÃxSÓx€B™lrÛx"<_‘"™h<_™dHÃx```<;À8c,°KÿMU€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€R8Bÿÿ/‚R@ž €R~C“x€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!Ãóxa€¹¡ÿ´|¦}q }p N€ ```|¦¿!ÿä|{x|@&BŸ|ƒ#x|¤+xè¦8A”!ÿ<ß<¿8Æ‚<8¥ ¬8á88H ©;À/ƒAžl;a8<_€b…À9)‘;€K8BK#9)‘#{0K<€J8BJ#9)ÿÿ/‰‘#@ž$€C€| ¦| xN€!```€[0<Ÿ€„’XƒB<€zH ­|~y@‚4<_8«=?€B‘\b<_‘T‘i‘XH```8`H .|}x@’@<_8«=?€B‘\b<_‘T‘i‘X€^8Bÿÿ/‚^@žÅ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!PÃóx€»ÿð|¦N€ ```|¦¿ÿð||xBŸ|ƒ#x|¤+xè¦;À”!ÿ°<ß<¿8ƃh8¥tHþù/ƒAžЀ\<Ÿƒãx8B\€„„ÜHüu|~y@‚,<_8·=?€Bƒ b<_ƒ˜‘iƒœHH`8€H=|}y@‚D<_8·=?€Bƒ b<_ƒ˜‘iƒœ€^8Bÿÿ/‚^@žHÀ``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëxHû]|`y@‚D<_8·=?€Bƒ b<_ƒ˜‘iƒœ€]8Bÿÿ/‚]@ž€H\``€]|x8Bÿÿ/‚]@žl€]£ëx€| ¦| xN€!HP€^Ãóx€| ¦| xN€!H$€]£ëx€| ¦| xN€!``<;À8c´Kÿ<•€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!PÃóx€»ÿð|¦N€ ``|¦¾áÿÜ|wx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ<ß<¿8Æ88¥@HüÁ/ƒAžX€W?Ÿ8`ƒÜuÐ8BW>9)‘>Hû‘|xy@‚8<_8²Ýóx€Bl"<_d<_‘"hƒ\uÐHT``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`~ã»xHù]|yyA‚ ÚóxH0<_8³Ãx€Bl"<_d<_‘"hKÿÿ„ºëx#ËxHý¹|}yÀ&@¢lHøé/ƒAžÀWÞ€>Ð WÞ€><_8³;€€Bl;À;`MM"<_d<_‘"h€Y8Bÿÿ/‚Y@žÈH¬`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`<ŸÃx€„‚HøÅ-ƒ||x@®HM <_8´N ºëx;À€Bl;`"<_‘"h<_dKÿÿd```<Ÿ£ëx€„ƒ Høe.|~x@²(M<_ºëx;`€BlbHì``8€Hü--|{xAŠl€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8`Hø.|~xA’,€]8`8B]“~“¾ Høe-|{x@ª8<_8´ºëx€Bl"<_d<_‘"hKÿþt```“à dÛxƒãxHûu|~y@¢ €bHöÝ|}y@‚D<_8¬=?€Bz b<_z‘iz€^8Bÿÿ/‚^@žÀH ``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëx8€8 Kÿ(¥€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<_8¬=?€Bz b<_z‘izH €^Ãóx€| ¦| xN€!`<8c¼Kÿ3y€\8Bÿÿ/‚\@ž$€\ƒãx€| ¦| xN€!``€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!`8`€»aÿì|¦N€ ```|@&|¦¾ÿÀ|zxBŸè¦A”!ÿ€<_ƒÂl€#9)‘#€^8B^# i0K<€J8BJ>9)ÿÿ/‰‘>@ž$€^Ãóx€| ¦| xN€!``€Z 8`"0‚‰X.€ |R~ÉPHíÑ|yyA¢ýH<Ÿ~ƒ£x€„z`Hí¹-ƒ|xx@®<~&V`<_; N €BxM ~À&VÖ`"HT```: €I(|Bò€bHñ!.|}x@²D<_,8‘€Bx~&"<_M~À&‘"x<_xKÿýø```~óxHðÍ-|ux@ª <_,€Bx~À&b~&Ht8vHð|qy~&@¢@<_/’8‘€Bx~À&VÖà"<_x<_‘"xKÿýx```8`Hí-|ry~À&@¢0<_€Bxb8‘<_=?x‘ixKÿý4``“² ’²Ãx~D“x’2Hð=.|}x@²0~&V€<_: : M€Bx"Hà``€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!8`HìE-|ux@ª(~À&VÖ@<_Mˆ€Bx~&V@"H<“£ ~¤«x#ËxHïe|}y@¢LM€<_; ~À&€BxN~&";: :@<_8‘‘"x<_xKÿûð`€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!€]8Bÿÿ/‚]@ž8€]£ëx;: : :@€| ¦| xN€!H``;: : :@;œ|¸P;Þ€à@žú`~c›xHéé,A‚~~›x|}xH´<_8’;€Bx"<_x<_‘"xKÿú|<_:@8: €Bx-: ;~À&VÖ@"<_Mˆ~&V@‘"x<_xH €Y#Ëx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!AŠ0€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!~ A‚@€Q8Bÿÿ/‚Q@ž,€Q~#‹x~~›x€| ¦| xN€!H``~~›x~Ø A‚0€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!<; 8c àKÿ*-``€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!8!€£ëxa€ºÿÀ|¦}r }q }p N€ ```|¦¿¡ÿô|~xBŸè¦8”!ÿ ``€C88BCH`/ƒ@|€^Ãóx88€| ¦| xN€!/ƒÿþ@žÿØ<_<8$=?€Bn8cx; ÿÿb<_nˆ‘inŒKÿ(É`€^8Bÿÿ/‚^@ž0H``ƒ¾KÿÿÜ€^Ãóx€| ¦| xN€!8!`£ëx€»¡ÿô|¦N€ ``|¦¿!ÿä|~x|@&BŸ|™#x; ÿÿè¦A”!ÿ€€ €C/€8BCAž00Dÿÿ|!.A’@€„/„Aœ4€„@œ(€C€ | ¦| xN€!|zxH``;@<_>,€Bað‰Ažœ€I€~ ;ž;~ €ž €¾$€€Â9B€â"8~ƒ¾(|Zb ºèP‘a0€I8Bÿÿ/‚I@ž €~0€C€| ¦| xN€!`€00},H},‹H@ž<Ÿ£ëx€„jÄHáÙ|zy@‚0<_8Æ=?€BiÐb<_iÈ‘iiÌH@``8€Hå|{y@‚D<_8Æ=?€BiÐb<_iÈ‘iiÌ€Z8Bÿÿ/‚Z@žôHØ``€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!},H},```€K8BK>,€I8Bÿÿ/‚I@ž €~,€C€| ¦| xN€!`€,,€~;`~ Kþ¾=H8€ZCÓx€| ¦| xN€!<;`ÿþ8cÿKÿ"```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!`cÛx€»Aÿè|¦N€ ```|¦¿¡ÿô|}xBŸè¦”!ÿ€c`€]`=ƒ9)‘=Aœl€} /ƒAžð€]`$€`9} 8€½` 9]"€Â€â 8]`8‘a@A €bHá­|}y@‚<<_8d=?€Bdìb<_dä‘idè€^8Bÿÿ/‚^@ž0H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!£ëx8€8 Kÿ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<_8d=?€Bdìb<_dä‘idèH ```/†@ž HH`€I/‚Aœ€I€‚@H€|BЂ@\9)BÿÈ`}~[x|æ;x}d[x8 Kþ¼ÑžAžt8`HÝ|~yA‚Ø=?Äóxigø€K8BK<_€BY )gø‘> €bHà)|}y@‚0<_8n=?€Bdìb<_dä‘idèKÿþ|``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëx8€8 Kÿ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<_8n=?€Bdìb<_dä‘idèH €^Ãóx€| ¦| xN€!`8<8¡@8a8HÜU<8cú”H߉€<€¡@|~x€a8HÞu/ž@ž <_ƒÂYPÃóx;ÀHâ9€\8Bÿÿ/‚\@žD€\ƒãx€| ¦| xN€!H(`/…@þ<|©¦|‰#xKÿýð```8!`Ãóx€»ÿð|¦N€ ``|¦¿¡ÿô|}xBŸè¦”!ÿ €€C#€9)‘#Aœ,€C€| ¦| xN€!/ƒÿþAž@=€€]€|xAœ;ÀÿÿH```8Hx`<_8+8<8¡@€BaP8a8"<_‘"aL<_aHHÚå<8c÷$HÞ€<€¡@|~x€a8HÝ/ž@ž <_ƒÂU´Ãóx;ÀHàÉ=8 ÿÿ/€@ž€]£ëx€| ¦| xN€!8!`Ãóx€»¡ÿô|¦N€ |¦¿ÿð/„BŸ||x|#x覔!ÿ €C€(8BÄPC¾@/…@€c„|ƒ"HÖ­/ÝóxAÀ€œ(€|T€02T„ 6|„PHÛ©,@‚ 8`HÙY|~yA‚è=?ÄóxibÔ€K8BK<_€BT`)bÔ‘> €bHÜ|}y@‚H<_8Ý=?€B`b<_`‘i` €^8Bÿÿ/‚^@žÔH¸```€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!£ëx8€8 KÿI€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<_8Ý=?€B`b<_`‘i` H8`€(Ýóx|T<(Hl€^Ãóx€| ¦| xN€!8<8¡@8a8HØ…<8cöHÛ¹€<€¡@|~x€a8HÚ¥/ž@ž <_ƒÂTtÃóx; HÞi`€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!`£ëx€»ÿð|¦N€ ```|¦¿Aÿè||xBŸ|#x覔!ÿ?_€R„#9)‘#€D8BD@ž8`H×%|~yA‚ä=?Äóxi`l€K8BK<_€BQø)`l‘> €bHÚM|{y@‚D<_87=?€B] b<_]˜‘i]œ€^8Bÿÿ/‚^@žHð``€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!cÛx8€8 Kÿ €[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!<_87=?€B] b<_]˜‘i]œHx`€„€(„@$„€cHØ9,@‚8`HÕé|~yA‚È=?Äóxi`d€K8BK<_€BQð)`d‘> €bHÙ|{y@‚(<_8;=?€B] b<_]˜‘i]œKÿþÄ€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!cÛx8€8 Kÿ ù€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!<_8;=?€B] b<_]˜‘i]œHX`€|œ(`œ€½/…@„¥€|€HÑÅHp€^Ãóx€| ¦| xN€!`8<8¡@8a8HÕ<8cóÔHØI€<€¡@|~x€a8H×5/ž@ž ƒÚR`ÃóxHÚý``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!p8`€»Aÿè|¦N€ ```|¦¿ÿð|ƒ#xBŸ|¤+x; è¦”!ÿ <ß<¿8ÆJè8¥ðt8á89<“¡<9!@9ADHÕI;À/ƒAžüa<=?€K8BKƒÉYpƒ¡€Ý <Ÿ<¿€BJ08„ã´8¥Û €é €bHÌiKÿÿ0€|€C€| ¦| xN€!``€8;À!8€I 8Bÿÿ\Kÿÿ$€\ƒãx€| ¦| xN€!``€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!/ž@œ@€\8Bÿÿ/‚\@ž(€\ƒãx;€€| ¦| xN€!H `;€8!`ƒãx€»ÿð|¦N€ `|¦¿aÿì|#xBŸ8€|¾+x覔!ÿ€˜| ¦| xN€!||yA‚(<_<¿<ßÄóxƒbGd;À£ëx8¥âP8ÆD8á8“|“Á8€[8B[HÎ/ƒAž¨€\=?8B\a8€K8BKƒ©RpƒÁ8/@žp<_<Ÿ€BG”8„á€bHÊ©<_<8ª=?€BS8céÐ;Àÿÿb<_Rø‘iRüKÿ Ù`€\8Bÿÿ/‚\@žàH¼``žØAž$€~Až¤ëxHÒy/ƒAž0ƒÁ8€^8B^<€I8Bÿÿ/‚I@žXH4<_>€Ý <Ÿ<¿€BG 8„á$8¥Ø|€é €bHÉÙKÿÿ0€|€C€| ¦| xN€!``€8;ÀKÿÿ4€\ƒãx€| ¦| xN€!``€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!/ž@œ@€\8Bÿÿ/‚\@ž(€\ƒãx;€€| ¦| xN€!H `;€8!pƒãx€»aÿì|¦N€ `|¦¿aÿì|{xBŸ|œ#x覔!ÿ #9)‘#=?€D8BDƒÉP/ž@¾,<_<Ÿ€BE8„Þ€bHÈ•Hœ```<_€BDä„Až €džAžÄóxHС/ƒAž8<Ÿƒãx€„R HÉ |~yA‚p8€HÌù|`y@‚ÀH€``<_<€Þ <Ÿ<¿€BE 8„Þ¤8¥ç€€é €bHÇù<_8®=?€BP€b<_Px‘iP|H´<_8¯=?€BP€b<_Px‘iP|H<_8¯=?€BP€b<_Px‘iP|€^8Bÿÿ/‚^@ž\H<`€^|x8Bÿÿ/‚^@žL€^Ãóx€| ¦| xN€!H0€^Ãóx€| ¦| xN€!`<; 8cçˆKÿ u€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!`£ëx€»aÿì|¦N€ ```|¦¿aÿì||xBŸ|ƒ#x|¤+xè¦8”!ÿ<_<ß<¿€BRà8Æ?,8¥Ú°8á89<8AKx8BIHL€^Ãóx€| ¦| xN€!H €]£ëx€| ¦| xN€!`<;À8cå\KÿÕ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!8!pÃóx€»aÿì|¦N€ ``|@&|¦¿ÿà|zx|˜#xBŸè¦A”!ÿ??ƒ™>¬€C8BC<9)‘<€cHÂÕ|{y@‚,<_8¯=?€BJHb<_J@‘iJDHÈ`cÛxHÇ=.|}x@’PHÂm/ƒAž(<_8¯=?€BJHb<_J@‘iJD€[8Bÿÿ/‚[@žÜ8„ØX€bHÁ½Kÿÿ˜`€>¬ƒAž €cžAžÄóxHÉÕ/ƒAž€\8Bÿÿ/‚\@žHH,=?€]€Þ <Ÿ)>è8„ᨀ¢ €iHÁQKÿÿ,€\ƒãx€| ¦| xN€!€¼ëx/€Až€¬`ÃóxHÈ=€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!8!p€a»ÿà|¦}p N€ ``|¦¿!ÿä|yx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ <ß<¿8ÆG 8¥ÉH‘/ƒAžø€Y?_ƒš; 8BY<9)‘<€yH¿¡|{y@‚(<_8=?€BGKx8BIHh€[cÛx€| ¦| xN€!A’<€]8Bÿÿ/‚]@ž(€]£ëx€| ¦| xN€!```<;À8cÞØKþþ5€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`8!`Ãóx€a»!ÿä|¦}p N€ |¦¾¡ÿÔ|zx|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ€<ß<¿8ÆB°8¥Ä°H¾1/ƒAžˆ€Z??8`ƒy7@8BZ;9)‘;H¿a|~y@‚,<_8d|Ûx€BBÜ"<_BÔ<_‘"BØHŒ€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!Üóx>ÿ?>ß: fH``¼ëx€š(ƒãx8¡8H¿1/ƒAœŒ€8Tþ/€8AžD<ŸCÓx€„DhHºå|~yA‚„8€H¾Õ.|}x@²8€XBÜ€’¶BÔBØ€^8Bÿÿ/‚^@žÀH```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`<_ƒÂBX/ž@¾$<_<Ÿ€B7p8„Ðì€bH¹}Hl`€7@Až €}ƒðAžÄóxHÁ•/ƒAž€[8Bÿÿ/‚[@žhH@=?€]€Þ <Ÿ)7|8„Ú<€¢ €iH¹€XBÜ€’¶BÔBØ@’¬HÔ€[cÛx€| ¦| xN€!```€\»ëx8B\= €I8Bÿÿ/‚I@ž€} €C€| ¦| xN€!“› €z0H½ |~yA‚ ƒãxÄóxH¾µ|}y@¢8BÜ8h€IBÔWBØKÿþ`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@žý°€\ƒãx€| ¦| xN€!Kÿý”97@€I}>Kx8BIHÈ€^Ãóx€| ¦| xN€!Hœ<_8e=?€BBÜb<_BÔ‘iBØHx<_8f=?€BBÜb<_BÔ‘iBØHT<_8h=?€BBÜb<_BÔ‘iBØH0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8cÚ˜Kþùy€[8Bÿÿ/‚[@ž$€[cÛx€| ¦| xN€!``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`8!€Ãóx€aº¡ÿÔ|¦}p N€ |¦¾ÿÐ; BŸ†8|wxè¦|˜#x|Û3x”!ÿ€|ú;x|¹+x>߃–2T€C8BC“¡8“¡<“¡@€D8BD<9)‘<@œô|ƒ#x<Ÿ€„@4H¶¥|~y@‚, &<_›ãx;@8M€B=ðbHô``#ËxHº-,a8@‚P &<_8M;@€B=ð"<_=è<_‘"=ì€^8Bÿÿ/‚^@žHL```cÛxH¹Í,aôH´µ,a<@‚8 &<_›ãx;@8O€B=ðb<_=?=è‘i=ìHÈ`#ËxH¸-,a@A‚ÿ¼8`H´ù|~yA‚ÿ¬€@Äóx “¡@€a¨H³e/ƒa8@ž8>ß>¿>Ÿ8Q6=ð€I!@=è/‰U=ì@žøH(`<ŸcÛx€„?ÈH³/ƒa@Ažÿ´8`H³¡/ƒa €c=ä“<¤ëxH±e|~y@‚< &<_¤ëx;@€B2p€bH²Á€V=ð8R"=è‘5=ìHx`H±€^|}x8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```,@‚ &;@H <8cÕÌKþòe8a@888¡² W½@>ƒœ) =!¿~ƒx€•6`H–É.|}x@’HM=aŸdÛxk x‘c £ëx€T6,"9)‘"€6,H™I|ry@‚xM=a}² U­@>ƒœ) =!U­€>}° U­€>Kx8BIH€€^ÃóxH €]£ëx€| ¦| xN€!ƒœ) ‰/ƒ@œ€[À8"H À<_=?;¢ŠD“ÉÂä£ëxH?¹/ƒAœ €zÃp<Ÿ¥ëx8„\PH>=/ƒ@œ€[À8s"H t€·ì??<_ÿÿ==?;Ù†È8B^€9KÈd?Ÿ“©ÂôKÈd Ãóx‘\ÈH?I/ƒAœŒ€|È8€ƒ¾„H?±|~yA‚t<Ÿ£ëxÅóx8„\,H:€^T}þ#½8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/Aœ$;نȀzÃp<Ÿ8„\`ÅóxH=a/ƒ@œ€[À8"H ˜<_ÿÿ=_€·ì=???8BY 9jÈh“ÉÂü=?ÿþ;™…¨JÈh<_ÿÿ9)I8BeÐ?¿‘+=?ÿÿƒãxK <_ÿÿ9)c`8Bb ‘+ =?ÿÿK<_ÿþ9)Uà8BIà‘+=?ÿÿK<_ÿþ9)Tà8BJà‘+K ‘}ÃŒH> /ƒAœŒ€}ÃŒ8€ƒ¼„H>u|~yA‚t<Ÿ£ëxÅóx8„\,H8Ù€^T}þ#½8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/Aœ$;¹…¨€zÃp<Ÿ8„\p¥ëxH<%/ƒ@œ€[À8¥"H \<_ÿþ=_€·ì=???8BNÐ9jÈŒ“©Âì=?ÿÿ;Ù~8JÈŒ<_9)y 8B]?Ÿ‘+ÃóxK ‘|ÃH=/ƒAœŒ€|Ã8€ƒ¾„H=|~yA‚t<Ÿ£ëxÅóx8„\,H7å€^T}þ#½8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/Aœ$;¹~8€zÃp<Ÿ8„\ˆ¥ëxH;1/ƒ@œ€[À8­"H h<_=€·ì??=?8Bd°9KȘ;Ùm˜“©Âø?ŸKȘ<_Ãóx8B…€J ‘\ÔH<1/ƒAœŒ€|Ô8€ƒ¾„H<™|~yA‚t<Ÿ£ëxÅóx8„\,H6ý€^T}þ#½8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/Aœ$;¹m˜€zÃp<Ÿ8„\¥ëxH:I/ƒ@œ€[À8¼"H€ƒ˜·ì<_;Âl <_“ž Ãóx“¢ÂðH;q/ƒAœ €zÃp<ŸÅóx8„\œH9õ/ƒ@œ€[À8¨"H,>ÿ<_ÿþ==?;·i¨8BMð8 È ??“ÉÃKÈ “ £ëxØH;/ƒAœ€yØ8€ƒ½„H;m|~yA‚x<Ÿ£ëxÅóx8„\,H5Ñ€^T}þ#½8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/Aœ(;·i¨€zÃp<Ÿ;šÃp8„\°¥ëxH9/ƒ@œ€[À8n"HP€·ì<_;Âhè<_ Ãóx“¢ÃH:A/ƒAœ €zÃp<ŸÅóx8„\¼H8Å/ƒ@œ€[À8P"Hü?¿<_8€€}ÅГÂÃKþt…|~y@‚``€[À8"HÄ€ÅЀzÃpÅóxH8/ƒ@œ$€[À8"<_Ãx<_‘"Ã|Hè€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!>ß8€€vÅKþsñ|~y@‚€[À8"H8€zÃp€–ÅÅóxH7y/ƒ@œ€[À8"Kÿÿt€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!?¿8€€}ÄÔKþsu|~y@‚€[À8"H¼€|€ÄÔÅóxH6ý/ƒ@œ€[À8"Kÿþø€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!=?8`iÅ$€K8BK<_)Å$‘"ÇPH6Ñ|`y@‚€[À82"H(<_8`ƒÂ¸@<_ÇT<_>“ÂÇX9)‘>H6,@‚€[À8‹"Hä<_8?Ÿ;ÿÿƒ¢·ä<_:à|ÅpbÇ\<_<`Í=Çh<_`ce“¢Ç`<_9)“¢Çl<_‘==?ƒ"¸<“©Çd=?“©Çp=?€K8BK“ Çx<_=?’âÇ|“©Ç€<_=?“"Ç„“)Lj<_=?€Åp}Y“¢ÇŒ<_9k’éÇ=?Çt<_‘}’éǘ’âÇ”<_9J“¢Çœ<_“¢Ç ‘Y<_“"ǤH5y|`y@‚€[À8É"HÐ><_Y8`}Ǩ<_9)9J9k‘>=?“ÂǬ<_“©Ç°=?“¢Ç´<_“©Ç¸=?“¢Ç¼<_“©ÇÀ=?“¢ÇÄ<_“)ÇÈ‘Y‘}“"ÇÌ<_“¢ÇÐH4Ý,@‚€[À8y"H4<_=?È"hÀiÇÔH6Q|`y@‚€[À8z"H=<_8`ÇØ<_9)“¢ÇÜ‘=H4u,@‚€[À8û"HÌ}<_=?bÇà<_’éÇè8`<Åp“Çì9k<_‘}“¢Çä€I8BI<_€ÅpÇðH4 ,@‚€[À8"Hd=<_?bÇô<_8`9)“¢Çø‘=8Ç4€I8BI=?€Ç4|Åp Çü=?€K8BK<_“©È=?“¢È<_“©È }€Åp9kÈ‘}H3q|`yA‚P=<_<`È`cB@<_9)“¢È‘=H3A|`yA‚ <`{<_`cÈjÈH3%|`y@‚€[À8°"H|^}<_=?8`ÿÿÈ<_“ÉÈ$9k9J“¢È ‘}‘^H2Õ|`y@‚€[À8±"H,ƒ–Å€zÃp<_È(„ãxH.å|~y@‚8<_„ãx€B¸€bH0I€[À8²=?b<_Ãx‘iÃ|Hx<Ÿ€„ÅhH.||y@‚8€[À8²=?b<_Ãx‘iÃ|€^8Bÿÿ/‚^@ž4H€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!}<_=?8`“‚È,<_“©È0=?9k“¢È4<_“©È8‘}“¢È<=?<_“©È@“¢ÈDH1©,@‚$€[À8G"<_Ãx<_‘"Ã|Hy<_]=?8!pbÈH<_“)ÈL=?9k“¢ÈX9J<_‘y“©ÈT‘]“¢ÈP8Ç4€I8BI<_€Ç4`ºÁÿØÈ\€|¦N€ €^Ãóx€| ¦| xN€!8!p<€8c\кÁÿØ|¦Kþn¸`?Ÿƒ¼Ž,8Ž,/AžñP|xKÿðø`|@&|¦¾áÿÜ||xBŸ|#xè¦A”!ÿ``#|ƒ#x9)‘<€D8BD<Ÿ€„³@H.=/ƒÿÿ@žD<_8µ;@€B³¼-"<_³´<_‘"³¸;À,&HÌ``/ƒ;ÀÿÿAž8<_?_ƒÂ´Œ€z³°ÄóxH,1|yy@‚8M<_Äóx;@€B¨<€bH-<_€B³¼H ```?€z³°ƒØ´èÄóxH+á.|{x@’tM<_ÄóxM;À:à&W€€B¨<;@€bH-%<_€B³¼b8¶<_=?³´‘i³¸€Y8Bÿÿ/‚Y@ž€H\``8`H+ý-ƒ|wx@Ž&W`HD< <Ÿ£ëx€I8BI€ “w €„µTH+.|{x@’D&W€WÀ> W@><_;@€B³¼"<_8¶;À‘"³¸<_³´KÿÿLƒØ´è€z³°ÄóxH*½-|zx@Š0&W@<_Äóx;À€B¨<€bH,<_€B³¼Kÿþì8`H+|~y&@‚<_€B³¼KÿþÌ“~ “^8`H*õ.|{x@’0M<_8¶;@€B³¼"<_³´<_‘"³¸Kÿþœ’ã “ÃdÛx#ËxH. -|zx@Š$Mˆ<_:à&W@€B³¼"Kÿþø€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!CÓxH,½|{xH(õ/ƒAž(<_€B³¼b8¶<_=?³´‘i³¸Kÿüà€Z~Ûx8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!H€Y#Ëx€| ¦| xN€!``A’0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!AŽ0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!AŠ0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€! A‚<€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```<;Àÿÿ8cM Kþiµ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8!pÃóxa€ºáÿÜ|¦}r }q }p N€ ```|@&|¦¾ÁÿØ|zxBŸè¦A”!ÿ?ƒ˜¢°€C8`8BZ<9)‘<H(™|{y@‚0<_8¤=?›ãx€B®L–ãxb<_®D‘i®HHT€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`<_<ƒ¢°œ€c®<¤ëxH&½|~y@‚d<_¤ëx–ãx€B¢Ì€bH(<_8¥=?€B®Lb<_®D‘i®HHÈ<_8¨=?€B®Lb<_®D‘i®HHP<Ÿ€„®ÔH&I.|}x@’\M<_8¥M–ãx:à€B®L; "<_®D<_‘"®H€^8Bÿÿ/‚^@ž´H˜```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€zH)m|~y@‚4M<_–ãxM€:à; €B®L8¦"<_‘"®HHô€z8cH))-ƒ|wx@ŽH#M.|}xA’ü,“à ¤ëx#ËxH&‘|~yA‚ €Y8Bÿÿ/‚Y@ž$€Y#Ëx€| ¦| xN€!``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€^8Bÿÿ/‚^@žþ€€^Ãóx€| ¦| xN€!Kÿþd€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!€[ÜóxcÛx8B[H```<_8¨=?€B®Lb<_®D‘i®HHp<_8¨=?€B®Lb<_®D‘i®HH €^Ãóx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!AŠ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!<8cGÔKþbIcÛx;`€C8Bÿÿ/‚C@ž€C€| ¦| xN€!`€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!8!pcÛxa€ºÁÿØ|¦}r }q }p N€ ```|¦¿!ÿä||x|@&BŸ|ƒ#x|¤+xè¦; A”!ÿ<ß<¿8Æ—¨8¥5Ì8á8“¡8“¡<“¡@“¡DH!½;À/ƒAž <A8<Ÿ9)‘<€J8BJ| €„§x€K0"<€iH/ƒa<@ž=?€B™,b<_™$‘i™(H|``8`Hm.|~x@’PM<_8>;`€B™,"<_™$<_‘"™(€]8Bÿÿ/‚]@žÄH¤```€\£ëxÄóx8B\“ž HY-ƒ|{xAŽÀ€]8Bÿÿ/‚]@ž(€]£ëx€| ¦| xN€!```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€šš@€|8HÙ|}y@‚0<_8>=?€B™,b<_™$‘i™(H``8`H=.|~x@’0<_8>=?€B™,b<_™$‘i™(KÿþØ``“c “£|dx<€cœHM|`y@‚4M€<_8>;`€B™,"<_™$<_‘"™(H\`€^|x8Bÿÿ/‚^@ž¬€^Ãóx€| ¦| xN€!H€]£ëx€| ¦| xN€!`A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŽ0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!<; 8c3HKþPõ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8!`£ëxa€»Aÿè|¦}q }p N€ |@&|¦¿aÿì|{xBŸè¦A”!ÿ =?€C8BC<ƒÉ–à€c•ÀÄóxH½|}y@‚D<_Äóx€BŠL€bH!<_8;=?€B•Ìb<_•Ä‘i•ÈHÌ``8`H .|~x@’@<_8;=?€B•Ìb<_•Ä‘i•È€]8Bÿÿ/‚]@ž,H `€[£ëxÄóx8B[“~ H ||yA‚ÿ¤€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`ƒãxHÝ|}xH /ƒAž<<_8;=?€B•Ìb<_•Ä‘i•È€\8Bÿÿ/‚\@ž¨Hˆ€\¾ëx8Bÿÿ/‚\@žœ€\ƒãx€| ¦| xN€!H€€]£ëx€| ¦| xN€!`A’P€^8Bÿÿ/‚^@ž<€^Ãóx€| ¦| xN€!H €\ƒãx€| ¦| xN€!`<;Àÿÿ8c0KþNE€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!`Ãóx€a»aÿì|¦}p N€ `|@&|¦½¡ÿ´|zx|ƒ#x|¤+xBŸè¦A”!ÿP<_<ß<¿€B— 8Æ„H8¥ ¸8á8A8He;À/ƒAž¨:a8?ŸƒÜ‡x9)‘:€K8BK>9)‘>z0K<€J8BJ>9)ÿÿ/‰‘>@ž €^Ãóx€| ¦| xN€!`€8€Z0: ÿÿ€ðƒ"}1 U)`>U)À>}2 U)@>"H0N<_~W“xM€~ܳx~{›xM€B“:@;"8@8AH<_‘"“<_“ Hl`8`H ½-ƒ|rx@ŽpM <_8ƒN ÜóxÛóx€B“;9à×óx"<_“ <_‘"“8@} &U)`AH‘!P€]8Bÿÿ/‚]@ž LH 0`€A8£ëx~D“x"9)‘"€8 H .|xx@’T|&T€<_ÜóxÛóx9àM€B“×óxP8ƒ"8@AH<_‘"“<_“ Kÿÿl`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€R8Bÿÿ/‚R@ž €R~C“x€| ¦| xN€!`ÃxH ý|}xH5/ƒAžP9à<_ÜóxÛóx,€B“×óx|&MP8ƒ"8@AH<_‘"“<_“ H 0€Xµëx8Bÿÿ/‚X@ž(€XÃx€| ¦| xN€!```8`H}|vy@‚D<_ƒœ‡x8†€B“›ãx—ãxb`<_=?“ ‘i“H ````ƒÜ‡x€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!‚:/‘AÛóx×óxH 8@=?Ûóx×óxAH<_:€9à‘!L>AT=ß=¿;À€y€”HHI-ƒ|rxAŽÔ€Z(|Bò€bH í.|xx@²@|&T€€M“9àP8ˆ"€AL‘.““ 9 ~ܳx- ‘!HHˆ8`H}|}y@¢4,-“|&P8ˆ€I!LN“ “ Kÿÿ¸``“ ~C“x¤ëxH •.|xxA²úX€R8Bÿÿ/‚R@ž$€R~C“x€| ¦| xN€!``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`ÃxH/ƒa€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!°Ãóxa€¹¡ÿ´|¦}r }q }p N€ ``|@&|¦¿Aÿè||x|›#xBŸè¦A”!ÿ #9)‘#=?<€D8BDƒ©„8€cؤëxHúÍ|~y@‚D<_¤ëx€Bvh€bHü1<_8r=?€Bèb<_à‘iäH¬``<Ÿ€„‚DHúy.|}x@’<<_8r=?€Bèb<_à‘iä€^8Bÿÿ/‚^@ž(H€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`Hú|~y@‚4<_8r=?€Bèb<_à‘iäHÄ```€\£ëxÄóx8B\“ž €[8B[“~Hý™|zyA‚ÿ(€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^]Óx8Bÿÿ/‚^@ž|€^Ãóx€| ¦| xN€!H`€^Ãóx€| ¦| xN€!`A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<; 8c€Kþ:u€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8!`£ëx€a»Aÿè|¦}p N€ `|¦¾ÿÐ;ÀBŸè¦”!þð<_=_=>ÿJƒÈ???kƒÌ?_??Ÿ?¿‚÷ƒœƒƒ <ß<ÿƒ{ƒ¬ƒ9ƒ¤==?ƒZƒ¨ƒœƒ°€Æƒ¼€çƒÀƒÄ)ƒÐƒ½ƒ¸“ÁÈ“Á¼“ÁÀ“Áăƒ´,<_¡0‘A¤‘a¨“aˆÁ˜áœ“Á‘ ‘!¬’áÌ“|“!€“A„“Œ“¡”;Âp\=_=<_|{xJƒÔkƒØ808a,€BƒÜÅóx8À8à9¼9 ‘A°‘a´A¸Kþ0y/ƒAœ/Ð8ˆ8AŒ€a,€0<¿Æóx88A<8A”@8˜AD8AœH8 AL8A¤P8¨AT8A¬X8°A\8¥d`8A´8¸8áÌ9|9!€Adh9A„Høñ/ƒ@ž¨!,/‰Až0€I8Bÿÿ/‚I@ž€a,€C€| ¦| xN€!!0/‰Až0€I8Bÿÿ/‚I@ž€a0€C€| ¦| xN€!!¼/‰Až.¼€I8Bÿÿ/‚I@¾.¨€a¼;ÀÿÿH.€``€[aÌ?_<8€8B[€K8BK!|€I8BIa€€K8BK!„€I8BIaˆ€K8BK!Œ€I8BIa€K8BK!”€I8BIa˜€K8BK!œ€I8BIa €K8BKA¤ƒÚs„€J8BJ!¨€I8BIa¬€K8BK!°€I8BIa´€K8BKA¸€J8BJ>€c@9)‘>Kþ4u,aÀ@‚H€&>ß?>ÿ8¶€V Ùóx; "‘8``!È/‰@žH4€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`ƒ!À<Ÿ;À€„t“ÁÀ#ËxHô ,aÀA‚Ü<Ÿ#Ëx€„xHóí|}y€&A‚p8`ÿÿH÷™/ƒaÄAž\8`Hôe/ƒaÈAžH!Œ8`€I8BI€AÈ€Œ !Ä€AÈ‘"“ÁÄHô%/ƒaÄ@ž,`>ß?>ÿ8·6 €IXKÿþð“£ €È€AÄ“ÁÈ€aÀ€ÄH÷1|}y@‚4`€&>ß?>ÿ8·€V ; "‘8Kÿþ˜€AÀ"9)ÿÿ/‰‘"@ž€aÀ€C€| ¦| xN€!“ÁÀ€AÄ"9)ÿÿ/‰‘"@ž€aÄ€C€| ¦| xN€!“ÁÄ€]8Bÿÿ/‚]@ž0€]£ëx€| ¦| xN€!H```€I8Bÿÿ/‚I@ž €aÈ€C€| ¦| xN€!`!À8È/‰Až0€I8Bÿÿ/‚I@ž€aÀ€C€| ¦| xN€!!Ä8À/‰Až0€I8Bÿÿ/‚I@ž€aÄ€C€| ¦| xN€!˜ 8ÄA‚4€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<8cxKþ2ù8aÈ8À8¡ÄKþ.É/ƒ@œ@ƒZs„9 €V 8¸‘!Ø, “AÜ€&"‘8!ÀH$``€AÈ"9)ÿÿ/‰‘"@ž€aÈ€C€| ¦| xN€!;À€AÀ“ÁÈ"9)ÿÿ/‰‘"@ž$€aÀ€C€| ¦| xN€!``“ÁÀ€AÄ"9)ÿÿ/‰‘"@ž(€aÄ€C€| ¦| xN€!```“ÁÄ8`Hñ©|~y@‚0€&ƒZs„<_8º€B “AÜb8@AØH¨`€[$"9)ÿÿ/‰‘"@ž€{$€C€| ¦| xN€!“Û$>ÿ?ƒ×€¼€xÄóxHïÉ||y &@‚<_Äóx€Bs €bHñ)`¸ “È@‚HƒZs„<_¼ëx8»€B “AÜb8@AØ=?<_‘i!ÀH"l``<Ÿƒãx€„`HïE,aÀA‚¸€AÈ"9)ÿÿ/‰‘"@ž €aÈ€C€| ¦| xN€!`88`ÈHï•,aÄA‚h€[8B[“c !Ì€I8BI€Ì€AÄ!|€I8BI€|€AÄ€aÀ€Ä€¡¼Hñ‘|}y@‚8`€&ƒZs„<_8»€B “AÜb8@AØKÿþì``€AÀ"9)ÿÿ/‰‘"@ž€aÀ€C€| ¦| xN€!;À€AÄ“ÁÀ"9)ÿÿ/‰‘"@ž$€aÄ€C€| ¦| xN€!``“ÁÄ€["9)ÿÿ/‰‘"@ž(€{€C€| ¦| xN€!```“»<Ÿ£ëx€„lHí‘,aÈ@‚4€&ƒZs„<_8¼€B “AÜb8@AØKÿýì``€["9)ÿÿ/‰‘"@ž€{€C€| ¦| xN€!€È;€a̓ȀK8BK; €I8Bÿÿ/‚I@ž€{ €C€| ¦| xN€!€Ìa´ €K8BK;T€I8Bÿÿ/‚I@ž$€{T€C€| ¦| xN€!``ƒÁ€s„Àx @|€A´Ýóx/€[TxAžT<_€Bsè€b €bHÊ|}y@‚HN<_8l;`€BMì"<_Mä<_‘"Mè€^8Bÿÿ/‚^@ž¸Hœ`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëx8€8 KýüE€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`<_8l=?€BMìb<_Mä‘iMèHP```/€AžÌ<_<ƒ¢O@€cMܤëxHÅu|~y@‚<<_¤ëx€BBl€bHÆÙ<_8n=?€BMìb<_Mä‘iMèHä<Ÿ€„O HÅ).|{xA’¬€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```8`HÅ}|~y@‚4<_8n=?€BMìb<_Mä‘iMèH0```=?cÛxÄóxiQ$€K8BK)Q$‘> HÈ}|}y@‚(<_8n=?€BMìb<_Mä‘iMèKÿþ€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€]8Bÿÿ/‚]@ž$€]£ëx€| ¦| xN€!``8=?<)BP}>Kx€I8BIH`€^Ãóx€| ¦| xN€!A’4€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`<;À8cé€Kþå€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`8!`Ãóx€a»aÿì|¦}p N€ |¦¿aÿì|{x|@&BŸ|ƒ#x|¤+xè¦8A”!ÿ<ß<¿8Æ;@8¥Ù 8á88HÅ ;À/ƒAžì;a8<9)‘;=?€K8BKƒ©KX€cI¬¤ëxHÂi|~y@‚@<_¤ëx€B><€bHÃÍ<_8¥=?€BI¼b<_I´‘iI¸H`<Ÿ€„JPHÂ.|}x@’<<_8¥=?€BI¼b<_I´‘iI¸€^8Bÿÿ/‚^@žˆH`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`HÂ=|~y@‚4<_8¥=?€BI¼b<_I´‘iI¸H$```€[£ëxÄóx8B[“~ !8€I8BI€8HÅ1||yA‚ÿ €]8Bÿÿ/‚]@ž$€]£ëx€| ¦| xN€!``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`=?)> €I}>Kx8BIHh€^Ãóx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8cå|Kþµ€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!8!pÃóx€a»aÿì|¦}p N€ |@&|¦¾ÿÀ8À|tx8àBŸ9 8è¦A”!ÿ`<_=;Â7àkK ¼¡À8a¼8À8‘aLÅóx98Kýø}/ƒAœ(”€a¼€À<¿Æóx8áL8¥ÓøHÁi/ƒ@ž°!¼/‰Až4€I8Bÿÿ/‚I@ž €a¼€C€| ¦| xN€!`!À/‰Až8€I8Bÿÿ/‚I@ž$€aÀ€C€| ¦| xN€!``!8/‰Až'è€I8Bÿÿ/‚I@ž'Ô€a8;ÀH'¬`€TaL>¿<ŸƒU:¸8BT€K8BK:€„Hp9)‘:€tH¾|}y@‚L &<_SÓx[ÓxUÓxM€€BFT:À;ÀN;WÓx8µ"<_‘"FPH`8€HÁ½|~y@‚TM<_8µSÓx[Óx€BFTUÓx;€WÓx"<_FL<_‘"FP€]8Bÿÿ/‚]@ž&àH#X€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`HÀ½|~y@‚T &<_SÓx[ÓxUÓxM€€BFT:À;ÀN;WÓx8¶"<_‘"FP<_FLH#X`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`<Ÿ€t €„ItHÁå||y@‚\ &<_Óóx8·[ÓxM€€BFTUÓx:ÀN;À;WÓx"<_‘"FP<_FLH"À```8`H¼|}y@‚@ &<_8·[ÓxUÓx€BFTÓóx;WÓx"<_‘"FP<_FLH" “ =<_¤ëx‚:¼~ƒx+Hè€I8BIkHè‘}H¿…|vy@‚@M<_8·[ÓxUÓx€BFTÓóx;€WÓx"<_‘"FP<_FLKÿýÈ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€tHº|wy~ &A‚ ÓóxH@=?<_8¹Óóx‘!X€BFT"`€AXFL<_‘"FPH `sÛx~ã»xH¾É|}y@¢@H¹ý/ƒAž”=?<_8¹‘!X€BFT"€AXFL<_‘"FPH Ä`<_ƒÂEÐ/ž@¾$<_<Ÿ€B:è8„Ôd€bH¹]Hl`€:¸Až €}ƒðAžÄóxHÁu/ƒAž€Z8Bÿÿ/‚Z@ž¨HŒ=?€]€Þ <Ÿ):ô8„Ý´€¢ €iH¸ñ=?<_;€8¹‘!X€BFT;À; .;MM~@&VR€"€AXFL<_‘"FP€]8Bÿÿ/‚]@ž H ì€ZCÓx€| ¦| xN€!<Ÿ£ëxºëx€„FüH¹!|}yA‚x8`H¹±.||x@²DM<_;ÀM; ;~@&VR€€BFT8º"<_AX<_‘"FPH耡8£ëx„ãxH»µ-ƒ|~x@®H~@&VR`=?<_8º; M ‘!X€BFT;"<_‘"FP€AXFLKÿÿ`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`~c›xÄóxH½y|{yA‚|€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€/€~R VR@><_sÛx; €BFT;8¼"<_AX<_‘"FPH|N=?<_8¾sÛx‘!X€BFT;€"€AXFL<_‘"FPHtN <_sÛxM ;€; €BFT8¾"<_AX<_‘"FPH MH0N =?<_sÛx;€‘!X€BFT8¾"HHM=?<_sÛx; ‘!X€BFT8¾"H =?<_8¾sÛx‘!X€BFT"`€AXFL<_‘"FPH°N<_8À~@&VR@€BFTsÛx;€;"<_AX<_‘"FP!X FLH~P VR€>=?<_sÛx‘!X;€8À€BFT"€AXFL<_‘"FPHTN=?<_8ÀsÛx‘!X€BFT;€"€AXFL<_‘"FPHL€]£ëx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŠ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!~X A‚0€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!A’0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!~8 A‚0€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!8a@8H8¡D; H®a€AXƒ"FL>_~óx€’G H­).||x@’0<_/8Â=?€BFTb<_FL‘iFP@ž$Hx8€H°é|~yA‚ÿÈ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/@ž H´!@/‰Až0€I8Bÿÿ/‚I@ž€a@€C€| ¦| xN€!!H/‰Až0€I8Bÿÿ/‚I@ž€aH€C€| ¦| xN€!!D/‰Až0€I8Bÿÿ/‚I@ž€aD€C€| ¦| xN€!@’ Hø;€€a@€H€¡D~Û³x;,:À &H¯‚µ:¸8<_;À“"FLD@HW½ >± W½`>~·«xW½€>° W½€>H8`H¯-ƒ|~x@Ž M H$~c›xÄóx8¡?>_ƒÑG¨€rFDÄóxHž|}y@‚H &<_Äóx5Ëx:ÀM€€B:Ô;N€bHŸé<_;À8Ì€BFTbH¸>߀–GtHžE||y@‚,M<_5Ëx;€8Ì€BFT"<_‘"FPHÄ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8`Hž|xy &A‚4=?ƒãxÃxiIÜ€K8BK)IÜ‘8 H¡­|~y@‚,<_8Ì5Ëx€BFT"<_‘"FP<_FLHЀ\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€aLHq/ƒa<@œD;€<_5Ëx:À,€BFT;À;8Í &"<_M€N‘"FPHxAž°<Ÿ~ƒ£x€„H€Hœ‘.|vx@’ &W½€H`8€H m|~y@‚D &W½ >± W½`><_5Ëx;À€BFT;8Î"<_‘"FP<_FLHÔ€V8Bÿÿ/‚V@ž¼€V~óx€| ¦| xN€!H ƒÑG¨€rFDÄóxH›å|}y@‚X &<_Äóx5Ëx:ÀM€€B:Ô;N€bH1<_;À8ЀBFTb<_=?FL‘iFPH8€–GtH›||y@‚4M<_5Ëx;€8ЀBFT"<_‘"FP<_FLKÿÝЀ]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!8`H›µ|xy &A‚4=?ƒãxÃxiIà€K8BK)Ià‘8 Hžá|~y@‚,<_8Ð5Ëx€BFT"<_‘"FP<_FLH€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!5:¸5Ëx€I}>Kx8BIHp€];£ëx;À:À,€ &| ¦| xM€NN€!H˜‚µ:¸~Û³x~·«xH;‚õ:¸~Û³x,~õ»x &€\8Bÿÿ/‚\@ž¬€\ƒãx€| ¦| xN€!H€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!A’0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!¸ A‚<€X8Bÿÿ/‚X@ž(€XÃx€| ¦| xN€!```<;À8câPKýÚE!8/‰Až8€I8Bÿÿ/‚I@ž$€a8€C€| ¦| xN€!``€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€U8Bÿÿ/‚U@ž €U~£«x€| ¦| xN€!`€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!!¼/‰Až8€I8Bÿÿ/‚I@ž$€a¼€C€| ¦| xN€!``!À/‰Až˜€I8Bÿÿ/‚I@ž„€aÀ€C€| ¦| xN€!Hh`;ÀH\;:À;À, &M€NH,;€5Ëx;À;/œ &W½àMœKÿüø`@ŠüÄKÿüì``8! Ãóxa€ºÿÀ|¦}r }q }p N€ ``|¦¿aÿì|{x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ <ß<¿8ƨ8¥ž H˜!/ƒAž¨€[=?<8B[ƒ©h€c¼¤ëxH••|~y@‚<<_¤ëx€BL€bH–ù<_8Ø=?€BÌb<_Ä‘iÈH<Ÿ€„øH•I.|}x@’<<_8Ø=?€BÌb<_Ä‘iÈ€^8Bÿÿ/‚^@žˆH`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`8`H•m|~y@‚4<_8Ø=?€BÌb<_Ä‘iÈH$```; £ëxÄóx€I8BI€  ;€I8BI€H˜Y||yA‚ÿ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`=?)0€I}>Kx8BIHh€^Ãóx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<;À8c¸ìKýÔå€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`8!`Ãóx€a»aÿì|¦}p N€ |@&|¦¾áÿÜ8À||x8àBŸ9 8è¦A”!ÿp<_;”¬¡°8a¬8°H8@DÅóx98KýËÝ/ƒAœD€a¬€°<¿Æóx8¥›ˆH”Í/ƒ@ž¤!¬/‰Až0€I8Bÿÿ/‚I@ž€a¬€C€| ¦| xN€!!°/‰Až0€I8Bÿÿ/‚I@ž€a°€C€| ¦| xN€!!8/‰Až ¨€I8Bÿÿ/‚I@ž ”€a8;ÀH l`<?ƒ»9)‘<€]8B]ƒÜ .|&TŸþ/€ÿ8߀Y´/‹"¬‘8°Až0€K8Bÿÿ/‚K@ž€a@€C€| ¦| xN€!!D8@/‰Až0€I8Bÿÿ/‚I@ž€aD€C€| ¦| xN€!<_<;@ƒ¢Ѐc¨“AD¤ëxH].|~x@’<_¤ëx€B4€bH½“Á@@’(€Y´ƒ»8à;@"¹ëx¬‘8°H€ÃóxHi€A@a<"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€<“A@,A‚ <8cµüKýÐY8aD8@8¡HKýÌ)/ƒ@œ,€Y´;@ƒ»8à."¹ëx¬‘8°Hè€AD"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!“AD€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!“A@€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“AH``ƒÜ@/ž“ÁKx €I8BIHhN<_;@8å€B´"<_¬<_‘"°H<<_8å=?€B´b<_¬‘i°HNƒ»;@¹ëx`!@/‰Až8€I8Bÿÿ/‚I@ž$€a@€C€| ¦| xN€!``!D/‰Až8€I8Bÿÿ/‚I@ž$€aD€C€| ¦| xN€!``!H/‰Až8€I8Bÿÿ/‚I@ž$€aH€C€| ¦| xN€!``A’0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!<;À8c¶KýÇ5!8/‰Až8€I8Bÿÿ/‚I@ž$€a8€C€| ¦| xN€!``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`!¬/‰Až8€I8Bÿÿ/‚I@ž$€a¬€C€| ¦| xN€!``!°/‰AžH€I8Bÿÿ/‚I@ž4€a°€C€| ¦| xN€!H`;À```8!Ãóx€aºáÿÜ|¦}p N€ |¦¿!ÿä|{x|@&BŸ|ƒ#x|¤+xè¦;ÀA”!ÿ<ß<¿8Æüp8¥§d8á89<9!@H†%/ƒAžL;<_<Ÿƒ¢ÿ@9)‘;€]€„ à8B]€{Hƒ|~y@‚4<_8î¹ëx€B Ü"<_ Ô<_‘" ØH|``€a8H‡ .||x@’PM<_8î¹ëx;@€B Ü"<_ Ô<_‘" Ø€^8Bÿÿ/‚^@žpHL``8`Hƒ-|zx@Š0<_8î¹ëx€B Ü"<_ Ô<_‘" ØKÿÿ¨`“ƒ DÓxÃóxH†¥|yy@‚ÿ>ß?8ˆ7üŒ€Iü„Vüˆ!ÿ>ß?8‰7üŒ€Iü„VüˆKÿþô€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!ƒÁ8“@“8H,€I8Bÿÿ/‚I@ž€a<€C€| ¦| xN€!!@8ß>ÿ?8`HrQ/ƒa@AžD=+ÿœ€I8BI<_€Bðìkÿœ!@‘i €b€@Huq/ƒa8@ž$7üŒ8‹€I!8ü„VüˆH¸`€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€a8;À8€8 “Á@Ký§M€A8"9)ÿÿ/‰‘"@ž$€a8€C€| ¦| xN€!``“Á87üŒ8‹€IÉóxü„VüˆH!8```/‰Až<€I8Bÿÿ/‚I@ž(€a8€C€| ¦| xN€!```!ÿ?€C#8B9)C‘#ƒ×ö¤€xõüÄóxHnñ|}y@‚H<_Äóx€BꌀbHpU<_8]=?€Bö b<_ö‘iöH ```€{Hr]||yÀ&@‚`M€<_8]N;@; M€Bö :À"<_ö<_‘"ö€]8Bÿÿ/‚]@ž ÄH ¨```€{ Hqí.|zx@’0M<_; M:À8]€Bö "<_‘"öHÔ€{Hq­-ƒ|yx@Ž M <_:À8]€Bö "H „8`Hn]-|vx@Š0<_8]=?€Bö b<_ö‘iöKÿÿ8``“ƒ ~ijx£ëx€["9)‘"€“V“6HqU||yÀ&@‚8M€<_;@N; 8]€Bö "<_‘"öHü``€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`ƒãxHlM.|zx@’0M<_; M:À8\€Bö "<_‘"öHÀ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`CÓxHp}-ƒ|yx@ŽDHk­/ƒ@ž<_<Ÿ€Bêd8„“,€bHiíM <_:À8\€Bö "H”Ho-|}xHke,À&A‚0<_:À8\=?€Bö -b<_ö‘iöHl€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!“» CÓxHoµ|}y@‚lHjé/ƒ@ž<_<Ÿ€Bêd8„“,€bHi)WÞÀ>Ò WÞ@><_WÞ >Ñ WÞ`>; €Bö :À8\"<_‘"öHX``HnA||xHjy/ƒAžÑ WÞ`><_;€; €Bö :À8\M "<_‘"öH˜€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!“›CÓxHnÁ|iyA‚H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bêd8„“,€bHhHHi±/ƒAž¸<_; :À8\€Bö -Mˆ"<_‘"öHH€ZCÓx€| ¦| xN€!€[€ €Aœd;€ ‚@œl)(B|H.ƒ×ö¤€xõüÄóxHi¥-|vx@Š$<_Äóx€BꌀbHk<_€Bö H €{Hm1||yÀ&@‚(<_€Bö b8c<_=?ö‘iöH`€{ Hlù-ƒ|yx@Ž N H€{HlÝ|}y@‚0N<_8c;@€Bö "<_ö<_‘"öHp8`Hi.|zx@’(<_8c=?€Bö b<_ö‘iöKÿú\“ƒ DÓx~óx€["9)‘"€“:“ºHl||y@‚0M€<_; 8c€Bö "<_ö<_‘"öH €V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!ƒãxHg-ƒ|yx@Ž8N <_;@M :À8b€Bö "<_‘"ö<_öH4€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!#ËxHk¹.|}xA’œHj©|~xHfá.A’D<_;@;€:À€Bö .8bÀ&WÞ€"<_M‘"ö<_öKÿøÄ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!“Û #ËxHk!-|vx@ŠTHfQ/ƒ@ž<_<Ÿ€Bêd8„“,€bHd‘M<_8b:À€Bö "<_ö<_‘"öHtHiÁ|~xHeù/ƒAž(<_8b=?€Bö b<_ö‘iöH<€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!“Û#ËxHjU|iyA‚H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Bêd8„“,€bHc­HHeE/ƒAžd<_;@8b=?€Bö -:Àb<_ö‘iöH|€Y#Ëx€| ¦| xN€!€{Hi-.|zx@’pH@<_8€8 €BꔀbKý›•<_8e=?€Bö b<_ö‘iöHp<_; :À8f€Bö -Mˆ"<_‘"öH@€{ Hh­||yÀ&@‚8M<_; M€:À8f€Bö "<_‘"ö<_öHl€{Hhe|}y@‚0M<_; M€:À8f€Bö "<_‘"öKÿü¼8`He -|vx@Š0Mˆ<_; 8f€Bö "<_ö<_‘"öKÿõÜ“C |dx;€I8BI€“ƒ“£<€cõHgý|`y@‚(<_8f=?€Bö b<_ö‘iöHð€V|x8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!Hü€]£ëx€| ¦| xN€!Ø A‚<€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```A’0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!AŽ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!AŠ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<;À8c“LKý¤E€[8Bÿÿ/‚[@žP€[cÛx€| ¦| xN€!H4€Z8Bÿÿ/‚Z@žø€Kÿød€Y8Bÿÿ/‚Y@žüØKÿü¼8!pÃóxa€ºÁÿØ|¦}r }q }p N€ ``|¦¾aÿÌ|#x|@&BŸ8€|¾+xè¦A”!ÿp€˜| ¦| xN€!|zyA‚ `=?<_£ëx=ƒiÝ@€BèôÄóx<¿<ß;€8¥†L8á88ÆÚ€9Ÿ>ÿ>ß: €A€„Ýð9)‘>HT¥|xy@‚ü<_8YÚóxÙóx€BÜä"<_ÜÜ<_‘"ÜàƒœÑH›ãx—ãxH ´M <_~>‹x}À&UÎ`€BÜä9à:"Hð}À&U΀<_~>‹x~œ£x~»«xM€BÜä~W“x:`M9à:8]"<_‘"ÜàH´UΠ>}Ñ UÎ`><_UÎÀ>}Ò UÎ@>Äóx€BÑd~>‹x~œ£x~»«x~W“x:`:€bHU1<_8]€BÜä"<_‘"Üà<_ÜÜHPM Ht<_~>‹x~œ£x~»«x€BÜä~W“x8]"<_‘"ÜàH}À&UÎ`<_~>‹x~œ£x~»«x€BÜä~W“x9à8]"<_‘"ÜàHàUÎÀ>}Ò UÎ@><_~>‹x~œ£x~»«x€BÜä~W“x:8]"<_‘"ÜàH¤M<_~>‹xM€~œ£x~»«x€BÜä~W“x:`:8]"<_‘"ÜàHh`8`HS=.|}x@’p}À&U΀<_8YÙóxÚóxM€BÜä:`ÜóxM9àÛóx:×óx"<_ÜÜ<_‘"Üà€X8Bÿÿ/‚X@ž ¬H „`HVá-ƒ|sx@Ž$M <_ÙóxÚóx€BÜäHœ``<Ÿ€¡8€„ÞPHT/ƒAœ€<~c›xHX±/ƒ@œ8:<_ÙóxÚóx-€BÜäÜóxÛóx9à}À&UÎ@"HPÃx¤ëx~e›xHT…|yy@‚TM<_ÙóxÚóx€BÜä`}À&UÎ@"ÜóxÛóx9à:<_8YwÛx‘"Üà<_ÜÜKÿþð€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<Ÿ~óx€„ÝôHPm|xy@‚,<_8Z=?Úóx€BÜäb<_ÜÜ‘iÜàKÿûÌ8`HPÕ.|}x@’}À&U΀<_Úóx€BÜäH<€YÃx¤ëx8BY“= €¡}Ñ UÎ`>"ÜóxUÎÀ>}Ò UÎ@><_Ûóx:`9à:×óx8Z‘"ÜàHT€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8`HPi|qy@‚(<_8[€BÜä"<_‘"Üà<_ÜÜKÿúl€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!CÓxHNI|xyA‚ÜóxÛóx×óxH8<_8\~>‹x€BÜä"<_‘"Üà<_ÜÜKÿùø~W“x~»«x~œ£xÃxHR•.|}x@²HHMÅ/ƒAžT}À&U΀<_~>‹x:`9àM€BÜä:M"HÀ``HM¡-ƒ|sxA®ù”€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!~c›xHR.|tx@’\HM1/ƒ@ž<_<Ÿ€BÑ<8„z€bHKq}À&U΀<_~>‹x; 9à€BÜä:UÎÀ>}Ò UÎ@>"H€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!~c›xHQi.|ux@’`HL™/ƒ@ž<_<Ÿ€BÑ<8„z€bHJÙ}À&U΀<_~>‹x~œ£x; €BÜä9à:UÎÀ>}Ò UÎ@>"Ht€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!~c›xHPÍ.|rx@’pHKý/ƒ@ž<_<Ÿ€BÑ<8„z€bHJ=}À&U΀<_~>‹x~œ£x~»«x€BÜä; 9à:UÎÀ>}Ò UÎ@>"HÔ```€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!~c›xHP!|iyA¢H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€BÑ<8„z€bHIyHHK/ƒA¾0:<_~>‹x~œ£x,€BÜä~»«x~W“x; 9à}À&"NM<_8\‘"Üà<_ÜÜKÿøü€S~c›x€| ¦| xN€!<Ÿ~#‹x€„Ý€HK.|}xA²öÌ<_<ƒÂß4€cÜÔÄóxHJí|oy}À&A‚öð<Ÿ€„Ý@HJÕ-ƒ|sxA®÷@€O8Bÿÿ/‚O@ž€O}ã{x€| ¦| xN€!8`HK5|oy}À&A¢÷l€V~c›x}ä{x8BV’Ï €U8BU’¯€T8BT’€R8BR’OHN=-|pxAªö°€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!€O8Bÿÿ/‚O@ž€O}ã{x€| ¦| xN€!8`HJq-ƒ|sxA®öp€T8`8BT’“ €U8BU’’³HJ9|oy}À&A¢öp’o £ëx}ä{xHM}|~yA¢ö”€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€O8Bÿÿ/‚O@ž€O}ã{x€| ¦| xN€!€^8Bÿÿ/‚^@žú¤€^Ãóx€| ¦| xN€!Kÿúˆ€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€Q~=‹x~>‹x8BQH€XÃx€| ¦| xN€!```A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!}Ø A‚<€O8Bÿÿ/‚O@ž(€O}ã{x€| ¦| xN€!```AŠ0€P8Bÿÿ/‚P@ž€P~ƒx€| ¦| xN€!<; 8czKý‰E!9)‘>HE|ty@‚4<_8a€BËÔ"<_ËÌ<_‘"ËЂýÀ8~ø»x~ú»xH˜€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`<Ÿ~£«x€„̸HCE|yy@‚,<_8b~ž£x€BËÔ"<_ËÌ<_‘"ËÐKÿÿ„M <_8b:@€BËÔ"<_ËÌ<_‘"ËÐH(M<_~Ú³xMxÛx—ãx€BËÔ:`:@8c"<_‘"ËÐH€M <_~Ú³xxÛx—ãx€BËÔ:@8c"<_‘"ËÐHP<_8c~Ú³xxÛx€BËÔ—ãx"<_‘"ËÐ<_ËÌHM€<_~Ú³xxÛx—ãx€BËÔ:`8c"<_‘"ËÐHð```8`HB­.|}x@’`M<_8bMÚóxØóx€BËÔ:`:@×óx"<_ËÌ<_‘"ËЀY8Bÿÿ/‚Y@ž H``€¡8#Ëx¤ëxHD•-ƒ|sx@ŽHM <_8bÚóxØóx€BËÔ:@×óx"<_‘"ËÐ<_ËÌKÿÿ```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`~c›xH@}|yy@‚DM<_8bÚóxØóx€BËÔ:@×óx"<_‘"ËÐ<_ËÌH@``€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`ÚóxØóx×óxH—ãxxÛx~Ú³x#ËxHD.|}x@²DH?±/ƒAž8M<_:`M:@8b€BËÔ"<_‘"ËÐHÌ``H?‘-ƒ|sxA®üÔ€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`~c›xHCí|vyÀ&@‚PH?/ƒ@ž<_<Ÿ€BÀ,8„hô€bH=]WÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>€BËÔH”`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`~c›xHC]|{yÀ&@‚pH>/ƒ@ž<_<Ÿ€BÀ,8„hô€bH<ÍWÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>~Ú³x€BËÔ"; <_:@8b‘"ËÐH|``€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`~c›xHB­||yÀ&@‚`H=Ý/ƒ@ž<_<Ÿ€BÀ,8„hô€bH<WÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>~Ú³x€BËÔxÛx; :@"HÈ€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`~c›xHB |iyA¢T€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€BÀ,8„hô€bH;eH```H<ñ/ƒA¾H<_:@~Ú³xxÛx€BËÔ-—ãx; N"<_8b‘"ËÐ<_ËÌKÿûh€S~c›x€| ¦| xN€!```<Ÿ~ƒ£x€„ÌpH<õ.|}xA²ú8`H=-ƒ|sxA®ú(€[8`8B[“s €\8B\““H=M-|rxAªú$’c ~D“x£ëxH@‘|~yA¢ú<€]8Bÿÿ/‚]@ž$€]£ëx€| ¦| xN€!``€R8Bÿÿ/‚R@ž €R~C“x€| ¦| xN€!`€^8Bÿÿ/‚^@žûÀ€^Ãóx€| ¦| xN€!Kÿû¤€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!€T~£x~ž£x8BTHÔ€Y#Ëx€| ¦| xN€!`A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!AŠ@€R8Bÿÿ/‚R@ž,€R~C“x~ž£x€| ¦| xN€!H``~ž£x<; 8ci¤Ký|!8/‰Až4€I8Bÿÿ/‚I@ž €a8€C€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`€U8Bÿÿ/‚U@ž €U~£«x€| ¦| xN€!`!¬/‰Až8€I8Bÿÿ/‚I@ž$€a¬€C€| ¦| xN€!``!°/‰Ažh€I8Bÿÿ/‚I@žT€a°€C€| ¦| xN€!H8`; H,``€S8Bÿÿ/‚S@žüKÿûè``8!£ëxa€ºAÿÈ|¦}r }q }p N€ ``|@&|¦¾ÿÀ8À|vx8àBŸ9 8è¦A”!ÿp<_=;±Tkܬ¡°8a¬8°<‘a8Åóx9€„À 9)‘>H7U|zy@‚Ü<_8iÛóxØóx€B¿”"<_¿Œ<_‘"¿ƒ<³ø7Ëx<ËxH dM <_~>‹x:€B¿”"HPM<_~>‹xM~|›x~·«x€B¿”~Y“x:€:8m"<_‘"¿H MˆHM€<_~>‹x~|›x~·«x€B¿”~Y“x:€8m"<_‘"¿Hä```8`H7 .|}x@’`M<_8iMØóxÛóx€B¿”:€Üóx:×óxÙóx"<_¿Œ<_‘"¿€Z8Bÿÿ/‚Z@žÈH¬H:Á-ƒ|tx@Ž$M <_ØóxÛóx€B¿”HŒ``<Ÿ€¡8€„ÁH7å/ƒAœ€<~ƒ£xH<‘/ƒ@œ,<_:ØóxÛóx€B¿”-Üóx×óx"H@CÓx¤ëx~…£xH8q|xy@‚DM<_ØóxÛóx€B¿”"Üóx×óx:<_8i~ù»x‘"¿<_¿ŒKÿÿ€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€T8Bÿÿ/‚T@ž€T~ƒ£x€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<Ÿ~óx€„À¤H4i|zy@‚,<_8j=?Ûóx€B¿”b<_¿Œ‘i¿Kÿý8`H4Ñ.|}x@’(M<_ÛóxMÜóx×óx€B¿”"HL€XCÓx¤ëx8BX“ €¡‹x€B¿”"<_‘"¿<_¿ŒKÿûP~Y“x~·«x~|›xCÓxH6.|}x@²@H1Í/ƒAž¨M<_~>‹xM:€:€B¿”"Hx```H1±-ƒ|txA®úô€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!~ƒ£xH6.|sx@’HH1A/ƒ@ž<_<Ÿ€B³ì8„\´€bH/M<_~>‹x; :€B¿”"HØ€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!~ƒ£xH5.|ux@’PH0½/ƒ@ž<_<Ÿ€B³ì8„\´€bH.ýM<_~>‹x~|›x; €B¿”:"HP`€W8Bÿÿ/‚W@ž€W~ã»x€| ¦| xN€!~ƒ£xH5.|rx@’PH01/ƒ@ž<_<Ÿ€B³ì8„\´€bH.qM<_~>‹x~|›x~·«x€B¿”; :"HÀ€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!~ƒ£xH4u|iyA¢L€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€B³ì8„\´€bH-ÍH`H/a/ƒA¾€<_:~>‹x~|›x€B¿”-~·«x~Y“x; N"<_8l‘"¿<_¿ŒKÿù|€T~ƒ£x€| ¦| xN€!<Ÿ~#‹x€„À0H/m.|}xA²øl8`H/ù-|pxAªø”€U£ëx~ƒx8BU’° H31|~yA¢øx€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€P8Bÿÿ/‚P@ž€P~ƒx€| ¦| xN€!€^8Bÿÿ/‚^@žüP€^Ãóx€| ¦| xN€!Kÿü4€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€Q~=‹x~>‹x8BQH¼€ZCÓx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€T8Bÿÿ/‚T@ž€T~ƒ£x€| ¦| xN€!AŠ0€P8Bÿÿ/‚P@ž€P~ƒx€| ¦| xN€!<; 8c]ˆKýoE!|òx @|8I/€^DAž08 ÝóxÔóxÕóxÑóxÓóxH Ð```8`H+m|ry@‚D<_8êÝóxÔóx€B±ÜÕóxÑóxÓóx"<_‘"±Ø<_±ÔH h``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€a@H)-|vyA‚Ôóx:ÕóxÑóxÓóxHP<_8ëÔóxÕóx€B±Ü~]“xÑóxÓóx"<_‘"±Ø<_±ÔH ДãxUÓxqÛx3Ëx:~óxH-Y.|~x@²\H(‰/ƒAž ,M<_8ëM; €B±Ü"<_±Ô<_‘"±Ø€V8Bÿÿ/‚V@ž ÀH œ``H(Q-ƒ|}x@®$<_-8ë€B±Ü"HL``€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`£ëxH,||yÀ&@‚`H'½/ƒ@ž<_<Ÿ€B¦48„Nü€bH%ýWÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>8ë€B±Ü;ÀbHp``€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`£ëxH+í|zyÀ&@‚PH'/ƒ@ž<_<Ÿ€B¦48„Nü€bH%]WÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>”ãx€B±ÜH”€U8Bÿÿ/‚U@ž €U~£«x€| ¦| xN€!`£ëxH+]|{yÀ&@‚pH&/ƒ@ž<_<Ÿ€B¦48„Nü€bH$ÍWÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>”ãx€B±ÜUÓx"<_;À8ë‘"±Ø<_±ÔKÿýÔ€Q8Bÿÿ/‚Q@ž €Q~#‹x€| ¦| xN€!`£ëxH*­|yyÀ&@‚pH%Ý/ƒ@ž<_<Ÿ€B¦48„Nü€bH$WÞÀ>Ò WÞ@><_WÞ€>Ð WÞ€>”ãx€B±ÜUÓxqÛx;À8ë"<_‘"±ØKÿÿL`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`£ëxH)ý|iyA¢T€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€B¦48„Nü€bH#UH```H$á/ƒA¾ È<_;À”ãxUÓx€B±Ü-qÛx3Ëx8ëN"<_‘"±ØKÿþt€]£ëx€| ¦| xN€!`€¦@€a8|`x1 ÿÿ|I/‚AD|@xAž0DÓx8¡DH(õ/ƒAœ\€D|øTþD``/€@žû|€¦@€a<|`x1 ÿÿ|I/‚AD|@xAžx„ãx8¡DH(/ƒ@¼D<_; ”ãxUÓx€B±Ü-qÛx3Ëx;À8ìN M "<_‘"±ØKÿýˆ€D8@/€@8@AD|@x`.A’”ãxUÓxqÛx3ËxKÿúÜ€¦@€a8|`x1 ÿÿ|I/‚AD|@xAžp„ãx8¡DH'é/ƒ@¼@M<_”ãxUÓxqÛxM €B±Ü3Ëx;À; 8î"<_‘"±ØKÿüØ€D8@/€A8@AD|@x/€@ž”ãxqÛxH€8cÛxH(É.|~x@² MH„ãxH$í|}y@¢DMMˆ<_”ãxUÓxqÛx€B±Ü3Ëx; 8ï"<_‘"±ØKÿü@``€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!a8€K8BK<9)ÿÿ/‰‘<@ž€\ƒãx€| ¦| xN€!‚8±ëx€¦@€a<|`x1 ÿÿ|I/‚AD|@xAž`DÓx8¡DH&9/ƒ@¼@<_; UÓx3Ëx€B±Ü-;À8ñN M "<_‘"±ØKÿû,`€DTþD/€@žUÓx3ËxH€<#ËxH').|~x@² MHDÓxH#M|}y@¢4MMˆ<_UÓx3Ëx; €B±Ü8ò"<_‘"±ØKÿú¨€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!a<€K8BK:9)ÿÿ/‰‘:@ž€ZCÓx€| ¦| xN€!‚¡<³ëx<Ÿ~C“x€„²xH ©.|~x@²4M<_; M8ô€B±Üb<_=?±Ô‘i±ØKÿ÷œ8`H!-ƒ|}x@®8<_-8ô€B±Ü"<_±Ô<_‘"±ØKÿ÷````€T8`8BT’ €U8BU’½€Q8BQ’=€S8BS’}H }-|px@ª0<_8ô=?€B±Üb<_±Ô‘i±ØKÿöÜ``“£ ~ƒxÃóxH#•|}y@¢,M€<_; 8ô€B±Ü"Kÿÿ0```€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€P8Bÿÿ/‚P@ž€P~ƒx€| ¦| xN€!€]:8Bÿÿ/‚]@žõØ€]£ëx€| ¦| xN€!Kÿõ¼€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!~C“xH$…/ƒÿÿ@ž,<_8õ~]“x€B±Ü"<_±Ô<_‘"±ØH/ƒOÝèB|&Tÿþ/DAš 8¦@~]“x€I}>Kx8BIHì€R~^“x~]“x8BRHÔ€V~óx€| ¦| xN€!``A’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!AŽ0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŠ8€P8Bÿÿ/‚P@ž$€P~ƒx~]“x€| ¦| xN€!H~]“x<;À8cOüKý^ù`€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`€U8Bÿÿ/‚U@ž €U~£«x€| ¦| xN€!`€Q8Bÿÿ/‚Q@ž €Q~#‹x€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@žL€a@€C€| ¦| xN€!H0```€]8Bÿÿ/‚]@žö€Kÿö```8!Ãóxa€ºÿÀ|¦}r }q }p N€ ``|¦½¡ÿ´|yx|@&BŸ|ƒ#x|¤+xè¦;À; A”!ÿ <ß<¿8Æ“ä8¥1\8áX“ÁX“Á<“Á@“ÁH“ÁLHE/ƒAž,€YaX>¿<Ÿƒu–p8BY€K8BK;€„¥,9) ‘;€y H /ƒa<@ž@<_?¿8?_Ax=¢ €I`!x ¢!@Z¢/‰@žØH8`Hí/ƒa@Ažÿ´€<= <€c–t+¤€I8BIk¤€A@‘b“Á<€@H/ƒa=ÿ=?;@:ÁD’|‘ထ!t|RxApAl<_~Q“x’Ah~M“x‚‚–¨~N“x~S“x`~ã»xH .aL@²0H=/ƒAž|=?€O¢ ;À8‘!x"H¤`!p€I8Bÿÿ/‚I@ž€I€ap€| ¦| xN€!€AL<Ÿ8€„¤ŒL|CxApHE,a@A‚88€H1,aŸ84;‚L€I!<‚D/‰X‚H@žH,``8`Hú½/ƒaŸ8:€B‚L"<_‚D‘"‚HHœ<_>Ÿ8;€B‚L"<_‚D‘"‚HHx<_>Ÿ8<€B‚L"<_‚D‘"‚HHT<_>Ÿ8=€B‚L"<_‚D‘"‚HH0<_>Ÿ‚ùv°88€B‚L~õ»x~ö»x"<_‚D‘"‚H!Ÿ88×óx€B‚LÕóxÖóx"<_‚D‘"‚HKÿÿ„€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!;`€AD“a<"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!€^“aD8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!‚á8<Ÿ“a8€„ƒˆ~ã»xHõ©/ƒaŸ89Õóx€B‚LÖóx"<_‚D‘"‚HKÿþ@€AD"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!“aDÕóxÖóx`€a8Hù /ƒa<@¾ Hô=|~y@‚ÐH```HôA/ƒaDAž°€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€aD8Ÿ89€B‚L"<_‚D‘"‚HKÿûð€aD€C€| ¦| xN€!``<Ÿ;Á@8~£«x€„ƒ|ÅóxDHö¥/ƒA¼úì€@ @|/€@Až4~óxHõa@HñÕ/ƒ@¾úà€@8Kÿýp```<ŸÅóx~£«x€„„HöA/ƒA¼úЀ@ @|/€@Až(~óxHõ9a@Hñq/ƒ@¾úÄ€@Ÿ8?€B‚L"<_‚D‘"‚HKÿúÌ€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!;`“Á8HÔ€I8Bÿÿ/‚I@ž €a<€C€| ¦| xN€!`!D8Kx8BIHð```ƒ¹v°·ëxµëx¶ëx!D/‰Až8€I8Bÿÿ/‚I@ž$€aD€C€| ¦| xN€!``!ÿ8€8sL€I!8sD/‰YsH@žìH8`Hæý/ƒa@AžÿÀ€]8B]!@“© €a8€@Hê1/ƒa “©|@€K8Bÿÿ/‚K@ž€|@€C€| ¦| xN€!“Ü@€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!“A@€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!“A<€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!;À“A8H ```8`HãM|zy&A‚@=?DÓxivT€K8BK<_€Bg¤)vT‘: €bHæq/ƒa@@ž<_€BsLHˆ€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€a@8€8 Kým€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!&W€“Á@<_;@€BsLb8„<_=?sD‘isH``!8/‰Až8€I8Bÿÿ/‚I@ž$€a8€C€| ¦| xN€!``!¿ƒuZȆ؀C8BC€F8BF;9)‘;Až$$€0f|—J| P€D€Ad<Ÿ€„gðHß |}y@‚0<_8,=?€Bfdb<_f\‘if`H``8`Hßm.||x@’PM<_8,M; :À€Bfd"<_f\<_‘"f`€]8Bÿÿ/‚]@ž,H`€[8B[“c Hã!-ƒ|yx@Ž4M <_8,:À€Bfd"<_f\<_‘"f`Kÿÿœ`8`HáÝ-|vxAŠp<Ÿ#Ëx~ųx€„gœHà/ƒAœT€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`£ëx„ãx%ËxHàµ-|vx@Š,`<_8,=?€Bfdb<_f\‘if`Kÿþô€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!>_ƒ²eà/@ž <_<Ÿ€BZø8„ôt€bHÜHd–ØAž €vAž¤ëxHä5/ƒAž€^8Bÿÿ/‚^@žhHL=?€V€Ý <Ÿ)[8„ýÄ€¢ €iHÛ±<_8,=?€Bfdb<_f\‘if`H\€^Ãóx€| ¦| xN€!€ 64~Þ³xT:}4.8€V TB:|™.:‘$ €Z48BZ4$€|J€E8BEH¼€]£ëx€| ¦| xN€!A’0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!AŽ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!AŠ0€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<; 8c„KýU€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!8!€£ëxa€ºAÿÈ|¦}r }q }p N€ ```|¦¾ÿÀ,BŸ|xx|—#xè¦:À”!ÿp``€Cƒ£8BCA:ÀTµþ; >>Ÿ>_: ž: H``Ýóx™è|&Tïþ/8Aš„|Yê8,|^pÞ”})€I‚¸|&Tïþ/8@š4€ —|@&TBïþ/A8@šÿ˜/–~À³x’Á8Ažø<_<ƒ‚`ø€c^´„ãxHÖñ|zyA‚ €Z€B4/‚Až € /€AžÄóxHÙ||xHhÃóxHÚu|{y@¢`&;€HX```CÓxdÛxH܉€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!,`&@¢,€T^À€’2^¸^¼€Z8Bÿÿ/‚Z@žH€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!<Ÿƒãx€„aLHÕé|zyA‚<€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8`HÙm||y`&A¢ÿXCÓx„ãx8¡8HÙ±/ƒA¼ÿ@€8Tþ8€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€\8Bÿÿ/‚\@ž$€\ƒãx€| ¦| xN€!€8H €8`/€Až``;>Kÿý€``/•~ «x’¡8Ažô<_<ƒ¢`ø€c^´¤ëxHÔÍ|zyA‚D€Z€B4/‚Až € /€AžÄóxHÖá||xHdÃóxHØQ|}y@¢`&;€Hð``CÓx¤ëxHÚi€]||x8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!,`&A‚ €Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!<Ÿƒãx€„aLHÓñ|zyA‚ €\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8`H×u||y`&A‚CÓx„ãx8¡8H×¹/ƒ@¼ €T^À€’^¸^¼KÿýD``€8|øTþ8€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€\8Bÿÿ/‚\@ž$€\ƒãx€| ¦| xN€!€8H€8```/€@žûlH\;ÀÿÿHT<_„ãx€BS@€bHÔM<_8ž=?€B^Àb<_^¸‘i^¼HÐ<_8ž=?€B^Àb<_^¸‘i^¼H€<_¤ëx€BS@€bHÓñ<_8 =?€B^Àb<_^¸‘i^¼Ht<_8 =?€B^Àb<_^¸‘i^¼H$€ZCÓx€| ¦| xN€!x A‚0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!8@8¡D8a_8ƒ›X,€rXT„ãxHÇé|}yÀ&@‚<_„ãx€BL€bHÉIØ “¡P@‚X!¼ƒZLt8 €IX=?“A¨“A¤‘!¸"€A´“A “Aœ“Ax“A˜“A”“AX€A°‘"X IÓxKÿø(£ëxHÇÁ€AP|~x"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!/ž;€“P@ž$ƒZLt<_A¸IÓx“A¨“A¤“A H Œ<_8b÷˜A¸Ký8aL8T8¡PKý]/ƒ@œ(ƒZLt€A¼8 “A¨“A¤"X€I“A H(HËm/ƒaX@ž(ƒZLt€A¼8 “A¨“A¤"X€I“A Hô€V8Bÿÿ/‚V@ž€V~óx€| ¦| xN€!<Ÿ~£«x‚ÁX“X€„X”HÆ9/ƒaX@ž4€A¼8"X€I!´ X!°IX !X/‰@ž\H„HÌ|}yA‚ÿÈ€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!9Áp¤ëx“X}ÃsxHÆíH|€I8Bÿÿ/‚I@ž€aX€C€| ¦| xN€!ƒ›X,€rX8X„ãxHÅe|}yÀ&@‚<_„ãx€BL€bHÆÅØ “¡XA‚t£ëxHÅ‘€AX|~x"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!/ž8XAž?œ€A¸8b÷˜Ký8aX8\8¡`KýQ/ƒ@œ(ƒZLt€A¼8“A¨“A¤"X€I“A H9Áp<Ÿ8„GÄ}ÃsxHÅÑ€AÀ€bX<_ƒ¢Yd¤ëxHÄy|{y€&@‚<_¤ëx€BL€bHÅÙ˜ “adA‚¤<ŸcÛx€„Y0HÄ=/ƒahAžˆ€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!; 8`“¡dHÄ‘/ƒadAž<=?i[¬€K8BK)[¬€Ad‘" €ah€dHǹ/ƒal@žHƒZLt€A¼8“A¨“A¤"X€I“A !´“Aœ“Ax“A˜ X!°IX BÓxH>8€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“¡h€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“¡d€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!“¡l€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!“¡X€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!“¡\€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!“¡`€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!; €AT“¡L"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!“¡T€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!“¡P;€<Ÿ€aH€„[@HÆý/ƒah@žX=?<_8‘!°=?A¼€BX‘!´:Lt‘!¨"€A´X€A¨A¤€A°‘"X !P/‰@žPHx8`HÁµ/ƒadAžP€h=;` <€cLx+Z €I8BIkZ €Ad‘b“ah€dHÄÉ/ƒal@žL:Lt<_8A¼€BX‘!¨=?‘!°=?‘!´"€A¨A¤€A´X€A°‘"X KÿÿL€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!ƒºLt“ad€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<Ÿ€Al8~ã»x€„Y`lA¨H¿ñ/ƒaXAžL8`HÀ}/ƒa\Až8!¨€I8BI!\€A¨I €aX€\Hé/ƒa`@žH=?<_“¡¤8‘!°=?A¼€BX‘!´"``€A´X€A°‘"X Kÿþ0€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!;`€A\“aX"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!€]“a\8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!<Ÿ€A`€a¨“a`€„XÜA¤H¾¥/ƒaLAž8€H‘/ƒaT@ž<<_=?8‘!°A¼"X<_A´€I!´ X!°IX Kÿý$€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!“aL€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!“aTHø```€I8Bÿÿ/‚I@ž€aP€C€| ¦| xN€!!h8P/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!!d8h/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!!l8d/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!X8l/‰Až0€I8Bÿÿ/‚I@ž€aX€C€| ¦| xN€!!\8X/‰Až0€I8Bÿÿ/‚I@ž€a\€C€| ¦| xN€!!`8\/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!!L8`/‰Až0€I8Bÿÿ/‚I@ž€aL€C€| ¦| xN€!!T8L/‰Až0€I8Bÿÿ/‚I@ž€aT€C€| ¦| xN€!<_; €BLÄ“¡T€bH»ñ/ƒ@ž0ƒZLt<_A¸“A IÓx‘!œ‘!x‘!˜‘!”‘!Kÿì<_8b÷˜A¸Küüí8aP8h8¡dKüø½/ƒ@œ(ƒZLt€A¼8“A “Aœ"X€I“AxH4H¿Í/ƒal@ž@ƒZLt€A¼8“A “Aœ"X€I“Ax!´“A˜ X!°IX BÓxH5”!¤€I8Bÿÿ/‚I@ž€I€a¤€| ¦| xN€!€Al“¡lA¤€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!“¡P€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“¡h€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“¡d?€a¤€›YH¹Ý/ƒaXAžø8`ÿÿH½‰/ƒa\Ažä8`HºU/ƒa`AžÐ=?; iY@€K8BK€A`)Y@‘" €\€A`“¡\€aX€`H½i/ƒaLAž„€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!“¡X€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!€aL“¡`H¼-|~xH¸e|}yA‚LƒZLt<_€BX“A “AœIÓx“Ax€<_“A˜“A”“AA¸“AŒ<_X 8Hˆ€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!€›Y€a¤“¡LH¸U/ƒaTAžô8`ÿÿH¼/ƒalAžà8`H¸Í/ƒaPAžÌ=?iYà€K8BK€AP)Yà‘" €l€AP“¡l€aT€PH»å/ƒahAž„€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!“¡T€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!€ah“¡PHº©|{xH¶á/ƒAžLƒZLt<_€BX“A “AœIÓx“Ax€<_“A˜“A”“AA¸“AŒ<_X 8H€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!€a<8hH¼ñ/ƒ@žLƒZLt<_€BX“A “AœIÓx“Ax€<_“A˜“A”“AA¸“AŒ<_X 8Ht<Ÿ8„?°H³Õ8€|rx<€c[tKüö1/ƒad@ždƒZLt<_€BX“A “AœIÓx“Ax€“A˜<_“A”“A“AŒA¸<_X 8 <_‘!ˆ‘!„‘!€‘!|XH1ƒºLt€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€Ad<Ÿ: €„Yä’!d|CxA Hµ¥/ƒa\Až˜<Ÿ€„X°Hµ/ƒaXAž€€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!8`’!\Hµå/ƒa`Až8!H€I8BI€H€A` €aX€`H¹/ƒaL@žX“¡œ“¡x<_“¡˜“¡”€BX€<_“¡“¡Œ“¡ˆA¸“¡„“¡€“¡|<_X 8!<_XH/À€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!: €A`’!X"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!€]’!`8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€AL: ’!L|CxAœHº!,@‚L“¡x“¡˜<_“¡”“¡€BX€<_“¡Œ“¡ˆ“¡„A¸“¡€“¡|<_X 8"Hx9¡ p|dx}£kxH´á/’@žl<€<€c[dH¸‰/ƒalAžD8`H´/ƒaTAž0€l<_€BLÄ ’Al€b€TH·I/ƒaP@žH“¡x“¡˜<_“¡”“¡€BX€<_“¡Œ“¡ˆ“¡„A¸“¡€“¡|<_X H¼€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!€aP8€8 ’ATKüé€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!“¡x’AP<_“¡˜“¡”“¡“¡Œ“¡ˆ“¡„€BX"<_“¡€“¡|A¸<_‘"X 8$<_XH-@<ŸÃxÇóxhÛx8„H,‰ãx~C“x}¥kx}ÊsxH± /ƒ@œ€<€<€c[°H¶ñ/ƒahAžD8`H²}/ƒadAž0€h<_€BLÄ ’!h€b€dHµ±/ƒa\@žX=?<_“¡x“¡˜‘!°=?A¼8l€BX‘!´"<_¬8(“¡”A¸€A°‘"X !´ XHX€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!€a\8€8 ’!dKüç]€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!<_8l’!\“¡x“¡˜“¡”"XA¼<_¬8(A°<_A´<_A¸€I!´ X!°IX HŒ=?)LБ!x€I8BI=9)ÿÿ/‰‘=@ž€]£ëx€| ¦| xN€!<Ÿ~óx€„YLH°1/ƒaXAž`8€H´/ƒa`AžL€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!€a`’!XH¯u/ƒaL@žT=?<_“¡˜8l‘!°=?A¼€BX‘!´"<_¬8*“¡”A¸€A°‘"X !´ XH€€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!<_=?’!`“¡˜ƒÂLhéL: >€aLH³a/ƒal@¾H®‘|}y@‚|H 8H®¡/ƒaTAžh€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!€aT’!lH²ù||y &@‚H®)/ƒ@ž€~8õ0H¬u¸ “PA‚!˜€I8Bÿÿ/‚I@ž€I€a˜€| ¦| xN€!€AP€aT’!PA˜H²…||y &@‚H­µ/ƒ@ž€~8õ0H¬¸ “hA‚ !¤€I8Bÿÿ/‚I@ž€I€a¤€| ¦| xN€!€Ah€aT’!hA¤H²|iyA¢<€I8Bÿÿ/‚I@ž€I€| ¦| xN€!€~8õ0H«uHH­ /ƒA¾¤Hô€aT€C€| ¦| xN€!€a˜;€“TH³y,A‚|dx}£kxH®…<Ÿ€a¤€„X”H­5/ƒad@žd<_=?8-‘!°A¼"X<_A´€I!´ X!°IX !\/‰@žtHœ€AT"9)ÿÿ/‰‘"@žÿhKÿÿLH²å|}yA‚ÿ˜€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!¤ëx}Ãsx“dH­½H$€I8Bÿÿ/‚I@ž€a\€C€| ¦| xN€!!X’!\/‰Až0€I8Bÿÿ/‚I@ž€aX€C€| ¦| xN€!!`’!X/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!!l’!`/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!P’!l/‰Až0€I8Bÿÿ/‚I@ž€aP€C€| ¦| xN€!!h’!P/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!!T’!h/‰Až0€I8Bÿÿ/‚I@ž€aT€C€| ¦| xN€!!d’!T/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!<_<8ƒbX,€cXddÛxHª‰|}y€&@‚€odÛxH«ñ˜ “¡\A‚€£ëxHª½€A\|}x"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!/8\Ažp<_9!l8b÷˜A¸‘!¬Küë¡€¡¬8aX8`Küçq/ƒAœ0<Ÿ}Ãsx8„GèH«€axHªQ/ƒAœ<@ž ƒxHÄ=?ƒ LÌ€X8BX€Ax"9)ÿÿ/‰‘"@ž !x€I}#Kx€| ¦| xN€!€AÀ€bX<_ƒ‚Yd„ãxH©]|}y`&@‚€o„ãxHªÅx “¡PA‚Ø<Ÿ£ëx€„Y0H©)/ƒahAž¼€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!; 8`“¡PH©}/ƒaTAžp=?i[´€K8BK)[´€AT‘" €ah€TH¬¥/ƒadAž8€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“¡h€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!“¡T€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“¡d€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!; €A`“¡X"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!“¡`€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!“¡l“x<Ÿ~C“x}¥kx}Æsx8„HH¦A/ƒ@œø<€<€c[°H¬)/ƒa\AžH8`H§µ/ƒaPAž4€\<_;À€BLÄ “Á\€b€PHªå/ƒah@žD:Lt<_8lA¼€BX‘!”=?‘!°=?‘!´"<_¬8:A¸H €AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!€ah8€8 “ÁPKüÜ¥€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!:Lt<_8l“ÁhA¼¬8:‘!”"X<_A°<_A´<_A¸€I!´ X!°IX HØ€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!<Ÿ~ƒ£x“¡L€„YPH¥/ƒaTAž`8€H©y/ƒadAžL€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!€ad“¡TH¤Ñ/ƒaX@žD:Lt<_8lA¼€BX‘!”=?‘!°=?‘!´"<_¬8;A¸H ì€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!€ZLt“¡d: =ÿA”<_‚Lh€aXH¨Ñ/ƒa`@¾H¤|}y@‚ˆHH¤/ƒalAž 4€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!€al’!`H¨i||y &@‚H£™/ƒ@ž€p8õ0H¡å¸ “\A‚ È!˜€I8Bÿÿ/‚I@ž€I€a˜€| ¦| xN€!€A\€al’!\A˜H§õ||y &@‚H£%/ƒ@ž€p8õ0H¡q¸ “PA‚ T!”€I8Bÿÿ/‚I@ž€I€a”€| ¦| xN€!€AP€al’!PA”H§|iyA¢<€I8Bÿÿ/‚I@ž€I€| ¦| xN€!€p8õ0H åHH¢}/ƒA¾ˆ<_=?‘!°|IxA¼H ¼€al€C€| ¦| xN€!€a˜’!lH¨Ù,A‚ ¸|dx}£kxH£å!”€I€B4/‚Až@€ /€Až4}#Kx8€H¤¹||xHp€Al"9)ÿÿ/‰‘"@žÿ˜Kÿÿ|8`;€H¦ |}yA‚@€a”¤ëxH¨5€]||x8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!/œ“hAž 8ƒãxH¥1|xxH¡i|}y@‚ €Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“¡h!”€I€B4/‚Až$€ /€Až}#Kx8€H£Á||xHT8`;€H¥-|}yA‚@€a”¤ëxH§Y€]||x8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!/œ“LAž ”ƒãxH¤U|{xH |}y@‚ |€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!“¡L!”€I€B4/‚Až$€ /€Až}#Kx8€H¢å||xHT8`;€H¤Q|}yA‚@€a”¤ëxH¦}€]||x8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!/œ“TAž ðƒãxH£y||xHŸ±|}y@‚ Ø€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!<ŸÃx“¡TgÛx8„Hˆãx~C“x}¥kxHžÕ/ƒ@œû8<€<€c[°H¤½/ƒadAžD8`H I/ƒa`Až0€d<_€BLÄ “¡d€b€`H£}/ƒa\@ž<=?<_8l‘!°=?A¼€BX‘!´=?‘!¸"¬8BH €A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!€a\8€8 “¡`KüÕE€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!<_=?“¡\8l‘!°A¼"X¬<_8BA´<_A¸€I!´ X!°IX H€€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!<Ÿ€aH“¡X€„[0H£µ/ƒaP@žH<_=?8D‘!°A¼"X<_A´€I!´ X!°IX !L/‰@žìH8`Hž}/ƒalAžÿ¬€P= <€cLx+Z€I8BIkZ€Al‘b“¡P€lH¡•/ƒahAžÿd€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!“¡l!¨€I8Bÿÿ/‚I@ž€I€a¨€| ¦| xN€!€Ah“¡hA¨€a¨Hœ±/ƒa`@ž H ´€I8Bÿÿ/‚I@ž€aL€C€| ¦| xN€!!T8L/‰Až0€I8Bÿÿ/‚I@ž€aT€C€| ¦| xN€!!d8T/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!!`8d/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!!\8`/‰Až0€I8Bÿÿ/‚I@ž€a\€C€| ¦| xN€!!X8\/‰Až0€I8Bÿÿ/‚I@ž€aX€C€| ¦| xN€!!P8X/‰Až0€I8Bÿÿ/‚I@ž€aP€C€| ¦| xN€!!l8P/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!h8l/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!<_; €BLÄ“¡h€bH›/ƒAž¬<_8b÷˜A¸KüÜE8aL8T8¡dKüØ/ƒ@œ08l€A¼¬8E"X€I!´ X!°IX Hh<Ÿ€aH€„X`HŸÑ/ƒa`Až`8`HšÝ/ƒa\AžL€`= <€cLx+Z€I8BIkZ€A\‘b“¡`€\Hõ/ƒaX@ž08l€A¼¬8F"X€I!´ X!°IX HÄ€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!“¡\!¨€I8Bÿÿ/‚I@ž€I€a¨€| ¦| xN€!€AX“¡XA¨€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!“¡L€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!“¡T€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“¡dKÿû˜€ZLt=?8l‘!¸¬A”H˜:Lt<_A¼‘!”|IxH€ZLt=?‘!¼A”€IX=?8l‘!°=?‘!´"<_¬8*A¸H@€ZLt=?8l‘!¼A”€IX=?‘!°=?‘!´"<_¬8+A¸€A´X€A°‘"X Hð!¼8l€IX:Lt‘!”=?‘!¸"¬8.Hx€A¼8."X€ZLtA”€I!´ X!°IX H˜€A¼80"X€ZLtA”€I!´ X!°IX Hl!¼“x82€IX:Lt‘!”"€A´X€A°‘"X H<=?<_‘!¼A°€IX=?8l‘!´=?‘!¸"¬8;Hà=?<_8l‘!¼A°€IX=?‘!´=?‘!¸"¬8H8=?<_8l‘!¼A°€IX=?‘!´=?‘!¸"¬8?€A´X€A°‘"X H=?8l‘!¸¬!P/‰Až0€I8Bÿÿ/‚I@ž€aP€C€| ¦| xN€!!l8P/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!h8l/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!!`8h/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!!\8`/‰Až0€I8Bÿÿ/‚I@ž€a\€C€| ¦| xN€!!X8\/‰Až0€I8Bÿÿ/‚I@ž€aX€C€| ¦| xN€!!L8X/‰Až0€I8Bÿÿ/‚I@ž€aL€C€| ¦| xN€!!T8L/‰Až0€I8Bÿÿ/‚I@ž€aT€C€| ¦| xN€!!d8T/‰Až0€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!€A¸8d8b÷˜KüÕQ€¬8aP8¡hKüÑ!/ƒ@œDƒZLt€A¼8G“A“AŒ"X€I!´“Aˆ“A„“A€“A| X!°IX Hh~C“xH‘ñ€aP€l€¡hKüÉ‘ƒZLt!¼8I“A“AŒ€IX"€A´“Aˆ“A„“A€“A|X€A°‘"X H=?<_8M‘!´€BX"€A´X<_‘"X HÔ=?<_8P‘!´€BX"€A´X<_‘"X H¨=?<_8Q‘!´€BX"€A´X<_‘"X H|=?<_8R‘!´€BX"€A´X<_‘"X HP=?<_8K‘!´:Lt€BX‘!"€A´X€AAŒ<_‘"X !Œ‘!ˆ‘!„‘!€‘!|!T/‰@žtHœ€ZLtAAŒAˆA„A€A|€a`H–/ƒa\@¾€Ý <Ÿ<¿€BùÜ8„“`8¥¤ä€é €bH|u<_ƒ¼ù 8Å€B<³ëx"HX€Y#Ëx€| ¦| xN€!```€Z "0ƒ)Ÿ>¿>_: Û`: €Zi(8B}߃Öë08BZ>9)‘>HtE,a8@‚HN<_8ãØóxÕóx€BöÌ×óxÙóx"<_‘"öÈ<_öÄH ```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`ƒ8“¡8Hs¹,a8@‚?>€]öÌ€’PöÄöÈHä€?>8ð=öÌ€IöÄQöÈH„€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!’a8Ãx€Z "(}) Hi©/ƒ@œÀ?¿>?>8ñ=öÌ€IöÄQöÈ```!@/‰Až8€I8Bÿÿ/‚I@ž$€a@€C€| ¦| xN€!``!8’a@/‰Až4€I8Bÿÿ/‚I@ž €a8€C€| ¦| xN€!`<_;À€Bë,“Á8€bHi,aÿ<_£ëx=ƒ7ÙÀ€Båp<¿<ßÄóx8át;À8¥…x8Æ×P9LZ“:09!P9AT€Y8BY“:4``€Y8BY“:8€Y8BY“:<<_“ÁH“Át“Á`“Ád“Áh“Ál“Ápƒ¹€éT<_kéX€Bé\;½T8X‘aX“¹A\8A\8AT€Z>ß8Ëx8BZ!t€I8BIa\€K8BKƒ¶äØ€YƒÁt/8BY@ž,<_<Ÿ€BÙð8„sl€bH\EHl```€~Až¤ëxHda/ƒAžƒÁt€\€À@žØH|<_>€Ý <Ÿ<¿€BÙü8„s€8¥|”€é €bH[Ù“€<_:€8½€Bå\,ÃxÃx:`À&€&"<_“|“x‘"åX<_åTH9<>$€I8BIa\€K8Bÿÿ/‚K@ž€a\€C€| ¦| xN€!ƒÁt€$\```€^8B^:0€I8Bÿÿ/‚I@ž €z0€C€| ¦| xN€!`€t0!ti<€K8BK:4€I8Bÿÿ/‚I@ž €z4€C€| ¦| xN€!`€At€<4€ALZ €P€AXZ$!\€I8BIz8€K8Bÿÿ/‚K@ž(€z8€C€| ¦| xN€!```€\<Ÿ8€At€„æ8€b †}j| J|H}(J|¤XP}P|„P|çHP@ž „8Až€Q~#‹x€| ¦| xN€!€€Y ‚AžL;œ;Þ›à@žÿP:µ€A¨8BAAž!KÿùÔ:`€/€Ah<_<ƒ¢æø€cåL¤ëxH?Õ|tyÀ&@‚X<_/“¤ëx€BÙÜ€&Wœà€bHA)‚÷ÙÀ<_8=?€Bå\’ဒá|b<_’áxåT‘iåXHd<Ÿ€„åH?i/ƒaH@ž(‚÷ÙÀ<_,€Bå\€&’ဒá|"H¤€T8Bÿÿ/‚T@ž€T~ƒ£x€| ¦| xN€!8`H?¥/ƒa`Až<=?iè0€K8BK)è0€A`‘" €aH€`HBÍ/ƒad@žH‚÷ÙÀ<_,:€€Bå\À&’ဒá|€&"<_8’áx‘"åX<_åTHl€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!;À€A`“ÁH"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!€ad8€8 “Á`KütQ€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!‚÷ÙÀ“Ád<_,8€Bå\:€À&’ဒá|’áx€&"<_åT<_‘"åXHx€X~$‹xÃx€ | ¦| xN€!<ŸÃx€„æÌH=]/ƒahAžh8€HAI/ƒalAžT€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!€al8hH@=|}xH9à€At€æ"<€iH;ñ|sy€&A‚\€Z,|O€bH?•,apA‚X8`Hß“Áh€–ædA|€At"<€iH2 ,al@‚XN=?<_“¡x8.‘!„=?AŒ€Bå\‘!ˆ``Aˆ" åT€A„‘"åX!d/‰@žLHt8`H2A,ap@‚N<_|IxAŒHD!\€I8BI€Ap€\ €al€pH5Y|byAx@‚@=?.‘!Œ€Iå\=_=?“¡x8.;À‘A„‘!ˆ"Aˆ åTKÿÿT€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!;€€Ap“l"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!€]“p8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€z H41.|~xA’,€zH4/ƒaHAž8`H0é/ƒa`@ž8<_=?=_8/‘!„AŒ‘Aˆ"å\€I!„ åTIåXKÿþT“à €H€A`€a|€x“H€¡`H0å/ƒ@œD<_=_=?;À‘A„AŒ8/‘!ˆ€Bå\."Aˆ€A„ åT‘"åXKÿýè€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!“`HÌ€I8Bÿÿ/‚I@ž€ad€C€| ¦| xN€!!h8d/‰Až0€I8Bÿÿ/‚I@ž€ah€C€| ¦| xN€!!l8h/‰Až0€I8Bÿÿ/‚I@ž€al€C€| ¦| xN€!!p8l/‰Až0€I8Bÿÿ/‚I@ž€ap€C€| ¦| xN€!8pA’0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!!H/‰Až0€I8Bÿÿ/‚I@ž€aH€C€| ¦| xN€!!`8H/‰Až0€I8Bÿÿ/‚I@ž€a`€C€| ¦| xN€!<_;À€BÙ¼“Á`€bH.,@‚À&:`:€€&H „<8c…€Küo)8ad8h8¡lKüjù/ƒ@œ: €At€æ"<€iH,q,apA‚¸€Z,|Bª€bH0|sy€&A‚È8`H,á|tyÀ&A‚Ð’t ~„£x€apH0%,aHA‚Ø€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!8p€T8Bÿÿ/‚T@ž€T~ƒ£x€| ¦| xN€!€aHH,-.A€€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!8H@’¼€Z,|Bª€b H/,a`A‚X€Z,|Bª€bH.ý,adA‚<8`H+É,ahA‚(€`:à !d€Ah‘"’á`’ád€At€–æd"<€iH*é,alA‚è€Z,|Bª€bH.|sy€&A‚8`H+Y,apA‚’c €al€pH.|tyÀ&A‚€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!’ál€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!€¡h€a|~„£x’ápH+/ƒAœ¬€T8Bÿÿ/‚T@ž€T~ƒ£x€| ¦| xN€!€Ah"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!’áh;½:µ›è@žý €a|H*/ƒ@œ4:€<_:`86,€Bå\À&"<_€&‘"åXH”@ž ;ÀHT<_<ƒ¢æø€cåL¤ëxH)=||yÀ&@‚<_¤ëx€BÙÜ€bH*Ø “HA‚t<Ÿƒãx€„å¼H),a`A‚T€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!€a`; 8€“¡HH,±,ad@‚0À&<_Üóx:`:€€Bå\87"<_‘"åXH¬€A`"9)ÿÿ/‰‘"@ž€a`€C€| ¦| xN€!“¡`€Z<"9)ÿÿ/‰‘"@ž€z<€C€| ¦| xN€!€d8`<“¡dH(¡|sy€&@‚ À&HL!|€a€~d›x€I8BI‘3 :<€I8BI€<H+µ,al@‚ À&<_:€88€Bå\"H€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!;À“¡lH$‚÷ÙÀ!Œ,8÷A„:€À&’ကIå\€&"€Aˆ’á|’áx‘*åXåTHГ€!Œ,8úA„:€À&€Iå\€&"€Aˆ“|“x‘*åXåTH“€!Œ,8ùA„:€À&€Iå\€&"€Aˆ“|“x‘*åXåTHPÀ&AŒ“€*å\H<“€AŒ:€,*å\À&€I Ãx“|H$À&“€AŒ*å\“|:€€I ÃxA„8ù‘!xJåX€AˆåTHØ`<_,:€€BÚÀ&€b€&H%¥‚÷ÙÀ!Œ8’ကIå\~ê»x"’á|€Aˆ‘AxA„åT‘*åXH|À&<_‚÷ÙÀ€Bå\’á€HÀ&‚÷ÙÀ<_€Bå\’ဒá|:€"’áxHˆ‚÷ÙÀ<_€Bå\’ဒá|b’áxH ‚÷ÙÀ<_€Bå\’ဒá|b’áx8<_=?åT‘iåXHè‚÷ÙÀ<_:€:`€Bå\,’á€À&€&"’á|’áx<_8‘"åX<_åTH À&<_:`:€83€&€Bå\"<_‘"åXH¸À&<_:€83€Bå\"Hð<_83=?€Bå\b<_åT‘iåXH4€&<_:`83€Bå\"H°:€<_:`83,€Bå\À&"<_€&‘"åXH,À&<_:`:€84€&€Bå\"<_‘"åX<_åTH´À&<_:€€Bå\"H0À&<_:€€Bå\"H€&<_:`€Bå\"84<_åT<_‘"åXHX:`<_84=?/“€Bå\€&Wœàb<_åT‘iåXH$À&‚÷ÙÀ:`:€€&’ဒá|’áx!`/‰Až8€I8Bÿÿ/‚I@ž$€a`€C€| ¦| xN€!``!d/‰Až8€I8Bÿÿ/‚I@ž$€ad€C€| ¦| xN€!``!h/‰Až8€I8Bÿÿ/‚I@ž$€ah€C€| ¦| xN€!``!l/‰Až8€I8Bÿÿ/‚I@ž$€al€C€| ¦| xN€!``˜ A‚<€S8Bÿÿ/‚S@ž(€S~c›x€| ¦| xN€!```!p/‰Až8€I8Bÿÿ/‚I@ž$€ap€C€| ¦| xN€!``Ø A‚<€T8Bÿÿ/‚T@ž(€T~ƒ£x€| ¦| xN€!```!H/‰Až8€I8Bÿÿ/‚I@ž$€aH€C€| ¦| xN€!``<;Àÿÿ8c…œKüb¥€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€Q8Bÿÿ/‚Q@ž €Q~#‹x€| ¦| xN€!`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€R8Bÿÿ/‚R@ž €R~C“x€| ¦| xN€!`!€€I8Bÿÿ/‚I@ž€I€a€€| ¦| xN€!!|€I8Bÿÿ/‚I@ž€I€a|€| ¦| xN€!!x€I8Bÿÿ/‚I@ž€I€ax€| ¦| xN€!€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€At"9)ÿÿ/‰‘"@ž€at€C€| ¦| xN€!€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!/ž@œl€Z8Bÿÿ/‚Z@ž(€ZCÓx;@€| ¦| xN€!H8`;@H,€A`"9)ÿÿ/‰‘"@žÇ\KÿÇ@```8!ðCÓx€a¹¡ÿ´|¦}p N€ |@&|¦½¡ÿ´8À ;À|txBŸ8à9 è¦A”!þÐ<_>ÿ????_?‚÷©d?Ÿ?¿ƒ©hƒ9©l=_=ƒZ©pƒ{©tƒœ©xƒ½©|:—dJ©€k©„L¡P8aL8P’ᤓ\“!`“Ad“ah“l“¡p‘At‘ax“Á|“Á„“Áˆ“ÁŒ“Á“Á˜“Áœ“Á “ÁX~ųx9|KüVý/ƒ@œHÀ8h8Al€aL€P<¿~Ƴx88pA<8á¤@8At8x8¥F9\9!`ADH9AdH±/ƒ@ž¨!L/‰Až0€I8Bÿÿ/‚I@ž€aL€C€| ¦| xN€!!P/‰Až0€I8Bÿÿ/‚I@ž€aP€C€| ¦| xN€!!|/‰@žHŽè€I8Bÿÿ/‚IAžHŽÐ€a|;ÀHލ4ad>ƒ³™¸9)‘4€K8BK!h€I8BIal€K8BK!p€I8BIat€K8BKAx€J8BJ=9) ‘=t0K<€J8BJ=9)ÿÿ/‰‘=@ž€]£ëx€| ¦| xN€!€T0€al‚¢° W½€>“a¬“a¨<_8ëoÛxpÛx€B¥T:@qÛx"<_‘"¥P<_¥LH…(`!´€I8Bÿÿ/‚I@ž€I€a´€| ¦| xN€!€Aˆ;À<Ÿ“Áˆ€„¦TA´€uHµ,aˆA‚o88`HA,aŒA‚oh!´€I8BI!Œa´‘i €aˆ€ŒHm,aA‚ox€Aˆ"9)ÿÿ/‰‘"@ž(€aˆ€C€| ¦| xN€!```“Áˆ€AŒ"9)ÿÿ/‰‘"@ž(€aŒ€C€| ¦| xN€!```“ÁŒ!°€I8Bÿÿ/‚I@ž(€I€a°€| ¦| xN€!```€A< ÿ8€“Á`¥ÿÿ|CxA°H¥,aˆA‚nÔ!°€I€B4/‚Až$€ /€Až}#Kx8€H|}xHT8`; Hù||yA‚@€a°„ãxH%€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!,“¡ŒA‚nˆ€¡ˆ€a¸¤ëxHÙ/ƒAœn´€AŒ"9)ÿÿ/‰‘"@ž(€aŒ€C€| ¦| xN€!```; €Aˆ“¡Œ"9)ÿÿ/‰‘"@ž$€aˆ€C€| ¦| xN€!``“¡ˆKÿüÜ€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!8„HÑ,a@‚TN‚s™¸<_8î:@€B¥T’a¬’a¨~o›x~p›x~q›x"<_‘"¥P<_¥LHà```ƒÓ™¸€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€€A/€A¬8@€A@ü=?=“Á¨:À‚ ™´=?=ÿÍóx: ø‘aÐ:à‘!Ì9À;€``€u€¦ˆH,aˆA‚m4€T(|Bâ€bH½,aŒA‚mP8`H‰,a„A‚mt€Œ;À “ÁŒ€aˆ€„HÁ,aA‚m„€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!“Áˆ€A„"9)ÿÿ/‰‘"@ž(€a„€C€| ¦| xN€!```€a“Á„H¹/ƒa”Aœm4€A"9)ÿÿ/‰‘"@ž$€a€C€| ¦| xN€!``€”“Á/€@žd€h4(}¾kx|jx||J\H.1`ÿÿ|Kƒ#ƒc ƒ/‚A”AžÜ!¸€c€I€B4/‚AžD€ /€Až8|dx}#KxH½|~xHt€Aˆ"9)ÿÿ/‰‘"@žHt`;ÀH |}yA‚D€a¸¤ëxH9€]|~x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/ž“ÁŒ@ž@=?<_‘!À=?AÄ€B¥T‘!¼aÀ€’)¥L!Œ ¥P/‰@ž HLÃóxHU/ƒaˆAžÿ´€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!€aˆ’áŒH­|}yÀ&@‚(HÝ/ƒ@ž<_<Ÿ€B™¬8„Bt€bHØ “¡„A‚ÿ<£ëxHia”H¡|~y@‚ÿ$€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!€aˆ“Á„‚A”H|}yÀ&@‚(HI/ƒ@ž<_<Ÿ€B™¬8„Bt€bH‰Ø “¡A‚þ¨£ëxHÕa”H |~y@‚þ€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!“Á€aˆƒÁ”H…|iyA‚H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€B™¬8„Bt€bHÝKÿþHu/ƒ@žýøKÿýx€aˆ€C€| ¦| xN€!šð’áˆOÜàB|&Tÿþ/”@šˆHp``€I8Bÿÿ/‚I@ž €aŒ€C€| ¦| xN€!`!„’áŒ/‰Až4€I8Bÿÿ/‚I@ž €a„€C€| ¦| xN€!`!’á„/‰Až4€I8Bÿÿ/‚I@ž €a€C€| ¦| xN€!`!ˆ’á/‰Až4€I8Bÿÿ/‚I@ž €aˆ€C€| ¦| xN€!`€p’áˆH ,a”A‚{ <8cF KüQ18aŒ8„8¡KüM/ƒ@¼ø!Ä:@ó™¸8ùa¼.€I¥T}ð{x}ñ{x"€AÀ ¥L‘"¥PH{`™OÝèB|&Tÿþ”€”/€@ž š@œ|’zP~Z“x™ð|&T÷þ/”Ašè|ò4(PÙóxHà```€d|jx1`ÿÿ|K/‚A”Až¸€T€£~¤«x~ƒ£xfÛxÃx€| ¦| xN€!,aˆA‚gÄ!¨€I8Bÿÿ/‚I@ž€I€a¨€| ¦| xN€!€Aˆ€ad8ˆ|DxA¨H9/ƒaŒAž\!¨€I8Bÿÿ/‚I@ž€I€a¨€| ¦| xN€!€AŒCÓx; “¡ŒA¨H¥/ƒaŒ@¾ØHœ=?<_a„8‘!À=?AÄ€B¥T‘!¼/‹"`€A¼¥L€AÀ‘"¥PAž0€K8Bÿÿ/‚K@ž€a„€C€| ¦| xN€!!’á„/‰Až0€I8Bÿÿ/‚I@ž€a€C€| ¦| xN€!!ˆ’á/‰Až0€I8Bÿÿ/‚I@ž€aˆ€C€| ¦| xN€!!Œ’áˆ/‰Až0€I8Bÿÿ/‚I@ž€aŒ€C€| ¦| xN€!€p’áŒH ,a”A‚f<8cF KüN-8a„88¡ˆKüIý/ƒ@¼ ô!Ä:@ó™¸8a¼.€I¥T}ð{x}ñ{x"€AÀ ¥L‘"¥PHx\<_:@ó™¸8 €B¥T.}ð{x}ñ{x"<_‘"¥P<_¥LHx$!Ì€a¨€‰§ÄH õ,|dxa„A‚et€aŒH],aA‚e˜€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!“¡Œ€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!cÛx“¡„H!,|dxaˆA‚eP€aH ,aŒA‚et€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!“¡€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!€aŒ“¡ˆH a”H E/ƒ@že,€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!;À#ËxƒA”“ÁŒH9,a„A‚e€AЀa¨€‚§ÌH ],|dxaA‚e,€a„HÅ,aˆA‚eP€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!“Á„€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!Ãx“ÁH ‰,|dxaŒA‚e€aˆH q,a„A‚e,€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!“Áˆ€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!€a„“ÁŒH ua”H­|~y &@‚dà€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!€AÌ€a¨“Á„ƒ!”€‚§ÄHÙ,aA‚dÄH a”HA|~y@‚dè€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!€AЀa¨“Áƒa”€‚§ÌHq,aˆA‚dÔH ¡a”HÙ|~y@‚dø€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!4(ƒ”“ÁˆH4(``a¬})â€i€K€B4/‚Až$€ /€Až|dx}c[xH |~xHX;ÀH |}yA‚H€a¬¤ëxH ­€]|~x8Bÿÿ/‚]@ž$€]£ëx€| ¦| xN€!``/ž“ÁŒ@žD<_=?=8‘!ÀAÄ‘a¼"¥T€I!À ¥LI¥P!Œ/‰@žè€AŒ"9)ÿÿ/‰‘"@ž €aŒ€C€| ¦| xN€!`;Á”€aX€˜; Åóx“¡ŒHß™/ƒAœ>´€”!X @|”€I8Bÿÿ/‚I@ž(€aX€C€| ¦| xN€!```“¡X€A˜"9)ÿÿ/‰‘"@ž(€a˜€C€| ¦| xN€!```€”“¡˜/€Ažô€P€B4/‚Až$€ /€Až~ƒx8€HÜí|}xHT8`; HÞY||yA‚@~ƒx„ãxHà…€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ˆAž=°€O€B4/‚Až$€ /€Až}ã{x$ËxHÜa|}xHT#Ëx; HÝÍ||yA‚@}ã{x„ãxHßù€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ Až=H€]€B4/‚Až$€ /€Až£ëx8€HÛÕ||xHT8`;€HÝA|{yA‚@£ëxdÛxHßm€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“Až<à€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!€aˆ€Åóx; “¡ HÝ /ƒAœ<´€”!ˆ @|”€I8Bÿÿ/‚I@ž€aˆ€C€| ¦| xN€!“¡ˆ€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!€”“¡/€Až|€P€B4/‚Až$€ /€Až~ƒx8€HÚu|}xHT8`; HÛá||yA‚@~ƒx„ãxHÞ €\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡œAž;È€O€B4/‚Až$€ /€Až}ã{x$ËxHÙé|}xHT#Ëx; HÛU||yA‚@}ã{x„ãxHÝ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡„Až;`€]€B4/‚Až$€ /€Až£ëx8€HÙ]||xHT8`;€HÚÉ|{yA‚@£ëxdÛxHÜõ€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ŒAž:ø€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!’á„€P€B4/‚Až$€ /€Až~ƒx8€HØ|}xHT8`; HÚ ||yA‚@~ƒx„ãxHÜ5€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡XAž:\€O€B4/‚Až$€ /€Až}ã{x$ËxHØ|}xHT#Ëx; HÙ}||yA‚@}ã{x„ãxHÛ©€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až9ô€]€B4/‚Až$€ /€Až£ëx8€H×…||xHT8`;€HØñ|{yA‚@£ëxdÛxHÛ€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ Až9Œ€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!; 8`“¡˜HÕA/ƒaˆAž9d€œ !Œ€Aˆ‘"€X€Aˆ! €Aˆ‘"“¡ “¡œ“¡Œ“¡X€O€B4/‚Až$€ /€Až}ã{xÃxHÖq|}xHTÃx; H×Ý||yA‚@}ã{x„ãxHÚ €\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡Až8À€]€B4/‚Až$€ /€Až£ëx8€HÕå||xHT8`;€H×Q|{yA‚@£ëxdÛxHÙ}€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“„Až8X€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!’ს„ƒaˆ€]€B4/‚Až(€ /€Až£ëxeÛx8€ÿÿHÕY|}xHT8`ÿÿHÖ‰||yA‚L£ëxeÛx„ãxHÓ±€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/@¼(<_81€B¥T"<_¥L‘.¥PH>x`€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!; €Aˆ“¡„"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!“¡ˆH¨€O€B4/‚Až$€ /€Až}ã{xÃxHÓý|}xHTÃx; HÕi||yA‚@}ã{x„ãxHו€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až6˜€]€B4/‚Až$€ /€Až£ëx8€HÓq||xHT8`;€HÔÝ|{yA‚@£ëxdÛxH× €[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“œAž60€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!<Ÿ€aœ; €„¥ð“¡˜HÐ…/ƒaŒAž6€Aœ"9)ÿÿ/‰‘"@ž€aœ€C€| ¦| xN€!“¡œ€O€B4/‚Až$€ /€Až}ã{x$ËxHÒ]|}xHT#Ëx; HÓÉ||yA‚@}ã{x„ãxHÕõ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡XAž5d£ëx8€8 HÖÉ/ƒa Až5l€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!; 8`“¡XHÏý/ƒ|bxaAž5@€ €m™ä “¡ €HÓ5/ƒaˆAž5@€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!8`“¡HÏ/ƒa„Až5€ˆ “¡ˆ€aŒ€„HÒÉ/ƒa˜Až5€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!“¡Œ€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!“¡„€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!“¡˜Hà€I8Bÿÿ/‚I@ž€a€C€| ¦| xN€!!œ’á/‰Až0€I8Bÿÿ/‚I@ž€aœ€C€| ¦| xN€!!„’áœ/‰Až0€I8Bÿÿ/‚I@ž€a„€C€| ¦| xN€!!˜’á„/‰Až0€I8Bÿÿ/‚I@ž€a˜€C€| ¦| xN€!!Œ’á˜/‰Až0€I8Bÿÿ/‚I@ž€aŒ€C€| ¦| xN€!! ’áŒ/‰Až0€I8Bÿÿ/‚I@ž€a €C€| ¦| xN€!!ˆ’á /‰Až0€I8Bÿÿ/‚I@ž€aˆ€C€| ¦| xN€!<_’ሀB™ô€bHÌÕ/ƒa”Až8ˆ<8cF Kü ý8a8œ8¡„Kü Í/ƒAœ2È€O€B4/‚Až$€ /€Až}ã{xÃxHÎ]|}xHTÃx; HÏÉ||yA‚@}ã{x„ãxHÑõ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až2`€]€B4/‚Až$€ /€Až£ëx8€HÍÑ||xHT8`;€HÏ=|{yA‚@£ëxdÛxHÑi€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ŒAž1ø€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!’ᘀO€B4/‚Až$€ /€Až}ã{x$ËxHÍ|}xHT#Ëx; HÎ}||yA‚@}ã{x„ãxHЩ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ Až1\€]€B4/‚Až$€ /€Až£ëx8€HÌ…||xHT8`;€HÍñ|{yA‚@£ëxdÛxHЀ[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ˆAž0ô€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!€aŒ€ˆ; €¡È“¡ H͹/ƒAœ0È€€!Œ @|€€I8Bÿÿ/‚I@ž€aŒ€C€| ¦| xN€!“¡Œ€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!€€“¡ˆ/€Až œ€O€B4/‚Až$€ /€Až}ã{xÃxHË%|}xHTÃx; HÌ‘||yA‚@}ã{x„ãxHν€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až/Ü€]€B4/‚Až$€ /€Až£ëx8€HÊ™||xHT8`;€HÌ|{yA‚@£ëxdÛxHÎ1€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ Až/t€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!’ᘀO€B4/‚Až$€ /€Až}ã{x$ËxHÉÙ|}xHT#Ëx; HËE||yA‚@}ã{x„ãxHÍq€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ŒAž.Ø€]€B4/‚Až$€ /€Až£ëx8€HÉM||xHT8`;€Hʹ|{yA‚@£ëxdÛxHÌå€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ˆAž.p€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!€a €ˆ; €¡È“¡ŒHÊ/ƒAœ.D€€!  @|€€I8Bÿÿ/‚I@ž€a €C€| ¦| xN€!“¡ €Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!€€“¡ˆ/€Ažd€O€B4/‚Až$€ /€Až}ã{xÃxHÇí|}xHTÃx; HÉY||yA‚@}ã{x„ãxHË…€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až-X€]€B4/‚Až$€ /€Až£ëx8€HÇa||xHT8`;€HÈÍ|{yA‚@£ëxdÛxHÊù€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ŒAž,ð€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!’ᘀO€B4/‚Až$€ /€Až}ã{x$ËxHÆ¡|}xHT#Ëx; HÈ ||yA‚@}ã{x„ãxHÊ9€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ Až,T€]€B4/‚Až$€ /€Až£ëx8€HÆ||xHT8`;€HÇ|{yA‚@£ëxdÛxHÉ­€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ˆAž+ì€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!’á €O€B4/‚Až$€ /€Až}ã{xÃxHÅU|}xHTÃx; HÆÁ||yA‚@}ã{x„ãxHÈí€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až+P€]€B4/‚Až$€ /€Až£ëx8€HÄÉ||xHT8`;€HÆ5|{yA‚@£ëxdÛxHÈa€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“ Až*è€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!’ᘀO€B4/‚Až$€ /€Až}ã{x$ËxHÄ |}xHT#Ëx; HÅu||yA‚@}ã{x„ãxHÇ¡€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡˜Až*L€]€B4/‚Až$€ /€Až£ëx8€HÃ}||xHT8`;€HÄé|{yA‚@£ëxdÛxHÇ€[||x8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!/œ“XAž)ä€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!; 8`“¡˜HÁ9/ƒ|bxa˜Až)¸€Œ8` !ˆ€A˜‘"€ €A˜!X€A˜‘"“¡Œ“¡ˆ“¡ “¡XHÁ¥/ƒaŒAž)Œ€C €˜“¡˜€O€B4/‚Až$€ /€Až}ã{xÃxHÂA|}xHTÃx; Hí||yA‚@}ã{x„ãxHÅÙ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ˆAž)€]ƒaŒ€B4/‚Až(€ /€Až£ëxeÛx8€HÁí|}xHT8`HÃ||yA‚L£ëxeÛx„ãxHÀE€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/@¼,€AÄaÀ8,"¥T€I!¼K¥P ¥LH+`€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!; €AŒ“¡ˆ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!“¡ŒH€O€B4/‚Až$€ /€Až}ã{xÃxHÀ|}xHTÃx; HÁù||yA‚@}ã{x„ãxHÄ%€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ Až'ˆ£ëx8€8 HÄù/ƒaXAž'€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!; 8`“¡ H¾-/ƒ|bxa˜Až'd€X=?ƒiš, “¡XcÛx€˜HÁ]/ƒaŒAž'\€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!“¡˜€O€B4/‚Až$€ /€Až}ã{x$ËxH¿5|}xHT#Ëx; HÀ¡||yA‚@}ã{x„ãxHÂÍ€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ˆAž&À£ëx8€8 Há/ƒa Až&È€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!; 8`“¡ˆH¼Õ/ƒ|bxaXAž&œ€ cÛx “¡ €XHÀ /ƒa˜Až&œ€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!8`“¡XH½%/ƒaˆAž&x# €Œ €Aˆ€˜" “¡˜“¡Œ€O€B4/‚Až$€ /€Až}ã{xÃxH½­|}xHTÃx; H¿||yA‚@}ã{x„ãxHÁE€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡ Až%ì€]ƒaˆ€B4/‚Až(€ /€Až£ëxeÛx8€H½Y|}xHT8`H¾‰||yA‚L£ëxeÛx„ãxH»±€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/@¼(€AÄaÀ8."¥T€I!¼K¥P ¥LH&t€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!; €Aˆ“¡ "9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!“¡ˆ€A"9)ÿÿ/‰‘"@ž€a€C€| ¦| xN€!; €Aœ“¡"9)ÿÿ/‰‘"@ž€aœ€C€| ¦| xN€!“¡œ€A„"9)ÿÿ/‰‘"@ž$€a„€C€| ¦| xN€!``“¡„˜È|&Tïþ/€Aš\€O€B4/‚Až$€ /€Až}ã{x$ËxH»A|}xHX#Ëx; H¼­||yA‚D}ã{x„ãxH¾Ù€\|}x8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`/“¡œAž# €]€B4/‚Až$€ /€Až£ëx8€Hº±||xHX8`;€H¼|{yA‚D£ëxdÛxH¾I€[||x8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`/œ“XAž#4€Aœ"9)ÿÿ/‰‘"@ž €aœ€C€| ¦| xN€!`’ᜀO€B4/‚Až$€ /€Až}ã{xÃxH¹é|}xH`Ãx; H»U||yA‚L}ã{x„ãxH½€\|}x8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```/“¡ Až"ˆ€]ƒaX€B4/‚Až(€ /€Až£ëxeÛx8€H¹‰|}xH`8`Hº¹||yA‚X£ëxeÛx„ãxH·á€\|}x8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```/@¼,<_85€B¥T"<_¥L‘.¥PH"œ``€A "9)ÿÿ/‰‘"@ž€a €C€| ¦| xN€!; €AX“¡ "9)ÿÿ/‰‘"@ž$€aX€C€| ¦| xN€!``“¡X€O€B4/‚Až$€ /€Až}ã{x$ËxH¸|}xH`#Ëx; H¹…||yA‚L}ã{x„ãxH»±€\|}x8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```/“¡Až Ü€]€B4/‚Až$€ /€Až£ëx8€H·||xHX8`;€H¸í|{yA‚D£ëxdÛxH»€[||x8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`/œ“ˆAž p€A"9)ÿÿ/‰‘"@ž €a€C€| ¦| xN€!`’á€O€B4/‚Až$€ /€Až}ã{xÃxH¶¹|}xH`Ãx; H¸%||yA‚L}ã{x„ãxHºQ€\|}x8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```/“¡ŒAžÄ€]ƒaˆ€B4/‚Až(€ /€Až£ëxeÛx8€H¶Y|}xH`8`H·‰||yA‚X£ëxeÛx„ãxH´±€\|}x8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```/@¼,<_86€B¥T"<_¥L‘.¥PHl``€AŒ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!; €Aˆ“¡Œ"9)ÿÿ/‰‘"@ž$€aˆ€C€| ¦| xN€!``“¡ˆ;9–È@ž½„8˜< ÿ}ã{x`¥ÿÿH´±/ƒ@¼(<_87=?€B¥Tb<_¥L‘i¥PH¤}ã{xH²/ƒa„@¾4<_88=?€B¥Tb<_¥L‘i¥PHl``€a„H¶}/ƒa˜@ž@H±­/ƒA¾@<_88=?€B¥Tb<_¥L‘i¥PH ```€Q8Bÿÿ/‚Q@ž €Q~#‹x€| ¦| xN€!`8‚!˜˜€Q€B4/‚Až(€ /€Až~#‹x8€H³Ñ|}xHX`8`; Hµ9||yA‚@~#‹x„ãxH·e€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!/“¡œAž£ëxH·/ƒÿÿ|}x@žD<_=?=8:‘!ÀAÄ‘a¼"¥T€I!À ¥LI¥PH0```€Aœ"9)ÿÿ/‰‘"@ž€aœ€C€| ¦| xN€!k  @|8@/€Aœ”AžþD€Q€B4/‚Až(€ /€Až€³™¸~#‹x8€H²Ù|}xH`8`H´ |~yA‚X€³™¸~#‹xÄóxH±1€^|}x8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```/@œý¬<_=?=8;‘!ÀAÄ‘a¼"¥T€I!À ¥LI¥P``!X/‰Až8€I8Bÿÿ/‚I@ž$€aX€C€| ¦| xN€!``! 8X/‰Až0€I8Bÿÿ/‚I@ž€a €C€| ¦| xN€!!8 /‰Až0€I8Bÿÿ/‚I@ž€a€C€| ¦| xN€!!ˆ8/‰Až0€I8Bÿÿ/‚I@ž€aˆ€C€| ¦| xN€!!Œ8ˆ/‰Až0€I8Bÿÿ/‚I@ž€aŒ€C€| ¦| xN€!!˜8Œ/‰Až0€I8Bÿÿ/‚I@ž€a˜€C€| ¦| xN€!!œ8˜/‰Až0€I8Bÿÿ/‚I@ž€aœ€C€| ¦| xN€!<_;À€B™ô“Áœ€bH®=/ƒa€Ažð<8cF Kûïe8aX8 8¡Kûë5/ƒAœŒ€AX"9)ÿÿ/‰‘"@ž$€aX€C€| ¦| xN€!``“ÁX€A "9)ÿÿ/‰‘"@ž(€a €C€| ¦| xN€!```“Á €A"9)ÿÿ/‰‘"@ž(€a€C€| ¦| xN€!```€a„“ÁKÿú¬€A„"9)ÿÿ/‰‘"@ž€a„€C€| ¦| xN€!8„Kÿ­¬€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!<Ÿ€a|€„§H´Q,a” &@€8WÞ€>Ð WÞ€><_8?:@€B¥T"<_¥L<_‘"¥PHL@‚<Ÿ€a|€„§H³ù,a”À&@€8Wœ€> Wœ€><_8?:@€B¥T"<_¥L<_‘"¥PHô@‚¨<Ÿ€a|€„¦ÈH³¡/ƒa”@œ8W½€>° W½€><_8@:@€B¥T"<_¥L<_‘"¥PH @žT<Ÿ€a|€„¦°H³M/ƒa”@œ8WÞ€>Ð WÞ€><_8@:@€B¥T"<_¥L<_‘"¥PHL€”/€Až<Ÿ~ƒ£x€„¦@H«,aˆ@‚0N<_8A:@€B¥T"<_¥L<_‘"¥PHø8`H«q,aŒ@‚0N<_8A:@€B¥T"<_¥L<_‘"¥PH¸!¬€I8BI!Œa¬‘i €aˆ€Œ€¡|H­m,a˜@‚0N<_8A:@€B¥T"<_¥L<_‘"¥PHT€Aˆ"9)ÿÿ/‰‘"@ž€aˆ€C€| ¦| xN€!;À€AŒ“Áˆ"9)ÿÿ/‰‘"@ž€aŒ€C€| ¦| xN€!“ÁŒ€A˜"9)ÿÿ/‰‘"@ž€a˜€C€| ¦| xN€!“Á˜!¬€I}>Kx8BIHÜ``N‚s™¸<_8ì:@€B¥T’a¬’a¨~o›x~p›x~q›x"<_‘"¥P<_¥LHPN‚s™¸<_8ì:@€B¥T’a¬’a¨~o›x~p›x~q›x"<_‘"¥P<_¥LH N‚s™¸<_8ì:@€B¥T’a¬’a¨~o›x~p›x~q›x"<_‘"¥P<_¥LHÈN‚s™¸<_8í:@€B¥T’a¬’a¨~o›x~p›x~q›x"<_‘"¥P<_¥LH„N‚s™¸<_8í:@€B¥T’a¬’a¨~o›x~p›x~q›x"<_‘"¥P<_¥LH@‚s™¸<_:@8í€B¥T.’a¬’a¨~o›x~p›x~q›x"<_‘"¥P<_¥LHüN<_ó™¸8ð:@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LHÄN<_ó™¸8ð:@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LHŒN<_ó™¸8ð:@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LHTN<_ó™¸8ð:@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LH<_:@ó™¸8ð€B¥T.}ð{x}ñ{x"<_‘"¥P<_¥LHäN<_8}¯kx}°kx€B¥T:@}±kx"<_‘"¥P<_¥LH¬Nó™¸:@}ð{x}ñ{xH”N<_8 ÏóxÐóx€B¥T:@Ñóx"<_‘"¥P<_¥LH\N<_8 ÏóxÐóx€B¥T:@Ñóx"<_‘"¥P<_¥LH$N<_8 ÏóxÐóx€B¥T:@Ñóx"<_‘"¥P<_¥LHìN<_ó™¸8 :@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LH´<_:@ó™¸8 €B¥T.}ð{x}ñ{x"<_‘"¥P<_¥LH|N<_ó™¸8 :@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LHDN<_ó™¸8 :@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LH N<_ó™¸8 :@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LHÔN<_ó™¸8 :@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LHœN<_ó™¸8 :@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LHd<_:@ó™¸8 €B¥T.}ð{x}ñ{x"<_‘"¥P<_¥LH,N<_ó™¸8 :@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LHôW½€>° W½€><_ó™¸8 :@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LH´N<_ó™¸8 :@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LH|W½€>° W½€><_ó™¸8 :@€B¥T}ð{x}ñ{x"<_‘"¥P<_¥LHKx‘!l‘!h8BIH@ƒÚ¨€P|òx1 ÿÿ|I/‚A`Až°>ß>¿ƒ¶”€u4¤ëxH„‰||y@‚P<_¤ëx“Ál“Áh€BÄÛóx€bH…á<_8K=?€BDb<_<‘i@H¬``<Ÿ€„ H„).|{x@’D~@&VR€“Ál<_; :`M€BD:€: &W€M"“ÁhH@€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!ƒÖ”€u4ÄóxHƒ¡|}y&@‚`M<_Äóx~@&€BÄ:`:€€bH„ñ<_€BDb8K<_=?<‘i@: €Z¨-•AhAlHŒ<Ÿ€„XHƒ-||y@‚8M<_8K~@&€BD:`:€"<_‘"@<_ß<8€ƒ6ê8BW€K8BK!<€I8BIa@€K8BK9€cø09)‘9Kû¬õ|uy@‚L<_8_>Ëx4Ëx€Bõ 0Ëx2Ëx1Ëx3Ëx"<_‘"õœ<_õ˜H à```€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€@€È@ž˜<Ÿ~ã»x€„ötHl‰|~y@‚@<_8a4Ëx0Ëx€Bõ ~¾«x2Ëx1Ëx3Ëx"<_‘"õœ<_õ˜H D€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!“Á@```70i<€K8BK99)ÿÿ/‰‘9@ž€Y#Ëx€| ¦| xN€!a<€W0ƒÖê+ƒ"<9)‘+€^8Bÿÿ/‚^@ž$€^Ãóx€| ¦| xN€!``<Ÿ€aD‚<€„öÜHka|xy@‚˜HD<_8e=?€Bõ b<_õ˜‘iõœHÀ<_8f=?€Bõ b<_õ˜‘iõœHœ>õ 8i€Iõ˜\õœH„<_8n=?€Bõ b<_õ˜‘iõœH````8€Hn½/ƒaH@ž`<_8dÐóxÒóx€Bõ ÑóxÓóx"<_õ˜<_‘"õœ```€X~¾«x8Bÿÿ/‚X@ž \H 8`€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€aHHi½|xy@‚<<_ÐóxÒóx8d€Bõ ~¾«x~ƒx~ƒx"<_‘"õœ<_õ˜HÜ€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!8ÐóxÒóxÑóxHÓóxÃxHmÍ/ƒaH@¾ Hhý/ƒ@žÐH```Hi/ƒaLAž°€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!€aL8HHmU|}yÀ&@‚(Hh…/ƒ@ž<_<Ÿ€Béø8„’À€bHfÅØ “¡HA‚4€P8Bÿÿ/‚P@ž$€P~ƒx€| ¦| xN€!``€aL8‚HHHlÑ|}yÀ&@‚4Hh/ƒ@ž(<_<Ÿ€Béø8„’À€bHfA```Ø “¡HA‚¤€R8Bÿÿ/‚R@ž$€R~C“x€| ¦| xN€!``€aL8‚AHHHlA|iyA¢H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Béø8„’À€bHe™HHg1/ƒA¾ X<_8d=?€Bõ b<_õ˜‘iõœKÿý€aL€C€| ¦| xN€!``8~ƒxLHj•|~xHfÍ|}y@¢ûô€WÅóx~ã»x$Ëx8À8à€| ¦| xN€!/ƒaHA¾ûÀ€Q8Bÿÿ/‚Q@ž€Q~#‹x€| ¦| xN€!€ê‚!H“¡H”AžÐ<Ÿ~£«x€„õØHfÁ/ƒaLA¾ûˆ|dx~ƒ£xHhI/ƒÿÿ|~xA¾ûp€AL"9)ÿÿ/‰‘"@ž$€aL€C€| ¦| xN€!``/ž“¡L@žX~ƒ£x~$‹xHlM/ƒaHAž`€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€H“ÁH<~C“xHkÝ/ƒÿÿ||x@¾ÀH``?ßaL?Ÿ?¿8h€^õ /‹"õ˜‘<õœAž0€K8Bÿÿ/‚K@ž€aL€C€| ¦| xN€!!H8L/‰Až0€I8Bÿÿ/‚I@ž€aH€C€| ¦| xN€!<_8€BêH€bHe•/ƒA¾ú¼<8c—PKû¦Á8aL8H8¡PKû¢‘/ƒA¼ú€aD~ƒxHl]/ƒ@œûd>õ 8j€Iõ˜\õœKÿúl<_8m=?€Bõ b<_õ˜‘iõœKÿúH`;`;@``€R€B4/‚Až$€ /€Až~C“xdÛxHf½|~xHTcÛx;ÀHh)|}yA‚@~C“x¤ëxHjU€]|~x8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!/ž“ÁLA¾ù(8`Hd±/ƒaHA¾ù€Q;À8BQ!H’) €L€AH“ÁLHh™/ƒaPA¾øÜ<Ÿ€¡<€„÷hHeÝ/ƒA¼øÄ€aP€8Hj‰/ƒA¼ø°€a@€H€¡PHf‘/ƒaLA¾ø”€AH"9)ÿÿ/‰‘"@ž€aH€C€| ¦| xN€!“ÁH€AP"9)ÿÿ/‰‘"@ž(€aP€C€| ¦| xN€!```“ÁP€S8Bÿÿ/‚S@ž€S~c›x€| ¦| xN€!‚aL€ê“ÁL“AžÄ€R€B4/‚Až0€ /€Až$~C“xDÓx~e›xHe%|}xH\``CÓxHfM|~yA‚L~C“xÄóx~e›xHcu€^|}x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!/@¼,<_8q=?€Bõ b<_ õ˜‘bõœKÿ÷¨`;Z;{›à@žýd/š@žL``€aD~ƒxHiI/ƒ@œøP<_8t=?€Bõ b<_õ˜‘iõœKÿ÷L``œÐ@ø< ÿDÓx~C“x`¥ÿÿHc™/ƒ@œø<_8v=?€Bõ b<_õ˜‘iõœKÿöü€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!6ê~¾«x€I}=Kx8BIHô€XÃx~¾«x€| ¦| xN€!`!H/‰Až8€I8Bÿÿ/‚I@ž$€aH€C€| ¦| xN€!``!L/‰Až8€I8Bÿÿ/‚I@ž$€aL€C€| ¦| xN€!``!P/‰Až8€I8Bÿÿ/‚I@ž$€aP€C€| ¦| xN€!``<; 8c—xKû¡Õ!8/‰Až8€I8Bÿÿ/‚I@ž$€a8€C€| ¦| xN€!``€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€T8Bÿÿ/‚T@ž €T~ƒ£x€| ¦| xN€!`€P8Bÿÿ/‚P@ž €P~ƒx€| ¦| xN€!`€R8Bÿÿ/‚R@ž €R~C“x€| ¦| xN€!`€Q8Bÿÿ/‚Q@ž €Q~#‹x€| ¦| xN€!`€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€W8Bÿÿ/‚W@ž €W~ã»x€| ¦| xN€!`€AD"9)ÿÿ/‰‘"@ž€aD€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!!¼/‰Až8€I8Bÿÿ/‚I@ž$€a¼€C€| ¦| xN€!``!À/‰Ažx€I8Bÿÿ/‚I@žd€aÀ€C€| ¦| xN€!HH`; H<``€AL"9)ÿÿ/‰‘"@žõÜKÿõ¸`/ƒAø|Kÿû8`8! £ëx€ºÿÀ|¦N€ ``|¦½¡ÿ¤ÛÁÿðÛáÿøBŸ|vx8Àè¦8à8”!þ9 <_?_??Ÿ?¿=_=ƒZèƒ{胜能è ;ÂÖ,Jè$kè(Œ¡8aŒ8t“AL“aP“T“¡X‘A\‘a`xdlpÅóx9dKû•¡/ƒ@œH„$8X€aŒ€<¿8A\8Æóx8`8¥†A<8áx@9L9!P9ATH^e/ƒ@ž¬!Œ/‰Až0€I8Bÿÿ/‚I@ž€aŒ€C€| ¦| xN€!!/‰Až0€I8Bÿÿ/‚I@ž€a€C€| ¦| xN€!!d/‰@žHƒ\€I8Bÿÿ/‚IAžHƒD€ad;ÀHƒ`6ax>¿ƒµØ09)‘6€K8BK!L€I8BIaP€K8BK!T€I8BIaX€K8BK!\€I8BIa`€K8BK=9)‘=v0K<€J8BJ=9)ÿÿ/‰‘=@ž€]£ëx€| ¦| xN€!ƒT€V0€êx! | ‚‚àC0<_Œ’áˆË‰``Ȉüð(ÿàü øHÿ1|byA°} &‘!ìA¢¾¨8h€X|xØHýÉ/ƒA¼¾ì€h!°Tþh€I8Bÿÿ/‚I@ž€I€a°€| ¦| xN€!‚h, &@‚¤ÃxHÿ-/ƒÿÿA¾¾ül`€’á”`È!ü!ð(ü ì?$Hþ,atA¢¿0€\€¡ØHý)/ƒA¼¿ˆ€h!tTþh€I8Bÿÿ/‚I@ž€at€C€| ¦| xN€!ƒ¡h’t/AžX€A¼€Ø0|@x1 ÿÿ|I/‚AHAž¨€aLHù /ƒahA¼¿lAž\<Ÿ}Ãsx€„ähHøm,alA¢¿À<_<ƒ¢æ€c㼤ëxHøI|byA¬} &‘!èA‚À<Ÿ€„äTHø)|byA¤} &‘!äA¢ÀX!¬€I8Bÿÿ/‚I@ž€I€a¬€| ¦| xN€!€aÐHû|byA } &‘!àA¢Àd8`Høa|byA°} &‘!ìA¢À 68|Dx€a¤€I8BI€A°€8 !¼€I8BI€A a°K‘+Hûe,atA¢Àœ!¤€I8Bÿÿ/‚I@ž€I€a¤€| ¦| xN€!!°€I8Bÿÿ/‚I@ž€I€a°€| ¦| xN€!8`H÷‘|byA¬} &‘!èA¢Àx€t:à|Dx ’át€alHúÁ|}yA¢À´€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!’ál!¬€I8Bÿÿ/‚I@ž€I€a¬€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!HtcÛxHõ½|byA¤} &‘!ä@¢d‘!ì‘!è<_8Ï‘!Ü‘!à€BãÌ ÃxOÓx—ãx-Ëx"8@“aÀA¬A°A Aœ<_‘"ãÈ<_ãÄH,~ò»x€a¤Hùá|wy &@¢tHõ/ƒA¾¨“¡ì“¡è<_8Ï“¡Ü“¡à€BãÌ ÃxOÓx—ãx-Ëx"8@“aÀA¬A°A Aœ<_‘"ãÈ<_ãÄH¬``€R8Bÿÿ/‚R@ž€R~C“x€| ¦| xN€!cÛx~ä»xHúí,atA¢¿9)ÿÿ/‰‘>@ž€^Ãóx€| ¦| xN€!€ЀAÔ“¡¨€|&Tïþ/hAšd<_!ÐaÌ€BØŒ| ZA¨€AÔ|PÌ!¨€I8BI=9)ÿÿ/‰‘=@ž€]£ëx€| ¦| xN€!€a¨HìÕ/ƒaHA¼¼¨@ž ’´HD<Ÿ~óx€„ä”Hì-|byA } &‘!àA¢¼ì€aÐHïÑ|byA°} &‘!ìA¢½08`Hì•,atA¢½t!¼€a €I8BI!ta¼‘i €A°atK€P8BP!t’ €tHï¡|}yA¢½|! €I8Bÿÿ/‚I@ž€I€a €| ¦| xN€!€At"9)ÿÿ/‰‘"@ž€at€C€| ¦| xN€!8“¡´t€P8Bÿÿ/‚P@ž €P“¡´~ƒx€| ¦| xN€!<Ÿ}Ãsx€„ähHêí,alA¢½$>_>ƒ²æ€p㼤ëxHêÉ|byA°} &‘!ìA‚½\<Ÿ€„äTHê©|byA } &‘!àA¢½°!°€I8Bÿÿ/‚I@ž€I€a°€| ¦| xN€!}ã{xHî,atA¢½À€aÐHî |byA¬} &‘!èA¢¾8`HêÍ|byA°} &‘!ìA¢¾868|Dx€a €I8BI€8€A° 8€Ata¬!°‘iItHíÕ,atA¢¾4! €I8Bÿÿ/‚I@ž€I€a €| ¦| xN€!!°€I8Bÿÿ/‚I@ž€I€a°€| ¦| xN€!ƒ²æ€p㼤ëxHéY|byA¬} &‘!èA‚¾<Ÿ€„åàHé9|byA } &‘!àA¢¾X!¬€I8Bÿÿ/‚I@ž€I€a¬€| ¦| xN€!}£kxHì­|byA°} &‘!ìA¢¾`€aÌHì‘|byA¬} &‘!èA¢¾˜8`HéU|byAœ} &‘!ÜA¢¾È€W€a €œ8BW!°€Aœ‘"a¬’â ‘bHìq|byA°} &‘!ìA¢¾À! €I8Bÿÿ/‚I@ž€I€a €| ¦| xN€!!œ€I8Bÿÿ/‚I@ž€I€aœ€| ¦| xN€!8`Hè•|byA¬} &‘!èA¢¾€t!°:@8`‘" a´€K8BK€A¬‘b’AtHèI|byA } &‘!àA¢¾˜!¬‘" € €alHë|}yA¢¾Ð€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!’Al! €I8Bÿÿ/‚I@ž€I€a €| ¦| xN€!€]8Bÿÿ/‚]@žñX€]£ëx€| ¦| xN€!Kÿñ_‚rRh8BW~{›x€K8BK39)‘3€W0€/€Ažà<Ÿ~ã»x€„`lHÕÁ|~y@‚¨<_~q›x~v›x8€B^"H<_8=?€B^b<_]ü‘i^H¬W½€>° W½€><_8=?€B^VÓx: b<_]ü‘i^Ht<_8VÓx€B^"<_]ü<_‘"^HL`8`HÕ­||y &@‚LN<_8~q›x: €B^~v›x"<_]ü<_‘"^€^8Bÿÿ/‚^@žÌH¬€¡<Ãóx„ãxHש|zy@‚8N<_8~q›x: €B^~v›x"<_‘"^<_]üKÿÿ €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€\8Bÿÿ/‚\AžqÛx^ÓxvÛxH¬€\ƒãx^ÓxqÛxvÛx€| ¦| xN€!H„b<€K8BK39)ÿÿ/‰‘3@ž €S~c›x€| ¦| xN€!`€W08`‚b=ÿ=ß; 9 ƒÓ€W,>|BÊ€‚€I4/‚Až$€ /€AžÃóxHÕ||xHX`|ƒ#xHÖm|}yA‚PÃóx¤ëxHØ™€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`, &@¢(;€€O^/œ€‘®]ü &W½à^H|<_ƒÂ]€/ž@¾$<_<Ÿ€BR˜8„ì€bHÑMHl`€RhœAž €|žAžÄóxHÙe/ƒAž€[8Bÿÿ/‚[@žXH<=?€\€Þ <Ÿ)R¤8„õd€¢ €iHÐá€O^€‘®]ü^HÔ€[cÛx€| ¦| xN€!€›ãx/€Až€W,|BÊ€b HÕ.|uxA’Ô€W,|BÊ€bHÔù|~yA‚„8`HÑÉ||y &A¢û„€[<„ãx8B[’¼“Ü“| €c]tHÔõ|zyA‚d€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€V8Bÿÿ/‚V@ž €V~óx€| ¦| xN€!`<ŸCÓx€„`lHÐu|~yA‚8`HÑ||y &A¢ú䀡<Ãóx„ãxHÓI.|uxA²û€^8Bÿÿ/‚^@ž(€^Ãóx€| ¦| xN€!```€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`~#‹x~¤«xHÕI|~yA‚Œ€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!€Q8Bÿÿ/‚QAžÑóxVÓxH$€Q~#‹xVÓxÑóx€| ¦| xN€!;;9”À@žüT~#‹xHÕ/ƒÿÿ@ž4;€<_8=?,€B^ &b<_]ü‘i^HL/ƒ@€Q~>‹x8BQHx8`HÏ||y &A‚<=?„ãxi`ì€K8BK<_€BR\)`ì‘< €bHÒ¥|~y@‚P<_8 =?€B^b<_]ü‘i^HÀ &W½€<_8;€€B^"<_]üH€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!Ãóx8€8 Kûe€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<_8 ;€€B^, &"<_]ü<_‘"^: .HÀ<_8=?€B^b<_]ü‘i^HÜN<_8: €B^"<_]ü<_‘"^Hx<_8VÓx€B^"<_]ü<_‘"^H¸<_8VÓx€B^"<_]ü<_‘"^H`€^Ãóx€| ¦| xN€!`¸ A‚<€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```A’0€U8Bÿÿ/‚U@ž€U~£«x€| ¦| xN€!<;À8c¸Kû!ÿƒwE9)‘:€J8BJaL€K8BK;9)‘;ƒÚ€š,€^€B4/‚Až(€ /€AžÃóxHËÅ|}xH\``|ƒ#x; HÍ)||yA‚@Ãóx„ãxHÏU€\|}x8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!,“¡\@‚X}&=!߃ÖP¨/ž@ž$<_<Ÿ€BEÀ8„ß<€bHÇÝHp`€EAž €}žAžÄóxHÏõ/ƒAž €[xÛx8Bÿÿ/‚[@ž´HŒ=?€]€Þ <Ÿ)EÌ8„茀¢ €iHÇm9 ² W½@>HÄm/ƒ@ž(H0```HÄq,a`@¢TM}&U@=!<_=a8“iˆ˜€BQ,9@" ˆˆ“kˆŒ<_8É‘"Q(<_Q$H#ˆ`€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!€a`8\HÈu||y &@‚(HÃ¥/ƒ@ž<_<Ÿ€BE„8„îL€bHÁå¸ “\A‚d=!)ˆ”€I8Bÿÿ/‚I@ž,€I=a€kˆ”€| ¦| xN€!```!\Kx8BIHü}&U€H$}&<_=aM€€BQ,‘«ˆŒH$}&U >} U`>=!<_‘©ˆŒ€BQ,":@<_9@8Ø‘"Q(Hð}&U`=a<_9@8Ø‘«ˆŒ€BQ,bHÄ}&=!<_9@8Ø‘©ˆŒ€BQ,bH }&=a<_:@9@M€‘«ˆŒ€BQ,8Ù"<_‘"Q(Hp}&U€H$}&<_=aM€€BQ,‘«ˆŒH$}&U >} U`>=!<_‘©ˆŒ€BQ,":@<_9@8Ý‘"Q(H }&U`=a<_9@8á‘«ˆŒ€BQ,bHà° W½€><_8°ëx€B#¼~~›x~•£x"~ V€><_8~~›x€B#¼~•£x"~ V€>HN<_8~~›x~•£x€B#¼"~ V`><_V€>~ V€>8€B#¼~~›x9à"ÿ8ƒW 8B[€I8BIa<€K8BK:9)‘:<€{Hš}/ƒÿÿ|yx@ž€<_8GQÓxRÓx€B#¼^ÓxMÓx9àUÓxNÓx"<_#´8~ V€>"ÍóxÕóx8° W½€><_ƒ× 8°ëx€B#¼ÍóxÕóxÎóx"° W½€>ÿ=???ƒ—ê€C8BC“¡8“¡<“¡@“¡D€D8BD€\ƒÉ÷ì€yõŒ8BÄóx\HnU|{y@‚Œ|&<_Äóx“X™ãxN€Bê“ãx”ãx`€bHo€AX!`8;ÀAT‘!\<_€Bõœ"8@ALAH€ATAP<_‘"õ˜<_õ”H#@```<Ÿ€„öHm¹,a8@‚|N<_8™ãx“ãx€Bõœ”ãx;À"<_“X“T“Põ”|&<_‘"õ˜8@`ALAH\€[8Bÿÿ/‚[@ž"°H"ˆ``€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€8ÃxHn™/ƒÿÿ|~x@ž|9 8@“X8, AH<_™ãx€Bõœ“ãx”ãx} &;ÀN‘!`"“T|@&“PA\8@AL<_‘"õ˜<_õ”H!ð```€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!/ž“¡8AžØ€uÃxHr-|{y@‚D|&“X<_™ãx“ãxN€Bõœ”ãx`"“T\H ```Hk,a8@‚d|&“X<_™ãx“ãxN€Bõœ”ãx;À`"8@\8‚“T“PALAH<_‘"õ˜<_õ”Kÿþ(`€[8Bÿÿ/‚[@ž €[cÛx€| ¦| xN€!`€a8Ho}.|}x@’Hj­/ƒ@ž<_<Ÿ€Béô8„’¼€bHhí|&T€<_ƒ7ê€Bõœ`3Ëx4Ëx"“!X\“!T``8@8‚’P;ÀALAH<_‘"õ˜<_õ”H `ƒ×ê€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€a8Hn­.|zx@’€HiÝ/ƒ@ž<_<Ÿ€Béô8„’¼€bHh|&T€“ÁX<_ÓóxÔóx€Bõœ¹ëx`"8@“ÁT;À\8‚’aPALAH<_‘"õ˜Hð`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€a8Hmí.||x@’€Hi/ƒ@ž<_<Ÿ€Béô8„’¼€bHg]|&T€“ÁX<_Ôóx¹ëx€BõœSÓx`"8@“ÁT;À\8‚’PALAH<_‘"õ˜H„`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€a8Hm-|iyA‚H€I8Bÿÿ/‚I@ž€I€| ¦| xN€!<_<Ÿ€Béô8„’¼€bHf…HHh/ƒAž!D9 ‚÷ê8@¹ëxSÓx, AH<_”ãx’áX€Bõœ;À8‚} &N‘!`"’áT|@&’áPA\8@AL<_‘"õ˜H\€a8€C€| ¦| xN€!ƒu 88/›AžP<_€yõŒƒÂ÷8ÄóxHgí|{y@‚x|&<_Äóx¹ëxSÓxN€Bê”ãx`€b\Hi5‚÷ê<_8„;À€Bõœ’áX’áT"8@’áPALAH<_‘"õ˜<_õ”Hà<Ÿ€„õ¼Hge,a8@‚@|&‚÷ê<_¹ëxSÓx”ãxN€Bõœ;À’áX`’áT"\HÔ€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!<ŸÃx€„ø Hfá|{yA‚@<ŸÃx€„øHfÉ.|~x@’L<_‚÷ê€Bõœ’áXH<8`Hj],a?>_>8‡1õœ€Iõ”Rõ˜€^8Bÿÿ/‚^@ž8H8`Hdá/ƒa8Ažÿ¸€Z<8BZ!8“I €A8“€?>_>8‡1õœ€Iõ”Rõ˜Hx€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!‚÷êƒÁ@¹ëxSÓx”ãx“a@“a8’áX’áT’áPH`€^Ãóx€| ¦| xN€!!߀yõŒ8ƒÖ÷8@ÄóxHbE|{y@‚l|&<_Äóx¹ëxSÓxN€Bê”ãx`€b\Hc‚÷ê€Qõœ8ˆ;À’áX"8@’áT’áPõ”ALAH‘2õ˜HD<Ÿ€„õÐHaÉ|~y@‚X|&‚÷ê€Qõœ¹ëxSÓx”ãx;ÀN`’áX"8@\8ˆ’áT’áPALAHõ”‘2õ˜Kÿô€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!ÃóxHa™€^|{x8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!,@‚D|&‚÷ê8@¹ëxSÓx”ãxN;ÀALAH’áX`’áT\’áPH0<8c’pKú¢U8a<888¡@Kúž%/ƒ@œh9 ‚÷ê8@8ˆ¹ëx, AH€QõœSÓx’áX”ãx;À} &N‘!`"’áT|@&’áPõ”‘2õ˜A\8@ALH¨ƒÖ÷8€yõŒÄóxH`)|{y@‚p|&<_Äóx¹ëxSÓxN€Bê”ãx`€b\Haq‚÷ê€Qõœ8‰;À’áX"8@’áT’áPõ”ALAH‘2õ˜H(`<Ÿ€„õÌH_©.|~x@’L‚÷ê€Qõœ’áXHÄ`€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!8`H_ñ|{y@‚P|&‚÷ê€Qõœ¹ëxSÓx”ãx\’áX"8@`8‰’áT’áPALAHõ”‘2õ˜Hl€XÃóxdÛx8BX“ Hbá,aD@‚P‚÷ê€Qõœ’áX|&¹ëxSÓx”ãx\"8@`8‰’áT’áPALAHõ”‘2õ˜Kÿñ8€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!;`ƒÁD€A8“aD"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!“a8€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!“a<€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!‚÷ê¹ëxSÓx”ãx“a@’áX’áT’áPH˜`>ŸÃx€”ø H]U|vy@‚<>?aD>_>8‹€Qõœ/‹"õ”‘2õ˜@žPHx``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`ƒU .A’xHè€K8Bÿÿ/‚K@ž€aD€C€| ¦| xN€!!<8D/‰Až0€I8Bÿÿ/‚I@ž€a<€C€| ¦| xN€!!88¿>ß>Ÿ; ÃxHG |sy@¢THBA/ƒAžÔ€VÍÀ8²;€Óóx/œ"͸`&W{à‘5ͼ€X8Bÿÿ/‚X@žìHÐ`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€S€B4/‚Až$€ /€Až~c›x8€HD]||xHd8`HEÍ|}y@¢`&;€Hp`~c›x¤ëxHGé€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/œ`&W{àAžƒãxHDÝ|~xHA/ƒA¾6ÍÀ8³€I͸UͼKÿþè€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€ZÂÉ.3€I4/‚Až,€ /€Až ~c›x8€HCU||xHl``8`HD½|}y@¢`&;€Hp`~c›x¤ëxHFÙ€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/œ`&W{àAžƒãxHCÍ|~xH@/ƒA¾6ÍÀ8´€I͸UͼKÿýØ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z|BÊ“Â3€I4/‚Až(€ /€Až~c›x8€HBA||xHh`8`HC­|}y@¢`&;€Hp`~c›x¤ëxHEÉ€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/œ`&W{àAžƒãxHB½|~xH>õ/ƒA¾6ÍÀ8µ€I͸UͼKÿüÈ€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z|BÊ“Â3€I4/‚Až(€ /€Až~c›x8€HA1||xHh`8`HB|}y@¢`&;€Hp`~c›x¤ëxHD¹€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/œ`&W{àAžƒãxHA­|~xH=å/ƒA¾6ÍÀ8¶€I͸UͼKÿû¸€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z|BÊ“ 3€I4/‚Až(€ /€Až~c›x8€H@!||xHh`8`HA|}y@¢`&;€Hp`~c›x¤ëxHC©€]||x8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`/œ`&W{àAžƒãxH@|}xH<Õ/ƒA¾6ÍÀ8·€I͸UͼKÿú¨€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€Z:÷~~›x|BÊ;9“¢Kÿú€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!Óóx;À’úHl€XÃx€| ¦| xN€!W{ >p W{à>Až4€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`<;Àÿÿ8cqTKú}å€S8Bÿÿ/‚S@ž €S~c›x€| ¦| xN€!`€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!/ž@œ@€Z8Bÿÿ/‚Z@ž(€ZCÓx;@€| ¦| xN€!H `;@8!°CÓx€ºaÿÌ|¦N€ `|@&|¦¾AÿÈ||x|ƒ#x|¤+xBŸ;Àè¦A”!ÿ <_?¿=<߀BÆ,ƒ½Æ$<¿kÆ(8Æ´p8¥e€A\8X8A\8á|“Áx‘aX8A<“Á|“ÁL“ÁP“Ád“Áh“Ál“Áp“¡T“Át9L9!P9ATH<©;Àÿÿ/ƒAžÌ€\a|?¶8B\€K8BK!L€I8BIaP€K8BK!T€I8BI=?aX€K8BKA\€J8BJƒ©Á,€HƒÁ|/8BH@ž(<_<Ÿ€B¶H8„OÄ€bH8ÑHˆ``€~Až¤ëxH@ñ/ƒAž8ƒÁ|€^8B^<<€I8Bÿÿ/‚I@ž H|``<_>€Ý <Ÿ<¿€B¶T8„OØ8¥e|€é €bH8Iƒ;¶<_;@;; €BÁ´.8“!MM"<_“!Œ“!ˆ‘"Á°HØ€|<€C€| ¦| xN€!``€|aL<€K8BK<8€I8Bÿÿ/‚I@ž$€|8€C€| ¦| xN€!``€L€aX8H;…a`H7½,À&A‚Pƒ;¶<_;@;; €BÁ´.8“!MM"<_“!Œ“!ˆ‘"Á°<_Á¬HD€`|!P€I8BI|$€K8Bÿÿ/‚K@ž€|$€C€| ¦| xN€!€a\ƒ»¶€P|iêx$0 ÿÿ|@I/‚A`Až|H:­a`H6å/ƒAž`WÞ€>Ð WÞ€>“¡<_WÞÀ>Ò WÞ@>WÞ >Ñ WÞ`>€BÁ´¹ëx;;@8 "“¡Œ<_; “!ˆ‘"Á°Kÿÿ€`<8€€cÄDKúv¹,ad@‚HNƒ;¶<_;M; ;@M€€BÁ´8 “!“!Œ"<_“!ˆ‘"Á°Kÿþ¬ƒ»¶€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!ƒ!d<Ÿ;À€„ “Ád#ËxH6M,|dxad@‚8N“¡Œ“¡MM€<_;; ;@€BÁ´"€AŒHH€aPH7¡/ƒÿÿa`@žP“¡<_;@;€BÁ´.MM"¢ëx“¡Œ; Aˆ<_8 ‘"Á°<_Á¬H€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!€`“Ád,À&A‚X!P€I8BI|(€K8Bÿÿ/‚K@ž€|(€C€| ¦| xN€!“¡€Pƒ»¶(H €aP|`êx1 ÿÿ|I.A`A’ 4<Ÿ€„ÃŒH4é,ad@‚HN“¡Œ“¡MM€<_;; ;@€BÁ´8"€AŒAˆ<_‘"Á°Kÿþè€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!€d>;À€“È“Ád|xPH4I/ƒad@ž4>Ÿ>ÿ>ß84Á´€I!dÁ¬/‰WÁ°@žH<<Ÿ€„Ã_>¿8ƒRÁЀuÁ¨hDÓxH2u|}yÀ&@‚<_DÓx€B¶4€bH3ÕØ “¡d@‚\WÞ€>Ð WÞ€>ƒ{¶€TÁ´WÞÀ>Ò WÞ@>8WÞ >Ñ WÞ`>;; ;@“a"“aŒ“aˆÁ¬‘7Á°HP£ëxH2I€Ada`"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!€`;À“Ád,@‚0Nƒ{¶;; M;@M€“a“aŒ“aˆHÔ?8x] Kús 8ah8d8¡lKúnÙ/ƒ@œDƒ{¶;@€TÁ´8;; .“aMM"“aŒ“aˆÁ¬‘7Á°Hp€“È€aPH1/ƒap@ž(4Á´8€I!pÁ¬/‰WÁ°@ž(HP<Ÿ€„ÂÈH0É/ƒatAžÿÈ€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!8`“ÁpH1!/ƒ|bxapAžÿ|€t<€c¶, “Át€pH4U/ƒatAžÿT€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!“Áp€\("9)ÿÿ/‰‘"@ž€|(€C€| ¦| xN€!€t!h“Át(€I8Bÿÿ/‚I@ž€Hd``€I8Bÿÿ/‚I@ž€ap€C€| ¦| xN€!!t8p/‰Až0€I8Bÿÿ/‚I@ž€at€C€| ¦| xN€!ƒ²ÁЀuÁ¨;@“At¤ëxH/1.|~x@’<_¤ëx€B¶4€bH0‘“Áp@’@Mƒ{¶€TÁ´M8;; ;@“a"“aŒ“aˆÁ¬‘7Á°H,ÃóxH/%€Apa`"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!€`“Ap,A‚´8x] Kúp8at8p8¡xKúké/ƒ@œDƒ{¶;@€TÁ´8;; .“aMM"“aŒ“aˆÁ¬‘7Á°H€ƒÒÁЀuÁ¨ÄóxH.-|xx@ŠPMˆ<_ÄóxN; ;@€B¶4€bH/aƒ{¶€TÁ´8“a"“aŒÁ¬“aˆ‘7Á°H8`H.Q.|}x@’Mƒ{¶€TÁ´“aHD<_Ãx¤ëxbİ+9)‘+€Bİ] H1i|~y@‚4M€ƒ{¶€TÁ´“a"8;@“aŒ“aˆÁ¬‘7Á°H €X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!Ãóx8€8 Kúc€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!ƒ{¶;@€TÁ´8;; .“aMM"“aŒ“aˆÁ¬‘7Á°H ¼€ah€C€| ¦| xN€!;À€Ad“Áh"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“Ád€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!€[¶“Ál|]xAHT\€aXH,9/ƒa`@œ`WÞ€>Ð WÞ€>“¡Œ“¡WÞÀ>Ò WÞ@><_WÞ >Ñ WÞ`>;€BÁ´; ;@8"€AŒAˆ<_‘"Á°Kÿõ |&Tÿþ/€H@ž“¡ƒ»¶HÀ8€A|€b$H0ý/ƒÿÿ@žDM“¡Œ“¡M<_;; ;@€BÁ´8"€AŒAˆ<_‘"Á°Kÿõ$/ƒ;ÀA;À/ž“Á`Ažp€A|ƒ¢$=€I4/‚Až$€ /€Až£ëx8€ÿÿH,É|xxH\8`ÿÿH.9|~y@‚M;HH£ëxÄóxH0Y€^|xx8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!-@Š@ƒ{¶<_;@; 8€BÁ´-š“aN "<_“aŒ“aˆ‘"Á°Kÿô4ƒÛ¶€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!<ŸÃx€„Ã`H)¥.|}x@’,M““ÁŒM<_;;@€BÁ´"Ht<ŸÃx€„ÃH)a-ƒ|zx@Ž$M ““ÁŒ<_;€BÁ´"H8£ëxDÓxH.©,at@‚4M““ÁŒ<_;€BÁ´"<_8“Áˆ‘"Á°Hˆ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!€\ "9)ÿÿ/‰‘"@ž€| €C€| ¦| xN€!€t8@“ AtHœ8`H,,ap@‚HN“¡Œ“¡MM€<_;; ;@€BÁ´8 "€AŒAˆ<_‘"Á°KÿòD€\ "9)ÿÿ/‰‘"@ž€| €C€| ¦| xN€!€p“¡“Áp €A|<Ÿ€„ÂP€b$H'¡,axA‚@8`H(-,ahA‚,€\8B\“ƒ €ax€hH+e,ad@‚DNƒ{¶<_;M; ;@M€€BÁ´8!“aŒ"<_“aˆ‘"Á°H´€Ax"9)ÿÿ/‰‘"@ž€ax€C€| ¦| xN€!;À€Ah“Áx"9)ÿÿ/‰‘"@ž€ah€C€| ¦| xN€!“Áh€Ad"9)ÿÿ/‰‘"@ž€ad€C€| ¦| xN€!“Ádƒ»¶€]8B]<0€I8Bÿÿ/‚I@ž€|0€C€| ¦| xN€!“¼0€]8B]<,€I8Bÿÿ/‚I@ž€|,€C€| ¦| xN€!“¼,<Ÿ8¡H€aT€„äH*/ƒ@œD“¡Œ<_;@;€BÁ´.; 8$MM"€AŒAˆ<_‘"Á°H4ƒaH,|&TþÀ&/€HAž,WÞ€>Ð WÞ€>8`H&/ƒalAžX!L<€I8BI€L€Al !T€I8BI€T€Al€cÁ(€lH)|zy@‚DNM“¡Œ<_;M; €BÁ´;@8%"€AŒAˆ<_‘"Á°Hd€Al"9)ÿÿ/‰‘"@ž€al€C€| ¦| xN€!“al€\,"9)ÿÿ/‰‘"@ž€|,€C€| ¦| xN€!;À“¡Œ“¡ˆ“\,HÐ<Ÿ€aT8¡`€„ÃH(]/ƒ@œD“¡Œ<_;@;€BÁ´.; 8&MM"€AŒAˆ<_‘"Á°H€`.|@&TBŸþ/‚A`Ažœ<8€€cÁH'É|{y@‚@M“¡Œ<_;M; €BÁ´;@8'"€AŒAˆ<_‘"Á°H €\0"9)ÿÿ/‰‘"@ž€|0€C€| ¦| xN€!;À“¡Œ“¡ˆ“|0HÀ<Ÿ€aT8¡H€„ÄHH'M/ƒ@œD“¡Œ<_;@;€BÁ´.; 8(MM"€AŒAˆ<_‘"Á°H€ƒaH!;| Ù/€H@ž;À“¡Œ“¡ˆH<<Ÿ€aL€„Ä´H(-|~y@‚LN“¡Œ<_;M; M€€BÁ´;@8)"€AŒAˆ<_‘"Á°<_Á¬H¼€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!ÃóxH(I,@‚@N“ÁŒ<_;M;@M€€BÁ´8*"“¡ˆ<_; ‘"Á°H|<Ÿ8„ŒLH9.|4|&TŸþ/€`AžÜ<Äóx€cĸH'-/ƒat@žDM“ÁŒ<_;M;@€BÁ´8,"<_“¡ˆ; ‘"Á°<_Á¬HÀ€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!€At8`“atAˆH!Á,apA‚@!ˆ€I8BI€Aˆ!pI <_€B¶h€p€bH$å,ax@‚DN“ÁŒ<_8-M;M€€BÁ´; ;@"<_‘"Á°<_Á¬Hø€Ap"9)ÿÿ/‰‘"@ž€ap€C€| ¦| xN€!€ax8€8 “apKúV¥€Ax"9)ÿÿ/‰‘"@ž€ax€C€| ¦| xN€!M“ax“ÁŒM<_8-;; €BÁ´;@"<_Á¬<_‘"Á°HD“ÁŒ;À“¡ˆ“|HPNƒ{¶;; M;@M€“a“aŒ“aˆ`!d/‰Až8€I8Bÿÿ/‚I@ž$€ad€C€| ¦| xN€!``!h/‰Až8€I8Bÿÿ/‚I@ž$€ah€C€| ¦| xN€!``!l/‰Až8€I8Bÿÿ/‚I@ž$€al€C€| ¦| xN€!``!p/‰Až8€I8Bÿÿ/‚I@ž$€ap€C€| ¦| xN€!``!t/‰Až8€I8Bÿÿ/‚I@ž$€at€C€| ¦| xN€!``!x/‰Až8€I8Bÿÿ/‚I@ž$€ax€C€| ¦| xN€!``AŠ0€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!A’0€]8Bÿÿ/‚]@ž€]£ëx€| ¦| xN€!AŽ0€Z8Bÿÿ/‚Z@ž€ZCÓx€| ¦| xN€!<;Àÿÿ8ceˆKú_%€Y8Bÿÿ/‚Y@ž €Y#Ëx€| ¦| xN€!`!€I8Bÿÿ/‚I@ž€I€a€| ¦| xN€!!Œ€I8Bÿÿ/‚I@ž€I€aŒ€| ¦| xN€!!ˆ€I8Bÿÿ/‚I@ž€I€aˆ€| ¦| xN€!€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`€A|"9)ÿÿ/‰‘"@ž€a|€C€| ¦| xN€!€AL"9)ÿÿ/‰‘"@ž€aL€C€| ¦| xN€!€AP"9)ÿÿ/‰‘"@ž€aP€C€| ¦| xN€!€AT"9)ÿÿ/‰‘"@ž€aT€C€| ¦| xN€!€AX"9)ÿÿ/‰‘"@ž€aX€C€| ¦| xN€!€A\"9)ÿÿ/‰‘"@ž€a\€C€| ¦| xN€!8!àÃóxa€ºAÿÈ|¦}r }q }p N€ ``|@&|¦¾ÿÐ8À|yx8àBŸ9 8è¦A”!ÿ€<_;”ܜ¡ 8aœ8 <8Åóx9ÿ<Ÿ#Ëxƒ·–h8BY€K8BK=€„¢Ð9)‘=HÅ|xy@‚¬<_ºëx8D€B¢"Hx<_ºëx8K€B¢"H<_ºëx8L€B¢"<_¡ü<_‘"¢H<_ºëx8M€B¢"KÿÿØ<_ºëx8N€B¢"KÿÿÀ<_ºëx8O€B¢"Kÿÿ¨``8€H |~y@‚TN<_8Dºëx;€€B¢"<_¡ü<_‘"¢€X8Bÿÿ/‚X@žôHÐ```€X8Bÿÿ/‚X@ž €XÃx€| ¦| xN€!`€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`€a8H-/ƒÿÿ@ž4<_ºëx8E€B¢"<_¡ü<_‘"¢H|``yKùò­,@‚$<_ºëx8F€B¢"KÿÿÀ``y€a8Hy|xy@‚<_ºëx8J€B¢"KÿÿŒºëx;`>¿>ß>ŸÃxHÝ|}yÀ&@¢@H /ƒAžWÞ€>Ð WÞ€>€V¢8J;€"¡ü‘5¢Kÿþˆ``€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€]€B4/‚Až$€ /€Až£ëx8€H=||xHd8`H­|~y@¢N;€HP`£ëxÄóxHÉ€^||x8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`.@²,6¢8Kºëx€I¡üU¢Kÿýœ```ƒãxH|~xHÕ/ƒ@¾ü¬€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€YÂÙ.=€I4/‚Až,€ /€Až £ëx8€H%||xHl``8`H|~y@¢N;€HP`£ëxÄóxH©€^||x8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`.@²,6¢8Lºëx€I¡üU¢Kÿü|```ƒãxH}|~xHµ/ƒ@¾û¤€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€Y|BÚ“Â=€I4/‚Až(€ /€Až£ëx8€H||xHh`8`Hm|~y@¢N;€HP`£ëxÄóxH‰€^||x8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`.@²,6¢8Mºëx€I¡üU¢Kÿû\```ƒãxH]|~xH•/ƒ@¾ú¬€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€Y|BÚ“Â=€I4/‚Až(€ /€Až£ëx8€Há||xHh`8`HM|~y@¢N;€HP`£ëxÄóxHi€^||x8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`.@²,6¢8Nºëx€I¡üU¢Kÿú<```ƒãxH=|~xHu/ƒ@¾ù¤€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€Y|BÚ“ =€I4/‚Až(€ /€Až£ëx8€HÁ||xHh`8`H-|~y@¢N;€HP`£ëxÄóxHI€^||x8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!`.@²,6¢8Oºëx€I¡üU¢Kÿù```ƒãxH|~xHU/ƒ@¾øœ€\8Bÿÿ/‚\@ž(€\ƒãx€| ¦| xN€!```€Y8ÿÿºëx|BÚ“Â9})Ú;{ KÿùÌ€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!<Ÿ#Ëx€„¤(H1.||x@’(<_8R=?€B¢b<_¡ü‘i¢H`8`H™|xy@‚(<_8R=?€B¢b<_¡ü‘i¢H€¡<ƒãxÃxH½|~y@‚(<_8R=?€B¢b<_¡ü‘i¢Kÿ÷¼€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!€X8Bÿÿ/‚X@ž€XÃx€| ¦| xN€!€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!7–h€I}>Kx8BIHd€XÃx€| ¦| xN€!``A’0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<;À8cFKúQ5!/‚a@žA’@8H4``/“Až„TB8;€ÿÿ|S"B1Š}i”‘b‘‚H\‹Á¤ÃóxH /ƒ@ž /ž-@ž@<Ÿ<¡#Ëx8„8 8¥€¤H /ƒAž <<Ÿ%Ëx€cˆ@8„8`8c°H |AÒˆb£/ Aš/ƒ ;À@ž;À/œAœdAš/ƒ ;À@ž;À88à`€¤|A®/‚Až }Hð``8Gˆ |Gx9)/€-Ažÿì``?imunable to malloc %d subheadersunable to open file %s for writingimsubit2pygr.cnestedlist.NLMSASliceIteratorgenerate letters (nodes) in this LPO slicepygr.cnestedlist.NLMSANodeinterface to a node in NLMSA storage of LPO alignmentedgesidiposnlmsaSlicegetSeqPosgetEdgeSeqsnodeEdgespygr.cnestedlist.NLMSASliceLettersgraph interface to letter graph within this regionitemsiteritemspygr.cnestedlist.NLMSASlicelettersstartstopnlmsaSequencenlmsaseqkeysmatchIntervalsfindSeqEndsgenerateSeqEndsgroupByIntervalsconservationFilterfilterIvalConservationgroupBySequencesclip_interval_listsplitregionsrawIvalspygr.cnestedlist.NLMSAtoplevel interface to NLMSA storage of an LPO alignmentpathstemseqsseqlistseqDictcurrentUnionlpoListmaxLPOcoordmaxleninlmsais_bidirectionalpairwiseModein_memory_mode_persistent_id_ignoreShadowAttr__doc___saveLocalBuildinverseDBclose__reduce____getstate____setstate__read_indexesread_attrsaddToSeqlistnewSequencenextIDinitLPOinit_pairwise_modeaddAnnotationadd_aligned_intervalsreadMAFfilesreadAxtNetbuildFilessave_seq_dictbuildseqIntervalpygr.cnestedlist.IntervalFileDBIteratormergeSeqpygr.cnestedlist.NLMSASequencesequence interface to NLMSA storage of an LPO alignmentlengthnbuildis_lpois_unionoffsetnamefilestemnlmsaLettersbuildListforceLoadbuildInMemorypygr.cnestedlist.IntervalFileDBopenfind_overlapfind_overlap_listcheck_nonemptypygr.cnestedlist.IntervalDBIteratorpygr.cnestedlist.IntervalDBsave_tuplesrunBuildMethodbuildFromUnsortedFilewrite_binariesadvanceStartStopdump_textfiletextfile_to_binariescnestedlist.pyxraise: arg 3 must be a traceback or Noneinstance exception may not have a separate valueraise: exception must be an old-style class or instancefunction takes at most %d positional arguments (%d given)required keyword argument '%s' is missing__import__OOOOdivO|Opygr.cnestedlist.IntervalDB.write_binariespygr.cnestedlist.IntervalDB.check_nonemptyendpygr.cnestedlist.IntervalDB.find_overlap_listpygr.cnestedlist.IntervalDB.find_overlapfilenamenOipygr.cnestedlist.IntervalDB.buildFromUnsortedFilebuildInPlace|Opygr.cnestedlist.IntervalDB.runBuildMethodnsize|OOpygr.cnestedlist.IntervalDB.__cinit__dbiiOMissing type objectArgument '%s' has incorrect type (expected %s, got %s)pygr.cnestedlist.IntervalDBIterator.__cinit__pygr.cnestedlist.IntervalDBIterator.__next__pygr.cnestedlist.IntervalFileDB.check_nonemptypygr.cnestedlist.IntervalFileDB.find_overlap_listpygr.cnestedlist.IntervalFileDB.find_overlapOpygr.cnestedlist.IntervalFileDB.openmodepygr.cnestedlist.IntervalFileDB.__cinit__pygr.cnestedlist.__iadd__pygr.cnestedlist.NLMSASequence.__iadd__pygr.cnestedlist.NLMSASequence.__len__pygr.cnestedlist.buildInMemorypygr.cnestedlist.NLMSASequence.buildInMemorypygr.cnestedlist.NLMSASequence.buildFilespygr.cnestedlist.NLMSASequence.closepygr.cnestedlist.NLMSASequence.forceLoadpygr.cnestedlist.IntervalFileDBIterator.mergeSeqpygr.cnestedlist.IntervalFileDBIterator.__next__pygr.cnestedlist.NLMSA.__iadd__pygr.cnestedlist.NLMSA.__invert__apygr.cnestedlist.NLMSA.addAnnotationpygr.cnestedlist.NLMSA.nextIDpygr.cnestedlist.NLMSA.newSequencestatepygr.cnestedlist.NLMSA.__setstate__pygr.cnestedlist.NLMSA.__getstate__pygr.cnestedlist.NLMSA.__reduce__pygr.cnestedlist.NLMSA.__iter__pygr.cnestedlist.NLMSASlice.__setitem__Subscript deletion not supported by %spygr.cnestedlist.NLMSASlice.rawIvalsminAlignedpygr.cnestedlist.NLMSASlice.splitpygr.cnestedlist.NLMSASlice.generateSeqEndspygr.cnestedlist.NLMSASlice.findSeqEndspygr.cnestedlist.NLMSASlice.iteritemspygr.cnestedlist.NLMSASlice.letters.__get__pygr.cnestedlist.NLMSASlice.__iter__pygr.cnestedlist.NLMSASliceLetters.iteritemspygr.cnestedlist.NLMSASliceLetters.itemspygr.cnestedlist.NLMSASliceLetters.__iter__pygr.cnestedlist.NLMSANode.__getitem__pygr.cnestedlist.NLMSANode.__iter__pygr.cnestedlist.IntervalFileDBIterator.loadAllpygr.cnestedlist.IntervalFileDBIterator.nextBlockpygr.cnestedlist.IntervalFileDBIterator.restartpygr.cnestedlist.IntervalDBIterator.cnextpygr.cnestedlist.NLMSASequence.saveIntervalpygr.cnestedlist.IntervalFileDBIterator.cnextpygr.cnestedlist.IntervalFileDBIterator.extendpygr.cnestedlist.IntervalFileDBIterator.copyistartistopiOiipygr.cnestedlist.advanceStartStoppygr.cnestedlist.NLMSASliceIterator.__cinit__pygr.cnestedlist.NLMSASliceLetters.__cinit__nodepygr.cnestedlist.NLMSASliceLetters.__getitem__nspygr.cnestedlist.NLMSA.addToSeqlistCannot convert %s to %spygr.cnestedlist.NLMSA.save_nbuildpygr.cnestedlist.NLMSA.closepygr.cnestedlist.NLMSA.initLPOpygr.cnestedlist.get_seq_intervalpygr.cnestedlist.NLMSASlice.get_seq_intervalprefixDictbuildpathO|OOOpygr.cnestedlist.textfile_to_binariescnestedlist__builtin____builtins__IntervalDB__pyx_vtable__IntervalDBIteratorIntervalFileDBNLMSASequenceIntervalFileDBIteratorNLMSANLMSASliceNLMSASliceLettersNLMSANodeNLMSASliceIteratorpygr.cnestedlistpygr.cnestedlist.NLMSANode.__cmp__pygr.cnestedlist.NLMSANode.edges.__get__pygr.cnestedlist.getSeqPospygr.cnestedlist.NLMSANode.getSeqPospygr.cnestedlist.NLMSASlice.__cmp__pygr.cnestedlist.NLMSASlice.__repr__pygr.cnestedlist.NLMSASlice.__hash__pygr.cnestedlist.NLMSASlice.matchIntervalspygr.cnestedlist.NLMSASlice.__getitem__mafFilesaxtFilesmaxOpenFilesnPadmaxinttrypathbidirectionalbidirectionalRuleuse_virtual_lpoalignedIvals|OOOOOOOOOOOOOOOOOpygr.cnestedlist.__init__pygr.cnestedlist.NLMSA.__init__pygr.cnestedlist.NLMSA.init_pairwise_modepygr.cnestedlist.NLMSA.add_aligned_intervalssaveSeqDictpygr.cnestedlist.NLMSA.buildFilespygr.cnestedlist.NLMSA.save_seq_dictpygr.cnestedlist.buildpygr.cnestedlist.NLMSA.buildiseqiiipygr.cnestedlist.NLMSA.seqIntervalpygr.cnestedlist.NLMSA.__setitem__pygr.cnestedlist.__getitem__pygr.cnestedlist.NLMSASequence.__getitem__unpack sequence of wrong sizepygr.cnestedlist.NLMSASliceIterator.__next__iO|iipygr.cnestedlist.NLMSANode.__cinit__mergeAllpygr.cnestedlist.NLMSASlice.edgespygr.cnestedlist.NLMSASlice.itemspygr.cnestedlist.NLMSASlice.keyslOOOpygr.cnestedlist.NLMSASlice.clip_interval_listpygr.cnestedlist.read_indexespygr.cnestedlist.NLMSA.read_indexespygr.cnestedlist.read_attrspygr.cnestedlist.NLMSA.read_attrspygr.cnestedlist.__setitem__pygr.cnestedlist.NLMSASequence.__setitem__pygr.cnestedlist.NLMSA.add_seqidmap_to_unionpygr.cnestedlist.NLMSASlice.findSeqBoundsoutfilenamepygr.cnestedlist.dump_textfileotherpygr.cnestedlist.NLMSANode.getEdgeSeqspygr.cnestedlist.nodeEdgespygr.cnestedlist.NLMSANode.nodeEdgesOii|iiOpygr.cnestedlist.__cinit__pygr.cnestedlist.NLMSASlice.__cinit__maxgapmaxinsertmininsertfilterSeqsfilterListmergeMostmaxsizeivalMethod|iiiOOOOOOpygr.cnestedlist.groupByIntervalspygr.cnestedlist.NLMSASlice.groupByIntervalsmpIdentityMinminAlignSizemaxAlignSizeOO|OOOpygr.cnestedlist.NLMSASlice.conservationFilterseqIntervalsfilterFunO|OOpygr.cnestedlist.filterIvalConservationpygr.cnestedlist.NLMSASlice.filterIvalConservationsourceOnlyindelCutseqGroupspMinAlignedseqMethodO|OOOOOOpygr.cnestedlist.groupBySequencespygr.cnestedlist.NLMSASlice.groupBySequencesdummyArgpygr.cnestedlist.NLMSASlice.regionsOOpygr.cnestedlist.readMAFfilespygr.cnestedlist.NLMSA.readMAFfilespygr.cnestedlist.readAxtNetpygr.cnestedlist.NLMSA.readAxtNetpygr.cnestedlist.NLMSA.__getitem__nbufferii|OOiOpygr.cnestedlist.IntervalFileDBIterator.__cinit__nlOOO|OOOpygr.cnestedlist.NLMSASequence.__init__pygr.cnestedlist.IntervalDB.save_tuples%2s %63s %d %d %2s %d %s *** WARNING: Unknown sequence %s ignored... - *** WARNING: Incorrectly formated alignment line ignored: %s %s%d %63s %d %d %63s %d %d %2s %dpygr/apps/maf2nclist.csrc_seqdest_seq *** WARNING: Unknown sequence %s, %s ignored... +C0€ÿÿÿ?dhÀ³Ô³¬³ ³Eû?ˆi@iDPÄ€³€e?´$fàд|cc ´lEû?Ðg`g°Bpb<aìaˆѰ@ @a°get this node's edges as list of tuples (ival1,ival2,edge)@ @@ @(bä@4µPb¤@@ÃÀb|get all outgoing edges from this nodereturn dict of sequences that traverse edge from self -> otherreturn seqpos for this seq at this nodeD°@pD°h0@L eµ$dd„µEû@pe€eÐ>ðd(dg@@¤9 dX@¬6ðlist of tuples (node,{target_node:edge})jfP@¸@`@ !`µÌu0u$$Àµ¼Eûb0c4ðfdeØexÕ0@Ô3€e interface to individual LPO letters in this interval@Ü @ä@@ì0@ü4A8@Ý tà@¤î°t¨@¬/Aúðt\A'ps˜A )0s`A,! s8A<0nAP¦@AdÄðA|ÖÀh°A°h€A¤ PhA¬\€g˜A´Àgdreturn list of raw numeric intervals in this sliceget LPO region(s) corresponding to this interval Same group-by rules apply here as for the split() method.Use groupByIntervals() and groupBySequences() methods to divide this slice into subslices using indel rules etc.truncate list of 1:1 intervals using start,endmerge groups of sequences using "vertical" group-by rules: - seqGroups: a list of one or more lists of sequences to group. Each group will be analyzed separately, as follows: - sourceOnly: output intervals will be reported giving only the corresponding interval on the source sequence; redundant output intervals (mapping to the same source interval) are culled. Has the effect of giving a single interval traversal of each group. - indelCut: for sourceOnly mode, do not merge separate intervals as reported by seqIntervals (in other words, that the groupByIntervals analysis separated due to an indel). - minAligned: the minimum #sequences that must be aligned to the source sequence for masking the output. Regions below this threshold are masked out; no intervals will be reported in these regions. - pMinAligned: the minimum fraction of sequences (out of the total in the group) that must be aligned to the source sequence for masking the output. - seqMethod: you may supply your own function for grouping. Called as seqMethod(bounds,seqs,**kwargs), where bounds is a sorted list of (ipos,isStart,i,ns,isIndel,(start,end,targetStart,targetEnd)) seqs is a list of sequences in the group. Must return a list of (sourceIval,targetIval). See the docs. merge alignment intervals using "horizontal" group-by rules: - maxgap (=0): longest gap allowed within a region - maxinsert (=0): longest insert allowed within a region - mininsert (=0): should be 0, to prevent cycles within a region use negative values to allow some overlap / cycles. - maxsize: upper bound on maximum size for interval merging - mergeMost: merge, but with limits (10000,10000,-10,50000) - mergeAll: merge everything without any limits - filterSeqs (=None): dict of sequences to apply these rules to; other sequences alignment will be ignored if filterSeqs not None. Slower than the filterList option. - filterList (=None): list of sequence intervals to mask the result set by. Note: a single sequence should not be represented by more than one interval in filterList, as only one interval for each sequence will be used as the clipping region. Significantly faster than filterSeqs. - ivalMethod: a function to process the list of intervals for each sequence (it can merge or split them in any way it wants) - pAlignedMin: a fractional minimum alignment threshold e.g. (0.9) - pIdentityMin: a fractional minimum identity threshold e.g. (0.9) get list of tuples (ival1,ival2,edge)get maximum interval of seq aligned in this intervalget all 1:1 match intervals in this region of alignment as list of tuples. if seq argument not None, only match intervals for that sequence will be included. No clipping is performed.get list of intervals aligned to this slice according to groupBy optionsget list of tuples (ival2,edge) aligned to this sliceget list of tuples (srcIval,destIval,edge) aligned in this sliceCð8 `CðdpAÀXV|0|{ü¶dEûAØYÐ[À w€v;pU`B BB$B,B4BD$BL(BX0B`4Bh8B|<BŒ@BœDB¬HBÀLBÈPBØTBäsP{ÜBìÿBøüCùPC€{˜C(8@{XC4lp{$CDìÐzôCPëPzÈCXw°z¨C`l zdCtæz$C„pÐzCœi`yØC¬–Ðy¬C¸t0yhCÄÀy8CÔ ÐxðCܯ°xÀget specified interval in the target sequencebuild nestedlist databases from saved mappings and initialize for usesave seqDict to a worldbase-aware pickle filebuild nestedlist databases on-disk, and .seqDict index if desiredread alignment from a set of axtnet filesread alignment from a set of MAF filesadd alignedIvals to this alignmentsave alignment of sequence interval --> an annotation objectturn on use of virtual LPO mapping (i.e. no actual LPO is present!)create LPOs for this alignmentget a unique nlmsaID and advance countercreate a new nestedlist index for sequence seqadd an NLMSASequence to our seqlist, and set its idread pickled attribute dictionary from file and apply to selfopen all nestedlist indexes in this LPO database for immediate useclose our shelve index filesÄðµ€_°äáCè4R°¶¸¶¶„¶tEûTTB°Ý°}ˆìÐDÚð}¨merge intervals into single interval per sequence orientationDDK@€Ì€¤€˜·PEûD<NOp˜~¨øÐJP@ DtD|D„DŒD˜ A$D (D¨8D´<DÄ@DÐØÐ€`BäÕ`€ C¸È°èDÜÁ`build nested list from saved unsorted alignment datafree memory and close files associated with this sequence indexforce database to be initialized, if not already openÀ€¾G@À€R ¶Dì I€·¤·|·p·`û‚$²E ° E­`E$¥E8¢ðBäCEH`(G ¸¸h¸\¸LEûH°I?`Ÿ ¸<œPElFÀ¹l¹D¹8¹(û„“ðEˆ€„üE”’„ÈE¤‰à„”E† E$~€E8{ðE¼x€Bä?Àload unsorted binary data, and build nested listbuild either in-place or using older build methodbuild in-memory NLMSA from list of alignment tuplesrbrwb###mafa º¼©€ºÀ©pºÄ©\ºÈ©P ºÌ©<ºÐ©0 ºÔ© ºØ© ºÜ© ºà¨ø ºä¨èºè¨Ôºì¨¼ºð¨° ºô¨ ºø¨ºü¨„ »¨t»¨l»¨X» ¨L »¨@ »¨0 »¨$ »¨ » ¨ »$§ü»(§ì»,§ä»0§Ô »4§¼»8§¨»<§ »@§” »D§Œ»H§€ »L§h»P§X»T§L »X§<»\§,»`§(»d§ »h§»l§»p¦ü»t¦è»x¦Ô»|¦Ì»€¦Ä»„¦¼»ˆ¦¸»Œ¦ »¦” »”¦ˆ »˜¦„»œ¦|» ¦p »¤¦h»¨¦\ »¬¦H»°¦4»´¦0»¸¦,»¼¦ »À¦»Ä¦»È¦ »Ì¥ü»Ð¥è»Ô¥à»Ø¥Ô »Ü¥Ì»à¥À »ä¥¸»è¥°»ì¥¨»ð¥ »ô¥˜»ø¥»ü¥€ ¼¥x¼¥l ¼¥d¼ ¥X ¼¥L ¼¥< ¼¥0 ¼¥$ ¼ ¥ ¼$¥¼(¥ ¼,¥ ¼0¤ø¼4¤è¼8¤Ü ¼<¤Ð ¼@¤Ä ¼D¤¼¼H¤¸¼L¤°¼P¤¤ ¼T¤œ¼X¤ ¼\¤„ ¼`¤€¼d¤t ¼h¤d ¼l¤X ¼p¤H ¼t¤@¼x¤4 ¼|¤( ¼€¤ ¼„¤ ¼ˆ¤¼Œ£ø¼…4¼”£ô¼˜£è ¼œ…0¼ £Ü ¼¤£Ì ¼¨£À ¼¬£° ¼°£ ¼´£¼¸£ˆ¼¼£x¼À£l ¼Ä£\¼È£T¼Ì£D¼Ð£8 ¼Ô£4¼Ø£( ¼Ü£ ¼à£ ¼ä£ ¼è£¼ì¢ø¼ð¢ì ¼ô¢à ¼ø¢Ø¼ü¢Ì ½¢À ½¢´ ½¢¬½ ¢˜½¢½¢„ ½¢|½¢t½ ¢l½$¢h½(¢\ ½,¢L ½0¢D½4¢@½8¢8½<…8½@¢, ½D¢$½H¢½L¢ ½P¡ô½T¡Ð#½X¡À½\¡¤½`¡€"½d¡p½h¡49½l¡½p ô&½t Ô½x °$½| ˆ%½€  z½„Ÿè!½ˆŸÀ(½ŒŸ°½Ÿ”½”Ÿ„½˜Ÿh½œŸ42½ Ÿ,½¤Ÿ ½¨žð½¬žÐ½°žœ1½´žh3½¸žX½¼ž4"½Àž( ½Äž$½Èž ½Ìä'½ÐØ ½Ô°(½Øœ¨½Üœl:½àœ47½äœ,½è›è½ì›h€½ð›P½ô›8½ø› ½üšð'¾š¸6¾š°¾š”¾ šˆ ¾š„¾š|¾š(S¾™ü*¾ ™ì ¾$™Ø¾(™Ä¾,˜€B¾0˜`¾4˜X¾8˜L ¾<—5¾@–ø¾D•d‘¾H•L¾L•4¾P• ¾T•¾X”ð+¾\”è¾`”d„¾d”L¾h”0¾l”,...Saving NLMSA binary index: bad format in file %sYou must supply sequence database(s) for the following prefixes, by passing them in the prefixDict optional dictionary argument: %s.idDictYou must provide a seqDict for this NLMSA!bad format in %serror or EOF reading %serror writing file %sWarning: Because one or more of the sequence databases in the seqDict have no worldbase ID, there is no host-independent way to save it to a textfile for transfer to another machine. Therefore, when loading this textfile on the destination machine, you will have to provide a dictionary for these sequence database(s) as the prefixDict argument to textfile_to_binaries() on the destination machine.error writing to file %sWarning: Because your seqDict has no worldbase ID, there is no host-independent way to save it to a textfile for transfer to another machine. Therefore, when loading this textfile on the destination machine, you will have to provide the seqDict argument to textfile_to_binaries() on the destination machine..seqIDdict.txtthis mapping is not invertibleNote: the NLMSA.seqDict was not saved to a file. This is not necessary if you intend to save the NLMSA to worldbase. But if you wish to open this NLMSA independently of worldbase, you should call NLMSA.save_seq_dict() to save the seqDict info to a file, or in the future pass the saveSeqDict=True option to NLMSA.build().Index files saved.empty alignment!%d %s %d %d axtNet block too long! Increase max size%s is not correct axtNet file name. Correct name is (chrid.)source.target.net.axt..axt..net.axtProcessing axtnet file: os.pathNon-alignment text lines ignored: prefix %s, count %dMAF block too long! Increase max size%s: not a MAF file? Bad format.unable to open file %sProcessing MAF file: Sequence too long for 32 bit int: %s, %d Something is probably wrong with creation / reading of this sequence. Check the input!you cannot iterate over NLMSAsSorry! Query interval spans multiple LPOs!key must be a sequence interval or python slice objectUsage only nlmsa[s1]+=s2 allowed. nlmsa[s1]=s2 forbidden! Because you are aligning a pair of sequence intervals, the pairwiseMode=True option is automatically being applied. To avoid this message in the future, pass the pairwiseMode=True option to the NLMSA constructor. See the NLMSA documentation for more details. this alignment is already using an LPO!.attrDictunable to find sequence %s in seqDict!corrupted NLMSAIndex??? .NLMSAindexcan't pickle NLMSA.in_memory_modeunknown mode %smaxLPOcoord and pairwiseMode options incompatible!key must be a sequence interval of this sequencewrite_padded_binary failed???not opened in write modeunable to open in write mode: .buildNLMSASequence: seq must have name or id attributehey! write some code here!seq not in nodeseq not in this alignmentout of boundsno LPO in nlmsaSlice.seqBounds? Debug!seq not aligned in this intervalthis NLMSA is read-only! Currently, you cannot add new alignment intervals to an NLMSA after calling its build() method.sequence mapped to non-LPO target??this interval is not aligned!empty IntervalFileDB, not searchable!src is None! Debug!!Iterator has no database! Please provide a db argument.out of memoryempty IntervalDB, not searchable!IntervalMap file corrupted?unable to open unable to allocate IntervalMap[%d]could not open file %sxmlrpcwrite_binarieswriteworldbasewarnwtypestarget_starttargetDBsysstripstringstopstartswithstartsplitLPOintervalssplitsourcePathsourceOnlysourceDBsortsetrlimitsequenceseqlistseqdbseqIntervalseqInfoDictseqDictseqBoundsseqsave_tuplessave_seq_dictsaveSeqrunBuildMethodresourcereopenReadOnlyremoverelativeSliceread_seq_dictread_indexesread_attrsreadMAFfilesreadAxtNetrawIvalsrUpygrprune_self_mappingsprefixDictpicklepathstempathForwardpathpairwiseModepMinAlignedpIdentityMinpAlignedMinosorientationopen_shelveopenonDemandoffsetnsnonamenodeEdgesnlmsa_utilsnlmsaSlicenlmsaSequencenextIDnewSequencenamenmsaSlicemininsertminAlignedminAlignSizemergeSeqmergeAllmemorymaxinsertmaxgapmaxAlignSizemappingloggerloadlengthkeysjoiniteritemsitemsis_unionis_lpois_bidirectionaliposinverseDBinitLPOinfoindelCutimidgroupBySequencesgroupByIntervalsgetSeqIDgetSeqgetIDcoordsgetIDgetforceLoadfilterSeqsfilterIvalConservationendedgesdumpdoSliceconservedSegmentconservationFiltercmpcloseclip_interval_listclassutilchrcheck_nonemptycache_referencecacheHintbuildInMemorybuildFromUnsortedFilebuildFilesbuildbasenameappendadvanceStartStopadd_aligned_intervalsaddToSeqlistaddAllabsoluteSlice_persistent_id_cache_max__init____iadd____getstate____class__StringTypeSeqPrefixUnionDictSeqPathSeqCacheOwnerSeq2SeqEdgeRLIMIT_NOFILEPrefixUnionDictNLMSAindexNLMSA_UNION_InternalNLMSA_LPO_InternalNLMSASequenceNLMSASeqDictLetterEdgeFloatTypeEmptySliceErrorEmptySliceEmptyAlignmentErrorDictQueueClassicUnpicklerBuildMSASliceAttributeErrorEÌ`Eàb€ªEð…à©Ðconvert pathstem.txt textfile to NLMSA binary filesdump NLMSA binary files to a text fileSEQID %s %d %d %dPREFIXUNION %s %sunknownPATHSTEM %s %d %d %d %d %sNoneNLMSASequence %sSEQID %s %d %d %d PREFIXUNION %s %s PATHSTEM %s %d %d %d %d %s FD¨G,@ÜGŒ@ÜGŒGìGøH4GìHt@ÜGŒH¨@ÜGŒ@ÜGŒD¨D¨JL8ADŒL¨M´A@@QQ @@QØAGìB,RÐRÜAABJB,U`UlUxBXUˆUU˜U B|U°UÄBLBØUÔUÔVW QQ @@QQ X@X@@ÜGŒX¸B,BZZHQØ@Ü@ä@D˜A[[[[([4[@[LX@[TA[À[Ä[Ô[ä\,[Ä\<\,\¬\¸\ÄM´\Ð\Ü]HU`UUlU°@ÜGŒH¨QØ^$A´^hD¨AJDŒDtX¸àà ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `   %À``@­x@­p@­l@­h@­d@­`@­\@­T@­P@­L@­H@­D@­@@­8@­4@­,@­(@­ @­@­@­@­ @­@­@­@¬ø@¬ô@¬ð@¬è@¬ä@¬à@¬Ü@¬Ø@¬Ð@¬Ì@¬È@¬Ä@¬À@¬¼@¬¸@¬´@¬°@¬¨@¬¤@¬ @¬œ@¬˜@¬”@¬Œ@¬„@¬€@¬x@¬p@¬l@¬h@¬`@¬X@¬P@¬L@¬H@¬D@¬<@¬8@¬4@¬,@¬$@¬@¬@¬@¬@¬ @¬@¬@¬@«ü@«ø@«ô@«ð@«ì@«è@«ä@«à@«Ü@«Ô@«Ì@«Ä@«À@«¼@«¸@«°@«¬@«¤@«œ@«”@«@«Œ@«ˆ@«€@«x@«p@«h@«d@«\@«T@«P@«H@«@@«<@«4@«0@«(@«$@« @«@«@« @«@«@ªø@ªô@ªì@ªè@ªà@ªÜ@ªØ@©¼@©´@©°@©¬@©¤@© @©”@©@”@” @”@“ü @“ô@“ì @“ä@“Ü @“Ô@“Ì @“Ä@“¼ @“´@“¬ @“¤@“œ @“”@“Œ @“„@“| @“t@“l @“d@“\ @“T@“L @“D@“< @“4@“, @“$@“ @“@“ @“@’ü @’ô@’ì @’ä@’Ü @’Ô@’Ì @’Ä@’¼ @’´@’¬ @’¤@’œ @’”@’Œ @’„@’| @’t@’l @’d@’\ @’T@’L @’D@’< @’4@’, @’$@’ @’@’ @’@‘ü @‘ô@‘ì @‘ä@‘Ü @‘Ô@‘Ì @‘Ä@‘¼ @‘´@‘¬ @‘¤@‘œ @‘”@‘Œ @‘„@‘| @‘t@‘l @‘d@‘\ @‘T@‘L @‘D@‘< @‘4@‘, @‘$@‘ @‘@‘ @‘@ü @ô@ì @ä@Ü @Ô@Ì @Ä@¼ @´@¬ @¤@œ @”@Œ @„@| @t@l @d@\ @T@L @D@< @4@, @$@ @@ @@ü @ô@ì @ä@Ü @Ô@Ì @Ä@¼ @´@¬ @¤@œ @”@Œ @„@| @t@l @d@\ @T@L @D@< @4@, @$@ @@ @@Žü @Žô@Žì @Žä@ŽÜ @ŽÔ@ŽÌ @ŽÄ@޼ @Ž´@ެ @ޤ@Žœ @Ž”@ŽŒ @Ž„@Ž| @Žt@Žl @Žd@Ž\ @ŽT@ŽL @ŽD@Ž< @Ž4@Ž, @Ž$@Ž @Ž@Ž @Ž@ü @ô@ì @ä@Ü @Ô@Ì @Ä@¼ @´@¬ @¤@œ @”@Œ @„@| @t@l @d@\ @T@L @D@< @4@, @$@ @@ @@Œü @Œô@Œì @Œä@ŒÜ @ŒÔ@ŒÌ @ŒÄ@Œ¼ @Œ´@Œ¬ @Œ¤@Œœ @Œ”@ŒŒ @Œ„@Œ| @Œt@Œl @Œd@Œ\ @ŒT@ŒL @ŒD@Œ< @Œ4@Œ, @Œ$@Œ @Œ@Œ @Œ@‹ü @‹ô@‹ì @‹ä@‹Ü @‹Ô@‹Ì @‹Ä@‹¼ @‹´@‹¬ @‹¤@‹œ @‹”@‹Œ @‹„@‹| @‹t@‹l @‹d@‹\ @‹T@‹L @‹D@‹< @‹4@‹, @‹$@‹ @‹@‹ @‹@Šü @Šô@Šì @Šä@ŠÜ @ŠÔ@ŠÌ @ŠÄ@м @Š´@Ь @Ф@Šœ @Š”@ŠŒ @Š„@Š| @Št@Šl @Šd@Š\ @ŠT@ŠL @ŠD@Š< @Š4@Š, @Š$@Š @Š@Š @Š@‰ü @‰ô@‰ì @‰ä@‰Ü @‰Ô@‰Ì @‰Ä@‰¼ @‰´@‰¬ @‰¤@‰œ @‰”@‰Œ @‰„@‰| @‰t@‰l @‰d@‰\ @‰T@‰L @‰D@‰< @‰4@‰, @‰$@‰ @‰@‰ @‰@ˆü @ˆô@ˆì @ˆä@ˆÜ @ˆÔ@ˆÌ @ˆÄ@ˆ¼ @ˆ´@ˆ¬ @ˆ¤@ˆœ @ˆ”@ˆŒ @ˆ„@ˆ| @ˆt@ˆl @ˆd@ˆ\ @ˆT@ˆL @ˆD@ˆ< @ˆ4@ˆ, @ˆ$@ˆ @ˆ@ˆ @ˆ@‡ü @‡ô@‡ì @‡ä@‡Ü @‡Ô@‡Ì @‡Ä@‡¼ @‡´@‡¬ @‡¤@‡œ @‡”@‡Œ @‡„@‡| @‡t@‡l @‡d@‡\ @‡T@‡L @‡D@‡< @‡4@‡, @‡$@‡ @‡@‡ @‡@†ü @†ô@†ì @†ä@†Ü @†Ô@†Ì @†Ä@†¼ @†´@†¬ @†¤@†œ @†”@†Œ @†„@†| @†t@†l @†d@†\ @†T@†L @†D@†< @†4@†, @†$@† @†@† @†@…ü @…ô@…ì @…ä@…Ü @…Ô@…Ì @…Ä@…¼ @…´@…¬ @…¤@…œ @…”@…Œ @…„@…| @…t@…l @…d@…\ @…T@…L @„x@„t@„h@„d@„X@„T@„H@„D@„8@„4@„0@„(@„$@„ @„@„@„@„@„@ƒà@ƒ¸@ƒ” @ƒ| @ƒx @ƒt @ƒ\@ƒP@ƒ @‚ø @‚ô@‚ð@‚ä@‚à@‚Ô @‚¼ @‚¸ @‚´ @‚œ@‚@‚h@‚d@‚X@‚T@‚H@‚D@‚8@‚4@‚(@‚$@‚@Ø@´ @œ @˜ @” @|@p@(@€°@€¤@€ @€œ@€˜@Ì@È@Ä@¼@¸@´@¬@¨@¤@œ@˜@p@\@H@4@ @ @~ø@~ä@~Ð@~¼@~¨@~„@~|@~`@~\@~H@~D@~@@~8 @~ @~@~@~@}ô@}”@}Œ@}ˆ@}d@}<@}8@}4@}(@}$@} @} @|ü @|ø @|à@|Ô@|Œ@|\@|@|@|@x¬@x¤@x @xœ@x”@x@xŒ@x„@x€@x|@xt@xp@xl@xd@x`@x\@xT@xP@xL@xD@x@@x<@x4@x0@x,@x$@x @x@x@x@x @x@x@wü@wô@wð@wì@wä@wà@wÜ@wÔ@wÐ@wÌ@wÄ@wÀ@w´@w°@w¤@w @w”@w@wŒ@w„@w€@wX@wD@w0@w@w@vô@và@vÌ@v¸@v¤@v@v|@vh@vT@v@@v,@v@uô@uì@uÐ@uÌ@uÄ@u¸@u´@u°@u¨ @u@uŒ@uˆ@up@ud@u<@u0@u,@u(@u$@gP@gH@gD@g@@g8@g4@g0@g(@g$@g @g@g@g@g@g@fø@fô@fè@fä@fà@fØ@fÔ@fÐ@fÈ@fÄ@fÀ@f¸@f´@f°@f¨@f¤@f @f˜@f”@fˆ@f„@f€@fx@ft@fp@fh@fd@f<@f(@f@f@eì@eØ@e„@e|@ex@eT@e4@e0@e,@e$@e@e@e @dô@dð@dì@dè @dä@dà@dÐ@dÄ@dœ@dˆ@d<@d8@d4@d,@d(@d@cÜ@c¸@c´@c¬@c @cœ@c˜@c @cx@ct@cp @cX@cL@c$@c@c@c @bh@b`@b\@bX@bP@bL@bH@b@@b<@b@b@aì@a”@aŒ@aˆ@ad@aD@a@@a<@a4@a(@a$@a @a @a@`ü@`ø @`ð@`à@`Ô@`¤@`| @`x@`t@`h@`d@``@`X @`@ @`< @`8 @` @`@­Ä@­À@­¼@­¸@­´@­°@­¬@­¨@­¤@­ @­œ@­˜@­”@­@­Œ@­ˆ@®Ü@®Ø@®Ô@®Ð@®Ì@®È@®Ä@®À@®¼@®¸@®´@®°@®¬@®¨@®¤@® @®œ@®˜@®”@®@®Œ@®ˆ@®„@®€@®|@®x@®t@®p@®l@®h@®d@®`@®\@®X@®T@®P@®L@®H@®D@®@@®<@®8@®4@®0@®,@®(@®$@® @®@®@®@®@® @®@®@®@­ü@­ø@­ô@­ð@­ì@­è@­ä@­à@­Ü@­Ø@­Ô@­Ð@­Ì@­È@®ì@®è@®ä@®à@ 3`  ` Ed ° nd ° €f < €. °D °D ¸D ¼D ÐD €D „D ˆD ŒD D ”D ÀD à ž$ ° ´@ ½@ Ê@ Ó€ ý€ € € 4€ F€ Ѐe€u€¢€Ø€è€ù€ €€,€=€Z€w€•€«€Ô€ä€ô€€€*€\€u€È@ Ò€ÞÀ °߀ 8íÀ Ôîà ï€ 8ýÀ @þà €ÿà ø€ €<$HN ø. D D! D# D% D' $D+ D=$ V@e@t€…€•$HN H. PDE PDG PDI `DK dDM tDQ ”–$E P¯@D¾@DÍ$HN ˜.  DV  DX  DZ °D\ ´D^ ÄDb äÎ$V  æ@Uõ@U$HN è. ðD ðD‘ ðD’D”(D–,D•0D—4D•8D”<D˜@D—DD”HD˜LD—PD‘T$ ð@Ž(@Ž2@ŽB@ MÀ ðNà`O$pN`.`D5`D7hD5lD7|D; P$5`j@4s@6}À`~€78ŒÀ€àÐŽ€78œÀàà žà8Ÿ$ØN8.@D@@DD@D@DDDHDEPDF\DG€DD„DKŒDOÄ $@@º@? Ç@?Ò@?Ü@?å@Aî@A ù@A À@àÈ$ˆNÈ.ÐDUÐDYÐDUÔDYØDZàD[ìD\DYDa$UÐ@T *@T5@T@@TI@VR€c€€€®@V ¹@VÂÀÐÃà Ä$PN . Dt Dv(Dt,Dv0Dt4Dv@DzÅ$t å€ö€€¹€Ê€v8ØÀLÙàÚ$ˆN¨.°D}°D¸D}¼DÄDÈDƒPÛ$}°ù@|@~@~ À°!àh"$¸Nh.pD‡pDˆ€D‰D‹”#$‡pC@†N$(N˜. Dâ Då¤Dæ¨Dâ°DåÄDâÌDæÔDéDëDì<DîPO$â a@án@á{@á†@á“@áŸ@ã¬@ä ¹€XÎÀ ÏàhÐ$ÈNh.pDôpDöxDô|Dö”D÷˜Dù@DûDDùLDûPDühD|Ñ$ôpå@òò@ò@ó@õ €,€I€wÀpx€÷8†À¤‡àðˆ€÷8–À—à@˜à”™$$N”. D D ¬D°D ÀD ÄD ÐD ÔDØDôDš$ ¶@È@Ô@â@ô@@@€MÀ Nà O$€N . Dœ Dž0Dœ8DœDDžHDŸLD TD¢\D£tD¢ˆD¦P$œ k@›u@›~@›‰@›–@Ÿ@«À ¬à¨­$ˆN¨.°D«°D¯¸D«¼D¯ÜD°pD²àD³ìD´DµD±D¹0Dº<D»PD¼TD¸`D¿lDÀ€DÁŒD¿˜D DİDŸD¿ÈDÉà®$«°Ç@©Ñ@©Ú@©å@ª÷@ª@¬À°€¯8Ààà0€¯8-ÀD.àp/€°8=À„>àà?àô@$DNô.DÍDÏDÍ DÏDÍ DÏ$DÓ0DÚ8DÓ<DÚLDÛPDÜXDà\DçlDàpDÏ|DêA$Í[@Ìe@Ìn@Ìy@̆@Î@Θ@Î¥À¦à¨§$¨N¨.°D4°D<ÔD4ØD<àD=ôD>DC DD,DF4DGðDHüDIDH DIDJ DO(DP<DSDDTDU°DV¼DUÀDVÈDWÔDXàDYèD]D`ÀDaÄD^ÈD_ÌD`ÐDiØDjàDkäDjèDlìDmðDlôDnøDmüDnDoDqDpDrDs,Dt8Ds<Dt@DuDDvLD|pD~xD€ ¨$4°Â@2Ó@2ã@3û€58€€%€C€€m€Š€5<•€5@Ÿ€5D¬€5H¶€6LÂ@8Ô@9å@:ò€À°€FL!À@"à#€FL1À 2àð3€SLAÀ\BàC€]LQÀRà`S€]LaÀtbàÀcàÀd$NÀ.ÀD…ÀD†ÔD‡èD‰ìDŠøDŒüDDŽ,D4e$…À@„‘$ŒNL.PD—PDŸpD—tDŸ|D D¡ D£¨D¥ÐD¦ØD§äD¦èD§ìD¨ôD¬üD°$D±0D²DD³TDµ\D¶pD¸ŒDµ¬D»¼D¾ÄD¿ÐDÀäDÁôDÃüDÄDÆ,DÃLDÈTDÃXDÈ\DÃdDÊhDÍpDÎ|DÏDРDѨDÓÀDÕÜDÒDÚDÞ0Dß8Dâ`DãhDæ„DçŒDµ¸DÃÄDéÐ’$—P¨@•¹@•Ê@–Ú@–ç@˜ð€˜8ø€˜<€˜@ €˜D€˜H$@˜0€™t<€š\E€›LO€œT`@mÀPnàäo$”Nä.ðDîðDö Dî Dö $Dø 8Dû lDü ˆDý ˜Dÿ  D ÈD ÐD àD èD ðD üD !D !D !D !$D !,D!@D!XD!|D !˜D!¨D!¸D!ÄD!ÜD!èD!ðD"D "D""<D"XD$"`D"dD$"hD"pD&"tD)"|D*"”D+" D-"¨D+"°D."ÀD0"ØD4#D-# D7#,D;#<D<#DD?#`D@#hDC#¸DD#ÀD #èD#ðDG$p$îð@í›@í­@í½@ïÆ€ï8΀ï<Ù€ï@ã€ïDð€ïHú@ï€ðt€ðt€ðt.€ñ\7€òTA€óLR@ô_€€Àðà$‚$$N$.$ Dg$ Dj$ Dg$$Dj$(Dk$,DD$0Dk$4DD$DDk$HDD$LDE$PDF$\DG$€DD$„DK$ŒDl$´Dm$¸Dl$¼Dm$ÀDp$ă$g$  @e­@e¸@eÄ@eÎ@fà@fî@h÷À$ ø@k @k À$0 @A À$0à$4à$4@k !@k+À$D,@A 5À$D6à$H7à$H8@k A@kKÀ$LL@A UÀ$LVà$´Wà$´Xà$ÈY$¨N$È.$ÐD$ÐD$ØD$ÜD$üD%DY%DZ%0D[%<D\%`DY%dD!%pD %”D#%˜D %¤D %¨D %´D %¸D%¼D%ØD#%ìD'%ôD+&D/& D,&$D-&(D0&,D1&8DY&<D2&@DY&DD2&HDY&LDZ&PD[&\D\&€DY&„D6&D7&œD9'PD:'XDæ'\D:'dDå'hDæ'tDé' Dë'¬Dì'ÌD<'àD:'èD;'ìD='ðD<'ôD@'üDA( DB(DC(DA(DC( DD(0DF(4DD(8DE(@DF(LDG(pDD(tDK(|DF(´DJ(¸Z$$Ðq@|@‰@”@ @«@¶@È@ Ö ¸í ¼ù À  Ä @ € /@ =@ O@ f@ r@ }@ ŠÀ$Ð ‹@V ”À% •à%p –@# £@# ±@# ÃÀ%” Ä@ Ñ@ ßÀ%” àà%˜ áà%˜ â@# ï@# ý@#!À%¤!@!@!+À%¤!,à%ì!-à%ì!.@2!9À&<!:@V !CÀ&<!Dà&@!Eà&@!F@2!QÀ&D!R@V ![À&D!\à&H!]à&H!^@2!iÀ&L!j@V !sÀ&L!tà&!uà&!v€78!„À&¤!…à&ð!†€78!”À' !•à'P!–@:!¢@:!¯À'\!°@ä !½À'\!¾à'd!¿à'd!À@:!Ì@:!ÙÀ'h!Ú@ä !çÀ'h!èà'à!éà'à!ê@F!ó@F !ýÀ(0!þ@A"@A "À(0"à(4"à(4"@F"@F "&À(8"'@A"0@A "9À(8":à(´";à(´"<à(Ì"=$üN(Ì"> ¯€.(ÐDð(ÐD÷(ØDð(ÜD÷(äDð(èD÷)Dú),Dý)PDþ)TDý)XDþ)dDý)hDþ)pDÿ)|D)„D)˜D)¤Dž)¬DŸ)ÀD )ÈD¢)ÐD£)äD¢)øD¥*D *D *D *D *$D *(D *,D*0D*<Dž*@D*LDž*\DŸ*dD *lD¢*tD£*„D¢*˜D* D*°D*ÔD *ÜD*ðD*øD+D+D+ DÓ+0DÚ+8DÓ+<DÚ+LDÛ+PDÜ+XDà+\Dç+lDà+pDÏ+|D+D + D!+¬DÏ+°D!+¸DÏ+ÈDÓ+ÐDÚ+ØDÓ+ÜDÚ+ìDÛ+ðDÜ+øDà+üDç, Dà,DÏ,D!,0D,4D",DD$,LD%,`D&,pD',xD*,œD+,¼DÏ,ÐD.,ð"L$ð(Ð"g@î"q@î "z@î"†@î"‘@ï"£@ï"±@ï"Â@ñ"Ë@ñ"×@ñ"â€ò@"î@ó"û@ó#€ô8# ( õ¯€#0À(Ð#1@#:@#FÀ)¬#Gà*#H@#RÀ*@#S@#\@#hÀ*@#ià*L#jà*L#k@#uÀ*\#v@#@#‹À*\#Œà* #à* #Ž@Î#—@Î# À+0#¡à+#¢@!#¬À+°#­@Î#¶@Î#¿@Î#ÌÀ+°#Íà+¸#Îà+¸#Ï@!#ÙÀ+È#Ú@Î#ã@Î#ì@Î#ùÀ+È#úà,0#ûà,0#ü@Î$@Î$À,Ð$à,ð$à- $$<N- .-Dg-D‘-Dg-D‘-$Dg-(D‘-DD’-PD‘-\Dt-dDq-hDt-€Du-°Dx-àDt-äD-ôD-øD-üD‚.Dƒ.D‡.@D‰.ðDŠ.ôD‰.øD‹.üDŠ/D‹/D/D/4D“/pD”/|D“/€D•/D˜/˜D™/¬D›/°DŸ/´D›/¼Dœ/ÀD /ÄDŸ/ÌD /ÐD/ÔD¤/ÜD¥/ðD¦0D¤0D§0D¤0 D­0$Dª0(D­00D®0PD¯0TD­0XD°0\D­0`Dµ0dD¶0€D·0Dµ0¬D½0¸DÁ0ÐDÂ0ÔDÁ0ØDÃ0ÜDÄ1Dg1DÄ1DÇ1 DÊ1$DÌ1(DÊ1,DÇ10DÊ14DÌ1@DË1HDÎ1LDÃ1PDÎ1XDÏ1\DÃ1`DÓ1dD”1€D–1„D•1ˆD—1ŒD•1D”1”D˜1˜D—1œD”1 D˜1¤D—1¨DÚ1°$$g-$4@e$>@e$G@f$S@f$d€$t@h$„@h $‘@h$@i$¯À-$°@ $»À-$¼à-$½@ $ÈÀ-$$Éà-($Ê@ $ÕÀ-D$Öà-d$×€ƒ8$åÀ.$æà.@$瀇8$õÀ.H$öà.$÷€‡8%À.¤%à.ð%@ %À1€%à1°%à1Ô%$ÄN1Ô.1àDà1àD‘1èDà1ìD‘2Dà2D‘2 D’2 D‘2,Dë24Dí2LDï2\Dð2`Dñ2€Dô2°Dö2ÀDù2ÄD÷2ÌDð2ØDþ2ðDÿ2øD3pDà3tD3xD3€D3„D3ˆD3ŒD3”D3¤D 3°D3´D 3ÀD3ØD.4 D4,D4D4”D4˜D4 D4¤D4°D4´D4àD4øD4üD5D5D5 D5D50D5PD5XD5D5˜D!5¤D#5ÀD"5ÌD$5ÔD%5ÜD(5ðD)5ôD+6LD”6`D–6dD•6hD—6lD•6pD”6tD˜6xD—6|D”6€D˜6„D—6ˆD16%$à1à%0@Þ%:@Þ%C@ß%O@ß%`@á%i@á %w@á%ƒ@á%‘@ã%£À1à%¤@ %¯À1è%°à1ì%±@ %¼À2%½à2%¾@ %ÉÀ2 %Êà24%Ë€ÿ8%ÙÀ3 %Úà3p%Û€ÿ8%éÀ3t%êà3x%ë€8%ùÀ3à%úà4 %û€8& À4@& à4& €)8&À6&à6L&@ &&À6`&'à6&(à6¨&)$ÈN6¨.6°D¢6°D¥6ÈD¢6ÌD¢6ìD¥6ðD¦6ôD¬74D¾7DD®7ˆD¯7ŒD³7˜DD7¤D´7¨DD7¬DE7´DF7ÀDG7ÜDD7àDK7èDµ8D¹8 Dº8,D¹80D»8TD¼8\D»8`D¼8hD½8lDk8tDD8xDk8|DD8ŒDk8DD8”DE8 DF8¬DG8ÐDD8ÔDK8ÜDl9D½9 D¾9D¿9<DÀ9@DÃ9TDÄ9\D¸9dDÆ9 DÇ9°D9´DË:D‘: D’:0D”:XD–:\D•:`D—:dD•:hD”:lD˜:pD—:tD”:xD˜:|D—:€D‘:„DÏ:ŒDÐ:DÏ:”DÐ:˜DÔ: &*$¢6°&@@&L@&Y@&d@ž&n@ž&w@Ÿ&‰@Ÿ &—@ &¢  ¨&® ¡¬&À ¡°&Ò@£&Ý@£&é@¤&õ€'@¤'@¤'@¤'(@ '4@¡'F@¡ 'XÀ6°'Y€¦8'gÀ7'hà74'i€¾8'wÀ7D'xà7ˆ'y@A '‚@A '‹À7¤'Œà7¨'@A '–@A 'ŸÀ7¬' à8'¡@h'ªÀ8t'«@k'´@k '¾À8x'¿@A 'ÈÀ8x'Éà8|'Êà8|'Ë@k'Ô@k 'ÞÀ8Œ'ß@A 'èÀ8Œ'éà8'êà8'ë@k'ô@k 'þÀ8”'ÿ@A (À8”( à9( à9( à9 ( @~(À9´(à:(@ (%À: (&à:Œ('à:¼(($ N:¼.:ÀDT:ÀDW:ØDT:ÜDT;DW;DX;D^;dD`;pDa;tDf;€Dg; Do;àDp;èDo;ìDq< Ds<Dq<Ds<Dr< Dq<$Dr<,Ds<0DtD‰>hD‘>pD’>€D”>¨D–>¬D•>°D—>´D•>¸D”>¼D˜>ÀD—>ÄD”>ÈD˜>ÌD—>ÐD‘>ÔD>ÜDŽ>àD>äDŽ>èDs>ôD?8D’?@()$T:À(D@M(P@M(]@M(h@N(s@N(~@O(@O(ž@P(µ QØ(Á QÜ(Ì Qà(Ù Rä(ä Rè(ð Sì) Sð)@U)@U)+@V)4@V)@@V )P@V)Z@Q)f@Q)q@Q)~@R)ŠÀ:À)‹€XH)™À;0)šà;d)›@€)§@€)´À= )µ@ä )ÂÀ= )Ãà=$)Äà=$)Å@€)Ñ@€)ÞÀ=()ß@ä )ìÀ=()íà=,)îà=,)ï@€)û@€*À=0* @ä *À=0*à=¬*à=¬*@~*%À>*&à>h*'@ *2À>p*3à>Ü*4€sH*BÀ>ô*Cà?8*Dà?\*E$œN?\*F *Wd?\*Xd?`*d?`*”f*•<*¤€*²hÀ*ë ³Ô+ ³¬+; ³ +c ³+Ši@+Äi+ûDP,6Ä€,q ³€,§e,Üfà- Ð-< ´|-Zc-zc -™ ´l-·g`-èg°.Bp.Gb<.taì.¡aˆ.ÎѰ.ú @/.a°/:/lbä/ µP/Ôb¤0 ÃÀ0<b|0pD°0 @p0Ôh01e19 µ$1_d1‡d„1® µ1Ôe€2 eÐ2C>ð2}d(2²d2çg39 3RdX3‹6ð3Æj4fP48`@4i 4›!`4Î µÌ4íu05u$5.$À5a µ¼5€b05²c5á4ð6fd6BeØ6pex6žÕ06Ë3€7e 7Ý 7?tà7qî°7¡t¨7Ó/8úð86t\8g'p8 s˜8Û)09s`9I! 9ƒs89¿09ún:7¦@:tÄð:µÖÀ:ðh°;-°;jh€;© P;Ùh< \€<=g˜{ü># ¶d>=YÐ>j[À>” >Áw€>êv?;p?@U`?hsP?’{Ü?¾ÿ?íü@ùP@O€@€{˜@³8@@â{XAlpAD{$AwìÐA§zôAÙëPBzÈB1w°B]z¨B‹l BÂzdBûæC-z$CapÐC›zC×i`DyØD;–ÐDjy¬D›t0DÊyhDûÀE-y8Ea ÐE‹xðE·¯°EçxÀFÄðFIµ€F{_°F¤äFÓáGR°G= ¶¸Gh ¶G• ¶„GÁ ¶tGìTH*THeB°H¤ݰHã}ˆIìÐIVÚðI•}¨IÖK@J €ÌJ,€¤JP€˜Js ·PJ•NJÊOpJü˜K-~¨K^øÐK”JPKÄØÐKû€`L4Õ`Lg€ LœȰLÔèMÁ`MIÀ€M~¾M·G@MñR N"¶NXI€N ·¤N° ·|NÕ ·pNù ·`O‚$ON²O° O²­`Oí¥P-¢ðPjCPžG P× ¸Pþ ¸hQ' ¸\QO ¸LQvH°Q°IQç?`R"Ÿ R] ¸<R“œPRÈFÀRù ¹lS ¹DS9 ¹8SY ¹(Sx„S¦“ðSÓ€T „üTA’Tz„ÈTµ‰àTõ„”U7† Un~€Uª{ðUãx€V?ÀVL ºV€…0VŠ…4V” ºVÀ º Vø ºW$ ºWT…8W` ºW‡ ºW¶…<WÂ…@WÎ…HWÚ º X  º$X8 º(Xl…LX~ º¼X–©€X¡ ºÀX¸©pXÄ ºÄXÞ©\Xê ºÈXý©PY ºÌY%©<Y1 ºÐYE©0YQ ºÔYj© Yu ºØYˆ©Y“ ºÜY§©Y² ºàYȨøYÔ ºäYë¨èY÷ ºèZ¨ÔZ ºìZ=¨¼ZI ºðZ]¨°Zi ºôZ‚¨ ZŽ ºøZ¥¨Z± ºüZƨ„ZÑ »Zè¨tZó »[¨l[ »[,¨X[8 » [L¨L[W »[j¨@[v »[Œ¨0[˜ »[ª¨$[¶ »[Ȩ[Ô » [è¨ [ó »$\ §ü\ »(\.§ì\9 »,\I§ä\U »0\k§Ô\w »4\–§¼\¢ »8\¼§¨\Ç »<\×§ \â »@\ô§”] »D]§Œ] »H]/§€]; »L]Z§h]f »P]}§X]‰ »T]œ§L]§ »X]À§<]Ë »\]ã§,]í »`]ú§(^ »d^§^% »h^A§^L »l^[§^e »p^r¦ü^} »t^™¦è^¤ »x^¾¦Ô^É »|^Ú¦Ì^å »€^ó¦Ä^ÿ »„_¦¼_ »ˆ_&¦¸_1 »Œ_Q¦ _\ »_p¦”_{ »”_ަˆ_™ »˜_¦¦„_² »œ_Á¦|_Ì » _á¦p_ì »¤_ü¦h` »¨`¦\`$ »¬`>¦H`I »°`c¦4`n »´`z¦0`… »¸`‘¦,`œ »¼`®¦ `¹ »À`Ǧ`Ó »Ä`ä¦`ð »Èa¦a »Ìa¥üa( »ÐaB¥èaN »Ôa^¥àai »Øa{¥Ôa‡ »Üa–¥Ìa¡ »àa´¥Àa¿ »äaÍ¥¸aÙ »èa祰aò »ìb¥¨b »ðb¥ b( »ôb8¥˜bD »øbU¥b` »übv¥€b ¼b‘¥xbœ ¼b¯¥lbº ¼bÊ¥dbÖ ¼ bè¥Xbó ¼c¥Lc ¼c&¥<c1 ¼cE¥0cP ¼cc¥$cn ¼ c€¥c‹ ¼$c–¥c¢ ¼(c°¥ c» ¼,cÐ¥cÜ ¼0cì¤øcø ¼4d¤èd ¼8d.¤Üd9 ¼<dN¤ÐdY ¼@dl¤Ädw ¼Dd‡¤¼d“ ¼HdŸ¤¸dª ¼Ldº¤°dÆ ¼Pdؤ¤dä ¼Tdò¤œdý ¼Xe¤e ¼\e3¤„e> ¼`eJ¤€eV ¼dek¤tev ¼heŒ¤de— ¼le¬¤Xe· ¼peͤHeÙ ¼teç¤@eò ¼xf¤4f ¼|f$¤(f0 ¼€f@¤ fL ¼„f`¤fl ¼ˆf‰¤f• ¼Œf££øf¯ ¼fº ¼”fÆ£ôfÒ ¼˜fä£èfï ¼œfû ¼ g£Üg ¼¤g1£Ìg= ¼¨gQ£Àg] ¼¬gs£°g ¼°g–£ g¢ ¼´g¹£gÄ ¼¸gÔ£ˆgà ¼¼gø£xh ¼Àh£lh" ¼Äh:£\hD ¼ÈhU£Tha ¼Ìhx£Dh„ ¼Ðh™£8h¥ ¼Ôh²£4h¾ ¼ØhÑ£(hÜ ¼Ühí£ hù ¼ài£i ¼äi/£i: ¼èiI£iU ¼ìif¢øir ¼ði„¢ìi ¼ôi¢¢ài® ¼øi¼¢ØiÇ ¼üiÙ¢Ìiå ½iù¢Àj ½j¢´j# ½j2¢¬j= ½ jX¢˜jd ½js¢j~ ½j’¢„jž ½j¬¢|j· ½jÇ¢tjÓ ½ jâ¢ljî ½$jû¢hk ½(k¢\k% ½,k;¢LkF ½0kU¢Dk` ½4kk¢@kw ½8k…¢8k‘ ½<k ½@k°¢,k¼ ½DkË¢$k× ½Hkï¢kû ½Ll ¢ l ½Pl"¡ôl, ½Tl7¡ÐlA ½XlL¡ÀlV ½\la¡¤lk ½`lw¡€l‚ ½dlŽ¡pl™ ½hl¥¡4l° ½ll¼¡lÇ ½plÓ ôlÞ ½tlê Ôlõ ½xm °m  ½|m ˆm# ½€m/  m: ½„mFŸèmQ ½ˆm]ŸÀmh ½ŒmtŸ°m ½m‹Ÿ”m– ½”m¢Ÿ„m­ ½˜m¹ŸhmÄ ½œmП4mÛ ½ mèŸ,mô ½¤nŸ n  ½¨nžðn& ½¬n3žÐn? ½°nLžœnX ½´nežhnq ½¸n~žXnŠ ½¼n—ž4n£ ½Àn°ž(n¼ ½ÄnÉž$nÕ ½Ènâž nî ½Ìnûäo ½ÐoØo  ½Ôo-°o9 ½ØoFœ¨oR ½Üo_œlok ½àoxœ4o„ ½äo‘œo ½èoª›èo¶ ½ìoÛhoÏ ½ðoÜ›Poè ½ôoõ›8p ½øp›p ½üp'šðp3 ¾p@š¸pL ¾pYš°pe ¾prš”p~ ¾ p‹šˆp— ¾p¤š„p° ¾p½š|pÉ ¾pÖš(pâ ¾pï™üpû ¾ q™ìq ¾$q!™Øq- ¾(q:™ÄqF ¾,qS˜€q_ ¾0ql˜`qx ¾4q…˜Xq‘ ¾8qž˜Lqª ¾<q·—qà ¾@qЖøqÜ ¾Dqé•dqõ ¾Hr•Lr ¾Lr•4r' ¾Pr4• r@ ¾TrM•rY ¾Xrf”ðrr ¾\r”èr‹ ¾`r˜”dr¤ ¾dr±”Lr½ ¾hrÊ”0rÖ ¾lrã”,rï©rþ`s,b€sWªs„…às¶©Ðsêª,söª@tªTtª\tªxt&ª€t2ª”t>ª¨tJª¼tVªØ.?`D[?`D^?tDd?€Df?¤tg$[?`t¨@[t¼€tÈ€t×€tí€u)€uS€ub€z €z€z*€zC€zT€zm€z~€z™€zª€zÅ€zÖ€zí€zþ€{€{'€{8€{I€{Z€{r€{ƒ€{ž€{¯€{Ë€{Ü€{ø€| €|:€|K€|g€|x€|€| €|»€|Ö€|ò€}€}€}%€}A€}]€}u€}†€}Ÿ€}°€}Ç€}Ø€}ð€~ €~€~,€~<€~L€~\€~l€~‹€~¬€~Ì€~Ý€~í€~ý€ €*€:€J€Z€À€3€€¤€€´€€Ä€€Ô€„߀…퀆J€†Ò€†í€†ÿ€‡€‡'€‡=€‡M€‡g€‡€€‡’€‡ª€‡¼€‡Ö€‡è€ˆ€ˆ€ˆ4€ˆF€ˆf€ˆ€ˆŸ€ˆ²€ˆÕ€ˆù€‰ €‰-€‰@€‰c€‰t€‰…€‰–€‰§€‰¸€‰É€‰Ú€‰ë€‰ü€Š $\N?¼Š º,.?ÀD?ÀD¡?ÐD?ØD¡?äD¥@D¢@D¦@ D¢@D¦@D§@D­@ D®@$D¯@,Dµ@0D»@4D¸@8Dµ@<D»@@DÁ@PDÃ@Š#$?ÀŠY@Šm@Š@Š‘@žŠ &  º,Џ€ŠÖ€‹ À?À‹ à@¨‹ $èN@¨‹ @°.@°D˜@°D@´D˜@¸D@ÀDš@ÄD¥@ÌD§@è‹I$˜@°‹‹@˜ ‹¡€‹´€Œ÷€ €€0€C€V€Žp€Ž’€Ž¯€$€â€õ€€€.€A€T€g€‘€‘›€‘®€‘Á€‘Ò€‘】ô€’€’€’)€’:€’M€’m€’Œ€“a€“€“£€”€”!€”4€”S€”i€”˜€–>€–Q€–€€–¹€–Ì€–߀–ò€—€—€—8€—X€—x€—€—»€—Ì€—Ý€—ð€˜€˜€˜2€˜‡$LN@ü˜ˆA.ADóADóA$DûA(D÷A4DûA8D÷A<DûADDüAHD ApD AxD A|D A€D AŒD A˜D A¤D A°D A´D Aà˜Ë$óA™@ó™*@ó™?@ó™R@ó™k@ó™‡@ó™¡€™¬$øNAø™­B.BD zBD ƒB D zBD ‚BD B D ƒB$D B(D ƒB0D ‰B4D B@D “B`D ˜BdD  BpD ¢B˜™ò$ zBš?@ zšU@ |ši@ }šzÀBš{àB°š|$°NB°.B°D ¹B°D ¼BÄD ÂBÐD ÄBôš}$ ¹B°šÂ@ ¹šÖ$\NC š× º0.CD 7CD ;C D 7C(D ;C4D ?CTD <CXD @C\D <C`D @ChD AClD GCpD ICtD GCxD IC|D JCŒD LCКì$ 7C›&@ 7›:@ 7›L@ 7›^@ 8›m& :º0›…€›£ÀC›¤àC蛥$ØNCè.CðDôCðDöDD÷D DüDDþD,›¦$ôCð›à@ô›ô@õœ€ œÀCðœ àDDœ!$TNDD.DPD ¹DPD ¼DdD ÂDpD ÄD”œ"$ ¹DPœc@ ¹œw$\ND¬.D°D!ÆD°D!ÈDÀD!ÉDÌD!ÎDÐD!ÐDìœx$!ÆD°œ°@!ÆœÄ@!ÇœÕÀD°œÖàEœ×$TNEœØE.ED#mED#uE D#vE,D#rE0D#vE4D#rE8D#vE@D#wEDD#xE`D#zElD#|ExD#E„D#†E D#vE¤D#ŽE¨D#E¬D#‘EÐ $#mED@#mZ@#mn@#m‚@#n“€¦€ž€ž¢€žµ€Ÿ € Ž€ ¡€ ´€ Ç€ Ú€ ë€¡b€¢ÿ€¥8€¥K€¥^€¥q€¥„€¥•€¥¦€¦€¦’€¦¥€¦¸€¦Ë€¦Þ€¦ï€§€§€§$@#o§3@#p §BÀE§CàEè§D$ØNEè§EEð.EðD2QEðD2VEøD2QEüD2SF D2VF D2WF0D2VF4D2WF<D2VF@D2[FPD2]FXD2^FpD2]FtD2^FxD2]F|D2^FˆD2]FD2^F §w$2QEð§¯@2Q§Å@2Q§Ú@2Q§ô@2R¨€¨€¨2€¨ÀEð¨žàF´¨Ÿ$ÄNF´.FÀD@‹FÀD@ŽFÔDŠFäD@FèD‹FìD‡FðD‹FøDŒFüD’GD“GD”G D™GD@‘G@D@’GTD@“GXD@’GdD@“GlD@•GpD@–Gˆ¨ $@‹FÀ¨×@@‹¨à€@8¨ì€@<¨÷€@@©ÀFÔ©àGp©$ÜNGœ.G DA)G DA-G´DA.GÄDäGÈDãGÌDäGÔDæGØDA0HDA1H$DA2H(DA1H4DA2H<DA4H@DA5HxDA6H©$A)G ©C@A)©L€ª|€ª€ª²€« €«€«.€A,8«:€A,<«E€A,@«OÀG´«PàH@«Q$NH¤.H°DA8H°DA;HÄDA<HØDA?Hì«R$A8H°«’@A8«›@A8 «¦@A8«°@A9«¹€«Ì€«ç€«øÀH°«ùàHü«ú$LNHü.IDAAIDAEIDADI DAEI$DAFI(DAEI,DAFI8DAHIh«û$AAI¬8@AA¬A$€NI€.I€DAÎI€DAÑI”D RI¤DAÒI¨D SI¬D QI°D SI¸D TI¼D YIÄDAÔIðDAÕJDAÖJDAÕJDAÖJDAØJ DAÙJ8¬B$AÎI€¬}@Aά†€AÐ8¬’€AÐ<¬€AÐ@¬§ÀI”¬¨àJ ¬©$ÌNJL.JPDB\JPDB^JXDB\J\DB^JlDB_J|DBaJ„¬ª º¨DBbJˆDBaJDBbJ”DBaJ˜DBbJœDBcJ¨DBdJÀDBeJÐDBfJàDBgJðDBhKDBiKDBkK ¬Û$B\JP­@B\­@B\­%@B\­.€­A€­]@B^ ­fÀJP­gàK4­h$äNK4.K@DBmK@DBqKTD&QKdDBrKhD&RKlD&PKpD&RKxD&SK|D&XK„DBtK°DBuKÄDBvKÈDBuKÔDBvKÜDBxKàDByL DBzL`DB{L DB|LàDB}M DB~M`DBM DB€MØDBMð­i$BmK@­£@Bm­¬€Bp8­¸€Bp<­Ã€Bp@­ÍÀKT­ÎàKà­Ï$ÄNN.NDBƒNDB†N,DB‡N8DB‰NPDBŠN\DBŒNtDBN€DBN˜DBN¤DB’N¼DB“NÈDB•NàDB–NìDB˜ODB™ODB›O(DBœO4DBŸOP­Ð$BƒN® @Bƒ®@Bƒ®@Bƒ®)@B„®2ÀN®3àOd®4$TNOd.OpDB¡OpDB¥OŒDB¤O”DB¥O˜DB¦OœDB¥O DB¦O¬DB§OäDB¨OèDB©OìDB¨OðDB©OüDBªP4DB«P8DB¬P<DB«P@DB¬PLDB­P„DB®PˆDB¯PŒDB®PDB¯PœDB°PÔDB±PØDB²PÜDB±PàDB²PìDB³Q$DB´Q(DBµQ,DB´Q0DBµQ<DB¶QtDB·QxDB¸Q|DB·Q€DB¸QŒDB¹QÄDBºQÈDB»QÌDBºQÐDB»QÜDB½R®5$B¡Op®m@B¡®v@B£®ÀOp®€àR ®$°NR .R DB¾R DBÀR,DB¾R4DBÀR<DBÁRHDBÂRhDBÁRlDBÂRpDBÄR˜®‚$B¾R ®¹@B¾®Â@B¾®Í@B¿®Ö@BÀ®ßÀR ®ààR°®á$NR°.R°DCnR°DCrRÄDCsRÔD RØD RÜD RäD RèD RìD RôD RøDCuS0DCvSDDCwSHDCvSTDCwS\DCyS`DCzS DC{SØDC|Sð®â$CnR°¯%@Cn¯.€Cq8¯:€Cq<¯E€Cq@¯OÀRįPàS`¯Q$TNT.TDC~TDCT,DC‚T8DC„TPDC…T\DCˆTx¯R$C~T¯–@C~¯Ÿ@C~¯ª@C~¯´@C¯½ÀT¯¾àTŒ¯¿$|NTŒ.TDCŠTDCŽT¬DCT´DCŽT¸DCT¼DCŽTÀDCTÌDCUDC‘UDC’U DC‘UDC’UDC”UH¯À$CŠT°@Cа $ÐNU`.U`DDU`DDUhDDUlDDU|DDUŒDDU”°  º°DDU˜DDU DDU¤DDU¨DDU¬DDU¸DDUÐDDUàDDUðDDVDDVDD V DD!V0DD"V@DD#VPDD$V`DD&Vp°4$DU`°b@D°m@D°v@D°@D °ˆÀU`°‰àV„°Š$$NV„.VDD(VDD*V¤DD+VðDD,W0DD-WpDD.W°DD/WðDD0X0DD1XpDD2X°DD3XðDD4Y0DD5YpDD6Y¨DD7Y¬DD6Y°DD7Y´DD6Y¸DD7YÄDD6Y̰‹$D(V°½@D(°Æ$@NYÐ.YÐDD9YÐDD<YìDD=YøDD?ZDD@ZDDBZ4DDCZ@DDEZXDDFZdDDHZ|DDIZˆDDKZ DDLZ¬DDNZÄDDOZÐDDQZèDDRZôDDT[ DDU[DDW[0DDX[<DDZ[TDD[[`DD][xDD^[„DDa[ °Ç$D9Yаú@D9±@D9±@D9±@D:±!ÀYб"à[´±#$äN[´.[ÀDDc[ÀDDg[ÜDDf[äDDg[èDDh[ìDDg[ðDDh[üDDi\4DDj\8DDk\<DDj\@DDk\LDDl\„DDm\ˆDDn\ŒDDm\DDn\œDDo\ÔDDp\ØDDq\ÜDDp\àDDq\ìDDr]$DDs](DDt],DDs]0DDt]<DDu]tDDv]xDDw]|DDv]€DDw]ŒDDx]ÄDDy]ÈDDz]ÌDDy]ÐDDz]ÜDD{^DD|^DD}^DD|^ DD}^,DD~^dDD^hDD€^lDD^pDD€^|DD^´DD‚^¸DDƒ^¼DD‚^ÀDDƒ^ÌDD„_DD…_DD†_ DD…_DD†_DD‡_TDDˆ_XDD‰_\DDˆ_`DD‰_lDD‹_˜±$$Dc[À±T@Dc±]@De±fÀ[À±gà_°±h$ðN_°._°DDŒ_°DDŽ_¼DDŒ_ÄDDŽ_ÌDD_ØDD_øDD_üDD`DD’`(±i$DŒ_°±˜@DŒ±¡@DŒ±¬@D±µ@Dޱ¾À_°±¿à`@±À$N`@.`@DES`@DEW`TD]`dDEX`hD^`lDZ`pD^`xDa`|Dd`€Dj`ˆDk`ŒDn`”Dq`˜Dv` DEZ`ÐDE[`äDE\`èDE[`ôDE\`üDE^aDE_a@DE`a€DEaaÀDEbaøDEcb±Á$ES`@±ø@ES²€EV8² €EV<²€EV@²"À`T²#àa²$$äNb$.b0DEeb0DEhbLDEibXDEkbpDElb|DEnb”DEob DEqb¸DErbÄDEubà²%$Eeb0²]@Ee²f@Ee²q@Ee²{@Ef²„Àb0²…àbô²†$ÄNbô.cDEwcDE{cDEzc$DE{c(DE|c,DE{c0DE|c<DE}ctDE~cxDEc|DE~c€DEcŒDE€cÄDEcÈDE‚cÌDEcÐDE‚cÜDEƒdDE„dDE…dDE„d DE…d,DE‡dX²‡$Ewc²¼@Ew²Å$pNdp.dpDEˆdpDEŠd|DEˆd„DEŠdŒDE‹d˜DEŒd¸DE‹d¼DEŒdÀDEŽdè²Æ$Eˆdp²ú@Eˆ³@Eˆ³@E‰³@Eг Àdp³!àe³"$Ne.eDFDeDFFeDFGeTDFHeXDFGe\DFHe`DFGedDFHepDFGex³#$FDe³a@FD³j€³ê$|Ne|.e€DFJe€DFMe”DFNe¨DFQe¼³ë$FJe€´*@FJ´3@FJ ´>@FJ´H@FK´QÀe€´RàeÌ´S$LNeÌ.eÐDFSeÐDFWeèDFVeðDFWeôDFXeøDFWeüDFXfDFZf8´T$FSeд@FS´™$€NfP.fPDF[fPDF]f\DF[fdDF]flDF^fxDF_f˜DF^fœDF_f DFafÈ´š$F[fP´Õ@F[´Þ@F[´é@F\´ò@F]´ûÀfP´üàfà´ý$Nfà.fàDFófàDFõfôDFög4DF÷g8DFög<DF÷g@DFögDDF÷gPDFögX´þ$Fófàµ4@Fóµ=$|Ng\.g`DFùg`DFügtDFýgˆDGgœµ>$Fùg`µu@Fùµ~@Fù µ‰@Fùµ“@FúµœÀg`µàg¬µž$LNg¬.g°DGg°DGgÈDGgÐDGgÔDGgØDGgÜDGgèDG hµŸ$Gg°µÓ@GµÜ$€Nh0.h0DG h0DG h<DG hDDG hLDG hXDGhxDG h|DGh€DGh¨µÝ$G h0¶@G ¶@G ¶$@G ¶-@G ¶6Àh0¶7àhÀ¶8$NhÀ.hÀDG¬hÀDG®hÔDG¯iDG°iDG¯iDG°i DG¯i$DG°i0DG¯i8¶9$G¬hÀ¶x@G¬¶€·:$|Ni<.i@DG²i@DGµiTDG¶ihDG¹i|·;$G²i@·{@G²·„@G² ·@G²·™@G³·¢Ài@·£àiŒ·¤$LNiŒ.iDG»iDG¿i¨DG¾i°DG¿i´DGÀi¸DG¿i¼DGÀiÈDGÂiø·¥$G»i·â@G»·ë$€Nj·ìj.jDI¢jDI£jDI¢jDI£j$DI¢j(DI£j@DI¤jPDI¥jdDI§jxDI¨jˆDI«jÀDI¬jØDIÛjðDI®kDI±kDI³kDI¶k0DI¼kDDI½kPDIÂk€DIÅk°DIÆkÀDIÇkÄDIßkØDIØkÜDIßkèDIØlDIÊlDIÛl0DIÜl`DIÝlDIßl¬DIÝl°DIßl´DIÝl¼DIßlÀDIÝlÈDIßlÐDIÝlÜDIßlà·ù$I¢j¸ @I¢¸@I¢¸%@I¢¸/$ôNm¸0m.mDIémDIîmDIémDIîm$DIém(DIîmPDIïmTDIðm\DIñmdDIómlDIômpDIõm€DI÷mˆDIøm˜DI÷mœDIøm DIûm°DIþmÀDJmàDJmìDJ nDJ nDJ n@DJnDDJnLDJnPDJn\DJndDJnhDJnlDJnpDJn€DJnˆDJnDJn¨DJnÀDJnÐDJ"näDJ#nèDJ"nðDJ#nôDJ)oDJ*oDJ,o0DJ+oPDJ1o`DJ0odDJ1ohDJ4otDJ7oDJ8oÐDJ9pDJ:pDJ<pPDJ=pTDJ p¨DJ p´DJ+pÜDJqDJ@q¸C$Iém¸\@Iâ¸j@Iã¸x@I上@I帙@I渨@I縷@Iè¸Ç@Iê¸Ð@Iê¸Ý@Iê¸ê@Ië¸ó€¹€¹@Iì¹ €¹-Àm¹.àq4¹/$$Nq4¹0q@.q@DJsq@DJtq\DJuq`DJtqhDJuqlDJvqtDJwq„DJyqDJzq DJ{q°DJ|qÀDJ}rDJ~r@DJr€DJr„DJrˆDJ€rŒDJr”DJ„r DJ…ràDJ†s DJˆsp¹D$Jsq@¹^@Js¹l@Js¹{@Js¹‡@Jt¹—€¹ª€¹É€»Ü€»ï€¼€¼€¼(€¼F€¼j€¾×€¾è€¿Þ€¿ñ€À€À0€ÀC€Àa€À}€Â€ÂMÀq@ÂNàs„ÂO$DNs„ÂPs.sDJ¥sDJ­s¬DJ¥s°DJ¬s¼Â^ º”DJ­sÐDJ¯sØDJ²sðDJ³søDJ·t Âg ºDJ¸t,DJºtPDJ»tTDJ½tpDJÀt”DJÁtÐDJÂuDJÄu0Âp$J¥s„@J¥Â@J¥¡@J¦³@J§ÂÅ@J¨ÂÓ@J©Âæ@JªÂø@J«ÃÀsÃàuTÃ$ÄNuTÃu`.u`DJéu`DJòu„à ºœDJóuDJôu˜DJõu DJöu¬DJ÷u¸DJøuÀDJùuÈDJúvDJûv DJüv@Ã+ º˜DK v„DK vDKv¤DKv°DKv¸DKvÀDKvàDKwDKw@DKwpDKw°DKwÐDKwÔDKwØDKwàDKwäDKwìDKwôDKxDKxDKx8DKxPÃ9$Jéu`ÃS@JéÃc@JêÃu@JëÈ@JìÚ@Jíí@JîÃÁ@JïÃÒ@JðÃä€Ã÷€ÄÀu`ÄàxtÄ$NxtĪÜ.x€DQx€D\xDQx˜DRx DQx¤D[x¨Ä. ¾|D\x¬D[x´D\x¸DRxÈD[xÌD\xÐD]xàD^xäD]xèD^xðD_xüDby Ä8 º DcyHDdy|Dhy˜Diy Djy¬DyyÜDkyôDmyøDzz4DnzPDoz|DpzŒDqz¸DvzÜDyzøDz{D{{0D~{@D{pD€{ D‚{ÐÄA$Qx€Ä€@QÄ”@QĦ@Qĸ€R8ÄÏ€S<Äá@UÄð@W Äÿ@XÅ@YÅ&ZªÜÅ5€ÅSÀx€ÅTà{èÅU$hN{èÅV º4.{ðD{ðD&|D|D&|D|D&|D'|4D(|8D'|@D(|HD*|TD+|`D3|€D4|”D8|ÀD5|ÄD8|ÈD9|ÔD;|ØD9|ÜD:|äD;|èDF} D<}@D=}lD>}|D?}°DF}ÔDH}ðDK~DL~0DN~`Åk${ðŪ@ž@ÅÐ@Åâ@ Åõ@!Æ@#Æ@$Æ"& %º4Æ:€ÆXÀ{ðÆYà~xÆZ$ˆN~xÆ[ªè.~€D´~€DÈ~˜D´~ DÈ~¤D´~¨DÈ~°DÉ~ÔDÊ~ØDÍ~ÜDÊ~äDÉ~èDÊ~ðDÍ~ôDÊ~øDÍDè,Dë<DìdDíœDïÌDýøD΀ D€|DÏ€ DЀÐDÓDÚ0DÔ4DÚ8DÛhDá Dâ¤Då¬D‚ Dé‚Dê‚XDè‚Dë‚ÀDì‚ÔDí‚èDî‚üDïƒDðƒ$Dñƒ(Dòƒ,Dóƒ0Dôƒ4Dúƒ8DûƒpDýƒtDþƒˆDÿƒÀDƒðDè„ D„8D„<D„DD„HD„XD„pD„ÀD„ðD…0D…pD…°D…àD…ðD† Dè†PD†pÆp$´~€Æ²@´ÆÆ@´ÆØ@´Æê€µHÆþ€¶LÇ@·Ç!€¸PÇ4€¹TÇG€»XÇ^@¼Ço@½Ç~@¾Ç@¿Çœ@ÀÇ­@ÂǼ@ÃÇË@ÄÇÚ@ÅÇé@ÆÇø&ǪèÈ€È.À~€È/à†˜È0$N†˜È1ªô.† D…† D†¸D…†ÀD†ÄD…†ÈD†ÐDކôD‘†øDއD‘‡D’‡@D©‡xD“‡D”‡ÀD—‡ðD˜ˆ0D™ˆDDšˆxD›ˆ|D ˆ€DœˆˆDˆ”D ˆ˜D«ˆÈD¡ˆàD©‰Dª‰0D«‰dD¬‰€D¯‰D±‰ÀÈF$…† Èƒ@…È—@…È©@…È»€†8ÈÏ€‡<Èá@ˆÈð@‰Èÿ@ŠÉ@‹É&ŒªôÉ5€ÉSÀ† ÉTà‰àÉU$@N‰àÉV«.‰àD‰àD‰èD‰ìD‰ôD‰øDŠDŠDŠDŠ DŠDŠD Š$DŠ(DŠ,DŠ@DŠhDŠ DŠàD‹D‹D!‹D‹ D‹(D!‹4D"‹pDv‹¨D#‹ÀD$‹ðD'Œ D(Œ`D,ŒlD-ŒtD.ŒŒD/ŒÄD1ŒÈD2D34D4DD5pD; DQàDTüDXŽDYŽDZŽ D\Ž$DZŽ(D\Ž8D[Ž@D\ŽHD]Ž|D^ލD_ޏD`ŽäDfDi DlDmPDn„DoÀDpìDqDsDDv`DwxDy°D|ÀD}‘D~‘0D‘`D€‘ D‚‘äÉk$‰àɱ@ÉÅ ŒÉ× Éé€8Ê€ <Ê€ @Ê%@ Ê<@ ÊM@Ê\@Êk@Êz@Ê‹@Êš&«Ê²€ÊÐÀ‰àÊÑà‘üÊÒ$N‘üÊÓ« .’Dã’Dë’Dã’Dë’ Dã’$Dê’(Êè ¾xDë’,Dê’4Dë’8Dê’DDë’HDì’TDí’XDì’\Dí’dDî’pDý’ D’°Dï’ÐDð’ÔDõ“ Dö“`Dú“dD“€D“ D“ÐÊò$ã’Ë1@ãËE@ãËW@ãËi€ä8Ë„@åË“@çˤ@è˵&é« ËÍ€ËëÀ’Ëìà“èËí$èN“èËî«.“ðD@‚“ðD@ƒ”D@‚” D@ƒ”D@„”,Dú”4Dø”8Ì ¾pD@„”<Dù”DÌ  ¾tDø”HDú”LDí”PDú”TDù”XDú”\Dí”lDú”pDø”tDú”xDù”|Dú”€Dû”ŒDü”´Dý”ðDþ•0D•pD•tD•|D•„D•”D•¤D•¨D•¬D•´D•èD •ðD –$DH–lD –D–¨D–ÔD–àD—D—D—D— D—$D—(D—,D—XD—\D!—dD"—pD!—tD"—xD#—|D$—¬D%—ÀD&˜D'˜,D(˜XD1˜D2˜ÀD7˜ìD8˜üD:™D8™D9™ D:™D;™LD<™xD=™ˆD>™´DH™ØDI™ðDKš0DMšDDNšPDOšDPšÀDQšðDR› DS›PDT›D@…›ÐD@†›àD@‰œ$Ì$@‚“ðÌJ@@‚ÌU@@‚Ì^@@‚Ìg@@ƒÌpÀ“ðÌq€@…8Ì‚€@…<Ì“À”4Ì”€ë@Ì«€ìDÌ¿€íHÌÔ@îÌë@ïÌþ@ðÍ €ñLÍ@ôÍ,@õÍ;@öÍJÀ”4ÍKà”<ÍLà”<ÍM€@…8Í^€@…<ÍoÀ”DÍp€ë@͇€ìDÍ›€íHͰ@îÍÇ@ïÍÚ@ðÍé€ñLÍ÷@ôÎ@õÎ@öÎ&À”DÎ'à›ÐÎ(à›ÐÎ)àœDÎ*$TNœDÎ+« .œPDAœPDAœ`DAœdDAœtDAœ„DA!œŒÎ@ º¤DA"œD8œ”DA!œœDA"œ D4œ¤D8œ¨DA!œÄDA"œÈD4œÌDA"œÐD8œÜD9œèD;œìD9œðD:œøD;DI‹DIŒDI@D>\DBhD?lDEpDHxDK€DLDI‘°D;ÜDRüDUž D>ž$DLžHDMž`DUžpDVžDA#žÀDA$žÈDA'ŸÎv$AœPα@Aμ@AÎÅ@AÎÎ@AÎ×ÀœPÎØ€28Îì€3<Îþ€4@Ï@5Ï @6Ï1Àœ”Ï2àœœÏ3€28ÏG€3<ÏY€4@Ïl@5Ï{@6ÏŒÀœ¤ÏàœÄÏŽ€28Ï¢€3<Ï´€4@ÏÇ@5ÏÖ@6ÏçÀœÌÏèàœÐÏé€28Ïý€3<Ѐ4@Ð"@5Ð1@6ÐBÀœÜÐC@;ÐQ@;Ð\ÀÐ]à\Ð^@;Ðl@;ÐwÀ°ÐxàÜÐyàžÀÐzàŸÐ{$ÌNŸ.Ÿ D¤Ÿ D®ŸDD±ŸHD®ŸLD±ŸTDµŸdD¶ŸlD·Ÿ°DÔ D¸  D¹ pDº ÀD»¡DÀ¡4D¼¡8D½¡<D¾¡@D¿¡DDÀ¡HDÌ¡PDÍ¡hDÔ¡ŒDÕ¡°DÖ¡àD×¢DØ¢@DÚ¢€DÝ¢Dߢ¼Ð|$¤Ÿ н@¤ÐÑ@¥Ðâ@¦Ðñ@¨Ñ@©Ñ@ªÑ@«Ñ-@¬Ñ<@­ÑKÀŸ ÑLà¢äÑM$ÄN¢äÑN º8.¢ðD ¢ðD £D £D £D £D £D £4D £8D £<D £@D £HD £LD £\D !£`D £dD !£tD £|D !£„D -£´D "£ÐD #£üD $¤ D %¤8D *¤`D -¤|D /¤”D 2¤°D 4¤àÑc$ ¢ðѦ@ Ѻ@ ÑÌ@ ÑÞ@ Ñí@ Ñü@ Ò & º8Ò#€ÒAÀ¢ðÒBà¤øÒC$N¤øÒD«0.¥D ©¥D ½¥D ©¥ D ½¥$D ©¥(D ½¥0D ¾¥TD ¿¥XD Â¥\D ¿¥dD ¾¥hD ¿¥pD Â¥tD ¿¥xD Â¥€D Ý¥¬D ॼD á¥äD â¦D ã¦LD ä¦dD ò¦D æÀD §D ħ@D ŧpD ȧ D ϧÐD ɧÔD ϧØD ШD Ö¨@D רDD Ú¨LD ¨ÐD Þ¨ØD ß©D Ý©PD à©€D á©”D ⩨D 㩼D ä©ÐD å©äD æ©èD ç©ìD è©ðD é©ôD ï©øD ðª0D òª4D óªHD ôª€D õª°D ݪàD úªøD ýªüD ú«D ý«D «D «0D «€D «°D «ðD ¬0D ¬pD ¬ D ¬°D ¬àD Ý­D ­0ÒY$ ©¥ÒŸ@ ©Ò³@ ©ÒÅ@ ©Ò×€ ªXÒë€ «\Òý@ ¬Ó€ ­`Ó!€ ®dÓ4€ °hÓK@ ±Ó\@ ²Ók@ ³Óz@ ´Ó‰@ µÓš@ ·Ó©@ ¸Ó¸@ ¹ÓÇ@ ºÓÖ@ »Óå& ¼«0Óý€ÔÀ¥Ôà­XÔ$XN­XÔ«<.­`D z­`D ‚­xD z­€D ‚­„D z­ˆD ‚­D ƒ­´D †­¸D ƒ­ÀD †­ÈD ‡®D ž®8D ˆ®PD ‰®€D Œ®°D ®ðD ޝD ¯8D ¯<D •¯@D ‘¯HD ’¯TD •¯XD  ¯ˆD –¯ D ž¯ÔD Ÿ¯ðD  °$D ¡°@D ¤°PD ¦°€Ô3$ z­`Ôt@ zÔˆ@ zÔš@ zÔ¬€ {8ÔÀ€ |<ÔÒ@ }Ôá@ ~Ôð@ Ôÿ@ €Õ& «<Õ&€ÕDÀ­`ÕEà° ÕF$@N° ÕG«H.° D I° D S°°D I°¸D J°ÀD S°ÄD I°ÈD S°ÌD J°àD S°äD T°ðD U°ôD T°øD U±D X± D q± D X±$D q±0D X±8D q±HD t±LD Y±pD Z±„D l±ˆD t±¤D u±ÀD w±ðÕ\$ I° Õ•@ IÕ©@ IÕ»@ IÕÍ€ J8Õä€ K<Õü@ LÖ €Ö-@ NÖ>& R«HÖV€ÖtÀ° Öuà²Öv$hN²Öw«P.²DAŲDAƲ(DAŲ,DAƲ<DADzLD !²TÖŒ ¾D "²XÖ– ¾”D #²\D !²dD "²hD #²lD !²„D "²ˆD #²ŒD $²˜D %²¤D &²´D '²ÄD (²ÜD '²àD (²èD )²ìD *³0D ,³@D -³HD .³D <³ÄD /³ÜD 1³àD /³èD 0³ôD 1³üD 2´D 3´4D 4´`D <´”D =´¬D ?´àD AµD BµD Cµ0D Dµ`DAȵDAɵ˜DA̵ÔÖ¡$AŲÖØ@AÅÖã@AÅÖì@AÅÖõ@AÆÖþÀ²Öÿ€ 8×€ <×)@ ×8€ @×F@ ×U@ ×d@ ×sÀ²T×tàµ×uàµô×v$äNµô.¶D(ù¶D(ý¶ D(ù¶D)¶,D)¶4D(ý¶8D(ÿ¶<D)¶@D)¶DD)¶LD)¶XD) ¶dD)¶„D) ¶ˆD)¶”D) ¶˜D)¶ D) ¶¤D)¶¬D)¶°D)}¶¸D)‚¶¼D) ¶ÐD)·D)·D)·D)·D)·D)· D)·,D)·\D) ·D)!·ÄD) ·ÈD)!·ÌD)(·øD)!¸D)(¸D))¸<D)*¸hD)+¸lD).¸tD)/¸˜D)0¸œD)4¸°D)5¸ÈD)6¸äD)7¹D)8¹$D)9¹(D):¹\D);¹D)<¹ÀD);¹ÄD)<¹ÈD)=¹ðD)>¹ôD)D¹üD)EºD)Fº(D)Gº8D)Hº<D)IºLD)Jº`D)Kº”D)LºÀD)MºðD)N»$D)M»(D)N»,D)O»\D)P»D)U»¼D)V»ØD)W»ìD)X»øD)Y¼D)Z¼<D)[¼pD)\¼¤D)_¼ØD)g½D)h½D)i½0D)j½DD)k½XD)o½\D)q½`D)k½dD)l½lD)m½tD)n½€D)o½ŒD)p½D)q½”D)r½ÄD)s½ðD)t¾$D)w¾TD)t¾XD)w¾\D)x¾D){¾”D)x¾ D){¾¤D)x¾¬D){¾°D)‚¾ÀD)ƒ¾ìD)„¿$D)…¿\D)†¿ŒD)‰¿ D)Š¿ÐD)‹ÀD)ŒÀ0D)ŽÀ\×w$(ù¶×³@(ù×Ç@(ù×Ú@(ú×ë@(û×ý@(üØ €(ý8Ø€(ÿ<Ø(€)@Ø6@)ØG@)ØVÀ¶ØWàÀ|ØX$ |NÀ|.À€D(ÜÀ€D(âÀœD(áÀ¤D(àÀ¨D(âÀ¬D(àÀ°D(âÀ¸D(ãÀ¼D(èÀÐD(ñÀìD(èÀðD(ñÀüD(èÁD(ñÁD(ôÁ D(öÁHØY$(ÜÀ€Ø–@(Üت@(ÝØ»@(ߨÌÀÀ€ØÍàÁ`ØÎ$àNÁ`ØÏ º<.Á`D'SÁ`D'^ÁlD'SÁpD'^ÁtD'SÁxD'^Á€D'TÁ„D'SÁˆD'^Á”D'SÁœD'^Á¤D'[Á¬D'TÁ°D'XÁ´D'ZÁ¸D'^Á¼D'_ÁÐD'`ÁðD'aÂ0D'bÂpD'e D'f¤D'e¬D'f´D'hÂÀD'†ÂèD'hÂìD'†ÂðD'hÂôD'†ÂøD'iÃD'jÃD'qÃ@D'lÃHD'kÃLD'qÃPD'lÃTD'qÃXD'rÃhD'sÃ|D'uÀD'sÄD'tÃD'uÜD'vÃäD'wÄD'xÄDD'{ÄtD'xÄxD'{Ä|D'|Ä„D'}Ä´D'€Ä¸D'†ÄÐD'‰ÅD'†ÅD'‰ÅD'†Å D'‰ÅD'ŠÅD'‹Å D'ŒÅ,D'ÅhD'ÅœD'‘ÅÐD'’ÆD'“ÆTD'ŸÆ\D' Æ D'¡ÆàD'¢Ç D'£ÇPD'¦Ç`D'§Ç D'¨ÇÐD'©ÈD'ªÈ@D'¬È„Øå$'SÁ`Ù&@'SÙ: 'SŒÙL 'SÙ^€'T8Ùs@'UÙ„@'VÙ“€'X<Ù¡€'Z@Ù¯€'[DÙ½@'\ÙÌ& ']º<Ùä€ÚÀÁ`ÚàȤÚ$DNȤÚ º@.ȰD&ÅȰD&ÐȼD&ÅÈÀD&ÆÈÄD&ÅÈÈD&ÐÈÐD&ÅÈØD&ÐÈäD&ÅÈìD&ÐÈôD&ÆÈüD&ÐÉD&ÑÉD&ÒÉ4D&ÓÉlD&ÔɤD&×ÉÐD&ØÉÔD&×ÉÜD&ÚÉäD&ÝÉôD&ÞÉøD&ßÊD&àÊD&âÊD&àÊD&âÊ(D&áÊ0D&âÊ8D'BÊ€D&ãʘD&äÊÄD&åÊÔD&æËD&ìË D&ïË$D&òË(D&óËpD&øË D&ùËðD&ÿÌ D&úÌ$D&ÿÌ(D'Ì0D'Ì€D'ÌÀD'ÍD'ÍD'Í D'ÍD'ÍD'ÍD'Í`D' ÍŒD' ͸D'ÍðD'Î4D'Î\D'Î`D'ÎhD'ÎtD'Î|D'δD'ÎàD'Ï D'Ï8D'Ï|D'ÏÀD'ÏìD' ÐD'!Ð\D'&ЈD''ÐÌD'(ÐèD'*ÐìD'(ÐôD')ÐüD'*ÑD'+Ñ8D',ÑdD'-ÑD'0ѼD'1ÑøD'3ÑüD'1ÒD'2ÒD'3ÒD'4ÒdD'5ÒD'6ÒÀD':ÒÄD'BÓD'CÓ0D'DÓ`D'EÓD'HÓ D'IÓàD'JÔD'KÔ@D'LÔpD'MÔ D'NÔàD'PÕ0Ú$&ÅȰÚY@&ÅÚm &Ŝڠ&Å Ú‘€&Æ8Ú¦@&ÇÚº@&ÈÚÒ@&ÉÚä@&ÊÚó@&ÌÛ@&ÍÛ@&ÎÛ & &Ϻ@Û8€ÛVÀȰÛWàÕTÛX$ ¤NÕTÛY ºD.Õ`D&}Õ`D&ƒÕpD&}ÕxD&ƒÕ€D&}Õ„D&ƒÕˆD&ˆÕ¤D&‡Õ¨D&„Õ¬D&ˆÕ°D&„Õ´D&ˆÕ¸D&„Õ¼D&ˆÕÀD&‹ÕÄD&ŒÖD&ºÖ0D&ÖPD&ŽÖ€D&‘Ö°D&’Ö¼D&“ÖðD&™ÖøD&šÖüD&×D&ž×@D&Ÿ×€D& ×°D&£×àD&¤×ìD&¥Ø D&«Ø$D&¬Ø(D&¯Ø0D&²Ø4D&·Ø<D&ºØTD&¼ØpD&¿Ø€D&ÁذÛo$&}Õ`Û¨@&}Û¼@&}ÛÎ@&}Ûà@&~Ûï@&€Ûþ@&Ü & &‚ºDÜ%€ÜCÀÕ`ÜDàØÈÜE$hNØÈÜF ºH.ØÐD&]ØÐD&bØàD&]ØèD&bØðD&]ØôD&bØøD&cÙD&dÙD&cÙD&dÙ$D&eÙ`D&gÙdD&iÙhD&eÙpD&fÙ|D&gÙ„D&hÙ”D&iÙœD&rÙÌD&jÙðD&kÚ D&lÚPD&oÚTD&rÚpD&tÚD&wÚ D&yÚÐÜ\$&]ØÐÜ™@&]Ü­@&]Ü¿@&]ÜÑ@&^Üà@&_Üï@&`Üþ& &aºHÝ€Ý4ÀØÐÝ5àÚèÝ6$NÚèÝ7 ºL.ÚðD IÚðD SÛD IÛD SÛD IÛD SÛD WÛ4D TÛ8D XÛ<D TÛ@D XÛHD YÛLD bÛ€D kÛ”D lÛ˜D mÛÐD nÛØD oÛäD pÛìD tÛøD xÜD |ÜD }Ü D ƒÜ`D ŒÜhD Ü€D Ü„D “ÜD –Ü”D lܰD žÜÀD ŸÜÈD ¥ÝD ¨ÝD ±ÝHD ´Ý`D ¶ÝÝL$ IÚðÝ‘@ IÝ¥@ IÝ·@ IÝÉ@ JÝÚ@ KÝë@ L Ýü@ M Þ@ NÞ@ OÞ,@ PÞ;& RºLÞS€ÞqÀÚðÞràݨÞs$¸Nݨ.ݰD ÇݰD ÔݼD ÇÝÀD ÑÝØD ÔÝÜD ÑÝàD ÔÝèD ØÝøD ÙÞD ÚÞ@D ÷Þ˜D ÛÞ°D ÜßD Ýß`D Þß D ãßÔD ßߨD àßÜD áßàD âßäD ãßèD ïßðD ðàD ÷à,D øàPD ùà€D úà°D ûààD ýá D á0D á\Þt$ Çݰ޹@ ÇÞÍ@ ÈÞÞ@ ÉÞí@ ËÞü@ Ìß @ Íß@ Îß)@ Ïß8@ ÐßGÀݰßHàá„ßI$ÔNá„.áD1ËáD1Ðá¸D1ÑáÄD1ÔáÐD1ÕâD1åâDD1Öâ`D1ØâdD1ÖâlD1×âtD1ØâxD1Ùâ„D1Úâ°D1ÛâàD1ÞãD1åã$D1æã@D1èãpD1ëã„D1ìã°D1îãÜßJ$1Ëáß}@1Ëß‘@1Ëߤ@1Ìß³@1ÍßÂ@1ÎßÑ@1ÏßàÀáßáàãüßâ$lNãü.äD9·äD9¾äD9½ä$D9¼ä(D9¾ä,D9¼ä0D9¾ä8D9¿ä<D9ÀäHD9Åä`D9ÆälD9Ìä€D9ÍäD9Ïä”D9Íä˜D9Ïä¨D9Îä°D9Ïä¸D9ÚäèD9ÐåD9Ñå,D9Òå<D9ÓåhD9ÚåŒD9Üå¤D9ßåÀD9áåèßã$9·äà@9·à,@9¸à;@9ºàJ@9»àYÀäàZàæà[$Næà\«\.æD1òæD1úæD1òæ D1óæ$D1òæ(D1úæ0D1óæDD1úæHD1ûæXD1üæ\D1ýæ`D2ædD1ýæhD1ûælD1üætD1ýæ€D2æ„D1ýæŒD2æ”D2æÐD2çD2ç0D2çdD2ç€D2 ç„D2çŒD2 ç”D2 ç˜D2 ç¤D2 çÐD2 èD2è0D2ètD2è¬D2èØD2èìD2èðD2èøD2éD2é D2é<D2éhD2é”D2éÀD2éÜD2êD2 ê@D2!êD2$ê D2%êÐD2&ëD2(ë0àr$1òæàª@1òà¾@1òàÐ@1òàâ€1ó8àò@1ôá@1õá@1öá$@1÷á3@1øáB&1ù«\áZ€áxÀæáyàëPáz$PNëPá{ ºP.ëPD/yëPD/~ë`D/yëhD/~ëpD/yëtD/~ëxD/ë”D/€ë˜D/ë D/€ë¨D/ƒë´D/”ëÈD/ƒëÌD/”ëØD/ƒëÜD/”ëìD/„ìD/‰ì0D/Œì4D/‰ì<D/ŒìDD/—ìPD/˜ì€D/šì°á‘$/yëPáÂ@/yáÖ@/yáè@/yáú@/zâ@/{â @/|â/& /}ºPâG€âeÀëPâfàìÈâg$xNìÈâh«d.ìÐD.ÕìÐD.äìàD.ÕìèD.äìðD.ÕìôD.âíâ~ ¿dD.ãí≠¿hD.äíD.âíD.ãíD.äíD.âí(D.ãí,D.äí0D.åí<D.æí@D.èíDD.îíHD.èíLD.åíPD.æíXD.çídD.ëítD.îíxD.ëí|D.îí„D.ïíÐD.ðî D.ñîPD.öî€D.÷îœD.øî¬D.ùî°D.úîÜD.ûîàD.üîäD.ûîèD.üîðD.ýï0D.þï4D.ÿï`D/ïxD/sï´D/ïÀD/ïØD/ðD/ðLD/ð`D/ðŒD/ ðœD/ ðÐD/ ðøD/ñ$D/ñPD/ñ„D/ñ¬D/ñØD/òD/ò<D/ò@D/òLD/òTD/òXD/ òˆD/!ò´D/"òüD/#ó(D/(óXD/)ó\D/(ó`D/)ódD/*óhD/+ó|D/,ó¨D/0ó°D/1óÄD/2óðD/7óôD/8ôD/9ô(D/:ô,D/;ô8D/<ô<D/=ôLD/>ôTD/?ô`D/@ôdD/AôtD/BôŒD/CôÀD/DôìD/EõD/JõDD/FõHD/JõLD/KõtD/LõxD/Mõ„D/Nõ´D/Tõ¸D/UõøD/Vö D/ZöD/VöD/Wö D/Xö$D/Yö4D/Zö<D/[öpD/\öœD/]öÈD/`öôD/÷D/g÷D/÷D/g÷4D/h÷€D/j÷°D/m÷ÀD/n÷ðD/oø D/pøPD/qø€D/rø°D/søàD/uù0â”$.ÕìÐâÊ@.ÕâÞ@.Õâð@.Õã€.Ö8ã€.×<ã+@.Øã?@.ÙãQ@.Úãi@.Ûã}@.ÜãŒ@.Ýã›@.Þ㪀.ß@ã¸@.àãÇ&.á«dã߀ãýÀìÐãþàùPãÿ$ €NùPä«p.ùPD,|ùPD,ƒùhD,|ùpD,}ùtD,|ùxD,ƒù€D,}ù”D,ƒù˜D,„ù¨D,…ù¬D,†ù°D,„ù¸D,…ùÀD,†ùÌD,‡úD,ú4D,ˆúPD,‰úhD,Šú D,‹úÐD,ûD,ûD,‘û@D,“ûpD,–û€D,—û°D,™ûàä$,|ùPäM@,|äa@,|äs@,|ä…€,}8ä™@,~ä¨@,ä·@,€äÆ@,äÕ&,‚«päí€å ÀùPå àüå $°Nüå ºT.üD,HüD,OüD,HüD,Oü D,Hü$D,Oü(D,TüDD,PüHD,TüLD,PüPD,TüXD,Uü\D,VülD,XüpD,VütD,Xü„D,WüŒD,Xü”D,qüÐD,YüðD,Zý D,[ý0D,\ý`D,býD,cýÐD,dýàD,eýøD,fþD,gþ0D,hþtD,iþ D,qþÔD,rþðD,tÿ0D,wÿ@D,yÿpå$$,Hüå[@,Håo@,Hå@,Hå“@,Iå¢@,Kå±@,LåÀ@,MåÏ& ,NºTåç€æÀüæàÿˆæ$ˆNÿˆæ ºX.ÿD,ÿD,ÿ¨D,ÿ°D,ÿ´D,ÿ¸D,ÿÀD,ÿÜD,ÿàD,ÿäD,ÿìD,ÿðD,ÿøD,ÿüD,D,D, @D,%pD,&°D,;üD,' D,(pD,)„D,*°D,+èD,,ìD,/ðD,14D,08D,1<D,;DD,<`D,= D,>ÐD,?D,BD,C@D,Epæ$,ÿæS@,æg@,æy@,æ‹@,æ @,æ¯@,æ¾@,æÍ@,æÜ@,æë& ,ºXç€ç!Àÿç"à”ç#$N”. D1º D1½°D1º´D1½ÀD1¼ÌD1½ØD1¾äD1ÃèD1¾ìD1ÃøD1¾üD1à D1ÆD1È<ç$$1º çW@1ºçk$´NT.`DE`DE‘hDElDE‘„DÙˆDÜŒDÙDÚ˜DÛ¤DܰDݼDßÀDÝÄDßÔDÞÜDßäDèDà0Dá`DâpDã DèÄDêàDíìDî DïPDE•€DE™ çl$E`ç©@Eç²@Eç»@EçÄ@×çÓ@ØçâÀˆçãà€çä$XN¸çå º\.ÀDüÀD ØDüàD äDüèD ðD D 8D <D @D DD HD PD \D D ÀD ÄD ðD D 8`D €D ÐD  D  pD  °D  àD  äD ' èD  ìD  ðD ! ôD ' øD ( @D * DD +  D , ÐD - D  0D 1 @D 8 XD 9 pD :  D ; ÐD < D = @D > tD ? °D B ÀD C ðD E çû$üÀè4@üèH@üèZ@üèl@ýè}@þèŽ@ÿè@ è¬@ è»@ èÊ@ èÙ@ èè@ è÷@ é@ é& º\é-€éKÀÀéLà HéM$ˆN HéN«x. PDk PD} \Dk `D} dDk hD} pDm tDk xD} „D| ˆéd ¿D} ŒD| Dk ”D} œDm ¤D| ¨D} ¬D~ ÀD äD€ D`D„D…”DŠ˜DœDФD„¨D…°DмDÀDŠÄDÌDD¿DÍ\DЬDÚØDÛ DÜXD݈DŽÀD0DPDÀD‘ðD’ D—PDšDäDžDŸpD |D¡€D¢¨D£ÀD¤ D¥xD¦¤D§ÐD¨üD­,D®hD³”DµD¶D·DpDº€D½¬D¾ðD¿0DÀLDÁ\DˆDôDÄÀDÅ DÆ4DÇ€DÈDɼDËèDÌôDÍPDÎdDÐhDÎpDÏxDÐ|DÑŒDÒ¸DÓäDÙ DÚpDÛŒDÜ DÝ´DÞÈDêÌDÞÔDßàDàäDáèDâìDãðDßôDäøDåDêDë`DìŒDñ¸Dò Dó`DõdDólDôtDõxDöÀD÷ìDøDüTDÿ€DœDÀDðD  D PD D ÐDàD DPD€D°DàD D @D pD °D ôéo$k Pé¥@ké¹ k¼éË kÀéÝ€l8éö€m<ê @nê'@oê<@pêM@qêa@rêy@sêˆ@tê—@uê¦@vêµ@wêÄ€x@êÒ@yêá@zêð&{«xë€ë&À Pë'à!ë($ÌN!ë) º`.! D_! Dl!8D_!@Dl!DD_!HDl!PDm!lDn!pDm!xDq!€Dt!ŒDu! Dv!ÐDy!ÔDv!ØDy!ÜDz" D"PD€"TDƒ" D„"´D»"èD…#D†#Dˆ#D‰#@DŠ#pD‹# DŒ#°D#àD”#äD•$Dš$PD›$dD $D¡$¬D¢$ÄD£%D©%D¤%D¥%D¦%D§%$D©%(Dª%4D¬%8D­%€D®%°D¯%àD€& D´&0D‹&HD¡&xD©&¨D»&ÔD¼&ìD½'Dƒ'TD”'lDš'”D 'ÀD½'ðD¾(DÁ(DÂ(@DÃ(pDÄ( DÅ(ÐDÇ)ë?$_! ë@_ë“@_ë¥@_ë·@`ëÈ@aëÜ@bëí@cì@dì@eì%@fì4@gìC@hìR@iìa& kº`ìy€ì—À! ì˜à)$ì™$N)$ìš«€.)0D)0D)HD)PD)TD)XD)`D)tD)xD)ˆD)ŒD )D)˜D) D )¬D#)¸D$)ÌD%*D(*D%* D(*D)*PDQ*„D** D,*¤D**¬D+*¸D,*ÀD-*ÌD.+D/+0D0+HD4+€D5+ÀD6+üD7,(D;,HD<,PD=,`D?,dD=,hD?,xD>,€D?,ˆD@,¼DA,èDB,øDC-$DI-HDQ-°DR-ÐD/.DS.$DT.PDW.`DX.DY.ÀD[.ðì°$)0ìì@í@í@í$€8í6@íG@í[@íj@íy@íˆ@í—&«€í¯€íÍÀ)0íÎà/íÏ$àN/íÐ ºd./Dè/Dï/Dè/ Dï/$Dè/(Dï/0Dé/4Dè/8Dï/DDè/LDï/TDé/\Dï/`Dð/tDñ/”Dò/ÐDó0Dö0@D÷0DDö0LD÷0TDø0D0ÄDù0àDú0øDû10Dü1`D1Dý1°D1äD2D24D2PD 2`D 2 D 2ÐD3D3Tíæ$è/î @èî4 èŒîF èîX€é8îm@êî|@ëî‹@ìîš@íî©& îºdîÁ€îßÀ/îàà3tîá$dN3t.3€DE›3€D¶3DE›3”Dµ3 D¶3¬D·3àD¹3äD·3ìD¸3ôD¹3øDÂ4(Dº4@DÂ4pDÄ4DÇ4 DE4Ìîâ$E›3€ï @E›ï)@E›ï3@²ïB@³ïQÀ3ïRà3”ïS@²ïb@³ïqÀ3 ïrà4Ìïs$dN4ä.4ðD•4ðDš5 D™5Dš5D›5PD¦5€Dœ5 D5ÐD§6Dž6 D¦6TD§6pD¨6D«6 D­6Ìït$•4ðï­@•ïÁ@–ïÐ@—ïß@˜ïîÀ4ðïïà6äïð$ôN6äïñ ºh.6ðD õ6ðD ú7D õ7D ú7D õ7D ú7D û74D ü78D û7@D ü7HD ý7€D 7°D þ7ÐD ÿ8D 80D 8PD 8„D 8 D 8ÀD 8ÐD 9ð$ õ6ððG@ õð[@ õðm@ õð@ öðŽ@ ÷ð@ øð¬& ùºhðÄ€ðâÀ6ððãà9ðä$(N9ðå ºl.9 D ­9 D ¶98D ­9@D ¶9DD ­9HD ¶9PD ·9lD ¹9pD ¼9tD ¹9xD ·9|D ¹9„D ¼9D ç9ÀD ½9ÐD Â:D Ä:DD Å:LD Æ:XD ç:¤D É:ÀD Ì:ðD Í;PD Î;D Ï;¤D Ð;ÐD Ñ;äD Õ;èD Ñ;ìD Ó;ôD Ò;øD Õ;üD Ö<@D ØD î>(D ï>`D ð>D ò>Àðú$ ­9 ñ7@ ­ñK@ ­ñ]@ ­ño@ ®ñ€@ ¯ñ”@ °ñ£@ ±ñ²@ ²ñÁ@ ³ñÐ@ ´ñß& µºlñ÷€òÀ9 òà>èò$ÈN>è.>ðD u>ðD z?D u?D y?D z?D {?PD }?TD {?\D |?hD }?pD †? D ~?ÀD †?ôD ˆ@D ‹@ D @Lò$ u>ðòX@ uòl@ vò{@ wòŠ@ xò™À>ðòšà@dò›$tN@d.@pD#@pD#@D#@”D#@˜D#@ D#@¬D#@¸D#@¼D#@ÀD#@ÐD#@ØD#@àD#$AD#A0D#A`D#ApD#A D#$AÄD#&AàD#)AìD#*B D#,BLòœ$#@pòÖ@#òê@#òý@#ó @#óÀ@póàBdó$ôNBd.BpD!ÓBpD!ãB”D!âBœD!äB¨D!çB´D!èBÌD!éCD!ìCD!éCD!ìCD" C@D!íCpD!òC D!óC¤D!ôCÐD!õCÜD!ôCàD!õCäD!÷CìD!øCøD":D4D!ùD@D"/D˜D!úD°D!ûDÄD!ýDÈD!þE D!ÿEPD"E€D"ED"EÀD"EÄD" EÌD"EØD" EðD" EüD" FPD"F°D"FàD"G0D"GpD"GtD"GxD"G€D"G„D"GÀD"GìD"HD"HPD"HTD"H°D"HÜD" ID"#IPD!óIdD"#IhD!óIlD"'ItD"I¸D"/JD"0JD"1JLD"2J|D"3J¬D"4JôD"5K(D"8K@D"9KpD":K D"<KÌó$!ÓBpóU@!Óói@!Ôóz@!Õó‹@!ÖóŸ@!×ó°@!Øó¿@!ÙóÎ@!ÚóÝ@!Üóì@!Ýóû@!ßô @!àô@!áô(ÀBpô)àKôô*$ „NKôô+L.LD ¤LD ¯LD ¤LD ©L D ¯L,D ©L0D ´L@D µLHD ÀLpD µLtD ÀL€D µLˆD ÀL˜D ÃL D ºLÀD ÃLÈD ÅLàôi$ ¤Lô­@ ¤ôÀ ¦8ô×@ §ôæ@ ¨ôõÀLôöàLøô÷$øNLøôøM.MD MD *MD M D *M,D &M0D *M4D &M8D *M@D 2MDD 3MLD 4MTD 5MXD 9M`D :MlD @MD DM”D CM˜D DMœD EM¨D HN@D INDD JNLD NNÀD ONÐD QNÔD ONØD QNèD PNðD QNøD qO(D RO@D SOlD TO|D UO¨D ZOÐD ]OÔD ZOØD aOàD dOäD eOðD kP$D qP,D sPPD vPpD xP˜õ8$ Mõ~@ õ”@ õ«@ !õ¼€õÍ@ "õÜ@ #õë@ $õú@ %ö ÀMö àP¸ö $¸NP¸ö PÀ.PÀDKPÀDUPàDKPäDPPèDQPüDRQDUQDXQD[QD^Q D_Q,DdQ`D`QdDdQhDgQtDhQxDiQ€DjQŒDkQÀDoQÐDpQÜDqR DRPDrRpDsRœDyRàDzRìD{S DS(D„S,DS0D„S4DS<DSTD’SpD“S D”SÐD–SüöJ$KPÀöŽ@Kö¤@Kö¹@KöÌ@Köà@Köô@L÷@N÷@O÷!ÀPÀ÷"àT÷#$TNT÷$T .T DhT DpT<DlTDDpTHDlTLDpTTDsTXDtT\D|TdDT¨D†TÀD…TÄD†TÈDŒTÌD|TØDIšTàD|TèDIšTìD|TðDIšUDI›UDIœUDI›UDIœU DIU(DIŸU8DžUPDŸUTD¡U|÷\$hT ÷š@h÷°@j÷¿€÷ÒÀT ÷Ó€I˜H÷á€I˜L÷ï€I˜P÷ü@I™øÀTàøàTèø €I˜Hø€I˜Lø%€I˜Pø2@I™ø=ÀTìø>àTðø?€I˜HøM€I˜Lø[€I˜Pøh@I™øsÀUøtàUPøuàU”øv$tNU”øwU .U D'®U D'¸U¨D'®U¬D'´UÄD'®UÈD'´UÌD'¸UÔD'¹UØD'ºUèD'¼UìD'ºUðD'¼VD'»VD'¼VD'÷V@D'½VXD'¾V„D'¿V”D'ÀVÀD'ÇVðD'ÉWD'ÊWD'ËW D'ÌWD'ÔW D'ÓW$D'ÔW(D'ÕW0D'ÈW4D'ãW@D'ßWDD'ãWTD'äW\D'åWlD'çWpD'åWtD'çW„D'æWŒD'çW”D'èWÐD'éXD'êXD'ëX@D'÷XdDIšX€DI›XDIœXœDI›X¤DIœX¨DIX°DIŸXÀD'üXÌD'ÈYD'þY ø±$'®U øñ@'®ù@'®ù@'® ù,@'®ùG@'®ù^@'°ùm@'²ù|@'³ù‹ÀU ùŒ€I˜8ùš€I˜<ù¨€I˜@ùµ@I™ùÀÀX€ùÁàXÌùÂàY8ùÃ$˜NY8ùÄY@.Y@D ÇY@D ÏY\D ËYdD ÏYhD ËYlD ÏYtD ÐYxD ×Y D ÖY¤D ×Y¨D ÝYÀD ÐYÐDIšYØD ÐYàDIšYäD ÐYèDIšYüDI›ZDIœZ DI›ZDIœZDIZ DIŸZ0D ðZ@D òZhú$ ÇY@úB@ ÇúX@ Çúo@ Éú~ÀY@ú€I˜8ú€I˜<ú›€I˜@ú¨@I™ú³ÀYØú´àYàúµ€I˜8úÀI˜<úÑ€I˜@úÞ@I™úéÀYäúêàYèúë€I˜8úù€I˜<û€I˜@û@I™ûÀYüû àZ@û!àZ€û"$@NZ€û#Z€.Z€D©Z€D»ZˆD©ZŒD±Z¤D´Z¨D±Z¬D´Z°D±Z´D·Z¸D»Z¼D¾ZÀD¿ZÈDÆZØDÉZäDÍZüDÎ[DÏ[DÑ[DÏ[DÑ[,DÐ[4DÑ[<Dê[lDÒ[DÓ[¼DÔ[ÌDÕ[øDÞ\ DÛ\(DÞ\,Dê\8DIš\PDI›\`DIœ\lDI›\tDIœ\xDI\€DIŸ\Dï\ Dñ\Ìû`$©Z€û£@©û¹@©ûÎ@ªûä@«ûú@¬ü@­ü"@¯ü1@°ü@ÀZ€üA€I˜8üO€I˜<ü]€I˜@üj@I™üuÀ\Püvà\ üwà\äüx$dN\äüy\ð.\ðD ô\ðD ÿ]D ú]D û](D ÿ]4D ]8D ]HD ]LD ]PD ]`D ]hD ]pD =] D ]ÀD ]ìD ]üD ^(D ^PD ^TD ^`D ^lD ^tD ^„D ^ˆD ^ŒD ^œD ^¤D ^¬D ^àD _ D _D _HD &_pD #_tD &_xD ,_€D /_„D 0_ˆD 1_D =_¤DIš_ÀDI›_ÐDIœ_ÜDI›_äDIœ_èDI_ðDIŸ`D B`D C`@D E`lü´$ ô\ðüõ@ ôý @ ôý @ õý9@ øýH@ ùýWÀ\ðýX€I˜8ýf€I˜<ýt€I˜@ý@I™ýŒÀ_Àýà`ýŽà`„ý$”N`„ý«ˆ.`D H`D U`˜D H`œD U` D J`¤D H`¨D U`´D J`ÌD U`ÐD V`èD W`ìD V`ðD W`üDI‹aDIŒa DIa0D ZaPD [aXD la`D kahD lalDI‘a€D Wa¬D \aÐD ]aàD _aäD ]aèD _aøD ^bD _bD ‘b@D `bXD ab„D bb”D cbÀD kbðD lbüD mcD jc D xc$D yc@D zcHD xcPD ƒc`D „cD …c¤D ‡càD †cäD ‡cèD ‘cðD ’dD ”dPD —d`D ld˜D yd°D zd´D ™dàý¦$ H`ýÚ@ Hýì@ Hýþ@ Hþ€ I8þ#€ J<þ>€ K@þS€ LDþg@ Nþv@ Pþ…@ Qþ”@ Sþ£& T«ˆþ»€þÙÀ`þÚ@ WþèÀaþéàaPþê@ WþøÀa€þùàa¬þúàdøþû$hNdøþü«œ.eDG eDG¢eDG eDG¢e$DG£e4DG¥e<D  e@DG¥eLD ePD  eTDG¥edD ehDG¥elD  exD ¡e„D £eˆD ¡eŒD ¢e”D £e¤DI‹e¬DIŒe´D £eÌD °eÐD £eÔD °eàD £eèD °eøD ³fDIf D ¦f@D §fLDI‘fpD §f D ¨fÀD «fÄD ¨fÈD «fÌD ³fàD ´gDG¦g0DG§g8DGªgtÿ$G eÿM@G ÿX@G ÿa@G ÿj@G¢ÿsÀeÿt€ 8ÿ@ žÿžÀe@ÿŸàeLÿ € 8ÿ»@ žÿÊÀePÿËàedÿÌ€ 8ÿç@ žÿöÀehÿ÷àelÿø€ 8@ ž"Àex#@ £1Àe¬2àeÌ3@ £AÀf Bàf@C@ £QÀfpRàf Sàg0TàgŒU$ŒNgŒV«¤.gDF8gDF:g DF8g¤DF:g´DF;gÄDF=gÌD agÐDF=gÜD ^gàD agäDF=gôD ^gøDF=güD ahD bhD dhD bhD ch$D dh4DI‹h<DIŒhDD dh\D lh`D dhdD lhpD dhxD lhˆD ohDIh°D ehØD fhäDI‘iD fi0D giPD oi`D pi€DF>i°DF?i¸DFBiôk$F8g¥@F8°@F8¹@F8Â@F:ËÀgÌ€ ^8ç@ _öÀgÐ÷àgÜø€ ^8@ _"Àgà#àgô$€ ^8?@ _NÀgøOàgüP€ ^8k@ _zÀh{@ d‰Àh<Šàh\‹@ d™Àh°šàhØ›@ d©Àiªài0«ài°¬àj ­$|Nj .jD jD ”j0D –j<D •j@D –jLDI‹jPDIŒjXDIj€D —j¬D ˜jÄDI‘jàD –k D —k0D ˜kTD ¡ktD ™kD ¡kÄD £kàD ¦kðD §l D ©lL®$ jñ@ @ @ ‘(@ ’7@ “FÀjG@ –UÀjPVàj¬W@ –eÀjàfàk gàldh$TNldi«¬.lpD.«lpD.´l€D.«lˆD.¬lD.«l”D.³l˜ ¿`D.´lœD.³l¤D.´l¨D.¬l¸D.³l¼D.´lÀD.µlÐD.¶lÔD.µlØD.¸làD.¶läD.·lðD.¸mDI‹mDIŒmDIm0D.»m\D.¼mtDI‘mD.¸m¼D.»màD.¼nD.Èn$D.½n@D.¾npD.Én¨D.¿nÀD.ÀnìD.ÃnôD.Åo0D.ÈoHD.ÉodD.Êo€D.ÍoD.ÎoÀD.ÏoðD.Ñp Š$.«lpÁ@.«Õ@.«ç@.«ù€.¬8 €.­<@.®-@.¯<@.°K&.²«¬c€Àlp‚@.¸@.¸›Àmœàm\@.¸«@.¸¶Àm·àm¼¸àp8¹$ÈNp8ºp@.p@D2`p@D2fphD2eppD2fp|D2ipˆD2kpÀD2lpÈD2mpÔD2‚qD2pq DJ‹q(DJŒq0DJqPD2qqxDJ‘qD2qq¸D2uqÐD2rqÔD2uqØD2xqàD2yqðD2~rD2‚r4D2ƒrLDIšr€DI›rDIœrœDI›r¤DIœr¨DIr°DIŸrÀD2†rÈD2‡sD2ˆs,ê$2`p@ @2`6@2`N@2ab@2bq@2c€Àp@@2pÀq(àqx‘@2pŸÀq àq¸¡€I˜8¯€I˜<½€I˜@Ê@I™ÕÀr€ÖàrÈ×àsHØ$NsHÙ ºp.sPD+ßsPD+æshD+ßspD+æstD+ßsxD+æs€D+çsœD+ès D+çs¨D+ès°D+ës¼D+ísðD+îsøD+ïtD,t0D+òtPDJ‹tXDJŒt`DJt€D+ót¨DJ‘tÀD+ótèD+öuD+ôuD+öu D+÷u D+øu`D+ùuD+ûuÀD+þuìD+ÿv(D,v\D,vˆD,v´D,vÌD,väD, w D, w0D, w`D,wï$+ßsP@+ß3@+ßE@+ßW@+àk@+áz@+â‰@+ã˜@+ä§& +åºp¿€ÝÀsPÞ@+òìÀtXíàt¨î@+òüÀtÀýàtèþàw°ÿ$`Nw° ºt.w°D/žw°D/¦wÈD/žwÐD/¦wÔD/žwØD/¦wàD/§wüD/¨xD/¬xD/¨xD/§x D/©xD/¬x D/­xTD/³x¤D/´x¼D/µxÄD/´xÈD/µxÌD/¸xÐD/¹xèD/Ñy D/ºy0D/»y`DJ‹yhDJŒypDJyD/¼y¸DJ‘yÐD/»yôD/ÒzD/¼z D/Áz0D/½z4D/Áz8D/Âz@D/ÃzpD/ÆztD/Çz„D/Èz°D/ÉzàD/Î{D/Ñ{(D/³{DD/¸{hD/Æ{ŒD/Ò{°D/Ó{ÜD/Ö{ìD/×| D/Ø|PD/Ú|€$/žw°H@/ž\@/žn@/ž€@/Ÿ”@/ ª@/¡¹@/¢È€/£8Ö@/¤å& /¥ºtý€Àw°@/»*Àyh+ày¸,@/»:ÀyÐ;àyô<à| =$ðN| >| .| Dy| D~|¨Dy|¬Dˆ|°Dy|´Dy|ÌD„|ÔD‚|ÜD~|èD|ìD€|ðDƒ|ôD„}Dˆ} D‰}DŠ}PDÖ}ŒD‹}°DŒ}ÄD}üDŽ~D”~DŽ~D~ D~(D‘~0D’~4D“~8D”~<D•~pD–~œD—~ÈD˜~ôD™~øDDžPDŸdD tD¢xD |D¡€D¢„D£ÀD¤ôD¥€ D­€PDº€„D­€ˆDº€ŒD­€Dº€”D®€ D¯€¼D°€ÐD±€ÔD°€ØD±€ÜD²€àD³€ôD´(Dµ\DºŒD»ÀDºÄD»ÌD¼‚D»‚D¼‚ DÀ‚@DJm‚DD¼‚HDÀ‚LDJm‚PD¼‚TDJm‚XDJn‚`DJo‚lDÀ‚tDJo‚xDÀ‚„DÁ‚ D‚¤DÁ‚¨D‚¬DÂàDÄ‚ôDŃDƃ<DǃpDȃ¤DσØDÖƒìDׄDØ„PDÙ„DÚ„ÐDÛ…DÞ…$Dß…PDà…€DÖ…°Dâ…Ày$y| º@yÐ@yä@yü@y@y%@z9@{H@|W@}f€~8t€<‚€€@@ŸÀ|  @À¬À‚D­à‚H®@ÀºÀ‚P»à‚T¼@ÀÈÀ‚XÉà‚tÊ@ÀÖÀ‚x×à‚„Øà…ØÙ$ 8N…ØÚ«¸.…àD= …àD=P…ìD= …ôD=M†ð ¿tD=N†û ¿xD=O†  ¿|D=M†D=P† D=N†$D=P†(D=!†,D=O†0D=P†4D=!†DD=M†HD=N†LD=O†PD=P†TD=Q†lD=d†pD=Q†xD=R†„D=S†”D=T†¤D=g†´D=d†¸D=g†¼D=d†ÀD=g†ÄD=d†ÌD=h†ÐD=g†ÔD=h†ØD=i†ÜD=o†ðD=p‡D=y‡0D=v‡4D=y‡<D=z‡pD=}‡|D=~‡ˆD=}‡ŒD=~‡D=‡”D=€‡¬D@d‡ÜD=‡ôD=ƒ‡øD@eˆ4D=„ˆ`D=…ˆŒD=†ˆœD=‡ˆÐD=‰D=‘‰(D=‰,D=‘‰0D=’‰4D=“‰ØD=”ŠLD=–ŠPD=—‹D=˜‹,D=™‹<D=š‹hD=©‹ÀD= ‹ÈD=¦‹ÌD=©‹ÐD=¦‹ØD=£‹ÜD=¬‹àD= ‹äD=©‹èD=¬‹ìD=­Œ$D=¬Œ(D=­Œ,D=®Œ0D=¯ŒàD=°xD=²|D=³ŽD=´ŽDD=µŽTD=¶Ž€D=¼ŽÔD=½TD=¾`D=½dD=¾hD=ÁlD=ÂØD=ÇD=ȈD=É‘(D=Ê‘TD=Ë‘D=Ì’D=Ð’D=Ì’$D=Í’0D=Î’4D=Í’<D=Ð’@D=Ñ’¼D=Ò’èD=Ó“ D=Ø“LD=Ù“ÔD=Ý”D=Þ”D=å”ÜD=æ”ôD=唸D=æ”üD=ç•D=è•D=ç•D=è•D=é•,D=ê•DD=ì•HD=ê•LD=ì•PD=ê•TD=ë•`D=ì•dD=ë•hD=ì•lD=ë•pD=ì•xD=í•ðD=î–(D=ï–8D=ð–dD=ö–ÌD=÷–àD=ö–äD=÷–èD=ú–üD=û—”D=ý—˜D=û—œD=ü—¬D=ý—´D=ü—¸D=ý—¼D=þ˜LD=ÿ˜xD>™D>™8D>™pD>™øD>štD> šxD>š€D> šˆD> › D> ›DD> ›tD>›€D>œ D>œ<D>œÀD> œìD>!LD>"ˆD>#¤D>$ÐD>%žHD>&žLD>)žPD>%žTD>)ž\D>&ž`D>'žpD>)žxD>*žøD>+Ÿ$D>,ŸPD>1Ÿ|D>2ŸÜD>3 D>4 0D>5 \D>6 ÌD>: ÐD>6 ÔD>: ÜD>7 àD>8 ðD>: øD>;¡ˆD><¡´D>=¡àD>B¢ D>C¢ŒD>H¢¸D>I¢ÈD>H¢ÌD>I¢ÐD>J¢ÔD>K£`D>L£ðD>R¤D>S¤,D>R¤0D>S¤4D>T¤8D>U¤°D>V¥DD>\¥|D>]¦D>^¦°D>_¦ÜD>`§pD>a§tD>d§xD>`§|D>d§„D>a§ŒD>d§D>a§”D>b§ D>d§°D>e¨0D>f¨hD>l¨”D>m¨ØD>~©D>n©,D>r©0D>n©8D>o©@D>p©DD>q©PD>r©TD>s©`D>t©ŒD>u©¸D>~©ìD>ªD>ª4D>‚ª@D>ªDD>‚ªHD>†ªTD>Œª„D>†ªˆD>Œª¤D>‡ª¬D>ˆª¼D>‰ªèD>“«D>« D>Ž«XD>«D>™¬`D>•¬dD>™¬pD>•¬|D>™¬€D>–¬ˆD>—¬ŒD>–¬D>™¬”D>–¬ÈD>™¬ÌD>—¬ÐD>˜¬ÔD>–¬ØD> ¬àD>¡¬ôD> ¬øD>¡¬üD>¢­€D>£®D>¤® D>¦®8D>¨®HD>©®äD>ª¯D>«¯D>¬¯D>­¯ÀD>´¯ÄD>µ°DD>º°pD>½°°D>¾°ÈD>½°ÌD>¾°ÐD>¿°ÔD>À°ðD>Á±D>ñD>ıD>űHD>ƱXD>DZ„D>ͱôD>βD>Ͳ D>β$D>ϲ(D>вDD>ѲXD>Ó²\D>Ô²pD>Õ²œD>Ö²¬D>ײØD>ݳHD>Þ³\D>å³`D>æ³xD>å³|D>æ³€D>糄D>賘D>é³°D>ê³¼D>ë³èD>ì³ôD>í´D>î´,D>ï´@D>ñ´DD>ï´HD>ñ´PD>ò´`D>ó´ŒD>ô´¸D>ý´øD>þµ D?µD>þµD>ÿµ(D?µ8D>ÿµ<D?µ@D?µTD?µ€D?µœD?µÔD? ¶D? ¶D? ¶,D? ¶0D?¶LD?¶xD?¶ŒD?¶¨D?¶ÔD?·@D>º·PD?·`D?·äD?·ôD?·øD?·üD?¸D?¸ D?¹,D? ¹0D?¹8D? ¹<D?¹@D? ¹DD?!¹ÈD?"ºD?#ºD?$º<D?*º¬D?+»,D?,»<D?+»@D?,»DD?/»XD?0»àD?5¼D?6¼˜D?7¼¬D?9¼°D?7¼¼D?8¼ÈD?9¼ÐD?:½HD?;½€D?<½¬D?=½ÜDJm½èD?D½ðDJm½ôD?D½øDJm½üDJn¾D?D¾DJo¾0D?D¾4DJo¾8D?D¾HD?E¾˜D?F¾°D?G¾èD?H¿|D?I¿üD?MÀD?IÀD?JÀD?MÀD?JÀD?KÀ$D?MÀ0D?NÀ¨D?OÀÔD?PÁ D?SÁ8D?VÁHD?WÁdD?VÁhD?WÁlD?XÁpD?YÁŒD?ZÁ¤D?\Á¨D?]ÁÄD?^ÁüD?_ D?`Â8D?f D?gÂÌD?fÂÐD?gÂÔD?hÂàD?iÂüD?jÃD?lÃD?mÃ4D?nÃlD?oÃ|D?pèD?ìÄD@Ä`D?vĤD?wĸD?xÄÐD?yÄäD?zÄôD?{ÄøD?€ÄüD?{ÅD?|ÅD?{ÅD?€Å D@FÅtD?ÅŒD?‚Æ D?ƒÆLD?†ÆxD?‡ÆD?ˆƤD?‰Æ´D?ŠƼD?‰ÆÀD?ÆÄD?ŽÇDD?ǘD?‘ÇœD?ǤD?‘ǨD?ǬD?‘ǰD?’ÇüD?“È4D?”ȰD?•ÈÜD?SÉD?™ÉD?šÉLD?›ÉÜD?œÊD?ŸÊ4D? ʼD?¡Ë@D?¢ËlD?¥˘D?¦ËœD?¥Ë D?¦Ë´D?§ËàD?ªËðD?§ËôD?ªËøD?«ÌlD?¬ÌxD?«Ì|D?¬Ì€D?¯Ì„D?°ÍD?µÍ8D?¶͸D?·Î4D?¸ÎlD?¹ΘD?»ΜD?½ΠD?¹ΨD?ºδD?»μD?¼ÎÐD?½ÎØD?¾ÏLD?¿ÏxD?ÀϤD?ÅÏÔD?ÆÐHD?ÊÐhD?ÏЀD?ÐÑD?ÖÑDD?×Ñ\D?ÖÑ`D?×ÑdD?ÚÑhD?ÛÑxD?àѰD?áÑÌD?âÑàD?äÑäD?âÑìD?ãÑøD?äÒD?åÒD?æÒ@D?çÒlD?èÒ„D?êÒ¼D?ëÒÈD?ìÒàD?íÒôD?ïÒøD?ðÓD?ñÓ@D?òÓPD?óÓ|D?ùÓØD?úÓüD?ûÔD?üÔHDJmÔ€D@ÔŒDJmÔ”DJnÔœD@Ô¨D@ÔÀD@ÔìD@ÕD@Õ(D@Õ`D@Õ|D@ Õ¨D@ ÕÀD@ ÕÄD@ ÕØD@ÖD@Ö<D@ÖhD@Ö€D@Ö„D@ÖˆD@ÖœD@× D@ׄD@׈D@ØD@Ø4D@ØDD@ØpD@#ØÌD@$Ù<D@%Ù D@&Ù¤D@)Ù¨D@&Ù´D@'ÙÄD@)ÙÌD@*Ú<D@+ÚhD@0Ú”D@1Ú´D@2ÛD@4ÛD@2Û$D@4Û(D@2Û,D@3Û8D@4Û<D@5Û”D@6ÛÌD@7ÛøD@:Ü$D@;ÜLD@<ÜÀD@=ÜìD>¿ݬD>ÀÞD>ÃÞˆD>ÏÞøD>ÐßXD>ÓßÐD>Ýà@D>èà¬D>ìá$D>íáŒD>îáøD>ñâhD>ýâèD?ãTD?ãÈD? äDD? äÈD? å@D?å´D?æ$D?Xæ˜D?YçD?\çxD?hçäD?iè\D?lèÄD?vé0D?wé¨D?yêD?†êxD?‡êäD?ˆêøD?ÚëdD?àë¸D?áìD?äìdD?çì¸D?ëíD?ïídD?ùíÄD?úíìD@îHDJoîLD@îXDJoîlD@îxD@îÔD@ï<D@ ïdD@ ïÀD@FðD@GðTD@HðD@IðÀD@JñD@Kñ D@JñD@KñD@Oñ D@Pñ(D@Rñ0D@Tñ@D@SñDD@VñHD@SñLD@TñPD@UñTD@]ñ`D@dñ|D@eñˆD@hñèD@kñøD@lò0D@mòpD@nò°D@oòðD@pó0D@qópD@ró°D@sóðD@tô0D@uôpD@vô°D@wôðD@xõ0D@yõpD@zõ°D@{õðD@|ö D@}öPD@~ö€D@Fö´D@€öà $= …à I@=  [@=  m@=  €=!8 –€="< ¬€=#@ Å€=$D Ý@=%  î€=&H þ€='L €=(P '€=)T <€=*X [€=+\ v€=,` Œ@=- ¤€=.t ¼€=/ t Ñ€=0t å€=1t þ€=2t @=3 4€=4 ¸ E€=5 ´ ^€=6 ° v€=7 ¬ Ž€=8 ¨ £€=9 ¤ »€=:   Ѐ=; œ à€=< ˜ ô€== ” €=>  €=? Œ ;€=@ ˆ T€=A „ f€=B € v@=C …€=Dl “€ µ€ Ø@=F ç@=G ö@=H @=I @=J %&=L«¸ =€ [À…à \@>x  m€>yp ‚€>yh ˜€>yd «@>z ÃÀ© Äà©, Å@>x  Ö€>yp ë€>yh€>yd@>z,À©ì-à¬à.@?D:À½è;à½ð<@?DHÀ½ôIà½øJ@?DVÀ½üWà¾X@?DdÀ¾0eà¾4f@?DrÀ¾8sà¾Ht@@@…€@Adš€@Ah°€@ApÃ@@BÛÀÅtÜàÅŒÝ@@éÀÔ€êàÔŒë@@÷ÀÔ”øàÔ¨ù@@ÀîLàîX@@Àîlàîx@@@&€@Ad;€@AhQ€@Apd@@B|Àð}àñ`~@@@€@Ad¤€@Ahº€@ApÍ@@BåÀö´æàöàçà÷è$q(N÷.÷DHI÷DHX÷DHI÷DHX÷ DHI÷(DHX÷4DI‡÷<DHX÷DDI‡÷LDHX÷PDI‡÷TDHX÷XDHY÷\DHX÷`DHY÷hDHZ÷lDH[÷pDHZ÷xDH[÷€DH\÷ˆDH[÷ŒDH\÷”DH]÷˜DJÈ÷ÀDJÉ÷ÔDJË÷äDJÌ÷ðDJÇøDH_øDH`ø(DHdøTDHcø\DHbø`é ¿€DHdødDHaølDHcøpDHbøtDHeø|DHaø€DHcø„DHdøˆDHbøŒDHeøDHføœDJÖø DJ×ø¬DJÙø´DJáøÈDJÚøÌDJáøÔDHføüDHgùDHiù4DHhù8DHiù<DHhù@DHiùDDHjùTDHnù€DHmùˆDHlùŒ ¿„DHkùDHnù”DHmù˜DHlùœDHkù¤DHmù¨DHnù¬DHoù°DHlù´DHoù¸DJÖùÄDHpùÌDJÖùÐDJ×ùÔDJÙùÜDJáùðDJÚùôDJáùüDHpú$DHqú,DHtú\DHsú`N ¿ˆDH}údDHrúhDH}úlDHtúpDHsútDHrúxDHuú|DH}ú€DHtú„DH|úˆDHuúŒDH|úDHsú”‡ º¬DHuú˜DHwúœDH~ú DH|ú¤DHvú¨DHwú¬DHvú°DHwú´DHyú¸DHvú¼DHxúÀDHyúÄDHxúÈDHyúÌDH{úÐDHxúÔDHzúØDH{úÜDHzúàDH{úäDHzúèDH}úìDHsúðDH~úôDJÖûDHûDJÖû DJ×ûDJÙûDJáû,DJÚû0DJáû8DHû`DH€ûhDHƒû˜DH‚ûœÁ ¿¬DH†û DHû¤DH†û¨DHƒû¬DH‚û°DHû´DH„û¸DH†û¼DHƒûÀDH…ûÄéT DH„ûÈDH…ûÌDH‚ûÐDH„ûÔDH‡ûØDH…ûÜDH†ûàDH‚ûäDH‡ûèDJÖûôDHˆûüDJÖüDJ×üDJÙü DJáü DJÚü$DJáü,DHˆüTDH‰ü\DHŒüŒ#[ÐDH‹ü[ ¿¸DHŽü”DHŠüœDHŒü DH‹ü¤DHŽü¨DHŠü¬DH‹ü°ˆ º´DHŒü´DHü¸DHü¼DHüÀDHŽüÈDH‹üÌDHüÐDJÖüÜDHüäDJÖüèDJ×üìDJÙüôDJáýDJÚý DJáýDHý<DH‘ýDDH“ýtDH’ý€DH“ý„DH”ýˆDH’ýŒDH”ýDH•ýœDH™ýÈDH˜ýÌDH—ýж ¿ÀDH–ýÔDH™ýØDH˜ýÜDH—ýàâ º¸DH–ýèDH˜ýìDH™ýðDHšýôDH—ýøDHšýüDJÖþDH›þDJÖþDJ×þDJÙþ DJáþ4DJÚþ8DJáþ@DH›þhDHœþpDHžþ¤DHþ°DHžþ´DHŸþ¸DHþ¼DHŸþÀDH þÌDH¤þøDH¡þüDH¤ÿDH¡ÿDH¤ÿ DH¥ÿ0DH¦ÿhDH©ÿ”DHªÿ¼DH«ÿäDH®DH¯8DH°`DH³ŒDHµDH³”DH´¤DHµ°DHºÌDH¾ÐDHºÔDH¶ØDH»àDHºäDH»èDHºìDH¾ôDHÃDHÇDHÎDHÒDHà DH¿$DHÓ(DHÎ,DH¿0DHÇ4 ¾ˆDHí8DHÃ<DHÇ@DHÄD ¾€DHíHDHÄLDHÉP# ¾ŒDHÌTDHÉXDHØ\DHÌ`DHÆd- ¾„DHØhDHÆlDHÍpDHÒx7 ¾˜DHÎ|DHÒˆDHÓŒB ¾œDHÕM ¾ DHÓ”DHÕ˜DHÙœX ¾¤DHÝ c ¾¨DHÙ¤DHݨDHá¬n ¾¬DHä°y ¾°DHÏ´DHÔ¸DHؼDHáÀDHÏÄDHéÈDHäÌDHæÐ„ ¾¸DHÏÔDHåØ ¾´DHéÜDHæàDHåäDHèèš ¾¼DHëìDHèðDHêô¥ ¾ÀDHëüDHì° ¾ÄDHíDHð$DHî(» ¾ÈDI,DI 0DHò4DHî8DHñ<Æ ¾ÌDHð@DIDDIHDHðLDHóPÑ ¾ÐDHñTDH÷XÜ ¾ÔDHó\DHù`ç ¾ØDH÷dDHûhò ¾ÜDHùlDHÿpý ¾àDHûtDIx ¾äDHÿ|DI€ ¾èDI„DIˆ ¾ìDIŒDIDI”DI˜DI œ) ¾ðDI ¤DI ÀDI Ä4 ¾ôDI ÈDI ÌDI ÐDIìDIð? ¾øDIôDIøDIüJ ¾üDIDIDIDI DI(DI,DI0U ¿DI4DI8` ¿ DI<DI#@DI!DDIHDILDIPk ¿DITDIXDI!\DI"hv ¿DI#tDI&DI$” ¿DI*˜DI$œDI' Œ ¿DI4¤DI&¨DI'¬DI&°DI*´DI+Ä— ¿DI,ÌDI+ÐDI/Ô¢ ¿$DI,ØDI1ä­ ¿(DI/èDI3ì¸ ¿,DI1ðDI-ôà ¿ DI3øDI.üDI-DI2DI-DI2 DI4DI7DI5 Î ¿0DI9$DI5(DI9,DI80Ù ¿4DI74DI88DI7<DI9@DI<LDI:Pä ¿8DI<TDI:XDI<\DIAxDI?|DI=€ï ¿<DIB„ú ¿DDICˆDI=ŒDI@ ¿@DIB”DI?˜DIAœDI@ DI?¤DIA¨DIC¬DIFÈDJmÌDIDÐ ¿HDJmØDJnàDJoèDIFüDIGDI{LDIHdDIKDII” ¿LDIL˜& ¿PDI[œDII DIN¤1 ¿TDIL¨DIP¬< ¿XDIY°DIN´DIR¸G ¿\DIP¼DIYÀDIRÄDIVÈDIZÌDIVÐDIZÔDI[ØDI`DI\DId DIaR ¿lDI~DI\DIkDIa DIi$DI`(DIk,DIj0DIe4] ¿pDI`8DIi<DIj@DIeDDIlHDImXDI~`DImhDI~lDI{xDI~DI}”DI~˜DI}œDI~ DI}¨DJǰh$HI÷@HJŽ@HK@HL¬@HM»@HNÊ@HOÙ@HPè@HQ÷@HR@HS@HT&@HU6@HVFÀ÷G@HfSÀø T@JÓb@JÔpÀø qàøüràøüs@HpÀùÄ€@JÓŽ@JÔœÀùÄàùÌžàùÌŸ@Hp«ÀùЬ@JÓº@JÔÈÀùÐÉàú$Êàú$Ë@H×ÀûØ@JÓæ@JÔôÀûõàûöàû÷@HÀû @JÓ@JÔ Àû !àû`"àû`#@Hˆ/Àûô0@JÓ>@JÔLÀûôMàûüNàûüO@Hˆ[Àü\@JÓj@JÔxÀüyàüTzàüT{@H‡Àü܈@JÓ–@JÔ¤ÀüÜ¥àüä¦àüä§@H³Àüè´@JÓÂ@JÔÐÀüèÑàý<Òàý<Ó@H›ßÀþà@JÓî@JÔüÀþýàþþàþÿ@H› Àþ @JÓ@JÔ(Àþ)àþh*àþh+@IF7ÀÌ8àÐ9@IFEÀØFàüGàÌH$¼NÌ.ÐD#/ÐD#7øD#9D#7D#8D#9D#`XD#:pD#;|DJm€D#;„DJmˆDJn”DJo D#;¨DJo¬D#;¸D#<ÐDJmÔD#<ØDJmÜDJnäDJoôD#<DJoD#<DJoD#< D#`@D#=`D#>€D#B„D#>ŒD#?˜D#@œD#? D#B¤D#CøDJmüDJn DJo D#C $DJo (D#C 4D#D @D#E `D#F dD#I hD#J ¨D#K ¬D#N °D#O èD#P D#Q @D#R |D#` °D#a ÐD#b D#c 0D#d `D#e  D#h °D#i àD#k I$#/Ð@#/“@#/¨@#0·@#1Æ@#2Õ@#3ä@#4ó@#5@#6ÀÐ@#;À€à„ @#;,Àˆ-à¨.@#;:À¬;à¸<@#<HÀÔIàØJ@#<VÀÜWàX@#<dÀeàf@#<rÀsà t@#C€Àüà $‚@#CŽÀ (à 4à 4‘$dN 4. @DG @D" dD"¿ lD"Å pD"¿ tD" |D"Å ˆD"Æ ÀD"Ë ðDJm ôD"Ë øDJm üDJn DJo D"Ë DJo D"Ë (D"ñ LD"Ì pD# ¼D"Í àD"ÎD"ÏPD"РD"ÑàD"×äD"ÑìD"ÒüD"ÓD"ÔD"Ò D"×D"ØPD"Ù€D"Ú°D"ßàD"á4D"â<D"ãDD"æ€D"é°D"êÌD"ëÜD"ïàD"ñäD"ëèD"ìðD"íôD"îD"ïD"ðD"ñD"ò$D"ô(D"õ<D"öpD"÷ D"ùÐD"üüD"ê D"ôDD#hD#€D#°D#àD#D# $D# PD# €D# °DGÜ’$G @Ì@GÕ@Gß@"·ð@"¹@"½@"¾#À d$@"Ë0À ô1à ø2@"Ë>À ü?à @@"ËLÀ Mà (NàÜO$ÄNP«Ì.D"@D"N(D"@0D"A4D"@8D"N@D"ATD"FXD"G\D"H`D"NdD"OtD"PxD"T|D"O€D"PˆD"T”D"aÐD"TÔD"aØD"TÜD"aàD"UðD"VD"WD"X D"Y8D"ZtD"[°D"Z´D"[¸D"\ÌD"{üD"|D"\D"|D"a D"bPD"aTD"b\D"cD"b”D"cœD"fÐD"cÔD"fØD"cÜD"fàD"gèD"hD"iD"jTD"kŒD"mD"k”D"l¤D"m¬D"nÔD"oD"pD"q<D"}`D"|dD"}hD"~pD"„xD"|DJm„D"„ˆD"ŒDJmD"”DJm˜D"œDJm DJn¤D"…°D"†ÈD"‡ôD"ˆD"‰D"Š0D"Ž4D"8D"Š<D"‹HD"ŒTD"`D"ŽlD"pD"tD"‘„D"’°D"|ðD"œôD"D"ŸD"ž$D"Ÿ0DJo€D"„ˆDJoŒD"„˜D"…¤D"ÌD" ôD"¡$D" (D"¡,D" 4D"¡8D"¢<D"£pD"¨ D"©àD"ª D"«`D"¬D"­ÀD"°ÐD"±D"}4D"~DD"@TD"³pf$"@ž@"@²@"@Ä@"@Ö€"A8è@"Cù@"E€"F<€"G@$€"HD2@"JA@"KP&"M«Ìh€†À‡@"„“À„”àˆ•@"„¡À¢à”£@"„¯À˜°àœ±@"„½À ¾à°¿@"„ËÀ€ÌàˆÍ@"„ÙÀŒÚà˜Ûà”Ü$ „N”. DÌ DÒÈDÔÔDÒØDÓàDÔìDÕ0DÖ<DJm@DÖDDJmHDJnTDJo\DÖpD× DïäDØDÙDÝDÙ DÚ,DÛ0DÚ4DÝ8DÞlDߘDàÄDá Dï <Dð `Dñ  Dò ÐDõ àDö!Dø!<Ý$Ì @Ì)@Ì>@ÍM@Î\@Ïk@Ðz@щÀ Š@Ö–À@—àD˜@Ö¤ÀH¥àp¦à!\§$¼N!\.!`D1!`D7!„D6!ˆDJm!”D7!˜DJm!œDJn!¨DJo!°D7!ÄD8!ðDM",D9"PD;"TD9"\D:"dD;"hD<"xD="°D>"àD?# D@#`DA#dDD#hDE#°DM#äDN$DO$0DP$`DS$pDU$œ¨$1!`á@1õ@2@3@4"@51À!`2@7>À!”?à!˜@@7LÀ!œMà!ÄNà$ÀO$`N$À.$ÀD$ÀD$äD$èDJm$ôD$øDJm$üDJn%DJo%D%$D%PD&%„D% D%¤D%¬D%´D%¸D%ÄD%ðD& D(&XD&pD&&¤D'&ÀD(&ôD)'D,' D.'LP$$ÀŠ@ž@®€¿@Î@Ý@ì@üÀ$Àý@ À$ô à$ø @À$üà%$à'l$¬N'l«Ô.'pD'pD'€D'ˆD'œD' D'¨D'¬D'¸D'¼D'ÌD'ÐD'ÔD'ÜD'äD'ðD'üD(D$(@D (DD$(HD (PD$(TD%(XDD(”DU(ÐDV) DW)<Dv)hDw) D‡)ÐDŒ*D*TD&* D£+D'+ D)+$D'+,D(+8D)+@D*+ D++ÐD,,D-,dD7, D8,ðD=- D>-$D?-pD@-ˆD£-ÌDA-àDB. DD.$DE.<DF.pDG. DH.´DJ.àDL.ìDP.ôDS/DT/$DU/`DV/|DW/˜DX/°DY/´D^/¸DZ/ÀD^/ÈD_/ðD`0Da0HDf0tDg0ˆDf0ŒDg0”Dh0˜Di0´Dj0ÔDk0èDl0øDm1$Do1`Dr1lDJm1pDr1tDJm1xDJn1„Ds1ŒDt1ÐDu1üDv2Dw2,Dx2@D~2HDx2LDy2XDz2\D{2dDy2hD~2lD2xD€2¤D2ÔD†3D‡3Dˆ3,DŒ30Dˆ34D‰3<DŠ3@D‹3LDŒ3PD3dD3hD3|D‘3¨D’3ÔD>40Dœ4@D?4XDG4tDS4¬Dh4ÜDi5 Dj5@DJo5€Dr5ˆDJo5Dr5œDu5ÀD~5ìD†6D£6HD¤6`D¥6D¦6ÀD§7D¨7@D«7PD¬7€D­7°D®7àD¯8D°8@D²8p1$'pp@„@–@¨€8º@Ë@ä@ø@ @@ 3@ B@ Q@ `@ o@~€<Œ@›@ª&«Ô€àÀ'pá@ríÀ1pîà1tï@rûÀ1xüà1Œý@r À5€ à5ˆ @rÀ5à5œà8˜$(N8˜.8 D°8 Dµ8ÈD·8ÔDJm8ØD¶8ÜD·8èDJm8ìDJn8øDJo9D·9D¸9@DÉ9xD¹9Dº9ÀD»:D¿:D»: D¼:D½:D¾:$D¿:(DÀ:4DÁ:`DÉ:”DÊ:°DÌ:àDÏ:ðDÐ; DÒ;L$°8 W@°k@°|@±‹@²š@³©@´¸À8 ¹@·ÅÀ8ØÆà8ÜÇ@·ÓÀ8ìÔà9Õà;lÖ$ÌN;l׫Ü.;pD)‘;pD)˜;xD)‘;|D)³;ŒD)¸;D)¹;”D)­;˜D)¸;œD)®; D)¯;¤D)¹;¨D)°;¬D)±;°D)²;´D)´;¸D)­;¼D)®;ÀD)µ;ÄD)¶;ÈD)±;ÌD)¯;ÐD)·;ÔD)º;ØD)°;ÜD)²;àD)µ;äD)¶;èD)·;ìD)º;ðD)´;ôD)ª;øD)£;üD)§<D)©<D)³<D)‘< D)¾<D)‘<D)¸<D)¹<D)±< D)µ<$D)¶<(D)³<,D)·<0D)º<4D)­<8D)®<<D)¯<@D)°D)È>D)É>(D)Ê>8D)Ë>HD)Ì>XD)Í>hD)Î>xD)Ï>ˆD)Ð>˜D)Ñ>¨D)Ø>¬D)Ñ>°D)Ò>¼D)Ó>ÌD)Ô>ÜD)Õ>ìD)Ö>üD)Ø? D)Þ?D)Ø?D)Þ?D)ø?`D)ß?pD)à? D)ä?¤D)á?¨D)ä?¬D)á?°D)ä?´D)å?ÈD)æ?äD)ç?øD)è@ D)ì@D)è@D)é@ D)ê@,D)ë@8D)ì@<D)í@tD)î@xD)ð@„D)ñ@ˆD)ò@ÌD)óAD)ôA4D)øApD)ùA D)øA¤D)ùA¬D)úAàD)ùAäD)úAìD)ûB D)úB$D)ûB,D)ÿB`D*BlD*BÀD*BôD*BøD*BüD*C4D* CtD* C°D* CàD*CäDJmCèD*CìDJmCðDJnCüDJoDD*D D*DpD*DŒD*DÄD*DÈD*DÌD*DÜD*DèD*DìD*DüD*ED*ED*E$D*EpD*E¤D*E¨D*E¬D*EäD*F D*!F$D*"FpD*#F D*$F¤D*'F¨D*$F¬D*#F°D*'F´D*(FÀD*)FðD*,FôD*)FøD*,FüD*-GD*1G@D*.GTD*1GXD*2G\D*.G`D*1GdD*2GhD*5GlD*6G°D*;GàD*7GäD*8GèD*;GìD*7GðD*;GôD*<GüD*;HD*<HD*=HD*>H D*?HTD*@HˆD*AH¸D*KH¼D*LID*OI D*LI$D*OI(D*PIdD*SIlD*TI¤D*UIÀD*VJD*WJ0D*[J4D*XJ8D*WJ<D*[J@D*\JLD*]J|D*`J€D*cJ„D*]JˆD*cJŒD*dJÀD*eJÄD*iJÐD*nJÔD*oJèD*nJìD*oJðD*pJôD*qKD*rK0D*xK8D*yKPD*xKTD*yKXD*zK\D*}KhD*~K|D*}K€D*~K„D*KˆD*ƒK”D*„KìD*‰KôD*ŠLD*‰L D*ŠLD*LD*ŽL D*’LPD*L`D*“LdD*LhD*’LlD*“LpD*”LtD*•LˆD*—LœD*–L¤D*—L°D*˜LìD*™MD*˜M D*™M$D*˜M,D*™M0D*šM4D*›MdD*šMhD*›MlD*¡M D*¥M¬D*¦MàD*§ND*­ND*®N€D*¯N˜D*®NœD*¯N D*²N¤D*³N¸D*²N¼D*³NÀD*´NÄDJmNÈDJnNÔDJoNàD*´NôD*µOD*¶O$D*·OTD*¶OXD*·O\D*¸OlD*¹O|D*ºOˆD*»O˜D*¼O¤D*½OÜD*¾PD*¿PDD*ÀPtD*ÇPxD*ÈP”D*ÉP¨D*ÊP¸D*ËPÄD*ÌQD*ÍQ8D*ÌQ<D*ÍQ@D*ÎQpD*ÑQ D*ÎQ¨D*ÑQ¬D*ÒQÄD*ÓQôD*ÔR$D*×RhD*ØRÈD*ÙRàD*ØRäD*ÙRèD*âRìD*ßRôD*ÜRøD*âSD*ãS D*âSD*ãSD*æSD*çS<D*èStD*éS¨D*èS¬D*éS°D*ìSÜD*éSäD*ìSèD*íTD*îTD*òTD*îTD*ïT(D*ðT4D*ñTDD*òTPD*óT|D*ôT¬D*õTàD*øU D*ùU0D*øU4D*ùU8D*üU<D*ýUXD*þUŒD*ÿUÄD+UðD+V D+V D+V0D+V<D+VLD+VXD+ V”D+ VÈD+ VüD+W<D+WLD+WPD+WTD+W`D+WœD+WÈD+WäD+WøD+XD+X$D+ X`D+!X”D+ X˜D+!XœD+"XÌD+#YD+$Y0D++Y8D+,YTD+-YˆD+.Y¼D+-YÀD+.YÄD+1YðD+.YøD+1YüD+2Z0D+3ZHD+4ZXD+5ZpD+6ZˆD+7Z¸D+6ZÀD+7ZÄD+6ZÈD+7ZÌD+8ZðD+9[$D+:[TD+;[ˆD+@[¼D+A[ÐD+@[ÔD+A[ØD+D[ÜD+E\D+F\0D+H\4D+F\8D+G\DD+H\PD+I\xD+J\¬D+I\°D+J\´D+K\àD+N]D+K]D+N]D+O]0D+W]dD+X]ÄD+Y]ÜD+X]àD+Y]äD+\]èD+]]üD+\^D+]^D+`^D+a^LD+f^xD+g^”D+h^¨D+i^¸D+j^ÔD+k_$D+l_XD+k_\D+l_`D+m_D+n_ÄD+o_ôD+v_üD+|`D+y`D+v` D+|`D+}`$D+~`XD+`ŒD+~`D+`”D+‚`ÀD+`ÈD+‚`ÌD+ƒaD+„aD+…a(D+†a@D+‡aXD+ˆaˆD+‡aD+ˆa”D+‡a˜D+ˆaœD+‰aÀD+ŠaôD+‰aøD+ŠaüD+‹b(D+Œb\D+’bŒD+Œb”D+b˜D+ŒbœD+’b D+“b¬D+’b°D+“b´D+–b¸D+—bôD+˜c D+šcD+˜cD+™c D+šc,D+›chD+œcœD+›c D+œc¤D+cÐD+ dD+dD+ d D+¡d D+¢dhD+£dœD+©dØD+ªe8D+«eDD+ªeHD+«eLD+¬e`D+­e€D+®eÄD+°eÌD+±fD+²fDD+±fHD+²fLD+±fTD+²fXD+³f\D+´fŒD+³f”D+´f˜D+¼fÐD+½gD+¾gPD+¿gD+ÀgÐD+ÂgäD+ÃgðD+Äh0D+Åh`D+ÆhD+ÇhÀD+ÈhðD+Éi D+ÊiPD+Ëi€D+Ìi°D+ÍiàD+ÎjD+Ïj@D+ÐjpD+Ñj D+ÒjÐD+ÓkD+Ôk0D+Õk`D+ÖkD+×kÀD+ØkðD+Ùl0D+Ûl€í$)‘;p @)‘ 4 )‘, F )‘0 X€)’Ì o€)“| ‚€)”€ ˜€)•„ ¯€)–ˆ Æ€)—Œ á€)˜ ö€)™”! €)š˜!€)›œ!4€)œ !P€)¤!k€)ž¨!‹€)Ÿ¬!©€) °!À)¡´!Û€)¢¸!ö€)£¼" @)¤"#€)¥Ü"7@)¦"F€)§À"T@)¨"c€)©Ä"q€)ªÈ"€)«x"&)¬«Ü"¥€"ÄÀ;p"Å@*"ÑÀCè"Ò@Jl"àÀCè"áàCì"âàCì"ã@*"ïÀCð"ð@Jl"þÀCð"ÿàD #àD #@*´# ÀNÈ#@Jl#ÀNÈ#àNô#àNô#àl˜# $1(Nl˜#! ºx.l D/Þl D/ål¸D/ÞlÀD/ålÄD/ÞlÈD/ålÐD/élìD/ælðD/êlôD/æløD/êmD/ëmD/ìmD/îmD/ìmD/îm,D/ím4D/îm<D0 mtD/ïmD/ðmÀD/ñmÐD/ònD/ön0D/÷n8DJmn<D/÷n@DJmnDDJnnPDJonXD/÷nlD/ønD/ùn¨D/únàD/ûo D/ýo$D/ûo,D/üo<D/ýoDD/þotD/ÿo D0oÌD0pD0pD0pD0p D0 p$D0 p<D0ppD0p€D0p°#7$/Þl #t@/Þ#ˆ@/Þ#š@/Þ#¬@/ß#»@/á#Ê@/â#Ù@/ã#è& /äºx$€$Àl $@/÷$+Àn<$,àn@$-@/÷$9ÀnD$:ànl$;àpÐ$<$0NpÐ$=¬$.pÐD2,pÐD23pèD2,pðD2-pôD2,pøD23qD2-qD23qD24q(D25q,DJmq0D24q4D26q<D25q@D26qLDJmqPDJnq\DJoqdD26qxD27q D2FqØD28qðD29r D2:r`D2>rdD2:rlD2;rtD2<rxD2=rˆD2>rD2?rœD2@rÐD2AsD2Cs0D2FsLD2GspD2Is D2Ls°D2MsàD2Ot$S$2,pÐ$“@2,$§@2,$¹@2,$Ë€2-8$æ@2.$õ@2/%@20%@21%"&22¬$%:€%XÀpÐ%Y@26%eÀq0%fàq4%g@26%sÀqP%tàqx%uàt0%v$`Nt0%w¬,.t0D7;t0D7Mt<D7;t@D7MtDD7;tHD7MtPD7=tTD7;tXD7MtdD7LthD7MtlD7LtpD7;ttD7Mt|D7=t„D7LtˆD7MtŒD7Nt D7OtÄD7PuD7Qu@D7TupD7UutD7VuxD7]u|D7Vu€D7Tu„D7UuŒD7Zu˜D7]uœD7Zu D7]u¨D7^vD8£vHD7_v`D7`vD7cvÀD7dw D7iwPD7jwÀD7kx D7lxD7oxD7lx$D7mx4D7ox<D7px„D7qx°D7wxÜD7yy4D7zy<D7{yDD7~y€DJ‹yˆDJŒyDJy°D7yØDJ‘yðD7~zD7çz`D7zxD7„zD7€z˜D7„zœD7…z¬D7†{D7‡{`D7ˆ{D7‰{ÀD7Š{ÔD7‹|D7|0D7‘|4D7|8D7‘|<D7’|@D7“|\D7”|pD7•|€D7–|ÐD7—}D7˜}D7Ÿ}D7˜} D7™}0D7š}4D7›}8D7™}<D7Ÿ}@D7 }TD7¡}€D7¢}D7¤}”D7¥}ðD7¦~ D7ª~PD7«~TD7ª~XD7«~\D7¬~`D7­~|D7®~D7¯~¤D7°~´D7±D7²D7¹D7² D7³D7´ D7µ$D7³(D7¹,D7ºDD7»pD7¼„D7¾ˆD7¿œD7ÀÐD7Å€D7Æ€D7Ç€0D7È€DD7É€XD7Ê€hD7Ò€lD7Ë€tD7Ì€„D7Í€ˆD7΀ŒD7Ì€D7Ò€”D7Ó€ðD7Ô D7Õ4D7×8D7ØLD7Ù€D7Ú°D7ÞàD7„‚ D7‰‚PD7’‚ˆD7Ÿ‚ÌD7¡ƒD7¬ƒ4D7­ƒlD7¹ƒ¬D7»ƒÔD7¾ƒøD7Å„0D7Æ„tD7É„´D7Ô„ôD7×…,D7ç…`D7è…xD7é…¨D7ê…ØD7ë† D7ì†<D7í†pD7î†|D7톀D7D7ò†ŒD7ø†¬D7ò†°D7ø†ÌD7ó†ÔD7ô†äD7õ‡D7ÿ‡<D7ù‡HD7ú‡€D7û‡¸D8¤‡ðD8‡øD8‡üD8ˆD8ˆD8ˆ D8ˆ$D8ˆ(D8ˆ,D8ˆ0D8ˆ4D8ˆ8D8ˆ<D8ˆLD8 ˆ`D8 ˆ|D8ˆàD8ˆðD8‰D8‰(DJm‰,D8‰0DJm‰4DJn‰@DJo‰PD8‰\DJo‰dD8‰hDJo‰lD8‰tD8‰ D8‰àD8Š D8ŠdD8ŠhD8ŠpD8Š€D8ŠˆD8ŠÄD8ŠðD8‹D8‹,D8‹XD8"‹ D8#‹øD8(Œ(D8)ŒˆD8.Œ´D8/D80@D81DD84HD81PD82`D84hD85¸D86äD8<ŽD8=Ž4D8>Ž|D8YŽÄD8?ŽÜD8@D8ADD8BpD8C¸D8DD8E4D8FD8G¼D8HèD8IüD8M‘D8J‘D8K‘D8M‘D8N‘PD8O‘|D8P‘¨D8[‘àD8\‘èD8Y‘ôD8Z’ D8H’@D8[’dD8\’ D8]’ÌD8^’üD8_“,D8`“8D8_“<D8`“@D8d“HD8j“dD8d“hD8j“„D8e“ŒD8f“œD8g“ÈD8q“ôD8k”D8l”8D8m”pD8w”ÀD8s”ÄD8w”ÐD8s”ìD8u”ðD8t”ôD8w”øD8t”üD8w•D8u•D8v•D8~•DJm•D8~•DJm•DJn•(DJo•4D8~•<DJo•HD8~•LDJo•TD8~•\D8•tD8€•°D8•ÜD8‚•ðD8„•ôD8‚•üD8ƒ– D8„–D8…–HD8†–tD8‡– D8Š–ÌD8‹— D8Œ—$D8—PD8Ž— D8“—ÐDJm—ÔDJn—àDJo—ìD8“—ôDJo˜D8“˜DJo˜ D8“˜D8”˜<D8•˜|D8–˜¨D8—˜¼D8™˜ÀD8—˜ÈD8˜˜ØD8™˜àD8š™D8›™@D8œ™lD8 ™˜D8£™´D8¤™ìD8¥šDD8¦špD8§š D8¨šÐD8©›D8¬› D8­›`D8®›D8¯›ÀD8°›ðD8±œ D8²œPD8³œ€D8´œ°D8µœðD8£8D8YXD8¥€D8·%$7;t0%Â@7;%Ö 7;¼%è 7;À%ú€7<L&€7=8&)@7>&=@7?&S@7@&h@7A&{@7B&‘@7C& @7D&¯@7E&¾@7F&Í@7G&Ü€7H<&ê@7I&ù@7J'&7K¬,' €'>Àt0'?@7~'MÀyˆ'NàyØ'O@7~']Àyð'^àz'_@7á'p€7â@'…€7âH'›€7âD'®@7ã'ÆÀz`'Çàzx'È@7á'Ù€7â@'î€7âH(€7âD(@7ã(/À…`(0à‡ð(1@7á(B€7â@(W€7âH(m€7âD(€@7ã(˜À‡ø(™àˆ`(š@8(¦À‰,(§à‰0(¨@8(´À‰4(µà‰\(¶@8(ÂÀ‰d(Ãà‰h(Ä@8(ÐÀ‰l(Ñà‰t(Ò@8S(ã€8TD(ø€8TH)€8T@)!@8U)9ÀŽÄ):àŽÜ);@8S)L€8TD)a€8TH)w€8T@)Š@8U)¢À‘à)£à’@)¤@8S)µ€8TD)Ê€8TH)à€8T@)ó@8U* À’d* à•* @8~*À•*à•*@8~*'À•*(à•<*)@8~*5À•H*6à•L*7@8~*CÀ•T*Dà•\*E@8“*QÀ—Ô*Rà—ô*S@8“*_À˜*`à˜*a@8“*mÀ˜ *nà˜*o@8S*€€8TD*•€8TH*«€8T@*¾@8U*ÖÀX*×à€*Øà¸*Ù$)ˆN¸*Ú º|.ÀD8»ÀD8ÁØD8»àD8ÁäD8»èD8ÁðD8ž D8ÞDJmžD8žD8Þ DJmž$DJnž0DJož8D8ÞLD8ÄžpD8Óž¨D8ÅžÀD8ÆžðD8ÇŸ0D8ËŸ4D8ÇŸ<D8ÈŸHD8ÉŸPD8ÊŸ`D8ËŸhD8ÌŸtD8ÍŸ D8ΟÐD8РD8Ó D8Ô @D8Ö pD8Ù €D8Û °*ð$8»À+(@8»+<@8»+N@8»+`@8¼+o@8½+~@8¾+@8¿+œ& 8Àº|+´€+ÒÀÀ+Ó@8Ã+ßÀž+ààž+á@8Ã+íÀž$+îàžL+ïà Ð+ð$N Ð+ñ º€. ÐD8ß ÐD8ê ÜD8ß àD8ê äD8ß èD8ê ðD8à ôD8ß øD8ê¡D8ß¡ D8ê¡D8ç¡D8à¡ D8å¡$D8æ¡(D8ê¡,D8ë¡@D8ì¡`D8í¡˜D8î¡ÐD8ñ¢D8ó¢D8ñ¢ D8ó¢D8ö¢ D8÷¢0D8ö¢4D8÷¢8D8ø¢<D8ù¢`D8û¢tD8ú¢|D8û¢ˆD8ü¢àD8ý£D8ü£D8ý£ D8þ£$D8ÿ£dD9£D9 £´D9£¸D9 £ÈD9£ÌD9 £ØD9 ¤D9 ¤ D9 ¤D9¤HDJm¤LD9 ¤PD9¤TDJm¤XD9 ¤\DJm¤`DJn¤hDJo¤tD9¤ˆD9¤´D9¤¼D9¤ÀD9¤ÄD9¤ðD9¤ôD9¤øD9¥D9¥ D9¥LD9¥€D9¥´D9¥ðD9¥ôD9¥øD9¥üD9!¦D9"¦PD9'¦€D9$¦„D9#¦ˆD9$¦ŒD9'¦D9)¦àD9*¦èD9)¦ìD9*¦ðD9+¦ôD9.§0D9/§`D91§dD90§hD91§lD90§pD91§tD92§ˆD93§ D94§¸D95§ôD96¨0D95¨8D96¨<D97¨LD98¨€D99¨°D9:¨´D9<¨¼D9?¨ðD9<¨ôD9?¨øD9@©$D9A©hD9B©lD9A©pD9B©|D9C©¨D9B©¬D9C©´D9D©¼DJm©ÀD9D©ÄDJm©ÈDJn©ÔDJo©àD9D©ôD9EªD9Fª$D9GªPD9HªdD9IªxD9Jª„D9Kª¸D9LªìD9M«D9L«(D9M«,D9N«0D9O«`D9N«hD9O«lD9V«D9W«¬D9X«ÀD9Y¬D9Z¬4D9[¬hD9`¬°D9b¬´D9`¬¸D9b¬¼D92¬ÐD96¬øD9c­ D9e­0D9f­pD9g­°D9h­ðD9i® D9l®0D9m®pD9n® D9o®ÐD9p¯D9q¯@D9s¯,$8ß Ð,7@8ß,K 8߬,] 8ß°,o€8à8,„@8á,š@8â,¬@8ã,»€8ä<,É€8å@,×€8æD,å€8çH,ó@8è-& 8麀-€-8À Ð-9@9-EÀ¤L-F@Jl-TÀ¤L-Uà¤P-Và¤P-W@9-cÀ¤X-d@Jl-rÀ¤X-sà¤\-tà¤\-u@9-À¤`-‚@Jl-À¤`-‘ई-’ई-“@9D-ŸÀ©À- à©Ä-¡@9D-­À©È-®à©ô-¯à¯°-°$àN¯°-±¬4.¯°D9w¯°D9‚¯ÈD9w¯ÐD9‚¯ÔD9w¯ØD9‚¯àD9ƒ°D9„° D9‡°D9„°D9ƒ°D9„° D9‡°$D9„°(D9‡°0D9ˆ°pD9ª°°D9‰°ÐD9бD9Œ±D9±`D9ޱD9±ÀD9”±ðDJm±ôD9”±øDJm±üDJn²DJo²D9”²$D9•²HD9–²ŒD9—²¸D9˜²øD9™³,D9š³dD9 ³hD9š³pD9³xD9œ³|D9›³€D9 ³„D9¡³´D9¢³àD9ª´D9«´0D9¬´xD9­´°D9®´àD9±´ðD9²µ D9´µP-Ç$9w¯°-ý@9w.@9w.#@9w.5€9x8.H€9y<.]€9z@.q@9{.„@9|.“@9}.¢@9~.±@9.À@9€.Ï&9¬4.ç€/À¯°/@9”/À±ô/à±ø/@9”/ À±ü/!à²$/"àµx/#$ÈNµx.µ€DD”µ€DD•µ”DD”µ˜DD•µ¬D0µ°DJmµ¼D0µÀD0!µÌD0µÐD0!µÜDJmµàDJnµìDJoµôD0!¶D0"¶0D0#¶pD0$¶ D0%¶ðD0&· D0'·,D0(·DD0)·\D0*·D0+·œD0,·ÔD0-¸D0.¸$D00¸PD05¸`D06¸|D07¸°D08¸´D09¸àD0:¹$D0;¹,D0<¹DD0=¹\D0>¹tD0?¹„D0@¹°D0A¹ÜD0B¹èD0CºD0DºD0EºTD0FºdD0GºD0JºÈD0L»D0M»D0N»@D0Y»PD0f»„D0Z»D0\»”D0Z»˜D0\»¨D0[»°D0\»¸D0]»ÈD0^¼D0_¼D0`¼@D0e¼dD0L¼hD0e¼ˆD0f¼ D0g¼ÐD0h½D0j½D0k½ D0l½PD0m½€DD™½°DD½à/$$D”µ€/\@D”/e@D”/n@D”/w@0/†@0/•@0/¤€08/²@0/ÁÀµ°/Â@0!/ÎÀµ¼/ÏàµÀ/Ð@0!/ÜÀµà/Ýà¶/Þ཰/ß$€N¾.¾D(¾D(¾D(¾ D(“¾$D(¾(D(˜¾,D(“¾0D(‘¾8D(’¾<D(”¾@D(˜¾LD(°¾ˆD(š¾ D(™¾¤D(š¾¨D(›¾ÐD(š¾ÔD(›¾ØD(œ¾ÜD(¾øD(ž¿D(Ÿ¿(D( ¿4D(¥¿8D(¡¿<D(¢¿HD(£¿TD(¤¿XD(¥¿\D(¦¿˜D(§¿ÈD(¦¿ÌD(¨¿ÐD(°¿ØD(±ÀD(°ÀD(±ÀD(²ÀDD(±ÀHD(²ÀPD(µÀ„DJmÀˆD(²ÀŒD(µÀDJmÀ”D(²À˜DJmÀœDJnÀ¤DJoÀ°D(µÀÄD(¶ÀÐD(·ÀØD(¶ÀÜD(·ÀàD(¸Á D(·ÁD(¸ÁD(¹ÁD(ºÁ$D(»ÁXD(¼ÁŒD(½ÁÀD(Ä D(Å D(ÇÂ4D(ÆÂ<D(ÇÂHD(È€D(ɰD(È´D(ɸD(ÈÂÀD(ÉÂÄD(ÊÂÈD(ËÃD(ÐÃ0D(ÑÃpD(ÒðD(ÓÃðD(ÖÄD(×Ä0D(ÙÄ\/à$(¾0@(03@(0D@(Ž0S€(80a@(0p€(‘<0~€(’@0ŒÀ¾0@(µ0™ÀÀˆ0š@Jl0¨ÀÀˆ0©àÀŒ0ªàÀŒ0«@(µ0·ÀÀ”0¸@Jl0ÆÀÀ”0ÇàÀ˜0ÈàÀ˜0É@(µ0ÕÀÀœ0Ö@Jl0äÀÀœ0åàÀÄ0æàÀÄ0çàÄt0è$tNÄt.Ä€D ÇÄ€D ÕĤDJmĨD ÏĬD ÒİD ÏÄ´D ÒĸD ÏļD ÒÄÀD ÕÄÄDJmÄÈDJnÄÔDJoÄÜD ÕÄðD ÖÅ D!9ÅlD ×ÅD ØÅÐD ÙÆD ÚÆ@D âÆDD ÛÆLD ÜÆ\D ÝÆ`D ÞÆdD ÜÆhD âÆlD ãưD äÆàD åÇD æÇPDJWÇ€DJXÇ”DJRÇ D çǼD èÇÔD éÈD êÈDDJWÈHDJXÈXDJRÈdD ëȈD ìÈÀD íÉ D îÉ8DJ`É<DJaÉLDJRÉtDJeÉD ïÉœD ðÉÈD óÉàD ôÉäD õÉðD öÉôD ùÊD üÊDJmÊDJnÊ DJoÊ,D üÊ@D ýÊLD þÊ„D ÿÊ D!ÊÜD!ËD! ËD!Ë D!Ë0D!Ë4D!Ë8D!Ë<D! Ë@D! ËxD! ˤD! ËÐD! ÌDJWÌDD!ÌXD!̬D!ÌØDJWÌÜDJXÌðDJRÌüD!ÍD!Í@D!ÍxD!ͤDJ`ͨDJa͸DJRÍàDJeÍüD!ÎD!Î8D!$ÎPD!ÎhD!΀D!$ΤD!%ÎÐD!&ÏD!'ÏTD!(Ï”D!0ϘD!)ÏœD!*ϬD!+ϰD!,Ï´D!*ϸD!0ϼD!1ÏôD!9Ð(D!:Ð@D!;ЀD!<аD!=ÐàD!>ÑD!AÑ D ðÑPD!ÑhD!CÑ€0é$ ÇÄ€1*@ Ç1>@ È1M@ É1\@ Ê1k@ Ë1z@ Ì1‰@ Í1˜ÀÄ€1™@ Õ1¥ÀĨ1¦àĬ1§@ Õ1³ÀÄÈ1´àÄð1µ@J_ 1ÁÀÉ<1ÂàÉœ1Ã@ ü1ÏÀÊ1ÐàÊ@1Ñ@J_ 1ÝÀͨ1ÞàÎ1ßàѨ1à$ (NѨ1á¬D.ѰDFæѰDFèÑÈDFæÑÌDFèÑÜDFéÑìDFìÑôDFëÑøD!WÑüD!UÒDFìÒDFëÒD!WÒ D!HÒD!WÒDFëÒ,DFìÒ0D!VÒ4D!WÒ8D!HÒ<D!WÒ@DFìÒDD!UÒHD!VÒLDFìÒPD!UÒTD!VÒXDFìÒ\D!WÒ`D!XÒlD![ÒpD!ZÒtD!XÒxD!YÒ€D![ÒD!ZÒ”D![Ò˜DI‹ÒœD!ZÒ DI‹Ò¨DIŒÒ¬DIÒÐD!^ÒðD!_ÒüDI‘ÓD![ÓDD!_ÓhD!`Ó€D!cÓˆD!dÓ D!eÓÐD!hÓÔD!eÓØD!hÓàD!lÓäD!mÓðDJmÓôD!mÓøDJmÓüDJnÔDJoÔD!mÔ$D!¥ÔHD!nÔD!·ÔàD!oÔøD!pÕ8D!qÕxD!rÕ°D!zÕ´D!sÕ¼D!tÕÌD!uÕÐD!vÕÔD!tÕØD!zÕÜD!{ÖD!|ÖHD!}ÖtD!~Ö¼DJWÖèDJXÖüDJR×D!×$D!€×LD!׌DJW׸D!‚×¼DJW×ÀDJX×ÌDJRרD!ƒ×ôD!„ØD!…Ø\DJ`؈D!†ØŒDJ`ØDJaØœDJRØÄDJeØàD!‡ØìD!¢Ù D!ˆÙDD!ŽÙ`D!‘ÙhD!”ÙpD!—ÙxD!˜Ù D!™Ù¬D!˜Ù°D!™Ù´D!œÙ¼D!ÙÐD!¶ÙôD!ÙøD!¶ÙüD!ÚD!žÚ D!ŸÚ@D! Ú`D!¢ÚdD!£ÚxD!¤Ú°D!¥ÚàD!¦ÚðD!§Û D!¨Û$D!¬ÛTD!—ÛpD!·Û„D!¸ÛœD!¹ÛÌD!ºÜD!»Ü0D!¼Ü`D!¾Ü€D!¿Ü„D!ÀܰD!ÁÜàDFíÝDFîÝD!ˆÝXDFñÝp1÷$FæѰ2)@Fæ24@Fæ2=@Fæ2F@Fè2OÀѰ2P€!G82c€!H<2~€!I@2“€!JD2§@!K2¸@!L2Ì@!M2Û@!O2ê@!P2ù@!Q3@!R3@!S3&ÀÑü3'àÒ3(€!G83;€!H<3V€!I@3k€!JD3@!K3@!L3¤@!M3³@!O3Â@!P3Ñ@!Q3à@!R3ï@!S3þÀÒ 3ÿàÒ,4€!G84€!H<4.€!I@4C€!JD4W@!K4h@!L4|@!M4‹@!O4š@!P4©@!Q4¸@!R4Ç@!S4ÖÀÒ44×àÒD4Ø€!G84ë€!H<5€!I@5€!JD5/@!K5@@!L5T@!M5c@!O5r@!P5@!Q5@!R5Ÿ@!S5®ÀÒH5¯àÒP5°€!G85À!H<5Þ€!I@5ó€!JD6@!K6@!L6,@!M6;@!O6J@!P6Y@!Q6h@!R6w@!S6†ÀÒT6‡àÒ\6ˆ€!G86›€!H<6¶€!I@6Ë€!JD6ß@!K6ð@!L7@!M7@!O7"@!P71@!Q7@@!R7O@!S7^ÀÒ`7_@![7mÀÒœ7nàÒ 7o@![7}ÀÒ¨7~àÒð7@![7ÀÓ7ŽàÓD7@!m7›ÀÓô7œàÓø7@!m7©ÀÓü7ªàÔ$7«@J_ 7·À؈7¸àØŒ7¹@J_ 7ÅÀØ7ÆàØì7ÇàÝ7È€!G87Û€!H<7ö€!I@8 €!JD8@!K80@!L8D@!M8S@!O8b@!P8q@!Q8€@!R8@!S8žÀÝX8ŸàÝp8 àݘ8¡$ èNݘ8¢¬X.Ý DæÝ D÷ݬDæݰD÷Ý´DæݸD÷ÝÀDèÝÄDæÝÈD÷ÝÔDöÝØD÷ÝÜDöÝàDæÝäD÷ÝìDèÝôDöÝøD÷ÝüDøÞDùÞ4DúÞpDûÞ°DþÞàDÿÞäDÞèDÞìDÞôDþÞøDÿßDß DßDßDßD9ßPD/ßdD?ßDJoßÜD@ßôDJoà D@àDLà@DOàtDVà°DYàäD á Dhá„D á D áÐD áèD â0Dâ˜DâÄDâðDãDãHDãˆDã´Dã¸DãÀDãÈDãÌDä0Dä\DäˆD"ä´D#äèD(åD*åhD+åpD,å|D/åÀD0åÐDJWåüDJXæDJRæD1æ<D2æhDJWæ”DJXæ¨DJRæ´D5æÔD6çDJWç0DJXçDDJRçPD9çpD:ç°DJ`çÜDJaçìDJRèDJeè0D=è<D>èŒD?è¤D@èÀDJmèÄD@èÈDJmèÌDJnèØDAèäDBèüDCé(DDé<DLé@DDéHDEéPDFéTDGé`DHédDIépDJétDKé€DLé„DMé”DNéÀDOéìDPêDVêDPêDQêDRêDTê DSê$DVê(DWê8DYê<DZêPD[ê|D\ê¨D^êØDaëDhëDië@DjëpDkë DlëàDmìDpì Dqì`DrìDsìÀDtìðDuí DvíPDwí€Dxí°DyíàDzî D>îhD|î€8¸$æÝ 8î@æ9 æ¼9 æÀ9&€ç89=€è<9R@é9n@ê9ƒ@ë9”@ì9©@í9¾@î9Ü@ï9ë@ð9ú@ñ: @ò:@ó:'@ô:6&õ¬X:N€:lÀÝ :m@@:yÀßÜ:zàßô:{@@:‡Àà :ˆàà:‰@J_ :•ÀçÜ:–àè<:—@@:£ÀèÄ:¤àèÈ:¥@@:±ÀèÌ:²àèä:³àî¨:´$Nî¨:µ º„.î°D€î°DŒî¼D€îÀDŒîÄD€îÈDŒîÐDîÔD€îØDŒîäD€îìDŒîôDîüDŒïDïDŽï4DïpDï°D“ïàD—ïäDšïèD—ïìD“ïðD—ïøDšðD·ð0D›ð@D ðpD­ð´D½ðàD¾ñDÃñDDÆñxD¡ñ°DÕòD¢ò D£ò€D¤ò°D¥òàD¦ó0D¨ó|D©ó„DªóD­óÐD®óàDJWôDJXô$DJRô0D¯ôTD°ôpDJWô DJXô´DJRôÀD³ôäD´õ DJWõPDJXõdDJRõpD·õ”D¸õÀDJ`õðDJaöDJRö(DJeöPD»ö\D¼öœD½öÀD¾öÜD¿öðDÃöôD¿öøDÀ÷DÁ÷DÂ÷DÃ÷DÄ÷$DÆ÷(DÇ÷<DÈ÷pDÉ÷ DË÷ÐDÎ÷üDÕøDÖø0D×ø`DØøDÙøÔDÜøäDÝù DÞùPDßù€Dàù°DáùàDâúDãúPD¼ú DåúÀ:Ë$€î°;@€; €¬;' €°;9€8;N@‚;_@ƒ;t@„;‰@…;@†;¬@‡;»@ˆ;Ê@‰;Ù@Š;è& ‹º„<€<Àî°<@J_ <+Àõð<,àö\<-àúè<.$ 8Núèÿ DCÿLDDÿŒDEÿÄDGÿÈDEÿÐDFÿØDGÿÜDH(DITDJ€DO¬DPàDU DW`DXhDYtD\°D]ÀDJWìDJXDJR D^(D_DDJWpDJX„DJRDb¬DcÐDJWüDJXDJRDf8Dg\DJ`ˆDJa˜DJRÀDJeàDjìDk0DlHDmdDnxDp|Dn„DoŒDpDqœDrÈDsôDu$DxPDhD€€D°D‚àDƒD† D‡`DˆD‰ÀDŠðD‹ DŒPD€DްDàD DkhD’€¸DAìDDDEPDF`DEdDFhDGlDMˆDV DWÀDXðDY DZ\D]pD^ D_ÐD`Da0Db`DcDdÀDeðDè0DgP>$¡°>S@¡>g@¡>y@¡>‹€¢8>Ÿ€£<>±€¤@>Á@¥>×@¦>ï@§?@¨?@©?5@ª?D€«D?R@¬?a@­?p@®?@¯?Ž@°?Ÿ&±¬h?·€?ÕÀ°?Ö@J_ ?âÀ?ãàl?äàx?å$ÈNx?æ¬x.€D,€D,³˜D, D,ž¤D,³¨D,¬D,³´D,žÈD,©ÌD,ªÐD,¬ÔD,­ØD,³ÜD,´èD,µìD,¶ðD,ÂôD,¶øD,´üD,µD,¾D,ÂD,¾D, D,Ð\D,Â`D,ÐdD,ÃpD,Ä„D,ňD,ÄŒD,ÈD,ŘD,ƨD,Ç´D,ȸD,ÉÌD,ÊD,ÉD,ÊD,Ë0D,Ì4D,Ð@D,ÑpD,ÐtD,Ñ|D,Ô°D,Ñ´D,Ô¸D,ѼD,ÔÀD,ÕÈD,ÔÌD,ÕÐD,ÖÔD,×àD,Ø0D,ÙD,Ú¤D,Û¨D,ݬD,Þ°D,Ú´D,Þ¸D,ÛÀD,ÜÐD,ÝØD,ÞÜD,ß(D,àTD,á€D,â„D,ãˆD,ä¼D,åðD,í0D,ïðD,ðøD,ïüD,ðD,ñD,ô0D,õ`D,ùdD,öhD,ùlD,öpD,ùtD,õxD,ù|D,úŒD,û D,üÐD,ûØD,üÜD,ûàD,üäD,ýôD,þ0D,ý4D,þ8D,ÿHD-\D-hD-€D-´D-ðD-ôD-øD- DJW @D- DDJW HDJX XDJR dD- €D- ˆDJW ÀD- ÄD-  ÈDJW ÌDJX ÜDJR èD- !D- !D- !@DJW!DD- !HD- !LDJW!PDJX!`DJR!lD-!D-!˜DJW!ÐD-!ÔD-!ØDJW!ÜDJX!ìDJR!øD-"D-"D-"PDJ`"TD-"XD-"\DJ`"`DJa"lDJR"”DJe"°D-"¼D-"ìD-#D-#D-#D-#,D-#0D-#8D-#@D-#HD-#\D-#˜D-$#ÐD- #ÔD-!#ØD-$#ÜD-%#ìD-'#ðD-%#ôD-&#üD-'$D-($D-)$XD-.$D-+$”D-*$˜D-+$œD-.$ D-/$¬D-0$¼D-1$ÔD-2$ØD-1$ÜD-2$èD-3% D-2%$D-3%(D-4%0D-5%DD-7%XD-6%`D-7%lD-8%„D-9%´D-8%ÀD-9%ÄD-:%ÈD-;%øD-:%üD-;&D-A&0D-B&DD-D&HD-B&PD-C&XD-D&`D-E&tD-F&°D-E&¸D-F&¼D-G&ÌD-H'D-M'0D-I'4D-M'8D-J'<D-M'@D-N'HD-R'€D-S'œD-T'¬D-S'°D-T'´D-U'¸D-V'ÐD-'àD-Y(D-[(D-](D-^(4D-_(`D-`(dD-](lD-d(pD-](tD-d(€D-](„D-d(œD-e(ÌD-d(ÐD-e(ÔD-f)D-e) D-f)D-g)DD-f)HD-g)LD-j)€D-g)„D-j)ˆD-g)ŒD-j)D-k)˜D-j)œD-k) D-l)¤D-m)°D-n)ÈD-o)äD-p)øD-r)üD-p*D-q* D-r*D-s*$D-t*PD-u*`D-v*D-u*œD-v*¤D-ƒ*´D-„*ÈD-Š*ÌD-Ž*ÐD-„*ÔD-…*ÜD-†*àD-‡*ìD-ˆ*ðD-‰*üD-Š+D-‹+D-Œ+D-+$D-Ž+(D-+@D-+pD-’+ D-•+¤D-‘+¨D-’+¬D-•+°D-–+ÀD-˜+ÄD-–+ÈD-—+ÔD-˜+àD-™+ôD-š,0D-™,4D-š,8D-›,LD-œ,„D-Ÿ,ˆD- ,¤D-¡,¸D-¥,¼D-¡,ÀD-¢,ÈD-£,ÌD-¤,ØD-¥,ÜD-¦,ðD-§-$D-¨-PD-ª-ˆD--ÄD--äD-.D-'.@D-/.dD-0.„D-7.¼D-F.àD-R/D-U/$D-Y/XD-m/”D-n/ÈD-o/ôD-Ž0 D-˜0PD-š0€D-Ÿ0´D-¥0ÜD-ª1D-³1D-´1PD-³1TD-´1\D-µ1D-´1”D-µ1œD-¶1ØD-·2D-¸2XD-¹2D-º2œD-¹2 D-º2¤D-¾2¬D-Ä2ÌD-¾2ÐD-Ä2ìD-¿2ôD-À3D-Á3<D-À3@D-Á3DD-Ë3pD-Á3tD-Ë3xD-Å3€D-Æ3¸D-Ç3ðD-Ñ44D-Í48D-Ï4LD-Î4PD-Ñ4TD-Î4XD-Ï4\D-Ð4`D-×4hD-Ø4„D-Ù4¬D-Ú4ÀD-Û5D-Ü5@D-Ý5€D-Þ5ÀD-à5ðD-ã6D-ä60D-å6`D-æ6D-ç6ÀD-è6ðD-é7 D-ê7PD-ë7€D-ì7°D-í7àD-ï8?ü$,€@3@,@G@,@Y@,@k€,žX@@,Ÿ@•@, @ª€,¡p@½@,¢@Ï€,£l@â@,¤@ú€,¥hA@,¦ A'@,§A:@,¨AI€,©<AW€,ª@Ae€,«DAs€,¬HA€,­LA@,®Až@,±A­&,²¬xAÅ€AãÀ€Aä@JVAðÀ @Añà DAò@JVAþÀ HAÿà €B@JVB À ÀB à ÄB@JVBÀ ÌBà!B@JVB(À!DB)à!HB*@JVB6À!PB7à!B8@JVBDÀ!ÐBEà!ÔBF@JVBRÀ!ÜBSà"BT@J_ B`À"TBaà"XBb@J_ BnÀ"`Boà"¼Bp@-­B€-®PB–€-®TB¬€-®8B¿@-¯B×À1BØà4hBÙà84BÚ$´N84BÛ ºˆ.8@D-ó8@D.8XD-ó8`D-ú8dD.8hD-ó8lD.8tD-ý8„D-ú8ˆD-û8ŒD.8D.8œD.8 D. 8¤D.8¬D.8°D.8¸D. 8¼D.8ÀD. 8ÈD. 9D.9@D. 9HD. 9LD.9PD. 9TD.9XD.9€D.9„D.9ˆD.9ŒD.9D.9 D.9´D.9¸D.9¼D.9ÀD.9ÄD.9ÌD.9ÜD.9èD.9ìD.:D.:0D.:4D.:8D.7:`D.:dD.:hD.7:lD.:tD.7:xD.:D.:ÀD.:ÄD.:ÌD.";D.;D.";D.; D.";D.#;D.";D.#; D.$;$D.%;0D.&;pD.';tD.&;xD.';„D.(;´D.);èD.Z<0D.]=ÔD.==ØD.>=ÜD.?>D.C>D.@> D.C>D.D>(D.E><D.F>lD.E>pD.F>tD.G>°D.I>ðD.J>øD.I>üD.J?D.K?D.N? D.O?0DJW?`D.O?dDJW?lDJX?|DJR?ˆD.P? D.Q?¨DJW?àD.S?äD.R?èD.S?ìDJW?ðDJX@DJR@ D.T@0D.U@8DJ`@pD.W@tD.V@xD.W@|DJ`@€DJa@ŒDJR@´DJe@ÐD.X@ÜD.YAD.ZA D.YA(D.ZA,D.YA8D.ZA<D.[AHD.\ATD.[AXD.\A\D.]A`D.^AxD.aAD.bA¬D.cA¸D.bA¼D.cAÀD.dAÄD.eAÜD.iAèD.mB$D.vB`D.wBD.vB”D.wBœD.xBÐD.wBÔD.xBÜD.yCD.xC D.zC$D.yC(D.zC,D.~C0D.„CPD.~CTD.„CpD.CxD.€CŒD.CÀD.€CÄD.CÈD.‹CôD.CøD.‹CüD.…DD.†D<D.‡DtD.D°D.DÀD.ŽDÄD.‘DÈD.ŽDÌD.DÐD.DÔD.—DÜD.˜ED.šED.›EPD.œED.EÐD. EàD.¡FD.¢F@D.£FpD.¤F D.¥FÐD.YGD.§G Bñ$-ó8@C&@-óC:@-óCL@-óC^@-ôCt@-õC‰@-öCš@-÷C«@-øC¼@-ùCË€-úDCÙ€-û<Cç€-ü@Cõ€-ý8D& -ÿºˆD€D9À8@D:@.pDK€.qHD`€.qLDv€.qPD‰@.rD¡À<ìD¢à<üD£@JVD¯À?`D°à?dD±@JVD½À?lD¾à? D¿@JVDËÀ?àDÌà?äDÍ@JVDÙÀ?ðDÚà@0DÛ@J_ DçÀ@pDèà@tDé@J_ DõÀ@€Döà@ÜD÷@.pE€.qHE€.qLE3€.qPEF@.rE^ÀB`E_àDÜE`àG@Ea$NG@.G@DBÆG@DBÇGTDBÆGXDBÇGlD( GpD(GtD( GxD(G|D( G€D(GˆD( GŒD( G˜D(G¤D(G°D(GÌD(HD(HDD(HLD(HPD(HxD(HÈD(HøD(HüD(ID(ID(IDJWI4DJXIDDJRIPD(IhD( IpD(!IˆDJWI¸D(!I¼D("IÀDJWIÄDJXIÔDJRIàD(#IøD($JD(%JDJWJHD(%JLD(&JPDJWJTDJXJdDJRJpD('JˆD((JD()J¨DJ`JØD()JÜD(*JàDJ`JäDJaJðDJRKDJeK4D(+K@D(,KpD(/KŒD(2KD(,K˜D(/KœD(2K D(5K¤D(2K¨D(5KÄD(9KàD(<KðD(=L D(>L(D(?L\D(AL`D(CLdD(?LhD(@LlD(ALxD(BL|D(CL€D(DL¬D(ELàD(KM D(FMD(GMD(KMD(VMHD(KMLD(VMPD(KMTD(VMXD(LM`D(MMtD(NM€D(OMˆD(PM D(QMÔD(RND(VNDD(WNpD(VNtD(WN|D(XN°D(WN´D(XN¼D([NðDJmNôD(XNøD([NüDJmOD(XODJmODJnODJoOD([O0D(\OTD(]O\D(\O`D(]OdD(^OD(]O”D(^OœD(_O¨D(`O´D(aOèD(bPD(cP$D(dP,D(eP\D(gP`D(hP”D(iPÈD(qQD(rQ$D(tQ(D(rQ,D(tQ<D(sQDD(tQLD(uQlD(vQ˜D(wQ¨D(xQäD(RD(€RPD(RD(‚RÐD(ƒSD(†S D(‡SPD(ˆS€DBËS°D(,SØDBÏTEb$BÆG@E¢@BÆE«@BÆE´@BÆE½€(DEÔ@(Eã@(Eò€(8F€(<F€( @F@( F+ÀGpF,@JVF8ÀI4F9àIhF:@JVFFÀI¸FGàI¼FH@JVFTÀIÄFUàIøFV@JVFbÀJHFcàJLFd@JVFpÀJTFqàJˆFr@J_ F~ÀJØFàJÜF€@J_ FŒÀJäFàK@FŽ@([FšÀNôF›@JlF©ÀNôFªàNøF«àNøF¬@([F¸ÀOF¹@JlFÇÀOFÈàOFÉàOFÊ@([FÖÀOF×@JlFåÀOFæàO0FçàO0FèàS°Fé€(DG@(G@(G€(8G,€(<G:€( @GH@( GWÀSØGXàTGY$ àNT .T D4¾T D4ËTXD4ÈT\D4ÌTdD4ÆThD4ÇTtD4ÈT€D4ÌTŒD4ÍTD4ÏT”D4ÍTœD4ÏT D4ÒT°D4ÓTðD5U4D4ÔUPD4ÕU\D4ÖU`D4×U D4ØU´D4ÙUÐD4ÚVD4ÛVDD4ÜVpD4ÝVœD4ÞVÈDJ‹VÐDJŒVØDJVôD4ßWDJ‘W0D4ÞWTD4ßWxD4äWD4àW˜D4äWœD4çW¤D4ëW´D4îWÐDJEX D4ïXDJEXD4ïXDJEXDJFX0DJHX<DJIXDDJKXXDJLXdDJKXhDJLXlD4ïX”D4ðXÐD4ñXüDJ‹YDJŒYDJY0D4òYXDJ‘YpD4ñY”D4òYÈD4÷YàD4úYèD4óYìD4úYðD4÷YôD4úYøD4÷YüD4úZD5ZD5ZD5ZD5ZD5 Z$D5 Z,D5Z8D5ZHD5ZXD5ZpD5Z D5ZÐD5[D5 [D5![@D5"[pD5$[œGZ$4¾T Gœ@4¾G²@4¾GÃ@4¾GÝ@4¾Gñ@4¾H@4¾H&@4¿H>€HQ@4ÀHb@4ÂHq@4ÃH€@4ÄH@4ÅHžÀT HŸ@4ÞH­ÀVÐH®àWH¯@4ÞH½ÀW0H¾àWTH¿@4ïHÊÀX HËàXHÌ@4ïH×ÀXHØàXHÙ@4ïHäÀXHå@JHHîÀX<HïàX”HðàX”Hñ@4ñHÿÀYIàYXI@4ñIÀYpIàY”Ià[ÄI$¤N[Ä.[ÐD´[ÐD×[ØD´[ÜD×[ðD´[ôD¼[øDÂ\D¼\D×\Dè\DÆ\DDÇ\PDÆ\TDÇ\XDÊ\\DÍ\`DÊ\dDÍ\lDÎ\„DÍ\ˆDÎ\ŒDÒ\DÓ\ DÒ\¤DÓ\¨DØ\¬D×\´DØ\¸DÙ\¼DJm\ÀDÙ\ÄDJm\ÈDJn\ÔDJE\ÜDJF\øDJH]DJI]DJK]0DJL]<DJK]@DJL]DDÚ]lD]ˆDÛ] DÜ]ÌDÝ]äDÞ^Dß^$Dà^<Dá^HDâ^tDä^°Då^ÀDé^ÐDè^ØDé^ÜDê^àDJm^äDê^èDJm^ìDJn^øDJE_DJF_DJH_,DJI_4DJK_PDJL_\DJK_`DJL_dDë_ŒDì_˜Dí_ÄDî_ÜDï`Dð`Dñ`PDò``Dó`ŒDõ`ÐDÇ`ÜDJo`äDÙ`øDÜaDJoa@DêaTDíaxDaœDa´DIšaèDI›aøDIœbDI›b DIœbDIbDIŸb(D b4Db`I$´[ÐIQ@´Ig@´Iy@´IŒ@µI @¶Iµ@·IÈ@¸I×€¹8Iå@ºIô@»JÀ[ÐJ@ÙJÀ\ÀJà\ÄJ@ÙJÀ\ÈJà\ÜJ @JHJ)À]J*à]lJ+@êJ7À^äJ8à^èJ9@êJEÀ^ìJFà_JG@JHJPÀ_,JQà_ŒJR@ÙJ^À`äJ_à`øJ`@êJlÀa@JmàaTJn€I˜<J|€I˜@JŠ€I˜DJ—@I™J¢ÀaèJ£àb4J¤àbxJ¥$¨NbxJ¦¬€.b€D9åb€D:bˆD9åbŒD:bD9æb”D9åb˜D:b D9åb¤D:b¨D:b¬D:b´D:b¸D:bÈD9æbÌD:bÐD: bÔD: bØD: bÜD:bàD:bäD:bèD:bìD:bðD:bôD:cD:+cD:c D:cD:.c(D:2c,D:+c0D:2c4D:+c8D:2c@D:3cDD:4cÀD:5cðD:6côD:5cøD:<dD:=d D:BdÐD:?dÔD:>dØD:BdÜD:?däD:BdèD:CePD:He€D:Ee„D:DeˆD:HeŒD:Ee”D:He˜D:IfD:Nf0D:Jf8D:Kf<D:Nf@D:OfTD:PfpD:Qf„D:RfˆD:TfŒD:QfD:Rf”D:Sf¤D:Tf°D:Uf´D:Vg(D:Wg\D:XgŒD:WgD:Xg˜D:YgÀD:ZgÄD:]gÌD:ah,DJmh0D:ah4DJmh8DJnhHDJohTD:ahhD:bhÌD:chèD:diD:ci D:di$D:ei4D:fiDD:giPD:hihD:iiœD:jiÌD:iiÐD:jiÔD:kjD:rjD:ljD:rj D:€jdD:sjtD:tj D:uj¤D:xj¨D:|jôD:€kD:k<D:€k@D:kHD:‚k|D:k€D:‚kˆD:…k¼DJmkÀD:‚kÄD:…kÈDJmkÌD:‚kÐDJmkÔDJnkÜDJokèD:…küD:†l\D:‡ldD:†lhD:‡llD:ˆl˜D:‡lœD:ˆl¤D:‰lÈD:ŠlØD:mD:‘mHD:—mtD:’m|D:“m€D:—m„D:žm¸D:˜mÈD:™mÔD:šnD:™n D:šnD:žnD:¡nHDJmnLD:žnPDJmnXDJnn`DJonlD:¡n€D:¢nŒD:£n”D:¢n˜D:£nœD:¤nÈD:£nÌD:¤nÔD:¥nØD:¦näD:©o DJmo4D:¬o<DJmoDDJnoLDJooXD:¬olD:­oxD:®o”D:¯oÈD:®oÌD:¯oÐD:°oàD:±oôD:²pD:³p\D:´pD:µpÄD:¶pøD:·q,D:¸q`D:½q”D:¾qÈD:½qÌD:¾qÐD:¿rD:Ér8D:ér˜D:Êr¨D:Ër¼D:ÌrÀD:ÎrÄD:ËrÈD:ÏrÌD:ÌrÔD:ÍräD:ÎrðD:ÏrôD:ÐsPD:Ñs€D:Ðs„D:ÑsˆD:Ös´D:Òs¸D:Ós¼D:ÖsÀD:ÓsÈD:ÒsÌD:ÖsÐD:×sàD:ØsôD:ÙtD:ÚtD:ÛtlD:Üt D:Ût¤D:Üt¨D:ÝtÔD:ÜtØD:ÝtÜD:âuD:ÞuD:âu D:ßuD:âuD:ÞuD:âuD:ãu,D:äuxD:åu¬D:éuðD:êvD:év D:êv(D:ëv\D:êv`D:ëvhD:ìvœD:ëv D:ìv¨D:ívÜD:ìvàD:ívèD:îwD:íw D:îw(D:ïw\D:îw`D:ïwhD:ðwœD:ïw D:ðw¨D:ñwÜD:ðwàD:ñwèD:ôxD:ñx D:ôx$D:ñx(D:ôx,D:õx4D:öxhD:÷xxD:øx´D:ùyD:úy0D:ûy4D:úy8D:üy<D:ýypD:þy¤D;yØD;yôD;zD;zD; z D;z$D; z4D; z@D; zLD; zPD; zhD;zœD;zÌD;zÐD;zÔD;{0D;{`D;{hD;{lD;{|D;{D;{¤D;{¸D;{ÄD;{ÐD;{ÔD;{ìD;| D;|PD;|TD;|XD;|´D;#|äD;|èD;#|ðD;$}DD;'}PD;$}TD;'}XD;(}ÐD;)~D;-~D;*~D;-~ D;*~D;-~D;)~D;-~D;.~,D;/~DD;0~tD;/~xD;0~|D;1~ŒD;2~œD;3~¨D;4D;5HD;4LD;5PD;6|D;5€D;6„D;7¬D;8°D;;¸D;7¼D;;ÀD;<€D;@€$D;A€,D;B€HD;C€\D;E€`D;C€hD;D€lD;E€pD;F€ÌD;G€üD;FD;G D;HD;I@D;HDD;IHD;R”D;S¼D;TÄD;UàD;VôD;XøD;V‚D;W‚D;X‚D;Y‚tD;Z‚¤D;Y‚°D;Z‚´D;[‚¸D;\‚èD;[‚ðD;\‚ôD;bƒ@D;cƒXD;gƒ„D;hƒ D;iƒ´D;jƒäD;iƒèD;jƒìD;k„LD;m„œD;n„¤D;m„¨D;n„¬D;o„°D;r„ÀD;s„ÐDJW…D;s…DJW…DJX…DJR…$D;t…0D;u…<D;v…lDJW…pD;w…tD;v…xDJW…|DJX…ŒDJR…˜D;x…¤D;y…°D;z…àDJ`…äD;{…èD;z…ìDJ`…ðDJa…üDJR†$DJe†4D;}†DD;€†\D;}†`D;€†hD;†tD;…†€D;Œ†ÐD;}†àD;††üD;‡‡D;ˆ‡8D;‡‡@D;ˆ‡DD;Œ‡LD;‡xD;Œ‡|D;‡€D;އ´D;‡¸D;އ¼D;‡ðD;އôD;‡øD;ˆ,D;ˆ0D;ˆ4D;‘ˆhD;ˆlD;‘ˆpD;’ˆ¤D;‘ˆ¨D;’ˆ¬D;“ˆàD;’ˆäD;“ˆèD;–‰DJm‰ D;“‰$D;–‰(DJm‰,D;“‰0DJm‰4DJn‰<DJo‰HD;–‰TD;—‰`D;˜‰hD;—‰lD;˜‰pD;™‰œD;˜‰ D;™‰¨D;š‰¬D;›‰°D;š‰´D;›‰¼D;š‰ÀD;›‰ÄD;ž‰ÜD;¡‰ìD;¢‰üD;¥ŠD;¦ŠDJmŠPD;ªŠXDJmŠ`DJnŠhDJoŠtD;ªŠ€D;«ŠŒD;¬ЍD;­ŠÜD;¬ŠàD;­ŠäD;®ŠôD;¯‹D;°‹D;±‹,D;²‹`D;³‹”D;·‹ÈD;¸‹üD;·ŒD;¸ŒD;¹Œ4D;ÀŒlD;ÁŒ„D;ÂŒŒD;ÃŒ¨D;ÄŒ¼D;ÆŒÀD;ÅŒÄD;ÆŒÈD;ÄŒÌD;ÅŒÐD;ÆŒÔD;Ç,D;È\D;ÇhD;ÈlD;ÉpD;Ê D;ɬD;ʰD;ÏôD;ÒŽ$D;ÏŽ,D;ÒŽ0D;ÓŽDD;ÔŽXD;ÕŽˆD;ÔŽŒD;ÕŽD;ÖŽàD;Ø,D;Ù4D;Ø8D;Ù<D;Ú@D;ÝPD;Þ`DJWD;Þ”DJW˜DJX¨DJR´D;ßÀD;àÌD;áüDJWD;âD;áDJW DJXDJR(D;ã4D;ä@D;åpDJ`tD;æxD;å|DJ`€DJaŒDJR´DJeÄD;çÐD;èèD;ë‘D;è‘D;ë‘D;ì‘DJE‘ DJF‘@D;è‘TDJH‘pDJI‘tDJH‘xDJI‘|DJK‘„DJL‘DJK‘”DJL‘˜D;ï‘ÀD;ð‘ÌD;ñ‘äDJE’DJF’8DJH’LDJI’PDJH’TDJI’XDJK’`DJL’lDJK’pDJL’tD;õ’œD;ö’¨D;÷’ÀDJE’ôDJF“DJH“(DJI“,DJH“0DJI“4DJK“<DJL“HDJK“LDJL“PD;û“xD;ü“„D;ý“œD<“ÌD;ý“ÔD<“ØD<“ðD<“øD<”D<”(D<”,D<”4D<”8D<”<D<”ŒD< ”¼D<”ÈD< ”ÌD< ”ÐD< •D< •D< •D<•LD<•|D<•„D<•ˆD<"•ÐD<•àD<•ôD<•øD<•üD<–D<–D<–D<–$D<–(D<–<D<–pD<– D<–¤D<–¨DšàD@#šSQ@#›S`@#œSo€#ž<S}@#ŸSŒ@# S›&#¡¬ŒS³€SÑÀµPSÒ@#¨Sà@#¨SëÀµÜSìàµàSí@#¨Sû@#¨TÀµèTà¶4T@#¨T@#¨T!À¶dT"à¶T#@JHT,ÀºtT-àºÀT.àôT/$dNôT0 ºŒ.ÃÀD$2ÃÀD$BÃØD$2ÃàD$:ÃäD$BÃèD$2ÃìD$BÃôD$:ÄD$>ÄD$?Ä D$BÄD$CÄD$GÄ D$CÄ(D$GÄ0D$MÄ<D$NÄD$OÄÀD$PÄÄD$SÄÈD$TÅD$UÅ@D$VÅDD$ZÅHD$YÅLD$ZÅPD$YÅTD$ZÅXD$2Å`D$]Å€D$^Å”D$]ŘD$^ÅœD$_Å D$`ŰD$bÅÀD$iÅÈD$jÅèD$iÅìD$jÅðD$kÅôD$mÆD$qÆ0D$rÆLD$qÆPD$rÆTD$sÆXDJ™ÆxD$tÆ|DJ™Æ€D$tÆ„DJ™ƈD$tÆŒDJ™Æ”DJšƤDJœƼDJÆÀDJŸÆÈDJ ÆØDJŸÆÜDJ ÆàD$tÇD$uÇPDJEÇD$zÇ”DJEǘD$zÇœDJEǤDJFǸDJIÇÐDJHÇÔDJIÇØDJKÇàDJLÇìDJKÇðDJLÇôD$zÈ D${È,D$|ÈPD$}ÈD$~È”D$}ȘD$~ȤD$ÈÔD$~ÈØD$ÈÜD$€ÉD$ÉD$€ÉD$ƒÉ DJ™É8D$„É<DJ™É@D$„ÉDDJ™ÉHD$„ÉLDJ™ÉPDJšÉ`DJœÉxDJÉ|DJŸÉ„DJ É”DJŸɘDJ ÉœD$„ÉÄD$…ÉðD$ˆÊ$D$ÊpD$ʰD$Ê´D$ʸD$“ÊðD$ÊôD$“ÊøD$ÊüD$“ËD$”ËD$“Ë D$”ËD$•ËD$–Ë D$—Ë8D$˜ËtD$™Ë´D$ZÌD$¤ÌD$¥ÌD$¤ÌD$¥Ì D$¦Ì$DJ™ÌhD$§ÌlDJ™ÌpD$§ÌtDJ™ÌxDJšÌŒDJœ̤DJ̨DJŸ̰DJ ÌÀDJŸÌÄDJ ÌÈD$§ÌðD$¨Í$D$®Í\D$¯Í D$±ÍÐD$´ÍÔD$°ÍØD$±ÍÜD$´ÍàD$¶Î0D$·Î8D$¶Î<D$·Î@D$¸ÎDD$»ÎpD$¼΄D$ÀÎÀD$¼ÎÄD$ÀÎÈD$ÁÎØD$ÂÎìD$ÃÏD$ÉÏD$ÇÏD$ÃÏ D$ÄÏD$ÅÏ D$ÆÏ(D$ÉÏ0D$ÇÏ4D$ÈÏ8D$ÉÏ<D$ÊÏPD$ËÏ€D$ÐϰDJmÏ´D$ÌϸD$ÍϼD$ÐÏÀDJmÏÄD$ÍÏÈDJmÏÌDJnÏÔDJoÏàD$ÐÏðD$ÑÏøD$ÒÐD$ÓÐPD$ÒÐTD$ÓÐXD$ÒÐ\D$ÓÐ`D$ÔÐpD$ØÐtD$ÔÐxD$ÕЀD$ÖЄD$×ÐD$ØИD$ÙЬD$ÚÐàD$ÛÑD$ÚÑD$ÛÑ D$ÜÑ,D$ÞÑhD$áÑœD$ÞÑ D$áѤD$_Ñ´D$sÑäD$–ÒD$»Ò<D$ÁÒlD$ÉÒ„D$ÐÒ¨D$ØÒÐD$ÛÒàD$ãÓD$èÓ D$éÓ`D$êÓ D$ëÓàD$ìÔD$ïÔ D$ðÔPD$ñÔ€D$òÔ°D$óÔàD$õÕTF$$2ÃÀT~@$2T’@$2T¤@$2T¶@$3TÇ@$4Tç@$5Tø@$6U @$7U#@$8U7@$9UF€$:8UT@$;Uc€$<<Uq@$=U‚€$>@U€$?DUž@$@U­& $AºŒUÅ€UãÀÃÀUä@$tUïÀÆxUð@J˜UùÀÆxUúàÆ|UûàÆ|Uü@$tVÀÆ€V@J˜VÀÆ€VàÆ„VàÆ„V@$tVÀƈV @J˜V)ÀƈV*àÆŒV+àÆŒV,@$tV7ÀÆ”V8@J˜VAÀÆ”VB@JœVKÀƼVLàÇVMàÇVNàÇVO@$zVZÀÇV[@JDVdÀÇVeàÇ”VfàÇ”Vg@$zVrÀǘVs@JDV|ÀǘV}àÇœV~àÇœV@$zVŠÀǤV‹@JDV”ÀǤV•@JHVžÀÇÐVŸàÈ V àÈ V¡àÈ V¢@$„V­ÀÉ8V®@J˜V·ÀÉ8V¸àÉ<V¹àÉ<Vº@$„VÅÀÉ@VÆ@J˜VÏÀÉ@VÐàÉDVÑàÉDVÒ@$„VÝÀÉHVÞ@J˜VçÀÉHVèàÉLVéàÉLVê@$„VõÀÉPVö@J˜VÿÀÉPW@JœW ÀÉxW àÉÄW àÉÄW àÉÄW @$§WÀÌhW@J˜W"ÀÌhW#àÌlW$àÌlW%@$§W0ÀÌpW1@J˜W:ÀÌpW;àÌtW<àÌtW=@$§WHÀÌxWI@J˜WRÀÌxWS@JœW\À̤W]àÌðW^àÌðW_àÌðW`@$ÐWlÀÏ´Wm@JlW{ÀÏ´W|àϸW}àϸW~@$ÐWŠÀÏÄW‹@JlW™ÀÏÄWšàÏÈW›àÏÈWœ@$ÐW¨ÀÏÌW©@JlW·ÀÏÌW¸àÏðW¹àÏðWºàÕ0W»$pNÕ0W¼¬”.Õ0DECÕ0DEEÕHDECÕLDEEÕ\DEFÕlDEIÕtDEHÕxD <Õ|D :Õ€DEIÕ„DEHÕˆD <ÕŒD ÕœD <Õ DEHÕ¬DEIÕ°D <Õ´DEIÕ¼DEJÕÈDEKÕàDELÕðD 9ÕôD 5ÕøD ÕüD .ÖD /ÖD 0ÖD 1Ö D 3ÖDELÖD 9ÖD ;ÖD :Ö D ;Ö$DELÖ(D 9Ö,D <Ö0D :Ö4DELÖ8D ;Ö<D <Ö@D =ÖXD GÖ\D AÖ`D =ÖdD >ÖlD ?Ö|D GÖŒD FÖD GÖ”DI‹Ö˜D FÖœDI‹Ö¤DIŒÖ¨DIÖÐD KÖðDI‘×D G×,D L×xD M׈D N׸D T×ÐD U×ÜD VØD YØD ZØ,D [Ø`D ^ØlD aØtD dØ|D gØ„D hØ”D iØÐD oØÔD iØØD oØÜD ªÙ<D pÙPD qÙdD rÙtD sÙ€D tÙ˜D uÙÔD tÙØD uÙÜD vÚD uÚD vÚD wÚ(DJWÚ`D wÚdDJWÚhDJXÚxDJRÚ„D xÚ D yÚ¬D zÚÄDJWÚôD zÚøD {ÚüDJWÛDJXÛDJRÛD |Û4D }Û|DJ`Û¨D Û¬D ~Û°D Û´DJ`Û¸DJaÛÄDJRÛìDJeÜD €ÜD Ü@D „ÜXD Ü\D „ÜdD ‡ÜhD ˆÜ|D ‰ÜD ŠܤD ŒܨD ŠܬD ‹ܰD ܼD ŒÜÀD ŽÜÄD ÜÔD ÜìD ‘ÝHD ’Ý|D ‘Ý€D ’Ý„D “Ý´D ˜ÝàD ”ÝäD •ÝèD ˜ÝìD ™ÝüD šÞD ›Þ$D œÞ,D Þ8D žÞ<D ŸÞ@D  ÞŒD ¡ÞÀD ¢ÞìD £ÞðD ªßD «ß0D ªß4D «ß<D ¬ßpD «ßtD ¬ß|D ¯ß°DJmß´D ¬߸D ¯ß¼DJmßÀD ¬ßÄDJmßÈDJnßÐDJoßÜD ¯ßðD °à@D ±àHD °àLD ±àPD ²à€D ±à„D ²àˆD ³àŒD ´à˜D ¶àøD ·á,D ¶á0D ·á4D ¸ádD Äá”D ¸á˜D ÄáœD Åá¤D Ëá°D Îá´D ÏáÄD ÔáðD ÕáüD ÜâD ßâD àâ0D áâDD ââXD ãâ`D äâlD åâpD æâtD çâ„D èâ˜D éâÌD êã D ëãxD ìã¸D íäD ÷ä D íäD îäD ïä D ðä(D ñä4D òä<D óä@D õäDD ÷äHD øäXD úä\D øä`D ùädD úähD ûäÐD üåD ûå D üåD ýålD þå D ÿåÔDæDæD æD æLD æŒD æÐDæÔDæØDæàDæäDæôDçHDç¤DçÐDèDè4Dè8Dè<Dè@D è¬D!è´DJmè¸D!è¼DJmèÀDJnèÌDJoèØD!èìD"é D#é(D$é\D#é`D$édD%étD&éˆD'é”D(éìD)ê D*êPD)êXD*ê\D+êdD,êD5êèD8êüD;ëD<ë$D?ë,DBë<DHëPDIë\DLëdDOëtD2ë€DXëˆDYëŒD\ë˜DJEë¤DJFëÀDJHëÐDJIëÔDJHëØDJIëÜDJKëäDJLëðDJKëôDJLëøD\ì D]ìpDJ‹ìtDJŒì|DJì D^ìÈDJ‘ìàD]íD^íLDcídD`íhD_ílD`ípDcítDfí˜DgíœDfí Dgí¨Djí°DJEí¼DJFíØDJHíèDJIíðDJKíøDJLîDJKîDJLî Djî4DkîDJ‹î”DJŒîœDJîÀDlîèDJ‘ïDkï$Dlï`DrïxDmï|Drï€DsïˆDtïœDvï¬Duï´DvïÀDwïØDxðDwðDxðDyðDzðLDyðPDzðXD„ð¤D…ð¬D†ðÈD‡ðèDˆðüDŠñDˆñD‰ñDŠñD‹ñDŒñDñ,DŽñDDñ`Dñ”D‘ñÀD’ñìD“ñðDœñøD—ò Dœò˜DŸòàD òäD¤òìD®òôD¯óD¹óDºó DÑó,DÐó0DECó4DÄó8DÊó<DÑó@DÇóDDÍóHDÄóLDÊóPDÇóTDÍóXDÄó\DÊó`DÑódDÔóhDÕópDÜóˆD«ó˜Dcó¨DéóÈDíóÌDîóØDJmóÜDîóàDJmóäDJnóðDJoóüDîôDïôPDðôŒDñô¸DòôÌDóôàDôôìDõõHDöõ|Dõõ€Döõ„D÷õ°Döõ¼D÷õÀDøõÄDùõôDøõøDùõüDÿö<DöXDötDöˆDö¸Dö¼DöÄD÷D÷PD ÷TD÷XD ÷\D ÷tD÷ŒD ÷”D÷˜D÷œD÷¤D÷¨D÷¬D÷ÀD÷àD÷üDøDøD øDø Dø$D ø(D!ø8D"ødD#øD$ø D&øÔD'øØDøÜD.øìD2øðD9ùDD3ù`D4ùtD9ù°D:ùÜD9ùàD:ùèD;úD:ú D;ú(D<ú\D;ú`D<úhD?úœD<ú D?ú¨D@úÜD?úàD@úèDCûDJmû D@û$DCû(DJmû,D@û0DJmû4DJnû<DJoûHDCû\DDû°DEû¸DDû¼DEûÀDFûìDEûðDFûôDGûøDHüDJüdDKü˜DLüÌDTýD\ý0DTý4D\ýLDTýPD\ýhDUýpDvý D\ý¬D]ýØD\ýÜD]ýäD^þD]þD^þ$D_þXD^þ\D_þdD`þ˜D_þœD`þ¤DaþØD`þÜDaþäDeÿDJmÿDaÿ Deÿ$DJmÿ(Daÿ,DJmÿ0DJnÿ8DJoÿDDeÿLDJoÿXDeÿdDfÿˆDgÿŒDfÿDgÿ”Dhÿ¼DiÿèDjÿôDlTDmˆDn¼DvDyDzhD{”D|˜D‚œD| D‚¤D{¨D‚¬Dš DƒD„DD…TD†`D‡´DˆèD‡ìDˆðD‰Dˆ D‰$DŽLD`DtD‘¼D’ÀD•ÈD’ÐD”ÔD•ØD–(Dš`D›ŒDšD›˜DœÌD›ÐDœØD DœDDŸTD „D¡¼D ÀD¡ÈD¤üD¡D¤D¡D¤ D¥D¦0D§<D¨ŒD©ÀDªôD±(D²,D³@D´`Dµ|D¶D¸”D¹¬DºäD»D¼ D¾XD¿\DÀxDÁ”D¨DĬD°DôDÄÀDÅÄDÆÈDÇèDÈ DÉ DË DÌ 4DÍ hDÎ ˜DÍ ¤DÎ ¨DÏ ´DÐ àD² D× $DØ dDÛ pDJm tDÛ xDJm |DJn ˆDJo ”DÛ ¨DÜ ´DÝ ÐDÞ DÝ DÞ DÝ DÞ Dß LDà €Dá °Då ´Dá ¸Dâ ¼Då ÀDæ ØDê ÜDæ äDç ðDè ôDé Dê Dë 8Dì dDv  D† äD‡ $DŒ hD xDŽ ¤DÝ àDÞ èDÝ ìDÞD<DTDxD ˜D#ÌD³D´DDµ\D¸„D»œDÆÐDÇDÈDË4DÎ\Dí”D÷°DøðDù0DúpDû°DüðDý0DþpDÿ°DÀDðD DPD€D°DàD D @D pDEM DEN¨D èDEQWÑ$ECÕ0X@ECX@ECX@ECX!@EEX*ÀÕ0X+€ tX>€ LXR€ PXe€ TXv€ XX‹€ \X@ X®@ X¿@ XØ@  Xï@ Y@ Y@ Y0@ !YE@ #Y]@ $Yq@ 'Y‰@ (Yž€ )€Y¶€ *|YÎ@ +Yã@ ,Yò€ .`Z€ /dZ€ 0hZ€ 1lZ*€ 3pZ8@ 4ZG€ 5HZU@ 6ZeÀÕ|ZfàÕ„Zg€ tZz€ LZŽ€ PZ¡€ TZ²€ XZÇ€ \ZÙ@ Zê@ Zû@ [@  [+@ [A@ [V@ [l@ ![@ #[™@ $[­@ '[Å@ ([Ú€ )€[ò€ *|\ @ +\@ ,\.€ .`\<€ /d\J€ 0h\X€ 1l\f€ 3p\t@ 4\ƒ€ 5H\‘@ 6\¡ÀÕŒ\¢àÕ¬\£€ t\¶€ L\Ê€ P\Ý€ T\î€ X]€ \]@ ]&@ ]7@ ]P@  ]g@ ]}@ ]’@ ]¨@ !]½@ #]Õ@ $]é@ '^@ (^€ )€^.€ *|^F@ +^[@ ,^j€ .`^x€ /d^†€ 0h^”€ 1l^¢€ 3p^°@ 4^¿€ 5H^Í@ 6^ÝÀÕ´^ÞàÕ¼^߀ t^ò€ L_€ P_€ T_*€ X_?€ \_Q@ _b@ _s@ _Œ@  _£@ _¹@ _Î@ _ä@ !_ù@ #`@ $`%@ '`=@ (`R€ )€`j€ *|`‚@ +`—@ ,`¦€ .``´€ /d`€ 0h`Ѐ 1l`Þ€ 3p`ì@ 4`û€ 5Ha @ 6aÀÕôaàÖa€ ta.€ LaB€ PaU€ Taf€ Xa{€ \a@ až@ a¯@ aÈ@  aß@ aõ@ b @ b @ !b5@ #bM@ $ba@ 'by@ (bŽ€ )€b¦€ *|b¾@ +bÓ@ ,b†.`bð€ /dbþ€ 0hc € 1lc€ 3pc(@ 4c7€ 5HcE@ 6cUÀÖcVàÖ(cW€ tcj€ Lc~€ Pc‘€ Tc¢€ Xc·€ \cÉ@ cÚ@ cë@ d@  d@ d1@ dF@ d\@ !dq@ #d‰@ $d@ 'dµ@ (dÊ€ )€d†*|dú@ +e@ ,e€ .`e,€ /de:€ 0heH€ 1leV€ 3ped@ 4es€ 5He@ 6e‘ÀÖ,e’àÖ8e“€ te¦€ Leº€ PeÍ€ TeÞ€ Xeó€ \f@ f@ f'@ f@@  fW@ fm@ f‚@ f˜@ !f­@ #fÅ@ $fÙ@ 'fñ@ (g€ )€g€ *|g6@ +gK@ ,gZ€ .`gh€ /dgv€ 0hg„€ 1lg’€ 3pg @ 4g¯€ 5Hg½@ 6gÍÀÖ<gÎ@ GgÜÀÖ˜gÝàÖœgÞ@ GgìÀÖ¤gíàÖðgî@ GgüÀ×gýà×,gþ@JVh ÀÚ`h àÚdh @JVhÀÚhhàÚ h@JVh&ÀÚôh'àÚøh(@JVh4ÀÛh5àÛ4h6@J_ hBÀÛ¨hCàÛ¬hD@J_ hPÀÛ¸hQàÜhR@ ¯h^Àß´h_@JlhmÀß´hnà߸hoà߸hp@ ¯h|ÀßÀh}@Jlh‹ÀßÀhŒàßÄhàßÄhŽ@ ¯hšÀßÈh›@Jlh©ÀßÈhªàßðh«àßðh¬@!h¸Àè¸h¹@JlhÇÀè¸hÈàè¼hÉàè¼hÊ@!hÖÀèÀh×@JlhåÀèÀhæàèìhçàèìhè@\hó@\hüÀë¤hý@JDiÀë¤i@JHiÀëÐiàì iàì iàì i@]i"Àìti#àìÈi$@]i2Àìài3àíi4@ji=Àí¼i>@JHiGÀíèiHàî4iIàî4iJ@kiXÀî”iYàîèiZ@kihÀïiiàï$ij@îivÀóÜiwàóàix@îi„Àóäi…àôi†@Ci’Àû i“@Jli¡Àû i¢àû$i£àû$i¤@Ci°Àû,i±@Jli¿Àû,iÀàû0iÁàû0iÂ@CiÎÀû4iÏ@JliÝÀû4iÞàû\ißàû\ià@eiìÀÿiíàÿ iî@eiúÀÿ(iûàÿ,iü@ejÀÿ0j àÿLj @ejÀÿXjàÿdj@Ûj$À tj%@Jlj3À tj4à xj5à xj6@ÛjBÀ |jC@JljQÀ |jRà ¨jSà ¨jTà jU€ tjh€ Lj|€ Pj€ Tj € Xjµ€ \jÇ@ jØ@ jé@ k@  k@ k/@ kD@ kZ@ !ko@ #k‡@ $k›@ 'k³@ (kÈ€ )€kà€ *|kø@ +l @ ,l€ .`l*€ /dl8€ 0hlF€ 1llT€ 3plb@ 4lq€ 5Hl@ 6lÀèlàl‘à0l’$@N0l“¬°.0DË0D<DÏ@DËDDPDËXDdDøhDùlDúpDûtDüxDø|Dý€Dþ„DùˆDúŒDÿD”Dû˜DüœDý Dþ¤D¨Dÿ¬D°DË´D¼DøÄDùÈDúÌDûÐDüÔDýØDþÜDÿàDäDÕèDììDíðDîôDïøDñüDòDôDöD D$D|D´DìD D $D(D0D 8D DD TD dD tD„D”D D´DàDäDèDìD PD,TD#XD)\D,`D&dD#hD)lD,pD-ÌD.üD/D.D5D6$D5(D6,D9@D: D;ÐD?ÔD<ØD;àD?äDAPDBXDA\DB`DChDFÀDGðDHôDKøDHüDKDGDKDLDM0DN@DOLDPdDQ¤DRäDS DW$DT,DW0DS8DW<DJELDJFlDJH€DJI„DJHˆDJIŒDJK”DJL DJK¤DJL¨DXÐDYÜDZôD[4DZ8D[<D]xDc°DdDi@DeDDjHDeLDfPDiTDfXDj\Dm Dn¸DoÔDpèDqìDpðDqôDrøDsDtDDu€Dt„DuˆDv˜DwÐDvÔDwØDŠàD~äDŠèD~ðDŠøD D„ D‡ D‹ DŠ D‹ DJE D DJE DJF <D› PDJI pDJH tDJI xDJK €DJL ŒDJK DJL ”D ÀDŸ ôD øDŸ üD!D‘!DJW!LD‘!PDJW!TDJX!dDJR!pD’!ˆD“!”D”!¬DJW!ÜD”!àD•!äDJW!èDJX!øDJR"D–"D—"(D˜"@DJ`"tD™"xDJ`"|DJa"ˆDJR"°DJe"ÌD›"ÜD³"ôD›"øD³"üD´#D³# D´#DŸ# D #PDŸ#TD #XD¡#D #”D¡#˜D¢#ÐD¡#ÔD¢#ØD¥$D¢$D¥$D¦$D¥$ D¦$$D§$(D¨$4Dµ$„D·$˜D¿$¤DÂ$¬DË$¸DÌ$ÄDË$ÈDÌ$ÌDÏ$ÐDØ$ðDÙ%DØ%DÙ%DÜ% DÝ%@DÞ%pDã%tDß%xDã%€DÞ%„Dã%ˆDä%˜Då%ÈDþ%ÌDæ%ÐDå%ØDþ%ÜDã%ðDê%øDã%üDê&Dã&Dê&0Dë&`Dê&dDë&hDì&œDë& Dì&¤Dí&ØDì&ÜDí&àDð'Dí'Dð'Dñ' Dð'$Dñ'(Dò',Dó'8Dþ'ˆDÿ'ÀD'àD'ôD((D(XD(\D(`D(tD(ˆD(¼D(ìD(ðD(ôD)D )<D )@D)DD )HD )XD)xD)ŒD)ÀD)ðD)ôD)øD* D* D*TD*„D*ˆD*ŒD*¤D*ÔD*ÜD*àD*äD*øD+ D +<D+DD+HD +LD!+`D"+tD#+¨D"+¬DJE+ÀD*+ÄDJE+ÌDJF+èDJI+üDJH,DJI,DJK, DJL,DJK,DJL, D*,PDF,ŒD+,œD,,¸D-,ìD,,ðD-,ôD.-D/-D0-,D1-@D2-TD8-\D<-`D6-dD2-hD3-lD4-|D5-ŒD6-œD7- D6-¤D7-¬D8-´D9-¸D:-¼D;-ÀD<-ÄD=-ÔD>-ÜD?-àD@.(DA.\DB.DF.ÐDG/DF/DG/DH/@DG/DDH/HDI/€DH/„DI/ˆDJ/ÀDI/ÄDJ/ÈDK0DJ0DK0DN0@DK0DDN0LDO0PDN0TDO0XDP0\DQ0hDR0€DS0”DT0¨DU0¼DV0ÐDW0äD[0ìDa0ðD[0ôDW0øDX0üDY1 DZ1D[1(D\1,D[10D\18D]1@D^1DD_1HDa1LDb1\Dc1hDJ™1lDd1pDJ™1xDd1|DJ™1„DJš1œDJœ1´DJ1¸DJŸ1ÀDJ 1ÐDJŸ1ÔDJ 1ØDd2De2@Df2tDe2xDf2|Dg2´Dh2ôDj3@Dq3`Dr3´Ds4Dt40Ds44Dt4<Du4|Dw4ÀDx4ÈDw4ÌDx4ÐDy4ØD|5D}5PDJW5€D}5„DJW5ŒDJX5œDJR5¨D~5ÀD5ðD€60DJW6`D€6dD6hDJW6lDJX6|DJR6ˆD‚6 Dƒ6ÐDJ`7D…7D„7D…7 DJ`7DJa7DJR7DDJe7`D†7lD‡7DŠ7°D‡7¸DŠ7ÀD‹7ÌDŠ7ÐD‹7ÔDŽ7ØD8 D8`D‘8 D’8¤D‘8¨D’8¬D“8°D”8ðD•9$D–9XD•9\D–9`D—9 D˜9¬D™9´Dš9ÀD›9ÄDœ:D:@Dž:€DŸ:ÀD :ðDŸ:ôD :üD¡;@D¢;€D£;°D¢;´D£;¼D¤<D¥<@D¦ DJE>€DJF>œDJH>°DJI>´DJH>¸DJI>¼DJK>ÄDJL>ÐDJK>ÔDJL>ØD¼?DJE? DJF?(DJH?@DJI?DDJH?HDJI?LDJK?TDJL?`DJK?dDJL?hD½?D¾?œDJE?ÔDJF?ðDJH@DJI@DJH@DJI@DJK@$DJL@0DJK@4DJL@8D¿@`DJE@lDJF@ˆDJH@ DJI@¤DJH@¨DJI@¬DJK@´DJL@ÀDJK@ÄDJL@ÈDÀ@ðDÁ@üDÂA0DÁA8DÂA@DÃAPDÄA„DÅAÀDÄAÄDÅAÈDÆAÜDÇBDJEBDJFB4DJHBPDJIBTDJHBXDJIB\DJKBdDJLBpDJKBtDJLBxDÊB DJEB¬DJFBÈDJHBàDJIBäDJHBèDJIBìDJKBôDJLCDJKCDJLCDËC0DÌC<DJECtDJFCDJHC°DJIC´DJHC¸DJIC¼DJKCÄDJLCÐDJKCÔDJLCØDÍDDJED DJFD(DJHD@DJIDDDJHDHDJIDLDJKDTDJLD`DJKDdDJLDhDÎDDÏDœDÐDÐDÏDØDÐDàDÑDðDÒE$DÓE`DÒEdDÓEhDÔE|DØE°DÔE´DÕE¸DØE¼DÙEÌDÚEÔDÙEØDÚEÜDÛEàDÜEðDÛEôDÜEøDÝEüDÞF DÝFDÞFDßFDàF(DßF,DàF0DJEF4DJFFPDJHFdDJIFhDJHFlDJIFpDJKFxDJLF„DJKFˆDJLFŒDáF´DJEFÀDJFFÜDJHFðDJIFôDJHFøDJIFüDJKGDJLGDJKGDJLGDâG@DãGLDJEG€DJFGœDJHG°DJIG´DJHG¸DJIG¼DJKGÄDJLGÐDJKGÔDJLGØDäHDJEH DJFH(DJHH<DJIH@DJHHDDJIHHDJKHPDJLH\DJKH`DJLHdDåHŒDæH˜DçHÈDæHÐDçHØDèHèDéIDêILDéIXDêI\DëIlDìI„DíI´DìI¸DíI¼DJEIÄDJFIàDJHIôDJIIøDJHIüDJIJDJKJDJLJDJKJDJLJDîJDDJEJPDJFJlDJHJ€DJIJ„DJHJˆDJIJŒDJKJ”DJLJ DJKJ¤DJLJ¨DïJÐDðJÜDJEKDJFK,DJHK@DJIKDDJHKHDJIKLDJKKTDJLK`DJKKdDJLKhDñKDJEKœDJFK¸DJHKÌDJIKÐDJHKÔDJIKØDJKKàDJLKìDJKKðDJLKôDòLDóL(DôLXDóL`DôLhDõLxDöL¬D÷LÜDöLèD÷LìDøLøDùMDÿMTDM\DM`DMlDMpDMtDJEMxDJFM”DJHM¨DJIM¬DJHM°DJIM´DJKM¼DJLMÈDJKMÌDJLMÐD NDJEN DJFN(DJHN<DJIN@DJHNDDJINHDJKNPDJLN\DJKN`DJLNdD ND NœDJENÔDJFNðDJHODJIODJHO DJIODJKODJLO$DJKO(DJLO,D O`DJ™OlD OpDJ™OtDJšOŒDJœO¤DJO¬DJŸO´DJ OÄDJŸOÈDJ OÌD PDP0DPdDPhDPlDJEP¤DJFPÀDJHPÔDJIPØDJHPÜDJIPàDJKPèDJLPôDJKPøDJLPüDQ0DJEQ<DJFQXDJHQlDJIQpDJHQtDJIQxDJKQ€DJLQŒDJKQDJLQ”DQÀDQÌDJERDJFR DJHR4DJIR8DJHR<DJIR@DJKRHDJLRTDJKRXDJLR\DRDJ™RœDR DJ™R¤DJšR¼DJœRÔDJRÜDJŸRäDJ RôDJŸRøDJ RüDS0DS`DSDS”DJES DJFS¼DJHSÐDJISÔDJHSØDJISÜDJKSäDJLSðDJKSôDJLSøD T DpT\DJETpDJFTŒDJHT DJIT¤DJHT¨DJIT¬DJKT´DJLTÀDJKTÄDJLTÈD!TðD"TüD#U4DJEU8DJFUTDJHUhDJIUlDJHUpDJIUtDJKU|DJLUˆDJKUŒDJLUD#UÀD$UÌD%VD&V@D'VDDJEVHDJFVdDJHVxDJIV|DJHV€DJIV„DJKVŒDJLV˜DJKVœDJLV D*VÐDJEVÜDJFVøDJHW DJIWDJHWDJIWDJKW DJLW,DJKW0DJLW4D+W`DJEWlDJFWˆDJHWœDJIW DJHW¤DJIW¨DJKW°DJLW¼DJKWÀDJLWÄD,WðD-WüD.X0D-X<D.X@D-XDD.XHD/XTD0XXD/X\D0XhD1X¤D2XàD1XäD2XèDJEXðDJFY DJHY DJIY$DJHY(DJIY,DJKY4DJLY@DJKYDDJLYHD3YpDJEY|DJFY˜DJHY¬DJIY°DJHY´DJIY¸DJKYÀDJLYÌDJKYÐDJLYÔD4YüDJEZDJFZ$DJHZ8DJIZ<DJHZ@DJIZDDJKZLDJLZXDJKZ\DJLZ`D5ZˆD6Z”D7ZÄD6ZÐD7ZØD8ZäD9ZèD8ZìD9ZøD:[(D<[XD:[\D<[`DJE[hDJF[„DJH[˜DJI[œDJH[ DJI[¤DJK[¬DJL[¸DJK[¼DJL[ÀD=[èDJE[ôDJF\DJH\$DJI\(DJH\,DJI\0DJK\8DJL\DDJK\HDJL\LD>\tDJE\€DJF\œDJH\°DJI\´DJH\¸DJI\¼DJK\ÄDJL\ÐDJK\ÔDJL\ØD?]D@] DJE]@DJF]\DJH]pDJI]tDJH]xDJI]|DJK]„DJL]DJK]”DJL]˜DA]ÀDJE]ÌDJF]èDJH]üDJI^DJH^DJI^DJK^DJL^DJK^ DJL^$DB^LDJE^XDJF^tDJH^ˆDJI^ŒDJH^DJI^”DJK^œDJL^¨DJK^¬DJL^°DC^ØDD^äDE_DD_DE_ DF_0DG_8DH_DDI_PDM_\DJ_`DK_dDL_hDJE_lDJF_ˆDJH_œDJI_ DJH_¤DJI_¨DJK_°DJL_¼DJK_ÀDJL_ÄDN_ìDJE_øDJF`DJH`(DJI`,DJH`0DJI`4DJK`<DJL`HDJK`LDJL`PDO`xDP`„DQ`¸DJ™`ÀDJš`ÜDJœ`ôDJ`üDJŸaDJ aDJŸaDJ aDQaDDRapDSa¤DRa¨DSa¬DJEaàDJFaüDJHbDJIbDJHbDJIbDJKb$DJLb0DJKb4DJLb8DWb`DJEblDJFbˆDJHbœDJIb DJHb¤DJIb¨DJKb°DJLb¼DJKbÀDJLbÄDXbìDYbøDZc(DYc0DZc4DYc8DZc<D[cLDJEc€DJFcœDJHc°DJIc´DJHc¸DJIc¼DJKcÄDJLcÐDJKcÔDJLcØD\dD]d D^d(D_d\D^d`D_ddD`dxDbd|D`d€Dad„DbdˆDcdœDddÌDcdÐDddÔDedäDfdìDgdðDheDie<DjepDpe¨DqeÔDpeØDqeÜDrfDqfDrfDsfLDrfPDsfTDtfˆDsfŒDtfDufÄDtfÈDufÌDvgDugDvgDyg<Dvg@DygDDzgPDygTDzgXD{g\D|ghDJEg€DJFgœDJHg°DJIg´DJHg¸DJIg¼DJKgÄDJLgÐDJKgÔDJLgØD}hDJEh DJFh(DJHh<DJIh@DJHhDDJIhHDJKhPDJLh\DJKh`DJLhdD~hŒDh˜DJEhÌDJFhèDJHhüDJIiDJHiDJIiDJKiDJLiDJKi DJLi$D€iLDJEiXDJFitDJHiˆDJIiŒDJHiDJIi”DJKiœDJLi¨DJKi¬DJLi°DiØD‚iäDƒjD‚jDƒj D‚j$Dƒj(D„j4D…j8D„j<D…jHD†jxD‡j¨D†j¬D‡j°DJEj¸DJFjÔDJHjèDJIjìDJHjðDJIjôDJKjüDJLkDJKk DJLkDˆk8DJEkDDJFk`DJHktDJIkxDJHk|DJIk€DJKkˆDJLk”DJKk˜DJLkœD‰kÄDŠkÐDJElDJFl DJHl4DJIl8DJHl<DJIl@DJKlHDJLlTDJKlXDJLl\D‹l„DJElDJFl¬DJHlÀDJIlÄDJHlÈDJIlÌDJKlÔDJLlàDJKläDJLlèDŒmDmDŽmLDmTDŽmXDm\DŽm`DmlDmpDmtDm€D‘m°D“màD‘mäD“mèDJEmðDJFn DJHn DJIn$DJHn(DJIn,DJKn4DJLn@DJKnDDJLnHD”npDJEn|DJFn˜DJHn¬DJIn°DJHn´DJIn¸DJKnÀDJLnÌDJKnÐDJLnÔD•nüD–oDJEo<DJFoXDJHolDJIopDJHotDJIoxDJKo€DJLoŒDJKoDJLo”D—o¼DJEoÈDJFoäDJHoøDJIoüDJHpDJIpDJKp DJLpDJKpDJLp D˜pHD™pTDJEpˆDJFp¤DJHp¸DJIp¼DJHpÀDJIpÄDJKpÌDJLpØDJKpÜDJLpàDšqDJEqDJFq0DJHqDDJIqHDJHqLDJIqPDJKqXDJLqdDJKqhDJLqlD›q”Dœq DJEqÔDJFqðDJHrDJIrDJHr DJIrDJKrDJLr$DJKr(DJLr,DrTDJEr`DJFr|DJHrDJIr”DJHr˜DJIrœDJKr¤DJLr°DJKr´DJLr¸DžràDŸrìD s DŸs$D s(D¡s<D©s@D¡sDD¢sHD£sTD¤s`D¥slD¦spD§stD¨sxD©s|DªsŒD«s˜DJEsœDJFs¸DJHsÌDJIsÐDJHsÔDJIsØDJKsàDJLsìDJKsðDJLsôD¬tDJ™t(D­t,DJ™t0DJštHDJœt`DJthDJŸtpDJ t€DJŸt„DJ tˆD­t°D®tàD¯uD®uD¯uDJEuPDJFulDJHu€DJIu„DJHuˆDJIuŒDJKu”DJLu DJKu¤DJLu¨D³uÐD´uÜDµuøD¶v,Dµv0D¶v4D·vHD¹vLD·vTD¸vXD¹v\DºvtDJEv¨DJFvÄDJHvØDJIvÜDJHvàDJIväDJKvìDJLvøDJKvüDJLwD»w(D¼w4D½wPD¾w„D½wˆD¾wŒD¿w DÁw¤D¿w¨DÀw¬DÁw°DÂwÄDÃwôDÂwøDÃwüDÄx DÅxDÇx(DÆx,DJEx0DJFxLDJHx`DJIxdDJHxhDJIxlDJKxtDJLx€DJKx„DJLxˆDÈx°DJ™x¼DÉxÀDJ™xÄDJšxÜDJœxôDJxüDJŸyDJ yDJŸyDJ yDÉyDDÊypDËy¤DÊy¨DËy¬DÎyÜDÏzDÎzDÏzDÐzHDÙz„DÚzDÙz”DÚz˜DJEzœDJFz¸DJHzÌDJIzÐDJHzÔDJIzØDJKzàDJLzìDJKzðDJLzôDÝ{ DJE{,DJF{HDJH{\DJI{`DJH{dDJI{hDJK{pDJL{|DJK{€DJL{„DÞ{°Dß{¼DJE{ôDJF|DJH|$DJI|(DJH|,DJI|0DJK|8DJL|DDJK|HDJL|LDà|€DJ™|ŒDá|DJ™|”DJš|¬DJœ|ÄDJ|ÌDJŸ|ÔDJ |äDJŸ|èDJ |ìDá} Dâ}PDã}„Dâ}ˆDã}ŒDJE}ÄDJF}àDJH}ôDJI}øDJH}üDJI~DJK~DJL~DJK~DJL~Dæ~PDJE~\DJF~xDJH~ŒDJI~DJH~”DJI~˜DJK~ DJL~¬DJK~°DJL~´Dç~àDè~ìDJE$DJF@DJHTDJIXDJH\DJI`DJKhDJLtDJKxDJL|Dé°DJ™¼DêÀDJ™ÄDJšÜDJœôDJüDJŸ€DJ €DJŸ€DJ €Dê€PD뀀D쀴D뀸D쀼D¹€ôDóDö@Dø„DùˆDøŒDùDú”DýÐDÿ‚Dþ‚Dÿ‚DJE‚ DJF‚(DJH‚@DJI‚DDJH‚HDJI‚LDJK‚TDJL‚`DJK‚dDJL‚hD‚D‚œD‚ðDƒ Dƒ,Dƒ0Dƒ4Dƒ8Dƒ<DJ™ƒ@DJšƒ\DJœƒtDJƒ|DJŸƒ„DJ ƒ”DJŸƒ˜DJ ƒœDƒÐD „D„PD „TD„\D„D„”D„œD„ÐD„ÔD„ÜD…D…D…D…PD…TD…\D…D…”D…œD…ÐD…ÔD…ØD…ÜD…àD…èD…ìD…ðD…ôD†D†D†TD†”D"†ÜD%‡D(‡DD)‡˜D*‡œD+‡ðD,‡ôD-ˆDD.ˆHD2ˆ˜D3ˆ¤D4ˆìD5‰,D6‰<D7‰HD8‰D9‰ÄD8‰ÈD9‰ÌD:‰üD@Š0DKŠTDLŠ˜DOŠÜDW‹ DX‹dDY‹¤Dm‹ìDnŒ$DoŒ\DrŒ”DuŒÈDÜDñ<DÿTDŒDÄDüDŽ0D ŽlD ޤDŽÜDDLD€D¼DüD 4D!tDO¬DQÀDRüDS‘4DT‘lDU‘ DV‘ÐDa’D¼’<D½’`D¿’„DÀ’¨DÂ’ÌDÅ’ðDÊ“DË“8DÍ“\DΓ€DГ¤DÓ“ÈDØ“ìDá”Dâ”4Dä”XDå”|Dç” Dê”ÄDî”èDï• Dñ•0Dò•TDô•xD÷•œD •ÀD •äD –D–,D–PD–tD*–˜D+–¼D,–àD.—D3—(D4—LD5—pD7—”D=—¸D>—ÜD?˜DA˜$DB˜HDC˜lDE˜DN˜´DO˜ØDW™DX™$DZ™HD\™lD]™D_™´Db™ØDd™üDgš D|šDD}šhD~šŒD€š°DšÔDƒšøDˆ›D‰›@D‹›dDŒ›ˆDŽ›¬D”›ÐD•›ôD—œD˜œ<Dšœ`D›œ„Dœ¨DžœÌD œðD©D¬8D³`D´„D¶¨D¹ÌD»ðD¼žD¾ž8DÁž\DÞ€DÈž¤DÝžÈDÞžìDàŸDæŸ4DçŸXDéŸ|DŸ DBŸÈDGŸàDH  DI `DJ  DK àDL¡ DM¡`DN¡DO¡ÐDP¢DS¢ DT¢`DU¢DV¢ÀDW¢ðDX£ DY£PDZ£€D[£°D\£àD]¤D^¤@D_¤pD`¤ Da¤ÐDb¥Dc¥0Dd¥`De¥ D‡¥ðD¹¦ Dg¦ l©$Ë0lê@Ëlþ ËLm ËPm"€̤m7€Í\mO€Î`mg€Ïdm€€Ðhm™€Ñlm±€ÒpmÇ€ÓtmÞ€Ôxm÷€Õ|n @Ön@×n.@Øn?@ÙnR@Únh@Ûnƒ@Ünœ@Ýn±@ÞnÄ@ßnÝ@ànô@áo€â¸o!€ã´o3€ä°oC€å¬o^€æ¨os@ço„@èoœ@éo­@êo¼€ë€oÊ€ì„oØ€íˆoæ€îŒoô€ïp€ð”p€ñ˜p€òœp,@óp;€ô pJ@õp\€öXpk&÷¬°pƒ€p¡À0p¢@JDp«ÀLp¬@JHpµÀ€p¶àÐp·àÐp¸@pÃÀ pÄ@JDpÍÀ pÎà pÏà pÐ@pÛÀ pÜ@JDpåÀ pæà Ppçà Ppè@póÀ ppô@JDpýÀ ppþ@JHqÀ pqà Àq à Àq à Àq @JVqÀ!Lqà!Pq@JVq%À!Tq&à!ˆq'@JVq3À!Üq4à!àq5@JVqAÀ!èqBà"qC@J_ qOÀ"tqPà"xqQ@J_ q]À"|q^à"Üq_@*qjÀ+Àqk@JDqtÀ+Àquà+Äqvà+Äqw@*q‚À+Ìqƒ@JDqŒÀ+Ìq@JHq–À+üq—à,Pq˜à,Pq™à,Pqš@dq£@dq®À1lq¯@J˜q¸À1lq¹à1pqºà1pq»@dqÄ@dqÏÀ1xqÐ@J˜qÙÀ1xqÚà1|qÛà1|qÜ@dqå@dqðÀ1„qñ@J˜qúÀ1„qû@JœrÀ1´rà2rà2rà2r@JVrÀ5€rà5„r@JVr"À5Œr#à5Àr$@JVr0À6`r1à6dr2@JVr>À6lr?à6 r@@J_ rLÀ7rMà7rN@J_ rZÀ7r[à7lr\@JDreÀ>€rf@JHroÀ>°rpà?rqà?rr@JDr{À? r|@JHr…À?@r†à?r‡à?rˆ@JDr‘À?Ôr’@JHr›À@rœà@`rà@`rž@JDr§À@lr¨@JHr±À@ r²à@ðr³à@ðr´@JDr½ÀBr¾@JHrÇÀBPrÈàB rÉàB rÊ@JDrÓÀB¬rÔ@JHrÝÀBàrÞàC0rßàC0rà@JDréÀCtrê@JHróÀC°rôàDrõàDrö@JDrÿÀD s@JHs ÀD@s àDs àDs @JDsÀF4s@JHsÀFds àF´s!àF´s"@JDs+ÀFÀs,@JHs5ÀFðs6àG@s7àG@s8@JDsAÀG€sB@JHsKÀG°sLàHsMàHsN@JDsWÀH sX@JHsaÀH<sbàHŒscàHŒsd@JDsmÀIÄsn@JHswÀIôsxàJDsyàJDsz@JDsƒÀJPs„@JHsÀJ€sŽàJÐsàJÐs@JDs™ÀKsš@JHs£ÀK@s¤àKs¥àKs¦@JDs¯ÀKœs°@JHs¹ÀKÌsºàLs»àLs¼@JDsÅÀMxsÆ@JHsÏÀM¨sÐàNsÑàNsÒ@JDsÛÀN sÜ@JHsåÀN<sæàNsçàNsè@JDsñÀNÔsò@JHsûÀOsüàO`sýàO`sþ@ tÀOlt@J˜tÀOltàOptàOpt@ tÀOtt@J˜t'ÀOtt(@Jœt1ÀO¤t2àPt3àPt4àPt5@JDt>ÀP¤t?@JHtHÀPÔtIàQ0tJàQ0tK@JDtTÀQ<tU@JHt^ÀQlt_àQÀt`àQÀta@JDtjÀRtk@JHttÀR4tuàRtvàRtw@t€ÀRœt@J˜tŠÀRœt‹àR tŒàR t@t–ÀR¤t—@J˜t ÀR¤t¡@JœtªÀRÔt«àS0t¬àS0t­àS0t®@JDt·ÀS t¸@JHtÁÀSÐtÂàT tÃàT tÄ@JDtÍÀTptÎ@JHt×ÀT tØàTðtÙàTðtÚ@#tãÀU8tä@JDtíÀU8tî@JHt÷ÀUhtøàUÀtùàUÀtúàUÀtû@JDuÀVHu@JHuÀVxuàVÐuàVÐu@JDuÀVÜu@JHu$ÀW u%àW`u&àW`u'@JDu0ÀWlu1@JHu:ÀWœu;àWðu<àWðu=@JDuFÀXðuG@JHuPÀY uQàYpuRàYpuS@JDu\ÀY|u]@JHufÀY¬ugàYüuhàYüui@JDurÀZus@JHu|ÀZ8u}àZˆu~àZˆu@JDuˆÀ[hu‰@JHu’À[˜u“à[èu”à[èu•@JDužÀ[ôuŸ@JHu¨À\$u©à\tuªà\tu«@JDu´À\€uµ@JHu¾À\°u¿à]uÀà]uÁ@JDuÊÀ]@uË@JHuÔÀ]puÕà]ÀuÖà]Àu×@JDuàÀ]Ìuá@JHuêÀ]üuëà^Luìà^Luí@JDuöÀ^Xu÷@JHvÀ^ˆvà^Øvà^Øv@JDv À_lv @JHvÀ_œvà_ìvà_ìv@JDv"À_øv#@JHv,À`(v-à`xv.à`xv/@Qv8@QvAÀ`ÀvB@J˜vKÀ`ÀvL@JœvUÀ`ôvVàaDvWàaDvXàaDvY@JDvbÀaàvc@JHvlÀbvmàb`vnàb`vo@JDvxÀblvy@JHv‚Àbœvƒàbìv„àbìv…@JDvŽÀc€v@JHv˜Àc°v™àdvšàdv›@JDv¤Àg€v¥@JHv®Àg°v¯àhv°àhv±@JDvºÀh v»@JHvÄÀh<vÅàhŒvÆàhŒvÇ@JDvÐÀhÌvÑ@JHvÚÀhüvÛàiLvÜàiLvÝ@JDvæÀiXvç@JHvðÀiˆvñàiØvòàiØvó@JDvüÀj¸vý@JHwÀjèwàk8wàk8w @JDwÀkDw@JHwÀktwàkÄwàkÄw@JDw(Àlw)@JHw2Àl4w3àl„w4àl„w5@JDw>Àlw?@JHwHÀlÀwIàmwJàmwK@JDwTÀmðwU@JHw^Àn w_ànpw`ànpwa@JDwjÀn|wk@JHwtÀn¬wuànüwvànüww@JDw€Ào<w@JHwŠÀolw‹ào¼wŒào¼w@JDw–ÀoÈw—@JHw Àoøw¡àpHw¢àpHw£@JDw¬Àpˆw­@JHw¶Àp¸w·àqw¸àqw¹@JDwÂÀqwÃ@JHwÌÀqDwÍàq”wÎàq”wÏ@JDwØÀqÔwÙ@JHwâÀrwãàrTwäàrTwå@JDwîÀr`wï@JHwøÀrwùàràwúàràwû@JDxÀsœx@JHxÀsÌxàtxàtx@­xÀt(x@J˜x$Àt(x%àt,x&àt,x'@­x0Àt0x1@J˜x:Àt0x;@JœxDÀt`xEàt°xFàt°xGàt°xH@JDxQÀuPxR@JHx[Àu€x\àuÐx]àuÐx^@JDxgÀv¨xh@JHxqÀvØxràw(xsàw(xt@JDx}Àx0x~@JHx‡Àx`xˆàx°x‰àx°xŠ@Éx“Àx¼x”@J˜xÀx¼xžàxÀxŸàxÀx @Éx©ÀxÄxª@J˜x³ÀxÄx´@Jœx½Àxôx¾àyDx¿àyDxÀàyDxÁ@JDxÊÀzœxË@JHxÔÀzÌxÕà{ xÖà{ x×@JDxàÀ{,xá@JHxêÀ{\xëà{°xìà{°xí@JDxöÀ{ôx÷@JHyÀ|$yà|€yà|€y@áy À|Œy @J˜yÀ|Œyà|yà|y@áy"À|”y#@J˜y,À|”y-@Jœy6À|Äy7à} y8à} y9à} y:@JDyCÀ}ÄyD@JHyMÀ}ôyNà~PyOà~PyP@JDyYÀ~\yZ@JHycÀ~Œydà~àyeà~àyf@JDyoÀ$yp@JHyyÀTyzà°y{à°y|@êy…À¼y†@J˜yÀ¼yàÀy‘àÀy’@êy›ÀÄyœ@J˜y¥ÀÄy¦@Jœy¯Àôy°à€Py±à€Py²à€Py³@JDy¼À‚ y½@JHyÆÀ‚@yÇà‚yÈà‚yÉ@J˜yÒÀƒ@yÓ@JœyÜÀƒtyÝàƒÐyÞàƒÐyßà¦@yà$‘N¦@yá¬Ø.¦@Dj¦@D€¦LDj¦PD€¦TDj¦XD€¦`Dk¦dDj¦hD€¦tD}¦xD~¦|D¦€D}¦„D€¦ˆD~¦ŒD¦Dj¦”D€¦œDp¦¤D}¦¨D~¦¬D¦°Dk¦´Dl¦¸D€¦¼D¦ÐD‚§Dƒ§@D„§xD‡§°Dˆ§´D§¸D‡§ÀDˆ§ÈD‰§ÔDЧäD‹§ôDŒ¨D’¨D¨D’¨D¨ D’¨$D¨,D“¨0D’¨4D“¨<D”¨@DJE¨DDJF¨`DJH¨€DJI¨ˆDJK¨DJL¨œDJK¨ DJL¨¤D”¨ÐD•©DJE©DJF© DJH©4DJI©<DJK©PDJL©\DJK©`DJL©dD•©D7©ìD–ªD—ª€D˜ª°D™ªàDš«@D›«LD«D¦«˜D§«¬D¦«°D§«¸D¨«¼DJE«ÀDJF«ÜDJH«ðDJI«øDJK¬DJL¬ DJK¬DJL¬D¨¬<D©¬„DJE¬ˆDJF¬¤DJH¬¸DJI¬ÀDJK¬ÔDJL¬àDJK¬äDJL¬èD©­Dª­TD«­¸D¬­äD­®D®®xD¯®D±®ÐD²®àDº¯D»¯Dº¯D»¯ D¾¯$DJm¯(D¾¯,DJm¯0DJn¯<DJo¯DD¾¯LDJo¯TD¾¯XDJo¯\D¾¯dD¿¯DÀ¯èDÁ°DJm°DJn°$DJo°4DÁ°DDJo°LDÁ°TD7°tD°ŒDðÔDıDJE±DJF± DJH±4DJI±<DJK±PDJL±\DJK±`DJL±dDıŒDűÔDJE±ØDJF±ôDJH²DJI²DJK²$DJL²0DJK²4DJL²8DŲ`DƲœDDzØDͲÜDDzäDȲðDɲôDʲøDȲüDͳDγDDϳpDгœDJm³ DJn³¬DJo³¼DгÄDJo³ÈDгÔDѳàDÒ´ DÓ´LDJE´PDJF´lDJH´€DJI´ˆDJK´œDJL´¨DJK´¬DJL´°DÓ´ØDÔµ DJEµDJFµ,DJHµ@DJIµHDJKµ\DJLµhDJKµlDJLµpDÔµ˜DÕµÄDÖ¶ DܶDÖ¶D×¶$Dض(DÙ¶,D×¶0Dܶ4Dݶ„DÞ¶°Dß¶ÜDJE¶àDJF¶üDJH·DJI·DJK·0DJL·<DJK·@DJL·DDß·lDà·œDá·¸Dé·¼Dá·ÄDã·ÌDä·ÐDå·ÔDâ·ØDé·ÜDê¸<Dë¸hD츔Dñ¸ÄDò¹Dó¹PDô¹€Dõ¹˜Dö¹´D÷¹èDøº8DùºdDúºDûº¼DºìDºøDºüD»D»D »$DJE»lDJF»ˆDJH»œDJI»¤DJK»¸DJL»ÄDJK»ÈDJL»ÌD »ôDJE¼8DJF¼TDJH¼hDJI¼pDJK¼„DJL¼DJK¼”DJL¼˜D ¼ÀD ½DJE½DJF½$DJH½8DJI½@DJK½TDJL½`DJK½dDJL½hD ½D½ÄD½øD½üD¾D¾D¾ D¾dD¾D¾¼D¾èD¿,D ¿0D¿<D¿DD ¿HD!¿„D"¿°D#¿ÜD%¿àD#¿èD$¿ðD%¿øD&ÀDD'ÀpD/ÀÐD.ÀÜD/ÀìD7ÀôD8ÁD9ÁPD:ÁD;ÁÐD<ÂD=Â0D@Â@DA€DB°DCÂàDDÃDEÃ@DFÃpDGàDHÃÐDIÄDJÄ0DKÄpDMÄÀy÷$j¦@z:@jzN jÌz` jÐzr€kTz„€lLz”€mPz¯€nHzÊ€oXzå€p\zú€ql{€rh{ @s{>@t{M€u`{[@v{j@w{y@x{ˆ@y{—@z{¦@{{µ&|¬Ø{Í€{ëÀ¦@{ì@”{õÀ¨D{ö@JH{ÿÀ¨€|à¨Ð|à¨Ð|@•| À©| @JH|À©4|à©|à©|@¨|!À«À|"@JH|+À«ð|,à¬<|-à¬<|.@©|7À¬ˆ|8@JH|AÀ¬¸|Bà­|Cà­|D@¾|PÀ¯(|Qà¯,|R@¾|^À¯0|_à¯L|`@¾|lÀ¯T|mà¯X|n@¾|zÀ¯\|{à¯d||@Á|ˆÀ°|‰à°D|Š@Á|–À°L|—à°T|˜@Ä|¡À±|¢@JH|«À±4|¬à±Œ|­à±Œ|®@Å|·À±Ø|¸@JH|ÁÀ²|Âà²`|Ãà²`|Ä@Ð|ÐÀ³ |Ñà³Ä|Ò@Ð|ÞÀ³È|ßà³Ô|à@Ó|éÀ´P|ê@JH|óÀ´€|ôà´Ø|õà´Ø|ö@Ô|ÿÀµ}@JH} Àµ@} ൘} ൘} @ß}À¶à}@JH}À·} à·l}!à·l}"@JH}+À»œ},à»ô}-@JH}6À¼h}7à¼À}8@ }AÀ½}B@JH}KÀ½8}Là½}Mà½}NàÄè}O$¨NÄè}P¬ð.ÄðDPÄðDiÄøDPÄüDiÅDPÅDiÅDQÅDPÅDiÅDgÅ DhÅ$DgÅ(DiÅ,DhÅ0DPÅ4DiÅ<DdÅDDgÅHDhÅLDQÅPDTÅTDaÅXDbÅ\DiÅ`DjÅtDkÅ DlÅØDmÆDpÆ@DqÆDDtÆHD}ÆLDtÆTDpÆXDqÆ`DrÆlDsÆ|DzÆŒD}ÆDzÆ”D}ÆœD~ÆðD„Ç D…Ç,D†Ç€D‡ǰDŽÇÀDÇÔD“ÈDÈD”ÈD“È DÈD“ÈD”ÈD˜ÈPD•ÈXD˜È\D²ÈpD»È”DÏȸDòÈÐD™ÉDÉPDšÉpD›É DœÉèDžÊ0DŸÊ8DžÊ<DŸÊ@D ÊDD£Ê`D¤ÊpDJWÊ D¤ʤDJWʬDJXʼDJRÊÈD¥ÊàD¦ÊìDJWË D¨Ë$D§Ë(D¨Ë,DJWË0DJXË@DJRËLD©ËpDªË|DJ`˰D¬Ë´D«˸D¬˼DJ`ËÀDJaËÌDJRËôDJeÌD­ÌD®Ì@D±ÌdD®ÌhD±ÌlD²Ì€D³Ì´D¹ÌàD´ÌäDµÌèD¹ÌìDºÌôD»ÍD¼Í(D¿Í`D¼ÍdD¿ÍhDÁÍlDÂÍ„DÃÍ´DÄ͸DÃͼDåÍÀDÁÍàDÈÍäDÁÍèDÈÍøDÁÍüDÈÎDÉÎ8DÈÎ<DÉÎDDÌÎxDÉÎ|DÌ΀DÉ΄DÌΈDÍÎDÎΘDÏΤDÒμDåÎèDJEÏ DJFÏ<DJHÏPDJIÏTDJHÏXDJIÏ\DJKÏdDJLÏpDJKÏtDJLÏxDéÏ DêϬDëÏÀDîÏÄDëÏÈDìÏÐDíÏØDîÏäDïÏèDðÏøDñÐDòÐ$DóÐ@DôÐtDõдDöÐàDûÐäD÷ÐèDûÐìDJ™ÐôDJšÑDJœÑ0DJÑ8DJŸÑ@DJ ÑPDJŸÑTDJ ÑXDÑ€DѰDæÑ´D ÑÀD ÑÐDÒDÒDÒXDÒ„DÒ DÒÀDÓDÓ@D Ó€D#ÓD$ÓÐD%ÔD&Ô0D'Ô`D(ÔD)ÔÀD*ÔðD+Õ D,ÕPD-Õ€D.Õ°D/ÕàD0Ö D®ÖpDæÖD2Ö }f$PÄð}­@P}Á P¼}Ó PÀ}å€QD~€R<~€S@~3€T8~H@U~Y@V~j@W~~@X~“@Y~°@Z~È@[~Ù@\~ì@]@^@_!€aH/€bL=€dPK@e\&f¬ðt€’ÀÄð“@JVŸÀÊ  àʤ¡@JV­Àʬ®àÊà¯@JV»ÀË ¼àË$½@JVÉÀË0ÊàËpË@J_ ×À˰ØàË´Ù@J_ åÀËÀæàÌç@JDðÀÏ ñ@JHúÀÏPûàÏ üàÏ ý@J˜€ÀÐô€@Jœ€ÀÑ0€àÑ€€àÑ€€àÖ¸€$ÈNÖ¸€­.ÖÀD6ÖÀDkÖØD6ÖÜDkÖäD7ÖèD6ÖìDkÖðDeÖøDfÖüDg×Dh×Di×Dj× De×Df×Dg×Dh×Dk× Di×$Dj×(D6×,Dk×4D]×<De×@Df×DDg×HDh×LDi×PDj×TD7×XD>×\D[×`D\×dDk×hDl×€Dm×ÈDnØDoØ8DrØpDsØtDzØxDrØ€Ds؈DtØ”DuؤDvØ´DwØÄDxØÔDyØäDˆØôD‹ÙDŒÙDÙ@DÙDDÙHDÙTD‘ÙXDÙ\D‘Ù`D’ÙdD“ÙðD”ÚD•Ú D–Ú<DÚ@DžÚàD£ÛD¤Û°D©ÛàDµܰDÊÝDÎÝpDÒÝÔDÛÞ(DÜÞ|DßÞÐDâß(DçßtDßÔDà(Dà€DàÈD+áD.áPD4á¨D5áìD6â8D7âˆDDâÄDGãDZãTD[ã¨DdãüDiä\Djä¸Dkå DlåˆDmåðDnæXDoæÀDpç,DsçŒD€çìDè@D™è”DšèøDéLD¤é¨D¥êD¨êxD´êàD·ëTD¾ëÄD¿ì0DÂì˜DÆí DÊíhDÍí¼DÎî0DÛî¤Dáï Dâï€DèïôDéðXDëð¼Dìñ Dïñ€DôòDøòdDùòÈDó$D ó€D óäD ô<Dô”DôäDõ4Dõ„DõØDö(DöxDöÈD ÷D'÷`D*÷¨D1øD4øXDFø°DGù DKù€DLùàDMúPDVú¬DXû$DJoûDYû˜DJoû DYû¤DJoû´DYûÄDZüD\ü`D]ü¸DdýDgý`DjýÀD}þ D~þ„DþäD…ÿTD‰ÿ¬DŒÿüDlDàDž@D¤´D¥D§|D¨àD«@D°ÀDË D͘DÎøDÏPDÖ¨DáDJolDâtDJo|Dâ€DJo”Dâ DãàDå4DæDçäDî0DJo„DñŒDJo”Dñ˜DJo¨Dñ¸DòøDô LDõ  Dö èDý (D tD ÈD  D xD( äD) @D. ¬D3 $D8 œD;D<tDDàDI\DJoÈDJÐDJoØDJÜDJoìDJüDK@DM˜DNðDUHDX D[øDaXD©ÀD«ÌD¬ØD­èD°PDµ|D¶ŒD¾¸DÀØDÁàDÀäDÁèD¾ôDÂDDÅÀDÆðDÊôDÇøDÊüDÇDÊDËDÎ(DÒ@DÏDDÒHDÛ|DܘDݬDÞ¸DßÀDàØDá Dâ<Dá@DâDDãXDçˆDäŒDçDã”Dç˜Dè¬DéàDêäDðèDJEìDJFDJHDJI DJH$DJI(DJK0DJL<DJK@DJLDDðpDñ|D ¬Dó°D ´Dò¸Dó¼DòÀD ÄD ÐDðèD÷ìDððD÷DðD÷Dø@D÷DDøLDù€Dø„DùŒDüÀDùÄDüÈDùÌDüÐDýØDüÜDýàDþäDÿðD `DxDôDüDDD DpD D¤D¨D¬D´D¸DJEÈDJFäDJHDJIDJHDJI DJKDJL DJK$DJL(DPD\DxD”D)˜D+œD D ¤D"°D!¸D"¼D#ÀD$ÌD%ÔD&àD'äD(ðD)ôD+øD,D.D/$D0dD1¤D4ÐDJEðDJF DJH DJI$DJH(DJI,DJK4DJL@DJKDDJLHD5pD6|D7D8¬D9°DB´D9¸D8¼DDÀD9ÄD:ÐD;ØD<àD=ìD>ðD?üD@DA DBDCDDDE(DG0DHHDI€DJ´DMðDJôDMøDNDQ0DTdDQhDWpDZ D[ÄD\ÔD] D` 0Da DD` HDa LDd TDe hDf tDg |Dh ˆDi Dj  Dk ¸Dl ÔDm ðDn! Do!(Dp!<Dq!XDr!ŒDq!Dr!”Ds!ÀDr!ÈDs!ÌDt!ØDu" D€"@D"dD‚"tDƒ"¤Dˆ"ÔD‰"àD#D#œD#¤D#¨D#¬D‘#´D”$ D•$PD–$TD™$XD–$`D™$dD•$hD™$lDš$|D›$”DJW$ÄD›$ÈDJW$ÌDJX$äDJR$ðDœ% D%`Dž%xDŸ%¨DJW%¬DŸ%°DJW%´DJX%ÀDJR%ÌD %ìD¡&@DJW&lDJX&€DJR&ŒD¤&¤D¥&°D¦&ÈDJW&øD¦&üDJW'DJX'DJR'D¨'4D©'@DJW'lD«'pDª'tD«'xDJW'|DJX'ŒDJR'˜D¬'¸D­(DJ`(<DJa(LDJR(tDJe(D°( D±) D´)(Dµ)<DJE)@DJF)`DJH)tDJI)|DJK) DJL)°D¶)ÜD·*`D¸*xDB*¨DJE*ÀDJF*àDJH*ôDJI*øDJH*üDJI+DJK+DJL+DJK+DJL+D¾+DD¿+PDÀ+dDJW+”DÀ+˜DJW+ DJX+¸DJR+ÄDÁ+àDÂ,@DÃ,XDJW,ˆDÄ,ŒDJW,DJX,¨DJR,´DÅ,ÔDÆ-0DÇ-HDÈ-xDJW-|DÈ-€DJW-„DJX-œDJR-¨DÉ-ÈDÊ. DË.4DJW.dDÌ.hDJW.lDJX.|DJR.ˆDÍ. DÎ.¬DÏ.ÈDJW.øDÏ.üDÐ/DJW/DJX/DJR/DÑ/<DÒ/ DJ`/ÐDJa/àDJR0DJe00DÕ0<DÖ0´DÙ0ÌDÖ0ÔDÙ0ÜDÚ0èDÙ0ìDÚ0ðDÛ0ôDÜ1DÞ1Dá1$Dâ1@Dã1XDä1pDå1 Dè1°Dé1ÌDê1àDë2Dì2,Dí2DDî2xDí2|Dî2€Dï2¬Dð2ÈDô2øDð2üDñ3Dô3Dø3Dõ3 Dø3$Dù3@Dú3\D3dDú3lDü3pDú3tDû3|Dü3„Dý3ˆDü3ŒDý3”Dþ3˜Dÿ3¤D3¨D3¸D3èD4D4DD4HD4LD 4PD 4tDJm4xD 4|DJm4€D 4„DJm4ˆDJn4”DJo4 D 4´D 4ÀD4äD5D5D5 D58D5LD5`D5dD5hD5lD5xD5„D5D5œD5 D5¼D5ìD6DJm6 D6$D6,DJm60DJn6<DJo6HD6\D6hD6ŒD6¼D6ÀD6ÄD6ÈD6ÌD6ØD 6ìD!7D'7 D!7D"7D#7$D$7,D%78D&7<D'7@D(7PD)7€D*7°D+7ÄD17ÌD,7ÐD-7ÜD.7ìD07øD17üD28D48D28 D38$D48(D584D68dD78”D=8ÀDB9HDC9ÀDF9ìDG:DH:$DI:(DH:,DI:4DJ:`DK:pDL:€DM:°DN:ÄDO:ÈDN:ÌDO:ÔDQ;DO;DQ;DR;DS;$DR;(DS;,DV;0DW;DDX;HDY;dDJm;hDY;lDJm;pDJn;|DZ;D[;°D\;àD];üD^<Dd<D^<$D_<0D`<<DbDt>$Du>0Dx> D}>ÌD~>äD>ôDJW?$D?(DJW?0DJX?HDJR?TD€?pD?ÐD‚?èDJW@Dƒ@DJW@ DJX@8DJR@DD„@dD…@ÀD†@ØD‡ADJWA D‡ADJWADJXA,DJRA8DˆAXD‰A°DŠAÄDJWAôD‹AøDJWAüDJXB DJRBDŒB0DB<DŽBXDBˆDJWBŒDŽBDB”DJWB˜DJXB¤DJRB°DBÐD‘C0DJ`C`DJaCpDJRC˜DJeCÀD”CÐD•DDD˜D`D•DdD˜DhD™DxDD¬DžDÈDŸDàD DøD¡E(D¤E8D¥ETD¦EhD§E˜D¨E´D©EÌDªFD©FDªFD«F4D¬FPD°F€D¬F„D­FˆD°FŒD´F D±F¤D´F¨DµF¸D¼FäD½FìD¼FðD½FüD¼GD½GDÃGDÀG DÃGDÀGDÃGDÀG DÃG,DÄG<DËGhDÌG|DÍGˆDÎG¬DÏGÈDÐGÜDÖGàDÐGäDÑGðDÒGüDÓHDÔHDÖHD×H,DØH\DÙHDØH”DÙH˜DáHÈDâHäDJmHèDâHìDJmHðDJnHüDãIDäI0DåI`DæItDçIDèI¬DîI°DèI¸DéIÄDìIÐDêIÔDëIØDêIäDìIèDîIìDïIüDðJ,DñJ\DJmJ`DJnJlDòJ€DóJ DôJÐDõJìDöKD÷K$DýK(D÷K0DùK8DúKDDøKHDúKLDýKPDþKhDÿK˜DKÈDKäDKèDKìDKðDKôDKøDKüDL DLDLDL0D L8D LLD L€D L°DLàDMDM DMdDMxDM|DM€DM„DM˜D MÈD!MÌD MÐD'MÔD(MèD'MìD(MðD)ND*ND+ND,NLD-NTD.NXD-N\D.NhD/NxD0N|D1N¬D2N´D3N¸D2N¼D3NÈD4NØD5NÜD7O D8OD7OD8OD9O,D:O0D;O\D<OxD=OD>O”D=O˜D>O D?OÌDDPHDEP\DFPŒDIP˜DJP´DJmP¸DJP¼DJmPÀDJnPÌDKPàDLQDMQ0DNQLDOQ`DUQdDOQhDPQtDQQ€DRQDSQœDUQ¨DVQÄDWQôDXR(DWR,DXR0DYRHD[RPD\RdD]R˜D^RÈDaRôDbSDiS<DlSxDoS¬DvSÄDwSäDxT@DyT€DzTÀD{UD|UPD}U D~UðDV@D‚VXDƒV D„VàD…W D†W`D‡WDˆWÀD‰WðDŠX D‹XPDŒX€DX°DŽXàDYDY@D‘YpD’Y D“YÐD”ZD•Z0D–Z`D—ZD˜ZÀD™ZðDš[ D›[`D±[¨DÖ[ÄD•[àDv\@D\`€+$6ÖÀ€l@6€€ 6Œ€’ 6€¤€7x€¿€8L€Ø€9P€ï€:T€;X €<\:€=`R€>dg€?Ôw@@ˆ@A €BЯ@CÊ€DÌâ€EÈõ@F‚@G?‚€‚5@H‚I@I‚_@J‚v@K ‚Š@L‚ @M‚³€NÄ‚Ç@O‚Þ@P‚ò€QÀƒ €R¼ƒ!€S¸ƒ5@T ƒL€U´ƒi@Vƒƒ@Wƒ’€Xhƒ @Yƒ¯@Zƒ¾€[lƒÌ€\pƒÚ€]tƒè@^ƒ÷@_„€`H„@a„$@b„6@c„F&d­„^€„|ÀÖÀ„}@Y„‰Àû„Šàû˜„‹@Y„—Àû „˜àû¤„™@Y„¥Àû´„¦àûÄ„§@ℳÀl„´àt„µ@â„ÁÀ|„Âà€„Ã@â„ÏÀ”„Ðà „Ñ@ñ„ÝÀ„„ÞàŒ„ß@ñ„ëÀ”„ìà˜„í@ñ„ùÀ¨„úคû@J…ÀÈ…àÐ… @J…ÀØ…àÜ…@J…#Àì…$àü…%@ð….Àì…/@JD…8Àì…9@JH…BÀ…Càp…Dàp…Eàp…F@JD…OÀÈ…P@JH…YÀ…ZàP…[àP…\@JD…eÀð…f@JH…oÀ …pàp…qàp…r@JV…~À&l…à&¤…€@JV…ŒÀ&ø…à&ü…Ž@JV…šÀ'…›à'4…œ@J_ …¨À(<…©à( …ª@JH…³À)t…´à)Ü…µ@JD…¾À*À…¿@JH…ÈÀ*ô…Éà+D…Êà+D…Ë@JV…×À.d…Øà.h…Ù@JV…åÀ.l…æà. …ç@J_ …óÀ/Ð…ôà0<…õ@ †À4x†@Jl†À4x†à4|†à4|†@ †À4€† @Jl†.À4€†/à4„†0à4„†1@ †=À4ˆ†>@Jl†LÀ4ˆ†Mà4´†Nà4´†O@†[À6 †\@Jl†jÀ6 †kà6$†là6$†m@†yÀ60†z@Jl†ˆÀ60†‰à6\†Šà6\†‹@Y†—À;h†˜à;l†™@Y†¥À;p†¦à;†§@JV†³ÀAô†´àAø†µ@JV†ÁÀAü†ÂàB0†Ã@J_ †ÏÀC`†ÐàCІÑ@â†ÝÀHè†ÞàHì†ß@â†ëÀHð†ìàI†í@ñ†ùÀJ`†úàJ€†û@J‡ÀP¸‡àP¼‡ @J‡ÀPÀ‡àPà‡à\€‡$…ÀN\€‡­ .\€D\€D/\ŒD\D/\”D\˜D/\ D \¤D\¨D/\´D.\¸D/\¼D.\ÀD\ÄD/\ÌD \ÔD.\ØD/\ÜD0\ðD1]D2]LD3]„D6]°D7]´D8]¸D6]ÀD9]ÈD7]ÌD;]ØD>]äD?]èD@]ôDi^(Dx^XDy^„DA^°Dž^ôDB_ DC_XDD_„DM_ÐDN_àDO`DR`DO`DR`DS``DX`DY`”D\`ÐDJE`ØD\`ÜDJE`äDJF`üDJHaDJIaDJKa DJLa,DJKa0DJLa4D\a`D]aDJ‹a˜DJŒa DJaÀD^aèDJ‘bD]b$D^b8DdbPD_bTDdbXDgb`Dhb|Dib”Djb¨Dpb¬Djb´Dlb¼DmbÀDkbÄDpbÈDqbØDrcDwc@DxcXDyclDzcˆD{cÀD|cðD}dD~d0DYdpD‡d€D‰dÀDŠdÈD’dÜD“dðD•dôD“døD•eD”eD•eDgeTD–etD—e D˜e°D™eÜDfDhfDpf<DwfdD|fŒDžf´DŸfÐD gD¡g@D¤gPD¥gD¦gÀD§gðD¨h D©hPDªh€D«h°D¬hðD®i@‡/$\€‡g@‡{ ¼‡ À‡Ÿ€8‡¶€ <‡Ë@!‡Ü@"‡ð@#ˆ@$ˆ@%ˆ1@&ˆ@@(ˆO@)ˆ^@*ˆm@,ˆ~&-­ ˆ–€ˆ´À\€ˆµ@\ˆÀ@\ˆÉÀ`؈Êà`܈Ë@\ˆÖ@\ˆßÀ`äˆà@JHˆéÀaˆêàa`ˆëàa`ˆì@]ˆúÀa˜ˆûàaèˆü@]‰ Àb‰ àb$‰ ài`‰ $ àNi`‰­(.i`D2Œi`D2¯i|D2Œi€D2¯i„D2ŒiˆD2¯iD2Œi˜D2¯iœD2i D2¯i¤D2«i°D2i´D2Ži¸D2¥i¼D2¨iÀD2¯iÄD2°iÔD2±iØD2³iÜD2°iäD2±iìD2²iøD2·jD2ºjDJEjDJFj8DJHjPDJIjTDJHjXDJIj\DJKjdDJLjpDJKjtDJLjxD2ºj D2»kDJ‹kDJŒkDJk0D2¼kXDJ‘ktD2»k˜D2¼küD2¾l D2Äl$D2Ál0D2Äl4D2Çl8D2½l<D2¾l@D2ÄlDD2ÊlHD2ÇlLD2ÊlPD2ÎlÀD2ÔlÈD2ÎlÌD2ÔlÐD2Õm0D2Öm D2×mÐD2ÖmØD2×mÜD2Øn$D2ÙnPD2ÚndD2Ün°D2Ýn¸D2Ün¼D2ÝnÀD2ÞnÔD2ánðD2âoPDJWo€D2âo„DJWoŒDJXoœDJRo¨D2ãoÀD2äoÌD2åpDJWpD2æpD2åp D2æp$DJWp(DJXp8DJRpDD2çp`D2èplD2ép°DJ`p¸D2êp¼D2épÀD2êpÄDJ`pÈDJapÔDJRpüDJeq D2ëq,D2ìqhD2ïq€D2ìq„D2ïqˆD2ìqŒD2ïqD2ðqàD2ôqäD2ðqðD2ôqôD2ûr D2ôr$D2ûr(D2ôr,D2ûr0D2õr@D2örTD2÷rD2ör”D2÷r˜D3rœD2ûr¤D2ürÐD2ûrÔD2ürÜD2ÿsD2üsD2ÿsD2üsD2ÿs D3s(D2ÿs,D3s0D3s4D3s@D3s˜D3sàD3t D3 tD3tD3 tD3t D3t,D3t4D3 t8D3 thD3 t´D3 uD3uD3 u D3uD3uXD3uD3u D3uÌD3vD3!v<D3$vTD3%vdD3,vD3)vœD3,v D3)v¬D3,v°D3/v´D31w`D32wlD33wxD36w°D3;wèDJmwìD3;wðDJmwôDJnxDJox D3;x D3<x(D3=xDD3>xtD3=xxD3>x|D3=x„D3>xˆD3?x˜D3@x¬D3Bx°D3@x´D3Ax¸D3Bx¼D3CxÌD3DyD3Ey,D3HyXD3IyhD3LytD3My„D3LyˆD3MyŒD3PyD3Sy°D3VyÌD3WyèD3XyüD3ZzD3XzD3Yz D3ZzD3[z(D3\zXD3[zdD3\zhD3]zlD3^z¨D3dzðD3e{ D3d{D3e{D3f{D3h{<D3k{DD3n{dD3q{€D3r{œD3s{°D3u{´D3v{ìD3w|D3x|(D3y|\D3x|hD3y|lD3| D3ƒ|ÀD3„|ÈD3ƒ|ÌD3„|ÐD3‡|ÔD3ˆ|ØD3‡|àD3ˆ|äD3‰|èD3‹} D3Ž}D3‘}LD3Ž}PD3’}TD3‘}XD3’}\D3•}dD3˜}„D3›} D3œ}´D3ž}ÈD3}ÐD3ž}ÜD3Ÿ}ôD3 ~$D3Ÿ~(D3 ~,D3Ÿ~4D3 ~8D3¡~<D3¢~pD3¥~ÀD3¦~ÌD3¥~ÐD3¦~ÔD3­~ØD3®~øD3­~üD3®D3¯D3°D3±,D3²DD3´|D3º„D3·ŒD3ºD3»¤D3¼ÐD3½üDJ‹€DJŒ€ DJ€0D3¾€XDJ‘€pD3½€”D3¾€àD3À€øD3¿€üD3ÀD3ÃD3ÄD3Å$D3Ä(D3Å,D3È0D3Ë4D3È8D3Ë<D3È@D3ËDD3ÑLD3ÔPD3ÑTD3ÔXD3Ñ\D3Ô`D3ÃdD3ÝpD3ã„D3ä¬D3ã°D3ä¸D3ç¼D3èØD3çÜD3èàD3éäD3ë‚D3î‚D3ï‚8D3ð‚LD3ñ‚XD3ò‚\D3ó‚lD3ô‚€D3õ‚´D3ö‚àD3÷‚üD3øƒ0D3÷ƒ4D3øƒ8D3ùƒhD3úƒ”DJ‹ƒœDJŒƒ¤DJƒÀD3ûƒäDJ‘„D3ú„(D3û„tD3ü„”D3ý„œD4„ D3ü„¤D3ý„¨D4„¬D4„ÀD4 „ÄD4 „ÈD4 „ÌD4„ÐD4 „ÔD4 „ØD4„ÜD4„àD4 „äD4„èD4„ðD4„ôD4„øD4…D4… D4…D4…D4…D4…D4"… D4%…(D4"…,D4%…0D4"…4D4%…8D4+…@D4.…HD4+…LD4.…PD4+…TD4.…XD43…\D46…`D4?…dD49…lD4<…pD4?…tD3Ý…|D43…„D46…ˆD49…ŒD4?…D4B…°D3Ý…´D4B…¸D3Ý…ÀD4F…ÄD4I…ôD4O†D4P† D4O†D4P†D4Q†D4Y†(D4[†<D4_†„D4`†¨D4_†¬D4`†°D4a†´DJm†¸D4a†¼DJm†ÀDJn†ÌD4b†ØD4c‡D4d‡4DJm‡8D4d‡<DJm‡@DJn‡LDJo‡XD4d‡dD4e‡lD4f‡€D4g‡”D4i‡˜D4j‡´D4k‡èD4j‡ìD4k‡ðD4lˆD4kˆ$D4lˆ(D4mˆ8D4nˆdD4oˆhD4rˆlD4nˆpD4rˆtD4sˆŒD4tˆ¸D4uˆÌD4vˆÔD4wˆØD4xˆìD4y‰ D4z‰TD4^‰€D4‰D4‚‰œD4ƒ‰°D4‚‰´D4ƒ‰¸D4„‰¼D4…‰ØD4†ŠD4‡Š$D4ˆŠDD4‰ŠdD4ŠŠ„D4ŠˆD4’ŠŒD4‹Š”D4ŒŠœD4ФD4‘ЬD4аD4Š´D4’ЏD4“ŠÜD4”‹D4•‹@D4‹lD4œ‹|D4Ÿ‹œD4¢‹¸D4£‹ÔD4¤Œ$D4¥ŒXD4¤Œ\D4¥Œ`D4§ŒŒD4¥ŒD4§Œ”D3<Œ¸D3>ŒàD3?D3B8D3H\D3WœD3ZÄD3qøD3rŽD3uŽ8D3›Ž\D3žŽxD3¯ްD3°ŽÐD3ºŽøD3»D3îDD3ï`D3óœD3ô¸D3öØDJo D4aDJoD4aDJo D4a(DJo0D4a<D4bpD4d¨D4fØD4i‘D4l‘8D4m‘PD4r‘xD4w‘D4„‘ÌD4‡’D4ˆ’4D4‰’TD4’’|D4¨’´D4ª’ÐD4«“ D4¬“pD4­“ÀD4®”D4¯”PD4°”D4³” D4´”ÐD4µ•D4¶•PD4·•D4¸•ÐD4¹–D4º–0D2ì–pD4–ŒD4¼– ‰$$2Œi`‰[@2Œ‰o@2Œ‰@2Œ‰“€2H‰ª€2ŽL‰¿@2’‰Ð€2“P‰è€2•ˆˆ‰ü€2—TŠ@2˜Š,€2™ˆŠ?€2šlŠV@2›Šn€Š€а€2œˆ˜ŠÃ€2ˆŠß€2žHˆŠö€2ŸX‹€‹8€‹Y€2 ˆ‹x€2¡ˆ”‹€2¢ˆ‹¦€2£ˆŒ‹½@2¤‹Ì€2¥\‹Ú@2¦‹ë€Œ @2§Œ€2¨`Œ*€2ªdŒ8€2«hŒF@2¬ ŒU€2­ˆˆŒc&2®­(Œ{€Œ™Ài`Œš@2ºŒ¥@2ºŒ®ÀjŒ¯@JDŒ¸ÀjŒ¹@JHŒÂÀjPŒÃàj ŒÄàj ŒÅàj ŒÆ@2»ŒÔÀkŒÕàkXŒÖ@2»ŒäÀktŒåàk˜Œæ@JVŒòÀo€Œóào„Œô@JVÀoŒàoÀ@JVÀpàp@JVÀp(àp`@J_ *Àp¸+àp¼,@J_ 8ÀpÈ9àq,:@3;FÀwìG@JlUÀwìVàwðWàwðX@3;dÀwôe@JlsÀwôtàx uàx v@3½„@3½À€à€X‘@3½Ÿ@3½ªÀ€p«à€”¬@3úº@3úÅÀƒœÆàƒäÇ@3úÕ@3úàÀ„áà„(â@4aîÀ†¸ïà†¼ð@4aüÀ†Àýà†Øþ@4dŽ À‡8Ž @JlŽÀ‡8Žà‡<Žà‡<Ž@4dŽ(À‡@Ž)@JlŽ7À‡@Ž8à‡dŽ9à‡dŽ:@4aŽFÀ ŽGàŽH@4aŽTÀŽUàŽV@4aŽbÀ Žcà(Žd@4aŽpÀ0Žqà<Žrà–ÈŽs$-hN–ÈŽt­4.–ÐD5(–ÐD5L–ìD5(–ðD5L–ôD5(–øD5)–üD5L—D5(—D5L—D5(—D5L—D5)—$D5*—(D5C—,D5H—0D5I—4D5L—8D5s—PD5u—xD5—ÄD5…˜D5†˜4D5ž˜ˆD5¤˜ÐD5ª™(D5¶™xD5¹™ÀD6™ðD6š<D6š\D6š€D6+š¬D62šÜD64›D6<›`D6B›”D6G›ÈD6YœD6dœPD6xœ¬D6‰œàD6š$D6ý`D6þŒD7ÔD7ôD7ž D7 žLD7ž„D7žœD5MžØD5NžÜD5PžàD5YžäD5PžèD5MžìD5NžôD5OŸD5VŸD5YŸD5\Ÿ D7#Ÿ”D5`Ÿ°D5fŸ¸D5`Ÿ¼D5fŸÀD5g D5h (D5i `D5h hD5i lD5j  D5k ÐD5l¡DD5n¡D5o¡˜D5n¡œD5o¡ D5p¡¨D5s¢D5t¢DJW¢PD5t¢TDJW¢XD5t¢\DJW¢`DJX¢pDJR¢|D5u¢ D5v¢¬DJW¢àD5x¢äD5w¢èDJW¢ìD5x¢ðDJW¢ôDJX£DJR£D5y£0D5z£<DJ`£pD5|£tD5{£xDJ`£|D5|£€DJ`£„DJa£DJR£¸DJe£àD5}£ìD5~¤,D5¤PD5‚¤`D5…¤dD5‚¤hD5…¤lD5†¤„D5‡¤˜D5ˆ¤ÐD5‡¤ÔD5ˆ¤ØD5¤äD5¥D5“¥(D5”¥8D5›¥dD5˜¥hD5›¥lD5˜¥tD5›¥xD5ž¥|D5Ÿ¥”D5¤¥ÀD5¥¥ÜD5ª¦D5¦¦ D5§¦D5ª¦D5¬¦ˆD5­¦D5®¦œD5±¦ðD5¶§DJm§ D5¶§$DJm§(DJn§4DJo§@D5¶§TD5·§`D5¸§€D5¹§°D5¸§´D5¹§¸D5¸§ÀD5¹§ÄD5º§ÔD5»§ìD5½§ðD5»§øD5¼§üD5½¨D5¾¨D5¿¨LD5À¨€D5¿¨„D5À¨ˆD5Ĩ´D5À¨¼D5ĨÀD6¨øD5Å©D5Æ©,D5Ç©<D5È©hD5É©tD5Ê©D5Ë©¬D5Ì©ÄD5Í©øD5Ì©üD5ͪD5ΪD5ЪD5ΪD5Ϫ D5Ъ(D5Ѫ<D5ÒªhD5Óª˜D5ÒªœD5Óª D5Òª¨D5Óª¬D5Ôª¼D5ÕªìD5ÔªðD5ÕªôD5Ö«0D5׫4D5Ø«LD5Ú«`D5Û«xD5Ü«¬D5Ý«ÜD5Ü«èD5Ý«ìD5ä¬ D5å¬PD5欠D5笤D5欨D5笴D5è¬àD5ç¬äD5è¬ìD5é¬ôD5ê­D5ë­,D5ì­DD5í­xD5ì­|D5í­€D5î­D5ð­”D5î­˜D5ï­ D5ð­¨D5ñ­¼D5ò­èD5ó®D5ò®D5ó® D5ò®(D5ó®,D5ô®<D5õ®lD5ô®pD5õ®tD5ö®°D5÷®´D5ø®ÌD5ú®àD5û®øD5ü¯,D5ý¯\D5ü¯hD5ý¯lD5þ¯°D5ÿ¯äD6°D6 °DD6°HD6 °PD6 °„D6 °ˆD6 °D6 °ÌD6°üD6±D6± D6±@D6±\D6±dD6±€D6±¸D6±ÈD6±ôD6"²DD6#²XD6"²\D6#²`D6$²dDJE²lDJF²ˆDJH² DJI²¨DJK²°DJL²ÄD6(²ðDJE³PDJF³lDJH³„DJI³ŒDJK³”DJL³¨D6)³ÔD6*´0D6+´DD6,´XD6-´\D61´`D6,´dD6-´lD6.´xD61´„D62´ˆD63´ D64´ÐD63´ÔD64´ØD65´ìD66µ DJEµ$DJFµ@DJHµXDJIµ`DJKµhDJLµ|D6;µ¨D6<¶D6=¶$D6>¶\DJE¶lDJF¶ˆDJH¶ DJI¶¨DJK¶°DJL¶ÄD6A¶ðD6B·PD6C·dD6D·œD6G·¬D6H·¼D6K·ÈD6L·ÜD6K·àD6L·äD6O·èD6R¸D6U¸$D6V¸@D6W¸TD6X¸XD6W¸\D6X¸`D6Y¸dD6X¸hD6Y¸lD6Z¸ˆD6[¸¼D6Z¸ÈD6[¸ÐD6\¸ÔD6]¹D6\¹D6]¹$D6d¹hD6e¹|D6h¹€D6k¹´D6h¹¸D6l¹¼D6k¹ÀD6l¹ÄD6o¹ÈD6r¹èD6uºD6vº D6xº$D6vº(D6wº8D6xºPD6yºhD6zº D6{º°D6|ºÜD6»@D6€»LD6»PD6€»TD6‡»XD6ˆ»xD6‡»|D6ˆ»€D6‰»„D6Š»¸D6‹»äD6Œ»èD6’»ìD6•¼D6˜¼D6™¼ D6˜¼$D6™¼(D6š¼,D6›¼`D6¼ŒD6œ¼D6¼”D6§¼œD6£¼ D6¦¼¤D6§¼¨D6ª¼¬D6«¼´D6ª¼¸D6«¼¼D6®¼ÀD6±¼ÈD6®¼ÌD6±¼ÐD6®¼ÔD6±¼ØD6·¼àD6º¼èD6·¼ìD6º¼ðD6·¼ôD6º¼øD6¼üD6ŽD6˽D6Ƚ D6¿½D6˽D6½D6Ž D6˽$D6¿½(D6Ƚ,D6˽0D6¿½4D6˽8D6¿½@D6˽HD6ν\D6Ô½hD6Õ½pD6Ô½tD6Õ½xD6ؽ|D6Û½„D6ؽˆD6Û½œD6ὸD6ä½ÀD6á½ÄD6佨D6’½ðD6ê¾D6í¾D6ê¾D6í¾D6ê¾,D6í¾0D6ê¾4D6í¾8D6ê¾<D6í¾@D6ð¾PD6õ¾`D6÷¾tD6ú¾ D6û¾°D6ü¾ÄD6û¾ÈD6ü¾ÌD6ý¾ÐD6þ¾ìD6ÿ¿D7¿ D7¿4D7¿HD7¿\D7¿`D7 ¿dD7 ¿hD7¿lD7¿tD7¿|D7¿„D7 ¿ŒD7 ¿D7 ¿”D7 ¿¤D7 ¿ØD7ÀD6úÀ0D7À@D7À`D7À|D7ÀœD7À°D7ÀèD7 ÁD7ÁD7 Á D7Á$D7 Á(D7#Á@D7$ÁpD7%Á D7&ÁàD7' D7(Â`D7) D7,°D7-ÂàD7.ÃD7/Ã@D70ÃpD71àD72ÃÐD73ÄD74Ä0D75Ä`D5~Ä D77ÄÀŽŠ$5(–ÐŽ¿@5(ŽÓ@5(Žå@5(Ž÷€5)8€5*<.@5+?@5,P@5.a€5/@t@50”€52D¬€53pÇ€54°ã€55ù€56€ð €57X#@58;€[€59ðw€5:@ðŽ@5;§@5<¾@5=Ô@5> æ@5?þ@5@‘@5A‘@5B‘/€5CH‘=@5D‘L@5E‘[€5GL‘i€5HP‘w€5IT‘…€5Jü‘“&5K­4‘«€‘ÉÀ–БÊ@JV‘ÖÀ¢P‘×à¢T‘Ø@JV‘äÀ¢X‘åà¢\‘æ@JV‘òÀ¢`‘óࢠ‘ô@JV’À¢à’à¢ä’@JV’À¢ì’à¢ð’@JV’À¢ô’à£0’@J_ ’*À£p’+à£t’,@J_ ’8À£|’9ࣀ’:@J_ ’FÀ£„’Gà£ì’H@5¶’TÀ§ ’U@Jl’cÀ§ ’dà§$’eà§$’f@5¶’rÀ§(’s@Jl’À§(’‚à§T’ƒà§T’„@JH’À² ’Žà²ð’@JH’˜À³„’™à³Ô’š@JH’£ÀµX’¤àµ¨’¥@JH’®À¶ ’¯à¶ð’°àÄä’±$.NÄä.ÄðD0rÄðD0{ÄüD0rÅD0‹ÅD0ŽÅ DJmÅ$D0‹Å(D0„Å,D0{Å8D0~Å<D0Å@D0€ÅDD0…ÅHD0‹ÅTD0ŽÅXDJmÅ\D0‹Å`DJmÅdD0‹ÅhDJmÅlDJnÅpDJoÅ|D0ŽÅ„DJoÅD0ŽÅ”DJoÅ D0ŽŨD0ÆD1£ÆpD0ÆD0‘ÆÀD0’ÇPD0“Ç€D0’Ç„D0“LjD0–ÇŒD0—ÇàD0˜ÈPDJWÈ€DJXÈ”DJRÈ D0™ÈÀD0šÉ DJWÉPDJXÉdDJRÉpD0ÉD0žÉàDJWÊDJXÊ$DJRÊ0D0¡ÊPD0¢Ê DJ`ÊÐDJaÊàDJRËDJeË$D0¥Ë4D0¦˘D0ª˰D0¦Ë´D0ª˼D0«ËÄDJmËÈD0«ËÌDJmËÐDJnËØDJoËäD0«ËìDJoËøD0«ËüDJoÌD0«ÌD0¬ÌTD0­̨D0®ÌÔD0¯ÌìD0°Í D0±Í4D0²Í D0¿ͤD0²ͨD0³ͰD0´͸D0µÍÀD0¶ÍÈD0·ÍÔD0¸ÍÜD0¹ÍèD0ºÍðD0»ÍüD0¼ÎD0»ÎD0¼Î D0¿ÎD0ÀÎD0ÁΈD0ÂμD0ÊÏD0ËÏ(D0âÏdD0ÌÏ|D0ÍÏD0ÙÏ”D0ÍϘD0ÎÏ D0ÏϨD0ÐϰD0ÑϼD0ÒÏÈD0ÓÏÐD0ÔÏÜD0ÕÏäD0ÖÏèD0ÕÏìD0ÖÏôD0ØÏøD0ÙÏüD0ÚÐ8D0ÜÐhD0ÛÐlD0ÜÐpD0ÚЀD0ÜЄD0âДD0ãЬD0äÐäD0ãÐèD0äÐðD0åÑ$D0äÑ(D0åÑ0D0èÑdDJmÑhD0åÑlD0èÑpD0åÑtDJmÑxDJnÑ€DJoÑŒD0èÑ”DJoÑ D0èѤDJoѬD0èѸD0éÑðD0êÒXD0ëÒ„D0ìÒŒD0ëÒD0ìÒ”D0íÒ¼D0îÓD0ïÓD0ðÓŒDJmÓDJnÓœDJoÓ¨D0ðÓ°DJoÓ¼D0ðÓÀDJoÓÈD0ðÓÔD0ñÔD0òÔ@D0óÔlD0ôÔÈD0öÔÌD0ôÔÔD0õÔÜD0öÔàD0÷Õ<D0øÕhD0úÕ”D0ùÕ˜D0ûÕœD0úÕ D0ûÕ¤D0üÕÔD0ýÖD1Ö`D1Ö|D1Ö€D1ÖD1Ö”D1Ö D1Ö°D15ÖàD1ÖðD1×D1× D1×(D1×\D1×`D1×hD1לD1× D1רD1×ÜDJm×àD1×äD1×èDJm×ìD1×ðDJm×ôDJn×üDJoØD1Ø DJoØD1ØDJoØD1Ø DJoØ,D1Ø8D1ØpD1ØtD1ØxD1Ø|D1 ؤD1!ØèD1"ØôD1#ÙhD1$Ù|D1&ÙD1%Ù˜D1&Ù¤D1'ÚD1(Ú4D1'Ú<D1(Ú@D1)ÚHD1*ÚxD16ÚÔDJmÚØD16ÚÜDJmÚàDJnÚèDJoÚôD16ÚüDJoÛD16Û DJoÛD16Û$D17ÛdD18ÛÀD19ÛìDJEÛðDJFÜ DJHÜ DJIÜ(DJKÜ<DJLÜHDJKÜLDJLÜPD19ÜxD1:ÜÌD1;ÜäD1<ÝD1=ÝD1>Ý`D1?ݬD1@ÞD1FÞ D1IÞD1AÞD1NÞD1AÞD1BÞ D1CÞ(D1DÞ,D1EÞ0D1CÞ4D1EÞ8D1FÞ<D1GÞHD1IÞLD1JÞPD1KÞTD1NÞXD1OÞ´D1PÞèD1Yß`DJmßdD1YßhDJmßlDJnßtDJo߀D1Yß D1ZßÐD1[ßìD1\àD1[à D1\à$D1]à4D1^àDD1_àPD1`àTD1_àXD1`à`D1aàdD1bàÔD1cáD1bá D1cáD1dá<D1cá@D1dáDD1iápD1káäD1láìD1mâ0D1nâHD1oâTD1pâ¼D1qâìD1râüD1sã0D1rã4D1sã8D1yãD1{ãèD1|ãìD1}ãøD1€äD1ä`DJWäŒDJXä DJRä¬D1‚äÄD1ƒå(DJWåTD1…åXD1„å\D1…å`DJWådDJXåtDJRå€D1†å˜D1‡åüD1ˆæ(DJ`æ,D1‰æ0D1ˆæ8DJ`æ<DJaæHDJRæpDJeæŒD1ŠæœD1‹æäD1ŒæüD1‹çD1Œç D1çD1Žç<D1çŒD1•çD1ç”D1çœD1‘ç¤D1’ç¬D1•ç¸D1–èD1™èLD1œè°D1 èàD1£é D1¤é0D1¥épD1¦é D1§éàD1¨ê D1©ê`D1ªê D1«êàD1®êðD1¯ë D1°ëPD1±ë€D1²ë°D1³ëàD1´ìD1µì@D0¦ìpD1‹ìŒD1·ì°’²$0rÄð’è@0r’ü@0r“ @0s“@0t“1@0u“G€0vX“W€0wT“g€0xP“}@0y“Œ@0z“›€0{8“©@0|“¸@0}“Ç€0~<“Õ€0@“ã€0€D“ñ€0L“ÿ€0‚H” @0ƒ”ÀÄð” @0Ž”,ÀÅ$”-àÅ(”.@0Ž”:ÀÅ\”;àÅ`”<@0Ž”HÀÅd”IàÅh”J@0Ž”VÀÅl”WàÅ„”X@0Ž”dÀÅ”eàÅ””f@0Ž”rÀÅ ”sàŨ”t@J_ ”€ÀÊДàË4”‚@0«”ŽÀËÈ”àËÌ”@0«”œÀËДàË씞@0«”ªÀËø”«àËü”¬@0«”¸ÀÌ”¹àÌ”º@0è”ÆÀÑh”ÇàÑl”È@0è”ÔÀÑx”ÕàÑ””Ö@0è”âÀÑ ”ãàѤ”ä@0è”ðÀѬ”ñàѸ”ò@0ð”þÀÓ”ÿàÓ°•@0ð• ÀÓ¼• àÓÀ•@0ð•ÀÓÈ•àÓÔ•@1•(À×à•)à×ä•*@1•6À×ì•7à×ð•8@1•DÀ×ô•EàØ •F@1•RÀØ•SàØ•T@1•`ÀØ•aàØ •b@1•nÀØ,•oàØ8•p@16•|ÀÚØ•}àÚÜ•~@16•ŠÀÚà•‹àÚü•Œ@16•˜ÀÛ•™àÛ •š@16•¦ÀÛ•§àÛ$•¨@19•±ÀÛð•²@JH•»ÀÜ •¼àÜx•½àÜx•¾@1Y•ÊÀßd•Ë@Jl•ÙÀßd•Úàßh•Ûàßh•Ü@1Y•èÀßl•é@Jl•÷Àßl•øàß •ùàß •ú@JV–À䌖àäÄ–@JV–ÀåT–àåX–@JV–"Àåd–#à嘖$@J_ –0Àæ,–1àæ0–2@J_ –>Àæ<–?àæœ–@àìЖA$'àNìЖB­@.ìÐDC`ìÐDCbìàDC`ìäDCbìôDCcíDCfí DCeíDÛíDCfíDCeí DÛí$DØí(D×í,DÚí0DÛí4DCeíDDCfíHDÛíLDCfí\DÛíhDCgílDÛípDÙíxD×í|DØí€DÙí„DÚíˆDCgíŒD×íDØí”DÙí˜DÚíœDCgí DÛí¨DÜí´DÝíÀDáíÐDÞíÔDßíäDáíôDàíøDáíüDI‹îDàîDI‹î DIŒîDIî0DâîTDI‹î`DIîhDI‘î€Dáî¬DIŒîÄDIîàDåîüDæïDéï DI‘ï@DâïlDåï Déï¸DìïÐDíïÔDîïàDñðDòðDóðDDùð`DúðDð”Dýð˜Dð Dð¤Dð¸D ððD ðøD ñD>ñ4DñPDJEñ€DJFñœDJHñ°DJIñ¸DJKñÐDJLñÜDJKñàDJLñäDòDò DòPDò€DJEòˆDJFò¤DJHòÀDJIòÈDJKòàDJLòìDJKòðDJLòôDó Dó0Dó`DóDJEóœDJFó¸DJHóÐDJIóØDJKóðDJLóüDJKôDJLôDô0D ô@D!ôpD"ô DJEô¬DJFôÈDJHôàDJIôèDJKõDJLõ DJKõDJLõD%õ@D&õPD'õ€D(õ°DJEõ¼DJFõØDJHõðDJIõøDJKöDJLöDJKö DJLö$D+öPD,ö`D-öD.öÀD1öÄD.öÌD1öÐD.öÔD3öÜD6÷D>÷D?÷0D@÷pDC÷€DD÷°DE÷àDFøDGø@DChøpDCiøxDClø´–W$C`ìЖ–@C`–¡@C`–ª@C`–³@Cb–¼ÀìЖ½€ÇH–Ñ€ÈL–ã€ÉP–ö€ÊT— €ËX—€Ì\—6@Í—G@Η[@Ï—j@З{@Ò—Œ@Ó—@Ô—¬Àí—­àí—®€ÇH—€ÈL—Ô€ÉP—ç€ÊT—ú€ËX˜€Ì\˜'@͘8@ΘL@Ϙ[@Иl@Ò˜}@Ó˜Ž@Ô˜Àí$˜žàíD˜Ÿ€ÇH˜³€ÈL˜Å€ÉP˜Ø€ÊT˜ë€ËX™€Ì\™@Í™)@Ι=@Ï™L@Й]@Ò™n@Ó™@Ô™ŽÀíL™àí\™€ÇH™¤€ÈL™¶€ÉP™É€ÊT™Ü€ËX™ò€Ì\š @Íš@Κ.@Ïš=@КN@Òš_@Óšp@ÔšÀíhš€àílš€ÇHš•€ÈLš§€ÉPšº€ÊTšÍ€ËXšã€Ì\šú@Í› @Λ@Ï›.@Л?@Ò›P@Ó›a@Ô›pÀíp›qà팛r€ÇH›†€ÈL›˜€ÉP›«€ÊT›¾€ËX›Ô€Ì\›ë@Í›ü@Μ@Ïœ@М0@ÒœA@ÓœR@ÔœaÀíœbàí œc€ÇHœw€ÈLœ‰€ÉPœœ€ÊTœ¯€ËXœÅ€Ì\œÜ@Íœí@Î@Ï@Ð!@Ò2@ÓC@ÔRÀí¨S@áa@álÀîmàîn@á|@á‡Àî ˆàîT‰@â—@â¢Àî`£à@á²@á½Àà@âÍ@âØÀîÄÙàîüÚ@âè@âóÀï@ôàïlõ@JHþÀñ°ÿàòž@JHž ÀòÀž àó ž @JHžÀóОàô0ž@JHžÀôàž àõ@ž!@JHž*Àõðž+àöPž,àøpž-àøÌž.$ üNøÌž/­\.øÐD$øøÐD%øàD$øøèD$ùøðD$øøôD%ùD%ùD%ùD%ù D%ùD%ùD%ùD%ùD%ù D%ù(D%ù,D% ù8D%ù<D%ù@D$ùùHD$úùLD$ûùPD%ùTD%ùXD%ù\D%ù`D%ùdD% ùhD%ùlD%ùˆD%ùŒD% ùD%ù˜D%ù D%ù¬D%ù¼D%ùÌD%!ùÜD%ùàD%ùðD%!úD% úD%!úDI‹ú D% úDI‹úDIŒúDIú@D%$ú`D%%úlDI‘úD%!ú¼D%%ûD%&û D%)û$D%&û(D%)û,D%*û8D%+ûpD%.ûtD%+ûxD%.û|D%/ûàD%2ûäD%5ûèD%/ûìD%5ûðD%6ûüD%:ü,D%7ü4D%:ü8D%7ü<D%:ü@D%;üHD%:üLD%;üPD%<üTD%=üÄD%CüÌD%Dý,D%Eý\D%Iý`D%FýdD%IýhD%FýlD%IýpD%Jý¼D%KþD%LþLD%KþPD%LþTD%Mþ`D%NþpD%Oþ D%Rþ´D%SþÄD%RþÈD%SþÌD%VþÐD%Wÿ,D%Xÿ\D%]ÿ`D%YÿdD%]ÿhD%YÿlD%]ÿpD%XÿtD%]ÿxD%kÿ D%]ÿ¤D%kÿ¨D%]ÿ¬D%kÿ°D%^ÿ¸D%_ÿÐD%`D%_D%`D%aD%c D%a(D%b,D%c0D%dDD%exD%g¨D%f¬D%g°D%f¼D%kÄD%lðD%kôD%lüD%o0DJm4D%l8D%o<DJm@D%lDDJmHDJnPDJo\D%opD%pÔD%qÜD%pàD%qäD%rD%qD%rD%sPD%t\D%v´D%„ØD%vÜD%„àD%väD%„èD%wðD%xD%y8D%x<D%y@D%zTD%|XD%z`D%{dD%|hD%}|D%~°D%àD%ŸäD%€èD%ìD%ŸðD%„D%…<D%„@D%…HD%ˆ|DJm€D%…„DJmŒDJn”DJo D%ˆ´D%‰øD%ŠD%‰D%ŠD%‹4D%Š8D%‹<D%ŒDD%LD%ޤDJm¨DJn´DJoÄD%ŽÐDJoØD%ŽäD% D%4D%’8D%@D%‘PD%’XD%“”D%”ÀD%•ìD%–üD%—(D%ŸhD% „D%ŸˆD% ŒD%¡¼D%«D%®D%¯tD%°|D%¯€D%°„D%³”D%¶˜D%³œD%¶ D%·ðD%¸ D%· D%¸ D%» DJE DJF 0DJH DDJI LDJK `DJL lDJK pDJL tD%» œD%¼ àD%Á D% TD%à D%Ä ØD%Å D%Æ 0D%Ç `D%È dD%Ç lD%È pD%Ì xD%Í ÐD%Î D%Ï D%Î D%Ô D%Õ 0D%Ö DD%× PD%Ø TD%Ù ¬D%Ú àD%Ù äD%Ú èD%Û D%ã PD%ä \D%å ŒD%è D%é œD%ê ÌD%í ÐD%î,D%ï@D%îDD%ïHD%ðXD%ñlD%õpD%ñtD%ò€D%óŒD%ôœD%õ¨D%öüD%÷0D%ø`D%ütD%ýÐD%þàD%ýäD%þèD%ÿìD&@D&pD&„D&àD&ìD&ðD&ôD& D& hD&”D&àD&ìD&ðD&ôD&üD&D&D&D&dD&D&”D&˜D&œD& D&°D& ÀD&!ÌD&",D&#\D&"hD&#lD&$pD&%¨D&+àD&,øD&3 D&4`D&5 D&6àD&7 D&8`D&9 D&:ÐD&;D&<0D&?@D&@pD&A D&BÐD&CD&D0D&E`D&FD&GÀD&HðD&I D&KPžE$$øøÐž@$øž•@$øž§@$øž¹€$ù|žÌ€$úLžã€$ûPžõ€$üTŸ€$ýXŸ€$þ\Ÿ4@$ÿŸI€%Ÿ_€%ŒŸv€%ˆŸ‹@%Ÿš€%`Ÿ¨€%dŸ¶€%hŸÄ€%lŸÒ€%pŸà€% tŸî€% xŸü@%   @%  @%  *€%H 9@% K&%­\ c€ ÀøÐ ‚@%! Àú  ‘àú ’@%!  Àú ¡àú` ¢@%! °Àú ±àú¼ ²@%o ¾À4 ¿@Jl ÍÀ4 Îà8 Ïà8 Ð@%o ÜÀ@ Ý@Jl ëÀ@ ìàD íàD î@%o úÀH û@Jl¡ ÀH¡ àp¡ àp¡ @%ˆ¡À€¡@Jl¡'À€¡(à„¡)à„¡*@%ˆ¡6ÀŒ¡7@Jl¡EÀŒ¡Fà´¡Gà´¡H@%Ž¡TÀ¨¡UàСV@%Ž¡bÀØ¡càä¡d@%»¡mÀ ¡n@JH¡wÀ D¡xà œ¡yà œ¡zàx¡{$¨Nx¡|­x.€DZ€DgŒDZDg”DZ˜Dg D[¤DZ¨Dg´DZ¼DgÄD\ÌD[ÐDgÔDhèDi DjPDkDnÀDoÄDpÈDsÌDpÔDnØDoàDpìDsðDpôDsüD£ D©8D¯`DµxD»Dt°DÒìDuDv@DypDz°D}´D~àD–äD˜ D™(Dš4DpDJE DJF¼DJHÐDJIØDJKðDJLüDJKDJLD¢0D£`D¤xD¥°DJE¸DJFÔDJHðDJIøDJKDJLDJK DJL$D¨PD©€Dª˜D«ÐDJEÜDJFøDJHDJIDJK0DJL<DJK@DJLDD®pD¯ D°¸D±ðDJEüDJF DJH 0DJI 8DJK PDJL \DJK `DJL dD´ Dµ ÀD¶ ØD·!DJE!DJF!8DJH!PDJI!XDJK!pDJL!|DJK!€DJL!„Dº!°D»!àD¼!øD½"0DÀ"4D½"<DÀ"DDÅ"XDÈ"„DÉ"ÄDÊ"øDË#4DÌ#`DÍ#ŒDÏ#¸DÒ#ÐDÓ#ðDÕ$ DØ$0DÙ$pDÚ$ DÛ$ÐDÜ%DÝ%@Dß%„¡‘$Z€¡Í@Z¡á Zœ¡ó Z ¢€[8¢€\<¢*@^¢;@_¢J@`¢Y@a¢h@b¢y@c¢Š@e¢™&f­x¢±€¢ÏÀ€¢Ð@JH¢ÙÀТÚà0¢Û@JH¢äÀð¢åàP¢æ@JH¢ïÀ¢ðàp¢ñ@JH¢úÀ 0¢ûà ¢ü@JH£À!P£à!°£à%¤£$ $N%¤£ ( 'º£( (º”£'( )º˜£;( *ºœ£Q( +º £b( к¤£ ( ׺¨£Ù( 庬¤( íº°¤L( ôº´¤‚( ûº¸¤·& þº¤ë& ÿº¥'& º¥_& º¥–& º ¥Ö& º¦& º¦9& º ¦t& º$¦§& º(¦ã& …4¦õ& £\§&¡ô§&§§+&¡Ð§=&…0§O&¡À§a&¡¤§s&§,§…&§ §˜&¡€§«&¦ˆ§¾&¡p§Ñ&¡4§ä&¡§÷&¤œ¨ & ô¨&¤Ä¨0&¥Ì¨C&¦Ì¨V& £è¨i&!©€¨|&"¤¸¨&#¤Ð¨¢&$© ¨µ&% Ô¨È&& °¨Û&'¥L¨î&(¥à©&)¨ ©&*§L©'&+¦\©:&,¨t©M&-¦0©`&. ˆ©s&/£©†&0¦h©™&1§<©¬&2¤4©¿&3¦H©Ò&4¥X©å&5¦4©ø&6¢ìª &7¨„ª&8¦¼ª1&9¥°ªD&:  ªW&;¦|ªj&<¤„ª}&=§ìª&>£(ª£&?¢Lª¶&@ŸèªÉ&A¢´ªÜ&B¦pªï&C¢«&D¢|«&E¥À«(&F¥«;&G¥x«N&H¥l«a&I¥$«t&J¦”«‡&K¤t«š&L¤d«­&M¥<«À&N¥€«Ó&O¦ «æ&P£«ù&Q¦Ô¬ &R§¬&S¢D¬2&T¦è¬E&U©¬X&V¥¬k&W¢Ø¬~&X¢À¬‘&Y¥0¬¤&Z¤X¬·&[¦ ¬Ê&\©P¬Ý&]¢¬¬ð&^ŸÀ­&_¦ü­&`¤è­)&aŸ°­<&b§¨­O&cŸ”­b&dŸ„­u&eŸh­ˆ&f¥ü­›&g¤Ü­®&h¦,­Á&i¦¸­Ô&j©­ç&k¨L­ú&l¤@® &m¥ ® &nŸ4®3&o¤°®G&p¥¨®[&q¥d®o&r¢@®ƒ&sŸ,®—&t…8®«&uŸ ®¿&vžð®Ó&w§h®ç&x¢®û&y¤€¯&z£ˆ¯#&{£8¯7&|žÐ¯K&}žœ¯_&~¥¯s&¥Ô¯‡&€¨$¯›&£T¯¯&‚£l¯Ã&ƒ¢à¯×&„¨¯ë&…¨ø¯ÿ&†¢ø°&‡¢Ì°'&ˆ¢\°;&‰žh°O&Š£ °c&‹£°°w&Œ£À°‹&£Ì°Ÿ&ޣܰ³&£°Ç&¨X°Û&‘§ä°ï&’¦±&“§¼±&”§Œ±+&•¢ ±?&–žX±S&—©\±g&˜¨@±{&™¨0±&šž4±£&›¤(±·&œ£ ±Ë&¦±ß&ž¨±ó&Ÿž(²& £ô²&¡¨°²/&¢¢l²C&£ž$²W&¤ž ²k&¥¨Ô²&¦ä²“&§¤¤²§&¨§Ô²»&©¤ ²Ï&ªØ²ã&«¥ ²÷&¬¥è³ &­¤H³&®¤ø³3&¯°³G&°¥˜³[&±¦³o&²œ¨³ƒ&³©p³—&´£4³«&µœl³¿&¶¨l³Ó&·©0³ç&¸œ4³û&¹¢˜´&ºœ´#&»›è´7&¼£´K&½›h´_&¾…H´s&¿›P´‡&À›8´›&Á…@´¯&›´Ã&Úð´×&Ä¢8´ë&Åš¸´ÿ&Ƨ(µ&Ç…<µ'&È¢tµ;&Éš°µO&Êš”µc&Ëšˆµw&̧”µ‹&Íš„µŸ&Κ|µ³&Ïš(µÇ&ЙüµÛ&Ñ£xµï&Ò§€¶&Ó¢$¶&Ô™ì¶+&Õ¨¼¶?&Ö©<¶S&יضg&Ø¢h¶{&٦Ķ&ڙĶ£&Û£D¶·&ܘ€¶Ë&ݧX¶ß&Þ˜`¶ó&ߘX·&à§·&ᤷ/&â˜L·C&㤷W&äªx·k&å§ü·&æªT·“&ç—·§&覄·»&骼·Ï&ê–ø·ã&ë•d·÷&쪨¸ &íª”¸&¸3&ï•L¸G&ð•4¸[&ñª\¸o&ò• ¸ƒ&󕸗&ô¥¸¸«&õ”ð¸¿&ö£ø¸Ó&÷¢,¸ç&ø¥¸û&ù”è¹&úª@¹#&û”d¹7&ü¨ ¹K&ýª,¹_&þ¢„¹s&ÿ¨è¹‡&”L¹›&”0¹¯&”,¹Ã&e ¹×&a°¹ë&¤¼¹ÿ&¤º( º¼º1(  ºÀºN(  ºÄºn(  ºÈº‡(  ºÌºª(  ºÐºÄ( ºÔºã( ºØºü( ºÜ»( ºà»2( ºä»O( ºè»q( ºì»•( ºð»¯( ºô»Î( ºø»ë( ºü¼( »¼#( »¼:( »¼\( » ¼v( »¼( »¼«( »¼Ã(  »¼Û( !» ¼õ( "»$½( #»(½0( $»,½F( %»0½b( &»4½‡( '»8½§( (»<½½( )»@½Õ( *»D½ê( +»H¾( ,»L¾)( -»P¾F( .»T¾_( /»X¾~( 0»\¾œ( 1»`¾¯( 2»d¾È( 3»h¾ê( 4»l¾ÿ( 5»p¿( 6»t¿4( 7»x¿T( 8»|¿k( 9»€¿( :»„¿”( ;»ˆ¿§( <»Œ¿Í( =»¿ç( >»”À( ?»˜À( @»œÀ(( A» ÀC( B»¤ÀY( C»¨Àq( D»¬À‘( E»°À±( F»´ÀÃ( G»¸ÀÕ( H»¼Àí( I»ÀÁ( J»ÄÁ( K»ÈÁ1( L»ÌÁE( M»ÐÁe( N»ÔÁ{( O»ØÁ“( P»ÜÁ¨( Q»àÁÁ( R»äÁÕ( S»èÁé( T»ìÁÿ( U»ðÂ( V»ôÂ)( W»øÂ@( X»üÂ\( Y¼Âr( Z¼‹( [¼¡( \¼ ¹( ]¼ÂÑ( ^¼Âí( _¼Ã( `¼à ( a¼ Ã8( b¼$ÃI( c¼(Ã]( d¼,Ãx( e¼0ÃŽ( f¼4ë( g¼8ÃÅ( h¼<Ãà( i¼@Ãù( j¼DÄ( k¼HÄ!( l¼LÄ7( m¼PÄO( n¼TÄc( o¼XÄ~( p¼\Ä™( q¼`Ä«( r¼dÄÆ( s¼hÄâ( t¼lÄý( u¼pÅ( v¼tÅ-( w¼xÅH( x¼|Å`( y¼€Åv( z¼„Å( {¼ˆų( |¼ŒÅÇ( }¼ÅØ( ~¼”Åê( ¼˜Æ( €¼œÆ( ¼ Æ.( ‚¼¤ÆJ( ƒ¼¨Æd( „¼¬Æ€( …¼°Æ( †¼´ƺ( ‡¼¸ÆÐ( ˆ¼¼Æî( ‰¼ÀÇ( мÄÇ$( ‹¼ÈÇ;( Œ¼ÌÇX( ¼ÐÇs( ޼Ôdž( ¼ØÇŸ( ¼ÜǶ( ‘¼àÇÑ( ’¼äÇì( “¼èÈ( ”¼ìÈ( •¼ðÈ0( –¼ôÈI( —¼øÈ]( ˜¼üÈu( ™½È( š½È©( ›½Ⱦ( œ½ Èß( ½Èô( ž½É( Ÿ½É"(  ½É8( ¡½ ÉM( ¢½$É`( £½(Éx( ¤½,É”( ¥½0É©( ¦½4ɺ( §½8ÉÎ( ¨½<Éà( ©½@Éù( ª½DÊ( «½HÊ,( ¬½LÊB( ®½PÊS( ¯½TÊd( °½XÊu( ±½\ʆ( ²½`ʘ( ³½dʪ( ´½hʼ( µ½lÊÎ( ¶½pÊà( ·½tÊò( ¸½xË( ¹½|Ë( º½€Ë(( »½„Ë:( ¼½ˆËL( ½½ŒË^( ¾½Ëp( ¿½”Ë‚( À½˜Ë”( Á½œ˦( ½ ˹( ý¤ËÌ( Ľ¨Ëß( ެËò( ƽ°Ì( ǽ´Ì( Ƚ¸Ì+( ɽ¼Ì>( ʽÀÌQ( ˽ÄÌd( ̽ÈÌw( ͽÌÌŠ( νÐÌ( ϽÔ̰( нØÌÃ( ѽÜÌÖ( Ò½àÌé( Ó½äÌü( Ô½èÍ( Õ½ìÍ"( Ö½ðÍ5( ×½ôÍH( ؽøÍ[( Ù½üÍn( Ú¾Í( ۾͔( ܾͧ( ݾ ͺ( Þ¾ÍÍ( ß¾Íà( à¾Íó( á¾Î( â¾ Î( ã¾$Î,( ä¾(Î?( å¾,ÎR( æ¾0Îe( ç¾4Îx( è¾8΋( é¾<Ξ( ê¾@α( ë¾DÎÄ( ì¾HÎ×( í¾LÎê( î¾PÎý( ï¾TÏ( ð¾XÏ#( ñ¾\Ï6( ò¾`ÏI( ó¾dÏ\( ô¾hÏo( õ¾lÏ‚&÷…LÏœ( è¾pϬ( é¾tϼ( ê¾xÏÌ( ë¾|ÏÜ( ì¾€Ïî€Ð €Ð-€ÐM€Ðl€ÐŒ€Ы€ÐË€Ðë€Ñ €Ñ*€ÑJ€Ñi€щ€Ñ©€ÑÉ€Ñè€Ò€Ò'€ÒF€Òe€Ò„€Ò¤€ÒÀÒã€Ó€Ó#€ÓC€Ób€Ó€Ó¡€ÓÀ€Ó߀Óÿ€Ô€Ô>€Ô^€Ô}€Ô€Ô½€ÔÝ€Ôü€Õ€Õ;€Õ[€Õz€Õ™€Õº€ÕÙ€Õù€Ö€Ö8€ÖX€Öx€Ö˜€Ö¸€Ö×€Öö€×€×4€×S€×r€ב€×±€×Ñ€×ñ€Ø€Ø1€ØQ€Øq€Ø‘€ر€ØÐ€Øð€Ù€Ù.€ÙM€Ùm€Ù€Ù­€ÙÌ€Ùë€Ú €Ú*€ÚI€Úi€Ú‰€Ú©€ÚÉ€Úé€Û €Û(€ÛH€Ûg€Û†€Û¦€ÛÆ€Ûå€Ü€Ü$€ÜC€Üb€Ü€Ü €Ü¿€ÜÞ€Üþ€Ý€Ý>€Ý^€Ý}€Ýœ€ݼ€ÝÜ€Ýü€Þ€Þ;€ÞZ€Þy€Þ˜€Þ·€Þ×€Þ÷€ß€ß5€ßT€ßt€ß”€ß´€ßÔ€ßô€à€à3€àS€àr€à‘€à±€àЀàï€á€á/€áN€án€ᎀá­€áÌ€áë€â €â*€âI€âi€∀â§€âÇ€âç€ã€ã&€ãF€ãe€ã„€㣀ãÀãã€ä€ä"€äA€ä`€ä€ä¡€äÀ€äà€äÿ€å€å?€å_€å€埀å¿€åà€åÿ€æ€æ?€æ^€æ~€枀æ½€æÝ€æü€ç€ç:€çY€çy€瘀ç·€çÖ€çõ€è€è5€èU€èu€蔀è´€èÔ€èô€é€é3€éR€ér€é’€é³€éÓ€éó€ê€ê1€êQ€êq€ê‘€ê°€êЀêï€ë€ë/€ëO€ëo€ë€ë°€ëЀëð€ì€ì0€ìP€ìp€ì€쮀ì΀ìí€í €í+€íJ€íj€í‹€í«€íË€íë€î €î+€îK€îj€îÉ€îé€ï €ï1€ïz( í¾„ïŒ( ïœ( フï¬( ð¾ï¼( ñ¾”ïÍ( ò¾˜ïÞ( ó¾œïï( ô¾ ð( õ¾¤ð( ö¾¨ð"( ÷¾¬ð3( ø¾°ðD( ù¾´ðU( ú¾¸ðf( û¾¼ðw( ü¾Àðˆ( ý¾Äð™( þ¾Èðª( ÿ¾Ìð»( ¾ÐðÌ( ¾ÔðÝ( ¾Øðî( ¾Üðÿ( ¾àñ( ¾äñ!( ¾èñ2( ¾ìñC( ¾ðñT(  ¾ôñe(  ¾øñv(  ¾üñ‡(  ¿ñ˜(  ¿ñ©( ¿ñº( ¿ ñË( ¿ñÜ( ¿ñí( ¿ñþ( ¿ò( ¿ ò ( ¿$ò1( ¿(òB( ¿,òS( ¿0òd( ¿4òu( ¿8ò†( ¿<ò—( ¿@ò¨( ¿Dò¹( ¿HòÊ( ¿LòÛ(  ¿Pòì( !¿Tòý( "¿Xó( #¿\ó( $¿`ó0( %¿dóA( &¿hóR( '¿lóc( (¿pót( )¿tó…( *¿xó–( +¿|ó§&Y„üóç&â„Èô*&„”ôt& H}¨ô½& ¬dXôþ&åtàõ8&t¨õr&t\õ«&s˜õî&s`ö.&^s8ör&Ênö·&5h°öü& h€÷C&jh÷}&g˜÷¹&ûgd÷ö&"?bäø2&#”b¤øp&$1b|ø¬&&\€`øí&&|€ ù*&&Äèùl&+Þ{Üù &,œ{˜ùÛ&-ò{Xú&.ª{$úO&.Ôzôú‰&/xzÈú¾&/z¨úô&/Ýzdû5&1ñz$ûq&2+zûµ&2‹yØûð&5'y¬ü)&7:yhüb&8ºy8üž&8ÞxðüÒ&9vxÀý &9äªýA&=©Ðý}&@˜„ý³& @¤¹lýÙ& @йDþ& @ݹ8þ(& @ã¹(þN( A¿€þ‹€þ«€þË€þë€ÿ €ÿ+€ÿK€ÿk€ÿ‹€ÿ¬€ÿÌ€ÿ쀀0€P€q€’€²€Ò€ò€€2€R€r€’€²€Ò€ò€€2€R€r€’€²€Ò€ò€€2€R€r€’€²€Ñ& AJ¸<& AN¸=& Az¸hm& A‡¸\œ& A¸LÊ&AÛ‚$& Aä·¤.& B·|Z& B·p…& B#·`¯( BZ¿„瀀%&Bј^&BÙ~¨—&Bè€ÌÀ&C€¤ë&C!€˜& C'·P>( C^¿ˆ€ž€¾&C–}ˆ& C›¶¸2& CǶf& CÔ¶„™& CÚ¶tË( D¿¬û€ &DŸw€ K&D¶v |&DË|0 &D÷| À&E{ü â& E ¶d ( EA¿¸ 8€ X€ x&EŸfd ®&E²eØ ä&E¼ex & EÁµÌ @&Eíu0 h&Eúu$ & Fµ¼ µ&Fcd( ò&Fid /& Fnµ$ \&Fšd ‹&F§d„ ¹& F­µ æ( Fä¿À € :€ Y€ x€ —€ ¶&Gb< ë&Gaì &G$aˆU& G)´|z&GUc¡&Gbc Ç& Gh´lì& Gij€*& GȳÔX& Gô³¬ˆ& H³ ·& H³å&H?©ü&I€ªØ @êH A”ƒ B*º C.ð Cá/ E] F F´Ê Goü H7€V€u€”€³€Ò€ðd%¤ñd%°d%°1f2<A€.%°D%°D%°O$%°j@x@†€°€¿€Î$ N%¼.%ÀD %ÀD%ÀÏ$ %Àé@ ÷@ $ N%Ì.%ÐD%ÐD%ØD%ÜD%ìD&D&D&D&D&D&$D&0D&@D!&T$%Ð@&@6@?€J€Y€h€‚€˜€@ @À%Ðà&l$œN&l.&pD$&pD*&pD%&tD&&xD'&|D(&€D*&„D)&ˆD,&Œ$$&p-@#8@#E@#Q@#]@#k@#x€‰€¤€/$$N&”.& D2& D2&èD6&ôD7&üD9'D:'$D9'(D:',D;'00„'@DÛ'@E„'tD;'tD<'|D@'ÄD'ÐD'ÔD'ØD'àD'ìD@'ôD(D(D( DA(,DB(HDC(dDJ(|DK(ˆDL(ŒDO( DP(¨DT(ÐDU(ìDV) DX)(D])HD`)PDe)dDf)”Dg)°Dh)ÈDj*Dl*D'*Dp*D&* D%*$D)*(D&*,D**0D%*4D(*8D)*<D**@De*DD)*HDq*LDe*TDq*\De*`Dq*dDe*lDf*tDs*˜Du*¤Dv*¬D8*°Dy*ÈDz*ÐD*ØDh*ìD|+\$2& q@/|@/…@/•@/¡@0±@0 Å@0Ó@0á 18ø 1<@3€,€=€N€b€µ€L€]€Š€Á€Ñ€â€ó€€€&€C€`€~€”€½€Í€Ý€î€þ€€E€^€3Hm€3Lx@3„@3“€3P£@3²@3À€4¤Ë€×€ø€5€¤€5\€5d €5T/@1F@1aÀ& b@;m€@Ž€®€Ê€çÀ'@èà'té@òÀ'Ðóà'ôô@ýÀ(þà(,ÿ@l  À*à*@l À* à*D@l -À*H.à*L/@8À*Ø9à*ì:à+0;$N+0.+0D+0D+„D‡+ÀDˆ+Ø<„+ÜDæ+ÜQ„+øD‰+øD‹,8DŒ,HD,XDŽ,hD,tDŽ,xD,|D,„D,D,œD, D,¤D,¬D,¸D,ÀD,ÌD,ÐD‘,ÜD,èD,ôD,øD,üD-D-D-D-(D-,D”-<D•-DD”-HD“-LD”-PD•-dD—-xD˜-€Dš-ˆD›-¤DŸ-ÀD -ÜD£.D¤.D¥.D¤. D¥.$D¤.(D¥.,D¤.0D§.4D¨.LD©.PD¨.TD©.XD¨.\D©.`D¬.dD®.˜D¯.¬D°.¼D%.ÌD±.ÐD*.ÜD%.àD².äD%.èD².ìD±.ðD&.øD*.üD)/D'/D(/D¶/D·/D¸/Dº/ D»/,D¼/8D½/DD®/PD/XD®/\D¿/|DÀ/€D*/DÀ/”DÂ/˜DÀ/œD%/¨D*/¬D&/°D'/´D(/¸D)/¼D‡/ÐDÉ/ÔDÊ/ÜD®/èDš0D›0PDš0˜DÎ0Üh$+0{ ~…؆@~–@~ ¢@°@¾ …ìË …ðÝ €…ôð@‚ ù€‚T€‚L€‚P%€‚H3€‚X>€‚\J@‚W@ƒ`@ƒo@ƒ@ƒŽ€ƒ…hž@„°€…h»@†Ê@†Ú€†h逆¨ù€†`€†è€†(%€1À+02@ˆ=À+Ü>à+ø?@HÀ,Ià,ÜJ@SÀ,èTà-<U€›hcÀ-¸dà-Àe@± r€‘@± @±¨À.Ì©à.Ъ@± ·@± Ã@±ÎÀ.ÜÏà.äÐ@± Ý@± é@±ôÀ.èõà.ìö@±  @±  @± À.ø à/ @À  )@À  5@À @À/ Aà/” B@À  O@À  [@À fÀ/¨ gà/Ð h€šh vÀ0 wà0P x€›h †À0P ‡à0˜ ˆ€šh –À0˜ —à0Ü ˜à0ü ™$ÌN0ü šd0ü0C`JƒDu‚„¨d×|ÈuX4`È^}èŒd¸·`êc@N1àa-|:À‘$Тд6°Ä@Ø$ Ë%ÐïÀ° ÷0 I` q&  €+0]°p | °Œ ¢p° ðİ×p Ö&pðP –%À å%° P  %ð<(ÐPd -þJþaþoþ{þˆþžþ´þÀþÐþæþóþþþ'þ5þOþ_þnþ}þyþŽþ¥þÄþÚþéþûþŠþ þþ7þLþaþtþþ…þ’þ¦þ³þÇþØþæþöþþþþ(þ=þOþ]þnþ‚þ•þ¬þÁþÏþáþòþ þ þ .þ @þ Uþ fþ xþ þ ¢þ ±þ Æþ Úþ ïþ þ þ ,þ :þ Mþ bþ ~þ –þ ¥þ ¸þ Êþ Üþ îþ ûþ þ þ )þ ú 9þ Iþ Yþ ¯µ½ÅÌÓäëñ   i" ): # ª ² º + ¯|elP¯xegP¯telP¯pe6Peseteve|e}e'eyezeeweere‚eqeuexe!eBe#eOe9e%eLeWeeeQefeDeˆeTe e…e?e&ePeFeMeXeeYee[ebeje€e)ee;e$eReGe<eSeHeIe>e^ece„ee`eEeeeie7eCe"eeUeNe]e8ee†e~e_eeeZe(eJeheAeeVeƒe{eoe‡eseteve|e}e'eyezeeweere‚eqeuexe!eBe#eOe9e%eLeWeeeQefeDeˆeTe e…e?e&ePeFeMeXeeYee[ebeje€e)ee;e$eReGe<eSeHeIe>e^ece„ee`eEeeeie7eCe"eeUeNe]e8ee†e~e_eeeZe(eJeheAeeVeƒe{eoe‡e.epe5ee-ele6eKede:eae0e/ee2e,ege3e1e=e4dûe ee\e+e*eneme@dåek__dyld_func_lookupdyld_stub_binding_helper__mh_bundle_header_C_int_max_build_nested_list_build_nested_list_inplace_find_file_intervals_find_file_start_find_index_start_find_intervals_find_overlap_start_find_suboverlap_start_free_interval_dbfile_free_interval_iterator_imstart_qsort_cmp_interval_iterator_alloc_interval_map_alloc_read_binary_files_read_imdiv_read_intervals_read_subheader_block_read_sublist_reorient_intervals_repack_subheaders_reset_interval_iterator_save_text_file_sublist_qsort_cmp_target_qsort_cmp_text_file_to_binaries_write_binary_files_write_binary_index_write_padded_binary_PyErr_SetString_PyExc_MemoryError_PyExc_ValueError___sF_calloc_fclose_fgets_fopen_fprintf$LDBL128_fread_free_fscanf$LDBL128_fseeko_fwrite_memcpy_memmove_qsort_sprintf$LDBL128_sscanf$LDBL128___pyx_type_4pygr_11cnestedlist_IntervalDB___pyx_type_4pygr_11cnestedlist_IntervalDBIterator___pyx_type_4pygr_11cnestedlist_IntervalFileDB___pyx_type_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_type_4pygr_11cnestedlist_NLMSA___pyx_type_4pygr_11cnestedlist_NLMSANode___pyx_type_4pygr_11cnestedlist_NLMSASequence___pyx_type_4pygr_11cnestedlist_NLMSASlice___pyx_type_4pygr_11cnestedlist_NLMSASliceIterator___pyx_type_4pygr_11cnestedlist_NLMSASliceLetters_initcnestedlist_PyArg_ParseTupleAndKeywords_PyCObject_FromVoidPtr_PyClass_Type_PyCode_New_PyDict_Copy_PyDict_DelItemString_PyDict_GetItemString_PyDict_New_PyDict_SetItem_PyDict_SetItemString_PyDict_Type_PyDict_Update_PyErr_ExceptionMatches_PyErr_Fetch_PyErr_Format_PyErr_NormalizeException_PyErr_Occurred_PyErr_Restore_PyErr_SetNone_PyErr_SetObject_PyErr_WriteUnraisable_PyEval_CallObjectWithKeywords_PyExc_AssertionError_PyExc_IOError_PyExc_IndexError_PyExc_KeyError_PyExc_NameError_PyExc_NotImplementedError_PyExc_OverflowError_PyExc_StopIteration_PyExc_SystemError_PyExc_TypeError_PyFile_Type_PyFloat_FromDouble_PyFrame_New_PyImport_AddModule_PyInstance_Type_PyInt_AsLong_PyInt_FromLong_PyInt_Type_PyIter_Next_PyList_New_PyList_Type_PyLong_FromLongLong_PyModule_GetDict_PyNumber_Add_PyNumber_Divide_PyNumber_Remainder_PyNumber_Subtract_PyObject_CallFunction_PyObject_CallObject_PyObject_Cmp_PyObject_DelItem_PyObject_GC_Del_PyObject_GetAttr_PyObject_GetAttrString_PyObject_GetItem_PyObject_GetIter_PyObject_IsInstance_PyObject_IsTrue_PyObject_SetAttr_PyObject_SetAttrString_PyObject_SetItem_PyObject_Size_PySequence_Contains_PySequence_DelItem_PySequence_DelSlice_PySequence_GetItem_PySequence_GetSlice_PySequence_SetItem_PySlice_Type_PyString_AsString_PyString_FromString_PyString_FromStringAndSize_PyString_InternInPlace_PyString_Type_PyThreadState_Get_PyTraceBack_Here_PyTraceBack_Type_PyTuple_GetSlice_PyTuple_New_PyTuple_Type_PyType_IsSubtype_PyType_Ready_Py_InitModule4__Py_NoneStruct__Py_TrueStruct__Py_ZeroStruct_memset_readMAFrecord_read_axtnet_realloc_seqidmap_qsort_cmp_strcmp_strcpy_strdup_strncmp_findseqID_save_interval_seqnameID_qsort_cmp__DefaultRuneLocale___maskrune_isalpha_strcat_strlendyld__mach_header/Users/administrator/Desktop/pygr-0.8.1/pygr/intervaldb.cgcc2_compiled.:t(0,1)=(0,1)read_intervals:F(0,2)n:P(0,3)ifile:P(0,4)i:r(0,3)int:t(0,3)=r(0,3);-2147483648;2147483647;:t(0,2)=*(0,5):t(0,4)=*(0,6)IntervalMap:t(0,5)=(0,7)FILE:t(0,6)=(0,8):T(0,7)=s24start:(0,3),0,32;end:(0,3),32,32;target_id:(0,3),64,32;target_start:(0,3),96,32;target_end:(0,3),128,32;sublist:(0,3),160,32;;__sFILE:T(0,8)=s88_p:(0,9),0,32;_r:(0,3),32,32;_w:(0,3),64,32;_flags:(0,10),96,16;_file:(0,10),112,16;_bf:(0,11),128,64;_lbfsize:(0,3),192,32;_cookie:(0,12),224,32;_close:(0,13),256,32;_read:(0,14),288,32;_seek:(0,15),320,32;_write:(0,16),352,32;_ub:(0,11),384,64;_extra:(0,17),448,32;_ur:(0,3),480,32;_ubuf:(0,18),512,24;_nbuf:(0,19),536,8;_lb:(0,11),544,64;_blksize:(0,3),608,32;_offset:(0,20),640,64;;:t(0,9)=*(0,22)short int:t(0,10)=@s16;r(0,10);-32768;32767;__sbuf:T(0,11)=s8_base:(0,9),0,32;_size:(0,3),32,32;;:t(0,12)=*(0,1):t(0,13)=*(0,23):t(0,14)=*(0,24):t(0,15)=*(0,25):t(0,16)=*(0,26):t(0,17)=*(0,27):t(0,18)=ar(0,28);0;2;(0,22):t(0,19)=ar(0,28);0;0;(0,22)__darwin_off_t:t(0,21)=(0,29)fpos_t:t(0,20)=(0,21)unsigned char:t(0,22)=@s8;r(0,22);0;255;:t(0,23)=f(0,3):t(0,24)=f(0,3):t(0,25)=f(0,20):t(0,26)=f(0,3):t(0,27)=xs__sFILEX:long unsigned int:t(0,28)=r(0,28);0;037777777777;__int64_t:t(0,29)=(0,30)long long int:t(0,30)=@s64;r(0,30);01000000000000000000000;0777777777777777777777;im:r(0,2)void:t(0,1)errstr:(0,31)errstr:(0,31):t(0,31)=ar(0,28);0;1023;(0,32)char:t(0,32)=r(0,32);0;127;imstart_qsort_cmp:F(0,3)void_a:P(0,33)void_b:P(0,33):t(0,33)=*(0,34):t(0,34)=k(0,1)sublist_qsort_cmp:F(0,3)void_a:P(0,33)void_b:P(0,33)target_qsort_cmp:F(0,3)void_a:P(0,33)void_b:P(0,33)reorient_intervals:F(0,1)n:P(0,3)im:P(0,2)ori_sign:P(0,3)tmp:r(0,3)interval_map_alloc:F(0,2)n:P(0,3)im:r(0,2)errstr:(0,31)errstr:(0,31)find_overlap_start:F(0,3)start:P(0,3)end:P(0,3)im:P(0,2)n:P(0,3)l:r(0,3)mid:r(0,3)r:r(0,3)find_index_start:F(0,3)start:P(0,3)end:P(0,3)im:P(0,35)n:P(0,3)l:r(0,3):t(0,35)=*(0,36)IntervalIndex:t(0,36)=(0,37):T(0,37)=s8start:(0,3),0,32;end:(0,3),32,32;;mid:r(0,3)r:r(0,3)interval_iterator_alloc:F(0,38):t(0,38)=*(0,39)IntervalIterator:t(0,39)=(0,40)IntervalIterator_S:T(0,40)=s32i:(0,3),0,32;n:(0,3),32,32;nii:(0,3),64,32;ntop:(0,3),96,32;i_div:(0,3),128,32;im:(0,2),160,32;up:(0,41),192,32;down:(0,41),224,32;;:t(0,41)=*(0,40)errstr:(0,31)free_interval_iterator:F(0,3)it:P(0,38)it2:r(0,38)it_next:r(0,38)reset_interval_iterator:F(0,38)it:P(0,38)read_imdiv:F(0,3)ifile:P(0,4)imdiv:P(0,2)div:P(0,3)i_div:P(0,3)ntop:P(0,3)block:r(0,3)ipos:r(0,42)off_t:t(0,42)=(0,21)read_sublist:F(0,2)ifile:P(0,4)subheader:P(0,43)im:P(0,2)ipos:r(0,42):t(0,43)=*(0,44)SublistHeader:t(0,44)=(0,45):T(0,45)=s8start:(0,3),0,32;len:(0,3),32,32;;errstr:(0,31)errstr:(0,31)read_subheader_block:F(0,3)subheader:P(0,43)isub:P(0,3)nblock:P(0,3)nsubheader:P(0,3)ifile:P(0,4)ipos:r(0,42)start:r(0,46)long int:t(0,46)=r(0,46);-2147483648;2147483647;write_padded_binary:F(0,3)im:P(0,2)n:P(0,3)div:P(0,3)ifile:P(0,4)i:r(0,3)npad:r(0,3)repack_subheaders:F(0,3)im:P(0,2)n:P(0,3)div:P(0,3)subheader:P(0,43)nlists:P(0,3)j:r(0,3)errstr:(0,31)errstr:(0,31)errstr:(0,31)write_binary_index:F(0,3)im:P(0,2)n:P(0,3)div:P(0,3)ifile:P(0,4)i:r(0,3)j:r(0,3)nsave:r(0,3)read_binary_files:F(0,47)filestem:P(0,48)err_msg:P(0,48)subheader_nblock:P(0,3)n:(0,3):t(0,47)=*(0,49):t(0,48)=*(0,32)IntervalDBFile:t(0,49)=(0,50):T(0,50)=s48n:(0,3),0,32;ntop:(0,3),32,32;nlists:(0,3),64,32;div:(0,3),96,32;nii:(0,3),128,32;ii:(0,35),160,32;subheader:(0,43),192,32;subheader_file:(0,51)=xsSubheaderFile:,224,128;ifile_idb:(0,4),352,32;;:T(0,52)=s16subheader:(0,43),0,32;nblock:(0,3),32,32;start:(0,3),64,32;ifile:(0,4),96,32;;SubheaderFile:t(0,51)=(0,52)ntop:(0,3)div:(0,3)nlists:(0,3)nii:(0,3)path:(0,53)subheader:r(0,43)idb_file:r(0,47)ifile:r(0,4):t(0,53)=ar(0,28);0;2047;(0,32)errstr:(0,31)errstr:(0,31)errstr:(0,31)errstr:(0,31)errstr:(0,31)free_interval_dbfile:F(0,3)db_file:P(0,47)save_text_file:F(0,3)filestem:P(0,48)basestem:P(0,48)err_msg:P(0,48)ofile:P(0,4)i:r(0,3)n:(0,3)ntop:(0,3)div:(0,3)nlists:(0,3)nii:(0,3)npad:r(0,3)path:(0,53)im:(0,5)ii:(0,36)subheader:(0,44)ifile:r(0,4)text_file_to_binaries:F(0,3)infile:P(0,4)buildpath:P(0,48)err_msg:P(0,48)i:r(0,3)n:(0,3)ntop:(0,3)div:(0,3)nlists:(0,3)nii:(0,3)npad:r(0,3)path:(0,53)line:(0,54)filestem:(0,53)im:(0,5)ii:(0,36)subheader:(0,44)ifile:r(0,4):t(0,54)=ar(0,28);0;32767;(0,32)find_suboverlap_start:F(0,3)start:P(0,3)end:P(0,3)isub:P(0,3)im:P(0,2)subheader:P(0,43)nlists:P(0,3)i:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)find_file_start:F(0,3)it:P(0,38)start:P(0,3)end:P(0,3)isub:P(0,3)ii:P(0,35)nii:P(0,3)subheader:P(0,43)nlists:P(0,3)subheader_file:p(0,55)ntop:p(0,3)div:p(0,3)ifile:p(0,4)i_div:r(0,3):t(0,55)=*(0,51)offset:r(0,3)offset_div:r(0,3)subheader_file:r(0,55)ntop:r(0,3)div:r(0,3)ifile:r(0,4)r:r(0,3)ifile:r(0,4)nblock:r(0,3)subheader:r(0,43)ipos:r(0,42)start:r(0,46)ifile:r(0,4)nblock:r(0,3)subheader:r(0,43)ipos:r(0,42)start:r(0,46)im:r(0,35)r:r(0,3)im:r(0,35)r:r(0,3)im:r(0,35)r:r(0,3)errstr:(0,31)errstr:(0,31)ntop:r(0,3)i_div:r(0,3)ipos:r(0,42)ntop:r(0,3)i_div:r(0,3)ipos:r(0,42)n:r(0,3)im:r(0,2)l:r(0,3)r:r(0,3)n:r(0,3)im:r(0,2)l:r(0,3)r:r(0,3)_err_msg.7580write_binary_files:F(0,48)im:P(0,2)n:P(0,3)ntop:P(0,3)div:P(0,3)subheader:P(0,43)nlists:P(0,3)filestem:P(0,48)i:r(0,3)npad:r(0,3)nii:r(0,3)path:(0,53)ifile:r(0,4)ifile_subheader:r(0,4)sh_tmp:(0,44)err_msg:V(0,31)i:r(0,3)npad:r(0,3)im:r(0,2)i:r(0,3)npad:r(0,3)im:r(0,2)i:r(0,3)npad:r(0,3)i:r(0,3)j:r(0,3)im:r(0,2)i:r(0,3)j:r(0,3)nsave:r(0,3)im:r(0,2)i:r(0,3)j:r(0,3)nsave:r(0,3)i:r(0,3)j:r(0,3)build_nested_list_inplace:F(0,43)im:P(0,2)n:P(0,3)p_n:P(0,56)p_nlists:P(0,56):t(0,56)=*(0,3)isublist:r(0,3)total:r(0,3)temp:r(0,3)subheader:r(0,43)tmp:r(0,3)tmp:r(0,3)tmp:r(0,3)errstr:(0,31)errstr:(0,31)errstr:(0,31)tmp:r(0,3)build_nested_list:F(0,43)im:P(0,2)n:P(0,3)p_n:P(0,56)p_nlists:P(0,56)i:r(0,3)parent:r(0,3)nsub:r(0,3)nlists:r(0,3)subheader:r(0,43)tmp:r(0,3)tmp:r(0,3)tmp:r(0,3)errstr:(0,31)errstr:(0,31)errstr:(0,31)errstr:(0,31)errstr:(0,31)tmp:r(0,3)find_intervals:F(0,3)it0:P(0,38)start:P(0,3)end:P(0,3)im:P(0,2)n:P(0,3)subheader:P(0,43)nlists:P(0,3)buf:P(0,2)nbuf:p(0,3)p_nreturn:p(0,56)it_return:p(0,57)it:r(0,38)it2:r(0,38)ibuf:r(0,3):t(0,57)=*(0,38)j:r(0,3)k:r(0,3)ori_sign:r(0,3)nbuf:r(0,3)p_nreturn:r(0,56)it_return:r(0,57)errstr:(0,31)errstr:(0,31)l:r(0,3)r:r(0,3)l:r(0,3)r:r(0,3)i:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)n:r(0,3)im:r(0,2)r:r(0,3)it2:r(0,38)tmp:r(0,3)find_file_intervals:F(0,3)it0:P(0,38)start:P(0,3)end:P(0,3)ii:P(0,35)nii:P(0,3)subheader:P(0,43)nlists:P(0,3)subheader_file:P(0,55)ntop:p(0,3)div:p(0,3)ifile:p(0,4)buf:p(0,2)nbuf:p(0,3)p_nreturn:p(0,56)it_return:p(0,57)it:r(0,38)it2:r(0,38)k:r(0,3)ibuf:r(0,3)ori_sign:r(0,3)ov:r(0,3)ntop:r(0,3)div:r(0,3)ifile:r(0,4)nbuf:r(0,3)errstr:(0,31)ntop:r(0,3)imdiv:r(0,2)ipos:r(0,42)ntop:r(0,3)imdiv:r(0,2)ipos:r(0,42)ntop:r(0,3)imdiv:r(0,2)ipos:r(0,42)it2:r(0,38)tmp:r(0,3)errstr:(0,31)C_int_max:G(0,3)/Users/administrator/Desktop/pygr-0.8.1/pygr/cnestedlist.cgcc2_compiled.:t(0,1)=(0,1)___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASliceIterator___pyx_tp_as_number_NLMSASliceIterator___pyx_tp_as_sequence_NLMSASliceIterator___pyx_tp_as_mapping_NLMSASliceIterator___pyx_tp_as_buffer_NLMSASliceIterator___pyx_tp_traverse_4pygr_11cnestedlist_NLMSASliceIterator___pyx_tp_clear_4pygr_11cnestedlist_NLMSASliceIterator___pyx_f_4pygr_11cnestedlist_18NLMSASliceIterator___iter_____pyx_f_4pygr_11cnestedlist_18NLMSASliceIterator___next_____pyx_methods_4pygr_11cnestedlist_NLMSASliceIterator___pyx_tp_new_4pygr_11cnestedlist_NLMSASliceIterator___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSANode___pyx_f_4pygr_11cnestedlist_9NLMSANode___cmp_____pyx_tp_as_number_NLMSANode___pyx_tp_as_sequence_NLMSANode___pyx_tp_as_mapping_NLMSANode___pyx_tp_as_buffer_NLMSANode___pyx_tp_traverse_4pygr_11cnestedlist_NLMSANode___pyx_tp_clear_4pygr_11cnestedlist_NLMSANode___pyx_f_4pygr_11cnestedlist_9NLMSANode___iter_____pyx_methods_4pygr_11cnestedlist_NLMSANode___pyx_members_4pygr_11cnestedlist_NLMSANode___pyx_getsets_4pygr_11cnestedlist_NLMSANode___pyx_tp_new_4pygr_11cnestedlist_NLMSANode___pyx_getprop_4pygr_11cnestedlist_9NLMSANode_edges___pyx_k249___pyx_f_4pygr_11cnestedlist_9NLMSANode_getSeqPos___pyx_doc_4pygr_11cnestedlist_9NLMSANode_getSeqPos___pyx_f_4pygr_11cnestedlist_9NLMSANode_getEdgeSeqs___pyx_doc_4pygr_11cnestedlist_9NLMSANode_getEdgeSeqs___pyx_f_4pygr_11cnestedlist_9NLMSANode_nodeEdges___pyx_doc_4pygr_11cnestedlist_9NLMSANode_nodeEdges___pyx_f_4pygr_11cnestedlist_9NLMSANode___len_____pyx_f_4pygr_11cnestedlist_9NLMSANode___getitem_____pyx_sq_item_4pygr_11cnestedlist_NLMSANode___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASliceLetters___pyx_tp_as_number_NLMSASliceLetters___pyx_tp_as_sequence_NLMSASliceLetters___pyx_tp_as_mapping_NLMSASliceLetters___pyx_tp_as_buffer_NLMSASliceLetters___pyx_tp_traverse_4pygr_11cnestedlist_NLMSASliceLetters___pyx_tp_clear_4pygr_11cnestedlist_NLMSASliceLetters___pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters___iter_____pyx_methods_4pygr_11cnestedlist_NLMSASliceLetters___pyx_members_4pygr_11cnestedlist_NLMSASliceLetters___pyx_tp_new_4pygr_11cnestedlist_NLMSASliceLetters___pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters_items___pyx_doc_4pygr_11cnestedlist_17NLMSASliceLetters_items___pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters_iteritems___pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters___getitem_____pyx_sq_item_4pygr_11cnestedlist_NLMSASliceLetters___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASlice___pyx_f_4pygr_11cnestedlist_10NLMSASlice___cmp_____pyx_f_4pygr_11cnestedlist_10NLMSASlice___repr_____pyx_tp_as_number_NLMSASlice___pyx_tp_as_sequence_NLMSASlice___pyx_tp_as_mapping_NLMSASlice___pyx_f_4pygr_11cnestedlist_10NLMSASlice___hash_____pyx_tp_as_buffer_NLMSASlice___pyx_tp_traverse_4pygr_11cnestedlist_NLMSASlice___pyx_tp_clear_4pygr_11cnestedlist_NLMSASlice___pyx_f_4pygr_11cnestedlist_10NLMSASlice___iter_____pyx_methods_4pygr_11cnestedlist_NLMSASlice___pyx_members_4pygr_11cnestedlist_NLMSASlice___pyx_getsets_4pygr_11cnestedlist_NLMSASlice___pyx_tp_new_4pygr_11cnestedlist_NLMSASlice___pyx_getprop_4pygr_11cnestedlist_10NLMSASlice_letters___pyx_k248___pyx_f_4pygr_11cnestedlist_10NLMSASlice_edges___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_edges___pyx_f_4pygr_11cnestedlist_10NLMSASlice_items___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_items___pyx_f_4pygr_11cnestedlist_10NLMSASlice_iteritems___pyx_f_4pygr_11cnestedlist_10NLMSASlice_keys___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_keys___pyx_f_4pygr_11cnestedlist_10NLMSASlice_matchIntervals___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_matchIntervals___pyx_f_4pygr_11cnestedlist_10NLMSASlice_findSeqEnds___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_findSeqEnds___pyx_f_4pygr_11cnestedlist_10NLMSASlice_generateSeqEnds___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_generateSeqEnds___pyx_f_4pygr_11cnestedlist_10NLMSASlice_groupByIntervals___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_groupByIntervals___pyx_f_4pygr_11cnestedlist_10NLMSASlice_conservationFilter___pyx_f_4pygr_11cnestedlist_10NLMSASlice_filterIvalConservation___pyx_f_4pygr_11cnestedlist_10NLMSASlice_groupBySequences___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_groupBySequences___pyx_f_4pygr_11cnestedlist_10NLMSASlice_clip_interval_list___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_clip_interval_list___pyx_f_4pygr_11cnestedlist_10NLMSASlice_split___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_split___pyx_f_4pygr_11cnestedlist_10NLMSASlice_regions___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_regions___pyx_f_4pygr_11cnestedlist_10NLMSASlice_rawIvals___pyx_doc_4pygr_11cnestedlist_10NLMSASlice_rawIvals___pyx_f_4pygr_11cnestedlist_10NLMSASlice___len_____pyx_f_4pygr_11cnestedlist_10NLMSASlice___getitem_____pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSASlice___pyx_sq_item_4pygr_11cnestedlist_NLMSASlice___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSA___pyx_tp_as_number_NLMSA___pyx_tp_as_sequence_NLMSA___pyx_tp_as_mapping_NLMSA___pyx_tp_as_buffer_NLMSA___pyx_tp_traverse_4pygr_11cnestedlist_NLMSA___pyx_tp_clear_4pygr_11cnestedlist_NLMSA___pyx_f_4pygr_11cnestedlist_5NLMSA___iter_____pyx_methods_4pygr_11cnestedlist_NLMSA___pyx_members_4pygr_11cnestedlist_NLMSA___pyx_f_4pygr_11cnestedlist_5NLMSA___init_____pyx_tp_new_4pygr_11cnestedlist_NLMSA___pyx_f_4pygr_11cnestedlist_5NLMSA_close___pyx_doc_4pygr_11cnestedlist_5NLMSA_close___pyx_f_4pygr_11cnestedlist_5NLMSA___reduce_____pyx_f_4pygr_11cnestedlist_5NLMSA___getstate_____pyx_f_4pygr_11cnestedlist_5NLMSA___setstate_____pyx_f_4pygr_11cnestedlist_5NLMSA_read_indexes___pyx_doc_4pygr_11cnestedlist_5NLMSA_read_indexes___pyx_f_4pygr_11cnestedlist_5NLMSA_read_attrs___pyx_doc_4pygr_11cnestedlist_5NLMSA_read_attrs___pyx_f_4pygr_11cnestedlist_5NLMSA_addToSeqlist___pyx_doc_4pygr_11cnestedlist_5NLMSA_addToSeqlist___pyx_f_4pygr_11cnestedlist_5NLMSA_newSequence___pyx_doc_4pygr_11cnestedlist_5NLMSA_newSequence___pyx_f_4pygr_11cnestedlist_5NLMSA_nextID___pyx_doc_4pygr_11cnestedlist_5NLMSA_nextID___pyx_f_4pygr_11cnestedlist_5NLMSA_initLPO___pyx_doc_4pygr_11cnestedlist_5NLMSA_initLPO___pyx_f_4pygr_11cnestedlist_5NLMSA_init_pairwise_mode___pyx_doc_4pygr_11cnestedlist_5NLMSA_init_pairwise_mode___pyx_f_4pygr_11cnestedlist_5NLMSA_addAnnotation___pyx_doc_4pygr_11cnestedlist_5NLMSA_addAnnotation___pyx_f_4pygr_11cnestedlist_5NLMSA_add_aligned_intervals___pyx_doc_4pygr_11cnestedlist_5NLMSA_add_aligned_intervals___pyx_f_4pygr_11cnestedlist_5NLMSA_readMAFfiles___pyx_doc_4pygr_11cnestedlist_5NLMSA_readMAFfiles___pyx_f_4pygr_11cnestedlist_5NLMSA_readAxtNet___pyx_doc_4pygr_11cnestedlist_5NLMSA_readAxtNet___pyx_f_4pygr_11cnestedlist_5NLMSA_buildFiles___pyx_doc_4pygr_11cnestedlist_5NLMSA_buildFiles___pyx_f_4pygr_11cnestedlist_5NLMSA_save_seq_dict___pyx_doc_4pygr_11cnestedlist_5NLMSA_save_seq_dict___pyx_f_4pygr_11cnestedlist_5NLMSA_build___pyx_doc_4pygr_11cnestedlist_5NLMSA_build___pyx_f_4pygr_11cnestedlist_5NLMSA_seqInterval___pyx_doc_4pygr_11cnestedlist_5NLMSA_seqInterval___pyx_f_4pygr_11cnestedlist_5NLMSA___getitem_____pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSA___pyx_sq_item_4pygr_11cnestedlist_NLMSA___pyx_f_4pygr_11cnestedlist_5NLMSA___invert_____pyx_f_4pygr_11cnestedlist_5NLMSA___iadd_____pyx_tp_dealloc_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_tp_as_number_IntervalFileDBIterator___pyx_tp_as_sequence_IntervalFileDBIterator___pyx_tp_as_mapping_IntervalFileDBIterator___pyx_tp_as_buffer_IntervalFileDBIterator___pyx_tp_traverse_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_tp_clear_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator___iter_____pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator___next_____pyx_methods_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_tp_new_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_mergeSeq___pyx_doc_4pygr_11cnestedlist_22IntervalFileDBIterator_mergeSeq___pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASequence___pyx_tp_as_number_NLMSASequence___pyx_tp_as_sequence_NLMSASequence___pyx_tp_as_mapping_NLMSASequence___pyx_tp_as_buffer_NLMSASequence___pyx_tp_traverse_4pygr_11cnestedlist_NLMSASequence___pyx_tp_clear_4pygr_11cnestedlist_NLMSASequence___pyx_methods_4pygr_11cnestedlist_NLMSASequence___pyx_members_4pygr_11cnestedlist_NLMSASequence___pyx_f_4pygr_11cnestedlist_13NLMSASequence___init_____pyx_tp_new_4pygr_11cnestedlist_NLMSASequence___pyx_f_4pygr_11cnestedlist_13NLMSASequence_forceLoad___pyx_doc_4pygr_11cnestedlist_13NLMSASequence_forceLoad___pyx_f_4pygr_11cnestedlist_13NLMSASequence_close___pyx_doc_4pygr_11cnestedlist_13NLMSASequence_close___pyx_f_4pygr_11cnestedlist_13NLMSASequence_buildFiles___pyx_doc_4pygr_11cnestedlist_13NLMSASequence_buildFiles___pyx_f_4pygr_11cnestedlist_13NLMSASequence_buildInMemory___pyx_f_4pygr_11cnestedlist_13NLMSASequence___len_____pyx_f_4pygr_11cnestedlist_13NLMSASequence___getitem_____pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSASequence___pyx_sq_item_4pygr_11cnestedlist_NLMSASequence___pyx_f_4pygr_11cnestedlist_13NLMSASequence___iadd_____pyx_tp_dealloc_4pygr_11cnestedlist_IntervalFileDB___pyx_tp_as_number_IntervalFileDB___pyx_tp_as_sequence_IntervalFileDB___pyx_tp_as_mapping_IntervalFileDB___pyx_tp_as_buffer_IntervalFileDB___pyx_methods_4pygr_11cnestedlist_IntervalFileDB___pyx_tp_new_4pygr_11cnestedlist_IntervalFileDB___pyx_f_4pygr_11cnestedlist_14IntervalFileDB_open___pyx_f_4pygr_11cnestedlist_14IntervalFileDB_find_overlap___pyx_f_4pygr_11cnestedlist_14IntervalFileDB_find_overlap_list___pyx_f_4pygr_11cnestedlist_14IntervalFileDB_check_nonempty___pyx_f_4pygr_11cnestedlist_14IntervalFileDB_close___pyx_tp_dealloc_4pygr_11cnestedlist_IntervalDBIterator___pyx_tp_as_number_IntervalDBIterator___pyx_tp_as_sequence_IntervalDBIterator___pyx_tp_as_mapping_IntervalDBIterator___pyx_tp_as_buffer_IntervalDBIterator___pyx_tp_traverse_4pygr_11cnestedlist_IntervalDBIterator___pyx_tp_clear_4pygr_11cnestedlist_IntervalDBIterator___pyx_f_4pygr_11cnestedlist_18IntervalDBIterator___iter_____pyx_f_4pygr_11cnestedlist_18IntervalDBIterator___next_____pyx_methods_4pygr_11cnestedlist_IntervalDBIterator___pyx_tp_new_4pygr_11cnestedlist_IntervalDBIterator___pyx_tp_dealloc_4pygr_11cnestedlist_IntervalDB___pyx_tp_as_number_IntervalDB___pyx_tp_as_sequence_IntervalDB___pyx_tp_as_mapping_IntervalDB___pyx_tp_as_buffer_IntervalDB___pyx_methods_4pygr_11cnestedlist_IntervalDB___pyx_tp_new_4pygr_11cnestedlist_IntervalDB___pyx_f_4pygr_11cnestedlist_10IntervalDB_save_tuples___pyx_doc_4pygr_11cnestedlist_10IntervalDB_save_tuples___pyx_f_4pygr_11cnestedlist_10IntervalDB_runBuildMethod___pyx_doc_4pygr_11cnestedlist_10IntervalDB_runBuildMethod___pyx_f_4pygr_11cnestedlist_10IntervalDB_buildFromUnsortedFile___pyx_doc_4pygr_11cnestedlist_10IntervalDB_buildFromUnsortedFile___pyx_f_4pygr_11cnestedlist_10IntervalDB_find_overlap___pyx_f_4pygr_11cnestedlist_10IntervalDB_find_overlap_list___pyx_f_4pygr_11cnestedlist_10IntervalDB_check_nonempty___pyx_f_4pygr_11cnestedlist_10IntervalDB_write_binaries___pyx_f_4pygr_11cnestedlist_10IntervalDB_close___pyx_ptype_4pygr_11cnestedlist_IntervalDBIterator___pyx_k6___pyx_k1___pyx_ptype_4pygr_11cnestedlist_IntervalDB___pyx_ptype_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_ptype_4pygr_11cnestedlist_NLMSASlice___pyx_ptype_4pygr_11cnestedlist_IntervalFileDB___pyx_k105___pyx_ptype_4pygr_11cnestedlist_NLMSA___pyx_ptype_4pygr_11cnestedlist_NLMSASequence___pyx_k188___pyx_k182___pyx_k179___pyx_ptype_4pygr_11cnestedlist_NLMSASliceLetters___pyx_ptype_4pygr_11cnestedlist_NLMSANode___pyx_ptype_4pygr_11cnestedlist_NLMSASliceIterator___pyx_string_tab___pyx_n_AttributeError___pyx_k22___pyx_n_BuildMSASlice___pyx_k168___pyx_n_ClassicUnpickler___pyx_k140___pyx_n_DictQueue___pyx_k81___pyx_n_EmptyAlignmentError___pyx_k203___pyx_n_EmptySlice___pyx_k172___pyx_n_EmptySliceError___pyx_k25___pyx_n_FloatType___pyx_k74___pyx_n_LetterEdge___pyx_k95___pyx_n_NLMSASeqDict___pyx_k122___pyx_n_NLMSASequence___pyx_k244___pyx_n_NLMSA_LPO_Internal___pyx_k154___pyx_n_NLMSA_UNION_Internal___pyx_k202___pyx_n_NLMSAindex___pyx_k150___pyx_n_PrefixUnionDict___pyx_k241___pyx_n_RLIMIT_NOFILE___pyx_k121___pyx_n_Seq2SeqEdge___pyx_k44___pyx_n_SeqCacheOwner___pyx_k33___pyx_n_SeqPath___pyx_k171___pyx_n_SeqPrefixUnionDict___pyx_k133___pyx_n_StringType___pyx_k96___pyx_n___class_____pyx_k141___pyx_n___getstate_____pyx_k142___pyx_n___iadd_____pyx_k117___pyx_n___init_____pyx_k147___pyx_n__cache_max___pyx_k30___pyx_n__persistent_id___pyx_k218___pyx_n_absoluteSlice___pyx_k50___pyx_n_addAll___pyx_k134___pyx_n_addToSeqlist___pyx_k157___pyx_n_add_aligned_intervals___pyx_k136___pyx_n_advanceStartStop___pyx_k87___pyx_n_append___pyx_k10___pyx_n_basename___pyx_k193___pyx_n_build___pyx_k137___pyx_n_buildFiles___pyx_k199___pyx_n_buildFromUnsortedFile___pyx_k108___pyx_n_buildInMemory___pyx_k210___pyx_n_cacheHint___pyx_k31___pyx_n_cache_reference___pyx_k38___pyx_n_check_nonempty___pyx_k9___pyx_n_chr___pyx_k187___pyx_n_classutil___pyx_k213___pyx_n_clip_interval_list___pyx_k71___pyx_n_close___pyx_k4___pyx_n_cmp___pyx_k84___pyx_n_conservationFilter___pyx_k73___pyx_n_conservedSegment___pyx_k70___pyx_n_doSlice___pyx_k20___pyx_n_dump___pyx_k206___pyx_n_edges___pyx_k45___pyx_n_end___pyx_k94___pyx_n_filterIvalConservation___pyx_k68___pyx_n_filterSeqs___pyx_k63___pyx_n_forceLoad___pyx_k12___pyx_n_get___pyx_k221___pyx_n_getID___pyx_k48___pyx_n_getIDcoords___pyx_k55___pyx_n_getSeq___pyx_k37___pyx_n_getSeqID___pyx_k32___pyx_n_groupByIntervals___pyx_k40___pyx_n_groupBySequences___pyx_k42___pyx_n_id___pyx_k34___pyx_n_im___pyx_k93___pyx_n_indelCut___pyx_k80___pyx_n_info___pyx_k166___pyx_n_initLPO___pyx_k135___pyx_n_inverseDB___pyx_k146___pyx_n_ipos___pyx_k91___pyx_n_is_bidirectional___pyx_k161___pyx_n_is_lpo___pyx_k29___pyx_n_is_union___pyx_k116___pyx_n_items___pyx_k19___pyx_n_iteritems___pyx_k58___pyx_n_join___pyx_k233___pyx_n_keys___pyx_k46___pyx_n_length___pyx_k101___pyx_n_load___pyx_k160___pyx_n_logger___pyx_k165___pyx_n_mapping___pyx_k75___pyx_n_maxAlignSize___pyx_k67___pyx_n_maxgap___pyx_k60___pyx_n_maxinsert___pyx_k61___pyx_n_memory___pyx_k102___pyx_n_mergeAll___pyx_k41___pyx_n_mergeSeq___pyx_k28___pyx_n_minAlignSize___pyx_k66___pyx_n_minAligned___pyx_k78___pyx_n_mininsert___pyx_k62___pyx_n_msaSlice___pyx_k59___pyx_n_n___pyx_k237___pyx_n_name___pyx_k98___pyx_n_newSequence___pyx_k115___pyx_n_nextID___pyx_k163___pyx_n_nlmsaSequence___pyx_k85___pyx_n_nlmsaSlice___pyx_k92___pyx_n_nlmsa_utils___pyx_k24___pyx_n_nodeEdges___pyx_k18___pyx_n_noname___pyx_k250___pyx_n_ns___pyx_k23___pyx_n_offset___pyx_k100___pyx_n_onDemand___pyx_k156___pyx_n_open___pyx_k16___pyx_n_open_shelve___pyx_k214___pyx_n_orientation___pyx_k49___pyx_n_os___pyx_k110___pyx_n_pAlignedMin___pyx_k64___pyx_n_pIdentityMin___pyx_k65___pyx_n_pMinAligned___pyx_k79___pyx_n_pairwiseMode___pyx_k162___pyx_n_path___pyx_k97___pyx_n_pathForward___pyx_k39___pyx_n_pathstem___pyx_k144___pyx_n_pickle___pyx_k158___pyx_n_prefixDict___pyx_k216___pyx_n_prune_self_mappings___pyx_k251___pyx_n_pygr___pyx_k235___pyx_n_r___pyx_n_rU___pyx_k149___pyx_n_rawIvals___pyx_k21___pyx_n_rb___pyx_n_readAxtNet___pyx_k131___pyx_n_readMAFfiles___pyx_k130___pyx_n_read_attrs___pyx_k129___pyx_n_read_indexes___pyx_k128___pyx_n_read_seq_dict___pyx_k127___pyx_n_relativeSlice___pyx_k69___pyx_n_remove___pyx_k111___pyx_n_reopenReadOnly___pyx_k198___pyx_n_resource___pyx_k119___pyx_n_runBuildMethod___pyx_k2___pyx_n_saveSeq___pyx_k118___pyx_n_save_seq_dict___pyx_k208___pyx_n_save_tuples___pyx_k112___pyx_n_seq___pyx_k169___pyx_n_seqBounds___pyx_k51___pyx_n_seqDict___pyx_k145___pyx_n_seqInfoDict___pyx_k177___pyx_n_seqInterval___pyx_k36___pyx_n_seqdb___pyx_k132___pyx_n_seqlist___pyx_k123___pyx_n_sequence___pyx_k43___pyx_n_setrlimit___pyx_k120___pyx_n_sort___pyx_k76___pyx_n_sourceDB___pyx_k124___pyx_n_sourceOnly___pyx_k77___pyx_n_sourcePath___pyx_k54___pyx_n_split___pyx_k82___pyx_n_splitLPOintervals___pyx_k174___pyx_n_start___pyx_k56___pyx_n_startswith___pyx_k243___pyx_n_stop___pyx_k57___pyx_n_string___pyx_k189___pyx_n_strip___pyx_k151___pyx_n_sys___pyx_k205___pyx_n_targetDB___pyx_k125___pyx_n_target_start___pyx_k52___pyx_n_types___pyx_k72___pyx_n_w___pyx_k103___pyx_n_warn___pyx_k185___pyx_n_wb___pyx_n_worldbase___pyx_k236___pyx_n_write___pyx_k200___pyx_n_write_binaries___pyx_k109___pyx_n_xmlrpc___pyx_k138___pyx_k3p___pyx_k3___pyx_k5p___pyx_k5___pyx_k7p___pyx_k7___pyx_k8p___pyx_k8___pyx_k11p___pyx_k11___pyx_k13p___pyx_k13___pyx_k14p___pyx_k14___pyx_k15p___pyx_k15___pyx_k17p___pyx_k17___pyx_k26p___pyx_k26___pyx_k27p___pyx_k27___pyx_k35p___pyx_k35___pyx_k47p___pyx_k47___pyx_k53p___pyx_k53___pyx_k83p___pyx_k83___pyx_k86p___pyx_k86___pyx_k88p___pyx_k88___pyx_k89p___pyx_k89___pyx_k90p___pyx_k90___pyx_k99p___pyx_k99___pyx_k104p___pyx_k104___pyx_k106p___pyx_k106___pyx_k107p___pyx_k107___pyx_k113p___pyx_k113___pyx_k114p___pyx_k114___pyx_k126p___pyx_k126___pyx_k139p___pyx_k139___pyx_k143p___pyx_k143___pyx_k148p___pyx_k148___pyx_k152p___pyx_k152___pyx_k153p___pyx_k153___pyx_k155p___pyx_k155___pyx_k159p___pyx_k159___pyx_k164p___pyx_k164___pyx_k167p___pyx_k167___pyx_k170p___pyx_k170___pyx_k173p___pyx_k173___pyx_k175p___pyx_k175___pyx_k176p___pyx_k176___pyx_k178p___pyx_k178___pyx_k180p___pyx_k180___pyx_k181p___pyx_k181___pyx_k183p___pyx_k183___pyx_k184p___pyx_k184___pyx_k186p___pyx_k186___pyx_k190p___pyx_k190___pyx_k191p___pyx_k191___pyx_k192p___pyx_k192___pyx_k194p___pyx_k194___pyx_k195p___pyx_k195___pyx_k196p___pyx_k196___pyx_k197p___pyx_k197___pyx_k201p___pyx_k201___pyx_k204p___pyx_k204___pyx_k207p___pyx_k207___pyx_k209p___pyx_k209___pyx_k211p___pyx_k211___pyx_k212p___pyx_k212___pyx_k215p___pyx_k215___pyx_k220p___pyx_k220___pyx_k223p___pyx_k223___pyx_k224p___pyx_k224___pyx_k228p___pyx_k228___pyx_k229p___pyx_k229___pyx_k231p___pyx_k231___pyx_k232p___pyx_k232___pyx_k234p___pyx_k234___pyx_k238p___pyx_k238___pyx_k240p___pyx_k240___pyx_k245p___pyx_k245___pyx_k246p___pyx_k246___pyx_k247p___pyx_k247___pyx_methods___pyx_f_4pygr_11cnestedlist_advanceStartStop___pyx_f_4pygr_11cnestedlist_dump_textfile___pyx_doc_4pygr_11cnestedlist_dump_textfile___pyx_f_4pygr_11cnestedlist_textfile_to_binaries___pyx_doc_4pygr_11cnestedlist_textfile_to_binaries___pyx_k242___pyx_k239___pyx_k219___pyx_k230___pyx_k217___pyx_k227___pyx_k226___pyx_k225___pyx_k222___pyx_filenames__pyx_f_4pygr_11cnestedlist_18IntervalDBIterator___iter__:f(0,2)__pyx_v_self:P(0,2)void:t(0,1):t(0,2)=*(0,3)PyObject:t(0,3)=(0,4)_object:T(0,4)=s8ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;;int:t(0,5)=r(0,5);-2147483648;2147483647;:t(0,6)=*(0,7)_typeobject:T(0,7)=s192ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;ob_size:(0,5),64,32;tp_name:(0,8),96,32;tp_basicsize:(0,5),128,32;tp_itemsize:(0,5),160,32;tp_dealloc:(0,9),192,32;tp_print:(0,11),224,32;tp_getattr:(0,13),256,32;tp_setattr:(0,15),288,32;tp_compare:(0,17),320,32;tp_repr:(0,19),352,32;tp_as_number:(0,21),384,32;tp_as_sequence:(0,22),416,32;tp_as_mapping:(0,23),448,32;tp_hash:(0,24),480,32;tp_call:(0,26),512,32;tp_str:(0,19),544,32;tp_getattro:(0,28),576,32;tp_setattro:(0,30),608,32;tp_as_buffer:(0,32),640,32;tp_flags:(0,33),672,32;tp_doc:(0,8),704,32;tp_traverse:(0,34),736,32;tp_clear:(0,36),768,32;tp_richcompare:(0,38),800,32;tp_weaklistoffset:(0,33),832,32;tp_iter:(0,40),864,32;tp_iternext:(0,41),896,32;tp_methods:(0,42),928,32;tp_members:(0,43),960,32;tp_getset:(0,44),992,32;tp_base:(0,6),1024,32;tp_dict:(0,2),1056,32;tp_descr_get:(0,45),1088,32;tp_descr_set:(0,46),1120,32;tp_dictoffset:(0,33),1152,32;tp_init:(0,47),1184,32;tp_alloc:(0,48),1216,32;tp_new:(0,50),1248,32;tp_free:(0,52),1280,32;tp_is_gc:(0,36),1312,32;tp_bases:(0,2),1344,32;tp_mro:(0,2),1376,32;tp_cache:(0,2),1408,32;tp_subclasses:(0,2),1440,32;tp_weaklist:(0,2),1472,32;tp_del:(0,9),1504,32;;:t(0,8)=*(0,54):t(0,10)=*(0,55)destructor:t(0,9)=(0,10):t(0,12)=*(0,56)printfunc:t(0,11)=(0,12):t(0,14)=*(0,57)getattrfunc:t(0,13)=(0,14):t(0,16)=*(0,58)setattrfunc:t(0,15)=(0,16):t(0,18)=*(0,59)cmpfunc:t(0,17)=(0,18):t(0,20)=*(0,60)reprfunc:t(0,19)=(0,20):t(0,21)=*(0,61):t(0,22)=*(0,62):t(0,23)=*(0,63):t(0,25)=*(0,64)hashfunc:t(0,24)=(0,25):t(0,27)=*(0,65)ternaryfunc:t(0,26)=(0,27):t(0,29)=*(0,66)getattrofunc:t(0,28)=(0,29):t(0,31)=*(0,67)setattrofunc:t(0,30)=(0,31):t(0,32)=*(0,68)long int:t(0,33)=r(0,33);-2147483648;2147483647;:t(0,35)=*(0,69)traverseproc:t(0,34)=(0,35):t(0,37)=*(0,70)inquiry:t(0,36)=(0,37):t(0,39)=*(0,71)richcmpfunc:t(0,38)=(0,39)getiterfunc:t(0,40)=(0,20)iternextfunc:t(0,41)=(0,20):t(0,42)=*(0,72):t(0,43)=*(0,73):t(0,44)=*(0,74)descrgetfunc:t(0,45)=(0,27)descrsetfunc:t(0,46)=(0,31)initproc:t(0,47)=(0,31):t(0,49)=*(0,75)allocfunc:t(0,48)=(0,49):t(0,51)=*(0,76)newfunc:t(0,50)=(0,51):t(0,53)=*(0,77)freefunc:t(0,52)=(0,53)char:t(0,54)=r(0,54);0;127;:t(0,55)=f(0,1):t(0,56)=f(0,5):t(0,57)=f(0,2):t(0,58)=f(0,5):t(0,59)=f(0,5):t(0,60)=f(0,2)PyNumberMethods:t(0,61)=(0,78)PySequenceMethods:t(0,62)=(0,79)PyMappingMethods:t(0,63)=(0,80):t(0,64)=f(0,33):t(0,65)=f(0,2):t(0,66)=f(0,2):t(0,67)=f(0,5)PyBufferProcs:t(0,68)=(0,81):t(0,69)=f(0,5):t(0,70)=f(0,5):t(0,71)=f(0,2)PyMethodDef:T(0,72)=s16ml_name:(0,8),0,32;ml_meth:(0,82),32,32;ml_flags:(0,5),64,32;ml_doc:(0,8),96,32;;PyMemberDef:T(0,73)=s20name:(0,8),0,32;type:(0,5),32,32;offset:(0,5),64,32;flags:(0,5),96,32;doc:(0,8),128,32;;PyGetSetDef:T(0,74)=s20name:(0,8),0,32;get:(0,83),32,32;set:(0,85),64,32;doc:(0,8),96,32;closure:(0,87),128,32;;:t(0,75)=f(0,2):t(0,76)=f(0,2):t(0,77)=f(0,1):T(0,78)=s152nb_add:(0,88),0,32;nb_subtract:(0,88),32,32;nb_multiply:(0,88),64,32;nb_divide:(0,88),96,32;nb_remainder:(0,88),128,32;nb_divmod:(0,88),160,32;nb_power:(0,26),192,32;nb_negative:(0,89),224,32;nb_positive:(0,89),256,32;nb_absolute:(0,89),288,32;nb_nonzero:(0,36),320,32;nb_invert:(0,89),352,32;nb_lshift:(0,88),384,32;nb_rshift:(0,88),416,32;nb_and:(0,88),448,32;nb_xor:(0,88),480,32;nb_or:(0,88),512,32;nb_coerce:(0,90),544,32;nb_int:(0,89),576,32;nb_long:(0,89),608,32;nb_float:(0,89),640,32;nb_oct:(0,89),672,32;nb_hex:(0,89),704,32;nb_inplace_add:(0,88),736,32;nb_inplace_subtract:(0,88),768,32;nb_inplace_multiply:(0,88),800,32;nb_inplace_divide:(0,88),832,32;nb_inplace_remainder:(0,88),864,32;nb_inplace_power:(0,26),896,32;nb_inplace_lshift:(0,88),928,32;nb_inplace_rshift:(0,88),960,32;nb_inplace_and:(0,88),992,32;nb_inplace_xor:(0,88),1024,32;nb_inplace_or:(0,88),1056,32;nb_floor_divide:(0,88),1088,32;nb_true_divide:(0,88),1120,32;nb_inplace_floor_divide:(0,88),1152,32;nb_inplace_true_divide:(0,88),1184,32;;:T(0,79)=s40sq_length:(0,36),0,32;sq_concat:(0,88),32,32;sq_repeat:(0,92),64,32;sq_item:(0,92),96,32;sq_slice:(0,94),128,32;sq_ass_item:(0,96),160,32;sq_ass_slice:(0,98),192,32;sq_contains:(0,100),224,32;sq_inplace_concat:(0,88),256,32;sq_inplace_repeat:(0,92),288,32;;:T(0,80)=s12mp_length:(0,36),0,32;mp_subscript:(0,88),32,32;mp_ass_subscript:(0,101),64,32;;:T(0,81)=s16bf_getreadbuffer:(0,102),0,32;bf_getwritebuffer:(0,104),32,32;bf_getsegcount:(0,105),64,32;bf_getcharbuffer:(0,107),96,32;;PyCFunction:t(0,82)=(0,29):t(0,84)=*(0,109)getter:t(0,83)=(0,84):t(0,86)=*(0,110)setter:t(0,85)=(0,86):t(0,87)=*(0,1)binaryfunc:t(0,88)=(0,29)unaryfunc:t(0,89)=(0,20):t(0,91)=*(0,111)coercion:t(0,90)=(0,91):t(0,93)=*(0,112)intargfunc:t(0,92)=(0,93):t(0,95)=*(0,113)intintargfunc:t(0,94)=(0,95):t(0,97)=*(0,114)intobjargproc:t(0,96)=(0,97):t(0,99)=*(0,115)intintobjargproc:t(0,98)=(0,99)objobjproc:t(0,100)=(0,18)objobjargproc:t(0,101)=(0,31):t(0,103)=*(0,116)getreadbufferproc:t(0,102)=(0,103)getwritebufferproc:t(0,104)=(0,103):t(0,106)=*(0,117)getsegcountproc:t(0,105)=(0,106):t(0,108)=*(0,118)getcharbufferproc:t(0,107)=(0,108):t(0,109)=f(0,2):t(0,110)=f(0,5):t(0,111)=f(0,5):t(0,112)=f(0,2):t(0,113)=f(0,2):t(0,114)=f(0,5):t(0,115)=f(0,5):t(0,116)=f(0,5):t(0,117)=f(0,5):t(0,118)=f(0,5)___pyx_argnames.8632__pyx_f_4pygr_11cnestedlist_10IntervalDB_close:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_argnames:V(0,119):t(0,119)=ar(0,120);0;0;(0,8)long unsigned int:t(0,120)=r(0,120);0;037777777777;___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_reset__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_reset:f(0,5)__pyx_v_self:P(0,121):t(0,121)=*(0,122)__pyx_obj_4pygr_11cnestedlist_IntervalFileDBIterator:T(0,122)=s52ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,123),64,32;it:(0,124),96,32;it_alloc:(0,124),128,32;im_buf:(0,125),160,32;ihit:(0,5),192,32;nhit:(0,5),224,32;start:(0,5),256,32;end:(0,5),288,32;nbuf:(0,5),320,32;db:(0,126),352,32;idb:(0,127),384,32;;:t(0,123)=*(0,128):t(0,124)=*(0,129):t(0,125)=*(0,130):t(0,126)=*(0,131):t(0,127)=*(0,132)__pyx_vtabstruct_4pygr_11cnestedlist_IntervalFileDBIterator:T(0,128)=s36restart:(0,133),0,32;reset:(0,134),32,32;cnext:(0,135),64,32;extend:(0,136),96,32;saveInterval:(0,137),128,32;nextBlock:(0,135),160,32;getIntervalMap:(0,138),192,32;loadAll:(0,134),224,32;copy:(0,139),256,32;;IntervalIterator:t(0,129)=(0,140)IntervalMap:t(0,130)=(0,141)__pyx_obj_4pygr_11cnestedlist_IntervalFileDB:T(0,131)=s12ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;db:(0,142),64,32;;__pyx_obj_4pygr_11cnestedlist_IntervalDB:T(0,132)=s28ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;n:(0,5),64,32;ntop:(0,5),96,32;nlists:(0,5),128,32;im:(0,125),160,32;subheader:(0,143),192,32;;:t(0,133)=*(0,144):t(0,134)=*(0,145):t(0,135)=*(0,146):t(0,136)=*(0,147):t(0,137)=*(0,148):t(0,138)=*(0,149):t(0,139)=*(0,150)IntervalIterator_S:T(0,140)=s32i:(0,5),0,32;n:(0,5),32,32;nii:(0,5),64,32;ntop:(0,5),96,32;i_div:(0,5),128,32;im:(0,125),160,32;up:(0,151),192,32;down:(0,151),224,32;;:T(0,141)=s24start:(0,5),0,32;end:(0,5),32,32;target_id:(0,5),64,32;target_start:(0,5),96,32;target_end:(0,5),128,32;sublist:(0,5),160,32;;:t(0,142)=*(0,152):t(0,143)=*(0,153):t(0,144)=f(0,5):t(0,145)=f(0,5):t(0,146)=f(0,5):t(0,147)=f(0,5):t(0,148)=f(0,5):t(0,149)=f(0,125):t(0,150)=f(0,5):t(0,151)=*(0,140)IntervalDBFile:t(0,152)=(0,154)SublistHeader:t(0,153)=(0,155):T(0,154)=s48n:(0,5),0,32;ntop:(0,5),32,32;nlists:(0,5),64,32;div:(0,5),96,32;nii:(0,5),128,32;ii:(0,156),160,32;subheader:(0,143),192,32;subheader_file:(0,157)=xsSubheaderFile:,224,128;ifile_idb:(0,159),352,32;;:T(0,155)=s8start:(0,5),0,32;len:(0,5),32,32;;:t(0,156)=*(0,160):T(0,158)=s16subheader:(0,143),0,32;nblock:(0,5),32,32;start:(0,5),64,32;ifile:(0,159),96,32;;SubheaderFile:t(0,157)=(0,158):t(0,159)=*(0,161)IntervalIndex:t(0,160)=(0,162)FILE:t(0,161)=(0,163):T(0,162)=s8start:(0,5),0,32;end:(0,5),32,32;;__sFILE:T(0,163)=s88_p:(0,164),0,32;_r:(0,5),32,32;_w:(0,5),64,32;_flags:(0,165),96,16;_file:(0,165),112,16;_bf:(0,166),128,64;_lbfsize:(0,5),192,32;_cookie:(0,87),224,32;_close:(0,167),256,32;_read:(0,168),288,32;_seek:(0,169),320,32;_write:(0,170),352,32;_ub:(0,166),384,64;_extra:(0,171),448,32;_ur:(0,5),480,32;_ubuf:(0,172),512,24;_nbuf:(0,173),536,8;_lb:(0,166),544,64;_blksize:(0,5),608,32;_offset:(0,174),640,64;;:t(0,164)=*(0,176)short int:t(0,165)=@s16;r(0,165);-32768;32767;__sbuf:T(0,166)=s8_base:(0,164),0,32;_size:(0,5),32,32;;:t(0,167)=*(0,177):t(0,168)=*(0,178):t(0,169)=*(0,179):t(0,170)=*(0,180):t(0,171)=*(0,181):t(0,172)=ar(0,120);0;2;(0,176):t(0,173)=ar(0,120);0;0;(0,176)__darwin_off_t:t(0,175)=(0,182)fpos_t:t(0,174)=(0,175)unsigned char:t(0,176)=@s8;r(0,176);0;255;:t(0,177)=f(0,5):t(0,178)=f(0,5):t(0,179)=f(0,174):t(0,180)=f(0,5):t(0,181)=xs__sFILEX:__int64_t:t(0,182)=(0,183)long long int:t(0,183)=@s64;r(0,183);01000000000000000000000;0777777777777777777777;___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_saveInterval__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_saveInterval:f(0,5)__pyx_v_self:P(0,121)__pyx_v_start:P(0,5)__pyx_v_end:P(0,5)__pyx_v_target_id:P(0,5)__pyx_v_target_start:P(0,5)__pyx_v_target_end:P(0,5)int:t(0,5)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_getIntervalMap__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_getIntervalMap:f(0,125)__pyx_v_self:P(0,121)__pyx_v_im:r(0,125)__pyx_r:r(0,125)__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator___iter__:f(0,2)__pyx_v_self:P(0,2)___pyx_argnames.9655__pyx_f_4pygr_11cnestedlist_14IntervalFileDB_close:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_argnames:V(0,184):t(0,184)=ar(0,120);0;0;(0,8)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___len__:f(0,185)__pyx_v_self:P(0,2)__pyx_r:r(0,185)Py_ssize_t:t(0,185)=(0,5)__pyx_f_4pygr_11cnestedlist_18NLMSASliceIterator___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_f_4pygr_11cnestedlist_9NLMSANode___len__:f(0,185)__pyx_v_self:P(0,2)__pyx_r:r(0,185)___pyx_f_4pygr_11cnestedlist_9NLMSANode_check_edge__pyx_f_4pygr_11cnestedlist_9NLMSANode_check_edge:f(0,5)__pyx_v_self:P(0,186)__pyx_v_iseq:P(0,5)__pyx_v_ipos:P(0,5)__pyx_v_i:r(0,5):t(0,186)=*(0,187)__pyx_obj_4pygr_11cnestedlist_NLMSANode:T(0,187)=s36ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,188),64,32;id:(0,5),96,32;ipos:(0,5),128,32;istart:(0,5),160,32;istop:(0,5),192,32;n:(0,5),224,32;nlmsaSlice:(0,189),256,32;;:t(0,188)=*(0,190):t(0,189)=*(0,191)__pyx_vtabstruct_4pygr_11cnestedlist_NLMSANode:T(0,190)=s4check_edge:(0,192),0,32;;__pyx_obj_4pygr_11cnestedlist_NLMSASlice:T(0,191)=s64ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,193),64,32;start:(0,5),96,32;stop:(0,5),128,32;id:(0,5),160,32;n:(0,5),192,32;nseqBounds:(0,5),224,32;nrealseq:(0,5),256,32;offset:(0,5),288,32;im:(0,125),320,32;seqBounds:(0,125),352,32;nlmsaSequence:(0,194),384,32;nlmsa:(0,195),416,32;seq:(0,2),448,32;weakestLink:(0,2),480,32;;:t(0,192)=*(0,196):t(0,193)=*(0,197):t(0,194)=*(0,198):t(0,195)=*(0,199):t(0,196)=f(0,5)__pyx_vtabstruct_4pygr_11cnestedlist_NLMSASlice:T(0,197)=s8findSeqBounds:(0,200),0,32;get_seq_interval:(0,201),32,32;;__pyx_obj_4pygr_11cnestedlist_NLMSASequence:T(0,198)=s68ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,202),64,32;id:(0,5),96,32;length:(0,5),128,32;nbuild:(0,5),160,32;is_lpo:(0,5),192,32;is_union:(0,5),224,32;offset:(0,2),256,32;seq:(0,2),288,32;name:(0,2),320,32;db:(0,126),352,32;idb:(0,127),384,32;build_ifile:(0,159),416,32;filestem:(0,2),448,32;nlmsaLetters:(0,195),480,32;buildList:(0,2),512,32;;__pyx_obj_4pygr_11cnestedlist_NLMSA:T(0,199)=s88ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,203),64,32;pathstem:(0,2),96,32;seqs:(0,2),128,32;seqlist:(0,2),160,32;seqDict:(0,2),192,32;currentUnion:(0,194),224,32;do_build:(0,5),256,32;lpoList:(0,2),288,32;maxLPOcoord:(0,2),320,32;lpo_id:(0,5),352,32;maxlen:(0,5),384,32;inlmsa:(0,5),416,32;is_bidirectional:(0,5),448,32;pairwiseMode:(0,5),480,32;in_memory_mode:(0,5),512,32;_persistent_id:(0,2),544,32;_ignoreShadowAttr:(0,2),576,32;__doc__:(0,2),608,32;_saveLocalBuild:(0,2),640,32;inverseDB:(0,2),672,32;;:t(0,200)=*(0,204):t(0,201)=*(0,205):t(0,202)=*(0,206):t(0,203)=*(0,207):t(0,204)=f(0,5):t(0,205)=f(0,2)__pyx_vtabstruct_4pygr_11cnestedlist_NLMSASequence:T(0,206)=s4saveInterval:(0,208),0,32;;__pyx_vtabstruct_4pygr_11cnestedlist_NLMSA:T(0,207)=s12free_seqidmap:(0,209),0,32;save_nbuild:(0,210),32,32;add_seqidmap_to_union:(0,211),64,32;;:t(0,208)=*(0,212):t(0,209)=*(0,213):t(0,210)=*(0,214):t(0,211)=*(0,215):t(0,212)=f(0,5):t(0,213)=f(0,1):t(0,214)=f(0,1):t(0,215)=f(0,194)__pyx_r:r(0,5)__pyx_1:r(0,5)___pyx_f_4pygr_11cnestedlist_5NLMSA_free_seqidmap__pyx_f_4pygr_11cnestedlist_5NLMSA_free_seqidmap:f(0,1)__pyx_v_self:P(0,195)__pyx_v_nseq0:P(0,5)__pyx_v_seqidmap:P(0,216)__pyx_v_i:r(0,5):t(0,216)=*(0,217)SeqIDMap:t(0,217)=(0,218):T(0,218)=s20id:(0,8),0,32;length:(0,5),32,32;ns_id:(0,5),64,32;offset:(0,5),96,32;nlmsa_id:(0,5),128,32;;__pyx_tp_dealloc_4pygr_11cnestedlist_IntervalDB:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_IntervalDBIterator:f(0,1)o:P(0,2)__pyx_obj_4pygr_11cnestedlist_IntervalDBIterator:T(0,219)=s24616ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;__pyx_vtab:(0,220),64,32;it:(0,124),96,32;it_alloc:(0,124),128,32;im_buf:(0,221),160,196608;ihit:(0,5),196768,32;nhit:(0,5),196800,32;start:(0,5),196832,32;end:(0,5),196864,32;db:(0,127),196896,32;;:t(0,220)=*(0,222):t(0,221)=ar(0,120);0;1023;(0,130)__pyx_vtabstruct_4pygr_11cnestedlist_IntervalDBIterator:T(0,222)=s4cnext:(0,223),0,32;;:t(0,223)=*(0,224):t(0,224)=f(0,5)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_IntervalDBIterator:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5):t(0,226)=*(0,227)visitproc:t(0,225)=(0,226):t(0,227)=f(0,5)__pyx_tp_clear_4pygr_11cnestedlist_IntervalDBIterator:f(0,5)o:P(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_IntervalFileDB:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)___pyx_vtabptr_4pygr_11cnestedlist_NLMSASequence__pyx_tp_new_4pygr_11cnestedlist_NLMSASequence:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2):t(0,228)=*(0,229)PyTypeObject:t(0,229)=(0,7)o:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASequence:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_NLMSASequence:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSASequence:f(0,5)o:P(0,2)t:r(0,2)__pyx_sq_item_4pygr_11cnestedlist_NLMSASequence:f(0,2)o:P(0,2)i:P(0,185)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_IntervalFileDBIterator:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_IntervalFileDBIterator:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_IntervalFileDBIterator:f(0,5)o:P(0,2)___pyx_vtabptr_4pygr_11cnestedlist_NLMSA__pyx_tp_new_4pygr_11cnestedlist_NLMSA:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSA:f(0,1)o:P(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_NLMSA:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSA:f(0,5)o:P(0,2)t:r(0,2)__pyx_sq_item_4pygr_11cnestedlist_NLMSA:f(0,2)o:P(0,2)i:P(0,185)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASlice:f(0,1)o:P(0,2)etype:(0,2)eval:(0,2)etb:(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_NLMSASlice:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSASlice:f(0,5)o:P(0,2)__pyx_sq_item_4pygr_11cnestedlist_NLMSASlice:f(0,2)o:P(0,2)i:P(0,185)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASliceLetters:f(0,1)o:P(0,2)__pyx_obj_4pygr_11cnestedlist_NLMSASliceLetters:T(0,230)=s12ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;nlmsaSlice:(0,189),64,32;;__pyx_tp_traverse_4pygr_11cnestedlist_NLMSASliceLetters:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSASliceLetters:f(0,5)o:P(0,2)__pyx_sq_item_4pygr_11cnestedlist_NLMSASliceLetters:f(0,2)o:P(0,2)i:P(0,185)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSANode:f(0,1)o:P(0,2)__pyx_tp_traverse_4pygr_11cnestedlist_NLMSANode:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSANode:f(0,5)o:P(0,2)__pyx_sq_item_4pygr_11cnestedlist_NLMSANode:f(0,2)o:P(0,2)i:P(0,185)r:r(0,2)x:r(0,2)__pyx_tp_dealloc_4pygr_11cnestedlist_NLMSASliceIterator:f(0,1)o:P(0,2)__pyx_obj_4pygr_11cnestedlist_NLMSASliceIterator:T(0,231)=s24ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;ipos:(0,5),64,32;istart:(0,5),96,32;istop:(0,5),128,32;nlmsaSlice:(0,189),160,32;;__pyx_tp_traverse_4pygr_11cnestedlist_NLMSASliceIterator:f(0,5)o:P(0,2)v:P(0,225)a:P(0,87)e:r(0,5)__pyx_tp_clear_4pygr_11cnestedlist_NLMSASliceIterator:f(0,5)o:P(0,2)___Pyx_Raise__Pyx_Raise:f(0,1)type:P(0,2)value:P(0,2)tb:P(0,2)___Pyx_GetStarArgs__Pyx_GetStarArgs:f(0,5)args:P(0,232)kwds:P(0,232)kwd_list:P(0,233)nargs:P(0,185)args2:P(0,232)kwds2:P(0,232)rqd_kwds:P(0,8)x:r(0,2)args1:r(0,2)kwds1:r(0,2)i:r(0,5):t(0,232)=*(0,2):t(0,233)=*(0,8)p:r(0,233)char:t(0,54)___Pyx_GetException__Pyx_GetException:f(0,5)type:P(0,232)value:P(0,232)tb:P(0,232)tstate:r(0,234):t(0,234)=*(0,235)PyThreadState:t(0,235)=(0,236)_ts:T(0,236)=s84next:(0,237),0,32;interp:(0,238),32,32;frame:(0,239),64,32;recursion_depth:(0,5),96,32;tracing:(0,5),128,32;use_tracing:(0,5),160,32;c_profilefunc:(0,240),192,32;c_tracefunc:(0,240),224,32;c_profileobj:(0,2),256,32;c_traceobj:(0,2),288,32;curexc_type:(0,2),320,32;curexc_value:(0,2),352,32;curexc_traceback:(0,2),384,32;exc_type:(0,2),416,32;exc_value:(0,2),448,32;exc_traceback:(0,2),480,32;dict:(0,2),512,32;tick_counter:(0,5),544,32;gilstate_counter:(0,5),576,32;async_exc:(0,2),608,32;thread_id:(0,33),640,32;;:t(0,237)=*(0,236):t(0,238)=*(0,242):t(0,239)=*(0,243):t(0,241)=*(0,244)Py_tracefunc:t(0,240)=(0,241)PyInterpreterState:t(0,242)=(0,245)_frame:T(0,243)=s336ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;ob_size:(0,5),64,32;f_back:(0,239),96,32;f_code:(0,246),128,32;f_builtins:(0,2),160,32;f_globals:(0,2),192,32;f_locals:(0,2),224,32;f_valuestack:(0,232),256,32;f_stacktop:(0,232),288,32;f_trace:(0,2),320,32;f_exc_type:(0,2),352,32;f_exc_value:(0,2),384,32;f_exc_traceback:(0,2),416,32;f_tstate:(0,234),448,32;f_lasti:(0,5),480,32;f_lineno:(0,5),512,32;f_restricted:(0,5),544,32;f_iblock:(0,5),576,32;f_blockstack:(0,247),608,1920;f_nlocals:(0,5),2528,32;f_ncells:(0,5),2560,32;f_nfreevars:(0,5),2592,32;f_stacksize:(0,5),2624,32;f_localsplus:(0,248),2656,32;;:t(0,244)=f(0,5)_is:T(0,245)=s36next:(0,249),0,32;tstate_head:(0,237),32,32;modules:(0,2),64,32;sysdict:(0,2),96,32;builtins:(0,2),128,32;codec_search_path:(0,2),160,32;codec_search_cache:(0,2),192,32;codec_error_registry:(0,2),224,32;dlopenflags:(0,5),256,32;;:t(0,246)=*(0,250):t(0,247)=ar(0,120);0;19;(0,251):t(0,248)=ar(0,120);0;0;(0,2):t(0,249)=*(0,245)PyCodeObject:t(0,250)=(0,252)PyTryBlock:t(0,251)=(0,253):T(0,252)=s64ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;co_argcount:(0,5),64,32;co_nlocals:(0,5),96,32;co_stacksize:(0,5),128,32;co_flags:(0,5),160,32;co_code:(0,2),192,32;co_consts:(0,2),224,32;co_names:(0,2),256,32;co_varnames:(0,2),288,32;co_freevars:(0,2),320,32;co_cellvars:(0,2),352,32;co_filename:(0,2),384,32;co_name:(0,2),416,32;co_firstlineno:(0,5),448,32;co_lnotab:(0,2),480,32;;:T(0,253)=s12b_type:(0,5),0,32;b_handler:(0,5),32,32;b_level:(0,5),64,32;;___Pyx_Import___pyx_b___pyx_m__Pyx_Import:f(0,2)name:P(0,2)from_list:P(0,2)__import__:r(0,2)empty_list:r(0,2)module:r(0,2)global_dict:r(0,2)empty_dict:r(0,2)list:r(0,2)___Pyx_AddTraceback___pyx_filename___pyx_lineno__Pyx_AddTraceback:f(0,1)funcname:P(0,8)py_srcfile:r(0,2)py_funcname:r(0,2)py_globals:r(0,2)empty_tuple:r(0,2)empty_string:r(0,2)py_code:r(0,246)py_frame:r(0,254):t(0,254)=*(0,255)PyFrameObject:t(0,255)=(0,243)___pyx_argnames.8554___pyx_d4___pyx_f__pyx_f_4pygr_11cnestedlist_10IntervalDB_write_binaries:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_filestem:(0,2)__pyx_v_div:(0,2)__pyx_r:r(0,2)__pyx_2:r(0,8)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,256):t(0,256)=ar(0,120);0;2;(0,8)___pyx_argnames.8497__pyx_f_4pygr_11cnestedlist_10IntervalDB_check_nonempty:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_msg:r(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,257):t(0,257)=ar(0,120);0;0;(0,8)___pyx_argnames.8398__pyx_f_4pygr_11cnestedlist_10IntervalDB_find_overlap_list:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_i:r(0,5)__pyx_v_nhit:(0,5)__pyx_v_it:(0,124)__pyx_v_im_buf:(0,221)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,124)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_9:r(0,2)__pyx_argnames:V(0,258):t(0,258)=ar(0,120);0;2;(0,8)___pyx_argnames.8333__pyx_f_4pygr_11cnestedlist_10IntervalDB_find_overlap:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,259):t(0,259)=ar(0,120);0;2;(0,8)___pyx_argnames.8237__pyx_f_4pygr_11cnestedlist_10IntervalDB_buildFromUnsortedFile:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_filename:(0,2)__pyx_v_n:(0,5)__pyx_v_kwargs:(0,2)__pyx_v_ifile:r(0,159)__pyx_v_i:r(0,5)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_5:r(0,125)__pyx_6:r(0,2)__pyx_argnames:V(0,260):t(0,260)=ar(0,120);0;2;(0,8)___pyx_argnames.8184___pyx_d3__pyx_f_4pygr_11cnestedlist_10IntervalDB_runBuildMethod:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_buildInPlace:(0,2)__pyx_r:r(0,2)__pyx_2:r(0,143)__pyx_3:r(0,143)__pyx_argnames:V(0,261):t(0,261)=ar(0,120);0;1;(0,8)___pyx_argnames.7964___pyx_d1___pyx_d2__pyx_tp_new_4pygr_11cnestedlist_IntervalDB:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_kwds:(0,2)__pyx_args:(0,2)__pyx_v_filename:(0,2)__pyx_v_nsize:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_ifile:r(0,159)__pyx_v_msg:r(0,2)__pyx_r:r(0,5)__pyx_1:(0,5)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_kwds:(0,2)__pyx_args:(0,2)__pyx_v_filename:(0,2)__pyx_v_nsize:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_ifile:r(0,159)__pyx_v_msg:r(0,2)__pyx_r:r(0,5)__pyx_1:(0,5)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_6:r(0,2)___pyx_argnames.7778___pyx_vtabptr_4pygr_11cnestedlist_IntervalDBIterator__pyx_tp_new_4pygr_11cnestedlist_IntervalDBIterator:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,127)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,127)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,127)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,127)__pyx_r:r(0,5)__pyx_1:r(0,124)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)__pyx_f_4pygr_11cnestedlist_18IntervalDBIterator___next__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_i:r(0,5)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)___pyx_argnames.9612__pyx_f_4pygr_11cnestedlist_14IntervalFileDB_check_nonempty:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,262):t(0,262)=ar(0,120);0;0;(0,8)___pyx_argnames.9509__pyx_f_4pygr_11cnestedlist_14IntervalFileDB_find_overlap_list:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_i:r(0,5)__pyx_v_nhit:(0,5)__pyx_v_it:(0,124)__pyx_v_im_buf:(0,221)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,124)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_9:r(0,2)__pyx_argnames:V(0,263):t(0,263)=ar(0,120);0;2;(0,8)___pyx_argnames.9444__pyx_f_4pygr_11cnestedlist_14IntervalFileDB_find_overlap:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,264):t(0,264)=ar(0,120);0;2;(0,8)___pyx_argnames.9391__pyx_f_4pygr_11cnestedlist_14IntervalFileDB_open:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_filestem:(0,2)__pyx_v_err_msg:(0,265)__pyx_r:r(0,2):t(0,265)=ar(0,120);0;1023;(0,54)__pyx_2:r(0,142)__pyx_argnames:V(0,266):t(0,266)=ar(0,120);0;1;(0,8)___pyx_argnames.9325___pyx_d9___pyx_d10__pyx_tp_new_4pygr_11cnestedlist_IntervalFileDB:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_filestem:(0,2)__pyx_v_mode:(0,2)__pyx_r:r(0,5)__pyx_1:(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_f_4pygr_11cnestedlist_13NLMSASequence___iadd__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_seq:P(0,2)__pyx_v_x:r(0,2)__pyx_v_ns:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:r(0,185)__pyx_6:r(0,2)__pyx_f_4pygr_11cnestedlist_13NLMSASequence___len__:f(0,185)__pyx_v_self:P(0,2)__pyx_r:r(0,185)__pyx_2:r(0,185)___pyx_argnames.15420__pyx_f_4pygr_11cnestedlist_13NLMSASequence_buildInMemory:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_kwargs:(0,2)__pyx_v_n:r(0,2)__pyx_r:r(0,2)__pyx_2:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:r(0,2)__pyx_argnames:V(0,267):t(0,267)=ar(0,120);0;0;(0,8)___pyx_argnames.15293__pyx_f_4pygr_11cnestedlist_13NLMSASequence_buildFiles:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_kwargs:(0,2)__pyx_v_db:r(0,127)__pyx_v_filename:r(0,2)__pyx_v_os:r(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,268):t(0,268)=ar(0,120);0;0;(0,8)___pyx_argnames.15228__pyx_f_4pygr_11cnestedlist_13NLMSASequence_close:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,269):t(0,269)=ar(0,120);0;0;(0,8)___pyx_argnames.15173__pyx_f_4pygr_11cnestedlist_13NLMSASequence_forceLoad:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_argnames:V(0,270):t(0,270)=ar(0,120);0;0;(0,8)___pyx_argnames.9155__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_mergeSeq:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,5)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_id:r(0,5)__pyx_r:r(0,2)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_argnames:V(0,271):t(0,271)=ar(0,120);0;0;(0,8)__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator___next__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_i:r(0,5)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_f_4pygr_11cnestedlist_5NLMSA___iadd__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_seq:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_f_4pygr_11cnestedlist_5NLMSA___invert__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)___pyx_argnames.17674__pyx_f_4pygr_11cnestedlist_5NLMSA_addAnnotation:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_a:(0,2)__pyx_v_ival:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,272):t(0,272)=ar(0,120);0;1;(0,8)___pyx_argnames.17141__pyx_f_4pygr_11cnestedlist_5NLMSA_nextID:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_nlmsaID:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_argnames:V(0,273):t(0,273)=ar(0,120);0;0;(0,8)___pyx_argnames.17008___pyx_d62___pyx_d63__pyx_f_4pygr_11cnestedlist_5NLMSA_newSequence:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seq:(0,2)__pyx_v_is_union:(0,2)__pyx_v_ns:r(0,194)__pyx_v_id:r(0,2)__pyx_v_filestem:r(0,2)__pyx_v_mode:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:(0,5)__pyx_4:r(0,2)__pyx_argnames:V(0,274):t(0,274)=ar(0,120);0;2;(0,8)___pyx_argnames.16488__pyx_f_4pygr_11cnestedlist_5NLMSA___setstate__:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_state:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,275):t(0,275)=ar(0,120);0;1;(0,8)___pyx_argnames.16426__pyx_f_4pygr_11cnestedlist_5NLMSA___getstate__:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,276):t(0,276)=ar(0,120);0;0;(0,8)___pyx_argnames.16365__pyx_f_4pygr_11cnestedlist_5NLMSA___reduce__:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seqdb:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,277):t(0,277)=ar(0,120);0;0;(0,8)__pyx_f_4pygr_11cnestedlist_5NLMSA___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSASlice:f(0,5)o:P(0,2)i:P(0,2)v:P(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)___pyx_argnames.13626__pyx_f_4pygr_11cnestedlist_10NLMSASlice_rawIvals:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,5)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,5)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_argnames:V(0,278):t(0,278)=ar(0,120);0;0;(0,8)___pyx_argnames.13221___pyx_d37__pyx_f_4pygr_11cnestedlist_10NLMSASlice_split:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_minAligned:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_seqIntervals:r(0,2)__pyx_v_ivals:r(0,2)__pyx_v_l:r(0,2)__pyx_v_ival:r(0,2)__pyx_v_subslice:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:(0,5)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,279):t(0,279)=ar(0,120);0;1;(0,8)___pyx_argnames.11482__pyx_f_4pygr_11cnestedlist_10NLMSASlice_generateSeqEnds:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_l:r(0,2)__pyx_v_ival2:r(0,2)__pyx_v_edge:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,5)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,280):t(0,280)=ar(0,120);0;0;(0,8)___pyx_argnames.11384__pyx_f_4pygr_11cnestedlist_10NLMSASlice_findSeqEnds:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seq:(0,2)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,281):t(0,281)=ar(0,120);0;1;(0,8)___pyx_argnames.10821__pyx_f_4pygr_11cnestedlist_10NLMSASlice_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_kwargs:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,282):t(0,282)=ar(0,120);0;0;(0,8)__pyx_getprop_4pygr_11cnestedlist_10NLMSASlice_letters:f(0,2)o:P(0,2)x:P(0,87)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)___pyx_argnames.9886__pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters_iteritems:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_argnames:V(0,283):t(0,283)=ar(0,120);0;0;(0,8)___pyx_argnames.9818__pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_l:r(0,2)__pyx_v_node:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,284):t(0,284)=ar(0,120);0;0;(0,8)__pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_f_4pygr_11cnestedlist_9NLMSANode___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_seq:P(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_f_4pygr_11cnestedlist_9NLMSANode___iter__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_i:r(0,5)__pyx_v_j:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_l:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,5)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_9:r(0,2)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_loadAll__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_loadAll:f(0,5)__pyx_v_self:P(0,121)__pyx_v_ikeep:(0,5)__pyx_r:r(0,5)__pyx_1:r(0,5)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_nextBlock__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_nextBlock:f(0,5)__pyx_v_self:P(0,121)__pyx_v_pkeep:P(0,285)__pyx_v_i:r(0,5):t(0,285)=*(0,5)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_restart__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_restart:f(0,5)__pyx_v_self:P(0,121)__pyx_v_start:P(0,5)__pyx_v_end:P(0,5)__pyx_v_db:P(0,126)__pyx_v_ns:P(0,194)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)___pyx_f_4pygr_11cnestedlist_18IntervalDBIterator_cnext__pyx_f_4pygr_11cnestedlist_18IntervalDBIterator_cnext:f(0,5)__pyx_v_self:P(0,286)__pyx_r:r(0,5):t(0,286)=*(0,219)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_f_4pygr_11cnestedlist_13NLMSASequence_saveInterval__pyx_f_4pygr_11cnestedlist_13NLMSASequence_saveInterval:f(0,5)__pyx_v_self:P(0,194)__pyx_v_im:P(0,125)__pyx_v_n:P(0,5)__pyx_v_expand_self:P(0,5)__pyx_v_ifile:P(0,159)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_cnext__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_cnext:f(0,5)__pyx_v_self:P(0,121)__pyx_v_pkeep:P(0,285)__pyx_r:r(0,5)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_extend__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_extend:f(0,5)__pyx_v_self:P(0,121)__pyx_v_ikeep:P(0,5)__pyx_v_length:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_new_buf:r(0,125)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_copy__pyx_f_4pygr_11cnestedlist_22IntervalFileDBIterator_copy:f(0,5)__pyx_v_self:P(0,121)__pyx_v_src:P(0,121)__pyx_v_new_buf:r(0,125)__pyx_2:r(0,2)__pyx_3:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_argnames.13720__pyx_f_4pygr_11cnestedlist_advanceStartStop:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,287):t(0,287)=ar(0,120);0;4;(0,8)type:r(0,228)type:r(0,228)___pyx_argnames.13794__pyx_tp_new_4pygr_11cnestedlist_NLMSASliceIterator:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)type:r(0,228)type:r(0,228)type:r(0,228)___pyx_argnames.9693__pyx_tp_new_4pygr_11cnestedlist_NLMSASliceLetters:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_r:r(0,5)type:r(0,228)type:r(0,228)type:r(0,228)__pyx_f_4pygr_11cnestedlist_17NLMSASliceLetters___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_node:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)type:r(0,228)type:r(0,228)___pyx_argnames.16940___pyx_d61__pyx_f_4pygr_11cnestedlist_5NLMSA_addToSeqlist:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_ns:(0,194)__pyx_v_seq:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_argnames:V(0,288):t(0,288)=ar(0,120);0;2;(0,8)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)___pyx_f_4pygr_11cnestedlist_5NLMSA_save_nbuild__pyx_f_4pygr_11cnestedlist_5NLMSA_save_nbuild:f(0,1)__pyx_v_self:P(0,195)__pyx_v_nbuild:P(0,285)__pyx_v_ns:r(0,194)__pyx_1:r(0,2)__pyx_2:r(0,2)type:r(0,228)type:r(0,228)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_argnames.16302__pyx_f_4pygr_11cnestedlist_5NLMSA_close:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_ns:r(0,194)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,289):t(0,289)=ar(0,120);0;0;(0,8)type:r(0,228)type:r(0,228)___pyx_argnames.17184__pyx_f_4pygr_11cnestedlist_5NLMSA_initLPO:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_ns:r(0,194)__pyx_v_offset:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:(0,5)__pyx_3:r(0,2)__pyx_argnames:V(0,290):t(0,290)=ar(0,120);0;0;(0,8)type:r(0,228)type:r(0,228)___pyx_f_4pygr_11cnestedlist_10NLMSASlice_get_seq_interval__pyx_f_4pygr_11cnestedlist_10NLMSASlice_get_seq_interval:f(0,2)__pyx_v_self:P(0,189)__pyx_v_nl:P(0,195)__pyx_v_targetID:P(0,5)__pyx_v_start:P(0,5)__pyx_v_stop:P(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.19771___pyx_d66___pyx_d67___pyx_d68__pyx_f_4pygr_11cnestedlist_textfile_to_binaries:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_filename:(0,2)__pyx_v_seqDict:(0,2)__pyx_v_prefixDict:(0,2)__pyx_v_buildpath:(0,2)__pyx_v_i:r(0,5)__pyx_v_n:(0,5)__pyx_v_nlmsaID:(0,5)__pyx_v_nsID:(0,5)__pyx_v_offset:(0,5)__pyx_v_is_bidirectional:(0,5)__pyx_v_pairwiseMode:(0,5)__pyx_v_nprefix:(0,5)__pyx_v_infile:r(0,159)__pyx_v_err_msg:(0,291)__pyx_v_line:(0,292)__pyx_v_tmp:(0,291)__pyx_v_basestem:(0,291)__pyx_v_seqDictID:(0,291)__pyx_v_ignorePrefix:r(0,2)__pyx_v_os:(0,2)__pyx_v_buildpath1:(0,2)__pyx_v_worldbase:(0,2)__pyx_v_classutil:(0,2)__pyx_v_pickle:(0,2)__pyx_v_seqIDdict:(0,2)__pyx_v_IDdict:(0,2)__pyx_v_d:(0,2)__pyx_v_ifile:(0,2)__pyx_v_missing:(0,2)__pyx_v_seqdb:(0,2)__pyx_v_NLMSAindexText:(0,2)__pyx_v_buildpath2:(0,2)__pyx_v_sys:(0,2)__pyx_v_s:(0,2)__pyx_r:r(0,2)__pyx_1:(0,5):t(0,291)=ar(0,120);0;2047;(0,54):t(0,292)=ar(0,120);0;32767;(0,54)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,185)__pyx_7:r(0,2)__pyx_argnames:V(0,293):t(0,293)=ar(0,120);0;4;(0,8)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)___pyx_vtable_4pygr_11cnestedlist_IntervalDBIterator___pyx_vtable_4pygr_11cnestedlist_NLMSASequence___pyx_vtable_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_vtabptr_4pygr_11cnestedlist_IntervalFileDBIterator___pyx_vtable_4pygr_11cnestedlist_NLMSA___pyx_f_4pygr_11cnestedlist_5NLMSA_add_seqidmap_to_union___pyx_f_4pygr_11cnestedlist_10NLMSASlice_findSeqBounds___pyx_vtable_4pygr_11cnestedlist_NLMSASlice___pyx_vtabptr_4pygr_11cnestedlist_NLMSASlice___pyx_vtable_4pygr_11cnestedlist_NLMSANode___pyx_vtabptr_4pygr_11cnestedlist_NLMSANode___pyx_d7___pyx_d5___pyx_d8___pyx_d6___pyx_d11___pyx_d12___pyx_d13___pyx_d14___pyx_d15___pyx_d16___pyx_d17___pyx_d19___pyx_d18___pyx_d20___pyx_d21___pyx_d22___pyx_d23___pyx_d24___pyx_d25___pyx_d26___pyx_d27___pyx_d28___pyx_d29___pyx_d30___pyx_d31___pyx_d32___pyx_d33___pyx_d34___pyx_d35___pyx_d36___pyx_d39___pyx_d40___pyx_d38___pyx_d41___pyx_d42___pyx_d43___pyx_d44___pyx_d46___pyx_d47___pyx_d48___pyx_d45___pyx_d49___pyx_d50___pyx_d51___pyx_d52___pyx_d54___pyx_d53___pyx_d55___pyx_d56___pyx_d57___pyx_d58___pyx_d59___pyx_d60___pyx_d64___pyx_d65initcnestedlist:F(0,1)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_9:r(0,2)__pyx_10:r(0,2)__pyx_11:r(0,2)__pyx_12:r(0,2)__pyx_13:r(0,2)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)dict:r(0,2)pycobj:r(0,2)result:r(0,5)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_9NLMSANode___cmp__:f(0,5)__pyx_v_self:P(0,2)__pyx_v_other:P(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_getprop_4pygr_11cnestedlist_9NLMSANode_edges:f(0,2)o:P(0,2)x:P(0,87)__pyx_v_l:r(0,2)__pyx_v_ival2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.14226__pyx_f_4pygr_11cnestedlist_9NLMSANode_getSeqPos:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_argnames:V(0,294):t(0,294)=ar(0,120);0;1;(0,8)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___cmp__:f(0,5)__pyx_v_self:P(0,2)__pyx_v_other:P(0,2)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___repr__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___hash__:f(0,33)__pyx_v_self:P(0,2)__pyx_r:r(0,33)long int:t(0,33)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,33)name:r(0,2)name:r(0,2)___pyx_argnames.11167__pyx_f_4pygr_11cnestedlist_10NLMSASlice_matchIntervals:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seq:(0,2)__pyx_v_i:r(0,5)__pyx_v_target_id:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_l:r(0,2)__pyx_v_ival2:r(0,2)__pyx_v_ival1:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_6:(0,5)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_argnames:V(0,295):t(0,295)=ar(0,120);0;1;(0,8)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_10NLMSASlice___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.15905__pyx_f_4pygr_11cnestedlist_5NLMSA___init__:f(0,5)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_pathstem:(0,2)__pyx_v_mode:(0,2)__pyx_v_seqDict:(0,2)__pyx_v_mafFiles:(0,2)__pyx_v_axtFiles:(0,2)__pyx_v_maxOpenFiles:(0,2)__pyx_v_maxlen:(0,2)__pyx_v_nPad:(0,2)__pyx_v_maxint:(0,2)__pyx_v_trypath:(0,2)__pyx_v_bidirectional:(0,2)__pyx_v_pairwiseMode:(0,2)__pyx_v_bidirectionalRule:(0,2)__pyx_v_use_virtual_lpo:(0,2)__pyx_v_maxLPOcoord:(0,2)__pyx_v_inverseDB:(0,2)__pyx_v_alignedIvals:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_resource:r(0,2)__pyx_v_seqdb:(0,2)__pyx_r:r(0,5)__pyx_1:(0,2)__pyx_2:r(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,5)__pyx_argnames:V(0,296):t(0,296)=ar(0,120);0;17;(0,8)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)___pyx_argnames.17254__pyx_f_4pygr_11cnestedlist_5NLMSA_init_pairwise_mode:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,297):t(0,297)=ar(0,120);0;0;(0,8)name:r(0,2)name:r(0,2)___pyx_argnames.17738__pyx_f_4pygr_11cnestedlist_5NLMSA_add_aligned_intervals:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_alignedIvals:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,298):t(0,298)=ar(0,120);0;1;(0,8)name:r(0,2)name:r(0,2)___pyx_argnames.18662__pyx_f_4pygr_11cnestedlist_5NLMSA_buildFiles:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_saveSeqDict:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_ns:r(0,194)__pyx_v_ntotal:r(0,2)__pyx_v_ifile:r(0,2)__pyx_v_sys:r(0,2)__pyx_v_pickle:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:(0,5)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,299):t(0,299)=ar(0,120);0;1;(0,8)type:r(0,228)type:r(0,228)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)___pyx_argnames.18956__pyx_f_4pygr_11cnestedlist_5NLMSA_save_seq_dict:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_argnames:V(0,300):t(0,300)=ar(0,120);0;0;(0,8)name:r(0,2)name:r(0,2)___pyx_argnames.19016__pyx_f_4pygr_11cnestedlist_5NLMSA_build:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_kwargs:(0,2)__pyx_v_ntotal:r(0,2)__pyx_v_ns:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,301):t(0,301)=ar(0,120);0;0;(0,8)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.19147__pyx_f_4pygr_11cnestedlist_5NLMSA_seqInterval:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_iseq:(0,5)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_seq:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,302):t(0,302)=ar(0,120);0;3;(0,8)name:r(0,2)name:r(0,2)__pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSA:f(0,5)o:P(0,2)i:P(0,2)v:P(0,2)__pyx_r:r(0,5)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:(0,5)__pyx_4:r(0,2)name:r(0,2)name:r(0,2)__pyx_f_4pygr_11cnestedlist_13NLMSASequence___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:r(0,5)__pyx_3:(0,2)__pyx_4:(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)__pyx_f_4pygr_11cnestedlist_18NLMSASliceIterator___next__:f(0,2)__pyx_v_self:P(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)name:r(0,2)name:r(0,2)item:r(0,2)name:r(0,2)item:r(0,2)___pyx_argnames.13965__pyx_tp_new_4pygr_11cnestedlist_NLMSANode:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)type:r(0,228)type:r(0,228)type:r(0,228)name:r(0,2)name:r(0,2)item:r(0,2)item:r(0,2)__pyx_v_ipos:(0,5)__pyx_v_nlmsaSlice:(0,189)__pyx_v_istart:(0,5)__pyx_v_istop:(0,5)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_r:r(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)___pyx_argnames.10576__pyx_f_4pygr_11cnestedlist_10NLMSASlice_edges:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_mergeAll:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_seqIntervals:r(0,2)__pyx_v_ivals:r(0,2)__pyx_v_l:r(0,2)__pyx_v_ival1:r(0,2)__pyx_v_ival2:r(0,2)__pyx_v_mergeIntervals:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,303):t(0,303)=ar(0,120);0;1;(0,8)name:r(0,2)name:r(0,2)item:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.10720__pyx_f_4pygr_11cnestedlist_10NLMSASlice_items:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_kwargs:(0,2)__pyx_v_l:r(0,2)__pyx_v_ival1:r(0,2)__pyx_v_ival2:r(0,2)__pyx_v_edge:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,304):t(0,304)=ar(0,120);0;0;(0,8)item:r(0,2)___pyx_argnames.10891__pyx_f_4pygr_11cnestedlist_10NLMSASlice_keys:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_mergeAll:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_seqIntervals:r(0,2)__pyx_v_ivals:r(0,2)__pyx_v_l:r(0,2)__pyx_v_ival1:r(0,2)__pyx_v_ival2:r(0,2)__pyx_v_mergeIntervals:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_argnames:V(0,305):t(0,305)=ar(0,120);0;1;(0,8)item:r(0,2)___pyx_argnames.13080__pyx_f_4pygr_11cnestedlist_10NLMSASlice_clip_interval_list:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_start:(0,2)__pyx_v_end:(0,2)__pyx_v_l:(0,2)__pyx_v_result:r(0,2)__pyx_v_srcStart:r(0,2)__pyx_v_srcEnd:r(0,2)__pyx_v_destStart:r(0,2)__pyx_v_destEnd:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,185)__pyx_argnames:V(0,306):t(0,306)=ar(0,120);0;3;(0,8)item:r(0,2)___pyx_argnames.16554__pyx_f_4pygr_11cnestedlist_5NLMSA_read_indexes:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_seqDict:(0,2)__pyx_v_ns:r(0,194)__pyx_v_ifile:r(0,2)__pyx_v_line:(0,2)__pyx_v_id:r(0,2)__pyx_v_name:(0,2)__pyx_v_is_union:r(0,2)__pyx_v_length:(0,2)__pyx_v_filestem:r(0,2)__pyx_v_seq:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:(0,2)__pyx_3:(0,5)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:r(0,2)__pyx_9:r(0,2)__pyx_argnames:V(0,307):t(0,307)=ar(0,120);0;1;(0,8)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)___pyx_argnames.16797__pyx_f_4pygr_11cnestedlist_5NLMSA_read_attrs:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_pickle:r(0,2)__pyx_v_ifile:r(0,2)__pyx_v_d:r(0,2)__pyx_v_k:r(0,2)__pyx_v_v:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:(0,2)__pyx_3:(0,5)__pyx_4:(0,2)__pyx_argnames:V(0,308):t(0,308)=ar(0,120);0;0;(0,8)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)__pyx_mp_ass_subscript_4pygr_11cnestedlist_NLMSASequence:f(0,5)o:P(0,2)i:P(0,2)v:P(0,2)__pyx_v_im_tmp:(0,130)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)__pyx_v_im_tmp:(0,130)__pyx_r:r(0,5)__pyx_1:r(0,5)__pyx_2:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:r(0,2)__pyx_f_4pygr_11cnestedlist_5NLMSA_add_seqidmap_to_union:f(0,194)__pyx_v_self:P(0,195)__pyx_v_j:P(0,5)__pyx_v_seqidmap:P(0,216)__pyx_v_ns:P(0,194)__pyx_v_build_ifile:P(0,309)__pyx_v_nbuild:P(0,285)__pyx_v_ns_lpo:r(0,194):t(0,309)=*(0,159)__pyx_r:r(0,194)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)type:r(0,228)type:r(0,228)i:r(0,185)i:r(0,185)i:r(0,185)j:r(0,2)type:r(0,228)type:r(0,228)__pyx_f_4pygr_11cnestedlist_10NLMSASlice_findSeqBounds:f(0,5)__pyx_v_self:P(0,189)__pyx_v_id:P(0,5)__pyx_v_ori:P(0,5)__pyx_v_left:r(0,5)__pyx_v_right:r(0,5)__pyx_v_mid:r(0,5)__pyx_r:r(0,5)__pyx_1:(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)name:r(0,2)name:r(0,2)j:r(0,2)name:r(0,2)name:r(0,2)j:r(0,2)name:r(0,2)name:r(0,2)old_exc:(0,2)old_val:(0,2)old_tb:(0,2)ctx:r(0,2)___pyx_argnames.19300__pyx_f_4pygr_11cnestedlist_dump_textfile:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_pathstem:(0,2)__pyx_v_outfilename:(0,2)__pyx_v_nprefix:r(0,5)__pyx_v_outfile:r(0,159)__pyx_v_err_msg:(0,291)__pyx_v_tmp:(0,291)__pyx_v_seqDictID:(0,310)__pyx_v_classutil:r(0,2)__pyx_v_pickle:r(0,2)__pyx_v_sys:r(0,2)__pyx_v_seqIDdict:r(0,2)__pyx_v_seqDict:r(0,2)__pyx_v_prefixDict:r(0,2)__pyx_v_ifile:(0,2)__pyx_v_d:(0,2)__pyx_v_os:(0,2)__pyx_v_basestem:(0,2)__pyx_v_pleaseWarn:r(0,2)__pyx_v_id:(0,2)__pyx_v_t:(0,2)__pyx_v_line:(0,2)__pyx_v_name:(0,2)__pyx_v_is_union:(0,2)__pyx_v_length:(0,2)__pyx_v_mypath:(0,2)__pyx_v_mybase:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,5):t(0,310)=ar(0,120);0;255;(0,54)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:r(0,185)__pyx_6:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:(0,2)__pyx_11:(0,2)__pyx_12:(0,2)__pyx_13:r(0,8)__pyx_argnames:V(0,311):t(0,311)=ar(0,120);0;2;(0,8)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)r:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)__pyx_why:r(0,5)__pyx_exc_type:(0,2)__pyx_exc_value:(0,2)__pyx_exc_tb:(0,2)__pyx_exc_lineno:r(0,5)___pyx_argnames.14579__pyx_f_4pygr_11cnestedlist_9NLMSANode_getEdgeSeqs:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_other:(0,186)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_d:r(0,2)__pyx_v_seq:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_3:(0,5)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_argnames:V(0,312):t(0,312)=ar(0,120);0;1;(0,8)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)j:r(0,2)___pyx_argnames.14727__pyx_f_4pygr_11cnestedlist_9NLMSANode_nodeEdges:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_i:r(0,5)__pyx_v_has_continuation:r(0,5)__pyx_v_d:r(0,2)__pyx_v_nodes:r(0,2)__pyx_v_result:r(0,2)__pyx_v_node:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:r(0,5)__pyx_3:(0,5)__pyx_4:r(0,185)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,313):t(0,313)=ar(0,120);0;0;(0,8)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)j:r(0,2)i:r(0,185)r:r(0,2)i:r(0,185)r:r(0,2)i:r(0,185)r:r(0,2)j:r(0,2)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)j:r(0,2)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)i:r(0,185)r:r(0,5)j:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)___pyx_argnames.9958__pyx_tp_new_4pygr_11cnestedlist_NLMSASlice:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:r(0,2)__pyx_r:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:r(0,2)__pyx_r:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:r(0,2)__pyx_r:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:r(0,2)__pyx_r:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:r(0,2)__pyx_r:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:r(0,2)__pyx_r:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:r(0,2)__pyx_r:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)type:r(0,228)type:r(0,228)type:r(0,228)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)i:r(0,185)o:r(0,2)r:r(0,2)j:r(0,2)type:r(0,228)type:r(0,228)o:r(0,2)j:r(0,2)type:r(0,228)type:r(0,228)name:r(0,2)name:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)__pyx_v_ns:(0,194)__pyx_v_start:(0,5)__pyx_v_stop:(0,5)__pyx_v_id:(0,5)__pyx_v_offset:(0,5)__pyx_v_seq:(0,2)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_start_max:r(0,5)__pyx_v_end_min:r(0,5)__pyx_v_start2:r(0,5)__pyx_v_stop2:r(0,5)__pyx_v_istart:r(0,5)__pyx_v_istop:r(0,5)__pyx_v_ns_lpo:r(0,194)__pyx_v_it:r(0,121)__pyx_v_cacheMax:r(0,5)__pyx_v_ivals:r(0,2)__pyx_v_saveCache:(0,2)__pyx_v_cacheDict:(0,2)__pyx_v_seqID:r(0,2)__pyx_r:r(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:(0,2)__pyx_10:r(0,5)___pyx_argnames.11623__pyx_f_4pygr_11cnestedlist_10NLMSASlice_groupByIntervals:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_maxgap:(0,5)__pyx_v_maxinsert:(0,5)__pyx_v_mininsert:(0,5)__pyx_v_filterSeqs:(0,2)__pyx_v_filterList:(0,2)__pyx_v_mergeMost:(0,2)__pyx_v_maxsize:(0,2)__pyx_v_mergeAll:(0,2)__pyx_v_ivalMethod:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_i:r(0,5)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_gap:r(0,5)__pyx_v_insert:r(0,5)__pyx_v_targetStart:r(0,5)__pyx_v_targetEnd:r(0,5)__pyx_v_start:r(0,5)__pyx_v_end:r(0,5)__pyx_v_maskStart:r(0,5)__pyx_v_maskEnd:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_targetDict:(0,2)__pyx_v_seq:(0,2)__pyx_v_t:(0,2)__pyx_v_seqIntervals:(0,2)__pyx_v_target:(0,2)__pyx_v_l:r(0,2)__pyx_v_lastIval:r(0,2)__pyx_v_m:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,5)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:r(0,2)__pyx_10:(0,2)__pyx_11:r(0,185)__pyx_12:(0,2)__pyx_argnames:V(0,314):t(0,314)=ar(0,120);0;9;(0,8)r:r(0,2)j:r(0,2)i:r(0,185)r:r(0,2)i:r(0,185)r:r(0,2)i:r(0,185)r:r(0,2)j:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)i:r(0,185)r:r(0,2)i:r(0,185)r:r(0,2)j:r(0,2)v:r(0,2)i:r(0,185)r:r(0,5)v:r(0,2)i:r(0,185)r:r(0,5)v:r(0,2)i:r(0,185)r:r(0,5)j:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)o:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)o:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)v:r(0,2)r:r(0,5)v:r(0,2)r:r(0,5)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,5)j:r(0,2)___pyx_argnames.12159__pyx_f_4pygr_11cnestedlist_10NLMSASlice_conservationFilter:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_seq:(0,2)__pyx_v_m:(0,2)__pyx_v_pIdentityMin:(0,2)__pyx_v_minAlignSize:(0,2)__pyx_v_maxAlignSize:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_seqEdge:(0,2)__pyx_v_t:(0,2)__pyx_v_mergeIntervals:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_5:r(0,2)__pyx_6:r(0,2)__pyx_7:r(0,2)__pyx_argnames:V(0,315):t(0,315)=ar(0,120);0;5;(0,8)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)name:r(0,2)name:r(0,2)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)o:r(0,2)j:r(0,2)___pyx_argnames.12363__pyx_f_4pygr_11cnestedlist_10NLMSASlice_filterIvalConservation:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_seqIntervals:(0,2)__pyx_v_pIdentityMin:(0,2)__pyx_v_filterFun:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_i:r(0,5)__pyx_v_j:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_types:r(0,2)__pyx_v_pIdentityMin0:r(0,2)__pyx_v_targetID:r(0,2)__pyx_v_l:r(0,2)__pyx_v_seq:r(0,2)__pyx_v_newIval:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_6:(0,2)__pyx_7:r(0,185)__pyx_argnames:V(0,316):t(0,316)=ar(0,120);0;3;(0,8)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)r:r(0,2)j:r(0,2)r:r(0,5)j:r(0,2)___pyx_argnames.12577__pyx_f_4pygr_11cnestedlist_10NLMSASlice_groupBySequences:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_seqIntervals:(0,2)__pyx_v_sourceOnly:(0,2)__pyx_v_indelCut:(0,2)__pyx_v_seqGroups:(0,2)__pyx_v_minAligned:(0,2)__pyx_v_pMinAligned:(0,2)__pyx_v_seqMethod:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_i:(0,5)__pyx_v_j:r(0,5)__pyx_v_start:r(0,5)__pyx_v_end:(0,5)__pyx_v_targetStart:r(0,5)__pyx_v_targetEnd:(0,5)__pyx_v_ipos:(0,5)__pyx_v_id:r(0,5)__pyx_v_f:r(0,317)float:t(0,317)=r(0,5);4;0;__pyx_v_nl:r(0,195)__pyx_v_result:r(0,2)__pyx_v_mapping:r(0,2)__pyx_v_seqs:r(0,2)__pyx_v_bounds:r(0,2)__pyx_v_seq:r(0,2)__pyx_v_ivals:(0,2)__pyx_v_isIndel:r(0,2)__pyx_v_ival:r(0,2)__pyx_v_seqStart:(0,2)__pyx_v_maskStart:(0,2)__pyx_v_bound:(0,2)__pyx_v_isStart:r(0,2)__pyx_v_mergeIntervals:(0,2)__pyx_v_pleaseClip:r(0,2)__pyx_r:r(0,2)__pyx_1:(0,5)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:r(0,2)__pyx_8:r(0,2)__pyx_9:(0,5)__pyx_10:r(0,2)__pyx_11:r(0,185)__pyx_12:r(0,2)__pyx_argnames:V(0,318):t(0,318)=ar(0,120);0;7;(0,8)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)o:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)j:r(0,2)r:r(0,2)j:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)name:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.13394__pyx_f_4pygr_11cnestedlist_10NLMSASlice_regions:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_dummyArg:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_i:r(0,5)__pyx_v_nl:r(0,195)__pyx_v_ns_lpo:r(0,194)__pyx_v_l:r(0,2)__pyx_v_subslice:r(0,2)__pyx_r:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_6:r(0,185)__pyx_argnames:V(0,319):t(0,319)=ar(0,120);0;1;(0,8)i:r(0,185)o:r(0,2)i:r(0,185)o:r(0,2)j:r(0,2)type:r(0,228)type:r(0,228)___pyx_argnames.17893__pyx_f_4pygr_11cnestedlist_5NLMSA_readMAFfiles:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_mafFiles:(0,2)__pyx_v_maxint:(0,2)__pyx_v_n:r(0,5)__pyx_v_block_len:(0,5)__pyx_v_tmp:(0,292)__pyx_v_a_header:(0,320)__pyx_v_ifile:r(0,159)__pyx_v_im:(0,321)__pyx_v_im_tmp:(0,130)__pyx_v_ns_lpo:r(0,194):t(0,320)=ar(0,120);0;3;(0,54):t(0,321)=ar(0,120);0;4095;(0,130)__pyx_v_ns:(0,194)__pyx_v_build_ifile:(0,322)__pyx_v_nbuild:(0,323)__pyx_v_has_continuation:(0,5):t(0,322)=ar(0,120);0;4095;(0,159):t(0,323)=ar(0,120);0;4095;(0,5)__pyx_v_linecode_count:(0,324)__pyx_v_pythonStr:(0,2)__pyx_v_seqInfo:(0,2)__pyx_v_filename:(0,2)__pyx_r:r(0,2)__pyx_1:(0,2)__pyx_2:r(0,185):t(0,324)=ar(0,120);0;255;(0,183)__pyx_3:r(0,2)__pyx_4:(0,2)__pyx_6:(0,5)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:(0,2)__pyx_argnames:V(0,325):t(0,325)=ar(0,120);0;2;(0,8)i:r(0,185)o:r(0,2)r:r(0,2)j:r(0,2)type:r(0,228)type:r(0,228)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)___pyx_argnames.18347__pyx_f_4pygr_11cnestedlist_5NLMSA_readAxtNet:f(0,2)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_axtFiles:(0,2)__pyx_v_bidirectionalRule:(0,2)__pyx_v_i:r(0,5)__pyx_v_j:r(0,5)__pyx_v_n:r(0,5)__pyx_v_isrc:(0,5)__pyx_v_is_bidirectional:r(0,5)__pyx_v_comment:(0,320)__pyx_v_src_prefix:(0,326)__pyx_v_dest_prefix:(0,326)__pyx_v_ifile:(0,159)__pyx_v_im:(0,321)__pyx_v_im_tmp:(0,130)__pyx_v_ns_src:r(0,194):t(0,326)=ar(0,120);0;63;(0,54)__pyx_v_build_ifile:(0,322)__pyx_v_nbuild:(0,323)__pyx_v_pythonStr:r(0,2)__pyx_v_seqInfo:r(0,2)__pyx_v_string:r(0,2)__pyx_v_os:r(0,2)__pyx_v_filename:r(0,2)__pyx_v_t:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,185)__pyx_2:(0,2)__pyx_3:r(0,2)__pyx_4:r(0,2)__pyx_6:(0,5)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_argnames:V(0,327):t(0,327)=ar(0,120);0;2;(0,8)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)__pyx_f_4pygr_11cnestedlist_5NLMSA___getitem__:f(0,2)__pyx_v_self:P(0,2)__pyx_v_k:P(0,2)__pyx_v_id:r(0,2)__pyx_v_ns:r(0,2)__pyx_v_offset:r(0,2)__pyx_v_i:(0,2)__pyx_v_l:(0,2)__pyx_v_myslice:(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:(0,2)__pyx_3:r(0,5)__pyx_4:r(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:(0,2)__pyx_9:(0,2)__pyx_10:r(0,185)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)item:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)name:r(0,2)o:r(0,2)j:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)item:r(0,2)___pyx_argnames.8672__pyx_tp_new_4pygr_11cnestedlist_IntervalFileDBIterator:f(0,2)t:P(0,228)a:P(0,2)k:P(0,2)o:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)__pyx_v_start:(0,5)__pyx_v_end:(0,5)__pyx_v_db:(0,126)__pyx_v_ns:(0,194)__pyx_v_nbuffer:(0,5)__pyx_v_rawIvals:(0,2)__pyx_v_i:r(0,5)__pyx_v_ival:r(0,2)__pyx_r:r(0,5)__pyx_1:r(0,124)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_5:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)type:r(0,228)obj:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)___pyx_argnames.14889__pyx_f_4pygr_11cnestedlist_13NLMSASequence___init__:f(0,5)__pyx_v_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_nl:(0,195)__pyx_v_filestem:(0,2)__pyx_v_seq:(0,2)__pyx_v_mode:(0,2)__pyx_v_is_union:(0,2)__pyx_v_length:(0,2)__pyx_v_types:r(0,2)__pyx_v_lastLPO:(0,2)__pyx_v_filename:(0,2)__pyx_v_errmsg:(0,2)__pyx_r:r(0,5)__pyx_1:(0,5)__pyx_2:(0,2)__pyx_3:(0,2)__pyx_4:(0,2)__pyx_5:(0,2)__pyx_6:(0,2)__pyx_7:(0,2)__pyx_8:r(0,2)__pyx_9:r(0,2)__pyx_10:r(0,2)__pyx_11:(0,5)__pyx_12:r(0,185)__pyx_argnames:V(0,328):t(0,328)=ar(0,120);0;6;(0,8)type:r(0,228)type:r(0,228)type:r(0,228)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)result:r(0,2)name:r(0,2)name:r(0,2)o:r(0,2)j:r(0,2)___pyx_argnames.8073__pyx_f_4pygr_11cnestedlist_10IntervalDB_save_tuples:f(0,2)__pyx_v_self:P(0,2)__pyx_args:p(0,2)__pyx_kwds:p(0,2)__pyx_v_l:(0,2)__pyx_v_kwargs:(0,2)__pyx_v_t:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,185)__pyx_4:r(0,125)__pyx_6:r(0,2)__pyx_argnames:V(0,329):t(0,329)=ar(0,120);0;1;(0,8)j:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)j:r(0,2)__pyx_m:S(0,2)__pyx_b:S(0,2)__pyx_lineno:S(0,5)__pyx_filename:S(0,8)__pyx_f:S(0,233)__pyx_vtabptr_4pygr_11cnestedlist_IntervalDBIterator:S(0,220)__pyx_vtabptr_4pygr_11cnestedlist_NLMSASequence:S(0,202)__pyx_vtabptr_4pygr_11cnestedlist_IntervalFileDBIterator:S(0,123)__pyx_vtabptr_4pygr_11cnestedlist_NLMSA:S(0,203)__pyx_vtabptr_4pygr_11cnestedlist_NLMSASlice:S(0,193)__pyx_vtabptr_4pygr_11cnestedlist_NLMSANode:S(0,188)__pyx_ptype_4pygr_11cnestedlist_IntervalDB:S(0,228)__pyx_ptype_4pygr_11cnestedlist_IntervalDBIterator:S(0,228)__pyx_ptype_4pygr_11cnestedlist_IntervalFileDB:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSASequence:S(0,228)__pyx_ptype_4pygr_11cnestedlist_IntervalFileDBIterator:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSA:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSASlice:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSASliceLetters:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSANode:S(0,228)__pyx_ptype_4pygr_11cnestedlist_NLMSASliceIterator:S(0,228)__pyx_k1:S(0,330)__pyx_k2:S(0,331)__pyx_k3:S(0,332)__pyx_k4:S(0,333)__pyx_k5:S(0,334)__pyx_k6:S(0,335)__pyx_k7:S(0,336)__pyx_k8:S(0,337)__pyx_k9:S(0,338)__pyx_k10:S(0,339)__pyx_k11:S(0,340)__pyx_k12:S(0,341)__pyx_k13:S(0,342)__pyx_k14:S(0,343)__pyx_k15:S(0,344)__pyx_k16:S(0,345)__pyx_k17:S(0,346)__pyx_k18:S(0,347)__pyx_k19:S(0,348)__pyx_k20:S(0,349)__pyx_k21:S(0,350)__pyx_k22:S(0,351)__pyx_k23:S(0,352)__pyx_k24:S(0,353)__pyx_k25:S(0,354)__pyx_k26:S(0,355)__pyx_k27:S(0,356)__pyx_k28:S(0,357)__pyx_k29:S(0,358)__pyx_k30:S(0,359)__pyx_k31:S(0,360)__pyx_k32:S(0,361)__pyx_k33:S(0,362)__pyx_k34:S(0,363)__pyx_k35:S(0,364)__pyx_k36:S(0,365)__pyx_k37:S(0,366)__pyx_k38:S(0,367)__pyx_k39:S(0,368)__pyx_k40:S(0,369)__pyx_k41:S(0,370)__pyx_k42:S(0,371)__pyx_k43:S(0,372)__pyx_k44:S(0,373)__pyx_k45:S(0,374)__pyx_k46:S(0,375)__pyx_k47:S(0,376)__pyx_k48:S(0,377)__pyx_k49:S(0,378)__pyx_k50:S(0,379)__pyx_k51:S(0,380)__pyx_k52:S(0,381)__pyx_k53:S(0,382)__pyx_k54:S(0,383)__pyx_k55:S(0,384)__pyx_k56:S(0,385)__pyx_k57:S(0,386)__pyx_k58:S(0,387)__pyx_k59:S(0,388)__pyx_k60:S(0,389)__pyx_k61:S(0,390)__pyx_k62:S(0,391)__pyx_k63:S(0,392)__pyx_k64:S(0,393)__pyx_k65:S(0,394)__pyx_k66:S(0,395)__pyx_k67:S(0,396)__pyx_k68:S(0,397)__pyx_k69:S(0,398)__pyx_k70:S(0,399)__pyx_k71:S(0,400)__pyx_k72:S(0,401)__pyx_k73:S(0,402)__pyx_k74:S(0,403)__pyx_k75:S(0,404)__pyx_k76:S(0,405)__pyx_k77:S(0,406)__pyx_k78:S(0,407)__pyx_k79:S(0,408)__pyx_k80:S(0,409)__pyx_k81:S(0,410)__pyx_k82:S(0,411)__pyx_k83:S(0,412)__pyx_k84:S(0,413)__pyx_k85:S(0,414)__pyx_k86:S(0,415)__pyx_k87:S(0,416)__pyx_k88:S(0,417)__pyx_k89:S(0,418)__pyx_k90:S(0,419)__pyx_k91:S(0,420)__pyx_k92:S(0,421)__pyx_k93:S(0,422)__pyx_k94:S(0,423)__pyx_k95:S(0,424)__pyx_k96:S(0,425)__pyx_k97:S(0,426)__pyx_k98:S(0,427)__pyx_k99:S(0,428)__pyx_k100:S(0,429)__pyx_k101:S(0,430)__pyx_k102:S(0,431)__pyx_k103:S(0,432)__pyx_k104:S(0,433)__pyx_k105:S(0,434)__pyx_k106:S(0,435)__pyx_k107:S(0,436)__pyx_k108:S(0,437)__pyx_k109:S(0,438)__pyx_k110:S(0,439)__pyx_k111:S(0,440)__pyx_k112:S(0,441)__pyx_k113:S(0,442)__pyx_k114:S(0,443)__pyx_k115:S(0,444)__pyx_k116:S(0,445)__pyx_k117:S(0,446)__pyx_k118:S(0,447)__pyx_k119:S(0,448)__pyx_k120:S(0,449)__pyx_k121:S(0,450)__pyx_k122:S(0,451)__pyx_k123:S(0,452)__pyx_k124:S(0,453)__pyx_k125:S(0,454)__pyx_k126:S(0,455)__pyx_k127:S(0,456)__pyx_k128:S(0,457)__pyx_k129:S(0,458)__pyx_k130:S(0,459)__pyx_k131:S(0,460)__pyx_k132:S(0,461)__pyx_k133:S(0,462)__pyx_k134:S(0,463)__pyx_k135:S(0,464)__pyx_k136:S(0,465)__pyx_k137:S(0,466)__pyx_k138:S(0,467)__pyx_k139:S(0,468)__pyx_k140:S(0,469)__pyx_k141:S(0,470)__pyx_k142:S(0,471)__pyx_k143:S(0,472)__pyx_k144:S(0,473)__pyx_k145:S(0,474)__pyx_k146:S(0,475)__pyx_k147:S(0,476)__pyx_k148:S(0,477)__pyx_k149:S(0,478)__pyx_k150:S(0,479)__pyx_k151:S(0,480)__pyx_k152:S(0,481)__pyx_k153:S(0,482)__pyx_k154:S(0,483)__pyx_k155:S(0,484)__pyx_k156:S(0,485)__pyx_k157:S(0,486)__pyx_k158:S(0,487)__pyx_k159:S(0,488)__pyx_k160:S(0,489)__pyx_k161:S(0,490)__pyx_k162:S(0,491)__pyx_k163:S(0,492)__pyx_k164:S(0,493)__pyx_k165:S(0,494)__pyx_k166:S(0,495)__pyx_k167:S(0,496)__pyx_k168:S(0,497)__pyx_k169:S(0,498)__pyx_k170:S(0,499)__pyx_k171:S(0,500)__pyx_k172:S(0,501)__pyx_k173:S(0,502)__pyx_k174:S(0,503)__pyx_k175:S(0,504)__pyx_k176:S(0,505)__pyx_k177:S(0,506)__pyx_k178:S(0,507)__pyx_k179:S(0,508)__pyx_k180:S(0,509)__pyx_k181:S(0,510)__pyx_k182:S(0,511)__pyx_k183:S(0,512)__pyx_k184:S(0,513)__pyx_k185:S(0,514)__pyx_k186:S(0,515)__pyx_k187:S(0,516)__pyx_k188:S(0,517)__pyx_k189:S(0,518)__pyx_k190:S(0,519)__pyx_k191:S(0,520)__pyx_k192:S(0,521)__pyx_k193:S(0,522)__pyx_k194:S(0,523)__pyx_k195:S(0,524)__pyx_k196:S(0,525)__pyx_k197:S(0,526)__pyx_k198:S(0,527)__pyx_k199:S(0,528)__pyx_k200:S(0,529)__pyx_k201:S(0,530)__pyx_k202:S(0,531)__pyx_k203:S(0,532)__pyx_k204:S(0,533)__pyx_k205:S(0,534)__pyx_k206:S(0,535)__pyx_k207:S(0,536)__pyx_k208:S(0,537)__pyx_k209:S(0,538)__pyx_k210:S(0,539)__pyx_k211:S(0,540)__pyx_k212:S(0,541)__pyx_k213:S(0,542)__pyx_k214:S(0,543)__pyx_k215:S(0,544)__pyx_k216:S(0,545)__pyx_k217:S(0,546)__pyx_k218:S(0,547)__pyx_k219:S(0,548)__pyx_k220:S(0,549)__pyx_k221:S(0,550)__pyx_k222:S(0,551)__pyx_k223:S(0,552)__pyx_k224:S(0,553)__pyx_k225:S(0,554)__pyx_k226:S(0,555)__pyx_k227:S(0,556)__pyx_k228:S(0,557)__pyx_k229:S(0,558)__pyx_k230:S(0,559)__pyx_k231:S(0,560)__pyx_k232:S(0,561)__pyx_k233:S(0,562)__pyx_k234:S(0,563)__pyx_k235:S(0,564)__pyx_k236:S(0,565)__pyx_k237:S(0,566)__pyx_k238:S(0,567)__pyx_k239:S(0,568)__pyx_k240:S(0,569)__pyx_k241:S(0,570)__pyx_k242:S(0,571)__pyx_k243:S(0,572)__pyx_k244:S(0,573)__pyx_k245:S(0,574)__pyx_k246:S(0,575)__pyx_k247:S(0,576)__pyx_k248:S(0,577)__pyx_k249:S(0,578)__pyx_k250:S(0,579)__pyx_k251:S(0,580)__pyx_n_AttributeError:S(0,2)__pyx_n_BuildMSASlice:S(0,2)__pyx_n_ClassicUnpickler:S(0,2)__pyx_n_DictQueue:S(0,2)__pyx_n_EmptyAlignmentError:S(0,2)__pyx_n_EmptySlice:S(0,2)__pyx_n_EmptySliceError:S(0,2)__pyx_n_FloatType:S(0,2)__pyx_n_LetterEdge:S(0,2)__pyx_n_NLMSASeqDict:S(0,2)__pyx_n_NLMSASequence:S(0,2)__pyx_n_NLMSA_LPO_Internal:S(0,2)__pyx_n_NLMSA_UNION_Internal:S(0,2)__pyx_n_NLMSAindex:S(0,2)__pyx_n_PrefixUnionDict:S(0,2)__pyx_n_RLIMIT_NOFILE:S(0,2)__pyx_n_Seq2SeqEdge:S(0,2)__pyx_n_SeqCacheOwner:S(0,2)__pyx_n_SeqPath:S(0,2)__pyx_n_SeqPrefixUnionDict:S(0,2)__pyx_n_StringType:S(0,2)__pyx_n___class__:S(0,2)__pyx_n___getstate__:S(0,2)__pyx_n___iadd__:S(0,2)__pyx_n___init__:S(0,2)__pyx_n__cache_max:S(0,2)__pyx_n__persistent_id:S(0,2)__pyx_n_absoluteSlice:S(0,2)__pyx_n_addAll:S(0,2)__pyx_n_addToSeqlist:S(0,2)__pyx_n_add_aligned_intervals:S(0,2)__pyx_n_advanceStartStop:S(0,2)__pyx_n_append:S(0,2)__pyx_n_basename:S(0,2)__pyx_n_build:S(0,2)__pyx_n_buildFiles:S(0,2)__pyx_n_buildFromUnsortedFile:S(0,2)__pyx_n_buildInMemory:S(0,2)__pyx_n_cacheHint:S(0,2)__pyx_n_cache_reference:S(0,2)__pyx_n_check_nonempty:S(0,2)__pyx_n_chr:S(0,2)__pyx_n_classutil:S(0,2)__pyx_n_clip_interval_list:S(0,2)__pyx_n_close:S(0,2)__pyx_n_cmp:S(0,2)__pyx_n_conservationFilter:S(0,2)__pyx_n_conservedSegment:S(0,2)__pyx_n_doSlice:S(0,2)__pyx_n_dump:S(0,2)__pyx_n_edges:S(0,2)__pyx_n_end:S(0,2)__pyx_n_filterIvalConservation:S(0,2)__pyx_n_filterSeqs:S(0,2)__pyx_n_forceLoad:S(0,2)__pyx_n_get:S(0,2)__pyx_n_getID:S(0,2)__pyx_n_getIDcoords:S(0,2)__pyx_n_getSeq:S(0,2)__pyx_n_getSeqID:S(0,2)__pyx_n_groupByIntervals:S(0,2)__pyx_n_groupBySequences:S(0,2)__pyx_n_id:S(0,2)__pyx_n_im:S(0,2)__pyx_n_indelCut:S(0,2)__pyx_n_info:S(0,2)__pyx_n_initLPO:S(0,2)__pyx_n_inverseDB:S(0,2)__pyx_n_ipos:S(0,2)__pyx_n_is_bidirectional:S(0,2)__pyx_n_is_lpo:S(0,2)__pyx_n_is_union:S(0,2)__pyx_n_items:S(0,2)__pyx_n_iteritems:S(0,2)__pyx_n_join:S(0,2)__pyx_n_keys:S(0,2)__pyx_n_length:S(0,2)__pyx_n_load:S(0,2)__pyx_n_logger:S(0,2)__pyx_n_mapping:S(0,2)__pyx_n_maxAlignSize:S(0,2)__pyx_n_maxgap:S(0,2)__pyx_n_maxinsert:S(0,2)__pyx_n_memory:S(0,2)__pyx_n_mergeAll:S(0,2)__pyx_n_mergeSeq:S(0,2)__pyx_n_minAlignSize:S(0,2)__pyx_n_minAligned:S(0,2)__pyx_n_mininsert:S(0,2)__pyx_n_msaSlice:S(0,2)__pyx_n_n:S(0,2)__pyx_n_name:S(0,2)__pyx_n_newSequence:S(0,2)__pyx_n_nextID:S(0,2)__pyx_n_nlmsaSequence:S(0,2)__pyx_n_nlmsaSlice:S(0,2)__pyx_n_nlmsa_utils:S(0,2)__pyx_n_nodeEdges:S(0,2)__pyx_n_noname:S(0,2)__pyx_n_ns:S(0,2)__pyx_n_offset:S(0,2)__pyx_n_onDemand:S(0,2)__pyx_n_open:S(0,2)__pyx_n_open_shelve:S(0,2)__pyx_n_orientation:S(0,2)__pyx_n_os:S(0,2)__pyx_n_pAlignedMin:S(0,2)__pyx_n_pIdentityMin:S(0,2)__pyx_n_pMinAligned:S(0,2)__pyx_n_pairwiseMode:S(0,2)__pyx_n_path:S(0,2)__pyx_n_pathForward:S(0,2)__pyx_n_pathstem:S(0,2)__pyx_n_pickle:S(0,2)__pyx_n_prefixDict:S(0,2)__pyx_n_prune_self_mappings:S(0,2)__pyx_n_pygr:S(0,2)__pyx_n_r:S(0,2)__pyx_n_rU:S(0,2)__pyx_n_rawIvals:S(0,2)__pyx_n_rb:S(0,2)__pyx_n_readAxtNet:S(0,2)__pyx_n_readMAFfiles:S(0,2)__pyx_n_read_attrs:S(0,2)__pyx_n_read_indexes:S(0,2)__pyx_n_read_seq_dict:S(0,2)__pyx_n_relativeSlice:S(0,2)__pyx_n_remove:S(0,2)__pyx_n_reopenReadOnly:S(0,2)__pyx_n_resource:S(0,2)__pyx_n_runBuildMethod:S(0,2)__pyx_n_saveSeq:S(0,2)__pyx_n_save_seq_dict:S(0,2)__pyx_n_save_tuples:S(0,2)__pyx_n_seq:S(0,2)__pyx_n_seqBounds:S(0,2)__pyx_n_seqDict:S(0,2)__pyx_n_seqInfoDict:S(0,2)__pyx_n_seqInterval:S(0,2)__pyx_n_seqdb:S(0,2)__pyx_n_seqlist:S(0,2)__pyx_n_sequence:S(0,2)__pyx_n_setrlimit:S(0,2)__pyx_n_sort:S(0,2)__pyx_n_sourceDB:S(0,2)__pyx_n_sourceOnly:S(0,2)__pyx_n_sourcePath:S(0,2)__pyx_n_split:S(0,2)__pyx_n_splitLPOintervals:S(0,2)__pyx_n_start:S(0,2)__pyx_n_startswith:S(0,2)__pyx_n_stop:S(0,2)__pyx_n_string:S(0,2)__pyx_n_strip:S(0,2)__pyx_n_sys:S(0,2)__pyx_n_targetDB:S(0,2)__pyx_n_target_start:S(0,2)__pyx_n_types:S(0,2)__pyx_n_w:S(0,2)__pyx_n_warn:S(0,2)__pyx_n_wb:S(0,2)__pyx_n_worldbase:S(0,2)__pyx_n_write:S(0,2)__pyx_n_write_binaries:S(0,2)__pyx_n_xmlrpc:S(0,2)__pyx_k3p:S(0,2)__pyx_k5p:S(0,2)__pyx_k7p:S(0,2)__pyx_k8p:S(0,2)__pyx_k11p:S(0,2)__pyx_k13p:S(0,2)__pyx_k14p:S(0,2)__pyx_k15p:S(0,2)__pyx_k17p:S(0,2)__pyx_k26p:S(0,2)__pyx_k27p:S(0,2)__pyx_k35p:S(0,2)__pyx_k47p:S(0,2)__pyx_k53p:S(0,2)__pyx_k83p:S(0,2)__pyx_k86p:S(0,2)__pyx_k88p:S(0,2)__pyx_k89p:S(0,2)__pyx_k90p:S(0,2)__pyx_k99p:S(0,2)__pyx_k104p:S(0,2)__pyx_k106p:S(0,2)__pyx_k107p:S(0,2)__pyx_k113p:S(0,2)__pyx_k114p:S(0,2)__pyx_k126p:S(0,2)__pyx_k139p:S(0,2)__pyx_k143p:S(0,2)__pyx_k148p:S(0,2)__pyx_k152p:S(0,2)__pyx_k153p:S(0,2)__pyx_k155p:S(0,2)__pyx_k159p:S(0,2)__pyx_k164p:S(0,2)__pyx_k167p:S(0,2)__pyx_k170p:S(0,2)__pyx_k173p:S(0,2)__pyx_k175p:S(0,2)__pyx_k176p:S(0,2)__pyx_k178p:S(0,2)__pyx_k180p:S(0,2)__pyx_k181p:S(0,2)__pyx_k183p:S(0,2)__pyx_k184p:S(0,2)__pyx_k186p:S(0,2)__pyx_k190p:S(0,2)__pyx_k191p:S(0,2)__pyx_k192p:S(0,2)__pyx_k194p:S(0,2)__pyx_k195p:S(0,2)__pyx_k196p:S(0,2)__pyx_k197p:S(0,2)__pyx_k201p:S(0,2)__pyx_k204p:S(0,2)__pyx_k207p:S(0,2)__pyx_k209p:S(0,2)__pyx_k211p:S(0,2)__pyx_k212p:S(0,2)__pyx_k215p:S(0,2)__pyx_k220p:S(0,2)__pyx_k223p:S(0,2)__pyx_k224p:S(0,2)__pyx_k228p:S(0,2)__pyx_k229p:S(0,2)__pyx_k231p:S(0,2)__pyx_k232p:S(0,2)__pyx_k234p:S(0,2)__pyx_k238p:S(0,2)__pyx_k240p:S(0,2)__pyx_k245p:S(0,2)__pyx_k246p:S(0,2)__pyx_k247p:S(0,2)__pyx_string_tab:S(0,581)__pyx_d1:S(0,2)__pyx_d2:S(0,2)__pyx_d3:S(0,2)__pyx_d4:S(0,2)__pyx_d5:S(0,126):t(0,330)=ar(0,120);0;1;(0,54):t(0,331)=ar(0,120);0;14;(0,54):t(0,332)=ar(0,120);0;22;(0,54):t(0,333)=ar(0,120);0;5;(0,54):t(0,334)=ar(0,120);0;34;(0,54):t(0,335)=ar(0,120);0;2;(0,54):t(0,336)=ar(0,120);0;15;(0,54):t(0,337)=ar(0,120);0;27;(0,54):t(0,338)=ar(0,120);0;14;(0,54):t(0,339)=ar(0,120);0;6;(0,54):t(0,340)=ar(0,120);0;33;(0,54):t(0,341)=ar(0,120);0;9;(0,54):t(0,342)=ar(0,120);0;13;(0,54):t(0,343)=ar(0,120);0;56;(0,54):t(0,344)=ar(0,120);0;21;(0,54):t(0,345)=ar(0,120);0;4;(0,54):t(0,346)=ar(0,120);0;37;(0,54):t(0,347)=ar(0,120);0;9;(0,54):t(0,348)=ar(0,120);0;5;(0,54):t(0,349)=ar(0,120);0;7;(0,54):t(0,350)=ar(0,120);0;8;(0,54):t(0,351)=ar(0,120);0;14;(0,54):t(0,352)=ar(0,120);0;2;(0,54):t(0,353)=ar(0,120);0;11;(0,54):t(0,354)=ar(0,120);0;15;(0,54):t(0,355)=ar(0,120);0;29;(0,54):t(0,356)=ar(0,120);0;35;(0,54):t(0,357)=ar(0,120);0;8;(0,54):t(0,358)=ar(0,120);0;6;(0,54):t(0,359)=ar(0,120);0;10;(0,54):t(0,360)=ar(0,120);0;9;(0,54):t(0,361)=ar(0,120);0;8;(0,54):t(0,362)=ar(0,120);0;13;(0,54):t(0,363)=ar(0,120);0;2;(0,54):t(0,364)=ar(0,120);0;36;(0,54):t(0,365)=ar(0,120);0;11;(0,54):t(0,366)=ar(0,120);0;6;(0,54):t(0,367)=ar(0,120);0;15;(0,54):t(0,368)=ar(0,120);0;11;(0,54):t(0,369)=ar(0,120);0;16;(0,54):t(0,370)=ar(0,120);0;8;(0,54):t(0,371)=ar(0,120);0;16;(0,54):t(0,372)=ar(0,120);0;8;(0,54):t(0,373)=ar(0,120);0;11;(0,54):t(0,374)=ar(0,120);0;5;(0,54):t(0,375)=ar(0,120);0;4;(0,54):t(0,376)=ar(0,120);0;121;(0,54):t(0,377)=ar(0,120);0;5;(0,54):t(0,378)=ar(0,120);0;11;(0,54):t(0,379)=ar(0,120);0;13;(0,54):t(0,380)=ar(0,120);0;9;(0,54):t(0,381)=ar(0,120);0;12;(0,54):t(0,382)=ar(0,120);0;32;(0,54):t(0,383)=ar(0,120);0;10;(0,54):t(0,384)=ar(0,120);0;11;(0,54):t(0,385)=ar(0,120);0;5;(0,54):t(0,386)=ar(0,120);0;4;(0,54):t(0,387)=ar(0,120);0;9;(0,54):t(0,388)=ar(0,120);0;8;(0,54):t(0,389)=ar(0,120);0;6;(0,54):t(0,390)=ar(0,120);0;9;(0,54):t(0,391)=ar(0,120);0;9;(0,54):t(0,392)=ar(0,120);0;10;(0,54):t(0,393)=ar(0,120);0;11;(0,54):t(0,394)=ar(0,120);0;12;(0,54):t(0,395)=ar(0,120);0;12;(0,54):t(0,396)=ar(0,120);0;12;(0,54):t(0,397)=ar(0,120);0;22;(0,54):t(0,398)=ar(0,120);0;13;(0,54):t(0,399)=ar(0,120);0;16;(0,54):t(0,400)=ar(0,120);0;18;(0,54):t(0,401)=ar(0,120);0;5;(0,54):t(0,402)=ar(0,120);0;18;(0,54):t(0,403)=ar(0,120);0;9;(0,54):t(0,404)=ar(0,120);0;7;(0,54):t(0,405)=ar(0,120);0;4;(0,54):t(0,406)=ar(0,120);0;10;(0,54):t(0,407)=ar(0,120);0;10;(0,54):t(0,408)=ar(0,120);0;11;(0,54):t(0,409)=ar(0,120);0;8;(0,54):t(0,410)=ar(0,120);0;9;(0,54):t(0,411)=ar(0,120);0;5;(0,54):t(0,412)=ar(0,120);0;39;(0,54):t(0,413)=ar(0,120);0;3;(0,54):t(0,414)=ar(0,120);0;13;(0,54):t(0,415)=ar(0,120);0;13;(0,54):t(0,416)=ar(0,120);0;16;(0,54):t(0,417)=ar(0,120);0;25;(0,54):t(0,418)=ar(0,120);0;15;(0,54):t(0,419)=ar(0,120);0;26;(0,54):t(0,420)=ar(0,120);0;4;(0,54):t(0,421)=ar(0,120);0;10;(0,54):t(0,422)=ar(0,120);0;2;(0,54):t(0,423)=ar(0,120);0;3;(0,54):t(0,424)=ar(0,120);0;10;(0,54):t(0,425)=ar(0,120);0;10;(0,54):t(0,426)=ar(0,120);0;4;(0,54):t(0,427)=ar(0,120);0;4;(0,54):t(0,428)=ar(0,120);0;49;(0,54):t(0,429)=ar(0,120);0;6;(0,54):t(0,430)=ar(0,120);0;6;(0,54):t(0,431)=ar(0,120);0;6;(0,54):t(0,432)=ar(0,120);0;1;(0,54):t(0,433)=ar(0,120);0;6;(0,54):t(0,434)=ar(0,120);0;2;(0,54):t(0,435)=ar(0,120);0;30;(0,54):t(0,436)=ar(0,120);0;24;(0,54):t(0,437)=ar(0,120);0;21;(0,54):t(0,438)=ar(0,120);0;14;(0,54):t(0,439)=ar(0,120);0;2;(0,54):t(0,440)=ar(0,120);0;6;(0,54):t(0,441)=ar(0,120);0;11;(0,54):t(0,442)=ar(0,120);0;29;(0,54):t(0,443)=ar(0,120);0;48;(0,54):t(0,444)=ar(0,120);0;11;(0,54):t(0,445)=ar(0,120);0;8;(0,54):t(0,446)=ar(0,120);0;8;(0,54):t(0,447)=ar(0,120);0;7;(0,54):t(0,448)=ar(0,120);0;8;(0,54):t(0,449)=ar(0,120);0;9;(0,54):t(0,450)=ar(0,120);0;13;(0,54):t(0,451)=ar(0,120);0;12;(0,54):t(0,452)=ar(0,120);0;7;(0,54):t(0,453)=ar(0,120);0;8;(0,54):t(0,454)=ar(0,120);0;8;(0,54):t(0,455)=ar(0,120);0;50;(0,54):t(0,456)=ar(0,120);0;13;(0,54):t(0,457)=ar(0,120);0;12;(0,54):t(0,458)=ar(0,120);0;10;(0,54):t(0,459)=ar(0,120);0;12;(0,54):t(0,460)=ar(0,120);0;10;(0,54):t(0,461)=ar(0,120);0;5;(0,54):t(0,462)=ar(0,120);0;18;(0,54):t(0,463)=ar(0,120);0;6;(0,54):t(0,464)=ar(0,120);0;7;(0,54):t(0,465)=ar(0,120);0;21;(0,54):t(0,466)=ar(0,120);0;5;(0,54):t(0,467)=ar(0,120);0;6;(0,54):t(0,468)=ar(0,120);0;15;(0,54):t(0,469)=ar(0,120);0;16;(0,54):t(0,470)=ar(0,120);0;9;(0,54):t(0,471)=ar(0,120);0;12;(0,54):t(0,472)=ar(0,120);0;33;(0,54):t(0,473)=ar(0,120);0;8;(0,54):t(0,474)=ar(0,120);0;7;(0,54):t(0,475)=ar(0,120);0;9;(0,54):t(0,476)=ar(0,120);0;8;(0,54):t(0,477)=ar(0,120);0;11;(0,54):t(0,478)=ar(0,120);0;2;(0,54):t(0,479)=ar(0,120);0;10;(0,54):t(0,480)=ar(0,120);0;5;(0,54):t(0,481)=ar(0,120);0;1;(0,54):t(0,482)=ar(0,120);0;23;(0,54):t(0,483)=ar(0,120);0;18;(0,54):t(0,484)=ar(0,120);0;38;(0,54):t(0,485)=ar(0,120);0;8;(0,54):t(0,486)=ar(0,120);0;12;(0,54):t(0,487)=ar(0,120);0;6;(0,54):t(0,488)=ar(0,120);0;9;(0,54):t(0,489)=ar(0,120);0;4;(0,54):t(0,490)=ar(0,120);0;16;(0,54):t(0,491)=ar(0,120);0;12;(0,54):t(0,492)=ar(0,120);0;6;(0,54):t(0,493)=ar(0,120);0;39;(0,54):t(0,494)=ar(0,120);0;6;(0,54):t(0,495)=ar(0,120);0;4;(0,54):t(0,496)=ar(0,120);0;260;(0,54):t(0,497)=ar(0,120);0;13;(0,54):t(0,498)=ar(0,120);0;3;(0,54):t(0,499)=ar(0,120);0;57;(0,54):t(0,500)=ar(0,120);0;7;(0,54):t(0,501)=ar(0,120);0;10;(0,54):t(0,502)=ar(0,120);0;54;(0,54):t(0,503)=ar(0,120);0;17;(0,54):t(0,504)=ar(0,120);0;43;(0,54):t(0,505)=ar(0,120);0;30;(0,54):t(0,506)=ar(0,120);0;11;(0,54):t(0,507)=ar(0,120);0;127;(0,54):t(0,508)=ar(0,120);0;2;(0,54):t(0,509)=ar(0,120);0;21;(0,54):t(0,510)=ar(0,120);0;22;(0,54):t(0,511)=ar(0,120);0;5;(0,54):t(0,512)=ar(0,120);0;31;(0,54):t(0,513)=ar(0,120);0;38;(0,54):t(0,514)=ar(0,120);0;4;(0,54):t(0,515)=ar(0,120);0;53;(0,54):t(0,516)=ar(0,120);0;3;(0,54):t(0,517)=ar(0,120);0;1;(0,54):t(0,518)=ar(0,120);0;6;(0,54):t(0,519)=ar(0,120);0;7;(0,54):t(0,520)=ar(0,120);0;24;(0,54):t(0,521)=ar(0,120);0;8;(0,54):t(0,522)=ar(0,120);0;8;(0,54):t(0,523)=ar(0,120);0;1;(0,54):t(0,524)=ar(0,120);0;4;(0,54):t(0,525)=ar(0,120);0;82;(0,54):t(0,526)=ar(0,120);0;41;(0,54):t(0,527)=ar(0,120);0;14;(0,54):t(0,528)=ar(0,120);0;10;(0,54):t(0,529)=ar(0,120);0;5;(0,54):t(0,530)=ar(0,120);0;12;(0,54):t(0,531)=ar(0,120);0;20;(0,54):t(0,532)=ar(0,120);0;19;(0,54):t(0,533)=ar(0,120);0;16;(0,54):t(0,534)=ar(0,120);0;3;(0,54):t(0,535)=ar(0,120);0;4;(0,54):t(0,536)=ar(0,120);0;18;(0,54):t(0,537)=ar(0,120);0;13;(0,54):t(0,538)=ar(0,120);0;321;(0,54):t(0,539)=ar(0,120);0;13;(0,54):t(0,540)=ar(0,120);0;30;(0,54):t(0,541)=ar(0,120);0;4;(0,54):t(0,542)=ar(0,120);0;9;(0,54):t(0,543)=ar(0,120);0;11;(0,54):t(0,544)=ar(0,120);0;10;(0,54):t(0,545)=ar(0,120);0;10;(0,54):t(0,546)=ar(0,120);0;4;(0,54):t(0,547)=ar(0,120);0;14;(0,54):t(0,548)=ar(0,120);0;7;(0,54):t(0,549)=ar(0,120);0;308;(0,54):t(0,550)=ar(0,120);0;3;(0,54):t(0,551)=ar(0,120);0;27;(0,54):t(0,552)=ar(0,120);0;24;(0,54):t(0,553)=ar(0,120);0;400;(0,54):t(0,554)=ar(0,120);0;18;(0,54):t(0,555)=ar(0,120);0;18;(0,54):t(0,556)=ar(0,120);0;16;(0,54):t(0,557)=ar(0,120);0;21;(0,54):t(0,558)=ar(0,120);0;23;(0,54):t(0,559)=ar(0,120);0;26;(0,54):t(0,560)=ar(0,120);0;16;(0,54):t(0,561)=ar(0,120);0;0;(0,54):t(0,562)=ar(0,120);0;4;(0,54):t(0,563)=ar(0,120);0;42;(0,54):t(0,564)=ar(0,120);0;4;(0,54):t(0,565)=ar(0,120);0;9;(0,54):t(0,566)=ar(0,120);0;1;(0,54):t(0,567)=ar(0,120);0;7;(0,54):t(0,568)=ar(0,120);0;17;(0,54):t(0,569)=ar(0,120);0;131;(0,54):t(0,570)=ar(0,120);0;15;(0,54):t(0,571)=ar(0,120);0;17;(0,54):t(0,572)=ar(0,120);0;10;(0,54):t(0,573)=ar(0,120);0;13;(0,54):t(0,574)=ar(0,120);0;21;(0,54):t(0,575)=ar(0,120);0;27;(0,54):t(0,576)=ar(0,120);0;3;(0,54):t(0,577)=ar(0,120);0;52;(0,54):t(0,578)=ar(0,120);0;58;(0,54):t(0,579)=ar(0,120);0;6;(0,54):t(0,580)=ar(0,120);0;19;(0,54):t(0,581)=ar(0,120);0;237;(0,582)__Pyx_StringTabEntry:t(0,582)=(0,583):T(0,583)=s16p:(0,232),0,32;i:(0,5),32,32;s:(0,8),64,32;n:(0,33),96,32;;__pyx_d6:S(0,194)__pyx_d7:S(0,5)__pyx_d8:S(0,2)__pyx_d9:S(0,2)__pyx_d10:S(0,2)__pyx_d11:S(0,5)__pyx_d12:S(0,5)__pyx_d13:S(0,2)__pyx_d14:S(0,2)__pyx_d15:S(0,2)__pyx_d16:S(0,2)__pyx_d17:S(0,5)__pyx_d18:S(0,5)__pyx_d19:S(0,5)__pyx_d20:S(0,2)__pyx_d21:S(0,2)__pyx_d22:S(0,2)__pyx_d23:S(0,2)__pyx_d24:S(0,2)__pyx_d25:S(0,2)__pyx_d26:S(0,2)__pyx_d27:S(0,2)__pyx_d28:S(0,2)__pyx_d29:S(0,2)__pyx_d30:S(0,2)__pyx_d31:S(0,2)__pyx_d32:S(0,2)__pyx_d33:S(0,2)__pyx_d34:S(0,2)__pyx_d35:S(0,2)__pyx_d36:S(0,2)__pyx_d37:S(0,2)__pyx_d38:S(0,2)__pyx_d39:S(0,5)__pyx_d40:S(0,5)__pyx_d41:S(0,2)__pyx_d42:S(0,2)__pyx_d43:S(0,2)__pyx_d44:S(0,2)__pyx_d45:S(0,2)__pyx_d46:S(0,2)__pyx_d47:S(0,2)__pyx_d48:S(0,2)__pyx_d49:S(0,2)__pyx_d50:S(0,2)__pyx_d51:S(0,2)__pyx_d52:S(0,2)__pyx_d53:S(0,2)__pyx_d54:S(0,2)__pyx_d55:S(0,2)__pyx_d56:S(0,2)__pyx_d57:S(0,2)__pyx_d58:S(0,2)__pyx_d59:S(0,2)__pyx_d60:S(0,2)__pyx_d61:S(0,2)__pyx_d62:S(0,2)__pyx_d63:S(0,2)__pyx_d64:S(0,2)__pyx_d65:S(0,2)__pyx_d66:S(0,2)__pyx_d67:S(0,2)__pyx_d68:S(0,2)__pyx_doc_4pygr_11cnestedlist_10IntervalDB_save_tuples:S(0,584)__pyx_doc_4pygr_11cnestedlist_10IntervalDB_runBuildMethod:S(0,585)__pyx_doc_4pygr_11cnestedlist_10IntervalDB_buildFromUnsortedFile:S(0,586)__pyx_doc_4pygr_11cnestedlist_22IntervalFileDBIterator_mergeSeq:S(0,587)__pyx_doc_4pygr_11cnestedlist_17NLMSASliceLetters_items:S(0,588)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_edges:S(0,589)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_items:S(0,590)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_keys:S(0,591)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_matchIntervals:S(0,592)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_findSeqEnds:S(0,593)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_generateSeqEnds:S(0,594)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_groupByIntervals:S(0,595)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_groupBySequences:S(0,596)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_clip_interval_list:S(0,597)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_split:S(0,598)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_regions:S(0,599)__pyx_doc_4pygr_11cnestedlist_10NLMSASlice_rawIvals:S(0,600)__pyx_doc_4pygr_11cnestedlist_9NLMSANode_getSeqPos:S(0,601)__pyx_doc_4pygr_11cnestedlist_9NLMSANode_getEdgeSeqs:S(0,602)__pyx_doc_4pygr_11cnestedlist_9NLMSANode_nodeEdges:S(0,603)__pyx_doc_4pygr_11cnestedlist_13NLMSASequence_forceLoad:S(0,604)__pyx_doc_4pygr_11cnestedlist_13NLMSASequence_close:S(0,605)__pyx_doc_4pygr_11cnestedlist_13NLMSASequence_buildFiles:S(0,606)__pyx_doc_4pygr_11cnestedlist_5NLMSA_close:S(0,607)__pyx_doc_4pygr_11cnestedlist_5NLMSA_read_indexes:S(0,608)__pyx_doc_4pygr_11cnestedlist_5NLMSA_read_attrs:S(0,609)__pyx_doc_4pygr_11cnestedlist_5NLMSA_addToSeqlist:S(0,610)__pyx_doc_4pygr_11cnestedlist_5NLMSA_newSequence:S(0,611)__pyx_doc_4pygr_11cnestedlist_5NLMSA_nextID:S(0,612)__pyx_doc_4pygr_11cnestedlist_5NLMSA_initLPO:S(0,613)__pyx_doc_4pygr_11cnestedlist_5NLMSA_init_pairwise_mode:S(0,614)__pyx_doc_4pygr_11cnestedlist_5NLMSA_addAnnotation:S(0,615)__pyx_doc_4pygr_11cnestedlist_5NLMSA_add_aligned_intervals:S(0,616)__pyx_doc_4pygr_11cnestedlist_5NLMSA_readMAFfiles:S(0,617)__pyx_doc_4pygr_11cnestedlist_5NLMSA_readAxtNet:S(0,618)__pyx_doc_4pygr_11cnestedlist_5NLMSA_buildFiles:S(0,619)__pyx_doc_4pygr_11cnestedlist_5NLMSA_save_seq_dict:S(0,620)__pyx_doc_4pygr_11cnestedlist_5NLMSA_build:S(0,621)__pyx_doc_4pygr_11cnestedlist_5NLMSA_seqInterval:S(0,622)__pyx_doc_4pygr_11cnestedlist_dump_textfile:S(0,623)__pyx_doc_4pygr_11cnestedlist_textfile_to_binaries:S(0,624)__pyx_methods_4pygr_11cnestedlist_IntervalDB:S(0,625)__pyx_tp_as_number_IntervalDB:S(0,61)__pyx_tp_as_sequence_IntervalDB:S(0,62)__pyx_tp_as_mapping_IntervalDB:S(0,63)__pyx_tp_as_buffer_IntervalDB:S(0,68)__pyx_vtable_4pygr_11cnestedlist_IntervalDBIterator:S(0,222):t(0,584)=ar(0,120);0;51;(0,54):t(0,585)=ar(0,120);0;49;(0,54):t(0,586)=ar(0,120);0;48;(0,54):t(0,587)=ar(0,120);0;61;(0,54):t(0,588)=ar(0,120);0;40;(0,54):t(0,589)=ar(0,120);0;64;(0,54):t(0,590)=ar(0,120);0;53;(0,54):t(0,591)=ar(0,120);0;72;(0,54):t(0,592)=ar(0,120);0;193;(0,54):t(0,593)=ar(0,120);0;52;(0,54):t(0,594)=ar(0,120);0;37;(0,54):t(0,595)=ar(0,120);0;1306;(0,54):t(0,596)=ar(0,120);0;1386;(0,54):t(0,597)=ar(0,120);0;46;(0,54):t(0,598)=ar(0,120);0;116;(0,54):t(0,599)=ar(0,120);0;110;(0,54):t(0,600)=ar(0,120);0;50;(0,54):t(0,601)=ar(0,120);0;39;(0,54):t(0,602)=ar(0,120);0;62;(0,54):t(0,603)=ar(0,120);0;37;(0,54):t(0,604)=ar(0,120);0;53;(0,54):t(0,605)=ar(0,120);0;63;(0,54):t(0,606)=ar(0,120);0;52;(0,54):t(0,607)=ar(0,120);0;28;(0,54):t(0,608)=ar(0,120);0;66;(0,54):t(0,609)=ar(0,120);0;61;(0,54):t(0,610)=ar(0,120);0;51;(0,54):t(0,611)=ar(0,120);0;46;(0,54):t(0,612)=ar(0,120);0;40;(0,54):t(0,613)=ar(0,120);0;30;(0,54):t(0,614)=ar(0,120);0;67;(0,54):t(0,615)=ar(0,120);0;60;(0,54):t(0,616)=ar(0,120);0;34;(0,54):t(0,617)=ar(0,120);0;38;(0,54):t(0,618)=ar(0,120);0;41;(0,54):t(0,619)=ar(0,120);0;65;(0,54):t(0,620)=ar(0,120);0;45;(0,54):t(0,621)=ar(0,120);0;69;(0,54):t(0,622)=ar(0,120);0;45;(0,54):t(0,623)=ar(0,120);0;38;(0,54):t(0,624)=ar(0,120);0;51;(0,54):t(0,625)=ar(0,120);0;8;(0,72)__pyx_methods_4pygr_11cnestedlist_IntervalDBIterator:S(0,626)__pyx_tp_as_number_IntervalDBIterator:S(0,61)__pyx_tp_as_sequence_IntervalDBIterator:S(0,62)__pyx_tp_as_mapping_IntervalDBIterator:S(0,63)__pyx_tp_as_buffer_IntervalDBIterator:S(0,68)__pyx_methods_4pygr_11cnestedlist_IntervalFileDB:S(0,627)__pyx_tp_as_number_IntervalFileDB:S(0,61)__pyx_tp_as_sequence_IntervalFileDB:S(0,62)__pyx_tp_as_mapping_IntervalFileDB:S(0,63)__pyx_tp_as_buffer_IntervalFileDB:S(0,68)__pyx_vtable_4pygr_11cnestedlist_NLMSASequence:S(0,206):t(0,626)=ar(0,120);0;0;(0,72):t(0,627)=ar(0,120);0;5;(0,72)__pyx_methods_4pygr_11cnestedlist_NLMSASequence:S(0,628)__pyx_members_4pygr_11cnestedlist_NLMSASequence:S(0,629)__pyx_tp_as_number_NLMSASequence:S(0,61)__pyx_tp_as_sequence_NLMSASequence:S(0,62)__pyx_tp_as_mapping_NLMSASequence:S(0,63)__pyx_tp_as_buffer_NLMSASequence:S(0,68)__pyx_vtable_4pygr_11cnestedlist_IntervalFileDBIterator:S(0,128):t(0,628)=ar(0,120);0;4;(0,72):t(0,629)=ar(0,120);0;11;(0,73)__pyx_methods_4pygr_11cnestedlist_IntervalFileDBIterator:S(0,630)__pyx_tp_as_number_IntervalFileDBIterator:S(0,61)__pyx_tp_as_sequence_IntervalFileDBIterator:S(0,62)__pyx_tp_as_mapping_IntervalFileDBIterator:S(0,63)__pyx_tp_as_buffer_IntervalFileDBIterator:S(0,68)__pyx_vtable_4pygr_11cnestedlist_NLMSA:S(0,207):t(0,630)=ar(0,120);0;1;(0,72)__pyx_methods_4pygr_11cnestedlist_NLMSA:S(0,631)__pyx_members_4pygr_11cnestedlist_NLMSA:S(0,632)__pyx_tp_as_number_NLMSA:S(0,61)__pyx_tp_as_sequence_NLMSA:S(0,62)__pyx_tp_as_mapping_NLMSA:S(0,63)__pyx_tp_as_buffer_NLMSA:S(0,68)__pyx_vtable_4pygr_11cnestedlist_NLMSASlice:S(0,197):t(0,631)=ar(0,120);0;19;(0,72):t(0,632)=ar(0,120);0;17;(0,73)__pyx_methods_4pygr_11cnestedlist_NLMSASlice:S(0,633)__pyx_members_4pygr_11cnestedlist_NLMSASlice:S(0,634)__pyx_getsets_4pygr_11cnestedlist_NLMSASlice:S(0,635)__pyx_tp_as_number_NLMSASlice:S(0,61)__pyx_tp_as_sequence_NLMSASlice:S(0,62)__pyx_tp_as_mapping_NLMSASlice:S(0,63)__pyx_tp_as_buffer_NLMSASlice:S(0,68)__pyx_methods_4pygr_11cnestedlist_NLMSASliceLetters:S(0,636)__pyx_members_4pygr_11cnestedlist_NLMSASliceLetters:S(0,637)__pyx_tp_as_number_NLMSASliceLetters:S(0,61)__pyx_tp_as_sequence_NLMSASliceLetters:S(0,62)__pyx_tp_as_mapping_NLMSASliceLetters:S(0,63)__pyx_tp_as_buffer_NLMSASliceLetters:S(0,68)__pyx_vtable_4pygr_11cnestedlist_NLMSANode:S(0,190):t(0,633)=ar(0,120);0;15;(0,72):t(0,634)=ar(0,120);0;6;(0,73):t(0,635)=ar(0,120);0;1;(0,74):t(0,636)=ar(0,120);0;2;(0,72):t(0,637)=ar(0,120);0;1;(0,73)__pyx_methods_4pygr_11cnestedlist_NLMSANode:S(0,638)__pyx_members_4pygr_11cnestedlist_NLMSANode:S(0,639)__pyx_getsets_4pygr_11cnestedlist_NLMSANode:S(0,640)__pyx_tp_as_number_NLMSANode:S(0,61)__pyx_tp_as_sequence_NLMSANode:S(0,62)__pyx_tp_as_mapping_NLMSANode:S(0,63)__pyx_tp_as_buffer_NLMSANode:S(0,68)__pyx_methods_4pygr_11cnestedlist_NLMSASliceIterator:S(0,641)__pyx_tp_as_number_NLMSASliceIterator:S(0,61)__pyx_tp_as_sequence_NLMSASliceIterator:S(0,62)__pyx_tp_as_mapping_NLMSASliceIterator:S(0,63)__pyx_tp_as_buffer_NLMSASliceIterator:S(0,68)__pyx_methods:S(0,642)__pyx_filenames:S(0,643)__pyx_type_4pygr_11cnestedlist_IntervalDB:G(0,229)__pyx_type_4pygr_11cnestedlist_IntervalDBIterator:G(0,229)__pyx_type_4pygr_11cnestedlist_IntervalFileDB:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSASequence:G(0,229)__pyx_type_4pygr_11cnestedlist_IntervalFileDBIterator:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSA:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSASlice:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSASliceLetters:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSANode:G(0,229)__pyx_type_4pygr_11cnestedlist_NLMSASliceIterator:G(0,229):t(0,638)=ar(0,120);0;3;(0,72):t(0,639)=ar(0,120);0;3;(0,73):t(0,640)=ar(0,120);0;1;(0,74):t(0,641)=ar(0,120);0;0;(0,72):t(0,642)=ar(0,120);0;3;(0,72):t(0,643)=ar(0,120);0;0;(0,8)/Users/administrator/Desktop/pygr-0.8.1/pygr/apps/maf2nclist.cgcc2_compiled.:t(0,1)=(0,1)seqnameID_qsort_cmp:F(0,2)void_a:P(0,3)void_b:P(0,3)int:t(0,2)=r(0,2);-2147483648;2147483647;:t(0,3)=*(0,4):t(0,4)=k(0,1)seqidmap_qsort_cmp:F(0,2)void_a:P(0,3)void_b:P(0,3)findseqID:F(0,2)seqName:P(0,5)seqidmap:P(0,6)r:P(0,2)int:t(0,2):t(0,5)=*(0,7):t(0,6)=*(0,8)char:t(0,7)=r(0,7);0;127;SeqIDMap:t(0,8)=(0,9):T(0,9)=s20id:(0,5),0,32;length:(0,2),32,32;ns_id:(0,2),64,32;offset:(0,2),96,32;nlmsa_id:(0,2),128,32;;l:r(0,2)mid:r(0,2)save_interval:F(0,2)im:P(0,10)start:P(0,2)stop:P(0,2)iseq:P(0,2)istart:P(0,2)istop:P(0,2):t(0,10)=*(0,11)IntervalMap:t(0,11)=(0,12):T(0,12)=s24start:(0,2),0,32;end:(0,2),32,32;target_id:(0,2),64,32;target_start:(0,2),96,32;target_end:(0,2),128,32;sublist:(0,2),160,32;;/usr/include/ctype.hpygr/apps/maf2nclist.creadMAFrecord:F(0,2)im:P(0,10)n:P(0,2)seqidmap:P(0,6)nseq:P(0,2)lpoStart:P(0,2)p_block_len:P(0,13)ifile:P(0,14)maxseq:P(0,2)linecode_count:p(0,15)p_has_continuation:p(0,13)i:r(0,2):t(0,13)=*(0,2):t(0,14)=*(0,16):t(0,15)=*(0,17)FILE:t(0,16)=(0,18)long long int:t(0,17)=@s64;r(0,17);01000000000000000000000;0777777777777777777777;__sFILE:T(0,18)=s88_p:(0,19),0,32;_r:(0,2),32,32;_w:(0,2),64,32;_flags:(0,20),96,16;_file:(0,20),112,16;_bf:(0,21),128,64;_lbfsize:(0,2),192,32;_cookie:(0,22),224,32;_close:(0,23),256,32;_read:(0,24),288,32;_seek:(0,25),320,32;_write:(0,26),352,32;_ub:(0,21),384,64;_extra:(0,27),448,32;_ur:(0,2),480,32;_ubuf:(0,28),512,24;_nbuf:(0,29),536,8;_lb:(0,21),544,64;_blksize:(0,2),608,32;_offset:(0,30),640,64;;:t(0,19)=*(0,32)short int:t(0,20)=@s16;r(0,20);-32768;32767;__sbuf:T(0,21)=s8_base:(0,19),0,32;_size:(0,2),32,32;;:t(0,22)=*(0,1):t(0,23)=*(0,33):t(0,24)=*(0,34):t(0,25)=*(0,35):t(0,26)=*(0,36):t(0,27)=*(0,37):t(0,28)=ar(0,38);0;2;(0,32):t(0,29)=ar(0,38);0;0;(0,32)__darwin_off_t:t(0,31)=(0,39)fpos_t:t(0,30)=(0,31)unsigned char:t(0,32)=@s8;r(0,32);0;255;:t(0,33)=f(0,2):t(0,34)=f(0,2):t(0,35)=f(0,30):t(0,36)=f(0,2):t(0,37)=xs__sFILEX:long unsigned int:t(0,38)=r(0,38);0;037777777777;__int64_t:t(0,39)=(0,17)seqStart:(0,2)junk:(0,2)iseq:r(0,2)max_len:r(0,2)seqLength:(0,2)newline:r(0,2)extend:r(0,2)tmp:(0,40)char:t(0,7):t(0,40)=ar(0,38);0;32767;(0,32)seq:(0,41)prefix:(0,42)seqName:(0,43)oriFlag:(0,42)linecode_count:r(0,15)p_has_continuation:r(0,13)_c:r(0,44)__darwin_ct_rune_t:t(0,44)=(0,2):t(0,41)=ar(0,38);0;32767;(0,7):t(0,42)=ar(0,38);0;7;(0,7):t(0,43)=ar(0,38);0;63;(0,7)l:r(0,2)l:r(0,2)istart:r(0,2)istart:r(0,2)istart:r(0,2)l:r(0,2)/usr/include/ctype.hpygr/apps/maf2nclist.cread_axtnet:F(0,2)im:p(0,10)seqidmap:P(0,6)nseq:P(0,2)ifile:P(0,14)maxseq:P(0,2)isrc:p(0,13)src_prefix:p(0,5)dest_prefix:p(0,5)i:r(0,2)srcStart:(0,2)srcEnd:(0,2)destStart:(0,2)destEnd:(0,2)junk:(0,2)junk2:(0,2)idest:r(0,2)n:r(0,2)ivalSrc:r(0,2)ivalDest:r(0,2)lineMax:r(0,2)lineAlloc:(0,2)destLength:r(0,2)tmp:(0,40)src_seq:r(0,5)dest_seq:r(0,5)srcName:(0,43)destName:(0,43)oriFlag:(0,42)srcChr:(0,43)destChr:(0,43)void:t(0,1)_c:r(0,44)l:r(0,2)l:r(0,2)errstr:(0,45)istop:r(0,2):t(0,45)=ar(0,38);0;1023;(0,7)stop:r(0,2)im:r(0,10)istop:r(0,2)stop:r(0,2)im:r(0,10)istop:r(0,2)stop:r(0,2)im:r(0,10)istop:r(0,2)stop:r(0,2)im:r(0,10)istop:r(0,2)stop:r(0,2)im:r(0,10)istop:r(0,2)stop:r(0,2)im:r(0,10)errstr:(0,45)errstr:(0,45)errstr:(0,45)PKd—~;t¾…ÝÝpygr/coordinator.pyfrom __future__ import generators import os import time import thread import sys import xmlrpclib import traceback from SimpleXMLRPCServer import SimpleXMLRPCServer import socket import dbfile import logging def get_hostname(host=None): 'get FQDN for host, or current host if not specified' if host is None: host = socket.gethostname() try: return socket.gethostbyaddr(host)[0] except socket.herror: # DNS CAN'T RESOLVE HOSTNAME return host # JUST USE HOSTNAME AS REPORTED BY gethostname() def get_server(host, port, logRequests=False): """Start xmlrpc server on requested host:port. Return bound SimpleXMLRPCServer server obj and port it's bound to. Set port=0 to bind to a random port number. """ if host is None: # use localhost as default host = 'localhost' server = SimpleXMLRPCServer((host, port), logRequests=logRequests) port = server.socket.getsockname()[1] logging.info("Running XMLRPC server on port %d..." % port) return server, port class XMLRPCClientObject(object): """provides object proxy for remote object, with methods that mirror its xmlrpc_methods""" def __init__(self, server, name, methodDict): self.name = name self.server = server import new class methodcall(object): def __init__(self, name): self.name = name def __call__(self, obj, *args): return obj.server.server.methodCall(obj.name, self.name, args) # Create methods to access those of the remote object. for methodName in methodDict: setattr(self, methodName, new.instancemethod(methodcall( methodName), self, self.__class__)) class XMLRPCClient(dict): 'interface to XMLRPC server serving multiple named objects' def __init__(self, url): self.server = xmlrpclib.ServerProxy(url) def __getitem__(self, name): 'get connection to the named server object' try: return dict.__getitem__(self, name) except KeyError: # Get information about the requested object. methodDict = self.server.objectInfo(name) import types if isinstance(methodDict, types.StringType): raise KeyError(methodDict) # RETURNED VALUE IS ERROR MESSAGE! v = XMLRPCClientObject(self, name, methodDict) self[name] = v # SAVE THIS OBJECT INTO OUR DICTIONARY return v class ConnectionDict(dict): """ensure that multiple requests for the same connection use the same ServerProxy""" def __call__(self, url, name): try: s = self[url] # REUSE EXISTING CONNECTION TO THE SERVER except KeyError: s = XMLRPCClient(url) # GET NEW CONNECTION TO THE SERVER self[url] = s # CACHE THIS CONNECTION return s[name] # GET THE REQUESTED OBJECT PROXY FROM THE SERVER get_connection = ConnectionDict() # THIS RETURNS SAME ServerProxy FOR SAME url def safe_dispatch(self, name, args): """restrict calls to selected methods, and trap all exceptions to keep server alive!""" import datetime if name in self.xmlrpc_methods: # Make sure this method is explicitly allowed. try: # TRAP ALL ERRORS TO PREVENT OUR SERVER FROM DYING print >>sys.stderr, 'XMLRPC:', name, args, \ datetime.datetime.now().isoformat(' ') # LOG THE REQUEST if self.xmlrpc_methods[name]: # use this as an alias for method m = getattr(self, self.xmlrpc_methods[name]) else: # use method name as usual m = getattr(self, name) # GET THE BOUND METHOD val = m(*args) # CALL THE METHOD sys.stderr.flush() # FLUSH ANY OUTPUT TO OUR LOG return val # HAND BACK ITS RETURN VALUE except SystemExit: raise # WE REALLY DO WANT TO EXIT. except: # METHOD RAISED AN EXCEPTION, SO PRINT TRACEBACK TO STDERR traceback.print_exc(self.max_tb, sys.stderr) else: print >>sys.stderr, "safe_dispatch: blocked unregistered method %s" \ % name return False # THIS RETURN VALUE IS CONFORMABLE BY XMLRPC... class ObjectFromString(list): """convenience class for initialization from string of format: val1,val2,foo=12,bar=39,sshopts=-1 -p 1234 Args of format name=val are saved on the object as attributes; otherwise each arg is saved as a list. Argument type conversion is performed automatically if attrtype mapping provided either to constructor or by the class itself. Numeric keys in this mapping are applied to the corresponding list arguments; string keys in this mapping are applied to the corresponding attribute arguments. Both the argument separator and assignment separator can be customized.""" _separator = ',' _eq_separator = '=' def __init__(self, s, separator=None, eq_separator=None): list.__init__(self) if separator is None: separator = self._separator if eq_separator is None: eq_separator = self._eq_separator args = s.split(separator) i = 0 for arg in args: try: # PROCESS attr=val ARGUMENT FORMAT k, v = arg.split(eq_separator) try: # SEE IF WE HAVE A TYPE FOR THIS ATTRIBUTE v = self._attrtype[k](v) except (AttributeError, KeyError): pass # IF NO CONVERSION, JUST USE THE ORIGINAL STRING setattr(self, k, v) # SAVE VALUE AS ATTRIBUTE except ValueError: # JUST A SIMPLE ARGUMENT, SO SAVE AS ARG LIST try: # SEE IF WE HAVE A TYPE FOR THIS LIST ITEM arg = self._attrtype[i](arg) except (AttributeError, KeyError): pass # IF NO CONVERSION, JUST USE THE ORIGINAL STRING self.append(arg) i += 1 # ADVANCE OUR ARGUMENT COUNT class FileDict(dict): """read key,value pairs as WS-separated lines, with objclass(value) conversion""" def __init__(self, filename, objclass=str): dict.__init__(self) f = file(filename, 'rU') # text file for line in f: key = line.split()[0] # GET THE 1ST ARGUMENT # Get the rest, strip the outer whitespace. val = line[len(key):].lstrip().rstrip() self[key] = objclass(val) # APPLY THE DESIRED TYPE CONVERSION f.close() def detach_as_demon_process(self): "standard UNIX technique c/o Jurgen Hermann's Python Cookbook recipe" # CREATE AN APPROPRIATE ERRORLOG FILEPATH if not hasattr(self, 'errlog') or self.errlog is False: self.errlog = os.path.join(os.getcwd(), self.name + '.log') pid = os.fork() if pid: return pid os.setsid() # CREATE A NEW SESSION WITH NO CONTROLLING TERMINAL os.umask(0) # IS THIS ABSOLUTELY NECESSARY? sys.stdout = file(self.errlog, 'a') # Daemon sends all output to log file. sys.stderr = sys.stdout return 0 def serve_forever(self): 'start the service -- this will run forever' import datetime print >>sys.stderr, "START_SERVER:%s %s" % (self.name, datetime.datetime. now().isoformat(' ')) sys.stderr.flush() self.server.serve_forever() class CoordinatorInfo(object): """stores information about individual coordinators for the controller and provides interface to Coordinator that protects against possibility of deadlock.""" min_startup_time = 60.0 def __init__(self, name, url, user, priority, resources, job_id=0, immediate=False, demand_ncpu=0): self.name = name self.url = url self.user = user self.priority = priority self.job_id = job_id self.immediate = immediate self.server = xmlrpclib.ServerProxy(url) self.processors = {} self.resources = resources self.start_time = time.time() self.demand_ncpu = demand_ncpu # Set to non-zero for fixed #CPUs. self.allocated_ncpu = 0 self.new_cpus = [] self.last_start_proc_time = 0.0 def __iadd__(self, newproc): "add a processor to this coordinator's list" self.processors[newproc] = time.time() return self def __isub__(self, oldproc): "remove a processor from this coordinator's list" del self.processors[oldproc] return self def update_load(self): """tell this coordinator to use only allocated_ncpu processors, and to launch processors on the list of new_cpus. Simply spawns a thread to do this without danger of deadlock""" import threading t = threading.Thread(target=self.update_load_thread, args=(self.allocated_ncpu, self.new_cpus)) self.new_cpus = [] # DISCONNECT FROM OLD LIST TO PREVENT OVERWRITING t.start() def update_load_thread(self, ncpu, new_cpus): """tell this coordinator to use only ncpu processors, and to launch processors on the list of new_cpus. Run this in a separate thread to prevent deadlock.""" self.server.set_max_clients(ncpu) if len(new_cpus) > 0 and \ time.time() - self.last_start_proc_time > self.min_startup_time: self.server.start_processors(new_cpus) # SEND OUR LIST self.last_start_proc_time = time.time() class HostInfo(ObjectFromString): _attrtype = {'maxload': float} class XMLRPCServerBase(object): 'Base class for creating an XMLRPC server for multiple objects' xmlrpc_methods = {'methodCall': 0, 'objectList': 0, 'objectInfo': 0} max_tb = 10 _dispatch = safe_dispatch # RESTRICT XMLRPC TO JUST THE METHODS LISTED HERE def __init__(self, name, host='', port=5000, logRequests=False, server=None): self.host = host self.name = name if server is not None: self.server = server self.port = port else: self.server, self.port = get_server(host, port, logRequests) self.server.register_instance(self) self.objDict = {} def __setitem__(self, name, obj): 'add a new object to serve' self.objDict[name] = obj def __delitem__(self, name): del self.objDict[name] def objectList(self): 'get list of named objects in this server: [(name,methodDict),...]' return [(name, obj.xmlrpc_methods) for (name, obj) in self.objDict.items()] def objectInfo(self, objname): 'get dict of methodnames on the named object' try: return self.objDict[objname].xmlrpc_methods except KeyError: return 'error: server has no object named %s' % objname def methodCall(self, objname, methodname, args): 'run the named method on the named object and return its result' try: obj = self.objDict[objname] if methodname in obj.xmlrpc_methods: m = getattr(obj, methodname) else: print >>sys.stderr, \ "methodCall: blocked unregistered method %s" % methodname return '' except (KeyError, AttributeError): return '' # RETURN FAILURE CODE return m(*args) # RUN THE OBJECT METHOD def serve_forever(self, demonize=None, daemonize=False): 'launch the XMLRPC service. if daemonize=True, detach & exit.' if demonize is not None: logging.warning("demonize is a deprecated argument to \ serve_forever; use 'daemonize' instead!") daemonize = demonize print 'Serving on interface "%s", port %d' % (self.host, self.port, ) if daemonize: print "detaching to run as a daemon." pid = detach_as_demon_process(self) if pid: print 'PID', pid sys.exit(0) serve_forever(self) def serve_in_thread(self): thread.start_new_thread(serve_forever, (self, )) def register(self, url=None, name='index', server=None): 'register our server with the designated index server' data=self.registrationData # RAISE ERROR IF NO DATA TO REGISTER... if server is None and url is not None: # Use the URL to get the index server. server = get_connection(url, name) if server is not None: server.registerServer('%s:%d' % (self.host, self.port), data) else: # DEFAULT: SEARCH WORLDBASEPATH TO FIND INDEX SERVER from pygr import worldbase worldbase._mdb.registerServer('%s:%d' % (self.host, self.port), data) class ResourceController(object): """Centralized controller for getting resources and rules for making them. """ xmlrpc_methods = {'load_balance': 0, 'setrule': 0, 'delrule': 0, 'report_load': 0, 'register_coordinator': 0, 'unregister_coordinator': 0, 'register_processor': 0, 'unregister_processor': 0, 'get_resource': 0, 'acquire_rule': 0, 'release_rule': 0, 'request_cpus': 0, 'retry_unused_hosts': 0, 'get_status': 0, 'setthrottle': 0, 'del_lock': 0, 'get_hostinfo': 0, 'set_hostinfo': 0} _dispatch = safe_dispatch # RESTRICT XMLRPC TO JUST THE METHODS LISTED HERE max_tb = 10 def __init__(self, rc='controller', port=5000, overload_margin=0.6, rebalance_frequency=1200, errlog=False, throttle=1.0): self.name = rc self.overload_margin = overload_margin self.rebalance_frequency = rebalance_frequency self.errlog = errlog self.throttle = throttle self.rebalance_time = time.time() self.must_rebalance = False self.host = get_hostname() self.hosts = FileDict(self.name + '.hosts', HostInfo) self.getrules() self.getresources() self.server, self.port = get_server(self.host, port) self.server.register_instance(self) self.coordinators = {} self.njob = 0 self.locks = {} self.systemLoad = {} hostlist=[host for host in self.hosts] for host in hostlist: # 1ST ASSUME HOST EMPTY, THEN GET LOAD REPORTS hostFQDN = get_hostname(host) # CONVERT ALL HOSTNAMES TO FQDNs if hostFQDN != host: # USE FQDN FOR ALL SUBSEQUENT REFS! self.hosts[hostFQDN] = self.hosts[host] del self.hosts[host] self.systemLoad[hostFQDN] = 0.0 __call__ = serve_forever def assign_load(self): "calculate the latest balanced loads" maxload = 0. total = 0. current_job = 99999999 for c in self.coordinators.values(): if c.priority > 0.0 and c.job_id < current_job: current_job = c.job_id # FIND 1ST NON-ZER0 PRIORITY JOB for c in self.coordinators.values(): if c.demand_ncpu: # DEMANDS A FIXED #CPUS, NO LOAD BALANCING c.run = True elif c.job_id == current_job or c.immediate: c.run = True # YES, RUN THIS JOB total += c.priority else: c.run=False for v in self.hosts.values(): # SUM UP TOTAL CPUS maxload += v.maxload maxload *= self.throttle # APPLY OUR THROTTLE CONTROL for c in self.coordinators.values(): #REMOVE DEMANDED CPUS if c.demand_ncpu: maxload -= c.demand_ncpu if maxload < 0.: # DON'T ALLOW NEGATIVE VALUES maxload = 0. if total > 0.: # DON'T DIVIDE BY ZERO... maxload /= float(total) for c in self.coordinators.values(): # ALLOCATE SHARE OF TOTAL CPUS... if c.demand_ncpu: # ALLOCATE EXACTLY THE NUMBER REQUESTED c.allocated_ncpu = int(c.demand_ncpu) elif c.run: # COMPUTE BASED ON PRIORITY SHARE c.allocated_ncpu = int(maxload * c.priority) else: # NOT RUNNING c.allocated_ncpu = 0 return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def assign_processors(self): "hand out available processors to coordinators in order of need" margin = self.overload_margin - 1.0 free_cpus = [] nproc = {} for c in self.coordinators.values(): # COUNT NUMBER OF PROCS for host, pid in c.processors: # RUNNING ON EACH HOST try: nproc[host] += 1.0 # INCREMENT AN EXISTING COUNT except KeyError: nproc[host] = 1.0 # NEW, SO SET INITIAL COUNT for host in self.hosts: # BUILD LIST OF HOST CPUS TO BE ASSIGNED if host not in self.systemLoad: # ADDING A NEW HOST self.systemLoad[host] = 0.0 # DEFAULT LOAD: ASSUME HOST EMPTY try: # host MAY NOT BE IN nproc, SO CATCH THAT ERROR if self.systemLoad[host] > nproc[host]: raise KeyError # USE self.systemLoad[host] except KeyError: load = self.systemLoad[host] # MAXIMUM VALUE else: load = nproc[host] # MAXIMUM VALUE if load < self.hosts[host].maxload + margin: free_cpus += int(self.hosts[host].maxload + self.overload_margin - load) * [host] if len(free_cpus) == 0: # WE DON'T HAVE ANY CPUS TO GIVE OUT return False l = [] # BUILD A LIST OF HOW MANY CPUS EACH COORDINATOR NEEDS for c in self.coordinators.values(): ncpu = c.allocated_ncpu - len(c.processors) if ncpu > 0: l += ncpu*[c] # ADD c TO l EXACTLY ncpu TIMES import random random.shuffle(l) # REORDER LIST OF COORDINATORS RANDOMLY i = 0 # INDEX INTO OUR l LIST while i < len(free_cpus) and i < len(l): # Hand out free CPUs one by one. l[i].new_cpus.append(free_cpus[i]) i += 1 return i > 0 # RETURN TRUE IF WE HANDED OUT SOME PROCESSORS def load_balance(self): "recalculate load assignments, and assign free cpus" self.rebalance_time = time.time() # RESET OUR FLAGS self.must_rebalance = False # Calculate how many CPUs each coordinator should get. self.assign_load() # Assign free CPUs to coordinators which need them. self.assign_processors() for c in self.coordinators.values(): c.update_load() # INFORM THE COORDINATOR return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def get_hostinfo(self, host, attr): "get a host attribute" return getattr(self.hosts[host], attr) def set_hostinfo(self, host, attr, val): "increase or decrease the maximum load allowed on a given host" try: setattr(self.hosts[host], attr, val) except KeyError: self.hosts[host] = HostInfo('%s=%s' % (attr, str(val))) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def getrules(self): import shelve self.rules = dbfile.shelve_open(self.name + '.rules') def getresources(self): import shelve self.resources = dbfile.shelve_open(self.name + '.rsrc') def setrule(self, rsrc, rule): "save a resource generation rule into our database" self.rules[rsrc] = rule self.rules.close() # THIS IS THE ONLY WAY I KNOW TO FLUSH... self.getrules() return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def delrule(self, rsrc): "delete a resource generation rule from our database" try: del self.rules[rsrc] except KeyError: print >>sys.stderr, "Attempt to delete unknown resource rule %s" \ % rsrc else: self.rules.close() # THIS IS THE ONLY WAY I KNOW TO FLUSH... self.getrules() return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def setthrottle(self, throttle): "set the total level of usage of available CPUs, usually 1.0" self.throttle = float(throttle) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def report_load(self, host, pid, load): "save a reported load from one of our processors" self.systemLoad[host] = load # AT A REGULAR INTERVAL WE SHOULD REBALANCE LOAD if self.must_rebalance or \ time.time() - self.rebalance_time > self.rebalance_frequency: self.load_balance() if load < self.hosts[host].maxload + self.overload_margin: return True # OK TO CONTINUE else: return False # THIS SYSTEM OVERLOADED, TELL PROCESSOR TO EXIT def register_coordinator(self, name, url, user, priority, resources, immediate, demand_ncpu): "save a coordinator's registration info" try: print >>sys.stderr, 'change_priority: %s (%s,%s): %f -> %f' \ % (name, user, url, self.coordinators[url].priority, priority) self.coordinators[url].priority = priority self.coordinators[url].immediate = immediate self.coordinators[url].demand_ncpu = demand_ncpu except KeyError: print >>sys.stderr, 'register_coordinator: %s (%s,%s): %f' \ % (name, user, url, priority) self.coordinators[url] = CoordinatorInfo(name, url, user, priority, resources, self.njob, immediate, demand_ncpu) self.njob += 1 # INCREMENT COUNT OF JOBS WE'VE REGISTERED self.must_rebalance = True # FORCE REBALANCING ON NEXT OPPORTUNITY return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def unregister_coordinator(self, name, url, message): "remove a coordinator from our list" try: del self.coordinators[url] print >>sys.stderr, 'unregister_coordinator: %s (%s): %s' \ % (name, url, message) self.load_balance() # FORCE IT TO REBALANCE THE LOAD TO NEW JOBS... except KeyError: print >>sys.stderr, 'unregister_coordinator: %s unknown:%s (%s)' \ % (name, url, message) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def request_cpus(self, name, url): "return a list of hosts for this coordinator to run processors on" try: c = self.coordinators[url] except KeyError: print >>sys.stderr, 'request_cpus: unknown coordinator %s @ %s' \ % (name, url) return [] # HAND BACK AN EMPTY LIST # Calculate how many CPUs each coordinator should get. self.assign_load() # Assign free CPUs to coordinators which need them. self.assign_processors() new_cpus=tuple(c.new_cpus) # MAKE A NEW COPY OF THE LIST OF HOSTS del c.new_cpus[:] # EMPTY OUR LIST return new_cpus def register_processor(self, host, pid, url): "record a new processor starting up" try: self.coordinators[url] += (host, pid) self.systemLoad[host] += 1.0 # THIS PROBABLY INCREASES LOAD BY 1 except KeyError: pass return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def unregister_processor(self, host, pid, url): "processor shutting down, so remove it from the list" try: self.coordinators[url] -= (host, pid) self.systemLoad[host] -= 1.0 # THIS PROBABLY DECREASES LOAD BY 1 if self.systemLoad[host] < 0.0: self.systemLoad[host] = 0.0 for k, v in self.locks.items(): # MAKE SURE THIS PROC HAS NO LOCKS h = k.split(':')[0] if h == host and v == pid: del self.locks[k] # REMOVE ALL ITS PENDING LOCKS except KeyError: pass self.load_balance() # FREEING A PROCESSOR, SO REBALANCE TO USE THIS return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def get_resource(self, host, pid, rsrc): """return a filename for the resource, or False if rule must be applied, or True if client must wait to get the resource""" key = host + ':' + rsrc try: # JUST HAND BACK THE RESOURCE return self.resources[key] except KeyError: if key in self.locks: return True # TELL CLIENT TO WAIT else: return False # TELL CLIENT TO ACQUIRE IT VIA RULE def acquire_rule(self, host, pid, rsrc): """lock the resource on this specific host and return its production rule""" if rsrc not in self.rules: return False # TELL CLIENT NO SUCH RULE key = host + ':' + rsrc if key in self.locks: return True # TELL CLIENT TO WAIT # Lock this resource on this host until constructed. self.locks[key] = pid return self.rules[rsrc] # RETURN THE CONSTRUCTION RULE def release_rule(self, host, pid, rsrc): """client is done applying this rule, it is now safe to give out the resource""" key = host + ':' + rsrc self.del_lock(host, rsrc) # Add the file name to resource list. self.resources[key] = self.rules[rsrc][0] self.resources.close() # THIS IS THE ONLY WAY I KNOW TO FLUSH THIS... self.getresources() return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def del_lock(self, host, rsrc): "delete a lock on a pending resource construction process" key = host + ':' + rsrc try: del self.locks[key] # REMOVE THE LOCK except KeyError: print >> sys.stderr, "attempt to release non-existent lock \ %s,%s:%d" % (host, rule, pid) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def retry_unused_hosts(self): "reset systemLoad for hosts that have no jobs running" myhosts = {} for c in self.coordinators.values(): # LIST HOSTS WE'RE CURRENTLY USING for host, pid in c.processors: myhosts[host] = None # MARK THIS HOST AS IN USE for host in self.systemLoad: # RESET LOAD FOR ALL HOSTS WE'RE NOT USING if host not in myhosts: self.systemLoad[host] = 0.0 return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def get_status(self): """get report of system loads, max loads, coordinators, rules, resources, locks""" l = [(name, host.maxload) for name, host in self.hosts.items()] l.sort() return self.name, self.errlog, self.systemLoad, l, \ [(c.name, c.url, c.priority, c.allocated_ncpu, len(c.processors), c.start_time) for c in self.coordinators.values()], dict(self.rules), \ dict(self.resources), self.locks class AttrProxy(object): def __init__(self, getattr_proxy, k): self.getattr_proxy = getattr_proxy self.k = k def __getattr__(self, attr): try: val = self.getattr_proxy(self.k, attr) # GET IT FROM OUR PROXY except: raise AttributeError('unable to get proxy attr ' + attr) setattr(self, attr, val) # CACHE THIS ATTRIBUTE RIGHT HERE! return val class DictAttrProxy(dict): def __init__(self, getattr_proxy): dict.__init__(self) self.getattr_proxy = getattr_proxy def __getitem__(self, k): try: return dict.__getitem__(self, k) except KeyError: val = AttrProxy(self.getattr_proxy, k) self[k] = val return val class Coordinator(object): """Run our script as Processor on one or more client nodes, using XMLRPC communication between clients and server. On the server all output is logged to name.log, and successfully completed task IDs are stored in name.success, and error task IDs are stored in name.error On the clients all output is logged to the file name_#.log in the user's and/or system-specific temporary directory.""" xmlrpc_methods = {'start_processors': 0, 'register_client': 0, 'unregister_client': 0, 'report_success': 0, 'report_error': 0, 'next': 0, 'get_status': 0, 'set_max_clients': 0, 'stop_client': 0} _dispatch = safe_dispatch # RESTRICT XMLRPC TO JUST THE METHODS LISTED HERE max_tb = 10 # MAXIMUM #STACK LEVELS TO PRINT IN TRACEBACKS max_ssh_errors = 5 #MAXIMUM #ERRORS TO PERMIT IN A ROW BEFORE QUITTING python = 'python' # DEFAULT EXECUTABLE FOR RUNNING OUR CLIENTS def __init__(self, name, script, it, resources, port=8888, priority=1.0, rc_url=None, errlog=False, immediate=False, ncpu_limit=999999, demand_ncpu=0, max_initialization_errors=3, **kwargs): self.name = name self.script = script self.it = iter(it) # Make sure self.it is an iterator. self.resources = resources self.priority = priority self.errlog = errlog self.immediate = immediate self.ncpu_limit = ncpu_limit self.demand_ncpu = demand_ncpu self.max_initialization_errors = max_initialization_errors self.kwargs = kwargs self.host = get_hostname() self.user = os.environ['USER'] try: # Make sure ssh-agent is available before we launch # a lot of processes. a = os.environ['SSH_AGENT_PID'] except KeyError: raise OSError(1, 'SSH_AGENT_PID not found. No ssh-agent running?') self.dir = os.getcwd() self.n = 0 self.nsuccess = 0 self.nerrors = 0 self.nssh_errors = 0 self.iclient = 0 self.max_clients = 40 if rc_url is None: # Try the default resource-controller address on the same host. rc_url = 'http://%s:5000' % self.host self.rc_url = rc_url # Connect to the resource controller... self.rc_server = xmlrpclib.ServerProxy(rc_url) # ...create an XMLRPC server. self.server, self.port = get_server(self.host, port) # ...and provide it with all the methods. self.server.register_instance(self) self.clients = {} self.pending = {} self.already_done = {} self.stop_clients = {} self.logfile = {} self.clients_starting = {} self.clients_initializing = {} self.initialization_errors = {} try: # LOAD LIST OF IDs ALREADY SUCCESSFULLY PROCESSED, IF ANY f = file(name + '.success', 'rU') # text file for line in f: self.already_done[line.strip()] = None f.close() except IOError: # OK IF NO SUCCESS FILE YET, WE'LL CREATE ONE. pass # Success file is to be cumulative but overwrite the error file. self.successfile = file(name + '.success', 'a') self.errorfile = file(name + '.error', 'w') self.done = False self.hosts = DictAttrProxy(self.rc_server.get_hostinfo) self.register() def __call__(self, *l, **kwargs): "start the server, and launch a cpu request in a separate thread" import threading t = threading.Thread(target=self.initialize_thread) t.start() serve_forever(self, *l, **kwargs) def initialize_thread(self): """run this method in a separate thread to bootstrap our initial cpu request""" time.sleep(5) # GIVE serve_forever() TIME TO START SERVER # Now ask the controller to rebalance and give up CPUs. self.rc_server.load_balance() def start_client(self, host): "start a processor on a client node" import tempfile if len(self.clients) >= self.ncpu_limit: print >>sys.stderr, 'start_client: blocked, CPU limit', \ len(self.clients), self.ncpu_limit return # DON'T START ANOTHER PROCESS, TOO MANY ALREADY if len(self.clients) >= self.max_clients: print >>sys.stderr, 'start_client: blocked, too many already', \ len(self.clients), self.max_clients return # DON'T START ANOTHER PROCESS, TOO MANY ALREADY try: if len(self.clients_starting[host]) >= self.max_ssh_errors: print >>sys.stderr, \ 'start_client: blocked, too many unstarted jobs:', \ host, self.clients_starting[host] return # DON'T START ANOTHER PROCESS, host MAY BE DEAD... except KeyError: # NO clients_starting ON host, GOOD! pass try: if len(self.initialization_errors[host]) >= \ self.max_initialization_errors: print >>sys.stderr, 'start_client: blocked, too many \ initialization errors:', host, \ self.initialization_errors[host] return # DON'T START ANOTHER PROCESS, host HAS A PROBLEM except KeyError: # NO initialization_errors ON host, GOOD! pass try: sshopts = self.hosts[host].sshopts # GET sshopts VIA XMLRPC except AttributeError: sshopts = '' logfile = os.path.join(tempfile.gettempdir(), '%s_%d.log' \ % (self.name, self.iclient)) # PASS OUR KWARGS ON TO THE CLIENT PROCESSOR kwargs = ' '.join(['--%s=%s' % (k, v) for k, v in self.kwargs.items()]) cmd = 'cd %s;%s %s --url=http://%s:%d --rc_url=%s --logfile=%s %s %s' \ % (self.dir, self.python, self.script, self.host, self.port, self.rc_url, logfile, self.name, kwargs) # UGH, HAVE TO MIX CSH REDIRECTION (REMOTE) WITH SH REDIRECTION (LOCAL) ssh_cmd = "ssh %s %s '(%s) &%s &' >%s 2>&1 &" \ % (sshopts, host, cmd, logfile, self.errlog) print >>sys.stderr, 'SSH: ' + ssh_cmd self.logfile[logfile] = [host, False, self.iclient] # NO PID YET try: # RECORD THIS CLIENT AS STARTING UP self.clients_starting[host][self.iclient] = time.time() except KeyError: # CREATE A NEW HOST ENTRY self.clients_starting[host] = {self.iclient: time.time()} # RUN SSH IN BACKGROUND TO AVOID WAITING FOR IT TO TIMEOUT!!! os.system(ssh_cmd) # LAUNCH THE SSH PROCESS, SHOULD RETURN IMMEDIATELY self.iclient += 1 # ADVANCE OUR CLIENT COUNTER def start_processors(self, hosts): "start processors on the list of hosts using SSH transport" for host in hosts: # LAUNCH OURSELVES AS PROCESSOR ON ALL THESE HOSTS self.start_client(host) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def register(self): "register our existence with the resource controller" url = 'http://%s:%d' % (self.host, self.port) self.rc_server.register_coordinator(self.name, url, self.user, self.priority, self.resources, self.immediate, self.demand_ncpu) def unregister(self, message): "tell the resource controller we're exiting" url = 'http://%s:%d' % (self.host, self.port) self.rc_server.unregister_coordinator(self.name, url, message) def register_client(self, host, pid, logfile): 'XMLRPC call to register client hostname and PID as starting_up' print >>sys.stderr, 'register_client: %s:%d' % (host, pid) self.clients[(host, pid)] = 0 try: self.logfile[logfile][1] = pid # SAVE OUR PID iclient = self.logfile[logfile][2] # GET ITS CLIENT ID del self.clients_starting[host][iclient] #REMOVE FROM STARTUP LIST except KeyError: print >>sys.stderr, 'no client logfile?', host, pid, logfile self.clients_initializing[(host, pid)] = logfile return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def unregister_client(self, host, pid, message): 'XMLRPC call to remove client from register as exiting' print >>sys.stderr, 'unregister_client: %s:%d %s' \ % (host, pid, message) try: del self.clients[(host, pid)] except KeyError: print >>sys.stderr, 'unregister_client: unknown client %s:%d' \ % (host, pid) try: # REMOVE IT FROM THE LIST OF CLIENTS TO SHUTDOWN, IF PRESENT del self.stop_clients[(host, pid)] except KeyError: pass try: # REMOVE FROM INITIALIZATION LIST del self.clients_initializing[(host, pid)] except KeyError: pass if len(self.clients) == 0 and self.done: # No more tasks or clients, the server can exit. self.exit("Done") return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def report_success(self, host, pid, success_id): 'mark task as successfully completed' # Keep permanent record of success ID. print >>self.successfile, success_id self.successfile.flush() self.nsuccess += 1 try: self.clients[(host, pid)] += 1 except KeyError: print >>sys.stderr, 'report_success: unknown client %s:%d' \ % (host, pid) try: del self.pending[success_id] except KeyError: print >>sys.stderr, 'report_success: unknown ID %s' \ % str(success_id) return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def report_error(self, host, pid, id, tb_report): "get traceback report from client as text" print >>sys.stderr, "TRACEBACK: %s:%s ID %s\n%s" % \ (host, str(pid), str(id), tb_report) if (host, pid) in self.clients_initializing: logfile = self.clients_initializing[(host, pid)] try: self.initialization_errors[host].append(logfile) except KeyError: self.initialization_errors[host] = [logfile] try: del self.pending[id] except KeyError: # Not associated with an actual task ID, do not record. if id is not None and id is not False: print >>sys.stderr, 'report_error: unknown ID %s' % str(id) else: print >>self.errorfile, id # KEEP PERMANENT RECORD OF FAILURE ID self.nerrors += 1 self.errorfile.flush() return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def next(self, host, pid, success_id): 'return next ID from iterator to the XMLRPC caller' if (host, pid) not in self.clients: print >>sys.stderr, 'next: unknown client %s:%d' % (host, pid) return False # HAND BACK "NO MORE FOR YOU TO DO" SIGNAL try: # INITIALIZATION DONE, SO REMOVE FROM INITIALIZATION LIST del self.clients_initializing[(host, pid)] except KeyError: pass if success_id is not False: self.report_success(host, pid, success_id) if self.done: # EXHAUSTED OUR ITERATOR, SO SHUT DOWN THIS CLIENT return False # HAND BACK "NO MORE FOR YOU TO DO" SIGNAL try: # CHECK LIST FOR COMMAND TO SHUT DOWN THIS CLIENT del self.stop_clients[(host, pid)] # IS IT IN stop_clients? return False # IF SO, HAND BACK "NO MORE FOR YOU TO DO" SIGNAL except KeyError: # DO ONE MORE CHECK: ARE WE OVER OUR MAX ALLOWED LOAD? if len(self.clients) > self.max_clients: # Yes, better throttle down. print >>sys.stderr, 'next: halting %s:too many processors \ (%d>%d)' % (host, len(self.clients), self.max_clients) return False # HAND BACK "NO MORE FOR YOU TO DO" SIGNAL for id in self.it: # GET AN ID WE CAN USE if str(id) not in self.already_done: self.n += 1 # GREAT, WE CAN USE THIS ID self.lastID = id self.pending[id] = (host, pid, time.time()) print >>sys.stderr, 'giving id %s to %s:%d' % (str(id), host, pid) return id print >>sys.stderr, 'exhausted all items from iterator!' self.done = True # EXHAUSTED OUR ITERATOR # Release our claims on any further processor allication # and inform the resource controller about it. self.priority = 0.0 self.register() return False # False IS CONFORMABLE BY XMLRPC... def get_status(self): "return basic status info on number of jobs finished, client list etc." client_report = [client + (nsuccess, ) for client, nsuccess in self.clients.items()] pending_report = [(k, ) + v for k, v in self.pending.items()] return self.name, self.errlog, self.n, self.nsuccess, self.nerrors, \ client_report, pending_report, self.logfile def set_max_clients(self, n): "change the maximum number of clients we should have running" self.max_clients = int(n) # MAKE SURE n IS CONVERTABLE TO int return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def stop_client(self, host, pid): "set signal forcing this client to exit on next iteration" self.stop_clients[(host, pid)] = None return True # USE THIS AS DEFAULT XMLRPC RETURN VALUE def exit(self, message): "clean up and close this server" self.unregister(message) self.successfile.close() self.errorfile.close() sys.exit() try: class ResourceFile(file): """wrapper around some locking behavior, to ensure only one copy operation performed for a given resource on a given host. Otherwise, it's just a regular file object.""" def __init__(self, resource, rule, mode, processor): "resource is name of the resource; rule is (localFile, cpCommand)" self.resource = resource self.processor = processor localFile, cpCommand = rule if not os.access(localFile, os.R_OK): cmd = cpCommand % localFile print 'copying data:', cmd os.system(cmd) # Now, initialise as a real file object. file.__init__(self, localFile, mode) def close(self): # Release the lock we placed on this rule. self.processor.release_rule(self.resource) file.close(self) except TypeError: pass class Processor(object): 'provides an iterator interface to an XMLRPC ID server' max_errors_in_a_row = 10 # LOOKS LIKE NOTHING WORKS HERE, SO QUIT! max_tb = 10 # DON'T SHOW MORE THAN 10 STACK LEVELS FOR A TRACEBACK report_frequency = 600 overload_max = 5 # Max number of overload events in a row before we exit. def __init__(self, url = "http://localhost:8888", rc_url = 'http://localhost:5000', logfile=False, **kwargs): self.url = url self.logfile = logfile self.server = xmlrpclib.ServerProxy(url) self.rc_url = rc_url self.rc_server = xmlrpclib.ServerProxy(rc_url) self.host = get_hostname() self.pid = os.getpid() self.user = os.environ['USER'] self.success_id = False self.pending_id = False self.exit_message = 'MYSTERY-EXIT please debug' self.overload_count = 0 def register(self): "add ourselves to list of processors for this server" self.server.register_client(self.host, self.pid, self.logfile) self.rc_server.register_processor(self.host, self.pid, self.url) print >>sys.stderr, 'REGISTERED:', self.url, self.rc_url def unregister(self, message): "remove ourselves from list of processors for this server" if self.success_id is not False: # REPORT THAT LAST JOB SUCCEEDED! self.report_success(self.success_id) self.server.unregister_client(self.host, self.pid, message) self.rc_server.unregister_processor(self.host, self.pid, self.url) print >>sys.stderr, 'UNREGISTERED:', self.url, self.rc_url, message def __iter__(self): return self def next(self): "get next ID from server" # REPORT LAST JOB SUCCESSFULLY COMPLETED, IF ANY while 1: id = self.server.next(self.host, self.pid, self.success_id) self.success_id = False # ERASE SUCCESS ID if id is True: # WE'RE BEING TOLD TO JUST WAIT time.sleep(60) # SO GO TO SLEEP FOR A MINUTE else: break if id is False: # NO MODE id FOR US TO PROCESS, SO QUIT self.serverStopIteration = True # RECORD THIS AS GENUINE END EVENT raise StopIteration else: # HAND BACK THE id TO THE USER self.pending_id = id return id def report_success(self, id): "report successful completion of task ID" self.server.report_success(self.host, self.pid, id) def report_error(self, id): "report an error using traceback.print_exc()" import StringIO err_report = StringIO.StringIO() traceback.print_exc(self.max_tb, sys.stderr) #REPORT TB TO OUR LOG traceback.print_exc(self.max_tb, err_report) #REPORT TB TO SERVER self.server.report_error(self.host, self.pid, id, err_report.getvalue()) err_report.close() def report_load(self): "report system load" load = os.getloadavg()[0] # GET 1 MINUTE LOAD AVERAGE if self.rc_server.report_load(self.host, self.pid, load) is False: # Are we consistently overloaded for an extended time period? self.overload_count += 1 if self.overload_count > self.overload_max: # Limit exceeded, exit. self.exit('load too high') else: self.overload_count = 0 def open_resource(self, resource, mode): "get a file object for the requested resource, opened in mode" while 1: rule = self.rc_server.get_resource(self.host, self.pid, resource) if rule is False: # WE HAVE TO LOCK AND APPLY A RULE... rule = self.acquire_rule(resource) if rule is True: # Looks like a race condition, wait a minute before # trying again. time.sleep(60) continue # Construct the resource. return ResourceFile(resource, rule, mode, self) elif rule is True: # Rule is locked by another processor, wait a minute before # trying again. time.sleep(60) else: # GOT A REGULAR FILE, SO JUST OPEN IT return file(rule, mode) def acquire_rule(self, resource): """lock the specified resource rule for this host so that it's safe to build it""" rule = self.rc_server.acquire_rule(self.host, self.pid, resource) if rule is False: # NO SUCH RESOURCE?!? self.exit('invalid resource: ' + resource) return rule def release_rule(self, resource): "release our lock on this resource rule, so others can use it" self.rc_server.release_rule(self.host, self.pid, resource) def exit(self, message): "save message for self.unregister() and force exit" self.exit_message = message raise SystemExit def run_all(self, resultGenerator, **kwargs): "run until all task IDs completed, trap & report all errors" errors_in_a_row = 0 it = resultGenerator(self, **kwargs) # GET ITERATOR FROM GENERATOR report_time = time.time() self.register() # REGISTER WITH RESOURCE CONTROLLER & COORDINATOR initializationError = None try: # TRAP ERRORS BOTH IN USER CODE AND coordinator CODE while 1: try: # TRAP AND REPORT ALL ERRORS IN USER CODE id = it.next() # THIS RUNS USER CODE FOR ONE ITERATION self.success_id = id # MARK THIS AS A SUCCESS... errors_in_a_row = 0 initializationError = False except StopIteration: # NO MORE TASKS FOR US... if not hasattr(self, 'serverStopIteration'): # Weird! # USER CODE RAISED StopIteration?!? self.report_error(self.pending_id) # REPORT THE PROBLEM self.exit_message = 'user StopIteration error' elif initializationError: self.exit_message = 'initialization error' else: self.exit_message = 'done' break except SystemExit: # sys.exit() CALLED raise # WE REALLY DO WANT TO EXIT. except: # MUST HAVE BEEN AN ERROR IN THE USER CODE if initializationError is None: # STILL IN INITIALIZATION initializationError=True self.report_error(self.pending_id) # REPORT THE PROBLEM errors_in_a_row +=1 if errors_in_a_row>=self.max_errors_in_a_row: self.exit_message='too many errors' break if time.time()-report_time>self.report_frequency: self.report_load() # SEND A ROUTINE LOAD REPORT report_time=time.time() except SystemExit: # sys.exit() CALLED pass # WE REALLY DO WANT TO EXIT. except: # IMPORTANT TO TRAP ALL ERRORS SO THAT WE UNREGISTER!! traceback.print_exc(self.max_tb, sys.stderr) #REPORT TB TO OUR LOG self.exit_message='error trap' self.unregister('run_all '+self.exit_message) # MUST UNREGISTER!! def run_interactive(self, it, n=1, **kwargs): "run n task IDs, with no error trapping" if not hasattr(it, 'next'): # Assume 'it' is a generator, use it to get an iterator. it = it(self, **kwargs) i=0 self.register() # REGISTER WITH RESOURCE CONTROLLER & COORDINATOR try: # EVEN IF ERROR OCCURS, WE MUST UNREGISTER!! for id in it: self.success_id=id i+=1 if i>=n: break except: self.unregister('run_interactive error') # MUST UNREGISTER!!! raise # SHOW THE ERROR INTERACTIVELY self.unregister('run_interactive exit') return it # HAND BACK ITERATOR IN CASE USER WANTS TO RUN MORE... def parse_argv(): """parse sys.argv into a dictionary of GNU-style args (--foo=bar) and a list of other args""" d = {} l = [] for v in sys.argv[1:]: if v[:2] == '--': try: k, v = v[2:].split('=') d[k] = v except ValueError: d[v[2:]] = None else: l.append(v) return d, l def start_client_or_server(clientGenerator, serverGenerator, resources, script): """start controller, client or server depending on whether we get coordinator argument from the command-line args. Client must be a generator function that takes Processor as argument, and uses it as an iterator. Also, clientGenerator must yield the IDs that the Processor provides (this structure allows us to trap all exceptions from clientGenerator, while allowing it to do resource initializations that would be much less elegant in a callback function.) Server must be a function that returns an iterator (e.g. a generator). Resources is a list of strings naming the resources we need copied to local host for client to be able to do its work. Both client and server constructors use **kwargs to get command line arguments (passed as GNU-style --foo=bar; see the constructor arguments to see the list of options that each can be passed. #CALL LIKE THIS FROM yourscript.py: import coordinator if __name__ == '__main__': coordinator.start_client_or_server(clientGen, serverGen, resources,__file__) To start the resource controller: python coordinator.py --rc=NAME [options] To start a job coordinator: python yourscript.py NAME [--rc_url=URL] [options] To start a job processor: python yourscript.py --url=URL --rc_url=URL [options]""" d, l = parse_argv() if 'url' in d: # WE ARE A CLIENT! client = Processor(**d) time.sleep(5) # GIVE THE SERVER SOME BREATHING SPACE client.run_all(clientGenerator, **d) elif 'rc' in d: # WE ARE THE RESOURCE CONTROLLER rc_server = ResourceController(**d) # NAME FOR THIS CONTROLLER... detach_as_demon_process(rc_server) rc_server() # START THE SERVER else: # WE ARE A SERVER try: # PASS OUR KWARGS TO THE SERVER FUNCTION it = serverGenerator(**d) except TypeError: # DOESN'T WANT ANY ARGS? it = serverGenerator() server = Coordinator(l[0], script, it, resources, **d) detach_as_demon_process(server) server() # START THE SERVER class CoordinatorMonitor(object): "Monitor a Coordinator." def __init__(self, coordInfo): self.name, self.url, self.priority, self.allocated_ncpu, \ self.ncpu, self.start_time = coordInfo self.server = xmlrpclib.ServerProxy(self.url) self.get_status() def get_status(self): self.name, self.errlog, self.n, self.nsuccess, self.nerrors, \ self.client_report, self.pending_report, \ self.logfile = self.server.get_status() print "Got status from Coordinator: ", self.name, self.url def __getattr__(self, attr): "just pass on method requests to our server" return getattr(self.server, attr) class RCMonitor(object): """monitor a ResourceController. Useful methods: get_status() load_balance() setrule(rsrc,rule) delrule(rsrc) setload(host,maxload) retry_unused_hosts() Documented in ResourceController docstrings.""" def __init__(self, host=None, port=5000): host = get_hostname(host) # GET FQDN self.rc_url = 'http://%s:%d' % (host, port) self.rc_server = xmlrpclib.ServerProxy(self.rc_url) self.get_status() def get_status(self): self.name, self.errlog, self.systemLoad, self.hosts, \ coordinators, self.rules, self.resources, \ self.locks = self.rc_server.get_status() print "Got status from ResourceController:", self.name, self.rc_url self.coordinators = {} for cinfo in coordinators: try: # IF COORDINATOR HAS DIED, STILL WANT TO RETURN RCMonitor... self.coordinators[cinfo[0]] = CoordinatorMonitor(cinfo) except socket.error, e: # JUST COMPLAIN, BUT CONTINUE... print >>sys.stderr, "Unable to connect to coordinator:", \ cinfo, e def __getattr__(self, attr): "just pass on method requests to our rc_server" return getattr(self.rc_server, attr) def test_client(server, **kwargs): for id in server: print 'ID', id yield id time.sleep(1) def test_server(): return range(1000) if __name__ == '__main__': start_client_or_server(test_client, test_server, [], __file__) PKðŠ’;È{棧ý§ýpygr/coordinator.pyc;ò |†Kc@smdklZdkZdkZdkZdkZdkZdkZdklZdk Z dk Z dk Z e d„Z ed„Zdefd„ƒYZdefd„ƒYZd efd „ƒYZeƒZd „Zd efd „ƒYZdefd„ƒYZd„Zd„Zdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZ defd„ƒYZ!defd„ƒYZ"yd e#fd!„ƒYZ$Wne%j onXd"efd#„ƒYZ&d$„Z'd%„Z(d&efd'„ƒYZ)d(efd)„ƒYZ*d*„Z+d+„Z,e-d,joe(e+e,ge.ƒndS(-(s generatorsN(sSimpleXMLRPCServercCsS|tjotiƒ}nyti|ƒdSWntij o |SnXdS(s3get FQDN for host, or current host if not specifiediN(shostsNonessockets gethostnames gethostbyaddrsherror(shost((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_hostnames cCsa|tjo d}nt||fd|ƒ}|iiƒd}ti d|ƒ||fSdS(s©Start xmlrpc server on requested host:port. Return bound SimpleXMLRPCServer server obj and port it's bound to. Set port=0 to bind to a random port number. s localhosts logRequestsis#Running XMLRPC server on port %d...N( shostsNonesSimpleXMLRPCServersports logRequestssserverssockets getsocknamesloggingsinfo(shostsports logRequestssserver((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_servers  sXMLRPCClientObjectcBstZdZd„ZRS(sXprovides object proxy for remote object, with methods that mirror its xmlrpc_methodscCsn||_||_dk}dtfd„ƒY}x6|D].}t|||i ||ƒ||i ƒƒq8WdS(Ns methodcallcBstZd„Zd„ZRS(NcCs ||_dS(N(snamesself(sselfsname((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__init__3scGs#|iii|i|i|ƒSdS(N(sobjsservers methodCallsnamesselfsargs(sselfsobjsargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__call__6s(s__name__s __module__s__init__s__call__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys methodcall1s ( snamesselfsserversnewsobjects methodcalls methodDicts methodNamessetattrsinstancemethods __class__(sselfsserversnames methodDicts methodNames methodcallsnew((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__init__,s    (s__name__s __module__s__doc__s__init__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysXMLRPCClientObject(s s XMLRPCClientcBs tZdZd„Zd„ZRS(s9interface to XMLRPC server serving multiple named objectscCsti|ƒ|_dS(N(s xmlrpclibs ServerProxysurlsselfsserver(sselfsurl((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__init__BscCsŒyti||ƒSWnqtj oe|ii|ƒ}dk}t ||i ƒot|ƒ‚nt |||ƒ}|||<|SnXdS(s)get connection to the named server objectN( sdicts __getitem__sselfsnamesKeyErrorsservers objectInfos methodDictstypess isinstances StringTypesXMLRPCClientObjectsv(sselfsnamesvs methodDictstypes((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys __getitem__Es  (s__name__s __module__s__doc__s__init__s __getitem__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys XMLRPCClient?s  sConnectionDictcBstZdZd„ZRS(sRensure that multiple requests for the same connection use the same ServerProxycCsFy||}Wn)tj ot|ƒ}|||run the named method on the named object and return its results*methodCall: blocked unregistered method %ssN( sselfsobjDictsobjnamesobjs methodnamesxmlrpc_methodssgetattrsmssyssstderrsKeyErrorsAttributeErrorsargs(sselfsobjnames methodnamesargssobjsm((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys methodCall-s  cCs„|tj otidƒ|}nd|i|ifGH|o6dGHt|ƒ}|odG|GHt i dƒqvnt |ƒdS(s=launch the XMLRPC service. if daemonize=True, detach & exit.shdemonize is a deprecated argument to serve_forever; use 'daemonize' instead!s"Serving on interface "%s", port %dsdetaching to run as a daemon.sPIDiN( sdemonizesNonesloggingswarnings daemonizesselfshostsportsdetach_as_demon_processspidssyssexits serve_forever(sselfsdemonizes daemonizespid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys serve_forever;s     cCstit|fƒdS(N(sthreadsstart_new_threads serve_foreversself(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysserve_in_threadMssindexcCs›|i}|tjo |tj ot||ƒ}n|tj o$|id|i |i f|ƒn1dk l }|i id|i |i f|ƒdS(s4register our server with the designated index servers%s:%d(s worldbaseN(sselfsregistrationDatasdatasserversNonesurlsget_connectionsnamesregisterServershostsportspygrs worldbases_mdb(sselfsurlsnamesservers worldbasesdata((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregisterPs  $ (s__name__s __module__s__doc__sxmlrpc_methodssmax_tbs safe_dispatchs _dispatchsFalsesNones__init__s __setitem__s __delitem__s objectLists objectInfos methodCalls serve_foreversserve_in_threadsregister(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysXMLRPCServerBases !      sResourceControllercBs©tZdZhdd<dd<dd<dd<dd<dd<dd<d d<d d<d d<d d<d d<dd<dd<dd<dd<dd<dd}|it|iƒ}|djo|||g7}q…q…Wdk}|i|ƒd}xM|t| ƒjo|t|ƒjo&||ii| |ƒ|d7}qæW|djSdS(s>hand out available processors to coordinators in order of needf1.0f0.0iNi(sselfsoverload_marginsmargins free_cpussnprocs coordinatorssvaluesscs processorsshostspidsKeyErrorshostss systemLoadsloadsmaxloadsintslensFalseslsallocated_ncpusncpusrandomsshufflesisnew_cpussappend( sselfsloadscsrandomspidslsncpusishosts free_cpussnprocsmargin((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysassign_processors­sP    4   &cCsXtiƒ|_t|_|iƒ|iƒx!|iiƒD]}|i ƒq<Wt SdS(s2recalculate load assignments, and assign free cpusN( stimesselfsrebalance_timesFalsesmust_rebalances assign_loadsassign_processorss coordinatorssvaluesscs update_loadsTrue(sselfsc((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys load_balanceÕs   cCst|i||ƒSdS(sget a host attributeN(sgetattrsselfshostsshostsattr(sselfshostsattr((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_hostinfoáscCs\yt|i|||ƒWn6tj o*td|t|ƒfƒ|i| %fs$register_coordinator: %s (%s,%s): %fiN(ssyssstderrsnamesusersurlsselfs coordinatorssprioritys immediates demand_ncpusKeyErrorsCoordinatorInfos resourcessnjobsTruesmust_rebalance(sselfsnamesurlsusersprioritys resourcess immediates demand_ncpu((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister_coordinators*  cCsjy2|i|=tid|||fIJ|iƒWn-tj o!tid|||fIJnXt SdS(s"remove a coordinator from our lists#unregister_coordinator: %s (%s): %ss*unregister_coordinator: %s unknown:%s (%s)N( sselfs coordinatorssurlssyssstderrsnamesmessages load_balancesKeyErrorsTrue(sselfsnamesurlsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysunregister_coordinator-s cCsty|i|}Wn.tj o"tid||fIJgSnX|iƒ|i ƒt |i ƒ}|i 2|SdS(s@return a list of hosts for this coordinator to run processors ons)request_cpus: unknown coordinator %s @ %sN( sselfs coordinatorssurlscsKeyErrorssyssstderrsnames assign_loadsassign_processorsstuplesnew_cpus(sselfsnamesurlscsnew_cpus((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys request_cpus9s   cCsNy0|i|c||f7<|i|cd7&%s &' >%s 2>&1 &sSSH: i()stempfileslensselfsclientss ncpu_limitssyssstderrs max_clientssclients_startingshostsmax_ssh_errorssKeyErrorsinitialization_errorssmax_initialization_errorsshostsssshoptssAttributeErrorsosspathsjoins gettempdirsnamesiclientslogfilesappends_[1]skwargssitemssksvsdirspythonsscriptsportsrc_urlscmdserrlogsssh_cmdsFalsestimessystem( sselfshosts_[1]scmdssshoptsstempfilesvsssh_cmdskwargsslogfilesk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys start_client!sH %%     +I:$ cCs&x|D]}|i|ƒqWtSdS(s9start processors on the list of hosts using SSH transportN(shostsshostsselfs start_clientsTrue(sselfshostsshost((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysstart_processorsUs cCsNd|i|if}|ii|i||i|i|i |i |i ƒdS(s3register our existence with the resource controllers http://%s:%dN( sselfshostsportsurls rc_serversregister_coordinatorsnamesusersprioritys resourcess immediates demand_ncpu(sselfsurl((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister[s  cCs3d|i|if}|ii|i||ƒdS(s*tell the resource controller we're exitings http://%s:%dN(sselfshostsportsurls rc_serversunregister_coordinatorsnamesmessage(sselfsmessagesurl((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys unregisterbscCs®tid||fIJd|i||fXMLRPC call to register client hostname and PID as starting_upsregister_client: %s:%diiisno client logfile?N( ssyssstderrshostspidsselfsclientsslogfilesiclientsclients_startingsKeyErrorsclients_initializingsTrue(sselfshostspidslogfilesiclient((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister_clientgs$cCsètid|||fIJy|i||f=Wn*tj otid||fIJnXy|i||f=Wntj onXy|i ||f=Wntj onXt |iƒdjo|i o|i dƒnt SdS(s5XMLRPC call to remove client from register as exitingsunregister_client: %s:%d %ss'unregister_client: unknown client %s:%disDoneN(ssyssstderrshostspidsmessagesselfsclientssKeyErrors stop_clientssclients_initializingslensdonesexitsTrue(sselfshostspidsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysunregister_clientts" cCs¶|i|IJ|iiƒ|id7_y|i||fcd7%d)isgiving id %s to %s:%ds"exhausted all items from iterator!f0.0N(shostspidsselfsclientsssyssstderrsFalsesclients_initializingsKeyErrors success_idsreport_successsdones stop_clientsslens max_clientssitsidsstrs already_donesnslastIDstimespendingsTruesprioritysregister(sselfshostspids success_idsid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysnext²s@  &         cCs¬gi}|iiƒD]\}}|||fƒq~}gi}|iiƒD]\}}||f|ƒqT~}|i |i |i|i|i|||ifSdS(sEreturn basic status info on number of jobs finished, client list etc.N(sappends_[1]sselfsclientssitemssclientsnsuccesss client_reportspendingsksvspending_reportsnameserrlogsnsnerrorsslogfile(sselfsvsclients_[1]s client_reportspending_reportsnsuccesssk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_statusØs==cCst|ƒ|_tSdS(s;change the maximum number of clients we should have runningN(sintsnsselfs max_clientssTrue(sselfsn((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysset_max_clientsàscCst|i||f   4       &   s ResourceFilecBs tZdZd„Zd„ZRS(s³wrapper around some locking behavior, to ensure only one copy operation performed for a given resource on a given host. Otherwise, it's just a regular file object.cCsp||_||_|\}}ti|tiƒ o$||}dG|GHti |ƒnt i |||ƒdS(s@resource is name of the resource; rule is (localFile, cpCommand)s copying data:N(sresourcesselfs processorsrules localFiles cpCommandsossaccesssR_OKscmdssystemsfiles__init__smode(sselfsresourcesrulesmodes processorscmds cpCommands localFile((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__init__ùs     cCs$|ii|iƒti|ƒdS(N(sselfs processors release_rulesresourcesfilesclose(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pyscloses(s__name__s __module__s__doc__s__init__sclose(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys ResourceFileôs  s ProcessorcBs°tZdZdZdZdZdZdded„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zdd„ZRS(s5provides an iterator interface to an XMLRPC ID serveri iXishttp://localhost:8888shttp://localhost:5000cKs’||_||_ti|ƒ|_||_ti|ƒ|_tƒ|_ t i ƒ|_ t i d|_t|_t|_d|_d|_dS(NsUSERsMYSTERY-EXIT please debugi(surlsselfslogfiles xmlrpclibs ServerProxysserversrc_urls rc_servers get_hostnameshostsossgetpidspidsenvironsusersFalses success_ids pending_ids exit_messagesoverload_count(sselfsurlsrc_urlslogfileskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__init__s       cCsa|ii|i|i|iƒ|ii|i|i|iƒt i dI|iI|i IJdS(s3add ourselves to list of processors for this servers REGISTERED:N( sselfsserversregister_clientshostspidslogfiles rc_serversregister_processorsurlssyssstderrsrc_url(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister#scCsˆ|itj o|i|iƒn|ii|i|i|ƒ|i i |i|i|i ƒt i dI|i I|iI|IJdS(s8remove ourselves from list of processors for this servers UNREGISTERED:N(sselfs success_idsFalsesreport_successsserversunregister_clientshostspidsmessages rc_serversunregister_processorsurlssyssstderrsrc_url(sselfsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys unregister)s cCs|SdS(N(sself(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__iter__1scCs‰xUnoM|ii|i|i|iƒ}t|_|tjot i dƒqPq W|tjot|_ t ‚n||_ |SdS(sget next ID from serverii<N(sselfsserversnextshostspids success_idsidsFalsesTruestimessleepsserverStopIterations StopIterations pending_id(sselfsid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysnext4s!      cCs |ii|i|i|ƒdS(s'report successful completion of task IDN(sselfsserversreport_successshostspidsid(sselfsid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysreport_successEscCsqdk}|iƒ}ti|itiƒti|i|ƒ|ii |i |i ||i ƒƒ|iƒdS(s+report an error using traceback.print_exc()N(sStringIOs err_reports tracebacks print_excsselfsmax_tbssyssstderrsservers report_errorshostspidsidsgetvaluesclose(sselfsids err_reportsStringIO((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys report_errorIs   cCsytiƒd}|ii|i|i|ƒtjo7|i d7_ |i |i jo|i dƒqun d|_ dS(sreport system loadiis load too highN( soss getloadavgsloadsselfs rc_servers report_loadshostspidsFalsesoverload_counts overload_maxsexit(sselfsload((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys report_loadSs%cCs°x©no¡|ii|i|i|ƒ}|tjoG|i|ƒ}|t jot i dƒq nt ||||ƒSq|t jot i dƒqt||ƒSq WdS(s<get a file object for the requested resource, opened in modeii<N(sselfs rc_servers get_resourceshostspidsresourcesrulesFalses acquire_rulesTruestimessleeps ResourceFilesmodesfile(sselfsresourcesmodesrule((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys open_resource_s    cCsH|ii|i|i|ƒ}|tjo|id|ƒn|SdS(sTlock the specified resource rule for this host so that it's safe to build itsinvalid resource: N( sselfs rc_servers acquire_ruleshostspidsresourcesrulesFalsesexit(sselfsresourcesrule((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys acquire_ruless  cCs |ii|i|i|ƒdS(s<release our lock on this resource rule, so others can use itN(sselfs rc_servers release_ruleshostspidsresource(sselfsresource((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys release_rule{scCs||_t‚dS(s1save message for self.unregister() and force exitN(smessagesselfs exit_messages SystemExit(sselfsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysexits cKs¼d}|||}tiƒ}|iƒt}y8x1no)y%|i ƒ}||_ d}t }WnÉtj oSt|dƒ o|i|iƒd|_n|o d|_n d|_Pnltj o ‚nW|tjo t}n|i|iƒ|d7}||ijod|_Pq/nXtiƒ||ijo|iƒtiƒ}q7q>WWn8tj on'ti|itiƒd|_nX|id |iƒd S( s:run until all task IDs completed, trap & report all errorsiisserverStopIterationsuser StopIteration errorsinitialization errorsdonestoo many errorss error trapsrun_all N(serrors_in_a_rowsresultGeneratorsselfskwargssitstimes report_timesregistersNonesinitializationErrorsnextsids success_idsFalses StopIterationshasattrs report_errors pending_ids exit_messages SystemExitsTruesmax_errors_in_a_rowsreport_frequencys report_loads tracebacks print_excsmax_tbssyssstderrs unregister(sselfsresultGeneratorskwargss report_timesitsidsinitializationErrorserrors_in_a_row((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysrun_all„sR               icKst|dƒ o|||}nd}|iƒy:x3|D]+}||_|d7}||joPq>q>WWn|i dƒ‚nX|i dƒ|SdS(s&run n task IDs, with no error trappingsnextiisrun_interactive errorsrun_interactive exitN( shasattrsitsselfskwargssisregistersids success_idsns unregister(sselfsitsnskwargssisid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysrun_interactive°s"       (s__name__s __module__s__doc__smax_errors_in_a_rowsmax_tbsreport_frequencys overload_maxsFalses__init__sregisters unregisters__iter__snextsreport_successs report_errors report_loads open_resources acquire_rules release_rulesexitsrun_allsrun_interactive(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys Processor s&           ,cCsŸh}g}x‚tidD]s}|d djoOy'|didƒ\}}|||run the named method on the named object and return its results*methodCall: blocked unregistered method %ssN( sselfsobjDictsobjnamesobjs methodnamesxmlrpc_methodssgetattrsmssyssstderrsKeyErrorsAttributeErrorsargs(sselfsobjnames methodnamesargssobjsm((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys methodCall-s  cCs„|tj otidƒ|}nd|i|ifGH|o6dGHt|ƒ}|odG|GHt i dƒqvnt |ƒdS(s=launch the XMLRPC service. if daemonize=True, detach & exit.shdemonize is a deprecated argument to serve_forever; use 'daemonize' instead!s"Serving on interface "%s", port %dsdetaching to run as a daemon.sPIDiN( sdemonizesNonesloggingswarnings daemonizesselfshostsportsdetach_as_demon_processspidssyssexits serve_forever(sselfsdemonizes daemonizespid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys serve_forever;s     cCstit|fƒdS(N(sthreadsstart_new_threads serve_foreversself(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysserve_in_threadMssindexcCs›|i}|tjo |tj ot||ƒ}n|tj o$|id|i |i f|ƒn1dk l }|i id|i |i f|ƒdS(s4register our server with the designated index servers%s:%d(s worldbaseN(sselfsregistrationDatasdatasserversNonesurlsget_connectionsnamesregisterServershostsportspygrs worldbases_mdb(sselfsurlsnamesservers worldbasesdata((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregisterPs  $ (s__name__s __module__s__doc__sxmlrpc_methodssmax_tbs safe_dispatchs _dispatchsFalsesNones__init__s __setitem__s __delitem__s objectLists objectInfos methodCalls serve_foreversserve_in_threadsregister(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysXMLRPCServerBases !      sResourceControllercBs©tZdZhdd<dd<dd<dd<dd<dd<dd<d d<d d<d d<d d<d d<dd<dd<dd<dd<dd<dd}|it|iƒ}|djo|||g7}q…q…Wdk}|i|ƒd}xM|t| ƒjo|t|ƒjo&||ii| |ƒ|d7}qæW|djSdS(s>hand out available processors to coordinators in order of needf1.0f0.0iNi(sselfsoverload_marginsmargins free_cpussnprocs coordinatorssvaluesscs processorsshostspidsKeyErrorshostss systemLoadsloadsmaxloadsintslensFalseslsallocated_ncpusncpusrandomsshufflesisnew_cpussappend( sselfsloadscsrandomspidslsncpusishosts free_cpussnprocsmargin((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysassign_processors­sP    4   &cCsXtiƒ|_t|_|iƒ|iƒx!|iiƒD]}|i ƒq<Wt SdS(s2recalculate load assignments, and assign free cpusN( stimesselfsrebalance_timesFalsesmust_rebalances assign_loadsassign_processorss coordinatorssvaluesscs update_loadsTrue(sselfsc((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys load_balanceÕs   cCst|i||ƒSdS(sget a host attributeN(sgetattrsselfshostsshostsattr(sselfshostsattr((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_hostinfoáscCs\yt|i|||ƒWn6tj o*td|t|ƒfƒ|i| %fs$register_coordinator: %s (%s,%s): %fiN(ssyssstderrsnamesusersurlsselfs coordinatorssprioritys immediates demand_ncpusKeyErrorsCoordinatorInfos resourcessnjobsTruesmust_rebalance(sselfsnamesurlsusersprioritys resourcess immediates demand_ncpu((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister_coordinators*  cCsjy2|i|=tid|||fIJ|iƒWn-tj o!tid|||fIJnXt SdS(s"remove a coordinator from our lists#unregister_coordinator: %s (%s): %ss*unregister_coordinator: %s unknown:%s (%s)N( sselfs coordinatorssurlssyssstderrsnamesmessages load_balancesKeyErrorsTrue(sselfsnamesurlsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysunregister_coordinator-s cCsty|i|}Wn.tj o"tid||fIJgSnX|iƒ|i ƒt |i ƒ}|i 2|SdS(s@return a list of hosts for this coordinator to run processors ons)request_cpus: unknown coordinator %s @ %sN( sselfs coordinatorssurlscsKeyErrorssyssstderrsnames assign_loadsassign_processorsstuplesnew_cpus(sselfsnamesurlscsnew_cpus((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys request_cpus9s   cCsNy0|i|c||f7<|i|cd7&%s &' >%s 2>&1 &sSSH: i()stempfileslensselfsclientss ncpu_limitssyssstderrs max_clientssclients_startingshostsmax_ssh_errorssKeyErrorsinitialization_errorssmax_initialization_errorsshostsssshoptssAttributeErrorsosspathsjoins gettempdirsnamesiclientslogfilesappends_[1]skwargssitemssksvsdirspythonsscriptsportsrc_urlscmdserrlogsssh_cmdsFalsestimessystem( sselfshosts_[1]scmdssshoptsstempfilesvsssh_cmdskwargsslogfilesk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys start_client!sH %%     +I:$ cCs&x|D]}|i|ƒqWtSdS(s9start processors on the list of hosts using SSH transportN(shostsshostsselfs start_clientsTrue(sselfshostsshost((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysstart_processorsUs cCsNd|i|if}|ii|i||i|i|i |i |i ƒdS(s3register our existence with the resource controllers http://%s:%dN( sselfshostsportsurls rc_serversregister_coordinatorsnamesusersprioritys resourcess immediates demand_ncpu(sselfsurl((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister[s  cCs3d|i|if}|ii|i||ƒdS(s*tell the resource controller we're exitings http://%s:%dN(sselfshostsportsurls rc_serversunregister_coordinatorsnamesmessage(sselfsmessagesurl((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys unregisterbscCs®tid||fIJd|i||fXMLRPC call to register client hostname and PID as starting_upsregister_client: %s:%diiisno client logfile?N( ssyssstderrshostspidsselfsclientsslogfilesiclientsclients_startingsKeyErrorsclients_initializingsTrue(sselfshostspidslogfilesiclient((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister_clientgs$cCsètid|||fIJy|i||f=Wn*tj otid||fIJnXy|i||f=Wntj onXy|i ||f=Wntj onXt |iƒdjo|i o|i dƒnt SdS(s5XMLRPC call to remove client from register as exitingsunregister_client: %s:%d %ss'unregister_client: unknown client %s:%disDoneN(ssyssstderrshostspidsmessagesselfsclientssKeyErrors stop_clientssclients_initializingslensdonesexitsTrue(sselfshostspidsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysunregister_clientts" cCs¶|i|IJ|iiƒ|id7_y|i||fcd7%d)isgiving id %s to %s:%ds"exhausted all items from iterator!f0.0N(shostspidsselfsclientsssyssstderrsFalsesclients_initializingsKeyErrors success_idsreport_successsdones stop_clientsslens max_clientssitsidsstrs already_donesnslastIDstimespendingsTruesprioritysregister(sselfshostspids success_idsid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysnext²s@  &         cCs¬gi}|iiƒD]\}}|||fƒq~}gi}|iiƒD]\}}||f|ƒqT~}|i |i |i|i|i|||ifSdS(sEreturn basic status info on number of jobs finished, client list etc.N(sappends_[1]sselfsclientssitemssclientsnsuccesss client_reportspendingsksvspending_reportsnameserrlogsnsnerrorsslogfile(sselfsvsclients_[1]s client_reportspending_reportsnsuccesssk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys get_statusØs==cCst|ƒ|_tSdS(s;change the maximum number of clients we should have runningN(sintsnsselfs max_clientssTrue(sselfsn((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysset_max_clientsàscCst|i||f   4       &   s ResourceFilecBs tZdZd„Zd„ZRS(s³wrapper around some locking behavior, to ensure only one copy operation performed for a given resource on a given host. Otherwise, it's just a regular file object.cCsp||_||_|\}}ti|tiƒ o$||}dG|GHti |ƒnt i |||ƒdS(s@resource is name of the resource; rule is (localFile, cpCommand)s copying data:N(sresourcesselfs processorsrules localFiles cpCommandsossaccesssR_OKscmdssystemsfiles__init__smode(sselfsresourcesrulesmodes processorscmds cpCommands localFile((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__init__ùs     cCs$|ii|iƒti|ƒdS(N(sselfs processors release_rulesresourcesfilesclose(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pyscloses(s__name__s __module__s__doc__s__init__sclose(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys ResourceFileôs  s ProcessorcBs°tZdZdZdZdZdZdded„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zdd„ZRS(s5provides an iterator interface to an XMLRPC ID serveri iXishttp://localhost:8888shttp://localhost:5000cKs’||_||_ti|ƒ|_||_ti|ƒ|_tƒ|_ t i ƒ|_ t i d|_t|_t|_d|_d|_dS(NsUSERsMYSTERY-EXIT please debugi(surlsselfslogfiles xmlrpclibs ServerProxysserversrc_urls rc_servers get_hostnameshostsossgetpidspidsenvironsusersFalses success_ids pending_ids exit_messagesoverload_count(sselfsurlsrc_urlslogfileskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__init__s       cCsa|ii|i|i|iƒ|ii|i|i|iƒt i dI|iI|i IJdS(s3add ourselves to list of processors for this servers REGISTERED:N( sselfsserversregister_clientshostspidslogfiles rc_serversregister_processorsurlssyssstderrsrc_url(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysregister#scCsˆ|itj o|i|iƒn|ii|i|i|ƒ|i i |i|i|i ƒt i dI|i I|iI|IJdS(s8remove ourselves from list of processors for this servers UNREGISTERED:N(sselfs success_idsFalsesreport_successsserversunregister_clientshostspidsmessages rc_serversunregister_processorsurlssyssstderrsrc_url(sselfsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys unregister)s cCs|SdS(N(sself(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys__iter__1scCs‰xUnoM|ii|i|i|iƒ}t|_|tjot i dƒqPq W|tjot|_ t ‚n||_ |SdS(sget next ID from serverii<N(sselfsserversnextshostspids success_idsidsFalsesTruestimessleepsserverStopIterations StopIterations pending_id(sselfsid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysnext4s!      cCs |ii|i|i|ƒdS(s'report successful completion of task IDN(sselfsserversreport_successshostspidsid(sselfsid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysreport_successEscCsqdk}|iƒ}ti|itiƒti|i|ƒ|ii |i |i ||i ƒƒ|iƒdS(s+report an error using traceback.print_exc()N(sStringIOs err_reports tracebacks print_excsselfsmax_tbssyssstderrsservers report_errorshostspidsidsgetvaluesclose(sselfsids err_reportsStringIO((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys report_errorIs   cCsytiƒd}|ii|i|i|ƒtjo7|i d7_ |i |i jo|i dƒqun d|_ dS(sreport system loadiis load too highN( soss getloadavgsloadsselfs rc_servers report_loadshostspidsFalsesoverload_counts overload_maxsexit(sselfsload((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys report_loadSs%cCs°x©no¡|ii|i|i|ƒ}|tjoG|i|ƒ}|t jot i dƒq nt ||||ƒSq|t jot i dƒqt||ƒSq WdS(s<get a file object for the requested resource, opened in modeii<N(sselfs rc_servers get_resourceshostspidsresourcesrulesFalses acquire_rulesTruestimessleeps ResourceFilesmodesfile(sselfsresourcesmodesrule((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys open_resource_s    cCsH|ii|i|i|ƒ}|tjo|id|ƒn|SdS(sTlock the specified resource rule for this host so that it's safe to build itsinvalid resource: N( sselfs rc_servers acquire_ruleshostspidsresourcesrulesFalsesexit(sselfsresourcesrule((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys acquire_ruless  cCs |ii|i|i|ƒdS(s<release our lock on this resource rule, so others can use itN(sselfs rc_servers release_ruleshostspidsresource(sselfsresource((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys release_rule{scCs||_t‚dS(s1save message for self.unregister() and force exitN(smessagesselfs exit_messages SystemExit(sselfsmessage((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysexits cKs¼d}|||}tiƒ}|iƒt}y8x1no)y%|i ƒ}||_ d}t }WnÉtj oSt|dƒ o|i|iƒd|_n|o d|_n d|_Pnltj o ‚nW|tjo t}n|i|iƒ|d7}||ijod|_Pq/nXtiƒ||ijo|iƒtiƒ}q7q>WWn8tj on'ti|itiƒd|_nX|id |iƒd S( s:run until all task IDs completed, trap & report all errorsiisserverStopIterationsuser StopIteration errorsinitialization errorsdonestoo many errorss error trapsrun_all N(serrors_in_a_rowsresultGeneratorsselfskwargssitstimes report_timesregistersNonesinitializationErrorsnextsids success_idsFalses StopIterationshasattrs report_errors pending_ids exit_messages SystemExitsTruesmax_errors_in_a_rowsreport_frequencys report_loads tracebacks print_excsmax_tbssyssstderrs unregister(sselfsresultGeneratorskwargss report_timesitsidsinitializationErrorserrors_in_a_row((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysrun_all„sR               icKst|dƒ o|||}nd}|iƒy:x3|D]+}||_|d7}||joPq>q>WWn|i dƒ‚nX|i dƒ|SdS(s&run n task IDs, with no error trappingsnextiisrun_interactive errorsrun_interactive exitN( shasattrsitsselfskwargssisregistersids success_idsns unregister(sselfsitsnskwargssisid((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pysrun_interactive°s"       (s__name__s __module__s__doc__smax_errors_in_a_rowsmax_tbsreport_frequencys overload_maxsFalses__init__sregisters unregisters__iter__snextsreport_successs report_errors report_loads open_resources acquire_rules release_rulesexitsrun_allsrun_interactive(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/coordinator.pys Processor s&           ,cCsŸh}g}x‚tidD]s}|d djoOy'|didƒ\}}|||' class BetterShelf(shelve.Shelf): """Shelf subclass that fixes its horrible iter implementation. """ def __iter__(self): 'avoid using iter provided by shelve/DictMixin, which loads all keys!' try: return iter(self.dict) except TypeError: # gdbm lacks __iter__ method, so try iter_gdbm() exc_type, exc_value, exc_traceback = sys.exc_info() try: self.dict.firstkey except AttributeError: # evidently not a gdbm dict raise TypeError('''cannot iterate over this dictionary. This means that you do not have bsddb, bsddb3, or gdbm available for use by the 'shelve' module in this Python install. Please fix this! Original error message was: %s''' % str(exc_value)) else: # iterate using gdbm-specific method return iter_gdbm(self.dict) if sys.version_info < (2, 6): # Python finally added good err msg in 2.6 def close(self): if isinstance(self.dict, _ClosedDict): return # if already closed, nothing further to do... shelve.Shelf.close(self) # close Shelf as usual self.dict = _ClosedDict() # raises sensible error msg if accessed def shelve_open(filename, flag='c', protocol=None, writeback=False, useHash=False, mode=0666, *args, **kwargs): """improved implementation of shelve.open() that won't generate bogus __del__ warning messages like Python's version does.""" d = open_index(filename, flag, useHash, mode) # construct Shelf only if OK return BetterShelf(d, protocol, writeback, *args, **kwargs) PKðŠ’;¨˜ò‚‚pygr/dbfile.pyc;ò |†Kc@s©dkZdkZdkZdkZdkZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZ d „Z y4dk Z y e i Wne j o e‚nXWniej o]y:dkZy ei Wne j o e‚nXeZ Wq.ej o eZ q.XnXd ed d „Zd ed d „Zd„Zdeifd„ƒYZdeifd„ƒYZdeeed d„ZdS(NsWrongFormatErrorcBstZdZRS(s>attempted to open db with the wrong format e.g. btree vs. hash(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysWrongFormatError s sNoSuchFileErrorcBstZdZRS(sfile does not exist!(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysNoSuchFileErrors sPermissionsErrorcBstZdZRS(s)inadequate permissions for requested file(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysPermissionsErrors s ReadOnlyErrorcBstZdZRS(s=attempted to open a file for writing, but no write permission(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys ReadOnlyErrors cOsÊyti||ŽSWn¯tj o=}t|ƒidƒototi ||ŽSn‚nhti j oX}t|ƒ}|idƒot |ƒ‚n!|i dƒot|ƒ‚n‚nXdS(sItrap anydbm.error message and transform to our consistent exception typessbsddbsnew dbsdb typeN(sanydbmsopensargsskwargss ImportErrorsesstrsendswithsbsddbshashopenserrorsmsgsNoSuchFileErrors startswithsWrongFormatError(sargsskwargssesmsg((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_anydbms sri¶cCsay/|ot||ƒSnti|||ƒSWn+tiij o…|djp |djoTyt |ƒ}Wn#t j ot d|ƒ‚nX|i ƒtd|ƒ‚q]t d|ƒ‚n–tiij otd|ƒ‚nntiij o[y(|otii‚nt||ƒSWq]tiij otd|ƒ‚q]XnXdS(s¡open bsddb index instead of hash by default. useHash=True forces it to use anydbm default (i.e. hash) instead. Also gives more meaningful error messages.scsws'insufficient permissions to open file: sfile is read-only: sno file named: s,file does not match expected shelve format: N(suseHashs open_anydbmsfilenamesflagsbsddbsbtopensmodesdbs DBAccessErrorsfilesifilesIOErrorsPermissionsErrorscloses ReadOnlyErrorsDBNoSuchFileErrorsNoSuchFileErrorsDBInvalidArgErrorsWrongFormatError(sfilenamesflagsuseHashsmodesifile((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_bsddbDs. cCsTttjo0t||ƒ}| otidƒn|Snt ||||ƒSdS(Ns2Falling back to hash index: unable to import bsddb( sbsddbsNones open_anydbmsfilenamesflagsdsuseHashsloggerswarns open_bsddbsmode(sfilenamesflagsuseHashsmodesd((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_indexhs  ccs8|iƒ}x%|tj o|V|i|ƒ}qWdS(siterator for gdbm objectsN(sdbsfirstkeysksNonesnextkey(sdbsk((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys iter_gdbmqs   s _ClosedDictcBs2tZdZd„ZeZZZZd„ZRS(spThis dummy class exists solely to raise a clear error msg if accessed. Copied from the Python 2.6 shelve.py cGstdƒ‚dS(Ns!invalid operation on closed shelf(s ValueError(sselfsargs((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysclosed}scCsdSdS(Ns((sself((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys__repr__s( s__name__s __module__s__doc__scloseds __getitem__s __setitem__s __delitem__skeyss__repr__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys _ClosedDictys  s BetterShelfcBs:tZdZd„Zeiddfjo d„ZnRS(s@Shelf subclass that fixes its horrible iter implementation. cCs‡yt|iƒSWnotj octiƒ\}}}y|ii Wn)t j otdt |ƒƒ‚qƒXt |iƒSnXdS(sDavoid using iter provided by shelve/DictMixin, which loads all keys!sÎcannot iterate over this dictionary. This means that you do not have bsddb, bsddb3, or gdbm available for use by the 'shelve' module in this Python install. Please fix this! Original error message was: %sN( sitersselfsdicts TypeErrorssyssexc_infosexc_types exc_values exc_tracebacksfirstkeysAttributeErrorsstrs iter_gdbm(sselfs exc_tracebacks exc_valuesexc_type((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys__iter__‰siicCs;t|itƒodSntii|ƒtƒ|_dS(N(s isinstancesselfsdicts _ClosedDictsshelvesShelfsclose(sself((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pyscloseœs(s__name__s __module__s__doc__s__iter__ssyss version_infosclose(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys BetterShelf…s  scc Os/t||||ƒ}t|||||ŽSdS(swimproved implementation of shelve.open() that won't generate bogus __del__ warning messages like Python's version does.N( s open_indexsfilenamesflagsuseHashsmodesds BetterShelfsprotocols writebacksargsskwargs( sfilenamesflagsprotocols writebacksuseHashsmodesargsskwargssd((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys shelve_open£s(sanydbmsshelvessyssUserDictsloggersIOErrorsWrongFormatErrorsNoSuchFileErrorsPermissionsErrors ReadOnlyErrors open_anydbmsbsddbsdbsAttributeErrors ImportErrorsbsddb3sNonesFalses open_bsddbs open_indexs iter_gdbms DictMixins _ClosedDictsShelfs BetterShelfs shelve_open(sNoSuchFileErrors open_anydbms _ClosedDicts shelve_opens open_indexsbsddbsloggersbsddb3sUserDictsPermissionsErrorssyssanydbmsWrongFormatErrors iter_gdbms ReadOnlyErrorsshelves open_bsddbs BetterShelf((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys?s>            $  PKñŠ’;¨˜ò‚‚pygr/dbfile.pyo;ò |†Kc@s©dkZdkZdkZdkZdkZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZ d „Z y4dk Z y e i Wne j o e‚nXWniej o]y:dkZy ei Wne j o e‚nXeZ Wq.ej o eZ q.XnXd ed d „Zd ed d „Zd„Zdeifd„ƒYZdeifd„ƒYZdeeed d„ZdS(NsWrongFormatErrorcBstZdZRS(s>attempted to open db with the wrong format e.g. btree vs. hash(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysWrongFormatError s sNoSuchFileErrorcBstZdZRS(sfile does not exist!(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysNoSuchFileErrors sPermissionsErrorcBstZdZRS(s)inadequate permissions for requested file(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysPermissionsErrors s ReadOnlyErrorcBstZdZRS(s=attempted to open a file for writing, but no write permission(s__name__s __module__s__doc__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys ReadOnlyErrors cOsÊyti||ŽSWn¯tj o=}t|ƒidƒototi ||ŽSn‚nhti j oX}t|ƒ}|idƒot |ƒ‚n!|i dƒot|ƒ‚n‚nXdS(sItrap anydbm.error message and transform to our consistent exception typessbsddbsnew dbsdb typeN(sanydbmsopensargsskwargss ImportErrorsesstrsendswithsbsddbshashopenserrorsmsgsNoSuchFileErrors startswithsWrongFormatError(sargsskwargssesmsg((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_anydbms sri¶cCsay/|ot||ƒSnti|||ƒSWn+tiij o…|djp |djoTyt |ƒ}Wn#t j ot d|ƒ‚nX|i ƒtd|ƒ‚q]t d|ƒ‚n–tiij otd|ƒ‚nntiij o[y(|otii‚nt||ƒSWq]tiij otd|ƒ‚q]XnXdS(s¡open bsddb index instead of hash by default. useHash=True forces it to use anydbm default (i.e. hash) instead. Also gives more meaningful error messages.scsws'insufficient permissions to open file: sfile is read-only: sno file named: s,file does not match expected shelve format: N(suseHashs open_anydbmsfilenamesflagsbsddbsbtopensmodesdbs DBAccessErrorsfilesifilesIOErrorsPermissionsErrorscloses ReadOnlyErrorsDBNoSuchFileErrorsNoSuchFileErrorsDBInvalidArgErrorsWrongFormatError(sfilenamesflagsuseHashsmodesifile((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_bsddbDs. cCsTttjo0t||ƒ}| otidƒn|Snt ||||ƒSdS(Ns2Falling back to hash index: unable to import bsddb( sbsddbsNones open_anydbmsfilenamesflagsdsuseHashsloggerswarns open_bsddbsmode(sfilenamesflagsuseHashsmodesd((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys open_indexhs  ccs8|iƒ}x%|tj o|V|i|ƒ}qWdS(siterator for gdbm objectsN(sdbsfirstkeysksNonesnextkey(sdbsk((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys iter_gdbmqs   s _ClosedDictcBs2tZdZd„ZeZZZZd„ZRS(spThis dummy class exists solely to raise a clear error msg if accessed. Copied from the Python 2.6 shelve.py cGstdƒ‚dS(Ns!invalid operation on closed shelf(s ValueError(sselfsargs((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pysclosed}scCsdSdS(Ns((sself((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys__repr__s( s__name__s __module__s__doc__scloseds __getitem__s __setitem__s __delitem__skeyss__repr__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys _ClosedDictys  s BetterShelfcBs:tZdZd„Zeiddfjo d„ZnRS(s@Shelf subclass that fixes its horrible iter implementation. cCs‡yt|iƒSWnotj octiƒ\}}}y|ii Wn)t j otdt |ƒƒ‚qƒXt |iƒSnXdS(sDavoid using iter provided by shelve/DictMixin, which loads all keys!sÎcannot iterate over this dictionary. This means that you do not have bsddb, bsddb3, or gdbm available for use by the 'shelve' module in this Python install. Please fix this! Original error message was: %sN( sitersselfsdicts TypeErrorssyssexc_infosexc_types exc_values exc_tracebacksfirstkeysAttributeErrorsstrs iter_gdbm(sselfs exc_tracebacks exc_valuesexc_type((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys__iter__‰siicCs;t|itƒodSntii|ƒtƒ|_dS(N(s isinstancesselfsdicts _ClosedDictsshelvesShelfsclose(sself((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pyscloseœs(s__name__s __module__s__doc__s__iter__ssyss version_infosclose(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys BetterShelf…s  scc Os/t||||ƒ}t|||||ŽSdS(swimproved implementation of shelve.open() that won't generate bogus __del__ warning messages like Python's version does.N( s open_indexsfilenamesflagsuseHashsmodesds BetterShelfsprotocols writebacksargsskwargs( sfilenamesflagsprotocols writebacksuseHashsmodesargsskwargssd((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys shelve_open£s(sanydbmsshelvessyssUserDictsloggersIOErrorsWrongFormatErrorsNoSuchFileErrorsPermissionsErrors ReadOnlyErrors open_anydbmsbsddbsdbsAttributeErrors ImportErrorsbsddb3sNonesFalses open_bsddbs open_indexs iter_gdbms DictMixins _ClosedDictsShelfs BetterShelfs shelve_open(sNoSuchFileErrors open_anydbms _ClosedDicts shelve_opens open_indexsbsddbsloggersbsddb3sUserDictsPermissionsErrorssyssanydbmsWrongFormatErrors iter_gdbms ReadOnlyErrorsshelves open_bsddbs BetterShelf((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/dbfile.pys?s>            $  PKd—~;sÒ)'#'#pygr/downloader.pyimport os import sys from classutil import call_subprocess import logger # METHODS FOR AUTOMATIC DOWNLOADING OF RESOURCES def copy_to_file(f, ifile=None, newpath=None, blocksize=8192000): 'copy from file obj f to ifile (or create newpath if given)' if newpath is not None: ifile = file(newpath, 'wb') # binary file try: while True: s = f.read(blocksize) if s == '': break ifile.write(s) finally: if newpath is not None: ifile.close() f.close() def do_gunzip(filepath, newpath=None): 'gunzip the target using Python gzip module' from gzip import GzipFile if newpath is None: newpath = filepath[:-3] f = GzipFile(filepath) copy_to_file(f, newpath=newpath) return newpath def run_gunzip(filepath, newpath=None): 'run gunzip program as a sub process' if newpath is None: newpath = filepath[:-3] ifile = open(newpath, 'w+b') try: if call_subprocess(['gunzip', '-c', filepath], stdout=ifile): raise OSError('gunzip "%s" failed!' % filepath) finally: ifile.close() return newpath def run_unzip(filepath, newpath=None, singleFile=False, **kwargs): '''run unzip program as a sub process, save to single file newpath if desired.''' if newpath is None: newpath = filepath[:-4] # DROP THE .zip SUFFIX if singleFile: # concatenate all files into newpath ifile = file(newpath, 'wb') # copy as binary file try: status = call_subprocess(['unzip', '-p', filepath], stdout=ifile) finally: ifile.close() else: # just unzip the package as usual status = call_subprocess(['unzip', filepath]) if status != 0: raise OSError('unzip "%s" failed!' % filepath) return newpath def create_dir_if_needed(path): 'ensure that this directory exists, by creating it if needed' import os if os.path.isdir(path): return # directory exists so nothing to do create_dir_if_needed(os.path.dirname(path)) # ensure parent exists os.mkdir(path) # create this directory def create_file_with_path(basepath, filepath): 'create file in write mode, creating parent directory(s) if needed' import os.path newpath = os.path.join(basepath, filepath) create_dir_if_needed(os.path.dirname(newpath)) return file(newpath, 'wb') # copy as binary file def do_unzip(filepath, newpath=None, singleFile=False, **kwargs): 'extract zip archive, to single file given by newpath if desired' # WARNING: zipfile module reads entire file into memory! if newpath is None: newpath = filepath[:-4] from zipfile import ZipFile t = ZipFile(filepath, 'r') try: if singleFile: # extract to a single file ifile = file(newpath, 'wb') # copy as binary file try: for name in t.namelist(): ifile.write(t.read(name)) # may run out of memory!! finally: ifile.close() else: # extract a bunch of files as usual for name in t.namelist(): ifile = create_file_with_path(newpath, name) ifile.write(t.read(name)) # may run out of memory!! ifile.close() finally: t.close() return newpath def do_untar(filepath, mode='r|', newpath=None, singleFile=False, **kwargs): 'extract tar archive, to single file given by newpath if desired' if newpath is None: newpath = filepath + '.out' import tarfile t = tarfile.open(filepath, mode) try: if singleFile: # extract to a single file ifile = file(newpath, 'wb') # copy as binary file try: for name in t.getnames(): f = t.extractfile(name) copy_to_file(f, ifile) finally: ifile.close() else: # extract a bunch of files as usual import os t.extractall(os.path.dirname(newpath)) finally: t.close() return newpath def uncompress_file(filepath, **kwargs): '''stub for applying appropriate uncompression based on file suffix (.tar .tar.gz .tgz .tar.bz2 .gz and .zip for now)''' if filepath.endswith('.zip'): logger.info('unzipping %s...' % filepath) try: return run_unzip(filepath, **kwargs) except OSError: return do_unzip(filepath, **kwargs) elif filepath.endswith('.tar'): logger.info('untarring %s...' % filepath) return do_untar(filepath, newpath=filepath[:-4], **kwargs) elif filepath.endswith('.tgz'): logger.info('untarring %s...' % filepath) return do_untar(filepath, mode='r:gz', newpath=filepath[:-4], **kwargs) elif filepath.endswith('.tar.gz'): logger.info('untarring %s...' % filepath) return do_untar(filepath, mode='r:gz', newpath=filepath[:-7], **kwargs) elif filepath.endswith('.tar.bz2'): logger.info('untarring %s...' % filepath) return do_untar(filepath, mode='r:bz2', newpath=filepath[:-8], **kwargs) elif filepath.endswith('.gz'): logger.info('gunzipping %s...' % filepath) try: # could use gzip module, but it's two times slower!! return run_gunzip(filepath, **kwargs) # run as sub process except OSError: # on Windows, have to run as python module return do_gunzip(filepath, **kwargs) return filepath # DEFAULT: NOT COMPRESSED, SO JUST HAND BACK FILENAME def download_monitor(bcount, bsize, totalsize): 'show current download progress' if bcount == 0: download_monitor.percentage_last_shown = 0. bytes = bcount * bsize percentage = bytes * 100. / totalsize if percentage >= 10. + download_monitor.percentage_last_shown: logger.info('downloaded %s bytes (%2.1f%%)...' % (bytes, percentage)) download_monitor.percentage_last_shown = percentage def download_unpickler(path, filename, kwargs): 'try to download the desired file, and uncompress it if need be' import os import urllib import classutil if filename is None: filename = os.path.basename(path) try: dl_dir = os.environ['WORLDBASEDOWNLOAD'] except KeyError: dl_dir = classutil.get_env_or_cwd('PYGRDATADOWNLOAD') filepath = os.path.join(dl_dir, filename) logger.info('Beginning download of %s to %s...' % (path, filepath)) t = urllib.urlretrieve(path, filepath, download_monitor) logger.info('Download done.') filepath = uncompress_file(filepath, **kwargs) # UNCOMPRESS IF NEEDED # PATH TO WHERE THIS FILE IS NOW STORED o = classutil.SourceFileName(filepath) o._saveLocalBuild = True # MARK THIS FOR SAVING IN LOCAL PYGR.DATA return o download_unpickler.__safe_for_unpickling__ = 1 class SourceURL(object): '''unpickling this object will trigger downloading of the desired path, which will be cached to WORLDBASEDOWNLOAD directory if any. The value returned from unpickling will simply be the path to the downloaded file, as a SourceFileName''' _worldbase_no_cache = True # force worldbase to always re-load this class def __init__(self, path, filename=None, **kwargs): self.path = path self.kwargs = kwargs self.filename = filename if path.startswith('http:'): # make sure we can read this URL import httplib conn = httplib.HTTPConnection(path.split('/')[2]) try: conn.request('GET', '/'.join([''] + path.split('/')[3:])) r1 = conn.getresponse() if r1.status != 200: raise OSError('http GET failed: %d %s, %s' % (r1.status, r1.reason, path)) finally: conn.close() def __reduce__(self): return (download_unpickler, (self.path, self.filename, self.kwargs)) def generic_build_unpickler(cname, args, kwargs): 'does nothing but construct the specified klass with the specified args' if cname == 'BlastDB': from seqdb import BlastDB as klass else: raise ValueError('''class name not registered for unpickling security. Add it to pygr.downloader.generic_build_unpickler if needed: ''' + cname) o = klass(*args, **kwargs) o._saveLocalBuild = True # MARK FOR LOCAL PYGR.DATA SAVE return o generic_build_unpickler.__safe_for_unpickling__ = 1 class GenericBuilder(object): 'proxy for constructing the desired klass on unpickling' _worldbase_no_cache = True # force worldbase to always re-load this class def __init__(self, cname, *args, **kwargs): self.cname = cname self.args = args self.kwargs = kwargs def __reduce__(self): return (generic_build_unpickler, (self.cname, self.args, self.kwargs)) PKðŠ’;{W²¸,¸,pygr/downloader.pyc;ò |†Kc@súdkZdkZdklZdkZeedd„Zed„Zed„Zee d„Z d„Z d„Z ee d „Z d ee d „Zd „Zd „Zd„Zde_defd„ƒYZd„Zde_defd„ƒYZdS(N(scall_subprocessi}cCsŽ|tj ot|dƒ}nzAx:to2|i|ƒ}|djoPn|i |ƒq&WWd|tj o|i ƒn|i ƒXdS(s:copy from file obj f to ifile (or create newpath if given)swbsN( snewpathsNonesfilesifilesTruesfsreads blocksizessswritesclose(sfsifilesnewpaths blocksizess((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys copy_to_file s   cCsLdkl}|tjo|d }n||ƒ}t|d|ƒ|SdS(s*gunzip the target using Python gzip module(sGzipFileiýÿÿÿsnewpathN(sgzipsGzipFilesnewpathsNonesfilepathsfs copy_to_file(sfilepathsnewpathsfsGzipFile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys do_gunzips   cCst|tjo|d }nt|dƒ}z4tdd|gd|ƒotd|ƒ‚nWd|iƒX|SdS(s#run gunzip program as a sub processiýÿÿÿsw+bsgunzips-csstdoutsgunzip "%s" failed!N(snewpathsNonesfilepathsopensifilescall_subprocesssOSErrorsclose(sfilepathsnewpathsifile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys run_gunzip#s  cKs|tjo|d }n|o@t|dƒ}ztdd|gd|ƒ}Wd|iƒXntd|gƒ}|djot d|ƒ‚n|SdS( sOrun unzip program as a sub process, save to single file newpath if desired.iüÿÿÿswbsunzips-psstdoutNisunzip "%s" failed!( snewpathsNonesfilepaths singleFilesfilesifilescall_subprocesssstatussclosesOSError(sfilepathsnewpaths singleFileskwargssstatussifile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys run_unzip0s  cCsKdk}|ii|ƒodSnt|ii|ƒƒ|i|ƒdS(s;ensure that this directory exists, by creating it if neededN(sosspathsisdirscreate_dir_if_neededsdirnamesmkdir(spathsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pyscreate_dir_if_neededBs  cCsEdk}|ii||ƒ}t|ii|ƒƒt |dƒSdS(sAcreate file in write mode, creating parent directory(s) if neededNswb( sos.pathsosspathsjoinsbasepathsfilepathsnewpathscreate_dir_if_neededsdirnamesfile(sbasepathsfilepathsnewpathsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pyscreate_file_with_pathKs  cKsð|tjo|d }ndkl}||dƒ}z£|oRt|dƒ}z1x*|i ƒD]}|i |i |ƒƒq`WWd|i ƒXnGxC|i ƒD]5}t||ƒ}|i |i |ƒƒ|i ƒq WWd|i ƒX|SdS(s?extract zip archive, to single file given by newpath if desirediüÿÿÿ(sZipFilesrswbN(snewpathsNonesfilepathszipfilesZipFilests singleFilesfilesifilesnamelistsnameswritesreadsclosescreate_file_with_path(sfilepathsnewpaths singleFileskwargssnamesZipFilesifilest((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdo_unzipSs,     sr|c KsÑ|tjo|d}ndk}|i||ƒ} z…|oXt|dƒ}z7x0| i ƒD]"}| i |ƒ}t||ƒq_WWd|iƒXn#dk} | i| ii|ƒƒWd| iƒX|SdS(s?extract tar archive, to single file given by newpath if desireds.outNswb(snewpathsNonesfilepathstarfilesopensmodests singleFilesfilesifilesgetnamessnames extractfilesfs copy_to_filesclosesoss extractallspathsdirname( sfilepathsmodesnewpaths singleFileskwargssnamesfstarfilesifilesosst((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdo_untarls(     cKs¼|idƒoItid|ƒyt||SWq´tj ot||Sq´Xn\|idƒo,tid|ƒt|d|d |Sn |idƒo2tid|ƒt|dd d|d |SnÞ|id ƒo2tid|ƒt|dd d|d |Snœ|id ƒo2tid|ƒt|dd d|d |SnZ|idƒoItid|ƒyt ||SWq´tj ot ||Sq´Xn|SdS(svstub for applying appropriate uncompression based on file suffix (.tar .tar.gz .tgz .tar.bz2 .gz and .zip for now)s.zipsunzipping %s...s.tarsuntarring %s...snewpathiüÿÿÿs.tgzsmodesr:gzs.tar.gziùÿÿÿs.tar.bz2sr:bz2iøÿÿÿs.gzsgunzipping %s...N( sfilepathsendswithsloggersinfos run_unzipskwargssOSErrorsdo_unzipsdo_untars run_gunzips do_gunzip(sfilepathskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysuncompress_fileƒs4!!!cCsn|djo dt_n||}|d|}|dtijo$tid||fƒ|t_ndS(sshow current download progressif0.0f100.0f10.0s downloaded %s bytes (%2.1f%%)...N( sbcountsdownload_monitorspercentage_last_shownsbsizesbytess totalsizes percentagesloggersinfo(sbcountsbsizes totalsizesbytess percentage((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdownload_monitor£s   c Csñdk} dk}dk}|tjo| ii|ƒ}ny| id}Wn"t j o|i dƒ}nX| ii ||ƒ}t id||fƒ|i||tƒ}t idƒt||}|i|ƒ}t|_|SdS(s>try to download the desired file, and uncompress it if need beNsWORLDBASEDOWNLOADsPYGRDATADOWNLOADs!Beginning download of %s to %s...sDownload done.(sossurllibs classutilsfilenamesNonespathsbasenamesenvironsdl_dirsKeyErrorsget_env_or_cwdsjoinsfilepathsloggersinfos urlretrievesdownload_monitorstsuncompress_fileskwargssSourceFileNamesosTrues_saveLocalBuild( spathsfilenameskwargssos classutilsfilepathsurllibsdl_dirstsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdownload_unpickler¯s$      is SourceURLcBs)tZdZeZed„Zd„ZRS(sóunpickling this object will trigger downloading of the desired path, which will be cached to WORLDBASEDOWNLOAD directory if any. The value returned from unpickling will simply be the path to the downloaded file, as a SourceFileNamecKsÖ||_||_||_|idƒo§dk}|i|idƒdƒ}zp|i ddi dg|idƒdƒƒ|i ƒ}|i djo#td|i |i|fƒ‚nWd|iƒXndS( Nshttp:s/isGETsiiÈshttp GET failed: %d %s, %s(spathsselfskwargssfilenames startswithshttplibsHTTPConnectionssplitsconnsrequestsjoins getresponsesr1sstatussOSErrorsreasonsclose(sselfspathsfilenameskwargsshttplibsr1sconn((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys__init__Îs    - 'cCs t|i|i|iffSdS(N(sdownload_unpicklersselfspathsfilenameskwargs(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys __reduce__Þs(s__name__s __module__s__doc__sTrues_worldbase_no_cachesNones__init__s __reduce__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys SourceURLÇs  cCsN|djodkl}ntd|ƒ‚|||Ž}t|_ |SdS(sFdoes nothing but construct the specified klass with the specified argssBlastDB(sBlastDBspclass name not registered for unpickling security. Add it to pygr.downloader.generic_build_unpickler if needed: N( scnamesseqdbsBlastDBsklasss ValueErrorsargsskwargssosTrues_saveLocalBuild(scnamesargsskwargssosklass((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysgeneric_build_unpicklerâs  sGenericBuildercBs&tZdZeZd„Zd„ZRS(s6proxy for constructing the desired klass on unpicklingcOs||_||_||_dS(N(scnamesselfsargsskwargs(sselfscnamesargsskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys__init__ós  cCs t|i|i|iffSdS(N(sgeneric_build_unpicklersselfscnamesargsskwargs(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys __reduce__øs(s__name__s __module__s__doc__sTrues_worldbase_no_caches__init__s __reduce__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysGenericBuilderïs  (sosssyss classutilscall_subprocesssloggersNones copy_to_files do_gunzips run_gunzipsFalses run_unzipscreate_dir_if_neededscreate_file_with_pathsdo_unzipsdo_untarsuncompress_filesdownload_monitorsdownload_unpicklers__safe_for_unpickling__sobjects SourceURLsgeneric_build_unpicklersGenericBuilder(sdo_untarsdo_unzips copy_to_files SourceURLsuncompress_filesGenericBuildersgeneric_build_unpicklers run_gunzips do_gunzipscreate_file_with_pathssysscreate_dir_if_neededsdownload_unpicklerscall_subprocesssloggersdownload_monitorsoss run_unzip((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys?s&         PKñŠ’;{W²¸,¸,pygr/downloader.pyo;ò |†Kc@súdkZdkZdklZdkZeedd„Zed„Zed„Zee d„Z d„Z d„Z ee d „Z d ee d „Zd „Zd „Zd„Zde_defd„ƒYZd„Zde_defd„ƒYZdS(N(scall_subprocessi}cCsŽ|tj ot|dƒ}nzAx:to2|i|ƒ}|djoPn|i |ƒq&WWd|tj o|i ƒn|i ƒXdS(s:copy from file obj f to ifile (or create newpath if given)swbsN( snewpathsNonesfilesifilesTruesfsreads blocksizessswritesclose(sfsifilesnewpaths blocksizess((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys copy_to_file s   cCsLdkl}|tjo|d }n||ƒ}t|d|ƒ|SdS(s*gunzip the target using Python gzip module(sGzipFileiýÿÿÿsnewpathN(sgzipsGzipFilesnewpathsNonesfilepathsfs copy_to_file(sfilepathsnewpathsfsGzipFile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys do_gunzips   cCst|tjo|d }nt|dƒ}z4tdd|gd|ƒotd|ƒ‚nWd|iƒX|SdS(s#run gunzip program as a sub processiýÿÿÿsw+bsgunzips-csstdoutsgunzip "%s" failed!N(snewpathsNonesfilepathsopensifilescall_subprocesssOSErrorsclose(sfilepathsnewpathsifile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys run_gunzip#s  cKs|tjo|d }n|o@t|dƒ}ztdd|gd|ƒ}Wd|iƒXntd|gƒ}|djot d|ƒ‚n|SdS( sOrun unzip program as a sub process, save to single file newpath if desired.iüÿÿÿswbsunzips-psstdoutNisunzip "%s" failed!( snewpathsNonesfilepaths singleFilesfilesifilescall_subprocesssstatussclosesOSError(sfilepathsnewpaths singleFileskwargssstatussifile((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys run_unzip0s  cCsKdk}|ii|ƒodSnt|ii|ƒƒ|i|ƒdS(s;ensure that this directory exists, by creating it if neededN(sosspathsisdirscreate_dir_if_neededsdirnamesmkdir(spathsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pyscreate_dir_if_neededBs  cCsEdk}|ii||ƒ}t|ii|ƒƒt |dƒSdS(sAcreate file in write mode, creating parent directory(s) if neededNswb( sos.pathsosspathsjoinsbasepathsfilepathsnewpathscreate_dir_if_neededsdirnamesfile(sbasepathsfilepathsnewpathsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pyscreate_file_with_pathKs  cKsð|tjo|d }ndkl}||dƒ}z£|oRt|dƒ}z1x*|i ƒD]}|i |i |ƒƒq`WWd|i ƒXnGxC|i ƒD]5}t||ƒ}|i |i |ƒƒ|i ƒq WWd|i ƒX|SdS(s?extract zip archive, to single file given by newpath if desirediüÿÿÿ(sZipFilesrswbN(snewpathsNonesfilepathszipfilesZipFilests singleFilesfilesifilesnamelistsnameswritesreadsclosescreate_file_with_path(sfilepathsnewpaths singleFileskwargssnamesZipFilesifilest((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdo_unzipSs,     sr|c KsÑ|tjo|d}ndk}|i||ƒ} z…|oXt|dƒ}z7x0| i ƒD]"}| i |ƒ}t||ƒq_WWd|iƒXn#dk} | i| ii|ƒƒWd| iƒX|SdS(s?extract tar archive, to single file given by newpath if desireds.outNswb(snewpathsNonesfilepathstarfilesopensmodests singleFilesfilesifilesgetnamessnames extractfilesfs copy_to_filesclosesoss extractallspathsdirname( sfilepathsmodesnewpaths singleFileskwargssnamesfstarfilesifilesosst((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdo_untarls(     cKs¼|idƒoItid|ƒyt||SWq´tj ot||Sq´Xn\|idƒo,tid|ƒt|d|d |Sn |idƒo2tid|ƒt|dd d|d |SnÞ|id ƒo2tid|ƒt|dd d|d |Snœ|id ƒo2tid|ƒt|dd d|d |SnZ|idƒoItid|ƒyt ||SWq´tj ot ||Sq´Xn|SdS(svstub for applying appropriate uncompression based on file suffix (.tar .tar.gz .tgz .tar.bz2 .gz and .zip for now)s.zipsunzipping %s...s.tarsuntarring %s...snewpathiüÿÿÿs.tgzsmodesr:gzs.tar.gziùÿÿÿs.tar.bz2sr:bz2iøÿÿÿs.gzsgunzipping %s...N( sfilepathsendswithsloggersinfos run_unzipskwargssOSErrorsdo_unzipsdo_untars run_gunzips do_gunzip(sfilepathskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysuncompress_fileƒs4!!!cCsn|djo dt_n||}|d|}|dtijo$tid||fƒ|t_ndS(sshow current download progressif0.0f100.0f10.0s downloaded %s bytes (%2.1f%%)...N( sbcountsdownload_monitorspercentage_last_shownsbsizesbytess totalsizes percentagesloggersinfo(sbcountsbsizes totalsizesbytess percentage((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdownload_monitor£s   c Csñdk} dk}dk}|tjo| ii|ƒ}ny| id}Wn"t j o|i dƒ}nX| ii ||ƒ}t id||fƒ|i||tƒ}t idƒt||}|i|ƒ}t|_|SdS(s>try to download the desired file, and uncompress it if need beNsWORLDBASEDOWNLOADsPYGRDATADOWNLOADs!Beginning download of %s to %s...sDownload done.(sossurllibs classutilsfilenamesNonespathsbasenamesenvironsdl_dirsKeyErrorsget_env_or_cwdsjoinsfilepathsloggersinfos urlretrievesdownload_monitorstsuncompress_fileskwargssSourceFileNamesosTrues_saveLocalBuild( spathsfilenameskwargssos classutilsfilepathsurllibsdl_dirstsos((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysdownload_unpickler¯s$      is SourceURLcBs)tZdZeZed„Zd„ZRS(sóunpickling this object will trigger downloading of the desired path, which will be cached to WORLDBASEDOWNLOAD directory if any. The value returned from unpickling will simply be the path to the downloaded file, as a SourceFileNamecKsÖ||_||_||_|idƒo§dk}|i|idƒdƒ}zp|i ddi dg|idƒdƒƒ|i ƒ}|i djo#td|i |i|fƒ‚nWd|iƒXndS( Nshttp:s/isGETsiiÈshttp GET failed: %d %s, %s(spathsselfskwargssfilenames startswithshttplibsHTTPConnectionssplitsconnsrequestsjoins getresponsesr1sstatussOSErrorsreasonsclose(sselfspathsfilenameskwargsshttplibsr1sconn((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys__init__Îs    - 'cCs t|i|i|iffSdS(N(sdownload_unpicklersselfspathsfilenameskwargs(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys __reduce__Þs(s__name__s __module__s__doc__sTrues_worldbase_no_cachesNones__init__s __reduce__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys SourceURLÇs  cCsN|djodkl}ntd|ƒ‚|||Ž}t|_ |SdS(sFdoes nothing but construct the specified klass with the specified argssBlastDB(sBlastDBspclass name not registered for unpickling security. Add it to pygr.downloader.generic_build_unpickler if needed: N( scnamesseqdbsBlastDBsklasss ValueErrorsargsskwargssosTrues_saveLocalBuild(scnamesargsskwargssosklass((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysgeneric_build_unpicklerâs  sGenericBuildercBs&tZdZeZd„Zd„ZRS(s6proxy for constructing the desired klass on unpicklingcOs||_||_||_dS(N(scnamesselfsargsskwargs(sselfscnamesargsskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys__init__ós  cCs t|i|i|iffSdS(N(sgeneric_build_unpicklersselfscnamesargsskwargs(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys __reduce__øs(s__name__s __module__s__doc__sTrues_worldbase_no_caches__init__s __reduce__(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pysGenericBuilderïs  (sosssyss classutilscall_subprocesssloggersNones copy_to_files do_gunzips run_gunzipsFalses run_unzipscreate_dir_if_neededscreate_file_with_pathsdo_unzipsdo_untarsuncompress_filesdownload_monitorsdownload_unpicklers__safe_for_unpickling__sobjects SourceURLsgeneric_build_unpicklersGenericBuilder(sdo_untarsdo_unzips copy_to_files SourceURLsuncompress_filesGenericBuildersgeneric_build_unpicklers run_gunzips do_gunzipscreate_file_with_pathssysscreate_dir_if_neededsdownload_unpicklerscall_subprocesssloggersdownload_monitorsoss run_unzip((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/downloader.pys?s&         PKd—~;…¹rRE|E|pygr/graphquery.py from __future__ import generators from mapping import * class QueryMatchWrapper(dict): """build a queryMatch mapping on demand, since its not actually needed during query traversal""" def __init__(self, dataMatch, compiler): dict.__init__(self) for k, v in dataMatch.items(): # INVERT THE DATA MATCH MAPPING self[v] = k for i in range(compiler.n): # ALSO SAVE MAPPINGS TO DATA EDGES gqi = compiler.gqi[i] self[gqi.fromNode, gqi.queryNode] = compiler.dataEdge[i] class QueryMatchDescriptor(object): def __get__(self, obj, objtype): return QueryMatchWrapper(obj.dataMatch, obj) class QueryMatcher(object): "map a query node or edge on demand" def __init__(self, compiler): self.compiler = compiler def __getitem__(self, k): for q, d in self.iteritems(): if q == k: return d return KeyError def __iter__(self, k): for k, v in self.iteritems(): yield k def iteritems(self): for dataNode, queryNode in self.compiler.dataMatch.items(): yield queryNode, dataNode # RETURN NODE MAPPINGS for i in range(self.compiler.n): # ALSO SAVE MAPPINGS TO DATA EDGES gqi = self.compiler.gqi[i] # RETURN EDGE MAPPINGS yield (gqi.fromNode, gqi.queryNode), self.compiler.dataEdge[i] def items(self): return [x for x in self.iteritems()] def __repr__(self): return '{' + ','.join([repr(k) + ':' + repr(v) for k, v in self.iteritems()]) + '}' class GraphQueryCompiler(object): 'compile a series of GraphQueryIterators into python code, run them' #queryMatch = QueryMatchDescriptor() _lang = "" # NO LANGUAGE STEM def __init__(self, name='graphquery', globalDict=None): self.name = name self.code = [] self.unmark_code = [] self.next_code = [] self.end_code = [] self.indent = [] self.gqi = [] self.queryLayerGraph = dictGraph() self.n = 0 if globalDict is None: self._compiled = {} else: self._compiled = globalDict self.queryMatch = QueryMatcher(self) def __getitem__(self, key): 'return appropropriate code for accessing nodes/edges in data or query' if key == 'n': return self.n elif key == 'name': return self.name elif key == 'dataGraph': queryEdge = self.gqi[self.n].queryGraph[self.gqi[self.n].fromNode]\ [self.gqi[self.n].queryNode] try: # CHECK IF QUERY EDGE USES A NON-DEFAULT DATA GRAPH dg = queryEdge['dataGraph'] return 'self.gqi[%d].dataGraph' % self.n except (TypeError, KeyError): return 'dataGraph' elif key == 'filter': return 'self.gqi[%d].filter' % self.n elif key == 'toQueryNode': return 'self.gqi[%d].queryNode' % self.n elif key == 'fromQueryNode': return 'self.gqi[%d].fromNode' % self.n if key[:2] == 'to': layer = self.queryLayerGraph[self.gqi[self.n].queryNode] elif key[:4] == 'from': layer = self.queryLayerGraph[self.gqi[self.n].fromNode] if key[-8:] == 'DataNode': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'dataNode%d' % layer.values()[0] if key[-8:] == 'DataEdge': # GET LAST LAYER, WHERE THIS EDGE CREATED return 'dataEdge[%d]' % layer.values()[-1] if key == 'level': return self.n try: return getattr(self.gqi[self.n], key) except AttributeError: raise KeyError('%s not a valid GraphQueryCompiler key' % key) def indent_code(self, codestr, current_indent): 'calculate indentation levels added by code in codestr' codestr = codestr % self # PERFORM MACRO SUBSTITUTIONS lines = codestr.split('\n') lastline = lines[-1] if lastline == '' and len(lines) > 1: # IGNORE TERMINAL BLANK LINE lastline = lines[-2] # Determine final indentation level. nindent = len(lastline.split('\t')) - 1 if len(lastline) > 0 and lastline[-1] == ':': nindent += 1 s = '' # NOW FORMAT THE CODE WITH PROPER INDENTATION LEVEL for line in lines: s += current_indent * '\t' + line + '\n' return s, current_indent + nindent def __iadd__(self, gqi): 'add a GraphQueryIterator to be compiled into this query' self.gqi.append(gqi) if gqi.queryNode not in self.queryLayerGraph: # NOT ALREADY BOUND? self.queryLayerGraph += gqi.queryNode codestr = getattr(gqi, self._lang + '_generator_code') markstr = getattr(gqi, self._lang + '_index_code') unmarkstr = getattr(gqi, self._lang + '_unmark_code') try: endcode = getattr(gqi, self._lang + '_end_code') except AttributeError: endcode = '' try: nextcode = getattr(gqi, self._lang + '_next_code') except AttributeError: nextcode = '' self.lastGenerator = self.n else: codestr = getattr(gqi, self._lang + '_closure_code') markstr = None unmarkstr = getattr(gqi, self._lang + '_unmark_closure_code') try: endcode = getattr(gqi, self._lang + '_end_closure_code') except AttributeError: endcode = '' try: nextcode = getattr(gqi, self._lang + '_next_closure_code') except AttributeError: nextcode = '' #BIND QUERY EDGE TO THIS LAYER self.queryLayerGraph[gqi.queryNode][gqi.fromNode] = self.n try: # GET INDENTATION LEVEL FROM PREVIOUS LAYER current_indent = self.indent[-1] except IndexError: current_indent = 1 # TOPLEVEL: MUST INDENT INSIDE def self.end_code.append(self.indent_code(endcode, current_indent)[0]) s, current_indent = self.indent_code(codestr, current_indent) self.next_code.append(self.indent_code(nextcode, current_indent)[0]) if hasattr(gqi, 'filter'): s2, current_indent = self.indent_code(getattr(gqi, self._lang + \ '_filter_code'), current_indent) s += s2 if hasattr(gqi, 'filtercode'): s2, current_indent = self.indent_code(gqi.filtercode, current_indent) s += s2 if markstr is not None: s2, current_indent = self.indent_code(markstr, current_indent) s += s2 if unmarkstr is not None: s2, tail_indent = self.indent_code(unmarkstr, current_indent) self.unmark_code.append(s2) else: self.unmark_code.append('') # NO UNMARK CODE, SO JUST APPEND BLANK self.code.append(s) self.indent.append(current_indent) self.n += 1 return self # iadd MUST RETURN self!! _def_code = """ def %(name)s(self, dataGraph, dataMatch=None, queryMatch=None): \tif dataMatch is None: dataMatch={} \tself.dataMatch = dataMatch \tdataEdge = %(n)d * [None] \tself.dataEdge = dataEdge """ _yield_code = 'yield self.queryMatch\n' _end_code = '' def __str__(self): 'generate code for this query, as a string function definition' s = self._def_code % self for layer in self.code: # GENERATE ALL THE TRAVERSAL CODE s += layer # yield the result s2 = self.indent_code(self._yield_code, self.indent[-1])[0] s += s2 i = len(self.unmark_code) - 1 while i >= 0: # GENERATE THE UNMARKING CODE... s += self.unmark_code[i] s += self.next_code[i] s += self.end_code[i] i -= 1 s += self._end_code % self return s def run(self, dataGraph, *args, **kwargs): 'run the query, pre-compiling it if necessary' try: # JUST TRY RUNNING OUR FUNCTION: IT RETURNS AN ITERATOR return self._compiled[self.name](self, dataGraph, *args, **kwargs) except KeyError: self.compile() # Run it. return self._compiled[self.name](self, dataGraph, *args, **kwargs) def compile(self): 'compile using Python exec statement' exec str(self) in self._compiled # COMPILE OUR FUNCTION def find_distutils_lib(path='build'): 'locate the build/lib path where distutils builds modules' import os dirs = os.listdir('build') for d in dirs: if d[:4] == 'lib.': return path + '/' + d raise OSError((1, 'Unable to locate where distutils built your module!')) class GraphQueryPyrex(GraphQueryCompiler): 'compile a series of GraphQueryIterators into pyrex code, run them' #queryMatch = QueryMatchDescriptor() _lang = "_pyrex" # NO LANGUAGE STEM def __getitem__(self, key): 'return appropropriate code for accessing nodes/edges in data or query' if key == 'n': return self.n elif key == 'name': return self.name elif key == 'dataGraph': try: # CHECK IF QUERY EDGE USES A NON-DEFAULT DATA GRAPH queryEdge = self.gqi[self.n].queryGraph[self.gqi[self.n].\ fromNode][self.gqi[self.n].queryNode] dg = queryEdge['dataGraph'] return 'self.gqi[%d].dataGraph' % self.n except (TypeError, KeyError): return 'dataGraph' elif key == 'filter': return 'self.gqi[%d].filter' % self.n elif key == 'toQueryNode': return 'self.gqi[%d].queryNode' % self.n elif key == 'fromQueryNode': return 'self.gqi[%d].fromNode' % self.n if key[:2] == 'to': layer = self.queryLayerGraph[self.gqi[self.n].queryNode] elif key[:4] == 'from': layer = self.queryLayerGraph[self.gqi[self.n].fromNode] if key[-8:] == 'DataNode': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'dataNode%d' % layer.values()[0] if key[-8:] == 'DataEdge': # GET LAST LAYER, WHERE THIS EDGE CREATED return 'dataEdge%d' % layer.values()[-1] if key[-8:] == 'DataDict': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'cDict%d' % layer.values()[0] if key[-7:] == 'DataPtr': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'pDictEntry%d' % layer.values()[0] if key[-11:] == 'DataPtrCont': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'pGraphEntry%d' % layer.values()[0] if key[-11:] == 'DataCounter': # GET 1ST LAYER WHERE THIS NODE ASSIGNED return 'i%d' % layer.values()[0] if key == 'toDataNodeUnmatched': l = ['dataNode%d!=dataNode%d' % (self.queryLayerGraph[self.gqi[i].queryNode].values()[0], self.queryLayerGraph[self.gqi[self.n].queryNode].values()[0]) for i in range(self.n)] if len(l) > 0: return ' and '.join(l) else: return 'True' if key == 'dataNodeDefs': return ','.join(['dataNode%d' % i for i in range(self.n)]) if key == 'dataEdgeDefs': return ','.join(['dataEdge%d' % i for i in range(self.n)]) if key == 'dataDictDefs': return ','.join(['*cDict%d' % i for i in range(self.n)]) if key == 'dataPtrDefs': return ','.join(['*pDictEntry%d' % i for i in range(self.n)]) if key == 'dataPtrContDefs': return ','.join(['*pGraphEntry%d' % i for i in range(self.n)]) if key == 'dataCounterDefs': return ','.join(['i%d' % i for i in range(self.n)]) if key == 'dataCounterArgs': return ','.join(['int i%d' % i for i in range(self.n)]) if key == 'itaVector': return ','.join(['ita.vector[%d]' % i for i in range(self.n)]) if key == 'itaTuple': return ',\\\n'.join(['p_ita[%d]' % i for i in range(2 * self.n)]) if key == 'resultTuple': return ',\\\n'.join(['dataNode%d,dataEdge%d' % (self.queryLayerGraph[self.gqi[i].queryNode].values()[0], i) for i in range(self.n)]) if key == 'resultTuples': return ','.join(['(dataNode%d,dataEdge%d)' % (self.queryLayerGraph[self.gqi[i].queryNode].values()[0], i) for i in range(self.n)]) if key == 'level' or key == 'nEdges': return self.n if key == 'lastGenerator': return self.lastGenerator try: return getattr(self.gqi[self.n], key) except AttributeError: raise KeyError('%s not a valid GraphQueryPyrex key' % key) _def_code = """ cimport cdict cdef c_%(name)s(cdict.CGraphDict cgd, cdict.IntTupleArray ita, %(dataCounterArgs)s): \tcdef cdict.CGraph *dataGraph \tcdef cdict.CDict %(dataDictDefs)s \tcdef cdict.CDictEntry %(dataPtrDefs)s \tcdef cdict.CDictEntry *pd_temp \tcdef cdict.CGraphEntry %(dataPtrContDefs)s \tcdef cdict.CGraphEntry *p_temp \t#cdef int %(dataCounterDefs)s \tcdef int %(dataNodeDefs)s \tcdef int %(dataEdgeDefs)s \tcdef int *p_ita \tdataGraph = cgd.d \tp_ita = ita.data """ _yield_code = """ %(itaTuple)s = %(resultTuple)s p_ita = p_ita + 2 * %(nEdges)d ita.n = ita.n + 1 if ita.n >= ita.n_alloc: \tita.set_vector((%(dataCounterDefs)s), 1) \treturn """ #results.append((%(resultTuples)s))\n _end_code = """ \tita.isDone = 1 # COMPLETED THIS QUERY from pygr import cdict def %(name)s(self, g, int maxhit=1000, cdict.IntTupleArray ita=None, qml=None): \tif not isinstance(g, cdict.CGraphDict): \t\tg = cdict.CGraphDict(g, cdict.KeyIndex()) \tif ita is None: \t\tita = cdict.IntTupleArray(maxhit, %(nEdges)d, 2, %(lastGenerator)d) \tita.n = 0 \tc_%(name)s(g, ita, %(itaVector)s) # RUN THE QUERY \tif qml is not None: \t\tqml.matches = ita \t\treturn qml \telse: \t\treturn cdict.QueryMatchList(self, ita, g, %(name)s) """ def compile(self): 'compile using Pyrex, Distutils, and finally import!' import os try: # We need access to Pygr source code to access cgraph functions # in this module. pygrpath = os.environ['PYGRPATH'] except KeyError: raise OSError((1, """pyrex compilation requires access to pygr source. Please set the environment variable PYGRPATH to \ the top of the pygr source package.""")) if not os.access(pygrpath + '/pygr/cgraph.c', os.R_OK): raise OSError((1, """Unable to access %s/pygr/cgraph.c. Is PYGRPATH set to the top of the pygr source package?""" % pygrpath)) exit_status = os.system('cp %s/pygr/cgraph.c %s/pygr/cgraph.h \ %s/pygr/cdict.pxd .' % (pygrpath, pygrpath, pygrpath)) if exit_status != 0: # RUN THE PYREX COMPILER TO PRODUCE C raise OSError((exit_status, 'unable to copy source code to this directory.')) # Construct a unique name for the module. modulename = self.name + str(id(self)) myfile = file(modulename + '.pyx', 'w') # GENERATE PYREX CODE myfile.write(str(self)) # WRITE CODE myfile.close() exit_status = os.system('pyrexc %s.pyx' % (modulename)) if exit_status != 0: # RUN THE PYREX COMPILER TO PRODUCE C raise OSError((exit_status, 'pyrex compilation failed. Is \ pyrexc missing or not in your PATH?')) # Build the module using distutils. from distutils.core import setup, Extension module1 = Extension(modulename, sources=['cgraph.c', modulename + '.c']) setup(name=modulename, description='autogenerated by pygr.graphquery', ext_modules=[module1], script_args=['build']) # Find out where distutils put our built module. modulepath = find_distutils_lib() # Work around a nasty problem with Pyrex cimport - there is no way to # tell it the module is in a subdirectory! Here, 'from pygr cimport # cdict' or 'cimport pygr.cdict' fail; one MUST say 'cimport cdict'. import sys import os.path from pygr import cdict # Add the module's location to our path. sys.path += [os.path.dirname(cdict.__file__)] import imp # FINALLY, TRY TO IMPORT THE NEW MODULE modulefile, path, desc = imp.find_module(modulename, [modulepath]) # Load and bind the module. self._module = imp.load_module(modulename, modulefile, path, desc) # Bind our query function. self._compiled[self.name] = getattr(self._module, self.name) modulefile.close() class GraphQueryIterator(object): """iterator for a single node in graph query. Subclasses provide different flavors of generator methods: graph w/ edges; container; attr; function etc.""" def __init__(self, fromNode, queryNode, dataGraph, queryGraph, dataMatch, queryMatch, attrDict={}): self.fromNode = fromNode self.queryNode = queryNode self.dataGraph = dataGraph self.queryGraph = queryGraph self.dataMatch = dataMatch self.queryMatch = queryMatch self.dataNode = None for attr, val in attrDict.items(): # Save our edge information as attributes of this object. setattr(self, attr, val) ## try: ## self.nq = len(self.queryGraph[self.queryNode]) ## except KeyError: ## self.nq = 0 def restart(self): "reset the iterator to its beginning" self.mustMark = True if self.fromNode != None: self.dataNode = self.queryMatch[self.fromNode] if self.queryNode in self.queryMatch: # ALREADY ASSIGNED TO A DATA NODE self.mustMark = False if self.fromNode is None: # NO PATH TO HERE, SO JUST ECHO SINGLETON self.iterator = self.echo() else: # CHECK FOR PATH FROM fromNode TO THIS DATA NODE self.iterator = self.closure() else: self.iterator = self.generate() def echo(self): "Just return what our node is ALREADY matched to" yield self.queryMatch[self.queryNode], None def closure(self): "This node is already matched. Make sure a path to it (closure) exists" targetNode = self.queryMatch[self.queryNode] try: # GENERATE IF container HAS EDGE TO targetNode container = self.dataGraph[self.dataNode] yield targetNode, container[targetNode] except KeyError: pass def generate(self): "generate all neighbors of data node matched to fromNode" try: it = self.dataGraph[self.dataNode] except KeyError: pass else: for i, e in it.items(): yield i, e _generator_code = """ try: # GENERATOR \tit%(level)d = %(dataGraph)s[%(fromDataNode)s] except KeyError: \tcontinue for %(toDataNode)s, %(toDataEdge)s in it%(level)d.items():""" _index_code = """ if %(toDataNode)s in dataMatch: \tcontinue else: \tdataMatch[%(toDataNode)s] = %(toQueryNode)s \t#queryMatch[%(toQueryNode)s] = %(toDataNode)s \t#queryMatch[%(fromQueryNode)s, %(toQueryNode)s] = %(toDataEdge)s # THIS LINE PREVENTS COMPILER FROM PUSHING EXTRA INDENTATION LAYER""" _filter_code = """ if self.gqi[%(level)d].filter(toNode=%(toDataNode)s, fromNode=%(fromDataNode)s, \ edge=%(toDataEdge)s, queryMatch=self.queryMatch, \ gqi=self.gqi[%(level)d]):""" _unmark_code = """ del dataMatch[%(toDataNode)s] #del queryMatch[%(toQueryNode)s] #del queryMatch[%(fromQueryNode)s, %(toQueryNode)s]""" _closure_code = """ try: # CLOSURE \t%(toDataEdge)s = %(dataGraph)s[%(fromDataNode)s][%(toDataNode)s] except KeyError: \tpass else: \t#queryMatch[%(fromQueryNode)s, %(toQueryNode)s] = %(toDataEdge)s""" _unmark_closure_code = """ #del queryMatch[%(fromQueryNode)s, %(toQueryNode)s]""" # PYREX CODE _pyrex_generator_code = """ p_temp = cdict.cgraph_getitem(%(dataGraph)s, %(fromDataNode)s) if p_temp != NULL: \t%(fromDataDict)s = p_temp[0].v \t%(toDataPtr)s = %(fromDataDict)s[0].dict \twhile %(toDataCounter)s < %(fromDataDict)s[0].n: \t\t%(toDataNode)s = %(toDataPtr)s[%(toDataCounter)s].k \t\t%(toDataEdge)s = %(toDataPtr)s[%(toDataCounter)s].v """ #for %(toDataCounter)s from 0 <= %(toDataCounter)s < %(fromDataDict)s[0].n: _pyrex_index_code = 'if %(toDataNodeUnmatched)s:' _pyrex_unmark_code = '# COMPILER NEEDS AT LEAST ONE LINE, \ EVEN THOUGH NOTHING TO DO HERE' _pyrex_next_code = '%(toDataCounter)s = %(toDataCounter)s + 1' _pyrex_end_code = '%(toDataCounter)s = 0' _pyrex_closure_code = """ p_temp = cdict.cgraph_getitem(%(dataGraph)s, %(fromDataNode)s) if p_temp != NULL: \t%(fromDataDict)s = p_temp[0].v \tpd_temp = cdict.cdict_getitem(%(fromDataDict)s, %(toDataNode)s) \tif pd_temp != NULL: \t\t%(toDataEdge)s = pd_temp[0].v """ _pyrex_unmark_closure_code = '# COMPILER NEEDS AT LEAST ONE LINE, \ EVEN THOUGH NOTHING TO DO HERE' def unmark(self): "erase node and edge assignment associated with the iterator" if self.mustMark and self.queryNode in self.queryMatch: i = self.queryMatch[self.queryNode] # ERASE OLD NODE ASSIGNMENT del self.dataMatch[i] del self.queryMatch[self.queryNode] try: # Erase old edge. del self.queryMatch[(self.fromNode, self.queryNode)] except KeyError: pass def next(self): "returns the next node from iterator that passes all tests" self.unmark() for i, e in self.iterator: # RETURN THE FIRST ACCEPTABLE ITEM ## try: ## # Check the number of outgoing edges. NOTE: This check ## # will NOT work if multiple graphs are queried! ## nd = len(self.dataGraph[i]) ## except KeyError: ## nd = 0 ## if nd >= self.nq and if self.mustMark and i in self.dataMatch: continue # THIS NODE ALREADY ASSIGNED. CAN'T REUSE IT! if (not hasattr(self, 'filter') # APPLY EDGE / NODE TESTS HERE or self.filter(toNode=i, fromNode=self.dataNode, edge=e, queryMatch=self.queryMatch, gqi=self)): if self.mustMark: # Save this node assignment. self.dataMatch[i] = self.queryNode self.queryMatch[self.queryNode] = i if e is not None: # SAVE EDGE INFO, IF ANY self.queryMatch[(self.fromNode, self.queryNode)] = e return i # THIS ITEM PASSES ALL TESTS. RETURN IT return None # NO MORE ITEMS FROM THE ITERATOR class ContainerGQI(GraphQueryIterator): "Iterate over all nodes in self.dataGraph" def generate(self): for i in self.dataGraph: yield i, None _generator_code = """ %(toDataEdge)s = None # CONTAINER for %(toDataNode)s in dataGraph:""" _pyrex_generator_code=""" %(toDataPtrCont)s = %(dataGraph)s[0].dict for %(toDataCounter)s from 0 <= %(toDataCounter)s < %(dataGraph)s[0].n: \t%(toDataNode)s = %(toDataPtrCont)s[%(toDataCounter)s].k \t%(toDataEdge)s = -1 # NO EDGE INFO """ class AttributeGQI(GraphQueryIterator): "Iterate over all nodes in attribute called self.attr of self.dataNode" def generate(self): for i, e in getattr(self.dataNode, self.attr).items(): yield i, e _generator_code = """ for %(toDataNode)s, %(toDataEdge)s in getattr(%(fromDataNode)s, \ '%(attr)s').items():""" class AttrContainerGQI(GraphQueryIterator): """Iterate over all nodes in attribute called self.attrN of self.dataNode (no edge info)""" def generate(self): for i in getattr(self.dataNode, self.attrN): yield i, None _generator_code = """ %(toDataEdge)s = None for %(toDataNode)s in getattr(%(fromDataNode)s, '%(attrN)s'):""" class CallableGQI(GraphQueryIterator): "Call the specified function self.f as iterator" def generate(self): for i, e in self.f(self.dataNode, self.dataGraph, self): yield i, e _generator_code = """ for %(toDataNode)s, %(toDataEdge)s in self.gqi[%(level)d].f(%(fromDataNode)s, \ dataGraph, self.gqi[%(level)d]):""" class CallableContainerGQI(GraphQueryIterator): "Call the specified function self.fN as iterator (no edge info)" def generate(self): for i in self.fN(self.dataNode, self.dataGraph, self): yield i, None _generator_code = """ %(toDataEdge)s = None for %(toDataNode)s in self.gqi[%(level)d].fN(%(fromDataNode)s, dataGraph, \ self.gqi[%(level)d]):""" class SubqueryGQI(GraphQueryIterator): """base class for running subqueries; produces a union of all subquery solutions. self.subqueries must be list of graph objects, each representing a subquery""" def __init__(self, fromNode, queryNode, dataGraph, queryGraph, dataMatch, queryMatch, attrDict={}): GraphQueryIterator.__init__(self, fromNode, queryNode, dataGraph, queryGraph, dataMatch, queryMatch, attrDict) self.graphQueries = [] for qg in self.subqueries: # INITIALIZE OUR SUBQUERIES self.graphQueries.append(self.gqClass(self.dataGraph, qg, dataMatch, queryMatch)) def closure(self): "Generate union of all solutions returned by all subqueries" for gq in self.graphQueries: for d in gq: # LAUNCHES THE GRAPH QUERY, GETS ALL ITS SOLUTIONS yield self.queryMatch[self.queryNode], None # Remove its query-data mapping before going to the next subquery. gq.cleanup() def newGQI(self, oclass, fromNode, toNode, dataGraph, queryGraph, dataMatch, queryMatch, gqiDict): """figure out a default GQI class to use, based on an attribute dictionary, then return a new object of that class initialized with the input data """ if fromNode is not None and toNode is not None and \ queryGraph[fromNode][toNode] is not None: kwargs = queryGraph[fromNode][toNode] for attr in kwargs: try: # Use attribute name to determine default class. oclass = gqiDict[attr] except KeyError: pass else: kwargs = {} try: oclass = kwargs['__class__'] # LET USER SET CLASS TO USE except KeyError: pass return oclass(fromNode, toNode, dataGraph, queryGraph, dataMatch, queryMatch, kwargs) class GraphQuery(object): "represents a single query or subquery" # DEFAULT MAPPING OF ATTRIBUTE NAMES TO GQI CLASSES TO USE WITH THEM gqiDict = {'attr': AttributeGQI, 'attrN': AttrContainerGQI, 'f': CallableGQI, 'fN': CallableContainerGQI, 'subqueries': SubqueryGQI} newGQI = newGQI # USE THIS METHOD TO CHOOSE GQI CLASS FOR EACH ITERATOR def __init__(self, dataGraph, queryGraph, dataMatch=None, queryMatch=None): """Enumerate nodes in queryGraph in BFS order, constructing iterator stack""" self.dataGraph = dataGraph self.queryGraph = queryGraph if dataMatch is None: dataMatch = {} if queryMatch is None: queryMatch = {} self.dataMatch = dataMatch self.queryMatch = queryMatch # First we need to find start nodes: process them first and mark them # as generate all. isFollower = {} for node in queryGraph: for node2 in queryGraph[node]: # node2 has an incoming edge so it cannot be a start node. isFollower[node2] = True q = [] self.q = q n = 0 for node in queryGraph: # PLACE START NODES AT HEAD OF QUEUE if node not in isFollower: q.append(self.newGQI(ContainerGQI, None, node, dataGraph, queryGraph, dataMatch, queryMatch, self.gqiDict)) n += 1 if n == 0: # No start nodes; just add the first query node to the queue. for node in queryGraph: q.append(self.newGQI(ContainerGQI, None, node, dataGraph, queryGraph, dataMatch, queryMatch, self.gqiDict)) n += 1 break # Only add the first node. if n == 0: raise ValueError('query graph is empty!') visited = {} i = 0 while i < n: # Add node to the queue even if it's already been visited # - but don't add its neighbours. if q[i].queryNode not in visited: # ADD NEIGHBORS TO THE QUEUE visited[q[i].queryNode] = True # MARK AS VISITED for node in queryGraph[q[i].queryNode]: # GET ALL ITS NEIGHBORS #print 'QUEUE:', n, node q.append(self.newGQI(GraphQueryIterator, q[i].queryNode, node, dataGraph, queryGraph, dataMatch, queryMatch, self.gqiDict)) n += 1 i += 1 def __iter__(self): "generates all subgraphs of dataGraph matching queryGraph" i = 0 n = len(self.q) self.q[0].restart() # PRELOAD ITERATOR FOR 1ST NODE while i >= 0: dataNode = self.q[i].next() if dataNode is not None: #print i,qu[i].queryNode,dataNode if i + 1 < n: # MORE LEVELS TO QUERY? i += 1 # ADVANCE TO NEXT QUERY LEVEL self.q[i].restart() else: # GRAPH MATCH IS COMPLETE! yield self.queryMatch # RETURN COMPLETE MATCH else: # NO MORE ACCEPTABLE NODES AT THIS LEVEL, SO BACKTRACK i -= 1 def cleanup(self): "erase any query:data node matching associated with this subquery" for q in self.q: q.unmark() def compile(self, globals=None, compilerClass=GraphQueryCompiler, **kwargs): """return a compiled version of this query, using globals namespace if specified""" compiler = compilerClass(globalDict=globals, **kwargs) for gqi in self.q: compiler += gqi return compiler SubqueryGQI.gqClass = GraphQuery # CLASS FOR CONSTRUCTING SUBQUERIES PKðŠ’;i7%,‡‡pygr/graphquery.pyc;ò |†Kc@sTdklZdkTdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd „ƒYZd d „Z d efd „ƒYZ defd„ƒYZ de fd„ƒYZ de fd„ƒYZ de fd„ƒYZde fd„ƒYZde fd„ƒYZde fd„ƒYZd„Zdefd„ƒYZee_dS( (s generators(s*sQueryMatchWrappercBstZdZd„ZRS(s^build a queryMatch mapping on demand, since its not actually needed during query traversalcCs|ti|ƒx$|iƒD]\}}|||s            cCs |djo |iSnì|djo |iSnÔ|djor|i|ii|i|ii|i|ii}y|d}d|iSWqt t fj o dSqXnU|djod|iSn9|djod|iSn|d jod |iSn|d d jo|i |i|ii}n0|d djo|i |i|ii}n|ddjod|iƒdSn|ddjod|iƒdSn|djo |iSnyt|i|i|ƒSWn#tj ot d|ƒ‚nXdS(sEreturn appropropriate code for accessing nodes/edges in data or querysnsnames dataGraphsself.gqi[%d].dataGraphsfiltersself.gqi[%d].filters toQueryNodesself.gqi[%d].queryNodes fromQueryNodesself.gqi[%d].fromNodeistoisfromiøÿÿÿsDataNodes dataNode%disDataEdges dataEdge[%d]iÿÿÿÿslevels%%s not a valid GraphQueryCompiler keyN(skeysselfsnsnamesgqis queryGraphsfromNodes queryNodes queryEdgesdgs TypeErrorsKeyErrorsqueryLayerGraphslayersvaluessgetattrsAttributeError(sselfskeyslayersdgs queryEdge((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys __getitem__Ns@     5       cCsÛ||}|idƒ}|d}|djot|ƒdjo|d}nt|idƒƒd}t|ƒdjo|ddjo|d7}nd}x$|D]}||d|d7}q©W|||fSd S( s5calculate indentation levels added by code in codestrs iÿÿÿÿsiiþÿÿÿs is:N( scodestrsselfssplitslinesslastlineslensnindentssslinescurrent_indent(sselfscodestrscurrent_indentslinesssslastlinesnindentsline((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys indent_codeqs   $c Csb|ii|ƒ|i|ijoÐ|i|i7_t||idƒ}t||idƒ}t||idƒ} yt||idƒ}Wnt j o d}nXyt||idƒ}Wnt j o d}nX|i |_nŸt||idƒ}t}t||idƒ} yt||id ƒ}Wnt j o d}nXyt||id ƒ}Wnt j o d}nX|i |i|i|i~ƒSn|d9jp |d:jo |iSn|d;jo |iSnyt|i|i|ƒSWn#tj ot d<|ƒ‚nXd=S(>sEreturn appropropriate code for accessing nodes/edges in data or querysnsnames dataGraphsself.gqi[%d].dataGraphsfiltersself.gqi[%d].filters toQueryNodesself.gqi[%d].queryNodes fromQueryNodesself.gqi[%d].fromNodeistoisfromiøÿÿÿsDataNodes dataNode%disDataEdges dataEdge%diÿÿÿÿsDataDictscDict%diùÿÿÿsDataPtrs pDictEntry%diõÿÿÿs DataPtrConts pGraphEntry%ds DataCountersi%dstoDataNodeUnmatchedsdataNode%d!=dataNode%ds and sTrues dataNodeDefss,s dataEdgeDefss dataDictDefss*cDict%ds dataPtrDefss *pDictEntry%dsdataPtrContDefss*pGraphEntry%dsdataCounterDefssdataCounterArgssint i%ds itaVectorsita.vector[%d]sitaTuples,\ s p_ita[%d]s resultTuplesdataNode%d,dataEdge%ds resultTupless(dataNode%d,dataEdge%d)slevelsnEdgess lastGenerators"%s not a valid GraphQueryPyrex keyN(skeysselfsnsnamesgqis queryGraphsfromNodes queryNodes queryEdgesdgs TypeErrorsKeyErrorsqueryLayerGraphslayersvaluessappends_[1]srangesislslensjoins lastGeneratorsgetattrsAttributeError(sselfskeyslayersisdgsls_[1]s queryEdge((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys __getitem__ôsŠ     5      s ? ? ? ? ? ? ? ? C ` `   s× cimport cdict cdef c_%(name)s(cdict.CGraphDict cgd, cdict.IntTupleArray ita, %(dataCounterArgs)s): cdef cdict.CGraph *dataGraph cdef cdict.CDict %(dataDictDefs)s cdef cdict.CDictEntry %(dataPtrDefs)s cdef cdict.CDictEntry *pd_temp cdef cdict.CGraphEntry %(dataPtrContDefs)s cdef cdict.CGraphEntry *p_temp #cdef int %(dataCounterDefs)s cdef int %(dataNodeDefs)s cdef int %(dataEdgeDefs)s cdef int *p_ita dataGraph = cgd.d p_ita = ita.data sœ %(itaTuple)s = %(resultTuple)s p_ita = p_ita + 2 * %(nEdges)d ita.n = ita.n + 1 if ita.n >= ita.n_alloc: ita.set_vector((%(dataCounterDefs)s), 1) return sí ita.isDone = 1 # COMPLETED THIS QUERY from pygr import cdict def %(name)s(self, g, int maxhit=1000, cdict.IntTupleArray ita=None, qml=None): if not isinstance(g, cdict.CGraphDict): g = cdict.CGraphDict(g, cdict.KeyIndex()) if ita is None: ita = cdict.IntTupleArray(maxhit, %(nEdges)d, 2, %(lastGenerator)d) ita.n = 0 c_%(name)s(g, ita, %(itaVector)s) # RUN THE QUERY if qml is not None: qml.matches = ita return qml else: return cdict.QueryMatchList(self, ita, g, %(name)s) c CsAdk}y|id} Wn%tj otddfƒ‚nX|i| d|iƒ otdd| fƒ‚n|id| | | fƒ}|djot|d fƒ‚n|i t t |ƒƒ}t|d d ƒ} | it |ƒƒ| iƒ|id |ƒ}|djot|d fƒ‚ndkl} l}||dd|dgƒ}| d|ddd|gddgƒtƒ}dk}dk}dkl}|i|ii|iƒg7_dk}|i ||gƒ\}} } |i#||| | ƒ|_$t%|i$|i ƒ|i&|i <|iƒdS(s3compile using Pyrex, Distutils, and finally import!NsPYGRPATHis»pyrex compilation requires access to pygr source. Please set the environment variable PYGRPATH to the top of the pygr source package.s/pygr/cgraph.cseUnable to access %s/pygr/cgraph.c. Is PYGRPATH set to the top of the pygr source package?sXcp %s/pygr/cgraph.c %s/pygr/cgraph.h %s/pygr/cdict.pxd .is-unable to copy source code to this directory.s.pyxsws pyrexc %s.pyxs@pyrex compilation failed. Is pyrexc missing or not in your PATH?(ssetups Extensionssourcesscgraph.cs.csnames descriptions autogenerated by pygr.graphquerys ext_moduless script_argssbuild(scdict('sossenvironspygrpathsKeyErrorsOSErrorsaccesssR_OKssystems exit_statussselfsnamesstrsids modulenamesfilesmyfileswritesclosesdistutils.coressetups Extensionsmodule1sfind_distutils_libs modulepathssyssos.pathspygrscdictspathsdirnames__file__simps find_modules modulefilesdescs load_modules_modulesgetattrs _compiled(sselfs modulenames exit_statuss modulefiles modulepathsmodule1simps Extensionssysspathsdescspygrpathssetupsmyfilesosscdict((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pyscompilepsB         ! ( s__name__s __module__s__doc__s_langs __getitem__s _def_codes _yield_codes _end_codescompile(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysGraphQueryPyrexïs  P sGraphQueryIteratorcBsžtZdZhd„Zd„Zd„Zd„Zd„ZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZd„Zd„ZRS(s£iterator for a single node in graph query. Subclasses provide different flavors of generator methods: graph w/ edges; container; attr; function etc.c Csp||_||_||_||_||_||_t|_x*|i ƒD]\}} t ||| ƒqLWdS(N(sfromNodesselfs queryNodes dataGraphs queryGraphs dataMatchs queryMatchsNonesdataNodesattrDictsitemssattrsvalssetattr( sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDictsattrsval((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys__init__®s        cCs•t|_|itjo|i|i|_n|i|ijo?t|_|itjo|i ƒ|_ q‘|i ƒ|_ n|i ƒ|_ dS(s#reset the iterator to its beginningN( sTruesselfsmustMarksfromNodesNones queryMatchsdataNodes queryNodesFalsesechositeratorsclosuresgenerate(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysrestart¿s  ccs|i|itfVdS(s/Just return what our node is ALREADY matched toN(sselfs queryMatchs queryNodesNone(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysechoÍsccsL|i|i}y"|i|i}|||fVWntj onXdS(sEThis node is already matched. Make sure a path to it (closure) existsN(sselfs queryMatchs queryNodes targetNodes dataGraphsdataNodes containersKeyError(sselfs targetNodes container((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysclosureÑsccsUy|i|i}Wntj on)Xx$|iƒD]\}}||fVq7WdS(s7generate all neighbors of data node matched to fromNodeN(sselfs dataGraphsdataNodesitsKeyErrorsitemssise(sselfsisesit((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysgenerateÚs s– try: # GENERATOR it%(level)d = %(dataGraph)s[%(fromDataNode)s] except KeyError: continue for %(toDataNode)s, %(toDataEdge)s in it%(level)d.items():s if %(toDataNode)s in dataMatch: continue else: dataMatch[%(toDataNode)s] = %(toQueryNode)s #queryMatch[%(toQueryNode)s] = %(toDataNode)s #queryMatch[%(fromQueryNode)s, %(toQueryNode)s] = %(toDataEdge)s # THIS LINE PREVENTS COMPILER FROM PUSHING EXTRA INDENTATION LAYERs× if self.gqi[%(level)d].filter(toNode=%(toDataNode)s, fromNode=%(fromDataNode)s, edge=%(toDataEdge)s, queryMatch=self.queryMatch, gqi=self.gqi[%(level)d]):ss del dataMatch[%(toDataNode)s] #del queryMatch[%(toQueryNode)s] #del queryMatch[%(fromQueryNode)s, %(toQueryNode)s]s° try: # CLOSURE %(toDataEdge)s = %(dataGraph)s[%(fromDataNode)s][%(toDataNode)s] except KeyError: pass else: #queryMatch[%(fromQueryNode)s, %(toQueryNode)s] = %(toDataEdge)ss4 #del queryMatch[%(fromQueryNode)s, %(toQueryNode)s]s; p_temp = cdict.cgraph_getitem(%(dataGraph)s, %(fromDataNode)s) if p_temp != NULL: %(fromDataDict)s = p_temp[0].v %(toDataPtr)s = %(fromDataDict)s[0].dict while %(toDataCounter)s < %(fromDataDict)s[0].n: %(toDataNode)s = %(toDataPtr)s[%(toDataCounter)s].k %(toDataEdge)s = %(toDataPtr)s[%(toDataCounter)s].v sif %(toDataNodeUnmatched)s:s\# COMPILER NEEDS AT LEAST ONE LINE, EVEN THOUGH NOTHING TO DO HEREs)%(toDataCounter)s = %(toDataCounter)s + 1s%(toDataCounter)s = 0sé p_temp = cdict.cgraph_getitem(%(dataGraph)s, %(fromDataNode)s) if p_temp != NULL: %(fromDataDict)s = p_temp[0].v pd_temp = cdict.cdict_getitem(%(fromDataDict)s, %(toDataNode)s) if pd_temp != NULL: %(toDataEdge)s = pd_temp[0].v sd# COMPILER NEEDS AT LEAST ONE LINE, EVEN THOUGH NOTHING TO DO HEREcCs||io|i|ijo+|i|i}|i|=|i|i=ny|i|i|if=Wntj onXdS(s;erase node and edge assignment associated with the iteratorN(sselfsmustMarks queryNodes queryMatchsis dataMatchsfromNodesKeyError(sselfsi((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysunmark*s c Csï|iƒxÚ|iD]Ï\}}|io ||ijoqnt|dƒ p.|id|d|i d|d|i d|ƒo`|io$|i |i|<||i |i Call the specified function self.fN as iterator (no edge info)ccs4x-|i|i|i|ƒD]}|tfVqWdS(N(sselfsfNsdataNodes dataGraphsisNone(sselfsi((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysgenerate‹ss£ %(toDataEdge)s = None for %(toDataNode)s in self.gqi[%(level)d].fN(%(fromDataNode)s, dataGraph, self.gqi[%(level)d]):(s__name__s __module__s__doc__sgenerates_generator_code(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysCallableContainerGQIˆs  s SubqueryGQIcBs#tZdZhd„Zd„ZRS(s¢base class for running subqueries; produces a union of all subquery solutions. self.subqueries must be list of graph objects, each representing a subqueryc Cshti||||||||ƒg|_ x6|i D]+}|i i |i|i|||ƒƒq5WdS(N(sGraphQueryIterators__init__sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDicts graphQueriess subqueriessqgsappendsgqClass( sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDictsqg((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys__init__šs   ccsGx@|iD]5}x"|D]}|i|itfVqW|iƒq WdS(s:Generate union of all solutions returned by all subqueriesN(sselfs graphQueriessgqsds queryMatchs queryNodesNonescleanup(sselfsdsgq((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysclosure¤s (s__name__s __module__s__doc__s__init__sclosure(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys SubqueryGQI•s  c CsÀ|tj o|tj o|||tj oG|||} x<| D]*} y|| }WqDtj oqDXqDWnh} y| d}Wntj onX|||||||| ƒSdS(sžfigure out a default GQI class to use, based on an attribute dictionary, then return a new object of that class initialized with the input data s __class__N( sfromNodesNonestoNodes queryGraphskwargssattrsgqiDictsoclasssKeyErrors dataGraphs dataMatchs queryMatch( sselfsoclasssfromNodestoNodes dataGraphs queryGraphs dataMatchs queryMatchsgqiDictsattrskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysnewGQI­s / s GraphQuerycBswtZdZhde<de<de<de<des            cCs |djo |iSnì|djo |iSnÔ|djor|i|ii|i|ii|i|ii}y|d}d|iSWqt t fj o dSqXnU|djod|iSn9|djod|iSn|d jod |iSn|d d jo|i |i|ii}n0|d djo|i |i|ii}n|ddjod|iƒdSn|ddjod|iƒdSn|djo |iSnyt|i|i|ƒSWn#tj ot d|ƒ‚nXdS(sEreturn appropropriate code for accessing nodes/edges in data or querysnsnames dataGraphsself.gqi[%d].dataGraphsfiltersself.gqi[%d].filters toQueryNodesself.gqi[%d].queryNodes fromQueryNodesself.gqi[%d].fromNodeistoisfromiøÿÿÿsDataNodes dataNode%disDataEdges dataEdge[%d]iÿÿÿÿslevels%%s not a valid GraphQueryCompiler keyN(skeysselfsnsnamesgqis queryGraphsfromNodes queryNodes queryEdgesdgs TypeErrorsKeyErrorsqueryLayerGraphslayersvaluessgetattrsAttributeError(sselfskeyslayersdgs queryEdge((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys __getitem__Ns@     5       cCsÛ||}|idƒ}|d}|djot|ƒdjo|d}nt|idƒƒd}t|ƒdjo|ddjo|d7}nd}x$|D]}||d|d7}q©W|||fSd S( s5calculate indentation levels added by code in codestrs iÿÿÿÿsiiþÿÿÿs is:N( scodestrsselfssplitslinesslastlineslensnindentssslinescurrent_indent(sselfscodestrscurrent_indentslinesssslastlinesnindentsline((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys indent_codeqs   $c Csb|ii|ƒ|i|ijoÐ|i|i7_t||idƒ}t||idƒ}t||idƒ} yt||idƒ}Wnt j o d}nXyt||idƒ}Wnt j o d}nX|i |_nŸt||idƒ}t}t||idƒ} yt||id ƒ}Wnt j o d}nXyt||id ƒ}Wnt j o d}nX|i |i|i|i~ƒSn|d9jp |d:jo |iSn|d;jo |iSnyt|i|i|ƒSWn#tj ot d<|ƒ‚nXd=S(>sEreturn appropropriate code for accessing nodes/edges in data or querysnsnames dataGraphsself.gqi[%d].dataGraphsfiltersself.gqi[%d].filters toQueryNodesself.gqi[%d].queryNodes fromQueryNodesself.gqi[%d].fromNodeistoisfromiøÿÿÿsDataNodes dataNode%disDataEdges dataEdge%diÿÿÿÿsDataDictscDict%diùÿÿÿsDataPtrs pDictEntry%diõÿÿÿs DataPtrConts pGraphEntry%ds DataCountersi%dstoDataNodeUnmatchedsdataNode%d!=dataNode%ds and sTrues dataNodeDefss,s dataEdgeDefss dataDictDefss*cDict%ds dataPtrDefss *pDictEntry%dsdataPtrContDefss*pGraphEntry%dsdataCounterDefssdataCounterArgssint i%ds itaVectorsita.vector[%d]sitaTuples,\ s p_ita[%d]s resultTuplesdataNode%d,dataEdge%ds resultTupless(dataNode%d,dataEdge%d)slevelsnEdgess lastGenerators"%s not a valid GraphQueryPyrex keyN(skeysselfsnsnamesgqis queryGraphsfromNodes queryNodes queryEdgesdgs TypeErrorsKeyErrorsqueryLayerGraphslayersvaluessappends_[1]srangesislslensjoins lastGeneratorsgetattrsAttributeError(sselfskeyslayersisdgsls_[1]s queryEdge((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys __getitem__ôsŠ     5      s ? ? ? ? ? ? ? ? C ` `   s× cimport cdict cdef c_%(name)s(cdict.CGraphDict cgd, cdict.IntTupleArray ita, %(dataCounterArgs)s): cdef cdict.CGraph *dataGraph cdef cdict.CDict %(dataDictDefs)s cdef cdict.CDictEntry %(dataPtrDefs)s cdef cdict.CDictEntry *pd_temp cdef cdict.CGraphEntry %(dataPtrContDefs)s cdef cdict.CGraphEntry *p_temp #cdef int %(dataCounterDefs)s cdef int %(dataNodeDefs)s cdef int %(dataEdgeDefs)s cdef int *p_ita dataGraph = cgd.d p_ita = ita.data sœ %(itaTuple)s = %(resultTuple)s p_ita = p_ita + 2 * %(nEdges)d ita.n = ita.n + 1 if ita.n >= ita.n_alloc: ita.set_vector((%(dataCounterDefs)s), 1) return sí ita.isDone = 1 # COMPLETED THIS QUERY from pygr import cdict def %(name)s(self, g, int maxhit=1000, cdict.IntTupleArray ita=None, qml=None): if not isinstance(g, cdict.CGraphDict): g = cdict.CGraphDict(g, cdict.KeyIndex()) if ita is None: ita = cdict.IntTupleArray(maxhit, %(nEdges)d, 2, %(lastGenerator)d) ita.n = 0 c_%(name)s(g, ita, %(itaVector)s) # RUN THE QUERY if qml is not None: qml.matches = ita return qml else: return cdict.QueryMatchList(self, ita, g, %(name)s) c CsAdk}y|id} Wn%tj otddfƒ‚nX|i| d|iƒ otdd| fƒ‚n|id| | | fƒ}|djot|d fƒ‚n|i t t |ƒƒ}t|d d ƒ} | it |ƒƒ| iƒ|id |ƒ}|djot|d fƒ‚ndkl} l}||dd|dgƒ}| d|ddd|gddgƒtƒ}dk}dk}dkl}|i|ii|iƒg7_dk}|i ||gƒ\}} } |i#||| | ƒ|_$t%|i$|i ƒ|i&|i <|iƒdS(s3compile using Pyrex, Distutils, and finally import!NsPYGRPATHis»pyrex compilation requires access to pygr source. Please set the environment variable PYGRPATH to the top of the pygr source package.s/pygr/cgraph.cseUnable to access %s/pygr/cgraph.c. Is PYGRPATH set to the top of the pygr source package?sXcp %s/pygr/cgraph.c %s/pygr/cgraph.h %s/pygr/cdict.pxd .is-unable to copy source code to this directory.s.pyxsws pyrexc %s.pyxs@pyrex compilation failed. Is pyrexc missing or not in your PATH?(ssetups Extensionssourcesscgraph.cs.csnames descriptions autogenerated by pygr.graphquerys ext_moduless script_argssbuild(scdict('sossenvironspygrpathsKeyErrorsOSErrorsaccesssR_OKssystems exit_statussselfsnamesstrsids modulenamesfilesmyfileswritesclosesdistutils.coressetups Extensionsmodule1sfind_distutils_libs modulepathssyssos.pathspygrscdictspathsdirnames__file__simps find_modules modulefilesdescs load_modules_modulesgetattrs _compiled(sselfs modulenames exit_statuss modulefiles modulepathsmodule1simps Extensionssysspathsdescspygrpathssetupsmyfilesosscdict((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pyscompilepsB         ! ( s__name__s __module__s__doc__s_langs __getitem__s _def_codes _yield_codes _end_codescompile(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysGraphQueryPyrexïs  P sGraphQueryIteratorcBsžtZdZhd„Zd„Zd„Zd„Zd„ZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZd„Zd„ZRS(s£iterator for a single node in graph query. Subclasses provide different flavors of generator methods: graph w/ edges; container; attr; function etc.c Csp||_||_||_||_||_||_t|_x*|i ƒD]\}} t ||| ƒqLWdS(N(sfromNodesselfs queryNodes dataGraphs queryGraphs dataMatchs queryMatchsNonesdataNodesattrDictsitemssattrsvalssetattr( sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDictsattrsval((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys__init__®s        cCs•t|_|itjo|i|i|_n|i|ijo?t|_|itjo|i ƒ|_ q‘|i ƒ|_ n|i ƒ|_ dS(s#reset the iterator to its beginningN( sTruesselfsmustMarksfromNodesNones queryMatchsdataNodes queryNodesFalsesechositeratorsclosuresgenerate(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysrestart¿s  ccs|i|itfVdS(s/Just return what our node is ALREADY matched toN(sselfs queryMatchs queryNodesNone(sself((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysechoÍsccsL|i|i}y"|i|i}|||fVWntj onXdS(sEThis node is already matched. Make sure a path to it (closure) existsN(sselfs queryMatchs queryNodes targetNodes dataGraphsdataNodes containersKeyError(sselfs targetNodes container((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysclosureÑsccsUy|i|i}Wntj on)Xx$|iƒD]\}}||fVq7WdS(s7generate all neighbors of data node matched to fromNodeN(sselfs dataGraphsdataNodesitsKeyErrorsitemssise(sselfsisesit((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysgenerateÚs s– try: # GENERATOR it%(level)d = %(dataGraph)s[%(fromDataNode)s] except KeyError: continue for %(toDataNode)s, %(toDataEdge)s in it%(level)d.items():s if %(toDataNode)s in dataMatch: continue else: dataMatch[%(toDataNode)s] = %(toQueryNode)s #queryMatch[%(toQueryNode)s] = %(toDataNode)s #queryMatch[%(fromQueryNode)s, %(toQueryNode)s] = %(toDataEdge)s # THIS LINE PREVENTS COMPILER FROM PUSHING EXTRA INDENTATION LAYERs× if self.gqi[%(level)d].filter(toNode=%(toDataNode)s, fromNode=%(fromDataNode)s, edge=%(toDataEdge)s, queryMatch=self.queryMatch, gqi=self.gqi[%(level)d]):ss del dataMatch[%(toDataNode)s] #del queryMatch[%(toQueryNode)s] #del queryMatch[%(fromQueryNode)s, %(toQueryNode)s]s° try: # CLOSURE %(toDataEdge)s = %(dataGraph)s[%(fromDataNode)s][%(toDataNode)s] except KeyError: pass else: #queryMatch[%(fromQueryNode)s, %(toQueryNode)s] = %(toDataEdge)ss4 #del queryMatch[%(fromQueryNode)s, %(toQueryNode)s]s; p_temp = cdict.cgraph_getitem(%(dataGraph)s, %(fromDataNode)s) if p_temp != NULL: %(fromDataDict)s = p_temp[0].v %(toDataPtr)s = %(fromDataDict)s[0].dict while %(toDataCounter)s < %(fromDataDict)s[0].n: %(toDataNode)s = %(toDataPtr)s[%(toDataCounter)s].k %(toDataEdge)s = %(toDataPtr)s[%(toDataCounter)s].v sif %(toDataNodeUnmatched)s:s\# COMPILER NEEDS AT LEAST ONE LINE, EVEN THOUGH NOTHING TO DO HEREs)%(toDataCounter)s = %(toDataCounter)s + 1s%(toDataCounter)s = 0sé p_temp = cdict.cgraph_getitem(%(dataGraph)s, %(fromDataNode)s) if p_temp != NULL: %(fromDataDict)s = p_temp[0].v pd_temp = cdict.cdict_getitem(%(fromDataDict)s, %(toDataNode)s) if pd_temp != NULL: %(toDataEdge)s = pd_temp[0].v sd# COMPILER NEEDS AT LEAST ONE LINE, EVEN THOUGH NOTHING TO DO HEREcCs||io|i|ijo+|i|i}|i|=|i|i=ny|i|i|if=Wntj onXdS(s;erase node and edge assignment associated with the iteratorN(sselfsmustMarks queryNodes queryMatchsis dataMatchsfromNodesKeyError(sselfsi((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysunmark*s c Csï|iƒxÚ|iD]Ï\}}|io ||ijoqnt|dƒ p.|id|d|i d|d|i d|ƒo`|io$|i |i|<||i |i Call the specified function self.fN as iterator (no edge info)ccs4x-|i|i|i|ƒD]}|tfVqWdS(N(sselfsfNsdataNodes dataGraphsisNone(sselfsi((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysgenerate‹ss£ %(toDataEdge)s = None for %(toDataNode)s in self.gqi[%(level)d].fN(%(fromDataNode)s, dataGraph, self.gqi[%(level)d]):(s__name__s __module__s__doc__sgenerates_generator_code(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysCallableContainerGQIˆs  s SubqueryGQIcBs#tZdZhd„Zd„ZRS(s¢base class for running subqueries; produces a union of all subquery solutions. self.subqueries must be list of graph objects, each representing a subqueryc Cshti||||||||ƒg|_ x6|i D]+}|i i |i|i|||ƒƒq5WdS(N(sGraphQueryIterators__init__sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDicts graphQueriess subqueriessqgsappendsgqClass( sselfsfromNodes queryNodes dataGraphs queryGraphs dataMatchs queryMatchsattrDictsqg((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys__init__šs   ccsGx@|iD]5}x"|D]}|i|itfVqW|iƒq WdS(s:Generate union of all solutions returned by all subqueriesN(sselfs graphQueriessgqsds queryMatchs queryNodesNonescleanup(sselfsdsgq((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysclosure¤s (s__name__s __module__s__doc__s__init__sclosure(((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pys SubqueryGQI•s  c CsÀ|tj o|tj o|||tj oG|||} x<| D]*} y|| }WqDtj oqDXqDWnh} y| d}Wntj onX|||||||| ƒSdS(sžfigure out a default GQI class to use, based on an attribute dictionary, then return a new object of that class initialized with the input data s __class__N( sfromNodesNonestoNodes queryGraphskwargssattrsgqiDictsoclasssKeyErrors dataGraphs dataMatchs queryMatch( sselfsoclasssfromNodestoNodes dataGraphs queryGraphs dataMatchs queryMatchsgqiDictsattrskwargs((s@build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/graphquery.pysnewGQI­s / s GraphQuerycBswtZdZhde<de<de<de<de= (2, 5) def get_logger(name='pygr-log', stream=sys.stdout, formatter=None): """ Returns a logger >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') >>> disable() >>> info('logtest, this message should be visible') >>> disable('DEBUG') >>> debug('logtest, this message SHOULD NOT be visible') >>> info('logtest, this message should be visible') """ logger = logging.getLogger(name) # this is needed in case the process is # forked/multithreaded; loggers exist in a global scope # we don't want each import to duplocate this handler if not logger.handlers: console = logging.StreamHandler(stream) console.setLevel(logging.DEBUG) if PYTHON_25: format = '%(levelname)s %(module)s.%(funcName)s: %(message)s' else: format = '%(levelname)s %(module)s: %(message)s' formatter = formatter or logging.Formatter(format) console.setFormatter(formatter) logger.addHandler(console) logger.setLevel(logging.DEBUG) return logger def disable(level=0): """ Disables logging levels Levels: DEBUG, INFO, WARNING, ERROR >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') """ level = str(level) value = dict(NOTSET=0, DEBUG=10, INFO=20, WARNING=30, ERROR=40)\ .get(level.upper(), 0) logging.disable(value) # populate some loggers by default log = get_logger() debug, info, warn, error = log.debug, log.info, log.warn, log.error def test(verbose=0): "Performs module level testing" import doctest doctest.testmod(verbose=verbose) if __name__ == "__main__": test() PKðŠ’;ÙrÈ È pygr/logger.pyc;ò |†Kc@s©dZdkZdkZeiddfjZdeied„Zdd„ZeƒZ e i e i e i e i f\Z Z Z Z dd„Zed jo eƒndS( sè Implements logging functionality Upon import creates a module level log class (log) and the following logging functions: debug, info, warn and error The default formatters will print out the function the log was triggered from. Niispygr-logcCsœti|ƒ}|i ozti|ƒ}|iti ƒt o d}nd}|p ti |ƒ}|i|ƒ|i|ƒ|iti ƒn|SdS(sG Returns a logger >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') >>> disable() >>> info('logtest, this message should be visible') >>> disable('DEBUG') >>> debug('logtest, this message SHOULD NOT be visible') >>> info('logtest, this message should be visible') s2%(levelname)s %(module)s.%(funcName)s: %(message)ss%%(levelname)s %(module)s: %(message)sN(sloggings getLoggersnamesloggershandlerss StreamHandlersstreamsconsolessetLevelsDEBUGs PYTHON_25sformats formatters Formatters setFormatters addHandler(snamesstreams formattersconsolesformatslogger((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pys get_loggers     ic CsVt|ƒ}tddddddddd d ƒi|iƒdƒ}ti|ƒd S( sž Disables logging levels Levels: DEBUG, INFO, WARNING, ERROR >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') sNOTSETisDEBUGi sINFOisWARNINGisERRORi(N(sstrslevelsdictsgetsuppersvaluesloggingsdisable(slevelsvalue((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pysdisable5s 9cCsdk}|id|ƒdS(sPerforms module level testingNsverbose(sdocteststestmodsverbose(sverbosesdoctest((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pystestHs s__main__(s__doc__sloggingssyss version_infos PYTHON_25sstdoutsNones get_loggersdisableslogsdebugsinfoswarnserrorstests__name__( sinfoswarnsloggingslogstestssyss get_loggersdisableserrorsdebugs PYTHON_25((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pys? s  !  *  PKñŠ’;ÙrÈ È pygr/logger.pyo;ò |†Kc@s©dZdkZdkZeiddfjZdeied„Zdd„ZeƒZ e i e i e i e i f\Z Z Z Z dd„Zed jo eƒndS( sè Implements logging functionality Upon import creates a module level log class (log) and the following logging functions: debug, info, warn and error The default formatters will print out the function the log was triggered from. Niispygr-logcCsœti|ƒ}|i ozti|ƒ}|iti ƒt o d}nd}|p ti |ƒ}|i|ƒ|i|ƒ|iti ƒn|SdS(sG Returns a logger >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') >>> disable() >>> info('logtest, this message should be visible') >>> disable('DEBUG') >>> debug('logtest, this message SHOULD NOT be visible') >>> info('logtest, this message should be visible') s2%(levelname)s %(module)s.%(funcName)s: %(message)ss%%(levelname)s %(module)s: %(message)sN(sloggings getLoggersnamesloggershandlerss StreamHandlersstreamsconsolessetLevelsDEBUGs PYTHON_25sformats formatters Formatters setFormatters addHandler(snamesstreams formattersconsolesformatslogger((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pys get_loggers     ic CsVt|ƒ}tddddddddd d ƒi|iƒdƒ}ti|ƒd S( sž Disables logging levels Levels: DEBUG, INFO, WARNING, ERROR >>> disable('INFO') >>> info('logtest, this message SHOULD NOT be visible') sNOTSETisDEBUGi sINFOisWARNINGisERRORi(N(sstrslevelsdictsgetsuppersvaluesloggingsdisable(slevelsvalue((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pysdisable5s 9cCsdk}|id|ƒdS(sPerforms module level testingNsverbose(sdocteststestmodsverbose(sverbosesdoctest((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pystestHs s__main__(s__doc__sloggingssyss version_infos PYTHON_25sstdoutsNones get_loggersdisableslogsdebugsinfoswarnserrorstests__name__( sinfoswarnsloggingslogstestssyss get_loggersdisableserrorsdebugs PYTHON_25((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/logger.pys? s  !  *  PKd—~;ìð••pygr/mapping.py from __future__ import generators from schema import * import classutil def update_graph(self, graph): 'save nodes and edges of graph to self' for node, d in graph.iteritems(): self += node saveDict = self[node] for target, edge in d.iteritems(): saveDict[target] = edge class PathList(list): """Internal representation for storing both nodes and edges as list So filter functions can see both nodes and edges""" def __init__(self, nodes=None, edges=None): if nodes != None: list.__init__(self, nodes) else: list.__init__(self) if edges != None: self.edge = list(edges) else: self.edge = [] def append(self, val): list.append(self, val) self.edge.append(val) def extend(self, l): list.extend(self, l) # EXTEND TOP-LEVEL LIST AS USUAL try: # EXTEND OUR EDGE LIST AS WELL self.edge.extend(l.edge) except AttributeError: #IF l HAS NO EDGES, PAD OUR EDGE LIST WITH Nones self.edge.extend(len(l) * [None]) class Edge(list): "Interface to edge information." isDirected = False def __init__(self, graph, nodes, edgeInfo): self.graph = graph if edgeInfo: self.edgeInfo = edgeInfo list.__init__(self, nodes) # SAVE NODES AS TUPLE def __getattr__(self, attr): try: return getattr(self.edgeInfo, attr) except AttributeError: if isinstance(self.edgeInfo, types.DictType): # Treat edgeInfo as an attribute dictionary. return self.edgeInfo[attr] raise AttributeError(attr) # Should we define setattr here too, to allow users to add new attribute # values? The problem is setattr is painful to implement due to the # recursive reference problem. def __cmp__(self, other): # DO WE NEED TO COMPARE EDGE INFO?? if not isinstance(other, Edge): # CAN ONLY COMPARE A PAIR OF EDGES return -1 diff = cmp(self.graph, other.graph) if diff: # NOT IN THE SAME GRAPH... return diff elif self.isDirected: # IF DIRECTED, JUST COMPARE IN CURRENT ORDER return tuple.__cmp__(self, other) else: # UNDIRECTED COMPARISON REQUIRES PUTTING BOTH IN SAME ORDER me = [i for i in self] you = [i for i in other] me.sort() you.sort() return cmp(me, you) # NEEDS SCHEMA SUPPORT: RETURN A SINGLE SCHEMA TUPLE DESCRIBING THIS EDGE. class DirectedEdge(Edge): isDirected = True # need a class to provide access to the edges in a graph # iterator, membership test #class EdgeSet class dictEdge(dict): """2nd layer graph interface implemenation using dict. """ dictClass = dict def __init__(self, graph, fromNode): self.graph = graph self.fromNode = fromNode self.dictClass.__init__(self) # INITIALIZE TOPLEVEL DICTIONARY def __iadd__(self, target): "Add edge from fromNode to target with no edge-info" self[target] = None return self # THIS IS REQUIRED FROM iadd()!! def __setitem__(self, target, edgeInfo): "Add edge from fromNode to target with edgeInfo" self.dictClass.__setitem__(self, target, edgeInfo) if target not in self.graph: # ADD NEW NODE TO THE NODE DICT self.graph += target _setitem_ = dict.__setitem__ # INTERNAL INTERFACE FOR SAVING AN ENTRY def __delitem__(self, target): "Delete edge from fromNode to target" try: self.dictClass.__delitem__(self, target) except KeyError: # GENERATE A MORE INFORMATIVE ERROR MESSAGE raise KeyError('No edge from node to target') def __isub__(self, target): "Delete edge from fromNode to target" self.__delitem__(target) return self # THIS IS REQUIRED FROM iadd()!! def edges(self): "Return iterator for accessing edges from fromNode" for target, edgeInfo in self.items(): if isinstance(edgeInfo, Edge): yield edgeInfo else: yield Edge(self.graph, (self.fromNode, target, edgeInfo), edgeInfo) class dictGraph(dict): """Top layer graph interface implemenation using dict. """ dictClass = dict edgeDictClass = dictEdge def __init__(self, schema=None, domain=None, range=None): if schema and domain and range: if domain not in schema: schema += domain #ADD DOMAIN AS NODE TO schema GRAPH schema[domain][range] = self self.dictClass.__init__(self) # INITIALIZE TOPLEVEL DICTIONARY def __iadd__(self, node, ruleSet=False): "Add node to graph with no edges" if node not in self: self.dictClass.__setitem__(self, node, self.edgeDictClass(self, node)) if ruleSet == False: ruleSet = getschema(node, graph=self) for rule in ruleSet: if isinstance(rule[1], types.StringType): # Attribute binding; bind directly to attribute. setattr(node, rule[1], self[node]) return self # THIS IS REQUIRED FROM iadd()!! def __setitem__(self, node, target): "This method exists only to support g[n]+=o. Do not use as g[n]=foo." if self[node] != target: raise ValueError('Incorrect usage. Add edges using g[n]+=o \ or g[n][o]=edge.') def __delitem__(self, node): "Delete node from graph." # Grr, we really need to find all edges going to this node # and delete them. try: # Do stuff to remove it here... self.dictClass.__delitem__(self, node) except KeyError: raise KeyError('Node not present in mapping.') for rule in getschema(node, graph=self): if isinstance(rule[1], types.StringType): # ATTRIBUTE BINDING! delattr(node, rule[1]) # REMOVE ATTRIBUTE BINDING def __isub__(self, node): "Delete node from graph" self.__delitem__(node) return self # THIS IS REQUIRED FROM isub()!! def __hash__(self): # SO SCHEMA CAN INDEX ON GRAPHS... return id(self) def edges(self): "Return iterator for all edges in this graph" for edgedict in self.values(): for edge in edgedict.edges(): yield edge update = update_graph class dictEdgeFB(dictEdge): "dictEdge subclass that saves both forward and backward edges" def __setitem__(self, target, edgeInfo): "Save edge in both forward and backward dicts." dictEdge.__setitem__(self, target, edgeInfo) # FORWARD EDGE try: d = self.graph._inverse[target] except KeyError: d = self.dictClass() self.graph._inverse[target] = d d[self.fromNode] = edgeInfo # SAVE BACKWARD EDGE def __invert__(self): "Get nodes with edges to this node" return self.graph._inverse[self.fromNode] class dictGraphFB(dictGraph): "Graph that saves both forward and backward edges" def __init__(self, **kwargs): dictGraph.__init__(self, **kwargs) self._inverse = self.dictClass() __invert__ = classutil.standard_invert def __delitem__(self, node): "Delete node from the graph" try: fromNodes = self._inverse[node] del self._inverse[node] # REMOVE FROM _inverse DICT except KeyError: pass else: # DELETE EDGES TO THIS NODE for i in fromNodes: del self[i][node] dictGraph.__delitem__(self, node) def listUnion(ivals): 'merge all items using union operator' union = None for ival in ivals: try: union += ival except TypeError: union = ival return union class DictQueue(dict): 'each index entry acts like a queue; setitem PUSHES, and delitem POPS' def __setitem__(self, k, val): try: dict.__getitem__(self, k).append(val) except KeyError: dict.__setitem__(self, k, [val]) def __getitem__(self, k): return dict.__getitem__(self, k)[0] def __delitem__(self, k): l=dict.__getitem__(self, k) del l[0] if len(l) == 0: dict.__delitem__(self, k) ################################ PYGR.DATA.SCHEMA - AWARE CLASSES BELOW def close_if_possible(self): 'close storage to ensure any pending data is written' try: do_close = self.d.close except AttributeError: pass else: do_close() class Collection(object): 'flexible storage mapping ID --> OBJECT' def __init__(self, saveDict=None, dictClass=dict, **kwargs): '''saveDict, if not None, the internal mapping to use as our storage. filename: if provided, a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if provided, the class to use for storage of dict data.''' if saveDict is not None: self.d = saveDict elif 'filename' in kwargs: # USE A SHELVE (BERKELEY DB) try: if kwargs['intKeys']: # ALLOW INT KEYS, HAVE TO USE IntShelve self.__class__ = IntShelve else: raise KeyError except KeyError: self.__class__ = PicklableShelve return self.__init__(**kwargs) else: self.d = dictClass() classutil.apply_itemclass(self, kwargs) def __getitem__(self, k): return self.d[k] def __setitem__(self, k, v): self.d[k] = v def __delitem__(self, k): del self.d[k] def __len__(self): return len(self.d) def __contains__(self, k): return k in self.d def __iter__(self): return iter(self.d) def __getattr__(self, attr): if attr == '__setstate__' or attr == '__dict__': # This prevents infinite recursion during unpickling. raise AttributeError try: # PROTECT AGAINST INFINITE RECURSE IF NOT FULLY __init__ED... return getattr(self.__dict__['d'], attr) except KeyError: raise AttributeError('Collection has no subdictionary') close = close_if_possible def __del__(self): 'must ensure that shelve object is closed to save pending data' try: self.close() except classutil.FileAlreadyClosedError: pass class PicklableShelve(Collection): 'persistent storage mapping ID --> OBJECT' def __init__(self, filename, mode=None, writeback=False, unpicklingMode=False, verbose=True, **kwargs): '''Wrapper for a shelve object that can be pickled. Ideally, you should specify a TWO letter mode string: the first letter to indicate what mode the shelve should be initially opened in, and the second to indicate the mode to open the shelve during unpickling. e.g. mode='nr': to create an empty shelve (writable), which in future will be re-opened read-only. Also, mode=None makes it first attempt to open read-only, but if the file does not exist will create it using mode 'c'. ''' # Mark this string as a file path. self.filename = classutil.SourceFileName(str(filename)) self.writeback = writeback if unpicklingMode or mode is None or mode == 'r': # Just use mode as given. self.mode = mode elif mode == 'n' or mode == 'c' or mode == 'w': # Ambiguous modes, warn & set default. if verbose: import sys print >>sys.stderr, '''Warning: you opened shelve file %s in mode '%s' but this is ambiguous for how the shelve should be re-opened later during unpickling. By default it will be re-opened in mode 'r' (read-only). To make it be re-opened writable, create it in mode '%sw', or call its method reopen('w'), which will make it be re-opened in mode 'w' now and in later unpickling. To suppress this warning message, use the verbose=False option.''' % (filename, mode, mode) self.mode = 'r' else: # PROCESS UNAMBIGUOUS TWO-LETTER mode STRING try: if len(mode) == 2 and mode[0] in 'ncwr' and mode[1] in 'cwr': self.mode = mode[1] # IN FUTURE OPEN IN THIS MODE mode = mode[0] # OPEN NOW IN THIS MODE else: raise ValueError('invalid mode string: ' + mode) except TypeError: raise ValueError('file mode must be a string!') if unpicklingMode: self.d = classutil.open_shelve(filename, mode, writeback, allowReadOnly=True) else: self.d = classutil.open_shelve(filename, mode, writeback) classutil.apply_itemclass(self, kwargs) __getstate__ = classutil.standard_getstate ############### PICKLING METHODS __setstate__ = classutil.standard_setstate _pickleAttrs = dict(filename=0, mode=0, writeback=0) def close(self): '''close our shelve index file.''' self.d.close() def __setitem__(self, k, v): try: self.d[k] = v except TypeError: raise TypeError('to allow int keys, you must pass intKeys=True \ to constructor!') def reopen(self, mode='r'): 're-open shelve in the specified mode, and save mode on self' self.close() self.d = classutil.open_shelve(self.filename, mode, writeback=self.writeback) self.mode = mode class IntShelve(PicklableShelve): 'provides an interface to shelve that can use int as key' def saveKey(self, i): 'convert to string key' if isinstance(i, int): return 'int:%s' % i elif isinstance(i, str): return i try: return 'int:%s' % int(i) except TypeError: pass raise KeyError('IntShelve can only save int or str as key') def trueKey(self, k): "convert back to key's original format" if k.startswith('int:'): return int(k[4:]) else: return k def __getitem__(self, k): return self.d[self.saveKey(k)] def __setitem__(self, k, v): self.d[self.saveKey(k)] = v def __delitem__(self, k): del self.d[self.saveKey(k)] def __contains__(self, k): return self.saveKey(k) in self.d def __iter__(self): ################ STANDARD ITERATOR METHODS for k in self.d: yield self.trueKey(k) def keys(self): return [k for k in self] def iteritems(self): for k, v in self.d.iteritems(): yield self.trueKey(k), v def items(self): return [k for k in self.iteritems()] ## PACKING / UNPACKING METHODS FOR SEPARATING INTERNAL VS. EXTERNAL ## REPRESENTATIONS OF GRAPH NODES AND EDGES ## 1. ID-BASED PACKING: USE obj.id AS INTERNAL REPRESENTATION ## ## 2. TRIVIAL: INTERNAL AND EXTERNAL REPRESENTATIONS IDENTICAL ## WORKS WELL FOR STRING OR INT NODES / EDGES. ## ## 3. PICKLE PACKING: USE PICKLE AS INTERNAL REPRESENTATION def pack_id(self, obj): 'extract id attribute from obj' try: return obj.id except AttributeError: if obj is None: return None raise def unpack_source(self, objID): return self.sourceDB[objID] def unpack_target(self, objID): return self.targetDB[objID] def unpack_edge(self, objID): try: return self.edgeDB[objID] except KeyError: if objID is None: return None raise def add_standard_packing_methods(localDict): localDict['pack_source'] = pack_id localDict['pack_target'] = pack_id localDict['pack_edge'] = pack_id localDict['unpack_source'] = unpack_source localDict['unpack_target'] = unpack_target localDict['unpack_edge'] = unpack_edge def add_trivial_packing_methods(localDict): for name in ('pack_source', 'pack_target', 'pack_edge', 'unpack_source', 'unpack_target', 'unpack_edge'): localDict[name] = lambda self, obj: obj def pack_pickle(self, obj): 'get pickle string for obj' import pickle return pickle.dumps(obj) def unpack_pickle(self, s): 'unpickle string to get obj' import pickle return pickle.loads(s) class MappingInverse(object): def __init__(self, db): self._inverse = db self.attr = db.inverseAttr def __getitem__(self, k): return self._inverse.sourceDB[getattr(k, self.attr)] __invert__ = classutil.standard_invert class Mapping(object): '''dict-like class suitable for persistent usages. Extracts ID values from keys and values passed to it, and saves IDs into its internal dictionary instead of the actual objects. Thus, the external interface is objects, but the internal storage is ID values.''' def __init__(self, sourceDB, targetDB, saveDict=None, IDAttr='id', targetIDAttr='id', itemAttr=None, multiValue=False, inverseAttr=None, **kwargs): '''sourceDB: dictionary that maps key ID values to key objects targetDB: dictionary that maps value IDs to value objects saveDict, if not None, is the internal mapping to use as our storage IDAttr: attribute name to obtain an ID from a key object targetIDAttr: attribute name to obtain an ID from a value object itemAttr, if not None, the attribute to obtain target (value) ID from an internal storage value multiValue: if True, treat each value as a list of values. filename: if provided, is a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if not None, is the class to use for storage of dict data''' if saveDict is None: self.d = classutil.get_shelve_or_dict(**kwargs) else: self.d = saveDict self.IDAttr = IDAttr self.targetIDAttr = targetIDAttr self.itemAttr = itemAttr self.multiValue = multiValue self.sourceDB = sourceDB self.targetDB = targetDB if inverseAttr is not None: self.inverseAttr = inverseAttr def __getitem__(self, k): kID = getattr(k, self.IDAttr) return self.getTarget(self.d[kID]) def getTarget(self, vID): if self.itemAttr is not None: vID = getattr(vID, self.itemAttr) if self.multiValue: return [self.targetDB[j] for j in vID] else: return self.targetDB[vID] def __setitem__(self, k, v): if self.multiValue: v = [getattr(x, self.targetIDAttr) for x in v] else: v = getattr(v, self.targetIDAttr) self.d[getattr(k, self.IDAttr)] = v def __delitem__(self, k): del self.d[getattr(k, self.IDAttr)] def __contains__(self, k): return getattr(k, self.IDAttr) in self.d def __len__(self): return len(self.d) def clear(self): self.d.clear() def copy(self): return Mapping(self.sourceDB, self.targetDB, self.d.copy(), self.IDAttr, self.targetIDAttr, self.itemAttr, self.multiValue) def update(self, b): for k, v in b.iteritems(): self[k] = v def get(self, k, v=None): try: return self[k] except KeyError: return v def setdefault(self, k, v=None): try: return self[k] except KeyError: self[k] = v return v def pop(self, k, v=None): try: v = self[k] except KeyError: return v del self[k] return v def popitem(self): kID, vID = self.d.popitem() return kID, self.getTarget(vID) def __iter__(self): ######################## ITERATORS for kID in self.d: yield self.sourceDB[kID] def keys(self): return [k for k in self] def itervalues(self): for vID in self.d.itervalues(): yield self.getTarget(vID) def values(self): return [v for v in self.itervalues()] def iteritems(self): for kID, vID in self.d.iteritems(): yield self.sourceDB[kID], self.getTarget(vID) def items(self): return [x for x in self.iteritems()] __invert__ = classutil.standard_invert _inverseClass = MappingInverse close = close_if_possible def __del__(self): close_if_possible(self) def graph_cmp(self, other): 'compare two graph dictionaries' import sys diff = cmp(len(self), len(other)) if diff != 0: print >>sys.stderr, 'len diff:', len(self), len(other) return diff for node, d in self.iteritems(): try: d2 = other[node] except KeyError: print >>sys.stderr, 'other missing key' return 1 diff = cmp(d, d2) if diff != 0: print >>sys.stderr, 'value diff', d, d2 return diff return 0 class IDNodeDict(object): """2nd layer graph interface implementation using proxy dict. e.g. shelve.""" dictClass = dict def __init__(self, graph, fromNode): self.graph = graph self.fromNode = fromNode def __getitem__(self, target): ############# ACCESS METHODS edgeID = self.graph.d[self.fromNode][self.graph.pack_target(target)] return self.graph.unpack_edge(edgeID) def __setitem__(self, target, edgeInfo): "Add edge from fromNode to target with edgeInfo" self.graph.d[self.fromNode][self.graph.pack_target(target)] \ = self.graph.pack_edge(edgeInfo) if not hasattr(self.graph, 'sourceDB') or \ (hasattr(self.graph, 'targetDB') and \ self.graph.sourceDB == self.graph.targetDB): self.graph += target # ADD NEW NODE TO THE NODE DICT def __delitem__(self, target): "Delete edge from fromNode to target" try: del self.graph.d[self.fromNode][self.graph.pack_target(target)] except KeyError: # GENERATE A MORE INFORMATIVE ERROR MESSAGE raise KeyError('No edge from node to target') ######### CONVENIENCE METHODS THAT USE THE ACCESS METHODS ABOVE def __iadd__(self, target): "Add edge from fromNode to target with no edge-info" self[target] = None return self # THIS IS REQUIRED FROM iadd()!! def __isub__(self, target): "Delete edge from fromNode to target" self.__delitem__(target) return self # THIS IS REQUIRED FROM iadd()!! def edges(self): "Return iterator for accessing edges from fromNode" for target, edgeInfo in self.graph.d[self.fromNode].items(): yield (self.graph.unpack_source(self.fromNode), self.graph.unpack_target(target), self.graph.unpack_edge(edgeInfo)) def __len__(self): return len(self.graph.d[self.fromNode]) def keys(self): return [k[1] for k in self.edges()] ##### ITERATORS def values(self): return [k[2] for k in self.edges()] def items(self): return [k[1:3] for k in self.edges()] def __iter__(self): for source, target, edgeInfo in self.edges(): yield target def itervalues(self): for source, target, edgeInfo in self.edges(): yield edgeInfo def iteritems(self): for source, target, edgeInfo in self.edges(): yield target, edgeInfo __cmp__ = graph_cmp class IDNodeDictWriteback(IDNodeDict): 'forces writing of subdictionary in shelve opened without writeback=True' def __setitem__(self, target, edgeInfo): d = self.graph.d[self.fromNode] d[self.graph.pack_target(target)] = self.graph.pack_edge(edgeInfo) self.graph.d[self.fromNode] = d # WRITE IT BACK... REQUIRED FOR SHELVE self.graph += target # ADD NEW NODE TO THE NODE DICT def __delitem__(self, target): d = self.graph.d[self.fromNode] del d[self.graph.pack_target(target)] self.graph.d[self.fromNode] = d # WRITE IT BACK... REQUIRED FOR SHELVE class IDNodeDictWriteNow(IDNodeDictWriteback): 'opens shelve for writing, writes an item, immediately reopens' def __setitem__(self, target, edgeInfo): self.graph.d.reopen('w') IDNodeDictWriteback.__setitem__(self, target, edgeInfo) self.graph.d.reopen('w') def __delitem__(self, target): self.graph.d.reopen('w') IDNodeDictWriteback.__delitem__(self, target) self.graph.d.reopen('w') class IDGraphEdges(object): '''provides iterator over edges as (source, target, edge) tuples and getitem[edge] --> [(source, target), ...]''' def __init__(self, g): self.g = g def __iter__(self): for d in self.g.itervalues(): for edge in d.edges(): yield edge def __getitem__(self, edge): l = [] for sourceID, targetID in self.d[edge.id]: l.append((self.g.sourceDB[sourceID], self.g.targetDB[targetID])) return l def __call__(self): return self class IDGraphEdgeDescriptor(object): 'provides interface to edges on demand' def __get__(self, obj, objtype): return IDGraphEdges(obj) def save_graph_db_refs(self, sourceDB=None, targetDB=None, edgeDB=None, simpleKeys=False, unpack_edge=None, edgeDictClass=None, graph=None, **kwargs): 'apply kwargs to reference DB objects for this graph' if sourceDB is not None: self.sourceDB = sourceDB else: # No source DB, store keys as internal representation. simpleKeys = True if targetDB is not None: self.targetDB=targetDB if edgeDB is not None: self.edgeDB=edgeDB else: # just save the edge object as itself (not its ID) self.pack_edge = self.unpack_edge = lambda edge: edge if simpleKeys: # SWITCH TO USING TRIVIAL PACKING: OBJECT IS ITS OWN ID self.__class__ = self._IDGraphClass if unpack_edge is not None: self.unpack_edge = unpack_edge # UNPACKING METHOD OVERRIDES DEFAULT if graph is not None: self.graph = graph if edgeDictClass is not None: self.edgeDictClass = edgeDictClass def graph_db_inverse_refs(self, edgeIndex=False): 'return kwargs for inverse of this graph, or edge index of this graph' if edgeIndex: # TO CONSTRUCT AN EDGE INDEX db = ('edgeDB', 'sourceDB', 'targetDB') else: # DEFAULT: TO CONSTRUCT AN INVERSE MAPPING OF THE GRAPH db = ('targetDB', 'sourceDB', 'edgeDB') try: d = dict(sourceDB=getattr(self, db[0]), targetDB=getattr(self, db[1])) try: d['edgeDB'] = getattr(self, db[2]) # EDGE INFO IS OPTIONAL except AttributeError: pass except AttributeError: d = dict(simpleKeys=True) # NO SOURCE / TARGET DB, SO USE IDs AS KEYS try: # COPY THE LOCAL UNPACKING METHOD, IF ANY if not edgeIndex: d['unpack_edge'] = self.__dict__['unpack_edge'] except KeyError: pass return d def graph_setitem(self, node, target): "This method exists only to support g[n]+=o. Do not use as g[n]=foo." node = self.pack_source(node) try: if node == target.fromNode: return except AttributeError: pass raise ValueError('Incorrect usage. Add edges using g[n]+=o or \ g[n][o]=edge.') class Graph(object): """Top layer graph interface implemenation using proxy dict. Works with dict, shelve, any mapping interface.""" edgeDictClass = IDNodeDict # DEFAULT EDGE DICT def __init__(self, saveDict=None, dictClass=dict, writeNow=False, **kwargs): if saveDict is not None: # USE THE SUPPLIED STORAGE self.d = saveDict elif 'filename' in kwargs: # USE A SHELVE (BERKELEY DB) try: if kwargs['intKeys']: # ALLOW INT KEYS, HAVE TO USE IntShelve self.d = IntShelve(writeback=False, **kwargs) else: raise KeyError except KeyError: self.d = PicklableShelve(writeback=False, **kwargs) if writeNow: # Write immediately. self.edgeDictClass = IDNodeDictWriteNow else: # Use our own writeback. self.edgeDictClass = IDNodeDictWriteback else: self.d = dictClass() save_graph_db_refs(self, **kwargs) __getstate__ = classutil.standard_getstate ############### PICKLING METHODS __setstate__ = classutil.standard_setstate _pickleAttrs = dict(d='saveDict', sourceDB=0, targetDB=0, edgeDB=0, edgeDictClass=0) add_standard_packing_methods(locals()) ############ PACK / UNPACK METHODS def close(self): '''If possible, close our dict.''' try: do_close = self.d.close except AttributeError: pass else: do_close() def __len__(self): return len(self.d) def __iter__(self): for node in self.d: yield self.unpack_source(node) def keys(self): return [k for k in self] def itervalues(self): for node in self.d: yield self.edgeDictClass(self, node) def values(self): return [v for v in self.itervalues()] def iteritems(self): for node in self.d: yield self.unpack_source(node), self.edgeDictClass(self, node) def items(self): return [v for v in self.iteritems()] edges = IDGraphEdgeDescriptor() def __iadd__(self, node): "Add node to graph with no edges" node = self.pack_source(node) if node not in self.d: self.d[node] = {} # INITIALIZE TOPLEVEL DICTIONARY return self # THIS IS REQUIRED FROM iadd()!! def __contains__(self, node): return self.pack_source(node) in self.d def __getitem__(self, node): if node in self: return self.edgeDictClass(self, self.pack_source(node)) raise KeyError('node not in graph') __setitem__ = graph_setitem def __delitem__(self, node): "Delete node from graph." node = self.pack_source(node) # Grr, we really need to find all edges going to this node # and delete them. try: del self.d[node] # DO STUFF TO REMOVE IT HERE... except KeyError: raise KeyError('Node not present in mapping.') def __isub__(self, node): "Delete node from graph" self.__delitem__(node) return self # THIS IS REQUIRED FROM isub()!! update = update_graph __cmp__ = graph_cmp def __del__(self): try: self.close() except classutil.FileAlreadyClosedError: pass # NEED TO PROVIDE A REAL INVERT METHOD!! ## def __invert__(self): ## 'get an interface to the inverse graph mapping' ## try: # CACHED ## return self._inverse ## except AttributeError: # NEED TO CONSTRUCT INVERSE MAPPING ## self._inverse = IDGraph(~(self.d), self.targetDB, self.sourceDB, ## self.edgeDB) ## self._inverse._inverse = self ## return self._inverse ## def __hash__(self): # SO SCHEMA CAN INDEX ON GRAPHS... return id(self) class IDGraph(Graph): add_trivial_packing_methods(locals()) Graph._IDGraphClass = IDGraph class KeepUniqueDict(dict): 'dict that blocks attempts to overwrite an existing key' def __setitem__(self, k, v): try: if self[k] is v: return # ALREADY SAVED. NOTHING TO DO! except KeyError: # NOT PRESENT, SO JUST SAVE THE VALUE dict.__setitem__(self, k, v) return raise KeyError('attempt to overwrite existing key!') def __hash__(self): 'ALLOW THIS OBJECT TO BE USED AS A KEY IN DICTS...' return id(self) PKðŠ’;ÆÁùÛÖÛÖpygr/mapping.pyc;ò |†Kc@s—dklZdkTdkZd„Zdefd„ƒYZdefd„ƒYZdefd „ƒYZd e fd „ƒYZ d e fd „ƒYZ de fd„ƒYZ de fd„ƒYZ d„Zde fd„ƒYZd„Zdefd„ƒYZdefd„ƒYZdefd„ƒYZd„Zd„Zd„Zd„Zd „Zd!„Zd"„Zd#„Zd$efd%„ƒYZd&efd'„ƒYZd(„Zd)efd*„ƒYZ d+e fd,„ƒYZ!d-e!fd.„ƒYZ"d/efd0„ƒYZ#d1efd2„ƒYZ$e%e%e%e&e%e%e%d3„Z'e&d4„Z(d5„Z)d6efd7„ƒYZ*d8e*fd9„ƒYZ+e+e*_,d:e fd;„ƒYZ-dS(<(s generators(s*NcCs\xU|iƒD]G\}}||7}||}x$|iƒD]\}}||| OBJECTcKs™|tj o ||_nld|joRy"|do t|_nt‚Wntj ot|_nX|i |Sn |ƒ|_t i ||ƒdS(súsaveDict, if not None, the internal mapping to use as our storage. filename: if provided, a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if provided, the class to use for storage of dict data.sfilenamesintKeysN( ssaveDictsNonesselfsdskwargss IntShelves __class__sKeyErrorsPicklableShelves__init__s dictClasss classutilsapply_itemclass(sselfssaveDicts dictClassskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__s       cCs|i|SdS(N(sselfsdsk(sselfsk((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__/scCs||i|scCsb|djp |djo t‚nyt|id|ƒSWntj otdƒ‚nXdS(Ns __setstate__s__dict__sdsCollection has no subdictionary(sattrsAttributeErrorsgetattrsselfs__dict__sKeyError(sselfsattr((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getattr__As  cCs+y|iƒWntij onXdS(s=must ensure that shelve object is closed to save pending dataN(sselfscloses classutilsFileAlreadyClosedError(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__del__Ks (s__name__s __module__s__doc__sNonesdicts__init__s __getitem__s __setitem__s __delitem__s__len__s __contains__s__iter__s __getattr__sclose_if_possiblescloses__del__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys Collections        sPicklableShelvecBsntZdZeeeed„ZeiZ ei Z e ddddddƒZ d„Zd„Zdd „ZRS( s(persistent storage mapping ID --> OBJECTcKsŒtit|ƒƒ|_||_|p|tjp |djo ||_né|djp|djp |djo;|o'dk }|i d|||fIJnd|_n‡ydt |ƒdjo|dd jo|d d jo|d |_|d}nt d |ƒ‚Wntj ot d ƒ‚nX|o"ti|||dtƒ|_nti|||ƒ|_ti||ƒdS(sÞWrapper for a shelve object that can be pickled. Ideally, you should specify a TWO letter mode string: the first letter to indicate what mode the shelve should be initially opened in, and the second to indicate the mode to open the shelve during unpickling. e.g. mode='nr': to create an empty shelve (writable), which in future will be re-opened read-only. Also, mode=None makes it first attempt to open read-only, but if the file does not exist will create it using mode 'c'. srsnscswNs¥Warning: you opened shelve file %s in mode '%s' but this is ambiguous for how the shelve should be re-opened later during unpickling. By default it will be re-opened in mode 'r' (read-only). To make it be re-opened writable, create it in mode '%sw', or call its method reopen('w'), which will make it be re-opened in mode 'w' now and in later unpickling. To suppress this warning message, use the verbose=False option.iisncwriscwrsinvalid mode string: sfile mode must be a string!s allowReadOnly(s classutilsSourceFileNamesstrsfilenamesselfs writebacksunpicklingModesmodesNonesverbosessyssstderrslens ValueErrors TypeErrors open_shelvesTruesdsapply_itemclassskwargs(sselfsfilenamesmodes writebacksunpicklingModesverboseskwargsssys((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__Vs,  ! '  5 sfilenameismodes writebackcCs|iiƒdS(sclose our shelve index file.N(sselfsdsclose(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysclose‡scCs7y||i|ús(snames localDict(s localDictsname((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysadd_trivial_packing_methods÷scCsdk}|i|ƒSdS(sget pickle string for objN(spicklesdumpssobj(sselfsobjspickle((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys pack_pickleýs cCsdk}|i|ƒSdS(sunpickle string to get objN(spicklesloadsss(sselfssspickle((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys unpack_pickles sMappingInversecBs#tZd„Zd„ZeiZRS(NcCs||_|i|_dS(N(sdbsselfs_inverses inverseAttrsattr(sselfsdb((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__ s cCs|iit||iƒSdS(N(sselfs_inversessourceDBsgetattrsksattr(sselfsk((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__s(s__name__s __module__s__init__s __getitem__s classutilsstandard_inverts __invert__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysMappingInverse s  sMappingcBsûtZdZeddeeed„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „Zed „Zed „Zed„Zd„Zd„Zd„Zd„Zd„Zd„Zd„ZeiZeZeZd„Z RS(s dict-like class suitable for persistent usages. Extracts ID values from keys and values passed to it, and saves IDs into its internal dictionary instead of the actual objects. Thus, the external interface is objects, but the internal storage is ID values.sidc Ks€|tjoti| |_n ||_||_||_||_ ||_ ||_ ||_ |tj o ||_ ndS(sÇsourceDB: dictionary that maps key ID values to key objects targetDB: dictionary that maps value IDs to value objects saveDict, if not None, is the internal mapping to use as our storage IDAttr: attribute name to obtain an ID from a key object targetIDAttr: attribute name to obtain an ID from a value object itemAttr, if not None, the attribute to obtain target (value) ID from an internal storage value multiValue: if True, treat each value as a list of values. filename: if provided, is a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if not None, is the class to use for storage of dict dataN(ssaveDictsNones classutilsget_shelve_or_dictskwargssselfsdsIDAttrs targetIDAttrsitemAttrs multiValuessourceDBstargetDBs inverseAttr( sselfssourceDBstargetDBssaveDictsIDAttrs targetIDAttrsitemAttrs multiValues inverseAttrskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__s          cCs*t||iƒ}|i|i|ƒSdS(N(sgetattrsksselfsIDAttrskIDs getTargetsd(sselfskskID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__5scCso|itj ot||iƒ}n|io0gi}|D]}||i |ƒq>~Sn |i |SdS(N( sselfsitemAttrsNonesgetattrsvIDs multiValuesappends_[1]sjstargetDB(sselfsvIDsjs_[1]((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys getTarget9s  0cCsp|io7gi}|D]}|t||iƒƒq~}nt||iƒ}||it||i ƒx7|iiƒD]&\}}|i||i|ƒfVqWdS(N(sselfsds iteritemsskIDsvIDssourceDBs getTarget(sselfsvIDskID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys iteritems„s cCs/gi}|iƒD]}||ƒq~SdS(N(sappends_[1]sselfs iteritemssx(sselfs_[1]sx((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysitemsˆscCst|ƒdS(N(sclose_if_possiblesself(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__del__s(!s__name__s __module__s__doc__sNonesFalses__init__s __getitem__s getTargets __setitem__s __delitem__s __contains__s__len__sclearscopysupdatesgets setdefaultspopspopitems__iter__skeyss itervaluessvaluess iteritemssitemss classutilsstandard_inverts __invert__sMappingInverses _inverseClasssclose_if_possiblescloses__del__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysMappings2                     cCsõdk}tt|ƒt|ƒƒ}|djo-|idIt|ƒIt|ƒIJ|SnxŒ|iƒD]~\}}y||}Wn$t j o|idIJdSnXt||ƒ}|djo!|idI|I|IJ|SqkqkWdSdS(scompare two graph dictionariesNis len diff:sother missing keyis value diff( ssysscmpslensselfsothersdiffsstderrs iteritemssnodesdsd2sKeyError(sselfsothersnodesdssyssdiffsd2((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys graph_cmp“s$  %     s IDNodeDictcBs˜tZdZeZd„Zd„Zd„Zd„Zd„Z d„Z d„Z d„Z d „Z d „Zd „Zd „Zd „Zd„ZeZRS(sN2nd layer graph interface implementation using proxy dict. e.g. shelve.cCs||_||_dS(N(sgraphsselfsfromNode(sselfsgraphsfromNode((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__¬s cCs7|ii|i|ii|ƒ}|ii|ƒSdS(N(sselfsgraphsdsfromNodes pack_targetstargetsedgeIDs unpack_edge(sselfstargetsedgeID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__°s#cCs†|ii|ƒ|ii|i|ii|ƒ [(source, target), ...]cCs ||_dS(N(sgsself(sselfsg((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__sccs9x2|iiƒD]!}x|iƒD] }|Vq#WqWdS(N(sselfsgs itervaluessdsedgessedge(sselfsedgesd((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__iter__s  cCsVg}xE|i|iD]3\}}|i|ii ||ii |fƒqW|SdS(N( slsselfsdsedgesidssourceIDstargetIDsappendsgssourceDBstargetDB(sselfsedgessourceIDstargetIDsl((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__s  +cCs|SdS(N(sself(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__call__ s(s__name__s __module__s__doc__s__init__s__iter__s __getitem__s__call__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys IDGraphEdgess    sIDGraphEdgeDescriptorcBstZdZd„ZRS(s%provides interface to edges on demandcCst|ƒSdS(N(s IDGraphEdgessobj(sselfsobjsobjtype((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__get__'s(s__name__s __module__s__doc__s__get__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysIDGraphEdgeDescriptor$s c KsÐ|tj o ||_nt}|tj o ||_n|tj o ||_nd„|_|_|o|i |_ n|tj o ||_n|tj o ||_ n|tj o ||_ ndS(s3apply kwargs to reference DB objects for this graphcCs|S(N(sedge(sedge((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys9sN( ssourceDBsNonesselfsTrues simpleKeysstargetDBsedgeDBs pack_edges unpack_edges _IDGraphClasss __class__sgraphs edgeDictClass( sselfssourceDBstargetDBsedgeDBs simpleKeyss unpack_edges edgeDictClasssgraphskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pyssave_graph_db_refs+s"           cCsñ|odddf}ndddf}ydtdt||dƒdt||dƒƒ}yt||dƒ|d OBJECTcKs™|tj o ||_nld|joRy"|do t|_nt‚Wntj ot|_nX|i |Sn |ƒ|_t i ||ƒdS(súsaveDict, if not None, the internal mapping to use as our storage. filename: if provided, a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if provided, the class to use for storage of dict data.sfilenamesintKeysN( ssaveDictsNonesselfsdskwargss IntShelves __class__sKeyErrorsPicklableShelves__init__s dictClasss classutilsapply_itemclass(sselfssaveDicts dictClassskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__s       cCs|i|SdS(N(sselfsdsk(sselfsk((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__/scCs||i|scCsb|djp |djo t‚nyt|id|ƒSWntj otdƒ‚nXdS(Ns __setstate__s__dict__sdsCollection has no subdictionary(sattrsAttributeErrorsgetattrsselfs__dict__sKeyError(sselfsattr((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getattr__As  cCs+y|iƒWntij onXdS(s=must ensure that shelve object is closed to save pending dataN(sselfscloses classutilsFileAlreadyClosedError(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__del__Ks (s__name__s __module__s__doc__sNonesdicts__init__s __getitem__s __setitem__s __delitem__s__len__s __contains__s__iter__s __getattr__sclose_if_possiblescloses__del__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys Collections        sPicklableShelvecBsntZdZeeeed„ZeiZ ei Z e ddddddƒZ d„Zd„Zdd „ZRS( s(persistent storage mapping ID --> OBJECTcKsŒtit|ƒƒ|_||_|p|tjp |djo ||_né|djp|djp |djo;|o'dk }|i d|||fIJnd|_n‡ydt |ƒdjo|dd jo|d d jo|d |_|d}nt d |ƒ‚Wntj ot d ƒ‚nX|o"ti|||dtƒ|_nti|||ƒ|_ti||ƒdS(sÞWrapper for a shelve object that can be pickled. Ideally, you should specify a TWO letter mode string: the first letter to indicate what mode the shelve should be initially opened in, and the second to indicate the mode to open the shelve during unpickling. e.g. mode='nr': to create an empty shelve (writable), which in future will be re-opened read-only. Also, mode=None makes it first attempt to open read-only, but if the file does not exist will create it using mode 'c'. srsnscswNs¥Warning: you opened shelve file %s in mode '%s' but this is ambiguous for how the shelve should be re-opened later during unpickling. By default it will be re-opened in mode 'r' (read-only). To make it be re-opened writable, create it in mode '%sw', or call its method reopen('w'), which will make it be re-opened in mode 'w' now and in later unpickling. To suppress this warning message, use the verbose=False option.iisncwriscwrsinvalid mode string: sfile mode must be a string!s allowReadOnly(s classutilsSourceFileNamesstrsfilenamesselfs writebacksunpicklingModesmodesNonesverbosessyssstderrslens ValueErrors TypeErrors open_shelvesTruesdsapply_itemclassskwargs(sselfsfilenamesmodes writebacksunpicklingModesverboseskwargsssys((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__Vs,  ! '  5 sfilenameismodes writebackcCs|iiƒdS(sclose our shelve index file.N(sselfsdsclose(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysclose‡scCs7y||i|ús(snames localDict(s localDictsname((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysadd_trivial_packing_methods÷scCsdk}|i|ƒSdS(sget pickle string for objN(spicklesdumpssobj(sselfsobjspickle((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys pack_pickleýs cCsdk}|i|ƒSdS(sunpickle string to get objN(spicklesloadsss(sselfssspickle((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys unpack_pickles sMappingInversecBs#tZd„Zd„ZeiZRS(NcCs||_|i|_dS(N(sdbsselfs_inverses inverseAttrsattr(sselfsdb((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__ s cCs|iit||iƒSdS(N(sselfs_inversessourceDBsgetattrsksattr(sselfsk((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__s(s__name__s __module__s__init__s __getitem__s classutilsstandard_inverts __invert__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysMappingInverse s  sMappingcBsûtZdZeddeeed„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „Zed „Zed „Zed„Zd„Zd„Zd„Zd„Zd„Zd„Zd„ZeiZeZeZd„Z RS(s dict-like class suitable for persistent usages. Extracts ID values from keys and values passed to it, and saves IDs into its internal dictionary instead of the actual objects. Thus, the external interface is objects, but the internal storage is ID values.sidc Ks€|tjoti| |_n ||_||_||_||_ ||_ ||_ ||_ |tj o ||_ ndS(sÇsourceDB: dictionary that maps key ID values to key objects targetDB: dictionary that maps value IDs to value objects saveDict, if not None, is the internal mapping to use as our storage IDAttr: attribute name to obtain an ID from a key object targetIDAttr: attribute name to obtain an ID from a value object itemAttr, if not None, the attribute to obtain target (value) ID from an internal storage value multiValue: if True, treat each value as a list of values. filename: if provided, is a file path to a shelve (BerkeleyDB) file to store the data in. dictClass: if not None, is the class to use for storage of dict dataN(ssaveDictsNones classutilsget_shelve_or_dictskwargssselfsdsIDAttrs targetIDAttrsitemAttrs multiValuessourceDBstargetDBs inverseAttr( sselfssourceDBstargetDBssaveDictsIDAttrs targetIDAttrsitemAttrs multiValues inverseAttrskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__s          cCs*t||iƒ}|i|i|ƒSdS(N(sgetattrsksselfsIDAttrskIDs getTargetsd(sselfskskID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__5scCso|itj ot||iƒ}n|io0gi}|D]}||i |ƒq>~Sn |i |SdS(N( sselfsitemAttrsNonesgetattrsvIDs multiValuesappends_[1]sjstargetDB(sselfsvIDsjs_[1]((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys getTarget9s  0cCsp|io7gi}|D]}|t||iƒƒq~}nt||iƒ}||it||i ƒx7|iiƒD]&\}}|i||i|ƒfVqWdS(N(sselfsds iteritemsskIDsvIDssourceDBs getTarget(sselfsvIDskID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys iteritems„s cCs/gi}|iƒD]}||ƒq~SdS(N(sappends_[1]sselfs iteritemssx(sselfs_[1]sx((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysitemsˆscCst|ƒdS(N(sclose_if_possiblesself(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__del__s(!s__name__s __module__s__doc__sNonesFalses__init__s __getitem__s getTargets __setitem__s __delitem__s __contains__s__len__sclearscopysupdatesgets setdefaultspopspopitems__iter__skeyss itervaluessvaluess iteritemssitemss classutilsstandard_inverts __invert__sMappingInverses _inverseClasssclose_if_possiblescloses__del__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysMappings2                     cCsõdk}tt|ƒt|ƒƒ}|djo-|idIt|ƒIt|ƒIJ|SnxŒ|iƒD]~\}}y||}Wn$t j o|idIJdSnXt||ƒ}|djo!|idI|I|IJ|SqkqkWdSdS(scompare two graph dictionariesNis len diff:sother missing keyis value diff( ssysscmpslensselfsothersdiffsstderrs iteritemssnodesdsd2sKeyError(sselfsothersnodesdssyssdiffsd2((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys graph_cmp“s$  %     s IDNodeDictcBs˜tZdZeZd„Zd„Zd„Zd„Zd„Z d„Z d„Z d„Z d „Z d „Zd „Zd „Zd „Zd„ZeZRS(sN2nd layer graph interface implementation using proxy dict. e.g. shelve.cCs||_||_dS(N(sgraphsselfsfromNode(sselfsgraphsfromNode((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__¬s cCs7|ii|i|ii|ƒ}|ii|ƒSdS(N(sselfsgraphsdsfromNodes pack_targetstargetsedgeIDs unpack_edge(sselfstargetsedgeID((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__°s#cCs†|ii|ƒ|ii|i|ii|ƒ [(source, target), ...]cCs ||_dS(N(sgsself(sselfsg((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__init__sccs9x2|iiƒD]!}x|iƒD] }|Vq#WqWdS(N(sselfsgs itervaluessdsedgessedge(sselfsedgesd((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__iter__s  cCsVg}xE|i|iD]3\}}|i|ii ||ii |fƒqW|SdS(N( slsselfsdsedgesidssourceIDstargetIDsappendsgssourceDBstargetDB(sselfsedgessourceIDstargetIDsl((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys __getitem__s  +cCs|SdS(N(sself(sself((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__call__ s(s__name__s __module__s__doc__s__init__s__iter__s __getitem__s__call__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys IDGraphEdgess    sIDGraphEdgeDescriptorcBstZdZd„ZRS(s%provides interface to edges on demandcCst|ƒSdS(N(s IDGraphEdgessobj(sselfsobjsobjtype((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys__get__'s(s__name__s __module__s__doc__s__get__(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pysIDGraphEdgeDescriptor$s c KsÐ|tj o ||_nt}|tj o ||_n|tj o ||_nd„|_|_|o|i |_ n|tj o ||_n|tj o ||_ n|tj o ||_ ndS(s3apply kwargs to reference DB objects for this graphcCs|S(N(sedge(sedge((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pys9sN( ssourceDBsNonesselfsTrues simpleKeysstargetDBsedgeDBs pack_edges unpack_edges _IDGraphClasss __class__sgraphs edgeDictClass( sselfssourceDBstargetDBsedgeDBs simpleKeyss unpack_edges edgeDictClasssgraphskwargs((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/mapping.pyssave_graph_db_refs+s"           cCsñ|odddf}ndddf}ydtdt||dƒdt||dƒƒ}yt||dƒ|d>sys.stderr, '''%s Database table %s appears to be missing or has no layer name! To create this table, call worldbase.MySQLMetabase("%s", createLayer=) where is the layer name you want to assign it. %s''' % ('!' * 40, self.tablename, self.tablename, '!' * 40) raise if n > 0: # Get layer name from the db. self.zoneName = self.cursor.fetchone()[0] if self.cursor.execute('select location from %s where pygr_id=%%s' % self.tablename, ('0root', )) > 0: for row in self.cursor.fetchall(): self.rootNames[row[0]] = None mdb.save_root_names(self.rootNames) self.graph = SQLGraph(schemaTable, self.cursor, attrAlias= dict(source_id='source_id', target_id='target_id', edge_id='edge_id'), simpleKeys=True, unpack_edge=SchemaEdge(self)) def save_root_name(self, name): self.rootNames[name] = None self.cursor.execute('insert into %s (pygr_id,location,objdata) values \ (%%s,%%s,%%s)' % self.tablename, ('0root', name, 'a')) def find_resource(self, id, download=False): 'get construction rule from mysql, and attempt to construct' self.cursor.execute('select location,objdata,docstring from %s where \ pygr_id=%%s' % self.tablename, (id, )) for location, objdata, docstring in self.cursor.fetchall(): return objdata, docstring # return first resource found raise WorldbaseNotFoundError('unable to construct %s from remote \ services') def __setitem__(self, id, obj): 'add an object to this resource database' s = dumps(obj) # PICKLE obj AND ITS DEPENDENCIES d = get_info_dict(obj, s) self.cursor.execute('replace into %s (pygr_id,location,docstring,user,\ creation_time,pickle_size,objdata) values (%%s,\ %%s,%%s,%%s,%%s,%%s,%%s)' % self.tablename, (id, 'mysql:' + self.tablename, obj.__doc__, d['user'], d['creation_time'], d['pickle_size'], s)) root = id.split('.')[0] if root not in self.rootNames: self.save_root_name(root) def __delitem__(self, id): 'delete this resource and its schema rules' if self.cursor.execute('delete from %s where pygr_id=%%s' % self.tablename, (id, )) < 1: raise WorldbaseNotFoundError('no resource %s in this database' % id) def registerServer(self, locationKey, serviceDict): 'register the specified services to mysql database' n = 0 for id, (d, pdata) in serviceDict.items(): n+=self.cursor.execute('replace into %s (pygr_id,location,\ docstring,user,creation_time,pickle_size,\ objdata) values (%%s,%%s,%%s,%%s,%%s,%%s,\ %%s)' % self.tablename, (id, locationKey, d['__doc__'], d['user'], d['creation_time'], d['pickle_size'], pdata)) return n def setschema(self, id, attr, kwargs): 'save a schema binding for id.attr --> targetID' if not attr.startswith('-'): # REAL ATTRIBUTE targetID = kwargs['targetID'] # RAISES KeyError IF NOT PRESENT kwdata = dumps(kwargs) self.cursor.execute('replace into %s (pygr_id,location,objdata) \ values (%%s,%%s,%%s)' % self.tablename, ('SCHEMA.' + id, attr, kwdata)) def delschema(self, id, attr): 'delete schema binding for id.attr' self.cursor.execute('delete from %s where pygr_id=%%s and location=%%s' % self.tablename, ('SCHEMA.' + id, attr)) def getschema(self, id): 'return dict of {attr:{args}}' d = {} self.cursor.execute('select location,objdata from %s where pygr_id=%%s' % self.tablename, ('SCHEMA.' + id, )) for attr, objData in self.cursor.fetchall(): d[attr] = self.mdb.loads(objData) return d def dir(self, pattern, matchType='p', asDict=False, download=False): 'return list or dict of resources matching the specified string' if matchType == 'r': self.cursor.execute('select pygr_id,docstring,user,creation_time,\ pickle_size from %s where pygr_id regexp %%s' % self.tablename, (pattern, )) elif matchType == 'p': self.cursor.execute('select pygr_id,docstring,user,creation_time,\ pickle_size from %s where pygr_id like %%s' % self.tablename, (pattern + '%', )) else: # Exit now to avoid fetching rows with no query executed if asDict: return {} else: return [] d = {} for l in self.cursor.fetchall(): d[l[0]] = dict(__doc__=l[1], user=l[2], creation_time=l[3], pickle_size=l[4]) if asDict: return d else: return [name for name in d] class SchemaEdge(object): 'provides unpack_edge method for schema graph storage' def __init__(self, schemaDB): self.schemaDB = schemaDB def __call__(self, edgeID): 'get the actual schema object describing this ID' return self.schemaDB.getschema(edgeID)['-schemaEdge'] class ResourceDBGraphDescr(object): 'this property provides graph interface to schema' def __get__(self, obj, objtype): g = Graph(filename=obj.dbpath + '_schema', mode='cw', writeNow=True, simpleKeys=True, unpack_edge=SchemaEdge(obj)) obj.graph = g return g class ShelveMetabase(object): '''BerkeleyDB-based storage of worldbase resource databases, using the python shelve module. Users will not need to create instances of this class themselves, as worldbase automatically creates one for each appropriate entry in your WORLDBASEPATH; if the corresponding database file does not already exist, it is automatically created for you.''' _pygr_data_version = (0, 1, 0) graph = ResourceDBGraphDescr() # INTERFACE TO SCHEMA GRAPH def __init__(self, dbpath, mdb, mode='r', newZone=None, **kwargs): import anydbm self.dbpath = os.path.join(dbpath, '.pygr_data') # CONSTRUCT FILENAME self.mdb = mdb self.writeable = True # can write to this storage self.zoneName = None try: # OPEN DATABASE FOR READING self.db = open_shelve(self.dbpath, mode) try: mdb.save_root_names(self.db['0root']) except KeyError: pass try: self.zoneName = self.db['0zoneName'] except KeyError: pass except anydbm.error: # CREATE NEW FILE IF NEEDED self.db = open_shelve(self.dbpath, 'c') self.db['0version'] = self._pygr_data_version # SAVE VERSION STAMP self.db['0root'] = {} if newZone is not None: self.db['0zoneName'] = newZone self.zoneName = newZone def reopen(self, mode): self.db.close() self.db = open_shelve(self.dbpath, mode) def find_resource(self, resID, download=False): 'get an item from this resource database' objdata = self.db[resID] # RAISES KeyError IF NOT PRESENT try: return objdata, self.db['__doc__.' + resID]['__doc__'] except KeyError: return objdata, None def __setitem__(self, resID, obj): 'add an object to this resource database' s = dumps(obj) # PICKLE obj AND ITS DEPENDENCIES self.reopen('w') # OPEN BRIEFLY IN WRITE MODE try: self.db[resID] = s # SAVE TO OUR SHELVE FILE self.db['__doc__.' + resID] = get_info_dict(obj, s) root = resID.split('.')[0] # SEE IF ROOT NAME IS IN THIS SHELVE d = self.db.get('0root', {}) if root not in d: d[root] = None # ADD NEW ENTRY self.db['0root'] = d # SAVE BACK TO SHELVE finally: self.reopen('r') # REOPEN READ-ONLY def __delitem__(self, resID): 'delete this item from the database, with a modicum of safety' self.reopen('w') # OPEN BRIEFLY IN WRITE MODE try: try: del self.db[resID] # DELETE THE SPECIFIED RULE except KeyError: raise WorldbaseNotFoundError('ID %s not found in %s' % (resID, self.dbpath)) try: del self.db['__doc__.' + resID] except KeyError: pass finally: self.reopen('r') # REOPEN READ-ONLY def dir(self, pattern, matchType='p', asDict=False, download=False): 'generate all item IDs matching the specified pattern' if matchType == 'r': pattern = re.compile(pattern) l = [] for name in self.db: if matchType == 'p' and name.startswith(pattern) or \ matchType == 'r' and pattern.search(name): l.append(name) if asDict: d = {} for name in l: d[name] = self.db.get('__doc__.' + name, None) return d return l def setschema(self, resID, attr, kwargs): 'save a schema binding for resID.attr --> targetID' if not attr.startswith('-'): # REAL ATTRIBUTE targetID = kwargs['targetID'] # RAISES KeyError IF NOT PRESENT self.reopen('w') # OPEN BRIEFLY IN WRITE MODE d = self.db.get('SCHEMA.' + resID, {}) d[attr] = kwargs # SAVE THIS SCHEMA RULE self.db['SCHEMA.' + resID] = d # FORCE shelve TO RESAVE BACK self.reopen('r') # REOPEN READ-ONLY def getschema(self, resID): 'return dict of {attr:{args}}' return self.db['SCHEMA.' + resID] def delschema(self, resID, attr): 'delete schema binding for resID.attr' self.reopen('w') # OPEN BRIEFLY IN WRITE MODE d=self.db['SCHEMA.' + resID] del d[attr] self.db['SCHEMA.' + resID] = d # FORCE shelve TO RESAVE BACK self.reopen('r') # REOPEN READ-ONLY def __del__(self): 'close the shelve file when finished' self.db.close() def dumps(obj, **kwargs): 'pickle to string, using persistent ID encoding' src = StringIO() pickler = PygrPickler(src) # NEED OUR OWN PICKLER, TO USE persistent_id # Root of pickle tree: save even if persistent_id. pickler.setRoot(obj, **kwargs) pickler.dump(obj) # PICKLE IT return src.getvalue() # RETURN THE PICKLED FORM AS A STRING def get_info_dict(obj, pickleString): 'get dict of standard info about a resource' d = dict(creation_time=datetime.datetime.now(), pickle_size=len(pickleString), __doc__=obj.__doc__) try: d['user'] = os.environ['USER'] except KeyError: d['user'] = None return d class MetabaseBase(object): def persistent_load(self, persid): 'check for PYGR_ID:... format and return the requested object' if persid.startswith('PYGR_ID:'): return self(persid[8:]) # RUN OUR STANDARD RESOURCE REQUEST PROCESS else: # UNKNOWN PERSISTENT ID... NOT FROM PYGR! raise pickle.UnpicklingError, 'Invalid persistent ID %s' % persid def load(self, resID, objdata, docstring): 'load the pickled data and all its dependencies' obj = self.loads(objdata) obj.__doc__ = docstring if hasattr(obj, '_saveLocalBuild') and obj._saveLocalBuild: saver = self.writer.saver # mdb in which to record local copy # SAVE AUTO BUILT RESOURCE TO LOCAL PYGR.DATA hasPending = saver.has_pending() # any pending transaction? saver.add_resource(resID, obj) # add to queue for commit obj._saveLocalBuild = False # NO NEED TO SAVE THIS AGAIN if hasPending: print >>sys.stderr, \ '''Saving new resource %s to local worldbase... You must use worldbase.commit() to commit! You are seeing this message because you appear to be in the middle of a worldbase transaction. Ordinarily worldbase would automatically commit this new downloaded resource, but doing so now would also commit your pending transaction, which you may not be ready to do!''' % resID else: # automatically save new resource saver.save_pending() # commit it else: # NORMAL USAGE obj._persistent_id = resID # MARK WITH ITS PERSISTENT ID self.resourceCache[resID] = obj # SAVE TO OUR CACHE self.bind_schema(resID, obj) # BIND SHADOW ATTRIBUTES IF ANY return obj def loads(self, data): 'unpickle from string, using persistent ID expansion' src = StringIO(data) unpickler = pickle.Unpickler(src) # We provide persistent lookup. unpickler.persistent_load = self.persistent_load obj = unpickler.load() # ACTUALLY UNPICKLE THE DATA return obj def __call__(self, resID, debug=None, download=None, *args, **kwargs): 'get the requested resource ID by searching all databases' try: return self.resourceCache[resID] # USE OUR CACHED OBJECT except KeyError: pass debug_state = self.debug # SAVE ORIGINAL STATE download_state = self.download if debug is not None: self.debug = debug if download is not None: # apply the specified download mode self.download = download else: # just use our current download mode download = self.download try: # finally... TO RESTORE debug STATE EVEN IF EXCEPTION OCCURS. self.update(debug=self.debug, keepCurrentPath=True) # load if empty for objdata, docstr in self.find_resource(resID, download): try: obj = self.load(resID, objdata, docstr) break except (KeyError, IOError): # Not in this DB; files not accessible... if self.debug: # PASS ON THE ACTUAL ERROR IMMEDIATELY raise finally: # RESTORE STATE BEFORE RAISING ANY EXCEPTION self.debug = debug_state self.download = download_state self.resourceCache[resID] = obj # save to our cache return obj def bind_schema(self, resID, obj): 'if this resource ID has any schema, bind its attrs to class' try: schema = self.getschema(resID) except KeyError: return # NO SCHEMA FOR THIS OBJ, SO NOTHING TO DO self.resourceCache.schemaCache[resID] = schema # cache for speed for attr, rules in schema.items(): if not attr.startswith('-'): # only bind real attributes self.bind_property(obj, attr, **rules) def bind_property(self, obj, attr, itemRule=False, **kwargs): 'create a descriptor for the attr on the appropriate obj class' try: # SEE IF OBJECT TELLS US TO SKIP THIS ATTRIBUTE return obj._ignoreShadowAttr[attr] # IF PRESENT, NOTHING TO DO except (AttributeError, KeyError): pass # PROCEED AS NORMAL if itemRule: # SHOULD BIND TO ITEMS FROM obj DATABASE # Class used for constructing items. targetClass = get_bound_subclass(obj, 'itemClass') descr = ItemDescriptor(attr, self, **kwargs) else: # SHOULD BIND DIRECTLY TO obj VIA ITS CLASS targetClass = get_bound_subclass(obj) descr = OneTimeDescriptor(attr, self, **kwargs) setattr(targetClass, attr, descr) # BIND descr TO targetClass.attr if itemRule: try: # BIND TO itemSliceClass TOO, IF IT EXISTS... targetClass = get_bound_subclass(obj, 'itemSliceClass') except AttributeError: pass # NO itemSliceClass, SO SKIP else: # BIND TO itemSliceClass setattr(targetClass, attr, descr) if attr == 'inverseDB': # ADD SHADOW __invert__ TO ACCESS THIS addSpecialMethod(obj, '__invert__', getInverseDB) def get_schema_attr(self, resID, attr): 'actually retrieve the desired schema attribute' try: # GET SCHEMA FROM CACHE schema = self.resourceCache.schemaCache[resID] except KeyError: # Hmm, it should be cached! Obtain from resource DB and cache. schema = self.getschema(resID) self.resourceCache.schemaCache[resID] = schema try: schema = schema[attr] # GET SCHEMA FOR THIS SPECIFIC ATTRIBUTE except KeyError: raise AttributeError('no worldbase schema info for %s.%s' \ % (resID, attr)) targetID = schema['targetID'] # GET THE RESOURCE ID return self(targetID) # actually load the resource def add_root_name(self, name): 'add name to the root of our data namespace and schema namespace' # This forces the root object to add name if not present. getattr(self.Data, name) getattr(self.Schema, name) def save_root_names(self, rootNames): 'add set of names to our namespace root' for name in rootNames: self.add_root_name(name) def clear_cache(self): 'clear all resources from cache' self.resourceCache.clear() def get_writer(self): 'return writeable mdb if available, or raise exception' try: return self.writer except AttributeError: raise WorldbaseReadOnlyError('this metabase is read-only!') def add_resource(self, resID, obj=None): """assign obj as the specified resource ID to our metabase. if obj is None, treat resID as a dictionary whose keys are resource IDs and values are the objects to save.""" if obj is None: self.get_writer().saver.add_resource_dict(resID) else: self.get_writer().saver.add_resource(resID, obj) def delete_resource(self, resID): 'delete specified resource ID from our metabase' self.get_writer().saver.delete_resource(resID) def commit(self): 'save any pending resource assignments and schemas' self.get_writer().saver.save_pending() def rollback(self): 'discard any pending resource assignments and schemas' self.get_writer().saver.rollback() def queue_schema_obj(self, schemaPath, attr, schemaObj): 'add a schema to the list of pending schemas to commit' self.get_writer().saver.queue_schema_obj(schemaPath, attr, schemaObj) def add_schema(self, resID, schemaObj): 'assign a schema relation object to a worldbase resource name' l = resID.split('.') schemaPath = SchemaPath(self, '.'.join(l[:-1])) setattr(schemaPath, l[-1], schemaObj) def list_pending(self): return self.get_writer().saver.list_pending() class Metabase(MetabaseBase): def __init__(self, dbpath, resourceCache, zoneDict=None, parent=None, **kwargs): '''zoneDict provides a mechanism for the caller to request information about what type of metabase this dbpath mapped to. zoneDict must be a dict''' self.parent = parent self.Schema = SchemaPath(self) self.Data = ResourceRoot(self) # root of namespace self.resourceCache = resourceCache self.debug = True # single mdb should expose all errors self.download = False if zoneDict is None: # user doesn't want zoneDict info zoneDict = {} # use a dummy dict, disposable if dbpath.startswith('http://'): storage = XMLRPCMetabase(dbpath, self, **kwargs) if 'remote' not in zoneDict: zoneDict['remote'] = self elif dbpath.startswith('mysql:'): storage = MySQLMetabase(dbpath[6:], self, **kwargs) if 'MySQL' not in zoneDict: zoneDict['MySQL'] = self else: # TREAT AS LOCAL FILEPATH dbpath = os.path.expanduser(dbpath) storage = ShelveMetabase(dbpath, self, **kwargs) if dbpath == os.path.expanduser('~') or \ dbpath.startswith(os.path.expanduser('~') + os.sep): if 'my' not in zoneDict: zoneDict['my'] = self elif os.path.isabs(dbpath): if 'system' not in zoneDict: zoneDict['system'] = self elif dbpath.split(os.sep)[0] == os.curdir: if 'here' not in zoneDict: zoneDict['here'] = self elif 'subdir' not in zoneDict: zoneDict['subdir'] = self self.storage = storage if storage.zoneName is not None and storage.zoneName not in zoneDict: zoneDict[storage.zoneName] = self # record this zone name if storage.writeable: self.writeable = True self.saver = ResourceSaver(self) self.writer = self # record downloaded resources here else: self.writeable = False def update(self, worldbasePath=None, debug=None, keepCurrentPath=False): if not keepCurrentPath: # metabase has fixed path raise ValueError('You cannot change the path of a Metabase') def find_resource(self, resID, download=False): yield self.storage.find_resource(resID, download) def get_pending_or_find(self, resID, **kwargs): 'find resID even if only pending (not actually saved yet)' try: # 1st LOOK IN PENDING QUEUE return self.saver.pendingData[resID] except KeyError: pass return self(resID, **kwargs) def getschema(self, resID): 'return dict of {attr: {args}} or KeyError if not found' return self.storage.getschema(resID) def save_root_names(self, rootNames): if self.parent is not None: # add names to parent's namespace as well self.parent.save_root_names(rootNames) MetabaseBase.save_root_names(self, rootNames) # call the generic method def saveSchema(self, resID, attr, args): '''save an attribute binding rule to the schema; DO NOT use this internal interface unless you know what you are doing!''' self.storage.setschema(resID, attr, args) def saveSchemaEdge(self, schema): 'save schema edge to schema graph' self.saveSchema(schema.name, '-schemaEdge', schema) self.storage.graph += schema.sourceDB # ADD NODE TO SCHEMA GRAPH # Edge self.storage.graph[schema.sourceDB][schema.targetDB] = schema.name def dir(self, pattern='', matchType='p', asDict=False, download=False): return self.storage.dir(pattern, matchType, asDict=asDict, download=download) class ZoneDict(UserDict.DictMixin): 'interface to current zones' def __init__(self, mdbList): self.mdbList = mdbList def __getitem__(self, zoneName): self.mdbList.update(keepCurrentPath=True) # make sure metabases loaded return self.mdbList.zoneDict[zoneName] def keys(self): self.mdbList.update(keepCurrentPath=True) # make sure metabases loaded return self.mdbList.zoneDict.keys() def copy(self): self.mdbList.update(keepCurrentPath=True) # make sure metabases loaded return self.mdbList.zoneDict.copy() class MetabaseList(MetabaseBase): '''Primary interface for worldbase resource database access. A single instance of this class is created upon import of the worldbase module, accessible as worldbase.getResource. Users normally will have no need to create additional instances of this class themselves.''' # DEFAULT WORLDBASEPATH: HOME, CURRENT DIR, XMLRPC IN THAT ORDER defaultPath = ['~', '.', 'http://biodb2.bioinformatics.ucla.edu:5000'] def __init__(self, worldbasePath=None, resourceCache=None, separator=',', mdbArgs={}): '''initializes attrs; does not connect to metabases''' if resourceCache is None: # create a cache for loaded resources resourceCache = ResourceCache() self.resourceCache = resourceCache self.mdb = None self.mdbArgs = mdbArgs self.zoneDict = {} self.zones = ZoneDict(self) # interface to dict of zones self.worldbasePath = worldbasePath self.separator = separator self.Schema = SchemaPath(self) self.Data = ResourceRoot(self, zones=self.zones) # root of namespace self.debug = False # if one load attempt fails, try other metabases self.download = False self.ready = False def get_writer(self): 'ensure that metabases are loaded, before looking for our writer' self.update(keepCurrentPath=True) # make sure metabases loaded return MetabaseBase.get_writer(self) # proceed as usual def find_resource(self, resID, download=False): 'search our metabases for pickle string and docstr for resID' for mdb in self.mdb: try: yield mdb.find_resource(resID, download).next() except KeyError: # not in this db pass raise WorldbaseNotFoundError('unable to find %s in WORLDBASEPATH' % resID) def get_worldbase_path(self): 'get environment var, or default in that order' try: return os.environ['WORLDBASEPATH'] except KeyError: try: return os.environ['PYGRDATAPATH'] except KeyError: return self.separator.join(self.defaultPath) def update(self, worldbasePath=None, debug=None, keepCurrentPath=False, mdbArgs=None): 'get the latest list of resource databases' if keepCurrentPath: # only update if self.worldbasePath is None worldbasePath = self.worldbasePath if worldbasePath is None: # get environment var or default worldbasePath = self.get_worldbase_path() if debug is None: debug = self.debug if mdbArgs is None: mdbArgs = self.mdbArgs if not self.ready or self.worldbasePath != worldbasePath: # reload self.worldbasePath = worldbasePath try: # disconnect from previous writeable interface if any del self.writer except AttributeError: pass self.mdb = [] try: # default: we don't have a writeable mdb to save data in del self.writer except AttributeError: pass self.zoneDict = {} for dbpath in worldbasePath.split(self.separator): try: # connect to metabase mdb = Metabase(dbpath, self.resourceCache, self.zoneDict, self, **mdbArgs) except (KeyboardInterrupt, SystemExit): raise # DON'T TRAP THESE CONDITIONS # FORCED TO ADOPT THIS STRUCTURE BECAUSE xmlrpc RAISES # socket.gaierror WHICH IS NOT A SUBCLASS OF StandardError... # SO I CAN'T JUST TRAP StandardError, UNFORTUNATELY... except: # trap errors and continue to next metabase if debug: raise # expose the error immediately else: # warn the user but keep going... import traceback traceback.print_exc(10, sys.stderr) print >>sys.stderr, ''' WARNING: error accessing metabase %s. Continuing...''' % dbpath else: # NO PROBLEM, SO ADD TO OUR RESOURCE DB LIST # Save to our list of resource databases. self.mdb.append(mdb) if mdb.writeable and not hasattr(self, 'writer'): self.writer = mdb # record as place to save resources self.ready = True # metabases successfully loaded def get_pending_or_find(self, resID, **kwargs): 'find resID even if only pending (not actually saved yet)' for mdb in self.mdb: try: # 1st LOOK IN PENDING QUEUE return mdb.saver.pendingData[resID] except KeyError: pass return self(resID, **kwargs) def registerServer(self, locationKey, serviceDict): 'register the serviceDict with the first index server in WORLDBASEPATH' for mdb in self.mdb: if hasattr(mdb.storage, 'registerServer'): n = mdb.storage.registerServer(locationKey, serviceDict) if n == len(serviceDict): return n raise ValueError('unable to register services. Check WORLDBASEPATH') def getschema(self, resID): 'search our resource databases for schema info for the desired ID' for mdb in self.mdb: try: return mdb.getschema(resID) # TRY TO OBTAIN FROM THIS DATABASE except KeyError: pass # NOT IN THIS DB raise KeyError('no schema info available for ' + resID) def dir(self, pattern='', matchType='p', asDict=False, download=False): 'get list or dict of resources beginning with the specified string' self.update(keepCurrentPath=True) # make sure metabases loaded results = [] for mdb in self.mdb: results.append(mdb.dir(pattern, matchType, asDict=asDict, download=download)) if asDict: # merge result dictionaries d = {} results.reverse() # give first results highest precedence for subdir in results: d.update(subdir) return d else: # simply remove redundancy from results d = {} for l in results: filter(d.setdefault, l) # add all entries to dict results = d.keys() results.sort() return results class ResourceCache(dict): 'provide one central repository of loaded resources & schema info' def __init__(self): dict.__init__(self) self.schemaCache = {} def clear(self): dict.clear(self) # clear our dictionary self.schemaCache.clear() # class ResourceSaver(object): 'queues new resources until committed to our mdb' def __init__(self, mdb): self.clear_pending() self.mdb = mdb def clear_pending(self): self.pendingData = {} # CLEAR THE PENDING QUEUE self.pendingSchema = {} # CLEAR THE PENDING QUEUE self.lastData = {} self.lastSchema = {} self.rollbackData = {} # CLEAR THE ROLLBACK CACHE def check_docstring(self, obj): '''enforce requirement for docstring, by raising exception if not present''' try: if obj.__doc__ is None or (hasattr(obj.__class__, '__doc__') and obj.__doc__==obj.__class__.__doc__): raise AttributeError except AttributeError: raise ValueError('to save a resource object, you MUST give it a \ __doc__ string attribute describing it!') def add_resource(self, resID, obj): 'queue the object for saving to our metabase as ' self.check_docstring(obj) obj._persistent_id = resID # MARK OBJECT WITH ITS PERSISTENT ID self.pendingData[resID] = obj # ADD TO QUEUE try: self.rollbackData[resID] = self.mdb.resourceCache[resID] except KeyError: pass self.cache_if_appropriate(resID, obj) def cache_if_appropriate(self, resID, obj): try: if obj._worldbase_no_cache: return # do not cache this object; it is not ready to use!! except AttributeError: pass self.mdb.resourceCache[resID] = obj # SAVE TO OUR CACHE def add_resource_dict(self, d): 'queue a dict of name:object pairs for saving to metabase' for k, v in d.items(): self.add_resource(k, v) def queue_schema_obj(self, schemaPath, attr, schemaObj): 'add a schema object to the queue for saving to our metabase' resID = schemaPath.getPath(attr) # GET STRING ID self.pendingSchema[resID] = (schemaPath, attr, schemaObj) def save_resource(self, resID, obj): 'save the object as ' self.check_docstring(obj) if obj._persistent_id != resID: raise WorldbaseMismatchError( '''The _persistent_id attribute for %s has changed! If you changed it, shame on you! Otherwise, this should not happen, so report the reproducible steps to this error message as a bug report.''' % resID) # Finally, save the object to the database. self.mdb.storage[resID] = obj self.cache_if_appropriate(resID, obj) # SAVE TO OUR CACHE def has_pending(self): 'return True if there are resources pending to be committed' return len(self.pendingData) > 0 or len(self.pendingSchema) > 0 def save_pending(self): 'save any pending worldbase resources and schema' if len(self.pendingData) > 0 or len(self.pendingSchema) > 0: d = self.pendingData schemaDict = self.pendingSchema else: raise WorldbaseEmptyError('there is no data queued for saving!') for resID, obj in d.items(): # now save the data self.save_resource(resID, obj) for schemaPath, attr, schemaObj in schemaDict.values():# save schema schemaObj.saveSchema(schemaPath, attr, self.mdb) # save each rule self.clear_pending() # FINALLY, CLEAN UP... self.lastData = d # keep as a historical record self.lastSchema = schemaDict def list_pending(self): 'return tuple of pending data dictionary, pending schema' return list(self.pendingData), list(self.pendingSchema) def rollback(self): 'dump any pending data without saving, and restore state of cache' if len(self.pendingData) == 0 and len(self.pendingSchema) == 0: raise WorldbaseEmptyError('there is no data queued for saving!') # Restore the rollback queue. self.mdb.resourceCache.update(self.rollbackData) self.clear_pending() def delete_resource(self, resID): # incorporate this into commit-process? 'delete the specified resource from resourceCache, saver and schema' del self.mdb.storage[resID] # delete from the resource database try: del self.mdb.resourceCache[resID] # delete from cache if exists except KeyError: pass try: del self.pendingData[resID] # delete from queue if exists except KeyError: pass self.delSchema(resID) def delSchema(self, resID): 'delete schema bindings TO and FROM this resource ID' storage = self.mdb.storage try: d = storage.getschema(resID) # GET THE EXISTING SCHEMA except KeyError: return # no schema stored for this object so nothing to do... # This is more aggressive than needed... Could be refined. self.mdb.resourceCache.schemaCache.clear() for attr, obj in d.items(): if attr.startswith('-'): # A SCHEMA OBJECT obj.delschema(storage) # DELETE ITS SCHEMA RELATIONS storage.delschema(resID, attr) # delete attribute schema rule def __del__(self): try: self.save_pending() # SEE WHETHER ANY DATA NEEDS SAVING print >>sys.stderr, ''' WARNING: saving worldbase pending data that you forgot to save... Remember in the future, you must issue the command worldbase.commit() to save your pending worldbase resources to your resource database(s), or alternatively worldbase.rollback() to dump those pending data without saving them. It is a very bad idea to rely on this automatic attempt to save your forgotten data, because it is possible that the Python interpreter may never call this function at exit (for details see the atexit module docs in the Python Library Reference).''' except WorldbaseEmptyError: pass class ResourceServer(XMLRPCServerBase): 'serves resources that can be transmitted on XMLRPC' def __init__(self, mdb, name, serverClasses=None, clientHost=None, withIndex=True, excludeClasses=None, downloadDB=None, resourceDict=None, **kwargs): 'construct server for the designated classes' XMLRPCServerBase.__init__(self, name, **kwargs) self.mdb = mdb if resourceDict is None: resourceDict = mdb.resourceCache if excludeClasses is None: # DEFAULT: NO POINT IN SERVING SQL TABLES... from sqlgraph import SQLTableBase, SQLGraphClustered excludeClasses = [SQLTableBase, SQLGraphClustered] if serverClasses is None: # DEFAULT TO ALL CLASSES WE KNOW HOW TO SERVE from seqdb import SequenceFileDB, BlastDB, \ XMLRPCSequenceDB, BlastDBXMLRPC, \ AnnotationDB, AnnotationClient, AnnotationServer serverClasses=[(SequenceFileDB, XMLRPCSequenceDB, BlastDBXMLRPC), (BlastDB, XMLRPCSequenceDB, BlastDBXMLRPC), (AnnotationDB, AnnotationClient, AnnotationServer)] try: from cnestedlist import NLMSA from xnestedlist import NLMSAClient, NLMSAServer serverClasses.append((NLMSA, NLMSAClient, NLMSAServer)) except ImportError: # cnestedlist NOT INSTALLED, SO SKIP... pass if clientHost is None: # DEFAULT: USE THE SAME HOST STRING AS SERVER clientHost = self.host clientDict = {} for id, obj in resourceDict.items(): # Save all objects matching serverClasses. skipThis = False for skipClass in excludeClasses: # CHECK LIST OF CLASSES TO EXCLUDE if isinstance(obj, skipClass): skipThis = True break if skipThis: continue # DO NOT INCLUDE THIS OBJECT IN SERVER skipThis = True for baseKlass, clientKlass, serverKlass in serverClasses: if isinstance(obj, baseKlass) and not isinstance(obj, clientKlass): skipThis = False # OK, WE CAN SERVE THIS CLASS break if skipThis: # HAS NO XMLRPC CLIENT-SERVER CLASS PAIRING try: # SAVE IT AS ITSELF self.client_dict_setitem(clientDict, id, obj, badClasses=nonPortableClasses) except WorldbaseNotPortableError: pass # HAS NON-PORTABLE LOCAL DEPENDENCIES, SO SKIP IT continue # GO ON TO THE NEXT DATA RESOURCE try: # TEST WHETHER obj CAN BE RE-CLASSED TO CLIENT / SERVER # Convert to server class for serving.` obj.__class__ = serverKlass except TypeError: # GRR, EXTENSION CLASS CAN'T BE RE-CLASSED... state = obj.__getstate__() # READ obj STATE newobj = serverKlass.__new__(serverKlass) # ALLOCATE NEW OBJECT newobj.__setstate__(state) # AND INITIALIZE ITS STATE obj = newobj # THIS IS OUR RE-CLASSED VERSION OF obj try: # USE OBJECT METHOD TO SAVE HOST INFO, IF ANY... obj.saveHostInfo(clientHost, self.port, id) except AttributeError: # TRY TO SAVE URL AND NAME DIRECTLY ON obj obj.url = 'http://%s:%d' % (clientHost, self.port) obj.name = id obj.__class__ = clientKlass # CONVERT TO CLIENT CLASS FOR PICKLING self.client_dict_setitem(clientDict, id, obj) obj.__class__ = serverKlass # CONVERT TO SERVER CLASS FOR SERVING self[id] = obj # ADD TO XMLRPC SERVER self.registrationData = clientDict # SAVE DATA FOR SERVER REGISTRATION if withIndex: # SERVE OUR OWN INDEX AS A STATIC, READ-ONLY INDEX myIndex = MetabaseServer(name, readOnly=True, # CREATE EMPTY INDEX downloadDB=downloadDB) self['index'] = myIndex # ADD TO OUR XMLRPC SERVER # Add our resources to the index. self.register('', '', server=myIndex) def client_dict_setitem(self, clientDict, k, obj, **kwargs): 'save pickle and schema for obj into clientDict' pickleString = dumps(obj, **kwargs) # PICKLE THE CLIENT OBJECT, SAVE clientDict[k] = (get_info_dict(obj, pickleString), pickleString) try: # SAVE SCHEMA INFO AS WELL... clientDict['SCHEMA.' + k] = (dict(schema_version='1.0'), self.mdb.getschema(k)) except KeyError: pass # NO SCHEMA FOR THIS OBJ, SO NOTHING TO DO class ResourcePath(object): 'simple way to read resource names as python foo.bar.bob expressions' def __init__(self, mdb, base=None): self.__dict__['_path'] = base # AVOID TRIGGERING setattr! self.__dict__['_mdb'] = mdb def getPath(self, name): if self._path is not None: return self._path + '.' + name else: return name def __getattr__(self, name): 'extend the resource path by one more attribute' attr = self._pathClass(self._mdb, self.getPath(name)) # MUST NOT USE setattr BECAUSE WE OVERRIDE THIS BELOW! self.__dict__[name] = attr # CACHE THIS ATTRIBUTE ON THE OBJECT return attr def __call__(self, *args, **kwargs): 'construct the requested resource' return self._mdb(self._path, *args, **kwargs) def __setattr__(self, name, obj): 'save obj using the specified resource name' self._mdb.add_resource(self.getPath(name), obj) def __delattr__(self, name): self._mdb.delete_resource(self.getPath(name)) try: # IF ACTUAL ATTRIBUTE EXISTS, JUST DELETE IT del self.__dict__[name] except KeyError: # TRY TO DELETE RESOURCE FROM THE DATABASE pass # NOTHING TO DO def __dir__(self, prefix=None, start=None): """return list of our attributes from worldbase search""" if prefix is None: start = len(self._path) + 1 # skip past . separator prefix = self._path l = self._mdb.dir(prefix) d = {} for name in l: if name.startswith(prefix): d[name[start:].split('.')[0]] = None return d.keys() ResourcePath._pathClass = ResourcePath class ResourceRoot(ResourcePath): 'provide proxy to public metabase methods' def __init__(self, mdb, base=None, zones=None): ResourcePath.__init__(self, mdb, base) self.__dict__['schema'] = mdb.Schema # AVOID TRIGGERING setattr! if zones is not None: self.__dict__['zones'] = zones for attr in ('dir', 'commit', 'rollback', 'add_resource', 'delete_resource', 'clear_cache', 'add_schema', 'update', 'list_pending'): self.__dict__[attr] = getattr(mdb, attr) # mirror metabase methods def __call__(self, resID, *args, **kwargs): """Construct the requested resource""" return self._mdb(resID, *args, **kwargs) def __dir__(self): return ResourcePath.__dir__(self, '', 0) class ResourceZone(object): 'provide pygr.Data old-style interface to resource zones' def __init__(self, mdb, zoneName): self._mdbParent = mdb self._zoneName = zoneName def __getattr__(self, name): # Make sure metabases have been loaded. self._mdbParent.update(keepCurrentPath=True) try: mdb = self._mdbParent.zoneDict[self._zoneName] # get our zone except KeyError: raise ValueError('no zone "%s" available' % self._zoneName) if name == 'schema': # get schema root return SchemaPath.__getitem__(self, mdb) else: # treat as regular worldbase string return ResourcePath.__getitem__(self, mdb, name) class SchemaPath(ResourcePath): 'save schema information for a resource' def __setattr__(self, name, schema): try: schema.saveSchema # VERIFY THAT THIS LOOKS LIKE A SCHEMA OBJECT except AttributeError: raise ValueError('not a valid schema object!') self._mdb.queue_schema_obj(self, name, schema) # QUEUE IT def __delattr__(self, attr): raise NotImplementedError('schema deletion is not yet implemented.') SchemaPath._pathClass = SchemaPath class DirectRelation(object): 'bind an attribute to the target' def __init__(self, target): self.targetID = getID(target) def schemaDict(self): return dict(targetID=self.targetID) def saveSchema(self, source, attr, mdb, **kwargs): d = self.schemaDict() d.update(kwargs) # ADD USER-SUPPLIED ARGS try: # IF kwargs SUPPLIED A TARGET, SAVE ITS ID d['targetID'] = getID(d['targetDB']) del d['targetDB'] except KeyError: pass mdb.saveSchema(getID(source), attr, d) class ItemRelation(DirectRelation): 'bind item attribute to the target' def schemaDict(self): return dict(targetID=self.targetID, itemRule=True) class ManyToManyRelation(object): 'a general graph mapping from sourceDB -> targetDB with edge info' _relationCode = 'many:many' def __init__(self, sourceDB, targetDB, edgeDB=None, bindAttrs=None, sourceNotNone=None, targetNotNone=None): self.sourceDB = getID(sourceDB) # CONVERT TO STRING RESOURCE ID self.targetDB = getID(targetDB) if edgeDB is not None: self.edgeDB = getID(edgeDB) else: self.edgeDB = None self.bindAttrs = bindAttrs if sourceNotNone is not None: self.sourceNotNone = sourceNotNone if targetNotNone is not None: self.targetNotNone = targetNotNone def save_graph_bindings(self, graphDB, attr, mdb): '''save standard schema bindings to graphDB attributes sourceDB, targetDB, edgeDB''' graphDB = graphDB.getPath(attr) # GET STRING ID FOR source self.name = graphDB mdb.saveSchemaEdge(self) #SAVE THIS RULE b = DirectRelation(self.sourceDB) # SAVE sourceDB BINDING b.saveSchema(graphDB, 'sourceDB', mdb) b = DirectRelation(self.targetDB) # SAVE targetDB BINDING b.saveSchema(graphDB, 'targetDB', mdb) if self.edgeDB is not None: # SAVE edgeDB BINDING b = DirectRelation(self.edgeDB) b.saveSchema(graphDB, 'edgeDB', mdb) return graphDB def saveSchema(self, path, attr, mdb): 'save schema bindings associated with this rule' graphDB = self.save_graph_bindings(path, attr, mdb) if self.bindAttrs is not None: bindObj = (self.sourceDB, self.targetDB, self.edgeDB) bindArgs = [{}, dict(invert=True), dict(getEdges=True)] try: # USE CUSTOM INVERSE SCHEMA IF PROVIDED BY TARGET DB bindArgs[1] = mdb.get_pending_or_find(graphDB). \ _inverse_schema() except AttributeError: pass for i in range(3): if len(self.bindAttrs) > i and self.bindAttrs[i] is not None: b = ItemRelation(graphDB) # SAVE ITEM BINDING b.saveSchema(bindObj[i], self.bindAttrs[i], mdb, **bindArgs[i]) def delschema(self, resourceDB): 'delete resource attribute bindings associated with this rule' if self.bindAttrs is not None: bindObj = (self.sourceDB, self.targetDB, self.edgeDB) for i in range(3): if len(self.bindAttrs) > i and self.bindAttrs[i] is not None: resourceDB.delschema(bindObj[i], self.bindAttrs[i]) class OneToManyRelation(ManyToManyRelation): _relationCode = 'one:many' class OneToOneRelation(ManyToManyRelation): _relationCode = 'one:one' class ManyToOneRelation(ManyToManyRelation): _relationCode = 'many:one' class InverseRelation(DirectRelation): "bind source and target as each other's inverse mappings" _relationCode = 'inverse' def saveSchema(self, source, attr, mdb, **kwargs): 'save schema bindings associated with this rule' source = source.getPath(attr) # GET STRING ID FOR source self.name = source mdb.saveSchemaEdge(self) #SAVE THIS RULE DirectRelation.saveSchema(self, source, 'inverseDB', mdb, **kwargs) # source -> target b = DirectRelation(source) # CREATE REVERSE MAPPING b.saveSchema(self.targetID, 'inverseDB', mdb, **kwargs) # target -> source def delschema(self, resourceDB): resourceDB.delschema(self.targetID, 'inverseDB') def getID(obj): 'get persistent ID of the object or raise AttributeError' if isinstance(obj, str): # TREAT ANY STRING AS A RESOURCE ID return obj elif isinstance(obj, ResourcePath): return obj._path # GET RESOURCE ID FROM A ResourcePath else: try: # GET RESOURCE'S PERSISTENT ID return obj._persistent_id except AttributeError: raise AttributeError('this obj has no persistent ID!') PKðŠ’;WÃâØXUXUpygr/metabase.pyc;ò |†Kc@s2dkZdkZdkZdkZdkZdkZdklZdklZl Z l Z dk l Z l Z lZlZdklZyeWnej oegZnXdefd„ƒYZdefd„ƒYZd efd „ƒYZd efd „ƒYZd efd„ƒYZd„Zd„Zdefd„ƒYZdefd„ƒYZdefd„ƒYZ defd„ƒYZ!defd„ƒYZ"defd„ƒYZ#dei$fd„ƒYZ%dei&fd „ƒYZ'd!efd"„ƒYZ(d#„Z)d$efd%„ƒYZ*d&efd'„ƒYZ+d(efd)„ƒYZ,d*efd+„ƒYZ-d,efd-„ƒYZ.d.„Z/d/„Z0d0efd1„ƒYZ1d2e1fd3„ƒYZ2d4ei3fd5„ƒYZ4d6e1fd7„ƒYZ5d8e6fd9„ƒYZ7d:efd;„ƒYZ8d<efd=„ƒYZ9d>efd?„ƒYZ:e:e:_;d@e:fdA„ƒYZ<dBefdC„ƒYZ=dDe:fdE„ƒYZ>e>e>_;dFefdG„ƒYZ?dHe?fdI„ƒYZ@dJefdK„ƒYZAdLeAfdM„ƒYZBdNeAfdO„ƒYZCdPeAfdQ„ƒYZDdRe?fdS„ƒYZEdT„ZFdS(UN(sStringIO(s CollectionsMappingsGraph(s open_shelvesstandard_invertsget_bound_subclasssSourceFileName(sXMLRPCServerBasesOneTimeDescriptorcBs tZdZd„Zd„ZRS(s)provides shadow attribute based on schemacKs||_||_dS(N(sattrNamesselfsattrsmdb(sselfsattrNamesmdbskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__s cCs_y |i}Wntj otdƒ‚nX|ii||iƒ}||i |i<|SdS(NsYattempt to access worldbase attr on non-worldbase object( sobjs_persistent_idsresIDsAttributeErrorsselfsmdbsget_schema_attrsattrstargets__dict__(sselfsobjsobjtypesresIDstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__s (s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneTimeDescriptors  sItemDescriptorcBs8tZdZeeeeed„Zd„Zd„ZRS(s<provides shadow attribute for items in a db, based on schemac KsC||_||_||_||_||_||_||_dS(N( sattrNamesselfsattrsmdbsinvertsgetEdgessmapAttrs targetAttrs uniqueMapping( sselfsattrNamesmdbsinvertsgetEdgessmapAttrs targetAttrs uniqueMappingskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__+s      cCs~y|ii}Wntj otdƒ‚nX|ii||iƒ}|i o |}n|i o |i }n|SdS(s2return the mapping object for this schema relationsYattempt to access worldbase attr on non-worldbase objectN( sobjsdbs_persistent_idsresIDsAttributeErrorsselfsmdbsget_schema_attrsattrs targetDictsinvertsgetEdgessedges(sselfsobjsresIDs targetDict((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_target5s    cCsœ|i|ƒ}|itj o5t||iƒ}|tjotSn||}n ||}|i tj ot||i ƒ}n||i |i <|SdS(N( sselfs get_targetsobjs targetDictsmapAttrsNonesgetattrsobj_idsresults targetAttrs__dict__sattr(sselfsobjsobjtypes targetDictsobj_idsresult((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__Cs  (s__name__s __module__s__doc__sFalsesNones__init__s get_targets__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysItemDescriptor(s  sItemDescriptorRWcBstZd„ZRS(NcCsH|i otdƒ‚n|i|ƒ}|||<||i|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__set__Us   (s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysItemDescriptorRWSssForwardingDescriptorcBs tZdZd„Zd„ZRS(s;forward an attribute request to item from another containercCs||_||_dS(N(stargetDBsselfsattr(sselfstargetDBsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__bs cCs$|i|i}t||iƒSdS(N(sselfstargetDBsobjsidstargetsgetattrsattr(sselfsobjsobjtypestarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__fs(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysForwardingDescriptor_s  sSpecialMethodDescriptorcBs tZdZd„Zd„ZRS(s4enables shadowing of special methods like __invert__cCs ||_dS(N(sattrNamesselfsattr(sselfsattrName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__nscCsEy|i|iSWn,tj o td||ifƒ‚nXdS(Ns%s has no method %s(sobjs__dict__sselfsattrsKeyErrorsAttributeError(sselfsobjsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__qs(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysSpecialMethodDescriptorks  cCs–dk}|i|||iƒ}y"t||ƒ|jodSnWntj onXtd|ƒ‚t |||ƒt |i|t |ƒƒdS(s|bind function f as special method attr on obj. obj cannot be an builtin or extension class (if so, just subclass it)Ns(%s already bound to a different function( snewsinstancemethodsfsobjs __class__smsgetattrsattrsAttributeErrorssetattrsSpecialMethodDescriptor(sobjsattrsfsmsnew((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysaddSpecialMethodxs  cCs |iSdS(s default shadow __invert__ methodN(sselfs inverseDB(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getInverseDBŠssWorldbaseNotPortableErrorcBstZdZRS(sbindicates that object has a local data dependency and cannot be transferred to a remote client(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNotPortableErrors sWorldbaseNotFoundErrorcBstZdZRS(s`unable to find a loadable resource for the requested worldbase identifier from WORLDBASEPATH(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNotFoundError•s sWorldbaseMismatchErrorcBstZdZRS(sP_persistent_id attr on object no longer matches its assigned worldbase ID?!?(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseMismatchError›s sWorldbaseEmptyErrorcBstZdZRS(sFuser hasn't queued anything, so trying to save or rollback is an error(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseEmptyError¡s sWorldbaseReadOnlyErrorcBstZdZRS(s6attempt to write data to a read-only resource database(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseReadOnlyError¦s sWorldbaseSchemaErrorcBstZdZRS(sIattempt to set attribute to an object not in the database bound by schema(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseSchemaError«s sWorldbaseNoModuleErrorcBstZdZRS(s6attempt to pickle a class from a non-importable module(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNoModuleError°s s PygrPicklercBs tZd„Zhfd„ZRS(NcCs)dk}y>t||iƒo |idjotd|iƒ‚nWntj onXyzt||iƒ o ||i j oRyd|i t |ƒSWqÖt j o&|i tj od|i SqÒqÖXnWntj onXx1|iD]&}t||ƒotdƒ‚q÷q÷WtSdS(sNconvert objects with _persistent_id to PYGR_ID strings during picklingNs__main__s}You cannot pickle a class from __main__! To make this class (%s) picklable, it must be loaded via a regular import statement.s PYGR_ID:%ssUthis object has a local data dependency and cannnot be transferred to a remote client(stypess isinstancesobjsTypeTypes __module__sWorldbaseNoModuleErrors__name__sAttributeErrorsselfsroots sourceIDssidsKeyErrors_persistent_idsNones badClassessklasssWorldbaseNotPortableError(sselfsobjsklassstypes((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys persistent_id·s* #$ cCs||_||_||_dS(sOset obj as root of pickling tree: genuinely pickle it (not just its id)N(sobjsselfsroots sourceIDss badClasses(sselfsobjs sourceIDss badClasses((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssetRootÖs  (s__name__s __module__s persistent_idssetRoot(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys PygrPicklerµs sMetabaseServercBs¿tZdZhdd<dd<dd<dd<dd<ddbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__äs     1 sdefaultcCsxt|dƒ}xX|iƒD]J\}}|idƒo||i|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysread_download_dbñs cCs |iSdS(s!return layer name for this serverN(sselfsname(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetNameûscCs/|o|i|ifSn|i|ifSdS(N(sdownloadsselfs downloadDBs downloadDocssdsdocs(sselfsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_dbÿscCs»|i|ƒ\}}y||}Wntj o dSnX|idƒo:xc|D]+}y||d=WqTtj oqTXqTWn-y||d|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getResources$  cCsrd}xa|iƒD]S\}\}}||ii|hƒ|<|t j o||i |build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServers  cCsXy:|i||=t|i|ƒdjo|i|=nWntj onXdSdS(s:delete the specified resource under the specified locationisN(sselfsdsids locationKeyslensdocssKeyError(sselfsids locationKey((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delResource$sspc CsÛ|i|ƒ\}}|djoti|ƒ}ng}xY|D]Q}|djo |i |ƒp|djo |i |ƒo|i |ƒqBqBW|o5h} x$|D]}|i|hƒ| |return list or dict of resources matching the specified stringsrspN(sselfsget_dbsdownloadsdbsdocss matchTypesrescompilespatternslsnames startswithssearchsappendsasDictsdsget( sselfspatternsasDicts matchTypesdownloadsnamesdbslsdocssd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir.s  :cCs |iSdS(N(sselfs_pygr_data_version(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_version?s(s__name__s __module__s__doc__sxmlrpc_methodss_pygr_data_versionsTruesNones__init__sread_download_dbsgetNamesget_dbsFalses getResourcesregisterServers delResourcesdirs get_version(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysMetabaseServerÞs <    cGstdƒ‚dS(Ns€You cannot save data to a remote XMLRPC server. Give a user-editable resource database as the first entry in your WORLDBASEPATH!(sWorldbaseReadOnlyError(sselfsl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysraise_illegal_saveCssXMLRPCMetabasecBs_tZdZd„Zed„Zd„Zd„Zdeed„Ze Z e Z e Z e Z RS(s3client interface to remote XMLRPC resource databasecKsPdkl}||dƒ|_||_||_|iiƒ|_t|_ dS(N(sget_connectionsindex( s coordinatorsget_connectionsurlsselfsserversmdbsgetNameszoneNamesFalses writeable(sselfsurlsmdbskwargssget_connection((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ms    cCs¿|o|ii||ƒ}n|ii|ƒ}|djotd|ƒ‚ny|d}|d=Wntj o t }nXx$|i ƒD]\}}||fSq‘Wtd|ƒ‚dS(s9get pickledata,docstring for this resource ID from serverssresource %s not founds__doc__s&unable to find %s from remote servicesN( sdownloadsselfsservers getResourcesidsdsWorldbaseNotFoundErrors docstringsKeyErrorsNonesitemsslocationsobjdata(sselfsidsdownloadsobjdatasds docstringslocation((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourceUs     cCs|ii||ƒSdS(s"forward registration to the serverN(sselfsserversregisterServers locationKeys serviceDict(sselfs locationKeys serviceDict((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServerfscCsR|iid|ƒ}|djo t‚nx|iƒD] }|Sq:Wt‚dS(sreturn dict of {attr: {args}}sSCHEMA.sN(sselfsservers getResourcesidsdsKeyErrorsvaluess schemaDict(sselfsids schemaDictsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschemajs   spcCs>|o|ii||||ƒSn|ii|||ƒSdS(s>return list or dict of resources matching the specified stringN(sdownloadsselfsserversdirspatternsasDicts matchType(sselfspatterns matchTypesasDictsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdirss(s__name__s __module__s__doc__s__init__sFalses find_resourcesregisterServers getschemasdirsraise_illegal_saves __setitem__s __delitem__s setschemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysXMLRPCMetabaseJs     s MySQLMetabasecBs‰tZdZdddfZeed„Zd„Zed„Zd„Z d„Z d„Z d „Z d „Z d „Zd eed „ZRS(s To create a new resource table, call: MySQLMetabase("DBNAME.TABLENAME", mdb, createLayer="LAYERNAME") where DBNAME is the name of your database, TABLENAME is the name of the table you want to create, and LAYERNAME is the layer name you want to assign itiic Ksxdkl}l} ||ƒ\|_|_|_||_t|_ h|_ |id}|t jo |}n|t j oÂtiiƒ}|iid|iƒ|iid|iƒ|iid|id||dfƒ|iid|id d |idfƒ||_|iid|ƒ|iid |ƒnôy#|iid |idfƒ} WnAtj o5tid dd|i|iddfIJ‚nX| djo|iiƒd|_n|iid|idfƒdjo?x(|iiƒD]} t |i | d) where is the layer name you want to assign it. %ss!i(is)select location from %s where pygr_id=%%ss0roots attrAliass source_ids target_idsedge_ids simpleKeyss unpack_edge( ssqlgraphsget_name_cursorsSQLGraphs tablenamesselfscursors serverInfosmdbsTrues writeables rootNamess schemaTables createLayersNonesnewZonesdatetimesnows creation_timesexecutes_pygr_data_versionszoneNamesns StandardErrorssyssstderrsfetchonesfetchallsrowssave_root_namessdicts SchemaEdgesgraph( sselfs tablenamesmdbs createLayersnewZoneskwargss schemaTables creation_timesget_name_cursorsSQLGraphsnsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ˆsH        + cCs4t|i|<|iid|id|dfƒdS(NsZinsert into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)s0rootsa(sNonesselfs rootNamessnamescursorsexecutes tablename(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_nameÇs cCsZ|iid|i|fƒx*|iiƒD]\}}}||fSq-Wt dƒ‚dS(s:get construction rule from mysql, and attempt to constructsWselect location,objdata,docstring from %s where pygr_id=%%ssPunable to construct %s from remote servicesN( sselfscursorsexecutes tablenamesidsfetchallslocationsobjdatas docstringsWorldbaseNotFoundError(sselfsidsdownloadsobjdatas docstringslocation((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourceÍs c Cs˜t|ƒ}t||ƒ}|iid|i|d|i|i |d|d|d|fƒ|i dƒd}||i jo|i|ƒndS( s'add an object to this resource databases°replace into %s (pygr_id,location,docstring,user, creation_time,pickle_size,objdata) values (%%s, %%s,%%s,%%s,%%s,%%s,%%s)smysql:susers creation_times pickle_sizes.iN(sdumpssobjsss get_info_dictsdsselfscursorsexecutes tablenamesids__doc__ssplitsroots rootNamesssave_root_name(sselfsidsobjsdsssroot((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setitem__Ös 2cCs>|iid|i|fƒdjotd|ƒ‚ndS(s)delete this resource and its schema ruless delete from %s where pygr_id=%%sisno resource %s in this databaseN(sselfscursorsexecutes tablenamesidsWorldbaseNotFoundError(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delitem__äsc Csvd}xe|iƒD]W\}\}}||iid|i |||d|d|d|d|fƒ7}qW|SdS(s1register the specified services to mysql databaseisáreplace into %s (pygr_id,location, docstring,user,creation_time,pickle_size, objdata) values (%%s,%%s,%%s,%%s,%%s,%%s, %%s)s__doc__susers creation_times pickle_sizeN( sns serviceDictsitemssidsdspdatasselfscursorsexecutes tablenames locationKey(sselfs locationKeys serviceDictsdspdatasnsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServerës 3cCsV|idƒ o|d}nt|ƒ}|iid|i d|||fƒdS(s.save a schema binding for id.attr --> targetIDs-stargetIDs[replace into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)sSCHEMA.N( sattrs startswithskwargsstargetIDsdumpsskwdatasselfscursorsexecutes tablenamesid(sselfsidsattrskwargsskwdatastargetID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys setschemaøs  cCs(|iid|id||fƒdS(s!delete schema binding for id.attrs1delete from %s where pygr_id=%%s and location=%%ssSCHEMA.N(sselfscursorsexecutes tablenamesidsattr(sselfsidsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschemascCseh}|iid|id|fƒx3|iiƒD]"\}}|i i |ƒ||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschemas spc Cs|djo!|iid|i|fƒnF|djo%|iid|i|dfƒn|ohSngSh}xP|iiƒD]?}t d|dd|d d |d d |d ƒ||dreturn list or dict of resources matching the specified stringsrsxselect pygr_id,docstring,user,creation_time, pickle_size from %s where pygr_id regexp %%sspsvselect pygr_id,docstring,user,creation_time, pickle_size from %s where pygr_id like %%ss%s__doc__isuseris creation_timeis pickle_sizeiiN(s matchTypesselfscursorsexecutes tablenamespatternsasDictsdsfetchallslsdictsappends_[1]sname( sselfspatterns matchTypesasDictsdownloadsdsls_[1]sname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdirs$  !(s__name__s __module__s__doc__s_pygr_data_versionsNones__init__ssave_root_namesFalses find_resources __setitem__s __delitem__sregisterServers setschemas delschemas getschemasdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MySQLMetabase€s ?     s SchemaEdgecBs tZdZd„Zd„ZRS(s4provides unpack_edge method for schema graph storagecCs ||_dS(N(sschemaDBsself(sselfsschemaDB((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__.scCs|ii|ƒdSdS(s/get the actual schema object describing this IDs -schemaEdgeN(sselfsschemaDBs getschemasedgeID(sselfsedgeID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__1s(s__name__s __module__s__doc__s__init__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys SchemaEdge+s  sResourceDBGraphDescrcBstZdZd„ZRS(s0this property provides graph interface to schemac CsEtd|iddddtdtdt|ƒƒ}||_|SdS(Nsfilenames_schemasmodescwswriteNows simpleKeyss unpack_edge(sGraphsobjsdbpathsTrues SchemaEdgesgsgraph(sselfsobjsobjtypesg((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__9s (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysResourceDBGraphDescr6s sShelveMetabasecBs’tZdZdddfZeƒZded„Zd„Ze d„Z d„Z d„Z d e e d „Z d „Zd „Zd „Zd„ZRS(siBerkeleyDB-based storage of worldbase resource databases, using the python shelve module. Users will not need to create instances of this class themselves, as worldbase automatically creates one for each appropriate entry in your WORLDBASEPATH; if the corresponding database file does not already exist, it is automatically created for you.iisrcKs#dk}tii|dƒ|_||_t|_t |_ yqt |i|ƒ|_ y|i|i dƒWntj onXy|i d|_ Wntj onXWno|ij o`t |idƒ|_ |i|i dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Js,        cCs&|iiƒt|i|ƒ|_dS(N(sselfsdbscloses open_shelvesdbpathsmode(sselfsmode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysreopenbs cCsN|i|}y||id|dfSWntj o|tfSnXdS(s'get an item from this resource databases__doc__.s__doc__N(sselfsdbsresIDsobjdatasKeyErrorsNone(sselfsresIDsdownloadsobjdata((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourcefs  cCs©t|ƒ}|idƒz{||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setitem__ns     cCs‹|idƒziy|i|=Wn,tj o td||ifƒ‚nXy|id|=Wntj onXWd|idƒXdS(s<delete this item from the database, with a modicum of safetyswsID %s not found in %ss__doc__.Nsr(sselfsreopensdbsresIDsKeyErrorsWorldbaseNotFoundErrorsdbpath(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delitem__}s  spcCsÐ|djoti|ƒ}ng}x\|iD]Q}|djo |i|ƒp|djo |i |ƒo|i |ƒq0q0W|o<h}x+|D]#}|ii d|tƒ||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdirs  :!cCsq|idƒ o|d}n|idƒ|iid|hƒ}|||<||id|<|idƒdS(s1save a schema binding for resID.attr --> targetIDs-stargetIDswsSCHEMA.srN( sattrs startswithskwargsstargetIDsselfsreopensdbsgetsresIDsd(sselfsresIDsattrskwargssdstargetID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys setschemas  cCs|id|SdS(sreturn dict of {attr:{args}}sSCHEMA.N(sselfsdbsresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschema§scCsG|idƒ|id|}||=||id|<|idƒdS(s$delete schema binding for resID.attrswsSCHEMA.srN(sselfsreopensdbsresIDsdsattr(sselfsresIDsattrsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschema«s  cCs|iiƒdS(s#close the shelve file when finishedN(sselfsdbsclose(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__del__³s(s__name__s __module__s__doc__s_pygr_data_versionsResourceDBGraphDescrsgraphsNones__init__sreopensFalses find_resources __setitem__s __delitem__sdirs setschemas getschemas delschemas__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysShelveMetabase@s        cKs@tƒ}t|ƒ}|i|||i|ƒ|iƒSdS(s.pickle to string, using persistent ID encodingN( sStringIOssrcs PygrPicklerspicklerssetRootsobjskwargssdumpsgetvalue(sobjskwargsssrcspickler((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdumps¸s    cCsjtdtiiƒdt|ƒd|iƒ}yti d|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_info_dictÂss MetabaseBasecBs¶tZd„Zd„Zd„Zeed„Zd„Zed„Z d„Z d„Z d „Z d „Z d „Zed „Zd „Zd„Zd„Zd„Zd„Zd„ZRS(NcCs6|idƒo||dƒSntid|‚dS(s<check for PYGR_ID:... format and return the requested objectsPYGR_ID:isInvalid persistent ID %sN(spersids startswithsselfspicklesUnpicklingError(sselfspersid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyspersistent_loadÏscCs»|i|ƒ}||_t|dƒo|io[|ii }|i ƒ}|i ||ƒt|_|otid|IJq–|iƒn ||_||i|<|i||ƒ|SdS(s.load the pickled data and all its dependenciess_saveLocalBuildsdSaving new resource %s to local worldbase... You must use worldbase.commit() to commit! You are seeing this message because you appear to be in the middle of a worldbase transaction. Ordinarily worldbase would automatically commit this new downloaded resource, but doing so now would also commit your pending transaction, which you may not be ready to do!N(sselfsloadssobjdatasobjs docstrings__doc__shasattrs_saveLocalBuildswriterssavers has_pendings hasPendings add_resourcesresIDsFalsessyssstderrs save_pendings_persistent_ids resourceCaches bind_schema(sselfsresIDsobjdatas docstringsobjs hasPendingssaver((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysloadÖs      cCs;t|ƒ}ti|ƒ}|i|_|iƒ}|SdS(s3unpickle from string, using persistent ID expansionN( sStringIOsdatassrcspickles Unpicklers unpicklersselfspersistent_loadsloadsobj(sselfsdatassrcsobjs unpickler((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysloadsðs    c Os&y|i|SWntj onX|i} |i}|tj o ||_n|tj o ||_n |i}z‡|i d|idt ƒxg|i ||ƒD]S\}}y|i|||ƒ} PWq£ttfj o|io‚qöq£Xq£WWd| |_||_X| |i|<| SdS(s8get the requested resource ID by searching all databasessdebugskeepCurrentPathN(sselfs resourceCachesresIDsKeyErrorsdebugs debug_statesdownloadsdownload_statesNonesupdatesTrues find_resourcesobjdatasdocstrsloadsobjsIOError( sselfsresIDsdebugsdownloadsargsskwargssobjdatasdocstrsdownload_statesobjs debug_state((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__ùs6            cCs†y|i|ƒ}Wntj o dSnX||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys bind_schemas  cKsîy|i|SWnttfj onX|o%t|dƒ}t|||}nt|ƒ}t |||}t |||ƒ|o=yt|dƒ}Wntj oqÉXt |||ƒn|djot|dtƒndS(s=create a descriptor for the attr on the appropriate obj classs itemClasssitemSliceClasss inverseDBs __invert__N(sobjs_ignoreShadowAttrsattrsAttributeErrorsKeyErrorsitemRulesget_bound_subclasss targetClasssItemDescriptorsselfskwargssdescrsOneTimeDescriptorssetattrsaddSpecialMethods getInverseDB(sselfsobjsattrsitemRuleskwargssdescrs targetClass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys bind_property"s&  cCs›y|ii|}Wn2tj o&|i|ƒ}||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_schema_attr:s cCs$t|i|ƒt|i|ƒdS(s?add name to the root of our data namespace and schema namespaceN(sgetattrsselfsDatasnamesSchema(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_root_nameJscCs"x|D]}|i|ƒqWdS(s&add set of names to our namespace rootN(s rootNamessnamesselfs add_root_name(sselfs rootNamessname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_namesPscCs|iiƒdS(sclear all resources from cacheN(sselfs resourceCachesclear(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys clear_cacheUscCs1y |iSWntj otdƒ‚nXdS(s5return writeable mdb if available, or raise exceptionsthis metabase is read-only!N(sselfswritersAttributeErrorsWorldbaseReadOnlyError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_writerYs  cCsD|tjo|iƒii|ƒn|iƒii||ƒdS(s´assign obj as the specified resource ID to our metabase. if obj is None, treat resID as a dictionary whose keys are resource IDs and values are the objects to save.N(sobjsNonesselfs get_writerssaversadd_resource_dictsresIDs add_resource(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_resource`s cCs|iƒii|ƒdS(s.delete specified resource ID from our metabaseN(sselfs get_writerssaversdelete_resourcesresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdelete_resourceiscCs|iƒiiƒdS(s1save any pending resource assignments and schemasN(sselfs get_writerssavers save_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscommitmscCs|iƒiiƒdS(s4discard any pending resource assignments and schemasN(sselfs get_writerssaversrollback(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysrollbackqscCs |iƒii|||ƒdS(s5add a schema to the list of pending schemas to commitN(sselfs get_writerssaversqueue_schema_objs schemaPathsattrs schemaObj(sselfs schemaPathsattrs schemaObj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysqueue_schema_objuscCsC|idƒ}t|di|d ƒƒ}t||d|ƒdS(s<assign a schema relation object to a worldbase resource names.iÿÿÿÿN( sresIDssplitsls SchemaPathsselfsjoins schemaPathssetattrs schemaObj(sselfsresIDs schemaObjsls schemaPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_schemayscCs|iƒiiƒSdS(N(sselfs get_writerssavers list_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys list_pendings(s__name__s __module__spersistent_loadsloadsloadssNones__call__s bind_schemasFalses bind_propertysget_schema_attrs add_root_namessave_root_namess clear_caches get_writers add_resourcesdelete_resourcescommitsrollbacksqueue_schema_objs add_schemas list_pending(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MetabaseBaseÍs$              sMetabasecBswtZeed„Zeeed„Zed„Zd„Zd„Zd„Z d„Z d„Z d d eed „Z RS( NcKs`||_t|ƒ|_t|ƒ|_||_t|_t |_ |t jo h}n|idƒo1t|||}d|jo||dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__…sL        <          cCs| otdƒ‚ndS(Ns(You cannot change the path of a Metabase(skeepCurrentPaths ValueError(sselfs worldbasePathsdebugskeepCurrentPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysupdate³sccs|ii||ƒVdS(N(sselfsstorages find_resourcesresIDsdownload(sselfsresIDsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resource·scKs9y|ii|SWntj onX|||SdS(s8find resID even if only pending (not actually saved yet)N(sselfssavers pendingDatasresIDsKeyErrorskwargs(sselfsresIDskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_pending_or_findºs cCs|ii|ƒSdS(s6return dict of {attr: {args}} or KeyError if not foundN(sselfsstorages getschemasresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschemaÂscCs8|itj o|ii|ƒnti||ƒdS(N(sselfsparentsNonessave_root_namess rootNamess MetabaseBase(sselfs rootNames((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_namesÆscCs|ii|||ƒdS(s|save an attribute binding rule to the schema; DO NOT use this internal interface unless you know what you are doing!N(sselfsstorages setschemasresIDsattrsargs(sselfsresIDsattrsargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemaËscCsL|i|id|ƒ|ii|i7_|i|ii|i|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssaveSchemaEdgeÐssspcCs#|ii||d|d|ƒSdS(NsasDictsdownload(sselfsstoragesdirspatterns matchTypesasDictsdownload(sselfspatterns matchTypesasDictsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir×s( s__name__s __module__sNones__init__sFalsesupdates find_resourcesget_pending_or_finds getschemassave_root_namess saveSchemassaveSchemaEdgesdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysMetabaseƒs.      sZoneDictcBs2tZdZd„Zd„Zd„Zd„ZRS(sinterface to current zonescCs ||_dS(N(smdbListsself(sselfsmdbList((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ßscCs%|iidtƒ|ii|SdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictszoneName(sselfszoneName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getitem__âscCs'|iidtƒ|iiiƒSdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyskeysæscCs'|iidtƒ|iiiƒSdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictscopy(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscopyês(s__name__s __module__s__doc__s__init__s __getitem__skeysscopy(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysZoneDictÜs    s MetabaseListcBs•tZdZdddgZeedhd„Zd„Zed„Zd„Z eeeed „Z d „Z d „Z d „Z d deed„ZRS(sPrimary interface for worldbase resource database access. A single instance of this class is created upon import of the worldbase module, accessible as worldbase.getResource. Users normally will have no need to create additional instances of this class themselves.s~s.s*http://biodb2.bioinformatics.ucla.edu:5000s,cCs¥|tjo tƒ}n||_t|_||_h|_t|ƒ|_||_ ||_ t |ƒ|_ t |d|iƒ|_t|_t|_t|_dS(s0initializes attrs; does not connect to metabasesszonesN(s resourceCachesNones ResourceCachesselfsmdbsmdbArgsszoneDictsZoneDictszoness worldbasePaths separators SchemaPathsSchemas ResourceRootsDatasFalsesdebugsdownloadsready(sselfs worldbasePaths resourceCaches separatorsmdbArgs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__øs          cCs!|idtƒti|ƒSdS(s?ensure that metabases are loaded, before looking for our writerskeepCurrentPathN(sselfsupdatesTrues MetabaseBases get_writer(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_writer sccsXxA|iD]6}y|i||ƒiƒVWq tj oq Xq Wtd|ƒ‚dS(s;search our metabases for pickle string and docstr for resIDs"unable to find %s in WORLDBASEPATHN(sselfsmdbs find_resourcesresIDsdownloadsnextsKeyErrorsWorldbaseNotFoundError(sselfsresIDsdownloadsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resources  cCsaytidSWnKtj o?ytidSWq]tj o|ii|iƒSq]XnXdS(s-get environment var, or default in that orders WORLDBASEPATHs PYGRDATAPATHN(sossenvironsKeyErrorsselfs separatorsjoins defaultPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_worldbase_pathscCsÃ|o |i}n|tjo|iƒ}n|tjo |i}n|tjo |i}n|i p |i|jo?||_y |`Wnt j onXg|_ y |`Wnt j onXh|_ xÔ|i |i ƒD]À}y"t||i|i ||}Wn]ttfj o ‚qî|o‚q®dk}|idtiƒtid|IJqîX|i i|ƒ|iot|dƒ o ||_qîqîWt|_ndS(s)get the latest list of resource databasesNi s5 WARNING: error accessing metabase %s. Continuing...swriter(skeepCurrentPathsselfs worldbasePathsNonesget_worldbase_pathsdebugsmdbArgssreadyswritersAttributeErrorsmdbszoneDictssplits separatorsdbpathsMetabases resourceCachesKeyboardInterrupts SystemExits tracebacks print_excssyssstderrsappends writeableshasattrsTrue(sselfs worldbasePathsdebugskeepCurrentPathsmdbArgssdbpaths tracebacksmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysupdate#sL            cKsMx9|iD].}y|ii|SWq tj oq Xq W|||SdS(s8find resID even if only pending (not actually saved yet)N(sselfsmdbssavers pendingDatasresIDsKeyErrorskwargs(sselfsresIDskwargssmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_pending_or_findRs  cCskxX|iD]M}t|idƒo4|ii||ƒ}|t|ƒjo|SqWq q Wt dƒ‚dS(sEregister the serviceDict with the first index server in WORLDBASEPATHsregisterServers1unable to register services. Check WORLDBASEPATHN( sselfsmdbshasattrsstoragesregisterServers locationKeys serviceDictsnslens ValueError(sselfs locationKeys serviceDictsmdbsn((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServer[s cCsOx8|iD]-}y|i|ƒSWq tj oq Xq Wtd|ƒ‚dS(s@search our resource databases for schema info for the desired IDsno schema info available for N(sselfsmdbs getschemasresIDsKeyError(sselfsresIDsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschemads  sspc CsÑ|idtƒg}x6|iD]+}|i|i||d|d|ƒƒq W|o6h}|i ƒx|D]} |i| ƒqmW|SnBh}x|D]}t|i|ƒq™W|iƒ}|iƒ|SdS(sAget list or dict of resources beginning with the specified stringskeepCurrentPathsasDictsdownloadN(sselfsupdatesTruesresultssmdbsappendsdirspatterns matchTypesasDictsdownloadsdsreversessubdirslsfilters setdefaultskeysssort( sselfspatterns matchTypesasDictsdownloadsdsmdbsresultsslssubdir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdirms*    (s__name__s __module__s__doc__s defaultPathsNones__init__s get_writersFalses find_resourcesget_worldbase_pathsupdatesget_pending_or_findsregisterServers getschemasdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MetabaseListïs   / s ResourceCachecBs tZdZd„Zd„ZRS(s@provide one central repository of loaded resources & schema infocCsti|ƒh|_dS(N(sdicts__init__sselfs schemaCache(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__†s cCsti|ƒ|iiƒdS(N(sdictsclearsselfs schemaCache(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysclearŠs (s__name__s __module__s__doc__s__init__sclear(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceCacheƒs  s ResourceSavercBs•tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„ZRS(s/queues new resources until committed to our mdbcCs|iƒ||_dS(N(sselfs clear_pendingsmdb(sselfsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__’s cCs1h|_h|_h|_h|_h|_dS(N(sselfs pendingDatas pendingSchemaslastDatas lastSchemas rollbackData(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys clear_pending–s     cCsmyG|itjp&t|idƒo|i|iijo t‚nWntj otdƒ‚nXdS(sNenforce requirement for docstring, by raising exception if not presents__doc__srto save a resource object, you MUST give it a __doc__ string attribute describing it!N(sobjs__doc__sNoneshasattrs __class__sAttributeErrors ValueError(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscheck_docstrings 9cCsh|i|ƒ||_||i|N( sselfscheck_docstringsobjsresIDs_persistent_ids pendingDatasmdbs resourceCaches rollbackDatasKeyErrorscache_if_appropriate(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_resource¨s   cCs@y|iodSnWntj onX||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscache_if_appropriate³s   cCs1x*|iƒD]\}}|i||ƒq WdS(s8queue a dict of name:object pairs for saving to metabaseN(sdsitemssksvsselfs add_resource(sselfsdsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysadd_resource_dict»s cCs)|i|ƒ}|||f|i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysqueue_schema_objÀscCsU|i|ƒ|i|jotd|ƒ‚n||ii|<|i||ƒdS(ssave the object as s½The _persistent_id attribute for %s has changed! If you changed it, shame on you! Otherwise, this should not happen, so report the reproducible steps to this error message as a bug report.N( sselfscheck_docstringsobjs_persistent_idsresIDsWorldbaseMismatchErrorsmdbsstoragescache_if_appropriate(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys save_resourceÅs  cCs-t|iƒdjpt|iƒdjSdS(s:return True if there are resources pending to be committediN(slensselfs pendingDatas pendingSchema(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys has_pendingÑscCsÑt|iƒdjpt|iƒdjo|i}|i}n tdƒ‚x*|iƒD]\}}|i ||ƒq[Wx3|i ƒD]%\}}}|i|||iƒqˆW|iƒ||_||_dS(s/save any pending worldbase resources and schemais#there is no data queued for saving!N(slensselfs pendingDatas pendingSchemasds schemaDictsWorldbaseEmptyErrorsitemssresIDsobjs save_resourcesvaluess schemaPathsattrs schemaObjs saveSchemasmdbs clear_pendingslastDatas lastSchema(sselfsresIDsds schemaObjs schemaDicts schemaPathsobjsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys save_pendingÕs,       cCs t|iƒt|iƒfSdS(s7return tuple of pending data dictionary, pending schemaN(slistsselfs pendingDatas pendingSchema(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys list_pendingäscCs`t|iƒdjot|iƒdjotdƒ‚n|iii|iƒ|i ƒdS(s@dump any pending data without saving, and restore state of cacheis#there is no data queued for saving!N( slensselfs pendingDatas pendingSchemasWorldbaseEmptyErrorsmdbs resourceCachesupdates rollbackDatas clear_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysrollbackès ,cCsi|ii|=y|ii|=Wntj onXy|i|=Wntj onX|i|ƒdS(sBdelete the specified resource from resourceCache, saver and schemaN(sselfsmdbsstoragesresIDs resourceCachesKeyErrors pendingDatas delSchema(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdelete_resourceðs cCsž|ii}y|i|ƒ}Wntj o dSnX|iiii ƒxK|i ƒD]=\}}|i dƒo|i|ƒn|i||ƒqYWdS(s3delete schema bindings TO and FROM this resource IDNs-(sselfsmdbsstorages getschemasresIDsdsKeyErrors resourceCaches schemaCachesclearsitemssattrsobjs startswiths delschema(sselfsresIDsdsstoragesobjsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delSchemaýs   cCs5y|iƒtidIJWntj onXdS(Ns WARNING: saving worldbase pending data that you forgot to save... Remember in the future, you must issue the command worldbase.commit() to save your pending worldbase resources to your resource database(s), or alternatively worldbase.rollback() to dump those pending data without saving them. It is a very bad idea to rely on this automatic attempt to save your forgotten data, because it is possible that the Python interpreter may never call this function at exit (for details see the atexit module docs in the Python Library Reference).(sselfs save_pendingssyssstderrsWorldbaseEmptyError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__del__ s   (s__name__s __module__s__doc__s__init__s clear_pendingscheck_docstrings add_resourcescache_if_appropriatesadd_resource_dictsqueue_schema_objs save_resources has_pendings save_pendings list_pendingsrollbacksdelete_resources delSchemas__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceSavers           sResourceServercBs2tZdZeeeeeed„Zd„ZRS(s2serves resources that can be transmitted on XMLRPCc !KsKti||| ||_|tjo |i}n|tjo#dk l }l }||g}n|tjo¯dkl}l}l}l}l}l}l}|||f|||f|||fg}y:dkl}dkl}l}|i|||fƒWq"tj oq"Xn|tjo |i}nh}x¶|i ƒD]¨\} }t#} x)|D]!}t&||ƒo t'} PqhqhW| oqOnt'} xC|D];\} }}t&|| ƒot&||ƒ o t#} Pq¨q¨W| o:y|i+|| |dt,ƒWqOt-j oqOXqOny ||_.WnAt/j o5|i0ƒ}|i2|ƒ} | i4|ƒ| }nXy|i5||i6| ƒWn2t7j o&d||i6f|_8| |_nX||_.|i+|| |ƒ||_.||| d d d | ƒnd S( s+construct server for the designated classes(s SQLTableBasesSQLGraphClustered(sSequenceFileDBsBlastDBsXMLRPCSequenceDBs BlastDBXMLRPCs AnnotationDBsAnnotationClientsAnnotationServer(sNLMSA(s NLMSAClients NLMSAServers badClassess http://%s:%dsreadOnlys downloadDBsindexssserverN(?sXMLRPCServerBases__init__sselfsnameskwargssmdbs resourceDictsNones resourceCachesexcludeClassesssqlgraphs SQLTableBasesSQLGraphClustereds serverClassessseqdbsSequenceFileDBsBlastDBsXMLRPCSequenceDBs BlastDBXMLRPCs AnnotationDBsAnnotationClientsAnnotationServers cnestedlistsNLMSAs xnestedlists NLMSAClients NLMSAServersappends ImportErrors clientHostshosts clientDictsitemssidsobjsFalsesskipThiss skipClasss isinstancesTrues baseKlasss clientKlasss serverKlasssclient_dict_setitemsnonPortableClassessWorldbaseNotPortableErrors __class__s TypeErrors __getstate__sstates__new__snewobjs __setstate__s saveHostInfosportsAttributeErrorsurlsregistrationDatas withIndexsMetabaseServers downloadDBsmyIndexsregister(!sselfsmdbsnames serverClassess clientHosts withIndexsexcludeClassess downloadDBs resourceDictskwargss baseKlasssmyIndexsnewobjsidsstates NLMSAClients clientKlasssBlastDBsSequenceFileDBs BlastDBXMLRPCsXMLRPCSequenceDBs skipClasssNLMSAs serverKlasss clientDictsobjsAnnotationServersAnnotationClients AnnotationDBsSQLGraphClustereds NLMSAServers SQLTableBasesskipThis((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__s„     1*                  cKsot||}t||ƒ|f||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysclient_dict_setitemhs-(s__name__s __module__s__doc__sNonesTrues__init__sclient_dict_setitem(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysResourceServers Js ResourcePathcBsVtZdZed„Zd„Zd„Zd„Zd„Zd„Z eed„Z RS(sCsimple way to read resource names as python foo.bar.bob expressionscCs||id<||idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__vs cCs+|itj o|id|Sn|SdS(Ns.(sselfs_pathsNonesname(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetPathzscCs3|i|i|i|ƒƒ}||i|<|SdS(s.extend the resource path by one more attributeN(sselfs _pathClasss_mdbsgetPathsnamesattrs__dict__(sselfsnamesattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getattr__€s cOs|i|i||ŽSdS(s construct the requested resourceN(sselfs_mdbs_pathsargsskwargs(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__‡scCs |ii|i|ƒ|ƒdS(s*save obj using the specified resource nameN(sselfs_mdbs add_resourcesgetPathsnamesobj(sselfsnamesobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setattr__‹scCsA|ii|i|ƒƒy|i|=Wntj onXdS(N(sselfs_mdbsdelete_resourcesgetPathsnames__dict__sKeyError(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delattr__s cCs“|tjo t|iƒd}|i}n|ii|ƒ}h}x=|D]5}|i |ƒot|||i dƒdbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__dir__–s  #( s__name__s __module__s__doc__sNones__init__sgetPaths __getattr__s__call__s __setattr__s __delattr__s__dir__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourcePathss       s ResourceRootcBs/tZdZeed„Zd„Zd„ZRS(s(provide proxy to public metabase methodsc Cs‡ti|||ƒ|i|id<|tj o||idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__¨s "cOs|i|||ŽSdS(s Construct the requested resourceN(sselfs_mdbsresIDsargsskwargs(sselfsresIDsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__²scCsti|ddƒSdS(Nsi(s ResourcePaths__dir__sself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__dir__¶s(s__name__s __module__s__doc__sNones__init__s__call__s__dir__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceRoot¥s  s ResourceZonecBs tZdZd„Zd„ZRS(s7provide pygr.Data old-style interface to resource zonescCs||_||_dS(N(smdbsselfs _mdbParentszoneNames _zoneName(sselfsmdbszoneName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__½s cCs‹|iidtƒy|ii|i}Wn&tj otd|iƒ‚nX|djot i ||ƒSnt i |||ƒSdS(NskeepCurrentPathsno zone "%s" availablesschema( sselfs _mdbParentsupdatesTrueszoneDicts _zoneNamesmdbsKeyErrors ValueErrorsnames SchemaPaths __getitem__s ResourcePath(sselfsnamesmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getattr__Ás (s__name__s __module__s__doc__s__init__s __getattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceZoneºs  s SchemaPathcBs tZdZd„Zd„ZRS(s&save schema information for a resourcecCsGy |iWntj otdƒ‚nX|ii|||ƒdS(Nsnot a valid schema object!(sschemas saveSchemasAttributeErrors ValueErrorsselfs_mdbsqueue_schema_objsname(sselfsnamesschema((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setattr__Ñs  cCstdƒ‚dS(Ns'schema deletion is not yet implemented.(sNotImplementedError(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delattr__Øs(s__name__s __module__s__doc__s __setattr__s __delattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys SchemaPathÎs  sDirectRelationcBs)tZdZd„Zd„Zd„ZRS(sbind an attribute to the targetcCst|ƒ|_dS(N(sgetIDstargetsselfstargetID(sselfstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__áscCstd|iƒSdS(NstargetID(sdictsselfstargetID(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys schemaDictäscKsk|iƒ}|i|ƒyt|dƒ|d<|d=Wntj onX|it|ƒ||ƒdS(NstargetDBstargetID( sselfs schemaDictsdsupdateskwargssgetIDsKeyErrorsmdbs saveSchemassourcesattr(sselfssourcesattrsmdbskwargssd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemaçs   (s__name__s __module__s__doc__s__init__s schemaDicts saveSchema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysDirectRelationÞs   s ItemRelationcBstZdZd„ZRS(s!bind item attribute to the targetcCstd|idtƒSdS(NstargetIDsitemRule(sdictsselfstargetIDsTrue(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys schemaDictõs(s__name__s __module__s__doc__s schemaDict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ItemRelationòs sManyToManyRelationcBsDtZdZdZeeeed„Zd„Zd„Zd„ZRS(s@a general graph mapping from sourceDB -> targetDB with edge infos many:manycCsˆt|ƒ|_t|ƒ|_|tj ot|ƒ|_n t|_||_|tj o ||_n|tj o ||_ndS(N( sgetIDssourceDBsselfstargetDBsedgeDBsNones bindAttrss sourceNotNones targetNotNone(sselfssourceDBstargetDBsedgeDBs bindAttrss sourceNotNones targetNotNone((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ýs      cCs§|i|ƒ}||_|i|ƒt|iƒ}|i |d|ƒt|i ƒ}|i |d|ƒ|i t j o&t|i ƒ}|i |d|ƒn|SdS(sVsave standard schema bindings to graphDB attributes sourceDB, targetDB, edgeDBssourceDBstargetDBsedgeDBN(sgraphDBsgetPathsattrsselfsnamesmdbssaveSchemaEdgesDirectRelationssourceDBsbs saveSchemastargetDBsedgeDBsNone(sselfsgraphDBsattrsmdbsb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_graph_bindings s  c Cs|i|||ƒ}|itj oæ|i|i |i f}ht dt ƒt dt ƒg}y|i|ƒiƒ|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemas! * cCs|itj o||i|i|if}xatdƒD]O}t |iƒ|jo|i|tj o|i |||i|ƒq5q5WndS(s<delete resource attribute bindings associated with this ruleiN( sselfs bindAttrssNonessourceDBstargetDBsedgeDBsbindObjsrangesislens resourceDBs delschema(sselfs resourceDBsbindObjsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschema+s *( s__name__s __module__s__doc__s _relationCodesNones__init__ssave_graph_bindingss saveSchemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysManyToManyRelationùs   sOneToManyRelationcBstZdZRS(Nsone:many(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneToManyRelation4ssOneToOneRelationcBstZdZRS(Nsone:one(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneToOneRelation8ssManyToOneRelationcBstZdZRS(Nsmany:one(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysManyToOneRelation<ssInverseRelationcBs&tZdZdZd„Zd„ZRS(s7bind source and target as each other's inverse mappingssinversecKsg|i|ƒ}||_|i|ƒti||d||t|ƒ}|i|i d||dS(s.save schema bindings associated with this rules inverseDBN( ssourcesgetPathsattrsselfsnamesmdbssaveSchemaEdgesDirectRelations saveSchemaskwargssbstargetID(sselfssourcesattrsmdbskwargssb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemaDs    cCs|i|idƒdS(Ns inverseDB(s resourceDBs delschemasselfstargetID(sselfs resourceDB((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschemaOs(s__name__s __module__s__doc__s _relationCodes saveSchemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysInverseRelation@s  cCsdt|tƒo|SnIt|tƒo |iSn.y |iSWntj otdƒ‚nXdS(s7get persistent ID of the object or raise AttributeErrorsthis obj has no persistent ID!N(s isinstancesobjsstrs ResourcePaths_paths_persistent_idsAttributeError(sobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetIDSs  (GsdatetimesosspicklesressyssUserDictsStringIOsmappings CollectionsMappingsGraphs classutils open_shelvesstandard_invertsget_bound_subclasssSourceFileNames coordinatorsXMLRPCServerBasesnonPortableClassess NameErrorsobjectsOneTimeDescriptorsItemDescriptorsItemDescriptorRWsForwardingDescriptorsSpecialMethodDescriptorsaddSpecialMethods getInverseDBs ValueErrorsWorldbaseNotPortableErrorsKeyErrorsWorldbaseNotFoundErrorsWorldbaseMismatchErrorsWorldbaseEmptyErrorsWorldbaseReadOnlyErrorsWorldbaseSchemaErrors PickleErrorsWorldbaseNoModuleErrorsPicklers PygrPicklersMetabaseServersraise_illegal_savesXMLRPCMetabases MySQLMetabases SchemaEdgesResourceDBGraphDescrsShelveMetabasesdumpss get_info_dicts MetabaseBasesMetabases DictMixinsZoneDicts MetabaseListsdicts ResourceCaches ResourceSaversResourceServers ResourcePaths _pathClasss ResourceRoots ResourceZones SchemaPathsDirectRelations ItemRelationsManyToManyRelationsOneToManyRelationsOneToOneRelationsManyToOneRelationsInverseRelationsgetID(;sOneTimeDescriptorsItemDescriptorRWsGraphsstandard_invertsWorldbaseNotPortableErrorsdatetimesXMLRPCServerBases ItemRelationsWorldbaseEmptyErrorsManyToManyRelationsraise_illegal_saves ResourceSaversMetabaseServersMetabases PygrPicklersForwardingDescriptorsOneToOneRelationsXMLRPCMetabasesDirectRelationsnonPortableClassessInverseRelationsMappings Collectionsres getInverseDBsResourceServersWorldbaseReadOnlyErrorsWorldbaseNotFoundErrorsManyToOneRelations MetabaseListsShelveMetabases ResourceRoots get_info_dicts SchemaEdgesUserDicts open_shelves SchemaPathssyssSpecialMethodDescriptorsgetIDsSourceFileNamesWorldbaseSchemaErrorspickles ResourceZonesOneToManyRelationsItemDescriptorsStringIOsossWorldbaseNoModuleErrors ResourcePathsWorldbaseMismatchErrorsdumpss MetabaseBasesZoneDictsResourceDBGraphDescrs ResourceCachesget_bound_subclasssaddSpecialMethods MySQLMetabase((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys?st        +    )e 6«  x ¶Y” ŒX/  ;PKñŠ’;WÃâØXUXUpygr/metabase.pyo;ò |†Kc@s2dkZdkZdkZdkZdkZdkZdklZdklZl Z l Z dk l Z l Z lZlZdklZyeWnej oegZnXdefd„ƒYZdefd„ƒYZd efd „ƒYZd efd „ƒYZd efd„ƒYZd„Zd„Zdefd„ƒYZdefd„ƒYZdefd„ƒYZ defd„ƒYZ!defd„ƒYZ"defd„ƒYZ#dei$fd„ƒYZ%dei&fd „ƒYZ'd!efd"„ƒYZ(d#„Z)d$efd%„ƒYZ*d&efd'„ƒYZ+d(efd)„ƒYZ,d*efd+„ƒYZ-d,efd-„ƒYZ.d.„Z/d/„Z0d0efd1„ƒYZ1d2e1fd3„ƒYZ2d4ei3fd5„ƒYZ4d6e1fd7„ƒYZ5d8e6fd9„ƒYZ7d:efd;„ƒYZ8d<efd=„ƒYZ9d>efd?„ƒYZ:e:e:_;d@e:fdA„ƒYZ<dBefdC„ƒYZ=dDe:fdE„ƒYZ>e>e>_;dFefdG„ƒYZ?dHe?fdI„ƒYZ@dJefdK„ƒYZAdLeAfdM„ƒYZBdNeAfdO„ƒYZCdPeAfdQ„ƒYZDdRe?fdS„ƒYZEdT„ZFdS(UN(sStringIO(s CollectionsMappingsGraph(s open_shelvesstandard_invertsget_bound_subclasssSourceFileName(sXMLRPCServerBasesOneTimeDescriptorcBs tZdZd„Zd„ZRS(s)provides shadow attribute based on schemacKs||_||_dS(N(sattrNamesselfsattrsmdb(sselfsattrNamesmdbskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__s cCs_y |i}Wntj otdƒ‚nX|ii||iƒ}||i |i<|SdS(NsYattempt to access worldbase attr on non-worldbase object( sobjs_persistent_idsresIDsAttributeErrorsselfsmdbsget_schema_attrsattrstargets__dict__(sselfsobjsobjtypesresIDstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__s (s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneTimeDescriptors  sItemDescriptorcBs8tZdZeeeeed„Zd„Zd„ZRS(s<provides shadow attribute for items in a db, based on schemac KsC||_||_||_||_||_||_||_dS(N( sattrNamesselfsattrsmdbsinvertsgetEdgessmapAttrs targetAttrs uniqueMapping( sselfsattrNamesmdbsinvertsgetEdgessmapAttrs targetAttrs uniqueMappingskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__+s      cCs~y|ii}Wntj otdƒ‚nX|ii||iƒ}|i o |}n|i o |i }n|SdS(s2return the mapping object for this schema relationsYattempt to access worldbase attr on non-worldbase objectN( sobjsdbs_persistent_idsresIDsAttributeErrorsselfsmdbsget_schema_attrsattrs targetDictsinvertsgetEdgessedges(sselfsobjsresIDs targetDict((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_target5s    cCsœ|i|ƒ}|itj o5t||iƒ}|tjotSn||}n ||}|i tj ot||i ƒ}n||i |i <|SdS(N( sselfs get_targetsobjs targetDictsmapAttrsNonesgetattrsobj_idsresults targetAttrs__dict__sattr(sselfsobjsobjtypes targetDictsobj_idsresult((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__Cs  (s__name__s __module__s__doc__sFalsesNones__init__s get_targets__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysItemDescriptor(s  sItemDescriptorRWcBstZd„ZRS(NcCsH|i otdƒ‚n|i|ƒ}|||<||i|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__set__Us   (s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysItemDescriptorRWSssForwardingDescriptorcBs tZdZd„Zd„ZRS(s;forward an attribute request to item from another containercCs||_||_dS(N(stargetDBsselfsattr(sselfstargetDBsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__bs cCs$|i|i}t||iƒSdS(N(sselfstargetDBsobjsidstargetsgetattrsattr(sselfsobjsobjtypestarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__fs(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysForwardingDescriptor_s  sSpecialMethodDescriptorcBs tZdZd„Zd„ZRS(s4enables shadowing of special methods like __invert__cCs ||_dS(N(sattrNamesselfsattr(sselfsattrName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__nscCsEy|i|iSWn,tj o td||ifƒ‚nXdS(Ns%s has no method %s(sobjs__dict__sselfsattrsKeyErrorsAttributeError(sselfsobjsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__qs(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysSpecialMethodDescriptorks  cCs–dk}|i|||iƒ}y"t||ƒ|jodSnWntj onXtd|ƒ‚t |||ƒt |i|t |ƒƒdS(s|bind function f as special method attr on obj. obj cannot be an builtin or extension class (if so, just subclass it)Ns(%s already bound to a different function( snewsinstancemethodsfsobjs __class__smsgetattrsattrsAttributeErrorssetattrsSpecialMethodDescriptor(sobjsattrsfsmsnew((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysaddSpecialMethodxs  cCs |iSdS(s default shadow __invert__ methodN(sselfs inverseDB(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getInverseDBŠssWorldbaseNotPortableErrorcBstZdZRS(sbindicates that object has a local data dependency and cannot be transferred to a remote client(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNotPortableErrors sWorldbaseNotFoundErrorcBstZdZRS(s`unable to find a loadable resource for the requested worldbase identifier from WORLDBASEPATH(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNotFoundError•s sWorldbaseMismatchErrorcBstZdZRS(sP_persistent_id attr on object no longer matches its assigned worldbase ID?!?(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseMismatchError›s sWorldbaseEmptyErrorcBstZdZRS(sFuser hasn't queued anything, so trying to save or rollback is an error(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseEmptyError¡s sWorldbaseReadOnlyErrorcBstZdZRS(s6attempt to write data to a read-only resource database(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseReadOnlyError¦s sWorldbaseSchemaErrorcBstZdZRS(sIattempt to set attribute to an object not in the database bound by schema(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseSchemaError«s sWorldbaseNoModuleErrorcBstZdZRS(s6attempt to pickle a class from a non-importable module(s__name__s __module__s__doc__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysWorldbaseNoModuleError°s s PygrPicklercBs tZd„Zhfd„ZRS(NcCs)dk}y>t||iƒo |idjotd|iƒ‚nWntj onXyzt||iƒ o ||i j oRyd|i t |ƒSWqÖt j o&|i tj od|i SqÒqÖXnWntj onXx1|iD]&}t||ƒotdƒ‚q÷q÷WtSdS(sNconvert objects with _persistent_id to PYGR_ID strings during picklingNs__main__s}You cannot pickle a class from __main__! To make this class (%s) picklable, it must be loaded via a regular import statement.s PYGR_ID:%ssUthis object has a local data dependency and cannnot be transferred to a remote client(stypess isinstancesobjsTypeTypes __module__sWorldbaseNoModuleErrors__name__sAttributeErrorsselfsroots sourceIDssidsKeyErrors_persistent_idsNones badClassessklasssWorldbaseNotPortableError(sselfsobjsklassstypes((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys persistent_id·s* #$ cCs||_||_||_dS(sOset obj as root of pickling tree: genuinely pickle it (not just its id)N(sobjsselfsroots sourceIDss badClasses(sselfsobjs sourceIDss badClasses((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssetRootÖs  (s__name__s __module__s persistent_idssetRoot(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys PygrPicklerµs sMetabaseServercBs¿tZdZhdd<dd<dd<dd<dd<ddbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__äs     1 sdefaultcCsxt|dƒ}xX|iƒD]J\}}|idƒo||i|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysread_download_dbñs cCs |iSdS(s!return layer name for this serverN(sselfsname(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetNameûscCs/|o|i|ifSn|i|ifSdS(N(sdownloadsselfs downloadDBs downloadDocssdsdocs(sselfsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_dbÿscCs»|i|ƒ\}}y||}Wntj o dSnX|idƒo:xc|D]+}y||d=WqTtj oqTXqTWn-y||d|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getResources$  cCsrd}xa|iƒD]S\}\}}||ii|hƒ|<|t j o||i |build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServers  cCsXy:|i||=t|i|ƒdjo|i|=nWntj onXdSdS(s:delete the specified resource under the specified locationisN(sselfsdsids locationKeyslensdocssKeyError(sselfsids locationKey((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delResource$sspc CsÛ|i|ƒ\}}|djoti|ƒ}ng}xY|D]Q}|djo |i |ƒp|djo |i |ƒo|i |ƒqBqBW|o5h} x$|D]}|i|hƒ| |return list or dict of resources matching the specified stringsrspN(sselfsget_dbsdownloadsdbsdocss matchTypesrescompilespatternslsnames startswithssearchsappendsasDictsdsget( sselfspatternsasDicts matchTypesdownloadsnamesdbslsdocssd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir.s  :cCs |iSdS(N(sselfs_pygr_data_version(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_version?s(s__name__s __module__s__doc__sxmlrpc_methodss_pygr_data_versionsTruesNones__init__sread_download_dbsgetNamesget_dbsFalses getResourcesregisterServers delResourcesdirs get_version(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysMetabaseServerÞs <    cGstdƒ‚dS(Ns€You cannot save data to a remote XMLRPC server. Give a user-editable resource database as the first entry in your WORLDBASEPATH!(sWorldbaseReadOnlyError(sselfsl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysraise_illegal_saveCssXMLRPCMetabasecBs_tZdZd„Zed„Zd„Zd„Zdeed„Ze Z e Z e Z e Z RS(s3client interface to remote XMLRPC resource databasecKsPdkl}||dƒ|_||_||_|iiƒ|_t|_ dS(N(sget_connectionsindex( s coordinatorsget_connectionsurlsselfsserversmdbsgetNameszoneNamesFalses writeable(sselfsurlsmdbskwargssget_connection((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Ms    cCs¿|o|ii||ƒ}n|ii|ƒ}|djotd|ƒ‚ny|d}|d=Wntj o t }nXx$|i ƒD]\}}||fSq‘Wtd|ƒ‚dS(s9get pickledata,docstring for this resource ID from serverssresource %s not founds__doc__s&unable to find %s from remote servicesN( sdownloadsselfsservers getResourcesidsdsWorldbaseNotFoundErrors docstringsKeyErrorsNonesitemsslocationsobjdata(sselfsidsdownloadsobjdatasds docstringslocation((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourceUs     cCs|ii||ƒSdS(s"forward registration to the serverN(sselfsserversregisterServers locationKeys serviceDict(sselfs locationKeys serviceDict((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServerfscCsR|iid|ƒ}|djo t‚nx|iƒD] }|Sq:Wt‚dS(sreturn dict of {attr: {args}}sSCHEMA.sN(sselfsservers getResourcesidsdsKeyErrorsvaluess schemaDict(sselfsids schemaDictsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschemajs   spcCs>|o|ii||||ƒSn|ii|||ƒSdS(s>return list or dict of resources matching the specified stringN(sdownloadsselfsserversdirspatternsasDicts matchType(sselfspatterns matchTypesasDictsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdirss(s__name__s __module__s__doc__s__init__sFalses find_resourcesregisterServers getschemasdirsraise_illegal_saves __setitem__s __delitem__s setschemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysXMLRPCMetabaseJs     s MySQLMetabasecBs‰tZdZdddfZeed„Zd„Zed„Zd„Z d„Z d„Z d „Z d „Z d „Zd eed „ZRS(s To create a new resource table, call: MySQLMetabase("DBNAME.TABLENAME", mdb, createLayer="LAYERNAME") where DBNAME is the name of your database, TABLENAME is the name of the table you want to create, and LAYERNAME is the layer name you want to assign itiic Ksxdkl}l} ||ƒ\|_|_|_||_t|_ h|_ |id}|t jo |}n|t j oÂtiiƒ}|iid|iƒ|iid|iƒ|iid|id||dfƒ|iid|id d |idfƒ||_|iid|ƒ|iid |ƒnôy#|iid |idfƒ} WnAtj o5tid dd|i|iddfIJ‚nX| djo|iiƒd|_n|iid|idfƒdjo?x(|iiƒD]} t |i | d) where is the layer name you want to assign it. %ss!i(is)select location from %s where pygr_id=%%ss0roots attrAliass source_ids target_idsedge_ids simpleKeyss unpack_edge( ssqlgraphsget_name_cursorsSQLGraphs tablenamesselfscursors serverInfosmdbsTrues writeables rootNamess schemaTables createLayersNonesnewZonesdatetimesnows creation_timesexecutes_pygr_data_versionszoneNamesns StandardErrorssyssstderrsfetchonesfetchallsrowssave_root_namessdicts SchemaEdgesgraph( sselfs tablenamesmdbs createLayersnewZoneskwargss schemaTables creation_timesget_name_cursorsSQLGraphsnsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ˆsH        + cCs4t|i|<|iid|id|dfƒdS(NsZinsert into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)s0rootsa(sNonesselfs rootNamessnamescursorsexecutes tablename(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_nameÇs cCsZ|iid|i|fƒx*|iiƒD]\}}}||fSq-Wt dƒ‚dS(s:get construction rule from mysql, and attempt to constructsWselect location,objdata,docstring from %s where pygr_id=%%ssPunable to construct %s from remote servicesN( sselfscursorsexecutes tablenamesidsfetchallslocationsobjdatas docstringsWorldbaseNotFoundError(sselfsidsdownloadsobjdatas docstringslocation((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourceÍs c Cs˜t|ƒ}t||ƒ}|iid|i|d|i|i |d|d|d|fƒ|i dƒd}||i jo|i|ƒndS( s'add an object to this resource databases°replace into %s (pygr_id,location,docstring,user, creation_time,pickle_size,objdata) values (%%s, %%s,%%s,%%s,%%s,%%s,%%s)smysql:susers creation_times pickle_sizes.iN(sdumpssobjsss get_info_dictsdsselfscursorsexecutes tablenamesids__doc__ssplitsroots rootNamesssave_root_name(sselfsidsobjsdsssroot((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setitem__Ös 2cCs>|iid|i|fƒdjotd|ƒ‚ndS(s)delete this resource and its schema ruless delete from %s where pygr_id=%%sisno resource %s in this databaseN(sselfscursorsexecutes tablenamesidsWorldbaseNotFoundError(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delitem__äsc Csvd}xe|iƒD]W\}\}}||iid|i |||d|d|d|d|fƒ7}qW|SdS(s1register the specified services to mysql databaseisáreplace into %s (pygr_id,location, docstring,user,creation_time,pickle_size, objdata) values (%%s,%%s,%%s,%%s,%%s,%%s, %%s)s__doc__susers creation_times pickle_sizeN( sns serviceDictsitemssidsdspdatasselfscursorsexecutes tablenames locationKey(sselfs locationKeys serviceDictsdspdatasnsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServerës 3cCsV|idƒ o|d}nt|ƒ}|iid|i d|||fƒdS(s.save a schema binding for id.attr --> targetIDs-stargetIDs[replace into %s (pygr_id,location,objdata) values (%%s,%%s,%%s)sSCHEMA.N( sattrs startswithskwargsstargetIDsdumpsskwdatasselfscursorsexecutes tablenamesid(sselfsidsattrskwargsskwdatastargetID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys setschemaøs  cCs(|iid|id||fƒdS(s!delete schema binding for id.attrs1delete from %s where pygr_id=%%s and location=%%ssSCHEMA.N(sselfscursorsexecutes tablenamesidsattr(sselfsidsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschemascCseh}|iid|id|fƒx3|iiƒD]"\}}|i i |ƒ||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschemas spc Cs|djo!|iid|i|fƒnF|djo%|iid|i|dfƒn|ohSngSh}xP|iiƒD]?}t d|dd|d d |d d |d ƒ||dreturn list or dict of resources matching the specified stringsrsxselect pygr_id,docstring,user,creation_time, pickle_size from %s where pygr_id regexp %%sspsvselect pygr_id,docstring,user,creation_time, pickle_size from %s where pygr_id like %%ss%s__doc__isuseris creation_timeis pickle_sizeiiN(s matchTypesselfscursorsexecutes tablenamespatternsasDictsdsfetchallslsdictsappends_[1]sname( sselfspatterns matchTypesasDictsdownloadsdsls_[1]sname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdirs$  !(s__name__s __module__s__doc__s_pygr_data_versionsNones__init__ssave_root_namesFalses find_resources __setitem__s __delitem__sregisterServers setschemas delschemas getschemasdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MySQLMetabase€s ?     s SchemaEdgecBs tZdZd„Zd„ZRS(s4provides unpack_edge method for schema graph storagecCs ||_dS(N(sschemaDBsself(sselfsschemaDB((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__.scCs|ii|ƒdSdS(s/get the actual schema object describing this IDs -schemaEdgeN(sselfsschemaDBs getschemasedgeID(sselfsedgeID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__1s(s__name__s __module__s__doc__s__init__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys SchemaEdge+s  sResourceDBGraphDescrcBstZdZd„ZRS(s0this property provides graph interface to schemac CsEtd|iddddtdtdt|ƒƒ}||_|SdS(Nsfilenames_schemasmodescwswriteNows simpleKeyss unpack_edge(sGraphsobjsdbpathsTrues SchemaEdgesgsgraph(sselfsobjsobjtypesg((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__get__9s (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysResourceDBGraphDescr6s sShelveMetabasecBs’tZdZdddfZeƒZded„Zd„Ze d„Z d„Z d„Z d e e d „Z d „Zd „Zd „Zd„ZRS(siBerkeleyDB-based storage of worldbase resource databases, using the python shelve module. Users will not need to create instances of this class themselves, as worldbase automatically creates one for each appropriate entry in your WORLDBASEPATH; if the corresponding database file does not already exist, it is automatically created for you.iisrcKs#dk}tii|dƒ|_||_t|_t |_ yqt |i|ƒ|_ y|i|i dƒWntj onXy|i d|_ Wntj onXWno|ij o`t |idƒ|_ |i|i dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__Js,        cCs&|iiƒt|i|ƒ|_dS(N(sselfsdbscloses open_shelvesdbpathsmode(sselfsmode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysreopenbs cCsN|i|}y||id|dfSWntj o|tfSnXdS(s'get an item from this resource databases__doc__.s__doc__N(sselfsdbsresIDsobjdatasKeyErrorsNone(sselfsresIDsdownloadsobjdata((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resourcefs  cCs©t|ƒ}|idƒz{||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setitem__ns     cCs‹|idƒziy|i|=Wn,tj o td||ifƒ‚nXy|id|=Wntj onXWd|idƒXdS(s<delete this item from the database, with a modicum of safetyswsID %s not found in %ss__doc__.Nsr(sselfsreopensdbsresIDsKeyErrorsWorldbaseNotFoundErrorsdbpath(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delitem__}s  spcCsÐ|djoti|ƒ}ng}x\|iD]Q}|djo |i|ƒp|djo |i |ƒo|i |ƒq0q0W|o<h}x+|D]#}|ii d|tƒ||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdirs  :!cCsq|idƒ o|d}n|idƒ|iid|hƒ}|||<||id|<|idƒdS(s1save a schema binding for resID.attr --> targetIDs-stargetIDswsSCHEMA.srN( sattrs startswithskwargsstargetIDsselfsreopensdbsgetsresIDsd(sselfsresIDsattrskwargssdstargetID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys setschemas  cCs|id|SdS(sreturn dict of {attr:{args}}sSCHEMA.N(sselfsdbsresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschema§scCsG|idƒ|id|}||=||id|<|idƒdS(s$delete schema binding for resID.attrswsSCHEMA.srN(sselfsreopensdbsresIDsdsattr(sselfsresIDsattrsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschema«s  cCs|iiƒdS(s#close the shelve file when finishedN(sselfsdbsclose(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__del__³s(s__name__s __module__s__doc__s_pygr_data_versionsResourceDBGraphDescrsgraphsNones__init__sreopensFalses find_resources __setitem__s __delitem__sdirs setschemas getschemas delschemas__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysShelveMetabase@s        cKs@tƒ}t|ƒ}|i|||i|ƒ|iƒSdS(s.pickle to string, using persistent ID encodingN( sStringIOssrcs PygrPicklerspicklerssetRootsobjskwargssdumpsgetvalue(sobjskwargsssrcspickler((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdumps¸s    cCsjtdtiiƒdt|ƒd|iƒ}yti d|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_info_dictÂss MetabaseBasecBs¶tZd„Zd„Zd„Zeed„Zd„Zed„Z d„Z d„Z d „Z d „Z d „Zed „Zd „Zd„Zd„Zd„Zd„Zd„ZRS(NcCs6|idƒo||dƒSntid|‚dS(s<check for PYGR_ID:... format and return the requested objectsPYGR_ID:isInvalid persistent ID %sN(spersids startswithsselfspicklesUnpicklingError(sselfspersid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyspersistent_loadÏscCs»|i|ƒ}||_t|dƒo|io[|ii }|i ƒ}|i ||ƒt|_|otid|IJq–|iƒn ||_||i|<|i||ƒ|SdS(s.load the pickled data and all its dependenciess_saveLocalBuildsdSaving new resource %s to local worldbase... You must use worldbase.commit() to commit! You are seeing this message because you appear to be in the middle of a worldbase transaction. Ordinarily worldbase would automatically commit this new downloaded resource, but doing so now would also commit your pending transaction, which you may not be ready to do!N(sselfsloadssobjdatasobjs docstrings__doc__shasattrs_saveLocalBuildswriterssavers has_pendings hasPendings add_resourcesresIDsFalsessyssstderrs save_pendings_persistent_ids resourceCaches bind_schema(sselfsresIDsobjdatas docstringsobjs hasPendingssaver((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysloadÖs      cCs;t|ƒ}ti|ƒ}|i|_|iƒ}|SdS(s3unpickle from string, using persistent ID expansionN( sStringIOsdatassrcspickles Unpicklers unpicklersselfspersistent_loadsloadsobj(sselfsdatassrcsobjs unpickler((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysloadsðs    c Os&y|i|SWntj onX|i} |i}|tj o ||_n|tj o ||_n |i}z‡|i d|idt ƒxg|i ||ƒD]S\}}y|i|||ƒ} PWq£ttfj o|io‚qöq£Xq£WWd| |_||_X| |i|<| SdS(s8get the requested resource ID by searching all databasessdebugskeepCurrentPathN(sselfs resourceCachesresIDsKeyErrorsdebugs debug_statesdownloadsdownload_statesNonesupdatesTrues find_resourcesobjdatasdocstrsloadsobjsIOError( sselfsresIDsdebugsdownloadsargsskwargssobjdatasdocstrsdownload_statesobjs debug_state((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__ùs6            cCs†y|i|ƒ}Wntj o dSnX||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys bind_schemas  cKsîy|i|SWnttfj onX|o%t|dƒ}t|||}nt|ƒ}t |||}t |||ƒ|o=yt|dƒ}Wntj oqÉXt |||ƒn|djot|dtƒndS(s=create a descriptor for the attr on the appropriate obj classs itemClasssitemSliceClasss inverseDBs __invert__N(sobjs_ignoreShadowAttrsattrsAttributeErrorsKeyErrorsitemRulesget_bound_subclasss targetClasssItemDescriptorsselfskwargssdescrsOneTimeDescriptorssetattrsaddSpecialMethods getInverseDB(sselfsobjsattrsitemRuleskwargssdescrs targetClass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys bind_property"s&  cCs›y|ii|}Wn2tj o&|i|ƒ}||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_schema_attr:s cCs$t|i|ƒt|i|ƒdS(s?add name to the root of our data namespace and schema namespaceN(sgetattrsselfsDatasnamesSchema(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_root_nameJscCs"x|D]}|i|ƒqWdS(s&add set of names to our namespace rootN(s rootNamessnamesselfs add_root_name(sselfs rootNamessname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_namesPscCs|iiƒdS(sclear all resources from cacheN(sselfs resourceCachesclear(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys clear_cacheUscCs1y |iSWntj otdƒ‚nXdS(s5return writeable mdb if available, or raise exceptionsthis metabase is read-only!N(sselfswritersAttributeErrorsWorldbaseReadOnlyError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_writerYs  cCsD|tjo|iƒii|ƒn|iƒii||ƒdS(s´assign obj as the specified resource ID to our metabase. if obj is None, treat resID as a dictionary whose keys are resource IDs and values are the objects to save.N(sobjsNonesselfs get_writerssaversadd_resource_dictsresIDs add_resource(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_resource`s cCs|iƒii|ƒdS(s.delete specified resource ID from our metabaseN(sselfs get_writerssaversdelete_resourcesresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdelete_resourceiscCs|iƒiiƒdS(s1save any pending resource assignments and schemasN(sselfs get_writerssavers save_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscommitmscCs|iƒiiƒdS(s4discard any pending resource assignments and schemasN(sselfs get_writerssaversrollback(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysrollbackqscCs |iƒii|||ƒdS(s5add a schema to the list of pending schemas to commitN(sselfs get_writerssaversqueue_schema_objs schemaPathsattrs schemaObj(sselfs schemaPathsattrs schemaObj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysqueue_schema_objuscCsC|idƒ}t|di|d ƒƒ}t||d|ƒdS(s<assign a schema relation object to a worldbase resource names.iÿÿÿÿN( sresIDssplitsls SchemaPathsselfsjoins schemaPathssetattrs schemaObj(sselfsresIDs schemaObjsls schemaPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_schemayscCs|iƒiiƒSdS(N(sselfs get_writerssavers list_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys list_pendings(s__name__s __module__spersistent_loadsloadsloadssNones__call__s bind_schemasFalses bind_propertysget_schema_attrs add_root_namessave_root_namess clear_caches get_writers add_resourcesdelete_resourcescommitsrollbacksqueue_schema_objs add_schemas list_pending(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MetabaseBaseÍs$              sMetabasecBswtZeed„Zeeed„Zed„Zd„Zd„Zd„Z d„Z d„Z d d eed „Z RS( NcKs`||_t|ƒ|_t|ƒ|_||_t|_t |_ |t jo h}n|idƒo1t|||}d|jo||dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__…sL        <          cCs| otdƒ‚ndS(Ns(You cannot change the path of a Metabase(skeepCurrentPaths ValueError(sselfs worldbasePathsdebugskeepCurrentPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysupdate³sccs|ii||ƒVdS(N(sselfsstorages find_resourcesresIDsdownload(sselfsresIDsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resource·scKs9y|ii|SWntj onX|||SdS(s8find resID even if only pending (not actually saved yet)N(sselfssavers pendingDatasresIDsKeyErrorskwargs(sselfsresIDskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_pending_or_findºs cCs|ii|ƒSdS(s6return dict of {attr: {args}} or KeyError if not foundN(sselfsstorages getschemasresID(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschemaÂscCs8|itj o|ii|ƒnti||ƒdS(N(sselfsparentsNonessave_root_namess rootNamess MetabaseBase(sselfs rootNames((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_root_namesÆscCs|ii|||ƒdS(s|save an attribute binding rule to the schema; DO NOT use this internal interface unless you know what you are doing!N(sselfsstorages setschemasresIDsattrsargs(sselfsresIDsattrsargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemaËscCsL|i|id|ƒ|ii|i7_|i|ii|i|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssaveSchemaEdgeÐssspcCs#|ii||d|d|ƒSdS(NsasDictsdownload(sselfsstoragesdirspatterns matchTypesasDictsdownload(sselfspatterns matchTypesasDictsdownload((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdir×s( s__name__s __module__sNones__init__sFalsesupdates find_resourcesget_pending_or_finds getschemassave_root_namess saveSchemassaveSchemaEdgesdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysMetabaseƒs.      sZoneDictcBs2tZdZd„Zd„Zd„Zd„ZRS(sinterface to current zonescCs ||_dS(N(smdbListsself(sselfsmdbList((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ßscCs%|iidtƒ|ii|SdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictszoneName(sselfszoneName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getitem__âscCs'|iidtƒ|iiiƒSdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyskeysæscCs'|iidtƒ|iiiƒSdS(NskeepCurrentPath(sselfsmdbListsupdatesTrueszoneDictscopy(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscopyês(s__name__s __module__s__doc__s__init__s __getitem__skeysscopy(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysZoneDictÜs    s MetabaseListcBs•tZdZdddgZeedhd„Zd„Zed„Zd„Z eeeed „Z d „Z d „Z d „Z d deed„ZRS(sPrimary interface for worldbase resource database access. A single instance of this class is created upon import of the worldbase module, accessible as worldbase.getResource. Users normally will have no need to create additional instances of this class themselves.s~s.s*http://biodb2.bioinformatics.ucla.edu:5000s,cCs¥|tjo tƒ}n||_t|_||_h|_t|ƒ|_||_ ||_ t |ƒ|_ t |d|iƒ|_t|_t|_t|_dS(s0initializes attrs; does not connect to metabasesszonesN(s resourceCachesNones ResourceCachesselfsmdbsmdbArgsszoneDictsZoneDictszoness worldbasePaths separators SchemaPathsSchemas ResourceRootsDatasFalsesdebugsdownloadsready(sselfs worldbasePaths resourceCaches separatorsmdbArgs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__øs          cCs!|idtƒti|ƒSdS(s?ensure that metabases are loaded, before looking for our writerskeepCurrentPathN(sselfsupdatesTrues MetabaseBases get_writer(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys get_writer sccsXxA|iD]6}y|i||ƒiƒVWq tj oq Xq Wtd|ƒ‚dS(s;search our metabases for pickle string and docstr for resIDs"unable to find %s in WORLDBASEPATHN(sselfsmdbs find_resourcesresIDsdownloadsnextsKeyErrorsWorldbaseNotFoundError(sselfsresIDsdownloadsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys find_resources  cCsaytidSWnKtj o?ytidSWq]tj o|ii|iƒSq]XnXdS(s-get environment var, or default in that orders WORLDBASEPATHs PYGRDATAPATHN(sossenvironsKeyErrorsselfs separatorsjoins defaultPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_worldbase_pathscCsÃ|o |i}n|tjo|iƒ}n|tjo |i}n|tjo |i}n|i p |i|jo?||_y |`Wnt j onXg|_ y |`Wnt j onXh|_ xÔ|i |i ƒD]À}y"t||i|i ||}Wn]ttfj o ‚qî|o‚q®dk}|idtiƒtid|IJqîX|i i|ƒ|iot|dƒ o ||_qîqîWt|_ndS(s)get the latest list of resource databasesNi s5 WARNING: error accessing metabase %s. Continuing...swriter(skeepCurrentPathsselfs worldbasePathsNonesget_worldbase_pathsdebugsmdbArgssreadyswritersAttributeErrorsmdbszoneDictssplits separatorsdbpathsMetabases resourceCachesKeyboardInterrupts SystemExits tracebacks print_excssyssstderrsappends writeableshasattrsTrue(sselfs worldbasePathsdebugskeepCurrentPathsmdbArgssdbpaths tracebacksmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysupdate#sL            cKsMx9|iD].}y|ii|SWq tj oq Xq W|||SdS(s8find resID even if only pending (not actually saved yet)N(sselfsmdbssavers pendingDatasresIDsKeyErrorskwargs(sselfsresIDskwargssmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysget_pending_or_findRs  cCskxX|iD]M}t|idƒo4|ii||ƒ}|t|ƒjo|SqWq q Wt dƒ‚dS(sEregister the serviceDict with the first index server in WORLDBASEPATHsregisterServers1unable to register services. Check WORLDBASEPATHN( sselfsmdbshasattrsstoragesregisterServers locationKeys serviceDictsnslens ValueError(sselfs locationKeys serviceDictsmdbsn((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysregisterServer[s cCsOx8|iD]-}y|i|ƒSWq tj oq Xq Wtd|ƒ‚dS(s@search our resource databases for schema info for the desired IDsno schema info available for N(sselfsmdbs getschemasresIDsKeyError(sselfsresIDsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys getschemads  sspc CsÑ|idtƒg}x6|iD]+}|i|i||d|d|ƒƒq W|o6h}|i ƒx|D]} |i| ƒqmW|SnBh}x|D]}t|i|ƒq™W|iƒ}|iƒ|SdS(sAget list or dict of resources beginning with the specified stringskeepCurrentPathsasDictsdownloadN(sselfsupdatesTruesresultssmdbsappendsdirspatterns matchTypesasDictsdownloadsdsreversessubdirslsfilters setdefaultskeysssort( sselfspatterns matchTypesasDictsdownloadsdsmdbsresultsslssubdir((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdirms*    (s__name__s __module__s__doc__s defaultPathsNones__init__s get_writersFalses find_resourcesget_worldbase_pathsupdatesget_pending_or_findsregisterServers getschemasdir(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys MetabaseListïs   / s ResourceCachecBs tZdZd„Zd„ZRS(s@provide one central repository of loaded resources & schema infocCsti|ƒh|_dS(N(sdicts__init__sselfs schemaCache(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__†s cCsti|ƒ|iiƒdS(N(sdictsclearsselfs schemaCache(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysclearŠs (s__name__s __module__s__doc__s__init__sclear(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceCacheƒs  s ResourceSavercBs•tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„ZRS(s/queues new resources until committed to our mdbcCs|iƒ||_dS(N(sselfs clear_pendingsmdb(sselfsmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__’s cCs1h|_h|_h|_h|_h|_dS(N(sselfs pendingDatas pendingSchemaslastDatas lastSchemas rollbackData(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys clear_pending–s     cCsmyG|itjp&t|idƒo|i|iijo t‚nWntj otdƒ‚nXdS(sNenforce requirement for docstring, by raising exception if not presents__doc__srto save a resource object, you MUST give it a __doc__ string attribute describing it!N(sobjs__doc__sNoneshasattrs __class__sAttributeErrors ValueError(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscheck_docstrings 9cCsh|i|ƒ||_||i|N( sselfscheck_docstringsobjsresIDs_persistent_ids pendingDatasmdbs resourceCaches rollbackDatasKeyErrorscache_if_appropriate(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys add_resource¨s   cCs@y|iodSnWntj onX||ii|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyscache_if_appropriate³s   cCs1x*|iƒD]\}}|i||ƒq WdS(s8queue a dict of name:object pairs for saving to metabaseN(sdsitemssksvsselfs add_resource(sselfsdsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysadd_resource_dict»s cCs)|i|ƒ}|||f|i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysqueue_schema_objÀscCsU|i|ƒ|i|jotd|ƒ‚n||ii|<|i||ƒdS(ssave the object as s½The _persistent_id attribute for %s has changed! If you changed it, shame on you! Otherwise, this should not happen, so report the reproducible steps to this error message as a bug report.N( sselfscheck_docstringsobjs_persistent_idsresIDsWorldbaseMismatchErrorsmdbsstoragescache_if_appropriate(sselfsresIDsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys save_resourceÅs  cCs-t|iƒdjpt|iƒdjSdS(s:return True if there are resources pending to be committediN(slensselfs pendingDatas pendingSchema(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys has_pendingÑscCsÑt|iƒdjpt|iƒdjo|i}|i}n tdƒ‚x*|iƒD]\}}|i ||ƒq[Wx3|i ƒD]%\}}}|i|||iƒqˆW|iƒ||_||_dS(s/save any pending worldbase resources and schemais#there is no data queued for saving!N(slensselfs pendingDatas pendingSchemasds schemaDictsWorldbaseEmptyErrorsitemssresIDsobjs save_resourcesvaluess schemaPathsattrs schemaObjs saveSchemasmdbs clear_pendingslastDatas lastSchema(sselfsresIDsds schemaObjs schemaDicts schemaPathsobjsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys save_pendingÕs,       cCs t|iƒt|iƒfSdS(s7return tuple of pending data dictionary, pending schemaN(slistsselfs pendingDatas pendingSchema(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys list_pendingäscCs`t|iƒdjot|iƒdjotdƒ‚n|iii|iƒ|i ƒdS(s@dump any pending data without saving, and restore state of cacheis#there is no data queued for saving!N( slensselfs pendingDatas pendingSchemasWorldbaseEmptyErrorsmdbs resourceCachesupdates rollbackDatas clear_pending(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysrollbackès ,cCsi|ii|=y|ii|=Wntj onXy|i|=Wntj onX|i|ƒdS(sBdelete the specified resource from resourceCache, saver and schemaN(sselfsmdbsstoragesresIDs resourceCachesKeyErrors pendingDatas delSchema(sselfsresID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysdelete_resourceðs cCsž|ii}y|i|ƒ}Wntj o dSnX|iiii ƒxK|i ƒD]=\}}|i dƒo|i|ƒn|i||ƒqYWdS(s3delete schema bindings TO and FROM this resource IDNs-(sselfsmdbsstorages getschemasresIDsdsKeyErrors resourceCaches schemaCachesclearsitemssattrsobjs startswiths delschema(sselfsresIDsdsstoragesobjsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delSchemaýs   cCs5y|iƒtidIJWntj onXdS(Ns WARNING: saving worldbase pending data that you forgot to save... Remember in the future, you must issue the command worldbase.commit() to save your pending worldbase resources to your resource database(s), or alternatively worldbase.rollback() to dump those pending data without saving them. It is a very bad idea to rely on this automatic attempt to save your forgotten data, because it is possible that the Python interpreter may never call this function at exit (for details see the atexit module docs in the Python Library Reference).(sselfs save_pendingssyssstderrsWorldbaseEmptyError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__del__ s   (s__name__s __module__s__doc__s__init__s clear_pendingscheck_docstrings add_resourcescache_if_appropriatesadd_resource_dictsqueue_schema_objs save_resources has_pendings save_pendings list_pendingsrollbacksdelete_resources delSchemas__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceSavers           sResourceServercBs2tZdZeeeeeed„Zd„ZRS(s2serves resources that can be transmitted on XMLRPCc !KsKti||| ||_|tjo |i}n|tjo#dk l }l }||g}n|tjo¯dkl}l}l}l}l}l}l}|||f|||f|||fg}y:dkl}dkl}l}|i|||fƒWq"tj oq"Xn|tjo |i}nh}x¶|i ƒD]¨\} }t#} x)|D]!}t&||ƒo t'} PqhqhW| oqOnt'} xC|D];\} }}t&|| ƒot&||ƒ o t#} Pq¨q¨W| o:y|i+|| |dt,ƒWqOt-j oqOXqOny ||_.WnAt/j o5|i0ƒ}|i2|ƒ} | i4|ƒ| }nXy|i5||i6| ƒWn2t7j o&d||i6f|_8| |_nX||_.|i+|| |ƒ||_.||| d d d | ƒnd S( s+construct server for the designated classes(s SQLTableBasesSQLGraphClustered(sSequenceFileDBsBlastDBsXMLRPCSequenceDBs BlastDBXMLRPCs AnnotationDBsAnnotationClientsAnnotationServer(sNLMSA(s NLMSAClients NLMSAServers badClassess http://%s:%dsreadOnlys downloadDBsindexssserverN(?sXMLRPCServerBases__init__sselfsnameskwargssmdbs resourceDictsNones resourceCachesexcludeClassesssqlgraphs SQLTableBasesSQLGraphClustereds serverClassessseqdbsSequenceFileDBsBlastDBsXMLRPCSequenceDBs BlastDBXMLRPCs AnnotationDBsAnnotationClientsAnnotationServers cnestedlistsNLMSAs xnestedlists NLMSAClients NLMSAServersappends ImportErrors clientHostshosts clientDictsitemssidsobjsFalsesskipThiss skipClasss isinstancesTrues baseKlasss clientKlasss serverKlasssclient_dict_setitemsnonPortableClassessWorldbaseNotPortableErrors __class__s TypeErrors __getstate__sstates__new__snewobjs __setstate__s saveHostInfosportsAttributeErrorsurlsregistrationDatas withIndexsMetabaseServers downloadDBsmyIndexsregister(!sselfsmdbsnames serverClassess clientHosts withIndexsexcludeClassess downloadDBs resourceDictskwargss baseKlasssmyIndexsnewobjsidsstates NLMSAClients clientKlasssBlastDBsSequenceFileDBs BlastDBXMLRPCsXMLRPCSequenceDBs skipClasssNLMSAs serverKlasss clientDictsobjsAnnotationServersAnnotationClients AnnotationDBsSQLGraphClustereds NLMSAServers SQLTableBasesskipThis((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__s„     1*                  cKsot||}t||ƒ|f||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysclient_dict_setitemhs-(s__name__s __module__s__doc__sNonesTrues__init__sclient_dict_setitem(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysResourceServers Js ResourcePathcBsVtZdZed„Zd„Zd„Zd„Zd„Zd„Z eed„Z RS(sCsimple way to read resource names as python foo.bar.bob expressionscCs||id<||idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__vs cCs+|itj o|id|Sn|SdS(Ns.(sselfs_pathsNonesname(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetPathzscCs3|i|i|i|ƒƒ}||i|<|SdS(s.extend the resource path by one more attributeN(sselfs _pathClasss_mdbsgetPathsnamesattrs__dict__(sselfsnamesattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getattr__€s cOs|i|i||ŽSdS(s construct the requested resourceN(sselfs_mdbs_pathsargsskwargs(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__‡scCs |ii|i|ƒ|ƒdS(s*save obj using the specified resource nameN(sselfs_mdbs add_resourcesgetPathsnamesobj(sselfsnamesobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setattr__‹scCsA|ii|i|ƒƒy|i|=Wntj onXdS(N(sselfs_mdbsdelete_resourcesgetPathsnames__dict__sKeyError(sselfsname((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delattr__s cCs“|tjo t|iƒd}|i}n|ii|ƒ}h}x=|D]5}|i |ƒot|||i dƒdbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__dir__–s  #( s__name__s __module__s__doc__sNones__init__sgetPaths __getattr__s__call__s __setattr__s __delattr__s__dir__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourcePathss       s ResourceRootcBs/tZdZeed„Zd„Zd„ZRS(s(provide proxy to public metabase methodsc Cs‡ti|||ƒ|i|id<|tj o||idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__¨s "cOs|i|||ŽSdS(s Construct the requested resourceN(sselfs_mdbsresIDsargsskwargs(sselfsresIDsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__call__²scCsti|ddƒSdS(Nsi(s ResourcePaths__dir__sself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__dir__¶s(s__name__s __module__s__doc__sNones__init__s__call__s__dir__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceRoot¥s  s ResourceZonecBs tZdZd„Zd„ZRS(s7provide pygr.Data old-style interface to resource zonescCs||_||_dS(N(smdbsselfs _mdbParentszoneNames _zoneName(sselfsmdbszoneName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__½s cCs‹|iidtƒy|ii|i}Wn&tj otd|iƒ‚nX|djot i ||ƒSnt i |||ƒSdS(NskeepCurrentPathsno zone "%s" availablesschema( sselfs _mdbParentsupdatesTrueszoneDicts _zoneNamesmdbsKeyErrors ValueErrorsnames SchemaPaths __getitem__s ResourcePath(sselfsnamesmdb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __getattr__Ás (s__name__s __module__s__doc__s__init__s __getattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ResourceZoneºs  s SchemaPathcBs tZdZd„Zd„ZRS(s&save schema information for a resourcecCsGy |iWntj otdƒ‚nX|ii|||ƒdS(Nsnot a valid schema object!(sschemas saveSchemasAttributeErrors ValueErrorsselfs_mdbsqueue_schema_objsname(sselfsnamesschema((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __setattr__Ñs  cCstdƒ‚dS(Ns'schema deletion is not yet implemented.(sNotImplementedError(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys __delattr__Øs(s__name__s __module__s__doc__s __setattr__s __delattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys SchemaPathÎs  sDirectRelationcBs)tZdZd„Zd„Zd„ZRS(sbind an attribute to the targetcCst|ƒ|_dS(N(sgetIDstargetsselfstargetID(sselfstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__áscCstd|iƒSdS(NstargetID(sdictsselfstargetID(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys schemaDictäscKsk|iƒ}|i|ƒyt|dƒ|d<|d=Wntj onX|it|ƒ||ƒdS(NstargetDBstargetID( sselfs schemaDictsdsupdateskwargssgetIDsKeyErrorsmdbs saveSchemassourcesattr(sselfssourcesattrsmdbskwargssd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemaçs   (s__name__s __module__s__doc__s__init__s schemaDicts saveSchema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysDirectRelationÞs   s ItemRelationcBstZdZd„ZRS(s!bind item attribute to the targetcCstd|idtƒSdS(NstargetIDsitemRule(sdictsselfstargetIDsTrue(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys schemaDictõs(s__name__s __module__s__doc__s schemaDict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys ItemRelationòs sManyToManyRelationcBsDtZdZdZeeeed„Zd„Zd„Zd„ZRS(s@a general graph mapping from sourceDB -> targetDB with edge infos many:manycCsˆt|ƒ|_t|ƒ|_|tj ot|ƒ|_n t|_||_|tj o ||_n|tj o ||_ndS(N( sgetIDssourceDBsselfstargetDBsedgeDBsNones bindAttrss sourceNotNones targetNotNone(sselfssourceDBstargetDBsedgeDBs bindAttrss sourceNotNones targetNotNone((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys__init__ýs      cCs§|i|ƒ}||_|i|ƒt|iƒ}|i |d|ƒt|i ƒ}|i |d|ƒ|i t j o&t|i ƒ}|i |d|ƒn|SdS(sVsave standard schema bindings to graphDB attributes sourceDB, targetDB, edgeDBssourceDBstargetDBsedgeDBN(sgraphDBsgetPathsattrsselfsnamesmdbssaveSchemaEdgesDirectRelationssourceDBsbs saveSchemastargetDBsedgeDBsNone(sselfsgraphDBsattrsmdbsb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pyssave_graph_bindings s  c Cs|i|||ƒ}|itj oæ|i|i |i f}ht dt ƒt dt ƒg}y|i|ƒiƒ|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemas! * cCs|itj o||i|i|if}xatdƒD]O}t |iƒ|jo|i|tj o|i |||i|ƒq5q5WndS(s<delete resource attribute bindings associated with this ruleiN( sselfs bindAttrssNonessourceDBstargetDBsedgeDBsbindObjsrangesislens resourceDBs delschema(sselfs resourceDBsbindObjsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschema+s *( s__name__s __module__s__doc__s _relationCodesNones__init__ssave_graph_bindingss saveSchemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysManyToManyRelationùs   sOneToManyRelationcBstZdZRS(Nsone:many(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneToManyRelation4ssOneToOneRelationcBstZdZRS(Nsone:one(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysOneToOneRelation8ssManyToOneRelationcBstZdZRS(Nsmany:one(s__name__s __module__s _relationCode(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysManyToOneRelation<ssInverseRelationcBs&tZdZdZd„Zd„ZRS(s7bind source and target as each other's inverse mappingssinversecKsg|i|ƒ}||_|i|ƒti||d||t|ƒ}|i|i d||dS(s.save schema bindings associated with this rules inverseDBN( ssourcesgetPathsattrsselfsnamesmdbssaveSchemaEdgesDirectRelations saveSchemaskwargssbstargetID(sselfssourcesattrsmdbskwargssb((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys saveSchemaDs    cCs|i|idƒdS(Ns inverseDB(s resourceDBs delschemasselfstargetID(sselfs resourceDB((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys delschemaOs(s__name__s __module__s__doc__s _relationCodes saveSchemas delschema(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysInverseRelation@s  cCsdt|tƒo|SnIt|tƒo |iSn.y |iSWntj otdƒ‚nXdS(s7get persistent ID of the object or raise AttributeErrorsthis obj has no persistent ID!N(s isinstancesobjsstrs ResourcePaths_paths_persistent_idsAttributeError(sobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pysgetIDSs  (GsdatetimesosspicklesressyssUserDictsStringIOsmappings CollectionsMappingsGraphs classutils open_shelvesstandard_invertsget_bound_subclasssSourceFileNames coordinatorsXMLRPCServerBasesnonPortableClassess NameErrorsobjectsOneTimeDescriptorsItemDescriptorsItemDescriptorRWsForwardingDescriptorsSpecialMethodDescriptorsaddSpecialMethods getInverseDBs ValueErrorsWorldbaseNotPortableErrorsKeyErrorsWorldbaseNotFoundErrorsWorldbaseMismatchErrorsWorldbaseEmptyErrorsWorldbaseReadOnlyErrorsWorldbaseSchemaErrors PickleErrorsWorldbaseNoModuleErrorsPicklers PygrPicklersMetabaseServersraise_illegal_savesXMLRPCMetabases MySQLMetabases SchemaEdgesResourceDBGraphDescrsShelveMetabasesdumpss get_info_dicts MetabaseBasesMetabases DictMixinsZoneDicts MetabaseListsdicts ResourceCaches ResourceSaversResourceServers ResourcePaths _pathClasss ResourceRoots ResourceZones SchemaPathsDirectRelations ItemRelationsManyToManyRelationsOneToManyRelationsOneToOneRelationsManyToOneRelationsInverseRelationsgetID(;sOneTimeDescriptorsItemDescriptorRWsGraphsstandard_invertsWorldbaseNotPortableErrorsdatetimesXMLRPCServerBases ItemRelationsWorldbaseEmptyErrorsManyToManyRelationsraise_illegal_saves ResourceSaversMetabaseServersMetabases PygrPicklersForwardingDescriptorsOneToOneRelationsXMLRPCMetabasesDirectRelationsnonPortableClassessInverseRelationsMappings Collectionsres getInverseDBsResourceServersWorldbaseReadOnlyErrorsWorldbaseNotFoundErrorsManyToOneRelations MetabaseListsShelveMetabases ResourceRoots get_info_dicts SchemaEdgesUserDicts open_shelves SchemaPathssyssSpecialMethodDescriptorsgetIDsSourceFileNamesWorldbaseSchemaErrorspickles ResourceZonesOneToManyRelationsItemDescriptorsStringIOsossWorldbaseNoModuleErrors ResourcePathsWorldbaseMismatchErrorsdumpss MetabaseBasesZoneDictsResourceDBGraphDescrs ResourceCachesget_bound_subclasssaddSpecialMethods MySQLMetabase((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/metabase.pys?st        +    )e 6«  x ¶Y” ŒX/  ;PKd—~;«B_ KKKKpygr/nlmsa_utils.pyimport os import types import classutil import logger from UserDict import DictMixin class NLMSASeqList(list): def __init__(self, nlmsaSeqDict): list.__init__(self) self.nlmsaSeqDict = nlmsaSeqDict def __getitem__(self, nlmsaID): 'return NLMSASequence for a given nlmsa_id' try: return list.__getitem__(self, nlmsaID) except IndexError: seqID, nsID = self.nlmsaSeqDict.IDdict[str(nlmsaID)] return list.__getitem__(self, nsID) def getSeq(self, nlmsaID): 'return seq for a given nlmsa_id' seqID, nsID = self.nlmsaSeqDict.IDdict[str(nlmsaID)] return self.nlmsaSeqDict.nlmsa.seqDict[seqID] def getSeqID(self, nlmsaID): 'return seqID for a given nlmsa_id' seqID, nsID = self.nlmsaSeqDict.IDdict[str(nlmsaID)] return seqID def is_lpo(self, id): if id >= len(self): return False ns = self[id] if ns.is_lpo: return True else: return False def nextID(self): return len(self) class EmptySliceError(KeyError): pass class EmptyAlignmentError(ValueError): pass class EmptySlice: 'Empty slice for use by NLMSASlice' def __init__(self, seq): self.seq = seq def edges(self, *args, **kwargs): return [] def items(self, **kwargs): return [] def iteritems(self, **kwargs): return iter([]) def keys(self, **kwargs): return [] def __iter__(self): return iter([]) def __getitem__(self, k): raise KeyError def __len__(self): return 0 def matchIntervals(self, seq=None): return [] def findSeqEnds(self, seq): raise KeyError('seq not aligned in this interval') def generateSeqEnds(self): return [] def groupByIntervals(self, **kwargs): return {} def groupBySequences(self, **kwargs): return [] def split(self, **kwargs): return [] def regions(self, **kwargs): return [] def __cmp__(self, other): return cmp(self.seq, other.seq) def rawIvals(self): return [] class _NLMSASeqDict_ValueWrapper(object): """A wrapper class for NLMSASeqDict to use to store 3-tuples in its cache. NLMSASeqDict has a most-recent-values cache containing (id, seqlist, offset) tuples for each referenced pathForward. However, tuples cannot be stored in a weakref dictionary. This class provides a tuple-like wrapper object that *can* be stored in a weakref dict. """ def __init__(self, nlmsaID, seqlist, offset): self.v = (nlmsaID, seqlist, offset) def __hash__(self): return hash(self.v) def __len__(self): return 3 def __getitem__(self, n): return self.v[n] _DEFAULT_SEQUENCE_CACHE_SIZE=100 class NLMSASeqDict(object, DictMixin): """Index sequences by pathForward, and use list to keep reverse mapping. Keeps a cache of n most recently accessed sequences, up to maxSequenceCacheSize (defaults to 100). """ def __init__(self, nlmsa, filename, mode, idDictClass=None, maxSequenceCacheSize=_DEFAULT_SEQUENCE_CACHE_SIZE): self._cache = classutil.RecentValueDictionary(maxSequenceCacheSize) self.seqlist = NLMSASeqList(self) self.nlmsa = nlmsa self.filename = filename if mode == 'memory': # just use python dictionary idDictClass = dict elif mode == 'w': # new database mode = 'n' if idDictClass is None: # use persistent id dictionary storage self.seqIDdict = classutil.open_shelve(filename + '.seqIDdict', mode) self.IDdict = classutil.open_shelve(filename + '.idDict', mode) else: # user supplied class for id dictionary storage self.seqIDdict = idDictClass() self.IDdict = idDictClass() def saveSeq(self, seq, nsID= -1, offset=0, nlmsaID=None): 'save mapping of seq to specified (nlmsaID,ns,offset)' if nsID < 0: # let the union figure it out self.nlmsa.currentUnion.__iadd__(seq) return # the union added it for us, no need to do anything if isinstance(seq, types.StringType): id = seq # treat this as fully qualified identifier else: # get the identfier from the seq / database id = self.getSeqID(seq) if nlmsaID is None: # allocate a new unique id nlmsaID = self.nlmsa.nextID() self.seqIDdict[id] = nlmsaID, nsID, offset self.IDdict[str(nlmsaID)] = id, nsID def getIDcoords(self, seq): 'return nlmsaID,start,stop for a given seq ival.' nlmsaID = self.getID(seq) return nlmsaID, seq.start, seq.stop # standard coords def getID(self, seq): 'return nlmsa_id for a given seq' return self[seq][0] def __getitem__(self, seq): 'return nlmsaID,NLMSASequence,offset for a given seq' if not hasattr(seq, 'annotationType'): # don't cache annotations try: # look in our sequence cache return self._cache[seq.pathForward] except AttributeError: raise KeyError('key must be a sequence interval!') except KeyError: pass seqID = self.getSeqID(seq) # use seq id to look up... try: nlmsaID, nsID, offset = self.seqIDdict[seqID] except KeyError: raise KeyError('seq not found in this alignment') v = nlmsaID, self.seqlist[nsID], offset if not hasattr(seq, 'annotationType'): # don't cache annotations self._cache[seq.pathForward] = _NLMSASeqDict_ValueWrapper(*v) return v def __iter__(self): 'iterate over sequences in this alignment' for seqID in self.seqIDdict: yield self.nlmsa.seqDict[seqID] def getSeqID(self, seq): 'return fully qualified sequence ID for this seq' return (~(self.nlmsa.seqDict))[seq] def __setitem__(self, k, ns): 'save mapping of seq to the specified NLMSASequence' self.seqlist.append(ns) if isinstance(k, types.StringType): # Allow build with a string object. self._cache[k] = (ns.id, ns, 0) elif k is not None: self._cache[k.pathForward] = (ns.id, ns, 0) def __iadd__(self, ns): 'add coord system ns to the alignment' self[None] = ns return self # iadd must return self!!! def close(self): 'finalize and close shelve indexes' try: do_close = self.seqIDdict.close except AttributeError: return # our storage doesn't support close(), so nothing to do do_close() # close both shelve objects self.IDdict.close() def reopenReadOnly(self, mode='r'): 'save existing data and reopen in read-only mode' self.close() self.seqIDdict = classutil.open_shelve(self.filename + '.seqIDdict', mode) self.IDdict = classutil.open_shelve(self.filename + '.idDict', mode) def getUnionSlice(self, seq): 'get union coords for this seq interval, adding seq to index if needed' try: id, ns, offset = self[seq] # look up in index except KeyError: self.saveSeq(seq) # add this new sequence to our current union id, ns, offset = self[seq] # look up in index # Make sure to handle annotations right i, start, stop = self.getIDcoords(seq) if start < 0: # reverse orientation return ns, slice(start - offset, stop - offset) # use union coords else: # forward orientation return ns, slice(start + offset, stop + offset) # use union coords def clear_cache(self): 'Clear the cache of saved sequences.' self._cache.clear() def splitLPOintervals(lpoList, ival, targetIval=None): 'return list of intervals split to different LPOs' if ival.start < 0: # reverse orientation: force into forward ori start= -(ival.stop) stop= -(ival.start) else: # forward orientation start=ival.start stop=ival.stop l = [] i = len(lpoList) - 1 while i >= 0: offset = lpoList[i].offset if offset < stop: # appears to be in this if offset <= start: # fits completely in this LPO if ival.start < 0: # reverse ori myslice = slice(offset - stop, offset - start) else: # forward ori myslice = slice(start - offset, stop - offset) if targetIval is not None: l.append((lpoList[i], myslice, targetIval)) else: l.append((lpoList[i], myslice)) return l # done else: # continues past start of this LPO if ival.start < 0: # reverse ori myslice = slice(offset - stop, 0) else: # forward ori myslice = slice(0, stop - offset) if targetIval is not None: l.append((lpoList[i], myslice, targetIval[offset - start:])) # Remove the already-appended part targetIval = targetIval[:offset - start] else: l.append((lpoList[i], myslice)) stop = offset i -= 1 # continue to previous LPO raise ValueError('empty lpoList or offset not starting at 0? Debug!') class BuildMSASlice(object): def __init__(self, ns, start, stop, id, offset, is_lpo=0, seq=None): self.ns = ns self.start = start self.stop = stop self.id = id self.offset = offset self.is_lpo = is_lpo self.seq = seq def offsetSlice(self, ival): if ival.orientation < 0: return slice(ival.start - self.offset, ival.stop - self.offset) else: return slice(ival.start + self.offset, ival.stop + self.offset) def __iadd__(self, targetIval): 'save an alignment edge between self and targetIval' if self.is_lpo: # assign to correct LPO(s) if isinstance(targetIval, types.SliceType): raise ValueError('you attempted to map LPO --> LPO?!?') self.ns.nlmsaLetters.__iadd__(targetIval) splitList = splitLPOintervals(self.ns.nlmsaLetters.lpoList, slice(self.start, self.stop), targetIval) for ns, src, target in splitList: # Save intervals to respective LPOs; LPO --> target ns[src] = self.ns.nlmsaLetters.seqs.getIDcoords(target) if self.ns.nlmsaLetters.is_bidirectional: nsu, myslice = self.ns.nlmsaLetters.seqs \ .getUnionSlice(target) # Save target --> LPO nsu[myslice] = (ns.id, src.start, src.stop) else: if isinstance(targetIval, types.SliceType): # target is LPO splitList = splitLPOintervals(self.ns.nlmsaLetters.lpoList, targetIval, self.seq) for ns, target, src in splitList: self.ns[self.offsetSlice(src)] = (ns.id, target.start, target.stop) if self.ns.nlmsaLetters.is_bidirectional: # Save LPO --> SRC ns[target]=(self.id, src.start, src.stop) else: # both src and target are normal seqs. use_virtual_lpo!! self.ns.nlmsaLetters.__iadd__(targetIval) self.ns.nlmsaLetters.init_pairwise_mode() # Our virtual LPO ns_lpo = self.ns.nlmsaLetters.seqlist[self.ns.id - 1] # Save src --> target ns_lpo[self.offsetSlice(self.seq)] = self.ns.nlmsaLetters \ .seqs.getIDcoords(targetIval) if self.ns.nlmsaLetters.is_bidirectional: nsu, myslice = self.ns.nlmsaLetters.seqs \ .getUnionSlice(targetIval) # Our virtual LPO ns_lpo = self.ns.nlmsaLetters.seqlist[nsu.id - 1] # Save target --> src ns_lpo[myslice] = (self.id, self.start, self.stop) return self # iadd must always return self def __setitem__(self, k, v): if v is not None: raise ValueError('NLMSA cannot save edge-info. Only \ nlmsa[s1][s2]=None allowed') self += k def read_seq_dict(pathstem, trypath=None): 'read seqDict for NLMSA' if os.access(pathstem + '.seqDictP', os.R_OK): from pygr import worldbase ifile = file(pathstem+'.seqDictP', 'rb') # pickle is binary file! try: # load from worldbase-aware pickle file seqDict = worldbase._mdb.loads(ifile.read()) finally: ifile.close() elif os.access(pathstem + '.seqDict', os.R_OK): # old-style union header import seqdb seqDict = seqdb.PrefixUnionDict(filename=pathstem+'.seqDict', trypath=trypath) else: raise ValueError('''Unable to find seqDict file %s.seqDictP or %s.seqDict and no seqDict provided as an argument''' % (pathstem, pathstem)) return seqDict def save_seq_dict(pathstem, seqDict): 'save seqDict to a worldbase-aware pickle file' from metabase import dumps ofile = file(pathstem + '.seqDictP', 'wb') # pickle is binary file! try: ofile.write(dumps(seqDict)) finally: ofile.close() def prune_self_mappings(src_prefix, dest_prefix, is_bidirectional): '''return is_bidirectional flag according to whether source and target are the same genome. This handles axtNet reading, in which mappings between genomes are given in only one direction, whereas mappings between the same genome are given in both directions.''' if src_prefix == dest_prefix: return 0 else: return 1 def nlmsa_textdump_unpickler(filepath, kwargs): from cnestedlist import textfile_to_binaries, NLMSA logger.info('Saving NLMSA indexes from textdump: %s' % filepath) try: buildpath = os.environ['WORLDBASEBUILDDIR'] except KeyError: buildpath = classutil.get_env_or_cwd('PYGRDATABUILDDIR') path = textfile_to_binaries(filepath, buildpath=buildpath, **kwargs) o = NLMSA(path) # now open in read mode from the saved index fileset o._saveLocalBuild = True # mark this for saving in local metabase return o nlmsa_textdump_unpickler.__safe_for_unpickling__ = 1 class NLMSABuilder(object): 'when unpickled triggers construction of NLMSA from textdump' _worldbase_no_cache = True # force worldbase to reload this fresh def __init__(self, filepath, **kwargs): self.filepath = filepath self.kwargs = kwargs def __reduce__(self): return (nlmsa_textdump_unpickler, (self.filepath, self.kwargs)) class SeqCacheOwner(object): 'weak referenceable object: workaround for pyrex extension classes' def __init__(self): self.cachedSeqs = {} def cache_reference(self, seq): 'keep a ref to seqs cached on our behalf' self.cachedSeqs[seq.id] = seq def generate_nlmsa_edges(self, *args, **kwargs): """iterate over all edges for all sequences in the alignment. Very slow for a big alignment!""" for seq in self.seqs: myslice = self[seq] for results in myslice.edges(*args, **kwargs): yield results def get_interval(seq, start, end, ori): "trivial function to get the interval seq[start:end] with requested ori" if ori < 0: return seq.absolute_slice(-end, -start) else: return seq.absolute_slice(start, end) _default_ivals_attrs = dict(idDest='id', startDest='start', stopDest='stop', oriDest='ori') class CoordsToIntervals(object): '''Transforms coord objects to (ival1,ival2) aligned interval pairs. The intervals can come in in two forms: First, as a list, with [src, dest1, dest2, dest3] information; or second, as an object, with attributes specifying src/dest info. ''' def __init__(self, srcDB, destDB=None, alignedIvalsAttrs=_default_ivals_attrs): self.srcDB = srcDB if destDB: self.destDB = destDB else: self.destDB = srcDB self.getAttr = classutil.make_attribute_interface(alignedIvalsAttrs) def __call__(self, alignedCoords): '''Read interval info from alignedCoords and generate actual intervals. Information read is id, start, stop, and orientation (ori). ''' for c in alignedCoords: if isinstance(c, (CoordsGroupStart, CoordsGroupEnd)): yield c # just pass grouping-info through continue try: srcData = c[0] # align everything to the first interval destSet = c[1:] except TypeError: srcData = c # extract both src and dest from ivals object destSet = [c] id = self.getAttr(srcData, 'id') start = self.getAttr(srcData, 'start') stop = self.getAttr(srcData, 'stop') ori = self.getAttr(srcData, 'ori', 1) # default orientation: + srcIval = get_interval(self.srcDB[id], start, stop, ori) # get the dest interval(s) and yield w/src. for destData in destSet: idDest = self.getAttr(destData, 'idDest') startDest = self.getAttr(destData, 'startDest') stopDest = self.getAttr(destData, 'stopDest') oriDest = self.getAttr(destData, 'oriDest', 1) # default ori: + destIval = get_interval(self.destDB[idDest], startDest, stopDest, oriDest) yield srcIval, destIval # generate aligned intervals def add_aligned_intervals(al, alignedIvals): '''Save a set of aligned intervals to alignment. ''' # for each pair of aligned intervals, save them into the alignment. for t in alignedIvals: # is 't' a marker object for start or end of a group of coordinates? if isinstance(t, (CoordsGroupStart, CoordsGroupEnd)): continue # ignore grouping markers (src, dest) = t al += src al[src][dest] = None # save their alignment class CoordsGroupStart(object): '''Marker object indicating start of a coordinates group. See BlastHitParser for an example.''' pass class CoordsGroupEnd(object): '''Marker object indicating end of a group of coordinates. See BlastHitParser for an example.''' pass PKðŠ’;g5ç¤SoSopygr/nlmsa_utils.pyc;ò |†Kc @s»dkZdkZdkZdkZdklZdefd„ƒYZdefd„ƒYZ de fd„ƒYZ dfd „ƒYZ d e fd „ƒYZd Zd e efd„ƒYZed„Zde fd„ƒYZed„Zd„Zd„Zd„Zde_de fd„ƒYZde fd„ƒYZd„Zd„Zedddd d!d"d#d$ƒZd%e fd&„ƒYZd'„Z d(e fd)„ƒYZ!d*e fd+„ƒYZ"dS(,N(s DictMixins NLMSASeqListcBs>tZd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCsti|ƒ||_dS(N(slists__init__sselfs nlmsaSeqDict(sselfs nlmsaSeqDict((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__ s cCsZyti||ƒSWn?tj o3|iit|ƒ\}}ti||ƒSnXdS(s)return NLMSASequence for a given nlmsa_idN( slists __getitem__sselfsnlmsaIDs IndexErrors nlmsaSeqDictsIDdictsstrsseqIDsnsID(sselfsnlmsaIDsnsIDsseqID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __getitem__s cCs1|iit|ƒ\}}|iii|SdS(sreturn seq for a given nlmsa_idN( sselfs nlmsaSeqDictsIDdictsstrsnlmsaIDsseqIDsnsIDsnlmsasseqDict(sselfsnlmsaIDsseqIDsnsID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgetSeqscCs$|iit|ƒ\}}|SdS(s!return seqID for a given nlmsa_idN(sselfs nlmsaSeqDictsIDdictsstrsnlmsaIDsseqIDsnsID(sselfsnlmsaIDsseqIDsnsID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgetSeqIDscCs?|t|ƒjotSn||}|iotSntSdS(N(sidslensselfsFalsesnssis_lposTrue(sselfsidsns((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysis_lpo s   cCst|ƒSdS(N(slensself(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysnextID)s(s__name__s __module__s__init__s __getitem__sgetSeqsgetSeqIDsis_lposnextID(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys NLMSASeqLists      sEmptySliceErrorcBstZRS(N(s__name__s __module__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysEmptySliceError-ssEmptyAlignmentErrorcBstZRS(N(s__name__s __module__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysEmptyAlignmentError1ss EmptySlicecBsªtZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z e d „Z d „Z d „Zd „Zd „Zd„Zd„Zd„Zd„ZRS(s!Empty slice for use by NLMSASlicecCs ||_dS(N(sseqsself(sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__8scOsgSdS(N((sselfsargsskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysedges;scKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysitems>scKstgƒSdS(N(siter(sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys iteritemsAscKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pyskeysDscCstgƒSdS(N(siter(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__iter__GscCs t‚dS(N(sKeyError(sselfsk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __getitem__JscCsdSdS(Ni((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__len__MscCsgSdS(N((sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysmatchIntervalsPscCstdƒ‚dS(Ns seq not aligned in this interval(sKeyError(sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys findSeqEndsSscCsgSdS(N((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgenerateSeqEndsVscKshSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgroupByIntervalsYscKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgroupBySequences\scKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pyssplit_scKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysregionsbscCst|i|iƒSdS(N(scmpsselfsseqsother(sselfsother((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__cmp__escCsgSdS(N((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysrawIvalshs(s__name__s __module__s__doc__s__init__sedgessitemss iteritemsskeyss__iter__s __getitem__s__len__sNonesmatchIntervalss findSeqEndssgenerateSeqEndssgroupByIntervalssgroupBySequencesssplitsregionss__cmp__srawIvals(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys EmptySlice5s$                 s_NLMSASeqDict_ValueWrappercBs2tZdZd„Zd„Zd„Zd„ZRS(skA wrapper class for NLMSASeqDict to use to store 3-tuples in its cache. NLMSASeqDict has a most-recent-values cache containing (id, seqlist, offset) tuples for each referenced pathForward. However, tuples cannot be stored in a weakref dictionary. This class provides a tuple-like wrapper object that *can* be stored in a weakref dict. cCs|||f|_dS(N(snlmsaIDsseqlistsoffsetsselfsv(sselfsnlmsaIDsseqlistsoffset((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__uscCst|iƒSdS(N(shashsselfsv(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__hash__xscCsdSdS(Ni((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__len__{scCs|i|SdS(N(sselfsvsn(sselfsn((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __getitem__~s(s__name__s __module__s__doc__s__init__s__hash__s__len__s __getitem__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys_NLMSASeqDict_ValueWrapperls    ids NLMSASeqDictcBs•tZdZeed„Zdded„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd d„Zd„Zd„ZRS(s»Index sequences by pathForward, and use list to keep reverse mapping. Keeps a cache of n most recently accessed sequences, up to maxSequenceCacheSize (defaults to 100). cCsÀti|ƒ|_t|ƒ|_||_||_|djo t }n|djo d}n|t jo6ti |d|ƒ|_ti |d|ƒ|_n|ƒ|_|ƒ|_dS(Nsmemoryswsns .seqIDdicts.idDict(s classutilsRecentValueDictionarysmaxSequenceCacheSizesselfs_caches NLMSASeqListsseqlistsnlmsasfilenamesmodesdicts idDictClasssNones open_shelves seqIDdictsIDdict(sselfsnlmsasfilenamesmodes idDictClasssmaxSequenceCacheSize((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__Šs          iÿÿÿÿicCs§|djo|iii|ƒdSnt|tiƒo |}n|i |ƒ}|t jo|ii ƒ}n|||f|i|<||f|it|ƒ|iiii|ƒ\}}|i|i |if|| LPO?!?iN(sselfsis_lpos isinstances targetIvalstypess SliceTypes ValueErrorsnss nlmsaLetterss__iadd__ssplitLPOintervalsslpoListsslicesstartsstops splitListssrcstargetsseqss getIDcoordssis_bidirectionals getUnionSlicesnsusmyslicesidsseqs offsetSlicesinit_pairwise_modesseqlistsns_lpo( sselfs targetIvalssrcsnsustargetsns_lposnss splitListsmyslice((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__iadd__9s>  (((( cCs+|tj otdƒ‚n||7}dS(NsYNLMSA cannot save edge-info. Only nlmsa[s1][s2]=None allowed(svsNones ValueErrorsselfsk(sselfsksv((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __setitem__es (s__name__s __module__sNones__init__s offsetSlices__iadd__s __setitem__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys BuildMSASlice(s  ,cCsÉti|dtiƒoNdkl}t|ddƒ}z|ii |i ƒƒ}Wd|i ƒXnZti|dtiƒo)dk }|id|dd|ƒ}ntd||fƒ‚|SdS( sread seqDict for NLMSAs .seqDictP(s worldbasesrbNs.seqDictsfilenamestrypaths\Unable to find seqDict file %s.seqDictP or %s.seqDict and no seqDict provided as an argument(sossaccessspathstemsR_OKspygrs worldbasesfilesifiles_mdbsloadssreadsseqDictsclosesseqdbsPrefixUnionDictstrypaths ValueError(spathstemstrypathsseqdbs worldbasesifilesseqDict((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys read_seq_dictls  cCsIdkl}t|ddƒ}z|i||ƒƒWd|iƒXdS(s-save seqDict to a worldbase-aware pickle file(sdumpss .seqDictPswbN(smetabasesdumpssfilespathstemsofileswritesseqDictsclose(spathstemsseqDictsdumpssofile((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys save_seq_dict€s cCs||jodSndSdS(s return is_bidirectional flag according to whether source and target are the same genome. This handles axtNet reading, in which mappings between genomes are given in only one direction, whereas mappings between the same genome are given in both directions.iiN(s src_prefixs dest_prefix(s src_prefixs dest_prefixsis_bidirectional((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysprune_self_mappingsŠs cCsŒdkl}l}tid|ƒytid}Wn"t j ot i dƒ}nX||d||}||ƒ}t|_|SdS(N(stextfile_to_binariessNLMSAs&Saving NLMSA indexes from textdump: %ssWORLDBASEBUILDDIRsPYGRDATABUILDDIRs buildpath(s cnestedliststextfile_to_binariessNLMSAsloggersinfosfilepathsossenvirons buildpathsKeyErrors classutilsget_env_or_cwdskwargsspathsosTrues_saveLocalBuild(sfilepathskwargss buildpathsNLMSAsospathstextfile_to_binaries((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysnlmsa_textdump_unpickler•s  is NLMSABuildercBs&tZdZeZd„Zd„ZRS(s;when unpickled triggers construction of NLMSA from textdumpcKs||_||_dS(N(sfilepathsselfskwargs(sselfsfilepathskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__©s cCst|i|iffSdS(N(snlmsa_textdump_unpicklersselfsfilepathskwargs(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __reduce__­s(s__name__s __module__s__doc__sTrues_worldbase_no_caches__init__s __reduce__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys NLMSABuilder¥s  s SeqCacheOwnercBs tZdZd„Zd„ZRS(sAweak referenceable object: workaround for pyrex extension classescCs h|_dS(N(sselfs cachedSeqs(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__´scCs||i|itZd„Zd„Zd„Zd„Zd„Zd„ZRS(NcCsti|ƒ||_dS(N(slists__init__sselfs nlmsaSeqDict(sselfs nlmsaSeqDict((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__ s cCsZyti||ƒSWn?tj o3|iit|ƒ\}}ti||ƒSnXdS(s)return NLMSASequence for a given nlmsa_idN( slists __getitem__sselfsnlmsaIDs IndexErrors nlmsaSeqDictsIDdictsstrsseqIDsnsID(sselfsnlmsaIDsnsIDsseqID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __getitem__s cCs1|iit|ƒ\}}|iii|SdS(sreturn seq for a given nlmsa_idN( sselfs nlmsaSeqDictsIDdictsstrsnlmsaIDsseqIDsnsIDsnlmsasseqDict(sselfsnlmsaIDsseqIDsnsID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgetSeqscCs$|iit|ƒ\}}|SdS(s!return seqID for a given nlmsa_idN(sselfs nlmsaSeqDictsIDdictsstrsnlmsaIDsseqIDsnsID(sselfsnlmsaIDsseqIDsnsID((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgetSeqIDscCs?|t|ƒjotSn||}|iotSntSdS(N(sidslensselfsFalsesnssis_lposTrue(sselfsidsns((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysis_lpo s   cCst|ƒSdS(N(slensself(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysnextID)s(s__name__s __module__s__init__s __getitem__sgetSeqsgetSeqIDsis_lposnextID(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys NLMSASeqLists      sEmptySliceErrorcBstZRS(N(s__name__s __module__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysEmptySliceError-ssEmptyAlignmentErrorcBstZRS(N(s__name__s __module__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysEmptyAlignmentError1ss EmptySlicecBsªtZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z e d „Z d „Z d „Zd „Zd „Zd„Zd„Zd„Zd„ZRS(s!Empty slice for use by NLMSASlicecCs ||_dS(N(sseqsself(sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__8scOsgSdS(N((sselfsargsskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysedges;scKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysitems>scKstgƒSdS(N(siter(sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys iteritemsAscKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pyskeysDscCstgƒSdS(N(siter(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__iter__GscCs t‚dS(N(sKeyError(sselfsk((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __getitem__JscCsdSdS(Ni((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__len__MscCsgSdS(N((sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysmatchIntervalsPscCstdƒ‚dS(Ns seq not aligned in this interval(sKeyError(sselfsseq((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys findSeqEndsSscCsgSdS(N((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgenerateSeqEndsVscKshSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgroupByIntervalsYscKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysgroupBySequences\scKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pyssplit_scKsgSdS(N((sselfskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysregionsbscCst|i|iƒSdS(N(scmpsselfsseqsother(sselfsother((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__cmp__escCsgSdS(N((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysrawIvalshs(s__name__s __module__s__doc__s__init__sedgessitemss iteritemsskeyss__iter__s __getitem__s__len__sNonesmatchIntervalss findSeqEndssgenerateSeqEndssgroupByIntervalssgroupBySequencesssplitsregionss__cmp__srawIvals(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys EmptySlice5s$                 s_NLMSASeqDict_ValueWrappercBs2tZdZd„Zd„Zd„Zd„ZRS(skA wrapper class for NLMSASeqDict to use to store 3-tuples in its cache. NLMSASeqDict has a most-recent-values cache containing (id, seqlist, offset) tuples for each referenced pathForward. However, tuples cannot be stored in a weakref dictionary. This class provides a tuple-like wrapper object that *can* be stored in a weakref dict. cCs|||f|_dS(N(snlmsaIDsseqlistsoffsetsselfsv(sselfsnlmsaIDsseqlistsoffset((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__uscCst|iƒSdS(N(shashsselfsv(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__hash__xscCsdSdS(Ni((sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__len__{scCs|i|SdS(N(sselfsvsn(sselfsn((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __getitem__~s(s__name__s __module__s__doc__s__init__s__hash__s__len__s __getitem__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys_NLMSASeqDict_ValueWrapperls    ids NLMSASeqDictcBs•tZdZeed„Zdded„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd d„Zd„Zd„ZRS(s»Index sequences by pathForward, and use list to keep reverse mapping. Keeps a cache of n most recently accessed sequences, up to maxSequenceCacheSize (defaults to 100). cCsÀti|ƒ|_t|ƒ|_||_||_|djo t }n|djo d}n|t jo6ti |d|ƒ|_ti |d|ƒ|_n|ƒ|_|ƒ|_dS(Nsmemoryswsns .seqIDdicts.idDict(s classutilsRecentValueDictionarysmaxSequenceCacheSizesselfs_caches NLMSASeqListsseqlistsnlmsasfilenamesmodesdicts idDictClasssNones open_shelves seqIDdictsIDdict(sselfsnlmsasfilenamesmodes idDictClasssmaxSequenceCacheSize((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__Šs          iÿÿÿÿicCs§|djo|iii|ƒdSnt|tiƒo |}n|i |ƒ}|t jo|ii ƒ}n|||f|i|<||f|it|ƒ|iiii|ƒ\}}|i|i |if|| LPO?!?iN(sselfsis_lpos isinstances targetIvalstypess SliceTypes ValueErrorsnss nlmsaLetterss__iadd__ssplitLPOintervalsslpoListsslicesstartsstops splitListssrcstargetsseqss getIDcoordssis_bidirectionals getUnionSlicesnsusmyslicesidsseqs offsetSlicesinit_pairwise_modesseqlistsns_lpo( sselfs targetIvalssrcsnsustargetsns_lposnss splitListsmyslice((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__iadd__9s>  (((( cCs+|tj otdƒ‚n||7}dS(NsYNLMSA cannot save edge-info. Only nlmsa[s1][s2]=None allowed(svsNones ValueErrorsselfsk(sselfsksv((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __setitem__es (s__name__s __module__sNones__init__s offsetSlices__iadd__s __setitem__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys BuildMSASlice(s  ,cCsÉti|dtiƒoNdkl}t|ddƒ}z|ii |i ƒƒ}Wd|i ƒXnZti|dtiƒo)dk }|id|dd|ƒ}ntd||fƒ‚|SdS( sread seqDict for NLMSAs .seqDictP(s worldbasesrbNs.seqDictsfilenamestrypaths\Unable to find seqDict file %s.seqDictP or %s.seqDict and no seqDict provided as an argument(sossaccessspathstemsR_OKspygrs worldbasesfilesifiles_mdbsloadssreadsseqDictsclosesseqdbsPrefixUnionDictstrypaths ValueError(spathstemstrypathsseqdbs worldbasesifilesseqDict((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys read_seq_dictls  cCsIdkl}t|ddƒ}z|i||ƒƒWd|iƒXdS(s-save seqDict to a worldbase-aware pickle file(sdumpss .seqDictPswbN(smetabasesdumpssfilespathstemsofileswritesseqDictsclose(spathstemsseqDictsdumpssofile((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys save_seq_dict€s cCs||jodSndSdS(s return is_bidirectional flag according to whether source and target are the same genome. This handles axtNet reading, in which mappings between genomes are given in only one direction, whereas mappings between the same genome are given in both directions.iiN(s src_prefixs dest_prefix(s src_prefixs dest_prefixsis_bidirectional((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysprune_self_mappingsŠs cCsŒdkl}l}tid|ƒytid}Wn"t j ot i dƒ}nX||d||}||ƒ}t|_|SdS(N(stextfile_to_binariessNLMSAs&Saving NLMSA indexes from textdump: %ssWORLDBASEBUILDDIRsPYGRDATABUILDDIRs buildpath(s cnestedliststextfile_to_binariessNLMSAsloggersinfosfilepathsossenvirons buildpathsKeyErrors classutilsget_env_or_cwdskwargsspathsosTrues_saveLocalBuild(sfilepathskwargss buildpathsNLMSAsospathstextfile_to_binaries((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pysnlmsa_textdump_unpickler•s  is NLMSABuildercBs&tZdZeZd„Zd„ZRS(s;when unpickled triggers construction of NLMSA from textdumpcKs||_||_dS(N(sfilepathsselfskwargs(sselfsfilepathskwargs((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__©s cCst|i|iffSdS(N(snlmsa_textdump_unpicklersselfsfilepathskwargs(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys __reduce__­s(s__name__s __module__s__doc__sTrues_worldbase_no_caches__init__s __reduce__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys NLMSABuilder¥s  s SeqCacheOwnercBs tZdZd„Zd„ZRS(sAweak referenceable object: workaround for pyrex extension classescCs h|_dS(N(sselfs cachedSeqs(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/nlmsa_utils.pys__init__´scCs||i|iend, and letterunit (1 or 3) depending on the ratio of end-start difference vs the actual non-gap letter count. Returns tuple (ori,letterunit)""" if end > start: ori = 1 else: ori = -1 ngap = 0 for l in seq: if l == gapchar: ngap += 1 seqlen = len(seq) - ngap if ori * float(end - start) / seqlen > 2.0: letterunit = 3 else: letterunit = 1 return ori, letterunit class BlastIval(object): def __repr__(self): return '' class BlastHitParser(object): """reads alignment info from blastall standard output. Method parse_file(fo) reads file object fo, and generates tuples suitable for BlastIval.""" gapchar = '-' def __init__(self): self.hit_id = 0 self.nline = 0 self.reset() def reset(self): "flush any alignment info, so we can start reading new alignment" self.query_seq = "" self.subject_seq = "" self.hit_id += 1 def save_query(self, line): self.query_id = line.split()[1] def save_subject(self, line): self.subject_id = line.split()[0][1:] def save_score(self, line): "save a Score: line" self.blast_score = float(line.split()[2]) s = line.split()[7] if s[0] == 'e': s = '1' + s try: self.e_value = -math.log(float(s)) / math.log(10.0) except (ValueError, OverflowError): self.e_value = 300. def save_identity(self, line): "save Identities line" s = line.split()[3][1:] self.identity_percent = int(s[:s.find('%')]) def save_query_line(self, line): "save a Query: line" c=line.split() self.query_end=int(c[3]) if not self.query_seq: self.query_start=int(c[1]) # Handle forward orientation. if self.query_start < self.query_end: self.query_start -= 1 self.query_seq+=c[2] self.seq_start_char=line.find(c[2], 5) # IN CASE BLAST SCREWS UP Sbjct: def save_subject_line(self, line): "save a Sbjct: line, attempt to handle various BLAST insanities" c=line.split() if len(c)<4: # OOPS, BLAST FORGOT TO PUT SPACE BEFORE 1ST NUMBER # THIS HAPPENS IN TBLASTN... WHEN THE SUBJECT SEQUENCE # COVERS RANGE 1-1200, THE FOUR DIGIT NUMBER WILL RUN INTO # THE SEQUENCE, WITH NO SPACE!! c = ['Sbjct:', line[6:self.seq_start_char]] \ + line[self.seq_start_char:].split() # FIX BLAST SCREW-UP self.subject_end=int(c[3]) if not self.subject_seq: self.subject_start = int(c[1]) # Handle forward orientation. if self.subject_start < self.subject_end: self.subject_start -= 1 self.subject_seq += c[2] lendiff = len(self.query_seq) - len(self.subject_seq) if lendiff > 0: # HANDLE TBLASTN SCREWINESS: Sbjct SEQ OFTEN TOO SHORT! # THIS APPEARS TO BE ASSOCIATED ESPECIALLY WITH STOP CODONS * self.subject_seq += lendiff * 'A' # EXTEND TO SAME LENGTH AS QUERY elif lendiff < 0 and not hasattr(self, 'ignore_query_truncation'): # WHAT THE HECK?!?! WARN THE USER: BLAST RESULTS ARE SCREWY... raise ValueError( """BLAST appears to have truncated the Query: sequence to be shorter than the Sbjct: sequence: Query: %s Sbjct: %s This should not happen! To ignore this error, please create an attribute ignore_query_truncation on the BlastHitParser object.""" % (self.query_seq, self.subject_seq)) def get_interval_obj(self, q_start, q_end, s_start, s_end, query_ori, query_factor, subject_ori, subject_factor): "return interval result as an object with attributes" o = BlastIval() o.hit_id = self.hit_id o.src_id = self.query_id o.dest_id = self.subject_id o.blast_score = self.blast_score o.e_value = self.e_value o.percent_id = self.identity_percent o.src_ori = query_ori o.dest_ori = subject_ori query_start = self.query_start+q_start*query_ori*query_factor query_end = self.query_start+q_end*query_ori*query_factor subject_start = self.subject_start+s_start*subject_ori*subject_factor subject_end = self.subject_start+s_end*subject_ori*subject_factor if query_start= 0: # END OF AN UNGAPPED INTERVAL yield self.get_interval_obj(q_start, i_query, s_start, i_subject, query_ori, query_factor, subject_ori, subject_factor) q_start= -1 elif q_start<0: # START OF AN UNGAPPED INTERVAL q_start=i_query s_start=i_subject if self.query_seq[i]!=self.gapchar: # COUNT QUERY LETTERS i_query+=1 if self.subject_seq[i]!=self.gapchar: # COUNT SUBJECT LETTERS i_subject+=1 if q_start>=0: # REPORT THE LAST INTERVAL yield self.get_interval_obj(q_start, i_query, s_start, i_subject, query_ori, query_factor, subject_ori, subject_factor) yield CoordsGroupEnd() def parse_file(self, myfile): "generate interval tuples by parsing BLAST output from myfile" for line in myfile: self.nline += 1 if self.is_valid_hit() and \ (is_line_start('>', line) or is_line_start(' Score =', line) \ or is_line_start(' Database:', line) \ or is_line_start('Query=', line)): for t in self.generate_intervals(): # REPORT THIS ALIGNMENT yield t # GENERATE ALL ITS INTERVAL MATCHES self.reset() # RESET TO START A NEW ALIGNMENT if is_line_start('Query=', line): self.save_query(line) elif is_line_start('>', line): self.save_subject(line) elif is_line_start(' Score =', line): self.save_score(line) elif 'Identities =' in line: self.save_identity(line) elif is_line_start('Query:', line): self.save_query_line(line) elif is_line_start('Sbjct:', line): self.save_subject_line(line) if self.nline == 0: # no blast output?? raise IOError('No BLAST output. Check that blastall is \ in your PATH') if __name__=='__main__': import sys p=BlastHitParser() for t in p.parse_file(sys.stdin): print t PKðŠ’;‡iÀùç'ç'pygr/parse_blast.pyc;ò |†Kc@s³dklZdkZdklZlZd„Zdd„Zdefd„ƒYZ defd „ƒYZ e d jo8dk Z e ƒZ x#e ie iƒD] ZeGHqœWndS( (s generatorsN(sCoordsGroupStartsCoordsGroupEndcCs||t|ƒ jSdS(s$check whether line begins with tokenN(stokenslineslen(stokensline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys is_line_startss-c Csœ||jo d}nd}d}x)|D]!}||jo|d7}q*q*Wt|ƒ|}|t ||ƒ|djo d}nd}||fSdS(sÕtry to determine orientation (1 or -1) based on whether start>end, and letterunit (1 or 3) depending on the ratio of end-start difference vs the actual non-gap letter count. Returns tuple (ori,letterunit)iiÿÿÿÿif2.0iN( sendsstartsorisngapsseqslsgapcharslensseqlensfloats letterunit( sstartsendsseqsgapchars letterunitsngapsseqlenslsori((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysget_ori_letterunit s    s BlastIvalcBstZd„ZRS(NcCsdt|iƒdSdS(Ns (sreprsselfs__dict__(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys__repr__#s(s__name__s __module__s__repr__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys BlastIval!ssBlastHitParsercBs€tZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „ZRS(s”reads alignment info from blastall standard output. Method parse_file(fo) reads file object fo, and generates tuples suitable for BlastIval.s-cCs d|_d|_|iƒdS(Ni(sselfshit_idsnlinesreset(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys__init__-s  cCs%d|_d|_|id7_dS(s?flush any alignment info, so we can start reading new alignmentsiN(sselfs query_seqs subject_seqshit_id(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysreset2s  cCs|iƒd|_dS(Ni(slinessplitsselfsquery_id(sselfsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_query8scCs|iƒdd|_dS(Nii(slinessplitsselfs subject_id(sselfsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_subject;scCs›t|iƒdƒ|_|iƒd}|ddjod|}ny*tit|ƒƒ tidƒ|_Wn"t t fj od|_nXdS( ssave a Score: lineiiises1f10.0f300.0N( sfloatslinessplitsselfs blast_scoresssmathslogse_values ValueErrors OverflowError(sselfsliness((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_score>s*cCs4|iƒdd}t||idƒ ƒ|_dS(ssave Identities lineiis%N(slinessplitsssintsfindsselfsidentity_percent(sselfsliness((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_identityIscCs—|iƒ}t|dƒ|_|i o=t|dƒ|_|i|ijo|id8_qgn|i|d7_|i|ddƒ|_ dS(ssave a Query: lineiiiiN( slinessplitscsintsselfs query_ends query_seqs query_startsfindsseq_start_char(sselfslinesc((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pyssave_query_lineNs  cCs:|iƒ}t|ƒdjo+d|d|i!g||iiƒ}nt|dƒ|_|i o=t|dƒ|_ |i |ijo|i d8_ q¥n|i|d7_t|i ƒt|iƒ}|djo|i|d7_n?|djot |d ƒ o t d |i |ifƒ‚nd S( s>save a Sbjct: line, attempt to handle various BLAST insanitiesisSbjct:iiiiisAsignore_query_truncationsOBLAST appears to have truncated the Query: sequence to be shorter than the Sbjct: sequence: Query: %s Sbjct: %s This should not happen! To ignore this error, please create an attribute ignore_query_truncation on the BlastHitParser object.N(slinessplitscslensselfsseq_start_charsints subject_ends subject_seqs subject_starts query_seqslendiffshasattrs ValueError(sselfslinescslendiff((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pyssave_subject_lineZs +  c Cs)tƒ} |i| _|i| _|i| _|i| _|i | _ |i | _ || _ || _|i|||} |i|||} |i|||} |i|||} | | jo| | _| | _n| | _| | _| | jo| | _| | _n| | _| | _| SdS(s3return interval result as an object with attributesN(s BlastIvalsosselfshit_idsquery_idssrc_ids subject_idsdest_ids blast_scorese_valuesidentity_percents percent_ids query_orissrc_oris subject_orisdest_oris query_startsq_starts query_factorsq_ends query_ends subject_startss_startssubject_factorss_ends subject_ends src_startssrc_ends dest_startsdest_end(sselfsq_startsq_endss_startss_ends query_oris query_factors subject_orissubject_factors subject_ends query_endsos subject_starts query_start((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysget_interval_objys2                   cCs|io|iSdS(N(sselfs query_seqs subject_seq(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys is_valid_hit—sc cstƒVt|i|i|i|iƒ\}}t|i |i |i |iƒ\}}d} d}d}d}xïtt|iƒƒD]Ø}|i||ijp|i ||ijo=| djo&|i| |||||||ƒVnd} n| djo|} |}n|i||ijo|d7}n|i ||ijo|d7}qƒqƒW| djo&|i| |||||||ƒVntƒVdS(s2generate interval tuples for the current alignmentiÿÿÿÿiiN(sCoordsGroupStartsget_ori_letterunitsselfs query_starts query_ends query_seqsgapchars query_oris query_factors subject_starts subject_ends subject_seqs subject_orissubject_factorsq_startss_startsi_querys i_subjectsrangeslensisget_interval_objsCoordsGroupEnd( sselfs query_factors subject_oris query_oriss_startsi_querysis i_subjectssubject_factorsq_start((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysgenerate_intervalsšs@  .       ccs}xV|D]N}|id7_|iƒo=td|ƒp-td|ƒptd|ƒp td|ƒo)x|iƒD] }|VqvW|iƒntd|ƒo|i |ƒqtd|ƒo|i |ƒqtd|ƒo|i |ƒqd|jo|i |ƒqtd|ƒo|i |ƒqtd|ƒo|i|ƒqqW|id jotd ƒ‚nd S( s<generate interval tuples by parsing BLAST output from myfileis>s Score =s Database:sQuery=s Identities =sQuery:sSbjct:isNNo BLAST output. Check that blastall is in your PATHN(smyfileslinesselfsnlines is_valid_hits is_line_startsgenerate_intervalsstsresets save_querys save_subjects save_scores save_identityssave_query_linessave_subject_linesIOError(sselfsmyfilestsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys parse_file¾s.M  (s__name__s __module__s__doc__sgapchars__init__sresets save_querys save_subjects save_scores save_identityssave_query_linessave_subject_linesget_interval_objs is_valid_hitsgenerate_intervalss parse_file(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysBlastHitParser's          $s__main__(s __future__s generatorssmaths nlmsa_utilssCoordsGroupStartsCoordsGroupEnds is_line_startsget_ori_letterunitsobjects BlastIvalsBlastHitParsers__name__ssyssps parse_filesstdinst( s is_line_startsBlastHitParsers BlastIvalsget_ori_letterunitssysspsCoordsGroupEndstsCoordsGroupStartsmaths generators((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys?s    ²   PKñŠ’;‡iÀùç'ç'pygr/parse_blast.pyo;ò |†Kc@s³dklZdkZdklZlZd„Zdd„Zdefd„ƒYZ defd „ƒYZ e d jo8dk Z e ƒZ x#e ie iƒD] ZeGHqœWndS( (s generatorsN(sCoordsGroupStartsCoordsGroupEndcCs||t|ƒ jSdS(s$check whether line begins with tokenN(stokenslineslen(stokensline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys is_line_startss-c Csœ||jo d}nd}d}x)|D]!}||jo|d7}q*q*Wt|ƒ|}|t ||ƒ|djo d}nd}||fSdS(sÕtry to determine orientation (1 or -1) based on whether start>end, and letterunit (1 or 3) depending on the ratio of end-start difference vs the actual non-gap letter count. Returns tuple (ori,letterunit)iiÿÿÿÿif2.0iN( sendsstartsorisngapsseqslsgapcharslensseqlensfloats letterunit( sstartsendsseqsgapchars letterunitsngapsseqlenslsori((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysget_ori_letterunit s    s BlastIvalcBstZd„ZRS(NcCsdt|iƒdSdS(Ns (sreprsselfs__dict__(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys__repr__#s(s__name__s __module__s__repr__(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys BlastIval!ssBlastHitParsercBs€tZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „ZRS(s”reads alignment info from blastall standard output. Method parse_file(fo) reads file object fo, and generates tuples suitable for BlastIval.s-cCs d|_d|_|iƒdS(Ni(sselfshit_idsnlinesreset(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys__init__-s  cCs%d|_d|_|id7_dS(s?flush any alignment info, so we can start reading new alignmentsiN(sselfs query_seqs subject_seqshit_id(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysreset2s  cCs|iƒd|_dS(Ni(slinessplitsselfsquery_id(sselfsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_query8scCs|iƒdd|_dS(Nii(slinessplitsselfs subject_id(sselfsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_subject;scCs›t|iƒdƒ|_|iƒd}|ddjod|}ny*tit|ƒƒ tidƒ|_Wn"t t fj od|_nXdS( ssave a Score: lineiiises1f10.0f300.0N( sfloatslinessplitsselfs blast_scoresssmathslogse_values ValueErrors OverflowError(sselfsliness((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_score>s*cCs4|iƒdd}t||idƒ ƒ|_dS(ssave Identities lineiis%N(slinessplitsssintsfindsselfsidentity_percent(sselfsliness((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys save_identityIscCs—|iƒ}t|dƒ|_|i o=t|dƒ|_|i|ijo|id8_qgn|i|d7_|i|ddƒ|_ dS(ssave a Query: lineiiiiN( slinessplitscsintsselfs query_ends query_seqs query_startsfindsseq_start_char(sselfslinesc((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pyssave_query_lineNs  cCs:|iƒ}t|ƒdjo+d|d|i!g||iiƒ}nt|dƒ|_|i o=t|dƒ|_ |i |ijo|i d8_ q¥n|i|d7_t|i ƒt|iƒ}|djo|i|d7_n?|djot |d ƒ o t d |i |ifƒ‚nd S( s>save a Sbjct: line, attempt to handle various BLAST insanitiesisSbjct:iiiiisAsignore_query_truncationsOBLAST appears to have truncated the Query: sequence to be shorter than the Sbjct: sequence: Query: %s Sbjct: %s This should not happen! To ignore this error, please create an attribute ignore_query_truncation on the BlastHitParser object.N(slinessplitscslensselfsseq_start_charsints subject_ends subject_seqs subject_starts query_seqslendiffshasattrs ValueError(sselfslinescslendiff((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pyssave_subject_lineZs +  c Cs)tƒ} |i| _|i| _|i| _|i| _|i | _ |i | _ || _ || _|i|||} |i|||} |i|||} |i|||} | | jo| | _| | _n| | _| | _| | jo| | _| | _n| | _| | _| SdS(s3return interval result as an object with attributesN(s BlastIvalsosselfshit_idsquery_idssrc_ids subject_idsdest_ids blast_scorese_valuesidentity_percents percent_ids query_orissrc_oris subject_orisdest_oris query_startsq_starts query_factorsq_ends query_ends subject_startss_startssubject_factorss_ends subject_ends src_startssrc_ends dest_startsdest_end(sselfsq_startsq_endss_startss_ends query_oris query_factors subject_orissubject_factors subject_ends query_endsos subject_starts query_start((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysget_interval_objys2                   cCs|io|iSdS(N(sselfs query_seqs subject_seq(sself((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys is_valid_hit—sc cstƒVt|i|i|i|iƒ\}}t|i |i |i |iƒ\}}d} d}d}d}xïtt|iƒƒD]Ø}|i||ijp|i ||ijo=| djo&|i| |||||||ƒVnd} n| djo|} |}n|i||ijo|d7}n|i ||ijo|d7}qƒqƒW| djo&|i| |||||||ƒVntƒVdS(s2generate interval tuples for the current alignmentiÿÿÿÿiiN(sCoordsGroupStartsget_ori_letterunitsselfs query_starts query_ends query_seqsgapchars query_oris query_factors subject_starts subject_ends subject_seqs subject_orissubject_factorsq_startss_startsi_querys i_subjectsrangeslensisget_interval_objsCoordsGroupEnd( sselfs query_factors subject_oris query_oriss_startsi_querysis i_subjectssubject_factorsq_start((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysgenerate_intervalsšs@  .       ccs}xV|D]N}|id7_|iƒo=td|ƒp-td|ƒptd|ƒp td|ƒo)x|iƒD] }|VqvW|iƒntd|ƒo|i |ƒqtd|ƒo|i |ƒqtd|ƒo|i |ƒqd|jo|i |ƒqtd|ƒo|i |ƒqtd|ƒo|i|ƒqqW|id jotd ƒ‚nd S( s<generate interval tuples by parsing BLAST output from myfileis>s Score =s Database:sQuery=s Identities =sQuery:sSbjct:isNNo BLAST output. Check that blastall is in your PATHN(smyfileslinesselfsnlines is_valid_hits is_line_startsgenerate_intervalsstsresets save_querys save_subjects save_scores save_identityssave_query_linessave_subject_linesIOError(sselfsmyfilestsline((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys parse_file¾s.M  (s__name__s __module__s__doc__sgapchars__init__sresets save_querys save_subjects save_scores save_identityssave_query_linessave_subject_linesget_interval_objs is_valid_hitsgenerate_intervalss parse_file(((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pysBlastHitParser's          $s__main__(s __future__s generatorssmaths nlmsa_utilssCoordsGroupStartsCoordsGroupEnds is_line_startsget_ori_letterunitsobjects BlastIvalsBlastHitParsers__name__ssyssps parse_filesstdinst( s is_line_startsBlastHitParsers BlastIvalsget_ori_letterunitssysspsCoordsGroupEndstsCoordsGroupStartsmaths generators((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/parse_blast.pys?s    ²   PKd—~;ÔwÖ””pygr/schema.py import types # STORES DICTIONARY OF ATTRIBUTE-BOUND GRAPHS # AND LIST OF UNBOUND GRAPHS class SchemaDict(dict): """Container for schema rules bound to a class or object. Rules are stored in two indexes for fast access, indexed by graph, and indexed by attrname. Use += and -= to add or remove rules. """ def __init__(self, newlist=(), baselist=()): "Initialize schema list from list of base classes and newlist of rules" self.attrs = {} dict.__init__(self) # COMBINE SCHEMAS FROM PARENTS WITH NEW SCHEMA LIST for b in baselist: if hasattr(b, '__class_schema__'): self.update(b.__class_schema__) self.attrs.update(b.__class_schema__.attrs) for i in newlist: # newlist OVERRIDES OLD DEFS FROM baselist self += i def __iadd__(self, i): "Add a schema rule to this SchemaDict" g = i[0] if len(i) >= 2: if isinstance(i[1], types.StringType): if i[1] in self.attrs: # REMOVE OLD ENTRY self -= self.attrs[i[1]] self.attrs[i[1]] = i # SAVE IN INDEX ACCORDING TO ATTR NAME else: raise TypeError('Attribute name must be a string') if g not in self: self[g] = [] self[g].append(i) # SAVE IN GRAPH INDEX return self # REQUIRED FROM iadd()!! def __isub__(self, i): "Remove a schema rule from this SchemaDict" g = i[0] if g not in self: raise KeyError('graph not found in SchemaDict!') self[g].remove(i) # REMOVE OLD ENTRY if len(self[g]) == 0: # REMOVE EMPTY LIST del self[g] if len(i) >= 2: if isinstance(i[1], types.StringType): if i[1] not in self.attrs: raise KeyError('attribute not found in SchemaDict!') del self.attrs[i[1]] # REMOVE OLD ENTRY else: raise TypeError('Attribute name must be a string') return self # REQUIRED FROM iadd()!! def initInstance(self, obj): "Add obj as new node to all graphs referenced by this SchemaDict." for g, l in self.items(): # GET ALL OUR RULES for s in l: if obj not in g: g.__iadd__(obj, (s, )) # ADD OBJECT TO GRAPH USING RULE s def getschema(self, attr=None, graph=None): "Return list of schema rules that match attr / graph arguments." if attr: if attr in self.attrs: return [self.attrs[attr]] elif graph: if graph in self: return self[graph] else: raise ValueError('You must specify an attribute or graph.') return [] # DIDN'T FIND ANYTHING class SchemaList(list): "Temporary container for returned schema list, with attached methods" def __init__(self, obj): self.obj = obj # OBJECT THAT WE'RE DESCRIBING SCHEMA OF list.__init__(self) # CALL SUPERCLASS CONSTRUCTOR def __iadd__(self, rule): "Add a new schema rule to object described by this SchemaList" if not hasattr(self.obj, '__schema__'): self.obj.__schema__ = SchemaDict() self.obj.__schema__ += rule return self # REQUIRED FROM iadd()!! # PROBABLY NEED AN __isub__() TOO?? ###################### # getschema, getnodes, getedges # these functions are analogous to getattr, except they get graph information def getschema(o, attr=None, graph=None): "Get list of schema rules for object o that match attr / graph arguments." found = SchemaList(o) attrs = {} if hasattr(o, '__schema__'): for s in o.__schema__.getschema(attr, graph): found.append(s) if isinstance(s[1], types.StringType): attrs[s[1]] = None if attr and len(found) > 0: # DON'T PROCEED return found if hasattr(o, '__class_schema__'): for s in o.__class_schema__.getschema(attr, graph): if not isinstance(s[1], types.StringType) or s[1] not in attrs: found.append(s) # DON'T OVERWRITE OBJECT __schema__ BINDINGS return found def setschema(o, attr, graph): """Bind object to graph, and if attr not None, also bind graph to this attribute.""" if not hasattr(o, '__schema__'): o.__schema__ = SchemaDict() o.__schema__ += (graph, attr) def getnodes(o, attr=None, graph=None): """Get destination nodes from graph bindings of o, limited to the specific attribute or graph if specified""" if attr: if hasattr(o, '__schema__') and attr in o.__schema__: return getattr(o, o.__schema__[attr][2]) # RETURN THE PRODUCT if hasattr(o, '__class_schema__') and attr in o.__class_schema__: return getattr(o, o.__class_schema__[attr][2]) # RETURN THE PRODUCT raise AttributeError('No attribute named %s in object %s' % (attr, o)) elif graph: # JUST LOOK UP THE GRAPH TRIVIALLY return graph[o] else: # SHOULD WE GET ALL NODES FROM ALL SCHEMA ENTRIES? HOW?? raise ValueError('You must pass an attribute name or graph') def getedges(o, attr=None, graph=None): """Get edges from graph bindings of o, limited to the specific attribute or graph if specified""" g = getnodes(o, attr, graph) # CAN JUST REUSE THE LOGIC OF getnodes if g and hasattr(g, 'edges'): return g.edges() else: return None PKðŠ’;CÖ¿))pygr/schema.pyc;ò |†Kc@sodkZdefd„ƒYZdefd„ƒYZeed„Zd„Zeed„Zeed„Z dS( Ns SchemaDictcBsGtZdZffd„Zd„Zd„Zd„Zeed„ZRS(sÅContainer for schema rules bound to a class or object. Rules are stored in two indexes for fast access, indexed by graph, and indexed by attrname. Use += and -= to add or remove rules. cCs€h|_ti|ƒxH|D]@}t|dƒo*|i|iƒ|ii|iiƒqqWx|D]}||7}qhWdS(sEInitialize schema list from list of base classes and newlist of ruless__class_schema__N( sselfsattrssdicts__init__sbaselistsbshasattrsupdates__class_schema__snewlistsi(sselfsnewlistsbaselistsbsi((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys__init__ s  cCsº|d}t|ƒdjoit|dtiƒoB|d|ijo||i|d8}n||i|dReturn list of schema rules that match attr / graph arguments.s'You must specify an attribute or graph.N(sattrsselfsattrssgraphs ValueError(sselfsattrsgraph((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys getschema@s  ( s__name__s __module__s__doc__s__init__s__iadd__s__isub__s initInstancesNones getschema(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys SchemaDicts    s SchemaListcBs tZdZd„Zd„ZRS(sCTemporary container for returned schema list, with attached methodscCs||_ti|ƒdS(N(sobjsselfslists__init__(sselfsobj((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys__init__Ps cCsAt|idƒ otƒ|i_n|ii|7_|SdS(s<Add a new schema rule to object described by this SchemaLists __schema__N(shasattrsselfsobjs SchemaDicts __schema__srule(sselfsrule((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys__iadd__Ts (s__name__s __module__s__doc__s__init__s__iadd__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys SchemaListMs  cCst|ƒ}h}t|dƒoZxW|ii||ƒD]<}|i |ƒt |dt i ƒot||dReturn list of schema rules that match attr / graph arguments.s'You must specify an attribute or graph.N(sattrsselfsattrssgraphs ValueError(sselfsattrsgraph((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys getschema@s  ( s__name__s __module__s__doc__s__init__s__iadd__s__isub__s initInstancesNones getschema(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys SchemaDicts    s SchemaListcBs tZdZd„Zd„ZRS(sCTemporary container for returned schema list, with attached methodscCs||_ti|ƒdS(N(sobjsselfslists__init__(sselfsobj((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys__init__Ps cCsAt|idƒ otƒ|i_n|ii|7_|SdS(s<Add a new schema rule to object described by this SchemaLists __schema__N(shasattrsselfsobjs SchemaDicts __schema__srule(sselfsrule((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys__iadd__Ts (s__name__s __module__s__doc__s__init__s__iadd__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/schema.pys SchemaListMs  cCst|ƒ}h}t|dƒoZxW|ii||ƒD]<}|i |ƒt |dt i ƒot||d self._cache_max: # TRUNCATE EXCESSIVE LENGTH ival=(ival[0], ival[0] + self._cache_max) # @CTB untested d[id]=[ival[0], ival[1]] try: self._cache[owner] = d # ADD TO EXISTING CACHE except AttributeError: self._cache = weakref.WeakKeyDictionary() # AUTOMATICALLY REMOVE self._cache[owner] = d # FROM CACHE IF owner GOES OUT OF SCOPE def strsliceCache(self, seq, start, stop): """Get strslice using cache hints, if any available.""" try: cacheDict=self._cache except AttributeError: raise IndexError('no cache present') for owner, d in cacheDict.items(): try: ival = d[seq.id] except KeyError: continue # NOT IN THIS CACHE, SO SKIP @CTB untested ival_start, ival_stop = ival[:2] if start >= ival_start and stop <= ival_stop: # CONTAINED IN ival try: s = ival[2] # get seq string from our cache except IndexError: # use strslice() to retrieve from storage s = seq.strslice(ival_start, ival_stop, useCache=False) ival.append(s) try: # does owner want to reference this cached seq? save_f = owner.cache_reference except AttributeError: pass # no, so nothing to do else: # let owner control caching in our _weakValueDict save_f(seq) # # @CTB untested return s[start - ival_start:stop - ival_start] raise IndexError('interval not found in cache') # @CTB untested # these methods should all be implemented on all SequenceDBs. def close(self): pass # subclass should implement closing of its open resources! def __iter__(self): return iter(self.seqInfoDict) def iteritems(self): for seqID in self: yield seqID, self[seqID] def __len__(self): return len(self.seqInfoDict) def __getitem__(self, seqID): """Retrieve sequence by id, using cache if available.""" try: # for speed, default case (cache hit) should return immediately return self._weakValueDict[seqID] except KeyError: # not in cache? try loading. try: s = self.itemClass(self, seqID) except KeyError: raise KeyError("no key '%s' in database %s" % (seqID, repr(self))) self._weakValueDict[seqID] = s # save in cache. return s def keys(self): return self.seqInfoDict.keys() def __contains__(self, key): return key in self.seqInfoDict def __repr__(self): return "<%s '%s'>" % (self.__class__.__name__, self.itemClass.__class__.__name__) def clear_cache(self): """Empty the cache.""" self._weakValueDict.clear() # these methods should not be implemented for read-only database. clear = setdefault = pop = popitem = copy = update = \ classutil.read_only_error #### # # FileDBSequence and SequenceFileDB, and associated support classes. # class _FileDBSeqDescriptor(object): """Descriptor to retrieve entire sequence from seqLenDict.""" def __get__(self, obj, objtype): length = obj.db.seqLenDict[obj.id][0] return obj.strslice(0, length) class FileDBSequence(SequenceBase): """Default sequence object for file-based storage mechanism. See SequenceFileDB for the associated database class. In general, you should not create objects from this class directly; retrieve them from SequenceFileDB objects, instead. NOTE: 'self.db' is attached to all instances of this class that come from a particular database by 'classutil.get_bound_subclass'. """ seq = _FileDBSeqDescriptor() # dynamically retrieve 'seq'. __reduce__ = classutil.item_reducer # for pickling purposes. def __init__(self, db, id): self.id = id SequenceBase.__init__(self) if self.id not in self.db.seqLenDict: raise KeyError('sequence %s not in db %s' % (self.id, self.db)) def __len__(self): """Unpack this sequence's length from the seqLenDict.""" return self.db.seqLenDict[self.id][0] def strslice(self, start, end, useCache=True): """Access slice of a sequence efficiently, using seqLenDict info.""" if useCache: # If it's in the cache, use that! try: return self.db.strsliceCache(self, start, end) except IndexError: pass return self.db.strslice(self.id, start, end) class SequenceFileDB(SequenceDB): """Main class for file-based storage of a sequence database. By default, SequenceFileDB uses a seqLenDict, a.k.a. a shelve index of sequence lengths and offsets, to retrieve sequence slices with fseek. Thus entire chromosomes (for example) do not have to be loaded to retrieve a subslice. Takes one required argument, 'filepath', which should be the name of a FASTA file (or a file whose format is understood by your custom reader; see 'reader' kw arg, and the _store_seqlen_dict function). The SequenceFileDB seqInfoDict interface is a wrapper around the seqLenDict created by the __init__ function. """ itemClass = FileDBSequence # copy _pickleAttrs and add 'filepath' _pickleAttrs = SequenceDB._pickleAttrs.copy() _pickleAttrs['filepath'] = 0 def __init__(self, filepath, reader=None, **kwargs): # make filepath a pickleable attribute. self.filepath = classutil.SourceFileName(str(filepath)) fullpath = self.filepath + '.seqlen' # build the seqLenDict if it doesn't already exist try: seqLenDict = classutil.open_shelve(fullpath, 'r') except NoSuchFileError: seqLenDict = self._create_seqLenDict(fullpath, filepath, reader) self.seqLenDict = seqLenDict self.seqInfoDict = _SeqLenDictWrapper(self) # standard interface # initialize base class. dbname = os.path.basename(filepath) SequenceDB.__init__(self, filepath=filepath, dbname=dbname, **kwargs) def close(self): '''close our open shelve index file and _pureseq...''' self.seqLenDict.close() try: do_close = self._pureseq.close except AttributeError: pass # _pureseq not open yet, so nothing to do else: do_close() def __repr__(self): return "<%s '%s'>" % (self.__class__.__name__, self.filepath) def _create_seqLenDict(self, dictpath, seqpath, reader=None): """Create a seqLenDict from 'seqpath' and store in 'dictpath'.""" seqLenDict = classutil.open_shelve(dictpath, 'n') try: logger.debug('Building sequence length index...') _store_seqlen_dict(seqLenDict, seqpath, reader) finally: seqLenDict.close() # close after writing, no matter what! return classutil.open_shelve(dictpath, 'r') # re-open read-only def strslice(self, seqID, start, end, useCache=True): """Access slice of a sequence efficiently, using seqLenDict info.""" # Retrieve sequence from the .pureseq file based on seqLenDict # information. try: ifile=self._pureseq except AttributeError: fullpath = self.filepath + '.pureseq' ifile = file(fullpath, 'rb') self._pureseq = ifile # Now, read in the actual slice. offset = self.seqLenDict[seqID][1] ifile.seek(offset + start) return ifile.read(end - start) # Some support classes for the SeqLenDict mechanism. class BasicSeqInfo(object): """Wrapper to provide the correct seqInfoDict-style object information. This boils down to providing id, db, length, and possibly offset. """ def __init__(self, seqID, seqDB, length=None): self.id = seqID self.db = seqDB if length is None: self.length = len(seqDB[seqID]) # generic but possibly slow else: self.length = length class _SeqLenObject(BasicSeqInfo): """Wrapper for use with a seqLenDict """ def __init__(self, seqID, seqDB): length, self.offset = seqDB.seqLenDict[seqID] BasicSeqInfo.__init__(self, seqID, seqDB, length) class BasicSeqInfoDict(object, UserDict.DictMixin): """Wrapper around SequenceDB.seqLenDict to provide seqInfoDict behavior. This basic version just gets the length from the sequence object itself. """ itemClass = BasicSeqInfo def __init__(self, db): self.seqDB = db def __getitem__(self, k): return self.itemClass(k, self.seqDB) def __len__(self): return len(self.seqDB.seqLenDict) def __iter__(self): return iter(self.seqDB.seqLenDict) def keys(self): return self.seqDB.seqLenDict.keys() class _SeqLenDictWrapper(BasicSeqInfoDict): """ The default storage mechanism for sequences implemented by FileDBSequence and SequenceFileDB puts everything in seqLenDict, a shelve index of lengths and offsets. This class wraps that dictionary to provide the interface that SequenceDB expects to see. """ itemClass = _SeqLenObject class _SeqLenDictSaver(object): """Support for generic reading functions, called by _store_seqlen_dict. This allows you to specify your own 'reader' function when constructing a FileSequenceDB, e.g. so that you could read something other than FASTA files into a seqLenDict. Pass in this function as the 'reader' kwarg to FileSequenceDB. Custom reader functions should take a file handle and a filename, and return a list of sequence info objects with 'id', 'length', and 'sequence' attributes for each sequence in the given file/filename. _SeqLenDictSaver will then construct a '.pureseq' file containing the concatenated sequences and fill in the seqLenDict appropriately. """ def __init__(self, reader): self.reader = reader def __call__(self, d, ifile, filename): offset = 0L pureseq_fp = file(filename + '.pureseq', 'wb') try: for o in self.reader(ifile, filename): # store the length & offset in the seqLenDict d[o.id] = o.length, offset offset += o.length if o.length != len(o.sequence): raise ValueError('length does not match sequence: %s,%d' % (o.id, o.length)) pureseq_fp.write(o.sequence) finally: pureseq_fp.close() def _store_seqlen_dict(d, filename, reader=None, mode='rU'): """Store sequence lengths in a dictionary, e.g. a seqLenDict. Used by SequenceFileDB._create_seqLenDict. The 'reader' function implements a custom sequence format reader; by default, _store_seqlen_dict uses seqfmt.read_fasta_lengths, which reads FASTA-format files. See _SeqLenDictSaver for information on building a custom 'reader', and see the seqdb docs for an example. """ # if a custom reader function was passed in, run that. builder = seqfmt.read_fasta_lengths if reader is not None: builder = _SeqLenDictSaver(reader) ifile = file(filename, mode) try: builder(d, ifile, filename) # run the builder on our sequence set finally: ifile.close() #### # # class PrefixUnionDict and associated support classes. # class _PrefixUnionDictInverse(object): """Provide inverse (~) operator behavior for PrefixUnionDicts. This enables ~pud to return a database that, given a sequence object, returns the corresponding key (prefix.id) to retrieve that sequence object in the pud. """ def __init__(self, db): self.db = db def __getitem__(self, ival): seq = ival.pathForward # get the top-level sequence object try: # for speed, normal case should execute immediately prefix = self.db.dicts[seq.db] except KeyError: try: # @CTB abstraction boundary violation! keep? how test? if seq.pathForward._anno_seq.db in self.db.dicts: raise KeyError('''\ this annotation is not in the PrefixUnion, but its sequence is. You can get that using its \'sequence\' attribute.''') except AttributeError: pass raise KeyError('seq.db not in PrefixUnionDict') return prefix + self.db.separator + str(seq.id) def __contains__(self, seq): try: return seq.pathForward.db in self.db.dicts except AttributeError: return False class _PrefixUnionMemberDict(object, UserDict.DictMixin): """ @CTB confusing/inappropriate use of a dict interface! keep?? @CTB document. 'd[prefix]=value; d[k] returns value if k is a member of prefix' """ def __init__(self, puDict, default=None, attrMethod=lambda x: x.pathForward.db): self.values = {} self.puDict = puDict self._attrMethod = attrMethod if default is not None: self.default = default # @CTB can we use setdefault for this? def keys(self): return self.puDict.prefixDict.keys() possibleKeys = keys # legacy interface (?) def __setitem__(self, k, v): if k not in self.puDict.prefixDict: raise KeyError('key %s is not a valid union prefix string!' % k) new_k = self.puDict.prefixDict[k] self.values[new_k] = v def __getitem__(self, k): try: db = self._attrMethod(k) except AttributeError: raise TypeError('wrong key type? _attrMethod() failed.') if db not in self.values: try: return self.default except AttributeError: # no default value - raise KeyError. raise KeyError('key not a member of this union!') return self.values[db] class PrefixUnionDict(object, UserDict.DictMixin): """Interface to a set of sequence DBs, each assigned a unique prefix. For example, the sequence ID 'foo.bar' would unpack to ID 'bar' in the dictionary associated with the prefix 'foo'. This is a useful way to combine disparate seqdbs into a single db, without actually altering the individual seqdbs. PrefixUnionDicts can be created in one of two ways: either - pass in a dictionary containing prefix-to-seqdb mappings as 'prefixDict', or - pass in a header file containing the information necessary to create such a dictionary. In the latter case, see the 'writeHeaderFile' method for format information. The optional kwarg 'trypath' contains a list of directories to search for the database file named in each line. The optional kwarg 'dbClass' specifies the database class to use to load each sequence file; it defaults to SequenceFileDB. The default ID separator is '.'; use the 'separator' kwarg to change it. @CTB trypath => trypaths? """ # define ~ (invert) operator to return a lazily-created _PUDInverse. __invert__ = classutil.lazy_create_invert(_PrefixUnionDictInverse) def __init__(self, prefixDict=None, separator='.', filename=None, dbClass=SequenceFileDB, trypath=None): # read union header file if filename is not None: if prefixDict: raise TypeError(''' cannot create with prefixDict and filename both!''') if trypath is None: trypath = [os.path.dirname(filename)] ifile = file(filename, 'rU') try: it = iter(ifile) # Remove leading/trailing CR+LF. separator = it.next().strip('\r\n') prefixDict = {} for line in it: prefix, filepath=line.strip().split('\t')[:2] try: dbfile = classutil.search_dirs_for_file(filepath, trypath) db = dbClass(dbfile) except IOError: for db in prefixDict.values(): db.close() # close databases before exiting raise IOError('''\ unable to open database %s: check path or privileges. Set 'trypath' to give a list of directories to search.''' % filepath) else: prefixDict[prefix] = db finally: ifile.close() self.separator = separator if prefixDict is not None: self.prefixDict = prefixDict else: self.prefixDict = {} # also create a reverse mapping d = {} for k, v in self.prefixDict.items(): d[v] = k self.dicts = d self.seqInfoDict = _PUDSeqInfoDict(self) # supply standard interface def format_id(self, prefix, seqID): return prefix + self.separator + seqID def get_prefix_id(self, k): """Subdivide a key into a prefix and ID using the given separator.""" try: t = k.split(self.separator, 2) # split into no more than 3 fields except AttributeError: raise KeyError('key should be a string! ' + repr(k)) l = len(t) if l == 2: return t elif l<2: raise KeyError('invalid id format; no prefix: ' + k) else: # id contains separator character? prefix = t[0] # assume prefix doesn't contain separator @CTB untested seqID = k[len(prefix) + 1:] # skip past prefix return prefix, seqID def get_subitem(self, d, seqID): # try int key first try: return d[int(seqID)] except (ValueError, KeyError, TypeError): pass # otherwise, use default (str) key try: return d[seqID] except KeyError: raise KeyError("no key '%s' in %s" % (seqID, repr(d))) def __getitem__(self, k): """For 'foo.bar', return 'bar' in dict associated with prefix 'foo'""" prefix, seqID = self.get_prefix_id(k) try: d = self.prefixDict[prefix] except KeyError, e: raise KeyError("no key '%s' in %s" % (k, repr(self))) return self.get_subitem(d, seqID) def __contains__(self, k): """Is the given ID in our PrefixUnionDict?""" # try it out as an ID. if isinstance(k, str): try: (prefix, id) = self.get_prefix_id(k) return id in self.prefixDict[prefix] except KeyError: return False # otherwise, try treating key as a sequence. # @CTB inconsistent with 'getitem'. try: db = k.pathForward.db except AttributeError: raise AttributeError('key must be a sequence with db attribute!') return db in self.dicts def has_key(self, k): return self.__contains__(k) def __iter__(self): for p, d in self.prefixDict.items(): for id in d: yield self.format_id(p, id) def keys(self): return list(self.iterkeys()) def iterkeys(self): return iter(self) def iteritems(self): for p, d in self.prefixDict.items(): for id, seq in d.iteritems(): yield self.format_id(p, id), seq def getName(self, ival): """For a given sequence, return a fully qualified name, 'prefix.id'.""" seq = ival.pathForward # get the top-level sequence object return self.dicts[seq.db] + self.separator + seq.id def newMemberDict(self, **kwargs): # @CTB not used; necessary? """return a new member dictionary (empty)""" return _PrefixUnionMemberDict(self, **kwargs) def writeHeaderFile(self, filename): # @CTB not used; necessary? """Save a header file, suitable for later re-creation.""" ifile = file(filename, 'w') print >>ifile, self.separator for k, v in self.prefixDict.items(): try: print >>ifile, '%s\t%s' % (k, v.filepath) except AttributeError: raise AttributeError('''\ seq db '%s' has no filepath; you may be able to save this to worldbase, but not to a text HeaderFile!''' % k) ifile.close() def __len__(self): n=0 for db in self.dicts: n += len(db) return n def cacheHint(self, ivalDict, owner=None): # @CTB untested '''save a cache hint dict of {id:(start,stop)}''' d={} # extract separate cache hint dict for each prefix for longID, ival in ivalDict.items(): prefix, seqID = self.get_prefix_id(longID) d.setdefault(prefix, {})[seqID] = ival for prefix, seqDict in d.items(): try: m = self.prefixDict[prefix].cacheHint except AttributeError: # subdict can't cacheHint(), so just ignore pass else: # pass cache hint down to subdictionary m(seqDict, owner) # not clear what this should do for PrefixUnionDict copy = setdefault = update = classutil.method_not_implemented # these methods should not be implemented for read-only database. clear = pop = popitem = classutil.read_only_error class _PrefixDictInverseAdder(_PrefixUnionDictInverse): """Inverse class for SeqPrefixUnionDict; adds sequences when looked up. @CTB is getName only used by __getitem__? Make private? """ def getName(self, seq): """Find in or add the given sequence to the inverse of a PUD.""" try: return _PrefixUnionDictInverse.__getitem__(self, seq) except AttributeError: # no seq.db? treat as a user sequence. new_id = 'user' + self.db.separator + seq.pathForward.id # check to make sure it's already in the user seq db... _ = self.db[new_id] return new_id def __getitem__(self, seq): """__getitem__ interface that calls getName.""" try: return self.getName(seq) except KeyError: if not self.db.addAll: raise # if we should add, add seq & re-try. self.db += seq return self.getName(seq) class SeqPrefixUnionDict(PrefixUnionDict): """SeqPrefixUnionDict provides += functionality to add seqs to a PUD. See the __iadd__ method for details. If addAll is True, then looking a sequence up in the inverse db will automatically add it to the PrefixUnionDict. """ __invert__ = classutil.lazy_create_invert(_PrefixDictInverseAdder) def __init__(self, addAll=False, **kwargs): PrefixUnionDict.__init__(self, **kwargs) # override default PrefixUnionDict __invert__ to add sequences; # see classutil.lazy_create_invert. self.addAll = addAll # see _PrefixDictInverseAdder behavior. def __iadd__(self, k): """Add a sequence or database to the PUD, with a unique prefix. NOTE: __iadd__ must return self. """ # seq or db already present? if k in (~self): return self db = getattr(k, 'db', None) if db is None: # annotation sequence? db = getattr(k.pathForward, 'db', None) # @CTB untested if db is None: # this is a user sequence, with no container; create. if 'user' not in self.prefixDict: d = KeepUniqueDict() self._add_prefix_dict('user', d) else: d = self.prefixDict['user'] # now add the sequence d[k.pathForward.id] = k.pathForward return self # already contain? nothing to do. if db in self.dicts: # @CTB can this 'if' ever be true? return self # ok, not present; add, with a unique name. does it have # _persistent_id? try: name = db._persistent_id.split('.')[-1] except AttributeError: # no; retrieve from filepath? name = getattr(db, 'filepath', None) if name: # got one; clean up. name = os.path.basename(name) name = name.split('.')[0] else: # generate one. name = 'noname%d' % len(self.dicts) if name in self.prefixDict: logger.debug(''' It appears that two different sequence databases are being assigned the same prefix ("%s"). For this reason, the attempted automatic construction of a PrefixUnionDict for you cannot be completed! You should instead construct a PrefixUnionDict that assigns a unique prefix to each sequence database, and supply it directly as the seqDict argument to the NLMSA constructor.''' % id) raise ValueError('''\ cannot automatically construct PrefixUnionDict''') self._add_prefix_dict(name, db) return self def _add_prefix_dict(self, name, d): self.prefixDict[name] = d self.dicts[d] = name class _PUDSeqInfoDict(object, UserDict.DictMixin): """A wrapper object supplying a standard seqInfoDict interface for PUDs. This class simply provides a standard dict interface that rewrites individual sequence IDs into the compound PrefixUnionDict seq IDs on the fly. """ def __init__(self, db): self.seqDB = db def __iter__(self): return iter(self.seqDB) def keys(self): return list(self.iterkeys()) def iterkeys(self): for (k, v) in self.iteritems(): yield k def itervalues(self): for (k, v) in self.iteritems(): yield v def iteritems(self): for p, d in self.seqDB.prefixDict.items(): for seqID, info in d.seqInfoDict.iteritems(): yield self.seqDB.format_id(p, seqID), info def __getitem__(self, k): prefix, seqID = self.seqDB.get_prefix_id(k) db = self.seqDB.prefixDict[prefix] return self.seqDB.get_subitem(db.seqInfoDict, seqID) def has_key(self, k): return k in self.seqDB # # @CTB stopped review here. ################################################### # class BlastDB(SequenceFileDB): # @CTB untested? '''Deprecated interface provided for backwards compatibility. Provides blast() and megablast() methods for searching your seq db. Instead of this, you should use the blast.BlastMapping, which provides a graph interface to BLAST, or MegablastMapping for megablast.''' def __reduce__(self): # provided only for compatibility w/ 0.7 clients return (classutil.ClassicUnpickler, (self.__class__, self.__getstate__())) def __init__(self, filepath=None, blastReady=False, blastIndexPath=None, blastIndexDirs=None, **kwargs): """format database and build indexes if needed. Provide filepath or file object""" SequenceFileDB.__init__(self, filepath, **kwargs) def __repr__(self): return "" % (self.filepath) def blast(self, seq, al=None, blastpath='blastall', blastprog=None, expmax=0.001, maxseq=None, verbose=True, opts='', **kwargs): 'run blast with the specified parameters, return NLMSA alignment' blastmap = self.formatdb() return blastmap(seq, al, blastpath, blastprog, expmax, maxseq, verbose, opts, **kwargs) def megablast(self, seq, al=None, blastpath='megablast', expmax=1e-20, maxseq=None, minIdentity=None, maskOpts='-U T -F m', rmPath='RepeatMasker', rmOpts='-xsmall', verbose=True, opts='', **kwargs): 'run megablast with the specified parameters, return NLMSA alignment' from blast import MegablastMapping blastmap = self.formatdb(attr='megablastMap', mapClass=MegablastMapping) return blastmap(seq, al, blastpath, expmax, maxseq, minIdentity, maskOpts, rmPath, rmOpts, verbose, opts, **kwargs) def formatdb(self, filepath=None, attr='blastMap', mapClass=None): 'create a blast mapping object if needed, and ensure it is indexed' try: # see if mapping object already exists blastmap = getattr(self, attr) except AttributeError: if mapClass is None: # default: BlastMapping from blast import BlastMapping mapClass = BlastMapping blastmap = mapClass(self) setattr(self, attr, blastmap) # re-use this in the future blastmap.formatdb(filepath) # create index file if not already present return blastmap class BlastDBXMLRPC(BlastDB): 'XMLRPC server wrapper around a standard BlastDB' xmlrpc_methods = dict(getSeqLen=0, get_strslice=0, getSeqLenDict=0, get_db_size=0, get_seqtype=0, strslice='get_strslice') def getSeqLen(self, id): 'get sequence length, or -1 if not found' try: return len(self[id]) except KeyError: return -1 # SEQUENCE OBJECT DOES NOT EXIST def getSeqLenDict(self): 'return seqLenDict over XMLRPC' d = {} for k, v in self.seqLenDict.items(): d[k] = v[0], str(v[1]) # CONVERT TO STR TO ALLOW OFFSET>2GB return d # XML-RPC CANNOT HANDLE INT > 2 GB, SO FORCED TO CONVERT... def get_db_size(self): return len(self) def get_strslice(self, id, start, stop): '''return string sequence for specified interval in the specified sequence''' if start < 0: # HANDLE NEGATIVE ORIENTATION return str((-(self[id]))[-stop:-start]) else: # POSITIVE ORIENTATION return str(self[id][start:stop]) def get_seqtype(self): return self._seqtype class XMLRPCSequence(SequenceBase): "Represents a sequence in a blast database, accessed via XMLRPC" def __init__(self, db, id): self.length = db.server.getSeqLen(id) if self.length <= 0: raise KeyError('%s not in this database' % id) self.id = id SequenceBase.__init__(self) def strslice(self, start, end, useCache=True): "XMLRPC access to slice of a sequence" if useCache: try: return self.db.strsliceCache(self, start, end) except IndexError: # NOT FOUND IN CACHE pass # JUST USE OUR REGULAR XMLRPC METHOD # Get from XMLRPC. return self.db.server.get_strslice(self.id, start, end) def __len__(self): return self.length class XMLRPCSeqLenDescr(object): 'descriptor that returns dictionary of remote server seqLenDict' def __init__(self, attr): self.attr = attr def __get__(self, obj, objtype): '''only called if attribute does not already exist. Saves result as attribute''' d = obj.server.getSeqLenDict() for k, v in d.items(): d[k] = v[0], int(v[1]) # CONVERT OFFSET STR BACK TO INT obj.__dict__[self.attr] = d # PROVIDE DIRECTLY TO THE __dict__ return d class XMLRPCSequenceDB(SequenceDB): 'XMLRPC client: access sequence database over XMLRPC' itemClass = XMLRPCSequence # sequence storage interface seqLenDict = XMLRPCSeqLenDescr('seqLenDict') # INTERFACE TO SEQLENDICT def __init__(self, url, name, *args, **kwargs): import coordinator self.server = coordinator.get_connection(url, name) self.url = url self.name = name self.seqInfoDict = _SeqLenDictWrapper(self) SequenceDB.__init__(self, *args, **kwargs) def __reduce__(self): # provided only for compatibility w/ 0.7 clients return (classutil.ClassicUnpickler, (self.__class__, self.__getstate__())) def __getstate__(self): # DO NOT pickle self.itemClass! We provide our own. return dict(url=self.url, name=self.name) # just need XMLRPC info def __len__(self): return self.server.get_db_size() def __contains__(self, k): if self.server.getSeqLen(k)>0: return True else: return False def _set_seqtype(self): 'efficient way to determine sequence type of this database' try: # if already known, no need to do anything return self._seqtype except AttributeError: self._seqtype = self.server.get_seqtype() return self._seqtype PKðŠ’;Ä3²‰ààpygr/seqdb.pyc;ò |†Kc@s‘dZdklZdkZdkZdkZdkZdkTdkTdk Z dk l Z l Z l Z lZlZdkZdkZdklZdefd„ƒYZdeeifd „ƒYZd efd „ƒYZd efd „ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdeeifd„ƒYZdefd„ƒYZdefd„ƒYZ e!dd„Z"defd„ƒYZ#deeifd„ƒYZ$d eeifd!„ƒYZ%d"e#fd#„ƒYZ&d$e%fd%„ƒYZ'd&eeifd'„ƒYZ(d(efd)„ƒYZ)d*e)fd+„ƒYZ*d,efd-„ƒYZ+d.efd/„ƒYZ,d0efd1„ƒYZ-dS(2sî seqdb contains a set of classes for interacting with sequence databases. Primary sequence database classes: - SequenceDB - base class for sequence databases - SequenceFileDB - file-based sequence database - PrefixUnionDict - container to combine multiple sequence databases - XMLRPCSequenceDB - XML-RPC-accessible sequence database Extensions: - SeqPrefixUnionDict - extends PrefixUnionDict to automatically add seqs - BlastDB - implements NCBI-style name munging for lookups Associated sequence classes: - FileDBSequence - sequence associated with a SequenceFileDB - XMLRPCSequence - sequence associated with a XMLRPCSequenceDB ---- SequenceDB provides some basic behaviors for sequence databases: dictionary behavior, an invert operator interface, and caching for both sequence objects and sequence intervals. It also relies on a 'seqInfoDict' attribute to contain summary information about sequences, so that e.g. slice operations can be done without loading the entire sequence into memory. (See below for more info on seqInfoDict.) SequenceFileDB extends SequenceDB to contain a file-based database of sequences. It constructs a seqLenDict that allows direct on-disk lookup of sequence intervals. (See below for more info on seqLenDict.) PrefixUnionDict provides a unified SequenceDB-like interface to a collection of sequence databases by combining the database name with the sequence ID into a new sequence id. For example, the ID 'genome.chrI' would return the sequence 'chrI' in the 'genome' database. This is particularly handy for situations where you want to have seqdbs of multiple sequence types (DNA, protein, annotations, etc.) all associated together. @CTB document XMLRPCSequenceDB. @CTB document SeqPrefixUnionDict. @CTB document BlastDB. ---- The seqInfoDict interface ------------------------- The seqInfoDict attribute of a SequenceDB is a dictionary-like object, keyed by sequence IDs, with associated values being an information object containing various attributes. seqInfoDict is essentially an optimization that permits other pygr-aware components to access information *about* sequences without actually loading the entire sequence. The only required attribute at the moment is 'length', which is required by some of the NLMSA code. However, seqInfoDict is a good mechanism for the storage of any summary information on a sequence, and so it may be expanded in the future. The seqLenDict interface ------------------------ The seqLenDict attribute is specific to a SequenceFileDB, where it provides a file-backed storage of length and offset sequence metadata. It is used to implement a key optimization in SequenceFileDB, in which a sequence's offset within a file is used to read only the required part of the sequence into memory. This optimization is particularly important for large sequences, e.g. chromosomes, where reading the entire sequence into memory shouldn't be done unless it's necessary. The seqLenDict is keyed by sequence ID and the associated values are a 2-tuple (length, offset), where the offset indicates the byte offset within the '.pureseq' index file created for each SequenceFileDB. get_bound_subclass and the 'self.db' attribute ---------------------------------------------- The SequenceDB constructor calls classutil.get_bound_subclass on its itemClass. What does that do, and what is it for? get_bound_subclass takes an existing class, makes a new subclass of it, binds the variable 'db' to it, and then calls the _init_subclass classmethod (if it exists) on the new class. This has the effect of creating a new class for each SequenceDB instance, tied specifically to that instance and initialized by the _init_subclass method. The main effect of this for SequenceDBs is that for any SequenceDB descendant, the '.db' attribute is automatically set for each Sequence retrieved from the database. CTB: I think this is an optimization? Caching ------- @CTB discuss caching. Pickling sequence databases and sequences ----------------------------------------- @CTB document pickling issues. programmer notes: extending SequenceDB - seqInfoDict, itemclass extending SequenceFileDB - seqLenDict - using your own itemclass - using your own reader doctests & examples ------------------- update docs for these classes! intro: - loading a FASTA file - using a PUD + combining dbs, etc. + inverse Code review issues, short term: - @CTB get_bound_subclass stuff refers directly to itemClass to set 'db'. - @CTB fix 'import *'s - @CTB run lint/checker? - @CTB test _create_seqLenDict - @CTB XMLRPCSequenceDB vs SequenceFileDB Some long term issues: - it should be possible to remove _SeqLenDictSaver and just combine its functionality with _store_seqlen_dict. --titus 3/21/09 (s generatorsN(s*(s AnnotationDBs AnnotationSeqsAnnotationSlicesAnnotationServersAnnotationClient(sNoSuchFileErrors_SequenceDBInversecBs)tZdZd„Zd„Zd„ZRS(sAImplements __inverse__ on SequenceDB objects, returning seq name.cCs ||_dS(N(sdbsself(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__§scCs|iiSdS(N(sseqs pathForwardsid(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__ªscCs5y|ii|ijSWntj o tSnXdS(N(sseqs pathForwardsdbsselfsAttributeErrorsFalse(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __contains__­s(s__name__s __module__s__doc__s__init__s __getitem__s __contains__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SequenceDBInverse¤s   s SequenceDBcBsñtZdZeZeZeiZ ei Z e ddƒZ eieƒZeed„Zd„Zd„ZdZd„Zd„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Z ei!Z"Z#Z$Z%Z&Z'RS(sÏBase class for sequence databases. SequenceDB provides a few basic (base) behaviors: - dict-like interface to sequence objects each with an ID - the ~ (invert) operator returns an 'inverted' database, which is a dict-like object that returns sequence names when given a sequence. - weakref-based automatic flushing of seq objects no longer in use; use autoGC=0 to turn this off. - cacheHint() system for caching a given set of sequence intervals associated with an owner object, which are flushed from cache if the owner object is garbage-collected. For subclassing, note that self.seqInfoDict must be set before SequenceDB.__init__ is called! sautoGCicKs¼|oti|ƒ|_n h|_||_|id|iƒ|_|id|iƒ|_|it jot dƒ‚n|i ƒ}||d(sselfs __class__s__name__s itemClass(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__LscCs|iiƒdS(sEmpty the cache.N(sselfs_weakValueDictsclear(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys clear_cachePs((s__name__s __module__s__doc__sNones itemClasss SeqDBSlicesitemSliceClasss classutilsstandard_getstates __getstate__sstandard_setstates __setstate__sdicts _pickleAttrsslazy_create_inverts_SequenceDBInverses __invert__sTrues__init__s__hash__s _set_seqtypes _cache_maxs cacheHints strsliceCachescloses__iter__s iteritemss__len__s __getitem__skeyss __contains__s__repr__s clear_cachesread_only_errorsclears setdefaultspopspopitemscopysupdate(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys SequenceDB´s.               s_FileDBSeqDescriptorcBstZdZd„ZRS(s7Descriptor to retrieve entire sequence from seqLenDict.cCs+|ii|id}|id|ƒSdS(Ni(sobjsdbs seqLenDictsidslengthsstrslice(sselfsobjsobjtypeslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__get__as(s__name__s __module__s__doc__s__get__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_FileDBSeqDescriptor^s sFileDBSequencecBs>tZdZeƒZeiZd„Zd„Z e d„Z RS(s‡Default sequence object for file-based storage mechanism. See SequenceFileDB for the associated database class. In general, you should not create objects from this class directly; retrieve them from SequenceFileDB objects, instead. NOTE: 'self.db' is attached to all instances of this class that come from a particular database by 'classutil.get_bound_subclass'. cCsP||_ti|ƒ|i|iijo td|i|ifƒ‚ndS(Nssequence %s not in db %s(sidsselfs SequenceBases__init__sdbs seqLenDictsKeyError(sselfsdbsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__us  cCs|ii|idSdS(s2Unpack this sequence's length from the seqLenDict.iN(sselfsdbs seqLenDictsid(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__{scCsX|o4y|ii|||ƒSWq;tj oq;Xn|ii|i||ƒSdS(s>Access slice of a sequence efficiently, using seqLenDict info.N( suseCachesselfsdbs strsliceCachesstartsends IndexErrorsstrslicesid(sselfsstartsendsuseCache((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrslices ( s__name__s __module__s__doc__s_FileDBSeqDescriptorsseqs classutils item_reducers __reduce__s__init__s__len__sTruesstrslice(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysFileDBSequencefs     sSequenceFileDBcBsctZdZeZeiiƒZded|iiƒy|ii}Wntj on X|ƒdS(s0close our open shelve index file and _pureseq...N(sselfs seqLenDictscloses_pureseqsdo_closesAttributeError(sselfsdo_close((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysclose³s cCsd|ii|ifSdS(Ns <%s '%s'>(sselfs __class__s__name__sfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__½scCsUti|dƒ}z!tidƒt|||ƒWd|i ƒXti|dƒSdS(s;Create a seqLenDict from 'seqpath' and store in 'dictpath'.sns!Building sequence length index...Nsr( s classutils open_shelvesdictpaths seqLenDictsloggersdebugs_store_seqlen_dictsseqpathsreadersclose(sselfsdictpathsseqpathsreaders seqLenDict((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_create_seqLenDictÀs  cCsy |i}Wn8tj o,|id}t|dƒ}||_nX|i|d}|i ||ƒ|i ||ƒSdS(s>Access slice of a sequence efficiently, using seqLenDict info.s.pureseqsrbiN(sselfs_pureseqsifilesAttributeErrorsfilepathsfullpathsfiles seqLenDictsseqIDsoffsetsseeksstartsreadsend(sselfsseqIDsstartsendsuseCachesifilesoffsetsfullpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrsliceÊs  (s__name__s __module__s__doc__sFileDBSequences itemClasss SequenceDBs _pickleAttrsscopysNones__init__scloses__repr__s_create_seqLenDictsTruesstrslice(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysSequenceFileDBŠs     s BasicSeqInfocBstZdZed„ZRS(s‘Wrapper to provide the correct seqInfoDict-style object information. This boils down to providing id, db, length, and possibly offset. cCsC||_||_|tjot||ƒ|_n ||_dS(N(sseqIDsselfsidsseqDBsdbslengthsNoneslen(sselfsseqIDsseqDBslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__äs    (s__name__s __module__s__doc__sNones__init__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys BasicSeqInfoÝs s _SeqLenObjectcBstZdZd„ZRS(s"Wrapper for use with a seqLenDict cCs0|i|\}|_ti||||ƒdS(N(sseqDBs seqLenDictsseqIDslengthsselfsoffsets BasicSeqInfos__init__(sselfsseqIDsseqDBslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__ðs(s__name__s __module__s__doc__s__init__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys _SeqLenObjectís sBasicSeqInfoDictcBsAtZdZeZd„Zd„Zd„Zd„Zd„Z RS(s—Wrapper around SequenceDB.seqLenDict to provide seqInfoDict behavior. This basic version just gets the length from the sequence object itself. cCs ||_dS(N(sdbsselfsseqDB(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__ûscCs|i||iƒSdS(N(sselfs itemClasssksseqDB(sselfsk((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__þscCst|iiƒSdS(N(slensselfsseqDBs seqLenDict(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__scCst|iiƒSdS(N(sitersselfsseqDBs seqLenDict(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iter__scCs|iiiƒSdS(N(sselfsseqDBs seqLenDictskeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeyss( s__name__s __module__s__doc__s BasicSeqInfos itemClasss__init__s __getitem__s__len__s__iter__skeys(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysBasicSeqInfoDictõs     s_SeqLenDictWrappercBstZdZeZRS(s The default storage mechanism for sequences implemented by FileDBSequence and SequenceFileDB puts everything in seqLenDict, a shelve index of lengths and offsets. This class wraps that dictionary to provide the interface that SequenceDB expects to see. (s__name__s __module__s__doc__s _SeqLenObjects itemClass(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SeqLenDictWrapper s s_SeqLenDictSavercBs tZdZd„Zd„ZRS(s°Support for generic reading functions, called by _store_seqlen_dict. This allows you to specify your own 'reader' function when constructing a FileSequenceDB, e.g. so that you could read something other than FASTA files into a seqLenDict. Pass in this function as the 'reader' kwarg to FileSequenceDB. Custom reader functions should take a file handle and a filename, and return a list of sequence info objects with 'id', 'length', and 'sequence' attributes for each sequence in the given file/filename. _SeqLenDictSaver will then construct a '.pureseq' file containing the concatenated sequences and fill in the seqLenDict appropriately. cCs ||_dS(N(sreadersself(sselfsreader((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__'scCs¸d}t|ddƒ}zx†|i||ƒD]r}|i|f||i <||i7}|it |i ƒjo t d|i |ifƒ‚n|i|i ƒq/WWd|iƒXdS(Nls.pureseqswbs%length does not match sequence: %s,%d(soffsetsfilesfilenames pureseq_fpsselfsreadersifilesoslengthsdsidslenssequences ValueErrorswritesclose(sselfsdsifilesfilenamesosoffsets pureseq_fp((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__call__*s  (s__name__s __module__s__doc__s__init__s__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SeqLenDictSavers  srUcCs[ti}|tj ot|ƒ}nt||ƒ}z||||ƒWd|i ƒXdS(s’Store sequence lengths in a dictionary, e.g. a seqLenDict. Used by SequenceFileDB._create_seqLenDict. The 'reader' function implements a custom sequence format reader; by default, _store_seqlen_dict uses seqfmt.read_fasta_lengths, which reads FASTA-format files. See _SeqLenDictSaver for information on building a custom 'reader', and see the seqdb docs for an example. N( sseqfmtsread_fasta_lengthssbuildersreadersNones_SeqLenDictSaversfilesfilenamesmodesifilesdsclose(sdsfilenamesreadersmodesbuildersifile((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_store_seqlen_dict:s   s_PrefixUnionDictInversecBs)tZdZd„Zd„Zd„ZRS(sëProvide inverse (~) operator behavior for PrefixUnionDicts. This enables ~pud to return a database that, given a sequence object, returns the corresponding key (prefix.id) to retrieve that sequence object in the pud. cCs ||_dS(N(sdbsself(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__`scCs§|i}y|ii|i}Wnetj oYy0|iii|iijotdƒ‚nWnt j onXtdƒ‚nX||ii t |i ƒSdS(Nspthis annotation is not in the PrefixUnion, but its sequence is. You can get that using its 'sequence' attribute.sseq.db not in PrefixUnionDict( sivals pathForwardsseqsselfsdbsdictssprefixsKeyErrors _anno_seqsAttributeErrors separatorsstrsid(sselfsivalsseqsprefix((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__cs cCs8y|ii|iijSWntj o tSnXdS(N(sseqs pathForwardsdbsselfsdictssAttributeErrorsFalse(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __contains__ts(s__name__s __module__s__doc__s__init__s __getitem__s __contains__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_PrefixUnionDictInverseWs   s_PrefixUnionMemberDictcBsAtZdZed„d„Zd„ZeZd„Zd„ZRS(sž @CTB confusing/inappropriate use of a dict interface! keep?? @CTB document. 'd[prefix]=value; d[k] returns value if k is a member of prefix' cCs |iiS(N(sxs pathForwardsdb(sx((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysƒscCs9h|_||_||_|tj o ||_ndS(N(sselfsvaluesspuDicts attrMethods _attrMethodsdefaultsNone(sselfspuDictsdefaults attrMethod((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__‚s     cCs|iiiƒSdS(N(sselfspuDicts prefixDictskeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeysŠscCsH||iijotd|ƒ‚n|ii|}||i| trypaths? s.cCs±|tj o,|otdƒ‚n|tjotii|ƒg}nt|dƒ} zÎt | ƒ}|i ƒi dƒ}h}x |D]˜} | i ƒidƒd \}} y"ti| |ƒ}||ƒ} WnDtj o8x|iƒD]} | iƒqïWtd| ƒ‚qŠX| |||iiƒD]-\}}x|D]}|i||ƒVq#WqWdS(N(sselfs prefixDictsitemsspsdsids format_id(sselfspsdsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iter__.s  cCst|iƒƒSdS(N(slistsselfsiterkeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeys3scCst|ƒSdS(N(sitersself(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysiterkeys6sccsWxP|iiƒD]?\}}x0|iƒD]"\}}|i||ƒ|fVq)WqWdS(N( sselfs prefixDictsitemsspsds iteritemssidsseqs format_id(sselfspsdsseqsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys iteritems9s   cCs)|i}|i|i|i|iSdS(sAFor a given sequence, return a fully qualified name, 'prefix.id'.N(sivals pathForwardsseqsselfsdictssdbs separatorsid(sselfsivalsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysgetName>s cKst||SdS(s&return a new member dictionary (empty)N(s_PrefixUnionMemberDictsselfskwargs(sselfskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys newMemberDictCscCs‹t|dƒ}||iIJx^|iiƒD]M\}}y|d||i fIJWq,t j ot d|ƒ‚q,Xq,W|i ƒdS(s3Save a header file, suitable for later re-creation.sws%s %sseseq db '%s' has no filepath; you may be able to save this to worldbase, but not to a text HeaderFile!N( sfilesfilenamesifilesselfs separators prefixDictsitemssksvsfilepathsAttributeErrorsclose(sselfsfilenamesifilesksv((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyswriteHeaderFileGs  cCs2d}x!|iD]}|t|ƒ7}qW|SdS(Ni(snsselfsdictssdbslen(sselfsdbsn((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__Ts  c Cs¦h}xE|iƒD]7\}} |i|ƒ\}}| |i |hƒ|tj o2d|ii|ii}|i|}|SnXdS(s:Find in or add the given sequence to the inverse of a PUD.suserN( s_PrefixUnionDictInverses __getitem__sselfsseqsAttributeErrorsdbs separators pathForwardsidsnew_ids_(sselfsseqsnew_ids_((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysgetNamews cCs\y|i|ƒSWnDtj o8|ii o‚n|i|7_|i|ƒSnXdS(s)__getitem__ interface that calls getName.N(sselfsgetNamesseqsKeyErrorsdbsaddAll(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__s(s__name__s __module__s__doc__sgetNames __getitem__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_PrefixDictInverseAdderqs  sSeqPrefixUnionDictcBs;tZdZeieƒZed„Zd„Z d„Z RS(sìSeqPrefixUnionDict provides += functionality to add seqs to a PUD. See the __iadd__ method for details. If addAll is True, then looking a sequence up in the inverse db will automatically add it to the PrefixUnionDict. cKsti||||_dS(N(sPrefixUnionDicts__init__sselfskwargssaddAll(sselfsaddAllskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__™scCs–||jo|Snt|dtƒ}|tjot|idtƒ}n|tjoUd|ijotƒ}|i d|ƒn|id}|i||ii <|Sn||i jo|Sny|i i dƒd}Wn™tj ot|dtƒ}|o)tii|ƒ}|i dƒd}ndt|i ƒ}||ijo!tidt ƒtd ƒ‚q~nX|i ||ƒ|Sd S( spAdd a sequence or database to the PUD, with a unique prefix. NOTE: __iadd__ must return self. sdbsusers.iÿÿÿÿsfilepathisnoname%dsv It appears that two different sequence databases are being assigned the same prefix ("%s"). For this reason, the attempted automatic construction of a PrefixUnionDict for you cannot be completed! You should instead construct a PrefixUnionDict that assigns a unique prefix to each sequence database, and supply it directly as the seqDict argument to the NLMSA constructor.s.cannot automatically construct PrefixUnionDictN(sksselfsgetattrsNonesdbs pathForwards prefixDictsKeepUniqueDictsds_add_prefix_dictsidsdictss_persistent_idssplitsnamesAttributeErrorsosspathsbasenameslensloggersdebugs ValueError(sselfsksdsdbsname((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iadd__ s8    cCs||i|<||i|(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__ssblastallf0.001sc Ks2|iƒ} | ||||||||| SdS(s?run blast with the specified parameters, return NLMSA alignmentN( sselfsformatdbsblastmapsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptsskwargs( sselfsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptsskwargssblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysblasts s megablastf9.9999999999999995e-21s -U T -F ms RepeatMaskers-xsmallc  KsTdkl} |iddd| ƒ}|||||||||| | | | SdS(sCrun megablast with the specified parameters, return NLMSA alignment(sMegablastMappingsattrs megablastMapsmapClassN(sblastsMegablastMappingsselfsformatdbsblastmapsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargs(sselfsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargssMegablastMappingsblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys megablast#s    sblastMapcCs~yt||ƒ}WnStj oG|tjodkl}|}n||ƒ}t |||ƒnX|i |ƒ|SdS(sAcreate a blast mapping object if needed, and ensure it is indexed(s BlastMappingN( sgetattrsselfsattrsblastmapsAttributeErrorsmapClasssNonesblasts BlastMappingssetattrsformatdbsfilepath(sselfsfilepathsattrsmapClasss BlastMappingsblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysformatdb.s     ( s__name__s __module__s__doc__s __reduce__sNonesFalses__init__s__repr__sTruesblasts megablastsformatdb(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysBlastDBs   ' s BlastDBXMLRPCc BshtZdZeddddddddddddƒZd„Zd „Zd „Zd „Zd „Z RS( s/XMLRPC server wrapper around a standard BlastDBs getSeqLenis get_strslices getSeqLenDicts get_db_sizes get_seqtypesstrslicecCs0yt||ƒSWntj o dSnXdS(s'get sequence length, or -1 if not foundiÿÿÿÿN(slensselfsidsKeyError(sselfsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys getSeqLenBs cCsLh}x;|iiƒD]*\}}|dt|dƒf||Represents a sequence in a blast database, accessed via XMLRPCcCsS|ii|ƒ|_|idjotd|ƒ‚n||_ti|ƒdS(Nis%s not in this database( sdbsservers getSeqLensidsselfslengthsKeyErrors SequenceBases__init__(sselfsdbsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__bs  cCs[|o4y|ii|||ƒSWq;tj oq;Xn|iii|i ||ƒSdS(s$XMLRPC access to slice of a sequenceN( suseCachesselfsdbs strsliceCachesstartsends IndexErrorsservers get_strslicesid(sselfsstartsendsuseCache((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrsliceis cCs |iSdS(N(sselfslength(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__ss(s__name__s __module__s__doc__s__init__sTruesstrslices__len__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysXMLRPCSequence_s   sXMLRPCSeqLenDescrcBs tZdZd„Zd„ZRS(s>descriptor that returns dictionary of remote server seqLenDictcCs ||_dS(N(sattrsself(sselfsattr((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__zscCsb|iiƒ}x8|iƒD]*\}}|dt|dƒf||y |iSWn,tj o |iiƒ|_|iSnXdS(s9efficient way to determine sequence type of this databaseN(sselfs_seqtypesAttributeErrorsservers get_seqtype(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys _set_seqtype¤s  ( s__name__s __module__s__doc__sXMLRPCSequences itemClasssXMLRPCSeqLenDescrs seqLenDicts__init__s __reduce__s __getstate__s__len__s __contains__s _set_seqtype(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysXMLRPCSequenceDB‡s       (.s__doc__s __future__s generatorsssyssossUserDictsweakrefssequencessqlgraphs classutils annotations AnnotationDBs AnnotationSeqsAnnotationSlicesAnnotationServersAnnotationClientsloggersseqfmtsdbfilesNoSuchFileErrorsobjects_SequenceDBInverses DictMixins SequenceDBs_FileDBSeqDescriptors SequenceBasesFileDBSequencesSequenceFileDBs BasicSeqInfos _SeqLenObjectsBasicSeqInfoDicts_SeqLenDictWrappers_SeqLenDictSaversNones_store_seqlen_dicts_PrefixUnionDictInverses_PrefixUnionMemberDictsPrefixUnionDicts_PrefixDictInverseAddersSeqPrefixUnionDicts_PUDSeqInfoDictsBlastDBs BlastDBXMLRPCsXMLRPCSequencesXMLRPCSeqLenDescrsXMLRPCSequenceDB($s _SeqLenObjects_store_seqlen_dictsAnnotationSlicesNoSuchFileErrors BlastDBXMLRPCsseqfmts_FileDBSeqDescriptors generatorssXMLRPCSequenceDBsloggersBasicSeqInfoDictsXMLRPCSeqLenDescrsBlastDBsSequenceFileDBs_SequenceDBInverses classutilsPrefixUnionDictsXMLRPCSequencesUserDicts_PrefixDictInverseAdderssyss SequenceDBs_SeqLenDictSaversFileDBSequences_PrefixUnionDictInverses_PrefixUnionMemberDicts_SeqLenDictWrappersSeqPrefixUnionDicts BasicSeqInfos_PUDSeqInfoDictsAnnotationServers AnnotationSeqsAnnotationClients AnnotationDBsweakrefsos((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys?ŒsD      %   ª$S $$)ÍO+4#PKñŠ’;Ä3²‰ààpygr/seqdb.pyo;ò |†Kc@s‘dZdklZdkZdkZdkZdkZdkTdkTdk Z dk l Z l Z l Z lZlZdkZdkZdklZdefd„ƒYZdeeifd „ƒYZd efd „ƒYZd efd „ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdeeifd„ƒYZdefd„ƒYZdefd„ƒYZ e!dd„Z"defd„ƒYZ#deeifd„ƒYZ$d eeifd!„ƒYZ%d"e#fd#„ƒYZ&d$e%fd%„ƒYZ'd&eeifd'„ƒYZ(d(efd)„ƒYZ)d*e)fd+„ƒYZ*d,efd-„ƒYZ+d.efd/„ƒYZ,d0efd1„ƒYZ-dS(2sî seqdb contains a set of classes for interacting with sequence databases. Primary sequence database classes: - SequenceDB - base class for sequence databases - SequenceFileDB - file-based sequence database - PrefixUnionDict - container to combine multiple sequence databases - XMLRPCSequenceDB - XML-RPC-accessible sequence database Extensions: - SeqPrefixUnionDict - extends PrefixUnionDict to automatically add seqs - BlastDB - implements NCBI-style name munging for lookups Associated sequence classes: - FileDBSequence - sequence associated with a SequenceFileDB - XMLRPCSequence - sequence associated with a XMLRPCSequenceDB ---- SequenceDB provides some basic behaviors for sequence databases: dictionary behavior, an invert operator interface, and caching for both sequence objects and sequence intervals. It also relies on a 'seqInfoDict' attribute to contain summary information about sequences, so that e.g. slice operations can be done without loading the entire sequence into memory. (See below for more info on seqInfoDict.) SequenceFileDB extends SequenceDB to contain a file-based database of sequences. It constructs a seqLenDict that allows direct on-disk lookup of sequence intervals. (See below for more info on seqLenDict.) PrefixUnionDict provides a unified SequenceDB-like interface to a collection of sequence databases by combining the database name with the sequence ID into a new sequence id. For example, the ID 'genome.chrI' would return the sequence 'chrI' in the 'genome' database. This is particularly handy for situations where you want to have seqdbs of multiple sequence types (DNA, protein, annotations, etc.) all associated together. @CTB document XMLRPCSequenceDB. @CTB document SeqPrefixUnionDict. @CTB document BlastDB. ---- The seqInfoDict interface ------------------------- The seqInfoDict attribute of a SequenceDB is a dictionary-like object, keyed by sequence IDs, with associated values being an information object containing various attributes. seqInfoDict is essentially an optimization that permits other pygr-aware components to access information *about* sequences without actually loading the entire sequence. The only required attribute at the moment is 'length', which is required by some of the NLMSA code. However, seqInfoDict is a good mechanism for the storage of any summary information on a sequence, and so it may be expanded in the future. The seqLenDict interface ------------------------ The seqLenDict attribute is specific to a SequenceFileDB, where it provides a file-backed storage of length and offset sequence metadata. It is used to implement a key optimization in SequenceFileDB, in which a sequence's offset within a file is used to read only the required part of the sequence into memory. This optimization is particularly important for large sequences, e.g. chromosomes, where reading the entire sequence into memory shouldn't be done unless it's necessary. The seqLenDict is keyed by sequence ID and the associated values are a 2-tuple (length, offset), where the offset indicates the byte offset within the '.pureseq' index file created for each SequenceFileDB. get_bound_subclass and the 'self.db' attribute ---------------------------------------------- The SequenceDB constructor calls classutil.get_bound_subclass on its itemClass. What does that do, and what is it for? get_bound_subclass takes an existing class, makes a new subclass of it, binds the variable 'db' to it, and then calls the _init_subclass classmethod (if it exists) on the new class. This has the effect of creating a new class for each SequenceDB instance, tied specifically to that instance and initialized by the _init_subclass method. The main effect of this for SequenceDBs is that for any SequenceDB descendant, the '.db' attribute is automatically set for each Sequence retrieved from the database. CTB: I think this is an optimization? Caching ------- @CTB discuss caching. Pickling sequence databases and sequences ----------------------------------------- @CTB document pickling issues. programmer notes: extending SequenceDB - seqInfoDict, itemclass extending SequenceFileDB - seqLenDict - using your own itemclass - using your own reader doctests & examples ------------------- update docs for these classes! intro: - loading a FASTA file - using a PUD + combining dbs, etc. + inverse Code review issues, short term: - @CTB get_bound_subclass stuff refers directly to itemClass to set 'db'. - @CTB fix 'import *'s - @CTB run lint/checker? - @CTB test _create_seqLenDict - @CTB XMLRPCSequenceDB vs SequenceFileDB Some long term issues: - it should be possible to remove _SeqLenDictSaver and just combine its functionality with _store_seqlen_dict. --titus 3/21/09 (s generatorsN(s*(s AnnotationDBs AnnotationSeqsAnnotationSlicesAnnotationServersAnnotationClient(sNoSuchFileErrors_SequenceDBInversecBs)tZdZd„Zd„Zd„ZRS(sAImplements __inverse__ on SequenceDB objects, returning seq name.cCs ||_dS(N(sdbsself(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__§scCs|iiSdS(N(sseqs pathForwardsid(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__ªscCs5y|ii|ijSWntj o tSnXdS(N(sseqs pathForwardsdbsselfsAttributeErrorsFalse(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __contains__­s(s__name__s __module__s__doc__s__init__s __getitem__s __contains__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SequenceDBInverse¤s   s SequenceDBcBsñtZdZeZeZeiZ ei Z e ddƒZ eieƒZeed„Zd„Zd„ZdZd„Zd„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Z ei!Z"Z#Z$Z%Z&Z'RS(sÏBase class for sequence databases. SequenceDB provides a few basic (base) behaviors: - dict-like interface to sequence objects each with an ID - the ~ (invert) operator returns an 'inverted' database, which is a dict-like object that returns sequence names when given a sequence. - weakref-based automatic flushing of seq objects no longer in use; use autoGC=0 to turn this off. - cacheHint() system for caching a given set of sequence intervals associated with an owner object, which are flushed from cache if the owner object is garbage-collected. For subclassing, note that self.seqInfoDict must be set before SequenceDB.__init__ is called! sautoGCicKs¼|oti|ƒ|_n h|_||_|id|iƒ|_|id|iƒ|_|it jot dƒ‚n|i ƒ}||d(sselfs __class__s__name__s itemClass(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__LscCs|iiƒdS(sEmpty the cache.N(sselfs_weakValueDictsclear(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys clear_cachePs((s__name__s __module__s__doc__sNones itemClasss SeqDBSlicesitemSliceClasss classutilsstandard_getstates __getstate__sstandard_setstates __setstate__sdicts _pickleAttrsslazy_create_inverts_SequenceDBInverses __invert__sTrues__init__s__hash__s _set_seqtypes _cache_maxs cacheHints strsliceCachescloses__iter__s iteritemss__len__s __getitem__skeyss __contains__s__repr__s clear_cachesread_only_errorsclears setdefaultspopspopitemscopysupdate(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys SequenceDB´s.               s_FileDBSeqDescriptorcBstZdZd„ZRS(s7Descriptor to retrieve entire sequence from seqLenDict.cCs+|ii|id}|id|ƒSdS(Ni(sobjsdbs seqLenDictsidslengthsstrslice(sselfsobjsobjtypeslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__get__as(s__name__s __module__s__doc__s__get__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_FileDBSeqDescriptor^s sFileDBSequencecBs>tZdZeƒZeiZd„Zd„Z e d„Z RS(s‡Default sequence object for file-based storage mechanism. See SequenceFileDB for the associated database class. In general, you should not create objects from this class directly; retrieve them from SequenceFileDB objects, instead. NOTE: 'self.db' is attached to all instances of this class that come from a particular database by 'classutil.get_bound_subclass'. cCsP||_ti|ƒ|i|iijo td|i|ifƒ‚ndS(Nssequence %s not in db %s(sidsselfs SequenceBases__init__sdbs seqLenDictsKeyError(sselfsdbsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__us  cCs|ii|idSdS(s2Unpack this sequence's length from the seqLenDict.iN(sselfsdbs seqLenDictsid(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__{scCsX|o4y|ii|||ƒSWq;tj oq;Xn|ii|i||ƒSdS(s>Access slice of a sequence efficiently, using seqLenDict info.N( suseCachesselfsdbs strsliceCachesstartsends IndexErrorsstrslicesid(sselfsstartsendsuseCache((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrslices ( s__name__s __module__s__doc__s_FileDBSeqDescriptorsseqs classutils item_reducers __reduce__s__init__s__len__sTruesstrslice(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysFileDBSequencefs     sSequenceFileDBcBsctZdZeZeiiƒZded|iiƒy|ii}Wntj on X|ƒdS(s0close our open shelve index file and _pureseq...N(sselfs seqLenDictscloses_pureseqsdo_closesAttributeError(sselfsdo_close((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysclose³s cCsd|ii|ifSdS(Ns <%s '%s'>(sselfs __class__s__name__sfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__½scCsUti|dƒ}z!tidƒt|||ƒWd|i ƒXti|dƒSdS(s;Create a seqLenDict from 'seqpath' and store in 'dictpath'.sns!Building sequence length index...Nsr( s classutils open_shelvesdictpaths seqLenDictsloggersdebugs_store_seqlen_dictsseqpathsreadersclose(sselfsdictpathsseqpathsreaders seqLenDict((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_create_seqLenDictÀs  cCsy |i}Wn8tj o,|id}t|dƒ}||_nX|i|d}|i ||ƒ|i ||ƒSdS(s>Access slice of a sequence efficiently, using seqLenDict info.s.pureseqsrbiN(sselfs_pureseqsifilesAttributeErrorsfilepathsfullpathsfiles seqLenDictsseqIDsoffsetsseeksstartsreadsend(sselfsseqIDsstartsendsuseCachesifilesoffsetsfullpath((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrsliceÊs  (s__name__s __module__s__doc__sFileDBSequences itemClasss SequenceDBs _pickleAttrsscopysNones__init__scloses__repr__s_create_seqLenDictsTruesstrslice(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysSequenceFileDBŠs     s BasicSeqInfocBstZdZed„ZRS(s‘Wrapper to provide the correct seqInfoDict-style object information. This boils down to providing id, db, length, and possibly offset. cCsC||_||_|tjot||ƒ|_n ||_dS(N(sseqIDsselfsidsseqDBsdbslengthsNoneslen(sselfsseqIDsseqDBslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__äs    (s__name__s __module__s__doc__sNones__init__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys BasicSeqInfoÝs s _SeqLenObjectcBstZdZd„ZRS(s"Wrapper for use with a seqLenDict cCs0|i|\}|_ti||||ƒdS(N(sseqDBs seqLenDictsseqIDslengthsselfsoffsets BasicSeqInfos__init__(sselfsseqIDsseqDBslength((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__ðs(s__name__s __module__s__doc__s__init__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys _SeqLenObjectís sBasicSeqInfoDictcBsAtZdZeZd„Zd„Zd„Zd„Zd„Z RS(s—Wrapper around SequenceDB.seqLenDict to provide seqInfoDict behavior. This basic version just gets the length from the sequence object itself. cCs ||_dS(N(sdbsselfsseqDB(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__ûscCs|i||iƒSdS(N(sselfs itemClasssksseqDB(sselfsk((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__þscCst|iiƒSdS(N(slensselfsseqDBs seqLenDict(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__scCst|iiƒSdS(N(sitersselfsseqDBs seqLenDict(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iter__scCs|iiiƒSdS(N(sselfsseqDBs seqLenDictskeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeyss( s__name__s __module__s__doc__s BasicSeqInfos itemClasss__init__s __getitem__s__len__s__iter__skeys(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysBasicSeqInfoDictõs     s_SeqLenDictWrappercBstZdZeZRS(s The default storage mechanism for sequences implemented by FileDBSequence and SequenceFileDB puts everything in seqLenDict, a shelve index of lengths and offsets. This class wraps that dictionary to provide the interface that SequenceDB expects to see. (s__name__s __module__s__doc__s _SeqLenObjects itemClass(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SeqLenDictWrapper s s_SeqLenDictSavercBs tZdZd„Zd„ZRS(s°Support for generic reading functions, called by _store_seqlen_dict. This allows you to specify your own 'reader' function when constructing a FileSequenceDB, e.g. so that you could read something other than FASTA files into a seqLenDict. Pass in this function as the 'reader' kwarg to FileSequenceDB. Custom reader functions should take a file handle and a filename, and return a list of sequence info objects with 'id', 'length', and 'sequence' attributes for each sequence in the given file/filename. _SeqLenDictSaver will then construct a '.pureseq' file containing the concatenated sequences and fill in the seqLenDict appropriately. cCs ||_dS(N(sreadersself(sselfsreader((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__'scCs¸d}t|ddƒ}zx†|i||ƒD]r}|i|f||i <||i7}|it |i ƒjo t d|i |ifƒ‚n|i|i ƒq/WWd|iƒXdS(Nls.pureseqswbs%length does not match sequence: %s,%d(soffsetsfilesfilenames pureseq_fpsselfsreadersifilesoslengthsdsidslenssequences ValueErrorswritesclose(sselfsdsifilesfilenamesosoffsets pureseq_fp((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__call__*s  (s__name__s __module__s__doc__s__init__s__call__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_SeqLenDictSavers  srUcCs[ti}|tj ot|ƒ}nt||ƒ}z||||ƒWd|i ƒXdS(s’Store sequence lengths in a dictionary, e.g. a seqLenDict. Used by SequenceFileDB._create_seqLenDict. The 'reader' function implements a custom sequence format reader; by default, _store_seqlen_dict uses seqfmt.read_fasta_lengths, which reads FASTA-format files. See _SeqLenDictSaver for information on building a custom 'reader', and see the seqdb docs for an example. N( sseqfmtsread_fasta_lengthssbuildersreadersNones_SeqLenDictSaversfilesfilenamesmodesifilesdsclose(sdsfilenamesreadersmodesbuildersifile((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_store_seqlen_dict:s   s_PrefixUnionDictInversecBs)tZdZd„Zd„Zd„ZRS(sëProvide inverse (~) operator behavior for PrefixUnionDicts. This enables ~pud to return a database that, given a sequence object, returns the corresponding key (prefix.id) to retrieve that sequence object in the pud. cCs ||_dS(N(sdbsself(sselfsdb((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__`scCs§|i}y|ii|i}Wnetj oYy0|iii|iijotdƒ‚nWnt j onXtdƒ‚nX||ii t |i ƒSdS(Nspthis annotation is not in the PrefixUnion, but its sequence is. You can get that using its 'sequence' attribute.sseq.db not in PrefixUnionDict( sivals pathForwardsseqsselfsdbsdictssprefixsKeyErrors _anno_seqsAttributeErrors separatorsstrsid(sselfsivalsseqsprefix((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__cs cCs8y|ii|iijSWntj o tSnXdS(N(sseqs pathForwardsdbsselfsdictssAttributeErrorsFalse(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __contains__ts(s__name__s __module__s__doc__s__init__s __getitem__s __contains__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_PrefixUnionDictInverseWs   s_PrefixUnionMemberDictcBsAtZdZed„d„Zd„ZeZd„Zd„ZRS(sž @CTB confusing/inappropriate use of a dict interface! keep?? @CTB document. 'd[prefix]=value; d[k] returns value if k is a member of prefix' cCs |iiS(N(sxs pathForwardsdb(sx((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysƒscCs9h|_||_||_|tj o ||_ndS(N(sselfsvaluesspuDicts attrMethods _attrMethodsdefaultsNone(sselfspuDictsdefaults attrMethod((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__‚s     cCs|iiiƒSdS(N(sselfspuDicts prefixDictskeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeysŠscCsH||iijotd|ƒ‚n|ii|}||i| trypaths? s.cCs±|tj o,|otdƒ‚n|tjotii|ƒg}nt|dƒ} zÎt | ƒ}|i ƒi dƒ}h}x |D]˜} | i ƒidƒd \}} y"ti| |ƒ}||ƒ} WnDtj o8x|iƒD]} | iƒqïWtd| ƒ‚qŠX| |||iiƒD]-\}}x|D]}|i||ƒVq#WqWdS(N(sselfs prefixDictsitemsspsdsids format_id(sselfspsdsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iter__.s  cCst|iƒƒSdS(N(slistsselfsiterkeys(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyskeys3scCst|ƒSdS(N(sitersself(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysiterkeys6sccsWxP|iiƒD]?\}}x0|iƒD]"\}}|i||ƒ|fVq)WqWdS(N( sselfs prefixDictsitemsspsds iteritemssidsseqs format_id(sselfspsdsseqsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys iteritems9s   cCs)|i}|i|i|i|iSdS(sAFor a given sequence, return a fully qualified name, 'prefix.id'.N(sivals pathForwardsseqsselfsdictssdbs separatorsid(sselfsivalsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysgetName>s cKst||SdS(s&return a new member dictionary (empty)N(s_PrefixUnionMemberDictsselfskwargs(sselfskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys newMemberDictCscCs‹t|dƒ}||iIJx^|iiƒD]M\}}y|d||i fIJWq,t j ot d|ƒ‚q,Xq,W|i ƒdS(s3Save a header file, suitable for later re-creation.sws%s %sseseq db '%s' has no filepath; you may be able to save this to worldbase, but not to a text HeaderFile!N( sfilesfilenamesifilesselfs separators prefixDictsitemssksvsfilepathsAttributeErrorsclose(sselfsfilenamesifilesksv((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pyswriteHeaderFileGs  cCs2d}x!|iD]}|t|ƒ7}qW|SdS(Ni(snsselfsdictssdbslen(sselfsdbsn((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__Ts  c Cs¦h}xE|iƒD]7\}} |i|ƒ\}}| |i |hƒ|tj o2d|ii|ii}|i|}|SnXdS(s:Find in or add the given sequence to the inverse of a PUD.suserN( s_PrefixUnionDictInverses __getitem__sselfsseqsAttributeErrorsdbs separators pathForwardsidsnew_ids_(sselfsseqsnew_ids_((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysgetNamews cCs\y|i|ƒSWnDtj o8|ii o‚n|i|7_|i|ƒSnXdS(s)__getitem__ interface that calls getName.N(sselfsgetNamesseqsKeyErrorsdbsaddAll(sselfsseq((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys __getitem__s(s__name__s __module__s__doc__sgetNames __getitem__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys_PrefixDictInverseAdderqs  sSeqPrefixUnionDictcBs;tZdZeieƒZed„Zd„Z d„Z RS(sìSeqPrefixUnionDict provides += functionality to add seqs to a PUD. See the __iadd__ method for details. If addAll is True, then looking a sequence up in the inverse db will automatically add it to the PrefixUnionDict. cKsti||||_dS(N(sPrefixUnionDicts__init__sselfskwargssaddAll(sselfsaddAllskwargs((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__™scCs–||jo|Snt|dtƒ}|tjot|idtƒ}n|tjoUd|ijotƒ}|i d|ƒn|id}|i||ii <|Sn||i jo|Sny|i i dƒd}Wn™tj ot|dtƒ}|o)tii|ƒ}|i dƒd}ndt|i ƒ}||ijo!tidt ƒtd ƒ‚q~nX|i ||ƒ|Sd S( spAdd a sequence or database to the PUD, with a unique prefix. NOTE: __iadd__ must return self. sdbsusers.iÿÿÿÿsfilepathisnoname%dsv It appears that two different sequence databases are being assigned the same prefix ("%s"). For this reason, the attempted automatic construction of a PrefixUnionDict for you cannot be completed! You should instead construct a PrefixUnionDict that assigns a unique prefix to each sequence database, and supply it directly as the seqDict argument to the NLMSA constructor.s.cannot automatically construct PrefixUnionDictN(sksselfsgetattrsNonesdbs pathForwards prefixDictsKeepUniqueDictsds_add_prefix_dictsidsdictss_persistent_idssplitsnamesAttributeErrorsosspathsbasenameslensloggersdebugs ValueError(sselfsksdsdbsname((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__iadd__ s8    cCs||i|<||i|(sselfsfilepath(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__repr__ssblastallf0.001sc Ks2|iƒ} | ||||||||| SdS(s?run blast with the specified parameters, return NLMSA alignmentN( sselfsformatdbsblastmapsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptsskwargs( sselfsseqsals blastpaths blastprogsexpmaxsmaxseqsverbosesoptsskwargssblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysblasts s megablastf9.9999999999999995e-21s -U T -F ms RepeatMaskers-xsmallc  KsTdkl} |iddd| ƒ}|||||||||| | | | SdS(sCrun megablast with the specified parameters, return NLMSA alignment(sMegablastMappingsattrs megablastMapsmapClassN(sblastsMegablastMappingsselfsformatdbsblastmapsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargs(sselfsseqsals blastpathsexpmaxsmaxseqs minIdentitysmaskOptssrmPathsrmOptssverbosesoptsskwargssMegablastMappingsblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys megablast#s    sblastMapcCs~yt||ƒ}WnStj oG|tjodkl}|}n||ƒ}t |||ƒnX|i |ƒ|SdS(sAcreate a blast mapping object if needed, and ensure it is indexed(s BlastMappingN( sgetattrsselfsattrsblastmapsAttributeErrorsmapClasssNonesblasts BlastMappingssetattrsformatdbsfilepath(sselfsfilepathsattrsmapClasss BlastMappingsblastmap((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysformatdb.s     ( s__name__s __module__s__doc__s __reduce__sNonesFalses__init__s__repr__sTruesblasts megablastsformatdb(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysBlastDBs   ' s BlastDBXMLRPCc BshtZdZeddddddddddddƒZd„Zd „Zd „Zd „Zd „Z RS( s/XMLRPC server wrapper around a standard BlastDBs getSeqLenis get_strslices getSeqLenDicts get_db_sizes get_seqtypesstrslicecCs0yt||ƒSWntj o dSnXdS(s'get sequence length, or -1 if not foundiÿÿÿÿN(slensselfsidsKeyError(sselfsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys getSeqLenBs cCsLh}x;|iiƒD]*\}}|dt|dƒf||Represents a sequence in a blast database, accessed via XMLRPCcCsS|ii|ƒ|_|idjotd|ƒ‚n||_ti|ƒdS(Nis%s not in this database( sdbsservers getSeqLensidsselfslengthsKeyErrors SequenceBases__init__(sselfsdbsid((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__bs  cCs[|o4y|ii|||ƒSWq;tj oq;Xn|iii|i ||ƒSdS(s$XMLRPC access to slice of a sequenceN( suseCachesselfsdbs strsliceCachesstartsends IndexErrorsservers get_strslicesid(sselfsstartsendsuseCache((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysstrsliceis cCs |iSdS(N(sselfslength(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__len__ss(s__name__s __module__s__doc__s__init__sTruesstrslices__len__(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysXMLRPCSequence_s   sXMLRPCSeqLenDescrcBs tZdZd„Zd„ZRS(s>descriptor that returns dictionary of remote server seqLenDictcCs ||_dS(N(sattrsself(sselfsattr((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys__init__zscCsb|iiƒ}x8|iƒD]*\}}|dt|dƒf||y |iSWn,tj o |iiƒ|_|iSnXdS(s9efficient way to determine sequence type of this databaseN(sselfs_seqtypesAttributeErrorsservers get_seqtype(sself((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys _set_seqtype¤s  ( s__name__s __module__s__doc__sXMLRPCSequences itemClasssXMLRPCSeqLenDescrs seqLenDicts__init__s __reduce__s __getstate__s__len__s __contains__s _set_seqtype(((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pysXMLRPCSequenceDB‡s       (.s__doc__s __future__s generatorsssyssossUserDictsweakrefssequencessqlgraphs classutils annotations AnnotationDBs AnnotationSeqsAnnotationSlicesAnnotationServersAnnotationClientsloggersseqfmtsdbfilesNoSuchFileErrorsobjects_SequenceDBInverses DictMixins SequenceDBs_FileDBSeqDescriptors SequenceBasesFileDBSequencesSequenceFileDBs BasicSeqInfos _SeqLenObjectsBasicSeqInfoDicts_SeqLenDictWrappers_SeqLenDictSaversNones_store_seqlen_dicts_PrefixUnionDictInverses_PrefixUnionMemberDictsPrefixUnionDicts_PrefixDictInverseAddersSeqPrefixUnionDicts_PUDSeqInfoDictsBlastDBs BlastDBXMLRPCsXMLRPCSequencesXMLRPCSeqLenDescrsXMLRPCSequenceDB($s _SeqLenObjects_store_seqlen_dictsAnnotationSlicesNoSuchFileErrors BlastDBXMLRPCsseqfmts_FileDBSeqDescriptors generatorssXMLRPCSequenceDBsloggersBasicSeqInfoDictsXMLRPCSeqLenDescrsBlastDBsSequenceFileDBs_SequenceDBInverses classutilsPrefixUnionDictsXMLRPCSequencesUserDicts_PrefixDictInverseAdderssyss SequenceDBs_SeqLenDictSaversFileDBSequences_PrefixUnionDictInverses_PrefixUnionMemberDicts_SeqLenDictWrappersSeqPrefixUnionDicts BasicSeqInfos_PUDSeqInfoDictsAnnotationServers AnnotationSeqsAnnotationClients AnnotationDBsweakrefsos((s;build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqdb.pys?ŒsD      %   ª$S $$)ÍO+4#PKñŠ’;“Hpygr/seqfmt.pydef __bootstrap__(): global __bootstrap__, __loader__, __file__ import sys, pkg_resources, imp __file__ = pkg_resources.resource_filename(__name__,'seqfmt.so') __loader__ = None; del __bootstrap__, __loader__ imp.load_dynamic(__name__,__file__) __bootstrap__() PKñŠ’;Ð$PPpygr/seqfmt.pyc;ò +,Kc@sd„atƒdS(cCsMdk}dk}dk}|itdƒatabb|i ttƒdS(Ns seqfmt.so( ssyss pkg_resourcessimpsresource_filenames__name__s__file__sNones __loader__s __bootstrap__s load_dynamic(s pkg_resourcesssyssimp((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqfmt.pys __bootstrap__s  N(s __bootstrap__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqfmt.pys?s PKñŠ’;Ð$PPpygr/seqfmt.pyo;ò +,Kc@sd„atƒdS(cCsMdk}dk}dk}|itdƒatabb|i ttƒdS(Ns seqfmt.so( ssyss pkg_resourcessimpsresource_filenames__name__s__file__sNones __loader__s __bootstrap__s load_dynamic(s pkg_resourcesssyssimp((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqfmt.pys __bootstrap__s  N(s __bootstrap__(((s<build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/seqfmt.pys?s PK„Š’;ä_~~pygr/seqfmt.soþíúΘ „__TEXT __text__TEXTÀ´À€__picsymbolstub1__TEXT€@€€ __cstring__TEXTÀ(ÀŒ__DATA  __data__DATA , __dyld__DATA!,!,__la_symbol_ptr__DATA!4ˆ!4"__nl_symbol_ptr__DATA!¼ !¼D__bss__DATA!Ü(8__LINKEDIT0P0N 4F(jÄ/usr/lib/libgcc_s.1.dylib 4J®zÈX /usr/lib/libSystem.B.dylib1 WNä/0 P,,-*M´L04|¦BŸ}ˆ¦|¦}€cx=ŒŒd}‰¦| x=ŒŒ8N€ |¦BŸ}h¦|¦=kk8}i¦N€ |¦¿aÿì||x|@&BŸ-|ž#xè¦|½+xA”!ÿ AŠ€C8BC-žAŽ€^8B^.A’€]8B]?€´@ž<€]8Bÿÿ/‚]@žh€]£ëx; €| ¦| xN€!HX`A’P<_€€B €Až<<_<Ÿ€Bœ8„À€bHµ@Ž@Hl``; ```@Ž ;´€I}>Kx8BI``<_<€B˜‰Až˜€´žAž4<_<Ÿ-ž.€Bœ8„ì€bH5Kÿÿ€```€^8Bÿÿ/‚^@ž €^Ãóx€| ¦| xN€!<<_€B¤‰@žT<žãx€I}ß8`“Á8“Á<“¡@“D€À“aL8€8 8ÀgÛxÈóxÉóxÊóxHHQ|yy&A‚xH!EÓx$Ëx8ÀH‘|zy~à&A‚Œ€À@HÙH|€]£ëx€| ¦| xN€!``AŠ0€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!AŽ0€^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!A’0€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€! A‚<€Y8Bÿÿ/‚Y@ž(€Y#Ëx€| ¦| xN€!```~ø A‚œ€Z8Bÿÿ/‚Z@žˆ€Z8!CÓxaºÁÿØ€}r }q | ¦| x€}p |¦N€ ~à&;@H,;À;`; ;@.M~à&V÷€&W€€]8Bÿÿ/‚]@žþ˜Kÿþt8!a€ºÁÿØ|¦}r }q }p N€ ```|¦¿aÿì8 BŸ8À8àô覔!ÿ <<Ÿ<_?Ÿ8c<8„h8BØ\¬HÍ?ß/ƒ|ix~œAž¸€C<8cD8BIHa<_/ƒ|exb AžŒ€~œ<Ÿ8„PH]/ƒ@œ´Hp```€ž €~8„ÿÿH5}€~€/€Až@€/€AžH1```ƒ¾;Þ/@žÿ´Hp```€\¬88!`<8c`"<_¤€<_»aÿì‘"¨|¦Kÿûœ``?ƒ»Ä8Ä/Až|xKÿÿH`8!`€»aÿì|¦N€ ```|¦¾ÿÀ|ƒ#x|@&BŸ<ÿÿ|¤+xè¦`pA<ß<¿|!n8ÆH88¥ð8á89<@8<9!@Hå;À/ƒAž (a8?<Ÿƒx€K8BK!<€I8BIa@€K8BK;€„€a<9)‘;HE|}y@‚L<_zÛxpÛx8€B"H€<_8,€B"H <_8-€B"H `8€H ­.||x@’P<_8zÛxpÛx€B"<_<_‘"€]8Bÿÿ/‚]@ž ÀH ¤```€]8Bÿÿ/‚]@ž €]£ëx€| ¦| xN€!`ƒãxH=|~xHU/ƒAž0<_; zÛxpÛx€B-™8"<_‘"H €\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!<ŸÃóx8„@H ¥|sy@‚\<€@€c$H í|}y@‚8zÛx<_PÓx8€B"``<_<_‘"H 8`H ‰.||x@’(<_8zÛxpÛx€B"<_Kÿþœ“£ <_|dx€B€bH |~y@‚DM€<_zÛx; pÛx€B8"<_‘"```<_H (€\8Bÿÿ/‚\@ž€\ƒãx€| ¦| xN€!Ãóx8€8 Kÿõ €^8Bÿÿ/‚^@ž€^Ãóx€| ¦| xN€!ƒXKÿþÌ`?߀a@€ž(H |zy@‚ <_zÛxpÛx8 €B"Kÿþ°€[8Bÿÿ/‚[@ž€[cÛx€| ¦| xN€!CÓxH ]/ƒ@ž,<_8!=?pÛx€Bb<_‘iH|<Ÿ8„Kx8BIHü<_8,€B"H8<_8-€B"<_<_‘"HT<_8-€B"<_<_‘"H`€]£ëx€| ¦| xN€!A’t; -™``€\8Bÿÿ/‚\@ž €\ƒãx€| ¦| xN€!`AŽ0€Y8Bÿÿ/‚Y@ž€Y#Ëx€| ¦| xN€!<;À8côKÿîµ€Z8Bÿÿ/‚Z@ž €ZCÓx€| ¦| xN€!`€P8Bÿÿ/‚P@ž €P~ƒx€| ¦| xN€!`€A8"9)ÿÿ/‰‘"@ž€a8€C€| ¦| xN€!€A<"9)ÿÿ/‰‘"@ž€a<€C€| ¦| xN€!€A@"9)ÿÿ/‰‘"@ž€a@€C€| ¦| xN€!€!Ãóxa€ºÿÀ|¦}q }p N€ |¦BŸ}h¦=k|¦…‹¬}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹t}‰¦N€ |¦BŸ}h¦=k|¦…‹X}‰¦N€ |¦BŸ}h¦=k|¦…‹<}‰¦N€ |¦BŸ}h¦=k|¦…‹ }‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹è}‰¦N€ |¦BŸ}h¦=k|¦…‹Ì}‰¦N€ |¦BŸ}h¦=k|¦…‹°}‰¦N€ |¦BŸ}h¦=k|¦…‹”}‰¦N€ |¦BŸ}h¦=k|¦…‹x}‰¦N€ |¦BŸ}h¦=k|¦…‹\}‰¦N€ |¦BŸ}h¦=k|¦…‹@}‰¦N€ |¦BŸ}h¦=k|¦…‹$}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ |¦BŸ}h¦=k|¦…‹ì}‰¦N€ |¦BŸ}h¦=k|¦…‹Ð}‰¦N€ |¦BŸ}h¦=k|¦…‹´}‰¦N€ |¦BŸ}h¦=k|¦…‹˜}‰¦N€ |¦BŸ}h¦=k|¦…‹|}‰¦N€ |¦BŸ}h¦=k|¦…‹`}‰¦N€ |¦BŸ}h¦=k|¦…‹D}‰¦N€ |¦BŸ}h¦=k|¦…‹(}‰¦N€ |¦BŸ}h¦=k|¦…‹ }‰¦N€ |¦BŸ}h¦=k|¦…‹ð}‰¦N€ |¦BŸ}h¦=k|¦…‹Ô}‰¦N€ |¦BŸ}h¦=k|¦…‹¸}‰¦N€ |¦BŸ}h¦=k|¦…‹œ}‰¦N€ |¦BŸ}h¦=k|¦…‹€}‰¦N€ |¦BŸ}h¦=k|¦…‹d}‰¦N€ |¦BŸ}h¦=k|¦…‹H}‰¦N€ |¦BŸ}h¦=k|¦…‹,}‰¦N€ |¦BŸ}h¦=k|¦…‹}‰¦N€ read_fasta_lengthsseqfmt.pyxraise: arg 3 must be a traceback or Noneinstance exception may not have a separate valueraise: exception must be an old-style class or instanceseqfmt__builtin____builtins__pygr.seqfmtdpyfilefilenameOOOpygr.seqfmt.read_fasta_lengths!ð  !ô ˜!ø „!ü x " dunable to create %s.puresequnable to open %ssplitfilenoÀ À Èread seq lengths from python file object, save into dictionary d>wbrج°¸ààÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀ @!$@! @!@!@ ´@ ¬@ ¨@ L@ D@ <@ 4@ ,@ $@ @ @ @ @!¸@!´@!°@!¬@!¨@!¤@! @!œ@!˜@!”@!@!Œ@!ˆ@!„@!€@!|@!x@!t@!p@!l@!h@!d@!`@!\@!X@!T@!P@!L@!H@!D@!@@!<@!8@!4@ ðÀd=dKfL<[€i {!ð‹  •!ô¤ ˜®!ø¹ „Ã!üÎ xØ"ã dí ¨ü À& ÈR! \!f!p!.D_D`D_D`$D_(D`@DaPDbdDdxDeˆDhÀDiØD˜ðDkDnDpDs0DyDDzPD€D‚°DƒÀD„ÄDœØD•ÜDœèD•D‡D˜0D™`DšDœ¬Dš°Dœ´Dš¼DœÀDšÈDœÐDšÜDœàŽ$_¡@_­@_º@_Ä€Ѐ߀õ€1€[€j€ € !€ 2€ K€ \€ u€ †€ ¡€ ²€ Í€ Þ€ õ€ € € /€ @€ Q€ b€ z€ ‹€ ¦€ ·€ Ó€ ä€ € € B€ S€ o€ €€ —€ ¨€ À Þ€ ú€ € € -€ I€ e€ }€ Ž€ §€ ¸€ Ï€ à€ ø€€$€4€D€T€d€t€“€´€Ô€å€õ€€€2€B€R€b€Ë€;€¬€¼€Ì€Ü€ç€õ€R€Ú€õ€€€/€E€U€o€ˆ€š€²€Ä€Þ€ð€ €€<€N€n€‰€§€º€Ý€€€5€H€k€|€€ž€¯€À€Ñ€â€ó€€$ôN.D½DÆ4*!èDÇ@DÈHDÉPDÊ\:!ÜDËhDÌpDÍxDΰDϼDÐðC!äDà 4Dá @Dç TDè `Dé hDë pDì Dí ÀDî ðDï Dð `Dñ €Dð „Dñ ˆDð Dñ ”Dð œDñ ¤Dð °Dñ ¸Dë èDñ Q$½k@½{@¾@¿ @À²@ÁÅ@ÂÙ@Ãê@Äü€€"€@€_€ä€Q€d€u€ˆ€©€Ç€æ€ € 6€"I€"”€"§€"º€"Í€"ë€#€# €$€$)À$*à $$+$N $. 0DE 0DG 8DE <DG @DE HDG TD\ \$,!ìDG dD\ lDG tDH |DG €DH ˆDI ŒDJ DI ˜DJ  $5!àDK ¨DJ ¬DK ´DL ¸D¯ àD° ôD² D³ D® DM @DS HDR LDM TDS `DM dDS hDM lDS pDR tD® €DS  $>$E 0$P$„N ´$Q!. ÀDX ÀDo ÈDX ÌDo ÜDX àDo ìDX ôDo øDY üDo D[ DY DZ Do Dp ,Dt 0Dw 4Dt 8Dp <Dq HDr XDt hDw lDt tDw |DÌ ¤Dà ¸Dx ÐD/ Dy0Dz`D{¤D|ÐD€àDèD‚4DƒlD…pD†ÌD‡øDˆD‰4D@DtD• D–ØDšäD›ìDœDTDž€DŸÀD¡ÄD¢D£<D¤LD¥xD¬ D¶ÄD¹ÌD¶ÐD¹ØD¾èDÁDÂDÁDÂDÆ(DÉ4DÊHDË€D̘DͬDΰDÑ´DÒÌDØøDÙ0DÚDDÜHDÝdDÞDߨDàÔDáìD¡D¢4D÷HD¤XD¥`D§€D¨ŒD§D¨”Dâ¼DãÄDäð$f„PDÛP${„DûDü˜$‰„ DÛ $ž„àDþàDèDðDøDDöD DöD÷ D(D¾8D@DLD`D˜D°DèD ìD#ðD$D*HD,PDÑhDÜ|DÞ D/ÄD0ÜD1 D2PD5`D6D7ÀD8ðD9 D;P$¬$X À$Ü@X$î@X%@X%€Y8%"€Z<%7€[@%N@]%i€%¾@^%Ô@_%ì€`H&€aD&@b&,€&9€&\€&{@c&’@d&ª@e&Á@f&Ó@g&â@h&ñ@i'@j'€'€'-€'C€(é€(ü€)+€)d€)w€)Š€)€)°€)À)ã€*€*#€*;€*f€*w€*ˆ€*›€*¬€*€*Ý@l*ì@m*ü&n!+€+2À À+3@¤+<ÀX+=à¼+>€@+`@ü+lÀ +màà+nàt+o$ ´Nt+p(%!Ü+(&!à+Ž('!ä+¢((!è+¸()!ì+É€+Ú&9  +ì&:!+þ&; „,&< x,"&=!,4&> d,F&?! ,X&@ ˜,j(B!ð,€(C!ô,•(E!ø,¦(F!ü,·(G",È&I ,â&W È-&= ¨--&U!-F€-e€-„€-¤€-À-â€.€.!€.@€.`€.€€.Ÿ€.½€.ã€/,dt0C 0Oþlþzþ†þ–þ¥þ¶þÅþÖþãþ÷þþþ&þ;þMþ[þoþ„þ–þ¨þÀþÒþæþùþþ*þBþQþdþvþˆþ•þ¥¹þÉÕÝåìóú>;L5BFVTR1?=DEM<:2096UJP/8SQ-AGI@C>;L5BFVTR1?=DEM<:2096UJP/8SQ-AGI@C.4K7HN3O__dyld_func_lookupdyld_stub_binding_helper__mh_bundle_header_initseqfmt_PyArg_ParseTupleAndKeywords_PyClass_Type_PyCode_New_PyErr_Occurred_PyErr_Restore_PyErr_SetString_PyExc_IOError_PyExc_TypeError_PyFrame_New_PyImport_AddModule_PyInstance_Type_PyInt_AsLong_PyInt_FromLong_PyLong_FromLongLong_PyModule_GetDict_PyNumber_Add_PyNumber_Remainder_PyObject_CallObject_PyObject_GetAttr_PyObject_GetItem_PyObject_SetAttrString_PyObject_SetItem_PySequence_GetItem_PyString_AsString_PyString_FromString_PyString_FromStringAndSize_PyString_InternInPlace_PyString_Type_PyThreadState_Get_PyTraceBack_Here_PyTraceBack_Type_PyTuple_New_Py_InitModule4__DefaultRuneLocale__Py_NoneStruct___maskrune_fclose_fdopen_fgets_fopen_fputc_strcpydyld__mach_header/Users/administrator/Desktop/pygr-0.8.1/pygr/seqfmt.cgcc2_compiled.:t(0,1)=(0,1)___pyx_string_tab___pyx_n_fileno___pyx_k1___pyx_n_split___pyx_k8___pyx_k3p___pyx_k3___pyx_k4p___pyx_k4___pyx_k6p___pyx_k6___pyx_methods___pyx_f_4pygr_6seqfmt_read_fasta_lengths___pyx_doc_4pygr_6seqfmt_read_fasta_lengths___pyx_k7___pyx_k5___pyx_k2___pyx_filenames___Pyx_Raise__Pyx_Raise:f(0,1)type:P(0,2)value:P(0,2)tb:P(0,2)void:t(0,1):t(0,2)=*(0,3)PyObject:t(0,3)=(0,4)_object:T(0,4)=s8ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;;int:t(0,5)=r(0,5);-2147483648;2147483647;:t(0,6)=*(0,7)_typeobject:T(0,7)=s192ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;ob_size:(0,5),64,32;tp_name:(0,8),96,32;tp_basicsize:(0,5),128,32;tp_itemsize:(0,5),160,32;tp_dealloc:(0,9),192,32;tp_print:(0,11),224,32;tp_getattr:(0,13),256,32;tp_setattr:(0,15),288,32;tp_compare:(0,17),320,32;tp_repr:(0,19),352,32;tp_as_number:(0,21),384,32;tp_as_sequence:(0,22),416,32;tp_as_mapping:(0,23),448,32;tp_hash:(0,24),480,32;tp_call:(0,26),512,32;tp_str:(0,19),544,32;tp_getattro:(0,28),576,32;tp_setattro:(0,30),608,32;tp_as_buffer:(0,32),640,32;tp_flags:(0,33),672,32;tp_doc:(0,8),704,32;tp_traverse:(0,34),736,32;tp_clear:(0,36),768,32;tp_richcompare:(0,38),800,32;tp_weaklistoffset:(0,33),832,32;tp_iter:(0,40),864,32;tp_iternext:(0,41),896,32;tp_methods:(0,42),928,32;tp_members:(0,43),960,32;tp_getset:(0,44),992,32;tp_base:(0,6),1024,32;tp_dict:(0,2),1056,32;tp_descr_get:(0,45),1088,32;tp_descr_set:(0,46),1120,32;tp_dictoffset:(0,33),1152,32;tp_init:(0,47),1184,32;tp_alloc:(0,48),1216,32;tp_new:(0,50),1248,32;tp_free:(0,52),1280,32;tp_is_gc:(0,36),1312,32;tp_bases:(0,2),1344,32;tp_mro:(0,2),1376,32;tp_cache:(0,2),1408,32;tp_subclasses:(0,2),1440,32;tp_weaklist:(0,2),1472,32;tp_del:(0,9),1504,32;;:t(0,8)=*(0,54):t(0,10)=*(0,55)destructor:t(0,9)=(0,10):t(0,12)=*(0,56)printfunc:t(0,11)=(0,12):t(0,14)=*(0,57)getattrfunc:t(0,13)=(0,14):t(0,16)=*(0,58)setattrfunc:t(0,15)=(0,16):t(0,18)=*(0,59)cmpfunc:t(0,17)=(0,18):t(0,20)=*(0,60)reprfunc:t(0,19)=(0,20):t(0,21)=*(0,61):t(0,22)=*(0,62):t(0,23)=*(0,63):t(0,25)=*(0,64)hashfunc:t(0,24)=(0,25):t(0,27)=*(0,65)ternaryfunc:t(0,26)=(0,27):t(0,29)=*(0,66)getattrofunc:t(0,28)=(0,29):t(0,31)=*(0,67)setattrofunc:t(0,30)=(0,31):t(0,32)=*(0,68)long int:t(0,33)=r(0,33);-2147483648;2147483647;:t(0,35)=*(0,69)traverseproc:t(0,34)=(0,35):t(0,37)=*(0,70)inquiry:t(0,36)=(0,37):t(0,39)=*(0,71)richcmpfunc:t(0,38)=(0,39)getiterfunc:t(0,40)=(0,20)iternextfunc:t(0,41)=(0,20):t(0,42)=*(0,72):t(0,43)=*(0,73):t(0,44)=*(0,74)descrgetfunc:t(0,45)=(0,27)descrsetfunc:t(0,46)=(0,31)initproc:t(0,47)=(0,31):t(0,49)=*(0,75)allocfunc:t(0,48)=(0,49):t(0,51)=*(0,76)newfunc:t(0,50)=(0,51):t(0,53)=*(0,77)freefunc:t(0,52)=(0,53)char:t(0,54)=r(0,54);0;127;:t(0,55)=f(0,1):t(0,56)=f(0,5):t(0,57)=f(0,2):t(0,58)=f(0,5):t(0,59)=f(0,5):t(0,60)=f(0,2)PyNumberMethods:t(0,61)=(0,78)PySequenceMethods:t(0,62)=(0,79)PyMappingMethods:t(0,63)=(0,80):t(0,64)=f(0,33):t(0,65)=f(0,2):t(0,66)=f(0,2):t(0,67)=f(0,5)PyBufferProcs:t(0,68)=(0,81):t(0,69)=f(0,5):t(0,70)=f(0,5):t(0,71)=f(0,2)PyMethodDef:T(0,72)=s16ml_name:(0,8),0,32;ml_meth:(0,82),32,32;ml_flags:(0,5),64,32;ml_doc:(0,8),96,32;;PyMemberDef:T(0,73)=s20name:(0,8),0,32;type:(0,5),32,32;offset:(0,5),64,32;flags:(0,5),96,32;doc:(0,8),128,32;;PyGetSetDef:T(0,74)=s20name:(0,8),0,32;get:(0,83),32,32;set:(0,85),64,32;doc:(0,8),96,32;closure:(0,87),128,32;;:t(0,75)=f(0,2):t(0,76)=f(0,2):t(0,77)=f(0,1):T(0,78)=s152nb_add:(0,88),0,32;nb_subtract:(0,88),32,32;nb_multiply:(0,88),64,32;nb_divide:(0,88),96,32;nb_remainder:(0,88),128,32;nb_divmod:(0,88),160,32;nb_power:(0,26),192,32;nb_negative:(0,89),224,32;nb_positive:(0,89),256,32;nb_absolute:(0,89),288,32;nb_nonzero:(0,36),320,32;nb_invert:(0,89),352,32;nb_lshift:(0,88),384,32;nb_rshift:(0,88),416,32;nb_and:(0,88),448,32;nb_xor:(0,88),480,32;nb_or:(0,88),512,32;nb_coerce:(0,90),544,32;nb_int:(0,89),576,32;nb_long:(0,89),608,32;nb_float:(0,89),640,32;nb_oct:(0,89),672,32;nb_hex:(0,89),704,32;nb_inplace_add:(0,88),736,32;nb_inplace_subtract:(0,88),768,32;nb_inplace_multiply:(0,88),800,32;nb_inplace_divide:(0,88),832,32;nb_inplace_remainder:(0,88),864,32;nb_inplace_power:(0,26),896,32;nb_inplace_lshift:(0,88),928,32;nb_inplace_rshift:(0,88),960,32;nb_inplace_and:(0,88),992,32;nb_inplace_xor:(0,88),1024,32;nb_inplace_or:(0,88),1056,32;nb_floor_divide:(0,88),1088,32;nb_true_divide:(0,88),1120,32;nb_inplace_floor_divide:(0,88),1152,32;nb_inplace_true_divide:(0,88),1184,32;;:T(0,79)=s40sq_length:(0,36),0,32;sq_concat:(0,88),32,32;sq_repeat:(0,92),64,32;sq_item:(0,92),96,32;sq_slice:(0,94),128,32;sq_ass_item:(0,96),160,32;sq_ass_slice:(0,98),192,32;sq_contains:(0,100),224,32;sq_inplace_concat:(0,88),256,32;sq_inplace_repeat:(0,92),288,32;;:T(0,80)=s12mp_length:(0,36),0,32;mp_subscript:(0,88),32,32;mp_ass_subscript:(0,101),64,32;;:T(0,81)=s16bf_getreadbuffer:(0,102),0,32;bf_getwritebuffer:(0,104),32,32;bf_getsegcount:(0,105),64,32;bf_getcharbuffer:(0,107),96,32;;PyCFunction:t(0,82)=(0,29):t(0,84)=*(0,109)getter:t(0,83)=(0,84):t(0,86)=*(0,110)setter:t(0,85)=(0,86):t(0,87)=*(0,1)binaryfunc:t(0,88)=(0,29)unaryfunc:t(0,89)=(0,20):t(0,91)=*(0,111)coercion:t(0,90)=(0,91):t(0,93)=*(0,112)intargfunc:t(0,92)=(0,93):t(0,95)=*(0,113)intintargfunc:t(0,94)=(0,95):t(0,97)=*(0,114)intobjargproc:t(0,96)=(0,97):t(0,99)=*(0,115)intintobjargproc:t(0,98)=(0,99)objobjproc:t(0,100)=(0,18)objobjargproc:t(0,101)=(0,31):t(0,103)=*(0,116)getreadbufferproc:t(0,102)=(0,103)getwritebufferproc:t(0,104)=(0,103):t(0,106)=*(0,117)getsegcountproc:t(0,105)=(0,106):t(0,108)=*(0,118)getcharbufferproc:t(0,107)=(0,108):t(0,109)=f(0,2):t(0,110)=f(0,5):t(0,111)=f(0,5):t(0,112)=f(0,2):t(0,113)=f(0,2):t(0,114)=f(0,5):t(0,115)=f(0,5):t(0,116)=f(0,5):t(0,117)=f(0,5):t(0,118)=f(0,5)___Pyx_AddTraceback___pyx_filename___pyx_m___pyx_lineno__Pyx_AddTraceback:f(0,1)funcname:P(0,8)py_srcfile:r(0,2)py_funcname:r(0,2)py_globals:r(0,2)empty_tuple:r(0,2)empty_string:r(0,2)py_code:r(0,119)py_frame:r(0,120):t(0,119)=*(0,121):t(0,120)=*(0,122)PyCodeObject:t(0,121)=(0,123)PyFrameObject:t(0,122)=(0,124):T(0,123)=s64ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;co_argcount:(0,5),64,32;co_nlocals:(0,5),96,32;co_stacksize:(0,5),128,32;co_flags:(0,5),160,32;co_code:(0,2),192,32;co_consts:(0,2),224,32;co_names:(0,2),256,32;co_varnames:(0,2),288,32;co_freevars:(0,2),320,32;co_cellvars:(0,2),352,32;co_filename:(0,2),384,32;co_name:(0,2),416,32;co_firstlineno:(0,5),448,32;co_lnotab:(0,2),480,32;;_frame:T(0,124)=s336ob_refcnt:(0,5),0,32;ob_type:(0,6),32,32;ob_size:(0,5),64,32;f_back:(0,125),96,32;f_code:(0,119),128,32;f_builtins:(0,2),160,32;f_globals:(0,2),192,32;f_locals:(0,2),224,32;f_valuestack:(0,126),256,32;f_stacktop:(0,126),288,32;f_trace:(0,2),320,32;f_exc_type:(0,2),352,32;f_exc_value:(0,2),384,32;f_exc_traceback:(0,2),416,32;f_tstate:(0,127),448,32;f_lasti:(0,5),480,32;f_lineno:(0,5),512,32;f_restricted:(0,5),544,32;f_iblock:(0,5),576,32;f_blockstack:(0,128),608,1920;f_nlocals:(0,5),2528,32;f_ncells:(0,5),2560,32;f_nfreevars:(0,5),2592,32;f_stacksize:(0,5),2624,32;f_localsplus:(0,129),2656,32;;:t(0,125)=*(0,124):t(0,126)=*(0,2):t(0,127)=*(0,130):t(0,128)=ar(0,131);0;19;(0,132):t(0,129)=ar(0,131);0;0;(0,2)PyThreadState:t(0,130)=(0,133)long unsigned int:t(0,131)=r(0,131);0;037777777777;PyTryBlock:t(0,132)=(0,134)_ts:T(0,133)=s84next:(0,135),0,32;interp:(0,136),32,32;frame:(0,125),64,32;recursion_depth:(0,5),96,32;tracing:(0,5),128,32;use_tracing:(0,5),160,32;c_profilefunc:(0,137),192,32;c_tracefunc:(0,137),224,32;c_profileobj:(0,2),256,32;c_traceobj:(0,2),288,32;curexc_type:(0,2),320,32;curexc_value:(0,2),352,32;curexc_traceback:(0,2),384,32;exc_type:(0,2),416,32;exc_value:(0,2),448,32;exc_traceback:(0,2),480,32;dict:(0,2),512,32;tick_counter:(0,5),544,32;gilstate_counter:(0,5),576,32;async_exc:(0,2),608,32;thread_id:(0,33),640,32;;:T(0,134)=s12b_type:(0,5),0,32;b_handler:(0,5),32,32;b_level:(0,5),64,32;;:t(0,135)=*(0,133):t(0,136)=*(0,139):t(0,138)=*(0,140)Py_tracefunc:t(0,137)=(0,138)PyInterpreterState:t(0,139)=(0,141):t(0,140)=f(0,5)_is:T(0,141)=s36next:(0,142),0,32;tstate_head:(0,135),32,32;modules:(0,2),64,32;sysdict:(0,2),96,32;builtins:(0,2),128,32;codec_search_path:(0,2),160,32;codec_search_cache:(0,2),192,32;codec_error_registry:(0,2),224,32;dlopenflags:(0,5),256,32;;:t(0,142)=*(0,141)___pyx_f___pyx_binitseqfmt:F(0,1)___pyx_argnames.6809/usr/include/ctype.hpygr/seqfmt.c/usr/include/ctype.hpygr/seqfmt.c__pyx_f_4pygr_6seqfmt_read_fasta_lengths:f(0,2)__pyx_self:P(0,2)__pyx_args:P(0,2)__pyx_kwds:P(0,2)__pyx_v_d:(0,2)__pyx_v_pyfile:(0,2)__pyx_v_filename:(0,2)__pyx_v_seqLength:r(0,143)long long int:t(0,143)=@s64;r(0,143);01000000000000000000000;0777777777777777777777;__pyx_v_ipos:r(0,143)__pyx_v_offset:r(0,143)__pyx_v_tmp:(0,144)__pyx_v_fastastart:(0,145)__pyx_v_p:r(0,8)char:t(0,54):t(0,144)=ar(0,131);0;32767;(0,54):t(0,145)=ar(0,131);0;3;(0,54)__pyx_v_ifile:r(0,146)__pyx_v_ifile2:r(0,146)__pyx_v_outfile:r(0,2)__pyx_v_id:r(0,2)__pyx_r:r(0,2)__pyx_1:r(0,2)__pyx_2:r(0,2)__pyx_3:r(0,5)int:t(0,5):t(0,146)=*(0,147)FILE:t(0,147)=(0,148)__sFILE:T(0,148)=s88_p:(0,149),0,32;_r:(0,5),32,32;_w:(0,5),64,32;_flags:(0,150),96,16;_file:(0,150),112,16;_bf:(0,151),128,64;_lbfsize:(0,5),192,32;_cookie:(0,87),224,32;_close:(0,152),256,32;_read:(0,153),288,32;_seek:(0,154),320,32;_write:(0,155),352,32;_ub:(0,151),384,64;_extra:(0,156),448,32;_ur:(0,5),480,32;_ubuf:(0,157),512,24;_nbuf:(0,158),536,8;_lb:(0,151),544,64;_blksize:(0,5),608,32;_offset:(0,159),640,64;;:t(0,149)=*(0,161)short int:t(0,150)=@s16;r(0,150);-32768;32767;__sbuf:T(0,151)=s8_base:(0,149),0,32;_size:(0,5),32,32;;:t(0,152)=*(0,162):t(0,153)=*(0,163):t(0,154)=*(0,164):t(0,155)=*(0,165):t(0,156)=*(0,166):t(0,157)=ar(0,131);0;2;(0,161):t(0,158)=ar(0,131);0;0;(0,161)__darwin_off_t:t(0,160)=(0,167)fpos_t:t(0,159)=(0,160)unsigned char:t(0,161)=@s8;r(0,161);0;255;:t(0,162)=f(0,5):t(0,163)=f(0,5):t(0,164)=f(0,159):t(0,165)=f(0,5):t(0,166)=xs__sFILEX:__int64_t:t(0,167)=(0,143)__pyx_5:r(0,2)__pyx_6:r(0,54)__pyx_argnames:V(0,168):t(0,168)=ar(0,131);0;3;(0,8)j:r(0,2)__darwin_ct_rune_t:t(0,169)=(0,5)_c:r(0,169)__pyx_m:S(0,2)__pyx_b:S(0,2)__pyx_lineno:S(0,5)__pyx_filename:S(0,8)__pyx_f:S(0,170):t(0,170)=*(0,8)__pyx_k1:S(0,171)__pyx_k2:S(0,172)__pyx_k3:S(0,173)__pyx_k4:S(0,174)__pyx_k5:S(0,175)__pyx_k6:S(0,176)__pyx_k7:S(0,177)__pyx_k8:S(0,178)__pyx_n_fileno:S(0,2)__pyx_n_split:S(0,2)__pyx_k3p:S(0,2)__pyx_k4p:S(0,2)__pyx_k6p:S(0,2)__pyx_string_tab:S(0,179)__pyx_doc_4pygr_6seqfmt_read_fasta_lengths:S(0,180)__pyx_methods:S(0,181)__pyx_filenames:S(0,182):t(0,171)=ar(0,131);0;6;(0,54):t(0,172)=ar(0,131);0;1;(0,54):t(0,173)=ar(0,131);0;17;(0,54):t(0,174)=ar(0,131);0;8;(0,54):t(0,175)=ar(0,131);0;2;(0,54):t(0,176)=ar(0,131);0;19;(0,54):t(0,177)=ar(0,131);0;1;(0,54):t(0,178)=ar(0,131);0;5;(0,54):t(0,179)=ar(0,131);0;5;(0,183):t(0,180)=ar(0,131);0;64;(0,54):t(0,181)=ar(0,131);0;1;(0,72):t(0,182)=ar(0,131);0;0;(0,8)__Pyx_StringTabEntry:t(0,183)=(0,184):T(0,184)=s16p:(0,126),0,32;i:(0,5),32,32;s:(0,8),64,32;n:(0,33),96,32;;PKd—~;iÍ*bë€ë€pygr/sequence.py from __future__ import generators import types from sequtil import * NOT_ON_SAME_PATH = -2 class ReadOnlyAttribute(object): def __init__(self, attr): self.attr = attr def __get__(self, obj, klass): return getattr(obj, self.attr) ################################################################### # # INTERVAL - INTERVAL MAPPING # CORRECTLY HANDLES SCALING AND ORIENTATION TRANSFORMATIONS # ASSUMES A SIMPLE SCALAR TRANSFORMATION FROM ONE COORD SYSTEM # TO THE OTHER. DOES NOT HANDLE INDELS WITHIN THE MAPPING! class IntervalTransform(object): "Represents coordinate transformation from one interval to another" srcPath=ReadOnlyAttribute('_srcPath') # PREVENT USER FROM MODIFYING THESE! destPath=ReadOnlyAttribute('_destPath') def __init__(self, srcPath, destPath, edgeInfo=None, edgeAttr=None, edgeIndex=None): "MAP FROM srcPath -> destPath" self.scale = len(destPath) / float(len(srcPath)) self._srcPath = srcPath self._destPath = destPath if edgeInfo != None and edgeAttr != None: try: # GET EDGE INFO IF PRESENT edgeInfo = getattr(edgeInfo, edgeAttr) except AttributeError: edgeInfo = None if edgeInfo != None: if edgeIndex != None: edgeInfo = edgeInfo[edgeIndex] self.edgeInfo = edgeInfo def xform(self, i): 'transform int srcPath local coord to destPath local coord' return int(i * self.scale) def xformBack(self, i): 'transform int destPath local coord to srcPath local coord' return int(i / self.scale) def getStartStop(self, srcPath, ourPath): 'compute srcPath start,stop in ourPath local coords' if srcPath.path is ourPath.path: return srcPath.start - ourPath.start, srcPath.stop - ourPath.start try: if srcPath.path._reverse is ourPath.path: return -(srcPath.start) - ourPath.start,\ -(srcPath.stop) - ourPath.start except AttributeError: pass raise ValueError('sequence mismatch: argument not from this seq') def __call__(self, srcPath): """Apply this transformation to an interval NB: it is not restricted to the domain of this transform, and thus can extend BEYOND the boundaries of this transform. If you want it clipped use [] interface instead of ().""" start, stop = self.getStartStop(srcPath, self.srcPath) return SeqPath(self.destPath, self.xform(start), self.xform(stop), relativeToStart=True) def reverse(self, destPath): "reverse transform an interval" start, stop = self.getStartStop(destPath, self.destPath) return SeqPath(self.srcPath, self.xformBack(start), self.xformBack(stop), relativeToStart=True) def __getitem__(self, srcPath): # PROVIDE DICT-LIKE INTERFACE """intersect srcPath with domain of this transform, then return transform to target domain coordinates""" return self(srcPath * self.srcPath) def __iter__(self): yield self.srcPath def items(self): yield self.srcPath, self.destPath def __getattr__(self, attr): "provide transparent wrapper for edgeInfo attributes" try: return getattr(self.__dict__['edgeInfo'], attr) except (KeyError, AttributeError): # RAISE EXCEPTION IF NOT FOUND! raise AttributeError('neither IntervalTransform nor edgeinfo \ has attr ' + attr) def repr_dict(self): "Return compact dictionary representing this interval mapping" s = self.srcPath.repr_dict() # GET REPR OF BOTH INTERVALS d = self.destPath.repr_dict() out= {} for k, val in s.items(): # ADD PREFIX TO EACH ATTR out['src_' + k] = val out['dest_' + k] = d[k] try: e = self.edgeInfo.repr_dict() # GET EDGE INFO IF PRESENT except AttributeError: pass else: out.update(e) # SAVE EDGE INFO DATA return out def nidentity(self): "calculate total #identity matches between srcPath and destPath" nid = 0 src = str(self.srcPath).upper() dest = str(self.destPath).upper() slen = len(src) i = 0 while i < slen: if src[i] == dest[i]: nid += 1 i += 1 return nid def percent_id(self): "calculate fractional identity for this pairwise alignment" return self.nidentity / float(len(self.srcPath)) ################################################################### # # SINGLE LETTER GRAPH INTERFACE CLASSES # INSTANTIATED ON THE FLY TO PROVIDE LETTER GRAPH INTERFACE class LetterEdgeDescriptor(object): "cached dict of sequences traversing this edge" def __get__(self, edge, objtype): try: return edge._seqs except AttributeError: edge._seqs = edge.origin.getEdgeSeqs(edge.target) return edge._seqs class LetterEdge(object): "represents an edge from origin -> target. seqs returns its sequences" seqs = LetterEdgeDescriptor() def __init__(self, origin, target): self.origin = origin self.target = target def __iter__(self): 'generate origin seqpos for sequences that traverse this edge' for seq in self.seqs: # Reduce 1:many schema to 1:1, discard edge information. yield self.origin.getSeqPos(seq) def iteritems(self): 'generate origin,target seqpos for sequences that traverse this edge' for seq in self.seqs: # REDUCE 1:MANY SCHEMA TO 1:1, DISCARD EDGE INFO yield self.origin.getSeqPos(seq), self.target.getSeqPos(seq) def __getitem__(self, k): '''return origin,target seqpos for sequence k; raise KeyError if not in this edge''' try: k = k.path except AttributeError: raise TypeError('k not a valid sequence: it has no path attribute') return (self.origin.getSeqPos(k.path), self.target.getSeqPos(k.path)) def __cmp__(self, other): 'two edge objects match if they link identical nodes' try: if self.origin == other.origin and self.target == other.target: return 0 # REPORT A MATCH except AttributeError: # other MUST BE A DIFFERENT TYPE, SO NO MATCH pass return cmp(id(self), id(other)) def absoluteSlice(seq, start, stop): '''get slice of top-level sequence object, in absolute coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForward''' try: if start < 0: # REVERSE ORIENTATION return -(seq.pathForward[-stop:-start]) else: # FORWARD ORIENTATION return seq.pathForward[start:stop] except AttributeError: if seq is None: return slice(start, stop) def relativeSlice(seq, start, stop): '''get slice of this sequence object, in relative coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForward''' if start < 0: # REVERSE ORIENTATION return -(seq[-stop: -start]) else: # FORWARD ORIENTATION return seq[start: stop] def sumSliceIndex(i, myslice, relativeToStart): '''Adjust index value either relative to myslice.start (positive indexes) or relative to myslice.stop (negative indexes). Handle the case where i is None or myslice is None appropriately. ''' if myslice is None: # NO OBJECT, SO NOTHING TO DO... return i if i is None: i = 0 i *= myslice.step if relativeToStart: return i + myslice.start else: return i + myslice.stop class SeqOriDescriptor(object): "Get orientation of sequence interval" def __get__(self, seq, objtype): if seq.start >= 0: return 1 # FORWARD ORIENTATION else: return -1 # REVERSE ORIENTATION class PathForwardDescr(object): 'get the top-level forward sequence object' def __get__(self, seq, objtype): if seq.orientation > 0: return seq.path else: return seq.path._reverse class AbsIntervalDescr(object): 'get the top-level forward sequence object' def __get__(self, seq, objtype): if seq.orientation > 0: return seq.start, seq.stop else: return -(seq.stop), -(seq.start) class SeqPath(object): '''Base class for specifying a path, ie. sequence interval. This implementation takes a sequence object as initializer and simply represents the interval as a slice of the sequence.''' orientation=SeqOriDescriptor() # COMPUTE ORIENTATION AUTOMATICALLY pathForward=PathForwardDescr() # GET THE TOP-LEVEL FORWARD SEQUENCE OBJ _abs_interval=AbsIntervalDescr() def __init__(self, path, start=0, stop=None, step=None, reversePath=False, relativeToStart=False, absoluteCoords=False): '''Return slice of path[start:stop:step]. NB: start>stop means reverse orientation, i.e. (-path)[-stop:-start] start/stop are LOCAL coordinates relative to the specified path By default, start/stop are interpreted in the usual Python slicing way, i.e. a negative start value is interpreted as len(path)-start. The relativeToStart option turns off this behavior, so that negative values are interpreted as negative coordinates in the local coordinate system of path. absoluteCoords option allows intervals to be created using Pygr's internal coordinate convention i.e. -20,-10 --> -(path.pathForward[10:20]) ''' if reversePath: # create top-level negative orientation path start = -(path.stop) stop = 0 self._reverse = path path = None # make this a top-level path object if absoluteCoords: # THIS OPTION PROVIDES TRANSPARENT WAY TO CREATE if start >= 0: # INTERVALS USING start,stop PAIRS THAT FOLLOW path = path.pathForward # OUR INTERNAL SIGN CONVENTION else: # i.e. start<0 MEANS REVERSE ORIENTATION! path = - (path.pathForward) else: # ADJUST start,stop ACCORDING TO path.start / path.stop start = sumSliceIndex(start, path, relativeToStart or start is None or start>=0) stop = sumSliceIndex(stop, path, relativeToStart or (stop is not None and stop>=0)) if start is not None and stop is not None and start>stop: start = -start # start>stop MEANS REVERSE ORIENTATION! stop = -stop if path is not None: path = -path if path is not None: # perform bounds checking if start < path.path.start: start = path.path.start if stop > path.path.stop: stop = path.path.stop if start is None or stop is None or start>=stop: raise IndexError('cannot create empty sequence interval!') self.start = start self.stop = stop if step is None: step = 1 if path is None: self.path = self self.step = step else: # STORE TOP-LEVEL SEQUENCE PATH... self.path = path.path self.step = step * path.step def classySlice(self, path, *l, **kwargs): 'create a subslice using appropriate class based on container' try: # if db provides a class to use for slices, use it. klass = path.pathForward.db.itemSliceClass except AttributeError: klass = SeqPath # default: just use generic slice class return klass(path, *l, **kwargs) # construct the slice def absolute_slice(self, start, stop): 'get slice of top-level sequence, using absolute coords' return self.classySlice(self, start, stop, absoluteCoords=True) def __getitem__(self, k): if isinstance(k, types.IntType): if k == -1: # HAVE TO HANDLE THIS CASE SPECIALLY k = slice(k, None, 1) # -1 IS LAST LETTER, SO [-1:None] slice else: # REGULAR CASE, JUST [k:k+1] slice k = slice(k, k + 1, 1) if isinstance(k, types.SliceType): # GET AN INTERVAL USING slice return self.classySlice(self, k.start, k.stop, k.step) elif isinstance(k, SeqPath): # MODEL SEQ AS GRAPH if k.path is not self.path: raise KeyError('node is not in this sequence!') try: target = self.classySlice(self.path, k.stop, k.stop + len(k) * k.step, k.step) return {target: LetterEdge(k, target)} except IndexError: # OUT OF BOUNDS, SO NO NEXT NODE return {} raise KeyError('requires a slice object or integer key') def __len__(self): if self.path is self and self.orientation < 0: return len(self._reverse) # GET LENGTH FROM FORWARD SEQUENCE # Get the number of results from iter(self). d = (self.stop - self.start) / self.step if d > 0: # IF stop - start < step, d WILL BE ZERO -- PREVENT THAT! return d else: # Never return 0 length... Bounds checking ensures non-empty ival. return 1 ################################ LETTER GRAPH METHODS: JUST A LINEAR GRAPH def __iter__(self): for i in range(len(self)): yield self[i] def iteritems(self): 'letter graph iterator over (node1, {node2: edge}) tuples' src = self[0] # GET 1ST LETTER for i in range(1, len(self)): # ITERATE OVER ALL ADJACENT PAIRS target = self[i] yield src, {target: LetterEdge(src, target)} src = target yield src, {} # LAST LETTER HAS NO EDGES def getEdgeSeqs(self, other): 'return dict of sequences that traverse edge from self -> other' if self.path is other.path and self.stop == other.start: return {self.path: self.stop - self.step} else: return {} def getSeqPos(self, seq): 'get seq interval corresponding to this node in sequence graph' if seq.path is self.path: return self raise KeyError('seq not on this path!') ################################ INTERVAL COMPOSITION OPERATORS def __hash__(self): 'ensure that same seq intervals match in dict' return id(self.path)^hash(self.start)^hash(self.stop) def __cmp__(self, other): 'ensure that same seq intervals match in cmp()' if not isinstance(other, SeqPath): return -1 if self.path is other.path: return cmp((self.start, self.stop), (other.start, other.stop)) else: return NOT_ON_SAME_PATH #raise TypeError('SeqPath not comparable, not on same path: %s, %s' # % (self.path, other.path)) def __contains__(self, k): # PUT OTHER LOGIC HERE FOR CHECKING WHETHER INTERVAL IS CONTAINED... if isinstance(k, SeqPath): if k.path == self.path and self.start <= k.start and \ k.stop <= self.stop: return True else: return False elif isinstance(k, types.IntType): return self.start <= k and k < self.stop def overlaps(self, p): "check whether two paths on same seq overlap" if self.path is not p.path: return False if (self.start <= p.start and p.start < self.stop) or \ (p.start <= self.start and self.start < p.stop): return True else: return False def __mul__(self, other): "find intersection of two intervals" if isinstance(other, SeqPath): if self.path is not other.path: return None start=max(self.start, other.start) stop=min(self.stop, other.stop) if start < stop: if stop == 0: # Have to handle the boundary case specially because of # Python conventions. stop = None return self.classySlice(self.path, start, stop) else: return None else: raise TypeError('SeqPath can only intersect SeqPath') def __div__(self, other): "return transform from other -> self coordinate systems" return IntervalTransform(other, self) def __neg__(self): "return same interval in reverse orientation" try: if self.seqtype() == PROTEIN_SEQTYPE: raise ValueError('protein sequence has no reverse \ orientation!') except AttributeError: pass # ALLOW UNTYPED SEQ OBJECTS TO BE REV-COMPD if self is self.path: # TOP-LEVEL SEQUENCE OBJECT try: return self._reverse # USE EXISTING RC OBJECT FOR THIS SEQ except AttributeError: # CREATE ONLY ONE RC FOR THIS SEQUENCE self._reverse = self.classySlice(self, reversePath=True) return self._reverse elif self.orientation > 0: # FORWARD ORI: JUST REVERSE INDICES return self.classySlice(self.path, self.stop, self.start, self.step) #SWAP ==> RC else: # REVERSE ORI: BECAUSE OF stop=0 POSSIBILITY, USE POSITIVE COORDS return self.classySlice(self.path._reverse, -(self.stop), -(self.start), self.step) def __add__(self, other): "return merged interval spanning both self and other intervals" if self.path is not other.path: raise ValueError('incompatible intervals cannot be merged.') if self.start < other.start: start = self.start else: start = other.start if self.stop > other.stop: stop = self.stop else: stop = other.stop if stop == 0: # Have to handle the boundary case specially because of Python # conventions. stop = None return self.classySlice(self.path, start, stop, self.step) def __iadd__(self, other): "return merged interval spanning both self and other intervals" if self.path is not other.path: raise ValueError('incompatible intervals cannot be merged.') if other.start < self.start: self.start = other.start if other.stop > self.stop: self.stop = other.stop return self # iadd MUST ALWAYS RETURN self!! def before(self): 'get the sequence interval before this interval' return self.classySlice(self.path, None, self.start) def after(self): 'get the sequence interval after this interval' if self.stop == 0: raise IndexError('cannot create empty sequence interval') return self.classySlice(self.path, self.stop, None) def is_full_length(self): '''test whether this constitutes the whole sequence (in either orientation)''' return self == self.path ############################################ STRING SEQUENCE METHODS _complement = {'a': 't', 'c': 'g', 'g': 'c', 't': 'a', 'u': 'a', 'n': 'n', 'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A', 'U': 'A', 'N': 'N'} def reverse_complement(self, s): 'get reverse complement of a string s' #return ''.join([self._complement.get(c, c) for c in s[::-1]]) return ''.join([self._complement.get(s[i], s[i]) for i in range(len(s) -1, -1, -1)]) def seqtype(self): "Get the sequence type for this sequence" path = self.pathForward try: # TRY GETTING IT FROM TOP-LEVEL SEQUENCE OBJECT? return path._seqtype except AttributeError: try: # TRY TO GET IT FROM DB THIS SEQ IS ASSOCIATED WITH, IF ANY return path.db._seqtype except AttributeError:# GUESS IT FROM 1ST 40 LETTERS OF SEQUENCE path._seqtype = guess_seqtype(str(self[0:40])) return path._seqtype def __str__(self): '''string for this sequence interval; use reverse complement if necessary...''' if self.orientation > 0: return self.path.strslice(self.start, self.stop) else: s = self.path._reverse.strslice(-(self.stop), -(self.start)) return self.reverse_complement(s) def __repr__(self): try: # USE id CONVENTION TO GET A NAME FOR THIS SEQUENCE id = self.pathForward.id except AttributeError: # OTHERWISE USE A DEFAULT, SHOWING THERE'S NO id id = '@NONAME' if self.orientation < 0: # INDICATE NEGATIVE ORIENTATION return '-%s[%d:%d]' % (id, -self.stop, -self.start) else: return '%s[%d:%d]' % (id, self.start, self.stop) def repr_dict(self): "Return compact dictionary representing this interval" try: id = self.path.id except AttributeError: id = self.id return {'id': id, 'start': self.start, 'end': self.stop, 'ori': self.orientation} class LengthDescriptor(object): 'property that just returns length of object' def __get__(self, seq, klass): return len(seq) # BASIC WRAPPER FOR A SEQUENCE. LETS US ATTACH A NAME TO IT... class SequenceBase(SeqPath): '''base sequence type assumes there will be a seq attribute providing sequence''' start = 0 stop = LengthDescriptor() step = 1 orientation = 1 def __init__(self): self.path = self def update(self, seq): 'change this sequence to the string ' self.seq = seq def __len__(self): 'default: get the whole self.seq and compute its length' return len(self.seq) # COMPUTE IT FROM THE SEQUENCE def strslice(self, start, stop): 'default method assumes self.seq is a sliceable string' return self.seq[start:stop] class Sequence(SequenceBase): 'default sequence class initialized with a sequence string and ID' def __init__(self, s, id): SequenceBase.__init__(self) self.id = id self.seq = s class SeqFilterDict(dict): '''stores a set of intervals, either on init or via self[ival]=junk; self[ival] returns intersection of ival and the overlapping interval in self if any; otherwise raise KeyError''' def __init__(self, l=[]): 'accepts optional arg giving list of intervals' dict.__init__(self) for ival in l: self[ival] = None def __getitem__(self, k): try: ival = dict.__getitem__(self, k.path) except KeyError: raise KeyError('seq not in dict') result = k * ival # RETURN INTERSECTION OF IVALS if result is None: raise KeyError # PROPER WAY TO SIGNAL KEY MAPS TO NO VALUE return result def __setitem__(self, ival, junk): dict.__setitem__(self, ival.path, ival) def __iter__(self): return dict.itervalues(self) ## ## ## class S2SEEdgesDescriptor(object): ## "list of interval matches as list of tuples (ival1, ival2, xform)" ## def __get__(self, s2se, objtype): ## return [(t.srcPath, t.destPath, t) for t in s2se.matches] class Seq2SeqEdge(object): '''Maps two sequence regions onto each other, using a list of scalar transformations. Can handle indels within the mapping.''' #edges = S2SEEdgesDescriptor() def __init__(self, msaSlice, targetPath, sourcePath=None, matchIntervals=False): self.msaSlice = msaSlice self.targetPath = targetPath if sourcePath is not None: self.sourcePath = sourcePath self.matchIntervals = matchIntervals else: # NEED TO REVERSE-MAP targetPath TO FIND sourcePath # Mask to targetPath. si = msaSlice.groupByIntervals(filterList = [targetPath], mergeAll=True) l = msaSlice.groupBySequences(si) try: self.sourcePath = l[0][0] except IndexError: raise KeyError('target interval not in msaSlice!') self.matchIntervals = l[0][2] def items(self, mergeAll=False, **kwargs): 'get list of (srcPath, destPath) 1:1 matches' if self.matchIntervals is None: # THIS IS ALREADY A 1:1 INTERVAL! return [(self.sourcePath, self.targetPath)] elif self.matchIntervals is False: raise ValueError('no matchIntervals information!') l = [] # USE STORED LIST OF 1:1 INTERVALS for srcStart, srcEnd, destStart, destEnd in self.matchIntervals: l.append((absoluteSlice(self.sourcePath, srcStart, srcEnd), absoluteSlice(self.targetPath, destStart, destEnd))) return l def get_gaps(self): 'return list of (srcIval,destIval) representing gaps / insertions' if self.matchIntervals is False: raise ValueError('no matchIntervals information!') elif self.matchIntervals is None or len(self.matchIntervals) < 2: return [] # no gaps here... srcLast = self.matchIntervals[0][1] # ends of 1st aligned intervals destLast = self.matchIntervals[0][3] l = [] for t in self.matchIntervals[1:]: if t[0] > srcLast: # gap region srcIval = absoluteSlice(self.sourcePath, srcLast, t[0]) else: srcIval = None if t[2] > destLast: # insertion region destIval = absoluteSlice(self.targetPath, destLast, t[2]) else: destIval = None if srcIval is not None or destIval is not None: l.append((srcIval, destIval)) srcLast = t[1] # ends of these aligned intervals destLast = t[3] return l def __iter__(self, sourceOnly=True, **kwargs): return iter([t[0] for t in self.items(sourceOnly=sourceOnly, **kwargs)]) def length(self, mode=max): 'get length of source vs. target interval according to mode' return mode(len(self.sourcePath), len(self.targetPath)) def pIdentity(self, mode=max, trapOverflow=True): "calculate fractional identity for this pairwise alignment" nid = 0 start1 = self.sourcePath.start s1 = str(self.sourcePath).upper() start2 = self.targetPath.start s2 = str(self.targetPath).upper() for srcPath, destPath in self.items(): isrc = srcPath.start - start1 idest = destPath.start - start2 for i in xrange(len(srcPath)): if s1[isrc + i] == s2[idest + i]: nid += 1 x = nid / float(self.length(mode)) if trapOverflow and x > 1.: raise ValueError('''pIdentity overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.''') return x def longestSegment(self, segment, pIdentityMin=.9, minAlignSize=1, mode=max, **kwargs): besthit = None for i in xrange(len(segment)): ni = 0 # IDENTITY COUNT nm = 0 # MISMATCH COUNT for j in xrange(i, -1, -1): ni += segment[j][2] l = mode(segment[i][0] + segment[i][2] - segment[j][0], segment[i][1] + segment[i][2] - segment[j][1]) pIdentity = float(ni) / l if pIdentity >= pIdentityMin and (besthit is None or ni + nm > besthit[4]): besthit = (segment[j][0], segment[i][0] + segment[i][2], segment[j][1], segment[i][1] + segment[i][2], ni + nm) nm += segment[j][3] if besthit is None: return None elif besthit[4] >= minAlignSize: return besthit[:4] else: return None def conservedSegment(self, **kwargs): "calculate fractional identity for this pairwise alignment" start1 = self.sourcePath.start s1 = str(self.sourcePath).upper() start2 = self.targetPath.start s2 = str(self.targetPath).upper() i1 = None segment = [] n = 0 # Find unbroken identity segments. for srcPath, destPath in self.items(): isrc = srcPath.start - start1 idest = destPath.start - start2 for i in xrange(len(srcPath)): if s1[isrc + i] == s2[idest + i]: # EXACT MATCH if i1 is None: # START NEW IDENTITY-SEGMENT seg1, i1 = isrc + i, isrc + i seg2, i2 = idest + i, idest + i elif i1 + 1 != isrc + i or i2 + 1 != idest + i: # Not contiguous, break. segment.append((seg1 + start1, seg2 + start2, i1 + 1 - seg1, n)) n = 0 # RESET MISMATCH COUNT seg1, i1 = isrc + i, isrc + i seg2, i2 = idest + i, idest + i else: i1 = isrc + i i2 = idest + i else: # MISMATCH if i1 is not None: # BREAK PREVIOUS SEGMENT segment.append((seg1 + start1, seg2 + start2, i1 + 1 - seg1, n)) i1 = None n = 0 # RESET MISMATCH COUNT n += 1 # COUNT MISMATCH if i1 is not None: segment.append((seg1 + start1, seg2 + start2, i1 + 1 - seg1, n)) return self.longestSegment(segment, **kwargs) def pAligned(self, mode=max, trapOverflow=True): 'get fraction of aligned letters for this pairwise alignment' nid = 0 for srcPath, destPath in self.items(): nid += len(destPath) x = nid / float(self.length(mode)) if trapOverflow and x > 1.: raise ValueError('''pAligned overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.''') return x class SeqDBDescriptor(object): 'forwards attribute requests to self.pathForward' def __init__(self, attr): self.attr = attr def __get__(self, obj, objtype): # Raises an AttributeError if None. return getattr(obj.pathForward, self.attr) class SeqDBSlice(SeqPath): 'JUST A WRAPPER FOR SCHEMA TO HANG SHADOW ATTRIBUTES ON...' id = SeqDBDescriptor('id') db = SeqDBDescriptor('db') # CURRENTLY UNUSED ## class PathEdgeDict(dict): ## ## def __init__(self, p): ## self.path = p.path ## self.pos = p.end - 1 ## if p.end < len(p.path): ## dict.__setitem__(self, p.path[p.end], 1) ## if hasattr(p.path, '_next') and self.pos in p.path._next: ## dict.update(self, p.path._next[self.pos]) ## ## def __setitem__(self, k, val): ## print 'entered PathEdgeDict.setitem' ## if not hasattr(self.path, '_next'): ## self.path._next = {} ## if self.pos not in self.path._next: ## self.path._next[self.pos] = {} ## self.path._next[self.pos][k] = val ## dict.__setitem__(self, k, val) ## class PathNextDescr(object): ## ## def __init__(self, attrName='next'): ## self.attrName = attrName ## ## def __get__(self, obj, objtype): ## return PathEdgeDict(obj) ## ## def __set__(self, obj, val): ## raise AttributeError(self.attrName + ' is read-only!') ## class LengthDescriptor(object): ## ## def __init__(self, attr): ## self.attr = attr ## ## def __get__(self, obj, objtype): ## return len(getattr(obj, self.attr)) ## ## def __set__(self, obj, val): ## raise AttributeError(self.attr + ' is read-only!') ## def firstItem(aList): ## if hasattr(aList, '__iter__'): ## for i in aList: ## return i ## else: ## return aList PKðŠ’;’ø¸FŸFŸpygr/sequence.pyc;ò |†Kc@sŒdklZdkZdkTdZdefd„ƒYZdefd„ƒYZdefd „ƒYZd efd „ƒYZ d „Z d „Z d„Z defd„ƒYZ defd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd „ƒYZd!efd"„ƒYZd#efd$„ƒYZdS(%(s generatorsN(s*iþÿÿÿsReadOnlyAttributecBstZd„Zd„ZRS(NcCs ||_dS(N(sattrsself(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ scCst||iƒSdS(N(sgetattrsobjsselfsattr(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__s(s__name__s __module__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysReadOnlyAttribute s sIntervalTransformcBs¤tZdZedƒZedƒZeeed„Zd„Zd„Z d„Z d„Z d„Z d „Z d „Zd „Zd „Zd „Zd„Zd„ZRS(sARepresents coordinate transformation from one interval to anothers_srcPaths _destPathcCs·t|ƒtt|ƒƒ|_||_||_|t jo |t jo3yt ||ƒ}Wq~t j o t }q~Xn|t jo(|t jo||}n||_ndS(sMAP FROM srcPath -> destPathN(slensdestPathsfloatssrcPathsselfsscales_srcPaths _destPathsedgeInfosNonesedgeAttrsgetattrsAttributeErrors edgeIndex(sselfssrcPathsdestPathsedgeInfosedgeAttrs edgeIndex((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__s    cCst||iƒSdS(s9transform int srcPath local coord to destPath local coordN(sintsisselfsscale(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysxform/scCst||iƒSdS(s9transform int destPath local coord to srcPath local coordN(sintsisselfsscale(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys xformBack3scCs™|i|ijo"|i|i|i|ifSny>|ii|ijo$|i |i|i |ifSnWntj onXtdƒ‚dS(s2compute srcPath start,stop in ourPath local coordss-sequence mismatch: argument not from this seqN(ssrcPathspathsourPathsstartsstops_reversesAttributeErrors ValueError(sselfssrcPathsourPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getStartStop7s"(cCsJ|i||iƒ\}}t|i|i|ƒ|i|ƒdtƒSdS(s÷Apply this transformation to an interval NB: it is not restricted to the domain of this transform, and thus can extend BEYOND the boundaries of this transform. If you want it clipped use [] interface instead of ().srelativeToStartN( sselfs getStartStopssrcPathsstartsstopsSeqPathsdestPathsxformsTrue(sselfssrcPathsstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__call__Cs!cCsJ|i||iƒ\}}t|i|i|ƒ|i|ƒdtƒSdS(sreverse transform an intervalsrelativeToStartN( sselfs getStartStopsdestPathsstartsstopsSeqPathssrcPaths xformBacksTrue(sselfsdestPathsstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysreverseLscCs|||iƒSdS(skintersect srcPath with domain of this transform, then return transform to target domain coordinatesN(sselfssrcPath(sselfssrcPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__Rsccs |iVdS(N(sselfssrcPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__Wsccs|i|ifVdS(N(sselfssrcPathsdestPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysitemsZscCsHyt|id|ƒSWn)ttfj otd|ƒ‚nXdS(s3provide transparent wrapper for edgeInfo attributessedgeInfosQneither IntervalTransform nor edgeinfo has attr N(sgetattrsselfs__dict__sattrsKeyErrorsAttributeError(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getattr__]s cCsŸ|iiƒ}|iiƒ}h}x:|iƒD],\}}||d|<|||d|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys repr_dictes  cCsŒd}t|iƒiƒ}t|iƒiƒ}t|ƒ}d}x?||jo1||||jo|d7}n|d7}qEW|SdS(s>calculate total #identity matches between srcPath and destPathiiN( snidsstrsselfssrcPathsupperssrcsdestPathsdestslensslensi(sselfssrcsslensdestsnidsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys nidentityus  cCs|itt|iƒƒSdS(s9calculate fractional identity for this pairwise alignmentN(sselfs nidentitysfloatslenssrcPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys percent_id‚s(s__name__s __module__s__doc__sReadOnlyAttributessrcPathsdestPathsNones__init__sxforms xformBacks getStartStops__call__sreverses __getitem__s__iter__sitemss __getattr__s repr_dicts nidentitys percent_id(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysIntervalTransforms            sLetterEdgeDescriptorcBstZdZd„ZRS(s-cached dict of sequences traversing this edgecCsDy |iSWn2tj o&|ii|iƒ|_|iSnXdS(N(sedges_seqssAttributeErrorsorigins getEdgeSeqsstarget(sselfsedgesobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__s  (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysLetterEdgeDescriptorŒs s LetterEdgecBsDtZdZeƒZd„Zd„Zd„Zd„Zd„Z RS(sDrepresents an edge from origin -> target. seqs returns its sequencescCs||_||_dS(N(soriginsselfstarget(sselfsoriginstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__›s ccs(x!|iD]}|ii|ƒVq WdS(s<generate origin seqpos for sequences that traverse this edgeN(sselfsseqssseqsorigins getSeqPos(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__Ÿs ccs:x3|iD](}|ii|ƒ|ii|ƒfVq WdS(sCgenerate origin,target seqpos for sequences that traverse this edgeN(sselfsseqssseqsorigins getSeqPosstarget(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys iteritems¥s cCs[y |i}Wntj otdƒ‚nX|ii|iƒ|ii|iƒfSdS(sVreturn origin,target seqpos for sequence k; raise KeyError if not in this edges0k not a valid sequence: it has no path attributeN(skspathsAttributeErrors TypeErrorsselfsorigins getSeqPosstarget(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__ªs  cCsey2|i|ijo|i|ijodSnWntj onXtt|ƒt|ƒƒSdS(s3two edge objects match if they link identical nodesiN(sselfsoriginsotherstargetsAttributeErrorscmpsid(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__cmp__³s& ( s__name__s __module__s__doc__sLetterEdgeDescriptorsseqss__init__s__iter__s iteritemss __getitem__s__cmp__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys LetterEdge—s      cCsly4|djo|i| | ! Sn|i||!SWn1tj o%|tjot||ƒSqhnXdS(s˜get slice of top-level sequence object, in absolute coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForwardiN(sstartsseqs pathForwardsstopsAttributeErrorsNonesslice(sseqsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys absoluteSlice½s  cCs.|djo|| | ! Sn |||!SdS(s“get slice of this sequence object, in relative coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForwardiN(sstartsseqsstop(sseqsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys relativeSliceËs cCs^|tjo|Sn|tjo d}n||i9}|o||iSn ||iSdS(sÆAdjust index value either relative to myslice.start (positive indexes) or relative to myslice.stop (negative indexes). Handle the case where i is None or myslice is None appropriately. iN(smyslicesNonesisstepsrelativeToStartsstartsstop(sismyslicesrelativeToStart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys sumSliceIndexÕs    sSeqOriDescriptorcBstZdZd„ZRS(s$Get orientation of sequence intervalcCs |idjodSndSdS(Niiiÿÿÿÿ(sseqsstart(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__ès(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqOriDescriptorås sPathForwardDescrcBstZdZd„ZRS(s)get the top-level forward sequence objectcCs)|idjo |iSn |iiSdS(Ni(sseqs orientationspaths_reverse(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__òs (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysPathForwardDescrïs sAbsIntervalDescrcBstZdZd„ZRS(s)get the top-level forward sequence objectcCs:|idjo|i|ifSn|i |i fSdS(Ni(sseqs orientationsstartsstop(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__üs(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysAbsIntervalDescrùs sSeqPathcBs—tZdZeƒZeƒZeƒZde e e e e d„Z d„Z d„Z d„Zd„Zd„Zd„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zhdd<dd<dd<dd<dd<dd<dd<dd <d d<dd<d!d<d"d"stop means reverse orientation, i.e. (-path)[-stop:-start] start/stop are LOCAL coordinates relative to the specified path By default, start/stop are interpreted in the usual Python slicing way, i.e. a negative start value is interpreted as len(path)-start. The relativeToStart option turns off this behavior, so that negative values are interpreted as negative coordinates in the local coordinate system of path. absoluteCoords option allows intervals to be created using Pygr's internal coordinate convention i.e. -20,-10 --> -(path.pathForward[10:20]) is&cannot create empty sequence interval!iN( s reversePathspathsstopsstartsselfs_reversesNonesabsoluteCoordss pathForwards sumSliceIndexsrelativeToStarts IndexErrorsstep(sselfspathsstartsstopssteps reversePathsrelativeToStartsabsoluteCoords((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ sB     ,,'  '        cOsCy|iii}Wntj o t}nX||||ŽSdS(s<create a subslice using appropriate class based on containerN( spaths pathForwardsdbsitemSliceClasssklasssAttributeErrorsSeqPathslskwargs(sselfspathslskwargssklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys classySlice@s  cCs|i|||dtƒSdS(s6get slice of top-level sequence, using absolute coordssabsoluteCoordsN(sselfs classySlicesstartsstopsTrue(sselfsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysabsolute_sliceHscCs6t|tiƒo=|djot|tdƒ}qPt||ddƒ}nt|tiƒo#|i||i |i |i ƒSn¡t|t ƒo|i |i j otdƒ‚nyO|i|i |i |i t|ƒ|i |i ƒ}h|t||ƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__Ls  ## cCse|i|jo |idjot|iƒSn|i|i|i}|djo|SndSdS(Nii( sselfspaths orientationslens_reversesstopsstartsstepsd(sselfsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__len___s   ccs)x"tt|ƒƒD]}||VqWdS(N(srangeslensselfsi(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__ksccsd|d}xItdt|ƒƒD]2}||}|h|t||ƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys iteritemsos   cCsL|i|ijo|i|ijoh|i|i|ireturn dict of sequences that traverse edge from self -> otherN(sselfspathsothersstopsstartsstep(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getEdgeSeqsxs&cCs+|i|ijo|Sntdƒ‚dS(s=get seq interval corresponding to this node in sequence graphsseq not on this path!N(sseqspathsselfsKeyError(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getSeqPosscCs+t|iƒt|iƒAt|iƒASdS(s,ensure that same seq intervals match in dictN(sidsselfspathshashsstartsstop(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__hash__†scCs]t|tƒ odSn|i|ijo)t|i|if|i|ifƒSntSdS(s-ensure that same seq intervals match in cmp()iÿÿÿÿN( s isinstancesothersSeqPathsselfspathscmpsstartsstopsNOT_ON_SAME_PATH(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__cmp__Šs )cCs‘t|tƒoI|i|ijo#|i|ijo|i|ijotSqtSn5t|t i ƒo!|i|jo ||ijSndS(N( s isinstancesksSeqPathspathsselfsstartsstopsTruesFalsestypessIntType(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __contains__•s 9cCsw|i|ij otSn|i|ijo|i|ijp#|i|ijo|i|ijotSntSdS(s+check whether two paths on same seq overlapN(sselfspathspsFalsesstartsstopsTrue(sselfsp((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysoverlaps s LcCs«t|tƒo‹|i|ij otSnt|i|iƒ}t|i |i ƒ}||jo1|djo t}n|i |i||ƒSq§tSn t dƒ‚dS(s"find intersection of two intervalsis"SeqPath can only intersect SeqPathN( s isinstancesothersSeqPathsselfspathsNonesmaxsstartsminsstops classySlices TypeError(sselfsothersstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__mul__ªs   cCst||ƒSdS(s6return transform from other -> self coordinate systemsN(sIntervalTransformsothersself(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__div__¼scCsòy'|iƒtjotdƒ‚nWntj onX||ijoDy |iSWqîtj o&|i|dtƒ|_|iSqîXn^|i djo&|i|i|i |i |i ƒSn(|i|ii|i |i |i ƒSdS(s+return same interval in reverse orientationsMprotein sequence has no reverse orientation!s reversePathiN( sselfsseqtypesPROTEIN_SEQTYPEs ValueErrorsAttributeErrorspaths_reverses classySlicesTrues orientationsstopsstartsstep(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__neg__Às" cCs¬|i|ij otdƒ‚n|i|ijo |i}n |i}|i|ijo |i}n |i}|djo t}n|i|i|||iƒSdS(s=return merged interval spanning both self and other intervalss(incompatible intervals cannot be merged.iN( sselfspathsothers ValueErrorsstartsstopsNones classySlicesstep(sselfsothersstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__add__Õs      cCsq|i|ij otdƒ‚n|i|ijo|i|_n|i|ijo|i|_n|SdS(s=return merged interval spanning both self and other intervalss(incompatible intervals cannot be merged.N(sselfspathsothers ValueErrorsstartsstop(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iadd__çscCs|i|it|iƒSdS(s.get the sequence interval before this intervalN(sselfs classySlicespathsNonesstart(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysbeforeñscCs=|idjotdƒ‚n|i|i|itƒSdS(s-get the sequence interval after this intervalis%cannot create empty sequence intervalN(sselfsstops IndexErrors classySlicespathsNone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysafterõscCs||ijSdS(sPtest whether this constitutes the whole sequence (in either orientation)N(sselfspath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysis_full_lengthûssastscsgsusnsAsTsCsGsUsNcCs_digi}tt|ƒdddƒD]'}||ii ||||ƒƒq*~ƒSdS(s$get reverse complement of a string ssiiÿÿÿÿN( sjoinsappends_[1]srangeslensssisselfs _complementsget(sselfsssis_[1]((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysreverse_complementscCsu|i}y |iSWnZtj oNy|iiSWqqtj o*tt|dd!ƒƒ|_|iSqqXnXdS(s'Get the sequence type for this sequenceii(N(sselfs pathForwardspaths_seqtypesAttributeErrorsdbs guess_seqtypesstr(sselfspath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysseqtype s  cCs^|idjo|ii|i|iƒSn.|iii|i |i ƒ}|i|ƒSdS(sQstring for this sequence interval; use reverse complement if necessary...iN( sselfs orientationspathsstrslicesstartsstops_reversesssreverse_complement(sselfss((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__str__s  cCsty|ii}Wntj o d}nX|idjod||i |i fSnd||i|ifSdS(Ns@NONAMEis -%s[%d:%d]s %s[%d:%d](sselfs pathForwardsidsAttributeErrors orientationsstopsstart(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__repr__s cCsdy|ii}Wntj o|i}nXhd|<d|i<d|i<d|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys repr_dict)s (&s__name__s __module__s__doc__sSeqOriDescriptors orientationsPathForwardDescrs pathForwardsAbsIntervalDescrs _abs_intervalsNonesFalses__init__s classySlicesabsolute_slices __getitem__s__len__s__iter__s iteritemss getEdgeSeqss getSeqPoss__hash__s__cmp__s __contains__soverlapss__mul__s__div__s__neg__s__add__s__iadd__sbeforesaftersis_full_lengths _complementsreverse_complementsseqtypes__str__s__repr__s repr_dict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqPaths>    5              r  sLengthDescriptorcBstZdZd„ZRS(s+property that just returns length of objectcCst|ƒSdS(N(slensseq(sselfsseqsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__6s(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysLengthDescriptor3s s SequenceBasecBsMtZdZdZeƒZdZdZd„Zd„Z d„Z d„Z RS(sObase sequence type assumes there will be a seq attribute providing sequenceiicCs ||_dS(N(sselfspath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__CscCs ||_dS(s(change this sequence to the string N(sseqsself(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysupdateFscCst|iƒSdS(s6default: get the whole self.seq and compute its lengthN(slensselfsseq(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__len__JscCs|i||!SdS(s5default method assumes self.seq is a sliceable stringN(sselfsseqsstartsstop(sselfsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysstrsliceNs( s__name__s __module__s__doc__sstartsLengthDescriptorsstopssteps orientations__init__supdates__len__sstrslice(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SequenceBase;s     sSequencecBstZdZd„ZRS(s@default sequence class initialized with a sequence string and IDcCs#ti|ƒ||_||_dS(N(s SequenceBases__init__sselfsidsssseq(sselfsssid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__Vs  (s__name__s __module__s__doc__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSequenceSs s SeqFilterDictcBs5tZdZgd„Zd„Zd„Zd„ZRS(s·stores a set of intervals, either on init or via self[ival]=junk; self[ival] returns intersection of ival and the overlapping interval in self if any; otherwise raise KeyErrorcCs,ti|ƒx|D]}t||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__as  cCsdyti||iƒ}Wntj otdƒ‚nX||}|tjo t‚n|SdS(Nsseq not in dict( sdicts __getitem__sselfskspathsivalsKeyErrorsresultsNone(sselfsksresultsival((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__gs   cCsti||i|ƒdS(N(sdicts __setitem__sselfsivalspath(sselfsivalsjunk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __setitem__qscCsti|ƒSdS(N(sdicts itervaluessself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__ts(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s__iter__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SeqFilterDict\s   s Seq2SeqEdgecBsƒtZdZeed„Zed„Zd„Zed„Z e d„Z e ed„Z dde d „Z d „Ze ed „ZRS( sMaps two sequence regions onto each other, using a list of scalar transformations. Can handle indels within the mapping.cCs«||_||_|tj o||_||_ns|id|gdtƒ}|i |ƒ}y|dd|_Wnt j ot dƒ‚nX|dd|_dS(Ns filterListsmergeAllis target interval not in msaSlice!i( smsaSlicesselfs targetPaths sourcePathsNonesmatchIntervalssgroupByIntervalssTruessisgroupBySequencessls IndexErrorsKeyError(sselfsmsaSlices targetPaths sourcePathsmatchIntervalsslssi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__„s      cKs¦|itjo|i|ifgSn!|itjotdƒ‚ng}xN|iD]C\}}}}|i t |i||ƒt |i||ƒfƒqWW|SdS(s+get list of (srcPath, destPath) 1:1 matchessno matchIntervals information!N(sselfsmatchIntervalssNones sourcePaths targetPathsFalses ValueErrorslssrcStartssrcEnds destStartsdestEndsappends absoluteSlice(sselfsmergeAllskwargsssrcEndsls destStartssrcStartsdestEnd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysitems–s 5cCsC|itjotdƒ‚n/|itjpt|iƒdjogSn|idd}|idd}g}xÂ|idD]³}|d|jot |i ||dƒ}nt}|d|jot |i ||dƒ}nt}|tj p |tj o|i||fƒn|d}|d}q„W|SdS(s@return list of (srcIval,destIval) representing gaps / insertionssno matchIntervals information!iiiiN(sselfsmatchIntervalssFalses ValueErrorsNoneslenssrcLastsdestLastslsts absoluteSlices sourcePathssrcIvals targetPathsdestIvalsappend(sselfslsdestIvalsdestLaststssrcLastssrcIval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysget_gaps¢s*& cKsBtgi}|id||D]}||dƒq ~ƒSdS(Ns sourceOnlyi(sitersappends_[1]sselfsitemss sourceOnlyskwargsst(sselfs sourceOnlyskwargss_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__ºscCs#|t|iƒt|iƒƒSdS(s:get length of source vs. target interval according to modeN(smodeslensselfs sourcePaths targetPath(sselfsmode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyslength¾scCs d} |ii}t|iƒiƒ}|ii}t|iƒiƒ}x||i ƒD]n\} } | i|} | i|}xEtt| ƒƒD]1} || | ||| jo| d7} qŽqŽWqUW| t|i|ƒƒ}|o |djotdƒ‚n|SdS(s9calculate fractional identity for this pairwise alignmentiif1.0s©pIdentity overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.N(snidsselfs sourcePathsstartsstart1sstrsupperss1s targetPathsstart2ss2sitemsssrcPathsdestPathsisrcsidestsxrangeslensisfloatslengthsmodesxs trapOverflows ValueError(sselfsmodes trapOverflowsidestsxsstart2ss2ss1sstart1snidsisdestPathssrcPathsisrc((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys pIdentityÂs$     f0.90000000000000002ic Kst}xJtt|ƒƒD]6} d}d}x!t| ddƒD] } ||| d7}||| d|| d|| d|| d|| d|| dƒ} t |ƒ| } | |jo|tjp|||djoU|| d|| d|| d|| d|| d|| d||f}n||| d7}q>WqW|tjotSn"|d|jo |d SntSdS(Niiÿÿÿÿiiii(sNonesbesthitsxrangeslenssegmentsisnisnmsjsmodeslsfloats pIdentitys pIdentityMins minAlignSize( sselfssegments pIdentityMins minAlignSizesmodeskwargssnisbesthitsnmsisjsls pIdentity((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyslongestSegmentÖs&&)/U  cKsQ|ii}t|iƒiƒ}|ii}t|iƒiƒ}t } g}d} x¬|iƒD]ž\} }| i|} |i|}xutt| ƒƒD]a}|| ||||joî| t jo8| || |f\}} ||||f\} }qû| d| |jp|d||jog|i||| || d|| fƒd} | || |f\}} ||||f\} }qû| |} ||}qš| t j o9|i||| || d|| fƒt } d} n| d7} qšWqaW| t j o-|i||| || d|| fƒn|i||SdS(s9calculate fractional identity for this pairwise alignmentiiN(sselfs sourcePathsstartsstart1sstrsupperss1s targetPathsstart2ss2sNonesi1ssegmentsnsitemsssrcPathsdestPathsisrcsidestsxrangeslensisseg1sseg2si2sappendslongestSegmentskwargs(sselfskwargssidestsi2sisstart2ss2sstart1sseg1snsi1ssrcPathsisrcsseg2ssegmentss1sdestPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysconservedSegmentîsB      *)  )  -cCsxd}x*|iƒD]\}}|t|ƒ7}qW|t|i|ƒƒ}|o |djot dƒ‚n|SdS(s;get fraction of aligned letters for this pairwise alignmentif1.0s¨pAligned overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.N( snidsselfsitemsssrcPathsdestPathslensfloatslengthsmodesxs trapOverflows ValueError(sselfsmodes trapOverflowsdestPathsnidssrcPathsx((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyspAligneds (s__name__s __module__s__doc__sNonesFalses__init__sitemssget_gapssTrues__iter__smaxslengths pIdentityslongestSegmentsconservedSegmentspAligned(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys Seq2SeqEdge~s     'sSeqDBDescriptorcBs tZdZd„Zd„ZRS(s/forwards attribute requests to self.pathForwardcCs ||_dS(N(sattrsself(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__%scCst|i|iƒSdS(N(sgetattrsobjs pathForwardsselfsattr(sselfsobjsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__(s(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqDBDescriptor"s  s SeqDBSlicecBs&tZdZedƒZedƒZRS(s9JUST A WRAPPER FOR SCHEMA TO HANG SHADOW ATTRIBUTES ON...sidsdb(s__name__s __module__s__doc__sSeqDBDescriptorsidsdb(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SeqDBSlice-s  (s __future__s generatorsstypesssequtilsNOT_ON_SAME_PATHsobjectsReadOnlyAttributesIntervalTransformsLetterEdgeDescriptors LetterEdges absoluteSlices relativeSlices sumSliceIndexsSeqOriDescriptorsPathForwardDescrsAbsIntervalDescrsSeqPathsLengthDescriptors SequenceBasesSequencesdicts SeqFilterDicts Seq2SeqEdgesSeqDBDescriptors SeqDBSlice(s sumSliceIndexsReadOnlyAttributesSeqDBDescriptorsIntervalTransformsAbsIntervalDescrs absoluteSlices generatorss relativeSlices SeqDBSlices Seq2SeqEdgesPathForwardDescrs LetterEdgesLengthDescriptors SeqFilterDictsSeqPathstypessNOT_ON_SAME_PATHsSequencesSeqOriDescriptors SequenceBasesLetterEdgeDescriptor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys?s,  r &     ÿ1 "¤ PKñŠ’;’ø¸FŸFŸpygr/sequence.pyo;ò |†Kc@sŒdklZdkZdkTdZdefd„ƒYZdefd„ƒYZdefd „ƒYZd efd „ƒYZ d „Z d „Z d„Z defd„ƒYZ defd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd „ƒYZd!efd"„ƒYZd#efd$„ƒYZdS(%(s generatorsN(s*iþÿÿÿsReadOnlyAttributecBstZd„Zd„ZRS(NcCs ||_dS(N(sattrsself(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ scCst||iƒSdS(N(sgetattrsobjsselfsattr(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__s(s__name__s __module__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysReadOnlyAttribute s sIntervalTransformcBs¤tZdZedƒZedƒZeeed„Zd„Zd„Z d„Z d„Z d„Z d „Z d „Zd „Zd „Zd „Zd„Zd„ZRS(sARepresents coordinate transformation from one interval to anothers_srcPaths _destPathcCs·t|ƒtt|ƒƒ|_||_||_|t jo |t jo3yt ||ƒ}Wq~t j o t }q~Xn|t jo(|t jo||}n||_ndS(sMAP FROM srcPath -> destPathN(slensdestPathsfloatssrcPathsselfsscales_srcPaths _destPathsedgeInfosNonesedgeAttrsgetattrsAttributeErrors edgeIndex(sselfssrcPathsdestPathsedgeInfosedgeAttrs edgeIndex((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__s    cCst||iƒSdS(s9transform int srcPath local coord to destPath local coordN(sintsisselfsscale(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysxform/scCst||iƒSdS(s9transform int destPath local coord to srcPath local coordN(sintsisselfsscale(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys xformBack3scCs™|i|ijo"|i|i|i|ifSny>|ii|ijo$|i |i|i |ifSnWntj onXtdƒ‚dS(s2compute srcPath start,stop in ourPath local coordss-sequence mismatch: argument not from this seqN(ssrcPathspathsourPathsstartsstops_reversesAttributeErrors ValueError(sselfssrcPathsourPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getStartStop7s"(cCsJ|i||iƒ\}}t|i|i|ƒ|i|ƒdtƒSdS(s÷Apply this transformation to an interval NB: it is not restricted to the domain of this transform, and thus can extend BEYOND the boundaries of this transform. If you want it clipped use [] interface instead of ().srelativeToStartN( sselfs getStartStopssrcPathsstartsstopsSeqPathsdestPathsxformsTrue(sselfssrcPathsstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__call__Cs!cCsJ|i||iƒ\}}t|i|i|ƒ|i|ƒdtƒSdS(sreverse transform an intervalsrelativeToStartN( sselfs getStartStopsdestPathsstartsstopsSeqPathssrcPaths xformBacksTrue(sselfsdestPathsstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysreverseLscCs|||iƒSdS(skintersect srcPath with domain of this transform, then return transform to target domain coordinatesN(sselfssrcPath(sselfssrcPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__Rsccs |iVdS(N(sselfssrcPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__Wsccs|i|ifVdS(N(sselfssrcPathsdestPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysitemsZscCsHyt|id|ƒSWn)ttfj otd|ƒ‚nXdS(s3provide transparent wrapper for edgeInfo attributessedgeInfosQneither IntervalTransform nor edgeinfo has attr N(sgetattrsselfs__dict__sattrsKeyErrorsAttributeError(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getattr__]s cCsŸ|iiƒ}|iiƒ}h}x:|iƒD],\}}||d|<|||d|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys repr_dictes  cCsŒd}t|iƒiƒ}t|iƒiƒ}t|ƒ}d}x?||jo1||||jo|d7}n|d7}qEW|SdS(s>calculate total #identity matches between srcPath and destPathiiN( snidsstrsselfssrcPathsupperssrcsdestPathsdestslensslensi(sselfssrcsslensdestsnidsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys nidentityus  cCs|itt|iƒƒSdS(s9calculate fractional identity for this pairwise alignmentN(sselfs nidentitysfloatslenssrcPath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys percent_id‚s(s__name__s __module__s__doc__sReadOnlyAttributessrcPathsdestPathsNones__init__sxforms xformBacks getStartStops__call__sreverses __getitem__s__iter__sitemss __getattr__s repr_dicts nidentitys percent_id(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysIntervalTransforms            sLetterEdgeDescriptorcBstZdZd„ZRS(s-cached dict of sequences traversing this edgecCsDy |iSWn2tj o&|ii|iƒ|_|iSnXdS(N(sedges_seqssAttributeErrorsorigins getEdgeSeqsstarget(sselfsedgesobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__s  (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysLetterEdgeDescriptorŒs s LetterEdgecBsDtZdZeƒZd„Zd„Zd„Zd„Zd„Z RS(sDrepresents an edge from origin -> target. seqs returns its sequencescCs||_||_dS(N(soriginsselfstarget(sselfsoriginstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__›s ccs(x!|iD]}|ii|ƒVq WdS(s<generate origin seqpos for sequences that traverse this edgeN(sselfsseqssseqsorigins getSeqPos(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__Ÿs ccs:x3|iD](}|ii|ƒ|ii|ƒfVq WdS(sCgenerate origin,target seqpos for sequences that traverse this edgeN(sselfsseqssseqsorigins getSeqPosstarget(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys iteritems¥s cCs[y |i}Wntj otdƒ‚nX|ii|iƒ|ii|iƒfSdS(sVreturn origin,target seqpos for sequence k; raise KeyError if not in this edges0k not a valid sequence: it has no path attributeN(skspathsAttributeErrors TypeErrorsselfsorigins getSeqPosstarget(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__ªs  cCsey2|i|ijo|i|ijodSnWntj onXtt|ƒt|ƒƒSdS(s3two edge objects match if they link identical nodesiN(sselfsoriginsotherstargetsAttributeErrorscmpsid(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__cmp__³s& ( s__name__s __module__s__doc__sLetterEdgeDescriptorsseqss__init__s__iter__s iteritemss __getitem__s__cmp__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys LetterEdge—s      cCsly4|djo|i| | ! Sn|i||!SWn1tj o%|tjot||ƒSqhnXdS(s˜get slice of top-level sequence object, in absolute coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForwardiN(sstartsseqs pathForwardsstopsAttributeErrorsNonesslice(sseqsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys absoluteSlice½s  cCs.|djo|| | ! Sn |||!SdS(s“get slice of this sequence object, in relative coordinates. This method calls getitem on the top-level sequence object i.e. seq.pathForwardiN(sstartsseqsstop(sseqsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys relativeSliceËs cCs^|tjo|Sn|tjo d}n||i9}|o||iSn ||iSdS(sÆAdjust index value either relative to myslice.start (positive indexes) or relative to myslice.stop (negative indexes). Handle the case where i is None or myslice is None appropriately. iN(smyslicesNonesisstepsrelativeToStartsstartsstop(sismyslicesrelativeToStart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys sumSliceIndexÕs    sSeqOriDescriptorcBstZdZd„ZRS(s$Get orientation of sequence intervalcCs |idjodSndSdS(Niiiÿÿÿÿ(sseqsstart(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__ès(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqOriDescriptorås sPathForwardDescrcBstZdZd„ZRS(s)get the top-level forward sequence objectcCs)|idjo |iSn |iiSdS(Ni(sseqs orientationspaths_reverse(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__òs (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysPathForwardDescrïs sAbsIntervalDescrcBstZdZd„ZRS(s)get the top-level forward sequence objectcCs:|idjo|i|ifSn|i |i fSdS(Ni(sseqs orientationsstartsstop(sselfsseqsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__üs(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysAbsIntervalDescrùs sSeqPathcBs—tZdZeƒZeƒZeƒZde e e e e d„Z d„Z d„Z d„Zd„Zd„Zd„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zhdd<dd<dd<dd<dd<dd<dd<dd <d d<dd<d!d<d"d"stop means reverse orientation, i.e. (-path)[-stop:-start] start/stop are LOCAL coordinates relative to the specified path By default, start/stop are interpreted in the usual Python slicing way, i.e. a negative start value is interpreted as len(path)-start. The relativeToStart option turns off this behavior, so that negative values are interpreted as negative coordinates in the local coordinate system of path. absoluteCoords option allows intervals to be created using Pygr's internal coordinate convention i.e. -20,-10 --> -(path.pathForward[10:20]) is&cannot create empty sequence interval!iN( s reversePathspathsstopsstartsselfs_reversesNonesabsoluteCoordss pathForwards sumSliceIndexsrelativeToStarts IndexErrorsstep(sselfspathsstartsstopssteps reversePathsrelativeToStartsabsoluteCoords((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__ sB     ,,'  '        cOsCy|iii}Wntj o t}nX||||ŽSdS(s<create a subslice using appropriate class based on containerN( spaths pathForwardsdbsitemSliceClasssklasssAttributeErrorsSeqPathslskwargs(sselfspathslskwargssklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys classySlice@s  cCs|i|||dtƒSdS(s6get slice of top-level sequence, using absolute coordssabsoluteCoordsN(sselfs classySlicesstartsstopsTrue(sselfsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysabsolute_sliceHscCs6t|tiƒo=|djot|tdƒ}qPt||ddƒ}nt|tiƒo#|i||i |i |i ƒSn¡t|t ƒo|i |i j otdƒ‚nyO|i|i |i |i t|ƒ|i |i ƒ}h|t||ƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__Ls  ## cCse|i|jo |idjot|iƒSn|i|i|i}|djo|SndSdS(Nii( sselfspaths orientationslens_reversesstopsstartsstepsd(sselfsd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__len___s   ccs)x"tt|ƒƒD]}||VqWdS(N(srangeslensselfsi(sselfsi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__ksccsd|d}xItdt|ƒƒD]2}||}|h|t||ƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys iteritemsos   cCsL|i|ijo|i|ijoh|i|i|ireturn dict of sequences that traverse edge from self -> otherN(sselfspathsothersstopsstartsstep(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getEdgeSeqsxs&cCs+|i|ijo|Sntdƒ‚dS(s=get seq interval corresponding to this node in sequence graphsseq not on this path!N(sseqspathsselfsKeyError(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys getSeqPosscCs+t|iƒt|iƒAt|iƒASdS(s,ensure that same seq intervals match in dictN(sidsselfspathshashsstartsstop(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__hash__†scCs]t|tƒ odSn|i|ijo)t|i|if|i|ifƒSntSdS(s-ensure that same seq intervals match in cmp()iÿÿÿÿN( s isinstancesothersSeqPathsselfspathscmpsstartsstopsNOT_ON_SAME_PATH(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__cmp__Šs )cCs‘t|tƒoI|i|ijo#|i|ijo|i|ijotSqtSn5t|t i ƒo!|i|jo ||ijSndS(N( s isinstancesksSeqPathspathsselfsstartsstopsTruesFalsestypessIntType(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __contains__•s 9cCsw|i|ij otSn|i|ijo|i|ijp#|i|ijo|i|ijotSntSdS(s+check whether two paths on same seq overlapN(sselfspathspsFalsesstartsstopsTrue(sselfsp((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysoverlaps s LcCs«t|tƒo‹|i|ij otSnt|i|iƒ}t|i |i ƒ}||jo1|djo t}n|i |i||ƒSq§tSn t dƒ‚dS(s"find intersection of two intervalsis"SeqPath can only intersect SeqPathN( s isinstancesothersSeqPathsselfspathsNonesmaxsstartsminsstops classySlices TypeError(sselfsothersstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__mul__ªs   cCst||ƒSdS(s6return transform from other -> self coordinate systemsN(sIntervalTransformsothersself(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__div__¼scCsòy'|iƒtjotdƒ‚nWntj onX||ijoDy |iSWqîtj o&|i|dtƒ|_|iSqîXn^|i djo&|i|i|i |i |i ƒSn(|i|ii|i |i |i ƒSdS(s+return same interval in reverse orientationsMprotein sequence has no reverse orientation!s reversePathiN( sselfsseqtypesPROTEIN_SEQTYPEs ValueErrorsAttributeErrorspaths_reverses classySlicesTrues orientationsstopsstartsstep(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__neg__Às" cCs¬|i|ij otdƒ‚n|i|ijo |i}n |i}|i|ijo |i}n |i}|djo t}n|i|i|||iƒSdS(s=return merged interval spanning both self and other intervalss(incompatible intervals cannot be merged.iN( sselfspathsothers ValueErrorsstartsstopsNones classySlicesstep(sselfsothersstopsstart((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__add__Õs      cCsq|i|ij otdƒ‚n|i|ijo|i|_n|i|ijo|i|_n|SdS(s=return merged interval spanning both self and other intervalss(incompatible intervals cannot be merged.N(sselfspathsothers ValueErrorsstartsstop(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iadd__çscCs|i|it|iƒSdS(s.get the sequence interval before this intervalN(sselfs classySlicespathsNonesstart(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysbeforeñscCs=|idjotdƒ‚n|i|i|itƒSdS(s-get the sequence interval after this intervalis%cannot create empty sequence intervalN(sselfsstops IndexErrors classySlicespathsNone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysafterõscCs||ijSdS(sPtest whether this constitutes the whole sequence (in either orientation)N(sselfspath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysis_full_lengthûssastscsgsusnsAsTsCsGsUsNcCs_digi}tt|ƒdddƒD]'}||ii ||||ƒƒq*~ƒSdS(s$get reverse complement of a string ssiiÿÿÿÿN( sjoinsappends_[1]srangeslensssisselfs _complementsget(sselfsssis_[1]((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysreverse_complementscCsu|i}y |iSWnZtj oNy|iiSWqqtj o*tt|dd!ƒƒ|_|iSqqXnXdS(s'Get the sequence type for this sequenceii(N(sselfs pathForwardspaths_seqtypesAttributeErrorsdbs guess_seqtypesstr(sselfspath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysseqtype s  cCs^|idjo|ii|i|iƒSn.|iii|i |i ƒ}|i|ƒSdS(sQstring for this sequence interval; use reverse complement if necessary...iN( sselfs orientationspathsstrslicesstartsstops_reversesssreverse_complement(sselfss((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__str__s  cCsty|ii}Wntj o d}nX|idjod||i |i fSnd||i|ifSdS(Ns@NONAMEis -%s[%d:%d]s %s[%d:%d](sselfs pathForwardsidsAttributeErrors orientationsstopsstart(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__repr__s cCsdy|ii}Wntj o|i}nXhd|<d|i<d|i<d|ibuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys repr_dict)s (&s__name__s __module__s__doc__sSeqOriDescriptors orientationsPathForwardDescrs pathForwardsAbsIntervalDescrs _abs_intervalsNonesFalses__init__s classySlicesabsolute_slices __getitem__s__len__s__iter__s iteritemss getEdgeSeqss getSeqPoss__hash__s__cmp__s __contains__soverlapss__mul__s__div__s__neg__s__add__s__iadd__sbeforesaftersis_full_lengths _complementsreverse_complementsseqtypes__str__s__repr__s repr_dict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqPaths>    5              r  sLengthDescriptorcBstZdZd„ZRS(s+property that just returns length of objectcCst|ƒSdS(N(slensseq(sselfsseqsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__6s(s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysLengthDescriptor3s s SequenceBasecBsMtZdZdZeƒZdZdZd„Zd„Z d„Z d„Z RS(sObase sequence type assumes there will be a seq attribute providing sequenceiicCs ||_dS(N(sselfspath(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__CscCs ||_dS(s(change this sequence to the string N(sseqsself(sselfsseq((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysupdateFscCst|iƒSdS(s6default: get the whole self.seq and compute its lengthN(slensselfsseq(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__len__JscCs|i||!SdS(s5default method assumes self.seq is a sliceable stringN(sselfsseqsstartsstop(sselfsstartsstop((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysstrsliceNs( s__name__s __module__s__doc__sstartsLengthDescriptorsstopssteps orientations__init__supdates__len__sstrslice(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SequenceBase;s     sSequencecBstZdZd„ZRS(s@default sequence class initialized with a sequence string and IDcCs#ti|ƒ||_||_dS(N(s SequenceBases__init__sselfsidsssseq(sselfsssid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__Vs  (s__name__s __module__s__doc__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSequenceSs s SeqFilterDictcBs5tZdZgd„Zd„Zd„Zd„ZRS(s·stores a set of intervals, either on init or via self[ival]=junk; self[ival] returns intersection of ival and the overlapping interval in self if any; otherwise raise KeyErrorcCs,ti|ƒx|D]}t||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__as  cCsdyti||iƒ}Wntj otdƒ‚nX||}|tjo t‚n|SdS(Nsseq not in dict( sdicts __getitem__sselfskspathsivalsKeyErrorsresultsNone(sselfsksresultsival((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __getitem__gs   cCsti||i|ƒdS(N(sdicts __setitem__sselfsivalspath(sselfsivalsjunk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys __setitem__qscCsti|ƒSdS(N(sdicts itervaluessself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__ts(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s__iter__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SeqFilterDict\s   s Seq2SeqEdgecBsƒtZdZeed„Zed„Zd„Zed„Z e d„Z e ed„Z dde d „Z d „Ze ed „ZRS( sMaps two sequence regions onto each other, using a list of scalar transformations. Can handle indels within the mapping.cCs«||_||_|tj o||_||_ns|id|gdtƒ}|i |ƒ}y|dd|_Wnt j ot dƒ‚nX|dd|_dS(Ns filterListsmergeAllis target interval not in msaSlice!i( smsaSlicesselfs targetPaths sourcePathsNonesmatchIntervalssgroupByIntervalssTruessisgroupBySequencessls IndexErrorsKeyError(sselfsmsaSlices targetPaths sourcePathsmatchIntervalsslssi((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__„s      cKs¦|itjo|i|ifgSn!|itjotdƒ‚ng}xN|iD]C\}}}}|i t |i||ƒt |i||ƒfƒqWW|SdS(s+get list of (srcPath, destPath) 1:1 matchessno matchIntervals information!N(sselfsmatchIntervalssNones sourcePaths targetPathsFalses ValueErrorslssrcStartssrcEnds destStartsdestEndsappends absoluteSlice(sselfsmergeAllskwargsssrcEndsls destStartssrcStartsdestEnd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysitems–s 5cCsC|itjotdƒ‚n/|itjpt|iƒdjogSn|idd}|idd}g}xÂ|idD]³}|d|jot |i ||dƒ}nt}|d|jot |i ||dƒ}nt}|tj p |tj o|i||fƒn|d}|d}q„W|SdS(s@return list of (srcIval,destIval) representing gaps / insertionssno matchIntervals information!iiiiN(sselfsmatchIntervalssFalses ValueErrorsNoneslenssrcLastsdestLastslsts absoluteSlices sourcePathssrcIvals targetPathsdestIvalsappend(sselfslsdestIvalsdestLaststssrcLastssrcIval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysget_gaps¢s*& cKsBtgi}|id||D]}||dƒq ~ƒSdS(Ns sourceOnlyi(sitersappends_[1]sselfsitemss sourceOnlyskwargsst(sselfs sourceOnlyskwargss_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__iter__ºscCs#|t|iƒt|iƒƒSdS(s:get length of source vs. target interval according to modeN(smodeslensselfs sourcePaths targetPath(sselfsmode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyslength¾scCs d} |ii}t|iƒiƒ}|ii}t|iƒiƒ}x||i ƒD]n\} } | i|} | i|}xEtt| ƒƒD]1} || | ||| jo| d7} qŽqŽWqUW| t|i|ƒƒ}|o |djotdƒ‚n|SdS(s9calculate fractional identity for this pairwise alignmentiif1.0s©pIdentity overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.N(snidsselfs sourcePathsstartsstart1sstrsupperss1s targetPathsstart2ss2sitemsssrcPathsdestPathsisrcsidestsxrangeslensisfloatslengthsmodesxs trapOverflows ValueError(sselfsmodes trapOverflowsidestsxsstart2ss2ss1sstart1snidsisdestPathssrcPathsisrc((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys pIdentityÂs$     f0.90000000000000002ic Kst}xJtt|ƒƒD]6} d}d}x!t| ddƒD] } ||| d7}||| d|| d|| d|| d|| d|| dƒ} t |ƒ| } | |jo|tjp|||djoU|| d|| d|| d|| d|| d|| d||f}n||| d7}q>WqW|tjotSn"|d|jo |d SntSdS(Niiÿÿÿÿiiii(sNonesbesthitsxrangeslenssegmentsisnisnmsjsmodeslsfloats pIdentitys pIdentityMins minAlignSize( sselfssegments pIdentityMins minAlignSizesmodeskwargssnisbesthitsnmsisjsls pIdentity((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyslongestSegmentÖs&&)/U  cKsQ|ii}t|iƒiƒ}|ii}t|iƒiƒ}t } g}d} x¬|iƒD]ž\} }| i|} |i|}xutt| ƒƒD]a}|| ||||joî| t jo8| || |f\}} ||||f\} }qû| d| |jp|d||jog|i||| || d|| fƒd} | || |f\}} ||||f\} }qû| |} ||}qš| t j o9|i||| || d|| fƒt } d} n| d7} qšWqaW| t j o-|i||| || d|| fƒn|i||SdS(s9calculate fractional identity for this pairwise alignmentiiN(sselfs sourcePathsstartsstart1sstrsupperss1s targetPathsstart2ss2sNonesi1ssegmentsnsitemsssrcPathsdestPathsisrcsidestsxrangeslensisseg1sseg2si2sappendslongestSegmentskwargs(sselfskwargssidestsi2sisstart2ss2sstart1sseg1snsi1ssrcPathsisrcsseg2ssegmentss1sdestPath((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysconservedSegmentîsB      *)  )  -cCsxd}x*|iƒD]\}}|t|ƒ7}qW|t|i|ƒƒ}|o |djot dƒ‚n|SdS(s;get fraction of aligned letters for this pairwise alignmentif1.0s¨pAligned overflow due to multiple hits (see docs)? To avoid this error message, use trapOverflow=False option.N( snidsselfsitemsssrcPathsdestPathslensfloatslengthsmodesxs trapOverflows ValueError(sselfsmodes trapOverflowsdestPathsnidssrcPathsx((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pyspAligneds (s__name__s __module__s__doc__sNonesFalses__init__sitemssget_gapssTrues__iter__smaxslengths pIdentityslongestSegmentsconservedSegmentspAligned(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys Seq2SeqEdge~s     'sSeqDBDescriptorcBs tZdZd„Zd„ZRS(s/forwards attribute requests to self.pathForwardcCs ||_dS(N(sattrsself(sselfsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__init__%scCst|i|iƒSdS(N(sgetattrsobjs pathForwardsselfsattr(sselfsobjsobjtype((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys__get__(s(s__name__s __module__s__doc__s__init__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pysSeqDBDescriptor"s  s SeqDBSlicecBs&tZdZedƒZedƒZRS(s9JUST A WRAPPER FOR SCHEMA TO HANG SHADOW ATTRIBUTES ON...sidsdb(s__name__s __module__s__doc__sSeqDBDescriptorsidsdb(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys SeqDBSlice-s  (s __future__s generatorsstypesssequtilsNOT_ON_SAME_PATHsobjectsReadOnlyAttributesIntervalTransformsLetterEdgeDescriptors LetterEdges absoluteSlices relativeSlices sumSliceIndexsSeqOriDescriptorsPathForwardDescrsAbsIntervalDescrsSeqPathsLengthDescriptors SequenceBasesSequencesdicts SeqFilterDicts Seq2SeqEdgesSeqDBDescriptors SeqDBSlice(s sumSliceIndexsReadOnlyAttributesSeqDBDescriptorsIntervalTransformsAbsIntervalDescrs absoluteSlices generatorss relativeSlices SeqDBSlices Seq2SeqEdgesPathForwardDescrs LetterEdgesLengthDescriptors SeqFilterDictsSeqPathstypessNOT_ON_SAME_PATHsSequencesSeqOriDescriptors SequenceBasesLetterEdgeDescriptor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequence.pys?s,  r &     ÿ1 "¤ PKd—~;zØU\ccpygr/sequtil.py DNA_SEQTYPE=0 RNA_SEQTYPE=1 PROTEIN_SEQTYPE=2 def guess_seqtype(s): dna_letters='AaTtUuGgCcNn' ndna=0 nU=0 nT=0 for l in s: if l in dna_letters: ndna += 1 if l=='U' or l=='u': nU += 1 elif l=='T' or l=='t': nT += 1 ratio=ndna/float(len(s)) if ratio>0.85: if nT>nU: return DNA_SEQTYPE else: return RNA_SEQTYPE else: return PROTEIN_SEQTYPE seq_id_counter=0 def new_seq_id(): global seq_id_counter seq_id_counter += 1 return str(seq_id_counter-1) def write_fasta(ofile, s, chunk=60, id=None, reformatter=None): "Trivial FASTA output" if id is None: try: id = str(s.id) except AttributeError: id = new_seq_id() ofile.write('>' + id + '\n') seq = str(s) if reformatter is not None: # APPLY THE DESIRED REFORMATTING seq = reformatter(seq) end = len(seq) pos = 0 while 1: ofile.write(seq[pos:pos+chunk] + '\n') pos += chunk if pos >= end: break return id # IN CASE CALLER WANTS TEMP ID WE MAY HAVE ASSIGNED def read_fasta(ifile): "iterate over id,title,seq from stream ifile" id = None isEmpty = True for line in ifile: if '>' == line[0]: if id is not None and len(seq) > 0: yield id, title, seq isEmpty = False id = line[1:].split()[0] title = line[len(id)+2:] seq = '' elif id is not None: # READ SEQUENCE for word in line.split(): # GET RID OF WHITESPACE seq += word if id is not None and len(seq) > 0: yield id, title, seq elif isEmpty: raise IOError('no readable sequence in FASTA file!') def read_fasta_one_line(ifile): # @CTB deprecated; remove "read a single sequence line, return id,title,seq" id = None seq = '' while True: line = ifile.readline(1024) # READ AT MOST 1KB if line == '': # EOF break elif '>' == line[0]: id = line[1:].split()[0] title = line[len(id)+2:] elif id is not None: # READ SEQUENCE for word in line.split(): # GET RID OF WHITESPACE seq += word if len(seq) > 0: return id, title, seq raise IOError('no readable sequence in FASTA file!') def read_fasta_lengths(ifile): "Generate sequence ID,length from stream ifile" id = None seqLength = 0 isEmpty = True for line in ifile: if '>' == line[0]: if id is not None and seqLength > 0: yield id, seqLength isEmpty = False id = line[1:].split()[0] seqLength = 0 elif id is not None: # READ SEQUENCE for word in line.split(): # GET RID OF WHITESPACE seqLength += len(word) if id is not None and seqLength > 0: yield id, seqLength elif isEmpty: raise IOError('no readable sequence in FASTA file!') class AATranslation(object): 'customizable translation class' geneticCode = dict(TTY='F', TTR='L', TCN='S', TAY='Y', TGY='C', TGG='W', CTN='L', CCN='P', CAY='H', CAR='Q', CGN='R', ATY='I', ATA='I', ATG='M', ACN='T', AAY='N', AAR='K', AGY='S', AGR='R', GTN='V', GCN='A', GAY='D', GAR='E', GGN='G', TAR='*', TGA='*') def __init__(self): 'initialize our translation dictionary by applying N,Y,R codes' geneticCode = self.geneticCode.copy() for codon, aa in self.geneticCode.items(): if codon[2] == 'N': geneticCode[codon[:2]+'A'] = aa geneticCode[codon[:2]+'T'] = aa geneticCode[codon[:2]+'G'] = aa geneticCode[codon[:2]+'C'] = aa elif codon[2] == 'Y': geneticCode[codon[:2]+'T'] = aa geneticCode[codon[:2]+'C'] = aa elif codon[2] == 'R': geneticCode[codon[:2]+'A'] = aa geneticCode[codon[:2]+'G'] = aa self.geneticCode = geneticCode def __call__(self, s): 'translate nucleotide string s to amino acid string' s = s.upper() s = s.replace('U', 'T') l = [] for i in range(0, len(s), 3): try: l.append(self.geneticCode[s[i:i+3]]) except KeyError: l.append('X') # uninterpretable return ''.join(l) translate_orf = AATranslation() # default translation function PKðŠ’;àçó:LLpygr/sequtil.pyc;ò |†Kc@szdZdZdZd„Zdad„Zdeed„Zd„Zd„Z d „Z d e fd „ƒYZ e ƒZ d S( iiicCsÜd}d}d}d}xy|D]q}||jo|d7}n|djp |djo|d7}q|djp |djo|d7}qqW|tt|ƒƒ}|djo||jot SqØt Snt SdS( Ns AaTtUuGgCcNniisUsusTstf0.84999999999999998( s dna_letterssndnasnUsnTssslsfloatslensratios DNA_SEQTYPEs RNA_SEQTYPEsPROTEIN_SEQTYPE(sssratiosndnas dna_lettersslsnTsnU((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys guess_seqtypes$   cCstd7attdƒSdS(Ni(sseq_id_countersstr(((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys new_seq_id s i<cCsâ|tjo6yt|iƒ}WqCtj otƒ}qCXn|id|dƒt|ƒ}|tj o||ƒ}nt |ƒ}d}xDno<|i||||!dƒ||7}||joPq–qW|SdS(sTrivial FASTA outputs>s iiN(sidsNonesstrsssAttributeErrors new_seq_idsofileswritesseqs reformatterslensendsposschunk(sofilessschunksids reformattersendsseqspos((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys write_fasta&s&       ccst}t}xº|D]²}d|djoi|tj ot|ƒdjo|||fVt }n|di ƒd}|t|ƒd}d}q|tj o%x"|i ƒD]}||7}q­WqqW|tj ot|ƒdjo|||fVn|ot dƒ‚ndS(s+iterate over id,title,seq from stream ifiles>iiiss#no readable sequence in FASTA file!N( sNonesidsTruesisEmptysifileslineslensseqstitlesFalsessplitswordsIOError(sifilesseqstitlesisEmptyswordslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys read_fasta<s(       cCsßt}d}xÀto¸|idƒ}|djoPqd|djo,|diƒd}|t|ƒd}q|tj oIx|iƒD]}||7}qŽWt|ƒdjo|||fSqÊqqWt dƒ‚dS( s0read a single sequence line, return id,title,seqsis>iiis#no readable sequence in FASTA file!N( sNonesidsseqsTruesifilesreadlineslinessplitslenstitleswordsIOError(sifileswordsseqstitleslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pysread_fasta_one_lineQs$   ccsût}d}t}x£|D]›}d|djoL|tj o |djo||fVt}n|diƒd}d}q|tj o+x(|iƒD]}|t |ƒ7}q–WqqW|tj o |djo||fVn|ot dƒ‚ndS(s-Generate sequence ID,length from stream ifileis>is#no readable sequence in FASTA file!N( sNonesids seqLengthsTruesisEmptysifileslinesFalsessplitswordslensIOError(sifiles seqLengthsisEmptyswordslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pysread_fasta_lengthsds(     s AATranslationc5BsÅtZdZeddddddddd d d d d ddddddddddddddddddddd d!dd"dd#d$d%d&d'd(d)d*d+d,d-d.d/d.ƒZd0„Zd1„ZRS(2scustomizable translation classsTTYsFsTTRsLsTCNsSsTAYsYsTGYsCsTGGsWsCTNsCCNsPsCAYsHsCARsQsCGNsRsATYsIsATAsATGsMsACNsTsAAYsNsAARsKsAGYsAGRsGTNsVsGCNsAsGAYsDsGARsEsGGNsGsTARs*sTGAcCs |iiƒ}xì|iiƒD]Û\}}|ddjoL|||d d<|||d d<|||d d<|||d ds iiN(sidsNonesstrsssAttributeErrors new_seq_idsofileswritesseqs reformatterslensendsposschunk(sofilessschunksids reformattersendsseqspos((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys write_fasta&s&       ccst}t}xº|D]²}d|djoi|tj ot|ƒdjo|||fVt }n|di ƒd}|t|ƒd}d}q|tj o%x"|i ƒD]}||7}q­WqqW|tj ot|ƒdjo|||fVn|ot dƒ‚ndS(s+iterate over id,title,seq from stream ifiles>iiiss#no readable sequence in FASTA file!N( sNonesidsTruesisEmptysifileslineslensseqstitlesFalsessplitswordsIOError(sifilesseqstitlesisEmptyswordslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pys read_fasta<s(       cCsßt}d}xÀto¸|idƒ}|djoPqd|djo,|diƒd}|t|ƒd}q|tj oIx|iƒD]}||7}qŽWt|ƒdjo|||fSqÊqqWt dƒ‚dS( s0read a single sequence line, return id,title,seqsis>iiis#no readable sequence in FASTA file!N( sNonesidsseqsTruesifilesreadlineslinessplitslenstitleswordsIOError(sifileswordsseqstitleslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pysread_fasta_one_lineQs$   ccsût}d}t}x£|D]›}d|djoL|tj o |djo||fVt}n|diƒd}d}q|tj o+x(|iƒD]}|t |ƒ7}q–WqqW|tj o |djo||fVn|ot dƒ‚ndS(s-Generate sequence ID,length from stream ifileis>is#no readable sequence in FASTA file!N( sNonesids seqLengthsTruesisEmptysifileslinesFalsessplitswordslensIOError(sifiles seqLengthsisEmptyswordslinesid((s=build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sequtil.pysread_fasta_lengthsds(     s AATranslationc5BsÅtZdZeddddddddd d d d d ddddddddddddddddddddd d!dd"dd#d$d%d&d'd(d)d*d+d,d-d.d/d.ƒZd0„Zd1„ZRS(2scustomizable translation classsTTYsFsTTRsLsTCNsSsTAYsYsTGYsCsTGGsWsCTNsCCNsPsCAYsHsCARsQsCGNsRsATYsIsATAsATGsMsACNsTsAAYsNsAARsKsAGYsAGRsGTNsVsGCNsAsGAYsDsGARsEsGGNsGsTARs*sTGAcCs |iiƒ}xì|iiƒD]Û\}}|ddjoL|||d d<|||d d<|||d d<|||d d 1: name = argList[0] # USE 1ST ARG AS TABLE NAME argnames = ('host', 'user', 'passwd') # READ ARGS IN THIS ORDER kwargs = kwargs.copy() # a copy we can overwrite kwargs.update(list_to_dict(argnames, argList[1:])) serverInfo = DBServerInfo(**kwargs) return name, serverInfo.cursor(), serverInfo def mysql_connect(connect=None, configFile=None, useStreaming=False, **args): """return connection and cursor objects, using .my.cnf if necessary""" kwargs = args.copy() # a copy we can modify if 'user' not in kwargs and configFile is None: #Find where config file is osname = platform.system() if osname in('Microsoft', 'Windows'): # Machine is a Windows box paths = [] try: # handle case where WINDIR not defined by Windows... windir = os.environ['WINDIR'] paths += [(windir, 'my.ini'), (windir, 'my.cnf')] except KeyError: pass try: sysdrv = os.environ['SYSTEMDRIVE'] paths += [(sysdrv, os.path.sep + 'my.ini'), (sysdrv, os.path.sep + 'my.cnf')] except KeyError: pass if len(paths) > 0: configFile = get_valid_path(*paths) else: # treat as normal platform with home directories configFile = os.path.join(os.path.expanduser('~'), '.my.cnf') # allows for a local mysql local configuration file to be read # from the current directory configFile = configFile or os.path.join(os.getcwd(), 'mysql.cnf') if configFile and os.path.exists(configFile): kwargs['read_default_file'] = configFile connect = None # force it to use MySQLdb if connect is None: import MySQLdb connect = MySQLdb.connect kwargs['compress'] = True if useStreaming: # use server side cursors for scalable result sets try: from MySQLdb import cursors kwargs['cursorclass'] = cursors.SSCursor except (ImportError, AttributeError): pass conn = connect(**kwargs) cursor = conn.cursor() return conn, cursor _mysqlMacros = dict(IGNORE='ignore', REPLACE='replace', AUTO_INCREMENT='AUTO_INCREMENT', SUBSTRING='substring', SUBSTR_FROM='FROM', SUBSTR_FOR='FOR') def mysql_table_schema(self, analyzeSchema=True): 'retrieve table schema from a MySQL database, save on self' import MySQLdb self._format_query = SQLFormatDict(MySQLdb.paramstyle, _mysqlMacros) if not analyzeSchema: return self.clear_schema() # reset settings and dictionaries self.cursor.execute('describe %s' % self.name) # get info about columns columns = self.cursor.fetchall() self.cursor.execute('select * from %s limit 1' % self.name) # descriptions for icol, c in enumerate(columns): field = c[0] self.columnName.append(field) # list of columns in same order as table if c[3] == "PRI": # record as primary key if self.primary_key is None: self.primary_key = field else: try: self.primary_key.append(field) except AttributeError: self.primary_key = [self.primary_key, field] if c[1][:3].lower() == 'int': self.usesIntID = True else: self.usesIntID = False elif c[3] == "MUL": self.indexed[field] = icol self.description[field] = self.cursor.description[icol] self.columnType[field] = c[1] # SQL COLUMN TYPE _sqliteMacros = dict(IGNORE='or ignore', REPLACE='insert or replace', AUTO_INCREMENT='', SUBSTRING='substr', SUBSTR_FROM=',', SUBSTR_FOR=',') def import_sqlite(): 'import sqlite3 (for Python 2.5+) or pysqlite2 for earlier Python versions' try: import sqlite3 as sqlite except ImportError: from pysqlite2 import dbapi2 as sqlite return sqlite def sqlite_table_schema(self, analyzeSchema=True): 'retrieve table schema from a sqlite3 database, save on self' sqlite = import_sqlite() self._format_query = SQLFormatDict(sqlite.paramstyle, _sqliteMacros) if not analyzeSchema: return self.clear_schema() # reset settings and dictionaries self.cursor.execute('PRAGMA table_info("%s")' % self.name) columns = self.cursor.fetchall() self.cursor.execute('select * from %s limit 1' % self.name) # descriptions for icol, c in enumerate(columns): field = c[1] self.columnName.append(field) # list of columns in same order as table self.description[field] = self.cursor.description[icol] self.columnType[field] = c[2] # SQL COLUMN TYPE # Get primary key / unique indexes. self.cursor.execute('select name from sqlite_master where tbl_name="%s" \ and type="index" and sql is null' % self.name) for indexname in self.cursor.fetchall(): # search indexes for primary key self.cursor.execute('PRAGMA index_info("%s")' % indexname) l = self.cursor.fetchall() # get list of columns in this index if len(l) == 1: # assume 1st single-column unique index is primary key! self.primary_key = l[0][2] break # done searching for primary key! if self.primary_key is None: # Grrr, INTEGER PRIMARY KEY handled differently. self.cursor.execute('select sql from sqlite_master where \ tbl_name="%s" and type="table"' % self.name) sql = self.cursor.fetchall()[0][0] for columnSQL in sql[sql.index('(') + 1:].split(','): if 'primary key' in columnSQL.lower(): # must be the primary key! col = columnSQL.split()[0] # get column name if col in self.columnType: self.primary_key = col break # done searching for primary key! else: raise ValueError('unknown primary key %s in table %s' % (col, self.name)) if self.primary_key is not None: # check its type if self.columnType[self.primary_key] == 'int' or \ self.columnType[self.primary_key] == 'integer': self.usesIntID = True else: self.usesIntID = False class SQLFormatDict(object): '''Perform SQL keyword replacements for maintaining compatibility across a wide range of SQL backends. Uses Python dict-based string format function to do simple string replacements, and also to convert params list to the paramstyle required for this interface. Create by passing a dict of macros and the db-api paramstyle: sfd = SQLFormatDict("qmark", substitutionDict) Then transform queries+params as follows; input should be "format" style: sql,params = sfd("select * from foo where id=%s and val=%s", (myID,myVal)) cursor.execute(sql, params) ''' _paramFormats = dict(pyformat='%%(%d)s', numeric=':%d', named=':%d', qmark='(ignore)', format='(ignore)') def __init__(self, paramstyle, substitutionDict={}): self.substitutionDict = substitutionDict.copy() self.paramstyle = paramstyle self.paramFormat = self._paramFormats[paramstyle] self.makeDict = (paramstyle == 'pyformat' or paramstyle == 'named') if paramstyle == 'qmark': # handle these as simple substitution self.substitutionDict['?'] = '?' elif paramstyle == 'format': self.substitutionDict['?'] = '%s' def __getitem__(self, k): 'apply correct substitution for this SQL interface' try: return self.substitutionDict[k] # apply our substitutions except KeyError: pass if k == '?': # sequential parameter s = self.paramFormat % self.iparam self.iparam += 1 # advance to the next parameter return s raise KeyError('unknown macro: %s' % k) def __call__(self, sql, paramList): 'returns corrected sql,params for this interface' self.iparam = 1 # DB-ABI param indexing begins at 1 sql = sql.replace('%s', '%(?)s') # convert format into pyformat s = sql % self # apply all %(x)s replacements in sql if self.makeDict: # construct a params dict paramDict = {} for i, param in enumerate(paramList): # i + 1 because DB-ABI parameter indexing begins at 1 paramDict[str(i + 1)] = param return s, paramDict else: # just return the original params list return s, paramList def get_table_schema(self, analyzeSchema=True): 'run the right schema function based on type of db server connection' try: modname = self.cursor.__class__.__module__ except AttributeError: raise ValueError('no cursor object or module information!') try: schema_func = self._schemaModuleDict[modname] except KeyError: raise KeyError('''unknown db module: %s. Use _schemaModuleDict attribute to supply a method for obtaining table schema for this module''' % modname) schema_func(self, analyzeSchema) # run the schema function _schemaModuleDict = {'MySQLdb.cursors': mysql_table_schema, 'pysqlite2.dbapi2': sqlite_table_schema, 'sqlite3': sqlite_table_schema} class SQLTableBase(object, UserDict.DictMixin): "Store information about an SQL table as dict keyed by primary key" _schemaModuleDict = _schemaModuleDict # default module list get_table_schema = get_table_schema def __init__(self, name, cursor=None, itemClass=None, attrAlias=None, clusterKey=None, createTable=None, graph=None, maxCache=None, arraysize=1024, itemSliceClass=None, dropIfExists=False, serverInfo=None, autoGC=True, orderBy=None, writeable=False, iterSQL=None, iterColumns=None, primaryKey=None, **kwargs): if autoGC: # automatically garbage collect unused objects self._weakValueDict = RecentValueDictionary(autoGC) # object cache else: self._weakValueDict = {} self.autoGC = autoGC self.orderBy = orderBy if orderBy and serverInfo and serverInfo._serverType == 'mysql': if iterSQL and iterColumns: # both required for mysql! self.iterSQL, self.iterColumns = iterSQL, iterColumns else: raise ValueError('For MySQL tables with orderBy, you MUST \ specify iterSQL and iterColumns as well!') self.writeable = writeable if cursor is None: if serverInfo is not None: # get cursor from serverInfo cursor = serverInfo.cursor() else: # try to read connection info from name or config file name, cursor, serverInfo = get_name_cursor(name, **kwargs) else: warnings.warn("The cursor argument is deprecated. Use serverInfo \ instead!", DeprecationWarning, stacklevel=2) self.cursor = cursor if createTable is not None: # RUN COMMAND TO CREATE THIS TABLE if dropIfExists: # get rid of any existing table cursor.execute('drop table if exists ' + name) self.get_table_schema(False) # check dbtype, init _format_query sql, params = self._format_query(createTable, ()) # apply macros cursor.execute(sql) # create the table self.name = name if graph is not None: self.graph = graph if maxCache is not None: self.maxCache = maxCache if arraysize is not None: self.arraysize = arraysize cursor.arraysize = arraysize self.get_table_schema() # get schema of columns to serve as attrs if primaryKey is not None: self.primary_key = primaryKey self.primaryKey = primaryKey self.data = {} # map of all attributes, including aliases for icol, field in enumerate(self.columnName): self.data[field] = icol # 1st add mappings to columns try: self.data['id'] = self.data[self.primary_key] except (KeyError, TypeError): pass if hasattr(self, '_attr_alias'): # Apply attribute aliases for this class. self.addAttrAlias(False, **self._attr_alias) self.objclass(itemClass) # NEED TO SUBCLASS OUR ITEM CLASS if itemSliceClass is not None: self.itemSliceClass = itemSliceClass # Need to subclass itemSliceClass. get_bound_subclass(self, 'itemSliceClass', self.name) if attrAlias is not None: # ADD ATTRIBUTE ALIASES self.attrAlias = attrAlias # RECORD FOR PICKLING PURPOSES self.data.update(attrAlias) if clusterKey is not None: self.clusterKey = clusterKey if serverInfo is not None: self.serverInfo = serverInfo def __len__(self): self._select(selectCols = 'count(*)') return self.cursor.fetchone()[0] def __hash__(self): return id(self) def __cmp__(self, other): 'only match self and no other!' if self is other: return 0 else: return cmp(id(self), id(other)) _pickleAttrs = dict(name=0, clusterKey=0, maxCache=0, arraysize=0, attrAlias=0, serverInfo=0, autoGC=0, orderBy=0, writeable=0, iterSQL=0, iterColumns=0, primaryKey=0) __getstate__ = standard_getstate def __setstate__(self, state): # default cursor provisioning by worldbase is deprecated! ## if 'serverInfo' not in state: # hmm, no address for db server? ## try: # SEE IF WE CAN GET CURSOR DIRECTLY FROM RESOURCE DATABASE ## from Data import getResource ## state['cursor'] = getResource.getTableCursor(state['name']) ## except ImportError: ## pass # FAILED, SO TRY TO GET A CURSOR IN THE USUAL WAYS... self.__init__(**state) def __repr__(self): return '' def clear_schema(self): 'reset all schema information for this table' self.description={} self.columnName = [] self.columnType = {} self.usesIntID = None self.primary_key = None self.indexed = {} def _attrSQL(self, attr, sqlColumn=False, columnNumber=False): "Translate python attribute name to appropriate SQL expression" try: # MAKE SURE THIS ATTRIBUTE CAN BE MAPPED TO DATABASE EXPRESSION field = self.data[attr] except KeyError: raise AttributeError('attribute %s not a valid column \ or alias in %s' % (attr, self.name)) if sqlColumn: # ENSURE THAT THIS TRULY MAPS TO A COLUMN NAME IN THE DB try: # CHECK IF field IS COLUMN NUMBER return self.columnName[field] # RETURN SQL COLUMN NAME except TypeError: try: # Check if field is SQL column name, return it if so. return self.columnName[self.data[field]] except (KeyError, TypeError): raise AttributeError('attribute %s does not map to an SQL \ column in %s' % (attr, self.name)) if columnNumber: try: # CHECK IF field IS A COLUMN NUMBER return field + 0 # ONLY RETURN AN INTEGER except TypeError: try: # CHECK IF field IS ITSELF THE SQL COLUMN NAME return self.data[field] + 0 # ONLY RETURN AN INTEGER except (KeyError, TypeError): raise ValueError('attribute %s does not map to a SQL \ column!' % attr) if isinstance(field, types.StringType): # Use aliased expression for database select instead of attr. attr = field elif attr == 'id': attr = self.primary_key return attr def addAttrAlias(self, saveToPickle=True, **kwargs): """Add new attributes as aliases of existing attributes. They can be specified either as named args: t.addAttrAlias(newattr=oldattr) or by passing a dictionary kwargs whose keys are newattr and values are oldattr: t.addAttrAlias(**kwargs) saveToPickle=True forces these aliases to be saved if object is pickled. """ if saveToPickle: self.attrAlias.update(kwargs) for key, val in kwargs.items(): try: # 1st CHECK WHETHER val IS AN EXISTING COLUMN / ALIAS self.data[val] + 0 # CHECK WHETHER val MAPS TO A COLUMN NUMBER # Yes, val is an actual SQL column name, so save it directly. raise KeyError except TypeError: # val IS ITSELF AN ALIAS self.data[key] = self.data[val] # SO MAP TO WHAT IT MAPS TO except KeyError: # TREAT AS ALIAS TO SQL EXPRESSION self.data[key] = val def objclass(self, oclass=None): """Create class representing a row in this table by subclassing oclass, adding data""" if oclass is not None: # use this as our base itemClass self.itemClass = oclass if self.writeable: # Use its writeable version. self.itemClass = self.itemClass._RWClass # Bind itemClass. oclass = get_bound_subclass(self, 'itemClass', self.name, subclassArgs=dict(db=self)) if issubclass(oclass, TupleO): # Bind attribute list to tupleo interface. oclass._attrcol = self.data if hasattr(oclass, '_tableclass') and \ not isinstance(self, oclass._tableclass): # Row class can override our current table class. self.__class__ = oclass._tableclass def _select(self, whereClause='', params=(), selectCols='t1.*', cursor=None, orderBy='', limit=''): 'execute the specified query but do not fetch' sql, params = self._format_query('select %s from %s t1 %s %s %s' % (selectCols, self.name, whereClause, orderBy, limit), params) if cursor is None: self.cursor.execute(sql, params) else: cursor.execute(sql, params) def select(self, whereClause, params=None, oclass=None, selectCols='t1.*'): "Generate the list of objects that satisfy the database SELECT" if oclass is None: oclass = self.itemClass self._select(whereClause, params, selectCols) l = self.cursor.fetchall() for t in l: yield self.cacheItem(t, oclass) def query(self, **kwargs): 'query for intersection of all specified kwargs, returned as iterator' criteria = [] params = [] for k, v in kwargs.items(): # CONSTRUCT THE LIST OF WHERE CLAUSES if v is None: # CONVERT TO SQL NULL TEST criteria.append('%s IS NULL' % self._attrSQL(k)) else: # TEST FOR EQUALITY criteria.append('%s=%%s' % self._attrSQL(k)) params.append(v) return self.select('where ' + ' and '.join(criteria), params) def _update(self, row_id, col, val): 'update a single field in the specified row to the specified value' sql, params = self._format_query('update %s set %s=%%s where %s=%%s' % (self.name, col, self.primary_key), (val, row_id)) self.cursor.execute(sql, params) def getID(self, t): try: return t[self.data['id']] # GET ID FROM TUPLE except TypeError: # treat as alias return t[self.data[self.data['id']]] def cacheItem(self, t, oclass): 'get obj from cache if possible, or construct from tuple' try: id = self.getID(t) except KeyError: # NO PRIMARY KEY? IGNORE THE CACHE. return oclass(t) try: # IF ALREADY LOADED IN OUR DICTIONARY, JUST RETURN THAT ENTRY return self._weakValueDict[id] except KeyError: pass o = oclass(t) self._weakValueDict[id] = o # CACHE THIS ITEM IN OUR DICTIONARY return o def cache_items(self, rows, oclass=None): if oclass is None: oclass = self.itemClass for t in rows: yield self.cacheItem(t, oclass) def foreignKey(self, attr, k): 'get iterator for objects with specified foreign key value' return self.select('where %s=%%s' % attr, (k, )) def limit_cache(self): 'APPLY maxCache LIMIT TO CACHE SIZE' try: if self.maxCache [(source,target),...]''' _distinct_key = 'edge_id' _pickleAttrs = SQLTableMultiNoCache._pickleAttrs.copy() _pickleAttrs.update(dict(graph=0)) def keys(self): self.cursor.execute('select %s,%s,%s from %s where %s is not null \ order by %s,%s' % (self._attrSQL('source_id'), self._attrSQL('target_id'), self._attrSQL('edge_id'), self.name, self._attrSQL('target_id'), self._attrSQL('source_id'), self._attrSQL('target_id'))) l = [] # PREFETCH ALL ROWS, SINCE CURSOR MAY BE REUSED for source_id, target_id, edge_id in self.cursor.fetchall(): l.append((self.graph.unpack_source(source_id), self.graph.unpack_target(target_id), self.graph.unpack_edge(edge_id))) return l __call__ = keys def __iter__(self): return iter(self.keys()) def __getitem__(self, edge): sql, params = self._format_query('select %s,%s from %s where %s=%%s' % (self._attrSQL('source_id'), self._attrSQL('target_id'), self.name, self._attrSQL(self._distinct_key)), (self.graph.pack_edge(edge), )) self.cursor.execute(sql, params) l = [] # PREFETCH ALL ROWS, SINCE CURSOR MAY BE REUSED for source_id, target_id in self.cursor.fetchall(): l.append((self.graph.unpack_source(source_id), self.graph.unpack_target(target_id))) return l class SQLEdgeDict(object): '2nd level graph interface to SQL database' def __init__(self, fromNode, table): self.fromNode = fromNode self.table = table if not hasattr(self.table, 'allowMissingNodes'): sql, params = self.table._format_query('select %s from %s where \ %s=%%s limit 1' % (self.table.sourceSQL, self.table.name, self.table.sourceSQL), (self.fromNode, )) self.table.cursor.execute(sql, params) if len(self.table.cursor.fetchall())<1: raise KeyError('node not in graph!') def __getitem__(self, target): sql, params = self.table._format_query('select %s from %s where \ %s=%%s and %s=%%s limit 2' % (self.table.edgeSQL, self.table.name, self.table.sourceSQL, self.table.targetSQL), (self.fromNode, self.table.pack_target(target))) self.table.cursor.execute(sql, params) l = self.table.cursor.fetchmany(2) # get at most two rows if len(l) != 1: raise KeyError('either no edge from source to target \ or not unique!') try: return self.table.unpack_edge(l[0][0]) # RETURN EDGE except IndexError: raise KeyError('no edge from node to target') def __setitem__(self, target, edge): sql, params = self.table._format_query('replace into %s values \ (%%s,%%s,%%s)' % self.table.name, (self.fromNode, self.table.pack_target(target), self.table.pack_edge(edge))) self.table.cursor.execute(sql, params) if not hasattr(self.table, 'sourceDB') or \ (hasattr(self.table, 'targetDB') and self.table.sourceDB is self.table.targetDB): self.table += target # ADD AS NODE TO GRAPH def __iadd__(self, target): self[target] = None return self # iadd MUST RETURN self! def __delitem__(self, target): sql, params = self.table._format_query('delete from %s where %s=%%s \ and %s=%%s' % (self.table.name, self.table.sourceSQL, self.table.targetSQL), (self.fromNode, self.table.pack_target(target))) self.table.cursor.execute(sql, params) if self.table.cursor.rowcount < 1: # no rows deleted? raise KeyError('no edge from node to target') def iterator_query(self): sql, params = self.table._format_query('select %s,%s from %s where \ %s=%%s and %s is not null' % (self.table.targetSQL, self.table.edgeSQL, self.table.name, self.table.sourceSQL, self.table.targetSQL), (self.fromNode, )) self.table.cursor.execute(sql, params) return self.table.cursor.fetchall() def keys(self): return [self.table.unpack_target(target_id) for target_id, edge_id in self.iterator_query()] def values(self): return [self.table.unpack_edge(edge_id) for target_id, edge_id in self.iterator_query()] def edges(self): return [(self.table.unpack_source(self.fromNode), self.table.unpack_target(target_id), self.table.unpack_edge(edge_id)) for target_id, edge_id in self.iterator_query()] def items(self): return [(self.table.unpack_target(target_id), self.table.unpack_edge(edge_id)) for target_id, edge_id in self.iterator_query()] def __iter__(self): return iter(self.keys()) def itervalues(self): return iter(self.values()) def iteritems(self): return iter(self.items()) def __len__(self): return len(self.keys()) __cmp__ = graph_cmp class SQLEdgelessDict(SQLEdgeDict): 'for SQLGraph tables that lack edge_id column' def __getitem__(self, target): sql, params = self.table._format_query('select %s from %s where \ %s=%%s and %s=%%s limit 2' % (self.table.targetSQL, self.table.name, self.table.sourceSQL, self.table.targetSQL), (self.fromNode, self.table.pack_target(target))) self.table.cursor.execute(sql, params) l = self.table.cursor.fetchmany(2) if len(l) != 1: raise KeyError('either no edge from source to target \ or not unique!') return None # no edge info! def iterator_query(self): sql, params = self.table._format_query('select %s from %s where \ %s=%%s and %s is not null' % (self.table.targetSQL, self.table.name, self.table.sourceSQL, self.table.targetSQL), (self.fromNode, )) self.table.cursor.execute(sql, params) return [(t[0], None) for t in self.table.cursor.fetchall()] SQLEdgeDict._edgelessClass = SQLEdgelessDict class SQLGraphEdgeDescriptor(object): 'provide an SQLEdges interface on demand' def __get__(self, obj, objtype): try: attrAlias = obj.attrAlias.copy() except AttributeError: return SQLEdges(obj.name, obj.cursor, graph=obj) else: return SQLEdges(obj.name, obj.cursor, attrAlias=attrAlias, graph=obj) def getColumnTypes(createTable, attrAlias={}, defaultColumnType='int', columnAttrs=('source', 'target', 'edge'), **kwargs): 'return list of [(colname, coltype), ...] for source, target, edge' l = [] for attr in columnAttrs: try: attrName = attrAlias[attr + '_id'] except KeyError: attrName = attr + '_id' try: # SEE IF USER SPECIFIED A DESIRED TYPE l.append((attrName, createTable[attr + '_id'])) continue except (KeyError, TypeError): pass try: # get type info from primary key for that database db = kwargs[attr + 'DB'] if db is None: raise KeyError # FORCE IT TO USE DEFAULT TYPE except KeyError: pass else: # INFER THE COLUMN TYPE FROM THE ASSOCIATED DATABASE KEYS... it = iter(db) try: # GET ONE IDENTIFIER FROM THE DATABASE k = it.next() except StopIteration: # Table is empty, read the SQL type from db. try: l.append((attrName, db.columnType[db.primary_key])) continue except AttributeError: pass else: # GET THE TYPE FROM THIS IDENTIFIER if isinstance(k, int) or isinstance(k, long): l.append((attrName, 'int')) continue elif isinstance(k, str): l.append((attrName, 'varchar(32)')) continue else: raise ValueError('SQLGraph node/edge must be int or str!') l.append((attrName, defaultColumnType)) logger.warn('no type info found for %s, so using default: %s' % (attrName, defaultColumnType)) return l class SQLGraph(SQLTableMultiNoCache): '''provide a graph interface via a SQL table. Key capabilities are: - setitem with an empty dictionary: a dummy operation - getitem with a key that exists: return a placeholder - setitem with non empty placeholder: again a dummy operation EXAMPLE TABLE SCHEMA: create table mygraph (source_id int not null,target_id int,edge_id int, unique(source_id,target_id)); ''' _distinct_key = 'source_id' _pickleAttrs = SQLTableMultiNoCache._pickleAttrs.copy() _pickleAttrs.update(dict(sourceDB=0, targetDB=0, edgeDB=0, allowMissingNodes=0)) _edgeClass = SQLEdgeDict def __init__(self, name, *l, **kwargs): graphArgs, tableArgs = split_kwargs(kwargs, ('attrAlias', 'defaultColumnType', 'columnAttrs', 'sourceDB', 'targetDB', 'edgeDB', 'simpleKeys', 'unpack_edge', 'edgeDictClass', 'graph')) if 'createTable' in kwargs: # CREATE A SCHEMA FOR THIS TABLE c = getColumnTypes(**kwargs) tableArgs['createTable'] = \ 'create table %s (%s %s not null,%s %s,%s %s,unique(%s,%s))' \ % (name, c[0][0], c[0][1], c[1][0], c[1][1], c[2][0], c[2][1], c[0][0], c[1][0]) try: self.allowMissingNodes = kwargs['allowMissingNodes'] except KeyError: pass SQLTableMultiNoCache.__init__(self, name, *l, **tableArgs) self.sourceSQL = self._attrSQL('source_id') self.targetSQL = self._attrSQL('target_id') try: self.edgeSQL = self._attrSQL('edge_id') except AttributeError: self.edgeSQL = None self._edgeClass = self._edgeClass._edgelessClass save_graph_db_refs(self, **kwargs) def __getitem__(self, k): return self._edgeClass(self.pack_source(k), self) def __iadd__(self, k): sql, params = self._format_query('delete from %s where %s=%%s and %s \ is null' % (self.name, self.sourceSQL, self.targetSQL), (self.pack_source(k), )) self.cursor.execute(sql, params) sql, params = self._format_query('insert %%(IGNORE)s into %s values \ (%%s,NULL,NULL)' % self.name, (self.pack_source(k), )) self.cursor.execute(sql, params) return self # iadd MUST RETURN SELF! def __isub__(self, k): sql, params = self._format_query('delete from %s where %s=%%s' % (self.name, self.sourceSQL), (self.pack_source(k), )) self.cursor.execute(sql, params) if self.cursor.rowcount == 0: raise KeyError('node not found in graph') return self # iadd MUST RETURN SELF! __setitem__ = graph_setitem def __contains__(self, k): sql, params = self._format_query('select * from %s where %s=%%s \ limit 1' % (self.name, self.sourceSQL), (self.pack_source(k), )) self.cursor.execute(sql, params) l = self.cursor.fetchmany(2) return len(l) > 0 def __invert__(self): 'get an interface to the inverse graph mapping' try: # CACHED return self._inverse except AttributeError: # CONSTRUCT INTERFACE TO INVERSE MAPPING attrAlias = dict(source_id=self.targetSQL, # SWAP SOURCE & TARGET target_id=self.sourceSQL, edge_id=self.edgeSQL) if self.edgeSQL is None: # no edge interface del attrAlias['edge_id'] self._inverse = SQLGraph(self.name, self.cursor, attrAlias=attrAlias, **graph_db_inverse_refs(self)) self._inverse._inverse = self return self._inverse def __iter__(self): for k in SQLTableMultiNoCache.__iter__(self): yield self.unpack_source(k) def iteritems(self): for k in SQLTableMultiNoCache.__iter__(self): yield (self.unpack_source(k), self._edgeClass(k, self)) def itervalues(self): for k in SQLTableMultiNoCache.__iter__(self): yield self._edgeClass(k, self) def keys(self): return [self.unpack_source(k) for k in SQLTableMultiNoCache.keys(self)] def values(self): return list(self.itervalues()) def items(self): return list(self.iteritems()) edges=SQLGraphEdgeDescriptor() update = update_graph def __len__(self): 'get number of source nodes in graph' self.cursor.execute('select count(distinct %s) from %s' % (self.sourceSQL, self.name)) return self.cursor.fetchone()[0] __cmp__ = graph_cmp override_rich_cmp(locals()) # MUST OVERRIDE __eq__ ETC. TO USE OUR __cmp__! ## def __cmp__(self, other): ## node = () ## n = 0 ## d = None ## it = iter(self.edges) ## while True: ## try: ## source, target, edge = it.next() ## except StopIteration: ## source = None ## if source != node: ## if d is not None: ## diff = cmp(n_target, len(d)) ## if diff != 0: ## return diff ## if source is None: ## break ## node = source ## n += 1 # COUNT SOURCE NODES ## n_target = 0 ## try: ## d = other[node] ## except KeyError: ## return 1 ## try: ## diff = cmp(edge, d[target]) ## except KeyError: ## return 1 ## if diff != 0: ## return diff ## n_target += 1 # COUNT TARGET NODES FOR THIS SOURCE ## return cmp(n, len(other)) add_standard_packing_methods(locals()) ############ PACK / UNPACK METHODS class SQLIDGraph(SQLGraph): add_trivial_packing_methods(locals()) SQLGraph._IDGraphClass = SQLIDGraph class SQLEdgeDictClustered(dict): 'simple cache for 2nd level dictionary of target_id:edge_id' def __init__(self, g, fromNode): self.g = g self.fromNode = fromNode dict.__init__(self) def __iadd__(self, l): for target_id, edge_id in l: dict.__setitem__(self, target_id, edge_id) return self # iadd MUST RETURN SELF! class SQLEdgesClusteredDescr(object): def __get__(self, obj, objtype): e = SQLEdgesClustered(obj.table, obj.edge_id, obj.source_id, obj.target_id, graph=obj, **graph_db_inverse_refs(obj, True)) for source_id, d in obj.d.iteritems(): # COPY EDGE CACHE e.load([(edge_id, source_id, target_id) for (target_id, edge_id) in d.iteritems()]) return e class SQLGraphClustered(object): 'SQL graph with clustered caching -- loads an entire cluster at a time' _edgeDictClass = SQLEdgeDictClustered def __init__(self, table, source_id='source_id', target_id='target_id', edge_id='edge_id', clusterKey=None, **kwargs): import types if isinstance(table, types.StringType): # CREATE THE TABLE INTERFACE if clusterKey is None: raise ValueError('you must provide a clusterKey argument!') if 'createTable' in kwargs: # CREATE A SCHEMA FOR THIS TABLE c = getColumnTypes(attrAlias=dict(source_id=source_id, target_id=target_id, edge_id=edge_id), **kwargs) kwargs['createTable'] = 'create table %s (%s %s not null,%s \ %s,%s %s,unique(%s,%s))' % (table, c[0][0], c[0][1], c[1][0], c[1][1], c[2][0], c[2][1], c[0][0], c[1][0]) table = SQLTableClustered(table, clusterKey=clusterKey, **kwargs) self.table = table self.source_id = source_id self.target_id = target_id self.edge_id = edge_id self.d = {} save_graph_db_refs(self, **kwargs) _pickleAttrs = dict(table=0, source_id=0, target_id=0, edge_id=0, sourceDB=0, targetDB=0, edgeDB=0) def __getstate__(self): state = standard_getstate(self) state['d'] = {} # UNPICKLE SHOULD RESTORE GRAPH WITH EMPTY CACHE return state def __getitem__(self, k): 'get edgeDict for source node k, from cache or by loading its cluster' try: # GET DIRECTLY FROM CACHE return self.d[k] except KeyError: if hasattr(self, '_isLoaded'): raise # ENTIRE GRAPH LOADED, SO k REALLY NOT IN THIS GRAPH # HAVE TO LOAD THE ENTIRE CLUSTER CONTAINING THIS NODE sql, params = self.table._format_query('select t2.%s,t2.%s,t2.%s \ from %s t1,%s t2 where t1.%s=%%s and t1.%s=t2.%s group by t2.%s' % (self.source_id, self.target_id, self.edge_id, self.table.name, self.table.name, self.source_id, self.table.clusterKey, self.table.clusterKey, self.table.primary_key), (self.pack_source(k), )) self.table.cursor.execute(sql, params) self.load(self.table.cursor.fetchall()) # CACHE THIS CLUSTER return self.d[k] # RETURN EDGE DICT FOR THIS NODE def load(self, l=None, unpack=True): 'load the specified rows (or all, if None provided) into local cache' if l is None: try: # IF ALREADY LOADED, NO NEED TO DO ANYTHING return self._isLoaded except AttributeError: pass self.table.cursor.execute('select %s,%s,%s from %s' % (self.source_id, self.target_id, self.edge_id, self.table.name)) l = self.table.cursor.fetchall() self._isLoaded = True # Clear our cache as load() will replicate everything. self.d.clear() for source, target, edge in l: # SAVE TO OUR CACHE if unpack: source = self.unpack_source(source) target = self.unpack_target(target) edge = self.unpack_edge(edge) try: self.d[source] += [(target, edge)] except KeyError: d = self._edgeDictClass(self, source) d += [(target, edge)] self.d[source] = d def __invert__(self): 'interface to reverse graph mapping' try: return self._inverse # INVERSE MAP ALREADY EXISTS except AttributeError: pass # JUST CREATE INTERFACE WITH SWAPPED TARGET & SOURCE self._inverse = SQLGraphClustered(self.table, self.target_id, self.source_id, self.edge_id, **graph_db_inverse_refs(self)) self._inverse._inverse = self for source, d in self.d.iteritems(): # INVERT OUR CACHE self._inverse.load([(target, source, edge) for (target, edge) in d.iteritems()], unpack=False) return self._inverse edges=SQLEdgesClusteredDescr() # CONSTRUCT EDGE INTERFACE ON DEMAND update = update_graph add_standard_packing_methods(locals()) ############ PACK / UNPACK METHODS def __iter__(self): ################# ITERATORS 'uses db select; does not force load' return iter(self.keys()) def keys(self): 'uses db select; does not force load' self.table.cursor.execute('select distinct(%s) from %s' % (self.source_id, self.table.name)) return [self.unpack_source(t[0]) for t in self.table.cursor.fetchall()] methodFactory(['iteritems', 'items', 'itervalues', 'values'], 'lambda self: (self.load(), self.d.%s())[1]', locals()) def __contains__(self, k): try: x = self[k] return True except KeyError: return False class SQLIDGraphClustered(SQLGraphClustered): add_trivial_packing_methods(locals()) SQLGraphClustered._IDGraphClass = SQLIDGraphClustered class SQLEdgesClustered(SQLGraphClustered): 'edges interface for SQLGraphClustered' _edgeDictClass = list _pickleAttrs = SQLGraphClustered._pickleAttrs.copy() _pickleAttrs.update(dict(graph=0)) def keys(self): self.load() result = [] for edge_id, l in self.d.iteritems(): for source_id, target_id in l: result.append((self.graph.unpack_source(source_id), self.graph.unpack_target(target_id), self.graph.unpack_edge(edge_id))) return result class ForeignKeyInverse(object): 'map each key to a single value according to its foreign key' def __init__(self, g): self.g = g def __getitem__(self, obj): self.check_obj(obj) source_id = getattr(obj, self.g.keyColumn) if source_id is None: return None return self.g.sourceDB[source_id] def __setitem__(self, obj, source): self.check_obj(obj) if source is not None: # Ensures performing all the right caching operations. self.g[source][obj] = None else: # DELETE PRE-EXISTING EDGE IF PRESENT if not hasattr(obj, '_localOnly'): # Only cache, don't save to database. old_source = self[obj] if old_source is not None: del self.g[old_source][obj] def check_obj(self, obj): 'raise KeyError if obj not from this db' try: if obj.db is not self.g.targetDB: raise AttributeError except AttributeError: raise KeyError('key is not from targetDB of this graph!') def __contains__(self, obj): try: self.check_obj(obj) return True except KeyError: return False def __iter__(self): return self.g.targetDB.itervalues() def keys(self): return self.g.targetDB.values() def iteritems(self): for obj in self: source_id = getattr(obj, self.g.keyColumn) if source_id is None: yield obj, None else: yield obj, self.g.sourceDB[source_id] def items(self): return list(self.iteritems()) def itervalues(self): for obj, val in self.iteritems(): yield val def values(self): return list(self.itervalues()) def __invert__(self): return self.g class ForeignKeyEdge(dict): '''edge interface to a foreign key in an SQL table. Caches dict of target nodes in itself; provides dict interface. Adds or deletes edges by setting foreign key values in the table''' def __init__(self, g, k): dict.__init__(self) self.g = g self.src = k for v in g.targetDB.select('where %s=%%s' % g.keyColumn, (k.id, )): dict.__setitem__(self, v, None) # SAVE IN CACHE def __setitem__(self, dest, v): if not hasattr(dest, 'db') or dest.db is not self.g.targetDB: raise KeyError('dest is not in the targetDB bound to this graph!') if v is not None: raise ValueError('sorry,this graph cannot store edge information!') if not hasattr(dest, '_localOnly'): # Only cache, don't save to database. old_source = self.g._inverse[dest] # CHECK FOR PRE-EXISTING EDGE if old_source is not None: # REMOVE OLD EDGE FROM CACHE dict.__delitem__(self.g[old_source], dest) #self.g.targetDB._update(dest.id, self.g.keyColumn, self.src.id) # SAVE TO DB setattr(dest, self.g.keyColumn, self.src.id) # SAVE TO DB ATTRIBUTE dict.__setitem__(self, dest, None) # SAVE IN CACHE def __delitem__(self, dest): #self.g.targetDB._update(dest.id, self.g.keyColumn, None) # REMOVE FOREIGN KEY VALUE setattr(dest, self.g.keyColumn, None) # SAVE TO DB ATTRIBUTE dict.__delitem__(self, dest) # REMOVE FROM CACHE class ForeignKeyGraph(object, UserDict.DictMixin): '''graph interface to a foreign key in an SQL table Caches dict of target nodes in itself; provides dict interface. ''' def __init__(self, sourceDB, targetDB, keyColumn, autoGC=True, **kwargs): '''sourceDB is any database of source nodes; targetDB must be an SQL database of target nodes; keyColumn is the foreign key column name in targetDB for looking up sourceDB IDs.''' if autoGC: # automatically garbage collect unused objects self._weakValueDict = RecentValueDictionary(autoGC) # object cache else: self._weakValueDict = {} self.autoGC = autoGC self.sourceDB = sourceDB self.targetDB = targetDB self.keyColumn = keyColumn self._inverse = ForeignKeyInverse(self) _pickleAttrs = dict(sourceDB=0, targetDB=0, keyColumn=0, autoGC=0) __getstate__ = standard_getstate ########### SUPPORT FOR PICKLING __setstate__ = standard_setstate def _inverse_schema(self): '''Provide custom schema rule for inverting this graph... Just use keyColumn!''' return dict(invert=True, uniqueMapping=True) def __getitem__(self, k): if not hasattr(k, 'db') or k.db is not self.sourceDB: raise KeyError('object is not in the sourceDB bound \ to this graph!') try: return self._weakValueDict[k.id] # get from cache except KeyError: pass d = ForeignKeyEdge(self, k) self._weakValueDict[k.id] = d # save in cache return d def __setitem__(self, k, v): raise KeyError('''do not save as g[k]=v. Instead follow a graph interface: g[src]+=dest, or g[src][dest]=None (no edge info allowed)''') def __delitem__(self, k): raise KeyError('''Instead of del g[k], follow a graph interface: del g[src][dest]''') def keys(self): return self.sourceDB.values() __invert__ = standard_invert def describeDBTables(name, cursor, idDict): """ Get table info about database via , and store primary keys in idDict, along with a list of the tables each key indexes. """ cursor.execute('use %s' % name) cursor.execute('show tables') tables = {} l = [c[0] for c in cursor.fetchall()] for t in l: tname = name + '.' + t o = SQLTable(tname, cursor) tables[tname] = o for f in o.description: if f == o.primary_key: idDict.setdefault(f, []).append(o) elif f[-3:] == '_id' and f not in idDict: idDict[f] = [] return tables def indexIDs(tables, idDict=None): "Get an index of primary keys in the dictionary." if idDict == None: idDict = {} for o in tables.values(): if o.primary_key: # Maintain a list of tables with this primary key. if o.primary_key not in idDict: idDict[o.primary_key] = [] idDict[o.primary_key].append(o) for f in o.description: if f[-3:] == '_id' and f not in idDict: idDict[f] = [] return idDict def suffixSubset(tables, suffix): "Filter table index for those matching a specific suffix" subset = {} for name, t in tables.items(): if name.endswith(suffix): subset[name] = t return subset PRIMARY_KEY=1 def graphDBTables(tables, idDict): g = dictgraph() for t in tables.values(): for f in t.description: if f == t.primary_key: edgeInfo = PRIMARY_KEY else: edgeInfo = None g.setEdge(f, t, edgeInfo) g.setEdge(t, f, edgeInfo) return g SQLTypeTranslation = {types.StringType: 'varchar(32)', types.IntType: 'int', types.FloatType: 'float'} def createTableFromRepr(rows, tableName, cursor, typeTranslation=None, optionalDict=None, indexDict=()): """Save rows into SQL tableName using cursor, with optional translations of columns to specific SQL types (specified by typeTranslation dict). - optionDict can specify columns that are allowed to be NULL. - indexDict can specify columns that must be indexed; columns whose names end in _id will be indexed by default. - rows must be an iterator which in turn returns dictionaries, each representing a tuple of values (indexed by their column names). """ try: row = rows.next() # GET 1ST ROW TO EXTRACT COLUMN INFO except StopIteration: return # IF rows EMPTY, NO NEED TO SAVE ANYTHING, SO JUST RETURN try: createTableFromRow(cursor, tableName, row, typeTranslation, optionalDict, indexDict) except: pass storeRow(cursor, tableName, row) # SAVE OUR FIRST ROW for row in rows: # NOW SAVE ALL THE ROWS storeRow(cursor, tableName, row) def createTableFromRow(cursor, tableName, row, typeTranslation=None, optionalDict=None, indexDict=()): create_defs = [] for col, val in row.items(): # PREPARE SQL TYPES FOR COLUMNS coltype = None if typeTranslation != None and col in typeTranslation: coltype = typeTranslation[col] # USER-SUPPLIED TRANSLATION elif type(val) in SQLTypeTranslation: coltype = SQLTypeTranslation[type(val)] else: # SEARCH FOR A COMPATIBLE TYPE for t in SQLTypeTranslation: if isinstance(val, t): coltype = SQLTypeTranslation[t] break if coltype == None: raise TypeError("Don't know SQL type to use for %s" % col) create_def = '%s %s' % (col, coltype) if optionalDict == None or col not in optionalDict: create_def += ' not null' create_defs.append(create_def) for col in row: # CREATE INDEXES FOR ID COLUMNS if col[-3:] == '_id' or col in indexDict: create_defs.append('index(%s)' % col) cmd = 'create table if not exists %s (%s)' % (tableName, ','.join(create_defs)) cursor.execute(cmd) # CREATE THE TABLE IN THE DATABASE def storeRow(cursor, tableName, row): row_format = ','.join(len(row) * ['%s']) cmd = 'insert into %s values (%s)' % (tableName, row_format) cursor.execute(cmd, tuple(row.values())) def storeRowDelayed(cursor, tableName, row): row_format = ','.join(len(row) * ['%s']) cmd = 'insert delayed into %s values (%s)' % (tableName, row_format) cursor.execute(cmd, tuple(row.values())) class TableGroup(dict): 'provide attribute access to dbname qualified tablenames' def __init__(self, db='test', suffix=None, **kw): dict.__init__(self) self.db=db if suffix is not None: self.suffix=suffix for k, v in kw.items(): if v is not None and '.' not in v: v=self.db+'.'+v # ADD DATABASE NAME AS PREFIX self[k]=v def __getattr__(self, k): return self[k] def sqlite_connect(*args, **kwargs): sqlite = import_sqlite() connection = sqlite.connect(*args, **kwargs) cursor = connection.cursor() return connection, cursor class DBServerInfo(object): 'picklable reference to a database server' def __init__(self, moduleName='MySQLdb', serverSideCursors=False, blockIterators=True, *args, **kwargs): try: self.__class__ = _DBServerModuleDict[moduleName] except KeyError: raise ValueError('Module name not found in _DBServerModuleDict: '\ + moduleName) self.moduleName = moduleName self.args = args # connection arguments self.kwargs = kwargs self.serverSideCursors = serverSideCursors self.custom_iter_keys = blockIterators if self.serverSideCursors and not self.custom_iter_keys: raise ValueError('serverSideCursors=True requires \ blockIterators=True!') def cursor(self): """returns cursor associated with the DB server info (reused)""" try: return self._cursor except AttributeError: self._start_connection() return self._cursor def new_cursor(self, arraysize=None): """returns a NEW cursor; you must close it yourself! """ if not hasattr(self, '_connection'): self._start_connection() cursor = self._connection.cursor() if arraysize is not None: cursor.arraysize = arraysize return cursor def close(self): """Close file containing this database""" self._cursor.close() self._connection.close() del self._cursor del self._connection def __getstate__(self): """return all picklable arguments""" return dict(args=self.args, kwargs=self.kwargs, moduleName=self.moduleName, serverSideCursors=self.serverSideCursors, custom_iter_keys=self.custom_iter_keys) class MySQLServerInfo(DBServerInfo): 'customized for MySQLdb SSCursor support via new_cursor()' _serverType = 'mysql' def _start_connection(self): self._connection, self._cursor = mysql_connect(*self.args, **self.kwargs) def new_cursor(self, arraysize=None): 'provide streaming cursor support' if not self.serverSideCursors: # use regular MySQLdb cursor return DBServerInfo.new_cursor(self, arraysize) try: conn = self._conn_sscursor except AttributeError: self._conn_sscursor, cursor = mysql_connect(useStreaming=True, *self.args, **self.kwargs) else: cursor = self._conn_sscursor.cursor() if arraysize is not None: cursor.arraysize = arraysize return cursor def close(self): DBServerInfo.close(self) try: self._conn_sscursor.close() del self._conn_sscursor except AttributeError: pass def iter_keys(self, db, cursor, map_f=iter, cache_f=lambda x: [t[0] for t in x], **kwargs): block_iterator = BlockIterator(db, cursor, **kwargs) try: cache_f = block_iterator.cache_f except AttributeError: pass return db.generic_iterator(cursor=cursor, cache_f=cache_f, map_f=map_f, fetch_f=block_iterator) class CursorCloser(object): """container for ensuring cursor.close() is called, when this obj deleted. For Python 2.5+, we could replace this with a try... finally clause in a generator function such as generic_iterator(); see PEP 342 or What's New in Python 2.5. """ def __init__(self, cursor): self.cursor = cursor def __del__(self): self.cursor.close() class BlockIterator(CursorCloser): 'workaround for MySQLdb iteration horrible performance' def __init__(self, db, cursor, selectCols, whereClause='', **kwargs): self.db = db self.cursor = cursor self.selectCols = selectCols self.kwargs = kwargs self.whereClause = '' if kwargs['orderBy']: # use iterSQL/iterColumns for WHERE / SELECT self.whereSQL = db.iterSQL if selectCols == '*': # extracting all columns self.whereParams = [db.data[col] for col in db.iterColumns] else: # selectCols is single column iterColumns = list(db.iterColumns) try: # if selectCols in db.iterColumns, just use that i = iterColumns.index(selectCols) except ValueError: # have to append selectCols i = len(db.iterColumns) iterColumns += [selectCols] self.selectCols = ','.join(iterColumns) self.whereParams = range(len(db.iterColumns)) if i > 0: # need to extract desired column self.cache_f = lambda x: [t[i] for t in x] else: # just use primary key self.whereSQL = 'WHERE %s>%%s' % db.primary_key self.whereParams = (db.data[db.primary_key],) self.params = () self.done = False def __call__(self): 'get the next block of data' if self.done: return () self.db._select(self.whereClause, self.params, cursor=self.cursor, limit='LIMIT %s' % self.cursor.arraysize, selectCols=self.selectCols, **(self.kwargs)) rows = self.cursor.fetchall() if len(rows) < self.cursor.arraysize: # iteration complete self.done = True return rows lastrow = rows[-1] # extract params from the last row in this block if len(lastrow) > 1: self.params = [lastrow[icol] for icol in self.whereParams] else: self.params = lastrow self.whereClause = self.whereSQL return rows class SQLiteServerInfo(DBServerInfo): """picklable reference to a sqlite database""" _serverType = 'sqlite' def __init__(self, database, *args, **kwargs): """Takes same arguments as sqlite3.connect()""" DBServerInfo.__init__(self, 'sqlite3', # save abs path! database=SourceFileName(database), *args, **kwargs) def _start_connection(self): self._connection, self._cursor = sqlite_connect(*self.args, **self.kwargs) def __getstate__(self): database = self.kwargs.get('database', False) or self.args[0] if database == ':memory:': raise ValueError('SQLite in-memory database is not picklable!') return DBServerInfo.__getstate__(self) # list of DBServerInfo subclasses for different modules _DBServerModuleDict = dict(MySQLdb=MySQLServerInfo, sqlite3=SQLiteServerInfo) class MapView(object, UserDict.DictMixin): 'general purpose 1:1 mapping defined by any SQL query' def __init__(self, sourceDB, targetDB, viewSQL, cursor=None, serverInfo=None, inverseSQL=None, **kwargs): self.sourceDB = sourceDB self.targetDB = targetDB self.viewSQL = viewSQL self.inverseSQL = inverseSQL if cursor is None: if serverInfo is not None: # get cursor from serverInfo cursor = serverInfo.cursor() else: try: # can we get it from our other db? serverInfo = sourceDB.serverInfo except AttributeError: raise ValueError('you must provide serverInfo or cursor!') else: cursor = serverInfo.cursor() self.cursor = cursor self.serverInfo = serverInfo self.get_sql_format(False) # get sql formatter for this db interface _schemaModuleDict = _schemaModuleDict # default module list get_sql_format = get_table_schema def __getitem__(self, k): if not hasattr(k, 'db') or k.db is not self.sourceDB: raise KeyError('object is not in the sourceDB bound to this map!') sql, params = self._format_query(self.viewSQL, (k.id, )) self.cursor.execute(sql, params) # formatted for this db interface t = self.cursor.fetchmany(2) # get at most two rows if len(t) != 1: raise KeyError('%s not found in MapView, or not unique' % str(k)) return self.targetDB[t[0][0]] # get the corresponding object _pickleAttrs = dict(sourceDB=0, targetDB=0, viewSQL=0, serverInfo=0, inverseSQL=0) __getstate__ = standard_getstate __setstate__ = standard_setstate __setitem__ = __delitem__ = clear = pop = popitem = update = \ setdefault = read_only_error def __iter__(self): 'only yield sourceDB items that are actually in this mapping!' for k in self.sourceDB.itervalues(): try: self[k] yield k except KeyError: pass def keys(self): return [k for k in self] # don't use list(self); causes infinite loop! def __invert__(self): try: return self._inverse except AttributeError: if self.inverseSQL is None: raise ValueError('this MapView has no inverseSQL!') self._inverse = self.__class__(self.targetDB, self.sourceDB, self.inverseSQL, self.cursor, serverInfo=self.serverInfo, inverseSQL=self.viewSQL) self._inverse._inverse = self return self._inverse class GraphViewEdgeDict(UserDict.DictMixin): 'edge dictionary for GraphView: just pre-loaded on init' def __init__(self, g, k): self.g = g self.k = k sql, params = self.g._format_query(self.g.viewSQL, (k.id, )) self.g.cursor.execute(sql, params) # run the query l = self.g.cursor.fetchall() # get results if len(l) <= 0: raise KeyError('key %s not in GraphView' % k.id) self.targets = [t[0] for t in l] # preserve order of the results d = {} # also keep targetID:edgeID mapping if self.g.edgeDB is not None: # save with edge info for t in l: d[t[0]] = t[1] else: for t in l: d[t[0]] = None self.targetDict = d def __len__(self): return len(self.targets) def __iter__(self): for k in self.targets: yield self.g.targetDB[k] def keys(self): return list(self) def iteritems(self): if self.g.edgeDB is not None: # save with edge info for k in self.targets: yield (self.g.targetDB[k], self.g.edgeDB[self.targetDict[k]]) else: # just save the list of targets, no edge info for k in self.targets: yield (self.g.targetDB[k], None) def __getitem__(self, o, exitIfFound=False): 'for the specified target object, return its associated edge object' try: if o.db is not self.g.targetDB: raise KeyError('key is not part of targetDB!') edgeID = self.targetDict[o.id] except AttributeError: raise KeyError('key has no id or db attribute?!') if exitIfFound: return if self.g.edgeDB is not None: # return the edge object return self.g.edgeDB[edgeID] else: # no edge info return None def __contains__(self, o): try: self.__getitem__(o, True) # raise KeyError if not found return True except KeyError: return False __setitem__ = __delitem__ = clear = pop = popitem = update = \ setdefault = read_only_error class GraphView(MapView): 'general purpose graph interface defined by any SQL query' def __init__(self, sourceDB, targetDB, viewSQL, cursor=None, edgeDB=None, **kwargs): '''if edgeDB not None, viewSQL query must return (targetID, edgeID) tuples''' self.edgeDB = edgeDB MapView.__init__(self, sourceDB, targetDB, viewSQL, cursor, **kwargs) def __getitem__(self, k): if not hasattr(k, 'db') or k.db is not self.sourceDB: raise KeyError('object is not in the sourceDB bound to this map!') return GraphViewEdgeDict(self, k) _pickleAttrs = MapView._pickleAttrs.copy() _pickleAttrs.update(dict(edgeDB=0)) class SQLSequence(SQLRow, SequenceBase): """Transparent access to a DB row representing a sequence. Use attrAlias dict to rename 'length' to something else. """ def _init_subclass(cls, db, **kwargs): db.seqInfoDict = db # db will act as its own seqInfoDict SQLRow._init_subclass(db=db, **kwargs) _init_subclass = classmethod(_init_subclass) def __init__(self, id): SQLRow.__init__(self, id) SequenceBase.__init__(self) def __len__(self): return self.length def strslice(self, start, end): "Efficient access to slice of a sequence, useful for huge contigs" return self._select('%%(SUBSTRING)s(%s %%(SUBSTR_FROM)s %d \ %%(SUBSTR_FOR)s %d)' % (self.db._attrSQL('seq'), start + 1, end - start)) class DNASQLSequence(SQLSequence): _seqtype=DNA_SEQTYPE class RNASQLSequence(SQLSequence): _seqtype=RNA_SEQTYPE class ProteinSQLSequence(SQLSequence): _seqtype=PROTEIN_SEQTYPE PKðŠ’;®Sëëpygr/sqlgraph.pyc;ò ÍÊKc @södklZdkTdklZlZlZlZdkZdk l Z l Z l Z l Z lZlZlZlZlZlZlZlZdkZdkZdkZdkZdkZdefd„ƒYZdefd„ƒYZd efd „ƒYZd efd „ƒYZd efd„ƒYZ defd„ƒYZ!d„Z"d„Z#d„Z$defd„ƒYZ%d„Z&de%fd„ƒYZ'e'e%_(defd„ƒYZ)de)fd„ƒYZ*e*e)_+defd„ƒYZ,de,fd „ƒYZ-e-e,_(d!„Z.e/d"„Z0e/e/e1d#„Z2e3d$d%d&d'd(d(d)d*d+d,d-d.ƒZ4e5d/„Z6e3d$d0d&d1d(d2d)d3d+d4d-d4ƒZ7d5„Z8e5d6„Z9d7efd8„ƒYZ:e5d9„Z;hd:e6<d;e9<d<e9„ƒYZ>d2e/d?„Z?e/d2e@d@„e/dA„ZAdBe>fdC„ƒYZBd2dD„ZCdEeBfdF„ƒYZDdGefdH„ƒYZEdIe>fdJ„ƒYZFeFe,_GdKe>fdL„ƒYZHdMeHfdN„ƒYZIdOefdP„ƒYZJdQeJfdR„ƒYZKeKeJ_LdSefdT„ƒYZMhdUdVdWdXfdY„ZNdZeHfd[„ƒYZOd\eOfd]„ƒYZPePeO_Qd^e3fd_„ƒYZRd`efda„ƒYZSdbefdc„ƒYZTddeTfde„ƒYZUeUeT_QdfeTfdg„ƒYZVdhefdi„ƒYZWdje3fdk„ƒYZXdleei=fdm„ƒYZYdn„ZZe/do„Z[dp„Z\dqZ]dr„Z^hei_ds<ei`dU<eiadtbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__scCs|i|iSdS(N(sobjs_datasselfsicol(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__scCstdƒ‚dS(Nsthis database is read-only!(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__s(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleDescriptors   sTupleIDDescriptorcBstZd„ZRS(NcCstdƒ‚dS(NsGYou cannot change obj.id directly. Instead, use db[newID] = obj(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__!s(s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleIDDescriptorssTupleDescriptorRWcBs tZdZd„Zd„ZRS(s'read-write interface to named attributecCs5||_|i||_|i|dtƒ|_dS(Ns sqlColumn(sattrsselfsdbsdatasicols_attrSQLsTruesattrSQL(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__)s cCs3|ii|i|i|ƒ|i|i|ƒdS(N( sobjsdbs_updatesidsselfsattrSQLsvals save_localsattr(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__.s(s__name__s __module__s__doc__s__init__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleDescriptorRW&s  s SQLDescriptorcBs)tZdZd„Zd„Zd„ZRS(s/return attribute value by querying the databasecCs|i|ƒ|_dS(N(sdbs_attrSQLsattrsselfs selectSQL(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__6scCs|i|iƒSdS(N(sobjs_selectsselfs selectSQL(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__9scCstdƒ‚dS(Nsthis database is read-only!(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__<s(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLDescriptor3s   sSQLDescriptorRWcBstZdZd„ZRS(s7writeable proxy to corresponding column in the databasecCs |ii|i|i|ƒdS(N(sobjsdbs_updatesidsselfs selectSQLsval(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__Cs(s__name__s __module__s__doc__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLDescriptorRW@s sReadOnlyDescriptorcBs)tZdZd„Zd„Zd„ZRS(s/enforce read-only policy, e.g. for ID attributecCsd||_dS(Ns_(sattrsself(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__JscCst||iƒSdS(N(sgetattrsobjsselfsattr(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__MscCstd|iƒ‚dS(Nsattribute %s is read-only!(sAttributeErrorsselfsattr(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__Ps(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysReadOnlyDescriptorGs   cCs´|iid||ii|iif|ifƒ\}}|ii i ||ƒ|ii i dƒ}t |ƒdjo,td|iit|iƒ|fƒ‚n|ddSdS(s4return value from SQL expression applied to this rows&select %s from %s where %s=%%s limit 2iis"%s[%s].%s not found, or not uniqueiN(srowsdbs _format_queryswhatsnames primary_keysidssqlsparamsscursorsexecutes fetchmanystslensKeyErrorsstr(srowswhatsparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselect_from_rowTs%,cCs­x¦|iD]›}|djo#t|||i||ƒƒq ny|i|dtƒWn/tj o#t|||i ||ƒƒq Xt|||i ||ƒƒq WdS(s!add descriptors for db attributessids columnNumberN( sdbsdatasattrssetattrsclss _idDescriptors_attrSQLsTruesAttributeErrors_sqlDescriptors_columnDescriptor(sclssdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinit_row_subclassas  !cCs|iiiƒSdS(s+get list of column names as our attributes N(sselfsdbsdataskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysdir_rowossTupleOcBsAtZdZeZeZeZe e ƒZ e Z eZd„ZRS(sæProvides attribute interface to a database tuple. Storing the data as a tuple instead of a standard Python object (which is stored using __dict__) uses about five-fold less memory and is also much faster (the tuples returned from the DB API fetch are simply referenced by the TupleO, with no need to copy their individual values into __dict__). This class follows the 'subclass binding' pattern, which means that instead of using __getattr__ to process all attribute requests (which is un-modular and leads to all sorts of trouble), we follow Python's new model for customizing attribute access, namely Descriptors. We use classutil.get_bound_subclass() to automatically create a subclass of this class, calling its _init_subclass() class method to add all the descriptors needed for the database table to which it is bound. See the Pygr Developer Guide section of the docs for a complete discussion of the subclass binding pattern.cCs ||_dS(N(sdatasselfs_data(sselfsdata((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s(s__name__s __module__s__doc__sTupleDescriptors_columnDescriptorsTupleIDDescriptors _idDescriptors SQLDescriptors_sqlDescriptors classmethodsinit_row_subclasss_init_subclasssselect_from_rows_selectsdir_rows__dir__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleOts  cKsT|ii|ƒy|d}Wn"tj o|iiƒ}nX|i|ƒdS(s0insert tuple into db and cache its rowID on selfsidN( sselfsdbs_insertslskwargssrowIDsKeyErrors get_insert_idscache_id(sselfslskwargssrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinsert_and_cache_id“ssTupleORWcBs8tZdZeZeZed„Zd„Zd„Z RS(sread-write version of TupleOcKsE| o||_dSn|ii|ƒ|_|i|i|dS(N(snewRowsdatasselfs_datasdbstuple_from_dictskwargssinsert_and_cache_id(sselfsdatasnewRowskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__¢s  cCs|id|ƒdS(Nsid(sselfs save_localsrow_id(sselfsrow_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscache_id©scCsW|i|}y||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys save_local¬s  ( s__name__s __module__s__doc__sTupleDescriptorRWs_columnDescriptorsinsert_and_cache_idsFalses__init__scache_ids save_local(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleORWs   sColumnDescriptorcBs,tZdZed„Zd„Zd„ZRS(sDread-write interface to column in a database, cached in obj.__dict__cCsE||_|i|dtƒ|_||_|o|i|_ndS(Ns sqlColumn( sattrsselfsdbs_attrSQLsTruescolsreadOnlys_readOnlyClasss __class__(sselfsdbsattrsreadOnly((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__»s   cCsÎy|i|iSWnµtj o©|i|iijo t‚n|ii d|ii|i f|iƒ|ii i ƒ}t|ƒdjotdƒ‚n|dd|i|i<|ddSnXdS(Ns where %s=%%sisdb row not found or not unique!i(sobjs__dict__sselfsattrsKeyErrorscolsdbs primary_keysAttributeErrors_selectsidscursorsfetchallslslen(sselfsobjsobjtypesl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__Ãs  cCsEt|dƒ o |ii|i|i|ƒn||i|i build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__Ñs (s__name__s __module__s__doc__sFalses__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysColumnDescriptor¸s   sReadOnlyColumnDesccBstZd„ZRS(NcCstdƒ‚dS(Ns-The ID of a database object is not writeable.(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__âs(s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysReadOnlyColumnDescàssSQLRowcBs?tZdZeZZeZee ƒZ e Z e Zd„ZRS(s¶Provide transparent interface to a row in the database: attribute access will be mapped to SELECT of the appropriate column, but data is not cached on this object. cCs ||_dS(N(srowIDsselfs_id(sselfsrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__òs(s__name__s __module__s__doc__s SQLDescriptors_columnDescriptors_sqlDescriptorsReadOnlyDescriptors _idDescriptors classmethodsinit_row_subclasss_init_subclasssselect_from_rows_selectsdir_rows__dir__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLRowçs   sSQLRowRWcBs/tZdZeZeZed„Zd„ZRS(sread-write version of SQLRowcKs?| o|i|ƒSn|ii|ƒ}|i||dS(N( snewRowsselfscache_idsrowIDsdbstuple_from_dictskwargsslsinsert_and_cache_id(sselfsrowIDsnewRowskwargssl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ûscCs ||_dS(N(srowIDsselfs_id(sselfsrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscache_ids( s__name__s __module__s__doc__sSQLDescriptorRWs_columnDescriptorsinsert_and_cache_idsFalses__init__scache_id(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLRowRWös  cCsTh}xCt|ƒD]5\}}y||||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys list_to_dicts  cKs–|tj of|iƒ}t|ƒdjoC|d}dddf}|iƒ}|it ||dƒƒqsnt |}||i ƒ|fSdS(s¶get table name and cursor by parsing name or using configFile. If neither provided, will try to get via your MySQL config file. If connect is None, will use MySQLdb.connect()iishostsuserspasswdN( snamesNonessplitsargListslensargnamesskwargsscopysupdates list_to_dicts DBServerInfos serverInfoscursor(snameskwargssargnamess serverInfosargList((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_name_cursors    " c Ks|iƒ}d|jo |tjo tiƒ} | ddfjoÇg}y-t i d} || df| dfg7}Wnt j onXyAt i d} || t iidf| t iidfg7}Wnt j onXt|ƒdjot|Œ}q-q1t iit iid ƒd ƒ}n|pt iit iƒd ƒ}|ot ii|ƒo||d ydkl}|i|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys mysql_connect"sH     4%"         sIGNOREsignoresREPLACEsreplacesAUTO_INCREMENTs SUBSTRINGs substrings SUBSTR_FROMsFROMs SUBSTR_FORsFORcCs™dk}t|itƒ|_| odSn|iƒ|ii d|i ƒ|ii ƒ}|ii d|i ƒxt |ƒD]\}}|d}|ii|ƒ|ddjoŽ|itjo ||_n=y|ii|ƒWn%tj o|i|g|_nX|dd iƒdjo t|_qit|_n#|dd jo||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysmysql_table_schemaTs6       s or ignoresinsert or replacesssubstrs,cCs8y dk}Wn tj odkl}nX|SdS(sIimport sqlite3 (for Python 2.5+) or pysqlite2 for earlier Python versionsN(sdbapi2(ssqlite3ssqlites ImportErrors pysqlite2sdbapi2(ssqlite((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys import_sqlitexs  c Csxtƒ}t|itƒ|_| odSn|iƒ|i i d|i ƒ|i i ƒ} |i i d|i ƒx\t| ƒD]N\} }|d}|ii|ƒ|i i| |i|<|d|i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyssqlite_table_schemasL     ! %. s SQLFormatDictc BsStZdZeddddddddddƒZhd „Zd „Zd „ZRS( sGPerform SQL keyword replacements for maintaining compatibility across a wide range of SQL backends. Uses Python dict-based string format function to do simple string replacements, and also to convert params list to the paramstyle required for this interface. Create by passing a dict of macros and the db-api paramstyle: sfd = SQLFormatDict("qmark", substitutionDict) Then transform queries+params as follows; input should be "format" style: sql,params = sfd("select * from foo where id=%s and val=%s", (myID,myVal)) cursor.execute(sql, params) spyformats%%(%d)ssnumerics:%dsnamedsqmarks(ignore)sformatcCs„|iƒ|_||_|i||_|djp |dj|_|djod|idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__¾s   cCsmy|i|SWntj onX|djo'|i|i}|id7_|Sntd|ƒ‚dS(s1apply correct substitution for this SQL interfaces?isunknown macro: %sN(sselfssubstitutionDictsksKeyErrors paramFormatsiparamss(sselfskss((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Ès cCs‚d|_|iddƒ}||}|ioEh}x.t|ƒD] \}}||t |dƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__call__Ôs    (s__name__s __module__s__doc__sdicts _paramFormatss__init__s __getitem__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLFormatDict¯s  cCs}y|iii}Wntj otdƒ‚nXy|i|}Wn#t j ot d|ƒ‚nX|||ƒdS(sCrun the right schema function based on type of db server connections'no cursor object or module information!s„unknown db module: %s. Use _schemaModuleDict attribute to supply a method for obtaining table schema for this moduleN( sselfscursors __class__s __module__smodnamesAttributeErrors ValueErrors_schemaModuleDicts schema_funcsKeyErrors analyzeSchema(sselfs analyzeSchemasmodnames schema_func((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_table_schemaãssMySQLdb.cursorsspysqlite2.dbapi2ssqlite3s SQLTableBasecBsâtZdZeZeZeeeeeeedeeeeeeeeed„Zd„Z d„Z d„Z e ddddd dd dd dd dd dddddddddddƒ Z eZd„Zd„Zd„Zeed„Zed„Zed„Zdfdeddd„Zeedd„Zd„Zd„Zd„Zd „Zed!„Zd"„Zd#„Zd$„Zeeee ed%„Z!d&„Z"d'„Z#d(„Z$d)„Z%d*„Z&d+„Z'd,„Z(d-„Z)RS(.sAStore information about an SQL table as dict keyed by primary keyicKs| ot| ƒ|_n h|_| |_||_|o| o | idjo:|o|o||f\|_|_qt dƒ‚n||_ |t jo9| t j o| i ƒ}qòt ||\}}} ntidtddƒ||_ |t j oR| o|id|ƒn|itƒ|i|fƒ\}}|i|ƒn||_|t j o ||_n|t j o ||_n| t j o| |_| |_n|iƒ|t j o||_||_nh|_ x*t!|i"ƒD]\}}||i |build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__üsn                               cCs%|iddƒ|iiƒdSdS(Ns selectColsscount(*)i(sselfs_selectscursorsfetchone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__BscCst|ƒSdS(N(sidsself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__hash__FscCs2||jodSntt|ƒt|ƒƒSdS(sonly match self and no other!iN(sselfsotherscmpsid(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__cmp__Is snameis clusterKeysmaxCaches arraysizes attrAliass serverInfosautoGCsorderBys writeablesiterSQLs iterColumnss primaryKeycCs|i|dS(N(sselfs__init__sstate(sselfsstate((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setstate__TscCsd|idSdS(Ns (sselfsname(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__repr__^scCs:h|_g|_h|_t|_t|_h|_dS(s+reset all schema information for this tableN(sselfs descriptions columnNames columnTypesNones usesIntIDs primary_keysindexed(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clear_schemaas     cCsfy|i|}Wn,tj o td||ifƒ‚nX|oty|i|SWq»t j oRy|i|i|SWq·tt fj o td||ifƒ‚q·Xq»Xn|oey |dSWq't j oFy|i|dSWq#tt fj ot d|ƒ‚q#Xq'Xnt |t iƒo |}n|djo |i}n|SdS(s=Translate python attribute name to appropriate SQL expressionsOattribute %s not a valid column or alias in %ssYattribute %s does not map to an SQL column in %sisOattribute %s does not map to a SQL column!sidN(sselfsdatasattrsfieldsKeyErrorsAttributeErrorsnames sqlColumns columnNames TypeErrors columnNumbers ValueErrors isinstancestypess StringTypes primary_key(sselfsattrs sqlColumns columnNumbersfield((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_attrSQLjs4'    cKsž|o|ii|ƒnx||iƒD]n\}}y|i|dt ‚Wq(t j o|i||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAlias‹s   cCs³|tj o ||_n|io|ii|_nt|d|idtd|ƒƒ}t |t ƒo|i |_ nt |dƒot||iƒ o|i|_ndS(sXCreate class representing a row in this table by subclassing oclass, adding datas itemClasss subclassArgssdbs _tableclassN(soclasssNonesselfs itemClasss writeables_RWClasssget_bound_subclasssnamesdicts issubclasssTupleOsdatas_attrcolshasattrs isinstances _tableclasss __class__(sselfsoclass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysobjclass¡s   $sst1.*cCsf|id||i|||f|ƒ\}}|t jo|i i ||ƒn|i ||ƒdS(s,execute the specified query but do not fetchsselect %s from %s t1 %s %s %sN( sselfs _format_querys selectColssnames whereClausesorderByslimitsparamsssqlscursorsNonesexecute(sselfs whereClausesparamss selectColsscursorsorderByslimitssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_select´s  ccsa|tjo |i}n|i|||ƒ|ii ƒ}x|D]}|i ||ƒVqCWdS(s=Generate the list of objects that satisfy the database SELECTN( soclasssNonesselfs itemClasss_selects whereClausesparamss selectColsscursorsfetchallslsts cacheItem(sselfs whereClausesparamssoclasss selectColsslst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselect¿s  cKsœg}g}xl|iƒD]^\}}|tjo|id|i |ƒƒq|id|i |ƒƒ|i|ƒqW|i ddi |ƒ|ƒSdS(sDquery for intersection of all specified kwargs, returned as iterators %s IS NULLs%s=%%sswhere s and N( scriteriasparamsskwargssitemssksvsNonesappendsselfs_attrSQLsselectsjoin(sselfskwargsscriteriasparamssvsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysqueryÈs  cCsH|id|i||if||fƒ\}}|i i ||ƒdS(sAupdate a single field in the specified row to the specified values!update %s set %s=%%s where %s=%%sN( sselfs _format_querysnamescols primary_keysvalsrow_idssqlsparamsscursorsexecute(sselfsrow_idscolsvalsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_updateÔscCsCy||idSWn)tj o||i|idSnXdS(Nsid(stsselfsdatas TypeError(sselfst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetIDÛscCsyy|i|ƒ}Wntj o||ƒSnXy|i|SWntj onX||ƒ}||i|<|SdS(s7get obj from cache if possible, or construct from tupleN(sselfsgetIDstsidsKeyErrorsoclasss_weakValueDictso(sselfstsoclasssosid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys cacheItemás  ccs?|tjo |i}nx|D]}|i||ƒVq!WdS(N(soclasssNonesselfs itemClasssrowssts cacheItem(sselfsrowssoclassst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys cache_itemsïs   cCs|id||fƒSdS(s9get iterator for objects with specified foreign key values where %s=%%sN(sselfsselectsattrsk(sselfsattrsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys foreignKeyõscCsHy.|it|iƒjo|iiƒnWntj onXdS(s"APPLY maxCache LIMIT TO CACHE SIZEN(sselfsmaxCacheslens_weakValueDictsclearsAttributeError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys limit_cacheùs cCs;y|ii}Wntj o tSnX||iƒSdS(s4Return a new cursor object, or None if not possible N(sselfs serverInfos new_cursorsAttributeErrorsNones arraysize(sselfs new_cursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_new_cursors  ccs°|tjo*|tjo|ii}q7|i}n|tjo |i}nxXtoP|iƒ|ƒ}t |ƒdjoPnx|||ƒƒD] }|Vq™WqTWdS(sgeneric iterator that runs fetch, cache and map functions. cursorHolder is used only to keep a ref in this function's locals, so that if it is prematurely terminated (by deleting its iterator), cursorHolder.__del__() will close the cursor.iN( sfetch_fsNonescursorsselfs fetchmanyscache_fs cache_itemssTrues limit_cachesrowsslensmap_fsv(sselfscursorsfetch_fscache_fsmap_fs cursorHoldersrowssv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgeneric_iterator s        cCsltgt|iƒ}xK|iiƒD]:\}}y||||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pystuple_from_dicts  cCsqtgt|iƒ}xP|iiƒD]?\}}yt ||ƒ||transform object attributes into tuple for storing in databaseN( sNoneslensselfs descriptionslsdatasitemsscolsicolsgetattrsobjsAttributeErrors TypeError(sselfsobjslsicolscol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pystuple_from_obj(s  cCs^d|iddidgt|ƒƒd}|i||ƒ\}}|i i ||ƒdS(sxinsert tuple into the database. Note this uses the MySQL extension REPLACE, which overwrites any duplicate key.s%(REPLACE)s into s values (s,s%ss)N( sselfsnamesjoinslenslsss _format_queryssqlsparamsscursorsexecute(sselfslsssparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_insert2s/cCs |i|ƒ}|i|ƒdS(s5insert new row by transforming obj to tuple of valuesN(sselfstuple_from_objsobjsls_insert(sselfsobjsl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinsert:scCsWy|ii}Wntj otdƒ‚nX|tjotdƒ‚n|SdS(s-get the primary key value for the last INSERTs your db lacks lastrowid support?s/lastrowid is None so cannot get ID from INSERT!N(sselfscursors lastrowidsauto_idsAttributeErrorsNotImplementedErrorsNones ValueError(sselfsauto_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys get_insert_id?s cKsK|i otdƒ‚n|itdt|}||i|i <|SdS(s=return a new record with the assigned attributes, added to DBsthis database is read only!snewRowN( sselfs writeables ValueErrors itemClasssNonesTrueskwargssobjs_weakValueDictsid(sselfskwargssobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysnewIs  cCs|iiƒdS(sempty the cacheN(sselfs_weakValueDictsclear(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clear_cacheQscCs|i otdƒ‚n|id|i|if|fƒ\}}|i i ||ƒy|i |=Wnt j onXdS(Nsthis database is read only!sdelete from %s where %s=%%s( sselfs writeables ValueErrors _format_querysnames primary_keyskssqlsparamsscursorsexecutes_weakValueDictsKeyError(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__Us (*s__name__s __module__s__doc__s_schemaModuleDictsget_table_schemasNonesFalsesTrues__init__s__len__s__hash__s__cmp__sdicts _pickleAttrssstandard_getstates __getstate__s __setstate__s__repr__s clear_schemas_attrSQLs addAttrAliassobjclasss_selectsselectsquerys_updatesgetIDs cacheItems cache_itemss foreignKeys limit_cachesget_new_cursorsitersgeneric_iteratorstuple_from_dictstuple_from_objs_insertsinserts get_insert_idsnews clear_caches __delitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLTableBase÷sH build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetKeysbs    cCs)gi}|D]}||dƒq~S(Ni(sappends_[1]sxst(sxs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysosc Ks&|tjo |i}n|djo |itj o |i}n|iƒ}|ot|idƒo |ii o2|ii ||d|d|d|d||Sq"|id|d|d|||id|d|d|dt|ƒƒSn/|tj ot|ƒƒSnt|iƒƒSd S( s8guarantee correct iteration insulated from other queriesss iter_keyss selectColssmap_fsorderByscache_fscursors cursorHolderN(s selectColssNonesselfs primary_keysorderBysget_new_cursorscursorshasattrs serverInfoscustom_iter_keyss iter_keyssmap_fscache_fskwargss_selectsgeneric_iterators CursorClosersget_fsiterskeys(sselfs selectColssorderBysmap_fscache_fsget_fskwargsscursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iter_keysns(        sSQLTablecBsbtZdZeZeZeZe d„Z d„Z d„Z d„Z d„Zd„Zd„ZRS(sRProvide on-the-fly access to rows in the database, caching the results in dictcCs˜y |iSWntj onX|tjo |i}n|iid|iƒ|ii ƒ}h|_ x|D]}|i ||ƒqqWt|_dS(sLoad all data from the tablesselect * from %sN(sselfs _isLoadedsAttributeErrorsoclasssNones itemClassscursorsexecutesnamesfetchallsls_weakValueDictsts cacheItemsTrue(sselfsoclassslst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysload’s    cCsÐy|i|SWnºtj o®|id|i|if|fƒ\}}|i i ||ƒ|i i dƒ}t |ƒdjo#tdt|ƒ|ifƒ‚n|iƒ|i|d|iƒSnXdS(NsRselect * from %s where %s=%%s limit 2iis!%s not found in %s, or not uniquei(sselfs_weakValueDictsksKeyErrors _format_querysnames primary_keyssqlsparamsscursorsexecutes fetchmanyslslensstrs limit_caches cacheItems itemClass(sselfskslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__¡s# cCsÊ|i otdƒ‚ny|i|j o t‚nWntj otdƒ‚nXy$|i}|tjo t‚nWntj on X||i=|i |ƒ|i |ƒ||i |build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__²s"      cCs=|iƒgi}|D]}||||fƒq~SdS(s'forces load of entire table into memoryN(sselfsloadsappends_[1]sk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsÆs c Cs)t|dddtdtd|iƒSdS(sAuses arraysize / maxCache and fetchmany() to manage data transfers selectColss*scache_fsmap_fsget_fN(s iter_keyssselfsNonesgenerate_itemssitems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsËscCs7|iƒgi}|D]}|||ƒq~SdS(s'forces load of entire table into memoryN(sselfsloadsappends_[1]sk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesÐs cCs#t|dddtd|iƒSdS(sAuses arraysize / maxCache and fetchmany() to manage data transfers selectColss*scache_fsget_fN(s iter_keyssselfsNonesvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervaluesÕs(s__name__s __module__s__doc__sTupleOs itemClasssgetKeysskeyss iter_keyss__iter__sNonesloads __getitem__s __setitem__sitemss iteritemssvaluess itervalues(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTable‹s       cCsY|iid|i|i|fƒgi}|iiƒD]}||dƒq:~SdS(s#uses db select; does not force loadsselect distinct %s from %s %siN( sselfscursorsexecutes clusterKeysnames queryOptionsappends_[1]sfetchallst(sselfs queryOptions_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetClusterKeysÚs#sSQLTableClusteredcBs2tZdZd„Zd„Zd„Zd„ZRS(s{use clusterKey to load a whole cluster of rows at once, specifically, all rows that share the same clusterKey value.cOs€|iƒ}t|d%%s or (%s=%%s and %s>%%s)( skwargsscopysFalsesSQLTables__init__sselfsargssorderBys clusterKeys primary_keys iterColumnssiterSQL(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__æs   cCst|d|iƒSdS(Ns order by %s(sgetClusterKeyssselfs clusterKey(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clusterkeysòscCsÁy|i|SWn«tj oŸ|id|i|i|i|i|if|fƒ\}}|i i ||ƒ|i i ƒ}|iƒx!|D]}|i||iƒqW|i|SnXdS(Nsiselect t2.* from %s t1,%s t2 where t1.%s=%%s and t1.%s=t2.%s(sselfs_weakValueDictsksKeyErrors _format_querysnames primary_keys clusterKeyssqlsparamsscursorsexecutesfetchallsls limit_cachests cacheItems itemClass(sselfskslsparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__õs+ cCs(|iƒ|id|i|fƒSdS(s1iterate over all items from the specified clusters where %s=%%sN(sselfs limit_cachesselects clusterKeys cluster_id(sselfs cluster_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iterclusters (s__name__s __module__s__doc__s__init__s clusterkeyss __getitem__s itercluster(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableClusteredâs   sSQLForeignRelationcBs tZdZd„Zd„ZRS(s7mapping based on matching a foreign key in an SQL tablecCs||_||_dS(N(stablesselfskeyName(sselfstableskeyName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s cCs~g}x7|iid|i|ifƒD]}|i|ƒq)Wt |ƒdjo#t dt |ƒ|i fƒ‚n|SdS(s3get list of objects o with getattr(o,keyName)==k.ids where %s=%%sis%s not found in %sN( slsselfstablesselectskeyNamesksidsosappendslensKeyErrorsstrsname(sselfskslso((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__s##(s__name__s __module__s__doc__s__init__s __getitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLForeignRelation s  sSQLTableNoCachecBsMtZdZeZeZeZd„Z d„Z d„Z d„Z d„Z RS(sÇProvide on-the-fly access to rows in the database; values are simply an object interface (SQLRow) to back-end db query. Row data are not stored locally, but always accessed by querying the dbcCs |dSdS(Ni(st(sselfst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetID%scCs)ti||||i|idƒƒSdS(Nsid(s SQLTableBasesselectsselfs whereClausesparamssoclasss_attrSQL(sselfs whereClausesparams((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselect(scCs¢y|i|SWnŒtj o€|id|i|f|iƒ|iidƒ}t |ƒdjotd|ƒ‚n|i |ƒ}||i|<|SnXdS(Ns where %s=%%siis id %s non-existent or not unique( sselfs_weakValueDictsksKeyErrors_selects primary_keyscursors fetchmanystslens itemClassso(sselfsksost((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__,s  cCsÚ|i otdƒ‚ny|i|j o t‚nWntj otdƒ‚nXy ||=Wntj onXy|i|i =Wntj onX|i |i |i |ƒ|i |ƒ||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__9s$   cKs|ii|ƒdS(N(sselfsdatasupdateskwargs(sselfskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAliasMs(s__name__s __module__s__doc__sSQLRows itemClasssgetKeysskeyss iter_keyss__iter__sgetIDsselects __getitem__s __setitem__s addAttrAlias(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableNoCaches    sSQLTableMultiNoCachecBsGtZdZeZdZd„Zd„Zd„Zd„Z d„Z RS(sGTrivial on-the-fly access for table with key that returns multiple rowssidcOssti|||Ž|i|iƒ|_|i o<d|i|if|_d|i|_ |if|_ ndS(NsGROUP BY %s ORDER BY %ss WHERE %s>%%s( s SQLTableBases__init__sselfsargsskwargss_attrSQLs _distinct_keys distinct_keysorderBysiterSQLs iterColumns(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Zs  cCst|d|iƒSdS(Ns selectCols(sgetKeyssselfs distinct_key(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeyscscCst|d|iƒSdS(Ns selectCols(s iter_keyssselfs distinct_key(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__fsccsx|id|i|i|iƒf|fƒ\}}|ii ||ƒ|ii ƒ}x|D]}|i |ƒVq]WdS(Nsselect * from %s where %s=%%s(sselfs _format_querysnames_attrSQLs _distinct_keysidssqlsparamsscursorsexecutesfetchallslsrows itemClass(sselfsidslsparamsssqlsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__is"cKs|ii|ƒdS(N(sselfsdatasupdateskwargs(sselfskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAliasts( s__name__s __module__s__doc__sTupleOs itemClasss _distinct_keys__init__skeyss__iter__s __getitem__s addAttrAlias(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableMultiNoCacheUs    sSQLEdgescBsZtZdZdZeiiƒZeieddƒƒd„Z e Z d„Z d„Z RS(shprovide iterator over edges as (source, target, edge) and getitem[edge] --> [(source,target),...]sedge_idsgraphic CsÍ|iid|idƒ|idƒ|idƒ|i|idƒ|idƒ|idƒfƒg}xZ|iiƒD]I\}}}|i |i i |ƒ|i i |ƒ|i i|ƒfƒqxW|SdS(NsWselect %s,%s,%s from %s where %s is not null order by %s,%ss source_ids target_idsedge_id(sselfscursorsexecutes_attrSQLsnameslsfetchalls source_ids target_idsedge_idsappendsgraphs unpack_sources unpack_targets unpack_edge(sselfs source_ids target_idslsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeyss b>cCst|iƒƒSdS(N(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__‘scCsÄ|id|idƒ|idƒ|i|i|iƒf|ii|ƒfƒ\}}|i i ||ƒg}xH|i i ƒD]7\}}|i|ii|ƒ|ii|ƒfƒqW|SdS(Ns!select %s,%s from %s where %s=%%ss source_ids target_id(sselfs _format_querys_attrSQLsnames _distinct_keysgraphs pack_edgesedgessqlsparamsscursorsexecuteslsfetchalls source_ids target_idsappends unpack_sources unpack_target(sselfsedges target_idslsparamsssqls source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__”s: /( s__name__s __module__s__doc__s _distinct_keysSQLTableMultiNoCaches _pickleAttrsscopysupdatesdictskeyss__call__s__iter__s __getitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesxs   s SQLEdgeDictcBs’tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„ZeZRS(s)2nd level graph interface to SQL databasecCs³||_||_t|idƒ o‰|iid|ii|ii|iif|ifƒ\}}|ii i ||ƒt |ii i ƒƒdjot dƒ‚q¯ndS(NsallowMissingNodessYselect %s from %s where %s=%%s limit 1isnode not in graph!(sfromNodesselfstableshasattrs _format_querys sourceSQLsnamessqlsparamsscursorsexecuteslensfetchallsKeyError(sselfsfromNodestablesparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__¦s  +cCsè|iid|ii|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii idƒ}t|ƒdjotdƒ‚ny|ii|ddƒSWntj otdƒ‚nXdS(Ns`select %s from %s where %s=%%s and %s=%%s limit 2iisNeither no edge from source to target or not unique!isno edge from node to target(sselfstables _format_querysedgeSQLsnames sourceSQLs targetSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutes fetchmanyslslensKeyErrors unpack_edges IndexError(sselfstargetslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__´s4$cCs¶|iid|ii|i|ii|ƒ|ii|ƒfƒ\}}|ii i ||ƒt |idƒ p)t |idƒo|ii|iijo|i|7_ndS(NsSreplace into %s values (%%s,%%s,%%s)ssourceDBstargetDB(sselfstables _format_querysnamesfromNodes pack_targetstargets pack_edgesedgessqlsparamsscursorsexecuteshasattrssourceDBstargetDB(sselfstargetsedgesparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__Çs 3@cCst||<|SdS(N(sNonesselfstarget(sselfstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__Ôs cCs|iid|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii i djotdƒ‚ndS(NsUdelete from %s where %s=%%s and %s=%%sisno edge from node to target(sselfstables _format_querysnames sourceSQLs targetSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutesrowcountsKeyError(sselfstargetsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__Øs +$cCs||iid|ii|ii|ii|ii|iif|ifƒ\}}|ii i ||ƒ|ii i ƒSdS(Nscselect %s,%s from %s where %s=%%s and %s is not null( sselfstables _format_querys targetSQLsedgeSQLsnames sourceSQLsfromNodessqlsparamsscursorsexecutesfetchall(sselfsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysiterator_queryäs=cCsAgi}|iƒD]"\}}||ii|ƒƒq~SdS(N(sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_target(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysðscCsAgi}|iƒD]"\}}||ii|ƒƒq~SdS(N(sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesôscCsegi}|iƒD]F\}}||ii|iƒ|ii |ƒ|ii |ƒfƒq~SdS(N( sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_sourcesfromNodes unpack_targets unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysedgesøscCsSgi}|iƒD]4\}}||ii|ƒ|ii|ƒfƒq~SdS(N( sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_targets unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsþscCst|iƒƒSdS(N(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__scCst|iƒƒSdS(N(sitersselfsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervaluesscCst|iƒƒSdS(N(sitersselfsitems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritems scCst|iƒƒSdS(N(slensselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__ s(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s__iadd__s __delitem__siterator_queryskeyssvaluessedgessitemss__iter__s itervaluess iteritemss__len__s graph_cmps__cmp__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLEdgeDict£s            sSQLEdgelessDictcBs tZdZd„Zd„ZRS(s,for SQLGraph tables that lack edge_id columncCs®|iid|ii|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii i dƒ}t|ƒdjotdƒ‚ntSdS(Ns`select %s from %s where %s=%%s and %s=%%s limit 2iisNeither no edge from source to target or not unique!(sselfstables _format_querys targetSQLsnames sourceSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutes fetchmanyslslensKeyErrorsNone(sselfstargetslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__s4$cCsž|iid|ii|ii|ii|iif|ifƒ\}}|ii i ||ƒgi }|ii i ƒD]}||dtfƒqy~SdS(Ns`select %s from %s where %s=%%s and %s is not nulli(sselfstables _format_querys targetSQLsnames sourceSQLsfromNodessqlsparamsscursorsexecutesappends_[1]sfetchallstsNone(sselfs_[1]sparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysiterator_query%s4(s__name__s __module__s__doc__s __getitem__siterator_query(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgelessDicts  sSQLGraphEdgeDescriptorcBstZdZd„ZRS(s'provide an SQLEdges interface on demandcCsey|iiƒ}Wn,tj o t|i|id|ƒSn!Xt|i|id|d|ƒSdS(Nsgraphs attrAlias(sobjs attrAliasscopysAttributeErrorsSQLEdgessnamescursor(sselfsobjsobjtypes attrAlias((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__7s (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraphEdgeDescriptor4s sintssourcestargetsedgec KsÔg} xÃ|D]»}y||d} Wntj o|d} nXy"| i| ||dfƒw Wnttfj onXy)||d}|t jo t‚nWntj onÞXt |ƒ}y|iƒ}WnMtj oAy$| i| |i|ifƒw Wqžtj oqžXnrXt|tƒp t|tƒo| i| dfƒq n7t|tƒo| i| dfƒq n tdƒ‚| i| |fƒtid| |fƒq W| SdS(sAreturn list of [(colname, coltype), ...] for source, target, edges_idsDBsints varchar(32)s&SQLGraph node/edge must be int or str!s/no type info found for %s, so using default: %sN(sls columnAttrssattrs attrAliassattrNamesKeyErrorsappends createTables TypeErrorskwargssdbsNonesitersitsnextsks StopIterations columnTypes primary_keysAttributeErrors isinstancesintslongsstrs ValueErrorsdefaultColumnTypesloggerswarn( s createTables attrAliassdefaultColumnTypes columnAttrsskwargssdbsitsattrskslsattrName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetColumnTypesAsL     sSQLGraphc BsûtZdZdZeiiƒZeieddddddddƒƒe Z d„Z d„Z d „Z d „ZeZd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„ZeƒZeZd„ZeZee ƒƒe!e ƒƒRS(s¡provide a graph interface via a SQL table. Key capabilities are: - setitem with an empty dictionary: a dummy operation - getitem with a key that exists: return a placeholder - setitem with non empty placeholder: again a dummy operation EXAMPLE TABLE SCHEMA: create table mygraph (source_id int not null,target_id int,edge_id int, unique(source_id,target_id)); s source_idssourceDBistargetDBsedgeDBsallowMissingNodesc Osot|ddddddddd d f ƒ\}}d |joyt|}d ||d d |d d|dd |dd|dd |dd|d d |dd f |d build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__~s$-  m cCs|i|i|ƒ|ƒSdS(N(sselfs _edgeClasss pack_sourcesk(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__—scCs“|id|i|i|if|i|ƒfƒ\}}|i i ||ƒ|id|i|i|ƒfƒ\}}|i i ||ƒ|SdS(NsSdelete from %s where %s=%%s and %s is nullsZinsert %%(IGNORE)s into %s values (%%s,NULL,NULL)( sselfs _format_querysnames sourceSQLs targetSQLs pack_sourceskssqlsparamsscursorsexecute(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__šscCsr|id|i|if|i|ƒfƒ\}}|ii ||ƒ|ii djot dƒ‚n|SdS(Nsdelete from %s where %s=%%sisnode not found in graph( sselfs _format_querysnames sourceSQLs pack_sourceskssqlsparamsscursorsexecutesrowcountsKeyError(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__isub__¦s cCsm|id|i|if|i|ƒfƒ\}}|ii ||ƒ|ii dƒ}t |ƒdjSdS(NsNselect * from %s where %s=%%s limit 1ii( sselfs _format_querysnames sourceSQLs pack_sourceskssqlsparamsscursorsexecutes fetchmanyslslen(sselfskslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__±s cCsžy |iSWnŒtj o€td|id|id|iƒ}|itjo |d=nt |i |i d|t |ƒ|_||i_|iSnXdS(s-get an interface to the inverse graph mappings source_ids target_idsedge_ids attrAliasN( sselfs_inversesAttributeErrorsdicts targetSQLs sourceSQLsedgeSQLs attrAliassNonesSQLGraphsnamescursorsgraph_db_inverse_refs(sselfs attrAlias((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__ºs     ccs+x$ti|ƒD]}|i|ƒVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks unpack_source(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__Êsccs=x6ti|ƒD]%}|i|ƒ|i||ƒfVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks unpack_sources _edgeClass(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsÎsccs.x'ti|ƒD]}|i||ƒVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks _edgeClass(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervaluesÒscCs;gi}ti|ƒD]}||i|ƒƒq~SdS(N(sappends_[1]sSQLTableMultiNoCacheskeyssselfsks unpack_source(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysÖscCst|iƒƒSdS(N(slistsselfs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesÙscCst|iƒƒSdS(N(slistsselfs iteritems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsÜscCs5|iid|i|ifƒ|iiƒdSdS(s#get number of source nodes in graphs!select count(distinct %s) from %siN(sselfscursorsexecutes sourceSQLsnamesfetchone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__âs ("s__name__s __module__s__doc__s _distinct_keysSQLTableMultiNoCaches _pickleAttrsscopysupdatesdicts SQLEdgeDicts _edgeClasss__init__s __getitem__s__iadd__s__isub__s graph_setitems __setitem__s __contains__s __invert__s__iter__s iteritemss itervaluesskeyssvaluessitemssSQLGraphEdgeDescriptorsedgess update_graphs__len__s graph_cmps__cmp__soverride_rich_cmpslocalssadd_standard_packing_methods(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraphos2               #s SQLIDGraphcBstZeeƒƒRS(N(s__name__s __module__sadd_trivial_packing_methodsslocals(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLIDGraphssSQLEdgeDictClusteredcBs tZdZd„Zd„ZRS(s:simple cache for 2nd level dictionary of target_id:edge_idcCs#||_||_ti|ƒdS(N(sgsselfsfromNodesdicts__init__(sselfsgsfromNode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s  cCs2x'|D]\}}ti|||ƒqW|SdS(N(sls target_idsedge_idsdicts __setitem__sself(sselfsls target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__s (s__name__s __module__s__doc__s__init__s__iadd__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgeDictClustereds  sSQLEdgesClusteredDescrcBstZd„ZRS(Nc Csžt|i|i|i|id|t|tƒ}x`|i i ƒD]O\}}|i gi }|i ƒD]\}}||||fƒqi~ƒqCW|SdS(Nsgraph(sSQLEdgesClusteredsobjstablesedge_ids source_ids target_idsgraph_db_inverse_refssTruesesds iteritemssloadsappends_[1]( sselfsobjsobjtypes_[1]sesds target_ids source_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__%s  G(s__name__s __module__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesClusteredDescr#ssSQLGraphClusteredcBsÜtZdZeZddded„Zeddddddddddddd dƒZd „Z d „Z ee d „Z d „Z eƒZeZeeƒƒd„Zd„Zeddddgdeƒƒd„ZRS(sESQL graph with clustered caching -- loads an entire cluster at a times source_ids target_idsedge_idc Ks1dk}t||iƒo×|tjotdƒ‚nd|jo”tdt d|d|d|ƒ|}d||dd|dd |d d|d d |d d|d d |dd|d df |dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__3s    m     stableissourceDBstargetDBsedgeDBcCst|ƒ}h|d<|SdS(Nsd(sstandard_getstatesselfsstate(sselfsstate((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__Ls  c Csêy|i|SWn*tj ot|dƒo‚q<nX|iid|i|i|i |ii |ii |i|ii |ii |ii f |i |ƒfƒ\}}|iii||ƒ|i|iiiƒƒ|i|SdS(sDget edgeDict for source node k, from cache or by loading its clusters _isLoadedsgselect t2.%s,t2.%s,t2.%s from %s t1,%s t2 where t1.%s=%%s and t1.%s=t2.%s group by t2.%sN(sselfsdsksKeyErrorshasattrstables _format_querys source_ids target_idsedge_idsnames clusterKeys primary_keys pack_sourcessqlsparamsscursorsexecutesloadsfetchall(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Qs UcCsJ|tjoy |iSWntj onX|iiid|i|i |i |ii fƒ|iii ƒ}t |_|iiƒnx·|D]¯\}}}|o1|i|ƒ}|i|ƒ}|i|ƒ}ny |i|c||fg7build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysloadfs,  2  cCsÑy |iSWntj onXt|i|i|i|it|ƒ|_||i_xi|i i ƒD]X\}}|ii gi }|i ƒD]\}}||||fƒq“~dtƒqjW|iSdS(s"interface to reverse graph mappingsunpackN(sselfs_inversesAttributeErrorsSQLGraphClusteredstables target_ids source_idsedge_idsgraph_db_inverse_refssds iteritemsssourcesloadsappends_[1]stargetsedgesFalse(sselfsdssourcesedges_[1]starget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__€s   BcCst|iƒƒSdS(s#uses db select; does not force loadN(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__”scCsh|iiid|i|iifƒgi}|iiiƒD]}||i |dƒƒq@~SdS(s#uses db select; does not force loadsselect distinct(%s) from %siN( sselfstablescursorsexecutes source_idsnamesappends_[1]sfetchallsts unpack_source(sselfs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys˜s&s iteritemssitemss itervaluessvaluess*lambda self: (self.load(), self.d.%s())[1]cCs0y||}tSWntj o tSnXdS(N(sselfsksxsTruesKeyErrorsFalse(sselfsksx((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__¢s  (s__name__s __module__s__doc__sSQLEdgeDictClustereds_edgeDictClasssNones__init__sdicts _pickleAttrss __getstate__s __getitem__sTruesloads __invert__sSQLEdgesClusteredDescrsedgess update_graphsupdatesadd_standard_packing_methodsslocalss__iter__skeyss methodFactorys __contains__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraphClustered/s"         sSQLIDGraphClusteredcBstZeeƒƒRS(N(s__name__s __module__sadd_trivial_packing_methodsslocals(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLIDGraphClusteredªssSQLEdgesClusteredcBsBtZdZeZeiiƒZeie ddƒƒd„Z RS(s%edges interface for SQLGraphClusteredsgraphicCs‰|iƒg}xn|iiƒD]]\}}xN|D]F\}}|i |i i |ƒ|i i |ƒ|i i |ƒfƒq3Wq W|SdS(N(sselfsloadsresultsds iteritemssedge_idsls source_ids target_idsappendsgraphs unpack_sources unpack_targets unpack_edge(sselfs target_idslsresultsedge_ids source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys¶s   B( s__name__s __module__s__doc__slists_edgeDictClasssSQLGraphClustereds _pickleAttrsscopysupdatesdictskeys(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesClustered°s sForeignKeyInversecBsztZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „ZRS( s;map each key to a single value according to its foreign keycCs ||_dS(N(sgsself(sselfsg((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ÄscCsI|i|ƒt||iiƒ}|tjotSn|ii|SdS(N( sselfs check_objsobjsgetattrsgs keyColumns source_idsNonessourceDB(sselfsobjs source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Çs   cCsq|i|ƒ|tj ot|i||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__Îs    cCsJy$|i|iij o t‚nWntj otdƒ‚nXdS(s&raise KeyError if obj not from this dbs'key is not from targetDB of this graph!N(sobjsdbsselfsgstargetDBsAttributeErrorsKeyError(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys check_objÚs cCs3y|i|ƒtSWntj o tSnXdS(N(sselfs check_objsobjsTruesKeyErrorsFalse(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__âs  cCs|iiiƒSdS(N(sselfsgstargetDBs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__éscCs|iiiƒSdS(N(sselfsgstargetDBsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysìsccsYxR|D]J}t||iiƒ}|tjo|tfVq||ii|fVqWdS(N(sselfsobjsgetattrsgs keyColumns source_idsNonessourceDB(sselfs source_idsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsïs  cCst|iƒƒSdS(N(slistsselfs iteritems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitems÷sccs%x|iƒD]\}}|Vq WdS(N(sselfs iteritemssobjsval(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervaluesús cCst|iƒƒSdS(N(slistsselfs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesþscCs |iSdS(N(sselfsg(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__s(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s check_objs __contains__s__iter__skeyss iteritemssitemss itervaluessvaluess __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyInverseÁs           sForeignKeyEdgecBs)tZdZd„Zd„Zd„ZRS(s±edge interface to a foreign key in an SQL table. Caches dict of target nodes in itself; provides dict interface. Adds or deletes edges by setting foreign key values in the tablecCscti|ƒ||_||_x=|iid|i|i fƒD]}ti ||t ƒqBWdS(Ns where %s=%%s( sdicts__init__sselfsgskssrcstargetDBsselects keyColumnsidsvs __setitem__sNone(sselfsgsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ s    #cCsÔt|dƒ p|i|iij otdƒ‚n|tj ot dƒ‚nt|dƒ o<|ii |}|tj ot i |i||ƒq¡nt||ii|iiƒt i||tƒdS(Nsdbs0dest is not in the targetDB bound to this graph!s/sorry,this graph cannot store edge information!s _localOnly(shasattrsdestsdbsselfsgstargetDBsKeyErrorsvsNones ValueErrors_inverses old_sourcesdicts __delitem__ssetattrs keyColumnssrcsids __setitem__(sselfsdestsvs old_source((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__s'  cCs*t||iitƒti||ƒdS(N(ssetattrsdestsselfsgs keyColumnsNonesdicts __delitem__(sselfsdest((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__s(s__name__s __module__s__doc__s__init__s __setitem__s __delitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyEdges   sForeignKeyGraphc BsztZdZed„ZeddddddddƒZeZe Z d„Z d„Z d „Z d „Zd „ZeZRS( sugraph interface to a foreign key in an SQL table Caches dict of target nodes in itself; provides dict interface. cKsZ|ot|ƒ|_n h|_||_||_||_||_t|ƒ|_dS(sÅsourceDB is any database of source nodes; targetDB must be an SQL database of target nodes; keyColumn is the foreign key column name in targetDB for looking up sourceDB IDs.N( sautoGCsRecentValueDictionarysselfs_weakValueDictssourceDBstargetDBs keyColumnsForeignKeyInverses_inverse(sselfssourceDBstargetDBs keyColumnsautoGCskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__*s     ssourceDBistargetDBs keyColumnsautoGCcCstdtdtƒSdS(sRProvide custom schema rule for inverting this graph... Just use keyColumn!sinverts uniqueMappingN(sdictsTrue(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_inverse_schema=scCsƒt|dƒ p|i|ij otdƒ‚ny|i|iSWntj onXt||ƒ}||i|i<|SdS(NsdbsMobject is not in the sourceDB bound to this graph!( shasattrsksdbsselfssourceDBsKeyErrors_weakValueDictsidsForeignKeyEdgesd(sselfsksd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Bs$cCstdƒ‚dS(Nssdo not save as g[k]=v. Instead follow a graph interface: g[src]+=dest, or g[src][dest]=None (no edge info allowed)(sKeyError(sselfsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__NscCstdƒ‚dS(Ns?Instead of del g[k], follow a graph interface: del g[src][dest](sKeyError(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__RscCs|iiƒSdS(N(sselfssourceDBsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysVs(s__name__s __module__s__doc__sTrues__init__sdicts _pickleAttrssstandard_getstates __getstate__sstandard_setstates __setstate__s_inverse_schemas __getitem__s __setitem__s __delitem__skeyssstandard_inverts __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyGraph%s  !    c Cs|id|ƒ|idƒh}gi}|iƒD]}||dƒq8~}x¢|D]š} |d| } t | |ƒ}||| via , and store primary keys in idDict, along with a list of the tables each key indexes. suse %ss show tablesis.iýÿÿÿs_idN(scursorsexecutesnamestablessappends_[1]sfetchallscslststnamesSQLTablesos descriptionsfs primary_keysidDicts setdefault( snamescursorsidDictstablesscsfslsos_[1]stnamest((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysdescribeDBTables\s" 1  cCs¹|tjo h}nx—|iƒD]‰}|io9|i|jog||i dictionary.iýÿÿÿs_idN( sidDictsNonestablessvaluessos primary_keysappends descriptionsf(stablessidDictsosf((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysindexIDsqs     cCsIh}x8|iƒD]*\}}|i|ƒo|||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys suffixSubsets icCs‚tƒ}xn|iƒD]`}xW|iD]L}||ijo t}nt }|i |||ƒ|i |||ƒq&WqW|SdS(N( s dictgraphsgstablessvaluessts descriptionsfs primary_keys PRIMARY_KEYsedgeInfosNonessetEdge(stablessidDictsgsfsedgeInfost((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys graphDBTabless    s varchar(32)sfloatcCs†y|iƒ}Wntj o dSnXyt||||||ƒWnnXt |||ƒx|D]}t |||ƒqhWdS(sûSave rows into SQL tableName using cursor, with optional translations of columns to specific SQL types (specified by typeTranslation dict). - optionDict can specify columns that are allowed to be NULL. - indexDict can specify columns that must be indexed; columns whose names end in _id will be indexed by default. - rows must be an iterator which in turn returns dictionaries, each representing a tuple of values (indexed by their column names). N( srowssnextsrows StopIterationscreateTableFromRowscursors tableNamestypeTranslations optionalDicts indexDictsstoreRow(srowss tableNamescursorstypeTranslations optionalDicts indexDictsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscreateTableFromReprŸs  c Cs|g}x|iƒD]÷\} }t} |tjo | |jo|| } nXt|ƒt jot t|ƒ} n1x-t D]%} t || ƒot | } Pq{q{W| tjot d| ƒ‚nd| | f}|tjp | |jo|d7}n|i|ƒqWxA|D]9} | ddjp | |jo|id| ƒqqWd|di|ƒf} |i| ƒdS( Ns!Don't know SQL type to use for %ss%s %ss not nulliýÿÿÿs_ids index(%s)s"create table if not exists %s (%s)s,(s create_defssrowsitemsscolsvalsNonescoltypestypeTranslationstypesSQLTypeTranslationsts isinstances TypeErrors create_defs optionalDictsappends indexDicts tableNamesjoinscmdscursorsexecute( scursors tableNamesrowstypeTranslations optionalDicts indexDicts create_defssvals create_defscmdstscoltypescol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscreateTableFromRow¹s2    cCsLdit|ƒdgƒ}d||f}|i|t|i ƒƒƒdS(Ns,s%ssinsert into %s values (%s)( sjoinslensrows row_formats tableNamescmdscursorsexecutestuplesvalues(scursors tableNamesrows row_formatscmd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstoreRowÕscCsLdit|ƒdgƒ}d||f}|i|t|i ƒƒƒdS(Ns,s%ss"insert delayed into %s values (%s)( sjoinslensrows row_formats tableNamescmdscursorsexecutestuplesvalues(scursors tableNamesrows row_formatscmd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstoreRowDelayedÛss TableGroupcBs&tZdZded„Zd„ZRS(s7provide attribute access to dbname qualified tablenamesstestcKsŠti|ƒ||_|tj o ||_nxS|iƒD]E\}}|tj o d|jo|id|}n|||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__äs     cCs ||SdS(N(sselfsk(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getattr__îs(s__name__s __module__s__doc__sNones__init__s __getattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys TableGroupás  cOs5tƒ}|i||Ž}|iƒ}||fSdS(N(s import_sqlitessqlitesconnectsargsskwargss connectionscursor(sargsskwargsssqlitescursors connection((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyssqlite_connectòs  s DBServerInfocBsGtZdZdeed„Zd„Zed„Zd„Z d„Z RS(s(picklable reference to a database serversMySQLdbcOsyt||_Wn#tj otd|ƒ‚nX||_||_||_||_||_ |io|i otdƒ‚ndS(Ns.Module name not found in _DBServerModuleDict: sQserverSideCursors=True requires blockIterators=True!( s_DBServerModuleDicts moduleNamesselfs __class__sKeyErrors ValueErrorsargsskwargssserverSideCursorssblockIteratorsscustom_iter_keys(sselfs moduleNamesserverSideCursorssblockIteratorssargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__üs     cCs6y |iSWn$tj o|iƒ|iSnXdS(s:returns cursor associated with the DB server info (reused)N(sselfs_cursorsAttributeErrors_start_connection(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscursor s   cCsPt|dƒ o|iƒn|iiƒ}|tj o ||_n|SdS(s2returns a NEW cursor; you must close it yourself! s _connectionN(shasattrsselfs_start_connections _connectionscursors arraysizesNone(sselfs arraysizescursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys new_cursors  cCs*|iiƒ|iiƒ|`|`dS(s#Close file containing this databaseN(sselfs_cursorscloses _connection(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscloses   c Cs8td|id|id|id|id|iƒSdS(sreturn all picklable argumentssargsskwargss moduleNamesserverSideCursorsscustom_iter_keysN(sdictsselfsargsskwargss moduleNamesserverSideCursorsscustom_iter_keys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__$s   ( s__name__s __module__s__doc__sFalsesTrues__init__scursorsNones new_cursorscloses __getstate__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys DBServerInfoùs   sMySQLServerInfocBsDtZdZdZd„Zed„Zd„Zed„d„Z RS(s8customized for MySQLdb SSCursor support via new_cursor()smysqlcCs%t|i|iŽ\|_|_dS(N(s mysql_connectsselfsargsskwargss _connections_cursor(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_start_connection0scCs—|i oti||ƒSny |i}Wn7tj o+tdt |i |i Ž\|_}nX|ii ƒ}|t j o ||_n|SdS(s provide streaming cursor supports useStreamingN(sselfsserverSideCursorss DBServerInfos new_cursors arraysizes_conn_sscursorsconnsAttributeErrors mysql_connectsTruesargsskwargsscursorsNone(sselfs arraysizescursorsconn((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys new_cursor4s  )  cCs>ti|ƒy|iiƒ|`Wntj onXdS(N(s DBServerInfosclosesselfs_conn_sscursorsAttributeError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscloseDs    cCs)gi}|D]}||dƒq~S(Ni(sappends_[1]sxst(sxs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysMsc Ks[t|||}y |i}Wntj onX|id|d|d|d|ƒSdS(Nscursorscache_fsmap_fsfetch_f( s BlockIteratorsdbscursorskwargssblock_iteratorscache_fsAttributeErrorsgeneric_iteratorsmap_f(sselfsdbscursorsmap_fscache_fskwargssblock_iterator((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iter_keysLs ( s__name__s __module__s__doc__s _serverTypes_start_connectionsNones new_cursorsclosesiters iter_keys(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysMySQLServerInfo,s    s CursorClosercBs tZdZd„Zd„ZRS(söcontainer for ensuring cursor.close() is called, when this obj deleted. For Python 2.5+, we could replace this with a try... finally clause in a generator function such as generic_iterator(); see PEP 342 or What's New in Python 2.5. cCs ||_dS(N(scursorsself(sselfscursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__]scCs|iiƒdS(N(sselfscursorsclose(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__del__`s(s__name__s __module__s__doc__s__init__s__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys CursorCloserWs  s BlockIteratorcBs#tZdZdd„Zd„ZRS(s5workaround for MySQLdb iteration horrible performancesc  sg||_||_||_||_d|_|doó|i|_|djo8gi}|i D]} ||i | ƒqb~|_ qQt|i ƒ}y|i|ƒ‰Wn/tj o#t|i ƒ‰||g7}nXdi|ƒ|_tt|i ƒƒ|_ ˆdjo‡d†|_qQn'd|i|_|i |if|_ f|_t|_dS(NssorderBys*s,ics)gi}|D]}||ˆƒq~S(N(sappends_[1]sxstsi(sxs_[1]st(si(s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys{ss WHERE %s>%%s(sdbsselfscursors selectColsskwargss whereClausesiterSQLswhereSQLsappends_[1]s iterColumnsscolsdatas whereParamsslistsindexsis ValueErrorslensjoinsrangescache_fs primary_keysparamssFalsesdone( sselfsdbscursors selectColss whereClauseskwargss_[1]sis iterColumnsscol((sis>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__gs.        8  c Csû|iofSn|ii|i|id|idd|iid|i|i |ii ƒ}t |ƒ|iijot |_|Sn|d}t |ƒdjo5gi}|iD]}|||ƒqº~|_n ||_|i|_|SdS(sget the next block of datascursorslimitsLIMIT %ss selectColsiÿÿÿÿiN(sselfsdonesdbs_selects whereClausesparamsscursors arraysizes selectColsskwargssfetchallsrowsslensTrueslastrowsappends_[1]s whereParamssicolswhereSQL(sselfsrowss_[1]slastrowsicol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__call__‚s    5  (s__name__s __module__s__doc__s__init__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys BlockIteratords  sSQLiteServerInfocBs/tZdZdZd„Zd„Zd„ZRS(s(picklable reference to a sqlite databasessqlitecOs&ti|ddt|ƒ||ŽdS(s)Takes same arguments as sqlite3.connect()ssqlite3sdatabaseN(s DBServerInfos__init__sselfsSourceFileNamesdatabasesargsskwargs(sselfsdatabasesargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__šs cCs%t|i|iŽ\|_|_dS(N(ssqlite_connectsselfsargsskwargss _connections_cursor(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_start_connection scCsQ|iidtƒp |id}|djotdƒ‚nti|ƒSdS(Nsdatabaseis:memory:s+SQLite in-memory database is not picklable!( sselfskwargssgetsFalsesargssdatabases ValueErrors DBServerInfos __getstate__(sselfsdatabase((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__¤s# (s__name__s __module__s__doc__s _serverTypes__init__s_start_connections __getstate__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLiteServerInfo–s   sMySQLdbsMapViewc Bs¡tZdZeeed„ZeZeZd„Ze ddddddddddƒZ e Z e ZeZZZZZZZd „Zd „Zd „ZRS( s4general purpose 1:1 mapping defined by any SQL querycKs°||_||_||_||_|tjo\|tj o|iƒ}qy |i}Wntj ot dƒ‚qX|iƒ}n||_||_|i t ƒdS(Ns&you must provide serverInfo or cursor!( ssourceDBsselfstargetDBsviewSQLs inverseSQLscursorsNones serverInfosAttributeErrors ValueErrorsget_sql_formatsFalse(sselfssourceDBstargetDBsviewSQLscursors serverInfos inverseSQLskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__²s         cCs¾t|dƒ p|i|ij otdƒ‚n|i|i|ifƒ\}}|i i ||ƒ|i i dƒ}t|ƒdjotdt|ƒƒ‚n|i|ddSdS(Nsdbs0object is not in the sourceDB bound to this map!iis&%s not found in MapView, or not uniquei(shasattrsksdbsselfssourceDBsKeyErrors _format_querysviewSQLsidssqlsparamsscursorsexecutes fetchmanystslensstrstargetDB(sselfsksparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__És$!ssourceDBistargetDBsviewSQLs serverInfos inverseSQLccsDx=|iiƒD],}y|||VWqtj oqXqWdS(s<only yield sourceDB items that are actually in this mapping!N(sselfssourceDBs itervaluessksKeyError(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__ÛscCs)gi}|D]}||ƒq~SdS(N(sappends_[1]sselfsk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysäsc Cs‘y |iSWntj os|itjotdƒ‚n|i|i|i|i|i d|i d|i ƒ|_||i_|iSnXdS(Nsthis MapView has no inverseSQL!s serverInfos inverseSQL( sselfs_inversesAttributeErrors inverseSQLsNones ValueErrors __class__stargetDBssourceDBscursors serverInfosviewSQL(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__çs    (s__name__s __module__s__doc__sNones__init__s_schemaModuleDictsget_table_schemasget_sql_formats __getitem__sdicts _pickleAttrssstandard_getstates __getstate__sstandard_setstates __setstate__sread_only_errors __setitem__s __delitem__sclearspopspopitemsupdates setdefaults__iter__skeyss __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysMapView¯s    sGraphViewEdgeDictcBsntZdZd„Zd„Zd„Zd„Zd„Zed„Z d„Z e Z Z ZZZZZRS(s6edge dictionary for GraphView: just pre-loaded on initc Cs%||_||_|ii|ii|ifƒ\}}|iii ||ƒ|iii ƒ}t |ƒdjot d|iƒ‚ngi}|D]}||dƒq™~|_h}|iitj o'xC|D]}|d||dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__øs"  '.cCst|iƒSdS(N(slensselfstargets(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__ sccs&x|iD]}|ii|Vq WdS(N(sselfstargetssksgstargetDB(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__ s cCst|ƒSdS(N(slistsself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys sccs||iitj o=xb|iD]+}|ii||ii|i|fVqWn)x%|iD]}|ii|tfVqZWdS(N(sselfsgsedgeDBsNonestargetsskstargetDBs targetDict(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritems s - cCs˜y:|i|iij otdƒ‚n|i|i}Wnt j otdƒ‚nX|odSn|ii t j o|ii |Snt SdS(sBfor the specified target object, return its associated edge objectskey is not part of targetDB!skey has no id or db attribute?!N( sosdbsselfsgstargetDBsKeyErrors targetDictsidsedgeIDsAttributeErrors exitIfFoundsedgeDBsNone(sselfsos exitIfFoundsedgeID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ scCs6y|i|tƒtSWntj o tSnXdS(N(sselfs __getitem__sosTruesKeyErrorsFalse(sselfso((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__+ s (s__name__s __module__s__doc__s__init__s__len__s__iter__skeyss iteritemssFalses __getitem__s __contains__sread_only_errors __setitem__s __delitem__sclearspopspopitemsupdates setdefault(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysGraphViewEdgeDictõs        s GraphViewcBsKtZdZeed„Zd„ZeiiƒZei e ddƒƒRS(s8general purpose graph interface defined by any SQL querycKs)||_ti||||||dS(sOif edgeDB not None, viewSQL query must return (targetID, edgeID) tuplesN( sedgeDBsselfsMapViews__init__ssourceDBstargetDBsviewSQLscursorskwargs(sselfssourceDBstargetDBsviewSQLscursorsedgeDBskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__9 s cCsEt|dƒ p|i|ij otdƒ‚nt||ƒSdS(Nsdbs0object is not in the sourceDB bound to this map!(shasattrsksdbsselfssourceDBsKeyErrorsGraphViewEdgeDict(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__@ s$sedgeDBi( s__name__s __module__s__doc__sNones__init__s __getitem__sMapViews _pickleAttrsscopysupdatesdict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys GraphView6 s  s SQLSequencecBs>tZdZd„ZeeƒZd„Zd„Zd„ZRS(szTransparent access to a DB row representing a sequence. Use attrAlias dict to rename 'length' to something else. cKs ||_tid||dS(Nsdb(sdbs seqInfoDictsSQLRows_init_subclassskwargs(sclssdbskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_init_subclassN s cCs!ti||ƒti|ƒdS(N(sSQLRows__init__sselfsids SequenceBase(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__S scCs |iSdS(N(sselfslength(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__W scCs2|id|iidƒ|d||fƒSdS(s@Efficient access to slice of a sequence, useful for huge contigssU%%(SUBSTRING)s(%s %%(SUBSTR_FROM)s %d %%(SUBSTR_FOR)s %d)sseqiN(sselfs_selectsdbs_attrSQLsstartsend(sselfsstartsend((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstrsliceZ s(s__name__s __module__s__doc__s_init_subclasss classmethods__init__s__len__sstrslice(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLSequenceH s     sDNASQLSequencecBstZeZRS(N(s__name__s __module__s DNA_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysDNASQLSequencea ssRNASQLSequencecBstZeZRS(N(s__name__s __module__s RNA_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysRNASQLSequencee ssProteinSQLSequencecBstZeZRS(N(s__name__s __module__sPROTEIN_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysProteinSQLSequencei s(vs __future__s generatorssmappingssequences SequenceBases DNA_SEQTYPEs RNA_SEQTYPEsPROTEIN_SEQTYPEstypess classutils methodFactorysstandard_getstatesoverride_rich_cmpsgenerate_itemssget_bound_subclasssstandard_setstatesget_valid_pathsstandard_invertsRecentValueDictionarysread_only_errorsSourceFileNames split_kwargssossplatformsUserDictswarningssloggersobjectsTupleDescriptorsTupleIDDescriptorsTupleDescriptorRWs SQLDescriptorsSQLDescriptorRWsReadOnlyDescriptorsselect_from_rowsinit_row_subclasssdir_rowsTupleOsinsert_and_cache_idsTupleORWs_RWClasssColumnDescriptorsReadOnlyColumnDescs_readOnlyClasssSQLRowsSQLRowRWs list_to_dictsNonesget_name_cursorsFalses mysql_connectsdicts _mysqlMacrossTruesmysql_table_schemas _sqliteMacross import_sqlitessqlite_table_schemas SQLFormatDictsget_table_schemas_schemaModuleDicts DictMixins SQLTableBasesgetKeyssiters iter_keyssSQLTablesgetClusterKeyssSQLTableClusteredsSQLForeignRelationsSQLTableNoCaches _tableclasssSQLTableMultiNoCachesSQLEdgess SQLEdgeDictsSQLEdgelessDicts_edgelessClasssSQLGraphEdgeDescriptorsgetColumnTypessSQLGraphs SQLIDGraphs _IDGraphClasssSQLEdgeDictClusteredsSQLEdgesClusteredDescrsSQLGraphClusteredsSQLIDGraphClusteredsSQLEdgesClusteredsForeignKeyInversesForeignKeyEdgesForeignKeyGraphsdescribeDBTablessindexIDss suffixSubsets PRIMARY_KEYs graphDBTabless StringTypesIntTypes FloatTypesSQLTypeTranslationscreateTableFromReprscreateTableFromRowsstoreRowsstoreRowDelayeds TableGroupssqlite_connects DBServerInfosMySQLServerInfos CursorClosers BlockIteratorsSQLiteServerInfos_DBServerModuleDictsMapViewsGraphViewEdgeDicts GraphViews SQLSequencesDNASQLSequencesRNASQLSequencesProteinSQLSequence(csProteinSQLSequences iter_keysscreateTableFromReprsMapViewsdir_rowsTupleORWsTupleDescriptorsForeignKeyInversesMySQLServerInfosplatforms_DBServerModuleDicts generatorss mysql_connectsSQLEdgesClusteredsgetClusterKeyssgetColumnTypess suffixSubsetsSQLTableClustereds DBServerInfosForeignKeyEdgesPROTEIN_SEQTYPEsSQLIDGraphClustereds_schemaModuleDictsstandard_getstatesReadOnlyColumnDescsRNASQLSequences SQLFormatDictsstandard_invertsgetKeyssForeignKeyGraphs CursorClosers import_sqlitesSQLEdgess TableGroupsSQLTableMultiNoCachesSQLTablesSQLForeignRelationsReadOnlyDescriptors RNA_SEQTYPEsTupleDescriptorRWsgenerate_itemssSQLTypeTranslationsUserDicts methodFactorysstandard_setstatesSQLEdgelessDictsinit_row_subclasssread_only_errors list_to_dictsColumnDescriptorsSQLEdgesClusteredDescrsselect_from_rowsGraphViewEdgeDictsSQLRowRWs BlockIterators SQLTableBasesossSQLRowsTupleIDDescriptorsstoreRowsSQLDescriptorRWssqlite_table_schemas DNA_SEQTYPEs PRIMARY_KEYs SQLIDGraphs split_kwargss SQLDescriptors _sqliteMacross graphDBTablessmysql_table_schemas _mysqlMacrossSourceFileNamesloggersdescribeDBTablessget_valid_pathsstoreRowDelayedsSQLGraphClusteredsSQLEdgeDictClusteredsindexIDssSQLGraphEdgeDescriptorsSQLiteServerInfosRecentValueDictionaryscreateTableFromRowsinsert_and_cache_idsSQLTableNoCachesTupleOssqlite_connects GraphViewswarningssget_name_cursorsDNASQLSequencesoverride_rich_cmps SQLSequencesget_table_schemasSQLGraphs SQLEdgeDictstypess SequenceBasesget_bound_subclass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys?sÄ  O            (   -    .4 !ÿl O *5 #+o  .   { D 7    *   3+ 2  FAPKñŠ’;®Sëëpygr/sqlgraph.pyo;ò ÍÊKc @södklZdkTdklZlZlZlZdkZdk l Z l Z l Z l Z lZlZlZlZlZlZlZlZdkZdkZdkZdkZdkZdefd„ƒYZdefd„ƒYZd efd „ƒYZd efd „ƒYZd efd„ƒYZ defd„ƒYZ!d„Z"d„Z#d„Z$defd„ƒYZ%d„Z&de%fd„ƒYZ'e'e%_(defd„ƒYZ)de)fd„ƒYZ*e*e)_+defd„ƒYZ,de,fd „ƒYZ-e-e,_(d!„Z.e/d"„Z0e/e/e1d#„Z2e3d$d%d&d'd(d(d)d*d+d,d-d.ƒZ4e5d/„Z6e3d$d0d&d1d(d2d)d3d+d4d-d4ƒZ7d5„Z8e5d6„Z9d7efd8„ƒYZ:e5d9„Z;hd:e6<d;e9<d<e9„ƒYZ>d2e/d?„Z?e/d2e@d@„e/dA„ZAdBe>fdC„ƒYZBd2dD„ZCdEeBfdF„ƒYZDdGefdH„ƒYZEdIe>fdJ„ƒYZFeFe,_GdKe>fdL„ƒYZHdMeHfdN„ƒYZIdOefdP„ƒYZJdQeJfdR„ƒYZKeKeJ_LdSefdT„ƒYZMhdUdVdWdXfdY„ZNdZeHfd[„ƒYZOd\eOfd]„ƒYZPePeO_Qd^e3fd_„ƒYZRd`efda„ƒYZSdbefdc„ƒYZTddeTfde„ƒYZUeUeT_QdfeTfdg„ƒYZVdhefdi„ƒYZWdje3fdk„ƒYZXdleei=fdm„ƒYZYdn„ZZe/do„Z[dp„Z\dqZ]dr„Z^hei_ds<ei`dU<eiadtbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__scCs|i|iSdS(N(sobjs_datasselfsicol(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__scCstdƒ‚dS(Nsthis database is read-only!(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__s(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleDescriptors   sTupleIDDescriptorcBstZd„ZRS(NcCstdƒ‚dS(NsGYou cannot change obj.id directly. Instead, use db[newID] = obj(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__!s(s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleIDDescriptorssTupleDescriptorRWcBs tZdZd„Zd„ZRS(s'read-write interface to named attributecCs5||_|i||_|i|dtƒ|_dS(Ns sqlColumn(sattrsselfsdbsdatasicols_attrSQLsTruesattrSQL(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__)s cCs3|ii|i|i|ƒ|i|i|ƒdS(N( sobjsdbs_updatesidsselfsattrSQLsvals save_localsattr(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__.s(s__name__s __module__s__doc__s__init__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleDescriptorRW&s  s SQLDescriptorcBs)tZdZd„Zd„Zd„ZRS(s/return attribute value by querying the databasecCs|i|ƒ|_dS(N(sdbs_attrSQLsattrsselfs selectSQL(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__6scCs|i|iƒSdS(N(sobjs_selectsselfs selectSQL(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__9scCstdƒ‚dS(Nsthis database is read-only!(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__<s(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLDescriptor3s   sSQLDescriptorRWcBstZdZd„ZRS(s7writeable proxy to corresponding column in the databasecCs |ii|i|i|ƒdS(N(sobjsdbs_updatesidsselfs selectSQLsval(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__Cs(s__name__s __module__s__doc__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLDescriptorRW@s sReadOnlyDescriptorcBs)tZdZd„Zd„Zd„ZRS(s/enforce read-only policy, e.g. for ID attributecCsd||_dS(Ns_(sattrsself(sselfsdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__JscCst||iƒSdS(N(sgetattrsobjsselfsattr(sselfsobjsklass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__MscCstd|iƒ‚dS(Nsattribute %s is read-only!(sAttributeErrorsselfsattr(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__Ps(s__name__s __module__s__doc__s__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysReadOnlyDescriptorGs   cCs´|iid||ii|iif|ifƒ\}}|ii i ||ƒ|ii i dƒ}t |ƒdjo,td|iit|iƒ|fƒ‚n|ddSdS(s4return value from SQL expression applied to this rows&select %s from %s where %s=%%s limit 2iis"%s[%s].%s not found, or not uniqueiN(srowsdbs _format_queryswhatsnames primary_keysidssqlsparamsscursorsexecutes fetchmanystslensKeyErrorsstr(srowswhatsparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselect_from_rowTs%,cCs­x¦|iD]›}|djo#t|||i||ƒƒq ny|i|dtƒWn/tj o#t|||i ||ƒƒq Xt|||i ||ƒƒq WdS(s!add descriptors for db attributessids columnNumberN( sdbsdatasattrssetattrsclss _idDescriptors_attrSQLsTruesAttributeErrors_sqlDescriptors_columnDescriptor(sclssdbsattr((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinit_row_subclassas  !cCs|iiiƒSdS(s+get list of column names as our attributes N(sselfsdbsdataskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysdir_rowossTupleOcBsAtZdZeZeZeZe e ƒZ e Z eZd„ZRS(sæProvides attribute interface to a database tuple. Storing the data as a tuple instead of a standard Python object (which is stored using __dict__) uses about five-fold less memory and is also much faster (the tuples returned from the DB API fetch are simply referenced by the TupleO, with no need to copy their individual values into __dict__). This class follows the 'subclass binding' pattern, which means that instead of using __getattr__ to process all attribute requests (which is un-modular and leads to all sorts of trouble), we follow Python's new model for customizing attribute access, namely Descriptors. We use classutil.get_bound_subclass() to automatically create a subclass of this class, calling its _init_subclass() class method to add all the descriptors needed for the database table to which it is bound. See the Pygr Developer Guide section of the docs for a complete discussion of the subclass binding pattern.cCs ||_dS(N(sdatasselfs_data(sselfsdata((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s(s__name__s __module__s__doc__sTupleDescriptors_columnDescriptorsTupleIDDescriptors _idDescriptors SQLDescriptors_sqlDescriptors classmethodsinit_row_subclasss_init_subclasssselect_from_rows_selectsdir_rows__dir__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleOts  cKsT|ii|ƒy|d}Wn"tj o|iiƒ}nX|i|ƒdS(s0insert tuple into db and cache its rowID on selfsidN( sselfsdbs_insertslskwargssrowIDsKeyErrors get_insert_idscache_id(sselfslskwargssrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinsert_and_cache_id“ssTupleORWcBs8tZdZeZeZed„Zd„Zd„Z RS(sread-write version of TupleOcKsE| o||_dSn|ii|ƒ|_|i|i|dS(N(snewRowsdatasselfs_datasdbstuple_from_dictskwargssinsert_and_cache_id(sselfsdatasnewRowskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__¢s  cCs|id|ƒdS(Nsid(sselfs save_localsrow_id(sselfsrow_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscache_id©scCsW|i|}y||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys save_local¬s  ( s__name__s __module__s__doc__sTupleDescriptorRWs_columnDescriptorsinsert_and_cache_idsFalses__init__scache_ids save_local(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysTupleORWs   sColumnDescriptorcBs,tZdZed„Zd„Zd„ZRS(sDread-write interface to column in a database, cached in obj.__dict__cCsE||_|i|dtƒ|_||_|o|i|_ndS(Ns sqlColumn( sattrsselfsdbs_attrSQLsTruescolsreadOnlys_readOnlyClasss __class__(sselfsdbsattrsreadOnly((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__»s   cCsÎy|i|iSWnµtj o©|i|iijo t‚n|ii d|ii|i f|iƒ|ii i ƒ}t|ƒdjotdƒ‚n|dd|i|i<|ddSnXdS(Ns where %s=%%sisdb row not found or not unique!i(sobjs__dict__sselfsattrsKeyErrorscolsdbs primary_keysAttributeErrors_selectsidscursorsfetchallslslen(sselfsobjsobjtypesl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__Ãs  cCsEt|dƒ o |ii|i|i|ƒn||i|i build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__Ñs (s__name__s __module__s__doc__sFalses__init__s__get__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysColumnDescriptor¸s   sReadOnlyColumnDesccBstZd„ZRS(NcCstdƒ‚dS(Ns-The ID of a database object is not writeable.(sAttributeError(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__set__âs(s__name__s __module__s__set__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysReadOnlyColumnDescàssSQLRowcBs?tZdZeZZeZee ƒZ e Z e Zd„ZRS(s¶Provide transparent interface to a row in the database: attribute access will be mapped to SELECT of the appropriate column, but data is not cached on this object. cCs ||_dS(N(srowIDsselfs_id(sselfsrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__òs(s__name__s __module__s__doc__s SQLDescriptors_columnDescriptors_sqlDescriptorsReadOnlyDescriptors _idDescriptors classmethodsinit_row_subclasss_init_subclasssselect_from_rows_selectsdir_rows__dir__s__init__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLRowçs   sSQLRowRWcBs/tZdZeZeZed„Zd„ZRS(sread-write version of SQLRowcKs?| o|i|ƒSn|ii|ƒ}|i||dS(N( snewRowsselfscache_idsrowIDsdbstuple_from_dictskwargsslsinsert_and_cache_id(sselfsrowIDsnewRowskwargssl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ûscCs ||_dS(N(srowIDsselfs_id(sselfsrowID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscache_ids( s__name__s __module__s__doc__sSQLDescriptorRWs_columnDescriptorsinsert_and_cache_idsFalses__init__scache_id(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLRowRWös  cCsTh}xCt|ƒD]5\}}y||||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys list_to_dicts  cKs–|tj of|iƒ}t|ƒdjoC|d}dddf}|iƒ}|it ||dƒƒqsnt |}||i ƒ|fSdS(s¶get table name and cursor by parsing name or using configFile. If neither provided, will try to get via your MySQL config file. If connect is None, will use MySQLdb.connect()iishostsuserspasswdN( snamesNonessplitsargListslensargnamesskwargsscopysupdates list_to_dicts DBServerInfos serverInfoscursor(snameskwargssargnamess serverInfosargList((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_name_cursors    " c Ks|iƒ}d|jo |tjo tiƒ} | ddfjoÇg}y-t i d} || df| dfg7}Wnt j onXyAt i d} || t iidf| t iidfg7}Wnt j onXt|ƒdjot|Œ}q-q1t iit iid ƒd ƒ}n|pt iit iƒd ƒ}|ot ii|ƒo||d ydkl}|i|dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys mysql_connect"sH     4%"         sIGNOREsignoresREPLACEsreplacesAUTO_INCREMENTs SUBSTRINGs substrings SUBSTR_FROMsFROMs SUBSTR_FORsFORcCs™dk}t|itƒ|_| odSn|iƒ|ii d|i ƒ|ii ƒ}|ii d|i ƒxt |ƒD]\}}|d}|ii|ƒ|ddjoŽ|itjo ||_n=y|ii|ƒWn%tj o|i|g|_nX|dd iƒdjo t|_qit|_n#|dd jo||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysmysql_table_schemaTs6       s or ignoresinsert or replacesssubstrs,cCs8y dk}Wn tj odkl}nX|SdS(sIimport sqlite3 (for Python 2.5+) or pysqlite2 for earlier Python versionsN(sdbapi2(ssqlite3ssqlites ImportErrors pysqlite2sdbapi2(ssqlite((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys import_sqlitexs  c Csxtƒ}t|itƒ|_| odSn|iƒ|i i d|i ƒ|i i ƒ} |i i d|i ƒx\t| ƒD]N\} }|d}|ii|ƒ|i i| |i|<|d|i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyssqlite_table_schemasL     ! %. s SQLFormatDictc BsStZdZeddddddddddƒZhd „Zd „Zd „ZRS( sGPerform SQL keyword replacements for maintaining compatibility across a wide range of SQL backends. Uses Python dict-based string format function to do simple string replacements, and also to convert params list to the paramstyle required for this interface. Create by passing a dict of macros and the db-api paramstyle: sfd = SQLFormatDict("qmark", substitutionDict) Then transform queries+params as follows; input should be "format" style: sql,params = sfd("select * from foo where id=%s and val=%s", (myID,myVal)) cursor.execute(sql, params) spyformats%%(%d)ssnumerics:%dsnamedsqmarks(ignore)sformatcCs„|iƒ|_||_|i||_|djp |dj|_|djod|idbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__¾s   cCsmy|i|SWntj onX|djo'|i|i}|id7_|Sntd|ƒ‚dS(s1apply correct substitution for this SQL interfaces?isunknown macro: %sN(sselfssubstitutionDictsksKeyErrors paramFormatsiparamss(sselfskss((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Ès cCs‚d|_|iddƒ}||}|ioEh}x.t|ƒD] \}}||t |dƒbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__call__Ôs    (s__name__s __module__s__doc__sdicts _paramFormatss__init__s __getitem__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLFormatDict¯s  cCs}y|iii}Wntj otdƒ‚nXy|i|}Wn#t j ot d|ƒ‚nX|||ƒdS(sCrun the right schema function based on type of db server connections'no cursor object or module information!s„unknown db module: %s. Use _schemaModuleDict attribute to supply a method for obtaining table schema for this moduleN( sselfscursors __class__s __module__smodnamesAttributeErrors ValueErrors_schemaModuleDicts schema_funcsKeyErrors analyzeSchema(sselfs analyzeSchemasmodnames schema_func((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_table_schemaãssMySQLdb.cursorsspysqlite2.dbapi2ssqlite3s SQLTableBasecBsâtZdZeZeZeeeeeeedeeeeeeeeed„Zd„Z d„Z d„Z e ddddd dd dd dd dd dddddddddddƒ Z eZd„Zd„Zd„Zeed„Zed„Zed„Zdfdeddd„Zeedd„Zd„Zd„Zd„Zd „Zed!„Zd"„Zd#„Zd$„Zeeee ed%„Z!d&„Z"d'„Z#d(„Z$d)„Z%d*„Z&d+„Z'd,„Z(d-„Z)RS(.sAStore information about an SQL table as dict keyed by primary keyicKs| ot| ƒ|_n h|_| |_||_|o| o | idjo:|o|o||f\|_|_qt dƒ‚n||_ |t jo9| t j o| i ƒ}qòt ||\}}} ntidtddƒ||_ |t j oR| o|id|ƒn|itƒ|i|fƒ\}}|i|ƒn||_|t j o ||_n|t j o ||_n| t j o| |_| |_n|iƒ|t j o||_||_nh|_ x*t!|i"ƒD]\}}||i |build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__üsn                               cCs%|iddƒ|iiƒdSdS(Ns selectColsscount(*)i(sselfs_selectscursorsfetchone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__BscCst|ƒSdS(N(sidsself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__hash__FscCs2||jodSntt|ƒt|ƒƒSdS(sonly match self and no other!iN(sselfsotherscmpsid(sselfsother((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__cmp__Is snameis clusterKeysmaxCaches arraysizes attrAliass serverInfosautoGCsorderBys writeablesiterSQLs iterColumnss primaryKeycCs|i|dS(N(sselfs__init__sstate(sselfsstate((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setstate__TscCsd|idSdS(Ns (sselfsname(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__repr__^scCs:h|_g|_h|_t|_t|_h|_dS(s+reset all schema information for this tableN(sselfs descriptions columnNames columnTypesNones usesIntIDs primary_keysindexed(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clear_schemaas     cCsfy|i|}Wn,tj o td||ifƒ‚nX|oty|i|SWq»t j oRy|i|i|SWq·tt fj o td||ifƒ‚q·Xq»Xn|oey |dSWq't j oFy|i|dSWq#tt fj ot d|ƒ‚q#Xq'Xnt |t iƒo |}n|djo |i}n|SdS(s=Translate python attribute name to appropriate SQL expressionsOattribute %s not a valid column or alias in %ssYattribute %s does not map to an SQL column in %sisOattribute %s does not map to a SQL column!sidN(sselfsdatasattrsfieldsKeyErrorsAttributeErrorsnames sqlColumns columnNames TypeErrors columnNumbers ValueErrors isinstancestypess StringTypes primary_key(sselfsattrs sqlColumns columnNumbersfield((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_attrSQLjs4'    cKsž|o|ii|ƒnx||iƒD]n\}}y|i|dt ‚Wq(t j o|i||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAlias‹s   cCs³|tj o ||_n|io|ii|_nt|d|idtd|ƒƒ}t |t ƒo|i |_ nt |dƒot||iƒ o|i|_ndS(sXCreate class representing a row in this table by subclassing oclass, adding datas itemClasss subclassArgssdbs _tableclassN(soclasssNonesselfs itemClasss writeables_RWClasssget_bound_subclasssnamesdicts issubclasssTupleOsdatas_attrcolshasattrs isinstances _tableclasss __class__(sselfsoclass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysobjclass¡s   $sst1.*cCsf|id||i|||f|ƒ\}}|t jo|i i ||ƒn|i ||ƒdS(s,execute the specified query but do not fetchsselect %s from %s t1 %s %s %sN( sselfs _format_querys selectColssnames whereClausesorderByslimitsparamsssqlscursorsNonesexecute(sselfs whereClausesparamss selectColsscursorsorderByslimitssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_select´s  ccsa|tjo |i}n|i|||ƒ|ii ƒ}x|D]}|i ||ƒVqCWdS(s=Generate the list of objects that satisfy the database SELECTN( soclasssNonesselfs itemClasss_selects whereClausesparamss selectColsscursorsfetchallslsts cacheItem(sselfs whereClausesparamssoclasss selectColsslst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselect¿s  cKsœg}g}xl|iƒD]^\}}|tjo|id|i |ƒƒq|id|i |ƒƒ|i|ƒqW|i ddi |ƒ|ƒSdS(sDquery for intersection of all specified kwargs, returned as iterators %s IS NULLs%s=%%sswhere s and N( scriteriasparamsskwargssitemssksvsNonesappendsselfs_attrSQLsselectsjoin(sselfskwargsscriteriasparamssvsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysqueryÈs  cCsH|id|i||if||fƒ\}}|i i ||ƒdS(sAupdate a single field in the specified row to the specified values!update %s set %s=%%s where %s=%%sN( sselfs _format_querysnamescols primary_keysvalsrow_idssqlsparamsscursorsexecute(sselfsrow_idscolsvalsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_updateÔscCsCy||idSWn)tj o||i|idSnXdS(Nsid(stsselfsdatas TypeError(sselfst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetIDÛscCsyy|i|ƒ}Wntj o||ƒSnXy|i|SWntj onX||ƒ}||i|<|SdS(s7get obj from cache if possible, or construct from tupleN(sselfsgetIDstsidsKeyErrorsoclasss_weakValueDictso(sselfstsoclasssosid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys cacheItemás  ccs?|tjo |i}nx|D]}|i||ƒVq!WdS(N(soclasssNonesselfs itemClasssrowssts cacheItem(sselfsrowssoclassst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys cache_itemsïs   cCs|id||fƒSdS(s9get iterator for objects with specified foreign key values where %s=%%sN(sselfsselectsattrsk(sselfsattrsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys foreignKeyõscCsHy.|it|iƒjo|iiƒnWntj onXdS(s"APPLY maxCache LIMIT TO CACHE SIZEN(sselfsmaxCacheslens_weakValueDictsclearsAttributeError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys limit_cacheùs cCs;y|ii}Wntj o tSnX||iƒSdS(s4Return a new cursor object, or None if not possible N(sselfs serverInfos new_cursorsAttributeErrorsNones arraysize(sselfs new_cursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysget_new_cursors  ccs°|tjo*|tjo|ii}q7|i}n|tjo |i}nxXtoP|iƒ|ƒ}t |ƒdjoPnx|||ƒƒD] }|Vq™WqTWdS(sgeneric iterator that runs fetch, cache and map functions. cursorHolder is used only to keep a ref in this function's locals, so that if it is prematurely terminated (by deleting its iterator), cursorHolder.__del__() will close the cursor.iN( sfetch_fsNonescursorsselfs fetchmanyscache_fs cache_itemssTrues limit_cachesrowsslensmap_fsv(sselfscursorsfetch_fscache_fsmap_fs cursorHoldersrowssv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgeneric_iterator s        cCsltgt|iƒ}xK|iiƒD]:\}}y||||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pystuple_from_dicts  cCsqtgt|iƒ}xP|iiƒD]?\}}yt ||ƒ||transform object attributes into tuple for storing in databaseN( sNoneslensselfs descriptionslsdatasitemsscolsicolsgetattrsobjsAttributeErrors TypeError(sselfsobjslsicolscol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pystuple_from_obj(s  cCs^d|iddidgt|ƒƒd}|i||ƒ\}}|i i ||ƒdS(sxinsert tuple into the database. Note this uses the MySQL extension REPLACE, which overwrites any duplicate key.s%(REPLACE)s into s values (s,s%ss)N( sselfsnamesjoinslenslsss _format_queryssqlsparamsscursorsexecute(sselfslsssparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_insert2s/cCs |i|ƒ}|i|ƒdS(s5insert new row by transforming obj to tuple of valuesN(sselfstuple_from_objsobjsls_insert(sselfsobjsl((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysinsert:scCsWy|ii}Wntj otdƒ‚nX|tjotdƒ‚n|SdS(s-get the primary key value for the last INSERTs your db lacks lastrowid support?s/lastrowid is None so cannot get ID from INSERT!N(sselfscursors lastrowidsauto_idsAttributeErrorsNotImplementedErrorsNones ValueError(sselfsauto_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys get_insert_id?s cKsK|i otdƒ‚n|itdt|}||i|i <|SdS(s=return a new record with the assigned attributes, added to DBsthis database is read only!snewRowN( sselfs writeables ValueErrors itemClasssNonesTrueskwargssobjs_weakValueDictsid(sselfskwargssobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysnewIs  cCs|iiƒdS(sempty the cacheN(sselfs_weakValueDictsclear(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clear_cacheQscCs|i otdƒ‚n|id|i|if|fƒ\}}|i i ||ƒy|i |=Wnt j onXdS(Nsthis database is read only!sdelete from %s where %s=%%s( sselfs writeables ValueErrors _format_querysnames primary_keyskssqlsparamsscursorsexecutes_weakValueDictsKeyError(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__Us (*s__name__s __module__s__doc__s_schemaModuleDictsget_table_schemasNonesFalsesTrues__init__s__len__s__hash__s__cmp__sdicts _pickleAttrssstandard_getstates __getstate__s __setstate__s__repr__s clear_schemas_attrSQLs addAttrAliassobjclasss_selectsselectsquerys_updatesgetIDs cacheItems cache_itemss foreignKeys limit_cachesget_new_cursorsitersgeneric_iteratorstuple_from_dictstuple_from_objs_insertsinserts get_insert_idsnews clear_caches __delitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLTableBase÷sH build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetKeysbs    cCs)gi}|D]}||dƒq~S(Ni(sappends_[1]sxst(sxs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysosc Ks&|tjo |i}n|djo |itj o |i}n|iƒ}|ot|idƒo |ii o2|ii ||d|d|d|d||Sq"|id|d|d|||id|d|d|dt|ƒƒSn/|tj ot|ƒƒSnt|iƒƒSd S( s8guarantee correct iteration insulated from other queriesss iter_keyss selectColssmap_fsorderByscache_fscursors cursorHolderN(s selectColssNonesselfs primary_keysorderBysget_new_cursorscursorshasattrs serverInfoscustom_iter_keyss iter_keyssmap_fscache_fskwargss_selectsgeneric_iterators CursorClosersget_fsiterskeys(sselfs selectColssorderBysmap_fscache_fsget_fskwargsscursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iter_keysns(        sSQLTablecBsbtZdZeZeZeZe d„Z d„Z d„Z d„Z d„Zd„Zd„ZRS(sRProvide on-the-fly access to rows in the database, caching the results in dictcCs˜y |iSWntj onX|tjo |i}n|iid|iƒ|ii ƒ}h|_ x|D]}|i ||ƒqqWt|_dS(sLoad all data from the tablesselect * from %sN(sselfs _isLoadedsAttributeErrorsoclasssNones itemClassscursorsexecutesnamesfetchallsls_weakValueDictsts cacheItemsTrue(sselfsoclassslst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysload’s    cCsÐy|i|SWnºtj o®|id|i|if|fƒ\}}|i i ||ƒ|i i dƒ}t |ƒdjo#tdt|ƒ|ifƒ‚n|iƒ|i|d|iƒSnXdS(NsRselect * from %s where %s=%%s limit 2iis!%s not found in %s, or not uniquei(sselfs_weakValueDictsksKeyErrors _format_querysnames primary_keyssqlsparamsscursorsexecutes fetchmanyslslensstrs limit_caches cacheItems itemClass(sselfskslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__¡s# cCsÊ|i otdƒ‚ny|i|j o t‚nWntj otdƒ‚nXy$|i}|tjo t‚nWntj on X||i=|i |ƒ|i |ƒ||i |build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__²s"      cCs=|iƒgi}|D]}||||fƒq~SdS(s'forces load of entire table into memoryN(sselfsloadsappends_[1]sk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsÆs c Cs)t|dddtdtd|iƒSdS(sAuses arraysize / maxCache and fetchmany() to manage data transfers selectColss*scache_fsmap_fsget_fN(s iter_keyssselfsNonesgenerate_itemssitems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsËscCs7|iƒgi}|D]}|||ƒq~SdS(s'forces load of entire table into memoryN(sselfsloadsappends_[1]sk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesÐs cCs#t|dddtd|iƒSdS(sAuses arraysize / maxCache and fetchmany() to manage data transfers selectColss*scache_fsget_fN(s iter_keyssselfsNonesvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervaluesÕs(s__name__s __module__s__doc__sTupleOs itemClasssgetKeysskeyss iter_keyss__iter__sNonesloads __getitem__s __setitem__sitemss iteritemssvaluess itervalues(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTable‹s       cCsY|iid|i|i|fƒgi}|iiƒD]}||dƒq:~SdS(s#uses db select; does not force loadsselect distinct %s from %s %siN( sselfscursorsexecutes clusterKeysnames queryOptionsappends_[1]sfetchallst(sselfs queryOptions_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetClusterKeysÚs#sSQLTableClusteredcBs2tZdZd„Zd„Zd„Zd„ZRS(s{use clusterKey to load a whole cluster of rows at once, specifically, all rows that share the same clusterKey value.cOs€|iƒ}t|d%%s or (%s=%%s and %s>%%s)( skwargsscopysFalsesSQLTables__init__sselfsargssorderBys clusterKeys primary_keys iterColumnssiterSQL(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__æs   cCst|d|iƒSdS(Ns order by %s(sgetClusterKeyssselfs clusterKey(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys clusterkeysòscCsÁy|i|SWn«tj oŸ|id|i|i|i|i|if|fƒ\}}|i i ||ƒ|i i ƒ}|iƒx!|D]}|i||iƒqW|i|SnXdS(Nsiselect t2.* from %s t1,%s t2 where t1.%s=%%s and t1.%s=t2.%s(sselfs_weakValueDictsksKeyErrors _format_querysnames primary_keys clusterKeyssqlsparamsscursorsexecutesfetchallsls limit_cachests cacheItems itemClass(sselfskslsparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__õs+ cCs(|iƒ|id|i|fƒSdS(s1iterate over all items from the specified clusters where %s=%%sN(sselfs limit_cachesselects clusterKeys cluster_id(sselfs cluster_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iterclusters (s__name__s __module__s__doc__s__init__s clusterkeyss __getitem__s itercluster(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableClusteredâs   sSQLForeignRelationcBs tZdZd„Zd„ZRS(s7mapping based on matching a foreign key in an SQL tablecCs||_||_dS(N(stablesselfskeyName(sselfstableskeyName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s cCs~g}x7|iid|i|ifƒD]}|i|ƒq)Wt |ƒdjo#t dt |ƒ|i fƒ‚n|SdS(s3get list of objects o with getattr(o,keyName)==k.ids where %s=%%sis%s not found in %sN( slsselfstablesselectskeyNamesksidsosappendslensKeyErrorsstrsname(sselfskslso((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__s##(s__name__s __module__s__doc__s__init__s __getitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLForeignRelation s  sSQLTableNoCachecBsMtZdZeZeZeZd„Z d„Z d„Z d„Z d„Z RS(sÇProvide on-the-fly access to rows in the database; values are simply an object interface (SQLRow) to back-end db query. Row data are not stored locally, but always accessed by querying the dbcCs |dSdS(Ni(st(sselfst((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetID%scCs)ti||||i|idƒƒSdS(Nsid(s SQLTableBasesselectsselfs whereClausesparamssoclasss_attrSQL(sselfs whereClausesparams((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysselect(scCs¢y|i|SWnŒtj o€|id|i|f|iƒ|iidƒ}t |ƒdjotd|ƒ‚n|i |ƒ}||i|<|SnXdS(Ns where %s=%%siis id %s non-existent or not unique( sselfs_weakValueDictsksKeyErrors_selects primary_keyscursors fetchmanystslens itemClassso(sselfsksost((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__,s  cCsÚ|i otdƒ‚ny|i|j o t‚nWntj otdƒ‚nXy ||=Wntj onXy|i|i =Wntj onX|i |i |i |ƒ|i |ƒ||i|build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__9s$   cKs|ii|ƒdS(N(sselfsdatasupdateskwargs(sselfskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAliasMs(s__name__s __module__s__doc__sSQLRows itemClasssgetKeysskeyss iter_keyss__iter__sgetIDsselects __getitem__s __setitem__s addAttrAlias(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableNoCaches    sSQLTableMultiNoCachecBsGtZdZeZdZd„Zd„Zd„Zd„Z d„Z RS(sGTrivial on-the-fly access for table with key that returns multiple rowssidcOssti|||Ž|i|iƒ|_|i o<d|i|if|_d|i|_ |if|_ ndS(NsGROUP BY %s ORDER BY %ss WHERE %s>%%s( s SQLTableBases__init__sselfsargsskwargss_attrSQLs _distinct_keys distinct_keysorderBysiterSQLs iterColumns(sselfsargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__Zs  cCst|d|iƒSdS(Ns selectCols(sgetKeyssselfs distinct_key(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeyscscCst|d|iƒSdS(Ns selectCols(s iter_keyssselfs distinct_key(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__fsccsx|id|i|i|iƒf|fƒ\}}|ii ||ƒ|ii ƒ}x|D]}|i |ƒVq]WdS(Nsselect * from %s where %s=%%s(sselfs _format_querysnames_attrSQLs _distinct_keysidssqlsparamsscursorsexecutesfetchallslsrows itemClass(sselfsidslsparamsssqlsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__is"cKs|ii|ƒdS(N(sselfsdatasupdateskwargs(sselfskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys addAttrAliasts( s__name__s __module__s__doc__sTupleOs itemClasss _distinct_keys__init__skeyss__iter__s __getitem__s addAttrAlias(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLTableMultiNoCacheUs    sSQLEdgescBsZtZdZdZeiiƒZeieddƒƒd„Z e Z d„Z d„Z RS(shprovide iterator over edges as (source, target, edge) and getitem[edge] --> [(source,target),...]sedge_idsgraphic CsÍ|iid|idƒ|idƒ|idƒ|i|idƒ|idƒ|idƒfƒg}xZ|iiƒD]I\}}}|i |i i |ƒ|i i |ƒ|i i|ƒfƒqxW|SdS(NsWselect %s,%s,%s from %s where %s is not null order by %s,%ss source_ids target_idsedge_id(sselfscursorsexecutes_attrSQLsnameslsfetchalls source_ids target_idsedge_idsappendsgraphs unpack_sources unpack_targets unpack_edge(sselfs source_ids target_idslsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeyss b>cCst|iƒƒSdS(N(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__‘scCsÄ|id|idƒ|idƒ|i|i|iƒf|ii|ƒfƒ\}}|i i ||ƒg}xH|i i ƒD]7\}}|i|ii|ƒ|ii|ƒfƒqW|SdS(Ns!select %s,%s from %s where %s=%%ss source_ids target_id(sselfs _format_querys_attrSQLsnames _distinct_keysgraphs pack_edgesedgessqlsparamsscursorsexecuteslsfetchalls source_ids target_idsappends unpack_sources unpack_target(sselfsedges target_idslsparamsssqls source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__”s: /( s__name__s __module__s__doc__s _distinct_keysSQLTableMultiNoCaches _pickleAttrsscopysupdatesdictskeyss__call__s__iter__s __getitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesxs   s SQLEdgeDictcBs’tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „Zd „Zd„ZeZRS(s)2nd level graph interface to SQL databasecCs³||_||_t|idƒ o‰|iid|ii|ii|iif|ifƒ\}}|ii i ||ƒt |ii i ƒƒdjot dƒ‚q¯ndS(NsallowMissingNodessYselect %s from %s where %s=%%s limit 1isnode not in graph!(sfromNodesselfstableshasattrs _format_querys sourceSQLsnamessqlsparamsscursorsexecuteslensfetchallsKeyError(sselfsfromNodestablesparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__¦s  +cCsè|iid|ii|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii idƒ}t|ƒdjotdƒ‚ny|ii|ddƒSWntj otdƒ‚nXdS(Ns`select %s from %s where %s=%%s and %s=%%s limit 2iisNeither no edge from source to target or not unique!isno edge from node to target(sselfstables _format_querysedgeSQLsnames sourceSQLs targetSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutes fetchmanyslslensKeyErrors unpack_edges IndexError(sselfstargetslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__´s4$cCs¶|iid|ii|i|ii|ƒ|ii|ƒfƒ\}}|ii i ||ƒt |idƒ p)t |idƒo|ii|iijo|i|7_ndS(NsSreplace into %s values (%%s,%%s,%%s)ssourceDBstargetDB(sselfstables _format_querysnamesfromNodes pack_targetstargets pack_edgesedgessqlsparamsscursorsexecuteshasattrssourceDBstargetDB(sselfstargetsedgesparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__Çs 3@cCst||<|SdS(N(sNonesselfstarget(sselfstarget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__Ôs cCs|iid|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii i djotdƒ‚ndS(NsUdelete from %s where %s=%%s and %s=%%sisno edge from node to target(sselfstables _format_querysnames sourceSQLs targetSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutesrowcountsKeyError(sselfstargetsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__Øs +$cCs||iid|ii|ii|ii|ii|iif|ifƒ\}}|ii i ||ƒ|ii i ƒSdS(Nscselect %s,%s from %s where %s=%%s and %s is not null( sselfstables _format_querys targetSQLsedgeSQLsnames sourceSQLsfromNodessqlsparamsscursorsexecutesfetchall(sselfsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysiterator_queryäs=cCsAgi}|iƒD]"\}}||ii|ƒƒq~SdS(N(sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_target(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysðscCsAgi}|iƒD]"\}}||ii|ƒƒq~SdS(N(sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesôscCsegi}|iƒD]F\}}||ii|iƒ|ii |ƒ|ii |ƒfƒq~SdS(N( sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_sourcesfromNodes unpack_targets unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysedgesøscCsSgi}|iƒD]4\}}||ii|ƒ|ii|ƒfƒq~SdS(N( sappends_[1]sselfsiterator_querys target_idsedge_idstables unpack_targets unpack_edge(sselfs_[1]s target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsþscCst|iƒƒSdS(N(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__scCst|iƒƒSdS(N(sitersselfsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervaluesscCst|iƒƒSdS(N(sitersselfsitems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritems scCst|iƒƒSdS(N(slensselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__ s(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s__iadd__s __delitem__siterator_queryskeyssvaluessedgessitemss__iter__s itervaluess iteritemss__len__s graph_cmps__cmp__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLEdgeDict£s            sSQLEdgelessDictcBs tZdZd„Zd„ZRS(s,for SQLGraph tables that lack edge_id columncCs®|iid|ii|ii|ii|iif|i|ii|ƒfƒ\}}|ii i ||ƒ|ii i dƒ}t|ƒdjotdƒ‚ntSdS(Ns`select %s from %s where %s=%%s and %s=%%s limit 2iisNeither no edge from source to target or not unique!(sselfstables _format_querys targetSQLsnames sourceSQLsfromNodes pack_targetstargetssqlsparamsscursorsexecutes fetchmanyslslensKeyErrorsNone(sselfstargetslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__s4$cCsž|iid|ii|ii|ii|iif|ifƒ\}}|ii i ||ƒgi }|ii i ƒD]}||dtfƒqy~SdS(Ns`select %s from %s where %s=%%s and %s is not nulli(sselfstables _format_querys targetSQLsnames sourceSQLsfromNodessqlsparamsscursorsexecutesappends_[1]sfetchallstsNone(sselfs_[1]sparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysiterator_query%s4(s__name__s __module__s__doc__s __getitem__siterator_query(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgelessDicts  sSQLGraphEdgeDescriptorcBstZdZd„ZRS(s'provide an SQLEdges interface on demandcCsey|iiƒ}Wn,tj o t|i|id|ƒSn!Xt|i|id|d|ƒSdS(Nsgraphs attrAlias(sobjs attrAliasscopysAttributeErrorsSQLEdgessnamescursor(sselfsobjsobjtypes attrAlias((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__7s (s__name__s __module__s__doc__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraphEdgeDescriptor4s sintssourcestargetsedgec KsÔg} xÃ|D]»}y||d} Wntj o|d} nXy"| i| ||dfƒw Wnttfj onXy)||d}|t jo t‚nWntj onÞXt |ƒ}y|iƒ}WnMtj oAy$| i| |i|ifƒw Wqžtj oqžXnrXt|tƒp t|tƒo| i| dfƒq n7t|tƒo| i| dfƒq n tdƒ‚| i| |fƒtid| |fƒq W| SdS(sAreturn list of [(colname, coltype), ...] for source, target, edges_idsDBsints varchar(32)s&SQLGraph node/edge must be int or str!s/no type info found for %s, so using default: %sN(sls columnAttrssattrs attrAliassattrNamesKeyErrorsappends createTables TypeErrorskwargssdbsNonesitersitsnextsks StopIterations columnTypes primary_keysAttributeErrors isinstancesintslongsstrs ValueErrorsdefaultColumnTypesloggerswarn( s createTables attrAliassdefaultColumnTypes columnAttrsskwargssdbsitsattrskslsattrName((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysgetColumnTypesAsL     sSQLGraphc BsûtZdZdZeiiƒZeieddddddddƒƒe Z d„Z d„Z d „Z d „ZeZd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„ZeƒZeZd„ZeZee ƒƒe!e ƒƒRS(s¡provide a graph interface via a SQL table. Key capabilities are: - setitem with an empty dictionary: a dummy operation - getitem with a key that exists: return a placeholder - setitem with non empty placeholder: again a dummy operation EXAMPLE TABLE SCHEMA: create table mygraph (source_id int not null,target_id int,edge_id int, unique(source_id,target_id)); s source_idssourceDBistargetDBsedgeDBsallowMissingNodesc Osot|ddddddddd d f ƒ\}}d |joyt|}d ||d d |d d|dd |dd|dd |dd|d d |dd f |d build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__~s$-  m cCs|i|i|ƒ|ƒSdS(N(sselfs _edgeClasss pack_sourcesk(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__—scCs“|id|i|i|if|i|ƒfƒ\}}|i i ||ƒ|id|i|i|ƒfƒ\}}|i i ||ƒ|SdS(NsSdelete from %s where %s=%%s and %s is nullsZinsert %%(IGNORE)s into %s values (%%s,NULL,NULL)( sselfs _format_querysnames sourceSQLs targetSQLs pack_sourceskssqlsparamsscursorsexecute(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__šscCsr|id|i|if|i|ƒfƒ\}}|ii ||ƒ|ii djot dƒ‚n|SdS(Nsdelete from %s where %s=%%sisnode not found in graph( sselfs _format_querysnames sourceSQLs pack_sourceskssqlsparamsscursorsexecutesrowcountsKeyError(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__isub__¦s cCsm|id|i|if|i|ƒfƒ\}}|ii ||ƒ|ii dƒ}t |ƒdjSdS(NsNselect * from %s where %s=%%s limit 1ii( sselfs _format_querysnames sourceSQLs pack_sourceskssqlsparamsscursorsexecutes fetchmanyslslen(sselfskslsparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__±s cCsžy |iSWnŒtj o€td|id|id|iƒ}|itjo |d=nt |i |i d|t |ƒ|_||i_|iSnXdS(s-get an interface to the inverse graph mappings source_ids target_idsedge_ids attrAliasN( sselfs_inversesAttributeErrorsdicts targetSQLs sourceSQLsedgeSQLs attrAliassNonesSQLGraphsnamescursorsgraph_db_inverse_refs(sselfs attrAlias((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__ºs     ccs+x$ti|ƒD]}|i|ƒVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks unpack_source(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__Êsccs=x6ti|ƒD]%}|i|ƒ|i||ƒfVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks unpack_sources _edgeClass(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsÎsccs.x'ti|ƒD]}|i||ƒVqWdS(N(sSQLTableMultiNoCaches__iter__sselfsks _edgeClass(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervaluesÒscCs;gi}ti|ƒD]}||i|ƒƒq~SdS(N(sappends_[1]sSQLTableMultiNoCacheskeyssselfsks unpack_source(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysÖscCst|iƒƒSdS(N(slistsselfs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesÙscCst|iƒƒSdS(N(slistsselfs iteritems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitemsÜscCs5|iid|i|ifƒ|iiƒdSdS(s#get number of source nodes in graphs!select count(distinct %s) from %siN(sselfscursorsexecutes sourceSQLsnamesfetchone(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__âs ("s__name__s __module__s__doc__s _distinct_keysSQLTableMultiNoCaches _pickleAttrsscopysupdatesdicts SQLEdgeDicts _edgeClasss__init__s __getitem__s__iadd__s__isub__s graph_setitems __setitem__s __contains__s __invert__s__iter__s iteritemss itervaluesskeyssvaluessitemssSQLGraphEdgeDescriptorsedgess update_graphs__len__s graph_cmps__cmp__soverride_rich_cmpslocalssadd_standard_packing_methods(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraphos2               #s SQLIDGraphcBstZeeƒƒRS(N(s__name__s __module__sadd_trivial_packing_methodsslocals(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLIDGraphssSQLEdgeDictClusteredcBs tZdZd„Zd„ZRS(s:simple cache for 2nd level dictionary of target_id:edge_idcCs#||_||_ti|ƒdS(N(sgsselfsfromNodesdicts__init__(sselfsgsfromNode((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__s  cCs2x'|D]\}}ti|||ƒqW|SdS(N(sls target_idsedge_idsdicts __setitem__sself(sselfsls target_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iadd__s (s__name__s __module__s__doc__s__init__s__iadd__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgeDictClustereds  sSQLEdgesClusteredDescrcBstZd„ZRS(Nc Csžt|i|i|i|id|t|tƒ}x`|i i ƒD]O\}}|i gi }|i ƒD]\}}||||fƒqi~ƒqCW|SdS(Nsgraph(sSQLEdgesClusteredsobjstablesedge_ids source_ids target_idsgraph_db_inverse_refssTruesesds iteritemssloadsappends_[1]( sselfsobjsobjtypes_[1]sesds target_ids source_idsedge_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__get__%s  G(s__name__s __module__s__get__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesClusteredDescr#ssSQLGraphClusteredcBsÜtZdZeZddded„Zeddddddddddddd dƒZd „Z d „Z ee d „Z d „Z eƒZeZeeƒƒd„Zd„Zeddddgdeƒƒd„ZRS(sESQL graph with clustered caching -- loads an entire cluster at a times source_ids target_idsedge_idc Ks1dk}t||iƒo×|tjotdƒ‚nd|jo”tdt d|d|d|ƒ|}d||dd|dd |d d|d d |d d|d d |dd|d df |dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__3s    m     stableissourceDBstargetDBsedgeDBcCst|ƒ}h|d<|SdS(Nsd(sstandard_getstatesselfsstate(sselfsstate((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__Ls  c Csêy|i|SWn*tj ot|dƒo‚q<nX|iid|i|i|i |ii |ii |i|ii |ii |ii f |i |ƒfƒ\}}|iii||ƒ|i|iiiƒƒ|i|SdS(sDget edgeDict for source node k, from cache or by loading its clusters _isLoadedsgselect t2.%s,t2.%s,t2.%s from %s t1,%s t2 where t1.%s=%%s and t1.%s=t2.%s group by t2.%sN(sselfsdsksKeyErrorshasattrstables _format_querys source_ids target_idsedge_idsnames clusterKeys primary_keys pack_sourcessqlsparamsscursorsexecutesloadsfetchall(sselfsksparamsssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Qs UcCsJ|tjoy |iSWntj onX|iiid|i|i |i |ii fƒ|iii ƒ}t |_|iiƒnx·|D]¯\}}}|o1|i|ƒ}|i|ƒ}|i|ƒ}ny |i|c||fg7build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysloadfs,  2  cCsÑy |iSWntj onXt|i|i|i|it|ƒ|_||i_xi|i i ƒD]X\}}|ii gi }|i ƒD]\}}||||fƒq“~dtƒqjW|iSdS(s"interface to reverse graph mappingsunpackN(sselfs_inversesAttributeErrorsSQLGraphClusteredstables target_ids source_idsedge_idsgraph_db_inverse_refssds iteritemsssourcesloadsappends_[1]stargetsedgesFalse(sselfsdssourcesedges_[1]starget((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__€s   BcCst|iƒƒSdS(s#uses db select; does not force loadN(sitersselfskeys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__”scCsh|iiid|i|iifƒgi}|iiiƒD]}||i |dƒƒq@~SdS(s#uses db select; does not force loadsselect distinct(%s) from %siN( sselfstablescursorsexecutes source_idsnamesappends_[1]sfetchallsts unpack_source(sselfs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys˜s&s iteritemssitemss itervaluessvaluess*lambda self: (self.load(), self.d.%s())[1]cCs0y||}tSWntj o tSnXdS(N(sselfsksxsTruesKeyErrorsFalse(sselfsksx((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__¢s  (s__name__s __module__s__doc__sSQLEdgeDictClustereds_edgeDictClasssNones__init__sdicts _pickleAttrss __getstate__s __getitem__sTruesloads __invert__sSQLEdgesClusteredDescrsedgess update_graphsupdatesadd_standard_packing_methodsslocalss__iter__skeyss methodFactorys __contains__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLGraphClustered/s"         sSQLIDGraphClusteredcBstZeeƒƒRS(N(s__name__s __module__sadd_trivial_packing_methodsslocals(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLIDGraphClusteredªssSQLEdgesClusteredcBsBtZdZeZeiiƒZeie ddƒƒd„Z RS(s%edges interface for SQLGraphClusteredsgraphicCs‰|iƒg}xn|iiƒD]]\}}xN|D]F\}}|i |i i |ƒ|i i |ƒ|i i |ƒfƒq3Wq W|SdS(N(sselfsloadsresultsds iteritemssedge_idsls source_ids target_idsappendsgraphs unpack_sources unpack_targets unpack_edge(sselfs target_idslsresultsedge_ids source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys¶s   B( s__name__s __module__s__doc__slists_edgeDictClasssSQLGraphClustereds _pickleAttrsscopysupdatesdictskeys(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLEdgesClustered°s sForeignKeyInversecBsztZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d „Z d „ZRS( s;map each key to a single value according to its foreign keycCs ||_dS(N(sgsself(sselfsg((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ÄscCsI|i|ƒt||iiƒ}|tjotSn|ii|SdS(N( sselfs check_objsobjsgetattrsgs keyColumns source_idsNonessourceDB(sselfsobjs source_id((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Çs   cCsq|i|ƒ|tj ot|i||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__Îs    cCsJy$|i|iij o t‚nWntj otdƒ‚nXdS(s&raise KeyError if obj not from this dbs'key is not from targetDB of this graph!N(sobjsdbsselfsgstargetDBsAttributeErrorsKeyError(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys check_objÚs cCs3y|i|ƒtSWntj o tSnXdS(N(sselfs check_objsobjsTruesKeyErrorsFalse(sselfsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__âs  cCs|iiiƒSdS(N(sselfsgstargetDBs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__éscCs|iiiƒSdS(N(sselfsgstargetDBsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysìsccsYxR|D]J}t||iiƒ}|tjo|tfVq||ii|fVqWdS(N(sselfsobjsgetattrsgs keyColumns source_idsNonessourceDB(sselfs source_idsobj((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritemsïs  cCst|iƒƒSdS(N(slistsselfs iteritems(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysitems÷sccs%x|iƒD]\}}|Vq WdS(N(sselfs iteritemssobjsval(sselfsobjsval((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys itervaluesús cCst|iƒƒSdS(N(slistsselfs itervalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysvaluesþscCs |iSdS(N(sselfsg(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__s(s__name__s __module__s__doc__s__init__s __getitem__s __setitem__s check_objs __contains__s__iter__skeyss iteritemssitemss itervaluessvaluess __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyInverseÁs           sForeignKeyEdgecBs)tZdZd„Zd„Zd„ZRS(s±edge interface to a foreign key in an SQL table. Caches dict of target nodes in itself; provides dict interface. Adds or deletes edges by setting foreign key values in the tablecCscti|ƒ||_||_x=|iid|i|i fƒD]}ti ||t ƒqBWdS(Ns where %s=%%s( sdicts__init__sselfsgskssrcstargetDBsselects keyColumnsidsvs __setitem__sNone(sselfsgsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__ s    #cCsÔt|dƒ p|i|iij otdƒ‚n|tj ot dƒ‚nt|dƒ o<|ii |}|tj ot i |i||ƒq¡nt||ii|iiƒt i||tƒdS(Nsdbs0dest is not in the targetDB bound to this graph!s/sorry,this graph cannot store edge information!s _localOnly(shasattrsdestsdbsselfsgstargetDBsKeyErrorsvsNones ValueErrors_inverses old_sourcesdicts __delitem__ssetattrs keyColumnssrcsids __setitem__(sselfsdestsvs old_source((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__s'  cCs*t||iitƒti||ƒdS(N(ssetattrsdestsselfsgs keyColumnsNonesdicts __delitem__(sselfsdest((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__s(s__name__s __module__s__doc__s__init__s __setitem__s __delitem__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyEdges   sForeignKeyGraphc BsztZdZed„ZeddddddddƒZeZe Z d„Z d„Z d „Z d „Zd „ZeZRS( sugraph interface to a foreign key in an SQL table Caches dict of target nodes in itself; provides dict interface. cKsZ|ot|ƒ|_n h|_||_||_||_||_t|ƒ|_dS(sÅsourceDB is any database of source nodes; targetDB must be an SQL database of target nodes; keyColumn is the foreign key column name in targetDB for looking up sourceDB IDs.N( sautoGCsRecentValueDictionarysselfs_weakValueDictssourceDBstargetDBs keyColumnsForeignKeyInverses_inverse(sselfssourceDBstargetDBs keyColumnsautoGCskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__*s     ssourceDBistargetDBs keyColumnsautoGCcCstdtdtƒSdS(sRProvide custom schema rule for inverting this graph... Just use keyColumn!sinverts uniqueMappingN(sdictsTrue(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_inverse_schema=scCsƒt|dƒ p|i|ij otdƒ‚ny|i|iSWntj onXt||ƒ}||i|i<|SdS(NsdbsMobject is not in the sourceDB bound to this graph!( shasattrsksdbsselfssourceDBsKeyErrors_weakValueDictsidsForeignKeyEdgesd(sselfsksd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__Bs$cCstdƒ‚dS(Nssdo not save as g[k]=v. Instead follow a graph interface: g[src]+=dest, or g[src][dest]=None (no edge info allowed)(sKeyError(sselfsksv((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __setitem__NscCstdƒ‚dS(Ns?Instead of del g[k], follow a graph interface: del g[src][dest](sKeyError(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __delitem__RscCs|iiƒSdS(N(sselfssourceDBsvalues(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysVs(s__name__s __module__s__doc__sTrues__init__sdicts _pickleAttrssstandard_getstates __getstate__sstandard_setstates __setstate__s_inverse_schemas __getitem__s __setitem__s __delitem__skeyssstandard_inverts __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysForeignKeyGraph%s  !    c Cs|id|ƒ|idƒh}gi}|iƒD]}||dƒq8~}x¢|D]š} |d| } t | |ƒ}||| via , and store primary keys in idDict, along with a list of the tables each key indexes. suse %ss show tablesis.iýÿÿÿs_idN(scursorsexecutesnamestablessappends_[1]sfetchallscslststnamesSQLTablesos descriptionsfs primary_keysidDicts setdefault( snamescursorsidDictstablesscsfslsos_[1]stnamest((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysdescribeDBTables\s" 1  cCs¹|tjo h}nx—|iƒD]‰}|io9|i|jog||i dictionary.iýÿÿÿs_idN( sidDictsNonestablessvaluessos primary_keysappends descriptionsf(stablessidDictsosf((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysindexIDsqs     cCsIh}x8|iƒD]*\}}|i|ƒo|||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys suffixSubsets icCs‚tƒ}xn|iƒD]`}xW|iD]L}||ijo t}nt }|i |||ƒ|i |||ƒq&WqW|SdS(N( s dictgraphsgstablessvaluessts descriptionsfs primary_keys PRIMARY_KEYsedgeInfosNonessetEdge(stablessidDictsgsfsedgeInfost((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys graphDBTabless    s varchar(32)sfloatcCs†y|iƒ}Wntj o dSnXyt||||||ƒWnnXt |||ƒx|D]}t |||ƒqhWdS(sûSave rows into SQL tableName using cursor, with optional translations of columns to specific SQL types (specified by typeTranslation dict). - optionDict can specify columns that are allowed to be NULL. - indexDict can specify columns that must be indexed; columns whose names end in _id will be indexed by default. - rows must be an iterator which in turn returns dictionaries, each representing a tuple of values (indexed by their column names). N( srowssnextsrows StopIterationscreateTableFromRowscursors tableNamestypeTranslations optionalDicts indexDictsstoreRow(srowss tableNamescursorstypeTranslations optionalDicts indexDictsrow((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscreateTableFromReprŸs  c Cs|g}x|iƒD]÷\} }t} |tjo | |jo|| } nXt|ƒt jot t|ƒ} n1x-t D]%} t || ƒot | } Pq{q{W| tjot d| ƒ‚nd| | f}|tjp | |jo|d7}n|i|ƒqWxA|D]9} | ddjp | |jo|id| ƒqqWd|di|ƒf} |i| ƒdS( Ns!Don't know SQL type to use for %ss%s %ss not nulliýÿÿÿs_ids index(%s)s"create table if not exists %s (%s)s,(s create_defssrowsitemsscolsvalsNonescoltypestypeTranslationstypesSQLTypeTranslationsts isinstances TypeErrors create_defs optionalDictsappends indexDicts tableNamesjoinscmdscursorsexecute( scursors tableNamesrowstypeTranslations optionalDicts indexDicts create_defssvals create_defscmdstscoltypescol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscreateTableFromRow¹s2    cCsLdit|ƒdgƒ}d||f}|i|t|i ƒƒƒdS(Ns,s%ssinsert into %s values (%s)( sjoinslensrows row_formats tableNamescmdscursorsexecutestuplesvalues(scursors tableNamesrows row_formatscmd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstoreRowÕscCsLdit|ƒdgƒ}d||f}|i|t|i ƒƒƒdS(Ns,s%ss"insert delayed into %s values (%s)( sjoinslensrows row_formats tableNamescmdscursorsexecutestuplesvalues(scursors tableNamesrows row_formatscmd((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstoreRowDelayedÛss TableGroupcBs&tZdZded„Zd„ZRS(s7provide attribute access to dbname qualified tablenamesstestcKsŠti|ƒ||_|tj o ||_nxS|iƒD]E\}}|tj o d|jo|id|}n|||build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__äs     cCs ||SdS(N(sselfsk(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getattr__îs(s__name__s __module__s__doc__sNones__init__s __getattr__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys TableGroupás  cOs5tƒ}|i||Ž}|iƒ}||fSdS(N(s import_sqlitessqlitesconnectsargsskwargss connectionscursor(sargsskwargsssqlitescursors connection((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyssqlite_connectòs  s DBServerInfocBsGtZdZdeed„Zd„Zed„Zd„Z d„Z RS(s(picklable reference to a database serversMySQLdbcOsyt||_Wn#tj otd|ƒ‚nX||_||_||_||_||_ |io|i otdƒ‚ndS(Ns.Module name not found in _DBServerModuleDict: sQserverSideCursors=True requires blockIterators=True!( s_DBServerModuleDicts moduleNamesselfs __class__sKeyErrors ValueErrorsargsskwargssserverSideCursorssblockIteratorsscustom_iter_keys(sselfs moduleNamesserverSideCursorssblockIteratorssargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__üs     cCs6y |iSWn$tj o|iƒ|iSnXdS(s:returns cursor associated with the DB server info (reused)N(sselfs_cursorsAttributeErrors_start_connection(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscursor s   cCsPt|dƒ o|iƒn|iiƒ}|tj o ||_n|SdS(s2returns a NEW cursor; you must close it yourself! s _connectionN(shasattrsselfs_start_connections _connectionscursors arraysizesNone(sselfs arraysizescursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys new_cursors  cCs*|iiƒ|iiƒ|`|`dS(s#Close file containing this databaseN(sselfs_cursorscloses _connection(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscloses   c Cs8td|id|id|id|id|iƒSdS(sreturn all picklable argumentssargsskwargss moduleNamesserverSideCursorsscustom_iter_keysN(sdictsselfsargsskwargss moduleNamesserverSideCursorsscustom_iter_keys(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__$s   ( s__name__s __module__s__doc__sFalsesTrues__init__scursorsNones new_cursorscloses __getstate__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys DBServerInfoùs   sMySQLServerInfocBsDtZdZdZd„Zed„Zd„Zed„d„Z RS(s8customized for MySQLdb SSCursor support via new_cursor()smysqlcCs%t|i|iŽ\|_|_dS(N(s mysql_connectsselfsargsskwargss _connections_cursor(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_start_connection0scCs—|i oti||ƒSny |i}Wn7tj o+tdt |i |i Ž\|_}nX|ii ƒ}|t j o ||_n|SdS(s provide streaming cursor supports useStreamingN(sselfsserverSideCursorss DBServerInfos new_cursors arraysizes_conn_sscursorsconnsAttributeErrors mysql_connectsTruesargsskwargsscursorsNone(sselfs arraysizescursorsconn((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys new_cursor4s  )  cCs>ti|ƒy|iiƒ|`Wntj onXdS(N(s DBServerInfosclosesselfs_conn_sscursorsAttributeError(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyscloseDs    cCs)gi}|D]}||dƒq~S(Ni(sappends_[1]sxst(sxs_[1]st((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysMsc Ks[t|||}y |i}Wntj onX|id|d|d|d|ƒSdS(Nscursorscache_fsmap_fsfetch_f( s BlockIteratorsdbscursorskwargssblock_iteratorscache_fsAttributeErrorsgeneric_iteratorsmap_f(sselfsdbscursorsmap_fscache_fskwargssblock_iterator((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iter_keysLs ( s__name__s __module__s__doc__s _serverTypes_start_connectionsNones new_cursorsclosesiters iter_keys(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysMySQLServerInfo,s    s CursorClosercBs tZdZd„Zd„ZRS(söcontainer for ensuring cursor.close() is called, when this obj deleted. For Python 2.5+, we could replace this with a try... finally clause in a generator function such as generic_iterator(); see PEP 342 or What's New in Python 2.5. cCs ||_dS(N(scursorsself(sselfscursor((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__]scCs|iiƒdS(N(sselfscursorsclose(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__del__`s(s__name__s __module__s__doc__s__init__s__del__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys CursorCloserWs  s BlockIteratorcBs#tZdZdd„Zd„ZRS(s5workaround for MySQLdb iteration horrible performancesc  sg||_||_||_||_d|_|doó|i|_|djo8gi}|i D]} ||i | ƒqb~|_ qQt|i ƒ}y|i|ƒ‰Wn/tj o#t|i ƒ‰||g7}nXdi|ƒ|_tt|i ƒƒ|_ ˆdjo‡d†|_qQn'd|i|_|i |if|_ f|_t|_dS(NssorderBys*s,ics)gi}|D]}||ˆƒq~S(N(sappends_[1]sxstsi(sxs_[1]st(si(s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys{ss WHERE %s>%%s(sdbsselfscursors selectColsskwargss whereClausesiterSQLswhereSQLsappends_[1]s iterColumnsscolsdatas whereParamsslistsindexsis ValueErrorslensjoinsrangescache_fs primary_keysparamssFalsesdone( sselfsdbscursors selectColss whereClauseskwargss_[1]sis iterColumnsscol((sis>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__gs.        8  c Csû|iofSn|ii|i|id|idd|iid|i|i |ii ƒ}t |ƒ|iijot |_|Sn|d}t |ƒdjo5gi}|iD]}|||ƒqº~|_n ||_|i|_|SdS(sget the next block of datascursorslimitsLIMIT %ss selectColsiÿÿÿÿiN(sselfsdonesdbs_selects whereClausesparamsscursors arraysizes selectColsskwargssfetchallsrowsslensTrueslastrowsappends_[1]s whereParamssicolswhereSQL(sselfsrowss_[1]slastrowsicol((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__call__‚s    5  (s__name__s __module__s__doc__s__init__s__call__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys BlockIteratords  sSQLiteServerInfocBs/tZdZdZd„Zd„Zd„ZRS(s(picklable reference to a sqlite databasessqlitecOs&ti|ddt|ƒ||ŽdS(s)Takes same arguments as sqlite3.connect()ssqlite3sdatabaseN(s DBServerInfos__init__sselfsSourceFileNamesdatabasesargsskwargs(sselfsdatabasesargsskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__šs cCs%t|i|iŽ\|_|_dS(N(ssqlite_connectsselfsargsskwargss _connections_cursor(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_start_connection scCsQ|iidtƒp |id}|djotdƒ‚nti|ƒSdS(Nsdatabaseis:memory:s+SQLite in-memory database is not picklable!( sselfskwargssgetsFalsesargssdatabases ValueErrors DBServerInfos __getstate__(sselfsdatabase((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getstate__¤s# (s__name__s __module__s__doc__s _serverTypes__init__s_start_connections __getstate__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysSQLiteServerInfo–s   sMySQLdbsMapViewc Bs¡tZdZeeed„ZeZeZd„Ze ddddddddddƒZ e Z e ZeZZZZZZZd „Zd „Zd „ZRS( s4general purpose 1:1 mapping defined by any SQL querycKs°||_||_||_||_|tjo\|tj o|iƒ}qy |i}Wntj ot dƒ‚qX|iƒ}n||_||_|i t ƒdS(Ns&you must provide serverInfo or cursor!( ssourceDBsselfstargetDBsviewSQLs inverseSQLscursorsNones serverInfosAttributeErrors ValueErrorsget_sql_formatsFalse(sselfssourceDBstargetDBsviewSQLscursors serverInfos inverseSQLskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__²s         cCs¾t|dƒ p|i|ij otdƒ‚n|i|i|ifƒ\}}|i i ||ƒ|i i dƒ}t|ƒdjotdt|ƒƒ‚n|i|ddSdS(Nsdbs0object is not in the sourceDB bound to this map!iis&%s not found in MapView, or not uniquei(shasattrsksdbsselfssourceDBsKeyErrors _format_querysviewSQLsidssqlsparamsscursorsexecutes fetchmanystslensstrstargetDB(sselfsksparamsstssql((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__És$!ssourceDBistargetDBsviewSQLs serverInfos inverseSQLccsDx=|iiƒD],}y|||VWqtj oqXqWdS(s<only yield sourceDB items that are actually in this mapping!N(sselfssourceDBs itervaluessksKeyError(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__ÛscCs)gi}|D]}||ƒq~SdS(N(sappends_[1]sselfsk(sselfs_[1]sk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeysäsc Cs‘y |iSWntj os|itjotdƒ‚n|i|i|i|i|i d|i d|i ƒ|_||i_|iSnXdS(Nsthis MapView has no inverseSQL!s serverInfos inverseSQL( sselfs_inversesAttributeErrors inverseSQLsNones ValueErrors __class__stargetDBssourceDBscursors serverInfosviewSQL(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __invert__çs    (s__name__s __module__s__doc__sNones__init__s_schemaModuleDictsget_table_schemasget_sql_formats __getitem__sdicts _pickleAttrssstandard_getstates __getstate__sstandard_setstates __setstate__sread_only_errors __setitem__s __delitem__sclearspopspopitemsupdates setdefaults__iter__skeyss __invert__(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysMapView¯s    sGraphViewEdgeDictcBsntZdZd„Zd„Zd„Zd„Zd„Zed„Z d„Z e Z Z ZZZZZRS(s6edge dictionary for GraphView: just pre-loaded on initc Cs%||_||_|ii|ii|ifƒ\}}|iii ||ƒ|iii ƒ}t |ƒdjot d|iƒ‚ngi}|D]}||dƒq™~|_h}|iitj o'xC|D]}|d||dbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__øs"  '.cCst|iƒSdS(N(slensselfstargets(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__ sccs&x|iD]}|ii|Vq WdS(N(sselfstargetssksgstargetDB(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__iter__ s cCst|ƒSdS(N(slistsself(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pyskeys sccs||iitj o=xb|iD]+}|ii||ii|i|fVqWn)x%|iD]}|ii|tfVqZWdS(N(sselfsgsedgeDBsNonestargetsskstargetDBs targetDict(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys iteritems s - cCs˜y:|i|iij otdƒ‚n|i|i}Wnt j otdƒ‚nX|odSn|ii t j o|ii |Snt SdS(sBfor the specified target object, return its associated edge objectskey is not part of targetDB!skey has no id or db attribute?!N( sosdbsselfsgstargetDBsKeyErrors targetDictsidsedgeIDsAttributeErrors exitIfFoundsedgeDBsNone(sselfsos exitIfFoundsedgeID((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__ scCs6y|i|tƒtSWntj o tSnXdS(N(sselfs __getitem__sosTruesKeyErrorsFalse(sselfso((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __contains__+ s (s__name__s __module__s__doc__s__init__s__len__s__iter__skeyss iteritemssFalses __getitem__s __contains__sread_only_errors __setitem__s __delitem__sclearspopspopitemsupdates setdefault(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysGraphViewEdgeDictõs        s GraphViewcBsKtZdZeed„Zd„ZeiiƒZei e ddƒƒRS(s8general purpose graph interface defined by any SQL querycKs)||_ti||||||dS(sOif edgeDB not None, viewSQL query must return (targetID, edgeID) tuplesN( sedgeDBsselfsMapViews__init__ssourceDBstargetDBsviewSQLscursorskwargs(sselfssourceDBstargetDBsviewSQLscursorsedgeDBskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__9 s cCsEt|dƒ p|i|ij otdƒ‚nt||ƒSdS(Nsdbs0object is not in the sourceDB bound to this map!(shasattrsksdbsselfssourceDBsKeyErrorsGraphViewEdgeDict(sselfsk((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys __getitem__@ s$sedgeDBi( s__name__s __module__s__doc__sNones__init__s __getitem__sMapViews _pickleAttrsscopysupdatesdict(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys GraphView6 s  s SQLSequencecBs>tZdZd„ZeeƒZd„Zd„Zd„ZRS(szTransparent access to a DB row representing a sequence. Use attrAlias dict to rename 'length' to something else. cKs ||_tid||dS(Nsdb(sdbs seqInfoDictsSQLRows_init_subclassskwargs(sclssdbskwargs((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys_init_subclassN s cCs!ti||ƒti|ƒdS(N(sSQLRows__init__sselfsids SequenceBase(sselfsid((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__init__S scCs |iSdS(N(sselfslength(sself((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys__len__W scCs2|id|iidƒ|d||fƒSdS(s@Efficient access to slice of a sequence, useful for huge contigssU%%(SUBSTRING)s(%s %%(SUBSTR_FROM)s %d %%(SUBSTR_FOR)s %d)sseqiN(sselfs_selectsdbs_attrSQLsstartsend(sselfsstartsend((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysstrsliceZ s(s__name__s __module__s__doc__s_init_subclasss classmethods__init__s__len__sstrslice(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys SQLSequenceH s     sDNASQLSequencecBstZeZRS(N(s__name__s __module__s DNA_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysDNASQLSequencea ssRNASQLSequencecBstZeZRS(N(s__name__s __module__s RNA_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysRNASQLSequencee ssProteinSQLSequencecBstZeZRS(N(s__name__s __module__sPROTEIN_SEQTYPEs_seqtype(((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pysProteinSQLSequencei s(vs __future__s generatorssmappingssequences SequenceBases DNA_SEQTYPEs RNA_SEQTYPEsPROTEIN_SEQTYPEstypess classutils methodFactorysstandard_getstatesoverride_rich_cmpsgenerate_itemssget_bound_subclasssstandard_setstatesget_valid_pathsstandard_invertsRecentValueDictionarysread_only_errorsSourceFileNames split_kwargssossplatformsUserDictswarningssloggersobjectsTupleDescriptorsTupleIDDescriptorsTupleDescriptorRWs SQLDescriptorsSQLDescriptorRWsReadOnlyDescriptorsselect_from_rowsinit_row_subclasssdir_rowsTupleOsinsert_and_cache_idsTupleORWs_RWClasssColumnDescriptorsReadOnlyColumnDescs_readOnlyClasssSQLRowsSQLRowRWs list_to_dictsNonesget_name_cursorsFalses mysql_connectsdicts _mysqlMacrossTruesmysql_table_schemas _sqliteMacross import_sqlitessqlite_table_schemas SQLFormatDictsget_table_schemas_schemaModuleDicts DictMixins SQLTableBasesgetKeyssiters iter_keyssSQLTablesgetClusterKeyssSQLTableClusteredsSQLForeignRelationsSQLTableNoCaches _tableclasssSQLTableMultiNoCachesSQLEdgess SQLEdgeDictsSQLEdgelessDicts_edgelessClasssSQLGraphEdgeDescriptorsgetColumnTypessSQLGraphs SQLIDGraphs _IDGraphClasssSQLEdgeDictClusteredsSQLEdgesClusteredDescrsSQLGraphClusteredsSQLIDGraphClusteredsSQLEdgesClusteredsForeignKeyInversesForeignKeyEdgesForeignKeyGraphsdescribeDBTablessindexIDss suffixSubsets PRIMARY_KEYs graphDBTabless StringTypesIntTypes FloatTypesSQLTypeTranslationscreateTableFromReprscreateTableFromRowsstoreRowsstoreRowDelayeds TableGroupssqlite_connects DBServerInfosMySQLServerInfos CursorClosers BlockIteratorsSQLiteServerInfos_DBServerModuleDictsMapViewsGraphViewEdgeDicts GraphViews SQLSequencesDNASQLSequencesRNASQLSequencesProteinSQLSequence(csProteinSQLSequences iter_keysscreateTableFromReprsMapViewsdir_rowsTupleORWsTupleDescriptorsForeignKeyInversesMySQLServerInfosplatforms_DBServerModuleDicts generatorss mysql_connectsSQLEdgesClusteredsgetClusterKeyssgetColumnTypess suffixSubsetsSQLTableClustereds DBServerInfosForeignKeyEdgesPROTEIN_SEQTYPEsSQLIDGraphClustereds_schemaModuleDictsstandard_getstatesReadOnlyColumnDescsRNASQLSequences SQLFormatDictsstandard_invertsgetKeyssForeignKeyGraphs CursorClosers import_sqlitesSQLEdgess TableGroupsSQLTableMultiNoCachesSQLTablesSQLForeignRelationsReadOnlyDescriptors RNA_SEQTYPEsTupleDescriptorRWsgenerate_itemssSQLTypeTranslationsUserDicts methodFactorysstandard_setstatesSQLEdgelessDictsinit_row_subclasssread_only_errors list_to_dictsColumnDescriptorsSQLEdgesClusteredDescrsselect_from_rowsGraphViewEdgeDictsSQLRowRWs BlockIterators SQLTableBasesossSQLRowsTupleIDDescriptorsstoreRowsSQLDescriptorRWssqlite_table_schemas DNA_SEQTYPEs PRIMARY_KEYs SQLIDGraphs split_kwargss SQLDescriptors _sqliteMacross graphDBTablessmysql_table_schemas _mysqlMacrossSourceFileNamesloggersdescribeDBTablessget_valid_pathsstoreRowDelayedsSQLGraphClusteredsSQLEdgeDictClusteredsindexIDssSQLGraphEdgeDescriptorsSQLiteServerInfosRecentValueDictionaryscreateTableFromRowsinsert_and_cache_idsSQLTableNoCachesTupleOssqlite_connects GraphViewswarningssget_name_cursorsDNASQLSequencesoverride_rich_cmps SQLSequencesget_table_schemasSQLGraphs SQLEdgeDictstypess SequenceBasesget_bound_subclass((s>build/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/sqlgraph.pys?sÄ  O            (   -    .4 !ÿl O *5 #+o  .   { D 7    *   3+ 2  FAPKd—~;öý‡¬pygr/translationDB.pyfrom seqdb import SequenceDB, BasicSeqInfoDict from annotation import AnnotationDB, TranslationAnnot, TranslationAnnotSlice import classutil import sequence import UserDict class SeqTranslator(sequence.SequenceBase): """Translator object for positive or minus strand of a sequence. Slicing returns TranslationAnnotSlice of the appropriate TranslationAnnot representing one of the six possible frames for this sequence.""" def __init__(self, db, id, reversePath=None): self.id = id sequence.SequenceBase.__init__(self) if reversePath: # create top-level object for reverse strand self.orientation = -1 self.start = -len(self) self.stop = 0 self._reverse = reversePath if self.id not in self.db.seqDB: raise KeyError('sequence %s not in db %s' % (self.id, self.db)) def __getitem__(self, k): """get TranslationAnnotSlice for coordinates given by slice k """ start = k.start # deal with [:stop] slices if start is None: start = self.start stop = k.stop # deal with [start:] slices if stop is None: stop = self.stop annoID = self._get_anno_id(start) a = self.db.annodb[annoID] # get TranslationAnnot object s = a.sequence # corresponding nucleotide region return a[(start - s.start) / 3: (stop - s.start) / 3] def absolute_slice(self, start, stop): """get protein slice in absolute nucleotide coords; perform negation before slicing """ if start<0: return (-self)[start:stop] else: return self[start:stop] def __len__(self): return self.db.seqInfoDict[self.id].length def __neg__(self): """get SeqTranslator for the opposite strand """ try: return self._reverse except AttributeError: self._reverse = self.__class__(self.db, self.id, reversePath=self) return self._reverse def _get_anno_id(self, start): """get annotation ID for frame starting at start """ if self.orientation > 0: # positive strand return '%s:%d' % (self.id, start % 3) else: # negative strand return '%s:-%d' % (self.id, (-start) % 3) def iter_frames(self): 'iterate over the 6 possible frames, yielding TranslationAnnot' for frame in ('0', '1', '2', '-0', '-1', '-2'): yield self.db.annodb['%s:%s' % (self.id, frame)] def __repr__(self): return 'SeqTranslator(' + sequence.SequenceBase.__repr__(self) + ')' class TranslationDB(SequenceDB): """Provides an automatic translation interface for a nucleotide sequence database: slicing of top-level sequence objects will return the corresponding TranslationAnnotSlice for that slice, i.e. the translated protein sequence, rather than the nucleotide sequence. """ itemClass = SeqTranslator _seqtype = sequence.DNA_SEQTYPE def __init__(self, seqDB, **kwargs): self.seqDB = seqDB try: self.seqInfoDict = seqDB.seqInfoDict except AttributeError: self.seqInfoDict = BasicSeqInfoDict(seqDB) self.annodb = AnnotationDB(SixFrameInfo(seqDB), seqDB, itemClass=TranslationAnnot, itemSliceClass=TranslationAnnotSlice, sliceAttrDict=dict(id=0, start=1, stop=2), checkFirstID=False) SequenceDB.__init__(self, **kwargs) class SixFrameInfo(object, UserDict.DictMixin): """Dictionary of slice info for all six frames of each seq in seqDB. """ def __init__(self, seqDB): self.seqDB = seqDB def __getitem__(self, k): "convert ID of form seqID:frame into slice info tuple" i = k.rfind(':') if i < 0: raise KeyError('invalid TranslationInfo key: %s' % (k, )) seqID = k[:i] length = len(self.seqDB[seqID]) # sequence length frame = int(k[i+1:]) if k[i+1] == '-': # negative frame -0, -1, or -2 return (seqID, -(length - ((length + frame) % 3)), frame) else: # positive frame 0, 1 or 2 return (seqID, frame, length - ((length - frame) % 3)) def __len__(self): return 6 * len(self.seqDB) def __iter__(self): for seqID in self.seqDB: for frame in (':0', ':1', ':2', ':-0', ':-1', ':-2'): yield seqID + frame def keys(self): return list(self) # these methods should not be implemented for read-only database. clear = setdefault = pop = popitem = copy = update = \ classutil.read_only_error def get_translation_db(seqDB): """Use cached seqDB.translationDB if already present, or create it """ try: return seqDB.translationDB except AttributeError: # create a new TranslationAnnot DB tdb = TranslationDB(seqDB) try: seqDB.translationDB = tdb except AttributeError: pass # won't let us cache? Just hand back the TranslationDB return tdb PKðŠ’;ŠW˜é é pygr/translationDB.pyc;ò |†Kc@sŸdklZlZdklZlZlZdkZdkZdk Z dei fd„ƒYZ defd„ƒYZ de e ifd„ƒYZd „ZdS( (s SequenceDBsBasicSeqInfoDict(s AnnotationDBsTranslationAnnotsTranslationAnnotSliceNs SeqTranslatorcBsYtZdZed„Zd„Zd„Zd„Zd„Zd„Z d„Z d„Z RS( sÒTranslator object for positive or minus strand of a sequence. Slicing returns TranslationAnnotSlice of the appropriate TranslationAnnot representing one of the six possible frames for this sequence.cCs‰||_tii|ƒ|o/d|_t|ƒ |_d|_ ||_ n|i|i i jo t d|i|i fƒ‚ndS(Niÿÿÿÿissequence %s not in db %s(sidsselfssequences SequenceBases__init__s reversePaths orientationslensstartsstops_reversesdbsseqDBsKeyError(sselfsdbsids reversePath((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__s    cCs“|i}|tjo |i}n|i}|tjo |i}n|i|ƒ}|ii|}|i }|||id||id!SdS(s;get TranslationAnnotSlice for coordinates given by slice k iN( sksstartsNonesselfsstops _get_anno_idsannoIDsdbsannodbsassequencess(sselfsksasstopsannoIDsstartss((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys __getitem__s       cCs,|djo| ||!Sn |||!SdS(sYget protein slice in absolute nucleotide coords; perform negation before slicing iN(sstartsselfsstop(sselfsstartsstop((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pysabsolute_slice(s cCs|ii|iiSdS(N(sselfsdbs seqInfoDictsidslength(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__len__0scCsMy |iSWn;tj o/|i|i|id|ƒ|_|iSnXdS(s*get SeqTranslator for the opposite strand s reversePathN(sselfs_reversesAttributeErrors __class__sdbsid(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__neg__3s cCsC|idjod|i|dfSnd|i| dfSdS(s.get annotation ID for frame starting at start is%s:%dis%s:-%dN(sselfs orientationsidsstart(sselfsstart((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys _get_anno_id<sccsBx;ddddddfD]!}|iid|i|fVqWdS( s=iterate over the 6 possible frames, yielding TranslationAnnots0s1s2s-0s-1s-2s%s:%sN(sframesselfsdbsannodbsid(sselfsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys iter_framesCscCsdtii|ƒdSdS(NsSeqTranslator(s)(ssequences SequenceBases__repr__sself(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__repr__Hs( s__name__s __module__s__doc__sNones__init__s __getitem__sabsolute_slices__len__s__neg__s _get_anno_ids iter_framess__repr__(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys SeqTranslators      s TranslationDBcBs&tZdZeZeiZd„ZRS(sProvides an automatic translation interface for a nucleotide sequence database: slicing of top-level sequence objects will return the corresponding TranslationAnnotSlice for that slice, i.e. the translated protein sequence, rather than the nucleotide sequence. cKs—||_y|i|_Wn"tj ot|ƒ|_nXtt|ƒ|dtdtdt dddddd ƒd t ƒ|_ t i ||dS( Ns itemClasssitemSliceClasss sliceAttrDictsidisstartisstopis checkFirstID(sseqDBsselfs seqInfoDictsAttributeErrorsBasicSeqInfoDicts AnnotationDBs SixFrameInfosTranslationAnnotsTranslationAnnotSlicesdictsFalsesannodbs SequenceDBs__init__skwargs(sselfsseqDBskwargs((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__Ts ( s__name__s __module__s__doc__s SeqTranslators itemClassssequences DNA_SEQTYPEs_seqtypes__init__(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys TranslationDBLs  s SixFrameInfocBsXtZdZd„Zd„Zd„Zd„Zd„Zei Z Z Z Z ZZRS(sBDictionary of slice info for all six frames of each seq in seqDB. cCs ||_dS(N(sseqDBsself(sselfsseqDB((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__escCs´|idƒ}|djotd|fƒ‚n|| }t|i|ƒ}t ||dƒ}||ddjo||||d |fSn|||||dfSdS(s4convert ID of form seqID:frame into slice info tuples:isinvalid TranslationInfo key: %sis-iN( sksrfindsisKeyErrorsseqIDslensselfsseqDBslengthsintsframe(sselfsksislengthsseqIDsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys __getitem__hs  cCsdt|iƒSdS(Ni(slensselfsseqDB(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__len__usccsCx<|iD]1}x(ddddddfD]}||Vq)Wq WdS(Ns:0s:1s:2s:-0s:-1s:-2(sselfsseqDBsseqIDsframe(sselfsseqIDsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__iter__xs  cCst|ƒSdS(N(slistsself(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pyskeys}s(s__name__s __module__s__doc__s__init__s __getitem__s__len__s__iter__skeyss classutilsread_only_errorsclears setdefaultspopspopitemscopysupdate(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys SixFrameInfobs     cCsXy |iSWnFtj o:t|ƒ}y ||_Wntj onX|SnXdS(s@Use cached seqDB.translationDB if already present, or create it N(sseqDBs translationDBsAttributeErrors TranslationDBstdb(sseqDBstdb((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pysget_translation_db…s   (sseqdbs SequenceDBsBasicSeqInfoDicts annotations AnnotationDBsTranslationAnnotsTranslationAnnotSlices classutilssequencesUserDicts SequenceBases SeqTranslators TranslationDBsobjects DictMixins SixFrameInfosget_translation_db( sTranslationAnnotssequencesUserDicts TranslationDBs SixFrameInfos AnnotationDBs SeqTranslators SequenceDBsget_translation_dbsTranslationAnnotSlicesBasicSeqInfoDicts classutil((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys?s   D#PKñŠ’;ŠW˜é é pygr/translationDB.pyo;ò |†Kc@sŸdklZlZdklZlZlZdkZdkZdk Z dei fd„ƒYZ defd„ƒYZ de e ifd„ƒYZd „ZdS( (s SequenceDBsBasicSeqInfoDict(s AnnotationDBsTranslationAnnotsTranslationAnnotSliceNs SeqTranslatorcBsYtZdZed„Zd„Zd„Zd„Zd„Zd„Z d„Z d„Z RS( sÒTranslator object for positive or minus strand of a sequence. Slicing returns TranslationAnnotSlice of the appropriate TranslationAnnot representing one of the six possible frames for this sequence.cCs‰||_tii|ƒ|o/d|_t|ƒ |_d|_ ||_ n|i|i i jo t d|i|i fƒ‚ndS(Niÿÿÿÿissequence %s not in db %s(sidsselfssequences SequenceBases__init__s reversePaths orientationslensstartsstops_reversesdbsseqDBsKeyError(sselfsdbsids reversePath((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__s    cCs“|i}|tjo |i}n|i}|tjo |i}n|i|ƒ}|ii|}|i }|||id||id!SdS(s;get TranslationAnnotSlice for coordinates given by slice k iN( sksstartsNonesselfsstops _get_anno_idsannoIDsdbsannodbsassequencess(sselfsksasstopsannoIDsstartss((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys __getitem__s       cCs,|djo| ||!Sn |||!SdS(sYget protein slice in absolute nucleotide coords; perform negation before slicing iN(sstartsselfsstop(sselfsstartsstop((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pysabsolute_slice(s cCs|ii|iiSdS(N(sselfsdbs seqInfoDictsidslength(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__len__0scCsMy |iSWn;tj o/|i|i|id|ƒ|_|iSnXdS(s*get SeqTranslator for the opposite strand s reversePathN(sselfs_reversesAttributeErrors __class__sdbsid(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__neg__3s cCsC|idjod|i|dfSnd|i| dfSdS(s.get annotation ID for frame starting at start is%s:%dis%s:-%dN(sselfs orientationsidsstart(sselfsstart((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys _get_anno_id<sccsBx;ddddddfD]!}|iid|i|fVqWdS( s=iterate over the 6 possible frames, yielding TranslationAnnots0s1s2s-0s-1s-2s%s:%sN(sframesselfsdbsannodbsid(sselfsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys iter_framesCscCsdtii|ƒdSdS(NsSeqTranslator(s)(ssequences SequenceBases__repr__sself(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__repr__Hs( s__name__s __module__s__doc__sNones__init__s __getitem__sabsolute_slices__len__s__neg__s _get_anno_ids iter_framess__repr__(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys SeqTranslators      s TranslationDBcBs&tZdZeZeiZd„ZRS(sProvides an automatic translation interface for a nucleotide sequence database: slicing of top-level sequence objects will return the corresponding TranslationAnnotSlice for that slice, i.e. the translated protein sequence, rather than the nucleotide sequence. cKs—||_y|i|_Wn"tj ot|ƒ|_nXtt|ƒ|dtdtdt dddddd ƒd t ƒ|_ t i ||dS( Ns itemClasssitemSliceClasss sliceAttrDictsidisstartisstopis checkFirstID(sseqDBsselfs seqInfoDictsAttributeErrorsBasicSeqInfoDicts AnnotationDBs SixFrameInfosTranslationAnnotsTranslationAnnotSlicesdictsFalsesannodbs SequenceDBs__init__skwargs(sselfsseqDBskwargs((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__Ts ( s__name__s __module__s__doc__s SeqTranslators itemClassssequences DNA_SEQTYPEs_seqtypes__init__(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys TranslationDBLs  s SixFrameInfocBsXtZdZd„Zd„Zd„Zd„Zd„Zei Z Z Z Z ZZRS(sBDictionary of slice info for all six frames of each seq in seqDB. cCs ||_dS(N(sseqDBsself(sselfsseqDB((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__init__escCs´|idƒ}|djotd|fƒ‚n|| }t|i|ƒ}t ||dƒ}||ddjo||||d |fSn|||||dfSdS(s4convert ID of form seqID:frame into slice info tuples:isinvalid TranslationInfo key: %sis-iN( sksrfindsisKeyErrorsseqIDslensselfsseqDBslengthsintsframe(sselfsksislengthsseqIDsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys __getitem__hs  cCsdt|iƒSdS(Ni(slensselfsseqDB(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__len__usccsCx<|iD]1}x(ddddddfD]}||Vq)Wq WdS(Ns:0s:1s:2s:-0s:-1s:-2(sselfsseqDBsseqIDsframe(sselfsseqIDsframe((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys__iter__xs  cCst|ƒSdS(N(slistsself(sself((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pyskeys}s(s__name__s __module__s__doc__s__init__s __getitem__s__len__s__iter__skeyss classutilsread_only_errorsclears setdefaultspopspopitemscopysupdate(((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys SixFrameInfobs     cCsXy |iSWnFtj o:t|ƒ}y ||_Wntj onX|SnXdS(s@Use cached seqDB.translationDB if already present, or create it N(sseqDBs translationDBsAttributeErrors TranslationDBstdb(sseqDBstdb((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pysget_translation_db…s   (sseqdbs SequenceDBsBasicSeqInfoDicts annotations AnnotationDBsTranslationAnnotsTranslationAnnotSlices classutilssequencesUserDicts SequenceBases SeqTranslators TranslationDBsobjects DictMixins SixFrameInfosget_translation_db( sTranslationAnnotssequencesUserDicts TranslationDBs SixFrameInfos AnnotationDBs SeqTranslators SequenceDBsget_translation_dbsTranslationAnnotSlicesBasicSeqInfoDicts classutil((sCbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/translationDB.pys?s   D#PKd—~;eGãÈ È pygr/xnestedlist.pyimport cnestedlist from nlmsa_utils import EmptySliceError, EmptySlice import sequence class NLMSAServer(cnestedlist.NLMSA): 'serves NLMSA via serializable method calls for XMLRPC' xmlrpc_methods = {'getSlice': 0, 'getInfo': 0} def getSlice(self, seqID, start, stop): 'perform an interval query and return results as raw ivals' try: seq = self.seqDict[seqID] nlmsa_id, ns, offset = self.seqs[seq] # GET UNION INFO FOR THIS SEQ except KeyError: return '' # failure code ival = sequence.absoluteSlice(seq, start, stop) # GET THE INTERVAL try: myslice = self[ival] # DO THE QUERY except EmptySliceError: return 'EMPTY' except KeyError: return '' # FAILURE CODE ivals = myslice.rawIvals() # GET RAW INTERVAL DATA d = {} # Save index info for source seq. d[nlmsa_id] = self.seqs.IDdict[str(nlmsa_id)] for v in ivals: # SAVE INDEX INFO FOR TARGET SEQS id = v[2] # target_id NLMSA_ID if not self.seqlist.is_lpo(id): # Only non-LPO seqs stored in this index. d[id] = self.seqs.IDdict[str(id)] # XMLRPC can't handle int dictionaries, use a list. l = [(key, val) for key, val in d.items()] # List of aligned ivals, list of (nlmsa_id, (seqID, nsID)). return nlmsa_id, ivals, l def getInfo(self): 'return list of tuples describing NLMSASequences in this NLMSA' l = [] for ns in self.seqlist: l.append((ns.id, ns.is_lpo, ns.length, ns.is_union)) return l class NLMSAClient(cnestedlist.NLMSA): 'client for accessing NLMSAServer via XMLRPC' def __init__(self, url=None, name=None, idDictClass=dict, **kwargs): cnestedlist.NLMSA.__init__(self, mode='xmlrpc', idDictClass=idDictClass, **kwargs) import coordinator self.server = coordinator.get_connection(url, name) self.url = url self.name = name l = self.server.getInfo() # READ NS INFO TABLE for nsID, is_lpo, nsLength, is_union in l: # is_lpo is automatic below. ns = cnestedlist.NLMSASequence(self, None, None, 'onDemand', is_union, nsLength) self.addToSeqlist(ns) # ADD THIS TO THE INDEX def close(self): pass # required interface, but nothing to do def doSlice(self, seq): '''getSlice from the server, and create an NLMSASlice object from results''' result = self.server.getSlice(self.seqs.getSeqID(seq), seq.start, seq.stop) if result == '': raise KeyError('this interval is not aligned!') elif result == 'EMPTY': raise EmptySliceError id, l, d = result for nlmsaID, (seqID, nsID) in d: # SAVE SEQ INFO TO INDEX self.seqs.saveSeq(seqID, nsID, 0, nlmsaID) return id, l # HAND BACK THE RAW INTEGER INTERVAL DATA def __getitem__(self, k): 'directly call slice without any ID lookup -- will be done server-side' try: return cnestedlist.NLMSASlice(self.seqlist[0], k.start, k.stop, -1, -1, k) except EmptySliceError: return EmptySlice(k) def __getstate__(self): return dict(url=self.url, name=self.name, seqDict=self.seqDict) PKðŠ’;úf±à,,pygr/xnestedlist.pyc;ò |†Kc@s[dkZdklZlZdkZdeifd„ƒYZdeifd„ƒYZdS(N(sEmptySliceErrors EmptySlices NLMSAServercBs8tZdZhdd<dd*ss Bio.MSA.UCSC.c sÛ|tjo d„}n|tjo‡d†}ndkl}dkl} t||||| ƒ}xC|i ƒD]5\}} || ƒ} ||ƒ| _| ||d 0scs ˆ|d S(Niýÿÿÿ(s resourceStemsx(sx(s resourceStem(sLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pys2s(s NLMSABuilder(s SourceURLiüÿÿÿ(s worldbaseN(sfileDocumentersNones fileNamerspygr.nlmsa_utilss NLMSABuilderspygr.downloaders SourceURLscatalog_downloadssurls fileFiltersdsitemssresIDsosnlmsas__doc__spygrs worldbases add_resourcescommit( surls fileFilters resourceStemsfileDocumenters fileNamersresIDsds worldbases NLMSABuilders SourceURLsosnlmsa((s resourceStemsLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pyssave_NLMSA_downloaders*s$            N(scatalog_downloadssNonessave_NLMSA_downloaders(scatalog_downloadsssave_NLMSA_downloaders((sLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pys?s 'PKñŠ’;(îdൠµ pygr/apps/catalog_downloads.pyo;ò ÍÊKc@s%d„Zd„deed„ZdS(cCsódk} dk} dk} | i|ƒ}z5| i| iƒƒ} | i |i ƒƒ| i }Wd|i ƒXh}|ddjo|d7}nxV|D]N} || ƒo;|| i|| ƒƒ}|| ƒ|_|||| ƒ*ss Bio.MSA.UCSC.c sÛ|tjo d„}n|tjo‡d†}ndkl}dkl} t||||| ƒ}xC|i ƒD]5\}} || ƒ} ||ƒ| _| ||d 0scs ˆ|d S(Niýÿÿÿ(s resourceStemsx(sx(s resourceStem(sLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pys2s(s NLMSABuilder(s SourceURLiüÿÿÿ(s worldbaseN(sfileDocumentersNones fileNamerspygr.nlmsa_utilss NLMSABuilderspygr.downloaders SourceURLscatalog_downloadssurls fileFiltersdsitemssresIDsosnlmsas__doc__spygrs worldbases add_resourcescommit( surls fileFilters resourceStemsfileDocumenters fileNamersresIDsds worldbases NLMSABuilders SourceURLsosnlmsa((s resourceStemsLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pyssave_NLMSA_downloaders*s$            N(scatalog_downloadssNonessave_NLMSA_downloaders(scatalog_downloadsssave_NLMSA_downloaders((sLbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/catalog_downloads.pys?s 'PKd—~;UÑ Ñ pygr/apps/leelabdb.pyimport MySQLdb import os from splicegraph import * spliceCalcs={'HUMAN_SPLICE_03': TableGroup(db='HUMAN_SPLICE_03', suffix='JUN03', clusters='cluster_JUN03', exons='exon_formJUN03', splices='splice_verification_JUN03', genomic='genomic_cluster_JUN03', mrna='mrna_seqJUN03', protein='protein_seqJUN03'), 'HUMAN_SPLICE': TableGroup(db='HUMAN_SPLICE', suffix='jan02', clusters='cluster_jan02', exons='HUMAN_ISOFORMS.exon_form_4', splices='splice_verification_jan02', genomic='genomic_cluster_jan02', mrna='HUMAN_ISOFORMS.mrna_seq_4', protein='HUMAN_ISOFORMS.protein_seq_4'), 'MOUSE_SPLICE': TableGroup(db='MOUSE_SPLICE', suffix='jan02', clusters='cluster_jan02', exons='MOUSE_ISOFORMS.exon_form_2', splices='splice_verification_jan02', genomic='genomic_cluster_jan02', mrna='MOUSE_ISOFORMS.mrna_seq_2', protein='MOUSE_ISOFORMS.protein_seq_2'), 'MOUSE_SPLICE_03': TableGroup(db='MOUSE_SPLICE_03', suffix='JUN03', clusters='cluster_JUN03', exons='exon_formJUN03', splices='splice_verification_JUN03', genomic='genomic_cluster_JUN03', mrna='mrna_seqJUN03', protein='protein_seqJUN03')} def getUserCursor(db): 'get a cursor as the current user' db = MySQLdb.connect(db=db, read_default_file=os.environ['HOME'] + '/.my.cnf', compress=True) return db.cursor() def getSpliceGraphFromDB(dbgroup, loadAll=False): """load data from MySQL using the designated database table group. If loadAll true, then load the entire splice graph into memory.""" cursor = getUserCursor(dbgroup.db) import sys print >>sys.stderr, 'Reading database schema...' idDict = {} tables = describeDBTables(dbgroup.db, cursor, idDict) if hasattr(dbgroup, 'suffix'): # Get a set of tables ending in specified suffix # and create an index of their primary keys tables = suffixSubset(tables, dbgroup.suffix) idDict = indexIDs(tables) for t in dbgroup.values(): # This table comes from another database... if t is not None and '.' in t and t not in tables: tables[t]=SQLTable(t, cursor) # ...so get it from there # LOAD DATA & BUILD THE SPLICE GRAPH return loadSpliceGraph(tables, dbgroup.clusters, dbgroup.exons, dbgroup.splices, dbgroup.genomic, dbgroup.mrna, dbgroup.protein, loadAll) def localCopy(localFile, cpCommand): 'if not already present on local file location, run cpCommand' if not os.access(localFile, os.R_OK): cmd=cpCommand % localFile print 'copying data:', cmd exit_code=os.system(cmd) if exit_code!=0: raise OSError((exit_code, 'command failed: %s' % cmd)) return localFile PKðŠ’;0P)• • pygr/apps/leelabdb.pyc;ò |†Kc@s1dkZdkZdkThdedddddddd d d d d ddddƒ<deddddddddd dd dddddƒ<deddddddddd dd dddddƒ<dedddddddd d d d d ddddƒ 0: if (rev): align[-(lpoStart + len(ival)):-lpoStart] = \ seq[seqStart:seqStart + len(ival)] else: align[lpoStart:lpoStart + len(ival)] = \ seq[seqStart:seqStart + len(ival)] seqStart += len(ival) lpoStart += len(ival) + 1 s = fh.readline().split() maf2nclist(['chrX.maf', ], 'testdb/chrX') PKðŠ’;ÙÜæuÍÍpygr/apps/maf2nclist.pyc;ò |†Kc@s4dkTdkTd„Zd„ZedgdƒdS((s*cCsöt|dƒ}h}xÌ|D]Ä}t|dƒ}|iƒi ƒddjod|‚n|iƒ}xu|om|i ƒ}t |ƒdjp|ddjon*|ddjot |||ƒndS|iƒ}qkWqW|iƒ|SdS(Nswsris##mafs(Error processing %s: Invalid file formats#sa(s NLMSALetterssstemsalignsseqssmaffilessisopensfsreadlinessplitslslaslensstoreMAFrecordsbuild(smaffilessstemsfsisalignslaslsseqs((sEbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2nclist.pys maf2nclists&  $ c Cs‹|iƒiƒ}|idi}xbt|ƒdjo|ddjo=|}t |dƒ}y||d}Wn%t|dƒ}|||d 0: uid += string.letters[cum % alen] cum /= alen uid += string.letters[cum % alen] self._vid += 1 return AnonSequence(slen, uid) def _dump(self, alignTab, sequenceTab=None): for row in self.mAlign.repr_dict(): alignTab.write('\t'.join(map(lambda x: str(x), row.values())) + '\n') if(sequenceTab): for s in self.sequences.values(): for inter in s.known_int(): sequenceTab.write('\t'.join(map(lambda x: str(x), inter.values())) + '\n') del self.mAlign del self.sequences self.mAlign = PathMapping() self.sequences = {} def parseIntoDB(self, filehandle, cursor, alignTab, sequenceTab=None, update=None): """parses the .maf filehandle into database using cursors""" c = filehandle.tell() filehandle.seek(0, 2) filesize = filehandle.tell() filehandle.seek(c) l = filehandle.readline() rc = 0 count = 0 if l.split()[0] != '##maf': return else: self.setpar(l.split()[1:]) l=filehandle.readline() while l: la = l.split() ## print la if(len(la)==0 or la[0]=='#'): ## print "skipping" 1 elif(la[0]=='a'): ## print "reading alignment" count+=1 self.readalign(la[1:], filehandle) self._dump(alignTab, sequenceTab) if(update and not count % 1000): cursor.execute(update % (int(filehandle.tell() * 100. / filesize))) else: ## print "end of records" return l=filehandle.readline() PKðŠ’;®n;Úoopygr/apps/maf2VSgraph.pyc;ò |†Kc@sMdklZdkTdkTdkZd„Zd„Zdfd„ƒYZdS((s generators(s*Nccsád}d}d}xvtt|ƒƒD]b}||djoK||jo&|||||||||!fVn|d}|d7}q%q%W|djodSn|d}||jo&|||||||||!fVndS(Nis-i(sbeginsgapssendsrangeslenss(sssbeginsendsgaps((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys refIntervalss &    cCs½hdd<dd<dd<dd<dd<dd<dd<d d <d d <dd<d d<d d <}d igi}|ddd…D]}||i||ƒƒq“~ƒSdS(NsastscsgsusnsAsTsCsGsUsNsiÿÿÿÿ(scomplsjoinsappends_[1]ssscsget(sss_[1]scscompl((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pysreverse_complementsrs MafParsercBs_tZdZhZdd„Zd„Zd„Zd„Zd„Ze d„Z e e d„Z RS( sð Parses .maf files as defined by the Haussler dataset. The results of parsing are available as pathmapping between the sequences in the alignment. The sequences themselves are assumed unknown and use AnonSequence class. scCs+tƒ|_h|_||_d|_dS(Ni(s PathMappingsselfsmAligns sequencessvbases_vid(sselfsvbase((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys__init__(s   cCs7x0|D](}|idƒ\}}||i|ss (sselfsmAligns repr_dictsrowsalignTabswritesjoinsmapsvaluess sequenceTabs sequencessss known_intsinters PathMapping(sselfsalignTabs sequenceTabsssintersrow((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys_dump}s0 # c Csi|iƒ}|iddƒ|iƒ} |i|ƒ|iƒ} d} d}| i ƒddjodSn|i | i ƒdƒ|iƒ} xÓ| oË| i ƒ}t |ƒdjp|ddjodn„|ddjon|d7}|i|d|ƒ|i||ƒ|o |d o)|i|t|iƒd | ƒƒqTndS|iƒ} q’WdS( s6parses the .maf filehandle into database using cursorsiis##mafNis#saièf100.0(s filehandlestellscsseeksfilesizesreadlineslsrcscountssplitsselfssetparslaslens readaligns_dumpsalignTabs sequenceTabsupdatescursorsexecutesint( sselfs filehandlescursorsalignTabs sequenceTabsupdatescountscslasrcslsfilesize((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys parseIntoDBs2      $ -( s__name__s __module__s__doc__soptionss__init__ssetpars readalignsparses_vseqsNones_dumps parseIntoDB(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys MafParsers    &  (s __future__s generatorssseqrefs pygr.seqdbsstrings refIntervalssreverse_complements MafParser(s MafParsersreverse_complements generatorssstrings refIntervals((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys?s    PKñŠ’;®n;Úoopygr/apps/maf2VSgraph.pyo;ò |†Kc@sMdklZdkTdkTdkZd„Zd„Zdfd„ƒYZdS((s generators(s*Nccsád}d}d}xvtt|ƒƒD]b}||djoK||jo&|||||||||!fVn|d}|d7}q%q%W|djodSn|d}||jo&|||||||||!fVndS(Nis-i(sbeginsgapssendsrangeslenss(sssbeginsendsgaps((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys refIntervalss &    cCs½hdd<dd<dd<dd<dd<dd<dd<d d <d d <dd<d d<d d <}d igi}|ddd…D]}||i||ƒƒq“~ƒSdS(NsastscsgsusnsAsTsCsGsUsNsiÿÿÿÿ(scomplsjoinsappends_[1]ssscsget(sss_[1]scscompl((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pysreverse_complementsrs MafParsercBs_tZdZhZdd„Zd„Zd„Zd„Zd„Ze d„Z e e d„Z RS( sð Parses .maf files as defined by the Haussler dataset. The results of parsing are available as pathmapping between the sequences in the alignment. The sequences themselves are assumed unknown and use AnonSequence class. scCs+tƒ|_h|_||_d|_dS(Ni(s PathMappingsselfsmAligns sequencessvbases_vid(sselfsvbase((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys__init__(s   cCs7x0|D](}|idƒ\}}||i|ss (sselfsmAligns repr_dictsrowsalignTabswritesjoinsmapsvaluess sequenceTabs sequencessss known_intsinters PathMapping(sselfsalignTabs sequenceTabsssintersrow((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys_dump}s0 # c Csi|iƒ}|iddƒ|iƒ} |i|ƒ|iƒ} d} d}| i ƒddjodSn|i | i ƒdƒ|iƒ} xÓ| oË| i ƒ}t |ƒdjp|ddjodn„|ddjon|d7}|i|d|ƒ|i||ƒ|o |d o)|i|t|iƒd | ƒƒqTndS|iƒ} q’WdS( s6parses the .maf filehandle into database using cursorsiis##mafNis#saièf100.0(s filehandlestellscsseeksfilesizesreadlineslsrcscountssplitsselfssetparslaslens readaligns_dumpsalignTabs sequenceTabsupdatescursorsexecutesint( sselfs filehandlescursorsalignTabs sequenceTabsupdatescountscslasrcslsfilesize((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys parseIntoDBs2      $ -( s__name__s __module__s__doc__soptionss__init__ssetpars readalignsparses_vseqsNones_dumps parseIntoDB(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys MafParsers    &  (s __future__s generatorssseqrefs pygr.seqdbsstrings refIntervalssreverse_complements MafParser(s MafParsersreverse_complements generatorssstrings refIntervals((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/maf2VSgraph.pys?s    PKd—~;"²G¤s s pygr/apps/seqref.pyfrom __future__ import generators from pygr.sequence import * #from pathquery import * class AnonSequence(Sequence): """Defines a sequence class with unknown sequence, but known length""" def __init__(self, length, id): s = '' self.known = list() Sequence.__init__(self, s, id) self.stop = length def seqsplice(self, s, start, end): (begin, stop, step) = slice(start, end).indices(self.stop) if (start < end): self.known += [(s, start, stop)] elif start > end: self.known += [(s[::-1], start, stop)] def known_int(self): for u in self.known: yield {'src_id': self.id, 'start': u[1], 'end': u[2], 'seq': u[0]} class ReferenceSequence(Sequence): """Defines a reference sequence class that is subscriptable by other sequences. If sequence ids match the resulting sequnce will reference this class. This is useful for coordinate transforms when an unknown sequence intervals are transformed to known sequence""" def __init__(self, s, id): Sequence.__init__(self, s, id) def __getitem__(self, iv): if(isinstance(iv, SeqPath)): if(iv.id == self.id): s = self[iv.start:iv.stop:iv.step] s.orientation = iv.orientation return s else: return SeqPath.__getitem__(self, iv) def mapCoordinates(self, obj): m = PathMapping2() for ival in obj: m[ival] = self[ival] return m class UnkSequence(SeqPath): """Defines a sequence class for pure interval manipulation. No sequence information (i.e. length, or seq itself) is needed. """ def __init__(self, id, start=0, end=0, step=1, orientation=1): self.id = id SeqPath.__init__(self, id) self.start = start self.stop = end self.step = step self.orientation = orientation if (self.start is not None and self.stop is not None and self.start > self.stop): t = self.start if (self.stop >= 0): self.start = self.stop + 1 else: self.start = self.stop if (t >= 0): self.stop = t + 1 else: self.stop = t self.orientation = -self.orientation def __getitem__(self, k): if isinstance(k, types.SliceType): (start, stop, step) = (k.start, k.stop, k.step) if k.step == None: step = 1 elif isinstance(k, types.IntType): start = k stop = k + 1 if (k == -1): stop = None step = 1 return self[start:stop:step] else: raise KeyError('requires a slice object or integer key') if self.step == 1 and stop != None: return UnkSequence(self.id, self.start + start * self.step, self.start + stop * self.step, self.step * step, self.orientation) else: return UnkSequence(self.id, start, stop, step, self.orientation) PKðŠ’;:S›¸55pygr/apps/seqref.pyc;ò |†Kc@sZdklZdkTdefd„ƒYZdefd„ƒYZdefd„ƒYZdS( (s generators(s*s AnonSequencecBs)tZdZd„Zd„Zd„ZRS(sDDefines a sequence class with unknown sequence, but known lengthcCs2d}tƒ|_ti|||ƒ||_dS(Ns( ssslistsselfsknownsSequences__init__sidslengthsstop(sselfslengthsidss((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/seqref.pys__init__ s cCst||ƒi|iƒ\}}}||jo|i|||fg7_n:||jo,|i|ddd…||fg7_ndS(Niÿÿÿÿ( sslicesstartsendsindicessselfsstopsbeginsstepsknownss(sselfsssstartsendsbeginsstopsstep((sAbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/seqref.pys seqsplices $  ccsOxH|iD]=}hd|i<d|d<d|d<d|dyti||ƒSWn#tj oti||ƒSnXdS(s>both parent classes have getattr, so have to call them both...N(sTupleOs __getattr__sselfsattrsAttributeErrorsSeqPath(sselfsattr((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys __getattr__Gs (s__name__s __module__s__init__s __getattr__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysExonForm@s sSplicecBstZRS(N(s__name__s __module__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysSpliceOsc sýtƒ‰tƒ‰tƒ}tƒ}tƒ}dtfd„ƒY} ||}|i | ƒ|t j o||}|i tƒnt }|t j oAdtfd„ƒY} ||} | i | ƒ| iddƒnt } ||} t|df|df|d ffƒt_| i tƒ|od | GH| itƒn||}d tf‡‡d †ƒY}|i |ƒ|od |GH|i|ƒn||}|i t"ƒ|o$d |GH|it"ƒd GHx(|i#ƒD]}ˆ|7‰ˆ|7‰qØWdGHxT| i#ƒD]F}||i&}y|i'|7_'||7}Wqt(j oqXqWdGHxJ|i#ƒD]<} y|| i&}Wnt*j oqdX|i!| 7_!qdWdGHx(|i#ƒD]}t+|||ƒq¶Wn|| ||||||| ˆˆf SdS(sL Build a splice graph from the specified SQL tables representing gene clusters, exon forms, and splices. Each table must be specified as a DB.TABLENAME string. These tables are loaded into memory. The splice graph is built based on exact match of exon and splice ends. In addition, also builds alt5Graph (exons that match at start but differ at end) and alt3Graph (exons that match at end but differ at start). Loads all cluster, exon and splice data if loadAll is True. Returns tuple: clusters, exons, splices, spliceGraph, alt5Graph, alt3Graph sYiGenomicSequencecBstZd„ZRS(NcCs|idƒSdS(Ns length(seq)(sselfs_select(sself((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys__len__ls(s__name__s __module__s__len__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysYiGenomicSequencejssYiProteinSQLSequencecBstZd„ZRS(NcCs |iSdS(N(sselfsprotein_length(sself((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys__len__€s(s__name__s __module__s__len__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysYiProteinSQLSequence~ssseqs protein_seqsnextsalt5salt3s Loading %s...sClustercs&tZeˆdfˆdffƒZRS(Nsexonsssplices(s__name__s __module__s SchemaDicts clusterExonssclusterSplicess__class_schema__((s clusterExonssclusterSplices(sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysCluster—ssAdding clusters to graph...sAdding exons to graph...sAdding splices to graph...sBuilding splice graph...N(,s dictGraphs clusterExonssclusterSplicess spliceGraphsalt5salt3sDNASQLSequencesYiGenomicSequencesjun03s genomic_seq_tsgsobjclasss mrna_seq_tsNonesmrnas SQLSequences protein_seq_tsProteinSQLSequencesYiProteinSQLSequencesproteins addAttrAliassexon_ts exon_formss SchemaDictsExonForms__class_schema__sloadAllsloads cluster_tsclusterssTupleOsClusterssplice_tssplicessSplicesvaluesscses cluster_idsexonss IndexErrorsssKeyErrorsbuildClusterSpliceGraph(sjun03s cluster_tsexon_tssplice_ts genomic_seq_ts mrna_seq_ts protein_seq_tsloadAllssplicessYiGenomicSequencesproteinsYiProteinSQLSequencesss exon_formssclusterssalt5salt3s clusterExonssclusterSplicesscsesgsClustersmrnas spliceGraph((s clusterExonssclusterSplicessFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysloadSpliceGraphSs~             *                N( s pygr.sqlgraphs pygr.sequences pygr.seqdbsbuildClusterSpliceGraphs loadClustersTupleOsSeqPathsExonFormsSplicesNonesTruesloadSpliceGraph(s loadClustersSplicesbuildClusterSpliceGraphsExonFormsloadSpliceGraph((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys?s - PKñŠ’;htupygr/apps/splicegraph.pyo;ò |†Kc@sldkTdkTdkTd„Zd„Zdeefd„ƒYZdefd„ƒYZe e e d„Z dS( (s*c Cs8h}h}g}x{|iD]p} | i|jog|| iyti||ƒSWn#tj oti||ƒSnXdS(s>both parent classes have getattr, so have to call them both...N(sTupleOs __getattr__sselfsattrsAttributeErrorsSeqPath(sselfsattr((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys __getattr__Gs (s__name__s __module__s__init__s __getattr__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysExonForm@s sSplicecBstZRS(N(s__name__s __module__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysSpliceOsc sýtƒ‰tƒ‰tƒ}tƒ}tƒ}dtfd„ƒY} ||}|i | ƒ|t j o||}|i tƒnt }|t j oAdtfd„ƒY} ||} | i | ƒ| iddƒnt } ||} t|df|df|d ffƒt_| i tƒ|od | GH| itƒn||}d tf‡‡d †ƒY}|i |ƒ|od |GH|i|ƒn||}|i t"ƒ|o$d |GH|it"ƒd GHx(|i#ƒD]}ˆ|7‰ˆ|7‰qØWdGHxT| i#ƒD]F}||i&}y|i'|7_'||7}Wqt(j oqXqWdGHxJ|i#ƒD]<} y|| i&}Wnt*j oqdX|i!| 7_!qdWdGHx(|i#ƒD]}t+|||ƒq¶Wn|| ||||||| ˆˆf SdS(sL Build a splice graph from the specified SQL tables representing gene clusters, exon forms, and splices. Each table must be specified as a DB.TABLENAME string. These tables are loaded into memory. The splice graph is built based on exact match of exon and splice ends. In addition, also builds alt5Graph (exons that match at start but differ at end) and alt3Graph (exons that match at end but differ at start). Loads all cluster, exon and splice data if loadAll is True. Returns tuple: clusters, exons, splices, spliceGraph, alt5Graph, alt3Graph sYiGenomicSequencecBstZd„ZRS(NcCs|idƒSdS(Ns length(seq)(sselfs_select(sself((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys__len__ls(s__name__s __module__s__len__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysYiGenomicSequencejssYiProteinSQLSequencecBstZd„ZRS(NcCs |iSdS(N(sselfsprotein_length(sself((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys__len__€s(s__name__s __module__s__len__(((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysYiProteinSQLSequence~ssseqs protein_seqsnextsalt5salt3s Loading %s...sClustercs&tZeˆdfˆdffƒZRS(Nsexonsssplices(s__name__s __module__s SchemaDicts clusterExonssclusterSplicess__class_schema__((s clusterExonssclusterSplices(sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysCluster—ssAdding clusters to graph...sAdding exons to graph...sAdding splices to graph...sBuilding splice graph...N(,s dictGraphs clusterExonssclusterSplicess spliceGraphsalt5salt3sDNASQLSequencesYiGenomicSequencesjun03s genomic_seq_tsgsobjclasss mrna_seq_tsNonesmrnas SQLSequences protein_seq_tsProteinSQLSequencesYiProteinSQLSequencesproteins addAttrAliassexon_ts exon_formss SchemaDictsExonForms__class_schema__sloadAllsloads cluster_tsclusterssTupleOsClusterssplice_tssplicessSplicesvaluesscses cluster_idsexonss IndexErrorsssKeyErrorsbuildClusterSpliceGraph(sjun03s cluster_tsexon_tssplice_ts genomic_seq_ts mrna_seq_ts protein_seq_tsloadAllssplicessYiGenomicSequencesproteinsYiProteinSQLSequencesss exon_formssclusterssalt5salt3s clusterExonssclusterSplicesscsesgsClustersmrnas spliceGraph((s clusterExonssclusterSplicessFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pysloadSpliceGraphSs~             *                N( s pygr.sqlgraphs pygr.sequences pygr.seqdbsbuildClusterSpliceGraphs loadClustersTupleOsSeqPathsExonFormsSplicesNonesTruesloadSpliceGraph(s loadClustersSplicesbuildClusterSpliceGraphsExonFormsloadSpliceGraph((sFbuild/bdist.darwin-8.11.0-Power_Macintosh/egg/pygr/apps/splicegraph.pys?s - PK;“×2€EGG-INFO/dependency_links.txtPKñŠ’;ÍÒ11¤<EGG-INFO/native_libs.txtPKñŠ’;“×2¤£EGG-INFO/not-zip-safePK;ˆ™>É‘‘€×EGG-INFO/PKG-INFOPK;@vØ €—EGG-INFO/SOURCES.txtPK; ׃™€ßEGG-INFO/top_level.txtPK%“ˆ;$büúGG¤pygr/__init__.pyPKðŠ’;j´°D¨¨¤pygr/__init__.pycPKñŠ’;j´°D¨¨¤dpygr/__init__.pyoPKd—~;Æ.X¯lHlH¤; pygr/annotation.pyPKðŠ’;p#½Õ+s+s¤×hpygr/annotation.pycPKñŠ’;p#½Õ+s+s¤3Üpygr/annotation.pyoPKd—~;ržbVTVT ¤Opygr/blast.pyPKðŠ’;½íÉõhõh¤¤pygr/blast.pycPKñŠ’;½íÉõhõh¤1 pygr/blast.pyoPKñŠ’;‘‹ ¤Rvpygr/cdict.pyPKñŠ’;ÉoMM¤wpygr/cdict.pycPKñŠ’;ÉoMM¤ zpygr/cdict.pyoPKŠŠ’;µSÖ¸¸ ¤‚|pygr/cdict.soPKd—~;9ôÈ[_[_¤e•pygr/classutil.pyPKðŠ’;3оû„„¤ïôpygr/classutil.pycPKñŠ’;3оû„„¤;ypygr/classutil.pyoPKñŠ’;È备ýpygr/cnestedlist.pyPKñŠ’;¥“Ø©__¤Ñþpygr/cnestedlist.pycPKñŠ’;¥“Ø©__¤bpygr/cnestedlist.pyoPK´Š’;¾z;· · ¤ópygr/cnestedlist.soPKd—~;t¾…Ýݤ$»pygr/coordinator.pyPKðŠ’;È{棧ý§ý¤c˜pygr/coordinator.pycPKñŠ’;È{棧ý§ý¤<–pygr/coordinator.pyoPKd—~;)Ö­*  ¤”pygr/Data.pyPKðŠ’;lÞÚ99 ¤¾pygr/Data.pycPKñŠ’;lÞÚ99 ¤"¬pygr/Data.pyoPKd—~;’ Éɤ†ºpygr/dbfile.pyPKðŠ’;¨˜ò‚‚¤{Ñpygr/dbfile.pycPKñŠ’;¨˜ò‚‚¤*ðpygr/dbfile.pyoPKd—~;sÒ)'#'#¤Ùpygr/downloader.pyPKðŠ’;{W²¸,¸,¤02pygr/downloader.pycPKñŠ’;{W²¸,¸,¤_pygr/downloader.pyoPKd—~;…¹rRE|E|¤Œpygr/graphquery.pyPKðŠ’;i7%,‡‡¤wpygr/graphquery.pycPKñŠ’;i7%,‡‡¤»pygr/graphquery.pyoPKd—~;ä 4//¤ÿpygr/logger.pyPKðŠ’;ÙrÈ È ¤Zpygr/logger.pycPKñŠ’;ÙrÈ È ¤O*pygr/logger.pyoPKd—~;ì𕕤D5pygr/mapping.pyPKðŠ’;ÆÁùÛÖÛÖ¤µpygr/mapping.pycPKñŠ’;ÆÁùÛÖÛÖ¤Œpygr/mapping.pyoPKd—~;00|55¤cpygr/metabase.pyPKðŠ’;WÃâØXUXU¤{ipygr/metabase.pycPKñŠ’;WÃâØXUXU¤¿pygr/metabase.pyoPKd—~;«B_ KKKK¤‰ pygr/nlmsa_utils.pyPKðŠ’;g5ç¤SoSo¤` pygr/nlmsa_utils.pycPKñŠ’;g5ç¤SoSo¤ŠÏ pygr/nlmsa_utils.pyoPKd—~;ˆÝ|!!¤?!pygr/parse_blast.pyPKðŠ’;‡iÀùç'ç'¤Ï`!pygr/parse_blast.pycPKñŠ’;‡iÀùç'ç'¤èˆ!pygr/parse_blast.pyoPKd—~;ÔwÖ””¤±!pygr/schema.pyPKðŠ’;CÖ¿))¤ÁÆ!pygr/schema.pycPKñŠ’;CÖ¿))¤â!pygr/schema.pyoPKd—~;Æ‚eZ¥Z¥ ¤mý!pygr/seqdb.pyPKðŠ’;Ä3²‰àà¤ò¢"pygr/seqdb.pycPKñŠ’;Ä3²‰àà¤2ƒ#pygr/seqdb.pyoPKñŠ’;“H¤rc$pygr/seqfmt.pyPKñŠ’;Ð$PP¤²d$pygr/seqfmt.pycPKñŠ’;Ð$PP¤/g$pygr/seqfmt.pyoPK„Š’;ä_~~¤¬i$pygr/seqfmt.soPKd—~;iÍ*bë€ë€¤ìç$pygr/sequence.pyPKðŠ’;’ø¸FŸFŸ¤i%pygr/sequence.pycPKñŠ’;’ø¸FŸFŸ¤z&pygr/sequence.pyoPKd—~;zØU\cc¤ï§&pygr/sequtil.pyPKðŠ’;àçó:LL¤º&pygr/sequtil.pycPKñŠ’;àçó:LL¤ùÓ&pygr/sequtil.pyoPK¨nˆ;0ÄÇ(ÅvÅv¤sí&pygr/sqlgraph.pyPKðŠ’;®Sëë¤fd(pygr/sqlgraph.pycPKñŠ’;®Së뤧O*pygr/sqlgraph.pyoPKd—~;öý‡¬¤è:,pygr/translationDB.pyPKðŠ’;ŠW˜é é ¤¸O,pygr/translationDB.pycPKñŠ’;ŠW˜é é ¤Õp,pygr/translationDB.pyoPKd—~;eGãÈ È ¤ò‘,pygr/xnestedlist.pyPKðŠ’;úf±à,,¤ëŸ,pygr/xnestedlist.pycPKñŠ’;úf±à,,¤I´,pygr/xnestedlist.pyoPKd—~;ï…Jqdd¤§È,pygr/apps/__init__.pyPKðŠ’;mŒ ýý¤>É,pygr/apps/__init__.pycPKñŠ’;mŒ ýý¤oÊ,pygr/apps/__init__.pyoPK¨nˆ;á`ó/å å ¤ Ë,pygr/apps/catalog_downloads.pyPKðŠ’;(îdൠµ ¤ÁÕ,pygr/apps/catalog_downloads.pycPKñŠ’;(îdൠµ ¤³ã,pygr/apps/catalog_downloads.pyoPKd—~;UÑ Ñ ¤¥ñ,pygr/apps/leelabdb.pyPKðŠ’;0P)• • ¤©þ,pygr/apps/leelabdb.pycPKñŠ’;0P)• • ¤r -pygr/apps/leelabdb.pyoPKd—~;lDì22¤;-pygr/apps/maf2nclist.pyPKðŠ’;ÙÜæuÍͤ¢-pygr/apps/maf2nclist.pycPKñŠ’;ÙÜæuÍͤ¥&-pygr/apps/maf2nclist.pyoPKd—~;A¯+º  ¤¨.-pygr/apps/maf2VSgraph.pyPKðŠ’;®n;Úoo¤êD-pygr/apps/maf2VSgraph.pycPKñŠ’;®n;Úoo¤`-pygr/apps/maf2VSgraph.pyoPKd—~;"²G¤s s ¤6|-pygr/apps/seqref.pyPKðŠ’;:S›¸55¤Úˆ-pygr/apps/seqref.pycPKñŠ’;:S›¸55¤A-pygr/apps/seqref.pyoPKd—~; פ¨±-pygr/apps/splicegraph.pyPKðŠ’;htu¤ÞÌ-pygr/apps/splicegraph.pycPKñŠ’;htu¤–ë-pygr/apps/splicegraph.pyoPKff·N .