pax_global_header00006660000000000000000000000064127300316310014506gustar00rootroot0000000000000052 comment=8a18c41b19c42589205945e9d18d1c4f5184505b BioD-0.1.0/000077500000000000000000000000001273003163100123215ustar00rootroot00000000000000BioD-0.1.0/.gitignore000066400000000000000000000000461273003163100143110ustar00rootroot00000000000000.dub docs.json __dummy.html *.o *.obj BioD-0.1.0/.travis.yml000066400000000000000000000000711273003163100144300ustar00rootroot00000000000000language: d script: - rdmd -unittest -d test/unittests.d BioD-0.1.0/LICENSE000066400000000000000000000020071273003163100133250ustar00rootroot00000000000000Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. BioD-0.1.0/README.md000066400000000000000000000016341273003163100136040ustar00rootroot00000000000000### BioD [BioD](https://github.com/biod/BioD) is a fast and memory efficient bioinformatics library written in the [D programming language](http://dlang.org). BioD aims to: * Provide a platform for writing high-performance bioinformatics applications in D. BioD achieves this by: - automatic parallelization of tasks where possible for example reading and writing BAM files. - reducing the GC overhead by avoiding unnecessary memory allocations * Offer support for manipulating common biological data formats. * Write clear documented and maintainable codebase. ### Usage See the [examples directory](https://github.com/biod/BioD/tree/master/examples) for examples and usage. #### BioD core * [Artem Tarasov](https://github.com/lomereiter) * [Pjotr Prins](https://github.com/pjotrp) ##### License This library is licensed under the MIT license. Please see the license file for more details ##### Citation BioD-0.1.0/bio/000077500000000000000000000000001273003163100130725ustar00rootroot00000000000000BioD-0.1.0/bio/bam/000077500000000000000000000000001273003163100136315ustar00rootroot00000000000000BioD-0.1.0/bio/bam/abstractreader.d000066400000000000000000000035311273003163100167660ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.abstractreader; import bio.sam.header; import bio.bam.read; import bio.bam.referenceinfo; public import std.range; /// Common interface for $(DPREF2 bam, reader, BamReader) /// and $(DPREF2 sam, reader, SamReader). interface IBamSamReader { /// SAM header bio.sam.header.SamHeader header() @property; /// Information about reference sequences const(bio.bam.referenceinfo.ReferenceSequenceInfo)[] reference_sequences() @property const nothrow; /// All reads in the file std.range.InputRange!(bio.bam.read.BamRead) allReads() @property; /// Filename string filename() @property const; /// void assumeSequentialProcessing(); } BioD-0.1.0/bio/bam/bai/000077500000000000000000000000001273003163100143645ustar00rootroot00000000000000BioD-0.1.0/bio/bam/bai/bin.d000066400000000000000000000060351273003163100153050ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.bai.bin; import bio.core.bgzf.chunk; import bio.bam.constants; /// Distinct bin struct Bin { /// Construct a bin with an id this(uint id) nothrow { this.id = id; } uint id; /// bin number Chunk[] chunks; /// How deep the bin is in the tree int level() @property const nothrow { if (id == 0) return 0; if (id < 9) return 1; if (id < 73) return 2; if (id < 585) return 3; if (id < 4681) return 4; return 5; } /// Returns whether the bin is a leaf in the B-tree bool is_leaf() @property const nothrow { return id > BAI_MAX_NONLEAF_BIN_ID; } /// Check if bin can overlap with a region bool canOverlapWith(int begin, int end) const nothrow { if (id == 0) return true; if (id > BAI_MAX_BIN_ID) return false; /// The following code is based on reg2bins() function if (begin < 0) begin = 0; auto magic_number = 4681; auto b = begin >> 14; auto e = end >> 14; while (true) { auto delta = id - magic_number; if (b <= delta && delta <= e) return true; magic_number >>= 3; if (magic_number == 0) return false; b >>= 3; e >>= 3; } } } /// Returns bin number for [beg, end) interval (zero-based). /// Taken from SAM/BAM specification. ushort reg2bin(int beg, int end) { if (end == beg) end = beg + 1; // edge case --end; if (beg>>14 == end>>14) return cast(ushort)(((1<<15)-1)/7 + (beg>>14)); if (beg>>17 == end>>17) return cast(ushort)(((1<<12)-1)/7 + (beg>>17)); if (beg>>20 == end>>20) return cast(ushort)(((1<<9)-1)/7 + (beg>>20)); if (beg>>23 == end>>23) return cast(ushort)(((1<<6)-1)/7 + (beg>>23)); if (beg>>26 == end>>26) return cast(ushort)(((1<<3)-1)/7 + (beg>>26)); return 0; } BioD-0.1.0/bio/bam/bai/indexing.d000066400000000000000000000307071273003163100163450ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.bai.indexing; import bio.bam.reader; import bio.bam.readrange; import bio.bam.constants; import bio.bam.bai.bin; import bio.core.bgzf.chunk; import std.stream; import std.array; import std.algorithm; import std.system; import std.exception; import std.c.string; // Suppose we have an alignment which covers bases on a reference, // starting from one position and ending at another position. // In order to build linear index, we need to find to which windows // the two positions correspond. // // // (K = 16384) // // [0, K)[K, 2K)[2K, 3K)... <- windows // [.......) <- alignment // private size_t toLinearIndexOffset(int position) { return position < 0 ? 0 : position / BAI_LINEAR_INDEX_WINDOW_SIZE; } /// struct IndexBuilder { private { // array of linear offsets for the current reference entry VirtualOffset[] _linear_index; // (maximum index in _linear_index where data was written) + 1 size_t _linear_index_write_length; static struct PreviousRead { int ref_id = -1; int position; int end_position; int basesCovered() { return end_position - position; } Bin bin; bool is_unmapped; private char[256] _name_buf; // by spec., name length is <= 255 chars string name; VirtualOffset start_virtual_offset; VirtualOffset end_virtual_offset; } PreviousRead _prev_read; Stream _stream; int _n_refs; ulong _no_coord = 0; // metadata for each reference ulong _beg_vo = -1UL; ulong _end_vo = 0; ulong _unmapped = 0; ulong _mapped = 0; bool _first_read = true; // map: bin ID -> array of chunks Chunk[][uint] _chunks; VirtualOffset _current_chunk_beg; // start of current chunk // no metadata for empty references void writeEmptyReference() { _stream.write(cast(int)0); // n_bins _stream.write(cast(int)0); // n_intv } void updateLastReadInfo(ref BamReadBlock read) { with (_prev_read) { ref_id = read.ref_id; position = read.position; end_position = position + read.basesCovered(); bin = read.bin; is_unmapped = read.is_unmapped; _name_buf[0 .. read.name.length] = read.name[]; name = cast(string)_name_buf[0 .. read.name.length]; start_virtual_offset = read.start_virtual_offset; end_virtual_offset = read.end_virtual_offset; } } void updateMetadata(ref BamReadBlock read) { if (read.ref_id == -1) { ++_no_coord; } else if (read.is_unmapped) { ++_unmapped; } else { ++_mapped; } if (_beg_vo == -1UL) _beg_vo = cast(ulong)read.start_virtual_offset; _end_vo = cast(ulong)read.end_virtual_offset; } void updateLinearIndex() { assert(_prev_read.ref_id >= 0); size_t beg, end; if (_prev_read.is_unmapped) { end = beg = toLinearIndexOffset(_prev_read.position); } else { beg = toLinearIndexOffset(_prev_read.position); end = toLinearIndexOffset(_prev_read.position + _prev_read.basesCovered() - 1); } debug { import std.stdio; if (end >= _linear_index.length) { writeln("beg: ", beg); writeln("end: ", end); writeln("pos: ", _prev_read.position); writeln("bases: ", _prev_read.basesCovered()); } } foreach (i; beg .. end + 1) if (_linear_index[i] == 0UL) _linear_index[i] = _prev_read.start_virtual_offset; if (end + 1 > _linear_index_write_length) _linear_index_write_length = end + 1; } void dumpCurrentLinearIndex() { _stream.write(cast(int)_linear_index_write_length); // // There might be untouched places in linear index // with virtual offset equal to zero. // However, it's not a good idea to leave those zeros, // since we can start lookup from the last non-zero virtual offset // encountered before the untouched window. // VirtualOffset last_voffset = 0; foreach (voffset; _linear_index[0 .. _linear_index_write_length]) { if (voffset == 0) voffset = last_voffset; else last_voffset = voffset; _stream.write(cast(ulong)voffset); } } void dumpCurrentReference() { // +1 because we output dummy bin, too _stream.write(cast(int)(_chunks.length + 1)); foreach (bin_id, bin_chunks; _chunks) { if (bin_chunks.length > 0) { _stream.write(cast(uint)bin_id); _stream.write(cast(int)bin_chunks.length); foreach (chunk; bin_chunks) { _stream.write(cast(ulong)chunk.beg); _stream.write(cast(ulong)chunk.end); } } } _stream.write(cast(uint)37450); _stream.write(cast(int)2); _stream.write(cast(ulong)_beg_vo); _stream.write(cast(ulong)_end_vo); _stream.write(cast(ulong)_mapped); _stream.write(cast(ulong)_unmapped); dumpCurrentLinearIndex(); // reset data memset(_linear_index.ptr, 0, _linear_index.length * ulong.sizeof); _linear_index_write_length = 0; _chunks = null; _current_chunk_beg = _prev_read.end_virtual_offset; _beg_vo = _end_vo = cast(ulong)_current_chunk_beg; _unmapped = 0; _mapped = 0; } // adds chunk to the current bin (which is determined from _prev_read) void updateChunks() { auto current_chunk_end = _prev_read.end_virtual_offset; auto bin_id = _prev_read.bin.id; if (bin_id !in _chunks) _chunks[bin_id] = []; auto cs = _chunks[bin_id]; bool canMergeWithPreviousChunk() { assert(cs.length > 0); auto last_chunk = cs[$ - 1]; if (last_chunk.end.coffset == _current_chunk_beg.coffset) return true; return false; } if (cs.length == 0 || !canMergeWithPreviousChunk()) { auto new_chunk = Chunk(_current_chunk_beg, current_chunk_end); _chunks[_prev_read.bin.id] ~= new_chunk; } else { _chunks[_prev_read.bin.id][$ - 1].end = current_chunk_end; } _current_chunk_beg = current_chunk_end; } void checkThatBinIsCorrect(ref BamReadBlock read) { if (!check_bins) return; auto expected = reg2bin(read.position, read.position + read.basesCovered()); enforce(read.bin.id == expected, "Bin in read with name '" ~ read.name ~ "' is set incorrectly (" ~ to!string(read.bin.id) ~ " instead of expected " ~ to!string(expected) ~ ")"); } void checkThatInputIsSorted(ref BamReadBlock read) { if (_first_read) return; if (read.ref_id == -1) return; // unmapped if (_prev_read.ref_id < read.ref_id) return; enforce(read.ref_id == _prev_read.ref_id && read.position >= _prev_read.position, "BAM file is not coordinate-sorted: " ~ "read '" ~ read.name ~ "' (" ~ read.ref_id.to!string ~ ":" ~ read.position.to!string ~ ")" ~ " must be after read '" ~ _prev_read.name ~ "' (" ~ _prev_read.ref_id.to!string ~ ":" ~ _prev_read.position.to!string ~ ")" ~ "' (at virtual offsets " ~ to!string(_prev_read.start_virtual_offset) ~ ", " ~ read.start_virtual_offset.to!string ~ ")"); } } /// this(Stream output_stream, int number_of_references) { _stream = new EndianStream(output_stream, Endian.littleEndian); _n_refs = number_of_references; size_t size = BAI_MAX_BIN_ID - BAI_MAX_NONLEAF_BIN_ID + 1; _linear_index = new VirtualOffset[](size); _stream.writeString(BAI_MAGIC); // write BAI magic string _stream.write(cast(int)_n_refs); // and number of references } /// Check that bins are correct. bool check_bins; /// Add a read. The reads must be put in coordinate-sorted order. void put(BamReadBlock read) { checkThatInputIsSorted(read); scope(exit) updateMetadata(read); if (read.ref_id < 0) return; // start position is unavailable, skip if (read.position < 0) return; if (_first_read) { updateLastReadInfo(read); _first_read = false; _current_chunk_beg = read.start_virtual_offset; if (read.ref_id > 0) foreach (i; 0 .. read.ref_id) writeEmptyReference(); return; } checkThatBinIsCorrect(read); // new reference, so write data for previous one(s) if (read.ref_id > _prev_read.ref_id) { updateLinearIndex(); updateChunks(); dumpCurrentReference(); foreach (i; _prev_read.ref_id + 1 .. read.ref_id) writeEmptyReference(); } if (read.ref_id == _prev_read.ref_id) { updateLinearIndex(); if (read.bin.id != _prev_read.bin.id) updateChunks(); } updateLastReadInfo(read); } /// Closes the stream void finish() { if (!_first_read) { // at least one was processed assert(_prev_read.ref_id >= 0); updateLinearIndex(); updateChunks(); dumpCurrentReference(); } // _prev_read.ref_id == -1 if all are unmapped foreach (i; _prev_read.ref_id + 1 .. _n_refs) writeEmptyReference(); _stream.write(cast(ulong)_no_coord); _stream.close(); } } /// Writes BAM index to the $(D stream) /// /// Accepts optional $(D progressBarFunc) void createIndex(BamReader bam, Stream stream, bool check_bins=false, void delegate(lazy float p) progressBarFunc=null) { auto n_refs = cast(int)bam.reference_sequences.length; auto index_builder = IndexBuilder(stream, n_refs); index_builder.check_bins = check_bins; auto reads = bam.readsWithProgress!withOffsets(progressBarFunc); foreach (read; reads) index_builder.put(read); index_builder.finish(); } BioD-0.1.0/bio/bam/baifile.d000066400000000000000000000140601273003163100153720ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.baifile; public import bio.core.bgzf.chunk; public import bio.bam.bai.bin; import bio.core.bgzf.virtualoffset; import bio.bam.constants; import std.stream; import std.system; import std.exception; import std.algorithm; import std.conv; import std.range; import std.file; import std.path; /// Represents index for a single reference struct Index { /// Information about bins Bin[] bins; /// Virtual file offsets of first alignments overlapping 16384-byte windows /// on the reference sequence. This linear index is used to reduce amount /// of file seeks for region queries, since with its help one can reduce the /// number of chunks to be investigated based on their end position. /// /// /// Suppose you have a region [beg, end) and want to do a query. /// /// Here's the reference: /// [....................!..............!.................................] /// beg end /// /// Here's the same reference with 16384-byte long windows: /// [%...........%.......!....%.........!..%...........%...........%......] /// beg end /// [ 1st window][ 2nd window][... /// /// With linear index, we can take the second window, find out what is /// the minimum virtual offset among alignments overlapping this window, /// and skip all chunks which end position is less or equal to this offset: /// /// [........@...........!..............!.................................] /// . ..min. offset beg end /// [ ). . <- this chunk is skipped /// [ ) <- this one is not /// VirtualOffset[] ioffsets; /// Get (approximate) virtual offset of the first alignment overlapping $(D position) /// /// Returned virtual offset is less or equal to real offset. VirtualOffset getMinimumOffset(int position) { int pos = max(0, position); int _i = min(pos / BAI_LINEAR_INDEX_WINDOW_SIZE, cast(int)ioffsets.length - 1); auto min_offset = (_i == -1) ? VirtualOffset(0) : ioffsets[_i]; return min_offset; } } struct BaiFile { Index[] indices; /// Initialize from stream which contains BAI data this(ref Stream stream) { _stream = stream; parse(); } /// Open BAI file given either filename of BAM file or that of BAI file. this(string filename) { Stream fstream; if (!endsWith(filename, ".bai")) { /// Unfortunately, std.path.addExt is going to be deprecated auto first_filename = filename ~ ".bai"; auto second_filename = to!string(retro(find(retro(filename), '.'))) ~ "bai"; if (std.file.exists(first_filename)) { fstream = new BufferedFile(absolutePath(first_filename)); } else { if (std.file.exists(second_filename)) { fstream = new BufferedFile(absolutePath(second_filename)); } else { throw new Exception("searched for " ~ first_filename ~ " or " ~ second_filename ~ ", found neither"); } } } else { fstream = new BufferedFile(filename); } Stream estream = new EndianStream(fstream, Endian.littleEndian); this(estream); } private: Stream _stream; /// according to section 4.2 of SAM/BAM specification void parse() { auto magic = _stream.readString(4); enforce(magic == "BAI\1", "Invalid file format: expected BAI\\1"); int n_ref; _stream.read(n_ref); indices = uninitializedArray!(Index[])(n_ref); foreach (i; 0 .. n_ref) { int n_bin = void; _stream.read(n_bin); indices[i].bins = uninitializedArray!(Bin[])(n_bin); foreach (j; 0 .. n_bin) { uint id = void; _stream.read(id); auto bin = Bin(id); int n_chunk = void; _stream.read(n_chunk); bin.chunks = uninitializedArray!(Chunk[])(n_chunk); foreach (k; 0 .. n_chunk) { ulong tmp = void; _stream.read(tmp); bin.chunks[k].beg = VirtualOffset(tmp); _stream.read(tmp); bin.chunks[k].end = VirtualOffset(tmp); } indices[i].bins[j] = bin; } int n_intv = void; _stream.read(n_intv); indices[i].ioffsets = uninitializedArray!(VirtualOffset[])(n_intv); foreach (j; 0 .. n_intv) { ulong tmp = void; _stream.read(tmp); indices[i].ioffsets[j] = VirtualOffset(tmp); } } } } BioD-0.1.0/bio/bam/baseinfo.d000066400000000000000000000527061273003163100155760ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.baseinfo; import bio.core.base; import bio.core.sequence; import bio.bam.read; import bio.bam.tagvalue; import bio.bam.iontorrent.flowcall; import bio.bam.md.core; import std.range; import std.conv; import std.traits; import std.typecons; import std.typetuple; /// enum Option { /// adds 'cigar_before' and 'cigar_after' properties cigarExtra, /// adds 'md_operation', 'md_operation_offset' properties mdCurrentOp, /// adds 'previous_md_operation' property mdPreviousOp, /// adds 'next_md_operation' property mdNextOp } /// struct MixinArg(T, string Tag) { T value; alias value this; alias Tag TagName; } /// Wrapper for arguments to $(D basesWith) function (see below). /// Required to distinguish to which tag each parameter refers. MixinArg!(T, Tag) arg(string Tag, T)(T value) { return MixinArg!(T, Tag)(value); } template staticFilter(alias P, T...) { static if (T.length == 0) alias TypeTuple!() staticFilter; else static if (P!(T[0])) alias TypeTuple!(T[0], staticFilter!(P, T[1..$])) staticFilter; else alias staticFilter!(P, T[1..$]) staticFilter; } template isTag(alias argument) { enum isTag = is(typeof(argument) == string); } template isOption(alias argument) { enum isOption = is(typeof(argument) == Option); } struct PerBaseInfo(R, TagsAndOptions...) { alias staticFilter!(isTag, TagsAndOptions) Tags; alias staticFilter!(isOption, TagsAndOptions) Options; private alias TypeTuple!("CIGAR", Tags) Extensions; // ///////////////////////////////////////////////////////////////////////// // // Each 'extension' is a template with name TAGbaseInfo, containing // a couple of mixin templates: // // * resultProperties // These are additional properties provided by the template // // * rangeMethods // These describe how to proceed to the next base. // The following methods must be implemented: // // - void setup(Args...)(const ref R read, Args args); // Gets called during range construction. All constructor // arguments are forwarded, and it's this function which // is responsible for getting required parameters for this // particular template. // // - void populate(Result)(ref Result r); // Populates fields of the result declared in resultProperties. // Should run in O(1), just copying a few variables. // Current base of the result is updated before the call. // // - void update(const ref R read); // Encapsulates logic of moving to the next base and updating // mixin variables correspondingly. // // - void copy(Range)(const ref Range source, ref Range target); // Gets called during $(D source.save). Therefore, any ranges // used in mixin templates must be saved as well at that time. // // ///////////////////////////////////////////////////////////////////////// private static string getResultProperties(Exts...)() { char[] result; foreach (ext; Exts) result ~= "mixin " ~ ext ~ "baseInfo!(R, Options).resultProperties;".dup; return cast(string)result; } static struct Result { /// Actual read base, with strand taken into account. Base base; alias base this; string opCast(T)() if (is(T == string)) { return to!string(base); } bool opEquals(T)(T base) const if (is(Unqual!T == Base)) { return this.base == base; } bool opEquals(T)(T result) const if (is(Unqual!T == Result)) { return this == result; } bool opEquals(T)(T base) const if (is(Unqual!T == char) || is(Unqual!T == dchar)) { return this.base == base; } mixin(getResultProperties!Extensions()); } private static string getRangeMethods(Exts...)() { char[] result; foreach (ext; Exts) result ~= "mixin " ~ ext ~ "baseInfo!(R, Options).rangeMethods " ~ ext ~ ";".dup; return cast(string)result; } mixin(getRangeMethods!Extensions()); private void setup(string tag, Args...)(R read, Args args) { mixin(tag ~ ".setup(read, args);"); } private void populate(string tag)(ref Result r) { mixin(tag ~ ".populate(r);"); } private void update(string tag)() { mixin(tag ~ ".update(_read);"); } private void copy(string tag)(ref typeof(this) other) { mixin(tag ~ ".copy(this, other);"); } this(Args...)(R read, Args args) { _read = read; _rev = read.is_reverse_strand; _seq = reversableRange!complementBase(read.sequence, _rev); foreach (t; Extensions) { setup!t(read, args); } } bool empty() @property { return _seq.empty; } /// Allows to construct front element in-place, avoiding a copy. void constructFront(Result* addr) { addr.base = _seq.front; foreach (t; Extensions) populate!t(*addr); } Result front() @property { Result r = void; r.base = _seq.front; foreach (t; Extensions) populate!t(r); return r; } void popFront() { moveToNextBase(); } PerBaseInfo save() @property { PerBaseInfo r = void; r._read = _read.dup; r._seq = _seq.save; r._rev = _rev; foreach (t; Extensions) copy!t(r); return r; } ref PerBaseInfo opAssign(PerBaseInfo other) { _read = other._read; _seq = other._seq.save; _rev = other._rev; foreach (t; Extensions) other.copy!t(this); return this; } private void moveToNextBase() { foreach (t; Extensions) { update!t(); } _seq.popFront(); } /// Returns true if the read is reverse strand, /// and false otherwise. bool reverse_strand() @property const { return _rev; } private { bool _rev = void; R _read = void; ReversableRange!(complementBase, typeof(_read.sequence)) _seq = void; } } /// /// Collect per-base information from available tags. /// Use $(D arg!TagName) to pass a parameter related to a particular tag. /// /// Example: /// /// basesWith!"FZ"(arg!"flowOrder"(flow_order), arg!"keySequence"(key_sequence)); /// template basesWith(TagsAndOptions...) { auto basesWith(R, Args...)(R read, Args args) { return PerBaseInfo!(R, TagsAndOptions)(read, args); } } /// Provides additional property $(D reference_base) template MDbaseInfo(R, Options...) { mixin template resultProperties() { enum MdCurrentOp = staticIndexOf!(Option.mdCurrentOp, Options) != -1; enum MdPreviousOp = staticIndexOf!(Option.mdPreviousOp, Options) != -1; enum MdNextOp = staticIndexOf!(Option.mdNextOp, Options) != -1; /// If current CIGAR operation is reference consuming, /// returns reference base at this position, otherwise /// returns '-'. /// /// If read is on '-' strand, the result will be /// complementary base. char reference_base() @property const { return _ref_base; } private char _ref_base = void; static if (MdPreviousOp) { private Nullable!MdOperation _previous_md_operation = void; /// Previous MD operation Nullable!MdOperation previous_md_operation() @property { return _previous_md_operation; } } static if (MdCurrentOp) { private MdOperation _current_md_operation = void; private uint _current_md_operation_offset = void; /// Current MD operation MdOperation md_operation() @property { return _current_md_operation; } /// If current MD operation is match, returns how many bases /// have matched before the current base. Otherwise returns 0. uint md_operation_offset() @property const { return _current_md_operation_offset; } } static if (MdNextOp) { private Nullable!MdOperation _next_md_operation = void; /// Next MD operation Nullable!MdOperation next_md_operation() @property { return _next_md_operation; } } } mixin template rangeMethods() { enum MdCurrentOp = staticIndexOf!(Option.mdCurrentOp, Options) != -1; enum MdPreviousOp = staticIndexOf!(Option.mdPreviousOp, Options) != -1; enum MdNextOp = staticIndexOf!(Option.mdNextOp, Options) != -1; private { ReversableRange!(reverseMdOp, MdOperationRange) _md_ops = void; uint _match; // remaining length of current match operation MdOperation _md_front = void; static if (MdPreviousOp) { Nullable!MdOperation _previous_md_op; bool _md_front_is_initialized; } } private void updateMdFrontVariable() { static if (MdPreviousOp) { if (_md_front_is_initialized) _previous_md_op = _md_front; _md_front_is_initialized = true; } _md_front = _md_ops.front; _md_ops.popFront(); } void setup(Args...)(const ref R read, Args args) { auto md = read["MD"]; auto md_str = *(cast(string*)&md); _md_ops = reversableRange!reverseMdOp(mdOperations(md_str), read.is_reverse_strand); while (!_md_ops.empty) { updateMdFrontVariable(); if (!_md_front.is_deletion) { if (_md_front.is_match) { _match = _md_front.match; } break; } } } void populate(Result)(ref Result result) { if (!current_cigar_operation.is_reference_consuming) { result._ref_base = '-'; return; } MdOperation op = _md_front; if (op.is_mismatch) result._ref_base = op.mismatch.asCharacter; else if (op.is_match) { result._ref_base = result.base.asCharacter; } else assert(0); static if (MdPreviousOp) { if (_previous_md_op.isNull) result._previous_md_operation.nullify(); else result._previous_md_operation = _previous_md_op.get; } static if (MdCurrentOp) { result._current_md_operation = op; result._current_md_operation_offset = _md_front.match - _match; } static if (MdNextOp) { if (_md_ops.empty) result._next_md_operation.nullify(); else result._next_md_operation = _md_ops.front; } } void update(const ref R read) { if (!current_cigar_operation.is_reference_consuming) return; if (_md_front.is_mismatch) { if (_md_ops.empty) return; updateMdFrontVariable(); } else if (_md_front.is_match) { --_match; if (_match == 0 && !_md_ops.empty) { updateMdFrontVariable(); } } else assert(0); while (_md_front.is_deletion) { if (_md_ops.empty) return; updateMdFrontVariable(); } if (_match == 0 && _md_front.is_match) _match = _md_front.match; } void copy(Range)(ref Range source, ref Range target) { target.MD._md_ops = source.MD._md_ops.save; target.MD._md_front = source.MD._md_front; static if (MdPreviousOp) { if (source.MD._previous_md_op.isNull) target.MD._previous_md_op.nullify(); else target.MD._previous_md_op = source.MD._previous_md_op.get; target.MD._md_front_is_initialized = source.MD._md_front_is_initialized; } } } } /// Provides additional property $(D flow_call). template FZbaseInfo(R, Options...) { mixin template resultProperties() { /// Current flow call ReadFlowCall flow_call() @property const { return _flow_call; } private { ReadFlowCall _flow_call; } } mixin template rangeMethods() { private { ReadFlowCallRange!(BamRead.SequenceResult) _flow_calls = void; ReadFlowCall _current_flow_call = void; ushort _at = void; debug { string _read_name; } } void setup(Args...)(const ref R read, Args args) { string flow_order = void; string key_sequence = void; debug { _read_name = read.name.idup; } enum flowOrderExists = staticIndexOf!(MixinArg!(string, "flowOrder"), Args); enum keySequenceExists = staticIndexOf!(MixinArg!(string, "keySequence"), Args); static assert(flowOrderExists != -1, `Flow order must be provided via arg!"flowOrder"`); static assert(keySequenceExists != -1, `Flow order must be provided via arg!"keySequence"`); foreach (arg; args) { static if(is(typeof(arg) == MixinArg!(string, "flowOrder"))) flow_order = arg; static if(is(typeof(arg) == MixinArg!(string, "keySequence"))) key_sequence = arg; } _at = 0; _flow_calls = readFlowCalls(read, flow_order, key_sequence); if (!_flow_calls.empty) { _current_flow_call = _flow_calls.front; } } void populate(Result)(ref Result result) { result._flow_call = _current_flow_call; debug { if (result.base != result._flow_call.base) { import std.stdio; stderr.writeln("invalid flow call at ", _read_name, ": ", result.position); } } } void update(const ref R read) { ++_at; if (_at == _current_flow_call.length) { _flow_calls.popFront(); if (!_flow_calls.empty) { _current_flow_call = _flow_calls.front; _at = 0; } } } void copy(Range)(ref Range source, ref Range target) { target.FZ._flow_calls = source._flow_calls.save(); target.FZ._at = source.FZ._at; target.FZ._current_flow_call = source._current_flow_call; debug { target._read_name = _read_name; } } } } /// Retrieving flow signal intensities from ZM tags is also available. alias FZbaseInfo ZMbaseInfo; /// Provides additional properties /// * position /// * cigar_operation /// * cigar_operation_offset template CIGARbaseInfo(R, Options...) { mixin template resultProperties() { enum CigarExtraProperties = staticIndexOf!(Option.cigarExtra, Options) != -1; static if (CigarExtraProperties) { /// Current CIGAR operation CigarOperation cigar_operation() @property { return _cigar[_operation_index]; } /// CIGAR operations before current one auto cigar_before() @property { return _cigar[0 .. _operation_index]; } /// CIGAR operations after current one auto cigar_after() @property { return _cigar[_operation_index + 1 .. _cigar.length]; } } else { /// Current CIGAR operation CigarOperation cigar_operation() @property const { return _current_cigar_op; } } /// Position of the corresponding base on the reference. /// If current CIGAR operation is not one of 'M', '=', 'X', /// returns the position of the previous mapped base. uint position() @property const { return _reference_position; } /// Offset in current CIGAR operation, starting from 0. uint cigar_operation_offset() @property const { return _cigar_operation_offset; } private { int _operation_index = void; uint _reference_position = void; uint _cigar_operation_offset = void; static if (CigarExtraProperties) { ReversableRange!(identity, const(CigarOperation)[]) _cigar = void; } else { CigarOperation _current_cigar_op; } } } mixin template rangeMethods() { enum CigarExtraProperties = staticIndexOf!(Option.cigarExtra, Options) != -1; private { CigarOperation _current_cigar_op = void; ulong _cur_cig_op_len = void; bool _cur_cig_op_is_ref_cons = void; int _index = void; uint _at = void; uint _ref_pos = void; ReversableRange!(identity, const(CigarOperation)[]) _cigar = void; } /// Current CIGAR operation, available to all extensions const(CigarOperation) current_cigar_operation() @property const { return _current_cigar_op; } void setup(Args...)(const ref R read, Args) { _cigar = reversableRange(read.cigar, read.is_reverse_strand); _index = -1; _ref_pos = reverse_strand ? (read.position + read.basesCovered() - 1) : read.position; _moveToNextCigarOperator(); assert(_index >= 0); } void populate(Result)(ref Result result) { result._reference_position = _ref_pos; result._cigar_operation_offset = _at; static if (CigarExtraProperties) { result._cigar = _cigar; result._operation_index = _index; } else { result._current_cigar_op = _current_cigar_op; } } void update(const ref R read) { ++_at; if (_cur_cig_op_is_ref_cons) { _ref_pos += reverse_strand ? -1 : 1; } if (_at == _cur_cig_op_len) { _moveToNextCigarOperator(); } } void copy(Range)(const ref Range source, ref Range target) { target.CIGAR._cigar = source.CIGAR._cigar; target.CIGAR._index = source.CIGAR._index; target.CIGAR._current_cigar_op = source.CIGAR._current_cigar_op; target.CIGAR._cur_cig_op_len = source.CIGAR._cur_cig_op_len; target.CIGAR._cur_cig_op_is_ref_cons = source.CIGAR._cur_cig_op_is_ref_cons; target.CIGAR._at = source.CIGAR._at; target.CIGAR._ref_pos = source.CIGAR._ref_pos; } private void _moveToNextCigarOperator() { _at = 0; for (++_index; _index < _cigar.length; ++_index) { _current_cigar_op = _cigar[_index]; _cur_cig_op_is_ref_cons = _current_cigar_op.is_reference_consuming; _cur_cig_op_len = _current_cigar_op.length; if (_current_cigar_op.is_query_consuming) break; if (_cur_cig_op_is_ref_cons) { if (reverse_strand) _ref_pos -= _cur_cig_op_len; else _ref_pos += _cur_cig_op_len; } } } } } BioD-0.1.0/bio/bam/constants.d000066400000000000000000000030131273003163100160070ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.constants; public import bio.core.bgzf.constants; immutable BAM_MAGIC = "BAM\1"; immutable BAI_MAGIC = "BAI\1"; immutable ubyte BAM_SI1 = 66; immutable ubyte BAM_SI2 = 67; immutable ubyte[28] BAM_EOF = BGZF_EOF; immutable BAI_MAX_BIN_ID = 37449; immutable BAI_MAX_NONLEAF_BIN_ID = 4680; immutable BAI_LINEAR_INDEX_WINDOW_SIZE = 16384; BioD-0.1.0/bio/bam/iontorrent/000077500000000000000000000000001273003163100160345ustar00rootroot00000000000000BioD-0.1.0/bio/bam/iontorrent/flowcall.d000066400000000000000000000232321273003163100200060ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.iontorrent.flowcall; import bio.bam.tagvalue; import bio.bam.iontorrent.flowindex; import bio.core.base; import bio.core.utils.range; import std.array; import std.typecons; import std.range; import std.algorithm; import std.exception; /// Tag where flow signal intensities are stored enum FlowGramTag : ubyte { FZ, ZM } /// Scale of intensity values float multiplier(FlowGramTag tag) { return tag == FlowGramTag.FZ ? 100.0 : 256.0; } /// Flow base call struct FlowCall { private { short _signal_intensity; static assert(Base.ValueSetSize <= 16 && FlowGramTag.max < 16, "implementation of FlowCall should be changed?"); ubyte _storage; // tag in upper 4 bits, base in lower 4 bits Base _base() @property const { return Base.fromInternalCode(_storage & 0xF); } void _base(Base b) @property { _storage &= 0xF0; _storage |= b.internal_code; } FlowGramTag _tag() @property const { return cast(FlowGramTag)(_storage >> 4); } void _tag(FlowGramTag tag) @property { _storage &= 0xF; _storage |= (cast(ubyte)tag << 4); } this(short signal_intensity, Base b, FlowGramTag tag) { _signal_intensity = signal_intensity; _storage = cast(ubyte)(b.internal_code | (tag << 4)); } } /// Nucleotide Base base() @property const { return _base; } /// Signal intensity, normalized to homopolymer lengths float intensity() @property const { return _signal_intensity / multiplier(_tag); } /// round(intensity * Multiplier) where Multiplier is 100.0 for FZ tag, /// and 256.0 for ZM tag. /// More efficient, because this is how intensities are stored in FZ/ZM tag. short intensity_value() @property const { return _signal_intensity; } } /// Flow call associated with a read struct ReadFlowCall { private { FlowCall _fc; ushort _offset; ushort _called_len; ushort _flow_index; this(Base b, short signal_intensity, ushort offset, ushort called, ushort flow_index, FlowGramTag tag) { _fc = FlowCall(signal_intensity, b, tag); _offset = offset; _called_len = called; _flow_index = flow_index; } } /// Called nucleotide Base base() @property const { return _fc._base; } /// Set base to its complement void complement() { _fc._base = _fc._base.complement; } /// Called homopolymer length ushort length() @property const { return _called_len; } /// Zero-based position of the first nucleotide in the run, /// relative to start of the read. Takes strandness into account. ushort offset() @property const { return _offset; } /// Signal intensity, normalized to homopolymer lengths float intensity() @property const { return _fc.intensity; } /// round(intensity * Multiplier) where Multiplier is 100.0 for FZ tags, /// and 256.0 for ZM tags. /// More efficient, because this is how intensities are stored in FZ/ZM tag. short intensity_value() @property const { return _fc._signal_intensity; } /// Flow index (0-based) size_t flow_index() @property const { return _flow_index; } } /// Get flow calls from signal intensities and flow order. auto flowCalls(short[] intensities, string flow_order, FlowGramTag tag) { static FlowCall flowCall(T)(T call) { return FlowCall(call[0], Base(call[1]), call[2]); } return map!flowCall(zip(intensities, flow_order, repeat(tag))); } struct ReadFlowCallRange(S) if (!is(S == class)) { private { string _flow_order = void; short[] _intensities = void; bool _rev = void; S _sequence = void; int _zf = void; Base _current_base = void; ushort _current_length = void; size_t _current_flow_index; ushort _current_offset; ushort _overlap = void; FlowGramTag _tag = void; bool _empty = false; // consumes next homopolymer from the sequence, // and updates _current_base, _current_flow_index, // _current_length appropriately void _doSetup() { if (_sequence.empty) { _empty = true; return; } _current_length = 1; // setup current base and current length if (!_rev) { _current_base = _sequence.front; _sequence.popFront(); while (!_sequence.empty && _sequence.front == _current_base) { _sequence.popFront(); ++_current_length; } } else { _current_base = _sequence.back; // complement later _sequence.popBack(); // because of comparison below while (!_sequence.empty && _sequence.back == _current_base) { _sequence.popBack(); ++_current_length; } _current_base = _current_base.complement; } // setup current flow index for ( ; _current_flow_index < _flow_order.length; ++_current_flow_index) { if (_flow_order[_current_flow_index] == _current_base) { break; } } } } this(S seq, short[] intensities, bool reverse_strand, string flow_order, ushort first_base_overlap, int zf, FlowGramTag tag) { _sequence = seq; _intensities = intensities; _rev = reverse_strand; _flow_order = flow_order; _zf = zf; _overlap = first_base_overlap; _tag = tag; if (_sequence.empty) { _empty = true; } else { _doSetup(); } } bool empty() @property const { return _empty; } ReadFlowCall front() @property const { enforce(_current_flow_index < _intensities.length, "Inconsistency between FZ/ZM tag and read bases"); auto intensity = cast(ushort)(_intensities[_current_flow_index] - _overlap); ReadFlowCall rfc = void; rfc._fc = FlowCall(intensity, _current_base, _tag); rfc._offset = _current_offset; rfc._called_len = _current_length; rfc._flow_index = cast(ushort)(_current_flow_index + _zf); return rfc; } void popFront() { _current_offset += _current_length; ++_current_flow_index; _overlap = 0; // after first base it is always zero _doSetup(); } ReadFlowCallRange!S save() @property { // bitwise copy // FIXME: is it safe? ReadFlowCallRange!S r = this; return r; } } private ReadFlowCallRange!S readFlowCallRange(S)(S seq, short[] intensities, bool rev, string flow_order, ushort overlap, int zf, FlowGramTag tag) { return ReadFlowCallRange!S(seq, intensities, rev, flow_order, overlap, zf, tag); } /// Get read flow calls. Takes ZF tag and strandness into account. /// /// Tag name is an optional argument because it is not standard and will likely /// be changed in the future (there was a proposal on samtools mailing list /// to introduce standard FB tag). auto readFlowCalls(R)(R read, string flow_order, string key_sequence, string tag="ZF") { auto zf = cast(int)read[tag]; auto fz_value = read["FZ"]; auto zm_value = read["ZM"]; enforce(!(fz_value.is_nothing && zm_value.is_nothing), "Neither FZ nor ZM tag is presented in a mapped read"); auto fg_tag = fz_value.is_nothing ? FlowGramTag.ZM : FlowGramTag.FZ; short[] flow_int = *cast(short[]*)(fg_tag == FlowGramTag.ZM ? &zm_value : &fz_value); flow_order = flow_order[zf .. $]; auto intensities = flow_int[zf .. $]; // key sequence is required because its last base can overlap with first called base ushort overlap = 0; Base5 base = read.is_reverse_strand ? read.sequence.back.complement : read.sequence.front; foreach_reverse (c; key_sequence) { if (c != base) break; overlap += cast(int)(multiplier(fg_tag)); } return readFlowCallRange(read.sequence, intensities, read.is_reverse_strand, flow_order, overlap, zf, fg_tag); } BioD-0.1.0/bio/bam/iontorrent/flowindex.d000066400000000000000000000055051273003163100202050ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.iontorrent.flowindex; import std.range; /// struct FlowIndex(S) { private { S _seq; string _fo; size_t _index; } this(S sequence, string flow_order) { _seq = sequence; _fo = flow_order; if (!_seq.empty) { while (_index < _fo.length) { if (_fo[_index] == _seq.front) break; ++_index; } } } /// bool empty() @property { return _seq.empty || (_index == _fo.length); } /// Current flow index size_t front() @property const { return _index; } /// Move to next read base void popFront() { auto prev_base = _seq.front; _seq.popFront(); if (_seq.empty) return; if (_seq.front == prev_base) { return; // keep index as is } _index += 1; while (_index < _fo.length) { if (_fo[_index] == _seq.front) break; _index++; } } } /// Given a sequence of bases and flow order, recover flow index, /// i.e. sequence of 0-based flow positions for each base. auto flowIndex(S)(S sequence, string flow_order) { return FlowIndex!S(sequence, flow_order); } unittest { import bio.core.base; import std.conv; import std.algorithm; auto seq = map!(c => Base5(c))("AACGTAAACCTCACT"); string flow_order = "ATGCATGCATGCATGCATGCATGCATGC"; // 0123456789111111111122222222 // 012345678901234567 assert(equal(flowIndex(seq, flow_order), [0, 0, 3, 6, 9, 12, 12, 12, 15, 15, 17, 19, 20, 23, 25])); } BioD-0.1.0/bio/bam/md/000077500000000000000000000000001273003163100142315ustar00rootroot00000000000000BioD-0.1.0/bio/bam/md/core.d000066400000000000000000000001351273003163100153250ustar00rootroot00000000000000module bio.bam.md.core; public import bio.bam.md.operation; public import bio.bam.md.parse; BioD-0.1.0/bio/bam/md/operation.d000066400000000000000000000067111273003163100164030ustar00rootroot00000000000000module bio.bam.md.operation; import bio.core.base; import bio.core.sequence; import std.conv; import std.traits; import std.bitmanip; import std.algorithm; /// MD tag operation types enum MdOperationType : ubyte { Match, Mismatch, Deletion } /// Single MD operation. struct MdOperation { private { MdOperationType _type; union { uint _match; NucleotideSequence _deletion; Base16 _mismatch; } } /// Operation type MdOperationType type() @property const { return _type; } /// ditto void type(MdOperationType t) @property { _type = t; } /// Convenience methods bool is_deletion() @property const { return _type == MdOperationType.Deletion; } /// ditto bool is_match() @property const { return _type == MdOperationType.Match; } /// ditto bool is_mismatch() @property const { return _type == MdOperationType.Mismatch; } /// The number of matched bases ref uint match() @property { return _match; } /// Mismatched reference base Base16 mismatch() @property const { return _mismatch; } /// ditto void mismatch(Base16 base) @property { _mismatch = base; } /// Deleted sequence ref NucleotideSequence deletion() @property { return _deletion; } static MdOperation createMatch(uint match) { MdOperation m = void; m._type = MdOperationType.Match; m._match = match; return m; } static MdOperation createDeletion(string deletion) { MdOperation m = void; m._type = MdOperationType.Deletion; m._deletion = nucleotideSequence(sliceableString(deletion)); return m; } static MdOperation createMismatch(char mismatch) { MdOperation m = void; m._type = MdOperationType.Mismatch; m._mismatch = Base16(mismatch); return m; } static MdOperation createDeletion(NucleotideSequence seq) { MdOperation m = void; m._type = MdOperationType.Deletion; m._deletion = seq; return m; } static MdOperation createMismatch(Base16 base) { MdOperation m = void; m._type = MdOperationType.Mismatch; m._mismatch = base; return m; } bool opEquals(ref const(MdOperation) other) const { if (type != other.type) { return false; } final switch (type) { case MdOperationType.Match: return _match == other._match; case MdOperationType.Mismatch: return mismatch == other.mismatch; case MdOperationType.Deletion: return equal(cast()_deletion, cast()other._deletion); } } string toString() const { final switch (type) { case MdOperationType.Match: return "Match(" ~ to!string(_match) ~ ")"; case MdOperationType.Mismatch: return "Mismatch(" ~ to!string(_mismatch) ~ ")"; case MdOperationType.Deletion: return "Deletion(" ~ to!string(_deletion) ~ ")"; } } } /// Returns MD operation with reverse-complemented data MdOperation reverseMdOp(MdOperation op) { if (op.is_deletion) return MdOperation.createDeletion(op.deletion.reverse); if (op.is_mismatch) return MdOperation.createMismatch(op.mismatch.complement); return op; } BioD-0.1.0/bio/bam/md/parse.d000066400000000000000000000126321273003163100155140ustar00rootroot00000000000000module bio.bam.md.parse; import bio.bam.md.operation; import std.ascii; import std.array; import std.algorithm; import std.functional; import std.range; import std.conv; import std.traits; /// Returns bidirectional range of MD operations. Zero matches are skipped. auto mdOperations(string md) { static struct Result { private { string _md = void; MdOperation _cached_front = void; MdOperation _cached_back = void; ubyte _rem = 255; } this(string md) { _md = md; if (!cacheFront()) { _rem = 0; } else { if (!cacheBack()) { _cached_back = _cached_front; _rem = 1; } } } bool empty() @property { return _rem == 0; } Result save() @property { Result res = void; res._md = _md; res._cached_front = _cached_front; res._cached_back = _cached_back; res._rem = _rem; return res; } ref MdOperation front() @property { return _cached_front; } ref MdOperation back() @property { return _cached_back; } void popFront() { if (_md.empty) { if (_rem == 255) { _cached_front = _cached_back; _rem = 1; } else { _rem = 0; } } else { if (!cacheFront()) _rem = 0; } } void popBack() { if (_md.empty) { if (_rem == 255) { _cached_back = _cached_front; _rem = 1; } else { _rem = 0; } } else { if (!cacheBack()) _rem = 0; } } private bool cacheFront() { if (_md.empty) return false; if (_md[0] == '^') { // deletion, get bases _md = _md[1 .. $]; auto len = countUntil!(not!isUpper)(_md); if (len == -1) { len = _md.length; } _cached_front = MdOperation.createDeletion(_md[0 .. len]); _md = _md[len .. $]; } else if (isDigit(_md[0])) { // match, get number auto len = countUntil!(not!isDigit)(_md); if (len == -1) { len = _md.length; } _cached_front = MdOperation.createMatch(to!uint(_md[0 .. len])); _md = _md[len .. $]; } else { // mismatch _cached_front = MdOperation.createMismatch(_md[0]); _md = _md[1 .. $]; } return true; } private bool cacheBack() { if (_md.empty) return false; if (isDigit(_md[$ - 1])) { // match, get number auto len = countUntil!(not!isDigit)(retro(_md)); if (len == -1) { len = _md.length; } _cached_back = MdOperation.createMatch(to!uint(_md[$ - len .. $])); _md = _md[0 .. $ - len]; } else { if (_md.length == 1 || isDigit(_md[$ - 2])) { // mismatch _cached_back = MdOperation.createMismatch(_md[$ - 1]); _md = _md[0 .. $ - 1]; } else { // deletion auto len = countUntil!"a == '^'"(retro(_md)); _cached_back = MdOperation.createDeletion(_md[$ - len .. $]); _md = _md[0 .. $ - len - 1]; } } return true; } } static bool isZeroMatch(MdOperation op) { return op.type == MdOperationType.Match && op.match == 0; } return filterBidirectional!(not!isZeroMatch)(Result(md)); } /// Alias for return type of mdOperations alias ReturnType!mdOperations MdOperationRange; unittest { import std.algorithm; import std.stdio; assert(equal(mdOperations("86"), [MdOperation.createMatch(86)])); assert(equal(mdOperations("0G81"), [MdOperation.createMismatch('G'), MdOperation.createMatch(81)])); assert(equal(mdOperations("62^T28"), [MdOperation.createMatch(62), MdOperation.createDeletion("T"), MdOperation.createMatch(28)])); assert(equal(retro(mdOperations("3C6C0A13^A4C2")), retro([MdOperation.createMatch(3), MdOperation.createMismatch('C'), MdOperation.createMatch(6), MdOperation.createMismatch('C'), MdOperation.createMismatch('A'), MdOperation.createMatch(13), MdOperation.createDeletion("A"), MdOperation.createMatch(4), MdOperation.createMismatch('C'), MdOperation.createMatch(2)]))); assert(equal(mdOperations("27^TTT63"), [MdOperation.createMatch(27), MdOperation.createDeletion("TTT"), MdOperation.createMatch(63)])); } BioD-0.1.0/bio/bam/md/reconstruct.d000066400000000000000000000350671273003163100167640ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.md.reconstruct; import bio.bam.read; import bio.bam.md.core; import std.conv; import std.range; import std.traits; import std.algorithm; import std.range; /// Reconstruct read DNA. /// Returns lazy sequence. auto dna(T)(T read) if(isBamRead!(Unqual!T)) { debug { /* import std.stdio; stderr.writeln("[dna] processing read ", read.name); stderr.flush(); */ } static struct QueryChunk(S) { S sequence; CigarOperation operation; } static struct QueryChunksResult(R, S) { this(R ops, S seq) { _seq = seq; _ops = ops; } auto front() @property { auto op = _ops.front; return QueryChunk!S(_seq[0 .. op.length], op); } bool empty() @property { return _ops.empty; } void popFront() { _seq = _seq[_ops.front.length .. _seq.length]; _ops.popFront(); } private R _ops; private S _seq; } static auto getQueryChunksResult(R, S)(S sequence, R cigar) { return QueryChunksResult!(R, S)(cigar, sequence); } // Get read sequence chunks corresponding to query-consuming operations in read.sequence static auto queryChunks(ref T read) { return getQueryChunksResult(read.sequence, filter!"a.is_query_consuming"(read.cigar)); } auto _read = read; auto query_chunks = queryChunks(_read); static struct Result(R, M) { this(ref T read, R query_sequence, M md_operations) { debug { _initial_qseq = to!string(query_sequence); } _qseq = query_sequence; _md = md_operations; _fetchNextMdOperation(); } bool empty() @property { return _empty; } /* MD operations -> match(N) ? consume N characters from query mismatch(C) ? consume a character from query and replace it with C deletion(S) ? consume S from MD */ char front() @property { final switch (_cur_md_op.type) { case MdOperationType.Match: return cast(char)_qseq.front; case MdOperationType.Mismatch: return _cur_md_op.mismatch; case MdOperationType.Deletion: return cast(char)_cur_md_op.deletion.front; } } private void _fetchNextMdOperation() { if (_md.empty) { _empty = true; return; } _cur_md_op = _md.front; _md.popFront(); } private bool _qseqIsSuddenlyEmpty() { if (!_qseq.empty) { return false; } /* MD and CIGAR don't match */ debug { import std.stdio; stderr.writeln("Current MD operation: ", _cur_md_op); stderr.writeln("Query sequence: ", _initial_qseq); } return true; } void popFront() { final switch (_cur_md_op.type) { case MdOperationType.Mismatch: if (_qseqIsSuddenlyEmpty()) break; _qseq.popFront(); _fetchNextMdOperation(); break; case MdOperationType.Match: if (_qseqIsSuddenlyEmpty()) break; --_cur_md_op.match; _qseq.popFront(); if (_cur_md_op.match == 0) { _fetchNextMdOperation(); } break; case MdOperationType.Deletion: _cur_md_op.deletion.popFront(); if (_cur_md_op.deletion.empty) { _fetchNextMdOperation(); } break; } } private { debug { string _initial_qseq; } R _qseq; M _md; bool _empty; MdOperation _cur_md_op; } } auto md = _read["MD"]; string md_str; if (!md.is_nothing) { md_str = cast(string)_read["MD"]; } static auto getResult(R, M)(ref T read, R query, M md_ops) { return Result!(R, M)(read, query, md_ops); } auto result = getResult(_read, joiner(map!"a.sequence"(filter!"a.operation.is_reference_consuming"(query_chunks))), mdOperations(md_str)); debug { import std.stdio; if (result.empty) { stderr.writeln("[dna] empty DNA!"); stderr.writeln(" read name: ", read.name); stderr.writeln(" read sequence: ", read.sequence); stderr.writeln(" read CIGAR: ", read.cigarString()); stderr.writeln(" read MD tag: ", read["MD"]); stderr.flush(); } } return result; } unittest { import std.stdio; writeln("Testing reconstruction of reference from MD tags and CIGAR"); // Test reference reconstruction from MD and CIGAR. // (Tests are taken from http://davetang.org/muse/2011/01/28/perl-and-sam/) BamRead read; read = BamRead("r1", "CGATACGGGGACATCCGGCCTGCTCCTTCTCACATG", [CigarOperation(36, 'M')]); read["MD"] = "1A0C0C0C1T0C0T27"; assert(equal(dna(read), "CACCCCTCTGACATCCGGCCTGCTCCTTCTCACATG")); read = BamRead("r2", "GAGACGGGGTGACATCCGGCCTGCTCCTTCTCACAT", [CigarOperation(6, 'M'), CigarOperation(1, 'I'), CigarOperation(29, 'M')]); read["MD"] = "0C1C0C1C0T0C27"; assert(equal(dna(read), "CACCCCTCTGACATCCGGCCTGCTCCTTCTCACAT")); read = BamRead("r3", "AGTGATGGGGGGGTTCCAGGTGGAGACGAGGACTCC", [CigarOperation(9, 'M'), CigarOperation(9, 'D'), CigarOperation(27, 'M')]); read["MD"] = "2G0A5^ATGATGTCA27"; assert(equal(dna(read), "AGGAATGGGATGATGTCAGGGGTTCCAGGTGGAGACGAGGACTCC")); read = BamRead("r4", "AGTGATGGGAGGATGTCTCGTCTGTGAGTTACAGCA", [CigarOperation(2, 'M'), CigarOperation(1, 'I'), CigarOperation(7, 'M'), CigarOperation(6, 'D'), CigarOperation(26, 'M')]); read["MD"] = "3C3T1^GCTCAG26"; assert(equal(dna(read), "AGGCTGGTAGCTCAGGGATGTCTCGTCTGTGAGTTACAGCA")); } /** * Returns lazy sequence of reference bases. If some bases can't be determined from reads, * they are replaced with 'N'. * * Reads must be a range of reads aligned to the same reference sequence, sorted by leftmost * coordinate. * Returned reference bases start from the leftmost position of the first read, * and end at the rightmost position of all the reads. */ auto dna(R)(R reads) if (isInputRange!R && isBamRead!(Unqual!(ElementType!R))) { static struct Result(F) { alias Unqual!(ElementType!F) Read; this(F reads) { _reads = reads; if (_reads.empty) { _empty = true; return; } auto read = _reads.front; _chunk = dna(read); _reference_pos = read.position; _reads.popFront(); } @property bool empty() { return _empty; } @property char front() { if (_bases_to_skip > 0) { return 'N'; } return _chunk.front; } private void setSkipMode(ref Read read) { _reads.popFront(); _chunk = dna(read); _bases_to_skip = read.position - _reference_pos; } void popFront() { _reference_pos += 1; if (_bases_to_skip > 0) { --_bases_to_skip; return; } _chunk.popFront(); /* * If current chunk is empty, get the next one. * * Here's the reference: * .........................*....................................... * _reference_pos (we are here) * Last chunk ended just now: * [..........] * Go through subsequent reads while their leftmost position is * less or equal to _reference_pos, select the one which covers * more bases to the right of _reference_pos. * [...............] * [....] * [..........] * [.........] <- this one is the best */ if (_chunk.empty) { if (_reads.empty) { _empty = true; return; } auto next_read = _reads.front; if (next_read.position > _reference_pos) { setSkipMode(next_read); return; } auto best_read = next_read; // read covers half-open [position .. position + basesCovered) interval auto best_end_pos = best_read.basesCovered() + best_read.position; bool found_good = best_end_pos > _reference_pos; while (true) { if (_reads.empty) { if (!found_good) { _empty = true; return; } break; } auto read = _reads.front; if (read.position > _reference_pos) { if (!found_good) { setSkipMode(read); return; } break; } auto end_pos = read.basesCovered() + read.position; if (end_pos > _reference_pos) { found_good = true; if (end_pos > best_end_pos) { best_end_pos = end_pos; best_read = read; } } _reads.popFront(); } // If we're here, we've found a good read. _chunk = dna(best_read); debug { /* import std.stdio; writeln("_reference_pos = ", _reference_pos, "; best_read.position = ", best_read.position, "; _chunk length = ", best_read.basesCovered()); */ } // However, we need to strip some bases from the left. popFrontN(_chunk, _reference_pos - best_read.position); } } private size_t _bases_to_skip; private size_t _reference_pos; private ReturnType!(dna!Read) _chunk; private bool _empty = false; private F _reads; } auto nonempty = filter!"a.basesCovered() > 0"(reads); return Result!(typeof(nonempty))(nonempty); } unittest { // reads are taken from HG00110.chrom20.ILLUMINA.bwa.GBR.exome.20111114.bam auto r1 = BamRead("r1", "AGGTTTTGTGAGTGGGACAGTTGCAGCAAAACACAACCATAGGTGCCCATCCACCAAGGCAGGCTCTCCATCTTGCTCAGAGTGGCTCTA", [CigarOperation(89, 'M'), CigarOperation(1, 'S')]); r1.position = 60246; r1["MD"] = "89"; auto r2 = BamRead("r2", "TGTGAGTGGGACAGTTGCAGCAAAACACAACCATAGGTGCCCATCCACCAAGGCAGGCTCTCCATCTTGCTCAGAGTGGCTCCAGCCCTT", [CigarOperation(83, 'M'), CigarOperation(7, 'S')]); r2.position = 60252; r2["MD"] = "82T0"; auto r3 = BamRead("r3", "CATAGGTGCCCATCCACCAAGGCAGGCTCTCCATCTTGCTCAGAGTGGCTCTAGCCCTTGCTGACTGCTGGGCAGGGAGAGAGCAGAGCT", [CigarOperation(90, 'M')]); r3.position = 60283; r3["MD"] = "90"; auto r4 = BamRead("r4", "CCCTTGCTGACTGCTGGGCAGGGAGAGAGCAGAGCTAACTTCCTCATGGGACCTGGGTGTGTCTGATCTGTGCACACCACTATCCAACCG", [CigarOperation(90, 'M')]); r4.position = 60337; r4["MD"] = "90"; auto r5 = BamRead("r5", "GAGGCTCCACCCTGGCCACTCTTGTGTGCACACAGCACAGCCTCTACTGCTACACCTGAGTACTTTGCCAGTGGCCTGGAAGCACTTTGT", [CigarOperation(90, 'M')]); r5.position = 60432; r5["MD"] = "90"; auto reads = [r1, r2, r3, r4, r5]; assert(equal(dna(reads), "AGGTTTTGTGAGTGGGACAGTTGCAGCAAAACACAACCATAGGTGCCCATCCACCAAGGCAGGCTCTCCATCTTGCTCAGAGTGGCTCTAGCCCTTGCTGACTGCTGGGCAGGGAGAGAGCAGAGCTAACTTCCTCATGGGACCTGGGTGTGTCTGATCTGTGCACACCACTATCCAACCGNNNNNGAGGCTCCACCCTGGCCACTCTTGTGTGCACACAGCACAGCCTCTACTGCTACACCTGAGTACTTTGCCAGTGGCCTGGAAGCACTTTGT")); } BioD-0.1.0/bio/bam/multireader.d000066400000000000000000000342231273003163100163170ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2016 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.multireader; import bio.sam.header; import bio.bam.reader; import bio.bam.read; import bio.bam.referenceinfo; import bio.bam.utils.samheadermerger; import std.algorithm; import std.range; import std.conv; import std.parallelism; import std.array; import std.numeric : normalize, dotProduct; import std.exception; import std.typecons; import std.file : getSize; alias size_t FileId; /// Read from one of multiple BAM files struct MultiBamRead(R=BamRead) { R read; alias read this; /// from which file it came FileId file_id; /// MultiBamRead dup() @property const { return MultiBamRead(read.dup, file_id); } } // ((MultiBamRead, SamHeaderMerger), (MultiBamRead, SamHeaderMerger)) -> bool bool compare(T)(auto ref T r1, auto ref T r2) { assert(r1[1] == r2[1]); SortingOrder sorting_order; if (r1[1] is null) sorting_order = r1[0].read.reader.header.sorting_order; else sorting_order = r1[1].merged_header.sorting_order; if (sorting_order == SortingOrder.coordinate) return compareCoordinates(r1[0], r2[0]); else if (sorting_order == SortingOrder.queryname) return compareReadNames(r1[0], r2[0]); else assert(0); } // ([BamRead/BamReadBlock], FileId) -> [MultiBamRead] auto multiBamReads(R)(R reads, FileId index) { static if (is(ElementType!R == BamRead)) return reads.zip(repeat(index)).map!(x => MultiBamRead!BamRead(x[0], x[1])); else return reads.zip(repeat(index)).map!(x => MultiBamRead!BamRead(x[0].read, x[1])); } // (BamReader, SamHeaderMerger, FileId) -> [(MultiBamRead, SamHeaderMerger, FileId)] auto readRange(BamReader reader, SamHeaderMerger merger, FileId index) { return zip(reader.reads.multiBamReads(index), repeat(merger), repeat(index)); } // (BamReader, SamHeaderMerger, FileId, int, uint, uint) -> // [(MultiBamRead, SamHeaderMerger, FileId)] auto readRange(BamReader reader, SamHeaderMerger merger, FileId index, int ref_id, uint start, uint end) { int old_ref_id = ref_id; if (merger !is null) old_ref_id = cast(int)merger.ref_id_reverse_map[index][ref_id]; auto reads = reader.reference(old_ref_id)[start .. end]; return zip(reads.multiBamReads(index), repeat(merger), repeat(index)); } // (BamReader, SamHeaderMerger, FileId, [BamRegion]) -> // [(MultiBamRead, SamHeaderMerger, FileId)] auto readRange(BamReader reader, SamHeaderMerger merger, FileId index, BamRegion[] regions) { if (merger is null) // single reader => no fiddling with ref_id return zip(reader.getReadsOverlapping(regions).multiBamReads(index), repeat(merger), repeat(index)); auto old_regions = merger is null ? regions : regions.dup; foreach (j; 0 .. regions.length) { auto new_ref_id = regions[j].ref_id; if (new_ref_id != -1) { auto old_ref_id = cast(uint)merger.ref_id_reverse_map[index][new_ref_id]; old_regions[j].ref_id = old_ref_id; } } return zip(reader.getReadsOverlapping(old_regions).multiBamReads(index), repeat(merger), repeat(index)); } // ([BamReader], SamHeaderMerger) -> [[(MultiBamRead, SamHeaderMerger, FileId)]] auto readRanges(BamReader[] readers, SamHeaderMerger merger) { return readers.zip(repeat(merger), iota(readers.length)) .map!(t => readRange(t[0], t[1], t[2]))(); } auto readRangeWithProgress (BamReader reader, SamHeaderMerger merger, FileId index, void delegate() f, void delegate(lazy float) u) { return zip(reader.readsWithProgress(u, f).multiBamReads(index), repeat(merger), repeat(index)); } auto readRangesWithProgress (BamReader[] readers, SamHeaderMerger merger, void delegate() f, void delegate(lazy float) delegate(size_t) u) { return readers.zip(repeat(merger), iota(readers.length)) .map!(t => readRangeWithProgress(t[0], t[1], t[2], f, u(t[2])))(); } // ([BamReader], SamHeaderMerger, int, uint, uint) -> // [[(MultiBamRead, SamHeaderMerger, FileId)]] auto readRanges(BamReader[] readers, SamHeaderMerger merger, int ref_id, uint start, uint end) { return readers.zip(repeat(merger), iota(readers.length), repeat(ref_id), repeat(start), repeat(end)) .map!(t => readRange(t[0], t[1], t[2], t[3], t[4], t[5]))(); } // ([BamReader], SamHeaderMerger, [BamRegion]) -> // [[(MultiBamRead, SamHeaderMerger, FileId)]) auto readRanges(BamReader[] readers, SamHeaderMerger merger, BamRegion[] regions) { return readers.zip(repeat(merger), iota(readers.length), repeat(regions)) .map!(t => readRange(t[0], t[1], t[2], t[3]))(); } // tweaks RG and PG tags, and reference sequence ID // [[(BamRead, SamHeaderMerger, size_t)]] -> [[MultiBamRead]] auto adjustTags(R)(R reads_with_aux_info, TaskPool pool, size_t bufsize) if (isInputRange!R) { alias R2 = typeof(pool.map!adjustTagsInRange(reads_with_aux_info.front, 1)); R2[] result; foreach (read_range; reads_with_aux_info) result ~= pool.map!adjustTagsInRange(read_range, bufsize); return result; } // (BamRead, SamHeaderMerger, size_t) -> (MultiBamRead, SamHeaderMerger) auto adjustTagsInRange(R)(R read_with_aux_info) if (!isInputRange!R) { auto read = read_with_aux_info[0]; auto merger = read_with_aux_info[1]; auto file_id = read_with_aux_info[2]; if (merger is null) { assert(file_id == 0); return tuple(read, merger); } with (merger) { assert(file_id < ref_id_map.length); auto old_ref_id = read.ref_id; if (old_ref_id != -1 && old_ref_id in ref_id_map[file_id]) { auto new_ref_id = to!int(ref_id_map[file_id][old_ref_id]); if (new_ref_id != old_ref_id) read.ref_id = new_ref_id; } auto program = read["PG"]; if (!program.is_nothing) { auto pg_str = *(cast(string*)(&program)); if (pg_str in program_id_map[file_id]) { auto new_pg = program_id_map[file_id][pg_str]; if (new_pg != pg_str) read["PG"] = new_pg; } } auto read_group = read["RG"]; if (!read_group.is_nothing) { auto rg_str = *(cast(string*)(&read_group)); if (rg_str in readgroup_id_map[file_id]) { auto new_rg = readgroup_id_map[file_id][rg_str]; if (new_rg != rg_str) read["RG"] = new_rg; } } } return tuple(read, merger); } /// class MultiBamReader { /// this(BamReader[] readers) { _readers = readers; enforce(_readers.length >= 1, "MultiBamReader requires at least one BAM file"); if (_readers.length > 1) { _merger = new SamHeaderMerger(readers.map!(r => r.header)().array()); enforce(_merger.strategy == SamHeaderMerger.Strategy.simple, "NYI"); // TODO auto n_references = _merger.merged_header.sequences.length; _reference_sequences = new ReferenceSequenceInfo[n_references]; size_t i; foreach (line; _merger.merged_header.sequences) { _reference_sequences[i] = ReferenceSequenceInfo(line.name, line.length); _reference_sequence_dict[line.name] = i++; } } // TODO: maybe try to guess optimal size, based on the number of files? setBufferSize(1_048_576); } /// this(string[] filenames) { this(filenames.map!(fn => new BamReader(fn))().array()); } /// this(string[] filenames, std.parallelism.TaskPool task_pool = taskPool) { this(filenames.zip(repeat(task_pool)) .map!(fn => new BamReader(fn[0], fn[1]))().array()); } /// BamReader[] readers() @property { return _readers; } /// SamHeader header() @property { return _readers.length > 1 ? _merger.merged_header : _readers[0].header; } /// Input range of MultiBamRead instances auto reads() @property { return readRanges(_readers, _merger).adjustTags(task_pool, _adj_bufsz) .nWayUnion!compare().map!"a[0]"(); } /// auto readsWithProgress(void delegate(lazy float p) progressBarFunc, void delegate() finishFunc=null) { size_t _running = _readers.length; void innerFinishFunc() { if (--_running == 0 && finishFunc) finishFunc(); } auto _progress = new float[_readers.length]; _progress[] = 0.0; auto _weights = _readers.map!(r => r.filename.getSize.to!float).array; normalize(_weights); auto innerProgressBarFunc(size_t idx) { return (lazy float p) { _progress[idx] = p; progressBarFunc(dotProduct(_progress, _weights)); }; } return readRangesWithProgress(_readers, _merger, &innerFinishFunc, &innerProgressBarFunc) .adjustTags(task_pool, _adj_bufsz) .nWayUnion!compare().map!"a[0]"(); } /// const(ReferenceSequenceInfo)[] reference_sequences() @property const nothrow { if (_readers.length > 1) return _reference_sequences; else return _readers[0].reference_sequences; } /** Check if reference named $(I ref_name) is presented in BAM header. */ bool hasReference(string ref_name) { if (_readers.length > 1) return null != (ref_name in _reference_sequence_dict); else return _readers[0].hasReference(ref_name); } /** Check if all BAM files have indices. */ bool has_index() @property { return readers.all!(b => b.has_index); } /** Returns reference sequence with id $(I ref_id). */ MultiBamReference reference(int ref_id) { enforce(ref_id >= 0, "Invalid reference index"); enforce(ref_id < reference_sequences.length, "Invalid reference index"); return MultiBamReference(_readers, _merger, task_pool, _adj_bufsz, reference_sequences[ref_id], ref_id); } /** Returns reference sequence named $(I ref_name). */ MultiBamReference opIndex(string ref_name) { enforce(hasReference(ref_name), "Reference with name " ~ ref_name ~ " does not exist"); if (_readers.length > 1) { auto ref_id = cast(int)_reference_sequence_dict[ref_name]; return reference(ref_id); } else { auto ref_id = _readers[0][ref_name].id; return reference(ref_id); } } /// Sets buffer size for all readers (default is 1MB) void setBufferSize(size_t bytes) { foreach (reader; _readers) reader.setBufferSize(bytes); } /** Requires coordinate sorting and presence of indices. */ auto getReadsOverlapping(BamRegion[] regions) { enforce(header.sorting_order == SortingOrder.coordinate, "Not all files are coordinate-sorted"); enforce(has_index, "Not all files are indexed"); auto ranges = readRanges(_readers, _merger, regions); return ranges.adjustTags(_task_pool, _adj_bufsz) .nWayUnion!compare().map!"a[0]"(); } private { BamReader[] _readers; SamHeaderMerger _merger; ReferenceSequenceInfo[] _reference_sequences; size_t[string] _reference_sequence_dict; TaskPool _task_pool; TaskPool task_pool() @property { if (_task_pool is null) _task_pool = taskPool; return _task_pool; } size_t _adj_bufsz = 512; } } /// struct MultiBamReference { private { BamReader[] _readers; SamHeaderMerger _merger; int _ref_id; ReferenceSequenceInfo _info; TaskPool _pool; size_t _adj_bufsz; } this(BamReader[] readers, SamHeaderMerger merger, TaskPool task_pool, size_t adj_bufsize, ReferenceSequenceInfo info, int ref_id) { _readers = readers; _merger = merger; _pool = task_pool; _adj_bufsz = adj_bufsize; _ref_id = ref_id; _info = info; } /// string name() @property const { return _info.name; } /// int length() @property const { return _info.length; } /// int id() @property const { return _ref_id; } /// Get alignments overlapping [start, end) region. /// $(BR) /// Coordinates are 0-based. auto opSlice(uint start, uint end) { enforce(start < end, "start must be less than end"); auto ranges = readRanges(_readers, _merger, id, start, end); return ranges.adjustTags(_pool, _adj_bufsz) .nWayUnion!compare().map!"a[0]"(); } /// auto opSlice() { return opSlice(0, length); } } BioD-0.1.0/bio/bam/pileup.d000066400000000000000000001050261273003163100153000ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2016 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// $(P This module is used for iterating over columns of alignment.) /// $(P The function makePileup is called on /// a range of coordinate-sorted reads mapped to the same reference. /// It returns an input range of columns.) /// $(P This returned range can then be iterated with $(D foreach). /// First column is located at the same position on the reference, /// as the first base of the first read. /// $(BR) /// Each $(D popFront) operation advances current position on the /// reference. The default behaviour is to exclude sites with zero coverage /// from the iteration.) /// $(P Each column keeps set of reads that overlap corresponding position /// on the reference. /// If reads contain MD tags, and makePileup was asked /// to use them, reference base at the column is also available.) /// $(BR) /// Each read preserves all standard read properties /// but also keeps column-related information, namely ///
    /// $(LI number of bases consumed from the read sequence so far) /// $(LI current CIGAR operation and offset in it) /// $(LI all CIGAR operations before and after current one)
/// $(BR) /// It is clear from the above that current CIGAR operation cannot be an insertion. /// The following are suggested ways to check for them: ///
    /// $(LI $(D cigar_after.length > 0 && /// cigar_operation_offset == cigar_operation.length - 1 && /// cigar_after[0].type == 'I')) /// $(LI $(D cigar_before.length > 0 && /// cigar_operation_offset == 0 && /// cigar_before[$ - 1].type == 'I'))
/// $(BR) /// Example: /// --------------------------------------------------------- /// import bio.bam.reader, bio.bam.pileup, std.stdio, std.algorithm : count; /// void main() { /// auto bam = new BamReader("file.bam"); // assume single reference and MD tags /// auto pileup = bam.reads().makePileup(useMD); /// foreach (column; pileup) { /// auto matches = column.bases.count(column.reference_base); /// if (matches < column.coverage * 2 / 3) /// writeln(column.position); // print positions of possible mismatches /// } /// } /// --------------------------------------------------------- module bio.bam.pileup; import bio.bam.read; import bio.bam.md.reconstruct; import bio.bam.splitter; import std.algorithm; import std.range; import std.random; import std.traits; import std.conv; import std.array; import std.exception; /// Represents a read aligned to a column struct PileupRead(Read=bio.bam.read.EagerBamRead) { Read read; /// alias read this; private alias read _read; /// Current CIGAR operation. One of 'M', '=', 'X', 'D', 'N. /// Use $(D cigar_after)/$(D cigar_before) to determine insertions. bio.bam.read.CigarOperation cigar_operation() @property const { return _cur_op; } /// Number of bases consumed from the current CIGAR operation. uint cigar_operation_offset() @property const { return _cur_op_offset; } /// CIGAR operations after the current operation const(bio.bam.read.CigarOperation)[] cigar_after() @property const { return _read.cigar[_cur_op_index + 1 .. $]; } /// CIGAR operations before the current operation const(bio.bam.read.CigarOperation)[] cigar_before() @property const { return _read.cigar[0 .. _cur_op_index]; } /// If current CIGAR operation is one of 'M', '=', or 'X', returns read base /// at the current column. Otherwise, returns '-'. char current_base() @property const { assert(_query_offset <= _read.sequence_length); if (_cur_op.is_query_consuming && _cur_op.is_reference_consuming) { return _read.sequence[_query_offset]; } else { return '-'; } } /// If current CIGAR operation is one of 'M', '=', or 'X', returns /// Phred-scaled read base quality at the current column. /// Otherwise, returns 255. ubyte current_base_quality() @property const { assert(_query_offset <= _read.sequence_length); if (_cur_op.is_query_consuming && _cur_op.is_reference_consuming) { return _read.base_qualities[_query_offset]; } else { return 255; } } /// Returns number of bases consumed from the read sequence. /// $(BR) /// More concisely, /// $(UL /// $(LI if current CIGAR operation is 'M', '=', or 'X', /// index of current read base in the read sequence) /// $(LI if current CIGAR operation is 'D' or 'N', /// index of read base after the deletion) /// ) /// (in both cases indices are 0-based) int query_offset() @property const { assert(_query_offset <= _read.sequence_length); return _query_offset; } /// Returns duplicate PileupRead dup() @property { PileupRead r = void; r._read = _read; // logically const, thus no .dup here r._cur_op_index = _cur_op_index; r._cur_op = _cur_op; r._cur_op_offset = _cur_op_offset; r._query_offset = _query_offset; return r; } private { // index of current CIGAR operation in _read.cigar uint _cur_op_index; // current CIGAR operation CigarOperation _cur_op; // number of bases consumed from the current CIGAR operation uint _cur_op_offset; // number of bases consumed from the read sequence uint _query_offset; this(Read read) { _read = read; // find first M/=/X/D operation auto cigar = _read.cigar; for (_cur_op_index = 0; _cur_op_index < cigar.length; ++_cur_op_index) { _cur_op = cigar[_cur_op_index]; if (_cur_op.is_reference_consuming) { if (_cur_op.type != 'N') { break; } } else if (_cur_op.is_query_consuming) { _query_offset += _cur_op.length; // skip S and I operations } } assertCigarIndexIsValid(); } // move one base to the right on the reference void incrementPosition() { ++_cur_op_offset; // if current CIGAR operation is D or N, query offset is untouched if (_cur_op.is_query_consuming) { ++_query_offset; } if (_cur_op_offset >= _cur_op.length) { _cur_op_offset = 0; // reset CIGAR operation offset auto cigar = _read.cigar; // get next reference-consuming CIGAR operation (M/=/X/D/N) for (++_cur_op_index; _cur_op_index < cigar.length; ++_cur_op_index) { _cur_op = cigar[_cur_op_index]; if (_cur_op.is_reference_consuming) { break; } if (_cur_op.is_query_consuming) { _query_offset += _cur_op.length; } } assertCigarIndexIsValid(); } } void assertCigarIndexIsValid() { assert(_cur_op_index < _read.cigar.length, "Invalid read " ~ _read.name ~ " - CIGAR " ~ _read.cigarString() ~ ", sequence " ~ to!string(_read.sequence)); } } } static assert(isBamRead!(PileupRead!BamRead)); //static assert(isBamRead!(PileupRead!(EagerBamRead!BamRead))); /// Represents a single pileup column struct PileupColumn(R) { private { ulong _position; int _ref_id = -1; R _reads; size_t _n_starting_here; } /// Reference base. 'N' if not available. char reference_base() @property const { return _reference_base; } private char _reference_base = 'N'; /// Coverage at this position (equals to number of reads) size_t coverage() const @property { return _reads.length; } /// Returns reference ID (-1 if unmapped) int ref_id() const @property { return _ref_id; } /// Position on the reference ulong position() const @property { return _position; } /// Reads overlapping the position, sorted by coordinate auto reads() @property { return assumeSorted!compareCoordinates(_reads[]); } /// Reads that have leftmost mapped position at this column auto reads_starting_here() @property { return _reads[$ - _n_starting_here .. $]; } /// Shortcut for map!(read => read.current_base)(reads) auto bases() @property { return map!"a.current_base"(reads); } /// Shortcut for map!(read => read.current_base_quality)(reads) auto base_qualities() @property { return map!"a.current_base_quality"(reads); } /// Shortcut for map!(read => read.mapping_quality)(reads) auto read_qualities() @property { return map!"a.mapping_quality"(reads); } } /** * The class for iterating reference bases together with reads overlapping them. */ class PileupRange(R, alias TColumn=PileupColumn) { alias Unqual!(ElementType!R) Raw; alias EagerBamRead!Raw Eager; alias PileupRead!Eager Read; alias Read[] ReadArray; alias TColumn!ReadArray Column; private { R _reads; Column _column; Appender!ReadArray _read_buf; bool _skip_zero_coverage; } protected { // This is extracted into a method not only to reduce duplication // (not so much of it), but to allow to override it! // For that reason it is not marked as final. Overhead of virtual // function is negligible compared to computations in EagerBamRead // constructor together with inserting new element into appender. void add(ref Raw read) { _read_buf.put(PileupRead!Eager(Eager(read))); } } /** * Create new pileup iterator from a range of reads. */ this(R reads, bool skip_zero_coverage) { _reads = reads; _read_buf = appender!ReadArray(); _skip_zero_coverage = skip_zero_coverage; if (!_reads.empty) { initNewReference(); // C++ programmers, don't worry! Virtual tables in D // are populated before constructor body is executed. } } /// Returns PileupColumn struct corresponding to the current position. ref Column front() @property { return _column; } /// Whether all reads have been processed. bool empty() @property { return _reads.empty && _read_buf.data.empty; } /// Move to next position on the reference. void popFront() { auto pos = ++_column._position; size_t survived = 0; auto data = _read_buf.data; for (size_t i = 0; i < data.length; ++i) { if (data[i].end_position > pos) { if (survived < i) { data[survived] = data[i]; } ++survived; } } for (size_t i = 0; i < survived; ++i) { data[i].incrementPosition(); } // unless range is empty, this value is _read_buf.shrinkTo(survived); _column._n_starting_here = 0; // updated either in initNewReference() // or in the loop below if (!_reads.empty) { if (_reads.front.ref_id != _column._ref_id && survived == 0) // processed all reads aligned to the previous reference { initNewReference(); } else { size_t n = 0; while (!_reads.empty && _reads.front.position == pos && _reads.front.ref_id == _column._ref_id) { auto read = _reads.front; add(read); _reads.popFront(); ++n; } _column._n_starting_here = n; // handle option of skipping sites with zero coverage if (survived == 0 && n == 0 && _skip_zero_coverage) { // the name might be misleading but it does the trick initNewReference(); } } } _column._reads = _read_buf.data; } protected void initNewReference() { auto read = _reads.front; _column._position = read.position; _column._ref_id = read.ref_id; uint n = 1; add(read); _reads.popFront(); while (!_reads.empty) { read = _reads.front; if (read.ref_id == _column.ref_id && read.position == _column._position) { add(read); ++n; _reads.popFront(); } else { break; } } _column._n_starting_here = n; _column._reads = _read_buf.data; } } /// Abstract pileup structure. S is type of column range. struct AbstractPileup(R, S) { private R reads_; R reads() @property { return reads_; } S columns; /// Pileup columns alias columns this; private { ulong _start_position; ulong _end_position; int _ref_id; } /// $(D start_from) parameter provided to a pileup function ulong start_position() @property const { return _start_position; } /// $(D end_at) parameter provided to a pileup function ulong end_position() @property const { return _end_position; } /// Reference ID of all reads in this pileup. int ref_id() @property const { return _ref_id; } } struct TakeUntil(alias pred, Range, Sentinel) if (isInputRange!Range) { private Range _input; private Sentinel _sentinel; bool _done; this(Range input, Sentinel sentinel) { _input = input; _sentinel = sentinel; _done = _input.empty || predSatisfied(); } @property bool empty() { return _done; } @property auto ref front() { return _input.front; } private bool predSatisfied() { return startsWith!pred(_input, _sentinel); } void popFront() { _input.popFront(); _done = _input.empty || predSatisfied(); } } auto takeUntil(alias pred, Range, Sentinel)(Range range, Sentinel sentinel) { return TakeUntil!(pred, Range, Sentinel)(range, sentinel); } auto pileupInstance(alias P, R)(R reads, ulong start_from, ulong end_at, bool skip_zero_coverage) { auto rs = filter!"a.basesCovered() > 0"(reads); while (!rs.empty) { auto r = rs.front; if (r.position + r.basesCovered() < start_from) { rs.popFront(); } else { break; } } int ref_id = -1; if (!rs.empty) { ref_id = rs.front.ref_id; } auto sameref_rs = takeUntil!"a.ref_id != b"(rs, ref_id); alias typeof(sameref_rs) ReadRange; PileupRange!ReadRange columns = new P!ReadRange(sameref_rs, skip_zero_coverage); while (!columns.empty) { auto c = columns.front; if (c.position < start_from) { columns.popFront(); } else { break; } } auto chopped = takeUntil!"a.position >= b"(columns, end_at); return AbstractPileup!(R, typeof(chopped))(reads, chopped, start_from, end_at, ref_id); } auto pileupColumns(R)(R reads, bool use_md_tag=false, bool skip_zero_coverage=true) { auto rs = filter!"a.basesCovered() > 0"(reads); alias typeof(rs) ReadRange; PileupRange!ReadRange columns; if (use_md_tag) { columns = new PileupRangeUsingMdTag!ReadRange(rs, skip_zero_coverage); } else { columns = new PileupRange!ReadRange(rs, skip_zero_coverage); } return columns; } /// Tracks current reference base final static class PileupRangeUsingMdTag(R) : PileupRange!(R, PileupColumn) { // The code is similar to that in reconstruct.d but here we can't make // an assumption about any particular read having non-zero length on reference. // current chunk of reference private alias typeof(_column._reads[].front) Read; private ReturnType!(dna!Read) _chunk; // end position of the current chunk on reference (assuming half-open interval) private uint _chunk_end_position; // next read from which we will extract reference chunk // // More precisely, // _next_chunk_provider = argmax (read => read.end_position) // {reads overlapping current column} private Read _next_chunk_provider; private bool _has_next_chunk_provider = false; // coverage at the previous location private ulong _prev_coverage; // we also track current reference ID private int _curr_ref_id = -1; /// this(R reads, bool skip_zero_coverage) { super(reads, skip_zero_coverage); } alias Unqual!(ElementType!R) Raw; // Checks length of the newly added read and tracks the read which // end position on the reference is the largest. // // When reconstructed reference chunk will become empty, next one will be // constructed from that read. This algorithm allows to minimize the number // of reads for which MD tag will be decoded. protected override void add(ref Raw read) { // the behaviour depends on whether a new contig starts here or not bool had_zero_coverage = _prev_coverage == 0; super.add(read); // get wrapped read auto _read = _read_buf.data.back; // if we've just moved to another reference sequence, do the setup if (_read.ref_id != _curr_ref_id) { _curr_ref_id = _read.ref_id; _has_next_chunk_provider = true; _next_chunk_provider = _read; return; } // two subsequent next_chunk_providers must overlap // unless (!) there was a region with zero coverage in-between if (_read.position > _chunk_end_position && !had_zero_coverage) { return; } // compare with previous candidate and replace if this one is better if (_read.end_position > _chunk_end_position) { if (!_has_next_chunk_provider) { _has_next_chunk_provider = true; _next_chunk_provider = _read; } else if (_read.end_position > _next_chunk_provider.end_position) { _next_chunk_provider = _read; } } } protected override void initNewReference() { _prev_coverage = 0; super.initNewReference(); if (_has_next_chunk_provider) { // prepare first chunk _chunk = dna(_next_chunk_provider); _chunk_end_position = _next_chunk_provider.end_position; _has_next_chunk_provider = false; _column._reference_base = _chunk.front; _chunk.popFront(); } else { _column._reference_base = 'N'; } } /// override void popFront() { if (!_chunk.empty) { // update current reference base _column._reference_base = _chunk.front; _chunk.popFront(); } else { _column._reference_base = 'N'; } // update _prev_coverage _prev_coverage = _column.coverage; // the order is important - maybe we will obtain new next_chunk_provider // during this call to popFront() super.popFront(); // If we have consumed the whole current chunk, // we need to obtain the next one if it's possible. if (_chunk.empty && _has_next_chunk_provider) { _chunk = dna(_next_chunk_provider); debug { /* import std.stdio; writeln(); writeln("position: ", _next_chunk_provider.position); writeln("next chunk: ", to!string(_chunk)); */ } _chunk_end_position = _next_chunk_provider.end_position; _has_next_chunk_provider = false; _chunk.popFrontN(cast(size_t)(_column.position - _next_chunk_provider.position)); _column._reference_base = _chunk.front; _chunk.popFront(); } } } /// Creates a pileup range from a range of reads. /// Note that all reads must be aligned to the same reference. /// /// See $(D PileupColumn) documentation for description of range elements. /// Note also that you can't use $(D std.array.array()) function on pileup /// because it won't make deep copies of underlying data structure. /// (One might argue that in this case it would be better to use opApply, /// but typically one would use $(D std.algorithm.map) on pileup columns /// to obtain some numeric characteristics.) /// /// Params: /// use_md_tag = if true, use MD tag together with CIGAR /// to recover reference bases /// /// start_from = position from which to start /// /// end_at = position before which to stop /// /// $(BR) /// That is, the range of positions is half-open interval /// $(BR) /// [max(start_from, first mapped read start position), /// $(BR) /// min(end_at, last mapped end position among all reads)) /// /// skip_zero_coverage = if true, skip sites with zero coverage /// auto makePileup(R)(R reads, bool use_md_tag=false, ulong start_from=0, ulong end_at=ulong.max, bool skip_zero_coverage=true) { if (use_md_tag) { return pileupInstance!PileupRangeUsingMdTag(reads, start_from, end_at, skip_zero_coverage); } else { return pileupInstance!PileupRange(reads, start_from, end_at, skip_zero_coverage); } } /// Allows to express the intention clearer. enum useMD = true; unittest { import std.algorithm; import std.range; import std.array; // the set of reads below was taken from 1000 Genomes BAM file // NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20101123.bam // (region 20:1127810-1127819) auto readnames = array(iota(10).map!(i => "r" ~ to!string(i))()); auto sequences = ["ATTATGGACATTGTTTCCGTTATCATCATCATCATCATCATCATCATTATCATC", "GACATTGTTTCCGTTATCATCATCATCATCATCATCATCATCATCATCATCATC", "ATTGTTTCCGTTATCATCATCATCATCATCATCATCATCATCATCATCATCACC", "TGTTTCCGTTATCATCATCATCATCATCATCATCATCATCATCATCATCACCAC", "TCCGTTATCATCATCATCATCATCATCATCATCATCATCATCATCACCACCACC", "GTTATCATCATCATCATCATCATCATCATCATCATCATCATCATCGTCACCCTG", "TCATCATCATCATAATCATCATCATCATCATCATCATCGTCACCCTGTGTTGAG", "TCATCATCATCGTCACCCTGTGTTGAGGACAGAAGTAATTTCCCTTTCTTGGCT", "TCATCATCATCATCACCACCACCACCCTGTGTTGAGGACAGAAGTAATATCCCT", "CACCACCACCCTGTGTTGAGGACAGAAGTAATTTCCCTTTCTTGGCTGGTCACC"]; // multiple sequence alignment: // *** // ATTATGGACATTGTTTCCGTTATCATCATCATCATCATCATCATCATTATCATC // GACATTGTTTCCGTTATCATCATCATCATCATCATCATCATCATCATCATCAT---C // ATTGTTTCCGTTATCATCATCATCATCATCATCATCATCATCATCATCATCACC // TGTTTCCGTTATCATCATCATCATCATCATCATCATCATCATCATCAT---CACCAC // TCCGTTATCATCATCATCATCATCATCATCATCATCATCATCAT---CACCACCACC // GTTATCATCATCATCATCATCATCATCATCATCATCATCAT---CATCGTCACCCTG // ATCATCATCATAATCATCATCATCATCATCAT---CATCGTCACCCTGTGTTGAG // TCATCATCATCGTCAC------------------CCTGTGTTGAGGACAGAAGTAATTTCCCTTTCTTGGCT // TCATCATCATCATCACCACCACCACCCTGTGTTGAGGACAGAAGTAATATCCCT // ---CACCACCACCCTGTGTTGAGGACAGAAGTAATTTCCCTTTCTTGGCTGGTCACC // * * * * * * * * * * // 760 770 780 790 800 810 820 830 840 850 auto cigars = [[CigarOperation(54, 'M')], [CigarOperation(54, 'M')], [CigarOperation(50, 'M'), CigarOperation(3, 'I'), CigarOperation(1, 'M')], [CigarOperation(54, 'M')], [CigarOperation(54, 'M')], [CigarOperation(54, 'M')], [CigarOperation(2, 'S'), CigarOperation(52, 'M')], [CigarOperation(16, 'M'), CigarOperation(15, 'D'), CigarOperation(38, 'M')], [CigarOperation(13, 'M'), CigarOperation(3, 'I'), CigarOperation(38, 'M')], [CigarOperation(54, 'M')]]; auto positions = [758, 764, 767, 769, 773, 776, 785, 795, 804, 817]; auto md_tags = ["47C6", "54", "51", "50T3", "46T7", "45A0C7", "11C24A0C14", "11A3T0^CATCATCATCACCAC38", "15T29T5", "2T45T5"]; BamRead[] reads = new BamRead[10]; foreach (i; iota(10)) { reads[i] = BamRead(readnames[i], sequences[i], cigars[i]); reads[i].position = positions[i]; reads[i].ref_id = 0; reads[i]["MD"] = md_tags[i]; } auto first_read_position = reads.front.position; auto reference = to!string(dna(reads)); import std.stdio; writeln("Testing pileup (low-level aspects)..."); auto pileup = makePileup(reads, true, 796, 849, false); auto pileup2 = makePileup(reads, true, 0, ulong.max, false); assert(pileup.front.position == 796); assert(pileup.start_position == 796); assert(pileup.end_position == 849); while (pileup2.front.position != 796) { pileup2.popFront(); } while (!pileup.empty) { auto column = pileup.front; auto column2 = pileup2.front; assert(column.coverage == column2.coverage); pileup2.popFront(); // check that DNA is built correctly from MD tags and CIGAR assert(column.reference_base == reference[cast(size_t)(column.position - first_read_position)]); switch (column.position) { case 796: assert(equal(column.bases, "CCCCCCAC")); pileup.popFront(); break; case 805: assert(equal(column.bases, "TCCCCCCCC")); pileup.popFront(); break; case 806: assert(equal(column.bases, "AAAAAAAGA")); pileup.popFront(); break; case 810: // last read is not yet fetched by pileup engine assert(column.reads[column.coverage - 2].cigar_after.front.type == 'D'); pileup.popFront(); break; case 817: assert(column.reads[column.coverage - 2].cigar_before.back.type == 'I'); pileup.popFront(); break; case 821: assert(column.reads[column.coverage - 3].cigar_operation.type == 'D'); assert(equal(column.bases, "AAGG-AA")); pileup.popFront(); break; case 826: assert(equal(column.bases, "CCCCCC")); pileup.popFront(); break; case 849: assert(equal(column.bases, "TAT")); pileup.popFront(); assert(pileup.empty); break; default: pileup.popFront(); break; } } // another set of reads, the same file, region 20:12360032-12360050 // test the case when reference has some places with zero coverage reads = [BamRead("r1", "CCCACATAGAAAGCTTGCTGTTTCTCTGTGGGAAGTTTTAACTTAGGTCAGCTT", [CigarOperation(54, 'M')]), BamRead("r2", "TAGAAAGCTTGCTGTTTCTCTGTGGGAAGTTTTAACTTAGGTTAGCTTCATCTA", [CigarOperation(54, 'M')]), BamRead("r3", "TTTTTCTTTCTTTCTTTGAAGAAGGCAGATTCCTGGTCCTGCCACTCAAATTTT", [CigarOperation(54, 'M')]), BamRead("r4", "TTTCTTTCTTTCTTTGAAGAAGGCAGATTCCTGGTCCTGCCACTCAAATTTTCA", [CigarOperation(54, 'M')])]; reads[0].position = 979; reads[0]["MD"] = "54"; reads[0].ref_id = 0; reads[1].position = 985; reads[1]["MD"] = "42C7C3"; reads[1].ref_id = 0; reads[2].position = 1046; reads[2]["MD"] = "54"; reads[2].ref_id = 0; reads[3].position = 1048; reads[3]["MD"] = "54"; reads[3].ref_id = 0; assert(equal(dna(reads), map!(c => c.reference_base)(makePileup(reads, true, 0, ulong.max, false)))); } struct PileupChunkRange(C) { private C _chunks; private ElementType!C _prev_chunk; private ElementType!C _current_chunk; private bool _empty; private ulong _beg = 0; private bool _use_md_tag; private ulong _start_from; private ulong _end_at; this(C chunks, bool use_md_tag, ulong start_from, ulong end_at) { _chunks = chunks; _use_md_tag = use_md_tag; _start_from = start_from; _end_at = end_at; while (true) { if (_chunks.empty) { _empty = true; } else { _current_chunk = _chunks.front; _chunks.popFront(); if (_current_chunk[0].ref_id < 0) continue; _beg = _current_chunk[0].position; if (_beg >= end_at) { _empty = true; break; } auto last_read = _current_chunk[$-1]; if (last_read.position + last_read.basesCovered() > start_from) { break; } } } } bool empty() @property { return _empty; } auto front() @property { auto end_pos = _current_chunk[$-1].position; if (_chunks.empty || _chunks.front[0].ref_id != _current_chunk[$-1].ref_id) end_pos += _current_chunk[$-1].basesCovered(); return makePileup(chain(_prev_chunk, _current_chunk), _use_md_tag, max(_beg, _start_from), min(end_pos, _end_at)); } void popFront() { _prev_chunk = _current_chunk; while (true) { if (_chunks.empty) { _empty = true; return; } _current_chunk = _chunks.front; _chunks.popFront(); if (_current_chunk[0].ref_id >= 0) break; } // if we changed reference, nullify prev_chunk if (_prev_chunk.length > 0 && _prev_chunk[$ - 1].ref_id == _current_chunk[0].ref_id) { _beg = _prev_chunk[$-1].position; } else { _beg = _current_chunk[0].position; _prev_chunk.length = 0; } // keep only those reads in _prev_chunk that have overlap with the last one // 1) estimate read length enum sampleSize = 15; int[sampleSize] buf = void; int read_length = void; if (_prev_chunk.length <= sampleSize) { for (size_t k = 0; k < _prev_chunk.length; ++k) { buf[k] = _prev_chunk[k].sequence_length; } topN(buf[0.._prev_chunk.length], _prev_chunk.length / 2); read_length = buf[_prev_chunk.length / 2]; } else { size_t i = 0; foreach (read; randomSample(_prev_chunk, sampleSize)) buf[i++] = read.sequence_length; topN(buf[], sampleSize / 2); read_length = buf[sampleSize / 2]; debug { import std.stdio; stderr.writeln("[pileupChunks] read_length=", read_length); } } // 2) do binary search for those reads that start from (_beg - 2 * read_length) // (it's an experimental fact that almost none of reads consumes that much // on a reference sequence) auto pos = _beg - 2 * read_length; long i = 0; long j = _prev_chunk.length - 1; // positions of _prev_chunk[0 .. i] are less than pos, // positions of _prev_chunk[j + 1 .. $] are more or equal to pos. while (i <= j) { auto m = cast(size_t)(i + j) / 2; assert(m < _prev_chunk.length); auto p = _prev_chunk[m].position; if (p >= pos) { j = m - 1; } else { i = m + 1; } } _prev_chunk = _prev_chunk[cast(size_t)i .. $]; } } /// This function constructs range of non-overlapping consecutive pileups from a range of reads /// so that these pileups can be processed in parallel. /// /// It's allowed to pass ranges of sorted reads with different ref. IDs, /// they won't get mixed in any chunk. /// /// Params: /// use_md_tag = recover reference bases from MD tag and CIGAR /// /// block_size = approximate amount of memory that each pileup will consume, /// given in bytes. (Usually consumption will be a bit higher.) /// /// start_from = position of the first column of the first chunk /// /// end_at = position after the last column of the last chunk /// /// $(BR) /// WARNING: block size should be big enough so that every block will share /// some reads only with adjacent blocks. /// $(BR) /// As such, it is not recommended to reduce the $(I block_size). /// But there might be a need to increase it in case of very high coverage. auto pileupChunks(R)(R reads, bool use_md_tag=false, size_t block_size=16_384_000, ulong start_from=0, ulong end_at=ulong.max) { auto chunks = chunksConsumingLessThan(reads, block_size); return PileupChunkRange!(typeof(chunks))(chunks, use_md_tag, start_from, end_at); } BioD-0.1.0/bio/bam/randomaccessmanager.d000066400000000000000000000372331273003163100200030ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2014 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** Module for random access operations on BAM file. */ module bio.bam.randomaccessmanager; import bio.bam.constants; import bio.bam.reader; import bio.bam.read; import bio.bam.readrange; import bio.bam.baifile; import bio.bam.region; import bio.core.utils.algo; import bio.core.bgzf.block; import bio.core.bgzf.virtualoffset; import bio.core.bgzf.inputstream; import bio.core.bgzf.constants; import bio.core.bgzf.chunk; import bio.core.utils.range; import bio.core.utils.stream; import std.system; import std.algorithm; import std.array; import std.range; import std.traits; import std.exception; import std.container; import std.parallelism; debug { import std.stdio; } private { auto nonOverlappingChunks(R)(R chunks) { static ref auto chunkB(ref Chunk chunk) { return chunk.beg; } static ref auto chunkE(ref Chunk chunk) { return chunk.end; } return nonOverlapping!(chunkB, chunkE)(chunks); } } /// Class which random access tasks are delegated to. class RandomAccessManager { void setCache(BgzfBlockCache cache) { _cache = cache; } void setTaskPool(TaskPool task_pool) { _task_pool = task_pool; } void setBufferSize(size_t buffer_size) { _buffer_size = buffer_size; } /// Constructs new manager for BAM file this(string filename) { _filename = filename; } /// ditto this(BamReader reader) { _reader = reader; _filename = reader.filename; } /// Constructs new manager with given index file. /// This allows to do random-access interval queries. /// /// Params: /// filename = location of BAM file /// bai = index file this(string filename, ref BaiFile bai) { _filename = filename; _bai = bai; _found_index_file = true; } /// ditto this(BamReader reader, ref BaiFile bai) { _reader = reader; _filename = reader.filename; _bai = bai; _found_index_file = true; } /// If file ends with EOF block, returns virtual offset of the start of EOF block. /// Otherwise, returns virtual offset of the physical end of file. VirtualOffset eofVirtualOffset() const { ulong file_offset = std.file.getSize(_filename); if (hasEofBlock()) { return VirtualOffset(file_offset - BAM_EOF.length, 0); } else { return VirtualOffset(file_offset, 0); } } /// Returns true if the file ends with EOF block, and false otherwise. bool hasEofBlock() const { auto _stream = new bio.core.utils.stream.File(_filename); if (_stream.size < BAM_EOF.length) { return false; } ubyte[BAM_EOF.length] buf; _stream.seekEnd(-cast(int)BAM_EOF.length); _stream.readExact(&buf, BAM_EOF.length); if (buf != BAM_EOF) { return false; } return true; } /// Get new BgzfInputStream starting from specified virtual offset. BgzfInputStream createStreamStartingFrom(VirtualOffset offset) { auto _stream = new bio.core.utils.stream.File(_filename); auto _compressed_stream = new EndianStream(_stream, Endian.littleEndian); _compressed_stream.seekSet(cast(size_t)(offset.coffset)); auto supplier = new StreamSupplier(_compressed_stream, offset.uoffset); auto bgzf_stream = new BgzfInputStream(supplier, _task_pool, _cache); return bgzf_stream; } /// Get single read at a given virtual offset. /// Every time new stream is used. BamRead getReadAt(VirtualOffset offset) { auto stream = createStreamStartingFrom(offset); bool old_mode = _reader._seqprocmode; _reader._seqprocmode = true; auto read = bamReadRange(stream, _reader).front.dup; _reader._seqprocmode = old_mode; return read; } /// Get BGZF block at a given offset. BgzfBlock getBgzfBlockAt(ulong offset) { auto fstream = new bio.core.utils.stream.File(_filename); auto stream = new EndianStream(fstream, Endian.littleEndian); stream.seekSet(offset); BgzfBlock block = void; ubyte[BGZF_MAX_BLOCK_SIZE] buf = void; fillBgzfBufferFromStream(stream, true, &block, buf.ptr); block._buffer = block._buffer.dup; return block; } /// Get reads between two virtual offsets. First virtual offset must point /// to a start of an alignment record. auto getReadsBetween(VirtualOffset from, VirtualOffset to) { auto stream = createStreamStartingFrom(from); static bool offsetTooBig(BamReadBlock record, VirtualOffset vo) { return record.end_virtual_offset > vo; } return until!offsetTooBig(bamReadRange!withOffsets(stream, _reader), to); } bool found_index_file() @property const { return _found_index_file; } private bool _found_index_file = false; // overwritten in constructor if filename is provided /// BAI file ref const(BaiFile) getBai() const { enforce(found_index_file, "BAM index file (.bai) must be provided"); return _bai; } private void checkIndexExistence() { enforce(found_index_file, "BAM index file (.bai) must be provided"); } private void checkRefId(uint ref_id) { enforce(ref_id < _bai.indices.length, "Invalid reference sequence index"); } private void appendChunks(ref Chunk[] chunks, Bin bin, VirtualOffset min_offset) { foreach (chunk; bin.chunks) { if (chunk.end > min_offset) { chunks ~= chunk; // optimization if (chunks[$-1].beg < min_offset) chunks[$-1].beg = min_offset; } } } /// Get BAI chunks containing all alignment records overlapping the region Chunk[] getChunks(BamRegion region) { auto ref_id = region.ref_id; auto beg = region.start; auto end = region.end; checkIndexExistence(); checkRefId(ref_id); // Select all bins that overlap with [beg, end). // Then from such bins select all chunks that end to the right of min_offset. // Sort these chunks by leftmost coordinate and remove all overlaps. auto min_offset = _bai.indices[ref_id].getMinimumOffset(beg); Chunk[] bai_chunks; foreach (b; _bai.indices[ref_id].bins) { if (!b.canOverlapWith(beg, end)) continue; appendChunks(bai_chunks, b, min_offset); } sort(bai_chunks); return bai_chunks.nonOverlappingChunks().array(); } // regions should be from the same reference sequence private Chunk[] getGroupChunks(BamRegion[] regions) { auto bitset = Array!bool(); enforce(regions.length > 0); bitset.length = BAI_MAX_BIN_ID; bitset[0] = true; foreach (region; regions) { auto beg = region.start; auto end = region.end; int i = 0, k; enforce(beg < end); --end; for (k = 1 + (beg>>26); k <= 1 + (end>>26); ++k) bitset[k] = true; for (k = 9 + (beg>>23); k <= 9 + (end>>23); ++k) bitset[k] = true; for (k = 73 + (beg>>20); k <= 73 + (end>>20); ++k) bitset[k] = true; for (k = 585 + (beg>>17); k <= 585 + (end>>17); ++k) bitset[k] = true; for (k = 4681 + (beg>>14); k <= 4681 + (end>>14); ++k) bitset[k] = true; } auto ref_id = regions.front.ref_id; checkIndexExistence(); checkRefId(ref_id); // Select all bins that overlap with [beg, end). // Then from such bins select all chunks that end to the right of min_offset. // Sort these chunks by leftmost coordinate and remove all overlaps. auto min_offset = _bai.indices[ref_id].getMinimumOffset(regions.front.start); version(extraVerbose) { import std.stdio; stderr.writeln("min offset = ", min_offset); } Chunk[] bai_chunks; auto bins = _bai.indices[ref_id].bins; foreach (bin; bins) if (bitset[bin.id]) appendChunks(bai_chunks, bin, min_offset); sort(bai_chunks); version(extraVerbose) { stderr.writeln("[chunks before normalization]"); foreach(chunk; bai_chunks) stderr.writeln(chunk.beg, " - ", chunk.end); } return bai_chunks.nonOverlappingChunks().array(); } private auto filteredReads(alias IteratePolicy)(BamRegion[] regions) { auto chunks = getGroupChunks(regions); version(extraVerbose) { import std.stdio; stderr.writeln("[chunks]"); foreach (chunk; chunks) stderr.writeln(chunk.beg, " - ", chunk.end); } auto reads = readsFromChunks!IteratePolicy(chunks); return filterBamReads(reads, regions); } /// Fetch alignments with given reference sequence id, overlapping [beg..end) auto getReads(alias IteratePolicy=withOffsets)(BamRegion region) { auto chunks = getChunks(region); auto reads = readsFromChunks!IteratePolicy(chunks); return filterBamReads(reads, [region]); } auto getReads(alias IteratePolicy=withOffsets)(BamRegion[] regions) { auto sorted_regions = regions.sort(); BamRegion[][] regions_by_ref; // TODO: replace with groupBy once it's included into Phobos uint last_ref_id = uint.max; foreach (region; sorted_regions) { if (region.ref_id == last_ref_id) { regions_by_ref.back ~= region; } else { regions_by_ref ~= [region]; last_ref_id = region.ref_id; } } static ref auto regB(ref BamRegion region) { return region.start; } static ref auto regE(ref BamRegion region) { return region.end; } foreach (ref group; regions_by_ref) group = nonOverlapping!(regB, regE)(group).array(); return regions_by_ref.zip(repeat(this)) .map!(gt => gt[1].filteredReads!IteratePolicy(gt[0]))() .joiner(); } private: auto readsFromChunks(alias IteratePolicy, R)(R chunks) { auto fstream = new bio.core.utils.stream.File(_filename); auto compressed_stream = new EndianStream(fstream, Endian.littleEndian); auto supplier = new StreamChunksSupplier(compressed_stream, chunks); auto stream = new BgzfInputStream(supplier, _task_pool, _cache); return bamReadRange!IteratePolicy(stream, _reader); } string _filename; BaiFile _bai; BamReader _reader; TaskPool _task_pool; size_t _buffer_size; BgzfBlockCache _cache; TaskPool task_pool() @property { if (_task_pool is null) _task_pool = taskPool; return _task_pool; } public: static struct BamReadFilter(R) { this(R r, BamRegion[] regions) { _range = r; _regions = regions; enforce(regions.length > 0); _region = _regions.front; _ref_id = _region.ref_id; // assumed to be constant findNext(); } bool empty() @property { return _empty; } ElementType!R front() @property { return _current_read; } void popFront() { _range.popFront(); findNext(); } private: R _range; uint _ref_id; BamRegion _region; BamRegion[] _regions; // non-overlapping and sorted bool _empty; ElementType!R _current_read; void findNext() { if (_regions.empty || _range.empty) { _empty = true; return; } while (!_range.empty) { _current_read = _range.front; // BamReads are sorted first by ref. ID. auto current_ref_id = cast(uint)_current_read.ref_id; // ref_id can't be -1 unless the index is fucked up if (current_ref_id > _ref_id) { // no more records for this _ref_id _empty = true; return; } else if (current_ref_id < _ref_id) { // skip reads referring to sequences // with ID less than ours _range.popFront(); continue; } if (_current_read.position >= _region.end) { // As reads are sorted by leftmost coordinate, // all remaining alignments in _range // will not overlap the current interval as well. // // [-----) // . [-----------) // . [---) // . [-------) // . [-) // [beg ..... end) _regions.popFront(); // TODO: potentially binary search may be faster, // but it needs to be checked if (_regions.empty) { _empty = true; return; } else { _region = _regions.front; continue; } } if (_current_read.position > _region.start) { return; // definitely overlaps } if (_current_read.position + _current_read.basesCovered() <= _region.start) { /// ends before beginning of the region /// [-----------) /// [beg .......... end) _range.popFront(); /// Zero-length reads are also considered non-overlapping, /// so for consistency the inequality 12 lines above is strict. } else { return; /// _current_read overlaps the region } } _empty = true; } } // Get range of alignments sorted by leftmost coordinate, // together with an interval [beg, end), // and return another range of alignments which overlap the region. static auto filterBamReads(R)(R r, BamRegion[] regions) { return BamReadFilter!R(r, regions); } } BioD-0.1.0/bio/bam/read.d000066400000000000000000001671411273003163100147230ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2016 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// $(P $(D BamRead) type provides convenient interface for working with SAM/BAM records.) /// /// $(P All flags, tags, and fields can be accessed and modified.) /// /// Examples: /// --------------------------- /// import std.conv; /// ... /// assert(!read.is_unmapped); // check flag /// assert(read.ref_id != -1); // access field /// /// int edit_distance = to!int(read["NM"]); // access tag /// read["NM"] = 0; // modify tag /// read["NM"] = null; // remove tag /// read["NM"] = null; // no-op /// /// foreach (tag, value; read) // iterate over tags /// writeln(tag, " ", value); // and print their keys and values /// /// read.sequence = "AGCAGACTACGTGTGCATAC"; // sets base qualities to 255 /// assert(read.base_qualities[0] == 255); /// read.is_unmapped = true; // set flag /// read.ref_id = -1; // set field /// --------------------------- module bio.bam.read; import bio.core.base; import bio.core.utils.format; import bio.bam.abstractreader; import bio.bam.writer; import bio.bam.tagvalue; import bio.bam.bai.bin; import bio.bam.md.core; import bio.bam.utils.array; import bio.bam.utils.value; import bio.core.utils.switchendianness; import bio.bam.thirdparty.msgpack : Packer, unpack; import std.algorithm; import std.range; import std.conv; import std.format; import std.exception; import std.system; import std.traits; import std.array; import std.c.stdlib; /** Represents single CIGAR operation */ struct CigarOperation { static assert(CigarOperation.sizeof == uint.sizeof); /* WARNING! It is very essential that the size of this struct is EXACTLY equal to uint.sizeof! The reason is to avoid copying of arrays during alignment parsing. Namely, when some_pointer points to raw cigar data, we can just do a cast. This allows to access those data directly, not doing any memory allocations. */ private uint raw; // raw data from BAM private static ubyte char2op(char c) { switch(c) { case 'M': return 0; case 'I': return 1; case 'D': return 2; case 'N': return 3; case 'S': return 4; case 'H': return 5; case 'P': return 6; case '=': return 7; case 'X': return 8; default: return 15; // 15 is used as invalid value } } /// Length must be strictly less than 2^28. /// $(BR) /// Operation type must be one of M, I, D, N, S, H, P, =, X. this(uint length, char operation_type) { enforce(length < (1<<28), "Too big length of CIGAR operation"); raw = (length << 4) | char2op(operation_type); } /// Operation length uint length() @property const nothrow { return raw >> 4; } /// CIGAR operation as one of MIDNSHP=X. /// Absent or invalid operation is represented by '?' char type() @property const nothrow { return "MIDNSHP=X????????"[raw & 0xF]; } // Each pair of bits has first bit set iff the operation is query consuming, // and second bit set iff it is reference consuming. // X = P H S N D I M private static immutable uint CIGAR_TYPE = 0b11_11_00_00_01_10_10_01_11; /// True iff operation is one of M, =, X, I, S bool is_query_consuming() @property const { return ((CIGAR_TYPE >> ((raw & 0xF) * 2)) & 1) != 0; } /// True iff operation is one of M, =, X, D, N bool is_reference_consuming() @property const { return ((CIGAR_TYPE >> ((raw & 0xF) * 2)) & 2) != 0; } /// True iff operation is one of M, =, X bool is_match_or_mismatch() @property const { return ((CIGAR_TYPE >> ((raw & 0xF) * 2)) & 3) == 3; } /// True iff operation is one of 'S', 'H' bool is_clipping() @property const { return ((raw & 0xF) >> 1) == 2; // 4 or 5 } private void toSam(Sink)(auto ref Sink sink) const if (isSomeSink!Sink) { sink.write(length); sink.write(type); } void toString(scope void delegate(const(char)[]) sink) const { toSam(sink); } } /// Forward range of extended CIGAR operations, with =/X instead of M /// Useful for, e.g., detecting positions of mismatches. struct ExtendedCigarRange(CigarOpRange, MdOpRange) { static assert(isInputRange!CigarOpRange && is(Unqual!(ElementType!CigarOpRange) == CigarOperation)); static assert(isInputRange!MdOpRange && is(Unqual!(ElementType!MdOpRange) == MdOperation)); private { CigarOpRange _cigar; MdOpRange _md_ops; CigarOperation _front_cigar_op; MdOperation _front_md_op; uint _n_mismatches; bool _empty; } /// this(CigarOpRange cigar, MdOpRange md_ops) { _cigar = cigar; _md_ops = md_ops; fetchNextCigarOp(); fetchNextMdOp(); } /// Forward range primitives bool empty() @property const { return _empty; } /// ditto CigarOperation front() @property { debug { import std.stdio; writeln(_front_cigar_op, " - ", _front_md_op); } if (_front_cigar_op.type != 'M') return _front_cigar_op; if (_n_mismatches == 0) { assert(_front_md_op.is_match); uint len = min(_front_md_op.match, _front_cigar_op.length); return CigarOperation(len, '='); } assert(_front_md_op.is_mismatch); return CigarOperation(min(_n_mismatches, _front_cigar_op.length), 'X'); } /// ditto ExtendedCigarRange save() @property { typeof(return) r = void; r._cigar = _cigar.save; r._md_ops = _md_ops.save; r._front_cigar_op = _front_cigar_op; r._front_md_op = _front_md_op; r._n_mismatches = _n_mismatches; r._empty = _empty; return r; } /// ditto void popFront() { if (!_front_cigar_op.is_match_or_mismatch) { if (_front_cigar_op.is_reference_consuming) fetchNextMdOp(); fetchNextCigarOp(); return; } auto len = _front_cigar_op.length; if (_n_mismatches > 0) { enforce(_front_md_op.is_mismatch); if (len > _n_mismatches) { _front_cigar_op = CigarOperation(len - _n_mismatches, 'M'); _n_mismatches = 0; fetchNextMdOp(); } else if (len < _n_mismatches) { _n_mismatches -= len; fetchNextCigarOp(); } else { fetchNextCigarOp(); fetchNextMdOp(); } } else { enforce(_front_md_op.is_match); auto n_matches = _front_md_op.match; if (len > n_matches) { _front_cigar_op = CigarOperation(len - n_matches, 'M'); fetchNextMdOp(); } else if (len < n_matches) { _front_md_op.match -= len; fetchNextCigarOp(); } else { fetchNextCigarOp(); fetchNextMdOp(); } } } private { void fetchNextCigarOp() { if (_cigar.empty) { _empty = true; return; } _front_cigar_op = _cigar.front; _cigar.popFront(); } void fetchNextMdOp() { if (_md_ops.empty) return; _n_mismatches = 0; _front_md_op = _md_ops.front; _md_ops.popFront(); if (_front_md_op.is_mismatch) { _n_mismatches = 1; while (!_md_ops.empty && _md_ops.front.is_mismatch) { _md_ops.popFront(); _n_mismatches += 1; } } } } } auto makeExtendedCigar(CigarOpRange, MdOpRange)(CigarOpRange cigar, MdOpRange md_ops) { return ExtendedCigarRange!(CigarOpRange, MdOpRange)(cigar, md_ops); } /** BAM record representation. */ struct BamRead { mixin TagStorage; /// Reference index in BAM file header @property int ref_id() const nothrow { return _refID; } /// ditto @property void ref_id(int n) { _dup(); _refID = n; } /// Reference sequence name ('*' for unmapped reads) @property string ref_name() const nothrow { return _ref_id_to_string(ref_id); } /// 0-based leftmost coordinate of the first matching base @property int position() const nothrow { return _pos; } /// ditto @property void position(int n) { _dup(); _pos = n; _recalculate_bin(); } /// Indexing bin which this read belongs to. Recalculated when position is changed. @property bio.bam.bai.bin.Bin bin() const nothrow { return Bin(_bin); } /// Mapping quality. Equals to 255 if not available, otherwise /// equals to rounded -10 * log10(P {mapping position is wrong}). @property ubyte mapping_quality() const nothrow { return _mapq; } /// ditto @property void mapping_quality(ubyte n) { _dup(); _mapq = n; } /// Flag bits (should be used on very rare occasions, see flag getters/setters below) @property ushort flag() const nothrow { return _flag; } /// ditto @property void flag(ushort n) { _dup(); _flag = n; } /// Sequence length. In fact, sequence.length can be used instead, but that might be /// slower if the compiler is not smart enough to optimize away unrelated stuff. @property int sequence_length() const nothrow { return _l_seq; } /// Mate reference ID @property int mate_ref_id() const nothrow { return _next_refID; } /// ditto @property void mate_ref_id(int n) { _dup(); _next_refID = n; } /// Mate reference sequence name ('*' for unmapped mates) @property string mate_ref_name() const nothrow { return _ref_id_to_string(_next_refID); } /// Mate position @property int mate_position() const nothrow { return _next_pos; } /// ditto @property void mate_position(int n) { _dup(); _next_pos = n; } /// Template length @property int template_length() const nothrow { return _tlen; } /// ditto @property void template_length(int n) { _dup(); _tlen = n; } // ------------------------ FLAG GETTERS/SETTERS -------------------------------------- // /// Template having multiple segments in sequencing @property bool is_paired() const nothrow { return cast(bool)(flag & 0x1); } /// ditto @property void is_paired(bool b) { _setFlag( 0, b); } /// Each segment properly aligned according to the aligner @property bool proper_pair() const nothrow { return cast(bool)(flag & 0x2); } /// ditto @property void proper_pair(bool b) { _setFlag( 1, b); } /// Segment unmapped @property bool is_unmapped() const nothrow { return cast(bool)(flag & 0x4); } /// ditto @property void is_unmapped(bool b) { _setFlag( 2, b); } /// Next segment in the template unmapped @property bool mate_is_unmapped() const nothrow { return cast(bool)(flag & 0x8); } /// ditto @property void mate_is_unmapped(bool b) { _setFlag( 3, b); } /// Sequence being reverse complemented @property bool is_reverse_strand() const nothrow { return cast(bool)(flag & 0x10); } /// ditto @property void is_reverse_strand(bool b) { _setFlag( 4, b); } /// Sequence of the next segment in the template being reversed @property bool mate_is_reverse_strand() const nothrow { return cast(bool)(flag & 0x20); } /// ditto @property void mate_is_reverse_strand(bool b) { _setFlag( 5, b); } /// The first segment in the template @property bool is_first_of_pair() const nothrow { return cast(bool)(flag & 0x40); } /// ditto @property void is_first_of_pair(bool b) { _setFlag( 6, b); } /// The last segment in the template @property bool is_second_of_pair() const nothrow { return cast(bool)(flag & 0x80); } /// ditto @property void is_second_of_pair(bool b) { _setFlag( 7, b); } /// Secondary alignment @property bool is_secondary_alignment() const nothrow { return cast(bool)(flag & 0x100); } /// ditto @property void is_secondary_alignment(bool b) { _setFlag( 8, b); } /// Not passing quality controls @property bool failed_quality_control() const nothrow { return cast(bool)(flag & 0x200); } /// ditto @property void failed_quality_control(bool b) { _setFlag( 9, b); } /// PCR or optical duplicate @property bool is_duplicate() const nothrow { return cast(bool)(flag & 0x400); } /// ditto @property void is_duplicate(bool b) { _setFlag(10, b); } /// Supplementary alignment @property bool is_supplementary() const nothrow { return cast(bool)(flag & 0x800); } /// ditto @property void is_supplementary(bool b) { _setFlag(11, b); } /// Convenience function, returns '+' or '-' indicating the strand. @property char strand() const nothrow { return is_reverse_strand ? '-' : '+'; } /// ditto @property void strand(char c) { enforce(c == '-' || c == '+', "Strand must be '-' or '+'"); is_reverse_strand = c == '-'; } /// Read name, length must be in 1..255 interval. @property string name() const nothrow { // notice -1: the string is zero-terminated, so we should strip that '\0' return cast(string)(_chunk[_read_name_offset .. _read_name_offset + _l_read_name - 1]); } /// ditto @property void name(string new_name) { enforce(new_name.length >= 1 && new_name.length <= 255, "name length must be in 1-255 range"); _dup(); bio.bam.utils.array.replaceSlice(_chunk, _chunk[_read_name_offset .. _read_name_offset + _l_read_name - 1], cast(ubyte[])new_name); _l_read_name = cast(ubyte)(new_name.length + 1); } /// List of CIGAR operations @property const(CigarOperation)[] cigar() const nothrow { return cast(const(CigarOperation)[])(_chunk[_cigar_offset .. _cigar_offset + _n_cigar_op * CigarOperation.sizeof]); } /// ditto @property void cigar(const(CigarOperation)[] c) { enforce(c.length < 65536, "Too many CIGAR operations, must be <= 65535"); _dup(); bio.bam.utils.array.replaceSlice(_chunk, _chunk[_cigar_offset .. _cigar_offset + _n_cigar_op * CigarOperation.sizeof], cast(ubyte[])c); _n_cigar_op = cast(ushort)(c.length); _recalculate_bin(); } /// Extended CIGAR where M operators are replaced with =/X based /// on information from MD tag. Throws if the read doesn't have MD /// tag. auto extended_cigar() @property const { Value md = this["MD"]; enforce(md.is_string); return makeExtendedCigar(cigar, mdOperations(*cast(string*)(&md))); } /// The number of reference bases covered by this read. /// $(BR) /// Returns 0 if the read is unmapped. int basesCovered() const { if (this.is_unmapped) { return 0; // actually, valid alignments should have empty cigar string } return reduce!"a + b.length"(0, filter!"a.is_reference_consuming"(cigar)); } /// Human-readable representation of CIGAR string (same as in SAM format) string cigarString() const { char[] str; // guess size of resulting string str.reserve(_n_cigar_op * 3); foreach (cigar_op; cigar) { str ~= to!string(cigar_op.length); str ~= cigar_op.type; } return cast(string)str; } private @property inout(ubyte)[] raw_sequence_data() inout nothrow { return _chunk[_seq_offset .. _seq_offset + (_l_seq + 1) / 2]; } /// Read-only random-access range for access to sequence data. static struct SequenceResult { private size_t _index; private ubyte[] _data = void; private size_t _len = void; private bool _use_first_4_bits = void; this(const(ubyte[]) data, size_t len, bool use_first_4_bits=true) { _data = cast(ubyte[])data; _len = len; _use_first_4_bits = use_first_4_bits; } /// @property bool empty() const { return _index >= _len; } /// @property bio.core.base.Base front() const { return opIndex(0); } /// @property bio.core.base.Base back() const { return opIndex(_len - 1); } /* I have no fucking idea why this tiny piece of code does NOT get inlined by stupid DMD compiler. Therefore I use string mixin instead. (hell yeah! Back to the 90s! C macros rulez!) private size_t _getActualPosition(size_t index) const { if (_use_first_4_bits) { // [0 1] [2 3] [4 5] [6 7] ... // | // V // 0 1 2 3 return index >> 1; } else { // [. 0] [1 2] [3 4] [5 6] ... // | // V // 0 1 2 3 return (index >> 1) + (index & 1); } }*/ private static string _getActualPosition(string index) { return "((" ~ index ~") >> 1) + " ~ "(_use_first_4_bits ? 0 : ((" ~ index ~ ") & 1))"; } private bool _useFirst4Bits(size_t index) const { auto res = index % 2 == 0; if (!_use_first_4_bits) { res = !res; } return res; } /// @property SequenceResult save() const { return SequenceResult(_data[mixin(_getActualPosition("_index")) .. $], _len - _index, _useFirst4Bits(_index)); } /// SequenceResult opSlice(size_t i, size_t j) const { return SequenceResult(_data[mixin(_getActualPosition("_index + i")) .. $], j - i, _useFirst4Bits(_index + i)); } /// @property bio.core.base.Base opIndex(size_t i) const { auto pos = _index + i; if (_use_first_4_bits) { if (pos & 1) return Base.fromInternalCode(_data[pos >> 1] & 0xF); else return Base.fromInternalCode(_data[pos >> 1] >> 4); } else { if (pos & 1) return Base.fromInternalCode(_data[(pos >> 1) + 1] >> 4); else return Base.fromInternalCode(_data[pos >> 1] & 0xF); } assert(false); } /// ditto @property void opIndexAssign(bio.core.base.Base base, size_t i) { auto pos = _index + i; if (_use_first_4_bits) { if (pos & 1) _data[pos >> 1] &= 0xF0, _data[pos >> 1] |= base.internal_code; else _data[pos >> 1] &= 0x0F, _data[pos >> 1] |= base.internal_code << 4; } else { if (pos & 1) _data[(pos >> 1) + 1] &= 0x0F, _data[(pos >> 1) + 1] |= base.internal_code << 4; else _data[pos >> 1] &= 0xF0, _data[pos >> 1] |= base.internal_code; } } /// void popFront() { ++_index; } /// void popBack() { --_len; } /// @property size_t length() const { return _len - _index; } alias length opDollar; void toString(scope void delegate(const(char)[]) dg) const { char[256] buf = void; size_t total = this.length; size_t written = 0; while (written < total) { size_t n = min(buf.length, total - written); foreach (j; 0 .. n) buf[j] = opIndex(written + j).asCharacter; dg(buf[0 .. n]); written += n; } } } /// Random-access range of characters @property SequenceResult sequence() const { return SequenceResult(raw_sequence_data, sequence_length); } static assert(isRandomAccessRange!(ReturnType!sequence)); /// Sets query sequence. Sets all base qualities to 255 (i.e. unknown). @property void sequence(string seq) { _dup(); auto raw_length = (seq.length + 1) / 2; // set sequence auto replacement = uninitializedArray!(ubyte[])(raw_length + seq.length); replacement[raw_length .. $] = 0xFF; for (size_t i = 0; i < raw_length; ++i) { replacement[i] = cast(ubyte)(Base(seq[2 * i]).internal_code << 4); if (seq.length > 2 * i + 1) replacement[i] |= cast(ubyte)(Base(seq[2 * i + 1]).internal_code); } bio.bam.utils.array.replaceSlice(_chunk, _chunk[_seq_offset .. _tags_offset], replacement); _l_seq = cast(int)seq.length; } /// Quality data (phred-based scores) @property inout(ubyte)[] base_qualities() inout nothrow { return _chunk[_qual_offset .. _qual_offset + _l_seq * char.sizeof]; } /// Set quality data - array length must be of the same length as the sequence. @property void base_qualities(const(ubyte)[] quality) { enforce(quality.length == _l_seq, "Quality data must be of the same length as sequence"); _dup(); _chunk[_qual_offset .. _qual_offset + _l_seq] = quality; } /* Constructs the struct from memory chunk */ this(ubyte[] chunk) { // Switching endianness lazily is not a good idea: // // 1) switching byte order is pretty fast // 2) lazy switching for arrays can kill the performance, // it has to be done once // 3) the code will be too complicated, whereas there're // not so many users of big-endian systems // // In summa, BAM is little-endian format, so big-endian // users will suffer anyway, it's unavoidable. _chunk = chunk; this._is_slice = true; if (std.system.endian != Endian.littleEndian) { switchChunkEndianness(); // Dealing with tags is the responsibility of TagStorage. fixTagStorageByteOrder(); } } // Doesn't touch tags, only fields. // @@@TODO: NEEDS TESTING@@@ private void switchChunkEndianness() { // First 8 fields are 32-bit integers: // // 0) refID int // 1) pos int // 2) bin_mq_nl uint // 3) flag_nc uint // 4) l_seq int // 5) next_refID int // 6) next_pos int // 7) tlen int // ---------------------------------------------------- // (after them name follows which is string) // switchEndianness(_chunk.ptr, 8 * uint.sizeof); // Then we need to switch endianness of CIGAR data: switchEndianness(_chunk.ptr + _cigar_offset, _n_cigar_op * uint.sizeof); } private size_t calculateChunkSize(string read_name, string sequence, in CigarOperation[] cigar) { return 8 * int.sizeof + (read_name.length + 1) // tailing '\0' + uint.sizeof * cigar.length + ubyte.sizeof * ((sequence.length + 1) / 2) + ubyte.sizeof * sequence.length; } /// Construct alignment from basic information about it. /// /// Other fields can be set afterwards. this(string read_name, // info for developers: string sequence, // these 3 fields are needed in CigarOperation[] cigar) // to calculate size of _chunk { enforce(read_name.length < 256, "Too long read name, length must be <= 255"); enforce(cigar.length < 65536, "Too many CIGAR operations, must be <= 65535"); if (this._chunk is null) { this._chunk = new ubyte[calculateChunkSize(read_name, sequence, cigar)]; } this._refID = -1; // set default values this._pos = -1; // according to SAM/BAM this._mapq = 255; // specification this._next_refID = -1; this._next_pos = -1; this._tlen = 0; this._l_read_name = cast(ubyte)(read_name.length + 1); // tailing '\0' this._n_cigar_op = cast(ushort)(cigar.length); this._l_seq = cast(int)(sequence.length); // now all offsets can be calculated through corresponding properties // set default quality _chunk[_qual_offset .. _qual_offset + sequence.length] = 0xFF; // set CIGAR data auto _len = cigar.length * CigarOperation.sizeof; _chunk[_cigar_offset .. _cigar_offset + _len] = cast(ubyte[])(cigar); // set read_name auto _offset = _read_name_offset; _chunk[_offset .. _offset + read_name.length] = cast(ubyte[])read_name; _chunk[_offset + read_name.length] = cast(ubyte)'\0'; this._is_slice = false; this.sequence = sequence; } /// Deep copy of the record. BamRead dup() @property const { BamRead result; result._chunk = this._chunk.dup; result._is_slice = false; result._modify_in_place = false; result._reader = cast()_reader; return result; } /// Compare two alignments, including tags /// (the tags must follow in the same order for equality). bool opEquals(BamRead other) const pure nothrow { // don't forget about _is_slice trick auto m = _cigar_offset; return _chunk[0 .. m - 1] == other._chunk[0 .. m - 1] && _chunk[m .. $] == other._chunk[m .. $]; } bool opEquals(const(BamRead) other) const pure nothrow { return opEquals(cast()other); } /// Size of the alignment record when output to stream in BAM format. /// Includes block_size as well (see SAM/BAM specification) @property size_t size_in_bytes() const { return int.sizeof + _chunk.length; } package void write(BamWriter writer) { writer.writeInteger(cast(int)(_chunk.length)); ubyte old_byte = _chunk[_cigar_offset - 1]; _chunk[_cigar_offset - 1] = 0; if (std.system.endian != Endian.littleEndian) { switchChunkEndianness(); writer.writeByteArray(_chunk[0 .. _tags_offset]); switchChunkEndianness(); } else { writer.writeByteArray(_chunk[0 .. _tags_offset]); } _chunk[_cigar_offset - 1] = old_byte; writeTags(writer); } /// Packs message in the following format: /// $(BR) /// MsgPack array with elements /// $(OL /// $(LI name - string) /// $(LI flag - ushort) /// $(LI reference sequence id - int) /// $(LI leftmost mapping position (1-based) - int) /// $(LI mapping quality - ubyte) /// $(LI array of CIGAR operation lengths - int[]) /// $(LI array of CIGAR operation types - ubyte[]) /// $(LI mate reference sequence id - int) /// $(LI mate position (1-based) - int) /// $(LI template length - int) /// $(LI segment sequence - string) /// $(LI phred-base quality - ubyte[]) /// $(LI tags - map: string -> value)) void toMsgpack(Packer)(ref Packer packer) const { packer.beginArray(13); packer.pack(cast(ubyte[])name); packer.pack(flag); packer.pack(ref_id); packer.pack(position + 1); packer.pack(mapping_quality); packer.pack(array(map!"a.length"(cigar))); packer.pack(array(map!"a.type"(cigar))); packer.pack(mate_ref_id); packer.pack(mate_position); packer.pack(template_length); packer.pack(to!string(sequence)); packer.pack(base_qualities); packer.beginMap(tagCount()); foreach (key, value; this) { packer.pack(key); packer.pack(value); } } /// String representation. /// $(BR) /// Possible formats are SAM ("%s") and JSON ("%j") void toString(scope void delegate(const(char)[]) sink, FormatSpec!char fmt) const { if (size_in_bytes < 10000 && fmt.spec == 's') { auto p = cast(char*)alloca(size_in_bytes * 5); char* end = p; toSam(end); sink(p[0 .. end - p]); } else if (size_in_bytes < 5000 && fmt.spec == 'j') { auto p = cast(char*)alloca(size_in_bytes * 10 + 1000); char* end = p; toJson(end); sink(p[0 .. end - p]); } else if (fmt.spec == 's') { toSam(sink); } else if (fmt.spec == 'j') { toJson(sink); } else { throw new FormatException("unknown format specifier"); } } /// ditto void toSam(Sink)(auto ref Sink sink) const if (isSomeSink!Sink) { sink.write(name); sink.write('\t'); sink.write(flag); sink.write('\t'); if (ref_id == -1 || _reader is null) sink.write('*'); else sink.write(_reader.reference_sequences[ref_id].name); sink.write('\t'); sink.write(position + 1); sink.write('\t'); sink.write(mapping_quality); sink.write('\t'); if (cigar.length == 0) sink.write('*'); else foreach (op; cigar) op.toSam(sink); sink.write('\t'); if (mate_ref_id == ref_id) { if (mate_ref_id == -1) sink.write("*\t"); else sink.write("=\t"); } else { if (mate_ref_id == -1 || _reader is null) { sink.write("*\t"); } else { auto mate_name = _reader.reference_sequences[mate_ref_id].name; sink.write(mate_name); sink.write("\t"); } } sink.write(mate_position + 1); sink.write('\t'); sink.write(template_length); sink.write('\t'); if (sequence_length == 0) sink.write('*'); else foreach (char c; sequence) sink.write(c); sink.write('\t'); if (base_qualities.length == 0 || base_qualities[0] == 0xFF) sink.write('*'); else foreach (qual; base_qualities) sink.write(cast(char)(qual + 33)); foreach (k, v; this) { sink.write('\t'); sink.write(k); sink.write(':'); v.toSam(sink); } } /// ditto string toSam()() const { return to!string(this); } /// JSON representation void toJson(Sink)(auto ref Sink sink) const if (isSomeSink!Sink) { sink.write(`{"qname":`); sink.writeJson(name); sink.write(`,"flag":`); sink.write(flag); sink.write(`,"rname":`); if (ref_id == -1 || _reader is null) sink.write(`"*"`); else sink.writeJson(_reader.reference_sequences[ref_id].name); sink.write(`,"pos":`); sink.write(position + 1); sink.write(`,"mapq":`); sink.write(mapping_quality); sink.write(`,"cigar":"`); if (cigar.empty) sink.write('*'); else foreach (op; cigar) op.toSam(sink); sink.write('"'); sink.write(`,"rnext":`); if (mate_ref_id == ref_id) { if (mate_ref_id == -1) sink.write(`"*"`); else sink.write(`"="`); } else if (mate_ref_id == -1 || _reader is null) { sink.write(`"*"`); } else { sink.writeJson(_reader.reference_sequences[mate_ref_id].name); } sink.write(`,"pnext":`); sink.write(mate_position + 1); sink.write(`,"tlen":`); sink.write(template_length); sink.write(`,"seq":"`); if (sequence_length == 0) sink.write('*'); else foreach (char c; sequence) sink.write(c); sink.write('"'); sink.write(`,"qual":`); sink.writeJson(base_qualities); sink.write(`,"tags":{`); bool not_first = false; foreach (k, v; this) { if (not_first) sink.write(','); sink.writeJson(k); sink.write(':'); v.toJson(sink); not_first = true; } sink.write("}}"); } /// ditto string toJson()() const { auto w = appender!(char[])(); toJson((const(char)[] s) { w.put(s); }); return cast(string)w.data; } /// Associates read with BAM reader. This is done automatically /// if this read is obtained through BamReader/Reference methods. void associateWithReader(bio.bam.abstractreader.IBamSamReader reader) { _reader = reader; } /// Associated BAM/SAM reader. inout(bio.bam.abstractreader.IBamSamReader) reader() @property inout { return _reader; } /// bool is_slice_backed() @property const { return _is_slice; } /// Raw representation of the read. Occasionally useful for dirty hacks! inout(ubyte)[] raw_data() @property inout { return _chunk; } /// ditto void raw_data(ubyte[] data) @property { _chunk = data; } package ubyte[] _chunk; // holds all the data, // the access is organized via properties // (see below) private: // by specs, name ends with '\0' // let's use this byte for something useful! // // (Of course this places some restrictions on usage, // but allows to reduce size of record.) bool _is_slice() @property const { return cast(bool)(_chunk[_cigar_offset - 1] & 1); } void _is_slice(bool is_slice) @property { _chunk[_cigar_offset - 1] &= 0b11111110; _chunk[_cigar_offset - 1] |= (is_slice ? 1 : 0); } // don't call _dup() if the record is modified bool _modify_in_place() @property const { return cast(bool)(_chunk[_cigar_offset - 1] & 2); } void _modify_in_place(bool in_place) @property { _chunk[_cigar_offset - 1] &= 0b11111101; _chunk[_cigar_offset - 1] |= (in_place ? 2 : 0); } IBamSamReader _reader; string _ref_id_to_string(int ref_id) const nothrow { if (_reader is null) return "?"; if (ref_id < 0) return "*"; return _reader.reference_sequences[ref_id].name; } // Official field names from SAM/BAM specification. // For internal use only @property int _refID() const nothrow { return *(cast( int*)(_chunk.ptr + int.sizeof * 0)); } @property int _pos() const nothrow { return *(cast( int*)(_chunk.ptr + int.sizeof * 1)); } @property uint _bin_mq_nl() const nothrow pure @system { return *(cast(uint*)(_chunk.ptr + int.sizeof * 2)); } @property uint _flag_nc() const nothrow { return *(cast(uint*)(_chunk.ptr + int.sizeof * 3)); } @property int _l_seq() const nothrow { return *(cast( int*)(_chunk.ptr + int.sizeof * 4)); } @property int _next_refID() const nothrow { return *(cast( int*)(_chunk.ptr + int.sizeof * 5)); } @property int _next_pos() const nothrow { return *(cast( int*)(_chunk.ptr + int.sizeof * 6)); } @property int _tlen() const nothrow { return *(cast( int*)(_chunk.ptr + int.sizeof * 7)); } // Setters, also only for internal use @property void _refID(int n) { *(cast( int*)(_chunk.ptr + int.sizeof * 0)) = n; } @property void _pos(int n) { *(cast( int*)(_chunk.ptr + int.sizeof * 1)) = n; } @property void _bin_mq_nl(uint n) { *(cast(uint*)(_chunk.ptr + int.sizeof * 2)) = n; } @property void _flag_nc(uint n) { *(cast(uint*)(_chunk.ptr + int.sizeof * 3)) = n; } @property void _l_seq(int n) { *(cast( int*)(_chunk.ptr + int.sizeof * 4)) = n; } @property void _next_refID(int n) { *(cast( int*)(_chunk.ptr + int.sizeof * 5)) = n; } @property void _next_pos(int n) { *(cast( int*)(_chunk.ptr + int.sizeof * 6)) = n; } @property void _tlen(int n) { *(cast( int*)(_chunk.ptr + int.sizeof * 7)) = n; } // Additional useful properties, also from SAM/BAM specification // // The layout of bin_mq_nl and flag_nc is as follows // (upper bits -------> lower bits): // // bin_mq_nl [ { bin (16b) } { mapping quality (8b) } { read name length (8b) } ] // // flag_nc [ { flag (16b) } { n_cigar_op (16b) } ] // @property ushort _bin() const nothrow { return _bin_mq_nl >> 16; } @property ubyte _mapq() const nothrow { return (_bin_mq_nl >> 8) & 0xFF; } @property ubyte _l_read_name() const nothrow pure { return _bin_mq_nl & 0xFF; } @property ushort _flag() const nothrow { return _flag_nc >> 16; } @property ushort _n_cigar_op() const nothrow { return _flag_nc & 0xFFFF; } // Setters for those properties @property void _bin(ushort n) { _bin_mq_nl = (_bin_mq_nl & 0xFFFF) | (n << 16); } @property void _mapq(ubyte n) { _bin_mq_nl = (_bin_mq_nl & ~0xFF00) | (n << 8); } @property void _l_read_name(ubyte n) { _bin_mq_nl = (_bin_mq_nl & ~0xFF ) | n; } @property void _flag(ushort n) { _flag_nc = (_flag_nc & 0xFFFF) | (n << 16); } @property void _n_cigar_op(ushort n) { _flag_nc = (_flag_nc & ~0xFFFF) | n; } // Offsets of various arrays in bytes. // Currently, are computed each time, so if speed will be an issue, // they can be made fields instead of properties. @property size_t _read_name_offset() const nothrow pure { return 8 * int.sizeof; } @property size_t _cigar_offset() const nothrow pure { return _read_name_offset + _l_read_name * char.sizeof; } @property size_t _seq_offset() const nothrow { return _cigar_offset + _n_cigar_op * uint.sizeof; } @property size_t _qual_offset() const nothrow { return _seq_offset + (_l_seq + 1) / 2; } // Offset of auxiliary data @property size_t _tags_offset() const nothrow { return _qual_offset + _l_seq; } // Sets n-th flag bit to boolean value b. void _setFlag(int n, bool b) { assert(n < 16); // http://graphics.stanford.edu/~seander/bithacks.html#ConditionalSetOrClearBitsWithoutBranching ushort mask = cast(ushort)(1 << n); _flag = (_flag & ~mask) | ((-cast(int)b) & mask); } // If _chunk is still a slice, not an array, duplicate it. // Used when some part of alignment record is modified by user. // // Basically, it's sort of copy-on-write: a lot of read-only alignments // may point to the same location, but every modified one allocates its // own chunk of memory. void _dup() { if (_is_slice && !_modify_in_place) { _chunk = _chunk.dup; _is_slice = false; } } public: // Calculates bin number. void _recalculate_bin() { _bin = reg2bin(position, position + basesCovered()); } } /// Lazy tag storage. /// /// Provides hash-like access and opportunity to iterate /// storage like an associative array. mixin template TagStorage() { // Provides access to chunk of memory which contains tags. // This way, every time _tags_offset gets updated // (due to update of cigar string/read name/sequence and memory move), // the change is reflected automatically in tag storage. private @property const(ubyte)[] _tags_chunk() const { return _chunk[_tags_offset .. $]; } /// Hash-like access to tags. Time complexity is $(BIGOH number of tags). /// $(BR) /// If tag with such $(I key) is not found, returned value 'is nothing'. /// $(BR) /// If key length is different from 2, exception is thrown. /// $(BR) /// Special case when $(I value) represents nothing is used for removing tag /// (assuming that no more than one with this key is presented in the record). /// /// Examples: /// ---------------------------- /// auto v = read["NM"]; /// assert(v.is_integer); /// /// auto v = read["MN"]; /// assert(v.is_nothing); // no such tag /// /// read["NM"] = 3; // converted to bio.bam.tagvalue.Value implicitly /// /// read["NM"] = null; // removes tag /// assert(read["NM"].is_nothing); /// ---------------------------- bio.bam.tagvalue.Value opIndex(string key) const { enforce(key.length == 2, "Key length must be 2"); auto __tags_chunk = _tags_chunk; // _tags_chunk is evaluated lazily if (__tags_chunk.length < 4) return Value(null); size_t offset = 0; while (offset + 1 < __tags_chunk.length) { if (__tags_chunk[offset .. offset + 2] == key) { offset += 2; return readValue(offset, __tags_chunk); } else { offset += 2; skipValue(offset, __tags_chunk); } } return Value(null); } /// ditto void opIndexAssign(T)(T value, string key) if (is(T == Value) || __traits(compiles, GetTypeId!T)) { static if(is(T == Value)) { enforce(key.length == 2, "Key length must be 2"); auto __tags_chunk = _tags_chunk; _dup(); size_t offset = 0; while (offset + 1 < __tags_chunk.length) { if (__tags_chunk[offset .. offset + 2] == key) { if (value.is_nothing) { // special case - remove tag removeValueAt(offset); } else { replaceValueAt(offset + 2, value); } return; } else { offset += 2; skipValue(offset, __tags_chunk); } } if (!value.is_nothing) appendTag(key, value); } else { opIndexAssign(Value(value), key); } } /// Append new tag to the end, skipping check if it already exists. $(BIGOH 1) void appendTag(string key, Value value) { auto oldlen = _chunk.length; _chunk.length = _chunk.length + sizeInBytes(value) + 2 * char.sizeof; _chunk[oldlen .. oldlen + 2] = cast(ubyte[])key; emplaceValue(_chunk.ptr + oldlen + 2, value); } /// Remove all tags void clearAllTags() { _chunk.length = _tags_offset; } /// Number of tags. $(BIGOH number of tags) size_t tagCount() { size_t result = 0; size_t offset = 0; auto __tags_chunk = _tags_chunk; while (offset + 1 < __tags_chunk.length) { offset += 2; skipValue(offset, __tags_chunk); result += 1; } return result; } // replace existing tag private void replaceValueAt(size_t offset, Value value) { // offset points to the beginning of the value auto begin = offset; auto __tags_chunk = _tags_chunk; skipValue(offset, __tags_chunk); // now offset is updated and points to the end auto end = offset; prepareSlice(_chunk, __tags_chunk[begin .. end], sizeInBytes(value)); emplaceValue(_chunk.ptr + _tags_offset + begin, value); } // remove existing tag private void removeValueAt(size_t begin) { // offset points to the beginning of the value auto offset = begin + 2; auto __tags_chunk = _tags_chunk; skipValue(offset, __tags_chunk); auto end = offset; // this does the job (see prepareSlice code) prepareSlice(_chunk, __tags_chunk[begin .. end], 0); } /// Provides opportunity to iterate over tags. int opApply(scope int delegate(const ref string k, const ref Value v) dg) const { size_t offset = 0; auto __tags_chunk = _tags_chunk; while (offset + 1 < __tags_chunk.length) { auto key = cast(string)__tags_chunk[offset .. offset + 2]; offset += 2; auto val = readValue(offset, __tags_chunk); auto res = dg(key, val); if (res != 0) { return res; } } return 0; } /// Returns the number of tags. Time complexity is $(BIGOH number of tags) size_t tagCount() const { size_t res = 0; size_t offset = 0; auto __tags_chunk = _tags_chunk; while (offset + 1 < __tags_chunk.length) { offset += 2; skipValue(offset, __tags_chunk); res += 1; } return res; } private void writeTags(BamWriter writer) { if (std.system.endian == Endian.littleEndian) { writer.writeByteArray(_tags_chunk[]); } else { fixTagStorageByteOrder(); writer.writeByteArray(_tags_chunk[]); fixTagStorageByteOrder(); } } // Reads value which starts from (_tags_chunk.ptr + offset) address, // and updates offset to the end of value. O(1) private Value readValue(ref size_t offset, const(ubyte)[] tags_chunk) const { char type = cast(char)tags_chunk[offset++]; return readValueFromArray(type, tags_chunk, offset); } // Increases offset so that it points to the next value. O(1). private void skipValue(ref size_t offset, const(ubyte)[] tags_chunk) const { char type = cast(char)tags_chunk[offset++]; if (type == 'Z' || type == 'H') { while (tags_chunk[offset++] != 0) {} } else if (type == 'B') { char elem_type = cast(char)tags_chunk[offset++]; auto length = *(cast(uint*)(tags_chunk.ptr + offset)); offset += uint.sizeof + charToSizeof(elem_type) * length; } else { offset += charToSizeof(type); } } /* Intended to be used in constructor for initial endianness fixing in case the library is used on big-endian system. NOT TESTED AT ALL!!! */ private void fixTagStorageByteOrder() { /* TODO: TEST ON BIG-ENDIAN SYSTEM!!! */ const(ubyte)* p = _tags_chunk.ptr; const(ubyte)* end = p + _chunk.length; while (p < end) { p += 2; // skip tag name char type = *(cast(char*)p); ++p; // skip type if (type == 'Z' || type == 'H') { while (*p != 0) { // zero-terminated ++p; // string } ++p; // skip '\0' } else if (type == 'B') { // array char elem_type = *(cast(char*)p); uint size = charToSizeof(elem_type); switchEndianness(p, uint.sizeof); uint length = *(cast(uint*)p); p += uint.sizeof; // skip length if (size != 1) { for (auto j = 0; j < length; j++) { switchEndianness(p, size); p += size; } } else { // skip p += length; } } else { uint size = charToSizeof(type); if (size != 1) { switchEndianness(p, size); p += size; } else { ++p; } } } } } unittest { import std.algorithm; import std.stdio; import std.math; writeln("Testing BamRead behaviour..."); auto read = BamRead("readname", "AGCTGACTACGTAATAGCCCTA", [CigarOperation(22, 'M')]); assert(read.sequence_length == 22); assert(read.cigar.length == 1); assert(read.cigarString() == "22M"); assert(read.name == "readname"); assert(equal(read.sequence(), "AGCTGACTACGTAATAGCCCTA")); read.name = "anothername"; assert(read.name == "anothername"); assert(read.cigarString() == "22M"); read.base_qualities = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]; assert(reduce!"a+b"(0, read.base_qualities) == 253); read["RG"] = 15; assert(read["RG"] == 15); read["X1"] = [1, 2, 3, 4, 5]; assert(read["X1"] == [1, 2, 3, 4, 5]); read.cigar = [CigarOperation(20, 'M'), CigarOperation(2, 'X')]; assert(read.cigarString() == "20M2X"); read["RG"] = cast(float)5.6; assert(approxEqual(to!float(read["RG"]), 5.6)); read.sequence = "AGCTGGCTACGTAATAGCCCT"; assert(read.sequence_length == 21); assert(read.base_qualities.length == 21); assert(read.base_qualities[20] == 255); assert(equal(read.sequence(), "AGCTGGCTACGTAATAGCCCT")); assert(retro(read.sequence)[2] == 'C'); assert(retro(read.sequence)[0] == 'T'); assert(read.sequence[4] == 'G'); assert(read.sequence[0] == 'A'); assert(equal(read.sequence[0..8], "AGCTGGCT")); assert(equal(read.sequence[3..5], "TG")); assert(equal(read.sequence[3..9][1..4], "GGC")); read["X1"] = 42; assert(read["X1"] == 42); assert(read.tagCount() == 2); read["X1"] = null; assert(read["X1"].is_nothing); assert(read.tagCount() == 1); read.sequence = "GTAAGCTGGCACTAGCAGCCT"; read.cigar = [CigarOperation(read.sequence_length, 'M')]; read["RG"] = null; read["RG"] = "readgroup1"; assert(read.tagCount() == 1); read["RG"] = null; assert(read.tagCount() == 0); read.sequence[5] = Base('N'); read.sequence[6] = Base('A'); read.sequence[7] = Base('C'); read.sequence[8] = Base('G'); read.base_qualities[5] = 42; assert(read.sequence[5 .. 9].equal("NACG")); assert(read.base_qualities[5] == 42); // Test MsgPack serialization/deserialization { import std.typecons; auto packer = bio.bam.thirdparty.msgpack.packer(Appender!(ubyte[])()); read.toMsgpack(packer); auto data = packer.stream.data; auto rec = unpack(data).via.array; assert(rec[0].as!(ubyte[]) == "anothername"); assert(rec[5].as!(int[]) == [21]); assert(rec[6].as!(ubyte[]) == ['M']); assert(rec[10].as!(ubyte[]) == to!string(read.sequence)); } read.clearAllTags(); assert(read.tagCount() == 0); } /// $(P BamRead wrapper which precomputes $(D end_position) = $(D position) + $(D basesCovered()).) /// /// $(P Computation of basesCovered() takes quite a few cycles. Therefore in places where this /// property is frequently accessed, it makes sense to precompute it for later use.) /// /// $(P The idea is that this should be a drop-in replacement for BamRead in algorithms, /// as the struct uses 'alias this' construction for the wrapped read.) struct EagerBamRead(R=BamRead) { /// this(R read) { this.read = read; this.end_position = read.position + read.basesCovered(); } /// R read; /// alias read this; /// End position on the reference, computed as position + basesCovered(). int end_position; /// EagerBamRead dup() @property const { return EagerBamRead(read.dup); } } static assert(is(EagerBamRead!BamRead : BamRead)); /// Checks if $(D T) behaves like $(D BamRead) template isBamRead(T) { static if (is(Unqual!T : BamRead)) enum isBamRead = true; else enum isBamRead = __traits(compiles, { T t; bool p; p = t.ref_id == 1; p = t.position == 2; p = t.bin.id == 3; p = t.mapping_quality == 4; p = t.flag == 5; p = t.sequence_length == 6; p = t.mate_ref_id == 7; p = t.mate_position == 8; p = t.template_length == 9; p = t.is_paired; p = t.proper_pair; p = t.is_unmapped; p = t.mate_is_unmapped; p = t.mate_is_reverse_strand; p = t.is_first_of_pair; p = t.is_second_of_pair; p = t.is_secondary_alignment; p = t.failed_quality_control; p = t.is_duplicate; p = t.strand == '+'; p = t.name == ""; p = t.cigar[0].type == 'M'; p = t.basesCovered() > 42; p = t.cigarString() == ""; p = t.sequence[0] == 'A'; p = t.base_qualities[0] == 0; }); } /// $(P Comparison function for 'queryname' sorting order /// (return whether first read is 'less' than second)) /// /// $(P This function can be called on: /// $(UL /// $(LI two reads) /// $(LI read and string in any order))) bool compareReadNames(R1, R2)(const auto ref R1 a1, const auto ref R2 a2) if (isBamRead!R1 && isBamRead!R2) { return a1.name < a2.name; } bool compareReadNames(R1, R2)(const auto ref R1 a1, const auto ref R2 a2) if (isBamRead!R1 && isSomeString!R2) { return a1.name < a2; } bool compareReadNames(R1, R2)(const auto ref R1 a1, const auto ref R2 a2) if (isSomeString!R1 && isBamRead!R2) { return a1 < a2.name; } int mixedStrCompare(string a, string b) { import std.ascii : isDigit; while (!a.empty && !b.empty) { if (a.front.isDigit && b.front.isDigit) { // skip zeros int za, zb; while (!a.empty && a.front == '0') { ++za; a.popFront(); } while (!b.empty && b.front == '0') { ++zb; b.popFront(); } // skip equal digits while (!a.empty && !b.empty && a.front.isDigit && a.front == b.front) { a.popFront(); b.popFront(); } if (!a.empty && !b.empty && a.front.isDigit && b.front.isDigit) { // the number of leading digits in each string is non-zero size_t i = 0, maxi = min(a.length, b.length); while (i < maxi && a[i].isDigit && b[i].isDigit) ++i; if (i < a.length && a[i].isDigit) return 1; // a contains more digits if (i < b.length && b[i].isDigit) return -1; // b contains more digits // the counts are equal, compare first digits return cast(byte)a.front - cast(byte)b.front; } else if (!a.empty && a.front.isDigit) return 1; else if (!b.empty && b.front.isDigit) return -1; else if (za != zb) return za - zb; // order by the number of leading zeros } else { // lexicographical comparison for non-digits if (a.front != b.front) return cast(byte)a.front - cast(byte)b.front; a.popFront(); b.popFront(); } } return (!a.empty) ? 1 : (!b.empty) ? -1 : 0; } /// $(P Comparison function for 'queryname' sorting order as in Samtools /// (returns whether first read is 'less' than second in a 'mixed' order, /// i.e. numbers inside the strings are compared by their integer value)) /// /// $(P This function can be called on: /// $(UL /// $(LI two reads) /// $(LI read and string in any order))) bool mixedCompareReadNames(R1, R2)(const auto ref R1 a1, const auto ref R2 a2) if (isBamRead!R1 && isBamRead!R2) { return mixedStrCompare(a1.name, a2.name) < 0; } bool mixedCompareReadNames(R1, R2)(const auto ref R1 a1, const auto ref R2 a2) if (isBamRead!R1 && isSomeString!R2) { return mixedStrCompare(a1.name, a2) < 0; } bool mixedCompareReadNames(R1, R2)(const auto ref R1 a1, const auto ref R2 a2) if (isSomeString!R1 && isBamRead!R2) { return mixedStrCompare(a1, a2.name) < 0; } unittest { assert(mixedStrCompare("BC0123", "BC01234") < 0); assert(mixedStrCompare("BC0123", "BC0123Z") < 0); assert(mixedStrCompare("BC01234", "BC01234") == 0); assert(mixedStrCompare("BC0123DEF45", "BC01234DEF45") < 0); assert(mixedStrCompare("BC01236DEF45", "BC01234DEF45") > 0); assert(mixedStrCompare("BC012", "BC0012") < 0); assert(mixedStrCompare("BC0012DE0034", "BC0012DE34") > 0); assert(mixedStrCompare("BC12DE0034", "BC012DE34") < 0); assert(mixedStrCompare("1235", "1234") > 0); } /// $(P Comparison function for 'coordinate' sorting order /// (returns whether first read is 'less' than second)) /// /// $(P This function can be called on: /// $(UL /// $(LI two reads (in this case, reference IDs are also taken into account)) /// $(LI read and integer in any order))) bool compareCoordinates(R1, R2)(const auto ref R1 a1, const auto ref R2 a2) if (isBamRead!R1 && isBamRead!R2) { if (a1.ref_id == -1) return false; // unmapped reads should be last if (a2.ref_id == -1) return true; if (a1.ref_id < a2.ref_id) return true; if (a1.ref_id > a2.ref_id) return false; if (a1.position < a2.position) return true; if (a1.position > a2.position) return false; return !a1.is_reverse_strand && a2.is_reverse_strand; } bool compareCoordinates(R1, R2)(const auto ref R1 a1, const auto ref R2 a2) if (isBamRead!R1 && isIntegral!R2) { return a1.position < a2; } bool compareCoordinates(R1, R2)(const auto ref R1 a1, const auto ref R2 a2) if (isIntegral!R1 && isBamRead!R2) { return a1 < a2.position; } static assert(isTwoWayCompatible!(compareReadNames, BamRead, string)); static assert(isTwoWayCompatible!(compareCoordinates, BamRead, int)); /// Allows modification of the read in-place even if it's slice-backed. struct UniqueRead(R) { R read; alias read this; this(R read) { this.read = read; this.read._modify_in_place = true; } ~this() { this.read._modify_in_place = false; } } /// ditto auto assumeUnique(R)(auto ref R read) if (isBamRead!R) { return UniqueRead!R(read); } BioD-0.1.0/bio/bam/reader.d000066400000000000000000000501151273003163100152420ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// Writing a script/tool for processing BAM data often starts this way: /// /// ------------------------ /// import bio.bam.reader; /// /// void main(string[] args) { /// auto bam = new BamReader(args[1]); // open BAM file /// foreach (read; bam.reads) { // iterate through its reads /// if (read.is_unmapped) /// continue; // maybe skip unmapped ones /// ... /// } /// } /// ------------------------ /// /// Or, if a specific interval on the reference sequence is to be explored: /// ------------------------ /// import bio.bam.pileup; /// ... /// auto reads = bam["chr7"][50_000 .. 60_000]; // BAI index is required /// foreach (column; makePileup(reads)) { ... } // see $(PMODULE pileup) docs /// ------------------------ module bio.bam.reader; import bio.bam.abstractreader; public import bio.sam.header; public import bio.bam.reference; public import bio.bam.region; public import bio.bam.read; public import bio.bam.tagvalue; public import bio.bam.readrange; import bio.bam.randomaccessmanager; import bio.bam.baifile; import bio.bam.bai.indexing; import bio.core.utils.range; import bio.core.utils.stream; import bio.core.bgzf.inputstream; public import bio.core.bgzf.virtualoffset; import std.system; import std.stdio; import std.algorithm; import std.range; import std.conv; import std.exception; import std.parallelism; import std.array; import core.stdc.stdio; import std.string; /** BAM file reader, featuring parallel decompression of BGZF blocks. */ class BamReader : IBamSamReader { /** Creates reader associated with file or stream. (If stream constructor is used, no random access is possible.) $(BR) Optionally, task pool can be specified. It will be used to unpack BGZF blocks in parallel. Example: ------------------------------------------- import std.parallelism, bio.bam.reader; void main() { auto pool = new TaskPool(4); // use 4 threads scope (exit) pool.finish(); // don't forget! auto bam = new BamReader("file.bam", pool); ... } ------------------------------------------- */ this(std.stream.Stream stream, std.parallelism.TaskPool task_pool = std.parallelism.taskPool) { _source_stream = new EndianStream(stream, Endian.littleEndian); _task_pool = task_pool; if (stream.seekable) { _stream_is_seekable = true; } initializeStreams(); auto magic = _bam.readString(4); enforce(magic == "BAM\1", "Invalid file format: expected BAM\\1"); readSamHeader(); readReferenceSequencesInfo(); // right after construction, we are at the beginning // of the list of reads if (_stream_is_seekable) { _reads_start_voffset = _decompressed_stream.virtualTell(); } } /// ditto this(string filename, std.parallelism.TaskPool task_pool) { _filename = filename; _source_stream = getNativeEndianSourceStream(); this(_source_stream, task_pool); } /// ditto this(string filename) { this(filename, std.parallelism.taskPool); } /** True if BAI file was found for this BAM file. This is necessary for any random-access operations. $(BR) Looks for files in the same directory which filename is either the file name of BAM file with '.bai' appended, or with the last extension replaced with '.bai' (that is, for $(I file.bam) paths $(I file.bai) and $(I file.bam.bai) will be checked) */ bool has_index() @property { return _random_access_manager.found_index_file; } /** Creates BAI file. If $(I overwrite) is false, it won't touch existing index if it is already found. */ void createIndex(bool overwrite = false) { if (has_index && !overwrite) return; Stream stream = new BufferedFile(filename ~ ".bai", FileMode.OutNew); scope(exit) stream.close(); bio.bam.bai.indexing.createIndex(this, stream); _bai_status = BaiStatus.notInitialized; _rndaccssmgr = null; } /** Filename, if the object was created via file name constructor, $(D null) otherwise. */ string filename() @property const { return _filename; } /// If file ends with EOF block, returns virtual offset of the start of EOF block. /// Otherwise, returns virtual offset of the physical end of file. bio.core.bgzf.virtualoffset.VirtualOffset eofVirtualOffset() { return _random_access_manager.eofVirtualOffset(); } /// Get BGZF block at a given file offset. bio.core.bgzf.block.BgzfBlock getBgzfBlockAt(ulong offset) { return _random_access_manager.getBgzfBlockAt(offset); } /** Returns: SAM header of the BAM file */ bio.sam.header.SamHeader header() @property { if (_header is null) { synchronized { if (_header is null) { _header = new SamHeader(_headertext); _headertext = null; } } } return _header; } /** Returns: information about reference sequences */ const(bio.bam.referenceinfo.ReferenceSequenceInfo)[] reference_sequences() @property const nothrow { return _reference_sequences; } /** Range of all alignment records in the file. $(BR) Element type of the returned range depends on the policy. Default one is $(DPREF2 bam, readrange, withoutOffsets), in this case range element type is $(DPREF2 bam, read, BamRead). $(BR) The other option is $(DPREF2 bam, readrange, withOffsets), which allows to track read virtual offsets in the file. In this case range element type is $(DPREF2 bam, readrange, BamReadBlock). Example: ---------------------------------- import bio.bam.readrange; ... auto bam = new BamReader("file.bam"); auto reads = bam.reads!withOffsets(); writeln(reads.front.start_virtual_offset); ---------------------------------- */ auto reads(alias IteratePolicy=bio.bam.readrange.withoutOffsets)() @property { auto _decompressed_stream = getDecompressedBamReadStream(); return bamReadRange!IteratePolicy(_decompressed_stream, this); } static struct ReadsWithProgressResult(alias IteratePolicy, R, S) { this(R range, S stream, void delegate(lazy float p) progressBarFunc, void delegate() finishFunc) { _range = range; _stream = stream; _progress_bar_func = progressBarFunc; _finish_func = finishFunc; } static if (__traits(identifier, IteratePolicy) == "withOffsets") { auto front() @property { return _range.front; } } else static if (__traits(identifier, IteratePolicy) == "withoutOffsets") { auto front() @property { return _range.front.read; } } else static assert(0, __traits(identifier, IteratePolicy)); bool empty() @property { auto result = _range.empty; if (_finish_func !is null && !_called_finish_func && result) { _called_finish_func = true; _finish_func(); } return result; } void popFront() { _bytes_read += _range.front.read.size_in_bytes; _range.popFront(); if (_progress_bar_func !is null) { _progress_bar_func(min(1.0, cast(float)_bytes_read / (_stream.total_compressed_size * _stream.average_compression_ratio))); } } private R _range; private S _stream; private size_t _bytes_read; private void delegate(lazy float p) _progress_bar_func; private void delegate() _finish_func; private bool _called_finish_func = false; } /** Returns: range of all reads in the file, calling $(I progressBarFunc) for each read. $(BR) $(I progressBarFunc) will be called each time next alignment is read, with the argument being a number from [0.0, 1.0], which is estimated progress percentage. $(BR) Notice that $(I progressBarFunc) takes $(D lazy) argument, so that the number of relatively expensive float division operations can be controlled by user. Once the iteration is finished (call to $(D empty) returned true), $(I finishFunc) will be called if provided. Example: ------------------------------------ import std.functional, std.stdio, bio.bam.reader; void progress(lazy float p) { static uint n; if (++n % 63 == 0) writeln(p); // prints progress after every 63 records } ... foreach (read; bam.readsWithProgress(toDelegate(&progress))) { ... } ------------------------------------ */ auto readsWithProgress(alias IteratePolicy=bio.bam.readrange.withoutOffsets) (void delegate(lazy float p) progressBarFunc, void delegate() finishFunc=null) { auto _decompressed_stream = getDecompressedBamReadStream(); auto reads_with_offsets = bamReadRange!withOffsets(_decompressed_stream, this); alias ReadsWithProgressResult!(IteratePolicy, typeof(reads_with_offsets), BgzfInputStream) Result; return Result(reads_with_offsets, _decompressed_stream, progressBarFunc, finishFunc); } /// void assumeSequentialProcessing() { _seqprocmode = true; } /// Part of IBamSamReader interface std.range.InputRange!(bio.bam.read.BamRead) allReads() @property { return inputRangeObject(reads!withoutOffsets()); } /** Returns: the read which starts at a given virtual offset. */ bio.bam.read.BamRead getReadAt(bio.core.bgzf.virtualoffset.VirtualOffset offset) { enforce(_random_access_manager !is null); return _random_access_manager.getReadAt(offset); } /** Returns: all reads located between two virtual offsets in the BAM file. $(BR) First offset must point to the start of an alignment record, and be strictly less than the second one. $(BR) For decompression, the task pool specified at the construction is used. */ auto getReadsBetween(bio.core.bgzf.virtualoffset.VirtualOffset from, bio.core.bgzf.virtualoffset.VirtualOffset to) { enforce(from <= to, "First offset must be less than second"); enforce(_stream_is_seekable, "Stream is not seekable"); return _random_access_manager.getReadsBetween(from, to); } /** Returns: all reads overlapping any region from a set. */ auto getReadsOverlapping(BamRegion[] regions) { return _random_access_manager.getReads(regions); } /** Unmapped reads, i.e. reads at the end of file whose reference id is -1. The file must be coordinate-sorted and indexed. */ auto unmappedReads() { enforce(_random_access_manager !is null); auto bai = _random_access_manager.getBai(); VirtualOffset start; start = eofVirtualOffset(); auto all_reads = this.reads(); if (!all_reads.empty && all_reads.front.ref_id == -1) start = _reads_start_voffset; auto ioffsets = bai.indices[0 .. reference_sequences.length].retro() .map!(index => index.ioffsets.retro()).joiner(); if (!ioffsets.empty) start = ioffsets.front; auto stream = _random_access_manager.createStreamStartingFrom(start); auto r = bamReadRange!withOffsets(stream, this); while (!r.empty && r.front.ref_id != -1) r.popFront(); return r; } /** Get BAI chunks containing all reads that overlap specified region. For $(I ref_id) = -1, use $(D unmappedReads) method. */ bio.core.bgzf.chunk.Chunk[] getChunks(uint ref_id, int beg, int end) { enforce(_random_access_manager !is null); enforce(beg < end); return _random_access_manager.getChunks(BamRegion(ref_id, beg, end)); } /** Returns reference sequence with id $(I ref_id). */ bio.bam.reference.ReferenceSequence reference(int ref_id) { enforce(ref_id < _reference_sequences.length, "Invalid reference index"); return ReferenceSequence(_random_access_manager, ref_id, _reference_sequences[ref_id]); } /** Returns reference sequence named $(I ref_name). Example: --------------------------- import std.stdio, bio.bam.reader; ... auto bam = new BamReader("file.bam"); writeln(bam["chr2"].length); --------------------------- */ bio.bam.reference.ReferenceSequence opIndex(string ref_name) { enforce(hasReference(ref_name), "Reference with name " ~ ref_name ~ " does not exist"); auto ref_id = _reference_sequence_dict[ref_name]; return reference(ref_id); } /** Check if reference named $(I ref_name) is presented in BAM header. */ bool hasReference(string ref_name) { return null != (ref_name in _reference_sequence_dict); } /** Set buffer size for I/O operations. Values less than 4096 are disallowed. $(BR) This can help in multithreaded applications when several files are read simultaneously (e.g. merging). */ void setBufferSize(size_t buffer_size) { enforce(buffer_size >= 4096, "Buffer size must be >= 4096 bytes"); _buffer_size = buffer_size; _random_access_manager.setBufferSize(buffer_size); } package bool _seqprocmode; // available for bio.bam.readrange; private: string _filename; // filename (if available) Stream _source_stream; // compressed BgzfInputStream _decompressed_stream; // decompressed Stream _bam; // decompressed + endian conversion bool _stream_is_seekable; // Virtual offset at which alignment records start. VirtualOffset _reads_start_voffset; BaiFile _dont_access_me_directly_use_bai_file_for_that; enum BaiStatus { notInitialized, initialized, fileNotFound } BaiStatus _bai_status = BaiStatus.notInitialized; void initBai() { if (_bai_status == BaiStatus.notInitialized) { synchronized { try { _dont_access_me_directly_use_bai_file_for_that = BaiFile(_filename); _bai_status = BaiStatus.initialized; } catch (Exception e) { _bai_status = BaiStatus.fileNotFound; } } } } // provides access to index file @property ref BaiFile _bai_file() { // initialized lazily initBai(); return _dont_access_me_directly_use_bai_file_for_that; }; RandomAccessManager _rndaccssmgr; // unreadable for a purpose @property RandomAccessManager _random_access_manager() { if (_rndaccssmgr is null) { synchronized { initBai(); if (_bai_status == BaiStatus.initialized) { _rndaccssmgr = new RandomAccessManager(this, _bai_file); } else { _rndaccssmgr = new RandomAccessManager(this); } _rndaccssmgr.setTaskPool(_task_pool); _rndaccssmgr.setBufferSize(_buffer_size); } } return _rndaccssmgr; } SamHeader _header; string _headertext; // for lazy SAM header parsing ReferenceSequenceInfo[] _reference_sequences; int[string] _reference_sequence_dict; /// name -> index mapping TaskPool _task_pool; size_t _buffer_size = 4096; // buffer size to be used for I/O Stream getNativeEndianSourceStream() { assert(_filename !is null); Stream file = new bio.core.utils.stream.File(_filename); return new BufferedStream(file, _buffer_size); } Stream getSeekableCompressedStream() { if (_stream_is_seekable) { if (_filename !is null) { auto file = getNativeEndianSourceStream(); version(development) { std.stdio.stderr.writeln("[info] file size: ", file.size); } return new EndianStream(file, Endian.littleEndian); } else { _source_stream.seekSet(0); return _source_stream; } } else { return null; } } // get decompressed stream out of compressed BAM file BgzfInputStream getDecompressedStream() { auto compressed_stream = getSeekableCompressedStream(); auto block_supplier = new StreamSupplier(compressed_stream is null ? _source_stream : compressed_stream); return new BgzfInputStream(block_supplier, _task_pool, null, _buffer_size); } // get decompressed stream starting from the first alignment record BgzfInputStream getDecompressedBamReadStream() { auto compressed_stream = getSeekableCompressedStream(); if (compressed_stream !is null) { enforce(_reads_start_voffset != 0UL); compressed_stream.seekCur(_reads_start_voffset.coffset); auto block_supplier = new StreamSupplier(compressed_stream); auto stream = new BgzfInputStream(block_supplier, _task_pool, null, _buffer_size); stream.readString(_reads_start_voffset.uoffset); return stream; } else { // must be initialized in initializeStreams() return _decompressed_stream; } } // sets up the streams and ranges void initializeStreams() { _decompressed_stream = getDecompressedStream(); _bam = new EndianStream(_decompressed_stream, Endian.littleEndian); } // initializes _header void readSamHeader() { int l_text; _bam.read(l_text); _headertext = cast(string)(_bam.readString(l_text)); } // initialize _reference_sequences void readReferenceSequencesInfo() { int n_ref; _bam.read(n_ref); _reference_sequences = new ReferenceSequenceInfo[n_ref]; foreach (i; 0..n_ref) { _reference_sequences[i] = ReferenceSequenceInfo(_bam); // provide mapping Name -> Index _reference_sequence_dict[_reference_sequences[i].name] = i; } } } BioD-0.1.0/bio/bam/readrange.d000066400000000000000000000136521273003163100157350ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2014 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.readrange; import bio.bam.read; import bio.bam.abstractreader; import bio.bam.reader; import bio.core.bgzf.inputstream; import bio.core.bgzf.virtualoffset; import bio.core.utils.switchendianness; import std.stream; import std.algorithm; import std.system; /// Read + its start/end virtual offsets struct BamReadBlock { VirtualOffset start_virtual_offset; /// VirtualOffset end_virtual_offset; /// BamRead read; /// alias read this; /// /// BamReadBlock dup() @property const { return BamReadBlock(start_virtual_offset, end_virtual_offset, read.dup); } } /// mixin template withOffsets() { /** Returns: virtual offsets of beginning and end of the current read plus the current read itself. */ BamReadBlock front() @property { return BamReadBlock(_start_voffset, _stream.virtualTell(), _current_record); } private VirtualOffset _start_voffset; private void beforeNextBamReadLoad() { _start_voffset = _stream.virtualTell(); } } /// mixin template withoutOffsets() { /** Returns: current read */ ref BamRead front() @property { return _current_record; } private void beforeNextBamReadLoad() {} } /// $(D front) return type is determined by $(I IteratePolicy) struct BamReadRange(alias IteratePolicy) { /// Create new range from BgzfInputStream. this(BgzfInputStream stream, BamReader reader=null) { _stream = stream; _reader = reader; _endian_stream = new EndianStream(_stream, Endian.littleEndian); readNext(); } /// bool empty() @property const { return _empty; } mixin IteratePolicy; /// void popFront() { readNext(); } private: BgzfInputStream _stream; EndianStream _endian_stream; BamReader _reader; BamRead _current_record; bool _empty = false; ubyte[] _buffer; /* Reads next bamRead block from stream. */ void readNext() { // In fact, on BAM files containing a special EOF BGZF block // this condition will be always false! // // The reason is that we don't want to unpack next block just // in order to see if it's an EOF one or not. if (_stream.eof()) { _empty = true; return; } // In order to get the right virtual offset, we need to do it here. version(extraVerbose) { // import std.stdio; stderr.writeln("record v.o. = ", _stream.virtualTell()); } beforeNextBamReadLoad(); // (FIXME: that won't work on Big Endian systems!) // Here's where _empty is really set! int block_size = void; ubyte* ptr = cast(ubyte*)(&block_size); auto _read = 0; while (_read < int.sizeof) { auto _actually_read = _endian_stream.readBlock(ptr, int.sizeof - _read); if (_actually_read == 0) { version(development) { import std.stdio; stderr.writeln("[info][bamRead range] empty, read ", _read, " bytes, expected ", int.sizeof); } _empty = true; return; } _read += _actually_read; ptr += _actually_read; } version(extraVerbose) { import std.stdio; stderr.writeln("[uncompressed] record size: ", block_size); } if (std.system.endian != Endian.littleEndian) { switchEndianness(&block_size, int.sizeof); } ubyte[] data = void; if (_reader !is null && _reader._seqprocmode) { if (block_size > _buffer.length) _buffer.length = block_size; data = _buffer[0 .. block_size]; } else { data = allocate(block_size); } _stream.readExact(data.ptr, block_size); _current_record = BamRead(data); _current_record.associateWithReader(_reader); } private { ubyte[] allocate(size_t size) { if (_alloc_buffer_used + size > _alloc_buffer.length) { _alloc_buffer = uninitializedArray!(ubyte[])(max(size, 65536)); _alloc_buffer_used = 0; } auto result = _alloc_buffer[_alloc_buffer_used .. $][0 .. size]; _alloc_buffer_used += size; return result; } ubyte[] _alloc_buffer; size_t _alloc_buffer_used; } } /// Returns: lazy range of BamRead/BamReadBlock structs constructed from a given stream. auto bamReadRange(alias IteratePolicy=withoutOffsets)(BgzfInputStream stream, BamReader reader) { return BamReadRange!IteratePolicy(stream, reader); } BioD-0.1.0/bio/bam/reference.d000066400000000000000000000162151273003163100157410ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2014 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// $(P Each BAM file contains reads aligned to different reference sequences.) /// $(P These sequences have unique identifiers in BAM file, starting from 0. /// Unmapped reads are associated with id = -1.) /// $(P If BAI file is available, fast region queries are available, that is, /// getting all reads that overlap given region. This is achieved via $(D opSlice) method.) /// /// Example: /// ----------------------------- /// import bio.bam.reader, std.stdio; /// ... /// auto bam = new BamReader("file.bam"); /// auto refseq = bam["chr17"]; /// writeln(refseq.name, " - length ", refseq.length); /// foreach (read; refseq[1234 .. 5678]) /// if (read.cigar.length > 1) /// writeln(read.name, " ", read.cigarString()); /// ----------------------------- module bio.bam.reference; public import bio.bam.referenceinfo; import bio.bam.readrange; import bio.bam.region; import bio.bam.randomaccessmanager; import bio.core.bgzf.virtualoffset; import std.stream; import std.exception; import std.array; /// struct ReferenceSequence { private int _ref_id; /// Name string name() @property const { return _info.name; } /// Length in base pairs int length() @property const { return _info.length; } /// Reference ID int id() @property const { return _ref_id; } /// Get alignments overlapping [start, end) region. /// $(BR) /// Coordinates are 0-based. auto opSlice(uint start, uint end) { enforce(start < end, "start must be less than end"); enforce(_manager !is null, "random access is not available"); enforce(_ref_id >= 0, "invalid reference id"); return _manager.getReads(BamRegion(cast(uint)_ref_id, start, end)); } /// Get all alignments for this reference auto opSlice() { return opSlice(0, length); } private alias typeof(opSlice().front) Read; private Read _first_read() @property { return opSlice().front.dup; } /// Virtual offset at which reads, aligned to this reference, start in BAM file. /// If there are no reads aligned to this reference, returns virtual /// offset of the EOF block if it's presented, or the end of file. bio.core.bgzf.virtualoffset.VirtualOffset startVirtualOffset() { auto reads = opSlice(); if (reads.empty) { return _manager.eofVirtualOffset(); } return reads.front.start_virtual_offset; } /// Virtual offset before which reads, aligned to this reference, stop. /// If there are no reads aligned to this reference, returns virtual /// offset of the EOF block if it's presented, or the end of file. bio.core.bgzf.virtualoffset.VirtualOffset endVirtualOffset() { if (opSlice().empty) { return _manager.eofVirtualOffset(); } auto ioffsets = _manager.getBai().indices[_ref_id].ioffsets[]; assert(ioffsets.length > 0); // Try to get startVirtualOffset of the next reference presented in the file. for (uint r = _ref_id + 1; r < _manager.getBai().indices.length; ++r) { auto reads = _manager.getReads(BamRegion(r, 0, uint.max)); if (reads.empty) { continue; } else { return reads.front.start_virtual_offset; } } // However, this approach fails if there are unmapped reads coming after // this reference. We cannot just return _manager.eofVirtualOffset. auto last_offset = ioffsets[$ - 1]; auto stream = _manager.createStreamStartingFrom(last_offset); auto last_few_reads = bamReadRange!withOffsets(stream, null); VirtualOffset result; assert(!last_few_reads.empty); foreach (read; last_few_reads) { if (read.ref_id == -1) break; result = read.end_virtual_offset; } return result; } /// First position on the reference overlapped by reads (0-based) /// $(BR) /// Returns -1 if set of reads is empty. int firstPosition() { auto reads = opSlice(); if (reads.empty) { return -1; } return reads.front.position; } /// Last position on the reference overlapped by reads (0-based) /// $(BR) /// Returns -1 if set of reads is empty. int lastPosition() { // The key idea is // 1) use last offset from linear index // 2) loop through all remaining reads starting from there auto ioffsets = _manager.getBai().indices[_ref_id].ioffsets[]; long index = ioffsets.length - 1; debug { int reads_processed = 0; } while (index >= 0) { auto offset = ioffsets[cast(size_t)index]; auto stream = _manager.createStreamStartingFrom(offset); auto reads = bamReadRange(stream, null); int last_position = int.min; foreach (read; reads) { debug { reads_processed += 1; } if (read.ref_id != _ref_id) { break; } if (read.position == -1) { continue; } auto end_pos = read.position + read.basesCovered(); if (end_pos > last_position) last_position = end_pos; } if (last_position != int.min) { debug { import std.stdio; stderr.writeln("[debug] ReferenceSequence.lastPosition() processed ", reads_processed, " reads"); } return last_position - 1; } --index; } return firstPosition(); } this(RandomAccessManager manager, int ref_id, ReferenceSequenceInfo info) { _manager = manager; _ref_id = ref_id; _info = info; } private: RandomAccessManager _manager; ReferenceSequenceInfo _info; } BioD-0.1.0/bio/bam/referenceinfo.d000066400000000000000000000041051273003163100166100ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.referenceinfo; import std.stream; import std.exception; import std.array; /** Stores basic information about reference sequence. */ struct ReferenceSequenceInfo { private { string _name; int _length; } /// Reference sequence name /// (null byte is guaranteed to follow the returned slice) string name() @property const nothrow { return _name[0 .. $ - 1]; } /// Reference sequence length int length() @property const { return _length; } /// this(string name, int length) { _name = name ~ '\0'; _length = length; } /// Constructs the structure from input stream this(ref Stream stream) { int l_name; // length of the reference name plus one stream.read(l_name); _name = cast(string)stream.readString(l_name); // keep '\0' at the end stream.read(_length); } } BioD-0.1.0/bio/bam/region.d000066400000000000000000000045271273003163100152710ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2014 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.region; /// struct BamRegion { uint ref_id; /// Reference ID in the BAM file uint start; /// 0-based leftmost coordinate (included) uint end; /// 0-based rightmost coordinate (excluded) int opCmp(const ref BamRegion other) const nothrow { if (this.ref_id > other.ref_id) { return 1; } if (this.ref_id < other.ref_id) { return -1; } if (this.start > other.start) { return 1; } if (this.start < other.start) { return -1; } if (this.end > other.end) { return 1; } if (this.end < other.end) { return -1; } return 0; } bool overlaps(uint ref_id, uint position) const { return this.ref_id == ref_id && start <= position && position < end; } bool fullyLeftOf(uint ref_id, uint position) { if (this.ref_id < ref_id) return true; if (this.ref_id == ref_id && end <= position) return true; return false; } bool fullyRightOf(uint ref_id, uint position) { if (this.ref_id > ref_id) return true; if (this.ref_id == ref_id && start > position) return true; return false; } } BioD-0.1.0/bio/bam/snpcallers/000077500000000000000000000000001273003163100157775ustar00rootroot00000000000000BioD-0.1.0/bio/bam/snpcallers/maq.d000066400000000000000000000354551273003163100167360ustar00rootroot00000000000000module bio.bam.snpcallers.maq; /* * The code below is based on errmod.c from Samtools. */ import core.stdc.math; import std.math : LN2, LN10, isnan; import std.traits; import std.range; import std.algorithm; import std.random; import std.typecons; import bio.bam.md.reconstruct; import bio.bam.pileup; import bio.core.base; import bio.core.genotype; import bio.core.call; import bio.core.tinymap; struct BaseWithStrand { immutable ValueSetSize = Base.ValueSetSize * 2; private ubyte _code; ubyte internal_code() @property const { return _code; } static BaseWithStrand fromInternalCode(ubyte code) { BaseWithStrand bws = void; bws._code = code; return bws; } this(Base b, bool is_reverse) { _code = cast(ubyte)(b.internal_code * 2 + (is_reverse ? 1 : 0)); } Base base() @property const { return Base.fromInternalCode(_code / 2); } bool is_reverse_strand() @property const { return (_code & 1) == 1; } } struct ReadBase { BaseWithStrand base_with_strand; alias base_with_strand this; private ubyte _quality; this(Base b, ubyte quality, bool is_reverse) { base_with_strand = BaseWithStrand(b, is_reverse); _quality = quality; } ubyte quality() @property const { return _quality; } } struct ErrorModelCoefficients { private { // _fk[n] = (1 - depcorr)^n * (1 - eta) + eta double[] _fk; // _beta[q << 16 | n << 8 | k ] = see MAQ paper for meaning of \beta double[] _beta; // _lhet[n << 8 | k] = log(1/2^n * choose(n, k)) double[] _lhet; immutable Base[4] nucleotides = [Base('A'), Base('C'), Base('G'), Base('T')]; } this(double depcorr, double eta) { _fk.length = 256; _beta.length = 256 * 256 * 64; _lhet.length = 256 * 256; foreach (n, ref v; _fk) { v = core.stdc.math.pow(1.0 - depcorr, cast(double)n) * (1.0 - eta) + eta; } // lC[n][k] = log(choose(n, k)) double[256][256] lC; // lG[n] = logGamma(n + 1) double[256] lG; for (size_t n = 0; n <= 255; ++n) { lG[n] = core.stdc.math.lgamma(cast(double)(n + 1)); for (size_t k = 0; k <= n / 2; ++k) { lC[n][n-k] = lC[n][k] = lG[n] - lG[k] - lG[n-k]; // fill _lhet simultaneously _lhet[n << 8 | (n-k)] = _lhet[n << 8 | k] = lC[n][k] - n * cast(double)LN2; } } for (size_t q = 1; q < 64; ++q) { real e = 10.0 ^^ (-(cast(real)q) / 10.0); real le = core.stdc.math.logl(e); real le1 = core.stdc.math.logl(1.0 - e); for (int n = 1; n <= 255; ++n) { real sum, sum1; sum = sum1 = 0.0; for (int k = n; k >= 0; --k) { sum = sum1 + core.stdc.math.expl(lC[n][k] + k * le + (n-k) * le1); _beta[q << 16 | n << 8 | k] = -10.0 / LN10 * core.stdc.math.logl(sum1 / sum); sum1 = sum; } } } } double fk(size_t n) const { return _fk[n]; } double beta(uint quality, size_t n, size_t k) const { return _beta[quality << 16 | n << 8 | k]; } double lhet(size_t n, size_t k) const { return _lhet[n << 8 | k]; } alias TinyMap!(DiploidGenotype!Base5, float, useDefaultValue) Dict; private immutable C = 10.0 / LN10; Dict computeLikelihoods(R)(R read_bases, bool symmetric=false) const if (is(ElementType!R == ReadBase) && hasLength!R) { // if there're more than 255 reads, subsample them ReadBase[255] buf = void; if (read_bases.length > buf.length) { copy(randomSample(read_bases, buf.length), buf[]); } else { copy(read_bases, buf[]); } auto bases = buf[0 .. min(read_bases.length, $)]; sort!"a.quality < b.quality"(bases); auto w = TinyMap!(BaseWithStrand, uint, fillNoRemove)(0); auto c = TinyMap!(Base, uint, fillNoRemove)(0); auto fsum = TinyMap!(Base, double, fillNoRemove)(0.0); auto bsum = TinyMap!(Base, double, fillNoRemove)(0.0); foreach_reverse (ref read_base; bases) { auto quality = read_base.quality; if (quality < 4) quality = 4; if (quality > 63) quality = 63; auto bws = read_base.base_with_strand; auto b = bws.base; fsum[b] += fk(w[bws]); bsum[b] += fk(w[bws]) * beta(quality, bases.length, c[b]); c[b] += 1; w[bws] += 1; } alias diploidGenotype dG; auto q = Dict(float.min); foreach (i, b1; nucleotides) { float tmp1 = 0.0; int tmp2; float tmp3 = 0.0; // homozygous foreach (k, b2; nucleotides) { if (k != i) { tmp1 += bsum[b2]; tmp2 += c[b2]; tmp3 += fsum[b2]; } } auto b1_5 = cast(Base5)b1; if (tmp2 > 0) { q[dG(b1_5)] = tmp1; } else { q[dG(b1_5)] = 0.0; } // heterozygous for (size_t j = i + 1; j < nucleotides.length; ++j) { auto b2 = nucleotides[j]; int cij = c[b1] + c[b2]; tmp1 = tmp3 = 0.0; tmp2 = 0; foreach (k, b3; nucleotides) { if (k != i && k != j) { tmp1 += bsum[b3]; tmp2 += c[b3]; tmp3 += fsum[b3]; } } auto b2_5 = cast(Base5)b2; if (tmp2 > 0) { q[dG(b2_5, b1_5)] = tmp1 - C * lhet(cij, c[b2]); } else { q[dG(b2_5, b1_5)] = -C * lhet(cij, c[b2]); } if (symmetric) { q[dG(b1_5, b2_5)] = q[dG(b2_5, b1_5)]; } } foreach (k, b2; nucleotides) { auto g = dG(b1_5, cast(Base5)b2); if (g in q) { if (q[g] < 0.0) q[g] = 0.0; } } } return q; } } // Encapsulates information about genotype likelihoods at a site. struct GenotypeLikelihoodInfo { alias ErrorModelCoefficients.Dict ScoreDict; alias DiploidGenotype!Base5 Gt; this(ScoreDict dict) { _dict = dict; size_t k = 0; // copy all data into a buffer, combining that with insertion sort foreach (gt, score; _dict) { if (k == 0) { gt_buf[k++] = gt; } else { size_t j = k; while (j > 0 && _dict[gt_buf[j-1]] > score) { gt_buf[j] = gt_buf[j-1]; --j; } gt_buf[j] = gt; ++k; } } assert(k >= 2); _count = cast(ubyte)k; } size_t count() @property const { return _count; } static struct GtInfo { private { Gt _gt; float _prob; } Gt genotype() @property const { return _gt; } float score() @property const { return _prob; } } GtInfo opIndex(size_t index) { assert(index < count); auto gt = gt_buf[index]; return GtInfo(gt, _dict[gt]); } private Gt[25] gt_buf; private ubyte _count; private ScoreDict _dict; } class ErrorModel { private { float _depcorr; float _eta; ErrorModelCoefficients _coef; } this(float depcorr, float eta=0.03) { _depcorr = depcorr; _eta = eta; _coef = ErrorModelCoefficients(_depcorr, _eta); } const(ErrorModelCoefficients) coefficients() @property const { return _coef; } alias coefficients this; } /// Class for calling SNPs using MAQ model. /// /// Typical usage: /// auto caller = new MaqSnpCaller(); /// caller.minimum_call_quality = 20.0f; /// caller.minimum_base_quality = 13; /// foreach (snp; caller.findSNPs(reads)) { ... } /// final class MaqSnpCaller { private float _depcorr = 0.17; private float _eta = 0.03; private float _minimum_call_quality = 6.0; private ubyte _minimum_base_quality = 13; private bool _need_to_recompute_errmod = true; /// float depcorr() @property const { return _depcorr; } /// ditto void depcorr(float f) @property { _depcorr = f; _need_to_recompute_errmod = true; } /// float eta() @property const { return _eta; } /// void eta(float f) @property { _eta = f; _need_to_recompute_errmod = true; } /// Minimum call quality float minimum_call_quality() @property const { return _minimum_call_quality; } /// ditto void minimum_call_quality(float f) @property { _minimum_call_quality = f; } /// Discard reads with base quality less than this at a site ubyte minimum_base_quality() @property const { return _minimum_base_quality; } void minimum_base_quality(ubyte q) @property { _minimum_base_quality = q; } ErrorModel errmod() @property { if (_need_to_recompute_errmod) { synchronized { if (_need_to_recompute_errmod) { _errmod = new ErrorModel(_depcorr, _eta); _need_to_recompute_errmod = false; } } } return _errmod; } private ErrorModel _errmod; /// Get genotype likelihoods final GenotypeLikelihoodInfo genotypeLikelihoodInfo(C)(C column) { version(MaqCaller8192) { ReadBase[8192] buf = void; } size_t num_of_valid_bases = 0; foreach (read; column.reads) { version(MaqCaller8192) { if (num_of_valid_bases == 8192) break; } if (read.current_base_quality < minimum_base_quality) continue; if (read.current_base == '-') continue; version(MaqCaller8192) { buf[num_of_valid_bases] = ReadBase(Base(read.current_base), min(read.current_base_quality, read.mapping_quality), read.is_reverse_strand); } num_of_valid_bases++; } static struct ReadBaseRange(R) { private R _reads = void; private ubyte minimum_base_quality = void; this(R reads, ubyte minbq) { _reads = reads; minimum_base_quality = minbq; _findNextValid(); } ReadBase front() @property { auto read = _reads.front; return ReadBase(Base(read.current_base), min(read.current_base_quality, read.mapping_quality), read.is_reverse_strand); } bool empty() @property { return _reads.empty; } void popFront() { _reads.popFront(); _findNextValid(); } ReadBaseRange save() @property { return ReadBaseRange!R(_reads, minimum_base_quality); } private void _findNextValid() { while (!_reads.empty && (_reads.front.current_base_quality < minimum_base_quality || _reads.front.current_base == '-')) { _reads.popFront(); } } } if (num_of_valid_bases == 0) { GenotypeLikelihoodInfo result; return result; } version(MaqCaller8192) { ReadBase[] rbs = buf[0 .. num_of_valid_bases]; auto likelihood_dict = errmod.computeLikelihoods(rbs); } else { auto rbs = ReadBaseRange!(typeof(column.reads))(column.reads, minimum_base_quality); auto likelihood_dict = errmod.computeLikelihoods(takeExactly(rbs, num_of_valid_bases)); } return GenotypeLikelihoodInfo(likelihood_dict); } /// Make call on a pileup column final Nullable!DiploidCall5 makeCall(C)(C column, string reference="", string sample="") { auto gts = genotypeLikelihoodInfo(column); Nullable!DiploidCall5 result; if (gts.count < 2) return result; static if (__traits(compiles, column.reference_base)) { auto refbase = Base5(column.reference_base); } else { auto refbase = Base5('N'); } if (sample == "") { auto rg = column.reads.front["RG"]; if (!rg.is_nothing) { sample = cast(string)rg; } } result = DiploidCall5(sample, reference, column.position, refbase, gts[0].genotype, gts[1].score - gts[0].score); return result; } /// main method of this class auto findSNPs(P)(P pileup_columns, string reference="", string sample="") { static assert(__traits(compiles, {pileup_columns.front.reference_base;})); static struct Result { private MaqSnpCaller _caller; private P _pileup; private DiploidCall5 _front; private bool _empty; private string _reference; private string _sample; this(MaqSnpCaller caller, P pileup, string reference, string sample) { _caller = caller; _pileup = pileup; _reference = reference; _sample = sample; _fetchNextSNP(); } DiploidCall5 front() @property { return _front; } bool empty() @property { return _empty; } void popFront() { _pileup.popFront(); _fetchNextSNP(); } private void _fetchNextSNP() { while (true) { if (_pileup.empty) { _empty = true; break; } auto call = _caller.makeCall(_pileup.front, _reference, _sample); if (!call.isNull && call.is_variant && call.quality > _caller.minimum_call_quality) { _front = call.get; break; } else { _pileup.popFront(); } } } } return Result(this, pileup_columns, reference, sample); } } BioD-0.1.0/bio/bam/snpcallers/simple.d000066400000000000000000000021571273003163100174420ustar00rootroot00000000000000module bio.bam.snpcallers.simple; import bio.bam.pileup; import bio.core.utils.algo; import std.algorithm; struct SimpleCallerSettings { int minimum_coverage = 5; int minimum_witnesses = 2; } SimpleCallerSettings defaultSettings; bool isSNP(C)(C column, ref SimpleCallerSettings settings) { if (column.coverage < settings.minimum_coverage) { return false; } int[char] bases_count; foreach (read; column.reads) { if (read.current_base != '-') { bases_count[read.current_base] += 1; } } if (bases_count.length == 0) { // e.g. all overlapping reads have deletions at this location return false; } auto consensus = argmax!(base => bases_count[base])(bases_count.byKey()); if (bases_count[consensus] < settings.minimum_witnesses) { return false; } return consensus != column.reference_base; } auto findSNPs(R)(R reads, ref SimpleCallerSettings settings=defaultSettings) { auto columns = pileupWithReferenceBases(reads); return filter!(column => isSNP(column, settings))(filter!"a.coverage > 0"(columns)); } BioD-0.1.0/bio/bam/splitter.d000066400000000000000000000067161273003163100156560ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.splitter; import bio.bam.read; import std.array; import std.functional; import std.range; import std.traits; /// Constructs range of chunks where sum { fn(read) | read in chunk } /// does not exceed given number. struct ReadRangeSplitter(R, alias fn) { this(R range, size_t threshold, bool split_by_ref) { _range = range; _size = threshold; _split_by_ref = split_by_ref; _appender = appender!(ElementType!R[])(); getNextChunk(); } private { R _range; bool _empty; bool _split_by_ref; size_t _size; Appender!(ElementType!R[]) _appender; } bool empty() @property { return _empty; } ElementType!R[] front() @property { return _appender.data.dup; } void popFront() { _appender.clear(); getNextChunk(); } private void getNextChunk() { if (_range.empty) { _empty = true; return; } auto first_read = _range.front; _range.popFront(); size_t total_size = first_read.size_in_bytes; auto average_size_estimate = unaryFun!fn(first_read); _appender.reserve(_size / average_size_estimate); _appender.put(first_read); while (total_size <= _size && !_range.empty) { auto read = _range.front; if (_split_by_ref && (read.ref_id != first_read.ref_id)) { break; } total_size += unaryFun!fn(read); _appender.put(read); _range.popFront(); } } } /// Split range in chunks where total amount of memory consumed by all reads /// in the chunk is roughly chunk_size bytes. /// /// Parameter $(D split_by_ref) specifies that each chunk should contain reads /// aligned to the same reference. In most cases, this simplifies post-processing, /// but in some cases this is not required, therefore it is optional. auto chunksConsumingLessThan(R)(R reads, size_t size_in_bytes, bool split_by_ref=true) { return ReadRangeSplitter!(R, "a.size_in_bytes")(reads, size_in_bytes, split_by_ref); } /// Split range in chunks each containing no more than N reads auto chunksOfSize(R)(R reads, size_t N, bool split_by_ref=true) { return ReadRangeSplitter!(R, "1")(reads, N, split_by_ref); } BioD-0.1.0/bio/bam/tagvalue.d000066400000000000000000000503261273003163100156140ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2014 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// BAM records may carry arbitrary information in tags. /// $(BR) /// $(D Value) type provides convenient way to work with this information. /// /// Example: /// -------------------------------- /// import bio.bam.reader, bio.bam.tagvalue; /// ... /// auto bam = new BamReader("file.bam"); /// Value v = bam.reads.front["MD"]; /// assert(v.is_string); /// v = 5; /// assert(v.is_signed); // because 5 is of type int which is signed /// assert(v == "5"); // converted to string and then compared /// v = "abc"; /// assert(v.is_string); /// v = [1, 2, 3]; // integer and float arrays are supported /// assert(v.is_numeric_array); /// v = [1.5f, 2.3f, 17.0f]; // double[] arrays must be converted to float[] /// assert(v.is_numeric_array); /// v = 5.6; /// assert(v.is_float); /// v = -17; /// assert(v.is_signed); /// ---------------------------------- module bio.bam.tagvalue; public import std.conv; import std.typetuple; import std.exception; import std.format; import std.array; import bio.core.utils.format; import bio.bam.thirdparty.msgpack; struct CharToType(char c, T) { /** symbol */ enum ch = c; /** type which corresponds to the symbol according to SAM/BAM specification */ alias T ValueType; } /** Thrown in case of unrecognized tag type */ class UnknownTagTypeException : Exception { this(string msg) { super(msg); } } alias TypeTuple!(CharToType!('A', char), CharToType!('c', byte), CharToType!('C', ubyte), CharToType!('s', short), CharToType!('S', ushort), CharToType!('i', int), CharToType!('I', uint), CharToType!('f', float)) PrimitiveTagValueTypes; alias TypeTuple!(CharToType!('Z', string), CharToType!('H', string)) StringTagValueTypes; alias TypeTuple!(CharToType!('c', byte), CharToType!('C', ubyte), CharToType!('s', short), CharToType!('S', ushort), CharToType!('i', int), CharToType!('I', uint), CharToType!('f', float)) ArrayElementTagValueTypes; /* Useful in TagStorage implementations, for skipping elements Params: c = primitive type identifier Returns: size of corresponding type in bytes */ uint charToSizeof(char c) { string charToSizeofHelper() { char[] cases; foreach (c2t; PrimitiveTagValueTypes) { cases ~= "case '"~c2t.ch~"':"~ " return "~to!string(c2t.ValueType.sizeof)~";".dup; } return "switch (c) { " ~ cases.idup ~ " default: " ~ " throw new UnknownTagTypeException(to!string(c));"~ "}"; } mixin(charToSizeofHelper()); } /* Pair of type and its ubyte identifier. (Currently, ubyte is enough, but that might change in the future.) */ struct TypeId(T, ubyte id) { enum Id = id; alias T Type; } /* Structure of type identifier: 0 1 primitive array/string something null/nothing numeric string numeric char 0 0 Z H integer float 0 [see left 0 0 unsigned signed 0 0 branch] 0 0 [ size in bytes] [size in bytes] 0 [element size] 1 1 (TypeId >> 5) == elementType.sizeof */ alias TypeTuple!(TypeId!(char, 0b001_00_1_00), TypeId!(ubyte, 0b001_0_0000), TypeId!(ushort, 0b010_0_0000), TypeId!(uint, 0b100_0__0__0__0__0), /* Let's take 4 u i n s p uint as an n n u o r example b s t m m i y i e e e m t g g r t i e n e i h t s e r c i i d n v g e */ TypeId!(byte, 0b001_1_0000), TypeId!(short, 0b010_1_0000), TypeId!(int, 0b100_1_0000), TypeId!(float, 0b100_01_000), TypeId!(ubyte[], 0b001_000_01), TypeId!(ushort[], 0b010_000_01), TypeId!(uint[], 0b100_000_01), TypeId!(byte[], 0b001_100_01), TypeId!(short[], 0b010_100_01), TypeId!(int[], 0b100_100_01), TypeId!(float[], 0b100_01_001), TypeId!(string, 0b001_00_101), TypeId!(string, 0b001_01_101), TypeId!(typeof(null), 0b0000_0010)) TypeIdMap; private immutable hexStringTag = 0b001_01_101; private template GetType(U) { alias U.Type GetType; } /// Get tag for type T. /// /// Useful for comparison with tag field of Value struct. /// /// Example: /// ----------------------------------- /// Value v = "zzz"; /// assert(v.tag == GetTypeId!string); /// ----------------------------------- template GetTypeId(T) { /// enum GetTypeId = TypeIdMap[staticIndexOf!(T, staticMap!(GetType, TypeIdMap))].Id; } string generateUnion() { char[] u = "union U {".dup; foreach (t; PrimitiveTagValueTypes) { u ~= t.ValueType.stringof ~ " " ~ t.ch ~ ";".dup; } foreach (t; StringTagValueTypes) { u ~= t.ValueType.stringof ~ " " ~ t.ch ~ ";".dup; } foreach (t; ArrayElementTagValueTypes) { u ~= t.ValueType.stringof ~ "[] " ~ 'B' ~ t.ch ~ ";".dup; } u ~= "}; U u;".dup; return u.idup; } template ArrayOf(T) { alias T[] ArrayOf; } string injectOpAssign() { char[] cs; foreach (t; PrimitiveTagValueTypes) { cs ~= "final void opAssign(" ~ t.ValueType.stringof ~ " value) {" ~ " this.u." ~ t.ch ~ " = value;" ~ " this._tag = " ~ to!string(GetTypeId!(t.ValueType)) ~ ";" ~ " this.bam_typeid = '" ~ t.ch ~ "';" ~ "}"; } cs ~= "final void opAssign(string value) {" ~ " this.u.Z = value;" ~ " this._tag = " ~ to!string(GetTypeId!string) ~ ";" ~ " this.bam_typeid = 'Z';" ~ "}"; foreach (t; ArrayElementTagValueTypes) { cs ~= "final void opAssign(" ~ t.ValueType.stringof ~ "[] value) {" ~ " this.u.B" ~ t.ch ~ " = value;" ~ " this._tag = " ~ to!string(GetTypeId!(ArrayOf!(t.ValueType))) ~ ";" ~ " this.bam_typeid = '" ~ t.ch ~ "';" ~ "}"; } return cs.idup; } string injectOpCast() { char[] cs = "static if".dup; string injectSwitchPrimitive(string requested_type) { char[] cs = `switch (_tag) {`.dup; foreach (t2; PrimitiveTagValueTypes) { cs ~= `case GetTypeId!`~t2.ValueType.stringof~`: `~ ` return to!T(u.`~t2.ch~`);`.dup; } cs ~= ` default: throw new ConvException("Cannot convert Value to `~ requested_type~`");`~ `}`; return cs.idup; } string injectSwitchArrayElement(string requested_type) { char[] cs = `switch (_tag) {`.dup; foreach (t2; ArrayElementTagValueTypes) { cs ~= `case GetTypeId!(`~t2.ValueType.stringof~`[]): `~ ` return to!T(u.B`~t2.ch~`);`.dup; } cs ~= ` default: throw new ConvException("Cannot convert Value to `~ requested_type~`");`~ `}`; return cs.idup; } foreach (t; TypeTuple!(byte, ubyte, short, ushort, int, uint, char, float, double, real, long, ulong)) { cs ~= `(is(T == `~t.stringof~`)) {`~ injectSwitchPrimitive(t.stringof)~ `} else static if`.dup; } foreach (t; ArrayElementTagValueTypes) { cs ~= `(is(T == ` ~ t.ValueType.stringof ~ `[])) {` ~ injectSwitchArrayElement(t.ValueType.stringof ~ "[]")~ `} else static if `; } cs ~= `(is(T == string)) {` ~ ` if (is_string) {` ` return bam_typeid == 'Z' ? u.Z : u.H;`~ ` } else if (is_integer || is_float || is_character) {`~ ` `~injectSwitchPrimitive("string")~ ` } else {`~ injectSwitchArrayElement("string")~ ` }`~ `}`.dup; return "final T opCast(T)() const {" ~ cs.idup ~ "}"; } /** Struct for representing tag values. Tagged union, allows to store 8/16/32-bit integers, floats, chars, strings, and arrays of integers/floats. */ struct Value { /* Notice that having union first allows to do simple casts, without using opCast(). That's a bit hackish but allows for better speed. */ private mixin(generateUnion()); /** If this is an array, one of [cCsSiIf]. Otherwise, one of [AcCsSiIfZH] See SAM/BAM specification for details. */ public char bam_typeid; /* WARNING: Currently, type identifier for (u)int requires 8 bits. Fortunately, SAM/BAM specification doesn't use bigger integer types. However, in case of need to extend the hierarchy, the type should be changed from ubyte to something bigger. */ ubyte _tag; /// Designates the type of currently stored value. /// /// Supposed to be used externally for checking type with GetTypeId. ubyte tag() @property const { return _tag; } mixin(injectOpAssign()); mixin(injectOpCast()); /// final void opAssign(Value v) { bam_typeid = v.bam_typeid; _tag = v._tag; u = v.u; } /// ditto final void opAssign(typeof(null) n) { _tag = GetTypeId!(typeof(null)); } /// final bool opEquals(T)(const T val) { try { return to!T(this) == val; } catch (ConvException e) { return false; } } /// string toString() const { return opCast!string(); } /// this(T)(T value) { opAssign(value); } /// sets 'H' tag instead of default 'Z'. Is not expected to be used much. void setHexadecimalFlag() { enforce(this.is_string); bam_typeid = 'H'; _tag = hexStringTag; if (_tag != 0b111) { u.H = u.Z; } } /// Holds $(D null). Represents non-existing tag. Such values are used to remove tags. bool is_nothing() @property const { return _tag == GetTypeId!(typeof(null)); } /// char bool is_character() @property const { return _tag == GetTypeId!char; } /// float bool is_float() @property const { return _tag == GetTypeId!float; } /// ubyte[]/byte[]/ushort[]/short[]/uint[]/int[]/float[] bool is_numeric_array() @property const { return (_tag & 0b111) == 0b001; } /// ubyte[]/byte[]/ushort[]/short[]/uint[]/int[] bool is_array_of_integers() @property const { return (_tag & 0b1111) == 0b0001; } /// float[] bool is_array_of_floats() @property const { return (_tag & 0b1111) == 0b1001; } /// ubyte/byte/ushort/short/uint/int bool is_integer() @property const { return (_tag & 0b1111) == 0; } /// ubyte/ushort/uint bool is_unsigned() @property const { return (_tag & 0b11111) == 0; } /// byte/short/int bool is_signed() @property const { return (_tag & 0b11111) == 0b10000; } /// 'Z' or 'H' tag bool is_string() @property const { return (_tag & 0b111) == 0b101; } /// 'H' tag bool is_hexadecimal_string() @property const { return (_tag & 0b1101) == 0b1101; } /// Serializes value in MessagePack format public void toMsgpack(Packer)(ref Packer packer) const { switch (_tag) { case GetTypeId!byte: packer.pack(*cast(byte*)(&u)); break; case GetTypeId!ubyte: packer.pack(*cast(ubyte*)(&u)); break; case GetTypeId!short: packer.pack(*cast(short*)(&u)); break; case GetTypeId!ushort: packer.pack(*cast(ushort*)(&u)); break; case GetTypeId!int: packer.pack(*cast(int*)(&u)); break; case GetTypeId!uint: packer.pack(*cast(uint*)(&u)); break; case GetTypeId!float: packer.pack(*cast(float*)(&u)); break; case GetTypeId!string: packer.pack(*cast(char[]*)(&u)); break; case hexStringTag: packer.pack(*cast(char[]*)(&u)); break; case GetTypeId!char: packer.pack(*cast(ubyte*)(&u)); break; case GetTypeId!(byte[]): packer.pack(*cast(byte[]*)(&u)); break; case GetTypeId!(ubyte[]): packer.pack(*cast(ubyte[]*)(&u)); break; case GetTypeId!(short[]): packer.pack(*cast(short[]*)(&u)); break; case GetTypeId!(ushort[]): packer.pack(*cast(ushort[]*)(&u)); break; case GetTypeId!(int[]): packer.pack(*cast(int[]*)(&u)); break; case GetTypeId!(uint[]): packer.pack(*cast(uint[]*)(&u)); break; case GetTypeId!(float[]): packer.pack(*cast(float[]*)(&u)); break; case GetTypeId!(typeof(null)): packer.pack(null); break; default: break; } } /// SAM representation string toSam()() const { auto w = appender!(char[])(); toSam((const(char)[] s) { w.put(s); }); return cast(string)w.data; } /// ditto void toSam(Sink)(auto ref Sink sink) const if (isSomeSink!Sink) { if (is_integer) { sink.write("i:"); switch (_tag) { case GetTypeId!byte: sink.write(*cast(byte*)(&u)); break; case GetTypeId!ubyte: sink.write(*cast(ubyte*)(&u)); break; case GetTypeId!short: sink.write(*cast(short*)(&u)); break; case GetTypeId!ushort: sink.write(*cast(ushort*)(&u)); break; case GetTypeId!int: sink.write(*cast(int*)(&u)); break; case GetTypeId!uint: sink.write(*cast(uint*)(&u)); break; default: break; } } else if (is_numeric_array) { sink.write("B:"); sink.write(bam_typeid); sink.write(','); switch (_tag) { case GetTypeId!(byte[]): sink.writeArray(*cast(byte[]*)(&u), ','); break; case GetTypeId!(ubyte[]): sink.writeArray(*cast(ubyte[]*)(&u), ','); break; case GetTypeId!(short[]): sink.writeArray(*cast(short[]*)(&u), ','); break; case GetTypeId!(ushort[]): sink.writeArray(*cast(ushort[]*)(&u), ','); break; case GetTypeId!(int[]): sink.writeArray(*cast(int[]*)(&u), ','); break; case GetTypeId!(uint[]): sink.writeArray(*cast(uint[]*)(&u), ','); break; case GetTypeId!(float[]): sink.writeArray(*cast(float[]*)(&u), ','); break; default: break; } } else { switch (_tag) { case GetTypeId!float: sink.write("f:"); sink.write(*cast(float*)(&u)); break; case GetTypeId!string: sink.write("Z:"); sink.write(*cast(const(char)[]*)(&u)); break; case hexStringTag: sink.write("H:"); sink.write(*cast(const(char)[]*)(&u)); break; case GetTypeId!char: sink.write("A:"); sink.write(*cast(char*)(&u)); break; default: break; } } } /// JSON representation string toJson()() const { auto w = appender!(char[])(); toJson((const(char)[] s) { w.put(s); }); return cast(string)w.data; } /// ditto void toJson(Sink)(auto ref Sink sink) const if (isSomeSink!Sink) { switch (_tag) { case GetTypeId!byte: sink.writeJson(*cast(byte*)(&u)); break; case GetTypeId!ubyte: sink.writeJson(*cast(ubyte*)(&u)); break; case GetTypeId!short: sink.writeJson(*cast(short*)(&u)); break; case GetTypeId!ushort: sink.writeJson(*cast(ushort*)(&u)); break; case GetTypeId!int: sink.writeJson(*cast(int*)(&u)); break; case GetTypeId!uint: sink.writeJson(*cast(uint*)(&u)); break; case GetTypeId!(byte[]): sink.writeJson(*cast(byte[]*)(&u)); break; case GetTypeId!(ubyte[]): sink.writeJson(*cast(ubyte[]*)(&u)); break; case GetTypeId!(short[]): sink.writeJson(*cast(short[]*)(&u)); break; case GetTypeId!(ushort[]): sink.writeJson(*cast(ushort[]*)(&u)); break; case GetTypeId!(int[]): sink.writeJson(*cast(int[]*)(&u)); break; case GetTypeId!(uint[]): sink.writeJson(*cast(uint[]*)(&u)); break; case GetTypeId!(float[]): sink.writeJson(*cast(float[]*)(&u)); break; case GetTypeId!float: sink.writeJson(*cast(float*)(&u)); break; case GetTypeId!string: sink.writeJson(*cast(string*)(&u)); break; case hexStringTag: sink.writeJson(*cast(string*)(&u)); break; case GetTypeId!char: sink.writeJson(*cast(char*)(&u)); break; default: break; } } } Value readValueFromArray(char type, const(ubyte)[] bytes, ref size_t offset) { string readValueArrayTypeHelper() { char[] cases; foreach (c2t; ArrayElementTagValueTypes) { cases ~= "case '"~c2t.ch~"':".dup~ " auto begin = offset;"~ " auto end = offset + length * "~c2t.ValueType.stringof~".sizeof;"~ " offset = end;"~ " return Value(cast("~c2t.ValueType.stringof~"[])(bytes[begin .. end]));"; } return to!string("switch (elem_type) {" ~ cases ~ " default: throw new UnknownTagTypeException(to!string(elem_type));"~ "}"); } string readValuePrimitiveTypeHelper() { char[] cases; foreach (c2t; PrimitiveTagValueTypes) { cases ~= "case '"~c2t.ch~"':"~ " auto p = bytes.ptr + offset;"~ " auto value = *(cast("~c2t.ValueType.stringof~"*)p);"~ " offset += value.sizeof;"~ " return Value(value);".dup; } return to!string("switch (type) {" ~ cases ~ " default: throw new UnknownTagTypeException(to!string(type));"~ "}"); } if (type == 'Z' || type == 'H') { auto begin = offset; while (bytes[offset++] != 0) {} // return string with stripped '\0' auto v = Value(cast(string)bytes[begin .. offset - 1]); if (type == 'H') { v.setHexadecimalFlag(); } return v; } else if (type == 'B') { char elem_type = cast(char)bytes[offset++]; uint length = *(cast(uint*)(bytes.ptr + offset)); offset += uint.sizeof; mixin(readValueArrayTypeHelper()); } else { mixin(readValuePrimitiveTypeHelper()); } } BioD-0.1.0/bio/bam/thirdparty/000077500000000000000000000000001273003163100160235ustar00rootroot00000000000000BioD-0.1.0/bio/bam/thirdparty/msgpack.d000066400000000000000000004170351273003163100176270ustar00rootroot00000000000000// Written in the D programming language. /** * MessagePack serializer and deserializer implementation. * * MessagePack is a binary-based serialization specification. * * Example: * ----- * auto data = tuple("MessagePack!", [1, 2], true); * * auto serialized = pack(data); * * // ... * * typeof(data) deserialized; * * unpack(serialized, deserialized); * * assert(data == deserialized); * ----- * * See_Also: * $(LINK2 http://msgpack.org/, The MessagePack Project)$(BR) * $(LINK2 http://wiki.msgpack.org/display/MSGPACK/Design+of+Serialization, MessagePack Design concept)$(BR) * $(LINK2 http://wiki.msgpack.org/display/MSGPACK/Format+specification, MessagePack data format) * * Copyright: Copyright Masahiro Nakagawa 2010-. * License: Boost License 1.0. * Authors: Masahiro Nakagawa */ module bio.bam.thirdparty.msgpack; import std.array; import std.exception; import std.range; import std.stdio; import std.traits; import std.typecons; import std.typetuple; // for RefBuffer version(Posix) { import core.sys.posix.sys.uio : iovec; } else { /** * from core.sys.posix.sys.uio.iovec for compatibility with posix. */ struct iovec { void* iov_base; size_t iov_len; } } // for Converting Endian using ntohs and ntohl; version(Windows) { import std.c.windows.winsock; } else { import core.sys.posix.arpa.inet; } version(EnableReal) { enum EnableReal = true; } else { enum EnableReal = false; } static if (real.sizeof == double.sizeof) { // for 80bit real inter-operation on non-x86 CPU version = NonX86; import std.numeric; } version(unittest) import std.file, std.c.string; @trusted: public: // Convenient functions /** * Serializes $(D_PARAM args). * * Assumes single object if the length of $(D_PARAM args) == 1, * otherwise array object. * * Params: * args = the contents to serialize. * * Returns: * a serialized data. */ ubyte[] pack(bool withFieldName = false, Args...)(in Args args) { auto packer = Packer(withFieldName); static if (Args.length == 1) packer.pack(args[0]); else packer.packArray(args); return packer.stream.data; } unittest { auto serialized = pack(false); assert(serialized[0] == Format.FALSE); auto deserialized = unpack(pack(1, true, "Foo")); assert(deserialized.type == Value.Type.array); assert(deserialized.via.array[0].type == Value.Type.unsigned); assert(deserialized.via.array[1].type == Value.Type.boolean); assert(deserialized.via.array[2].type == Value.Type.raw); } /** * Deserializes $(D_PARAM buffer) using stream deserializer. * * Params: * buffer = the buffer to deserialize. * * Returns: * a $(D Unpacked) contains deserialized object. * * Throws: * UnpackException if deserialization doesn't succeed. */ Unpacked unpack(in ubyte[] buffer) { auto unpacker = StreamingUnpacker(buffer); if (!unpacker.execute()) throw new UnpackException("Deserialization failure"); return unpacker.unpacked; } /** * Deserializes $(D_PARAM buffer) using direct-conversion deserializer. * * Assumes single object if the length of $(D_PARAM args) == 1, * otherwise array object. * * Params: * buffer = the buffer to deserialize. * args = the references of values to assign. */ void unpack(bool withFieldName = false, Args...)(in ubyte[] buffer, ref Args args) { auto unpacker = Unpacker(buffer, buffer.length, withFieldName); static if (Args.length == 1) unpacker.unpack(args[0]); else unpacker.unpackArray(args); } /** * Return value version */ Type unpack(Type, bool withFieldName = false)(in ubyte[] buffer) { auto unpacker = Unpacker(buffer, buffer.length, withFieldName); Type result; unpacker.unpack(result); return result; } unittest { { // stream auto result = unpack(pack(false)); assert(result.via.boolean == false); } { // direct conversion Tuple!(uint, string) result; Tuple!(uint, string) test = tuple(1, "Hi!"); unpack(pack(test), result); assert(result == test); test.field[0] = 2; test.field[1] = "Hey!"; unpack(pack(test.field[0], test.field[1]), result.field[0], result.field[1]); assert(result == test); } { // return value direct conversion Tuple!(uint, string) test = tuple(1, "Hi!"); auto data = pack(test); assert(data.unpack!(Tuple!(uint, string)) == test); } { // serialize object as a Map static class C { int num; this(int num) { this.num = num; } } auto test = new C(10); auto result = new C(100); unpack!(true)(pack!(true)(test), result); assert(result.num == 10, "Unpacking with field names failed"); } } unittest { // unittest for https://github.com/msgpack/msgpack-d/issues/8 foreach (Type; TypeTuple!(byte, short, int, long)) { foreach (i; [-33, -20, -1, 0, 1, 20, 33]) { Type a = cast(Type)i; Type b; unpack(pack(a), b); assert(a == b); } } } /** * $(D MessagePackException) is a root Exception for MessagePack related operation. */ class MessagePackException : Exception { pure this(string message) { super(message); } } /** * Attribute for specifying non pack/unpack field. * This is an alternative approach of MessagePackable mixin. * * Example: * ----- * struct S * { * int num; * // Packer/Unpacker ignores this field; * @nonPacked string str; * } * ----- */ struct nonPacked {} template isPackedField(alias field) { enum isPackedField = (staticIndexOf!(nonPacked, __traits(getAttributes, field)) == -1) && (!isSomeFunction!(typeof(field))); } // Serializing routines /** * $(D Packer) is a $(D MessagePack) serializer * * Example: * ----- * auto packer = packer(Appender!(ubyte[])()); * * packer.packArray(false, 100, 1e-10, null); * * stdout.rawWrite(packer.buffer.data); * ----- * * NOTE: * Current implementation can't deal with a circular reference. * If you try to serialize a object that has circular reference, runtime raises 'Stack Overflow'. */ struct PackerImpl(Stream) if (isOutputRange!(Stream, ubyte) && isOutputRange!(Stream, ubyte[])) { private: static @system { alias void delegate(ref PackerImpl, void*) PackHandler; PackHandler[TypeInfo] packHandlers; public void registerHandler(T, alias Handler)() { packHandlers[typeid(T)] = delegate(ref PackerImpl packer, void* obj) { Handler(packer, *cast(T*)obj); }; } } enum size_t Offset = 1; // type-information offset Stream stream_; // the stream to write ubyte[Offset + RealSize] store_; // stores serialized value bool withFieldName_; public: /** * Constructs a packer with $(D_PARAM stream). * * Params: * stream = the stream to write. * withFieldName = serialize class / struct with field name */ this(Stream stream, bool withFieldName = false) { stream_ = stream; withFieldName_ = withFieldName; } /** * Constructs a packer with $(D_PARAM withFieldName). * * Params: * withFieldName = serialize class / struct with field name */ this(bool withFieldName = false) { withFieldName_ = withFieldName; } /** * Forwards to stream. * * Returns: * the stream. */ @property @safe nothrow ref Stream stream() { return stream_; } /** * Serializes argument and writes to stream. * * If the argument is the pointer type, dereferences the pointer and serializes pointed value. * ----- * int a = 10; * int* b = &b; * * packer.pack(b); // serializes 10, not address of a * ----- * Serializes nil if the argument of nullable type is null. * * NOTE: * MessagePack doesn't define $(D_KEYWORD real) type format. * Don't serialize $(D_KEYWORD real) if you communicate with other languages. * Transfer $(D_KEYWORD double) serialization if $(D_KEYWORD real) on your environment equals $(D_KEYWORD double). * * Params: * value = the content to serialize. * * Returns: * self, i.e. for method chaining. */ ref PackerImpl pack(T)(in T value) if (is(Unqual!T == bool)) { if (value) stream_.put(Format.TRUE); else stream_.put(Format.FALSE); return this; } /// ditto ref PackerImpl pack(T)(in T value) if (isUnsigned!T && !is(Unqual!T == enum)) { // ulong < ulong is slower than uint < uint static if (!is(Unqual!T == ulong)) { enum Bits = T.sizeof * 8; if (value < (1 << 8)) { if (value < (1 << 7)) { // fixnum stream_.put(take8from!Bits(value)); } else { // uint 8 store_[0] = Format.UINT8; store_[1] = take8from!Bits(value); stream_.put(store_[0..Offset + ubyte.sizeof]); } } else { if (value < (1 << 16)) { // uint 16 const temp = convertEndianTo!16(value); store_[0] = Format.UINT16; *cast(ushort*)&store_[Offset] = temp; stream_.put(store_[0..Offset + ushort.sizeof]); } else { // uint 32 const temp = convertEndianTo!32(value); store_[0] = Format.UINT32; *cast(uint*)&store_[Offset] = temp; stream_.put(store_[0..Offset + uint.sizeof]); } } } else { if (value < (1UL << 8)) { if (value < (1UL << 7)) { // fixnum stream_.put(take8from!64(value)); } else { // uint 8 store_[0] = Format.UINT8; store_[1] = take8from!64(value); stream_.put(store_[0..Offset + ubyte.sizeof]); } } else { if (value < (1UL << 16)) { // uint 16 const temp = convertEndianTo!16(value); store_[0] = Format.UINT16; *cast(ushort*)&store_[Offset] = temp; stream_.put(store_[0..Offset + ushort.sizeof]); } else if (value < (1UL << 32)){ // uint 32 const temp = convertEndianTo!32(value); store_[0] = Format.UINT32; *cast(uint*)&store_[Offset] = temp; stream_.put(store_[0..Offset + uint.sizeof]); } else { // uint 64 const temp = convertEndianTo!64(value); store_[0] = Format.UINT64; *cast(ulong*)&store_[Offset] = temp; stream_.put(store_[0..Offset + ulong.sizeof]); } } } return this; } /// ditto ref PackerImpl pack(T)(in T value) if (isSigned!T && isIntegral!T && !is(Unqual!T == enum)) { // long < long is slower than int < int static if (!is(Unqual!T == long)) { enum Bits = T.sizeof * 8; if (value < -(1 << 5)) { if (value < -(1 << 15)) { // int 32 const temp = convertEndianTo!32(value); store_[0] = Format.INT32; *cast(int*)&store_[Offset] = temp; stream_.put(store_[0..Offset + int.sizeof]); } else if (value < -(1 << 7)) { // int 16 const temp = convertEndianTo!16(value); store_[0] = Format.INT16; *cast(short*)&store_[Offset] = temp; stream_.put(store_[0..Offset + short.sizeof]); } else { // int 8 store_[0] = Format.INT8; store_[1] = take8from!Bits(value); stream_.put(store_[0..Offset + byte.sizeof]); } } else if (value < (1 << 7)) { // fixnum stream_.put(take8from!Bits(value)); } else { if (value < (1 << 8)) { // uint 8 store_[0] = Format.UINT8; store_[1] = take8from!Bits(value); stream_.put(store_[0..Offset + ubyte.sizeof]); } else if (value < (1 << 16)) { // uint 16 const temp = convertEndianTo!16(value); store_[0] = Format.UINT16; *cast(ushort*)&store_[Offset] = temp; stream_.put(store_[0..Offset + ushort.sizeof]); } else { // uint 32 const temp = convertEndianTo!32(value); store_[0] = Format.UINT32; *cast(uint*)&store_[Offset] = temp; stream_.put(store_[0..Offset + uint.sizeof]); } } } else { if (value < -(1L << 5)) { if (value < -(1L << 15)) { if (value < -(1L << 31)) { // int 64 const temp = convertEndianTo!64(value); store_[0] = Format.INT64; *cast(long*)&store_[Offset] = temp; stream_.put(store_[0..Offset + long.sizeof]); } else { // int 32 const temp = convertEndianTo!32(value); store_[0] = Format.INT32; *cast(int*)&store_[Offset] = temp; stream_.put(store_[0..Offset + int.sizeof]); } } else { if (value < -(1L << 7)) { // int 16 const temp = convertEndianTo!16(value); store_[0] = Format.INT16; *cast(short*)&store_[Offset] = temp; stream_.put(store_[0..Offset + short.sizeof]); } else { // int 8 store_[0] = Format.INT8; store_[1] = take8from!64(value); stream_.put(store_[0..Offset + byte.sizeof]); } } } else if (value < (1L << 7)) { // fixnum stream_.put(take8from!64(value)); } else { if (value < (1L << 16)) { if (value < (1L << 8)) { // uint 8 store_[0] = Format.UINT8; store_[1] = take8from!64(value); stream_.put(store_[0..Offset + ubyte.sizeof]); } else { // uint 16 const temp = convertEndianTo!16(value); store_[0] = Format.UINT16; *cast(ushort*)&store_[Offset] = temp; stream_.put(store_[0..Offset + ushort.sizeof]); } } else { if (value < (1L << 32)) { // uint 32 const temp = convertEndianTo!32(value); store_[0] = Format.UINT32; *cast(uint*)&store_[Offset] = temp; stream_.put(store_[0..Offset + uint.sizeof]); } else { // uint 64 const temp = convertEndianTo!64(value); store_[0] = Format.UINT64; *cast(ulong*)&store_[Offset] = temp; stream_.put(store_[0..Offset + ulong.sizeof]); } } } } return this; } /// ditto ref PackerImpl pack(T)(in T value) if (isFloatingPoint!T && !is(Unqual!T == enum)) { static if (is(Unqual!T == float)) { const temp = convertEndianTo!32(_f(value).i); store_[0] = Format.FLOAT; *cast(uint*)&store_[Offset] = temp; stream_.put(store_[0..Offset + uint.sizeof]); } else static if (is(Unqual!T == double)) { const temp = convertEndianTo!64(_d(value).i); store_[0] = Format.DOUBLE; *cast(ulong*)&store_[Offset] = temp; stream_.put(store_[0..Offset + ulong.sizeof]); } else { static if ((real.sizeof > double.sizeof) && EnableReal) { store_[0] = Format.REAL; const temp = _r(value); const fraction = convertEndianTo!64(temp.fraction); const exponent = convertEndianTo!16(temp.exponent); *cast(Unqual!(typeof(fraction))*)&store_[Offset] = fraction; *cast(Unqual!(typeof(exponent))*)&store_[Offset + fraction.sizeof] = exponent; stream_.put(store_[0..$]); } else { // Non-x86 CPUs, real type equals double type. pack(cast(double)value); } } return this; } /// ditto ref PackerImpl pack(T)(in T value) if (is(Unqual!T == enum)) { pack(cast(OriginalType!T)value); return this; } /// Overload for pack(null) for 2.057 or later static if (!is(typeof(null) == void*)) { ref PackerImpl pack(T)(in T value) if (is(Unqual!T == typeof(null))) { return packNil(); } } /// ditto ref PackerImpl pack(T)(in T value) if (isPointer!T) { static if (is(Unqual!T == void*)) { // for pack(null) for 2.056 or earlier enforce(value is null, "Can't serialize void type"); stream_.put(Format.NIL); } else { if (value is null) stream_.put(Format.NIL); else pack(mixin(AsteriskOf!T ~ "value")); } return this; } /// ditto ref PackerImpl pack(T)(in T array) if (isArray!T) { alias typeof(T.init[0]) U; /* * Serializes raw type-information to stream. */ void beginRaw(in size_t length) { if (length < 32) { const ubyte temp = Format.RAW | cast(ubyte)length; stream_.put(take8from(temp)); } else if (length < 65536) { const temp = convertEndianTo!16(length); store_[0] = Format.RAW16; *cast(ushort*)&store_[Offset] = temp; stream_.put(store_[0..Offset + ushort.sizeof]); } else { const temp = convertEndianTo!32(length); store_[0] = Format.RAW32; *cast(uint*)&store_[Offset] = temp; stream_.put(store_[0..Offset + uint.sizeof]); } } if (array.empty) return packNil(); // Raw bytes static if (isByte!(U) || isSomeChar!(U)) { ubyte[] raw = cast(ubyte[])array; beginRaw(raw.length); stream_.put(raw); } else { beginArray(array.length); foreach (elem; array) pack(elem); } return this; } /// ditto ref PackerImpl pack(T)(in T array) if (isAssociativeArray!T) { if (array is null) return packNil(); beginMap(array.length); foreach (key, value; array) { pack(key); pack(value); } return this; } /// ditto ref PackerImpl pack(Types...)(auto ref const Types objects) if (Types.length > 1) { foreach (i, T; Types) pack(objects[i]); return this; } /** * Serializes $(D_PARAM object) and writes to stream. * * Calling $(D toMsgpack) if $(D_KEYWORD class) and $(D_KEYWORD struct) implement $(D toMsgpack) method. $(D toMsgpack) signature is: * ----- * void toMsgpack(Packer)(ref Packer packer) const * ----- * This method serializes all members of T object if $(D_KEYWORD class) and $(D_KEYWORD struct) don't implement $(D toMsgpack). * * An object that doesn't implement $(D toMsgpack) is serialized to Array type. * ----- * packer.pack(tuple(true, 1, "Hi!")) // -> '[true, 1, "Hi!"]', not 'ture, 1, "Hi!"' * * struct Foo * { * int num = 10; * string msg = "D!"; * } * packer.pack(Foo()); // -> '[10, "D!"]' * * class Base * { * bool flag = true; * } * class Derived : Base * { * double = 0.5f; * } * packer.pack(new Derived()); // -> '[true, 0.5f]' * ----- * * Params: * object = the content to serialize. * * Returns: * self, i.e. for method chaining. */ ref PackerImpl pack(T)(in T object) if (is(Unqual!T == class)) { if (object is null) return packNil(); static if (hasMember!(T, "toMsgpack")) { static if (__traits(compiles, { T t; t.toMsgpack(this, withFieldName_); })) { object.toMsgpack(this, withFieldName_); } else static if (__traits(compiles, { T t; t.toMsgpack(this); })) { // backward compatible object.toMsgpack(this); } else { static assert(0, "Failed to invoke 'toMsgpack' on type '" ~ Unqual!T.stringof ~ "'"); } } else { if (auto handler = object.classinfo in packHandlers) { (*handler)(this, cast(void*)&object); return this; } if (T.classinfo !is object.classinfo) { throw new MessagePackException("Can't pack derived class through reference to base class."); } alias SerializingClasses!(T) Classes; immutable memberNum = SerializingMemberNumbers!(Classes); if (withFieldName_) beginMap(memberNum); else beginArray(memberNum); foreach (Class; Classes) { Class obj = cast(Class)object; if (withFieldName_) { foreach (i, f ; obj.tupleof) { static if (isPackedField!(Class.tupleof[i])) { pack(getFieldName!(Class, i)); pack(f); } } } else { foreach (i, f ; obj.tupleof) { static if (isPackedField!(Class.tupleof[i])) pack(f); } } } } return this; } /// ditto @trusted ref PackerImpl pack(T)(auto ref T object) if (is(Unqual!T == struct)) { static if (hasMember!(T, "toMsgpack")) { static if (__traits(compiles, { T t; t.toMsgpack(this, withFieldName_); })) { object.toMsgpack(this, withFieldName_); } else static if (__traits(compiles, { T t; t.toMsgpack(this); })) { // backward compatible object.toMsgpack(this); } else { static assert(0, "Failed to invoke 'toMsgpack' on type '" ~ Unqual!T.stringof ~ "'"); } } else static if (isTuple!T) { beginArray(object.field.length); foreach (f; object.field) pack(f); } else { // simple struct if (auto handler = typeid(T) in packHandlers) { (*handler)(this, cast(void*)&object); return this; } immutable memberNum = SerializingMemberNumbers!(T); if (withFieldName_) beginMap(memberNum); else beginArray(memberNum); if (withFieldName_) { foreach (i, f; object.tupleof) { static if (isPackedField!(T.tupleof[i]) && __traits(compiles, { pack(f); })) { pack(getFieldName!(T, i)); pack(f); } } } else { foreach (i, f; object.tupleof) { static if (isPackedField!(T.tupleof[i]) && __traits(compiles, { pack(f); })) pack(f); } } } return this; } /** * Serializes the arguments as container to stream. * * ----- * packer.packArray(true, 1); // -> [true, 1] * packer.packMap("Hi", 100); // -> ["Hi":100] * ----- * * In packMap, the number of arguments must be even. * * Params: * objects = the contents to serialize. * * Returns: * self, i.e. for method chaining. */ ref PackerImpl packArray(Types...)(auto ref const Types objects) { beginArray(Types.length); foreach (i, T; Types) pack(objects[i]); //pack(objects); // slow :( return this; } /// ditto ref PackerImpl packMap(Types...)(auto ref const Types objects) { static assert(Types.length % 2 == 0, "The number of arguments must be even"); beginMap(Types.length / 2); foreach (i, T; Types) pack(objects[i]); return this; } /** * Serializes the type-information to stream. * * These methods don't serialize contents. * You need to call pack method to serialize contents at your own risk. * ----- * packer.beginArray(3).pack(true, 1); // -> [true, 1, * * // other operation * * packer.pack("Hi!"); // -> [true, 1, "Hi!"] * ----- * * Params: * length = the length of container. * * Returns: * self, i.e. for method chaining. */ ref PackerImpl beginArray(in size_t length) { if (length < 16) { const ubyte temp = Format.ARRAY | cast(ubyte)length; stream_.put(take8from(temp)); } else if (length < 65536) { const temp = convertEndianTo!16(length); store_[0] = Format.ARRAY16; *cast(ushort*)&store_[Offset] = temp; stream_.put(store_[0..Offset + ushort.sizeof]); } else { const temp = convertEndianTo!32(length); store_[0] = Format.ARRAY32; *cast(uint*)&store_[Offset] = temp; stream_.put(store_[0..Offset + uint.sizeof]); } return this; } /// ditto ref PackerImpl beginMap(in size_t length) { if (length < 16) { const ubyte temp = Format.MAP | cast(ubyte)length; stream_.put(take8from(temp)); } else if (length < 65536) { const temp = convertEndianTo!16(length); store_[0] = Format.MAP16; *cast(ushort*)&store_[Offset] = temp; stream_.put(store_[0..Offset + ushort.sizeof]); } else { const temp = convertEndianTo!32(length); store_[0] = Format.MAP32; *cast(uint*)&store_[Offset] = temp; stream_.put(store_[0..Offset + uint.sizeof]); } return this; } private: /* * Serializes the nil value. */ ref PackerImpl packNil() { stream_.put(Format.NIL); return this; } } /// Default serializer alias PackerImpl!(Appender!(ubyte[])) Packer; // should be pure struct? /** * Register a serialization handler for $(D_PARAM T) type * * Example: * ----- * registerPackHandler!(Foo, fooPackHandler); * ----- */ void registerPackHandler(T, alias Handler, Stream = Appender!(ubyte[]))() { PackerImpl!(Stream).registerHandler!(T, Handler); } /** * Helper for $(D Packer) construction. * * Params: * stream = the stream to write. * withFieldName = serialize class / struct with field name * * Returns: * a $(D Packer) object instantiated and initialized according to the arguments. */ PackerImpl!(Stream) packer(Stream)(Stream stream, bool withFieldName = false) { return typeof(return)(stream, withFieldName); } // Buffer implementations /** * $(D RefBuffer) is a reference stored buffer for more efficient serialization * * Example: * ----- * auto packer = packer(RefBuffer(16)); // threshold is 16 * * // packs data * * writev(fd, cast(void*)packer.buffer.vector.ptr, packer.buffer.vector.length); * ----- */ struct RefBuffer { private: static struct Chunk { ubyte[] data; // storing serialized value size_t used; // used size of data } immutable size_t Threshold; immutable size_t ChunkSize; // for putCopy Chunk[] chunks_; // memory chunk for buffer size_t index_; // index for cunrrent chunk // for putRef iovec[] vecList_; // reference to large data or copied data. public: /** * Constructs a buffer. * * Params: * threshold = the threshold of writing value or stores reference. * chunkSize = the default size of chunk for allocation. */ @safe this(in size_t threshold, in size_t chunkSize = 8192) { Threshold = threshold; ChunkSize = chunkSize; chunks_.length = 1; chunks_[index_].data.length = chunkSize; } /** * Returns the buffer contents that excluding references. * * Returns: * the non-contiguous copied contents. */ @property @safe nothrow ubyte[] data() { ubyte[] result; foreach (ref chunk; chunks_) result ~= chunk.data[0..chunk.used]; return result; } /** * Forwards to all buffer contents. * * Returns: * the array of iovec struct that stores references. */ @property @safe nothrow ref iovec[] vector() { return vecList_; } /** * Writes the argument to buffer and stores the reference of writed content * if the argument size is smaller than threshold, * otherwise stores the reference of argument directly. * * Params: * value = the content to write. */ @safe void put(in ubyte value) { ubyte[1] values = [value]; putCopy(values); } /// ditto @safe void put(in ubyte[] value) { if (value.length < Threshold) putCopy(value); else putRef(value); } private: /* * Stores the reference of $(D_PARAM value). * * Params: * value = the content to write. */ @trusted void putRef(in ubyte[] value) { vecList_.length += 1; vecList_[$ - 1] = iovec(cast(void*)value.ptr, value.length); } /* * Writes $(D_PARAM value) to buffer and appends to its reference. * * Params: * value = the contents to write. */ @trusted void putCopy(in ubyte[] value) { /* * Helper for expanding new space. */ void expand(in size_t size) { const newSize = size < ChunkSize ? ChunkSize : size; index_++; chunks_.length = 1; chunks_[index_].data.length = newSize; } const size = value.length; // lacks current chunk? if (chunks_[index_].data.length - chunks_[index_].used < size) expand(size); const base = chunks_[index_].used; // start index auto data = chunks_[index_].data[base..base + size]; // chunk to write data[] = value[]; chunks_[index_].used += size; // Optimization for avoiding iovec allocation. if (vecList_.length && data.ptr == (vecList_[$ - 1].iov_base + vecList_[$ - 1].iov_len)) vecList_[$ - 1].iov_len += size; else putRef(data); } } unittest { static assert(isOutputRange!(RefBuffer, ubyte) && isOutputRange!(RefBuffer, ubyte[])); auto buffer = RefBuffer(2, 4); ubyte[] tests = [1, 2]; foreach (v; tests) buffer.put(v); buffer.put(tests); assert(buffer.data == tests, "putCopy failed"); iovec[] vector = buffer.vector; ubyte[] result; assert(vector.length == 2, "Optimization failed"); foreach (v; vector) result ~= (cast(ubyte*)v.iov_base)[0..v.iov_len]; assert(result == tests ~ tests); } version (unittest) { mixin template DefinePacker() { Packer packer; } mixin template DefineDictionalPacker() { Packer packer = Packer(false); } } unittest { { // unique value mixin DefinePacker; ubyte[] result = [Format.NIL, Format.TRUE, Format.FALSE]; packer.pack(null, true, false); foreach (i, value; packer.stream.data) assert(value == result[i]); } { // uint * static struct UTest { ubyte format; ulong value; } enum : ulong { A = ubyte.max, B = ushort.max, C = uint.max, D = ulong.max } static UTest[][] utests = [ [{Format.UINT8, A}], [{Format.UINT8, A}, {Format.UINT16, B}], [{Format.UINT8, A}, {Format.UINT16, B}, {Format.UINT32, C}], [{Format.UINT8, A}, {Format.UINT16, B}, {Format.UINT32, C}, {Format.UINT64, D}], ]; foreach (I, T; TypeTuple!(ubyte, ushort, uint, ulong)) { foreach (i, test; utests[I]) { mixin DefinePacker; packer.pack(cast(T)test.value); assert(packer.stream.data[0] == test.format); switch (i) { case 0: auto answer = take8from!(T.sizeof * 8)(test.value); assert(memcmp(&packer.stream.data[1], &answer, ubyte.sizeof) == 0); break; case 1: auto answer = convertEndianTo!16(test.value); assert(memcmp(&packer.stream.data[1], &answer, ushort.sizeof) == 0); break; case 2: auto answer = convertEndianTo!32(test.value); assert(memcmp(&packer.stream.data[1], &answer, uint.sizeof) == 0); break; default: auto answer = convertEndianTo!64(test.value); assert(memcmp(&packer.stream.data[1], &answer, ulong.sizeof) == 0); } } } } { // int * static struct STest { ubyte format; long value; } enum : long { A = byte.min, B = short.min, C = int.min, D = long.min } static STest[][] stests = [ [{Format.INT8, A}], [{Format.INT8, A}, {Format.INT16, B}], [{Format.INT8, A}, {Format.INT16, B}, {Format.INT32, C}], [{Format.INT8, A}, {Format.INT16, B}, {Format.INT32, C}, {Format.INT64, D}], ]; foreach (I, T; TypeTuple!(byte, short, int, long)) { foreach (i, test; stests[I]) { mixin DefinePacker; packer.pack(cast(T)test.value); assert(packer.stream.data[0] == test.format); switch (i) { case 0: auto answer = take8from!(T.sizeof * 8)(test.value); assert(memcmp(&packer.stream.data[1], &answer, byte.sizeof) == 0); break; case 1: auto answer = convertEndianTo!16(test.value); assert(memcmp(&packer.stream.data[1], &answer, short.sizeof) == 0); break; case 2: auto answer = convertEndianTo!32(test.value); assert(memcmp(&packer.stream.data[1], &answer, int.sizeof) == 0); break; default: auto answer = convertEndianTo!64(test.value); assert(memcmp(&packer.stream.data[1], &answer, long.sizeof) == 0); } } } } { // fload, double static if ((real.sizeof == double.sizeof) || !EnableReal) { alias TypeTuple!(float, double, double) FloatingTypes; static struct FTest { ubyte format; double value; } static FTest[] ftests = [ {Format.FLOAT, float.min_normal}, {Format.DOUBLE, double.max}, {Format.DOUBLE, double.max}, ]; } else { alias TypeTuple!(float, double, real) FloatingTypes; static struct FTest { ubyte format; real value; } static FTest[] ftests = [ {Format.FLOAT, float.min_normal}, {Format.DOUBLE, double.max}, {Format.REAL, real.max}, ]; } foreach (I, T; FloatingTypes) { mixin DefinePacker; packer.pack(cast(T)ftests[I].value); assert(packer.stream.data[0] == ftests[I].format); switch (I) { case 0: const answer = convertEndianTo!32(_f(cast(T)ftests[I].value).i); assert(memcmp(&packer.stream.data[1], &answer, float.sizeof) == 0); break; case 1: const answer = convertEndianTo!64(_d(cast(T)ftests[I].value).i); assert(memcmp(&packer.stream.data[1], &answer, double.sizeof) == 0); break; default: static if (EnableReal) { const t = _r(cast(T)ftests[I].value); const f = convertEndianTo!64(t.fraction); const e = convertEndianTo!16(t.exponent); assert(memcmp(&packer.stream.data[1], &f, f.sizeof) == 0); assert(memcmp(&packer.stream.data[1 + f.sizeof], &e, e.sizeof) == 0); } else { const answer = convertEndianTo!64(_d(cast(T)ftests[I].value).i); assert(memcmp(&packer.stream.data[1], &answer, double.sizeof) == 0); } } } } { // pointer static struct PTest { ubyte format; union { ulong* p0; long* p1; double* p2; } } PTest[] ptests = [PTest(Format.UINT64), PTest(Format.INT64), PTest(Format.DOUBLE)]; ulong v0 = ulong.max; long v1 = long.min; double v2 = double.max; foreach (I, Index; TypeTuple!("0", "1", "2")) { mixin DefinePacker; mixin("ptests[I].p" ~ Index ~ " = &v" ~ Index ~ ";"); packer.pack(mixin("ptests[I].p" ~ Index)); assert(packer.stream.data[0] == ptests[I].format); switch (I) { case 0: auto answer = convertEndianTo!64(*ptests[I].p0); assert(memcmp(&packer.stream.data[1], &answer, ulong.sizeof) == 0); break; case 1: auto answer = convertEndianTo!64(*ptests[I].p1); assert(memcmp(&packer.stream.data[1], &answer, long.sizeof) == 0); break; default: const answer = convertEndianTo!64(_d(*ptests[I].p2).i); assert(memcmp(&packer.stream.data[1], &answer, double.sizeof) == 0); } } } { // enum enum E : ubyte { A = ubyte.max } mixin DefinePacker; E e = E.A; packer.pack(e); assert(packer.stream.data[0] == Format.UINT8); auto answer = E.A; assert(memcmp(&packer.stream.data[1], &answer, (OriginalType!E).sizeof) == 0); } { // container static struct CTest { ubyte format; size_t value; } enum : ulong { A = 16 / 2, B = ushort.max, C = uint.max } static CTest[][] ctests = [ [{Format.ARRAY | A, Format.ARRAY | A}, {Format.ARRAY16, B}, {Format.ARRAY32, C}], [{Format.MAP | A, Format.MAP | A}, {Format.MAP16, B}, {Format.MAP32, C}], ]; foreach (I, Name; TypeTuple!("Array", "Map")) { auto test = ctests[I]; foreach (i, T; TypeTuple!(ubyte, ushort, uint)) { mixin DefinePacker; mixin("packer.begin" ~ Name ~ "(i ? test[i].value : A);"); assert(packer.stream.data[0] == test[i].format); switch (i) { case 0: auto answer = take8from(test[i].value); assert(memcmp(&packer.stream.data[0], &answer, ubyte.sizeof) == 0); break; case 1: auto answer = convertEndianTo!16(test[i].value); assert(memcmp(&packer.stream.data[1], &answer, ushort.sizeof) == 0); break; default: auto answer = convertEndianTo!32(test[i].value); assert(memcmp(&packer.stream.data[1], &answer, uint.sizeof) == 0); } } } } { // user defined { static struct S { uint num = uint.max; void toMsgpack(P)(ref P p) const { p.packArray(num); } } mixin DefinePacker; S test; packer.pack(test); assert(packer.stream.data[0] == (Format.ARRAY | 1)); assert(packer.stream.data[1] == Format.UINT32); assert(memcmp(&packer.stream.data[2], &test.num, uint.sizeof) == 0); } { mixin DefinePacker; auto test = tuple(true, false, uint.max); packer.pack(test); assert(packer.stream.data[0] == (Format.ARRAY | 3)); assert(packer.stream.data[1] == Format.TRUE); assert(packer.stream.data[2] == Format.FALSE); assert(packer.stream.data[3] == Format.UINT32); assert(memcmp(&packer.stream.data[4], &test.field[2], uint.sizeof) == 0); } { static class C { uint num; this(uint n) { num = n; } void toMsgpack(P)(ref P p) const { p.packArray(num); } } mixin DefinePacker; C test = new C(ushort.max); packer.pack(test); assert(packer.stream.data[0] == (Format.ARRAY | 1)); assert(packer.stream.data[1] == Format.UINT16); assert(memcmp(&packer.stream.data[2], &test.num, ushort.sizeof) == 0); } } { // simple struct and class { static struct Simple { uint num = uint.max; } static struct SimpleWithNonPacked1 { uint num = uint.max; @nonPacked string str = "ignored"; } static struct SimpleWithNonPacked2 { @nonPacked string str = "ignored"; uint num = uint.max; } static struct SimpleWithSkippedTypes { int function(int) fn; int delegate(int) dg; uint num = uint.max; } foreach (Type; TypeTuple!(Simple, SimpleWithNonPacked1, SimpleWithNonPacked2, SimpleWithSkippedTypes)) { mixin DefinePacker; Type test; packer.pack(test); assert(packer.stream.data[0] == (Format.ARRAY | 1)); assert(packer.stream.data[1] == Format.UINT32); assert(memcmp(&packer.stream.data[2], &test.num, uint.sizeof) == 0); } } static class SimpleA { bool flag = true; } static class SimpleB : SimpleA { ubyte type = 100; } static class SimpleC : SimpleB { uint num = uint.max; } static class SimpleCWithNonPacked1 : SimpleB { uint num = uint.max; @nonPacked string str = "ignored"; } static class SimpleCWithNonPacked2 : SimpleB { @nonPacked string str = "ignored"; uint num = uint.max; } static class SimpleCWithSkippedTypes : SimpleB { uint num = uint.max; int function(int) fn; int delegate(int) dg; } { // from derived class foreach (Type; TypeTuple!(SimpleC, SimpleCWithNonPacked1, SimpleCWithNonPacked2, SimpleCWithSkippedTypes)) { mixin DefinePacker; Type test = new Type(); packer.pack(test); assert(packer.stream.data[0] == (Format.ARRAY | 3)); assert(packer.stream.data[1] == Format.TRUE); assert(packer.stream.data[2] == 100); assert(packer.stream.data[3] == Format.UINT32); assert(memcmp(&packer.stream.data[4], &test.num, uint.sizeof) == 0); } } { // from base class mixin DefinePacker; SimpleB test = new SimpleC(); try { packer.pack(test); assert(false); } catch (Exception e) { } } } } // deserializing routines /** * $(D UnpackException) is thrown on deserialization failure */ class UnpackException : MessagePackException { this(string message) { super(message); } } version (D_Ddoc) { /** * Internal buffer and related operations for Unpacker * * Following Unpackers mixin this template. So, Unpacker can use following methods. * * ----- * //buffer image: * +-------------------------------------------+ * | [object] | [obj | unparsed... | unused... | * +-------------------------------------------+ * ^ offset * ^ current * ^ used * ^ buffer.length * ----- * * This mixin template is a private. */ mixin template InternalBuffer() { private: ubyte[] buffer_; // internal buffer size_t used_; // index that buffer cosumed size_t offset_; // index that buffer parsed size_t parsed_; // total size of parsed message bool hasRaw_; // indicates whether Raw object has been deserialized public: /** * Forwards to internal buffer. * * Returns: * the reference of internal buffer. */ @property @safe nothrow ubyte[] buffer(); /** * Fills internal buffer with $(D_PARAM target). * * Params: * target = new serialized buffer to deserialize. */ @safe void feed(in ubyte[] target); /** * Consumes buffer. This method is helper for buffer property. * You must use this method if you write bytes to buffer directly. * * Params: * size = the number of consuming. */ @safe nothrow void bufferConsumed(in size_t size); /** * Removes unparsed buffer. */ @safe nothrow void removeUnparsed(); /** * Returns: * the total size including unparsed buffer size. */ @property @safe nothrow size_t size() const; /** * Returns: * the parsed size of buffer. */ @property @safe nothrow size_t parsedSize() const; /** * Returns: * the unparsed size of buffer. */ @property @safe nothrow size_t unparsedSize() const; private: @safe void initializeBuffer(in ubyte[] target, in size_t bufferSize = 8192); } } else { private mixin template InternalBuffer() { private: ubyte[] buffer_; // internal buffer size_t used_; // index that buffer cosumed size_t offset_; // index that buffer parsed size_t parsed_; // total size of parsed message bool hasRaw_; // indicates whether Raw object has been deserialized public: @property @safe nothrow ubyte[] buffer() { return buffer_; } @safe void feed(in ubyte[] target) in { assert(target.length); } body { /* * Expands internal buffer. * * Params: * size = new buffer size to append. */ void expandBuffer(in size_t size) { // rewinds buffer(completed deserialization) if (used_ == offset_ && !hasRaw_) { used_ = offset_ = 0; if (buffer_.length < size) buffer_.length = size; return; } // deserializing state is mid-flow(buffer has non-parsed data yet) auto unparsed = buffer_[offset_..used_]; auto restSize = buffer_.length - used_ + offset_; auto newSize = size > restSize ? unparsedSize + size : buffer_.length; if (hasRaw_) { hasRaw_ = false; buffer_ = new ubyte[](newSize); } else { buffer_.length = newSize; // avoids overlapping copy auto area = buffer_[0..unparsedSize]; unparsed = area.overlap(unparsed) ? unparsed.dup : unparsed; } buffer_[0..unparsedSize] = unparsed[]; used_ = unparsedSize; offset_ = 0; } const size = target.length; // lacks current buffer? if (buffer_.length - used_ < size) expandBuffer(size); buffer_[used_..used_ + size] = target[]; used_ += size; } @safe nothrow void bufferConsumed(in size_t size) { if (used_ + size > buffer_.length) used_ = buffer_.length; else used_ += size; } @safe nothrow void removeUnparsed() { used_ = offset_; } @property @safe nothrow size_t size() const { return parsed_ - offset_ + used_; } @property @safe nothrow size_t parsedSize() const { return parsed_; } @property @safe nothrow size_t unparsedSize() const { return used_ - offset_; } private: @safe nothrow void initializeBuffer(in ubyte[] target, in size_t bufferSize = 8192) { const size = target.length; buffer_ = new ubyte[](size > bufferSize ? size : bufferSize); used_ = size; buffer_[0..size] = target[]; } } } /** * This $(D Unpacker) is a $(D MessagePack) direct-conversion deserializer * * This implementation is suitable for fixed data. * * Example: * ----- * // serializedData is [10, 0.1, false] * auto unpacker = Unpacker(serializedData); * * uint n; * double d; * bool b; * * unpacker.unpackArray(n, d, b); * * // using Tuple * Tuple!(uint, double, bool) record; * unpacker.unpack(record); // record is [10, 0.1, false] * ----- * * NOTE: * Unpacker becomes template struct if Phobos supports truly IO module. */ struct Unpacker { private: static @system { alias void delegate(ref Unpacker, void*) UnpackHandler; UnpackHandler[TypeInfo] unpackHandlers; public void registerHandler(T, alias Handler)() { unpackHandlers[typeid(T)] = delegate(ref Unpacker unpacker, void* obj) { Handler(unpacker, *cast(T*)obj); }; } } enum Offset = 1; mixin InternalBuffer; bool withFieldName_; public: /** * Constructs a $(D Unpacker). * * Params: * target = byte buffer to deserialize * bufferSize = size limit of buffer size */ this(in ubyte[] target, in size_t bufferSize = 8192, bool withFieldName = false) { initializeBuffer(target, bufferSize); withFieldName_ = withFieldName; } /** * Clears states for next deserialization. */ @safe nothrow void clear() { parsed_ = 0; } /** * Deserializes $(D_PARAM T) object and assigns to $(D_PARAM value). * * If the argument is pointer, dereferences pointer and assigns deserialized value. * ----- * int* a; * unpacker.unpack(a) // enforce throws Exception because a is null or * // no throw if deserialized value is nil * * int b; a = &b; * unpacker.unpack(b) // b is deserialized value or * // assigns null if deserialized value is nil * ----- * * Params: * value = the reference of value to assign. * * Returns: * self, i.e. for method chaining. * * Throws: * UnpackException when doesn't read from buffer or precision loss occurs and * MessagePackException when $(D_PARAM T) type doesn't match serialized type. */ ref Unpacker unpack(T)(ref T value) if (is(Unqual!T == bool)) { canRead(Offset, 0); const header = read(); switch (header) { case Format.TRUE: value = true; break; case Format.FALSE: value = false; break; default: rollback(); } return this; } /// ditto ref Unpacker unpack(T)(ref T value) if (isUnsigned!T && !is(Unqual!T == enum)) { canRead(Offset, 0); const header = read(); if (0x00 <= header && header <= 0x7f) { value = header; } else { switch (header) { case Format.UINT8: canRead(ubyte.sizeof); value = read(); break; case Format.UINT16: canRead(ushort.sizeof); auto us = load16To!ushort(read(ushort.sizeof)); if (us > T.max) rollback(ushort.sizeof); value = cast(T)us; break; case Format.UINT32: canRead(uint.sizeof); auto ui = load32To!uint(read(uint.sizeof)); if (ui > T.max) rollback(uint.sizeof); value = cast(T)ui; break; case Format.UINT64: canRead(ulong.sizeof); auto ul = load64To!ulong(read(ulong.sizeof)); if (ul > T.max) rollback(ulong.sizeof); value = cast(T)ul; break; default: rollback(); } } return this; } /// ditto ref Unpacker unpack(T)(ref T value) if (isSigned!T && isIntegral!T && !is(Unqual!T == enum)) { canRead(Offset, 0); const header = read(); if (0x00 <= header && header <= 0x7f) { value = cast(T)header; } else if (0xe0 <= header && header <= 0xff) { value = -(cast(T)-header); } else { switch (header) { case Format.UINT8: canRead(ubyte.sizeof); auto ub = read(); if (ub > T.max) rollback(ubyte.sizeof); value = cast(T)ub; break; case Format.UINT16: canRead(ushort.sizeof); auto us = load16To!ushort(read(ushort.sizeof)); if (us > T.max) rollback(ushort.sizeof); value = cast(T)us; break; case Format.UINT32: canRead(uint.sizeof); auto ui = load32To!uint(read(uint.sizeof)); if (ui > T.max) rollback(uint.sizeof); value = cast(T)ui; break; case Format.UINT64: canRead(ulong.sizeof); auto ul = load64To!ulong(read(ulong.sizeof)); if (ul > T.max) rollback(ulong.sizeof); value = cast(T)ul; break; case Format.INT8: canRead(byte.sizeof); value = cast(byte)read(); break; case Format.INT16: canRead(short.sizeof); auto s = load16To!short(read(short.sizeof)); if (s < T.min || T.max < s) rollback(short.sizeof); value = cast(T)s; break; case Format.INT32: canRead(int.sizeof); auto i = load32To!int(read(int.sizeof)); if (i < T.min || T.max < i) rollback(int.sizeof); value = cast(T)i; break; case Format.INT64: canRead(long.sizeof); auto l = load64To!long(read(long.sizeof)); if (l < T.min || T.max < l) rollback(long.sizeof); value = cast(T)l; break; default: rollback(); } } return this; } /// ditto ref Unpacker unpack(T)(ref T value) if (isFloatingPoint!T && !is(Unqual!T == enum)) { canRead(Offset, 0); const header = read(); switch (header) { case Format.FLOAT: _f temp; canRead(uint.sizeof); temp.i = load32To!uint(read(uint.sizeof)); value = temp.f; break; case Format.DOUBLE: // check precision loss static if (is(Unqual!T == float)) rollback(); _d temp; canRead(ulong.sizeof); temp.i = load64To!ulong(read(ulong.sizeof)); value = temp.f; break; case Format.REAL: static if (!EnableReal) { rollback(); } else { // check precision loss static if (is(Unqual!T == float) || is(Unqual!T == double)) rollback(); canRead(RealSize); version (NonX86) { CustomFloat!80 temp; const frac = load64To!ulong (read(ulong.sizeof)); const exp = load16To!ushort(read(ushort.sizeof)); temp.significand = frac; temp.exponent = exp & 0x7fff; temp.sign = exp & 0x8000 ? true : false; // NOTE: temp.get!real is inf on non-x86 when deserialized value is larger than double.max. value = temp.get!real; } else { _r temp; temp.fraction = load64To!(typeof(temp.fraction))(read(temp.fraction.sizeof)); temp.exponent = load16To!(typeof(temp.exponent))(read(temp.exponent.sizeof)); value = temp.f; } } break; default: rollback(); } return this; } /// ditto ref Unpacker unpack(T)(ref T value) if (is(Unqual!T == enum)) { OriginalType!T temp; unpack(temp); value = cast(T)temp; return this; } /// ditto ref Unpacker unpack(T)(T value) if (isPointer!T) { static if (is(Unqual!T == void*)) { enforce(value !is null, "Can't deserialize void type"); unpackNil(value); } else { if (checkNil()) unpackNil(value); else enforce(value !is null, T.stringof ~ " is null pointer"); unpack(mixin(AsteriskOf!T ~ "value")); } return this; } /// ditto ref Unpacker unpack(Types...)(ref Types objects) if (Types.length > 1) { foreach (i, T; Types) unpack!(T)(objects[i]); return this; } /** * Deserializes $(D_PARAM T) object and assigns to $(D_PARAM array). * * This is convenient method for array deserialization. * Rollback will be completely successful if you deserialize raw type((u)byte[] or string types). * But, Rollback will be one element(e.g. int) if you deserialize other types(e.g. int[], int[int]) * * No assign if the length of deserialized object is 0. * * In a static array, this method checks the length. Do rollback and throw exception * if length of $(D_PARAM array) is different from length of deserialized object. * * Params: * array = the reference of array to assign. * * Returns: * self, i.e. for method chaining. * * Throws: * UnpackException when doesn't read from buffer or precision loss occurs and * MessagePackException when $(D_PARAM T) type doesn't match serialized type. */ ref Unpacker unpack(T)(ref T array) if (isArray!T && !is(Unqual!T == enum)) { alias typeof(T.init[0]) U; /* * Deserializes type-information of raw type. */ @safe size_t beginRaw() { canRead(Offset, 0); const header = read(); size_t length; if (0xa0 <= header && header <= 0xbf) { length = header & 0x1f; } else { switch (header) { case Format.BIN8, Format.STR8: canRead(ubyte.sizeof); length = read(); break; case Format.BIN16, Format.RAW16: canRead(ushort.sizeof); length = load16To!size_t(read(ushort.sizeof)); break; case Format.BIN32, Format.RAW32: canRead(uint.sizeof); length = load32To!size_t(read(uint.sizeof)); break; case Format.NIL: break; default: rollback(); } } return length; } if (checkNil()) { static if (isStaticArray!T) { onInvalidType(); } else { return unpackNil(array); } } // Raw bytes static if (isByte!U || isSomeChar!U) { auto length = beginRaw(); auto offset = calculateSize!(true)(length); if (length == 0) return this; static if (isStaticArray!T) { if (length != array.length) rollback(offset); } canRead(length, offset + Offset); static if (isStaticArray!T) { array[] = (cast(U[])read(length))[0 .. T.length]; } else { array = cast(T)read(length); } static if (isDynamicArray!T) hasRaw_ = true; } else { auto length = beginArray(); if (length == 0) return this; static if (isStaticArray!T) { if (length != array.length) rollback(calculateSize(length)); } else { array.length = length; } foreach (i; 0..length) unpack(array[i]); } return this; } /// ditto ref Unpacker unpack(T)(ref T array) if (isAssociativeArray!T) { alias typeof(T.init.keys[0]) K; alias typeof(T.init.values[0]) V; if (checkNil()) return unpackNil(array); auto length = beginMap(); if (length == 0) return this; foreach (i; 0..length) { K k; unpack(k); V v; unpack(v); array[k] = v; } return this; } /** * Deserializes $(D_PARAM T) object and assigns to $(D_PARAM object). * * Calling $(D fromMsgpack) if $(D_KEYWORD class) and $(D_KEYWORD struct) implement $(D fromMsgpack) method. $(D fromMsgpack) signature is: * ----- * void fromMsgpack(ref Unpacker unpacker) * ----- * Assumes $(D std.typecons.Tuple) or simple struct if $(D_KEYWORD struct) doesn't implement $(D fromMsgpack). * Checks length if $(D_PARAM T) is a $(D std.typecons.Tuple) or simple struct. * * Params: * object = the reference of object to assign. * args = the arguments to class constructor(class only). * This is used at new statement if $(D_PARAM object) is $(D_KEYWORD null). * * Returns: * self, i.e. for method chaining. */ ref Unpacker unpack(T, Args...)(ref T object, auto ref Args args) if (is(Unqual!T == class)) { if (checkNil()) return unpackNil(object); if (object is null) { //static if (is(typeof(new T(args)))) static if (__traits(compiles, { new T(args); })) object = new T(args); else throw new MessagePackException("Don't know how to construct class type '" ~ Unqual!T.stringof ~ "' with argument types '" ~ Args.stringof ~ "'."); } static if (hasMember!(T, "fromMsgpack")) { static if (__traits(compiles, { T t; t.fromMsgpack(this, withFieldName_); })) { object.fromMsgpack(this, withFieldName_); } else static if (__traits(compiles, { T t; t.fromMsgpack(this); })) { // backward compatible object.fromMsgpack(this); } else { static assert(0, "Failed to invoke 'fromMsgpack' on type '" ~ Unqual!T.stringof ~ "'"); } } else { if (auto handler = object.classinfo in unpackHandlers) { (*handler)(this, cast(void*)&object); return this; } if (T.classinfo !is object.classinfo) { throw new MessagePackException("Can't unpack derived class through reference to base class."); } alias SerializingClasses!(T) Classes; size_t length = withFieldName_ ? beginMap() : beginArray(); if (length == 0) return this; if (length != SerializingMemberNumbers!(Classes)) rollback(calculateSize(length)); if (withFieldName_) { foreach (_; 0..length) { string fieldName; unpack(fieldName); foreach (Class; Classes) { Class obj = cast(Class)object; foreach (i, member; obj.tupleof) { static if (isPackedField!(Class.tupleof[i])) { if (fieldName == getFieldName!(Class, i)) { unpack(obj.tupleof[i]); goto endLoop; } } } } assert(false, "Invalid field name: '" ~ fieldName~"' "); endLoop: continue; } } else { foreach (Class; Classes) { Class obj = cast(Class)object; foreach (i, member; obj.tupleof) { static if (isPackedField!(Class.tupleof[i])) unpack(obj.tupleof[i]); } } } } return this; } /// ditto ref Unpacker unpack(T)(ref T object) if (is(Unqual!T == struct)) { static if (hasMember!(T, "fromMsgpack")) { static if (__traits(compiles, { T t; t.fromMsgpack(this); })) { object.fromMsgpack(this); } else { static assert(0, "Failed to invoke 'fromMsgpack' on type '" ~ Unqual!T.stringof ~ "'"); } } else { if (auto handler = typeid(T) in unpackHandlers) { (*handler)(this, cast(void*)&object); return this; } auto length = beginArray(); if (length == 0) return this; static if (isTuple!T) { if (length != T.Types.length) rollback(calculateSize(length)); foreach (i, Type; T.Types) unpack(object.field[i]); } else { // simple struct //if (length != object.tupleof.length) if (length != SerializingMemberNumbers!(T)) rollback(calculateSize(length)); foreach (i, member; object.tupleof) { static if (isPackedField!(T.tupleof[i])) unpack(object.tupleof[i]); } } } return this; } /** * Deserializes the container object and assigns to each argument. * * These methods check the length. Do rollback if * the length of arguments is different from length of deserialized object. * * In unpackMap, the number of arguments must be even. * * Params: * objects = the references of object to assign. * * Returns: * self, i.e. for method chaining. */ ref Unpacker unpackArray(Types...)(ref Types objects) { auto length = beginArray(); if (length != Types.length) rollback(calculateSize(length)); foreach (i, T; Types) unpack(objects[i]); // unpack(objects); // slow :( return this; } /// ditto ref Unpacker unpackMap(Types...)(ref Types objects) { static assert(Types.length % 2 == 0, "The number of arguments must be even"); auto length = beginMap(); if (length != Types.length / 2) rollback(calculateSize(length)); foreach (i, T; Types) unpack(objects[i]); return this; } /** * Deserializes the type-information of container. * * These methods don't deserialize contents. * You need to call unpack method to deserialize contents at your own risk. * ----- * // serialized data is [1, "Hi!"]; * int num; * unpacker.beginArray(2).unpack(num); // num is 1 * * // other operation * * string str; * unpacker.unpack(str); // str is "Hi!" * ----- * * Returns: * the container size. */ @safe size_t beginArray() { canRead(Offset, 0); const header = read(); size_t length; if (0x90 <= header && header <= 0x9f) { length = header & 0x0f; } else { switch (header) { case Format.ARRAY16: canRead(ushort.sizeof); length = load16To!size_t(read(ushort.sizeof)); break; case Format.ARRAY32: canRead(uint.sizeof); length = load32To!size_t(read(uint.sizeof)); break; case Format.NIL: break; default: rollback(); } } return length; } /// ditto @safe size_t beginMap() { canRead(Offset, 0); const header = read(); size_t length; if (0x80 <= header && header <= 0x8f) { length = header & 0x0f; } else { switch (header) { case Format.MAP16: canRead(ushort.sizeof); length = load16To!size_t(read(ushort.sizeof)); break; case Format.MAP32: canRead(uint.sizeof); length = load32To!size_t(read(uint.sizeof)); break; case Format.NIL: break; default: rollback(); } } return length; } /** * Scans an entire buffer and converts each objects. * * This method is used for unpacking record-like objects. * * Example: * ----- * // serialized data is "[1, 2][3, 4][5, 6][...". * auto unpacker = Unpacker(serializedData); * foreach (n, d; &unpacker.scan!(int, int)) // == "foreach (int n, int d; unpacker)" * writeln(n, d); // 1st loop "1, 2", 2nd loop "3, 4"... * ----- */ int scan(Types...)(scope int delegate(ref Types) dg) { return opApply!(Types)(delegate int(ref Types objects) { return dg(objects); }); } /// ditto int opApply(Types...)(scope int delegate(ref Types) dg) { int result; while (used_ - offset_) { auto length = beginArray(); if (length != Types.length) rollback(calculateSize(length)); Types objects; foreach (i, T; Types) unpack(objects[i]); result = dg(objects); if (result) return result; } return result; } private: /* * Deserializes nil object and assigns to $(D_PARAM value). * * Params: * value = the reference of value to assign. * * Returns: * self, i.e. for method chaining. * * Throws: * UnpackException when doesn't read from buffer or precision loss occurs and * MessagePackException when $(D_PARAM T) type doesn't match serialized type. */ @safe ref Unpacker unpackNil(T)(ref T value) { canRead(Offset, 0); const header = read(); if (header == Format.NIL) value = null; else rollback(); return this; } /* * Next object is nil? * * Returns: * true if next object is nil. */ @safe bool checkNil() { canRead(Offset, 0); return buffer_[offset_] == Format.NIL; } /* * Calculates the format size of container length. */ size_t calculateSize(bool rawType = false)(in size_t length) { static if (rawType) return length < 32 ? 0 : length < 65536 ? ushort.sizeof : uint.sizeof; else return length < 16 ? 0 : length < 65536 ? ushort.sizeof : uint.sizeof; } /* * Reading test. * * Params: * size = the size to read. * offset = the offset to subtract when doesn't read from buffer. * * Throws: * UnpackException when doesn't read from buffer. */ @safe void canRead(in size_t size, in size_t offset = Offset) { if (used_ - offset_ < size) { if (offset) offset_ -= offset; throw new UnpackException("Insufficient buffer"); } } /* * Reads value from buffer and advances offset. */ @safe nothrow ubyte read() { return buffer_[offset_++]; } /* * Reads value from buffer and advances offset. */ @safe nothrow ubyte[] read(in size_t size) { auto result = buffer_[offset_..offset_ + size]; offset_ += size; return result; } /* * Do rollback and throws exception. */ @safe void rollback(in size_t size = 0) { offset_ -= size + Offset; onInvalidType(); } } /** * Register a deserialization handler for $(D_PARAM T) type * * Example: * ----- * registerUnackHandler!(Foo, fooUnackHandler); * ----- */ void registerUnpackHandler(T, alias Handler)() { Unpacker.registerHandler!(T, Handler); } unittest { { // unique mixin DefinePacker; Tuple!(bool, bool) result; Tuple!(bool, bool) test = tuple(true, false); packer.pack(test); auto unpacker = Unpacker(packer.stream.data); unpacker.unpack(result); assert(test == result); } { // uint * mixin DefinePacker; Tuple!(ubyte, ushort, uint, ulong) result; Tuple!(ubyte, ushort, uint, ulong) test = tuple(cast(ubyte)ubyte.max, cast(ushort)ushort.max, cast(uint)uint.max, cast(ulong)ulong.max); packer.pack(test); auto unpacker = Unpacker(packer.stream.data); unpacker.unpack(result); assert(test == result); } { // int * mixin DefinePacker; Tuple!(byte, short, int, long) result; Tuple!(byte, short, int, long) test = tuple(cast(byte)byte.min, cast(short)short.min, cast(int)int.min, cast(long)long.min); packer.pack(test); auto unpacker = Unpacker(packer.stream.data); unpacker.unpack(result); assert(test == result); } { // floating point mixin DefinePacker; static if (real.sizeof == double.sizeof || !EnableReal) { Tuple!(float, double, double) result; Tuple!(float, double, double) test = tuple(cast(float)float.min_normal, cast(double)double.max, cast(real)double.min_normal); } else { Tuple!(float, double, real) result; Tuple!(float, double, real) test = tuple(cast(float)float.min_normal, cast(double)double.max, cast(real)real.min_normal); } packer.pack(test); auto unpacker = Unpacker(packer.stream.data); unpacker.unpack(result); assert(test == result); } { // pointer mixin DefinePacker; Tuple!(ulong, long, double) origin; Tuple!(ulong, long, double) values = tuple(ulong.max, long.min, double.min_normal); Tuple!(ulong*, long*, double*) result = tuple(&origin.field[0], &origin.field[1], &origin.field[2]); Tuple!(ulong*, long*, double*) test = tuple(&values.field[0], &values.field[1], &values.field[2]); packer.pack(test); auto unpacker = Unpacker(packer.stream.data); unpacker.unpack(result); foreach (i, v; test.field) assert(*v == *result.field[i]); assert(origin == values); } { // enum enum : float { D = 0.5 } enum E : ulong { U = 100 } mixin DefinePacker; float f = D, resultF; E e = E.U, resultE; packer.pack(D, e); auto unpacker = Unpacker(packer.stream.data); unpacker.unpack(resultF, resultE); assert(f == resultF); assert(e == resultE); } { // container mixin DefinePacker; Tuple!(ulong[], double[uint], string, bool[2], char[2]) test = tuple([1UL, 2], [3U:4.0, 5:6.0, 7:8.0], "MessagePack is nice!", [true, false], "D!"); packer.pack(test); auto unpacker = Unpacker(packer.stream.data); Tuple!(ulong[], double[uint], string, bool[2], char[2]) result; unpacker.unpack(result); assert(test == result); } { // user defined { static struct S { uint num; void toMsgpack(P)(ref P p) const { p.packArray(num); } void fromMsgpack(ref Unpacker u) { assert(u.beginArray() == 1); u.unpack(num); } } mixin DefinePacker; S result, test = S(uint.max); packer.pack(test); auto unpacker = Unpacker(packer.stream.data); unpacker.unpack(result); assert(test.num == result.num); } { static class C { uint num; this(uint n) { num = n; } void toMsgpack(P)(ref P p) const { p.packArray(num - 1); } void fromMsgpack(ref Unpacker u) { assert(u.beginArray() == 1); u.unpack(num); } } mixin DefinePacker; C result, test = new C(ushort.max); packer.pack(test); auto unpacker = Unpacker(packer.stream.data); unpacker.unpack(result, ushort.max); assert(test.num == result.num + 1); } } { // simple struct and class { static struct Simple { uint num; @nonPacked string str; } static struct Simple2 { @nonPacked string str; uint num; } foreach (Type; TypeTuple!(Simple, Simple2)) { mixin DefinePacker; Type result, test; test.num = uint.max; test.str = "ignored"; packer.pack(test); auto unpacker = Unpacker(packer.stream.data); unpacker.unpack(result); assert(test.num == result.num); assert(test.str != result.str); } } static class SimpleA { bool flag = true; } static class SimpleB : SimpleA { ubyte type = 100; } static class SimpleC : SimpleB { uint num = uint.max; @nonPacked string str; } static class SimpleC2 : SimpleB { @nonPacked string str; uint num = uint.max; } { // from derived class foreach (Type; TypeTuple!(SimpleC, SimpleC2)) { mixin DefinePacker; Type result, test = new Type(); test.flag = false; test.type = 99; test.num = uint.max / 2; test.str = "ignored"; packer.pack(test); auto unpacker = Unpacker(packer.stream.data); unpacker.unpack(result); assert(test.flag == result.flag); assert(test.type == result.type); assert(test.num == result.num); assert(test.str != result.str); } } { // from base class mixin DefinePacker; SimpleC test = new SimpleC(); packer.pack(test); SimpleB result = new SimpleC(); auto unpacker = Unpacker(packer.stream.data); try { unpacker.unpack(result); assert(false); } catch (Exception e) { } } { // https://github.com/msgpack/msgpack-d/issues/16 static class Issue16 { int i; this(int i) { this.i = i; } } Issue16 c1 = new Issue16(10); try { Issue16 c2 = null; unpack(pack(c1), c2); assert(false); } catch (Exception e) {} Issue16 c3 = new Issue16(20); unpack(pack(c1), c3); assert(c3.i == c1.i); } } { // variadic mixin DefinePacker; Tuple!(uint, long, double) test = tuple(uint.max, long.min, double.max); packer.pack(test); auto unpacker = Unpacker(packer.stream.data); uint u; long l; double d; unpacker.unpackArray(u, l, d); assert(test == tuple(u, l, d)); } { // scan / opApply ubyte[] data; mixin DefinePacker; foreach (i; 0..2) packer.pack(tuple(1, 0.5, "Hi!")); foreach (n, d, s; &Unpacker(packer.stream.data).scan!(int, double, string)) { assert(n == 1); assert(d == 0.5); assert(s == "Hi!"); } } } // Static resolution routines for Stream deserializer /** * $(D Value) is a $(D MessagePack) value representation * * Example: * ----- * auto unpacker = StreamingUnpacker(pack(1, 0.1L) ~ pack(true) ~ pack("foobarbaz")); * * foreach (unpacked; unpacker) { * if (unpacked.type == Value.Type.array) { * foreach (obj; unpacked) { * switch (obj.type) { * case Value.Type.unsigned: writeln(obj.as!(uint)); break; * case Value.Type.floating: writeln(obj.as!(real)); break; * defalut: * throw new Exception("Unknown type"); * } * } * } else { * if (unpacked.type == Value.Type.boolean) * writeln(unpacked.as!(bool)); * else * writeln("Message: ", unpacked.as!(string)); * } * } * ----- */ struct Value { /** * $(D MessagePack) value type */ static enum Type { nil, /// nil(null in D) boolean, /// true, false unsigned, /// positive fixnum, uint 8, uint 16, uint 32, uint 64 signed, /// negative fixnum, int 8, int 16, int 32, int 64 floating, /// float, double, real array, /// fix array, array 16, array 32 map, /// fix map, map 16, map 32 raw /// fix raw, raw 16, raw 32 } /** * msgpack value representation */ static union Via { bool boolean; /// corresponding to Type.boolean ulong uinteger; /// corresponding to Type.unsigned long integer; /// corresponding to Type.signed real floating; /// corresponding to Type.floating Value[] array; /// corresponding to Type.array Value[Value] map; /// corresponding to Type.map ubyte[] raw; /// corresponding to Type.raw } Type type; /// represents value type Via via; /// represents real value /** * Constructs a $(D Value) with arguments. * * Params: * value = the real content. * type = the type of value. */ @safe this(Type type = Type.nil) { this.type = type; } @safe this(typeof(null)) { this(Type.nil); } /// ditto @trusted this(bool value, Type type = Type.boolean) { this(type); via.boolean = value; } /// ditto @trusted this(ulong value, Type type = Type.unsigned) { this(type); via.uinteger = value; } /// ditto @trusted this(long value, Type type = Type.signed) { this(type); via.integer = value; } /// ditto @trusted this(real value, Type type = Type.floating) { this(type); via.floating = value; } /// ditto @trusted this(Value[] value, Type type = Type.array) { this(type); via.array = value; } /// ditto @trusted this(Value[Value] value, Type type = Type.map) { this(type); via.map = value; } /// ditto @trusted this(ubyte[] value, Type type = Type.raw) { this(type); via.raw = value; } /// This is unsafe overload because using cast internally. @trusted this(string value, Type type = Type.raw) { this(type); via.raw = cast(ubyte[])value; } /** * Converts value to $(D_PARAM T) type. * * Returns: * converted value. * * Throws: * MessagePackException if type is mismatched. * * NOTE: * Current implementation uses cast. */ @property @trusted T as(T)() if (is(Unqual!T == bool)) { if (type != Type.boolean) onCastError(); return via.boolean; } /// ditto @property @trusted T as(T)() if (isIntegral!T && !is(Unqual!T == enum)) { if (type == Type.unsigned) return cast(T)via.uinteger; if (type == Type.signed) return cast(T)via.integer; onCastError(); assert(false); } /// ditto @property @trusted T as(T)() if (isFloatingPoint!T && !is(Unqual!T == enum)) { if (type != Type.floating) onCastError(); return cast(T)via.floating; } /// ditto @property @trusted T as(T)() if (is(Unqual!T == enum)) { return cast(T)as!(OriginalType!T); } /// ditto @property @trusted T as(T)() if (isArray!T && !is(Unqual!T == enum)) { alias typeof(T.init[0]) V; if (type == Type.nil) { static if (isDynamicArray!T) { return null; } else { return T.init; } } static if (isByte!V || isSomeChar!V) { if (type != Type.raw) onCastError(); static if (isDynamicArray!T) { return cast(T)via.raw; } else { if (via.raw.length != T.length) onCastError(); return cast(T)(via.raw[0 .. T.length]); } } else { if (type != Type.array) onCastError(); V[] array; foreach (elem; via.array) array ~= elem.as!(V); return array; } } /// ditto @property @trusted T as(T)() if (isAssociativeArray!T) { alias typeof(T.init.keys[0]) K; alias typeof(T.init.values[0]) V; if (type == Type.nil) return null; if (type != Type.map) onCastError(); V[K] map; foreach (key, value; via.map) map[key.as!(K)] = value.as!(V); return map; } /** * Converts to $(D_PARAM T) type. * * Calling $(D fromMsgpack) if $(D_KEYWORD class) and $(D_KEYWORD struct) implement $(D fromMsgpack) method. $(D fromMsgpack) signature is: * ----- * void fromMsgpack(Value value) * ----- * This method assigns converted values to all members of T object if $(D_KEYWORD class) and $(D_KEYWORD struct) don't implement $(D fromMsgpack). * * Params: * args = arguments to class constructor(class only). * * Returns: * converted value. */ @property @trusted T as(T, Args...)(Args args) if (is(Unqual!T == class)) { if (type == Type.nil) return null; T object = new T(args); static if (hasMember!(T, "fromMsgpack")) { static if (__traits(compiles, { T t; t.fromMsgpack(this); })) { object.fromMsgpack(this); } else { static assert(0, "Failed to invoke 'fromMsgpack' on type '" ~ Unqual!T.stringof ~ "'"); } } else { alias SerializingClasses!(T) Classes; if (via.array.length != SerializingMemberNumbers!(Classes)) throw new MessagePackException("The number of deserialized object member is mismatched"); size_t offset; foreach (Class; Classes) { Class obj = cast(Class)object; foreach (i, member; obj.tupleof) { static if (isPackedField!(Class.tupleof[i])) obj.tupleof[i] = via.array[offset++].as!(typeof(member)); } } } return object; } /// ditto @property @trusted T as(T)() if (is(Unqual!T == struct)) { T obj; static if (hasMember!(T, "fromMsgpack")) { static if (__traits(compiles, { T t; t.fromMsgpack(this); })) { obj.fromMsgpack(this); } else { static assert(0, "Failed to invoke 'fromMsgpack' on type '" ~ Unqual!T.stringof ~ "'"); } } else { static if (isTuple!T) { if (via.array.length != T.Types.length) throw new MessagePackException("The number of deserialized Tuple element is mismatched"); foreach (i, Type; T.Types) obj.field[i] = via.array[i].as!(Type); } else { // simple struct if (via.array.length != SerializingMemberNumbers!T) throw new MessagePackException("The number of deserialized struct member is mismatched"); size_t offset; foreach (i, member; obj.tupleof) { static if (isPackedField!(T.tupleof[i])) obj.tupleof[i] = via.array[offset++].as!(typeof(member)); } } } return obj; } /** * Special method called by $(D Packer). * * Params: * packer = a MessagePack serializer. */ void toMsgpack(Packer)(ref Packer packer) const { final switch (type) { case Type.nil: packer.packNil(); break; case Type.boolean: packer.pack(via.boolean); break; case Type.unsigned: packer.pack(via.uinteger); break; case Type.signed: packer.pack(via.integer); break; case Type.floating: packer.pack(via.floating); break; case Type.raw: packer.pack(via.raw); break; case Type.array: packer.beginArray(via.array.length); foreach (elem; via.array) elem.toMsgpack(packer); break; case Type.map: packer.beginMap(via.map.length); foreach (key, value; via.map) { key.toMsgpack(packer); value.toMsgpack(packer); } break; } } /** * Comparison for equality. @trusted for union. */ @trusted bool opEquals(Tdummy = void)(ref const Value other) const { if (type != other.type) return false; final switch (other.type) { case Type.nil: return true; case Type.boolean: return opEquals(other.via.boolean); case Type.unsigned: return opEquals(other.via.uinteger); case Type.signed: return opEquals(other.via.integer); case Type.floating: return opEquals(other.via.floating); case Type.raw: return opEquals(other.via.raw); case Type.array: return opEquals(other.via.array); case Type.map: return opEquals(other.via.map); } } /// ditto @trusted bool opEquals(T : bool)(in T other) const { if (type != Type.boolean) return false; return via.boolean == other; } /// ditto @trusted bool opEquals(T : ulong)(in T other) const { static if (__traits(isUnsigned, T)) { if (type != Type.unsigned) return false; return via.uinteger == other; } else { if (type != Type.signed) return false; return via.integer == other; } } /// ditto @trusted bool opEquals(T : real)(in T other) const { if (type != Type.floating) return false; return via.floating == other; } /// ditto @trusted bool opEquals(T : const Value[])(in T other) const { if (type != Type.array) return false; return via.array == other; } /// ditto @trusted bool opEquals(T : const Value[Value])(in T other) const { if (type != Type.map) return false; // This comparison is instead of default comparison because 'via.map == other' raises "Access Violation". foreach (key, value; via.map) { if (key in other) { if (other[key] != value) return false; } else { return false; } } return true; } /// ditto @trusted bool opEquals(T : const(ubyte)[])(in T other) const { if (type != Type.raw) return false; return via.raw == other; } /// ditto @trusted bool opEquals(T : string)(in T other) const { if (type != Type.raw) return false; return via.raw == cast(ubyte[])other; } @trusted hash_t toHash() const nothrow { static hash_t getHash(T)(T* v) @safe nothrow { return typeid(T).getHash(v); } final switch (type) { case Type.nil: return 0; case Type.boolean: return getHash(&via.boolean); case Type.unsigned: return getHash(&via.uinteger); case Type.signed: return getHash(&via.integer); case Type.floating: return getHash(&via.floating); case Type.raw: return getHash(&via.raw); case Type.array: hash_t ret; foreach (elem; via.array) ret ^= elem.toHash(); return ret; case Type.map: try { hash_t ret; foreach (key, value; via.map) { ret ^= key.toHash(); ret ^= value.toHash(); } return ret; } catch assert(0); } } } unittest { // nil Value value = Value(null); Value other = Value(); assert(value == other); assert(value.type == Value.Type.nil); // boolean value = Value(true); other = Value(false); assert(value != other); assert(value.type == Value.Type.boolean); assert(value.as!(bool) == true); assert(other == false); try { auto b = value.as!(uint); assert(false); } catch (MessagePackException e) { } // unsigned integer value = Value(10UL); other = Value(10UL); assert(value == other); assert(value.type == Value.Type.unsigned); assert(value.as!(uint) == 10); assert(other == 10UL); // signed integer value = Value(-20L); other = Value(-10L); assert(value != other); assert(value.type == Value.Type.signed); assert(value.as!(int) == -20); assert(other == -10L); // enum enum E : int { F = -20 } E e = value.as!(E); assert(e == E.F); // floating point value = Value(0.1e-10L); other = Value(0.1e-20L); assert(value != other); assert(value.type == Value.Type.floating); assert(value.as!(real) == 0.1e-10L); assert(other == 0.1e-20L); // raw value = Value(cast(ubyte[])[72, 105, 33]); other = Value(cast(ubyte[])[72, 105, 33]); assert(value == other); assert(value.type == Value.Type.raw); assert(value.as!(string) == "Hi!"); assert(value.as!(ubyte[3]) == [72, 105, 33]); assert(other == cast(ubyte[])[72, 105, 33]); // raw with string value = Value("hello"); other = Value("hello"); assert(value == other); assert(value.type == Value.Type.raw); assert(value.as!(string) == "hello"); // enum : string enum EStr : string { elem = "hello" } assert(value.as!(EStr) == EStr.elem); // array auto t = Value(cast(ubyte[])[72, 105, 33]); value = Value([t]); other = Value([t]); assert(value == other); assert(value.type == Value.Type.array); assert(value.as!(string[]) == ["Hi!"]); assert(other == [t]); // map value = Value([Value(1L):Value(2L)]); other = Value([Value(1L):Value(1L)]); assert(value != other); assert(value.type == Value.Type.map); assert(value.as!(int[int]) == [1:2]); assert(other == [Value(1L):Value(1L)]); value = Value(10UL); // struct static struct S { ulong num; void fromMsgpack(Value value) { num = value.via.uinteger; } } S s = value.as!(S); assert(s.num == 10); value = Value([Value(0.5f), Value(cast(ubyte[])[72, 105, 33])]); // struct static struct Simple { @nonPacked int era; double num; string msg; } Simple simple = value.as!(Simple); assert(simple.era == int.init); assert(simple.num == 0.5f); assert(simple.msg == "Hi!"); value = Value(10UL); // class static class C { ulong num; void fromMsgpack(Value value) { num = value.via.uinteger; } } C c = value.as!(C); assert(c.num == 10); static class SimpleA { bool flag = true; } static class SimpleB : SimpleA { ubyte type = 100; } static class SimpleC : SimpleB { @nonPacked string str; uint num = uint.max; } value = Value([Value(false), Value(99UL), Value(cast(ulong)(uint.max / 2u))]); SimpleC sc = value.as!(SimpleC); assert(sc.flag == false); assert(sc.type == 99); assert(sc.num == uint.max / 2); assert(sc.str.empty); // std.typecons.Tuple value = Value([Value(true), Value(1UL), Value(cast(ubyte[])"Hi!")]); auto tuple = value.as!(Tuple!(bool, uint, string)); assert(tuple.field[0] == true); assert(tuple.field[1] == 1u); assert(tuple.field[2] == "Hi!"); /* * non-MessagePackable object is stopped by static assert * static struct NonMessagePackable {} * auto nonMessagePackable = value.as!(NonMessagePackable); */ } /** * $(D Unpacked) is a $(D Range) wrapper for stream deserialization result */ struct Unpacked { Value value; /// deserialized value alias value this; /** * Constructs a $(D Unpacked) with argument. * * Params: * value = a deserialized value. */ @safe this(ref Value value) { this.value = value; } /** * InputRange primitive operation that checks iteration state. * * Returns: * true if there are no more elements to be iterated. */ @property @trusted nothrow bool empty() const // std.array.empty isn't nothrow function { return (value.type == Value.Type.array) && !value.via.array.length; } /** * Range primitive operation that returns the length of the range. * * Returns: * the number of values. */ @property @trusted size_t length() { return value.via.array.length; } /** * InputRange primitive operation that returns the currently iterated element. * * Returns: * the deserialized $(D Value). */ @property @trusted ref Value front() { return value.via.array.front; } /** * InputRange primitive operation that advances the range to its next element. */ @trusted void popFront() { value.via.array.popFront(); } /** * RandomAccessRange primitive operation. * * Returns: * the deserialized $(D Value) at $(D_PARAM n) position. */ @trusted nothrow ref Value opIndex(size_t n) { return value.via.array[n]; } /** * Returns a slice of the range. * * Paramas: * from = the start point of slicing. * to = the end point of slicing. * * Returns: * the slice of Values. */ @trusted Value[] opSlice(size_t from, size_t to) { return value.via.array[from..to]; } /** * Range primitive operation that returns the snapshot. * * Returns: * the snapshot of this Value. */ @property @safe Unpacked save() { return Unpacked(value); } } unittest { static assert(isForwardRange!Unpacked); static assert(hasLength!Unpacked); } /** * This $(D StreamingUnpacker) is a $(D MessagePack) streaming deserializer * * This implementation enables you to load multiple objects from a stream(like network). * * Example: * ----- * ... * auto unpacker = StreamingUnpacker(serializedData); * ... * * // appends new data to buffer if pre execute() call didn't finish deserialization. * unpacker.feed(newSerializedData); * * while (unpacker.execute()) { * foreach (obj; unpacker.purge()) { * // do stuff (obj is a Value) * } * } * * if (unpacker.size) * throw new Exception("Message is too large"); * ----- */ struct StreamingUnpacker { private: /* * Context state of deserialization */ enum State { HEADER = 0x00, BIN8 = 0x04, BIN16, BIN32, // Floating point, Unsigned, Signed interger (== header & 0x03) FLOAT = 0x0a, DOUBLE, UINT8, UINT16, UINT32, UINT64, INT8, INT16, INT32, INT64, // Container (== header & 0x01) STR8 = 0x19, RAW16 = 0x1a, RAW32, ARRAY16, ARRAY36, MAP16, MAP32, RAW, // D-specific type REAL } /* * Element type of container */ enum ContainerElement { ARRAY_ITEM, MAP_KEY, MAP_VALUE } /* * Internal stack context */ static struct Context { static struct Container { ContainerElement type; // value container type Value value; // current value Value key; // for map value size_t count; // container length } State state; // current state of deserialization size_t trail; // current deserializing size size_t top; // current index of stack Container[] stack; // storing values } Context context_; // stack environment for streaming deserialization mixin InternalBuffer; public: /** * Constructs a $(D StreamingUnpacker). * * Params: * target = byte buffer to deserialize * bufferSize = size limit of buffer size */ @safe this(in ubyte[] target, in size_t bufferSize = 8192) { initializeBuffer(target, bufferSize); initializeContext(); } /** * Forwards to deserialized object. * * Returns: * the $(D Unpacked) object contains deserialized value. */ @property @safe Unpacked unpacked() { return Unpacked(context_.stack[0].value); } /** * Clears some states for next deserialization. */ @safe nothrow void clear() { initializeContext(); parsed_ = 0; } /** * Convenient method for unpacking and clearing states. * * Example: * ----- * foreach (obj; unpacker.purge()) { * // do stuff * } * ----- * is equivalent to * ----- * foreach (obj; unpacker.unpacked) { * // do stuff * } * unpacker.clear(); * ----- * * Returns: * the $(D Unpacked) object contains deserialized value. */ @safe Unpacked purge() { auto result = Unpacked(context_.stack[0].value); clear(); return result; } /** * Executes deserialization. * * Returns: * true if deserialization has been completed, otherwise false. * * Throws: * $(D UnpackException) when parse error occurs. */ bool execute() { /* * Current implementation is very dirty(goto! goto!! goto!!!). * This Complexity for performance(avoid function call). */ bool ret; size_t cur = offset_; Value obj; // restores before state auto state = context_.state; auto trail = context_.trail; auto top = context_.top; auto stack = &context_.stack; /* * Helper for container deserialization */ bool startContainer(string Type)(ContainerElement type, size_t length) { mixin("callback" ~ Type ~ "((*stack)[top].value, length);"); if (length == 0) return false; (*stack)[top].type = type; (*stack)[top].count = length; (*stack).length = ++top + 1; return true; } // non-deserialized data is nothing if (used_ - offset_ == 0) goto Labort; do { Lstart: if (state == State.HEADER) { const header = buffer_[cur]; if (0x00 <= header && header <= 0x7f) { // positive callbackUInt(obj, header); goto Lpush; } else if (0xe0 <= header && header <= 0xff) { // negative callbackInt(obj, cast(byte)header); goto Lpush; } else if (0xa0 <= header && header <= 0xbf) { // fix raw trail = header & 0x1f; state = State.RAW; cur++; continue; } else if (0x90 <= header && header <= 0x9f) { // fix array if (!startContainer!"Array"(ContainerElement.ARRAY_ITEM, header & 0x0f)) goto Lpush; cur++; continue; } else if (0x80 <= header && header <= 0x8f) { // fix map if (!startContainer!"Map"(ContainerElement.MAP_KEY, header & 0x0f)) goto Lpush; cur++; continue; } else { switch (header) { case Format.UINT8, Format.UINT16, Format.UINT32, Format.UINT64, Format.INT8, Format.INT16, Format.INT32, Format.INT64, Format.FLOAT, Format.DOUBLE: trail = 1 << (header & 0x03); // computes object size state = cast(State)(header & 0x1f); break; case Format.REAL: trail = RealSize; state = State.REAL; break; case Format.ARRAY16, Format.ARRAY32, Format.MAP16, Format.MAP32: trail = 2 << (header & 0x01); // computes container size state = cast(State)(header & 0x1f); break; // raw will become str format in new spec case Format.STR8: case Format.RAW16: // will be STR16 case Format.RAW32: // will be STR32 trail = 1 << ((header & 0x03) - 1); // computes container size state = cast(State)(header & 0x1f); break; case Format.BIN8, Format.BIN16, Format.BIN32: trail = 1 << (header & 0x03); // computes container size state = cast(State)(header & 0x1f); break; case Format.NIL: callbackNil(obj); goto Lpush; case Format.TRUE: callbackBool(obj, true); goto Lpush; case Format.FALSE: callbackBool(obj, false); goto Lpush; default: throw new UnpackException("Unknown type"); } cur++; goto Lstart; } } else { // data lack for deserialization if (used_ - cur < trail) goto Labort; const base = cur; cur += trail - 1; // fix current position final switch (state) { case State.FLOAT: _f temp; temp.i = load32To!uint(buffer_[base..base + trail]); callbackFloat(obj, temp.f); goto Lpush; case State.DOUBLE: _d temp; temp.i = load64To!ulong(buffer_[base..base + trail]); callbackFloat(obj, temp.f); goto Lpush; case State.REAL: const expb = base + ulong.sizeof; version (NonX86) { CustomFloat!80 temp; const frac = load64To!ulong (buffer_[base..expb]); const exp = load16To!ushort(buffer_[expb..expb + ushort.sizeof]); temp.significand = frac; temp.exponent = exp & 0x7fff; temp.sign = exp & 0x8000 ? true : false; // NOTE: temp.get!real is inf on non-x86 when deserialized value is larger than double.max. callbackFloat(obj, temp.get!real); } else { _r temp; temp.fraction = load64To!(typeof(temp.fraction))(buffer_[base..expb]); temp.exponent = load16To!(typeof(temp.exponent))(buffer_[expb..expb + temp.exponent.sizeof]); callbackFloat(obj, temp.f); } goto Lpush; case State.UINT8: callbackUInt(obj, buffer_[base]); goto Lpush; case State.UINT16: callbackUInt(obj, load16To!ulong(buffer_[base..base + trail])); goto Lpush; case State.UINT32: callbackUInt(obj, load32To!ulong(buffer_[base..base + trail])); goto Lpush; case State.UINT64: callbackUInt(obj, load64To!ulong(buffer_[base..base + trail])); goto Lpush; case State.INT8: callbackInt(obj, cast(byte)buffer_[base]); goto Lpush; case State.INT16: callbackInt(obj, load16To!long(buffer_[base..base + trail])); goto Lpush; case State.INT32: callbackInt(obj, load32To!long(buffer_[base..base + trail])); goto Lpush; case State.INT64: callbackInt(obj, load64To!long(buffer_[base..base + trail])); goto Lpush; case State.RAW: Lraw: hasRaw_ = true; callbackRaw(obj, buffer_[base..base + trail]); goto Lpush; case State.STR8, State.BIN8: trail = buffer_[base]; if (trail == 0) goto Lraw; state = State.RAW; cur++; goto Lstart; case State.RAW16, State.BIN16: trail = load16To!size_t(buffer_[base..base + trail]); if (trail == 0) goto Lraw; state = State.RAW; cur++; goto Lstart; case State.RAW32, State.BIN32: trail = load32To!size_t(buffer_[base..base + trail]); if (trail == 0) goto Lraw; state = State.RAW; cur++; goto Lstart; case State.ARRAY16: if (!startContainer!"Array"(ContainerElement.ARRAY_ITEM, load16To!size_t(buffer_[base..base + trail]))) goto Lpush; state = State.HEADER; cur++; continue; case State.ARRAY36: if (!startContainer!"Array"(ContainerElement.ARRAY_ITEM, load32To!size_t(buffer_[base..base + trail]))) goto Lpush; state = State.HEADER; cur++; continue; case State.MAP16: if (!startContainer!"Map"(ContainerElement.MAP_KEY, load16To!size_t(buffer_[base..base + trail]))) goto Lpush; state = State.HEADER; cur++; continue; case State.MAP32: if (!startContainer!"Map"(ContainerElement.MAP_KEY, load32To!size_t(buffer_[base..base + trail]))) goto Lpush; state = State.HEADER; cur++; continue; case State.HEADER: break; } } Lpush: if (top == 0) goto Lfinish; auto container = &(*stack)[top - 1]; final switch (container.type) { case ContainerElement.ARRAY_ITEM: container.value.via.array ~= obj; if (--container.count == 0) { obj = container.value; top--; goto Lpush; } break; case ContainerElement.MAP_KEY: container.key = obj; container.type = ContainerElement.MAP_VALUE; break; case ContainerElement.MAP_VALUE: container.value.via.map[container.key] = obj; if (--container.count == 0) { obj = container.value; top--; goto Lpush; } container.type = ContainerElement.MAP_KEY; } state = State.HEADER; cur++; } while (cur < used_); goto Labort; Lfinish: (*stack)[0].value = obj; ret = true; cur++; goto Lend; Labort: ret = false; Lend: context_.state = state; context_.trail = trail; context_.top = top; parsed_ += cur - offset_; offset_ = cur; return ret; } /** * supports foreach. One loop provides $(D Unpacked) object contains execute() result. * This is convenient in case that $(D MessagePack) values are continuous. */ int opApply(scope int delegate(ref Unpacked) dg) { int result; while (execute()) { auto unpackedResult = Unpacked(context_.stack[0].value); result = dg(unpackedResult); if (result) break; clear(); } return result; } private: /* * initializes internal stack environment. */ @safe nothrow void initializeContext() { context_.state = State.HEADER; context_.trail = 0; context_.top = 0; context_.stack.length = 1; } } unittest { // serialize mixin DefinePacker; packer.packArray(null, true, 1, -2, "Hi!", [1], [1:1], double.max); // deserialize auto unpacker = StreamingUnpacker(packer.stream.data); unpacker.execute(); auto unpacked = unpacker.purge(); // Range test foreach (unused; 0..2) { uint i; foreach (obj; unpacked) i++; assert(i == unpacked.via.array.length); } auto result = unpacked.via.array; assert(result[0].type == Value.Type.nil); assert(result[1].via.boolean == true); assert(result[2].via.uinteger == 1); assert(result[3].via.integer == -2); assert(result[4].via.raw == [72, 105, 33]); assert(result[5].as!(int[]) == [1]); assert(result[6].as!(int[int]) == [1:1]); assert(result[7].as!(double) == double.max); } private: /* * Sets value type and value. * * Params: * value = the value to set * number = the content to set */ @trusted void callbackUInt(ref Value value, ulong number) { value.type = Value.Type.unsigned; value.via.uinteger = number; } /// ditto @trusted void callbackInt(ref Value value, long number) { value.type = Value.Type.signed; value.via.integer = number; } /// ditto @trusted void callbackFloat(ref Value value, real number) { value.type = Value.Type.floating; value.via.floating = number; } /// ditto @trusted void callbackRaw(ref Value value, ubyte[] raw) { value.type = Value.Type.raw; value.via.raw = raw; } /// ditto @trusted void callbackArray(ref Value value, size_t length) { value.type = Value.Type.array; value.via.array.length = 0; value.via.array.reserve(length); } /// ditto @trusted void callbackMap(ref Value value, lazy size_t length) { value.type = Value.Type.map; value.via.map = null; // clears previous result avoiding 'Access Violation' } /// ditto @safe void callbackNil(ref Value value) { value.type = Value.Type.nil; } /// ditto @trusted void callbackBool(ref Value value, bool boolean) { value.type = Value.Type.boolean; value.via.boolean = boolean; } unittest { Value value; // Unsigned integer callbackUInt(value, uint.max); assert(value.type == Value.Type.unsigned); assert(value.via.uinteger == uint.max); // Signed integer callbackInt(value, int.min); assert(value.type == Value.Type.signed); assert(value.via.integer == int.min); // Floating point callbackFloat(value, real.max); assert(value.type == Value.Type.floating); assert(value.via.floating == real.max); // Raw callbackRaw(value, cast(ubyte[])[1]); assert(value.type == Value.Type.raw); assert(value.via.raw == cast(ubyte[])[1]); // Array Value[] array; array.reserve(16); callbackArray(value, 16); assert(value.type == Value.Type.array); assert(value.via.array.capacity == array.capacity); // Map Value[Value] map; callbackMap(value, 16); assert(value.type == Value.Type.map); assert(value.via.map == null); // NIL callbackNil(value); assert(value.type == Value.Type.nil); // Bool callbackBool(value, true); assert(value.type == Value.Type.boolean); assert(value.via.boolean == true); } private: /* * A callback for type-mismatched error in cast conversion. */ @safe pure void onCastError() { throw new MessagePackException("Attempt to cast with another type"); } /* * A callback for type-mismatched error in deserialization process. */ @safe pure void onInvalidType() { throw new MessagePackException("Attempt to unpack with non-compatible type"); } public: /* * Handy helper for creating MessagePackable object. * * toMsgpack / fromMsgpack are special methods for serialization / deserialization. * This template provides those methods to struct/class. * * Example: * ----- * struct S * { * int num; string str; * * // http://d.puremagic.com/issues/show_bug.cgi?id = 1099 * mixin MessagePackable; // all members * // mixin MessagePackable!("num"); // num only * } * ----- * * Defines those methods manually if you treat complex data-structure. */ mixin template MessagePackable(Members...) { static if (Members.length == 0) { /** * Serializes members using $(D_PARAM packer). * * Params: * packer = the serializer to pack. */ void toMsgpack(Packer)(ref Packer packer, bool withFieldName = false) const { if (withFieldName) { packer.beginMap(this.tupleof.length); foreach (i, member; this.tupleof) { pack(getFieldName!(typeof(this), i)); packer.pack(member); } } else { packer.beginArray(this.tupleof.length); foreach (member; this.tupleof) packer.pack(member); } } /** * Deserializes $(D MessagePack) object to members using Value. * * Params: * value = the MessagePack value to unpack. * * Throws: * MessagePackException if $(D_PARAM value) is not an Array type. */ void fromMsgpack(Value value) { // enables if std.contracts.enforce is moved to object_.d // enforceEx!MessagePackException(value.type == Value.Type.array, "Value must be Array type"); if (value.type != Value.Type.array) throw new MessagePackException("Value must be an Array type"); if (value.via.array.length != this.tupleof.length) throw new MessagePackException("The size of deserialized value is mismatched"); foreach (i, member; this.tupleof) this.tupleof[i] = value.via.array[i].as!(typeof(member)); } /** * Deserializes $(D MessagePack) object to members using direct-conversion deserializer. * * Params: * value = the reference to direct-conversion deserializer. * * Throws: * MessagePackException if the size of deserialized value is mismatched. */ void fromMsgpack(ref Unpacker unpacker) { auto length = unpacker.beginArray(); if (length != this.tupleof.length) throw new MessagePackException("The size of deserialized value is mismatched"); foreach (i, member; this.tupleof) unpacker.unpack(this.tupleof[i]); } } else { /** * Member selecting version of toMsgpack. */ void toMsgpack(Packer)(ref Packer packer, bool withFieldName = false) const { if (withFieldName) { packer.beginMap(Members.length); foreach (member; Members) { packer.pack(member); packer.pack(mixin(member)); } } else { packer.beginArray(Members.length); foreach (member; Members) packer.pack(mixin(member)); } } /** * Member selecting version of fromMsgpack for Value. */ void fromMsgpack(Value value) { if (value.type != Value.Type.array) throw new MessagePackException("Value must be an Array type"); if (value.via.array.length != Members.length) throw new MessagePackException("The size of deserialized value is mismatched"); foreach (i, member; Members) mixin(member ~ "= value.via.array[i].as!(typeof(" ~ member ~ "));"); } /** * Member selecting version of fromMsgpack for direct-converion deserializer. */ void fromMsgpack(ref Unpacker unpacker) { auto length = unpacker.beginArray(); if (length != Members.length) throw new MessagePackException("The size of deserialized value is mismatched"); foreach (member; Members) unpacker.unpack(mixin(member)); } } } unittest { { // all members /* * Comment out because "src/msgpack.d(4048): Error: struct msgpack.__unittest16.S no size yet for forward reference" occurs */ static struct S { uint num; string str; mixin MessagePackable; } mixin DefinePacker; S orig = S(10, "Hi!"); orig.toMsgpack(packer); { // stream auto unpacker = StreamingUnpacker(packer.stream.data); unpacker.execute(); S result; result.fromMsgpack(unpacker.unpacked); assert(result.num == 10); assert(result.str == "Hi!"); } { // direct conversion auto unpacker = Unpacker(packer.stream.data); S result; unpacker.unpack(result); assert(result.num == 10); assert(result.str == "Hi!"); } } { // member select static class C { uint num; string str; this() {} this(uint n, string s) { num = n; str = s; } mixin MessagePackable!("num"); } mixin DefinePacker; C orig = new C(10, "Hi!"); orig.toMsgpack(packer); { // stream auto unpacker = StreamingUnpacker(packer.stream.data); unpacker.execute(); C result = new C; result.fromMsgpack(unpacker.unpacked); assert(result.num == 10); } { // direct conversion auto unpacker = Unpacker(packer.stream.data); C result; unpacker.unpack(result); assert(result.num == 10); } } } private: // Common and system dependent operations /* * MessagePack type-information format * * See_Also: * $(LINK2 http://redmine.msgpack.org/projects/msgpack/wiki/FormatSpec, MessagePack Specificaton) */ enum Format : ubyte { // unsinged integer UINT8 = 0xcc, // ubyte UINT16 = 0xcd, // ushort UINT32 = 0xce, // uint UINT64 = 0xcf, // ulong // signed integer INT8 = 0xd0, // byte INT16 = 0xd1, // short INT32 = 0xd2, // int INT64 = 0xd3, // long // floating point FLOAT = 0xca, // float DOUBLE = 0xcb, // double // raw byte RAW = 0xa0, RAW16 = 0xda, RAW32 = 0xdb, // bin type BIN8 = 0xc4, BIN16 = 0xc5, BIN32 = 0xc6, // str type STR8 = 0xd9, //STR16 = 0xda, //STR32 = 0xdb, // array ARRAY = 0x90, ARRAY16 = 0xdc, ARRAY32 = 0xdd, // map MAP = 0x80, MAP16 = 0xde, MAP32 = 0xdf, // other NIL = 0xc0, // null TRUE = 0xc3, FALSE = 0xc2, // real (This format is D only!) REAL = 0xd4 } /* * For float type serialization / deserialization */ union _f { float f; uint i; } /* * For double type serialization / deserialization */ union _d { double f; ulong i; } /* * For real type serialization / deserialization * * 80-bit real is padded to 12 bytes(Linux) and 16 bytes(Mac). * http://lists.puremagic.com/pipermail/digitalmars-d/2010-June/077394.html */ union _r { real f; struct { ulong fraction; ushort exponent; // includes sign } } enum RealSize = 10; // Real size is 80bit /* * Detects whether $(D_PARAM T) is a built-in byte type. */ template isByte(T) { enum isByte = staticIndexOf!(Unqual!T, byte, ubyte) >= 0; } unittest { static assert(isByte!(byte)); static assert(isByte!(const(byte))); static assert(isByte!(ubyte)); static assert(isByte!(immutable(ubyte))); static assert(!isByte!(short)); static assert(!isByte!(char)); static assert(!isByte!(string)); } /* * Gets asterisk string from pointer type */ template AsteriskOf(T) { static if (is(T P == U*, U)) enum AsteriskOf = "*" ~ AsteriskOf!U; else enum AsteriskOf = ""; } /** * Get the number of member to serialize. */ template SerializingMemberNumbers(Classes...) { static if (Classes.length == 0) enum SerializingMemberNumbers = 0; else enum SerializingMemberNumbers = Filter!(isPackedField, Classes[0].tupleof).length + SerializingMemberNumbers!(Classes[1..$]); } /** * Get derived classes with serialization-order */ template SerializingClasses(T) { // There is no information in Object type. Currently disable Object serialization. static if (is(T == Object)) static assert(false, "Object type serialization doesn't support yet. Please define toMsgpack/fromMsgpack and use cast"); else alias TypeTuple!(Reverse!(Erase!(Object, BaseClassesTuple!(T))), T) SerializingClasses; } /** * Get a field name of class or struct. */ template getFieldName(Type, size_t i) { import std.conv : text; static assert((is(Unqual!Type == class) || is(Unqual!Type == struct)), "Type must be class or struct: type = " ~ Type.stringof); static assert(i < Type.tupleof.length, text(Type.stringof, " has ", Type.tupleof.length, " attributes: given index = ", i)); enum getFieldName = __traits(identifier, Type.tupleof[i]); } version (LittleEndian) { /* * Converts $(value) to different Endian. * * Params: * value = the LittleEndian value to convert. * * Returns: * the converted value. */ @trusted ushort convertEndianTo(size_t Bit, T)(in T value) if (Bit == 16) { return ntohs(cast(ushort)value); } // ditto @trusted uint convertEndianTo(size_t Bit, T)(in T value) if (Bit == 32) { return ntohl(cast(uint)value); } // ditto @trusted ulong convertEndianTo(size_t Bit, T)(in T value) if (Bit == 64) { // dmd has convert function? return ((((cast(ulong)value) << 56) & 0xff00000000000000UL) | (((cast(ulong)value) << 40) & 0x00ff000000000000UL) | (((cast(ulong)value) << 24) & 0x0000ff0000000000UL) | (((cast(ulong)value) << 8) & 0x000000ff00000000UL) | (((cast(ulong)value) >> 8) & 0x00000000ff000000UL) | (((cast(ulong)value) >> 24) & 0x0000000000ff0000UL) | (((cast(ulong)value) >> 40) & 0x000000000000ff00UL) | (((cast(ulong)value) >> 56) & 0x00000000000000ffUL)); } unittest { assert(convertEndianTo!16(0x0123) == 0x2301); assert(convertEndianTo!32(0x01234567) == 0x67452301); assert(convertEndianTo!64(0x0123456789abcdef) == 0xefcdab8967452301); } /* * Comapatible for BigEndian environment. */ ubyte take8from(size_t bit = 8, T)(T value) { static if (bit == 8 || bit == 16 || bit == 32 || bit == 64) return (cast(ubyte*)&value)[0]; else static assert(false, bit.stringof ~ " is not support bit width."); } unittest { foreach (Integer; TypeTuple!(ubyte, ushort, uint, ulong)) { assert(take8from!8 (cast(Integer)0x01) == 0x01); assert(take8from!16(cast(Integer)0x0123) == 0x23); assert(take8from!32(cast(Integer)0x01234567) == 0x67); assert(take8from!64(cast(Integer)0x0123456789abcdef) == 0xef); } } } else { /* * Comapatible for LittleEndian environment. */ @safe ushort convertEndianTo(size_t Bit, T)(in T value) if (Bit == 16) { return cast(ushort)value; } // ditto @safe uint convertEndianTo(size_t Bit, T)(in T value) if (Bit == 32) { return cast(uint)value; } // ditto @safe ulong convertEndianTo(size_t Bit, T)(in T value) if (Bit == 64) { return cast(ulong)value; } unittest { assert(convertEndianTo!16(0x0123) == 0x0123); assert(convertEndianTo!32(0x01234567) == 0x01234567); assert(convertEndianTo!64(0x0123456789) == 0x0123456789); } /* * Takes 8bit from $(D_PARAM value) * * Params: * value = the content to take. * * Returns: * the 8bit value corresponding $(D_PARAM bit) width. */ ubyte take8from(size_t bit = 8, T)(T value) { static if (bit == 8) return (cast(ubyte*)&value)[0]; else static if (bit == 16) return (cast(ubyte*)&value)[1]; else static if (bit == 32) return (cast(ubyte*)&value)[3]; else static if (bit == 64) return (cast(ubyte*)&value)[7]; else static assert(false, bit.stringof ~ " is not support bit width."); } unittest { foreach (Integer; TypeTuple!(ubyte, ushort, uint, ulong)) { assert(take8from!8 (cast(Integer)0x01) == 0x01); assert(take8from!16(cast(Integer)0x0123) == 0x23); assert(take8from!32(cast(Integer)0x01234567) == 0x67); assert(take8from!64(cast(Integer)0x0123456789abcdef) == 0xef); } } } /* * Loads $(D_PARAM T) type value from $(D_PARAM buffer). * * Params: * buffer = the serialized contents. * * Returns: * the Endian-converted value. */ T load16To(T)(ubyte[] buffer) { return cast(T)(convertEndianTo!16(*cast(ushort*)buffer.ptr)); } // ditto T load32To(T)(ubyte[] buffer) { return cast(T)(convertEndianTo!32(*cast(uint*)buffer.ptr)); } // ditto T load64To(T)(ubyte[] buffer) { return cast(T)(convertEndianTo!64(*cast(ulong*)buffer.ptr)); } BioD-0.1.0/bio/bam/utils/000077500000000000000000000000001273003163100147715ustar00rootroot00000000000000BioD-0.1.0/bio/bam/utils/array.d000066400000000000000000000070421273003163100162570ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.utils.array; import std.c.string; import std.traits; /// Modifies array in-place so that $(D slice) is replaced by /// $(D replacement[]). /// /// WARNING: it's you who is responsible that $(D slice) is indeed /// a slice of $(D s). void replaceSlice(T, U)(ref T[] s, in U[] slice, in T[] replacement) if (is(Unqual!U == T)) { auto offset = slice.ptr - s.ptr; auto slicelen = slice.length; auto replen = replacement.length; auto newlen = s.length - slicelen + replen; if (slicelen == replen) { s[offset .. offset + slicelen] = replacement; return; } if (replen < slicelen) { // overwrite piece of slice s[offset .. offset + replen] = replacement; // and then move the remainder memmove(s.ptr + (offset + replen), s.ptr + (offset + slicelen), (newlen - offset - replen) * T.sizeof); s.length = newlen; return; } // replen > slicelen s.length = newlen; // here, first move the remainder memmove(s.ptr + (offset + replen), s.ptr + (offset + slicelen), (newlen - offset - replen) * T.sizeof); // and then overwrite s[offset .. offset + replen] = replacement; } /// Does almost the same, but does not require $(D replacement), /// instead only its length, $(D n) bytes. This is useful for /// avoiding memory allocations. void prepareSlice(T, U)(ref T[] s, in U[] slice, size_t n) if (is(Unqual!U == T)) { auto offset = slice.ptr - s.ptr; auto slicelen = slice.length; auto replen = n; auto newlen = s.length - slicelen + replen; if (slicelen == replen) { return; } if (replen < slicelen) { memmove(s.ptr + (offset + replen), s.ptr + (offset + slicelen), (newlen - offset - replen) * T.sizeof); s.length = newlen; return; } // replen > slicelen s.length = newlen; memmove(s.ptr + (offset + replen), s.ptr + (offset + slicelen), (newlen - offset - replen) * T.sizeof); } unittest { auto array = [1, 2, 3, 4, 5]; replaceSlice(array, array[2 .. 4], [-1, -2, -5]); assert(array == [1, 2, -1, -2, -5, 5]); replaceSlice(array, array[1 .. 4], cast(int[])[]); assert(array == [1, -5, 5]); replaceSlice(array, array[0 .. 1], [3]); assert(array == [3, -5, 5]); } BioD-0.1.0/bio/bam/utils/graph.d000066400000000000000000000057371273003163100162530ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.utils.graph; import std.exception; import std.array; import std.algorithm; import std.range; /// This class is used only in utils/samheadermerger.d for merging /// reference sequence dictionaries, thus not much functionality /// is presented here. class DirectedGraph { void addEdge(string a, string b) { auto indA = addNode(a); auto indB = addNode(b); _edges[indA] ~= indB; } /// Returns: unique integer identifier of node size_t addNode(string a) { if (a !in _indices) { _nodes ~= a; _edges.length = _nodes.length; return _indices[a] = _nodes.length - 1; } else { return _indices[a]; } } string[] topologicalSort() { auto predecessor_count = new size_t[_nodes.length]; foreach (node_neighbours; _edges) { foreach (neighbour; node_neighbours) predecessor_count[neighbour] += 1; } size_t[] queue; queue.reserve(_nodes.length); for (size_t i = 0; i < _nodes.length; i++) if (predecessor_count[i] == 0) queue ~= i; string[] result; result.reserve(_nodes.length); while (!queue.empty) { auto front = queue[0]; result ~= _nodes[front]; queue = queue[1 .. $]; foreach (successor; _edges[front]) { predecessor_count[successor] -= 1; if (predecessor_count[successor] == 0) { queue ~= successor; } } } if (result.length < _nodes.length) { throw new Exception("graph contains cycles"); } return result; } private: string[] _nodes; size_t[string] _indices; size_t[][] _edges; } BioD-0.1.0/bio/bam/utils/samheadermerger.d000066400000000000000000000346511273003163100203020ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2014 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.utils.samheadermerger; import bio.sam.header; import bio.bam.validation.samheader; import std.array; import std.range; import std.algorithm; import std.conv; import std.typecons; import std.exception; import bio.bam.utils.graph; /// Class encapsulating functionality of merging several SAM headers /// into one. (In fact, its role is to just group several variables, /// so it could be replaced by a function returning a struct.) class SamHeaderMerger { enum Strategy { simple, usingIndex } Strategy strategy; /// Takes array of SAM headers as an input. this(SamHeader[] headers, bool validate_headers=false) { _headers = headers; _len = _headers.length; merged_header = new SamHeader(); ref_id_map = new size_t[size_t][_len]; ref_id_reverse_map = new size_t[size_t][_len]; program_id_map = new string[string][_len]; readgroup_id_map = new string[string][_len]; if (validate_headers) { // TODO: make custom validator for producing better error message foreach (size_t i, header; _headers) { if (!isValid(header)) { throw new Exception("header #" ~ to!string(i) ~ " is invalid, can't merge"); } } } auto expected = _headers[0].sorting_order; if (expected != SortingOrder.coordinate && expected != SortingOrder.queryname) { throw new Exception("file headers indicate that some files are not sorted"); } foreach (header; _headers) { if (header.sorting_order != expected) { throw new Exception("sorting orders of files don't agree, can't merge"); } } merged_header.sorting_order = expected; mergeSequenceDictionaries(); mergeReadGroups(); mergeProgramRecords(); mergeComments(); } /// The main result of merging -- new SamHeader SamHeader merged_header; /// Map: index of SamHeader in input array of headers -> old refID -> new refID size_t[size_t][] ref_id_map; /// the same for read group identifiers string[string][] readgroup_id_map; /// the same for program record identifiers string[string][] program_id_map; /// Map: index of SamHeader in input array of headers -> new refID -> old refID size_t[size_t][] ref_id_reverse_map; private: // NOTE FOR DEVELOPER: // for more info on what's going on here, read comments in sambamba/sambamba/merge.d SamHeader[] _headers; size_t _len; // number of headers static void addVerticeToDict(ref SqLine[string] dict, ref SqLine line) { if (line.name in dict) { if (line.length != dict[line.name].length) { // those two @SQ lines are highly unlikely to refer to the same // reference sequence if lengths are different throw new Exception("can't merge SAM headers: one of references with " ~ "name " ~ line.name ~ " has length " ~ to!string(dict[line.name].length) ~ " while another one with the same name has length " ~ to!string(line.length)); } // TODO: merge individual tags? } else { dict[line.name] = line; } } void mergeSequenceDictionaries() { // make a directed graph out of reference sequences and do a topological sort SqLine[string] dict; // create a graph auto g = new DirectedGraph(); foreach (header; _headers) { auto sequences = header.sequences.values; auto prev = sequences.front; addVerticeToDict(dict, prev); g.addNode(prev.name); sequences.popFront(); while (!sequences.empty) { auto cur = sequences.front; addVerticeToDict(dict, cur); g.addEdge(prev.name, cur.name); prev = cur; sequences.popFront(); } } // get topologically sorted nodes try { foreach (v; g.topologicalSort()) { merged_header.sequences.add(dict[v]); } strategy = Strategy.simple; } catch (Exception e) { // failed, try another strategy which requires index files foreach (sq_line; sort!((a, b) => a.name < b.name)(dict.values)) { merged_header.sequences.add(sq_line); } strategy = Strategy.usingIndex; } // make mappings foreach (size_t i, header; _headers) { foreach (size_t j, SqLine sq; header.sequences) { auto new_index = merged_header.sequences.getSequenceIndex(sq.name); if (new_index < 0) { import std.stdio; stderr.writeln("merged header sequence dictionary: \n", merged_header.sequences.values); throw new Exception("BUG: " ~ sq.name ~ " is not in merged header dictionary"); } ref_id_map[i][j] = to!size_t(new_index); ref_id_reverse_map[i][to!size_t(new_index)] = j; } } } // The reason to pass by reference is that when merging program records, // this function is called in a loop, and we need to keep some structures between calls. // // $(D dict) is a collection of Line structs, which will finally be part of the header; // $(D record_id_map) is an array of mappings (for each header) where old record identifier // is mapped into a new one; static void mergeHeaderLines(Line, R)(R records_with_file_ids, size_t file_count, ref HeaderLineDictionary!Line dict, ref string[string][] record_id_map) if (is(typeof(Line.identifier) == string) && is(ElementType!R == Tuple!(Line, size_t)) && (is(Line == RgLine) || is(Line == PgLine))) { // Map: record identifier -> record -> list of files size_t[][Line][string] id_to_record; foreach (record_and_file; records_with_file_ids) { auto rec = record_and_file[0]; auto file_id = record_and_file[1]; id_to_record[rec.identifier][rec] ~= file_id; } // Loop through all identifiers foreach (record_id, records_with_same_id; id_to_record) { // Several read groups/program records can share the // common identifier, and each one of them can be // presented in several files. // // If read groups/program records are equal // (i.e. all fields are equal) then they are treated // as a single read group/program record // // Here we iterate over those read groups/program records // and files where they were seen, renaming identifiers // in order to avoid collisions where necessary. foreach (rec, file_ids; records_with_same_id) { string new_id = record_id; if (record_id in dict) { // if already used ID is encountered, // find unused ID by adding ".N" to the old ID for (int i = 1; ; ++i) { new_id = record_id ~ "." ~ to!string(i); if (new_id !in dict) { break; } } } // save mapping foreach (file_id; file_ids) { record_id_map[file_id][record_id] = new_id; } // update merged header rec.identifier = new_id; dict.add(rec); } } } void mergeReadGroups() { Tuple!(RgLine, size_t)[] readgroups_with_file_ids; for (size_t i = 0; i < _len; i++) foreach (rg; _headers[i].read_groups.values) readgroups_with_file_ids ~= tuple(rg, i); auto dict = new RgLineDictionary(); mergeHeaderLines(readgroups_with_file_ids, _len, dict, readgroup_id_map); merged_header.read_groups = dict; } void mergeProgramRecords() { Tuple!(PgLine, size_t)[] programs_with_file_ids; for (size_t i = 0; i < _len; i++) foreach (pg; _headers[i].programs.values) programs_with_file_ids ~= tuple(pg, i); auto vertices = partition!"a[0].previous_program !is null"(programs_with_file_ids); programs_with_file_ids = programs_with_file_ids[0 .. $ - vertices.length]; auto dict = new PgLineDictionary(); while (!vertices.empty) { // populates dict and program_id_map mergeHeaderLines!PgLine(vertices, _len, dict, program_id_map); // find children of current vertices auto old_ids = map!"tuple(a[0].identifier, a[1])"(vertices); vertices = partition!((Tuple!(PgLine, size_t) a) { return !canFind(old_ids, tuple(a[0].previous_program, a[1])); })(programs_with_file_ids); programs_with_file_ids = programs_with_file_ids[0 .. $ - vertices.length]; // update PP tags in children foreach (ref pg_with_file_id; vertices) { auto pg = pg_with_file_id[0]; auto file_id = pg_with_file_id[1]; if (pg.previous_program !is null && pg.previous_program in program_id_map[file_id]) { auto new_id = program_id_map[file_id][pg.previous_program]; if (new_id != pg.previous_program) { pg.previous_program = new_id; } } pg_with_file_id = tuple(pg, file_id); } } merged_header.programs = dict; } void mergeComments() { merged_header.comments = join(map!"a.comments"(_headers)); } } unittest { import std.stdio; import std.algorithm; writeln("Testing SAM header merging..."); auto h1 = new SamHeader(); auto h2 = new SamHeader(); auto h3 = new SamHeader(); h1.sorting_order = SortingOrder.coordinate; h2.sorting_order = SortingOrder.coordinate; h3.sorting_order = SortingOrder.coordinate; // ---- fill reference sequence dictionaries ------------------------------- h1.sequences.add(SqLine("A", 100)); h1.sequences.add(SqLine("B", 200)); h1.sequences.add(SqLine("C", 300)); h2.sequences.add(SqLine("D", 100)); h2.sequences.add(SqLine("B", 200)); h2.sequences.add(SqLine("E", 300)); h3.sequences.add(SqLine("A", 100)); h3.sequences.add(SqLine("E", 300)); h3.sequences.add(SqLine("C", 300)); // expected: A B C // D E // ---- add a few read group records --------------------------------------- h1.read_groups.add(RgLine("A", "CN1")); h1.read_groups.add(RgLine("C", "CN3")); h2.read_groups.add(RgLine("B", "CN2")); h2.read_groups.add(RgLine("C", "CN4")); h3.read_groups.add(RgLine("B", "CN2")); h3.read_groups.add(RgLine("A", "CN4")); // ---- add some program records with a lot of name clashes ---------------- h1.programs.add(PgLine("A", "X")); // .> C h1.programs.add(PgLine("B", "Y", "", "A")); // / h1.programs.add(PgLine("C", "Z", "", "B")); // A -> B -> D h1.programs.add(PgLine("D", "T", "", "B")); // h2.programs.add(PgLine("B", "Z")); // B -> A -> C h2.programs.add(PgLine("A", "Y", "", "B")); h2.programs.add(PgLine("C", "T", "", "A")); h3.programs.add(PgLine("D", "Y")); // D -> C -> B h3.programs.add(PgLine("C", "T", "", "D")); h3.programs.add(PgLine("B", "X", "", "C")); // expected result: // // .> C.1 // / // A -> B.1 -> D.1 // // B -> A.1 -> C.2 // // D -> C -> B.2 // ---- add some comments - just for the sake of completeness -------------- h1.comments ~= "abc"; h2.comments ~= ["def", "ghi"]; // ------------------ merge these three headers ---------------------------- { auto merger = new SamHeaderMerger([h1, h2, h3]); auto h = merger.merged_header; assert(h.sorting_order == SortingOrder.coordinate); assert(equal(h.sequences.values, [SqLine("A", 100), SqLine("D", 100), SqLine("B", 200), SqLine("E", 300), SqLine("C", 300)])); assert(h.comments == ["abc", "def", "ghi"]); assert(equal(sort(array(map!"a.identifier"(h.programs.values))), ["A", "A.1", "B", "B.1", "B.2", "C", "C.1", "C.2", "D", "D.1"])); assert(equal(sort(array(map!"a.identifier"(h.read_groups.values))), ["A", "A.1", "B", "C", "C.1"])); } // sambamba issue 110 { auto h0 = new SamHeader(); h0.sorting_order = SortingOrder.coordinate; h0.sequences.add(SqLine("A", 100)); auto merger = new SamHeaderMerger([h0]); auto h = merger.merged_header; assert(equal(h.sequences.values, h0.sequences.values)); } } BioD-0.1.0/bio/bam/utils/value.d000066400000000000000000000077541273003163100162670ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.utils.value; import bio.bam.tagvalue; import std.exception; import std.array; private { static ubyte* arrayPointer(ref Value v) { // if value contains array, as a tagged union, it has the following layout: // // Value = size_t // void* // other stuff... return cast(ubyte*)(*(cast(size_t*)(&v) + 1)); } } /// Emplace value at address $(D p). /// Assumes that enough memory is allocated at that address. /// (You can find needed amount of memory with $(D sizeInBytes) function) void emplaceValue(ubyte* p, ref Value v) { enforce(!v.is_nothing, "null value can't be stored in BAM"); auto tag = v.tag; auto size = tag >> 5; // element size if ((tag & 1) == 0) { // primitive type *p++ = cast(ubyte)v.bam_typeid; p[0 .. size] = (cast(ubyte*)(&v))[0 .. size]; } else { auto bytes = *cast(size_t*)(&v) * (tag >> 5); if (v.is_string) { *p++ = cast(ubyte)v.bam_typeid; p[0 .. bytes] = arrayPointer(v)[0 .. bytes]; p[bytes] = 0; // trailing zero } else { *p++ = cast(ubyte)'B'; *p++ = cast(ubyte)v.bam_typeid; *(cast(uint*)p) = cast(uint)(bytes / size); // # of elements p += uint.sizeof; p[0 .. bytes] = arrayPointer(v)[0 .. bytes]; } } } /// Put a value to an Appender!(ubyte[]) struct void emplaceValue(ref Appender!(ubyte[]) appender, ref Value v) { enforce(!v.is_nothing, "null value can't be stored in BAM"); auto tag = v.tag; auto size = tag >> 5; // element size if ((tag & 1) == 0) { // primitive type appender.put(cast(ubyte)v.bam_typeid); appender.put((cast(ubyte*)(&v))[0 .. size]); } else { auto bytes = *cast(size_t*)(&v) * (tag >> 5); if (v.is_string) { appender.put(cast(ubyte)v.bam_typeid); appender.put(arrayPointer(v)[0..bytes]); appender.put(cast(ubyte)0); // trailing zero } else { appender.put(cast(ubyte)'B'); appender.put(cast(ubyte)v.bam_typeid); uint number_of_elems = cast(uint)(bytes / size); appender.put((cast(ubyte*)(&number_of_elems))[0..4]); appender.put(arrayPointer(v)[0 .. bytes]); } } } /// Calculate size in bytes which value will consume in BAM file. size_t sizeInBytes(ref Value v) { enforce(!v.is_nothing, "null value can't be stored in BAM"); auto tag = v.tag; if ((tag & 1) == 0) { return char.sizeof + (tag >> 5); // primitive type } auto bytes = *cast(size_t*)(&v) * (tag >> 5); if (v.is_string) { return char.sizeof + bytes + char.sizeof; // trailing zero } else { return 2 * char.sizeof + uint.sizeof + bytes; } } BioD-0.1.0/bio/bam/validation/000077500000000000000000000000001273003163100157635ustar00rootroot00000000000000BioD-0.1.0/bio/bam/validation/alignment.d000066400000000000000000000435601273003163100201160ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.validation.alignment; public import bio.bam.read; public import bio.bam.tagvalue; import bio.core.utils.algo; import std.algorithm; import std.ascii; import std.conv; import std.typetuple; /** Alignment validation error types. InvalidCigar error is accompanied by some CigarError, InvalidTags is accompanied by some TagError. */ enum AlignmentError { EmptyReadName, /// TooLongReadName, /// ReadNameContainsInvalidCharacters, /// PositionIsOutOfRange, /// QualityDataContainsInvalidElements, /// InvalidCigar, /// InvalidTags, /// DuplicateTagKeys /// } /// CIGAR string validation error types. enum CigarError { InternalHardClipping, /// InternalSoftClipping, /// InconsistentLength /// } /// Auxiliary data validation error types. /// /// Refers to an individual tag. enum TagError { EmptyString, /// EmptyHexadecimalString, /// NonPrintableString, /// NonPrintableCharacter, /// InvalidHexadecimalString, /// ExpectedIntegerValue, /// ExpectedStringValue, /// InvalidValueType, /// InvalidQualityString, /// ExpectedStringWithSameLengthAsSequence /// } /// Designates pair of predefined key from SAM/BAM specification /// and expected type of tags with that key. struct TagType(string key, T) { enum Key = key; alias T Type; } /// Compile-time available information about predefined tags alias TypeTuple!(TagType!("AM", int), TagType!("AS", int), TagType!("BC", string), TagType!("BQ", string), TagType!("CC", string), TagType!("CM", int), TagType!("CP", int), TagType!("CQ", string), TagType!("CS", string), TagType!("E2", string), TagType!("FI", int), TagType!("FS", string), TagType!("FZ", ushort[]), TagType!("LB", string), TagType!("H0", int), TagType!("H1", int), TagType!("H2", int), TagType!("HI", int), TagType!("IH", int), TagType!("MD", string), TagType!("MQ", int), TagType!("NH", int), TagType!("NM", int), TagType!("OQ", string), TagType!("OP", int), TagType!("OC", string), TagType!("PG", string), TagType!("PQ", int), TagType!("PU", string), TagType!("Q2", string), TagType!("R2", string), TagType!("RG", string), TagType!("SM", int), TagType!("TC", int), TagType!("U2", string), TagType!("UQ", int)) PredefinedTags; private template GetKey(U) { enum GetKey = U.Key; } private template PredefinedTagTypeHelper(string s) { alias PredefinedTags[staticIndexOf!(s, staticMap!(GetKey, PredefinedTags))] PredefinedTagTypeHelper; } /// Get predefined tag type by its key, in compile-time. template PredefinedTagType(string s) { alias PredefinedTagTypeHelper!(s).Type PredefinedTagType; } /** Abstract class encapsulating visitation of SAM header elements. */ abstract class AbstractAlignmentValidator { /// Start validation process. /// /// Passing by reference is not only for doing less copying, /// one might want to attempt to fix invalid fields /// in onError() methods. void validate(ref BamRead alignment) { _visitAlignment(alignment); } /** Implement those methods to define your own behaviour. During validation process, in case of an error the corresponding method gets called, and is provided the object where the error occurred, and type of the error. Objects are passed by reference so that they can be changed (fixed / cleaned up / etc.) If onError() returns true, that means to continue validation process for this particular entity. Otherwise, all other validation checks are skipped and next entity is processed. */ abstract bool onError(ref BamRead al, AlignmentError error); abstract bool onError(ref BamRead al, CigarError error); /// ditto abstract bool onError(string key, const ref Value value, TagError error); /// ditto private: // Method names are a bit misleading, // their return value is NOT whether a field is invalid or not // but rather whether onError() handlers decide to stop validation // when the field is invalid. bool invalidReadName(ref BamRead al) { // Read name (a.k.a. QNAME) must =~ /^[!-?A-~]{1,255}$/ // according to specification. if (al.name.length == 0) { if (!onError(al, AlignmentError.EmptyReadName)) return true; } else if (al.name.length > 255) { if (!onError(al, AlignmentError.TooLongReadName)) return true; } else { foreach (char c; al.name) { if ((c < '!') || (c > '~') || (c == '@')) { if (!onError(al, AlignmentError.ReadNameContainsInvalidCharacters)) { return true; } else { break; } } } } return false; } bool invalidPosition(ref BamRead al) { /// Check that position is in range [-1 .. 2^29 - 2] if (al.position < -1 || al.position > ((1<<29) - 2)) { if (!onError(al, AlignmentError.PositionIsOutOfRange)) { return true; } } return false; } bool invalidQualityData(ref BamRead al) { /// Check quality data if (!all!"a == 0xFF"(al.base_qualities) && !all!"0 <= a && a <= 93"(al.base_qualities)) { if (!onError(al, AlignmentError.QualityDataContainsInvalidElements)) { return true; } } return false; } static bool internalHardClipping(ref BamRead al) { return (al.cigar.length > 2 && any!"a.type == 'H'"(al.cigar[1..$-1])); } static bool internalSoftClipping(ref BamRead al) { if (al.cigar.length <= 2) return false; auto cigar = al.cigar; /// strip H operations from ends if (cigar[0].type == 'H') { cigar = cigar[1..$]; } if (cigar[$-1].type == 'H') { cigar = cigar[0..$-1]; } /// check that S operations are at the ends only return (cigar.length > 2 && any!"a.type == 'S'"(cigar[1..$-1])); } // Sum of M/I/S/=/X operations must be equal to the sequence length // if both sequence and CIGAR string are presented. static bool inconsistentLength(ref BamRead al) { return (al.sequence_length > 0 && al.sequence_length != reduce!`a + b`(0, map!`a.length`( filter!`canFind("MIS=X", a.type)`( al.cigar)))); } bool invalidCigar(ref BamRead al) { if (al.cigar.length == 0) return false; static string check(string s) { import std.ascii : toUpper; return (`if (`~s.dup~`(al)`~ ` && !onError(al, CigarError.`~(cast(char)(s[0]-32))~s[1..$]~`)`~ ` && (called_on_error || onError(al, AlignmentError.InvalidCigar)))`~ `{`~ ` return true;`~ `}`).idup; } bool called_on_error = false; mixin(check("internalHardClipping")); mixin(check("internalSoftClipping")); mixin(check("inconsistentLength")); return false; } // Check tags, a lot of them are predefined in the specification // and have to satisfy certain requirements. bool invalidTags(ref BamRead al) { bool all_tags_are_good = true; void someTagIsBad() { if (all_tags_are_good) { if (!onError(al, AlignmentError.InvalidTags)) return; } all_tags_are_good = false; } /// Check that all tag keys are distinct. bool all_distinct = true; // Optimize for small number of tags ushort[256] keys = void; size_t i = 0; // Check each tag in turn. foreach (k, v; al) { if (!isValid(k, v, al)) { someTagIsBad(); } if (i < keys.length) { keys[i] = *cast(ushort*)(k.ptr); if (all_distinct) { for (size_t j = 0; j < i; ++j) { if (keys[i] == keys[j]) { all_distinct = false; break; } } } i += 1; } else { if (all_distinct) { // must be exactly one int found = 0; foreach (k2, v2; al) { if (*cast(ushort*)(k2.ptr) == *cast(ushort*)(k.ptr)) { if (found == 1) { all_distinct = false; break; } else { ++found; } } } } } } if (!all_distinct) { if (!onError(al, AlignmentError.DuplicateTagKeys)) return true; } return false; } void _visitAlignment(ref BamRead al) { if (invalidReadName(al)) return; if (invalidPosition(al)) return; if (invalidQualityData(al)) return; if (invalidCigar(al)) return; if (invalidTags(al)) return; } bool isValid(string key, const ref Value value, const ref BamRead al) { bool result = true; if (value.is_hexadecimal_string()) { auto str = cast(string)value; if (str.length == 0) { if (!onError(key, value, TagError.EmptyHexadecimalString)) { return false; } result = false; } /// check that it contains only 0..9a-fA-F characters if (!all!(isHexDigit)(str)) { if (!onError(key, value, TagError.InvalidHexadecimalString)) { return false; } result = false; } } else if (value.is_character()) { /// character must be [!-~] auto c = cast(char)value; if (!(c >= '!' && c <= '~')) { if (!onError(key, value, TagError.NonPrintableCharacter)) { return false; } result = false; } } else if (value.is_string()) { auto str = cast(string)value; if (str.length == 0) { if (!onError(key, value, TagError.EmptyString)) { return false; } result = false; } /// string must be [ !-~]+ if (!all!"a >= ' ' && a <= '~'"(str)) { if (!onError(key, value, TagError.NonPrintableString)) { return false; } result = false; } } /// check various tags from SAM/BAM specification if (!additionalChecksIfTheTagIsPredefined(key, value, al)) { result = false; } return result; } // There're some requirements for predefined tags to be checked // such as type, length in some cases, or even some regular expression. // See page 6 of SAM/BAM specification. bool additionalChecksIfTheTagIsPredefined(string key, const ref Value value, const ref BamRead al) { bool result = true; // Creates a switch for all predefined tag keys. string switchTagKey() { char[] cs; foreach (t; PredefinedTags) { cs ~= `case "`~t.Key~`":`~ ` if (!checkTagValue!"`~t.Key~`"(value, al)) {`~ ` result = false;`~ ` }`~ ` break;`.dup; } return "switch (key) { " ~ cs.idup ~ " default : break; }"; } mixin(switchTagKey()); return result; } // Supposed to be inlined in the above switch bool checkTagValue(string s)(const ref Value value, const ref BamRead al) { bool result = true; /// 1. Check type. static if (is(PredefinedTagType!s == int)) { if (!value.is_integer) { if (!onError(s, value, TagError.ExpectedIntegerValue)) { return false; } result = false; } } else if (is(PredefinedTagType!s == string)) { // Notice that there are no 'H'-typed predefined tags, // and they are almost unused and therefore are not likely // to appear in the future. if (!value.is_string || value.bam_typeid == 'H') { if (!onError(s, value, TagError.ExpectedStringValue)) { return false; } result = false; } } else { if (value.tag != GetTypeId!(PredefinedTagType!s)) { if (!onError(s, value, TagError.InvalidValueType)) { return false; } result = false; } } /// 2. For tags which contain quality as a string, /// check that all characters are valid static if (staticIndexOf!(s, "CQ", "E2", "OQ", "Q2", "U2") != -1) { auto str = cast(string)value; if (str != "*" && !all!"a >= '!' && a <= '~'"(str)) { if (!onError(s, value, TagError.InvalidQualityString)) { return false; } result = false; } } /// 3. In a couple of cases values are required to be /// of the same length as the read sequence. static if (staticIndexOf!(s, "BQ", "E2") != -1) { if ((cast(string)value).length != al.sequence_length) { if (!onError(s, value, TagError.ExpectedStringWithSameLengthAsSequence)) { return false; } } } /// 4. MD tag ought to: a) match /^[0-9]+(([A-Z]|\^[A-Z]+)[0-9]+)*$/ /// b) match CIGAR string (TODO?) static if (s == "MD") { /// a) check regular expression auto s = cast(string)value; bool valid = true; if (s.length == 0) valid = false; if (!isDigit(s[0])) valid = false; size_t i = 1; while (i < s.length && isDigit(s[i])) ++i; while (i < s.length) { if (isUpper(s[i])) { ++i; // [A-Z] } else if (s[i] == '^') { // ^[A-Z]+ ++i; if (i == s.length || !isUpper(s[i])) { valid = false; break; } while (i < s.length && isUpper(s[i])) ++i; } else { valid = false; break; } // now [0-9]+ if (i == s.length || !isDigit(s[i])) { valid = false; break; } while (i < s.length && isDigit(s[i])) ++i; } if (i < s.length) { valid = false; } if (!valid) result = false; } return result; } } final private class BooleanValidator : AbstractAlignmentValidator { bool result; override void validate(ref BamRead al) { result = true; super.validate(al); } override bool onError(ref BamRead al, AlignmentError e) { return (result = false); } override bool onError(ref BamRead al, CigarError e) { return (result = false); } override bool onError(string key, const ref Value val, TagError e) { return (result = false); } } private static BooleanValidator booleanValidator; static this() { booleanValidator = new BooleanValidator(); } /// Check if alignment is valid bool isValid(BamRead alignment) { booleanValidator.validate(alignment); return booleanValidator.result; } BioD-0.1.0/bio/bam/validation/samheader.d000066400000000000000000001021051273003163100200600ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** Module for SAM header validation. In order to implement your own validation behaviour, subclass AbstractSamHeaderValidator and define your own onError() methods. */ module bio.bam.validation.samheader; public import bio.sam.header; import bio.core.utils.algo; import std.algorithm; import std.functional; import std.ascii; /// SAM header validation error types. /// /// Each Invalid??Line error is accompanied by /// corresponding ??LineError. enum SamHeaderError { InvalidSqLine, InvalidPgLine, InvalidRgLine, InvalidFormatVersion } /// @SQ line validation error types. enum SqLineError { MissingSequenceName, InvalidSequenceName, SequenceLengthOutOfRange } /// @RG line validation error types. enum RgLineError { UnknownPlatform, MissingIdentifier } /// @PG line validation error types. enum PgLineError { NoMatchForPreviousProgram, MissingIdentifier } /** Abstract class encapsulating visitation of SAM header elements. */ abstract class AbstractSamHeaderValidator { /// Start validation process. /// /// Passing by reference is not only for doing less copying, /// one might want to attempt to fix invalid fields /// in onError() methods. void validate(ref SamHeader header) { _visitHeader(header); } /** Implement those methods to define your own behaviour. During validation process, in case of an error the corresponding method gets called, and is provided the object where the error occurred, and type of the error. Objects are passed by reference so that they can be changed (fixed / cleaned up / etc.) 'False' return value means to stop further validation checks for the current entity and skip to the next one. */ abstract bool onError(ref SamHeader header, SamHeaderError error); abstract bool onError(ref SqLine line, SqLineError error); /// ditto abstract bool onError(ref PgLine line, PgLineError error); /// ditto abstract bool onError(ref RgLine line, RgLineError error); /// ditto private: bool isValid(ref SqLine sq) { /// All members of SqLine get initialized. /// Initial value for name is an empty string, /// and for sequence_length is 0 bool result = true; if (sq.name.length == 0) { onError(sq, SqLineError.MissingSequenceName); result = false; } else { // check that sequence_name is /^[!-)+-<>-~][!-~]*$/ auto first = sq.name[0]; if (!((first >= '!' && first <= ')') || (first >= '+' && first <= '<') || (first >= '>' && first <= '~'))) { onError(sq, SqLineError.InvalidSequenceName); result = false; } if (!all!"a >= '!' && a <= '~'"(sq.name[1..$])) { onError(sq, SqLineError.InvalidSequenceName); result = false; } } // @SQ/LN must be in range 1 .. (1<<29)-1 // (sequence_length is uint) if (sq.length == 0 || sq.length >= (1<<29)) { onError(sq, SqLineError.SequenceLengthOutOfRange); result = false; } return result; } bool isValid(ref RgLine rg) { bool res = canFind(["ILLUMINA", "SOLID", "LS454", "HELICOS", "PACBIO"], rg.platform); if (!res) { onError(rg, RgLineError.UnknownPlatform); } if (rg.identifier.length == 0) { onError(rg, RgLineError.MissingIdentifier); res = false; } return res; } bool isValid(ref PgLine pg) { // checking PP tag occurs in _visitHeader() // because it involves other @PG lines if (pg.identifier.length == 0) { onError(pg, PgLineError.MissingIdentifier); return false; } return true; } void _visitHeader(ref SamHeader header) { foreach (sq; header.sequences) { if (!isValid(sq)) if (!onError(header, SamHeaderError.InvalidSqLine)) return; } foreach (rg; header.read_groups) { if (!isValid(rg)) if (!onError(header, SamHeaderError.InvalidRgLine)) return; } foreach (pg; header.programs) { if (!isValid(pg)) if (!onError(header, SamHeaderError.InvalidPgLine)) return; } if (!checkFormatVersion(header.format_version)) { if (!onError(header, SamHeaderError.InvalidFormatVersion)) return; } // uniqueness of @SQ/SN, @RG/ID, and @PG/ID // is guaranteed by design of HeaderLineDictionary template class // check that each @PG/PP matches some @PG/ID foreach (pg; header.programs) { if (pg.previous_program.length != 0) { if (!canFind(map!"a.identifier"(header.programs.values), pg.previous_program)) { if (!onError(pg, PgLineError.NoMatchForPreviousProgram)) return; } } } } // visitHeader } // AbstractSamHeaderValidator private { /// check that @HD/VN is /^[0-9]+\.[0-9]+$/ bool checkFormatVersion(string ver) nothrow { if (ver.length == 0) { return false; // must be non-empty } if (!isDigit(ver[0])) { return false; // and it must start with digit } ver = ver[1..$]; bool passed_dot = false; while (ver.length > 0) { if (isDigit(ver[0])) { ver = ver[1..$]; // skip digits } else if (ver[0] == '.') { if (passed_dot) { return false; // must contain only one dot } passed_dot = true; ver = ver[1..$]; if (ver.length == 0 || !isDigit(ver[0])) { return false; // there must be a digit after dot } } } return true; } unittest { assert(checkFormatVersion("1.53") == true); assert(checkFormatVersion("a.23") == false); assert(checkFormatVersion("1.2.3") == false); assert(checkFormatVersion("5.") == false); assert(checkFormatVersion("3.141592653589793") == true); assert(checkFormatVersion("100500.42") == true); assert(checkFormatVersion("2.71828.3.5") == false); } final private class BooleanValidator : AbstractSamHeaderValidator { bool result; override void validate(ref SamHeader header) { result = true; super.validate(header); } override bool onError(ref SamHeader header, SamHeaderError e) { return (result = false); } override bool onError(ref SqLine line, SqLineError e) { return (result = false); } override bool onError(ref RgLine header, RgLineError e) { return (result = false); } override bool onError(ref PgLine header, PgLineError e) { return (result = false); } } static BooleanValidator booleanValidator; } // private static this() { booleanValidator = new BooleanValidator(); } /// Check if header is valid bool isValid(SamHeader header) { booleanValidator.validate(header); return booleanValidator.result; } unittest { auto valid_header = new SamHeader("@HD\tVN:1.3\tSO:coordinate\n@SQ\tSN:chr1\tLN:1575"); assert(isValid(valid_header)); auto empty_seq_name = new SamHeader("@HD\tVN:1.3\tSO:coordinate\n@SQ\tSN:\tLN:1575"); assert(!isValid(empty_seq_name)); auto missing_seq_name = new SamHeader("@HD\tVN:1.3\tSO:coordinate\n@SQ\tLN:1575"); assert(!isValid(missing_seq_name)); auto missing_seq_length = new SamHeader("@HD\tVN:1.3\tSO:coordinate\n@SQ\tSN:chr1"); assert(!isValid(missing_seq_length)); auto seq_length_out_of_range = new SamHeader("@HD\tVN:1.3\tSO:coordinate\n@SQ\tSN:chr1\tLN:876543210"); assert(!isValid(seq_length_out_of_range)); auto invalid_seq_name = new SamHeader("@HD\tVN:1.3\tSO:coordinate\n@SQ\tSN:chr \tLN:1575"); assert(!isValid(invalid_seq_name)); auto missing_version = new SamHeader("@HD\tSO:coordinate"); assert(!isValid(missing_version)); auto invalid_version_format = new SamHeader("@HD\tVN:6.7.8"); assert(!isValid(invalid_version_format)); auto unknown_platform = new SamHeader("@RG\tID:678\tPL:TROLOLO"); assert(!isValid(unknown_platform)); auto missing_rg_id = new SamHeader("@RG\tPL:ILLUMINA"); assert(!isValid(missing_rg_id)); auto missing_pg_id = new SamHeader("@PG\tPN:bwa\tVN:0.5.9-r16"); assert(!isValid(missing_pg_id)); auto unknown_previous_program = new SamHeader("@PG\tID:bwa_aln_fastq\tPN:bwa\tPP:bwa_index"); assert(!isValid(unknown_previous_program)); auto another_valid_header = new SamHeader(q"[@HD VN:1.0 SO:coordinate @SQ SN:1 LN:249250621 M5:1b22b98cdeb4a9304cb5d48026a85128 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:2 LN:243199373 M5:a0d9851da00400dec1098a9255ac712e UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:3 LN:198022430 M5:fdfd811849cc2fadebc929bb925902e5 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:4 LN:191154276 M5:23dccd106897542ad87d2765d28a19a1 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:5 LN:180915260 M5:0740173db9ffd264d728f32784845cd7 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:6 LN:171115067 M5:1d3a93a248d92a729ee764823acbbc6b UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:7 LN:159138663 M5:618366e953d6aaad97dbe4777c29375e UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:8 LN:146364022 M5:96f514a9929e410c6651697bded59aec UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:9 LN:141213431 M5:3e273117f15e0a400f01055d9f393768 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:10 LN:135534747 M5:988c28e000e84c26d552359af1ea2e1d UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:11 LN:135006516 M5:98c59049a2df285c76ffb1c6db8f8b96 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:12 LN:133851895 M5:51851ac0e1a115847ad36449b0015864 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:13 LN:115169878 M5:283f8d7892baa81b510a015719ca7b0b UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:14 LN:107349540 M5:98f3cae32b2a2e9524bc19813927542e UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:15 LN:102531392 M5:e5645a794a8238215b2cd77acb95a078 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:16 LN:90354753 M5:fc9b1a7b42b97a864f56b348b06095e6 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:17 LN:81195210 M5:351f64d4f4f9ddd45b35336ad97aa6de UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:18 LN:78077248 M5:b15d4b2d29dde9d3e4f93d1d0f2cbc9c UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:19 LN:59128983 M5:1aacd71f30db8e561810913e0b72636d UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:20 LN:63025520 M5:0dec9660ec1efaaf33281c0d5ea2560f UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:21 LN:48129895 M5:2979a6085bfe28e3ad6f552f361ed74d UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:22 LN:51304566 M5:a718acaa6135fdca8357d5bfe94211dd UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:X LN:155270560 M5:7e0e2e580297b7764e31dbc80c2540dd UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:Y LN:59373566 M5:1fa3474750af0948bdf97d5a0ee52e51 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:MT LN:16569 M5:c68f52674c9fb33aef52dcf399755519 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000207.1 LN:4262 M5:f3814841f1939d3ca19072d9e89f3fd7 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000226.1 LN:15008 M5:1c1b2cd1fccbc0a99b6a447fa24d1504 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000229.1 LN:19913 M5:d0f40ec87de311d8e715b52e4c7062e1 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000231.1 LN:27386 M5:ba8882ce3a1efa2080e5d29b956568a4 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000210.1 LN:27682 M5:851106a74238044126131ce2a8e5847c UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000239.1 LN:33824 M5:99795f15702caec4fa1c4e15f8a29c07 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000235.1 LN:34474 M5:118a25ca210cfbcdfb6c2ebb249f9680 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000201.1 LN:36148 M5:dfb7e7ec60ffdcb85cb359ea28454ee9 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000247.1 LN:36422 M5:7de00226bb7df1c57276ca6baabafd15 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000245.1 LN:36651 M5:89bc61960f37d94abf0df2d481ada0ec UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000197.1 LN:37175 M5:6f5efdd36643a9b8c8ccad6f2f1edc7b UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000203.1 LN:37498 M5:96358c325fe0e70bee73436e8bb14dbd UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000246.1 LN:38154 M5:e4afcd31912af9d9c2546acf1cb23af2 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000249.1 LN:38502 M5:1d78abec37c15fe29a275eb08d5af236 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000196.1 LN:38914 M5:d92206d1bb4c3b4019c43c0875c06dc0 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000248.1 LN:39786 M5:5a8e43bec9be36c7b49c84d585107776 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000244.1 LN:39929 M5:0996b4475f353ca98bacb756ac479140 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000238.1 LN:39939 M5:131b1efc3270cc838686b54e7c34b17b UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000202.1 LN:40103 M5:06cbf126247d89664a4faebad130fe9c UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000234.1 LN:40531 M5:93f998536b61a56fd0ff47322a911d4b UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000232.1 LN:40652 M5:3e06b6741061ad93a8587531307057d8 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000206.1 LN:41001 M5:43f69e423533e948bfae5ce1d45bd3f1 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000240.1 LN:41933 M5:445a86173da9f237d7bcf41c6cb8cc62 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000236.1 LN:41934 M5:fdcd739913efa1fdc64b6c0cd7016779 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000241.1 LN:42152 M5:ef4258cdc5a45c206cea8fc3e1d858cf UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000243.1 LN:43341 M5:cc34279a7e353136741c9fce79bc4396 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000242.1 LN:43523 M5:2f8694fc47576bc81b5fe9e7de0ba49e UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000230.1 LN:43691 M5:b4eb71ee878d3706246b7c1dbef69299 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000237.1 LN:45867 M5:e0c82e7751df73f4f6d0ed30cdc853c0 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000233.1 LN:45941 M5:7fed60298a8d62ff808b74b6ce820001 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000204.1 LN:81310 M5:efc49c871536fa8d79cb0a06fa739722 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000198.1 LN:90085 M5:868e7784040da90d900d2d1b667a1383 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000208.1 LN:92689 M5:aa81be49bf3fe63a79bdc6a6f279abf6 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000191.1 LN:106433 M5:d75b436f50a8214ee9c2a51d30b2c2cc UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000227.1 LN:128374 M5:a4aead23f8053f2655e468bcc6ecdceb UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000228.1 LN:129120 M5:c5a17c97e2c1a0b6a9cc5a6b064b714f UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000214.1 LN:137718 M5:46c2032c37f2ed899eb41c0473319a69 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000221.1 LN:155397 M5:3238fb74ea87ae857f9c7508d315babb UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000209.1 LN:159169 M5:f40598e2a5a6b26e84a3775e0d1e2c81 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000218.1 LN:161147 M5:1d708b54644c26c7e01c2dad5426d38c UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000220.1 LN:161802 M5:fc35de963c57bf7648429e6454f1c9db UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000213.1 LN:164239 M5:9d424fdcc98866650b58f004080a992a UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000211.1 LN:166566 M5:7daaa45c66b288847b9b32b964e623d3 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000199.1 LN:169874 M5:569af3b73522fab4b40995ae4944e78e UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000217.1 LN:172149 M5:6d243e18dea1945fb7f2517615b8f52e UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000216.1 LN:172294 M5:642a232d91c486ac339263820aef7fe0 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000215.1 LN:172545 M5:5eb3b418480ae67a997957c909375a73 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000205.1 LN:174588 M5:d22441398d99caf673e9afb9a1908ec5 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000219.1 LN:179198 M5:f977edd13bac459cb2ed4a5457dba1b3 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000224.1 LN:179693 M5:d5b2fc04f6b41b212a4198a07f450e20 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000223.1 LN:180455 M5:399dfa03bf32022ab52a846f7ca35b30 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000195.1 LN:182896 M5:5d9ec007868d517e73543b005ba48535 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000212.1 LN:186858 M5:563531689f3dbd691331fd6c5730a88b UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000222.1 LN:186861 M5:6fe9abac455169f50470f5a6b01d0f59 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000200.1 LN:187035 M5:75e4c8d17cd4addf3917d1703cacaf25 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000193.1 LN:189789 M5:dbb6e8ece0b5de29da56601613007c2a UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000194.1 LN:191469 M5:6ac8f815bf8e845bb3031b73f812c012 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000225.1 LN:211173 M5:63945c3e6962f28ffd469719a747e73c UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:GL000192.1 LN:547496 M5:325ba9e808f669dfeee210fdd7b470ac UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:NC_007605 LN:171823 M5:6743bd63b3ff2b5b8985d8933c53290a UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @SQ SN:hs37d5 LN:35477943 M5:5b6a4b3a81a2d3c134b7d14bf6ad39f1 UR:ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz AS:NCBI37 SP:Human @RG ID:ERR016155 LB:HUMgdtRAGDIAAPE SM:HG00125 PI:488 CN:BGI PL:ILLUMINA DS:SRP001294 @RG ID:ERR016156 LB:HUMgdtRAGDIAAPE SM:HG00125 PI:489 CN:BGI PL:ILLUMINA DS:SRP001294 @RG ID:ERR016157 LB:HUMgdtRAGDIAAPE SM:HG00125 PI:488 CN:BGI PL:ILLUMINA DS:SRP001294 @PG ID:bwa_index PN:bwa VN:0.5.9-r16 CL:bwa index -a bwtsw $reference_fasta @PG ID:bwa_aln_fastq PN:bwa PP:bwa_index VN:0.5.9-r16 CL:bwa aln -q 15 -f $sai_file $reference_fasta $fastq_file @PG ID:bwa_sam PN:bwa PP:bwa_aln_fastq VN:0.5.9-r16 CL:bwa sampe -a 1464 -r $rg_line -f $sam_file $reference_fasta $sai_file(s) $fastq_file(s) @PG ID:bwa_sam.1 PN:bwa PP:bwa_aln_fastq VN:0.5.9-r16 CL:bwa sampe -a 1467 -r $rg_line -f $sam_file $reference_fasta $sai_file(s) $fastq_file(s) @PG ID:sam_to_fixed_bam PN:samtools PP:bwa_sam VN:0.1.17 (r973:277) CL:samtools view -bSu $sam_file | samtools sort -n -o - samtools_nsort_tmp | samtools fixmate /dev/stdin /dev/stdout | samtools sort -o - samtools_csort_tmp | samtools fillmd -u - $reference_fasta > $fixed_bam_file @PG ID:sam_to_fixed_bam.1 PN:samtools PP:bwa_sam.1 VN:0.1.17 (r973:277) CL:samtools view -bSu $sam_file | samtools sort -n -o - samtools_nsort_tmp | samtools fixmate /dev/stdin /dev/stdout | samtools sort -o - samtools_csort_tmp | samtools fillmd -u - $reference_fasta > $fixed_bam_file @PG ID:gatk_target_interval_creator PN:GenomeAnalysisTK PP:sam_to_fixed_bam VN:1.2-29-g0acaf2d CL:java $jvm_args -jar GenomeAnalysisTK.jar -T RealignerTargetCreator -R $reference_fasta -o $intervals_file -known $known_indels_file(s) @PG ID:gatk_target_interval_creator.1 PN:GenomeAnalysisTK PP:sam_to_fixed_bam.1 VN:1.2-29-g0acaf2d CL:java $jvm_args -jar GenomeAnalysisTK.jar -T RealignerTargetCreator -R $reference_fasta -o $intervals_file -known $known_indels_file(s) @PG ID:bam_realignment_around_known_indels PN:GenomeAnalysisTK PP:gatk_target_interval_creator VN:1.2-29-g0acaf2d CL:java $jvm_args -jar GenomeAnalysisTK.jar -T IndelRealigner -R $reference_fasta -I $bam_file -o $realigned_bam_file -targetIntervals $intervals_file -known $known_indels_file(s) -LOD 0.4 -model KNOWNS_ONLY -compress 0 --disable_bam_indexing @PG ID:bam_realignment_around_known_indels.1 PN:GenomeAnalysisTK PP:gatk_target_interval_creator.1 VN:1.2-29-g0acaf2d CL:java $jvm_args -jar GenomeAnalysisTK.jar -T IndelRealigner -R $reference_fasta -I $bam_file -o $realigned_bam_file -targetIntervals $intervals_file -known $known_indels_file(s) -LOD 0.4 -model KNOWNS_ONLY -compress 0 --disable_bam_indexing @PG ID:bam_count_covariates PN:GenomeAnalysisTK PP:bam_realignment_around_known_indels VN:1.2-29-g0acaf2d CL:java $jvm_args -jar GenomeAnalysisTK.jar -T CountCovariates -R $reference_fasta -I $bam_file -recalFile $bam_file.recal_data.csv -knownSites $known_sites_file(s) -l INFO -L '1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;X;Y;MT' -cov ReadGroupCovariate -cov QualityScoreCovariate -cov CycleCovariate -cov DinucCovariate @PG ID:bam_count_covariates.1 PN:GenomeAnalysisTK PP:bam_realignment_around_known_indels.1 VN:1.2-29-g0acaf2d CL:java $jvm_args -jar GenomeAnalysisTK.jar -T CountCovariates -R $reference_fasta -I $bam_file -recalFile $bam_file.recal_data.csv -knownSites $known_sites_file(s) -l INFO -L '1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;X;Y;MT' -cov ReadGroupCovariate -cov QualityScoreCovariate -cov CycleCovariate -cov DinucCovariate @PG ID:bam_recalibrate_quality_scores PN:GenomeAnalysisTK PP:bam_count_covariates VN:1.2-29-g0acaf2d CL:java $jvm_args -jar GenomeAnalysisTK.jar -T TableRecalibration -R $reference_fasta -recalFile $bam_file.recal_data.csv -I $bam_file -o $recalibrated_bam_file -l INFO -compress 0 --disable_bam_indexing @PG ID:bam_recalibrate_quality_scores.1 PN:GenomeAnalysisTK PP:bam_count_covariates.1 VN:1.2-29-g0acaf2d CL:java $jvm_args -jar GenomeAnalysisTK.jar -T TableRecalibration -R $reference_fasta -recalFile $bam_file.recal_data.csv -I $bam_file -o $recalibrated_bam_file -l INFO -compress 0 --disable_bam_indexing @PG ID:bam_calculate_bq PN:samtools PP:bam_recalibrate_quality_scores VN:0.1.17 (r973:277) CL:samtools calmd -Erb $bam_file $reference_fasta > $bq_bam_file @PG ID:bam_calculate_bq.1 PN:samtools PP:bam_recalibrate_quality_scores.1 VN:0.1.17 (r973:277) CL:samtools calmd -Erb $bam_file $reference_fasta > $bq_bam_file @PG ID:bam_merge PN:picard PP:bam_calculate_bq VN:1.53 CL:java $jvm_args -jar MergeSamFiles.jar INPUT=$bam_file(s) OUTPUT=$merged_bam VALIDATION_STRINGENCY=SILENT @PG ID:bam_merge.1 PN:picard PP:bam_calculate_bq.1 VN:1.53 CL:java $jvm_args -jar MergeSamFiles.jar INPUT=$bam_file(s) OUTPUT=$merged_bam VALIDATION_STRINGENCY=SILENT @PG ID:bam_mark_duplicates PN:picard PP:bam_merge VN:1.53 CL:java $jvm_args -jar MarkDuplicates.jar INPUT=$bam_file OUTPUT=$markdup_bam_file ASSUME_SORTED=TRUE METRICS_FILE=/dev/null VALIDATION_STRINGENCY=SILENT @PG ID:bam_mark_duplicates.1 PN:picard PP:bam_merge.1 VN:1.53 CL:java $jvm_args -jar MarkDuplicates.jar INPUT=$bam_file OUTPUT=$markdup_bam_file ASSUME_SORTED=TRUE METRICS_FILE=/dev/null VALIDATION_STRINGENCY=SILENT @PG ID:bam_merge.2 PN:picard PP:bam_mark_duplicates VN:1.53 CL:java $jvm_args -jar MergeSamFiles.jar INPUT=$bam_file(s) OUTPUT=$merged_bam VALIDATION_STRINGENCY=SILENT @PG ID:bam_merge.1.2 PN:picard PP:bam_mark_duplicates.1 VN:1.53 CL:java $jvm_args -jar MergeSamFiles.jar INPUT=$bam_file(s) OUTPUT=$merged_bam VALIDATION_STRINGENCY=SILENT @CO $known_indels_file(s) = ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_mapping_resources/ALL.wgs.indels_mills_devine_hg19_leftAligned_collapsed_double_hit.indels.sites.vcf.gz @CO $known_indels_file(s) .= ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_mapping_resources/ALL.wgs.low_coverage_vqsr.20101123.indels.sites.vcf.gz @CO $known_sites_file(s) = ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/technical/reference/phase2_mapping_resources/ALL.wgs.dbsnp.build135.snps.sites.vcf.gz ]"); assert(isValid(another_valid_header)); } BioD-0.1.0/bio/bam/writer.d000066400000000000000000000245051273003163100153200ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2015 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.bam.writer; import bio.bam.referenceinfo; import bio.sam.header; import bio.bam.constants; import bio.bam.bai.indexing; import bio.bam.read; import bio.bam.readrange; import bio.core.bgzf.outputstream; import bio.core.bgzf.virtualoffset; import bio.core.utils.stream; import bio.core.utils.switchendianness; import std.parallelism; import std.exception; import std.stream; import std.traits; import std.system; import std.algorithm; import std.array; /** Class for outputting BAM. $(BR) Compresses BGZF blocks in parallel. Tries to write reads so that they don't cross BGZF block borders. $(BR) Usage is very simple, see example below. Example: -------------------------------------- import bio.bam.writer, bio.bam.reader; ... auto src = new BamReader("in.bam"); auto dst = new BamWriter("out.bam", 9); // maximal compression scope (exit) dst.finish(); // close the stream at exit dst.writeSamHeader(src.header); // copy header and reference sequence info dst.writeReferenceSequenceInfo(src.reference_sequences); foreach (read; src.reads) { if (read.mapping_quality > 10) // skip low-quality reads dst.writeRecord(read); } -------------------------------------- */ final class BamWriter { /// Creates new BAM writer outputting to file or $(I stream). /// Automatically writes BAM magic number (4 bytes). /// /// Params: /// compression_level = compression level, must be in range -1..9 /// task_pool = task pool to use for parallel compression /// buffer_size = size of BgzfOutputStream buffer this(std.stream.Stream stream, int compression_level=-1, std.parallelism.TaskPool task_pool=std.parallelism.taskPool, size_t buffer_size=0) { _stream = new BgzfOutputStream(stream, compression_level, task_pool, buffer_size); _stream.setWriteHandler((ubyte[] uncompressed, ubyte[] compressed) { _bytes_written += compressed.length; }); writeString(BAM_MAGIC); } /// ditto this(string filename, int compression_level=-1, std.parallelism.TaskPool task_pool=std.parallelism.taskPool) { _filename = filename; auto filestream = new bio.core.utils.stream.File(filename, "wb+"); this(filestream, compression_level, task_pool); } /// Can be called right after the stream constructor, only once void setFilename(string output_filename) { enforce(_filename is null, "Can't set output filename twice"); _filename = output_filename; } /// By default, the writer attempts to automatically create index /// when writing coordinate-sorted files. If this behaviour is not /// desired, it can be switched off before writing SAM header. void disableAutoIndexCreation() { _disable_index_creation = true; } package void writeByteArray(const(ubyte[]) array) { _stream.writeExact(array.ptr, array.length); } package void writeString(string str) { writeByteArray(cast(ubyte[])str); } package void writeInteger(T)(T integer) if (isIntegral!T) { T num = integer; static if (T.sizeof != 1) { if (std.system.endian != Endian.littleEndian) { switchEndianness(&num, T.sizeof); } } _stream.writeExact(&num, T.sizeof); } private { size_t _bytes_written; bool _create_index = false; bool _disable_index_creation = false; bool _record_writing_mode = false; string _filename; IndexBuilder _index_builder; VirtualOffset _start_vo, _end_vo; ubyte[] _pending_read_data_buf; ubyte[] _pending_read_data; void appendReadData(ubyte[] data) { auto required = _pending_read_data.length + data.length; if (_pending_read_data_buf.length < required) _pending_read_data_buf.length = max(required, _pending_read_data_buf.length * 2); _pending_read_data_buf[_pending_read_data.length .. $][0 .. data.length] = data; _pending_read_data = _pending_read_data_buf[0 .. required]; } size_t _len; void indexBlock(ubyte[] uncompressed, ubyte[] compressed) { ushort inner_offset = 0; void indexRead(ubyte[] data) { auto read = BamRead(data); if (uncompressed.length > 0) { _end_vo = VirtualOffset(_bytes_written, inner_offset); } else { _end_vo = VirtualOffset(_bytes_written + compressed.length, 0); } auto read_block = BamReadBlock(_start_vo, _end_vo, read); _index_builder.put(read_block); } if (_pending_read_data !is null) { if (uncompressed.length < _len) { appendReadData(uncompressed); _len -= uncompressed.length; uncompressed = null; } else { appendReadData(uncompressed[0 .. _len]); uncompressed = uncompressed[_len .. $]; inner_offset = cast(ushort)_len; indexRead(_pending_read_data); _pending_read_data = null; } } while (uncompressed.length > 0) { _len = *cast(int*)(uncompressed.ptr); // assume LE... _start_vo = VirtualOffset(_bytes_written, inner_offset); if (_len + int.sizeof <= uncompressed.length) { _pending_read_data = null; auto read_data = uncompressed[int.sizeof .. int.sizeof + _len]; uncompressed = uncompressed[int.sizeof + _len .. $]; inner_offset += _len + int.sizeof; indexRead(read_data); } else { // read spans multiple BGZF blocks appendReadData(uncompressed[int.sizeof .. $]); _len -= _pending_read_data.length; break; } } _bytes_written += compressed.length; } } /// Writes SAM header. Should be called after construction. void writeSamHeader(bio.sam.header.SamHeader header) { writeSamHeader(header.text); } /// ditto void writeSamHeader(string header_text) { _create_index = !_disable_index_creation && !header_text.find("SO:coordinate").empty && _filename.length >= 4 && _filename[$ - 4 .. $] == ".bam"; writeInteger(cast(int)header_text.length); writeString(header_text); } /// Writes reference sequence information. Should be called after /// dumping SAM header. Writer will store this array to use later for /// resolving read reference IDs to names. /// /// Flushes current BGZF block. void writeReferenceSequenceInfo(const(bio.bam.referenceinfo.ReferenceSequenceInfo)[] reference_sequences) { _reference_sequences = reference_sequences; auto n_refs = cast(int)reference_sequences.length; writeInteger(n_refs); foreach (sequence; reference_sequences) { writeInteger(cast(int)(sequence.name.length + 1)); writeString(sequence.name); writeInteger(cast(ubyte)'\0'); writeInteger(cast(int)sequence.length); } if (_create_index) { auto index = new bio.core.utils.stream.File(_filename ~ ".bai", "wb+"); _index_builder = IndexBuilder(index, n_refs); _index_builder.check_bins = true; } _stream.flushCurrentBlock(); } private void indexingWriteHandler(ubyte[] uncomp, ubyte[] comp) { indexBlock(uncomp, comp); } /// Writes BAM read. Throws exception if read reference ID is out of range. void writeRecord(R)(R read) { enforce(read.ref_id == -1 || read.ref_id < _reference_sequences.length, "Read reference ID is out of range"); if (!_record_writing_mode) { if (_create_index) { _record_writing_mode = true; _stream.setWriteHandler(&indexingWriteHandler); } else { _stream.setWriteHandler(null); } } read._recalculate_bin(); auto read_size = read.size_in_bytes; if (read_size + _current_size > BGZF_BLOCK_SIZE) { _stream.flushCurrentBlock(); read.write(this); _current_size = read_size; } else { read.write(this); _current_size += read_size; } } /// Flushes current BGZF block. void flush() { _stream.flush(); } /// Flushes buffer and closes output stream. Adds BAM EOF block automatically. void finish() { _stream.close(); if (_create_index) _index_builder.finish(); } private { BgzfOutputStream _stream; const(ReferenceSequenceInfo)[] _reference_sequences; size_t _current_size; // number of bytes written to the current BGZF block } } BioD-0.1.0/bio/core/000077500000000000000000000000001273003163100140225ustar00rootroot00000000000000BioD-0.1.0/bio/core/base.d000066400000000000000000000200561273003163100151040ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.base; import bio.core.tinymap; import std.traits; /// Code common to both Base5 and Base16 mixin template CommonBaseOperations() { /// Convert to char char asCharacter() @property const { return _code2char[_code]; } /// alias asCharacter this; } /// Base representation supporting full set of IUPAC codes struct Base { mixin TinyMapInterface!16; private enum ubyte[256] _char2code = [ 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 1, 2, 4, 8, 15,15,15,15, 15,15,15,15, 15, 0,15,15, 15, 1,14, 2, 13,15,15, 4, 11,15,15,12, 15, 3,15,15, 15,15, 5, 6, 8,15, 7, 9, 15,10,15,15, 15,15,15,15, 15, 1,14, 2, 13,15,15, 4, 11,15,15,12, 15, 3,15,15, 15,15, 5, 6, 8,15, 7, 9, 15,10,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15 ]; // = 0000 // // A 0001 // C 0010 // G 0100 // T 1000 // // W 1001 (A T) Weak // S 0110 (C G) Strong // // M 0011 (A C) aMino // K 1100 (G T) Keto // R 0101 (A G) puRine // Y 1010 (A G) pYrimidine // // B 1110 (not A) // D 1101 (not C) // H 1011 (not G) // V 0111 (not T) // // N 1111 (aNy base) private enum _code2char = "=ACMGRSVTWYHKDBN"; private enum ubyte[16] _complement_table = [0x0, 0x8, 0x4, 0xC, 0x2, 0xA, 0x6, 0xE, 0x1, 0x9, 0x5, 0xD, 0x3, 0xB, 0x7, 0xF]; /// Complementary base Base complement() @property const { // take the code, reverse the bits, and return the base return Base.fromInternalCode(_complement_table[_code]); } unittest { import std.ascii; foreach (i, c; _code2char) { assert(_char2code[c] == i); } foreach (c; 0 .. 256) { auto c2 = _code2char[_char2code[c]]; if (c2 != 'N') { if ('0' <= c && c <= '9') { assert(c2 == "ACGT"[c - '0']); } else { assert(c2 == toUpper(c)); } } } } mixin CommonBaseOperations; /// Construct from IUPAC code this(char c) { _code = _char2code[cast(ubyte)c]; } /// ditto this(dchar c) { _code = _char2code[cast(ubyte)c]; } private enum ubyte[5] nt5_to_nt16 = [1, 2, 4, 8, 15]; private static Base fromBase5(Base5 base) { Base b = void; b._code = nt5_to_nt16[base.internal_code]; return b; } /// Conversion to Base5 Base5 opCast(T)() const if (is(T == Base5)) { return Base5.fromBase16(this); } T opCast(T)() const if (is(Unqual!T == char) || is(Unqual!T == dchar)) { return asCharacter; } } unittest { Base b = 'W'; assert(b == 'W'); b = Base.fromInternalCode(0); assert(b == '='); } alias Base Base16; /// Base representation supporting only 'A', 'C', 'G', 'T', and 'N' /// (internal codes are 0, 1, 2, 3, and 4 correspondingly) struct Base5 { mixin TinyMapInterface!5; private enum ubyte[256] _char2code = [ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 1, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 1, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ]; private enum _code2char = "ACGTN"; private enum ubyte[16] nt16_to_nt5 = [4, 0, 1, 4, 2, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4]; mixin CommonBaseOperations; /// Complementary base Base5 complement() @property const { return Base5.fromInternalCode(cast(ubyte)(_code == 4 ? 4 : (3 - _code))); } /// Construct base from one of "acgtACGT" symbols. /// Every other character is converted to 'N' this(char c) { _code = _char2code[cast(ubyte)c]; } /// ditto this(dchar c) { _code = _char2code[cast(ubyte)c]; } private static Base5 fromBase16(Base16 base) { Base5 b = void; b._code = nt16_to_nt5[base.internal_code]; return b; } /// Conversion to Base16 Base16 opCast(T)() const if(is(T == Base16)) { return Base16.fromBase5(this); } T opCast(T)() const if (is(Unqual!T == char) || is(Unqual!T == dchar)) { return asCharacter; } } unittest { auto b5 = Base5('C'); assert(b5.internal_code == 1); b5 = Base5.fromInternalCode(3); assert(b5 == 'T'); // doesn't work with std.conv.to // //import std.conv; //assert(to!Base16(b5).internal_code == 8); assert((cast(Base16)b5).internal_code == 8); } /// Complement base, which might be Base5, Base16, char, or dchar. B complementBase(B)(B base) { static if(is(Unqual!B == dchar) || is(Unqual!B == char)) { return cast(B)(Base16(base).complement); } else return base.complement; } /// Convert character to base template charToBase(B=Base16) { B charToBase(C)(C c) if(is(Unqual!C == char) || is(Unqual!C == dchar)) { return B(c); } } unittest { assert(complementBase('T') == 'A'); assert(complementBase('G') == 'C'); assert(complementBase(Base5('A')) == Base5('T')); assert(complementBase(Base16('C')) == Base16('G')); assert(charToBase!Base16('A').complement == Base16('T')); } BioD-0.1.0/bio/core/bgzf/000077500000000000000000000000001273003163100147525ustar00rootroot00000000000000BioD-0.1.0/bio/core/bgzf/block.d000066400000000000000000000150601273003163100162130ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2014 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.bgzf.block; import bio.bam.constants; import bio.core.utils.memoize; import bio.core.utils.zlib; import std.array; import std.conv; import std.algorithm; import std.exception; /** Structure representing BGZF block. In general, users shouldn't use it, as it is EXTREMELY low-level. */ struct BgzfBlock { // field types are as in the SAM/BAM specification // ushort ~ uint16_t, char ~ uint8_t, uint ~ uint32_t public ulong start_offset; /// start offset in the file, in bytes /// end offset in the file, in bytes public ulong end_offset() @property const { return start_offset + bsize + 1; } public ushort bsize; /// total Block SIZE minus one public ushort cdata_size; /// compressed data size /// A buffer is used to reduce number of allocations. /// /// Its size is max(cdata_size, input_size) /// Initially, it contains compressed data, but is rewritten /// during decompressBgzfBlock -- indeed, who cares about /// compressed data after it has been uncompressed? public ubyte[] _buffer = void; /// If block has been already decompressed, result is undefined. public inout(ubyte[]) compressed_data() @property inout pure @safe nothrow { return _buffer[0 .. cast(size_t)cdata_size]; } public uint crc32; public uint input_size; /// size of uncompressed data bool dirty; hash_t toHash() const pure @safe nothrow { assert(!dirty); return crc32; } bool opEquals(const ref BgzfBlock other) pure @safe nothrow { assert(!dirty); return opCmp(other) == 0; } int opCmp(const ref BgzfBlock other) const pure @safe nothrow { assert(!dirty); if (cdata_size < other.cdata_size) return -1; if (cdata_size > other.cdata_size) return 1; return std.algorithm.cmp(compressed_data, other.compressed_data); } } /** Struct representing decompressed BgzfBlock Start offset is needed to be able to tell current virtual offset, and yet be able to decompress blocks in parallel. */ struct DecompressedBgzfBlock { ulong start_offset; ulong end_offset; ubyte[] decompressed_data; } /// alias Cache!(BgzfBlock, DecompressedBgzfBlock) BgzfBlockCache; /// Function for BGZF block decompression. /// Reuses buffer allocated for storing compressed data, /// i.e. after execution buffer of the passed $(D block) /// is overwritten with uncompressed data. DecompressedBgzfBlock decompressBgzfBlock(BgzfBlock block, BgzfBlockCache cache=null) { if (block.input_size == 0) { return DecompressedBgzfBlock(block.start_offset, block.start_offset + block.bsize + 1, cast(ubyte[])[]); // EOF marker // TODO: add check for correctness of EOF marker } if (cache !is null) { auto ptr = cache.lookup(block); if (ptr !is null) return *ptr; } int err = void; // allocate buffer on the stack ubyte[BGZF_MAX_BLOCK_SIZE] uncompressed_buf = void; // check that block follows BAM specification enforce(block.input_size <= BGZF_MAX_BLOCK_SIZE, "Uncompressed block size must be within " ~ to!string(BGZF_MAX_BLOCK_SIZE) ~ " bytes"); // for convenience, provide a slice auto uncompressed = uncompressed_buf[0 .. block.input_size]; // set input data bio.core.utils.zlib.z_stream zs; zs.next_in = cast(typeof(zs.next_in))block.compressed_data; zs.avail_in = to!uint(block.compressed_data.length); err = bio.core.utils.zlib.inflateInit2(&zs, /* winbits = */-15); if (err) { throw new ZlibException(err); } // uncompress it into a buffer on the stack zs.next_out = cast(typeof(zs.next_out))uncompressed_buf.ptr; zs.avail_out = block.input_size; err = bio.core.utils.zlib.inflate(&zs, Z_FINISH); switch (err) { case Z_STREAM_END: assert(zs.total_out == block.input_size); err = bio.core.utils.zlib.inflateEnd(&zs); if (err != Z_OK) { throw new ZlibException(err); } break; default: bio.core.utils.zlib.inflateEnd(&zs); throw new ZlibException(err); } assert(block.crc32 == crc32(0, uncompressed[])); if (cache !is null) { BgzfBlock compressed_bgzf_block = block; compressed_bgzf_block._buffer = block._buffer.dup; DecompressedBgzfBlock decompressed_bgzf_block; with (decompressed_bgzf_block) { start_offset = block.start_offset; end_offset = block.end_offset; decompressed_data = uncompressed[].dup; } cache.put(compressed_bgzf_block, decompressed_bgzf_block); } // Now copy back to block._buffer, overwriting existing data. // It should have enough bytes already allocated. assert(block._buffer.length >= block.input_size); version(extraVerbose) { import std.stdio; stderr.writeln("[uncompressed] [write] range: ", block._buffer.ptr, " - ", block._buffer.ptr + block.input_size); } block._buffer[0 .. block.input_size] = uncompressed[]; block.dirty = true; return DecompressedBgzfBlock(block.start_offset, block.end_offset, block._buffer[0 .. block.input_size]); } BioD-0.1.0/bio/core/bgzf/chunk.d000066400000000000000000000033311273003163100162270ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.bgzf.chunk; import bio.core.bgzf.virtualoffset; /// Chunk of BAM file is specified by pair of virtual offsets struct Chunk { VirtualOffset beg; /// virtual file offset of the start of the chunk VirtualOffset end; /// virtual file offset of the end of the chunk /// First compares beginnings, then ends int opCmp(Chunk other) const nothrow { if (beg < other.beg) return -1; if (beg > other.beg) return 1; if (end < other.end) return -1; if (end > other.end) return 1; return 0; } } BioD-0.1.0/bio/core/bgzf/compress.d000066400000000000000000000101441273003163100167520ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2014 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.bgzf.compress; import bio.bam.constants; import bio.core.utils.zlib; import std.array; import std.system; import core.bitop; /// Returns BGZF block containing compressed $(D chunk). /// If $(D buffer) is provided, it will be used for storing the block. /// /// Params: /// chunk = chunk of memory to be compressed /// level = compression level, see zlib documentation /// buffer = optional buffer which will be used for storing /// decompressed data /// /// For uncompressed BAM output, use level = 0. ubyte[] bgzfCompress(ubyte[] chunk, int level=-1, ubyte[] buffer=null) in { assert(-1 <= level && level <= 9); } body { assert(bio.core.utils.zlib.compressBound(BGZF_BLOCK_SIZE) < BGZF_MAX_BLOCK_SIZE); if (buffer is null) { buffer = uninitializedArray!(ubyte[])(BGZF_MAX_BLOCK_SIZE); } else { buffer.length = BGZF_MAX_BLOCK_SIZE; } // write header buffer[0 .. BLOCK_HEADER_LENGTH - ushort.sizeof] = BLOCK_HEADER_START[]; bio.core.utils.zlib.z_stream zs; zs.zalloc = null; zs.zfree = null; zs.next_in = cast(ubyte*)chunk.ptr; zs.avail_in = cast(uint)chunk.length; zs.next_out = buffer.ptr + BLOCK_HEADER_LENGTH; zs.avail_out = cast(int)(buffer.length - BLOCK_HEADER_LENGTH - BLOCK_FOOTER_LENGTH); auto err = bio.core.utils.zlib.deflateInit2(&zs, /* compression level */ level, /* deflated compression method */ Z_DEFLATED, /* winbits (no header) */ -15, /* memory usage level (default) */ 8, /* default compression strategy */ Z_DEFAULT_STRATEGY); if (err != Z_OK) { throw new ZlibException("deflateInit2", err); } err = bio.core.utils.zlib.deflate(&zs, Z_FINISH); if (err != Z_STREAM_END) { throw new ZlibException("deflate", err); } err = bio.core.utils.zlib.deflateEnd(&zs); if (err != Z_OK) { throw new ZlibException("deflateEnd", err); } // almost done, update buffer length buffer.length = zs.total_out + BLOCK_HEADER_LENGTH + BLOCK_FOOTER_LENGTH; // Write (block length - 1) in BC subfield. // Why -1? To fit the value into 2 bytes (it's assumed to be in range 1-65536). ushort len = cast(ushort)(buffer.length - 1); buffer[BLOCK_HEADER_LENGTH - 2] = len & 0xFF; // little endian buffer[BLOCK_HEADER_LENGTH - 1] = len >> 8; // Write the footer *(cast(uint*)(buffer.ptr + buffer.length - 8)) = crc32(0, chunk); *(cast(uint*)(buffer.ptr + buffer.length - 4)) = cast(uint)chunk.length; uint* ptr; if (std.system.endian != Endian.littleEndian) { ptr = cast(uint*)(buffer.ptr + buffer.length - 8); *ptr = bswap(*ptr); ptr = cast(uint*)(buffer.ptr + buffer.length - 4); *ptr = bswap(*ptr); } return buffer; } BioD-0.1.0/bio/core/bgzf/constants.d000066400000000000000000000044261273003163100171410ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.bgzf.constants; immutable BGZF_MAGIC = 0x04_08_8B_1F; // little endian immutable ubyte[16] BLOCK_HEADER_START = [ 31, 139, 8, 4, // BGZF magic 0, 0, 0, 0, // GZIP modification time 0, // GZIP extra flags 255, // GZIP OS identifier 6, 0, // GZIP extra length == 6 (LE) 66, 67, // Subfield 'BC' 2, 0]; // Subfield length (holds 1 ushort) // empty block immutable ubyte[28] BGZF_EOF = [31, 139, 8, 4, 0, 0, 0, 0, 0, 255, 6, 0, 66, 67, 2, 0, 27, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // BGZF block header length in bytes. // Block header holds BLOCK_HEADER_START + block size (ushort) immutable BLOCK_HEADER_LENGTH = BLOCK_HEADER_START.length + ushort.sizeof; // BGZF footer holds CRC32 and size of decompressed block. immutable BLOCK_FOOTER_LENGTH = uint.sizeof + uint.sizeof; immutable BGZF_MAX_BLOCK_SIZE = 65536; immutable BGZF_BLOCK_SIZE = 0xFF00; BioD-0.1.0/bio/core/bgzf/inputstream.d000066400000000000000000000415031273003163100174750ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.bgzf.inputstream; import bio.core.bgzf.block; import bio.core.bgzf.virtualoffset; import bio.core.bgzf.constants; import bio.core.bgzf.chunk; import bio.bam.constants; import bio.core.utils.roundbuf; import std.stream; import std.exception; import std.conv; import std.parallelism; import std.array; import std.algorithm : min, max; /// Exception type, thrown in case of encountering corrupt BGZF blocks class BgzfException : Exception { this(string msg) { super(msg); } } bool fillBgzfBufferFromStream(Stream stream, bool is_seekable, BgzfBlock* block, ubyte* buffer, size_t *number_of_bytes_read=null) { if (stream.eof()) return false; ulong start_offset; void throwBgzfException(string msg) { throw new BgzfException("Error reading BGZF block starting from offset " ~ to!string(start_offset) ~ ": " ~ msg); } if (is_seekable) start_offset = stream.position; try { uint bgzf_magic = void; // TODO: fix byte order if needed size_t bytes_read; while (bytes_read < uint.sizeof) { auto buf = (cast(ubyte*)&bgzf_magic)[bytes_read .. uint.sizeof]; auto read_ = stream.read(buf); if (read_ == 0) return false; bytes_read += read_; } if (bgzf_magic != BGZF_MAGIC) { throwBgzfException("wrong BGZF magic"); } ushort gzip_extra_length = void; if (is_seekable) { stream.seekCur(uint.sizeof + 2 * ubyte.sizeof); } else { uint gzip_mod_time = void; ubyte gzip_extra_flags = void; ubyte gzip_os = void; stream.read(gzip_mod_time); stream.read(gzip_extra_flags); stream.read(gzip_os); } stream.read(gzip_extra_length); ushort bsize = void; // total Block SIZE minus 1 bool found_block_size = false; // read extra subfields size_t len = 0; while (len < gzip_extra_length) { ubyte si1 = void; // Subfield Identifier1 ubyte si2 = void; // Subfield Identifier2 ushort slen = void; // Subfield LENgth stream.read(si1); stream.read(si2); stream.read(slen); if (si1 == BAM_SI1 && si2 == BAM_SI2) { // found 'BC' as subfield identifier if (slen != 2) { throwBgzfException("wrong BC subfield length: " ~ to!string(slen) ~ "; expected 2"); } if (found_block_size) { throwBgzfException("duplicate field with block size"); } // read block size stream.read(bsize); found_block_size = true; // skip the rest if (is_seekable) { stream.seekCur(slen - bsize.sizeof); } else { stream.readString(slen - bsize.sizeof); } } else { // this subfield has nothing to do with block size, just skip if (is_seekable) { stream.seekCur(slen); } else { stream.readString(slen); } } auto nbytes = si1.sizeof + si2.sizeof + slen.sizeof + slen; if (number_of_bytes_read !is null) *number_of_bytes_read += nbytes; len += nbytes; } if (len != gzip_extra_length) { throwBgzfException("total length of subfields in bytes (" ~ to!string(len) ~ ") is not equal to gzip_extra_length (" ~ to!string(gzip_extra_length) ~ ")"); } if (!found_block_size) { throwBgzfException("block size was not found in any subfield"); } // read compressed data auto cdata_size = bsize - gzip_extra_length - 19; if (cdata_size > BGZF_MAX_BLOCK_SIZE) { throwBgzfException("compressed data size is more than " ~ to!string(BGZF_MAX_BLOCK_SIZE) ~ " bytes, which is not allowed by " ~ "current BAM specification"); } block.bsize = bsize; block.cdata_size = cast(ushort)cdata_size; version(extraVerbose) { import std.stdio; // stderr.writeln("[compressed] reading ", cdata_size, " bytes starting from ", start_offset); } stream.readExact(buffer, cdata_size); version(extraVerbose) { stderr.writeln("[ compressed] [write] range: ", buffer, " - ", buffer + cdata_size); } // version(extraVerbose) {stderr.writeln("[compressed] reading block crc32 and input size...");} stream.read(block.crc32); stream.read(block.input_size); if (number_of_bytes_read !is null) *number_of_bytes_read += 12 + cdata_size + block.crc32.sizeof + block.input_size.sizeof; // version(extraVerbose) {stderr.writeln("[compressed] read block input size: ", block.input_size);} block._buffer = buffer[0 .. max(block.input_size, cdata_size)]; block.start_offset = start_offset; block.dirty = false; } catch (ReadException e) { throwBgzfException("stream error: " ~ e.msg); } return true; } /// interface BgzfBlockSupplier { /// Fills $(D buffer) with compressed data and points $(D block) to it. /// Return value is false if there is no next block. /// /// The implementation may assume that there's enough space in the buffer. bool getNextBgzfBlock(BgzfBlock* block, ubyte* buffer, ushort* skip_start, ushort* skip_end); /// Total compressed size of the supplied blocks in bytes. /// If unknown, should return 0. size_t totalCompressedSize() const; } /// class StreamSupplier : BgzfBlockSupplier { private { Stream _stream; bool _seekable; size_t _start_offset; size_t _size; ushort _skip_start; } /// this(Stream stream, ushort skip_start=0) { _stream = stream; _seekable = _stream.seekable; _skip_start = skip_start; if (_seekable) _size = cast(size_t)(_stream.size); } /// bool getNextBgzfBlock(BgzfBlock* block, ubyte* buffer, ushort* skip_start, ushort* skip_end) { auto curr_start_offset = _start_offset; // updates _start_offset auto result = fillBgzfBufferFromStream(_stream, _seekable, block, buffer, &_start_offset); if (!_seekable) block.start_offset = curr_start_offset; *skip_start = _skip_start; _skip_start = 0; *skip_end = 0; return result; } /// Stream size if available size_t totalCompressedSize() const { return _size; } } class StreamChunksSupplier : BgzfBlockSupplier { private { Stream _stream; Chunk[] _chunks; void moveToNextChunk() { if (_chunks.length == 0) return; size_t i = 1; auto beg = _chunks[0].beg; for ( ; i < _chunks.length; ++i) if (_chunks[i].beg.coffset > _chunks[0].beg.coffset) break; _chunks = _chunks[i - 1 .. $]; _chunks[0].beg = beg; _stream.seekSet(cast(size_t)_chunks[0].beg.coffset); version(extraVerbose) { import std.stdio; stderr.writeln("started processing chunk ", beg, " - ", _chunks[0].end); } } } this(Stream stream, bio.core.bgzf.chunk.Chunk[] chunks) { _stream = stream; assert(_stream.seekable); _chunks = chunks; moveToNextChunk(); } /// bool getNextBgzfBlock(BgzfBlock* block, ubyte* buffer, ushort* skip_start, ushort* skip_end) { if (_chunks.length == 0) return false; // Usually there can't be two or more chunks overlapping a // single block -- in such cases they are merged during // indexing in most implementations. // If this is not the case, the algorithm should still work, // but it might decompress the same block several times. // // On each call of this method, one of these things happen: // 1) We remain in the current chunk, but read next block // 2) We finish dealing with the current chunk, so we move to // the next one. If this was the last one, false is returned. // // moveToNextChunk moves stream pointer to chunk.beg.coffset, // in which case skip_start should be set to chunk.beg.uoffset auto result = fillBgzfBufferFromStream(_stream, true, block, buffer); auto offset = block.start_offset; if (!result) return false; if (offset == _chunks[0].beg.coffset) *skip_start = _chunks[0].beg.uoffset; // first block in a chunk else *skip_start = 0; long _skip_end; // may be equal to 65536! if (offset == _chunks[0].end.coffset) // last block in a chunk _skip_end = block.input_size - _chunks[0].end.uoffset; else _skip_end = 0; *skip_end = cast(ushort)_skip_end; if (offset >= _chunks[0].end.coffset) { _chunks = _chunks[1 .. $]; moveToNextChunk(); } // special case: it's not actually the last block in a chunk, // but rather that chunk ended on the edge of two blocks if (block.input_size > 0 && _skip_end == block.input_size) { version(extraVerbose) { import std.stdio; stderr.writeln("skip_end == input size"); } return getNextBgzfBlock(block, buffer, skip_start, skip_end); } return true; } /// Always zero (unknown) size_t totalCompressedSize() const { return 0; } } /// class BgzfInputStream : Stream { private { BgzfBlockSupplier _supplier; ubyte[] _data; BgzfBlockCache _cache; ubyte[] _read_buffer; VirtualOffset _current_vo; VirtualOffset _end_vo; size_t _compressed_size; // for estimating compression ratio size_t _compressed_read, _uncompressed_read; TaskPool _pool; enum _max_block_size = BGZF_MAX_BLOCK_SIZE * 2; alias Task!(decompressBgzfBlock, BgzfBlock, BgzfBlockCache) DecompressionTask; DecompressionTask[] _task_buf; static struct BlockAux { BgzfBlock block; ushort skip_start; ushort skip_end; DecompressionTask* task; alias task this; } RoundBuf!BlockAux _tasks = void; size_t _offset; bool fillNextBlock() { ubyte* p = _data.ptr + _offset; BlockAux b = void; if (_supplier.getNextBgzfBlock(&b.block, p, &b.skip_start, &b.skip_end)) { if (b.block.input_size == 0) // BGZF EOF block return false; _compressed_read += b.block.end_offset - b.block.start_offset; _uncompressed_read += b.block.input_size; version(extraVerbose) { import std.stdio; stderr.writeln("[creating task] ", b.block.start_offset, " / ", b.skip_start, " / ", b.skip_end); } DecompressionTask tmp = void; tmp = scopedTask!decompressBgzfBlock(b.block, _cache); auto t = _task_buf.ptr + _offset / _max_block_size; import core.stdc.string : memcpy; memcpy(t, &tmp, DecompressionTask.sizeof); b.task = t; _tasks.put(b); _pool.put(b.task); _offset += _max_block_size; if (_offset == _data.length) _offset = 0; return true; } return false; } void setupReadBuffer() { auto b = _tasks.front; auto decompressed_block = b.task.yieldForce(); auto from = b.skip_start; auto to = b.block.input_size - b.skip_end; _read_buffer = b.block._buffer.ptr[from .. to]; if (from == to) { assert(from == 0); setEOF(); } _current_vo = VirtualOffset(b.block.start_offset, from); version(extraVerbose) { import std.stdio; stderr.writeln("[setup read buffer] ", _current_vo); } if (b.skip_end > 0) _end_vo = VirtualOffset(b.block.start_offset, cast(ushort)to); else _end_vo = VirtualOffset(b.block.end_offset, 0); _tasks.popFront(); } void setEOF() { _current_vo = _end_vo; readEOF = true; } } this(BgzfBlockSupplier supplier, TaskPool pool=taskPool, BgzfBlockCache cache=null, size_t buffer_size=0) { _supplier = supplier; _compressed_size = _supplier.totalCompressedSize(); _pool = pool; _cache = cache; size_t n_tasks = max(pool.size, 1) * 2; if (buffer_size > 0) n_tasks = max(n_tasks, buffer_size / BGZF_MAX_BLOCK_SIZE); _tasks = RoundBuf!BlockAux(n_tasks); _task_buf = uninitializedArray!(DecompressionTask[])(n_tasks); _data = uninitializedArray!(ubyte[])(n_tasks * _max_block_size); for (size_t i = 0; i < n_tasks; ++i) if (!fillNextBlock()) break; if (!_tasks.empty) { setupReadBuffer(); } } VirtualOffset virtualTell() const { return _current_vo; } override ulong seek(long offset, SeekPos whence) { throw new SeekException("Stream is not seekable"); } override size_t writeBlock(const void* buf, size_t size) { throw new WriteException("Stream is not writeable"); } override size_t readBlock(void* buf, size_t size) { version(extraVerbose) { import std.stdio; // stderr.writeln("[uncompressed] reading ", size, " bytes to address ", buf); } if (_read_buffer.length == 0) { assert(_tasks.empty); setEOF(); return 0; } auto buffer = cast(ubyte*)buf; auto len = min(size, _read_buffer.length); buffer[0 .. len] = _read_buffer[0 .. len]; version(extraVerbose) { // stderr.writeln("[uncompressed] [read] range: ", _read_buffer.ptr, " - ", _read_buffer.ptr + len); } _read_buffer = _read_buffer[len .. $]; _current_vo = VirtualOffset(cast(ulong)_current_vo + len); if (_read_buffer.length == 0) { _current_vo = _end_vo; if (!_tasks.empty) { setupReadBuffer(); if (!readEOF) fillNextBlock(); } else setEOF(); } return len; } size_t total_compressed_size() @property const { return _compressed_size; } float average_compression_ratio() @property const { if (_compressed_read == 0) return 0.0; return cast(float)_uncompressed_read / _compressed_read; } } BioD-0.1.0/bio/core/bgzf/outputstream.d000066400000000000000000000201201273003163100176660ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.bgzf.outputstream; import bio.core.bgzf.constants; import bio.core.bgzf.compress; import bio.core.utils.roundbuf; import std.stream; import std.exception; import std.parallelism; import std.array; import std.algorithm : max; import std.typecons; import std.c.stdlib; alias void delegate(ubyte[], ubyte[]) BlockWriteHandler; Tuple!(ubyte[], ubyte[], BlockWriteHandler) bgzfCompressFunc(ubyte[] input, int level, ubyte[] output_buffer, BlockWriteHandler handler) { auto output = bgzfCompress(input, level, output_buffer); return tuple(input, output, handler); } /// Class for BGZF compression class BgzfOutputStream : Stream { private { Stream _stream = void; TaskPool _task_pool = void; ubyte[] _buffer; // a slice into _compression_buffer (uncompressed data) ubyte[] _tmp; // a slice into _compression_buffer (compressed data) size_t _current_size; int _compression_level; alias Task!(bgzfCompressFunc, ubyte[], int, ubyte[], BlockWriteHandler) CompressionTask; RoundBuf!(CompressionTask*) _compression_tasks; ubyte[] _compression_buffer; } /// Create new BGZF output stream which will use /// provided $(D task_pool) to do multithreaded compression. this(Stream output_stream, int compression_level=-1, TaskPool task_pool=taskPool, size_t buffer_size=0, size_t max_block_size=BGZF_MAX_BLOCK_SIZE, size_t block_size=BGZF_BLOCK_SIZE) { enforce(-1 <= compression_level && compression_level <= 9, "Compression level must be a number in interval [-1, 9]"); _stream = output_stream; _task_pool = task_pool; _compression_level = compression_level; size_t n_tasks = max(task_pool.size, 1) * 16; if (buffer_size > 0) { n_tasks = max(n_tasks, buffer_size / max_block_size); } _compression_tasks = RoundBuf!(CompressionTask*)(n_tasks); // 1 extra block to which we can write while n_tasks are executed auto comp_buf_size = (2 * n_tasks + 2) * max_block_size; auto p = cast(ubyte*)std.c.stdlib.malloc(comp_buf_size); _compression_buffer = p[0 .. comp_buf_size]; _buffer = _compression_buffer[0 .. block_size]; _tmp = _compression_buffer[max_block_size .. max_block_size * 2]; readable = false; writeable = true; seekable = false; } override size_t readBlock(void* buffer, size_t size) { throw new ReadException("Stream is not readable"); } override ulong seek(long offset, SeekPos whence) { throw new SeekException("Stream is not seekable"); } override size_t writeBlock(const void* buf, size_t size) { if (size + _current_size >= _buffer.length) { size_t room; ubyte[] data = (cast(ubyte*)buf)[0 .. size]; while (data.length + _current_size >= _buffer.length) { room = _buffer.length - _current_size; _buffer[$ - room .. $] = data[0 .. room]; data = data[room .. $]; _current_size = _buffer.length; flushCurrentBlock(); } _buffer[0 .. data.length] = data[]; _current_size = data.length; } else { _buffer[_current_size .. _current_size + size] = (cast(ubyte*)buf)[0 .. size]; _current_size += size; } return size; } /// Force flushing current block, even if it is not yet filled. /// Should be used when it's not desired to have records crossing block borders. void flushCurrentBlock() { if (_current_size == 0) return; Tuple!(ubyte[], ubyte[], BlockWriteHandler) front_result; if (_compression_tasks.full) { front_result = _compression_tasks.front.yieldForce(); _compression_tasks.popFront(); } auto compression_task = task!bgzfCompressFunc(_buffer[0 .. _current_size], _compression_level, _tmp, _before_write); _compression_tasks.put(compression_task); _task_pool.put(compression_task); size_t offset = _buffer.ptr - _compression_buffer.ptr; immutable N = _tmp.length; offset += 2 * N; if (offset == _compression_buffer.length) offset = 0; _buffer = _compression_buffer[offset .. offset + _buffer.length]; _tmp = _compression_buffer[offset + N .. offset + 2 * N]; _current_size = 0; if (front_result[0] !is null) writeResult(front_result); while (!_compression_tasks.empty) { auto task = _compression_tasks.front; if (!task.done()) break; auto result = task.yieldForce(); writeResult(result); _compression_tasks.popFront(); } } private void delegate(ubyte[], ubyte[]) _before_write; void setWriteHandler(void delegate(ubyte[], ubyte[]) handler) { _before_write = handler; } private void writeResult(Tuple!(ubyte[], ubyte[], BlockWriteHandler) block) { auto uncompressed = block[0]; auto compressed = block[1]; auto handler = block[2]; if (handler) {// write handler enabled handler(uncompressed, compressed); } _stream.writeExact(compressed.ptr, compressed.length); } /// Flush all remaining BGZF blocks and underlying stream. override void flush() { flushCurrentBlock(); foreach (task; _compression_tasks) { auto block = task.yieldForce(); writeResult(block); } _stream.flush(); _current_size = 0; } /// Flush all remaining BGZF blocks and close source stream. /// Automatically adds empty block at the end, serving as /// indicator of end of stream. override void close() { flush(); addEofBlock(); _stream.close(); writeable = false; std.c.stdlib.free(_compression_buffer.ptr); } /// Adds EOF block. This function is called in close() method. void addEofBlock() { _stream.writeExact(BGZF_EOF.ptr, BGZF_EOF.length); } } unittest { import bio.core.bgzf.inputstream; import std.array, std.range, std.stdio; char[] data = "my very l" ~ array(repeat('o', 1000000)) ~ "ng string"; foreach (level; [-1, 0, 1]) { auto output_stream = new MemoryStream(); auto bgzf_output_stream = new BgzfOutputStream(output_stream, 1); bgzf_output_stream.writeExact(data.ptr, data.length); bgzf_output_stream.close(); auto input_stream = new MemoryStream(output_stream.data); input_stream.seekSet(0); auto block_supplier = new StreamSupplier(input_stream); auto bgzf_input_stream = new BgzfInputStream(block_supplier); char[] uncompressed_data = new char[data.length]; bgzf_input_stream.readExact(uncompressed_data.ptr, data.length); assert(uncompressed_data == data); } } BioD-0.1.0/bio/core/bgzf/virtualoffset.d000066400000000000000000000062131273003163100200160ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.bgzf.virtualoffset; import std.conv; /// Structure representing virtual offset in BGZF-compressed file. struct VirtualOffset { /// Params: /// /// coffset = unsigned byte offset into the BGZF file /// to the beginning of a BGZF block. /// Must be strictly less than 2^48. /// /// uoffset = unsigned byte offset into the uncompressed /// data stream represented by that BGZF block this(ulong coffset, ushort uoffset) nothrow @safe in { assert(coffset < (1UL<<48)); } body { voffset = (coffset << 16) | uoffset; } /// Set both coffset and uoffset packed as (coffset<<16)|uoffset this(ulong voffset) nothrow @safe { this.voffset = voffset; } /// ditto ulong coffset() @property const nothrow @safe pure { return voffset >> 16; } /// ditto ushort uoffset() @property const nothrow @safe pure { return voffset & 0xFFFF; } int opCmp(const ref VirtualOffset other) const nothrow @safe pure { if (this.voffset > other.voffset) { return 1; } if (this.voffset < other.voffset) { return -1; } return 0; } bool opEquals(const ref VirtualOffset other) const nothrow @safe { return this.voffset == other.voffset; } bool opEquals(ulong voffset) const nothrow @safe { auto vo = VirtualOffset(voffset); return opEquals(vo); } ulong opCast() const nothrow @safe pure { return voffset; } /// String representation in format "/" string toString() { return to!string(coffset) ~ "/" ~ to!string(uoffset); } private: ulong voffset; } unittest { auto voffset = VirtualOffset(100500, 42); assert(voffset.coffset == 100500); assert(voffset.uoffset == 42); assert(voffset == (100500UL << 16) + 42UL); assert(cast(ulong)voffset == (100500UL << 16) + 42UL); } BioD-0.1.0/bio/core/call.d000066400000000000000000000057201273003163100151060ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.call; import bio.core.base; import bio.core.genotype; /// A genotype call struct Call(alias Gt, B) { alias Gt!B G; private { string _sample = void; string _chr = void; ulong _pos = void; B _refbase = void; G _gt = void; float _qual = void; } /// Constructor this(string sample, string chr, ulong pos, B refbase, G genotype, float quality=float.nan) { _sample = sample; _chr = chr; _pos = pos; _refbase = refbase; _gt = genotype; _qual = quality; } /// Sample name string sample() @property const { return _sample; } /// Chromosome name string chromosome() @property const { return _chr; } /// 0-based position on the reference ulong position() @property const { return _pos; } /// Reference base at the site B reference_base() @property const { return _refbase; } /// Most probable genotype ref const(G) genotype() @property const { return _gt; } /// alias genotype this; /// Phred-scaled quality score. If unknown, set to NaN. float quality() @property const { return _qual; } /// Returns true if this call is not a reference one. bool is_variant() @property const { return _gt != G(_refbase); } } alias Call!(DiploidGenotype, Base5) DiploidCall5; alias Call!(DiploidGenotype, Base16) DiploidCall; alias DiploidCall DiploidCall16; unittest { auto call = DiploidCall("NA01234", "chr10", 543210, Base('T'), diploidGenotype(Base('C'), Base('T')), 47.0); assert(call.is_variant); assert(call.is_heterozygous); assert(call.reference_base == 'T'); } BioD-0.1.0/bio/core/fasta.d000066400000000000000000000034321273003163100152670ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.fasta; import std.file; import std.exception; import std.algorithm; import std.string; struct FastaRecord { string header; string sequence; } auto fastaRecords(string filename) { static auto toFastaRecord(S)(S str) { auto res = findSplit(str, "\n"); auto header = res[0]; auto seq = res[2]; return FastaRecord(header, removechars(seq, "\n")); } string text = cast(string)std.file.read(filename); enforce(text.length > 0 && text[0] == '>'); text = text[1 .. $]; auto records = splitter(text, '>'); return map!toFastaRecord(records); } BioD-0.1.0/bio/core/genotype.d000066400000000000000000000054761273003163100160350ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.genotype; import bio.core.base; import bio.core.tinymap; /// Holds ordered pair of two alleles struct DiploidGenotype(B) { mixin TinyMapInterface!(B.ValueSetSize ^^ 2); private static ubyte _getCode(B b1, B b2) { auto c1 = b1.internal_code; auto c2 = b2.internal_code; return cast(ubyte)(c1 * B.ValueSetSize + c2); } /// Construct a genotype from two bases /// Every ambiguous base gets converted to 'N' internally. this(B b1, B b2) { _code = _getCode(b1, b2); } /// Construct homozygous genotype this(B b) { _code = _getCode(b, b); } /// First allele B base1() @property const { return B.fromInternalCode(_code / B.ValueSetSize); } /// Second allele B base2() @property const { return B.fromInternalCode(_code % B.ValueSetSize); } /// bool is_heterozygous() @property const { return base1 != base2; } /// bool is_homozygous() @property const { return base1 == base2; } /// String representation B1|B2 (TODO: add phasing in future?) string toString() const { return base1 ~ "|" ~ base2; } } /// Create an instance of DiploidGenotype auto diploidGenotype(B...)(B bases) { return DiploidGenotype!(B[0])(bases); } unittest { auto g1 = diploidGenotype(Base('C'), Base('W')); assert(g1.base1 == 'C'); assert(g1.base2 == 'W'); // By default, Base5 is used auto g2 = diploidGenotype(Base5('C')); assert(g2.base1 == g2.base2); // Both bases must be of the same type static assert(!__traits(compiles, diploidGenotype(Base5('T'), Base16('D')))); } BioD-0.1.0/bio/core/kmer.d000066400000000000000000000053411273003163100151300ustar00rootroot00000000000000module bio.core.kmer; import bio.core.base; import std.range; /// Represents k-mer of ACGT bases of length no more than 32. struct KMer(uint K) if (K <= 32) { private ulong _id; static Base5 code2base(int code) { return Base5("ACGT"[code]); } static int char2code(char base) { switch (base) { case 'A': return 0; case 'C': return 1; case 'G': return 2; case 'T': return 3; default: return -1; } } /// Unique ID ulong id() @property const { return _id; } /// Construct by ID this(S)(S id) if (is(S == ulong)) { _id = id; } /// Construct from sequence. Takes bases from the provided sequence /// until K symbols 'A/C/G/T' are found. That is, 'N' and other ambiguous /// bases are skipped. /// /// If sequence does not contain at least K bases 'A/C/G/T', the result of /// operation is undefined. this(S)(S sequence) if (isInputRange!S) { size_t i = 0; foreach (nuc; sequence) { _id <<= 2; ++i; switch (cast(char)nuc) { case 'A': break; case 'C': _id += 1; break; case 'G': _id += 2; break; case 'T': _id += 3; break; default: _id >>= 2; --i; break; } if (i == K) break; } } struct KMerSequence { this(ulong number) { _n = number; } private ulong _n; private size_t _len = K; bool empty() @property const { return _len == 0; } void popFront() { --_len; } void popBack() { --_len; _n >>= 2; } Base5 opIndex(size_t i) const { return code2base((_n >> (2 * (_len - i - 1))) & 3); } size_t length() @property const { return _len; } Base5 front() @property const { return opIndex(0); } Base5 back() @property const { return opIndex(_len - 1); } KMerSequence save() @property const { KMerSequence _seq = void; _seq._n = _n; _seq._len = _len; return _seq; } } /// Sequence corresponding to the k-mer KMerSequence sequence() @property const { return KMerSequence(_id); } } unittest { import std.algorithm; auto kmer = KMer!10("AACGTACGTG"); assert(equal(kmer.sequence, "AACGTACGTG")); assert(KMer!5(KMer!5(0b1011001001UL).sequence).id == 0b1011001001UL); } BioD-0.1.0/bio/core/region.d000066400000000000000000000117551273003163100154630ustar00rootroot00000000000000 #line 1 "region.rl" /* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.region; #line 26 "region.d" static const int region_parser_start = 1; static const int region_parser_first_final = 3; static const int region_parser_error = 0; static const int region_parser_en_region = 1; #line 40 "region.rl" import std.conv; struct Region { string reference; uint beg; uint end; } Region parseRegion(string str) { char* p = cast(char*)str.ptr; char* pe = p + str.length; char* eof = pe; int cs; long uint_value; Region region; region.beg = 0; region.end = uint.max; #line 57 "region.d" { cs = region_parser_start; } #line 62 "region.rl" #line 64 "region.d" { if ( p == pe ) goto _test_eof; switch ( cs ) { goto case; case 1: if ( (*p) < 43u ) { if ( 33u <= (*p) && (*p) <= 41u ) goto st3; } else if ( (*p) > 60u ) { if ( 62u <= (*p) && (*p) <= 126u ) goto st3; } else goto st3; goto st0; st0: cs = 0; goto _out; st3: if ( ++p == pe ) goto _test_eof3; goto case; case 3: if ( (*p) == 58u ) goto tr3; if ( 33u <= (*p) && (*p) <= 126u ) goto st3; goto st0; tr3: #line 29 "region.rl" { region.reference = str[0 .. p - str.ptr]; } goto st4; st4: if ( ++p == pe ) goto _test_eof4; goto case; case 4: #line 100 "region.d" if ( (*p) == 44u ) goto tr5; if ( (*p) < 48u ) { if ( 33u <= (*p) && (*p) <= 47u ) goto st5; } else if ( (*p) > 57u ) { if ( 58u <= (*p) && (*p) <= 126u ) goto st5; } else goto tr5; goto st0; st5: if ( ++p == pe ) goto _test_eof5; goto case; case 5: if ( 33u <= (*p) && (*p) <= 126u ) goto st5; goto st0; tr5: #line 25 "region.rl" { uint_value = 0; } #line 26 "region.rl" { if ((*p) != ',') uint_value *= 10, uint_value += (*p) - '0'; } goto st6; tr6: #line 26 "region.rl" { if ((*p) != ',') uint_value *= 10, uint_value += (*p) - '0'; } goto st6; st6: if ( ++p == pe ) goto _test_eof6; goto case; case 6: #line 133 "region.d" switch( (*p) ) { case 44u: goto tr6; case 45u: goto tr7; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr6; goto st0; tr7: #line 30 "region.rl" { region.beg = to!uint(uint_value - 1); } goto st2; st2: if ( ++p == pe ) goto _test_eof2; goto case; case 2: #line 150 "region.d" if ( (*p) == 44u ) goto tr2; if ( 48u <= (*p) && (*p) <= 57u ) goto tr2; goto st0; tr2: #line 25 "region.rl" { uint_value = 0; } #line 26 "region.rl" { if ((*p) != ',') uint_value *= 10, uint_value += (*p) - '0'; } goto st7; tr8: #line 26 "region.rl" { if ((*p) != ',') uint_value *= 10, uint_value += (*p) - '0'; } goto st7; st7: if ( ++p == pe ) goto _test_eof7; goto case; case 7: #line 170 "region.d" if ( (*p) == 44u ) goto tr8; if ( 48u <= (*p) && (*p) <= 57u ) goto tr8; goto st0; default: break; } _test_eof3: cs = 3; goto _test_eof; _test_eof4: cs = 4; goto _test_eof; _test_eof5: cs = 5; goto _test_eof; _test_eof6: cs = 6; goto _test_eof; _test_eof2: cs = 2; goto _test_eof; _test_eof7: cs = 7; goto _test_eof; _test_eof: {} if ( p == eof ) { switch ( cs ) { case 3: case 4: case 5: #line 29 "region.rl" { region.reference = str[0 .. p - str.ptr]; } break; case 6: #line 30 "region.rl" { region.beg = to!uint(uint_value - 1); } break; case 7: #line 31 "region.rl" { region.end = to!uint(uint_value); } break; #line 203 "region.d" default: break; } } _out: {} } #line 63 "region.rl" return region; } unittest { auto region1 = parseRegion("chr1:1,000-2000"); assert(region1.reference == "chr1"); assert(region1.beg == 999); assert(region1.end == 2000); auto region2 = parseRegion("chr2"); assert(region2.reference == "chr2"); assert(region2.beg == 0); assert(region2.end == uint.max); auto region3 = parseRegion("chr3:1,000,000"); assert(region3.reference == "chr3"); assert(region3.beg == 999_999); assert(region3.end == uint.max); } BioD-0.1.0/bio/core/sequence.d000066400000000000000000000142331273003163100160020ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.sequence; import bio.core.base; import std.algorithm; import std.range; import std.conv; import std.traits; public import std.array; /// Identity function T identity(T)(auto ref T t) { return t; } /// Range that allows to unify operations in forward and reverse directions /// without virtual function call overhead introduced by $(D inputRangeObject). /// /// $(D reverseTransform) is a function that will be applied to elements /// if range is iterated backwards. struct ReversableRange(alias reverseTransform=identity, R) if(isBidirectionalRange!R) { private { bool _rev = void; R _range = void; } /// Construct reversable range. /// /// Params: /// range = bidirectional range /// reverse = if true, all operations on the range will be as if /// $(D retro(range)) was used instead of $(D range). this(R range, bool reverse=false) { _rev = reverse; _range = range; } /// Bidirectional range primitives bool empty() @property { return _range.empty; } /// ditto auto front() @property { return _rev ? reverseTransform(_range.back) : _range.front; } /// ditto auto back() @property { return _rev ? reverseTransform(_range.front) : _range.back; } /// ditto void popFront() { if (_rev) _range.popBack(); else _range.popFront(); } /// ditto void popBack() { if (_rev) _range.popFront(); else _range.popBack(); } /// ditto auto save() @property { return ReversableRange(_range.save, _rev); } /// Reverse of this range ReversableRange reverse() @property { return ReversableRange(_range.save, !_rev); } static if(hasLength!R) { /// If source range has length, the result also has length size_t length() @property { return _range.length; } } static if(isRandomAccessRange!R) { /// If source range is a random access range, $(D opIndex) is defined auto opIndex(size_t index) { if (_rev) return reverseTransform(_range[_range.length - 1 - index]); else return _range[index]; } } static if(hasSlicing!R) { /// Slicing is also propagated auto opSlice(size_t from, size_t to) { if (_rev) { auto len = _range.length; // // [b, e) -> (len - 1 - e, len - 1 - b] ~ [len - e, len - b) // return ReversableRange(_range[len - to .. len - from], true); } else return ReversableRange(_range[from .. to], false); } } } /// Create reversable range from bidirectional one. ReversableRange!(reverseTransform, R) reversableRange(alias reverseTransform=identity, R)(R range, bool reverse=false) { return typeof(return)(range, reverse); } unittest { auto bidir_range = [1, 2, 3, 4, 5]; auto rev = reversableRange(bidir_range[], true); assert(rev.front == 5); assert(rev[2] == 3); rev.popFront(); assert(rev.back == 1); assert(rev.front == 4); assert(equal(rev[1 .. 3], [3, 2])); // Here. That's the whole point. // One can't do the same with $(D retro) // without using $(D inputRangeObject), // but that kills performance because // virtual calls can not be inlined. rev = reversableRange(bidir_range[], false); assert(rev.front == 1); assert(equal(rev[1 .. 3], [2, 3])); } /// Sequence of bases. Element of reversed range will be complemented. template Sequence(R) { alias ReversableRange!(complementBase, R) Sequence; } /// Returns an object very similar to string, but sliceable. /// Tricks std.traits.isNarrowString. auto sliceableString(string s) { return map!"cast(char)a"(cast(ubyte[])s); } /// alias ReturnType!sliceableString SliceableString; /// Create nucleotide sequence from bidirectional base range. auto nucleotideSequence(R)(R bases, bool reverse=false) if(isBidirectionalRange!R) { static if(isNarrowString!R) { return nucleotideSequence(sliceableString(bases), reverse); } else static if(is(Unqual!(ElementType!R) == char) || is(Unqual!(ElementType!R) == dchar)) { return nucleotideSequence(map!(charToBase!Base16)(bases), reverse); } else { return Sequence!R(bases, reverse); } } /// alias ReturnType!(nucleotideSequence!SliceableString) NucleotideSequence; unittest { auto seq0 = nucleotideSequence("ACGTACGT"); // reverse-complement assert(equal(seq0.reverse[2 .. 6], "GTAC")); auto seq1 = nucleotideSequence(seq0, true); assert(equal(seq1[1 .. 5], "CGTA")); assert(equal(seq1, map!complementBase(retro(seq0)))); seq1 = nucleotideSequence(seq0, false); assert(equal(seq1, seq0)); } BioD-0.1.0/bio/core/tinymap.d000066400000000000000000000206451273003163100156570ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.tinymap; private import std.algorithm; private import std.range; private import std.traits; import std.bitmanip; /// Efficient dictionary for cases when the number of possible keys is small /// and is known at compile-time. The data is held in a static array, no allocations occur. /// /// Key type must: /// have static member ValueSetSize (integer) /// have static method fromInternalCode (returning an instance of Key type); /// have property $(D internal_code) that maps it to integers 0, 1, ..., ValueSetSize - 1 struct TinyMap(K, V, alias TinyMapPolicy=useBitArray) { private V[K.ValueSetSize] _dict; private size_t _size; private mixin TinyMapPolicy!(K, V) Policy; private alias ReturnType!(K.internal_code) TCode; /// Constructor static TinyMap!(K, V, TinyMapPolicy) opCall(Args...)(Args args) { TinyMap!(K, V, TinyMapPolicy) result; result.Policy.init(args); return result; } /// Current number of elements size_t length() @property const { return _size; } /// Indexed access auto ref V opIndex(Key)(auto ref Key key) if(is(Unqual!Key == K)) { assert(key in this); return _dict[key.internal_code]; } /// ditto auto ref const(V) opIndex(Key)(auto ref Key key) const if(is(Unqual!Key == K)) { assert(key in this); return _dict[key.internal_code]; } /// ditto V opIndexAssign(V value, K key) { if (key !in this) { ++_size; } _dict[key.internal_code] = value; Policy._onInsert(key); return value; } /// ditto void opIndexOpAssign(string op)(V value, K key) { if (key !in this) { ++_size; _dict[key.internal_code] = V.init; } mixin("_dict[key.internal_code] " ~ op ~ "= value;"); Policy._onInsert(key); } /// Check if the key is in the dictionary bool opIn_r(K key) const { return Policy._hasKey(key); } /// Removal bool remove(K key) { if (key in this) { --_size; Policy._onRemove(key); return true; } return false; } /// Range of keys auto keys() @property const { // FIXME: create nice workaround for LDC bug #217 K[] _ks; foreach (i; 0 .. K.ValueSetSize) { if (Policy._hasKeyWithCode(i)) _ks ~= K.fromInternalCode(cast(TCode)i); } return _ks; } /// Range of values auto values() @property const { V[] _vs; foreach (i; 0 .. K.ValueSetSize) { if (Policy._hasKeyWithCode(i)) _vs ~= _dict[i]; } return _vs; } /// Iteration with foreach int opApply(scope int delegate(V value) dg) { foreach (i; iota(K.ValueSetSize)) { if (Policy._hasKeyWithCode(i)) { auto ret = dg(_dict[i]); if (ret != 0) return ret; } } return 0; } /// ditto int opApply(scope int delegate(K key, V value) dg) { foreach (i; iota(K.ValueSetSize)) { if (Policy._hasKeyWithCode(i)) { auto ret = dg(K.fromInternalCode(cast(TCode)i), _dict[i]); if (ret != 0) return ret; } } return 0; } } /// For each possible key store 0 if it's absent in the dictionary, /// or 1 otherwise. Bit array is used for compactness. /// /// This is the default option. In this case, size of dictionary is /// roughly (V.sizeof + 1/8) * K.ValueSetSize mixin template useBitArray(K, V) { private BitArray _value_is_set; private void init() { _value_is_set.length = K.ValueSetSize; } private bool _hasKey(K key) const { return _value_is_set[key.internal_code]; } private bool _hasKeyWithCode(size_t code) const { return _value_is_set[code]; } private void _onInsert(K key) { _value_is_set[key.internal_code] = true; } private void _onRemove(K key) { _value_is_set[key.internal_code] = false; } } /// Use default value specified at construction as an indicator /// of key absence. /// That allows to save K.ValueSetSize bits of memory. /// /// E.g., you might want to use -1 as such indicator if non-negative /// numbers are stored in the dictionary. mixin template useDefaultValue(K, V) { private V _default_value; private void init(V value) { _default_value = value; if (_default_value != V.init) { _dict[] = _default_value; } } private bool _hasKey(K key) const { return _dict[key.internal_code] != _default_value; } private bool _hasKeyWithCode(size_t code) const { return _dict[code] != _default_value; } private void _onInsert(K key) {} private void _onRemove(K key) { this[key] = _default_value; } } /// Allows to set up a dictionary which is always full. mixin template fillNoRemove(K, V) { private void init() { _size = K.ValueSetSize; } private void init(V value) { _size = K.ValueSetSize; for (size_t i = 0; i < _size; ++i) _dict[i] = value; } private bool _hasKey(K key) const { return true; } private bool _hasKeyWithCode(size_t code) const { return true; } private void _onInsert(K key) {} private void _onRemove(K key) { ++_size; } } unittest { import std.array; import bio.core.base; void test(M)(ref M dict) { auto b1 = Base('A'); auto b2 = Base('C'); auto b3 = Base('G'); auto b4 = Base('T'); dict[b1] = 2; dict[b2] = 3; assert(dict.length == 2); assert(dict[b1] == 2); assert(b2 in dict); assert(b3 !in dict); assert(b4 !in dict); dict[b4] = 5; assert(equal(sort(array(dict.values)), [2, 3, 5])); dict.remove(b1); assert(b1 !in dict); assert(dict.length == 2); assert(dict[b2] == 3); foreach (k, v; dict) { assert(k in dict); assert(dict[k] == v); } } auto dict1 = TinyMap!(Base, int)(); auto dict2 = TinyMap!(Base, int, useDefaultValue)(-1); int[Base] dict3; test(dict1); test(dict2); test(dict3); auto dict4 = TinyMap!(Base, ulong[4])(); dict4[Base('A')] = [0, 1, 2, 3]; dict4[Base('A')][3] += 1; assert(dict4[Base('A')] == [0, 1, 2, 4]); } /// Convenient mixin template for getting your struct working with TinyMap. /// /// Creates /// 1) private member of type T with name _code /// 2) fromInternalCode static method /// 3) internal_code property /// 4) static member ValueSetSize equal to N /// 5) invariant that _code is always less than ValueSetSize /// /// That is, the only thing which implementation is up to you is /// setting _code appropriately. mixin template TinyMapInterface(uint N, T=ubyte) if (isUnsigned!T) { private T _code; enum ValueSetSize = N; static assert(N <= 2 ^^ (T.sizeof * 8)); static typeof(this) fromInternalCode(T code) { typeof(this) obj = void; obj._code = code; return obj; } T internal_code() @property const { return _code; } } BioD-0.1.0/bio/core/utils/000077500000000000000000000000001273003163100151625ustar00rootroot00000000000000BioD-0.1.0/bio/core/utils/algo.d000066400000000000000000000105401273003163100162510ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2014 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.utils.algo; import std.traits; import std.range; import std.algorithm; import std.array; /** This function is supposed to be used on a small amount of objects, typically tags of the same alignment. Therefore it runs in O(N^2) but doesn't require any memory allocations. */ bool allDistinct(Range)(Range r) { uint sz = 0; uint eq = 0; foreach (e1; r) { ++sz; foreach (e2; r) { if (e1 == e2) { eq += 1; } } } return sz == eq; } private import std.algorithm; static if (!__traits(compiles, any!"a == 2"([1,2,3]))) { import std.functional; /// check if all elements satisfy the condition bool all(alias F, R)(R r) { foreach (e; r) { if (!unaryFun!F(e)) { return false; } } return true; } /// check if any element satisfies the condition bool any(alias F, R)(R r) { foreach (e; r) { if (unaryFun!F(e)) { return true; } } return false; } } import std.functional; auto argmax(alias func, S)(S set) { auto best_elem = set.front; auto best_value = unaryFun!func(best_elem); set.popFront(); foreach (elem; set) { auto value = unaryFun!func(elem); if (value > best_value) { best_value = value; best_elem = elem; } } return best_elem; } struct NonOverlappingChunks(R, alias begFunc, alias endFunc) { this(R r) { _range = r; popFront(); } bool empty() @property { return _empty; } auto front() @property { return _front; } void popFront() { if (!_range.empty()) { _front = _range.front; tryToJoinWithNextChunks(); } else { _empty = true; } } private: R _range; void tryToJoinWithNextChunks() { _range.popFront(); while (!_range.empty()) { /// Get next element auto next = _range.front; /// It's presumed that chunks are sorted assert(next >= _front); /// Check if the chunk can be joined with the previous one if (endFunc(_front) >= begFunc(next)) { /// update end of _front endFunc(_front) = max(endFunc(_front), endFunc(next)); _range.popFront(); /// next is consumed } else { /// can't join break; } } } Unqual!(ElementType!R) _front; bool _empty = false; } /// $(D begFunc) and $(D endFunc) must take a reference to the object /// and return references to the field. /// FIXME: the design is ugly. /// Params: /// r - range of chunks, sorted by leftmost coordinate /// Returns: /// range of non-overlapping chunks, covering the same subset /// as original chunks NonOverlappingChunks!(R, begFunc, endFunc) nonOverlapping(alias begFunc, alias endFunc, R)(R r) if (__traits(compiles, { if (begFunc(r.front) == endFunc(r.front)) endFunc(r.front) = begFunc(r.front); })) { return NonOverlappingChunks!(R, begFunc, endFunc)(r); } BioD-0.1.0/bio/core/utils/bylinefast.d000066400000000000000000000113571273003163100174760ustar00rootroot00000000000000/// Kudos to Juan Manuel Cabo /// http://forum.dlang.org/post/cddkatcqmdtibcmfljff@forum.dlang.org /// /// This piece of code is in public domain. module bio.core.utils.bylinefast; import std.stdio; import std.string: indexOf; import std.c.string: memmove; /** Reads by line in an efficient way (10 times faster than File.byLine from std.stdio). This is accomplished by reading entire buffers (fgetc() is not used), and allocating as little as possible. The char \n is considered as separator, removing the previous \r if it exists. The \n is never returned. The \r is not returned if it was part of a \r\n (but it is returned if it was by itself). The returned string is always a substring of a temporary buffer, that must not be stored. If necessary, you must use str[] or .dup or .idup to copy to another string. Example: File f = File("file.txt"); foreach (string line; ByLineFast(f)) { ...process line... //Make a copy: string copy = line[]; } The file isn't closed when done iterating, unless it was the only reference to the file (same as std.stdio.byLine). (example: ByLineFast(File("file.txt"))). */ struct ByLineFast { File file; char[] line; bool first_call = true; char[] buffer; char[] strBuffer; this(File f, int bufferSize=4096) { assert(bufferSize > 0); file = f; buffer.length = bufferSize; } @property bool empty() const { //Its important to check "line !is null" instead of //"line.length != 0", otherwise, no empty lines can //be returned, the iteration would be closed. if (line !is null) { return false; } if (!file.isOpen) { //Clean the buffer to avoid pointer false positives: (cast(char[])buffer)[] = 0; return true; } //First read. Determine if it's empty and put the char back. auto mutableFP = (cast(File*) &file).getFP(); auto c = fgetc(mutableFP); if (c == -1) { //Clean the buffer to avoid pointer false positives: (cast(char[])buffer)[] = 0; return true; } if (ungetc(c, mutableFP) != c) { assert(false, "Bug in cstdlib implementation"); } return false; } @property char[] front() { if (first_call) { popFront(); first_call = false; } return line; } void popFront() { if (strBuffer.length == 0) { strBuffer = file.rawRead(buffer); if (strBuffer.length == 0) { file.detach(); line = null; return; } } long pos = strBuffer.indexOf('\n'); if (pos != -1) { if (pos != 0 && strBuffer[cast(size_t)pos-1] == '\r') { line = strBuffer[0 .. cast(size_t)(pos-1)]; } else { line = strBuffer[0 .. cast(size_t)pos]; } //Pop the line, skipping the terminator: strBuffer = strBuffer[cast(size_t)(pos+1) .. $]; } else { //More needs to be read here. Copy the tail of the buffer //to the beginning, and try to read with the empty part of //the buffer. //If no buffer was left, extend the size of the buffer before //reading. If the file has ended, then the line is the entire //buffer. if (strBuffer.ptr != buffer.ptr) { //Must use memmove because there might be overlap memmove(buffer.ptr, strBuffer.ptr, strBuffer.length * char.sizeof); } auto spaceBegin = strBuffer.length; if (strBuffer.length == buffer.length) { //Must extend the buffer to keep reading. assumeSafeAppend(buffer); buffer.length = buffer.length * 2; } char[] readPart = file.rawRead(buffer[spaceBegin .. $]); if (readPart.length == 0) { //End of the file. Return whats in the buffer. //The next popFront() will try to read again, and then //mark empty condition. if (spaceBegin != 0 && buffer[spaceBegin-1] == '\r') { line = buffer[0 .. spaceBegin-1]; } else { line = buffer[0 .. spaceBegin]; } strBuffer = null; return; } strBuffer = buffer[0 .. spaceBegin + readPart.length]; //Now that we have new data in strBuffer, we can go on. //If a line isn't found, the buffer will be extended again to read more. popFront(); } } } BioD-0.1.0/bio/core/utils/format.d000066400000000000000000000231071273003163100166220ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** $(P This module provides fast formatting functions.) $(P Each function has two overloads: $(UL $(LI $(D ref char*) - in this case, function starts writing at the location, and updates the pointer. No checks are done, it's user's responsibility that this is safe.) $(LI $(D scope void delegate(const(char)[])) - formatted data is passed to the delegate for further processing.))) */ module bio.core.utils.format; import std.c.stdio; import std.c.stdlib; import std.string; import std.traits; import std.array; import std.math; private { // Reverses closed interval [begin .. end] void strreverse(char* begin, char* end) { char aux; while (end > begin) aux = *end, *end-- = *begin, *begin++ = aux; } // Prints $(D value) at the address where $(D str) points to. // Returns number of characters written. size_t itoa(T)(T value, char* str) { char* wstr=str; static if (isSigned!T) { ulong uvalue = (value < 0) ? -value : value; } else { ulong uvalue = value; } do { *wstr++ = cast(char)(48 + (uvalue % 10)); } while (uvalue /= 10); static if (isSigned!T) { if (value < 0) *wstr++ = '-'; } strreverse(str,wstr-1); return wstr - str; } } /// template isSomeSink(T) { static if (__traits(compiles, T.init("string")))//T == void delegate(const(char)[]))) enum isSomeSink = true; else static if (is(T == char*)) enum isSomeSink = true; else enum isSomeSink = false; } private { void writeFloat(T)(ref char* sink, T number) if (isFloatingPoint!T) { char[4] format; format[0] = '%'; format[1] = 'g'; format[2] = '\0'; sink += sprintf(sink, format.ptr, number); } void writeFloat(T)(scope void delegate(const(char)[]) sink, T number) if (isFloatingPoint!T) { char[1024] buffer = void; int count; auto p = buffer.ptr; auto psize = buffer.length; for (;;) { version(Win32) { count = _snprintf(p,psize,"%g", cast(double)number); if (count != -1) break; psize *= 2; p = cast(char *) alloca(psize); } version(Posix) { count = snprintf(p,psize,"%g", cast(double)number); if (count == -1) psize *= 2; else if (count >= psize) psize = count + 1; else break; p = cast(char *) alloca(psize); } } sink(p[0 .. count]); } void writeInteger(T)(ref char* sink, T integer) if (isIntegral!T) { sink += itoa(integer, sink); } void writeInteger(T)(scope void delegate(const(char)[]) sink, T integer) if (isIntegral!T) { char[32] buf = void; auto len = itoa(integer, buf.ptr); sink(buf[0 .. len]); } void writeChar(T)(ref char* sink, T c) if (isSomeChar!T) { *sink++ = c; } void writeChar(T)(scope void delegate(const(char)[]) sink, T c) if (isSomeChar!T) { sink((&c)[0 .. 1]); } void writeString(T)(ref char* sink, T s) if (isSomeString!T) { auto str = cast(const(char)[])s; std.c.string.memcpy(sink, str.ptr, str.length); sink += str.length; } void writeString(T)(scope void delegate(const(char)[]) sink, T s) if (isSomeString!T) { sink(cast(const(char)[])s); } void writeImpl(Sink, T)(auto ref Sink sink, T value) if (isSomeSink!Sink) { static if (isIntegral!T) writeInteger(sink, value); else static if (isFloatingPoint!T) writeFloat(sink, value); else static if (isSomeChar!T) writeChar(sink, value); else static if (isSomeString!T) writeString(sink, value); else static assert(false, "only integers, floats, chars and strings are supported"); } // -------------------- JSON output utils ---------------------------------- // JSON doesn't support NaN and +/- infinity. // Therefore the approach taken here is to represent // infinity as 1.0e+1024, and NaN as null. void writeFloatJson(Sink, T)(auto ref Sink sink, T value) if (isFloatingPoint!T) { if (isFinite(value)) { sink.write(value); } else { if (value == float.infinity) { sink.write("1.0e+1024"); } else if (value == -float.infinity) { sink.write("-1.0e+1024"); } else if (isNaN(value)) { sink.write("null"); } else { assert(0); } } } immutable char[256] specialCharacterTable = [ /* 0-15 */ 0,0, 0,0,0,0,0,0, 'b','t','n',0, 'f','r',0, 0, /* 16-31 */ 0,0, 0,0,0,0,0,0, 0, 0, 0,0, 0, 0,0, 0, /* 32-47 */ 0,0,'"',0,0,0,0,0, 0, 0, 0,0, 0, 0,0, 0, /* 48-63 */ 0,0, 0,0,0,0,0,0, 0, 0, 0,0, 0, 0,0,'/', /* 64-79 */ 0,0, 0,0,0,0,0,0, 0, 0, 0,0, 0, 0,0, 0, /* 80-95 */ 0,0, 0,0,0,0,0,0, 0, 0, 0,0,'\\', 0,0, 0, /* 96-111 */ 0,0, 0,0,0,0,0,0, 0, 0, 0,0, 0, 0,0, 0, /* 112-127 */ 0,0, 0,0,0,0,0,0, 0, 0, 0,0, 0, 0,0, 0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0 ]; void writeStringJson(Sink, T)(auto ref Sink sink, T s) if (isSomeString!T) { sink.write('"'); foreach (char c; s) { auto sc = specialCharacterTable[cast(ubyte)c]; if (sc == 0) { sink.write(c); } else { sink.write('\\'); sink.write(sc); } } sink.write('"'); } void writeCharJson(Sink, T)(auto ref Sink sink, T c) if (isSomeChar!T) { sink.writeStringJson((&c)[0 .. 1]); } void writeArrayJson(Sink, T)(auto ref Sink sink, T array) if (isArray!T && __traits(compiles, sink.writeJson(array[0]))) { if (array.length == 0) { sink.write("[]"); return; } sink.write('['); foreach (elem; array[0 .. $ - 1]) { sink.writeJson(elem); sink.write(','); } sink.writeJson(array[$ - 1]); sink.write(']'); } void writeJsonImpl(Sink, T)(auto ref Sink sink, T value) if (isSomeSink!Sink) { static if (isIntegral!T) writeInteger(sink, value); else static if (isFloatingPoint!T) writeFloatJson(sink, value); else static if (isSomeChar!T) writeCharJson(sink, value); else static if (isSomeString!T) writeStringJson(sink, value); else static if (isArray!T && __traits(compiles, sink.writeJsonImpl(value[0]))) writeArrayJson(sink, value); else static assert(false, "only numbers, chars, strings and arrays are supported"); } } /// void write(T)(ref char* sink, T value) { writeImpl(sink, value); } /// void write(T)(scope void delegate(const(char)[]) sink, T value) { writeImpl(sink, value); } /// void writeArray(Sink, T, U)(auto ref Sink sink, T array, U delimiter) if (isSomeSink!Sink && isArray!T && (isSomeChar!U || isSomeString!U) && __traits(compiles, sink.write(array[0]))) { if (array.length == 0) return; foreach (elem; array[0 .. $ - 1]) { sink.write(elem); sink.write(delimiter); } sink.write(array[$ - 1]); } /// Supports numbers, strings, and arrays. No dictionary - because D doesn't have a good one. void writeJson(T)(ref char* sink, T value) { writeJsonImpl(sink, value); } /// ditto void writeJson(T)(scope void delegate(const(char)[]) sink, T value) { writeJsonImpl(sink, value); } BioD-0.1.0/bio/core/utils/memoize.d000066400000000000000000000153411273003163100170000ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.utils.memoize; import std.traits; import std.typecons; debug { import std.stdio; } /// interface Cache(K, V) { /// V* lookup(K key); /// void put(K key, V value); } /// Elements are not removed from the cache. class BasicCache(uint maxItems, K, V) : Cache!(K, V) { private V[K] cache; V* lookup(K key) { return key in cache; } void put(K key, V value) { cache[key] = value; } } /// First-in first-out element removal. class FifoCache(uint maxItems, K, V) : Cache!(K, V) { private V[K] cache; private int items = 0; bool full = false; private K[maxItems] keys; // cyclic queue private uint removals; V* lookup(K key) { return key in cache; } void put(K key, V value) { cache[key] = value; if (full) { cache.remove(keys[items]); removals += 1; if (removals % maxItems == 0) { cache.rehash; } } keys[items] = key; items += 1; if (items == maxItems) { full = true; items = 0; } } } /// Least used strategy class LuCache(uint maxItems, K, V) : Cache!(K, V) { private { V[K] cache; int[K] counter; uint removals; } V* lookup(K key) { auto result = key in cache; if (result !is null) { counter[key] += 1; } return result; } void put(K key, V value) { if (counter.length >= maxItems) { // delete one element before inserting next int min = int.max; K min_key; foreach (k, i; counter) { if (i < min) { min = i; min_key = k; } } cache.remove(min_key); counter.remove(min_key); removals += 1; if (removals % maxItems == 0) { cache.rehash; counter.rehash; } } cache[key] = value; counter[key] = 1; } } version(unittest) { /// keeps number of function evaluations static shared evaluations = 0; static shared int hits = 0; static shared int misses = 0; import std.stdio; import core.atomic; void printStats() { writeln("hits: ", hits, " misses: ", misses); } } auto memoize(alias func, uint maxItems=1024, alias CacheImpl=BasicCache, Args...)(Args args) if(isCallable!func && is(Args == ParameterTypeTuple!func) && Args.length > 0) { alias ReturnType!func R; static if (Args.length == 1) { static shared(CacheImpl!(maxItems, Args, R)) cache; } else { static shared(CacheImpl!(maxItems, Tuple!Args, R)) cache; } static shared bool init = false; if (!init) { synchronized { if (cache is null) { static if (Args.length == 1) { cache = new shared(CacheImpl!(maxItems, Args, R))(); } else { cache = new shared(CacheImpl!(maxItems, Tuple!Args, R))(); } } init = true; } } static if (Args.length == 1) { auto key = args; } else { auto key = tuple(args); } R* ret = (cast()cache).lookup(key); if (ret !is null) { version(unittest) { atomicOp!"+="(hits, 1); } return *ret; } else { version(unittest) { atomicOp!"+="(misses, 1); } synchronized(cache) { ret = (cast()cache).lookup(key); if (ret !is null) { return *ret; } version(unittest) { evaluations.atomicOp!"+="(1); } auto result = func(args); (cast()cache).put(key, result); return result; } } } unittest { import core.thread; evaluations = 0; /// very simple function for testing int func(int x, int y) { return x * y; } /// 4 different argument values in total void thread_func() { memoize!func(5, 10); memoize!func(3, 7); memoize!func(6, 4); memoize!func(5, 10); memoize!func(7, 9); } Thread[] threads = new Thread[5]; foreach (i; 0 .. 5) threads[i] = new Thread(&thread_func); foreach (i; 0 .. 5) threads[i].start(); foreach (i; 0 .. 5) threads[i].join(); /// number of evaluations must be the same as number of /// different argument values (4 in this case) assert(evaluations == 4); /// test FIFO cache alias memoize!(func, 2, FifoCache, int, int) fifomemoize; evaluations = 0; fifomemoize(1, 5); // 5 fifomemoize(2, 3); // 5 6 fifomemoize(2, 4); // 6 8 fifomemoize(1, 5); // 8 5 assert(evaluations == 4); fifomemoize(2, 4); // 8 5 assert(evaluations == 4); fifomemoize(1, 7); // 5 7 fifomemoize(1, 5); // 5 7 assert(evaluations == 5); int foo(int x) { return x; } /// Test LU cache alias memoize!(foo, 3, LuCache, int) lumemoize; evaluations = 0; lumemoize(1); lumemoize(1); lumemoize(1); // 1 lumemoize(2); lumemoize(2); // 1, 2 lumemoize(3); lumemoize(3); lumemoize(3); // 1, 2, 3 lumemoize(4); // 2 -> 4 lumemoize(2); // 4 -> 2 assert(evaluations == 5); lumemoize(3); // 1, 2, 3 lumemoize(5); // 2 -> 5 assert(evaluations == 6); lumemoize(4); // 5 -> 4 lumemoize(9); // 4 -> 9 assert(evaluations == 8); } BioD-0.1.0/bio/core/utils/outbuffer.d000066400000000000000000000063661273003163100173430ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.utils.outbuffer; import std.array; import std.exception; /// class OutBuffer { private { ubyte[] _heap; ubyte* _heap_ptr() @property { return _heap.ptr; } size_t _heap_used; size_t _heap_capacity; } /// this(size_t initial_capacity) { _heap = uninitializedArray!(ubyte[])(initial_capacity); _heap_capacity = initial_capacity; } /// ubyte[] data() @property { return _heap_ptr[0 .. _heap_used]; } /// size_t length() @property const { return _heap_used; } /// Remove last elements such that new size is equal to $(D size). void shrink(size_t size) { enforce(size <= length); _heap_used = size; } /// size_t capacity() @property const { return _heap_capacity; } /// ditto void capacity(size_t new_capacity) @property { if (new_capacity <= _heap_capacity) return; _heap.length = new_capacity; _heap_capacity = new_capacity; } /// void put(T)(T bytes) if (is(T == ubyte[])) { size_t needed = bytes.length + _heap_used; if (needed > _heap_capacity) { do { _heap_capacity = _heap_capacity * 3 / 2; } while (_heap_capacity < needed); capacity = _heap_capacity; } _heap_ptr[_heap_used .. _heap_used + bytes.length] = bytes[]; _heap_used = needed; } /// Dumps raw bytes into the buffer. No endianness conversion or whatever. void put(T)(auto ref T value) if (!is(T == ubyte[])) { put((cast(ubyte*)(&value))[0 .. T.sizeof]); } /// Responsibility that there's enough capacity is on the user void putUnsafe(T)(T bytes) if (is(T == ubyte[])) { _heap_ptr[_heap_used .. _heap_used + bytes.length] = bytes[]; _heap_used += bytes.length;; } /// ditto void putUnsafe(T)(auto ref T value) if (!is(T == ubyte[])) { putUnsafe((cast(ubyte*)(&value))[0 .. T.sizeof]); } /// void clear() { _heap_used = 0; } } BioD-0.1.0/bio/core/utils/range.d000066400000000000000000000165021273003163100164270ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.utils.range; import bio.core.utils.roundbuf; import std.range; import std.exception; import std.algorithm; import std.parallelism; import std.functional; import std.array; /// Keeps a cyclic buffer of size $(D amount) /// which is filled at the construction. /// After that, each popFront() is accompanied /// by fetching next element from the original range. /// /// The function is useful when, for instance, range of Tasks /// is being decorated, because it allows to keep a certain amount /// of them being executed simultaneously, utilizing all /// CPU cores. auto prefetch(Range)(Range r, size_t amount) { enforce(amount > 0, "Amount of elements to prefetch must be positive"); struct Result { alias ElementType!Range E; this(Range range, size_t amount) { _roundbuf = RoundBuf!E(amount); _range = range; foreach (i; 0 .. amount) { if (_range.empty) { break; } _roundbuf.put(_range.front); _range.popFront(); } } bool empty() @property { return _range.empty && _roundbuf.empty; } auto ref front() @property { return _roundbuf.front; } void popFront() @property { assert(!_roundbuf.empty); if (_range.empty) { _roundbuf.popFront(); return; } _roundbuf.popFront(); _roundbuf.put(_range.front); _range.popFront(); } private: Range _range; RoundBuf!E _roundbuf; } return Result(r, amount); } /// struct Cached(R) { private { alias ElementType!R E; R _range; E _front; bool _empty; } this(R range) { _range = range; popFront(); } auto front() { return _front; } bool empty() { return _empty; } void popFront() { if (_range.empty) { _empty = true; } else { _front = _range.front; _range.popFront(); } } } /// Caches front element. auto cached(R)(R range) { return Cached!R(range); } unittest { import std.algorithm; ubyte[] emptyrange = []; assert(equal(emptyrange, prefetch(emptyrange, 42))); auto range = [1, 2, 3, 4, 5]; assert(equal(range, prefetch(range, 1))); assert(equal(range, prefetch(range, 3))); assert(equal(range, prefetch(range, 5))); assert(equal(range, prefetch(range, 7))); assert(equal(range, cached(range))); } /// Takes arbitrary input range as an input and returns /// another range which produces arrays of original elements /// of size $(D chunk_size). /// /// Useful for setting granularity in parallel applications. /// $(D std.algorithm.joiner) composed with $(D chunked) /// produces same elements as were in the original range. /// /// The difference from $(D std.range.chunks) is that /// any input range is allowed, no slicing or length is required. /// The cost is memory allocations for chunks. auto chunked(R)(R range, uint chunk_size) { alias ElementType!R E; struct Result { this(R range, uint chunk_size) { enforce(chunk_size > 0); this.range = range; this.chunk_size = chunk_size; fillBuffer(); } bool empty() @property { return buffer.length == 0; } E[] front() @property { return buffer; } void popFront() { fillBuffer(); } private: R range; uint chunk_size; E[] buffer; void fillBuffer() { buffer = uninitializedArray!(E[])(chunk_size); for (auto i = 0; i < chunk_size; i++) { if (range.empty) { buffer.length = i; break; } buffer[i] = range.front; range.popFront(); } } } return Result(range, chunk_size); } unittest { import std.algorithm; assert(equal(chunked(iota(1, 6), 2), [[1, 2], [3, 4], [5]])); assert(equal(chunked(iota(1, 7), 2), [[1, 2], [3, 4], [5, 6]])); assert(equal(chunked([1], 10), [[1]])); assert(equal(chunked(iota(1, 10), 7), [[1, 2, 3, 4, 5, 6, 7], [8,9]])); auto r = iota(25); assert(equal(joiner(chunked(r, 7)), r)); } /// Version of parallel map using cyclic buffer with prefetching. /// Uses combination of chunked, prefetch, joiner, and std.parallelism. /// /// The analogue in Haskell is Control.Parallel.Strategies.parBuffer /// /// Params: /// prefetch_amount - how many chunks will be prefetched /// chunk_size - the maximum size of each chunk auto parallelTransform(alias func, Range)(Range r, uint chunk_size=1, uint prefetch_amount=totalCPUs-1) { alias ElementType!Range E; static auto createTask(E[] elements) { auto task = task!(pipe!(map!(unaryFun!func), array))(elements); taskPool.put(task); return task; } if (prefetch_amount == 0) { prefetch_amount = 1; } auto chunks = chunked(r, chunk_size); auto tasks = map!createTask(chunks); auto prefetched = prefetch(tasks, prefetch_amount); return joiner(map!"a.yieldForce()"(prefetched)); } unittest { auto range = iota(100); assert(equal(parallelTransform!"a * a"(range), map!"a * a"(range))); } struct PrefixSum(S) { private { S _sequence; ElementType!S _sum; } this(S sequence) { _sequence = sequence; if (!_sequence.empty) { _sum = _sequence.front; } } bool empty() @property { return _sequence.empty; } ElementType!S front() @property { return _sum; } void popFront() { _sequence.popFront(); if (!_sequence.empty) { _sum += _sequence.front; } } } /// Prefix sum. PrefixSum!S prefixSum(S)(S sequence) { return PrefixSum!S(sequence); } unittest { auto range = iota(5); assert(equal(prefixSum(range), [0, 1, 3, 6, 10])); } BioD-0.1.0/bio/core/utils/roundbuf.d000066400000000000000000000052151273003163100171560ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.utils.roundbuf; import std.exception; /// Cyclic buffer struct RoundBuf(T) { private { T[] _items = void; size_t _put; size_t _taken; } /** initializes round buffer of size $(D n) */ this(size_t n) { _items = new T[n]; } /// Input range primitives bool empty() @property const { return _put == _taken; } /// ditto auto ref front() @property { enforce(!empty, "buffer is empty"); return _items[_taken % $]; } /// ditto void popFront() { ++_taken; } /// auto ref back() @property { enforce(!empty, "buffer is empty"); return _items[(_put - 1) % $]; } /// Output range primitive void put(T item) { enforce(!full, "buffer is full"); _items[_put % $] = item; ++_put; } /// Check if buffer is full bool full() @property const { return _put == _taken + _items.length; } /// Current number of elements size_t length() @property const { return _put - _taken; } } unittest { auto buf = RoundBuf!int(4); assert(buf.empty); buf.put(1); buf.put(2); assert(buf.length == 2); assert(buf.front == 1); buf.popFront(); buf.put(1); buf.put(0); buf.put(3); assert(buf.full); buf.popFront(); buf.put(4); buf.popFront(); buf.popFront(); assert(buf.front == 3); buf.popFront(); assert(buf.front == 4); } BioD-0.1.0/bio/core/utils/stream.d000066400000000000000000000130361273003163100166250ustar00rootroot00000000000000module bio.core.utils.stream; public import std.stream; import core.stdc.stdio; import core.stdc.errno; import core.stdc.string; import core.sys.posix.sys.select; import std.conv; import std.string : toStringz; version(Posix){ private import core.sys.posix.unistd; } version(Windows) { private import std.file; private import std.utf; private import std.c.windows.windows; extern (Windows) { DWORD GetFileType(HANDLE hFile); } } FileMode toFileMode(string mode) { FileMode result = FileMode.In; switch (mode) { case "r", "rb": result = FileMode.In; // 1000 break; case "r+", "r+b", "rb+": result = FileMode.In | FileMode.Out; // 1100 case "w", "wb": result = FileMode.OutNew; // 0110 break; case "w+", "w+b", "wb+": result = FileMode.In | FileMode.OutNew; // 1110 break; case "a", "ab": result = FileMode.Append; // 0001 break; case "a+", "a+b", "ab+": result = FileMode.In | FileMode.Append; // 1001 break; default: break; } return result; } final class File: std.stream.File { this(string filename, string mode="rb") { version (Posix) { // Issue 8528 workaround auto file = fopen(toStringz(filename), toStringz(mode)); if (file == null) { throw new OpenException(cast(string) ("Cannot open or create file '" ~ filename ~ "' : ") ~ to!string(strerror(errno))); } super(core.stdc.stdio.fileno(file), toFileMode(mode)); } version (Windows) { int access, share, createMode; auto mode_flags = toFileMode(mode); share |= FILE_SHARE_READ | FILE_SHARE_WRITE; if (mode_flags & FileMode.In) { access |= GENERIC_READ; createMode = OPEN_EXISTING; } if (mode_flags & FileMode.Out) { access |= GENERIC_WRITE; createMode = OPEN_ALWAYS; } if ((mode_flags & FileMode.OutNew) == FileMode.OutNew) { createMode = CREATE_ALWAYS; } auto handle = CreateFileW(std.utf.toUTF16z(filename), access, share, null, createMode, 0, null); isopen = handle != INVALID_HANDLE_VALUE; if (!isopen) { throw new OpenException(cast(string) ("Cannot open or create file '" ~ filename ~ "'")); } super(handle, toFileMode(mode)); } } override ulong seek(long offset, SeekPos rel) { assertSeekable(); auto hFile = handle(); version (Windows) { int hi = cast(int)(offset>>32); uint low = SetFilePointer(hFile, cast(int)offset, &hi, rel); if ((low == INVALID_SET_FILE_POINTER) && (GetLastError() != 0)) throw new SeekException("unable to move file pointer"); ulong result = (cast(ulong)hi << 32) + low; } else version (Posix) { // Phobos casts offset to int, leading to throwing an exception // on large files auto result = lseek(hFile, cast(off_t)offset, rel); if (result == cast(typeof(result))-1) throw new SeekException("unable to move file pointer"); } readEOF = false; return cast(ulong)result; } override size_t readBlock(void* buffer, size_t size) { assertReadable(); auto hFile = handle(); version (Windows) { auto dwSize = to!DWORD(size); ReadFile(hFile, buffer, dwSize, &dwSize, null); size = dwSize; } else version (Posix) { // http://developerweb.net/viewtopic.php?id=4267 fd_set rset; timeval timeout; immutable MAX_IDLE_SECS = 1; while (true) { auto ret = core.sys.posix.unistd.read(hFile, buffer, size); if (ret == -1) { if (errno == EINTR) continue; if (errno == EAGAIN || errno == EWOULDBLOCK) { FD_ZERO(&rset); FD_SET(hFile, &rset); timeout.tv_sec = MAX_IDLE_SECS; timeout.tv_usec = 0; ret = select(hFile + 1, &rset, null, null, &timeout); if (ret <= 0) { size = 0; throw new ReadException("read timeout"); break; } } else { throw new ReadException(to!string(strerror(errno))); } } else { size = ret; break; } } } readEOF = (size == 0); return size; } override size_t writeBlock(const void* buffer, size_t size) { assertWriteable(); auto hFile = handle(); version (Windows) { auto dwSize = to!DWORD(size); WriteFile(hFile, buffer, dwSize, &dwSize, null); size = dwSize; } else version (Posix) { size = core.sys.posix.unistd.write(hFile, buffer, size); if (size == -1) throw new WriteException(to!string(strerror(errno))); } return size; } } BioD-0.1.0/bio/core/utils/switchendianness.d000066400000000000000000000021771273003163100207070ustar00rootroot00000000000000/** (Almost) a copy-paste from std/stream.d */ module bio.core.utils.switchendianness; import core.bitop; /*** * Switches the byte order of buffer. * $(D size) must be even. */ void switchEndianness(const(void)* buffer, size_t size) in { assert((size & 1) == 0); } body { ubyte* startb = cast(ubyte*)buffer; uint* start = cast(uint*)buffer; switch (size) { case 0: break; case 2: { ubyte x = *startb; *startb = *(startb+1); *(startb+1) = x; break; } case 4: { *start = bswap(*start); break; } default: { uint* end = cast(uint*)(buffer + size - uint.sizeof); while (start < end) { uint x = bswap(*start); *start = bswap(*end); *end = x; ++start; --end; } startb = cast(ubyte*)start; ubyte* endb = cast(ubyte*)end; auto len = uint.sizeof - (startb - endb); if (len > 0) { switchEndianness(startb,len); } } } } BioD-0.1.0/bio/core/utils/tmpfile.d000066400000000000000000000007521273003163100167730ustar00rootroot00000000000000module bio.core.utils.tmpfile; import std.path; import std.process; /// Absolute path of temporary file. /// /// Params: /// filename - base name /// tmpdir - temporary directory /// string tmpFile(string filename, string tmpdir=null) { if (tmpdir != null) { return buildPath(tmpdir, filename); } version(Windows) return buildPath(std.process.getenv("TEMP"), filename); else version(Posix) return "/tmp/" ~ filename; } BioD-0.1.0/bio/core/utils/zlib.d000066400000000000000000000203761273003163100162770ustar00rootroot00000000000000// minimized version of etc.c.zlib module bio.core.utils.zlib; import core.stdc.config; extern (C) { const char[] ZLIB_VERSION = "1.2.3"; const ZLIB_VERNUM = 0x1230; alias void* function (void* opaque, uint items, uint size) alloc_func; alias void function (void* opaque, void* address) free_func; struct z_stream { ubyte *next_in; /* next input byte */ uint avail_in; /* number of bytes available at next_in */ c_ulong total_in; /* total nb of input bytes read so far */ ubyte *next_out; /* next output byte should be put there */ uint avail_out; /* remaining free space at next_out */ c_ulong total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ void* state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ void* opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: binary or text */ c_ulong adler; /* adler32 value of the uncompressed data */ c_ulong reserved; /* reserved for future use */ } alias z_stream* z_streamp; /* gzip header information passed to and from zlib routines. See RFC 1952 for more details on the meanings of these fields. */ struct gz_header { int text; /* true if compressed data believed to be text */ c_ulong time; /* modification time */ int xflags; /* extra flags (not used when writing a gzip file) */ int os; /* operating system */ byte *extra; /* pointer to extra field or Z_NULL if none */ uint extra_len; /* extra field length (valid if extra != Z_NULL) */ uint extra_max; /* space at extra (only when reading header) */ byte *name; /* pointer to zero-terminated file name or Z_NULL */ uint name_max; /* space at name (only when reading header) */ byte *comment; /* pointer to zero-terminated comment or Z_NULL */ uint comm_max; /* space at comment (only when reading header) */ int hcrc; /* true if there was or will be a header crc */ int done; /* true when done reading gzip header (not used when writing a gzip file) */ } alias gz_header* gz_headerp; /* constants */ enum { Z_NO_FLUSH = 0, Z_PARTIAL_FLUSH = 1, /* will be removed, use Z_SYNC_FLUSH instead */ Z_SYNC_FLUSH = 2, Z_FULL_FLUSH = 3, Z_FINISH = 4, Z_BLOCK = 5, Z_TREES = 6, } /* Allowed flush values; see deflate() and inflate() below for details */ enum { Z_OK = 0, Z_STREAM_END = 1, Z_NEED_DICT = 2, Z_ERRNO = -1, Z_STREAM_ERROR = -2, Z_DATA_ERROR = -3, Z_MEM_ERROR = -4, Z_BUF_ERROR = -5, Z_VERSION_ERROR = -6, } /* Return codes for the compression/decompression functions. Negative * values are errors, positive values are used for special but normal events. */ enum { Z_NO_COMPRESSION = 0, Z_BEST_SPEED = 1, Z_BEST_COMPRESSION = 9, Z_DEFAULT_COMPRESSION = -1, } /* compression levels */ enum { Z_FILTERED = 1, Z_HUFFMAN_ONLY = 2, Z_RLE = 3, Z_FIXED = 4, Z_DEFAULT_STRATEGY = 0, } /* compression strategy; see deflateInit2() below for details */ enum { Z_BINARY = 0, Z_TEXT = 1, Z_UNKNOWN = 2, Z_ASCII = Z_TEXT } /* Possible values of the data_type field (though see inflate()) */ enum { Z_DEFLATED = 8, } /* The deflate compression method (the only one supported in this version) */ const int Z_NULL = 0; /* for initializing zalloc, zfree, opaque */ /* basic functions */ char* zlibVersion(); int deflateInit(z_streamp strm, int level) { return deflateInit_(strm, level, ZLIB_VERSION.ptr, z_stream.sizeof); } int deflate(z_streamp strm, int flush); int deflateEnd(z_streamp strm); int inflateInit(z_streamp strm) { return inflateInit_(strm, ZLIB_VERSION.ptr, z_stream.sizeof); } int inflate(z_streamp strm, int flush); int inflateEnd(z_streamp strm); int deflateInit2(z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy) { return deflateInit2_(strm, level, method, windowBits, memLevel, strategy, ZLIB_VERSION.ptr, z_stream.sizeof); } int deflateBound(z_streamp strm, size_t sourceLen); int inflateInit2(z_streamp strm, int windowBits) { return inflateInit2_(strm, windowBits, ZLIB_VERSION.ptr, z_stream.sizeof); } int compress(ubyte* dest, size_t* destLen, ubyte* source, size_t sourceLen); int compress2(ubyte* dest, size_t* destLen, ubyte* source, size_t sourceLen, int level); size_t compressBound(size_t sourceLen); int uncompress(ubyte* dest, size_t* destLen, ubyte* source, size_t sourceLen); alias void* gzFile; alias int z_off_t; // file offset gzFile gzopen(char* path, char* mode); gzFile gzdopen(int fd, char* mode); int gzsetparams(gzFile file, int level, int strategy); int gzread(gzFile file, void* buf, uint len); int gzwrite(gzFile file, void* buf, uint len); int gzprintf(gzFile file, char* format, ...); int gzputs(gzFile file, char* s); char* gzgets(gzFile file, char* buf, int len); int gzputc(gzFile file, int c); int gzgetc(gzFile file); int gzungetc(int c, gzFile file); int gzflush(gzFile file, int flush); z_off_t gzseek(gzFile file, z_off_t offset, int whence); int gzrewind(gzFile file); z_off_t gztell(gzFile file); int gzeof(gzFile file); int gzdirect(gzFile file); int gzclose(gzFile file); char* gzerror(gzFile file, int *errnum); void gzclearerr (gzFile file); uint adler32 (uint adler, ubyte *buf, uint len); uint adler32_combine(uint adler1, uint adler2, z_off_t len2); uint crc32(uint crc, ubyte *buf, uint len); uint crc32_combine (uint crc1, uint crc2, z_off_t len2); int deflateInit_(z_streamp strm, int level, const char* versionx, int stream_size); int inflateInit_(z_streamp strm, const char* versionx, int stream_size); int deflateInit2_(z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char* versionx, int stream_size); int inflateBackInit_(z_stream* strm, int windowBits, ubyte* window, const char* z_version, int stream_size); int inflateInit2_(z_streamp strm, int windowBits, const char* versionx, int stream_size); char* zError(int err); int inflateSyncPoint(z_streamp z); uint* get_crc_table(); } class ZlibException : Exception { this(int errnum) { auto msg = "[zlib] " ~ messageFromErrnum(errnum); super(msg); } this(string func, int errnum) { auto msg = "[zlib/" ~ func ~ "] " ~ messageFromErrnum(errnum); super(msg); } private string messageFromErrnum(int errnum) { switch (errnum) { case Z_STREAM_END: msg = "stream end"; break; case Z_NEED_DICT: msg = "need dict"; break; case Z_ERRNO: msg = "errno"; break; case Z_STREAM_ERROR: msg = "stream error"; break; case Z_DATA_ERROR: msg = "data error"; break; case Z_MEM_ERROR: msg = "mem error"; break; case Z_BUF_ERROR: msg = "buf error"; break; case Z_VERSION_ERROR: msg = "version error"; break; default: msg = "unknown error"; break; } return msg; } } uint crc32(uint crc, const(void)[] buf) { return crc32(crc, cast(ubyte *)buf.ptr, cast(uint)(buf.length)); } BioD-0.1.0/bio/maf/000077500000000000000000000000001273003163100136355ustar00rootroot00000000000000BioD-0.1.0/bio/maf/block.d000066400000000000000000000034351273003163100151010ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.maf.block; /// struct MafSequence { /// size_t size; /// size_t start; /// string source; /// char strand; /// size_t source_size; /// string text; /// char left_status = '.'; /// size_t left_count; /// char right_status = '.'; /// size_t right_count; /// bool empty() @property { return empty_status != '.'; } /// char empty_status = '.'; /// string quality; } /// struct MafBlock { /// MafSequence[] sequences; /// double score = double.nan; /// uint pass = 0; } BioD-0.1.0/bio/maf/parser.d000066400000000000000000000566471273003163100153200ustar00rootroot00000000000000module bio.maf.parser; #line 1 "maf_block.rl" /* This file is part of BioD. Copyright (C) 2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import std.conv, std.array; import bio.maf.block; #line 27 "maf_block.d" static byte[] _maf_block_actions = [ 0, 1, 1, 1, 2, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 1, 12, 1, 14, 1, 16, 1, 17, 1, 18, 1, 19, 1, 20, 1, 21, 1, 22, 2, 0, 1, 2, 3, 4, 2, 7, 13, 2, 15, 12 ]; static short[] _maf_block_key_offsets = [ 0, 0, 1, 5, 11, 20, 23, 26, 29, 34, 39, 44, 49, 54, 57, 62, 67, 74, 77, 80, 83, 92, 95, 100, 105, 114, 117, 122, 127, 132, 137, 142, 147, 152, 157, 162, 167, 172, 177, 182, 187, 192, 197, 202, 205, 208, 211, 214, 221, 224, 227, 230, 235, 240, 245, 250, 255, 258, 263, 268, 271, 276, 281, 286, 291, 296, 301, 306, 311, 316, 321, 326, 331, 336, 341, 346, 351, 354, 359, 364, 369, 374, 379, 384, 389, 394, 399, 404, 409, 414, 419, 424, 429, 434, 437, 442, 447, 452, 457, 462, 467, 472, 477, 482, 487, 492, 497, 502, 507, 512, 517, 520, 525, 530, 535, 540, 545, 550, 555, 560, 565, 570, 575, 580, 585, 590, 595, 600, 603, 608, 613, 618, 623, 628, 633, 638, 643, 648, 653, 658, 663, 668, 673, 678, 683, 686, 691, 696, 701, 706, 711, 716, 721, 726, 731, 736, 741, 746, 751, 756, 761, 766, 769, 770, 771, 772, 773, 775, 781, 787, 793, 799, 805, 811, 817, 823, 829, 835, 841, 847, 853, 859, 865, 871, 877, 881, 885, 886, 887, 888, 889, 896, 900, 902, 910, 914, 916, 922, 931, 932, 933, 937, 938, 939, 940, 944, 948, 956, 962, 968, 974, 980, 986, 992, 998, 1004, 1010, 1016, 1022, 1028, 1034, 1040, 1046, 1052, 1058, 1062, 1070 ]; static char[] _maf_block_trans_keys = [ 97u, 10u, 32u, 9u, 13u, 10u, 32u, 112u, 115u, 9u, 13u, 10u, 32u, 101u, 105u, 112u, 113u, 115u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 43u, 45u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 67u, 73u, 77u, 110u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 32u, 67u, 73u, 84u, 110u, 9u, 13u, 77u, 78u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 67u, 73u, 84u, 110u, 9u, 13u, 77u, 78u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 32u, 45u, 70u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 43u, 45u, 9u, 13u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 48u, 57u, 32u, 9u, 13u, 97u, 115u, 115u, 61u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 32u, 99u, 9u, 13u, 111u, 114u, 101u, 61u, 43u, 45u, 46u, 105u, 110u, 48u, 57u, 46u, 105u, 48u, 57u, 48u, 57u, 10u, 32u, 69u, 101u, 9u, 13u, 48u, 57u, 43u, 45u, 48u, 57u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 46u, 69u, 101u, 9u, 13u, 48u, 57u, 110u, 102u, 10u, 32u, 9u, 13u, 97u, 110u, 99u, 10u, 32u, 9u, 13u, 10u, 32u, 9u, 13u, 10u, 32u, 101u, 105u, 113u, 115u, 9u, 13u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 10u, 32u, 45u, 70u, 9u, 13u, 48u, 57u, 10u, 32u, 9u, 13u, 0 ]; static byte[] _maf_block_single_lengths = [ 0, 1, 2, 4, 7, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 5, 1, 1, 1, 5, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 5, 2, 0, 4, 2, 0, 2, 5, 1, 1, 2, 1, 1, 1, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2 ]; static byte[] _maf_block_range_lengths = [ 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 1, 1, 1, 2, 1, 1, 2, 2, 0, 0, 1, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1 ]; static short[] _maf_block_index_offsets = [ 0, 0, 2, 6, 12, 21, 24, 27, 30, 34, 38, 42, 46, 51, 54, 58, 62, 69, 72, 75, 78, 86, 89, 93, 97, 105, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 148, 152, 156, 160, 164, 168, 172, 176, 179, 182, 185, 188, 194, 197, 200, 203, 207, 211, 215, 219, 224, 227, 231, 235, 238, 242, 246, 250, 254, 258, 262, 266, 270, 274, 278, 282, 286, 290, 294, 298, 302, 305, 309, 313, 317, 321, 325, 329, 333, 337, 341, 345, 349, 353, 357, 361, 365, 369, 372, 376, 380, 384, 388, 392, 396, 400, 404, 408, 412, 416, 420, 424, 428, 432, 436, 439, 443, 447, 451, 455, 459, 463, 467, 471, 475, 479, 483, 487, 491, 495, 499, 503, 506, 510, 514, 518, 522, 526, 530, 534, 538, 542, 546, 550, 554, 558, 562, 566, 570, 573, 577, 581, 585, 589, 593, 597, 601, 605, 609, 613, 617, 621, 625, 629, 633, 637, 640, 642, 644, 646, 648, 650, 655, 660, 665, 670, 675, 680, 685, 690, 695, 700, 705, 710, 715, 720, 725, 730, 735, 739, 743, 745, 747, 749, 751, 758, 762, 764, 771, 775, 777, 782, 790, 792, 794, 798, 800, 802, 804, 808, 812, 820, 825, 830, 835, 840, 845, 850, 855, 860, 865, 870, 875, 880, 885, 890, 895, 900, 905, 909, 916 ]; static ubyte[] _maf_block_trans_targs = [ 2, 0, 4, 3, 3, 0, 4, 3, 162, 203, 3, 0, 4, 3, 5, 17, 162, 44, 185, 3, 0, 6, 6, 0, 6, 6, 7, 8, 8, 7, 8, 8, 9, 0, 10, 10, 145, 0, 10, 10, 11, 0, 12, 12, 128, 0, 12, 13, 13, 12, 0, 14, 14, 0, 14, 14, 15, 0, 16, 16, 111, 0, 16, 204, 204, 204, 204, 16, 0, 18, 18, 0, 18, 18, 19, 20, 20, 19, 20, 21, 21, 21, 21, 20, 21, 0, 22, 22, 0, 22, 22, 23, 0, 24, 24, 27, 0, 24, 25, 25, 25, 25, 24, 25, 0, 26, 26, 0, 26, 26, 207, 0, 24, 24, 28, 0, 24, 24, 29, 0, 24, 24, 30, 0, 24, 24, 31, 0, 24, 24, 32, 0, 24, 24, 33, 0, 24, 24, 34, 0, 24, 24, 35, 0, 24, 24, 36, 0, 24, 24, 37, 0, 24, 24, 38, 0, 24, 24, 39, 0, 24, 24, 40, 0, 24, 24, 41, 0, 24, 24, 42, 0, 24, 24, 43, 0, 24, 24, 0, 45, 45, 0, 45, 45, 46, 47, 47, 46, 47, 225, 225, 47, 225, 0, 49, 49, 0, 49, 49, 50, 51, 51, 50, 51, 51, 52, 0, 53, 53, 94, 0, 53, 53, 54, 0, 55, 55, 77, 0, 55, 56, 56, 55, 0, 57, 57, 0, 57, 57, 58, 0, 59, 59, 60, 0, 59, 59, 226, 59, 59, 61, 0, 59, 59, 62, 0, 59, 59, 63, 0, 59, 59, 64, 0, 59, 59, 65, 0, 59, 59, 66, 0, 59, 59, 67, 0, 59, 59, 68, 0, 59, 59, 69, 0, 59, 59, 70, 0, 59, 59, 71, 0, 59, 59, 72, 0, 59, 59, 73, 0, 59, 59, 74, 0, 59, 59, 75, 0, 59, 59, 76, 0, 59, 59, 0, 55, 55, 78, 0, 55, 55, 79, 0, 55, 55, 80, 0, 55, 55, 81, 0, 55, 55, 82, 0, 55, 55, 83, 0, 55, 55, 84, 0, 55, 55, 85, 0, 55, 55, 86, 0, 55, 55, 87, 0, 55, 55, 88, 0, 55, 55, 89, 0, 55, 55, 90, 0, 55, 55, 91, 0, 55, 55, 92, 0, 55, 55, 93, 0, 55, 55, 0, 53, 53, 95, 0, 53, 53, 96, 0, 53, 53, 97, 0, 53, 53, 98, 0, 53, 53, 99, 0, 53, 53, 100, 0, 53, 53, 101, 0, 53, 53, 102, 0, 53, 53, 103, 0, 53, 53, 104, 0, 53, 53, 105, 0, 53, 53, 106, 0, 53, 53, 107, 0, 53, 53, 108, 0, 53, 53, 109, 0, 53, 53, 110, 0, 53, 53, 0, 16, 16, 112, 0, 16, 16, 113, 0, 16, 16, 114, 0, 16, 16, 115, 0, 16, 16, 116, 0, 16, 16, 117, 0, 16, 16, 118, 0, 16, 16, 119, 0, 16, 16, 120, 0, 16, 16, 121, 0, 16, 16, 122, 0, 16, 16, 123, 0, 16, 16, 124, 0, 16, 16, 125, 0, 16, 16, 126, 0, 16, 16, 127, 0, 16, 16, 0, 12, 12, 129, 0, 12, 12, 130, 0, 12, 12, 131, 0, 12, 12, 132, 0, 12, 12, 133, 0, 12, 12, 134, 0, 12, 12, 135, 0, 12, 12, 136, 0, 12, 12, 137, 0, 12, 12, 138, 0, 12, 12, 139, 0, 12, 12, 140, 0, 12, 12, 141, 0, 12, 12, 142, 0, 12, 12, 143, 0, 12, 12, 144, 0, 12, 12, 0, 10, 10, 146, 0, 10, 10, 147, 0, 10, 10, 148, 0, 10, 10, 149, 0, 10, 10, 150, 0, 10, 10, 151, 0, 10, 10, 152, 0, 10, 10, 153, 0, 10, 10, 154, 0, 10, 10, 155, 0, 10, 10, 156, 0, 10, 10, 157, 0, 10, 10, 158, 0, 10, 10, 159, 0, 10, 10, 160, 0, 10, 10, 161, 0, 10, 10, 0, 163, 0, 164, 0, 165, 0, 166, 0, 167, 0, 4, 3, 3, 168, 0, 4, 3, 3, 169, 0, 4, 3, 3, 170, 0, 4, 3, 3, 171, 0, 4, 3, 3, 172, 0, 4, 3, 3, 173, 0, 4, 3, 3, 174, 0, 4, 3, 3, 175, 0, 4, 3, 3, 176, 0, 4, 3, 3, 177, 0, 4, 3, 3, 178, 0, 4, 3, 3, 179, 0, 4, 3, 3, 180, 0, 4, 3, 3, 181, 0, 4, 3, 3, 182, 0, 4, 3, 3, 183, 0, 4, 3, 3, 184, 0, 4, 3, 3, 0, 49, 186, 49, 0, 187, 0, 188, 0, 189, 0, 190, 0, 191, 191, 192, 198, 201, 197, 0, 192, 198, 197, 0, 193, 0, 4, 3, 194, 194, 3, 193, 0, 195, 195, 196, 0, 196, 0, 4, 3, 3, 196, 0, 4, 3, 192, 194, 194, 3, 197, 0, 199, 0, 200, 0, 4, 3, 3, 0, 202, 0, 200, 0, 186, 0, 206, 205, 205, 0, 206, 205, 205, 0, 206, 205, 5, 17, 44, 48, 205, 0, 206, 205, 205, 208, 0, 206, 205, 205, 209, 0, 206, 205, 205, 210, 0, 206, 205, 205, 211, 0, 206, 205, 205, 212, 0, 206, 205, 205, 213, 0, 206, 205, 205, 214, 0, 206, 205, 205, 215, 0, 206, 205, 205, 216, 0, 206, 205, 205, 217, 0, 206, 205, 205, 218, 0, 206, 205, 205, 219, 0, 206, 205, 205, 220, 0, 206, 205, 205, 221, 0, 206, 205, 205, 222, 0, 206, 205, 205, 223, 0, 206, 205, 205, 224, 0, 206, 205, 205, 0, 206, 205, 225, 225, 205, 225, 0, 206, 205, 205, 226, 0 ]; static byte[] _maf_block_trans_actions = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 37, 0, 11, 11, 1, 0, 0, 0, 37, 0, 13, 13, 1, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 37, 0, 17, 17, 1, 0, 0, 31, 31, 31, 31, 0, 0, 0, 0, 0, 0, 0, 7, 43, 43, 0, 0, 23, 23, 23, 23, 0, 23, 0, 0, 0, 0, 0, 0, 37, 0, 25, 25, 1, 0, 0, 27, 27, 27, 27, 0, 27, 0, 0, 0, 0, 0, 0, 37, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 1, 0, 25, 25, 0, 0, 0, 0, 0, 0, 7, 43, 43, 0, 0, 33, 33, 0, 33, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 37, 0, 11, 11, 1, 0, 0, 0, 37, 0, 13, 13, 1, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 37, 0, 17, 17, 1, 0, 0, 0, 21, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 1, 0, 17, 17, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 1, 0, 13, 13, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 1, 0, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 1, 0, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 40, 40, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, 0, 0, 40, 40, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 1, 0, 29, 29, 29, 0, 35, 35, 0, 0, 35, 0, 0, 46, 46, 46, 0, 0 ]; static byte[] _maf_block_eof_actions = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 35, 46 ]; static int maf_block_start = 1; static int maf_block_first_final = 204; static int maf_block_error = 0; static int maf_block_en_block = 1; #line 122 "maf_block.rl" MafBlock parseMafBlock(string line) { char* p = cast(char*)line.ptr; char* pe = p + line.length; char* eof = pe; int cs; int current_sign; int int_value; double float_value; size_t float_beg; MafBlock block; MafSequence sequence; auto sequences = Appender!(MafSequence[])(); size_t src_beg; size_t text_beg; size_t qual_beg; #line 604 "maf_block.d" { cs = maf_block_start; } #line 144 "maf_block.rl" #line 611 "maf_block.d" { int _klen; uint _trans; byte* _acts; uint _nacts; char* _keys; if ( p == pe ) goto _test_eof; if ( cs == 0 ) goto _out; _resume: _keys = &_maf_block_trans_keys[_maf_block_key_offsets[cs]]; _trans = _maf_block_index_offsets[cs]; _klen = _maf_block_single_lengths[cs]; if ( _klen > 0 ) { char* _lower = _keys; char* _mid; char* _upper = _keys + _klen - 1; while (1) { if ( _upper < _lower ) break; _mid = _lower + ((_upper-_lower) >> 1); if ( (*p) < *_mid ) _upper = _mid - 1; else if ( (*p) > *_mid ) _lower = _mid + 1; else { _trans += cast(uint)(_mid - _keys); goto _match; } } _keys += _klen; _trans += _klen; } _klen = _maf_block_range_lengths[cs]; if ( _klen > 0 ) { char* _lower = _keys; char* _mid; char* _upper = _keys + (_klen<<1) - 2; while (1) { if ( _upper < _lower ) break; _mid = _lower + (((_upper-_lower) >> 1) & ~1); if ( (*p) < _mid[0] ) _upper = _mid - 2; else if ( (*p) > _mid[1] ) _lower = _mid + 2; else { _trans += cast(uint)((_mid - _keys)>>1); goto _match; } } _trans += _klen; } _match: cs = _maf_block_trans_targs[_trans]; if ( _maf_block_trans_actions[_trans] == 0 ) goto _again; _acts = &_maf_block_actions[_maf_block_trans_actions[_trans]]; _nacts = cast(uint) *_acts++; while ( _nacts-- > 0 ) { switch ( *_acts++ ) { case 0: #line 28 "maf_block.rl" { int_value = 0; } break; case 1: #line 29 "maf_block.rl" { int_value *= 10; int_value += (*p) - '0'; } break; case 2: #line 37 "maf_block.rl" { float_beg = p - line.ptr; } break; case 3: #line 38 "maf_block.rl" { float_value = to!float(line[float_beg .. p - line.ptr]); } break; case 4: #line 46 "maf_block.rl" { block.score = float_value; } break; case 5: #line 47 "maf_block.rl" { block.pass = int_value; } break; case 6: #line 55 "maf_block.rl" { src_beg = p - line.ptr; } break; case 7: #line 56 "maf_block.rl" { sequence.source = line[src_beg .. p - line.ptr]; } break; case 8: #line 57 "maf_block.rl" { sequence.start = int_value; } break; case 9: #line 58 "maf_block.rl" { sequence.size = int_value; } break; case 10: #line 59 "maf_block.rl" { sequence.strand = (*p); } break; case 11: #line 60 "maf_block.rl" { sequence.source_size = int_value; } break; case 12: #line 61 "maf_block.rl" { sequences.put(sequence); sequence = MafSequence.init; } break; case 13: #line 62 "maf_block.rl" { assert(line[src_beg .. p - line.ptr] == sequences.data.back.source); } break; case 14: #line 70 "maf_block.rl" { text_beg = p - line.ptr; } break; case 15: #line 71 "maf_block.rl" { sequence.text = line[text_beg .. p - line.ptr]; } break; case 16: #line 82 "maf_block.rl" { sequences.data.back.left_status = (*p); } break; case 17: #line 83 "maf_block.rl" { sequences.data.back.left_count = int_value; } break; case 18: #line 84 "maf_block.rl" { sequences.data.back.right_status = (*p); } break; case 19: #line 85 "maf_block.rl" { sequences.data.back.right_count = int_value; } break; case 20: #line 99 "maf_block.rl" { sequence.empty_status = *p; } break; case 21: #line 110 "maf_block.rl" { qual_beg = p - line.ptr; } break; case 22: #line 111 "maf_block.rl" { sequences.data.back.quality = line[qual_beg .. p - line.ptr]; } break; #line 778 "maf_block.d" default: break; } } _again: if ( cs == 0 ) goto _out; if ( ++p != pe ) goto _resume; _test_eof: {} if ( p == eof ) { byte* __acts = &_maf_block_actions[_maf_block_eof_actions[cs]]; uint __nacts = cast(uint) *__acts++; while ( __nacts-- > 0 ) { switch ( *__acts++ ) { case 12: #line 61 "maf_block.rl" { sequences.put(sequence); sequence = MafSequence.init; } break; case 15: #line 71 "maf_block.rl" { sequence.text = line[text_beg .. p - line.ptr]; } break; case 19: #line 85 "maf_block.rl" { sequences.data.back.right_count = int_value; } break; case 22: #line 111 "maf_block.rl" { sequences.data.back.quality = line[qual_beg .. p - line.ptr]; } break; #line 811 "maf_block.d" default: break; } } } _out: {} } #line 145 "maf_block.rl" block.sequences = sequences.data; return block; } BioD-0.1.0/bio/maf/reader.d000066400000000000000000000052131273003163100152450ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.maf.reader; import bio.maf.block; import bio.maf.parser; import std.array; import std.string; import std.stdio; import std.algorithm; /// struct MafBlockRange { private { alias File.ByLine!(char, char) LineRange; File _f; LineRange _lines; bool _empty; MafBlock _front; void skipHeader() { if (!_lines.empty && _lines.front.startsWith("##maf")) _lines.popFront(); } } this(string fn) { _f = File(fn); _lines = _f.byLine(KeepTerminator.yes); skipHeader(); popFront(); } /// bool empty() @property const { return _empty; } /// MafBlock front() @property { return _front; } /// void popFront() { auto block_data = Appender!(char[])(); while (!_lines.empty && !_lines.front.chomp().empty) { block_data.put(_lines.front.dup); _lines.popFront(); } if (block_data.data.empty) { _empty = true; } else { _front = parseMafBlock(cast(string)(block_data.data)); if (!_lines.empty) _lines.popFront(); } } } /// class MafReader { private string _fn; /// this(string filename) { _fn = filename; } /// string filename() @property const { return _fn; } /// MafBlockRange blocks() @property { return MafBlockRange(_fn); } } BioD-0.1.0/bio/sam/000077500000000000000000000000001273003163100136525ustar00rootroot00000000000000BioD-0.1.0/bio/sam/header.d000066400000000000000000000620311273003163100152510ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2015 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.sam.header; import bio.bam.thirdparty.msgpack; import bio.core.utils.format; import std.algorithm; import std.conv; import std.format; import std.json; import std.exception; import std.array; import std.range; import std.traits; import std.stdio : stderr; private { struct Field(string _name, string _abbr, T = string) { enum name = _name; enum abbr = _abbr; alias T FieldType; } mixin template structFields(T...) { static if (!(T.length == 0)) { mixin(T[0].FieldType.stringof ~ " " ~ T[0].name ~ ";"); mixin structFields!(T[1..$]); } } string makeSwitchStatements(F...)() { /* certain assumptions about variable names are being made here, * namely, 'record' and 'contents' */ char[] result; foreach (t; F) { static if (t.FieldType.stringof == "string") result ~= `case "`~t.abbr~`":`~ `record.`~t.name~`=cast(string)(contents);`~ `break;`.dup; else result ~= `case "`~t.abbr~`":`~ `record.`~t.name~`=to!(`~t.FieldType.stringof~`)(contents);`~ `break;`.dup; } result ~= `default: break;`.dup; return cast(string)result; } auto fields(string header_line) { return splitter(header_line[3..$], '\t'); } /* generates 'parse' method which parses given string and fills corresponding struct fields */ mixin template parseStaticMethod(string struct_name, Field...) { static auto parse(string line) { mixin(struct_name ~ " record;"); foreach (field; fields(line)) { if (field.length < 3) { continue; } if (field[2] != ':') { continue; } string contents = field[3..$]; switch (field[0..2]) { mixin(makeSwitchStatements!Field()); } } return record; } } string serializeFields(Field...)() { static if (Field.length > 0) { char[] str = `if (`~Field[0].name~` != `~Field[0].FieldType.stringof~`.init) {`.dup; str ~= `sink.write("\t` ~ Field[0].abbr ~ `:");`.dup; str ~= `sink.write(`~Field[0].name~`);`.dup; str ~= `}`.dup; return str.idup ~ serializeFields!(Field[1..$])(); } else { return ""; } } /* generates 'toSam' method which converts a struct to SAM header line */ mixin template toSamMethod(string line_prefix, Field...) { void toSam(Sink)(auto ref Sink sink) const if (isSomeSink!Sink) { sink.write(line_prefix); mixin(serializeFields!Field()); } } string generateHashExpression(Field...)() { char[] res; foreach (t; Field) { res ~= "result = 31 * result + " ~ "typeid(" ~ t.name ~ ").getHash(&" ~ t.name ~ ");".dup; } return res.idup; } mixin template toHashMethod(string struct_name, string id_field, Field...) { static if (id_field != null) { hash_t toHash() const { hash_t result = 1; mixin(generateHashExpression!Field()); return result; } mixin("int opCmp(const ref " ~ struct_name ~ " other) " ~ " const pure nothrow @safe" ~ "{" ~ " return " ~ id_field ~ " < other." ~ id_field ~ " ? -1 : " ~ " " ~ id_field ~ " > other." ~ id_field ~ " ? 1 : 0;" ~ "}"); } } string opEqualsExpression(Field...)() { char[] result = Field[0].name ~ " == other.".dup ~ Field[0].name; foreach (t; Field[1..$]) { result ~= " && " ~ t.name ~ " == other.".dup ~ t.name; } return result.idup; } mixin template opEqualsMethod(string struct_name, Field...) { mixin("bool opEquals(const ref " ~ struct_name ~ " other)" ~ " pure const @safe nothrow" ~ "{" ~ " return " ~ opEqualsExpression!Field() ~ ";" ~ "}"); mixin("bool opEquals(" ~ struct_name ~ " other)" ~ " pure const @safe nothrow" ~ "{" ~ " return " ~ opEqualsExpression!Field() ~ ";" ~ "}"); } mixin template getSetIDMethods(string id_field) { static if (id_field != null) { auto getID() const pure nothrow @safe { mixin("return " ~ id_field ~";"); } mixin("void setID(typeof("~id_field~") id) pure nothrow @safe { " ~ id_field ~ " = id; }"); } } string generateToMsgpackMethod(Field...)() { char[] method = "packer.beginMap(" ~ to!string(Field.length) ~ ");".dup; foreach (t; Field) { method ~= "packer.pack(`" ~ t.abbr ~ "`);".dup; method ~= "packer.pack(" ~ t.name ~ ");".dup; } return method.idup; } mixin template toMsgpackMethod(Field...) { void toMsgpack(Packer)(ref Packer packer) const { mixin(generateToMsgpackMethod!Field()); } } mixin template HeaderLineStruct(string struct_name, string line_prefix, string id_field, Field...) { mixin(`struct `~struct_name~`{ mixin structFields!Field; mixin parseStaticMethod!(struct_name, Field); mixin toSamMethod!(line_prefix, Field); mixin toHashMethod!(struct_name, id_field, Field); mixin opEqualsMethod!(struct_name, Field); mixin getSetIDMethods!id_field; mixin toMsgpackMethod!Field; }`); } } mixin HeaderLineStruct!("HdLine", "@HD", null, Field!("format_version", "VN"), Field!("sorting_order", "SO")); mixin HeaderLineStruct!("SqLine", "@SQ", "name", Field!("name", "SN"), Field!("length", "LN", uint), Field!("assembly", "AS"), Field!("md5", "M5"), Field!("species", "SP"), Field!("uri", "UR")); mixin HeaderLineStruct!("RgLine", "@RG", "identifier", Field!("identifier", "ID"), Field!("sequencing_center", "CN"), Field!("description", "DS"), Field!("date", "DT"), Field!("flow_order", "FO"), Field!("key_sequence", "KS"), Field!("library", "LB"), Field!("programs", "PG"), Field!("predicted_insert_size", "PI", int), Field!("platform", "PL"), Field!("platform_unit", "PU"), Field!("sample", "SM")); mixin HeaderLineStruct!("PgLine", "@PG", "identifier", Field!("identifier", "ID"), Field!("name", "PN"), Field!("command_line", "CL"), Field!("previous_program", "PP"), Field!("program_version", "VN")); // version is a keyword in D unittest { import std.algorithm; import std.stdio; writeln("Testing @HD line parsing..."); auto hd_line = HdLine.parse("@HD\tVN:1.0\tSO:coordinate"); assert(hd_line.format_version == "1.0"); assert(hd_line.sorting_order == "coordinate"); writeln("Testing @SQ line parsing..."); auto sq_line = SqLine.parse("@SQ\tSN:NC_007605\tLN:171823\tM5:6743bd63b3ff2b5b8985d8933c53290a\tUR:ftp://.uk/vol1/ftp/technical/reference/phase2_reference_assembly_sequence/hs37d5.fa.gz\tAS:NCBI37\tSP:HUMAN"); assert(sq_line.name == "NC_007605"); assert(sq_line.length == 171823); assert(sq_line.md5 == "6743bd63b3ff2b5b8985d8933c53290a"); assert(sq_line.uri.endsWith("hs37d5.fa.gz")); assert(sq_line.assembly == "NCBI37"); assert(sq_line.species == "HUMAN"); writeln("Testing @RG line parsing..."); auto rg_line = RgLine.parse("@RG\tID:ERR016155\tLB:HUMgdtRAGDIAAPE\tSM:HG00125\tPI:488\tCN:BGI\tPL:ILLUMINA\tDS:SRP001294"); assert(rg_line.identifier == "ERR016155"); assert(rg_line.library == "HUMgdtRAGDIAAPE"); assert(rg_line.sample == "HG00125"); assert(rg_line.predicted_insert_size == 488); assert(rg_line.sequencing_center == "BGI"); assert(rg_line.platform == "ILLUMINA"); assert(rg_line.description == "SRP001294"); writeln("Testing @PG line parsing..."); auto pg_line = PgLine.parse("@PG\tID:bam_calculate_bq\tPN:samtools\tPP:bam_recalibrate_quality_scores\tVN:0.1.17 (r973:277)\tCL:samtools calmd -Erb $bam_file $reference_fasta > $bq_bam_file"); assert(pg_line.identifier == "bam_calculate_bq"); assert(pg_line.name == "samtools"); assert(pg_line.previous_program == "bam_recalibrate_quality_scores"); assert(pg_line.program_version == "0.1.17 (r973:277)"); assert(pg_line.command_line.endsWith("$bq_bam_file")); } // workaround for LDC bug #217 struct ValueRange(T) { this(T[string] dict, string[] ids) { _dict = dict; _ids = ids; } private { T[string] _dict; string[] _ids; } ref T front() @property { return _dict[_ids[0]]; } ref T back() @property { return _dict[_ids[$-1]]; } bool empty() @property { return _ids.length == 0; } void popFront() { _ids = _ids[1 .. $]; } void popBack() { _ids = _ids[0 .. $ - 1]; } ref T opIndex(size_t i) { return _dict[_ids[i]]; } size_t length() @property { return _ids.length; } ValueRange save() @property { return ValueRange(_dict, _ids[]); } } /// Common class for storing header lines class HeaderLineDictionary(T) { invariant() { assert(_index_to_id.length == _dict.length); assert(_id_to_index.length == _dict.length); /* foreach(id, index; _id_to_index) { assert(_index_to_id[index] == id); } */ } /// ref inout(T) opIndex(string id) inout { return _dict[id]; } /// void opIndexAssign(T line, string id) { _dict[id] = line; } /// const(T)* opIn_r(string id) const { return id in _dict; } /// Append a line bool add(T line) { auto id = line.getID(); if (id !in _dict) { _dict[id] = line; _id_to_index[id] = _index_to_id.length; _index_to_id ~= id; return true; } return false; } /// Remove a line with identifier $(D id). bool remove(string id) { if (id in _dict) { auto old_len = _dict.length; for (auto j = _id_to_index[id]; j < old_len - 1; ++j) { _index_to_id[j] = _index_to_id[j + 1]; _id_to_index[_index_to_id[j]] = j; } _index_to_id.length = _index_to_id.length - 1; _dict.remove(id); _id_to_index.remove(id); return true; } return false; } /// int opApply(scope int delegate(ref T line) dg) { foreach (size_t i; 0 .. _dict.length) { auto res = dg(_dict[_index_to_id[i]]); if (res != 0) { return res; } } return 0; } /// int opApply(scope int delegate(T line) dg) const { foreach (size_t i; 0 .. _dict.length) { auto res = dg(_dict[_index_to_id[i]]); if (res != 0) { return res; } } return 0; } /// int opApply(scope int delegate(ref size_t index, ref T line) dg) { foreach (size_t i; 0 .. _dict.length) { auto res = dg(i, _dict[_index_to_id[i]]); if (res != 0) { return res; } } return 0; } /// Clear the dictionary void clear() { _dict = null; _id_to_index = null; _index_to_id.length = 0; } static assert(isRandomAccessRange!(ValueRange!T)); /// Returns: range of lines ValueRange!T values() @property { return ValueRange!T(_dict, _index_to_id); } /// Returns: number of stored lines size_t length() @property const { return _dict.length; } protected { T[string] _dict; string[] _index_to_id; size_t[string] _id_to_index; } } /// Dictionary of @SQ lines. final class SqLineDictionary : HeaderLineDictionary!SqLine { /// ref inout(SqLine) getSequence(size_t index) inout { return _dict[_index_to_id[index]]; } /// int getSequenceIndex(string sequence_name) { size_t* ind = sequence_name in _id_to_index; return (ind is null) ? -1 : cast(int)(*ind); } } /// Dictionary of @RG lines alias HeaderLineDictionary!RgLine RgLineDictionary; /// Dictionary of @PG lines alias HeaderLineDictionary!PgLine PgLineDictionary; /// Represents SAM header class SamHeader { /// enum DEFAULT_FORMAT_VERSION = "1.3"; /// Construct empty SAM header this() { sequences = new SqLineDictionary(); read_groups = new RgLineDictionary(); programs = new PgLineDictionary(); format_version = DEFAULT_FORMAT_VERSION; } /// Parse SAM header given in plain text. this(string header_text) { read_groups = new RgLineDictionary(); programs = new PgLineDictionary(); format_version = DEFAULT_FORMAT_VERSION; import core.memory; core.memory.GC.disable(); bool parsed_first_line = false; size_t n_sq_lines = 0; foreach (line; splitter(header_text, '\n')) { if (line.length < 3) { continue; } if (!parsed_first_line && line[0..3] == "@HD") { auto header_line = HdLine.parse(line); if (header_line.sorting_order.length > 0) { try { sorting_order = to!SortingOrder(header_line.sorting_order); } catch (ConvException e) { sorting_order = SortingOrder.unknown; // FIXME: should we do that silently? } } else { sorting_order = SortingOrder.unknown; } format_version = header_line.format_version; } enforce(line[0] == '@', "Header lines must start with @"); switch (line[1]) { case 'S': enforce(line[2] == 'Q'); ++n_sq_lines; break; case 'R': enforce(line[2] == 'G'); auto rg_line = RgLine.parse(line); if (!read_groups.add(rg_line)) { stderr.writeln("duplicating @RG line ", rg_line.identifier); } break; case 'P': enforce(line[2] == 'G'); auto pg_line = PgLine.parse(line); if (!programs.add(pg_line)) { stderr.writeln("duplicating @PG line ", pg_line.identifier); } break; case 'H': enforce(line[2] == 'D'); break; case 'C': enforce(line[2] == 'O'); comments ~= line[4..$]; break; default: assert(0); } parsed_first_line = true; } if (!parsed_first_line) { format_version = DEFAULT_FORMAT_VERSION; } _header_text = header_text; if (n_sq_lines <= 1000000) _parseSqLines(); // parse immediately for typical files core.memory.GC.enable(); } /// Format version string format_version; /// Sorting order SortingOrder sorting_order = SortingOrder.unknown; /// Dictionary of @SQ lines. /// Removal is not allowed, you can only replace the whole dictionary. SqLineDictionary sequences() @property { if (_sequences is null) _parseSqLines(); return _sequences; } void sequences(SqLineDictionary dict) @property { _sequences = dict; } private SqLineDictionary _sequences; private string _header_text; private void _parseSqLines() { import core.memory; core.memory.GC.disable(); _sequences = new SqLineDictionary(); foreach (line; splitter(_header_text, '\n')) { if (line.length < 3) continue; if (line[0 .. 3] != "@SQ") continue; auto sq_line = SqLine.parse(line); if (!_sequences.add(sq_line)) { stderr.writeln("duplicating @SQ line ", sq_line.name); } } _header_text = null; core.memory.GC.enable(); } /// Dictionary of @RG lines RgLineDictionary read_groups; /// Dictionary of @PG lines PgLineDictionary programs; /// Array of @CO lines string[] comments; /// Zero-based index of sequence. /// If such sequence does not exist in the header, returns -1. int getSequenceIndex(string sequence_name) { return sequences.getSequenceIndex(sequence_name); } /// SqLine getSequence(size_t index) { return sequences.getSequence(index); } /// Get header text representation in SAM format (includes trailing '\n') string text() @property { return to!string(this); } /// Header text representation in SAM ("%s") or JSON format ("%j"). /// $(BR) /// Includes trailing '\n'. void toString(scope void delegate(const(char)[]) sink, FormatSpec!char fmt) { if (fmt.spec == 's') toSam(sink); else if (fmt.spec == 'j') toJson(sink); else throw new FormatException("unknown format specifier"); } void toSam(Sink)(auto ref Sink sink) if (isSomeSink!Sink) { sink.write("@HD\tVN:"); sink.write(format_version); if (sorting_order != SortingOrder.unknown) { sink.write("\tSO:"); sink.write(to!string(sorting_order)); } sink.write('\n'); for (size_t i = 0; i < sequences.length; i++) { auto sq_line = getSequence(i); sq_line.toSam(sink); sink.write('\n'); } foreach (rg_line; read_groups) { rg_line.toSam(sink); sink.write('\n'); } foreach (pg_line; programs) { pg_line.toSam(sink); sink.write('\n'); } foreach (comment; comments) { sink.write("@CO\t"); sink.write(comment); sink.write('\n'); } } void toJson(Sink)(auto ref Sink sink) if (isSomeSink!Sink) { JSONValue[string] result; result["format_version"].str = format_version; if (sorting_order != SortingOrder.unknown) { result["sorting_order"].str = sorting_order.to!string; } auto tmp = new JSONValue[sequences.length]; for (auto i = 0; i < sequences.length; i++) { auto line = getSequence(i); JSONValue[string] sq; sq["sequence_name"].str = line.name; sq["sequence_length"].uinteger = line.length; sq["assembly"].str = line.assembly; sq["md5"].str = line.md5; sq["species"].str = line.species; sq["uri"].str = line.uri; tmp[i].object = sq; } result["sq_lines"].array = tmp.dup; tmp.length = read_groups.length; size_t i = 0; foreach (line; read_groups) { JSONValue[string] sq; sq["identifier"].str = line.identifier; sq["sequencing_center"].str = line.sequencing_center; sq["description"].str = line.description; sq["date"].str = line.date; sq["flow_order"].str = line.flow_order; sq["key_sequence"].str = line.key_sequence; sq["library"].str = line.library; sq["programs"].str = line.programs; sq["predicted_insert_size"].integer = line.predicted_insert_size; sq["platform"].str = line.platform; sq["platform_unit"].str = line.platform_unit; sq["sample"].str = line.sample; tmp[i++].object = sq; } result["rg_lines"].array = tmp.dup; tmp.length = programs.length; i = 0; foreach (line; programs) { JSONValue[string] sq; sq["identifier"].str = line.identifier; sq["program_name"].str = line.name; sq["command_line"].str = line.command_line; sq["previous_program"].str = line.previous_program; sq["program_version"].str = line.program_version; tmp.array[i++].object = sq; } result["pg_lines"].array = tmp; JSONValue json; json.object = result; sink.write(toJSON(&json)); } /// Packs message in the following format: /// $(BR) /// MsgPack array with elements /// $(OL /// $(LI format version - string) /// $(LI sorting order - string) /// $(LI @SQ lines - array of dictionaries) /// $(LI @RG lines - array of dictionaries) /// $(LI @PG lines - array of dictionaries)) /// $(BR) /// Dictionary keys are the same as in SAM format. void toMsgpack(Packer)(ref Packer packer) const { enforce(_sequences !is null, "failed to call msgpack"); packer.beginArray(5); packer.pack(format_version); packer.pack(to!string(sorting_order)); packer.beginArray(_sequences.length); foreach (sq; _sequences) packer.pack(sq); packer.beginArray(read_groups.length); foreach (rg; read_groups) packer.pack(rg); packer.beginArray(programs.length); foreach (pg; programs) packer.pack(pg); } } /// Sorting order enum SortingOrder { unknown, /// unsorted, /// coordinate, /// queryname /// } unittest { auto header = new SamHeader(); import std.stdio; assert(header.text == "@HD\tVN:1.3\n"); auto sequence = SqLine("abc", 123123); header.sequences.add(sequence); assert(header.text == "@HD\tVN:1.3\n@SQ\tSN:abc\tLN:123123\n"); header.sorting_order = SortingOrder.coordinate; header.format_version = "1.2"; assert(header.text == "@HD\tVN:1.2\tSO:coordinate\n@SQ\tSN:abc\tLN:123123\n"); assert(header.getSequenceIndex("abc") == 0); assert(header.getSequenceIndex("bcd") == -1); header.sequences.clear(); sequence = SqLine("bcd", 678); sequence.uri = "http://lorem.ipsum"; header.sequences.add(sequence); header.format_version = "1.4"; assert(header.text == "@HD\tVN:1.4\tSO:coordinate\n@SQ\tSN:bcd\tLN:678\tUR:http://lorem.ipsum\n"); header.sequences.add(SqLine("def", 321)); assert(header.getSequenceIndex("abc") == -1); assert(header.getSequenceIndex("bcd") == 0); assert(header.getSequenceIndex("def") == 1); header.sequences.remove("bcd"); assert(header.getSequenceIndex("abc") == -1); assert(header.getSequenceIndex("bcd") == -1); assert(header.getSequenceIndex("def") == 0); assert(header.text == "@HD\tVN:1.4\tSO:coordinate\n@SQ\tSN:def\tLN:321\n"); auto dict = new SqLineDictionary(); dict.add(SqLine("yay", 111)); dict.add(SqLine("zzz", 222)); auto zzz = dict["zzz"]; // TODO: make 'dict["zzz"].uri = ...' work zzz.uri = "ftp://nyan.cat"; dict["zzz"] = zzz; header.sequences = dict; assert(header.text == "@HD\tVN:1.4\tSO:coordinate\n@SQ\tSN:yay\tLN:111\n@SQ\tSN:zzz\tLN:222\tUR:ftp://nyan.cat\n"); assert(header.sequences == dict); header.sequences.remove("yay"); header.sequences.remove("zzz"); header.comments ~= "this is a comment"; assert(header.text == "@HD\tVN:1.4\tSO:coordinate\n@CO\tthis is a comment\n"); } BioD-0.1.0/bio/sam/reader.d000066400000000000000000000146661273003163100152760ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012-2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.sam.reader; import bio.bam.abstractreader; import bio.sam.header; import bio.bam.read; import bio.bam.reference; import bio.bam.referenceinfo; import bio.core.utils.outbuffer; import bio.core.utils.range; import bio.core.utils.bylinefast; alias ByLineFast _LineRange; version(DigitalMars) { import bio.sam.utils.recordparser; } else { import bio.sam.utils.fastrecordparser; } import std.stdio; import std.array; import std.string; import std.range; import std.algorithm; import std.typecons; import std.parallelism; import std.process; import std.exception; import std.c.string; BamRead _parseSamRecord(Tuple!(char[], SamReader, OutBuffer) t) { auto r = parseAlignmentLine(cast(string)t[0], t[1]._header, t[2]); BamRead result; if (t[1]._seqprocmode) { result = r; } else { auto storage = uninitializedArray!(ubyte[])(r.raw_data.length); storage[] = r.raw_data[]; result.raw_data = storage; } result.associateWithReader(t[1]); return result; } private { extern(C) size_t lseek(int, size_t, int); bool isSeekable(ref File file) { return lseek(file.fileno(), 0, 0) != ~0; } } /// class SamReader : IBamSamReader { private { version(gzippedSamSupport) { void checkGunzip() { auto gunzip = executeShell("gunzip -V"); if (gunzip.status != 0) throw new Exception("gunzip is not installed on this system, can't read gzipped SAM"); } File openSamFile(string filename) { if (filename.length < 4) throw new Exception("invalid name for SAM file: " ~ filename); if (filename[$ - 3 .. $] == ".gz") { checkGunzip(); auto pipe = pipeShell("gunzip -c " ~ filename); return pipe.stdout; } else if (filename[$ - 4 .. $] == ".bam") { throw new Exception("SAM reader can't read BAM file " ~ filename); } else { return File(filename); } } } else { File openSamFile(string filename) { if (filename[$ - 4 .. $] == ".bam") { throw new Exception("SAM reader can't read BAM file " ~ filename); } else { return File(filename); } } } } /// this(string filename) { _file = openSamFile(filename); _filename = filename; _seekable = _file.isSeekable(); _initializeStream(); } /// bio.sam.header.SamHeader header() @property { return _header; } /// const(bio.bam.referenceinfo.ReferenceSequenceInfo)[] reference_sequences() @property const { return _reference_sequences; } /// bool hasReference(string reference) { return null != (reference in _reference_sequence_dict); } /// bio.bam.reference.ReferenceSequence opIndex(string ref_name) { enforce(hasReference(ref_name), "Reference with name " ~ ref_name ~ " is not present in the header"); auto ref_id = _reference_sequence_dict[ref_name]; return ReferenceSequence(null, ref_id, _reference_sequences[ref_id]); } /// Reads in SAM file. auto reads() @property { _LineRange lines = _lines; if (_seekable) { if (_filename !is null) { auto file = openSamFile(_filename); lines = ByLineFast(file); } else { _file.seek(0); lines = ByLineFast(_file); } auto dummy = lines.front; for (int i = 0; i < _lines_to_skip; i++) lines.popFront(); } auto b = new OutBuffer(262144); return lines.zip(repeat(this), repeat(b)).map!_parseSamRecord(); } /// void assumeSequentialProcessing() { _seqprocmode = true; } /// std.range.InputRange!(bio.bam.read.BamRead) allReads() @property { return inputRangeObject(reads); } /// Filename string filename() @property const { return _filename; } private: File _file; bool _seekable; string _filename; _LineRange _lines; ulong _lines_to_skip; bool _seqprocmode; SamHeader _header; ReferenceSequenceInfo[] _reference_sequences; int[string] _reference_sequence_dict; void _initializeStream() { auto header = Appender!(char[])(); _lines = ByLineFast(_file); while (!_lines.empty) { auto line = _lines.front; if (line.length > 0 && line[0] == '@') { header.put(line); header.put('\n'); _lines_to_skip += 1; _lines.popFront(); } else { break; } } import core.memory; GC.disable(); _header = new SamHeader(cast(string)(header.data)); GC.enable(); _reference_sequences = new ReferenceSequenceInfo[_header.sequences.length]; foreach (sq; _header.sequences) { auto seq = ReferenceSequenceInfo(sq.name, sq.length); auto n = cast(int)_reference_sequences.length; _reference_sequence_dict[sq.name] = n; _reference_sequences[_header.getSequenceIndex(seq.name)] = seq; } } } BioD-0.1.0/bio/sam/utils/000077500000000000000000000000001273003163100150125ustar00rootroot00000000000000BioD-0.1.0/bio/sam/utils/fastrecordparser.d000066400000000000000000003155721273003163100205450ustar00rootroot00000000000000module bio.sam.utils.fastrecordparser; #line 1 "sam_alignment.rl" /* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #line 28 "sam_alignment.d" static const int sam_alignment_start = 1; static const int sam_alignment_first_final = 191; static const int sam_alignment_error = 0; static const int sam_alignment_en_recover_from_invalid_qname = 169; static const int sam_alignment_en_recover_from_invalid_flag = 170; static const int sam_alignment_en_recover_from_invalid_rname = 171; static const int sam_alignment_en_recover_from_invalid_pos = 172; static const int sam_alignment_en_recover_from_invalid_mapq = 173; static const int sam_alignment_en_recover_from_invalid_cigar = 174; static const int sam_alignment_en_recover_from_invalid_rnext = 175; static const int sam_alignment_en_recover_from_invalid_pnext = 176; static const int sam_alignment_en_recover_from_invalid_tlen = 177; static const int sam_alignment_en_recover_from_invalid_seq = 178; static const int sam_alignment_en_recover_from_invalid_qual = 179; static const int sam_alignment_en_recover_from_invalid_tag = 180; static const int sam_alignment_en_alignment = 1; static const int sam_alignment_en_alignment_field_parsing_mandatoryfields_flag_parsing = 181; static const int sam_alignment_en_alignment_field_parsing_mandatoryfields_rname_parsing = 182; static const int sam_alignment_en_alignment_field_parsing_mandatoryfields_pos_parsing = 183; static const int sam_alignment_en_alignment_field_parsing_mandatoryfields_mapq_parsing = 184; static const int sam_alignment_en_alignment_field_parsing_mandatoryfields_cigar_parsing = 185; static const int sam_alignment_en_alignment_field_parsing_mandatoryfields_rnext_parsing = 186; static const int sam_alignment_en_alignment_field_parsing_mandatoryfields_pnext_parsing = 187; static const int sam_alignment_en_alignment_field_parsing_mandatoryfields_tlen_parsing = 188; static const int sam_alignment_en_alignment_field_parsing_mandatoryfields_seq_parsing = 189; static const int sam_alignment_en_alignment_field_parsing_mandatoryfields_qual_parsing = 190; static const int sam_alignment_en_alignment_tag_parsing = 251; #line 419 "sam_alignment.rl" import bio.sam.header; import bio.bam.read; import bio.bam.bai.bin; import bio.core.utils.outbuffer; import bio.core.base; import std.conv; import std.array; import std.exception; BamRead parseAlignmentLine(string line, SamHeader header, OutBuffer buffer=null) { char* p = cast(char*)line.ptr; char* pe = p + line.length; char* eof = pe; int cs; if (buffer is null) buffer = new OutBuffer(8192); else buffer.clear(); size_t rollback_size; // needed in case of invalid data byte current_sign = 1; size_t read_name_beg; // position of beginning of QNAME size_t sequence_beg; // position of SEQ start int l_seq; // sequence length uint cigar_op_len; // length of CIGAR operation char cigar_op_chr; // CIGAR operation size_t quals_length; // number of QUAL characters char quals_last_char; // needed in order to handle '*' correctly size_t cigar_op_len_start; // position of start of CIGAR operation long int_value; // for storing temporary integers float float_value; // for storing temporary floats size_t float_beg; // position of start of current float char arraytype; // type of last array tag value size_t tag_array_length_offset; // where the length is stored in the buffer string read_name; ushort flag; int pos = -1; int end_pos; // for bin calculation int mate_pos = -1; ubyte mapping_quality = 255; int template_length = 0; size_t tag_key_beg, tagvalue_beg; ubyte[] tag_key; size_t rname_beg, rnext_beg; int ref_id = -1; #line 120 "sam_alignment.d" { cs = sam_alignment_start; } #line 479 "sam_alignment.rl" #line 127 "sam_alignment.d" { if ( p == pe ) goto _test_eof; switch ( cs ) { goto case; case 1: if ( (*p) == 9u ) goto tr1; if ( (*p) > 63u ) { if ( 65u <= (*p) && (*p) <= 126u ) goto tr2; } else if ( (*p) >= 33u ) goto tr2; goto tr0; tr0: #line 50 "sam_alignment.rl" { p--; {if (true) goto st169;} } goto st0; tr3: #line 58 "sam_alignment.rl" { p--; {if (true) goto st170;} } goto st0; tr7: #line 67 "sam_alignment.rl" { p--; {if (true) goto st171;} } goto st0; tr12: #line 75 "sam_alignment.rl" { p--; {if (true) goto st172;} } goto st0; tr16: #line 81 "sam_alignment.rl" { p--; {if (true) goto st173;} } goto st0; tr20: #line 124 "sam_alignment.rl" { auto ptr = cast(uint*)(buffer.data.ptr + 3 * uint.sizeof); *ptr = (*ptr) & 0xFFFF0000; buffer.shrink(rollback_size); end_pos = pos + 1; p--; {if (true) goto st174;} } goto st0; tr24: #line 162 "sam_alignment.rl" { p--; {if (true) goto st175;} } goto st0; tr30: #line 175 "sam_alignment.rl" { p--; {if (true) goto st176;} } goto st0; tr34: #line 187 "sam_alignment.rl" { p--; {if (true) goto st177;} } goto st0; tr39: #line 217 "sam_alignment.rl" { rollback_size = buffer.length; p--; {if (true) goto st178;} } goto st0; tr43: #line 243 "sam_alignment.rl" { buffer.shrink(rollback_size); for (size_t i = 0; i < l_seq; ++i) buffer.putUnsafe!ubyte(0xFF); rollback_size = buffer.length; p--; {if (true) goto st179;} } goto st0; tr49: #line 403 "sam_alignment.rl" { buffer.shrink(rollback_size); p--; {if (true) goto st180;} } goto st0; #line 208 "sam_alignment.d" st0: cs = 0; goto _out; tr1: #line 48 "sam_alignment.rl" { read_name_beg = p - line.ptr; } #line 49 "sam_alignment.rl" { read_name = line[read_name_beg .. p - line.ptr]; } goto st2; tr206: #line 49 "sam_alignment.rl" { read_name = line[read_name_beg .. p - line.ptr]; } goto st2; st2: if ( ++p == pe ) goto _test_eof2; goto case; case 2: #line 226 "sam_alignment.d" if ( 48u <= (*p) && (*p) <= 57u ) goto tr4; goto tr3; tr4: #line 28 "sam_alignment.rl" { int_value = 0; } #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st3; st3: if ( ++p == pe ) goto _test_eof3; goto case; case 3: #line 240 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr6; goto tr3; tr5: #line 56 "sam_alignment.rl" { flag = to!ushort(int_value); } goto st4; st4: if ( ++p == pe ) goto _test_eof4; goto case; case 4: #line 254 "sam_alignment.d" if ( (*p) == 42u ) goto st150; if ( (*p) > 60u ) { if ( 62u <= (*p) && (*p) <= 126u ) goto tr8; } else if ( (*p) >= 33u ) goto tr8; goto tr7; tr8: #line 62 "sam_alignment.rl" { rname_beg = p - line.ptr; } goto st5; st5: if ( ++p == pe ) goto _test_eof5; goto case; case 5: #line 271 "sam_alignment.d" if ( (*p) == 9u ) goto tr10; if ( 33u <= (*p) && (*p) <= 126u ) goto st5; goto tr7; tr10: #line 63 "sam_alignment.rl" { ref_id = header.getSequenceIndex(line[rname_beg .. p - line.ptr]); } goto st6; st6: if ( ++p == pe ) goto _test_eof6; goto case; case 6: #line 287 "sam_alignment.d" if ( 48u <= (*p) && (*p) <= 57u ) goto tr13; goto tr12; tr13: #line 28 "sam_alignment.rl" { int_value = 0; } #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st7; st7: if ( ++p == pe ) goto _test_eof7; goto case; case 7: #line 301 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr15; goto tr12; tr14: #line 73 "sam_alignment.rl" { end_pos = pos = to!uint(int_value); } goto st8; st8: if ( ++p == pe ) goto _test_eof8; goto case; case 8: #line 315 "sam_alignment.d" if ( 48u <= (*p) && (*p) <= 57u ) goto tr17; goto tr16; tr17: #line 28 "sam_alignment.rl" { int_value = 0; } #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st9; st9: if ( ++p == pe ) goto _test_eof9; goto case; case 9: #line 329 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr19; goto tr16; tr18: #line 79 "sam_alignment.rl" { mapping_quality = to!ubyte(int_value); } #line 85 "sam_alignment.rl" { buffer.capacity = 32 + read_name.length + 1; buffer.putUnsafe!int(ref_id); buffer.putUnsafe!int(pos - 1); enforce(read_name.length + 1 <= 255, "Read name " ~ read_name ~ " is too long!"); // bin will be set later auto bin_mq_nl = ((cast(uint)mapping_quality) << 8) | (read_name.length + 1); buffer.putUnsafe(cast(uint)bin_mq_nl); // number of CIGAR operations will be set later buffer.putUnsafe!uint(flag << 16); buffer.putUnsafe!int(0); buffer.putUnsafe!int(-1); // mate ref. id buffer.putUnsafe!int(-1); // mate pos buffer.putUnsafe!int(0); // tlen buffer.putUnsafe(cast(ubyte[])read_name); buffer.putUnsafe!ubyte(0); rollback_size = buffer.length; } goto st10; tr235: #line 85 "sam_alignment.rl" { buffer.capacity = 32 + read_name.length + 1; buffer.putUnsafe!int(ref_id); buffer.putUnsafe!int(pos - 1); enforce(read_name.length + 1 <= 255, "Read name " ~ read_name ~ " is too long!"); // bin will be set later auto bin_mq_nl = ((cast(uint)mapping_quality) << 8) | (read_name.length + 1); buffer.putUnsafe(cast(uint)bin_mq_nl); // number of CIGAR operations will be set later buffer.putUnsafe!uint(flag << 16); buffer.putUnsafe!int(0); buffer.putUnsafe!int(-1); // mate ref. id buffer.putUnsafe!int(-1); // mate pos buffer.putUnsafe!int(0); // tlen buffer.putUnsafe(cast(ubyte[])read_name); buffer.putUnsafe!ubyte(0); rollback_size = buffer.length; } goto st10; st10: if ( ++p == pe ) goto _test_eof10; goto case; case 10: #line 395 "sam_alignment.d" if ( (*p) == 42u ) goto st11; if ( 48u <= (*p) && (*p) <= 57u ) goto tr22; goto tr20; st11: if ( ++p == pe ) goto _test_eof11; goto case; case 11: if ( (*p) == 9u ) goto tr23; goto tr20; tr23: #line 137 "sam_alignment.rl" { if (end_pos == pos) ++end_pos; { auto bin = reg2bin(pos - 1, end_pos - 1); // 0-based [) interval auto ptr = cast(uint*)(buffer.data.ptr + 2 * uint.sizeof); *ptr = (*ptr) | ((cast(uint)bin) << 16); } } goto st12; tr155: #line 113 "sam_alignment.rl" { auto op = CigarOperation(cigar_op_len, cigar_op_chr); if (op.is_reference_consuming) end_pos += op.length; buffer.put!CigarOperation(op); { auto ptr = cast(uint*)(buffer.data.ptr + 3 * uint.sizeof); *ptr = (*ptr) + 1; } } #line 137 "sam_alignment.rl" { if (end_pos == pos) ++end_pos; { auto bin = reg2bin(pos - 1, end_pos - 1); // 0-based [) interval auto ptr = cast(uint*)(buffer.data.ptr + 2 * uint.sizeof); *ptr = (*ptr) | ((cast(uint)bin) << 16); } } goto st12; st12: if ( ++p == pe ) goto _test_eof12; goto case; case 12: #line 447 "sam_alignment.d" switch( (*p) ) { case 42u: goto st95; case 61u: goto st96; default: break; } if ( 33u <= (*p) && (*p) <= 126u ) goto tr25; goto tr24; tr25: #line 155 "sam_alignment.rl" { rnext_beg = p - line.ptr; } goto st13; st13: if ( ++p == pe ) goto _test_eof13; goto case; case 13: #line 464 "sam_alignment.d" if ( (*p) == 9u ) goto tr28; if ( 33u <= (*p) && (*p) <= 126u ) goto st13; goto tr24; tr28: #line 156 "sam_alignment.rl" { { auto ptr = cast(int*)(buffer.data.ptr + 5 * int.sizeof); *ptr = header.getSequenceIndex(line[rnext_beg .. p - line.ptr]); } } goto st14; tr136: #line 148 "sam_alignment.rl" { { auto ptr = cast(int*)(buffer.data.ptr + 5 * int.sizeof); *ptr = ref_id; } } goto st14; st14: if ( ++p == pe ) goto _test_eof14; goto case; case 14: #line 492 "sam_alignment.d" if ( 48u <= (*p) && (*p) <= 57u ) goto tr31; goto tr30; tr31: #line 28 "sam_alignment.rl" { int_value = 0; } #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st15; st15: if ( ++p == pe ) goto _test_eof15; goto case; case 15: #line 506 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr33; goto tr30; tr32: #line 169 "sam_alignment.rl" { { auto ptr = cast(int*)(buffer.data.ptr + 6 * int.sizeof); *ptr = to!int(int_value) - 1; } } goto st16; st16: if ( ++p == pe ) goto _test_eof16; goto case; case 16: #line 525 "sam_alignment.d" switch( (*p) ) { case 43u: goto tr35; case 45u: goto tr35; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr36; goto tr34; tr35: #line 27 "sam_alignment.rl" { current_sign = (*p) == '-' ? -1 : 1; } goto st17; st17: if ( ++p == pe ) goto _test_eof17; goto case; case 17: #line 542 "sam_alignment.d" if ( 48u <= (*p) && (*p) <= 57u ) goto tr36; goto tr34; tr36: #line 28 "sam_alignment.rl" { int_value = 0; } #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st18; st18: if ( ++p == pe ) goto _test_eof18; goto case; case 18: #line 556 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr38; goto tr34; tr37: #line 30 "sam_alignment.rl" { int_value *= current_sign; current_sign = 1; } #line 181 "sam_alignment.rl" { { auto ptr = cast(int*)(buffer.data.ptr + 7 * int.sizeof); *ptr = to!int(int_value); } } goto st19; st19: if ( ++p == pe ) goto _test_eof19; goto case; case 19: #line 577 "sam_alignment.d" switch( (*p) ) { case 42u: goto st20; case 46u: goto tr41; case 61u: goto tr41; default: break; } if ( (*p) > 90u ) { if ( 97u <= (*p) && (*p) <= 122u ) goto tr41; } else if ( (*p) >= 65u ) goto tr41; goto tr39; st20: if ( ++p == pe ) goto _test_eof20; goto case; case 20: if ( (*p) == 9u ) goto tr42; goto tr39; tr42: #line 223 "sam_alignment.rl" { rollback_size = buffer.length; } goto st21; tr101: #line 194 "sam_alignment.rl" { auto data = cast(ubyte[])line[sequence_beg .. p - line.ptr]; l_seq = cast(int)data.length; auto raw_len = (l_seq + 1) / 2; // reserve space for base qualities, too buffer.capacity = buffer.length + raw_len + l_seq; for (size_t i = 0; i < raw_len; ++i) { auto b = cast(ubyte)(Base(data[2 * i]).internal_code << 4); if (2 * i + 1 < l_seq) b |= cast(ubyte)(Base(data[2 * i + 1]).internal_code); buffer.putUnsafe!ubyte(b); } // set l_seq { auto ptr = cast(int*)(buffer.data.ptr + 4 * int.sizeof); *ptr = l_seq; } rollback_size = buffer.length; } goto st21; st21: if ( ++p == pe ) goto _test_eof21; goto case; case 21: #line 633 "sam_alignment.d" if ( 33u <= (*p) && (*p) <= 126u ) goto tr44; goto tr43; tr44: #line 230 "sam_alignment.rl" { ++quals_length; quals_last_char = (*p); buffer.putUnsafe!ubyte(cast(ubyte)((*p) - 33)); } goto st191; st191: if ( ++p == pe ) goto _test_eof191; goto case; case 191: #line 649 "sam_alignment.d" if ( (*p) == 9u ) goto tr239; if ( 33u <= (*p) && (*p) <= 126u ) goto tr44; goto tr43; tr239: #line 236 "sam_alignment.rl" { // '*' may correspond either to a one-base long sequence // or to absence of information if (quals_length == 1 && quals_last_char == '*' && l_seq == 0) buffer.shrink(rollback_size); } #line 253 "sam_alignment.rl" { if (buffer.length - rollback_size != l_seq) { buffer.shrink(rollback_size); for (size_t i = 0; i < l_seq; ++i) buffer.putUnsafe!ubyte(0xFF); } rollback_size = buffer.length; } goto st22; tr240: #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } goto st22; tr241: #line 30 "sam_alignment.rl" { int_value *= current_sign; current_sign = 1; } #line 362 "sam_alignment.rl" { // here, we assume that compiler is smart enough to move switch out of loop. switch (arraytype) { case 'c': buffer.put(to!byte(int_value)); break; case 'C': buffer.put(to!ubyte(int_value)); break; case 's': buffer.put(to!short(int_value)); break; case 'S': buffer.put(to!ushort(int_value)); break; case 'i': buffer.put(to!int(int_value)); break; case 'I': buffer.put(to!uint(int_value)); break; default: assert(0); } { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } goto st22; tr260: #line 38 "sam_alignment.rl" { float_value = to!float(line[float_beg .. p - line.ptr]); } #line 379 "sam_alignment.rl" { buffer.put!float(float_value); { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } goto st22; tr263: #line 337 "sam_alignment.rl" { { auto data = cast(ubyte[])(line[tagvalue_beg .. p - line.ptr]); buffer.capacity = buffer.length + 4 + data.length; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('H'); buffer.putUnsafe(data); buffer.putUnsafe!ubyte(0); } } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } goto st22; tr265: #line 326 "sam_alignment.rl" { { auto data = cast(ubyte[])(line[tagvalue_beg .. p - line.ptr]); buffer.capacity = buffer.length + 4 + data.length; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('Z'); buffer.putUnsafe(data); buffer.putUnsafe!ubyte(0); } } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } goto st22; tr267: #line 38 "sam_alignment.rl" { float_value = to!float(line[float_beg .. p - line.ptr]); } #line 319 "sam_alignment.rl" { buffer.capacity = buffer.length + 7; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('f'); buffer.putUnsafe!float(float_value); } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } goto st22; tr269: #line 30 "sam_alignment.rl" { int_value *= current_sign; current_sign = 1; } #line 285 "sam_alignment.rl" { buffer.capacity = buffer.length + 7; buffer.putUnsafe(tag_key); if (int_value < 0) { if (int_value >= byte.min) { buffer.putUnsafe!char('c'); buffer.putUnsafe(cast(byte)int_value); } else if (int_value >= short.min) { buffer.putUnsafe!char('s'); buffer.putUnsafe(cast(short)int_value); } else if (int_value >= int.min) { buffer.putUnsafe!char('i'); buffer.putUnsafe(cast(int)int_value); } else { throw new Exception("integer out of range"); } } else { if (int_value <= ubyte.max) { buffer.putUnsafe!char('C'); buffer.putUnsafe(cast(ubyte)int_value); } else if (int_value <= ushort.max) { buffer.putUnsafe!char('S'); buffer.putUnsafe(cast(ushort)int_value); } else if (int_value <= uint.max) { buffer.putUnsafe!char('I'); buffer.putUnsafe(cast(uint)int_value); } else { throw new Exception("integer out of range"); } } } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } goto st22; st22: if ( ++p == pe ) goto _test_eof22; goto case; case 22: #line 803 "sam_alignment.d" if ( (*p) > 90u ) { if ( 97u <= (*p) && (*p) <= 122u ) goto tr45; } else if ( (*p) >= 65u ) goto tr45; goto st0; tr45: #line 400 "sam_alignment.rl" { tag_key_beg = p - line.ptr; } goto st23; st23: if ( ++p == pe ) goto _test_eof23; goto case; case 23: #line 818 "sam_alignment.d" if ( (*p) < 65u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto st24; } else if ( (*p) > 90u ) { if ( 97u <= (*p) && (*p) <= 122u ) goto st24; } else goto st24; goto st0; st24: if ( ++p == pe ) goto _test_eof24; goto case; case 24: if ( (*p) == 58u ) goto tr48; goto st0; tr48: #line 401 "sam_alignment.rl" { tag_key = cast(ubyte[])(line[tag_key_beg .. p - line.ptr]); } goto st25; st25: if ( ++p == pe ) goto _test_eof25; goto case; case 25: #line 843 "sam_alignment.d" switch( (*p) ) { case 65u: goto st26; case 66u: goto st28; case 72u: goto st43; case 90u: goto st45; case 102u: goto st47; case 105u: goto st57; default: break; } goto tr49; st26: if ( ++p == pe ) goto _test_eof26; goto case; case 26: if ( (*p) == 58u ) goto st27; goto tr49; st27: if ( ++p == pe ) goto _test_eof27; goto case; case 27: if ( 33u <= (*p) && (*p) <= 126u ) goto tr57; goto tr49; tr57: #line 278 "sam_alignment.rl" { buffer.capacity = buffer.length + 4; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('A'); buffer.putUnsafe!char((*p)); } goto st192; st192: if ( ++p == pe ) goto _test_eof192; goto case; case 192: #line 881 "sam_alignment.d" if ( (*p) == 9u ) goto tr240; goto tr49; st28: if ( ++p == pe ) goto _test_eof28; goto case; case 28: if ( (*p) == 58u ) goto st29; goto tr49; st29: if ( ++p == pe ) goto _test_eof29; goto case; case 29: switch( (*p) ) { case 67u: goto tr59; case 73u: goto tr59; case 83u: goto tr59; case 99u: goto tr59; case 102u: goto tr60; case 105u: goto tr59; case 115u: goto tr59; default: break; } goto tr49; tr59: #line 352 "sam_alignment.rl" { arraytype = (*p); buffer.capacity = buffer.length + 8; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('B'); buffer.putUnsafe!char(arraytype); buffer.putUnsafe!uint(0); tag_array_length_offset = buffer.length - uint.sizeof; } goto st30; st30: if ( ++p == pe ) goto _test_eof30; goto case; case 30: #line 923 "sam_alignment.d" if ( (*p) == 44u ) goto st31; goto tr49; tr242: #line 30 "sam_alignment.rl" { int_value *= current_sign; current_sign = 1; } #line 362 "sam_alignment.rl" { // here, we assume that compiler is smart enough to move switch out of loop. switch (arraytype) { case 'c': buffer.put(to!byte(int_value)); break; case 'C': buffer.put(to!ubyte(int_value)); break; case 's': buffer.put(to!short(int_value)); break; case 'S': buffer.put(to!ushort(int_value)); break; case 'i': buffer.put(to!int(int_value)); break; case 'I': buffer.put(to!uint(int_value)); break; default: assert(0); } { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } goto st31; st31: if ( ++p == pe ) goto _test_eof31; goto case; case 31: #line 952 "sam_alignment.d" switch( (*p) ) { case 43u: goto tr62; case 45u: goto tr62; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr63; goto tr49; tr62: #line 27 "sam_alignment.rl" { current_sign = (*p) == '-' ? -1 : 1; } goto st32; st32: if ( ++p == pe ) goto _test_eof32; goto case; case 32: #line 969 "sam_alignment.d" if ( 48u <= (*p) && (*p) <= 57u ) goto tr63; goto tr49; tr63: #line 28 "sam_alignment.rl" { int_value = 0; } #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st193; st193: if ( ++p == pe ) goto _test_eof193; goto case; case 193: #line 983 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr243; goto tr49; tr243: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st194; st194: if ( ++p == pe ) goto _test_eof194; goto case; case 194: #line 1000 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr244; goto tr49; tr244: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st195; st195: if ( ++p == pe ) goto _test_eof195; goto case; case 195: #line 1017 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr245; goto tr49; tr245: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st196; st196: if ( ++p == pe ) goto _test_eof196; goto case; case 196: #line 1034 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr246; goto tr49; tr246: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st197; st197: if ( ++p == pe ) goto _test_eof197; goto case; case 197: #line 1051 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr247; goto tr49; tr247: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st198; st198: if ( ++p == pe ) goto _test_eof198; goto case; case 198: #line 1068 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr248; goto tr49; tr248: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st199; st199: if ( ++p == pe ) goto _test_eof199; goto case; case 199: #line 1085 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr249; goto tr49; tr249: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st200; st200: if ( ++p == pe ) goto _test_eof200; goto case; case 200: #line 1102 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr250; goto tr49; tr250: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st201; st201: if ( ++p == pe ) goto _test_eof201; goto case; case 201: #line 1119 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr251; goto tr49; tr251: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st202; st202: if ( ++p == pe ) goto _test_eof202; goto case; case 202: #line 1136 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr252; goto tr49; tr252: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st203; st203: if ( ++p == pe ) goto _test_eof203; goto case; case 203: #line 1153 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr253; goto tr49; tr253: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st204; st204: if ( ++p == pe ) goto _test_eof204; goto case; case 204: #line 1170 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr254; goto tr49; tr254: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st205; st205: if ( ++p == pe ) goto _test_eof205; goto case; case 205: #line 1187 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr255; goto tr49; tr255: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st206; st206: if ( ++p == pe ) goto _test_eof206; goto case; case 206: #line 1204 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr256; goto tr49; tr256: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st207; st207: if ( ++p == pe ) goto _test_eof207; goto case; case 207: #line 1221 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr257; goto tr49; tr257: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st208; st208: if ( ++p == pe ) goto _test_eof208; goto case; case 208: #line 1238 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr258; goto tr49; tr258: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st209; st209: if ( ++p == pe ) goto _test_eof209; goto case; case 209: #line 1255 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr259; goto tr49; tr259: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st210; st210: if ( ++p == pe ) goto _test_eof210; goto case; case 210: #line 1272 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr241; case 44u: goto tr242; default: break; } goto tr49; tr60: #line 352 "sam_alignment.rl" { arraytype = (*p); buffer.capacity = buffer.length + 8; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('B'); buffer.putUnsafe!char(arraytype); buffer.putUnsafe!uint(0); tag_array_length_offset = buffer.length - uint.sizeof; } goto st33; st33: if ( ++p == pe ) goto _test_eof33; goto case; case 33: #line 1295 "sam_alignment.d" if ( (*p) == 44u ) goto st34; goto tr49; tr261: #line 38 "sam_alignment.rl" { float_value = to!float(line[float_beg .. p - line.ptr]); } #line 379 "sam_alignment.rl" { buffer.put!float(float_value); { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } goto st34; st34: if ( ++p == pe ) goto _test_eof34; goto case; case 34: #line 1317 "sam_alignment.d" switch( (*p) ) { case 43u: goto tr65; case 45u: goto tr65; case 46u: goto tr66; case 105u: goto tr68; case 110u: goto tr69; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr67; goto tr49; tr65: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } goto st35; st35: if ( ++p == pe ) goto _test_eof35; goto case; case 35: #line 1337 "sam_alignment.d" switch( (*p) ) { case 46u: goto st36; case 105u: goto st39; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto st213; goto tr49; tr66: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } goto st36; st36: if ( ++p == pe ) goto _test_eof36; goto case; case 36: #line 1354 "sam_alignment.d" if ( 48u <= (*p) && (*p) <= 57u ) goto st211; goto tr49; st211: if ( ++p == pe ) goto _test_eof211; goto case; case 211: switch( (*p) ) { case 9u: goto tr260; case 44u: goto tr261; case 69u: goto st37; case 101u: goto st37; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto st211; goto tr49; st37: if ( ++p == pe ) goto _test_eof37; goto case; case 37: switch( (*p) ) { case 43u: goto st38; case 45u: goto st38; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto st212; goto tr49; st38: if ( ++p == pe ) goto _test_eof38; goto case; case 38: if ( 48u <= (*p) && (*p) <= 57u ) goto st212; goto tr49; st212: if ( ++p == pe ) goto _test_eof212; goto case; case 212: switch( (*p) ) { case 9u: goto tr260; case 44u: goto tr261; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto st212; goto tr49; tr67: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } goto st213; st213: if ( ++p == pe ) goto _test_eof213; goto case; case 213: #line 1411 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr260; case 44u: goto tr261; case 46u: goto st36; case 69u: goto st37; case 101u: goto st37; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto st213; goto tr49; tr68: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } goto st39; st39: if ( ++p == pe ) goto _test_eof39; goto case; case 39: #line 1431 "sam_alignment.d" if ( (*p) == 110u ) goto st40; goto tr49; st40: if ( ++p == pe ) goto _test_eof40; goto case; case 40: if ( (*p) == 102u ) goto st214; goto tr49; st214: if ( ++p == pe ) goto _test_eof214; goto case; case 214: switch( (*p) ) { case 9u: goto tr260; case 44u: goto tr261; default: break; } goto tr49; tr69: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } goto st41; st41: if ( ++p == pe ) goto _test_eof41; goto case; case 41: #line 1460 "sam_alignment.d" if ( (*p) == 97u ) goto st42; goto tr49; st42: if ( ++p == pe ) goto _test_eof42; goto case; case 42: if ( (*p) == 110u ) goto st214; goto tr49; st43: if ( ++p == pe ) goto _test_eof43; goto case; case 43: if ( (*p) == 58u ) goto st44; goto tr49; st44: if ( ++p == pe ) goto _test_eof44; goto case; case 44: if ( (*p) < 65u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr80; } else if ( (*p) > 70u ) { if ( 97u <= (*p) && (*p) <= 102u ) goto tr80; } else goto tr80; goto tr49; tr80: #line 317 "sam_alignment.rl" { tagvalue_beg = p - line.ptr; } goto st215; st215: if ( ++p == pe ) goto _test_eof215; goto case; case 215: #line 1499 "sam_alignment.d" if ( (*p) == 9u ) goto tr263; if ( (*p) < 65u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto st215; } else if ( (*p) > 70u ) { if ( 97u <= (*p) && (*p) <= 102u ) goto st215; } else goto st215; goto tr49; st45: if ( ++p == pe ) goto _test_eof45; goto case; case 45: if ( (*p) == 58u ) goto st46; goto tr49; st46: if ( ++p == pe ) goto _test_eof46; goto case; case 46: if ( 32u <= (*p) && (*p) <= 126u ) goto tr82; goto tr49; tr82: #line 317 "sam_alignment.rl" { tagvalue_beg = p - line.ptr; } goto st216; st216: if ( ++p == pe ) goto _test_eof216; goto case; case 216: #line 1533 "sam_alignment.d" if ( (*p) == 9u ) goto tr265; if ( 32u <= (*p) && (*p) <= 126u ) goto st216; goto tr49; st47: if ( ++p == pe ) goto _test_eof47; goto case; case 47: if ( (*p) == 58u ) goto st48; goto tr49; st48: if ( ++p == pe ) goto _test_eof48; goto case; case 48: switch( (*p) ) { case 43u: goto tr84; case 45u: goto tr84; case 46u: goto tr85; case 105u: goto tr87; case 110u: goto tr88; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr86; goto tr49; tr84: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } goto st49; st49: if ( ++p == pe ) goto _test_eof49; goto case; case 49: #line 1569 "sam_alignment.d" switch( (*p) ) { case 46u: goto st50; case 105u: goto st53; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto st219; goto tr49; tr85: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } goto st50; st50: if ( ++p == pe ) goto _test_eof50; goto case; case 50: #line 1586 "sam_alignment.d" if ( 48u <= (*p) && (*p) <= 57u ) goto st217; goto tr49; st217: if ( ++p == pe ) goto _test_eof217; goto case; case 217: switch( (*p) ) { case 9u: goto tr267; case 69u: goto st51; case 101u: goto st51; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto st217; goto tr49; st51: if ( ++p == pe ) goto _test_eof51; goto case; case 51: switch( (*p) ) { case 43u: goto st52; case 45u: goto st52; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto st218; goto tr49; st52: if ( ++p == pe ) goto _test_eof52; goto case; case 52: if ( 48u <= (*p) && (*p) <= 57u ) goto st218; goto tr49; st218: if ( ++p == pe ) goto _test_eof218; goto case; case 218: if ( (*p) == 9u ) goto tr267; if ( 48u <= (*p) && (*p) <= 57u ) goto st218; goto tr49; tr86: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } goto st219; st219: if ( ++p == pe ) goto _test_eof219; goto case; case 219: #line 1639 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr267; case 46u: goto st50; case 69u: goto st51; case 101u: goto st51; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto st219; goto tr49; tr87: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } goto st53; st53: if ( ++p == pe ) goto _test_eof53; goto case; case 53: #line 1658 "sam_alignment.d" if ( (*p) == 110u ) goto st54; goto tr49; st54: if ( ++p == pe ) goto _test_eof54; goto case; case 54: if ( (*p) == 102u ) goto st220; goto tr49; st220: if ( ++p == pe ) goto _test_eof220; goto case; case 220: if ( (*p) == 9u ) goto tr267; goto tr49; tr88: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } goto st55; st55: if ( ++p == pe ) goto _test_eof55; goto case; case 55: #line 1684 "sam_alignment.d" if ( (*p) == 97u ) goto st56; goto tr49; st56: if ( ++p == pe ) goto _test_eof56; goto case; case 56: if ( (*p) == 110u ) goto st220; goto tr49; st57: if ( ++p == pe ) goto _test_eof57; goto case; case 57: if ( (*p) == 58u ) goto st58; goto tr49; st58: if ( ++p == pe ) goto _test_eof58; goto case; case 58: switch( (*p) ) { case 43u: goto tr99; case 45u: goto tr99; default: break; } if ( 48u <= (*p) && (*p) <= 57u ) goto tr100; goto tr49; tr99: #line 27 "sam_alignment.rl" { current_sign = (*p) == '-' ? -1 : 1; } goto st59; st59: if ( ++p == pe ) goto _test_eof59; goto case; case 59: #line 1722 "sam_alignment.d" if ( 48u <= (*p) && (*p) <= 57u ) goto tr100; goto tr49; tr100: #line 28 "sam_alignment.rl" { int_value = 0; } #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st221; st221: if ( ++p == pe ) goto _test_eof221; goto case; case 221: #line 1736 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr270; goto tr49; tr270: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st222; st222: if ( ++p == pe ) goto _test_eof222; goto case; case 222: #line 1750 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr271; goto tr49; tr271: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st223; st223: if ( ++p == pe ) goto _test_eof223; goto case; case 223: #line 1764 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr272; goto tr49; tr272: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st224; st224: if ( ++p == pe ) goto _test_eof224; goto case; case 224: #line 1778 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr273; goto tr49; tr273: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st225; st225: if ( ++p == pe ) goto _test_eof225; goto case; case 225: #line 1792 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr274; goto tr49; tr274: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st226; st226: if ( ++p == pe ) goto _test_eof226; goto case; case 226: #line 1806 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr275; goto tr49; tr275: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st227; st227: if ( ++p == pe ) goto _test_eof227; goto case; case 227: #line 1820 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr276; goto tr49; tr276: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st228; st228: if ( ++p == pe ) goto _test_eof228; goto case; case 228: #line 1834 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr277; goto tr49; tr277: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st229; st229: if ( ++p == pe ) goto _test_eof229; goto case; case 229: #line 1848 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr278; goto tr49; tr278: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st230; st230: if ( ++p == pe ) goto _test_eof230; goto case; case 230: #line 1862 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr279; goto tr49; tr279: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st231; st231: if ( ++p == pe ) goto _test_eof231; goto case; case 231: #line 1876 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr280; goto tr49; tr280: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st232; st232: if ( ++p == pe ) goto _test_eof232; goto case; case 232: #line 1890 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr281; goto tr49; tr281: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st233; st233: if ( ++p == pe ) goto _test_eof233; goto case; case 233: #line 1904 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr282; goto tr49; tr282: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st234; st234: if ( ++p == pe ) goto _test_eof234; goto case; case 234: #line 1918 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr283; goto tr49; tr283: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st235; st235: if ( ++p == pe ) goto _test_eof235; goto case; case 235: #line 1932 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr284; goto tr49; tr284: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st236; st236: if ( ++p == pe ) goto _test_eof236; goto case; case 236: #line 1946 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr285; goto tr49; tr285: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st237; st237: if ( ++p == pe ) goto _test_eof237; goto case; case 237: #line 1960 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; if ( 48u <= (*p) && (*p) <= 57u ) goto tr286; goto tr49; tr286: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st238; st238: if ( ++p == pe ) goto _test_eof238; goto case; case 238: #line 1974 "sam_alignment.d" if ( (*p) == 9u ) goto tr269; goto tr49; tr41: #line 193 "sam_alignment.rl" { sequence_beg = p - line.ptr; } goto st60; st60: if ( ++p == pe ) goto _test_eof60; goto case; case 60: #line 1986 "sam_alignment.d" switch( (*p) ) { case 9u: goto tr101; case 46u: goto st60; case 61u: goto st60; default: break; } if ( (*p) > 90u ) { if ( 97u <= (*p) && (*p) <= 122u ) goto st60; } else if ( (*p) >= 65u ) goto st60; goto tr39; tr38: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st61; st61: if ( ++p == pe ) goto _test_eof61; goto case; case 61: #line 2007 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr103; goto tr34; tr103: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st62; st62: if ( ++p == pe ) goto _test_eof62; goto case; case 62: #line 2021 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr104; goto tr34; tr104: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st63; st63: if ( ++p == pe ) goto _test_eof63; goto case; case 63: #line 2035 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr105; goto tr34; tr105: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st64; st64: if ( ++p == pe ) goto _test_eof64; goto case; case 64: #line 2049 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr106; goto tr34; tr106: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st65; st65: if ( ++p == pe ) goto _test_eof65; goto case; case 65: #line 2063 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr107; goto tr34; tr107: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st66; st66: if ( ++p == pe ) goto _test_eof66; goto case; case 66: #line 2077 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr108; goto tr34; tr108: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st67; st67: if ( ++p == pe ) goto _test_eof67; goto case; case 67: #line 2091 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr109; goto tr34; tr109: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st68; st68: if ( ++p == pe ) goto _test_eof68; goto case; case 68: #line 2105 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr110; goto tr34; tr110: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st69; st69: if ( ++p == pe ) goto _test_eof69; goto case; case 69: #line 2119 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr111; goto tr34; tr111: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st70; st70: if ( ++p == pe ) goto _test_eof70; goto case; case 70: #line 2133 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr112; goto tr34; tr112: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st71; st71: if ( ++p == pe ) goto _test_eof71; goto case; case 71: #line 2147 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr113; goto tr34; tr113: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st72; st72: if ( ++p == pe ) goto _test_eof72; goto case; case 72: #line 2161 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr114; goto tr34; tr114: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st73; st73: if ( ++p == pe ) goto _test_eof73; goto case; case 73: #line 2175 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr115; goto tr34; tr115: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st74; st74: if ( ++p == pe ) goto _test_eof74; goto case; case 74: #line 2189 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr116; goto tr34; tr116: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st75; st75: if ( ++p == pe ) goto _test_eof75; goto case; case 75: #line 2203 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr117; goto tr34; tr117: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st76; st76: if ( ++p == pe ) goto _test_eof76; goto case; case 76: #line 2217 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; if ( 48u <= (*p) && (*p) <= 57u ) goto tr118; goto tr34; tr118: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st77; st77: if ( ++p == pe ) goto _test_eof77; goto case; case 77: #line 2231 "sam_alignment.d" if ( (*p) == 9u ) goto tr37; goto tr34; tr33: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st78; st78: if ( ++p == pe ) goto _test_eof78; goto case; case 78: #line 2243 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr119; goto tr30; tr119: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st79; st79: if ( ++p == pe ) goto _test_eof79; goto case; case 79: #line 2257 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr120; goto tr30; tr120: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st80; st80: if ( ++p == pe ) goto _test_eof80; goto case; case 80: #line 2271 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr121; goto tr30; tr121: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st81; st81: if ( ++p == pe ) goto _test_eof81; goto case; case 81: #line 2285 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr122; goto tr30; tr122: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st82; st82: if ( ++p == pe ) goto _test_eof82; goto case; case 82: #line 2299 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr123; goto tr30; tr123: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st83; st83: if ( ++p == pe ) goto _test_eof83; goto case; case 83: #line 2313 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr124; goto tr30; tr124: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st84; st84: if ( ++p == pe ) goto _test_eof84; goto case; case 84: #line 2327 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr125; goto tr30; tr125: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st85; st85: if ( ++p == pe ) goto _test_eof85; goto case; case 85: #line 2341 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr126; goto tr30; tr126: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st86; st86: if ( ++p == pe ) goto _test_eof86; goto case; case 86: #line 2355 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr127; goto tr30; tr127: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st87; st87: if ( ++p == pe ) goto _test_eof87; goto case; case 87: #line 2369 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr128; goto tr30; tr128: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st88; st88: if ( ++p == pe ) goto _test_eof88; goto case; case 88: #line 2383 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr129; goto tr30; tr129: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st89; st89: if ( ++p == pe ) goto _test_eof89; goto case; case 89: #line 2397 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr130; goto tr30; tr130: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st90; st90: if ( ++p == pe ) goto _test_eof90; goto case; case 90: #line 2411 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr131; goto tr30; tr131: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st91; st91: if ( ++p == pe ) goto _test_eof91; goto case; case 91: #line 2425 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr132; goto tr30; tr132: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st92; st92: if ( ++p == pe ) goto _test_eof92; goto case; case 92: #line 2439 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr133; goto tr30; tr133: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st93; st93: if ( ++p == pe ) goto _test_eof93; goto case; case 93: #line 2453 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; if ( 48u <= (*p) && (*p) <= 57u ) goto tr134; goto tr30; tr134: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st94; st94: if ( ++p == pe ) goto _test_eof94; goto case; case 94: #line 2467 "sam_alignment.d" if ( (*p) == 9u ) goto tr32; goto tr30; st95: if ( ++p == pe ) goto _test_eof95; goto case; case 95: if ( (*p) == 9u ) goto st14; goto tr24; st96: if ( ++p == pe ) goto _test_eof96; goto case; case 96: if ( (*p) == 9u ) goto tr136; goto tr24; tr22: #line 28 "sam_alignment.rl" { int_value = 0; } #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st97; tr156: #line 113 "sam_alignment.rl" { auto op = CigarOperation(cigar_op_len, cigar_op_chr); if (op.is_reference_consuming) end_pos += op.length; buffer.put!CigarOperation(op); { auto ptr = cast(uint*)(buffer.data.ptr + 3 * uint.sizeof); *ptr = (*ptr) + 1; } } #line 28 "sam_alignment.rl" { int_value = 0; } #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st97; st97: if ( ++p == pe ) goto _test_eof97; goto case; case 97: #line 2512 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr137; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr137: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st98; st98: if ( ++p == pe ) goto _test_eof98; goto case; case 98: #line 2538 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr139; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr139: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st99; st99: if ( ++p == pe ) goto _test_eof99; goto case; case 99: #line 2564 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr140; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr140: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st100; st100: if ( ++p == pe ) goto _test_eof100; goto case; case 100: #line 2590 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr141; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr141: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st101; st101: if ( ++p == pe ) goto _test_eof101; goto case; case 101: #line 2616 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr142; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr142: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st102; st102: if ( ++p == pe ) goto _test_eof102; goto case; case 102: #line 2642 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr143; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr143: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st103; st103: if ( ++p == pe ) goto _test_eof103; goto case; case 103: #line 2668 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr144; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr144: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st104; st104: if ( ++p == pe ) goto _test_eof104; goto case; case 104: #line 2694 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr145; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr145: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st105; st105: if ( ++p == pe ) goto _test_eof105; goto case; case 105: #line 2720 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr146; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr146: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st106; st106: if ( ++p == pe ) goto _test_eof106; goto case; case 106: #line 2746 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr147; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr147: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st107; st107: if ( ++p == pe ) goto _test_eof107; goto case; case 107: #line 2772 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr148; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr148: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st108; st108: if ( ++p == pe ) goto _test_eof108; goto case; case 108: #line 2798 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr149; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr149: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st109; st109: if ( ++p == pe ) goto _test_eof109; goto case; case 109: #line 2824 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr150; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr150: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st110; st110: if ( ++p == pe ) goto _test_eof110; goto case; case 110: #line 2850 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr151; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr151: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st111; st111: if ( ++p == pe ) goto _test_eof111; goto case; case 111: #line 2876 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr152; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr152: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st112; st112: if ( ++p == pe ) goto _test_eof112; goto case; case 112: #line 2902 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr153; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr153: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st113; st113: if ( ++p == pe ) goto _test_eof113; goto case; case 113: #line 2928 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) < 72u ) { if ( 48u <= (*p) && (*p) <= 57u ) goto tr154; } else if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else goto tr138; goto tr20; tr154: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st114; st114: if ( ++p == pe ) goto _test_eof114; goto case; case 114: #line 2954 "sam_alignment.d" switch( (*p) ) { case 61u: goto tr138; case 68u: goto tr138; case 80u: goto tr138; case 83u: goto tr138; case 88u: goto tr138; default: break; } if ( (*p) > 73u ) { if ( 77u <= (*p) && (*p) <= 78u ) goto tr138; } else if ( (*p) >= 72u ) goto tr138; goto tr20; tr138: #line 111 "sam_alignment.rl" { cigar_op_len = to!uint(int_value); } #line 112 "sam_alignment.rl" { cigar_op_chr = (*p); } goto st115; st115: if ( ++p == pe ) goto _test_eof115; goto case; case 115: #line 2979 "sam_alignment.d" if ( (*p) == 9u ) goto tr155; if ( 48u <= (*p) && (*p) <= 57u ) goto tr156; goto tr20; tr19: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st116; st116: if ( ++p == pe ) goto _test_eof116; goto case; case 116: #line 2993 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr157; goto tr16; tr157: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st117; st117: if ( ++p == pe ) goto _test_eof117; goto case; case 117: #line 3007 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr158; goto tr16; tr158: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st118; st118: if ( ++p == pe ) goto _test_eof118; goto case; case 118: #line 3021 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr159; goto tr16; tr159: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st119; st119: if ( ++p == pe ) goto _test_eof119; goto case; case 119: #line 3035 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr160; goto tr16; tr160: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st120; st120: if ( ++p == pe ) goto _test_eof120; goto case; case 120: #line 3049 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr161; goto tr16; tr161: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st121; st121: if ( ++p == pe ) goto _test_eof121; goto case; case 121: #line 3063 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr162; goto tr16; tr162: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st122; st122: if ( ++p == pe ) goto _test_eof122; goto case; case 122: #line 3077 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr163; goto tr16; tr163: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st123; st123: if ( ++p == pe ) goto _test_eof123; goto case; case 123: #line 3091 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr164; goto tr16; tr164: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st124; st124: if ( ++p == pe ) goto _test_eof124; goto case; case 124: #line 3105 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr165; goto tr16; tr165: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st125; st125: if ( ++p == pe ) goto _test_eof125; goto case; case 125: #line 3119 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr166; goto tr16; tr166: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st126; st126: if ( ++p == pe ) goto _test_eof126; goto case; case 126: #line 3133 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr167; goto tr16; tr167: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st127; st127: if ( ++p == pe ) goto _test_eof127; goto case; case 127: #line 3147 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr168; goto tr16; tr168: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st128; st128: if ( ++p == pe ) goto _test_eof128; goto case; case 128: #line 3161 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr169; goto tr16; tr169: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st129; st129: if ( ++p == pe ) goto _test_eof129; goto case; case 129: #line 3175 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr170; goto tr16; tr170: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st130; st130: if ( ++p == pe ) goto _test_eof130; goto case; case 130: #line 3189 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr171; goto tr16; tr171: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st131; st131: if ( ++p == pe ) goto _test_eof131; goto case; case 131: #line 3203 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; if ( 48u <= (*p) && (*p) <= 57u ) goto tr172; goto tr16; tr172: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st132; st132: if ( ++p == pe ) goto _test_eof132; goto case; case 132: #line 3217 "sam_alignment.d" if ( (*p) == 9u ) goto tr18; goto tr16; tr15: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st133; st133: if ( ++p == pe ) goto _test_eof133; goto case; case 133: #line 3229 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr173; goto tr12; tr173: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st134; st134: if ( ++p == pe ) goto _test_eof134; goto case; case 134: #line 3243 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr174; goto tr12; tr174: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st135; st135: if ( ++p == pe ) goto _test_eof135; goto case; case 135: #line 3257 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr175; goto tr12; tr175: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st136; st136: if ( ++p == pe ) goto _test_eof136; goto case; case 136: #line 3271 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr176; goto tr12; tr176: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st137; st137: if ( ++p == pe ) goto _test_eof137; goto case; case 137: #line 3285 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr177; goto tr12; tr177: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st138; st138: if ( ++p == pe ) goto _test_eof138; goto case; case 138: #line 3299 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr178; goto tr12; tr178: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st139; st139: if ( ++p == pe ) goto _test_eof139; goto case; case 139: #line 3313 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr179; goto tr12; tr179: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st140; st140: if ( ++p == pe ) goto _test_eof140; goto case; case 140: #line 3327 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr180; goto tr12; tr180: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st141; st141: if ( ++p == pe ) goto _test_eof141; goto case; case 141: #line 3341 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr181; goto tr12; tr181: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st142; st142: if ( ++p == pe ) goto _test_eof142; goto case; case 142: #line 3355 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr182; goto tr12; tr182: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st143; st143: if ( ++p == pe ) goto _test_eof143; goto case; case 143: #line 3369 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr183; goto tr12; tr183: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st144; st144: if ( ++p == pe ) goto _test_eof144; goto case; case 144: #line 3383 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr184; goto tr12; tr184: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st145; st145: if ( ++p == pe ) goto _test_eof145; goto case; case 145: #line 3397 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr185; goto tr12; tr185: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st146; st146: if ( ++p == pe ) goto _test_eof146; goto case; case 146: #line 3411 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr186; goto tr12; tr186: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st147; st147: if ( ++p == pe ) goto _test_eof147; goto case; case 147: #line 3425 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr187; goto tr12; tr187: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st148; st148: if ( ++p == pe ) goto _test_eof148; goto case; case 148: #line 3439 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; if ( 48u <= (*p) && (*p) <= 57u ) goto tr188; goto tr12; tr188: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st149; st149: if ( ++p == pe ) goto _test_eof149; goto case; case 149: #line 3453 "sam_alignment.d" if ( (*p) == 9u ) goto tr14; goto tr12; st150: if ( ++p == pe ) goto _test_eof150; goto case; case 150: if ( (*p) == 9u ) goto st6; goto tr7; tr6: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st151; st151: if ( ++p == pe ) goto _test_eof151; goto case; case 151: #line 3472 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr190; goto tr3; tr190: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st152; st152: if ( ++p == pe ) goto _test_eof152; goto case; case 152: #line 3486 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr191; goto tr3; tr191: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st153; st153: if ( ++p == pe ) goto _test_eof153; goto case; case 153: #line 3500 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr192; goto tr3; tr192: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st154; st154: if ( ++p == pe ) goto _test_eof154; goto case; case 154: #line 3514 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr193; goto tr3; tr193: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st155; st155: if ( ++p == pe ) goto _test_eof155; goto case; case 155: #line 3528 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr194; goto tr3; tr194: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st156; st156: if ( ++p == pe ) goto _test_eof156; goto case; case 156: #line 3542 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr195; goto tr3; tr195: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st157; st157: if ( ++p == pe ) goto _test_eof157; goto case; case 157: #line 3556 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr196; goto tr3; tr196: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st158; st158: if ( ++p == pe ) goto _test_eof158; goto case; case 158: #line 3570 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr197; goto tr3; tr197: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st159; st159: if ( ++p == pe ) goto _test_eof159; goto case; case 159: #line 3584 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr198; goto tr3; tr198: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st160; st160: if ( ++p == pe ) goto _test_eof160; goto case; case 160: #line 3598 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr199; goto tr3; tr199: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st161; st161: if ( ++p == pe ) goto _test_eof161; goto case; case 161: #line 3612 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr200; goto tr3; tr200: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st162; st162: if ( ++p == pe ) goto _test_eof162; goto case; case 162: #line 3626 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr201; goto tr3; tr201: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st163; st163: if ( ++p == pe ) goto _test_eof163; goto case; case 163: #line 3640 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr202; goto tr3; tr202: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st164; st164: if ( ++p == pe ) goto _test_eof164; goto case; case 164: #line 3654 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr203; goto tr3; tr203: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st165; st165: if ( ++p == pe ) goto _test_eof165; goto case; case 165: #line 3668 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr204; goto tr3; tr204: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st166; st166: if ( ++p == pe ) goto _test_eof166; goto case; case 166: #line 3682 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; if ( 48u <= (*p) && (*p) <= 57u ) goto tr205; goto tr3; tr205: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } goto st167; st167: if ( ++p == pe ) goto _test_eof167; goto case; case 167: #line 3696 "sam_alignment.d" if ( (*p) == 9u ) goto tr5; goto tr3; tr2: #line 48 "sam_alignment.rl" { read_name_beg = p - line.ptr; } goto st168; st168: if ( ++p == pe ) goto _test_eof168; goto case; case 168: #line 3708 "sam_alignment.d" if ( (*p) == 9u ) goto tr206; if ( (*p) > 63u ) { if ( 65u <= (*p) && (*p) <= 126u ) goto st168; } else if ( (*p) >= 33u ) goto st168; goto tr0; st169: if ( ++p == pe ) goto _test_eof169; goto case; case 169: if ( (*p) == 9u ) goto tr209; goto st169; tr209: #line 51 "sam_alignment.rl" { p--; {if (true) goto st181;} } goto st239; st239: if ( ++p == pe ) goto _test_eof239; goto case; case 239: #line 3732 "sam_alignment.d" goto st0; st170: if ( ++p == pe ) goto _test_eof170; goto case; case 170: if ( (*p) == 9u ) goto tr211; goto st170; tr211: #line 59 "sam_alignment.rl" { p--; {if (true) goto st182;} } goto st240; st240: if ( ++p == pe ) goto _test_eof240; goto case; case 240: #line 3749 "sam_alignment.d" goto st0; st171: if ( ++p == pe ) goto _test_eof171; goto case; case 171: if ( (*p) == 9u ) goto tr213; goto st171; tr213: #line 68 "sam_alignment.rl" { p--; {if (true) goto st183;} } goto st241; st241: if ( ++p == pe ) goto _test_eof241; goto case; case 241: #line 3766 "sam_alignment.d" goto st0; st172: if ( ++p == pe ) goto _test_eof172; goto case; case 172: if ( (*p) == 9u ) goto tr215; goto st172; tr215: #line 76 "sam_alignment.rl" { p--; {if (true) goto st184;} } goto st242; st242: if ( ++p == pe ) goto _test_eof242; goto case; case 242: #line 3783 "sam_alignment.d" goto st0; st173: if ( ++p == pe ) goto _test_eof173; goto case; case 173: if ( (*p) == 9u ) goto tr217; goto st173; tr217: #line 82 "sam_alignment.rl" { p--; {if (true) goto st185;} } goto st243; st243: if ( ++p == pe ) goto _test_eof243; goto case; case 243: #line 3800 "sam_alignment.d" goto st0; st174: if ( ++p == pe ) goto _test_eof174; goto case; case 174: if ( (*p) == 9u ) goto tr219; goto st174; tr219: #line 131 "sam_alignment.rl" { p--; {if (true) goto st186;} } goto st244; st244: if ( ++p == pe ) goto _test_eof244; goto case; case 244: #line 3817 "sam_alignment.d" goto st0; st175: if ( ++p == pe ) goto _test_eof175; goto case; case 175: if ( (*p) == 9u ) goto tr221; goto st175; tr221: #line 163 "sam_alignment.rl" { p--; {if (true) goto st187;} } goto st245; st245: if ( ++p == pe ) goto _test_eof245; goto case; case 245: #line 3834 "sam_alignment.d" goto st0; st176: if ( ++p == pe ) goto _test_eof176; goto case; case 176: if ( (*p) == 9u ) goto tr223; goto st176; tr223: #line 176 "sam_alignment.rl" { p--; {if (true) goto st188;} } goto st246; st246: if ( ++p == pe ) goto _test_eof246; goto case; case 246: #line 3851 "sam_alignment.d" goto st0; st177: if ( ++p == pe ) goto _test_eof177; goto case; case 177: if ( (*p) == 9u ) goto tr225; goto st177; tr225: #line 188 "sam_alignment.rl" { p--; {if (true) goto st189;} } goto st247; st247: if ( ++p == pe ) goto _test_eof247; goto case; case 247: #line 3868 "sam_alignment.d" goto st0; st178: if ( ++p == pe ) goto _test_eof178; goto case; case 178: if ( (*p) == 9u ) goto tr227; goto st178; tr227: #line 221 "sam_alignment.rl" { p--; {if (true) goto st190;} } goto st248; st248: if ( ++p == pe ) goto _test_eof248; goto case; case 248: #line 3885 "sam_alignment.d" goto st0; st179: if ( ++p == pe ) goto _test_eof179; goto case; case 179: if ( (*p) == 9u ) goto tr229; goto st179; tr229: #line 251 "sam_alignment.rl" { p--; {if (true) goto st251;} } goto st249; st249: if ( ++p == pe ) goto _test_eof249; goto case; case 249: #line 3902 "sam_alignment.d" goto st0; st180: if ( ++p == pe ) goto _test_eof180; goto case; case 180: if ( (*p) == 9u ) goto tr231; goto st180; tr231: #line 408 "sam_alignment.rl" { p--; {if (true) goto st251;} } goto st250; st250: if ( ++p == pe ) goto _test_eof250; goto case; case 250: #line 3919 "sam_alignment.d" goto st0; st181: if ( ++p == pe ) goto _test_eof181; goto case; case 181: if ( (*p) == 9u ) goto st2; goto st0; st182: if ( ++p == pe ) goto _test_eof182; goto case; case 182: if ( (*p) == 9u ) goto st4; goto st0; st183: if ( ++p == pe ) goto _test_eof183; goto case; case 183: if ( (*p) == 9u ) goto st6; goto st0; st184: if ( ++p == pe ) goto _test_eof184; goto case; case 184: if ( (*p) == 9u ) goto st8; goto st0; st185: if ( ++p == pe ) goto _test_eof185; goto case; case 185: if ( (*p) == 9u ) goto tr235; goto st0; st186: if ( ++p == pe ) goto _test_eof186; goto case; case 186: if ( (*p) == 9u ) goto tr23; goto st0; st187: if ( ++p == pe ) goto _test_eof187; goto case; case 187: if ( (*p) == 9u ) goto st14; goto st0; st188: if ( ++p == pe ) goto _test_eof188; goto case; case 188: if ( (*p) == 9u ) goto st16; goto st0; st189: if ( ++p == pe ) goto _test_eof189; goto case; case 189: if ( (*p) == 9u ) goto st19; goto st0; st190: if ( ++p == pe ) goto _test_eof190; goto case; case 190: if ( (*p) == 9u ) goto st21; goto st0; st251: if ( ++p == pe ) goto _test_eof251; goto case; case 251: if ( (*p) == 9u ) goto st22; goto st0; default: break; } _test_eof2: cs = 2; goto _test_eof; _test_eof3: cs = 3; goto _test_eof; _test_eof4: cs = 4; goto _test_eof; _test_eof5: cs = 5; goto _test_eof; _test_eof6: cs = 6; goto _test_eof; _test_eof7: cs = 7; goto _test_eof; _test_eof8: cs = 8; goto _test_eof; _test_eof9: cs = 9; goto _test_eof; _test_eof10: cs = 10; goto _test_eof; _test_eof11: cs = 11; goto _test_eof; _test_eof12: cs = 12; goto _test_eof; _test_eof13: cs = 13; goto _test_eof; _test_eof14: cs = 14; goto _test_eof; _test_eof15: cs = 15; goto _test_eof; _test_eof16: cs = 16; goto _test_eof; _test_eof17: cs = 17; goto _test_eof; _test_eof18: cs = 18; goto _test_eof; _test_eof19: cs = 19; goto _test_eof; _test_eof20: cs = 20; goto _test_eof; _test_eof21: cs = 21; goto _test_eof; _test_eof191: cs = 191; goto _test_eof; _test_eof22: cs = 22; goto _test_eof; _test_eof23: cs = 23; goto _test_eof; _test_eof24: cs = 24; goto _test_eof; _test_eof25: cs = 25; goto _test_eof; _test_eof26: cs = 26; goto _test_eof; _test_eof27: cs = 27; goto _test_eof; _test_eof192: cs = 192; goto _test_eof; _test_eof28: cs = 28; goto _test_eof; _test_eof29: cs = 29; goto _test_eof; _test_eof30: cs = 30; goto _test_eof; _test_eof31: cs = 31; goto _test_eof; _test_eof32: cs = 32; goto _test_eof; _test_eof193: cs = 193; goto _test_eof; _test_eof194: cs = 194; goto _test_eof; _test_eof195: cs = 195; goto _test_eof; _test_eof196: cs = 196; goto _test_eof; _test_eof197: cs = 197; goto _test_eof; _test_eof198: cs = 198; goto _test_eof; _test_eof199: cs = 199; goto _test_eof; _test_eof200: cs = 200; goto _test_eof; _test_eof201: cs = 201; goto _test_eof; _test_eof202: cs = 202; goto _test_eof; _test_eof203: cs = 203; goto _test_eof; _test_eof204: cs = 204; goto _test_eof; _test_eof205: cs = 205; goto _test_eof; _test_eof206: cs = 206; goto _test_eof; _test_eof207: cs = 207; goto _test_eof; _test_eof208: cs = 208; goto _test_eof; _test_eof209: cs = 209; goto _test_eof; _test_eof210: cs = 210; goto _test_eof; _test_eof33: cs = 33; goto _test_eof; _test_eof34: cs = 34; goto _test_eof; _test_eof35: cs = 35; goto _test_eof; _test_eof36: cs = 36; goto _test_eof; _test_eof211: cs = 211; goto _test_eof; _test_eof37: cs = 37; goto _test_eof; _test_eof38: cs = 38; goto _test_eof; _test_eof212: cs = 212; goto _test_eof; _test_eof213: cs = 213; goto _test_eof; _test_eof39: cs = 39; goto _test_eof; _test_eof40: cs = 40; goto _test_eof; _test_eof214: cs = 214; goto _test_eof; _test_eof41: cs = 41; goto _test_eof; _test_eof42: cs = 42; goto _test_eof; _test_eof43: cs = 43; goto _test_eof; _test_eof44: cs = 44; goto _test_eof; _test_eof215: cs = 215; goto _test_eof; _test_eof45: cs = 45; goto _test_eof; _test_eof46: cs = 46; goto _test_eof; _test_eof216: cs = 216; goto _test_eof; _test_eof47: cs = 47; goto _test_eof; _test_eof48: cs = 48; goto _test_eof; _test_eof49: cs = 49; goto _test_eof; _test_eof50: cs = 50; goto _test_eof; _test_eof217: cs = 217; goto _test_eof; _test_eof51: cs = 51; goto _test_eof; _test_eof52: cs = 52; goto _test_eof; _test_eof218: cs = 218; goto _test_eof; _test_eof219: cs = 219; goto _test_eof; _test_eof53: cs = 53; goto _test_eof; _test_eof54: cs = 54; goto _test_eof; _test_eof220: cs = 220; goto _test_eof; _test_eof55: cs = 55; goto _test_eof; _test_eof56: cs = 56; goto _test_eof; _test_eof57: cs = 57; goto _test_eof; _test_eof58: cs = 58; goto _test_eof; _test_eof59: cs = 59; goto _test_eof; _test_eof221: cs = 221; goto _test_eof; _test_eof222: cs = 222; goto _test_eof; _test_eof223: cs = 223; goto _test_eof; _test_eof224: cs = 224; goto _test_eof; _test_eof225: cs = 225; goto _test_eof; _test_eof226: cs = 226; goto _test_eof; _test_eof227: cs = 227; goto _test_eof; _test_eof228: cs = 228; goto _test_eof; _test_eof229: cs = 229; goto _test_eof; _test_eof230: cs = 230; goto _test_eof; _test_eof231: cs = 231; goto _test_eof; _test_eof232: cs = 232; goto _test_eof; _test_eof233: cs = 233; goto _test_eof; _test_eof234: cs = 234; goto _test_eof; _test_eof235: cs = 235; goto _test_eof; _test_eof236: cs = 236; goto _test_eof; _test_eof237: cs = 237; goto _test_eof; _test_eof238: cs = 238; goto _test_eof; _test_eof60: cs = 60; goto _test_eof; _test_eof61: cs = 61; goto _test_eof; _test_eof62: cs = 62; goto _test_eof; _test_eof63: cs = 63; goto _test_eof; _test_eof64: cs = 64; goto _test_eof; _test_eof65: cs = 65; goto _test_eof; _test_eof66: cs = 66; goto _test_eof; _test_eof67: cs = 67; goto _test_eof; _test_eof68: cs = 68; goto _test_eof; _test_eof69: cs = 69; goto _test_eof; _test_eof70: cs = 70; goto _test_eof; _test_eof71: cs = 71; goto _test_eof; _test_eof72: cs = 72; goto _test_eof; _test_eof73: cs = 73; goto _test_eof; _test_eof74: cs = 74; goto _test_eof; _test_eof75: cs = 75; goto _test_eof; _test_eof76: cs = 76; goto _test_eof; _test_eof77: cs = 77; goto _test_eof; _test_eof78: cs = 78; goto _test_eof; _test_eof79: cs = 79; goto _test_eof; _test_eof80: cs = 80; goto _test_eof; _test_eof81: cs = 81; goto _test_eof; _test_eof82: cs = 82; goto _test_eof; _test_eof83: cs = 83; goto _test_eof; _test_eof84: cs = 84; goto _test_eof; _test_eof85: cs = 85; goto _test_eof; _test_eof86: cs = 86; goto _test_eof; _test_eof87: cs = 87; goto _test_eof; _test_eof88: cs = 88; goto _test_eof; _test_eof89: cs = 89; goto _test_eof; _test_eof90: cs = 90; goto _test_eof; _test_eof91: cs = 91; goto _test_eof; _test_eof92: cs = 92; goto _test_eof; _test_eof93: cs = 93; goto _test_eof; _test_eof94: cs = 94; goto _test_eof; _test_eof95: cs = 95; goto _test_eof; _test_eof96: cs = 96; goto _test_eof; _test_eof97: cs = 97; goto _test_eof; _test_eof98: cs = 98; goto _test_eof; _test_eof99: cs = 99; goto _test_eof; _test_eof100: cs = 100; goto _test_eof; _test_eof101: cs = 101; goto _test_eof; _test_eof102: cs = 102; goto _test_eof; _test_eof103: cs = 103; goto _test_eof; _test_eof104: cs = 104; goto _test_eof; _test_eof105: cs = 105; goto _test_eof; _test_eof106: cs = 106; goto _test_eof; _test_eof107: cs = 107; goto _test_eof; _test_eof108: cs = 108; goto _test_eof; _test_eof109: cs = 109; goto _test_eof; _test_eof110: cs = 110; goto _test_eof; _test_eof111: cs = 111; goto _test_eof; _test_eof112: cs = 112; goto _test_eof; _test_eof113: cs = 113; goto _test_eof; _test_eof114: cs = 114; goto _test_eof; _test_eof115: cs = 115; goto _test_eof; _test_eof116: cs = 116; goto _test_eof; _test_eof117: cs = 117; goto _test_eof; _test_eof118: cs = 118; goto _test_eof; _test_eof119: cs = 119; goto _test_eof; _test_eof120: cs = 120; goto _test_eof; _test_eof121: cs = 121; goto _test_eof; _test_eof122: cs = 122; goto _test_eof; _test_eof123: cs = 123; goto _test_eof; _test_eof124: cs = 124; goto _test_eof; _test_eof125: cs = 125; goto _test_eof; _test_eof126: cs = 126; goto _test_eof; _test_eof127: cs = 127; goto _test_eof; _test_eof128: cs = 128; goto _test_eof; _test_eof129: cs = 129; goto _test_eof; _test_eof130: cs = 130; goto _test_eof; _test_eof131: cs = 131; goto _test_eof; _test_eof132: cs = 132; goto _test_eof; _test_eof133: cs = 133; goto _test_eof; _test_eof134: cs = 134; goto _test_eof; _test_eof135: cs = 135; goto _test_eof; _test_eof136: cs = 136; goto _test_eof; _test_eof137: cs = 137; goto _test_eof; _test_eof138: cs = 138; goto _test_eof; _test_eof139: cs = 139; goto _test_eof; _test_eof140: cs = 140; goto _test_eof; _test_eof141: cs = 141; goto _test_eof; _test_eof142: cs = 142; goto _test_eof; _test_eof143: cs = 143; goto _test_eof; _test_eof144: cs = 144; goto _test_eof; _test_eof145: cs = 145; goto _test_eof; _test_eof146: cs = 146; goto _test_eof; _test_eof147: cs = 147; goto _test_eof; _test_eof148: cs = 148; goto _test_eof; _test_eof149: cs = 149; goto _test_eof; _test_eof150: cs = 150; goto _test_eof; _test_eof151: cs = 151; goto _test_eof; _test_eof152: cs = 152; goto _test_eof; _test_eof153: cs = 153; goto _test_eof; _test_eof154: cs = 154; goto _test_eof; _test_eof155: cs = 155; goto _test_eof; _test_eof156: cs = 156; goto _test_eof; _test_eof157: cs = 157; goto _test_eof; _test_eof158: cs = 158; goto _test_eof; _test_eof159: cs = 159; goto _test_eof; _test_eof160: cs = 160; goto _test_eof; _test_eof161: cs = 161; goto _test_eof; _test_eof162: cs = 162; goto _test_eof; _test_eof163: cs = 163; goto _test_eof; _test_eof164: cs = 164; goto _test_eof; _test_eof165: cs = 165; goto _test_eof; _test_eof166: cs = 166; goto _test_eof; _test_eof167: cs = 167; goto _test_eof; _test_eof168: cs = 168; goto _test_eof; _test_eof169: cs = 169; goto _test_eof; _test_eof239: cs = 239; goto _test_eof; _test_eof170: cs = 170; goto _test_eof; _test_eof240: cs = 240; goto _test_eof; _test_eof171: cs = 171; goto _test_eof; _test_eof241: cs = 241; goto _test_eof; _test_eof172: cs = 172; goto _test_eof; _test_eof242: cs = 242; goto _test_eof; _test_eof173: cs = 173; goto _test_eof; _test_eof243: cs = 243; goto _test_eof; _test_eof174: cs = 174; goto _test_eof; _test_eof244: cs = 244; goto _test_eof; _test_eof175: cs = 175; goto _test_eof; _test_eof245: cs = 245; goto _test_eof; _test_eof176: cs = 176; goto _test_eof; _test_eof246: cs = 246; goto _test_eof; _test_eof177: cs = 177; goto _test_eof; _test_eof247: cs = 247; goto _test_eof; _test_eof178: cs = 178; goto _test_eof; _test_eof248: cs = 248; goto _test_eof; _test_eof179: cs = 179; goto _test_eof; _test_eof249: cs = 249; goto _test_eof; _test_eof180: cs = 180; goto _test_eof; _test_eof250: cs = 250; goto _test_eof; _test_eof181: cs = 181; goto _test_eof; _test_eof182: cs = 182; goto _test_eof; _test_eof183: cs = 183; goto _test_eof; _test_eof184: cs = 184; goto _test_eof; _test_eof185: cs = 185; goto _test_eof; _test_eof186: cs = 186; goto _test_eof; _test_eof187: cs = 187; goto _test_eof; _test_eof188: cs = 188; goto _test_eof; _test_eof189: cs = 189; goto _test_eof; _test_eof190: cs = 190; goto _test_eof; _test_eof251: cs = 251; goto _test_eof; _test_eof: {} if ( p == eof ) { switch ( cs ) { case 1: case 168: #line 50 "sam_alignment.rl" { p--; {if (true) goto st169;} } break; case 2: case 3: case 151: case 152: case 153: case 154: case 155: case 156: case 157: case 158: case 159: case 160: case 161: case 162: case 163: case 164: case 165: case 166: case 167: #line 58 "sam_alignment.rl" { p--; {if (true) goto st170;} } break; case 4: case 5: case 150: #line 67 "sam_alignment.rl" { p--; {if (true) goto st171;} } break; case 6: case 7: case 133: case 134: case 135: case 136: case 137: case 138: case 139: case 140: case 141: case 142: case 143: case 144: case 145: case 146: case 147: case 148: case 149: #line 75 "sam_alignment.rl" { p--; {if (true) goto st172;} } break; case 8: case 9: case 116: case 117: case 118: case 119: case 120: case 121: case 122: case 123: case 124: case 125: case 126: case 127: case 128: case 129: case 130: case 131: case 132: #line 81 "sam_alignment.rl" { p--; {if (true) goto st173;} } break; case 10: case 11: case 97: case 98: case 99: case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 107: case 108: case 109: case 110: case 111: case 112: case 113: case 114: case 115: #line 124 "sam_alignment.rl" { auto ptr = cast(uint*)(buffer.data.ptr + 3 * uint.sizeof); *ptr = (*ptr) & 0xFFFF0000; buffer.shrink(rollback_size); end_pos = pos + 1; p--; {if (true) goto st174;} } break; case 12: case 13: case 95: case 96: #line 162 "sam_alignment.rl" { p--; {if (true) goto st175;} } break; case 14: case 15: case 78: case 79: case 80: case 81: case 82: case 83: case 84: case 85: case 86: case 87: case 88: case 89: case 90: case 91: case 92: case 93: case 94: #line 175 "sam_alignment.rl" { p--; {if (true) goto st176;} } break; case 16: case 17: case 18: case 61: case 62: case 63: case 64: case 65: case 66: case 67: case 68: case 69: case 70: case 71: case 72: case 73: case 74: case 75: case 76: case 77: #line 187 "sam_alignment.rl" { p--; {if (true) goto st177;} } break; case 19: case 20: case 60: #line 217 "sam_alignment.rl" { rollback_size = buffer.length; p--; {if (true) goto st178;} } break; case 21: #line 243 "sam_alignment.rl" { buffer.shrink(rollback_size); for (size_t i = 0; i < l_seq; ++i) buffer.putUnsafe!ubyte(0xFF); rollback_size = buffer.length; p--; {if (true) goto st179;} } break; case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: case 48: case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: case 58: case 59: #line 403 "sam_alignment.rl" { buffer.shrink(rollback_size); p--; {if (true) goto st180;} } break; case 192: #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } break; case 191: #line 236 "sam_alignment.rl" { // '*' may correspond either to a one-base long sequence // or to absence of information if (quals_length == 1 && quals_last_char == '*' && l_seq == 0) buffer.shrink(rollback_size); } #line 253 "sam_alignment.rl" { if (buffer.length - rollback_size != l_seq) { buffer.shrink(rollback_size); for (size_t i = 0; i < l_seq; ++i) buffer.putUnsafe!ubyte(0xFF); } rollback_size = buffer.length; } break; case 216: #line 326 "sam_alignment.rl" { { auto data = cast(ubyte[])(line[tagvalue_beg .. p - line.ptr]); buffer.capacity = buffer.length + 4 + data.length; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('Z'); buffer.putUnsafe(data); buffer.putUnsafe!ubyte(0); } } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } break; case 215: #line 337 "sam_alignment.rl" { { auto data = cast(ubyte[])(line[tagvalue_beg .. p - line.ptr]); buffer.capacity = buffer.length + 4 + data.length; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('H'); buffer.putUnsafe(data); buffer.putUnsafe!ubyte(0); } } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } break; case 221: case 222: case 223: case 224: case 225: case 226: case 227: case 228: case 229: case 230: case 231: case 232: case 233: case 234: case 235: case 236: case 237: case 238: #line 30 "sam_alignment.rl" { int_value *= current_sign; current_sign = 1; } #line 285 "sam_alignment.rl" { buffer.capacity = buffer.length + 7; buffer.putUnsafe(tag_key); if (int_value < 0) { if (int_value >= byte.min) { buffer.putUnsafe!char('c'); buffer.putUnsafe(cast(byte)int_value); } else if (int_value >= short.min) { buffer.putUnsafe!char('s'); buffer.putUnsafe(cast(short)int_value); } else if (int_value >= int.min) { buffer.putUnsafe!char('i'); buffer.putUnsafe(cast(int)int_value); } else { throw new Exception("integer out of range"); } } else { if (int_value <= ubyte.max) { buffer.putUnsafe!char('C'); buffer.putUnsafe(cast(ubyte)int_value); } else if (int_value <= ushort.max) { buffer.putUnsafe!char('S'); buffer.putUnsafe(cast(ushort)int_value); } else if (int_value <= uint.max) { buffer.putUnsafe!char('I'); buffer.putUnsafe(cast(uint)int_value); } else { throw new Exception("integer out of range"); } } } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } break; case 193: case 194: case 195: case 196: case 197: case 198: case 199: case 200: case 201: case 202: case 203: case 204: case 205: case 206: case 207: case 208: case 209: case 210: #line 30 "sam_alignment.rl" { int_value *= current_sign; current_sign = 1; } #line 362 "sam_alignment.rl" { // here, we assume that compiler is smart enough to move switch out of loop. switch (arraytype) { case 'c': buffer.put(to!byte(int_value)); break; case 'C': buffer.put(to!ubyte(int_value)); break; case 's': buffer.put(to!short(int_value)); break; case 'S': buffer.put(to!ushort(int_value)); break; case 'i': buffer.put(to!int(int_value)); break; case 'I': buffer.put(to!uint(int_value)); break; default: assert(0); } { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } break; case 217: case 218: case 219: case 220: #line 38 "sam_alignment.rl" { float_value = to!float(line[float_beg .. p - line.ptr]); } #line 319 "sam_alignment.rl" { buffer.capacity = buffer.length + 7; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('f'); buffer.putUnsafe!float(float_value); } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } break; case 211: case 212: case 213: case 214: #line 38 "sam_alignment.rl" { float_value = to!float(line[float_beg .. p - line.ptr]); } #line 379 "sam_alignment.rl" { buffer.put!float(float_value); { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } break; #line 4658 "sam_alignment.d" default: break; } } _out: {} } #line 480 "sam_alignment.rl" BamRead read; read.raw_data = buffer.data[]; return read; } unittest { import std.algorithm; import std.math; auto line = "ERR016155.15021091\t185\t20\t60033\t25\t66S35M\t=\t60033\t0\tAGAAAAAACTGGAAGTTAATAGAGTGGTGACTCAGATCCAGTGGTGGAAGGGTAAGGGATCTTGGAACCCTATAGAGTTGCTGTGTGCCAGGGCCAGATCC\t#####################################################################################################\tX0:i:1\tX1:i:0\tXC:i:35\tMD:Z:17A8A8\tRG:Z:ERR016155\tAM:i:0\tNM:i:2\tSM:i:25\tXT:A:U\tBQ:Z:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\tY0:B:c,1,2,3\tY1:B:f,13.263,-3.1415,52.63461"; auto header = new SamHeader("@SQ\tSN:20\tLN:1234567"); auto alignment = parseAlignmentLine(line, header); assert(alignment.name == "ERR016155.15021091"); assert(equal(alignment.sequence(), "AGAAAAAACTGGAAGTTAATAGAGTGGTGACTCAGATCCAGTGGTGGAAGGGTAAGGGATCTTGGAACCCTATAGAGTTGCTGTGTGCCAGGGCCAGATCC")); assert(alignment.cigarString() == "66S35M"); assert(alignment.flag == 185); assert(alignment.position == 60032); assert(alignment.mapping_quality == 25); assert(alignment.mate_position == 60032); assert(alignment.ref_id == 0); assert(alignment.mate_ref_id == 0); assert(to!ubyte(alignment["AM"]) == 0); assert(to!ubyte(alignment["SM"]) == 25); assert(to!string(alignment["MD"]) == "17A8A8"); assert(equal(to!(byte[])(alignment["Y0"]), [1, 2, 3])); assert(equal!approxEqual(to!(float[])(alignment["Y1"]), [13.263, -3.1415, 52.63461])); assert(to!char(alignment["XT"]) == 'U'); import bio.bam.reference; auto info = ReferenceSequenceInfo("20", 1234567); auto invalid_cigar_string = "1\t100\t20\t50000\t30\tMZABC\t=\t50000\t0\tACGT\t####"; alignment = parseAlignmentLine(invalid_cigar_string, header); assert(equal(alignment.sequence(), "ACGT")); auto invalid_tag_and_qual = "2\t100\t20\t5\t40\t27M30X5D\t=\t3\t10\tACT\t !\n\tX1:i:7\tX3:i:zzz\tX4:i:5"; alignment = parseAlignmentLine(invalid_tag_and_qual, header); assert(alignment.base_qualities == [255, 255, 255]); // i.e. invalid assert(to!ubyte(alignment["X1"]) == 7); assert(alignment["X3"].is_nothing); assert(to!ubyte(alignment["X4"]) == 5); } BioD-0.1.0/bio/sam/utils/recordparser.d000066400000000000000000001260431273003163100176600ustar00rootroot00000000000000module bio.sam.utils.recordparser; #line 1 "sam_alignment.rl" /* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #line 28 "sam_alignment.d" static byte[] _sam_alignment_actions = [ 0, 1, 0, 1, 2, 1, 4, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1, 16, 1, 17, 1, 18, 1, 19, 1, 21, 1, 22, 1, 23, 1, 27, 1, 28, 1, 29, 1, 30, 1, 31, 1, 32, 1, 33, 1, 34, 1, 35, 1, 36, 1, 37, 1, 39, 1, 40, 1, 41, 1, 42, 1, 43, 1, 44, 1, 45, 1, 46, 1, 48, 1, 49, 1, 51, 1, 53, 1, 57, 1, 60, 1, 61, 1, 62, 1, 63, 1, 64, 2, 1, 2, 2, 3, 38, 2, 3, 58, 2, 5, 59, 2, 6, 7, 2, 20, 23, 2, 24, 25, 2, 26, 29, 2, 47, 50, 2, 55, 64, 2, 56, 64, 3, 3, 52, 64, 3, 3, 58, 64, 3, 5, 54, 64, 3, 5, 59, 64, 3, 26, 1, 2 ]; static short[] _sam_alignment_key_offsets = [ 0, 0, 5, 7, 10, 15, 18, 20, 23, 25, 28, 31, 32, 36, 39, 41, 44, 48, 50, 53, 60, 61, 63, 67, 73, 74, 80, 81, 83, 84, 91, 92, 96, 98, 99, 106, 110, 112, 116, 118, 119, 120, 121, 122, 123, 129, 130, 132, 133, 140, 144, 146, 150, 152, 153, 154, 155, 156, 157, 161, 163, 170, 173, 176, 179, 182, 185, 188, 191, 194, 197, 200, 203, 206, 209, 212, 215, 218, 219, 222, 225, 228, 231, 234, 237, 240, 243, 246, 249, 252, 255, 258, 261, 264, 267, 268, 269, 270, 281, 292, 303, 314, 325, 336, 347, 358, 369, 380, 391, 402, 413, 424, 435, 446, 457, 466, 469, 472, 475, 478, 481, 484, 487, 490, 493, 496, 499, 502, 505, 508, 511, 514, 517, 518, 521, 524, 527, 530, 533, 536, 539, 542, 545, 548, 551, 554, 557, 560, 563, 566, 567, 568, 571, 574, 577, 580, 583, 586, 589, 592, 595, 598, 601, 604, 607, 610, 613, 616, 617, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 647, 648, 652, 656, 660, 664, 668, 672, 676, 680, 684, 688, 692, 696, 700, 704, 708, 712, 716, 718, 724, 728, 735, 737, 744, 747, 752, 755, 761, 762, 765, 768, 771, 774, 777, 780, 783, 786, 789, 792, 795, 798, 801, 804, 807, 810, 813, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814 ]; static char[] _sam_alignment_trans_keys = [ 9u, 33u, 63u, 65u, 126u, 48u, 57u, 9u, 48u, 57u, 42u, 33u, 60u, 62u, 126u, 9u, 33u, 126u, 48u, 57u, 9u, 48u, 57u, 48u, 57u, 9u, 48u, 57u, 42u, 48u, 57u, 9u, 42u, 61u, 33u, 126u, 9u, 33u, 126u, 48u, 57u, 9u, 48u, 57u, 43u, 45u, 48u, 57u, 48u, 57u, 9u, 48u, 57u, 42u, 46u, 61u, 65u, 90u, 97u, 122u, 9u, 33u, 126u, 65u, 90u, 97u, 122u, 48u, 57u, 65u, 90u, 97u, 122u, 58u, 65u, 66u, 72u, 90u, 102u, 105u, 58u, 33u, 126u, 58u, 67u, 73u, 83u, 99u, 102u, 105u, 115u, 44u, 43u, 45u, 48u, 57u, 48u, 57u, 44u, 43u, 45u, 46u, 105u, 110u, 48u, 57u, 46u, 105u, 48u, 57u, 48u, 57u, 43u, 45u, 48u, 57u, 48u, 57u, 110u, 102u, 97u, 110u, 58u, 48u, 57u, 65u, 70u, 97u, 102u, 58u, 32u, 126u, 58u, 43u, 45u, 46u, 105u, 110u, 48u, 57u, 46u, 105u, 48u, 57u, 48u, 57u, 43u, 45u, 48u, 57u, 48u, 57u, 110u, 102u, 97u, 110u, 58u, 43u, 45u, 48u, 57u, 48u, 57u, 9u, 46u, 61u, 65u, 90u, 97u, 122u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 9u, 9u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 48u, 57u, 72u, 73u, 77u, 78u, 61u, 68u, 80u, 83u, 88u, 72u, 73u, 77u, 78u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 9u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 9u, 33u, 63u, 65u, 126u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 9u, 33u, 126u, 9u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 9u, 44u, 69u, 101u, 48u, 57u, 9u, 44u, 48u, 57u, 9u, 44u, 46u, 69u, 101u, 48u, 57u, 9u, 44u, 9u, 48u, 57u, 65u, 70u, 97u, 102u, 9u, 32u, 126u, 9u, 69u, 101u, 48u, 57u, 9u, 48u, 57u, 9u, 46u, 69u, 101u, 48u, 57u, 9u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 48u, 57u, 9u, 9u, 0 ]; static byte[] _sam_alignment_single_lengths = [ 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 2, 1, 0, 1, 2, 0, 1, 3, 1, 0, 0, 0, 1, 6, 1, 0, 1, 7, 1, 2, 0, 1, 5, 2, 0, 2, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 5, 2, 0, 2, 0, 1, 1, 1, 1, 1, 2, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 5, 2, 1, 1, 3, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ]; static byte[] _sam_alignment_range_lengths = [ 0, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 0, 1, 2, 3, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 3, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 3, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]; static short[] _sam_alignment_index_offsets = [ 0, 0, 4, 6, 9, 13, 16, 18, 21, 23, 26, 29, 31, 35, 38, 40, 43, 47, 49, 52, 58, 60, 62, 65, 69, 71, 78, 80, 82, 84, 92, 94, 98, 100, 102, 109, 113, 115, 119, 121, 123, 125, 127, 129, 131, 135, 137, 139, 141, 148, 152, 154, 158, 160, 162, 164, 166, 168, 170, 174, 176, 182, 185, 188, 191, 194, 197, 200, 203, 206, 209, 212, 215, 218, 221, 224, 227, 230, 232, 235, 238, 241, 244, 247, 250, 253, 256, 259, 262, 265, 268, 271, 274, 277, 280, 282, 284, 286, 295, 304, 313, 322, 331, 340, 349, 358, 367, 376, 385, 394, 403, 412, 421, 430, 439, 447, 450, 453, 456, 459, 462, 465, 468, 471, 474, 477, 480, 483, 486, 489, 492, 495, 498, 500, 503, 506, 509, 512, 515, 518, 521, 524, 527, 530, 533, 536, 539, 542, 545, 548, 550, 552, 555, 558, 561, 564, 567, 570, 573, 576, 579, 582, 585, 588, 591, 594, 597, 600, 602, 606, 608, 610, 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, 644, 646, 648, 650, 653, 655, 659, 663, 667, 671, 675, 679, 683, 687, 691, 695, 699, 703, 707, 711, 715, 719, 723, 726, 732, 736, 743, 746, 751, 754, 759, 762, 768, 770, 773, 776, 779, 782, 785, 788, 791, 794, 797, 800, 803, 806, 809, 812, 815, 818, 821, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835 ]; static ubyte[] _sam_alignment_trans_targs = [ 2, 168, 168, 0, 3, 0, 4, 151, 0, 150, 5, 5, 0, 6, 5, 0, 7, 0, 8, 133, 0, 9, 0, 10, 116, 0, 11, 97, 0, 12, 0, 95, 96, 13, 0, 14, 13, 0, 15, 0, 16, 78, 0, 17, 17, 18, 0, 18, 0, 19, 61, 0, 20, 60, 60, 60, 60, 0, 21, 0, 191, 0, 23, 23, 0, 24, 24, 24, 0, 25, 0, 26, 28, 43, 45, 47, 57, 0, 27, 0, 192, 0, 29, 0, 30, 30, 30, 30, 33, 30, 30, 0, 31, 0, 32, 32, 193, 0, 193, 0, 34, 0, 35, 35, 36, 39, 41, 213, 0, 36, 39, 213, 0, 211, 0, 38, 38, 212, 0, 212, 0, 40, 0, 214, 0, 42, 0, 214, 0, 44, 0, 215, 215, 215, 0, 46, 0, 216, 0, 48, 0, 49, 49, 50, 53, 55, 219, 0, 50, 53, 219, 0, 217, 0, 52, 52, 218, 0, 218, 0, 54, 0, 220, 0, 56, 0, 220, 0, 58, 0, 59, 59, 221, 0, 221, 0, 21, 60, 60, 60, 60, 0, 19, 62, 0, 19, 63, 0, 19, 64, 0, 19, 65, 0, 19, 66, 0, 19, 67, 0, 19, 68, 0, 19, 69, 0, 19, 70, 0, 19, 71, 0, 19, 72, 0, 19, 73, 0, 19, 74, 0, 19, 75, 0, 19, 76, 0, 19, 77, 0, 19, 0, 16, 79, 0, 16, 80, 0, 16, 81, 0, 16, 82, 0, 16, 83, 0, 16, 84, 0, 16, 85, 0, 16, 86, 0, 16, 87, 0, 16, 88, 0, 16, 89, 0, 16, 90, 0, 16, 91, 0, 16, 92, 0, 16, 93, 0, 16, 94, 0, 16, 0, 14, 0, 14, 0, 115, 115, 115, 115, 115, 98, 115, 115, 0, 115, 115, 115, 115, 115, 99, 115, 115, 0, 115, 115, 115, 115, 115, 100, 115, 115, 0, 115, 115, 115, 115, 115, 101, 115, 115, 0, 115, 115, 115, 115, 115, 102, 115, 115, 0, 115, 115, 115, 115, 115, 103, 115, 115, 0, 115, 115, 115, 115, 115, 104, 115, 115, 0, 115, 115, 115, 115, 115, 105, 115, 115, 0, 115, 115, 115, 115, 115, 106, 115, 115, 0, 115, 115, 115, 115, 115, 107, 115, 115, 0, 115, 115, 115, 115, 115, 108, 115, 115, 0, 115, 115, 115, 115, 115, 109, 115, 115, 0, 115, 115, 115, 115, 115, 110, 115, 115, 0, 115, 115, 115, 115, 115, 111, 115, 115, 0, 115, 115, 115, 115, 115, 112, 115, 115, 0, 115, 115, 115, 115, 115, 113, 115, 115, 0, 115, 115, 115, 115, 115, 114, 115, 115, 0, 115, 115, 115, 115, 115, 115, 115, 0, 12, 97, 0, 10, 117, 0, 10, 118, 0, 10, 119, 0, 10, 120, 0, 10, 121, 0, 10, 122, 0, 10, 123, 0, 10, 124, 0, 10, 125, 0, 10, 126, 0, 10, 127, 0, 10, 128, 0, 10, 129, 0, 10, 130, 0, 10, 131, 0, 10, 132, 0, 10, 0, 8, 134, 0, 8, 135, 0, 8, 136, 0, 8, 137, 0, 8, 138, 0, 8, 139, 0, 8, 140, 0, 8, 141, 0, 8, 142, 0, 8, 143, 0, 8, 144, 0, 8, 145, 0, 8, 146, 0, 8, 147, 0, 8, 148, 0, 8, 149, 0, 8, 0, 6, 0, 4, 152, 0, 4, 153, 0, 4, 154, 0, 4, 155, 0, 4, 156, 0, 4, 157, 0, 4, 158, 0, 4, 159, 0, 4, 160, 0, 4, 161, 0, 4, 162, 0, 4, 163, 0, 4, 164, 0, 4, 165, 0, 4, 166, 0, 4, 167, 0, 4, 0, 2, 168, 168, 0, 239, 169, 240, 170, 241, 171, 242, 172, 243, 173, 244, 174, 245, 175, 246, 176, 247, 177, 248, 178, 249, 179, 250, 180, 2, 0, 4, 0, 6, 0, 8, 0, 10, 0, 12, 0, 14, 0, 16, 0, 19, 0, 21, 0, 22, 191, 0, 22, 0, 22, 31, 194, 0, 22, 31, 195, 0, 22, 31, 196, 0, 22, 31, 197, 0, 22, 31, 198, 0, 22, 31, 199, 0, 22, 31, 200, 0, 22, 31, 201, 0, 22, 31, 202, 0, 22, 31, 203, 0, 22, 31, 204, 0, 22, 31, 205, 0, 22, 31, 206, 0, 22, 31, 207, 0, 22, 31, 208, 0, 22, 31, 209, 0, 22, 31, 210, 0, 22, 31, 0, 22, 34, 37, 37, 211, 0, 22, 34, 212, 0, 22, 34, 36, 37, 37, 213, 0, 22, 34, 0, 22, 215, 215, 215, 0, 22, 216, 0, 22, 51, 51, 217, 0, 22, 218, 0, 22, 50, 51, 51, 219, 0, 22, 0, 22, 222, 0, 22, 223, 0, 22, 224, 0, 22, 225, 0, 22, 226, 0, 22, 227, 0, 22, 228, 0, 22, 229, 0, 22, 230, 0, 22, 231, 0, 22, 232, 0, 22, 233, 0, 22, 234, 0, 22, 235, 0, 22, 236, 0, 22, 237, 0, 22, 238, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0 ]; static ubyte[] _sam_alignment_trans_actions = [ 111, 7, 7, 11, 99, 17, 15, 3, 17, 0, 21, 21, 25, 23, 0, 25, 99, 31, 29, 3, 31, 99, 35, 114, 3, 35, 0, 99, 41, 45, 41, 0, 0, 49, 53, 51, 0, 53, 99, 59, 57, 3, 59, 1, 1, 99, 63, 99, 63, 102, 3, 63, 0, 67, 67, 67, 67, 71, 75, 71, 77, 79, 89, 89, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 93, 0, 93, 83, 93, 0, 93, 87, 87, 87, 87, 87, 87, 87, 93, 0, 93, 1, 1, 99, 93, 99, 93, 0, 93, 5, 5, 5, 5, 5, 5, 93, 0, 0, 0, 93, 0, 93, 0, 0, 0, 93, 0, 93, 0, 93, 0, 93, 0, 93, 0, 93, 0, 93, 85, 85, 85, 93, 0, 93, 85, 93, 0, 93, 5, 5, 5, 5, 5, 5, 93, 0, 0, 0, 93, 0, 93, 0, 0, 0, 93, 0, 93, 0, 93, 0, 93, 0, 93, 0, 93, 0, 93, 1, 1, 99, 93, 99, 93, 69, 0, 0, 0, 0, 71, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 3, 63, 102, 63, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 3, 59, 57, 59, 0, 53, 47, 53, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 3, 117, 117, 41, 117, 117, 117, 117, 117, 117, 117, 41, 120, 148, 41, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 3, 35, 114, 35, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 3, 31, 29, 31, 0, 25, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 3, 17, 15, 17, 9, 0, 0, 11, 13, 0, 19, 0, 27, 0, 33, 0, 37, 0, 43, 0, 55, 0, 61, 0, 65, 0, 73, 0, 81, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 77, 79, 97, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 3, 93, 136, 105, 93, 144, 108, 0, 0, 0, 93, 144, 108, 0, 93, 144, 108, 0, 0, 0, 0, 93, 144, 108, 93, 129, 0, 0, 0, 93, 126, 0, 93, 140, 0, 0, 0, 93, 140, 0, 93, 140, 0, 0, 0, 0, 93, 140, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 3, 93, 132, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]; static ubyte[] _sam_alignment_eof_actions = [ 0, 11, 17, 17, 25, 25, 31, 31, 35, 35, 41, 41, 53, 53, 59, 59, 63, 63, 63, 71, 71, 79, 0, 0, 0, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 71, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 53, 53, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 25, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 97, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 144, 144, 144, 144, 129, 126, 140, 140, 140, 140, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]; static int sam_alignment_start = 1; static int sam_alignment_first_final = 191; static int sam_alignment_error = 0; static int sam_alignment_en_recover_from_invalid_qname = 169; static int sam_alignment_en_recover_from_invalid_flag = 170; static int sam_alignment_en_recover_from_invalid_rname = 171; static int sam_alignment_en_recover_from_invalid_pos = 172; static int sam_alignment_en_recover_from_invalid_mapq = 173; static int sam_alignment_en_recover_from_invalid_cigar = 174; static int sam_alignment_en_recover_from_invalid_rnext = 175; static int sam_alignment_en_recover_from_invalid_pnext = 176; static int sam_alignment_en_recover_from_invalid_tlen = 177; static int sam_alignment_en_recover_from_invalid_seq = 178; static int sam_alignment_en_recover_from_invalid_qual = 179; static int sam_alignment_en_recover_from_invalid_tag = 180; static int sam_alignment_en_alignment = 1; static int sam_alignment_en_alignment_field_parsing_mandatoryfields_flag_parsing = 181; static int sam_alignment_en_alignment_field_parsing_mandatoryfields_rname_parsing = 182; static int sam_alignment_en_alignment_field_parsing_mandatoryfields_pos_parsing = 183; static int sam_alignment_en_alignment_field_parsing_mandatoryfields_mapq_parsing = 184; static int sam_alignment_en_alignment_field_parsing_mandatoryfields_cigar_parsing = 185; static int sam_alignment_en_alignment_field_parsing_mandatoryfields_rnext_parsing = 186; static int sam_alignment_en_alignment_field_parsing_mandatoryfields_pnext_parsing = 187; static int sam_alignment_en_alignment_field_parsing_mandatoryfields_tlen_parsing = 188; static int sam_alignment_en_alignment_field_parsing_mandatoryfields_seq_parsing = 189; static int sam_alignment_en_alignment_field_parsing_mandatoryfields_qual_parsing = 190; static int sam_alignment_en_alignment_tag_parsing = 251; #line 419 "sam_alignment.rl" import bio.sam.header; import bio.bam.read; import bio.bam.bai.bin; import bio.core.utils.outbuffer; import bio.core.base; import std.conv; import std.array; import std.exception; BamRead parseAlignmentLine(string line, SamHeader header, OutBuffer buffer=null) { char* p = cast(char*)line.ptr; char* pe = p + line.length; char* eof = pe; int cs; if (buffer is null) buffer = new OutBuffer(8192); else buffer.clear(); size_t rollback_size; // needed in case of invalid data byte current_sign = 1; size_t read_name_beg; // position of beginning of QNAME size_t sequence_beg; // position of SEQ start int l_seq; // sequence length uint cigar_op_len; // length of CIGAR operation char cigar_op_chr; // CIGAR operation size_t quals_length; // number of QUAL characters char quals_last_char; // needed in order to handle '*' correctly size_t cigar_op_len_start; // position of start of CIGAR operation long int_value; // for storing temporary integers float float_value; // for storing temporary floats size_t float_beg; // position of start of current float char arraytype; // type of last array tag value size_t tag_array_length_offset; // where the length is stored in the buffer string read_name; ushort flag; int pos = -1; int end_pos; // for bin calculation int mate_pos = -1; ubyte mapping_quality = 255; int template_length = 0; size_t tag_key_beg, tagvalue_beg; ubyte[] tag_key; size_t rname_beg, rnext_beg; int ref_id = -1; #line 639 "sam_alignment.d" { cs = sam_alignment_start; } #line 479 "sam_alignment.rl" #line 646 "sam_alignment.d" { int _klen; uint _trans; byte* _acts; uint _nacts; char* _keys; if ( p == pe ) goto _test_eof; if ( cs == 0 ) goto _out; _resume: _keys = &_sam_alignment_trans_keys[_sam_alignment_key_offsets[cs]]; _trans = _sam_alignment_index_offsets[cs]; _klen = _sam_alignment_single_lengths[cs]; if ( _klen > 0 ) { char* _lower = _keys; char* _mid; char* _upper = _keys + _klen - 1; while (1) { if ( _upper < _lower ) break; _mid = _lower + ((_upper-_lower) >> 1); if ( (*p) < *_mid ) _upper = _mid - 1; else if ( (*p) > *_mid ) _lower = _mid + 1; else { _trans += cast(uint)(_mid - _keys); goto _match; } } _keys += _klen; _trans += _klen; } _klen = _sam_alignment_range_lengths[cs]; if ( _klen > 0 ) { char* _lower = _keys; char* _mid; char* _upper = _keys + (_klen<<1) - 2; while (1) { if ( _upper < _lower ) break; _mid = _lower + (((_upper-_lower) >> 1) & ~1); if ( (*p) < _mid[0] ) _upper = _mid - 2; else if ( (*p) > _mid[1] ) _lower = _mid + 2; else { _trans += cast(uint)((_mid - _keys)>>1); goto _match; } } _trans += _klen; } _match: cs = _sam_alignment_trans_targs[_trans]; if ( _sam_alignment_trans_actions[_trans] == 0 ) goto _again; _acts = &_sam_alignment_actions[_sam_alignment_trans_actions[_trans]]; _nacts = cast(uint) *_acts++; while ( _nacts-- > 0 ) { switch ( *_acts++ ) { case 0: #line 27 "sam_alignment.rl" { current_sign = (*p) == '-' ? -1 : 1; } break; case 1: #line 28 "sam_alignment.rl" { int_value = 0; } break; case 2: #line 29 "sam_alignment.rl" { int_value *= 10; int_value += (*p) - '0'; } break; case 3: #line 30 "sam_alignment.rl" { int_value *= current_sign; current_sign = 1; } break; case 4: #line 37 "sam_alignment.rl" { float_beg = p - line.ptr; } break; case 5: #line 38 "sam_alignment.rl" { float_value = to!float(line[float_beg .. p - line.ptr]); } break; case 6: #line 48 "sam_alignment.rl" { read_name_beg = p - line.ptr; } break; case 7: #line 49 "sam_alignment.rl" { read_name = line[read_name_beg .. p - line.ptr]; } break; case 8: #line 50 "sam_alignment.rl" { p--; {cs = 169; if (true) goto _again;} } break; case 9: #line 51 "sam_alignment.rl" { p--; {cs = 181; if (true) goto _again;} } break; case 10: #line 56 "sam_alignment.rl" { flag = to!ushort(int_value); } break; case 11: #line 58 "sam_alignment.rl" { p--; {cs = 170; if (true) goto _again;} } break; case 12: #line 59 "sam_alignment.rl" { p--; {cs = 182; if (true) goto _again;} } break; case 13: #line 62 "sam_alignment.rl" { rname_beg = p - line.ptr; } break; case 14: #line 63 "sam_alignment.rl" { ref_id = header.getSequenceIndex(line[rname_beg .. p - line.ptr]); } break; case 15: #line 67 "sam_alignment.rl" { p--; {cs = 171; if (true) goto _again;} } break; case 16: #line 68 "sam_alignment.rl" { p--; {cs = 183; if (true) goto _again;} } break; case 17: #line 73 "sam_alignment.rl" { end_pos = pos = to!uint(int_value); } break; case 18: #line 75 "sam_alignment.rl" { p--; {cs = 172; if (true) goto _again;} } break; case 19: #line 76 "sam_alignment.rl" { p--; {cs = 184; if (true) goto _again;} } break; case 20: #line 79 "sam_alignment.rl" { mapping_quality = to!ubyte(int_value); } break; case 21: #line 81 "sam_alignment.rl" { p--; {cs = 173; if (true) goto _again;} } break; case 22: #line 82 "sam_alignment.rl" { p--; {cs = 185; if (true) goto _again;} } break; case 23: #line 85 "sam_alignment.rl" { buffer.capacity = 32 + read_name.length + 1; buffer.putUnsafe!int(ref_id); buffer.putUnsafe!int(pos - 1); enforce(read_name.length + 1 <= 255, "Read name " ~ read_name ~ " is too long!"); // bin will be set later auto bin_mq_nl = ((cast(uint)mapping_quality) << 8) | (read_name.length + 1); buffer.putUnsafe(cast(uint)bin_mq_nl); // number of CIGAR operations will be set later buffer.putUnsafe!uint(flag << 16); buffer.putUnsafe!int(0); buffer.putUnsafe!int(-1); // mate ref. id buffer.putUnsafe!int(-1); // mate pos buffer.putUnsafe!int(0); // tlen buffer.putUnsafe(cast(ubyte[])read_name); buffer.putUnsafe!ubyte(0); rollback_size = buffer.length; } break; case 24: #line 111 "sam_alignment.rl" { cigar_op_len = to!uint(int_value); } break; case 25: #line 112 "sam_alignment.rl" { cigar_op_chr = (*p); } break; case 26: #line 113 "sam_alignment.rl" { auto op = CigarOperation(cigar_op_len, cigar_op_chr); if (op.is_reference_consuming) end_pos += op.length; buffer.put!CigarOperation(op); { auto ptr = cast(uint*)(buffer.data.ptr + 3 * uint.sizeof); *ptr = (*ptr) + 1; } } break; case 27: #line 124 "sam_alignment.rl" { auto ptr = cast(uint*)(buffer.data.ptr + 3 * uint.sizeof); *ptr = (*ptr) & 0xFFFF0000; buffer.shrink(rollback_size); end_pos = pos + 1; p--; {cs = 174; if (true) goto _again;} } break; case 28: #line 131 "sam_alignment.rl" { p--; {cs = 186; if (true) goto _again;} } break; case 29: #line 137 "sam_alignment.rl" { if (end_pos == pos) ++end_pos; { auto bin = reg2bin(pos - 1, end_pos - 1); // 0-based [) interval auto ptr = cast(uint*)(buffer.data.ptr + 2 * uint.sizeof); *ptr = (*ptr) | ((cast(uint)bin) << 16); } } break; case 30: #line 148 "sam_alignment.rl" { { auto ptr = cast(int*)(buffer.data.ptr + 5 * int.sizeof); *ptr = ref_id; } } break; case 31: #line 155 "sam_alignment.rl" { rnext_beg = p - line.ptr; } break; case 32: #line 156 "sam_alignment.rl" { { auto ptr = cast(int*)(buffer.data.ptr + 5 * int.sizeof); *ptr = header.getSequenceIndex(line[rnext_beg .. p - line.ptr]); } } break; case 33: #line 162 "sam_alignment.rl" { p--; {cs = 175; if (true) goto _again;} } break; case 34: #line 163 "sam_alignment.rl" { p--; {cs = 187; if (true) goto _again;} } break; case 35: #line 169 "sam_alignment.rl" { { auto ptr = cast(int*)(buffer.data.ptr + 6 * int.sizeof); *ptr = to!int(int_value) - 1; } } break; case 36: #line 175 "sam_alignment.rl" { p--; {cs = 176; if (true) goto _again;} } break; case 37: #line 176 "sam_alignment.rl" { p--; {cs = 188; if (true) goto _again;} } break; case 38: #line 181 "sam_alignment.rl" { { auto ptr = cast(int*)(buffer.data.ptr + 7 * int.sizeof); *ptr = to!int(int_value); } } break; case 39: #line 187 "sam_alignment.rl" { p--; {cs = 177; if (true) goto _again;} } break; case 40: #line 188 "sam_alignment.rl" { p--; {cs = 189; if (true) goto _again;} } break; case 41: #line 193 "sam_alignment.rl" { sequence_beg = p - line.ptr; } break; case 42: #line 194 "sam_alignment.rl" { auto data = cast(ubyte[])line[sequence_beg .. p - line.ptr]; l_seq = cast(int)data.length; auto raw_len = (l_seq + 1) / 2; // reserve space for base qualities, too buffer.capacity = buffer.length + raw_len + l_seq; for (size_t i = 0; i < raw_len; ++i) { auto b = cast(ubyte)(Base(data[2 * i]).internal_code << 4); if (2 * i + 1 < l_seq) b |= cast(ubyte)(Base(data[2 * i + 1]).internal_code); buffer.putUnsafe!ubyte(b); } // set l_seq { auto ptr = cast(int*)(buffer.data.ptr + 4 * int.sizeof); *ptr = l_seq; } rollback_size = buffer.length; } break; case 43: #line 217 "sam_alignment.rl" { rollback_size = buffer.length; p--; {cs = 178; if (true) goto _again;} } break; case 44: #line 221 "sam_alignment.rl" { p--; {cs = 190; if (true) goto _again;} } break; case 45: #line 223 "sam_alignment.rl" { rollback_size = buffer.length; } break; case 46: #line 230 "sam_alignment.rl" { ++quals_length; quals_last_char = (*p); buffer.putUnsafe!ubyte(cast(ubyte)((*p) - 33)); } break; case 47: #line 236 "sam_alignment.rl" { // '*' may correspond either to a one-base long sequence // or to absence of information if (quals_length == 1 && quals_last_char == '*' && l_seq == 0) buffer.shrink(rollback_size); } break; case 48: #line 243 "sam_alignment.rl" { buffer.shrink(rollback_size); for (size_t i = 0; i < l_seq; ++i) buffer.putUnsafe!ubyte(0xFF); rollback_size = buffer.length; p--; {cs = 179; if (true) goto _again;} } break; case 49: #line 251 "sam_alignment.rl" { p--; {cs = 251; if (true) goto _again;} } break; case 50: #line 253 "sam_alignment.rl" { if (buffer.length - rollback_size != l_seq) { buffer.shrink(rollback_size); for (size_t i = 0; i < l_seq; ++i) buffer.putUnsafe!ubyte(0xFF); } rollback_size = buffer.length; } break; case 51: #line 278 "sam_alignment.rl" { buffer.capacity = buffer.length + 4; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('A'); buffer.putUnsafe!char((*p)); } break; case 52: #line 285 "sam_alignment.rl" { buffer.capacity = buffer.length + 7; buffer.putUnsafe(tag_key); if (int_value < 0) { if (int_value >= byte.min) { buffer.putUnsafe!char('c'); buffer.putUnsafe(cast(byte)int_value); } else if (int_value >= short.min) { buffer.putUnsafe!char('s'); buffer.putUnsafe(cast(short)int_value); } else if (int_value >= int.min) { buffer.putUnsafe!char('i'); buffer.putUnsafe(cast(int)int_value); } else { throw new Exception("integer out of range"); } } else { if (int_value <= ubyte.max) { buffer.putUnsafe!char('C'); buffer.putUnsafe(cast(ubyte)int_value); } else if (int_value <= ushort.max) { buffer.putUnsafe!char('S'); buffer.putUnsafe(cast(ushort)int_value); } else if (int_value <= uint.max) { buffer.putUnsafe!char('I'); buffer.putUnsafe(cast(uint)int_value); } else { throw new Exception("integer out of range"); } } } break; case 53: #line 317 "sam_alignment.rl" { tagvalue_beg = p - line.ptr; } break; case 54: #line 319 "sam_alignment.rl" { buffer.capacity = buffer.length + 7; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('f'); buffer.putUnsafe!float(float_value); } break; case 55: #line 326 "sam_alignment.rl" { { auto data = cast(ubyte[])(line[tagvalue_beg .. p - line.ptr]); buffer.capacity = buffer.length + 4 + data.length; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('Z'); buffer.putUnsafe(data); buffer.putUnsafe!ubyte(0); } } break; case 56: #line 337 "sam_alignment.rl" { { auto data = cast(ubyte[])(line[tagvalue_beg .. p - line.ptr]); buffer.capacity = buffer.length + 4 + data.length; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('H'); buffer.putUnsafe(data); buffer.putUnsafe!ubyte(0); } } break; case 57: #line 352 "sam_alignment.rl" { arraytype = (*p); buffer.capacity = buffer.length + 8; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('B'); buffer.putUnsafe!char(arraytype); buffer.putUnsafe!uint(0); tag_array_length_offset = buffer.length - uint.sizeof; } break; case 58: #line 362 "sam_alignment.rl" { // here, we assume that compiler is smart enough to move switch out of loop. switch (arraytype) { case 'c': buffer.put(to!byte(int_value)); break; case 'C': buffer.put(to!ubyte(int_value)); break; case 's': buffer.put(to!short(int_value)); break; case 'S': buffer.put(to!ushort(int_value)); break; case 'i': buffer.put(to!int(int_value)); break; case 'I': buffer.put(to!uint(int_value)); break; default: assert(0); } { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } break; case 59: #line 379 "sam_alignment.rl" { buffer.put!float(float_value); { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } break; case 60: #line 400 "sam_alignment.rl" { tag_key_beg = p - line.ptr; } break; case 61: #line 401 "sam_alignment.rl" { tag_key = cast(ubyte[])(line[tag_key_beg .. p - line.ptr]); } break; case 62: #line 403 "sam_alignment.rl" { buffer.shrink(rollback_size); p--; {cs = 180; if (true) goto _again;} } break; case 63: #line 408 "sam_alignment.rl" { p--; {cs = 251; if (true) goto _again;} } break; case 64: #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } break; #line 1188 "sam_alignment.d" default: break; } } _again: if ( cs == 0 ) goto _out; if ( ++p != pe ) goto _resume; _test_eof: {} if ( p == eof ) { byte* __acts = &_sam_alignment_actions[_sam_alignment_eof_actions[cs]]; uint __nacts = cast(uint) *__acts++; while ( __nacts-- > 0 ) { switch ( *__acts++ ) { case 3: #line 30 "sam_alignment.rl" { int_value *= current_sign; current_sign = 1; } break; case 5: #line 38 "sam_alignment.rl" { float_value = to!float(line[float_beg .. p - line.ptr]); } break; case 8: #line 50 "sam_alignment.rl" { p--; {cs = 169; if (true) goto _again;} } break; case 11: #line 58 "sam_alignment.rl" { p--; {cs = 170; if (true) goto _again;} } break; case 15: #line 67 "sam_alignment.rl" { p--; {cs = 171; if (true) goto _again;} } break; case 18: #line 75 "sam_alignment.rl" { p--; {cs = 172; if (true) goto _again;} } break; case 21: #line 81 "sam_alignment.rl" { p--; {cs = 173; if (true) goto _again;} } break; case 27: #line 124 "sam_alignment.rl" { auto ptr = cast(uint*)(buffer.data.ptr + 3 * uint.sizeof); *ptr = (*ptr) & 0xFFFF0000; buffer.shrink(rollback_size); end_pos = pos + 1; p--; {cs = 174; if (true) goto _again;} } break; case 33: #line 162 "sam_alignment.rl" { p--; {cs = 175; if (true) goto _again;} } break; case 36: #line 175 "sam_alignment.rl" { p--; {cs = 176; if (true) goto _again;} } break; case 39: #line 187 "sam_alignment.rl" { p--; {cs = 177; if (true) goto _again;} } break; case 43: #line 217 "sam_alignment.rl" { rollback_size = buffer.length; p--; {cs = 178; if (true) goto _again;} } break; case 47: #line 236 "sam_alignment.rl" { // '*' may correspond either to a one-base long sequence // or to absence of information if (quals_length == 1 && quals_last_char == '*' && l_seq == 0) buffer.shrink(rollback_size); } break; case 48: #line 243 "sam_alignment.rl" { buffer.shrink(rollback_size); for (size_t i = 0; i < l_seq; ++i) buffer.putUnsafe!ubyte(0xFF); rollback_size = buffer.length; p--; {cs = 179; if (true) goto _again;} } break; case 50: #line 253 "sam_alignment.rl" { if (buffer.length - rollback_size != l_seq) { buffer.shrink(rollback_size); for (size_t i = 0; i < l_seq; ++i) buffer.putUnsafe!ubyte(0xFF); } rollback_size = buffer.length; } break; case 52: #line 285 "sam_alignment.rl" { buffer.capacity = buffer.length + 7; buffer.putUnsafe(tag_key); if (int_value < 0) { if (int_value >= byte.min) { buffer.putUnsafe!char('c'); buffer.putUnsafe(cast(byte)int_value); } else if (int_value >= short.min) { buffer.putUnsafe!char('s'); buffer.putUnsafe(cast(short)int_value); } else if (int_value >= int.min) { buffer.putUnsafe!char('i'); buffer.putUnsafe(cast(int)int_value); } else { throw new Exception("integer out of range"); } } else { if (int_value <= ubyte.max) { buffer.putUnsafe!char('C'); buffer.putUnsafe(cast(ubyte)int_value); } else if (int_value <= ushort.max) { buffer.putUnsafe!char('S'); buffer.putUnsafe(cast(ushort)int_value); } else if (int_value <= uint.max) { buffer.putUnsafe!char('I'); buffer.putUnsafe(cast(uint)int_value); } else { throw new Exception("integer out of range"); } } } break; case 54: #line 319 "sam_alignment.rl" { buffer.capacity = buffer.length + 7; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('f'); buffer.putUnsafe!float(float_value); } break; case 55: #line 326 "sam_alignment.rl" { { auto data = cast(ubyte[])(line[tagvalue_beg .. p - line.ptr]); buffer.capacity = buffer.length + 4 + data.length; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('Z'); buffer.putUnsafe(data); buffer.putUnsafe!ubyte(0); } } break; case 56: #line 337 "sam_alignment.rl" { { auto data = cast(ubyte[])(line[tagvalue_beg .. p - line.ptr]); buffer.capacity = buffer.length + 4 + data.length; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('H'); buffer.putUnsafe(data); buffer.putUnsafe!ubyte(0); } } break; case 58: #line 362 "sam_alignment.rl" { // here, we assume that compiler is smart enough to move switch out of loop. switch (arraytype) { case 'c': buffer.put(to!byte(int_value)); break; case 'C': buffer.put(to!ubyte(int_value)); break; case 's': buffer.put(to!short(int_value)); break; case 'S': buffer.put(to!ushort(int_value)); break; case 'i': buffer.put(to!int(int_value)); break; case 'I': buffer.put(to!uint(int_value)); break; default: assert(0); } { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } break; case 59: #line 379 "sam_alignment.rl" { buffer.put!float(float_value); { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } break; case 62: #line 403 "sam_alignment.rl" { buffer.shrink(rollback_size); p--; {cs = 180; if (true) goto _again;} } break; case 64: #line 410 "sam_alignment.rl" { rollback_size = buffer.length; } break; #line 1403 "sam_alignment.d" default: break; } } } _out: {} } #line 480 "sam_alignment.rl" BamRead read; read.raw_data = buffer.data[]; return read; } unittest { import std.algorithm; import std.math; auto line = "ERR016155.15021091\t185\t20\t60033\t25\t66S35M\t=\t60033\t0\tAGAAAAAACTGGAAGTTAATAGAGTGGTGACTCAGATCCAGTGGTGGAAGGGTAAGGGATCTTGGAACCCTATAGAGTTGCTGTGTGCCAGGGCCAGATCC\t#####################################################################################################\tX0:i:1\tX1:i:0\tXC:i:35\tMD:Z:17A8A8\tRG:Z:ERR016155\tAM:i:0\tNM:i:2\tSM:i:25\tXT:A:U\tBQ:Z:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\tY0:B:c,1,2,3\tY1:B:f,13.263,-3.1415,52.63461"; auto header = new SamHeader("@SQ\tSN:20\tLN:1234567"); auto alignment = parseAlignmentLine(line, header); assert(alignment.name == "ERR016155.15021091"); assert(equal(alignment.sequence(), "AGAAAAAACTGGAAGTTAATAGAGTGGTGACTCAGATCCAGTGGTGGAAGGGTAAGGGATCTTGGAACCCTATAGAGTTGCTGTGTGCCAGGGCCAGATCC")); assert(alignment.cigarString() == "66S35M"); assert(alignment.flag == 185); assert(alignment.position == 60032); assert(alignment.mapping_quality == 25); assert(alignment.mate_position == 60032); assert(alignment.ref_id == 0); assert(alignment.mate_ref_id == 0); assert(to!ubyte(alignment["AM"]) == 0); assert(to!ubyte(alignment["SM"]) == 25); assert(to!string(alignment["MD"]) == "17A8A8"); assert(equal(to!(byte[])(alignment["Y0"]), [1, 2, 3])); assert(equal!approxEqual(to!(float[])(alignment["Y1"]), [13.263, -3.1415, 52.63461])); assert(to!char(alignment["XT"]) == 'U'); import bio.bam.reference; auto info = ReferenceSequenceInfo("20", 1234567); auto invalid_cigar_string = "1\t100\t20\t50000\t30\tMZABC\t=\t50000\t0\tACGT\t####"; alignment = parseAlignmentLine(invalid_cigar_string, header); assert(equal(alignment.sequence(), "ACGT")); auto invalid_tag_and_qual = "2\t100\t20\t5\t40\t27M30X5D\t=\t3\t10\tACT\t !\n\tX1:i:7\tX3:i:zzz\tX4:i:5"; alignment = parseAlignmentLine(invalid_tag_and_qual, header); assert(alignment.base_qualities == [255, 255, 255]); // i.e. invalid assert(to!ubyte(alignment["X1"]) == 7); assert(alignment["X3"].is_nothing); assert(to!ubyte(alignment["X4"]) == 5); } BioD-0.1.0/bio/sff/000077500000000000000000000000001273003163100136505ustar00rootroot00000000000000BioD-0.1.0/bio/sff/constants.d000066400000000000000000000001541273003163100160310ustar00rootroot00000000000000module bio.sff.constants; immutable SFF_MAGIC = 0x2E736666; immutable char[4] SFF_VERSION = [0, 0, 0, 1]; BioD-0.1.0/bio/sff/index.d000066400000000000000000000001231273003163100151200ustar00rootroot00000000000000module bio.sff.index; struct IndexLocation { ulong offset; uint length; } BioD-0.1.0/bio/sff/read.d000066400000000000000000000010231273003163100147240ustar00rootroot00000000000000module bio.sff.read; /// SFF record struct SffRead { /// Read identifier string name; /// Homopolymer stretch estimates for each flow of the read ushort[] flowgram_values; ubyte[] flow_index_per_base; /// Basecalled nucleotide sequence char[] bases; /// Phred-scaled quality scores ubyte[] quality_scores; ushort clip_qual_left; ushort clip_qual_right; ushort clip_adapter_left; ushort clip_adapter_right; /// Record start offset in the file size_t file_offset; } BioD-0.1.0/bio/sff/reader.d000066400000000000000000000113571273003163100152660ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.sff.reader; public import bio.sff.index; import bio.sff.read; import bio.sff.readrange; import bio.sff.constants; import bio.core.utils.stream; import std.stream; import std.system; import std.range; import std.exception; /// SFF file reader class SffReader { /// Open file by filename this(string filename) { _filename = filename; _readHeader(); } /// Reads auto reads() @property { auto stream = new bio.core.utils.stream.File(filename); Stream sff = new EndianStream(stream, Endian.bigEndian); sff.seekSet(_header_length); auto sff_reads = SffReadRange(sff, cast(ushort)_flow_chars.length, _index_location); return takeExactly(sff_reads, _n_reads); } /// SffRead getReadAtOffset(size_t offset) { auto stream = new bio.core.utils.stream.File(filename); Stream sff = new EndianStream(stream, Endian.bigEndian); sff.seekSet(offset); auto read = SffReadRange(sff, cast(ushort)_flow_chars.length, _index_location).front; sff.close(); return read; } /// File name string filename() @property const { return _filename; } /// Location of the index (if included). IndexLocation index_location() @property const { return _index_location; } /// bool has_index() @property const { return _index_location.offset != 0 && _index_location.length != 0; } /// Set index location (saves new index location to the file) void index_location(IndexLocation location) @property { _index_location = location; // offset spans 8 bytes (8 .. 16), // length spans 4 bytes (16 .. 20) auto stream = new bio.core.utils.stream.File(filename, "r+"); stream.seekSet(8); auto endian_stream = new EndianStream(stream, Endian.bigEndian); endian_stream.write(location.offset); endian_stream.write(location.length); endian_stream.close(); } /// Nucleotides used for each flow of each read string flow_order() @property const { return _flow_chars; } /// Nucleotide bases of the key sequence used for each read string key_sequence() @property const { return _key_sequence; } private { string _filename; uint _magic_number; char[4] _version; uint _n_reads; ushort _header_length; string _flow_chars; string _key_sequence; IndexLocation _index_location; void _readHeader() { auto stream = new bio.core.utils.stream.File(_filename); auto sff = new EndianStream(stream, Endian.bigEndian); sff.read(_magic_number); enforce(_magic_number == SFF_MAGIC, "Wrong magic number, expected 0x2E736666"); sff.readExact(_version.ptr, 4); enforce(_version == SFF_VERSION, "Unsupported version, expected 1"); sff.read(_index_location.offset); sff.read(_index_location.length); sff.read(_n_reads); sff.read(_header_length); ushort _key_length; ushort _number_of_flows; ubyte _flowgram_format_code; sff.read(_key_length); sff.read(_number_of_flows); sff.read(_flowgram_format_code); enforce(_flowgram_format_code == 1, "Flowgram format codes other than 1 are not supported"); _flow_chars = cast(string)sff.readString(_number_of_flows); _key_sequence = cast(string)sff.readString(_key_length); } } } BioD-0.1.0/bio/sff/readrange.d000066400000000000000000000075041273003163100157530ustar00rootroot00000000000000module bio.sff.readrange; import bio.sff.read; import bio.sff.index; import bio.core.utils.switchendianness; import std.algorithm; import std.stream; import std.system; import std.array; private { // GC used in D is quite bad at allocating lots of objects in a tight loop. // The following is a simple way to reduce the number of allocations. ubyte[] current_chunk; size_t used; size_t chunk_size = 65_536; static this() { current_chunk = uninitializedArray!(ubyte[])(chunk_size); used = 0; } T[] allocateArray(T : T[])(size_t size) { size_t new_used = used + size * T.sizeof; if (new_used > chunk_size) { new_used = size * T.sizeof; if (new_used > chunk_size) chunk_size = new_used; current_chunk = uninitializedArray!(ubyte[])(chunk_size); used = new_used; return cast(T[])current_chunk[0 .. used]; } else { auto old_used = used; used = new_used; return cast(T[])current_chunk[old_used .. used]; } } } struct SffReadRange { this(Stream stream, ushort number_of_flows_per_read, IndexLocation index_location) { _stream = stream; _n_flows = number_of_flows_per_read; _index_loc = index_location; _fetchNextRead(); } private { Stream _stream; ushort _n_flows; IndexLocation _index_loc; bool _empty; SffRead _read; void _fetchNextRead() { if (_stream.position == _index_loc.offset) _stream.seekCur(_index_loc.length); if (_stream.eof) { _empty = true; } else { _read.file_offset = _stream.position; // determine how many bytes to read ushort read_header_length = void; ushort name_length = void; uint number_of_bases = void; _stream.read(read_header_length); _stream.read(name_length); _stream.read(number_of_bases); _stream.read(_read.clip_qual_left); _stream.read(_read.clip_qual_right); _stream.read(_read.clip_adapter_left); _stream.read(_read.clip_adapter_right); char[] name = allocateArray!(char[])(name_length); _stream.readExact(name.ptr, name_length); _stream.seekCur(read_header_length - 16 - name_length); _read.name = cast(string)name; size_t _data_length = _n_flows * ushort.sizeof + 3 * number_of_bases; _read.flowgram_values = allocateArray!(ushort[])(_n_flows); _stream.readExact(_read.flowgram_values.ptr, _n_flows * ushort.sizeof); if (std.system.endian != Endian.bigEndian) { for (size_t i = 0; i < _n_flows; ++i) { switchEndianness(_read.flowgram_values.ptr + i, ushort.sizeof); } } _read.flow_index_per_base = allocateArray!(ubyte[])(number_of_bases); _stream.readExact(_read.flow_index_per_base.ptr, number_of_bases); _read.bases = allocateArray!(char[])(number_of_bases); _stream.readExact(_read.bases.ptr, number_of_bases); _read.quality_scores = allocateArray!(ubyte[])(number_of_bases); _stream.readExact(_read.quality_scores.ptr, number_of_bases); if (_data_length % 8 > 0) _stream.seekCur(8 - (_data_length % 8)); } } } bool empty() @property const { return _empty; } SffRead front() @property { return _read; } void popFront() { _fetchNextRead(); } } BioD-0.1.0/bio/sff/utils/000077500000000000000000000000001273003163100150105ustar00rootroot00000000000000BioD-0.1.0/bio/sff/utils/roundup.d000066400000000000000000000003431273003163100166510ustar00rootroot00000000000000module bio.sff.utils.roundup; import std.traits; import std.conv; /// First number T roundup(T)(T number) if (isUnsigned!T) { if (number % 8 == 0) return number; return to!T(number + (8 - number % 8)); } BioD-0.1.0/bio/sff/writer.d000066400000000000000000000074161273003163100153410ustar00rootroot00000000000000module bio.sff.writer; import bio.sff.constants; import bio.sff.utils.roundup; import bio.core.utils.stream; import std.stream; import std.system; /// Class for outputting SFF files class SffWriter { /// Create new writer. this(string filename, string flow_order, string key_sequence) { _filename = filename; _flow_order = flow_order; _key_seq = key_sequence; auto f = new bio.core.utils.stream.File(filename, "wb+"); auto stream = new BufferedStream(f, 1024576); _endian_stream = new EndianStream(stream, Endian.bigEndian); writeHeader(); } /// Flow order string flow_order() @property const { return _flow_order; } /// Key sequence string key_sequence() @property const { return _key_seq; } /// Add a read to the end of file void append(R)(R sff_read) { // compute read_header_length ushort exact_read_header_length = cast(ushort)(16 + sff_read.name.length); ushort read_header_length = roundup(exact_read_header_length); _endian_stream.write(read_header_length); _endian_stream.write(cast(ushort)sff_read.name.length); _endian_stream.write(cast(uint)sff_read.bases.length); _endian_stream.write(sff_read.clip_qual_left); _endian_stream.write(sff_read.clip_qual_right); _endian_stream.write(sff_read.clip_adapter_left); _endian_stream.write(sff_read.clip_adapter_right); _endian_stream.writeExact(sff_read.name.ptr, sff_read.name.length); for (size_t i = 0; i < read_header_length - exact_read_header_length; ++i) _endian_stream.write(cast(ubyte)0); for (size_t i = 0; i < _flow_order.length; ++i) _endian_stream.write(sff_read.flowgram_values[i]); auto n_bases = sff_read.bases.length; _endian_stream.writeExact(sff_read.flow_index_per_base.ptr, n_bases); _endian_stream.writeExact(sff_read.bases.ptr, n_bases); _endian_stream.writeExact(sff_read.quality_scores.ptr, n_bases); auto k = 2 * _flow_order.length + 3 * n_bases; auto padding = roundup(k) - k; for (size_t i = 0; i < padding; ++i) _endian_stream.write(cast(ubyte)0); ++_n_reads; } /// Flush all buffers and update number of reads in the file header void finish() { updateNumberOfReads(); _endian_stream.close(); } private { string _filename; string _flow_order; string _key_seq; Stream _endian_stream; uint _n_reads; ushort _exact_header_len() @property const { return cast(ushort)(31 + _flow_order.length + _key_seq.length); } ushort _header_len() @property const { return roundup(_exact_header_len); } void writeHeader() { _endian_stream.write(SFF_MAGIC); _endian_stream.writeExact(SFF_VERSION.ptr, 4); _endian_stream.write(0UL); _endian_stream.write(0U); _endian_stream.write(_n_reads); _endian_stream.write(_header_len); _endian_stream.write(cast(ushort)_key_seq.length); _endian_stream.write(cast(ushort)_flow_order.length); _endian_stream.write(cast(ubyte)1); _endian_stream.writeExact(_flow_order.ptr, _flow_order.length); _endian_stream.writeExact(_key_seq.ptr, _key_seq.length); for (size_t i = 0; i < _header_len - _exact_header_len; ++i) _endian_stream.write(cast(ubyte)0); } void updateNumberOfReads() { auto old_pos = _endian_stream.position; _endian_stream.position = 20; _endian_stream.write(_n_reads); _endian_stream.position = old_pos; } } } BioD-0.1.0/dub.json000066400000000000000000000004401273003163100137640ustar00rootroot00000000000000{ "name": "biod", "authors": [ "Artem Tarasov", "Pjotr Prins" ], "description": "Bioinformatics library in D (utils for working with SAM, BAM, SFF formats)", "copyright": "Copyright © 2016, BioD developers", "license": "MIT", "sourcePaths": ["bio"], "importPaths": ["bio"] } BioD-0.1.0/examples/000077500000000000000000000000001273003163100141375ustar00rootroot00000000000000BioD-0.1.0/examples/calculate_gc_content_from_reference.d000066400000000000000000000022101273003163100235000ustar00rootroot00000000000000// run example: rdmd -I.. calculate_gc_content_from_reference.d import bio.bam.reader; import bio.bam.md.reconstruct : dna; import std.stdio, std.datetime, std.range, std.array; void main() { auto bam = new BamReader("../test/data/b7_295_chunk.bam"); // the sequence starts at first mapped base of first read auto reference = dna(bam.reads); int n_bases = 0, gc = 0; foreach (base; reference) { if (base == 'N') continue; // happens if coverage is zero if (base == 'G' || base == 'C') gc += 1; n_bases += 1; } writeln("total bases: ", n_bases); writeln(" GC%: ", cast(float)gc / n_bases); writeln(" sequence: ", reference); writeln(" #reads: ", walkLength(bam.reads)); auto reads = array(bam.reads); // no I/O during measurements StopWatch sw; // for a range of reads, minumum number of MD tags is parsed sw.start(); walkLength(dna(reads)); sw.stop(); writeln("extracting reference from range of reads: ", sw.peek().usecs, "μs"); sw.reset(); sw.start(); foreach (read; reads) walkLength(dna(read)); sw.stop(); writeln("extracting reference from each read: ", sw.peek().usecs, "μs"); } BioD-0.1.0/examples/create_bam_from_scratch.d000066400000000000000000000034011273003163100211160ustar00rootroot00000000000000// run example: rdmd -I.. create_bam_from_scratch.d // this example shows how to create BAM files from scratch import bio.bam.read, bio.bam.referenceinfo, bio.sam.header; import bio.bam.reader, bio.bam.writer; import std.stream, std.stdio; void main() { auto header = new SamHeader(); // First, create SAM header RgLine rg; // and fill it with information. rg.identifier = "RG007"; rg.platform = "ILLUMINA"; // Of course, you can modify header header.read_groups.add(rg); // provided by BamReader object. auto reference = ReferenceSequenceInfo("contig123", 4321); auto stream = new MemoryStream(); auto writer = new BamWriter(stream); writer.writeSamHeader(header); // start writing BAM from header writer.writeReferenceSequenceInfo([reference]); // and reference sequence info auto read = BamRead("readName001", "ACTGATGAAC", [CigarOperation(7, 'M'), CigarOperation(1, 'I'), CigarOperation(2, 'S')]); read.base_qualities = [38, 34, 33, 35, 28, 39, 25, 19, 21, 17]; read.ref_id = 0; read.mapping_quality = 46; read.is_unmapped = false; read["RG"] = "RG007"; // ... set many more fields, flags, and tags read.position = 2345; // 0-based, in SAM output you will see 2346 read.strand = '-'; // same as read.is_reverse_strand = true writer.writeRecord(read); // BGZF blocks are seamlessly compressed in parallel writer.flush(); // in practice, one would call finish() method stream.seekSet(0); // but here we will read from the stream auto reader = new BamReader(stream); write(reader.header.text); // serialized header already contains newline writefln("%j", reader.reads.front); // prints record in JSON format } BioD-0.1.0/examples/iterate_tags.d000066400000000000000000000022541273003163100167620ustar00rootroot00000000000000// run example: rdmd -I.. iterate_tags.d import bio.bam.reader, bio.bam.tagvalue; import std.stdio, std.datetime; import std.conv : to; void main() { auto bam = new BamReader("../test/data/b7_295_chunk.bam"); auto read = bam.reads.front; // take first read // iterating all tags foreach (tag, value; read) writeln(tag, ": ", value); // taking value of tag Value v = read["XS"]; // Usually, it will be converted to some type right away. auto v2 = to!int(v); // It is not necessary to know exact value type as in BAM. // If it can be converted to specified type, that's fine. // Otherwise, an exception will be thrown. auto v3 = to!long(v); auto v4 = to!string(v); auto v5 = to!float(v); // With strings and arrays there is an unsafe but faster way... v = read["FZ"]; StopWatch sw; // even with -O -release -inline this is slow sw.start; auto fz1 = to!(ushort[])(v); sw.stop(); writeln(" safe conversion: ", sw.peek().usecs, "μs"); sw.reset(); // this works because v starts in memory with a union sw.start(); auto fz2 = *(cast(ushort[]*)(&v)); sw.stop(); writeln("unsafe conversion: ", sw.peek().usecs, "μs"); assert(fz1 == fz2); } BioD-0.1.0/examples/make_pileup.d000066400000000000000000000014671273003163100166070ustar00rootroot00000000000000// run example: rdmd -I.. make_pileup.d import bio.bam.reader; import bio.bam.pileup; import bio.bam.read : compareCoordinates; import std.range, std.algorithm, std.datetime, std.stdio, std.array; void main() { auto bam = new BamReader("../test/data/illu_20_chunk.bam"); auto pileup = makePileup(bam.reads, true); // Reads in every pileup column are sorted by coordinate. // Therefore the following holds: assert(equal( pileup.map!(column => column.reads.equalRange(column.position))() .joiner(), bam.reads)); // There is also easier and faster way to get reads starting at the column: pileup = makePileup(bam.reads, true); // (initialize pileup engine again) assert(equal( pileup.map!(column => column.reads_starting_here)() .joiner(), bam.reads)); } BioD-0.1.0/examples/print_base_info.d000066400000000000000000000022431273003163100174460ustar00rootroot00000000000000// run example: rdmd -I.. print_base_info.d import bio.bam.reader; import bio.bam.baseinfo; import std.stdio; import std.range : take, drop; import std.algorithm : find; void main() { auto bam = new BamReader("../test/data/b7_295_chunk.bam"); // get read group information by name auto rg = bam.header.read_groups["9IKNG"]; auto read = find!(r => r.name == "9IKNG:00592:01791")(bam.reads).front; // fetch information about flow calls from FZ & ZF tags // and also reference base from MD tag auto bases = basesWith!("FZ", "MD")(read, arg!"flowOrder"(rg.flow_order), arg!"keySequence"(rg.key_sequence)); // end of read contains a few indel errors foreach (baseinfo; bases.drop(350).take(32)) { writefln("%s\t%s\tflow: %3d\tintensity: %.2f\t\tref. pos.: %6d\tCIGAR op.: %s", baseinfo.reference_base, // from MD tag baseinfo.base, baseinfo.flow_call.flow_index, // from FZ tag baseinfo.flow_call.intensity, // also from FZ tag baseinfo.position, baseinfo.cigar_operation); // notice that because the read is on reverse strand, // reference position decreases during the iteration } } BioD-0.1.0/examples/read_bam_file.d000066400000000000000000000022721273003163100170400ustar00rootroot00000000000000// run example: rdmd -I.. example1.d import bio.bam.reader; import bio.bam.pileup; import std.stdio; void main() { auto bam = new BamReader("../test/data/ex1_header.bam"); auto reads = bam["chr2"][150 .. 160]; // region chr2:149-158 auto pileup = makePileup(reads, false, // reads don't contain MD tags 155, 158); // specify [start, end) interval foreach (column; pileup) { writeln("Reference position: ", column.position); writeln(" Coverage: ", column.coverage); writeln(" Reads:"); foreach (read; column.reads) { writefln("%30s\t%s\t%.2d\t%s\t%2s/%2s\t%2s/%2s\t%10s\t%s %s", read.name, read.current_base, read.current_base_quality, read.cigar_operation, read.cigar_operation_offset + 1, read.cigar_operation.length, read.query_offset + 1, read.sequence.length, read.cigarString(), read.cigar_before, read.cigar_after); } } } BioD-0.1.0/examples/transverse_multiple_bam_files.d000066400000000000000000000021251273003163100224140ustar00rootroot00000000000000// run example: rdmd -I.. transverse_multiple_bam_files.d import bio.bam.multireader; import bio.bam.read : compareCoordinates; import bio.bam.pileup; import std.algorithm, std.conv, std.stdio; void main() { // multiple BAM files can be traversed simultaneously (if they can be merged) auto bam = new MultiBamReader(["../test/data/illu_20_chunk.bam", "../test/data/ion_20_chunk.bam"]); auto pileup = makePileup(bam.reads, // ANY range of reads is acceptable true, // use MD tags 32_000_083, 32_000_089); foreach (column; pileup) { writeln("Column position: ", column.position); writeln(" Ref.base: ", column.reference_base); // extracted from MD tags writeln(" Coverage: ", column.coverage); writeln(" ", column.reads // bases from Illumina dataset .filter!(read => to!string(read["RG"]).startsWith("ERR"))() .map!(read => read.current_base)(), " ", column.reads // bases from IonTorrent dataset .filter!(read => to!string(read["RG"]).startsWith("66A0Q"))() .map!(read => read.current_base)()); } } BioD-0.1.0/src_ragel/000077500000000000000000000000001273003163100142625ustar00rootroot00000000000000BioD-0.1.0/src_ragel/Makefile000066400000000000000000000013551273003163100157260ustar00rootroot00000000000000all: fastrecordparser recordparser regionparser .PHONY : fastrecordparser .PHONY : recordparser .PHONY : regionparser fastrecordparser: ragel sam_alignment.rl -D -G2 ./workarounds/fix_switch_case_fallthrough.sh sam_alignment.d echo 'module bio.sam.utils.fastrecordparser;' | cat - sam_alignment.d > .sam_alignment.d.tmp rm sam_alignment.d mv .sam_alignment.d.tmp fastrecordparser.d recordparser: ragel sam_alignment.rl -D ./workarounds/fix_static_const.sh sam_alignment.d echo 'module bio.sam.utils.recordparser;' | cat - sam_alignment.d > .sam_alignment.d.tmp rm sam_alignment.d mv .sam_alignment.d.tmp recordparser.d regionparser: ragel region.rl -D ./workarounds/fix_static_const.sh region.d clean: rm -f *parser.d region.d BioD-0.1.0/src_ragel/maf_block.rl000066400000000000000000000126651273003163100165500ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2013 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.maf.parser; import std.conv, std.array; import bio.maf.block; %%{ machine maf_block; # Common utilities for parsing integers and floats action update_sign { current_sign = fc == '-' ? -1 : 1; } action init_integer { int_value = 0; } action consume_next_digit { int_value *= 10; int_value += fc - '0'; } action take_sign_into_account { int_value *= current_sign; current_sign = 1; } sign = [\-+]; uint = ([0-9]{1,18}) > init_integer $ consume_next_digit ; int = (sign >update_sign)? uint % take_sign_into_account ; action mark_float_start { float_beg = p - line.ptr; } action update_float_value { float_value = to!float(line[float_beg .. p - line.ptr]); } float = ((sign? ((digit* '.'? digit+ ([eE] sign? digit+)?) | "inf") ) | "nan") > mark_float_start % update_float_value ; # -------------------------------------------------------------------------- action set_score { block.score = float_value; } action set_pass { block.pass = int_value; } # Alignment block line score_vp = "score=" float % set_score; pass_vp = "pass=" uint % set_pass ; ab_name_value_pair = score_vp | pass_vp ; alignment_block_line = 'a' (space+ ab_name_value_pair)* ; # Common action src_begin { src_beg = p - line.ptr; } action set_src { sequence.source = line[src_beg .. p - line.ptr]; } action set_start { sequence.start = int_value; } action set_size { sequence.size = int_value; } action set_strand { sequence.strand = fc; } action set_src_size { sequence.source_size = int_value; } action add_sequence { sequences.put(sequence); sequence = MafSequence.init; } action check_sequence { assert(line[src_beg .. p - line.ptr] == sequences.data.back.source); } src = (^space)+ > src_begin % set_src ; start = uint % set_start ; size = uint % set_size ; strand = ('+' | '-') > set_strand ; srcSize = uint % set_src_size ; # Sequence line action text_begin { text_beg = p - line.ptr; } action set_text { sequence.text = line[text_beg .. p - line.ptr]; } text = (^space)+ ; s_line = ('s' space+ src space+ start space+ size space+ strand space+ srcSize space+ text > text_begin % set_text) % add_sequence ; # 'i' line action set_left_status { sequences.data.back.left_status = fc; } action set_left_count { sequences.data.back.left_count = int_value; } action set_right_status { sequences.data.back.right_status = fc; } action set_right_count { sequences.data.back.right_count = int_value; } i_status = [CINnMT] ; leftStatus = i_status ; leftCount = uint ; rightStatus = i_status ; rightCount = uint ; i_line = 'i' space+ (src > src_begin % check_sequence) space+ leftStatus > set_left_status space+ leftCount % set_left_count space+ rightStatus > set_right_status space+ rightCount % set_right_count ; # 'e' line action set_empty_status { sequence.empty_status = *p; } e_status = [CIMn] ; e_line = ('e' space+ src space+ start space+ size space+ strand space+ srcSize space+ (e_status > set_empty_status)) % add_sequence ; # 'q' line action qual_begin { qual_beg = p - line.ptr; } action set_qual { sequences.data.back.quality = line[qual_beg .. p - line.ptr]; } q_value = (digit | 'F' | '-')+ ; q_line = 'q' space+ (src > src_begin % check_sequence) space+ (q_value > qual_begin % set_qual); newline = "\n" | "\r\n" ; block := alignment_block_line space* (newline ((s_line | i_line | e_line | q_line) space*))+ ; write data; }%% MafBlock parseMafBlock(string line) { char* p = cast(char*)line.ptr; char* pe = p + line.length; char* eof = pe; int cs; int current_sign; int int_value; double float_value; size_t float_beg; MafBlock block; MafSequence sequence; auto sequences = Appender!(MafSequence[])(); size_t src_beg; size_t text_beg; size_t qual_beg; %%write init; %%write exec; block.sequences = sequences.data; return block; } BioD-0.1.0/src_ragel/region.rl000066400000000000000000000054061273003163100161110ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ module bio.core.region; %%{ machine region_parser; action init_integer { uint_value = 0; } action consume_next_digit { if (fc != ',') uint_value *= 10, uint_value += fc - '0'; } integer = [,0-9]+ > init_integer @consume_next_digit ; action set_reference { region.reference = str[0 .. p - str.ptr]; } action set_left_end { region.beg = to!uint(uint_value - 1); } action set_right_end { region.end = to!uint(uint_value); } reference = ([!-()+-<>-~] [!-~]*) % set_reference ; reference_and_left_end = reference :> ':' integer % set_left_end ; reference_and_both_ends = reference_and_left_end '-' integer % set_right_end ; region := (reference @ 0) | (reference_and_left_end @ 1) | (reference_and_both_ends @ 1); write data; }%% import std.conv; struct Region { string reference; uint beg; uint end; } Region parseRegion(string str) { char* p = cast(char*)str.ptr; char* pe = p + str.length; char* eof = pe; int cs; long uint_value; Region region; region.beg = 0; region.end = uint.max; %%write init; %%write exec; return region; } unittest { auto region1 = parseRegion("chr1:1,000-2000"); assert(region1.reference == "chr1"); assert(region1.beg == 999); assert(region1.end == 2000); auto region2 = parseRegion("chr2"); assert(region2.reference == "chr2"); assert(region2.beg == 0); assert(region2.end == uint.max); auto region3 = parseRegion("chr3:1,000,000"); assert(region3.reference == "chr3"); assert(region3.beg == 999_999); assert(region3.end == uint.max); } BioD-0.1.0/src_ragel/sam_alignment.rl000066400000000000000000000462151273003163100174470ustar00rootroot00000000000000/* This file is part of BioD. Copyright (C) 2012 Artem Tarasov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ %%{ machine sam_alignment; action update_sign { current_sign = fc == '-' ? -1 : 1; } action init_integer { int_value = 0; } action consume_next_digit { int_value *= 10; int_value += fc - '0'; } action take_sign_into_account { int_value *= current_sign; current_sign = 1; } sign = [\-+]; uint = ([0-9]{1,18}) > init_integer $ consume_next_digit ; int = (sign >update_sign)? uint % take_sign_into_account ; action mark_float_start { float_beg = p - line.ptr; } action update_float_value { float_value = to!float(line[float_beg .. p - line.ptr]); } float = ((sign? ((digit* '.'? digit+ ([eE] sign? digit+)?) | "inf") ) | "nan") > mark_float_start % update_float_value ; invalid_field = [^\t]* ; # TODO: make class with onError methods and pass it to parseAlignmentLine ### 1. STORE READ NAME ### action qname_start { read_name_beg = p - line.ptr; } action qname_end { read_name = line[read_name_beg .. p - line.ptr]; } action handle_invalid_qname { fhold; fgoto recover_from_invalid_qname; } recover_from_invalid_qname := invalid_field '\t' @{ fhold; fgoto flag_parsing; } ; qname = '*' | (([!-?A-~]{1,255})** > qname_start % qname_end) ; ### 2. STORE FLAG ### action set_flag { flag = to!ushort(int_value); } flag = uint % set_flag; action handle_invalid_flag { fhold; fgoto recover_from_invalid_flag; } recover_from_invalid_flag := invalid_field '\t' @{ fhold; fgoto rname_parsing; } ; ### 3. STORE RNAME ### action rname_start { rname_beg = p - line.ptr; } action rname_end { ref_id = header.getSequenceIndex(line[rname_beg .. p - line.ptr]); } action handle_invalid_rname { fhold; fgoto recover_from_invalid_rname; } recover_from_invalid_rname := invalid_field '\t' @{ fhold; fgoto pos_parsing; } ; rname = '*' | (([!-()+-<>-~] [!-~]*) > rname_start % rname_end); ### 4. STORE POS ### action set_pos { end_pos = pos = to!uint(int_value); } pos = uint % set_pos; action handle_invalid_pos { fhold; fgoto recover_from_invalid_pos; } recover_from_invalid_pos := invalid_field '\t' @{ fhold; fgoto mapq_parsing; } ; ### 5. STORE MAPPING QUALITY ### action set_mapping_quality { mapping_quality = to!ubyte(int_value); } mapq = uint % set_mapping_quality; action handle_invalid_mapq { fhold; fgoto recover_from_invalid_mapq; } recover_from_invalid_mapq := invalid_field '\t' @{ fhold; fgoto cigar_parsing; } ; ### 6. INITIALIZE OUTPUT BUFFER ### action init_output_buffer { buffer.capacity = 32 + read_name.length + 1; buffer.putUnsafe!int(ref_id); buffer.putUnsafe!int(pos - 1); enforce(read_name.length + 1 <= 255, "Read name " ~ read_name ~ " is too long!"); // bin will be set later auto bin_mq_nl = ((cast(uint)mapping_quality) << 8) | (read_name.length + 1); buffer.putUnsafe(cast(uint)bin_mq_nl); // number of CIGAR operations will be set later buffer.putUnsafe!uint(flag << 16); buffer.putUnsafe!int(0); buffer.putUnsafe!int(-1); // mate ref. id buffer.putUnsafe!int(-1); // mate pos buffer.putUnsafe!int(0); // tlen buffer.putUnsafe(cast(ubyte[])read_name); buffer.putUnsafe!ubyte(0); rollback_size = buffer.length; } ### 7. STORE CIGAR OPERATIONS ### action cigar_set_op_length { cigar_op_len = to!uint(int_value); } action cigar_set_op_chr { cigar_op_chr = fc; } action cigar_put_operation { auto op = CigarOperation(cigar_op_len, cigar_op_chr); if (op.is_reference_consuming) end_pos += op.length; buffer.put!CigarOperation(op); { auto ptr = cast(uint*)(buffer.data.ptr + 3 * uint.sizeof); *ptr = (*ptr) + 1; } } action handle_invalid_cigar { auto ptr = cast(uint*)(buffer.data.ptr + 3 * uint.sizeof); *ptr = (*ptr) & 0xFFFF0000; buffer.shrink(rollback_size); end_pos = pos + 1; fhold; fgoto recover_from_invalid_cigar; } recover_from_invalid_cigar := invalid_field '\t' @{ fhold; fgoto rnext_parsing; } ; cigar = '*' | (uint % cigar_set_op_length [MIDNSHPX=] > cigar_set_op_chr % cigar_put_operation)+ ; ### 8. SET BIN ### action set_bin { if (end_pos == pos) ++end_pos; { auto bin = reg2bin(pos - 1, end_pos - 1); // 0-based [) interval auto ptr = cast(uint*)(buffer.data.ptr + 2 * uint.sizeof); *ptr = (*ptr) | ((cast(uint)bin) << 16); } } ### 9. SET MATE REF. ID ### action set_same_mate_ref_id { { auto ptr = cast(int*)(buffer.data.ptr + 5 * int.sizeof); *ptr = ref_id; } } action rnext_start { rnext_beg = p - line.ptr; } action rnext_end { { auto ptr = cast(int*)(buffer.data.ptr + 5 * int.sizeof); *ptr = header.getSequenceIndex(line[rnext_beg .. p - line.ptr]); } } action handle_invalid_rnext { fhold; fgoto recover_from_invalid_rnext; } recover_from_invalid_rnext := invalid_field '\t' @{ fhold; fgoto pnext_parsing; } ; rnext = '*' | ('=' % set_same_mate_ref_id) | (([!-()+-<>-~][!-~]*) > rnext_start % rnext_end) ; ### 10. SET MATE POSITION ### action set_mate_pos { { auto ptr = cast(int*)(buffer.data.ptr + 6 * int.sizeof); *ptr = to!int(int_value) - 1; } } action handle_invalid_pnext { fhold; fgoto recover_from_invalid_pnext; } recover_from_invalid_pnext := invalid_field '\t' @{ fhold; fgoto tlen_parsing; } ; pnext = uint % set_mate_pos; ### 11. SET TEMPLATE LENGTH ### action set_template_length { { auto ptr = cast(int*)(buffer.data.ptr + 7 * int.sizeof); *ptr = to!int(int_value); } } action handle_invalid_tlen { fhold; fgoto recover_from_invalid_tlen; } recover_from_invalid_tlen := invalid_field '\t' @{ fhold; fgoto seq_parsing; } ; tlen = int % set_template_length; ### 12. SET SEQUENCE ### action sequence_start { sequence_beg = p - line.ptr; } action sequence_end { auto data = cast(ubyte[])line[sequence_beg .. p - line.ptr]; l_seq = cast(int)data.length; auto raw_len = (l_seq + 1) / 2; // reserve space for base qualities, too buffer.capacity = buffer.length + raw_len + l_seq; for (size_t i = 0; i < raw_len; ++i) { auto b = cast(ubyte)(Base(data[2 * i]).internal_code << 4); if (2 * i + 1 < l_seq) b |= cast(ubyte)(Base(data[2 * i + 1]).internal_code); buffer.putUnsafe!ubyte(b); } // set l_seq { auto ptr = cast(int*)(buffer.data.ptr + 4 * int.sizeof); *ptr = l_seq; } rollback_size = buffer.length; } action handle_invalid_seq { rollback_size = buffer.length; fhold; fgoto recover_from_invalid_seq; } recover_from_invalid_seq := invalid_field '\t' @{ fhold; fgoto qual_parsing; } ; action set_rollback_size { rollback_size = buffer.length; } seq = ('*' % set_rollback_size) | ([A-Za-z=.]+ > sequence_start % sequence_end) ; ### 13. SET BASE QUALITIES ### action convert_next_character_to_prob { ++quals_length; quals_last_char = fc; buffer.putUnsafe!ubyte(cast(ubyte)(fc - 33)); } action qual_end { // '*' may correspond either to a one-base long sequence // or to absence of information if (quals_length == 1 && quals_last_char == '*' && l_seq == 0) buffer.shrink(rollback_size); } action handle_invalid_qual { buffer.shrink(rollback_size); for (size_t i = 0; i < l_seq; ++i) buffer.putUnsafe!ubyte(0xFF); rollback_size = buffer.length; fhold; fgoto recover_from_invalid_qual; } # FIXME recover_from_invalid_qual := invalid_field '\t' @{ fhold; fgoto tag_parsing; } ; action check_qual_length { if (buffer.length - rollback_size != l_seq) { buffer.shrink(rollback_size); for (size_t i = 0; i < l_seq; ++i) buffer.putUnsafe!ubyte(0xFF); } rollback_size = buffer.length; } qual = [!-~]+ $ convert_next_character_to_prob % qual_end ; ###### PARSE MANDATORY FIELDS ####### mandatoryfields = qname_parsing: (qname $!handle_invalid_qname) flag_parsing: '\t' (flag $!handle_invalid_flag) rname_parsing: '\t' (rname $!handle_invalid_rname) pos_parsing: '\t' (pos $!handle_invalid_pos) mapq_parsing: '\t' (mapq $!handle_invalid_mapq) cigar_parsing: '\t' > init_output_buffer (cigar $!handle_invalid_cigar) rnext_parsing: '\t' > set_bin (rnext $!handle_invalid_rnext) pnext_parsing: '\t' (pnext $!handle_invalid_pnext) tlen_parsing: '\t' (tlen $!handle_invalid_tlen) seq_parsing: '\t' (seq $!handle_invalid_seq) qual_parsing: '\t' (qual % check_qual_length $!handle_invalid_qual) ; ############ TAG PARSING ###### action set_charvalue { buffer.capacity = buffer.length + 4; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('A'); buffer.putUnsafe!char(fc); } action set_integervalue { buffer.capacity = buffer.length + 7; buffer.putUnsafe(tag_key); if (int_value < 0) { if (int_value >= byte.min) { buffer.putUnsafe!char('c'); buffer.putUnsafe(cast(byte)int_value); } else if (int_value >= short.min) { buffer.putUnsafe!char('s'); buffer.putUnsafe(cast(short)int_value); } else if (int_value >= int.min) { buffer.putUnsafe!char('i'); buffer.putUnsafe(cast(int)int_value); } else { throw new Exception("integer out of range"); } } else { if (int_value <= ubyte.max) { buffer.putUnsafe!char('C'); buffer.putUnsafe(cast(ubyte)int_value); } else if (int_value <= ushort.max) { buffer.putUnsafe!char('S'); buffer.putUnsafe(cast(ushort)int_value); } else if (int_value <= uint.max) { buffer.putUnsafe!char('I'); buffer.putUnsafe(cast(uint)int_value); } else { throw new Exception("integer out of range"); } } } action start_tagvalue { tagvalue_beg = p - line.ptr; } action set_floatvalue { buffer.capacity = buffer.length + 7; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('f'); buffer.putUnsafe!float(float_value); } action set_stringvalue { { auto data = cast(ubyte[])(line[tagvalue_beg .. p - line.ptr]); buffer.capacity = buffer.length + 4 + data.length; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('Z'); buffer.putUnsafe(data); buffer.putUnsafe!ubyte(0); } } action set_hexstringvalue { { auto data = cast(ubyte[])(line[tagvalue_beg .. p - line.ptr]); buffer.capacity = buffer.length + 4 + data.length; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('H'); buffer.putUnsafe(data); buffer.putUnsafe!ubyte(0); } } charvalue = [!-~] > set_charvalue ; integervalue = int % set_integervalue; floatvalue = float % set_floatvalue ; action start_arrayvalue { arraytype = fc; buffer.capacity = buffer.length + 8; buffer.putUnsafe(tag_key); buffer.putUnsafe!char('B'); buffer.putUnsafe!char(arraytype); buffer.putUnsafe!uint(0); tag_array_length_offset = buffer.length - uint.sizeof; } action put_integer_to_array { // here, we assume that compiler is smart enough to move switch out of loop. switch (arraytype) { case 'c': buffer.put(to!byte(int_value)); break; case 'C': buffer.put(to!ubyte(int_value)); break; case 's': buffer.put(to!short(int_value)); break; case 'S': buffer.put(to!ushort(int_value)); break; case 'i': buffer.put(to!int(int_value)); break; case 'I': buffer.put(to!uint(int_value)); break; default: assert(0); } { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } action put_float_to_array { buffer.put!float(float_value); { auto ptr = cast(uint*)(buffer.data.ptr + tag_array_length_offset); ++*ptr; } } stringvalue = [ !-~]+ > start_tagvalue % set_stringvalue ; hexstringvalue = xdigit+ > start_tagvalue % set_hexstringvalue ; integerarrayvalue = [cCsSiI] > start_arrayvalue (',' int % put_integer_to_array)+ ; floatarrayvalue = [f] > start_arrayvalue (',' float % put_float_to_array)+ ; arrayvalue = integerarrayvalue | floatarrayvalue ; tagvalue = ("A:" charvalue) | ("i:" integervalue) | ("f:" floatvalue) | ("Z:" stringvalue) | ("H:" hexstringvalue) | ("B:" arrayvalue) ; action tag_key_start { tag_key_beg = p - line.ptr; } action tag_key_end { tag_key = cast(ubyte[])(line[tag_key_beg .. p - line.ptr]); } action handle_invalid_tag { buffer.shrink(rollback_size); fhold; fgoto recover_from_invalid_tag; } # FIXME: what if the tag is last? recover_from_invalid_tag := invalid_field '\t' @{ fhold; fgoto tag_parsing; } ; action update_rollback_size { rollback_size = buffer.length; } tag = (alpha alnum) > tag_key_start % tag_key_end ; optionalfield = tag ':' tagvalue % update_rollback_size $!handle_invalid_tag ; optionalfields = optionalfield ('\t' optionalfield)* ; alignment := field_parsing: mandatoryfields tag_parsing: ('\t' optionalfields)? ; write data; }%% import bio.sam.header; import bio.bam.read; import bio.bam.bai.bin; import bio.core.utils.outbuffer; import bio.core.base; import std.conv; import std.array; import std.exception; BamRead parseAlignmentLine(string line, SamHeader header, OutBuffer buffer=null) { char* p = cast(char*)line.ptr; char* pe = p + line.length; char* eof = pe; int cs; if (buffer is null) buffer = new OutBuffer(8192); else buffer.clear(); size_t rollback_size; // needed in case of invalid data byte current_sign = 1; size_t read_name_beg; // position of beginning of QNAME size_t sequence_beg; // position of SEQ start int l_seq; // sequence length uint cigar_op_len; // length of CIGAR operation char cigar_op_chr; // CIGAR operation size_t quals_length; // number of QUAL characters char quals_last_char; // needed in order to handle '*' correctly size_t cigar_op_len_start; // position of start of CIGAR operation long int_value; // for storing temporary integers float float_value; // for storing temporary floats size_t float_beg; // position of start of current float char arraytype; // type of last array tag value size_t tag_array_length_offset; // where the length is stored in the buffer string read_name; ushort flag; int pos = -1; int end_pos; // for bin calculation int mate_pos = -1; ubyte mapping_quality = 255; int template_length = 0; size_t tag_key_beg, tagvalue_beg; ubyte[] tag_key; size_t rname_beg, rnext_beg; int ref_id = -1; %%write init; %%write exec; BamRead read; read.raw_data = buffer.data[]; return read; } unittest { import std.algorithm; import std.math; auto line = "ERR016155.15021091\t185\t20\t60033\t25\t66S35M\t=\t60033\t0\tAGAAAAAACTGGAAGTTAATAGAGTGGTGACTCAGATCCAGTGGTGGAAGGGTAAGGGATCTTGGAACCCTATAGAGTTGCTGTGTGCCAGGGCCAGATCC\t#####################################################################################################\tX0:i:1\tX1:i:0\tXC:i:35\tMD:Z:17A8A8\tRG:Z:ERR016155\tAM:i:0\tNM:i:2\tSM:i:25\tXT:A:U\tBQ:Z:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\tY0:B:c,1,2,3\tY1:B:f,13.263,-3.1415,52.63461"; auto header = new SamHeader("@SQ\tSN:20\tLN:1234567"); auto alignment = parseAlignmentLine(line, header); assert(alignment.name == "ERR016155.15021091"); assert(equal(alignment.sequence(), "AGAAAAAACTGGAAGTTAATAGAGTGGTGACTCAGATCCAGTGGTGGAAGGGTAAGGGATCTTGGAACCCTATAGAGTTGCTGTGTGCCAGGGCCAGATCC")); assert(alignment.cigarString() == "66S35M"); assert(alignment.flag == 185); assert(alignment.position == 60032); assert(alignment.mapping_quality == 25); assert(alignment.mate_position == 60032); assert(alignment.ref_id == 0); assert(alignment.mate_ref_id == 0); assert(to!ubyte(alignment["AM"]) == 0); assert(to!ubyte(alignment["SM"]) == 25); assert(to!string(alignment["MD"]) == "17A8A8"); assert(equal(to!(byte[])(alignment["Y0"]), [1, 2, 3])); assert(equal!approxEqual(to!(float[])(alignment["Y1"]), [13.263, -3.1415, 52.63461])); assert(to!char(alignment["XT"]) == 'U'); import bio.bam.reference; auto info = ReferenceSequenceInfo("20", 1234567); auto invalid_cigar_string = "1\t100\t20\t50000\t30\tMZABC\t=\t50000\t0\tACGT\t####"; alignment = parseAlignmentLine(invalid_cigar_string, header); assert(equal(alignment.sequence(), "ACGT")); auto invalid_tag_and_qual = "2\t100\t20\t5\t40\t27M30X5D\t=\t3\t10\tACT\t !\n\tX1:i:7\tX3:i:zzz\tX4:i:5"; alignment = parseAlignmentLine(invalid_tag_and_qual, header); assert(alignment.base_qualities == [255, 255, 255]); // i.e. invalid assert(to!ubyte(alignment["X1"]) == 7); assert(alignment["X3"].is_nothing); assert(to!ubyte(alignment["X4"]) == 5); } BioD-0.1.0/src_ragel/workarounds/000077500000000000000000000000001273003163100166405ustar00rootroot00000000000000BioD-0.1.0/src_ragel/workarounds/fix_static_const.sh000077500000000000000000000002211273003163100225350ustar00rootroot00000000000000#!/usr/bin/env bash if [[ $OSTYPE == linux-gnu ]]; then sed -i "s/static const/static/g" $1 else sed -i ".bak" "s/static const/static/g" $1 fi BioD-0.1.0/src_ragel/workarounds/fix_switch_case_fallthrough.sh000077500000000000000000000002711273003163100247400ustar00rootroot00000000000000#!/usr/bin/env bash if [[ $OSTYPE == linux-gnu ]]; then sed -i -r 's/^case ([0-9]+)/goto case; case \1/g' $1 else sed -i -r '.bak' 's/^case ([0-9]+)/goto case; case \1/g' $1 fi BioD-0.1.0/test/000077500000000000000000000000001273003163100133005ustar00rootroot00000000000000BioD-0.1.0/test/data/000077500000000000000000000000001273003163100142115ustar00rootroot00000000000000BioD-0.1.0/test/data/b.sam000066400000000000000000003434361273003163100151510ustar00rootroot00000000000000@SQ SN:KI519610.1 LN:7371162 @SQ SN:KI519611.1 LN:6947489 @SQ SN:KI519612.1 LN:6918293 @SQ SN:KI519613.1 LN:6837434 @SQ SN:KI519614.1 LN:6763396 @SQ SN:KI519615.1 LN:6332452 @SQ SN:KI519616.1 LN:6276451 @SQ SN:KI519617.1 LN:5572511 @SQ SN:KI519618.1 LN:5495115 @SQ SN:KI519619.1 LN:5440583 @SQ SN:KI519621.1 LN:5070431 @SQ SN:KI519620.1 LN:4922413 @SQ SN:KI519622.1 LN:4748392 @SQ SN:KI519623.1 LN:4655775 @SQ SN:KI519624.1 LN:4650977 @SQ SN:KI519625.1 LN:4509838 @SQ SN:KI519626.1 LN:4499790 @SQ SN:KI519627.1 LN:4428330 @SQ SN:KI519628.1 LN:4296375 @SQ SN:KI519629.1 LN:4196014 @SQ SN:KI519630.1 LN:4187583 @SQ SN:KI519631.1 LN:4020106 @SQ SN:KI519636.1 LN:3829262 @SQ SN:KI519635.1 LN:3790307 @SQ SN:KI519637.1 LN:3779408 @SQ SN:KI519638.1 LN:3737520 @SQ SN:KI519639.1 LN:3697357 @SQ SN:KI519640.1 LN:3625908 @SQ SN:KI519641.1 LN:3524602 @SQ SN:KI519642.1 LN:3520658 @SQ SN:KI519646.1 LN:3472673 @SQ SN:KI519647.1 LN:3433689 @SQ SN:KI519645.1 LN:3399124 @SQ SN:KI519643.1 LN:3391058 @SQ SN:KI519644.1 LN:3353568 @SQ SN:KI519649.1 LN:3348245 @SQ SN:KI519648.1 LN:3324142 @SQ SN:KI519650.1 LN:3294432 @SQ SN:KI519652.1 LN:3075602 @SQ SN:KI519651.1 LN:3028220 @SQ SN:KI519655.1 LN:2996542 @SQ SN:KI519657.1 LN:2978479 @SQ SN:KI519654.1 LN:2964381 @SQ SN:KI519653.1 LN:2941644 @SQ SN:KI519658.1 LN:2911915 @SQ SN:KI519656.1 LN:2866051 @SQ SN:KI519665.1 LN:2802555 @SQ SN:KI519664.1 LN:2768972 @SQ SN:KI519666.1 LN:2756912 @SQ SN:KI519662.1 LN:2746655 @SQ SN:KI519671.1 LN:2736407 @SQ SN:KI519663.1 LN:2732034 @SQ SN:KI519667.1 LN:2700494 @SQ SN:KI519670.1 LN:2693619 @SQ SN:KI519675.1 LN:2689749 @SQ SN:KI519682.1 LN:2678482 @SQ SN:KI519673.1 LN:2651320 @SQ SN:KI519676.1 LN:2644023 @SQ SN:KI519672.1 LN:2625533 @SQ SN:KI519674.1 LN:2603862 @SQ SN:KI519677.1 LN:2562819 @SQ SN:KI519681.1 LN:2559699 @SQ SN:KI519678.1 LN:2541669 @SQ SN:KI519679.1 LN:2523309 @SQ SN:KI519680.1 LN:2496394 @SQ SN:KI519683.1 LN:2468174 @SQ SN:KI519689.1 LN:2412920 @SQ SN:KI519687.1 LN:2406367 @SQ SN:KI519688.1 LN:2395390 @SQ SN:KI519690.1 LN:2380662 @SQ SN:KI519691.1 LN:2326230 @SQ SN:KI519632.1 LN:2315295 @SQ SN:KI519692.1 LN:2283808 @SQ SN:KI519702.1 LN:2237016 @SQ SN:KI519693.1 LN:2236488 @SQ SN:KI519701.1 LN:2222512 @SQ SN:KI519694.1 LN:2205101 @SQ SN:KI519706.1 LN:2179591 @SQ SN:KI519698.1 LN:2176608 @SQ SN:KI519699.1 LN:2166626 @SQ SN:KI519704.1 LN:2160866 @SQ SN:KI519700.1 LN:2154442 @SQ SN:KI519713.1 LN:2131986 @SQ SN:KI519703.1 LN:2131553 @SQ SN:KI519710.1 LN:2127424 @SQ SN:KI519707.1 LN:2113952 @SQ SN:KI519709.1 LN:2099011 @SQ SN:KI519705.1 LN:2098595 @SQ SN:KI519708.1 LN:2070844 @SQ SN:KI519717.1 LN:2040063 @SQ SN:KI519716.1 LN:2009684 @SQ SN:KI519715.1 LN:2002839 @SQ SN:KI519714.1 LN:1989185 @SQ SN:KI519722.1 LN:1963560 @SQ SN:KI519721.1 LN:1926226 @SQ SN:KI519723.1 LN:1907358 @SQ SN:KI519727.1 LN:1906830 @SQ SN:KI519724.1 LN:1906291 @SQ SN:KI519726.1 LN:1889071 @SQ SN:KI519725.1 LN:1864432 @SQ SN:KI519731.1 LN:1861053 @SQ SN:KI519728.1 LN:1811343 @SQ SN:KI519669.1 LN:1811098 @SQ SN:KI519729.1 LN:1799720 @SQ SN:KI519738.1 LN:1792795 @SQ SN:KI519732.1 LN:1786033 @SQ SN:KI519746.1 LN:1784876 @SQ SN:KI519733.1 LN:1781427 @SQ SN:KI519734.1 LN:1781272 @SQ SN:KI519730.1 LN:1775154 @SQ SN:KI519744.1 LN:1739180 @SQ SN:KI519737.1 LN:1731755 @SQ SN:KI519741.1 LN:1710938 @SQ SN:KI519740.1 LN:1703701 @SQ SN:KI519739.1 LN:1695159 @SQ SN:KI519743.1 LN:1683997 @SQ SN:KI519742.1 LN:1677075 @SQ SN:KI519752.1 LN:1672257 @SQ SN:KI519751.1 LN:1652273 @SQ SN:KI519745.1 LN:1644723 @SQ SN:KI519754.1 LN:1626270 @SQ SN:KI519749.1 LN:1619037 @SQ SN:KI519764.1 LN:1614693 @SQ SN:KI519753.1 LN:1613567 @SQ SN:KI519757.1 LN:1605941 @SQ SN:KI519750.1 LN:1604880 @SQ SN:KI519755.1 LN:1599760 @SQ SN:KI519759.1 LN:1588068 @SQ SN:KI519768.1 LN:1584072 @SQ SN:KI519756.1 LN:1574226 @SQ SN:KI519758.1 LN:1566783 @SQ SN:KI519794.1 LN:1557440 @SQ SN:KI519760.1 LN:1555868 @SQ SN:KI519659.1 LN:1552333 @SQ SN:KI519762.1 LN:1538851 @SQ SN:KI519761.1 LN:1531781 @SQ SN:KI519763.1 LN:1530583 @SQ SN:KI519780.1 LN:1498556 @SQ SN:KI519765.1 LN:1489811 @SQ SN:KI519766.1 LN:1480175 @SQ SN:KI519778.1 LN:1474717 @SQ SN:KI519767.1 LN:1467576 @SQ SN:KI519696.1 LN:1461874 @SQ SN:KI519785.1 LN:1459804 @SQ SN:KI519782.1 LN:1450754 @SQ SN:KI519777.1 LN:1448886 @SQ SN:KI519770.1 LN:1445858 @SQ SN:KI519769.1 LN:1444509 @SQ SN:KI519789.1 LN:1434793 @SQ SN:KI519774.1 LN:1425059 @SQ SN:KI519781.1 LN:1417595 @SQ SN:KI519779.1 LN:1396063 @SQ SN:KI519783.1 LN:1395917 @SQ SN:KI519784.1 LN:1392090 @SQ SN:KI519712.1 LN:1390571 @SQ SN:KI519748.1 LN:1388881 @SQ SN:KI519718.1 LN:1388505 @SQ SN:KI519792.1 LN:1386350 @SQ SN:KI519793.1 LN:1361616 @SQ SN:KI519788.1 LN:1337905 @SQ SN:KI519799.1 LN:1334890 @SQ SN:KI519684.1 LN:1306545 @SQ SN:KI519795.1 LN:1300078 @SQ SN:KI519796.1 LN:1286892 @SQ SN:KI519828.1 LN:1274659 @SQ SN:KI519797.1 LN:1259385 @SQ SN:KI519807.1 LN:1258761 @SQ SN:KI519802.1 LN:1257344 @SQ SN:KI519800.1 LN:1256563 @SQ SN:KI519810.1 LN:1255825 @SQ SN:KI519798.1 LN:1254985 @SQ SN:KI519803.1 LN:1248170 @SQ SN:KI519808.1 LN:1247848 @SQ SN:KI519801.1 LN:1244885 @SQ SN:KI519811.1 LN:1224301 @SQ SN:KI519634.1 LN:1219852 @SQ SN:KI519813.1 LN:1205613 @SQ SN:KI519809.1 LN:1205357 @SQ SN:KI519817.1 LN:1186184 @SQ SN:KI519816.1 LN:1186110 @SQ SN:KI519812.1 LN:1185550 @SQ SN:KI519815.1 LN:1178258 @SQ SN:KI519814.1 LN:1173082 @SQ SN:KI519818.1 LN:1172663 @SQ SN:KI519826.1 LN:1170828 @SQ SN:KI519827.1 LN:1157162 @SQ SN:KI519822.1 LN:1142353 @SQ SN:KI519839.1 LN:1138628 @SQ SN:KI519824.1 LN:1137989 @SQ SN:KI519830.1 LN:1135900 @SQ SN:KI519819.1 LN:1132448 @SQ SN:KI519820.1 LN:1125946 @SQ SN:KI519821.1 LN:1124386 @SQ SN:KI519823.1 LN:1109832 @SQ SN:KI519829.1 LN:1095521 @SQ SN:KI519825.1 LN:1092861 @SQ SN:KI519831.1 LN:1063445 @SQ SN:KI519838.1 LN:1060955 @SQ SN:KI519875.1 LN:1059628 @SQ SN:KI519861.1 LN:1059351 @SQ SN:KI519846.1 LN:1059277 @SQ SN:KI519840.1 LN:1054501 @SQ SN:KI519851.1 LN:1050102 @SQ SN:KI519843.1 LN:1038444 @SQ SN:KI519850.1 LN:1038069 @SQ SN:KI519842.1 LN:1037213 @SQ SN:KI519844.1 LN:1037165 @SQ SN:KI519661.1 LN:1022744 @SQ SN:KI519787.1 LN:1016951 @SQ SN:KI519849.1 LN:1015261 @SQ SN:KI519872.1 LN:1015164 @SQ SN:KI519847.1 LN:1013289 @SQ SN:KI519841.1 LN:1012499 @SQ SN:KI519845.1 LN:1003796 @SQ SN:KI519848.1 LN:995373 @SQ SN:KI519852.1 LN:974716 @SQ SN:KI519855.1 LN:970463 @SQ SN:KI519911.1 LN:968941 @SQ SN:KI519736.1 LN:967356 @SQ SN:KI519853.1 LN:965584 @SQ SN:KI519860.1 LN:964003 @SQ SN:KI519854.1 LN:963790 @SQ SN:KI519871.1 LN:959082 @SQ SN:KI519856.1 LN:958155 @SQ SN:KI519865.1 LN:956798 @SQ SN:KI519862.1 LN:951962 @SQ SN:KI519866.1 LN:950557 @SQ SN:KI519790.1 LN:941629 @SQ SN:KI519868.1 LN:938526 @SQ SN:KI519874.1 LN:933200 @SQ SN:KI519889.1 LN:929221 @SQ SN:KI519834.1 LN:925248 @SQ SN:KI519864.1 LN:922375 @SQ SN:KI519867.1 LN:921651 @SQ SN:KI519863.1 LN:920975 @SQ SN:KI519869.1 LN:914213 @SQ SN:KI519870.1 LN:912190 @SQ SN:KI519873.1 LN:910789 @SQ SN:KI519882.1 LN:902355 @SQ SN:KI519886.1 LN:900483 @SQ SN:KI519879.1 LN:894957 @SQ SN:KI519878.1 LN:891046 @SQ SN:KI519880.1 LN:890306 @SQ SN:KI519909.1 LN:884389 @SQ SN:KI519907.1 LN:883781 @SQ SN:KI519933.1 LN:882922 @SQ SN:KI519888.1 LN:875738 @SQ SN:KI519881.1 LN:874553 @SQ SN:KI519883.1 LN:873715 @SQ SN:KI519884.1 LN:870982 @SQ SN:KI519668.1 LN:869747 @SQ SN:KI519885.1 LN:869286 @SQ SN:KI519887.1 LN:864056 @SQ SN:KI519898.1 LN:863864 @SQ SN:KI519904.1 LN:853971 @SQ SN:KI519890.1 LN:852193 @SQ SN:KI519910.1 LN:849445 @SQ SN:KI519806.1 LN:848400 @SQ SN:KI519891.1 LN:842662 @SQ SN:KI519892.1 LN:827976 @SQ SN:KI519895.1 LN:822168 @SQ SN:KI519897.1 LN:822165 @SQ SN:KI519894.1 LN:818708 @SQ SN:KI519899.1 LN:813829 @SQ SN:KI519893.1 LN:812624 @SQ SN:KI519902.1 LN:807081 @SQ SN:KI519906.1 LN:803884 @SQ SN:KI519896.1 LN:797563 @SQ SN:KI519901.1 LN:796020 @SQ SN:KI519914.1 LN:788024 @SQ SN:KI519735.1 LN:785736 @SQ SN:KI519912.1 LN:778065 @SQ SN:KI519918.1 LN:777749 @SQ SN:KI519903.1 LN:775132 @SQ SN:KI519908.1 LN:771799 @SQ SN:KI519900.1 LN:771364 @SQ SN:KI519965.1 LN:771059 @SQ SN:KI519905.1 LN:767762 @SQ SN:KI519917.1 LN:765758 @SQ SN:KI519927.1 LN:761915 @SQ SN:KI519775.1 LN:760855 @SQ SN:KI519928.1 LN:759973 @SQ SN:KI519711.1 LN:755634 @SQ SN:KI519949.1 LN:754338 @SQ SN:KI519922.1 LN:754001 @SQ SN:KI519913.1 LN:753778 @SQ SN:KI519915.1 LN:752597 @SQ SN:KI519920.1 LN:749598 @SQ SN:KI519938.1 LN:745602 @SQ SN:KI519919.1 LN:742264 @SQ SN:KI519929.1 LN:738552 @SQ SN:KI519962.1 LN:735966 @SQ SN:KI519916.1 LN:735135 @SQ SN:KI519930.1 LN:726307 @SQ SN:KI519921.1 LN:726227 @SQ SN:KI519773.1 LN:719481 @SQ SN:KI519953.1 LN:716867 @SQ SN:KI519932.1 LN:707630 @SQ SN:KI519940.1 LN:705928 @SQ SN:KI519939.1 LN:700049 @SQ SN:KI519931.1 LN:696527 @SQ SN:KI519948.1 LN:691795 @SQ SN:KI519954.1 LN:691586 @SQ SN:KI519961.1 LN:687448 @SQ SN:KI519951.1 LN:685491 @SQ SN:KI519943.1 LN:684417 @SQ SN:KI519941.1 LN:678485 @SQ SN:KI519942.1 LN:672617 @SQ SN:KI519947.1 LN:668769 @SQ SN:KI519956.1 LN:664594 @SQ SN:KI519944.1 LN:664082 @SQ SN:KI519832.1 LN:662663 @SQ SN:KI519989.1 LN:662588 @SQ SN:KI519946.1 LN:660346 @SQ SN:KI519950.1 LN:659193 @SQ SN:KI519945.1 LN:658969 @SQ SN:KI519955.1 LN:654438 @SQ SN:KI519952.1 LN:653361 @SQ SN:KI519960.1 LN:642004 @SQ SN:KI519958.1 LN:638882 @SQ SN:KI519971.1 LN:633982 @SQ SN:KI519957.1 LN:630528 @SQ SN:KI519988.1 LN:627464 @SQ SN:KI520029.1 LN:626045 @SQ SN:KI519959.1 LN:625887 @SQ SN:KI519970.1 LN:622852 @SQ SN:KI519966.1 LN:619930 @SQ SN:KI519963.1 LN:609584 @SQ SN:KI519978.1 LN:607914 @SQ SN:KI519984.1 LN:605445 @SQ SN:KI519964.1 LN:603058 @SQ SN:KI519968.1 LN:602535 @SQ SN:KI519975.1 LN:600300 @SQ SN:KI519967.1 LN:596463 @SQ SN:KI519974.1 LN:588339 @SQ SN:KI519969.1 LN:583331 @SQ SN:KI519992.1 LN:581546 @SQ SN:KI519977.1 LN:579885 @SQ SN:KI520006.1 LN:576246 @SQ SN:KI519986.1 LN:575316 @SQ SN:KI519972.1 LN:571581 @SQ SN:KI519980.1 LN:568648 @SQ SN:KI519973.1 LN:568369 @SQ SN:KI519981.1 LN:566801 @SQ SN:KI519996.1 LN:565380 @SQ SN:KI519991.1 LN:563587 @SQ SN:KI519998.1 LN:560316 @SQ SN:KI519976.1 LN:559898 @SQ SN:KI519982.1 LN:559835 @SQ SN:KI519995.1 LN:559258 @SQ SN:KI519985.1 LN:557415 @SQ SN:KI519979.1 LN:555766 @SQ SN:KI520014.1 LN:553579 @SQ SN:KI520020.1 LN:549452 @SQ SN:KI519983.1 LN:547823 @SQ SN:KI520035.1 LN:543115 @SQ SN:KI519994.1 LN:543031 @SQ SN:KI519990.1 LN:540785 @SQ SN:KI520004.1 LN:535403 @SQ SN:KI520008.1 LN:534882 @SQ SN:KI520009.1 LN:534642 @SQ SN:KI519987.1 LN:532583 @SQ SN:KI519993.1 LN:530512 @SQ SN:KI520010.1 LN:529360 @SQ SN:KI520001.1 LN:529284 @SQ SN:KI520007.1 LN:528357 @SQ SN:KI520000.1 LN:525057 @SQ SN:KI519877.1 LN:523006 @SQ SN:KI520032.1 LN:522705 @SQ SN:KI519999.1 LN:521480 @SQ SN:KI520034.1 LN:520491 @SQ SN:KI520043.1 LN:519751 @SQ SN:KI519836.1 LN:518977 @SQ SN:KI519997.1 LN:518452 @SQ SN:KI519695.1 LN:518063 @SQ SN:KI519685.1 LN:514431 @SQ SN:KI520018.1 LN:509616 @SQ SN:KI520005.1 LN:507319 @SQ SN:KI520030.1 LN:507239 @SQ SN:KI520021.1 LN:506354 @SQ SN:KI520039.1 LN:506306 @SQ SN:KI519937.1 LN:505706 @SQ SN:KI520051.1 LN:505600 @SQ SN:KI520013.1 LN:505209 @SQ SN:KI520087.1 LN:504423 @SQ SN:KI520012.1 LN:502706 @SQ SN:KI520016.1 LN:502101 @SQ SN:KI520003.1 LN:493858 @SQ SN:KI520002.1 LN:493657 @SQ SN:KI520011.1 LN:482030 @SQ SN:KI519935.1 LN:480924 @SQ SN:KI520019.1 LN:476917 @SQ SN:KI519857.1 LN:474583 @SQ SN:KI520015.1 LN:473372 @SQ SN:KI520027.1 LN:473005 @SQ SN:KI520022.1 LN:470305 @SQ SN:KI520024.1 LN:468697 @SQ SN:KI520017.1 LN:466971 @SQ SN:KI520026.1 LN:465720 @SQ SN:KI520023.1 LN:463412 @SQ SN:KI520059.1 LN:458122 @SQ SN:KI520028.1 LN:454640 @SQ SN:KI520045.1 LN:454046 @SQ SN:KI520083.1 LN:453176 @SQ SN:KI520070.1 LN:452620 @SQ SN:KI520031.1 LN:450924 @SQ SN:KI520025.1 LN:450637 @SQ SN:KI520038.1 LN:448234 @SQ SN:KI520062.1 LN:447699 @SQ SN:KI520033.1 LN:447587 @SQ SN:KI520080.1 LN:447015 @SQ SN:KI520037.1 LN:446940 @SQ SN:KI520041.1 LN:446192 @SQ SN:KI520085.1 LN:440649 @SQ SN:KI520081.1 LN:439641 @SQ SN:KI519786.1 LN:439226 @SQ SN:KI520050.1 LN:437507 @SQ SN:KI520048.1 LN:437292 @SQ SN:KI520036.1 LN:435694 @SQ SN:KI520058.1 LN:435626 @SQ SN:KI520046.1 LN:434190 @SQ SN:KI520065.1 LN:430277 @SQ SN:KI520057.1 LN:429902 @SQ SN:KI519776.1 LN:427902 @SQ SN:KI520113.1 LN:427709 @SQ SN:KI520040.1 LN:427024 @SQ SN:KI519837.1 LN:426656 @SQ SN:KI520068.1 LN:425765 @SQ SN:KI520074.1 LN:423533 @SQ SN:KI520076.1 LN:423323 @SQ SN:KI520082.1 LN:422639 @SQ SN:KI520044.1 LN:422061 @SQ SN:KI520042.1 LN:419721 @SQ SN:KI520079.1 LN:419275 @SQ SN:KI520061.1 LN:417825 @SQ SN:KI520056.1 LN:417084 @SQ SN:KI520047.1 LN:415443 @SQ SN:KI520090.1 LN:413523 @SQ SN:KI520049.1 LN:412000 @SQ SN:KI520066.1 LN:410900 @SQ SN:KI520060.1 LN:409490 @SQ SN:KI520054.1 LN:409435 @SQ SN:KI520052.1 LN:408866 @SQ SN:KI520063.1 LN:407519 @SQ SN:KI520091.1 LN:407022 @SQ SN:KI520053.1 LN:406309 @SQ SN:KI520172.1 LN:404925 @SQ SN:KI520115.1 LN:404264 @SQ SN:KI520055.1 LN:403415 @SQ SN:KI520103.1 LN:400728 @SQ SN:KI519876.1 LN:398940 @SQ SN:KI520069.1 LN:398684 @SQ SN:KI520077.1 LN:397753 @SQ SN:KI519719.1 LN:396053 @SQ SN:KI520067.1 LN:395666 @SQ SN:KI520089.1 LN:389347 @SQ SN:KI520064.1 LN:388264 @SQ SN:KI520118.1 LN:387933 @SQ SN:KI520084.1 LN:384971 @SQ SN:KI520128.1 LN:384735 @SQ SN:KI520073.1 LN:382847 @SQ SN:KI520092.1 LN:382578 @SQ SN:KI520072.1 LN:382531 @SQ SN:KI520097.1 LN:382298 @SQ SN:KI520095.1 LN:381882 @SQ SN:KI520100.1 LN:381356 @SQ SN:KI520071.1 LN:380422 @SQ SN:KI520126.1 LN:378002 @SQ SN:KI520102.1 LN:377144 @SQ SN:KI520078.1 LN:377084 @SQ SN:KI520088.1 LN:376007 @SQ SN:KI520075.1 LN:375669 @SQ SN:KI520110.1 LN:375366 @SQ SN:KI520086.1 LN:375081 @SQ SN:KI520108.1 LN:374458 @SQ SN:KI519791.1 LN:373509 @SQ SN:KI520101.1 LN:372465 @SQ SN:KI520116.1 LN:371853 @SQ SN:KI520122.1 LN:370636 @SQ SN:KI519923.1 LN:368044 @SQ SN:KI520131.1 LN:365234 @SQ SN:KI520109.1 LN:364701 @SQ SN:KI520107.1 LN:362761 @SQ SN:KI520094.1 LN:361044 @SQ SN:KI520093.1 LN:357061 @SQ SN:KI520137.1 LN:355941 @SQ SN:KI520099.1 LN:355574 @SQ SN:KI520129.1 LN:355473 @SQ SN:KI520098.1 LN:352742 @SQ SN:KI520164.1 LN:352441 @SQ SN:KI520121.1 LN:351959 @SQ SN:KI520174.1 LN:351136 @SQ SN:KI520139.1 LN:350348 @SQ SN:KI520127.1 LN:349287 @SQ SN:KI520142.1 LN:348601 @SQ SN:KI519924.1 LN:348421 @SQ SN:KI520114.1 LN:347693 @SQ SN:KI520112.1 LN:347396 @SQ SN:KI520156.1 LN:346606 @SQ SN:KI520105.1 LN:346576 @SQ SN:KI520096.1 LN:344468 @SQ SN:KI520153.1 LN:342675 @SQ SN:KI520157.1 LN:338025 @SQ SN:KI520170.1 LN:336371 @SQ SN:KI520140.1 LN:336194 @SQ SN:KI520104.1 LN:335012 @SQ SN:KI520106.1 LN:333405 @SQ SN:KI520141.1 LN:326349 @SQ SN:KI520162.1 LN:324406 @SQ SN:KI520111.1 LN:322854 @SQ SN:KI519833.1 LN:319746 @SQ SN:KI520119.1 LN:319101 @SQ SN:KI519771.1 LN:317676 @SQ SN:KI520117.1 LN:317542 @SQ SN:KI520173.1 LN:317477 @SQ SN:KI520145.1 LN:313854 @SQ SN:KI520143.1 LN:313238 @SQ SN:KI520205.1 LN:313058 @SQ SN:KI520130.1 LN:312863 @SQ SN:KI520120.1 LN:311908 @SQ SN:KI520151.1 LN:310662 @SQ SN:KI520124.1 LN:310103 @SQ SN:KI520154.1 LN:309997 @SQ SN:KI520123.1 LN:309176 @SQ SN:KI519925.1 LN:309090 @SQ SN:KI520147.1 LN:309081 @SQ SN:KI520125.1 LN:308575 @SQ SN:KI520133.1 LN:300920 @SQ SN:KI520180.1 LN:299290 @SQ SN:KI520203.1 LN:299269 @SQ SN:KI520132.1 LN:298778 @SQ SN:KI520158.1 LN:295424 @SQ SN:KI520194.1 LN:295397 @SQ SN:KI520134.1 LN:291763 @SQ SN:KI520179.1 LN:291680 @SQ SN:KI520135.1 LN:291595 @SQ SN:KI520136.1 LN:290460 @SQ SN:KI520138.1 LN:289575 @SQ SN:KI520169.1 LN:289567 @SQ SN:KI520171.1 LN:288891 @SQ SN:KI520233.1 LN:288862 @SQ SN:KI520176.1 LN:287470 @SQ SN:KI520187.1 LN:286838 @SQ SN:KI520183.1 LN:286128 @SQ SN:KI520167.1 LN:284188 @SQ SN:KI520234.1 LN:282972 @SQ SN:KI520144.1 LN:281831 @SQ SN:KI520168.1 LN:281631 @SQ SN:KI520148.1 LN:281439 @SQ SN:KI520146.1 LN:280126 @SQ SN:KI520216.1 LN:279272 @SQ SN:KI520166.1 LN:279222 @SQ SN:KI520160.1 LN:278575 @SQ SN:KI520149.1 LN:278352 @SQ SN:KI520165.1 LN:276949 @SQ SN:KI520152.1 LN:275923 @SQ SN:KI520150.1 LN:275635 @SQ SN:KI520159.1 LN:274370 @SQ SN:KI520155.1 LN:274014 @SQ SN:KI519926.1 LN:273463 @SQ SN:KI520188.1 LN:272857 @SQ SN:KI519747.1 LN:272820 @SQ SN:KI520211.1 LN:271927 @SQ SN:KI520241.1 LN:271584 @SQ SN:KI520163.1 LN:271045 @SQ SN:KI520161.1 LN:270610 @SQ SN:KI520182.1 LN:270233 @SQ SN:KI520221.1 LN:268699 @SQ SN:KI520189.1 LN:268692 @SQ SN:KI520195.1 LN:267267 @SQ SN:KI520190.1 LN:263297 @SQ SN:KI520191.1 LN:261118 @SQ SN:KI520181.1 LN:259438 @SQ SN:KI520201.1 LN:258131 @SQ SN:KI520178.1 LN:256862 @SQ SN:KI520175.1 LN:255093 @SQ SN:KI520274.1 LN:251942 @SQ SN:KI520177.1 LN:251228 @SQ SN:KI520254.1 LN:249901 @SQ SN:KI520200.1 LN:249189 @SQ SN:KI520184.1 LN:248793 @SQ SN:KI520227.1 LN:248699 @SQ SN:KI520207.1 LN:248653 @SQ SN:KI520206.1 LN:247634 @SQ SN:KI520213.1 LN:247574 @SQ SN:KI520223.1 LN:247389 @SQ SN:KI520220.1 LN:246891 @SQ SN:KI520232.1 LN:244918 @SQ SN:KI520193.1 LN:243540 @SQ SN:KI520218.1 LN:243011 @SQ SN:KI520246.1 LN:242798 @SQ SN:KI520185.1 LN:242026 @SQ SN:KI520202.1 LN:240588 @SQ SN:KI520222.1 LN:240514 @SQ SN:KI520242.1 LN:240488 @SQ SN:KI520250.1 LN:240157 @SQ SN:KI519835.1 LN:239066 @SQ SN:KI520199.1 LN:238313 @SQ SN:KI520186.1 LN:237782 @SQ SN:KI520208.1 LN:234779 @SQ SN:KI520210.1 LN:233258 @SQ SN:KI520240.1 LN:232981 @SQ SN:KI519805.1 LN:232184 @SQ SN:KI520272.1 LN:231816 @SQ SN:KI520298.1 LN:231714 @SQ SN:KI520280.1 LN:230535 @SQ SN:KI520224.1 LN:230024 @SQ SN:KI520192.1 LN:229931 @SQ SN:KI520209.1 LN:228034 @SQ SN:KI520214.1 LN:227180 @SQ SN:KI520198.1 LN:226910 @SQ SN:KI520212.1 LN:225548 @SQ SN:KI520286.1 LN:225408 @SQ SN:KI520204.1 LN:224843 @SQ SN:KI520337.1 LN:224588 @SQ SN:KI520238.1 LN:224070 @SQ SN:KI520251.1 LN:221851 @SQ SN:KI520262.1 LN:221724 @SQ SN:KI520197.1 LN:221577 @SQ SN:KI520196.1 LN:221011 @SQ SN:KI520263.1 LN:219963 @SQ SN:AYCK01029288.1 LN:217642 @SQ SN:KI520230.1 LN:215567 @SQ SN:KI520239.1 LN:214331 @SQ SN:KI520248.1 LN:213703 @SQ SN:KI520226.1 LN:213676 @SQ SN:KI520252.1 LN:212215 @SQ SN:KI520215.1 LN:210585 @SQ SN:KI520236.1 LN:210066 @SQ SN:KI520255.1 LN:209853 @SQ SN:KI520217.1 LN:209494 @SQ SN:KI520294.1 LN:208447 @SQ SN:KI520219.1 LN:207366 @SQ SN:KI520287.1 LN:207131 @SQ SN:KI520244.1 LN:207082 @SQ SN:KI520225.1 LN:206357 @SQ SN:KI520275.1 LN:205121 @SQ SN:KI520229.1 LN:205104 @SQ SN:KI519934.1 LN:204207 @SQ SN:KI520293.1 LN:203594 @SQ SN:KI520228.1 LN:203207 @SQ SN:KI520253.1 LN:201804 @SQ SN:KI520257.1 LN:201040 @SQ SN:KI520290.1 LN:200991 @SQ SN:KI520243.1 LN:200799 @SQ SN:KI520384.1 LN:199246 @SQ SN:KI520235.1 LN:199095 @SQ SN:KI520307.1 LN:198729 @SQ SN:KI520258.1 LN:198661 @SQ SN:KI520231.1 LN:196868 @SQ SN:KI520266.1 LN:196255 @SQ SN:KI520269.1 LN:195608 @SQ SN:KI520249.1 LN:194834 @SQ SN:KI520277.1 LN:194531 @SQ SN:KI520314.1 LN:193413 @SQ SN:KI520295.1 LN:193130 @SQ SN:KI520247.1 LN:191670 @SQ SN:KI520279.1 LN:191289 @SQ SN:KI520259.1 LN:190194 @SQ SN:KI520237.1 LN:189929 @SQ SN:KI520281.1 LN:189718 @SQ SN:KI520324.1 LN:187651 @SQ SN:KI520302.1 LN:186984 @SQ SN:KI520264.1 LN:186601 @SQ SN:KI520256.1 LN:186297 @SQ SN:KI519936.1 LN:185566 @SQ SN:AYCK01029289.1 LN:185159 @SQ SN:KI520267.1 LN:185035 @SQ SN:KI520245.1 LN:184504 @SQ SN:KI520305.1 LN:182977 @SQ SN:KI520348.1 LN:181425 @SQ SN:KI520316.1 LN:181331 @SQ SN:KI520319.1 LN:180653 @SQ SN:KI520261.1 LN:179840 @SQ SN:KI520289.1 LN:179371 @SQ SN:KI520273.1 LN:178588 @SQ SN:KI520410.1 LN:175697 @SQ SN:KI520260.1 LN:174977 @SQ SN:KI520285.1 LN:174321 @SQ SN:KI520265.1 LN:174077 @SQ SN:KI520336.1 LN:173929 @SQ SN:KI520271.1 LN:173542 @SQ SN:KI520270.1 LN:173310 @SQ SN:KI520282.1 LN:173006 @SQ SN:KI520292.1 LN:171933 @SQ SN:KI520268.1 LN:171865 @SQ SN:KI520296.1 LN:170665 @SQ SN:KI520306.1 LN:170557 @SQ SN:KI520291.1 LN:169956 @SQ SN:KI520308.1 LN:169428 @SQ SN:KI520330.1 LN:168879 @SQ SN:KI520299.1 LN:168403 @SQ SN:KI520300.1 LN:167961 @SQ SN:KI520359.1 LN:167673 @SQ SN:KI520315.1 LN:167546 @SQ SN:KI520284.1 LN:167249 @SQ SN:KI519686.1 LN:165893 @SQ SN:KI520288.1 LN:165557 @SQ SN:KI519804.1 LN:165389 @SQ SN:KI519859.1 LN:164080 @SQ SN:KI520724.1 LN:163645 @SQ SN:KI520276.1 LN:163523 @SQ SN:KI520311.1 LN:163180 @SQ SN:KI520278.1 LN:162630 @SQ SN:KI520309.1 LN:162129 @SQ SN:KI520313.1 LN:160864 @SQ SN:KI520452.1 LN:160818 @SQ SN:KI520283.1 LN:160675 @SQ SN:KI520321.1 LN:160374 @SQ SN:KI519697.1 LN:159964 @SQ SN:KI520340.1 LN:159394 @SQ SN:KI520332.1 LN:159301 @SQ SN:KI520322.1 LN:158481 @SQ SN:KI520301.1 LN:157826 @SQ SN:AYCK01023213.1 LN:157164 @SQ SN:KI520326.1 LN:156492 @SQ SN:KI520369.1 LN:156405 @SQ SN:KI520342.1 LN:155957 @SQ SN:KI519772.1 LN:154583 @SQ SN:KI520318.1 LN:153756 @SQ SN:KI520418.1 LN:153448 @SQ SN:KI520297.1 LN:153401 @SQ SN:KI520327.1 LN:153009 @SQ SN:KI520368.1 LN:151711 @SQ SN:KI520382.1 LN:151293 @SQ SN:KI520370.1 LN:149541 @SQ SN:KI520317.1 LN:149329 @SQ SN:KI520323.1 LN:149300 @SQ SN:KI520303.1 LN:147834 @SQ SN:KI520304.1 LN:147612 @SQ SN:KI520312.1 LN:142288 @SQ SN:KI520372.1 LN:140985 @SQ SN:KI520377.1 LN:140944 @SQ SN:KI520310.1 LN:140894 @SQ SN:KI520394.1 LN:140891 @SQ SN:KI520353.1 LN:140746 @SQ SN:KI520329.1 LN:140510 @SQ SN:KI520325.1 LN:139765 @SQ SN:KI520335.1 LN:139405 @SQ SN:KI520391.1 LN:139209 @SQ SN:KI520351.1 LN:139188 @SQ SN:KI520379.1 LN:139157 @SQ SN:KI519660.1 LN:139139 @SQ SN:KI520338.1 LN:138761 @SQ SN:KI520333.1 LN:137260 @SQ SN:KI520389.1 LN:135924 @SQ SN:KI520356.1 LN:134320 @SQ SN:KI520397.1 LN:134207 @SQ SN:KI520366.1 LN:133966 @SQ SN:KI520354.1 LN:133775 @SQ SN:KI520320.1 LN:133607 @SQ SN:KI520383.1 LN:133534 @SQ SN:KI520451.1 LN:133445 @SQ SN:KI519858.1 LN:133015 @SQ SN:KI519633.1 LN:132715 @SQ SN:KI520347.1 LN:132454 @SQ SN:KI520421.1 LN:132140 @SQ SN:KI520331.1 LN:132060 @SQ SN:KI520346.1 LN:131209 @SQ SN:KI520357.1 LN:130674 @SQ SN:KI520349.1 LN:130030 @SQ SN:KI520381.1 LN:129537 @SQ SN:KI520341.1 LN:129054 @SQ SN:KI519720.1 LN:129031 @SQ SN:KI520388.1 LN:128779 @SQ SN:KI520328.1 LN:128571 @SQ SN:KI520402.1 LN:127597 @SQ SN:KI520395.1 LN:127227 @SQ SN:KI520364.1 LN:127112 @SQ SN:KI520339.1 LN:127070 @SQ SN:KI520358.1 LN:127049 @SQ SN:KI520361.1 LN:126701 @SQ SN:KI520401.1 LN:126509 @SQ SN:KI520398.1 LN:126246 @SQ SN:KI520345.1 LN:125722 @SQ SN:KI520334.1 LN:125567 @SQ SN:KI520362.1 LN:124729 @SQ SN:KI520367.1 LN:122791 @SQ SN:KI520363.1 LN:122676 @SQ SN:KI520424.1 LN:122296 @SQ SN:KI520343.1 LN:122112 @SQ SN:KI520390.1 LN:121529 @SQ SN:KI520344.1 LN:121002 @SQ SN:KI520477.1 LN:120989 @SQ SN:KI520392.1 LN:120670 @SQ SN:KI520375.1 LN:120570 @SQ SN:KI520396.1 LN:120194 @SQ SN:KI520352.1 LN:120067 @SQ SN:KI520433.1 LN:119929 @SQ SN:KI520360.1 LN:119459 @SQ SN:KI520371.1 LN:119288 @SQ SN:KI520350.1 LN:117786 @SQ SN:KI520449.1 LN:117374 @SQ SN:KI520439.1 LN:116931 @SQ SN:KI520365.1 LN:116892 @SQ SN:KI520409.1 LN:116268 @SQ SN:KI520456.1 LN:116061 @SQ SN:KI520407.1 LN:115525 @SQ SN:KI520461.1 LN:115253 @SQ SN:KI520355.1 LN:115220 @SQ SN:KI520386.1 LN:115085 @SQ SN:KI520420.1 LN:113501 @SQ SN:KI520417.1 LN:113100 @SQ SN:KI520440.1 LN:112599 @SQ SN:KI520426.1 LN:111581 @SQ SN:KI520486.1 LN:111072 @SQ SN:KI520436.1 LN:110802 @SQ SN:KI520469.1 LN:109903 @SQ SN:KI520496.1 LN:109297 @SQ SN:KI520373.1 LN:108999 @SQ SN:KI520376.1 LN:108683 @SQ SN:KI520454.1 LN:108439 @SQ SN:KI520393.1 LN:108389 @SQ SN:KI520422.1 LN:108307 @SQ SN:KI520378.1 LN:108081 @SQ SN:KI520380.1 LN:107822 @SQ SN:KI520399.1 LN:107590 @SQ SN:KI520374.1 LN:106847 @SQ SN:KI520405.1 LN:106386 @SQ SN:KI520404.1 LN:106151 @SQ SN:KI520457.1 LN:105623 @SQ SN:KI520387.1 LN:105290 @SQ SN:KI520419.1 LN:104470 @SQ SN:KI520411.1 LN:104424 @SQ SN:KI520385.1 LN:104321 @SQ SN:KI520403.1 LN:104231 @SQ SN:KI520406.1 LN:103581 @SQ SN:KI520479.1 LN:102530 @SQ SN:KI520465.1 LN:102402 @SQ SN:KI520423.1 LN:101899 @SQ SN:KI520520.1 LN:101730 @SQ SN:KI520400.1 LN:101182 @SQ SN:KI520414.1 LN:100961 @SQ SN:KI520478.1 LN:99711 @SQ SN:KI520455.1 LN:99659 @SQ SN:KI520468.1 LN:99325 @SQ SN:KI520412.1 LN:99202 @SQ SN:KI520471.1 LN:98675 @SQ SN:KI520415.1 LN:98626 @SQ SN:KI520442.1 LN:98356 @SQ SN:KI520437.1 LN:98346 @SQ SN:KI520408.1 LN:97627 @SQ SN:KI520416.1 LN:97544 @SQ SN:KI520519.1 LN:96699 @SQ SN:KI520427.1 LN:96482 @SQ SN:KI520431.1 LN:96318 @SQ SN:KI520428.1 LN:96212 @SQ SN:KI520434.1 LN:96026 @SQ SN:KI520480.1 LN:95852 @SQ SN:KI520487.1 LN:95657 @SQ SN:KI520435.1 LN:95488 @SQ SN:KI520413.1 LN:95283 @SQ SN:KI520438.1 LN:94996 @SQ SN:KI520513.1 LN:94967 @SQ SN:KI520443.1 LN:93120 @SQ SN:KI520518.1 LN:92751 @SQ SN:KI520446.1 LN:92538 @SQ SN:KI520441.1 LN:92004 @SQ SN:KI520453.1 LN:91818 @SQ SN:KI520425.1 LN:91762 @SQ SN:KI520444.1 LN:91472 @SQ SN:KI520511.1 LN:91339 @SQ SN:KI520430.1 LN:90531 @SQ SN:KI520450.1 LN:90445 @SQ SN:KI520432.1 LN:90088 @SQ SN:KI520445.1 LN:90047 @SQ SN:KI520429.1 LN:90004 @SQ SN:KI520492.1 LN:89648 @SQ SN:KI520460.1 LN:89178 @SQ SN:KI520475.1 LN:88565 @SQ SN:KI520791.1 LN:88224 @SQ SN:KI520503.1 LN:88012 @SQ SN:KI520551.1 LN:87789 @SQ SN:KI520545.1 LN:87455 @SQ SN:KI520448.1 LN:87094 @SQ SN:KI520841.1 LN:86339 @SQ SN:AYCK01025055.1 LN:86337 @SQ SN:KI520463.1 LN:86280 @SQ SN:KI520481.1 LN:85987 @SQ SN:KI520447.1 LN:85878 @SQ SN:KI520515.1 LN:85607 @SQ SN:KI520548.1 LN:84918 @SQ SN:KI520472.1 LN:84705 @SQ SN:KI520464.1 LN:83744 @SQ SN:KI520462.1 LN:83712 @SQ SN:KI520488.1 LN:82986 @SQ SN:KI520485.1 LN:82809 @SQ SN:KI520459.1 LN:82396 @SQ SN:KI520470.1 LN:82377 @SQ SN:KI520533.1 LN:81810 @SQ SN:KI520473.1 LN:81802 @SQ SN:KI520517.1 LN:81704 @SQ SN:KI520541.1 LN:80906 @SQ SN:KI520494.1 LN:80886 @SQ SN:KI520467.1 LN:80771 @SQ SN:KI520483.1 LN:80479 @SQ SN:KI520497.1 LN:79444 @SQ SN:KI520495.1 LN:78984 @SQ SN:KI520466.1 LN:78140 @SQ SN:KI520589.1 LN:77810 @SQ SN:KI520474.1 LN:77377 @SQ SN:KI520535.1 LN:77059 @SQ SN:KI520560.1 LN:76857 @SQ SN:KI520500.1 LN:76674 @SQ SN:KI520572.1 LN:76339 @SQ SN:KI520482.1 LN:76061 @SQ SN:KI520576.1 LN:75724 @SQ SN:KI520538.1 LN:75498 @SQ SN:KI520590.1 LN:74966 @SQ SN:KI520579.1 LN:74809 @SQ SN:KI520484.1 LN:74740 @SQ SN:KI520499.1 LN:74688 @SQ SN:KI520491.1 LN:74548 @SQ SN:KI520600.1 LN:74083 @SQ SN:KI520476.1 LN:73888 @SQ SN:KI520550.1 LN:73756 @SQ SN:KI520507.1 LN:73618 @SQ SN:KI520512.1 LN:73616 @SQ SN:KI520559.1 LN:73352 @SQ SN:KI520567.1 LN:72658 @SQ SN:KI520458.1 LN:72654 @SQ SN:KI520498.1 LN:72622 @SQ SN:KI520490.1 LN:72463 @SQ SN:KI520561.1 LN:72240 @SQ SN:KI520493.1 LN:70882 @SQ SN:KI520522.1 LN:70750 @SQ SN:KI520506.1 LN:70487 @SQ SN:KI520526.1 LN:70369 @SQ SN:KI520504.1 LN:69925 @SQ SN:KI520532.1 LN:69904 @SQ SN:KI520489.1 LN:69751 @SQ SN:KI520570.1 LN:69704 @SQ SN:KI520501.1 LN:69418 @SQ SN:KI520528.1 LN:69131 @SQ SN:KI520505.1 LN:69101 @SQ SN:KI520502.1 LN:69082 @SQ SN:KI520537.1 LN:68929 @SQ SN:KI520521.1 LN:68623 @SQ SN:KI520527.1 LN:68601 @SQ SN:KI520584.1 LN:68201 @SQ SN:AYCK01029290.1 LN:68042 @SQ SN:KI520529.1 LN:68026 @SQ SN:KI520508.1 LN:67959 @SQ SN:KI520622.1 LN:67573 @SQ SN:KI520652.1 LN:67563 @SQ SN:KI520651.1 LN:67474 @SQ SN:KI520568.1 LN:67093 @SQ SN:KI520514.1 LN:66919 @SQ SN:KI520531.1 LN:66546 @SQ SN:KI520516.1 LN:66414 @SQ SN:KI520542.1 LN:66195 @SQ SN:KI520540.1 LN:65469 @SQ SN:KI520509.1 LN:65172 @SQ SN:KI520631.1 LN:64877 @SQ SN:KI520534.1 LN:64651 @SQ SN:KI520555.1 LN:64502 @SQ SN:KI520510.1 LN:64478 @SQ SN:KI520525.1 LN:63751 @SQ SN:KI520546.1 LN:63185 @SQ SN:KI520549.1 LN:62810 @SQ SN:KI520523.1 LN:62653 @SQ SN:KI520536.1 LN:62634 @SQ SN:KI520524.1 LN:62487 @SQ SN:KI520530.1 LN:60693 @SQ SN:KI520630.1 LN:60407 @SQ SN:KI520592.1 LN:60319 @SQ SN:KI520543.1 LN:59652 @SQ SN:KI520539.1 LN:58666 @SQ SN:KI520558.1 LN:58616 @SQ SN:KI520544.1 LN:58165 @SQ SN:KI520547.1 LN:57681 @SQ SN:KI520615.1 LN:57478 @SQ SN:KI520694.1 LN:57021 @SQ SN:KI520659.1 LN:56766 @SQ SN:KI520564.1 LN:56492 @SQ SN:KI520554.1 LN:56184 @SQ SN:KI520553.1 LN:56049 @SQ SN:KI520573.1 LN:55853 @SQ SN:KI520556.1 LN:55538 @SQ SN:KI520591.1 LN:55523 @SQ SN:KI520552.1 LN:55081 @SQ SN:KI520683.1 LN:55008 @SQ SN:KI520730.1 LN:54928 @SQ SN:KI520654.1 LN:54908 @SQ SN:KI520577.1 LN:54635 @SQ SN:KI520687.1 LN:53728 @SQ SN:KI520672.1 LN:53587 @SQ SN:KI520578.1 LN:53492 @SQ SN:KI520800.1 LN:53469 @SQ SN:KI520827.1 LN:53448 @SQ SN:KI520571.1 LN:53397 @SQ SN:KI520919.1 LN:53191 @SQ SN:KI520585.1 LN:53187 @SQ SN:KI520566.1 LN:52626 @SQ SN:KI520569.1 LN:52157 @SQ SN:KI520979.1 LN:51626 @SQ SN:KI520583.1 LN:51445 @SQ SN:KI520562.1 LN:51347 @SQ SN:KI520557.1 LN:51080 @SQ SN:KI520602.1 LN:51033 @SQ SN:KI520670.1 LN:50996 @SQ SN:KI520597.1 LN:50594 @SQ SN:KI520563.1 LN:50552 @SQ SN:KI520978.1 LN:50518 @SQ SN:KI520946.1 LN:50498 @SQ SN:KI520588.1 LN:50438 @SQ SN:KI520580.1 LN:50042 @SQ SN:KI520822.1 LN:49815 @SQ SN:KI520565.1 LN:49551 @SQ SN:KI520587.1 LN:49299 @SQ SN:KI520581.1 LN:49031 @SQ SN:KI520802.1 LN:48958 @SQ SN:KI521064.1 LN:48871 @SQ SN:KI520685.1 LN:48757 @SQ SN:KI520786.1 LN:48721 @SQ SN:KI520605.1 LN:48703 @SQ SN:KI520575.1 LN:48362 @SQ SN:KI520818.1 LN:48304 @SQ SN:KI520612.1 LN:48258 @SQ SN:KI520574.1 LN:46900 @SQ SN:KI520595.1 LN:46728 @SQ SN:KI520955.1 LN:46694 @SQ SN:KI520582.1 LN:46616 @SQ SN:KI520586.1 LN:46205 @SQ SN:KI520596.1 LN:46128 @SQ SN:KI520599.1 LN:45894 @SQ SN:KI520669.1 LN:45724 @SQ SN:KI520635.1 LN:45266 @SQ SN:KI520610.1 LN:45133 @SQ SN:KI520617.1 LN:45086 @SQ SN:KI520598.1 LN:45084 @SQ SN:KI520781.1 LN:44997 @SQ SN:KI521144.1 LN:44961 @SQ SN:KI520906.1 LN:44912 @SQ SN:KI520834.1 LN:44752 @SQ SN:AYCK01029291.1 LN:44628 @SQ SN:KI520607.1 LN:44581 @SQ SN:KI520601.1 LN:44163 @SQ SN:KI520619.1 LN:44110 @SQ SN:KI520606.1 LN:43996 @SQ SN:KI520594.1 LN:43787 @SQ SN:KI520614.1 LN:43774 @SQ SN:KI520850.1 LN:43238 @SQ SN:KI520608.1 LN:43134 @SQ SN:KI520640.1 LN:43132 @SQ SN:KI521049.1 LN:42975 @SQ SN:KI520593.1 LN:42785 @SQ SN:KI520609.1 LN:42703 @SQ SN:KI520618.1 LN:42655 @SQ SN:KI520604.1 LN:42365 @SQ SN:KI520700.1 LN:42092 @SQ SN:KI520633.1 LN:42043 @SQ SN:KI521162.1 LN:42033 @SQ SN:KI521316.1 LN:41581 @SQ SN:KI520623.1 LN:41501 @SQ SN:KI520624.1 LN:41007 @SQ SN:KI520611.1 LN:40886 @SQ SN:KI520603.1 LN:40715 @SQ SN:KI521143.1 LN:40673 @SQ SN:KI520621.1 LN:40664 @SQ SN:KI520790.1 LN:40496 @SQ SN:KI520626.1 LN:40319 @SQ SN:AYCK01029292.1 LN:39974 @SQ SN:KI520639.1 LN:39905 @SQ SN:KI520620.1 LN:39834 @SQ SN:KI520613.1 LN:39701 @SQ SN:KI520638.1 LN:39682 @SQ SN:KI520871.1 LN:39637 @SQ SN:AYCK01026491.1 LN:39627 @SQ SN:AYCK01029293.1 LN:39302 @SQ SN:KI520625.1 LN:39294 @SQ SN:KI520616.1 LN:39126 @SQ SN:KI520629.1 LN:39004 @SQ SN:KI520632.1 LN:38926 @SQ SN:KI520628.1 LN:38744 @SQ SN:KI520627.1 LN:38464 @SQ SN:KI520643.1 LN:38347 @SQ SN:KI520636.1 LN:38230 @SQ SN:KI520657.1 LN:38083 @SQ SN:KI520634.1 LN:37541 @SQ SN:AYCK01029294.1 LN:37038 @SQ SN:KI520641.1 LN:36885 @SQ SN:AYCK01029295.1 LN:36763 @SQ SN:KI520655.1 LN:36468 @SQ SN:KI520645.1 LN:36382 @SQ SN:KI520647.1 LN:36270 @SQ SN:KI520637.1 LN:36264 @SQ SN:KI520644.1 LN:36138 @SQ SN:AYCK01029296.1 LN:35975 @SQ SN:AYCK01026643.1 LN:35792 @SQ SN:KI520663.1 LN:35771 @SQ SN:KI520646.1 LN:35763 @SQ SN:KI520681.1 LN:35676 @SQ SN:KI520649.1 LN:35024 @SQ SN:AYCK01029297.1 LN:34617 @SQ SN:KI520642.1 LN:34540 @SQ SN:KI520665.1 LN:34320 @SQ SN:AYCK01029298.1 LN:34301 @SQ SN:KI520648.1 LN:34270 @SQ SN:KI520661.1 LN:34248 @SQ SN:KI520677.1 LN:33994 @SQ SN:KI520680.1 LN:33822 @SQ SN:KI520650.1 LN:33767 @SQ SN:KI520699.1 LN:33478 @SQ SN:KI520697.1 LN:33048 @SQ SN:AYCK01029299.1 LN:32913 @SQ SN:KI520653.1 LN:32895 @SQ SN:KI520695.1 LN:32619 @SQ SN:KI520656.1 LN:32577 @SQ SN:KI520666.1 LN:32406 @SQ SN:KI520662.1 LN:32283 @SQ SN:KI520660.1 LN:32247 @SQ SN:AYCK01029300.1 LN:32186 @SQ SN:KI520667.1 LN:32133 @SQ SN:KI520658.1 LN:32033 @SQ SN:KI520692.1 LN:31950 @SQ SN:KI520696.1 LN:31568 @SQ SN:KI520664.1 LN:31488 @SQ SN:KI520675.1 LN:31455 @SQ SN:KI520668.1 LN:31332 @SQ SN:KI520673.1 LN:31210 @SQ SN:KI520679.1 LN:31069 @SQ SN:AYCK01029301.1 LN:31045 @SQ SN:KI520688.1 LN:30992 @SQ SN:KI520689.1 LN:30905 @SQ SN:KI520701.1 LN:30864 @SQ SN:KI520674.1 LN:30839 @SQ SN:KI520693.1 LN:30740 @SQ SN:AYCK01029302.1 LN:30691 @SQ SN:AYCK01029303.1 LN:30551 @SQ SN:KI520671.1 LN:30528 @SQ SN:KI520707.1 LN:30249 @SQ SN:KI520691.1 LN:30224 @SQ SN:KI520676.1 LN:30218 @SQ SN:KI520684.1 LN:30201 @SQ SN:AYCK01026785.1 LN:30098 @SQ SN:KI520722.1 LN:29992 @SQ SN:KI520678.1 LN:29964 @SQ SN:KI520682.1 LN:29753 @SQ SN:AYCK01029304.1 LN:29654 @SQ SN:AYCK01026801.1 LN:29513 @SQ SN:KI520718.1 LN:29432 @SQ SN:KI520686.1 LN:29164 @SQ SN:AYCK01029305.1 LN:29145 @SQ SN:KI520702.1 LN:29111 @SQ SN:KI520709.1 LN:29026 @SQ SN:KI520690.1 LN:29018 @SQ SN:KI521081.1 LN:28845 @SQ SN:AYCK01029306.1 LN:28822 @SQ SN:KI520706.1 LN:28816 @SQ SN:AYCK01029307.1 LN:28463 @SQ SN:AYCK01029308.1 LN:28452 @SQ SN:KI520721.1 LN:28367 @SQ SN:KI520698.1 LN:28192 @SQ SN:KI520756.1 LN:28165 @SQ SN:KI520746.1 LN:28027 @SQ SN:KI520703.1 LN:28000 @SQ SN:KI520731.1 LN:27968 @SQ SN:KI520736.1 LN:27822 @SQ SN:AYCK01026880.1 LN:27790 @SQ SN:KI520704.1 LN:27738 @SQ SN:KI520713.1 LN:27715 @SQ SN:KI520708.1 LN:27698 @SQ SN:KI520705.1 LN:27570 @SQ SN:KI520727.1 LN:27500 @SQ SN:AYCK01029309.1 LN:27204 @SQ SN:KI520710.1 LN:27185 @SQ SN:KI520711.1 LN:27164 @SQ SN:KI520712.1 LN:26988 @SQ SN:AYCK01029310.1 LN:26955 @SQ SN:KI520794.1 LN:26938 @SQ SN:KI520735.1 LN:26930 @SQ SN:KI520714.1 LN:26713 @SQ SN:KI520717.1 LN:26537 @SQ SN:KI520740.1 LN:26497 @SQ SN:AYCK01029311.1 LN:26471 @SQ SN:KI520745.1 LN:26381 @SQ SN:KI520754.1 LN:26357 @SQ SN:KI520763.1 LN:26338 @SQ SN:KI520719.1 LN:26313 @SQ SN:KI520716.1 LN:26285 @SQ SN:KI520720.1 LN:26281 @SQ SN:KI520737.1 LN:26201 @SQ SN:KI520734.1 LN:26199 @SQ SN:KI520715.1 LN:26153 @SQ SN:KI520726.1 LN:25825 @SQ SN:KI520723.1 LN:25650 @SQ SN:AYCK01026963.1 LN:25583 @SQ SN:KI520728.1 LN:25513 @SQ SN:KI520732.1 LN:25413 @SQ SN:KI520725.1 LN:25396 @SQ SN:AYCK01029312.1 LN:25327 @SQ SN:KI520780.1 LN:25287 @SQ SN:KI520774.1 LN:25046 @SQ SN:KI520738.1 LN:25044 @SQ SN:AYCK01029313.1 LN:25013 @SQ SN:AYCK01029314.1 LN:24931 @SQ SN:KI520748.1 LN:24883 @SQ SN:KI520788.1 LN:24860 @SQ SN:KI520742.1 LN:24850 @SQ SN:KI520729.1 LN:24785 @SQ SN:KI520767.1 LN:24688 @SQ SN:KI520733.1 LN:24654 @SQ SN:KI520771.1 LN:24643 @SQ SN:KI520741.1 LN:24589 @SQ SN:AYCK01029315.1 LN:24575 @SQ SN:KI520743.1 LN:24488 @SQ SN:KI520750.1 LN:24401 @SQ SN:KI520744.1 LN:24382 @SQ SN:KI520772.1 LN:24230 @SQ SN:KI520782.1 LN:24131 @SQ SN:KI520739.1 LN:24090 @SQ SN:KI520762.1 LN:23918 @SQ SN:KI520747.1 LN:23866 @SQ SN:AYCK01029316.1 LN:23766 @SQ SN:KI520749.1 LN:23629 @SQ SN:KI520751.1 LN:23615 @SQ SN:KI520839.1 LN:23613 @SQ SN:KI520835.1 LN:23562 @SQ SN:KI520757.1 LN:23559 @SQ SN:AYCK01029317.1 LN:23515 @SQ SN:KI520752.1 LN:23468 @SQ SN:KI520753.1 LN:23464 @SQ SN:KI520848.1 LN:23408 @SQ SN:KI520796.1 LN:23395 @SQ SN:AYCK01029318.1 LN:23162 @SQ SN:KI520766.1 LN:23155 @SQ SN:KI520765.1 LN:23018 @SQ SN:AYCK01029319.1 LN:22924 @SQ SN:KI520758.1 LN:22767 @SQ SN:KI520760.1 LN:22764 @SQ SN:AYCK01029320.1 LN:22759 @SQ SN:KI520755.1 LN:22688 @SQ SN:KI520895.1 LN:22650 @SQ SN:KI520761.1 LN:22628 @SQ SN:KI520764.1 LN:22598 @SQ SN:AYCK01029321.1 LN:22579 @SQ SN:KI520773.1 LN:22457 @SQ SN:KI520769.1 LN:22250 @SQ SN:KI520759.1 LN:22104 @SQ SN:KI520768.1 LN:22081 @SQ SN:AYCK01029322.1 LN:22044 @SQ SN:KI520819.1 LN:21919 @SQ SN:AYCK01029323.1 LN:21906 @SQ SN:KI520815.1 LN:21905 @SQ SN:KI520798.1 LN:21901 @SQ SN:KI520777.1 LN:21872 @SQ SN:KI520799.1 LN:21856 @SQ SN:KI520820.1 LN:21797 @SQ SN:KI520803.1 LN:21735 @SQ SN:KI520883.1 LN:21722 @SQ SN:KI520770.1 LN:21584 @SQ SN:KI520808.1 LN:21581 @SQ SN:AYCK01029324.1 LN:21575 @SQ SN:KI520776.1 LN:21537 @SQ SN:KI520778.1 LN:21507 @SQ SN:AYCK01029325.1 LN:21495 @SQ SN:KI520775.1 LN:21471 @SQ SN:KI520881.1 LN:21448 @SQ SN:KI520779.1 LN:21387 @SQ SN:AYCK01029326.1 LN:21362 @SQ SN:KI520784.1 LN:21354 @SQ SN:AYCK01029327.1 LN:21291 @SQ SN:KI520785.1 LN:21255 @SQ SN:KI520902.1 LN:21236 @SQ SN:KI520783.1 LN:21122 @SQ SN:KI520792.1 LN:21105 @SQ SN:AYCK01029328.1 LN:21086 @SQ SN:KI520789.1 LN:21003 @SQ SN:AYCK01029329.1 LN:20990 @SQ SN:KI520787.1 LN:20961 @SQ SN:KI520797.1 LN:20921 @SQ SN:AYCK01029330.1 LN:20900 @SQ SN:AYCK01029331.1 LN:20871 @SQ SN:AYCK01029332.1 LN:20848 @SQ SN:KI520812.1 LN:20807 @SQ SN:KI520795.1 LN:20762 @SQ SN:KI520793.1 LN:20756 @SQ SN:KI520806.1 LN:20723 @SQ SN:AYCK01029333.1 LN:20649 @SQ SN:KI520844.1 LN:20648 @SQ SN:AYCK01029334.1 LN:20640 @SQ SN:KI520855.1 LN:20621 @SQ SN:AYCK01029335.1 LN:20619 @SQ SN:KI520807.1 LN:20580 @SQ SN:AYCK01029336.1 LN:20441 @SQ SN:KI520886.1 LN:20375 @SQ SN:KI520823.1 LN:20370 @SQ SN:AYCK01029337.1 LN:20352 @SQ SN:KI520832.1 LN:20262 @SQ SN:AYCK01029338.1 LN:20195 @SQ SN:KI520863.1 LN:20161 @SQ SN:KI520831.1 LN:20128 @SQ SN:KI520811.1 LN:20109 @SQ SN:KI520862.1 LN:20105 @SQ SN:KI520901.1 LN:20008 @SQ SN:KI520816.1 LN:20000 @SQ SN:KI520809.1 LN:19949 @SQ SN:AYCK01029339.1 LN:19924 @SQ SN:KI520828.1 LN:19903 @SQ SN:KI520810.1 LN:19884 @SQ SN:KI520814.1 LN:19855 @SQ SN:KI520813.1 LN:19835 @SQ SN:AYCK01029340.1 LN:19800 @SQ SN:KI520838.1 LN:19791 @SQ SN:KI520804.1 LN:19731 @SQ SN:KI520821.1 LN:19703 @SQ SN:KI520833.1 LN:19679 @SQ SN:KI520817.1 LN:19671 @SQ SN:KI520868.1 LN:19633 @SQ SN:KI520824.1 LN:19575 @SQ SN:KI520842.1 LN:19573 @SQ SN:KI520826.1 LN:19565 @SQ SN:AYCK01029341.1 LN:19556 @SQ SN:KI520825.1 LN:19522 @SQ SN:KI520801.1 LN:19520 @SQ SN:KI520805.1 LN:19517 @SQ SN:KI520846.1 LN:19505 @SQ SN:KI520860.1 LN:19486 @SQ SN:AYCK01029342.1 LN:19420 @SQ SN:KI520851.1 LN:19336 @SQ SN:AYCK01029343.1 LN:19181 @SQ SN:KI520829.1 LN:19116 @SQ SN:KI520830.1 LN:19075 @SQ SN:AYCK01029344.1 LN:19070 @SQ SN:KI520843.1 LN:19046 @SQ SN:KI520853.1 LN:19014 @SQ SN:KI520840.1 LN:18780 @SQ SN:KI520892.1 LN:18769 @SQ SN:KI520837.1 LN:18713 @SQ SN:AYCK01029345.1 LN:18700 @SQ SN:KI520836.1 LN:18680 @SQ SN:AYCK01029346.1 LN:18635 @SQ SN:KI520897.1 LN:18550 @SQ SN:KI520879.1 LN:18544 @SQ SN:KI520857.1 LN:18514 @SQ SN:KI520898.1 LN:18496 @SQ SN:KI520847.1 LN:18483 @SQ SN:AYCK01029347.1 LN:18480 @SQ SN:AYCK01027316.1 LN:18475 @SQ SN:AYCK01029348.1 LN:18468 @SQ SN:AYCK01027317.1 LN:18345 @SQ SN:KI520876.1 LN:18333 @SQ SN:AYCK01029349.1 LN:18295 @SQ SN:KI520890.1 LN:18215 @SQ SN:KI520866.1 LN:18162 @SQ SN:AYCK01029350.1 LN:18082 @SQ SN:KI520864.1 LN:18053 @SQ SN:AYCK01029351.1 LN:18040 @SQ SN:KI520852.1 LN:18031 @SQ SN:KI520845.1 LN:17999 @SQ SN:KI520849.1 LN:17975 @SQ SN:KI521025.1 LN:17836 @SQ SN:KI520928.1 LN:17785 @SQ SN:AYCK01029352.1 LN:17742 @SQ SN:KI520878.1 LN:17673 @SQ SN:KI520959.1 LN:17665 @SQ SN:KI520856.1 LN:17643 @SQ SN:AYCK01029353.1 LN:17636 @SQ SN:KI520859.1 LN:17608 @SQ SN:AYCK01029354.1 LN:17533 @SQ SN:KI520861.1 LN:17499 @SQ SN:KI520903.1 LN:17314 @SQ SN:AYCK01029355.1 LN:17304 @SQ SN:KI521242.1 LN:17234 @SQ SN:KI520858.1 LN:17233 @SQ SN:KI520899.1 LN:17218 @SQ SN:AYCK01029356.1 LN:17131 @SQ SN:AYCK01027401.1 LN:17086 @SQ SN:KI520869.1 LN:17072 @SQ SN:AYCK01029357.1 LN:17055 @SQ SN:AYCK01029358.1 LN:17038 @SQ SN:KI520854.1 LN:17035 @SQ SN:KI520900.1 LN:16974 @SQ SN:KI520867.1 LN:16970 @SQ SN:KI520915.1 LN:16962 @SQ SN:KI520884.1 LN:16944 @SQ SN:KI520865.1 LN:16940 @SQ SN:KI520951.1 LN:16834 @SQ SN:KI520873.1 LN:16788 @SQ SN:KI520872.1 LN:16756 @SQ SN:AYCK01029359.1 LN:16720 @SQ SN:KI520874.1 LN:16710 @SQ SN:KI520870.1 LN:16602 @SQ SN:KI520887.1 LN:16567 @SQ SN:AYCK01027430.1 LN:16522 @SQ SN:KI520965.1 LN:16482 @SQ SN:KI520961.1 LN:16464 @SQ SN:KI520880.1 LN:16456 @SQ SN:KI520922.1 LN:16424 @SQ SN:KI520916.1 LN:16419 @SQ SN:AYCK01027434.1 LN:16337 @SQ SN:KI520875.1 LN:16312 @SQ SN:KI520882.1 LN:16304 @SQ SN:AYCK01027438.1 LN:16279 @SQ SN:AYCK01029360.1 LN:16263 @SQ SN:KI520911.1 LN:16223 @SQ SN:KI520921.1 LN:16211 @SQ SN:KI520893.1 LN:16176 @SQ SN:KI520885.1 LN:16164 @SQ SN:AYCK01029361.1 LN:16160 @SQ SN:AYCK01029362.1 LN:16158 @SQ SN:KI520889.1 LN:16112 @SQ SN:KI520912.1 LN:16107 @SQ SN:AYCK01029363.1 LN:16084 @SQ SN:AYCK01029364.1 LN:16084 @SQ SN:AYCK01027446.1 LN:16063 @SQ SN:KI520896.1 LN:16021 @SQ SN:KI520925.1 LN:15944 @SQ SN:KI520932.1 LN:15924 @SQ SN:KI520891.1 LN:15903 @SQ SN:KI520894.1 LN:15866 @SQ SN:KI520904.1 LN:15842 @SQ SN:KI520907.1 LN:15825 @SQ SN:AYCK01029365.1 LN:15807 @SQ SN:KI520913.1 LN:15802 @SQ SN:AYCK01029366.1 LN:15796 @SQ SN:KI520909.1 LN:15789 @SQ SN:AYCK01027463.1 LN:15749 @SQ SN:AYCK01027464.1 LN:15735 @SQ SN:KI520945.1 LN:15721 @SQ SN:KI520976.1 LN:15700 @SQ SN:KI520920.1 LN:15684 @SQ SN:AYCK01029367.1 LN:15666 @SQ SN:KI520935.1 LN:15641 @SQ SN:KI520877.1 LN:15554 @SQ SN:AYCK01029368.1 LN:15519 @SQ SN:KI520964.1 LN:15515 @SQ SN:KI520910.1 LN:15506 @SQ SN:KI520950.1 LN:15502 @SQ SN:KI520986.1 LN:15463 @SQ SN:AYCK01029369.1 LN:15463 @SQ SN:KI520943.1 LN:15456 @SQ SN:AYCK01029370.1 LN:15453 @SQ SN:KI520991.1 LN:15431 @SQ SN:KI520888.1 LN:15419 @SQ SN:KI520958.1 LN:15375 @SQ SN:AYCK01029371.1 LN:15354 @SQ SN:KI520914.1 LN:15292 @SQ SN:AYCK01029372.1 LN:15282 @SQ SN:KI520917.1 LN:15258 @SQ SN:KI520905.1 LN:15216 @SQ SN:KI520977.1 LN:15199 @SQ SN:AYCK01029373.1 LN:15192 @SQ SN:KI520923.1 LN:15127 @SQ SN:KI520918.1 LN:15122 @SQ SN:AYCK01029374.1 LN:15072 @SQ SN:KI520908.1 LN:15016 @SQ SN:KI520930.1 LN:15009 @SQ SN:KI520924.1 LN:14988 @SQ SN:KI520938.1 LN:14988 @SQ SN:AYCK01029375.1 LN:14977 @SQ SN:AYCK01029376.1 LN:14970 @SQ SN:KI520940.1 LN:14963 @SQ SN:AYCK01027574.1 LN:14897 @SQ SN:AYCK01029377.1 LN:14883 @SQ SN:AYCK01029378.1 LN:14873 @SQ SN:AYCK01029379.1 LN:14841 @SQ SN:KI520927.1 LN:14823 @SQ SN:KI521099.1 LN:14755 @SQ SN:KI520926.1 LN:14743 @SQ SN:AYCK01029380.1 LN:14718 @SQ SN:AYCK01029381.1 LN:14684 @SQ SN:KI520931.1 LN:14678 @SQ SN:AYCK01027588.1 LN:14677 @SQ SN:AYCK01029382.1 LN:14674 @SQ SN:KI520929.1 LN:14672 @SQ SN:AYCK01029383.1 LN:14667 @SQ SN:KI520994.1 LN:14607 @SQ SN:KI520990.1 LN:14600 @SQ SN:KI520933.1 LN:14554 @SQ SN:KI520942.1 LN:14551 @SQ SN:AYCK01027592.1 LN:14547 @SQ SN:AYCK01029384.1 LN:14496 @SQ SN:AYCK01029385.1 LN:14442 @SQ SN:KI521023.1 LN:14399 @SQ SN:AYCK01029386.1 LN:14385 @SQ SN:AYCK01029387.1 LN:14372 @SQ SN:KI520974.1 LN:14362 @SQ SN:KI520934.1 LN:14354 @SQ SN:AYCK01029388.1 LN:14312 @SQ SN:KI520937.1 LN:14309 @SQ SN:AYCK01029389.1 LN:14253 @SQ SN:KI520954.1 LN:14229 @SQ SN:AYCK01029390.1 LN:14226 @SQ SN:AYCK01029391.1 LN:14226 @SQ SN:KI520936.1 LN:14220 @SQ SN:KI520963.1 LN:14220 @SQ SN:KI520939.1 LN:14184 @SQ SN:AYCK01029392.1 LN:14126 @SQ SN:AYCK01029393.1 LN:14124 @SQ SN:AYCK01029394.1 LN:14089 @SQ SN:AYCK01029395.1 LN:14087 @SQ SN:AYCK01027630.1 LN:14083 @SQ SN:AYCK01029396.1 LN:14030 @SQ SN:KI520999.1 LN:14024 @SQ SN:AYCK01029397.1 LN:13934 @SQ SN:KI521014.1 LN:13921 @SQ SN:KI520941.1 LN:13911 @SQ SN:KI520992.1 LN:13861 @SQ SN:AYCK01029398.1 LN:13730 @SQ SN:KI520947.1 LN:13722 @SQ SN:KI520949.1 LN:13706 @SQ SN:KI520948.1 LN:13687 @SQ SN:AYCK01029399.1 LN:13617 @SQ SN:KI520973.1 LN:13599 @SQ SN:AYCK01029400.1 LN:13549 @SQ SN:AYCK01029401.1 LN:13452 @SQ SN:KI520944.1 LN:13420 @SQ SN:KI521015.1 LN:13385 @SQ SN:KI520953.1 LN:13384 @SQ SN:KI520952.1 LN:13322 @SQ SN:AYCK01029402.1 LN:13293 @SQ SN:KI521012.1 LN:13275 @SQ SN:AYCK01029403.1 LN:13221 @SQ SN:AYCK01029404.1 LN:13159 @SQ SN:AYCK01029405.1 LN:13125 @SQ SN:AYCK01029406.1 LN:13120 @SQ SN:KI521011.1 LN:13059 @SQ SN:KI520980.1 LN:13011 @SQ SN:KI520997.1 LN:13007 @SQ SN:KI521092.1 LN:12994 @SQ SN:AYCK01029407.1 LN:12973 @SQ SN:KI520957.1 LN:12968 @SQ SN:AYCK01029408.1 LN:12919 @SQ SN:AYCK01029409.1 LN:12893 @SQ SN:KI520960.1 LN:12886 @SQ SN:KI520968.1 LN:12812 @SQ SN:KI520989.1 LN:12791 @SQ SN:KI520962.1 LN:12786 @SQ SN:KI521080.1 LN:12785 @SQ SN:KI520975.1 LN:12740 @SQ SN:KI520969.1 LN:12730 @SQ SN:AYCK01027705.1 LN:12677 @SQ SN:KI520966.1 LN:12661 @SQ SN:AYCK01029410.1 LN:12651 @SQ SN:KI520956.1 LN:12614 @SQ SN:AYCK01029411.1 LN:12611 @SQ SN:KI521001.1 LN:12578 @SQ SN:AYCK01029412.1 LN:12562 @SQ SN:AYCK01029413.1 LN:12476 @SQ SN:KI520971.1 LN:12472 @SQ SN:KI520981.1 LN:12447 @SQ SN:KI520970.1 LN:12399 @SQ SN:KI520967.1 LN:12392 @SQ SN:AYCK01029414.1 LN:12345 @SQ SN:KI520984.1 LN:12280 @SQ SN:KI520985.1 LN:12253 @SQ SN:KI520988.1 LN:12227 @SQ SN:AYCK01029415.1 LN:12226 @SQ SN:KI520972.1 LN:12201 @SQ SN:AYCK01029416.1 LN:12192 @SQ SN:AYCK01029417.1 LN:12185 @SQ SN:KI520987.1 LN:12179 @SQ SN:KI520983.1 LN:12149 @SQ SN:KI521000.1 LN:12147 @SQ SN:KI521003.1 LN:12124 @SQ SN:AYCK01029418.1 LN:12113 @SQ SN:AYCK01029419.1 LN:12108 @SQ SN:KI521042.1 LN:12027 @SQ SN:KI520995.1 LN:12026 @SQ SN:KI521017.1 LN:12016 @SQ SN:KI520982.1 LN:11987 @SQ SN:KI521054.1 LN:11980 @SQ SN:KI520996.1 LN:11978 @SQ SN:AYCK01029420.1 LN:11971 @SQ SN:AYCK01029421.1 LN:11956 @SQ SN:AYCK01029422.1 LN:11946 @SQ SN:KI521028.1 LN:11921 @SQ SN:KI521037.1 LN:11914 @SQ SN:AYCK01029423.1 LN:11898 @SQ SN:AYCK01029424.1 LN:11895 @SQ SN:KI520998.1 LN:11856 @SQ SN:KI520993.1 LN:11853 @SQ SN:AYCK01029425.1 LN:11811 @SQ SN:AYCK01029426.1 LN:11748 @SQ SN:AYCK01029427.1 LN:11732 @SQ SN:KI521013.1 LN:11708 @SQ SN:KI521007.1 LN:11643 @SQ SN:AYCK01029428.1 LN:11643 @SQ SN:KI521008.1 LN:11642 @SQ SN:KI521020.1 LN:11601 @SQ SN:KI521010.1 LN:11552 @SQ SN:KI521043.1 LN:11540 @SQ SN:KI521051.1 LN:11519 @SQ SN:AYCK01027784.1 LN:11501 @SQ SN:AYCK01027785.1 LN:11501 @SQ SN:KI521016.1 LN:11473 @SQ SN:KI521002.1 LN:11416 @SQ SN:KI521019.1 LN:11385 @SQ SN:KI521006.1 LN:11367 @SQ SN:AYCK01029429.1 LN:11351 @SQ SN:KI521005.1 LN:11343 @SQ SN:KI521077.1 LN:11329 @SQ SN:KI521004.1 LN:11314 @SQ SN:KI521021.1 LN:11297 @SQ SN:AYCK01027822.1 LN:11254 @SQ SN:AYCK01029430.1 LN:11239 @SQ SN:AYCK01029431.1 LN:11190 @SQ SN:AYCK01029432.1 LN:11184 @SQ SN:AYCK01029433.1 LN:11119 @SQ SN:AYCK01029434.1 LN:11069 @SQ SN:KI521026.1 LN:11067 @SQ SN:KI521038.1 LN:11051 @SQ SN:KI521009.1 LN:11049 @SQ SN:AYCK01029435.1 LN:11046 @SQ SN:KI521018.1 LN:11021 @SQ SN:AYCK01029436.1 LN:10983 @SQ SN:AYCK01027864.1 LN:10963 @SQ SN:AYCK01029437.1 LN:10938 @SQ SN:AYCK01029438.1 LN:10938 @SQ SN:AYCK01029439.1 LN:10915 @SQ SN:KI521031.1 LN:10913 @SQ SN:KI521029.1 LN:10895 @SQ SN:KI521096.1 LN:10892 @SQ SN:KI521030.1 LN:10872 @SQ SN:KI521058.1 LN:10868 @SQ SN:KI521027.1 LN:10855 @SQ SN:AYCK01029440.1 LN:10836 @SQ SN:KI521033.1 LN:10787 @SQ SN:AYCK01029441.1 LN:10785 @SQ SN:KI521024.1 LN:10769 @SQ SN:KI521052.1 LN:10764 @SQ SN:KI521059.1 LN:10757 @SQ SN:AYCK01027885.1 LN:10737 @SQ SN:AYCK01029442.1 LN:10724 @SQ SN:AYCK01029443.1 LN:10694 @SQ SN:KI521171.1 LN:10672 @SQ SN:KI521035.1 LN:10655 @SQ SN:KI521039.1 LN:10629 @SQ SN:KI521040.1 LN:10611 @SQ SN:AYCK01027894.1 LN:10591 @SQ SN:AYCK01029444.1 LN:10569 @SQ SN:AYCK01029445.1 LN:10517 @SQ SN:KI521048.1 LN:10513 @SQ SN:KI521036.1 LN:10510 @SQ SN:KI521034.1 LN:10486 @SQ SN:KI521032.1 LN:10470 @SQ SN:KI521041.1 LN:10448 @SQ SN:AYCK01029446.1 LN:10413 @SQ SN:AYCK01029447.1 LN:10399 @SQ SN:KI521127.1 LN:10384 @SQ SN:AYCK01029448.1 LN:10372 @SQ SN:AYCK01029449.1 LN:10313 @SQ SN:KI521045.1 LN:10292 @SQ SN:KI521055.1 LN:10279 @SQ SN:KI521050.1 LN:10230 @SQ SN:AYCK01029450.1 LN:10229 @SQ SN:AYCK01029451.1 LN:10221 @SQ SN:KI521046.1 LN:10202 @SQ SN:KI521047.1 LN:10186 @SQ SN:AYCK01029452.1 LN:10171 @SQ SN:AYCK01029453.1 LN:10169 @SQ SN:AYCK01029454.1 LN:10154 @SQ SN:KI521056.1 LN:10148 @SQ SN:KI521083.1 LN:10148 @SQ SN:KI521053.1 LN:10116 @SQ SN:KI521057.1 LN:10080 @SQ SN:AYCK01029455.1 LN:10042 @SQ SN:AYCK01029456.1 LN:10019 @SQ SN:AYCK01029457.1 LN:10012 @SQ SN:KI521088.1 LN:10009 @SQ SN:KI521061.1 LN:9939 @SQ SN:KI521044.1 LN:9936 @SQ SN:AYCK01029458.1 LN:9929 @SQ SN:KI521063.1 LN:9925 @SQ SN:KI521060.1 LN:9919 @SQ SN:AYCK01029459.1 LN:9910 @SQ SN:AYCK01029460.1 LN:9908 @SQ SN:KI521107.1 LN:9886 @SQ SN:AYCK01029461.1 LN:9875 @SQ SN:KI521094.1 LN:9872 @SQ SN:AYCK01029462.1 LN:9865 @SQ SN:KI521068.1 LN:9858 @SQ SN:AYCK01029463.1 LN:9854 @SQ SN:KI521070.1 LN:9846 @SQ SN:KI521066.1 LN:9838 @SQ SN:AYCK01029464.1 LN:9838 @SQ SN:KI521075.1 LN:9814 @SQ SN:KI521065.1 LN:9812 @SQ SN:KI521161.1 LN:9788 @SQ SN:KI521062.1 LN:9784 @SQ SN:KI521151.1 LN:9778 @SQ SN:KI521069.1 LN:9749 @SQ SN:KI521072.1 LN:9710 @SQ SN:KI521074.1 LN:9647 @SQ SN:KI521073.1 LN:9622 @SQ SN:KI521148.1 LN:9597 @SQ SN:AYCK01029465.1 LN:9589 @SQ SN:AYCK01029466.1 LN:9553 @SQ SN:KI521067.1 LN:9547 @SQ SN:AYCK01029467.1 LN:9528 @SQ SN:AYCK01029468.1 LN:9527 @SQ SN:KI521082.1 LN:9508 @SQ SN:KI521078.1 LN:9468 @SQ SN:KI521079.1 LN:9443 @SQ SN:AYCK01027989.1 LN:9421 @SQ SN:AYCK01029469.1 LN:9421 @SQ SN:AYCK01029470.1 LN:9399 @SQ SN:AYCK01029471.1 LN:9390 @SQ SN:AYCK01029472.1 LN:9352 @SQ SN:KI521172.1 LN:9345 @SQ SN:KI521084.1 LN:9332 @SQ SN:KI521076.1 LN:9328 @SQ SN:AYCK01029473.1 LN:9320 @SQ SN:AYCK01029474.1 LN:9317 @SQ SN:KI521095.1 LN:9312 @SQ SN:KI521022.1 LN:9281 @SQ SN:AYCK01029475.1 LN:9267 @SQ SN:AYCK01028016.1 LN:9260 @SQ SN:KI521071.1 LN:9222 @SQ SN:AYCK01029476.1 LN:9200 @SQ SN:AYCK01029477.1 LN:9199 @SQ SN:KI521090.1 LN:9193 @SQ SN:KI521142.1 LN:9189 @SQ SN:KI521089.1 LN:9186 @SQ SN:KI521105.1 LN:9163 @SQ SN:KI521091.1 LN:9153 @SQ SN:KI521085.1 LN:9141 @SQ SN:AYCK01029478.1 LN:9140 @SQ SN:AYCK01029479.1 LN:9118 @SQ SN:AYCK01029480.1 LN:9103 @SQ SN:KI521087.1 LN:9101 @SQ SN:KI521100.1 LN:9085 @SQ SN:KI521086.1 LN:9074 @SQ SN:AYCK01029481.1 LN:9068 @SQ SN:KI521097.1 LN:9031 @SQ SN:AYCK01029482.1 LN:9029 @SQ SN:AYCK01029483.1 LN:9020 @SQ SN:AYCK01029484.1 LN:9015 @SQ SN:KI521098.1 LN:9014 @SQ SN:AYCK01029485.1 LN:9006 @SQ SN:AYCK01029486.1 LN:8974 @SQ SN:KI521101.1 LN:8965 @SQ SN:AYCK01029487.1 LN:8959 @SQ SN:AYCK01029488.1 LN:8959 @SQ SN:AYCK01029489.1 LN:8946 @SQ SN:AYCK01029490.1 LN:8946 @SQ SN:KI521093.1 LN:8944 @SQ SN:AYCK01029491.1 LN:8938 @SQ SN:AYCK01029492.1 LN:8883 @SQ SN:AYCK01029493.1 LN:8875 @SQ SN:KI521102.1 LN:8872 @SQ SN:AYCK01029494.1 LN:8866 @SQ SN:KI521104.1 LN:8823 @SQ SN:KI521106.1 LN:8817 @SQ SN:KI521116.1 LN:8796 @SQ SN:AYCK01029495.1 LN:8781 @SQ SN:AYCK01029496.1 LN:8758 @SQ SN:AYCK01028067.1 LN:8738 @SQ SN:KI521108.1 LN:8730 @SQ SN:KI521103.1 LN:8727 @SQ SN:KI521109.1 LN:8698 @SQ SN:KI521113.1 LN:8694 @SQ SN:AYCK01029497.1 LN:8687 @SQ SN:KI521112.1 LN:8615 @SQ SN:KI521110.1 LN:8592 @SQ SN:AYCK01029498.1 LN:8592 @SQ SN:AYCK01029499.1 LN:8578 @SQ SN:AYCK01029500.1 LN:8575 @SQ SN:KI521111.1 LN:8556 @SQ SN:KI521114.1 LN:8529 @SQ SN:AYCK01029501.1 LN:8439 @SQ SN:KI521115.1 LN:8435 @SQ SN:KI521118.1 LN:8402 @SQ SN:AYCK01029502.1 LN:8395 @SQ SN:KI521122.1 LN:8369 @SQ SN:AYCK01029503.1 LN:8363 @SQ SN:AYCK01029504.1 LN:8356 @SQ SN:AYCK01029505.1 LN:8355 @SQ SN:KI521121.1 LN:8333 @SQ SN:AYCK01028103.1 LN:8332 @SQ SN:KI521149.1 LN:8301 @SQ SN:KI521125.1 LN:8285 @SQ SN:AYCK01029506.1 LN:8252 @SQ SN:AYCK01028117.1 LN:8249 @SQ SN:KI521117.1 LN:8234 @SQ SN:KI521120.1 LN:8232 @SQ SN:KI521129.1 LN:8229 @SQ SN:KI521119.1 LN:8203 @SQ SN:KI521126.1 LN:8177 @SQ SN:AYCK01029507.1 LN:8173 @SQ SN:KI521130.1 LN:8163 @SQ SN:AYCK01029508.1 LN:8158 @SQ SN:AYCK01029509.1 LN:8155 @SQ SN:AYCK01029510.1 LN:8154 @SQ SN:AYCK01029511.1 LN:8147 @SQ SN:KI521123.1 LN:8145 @SQ SN:AYCK01029512.1 LN:8136 @SQ SN:AYCK01028135.1 LN:8133 @SQ SN:AYCK01028136.1 LN:8133 @SQ SN:AYCK01028137.1 LN:8132 @SQ SN:KI521269.1 LN:8112 @SQ SN:KI521124.1 LN:8111 @SQ SN:KI521132.1 LN:8092 @SQ SN:KI521145.1 LN:8074 @SQ SN:KI521135.1 LN:8062 @SQ SN:AYCK01029513.1 LN:8061 @SQ SN:AYCK01029514.1 LN:8060 @SQ SN:AYCK01029515.1 LN:8054 @SQ SN:AYCK01029516.1 LN:8054 @SQ SN:KI521136.1 LN:8048 @SQ SN:AYCK01029517.1 LN:8040 @SQ SN:KI521134.1 LN:8029 @SQ SN:KI521133.1 LN:8027 @SQ SN:AYCK01029518.1 LN:7989 @SQ SN:AYCK01029519.1 LN:7952 @SQ SN:AYCK01029520.1 LN:7940 @SQ SN:KI521128.1 LN:7937 @SQ SN:KI521137.1 LN:7925 @SQ SN:KI521138.1 LN:7921 @SQ SN:AYCK01029521.1 LN:7892 @SQ SN:KI521141.1 LN:7891 @SQ SN:AYCK01029522.1 LN:7849 @SQ SN:AYCK01029523.1 LN:7815 @SQ SN:AYCK01029524.1 LN:7804 @SQ SN:KI521175.1 LN:7792 @SQ SN:KI521139.1 LN:7788 @SQ SN:AYCK01029525.1 LN:7773 @SQ SN:AYCK01029526.1 LN:7759 @SQ SN:AYCK01029527.1 LN:7746 @SQ SN:AYCK01029528.1 LN:7726 @SQ SN:AYCK01029529.1 LN:7722 @SQ SN:AYCK01029530.1 LN:7706 @SQ SN:KI521140.1 LN:7705 @SQ SN:KI521164.1 LN:7698 @SQ SN:AYCK01029531.1 LN:7696 @SQ SN:AYCK01029532.1 LN:7691 @SQ SN:AYCK01029533.1 LN:7672 @SQ SN:AYCK01029534.1 LN:7665 @SQ SN:KI521147.1 LN:7657 @SQ SN:KI521160.1 LN:7616 @SQ SN:KI521146.1 LN:7605 @SQ SN:AYCK01029535.1 LN:7551 @SQ SN:KI521230.1 LN:7545 @SQ SN:AYCK01029536.1 LN:7538 @SQ SN:AYCK01029537.1 LN:7532 @SQ SN:AYCK01029538.1 LN:7516 @SQ SN:AYCK01029539.1 LN:7504 @SQ SN:AYCK01029540.1 LN:7504 @SQ SN:AYCK01029541.1 LN:7502 @SQ SN:KI521154.1 LN:7499 @SQ SN:KI521260.1 LN:7497 @SQ SN:AYCK01029542.1 LN:7496 @SQ SN:KI521155.1 LN:7495 @SQ SN:AYCK01029543.1 LN:7491 @SQ SN:AYCK01029544.1 LN:7474 @SQ SN:KI521153.1 LN:7473 @SQ SN:AYCK01029545.1 LN:7471 @SQ SN:AYCK01029546.1 LN:7469 @SQ SN:AYCK01029547.1 LN:7460 @SQ SN:KI521158.1 LN:7455 @SQ SN:AYCK01029548.1 LN:7441 @SQ SN:AYCK01029549.1 LN:7435 @SQ SN:AYCK01028195.1 LN:7433 @SQ SN:AYCK01029550.1 LN:7429 @SQ SN:AYCK01029551.1 LN:7424 @SQ SN:KI521156.1 LN:7386 @SQ SN:AYCK01029552.1 LN:7334 @SQ SN:AYCK01029553.1 LN:7323 @SQ SN:AYCK01029554.1 LN:7314 @SQ SN:KI521157.1 LN:7309 @SQ SN:AYCK01029555.1 LN:7299 @SQ SN:AYCK01029556.1 LN:7291 @SQ SN:KI521290.1 LN:7289 @SQ SN:AYCK01029557.1 LN:7289 @SQ SN:KI521165.1 LN:7284 @SQ SN:AYCK01029558.1 LN:7263 @SQ SN:KI521177.1 LN:7233 @SQ SN:KI521176.1 LN:7212 @SQ SN:AYCK01029559.1 LN:7211 @SQ SN:AYCK01029560.1 LN:7200 @SQ SN:KI521163.1 LN:7199 @SQ SN:AYCK01029561.1 LN:7185 @SQ SN:AYCK01029562.1 LN:7181 @SQ SN:AYCK01029563.1 LN:7181 @SQ SN:KI521170.1 LN:7173 @SQ SN:AYCK01029564.1 LN:7166 @SQ SN:AYCK01029565.1 LN:7164 @SQ SN:KI521152.1 LN:7156 @SQ SN:AYCK01029566.1 LN:7147 @SQ SN:KI521131.1 LN:7146 @SQ SN:AYCK01029567.1 LN:7146 @SQ SN:KI521183.1 LN:7114 @SQ SN:KI521167.1 LN:7101 @SQ SN:AYCK01029568.1 LN:7101 @SQ SN:AYCK01029569.1 LN:7089 @SQ SN:KI521168.1 LN:7088 @SQ SN:KI521174.1 LN:7083 @SQ SN:AYCK01029570.1 LN:7038 @SQ SN:KI521191.1 LN:7035 @SQ SN:AYCK01029571.1 LN:7035 @SQ SN:AYCK01029572.1 LN:7033 @SQ SN:AYCK01029573.1 LN:7033 @SQ SN:KI521249.1 LN:7018 @SQ SN:AYCK01029574.1 LN:6999 @SQ SN:KI521169.1 LN:6995 @SQ SN:KI521173.1 LN:6982 @SQ SN:AYCK01029575.1 LN:6976 @SQ SN:AYCK01029576.1 LN:6963 @SQ SN:AYCK01029577.1 LN:6956 @SQ SN:KI521159.1 LN:6947 @SQ SN:AYCK01029578.1 LN:6946 @SQ SN:AYCK01029579.1 LN:6946 @SQ SN:AYCK01029580.1 LN:6937 @SQ SN:KI521224.1 LN:6928 @SQ SN:KI521180.1 LN:6921 @SQ SN:KI521181.1 LN:6910 @SQ SN:AYCK01029581.1 LN:6891 @SQ SN:KI521220.1 LN:6888 @SQ SN:KI521178.1 LN:6870 @SQ SN:AYCK01029582.1 LN:6818 @SQ SN:AYCK01029583.1 LN:6793 @SQ SN:AYCK01029584.1 LN:6757 @SQ SN:KI521166.1 LN:6725 @SQ SN:KI521150.1 LN:6713 @SQ SN:KI521179.1 LN:6702 @SQ SN:KI521187.1 LN:6689 @SQ SN:KI521185.1 LN:6686 @SQ SN:KI521197.1 LN:6686 @SQ SN:AYCK01029585.1 LN:6666 @SQ SN:KI521188.1 LN:6665 @SQ SN:AYCK01029586.1 LN:6664 @SQ SN:AYCK01029587.1 LN:6663 @SQ SN:AYCK01029588.1 LN:6654 @SQ SN:AYCK01029589.1 LN:6654 @SQ SN:AYCK01029590.1 LN:6654 @SQ SN:AYCK01029591.1 LN:6652 @SQ SN:KI521186.1 LN:6650 @SQ SN:AYCK01029592.1 LN:6634 @SQ SN:KI521190.1 LN:6628 @SQ SN:KI521198.1 LN:6620 @SQ SN:AYCK01029593.1 LN:6618 @SQ SN:KI521182.1 LN:6616 @SQ SN:AYCK01029594.1 LN:6606 @SQ SN:AYCK01029595.1 LN:6585 @SQ SN:AYCK01028268.1 LN:6571 @SQ SN:AYCK01028269.1 LN:6570 @SQ SN:AYCK01028270.1 LN:6570 @SQ SN:AYCK01029596.1 LN:6567 @SQ SN:KI521284.1 LN:6560 @SQ SN:KI521193.1 LN:6550 @SQ SN:AYCK01028271.1 LN:6542 @SQ SN:AYCK01028272.1 LN:6526 @SQ SN:KI521195.1 LN:6519 @SQ SN:AYCK01029597.1 LN:6518 @SQ SN:AYCK01029598.1 LN:6518 @SQ SN:KI521194.1 LN:6514 @SQ SN:AYCK01029599.1 LN:6504 @SQ SN:AYCK01029600.1 LN:6492 @SQ SN:AYCK01029601.1 LN:6478 @SQ SN:AYCK01029602.1 LN:6461 @SQ SN:AYCK01029603.1 LN:6445 @SQ SN:AYCK01029604.1 LN:6432 @SQ SN:KI521196.1 LN:6420 @SQ SN:AYCK01029605.1 LN:6418 @SQ SN:KI521229.1 LN:6406 @SQ SN:KI521189.1 LN:6396 @SQ SN:AYCK01028287.1 LN:6395 @SQ SN:AYCK01029606.1 LN:6376 @SQ SN:KI521211.1 LN:6375 @SQ SN:KI521199.1 LN:6372 @SQ SN:KI521201.1 LN:6331 @SQ SN:KI521192.1 LN:6321 @SQ SN:AYCK01029607.1 LN:6320 @SQ SN:KI521184.1 LN:6295 @SQ SN:AYCK01029608.1 LN:6291 @SQ SN:KI521202.1 LN:6285 @SQ SN:AYCK01029609.1 LN:6284 @SQ SN:KI521203.1 LN:6269 @SQ SN:KI521204.1 LN:6268 @SQ SN:AYCK01029610.1 LN:6260 @SQ SN:AYCK01029611.1 LN:6250 @SQ SN:KI521223.1 LN:6248 @SQ SN:AYCK01029612.1 LN:6219 @SQ SN:KI521200.1 LN:6212 @SQ SN:AYCK01029613.1 LN:6212 @SQ SN:KI521208.1 LN:6180 @SQ SN:KI521205.1 LN:6169 @SQ SN:AYCK01029614.1 LN:6153 @SQ SN:AYCK01029615.1 LN:6147 @SQ SN:KI521212.1 LN:6139 @SQ SN:AYCK01029616.1 LN:6097 @SQ SN:AYCK01029617.1 LN:6096 @SQ SN:AYCK01029618.1 LN:6096 @SQ SN:KI521213.1 LN:6074 @SQ SN:KI521209.1 LN:6070 @SQ SN:KI521207.1 LN:6020 @SQ SN:KI521214.1 LN:6019 @SQ SN:KI521219.1 LN:6014 @SQ SN:KI521218.1 LN:5996 @SQ SN:AYCK01029619.1 LN:5992 @SQ SN:AYCK01028328.1 LN:5990 @SQ SN:KI521210.1 LN:5989 @SQ SN:KI521304.1 LN:5983 @SQ SN:AYCK01029620.1 LN:5978 @SQ SN:KI521238.1 LN:5974 @SQ SN:AYCK01029621.1 LN:5962 @SQ SN:AYCK01029622.1 LN:5960 @SQ SN:AYCK01029623.1 LN:5959 @SQ SN:AYCK01029624.1 LN:5954 @SQ SN:AYCK01029625.1 LN:5953 @SQ SN:KI521221.1 LN:5942 @SQ SN:AYCK01029626.1 LN:5933 @SQ SN:AYCK01029627.1 LN:5930 @SQ SN:AYCK01029628.1 LN:5918 @SQ SN:KI521231.1 LN:5902 @SQ SN:AYCK01029629.1 LN:5897 @SQ SN:KI521228.1 LN:5895 @SQ SN:AYCK01028340.1 LN:5882 @SQ SN:AYCK01029630.1 LN:5882 @SQ SN:AYCK01029631.1 LN:5878 @SQ SN:AYCK01029632.1 LN:5871 @SQ SN:AYCK01028341.1 LN:5868 @SQ SN:KI521215.1 LN:5868 @SQ SN:AYCK01029633.1 LN:5860 @SQ SN:AYCK01029634.1 LN:5850 @SQ SN:AYCK01028342.1 LN:5849 @SQ SN:AYCK01028343.1 LN:5849 @SQ SN:KI521227.1 LN:5847 @SQ SN:KI521206.1 LN:5844 @SQ SN:KI521232.1 LN:5842 @SQ SN:AYCK01029635.1 LN:5841 @SQ SN:KI521349.1 LN:5820 @SQ SN:AYCK01028346.1 LN:5816 @SQ SN:AYCK01029636.1 LN:5813 @SQ SN:AYCK01029637.1 LN:5800 @SQ SN:KI521272.1 LN:5789 @SQ SN:KI521235.1 LN:5785 @SQ SN:KI521275.1 LN:5782 @SQ SN:AYCK01028350.1 LN:5780 @SQ SN:AYCK01029638.1 LN:5780 @SQ SN:AYCK01029639.1 LN:5772 @SQ SN:AYCK01029640.1 LN:5771 @SQ SN:KI521217.1 LN:5756 @SQ SN:AYCK01029641.1 LN:5744 @SQ SN:KI521222.1 LN:5739 @SQ SN:AYCK01028353.1 LN:5738 @SQ SN:AYCK01029642.1 LN:5725 @SQ SN:KI521241.1 LN:5717 @SQ SN:KI521233.1 LN:5704 @SQ SN:KI521226.1 LN:5703 @SQ SN:KI521344.1 LN:5701 @SQ SN:AYCK01029643.1 LN:5697 @SQ SN:AYCK01029644.1 LN:5683 @SQ SN:AYCK01029645.1 LN:5675 @SQ SN:KI521225.1 LN:5673 @SQ SN:AYCK01029646.1 LN:5672 @SQ SN:AYCK01029647.1 LN:5665 @SQ SN:KI521236.1 LN:5661 @SQ SN:KI521244.1 LN:5660 @SQ SN:AYCK01029648.1 LN:5658 @SQ SN:AYCK01029649.1 LN:5645 @SQ SN:KI521216.1 LN:5642 @SQ SN:AYCK01028362.1 LN:5640 @SQ SN:AYCK01028363.1 LN:5640 @SQ SN:AYCK01029650.1 LN:5639 @SQ SN:AYCK01029651.1 LN:5636 @SQ SN:KI521247.1 LN:5618 @SQ SN:KI521243.1 LN:5606 @SQ SN:KI521248.1 LN:5605 @SQ SN:KI521357.1 LN:5593 @SQ SN:KI521239.1 LN:5589 @SQ SN:AYCK01029652.1 LN:5584 @SQ SN:AYCK01029653.1 LN:5560 @SQ SN:AYCK01029654.1 LN:5545 @SQ SN:AYCK01029655.1 LN:5528 @SQ SN:KI521240.1 LN:5522 @SQ SN:KI521252.1 LN:5511 @SQ SN:KI521258.1 LN:5501 @SQ SN:AYCK01029656.1 LN:5495 @SQ SN:KI521261.1 LN:5482 @SQ SN:KI521262.1 LN:5472 @SQ SN:AYCK01028384.1 LN:5464 @SQ SN:KI521234.1 LN:5462 @SQ SN:KI521264.1 LN:5453 @SQ SN:AYCK01029657.1 LN:5445 @SQ SN:KI521245.1 LN:5444 @SQ SN:AYCK01029658.1 LN:5442 @SQ SN:KI521254.1 LN:5438 @SQ SN:AYCK01029659.1 LN:5413 @SQ SN:AYCK01029660.1 LN:5407 @SQ SN:KI521255.1 LN:5392 @SQ SN:KI521259.1 LN:5387 @SQ SN:KI521268.1 LN:5378 @SQ SN:KI521251.1 LN:5368 @SQ SN:AYCK01029661.1 LN:5367 @SQ SN:AYCK01029662.1 LN:5366 @SQ SN:KI521266.1 LN:5362 @SQ SN:KI521257.1 LN:5359 @SQ SN:AYCK01029663.1 LN:5358 @SQ SN:AYCK01029664.1 LN:5357 @SQ SN:AYCK01029665.1 LN:5357 @SQ SN:AYCK01029666.1 LN:5355 @SQ SN:AYCK01029667.1 LN:5349 @SQ SN:KI521270.1 LN:5346 @SQ SN:AYCK01029668.1 LN:5340 @SQ SN:KI521237.1 LN:5333 @SQ SN:KI521273.1 LN:5327 @SQ SN:KI521280.1 LN:5316 @SQ SN:KI521265.1 LN:5297 @SQ SN:AYCK01028395.1 LN:5289 @SQ SN:KI521253.1 LN:5288 @SQ SN:AYCK01029669.1 LN:5283 @SQ SN:AYCK01028400.1 LN:5281 @SQ SN:AYCK01029670.1 LN:5281 @SQ SN:AYCK01029671.1 LN:5278 @SQ SN:AYCK01029672.1 LN:5275 @SQ SN:KI521317.1 LN:5268 @SQ SN:AYCK01029673.1 LN:5264 @SQ SN:KI521250.1 LN:5262 @SQ SN:KI521274.1 LN:5258 @SQ SN:KI521256.1 LN:5250 @SQ SN:AYCK01029674.1 LN:5249 @SQ SN:AYCK01029675.1 LN:5231 @SQ SN:AYCK01029676.1 LN:5219 @SQ SN:AYCK01029677.1 LN:5213 @SQ SN:AYCK01029678.1 LN:5187 @SQ SN:AYCK01029679.1 LN:5167 @SQ SN:KI521287.1 LN:5148 @SQ SN:AYCK01029680.1 LN:5142 @SQ SN:KI521278.1 LN:5135 @SQ SN:KI521277.1 LN:5124 @SQ SN:AYCK01029681.1 LN:5115 @SQ SN:KI521300.1 LN:5112 @SQ SN:AYCK01029682.1 LN:5109 @SQ SN:AYCK01029683.1 LN:5103 @SQ SN:AYCK01029684.1 LN:5097 @SQ SN:AYCK01029685.1 LN:5087 @SQ SN:KI521271.1 LN:5061 @SQ SN:KI521315.1 LN:5054 @SQ SN:KI521279.1 LN:5041 @SQ SN:AYCK01029686.1 LN:5025 @SQ SN:AYCK01029687.1 LN:5005 @SQ SN:KI521276.1 LN:5003 @SQ SN:AYCK01029688.1 LN:4988 @SQ SN:KI521288.1 LN:4987 @SQ SN:AYCK01029689.1 LN:4981 @SQ SN:AYCK01029690.1 LN:4980 @SQ SN:AYCK01029691.1 LN:4975 @SQ SN:AYCK01028453.1 LN:4934 @SQ SN:AYCK01029692.1 LN:4929 @SQ SN:AYCK01028456.1 LN:4913 @SQ SN:KI521289.1 LN:4910 @SQ SN:KI521263.1 LN:4899 @SQ SN:KI521281.1 LN:4878 @SQ SN:AYCK01029693.1 LN:4868 @SQ SN:AYCK01029694.1 LN:4865 @SQ SN:AYCK01029695.1 LN:4863 @SQ SN:AYCK01029696.1 LN:4862 @SQ SN:AYCK01029697.1 LN:4854 @SQ SN:AYCK01029698.1 LN:4851 @SQ SN:AYCK01029699.1 LN:4849 @SQ SN:AYCK01029700.1 LN:4841 @SQ SN:AYCK01029701.1 LN:4841 @SQ SN:AYCK01029702.1 LN:4836 @SQ SN:KI521246.1 LN:4828 @SQ SN:AYCK01029703.1 LN:4825 @SQ SN:KI521292.1 LN:4814 @SQ SN:KI521295.1 LN:4811 @SQ SN:KI521285.1 LN:4800 @SQ SN:AYCK01029704.1 LN:4800 @SQ SN:KI521298.1 LN:4772 @SQ SN:AYCK01029705.1 LN:4751 @SQ SN:KI521360.1 LN:4739 @SQ SN:KI521301.1 LN:4738 @SQ SN:AYCK01029706.1 LN:4737 @SQ SN:AYCK01029707.1 LN:4736 @SQ SN:AYCK01029708.1 LN:4732 @SQ SN:KI521299.1 LN:4723 @SQ SN:KI521294.1 LN:4716 @SQ SN:KI521283.1 LN:4690 @SQ SN:AYCK01029709.1 LN:4690 @SQ SN:AYCK01029710.1 LN:4684 @SQ SN:AYCK01029711.1 LN:4683 @SQ SN:AYCK01029712.1 LN:4669 @SQ SN:AYCK01029713.1 LN:4664 @SQ SN:AYCK01029714.1 LN:4654 @SQ SN:AYCK01029715.1 LN:4653 @SQ SN:KI521267.1 LN:4650 @SQ SN:AYCK01029716.1 LN:4646 @SQ SN:KI521297.1 LN:4645 @SQ SN:KI521291.1 LN:4644 @SQ SN:KI521293.1 LN:4640 @SQ SN:AYCK01029717.1 LN:4629 @SQ SN:AYCK01028502.1 LN:4615 @SQ SN:AYCK01029718.1 LN:4614 @SQ SN:AYCK01029719.1 LN:4608 @SQ SN:KI521282.1 LN:4594 @SQ SN:AYCK01029720.1 LN:4572 @SQ SN:KI521306.1 LN:4569 @SQ SN:AYCK01029721.1 LN:4567 @SQ SN:AYCK01029722.1 LN:4563 @SQ SN:AYCK01029723.1 LN:4561 @SQ SN:AYCK01029724.1 LN:4557 @SQ SN:AYCK01028514.1 LN:4545 @SQ SN:AYCK01029725.1 LN:4541 @SQ SN:AYCK01029726.1 LN:4534 @SQ SN:AYCK01029727.1 LN:4534 @SQ SN:KI521305.1 LN:4512 @SQ SN:KI521303.1 LN:4504 @SQ SN:AYCK01029728.1 LN:4503 @SQ SN:KI521308.1 LN:4500 @SQ SN:AYCK01029729.1 LN:4500 @SQ SN:AYCK01028523.1 LN:4492 @SQ SN:AYCK01029730.1 LN:4492 @SQ SN:KI521310.1 LN:4488 @SQ SN:KI521296.1 LN:4485 @SQ SN:KI521302.1 LN:4478 @SQ SN:AYCK01029731.1 LN:4467 @SQ SN:KI521319.1 LN:4456 @SQ SN:AYCK01028542.1 LN:4454 @SQ SN:KI521313.1 LN:4453 @SQ SN:AYCK01029732.1 LN:4445 @SQ SN:AYCK01029733.1 LN:4444 @SQ SN:AYCK01029734.1 LN:4444 @SQ SN:AYCK01029735.1 LN:4437 @SQ SN:AYCK01029736.1 LN:4434 @SQ SN:AYCK01029737.1 LN:4427 @SQ SN:AYCK01029738.1 LN:4427 @SQ SN:AYCK01029739.1 LN:4425 @SQ SN:KI521312.1 LN:4424 @SQ SN:KI521318.1 LN:4412 @SQ SN:AYCK01029740.1 LN:4409 @SQ SN:AYCK01029741.1 LN:4407 @SQ SN:KI521324.1 LN:4394 @SQ SN:KI521326.1 LN:4381 @SQ SN:AYCK01029742.1 LN:4381 @SQ SN:AYCK01029743.1 LN:4371 @SQ SN:KI521307.1 LN:4369 @SQ SN:AYCK01029744.1 LN:4369 @SQ SN:AYCK01029745.1 LN:4367 @SQ SN:AYCK01029746.1 LN:4361 @SQ SN:AYCK01029747.1 LN:4352 @SQ SN:AYCK01029748.1 LN:4350 @SQ SN:AYCK01029749.1 LN:4337 @SQ SN:AYCK01028563.1 LN:4332 @SQ SN:KI521320.1 LN:4328 @SQ SN:KI521331.1 LN:4325 @SQ SN:AYCK01029750.1 LN:4315 @SQ SN:AYCK01029751.1 LN:4308 @SQ SN:AYCK01029752.1 LN:4300 @SQ SN:AYCK01028566.1 LN:4295 @SQ SN:KI521327.1 LN:4292 @SQ SN:KI521323.1 LN:4285 @SQ SN:KI521309.1 LN:4277 @SQ SN:KI521321.1 LN:4275 @SQ SN:KI521322.1 LN:4269 @SQ SN:AYCK01029753.1 LN:4258 @SQ SN:AYCK01029754.1 LN:4257 @SQ SN:AYCK01029755.1 LN:4251 @SQ SN:KI521329.1 LN:4249 @SQ SN:AYCK01029756.1 LN:4247 @SQ SN:AYCK01029757.1 LN:4243 @SQ SN:AYCK01029758.1 LN:4238 @SQ SN:KI521400.1 LN:4213 @SQ SN:AYCK01029759.1 LN:4204 @SQ SN:AYCK01029760.1 LN:4201 @SQ SN:AYCK01029761.1 LN:4195 @SQ SN:KI521341.1 LN:4192 @SQ SN:AYCK01029762.1 LN:4184 @SQ SN:AYCK01029763.1 LN:4184 @SQ SN:AYCK01029764.1 LN:4176 @SQ SN:AYCK01029765.1 LN:4175 @SQ SN:AYCK01029766.1 LN:4169 @SQ SN:AYCK01029767.1 LN:4169 @SQ SN:AYCK01029768.1 LN:4167 @SQ SN:AYCK01029769.1 LN:4163 @SQ SN:AYCK01029770.1 LN:4158 @SQ SN:AYCK01029771.1 LN:4155 @SQ SN:KI521325.1 LN:4154 @SQ SN:KI521314.1 LN:4151 @SQ SN:KI521338.1 LN:4146 @SQ SN:KI521348.1 LN:4143 @SQ SN:AYCK01029772.1 LN:4143 @SQ SN:AYCK01029773.1 LN:4135 @SQ SN:AYCK01029774.1 LN:4132 @SQ SN:AYCK01029775.1 LN:4128 @SQ SN:KI521345.1 LN:4122 @SQ SN:AYCK01029776.1 LN:4119 @SQ SN:KI521337.1 LN:4112 @SQ SN:AYCK01029777.1 LN:4093 @SQ SN:AYCK01028585.1 LN:4087 @SQ SN:AYCK01028586.1 LN:4079 @SQ SN:AYCK01029778.1 LN:4076 @SQ SN:AYCK01029779.1 LN:4066 @SQ SN:KI521355.1 LN:4060 @SQ SN:KI521339.1 LN:4057 @SQ SN:KI521354.1 LN:4053 @SQ SN:AYCK01028591.1 LN:4046 @SQ SN:AYCK01029780.1 LN:4046 @SQ SN:AYCK01029781.1 LN:4045 @SQ SN:KI521330.1 LN:4043 @SQ SN:KI521286.1 LN:4037 @SQ SN:AYCK01029782.1 LN:4033 @SQ SN:KI521356.1 LN:4032 @SQ SN:AYCK01029783.1 LN:4030 @SQ SN:KI521407.1 LN:4026 @SQ SN:KI521332.1 LN:4022 @SQ SN:AYCK01029784.1 LN:4018 @SQ SN:AYCK01029785.1 LN:4011 @SQ SN:KI521350.1 LN:4006 @SQ SN:KI521328.1 LN:4005 @SQ SN:AYCK01029786.1 LN:3998 @SQ SN:KI521361.1 LN:3996 @SQ SN:AYCK01029787.1 LN:3988 @SQ SN:AYCK01029788.1 LN:3981 @SQ SN:AYCK01029789.1 LN:3977 @SQ SN:KI521359.1 LN:3973 @SQ SN:AYCK01029790.1 LN:3965 @SQ SN:KI521358.1 LN:3961 @SQ SN:AYCK01029791.1 LN:3961 @SQ SN:KI521343.1 LN:3951 @SQ SN:AYCK01029792.1 LN:3951 @SQ SN:AYCK01029793.1 LN:3950 @SQ SN:KI521342.1 LN:3948 @SQ SN:AYCK01029794.1 LN:3945 @SQ SN:KI521369.1 LN:3944 @SQ SN:AYCK01029795.1 LN:3937 @SQ SN:KI521370.1 LN:3936 @SQ SN:KI521367.1 LN:3929 @SQ SN:AYCK01029796.1 LN:3929 @SQ SN:AYCK01029797.1 LN:3925 @SQ SN:KI521362.1 LN:3921 @SQ SN:AYCK01029798.1 LN:3919 @SQ SN:KI521352.1 LN:3916 @SQ SN:AYCK01029799.1 LN:3912 @SQ SN:KI521340.1 LN:3906 @SQ SN:AYCK01029800.1 LN:3899 @SQ SN:KI521351.1 LN:3898 @SQ SN:AYCK01029801.1 LN:3896 @SQ SN:KI521347.1 LN:3892 @SQ SN:KI521427.1 LN:3883 @SQ SN:AYCK01028610.1 LN:3882 @SQ SN:KI521378.1 LN:3882 @SQ SN:KI521346.1 LN:3879 @SQ SN:AYCK01029802.1 LN:3876 @SQ SN:AYCK01029803.1 LN:3876 @SQ SN:AYCK01029804.1 LN:3874 @SQ SN:AYCK01029805.1 LN:3869 @SQ SN:AYCK01029806.1 LN:3865 @SQ SN:AYCK01028611.1 LN:3861 @SQ SN:AYCK01028612.1 LN:3861 @SQ SN:KI521353.1 LN:3857 @SQ SN:KI521379.1 LN:3857 @SQ SN:AYCK01029807.1 LN:3854 @SQ SN:AYCK01029808.1 LN:3831 @SQ SN:KI521377.1 LN:3830 @SQ SN:KI521366.1 LN:3815 @SQ SN:AYCK01029809.1 LN:3813 @SQ SN:KI521373.1 LN:3808 @SQ SN:KI521381.1 LN:3800 @SQ SN:KI521372.1 LN:3797 @SQ SN:AYCK01029810.1 LN:3797 @SQ SN:KI521334.1 LN:3796 @SQ SN:AYCK01029811.1 LN:3791 @SQ SN:AYCK01029812.1 LN:3790 @SQ SN:AYCK01029813.1 LN:3789 @SQ SN:KI521374.1 LN:3787 @SQ SN:AYCK01029814.1 LN:3787 @SQ SN:AYCK01029815.1 LN:3786 @SQ SN:AYCK01029816.1 LN:3780 @SQ SN:KI521385.1 LN:3779 @SQ SN:AYCK01028627.1 LN:3773 @SQ SN:AYCK01028632.1 LN:3770 @SQ SN:AYCK01029817.1 LN:3768 @SQ SN:KI521386.1 LN:3766 @SQ SN:KI521375.1 LN:3765 @SQ SN:AYCK01029818.1 LN:3741 @SQ SN:AYCK01029819.1 LN:3741 @SQ SN:AYCK01029820.1 LN:3738 @SQ SN:AYCK01029821.1 LN:3729 @SQ SN:KI521368.1 LN:3726 @SQ SN:KI521393.1 LN:3714 @SQ SN:KI521390.1 LN:3713 @SQ SN:AYCK01029822.1 LN:3707 @SQ SN:AYCK01029823.1 LN:3707 @SQ SN:AYCK01029824.1 LN:3702 @SQ SN:AYCK01029825.1 LN:3701 @SQ SN:KI521371.1 LN:3700 @SQ SN:KI521388.1 LN:3694 @SQ SN:KI521363.1 LN:3693 @SQ SN:AYCK01029826.1 LN:3693 @SQ SN:KI521333.1 LN:3692 @SQ SN:AYCK01029827.1 LN:3684 @SQ SN:KI521383.1 LN:3681 @SQ SN:AYCK01028646.1 LN:3679 @SQ SN:AYCK01029828.1 LN:3674 @SQ SN:KI521397.1 LN:3662 @SQ SN:KI521365.1 LN:3661 @SQ SN:AYCK01029829.1 LN:3661 @SQ SN:AYCK01029830.1 LN:3661 @SQ SN:AYCK01029831.1 LN:3656 @SQ SN:KI521395.1 LN:3653 @SQ SN:AYCK01029832.1 LN:3652 @SQ SN:AYCK01029833.1 LN:3643 @SQ SN:AYCK01029834.1 LN:3639 @SQ SN:KI521376.1 LN:3637 @SQ SN:KI521394.1 LN:3635 @SQ SN:KI521336.1 LN:3631 @SQ SN:AYCK01029835.1 LN:3630 @SQ SN:KI521364.1 LN:3628 @SQ SN:AYCK01029836.1 LN:3627 @SQ SN:AYCK01029837.1 LN:3625 @SQ SN:AYCK01029838.1 LN:3618 @SQ SN:AYCK01029839.1 LN:3609 @SQ SN:KI521391.1 LN:3608 @SQ SN:AYCK01029840.1 LN:3608 @SQ SN:KI521384.1 LN:3604 @SQ SN:AYCK01029841.1 LN:3604 @SQ SN:AYCK01029842.1 LN:3595 @SQ SN:AYCK01029843.1 LN:3589 @SQ SN:AYCK01029844.1 LN:3581 @SQ SN:KI521402.1 LN:3578 @SQ SN:KI521405.1 LN:3577 @SQ SN:KI521404.1 LN:3574 @SQ SN:AYCK01028653.1 LN:3569 @SQ SN:AYCK01029845.1 LN:3569 @SQ SN:KI521471.1 LN:3562 @SQ SN:AYCK01029846.1 LN:3562 @SQ SN:AYCK01029847.1 LN:3555 @SQ SN:AYCK01029848.1 LN:3554 @SQ SN:AYCK01029849.1 LN:3552 @SQ SN:AYCK01029850.1 LN:3551 @SQ SN:KI521406.1 LN:3549 @SQ SN:KI521311.1 LN:3547 @SQ SN:KI521392.1 LN:3542 @SQ SN:AYCK01029851.1 LN:3542 @SQ SN:KI521403.1 LN:3539 @SQ SN:AYCK01028664.1 LN:3526 @SQ SN:AYCK01028665.1 LN:3524 @SQ SN:AYCK01029852.1 LN:3523 @SQ SN:AYCK01029853.1 LN:3521 @SQ SN:AYCK01029854.1 LN:3513 @SQ SN:AYCK01029855.1 LN:3513 @SQ SN:KI521396.1 LN:3509 @SQ SN:AYCK01029856.1 LN:3509 @SQ SN:KI521389.1 LN:3505 @SQ SN:AYCK01029857.1 LN:3504 @SQ SN:AYCK01028666.1 LN:3503 @SQ SN:AYCK01029858.1 LN:3501 @SQ SN:AYCK01029859.1 LN:3496 @SQ SN:AYCK01029860.1 LN:3492 @SQ SN:KI521335.1 LN:3488 @SQ SN:AYCK01029861.1 LN:3486 @SQ SN:AYCK01029862.1 LN:3483 @SQ SN:KI521410.1 LN:3480 @SQ SN:AYCK01029863.1 LN:3474 @SQ SN:AYCK01029864.1 LN:3465 @SQ SN:AYCK01029865.1 LN:3461 @SQ SN:AYCK01029866.1 LN:3460 @SQ SN:AYCK01029867.1 LN:3459 @SQ SN:AYCK01029868.1 LN:3458 @SQ SN:AYCK01029869.1 LN:3455 @SQ SN:AYCK01029870.1 LN:3454 @SQ SN:KI521408.1 LN:3448 @SQ SN:AYCK01029871.1 LN:3448 @SQ SN:KI521380.1 LN:3446 @SQ SN:KI521398.1 LN:3445 @SQ SN:AYCK01029872.1 LN:3442 @SQ SN:KI521415.1 LN:3438 @SQ SN:KI521401.1 LN:3433 @SQ SN:AYCK01028689.1 LN:3426 @SQ SN:KI521416.1 LN:3426 @SQ SN:AYCK01029873.1 LN:3420 @SQ SN:AYCK01029874.1 LN:3407 @SQ SN:AYCK01029875.1 LN:3406 @SQ SN:AYCK01029876.1 LN:3403 @SQ SN:AYCK01029877.1 LN:3394 @SQ SN:KI521387.1 LN:3389 @SQ SN:AYCK01029878.1 LN:3384 @SQ SN:AYCK01028698.1 LN:3380 @SQ SN:AYCK01029879.1 LN:3377 @SQ SN:KI521419.1 LN:3374 @SQ SN:KI521417.1 LN:3373 @SQ SN:AYCK01029880.1 LN:3364 @SQ SN:KI521414.1 LN:3360 @SQ SN:AYCK01029881.1 LN:3352 @SQ SN:AYCK01029882.1 LN:3335 @SQ SN:AYCK01029883.1 LN:3329 @SQ SN:AYCK01028705.1 LN:3326 @SQ SN:AYCK01029884.1 LN:3325 @SQ SN:AYCK01029885.1 LN:3324 @SQ SN:AYCK01029886.1 LN:3315 @SQ SN:AYCK01029887.1 LN:3315 @SQ SN:KI521399.1 LN:3311 @SQ SN:KI521461.1 LN:3306 @SQ SN:AYCK01029888.1 LN:3306 @SQ SN:AYCK01029889.1 LN:3306 @SQ SN:AYCK01029890.1 LN:3305 @SQ SN:AYCK01028712.1 LN:3300 @SQ SN:AYCK01028713.1 LN:3300 @SQ SN:AYCK01028716.1 LN:3296 @SQ SN:AYCK01029891.1 LN:3293 @SQ SN:KI521411.1 LN:3287 @SQ SN:AYCK01029892.1 LN:3285 @SQ SN:AYCK01028721.1 LN:3283 @SQ SN:AYCK01029893.1 LN:3279 @SQ SN:AYCK01029894.1 LN:3273 @SQ SN:AYCK01029895.1 LN:3272 @SQ SN:AYCK01029896.1 LN:3269 @SQ SN:AYCK01029897.1 LN:3264 @SQ SN:AYCK01029898.1 LN:3264 @SQ SN:AYCK01029899.1 LN:3263 @SQ SN:AYCK01029900.1 LN:3258 @SQ SN:AYCK01029901.1 LN:3256 @SQ SN:AYCK01029902.1 LN:3255 @SQ SN:AYCK01029903.1 LN:3252 @SQ SN:AYCK01029904.1 LN:3248 @SQ SN:AYCK01029905.1 LN:3246 @SQ SN:AYCK01029906.1 LN:3237 @SQ SN:KI521428.1 LN:3227 @SQ SN:KI521433.1 LN:3222 @SQ SN:KI521431.1 LN:3220 @SQ SN:KI521434.1 LN:3219 @SQ SN:KI521425.1 LN:3215 @SQ SN:KI521435.1 LN:3215 @SQ SN:AYCK01028734.1 LN:3213 @SQ SN:KI521421.1 LN:3212 @SQ SN:AYCK01029907.1 LN:3211 @SQ SN:AYCK01029908.1 LN:3211 @SQ SN:AYCK01029909.1 LN:3205 @SQ SN:KI521424.1 LN:3204 @SQ SN:AYCK01029910.1 LN:3204 @SQ SN:AYCK01028737.1 LN:3203 @SQ SN:AYCK01028738.1 LN:3201 @SQ SN:KI521422.1 LN:3200 @SQ SN:AYCK01029911.1 LN:3199 @SQ SN:AYCK01029912.1 LN:3198 @SQ SN:AYCK01029913.1 LN:3196 @SQ SN:AYCK01029914.1 LN:3191 @SQ SN:AYCK01029915.1 LN:3189 @SQ SN:AYCK01028745.1 LN:3187 @SQ SN:KI521437.1 LN:3179 @SQ SN:AYCK01029916.1 LN:3173 @SQ SN:AYCK01029917.1 LN:3172 @SQ SN:AYCK01029918.1 LN:3172 @SQ SN:KI521420.1 LN:3168 @SQ SN:KI521438.1 LN:3153 @SQ SN:AYCK01029919.1 LN:3153 @SQ SN:AYCK01028752.1 LN:3151 @SQ SN:AYCK01028753.1 LN:3151 @SQ SN:AYCK01029920.1 LN:3147 @SQ SN:KI521423.1 LN:3145 @SQ SN:KI521439.1 LN:3143 @SQ SN:AYCK01029921.1 LN:3143 @SQ SN:AYCK01029922.1 LN:3140 @SQ SN:AYCK01028756.1 LN:3139 @SQ SN:AYCK01029923.1 LN:3139 @SQ SN:AYCK01029924.1 LN:3138 @SQ SN:KI521430.1 LN:3137 @SQ SN:AYCK01029925.1 LN:3137 @SQ SN:KI521440.1 LN:3135 @SQ SN:KI521441.1 LN:3131 @SQ SN:KI521443.1 LN:3123 @SQ SN:AYCK01029926.1 LN:3113 @SQ SN:KI521436.1 LN:3112 @SQ SN:AYCK01029927.1 LN:3110 @SQ SN:AYCK01029928.1 LN:3077 @SQ SN:AYCK01029929.1 LN:3076 @SQ SN:AYCK01029930.1 LN:3074 @SQ SN:AYCK01029931.1 LN:3071 @SQ SN:KI521382.1 LN:3070 @SQ SN:KI521409.1 LN:3070 @SQ SN:AYCK01029932.1 LN:3070 @SQ SN:KI521418.1 LN:3069 @SQ SN:AYCK01029933.1 LN:3069 @SQ SN:AYCK01029934.1 LN:3065 @SQ SN:KI521413.1 LN:3061 @SQ SN:AYCK01029935.1 LN:3057 @SQ SN:AYCK01029936.1 LN:3055 @SQ SN:AYCK01029937.1 LN:3044 @SQ SN:KI521444.1 LN:3041 @SQ SN:AYCK01029938.1 LN:3035 @SQ SN:AYCK01029939.1 LN:3034 @SQ SN:AYCK01029940.1 LN:3034 @SQ SN:AYCK01029941.1 LN:3024 @SQ SN:KI521429.1 LN:3021 @SQ SN:AYCK01029942.1 LN:3018 @SQ SN:AYCK01029943.1 LN:3017 @SQ SN:KI521448.1 LN:3011 @SQ SN:KI521447.1 LN:3002 @SQ SN:AYCK01029944.1 LN:3000 @SQ SN:AYCK01029945.1 LN:3000 @SQ SN:KI521426.1 LN:2991 @SQ SN:AYCK01029946.1 LN:2985 @SQ SN:AYCK01028790.1 LN:2979 @SQ SN:AYCK01029947.1 LN:2973 @SQ SN:AYCK01029948.1 LN:2960 @SQ SN:AYCK01029949.1 LN:2959 @SQ SN:AYCK01029950.1 LN:2958 @SQ SN:KI521445.1 LN:2957 @SQ SN:AYCK01029951.1 LN:2944 @SQ SN:AYCK01029952.1 LN:2943 @SQ SN:KI521442.1 LN:2921 @SQ SN:AYCK01029953.1 LN:2916 @SQ SN:KI521453.1 LN:2914 @SQ SN:AYCK01029954.1 LN:2908 @SQ SN:AYCK01029955.1 LN:2902 @SQ SN:AYCK01029956.1 LN:2898 @SQ SN:AYCK01029957.1 LN:2896 @SQ SN:AYCK01029958.1 LN:2889 @SQ SN:AYCK01029959.1 LN:2888 @SQ SN:KI521455.1 LN:2882 @SQ SN:AYCK01029960.1 LN:2882 @SQ SN:AYCK01029961.1 LN:2879 @SQ SN:AYCK01029962.1 LN:2875 @SQ SN:KI521454.1 LN:2868 @SQ SN:AYCK01029963.1 LN:2861 @SQ SN:AYCK01029964.1 LN:2859 @SQ SN:AYCK01029965.1 LN:2855 @SQ SN:KI521456.1 LN:2854 @SQ SN:AYCK01029966.1 LN:2854 @SQ SN:AYCK01029967.1 LN:2848 @SQ SN:KI521457.1 LN:2828 @SQ SN:AYCK01029968.1 LN:2827 @SQ SN:KI521432.1 LN:2820 @SQ SN:AYCK01029969.1 LN:2819 @SQ SN:AYCK01029970.1 LN:2814 @SQ SN:KI521446.1 LN:2809 @SQ SN:AYCK01029971.1 LN:2808 @SQ SN:AYCK01029972.1 LN:2805 @SQ SN:KI521450.1 LN:2803 @SQ SN:AYCK01028833.1 LN:2792 @SQ SN:KI521451.1 LN:2790 @SQ SN:AYCK01028834.1 LN:2786 @SQ SN:AYCK01028835.1 LN:2786 @SQ SN:AYCK01029973.1 LN:2785 @SQ SN:AYCK01029974.1 LN:2784 @SQ SN:AYCK01029975.1 LN:2778 @SQ SN:AYCK01029976.1 LN:2754 @SQ SN:KI521449.1 LN:2751 @SQ SN:AYCK01029977.1 LN:2740 @SQ SN:AYCK01029978.1 LN:2738 @SQ SN:AYCK01028850.1 LN:2735 @SQ SN:KI521460.1 LN:2732 @SQ SN:AYCK01029979.1 LN:2728 @SQ SN:AYCK01029980.1 LN:2724 @SQ SN:AYCK01029981.1 LN:2717 @SQ SN:AYCK01028855.1 LN:2713 @SQ SN:AYCK01029982.1 LN:2712 @SQ SN:AYCK01029983.1 LN:2710 @SQ SN:AYCK01029984.1 LN:2704 @SQ SN:AYCK01029985.1 LN:2700 @SQ SN:AYCK01029986.1 LN:2695 @SQ SN:KI521459.1 LN:2694 @SQ SN:AYCK01029987.1 LN:2693 @SQ SN:AYCK01029988.1 LN:2692 @SQ SN:AYCK01029989.1 LN:2688 @SQ SN:AYCK01029990.1 LN:2682 @SQ SN:AYCK01029991.1 LN:2682 @SQ SN:AYCK01029992.1 LN:2673 @SQ SN:AYCK01029993.1 LN:2673 @SQ SN:KI521452.1 LN:2671 @SQ SN:AYCK01029994.1 LN:2671 @SQ SN:KI521458.1 LN:2670 @SQ SN:AYCK01029995.1 LN:2666 @SQ SN:AYCK01029996.1 LN:2658 @SQ SN:AYCK01029997.1 LN:2657 @SQ SN:AYCK01029998.1 LN:2654 @SQ SN:AYCK01029999.1 LN:2654 @SQ SN:AYCK01030000.1 LN:2651 @SQ SN:AYCK01030001.1 LN:2644 @SQ SN:AYCK01030002.1 LN:2643 @SQ SN:AYCK01030003.1 LN:2632 @SQ SN:AYCK01030004.1 LN:2631 @SQ SN:AYCK01030005.1 LN:2626 @SQ SN:AYCK01030006.1 LN:2625 @SQ SN:AYCK01030007.1 LN:2623 @SQ SN:AYCK01030008.1 LN:2619 @SQ SN:AYCK01030009.1 LN:2619 @SQ SN:KI521464.1 LN:2618 @SQ SN:AYCK01030010.1 LN:2605 @SQ SN:AYCK01030011.1 LN:2603 @SQ SN:AYCK01030012.1 LN:2602 @SQ SN:AYCK01030013.1 LN:2593 @SQ SN:AYCK01030014.1 LN:2581 @SQ SN:AYCK01030015.1 LN:2580 @SQ SN:AYCK01030016.1 LN:2576 @SQ SN:AYCK01030017.1 LN:2574 @SQ SN:AYCK01030018.1 LN:2571 @SQ SN:AYCK01028883.1 LN:2568 @SQ SN:AYCK01030019.1 LN:2564 @SQ SN:AYCK01030020.1 LN:2564 @SQ SN:AYCK01030021.1 LN:2560 @SQ SN:AYCK01028884.1 LN:2557 @SQ SN:AYCK01028885.1 LN:2557 @SQ SN:AYCK01030022.1 LN:2557 @SQ SN:KI521466.1 LN:2547 @SQ SN:AYCK01030023.1 LN:2540 @SQ SN:AYCK01028891.1 LN:2538 @SQ SN:AYCK01030024.1 LN:2537 @SQ SN:AYCK01030025.1 LN:2530 @SQ SN:AYCK01028892.1 LN:2527 @SQ SN:KI521465.1 LN:2525 @SQ SN:AYCK01028860.1 LN:2524 @SQ SN:AYCK01030026.1 LN:2524 @SQ SN:AYCK01030027.1 LN:2520 @SQ SN:AYCK01028893.1 LN:2518 @SQ SN:AYCK01030028.1 LN:2518 @SQ SN:AYCK01030029.1 LN:2517 @SQ SN:AYCK01028894.1 LN:2512 @SQ SN:AYCK01030030.1 LN:2512 @SQ SN:AYCK01028895.1 LN:2509 @SQ SN:AYCK01030031.1 LN:2507 @SQ SN:AYCK01030032.1 LN:2507 @SQ SN:AYCK01030033.1 LN:2506 @SQ SN:AYCK01028896.1 LN:2504 @SQ SN:AYCK01030034.1 LN:2501 @SQ SN:AYCK01030035.1 LN:2499 @SQ SN:KI521412.1 LN:2497 @SQ SN:AYCK01030036.1 LN:2496 @SQ SN:AYCK01028901.1 LN:2495 @SQ SN:AYCK01030037.1 LN:2495 @SQ SN:AYCK01030038.1 LN:2493 @SQ SN:AYCK01028872.1 LN:2490 @SQ SN:KI521469.1 LN:2489 @SQ SN:AYCK01030039.1 LN:2488 @SQ SN:AYCK01030040.1 LN:2486 @SQ SN:AYCK01030041.1 LN:2485 @SQ SN:AYCK01028904.1 LN:2479 @SQ SN:AYCK01030042.1 LN:2478 @SQ SN:AYCK01030043.1 LN:2476 @SQ SN:AYCK01030044.1 LN:2467 @SQ SN:AYCK01028909.1 LN:2460 @SQ SN:AYCK01030045.1 LN:2460 @SQ SN:AYCK01030046.1 LN:2456 @SQ SN:AYCK01030047.1 LN:2453 @SQ SN:AYCK01030048.1 LN:2451 @SQ SN:KI521463.1 LN:2448 @SQ SN:AYCK01030049.1 LN:2448 @SQ SN:KI521468.1 LN:2445 @SQ SN:AYCK01030050.1 LN:2443 @SQ SN:AYCK01030051.1 LN:2439 @SQ SN:AYCK01030052.1 LN:2438 @SQ SN:AYCK01030053.1 LN:2434 @SQ SN:AYCK01030054.1 LN:2430 @SQ SN:AYCK01030055.1 LN:2430 @SQ SN:AYCK01030056.1 LN:2430 @SQ SN:AYCK01030057.1 LN:2429 @SQ SN:AYCK01030058.1 LN:2424 @SQ SN:AYCK01030059.1 LN:2421 @SQ SN:AYCK01030060.1 LN:2415 @SQ SN:AYCK01030061.1 LN:2415 @SQ SN:AYCK01030062.1 LN:2410 @SQ SN:AYCK01030063.1 LN:2409 @SQ SN:AYCK01030064.1 LN:2408 @SQ SN:AYCK01030065.1 LN:2407 @SQ SN:KI521462.1 LN:2398 @SQ SN:AYCK01030066.1 LN:2397 @SQ SN:AYCK01030067.1 LN:2392 @SQ SN:AYCK01030068.1 LN:2386 @SQ SN:AYCK01030069.1 LN:2385 @SQ SN:AYCK01030070.1 LN:2382 @SQ SN:AYCK01030071.1 LN:2380 @SQ SN:AYCK01030072.1 LN:2379 @SQ SN:AYCK01030073.1 LN:2378 @SQ SN:AYCK01028922.1 LN:2377 @SQ SN:AYCK01028923.1 LN:2377 @SQ SN:AYCK01030074.1 LN:2377 @SQ SN:AYCK01030075.1 LN:2372 @SQ SN:AYCK01030076.1 LN:2371 @SQ SN:AYCK01030077.1 LN:2369 @SQ SN:AYCK01030078.1 LN:2368 @SQ SN:AYCK01030079.1 LN:2366 @SQ SN:AYCK01030080.1 LN:2357 @SQ SN:AYCK01030081.1 LN:2355 @SQ SN:AYCK01030082.1 LN:2354 @SQ SN:AYCK01030083.1 LN:2353 @SQ SN:AYCK01030084.1 LN:2349 @SQ SN:KI521472.1 LN:2345 @SQ SN:AYCK01030085.1 LN:2345 @SQ SN:KI521473.1 LN:2338 @SQ SN:AYCK01030086.1 LN:2333 @SQ SN:AYCK01030087.1 LN:2332 @SQ SN:KI521470.1 LN:2329 @SQ SN:AYCK01030088.1 LN:2315 @SQ SN:AYCK01030089.1 LN:2308 @SQ SN:AYCK01030090.1 LN:2306 @SQ SN:KI521479.1 LN:2305 @SQ SN:AYCK01030091.1 LN:2304 @SQ SN:AYCK01028934.1 LN:2301 @SQ SN:AYCK01030092.1 LN:2300 @SQ SN:AYCK01030093.1 LN:2299 @SQ SN:AYCK01030094.1 LN:2294 @SQ SN:KI521481.1 LN:2293 @SQ SN:AYCK01030095.1 LN:2292 @SQ SN:AYCK01030096.1 LN:2289 @SQ SN:AYCK01030097.1 LN:2289 @SQ SN:AYCK01030098.1 LN:2288 @SQ SN:AYCK01030099.1 LN:2285 @SQ SN:AYCK01030100.1 LN:2284 @SQ SN:AYCK01030101.1 LN:2282 @SQ SN:KI521476.1 LN:2268 @SQ SN:AYCK01028941.1 LN:2265 @SQ SN:AYCK01028947.1 LN:2259 @SQ SN:AYCK01030102.1 LN:2259 @SQ SN:AYCK01030103.1 LN:2258 @SQ SN:AYCK01030104.1 LN:2254 @SQ SN:AYCK01030105.1 LN:2252 @SQ SN:AYCK01030106.1 LN:2252 @SQ SN:AYCK01030107.1 LN:2244 @SQ SN:KI521475.1 LN:2242 @SQ SN:KI521467.1 LN:2240 @SQ SN:AYCK01030108.1 LN:2237 @SQ SN:AYCK01030109.1 LN:2236 @SQ SN:AYCK01030110.1 LN:2234 @SQ SN:AYCK01028954.1 LN:2232 @SQ SN:AYCK01030111.1 LN:2229 @SQ SN:AYCK01030112.1 LN:2225 @SQ SN:AYCK01030113.1 LN:2223 @SQ SN:AYCK01030114.1 LN:2223 @SQ SN:AYCK01030115.1 LN:2221 @SQ SN:KI521477.1 LN:2220 @SQ SN:AYCK01030116.1 LN:2220 @SQ SN:AYCK01030117.1 LN:2218 @SQ SN:AYCK01030118.1 LN:2218 @SQ SN:AYCK01030119.1 LN:2215 @SQ SN:AYCK01030120.1 LN:2214 @SQ SN:AYCK01030121.1 LN:2211 @SQ SN:AYCK01030122.1 LN:2207 @SQ SN:AYCK01030123.1 LN:2206 @SQ SN:AYCK01030124.1 LN:2206 @SQ SN:AYCK01028966.1 LN:2201 @SQ SN:AYCK01030125.1 LN:2201 @SQ SN:AYCK01030126.1 LN:2199 @SQ SN:AYCK01030127.1 LN:2194 @SQ SN:AYCK01030128.1 LN:2193 @SQ SN:AYCK01030129.1 LN:2193 @SQ SN:AYCK01030130.1 LN:2192 @SQ SN:AYCK01030131.1 LN:2190 @SQ SN:AYCK01030132.1 LN:2186 @SQ SN:KI521485.1 LN:2184 @SQ SN:KI521474.1 LN:2183 @SQ SN:AYCK01030133.1 LN:2182 @SQ SN:AYCK01030134.1 LN:2182 @SQ SN:KI521480.1 LN:2181 @SQ SN:AYCK01028969.1 LN:2177 @SQ SN:AYCK01030135.1 LN:2172 @SQ SN:KI521478.1 LN:2171 @SQ SN:AYCK01030136.1 LN:2171 @SQ SN:AYCK01030137.1 LN:2170 @SQ SN:AYCK01030138.1 LN:2170 @SQ SN:AYCK01030139.1 LN:2170 @SQ SN:AYCK01030140.1 LN:2168 @SQ SN:AYCK01030141.1 LN:2161 @SQ SN:AYCK01030142.1 LN:2156 @SQ SN:AYCK01030143.1 LN:2154 @SQ SN:AYCK01030144.1 LN:2150 @SQ SN:AYCK01030145.1 LN:2150 @SQ SN:AYCK01030146.1 LN:2148 @SQ SN:AYCK01030147.1 LN:2147 @SQ SN:AYCK01030148.1 LN:2144 @SQ SN:AYCK01030149.1 LN:2143 @SQ SN:AYCK01030150.1 LN:2143 @SQ SN:AYCK01030151.1 LN:2142 @SQ SN:AYCK01030152.1 LN:2140 @SQ SN:AYCK01030153.1 LN:2131 @SQ SN:AYCK01030154.1 LN:2131 @SQ SN:AYCK01030155.1 LN:2130 @SQ SN:AYCK01030156.1 LN:2130 @SQ SN:AYCK01028961.1 LN:2129 @SQ SN:AYCK01030157.1 LN:2129 @SQ SN:KI521484.1 LN:2128 @SQ SN:AYCK01030158.1 LN:2127 @SQ SN:AYCK01028982.1 LN:2120 @SQ SN:AYCK01028983.1 LN:2115 @SQ SN:AYCK01030159.1 LN:2113 @SQ SN:AYCK01030160.1 LN:2113 @SQ SN:AYCK01030161.1 LN:2111 @SQ SN:AYCK01030162.1 LN:2110 @SQ SN:AYCK01030163.1 LN:2107 @SQ SN:AYCK01030164.1 LN:2106 @SQ SN:AYCK01030165.1 LN:2106 @SQ SN:AYCK01030166.1 LN:2105 @SQ SN:AYCK01030167.1 LN:2105 @SQ SN:AYCK01030168.1 LN:2102 @SQ SN:AYCK01030169.1 LN:2098 @SQ SN:AYCK01030170.1 LN:2098 @SQ SN:AYCK01030171.1 LN:2096 @SQ SN:AYCK01028986.1 LN:2091 @SQ SN:AYCK01030172.1 LN:2090 @SQ SN:AYCK01030173.1 LN:2085 @SQ SN:AYCK01030174.1 LN:2084 @SQ SN:AYCK01028987.1 LN:2078 @SQ SN:AYCK01030175.1 LN:2077 @SQ SN:AYCK01030176.1 LN:2072 @SQ SN:AYCK01030177.1 LN:2072 @SQ SN:AYCK01030178.1 LN:2070 @SQ SN:AYCK01030179.1 LN:2068 @SQ SN:AYCK01030180.1 LN:2061 @SQ SN:AYCK01030181.1 LN:2059 @SQ SN:AYCK01030182.1 LN:2058 @SQ SN:AYCK01030183.1 LN:2057 @SQ SN:AYCK01030184.1 LN:2055 @SQ SN:AYCK01030185.1 LN:2054 @SQ SN:AYCK01030186.1 LN:2053 @SQ SN:AYCK01030187.1 LN:2051 @SQ SN:AYCK01030188.1 LN:2049 @SQ SN:AYCK01030189.1 LN:2048 @SQ SN:AYCK01030190.1 LN:2044 @SQ SN:AYCK01030191.1 LN:2043 @SQ SN:KI521486.1 LN:2037 @SQ SN:AYCK01030192.1 LN:2037 @SQ SN:AYCK01030193.1 LN:2037 @SQ SN:KI521482.1 LN:2030 @SQ SN:AYCK01030194.1 LN:2030 @SQ SN:AYCK01028993.1 LN:2029 @SQ SN:AYCK01028994.1 LN:2026 @SQ SN:AYCK01030195.1 LN:2024 @SQ SN:AYCK01030196.1 LN:2019 @SQ SN:AYCK01028995.1 LN:2017 @SQ SN:AYCK01030197.1 LN:2016 @SQ SN:AYCK01028998.1 LN:2012 @SQ SN:AYCK01030198.1 LN:2010 @SQ SN:AYCK01030199.1 LN:2009 @SQ SN:AYCK01029001.1 LN:2008 @SQ SN:AYCK01030200.1 LN:2005 @SQ SN:AYCK01030201.1 LN:2005 @SQ SN:AYCK01030202.1 LN:2003 @SQ SN:AYCK01030203.1 LN:1999 @SQ SN:AYCK01030204.1 LN:1995 @SQ SN:AYCK01030205.1 LN:1995 @SQ SN:AYCK01030206.1 LN:1994 @SQ SN:AYCK01030207.1 LN:1989 @SQ SN:AYCK01030208.1 LN:1988 @SQ SN:KI521483.1 LN:1983 @SQ SN:AYCK01030209.1 LN:1982 @SQ SN:AYCK01030210.1 LN:1976 @SQ SN:AYCK01030211.1 LN:1976 @SQ SN:AYCK01030212.1 LN:1972 @SQ SN:AYCK01030213.1 LN:1972 @SQ SN:AYCK01030214.1 LN:1971 @SQ SN:AYCK01030215.1 LN:1968 @SQ SN:AYCK01030216.1 LN:1966 @SQ SN:AYCK01030217.1 LN:1965 @SQ SN:AYCK01030218.1 LN:1964 @SQ SN:AYCK01030219.1 LN:1964 @SQ SN:AYCK01030220.1 LN:1963 @SQ SN:AYCK01030221.1 LN:1960 @SQ SN:AYCK01030222.1 LN:1955 @SQ SN:AYCK01030223.1 LN:1954 @SQ SN:AYCK01030224.1 LN:1951 @SQ SN:AYCK01030225.1 LN:1950 @SQ SN:AYCK01030226.1 LN:1950 @SQ SN:AYCK01030227.1 LN:1945 @SQ SN:AYCK01030228.1 LN:1944 @SQ SN:AYCK01030229.1 LN:1944 @SQ SN:AYCK01030230.1 LN:1944 @SQ SN:AYCK01030231.1 LN:1943 @SQ SN:AYCK01030232.1 LN:1943 @SQ SN:AYCK01030233.1 LN:1940 @SQ SN:AYCK01030234.1 LN:1939 @SQ SN:AYCK01030235.1 LN:1937 @SQ SN:AYCK01030236.1 LN:1935 @SQ SN:AYCK01030237.1 LN:1933 @SQ SN:AYCK01029010.1 LN:1932 @SQ SN:AYCK01030238.1 LN:1932 @SQ SN:AYCK01030239.1 LN:1931 @SQ SN:AYCK01030240.1 LN:1930 @SQ SN:AYCK01030241.1 LN:1921 @SQ SN:AYCK01029011.1 LN:1919 @SQ SN:AYCK01030242.1 LN:1919 @SQ SN:AYCK01029012.1 LN:1918 @SQ SN:AYCK01030243.1 LN:1918 @SQ SN:AYCK01030244.1 LN:1917 @SQ SN:AYCK01030245.1 LN:1914 @SQ SN:AYCK01030246.1 LN:1914 @SQ SN:AYCK01030247.1 LN:1910 @SQ SN:AYCK01030248.1 LN:1908 @SQ SN:AYCK01030249.1 LN:1905 @SQ SN:AYCK01030250.1 LN:1903 @SQ SN:AYCK01030251.1 LN:1903 @SQ SN:AYCK01030252.1 LN:1899 @SQ SN:AYCK01030253.1 LN:1896 @SQ SN:AYCK01030254.1 LN:1895 @SQ SN:AYCK01029015.1 LN:1894 @SQ SN:AYCK01030255.1 LN:1893 @SQ SN:AYCK01030256.1 LN:1891 @SQ SN:AYCK01030257.1 LN:1890 @SQ SN:AYCK01029018.1 LN:1887 @SQ SN:AYCK01030258.1 LN:1886 @SQ SN:AYCK01030259.1 LN:1885 @SQ SN:AYCK01030260.1 LN:1885 @SQ SN:AYCK01030261.1 LN:1883 @SQ SN:AYCK01028988.1 LN:1882 @SQ SN:AYCK01030262.1 LN:1882 @SQ SN:AYCK01030263.1 LN:1879 @SQ SN:AYCK01030264.1 LN:1875 @SQ SN:AYCK01030265.1 LN:1867 @SQ SN:AYCK01030266.1 LN:1866 @SQ SN:AYCK01030267.1 LN:1866 @SQ SN:AYCK01029021.1 LN:1862 @SQ SN:AYCK01030268.1 LN:1860 @SQ SN:AYCK01030269.1 LN:1857 @SQ SN:AYCK01030270.1 LN:1856 @SQ SN:AYCK01030271.1 LN:1855 @SQ SN:AYCK01029024.1 LN:1853 @SQ SN:AYCK01030272.1 LN:1853 @SQ SN:AYCK01030273.1 LN:1849 @SQ SN:AYCK01030274.1 LN:1848 @SQ SN:AYCK01030275.1 LN:1847 @SQ SN:AYCK01029027.1 LN:1846 @SQ SN:AYCK01030276.1 LN:1843 @SQ SN:AYCK01030277.1 LN:1841 @SQ SN:AYCK01030278.1 LN:1841 @SQ SN:AYCK01030279.1 LN:1841 @SQ SN:AYCK01030280.1 LN:1840 @SQ SN:AYCK01029028.1 LN:1837 @SQ SN:AYCK01030281.1 LN:1836 @SQ SN:AYCK01030282.1 LN:1833 @SQ SN:AYCK01030283.1 LN:1822 @SQ SN:AYCK01030284.1 LN:1822 @SQ SN:AYCK01030285.1 LN:1820 @SQ SN:AYCK01030286.1 LN:1819 @SQ SN:AYCK01030287.1 LN:1812 @SQ SN:AYCK01029031.1 LN:1808 @SQ SN:AYCK01030288.1 LN:1807 @SQ SN:AYCK01030289.1 LN:1806 @SQ SN:AYCK01030290.1 LN:1803 @SQ SN:AYCK01029034.1 LN:1802 @SQ SN:AYCK01030291.1 LN:1797 @SQ SN:AYCK01030292.1 LN:1795 @SQ SN:AYCK01030293.1 LN:1794 @SQ SN:AYCK01030294.1 LN:1791 @SQ SN:AYCK01030295.1 LN:1790 @SQ SN:AYCK01030296.1 LN:1790 @SQ SN:AYCK01030297.1 LN:1789 @SQ SN:AYCK01030298.1 LN:1787 @SQ SN:AYCK01030299.1 LN:1786 @SQ SN:AYCK01030300.1 LN:1786 @SQ SN:AYCK01029037.1 LN:1780 @SQ SN:AYCK01030301.1 LN:1780 @SQ SN:AYCK01029038.1 LN:1778 @SQ SN:AYCK01030302.1 LN:1778 @SQ SN:AYCK01029039.1 LN:1777 @SQ SN:AYCK01030303.1 LN:1776 @SQ SN:AYCK01030304.1 LN:1776 @SQ SN:AYCK01030305.1 LN:1776 @SQ SN:AYCK01030306.1 LN:1773 @SQ SN:AYCK01030307.1 LN:1771 @SQ SN:AYCK01030308.1 LN:1768 @SQ SN:AYCK01030309.1 LN:1764 @SQ SN:AYCK01030310.1 LN:1764 @SQ SN:AYCK01030311.1 LN:1764 @SQ SN:AYCK01030312.1 LN:1760 @SQ SN:AYCK01030313.1 LN:1758 @SQ SN:AYCK01030314.1 LN:1758 @SQ SN:AYCK01030315.1 LN:1757 @SQ SN:AYCK01030316.1 LN:1756 @SQ SN:AYCK01030317.1 LN:1756 @SQ SN:AYCK01030318.1 LN:1751 @SQ SN:AYCK01030319.1 LN:1744 @SQ SN:AYCK01029040.1 LN:1743 @SQ SN:AYCK01030320.1 LN:1743 @SQ SN:AYCK01029041.1 LN:1741 @SQ SN:AYCK01030321.1 LN:1741 @SQ SN:AYCK01030322.1 LN:1741 @SQ SN:AYCK01030323.1 LN:1738 @SQ SN:AYCK01030324.1 LN:1735 @SQ SN:AYCK01030325.1 LN:1734 @SQ SN:AYCK01030326.1 LN:1734 @SQ SN:AYCK01030327.1 LN:1733 @SQ SN:AYCK01029042.1 LN:1730 @SQ SN:AYCK01030328.1 LN:1730 @SQ SN:AYCK01030329.1 LN:1729 @SQ SN:AYCK01030330.1 LN:1727 @SQ SN:AYCK01030331.1 LN:1717 @SQ SN:AYCK01030332.1 LN:1716 @SQ SN:AYCK01030333.1 LN:1715 @SQ SN:AYCK01030334.1 LN:1714 @SQ SN:AYCK01030335.1 LN:1714 @SQ SN:AYCK01030336.1 LN:1712 @SQ SN:AYCK01030337.1 LN:1711 @SQ SN:AYCK01029046.1 LN:1709 @SQ SN:AYCK01029047.1 LN:1706 @SQ SN:AYCK01030338.1 LN:1705 @SQ SN:AYCK01030339.1 LN:1703 @SQ SN:AYCK01030340.1 LN:1698 @SQ SN:AYCK01030341.1 LN:1698 @SQ SN:AYCK01030342.1 LN:1698 @SQ SN:AYCK01030343.1 LN:1697 @SQ SN:AYCK01030344.1 LN:1694 @SQ SN:AYCK01030345.1 LN:1689 @SQ SN:AYCK01030346.1 LN:1688 @SQ SN:AYCK01030347.1 LN:1686 @SQ SN:AYCK01030348.1 LN:1686 @SQ SN:AYCK01030349.1 LN:1685 @SQ SN:AYCK01030350.1 LN:1684 @SQ SN:AYCK01030351.1 LN:1677 @SQ SN:AYCK01030352.1 LN:1676 @SQ SN:AYCK01030353.1 LN:1673 @SQ SN:AYCK01030354.1 LN:1673 @SQ SN:AYCK01030355.1 LN:1671 @SQ SN:AYCK01030356.1 LN:1671 @SQ SN:AYCK01030357.1 LN:1663 @SQ SN:AYCK01029048.1 LN:1661 @SQ SN:KI521488.1 LN:1661 @SQ SN:AYCK01030358.1 LN:1658 @SQ SN:AYCK01030359.1 LN:1658 @SQ SN:AYCK01030360.1 LN:1656 @SQ SN:AYCK01029049.1 LN:1655 @SQ SN:AYCK01030361.1 LN:1653 @SQ SN:AYCK01030362.1 LN:1653 @SQ SN:AYCK01029050.1 LN:1652 @SQ SN:AYCK01030363.1 LN:1652 @SQ SN:AYCK01030364.1 LN:1650 @SQ SN:KI521487.1 LN:1649 @SQ SN:AYCK01030365.1 LN:1649 @SQ SN:AYCK01030366.1 LN:1649 @SQ SN:AYCK01030367.1 LN:1648 @SQ SN:AYCK01029051.1 LN:1646 @SQ SN:AYCK01030368.1 LN:1645 @SQ SN:AYCK01030369.1 LN:1642 @SQ SN:AYCK01030370.1 LN:1641 @SQ SN:AYCK01030371.1 LN:1639 @SQ SN:AYCK01030372.1 LN:1638 @SQ SN:AYCK01030373.1 LN:1637 @SQ SN:AYCK01030374.1 LN:1637 @SQ SN:AYCK01030375.1 LN:1635 @SQ SN:AYCK01029054.1 LN:1634 @SQ SN:AYCK01030376.1 LN:1631 @SQ SN:AYCK01030377.1 LN:1631 @SQ SN:AYCK01030378.1 LN:1626 @SQ SN:AYCK01030379.1 LN:1625 @SQ SN:AYCK01030380.1 LN:1624 @SQ SN:AYCK01030381.1 LN:1623 @SQ SN:AYCK01030382.1 LN:1621 @SQ SN:AYCK01030383.1 LN:1619 @SQ SN:AYCK01030384.1 LN:1618 @SQ SN:AYCK01030385.1 LN:1617 @SQ SN:AYCK01030386.1 LN:1617 @SQ SN:AYCK01030387.1 LN:1616 @SQ SN:AYCK01030388.1 LN:1615 @SQ SN:AYCK01030389.1 LN:1612 @SQ SN:AYCK01030390.1 LN:1611 @SQ SN:AYCK01030391.1 LN:1610 @SQ SN:AYCK01030392.1 LN:1610 @SQ SN:AYCK01030393.1 LN:1609 @SQ SN:AYCK01030394.1 LN:1609 @SQ SN:AYCK01030395.1 LN:1609 @SQ SN:AYCK01030396.1 LN:1608 @SQ SN:AYCK01030397.1 LN:1608 @SQ SN:AYCK01030398.1 LN:1607 @SQ SN:AYCK01030399.1 LN:1605 @SQ SN:AYCK01030400.1 LN:1603 @SQ SN:AYCK01030401.1 LN:1601 @SQ SN:AYCK01030402.1 LN:1599 @SQ SN:AYCK01030403.1 LN:1598 @SQ SN:AYCK01030404.1 LN:1598 @SQ SN:AYCK01030405.1 LN:1593 @SQ SN:AYCK01030406.1 LN:1592 @SQ SN:AYCK01030407.1 LN:1591 @SQ SN:AYCK01030408.1 LN:1591 @SQ SN:AYCK01030409.1 LN:1591 @SQ SN:AYCK01030410.1 LN:1589 @SQ SN:AYCK01030411.1 LN:1588 @SQ SN:AYCK01030412.1 LN:1586 @SQ SN:AYCK01030413.1 LN:1586 @SQ SN:AYCK01029062.1 LN:1584 @SQ SN:AYCK01030414.1 LN:1584 @SQ SN:AYCK01030415.1 LN:1584 @SQ SN:AYCK01030416.1 LN:1582 @SQ SN:AYCK01030417.1 LN:1581 @SQ SN:AYCK01030418.1 LN:1574 @SQ SN:AYCK01030419.1 LN:1574 @SQ SN:AYCK01030420.1 LN:1572 @SQ SN:AYCK01030421.1 LN:1568 @SQ SN:AYCK01030422.1 LN:1568 @SQ SN:AYCK01030423.1 LN:1568 @SQ SN:AYCK01030424.1 LN:1567 @SQ SN:AYCK01030425.1 LN:1567 @SQ SN:AYCK01030426.1 LN:1565 @SQ SN:AYCK01030427.1 LN:1565 @SQ SN:AYCK01030428.1 LN:1565 @SQ SN:AYCK01030429.1 LN:1565 @SQ SN:AYCK01030430.1 LN:1564 @SQ SN:AYCK01030431.1 LN:1563 @SQ SN:AYCK01030432.1 LN:1561 @SQ SN:AYCK01030433.1 LN:1561 @SQ SN:AYCK01030434.1 LN:1560 @SQ SN:AYCK01030435.1 LN:1559 @SQ SN:AYCK01030436.1 LN:1559 @SQ SN:AYCK01030437.1 LN:1558 @SQ SN:AYCK01030438.1 LN:1558 @SQ SN:AYCK01030439.1 LN:1557 @SQ SN:AYCK01030440.1 LN:1556 @SQ SN:AYCK01030441.1 LN:1556 @SQ SN:AYCK01030442.1 LN:1555 @SQ SN:AYCK01030443.1 LN:1553 @SQ SN:AYCK01030444.1 LN:1552 @SQ SN:AYCK01030445.1 LN:1551 @SQ SN:AYCK01030446.1 LN:1550 @SQ SN:AYCK01030447.1 LN:1548 @SQ SN:AYCK01030448.1 LN:1546 @SQ SN:AYCK01030449.1 LN:1546 @SQ SN:AYCK01030450.1 LN:1544 @SQ SN:AYCK01030451.1 LN:1543 @SQ SN:AYCK01030452.1 LN:1542 @SQ SN:AYCK01030453.1 LN:1541 @SQ SN:AYCK01030454.1 LN:1540 @SQ SN:AYCK01030455.1 LN:1539 @SQ SN:AYCK01030456.1 LN:1539 @SQ SN:AYCK01030457.1 LN:1537 @SQ SN:AYCK01030458.1 LN:1536 @SQ SN:AYCK01030459.1 LN:1535 @SQ SN:AYCK01030460.1 LN:1535 @SQ SN:AYCK01030461.1 LN:1534 @SQ SN:AYCK01030462.1 LN:1534 @SQ SN:AYCK01030463.1 LN:1533 @SQ SN:AYCK01030464.1 LN:1530 @SQ SN:AYCK01030465.1 LN:1527 @SQ SN:AYCK01030466.1 LN:1527 @SQ SN:AYCK01030467.1 LN:1526 @SQ SN:AYCK01030468.1 LN:1523 @SQ SN:AYCK01030469.1 LN:1522 @SQ SN:AYCK01030470.1 LN:1517 @SQ SN:AYCK01030471.1 LN:1516 @SQ SN:AYCK01030472.1 LN:1516 @SQ SN:AYCK01030473.1 LN:1515 @SQ SN:AYCK01030474.1 LN:1514 @SQ SN:AYCK01030475.1 LN:1514 @SQ SN:AYCK01030476.1 LN:1512 @SQ SN:AYCK01030477.1 LN:1511 @SQ SN:AYCK01030478.1 LN:1509 @SQ SN:AYCK01030479.1 LN:1507 @SQ SN:AYCK01030480.1 LN:1507 @SQ SN:AYCK01030481.1 LN:1505 @SQ SN:AYCK01029071.1 LN:1503 @SQ SN:AYCK01030482.1 LN:1503 @SQ SN:AYCK01030483.1 LN:1503 @SQ SN:AYCK01030484.1 LN:1502 @SQ SN:AYCK01030485.1 LN:1502 @SQ SN:AYCK01030486.1 LN:1501 @SQ SN:AYCK01029074.1 LN:1500 @SQ SN:AYCK01030487.1 LN:1498 @SQ SN:AYCK01030488.1 LN:1497 @SQ SN:AYCK01030489.1 LN:1494 @SQ SN:AYCK01030490.1 LN:1494 @SQ SN:AYCK01030491.1 LN:1493 @SQ SN:AYCK01030492.1 LN:1493 @SQ SN:AYCK01030493.1 LN:1492 @SQ SN:AYCK01030494.1 LN:1491 @SQ SN:AYCK01030495.1 LN:1491 @SQ SN:AYCK01030496.1 LN:1489 @SQ SN:AYCK01030497.1 LN:1488 @SQ SN:AYCK01030498.1 LN:1488 @SQ SN:AYCK01029075.1 LN:1487 @SQ SN:AYCK01030499.1 LN:1487 @SQ SN:AYCK01029076.1 LN:1486 @SQ SN:AYCK01030500.1 LN:1486 @SQ SN:AYCK01030501.1 LN:1483 @SQ SN:AYCK01030502.1 LN:1481 @SQ SN:AYCK01030503.1 LN:1479 @SQ SN:AYCK01030504.1 LN:1478 @SQ SN:AYCK01030505.1 LN:1478 @SQ SN:AYCK01030506.1 LN:1478 @SQ SN:AYCK01030507.1 LN:1474 @SQ SN:AYCK01030508.1 LN:1473 @SQ SN:AYCK01030509.1 LN:1473 @SQ SN:AYCK01030510.1 LN:1472 @SQ SN:AYCK01030511.1 LN:1471 @SQ SN:AYCK01030512.1 LN:1468 @SQ SN:AYCK01030513.1 LN:1467 @SQ SN:AYCK01030514.1 LN:1467 @SQ SN:AYCK01030515.1 LN:1464 @SQ SN:AYCK01030516.1 LN:1463 @SQ SN:AYCK01030517.1 LN:1461 @SQ SN:AYCK01030518.1 LN:1460 @SQ SN:AYCK01030519.1 LN:1458 @SQ SN:AYCK01030520.1 LN:1457 @SQ SN:AYCK01030521.1 LN:1456 @SQ SN:AYCK01030522.1 LN:1456 @SQ SN:AYCK01030523.1 LN:1456 @SQ SN:AYCK01030524.1 LN:1455 @SQ SN:AYCK01030525.1 LN:1454 @SQ SN:AYCK01030526.1 LN:1453 @SQ SN:AYCK01030527.1 LN:1453 @SQ SN:AYCK01029079.1 LN:1451 @SQ SN:AYCK01030528.1 LN:1448 @SQ SN:AYCK01030529.1 LN:1446 @SQ SN:AYCK01030530.1 LN:1445 @SQ SN:AYCK01029080.1 LN:1444 @SQ SN:AYCK01030531.1 LN:1443 @SQ SN:AYCK01030532.1 LN:1441 @SQ SN:AYCK01030533.1 LN:1440 @SQ SN:AYCK01030534.1 LN:1438 @SQ SN:AYCK01030535.1 LN:1438 @SQ SN:AYCK01030536.1 LN:1437 @SQ SN:AYCK01030537.1 LN:1436 @SQ SN:AYCK01030538.1 LN:1435 @SQ SN:AYCK01030539.1 LN:1434 @SQ SN:AYCK01030540.1 LN:1434 @SQ SN:AYCK01030541.1 LN:1433 @SQ SN:AYCK01029083.1 LN:1432 @SQ SN:AYCK01030542.1 LN:1431 @SQ SN:AYCK01030543.1 LN:1430 @SQ SN:AYCK01030544.1 LN:1430 @SQ SN:AYCK01029084.1 LN:1428 @SQ SN:AYCK01030545.1 LN:1428 @SQ SN:AYCK01030546.1 LN:1428 @SQ SN:AYCK01030547.1 LN:1428 @SQ SN:AYCK01029085.1 LN:1426 @SQ SN:AYCK01030548.1 LN:1425 @SQ SN:AYCK01030549.1 LN:1425 @SQ SN:AYCK01029088.1 LN:1424 @SQ SN:AYCK01030550.1 LN:1423 @SQ SN:AYCK01030551.1 LN:1421 @SQ SN:AYCK01030552.1 LN:1421 @SQ SN:AYCK01030553.1 LN:1421 @SQ SN:AYCK01030554.1 LN:1420 @SQ SN:AYCK01029091.1 LN:1419 @SQ SN:AYCK01030555.1 LN:1419 @SQ SN:AYCK01030556.1 LN:1418 @SQ SN:AYCK01030557.1 LN:1418 @SQ SN:AYCK01029092.1 LN:1417 @SQ SN:AYCK01030558.1 LN:1416 @SQ SN:AYCK01030559.1 LN:1416 @SQ SN:AYCK01030560.1 LN:1414 @SQ SN:AYCK01030561.1 LN:1413 @SQ SN:AYCK01030562.1 LN:1413 @SQ SN:AYCK01029061.1 LN:1412 @SQ SN:AYCK01030563.1 LN:1412 @SQ SN:AYCK01030564.1 LN:1409 @SQ SN:AYCK01030565.1 LN:1407 @SQ SN:AYCK01030566.1 LN:1406 @SQ SN:AYCK01030567.1 LN:1405 @SQ SN:AYCK01030568.1 LN:1405 @SQ SN:AYCK01030569.1 LN:1404 @SQ SN:AYCK01030570.1 LN:1403 @SQ SN:AYCK01030571.1 LN:1402 @SQ SN:AYCK01030572.1 LN:1400 @SQ SN:AYCK01030573.1 LN:1399 @SQ SN:AYCK01030574.1 LN:1399 @SQ SN:AYCK01029095.1 LN:1398 @SQ SN:AYCK01030575.1 LN:1398 @SQ SN:AYCK01030576.1 LN:1398 @SQ SN:AYCK01030577.1 LN:1398 @SQ SN:AYCK01030578.1 LN:1397 @SQ SN:AYCK01030579.1 LN:1395 @SQ SN:AYCK01030580.1 LN:1395 @SQ SN:AYCK01030581.1 LN:1395 @SQ SN:AYCK01030582.1 LN:1394 @SQ SN:AYCK01030583.1 LN:1393 @SQ SN:AYCK01030584.1 LN:1393 @SQ SN:AYCK01030585.1 LN:1393 @SQ SN:AYCK01030586.1 LN:1391 @SQ SN:AYCK01030587.1 LN:1390 @SQ SN:AYCK01029096.1 LN:1388 @SQ SN:AYCK01030588.1 LN:1388 @SQ SN:AYCK01030589.1 LN:1387 @SQ SN:AYCK01030590.1 LN:1383 @SQ SN:AYCK01030591.1 LN:1383 @SQ SN:AYCK01030592.1 LN:1380 @SQ SN:AYCK01030593.1 LN:1378 @SQ SN:AYCK01030594.1 LN:1378 @SQ SN:AYCK01030595.1 LN:1375 @SQ SN:AYCK01030596.1 LN:1373 @SQ SN:AYCK01030597.1 LN:1373 @SQ SN:AYCK01030598.1 LN:1372 @SQ SN:AYCK01029097.1 LN:1371 @SQ SN:AYCK01029098.1 LN:1369 @SQ SN:AYCK01030599.1 LN:1368 @SQ SN:AYCK01029099.1 LN:1367 @SQ SN:AYCK01030600.1 LN:1367 @SQ SN:AYCK01030601.1 LN:1367 @SQ SN:AYCK01030602.1 LN:1366 @SQ SN:AYCK01030603.1 LN:1363 @SQ SN:AYCK01030604.1 LN:1361 @SQ SN:AYCK01030605.1 LN:1361 @SQ SN:AYCK01030606.1 LN:1359 @SQ SN:AYCK01030607.1 LN:1359 @SQ SN:AYCK01030608.1 LN:1358 @SQ SN:AYCK01030609.1 LN:1357 @SQ SN:AYCK01030610.1 LN:1356 @SQ SN:AYCK01029102.1 LN:1355 @SQ SN:AYCK01030611.1 LN:1354 @SQ SN:AYCK01030612.1 LN:1354 @SQ SN:AYCK01029103.1 LN:1353 @SQ SN:AYCK01030613.1 LN:1352 @SQ SN:AYCK01030614.1 LN:1352 @SQ SN:AYCK01030615.1 LN:1351 @SQ SN:AYCK01029104.1 LN:1350 @SQ SN:AYCK01030616.1 LN:1350 @SQ SN:AYCK01030617.1 LN:1350 @SQ SN:AYCK01030618.1 LN:1349 @SQ SN:AYCK01030619.1 LN:1349 @SQ SN:AYCK01030620.1 LN:1348 @SQ SN:AYCK01029105.1 LN:1347 @SQ SN:AYCK01030621.1 LN:1347 @SQ SN:AYCK01030622.1 LN:1346 @SQ SN:AYCK01030623.1 LN:1344 @SQ SN:AYCK01029106.1 LN:1343 @SQ SN:AYCK01030624.1 LN:1343 @SQ SN:AYCK01030625.1 LN:1341 @SQ SN:AYCK01030626.1 LN:1340 @SQ SN:AYCK01030627.1 LN:1339 @SQ SN:AYCK01030628.1 LN:1338 @SQ SN:AYCK01030629.1 LN:1338 @SQ SN:AYCK01030630.1 LN:1338 @SQ SN:AYCK01030631.1 LN:1338 @SQ SN:AYCK01030632.1 LN:1337 @SQ SN:AYCK01030633.1 LN:1337 @SQ SN:AYCK01030634.1 LN:1337 @SQ SN:AYCK01030635.1 LN:1337 @SQ SN:AYCK01030636.1 LN:1337 @SQ SN:AYCK01030637.1 LN:1336 @SQ SN:AYCK01030638.1 LN:1333 @SQ SN:AYCK01030639.1 LN:1333 @SQ SN:AYCK01030640.1 LN:1332 @SQ SN:AYCK01030641.1 LN:1332 @SQ SN:AYCK01030642.1 LN:1332 @SQ SN:AYCK01030643.1 LN:1329 @SQ SN:AYCK01030644.1 LN:1329 @SQ SN:AYCK01030645.1 LN:1327 @SQ SN:AYCK01030646.1 LN:1327 @SQ SN:AYCK01029109.1 LN:1326 @SQ SN:AYCK01030647.1 LN:1326 @SQ SN:AYCK01030648.1 LN:1325 @SQ SN:AYCK01030649.1 LN:1325 @SQ SN:AYCK01030650.1 LN:1324 @SQ SN:AYCK01030651.1 LN:1323 @SQ SN:AYCK01030652.1 LN:1323 @SQ SN:AYCK01029110.1 LN:1321 @SQ SN:AYCK01030653.1 LN:1320 @SQ SN:AYCK01029113.1 LN:1319 @SQ SN:AYCK01029114.1 LN:1317 @SQ SN:AYCK01030654.1 LN:1317 @SQ SN:AYCK01030655.1 LN:1317 @SQ SN:AYCK01029115.1 LN:1316 @SQ SN:AYCK01030656.1 LN:1316 @SQ SN:AYCK01030657.1 LN:1316 @SQ SN:AYCK01030658.1 LN:1316 @SQ SN:AYCK01030659.1 LN:1315 @SQ SN:AYCK01030660.1 LN:1315 @SQ SN:AYCK01030661.1 LN:1315 @SQ SN:AYCK01030662.1 LN:1312 @SQ SN:AYCK01030663.1 LN:1312 @SQ SN:AYCK01030664.1 LN:1312 @SQ SN:AYCK01030665.1 LN:1312 @SQ SN:AYCK01030666.1 LN:1310 @SQ SN:AYCK01030667.1 LN:1305 @SQ SN:AYCK01030668.1 LN:1305 @SQ SN:AYCK01030669.1 LN:1305 @SQ SN:AYCK01030670.1 LN:1305 @SQ SN:AYCK01030671.1 LN:1304 @SQ SN:AYCK01030672.1 LN:1304 @SQ SN:AYCK01030673.1 LN:1303 @SQ SN:AYCK01030674.1 LN:1303 @SQ SN:AYCK01030675.1 LN:1303 @SQ SN:AYCK01030676.1 LN:1302 @SQ SN:AYCK01030677.1 LN:1302 @SQ SN:AYCK01030678.1 LN:1301 @SQ SN:AYCK01029118.1 LN:1300 @SQ SN:AYCK01030679.1 LN:1300 @SQ SN:AYCK01030680.1 LN:1299 @SQ SN:AYCK01030681.1 LN:1298 @SQ SN:AYCK01030682.1 LN:1296 @SQ SN:AYCK01030683.1 LN:1295 @SQ SN:AYCK01030684.1 LN:1294 @SQ SN:AYCK01030685.1 LN:1293 @SQ SN:AYCK01030686.1 LN:1292 @SQ SN:AYCK01029123.1 LN:1291 @SQ SN:AYCK01030687.1 LN:1291 @SQ SN:AYCK01030688.1 LN:1291 @SQ SN:AYCK01030689.1 LN:1291 @SQ SN:AYCK01029124.1 LN:1290 @SQ SN:AYCK01030690.1 LN:1289 @SQ SN:AYCK01030691.1 LN:1289 @SQ SN:AYCK01030692.1 LN:1288 @SQ SN:AYCK01030693.1 LN:1286 @SQ SN:AYCK01030694.1 LN:1286 @SQ SN:AYCK01029125.1 LN:1285 @SQ SN:AYCK01030695.1 LN:1285 @SQ SN:AYCK01030696.1 LN:1285 @SQ SN:AYCK01029126.1 LN:1284 @SQ SN:AYCK01030697.1 LN:1283 @SQ SN:AYCK01029127.1 LN:1282 @SQ SN:AYCK01030698.1 LN:1282 @SQ SN:AYCK01030699.1 LN:1282 @SQ SN:AYCK01029128.1 LN:1281 @SQ SN:AYCK01029131.1 LN:1281 @SQ SN:AYCK01030700.1 LN:1281 @SQ SN:AYCK01030701.1 LN:1281 @SQ SN:AYCK01030702.1 LN:1280 @SQ SN:AYCK01030703.1 LN:1278 @SQ SN:AYCK01030704.1 LN:1278 @SQ SN:AYCK01030705.1 LN:1276 @SQ SN:AYCK01030706.1 LN:1275 @SQ SN:AYCK01030707.1 LN:1274 @SQ SN:AYCK01030708.1 LN:1273 @SQ SN:AYCK01030709.1 LN:1273 @SQ SN:AYCK01030710.1 LN:1271 @SQ SN:AYCK01029132.1 LN:1268 @SQ SN:AYCK01030711.1 LN:1268 @SQ SN:AYCK01030712.1 LN:1268 @SQ SN:AYCK01030713.1 LN:1266 @SQ SN:AYCK01030714.1 LN:1266 @SQ SN:AYCK01030715.1 LN:1266 @SQ SN:AYCK01030716.1 LN:1264 @SQ SN:AYCK01030717.1 LN:1263 @SQ SN:AYCK01030718.1 LN:1263 @SQ SN:AYCK01030719.1 LN:1263 @SQ SN:AYCK01030720.1 LN:1263 @SQ SN:AYCK01030721.1 LN:1262 @SQ SN:AYCK01030722.1 LN:1262 @SQ SN:AYCK01030723.1 LN:1261 @SQ SN:AYCK01030724.1 LN:1261 @SQ SN:AYCK01030725.1 LN:1260 @SQ SN:AYCK01030726.1 LN:1260 @SQ SN:AYCK01030727.1 LN:1260 @SQ SN:AYCK01029133.1 LN:1257 @SQ SN:AYCK01030728.1 LN:1257 @SQ SN:AYCK01030729.1 LN:1257 @SQ SN:AYCK01030730.1 LN:1257 @SQ SN:AYCK01030731.1 LN:1257 @SQ SN:AYCK01030732.1 LN:1257 @SQ SN:AYCK01030733.1 LN:1257 @SQ SN:AYCK01029136.1 LN:1255 @SQ SN:AYCK01030734.1 LN:1253 @SQ SN:AYCK01030735.1 LN:1253 @SQ SN:AYCK01030736.1 LN:1252 @SQ SN:AYCK01030737.1 LN:1252 @SQ SN:AYCK01030738.1 LN:1252 @SQ SN:AYCK01030739.1 LN:1250 @SQ SN:AYCK01030740.1 LN:1250 @SQ SN:AYCK01030741.1 LN:1249 @SQ SN:AYCK01030742.1 LN:1249 @SQ SN:AYCK01030743.1 LN:1248 @SQ SN:AYCK01029137.1 LN:1247 @SQ SN:AYCK01030744.1 LN:1246 @SQ SN:AYCK01029138.1 LN:1245 @SQ SN:AYCK01030745.1 LN:1245 @SQ SN:AYCK01030746.1 LN:1244 @SQ SN:AYCK01030747.1 LN:1244 @SQ SN:AYCK01030748.1 LN:1243 @SQ SN:AYCK01029140.1 LN:1240 @SQ SN:AYCK01030749.1 LN:1240 @SQ SN:AYCK01030750.1 LN:1239 @SQ SN:AYCK01030751.1 LN:1238 @SQ SN:AYCK01030752.1 LN:1237 @SQ SN:AYCK01030753.1 LN:1236 @SQ SN:AYCK01029143.1 LN:1235 @SQ SN:AYCK01029144.1 LN:1235 @SQ SN:AYCK01030754.1 LN:1234 @SQ SN:AYCK01030755.1 LN:1234 @SQ SN:AYCK01030756.1 LN:1233 @SQ SN:AYCK01030757.1 LN:1233 @SQ SN:AYCK01030758.1 LN:1232 @SQ SN:AYCK01030759.1 LN:1232 @SQ SN:AYCK01030760.1 LN:1231 @SQ SN:AYCK01029147.1 LN:1230 @SQ SN:AYCK01030761.1 LN:1230 @SQ SN:AYCK01029148.1 LN:1228 @SQ SN:AYCK01030762.1 LN:1228 @SQ SN:AYCK01030763.1 LN:1228 @SQ SN:AYCK01030764.1 LN:1227 @SQ SN:AYCK01030765.1 LN:1226 @SQ SN:AYCK01030766.1 LN:1225 @SQ SN:AYCK01029149.1 LN:1222 @SQ SN:AYCK01030767.1 LN:1222 @SQ SN:AYCK01030768.1 LN:1221 @SQ SN:AYCK01029150.1 LN:1220 @SQ SN:AYCK01030769.1 LN:1220 @SQ SN:AYCK01029151.1 LN:1219 @SQ SN:AYCK01030770.1 LN:1219 @SQ SN:AYCK01030771.1 LN:1219 @SQ SN:AYCK01030772.1 LN:1219 @SQ SN:AYCK01030773.1 LN:1218 @SQ SN:AYCK01030774.1 LN:1217 @SQ SN:AYCK01030775.1 LN:1215 @SQ SN:AYCK01030776.1 LN:1214 @SQ SN:AYCK01030777.1 LN:1214 @SQ SN:AYCK01030778.1 LN:1213 @SQ SN:AYCK01029154.1 LN:1212 @SQ SN:AYCK01029155.1 LN:1211 @SQ SN:AYCK01030779.1 LN:1211 @SQ SN:AYCK01030780.1 LN:1210 @SQ SN:AYCK01030781.1 LN:1208 @SQ SN:AYCK01030782.1 LN:1208 @SQ SN:AYCK01030783.1 LN:1207 @SQ SN:AYCK01030784.1 LN:1206 @SQ SN:AYCK01030785.1 LN:1205 @SQ SN:AYCK01030786.1 LN:1205 @SQ SN:AYCK01030787.1 LN:1204 @SQ SN:AYCK01030788.1 LN:1204 @SQ SN:AYCK01030789.1 LN:1203 @SQ SN:AYCK01030790.1 LN:1203 @SQ SN:AYCK01030791.1 LN:1203 @SQ SN:AYCK01029156.1 LN:1202 @SQ SN:AYCK01030792.1 LN:1202 @SQ SN:AYCK01030793.1 LN:1199 @SQ SN:AYCK01030794.1 LN:1197 @SQ SN:AYCK01030795.1 LN:1196 @SQ SN:AYCK01030796.1 LN:1196 @SQ SN:AYCK01030797.1 LN:1195 @SQ SN:AYCK01030798.1 LN:1195 @SQ SN:AYCK01030799.1 LN:1193 @SQ SN:AYCK01030800.1 LN:1192 @SQ SN:AYCK01030801.1 LN:1192 @SQ SN:AYCK01029157.1 LN:1191 @SQ SN:AYCK01030802.1 LN:1191 @SQ SN:AYCK01030803.1 LN:1190 @SQ SN:AYCK01030804.1 LN:1188 @SQ SN:AYCK01030805.1 LN:1188 @SQ SN:AYCK01030806.1 LN:1188 @SQ SN:AYCK01030807.1 LN:1188 @SQ SN:AYCK01030808.1 LN:1187 @SQ SN:AYCK01030809.1 LN:1187 @SQ SN:AYCK01029158.1 LN:1186 @SQ SN:AYCK01029159.1 LN:1186 @SQ SN:AYCK01030810.1 LN:1185 @SQ SN:AYCK01030811.1 LN:1185 @SQ SN:AYCK01030812.1 LN:1185 @SQ SN:AYCK01030813.1 LN:1184 @SQ SN:AYCK01029160.1 LN:1183 @SQ SN:AYCK01030814.1 LN:1183 @SQ SN:AYCK01030815.1 LN:1181 @SQ SN:AYCK01030816.1 LN:1181 @SQ SN:AYCK01030817.1 LN:1180 @SQ SN:AYCK01030818.1 LN:1180 @SQ SN:AYCK01030819.1 LN:1178 @SQ SN:AYCK01030820.1 LN:1178 @SQ SN:AYCK01030821.1 LN:1178 @SQ SN:AYCK01030822.1 LN:1178 @SQ SN:AYCK01030823.1 LN:1178 @SQ SN:AYCK01030824.1 LN:1177 @SQ SN:AYCK01030825.1 LN:1177 @SQ SN:AYCK01030826.1 LN:1176 @SQ SN:AYCK01030827.1 LN:1175 @SQ SN:AYCK01030828.1 LN:1174 @SQ SN:AYCK01030829.1 LN:1174 @SQ SN:AYCK01029161.1 LN:1173 @SQ SN:AYCK01030830.1 LN:1172 @SQ SN:AYCK01030831.1 LN:1172 @SQ SN:AYCK01030832.1 LN:1169 @SQ SN:AYCK01030833.1 LN:1169 @SQ SN:AYCK01030834.1 LN:1169 @SQ SN:AYCK01029162.1 LN:1168 @SQ SN:AYCK01030835.1 LN:1168 @SQ SN:AYCK01030836.1 LN:1168 @SQ SN:AYCK01029163.1 LN:1167 @SQ SN:AYCK01029164.1 LN:1167 @SQ SN:AYCK01030837.1 LN:1167 @SQ SN:AYCK01030838.1 LN:1167 @SQ SN:AYCK01030839.1 LN:1167 @SQ SN:AYCK01030840.1 LN:1167 @SQ SN:AYCK01029165.1 LN:1163 @SQ SN:AYCK01030841.1 LN:1163 @SQ SN:AYCK01030842.1 LN:1163 @SQ SN:AYCK01030843.1 LN:1162 @SQ SN:AYCK01029166.1 LN:1161 @SQ SN:AYCK01030844.1 LN:1161 @SQ SN:AYCK01030845.1 LN:1161 @SQ SN:AYCK01030846.1 LN:1160 @SQ SN:AYCK01030847.1 LN:1160 @SQ SN:AYCK01030848.1 LN:1160 @SQ SN:AYCK01030849.1 LN:1160 @SQ SN:AYCK01030850.1 LN:1159 @SQ SN:AYCK01030851.1 LN:1158 @SQ SN:AYCK01030852.1 LN:1158 @SQ SN:AYCK01030853.1 LN:1157 @SQ SN:AYCK01030854.1 LN:1157 @SQ SN:AYCK01030855.1 LN:1156 @SQ SN:AYCK01030856.1 LN:1155 @SQ SN:AYCK01030857.1 LN:1155 @SQ SN:AYCK01030858.1 LN:1154 @SQ SN:AYCK01030859.1 LN:1153 @SQ SN:AYCK01029167.1 LN:1152 @SQ SN:AYCK01029168.1 LN:1150 @SQ SN:AYCK01030860.1 LN:1150 @SQ SN:AYCK01030861.1 LN:1149 @SQ SN:AYCK01030862.1 LN:1149 @SQ SN:AYCK01030863.1 LN:1148 @SQ SN:AYCK01029169.1 LN:1146 @SQ SN:AYCK01030864.1 LN:1146 @SQ SN:AYCK01030865.1 LN:1146 @SQ SN:AYCK01029170.1 LN:1145 @SQ SN:AYCK01030866.1 LN:1145 @SQ SN:AYCK01030867.1 LN:1145 @SQ SN:AYCK01029171.1 LN:1144 @SQ SN:AYCK01030868.1 LN:1144 @SQ SN:AYCK01030869.1 LN:1144 @SQ SN:AYCK01030870.1 LN:1144 @SQ SN:AYCK01030871.1 LN:1144 @SQ SN:AYCK01030872.1 LN:1143 @SQ SN:AYCK01030873.1 LN:1143 @SQ SN:AYCK01030874.1 LN:1143 @SQ SN:AYCK01030875.1 LN:1142 @SQ SN:AYCK01030876.1 LN:1142 @SQ SN:AYCK01030877.1 LN:1142 @SQ SN:AYCK01029172.1 LN:1141 @SQ SN:AYCK01029173.1 LN:1141 @SQ SN:AYCK01029174.1 LN:1140 @SQ SN:AYCK01030878.1 LN:1140 @SQ SN:AYCK01030879.1 LN:1140 @SQ SN:AYCK01029175.1 LN:1139 @SQ SN:AYCK01030880.1 LN:1139 @SQ SN:AYCK01030881.1 LN:1139 @SQ SN:AYCK01030882.1 LN:1138 @SQ SN:AYCK01030883.1 LN:1137 @SQ SN:AYCK01030884.1 LN:1136 @SQ SN:AYCK01030885.1 LN:1134 @SQ SN:AYCK01030886.1 LN:1133 @SQ SN:AYCK01030887.1 LN:1132 @SQ SN:AYCK01030888.1 LN:1132 @SQ SN:AYCK01030889.1 LN:1132 @SQ SN:AYCK01030890.1 LN:1132 @SQ SN:AYCK01030891.1 LN:1130 @SQ SN:AYCK01030892.1 LN:1130 @SQ SN:AYCK01029176.1 LN:1126 @SQ SN:AYCK01029177.1 LN:1125 @SQ SN:AYCK01030893.1 LN:1125 @SQ SN:AYCK01030894.1 LN:1125 @SQ SN:AYCK01029178.1 LN:1124 @SQ SN:AYCK01030895.1 LN:1124 @SQ SN:AYCK01030896.1 LN:1123 @SQ SN:AYCK01030897.1 LN:1123 @SQ SN:AYCK01030898.1 LN:1123 @SQ SN:AYCK01030899.1 LN:1123 @SQ SN:AYCK01029179.1 LN:1122 @SQ SN:AYCK01030900.1 LN:1122 @SQ SN:AYCK01030901.1 LN:1121 @SQ SN:AYCK01030902.1 LN:1121 @SQ SN:AYCK01030903.1 LN:1119 @SQ SN:AYCK01030904.1 LN:1119 @SQ SN:AYCK01030905.1 LN:1117 @SQ SN:AYCK01030906.1 LN:1116 @SQ SN:AYCK01030907.1 LN:1116 @SQ SN:AYCK01030908.1 LN:1116 @SQ SN:AYCK01030909.1 LN:1115 @SQ SN:AYCK01030910.1 LN:1115 @SQ SN:AYCK01029180.1 LN:1114 @SQ SN:AYCK01030911.1 LN:1114 @SQ SN:AYCK01030912.1 LN:1114 @SQ SN:AYCK01030913.1 LN:1113 @SQ SN:AYCK01030914.1 LN:1113 @SQ SN:AYCK01030915.1 LN:1112 @SQ SN:AYCK01030916.1 LN:1112 @SQ SN:AYCK01030917.1 LN:1111 @SQ SN:AYCK01030918.1 LN:1111 @SQ SN:AYCK01030919.1 LN:1111 @SQ SN:AYCK01030920.1 LN:1110 @SQ SN:AYCK01030921.1 LN:1109 @SQ SN:AYCK01030922.1 LN:1107 @SQ SN:AYCK01030923.1 LN:1106 @SQ SN:AYCK01030924.1 LN:1106 @SQ SN:AYCK01029181.1 LN:1105 @SQ SN:AYCK01030925.1 LN:1104 @SQ SN:AYCK01029182.1 LN:1103 @SQ SN:AYCK01030926.1 LN:1103 @SQ SN:AYCK01030927.1 LN:1102 @SQ SN:AYCK01030928.1 LN:1098 @SQ SN:AYCK01030929.1 LN:1095 @SQ SN:AYCK01030930.1 LN:1094 @SQ SN:AYCK01029183.1 LN:1092 @SQ SN:AYCK01029184.1 LN:1092 @SQ SN:AYCK01030931.1 LN:1092 @SQ SN:AYCK01030932.1 LN:1092 @SQ SN:AYCK01030933.1 LN:1090 @SQ SN:AYCK01030934.1 LN:1089 @SQ SN:AYCK01030935.1 LN:1086 @SQ SN:AYCK01030936.1 LN:1085 @SQ SN:AYCK01030937.1 LN:1084 @SQ SN:AYCK01030938.1 LN:1083 @SQ SN:AYCK01029185.1 LN:1082 @SQ SN:AYCK01030939.1 LN:1082 @SQ SN:AYCK01030940.1 LN:1082 @SQ SN:AYCK01030941.1 LN:1082 @SQ SN:AYCK01030942.1 LN:1081 @SQ SN:AYCK01030943.1 LN:1080 @SQ SN:AYCK01030944.1 LN:1080 @SQ SN:AYCK01030945.1 LN:1079 @SQ SN:AYCK01030946.1 LN:1079 @SQ SN:AYCK01030947.1 LN:1079 @SQ SN:AYCK01029139.1 LN:1078 @SQ SN:AYCK01029186.1 LN:1078 @SQ SN:AYCK01030948.1 LN:1078 @SQ SN:AYCK01029187.1 LN:1077 @SQ SN:AYCK01030949.1 LN:1077 @SQ SN:AYCK01030950.1 LN:1075 @SQ SN:AYCK01030951.1 LN:1074 @SQ SN:AYCK01030952.1 LN:1073 @SQ SN:AYCK01030953.1 LN:1073 @SQ SN:AYCK01030954.1 LN:1072 @SQ SN:AYCK01030955.1 LN:1072 @SQ SN:AYCK01029188.1 LN:1071 @SQ SN:AYCK01030956.1 LN:1070 @SQ SN:AYCK01030957.1 LN:1067 @SQ SN:AYCK01030958.1 LN:1067 @SQ SN:AYCK01030959.1 LN:1065 @SQ SN:AYCK01030960.1 LN:1064 @SQ SN:AYCK01030961.1 LN:1064 @SQ SN:AYCK01030962.1 LN:1064 @SQ SN:AYCK01029189.1 LN:1063 @SQ SN:AYCK01029190.1 LN:1061 @SQ SN:AYCK01029191.1 LN:1061 @SQ SN:AYCK01030963.1 LN:1061 @SQ SN:AYCK01029192.1 LN:1060 @SQ SN:AYCK01029193.1 LN:1060 @SQ SN:AYCK01030964.1 LN:1059 @SQ SN:AYCK01030965.1 LN:1058 @SQ SN:AYCK01030966.1 LN:1057 @SQ SN:AYCK01030967.1 LN:1056 @SQ SN:AYCK01029194.1 LN:1054 @SQ SN:AYCK01030968.1 LN:1053 @SQ SN:AYCK01030969.1 LN:1050 @SQ SN:AYCK01030970.1 LN:1050 @SQ SN:AYCK01030971.1 LN:1050 @SQ SN:AYCK01030972.1 LN:1048 @SQ SN:AYCK01029195.1 LN:1047 @SQ SN:AYCK01029196.1 LN:1047 @SQ SN:AYCK01030973.1 LN:1047 @SQ SN:AYCK01030974.1 LN:1046 @SQ SN:AYCK01030975.1 LN:1045 @SQ SN:AYCK01030976.1 LN:1045 @SQ SN:AYCK01030977.1 LN:1044 @SQ SN:AYCK01030978.1 LN:1040 @SQ SN:AYCK01029197.1 LN:1038 @SQ SN:AYCK01029198.1 LN:1038 @SQ SN:AYCK01030979.1 LN:1038 @SQ SN:AYCK01030980.1 LN:1038 @SQ SN:AYCK01030981.1 LN:1037 @SQ SN:AYCK01030982.1 LN:1037 @SQ SN:AYCK01030983.1 LN:1035 @SQ SN:AYCK01030984.1 LN:1035 @SQ SN:AYCK01029199.1 LN:1029 @SQ SN:AYCK01030985.1 LN:1028 @SQ SN:AYCK01029200.1 LN:1026 @SQ SN:AYCK01030986.1 LN:1024 @SQ SN:AYCK01029201.1 LN:1022 @SQ SN:AYCK01030987.1 LN:1022 @SQ SN:AYCK01030988.1 LN:1021 @SQ SN:AYCK01029202.1 LN:1016 @SQ SN:AYCK01030989.1 LN:1016 @SQ SN:AYCK01030990.1 LN:1015 @SQ SN:AYCK01030991.1 LN:1014 @SQ SN:AYCK01030992.1 LN:1014 @SQ SN:AYCK01029203.1 LN:1012 @SQ SN:AYCK01030993.1 LN:1011 @SQ SN:AYCK01030994.1 LN:1011 @SQ SN:AYCK01029204.1 LN:1010 @SQ SN:AYCK01030995.1 LN:1010 @SQ SN:AYCK01029205.1 LN:1008 @SQ SN:AYCK01030996.1 LN:1007 @SQ SN:AYCK01030997.1 LN:1007 @SQ SN:AYCK01030998.1 LN:1006 @SQ SN:AYCK01030999.1 LN:1006 @SQ SN:AYCK01031000.1 LN:1004 @SQ SN:AYCK01029206.1 LN:1002 @SQ SN:AYCK01031001.1 LN:1002 @SQ SN:AYCK01031002.1 LN:1002 @SQ SN:AYCK01031003.1 LN:1001 @SQ SN:AYCK01031004.1 LN:1001 @SQ SN:AYCK01031005.1 LN:992 @SQ SN:AYCK01031006.1 LN:992 @SQ SN:AYCK01031007.1 LN:992 @SQ SN:AYCK01031008.1 LN:990 @SQ SN:AYCK01029207.1 LN:989 @SQ SN:AYCK01031009.1 LN:987 @SQ SN:AYCK01031010.1 LN:987 @SQ SN:AYCK01031011.1 LN:986 @SQ SN:AYCK01029208.1 LN:983 @SQ SN:AYCK01031012.1 LN:983 @SQ SN:AYCK01031013.1 LN:982 @SQ SN:AYCK01031014.1 LN:980 @SQ SN:AYCK01031015.1 LN:979 @SQ SN:AYCK01031016.1 LN:976 @SQ SN:AYCK01031017.1 LN:974 @SQ SN:AYCK01031018.1 LN:973 @SQ SN:AYCK01031019.1 LN:970 @SQ SN:AYCK01029209.1 LN:968 @SQ SN:AYCK01031020.1 LN:967 @SQ SN:AYCK01031021.1 LN:967 @SQ SN:AYCK01031022.1 LN:966 @SQ SN:AYCK01029210.1 LN:965 @SQ SN:AYCK01031023.1 LN:963 @SQ SN:AYCK01029211.1 LN:959 @SQ SN:AYCK01031024.1 LN:957 @SQ SN:AYCK01031025.1 LN:948 @SQ SN:AYCK01031026.1 LN:947 @SQ SN:AYCK01029212.1 LN:940 @SQ SN:AYCK01029213.1 LN:934 @SQ SN:AYCK01031027.1 LN:932 @SQ SN:AYCK01031028.1 LN:927 @SQ SN:AYCK01029214.1 LN:925 @SQ SN:AYCK01029215.1 LN:922 @SQ SN:AYCK01031029.1 LN:919 @SQ SN:AYCK01031030.1 LN:917 @SQ SN:AYCK01029216.1 LN:914 @SQ SN:AYCK01029217.1 LN:900 @SQ SN:AYCK01029218.1 LN:890 @SQ SN:AYCK01029219.1 LN:888 @SQ SN:AYCK01029220.1 LN:864 @SQ SN:AYCK01029221.1 LN:855 @SQ SN:AYCK01029222.1 LN:827 @SQ SN:AYCK01029223.1 LN:826 @SQ SN:AYCK01031031.1 LN:823 @SQ SN:AYCK01029224.1 LN:812 @SQ SN:AYCK01029225.1 LN:811 @SQ SN:AYCK01029228.1 LN:787 @SQ SN:AYCK01029229.1 LN:776 @SQ SN:AYCK01029230.1 LN:774 @SQ SN:AYCK01029231.1 LN:773 @SQ SN:AYCK01029232.1 LN:773 @SQ SN:AYCK01029233.1 LN:768 @SQ SN:AYCK01029234.1 LN:760 @SQ SN:AYCK01029235.1 LN:758 @SQ SN:AYCK01029236.1 LN:756 @SQ SN:AYCK01031032.1 LN:737 @SQ SN:AYCK01029237.1 LN:723 @SQ SN:AYCK01031033.1 LN:719 @SQ SN:AYCK01029238.1 LN:714 @SQ SN:AYCK01029239.1 LN:712 @SQ SN:AYCK01029240.1 LN:709 @SQ SN:AYCK01029241.1 LN:698 @SQ SN:AYCK01031034.1 LN:677 @SQ SN:AYCK01029244.1 LN:634 @SQ SN:AYCK01029245.1 LN:621 @SQ SN:AYCK01031035.1 LN:614 @SQ SN:AYCK01031036.1 LN:608 @SQ SN:AYCK01029246.1 LN:604 @SQ SN:AYCK01029247.1 LN:595 @SQ SN:AYCK01029248.1 LN:592 @SQ SN:AYCK01029249.1 LN:586 @SQ SN:AYCK01029250.1 LN:578 @SQ SN:AYCK01029251.1 LN:563 @SQ SN:AYCK01029252.1 LN:559 @SQ SN:AYCK01031037.1 LN:556 @SQ SN:AYCK01029253.1 LN:553 @SQ SN:AYCK01031038.1 LN:550 @SQ SN:AYCK01029254.1 LN:545 @SQ SN:AYCK01029255.1 LN:545 @SQ SN:AYCK01031039.1 LN:541 @SQ SN:AYCK01029256.1 LN:532 @SQ SN:AYCK01029257.1 LN:500 @SQ SN:AYCK01031040.1 LN:499 @SQ SN:AYCK01031041.1 LN:492 @SQ SN:AYCK01029258.1 LN:489 @SQ SN:AYCK01029259.1 LN:473 @SQ SN:AYCK01029260.1 LN:471 @SQ SN:AYCK01031042.1 LN:466 @SQ SN:AYCK01029261.1 LN:461 @SQ SN:AYCK01029262.1 LN:456 @SQ SN:AYCK01031043.1 LN:456 @SQ SN:AYCK01029263.1 LN:439 @SQ SN:AYCK01029264.1 LN:435 @SQ SN:AYCK01031044.1 LN:417 @SQ SN:AYCK01029265.1 LN:397 @SQ SN:AYCK01031045.1 LN:388 @SQ SN:AYCK01031046.1 LN:387 @SQ SN:AYCK01031047.1 LN:384 @SQ SN:AYCK01031048.1 LN:379 @SQ SN:AYCK01029266.1 LN:377 @SQ SN:AYCK01029267.1 LN:366 @SQ SN:AYCK01029268.1 LN:364 @SQ SN:AYCK01029269.1 LN:361 @SQ SN:AYCK01031049.1 LN:356 @SQ SN:AYCK01029270.1 LN:353 @SQ SN:AYCK01029271.1 LN:353 @SQ SN:AYCK01031050.1 LN:333 @SQ SN:AYCK01029272.1 LN:329 @SQ SN:AYCK01029273.1 LN:324 @SQ SN:AYCK01029274.1 LN:320 @SQ SN:AYCK01029275.1 LN:316 @SQ SN:AYCK01029276.1 LN:314 @SQ SN:AYCK01029277.1 LN:309 @SQ SN:AYCK01031051.1 LN:301 @SQ SN:AYCK01031052.1 LN:301 @SQ SN:AYCK01029278.1 LN:298 @SQ SN:AYCK01029279.1 LN:295 @SQ SN:AYCK01029280.1 LN:294 @SQ SN:AYCK01031053.1 LN:293 @SQ SN:AYCK01031054.1 LN:289 @SQ SN:AYCK01029281.1 LN:277 @SQ SN:AYCK01029282.1 LN:276 @SQ SN:AYCK01031055.1 LN:269 @SQ SN:AYCK01031056.1 LN:268 @SQ SN:AYCK01029283.1 LN:267 @SQ SN:AYCK01029284.1 LN:252 @SQ SN:AYCK01031057.1 LN:245 @SQ SN:AYCK01031058.1 LN:240 @SQ SN:AYCK01029285.1 LN:233 @SQ SN:AYCK01029286.1 LN:218 @SQ SN:AYCK01029287.1 LN:202 @PG ID:bwa PN:bwa VN:0.7.10-r789 CL:/gscmnt/gc2719/halllab/src/speedseq/bin/bwa mem -t 3 -C -M -p /gscmnt/gc6149/assembly/Amazon_Molly_Speedseq_Analysis/Indexed_Reference/Poecilia_formosa.PoeFor_5.1.2.dna.nonchromosomal.fa s1M.fastq.gz @RG PL:ILLUMINA LB:"PFAF-Pfa-D55-1-Pfa-D55-1.1-lg1-lib1" ID:2895027965 SM:PFAF-Pfa-D55-1-Pfa-D55-1.1 PU:C5NKBACXX.1 @RG PL:ILLUMINA LB:"PFAF-Pfa-D55-1-Pfa-D55-1.1-lg1-lib1" ID:2895027918 SM:PFAF-Pfa-D55-1-Pfa-D55-1.1 PU:C5NKBACXX.2 @RG PL:ILLUMINA LB:"PFAF-Pfa-D55-1-Pfa-D55-1.1-lg1-lib1" ID:2895028003 SM:PFAF-Pfa-D55-1-Pfa-D55-1.1 PU:C5NKBACXX.3 2895027965.1 83 KI519620.1 2637391 60 100M = 2637138 -353 AAATATATTTGGACTGTAAATCCGAATTTTCACTTAAGAAAGCATGCTGTAACTATTTTTCATTCAGATTTTAAATTTTTAAGAGCTATTGAGATCACTA EEFDFDCCFFFFFFHHHHHIGJIIIIGGGBIGIIGJJJJJJJJJIJJIIIJIIIJJIHHFIHHGIJJJIJJJJJJIJJIJJJJJJJGHHHHHFFFFDCC@ NM:i:2 MD:Z:85G12C1 AS:i:93 XS:i:0 RG:Z:2895027965 MC:Z:100M MQ:i:60 2895027965.1 163 KI519620.1 2637138 60 100M = 2637391 353 GTTGAGTTAACTCTGAATGTTTTACAGATTCACATTTTCAAGTTACTGAACTAACCAGAAAACGCATGTGGCTTGTAAAATCAAACAGTGAATCTGTGAC CCCFFFFFHHHHHJJJJJJJJJJHIIJIIJJIJIJJJJJEHIIJJIJJIJJIJIJJJJJJJJJJJIJJFHIJJJDCCHEDBCBDFA;;6>CC;ACDCDCC NM:i:0 MD:Z:100 AS:i:100 XS:i:0 RG:Z:2895027965 MC:Z:100M MQ:i:60 2895027965.2 99 KI519750.1 1400016 60 100M = 1400283 367 NGCCACAAGTGCTCACAAAGAAATGTCAGCTGTTTATTTCGTACAGCTGGAGTCAAAGTCTAATTGGTGTGGTATTTGTAGAGACAGGTGTATTCATACA #4=DDDDDDDDDEIDEI:CEEIIIIEIIIIIEIIICFIICDDDIDEEEIICDDEEIEEDDDEEIIIIDDCDDADDDEDEEDDDDDDAA>AAADEEDEEAA NM:i:4 MD:Z:0T2A9T36G49 AS:i:86 XS:i:0 RG:Z:2895027965 MC:Z:100M MQ:i:60 2895027965.2 147 KI519750.1 1400283 60 100M = 1400016 -367 GGTGTGAAATCTGAATTTTAAAGTCAGGAACTAAATTTCTAGAAATAAAGCCATATTTTAGTACTGGATGGTAAAAACTCCCAATCTTTAAGCCATTAAA DDDEECEEEEFFFFFFDHFHHHHIJJJJJIJIJJJJJHJIJJJJIGJJJJJJJJJIJJJJJJIJJJJJIJJIJIIGEHGJJJJIGJJHGHHHFFFFFCCC NM:i:0 MD:Z:100 AS:i:100 XS:i:0 RG:Z:2895027965 MC:Z:100M MQ:i:60 BioD-0.1.0/test/data/b7_295_chunk.bam000066400000000000000000014661121273003163100170040ustar00rootroot00000000000000BCUn0w3w{I v~X6ClҮ8GN2ԉ7#fhuדIdyM30}Jz+ !3^& Ï -[ڎ{ߍ11{,|j Lg03o|>2nRC0 )& \m`Z#sSB]&OmH,|QĪ Llc"j`b AIT wpM\OIO*JH r?Q!Lx}}f0~{yR7 D>:-ƣذ8V[C FhMlk YCu"F={OD Q Pe-'݋NN/BBC1`\y&X~}S 2A: )$ f" Ȇڲ㱴EII̤,c=sffg﫺@Ȓ,itﭪ{뫿aG]^ۖR$k%˖.[q钥KW/S߲ə JN9:sEsYwZV[gjsvfm~j|]p&pΞOE:gg5vN9s&X.;gϞ=qOqEg)zvͩӧjjg=uupTk隓]wʾ" jvpԢ΢`mrήsڝS3kϜ>{zMmѢk<8Ԓ/-5V+kgypnKih+y^ͭaԨ:S:n5_TCFU{4I&aT'lNyœ,̒txRVjҋ7홷᪝'xNOu=֚M7/Mek7 i5r>5OxuL9!r5s{9sH5pwl1~D^%?GLCjOC򾗴<,SzCc_]bz/cj3ϒOm$e(b먼sM7ɫW]6)WT}B\|P ):^գ>ҿ'L/SD )>Wg r!{j3O/:,%4rPr^]aytL^ak1<-gBJ%-?FN^e7G=:zb)0yFk=>>O7GYR.ܟR+ɝ]a/FũCVXOHOasۭfM؎r9))~iߔmcl|HU1R "7GҭxJ9fKN" +a7c]O>(vӫTa0e_*krn=$WV7^wJ_l} Rԇ(rLZʶ2 w&ǤsnV|>ţb:ƓNʷ7_o6WܩT*I=ۯ[qUl%- GimZtʌ2-$Oʙ ^VuzOO5y32Wb퓾+?#?>􈞔co18F.~X?yb}KԆa}|kRg.Zvkδ֝j]qӱNfqZ H;9m;{:ڧO^[sS3ugΞ^ ֭9:][ +uy霵+6>N=u&ugN;U[g/bѺEg;v@ڼْ-\(S`k[k -4M8ΒD6\~:a ƣVȵ  oG[mKQq*GɃݎ[ &@ITI] DdN0Iq,7SxqZm3]׭/Ki{ $ʥ $o rl M<$ ~]P5/nՍ0RP'`KJ}jf z-y8$tòZ׵DT4A$m\+^2Ⱥbrա3ve̲S|Ƴؒj9;șbI2K3Dbs-HRU0^g{/X@^?X~}ڴ 0I)w_) =z]MrV-PˤаA="e7d*QɵO99Aj/uk_+t#ڠU}Z0ZrzZ:ɇW.snRsK!{)A{Um*yzG~}L2ݲncV36&V긌y[d>Kk6=uX9,zR0&*AzgwO BL1hS9Z]K,YzZR%g'^ gx.:uƖG;3?x5hZ_)^mҬ^hvu:Ad~0rvdVEYJnuza%kK,B@]W﭅5rAS8% EI˿Wv*ٶf!H5QGR@=?lYJ7Z )DX^yK ӌC\ YFg;y3$Կ[87&?YsmsY<ӖCRdeMRixH@[7[ c&/GMc'n>ܭEs}֐piX@# #s\^ysTc+1Al^Ԅ}1z6ӧ0\ ʀӬeXf57ߠ֕quJbYB }µmK,m3$ŚժcT˓HM]U7HhӼ}Hn&X'F}@a쑑5%\Lj(s=.%ѸzJJGU<_8̧Aby0>{ _3Ez m?. 'ĠZU=uْ.YdruYC jm͚5cYuZgם[ XdN-8X,_J1ͦ-X –|FL%3|4ϣ$0M>Y@$&3ym?ٸBPD<Z9Q1V'ou qGij6y'k B[$… j.jC7Z)iiАPi0lAZučf$p4mD[K~I"Y/)}W έz#lJ] G˰FAo ^![]Zz5(2|:Žн2 AA3#$ k1cy2.]J-`8h4!tsW{T)(v?/3͌ai rY.U_@5o♳]=YW}˯1Q P4 |R1i?X@盻tUQ)xcPRJ]E{fR98mi3fh(LH(k 澞Scʌ'MI}ݣ8 yOSsdӕxjy0mD JX/p}sI((ahYj,CU GlC~_cAFZW&9(utѦ%t'1N6tN[l!V}Rx~R- [Cj:cpWFm^v\';;Կ{K'u_YZ?%`T l֝B|BpHB߰^1h* *qlGC wո'*T!GI69JkMOn0:ؼӇ\QV(ݦt\mZhJ/+#g^ 3ܳ@96)5"1_2SJ~Bf {(urAKWZ s [=V՟Uu)_=Yt]Ӌ4L Jx ؟H=K0i@؅Ң0N;N ^'`1oL<^!/*l0HH'ov,fY@/\[BJqB$f65b,0&+~+AV'-eKjt]4Fݫ{IO IN!?vխFI(qFCy$dзs͊{nWy"WJʵȫ9AҔ/ &4[:TV\kpCVs˵k  .]rV-jK `{~%=AKR2@ڣ"SDQb 9Hط(eLտ(eBʨԵSjy1aJ|YٖBߠIW@O{Yb7Tcf"\!D(!X}R6Y(uO1Cfֹ6Ҕ9-O(}=(97ijV+|RJ+>8),6VK,%&܋ 0C;X-HX}7BP%Bepoͽ 6u5'u&,ΨYZVߩUrL+ӎ w (C=a5'rk`nԼzhɎ.P7-l0e<)4=&9G $gUDVVg gC>h}\A$8h(kJBu?)in1 )2+v! pX/%NB{@)zFa'I7I3T!A:J,7@D_f3JU@i/񨆏#Vu|nmzCf7-a6ĽQ^so JJ5`ϑPxp=Bח1F!mƚe C{??ivUnq)ɜG$}'ۆqwW@l?iOV:U@v#MB{A 8lUrMmGE# @|'FPH#ҳ|m44 ,|"Xe qW+~9~]R늋ϋ\{y5#,-IBD0N8kCѫ|+"G {X[(jV^ &yB--Zc ES.lYZ}إh?dX'ٿ _P@uHչ:q;Eh޴ O3MY4^R`˜ҳ;ZvHqV% nÈ1U:n Њ*DFе*8l&bzmX66̻S—nqlPn[GnRsfSx'鏈,vMdzH߬7^sD@7x'6Lg9IֳB'Hq,mi1sdQ*=vT>(kY8K ,X6t,J+Ck.ԠG+/{)@fڏ A=cV]-SO-}PWsk;5mZi-ZY+9H`3eP 9jB^\ 8yʊA"g;eq[0:FXlJ:m479MP J#Dײ/MrPj!'H' ɠKr#|%'sj"d6B֥B{'LR҅O>ZU>u*(^Z-7>yO埅\(֟h m׶[[M|8Saiga@ WϩnZJZ ڮǍR4J-a5^5iVܒp+ARrTjM|m6*O0_:Nvͭa@ͥ(6+Uz6j k+7P \M=ܲ6D Aͦ+ !=m<֓2k( rl͘\ ] =*@] JM5eH1pm7ulV9U@q-?+ߩ>ivQ.Fu,D;acՄǿ( 1 cV.trLo %/ ^0Jx-,A G0+qWc3wjw)AIr8}ϣTo}@ru[ mv+-V} Gԛ{~I踞to"`I,kB9LUCqo(7"kVqHHǵrn>_[:Ѷf2cԲK:_pFF9ɯ+Lc Lޠϫ˒lz^'BCI3^Ѝ_m.i0(5=K6Ky)-~Z5TH-KM>U>uc҇I&vhoX©ԶY1Т]2sq<(#E?=fHo?W*O?;rجVoE\IQ Bf=:vW cm]\t)E-e/>'՜WAk5?+^ƙ[+; /KVԊ`msDp LA_z0~NY=N7kii@˴E㪔f]IHRAu/וd T$gZ DDe6e9 b)UANxVi{U%jإj18R)ɫY*J ܠш@7ah*;a4#[Щ+^8m4)K$Od CR[kՕkKW׍@C iuSL^^f %²|^Rzyy !Og.7LefBCj$9l 39SYROHcQ4"ؘ=n۞|c3,]G[)#tRar!w(yEzGYV!Nxii捒{+ˇ~H)N7"G = /3#ߙV֨BR$iyϔnQFxL[XvCŜ,D ]*h=P=o|2]أy|P}a1T_]Y#XX윐Z/Œ  VJQOd#AZ8Vr˪\_e,B]X}]P)' 6?{{(]D83oԢ>JJKfB tI{p^nfvkNkTt ߧnv1j^wKvIwC 7v* }?$2|κC!hKY Ss@;j1n9Tga>U13l 5,3Xl/1[dsRkPj\@aa5' /F=|Uov0u}y}iSǸA RjNU7q#4hJi P2uzRZCyji_A _kJRsujpe3[K͓<WЇ2OIH׻1z+r]C/߱)\FZ]OV21քmkr퀠~Y{|#-H6z(? So{wFP0g L4IWpʒՇ4mPV]NlC(!+a.mxo Í` V7|:?[٤צvT@0(Q iN|$ -hu @+ЃTH|Fyf$L HC>FА]u}7oTrA'ƈVml&viN BJmd*%g(Ic 3[F_pK!M+'k8RQSKKLc 5yb'o(CNSE~v4t_nJj{;jGЭW7t==k?rh11ӾhA5ni_ ML -Y|-PNxF< kjΖ7X3m*L+Vv#܋,KJ g U> MtZ/(Dj.O2[>)U[7*6<\-:F\[? {d{Rژґ>]&n%( 3z /ޤ zM;F• Ug(PZ8fP06Ā|XThh*dgOʈp[eF@7긚-{BUfڱ_]Ij. ̝A޷>4N99?ZQ' FzmCޱ_H&}'LwU_=KL/d)Xm`(/e Zp]C:nYTqȫR >>HSjAY 9Ө^îlDBH::-_eE-o^%q3u\/q]XI E@ a7ۀZf'Pouٌ6ē )Ϸ)@2SӰdY긶Hm$$yh *#S,\XAmp+|Xk`Pc Ѳyc_&7ت%geJ:9 ~qu*2ˁYIlMꜧtɣP;ֿniw~g࠷pY )#=( <: -AuߒPȬZ"~Fhm4'ZQە HS@ \/0RnE5L*X;i wފ|5_Äp qLhm=\j 0&#=X;EVjXj[hx+ͦ}%[k"ܒK:6sd˱4@rGw\W='DPHO?ARPYDۭ~* qzCިCQei-B.NG5nC*{PaLwZR]J) }{3GYx\(bs@F6#pB>J% kfեJ:)v-qG7Qm&|y\ڻQ-}Rc t\ TA^p!]HTz uVb}y˖U=ӈ $bL>,iO*x[ϼ\Z+kR/qeqB gY1`,\؞!6eHpTv=s:Cz& i$idFDo +a0dWh@ }ּͯ#igiȨEu j0E\ TH\KSxuX"(m$ЋHG7\sp5a|:K~}6鳿%GF*-6 XU\ݸTB*uΑ퐨7Is~҅It.Z5ګg΃VW/:+/VU k('nj?n'C5bC_¨iLuwQ 6Z5v]?u`8 I#Y(@Pٸ8)]QraҕhV5ߍ.< CmϗRT#b/FG bK=h *~xg>I Vum-9IejҪS&幱-)\U{}7k ;m{'R"5n%:B Qdع k3*Mƣ=F69GMhꚷ!0ET,!¾׀I@]?Wh?Ws`뵘 -ۯٔ/S%ZyCbpϒGs K]evEPpP|Pm?-lIS[ #Vڣ[C+pi=߶ P PQ |ܼ#7pOvO OtNv[bߥ`oͅt?09an#o?!1[aqRҵ.+`Q#e7[5EnEϓЯZtu>ֈ-f;za߫]ϔ_5hry2 ?=?EЉJ+ȯy/ܛz9 )u>zk/P ه(|'gF{!K zFR]'|JZ4zB0Nd/ gչ+.[l UWj{aVaL) Q!}3!64IZN1|J @8{7io*_}ϑU:E G(Th\oَa@CQ$r[\_SF(`8_-N ,-,ͽqWW%1hU_OC=7-7U`VZ+b oPWSZW:'ۜNZtf4BҀfUS(B$^bҦ0ejȰ2~1ÐPHd|ۤv36&8^Q .9 wJ'ǟgN49(}YZgm{0\ }:-t?jzvpS}]?Hw>nSZ­V{: {K#$W o/pPk:j`TOI1IyWLH,Xxr^cJҙBʣ[;(6>)_i/߼QVo^+Ukojk\t#ꕠ&l[ws)N<_e* ?T+vF2k7Ӱ]q6eiRs٤V3;:ԫ"/3* QQ7f,bt"j&ȑl3 GbL} b_J8TCܢʴy @ WdzyUjRRXQoJ˥E] Je 7 XzP)TeULt Ruڸ? *c7b=J~@H.PÖn}̷IU^^#yVA_ԝ?G.a~6$`݄T5az+˨ځQ>"2;=sI;Rp8DJ!KXwm#wɒ 'dҏoIP= d uan?4Sʨ5L>nhS}Ph̺cʨ($`_gJ 0_E?Jϧ:<$ω'MrI:N:]Uɱt7`ECCZ[Y]`g [uKqQt-ju=rF(v!8YF.bD#MPY.H9 =tH}X}Ns{!]H?ZzNUhlXի#U4CS|v^q,9[YRmH4!=`1( 70mzL]?@51*HB'UF͚_8@gRSw3hDIrUq(֎A,p<7OsAІ'@кn%J,UƐg c}ǡJАkıAUp^֫i  l00wPI|QK0ְO<)o6{csFƉ"0_$hhR7QCqE=ff_nYcp Vz%;gh z'wЄn8ISAݴtúV50Ӭ9KʵqECC|<o'Vi|(w$aZ#cR^ۺ}ĺ L [d{ԭңS 7ׇ#J;е/?f-e &x&nZyVܿRb3 ܍jk!U(BĊCRCDbJz#/tX>z!֝ơV/Q-x\5k>Z cXKE< ԥ'zj,CRWxgc%׻-o fk/#PeU_Rz{VȽQήh9նYquS^!v-F\1[1S8fD4cެ {k 'oy=)iEe;J'ekи! 9tnFҿE:DlyH_| 厜z/- Q)zk]g#^Ɲ7擇eMk/ -t]XKW\V{Z~1~˚ժkr5ߏ4$ypNQ4n&9ApƠ'ir}8JZKu\Frн@d'6 S C\ ΤU6hP- WR P& Qmơjd1Wi]V⋲NGvAbByB5`Vf[`m J@tANgqi6ŋ ^xYlxBw*SqbJRVږlt# -̸0 M)p50A8hh;3t`\=ٽ{J@x CS}h>-PqEYFHv yL=-^L)K 9ҧ$=c7 E%cod^ujKRWo G$ & W̦pҺ _4:uEK.f3 ՅgGeF2Z x` \:];r/@/<)J`)X?ä(zQO ؤuwZwu鍂:(ݲpSKi>M=Iz`߮}–p:j^\s {(SWHop%V>d;x_`OBçeW= j?G}G-֮ 1m S,zشtB1=v7A`zOuipRoh+p >mVFtVc[Y<)eVj?d%2J5ޭȬՄgC{3b@h9M)jH~I^j|3-?@@Qك7S_oIˊ҅t!H 8}+Z*+WVl䫚ج$9~?4L}B-)ƸՄL`K#^ŋcx^n{:PSexҟj'\o3U3ʹި. jkAgA BM/ZjqPQi/׽ď׳!$6g M[Qv52:RGPjaa%͌@]/APGQy%7 c؊AUPxdn'IFYnZSjpFښW2&:8 x3 ]TqLrxrV+mBz|?0J=&S6 rc)[~lemzyN*L_uhIFr1INc.3"s@BTmUeu{P7ꡌOÁ6Hҁco;-~L)ӯ 55ajOL-,vȄ=T)nR__I%h_eTzcJwSzѡi01Ji9Cv+^Uq|`uV* AF~=s˟OaksggK-9W[ _vI-c/I*Y5{Y-zcQiʭ{ >aՐzH&f,Z@Ix {:=CU%Q16x-)i;P>Lʸ۟Vcy|s55{mYmpb}rGTC۫.So"#ZMlq}c79ì|ƾ3)*s`(evx.Wϋ{;Ո4 }O!,gG}0{!]H?^RH>uK `ŗ9W?G"jgf%~ [O"^V{ݢ0o'vڂ#ň*3IlI\@:; Ԇg'vZaC2Vy;SF!plA'HkwSdںHtC,lv? dI-x,sA.RD+T ŋ;4 V*o~ JЉ#aC2@m~6 Oe/ZT.TJUwk VE&Ca1 Ѽ[vK)XfUŨ+1*f0OfTg+Z-X0KȹE\n0*$n3yf 09fJ#уN 4@^s/nߔ8A;%nf9Q:A3nG{8en1*R1(O tm:U{6%ΖXrvƻw]h$E?#@:zT٥LфK ~-5 @o::_g}c;-4ګ-Q?|Ԩiҝ?S)5Ш13+céGoFR/5·BԵSJܦ wRIi3ϛpڲ_QK{*t w8}巈µ {tR.ĴBp-oy6O+2NT VQ}W.Iڶ"pr2&UrkZ4eO>Fr.F5rdRX]D-1&W1U{uLrWî.WaW-VoWSUmσ6]e ?7p0^4AZiaSM2j(0ΊP@ L0hz1Wu´ sPZ6cDpiT%Vխ6IjR|$0tKy4bE.uqt*NT=; jP0"R&Jf%MEHW 5LSG9-ܲ%!ٵ:j 4C-i+@^rKgG_ };v>j$_X de)Izڏ<0cxo:wL4 Y*GI[#m*J=f{U#^4(3e΂SGe^ yD1u:Pv3ak3BecdQ-4}̀upԀrI:7UJɣe%ڑiO[{N.~czTo4fYY>,af|J۰=JtfS 1qjߥV14, 2#ҶeĖ6KcNv]gJ?p3WPE~(hh5~]Z Zsp <Ƃܪ(FizA=OB!&C{iMA$6IiRETl#,c -eҬД^B(ywU^7SUlIކ;#,kRJD;QRo4.%se}PN`XZouB j+귭ޮ4V6VJ4wK;gD Z;Uz}wjrTQT`{/%vp/ͩ u1WN6 ~0Ȑ ; c)T0_=>uz!]H?^Z_8gWGK/.YBeV9Yrgu'؏$yZ *zzRǎsqQnQ?I<^QZʵ "Wuk@pQS jQgQyű'߀D߆l n؞{pJzUk^6,q:Tm&AFQ(39#Gk:$`։fu$a_J$Nj# zHs7=EݮͰl(١*'MWjBhTF7(,I$n6\w*acϳv }Z0V^zS.0]o=B숣#FXȊ&IpK" %o)Ե @1SEw_'C S^X[S7uNj|ǩn#JK:?™f 8iGasR>=̭Gl6m " ]wĄb>(h|{5g֝D ڒ \;ګٟCaVsd4m7)_ ĸ r56s^<0;3YֲAxvB}GG0AJZ:!Ir7wcv_=‹ Ēi N/=pZk.,4g;~Sz3B'T#wHyy/0]7r^8)7= GΜi]jH@H! ΰ Jg;yqh nor<\VkĽQF` ;锩Ir3ulzP}\;fʘx~^iO:l|UL }{D7ϔ?ElY-ndQmqb>swp|l-Ġu5Уlt.t߹ȔAKV/dzˉLi?? ^uYP$'`EEU%g)/D,Z8MrRYq*&W9NL/Ou}f8%JȈDi) ^]׍d!\V9CI4˲f"?\;Hu@" 6 LfֈxF"w˵[y;mAR .Y:vf- =yE<,J\)7NWʎVjlbXA4Kf+/V'K, J'ha+|\Tnw  mycY#z-Ї[tY!~DH"xW}W)_]U(X,cꁌ+ i_1~v1>dyN =?GcJͦ/ E+-Z5F!G=wXC9A;dO@gH;o 06!wIKMRc:: m vM ,ZHA~uuv'.UjEE=K곤lTV7=qZn'*}yh)[0 !?ii'ToSe%RPG›ikr( L bq;۠ѕr5%KvxU|˴[jQzi|M VAKJbDI.ZkH~Gcil>h ؗԓD^KO=fduȌB-d[h=bPB Wj kSݯJ 'ԛz넂SEc%8*֍m\94-Sٴ+uU8QVHr5u6%Z(|Iq{RJ|{c|mR@Z:}qGBㄔ}4>qv쓣+!y: ϦlhorwJc<>nϓv!P"z~_~gwRKʾSY< =ۀR-D~Y1Zf69g>$O[A*-7>8(x^V}!v‰H"!8Ř1sH{]LY<$!Aˑ)Vq"2@9"ܖ q/|fjb2cԇ}֮+z7N)etRƴטLboskQV:?G/!}Z3YC?ͪF$T֘R4|hhyއ(<=bl=eXt kD[|iDZx^TJLe=>Wr*0dOb~P{ {iXM}9ZDǡIrVQ}+}&U# f\m raqrSh##Gvt⒢&xԡz31U|jG_CrUfpl^koQw/̈ꯘ ]sʈc9͟Zf"8%JQY/`GCSqjCV9~K^B=^Sv\SYQta9,YƍBCWa t\y&Z6`ow{7@!R$Eq-Z(+ /ڷXvx9%8-eQ%Y%my˞̼$&s杙}mR؊zn_ս_;J+O-Rɻk]o)M+}݆k޶l+Vm٥WTWSZkP֬;UogkY>ĺ~uzɵ5 NO֝Z8n_}dm‰!ՓklvBV=(H_e 'N--kj vٺ,[k-TjꉬN=q*CٺS'֝\=nda:yj?q:Ժ{Q3!4k{peqVqBm,{Nq49X{7fq$)¡c#8KC h #[$Ķkǩ]q|SCB]Ab{n i%q8z( 4KvŭVn7s\BIdVEmi i^e!HJe,k\qj^eY+MX0 Edp:n%KZijyemhh(j1# %x^J,lA#G{UҨA(V+ЮVC|ruWܲ|[Yn]6^3~3M׌T^[0r}KOMFN/CD'Ը| է mNȷyn_j|>o*}j7޷w ?T1v됲@%ϦA)>fKxWjĻڭ4Ui]GX~)i' xG@yJ--iC纄p:,ynC爥̪nzXaqrq G'wTmn O7YAU·cj@JpDj=Z=)GtYgPQTg9՛@mU}T xVpnV5oAZj)ZSUk>&9>nQ ./\<;@ lGG=F*6a! 76s3!ߤ3'nrl߁R.lWswO^]w79NJϥDichuh|<+P[Zϔr@ 5F %G(wJCvKU^`?[Io,29wD=z0.Q U?Nux3.hiǴӇb,sCy.+:)gR~Zlŗp.<ܙϠ<gpCx't1QUFZ]?{z嗽mٲ+V-S/Y۫?Vx ֮\m{a\5Pka*~Ÿ?RmYsБCC'kn݉硬ת@SZ^Xg/TNN=ur5 "-#WI܈^I3 ,v]7l4%Wfv,n@vܰ&v:8@u4uAP)V*Ni8neש4JZl- p+M@ͩ'im慑@a\uJApALLqxh gV;Ե=8i^u-Z$i'r5$@{0 AXpUF= %QIZav`JJn(wi4EZ/1YfsUS&$zk/[ jrͥ+/'|{=zu7- rkCÕ8PE\2TvJ}WJ=+u ^"hkւ?1ɷøQYϸܲջQ7)\dd\rmȫ'Ɯ2yG^2a~P,xTwsIç?D.Nd}sk8Ghz %nG1)Mrmʽݔs'HV0t陚ӌckLל/C*_ x9K-]⛬DP8I,Rǯ6{Բz9.Trیp m](*ڹ 4ܯKn%-Uè_z[ҟ _^ڄ+C;ѶsƔ? zpF|nUt#@pnkfMvz8zKՍAu^ b?h+Sя*Sxw h׭r^XFU35;j hOx|/X3R~y 7iui[AwKkњ!7eAΚmÖҤf+̝x]"cpJZ9OCQVŧ^l, ~g}'v>Ϧ-TrCcPv K~P4.=Rm:YP؋(ˊT%C^]L~W _qvV^rڈ 鲁x!Iz/p%nh$)(J8 ϫW`I ʬFtAn"vxzQsaVF$ )oyySK8Eq]7$q|?BM^Ⅿ1sDY,㤕}gAg#A'JMlxZ|ߕg 5x^/Cg"xskQ9)fĺx o#{3 v=;I]qZ5 P(^5' y T]Xz M =%} G6'`d֢L[ uEj[m$LqfLr|nU9M\iܖҍ)|\; PSj {ι g0MӦGԦlF{ *kJ]kROo[9X2%|)6gE{L}Ҧ(pP͚iw+ǻ[n]^9ϙ0m\n#I%`lA8Pb:*XX8{HpP8:pʗ"SȵGǻӆ3FKAʷU?-_6HɳB;|K8]h}VxqVg/+*D}9VH>i˯υꯄS: BeiP0%N]TEK n.?YMf)zl*O*czGgE܃o8ԣMnHOc4L ^ P޸߻R_VC|J.۝(1Yr<'#eF.\~X B1ܝ5y:앧۔>OJ]"g9dOU+@gQ?8NcDq,[E:yVr΃Mr3h}IFWAPPQhE/7[PÒSM;ٗw)BN3@qOK0}G~fZ#Ϯyqr1]Lsᩑe+Wtuʂ S?Yy=Z=> x#`,# f?e\,enx8J9+wm@WQŮ8]/QV,Ldzcwr6bV+M?G V]wnJfd).ukQ 5bf? TRQGJPD8o8A8V=O(i <&H&lxND+y4< sfP8)Iç6[kח{] uCs} i%}™~^zN55&Λ'JRvf7&i~`YEk?/I;]YsF}?E\}S) PsU) Q"HRKmJU}1RHFFJ~v9Ҧ0B63DyD6zZX1/ n؆uY.˜u(5EV N=2m>٭hݺn3BGְe#DzD9WZa /o#9?fDl.<ς%g=R4M8m7>(g@ԷIPp?ˠ9;Ͻ;}dGӖƳ*mOwϏsT׬sZ5[P.5CC'׬(J'+^t6a&˕j8R`v( n9\?[l~6JiĄi 0F7+N\MATt5 'hMB`f!,VRܬ`Y$ 6Fٱ`.E! mf燐&kKV=`-v nS4VJM'0lm\85wċR\/VW?Gq3RJEEփp(bxA; =Trȣ(ͼ_dXO93J6}Wq6.։eit80[AKY'4SKO\6>Y;wT81946 ȓ [q'⻖;>?s 6lOG;# ny`A>`]s"0ڊAq,Q[Ip"u׬xGZLj|c]@-r|9{P$zL/Mvtl~:L%x)9}#Cfj9QjCx]X'Ǖ*%_֔l}PMrx{D=bn+ {h"yj kcJֲXwpZ>QmJ8&|z;xDNoK'-> GAGͻWrM ٯ"f j:'_ vA!oǝW1P{  Sx&M7l__n' -0xcedbܩ4 w+}ݹBu%5t xYۃϥ P2Y0w\xVҍs6z|(u<ڙN t<-#&G;1:b~&>ټЬI 1b|ÚӲ\R,6fJ -olQiOW>"'ӭOz{\̷FEf)ObV( _(QfQ%#3S+GE3}R8YP$[ԋԋ#怗unT [3:vzsp7sQzH>Y{9n6e:"XJO=X^P 9VzYU+;?XP,}]GSX}Ah[7v2WqTN/o/]긥ro(EI0c-,aX{ȭ2rAG,H|`$5UiX5`D*OGY:@߄R—N]q&{O^TOb%ӯm]4.i`ŲUXWX&B>P=V;Ĭ4TME%5I5H훲4$NsMȆ.k>d!GUR2~Kܮ.nc\kQܲEZ՗.$nW@"QK\6oxBvXu1ަ~7ZTcQc}DQل_@SA0QtZ%_ES~Z3J*k(?5 \ AKcRfԓY-iNWpHt8ۅ{^˔G`UWK_Vڕly-@DŽ{ƨyNP7=x'Pۥҫ ee[hxN1lڧ(U4Pv%A@ìܺՕSGgЪY%9YKYÒ>n#NXeEIK]sR;  xj0n~ rJπ4rl`YNQla\v*~pܤVyʶk;eJ#&^IŶNZVɆ)G=mEy#`EċcxAf'PD34D)bF4 sPq#Ypnem:J iذRm8%aK/iӓAlKaTjGE(iAjap5Lo z8ŏh_S\iLQPҤչ$O+ oIXQB.cIzCk5W|WiߩJ%Bc edxlA\5i7zlU LΓz#SgW)[λCL'.h:Kho /S~Zk喖Nɝ^,gJ>/rN~jRZpX 6Ĥs\OrWq[[Ji &--+[.T)S{)iAL]-Yb.E\z\˜Y)#Ғh2K'0߫BIYJ-c4no1cuTIR ?ٴEy_O}j+5EBchsh 92x7[қ,KLρ nzTD-53$z)ycJO*n=.ӫ@g=bqNՀ3"+v*ӭpHr<偻A w0I5Y6[:}<ί+\k$}DR(E{Gm]3id|}FE UK51%,׶Rܪ]o3wJK3_)"arn/E!^yG2\]$e؏S2*GcY;OEoJ=/|vȕi8mSDO&*k#qA^W Ҏȭ݈puwZM9{> }98jۅ]!y ܸKV#J??b ^3ٻk^w^`KWm٥˸8_S:۬[}Hzrj=V -&@wATrK/ \-1f X1v4 jQ8rL#r=TBxNT jVLW^JYL qbQ 2l%^ Rg? : 40IT$h$Tz3k@[T5a=jQ#mFbdNPSq[( AbKGU L6VGyar}t (Tw~4w@o;VZszuPl8=8 h|' ۉA]Bݨ"<1%۬FQ-~#ڪ<^W_sxU5 !mFH|3 rV*aTۢ5 V -i?'EA`=99Qlu-4MJÐ}ٓߔ“wW%-B]V_z[6IL{Tn7)FN?VE^932=)m<݂_'-NW6Ӓ6rӃBUֳ`sH_ƅ;hH3k?dۧMF۴fz`ZUřs)lz3 KƞbQ.b<#x< (^i9Bn@V`FhnMv/jށ5)w $)r:Z, r=鷥_YI_ս(uf91ޡᰳ<]>5!bؒlͽERQF`sD= Ӝ(G}F8K ʿh4JP|;F,10=/AM}JPӲu[#53Oez/eDS.'<C%ղ5ҳ8O^h^x?|b~k&?'Q[[}jKJ..ͭ6QE3ɹ>Z95+?zwh|'z]8GS,\9nwhh NrQ6AZo8eǎB:tjq_ˎQ7 Я~4OPi-8adfM(!M5JSs@X " M4M t+EpEMϦN2qN)Ю$Փh/BmYz %l-Pn3ҥ9@/IC`D ПEt?,Z:Da,:'[45n@j1,}cՓkV]mUk]|՗]PZ];6 %WqW-9~ɸ!g^-0 ^C&b9Q?|Pn=K)!^TFT:+jp _sRs4V3Z-ZkVAPv̴ )yX[3 (AnA,ʈ<,[wt*WӔxE%su,HN)5~ @@}@Be(ja5x.oʸF!_C6}T3srnLqeE"bZ]0Q((f9 =@S"̢Ab7$tT܃/W8,KԣZրx,[|:%tzk]?(DKmP*28o9.lW_2=xH|ZtJ5RڜJ pf¨lQ0MXԓ,3}eIA:L%v7u Z{:܀ρ\wJetnDݗ>B2G?8e$9%d~e4_F˜qV?kϊ8כk.dU,{ ~߸2 u΍e=7aSK@Ḵk 譝v|ZԏnRoB=, ao׵8!6A~nm2sP~Ĭ.I5/:B~]|WZ>gXLj\('3PS!ݜz-Zcn&qCk%Y\etq,ݴPԫj8Ī8HљJ_(꒬54t(JzU݌&[Ww*CMj)սW+/ ܨXmJņVZ+WNn&J1* ASMmƱրjȷJ \?ITnJT4v +*  ֊4F0|߀'YQw!-58_DiZsZqAެ)!LIqOE|Ӂͳx<]h113{?haăG9y8O[v +§ oQcR J{9ф!G*=ZDoS&<(# x³8PZ/_=DŽ!kD8*.{ed#=jʇNF]!dڿňo*iKn9;~cDK鿯fZxZ4Z;^5^= +D`яY(tRbjs>Mth2[&>j0J8gk5i9>mϖh;h)#zl4_4?)a~=C;C3?'[}'2(yJC2.@7Wd}"*}[1n"Iua%NԴ.G- ~@A)ZꊏqFrpGs0%cݖ>mƣf!@=#&c睢)uVvc}%Y0v>\iU~Uzğ]Zv ZԽZ|g5џ7wa\Vm) JWj~G;+uڠ<FǶhCj%Ud5p88zt1ohDWZAիUAU$sxl2Ԣ0E!)5dd$j_FQ+ԡ$7{\IzA$6V--ϳ$ e4Xd5Dր866mYdIMY$˦MҸ֊UhAU,7"VֈW'cQԤϱ#z8F*4bzHa8%@isA+[v?/zx' iЫ=| p-:yqCek=,[]~|ʙaJfi4 3ՌǜuUGͶeN"xu=7Ow0it;: ]EϩF'zV[u yPk8,,c,sWgBs 巶 lbPb%":Zp]Z;Z\XGz #s+,W5)vc ޫtVi)RwDzmmTYݷ^Ϛ:)3؜j}<ӗ5gVM[zZ`m6-+s-ʯ,C_f5!TA2B ń9F| 5? &,Ŝq<%F9/Т}H-{IMt:U-E.j>-qHGq#+̹߲hmv!N̘Ңlj*~^ Zg&6U}?CBR,&z5q`r΀{Uȱ2\>(wJYWUprPCe'ZOMh׵2wKr}G Oy4d)m|z׶ݟD?NݸX m~W ެh\OMe< WzpVQ-")&7'.rbOȱ\{&0X@$ڨL7^G7 cinqyG S1Yi S ݭ4ݼC&.^pG@(}*efxpLw+лl蝉thX/5߿m^^#,|AәV8%W ]A}t!mA[t\?њ>٦ԩxB-5ʵ&sh/ޢ|،<ꗕƁZۋZGuR5שv,OE]o>rYjvWe.N r1>x1K`8P}Մ["5V\YV\Yk7eɓ#kO Fvt8l_.}ӱS Su9r2JU^wkA^h0@Er6)*~2*M`ѧT,gq$ JНj\q Ԝ[#: Ypk^j Y+MjamFh4pMToH=F "J3v=^)$|nW@ *"t="$/]St J"դ 4sX;H+n1W6HGpPFYoh]ѮF̜Kxe/eW] b`'=~(9_4cK?5ơkl!u3> 3 ՘RAV-⬹KF˂(8wk6EB8WbD/)m6aern\X6+J>zuok^٢ft-=0 Q8F@ DL4Fm@-|udYtXWtx5Fd\uFo\EM=r9Sc0Onf:פZ4X= v79tu?7iq,_%kz'-K;}H]}js !Qb)mU.4#4_+cazC %OrKǸN^7G ٔ2o;#⤕*ylNH"2׎ju?"Q^IGJ~SycGNA;G4HV&KOGi!s[$rE}KF G.ZFb:lD덲JNTJ黺|pӕ)YCUбQEdC &R* qq7TngI DڴvƲ\HlUL_s=&] vAn2Ll kS:$o.\dm}sj5q#RuzSn@H>nYk֑6ixGcZn@p$.5iynW"Kʷ|.H7 _a֣aW\VT#$}B4KBs0 IH+IkǥT0u{oi Dxc>'t-2 wQkղcn^hw1_he {PhwvRz{]{ClT,祍=%C%Hvګ[0jg'/ً3ڝJܪۘ O3۩߶ΪHVy{WQ!ÇuNK,bR*x|]ƼaIӬzr#Oi8KZb=} USdߖ["w;:ܪ|(uNT-hfkA}UF6?~lu^%qV˧-gD!*l`ﲩ8]8TI~';.=%xDxsV=G 3J?,"M:Ȍ鎍ǂo;!S)VH'g\yg}{~i1o g;L29f&4c_xG%rI"PLwsf2^0n0;mֆUFKS`W;2gu"Q'eu1]L6͍ĝ;ǝW^M UJ;_2ҲM{W 9`_Ō==V:II UZu2C i#zH6 f4b`R1ӊ@mq | ؎z%/E3n}u t隫Af͔>ƂwE}Tma3 ]\%-AܛO%K@iͰ1m՜n ?Xq8J,L\udRW5L]pԭ~ F(h9V(lDn]~#ӏ aUjW¦S } r PWLn vž|"iNaIHR[ 6-fyaxwt*JU]X(%׹ǾGD Zm^8/M ytJN9`zb %'d`tvJKn魅=s]2or/;-Cl(-ԋ?n!19yTpoȬt&yUΫd(Lʕt:&1:\ģ)\kTU?#{Pql7w=Aa@MJ72-52{3h2 Bhg3‡~J;L ꠂۄ;t*fS%F\!QnE\yqj.1W' IJ c/_VJ\?"e7mFᷔoin+76oƾzsgJ*/*ANvleDh0{{.WF=>{R-]zgOJWOÝRk`?)^!_0}Gop^Z:Д62z D~_v+8W}8Oj,ZK-yOzA`7V;+Eڰt (ؑ_uZ#qq2bTq;n5rp*$(xFqk:--1[@z+a@ ;2kv ƽRN9yQX <隠d d?iǀiy/u`2vZMI#ʲ$~yekHJ:ֱ{AyY29{F.sѱ K|[Z񧠁pP4*e8e'BQaHK/..)\~D".spt~7LG֞ZGc&=5,S ,E\4ԋl ҷU#KjrQnWC=RV jd89(#歙&thdd$ґveŠ.jnzu'p¨Q7۩=h'HB{#DNZU/H3jDY"Э>Ȓ!zUm^+AFzՁ`]7[* "A7H衤4R 7b%N3n6@K;˿+=u>Ag09kY]̂Ǟ2bD5V:-Bɜ]~YE=XOfIv:cuœTdYұ)QT-p l25:h~^f qvK[8qgn:T]93m-9kP 2:R1쳝YY_kف3ht^uc}=C1}FF 0()[MY/KE')#>cZ svET(/ Wvbe%r/G "vFh=AoeqԔ4Q`6b=*07GXA'4c#%W\ FIe^p6;i(1ߡk먨΢r#hKi1ҬYä'qj[gt [;i[;[A(\j816ی1/cTCi4;)/}p;S;̆hvӎE=KEG|T0ŖgH=q1{ԣr'*b1kK޳B}EQ>5R+6{ 7jlѣb\/dF\o>oFLz>~Wz1u1]L6' ;тv0Um|v*<^W-֪@k䙅KPh#NC1=i$Oe~+J $k[<Ųu_me?+PFCz{8U hKZ5MOn;LFi'A4R6He.d w(mAcCkÎŦA؍&j5=7~:NqZX6^ı]Tt+PnR۴\.Q8znLlڰAɱ QhQ3ɪ@)$͘MۭMbWbh4J PX9fͣi@7muB-F SZo*#xs<9Xy-HL+o7գRǂi}ȰU Xcrn0QO Qo4V$^6ˈ2j ,kl36Y0>nn,w|+VPf;tD3l%Jh1P.AK}wUn"~WD*"ھH-%ފ7=GDZ"fe$?05 !btL*~۲L4 H5WRH7Z.=32Bͣrޘ8. .K+,鉂|h++O?m$V!o79>)wEhP_1~#&J[q0F#23rV|BFZE]rJv\s{U(6Ӟ{M@ȪyF%TG 1}_cqU1mˢb3'sȾI}ZO=22כQ:!~F--rG^"h,Oz>bߛ ꥗1-(bգ??)w[Y IZ0mD咭jTg|-K%)pd,}(C-vkhMo }ZQ o!x4Af6+(p2lxY:P ۤWh[STJpڎWuB'rfWk(\;Lgj6=Lh` ֫\ϫ⛠XnA#uث6mW[֢ ߭ժ5zOuJKJF6 nTA(qqA¥}f.;y9Q6ٖ6s9XAM,GEn2.N{%)W\QP k~8Ps!1IA"[5A}s",aqyȬl\ xPMKyӌGDe:~,k0߂stǨ nrI9*ٶEWZ[ ]aS.z }pg B[XS+s1]L?\EfCX^R6p~(Q?cB h?[F۴->i4r?n%Ip{xLP[g^΍ԫIĿ[8Dv'0U_D7U@Vq+wL7 '͸n2r^m20m%m.PnjBq!NpթXpCg4W/ `?x$ZʸUI8LDyZRsFnHcF YufԱet `' ִHψZ.ѩ:b|%m hVyq]rCS" qș{q9iuZމPv#څ+9"smв]Q5!-RYR*P)a}3ј3ԒYY n;F^`aKH&cT"K@]J)uvXLZ1Љ tyNfczu6MJݣKc..'upy szLv]J#)0_|,%2>!%]bM+wDǯcW,X+l}C7 o5A v{D5zAlе9ѝvUu pgן^j_KEw-m͟L}VZ/Kp!R7*Ѯ6 4٨Q-Ԛ]hVbqcEg :=߆Hkbr uv\2N t:.N8 6M>aai#&McAdsWGqd~/%q~ZLÔ߁wri  gp|DހkNߓ1>*{OuĢͳhSQdN]*߃Yv\:%feѕebM0#z8X~C\%,J̝T3iUU7adl@f0J ^(I}>펠T"ɖM$`t1`tʵvil2uoQφ4!U5RTzW]4wk Mh40 "u%j[Q4[ !zRpOtTjㆽzviS1l[g6ez&^.E;IG)}_ܸ55?( mYBe;ulj$C8q$@$Bp4l6K+QWcϤATQp\[a4h66Smvf!]Veb+4 ǵk..xQm-8D ׮^ ELJ @WJF[ =|>QnEպcbuz csZq%<6+39kJ)r˦ iP:JFބ)akxy?.6Ӣ'x%ڋ✩zΆS ƚREkh};~Nm&JDc(r'ePӎ[ O a7:ZM3!#b3^廆:'ȭ[x0nQPLuFqv_u:8E/ rSv([ji6 ,ciBX!D571RWJ{b8$"34KZ?+%s=:z~X[-m(d\Bq\Se/Rev6~uoF=Ak'd)0!bM="e9 :<ߥr*"|A8?&ʯ&/8+%b1dmGM`!뽆<u{Jŵ ; >hhQĹk4}H5'srol:_.K )Q~' q+bz|F֟z3z)ީrȭ}Rp+1hmz$ϘOOm;`&bey݇G}6fTCV#an;{Z&P:z$̖Yy'>̶t1k5Ԋ~`+.UG d݈U_LҚVǑ RT w5Max6Mm6i$d7ыx"~Њ-b~Y[*Q{D^+_~IBCF_y&Z=Ν vQD,)a0A dKe??{ޕZɖe%+K `bT絭|hϮY{/Y-K^owu_Uw}T!U|{_&˯沋/^₋/]xnR5\@Ru|_׭J_WΏz-_8ްOȏ66-jo8Q[}b͉UǏ7Vi'NmvV;ʶk'V5W/:~"UG/o'XS?XUG G6W4_sn]W5V֨G.j/jn,j7k5E.ZD,<$;Z <~yei#`=(M4M]׍0-wq9ʹzI'Qש9AI: 8˶vt8qU:`z? jR5tN^rjIq9+mWJA#i؁q23W]]WwTXD{Rw r/ɬ,Bjl5S0NRiKl>2Eeh4ʛVm7}pyK՗nYx䂉K/Yev˶܈,˶U\=۷jYkӺ]weuGuͪct f>qZ=sZE]fV̄ڎ_Z/tzRjOuCJN՜;ZJͫAZ h?x娵qǰQ*>]vV$')0* j:_1SКG7T/r_* ] Oi"o+оH>е̣}I<_oT-AmTp؋_{+LC(mHےS(:*]Rk @ILZ+n!f)+V%"hGzUzA]&g71*[c8ۋ~܆oSIp`=>6 &Ou\ epz2攴n,0(sB U y]~]}_^pjGKV[J|!xg:<9U~o!kؒ7*=ʯ-éa%ix /"dZlqy#Q+ׂ` hwr@rY a@; Xb;vh~#b` Rg:Kh-U + ;8q]Dq G|ĒaöVJTaĢ^Vq)I3J,j$@(!l;dؒ͟,jevc4(02M|0p y˸e!5.pˁJv^rD\?fn*)Wz}R<JQiP (d^}V)oJcr>*F%o3 .;g]u3+ mF["3&I̘`gkI O"^iR0볭#2sQ>p濠M\+Rs';bY? n6oT*4nœx 7H.'1_7_p Ky[ \` սwk/ 9Ao9~x|%dP ߠWT!% VX([*8›Mr=vm =%ȉ\ :{P{(!IYgS?US'H~uP,ҷ5uΔxƬ@_\#XiR} 2B3@ݗ@{@#sޤH+= 7kTUCjЪ4+z9PsTZM4}_k#fD_ᯍQ^փ;U| uQX/7G9Rd 5w#VK/=icƜxSCF Tzw#ֈ<:%DM4iݶV f+!|EmJ#&Lէ}UԽW*!K:92}|Ei[ru6M?<N^WFK-Y~⥋/\4ut?Ϗ[qRTƢ-QA4d T͸97V bieԼp-bz###<Fm5,LZ4=C!i3f4lR7L܋\OxMϭki, d)omY,C?Q2FcPp-@8iyޠhl cqDj( \G@I;>ɏ2L<\۩jaة5VrF# 3h^O.jDlRz.*WJva"FbкlgĪ]wc#{m#rUw seR9!G#S2IK}U~?AݘchW'wsR2 5]'G﷈Y |,q37s&%eDׂYL9SWƧ@N#9F| ?HZd{7(\(Ĥ[wMfCR6o/viQF7)C# 7(-ۮf-i՝rFmCzF=!T6W{՗q?ߛlWRSZ/MBy%5FлO+Ai۰p-m"}ѩ{~r|߃Ֆ^3<%~5R-O>& ?-G-9Pn '>%1(跭r`K>%JAi=V0F} $,K{yr5D">k[@[32sIsN oWZ>q'.%'k2朦o<O;`'uu!FSz#͝vܢ.ga/9@Ͻ!ڍ3ܯעT>v˚uɫ/.1}97w˱J]^eK?^}A(HMs4mݿQ-©t6{_UT﯌U^x%˱$ӫgUV5ڵU5j 8h,5.fEbS@vj'V}ի뫁JD~q%?B? Je^ЙAՊvGpS;Y/{\ Ty;.㺶뢰^w{qGyaqOf.%o4[4htpC'V􂼕樴%a3'I }6VGZ"aBXp،[p wd8;sIgSV4s*>RrD=!|;bk.jQ3ɒfDg@6XK[6ԏz$Ks&7IB@K\/XtH[τ`z9 %S Z|`Р)MEA猙;2}Z濭1qe]w`! +չ\cZmbl"ڈyC6#z zѦ0oHȪ*{pǘh@)M8I{}[ NHeC["~O|GfZrO~,8yxPk:(Ev,uh )_lYR:=>[R.sNn\]k?7|FO쒻t y,΢Æwhc_0#=E͑~ԶV =ڐ?^#2ح%_oV7Yn9Z-#W)1j=yPg~Z:dy]r;#h?!vE)cj2>Ⳅ`FH pvG&i1νr JtX'yG(&? WR?Y{r 86=Ezv\J~nB^5s[~yj:Φ<} 4i{_.`bʾ5lL}ĪkNkNԎ;^ n9~ؚvcͪc5L{FgXxh~nS}yyj64hď}=)MaV9 ~DnȍsNTucqj mb/]nUXߎA, eـBA㔪UW?Dq0?X Įn=l`qc_"p`%KΗB2Y!L%P{/ `2pv% ]F@)WzrwY'e?{0kkr=/ ':(a* 4;ɹm775TuaLT-ۤF;TiiHMʡV(%V=C;v > Yxv3%j;l v]]} ?gN)6+4]Bѻg[1 ɝ[Dz-&D TEF,$*׊l:Y(*ki}DJ3BV'%64~>4Ѐ<D{%=nVBe%zE2>%eL194l:O*-{'ZxOӴ6ȫ!joz`t#Q]ϝj+ŐOOƻkނs}D|y,؇י߻ /Q72qbwSp1]WozF J=="<"rNތ+;2ŧ9cvk/!zQIsAk'1f-g;k-< dPe">J vBzE gSkTZ8lW/-0EV+o.Vg{*fyop4i pM8(hQO E[FPՅSGmMg*tȺWU BץW._jKu9{v M)}OeOQ k4W>жDQiá(]Vmm* Bh\&. ɁzbGq:acpY;n䅴 &ZKQP)DC߳ɮ)xnPqlZBphF$?uŘo%Wqwn>ZZ! ͺ)aVss'W=\L5v%{@ĺ?|I$voCҒb.ß1ܟngkȮ8R:-f{O]byF?J>"yL=&%ƫMMKPN6ix_Jk"ukx^l1ցcꎮkpVkUN~UZڕR2=X6tEUR]厜}n={=K1cSt[9`_<>j:~Kvܫâ^#K9C .6Jf{zw up.%R(> J")e+[`2=.54˳?/e囌rnǗsuߟCmt6Lo5iP:~;%˨ pexiP:ե[|W}b y݀c/ XNڬ6mȏ"m^5 "n,FVqkDr6zMșMRK5%WY[4 v1?օWQ&D2C{Qu]NCϩq4pRRI0 (M#ﷸyl- yZoIFg)^Hw˪S(<6 6lLEJz@<-37Z#- *Co0`$l0ciPb3“9Q`u ר5(Qu{E,^@&h!UY ZJdZW[ Я|7 YOza;٬Zz-7E;;QR3a(68ހO.[]MmyXI!i:&}KΒE@p51*Ld-<&%f^S<Ƅ0oQʹYΧ<,$[05\~;}0(C[3`{;(j>: ;[EyBCGK/큖)vNQ5]deiN/3n6.U oʠf|^0n~X#r9;vZz9硌̼<AYғFo%oy&22XV(8!l:uçxF`4.-^TU5̼ظ:27_ASE=󱝺R)U27*eRq;+F=SXq8nٞ߬^TDyi'yn-՜R CBUٴsqP4ka#$AI]vf0v wm 7Q8ԣ&ALXu˴ 4[q4k7 :G0ߵV3n75-S$ 2GQZLfB!V+ h\fo~QBM˄/Wv9LL,`660]kδ>+']"+uNO]+ѓO@J触K&D 8A?=P^QϳrvO6'SN~`kG=ͫ[Y<e P3wɔMZLwԽHF&z g^#oϸ07ʠٮU!n1-,8煳OO iO+!s<>ȝQr~:m<.Tq zH`j51r\t_y¶\/n9-h89@@zYZinRW 0+N7!﫭ba8^Xe%RnR6>/cnQC_.,tWH-JK}if*lswBsۢLQ2 "܄\[d|35.:,uD$]Ѝ&riO-HIRw;Φiο; vn7qZgO ȺAnF sP~8Q;t$4Qǽ(mԬ撀pVgIkjv{W ⹖6f:s]cXlaޘ'>`;(&GHFRu\Gl ; zhBwm#'b8&{nU?61)3Sl?9 PYeP;6X^vp? gp9]ޭlxyUWJ͉ji2Gֵk31VhE!)3~qr"(^k8T? ,g@;j.Hmsv} R+>-gl8H&tOD)m>WqTpW}8j` ֺcd*@>J3g7}AEoW,[~%.Y~dչX+~uxXqO;ZOQ/1QSrd-2N8h_؏ 8^ @#\u nAPqVKhBDZs8o孤ZυQc2d9CK q4)q 8~Rr,A(©'I"gĖQֽrt6EM΍Z٢nFFF$-ʛQmzO&qF,+OFsQ$GhY V A+^ؖ{f)ݔZm(71Hi/¶/X| ]rv${E\gP}E纁?BH02FZ0|E-ʳGf1B7p4֥y~”'?6=g얅ihh\~uǢ`w3??+7S` gۅak`zвmJϸJmʺNZ_VA*W3$ZЉ$ODgT#q뒻O̩NMfRwDL[K%`ݏ)A)K3m<-|kVS-ּ:ŵ^mfΣ@@;U#KxKjJmKե^k=[+qV?Eِx4ªG3!?mLGT?*FиW}B~7#:Z)CT(_ovJKqn=_f*zGa<(=ZǛ1˂v7G;Hr(Ꙧ[W>&ϋ-x^2ߐ菐 b¥UWQ:u)G]3#1"1[u,NwUgzZz`hP6P[Վ=|q]uG/Ra<}X8Tx*o(=F۰BTb G/ USxl׍4'W&9BjMt"&ս¹GOʸPia<{{mVR y\U`A>ͦaykUMVd;ό 5eYeP([Y|88>U6HjW,[zK.w^q !xVnsQP],AC,Šmn}@[s:E]v)8Ӹ%l} EY&U&;>JUn(^/;4´F@|y$4oam-Y"M]ff*rUK!W0l|S/S v ]Fslu,oVNAכTaY蝒cq $D{i*txn}P/}&\%]izlks9yƭ-TKdn#s=- )Ac"4*Wۥ)Gl5\1\|^rVk|DNE?o67x >+oVkFʸ4NSSi'Y; quΘأ4m?뜐Nws oFȩ1"B)\ԏW+QкtKݎ#or{k(gY`]mvV_&F{W |3F5]PIle3ѾVFhSR_7ʅ_%F`~1&/lU]l`6j]`ZGHOHkTּ-s6M7 MA~zsq'e#?h<OVNrUKk^ :@JejQ"䎗ėa'Wz jqpGYs+Nٮ )_e7( ]׭y3m[9^Ɖ~hJiYsI.@;&:~܋GFQ8H) T)jES|ٌSdpNB`u: Ĝ>ɉx6A|W(8=O iQTr;S >Xq`gfz XHil75H{1`b%Q5A}DNڃ_m}X)zCVDqߗ˄ύpK&0zStDNmA08äVBH7ZS2i\b_sەrn7IRĄ"z g@&՝7ZX>U Fǐzk%%*-V#Ry״,J1ރMiZHqͫީj ` ڸ@Z?Vڇ,Ծ/ .1lz8e}I\i=!ۼZT؊yV2:ueKPf@#i^9X}"v[t^YVgP6 Ϳn ڞ^\ܹV|7J3BP.ؾSꢮp*iMp h ko3Z\iq»̔%Gs.nDmiVpiGAܳRD*=ge:iMЪ c{|y#ha8 :52c^PNb 0Kt{SU<X<| cҋuq􂋜 v֯^l:@ywAtdR~.@s@.Oy{٣q`JHILxh8,PR;b)jbr{E_\wZ4g,׫WJ7pJ(w*wfay}YS(S(F#hM+8Z?:1dKu/KM{QLm5q?ٱpEcsIVE=#RDϔ1oڌբX׋%vFZՐn7 L_#G cj<<"΋L0ioɞHQ5'qӯ,"&~Sbb|&%[*Q{hVoj Gg*j(qwŶonU]Q=;sc̠.lW_z;hX*)Նjh'lRF%\ 4Yf`7>tЭ3k?(Wsu}>(nQ:f@hg%F~̸[@ƺ@MCF9}^TD[7B!_kA=[ÅSpqA \#ZOvzz3W[ŖÝJGkVΆqrq)Dov,F|:1Aɽ&btd+.&_<Φo:p:Z)^h^gTQ>:$>MQhވW:P1Vժ]rLvANvŧPD=6k0Mf(X>jŎneo}1<!+M)e48h>d?蓢#sq~L2aL3484?)9%9A`oL[32 F21aNNn]BYn*rQqC9⫨Qtg2TRfdكIR؂1.*'Q.qI;%%njE0)ȿXh%ߕŀ7Z~[n[}sPjz\:@?5ׄmjSshKk.@Ӫ$^;lpWkDuQRgkA>ʠ W F1=`,بc FԿD'oJ);f_ۭGM=]XH)qQbQDv`80(DVJ}^Ӯ~1{"~VѿLEWZgy >91Ѧhs^'|ДCn%!#C 0Kk X PƭRnYE[s"$䵧߯U J1@9+ԥxG].O"iשmeo2{Zh!>G7sc!Dz[ړgE Gn)  sS\Ӌ,͆O9J'?;1K0+}Ǵ{c,nD;v\j7.W ԏtW-Upc#ZͩZ8q^a8Y+se@&E܈wjV)P^;}4m" 3ky6H Hruk]ǭ!ozn0>Vg#`Q>{6KCTY #qЇj.NmF.Zk}%IgS \/kDFE]B,8i"u^lbN\təMqbXFNR_32t[yK UtqF˵F,^Qrqf2&Hc17n_eiNl˭mH3nv(Ź_h'f#P[ZnH< s[ٴݡ%2u(DRƂgpz[}@io{ԓ=1_>qB?+qߒRw(plxKPXt')=v[P <*M]m ~[ge-r~JiWq a S="{܌G詈oSYG;5v_ՋkCWJB ஌Rڭ>Na#F5nH{L`Iom"'ħy)GSpsf #>^. V˷v~Ç7H}ȹULw'E=2~vWI'I1mxV[u+eJ-,UL!gOy~ljNm:# ˸Y۸z<Ӫ޵ O_&4OucTf@%R!}韷òv{kdp}A >i"cYD[րɧ"]- ?\ MlEB]H=}A E)\n>!ƏIZayێIxV:Φ,;&U:]I t^?S2Psqrz'`bxZ#5 N3_ *3@7&IL_ALMmTF*bUzT@`#O-u6@S^!P\ۍ(nscP^ Cfc17eiĎͅD~*Q% j$QEi,*)eDt ˃yl7>e~|qP<'Q^EݒsƯgݓJv 9QaD?,Oiև[Zs\'Z^(#*R5UEyR**iz>s[}:m*w.vb(zA g]Bo|$J13_Խeu*H^ΨuM2feȷUaE J:YVϊwL mtO`M:^&fmK踙Z&w8ZռbMڞܳO*X1QǹVczJ(O+T~ XQ',L zw->I#(4Euh (TJw~ry-TEIV0Q[O^ Fr}*vR7*3^A}iaUh)+,Tv-Ne3fȹ'3?T&cbq٬n#)4~yM$T^ VeVL_FR:!% 6:xXCܷz+둳pm n>j|7t oMTZh=hCB4(/Ċᵨ51&\Gavs'[N_6}٣Z;]s}Bi;c YgdsX~XC_R ,h*'OΊg;Tߊr'fXyG6}N^V==c^>ْ!qGG.RUҰ_|UeEJ7폌F'2!^Jm8Q;xKatNyN]yTnv:P̬Zf}^ )-y$No\q]Cmœ\1o5(?F_|rŏyrR5%tßK-!1Zͧy_+늏V۠l:H21e9;]`(ll dZ{hD)P^5G0sQg>u=>0 ]@O'><-j{(d)-* $;nˎj𬟇ȕhf3%ʒ|"fE(77J^sCN5fvLp@ꟍzv^u*[MjQWT[ ډ@a&)d#tB:.{H \;mf,Z1M(m{~)1(QZ.ԃ/ťή\2,shN)e4hI :yۑpbhlxNz]DIӷTO((C49jMbGFNYHs!7g Lj|-߽G^)EKg.cKV)cV;&$6#;SӤ5WJGCݫJࠖr,ᴶ{MÅJ~c5덁=E3O"C ) ]~}hZeNҧQ&cvB$mG:_`P~ vT7FuPc µ^<5/LbUxȦh_`aU o?֪|ŽfȚv̶81t-j\1}꿩 1Ğ2iG-^\IKu7Hy,"Z}YQko!$ʤ,_bڥ1,0ٌZ!}:dp=ǙvЋ!ODŽ?;LmpX~+]XrF6y \}|Hx TP2UR/G[nqEh"2_Φ==:.ݤ= ;+οfKh]Sxxī?1cv{Kj֗fVl˳Hsa*>v=ϧ}TK ]: Vvrq?N#d1\znhFW$H-s*Q)q2jٌ(r?k)Zytrt']bDz9s?${"U3[Gm: ;%qԍ}Rf^BBn*Uį;KǟڷBxOlsq iH(pH<|.ؿ)F~ڼ8 `xV)u~^㻅kZs@:BN p4zSm]Ώ[o+ j~_?+[PIoF/_֝`<k_\5fEti'־oOF;Y-9Aρ_$i؛C*q]5\/Oױ>bnh wKw>j|]ӉBwjN,t@׾ykəK_H]DWI;NnS="ذpt;~U3.FXy8:)#ԫ,Rx 쀬M])_ƢPv/wtuiWteu)I5~O w%ȽRp6ח?+!pvZ;wŭ,j>B6 fMEz]|DdL\lǥwT["; m]x1 R/%<"u!TZQZ٬(5n=znLh'NhOq7;B`Jthf1#5ZbGG$G)eT ZilxNx`ɞET-@DT A9385' ~jI*nR>&hDR$Et?ej>zAѡ_ÕI?V-e.g AQjcnAлQGR:ιe&^U(u.KF]뒗%Pe)5v|J}^BbBu`Q,[K'QnSѧP8`J2 x"7 pzXF6xvJ橉XZ%eaT - e^FǬٖ dnLO=b{NL.͘vH3BڿTMkXLm_)v{Z}[~mnL_nuJq*qB;4ߠrڄpx&,iP6"MLb*mܴNæ*l"!yQzP"6kP٭9y҂~##ϰ7xriUFq^]Mп1ӎ>I} r,&4?_-A">0wMWZ'Ȕ(4QQ*^ v*<6P˷F+>Ksq䨏lEH;N^ƛ7_.pPu˜j_\cҒߎcz>o)},HJնKU*dYMh0(QC6BRqC?"P]؏FVKuO^r\P$˜^ ΃ԳH_z/\)GGk;-W)lPg"=L-T:6ݸPWÆ.;Av2vyBObѵQpgm:R;pZ0i /c?h~@< =OlHm`*3W-]v%˗,Q6QqOc@ziNۙWlύ63|KQ%Z~g˜bQQRp7*es{X3)Il(I4UV&Yq?hG-7:bkY+Eb&zأQ2ڢaJXI($N1Pn:J"DZ ͑%g%6M n?nZȶʕWͤ4T&Rz^yt;LG(е]Z*wZ͏Z\sZ^Aje+쀊/70 Bq΀ަF-tLnS-oL-FLOmgSQ'*ժ[yQ_duYej;LS[l*q 1YzJR"S#/mduRJ#%nΨBIvRf?ڥ۷u3P&CloU:w@,&z{5 U/Oݮ^P!/KZ2H*3ڢ}3yi/3ɋgp39 z:Ew]& @%4|i12DI A{%"S'm|ѥJo|eiG Zp}bDr2 i'y@@>B';@hj,7 Q?3~uyx`Br116erE[QZڀpply)mvwH"GV/7H(wUg*hRO,a6J/:&@Ɖ6̆)I,!,*e> ge|C;fKݠqU2FٰD_饍vGF׽qº_Tĵ {P[͸ oV 4Wb-NUm[=vNLz BzU跲i7˅J˳@ϐ:i?ar2mϦy M';Πz.[L4PZm$~"U _@*}7nP;CH=vJZͶcғhD"9Ta"GvT; h^HGNjfJEv3[(cc`G/nB 0 Is8}㗍[%RhuHSQz#^{%jY޾@fnI@dxjD[->EY.aqIRS"jl->)];-E%,X~bgQ񾭽u>Wi/6#_|&4œFJ{OBޏHҶ/3/S,n]MKUQ%H9I ?@7&+R, Nt(MIQSZk}{~޽sqOuHY7곆9t <5z5 ?|,tq Sn4J5а2 h=srrHfND2;{ȝ0?/\*4N1X R p #[X7h;(i-l=05[r3B;PQ 8 Oc2/'NaܭBcY( gA逃V 0Mo@\fPb)~ٶ0\0Tt*SޤÀdW2{j(3h5U gD~:-e)jH&_Y95jeV_we tIBC~] \Wy&OݩꖮΩ3֙j+˖lkK<.4φgÑ C{ύ??{v… Y;GGpsvha8bΎl+^X Bgx6׬?km:vxH&nֻ5]87ꌌ-펬pYύ9ͳpkGεFzIIFCA$4{rVqI ˲4c5NZ9aWN@ey,k"jN²#'7#L2Zoy]j %Z$*8(β c/ 1|nM~6>EM c󼝣Ϝ\vbq&_:9t"ҭv߉j˺ݲ^զ=[Ovn=lfd8J8=>9:6e5ൢzg y =YUƙQC(hܯNw؋3ޣP9QЋ/>MvYumߤ9k5~s̹mA: ZxXzVڅo\k=%|ރ> K-t=OJ8p4Nʵ8?O?ںw.]j;OOcZBo_‘ +>mPP2~%;z<ܟG0XNAaAu{u5zІ Qy\%0\-4v,/1ם0_S_u YP9vTr4[βMQ偶}2~XQVyduVdr~6oaa2U4cvW݊UԈ'\dq*A2e]J10#Y}󌡋~GAio7V2{eȧpKGzKAǣ}#B=Y;d|EP{F|YGUaYC3;Ӆk5r.Q-P756_fTSsd>PUqWKp~Sn:z}pj>ko(-[f̲n@}$>-DM7aL_= a.ʯ{Vޣ3we_uPެ}Yq+ j ៱ X#rswN:%`ջ+.'iu'ZW 8(ڃ{N=b` ⍗@}NaO;{.ʾw^njGp6";~s{7 CG2OuP&O=Sޣ o-8SKwvn E~]j'QUp6[~[?z'UhqVPQ%q㸈EObNl@);L \RB>(}=!9%\ K-Gz|'ޘ/-pe_7}.6|Zqo&F*BϘ96>p7}3v8~3SDGrƘo=3O(ڌGkJ2+  פgz7OF?Jc&܈/݈ x :s)x zuG1V{ ~BV19{cHkS^37g(,9 ZW5[>OP[[ Y/ )¬FFrR{'his~k)@gD;pg\+s{\>~)ѲП,tՊe,Zl*٭>ޫէ߯owG*t5\\G4plkwqgmm@֜=%\yR\ya\imk5MBkع.8aݭ^5JŭTmٱG 1º4Lj֣5,3 N`4MCy%z(r~`7Tȓp,ȀD^EP$ s|(}ϳp8K]G8Eq;oǡ$^R\J< Tv\)Ms&`}ǧ$(*՚~XsU+~ഛFFiQٲp3;)r yL8N, Y١8/N\<9t˖.ƧKW_jšGbOZK^lC}c( k/`榨!G< `+-G@'X p a\Qm{M7p >. t9#2wB !m[=Zp` tnz&%@9 "FޢV[zR`ߌQ2=MwoEQ ōӲ%UKDފ״ǠwY1cgk~g'>_ P1JS̼K"!]Zss|NcEX_E/UZXx"D_݈nǾ, ]+5Af1R2{^Q//8>.wɊ 1 `rJ]r GЎ˷O5g^epwPk ]@T[T[`܇o*<}Nh=7.OVtܠǰ]F0QdΎ{/*z!?-:,M-"L ,Bi|vF&,}/rXU*k Vz|Ih-qÊv돀NG-fg0d`xC%&nC#Fx > [.="{}~[k<@*YQVo >H 5Qa~ z}f#6/~PI1-u5h=(*xjD7\?☥Hm j̕eya=Bؙ3?vѪ˯Yx]}{SnhF]׾0Z3rB>:#v^8T TskjJ=n8ZւfMie v5quUv;èjA >b4ԍմ[Yn)|'#ڢꕭCAnX74T:vt:}q'xl|)isZkFS(ӽ#Vx~'Õ7?)嘑IRphihOQZTFHpB˦oDV]8zK,Jfq1gԝ*BhQ}1[:$"?ևZG48czTc2O * #=X7 /4,8na/Rh=@xAO#qCϬ5(ThCf5o33*uE]!ꇝR/;cwϪ*I^8-hF$zQK~zwJfVc*k63Slќ0UtvBj&SW&T]X[^PVs (ݩJQKi潠Rԫ Fڲ 4 |LPF=]WmoklqfҴݪ.=VhM zr:E Ϳu3?UCApCъ"X4hNVW|vu{(}S巔mݡTϕNMBݔR'իW.ZT=4HWTqK7`}@(Kk փzѷhl5f\pxȗ٢?l4oA͏}"Ts$q%If]&Q{nJivYN݀,E4/f&<Zr~hjySlϫG6S?qiG7z^Z'a$iC@^б֜Z%iP8QTtw0odiINJ0pB'#ϫeiVck$1UŪ[q.!u%^Oو7 T./~%VN-Y5n+^@/BҎrZ@oeIߊC|D$uJ,Ϙ={\jΈ>w_ZOE$ڤ]j^ ?$(/dڛDݻOFw hi}"m2MQQ l@b/eB*ǰwU Ed,w!xZ60{?6ĭ2 yvLim"g2 Ƭ[!nϠ]* s?>hGרQ)j1(К'(((FRW${W<fQmp ~-V|tqAPYQ!>6+&Y#巕\+H w\tt"L/U %}>NWlC}^OJ`sTvj㕒,=/yD]5P'15}RA0r[DI+Pj4$ \9GxV$(l ǮC39@Ar tHD*SnC8Zrnn8 Zn@axAHq4*e m4FS (yJD8FՒׇm϶kL`visjcm&< cXlPׯyWRz ql^-FyQPk-^l-O)JIz̕_f j_9DIr3"騸'KytqXeF'D&5>A`A< ̈́/+tB|xJKۂn֛Q,+諕5)NlGLA&D5;e\'!-=PǕ;J↩7݂iQ>UUdwµ3c] tXxa!f}R?-#DO-3^gzނZO:!d [=mQǹV[D}\uJm/ޣ#u|SPj:'}Sl$mFdaԖ?VfgoKT?mi TnY+SE[e~p!ڀ4C"&핳<]Z+8(Ob9Ľ16OV !qm/y UH{W|+1(^ge < J9_.h,P;mS#Ʒ g9?fnnD0^'^qzι{2i;Z]OLcüg ҧ0 x9x-AE="w}Q߃˲Z/ؿUZJ5ti!Tޙ2M"Tlq{> +sQZ7RTɭY.^ uejW{{߾}^ jϝkdq\4s@F:@KTx6բWGF8_Y=F_#t'!d(ے$}u\Rj{FNZZt+[((=+2Ð{^P1! iCx-_.]Wt_J[6q%]9g?v)p/KN8(q{pA=܈+ zܠO((gZf KC-n nP1S1,%1C}]3 Ha+zFS pB2l[ Fߔ=gҰ[%}J8Q8;L:!Mo njZH%_n}]p "w΍V|5Xfki)PUr#(tdvП42d%Hø)@"ڡ\q{(2bgy{cuhHRr@[X!#ۭ4tG&X[b+jHuy?۟(g[CV ; (e !/K3>VQo>,g>1kcq 'Ϛ9=誻p`F^J^-P cZ"/N|J_ܵԟ mNu=z(u?V.1mYhSF~(K&new@зE5O?"4F-I*?-xrˈTg¹Pse̕ZK>xKҕKV30ԒUZnYp ]i2.4:/%Q~_Fa0JJ6V;nF= j[R*EC@`Q">H{6p :'ht0 4}g3 s~j$ ?ۀwtƌ[Í.qǂ;Fb V:AqgZVN 0AsӜx٧ p!堩o7ۂ Wb|k, N Nā/cIutmF7p<di4_m+{7 c o` EPYRFZ,VSSNDhFvS/?@C0McZ:qV$XEݿI@XMbKb]:u^*^tZfZ3Ձ;Ի-2c5.tiQB+N-{\Qw_O`/5K?KN Y:;hA#{17Rs~e(\TS1k/cn>'QESNhI[:׳riQu3+:l3 $ 9UT$ݍ5i\+20Bү@Q_q\A9KJ]j|Hc)۲z,'>@a&<ͦW(O@߮#;hQqW+fjGa?ZY~4?EkSGfN+4(UMY:YmrOH]M2EtENUѯ̪]g)3.}NaxDVw qں"1-e#TG[4WOUCWP/Y0uU%nBA 爲BpV\wjSЭTi#%XK, SG{F5Udz&0̛t w¯AOtzG~C47@JGxy.妩_tݸOyQw$ [tjS <٠YKhj1rm2T7oinv9p[O3Ph0hSTruɱ%KW_2+6ب~W棝0li)7]RkHM3Eқ.@ =nXG>#ݎm s :qH@Cd% WgY+q> z0nh;aBmlΝcVi m?y#+a:٢h\gGai;ù]91U)Qy|hZi*nJ_(T1<CeUo0)2vH9&j7%Q4a"Кc&QKK+_ܟ)p+dW~}y3FZw'V-;tCfZ@LXݢ|2ߥ lGG=aWRZqY>,t6> OK(yȝbڏk$)~@<ߩ(/h5h*IDρw[E2!Vc\6JORtzHA9p:*ݪvhepºv,?܍gi5A<TF I@ 10mhN$aj֡wHs>P@:eЊh Nuڠy:O-@ᅫtFFkpE GNOB2Jzzw1B-3=a4s}}͢wՅ-F'Ż\c Il31&[ 9ǁjWvy(PUE%ĆzRE!s 3[2w~F>'ıH-L6ʞfy()w<(3cbxU͕2WeRSMWk_j.]&ww)^]޼xüS OqD`)jtXz=/NӃbōJV*E@bQd,* HLX| C'WCTU-zv9NWΛ+Fʢt|?q fʌGۭw)࣒(j4 v3l6r? k._ GccK1fytJ*.R%zuzd;"hYKB1iu퟊(*0|G>D9|T;iGv8H<wcO W`3=&U=Ʀ A|1!UPU«S6I]f$MCF-:!4L;,gEFՉY6IqJ1j/ZY"@})Ȏ?ERe4n}?EӎLq=!RTQAIR&%ʾǰ<:w dL' 'B%{OYcB+]X?efM=h:zׅf[&*,k,[]nfH,'"ufg0=EJC¹g9..BL[$\gOce(#>-v ;~(u}`&"%{yy>'eLDUʽfF/KbQfSLo lƙv h!uvuf9W@c"@e&DБ[T:/lpYVu]4x+{ +VЩ7.nJ!Qw%oNN:t+s[!k3j̕)-Bg!&ظ{Ŵ\R치/+esV#0WJIH r E`#݉MnE|?$AQQJST(uS{,huB:v[VM;46S.a\ax@nSJt'EazT %zB,)H]wJi騖rdP6mOEx9_+VGzTZ0f|>3k mϪza8,?V+Krd3kr 2\Y (`pX|@{呎qyX}3A}Uc$hi:sg11(eNf~+\ Wm2[(ݭ~^͕X~@aBة3J~+W^az(߫!"|!W:?6\v3j4mqF|f:3X nD(. iA-ˀ2; qkAH ;n xA؁1<_Pb/γYfA8ViiJO3!")i>to teuZ`7(W8>K懯lEcK-"nesĭ1j,XIQb m6Gtlji9Jo-/}A]#.FV-|z-?8(؁~FTP U'|,3%Hkgude6N X;zd=!aQ5.~K6G1l7^iǁToa_X$$x#CǔFǓĺaҘF͆v엁6O}Bc>5e//vWc?!՜UUG hD2q&)+!q#f"~ ZӞbCOnQ:nsL,3:53@ 'OieZ.Ϣe!ïJ 5b_n}9dBxMqW]tb/Z#C#sPRwW'YᇭNmah[d3F1{1$I6J\Z(t(<-G>a~OKu^+QnNH_s70 !3;Cܖ'FB 㖽OFBSt\וe6ٟ.\=։nUϛ_c'J]5 #El}y"MPEBo0:TKd20[.S[Ug?4>r'_I[{L]P9}nNi;±i&0~̕My __weL|b|h;Zjy~$[;;h5~uպꪼQosO,ð0]0Ҿj HfM"[lAj-n4FۍVTL YZk2[y=e%tNϡ65 fk iN6q*R%VyU2zWPjOq>PU,y*QTH >:0rC}U0屓V/bM,:uD_[]@BrS,D]slQԷL7X3)zf2! WZ~A;E4eU1m>o,"}Z3+ߴ+A#d))')v2^Vz(O') ,1,0GE3z1<)ۙF;vʌy .CxFMRRwH:g佀}g!J{Eq@ BIHIIL{1&;ƴQ~y!6~KiiǔT[E'p,vUx~UoCJgԠYw{0 Uo- rnW `OpheдE!owq#nM>PSRa>r\y=FEG6ױs~tQQp̹:F!,#,s# bJ~B2s*Y֠]GpF{߃[t1E9ԏKң_Vse̕,L_)ŋRϻZ9{y:ڗĜ/4b5#k֎_Z㜻l^[yLIUւ=@v ŀFԜ-dYSm @) ϒ&j:^0f\Ya6%d\дNߠ6Ѕ4!$rj3ҕi#OJ%l5Mghrs jegV]51HSnSe>6!iՂZ=Iq|hF%Ir>UK+nxxam$Q'/J}E+&GuKW|GxW[j?un%ZLn[eOf*ZN+踁NhECxC7FbZn<~D6!%ًølkR"obHrnwQrB W֙xXV$ud׽zA^y25zKBSGfrՋKȜX.ztSz;Jg)tl>ww/:rai$%?'Lav*.:6 yzKa ))\?%w Ϩ LCY.h{I֭#<`%OÀ{\ˌ=Yw~QZM$J}XPG5YdY?<|l|(>b$ʵ7]=W4:dK/]tzh ? цcU%Vk($Q6Ȕvnы'8P__S' 9$7vsF _̣Պ(#K8INC?f[|LA-f_meq d$G7(it}sR9N P3ꦴ)HFؓLCJ(r~7)n7I~3̙%T棭ԯ b]ih4=FT.s1'Я{0EwTKB33s=$o톹ޥG^Ċ܋e( 5`;@-/wd{hXro(;Mb O=f'0w솴 =nOuO_ts9.D)0>=-EQ MI>AY=jG7B}ذ6L; |~EiL7.q^u1;;'/A|-ׄW9W9f*]LH_6Ay$g{6ݖN:nfeD)-(mćL2vqO`jHojpm:-"(>mh 2~>hV7QuD}5]wXڳJ4R@kv#-qDI%OC*W,4,y@=Sl? ]:H"N#j\~gPE7ߠVPJՒo=PʙuwV2AdEP͐P=&iyT6krX?L)k_"i*ŴE>5Y}hRduWblmPy!9dUW0Lɳ $ƺ #] DAcX;Pz/`璄se̕N)\}*wlDq%2.NA]:^'/Do_w V=~|*jxiSw0;5\1ѕU Wf3#1+T+jp 4Az%ŷI]j42+1)Y1W| (nQQQ}UKzR^-%@WƤo "nݭ.O {%` M LCY@!m|B2bgh-*H ?4-SL$pX"L l!N&ņ[ϊG|HrXy>\,WTǀk$2&waUݣ`$Z <[BޏQoJUE2tp)3yv"nt%iQ2cC32i2V RcLV:cx $6 ƺt#˾|`>0mȹȏ3<Ӳ}߇AV>zX^| Zl$Z!-6;=?>-3sRD;洞&&5W\/=n y{u|%˗.R$N3弒.QRȦ*fL`}!nG2ד$|ڥ ;iI$D~4$B|;:'(;W6=k6uO67d` <<ɲ!qԂJf i7z.oJ yxw0%=ۦSToEn/]+@e-5,_.s\b0ᕣy2h|Jy#WGe;McӓU H/OushaO'n(+8G!a܇~܆>jZ^)闚ZvTl ϩ$>!޷ h紴# ×3"/yզ4lh8~@ C&G'q#$?m;]}Fհ<1~T~Pz!P{qO!aЬT @t^Fi>'2nhWlϕ2WRL~ul_I޸0p%'趍!l%WLxEvQԀͼa 1JZ2Pw-V@Ti$:V '߭VSf+{C K@%+&j8NJi8dnxq滮8zEi$~7xNuL 8mmκȞYp^D9#lJ\- z74lVՌ(JEU$$'k ș';/g4Ex]hrt}+"c-q)z1fPR%s1Z!>]u "akZ3$r}\G?~{@a 6JF6 1}•6{E| ;PCfi,HN~D56c:_1HjiQT}2>e/3v PIYu˭ju(}QjIkdW ƺD fu 7t4$gob<Ŝ/yy:8&Bmb$b q8:);XY| WB Z\?:vA-z/WJ<~_%'^l76p1d)Do,֪w*-=j镵ID#eL"Vx~/Y'{$v%QA6zV_i>w`VyVGUgozxHڠfIP|9}[>ّϕ2W~@CfZL8y^W@V,ϒ>nP"c^b <jr ^qS߯zh0#=/vlǶ=Fr4Kݲg' gBi$YԫE¤Q'YXCyL*a&8 t\&0#"_f" .f*RR" l/ lಐVA7uikeŀYWi<!l LaljEq^3^QCϣZ%ĪL3QɈ,f8O,hxefYH駍i֞Pr7-^=yҥYW;;hk|w[0#BhF],yDƴA\;Xvp%bęh}IgwA/S8/H2k DKtWV$YR(ZvPO *gQhGܖi\q+Hb!]f,17TrҾYSj6+j~E0W\T.zWKY*,^R=ok2~l/猨ɀF#ᶤfl2:PSѶy4fDQɭtA䕵,qJQyE<#F9\NOAĕ.MSh2m˴,՘Zѝfhdz"SWt5<ψVuL歿{N %hXPrRv~S0xӉdɈLaE@o:rHl#yqYwDz@t[T$&o+X'E3QcжG$E_]-Ϲ\t|E~-=G䚭2?LHКҥwDZc{őO#.yʒno*vV#%IO;>}#㒓ߌqþ:ϕ򯾼lnKwqg^%W-V-\ Gu1¹$5,qS}SH\?L=/g [ Q^Kk^lfi=(u}U7SԘVJEo.nUܒ[ƙNDesK^c_"a6V_q*NisÈq9Ф96&4Or,Y|,n,bЃ8X4R*4/^Z=ɝA'r#Y'sY8, I^$Πyr#~va%,b`t…=$Hv+װiE,*E`vyĠcvrѥ'V\D뽯u+1.OIbɋX֔ Fib-Ie{7nCȟްh,5~MH-1_[:?"eb+'Jb5BGϐ4h7}B/zRu\D[Ч-t3:k8ALy^X;EߦAmѠ^\gEK't#Ø|ָ(HWY}|>Ze(z@AQUpHX?$'ѝbѱ6[FN*Qy8&@%[xbefS\L Wߴ{$8W򜲫]}rA3-n4ĐARK)4})Mp Iۍ @1`FJw'G25lMdiIps|&i< ϳZfcDY#m=m?j&iK$lEY@C5`eg49͓$+wcGs\s<&PRDsWr:Lva3jx Zd/~tѺUc/^nEWփ80I6(q\1FKѸXWXQANnA7 Y(%[z[haZ:B>p)Qp4x{PiOZl@q>. 0:/[ltH{/ydۈ9 djSKֻg]89f]5b6rݞJnS%kYI(5)GA4XT AAA40&լa_Bx&z{ُ]}fLZSvd'1Z:YzxK ;Z`}%}av1. : M>:G~XQ5_ݮQ}%YaEGQ wqh`ӮMHq `(!UhaQE| ;O\=!0>-算:֎76 o5Lh`DVˣ-7$Cu UUUz腯g\頬!kuFavӰK9F$q>ݱXH$jIx@.m:!(%-{AZ`bPVp>%CVMDuIXSN`GYsLкK[L )&>ݧS`#Ǜ&Αe8x1$\+=vk~>ՓBC[ x\uy6P-U%7w%QEI whe40N:#'̤tun&ٲdY}$[8NK2/dso)Z8tH{]^;sS-j9i-l<_{%˖.8cG>??1Ux|RN9ggΞ^۬9sYמ={8JTΎW9WNّSOjϞ:{ZSիϬvNNzʚ9RɛyjWN 7ͺsvs$# iNDV^, l>֐jҹ@ wH lVp}joJY}8fɻ]SUzZY]&Ջ{?>?~g?LIM龴 %S*i'؎,=aZgn駖B݃c1;j]7cD]zaK(|o·_#KqGnjjZ{Ԑo<&՝HiZv= {v5эUߑEΟE~,A5nw{'^|[eW^pʅ+c MZ;o{vyv3g#kyߓVGlpT}5<_4V^]+gէOמ92fxf~L$yzxm (um:|v~fxt >M{kFάYӴizzt*#:) k׽7fFGq^wi, hAףz#%q yhfqPǀ> 4L85FwqE?Mㄜ) ,LkIj6Ȋ:x4)CʑWlh{Vjn$y8|((0$IӬy*SҬ^`*8% 0]qkWqRv^l7,TJ ڕm*A^EU8 Q7sW-]|IxmEKv2:0 #GC(> 9o.99O ZI0 Gqy0 7*ru|ʼ.w!)ޫ)AC&U͠wB$bXSHqzrPc٩))>*ɫ2e<U"ţuF}Qr\b+.Ȫ_5 v#+e ͕[Θ3`Nzbpf)e~)KO^sՁ)0ȄIJ-"Q![uI ,}vsR~Yt e'oEnį]/FaSiPnZZtWPʐ"ekFIcezJeT_[7I@MϷJxx00?IUMB>)M*䩯lgj(seV$ν Np,̵'&VA/ސgnp6~Onp{}@=ʐޫ^D;G19꿨5Ԥm͕jKݤVM_ TOZi#ʾUcyڊO7ƥ/л m(G3 _Rv0;q&؅K-KQG'pYY{ddTڬTٵ+J U+S8Zy:S͂GZ33*zx[jej{u]}ަ<ɦθx湀P=Oe\έ$H$(f9nf͸h5y Hi,@~˒4c 2Eϭaʬ.HjfL} ΐlC8'2\@4FC)QP{3~._I}+.F)o,BlڨB W7@~{eTvaGC.b@pʄՈ{ 4rcҰw RzW͑-;#q\+q8 ]~wz~I) ď'xgN@N)N`ƓF@7O-4je:;IHz/Θ+m:qe%.ny۫;ZJ%*>%vFuH^{T*Ji&)w\iTix@ bK3u|f}c߯]+ iߑZVEmGnu;SˬW-:oD#$*>߂6tROoH  \q ~Q%A])~eZ;8*Zdz59M"Ch/I9!mV=-l#J}W6}^<'iv=SgWm TfHJ?u-S2asJgԿelI$<(~.C|g E5C dҏ2uA9j~ҚkZ8~/)$G>3 `w3@wKKצ' )ţlO*q>H j߂S;^Th.iZjXUs-gs"w 囻 ^2f/9vx E_pѢEEc*S=wҼ:R9]}K\&O͇)]3|zxm j(j N(r`` n$QIII\Fi bɘy L%MԹ&Az 6/'.jd L'S+"%Q,lWC`fa@B5 Se iPo\”H=2d\4L~@X3I3+ 9;AnoZ֪]^yW8r6_vʽmȇ 0 h}9mW*rMxŊMKmZ8|ޮZ^&oqQ3{k)mȴFb|ZzxFy^5%'[ h(n8 M]ʝȱj(Q3MM1QqbҔ=)R~ۥFÔT̑sry6-qX }UjH9JIZT܂o_V'tI^[d\Gن#,gUpK3Jխ\UFju khn5li7p6t3j#H{jŢ圣>j)Qȶ֊FRbKʣUlĀb$+iĞHGZj. >t1^Q/2cKݏH;n6˾̞i-\Q |Z/K݃|J4}ڊ=BSRdRmoq=JiE}KwH9!u~|?dR&Q֭#hGN<7YhEK=wېvRݬ[M=9r܌R랪{d>jZ1ِ^'=_?Q_U86eR!U>WÆ$wIKhR'Qwq$WW(uwp/*z1Z6T4bM_P[rܣ,5{&^z AvK.{,K(NzB?K@m~ד?;m=jezLi)SϨmv{;lhwT.YRܫ1Wi* &ۀGhvy^oƍ&UuNMjPӬQ\0P&~ͤ52.'g$]$QzF8Au 3'UT=h'ջ,w)R=#m|vJ5ڴQ+}[͘z=-0hI,mѼ(|L,OMكo2i Kd*Xz -m4ZC؎{)ͤ+Y&-| ;&s ۧP)czNjayR{vOԧhZ|Hڎx'7pmc k3"}VY;!jxM%}},L]Zt\e3~m P˥qP;ݢ݇﬙*)2S4ֵR C7 LW北7=fl/=*[[5Y/dB,tݐ_KW?%N0,ei)bԑ r@bFm\מ]k5c9"8sJ4oo(YVpƫ QFI'Jd?L}%nx8#ašJ24麶 s0 *)Ir9N0AqNvN82A?x߅YF!gyZZZ8"g#ZJ 5b}Z]fE<0\fmvy؅](q¥+eE󗃮o( ,gϒ5,='|gVh65bTnע|p=[x׍jA\(o捴Iݼ}8%B7cG/n-~MVfX6cZ cdi?P`i]-?Wdcʕ7f?ެfy7Py/ߴi=.%.5UDu#DKjrj7q^K Wӓ|gBZW[5Fi|&m} eޮ"gMߝ;eRB[5f7+2]oB<;ާnr.z~.QsAwe-(%NXTk(%c=lW5%>BO쑙jHqK>,__tg_va{H\& ڄ.\tyHms2p LF'w:Cb'4K|_ŻqBO#7Zm gFUߋ,M':݃0;NYskP tوy| >@-Ȓ~`9!b",&ZU\/nx,=Z}ØH4J4k$]'I/ C׫Iz~vJ(+0L!ݖP'E8;$nTA*IX)M+GjF_LL=F8&#yk=s H8~QQOO2k)Q(z_C[;97)NajZiᱝ=a{tZ$5Qt0j+2o. DV4lgҞNu|ڽe̙={k>'N֓*N]Bh8lC95r+n'Ee9F/+M'-])8Hs%25uCkUeݦEpNrDڐZ'i1 L .)E]|ZVcA~:ȁʿ]+UKر8_RLO^ksJ}T'[i-fnQ(VSo>ZnZ(YG^S>ߣ4~Smlj{&$1w7^HT ſz-ߴQG]mggA;$ebX3Mob7\1v3(+gBN辱^*='6n탆&K?i?v+-dxWM)A;&~Zb*\2ZEaP21eJ˜vI({yTjtƷ(xϭ% 2p``$):Nע4Ek8&t%iГ'Kƾ_p^܋Ҭ|NJa&!wOqԩ[ x:nQ-Pq+r8_rjQJQPSz ѺT-:W);0 j'.q⒓ ɋ c=0&KGtq44uE8ISfe'ΜطS 1 {ØätnSs5q<=He\i}mo=&`> Rk}ǟ l0z/{;S腄/EޣiHPRyH|)8#kJJWBw8OAF3F|M\i_eky&_m!>47I!({L*9!i MqO/R`XC P~c:-z>o~[$N 85}D}>jZV)jxzSGϨW~u ywDyB:FsEΞ1o]'"k!'gVx6 M> Wv%5>k "!O#3\Z7;P;'vX=^-dTBHR>1{9vsԝ8g1-FJ-Ic~:zsL6]'{WsuH3vi}t+؏zbkE"}\є?-:pq#b%i2.CgQuyA6<'!a !0r!X'2Z9{꿘tt f=FC?yrsv@GuбK̮/YK5jg.3oA?[A8gIKzynԜ^ʐJb\5FhC$5Jds ߯t\3J5'Hj mfը֬e!h:yCKs)x{eǩժj5ʳ0 I=\v*N?˥rqZV)^WGRF^NRKjqRKG;B 0JMԒjUPvr~5Ɋp1m.ߴbŋ_:*v+m} Gm)=+ğ|x;Y;j+&v١C }gIg0JM#Ϝx~tyGGIAݒ-jo풗֞(NXƑh\5J{F*ýݞI/ 9)g+ꃐJ[RvG`Яn ^PrKyFxsn{PJ8(Ws4q.1?Db@.FbXCvȰ\͔BSBm}%޲WLУZMZ%lƿ) R'q,ze|Ҍ)#vQP|qi^@ڃO"V{a+>Cko,{2D`Kf/(G7KK 8]B:]Jx=>ҟ4VF'ϻA|B,IEF|ר'D-=$NF^u2j,3;@m;oBڃ525e^D)}H[N jNn 6Ο'(m(_hR@kjoY:am-R[bZ&5_8Y瀯E*nu< {H_ngLɑX\ɲ+nTvj<# !SN5nPHS'Cֿ5u.Yd%/ZO71zzʜ!}O,Ic8t8cr*:/Ba()Sq!D#(^4Z }۳h])PӗP 'YV*S,O[HlDY)t_y,~c$AT/< LR1t)dFg2<J{u.`j=LTfTq%Uqp 3K F#ƕ\VRf\riLx\1+RT \r҆-p uIBLw~+z@ QFc戹2&߯!uPTĤy9FғXU6÷ߺwqҼ>r ̥V r%?eU&`#1iYQ9e %Kgu3NT^ {C^\+ P)՚/iŐ u0ZhCI|8Í2 kvzQJKmf ?VTlJE>q|!Ba#ϒ GH_`$8fyn$A<yHAIeE6VԶZU7de8f$ic8b"o#,f WɛtMW,Yb%AZ`8m^p-|0GԉўezT 9c|yg=sͭSseۖ3f9,] k?t"i Ob|B>MPv xu`YP;ML.4!Y#٤YN&#xs  JءkHð) &TtI /dRQō@")p?*bQeH?7hX?&9xnm߂,=ls8Aj݊kIl\.e)I':is?ΌP[~*ebPPlEHݩYkk}VG>ܷea"Cv Y@ա_BX4ꥐ] ؛6)BL|ƊD a3u(}e;MI暅9v%&)kthI8iNbr)cM%<-:}cH7%9xajŶ:O_>U HmC z@i 4cj6=!{7ajAܙZjn+H-J~G#OϨs$'|+srjm>눼:.$~ >v|7rڬ:n#3WK_sס.Pn6x;>ѡ/z׭ms7 GPvU՝'S .b([^6D,ooտWi{,˅J7oDiI\qRerij/Ub )p0!Ue!39+äg}iX#Fya 4,>Wxc*SnCyfSq p3F aH+Qn,y0!_$bJJW< dh`J::wdy=Ik9i,qYB򄌑!ڳazW"]RY.F 0}K%^zbD= AԹuZ^;.yt;6=e_F.ݢO~''I[4XԟtY} *@Zr}\Fj3E*SU[+w Ї$J,p1Wkԏ)vkҎ-fːC΢yٖvPn(vjxJ,`pOK󼄩QdcXB8>Au FiVHJ(BلDg$=oV۔UgGMdspA`CA {=j)P. 4͟_˲0k2tA"j.HY*~9>o$ MXZg8+nɭ%yQ\H TT#1BEyv۶qL?{q#H=ߋAvQv9ڜyO~1S5g,KTSkPn;Wi)O$u1I?V:$Y_}К@R(VR4Qq6KɮW;z"BwKCFcXC眔LD;]@pLH(hz\ϽxϤom3JuJ*JR> )љEɤFy\z:I<J =(9_ K VYomv]fPfgy \bѕ .br&i26AH -NǶԱpΜ^,ZSYc")")$<9c^(cYgzlgJAZ6c KyA:0}6eשUkeQ]+5s?ASYiTD)c9d(FA1_4"~C8O*EJqTqΌSy&Se k>F|Z>+7-ߴhe.$dɓ[ʡ_ yTĨ.D%QRf9/'KCG14@wǁ1pأ^Ū3ў?sjNH6Gd]ҳk:u%UK1y){e1;tEiG|n$\Q*I\p%G^Q'fg$^DskVZh%nF{ڞZͯ]jm[*i#Jꀙw=7ųf>/O:ۘ~NQJ0ukTw^:ޡ A-8W?B~nZaw(OBƍb;$[)p9o!db:T_2|EżicjA਩ߐjDl|C9&-譳MޱZԻaJŐZjcwjٯOQVgMS7攇ÍtY*fq]k֗ KaXJe꾹#a}?? ËpJ)ru隒Ŝ840`ܾUjZIs`yf0K"CCq, I(ɳA~v$q-Z$d:z x@adtxEf|st1zqAaU@QVbَȕH0NϭelR)9 Us; ^#@ofK9j_]x'iae_تi+!2qvBi LVSGz=U-`5=L;sX1z^P4 b?^78%Ti83GIcʊߔNj父|,9z:g$δ,.R^RE\6qPI5~.>Y \d;fC3w(\![QnW9(U} 1)H8|RʵmGT-ANKR2XjA9>hH vw>&GVxJ#qsVN5-ڞ:xmO ۏiImBWQ_ҌZ~6u\Vk=Ͳ{ݷd!c@a~qZqoI)Sa4%Wfn@:%HŴeW[Lv{,hI}bo;7AmvfmX^h%t˗-\(@SZx/b50V=\ H_yAY!ǵwΘjO;L=q TLb[Dyq̉[ Mi*8Ǒ'EϮDnZ9ĺJjߜ7.{H9v9dBZj".H9nW)GʎSJ0Pjׂ=eǶжxmJOۆX PYi^-ߴA~~$:]<[j`ZσyC$"EM r=/Yh0,̯F)l-[znS+7[B`&[%v$[,񄠆qȺNdlXB{մVE=yveFw&ˀY2wrswEsH?QFm:%'m|=hfkvբ;']bFhgmJGY+= \*!5F{7$}`uVۤ|t\MKb~c%O-8>޽WmI>u+/Řf ;p~p%"K.勖l͌otO~[F02rf͚ j5CևdqorY/Ӯ4:9f)Q4z5yh M0zF8b4ü6f}f#P1J$=I]#=Nb-ɢKp=Fˇq9u M2FU^unf:e' (213Fm'aXG^}ܠR.e] Or\y5Z\,$OOظ֋W,^yMZdEK~Ԛ?΄Y`kzwBI6D8}dn$n l }o^?ۀý;&%ySOM :1[ R9)Q\8o<^i2+K!HJ_gpe1̬"6j|Q?ﯲfvc3R/CWiICo-xLjJ5^Վ1԰^0ح,u\qS.bfYX6f#oYwVl%nGq ڰO".2m7&YL+ &7m{F;eIzl^ + JIWRC5嬵H7 pbR@3=W% knf._Ĝ g[M?#Jcx&`=nV\!Ʒ1*; ;s>|O_n&OX>Ajÿ&(FG$ub[YupX\fu*W*h @sLJ/(F_0f*_ r\رĄN%nAH~A1 *O=uZ(ok^";d Sր5;M>n?}:I{~U~˕#h% 5'Ԩ,Oeu=F곧W7,эZزxJCWb`3.I՚BTTbʒ< jQJaH5iI=OS굠q8gC`=tCM*Z r<1<(aXZح8mpz>D T?BBuJ9I~ PH%viN( Q]~7ӱ&'I.6yV D޸ !SiS);.m+_uM+IJ=-+v1ށc LFŵI(zIiO]y]n&O'6JgVճ)u %6vvLJcU{@Qd8rP4QEޭ+N"dXHfNJ%9tĺEA?TJuÏ%zMZ?>cRA~ ^ÔjLl'v=猘1.: ƇFəo~Xڮ_]f='>ƾc*@kOjg,^ypxČ: zB)M!gQeO_aAk A4Lx#r:Ȫu|z,VsԁCeҎY[U*a=!Yyi~N46ǻDMSRse-KV6C[mApdJôo+Z +B>#|%#P-A T򾿽n! gƁMf֚{Ư}Ŝ{_hzO̷ڴ:RZ4o q]/qݎ1v 1S?Ӟ*YUR+iV%.z]}j:<78n=zqNF(Y^7Wtt Nu+'Ar${XMFOd)$; jAsWj8Ȓ%qMRyE;*=`m1q\gpNVUIZH_!6DqѼO.<.?A/^2یtfZ;Ma2cyDrEr*SpbZRH˟YmpJV`4gt 9oƬuݭQ #GHPωT"oK.Riv!߳pu)p,v|CF`TE6)=qR2}TiؐEO}*퉤Ƴ.%1c]mzX7vrYG}o\-S2{( Z #ۺvHA|vbSIWRyU,rA_ A㕑tҊ 5WV)k rދ-= \g f)vZRI܎ڸ~:sתƖwmƎ!IٸWy~)9d9)TBHNak }%B^Klңn܁Ͻ(&sݷLMu 8w)eFL'bO [ЃcEu'6/Kw{9&.I~GO sC!_ZHnJ^9Sg7FS(W5I5nOrk^Ȏf}U{_trيVmʌu9&0|S*ո7y1z7y15:0݈ yeFHu g5pR ^.ǁ8ľָ܎_t0#z7Z Z\QTR 89GSbCUSv8M }g)H\Yf|q Ҩ9%Fku\[q+ Z9dxH@\KR:~xoMH<`Q0Se#&T': yRjiȑ{%I8t絕p{E$Ѻ)=31+;|XF f";&ˁgZh=-vN*[VqFGd;f7-N<)H29[|X!ab_A|֡w.IK,^ɟPc]02>-ܿ<"uS-_S.X ﴞ4Ozu)uB<8%gr߇bǔl6pby mfSJ}-G$'R +F6 0xd/!+h%vɮخЇ'IɓQ7}Zuw}YgqyېsպbCCF 7sxqݬ3k2PvruӔcڨ՛oq"w1~(_<~բk,]|hC]@cꨄ2DeG0h:!8~?] RqxR"l\O4=vA:4rDDhx}qIg頄z+XDiCGR_h1$sz,1LwI7uY(ݯPܯt3v|@KK|J?W=Qߊ /R4yE$*"|I*^` / h"b8 n`^\p?PF>NHM*qc kWjhZNH & Έ y3?4)N> 7 ԮBʨ JՏIҶ}Ԝ~di=TT+XۑNeLK]KwZ7HLG%5:͓[%8a>QN#wִsk)) -;emp>Ak5zUK6@i& z;~!11a3R:oKkR:"mMXэjfж:;ѻ6G!گ+>2aaktqܳlߏi|ߌ v=i@0z2KP;E*@?K,C&zZ_Z۝e[OI6x_k~KmQֵZzZ%j`WBk=1 \ufNm3rE_%×/_0frD.Y/dG?\zҔN; CV9Y;n%]g-гy=yARmύuNaB|Ͳ$HjA@(3a8r9.N#ygiL N$K4.&:\Y2|26e ZXV?nya;ptd "x(Wֹ4Og&8r[ضX 7KL3 Ψ ȷ% Z!դWqr06A Q AT$,` , x3i+.?J` AtэYzLaε,ZZ${i:Qa AxE2~jq!<'{GCGñıϛ|^P#CA3ǥP:2Ckc(L5 ̝jcHnlznֶqǠ&jU^9|$ѻQ,qy@< wQ :$a-.W(x(ss+v=P ƞ+Ri&u>\ 3 !yUF屬IJ}?y>5ƃٸ$Kt D.Z-5uF"|scd/i<7XK^^_^+v`vJ` a@FG Y-@=i1f%%g)gDn~L99x ڥ F6J2^M._4:bޢ>ip6QGj={7Z ^ڊoN }>݈:k:<%ZsEJ:)>%UX֖e1vBWZ8yz5q;T#uTFܓR^qmmJe)Y`=Z/PG[Ki63q5ӕr_Z!9f?1fPBC^Yu&zkr`]rQ@"P 9 fHb +}Z{$+1H "(,ɒoO~so5:V؝ LwW {_Q{]~Rk˯a,Z|U .]L}g_+|FNό>yffmԈ3#͕çgr$~ΌIy0LS$uKsQK|o|oPU8c9)y|H}1G <mS9;}JSҪRϩ=&e\eGYA_S/˵;R[G}IFe&>F2\0 9im<_U,U9FPG]ξ$b/wyZ= whU;(۩>$oBiu3\%^Q.Jr¿9]6ٛ"lTɼ݂c22/|otݨHytL29ߏK^'=2sK3>QWatxG=¿u r.C87)̫9>r ɋT98ssg$i*=3gv2?~걼9fxQv?RQ<{Rׇ{J7iP\Yl}2K-p+~S݀_5C,s#B=/(>+81c { o)̏)V51wA>@-rS$<ٳ :ނQf[eV٠7jbOsԽ3jYRw>14~j'f{.P,\Fh<cqƥ+W3!' Vnu B jծVFFnZI/NİQ-``32f/ F6̇yg}YjjYͬ`Y#kfnB&NyA2Cley2sSБxqFĀYZlj0kh6Ef~+kz m6UJ(\pAIիJV~dqjeq|?CTl!TjX0Fx+4m yVJ@CyيCP^d[*VGԥ^ 0VR+Ӛ &:eRFOUŅ0v\M cыQ',c&kCjz{iS?|MY^~oBB[(C(Ӎze{7 *q5|,7zO , B;^;,S Zk(<. KDܮ/l8Mg; )ؓN2&,ֲ(y,w奁kB9!Ww' Ջu#ŴuW+,Bk&Ʊc]]WA۵ݠ3 Gz$t Q.Us|^Pqnp0퓿8{̕=39/44Guzu'GFە񍪀+LVϣ=>[Q"D'5œZj[hnycbգևkUl/^{ (9SؗNOQI5cݠŸ} O6}z؇rui0VM ;v#38zZD֢g]R}D0\X10O=^!y'\ZFqFOLՔ_ ݎߟU&W;ЗncNk'G9{=q-ysypeư: 4gӏIf@v]ZAe R/[WNcJދO;'ۮ##ա̚Svݮƿ<94Rɇr^E+CMgf3c^y̩ʑzyIgx6Ο^yj= :#Uç#CVW8%\4bN0  JiT0Ciތfyq)F̒0L2H$[e#INQvկnP ܚ 9pN^("۹odp:^%X-Gr RIq~4e 02,e xDd"S[@4ƹ84 Y7oWu ȕN%`eIT%q6Xd`Se&6F;K=%nteWqY imNڲ`]msW2syJJ;(K2̀ |e SA=s[0K 7Ւה,b?ʯyO^\e115O>AwoP< \ڌG"|L-JI9ȵ\˷9Uj`v]iOW9A #rޑ(`ڋA;W?>m6Ϣܼ@Ǻ t\zM"i.pQ}1fl:7>[N[pL_D||.]\{xf0c$,nXnPFYƪxը:Pz^Щ6P8-,"f I,GW͒ˀ8-z+ߤzN@KJtlM\ؖp\žU\PYҐbOJn-Yv^:FB+z1e{;ML6:gbԣfs', 0@-ָ5Y&+a9%mP/,}B6m9hTP8;GPc a2ߘwXXa 4Z}]O/jZFb3ܸ)Nw5#{dZh|!}21E; rNT  7nSm2yI.v-ãbΟ7GƥsjCU!.m' >f}(z2dL;V0dk$5~KN@RX{G&os>~RzթKG"~PrU*K}uv7NK3IZGl?*\y4\ܹC͠%n^D48.vpms \ j4*(W 6t9_'N1c~]ͦbLI";Ӌ/_ZVkwЛGY=q2q2%vy$j$QFII>'H+ρ.ZUܤ$(0NB*A^LGjL~QVCCu\(\s*ǩ0^EnM\NuQSc׭U^)F$1u1)L;FAϯ\C4SCu\FW @;elU# n,SxEK]~EۍҐR=% ʄ0i,\D@mF!soQ5b^*s>,fo,Vzai:\ҋՓԽ{L(<꒜{s@ۛ EX(D]254m j/,MJݺ?5zn30hp/;eƯyB9flMDFj8JPjҋ/ꮸrU /X|Z9Zx*'mԚQR0;f&:OQ~r378L(0Q_=J H>!V +TM(zQ-PC] zz߾-W Pj19@ < k_>v[>IрOegRX!lTzth-[}YKN(>ѽOpsQ{?L^{.]jZhд\ մla{Fq>Ѳ^̰|֊fǺ"$PS2,2gFJ+5 H9nV\$vP|Q[/rN#kϰȼ ~vk-\}1 M߉wp]݅ ĪfrL>/[Z1Vϫ/Ȭ(< >'=zU]Ʒ'gP4vmTz[2:jX@]߱ZPo#=RZ5flN.z}dW\V)bNGWsud{NwYRX4t) <~Pm80pa99Wix,;udtndY5$w:uwKN2^Yaފ, 0r]/FQ)a" 4 [thh}V,Pޤ !&x~= q> DMMM/bEt;F6^ ZcL&Oo V֒n`(T\RP($uLi @JwxtzXY|njШ1#Ҹ$ėY oAMN踜(LcM71Q1o ^Z JuU u1u{xJD\t~Pz(2:%( B/zR3{]byN{rZfIgX)֜K)[h:uڦ2pT1C^=tZrrH0 (ޤ#xa򬹪؉pu9ϢG;k1U1Pp,kU8/?B;逸V7->-[iD%}I}Bf:>h,z2STDLC5-%\(CV9|C/]g)%f??ݱy&;i6ͦJsoFs3Q\tU ,rxe}FW5XPNv]u+LNXQ'#<@AKսzX.U*U\VR$< -Ur7Kq j1][qH;@5zOHKjYm-ix'DB͢cozojeEAQ882سCbIa{m1Ý|ZUPtUSXβ<FJ<]i6/ի2S0kRִNq3!xۛ]ғ)6_S-vc_CNHX3'% ,-5s|Zrp)#^t6؟v նYqtzXV+Q$Οn1%56' ~yѴGf m{UλF+lazG^(_1ƒ9R߳)UlX[-KP!Xvߕ-ٌ`5Ꟊ|/"z|8X ,K6!tEyypBr/8JZ@˥jSR-Aݧ(oxO0K??*c}/̓wņƒ|jئV{q>iqj6ͦsExb >X]prZP/[(R+CN?`M$V(͢,Hw {w]ϥs բ5-H"z&DPEu9[gi+eNҸ%-d4Nq)ХtCӖ,W:ǹ!"3٣zLS1/[ټVV%*,W%Ǵ5j5!5r^UCgAK|CGs|hCm]nd>X9x~$素q#l{>)siꋲҭťZÔXv`M)kI/I BC7 >&FW}"~:i\u󝲾hB^P7uEZpk?Қt8ɶt5ڎF٤u:Pϓ$uʬgFeڣ4v}83iSmMr5KjΜwTk|)n~% 4'O[ե[%P8؏ۣ-fD9 2C0ph_DW6~5ڛ"<ߊ =/#qyB,xOGAZ'O G{r>)AyO&mj,Zp:L}XѲ|? 4Wj6ͦ4sq{yyӎy%ꃝ=С)}&Yf,;͎ 8N ` LcN@L?AaVJn-@8.|ω_;U'L)wݨ>X(L8+2K)HsmX2<|1m64 FQDBdreTqDbj+i[[xliSׁ{H\^jkgs.P}bwUt %dD5lHo@ڸ_i%}XE^Ynރ 6U%@KTJ},m?ctŸq圇'sUGuSb*yupK>oDS>7C*r5Qb]_'DeZOKLwC_+%mJZ_n6#fi|zO=,jiS㦖9݁~cİ@1%F)zie!D1v j #( 2 e̎M'[@p=_sdmަ݁nF/:b蘲h_g,Α0݀1flMWZy6ؽU)|wŢ@|˖.mq,CerRӲ?шv>Ra̕ƒ++WpzפT5|3e+W(Uuag͸jͣz)L(Zi3?>~m0 V3@6 3`zbB91@j9@IT zT\@A詑徰 P\P#HfԊ*_1%Q+}l#Vde\ 81!N5cVkHCX1v9yZ 3E}YRځ%xBJ?і =>*GsRZfzj r񗀪xnZ`qv30uxB?*mhXpրI7?8Rk5qL5L"p!(1{<_1WX߉sɑ&^U/Z`k-풳 K8DÜI9o7߭V9DS-MtY+/j>.KSj1{~f~(t(y aMXZ]j-2#{ _gvsWޤzq|Ö_dDvcR%ACt:sCI\3{&ԃ:+cwZL""]Xj$#v>C_g˝]=|#_+co!~6n]idy)Y '⺩Y&QμYvHl;aX [Q@'UM}J,g(ѳZiloO[YwY&wne }Zܱ/ƍӫp-Vi6ͦ7JgPA|bʌ00jAݔbɑSU(0CC 0Z#dvt}kNL(BkU?[@4y!b@J@Tѧ"Х:f3ΒW}3f_ !ZVL aNG^TK}Z'^k7\d,afV7[1y3AP2/Ӯ4v ( yH 9G=itDDl׌q-" nġ QT.|7X[%,dY C'N(0ox6 2Ut>\]pb_W 244*ӵۈ^nWLTMI.2ځ/C,m :ޙV] {G{jtWQbMR/-V.]mq9܍ L7ԏ?{i:L a<&`X qQr}QI -e7% D~ר̵D~o6z?/Ke2|;] i)}[DazQiu%t=fۜ$yXF1`w݃ICQ!]ZMom.jzs-&:Ux=,[k,bgQ>w(ζ! j&J%-v)-pl<"#Ky]J[.꡼F%q?g^@0ֿ]zP qޢ>(C Y@*ĚZ da[gs<~|k+iаV5pALJUgMzt<*JG-[zn8(Q8}m'M=GlڿSBj\Bɜ?apBx#A= @3>0+/(γQ$PV]sԤn^oh\XEwWtCrkNIߨ~ /` c!CM.5_CG+Q3$n P]ǯ/VsOYtt"IB(*4~/ Wi穋Uns/YH}9Vx3 OGFNЌ8F7r]Q.e亲C>,8V*zsި8QnRJ*%~8v?YFcJ?OdDI7Xj%Ԗ ~ B#б/wDh'7h~;IC`f+E($C3Ljm~- \~aa6Pqk^L\/% A'MmKkx~ oh~4yKmQyIl&6˯YzZ0̶ a)+?ȅ2BMX(բv6Yŝg=WIIY +kW, |y omAR o~ʗ:J% A_RQ$(j6v)ac?~SWX&vZǂǥ˨"eۙ m=7[L>o}Y锹9B~:Q*֒i#)=ͷ NL {j :VQƀ@^>+ZWR~y_FOnovWL:JGgP~+>uur5iG/Fu 8 +Z{E$~U6L* ȷ44Q8>4a583 XÉcJF'\HHkйSvUD;&*ho,pX':kU :BMшEEJqqS bJ"_Vm*KJ݄{\=.֛,sJJ?v p8(ڎ-~O=Tx9$PX܁[8|?a(͢$d!Uw;Tڧa`O~+t$ѓ8x0֖=lqbany'4'Уwm(u[@RZfvOb11]%is.73Wz=Q<G-殜MG)=n`qß^r0ZǍf߼թow3F8uDbZ:O՛N[ 6f0&aD fT T b`_1]{1CH$s۷=ϡCYT‰ z掷lS uiL(Zf?>Zi8IT,@I:zLŧ$h7Y&FiH;V3 7hۋ(sE˼6MmMc:AOӘ87$xN;1~DqR=`J)U^JN E=`WKJǩЍj; -iPqu(yU5KGW/\:IB|]*]ThB tD  V{g̔X4etN%0/(i/'Yv G!=:b傸E[GER{oԹ,[; A_2~,Z2C蟣 z9V\S1) +n7}*0`'DҬ>qHʔ7j[Ⱥ)Q8]'Wvc6'@w(^B JOk0sHz9qGQ'jRxQbI|KO>T8FݢGzyZŋ'ުB{MI9R 밼]f@%/%hz个[UgJ@Qg>G%1sк>ӕ7bn~ um\!6̸Rph6 +I ߹ڧDA:5fӏO\[5" J R0*]&6O}o~#m`^U=V}|WMj7"_*AX8̒,=ϧXW*vdWRƿaTدժ6q%}߫0 S"I/=*1}!o6#UgӾz?TN_JWi0ju|RD;vE_ժU*Yt)]9w'_LΛc%Se]OΙ"-PZnTDk(8S+Es?V[Z:iɟIm[[#H& ?UBCQ5^cMaqFjjԷI0ѧEt9QNWZvmΣUDPیUP+̗vN85 8PYo(mx]} P%TLϊ`i gn5)_BoV;ĥM}Eq\h\x?_(uN4+ZV"ڝtB&3+~cvmf7cI?nzFfݨ+}J~\\S/N̺]- ?l8?)K(,\5c9:UehˍT֊GxjpVEP4 N.spzn(t>MoF:Ͷ@_n"nG]LCrW NkIh vtL4aN-XZJ.ĵڋUXv(x XDzƵeAw\bS߂rJatim"{"2N5M_]T!,vˤe-bҧ^>y(#5k"[$Z:9M.A 7Q-oSBװϦ4Ҍ=CTrHY^v3X]^A4 N5@Fg䜧iøcj%0\7~&n[÷bdՍsK0* rcJ^TZci9u ߥ4nI̶p` 04zZh8 'f?a}(~׽FV Q픑3}UAM4pWnIcT (`ܠ \*ڬDӗ6r)1 Vޯj>rVxE=@>pn(,>~hCo7t*BNJ/^edm*cnlrϨǥ$oIn(sc*xq+PvFMρ頑Bem@9u-rB}zHh.Q'ZLit9ޑoDžPe~U /kkPP?eflAȠ؉sw/|}`إKq?{SO'ۼ LD-B1E)&屈* 4bkhL44?neIJ ̝ȺPF\ߓ{߯7[-`*惾kAgWjz~HJNwIqzpW?ω렽D8P :.ea0#z#pb&qYviOe=qs频+E vDl6%7+sD^7j;,M<o5>+~ .si?>z<*<{pmEZyAVb䬄 UpoWzeW(Sy6ׅ=7Y˙RZl[0RiS[ FP1kh@qlVmN/"."ZWV[drcF<էWLJ^Yyq xfҎZbMekty>nVqؠl=!_ߖQ4IxH-\oZ&y5i6 "WlA{FSH#]jk\I4:NA:w UϠֹFjX Nvq%oX'7T^Ȑ2r<0o>)~EA`=hs# ͢Ռ`ga?M=:D;接w0sc݅8D YW N ۨbpL %pV&FM7Вߏ>U}@y 5flqIp>^.]pb]s8oF'‰q\iZ5 pAR'RGW JAPm$N^)*分K7IգuDIg[*A%@$K2Ԙ~4kpUk&HV֞6.vA+Ы=F1rk=EaiS׉^z8(؋{@qit( X3W5e =mnn22FlipKJ%sr!#, hpjj<-&fL>k5Q; HƚwM(n omi!Q2?z VdUtt&ZFYK+L+-pj'gwEi<|gۻԵCnP`Nzl;q(1]2=,`~mڥ o]De2U@<Rw[7H+ĨzFN7^q-DmeEe|$f1$ hb =aP]UI6D, U_osOhc~\=dcW؁@IU|["}E=r~EJUWE;j GMmԟ6mrGE]F{\({0Z4}k8sЯ-; I;1ƴ7;(GB&nAs$&%Yo.ۮ MЧVM/5!F%Jټ/|F4F"Z(IEW1iԈA; eUomM?pv=>+cI$RHwoE?3<{ =Gi_[E?9N'f.g.u5fȑ8Z7=gZg +̝lrV,Q 7qLHהC8Jz抽:)om/?<+E!j\mp[sAzU#zq-oUsl #rppsw zY)m=-<]opBYy1{- 78Onxs[w+*֨L"iYSUQ.j'u7oB[7/_=ҋNY]k aД+̦=3<_n@O &S9~෾|c4~iĪWWEt%xl:4A!#]3T>Yj<3<=rZiڧW lʑC3+rI%`7Mӈ)u@Mu{v'9QUeh>ʁ膞Ffb<ΒFϟМ_$Ύ797 #6oe3w rϩKBb>>nF XD\յҿNU`PF:)mWflMp:m|2]cE \dB79縥7pT|C/g3tB$L3 L0̆ϏӐ"Ȧ8ϵzqM/h00ِ <#8tiq2$fƢFq (0:" sg gjӹ݈=0[@^h8vi꡴*zT.ǁy^CyF"GbFRq(e"x54u}*Mz@造xDU꞊R&Ebtҥ n~w4tYYw 5AԨTgc,6oUz+lqZ-?&qI?K,t.T 7 `ș7~iGͳja۰hь+m3^lŞ!'$qq9{6Uc⑭r vUƞW.^-u.-4_0wT3>fc)-,g%Kh 6o@΍Jyրj*|\ىH,AO{ _0{3G]`)-v.]2Z[:q[Z{t/;vZٶڞ22퀥E2:hDgű^=">b%3±-$`M Zw*0OOBU8p\Uګ+KA^l^B5C&E]6/Lvvz1{*OMpfĶ,0~KoEvcJxJ!ww70? W{ h"/qpYɫS]roL.UZhg?"3L[XU~՚]yJ׌7QhS$ zx>w)?*xʳJ#=V@7ԕfl_#=x.,@u*tR]|נPFoTp?d{\ևSCCM8FH] eGZsl%-ASϛ7o(NtdՊ[pDMH@١zjwowq$uI&x޼KZĨ12![-yJ@΀ A#(7'` _p DҒ8ְ䑍t`VP kfIL( "-"dnihfAB M,k(TgZM65FtoYGA^Fр[uwM5ג[qø PZ; ݃.4A7s +!fWv:%V/b/( O'ANj.^s8hzYv cn2[Fv|ԩc'n;<i@} hИXfdotkt8-zg6d*4:rmMF̢F0c mGݒ{t]Mh2Snc\Yˢå3^o>1h;'Fj;ۻ*V  xSE)hwrS:%NЃ63)y{Iz}Ոon ѧsݩ\1,A7"kv L,wR.]=iNb I|93WbSrX8z C&$j5d Չ=W}ˢZ~5A8}EEhc2ށGޓv~>(Gy^Z8}jOeqp΂c\)PrM]PiCÏZM >ߌ~ՄJ.+Z@Od}^G(ޢ,3}u߃:YrH\#u=ĚVbտ=1UuРc%7gH(FW-*Q54~n>׉{|F-~E<~$#8K"͛;Y- J@,sQ B-x +v'-㣭5)0M#4,㶝ɳhSi,øBNOH -P| xfk"zBڞXkqZh3RSA~-=[gD4x"D[s iZӨ]h6ٯb& w9(ZSz]Ɲ;Q 2>r@bLMP\gh+j cOf(#S;eÝ :1`8zz_5pBYҪP|YNz |ຎkv̏E0̻U5%ت"kͿo4fӏZg~cC`˗-UYq.yd\~vRwo:V1EnT-nl; ^ҠK7k$qWU7ȺDA68.PW=j4r-AFЋ\L\ۣO0Zգc1NA2[rQw*v5A|'I q0aEژ9 exAF(O$$^O4-ʆh&9Di<.[4i|-诫 }!Phb(c60=+u69URQeLS6Tcr>&r^-@H-ߖx6dZ vҵiOoPEnz^j[LlK>b EN9&{wYU4-BNV]9GN8z>ZF}uv>BM³ǔ2{Tꤱya Kqƻҭ9J+ 2GVڻL}NX.| ,z1nmXq_9@#)| }^_U7ez=LwPUUWZAIa]0זpӭ<`\|R6rj}fV4V=ۧ܊gNW+gkv%?wsk*j+*֜;}rͪ|MtZlgee}RYiۧs\rf3+5gO9]Yc^3|e7prŹZqigxչsy$qQ~%^eib{QiEiw,UTqUq~-ճr@'Q+p#^PUڪ\ѥTCSk;/Ij=UjgO) ܿNz^|rMv,1,uBuX]d7{1 8gtҭ:~)މRTz~??OhWJ[>߭~ |W;36b ҃oQGD)ԍX |>vh#ZI& OXc1GXzF8:ޅjZ-ꍠ<دJGm@ [UgfOۅ6ԭ2ie=;:UU0ΫO"_ęRz7畺TCaMף8_,SblU3q\#}R~*uG(_u;cр"ZtuhࣖI3i&ͤt_ۦ+|{m*~Y|)fߟor>f伥+N۵bEl8]kg6l7NjvvmYx:9SqkN۫֊ڊ۵];}z5\[Yn5sksvtʳ5xi̹ymERẂWk*V\쪕V><|R;Lܙjy5)c ̝҈RR^ibY#b_~L ׀:<Ȓ$Y8zdJ\V*"`b sJ OҪ헫ժg^T( !:f\Gq=5X@fgaG 7hIX  z pZ+J5 sus(tn`I]]|?\]8qɵc.[`d_ pruDhy2!t_6cOGz |Z3Mv<"`xe> bzeڭ, wFݠf"ҐbСr v H }Oe2Ps-"݃r >%xkN~QZKp1T}5=&xJ}`/^X[zqҮ,vͽu=6z@U .,YPi͒VReOYr,bقՉ.xg4Kpkeof?3U-QC@hB$WTɵs@d$w֚ʺa rZ)՛1Qr DܣrD&Av &L2;s 9l(Z~nxեާ*cz55uK>QTUx=VEBrUҋ+CUb߉F`QQ*(F7n4l.pv 2ɃSWUjźj2 !}#5d76\yO.}[k<ޫ_s9N^i!si)œfz[fL_>~E^8pJ/*XM4gCDD_.\HI…##*32K `A5gל;`[*W9s.gU(r*AZ Aqzb`躡VUϫ%xn ̖;縶[p ȲFyوli BT,^yp~井b1l0ou,(vm,ɈP^[4D Bg|s~,Nc>0f.`^JH^T4ޙU)ݫ}/t0~q\5aҘB9\HyisEyZs [jDo!s/̝{IBS߳e'nb˝nfr^%emıj|O7Z‰Aښ6X;u+NH/H tU]Jv#eO>cJSL딒{"ur\~I!*YeJ5.em xEim0BƐc/p(}w':m/J$/'}81t_ɕP0q-2~rcy "GԏZZFmzB ^#`=tʽzﰡKxq MF=c"WJ\9L`2U%{'uS.<x6J *e&\RW:oTK{5=kMA:~P{ @NeR^T5VKNOۑ~Ý>ۃn>uQ[I_ݥ$Z &S7:)0г{d\*TPSl58K5fLIt7!ywsԡW7.Xxe꣎7RN, =~3^8fxي}`ʑmEmƊ֪֪*oʎ1um7xpalčfF5h{i,;ט4o~+Ogtb4(M(x) R p[t615 W3gm$Ȕ%Sr]f4,HM9y#]m7A8ga=JfՉ>Fٲ ]+_)ǵ (%\K%׫*u;IT p"00 < 2rܒW+TpR)B-.à/[}ˮ?{Vl8J!L*ĭ&\pn\'z3Ѥ i/ [hiЛgea&Wߖ_S_C(`li)Td_QcdHmj%q\,^+i^rQ ]kUOImD6%GzϴOscNb Zv@!(ܣ>!wDM;peLB+? ȶ]=l/ rb 6շapM[4 Ǭc)ȡPsLzeP Y7D:,OÃ8N:%Cr5ho~P2xR>W=kdJ%ҫ; :+N2КM[[x5-!>+6l,k{1qj'6dTj 6\EMcĢ>-o_l5lT_V7kҒwQge c@\cf|zjжuL @3瑃/ק~Uu@Jڪb4?W.R`5KS͢j$)/-2ۂ;GOc]o>/oS @z)r;ÿ4Li} e۱˜ra&ͤt4iqyӇ7˗B62֙|Mos`z*6\T*yUyWm;^8AP*8Nib2`'$+6<`0VsŰVKbN8j0a&u׳(oe@o*; ȮT ("(R-03V:HIF _V~Š5|ϵ)>,sbU}?ʁ:3*6@T: QMJ8?"Sdt}?4̳09v^ YRKCbfu'4<̀pg($"ա l^=뛮DEdǙu5RʃbMFp-(eub~o2ڼ-"bFyc4:}:eν5kVm!%gG0kĸMDbrqܥ^K!yLMRN9 %Wi"0qmHD:|?V Wu݅q`ΚvUMc(n/~Wj}v4(w{Vn +Y{zfֱ}݂s %ܪގ2J0-듶][~\<?+O}V,}H e2ll ?>.kkA>Zl[O[i "gLI3A'2] \pGF]HWJ#̶HkZ)Vk:X,[sy𚳵84Y6tq3BgRp,i.$$zaB#gdaY%I/FA.qR.F`ҷdKn4†yY T"&SIJ{qA!eq>Ut:=tl.I M%}S^ JR^ihH%{J(9.[hk?y`v@9&ĥ[07aR6Jlݞ-+5NaұCQiȹtuG?$G4Nc6{BΌ7 D DAd֟YHE?TX`CP15=Kga~d݅\;L.B Ri;hE?~ njdZ.H"Sm'F"B;.l4!BigSKKXj| ꗀ;Rf^A(QꄼZ`JI{Q7K)Af}p]um(3+dzQ&ypTZ2&t cIk,641bJoZ4FJalu3U(Yĺe{&[ [ Ν刑3BkL- >M+-Lc?zc#fquQ5\5njqWtM}Y]AQ+&ъ xnRMI&!5rD7 pJͱJj>hnJ{+D3곎3SVoklk!Z+AM5JRj9Qόw&lnRX&7d|l~#lHy+جN|V1Z9_ﵔZhG&-Y/K3GN}ᏂUy.Rי‡;|p%:7 n()N5ʜ811i^#vsP.F`&ͤ"픗b4_?hD*ZHƣ]o~Mes YB4fța-D+%m)=nMj#Zf ȘVCSk')&=]gp@.oRJ[M=M zS$Žg{iIQ}Bxbz$NMΝk7e{ek~$U߯%q7OiWb J#Blϵ=:Q╇JS )nj KNT.Z>zu F^MOI&WN;$AG!( czzLz;֍POҜ 53'H tS2ͶC4RT#&VW8wq#tvEc]@9[Lnj"􍖞3&-#:--%iM0K &MT)sEu5)E?izT8TөW&iQk;ByqgmZ zOyqb`XT[8qK3b . -] /BwH; @3.36.?-.zp*=88rK?}[X/LFfP=daB6kyѺeOx)2tE=BmzQ+7]8aR8F(e6ȬO7s _/> P2 M|RWѧPϑ^͓$ )݅8ֆFϞc+oc1+Pg <#hdz*v _r-srߌaZEq.>]Wĝ݈I6@OiиAzZG}'cx~ _ꏟG}kw[f C8D y cfLוy) ''H.ZHeV}zPKsk*.=u+;78Kqوs 9t:ʂ 34jmQ5GYҶ5M4 B' 2W12q=0шӚ#U @QN1.gi 6@q|Chk !rϫ5=M8'9'rDiQo ݁S.RJB'pvZ9NFIkBɩEg5WPZM$%^O0W,۸`ĴhUm/+-F6Wqvbz&>u^ %VF ]}Eh7['1]>#PH[~s f H? ŝFOqxj2`={{ZvE-SpлKZ䠝':RLt!&%?&S~ÁMt83)y0qH vɃJǏkcT-~SV@'re ^/SuD2{Ksx- ()W(e,0w '^jӲNoiiԣ-u ߧڃ~@#ƻJ9RE9fp~(n3޺ e>%mjGb(v~)_[}%㦔ۍGv;.i(Z[lѿ]j߱dXX7-T/<[H:fJ?uyEmVr46٥%A %zq:S]F %&qՋr=E#ILCkqʱA%m[( Bw >%\K/KfKmcĢuuCG6myC}HcqMuz+kS8fBkwpim '6V %=ŃĚ^w 7zh$baE%,3/;LIR`;FרETǺ5^#f%#ESxAPm`; LsqMo {n{IxAu$61`*ѩg{^T8e̯uhIU|@ނ3J3p!JC׮ E=A\q~R񩝏8C~_>2 `9ZOV%D*NPyNih|+uDnv-uƍcDyDZ[,k{袓'Zgn]nK-қcFE$ `R\kXQQ};i//f`.P2 .u=ʇ1DH9[AI!EDweUS+';eRְ=MPMk,p{F+ՠ} n> ^< ȵ`il޸mE=D+ɕA`*=>##eN': /GtT 3i&L˯){UD˖,\`hF#q~P8ujaF-j1>J+ Z\K"^(8 RR*%xV+NLJVjX"@PK¤; (@q86%Ԩ0'L$my4Jaq?%z{Ӆ?bFq-ub(0 ))M8c\S: FssbJC\uP87)bL'4/LQt>Blyh :JY'0 LdxW2!$pq7%5ֳD5Psl+tBj׏=Y8Sd1eky\'sk(3bF ԊjqkLCc-҆z~J({L-)l3%wtZKWcj 4p2׃qq" 9L׻;$ѱF"P70 vJH}hY߶=ӗ8?!h+&LF:Mm]梬oZ XNG)%KS. '\0&/F}-byJWo4_!fU}AccC{􊌥 s,MM9Ί֠^ ˨X u4܀)L#Yވ]t&ͤNeV' w];uhŔ#ձFޥdCڹr;VуDq`5ݴ6'{`-m%m4HMQ80_3 qK;%-(#QFa]-% 6F6iE܆ *܊hz}&!2RHeLdE~ūZ hJ$$YqvϣSx/us>1_S5kv&3F޲4&ݹO-o2X65E1H[iۥע ^}LVrVI;yFG*Bt%bA@w[*)6eǸ;\Oԝh~U $6Yj.MYX*Ö4^{?.bwW(U0뒑EtZ8k-(t8+3 |܊3gk^%Aͭ#b(') r-vG^QXv8,6c88Z8 #<`E@J s/ ke?"2QϳZKYRjK*~5 g1A20+*:<EFO7fi=\Zf@ `{QY=aPTPJS@"n (rqUli3՜462nZ;i9$*yx!e6)MK(Mqo3Q(qB!Q'Q Hͩi=罍섿0⑑GħԵsg취ÓJ5ۛD=7?gc=N̖9Kf.8Fx3mfebd şڲ[R]ź_bv^L26lmY𶎍ƘO`^rMoǤ}&{;P[N-"~ioMI+vB][mZuD u"QZ ~i?F?+5~X>EV툣*lrgh3PӠq1 έ%[]iaAFBPPE2 \]}ޑtwit:d8GC-B P_[>)\h$foɺ~zb@g:(y8zԏE{%Rhy?H{e{MHhڧwݑD[9i4)9 }H{%?#r P@6IP0:{cyY}R!->`zTU-uIPzm7fN;:"R7JKmݮ~ DzoWǬᏣۀVv=ADmK?z SOI-@,Ku1>CSć \9۰!t*p:+9onf%9icIs{QRa^ :}Y'[~]=9fk/82E 2EEU4#I,,ePUN#TjAd"ŀENMSQ͘Et 9W"/xGsx${ntXrV# Pk4jzc815Z\&I@x9a֌>B`DyS~(!B3mϲM=eS7me~)E]otLAB7!Gjv#А|/<F%Lh"8A{"@sU+nP@NPvK[pUTfBj@ӝusgUrhzz?ɜIoc6Ҝ΋~ ZF_c=, )m%*GfT@qebjlxjs5^|Z5 JoU'3#B%f ?8DnY4P0관s(JHDGʣ15Sg#ݖ8%v{fiE&c( K4?SvN?DciׇpUz Wdqj7#}X)t/RcO몽kR7|\}i4V ;\QznȘ,;{{nPmFm j-%t܅R"8ԳgGFYи"KYV͔c c{GYwֳw /FU"w}峵wCS!1*@̺mz3{/P^z PGd=5b%&wבFUh"JTŠ#-m5v0-l/(s7= `&*)HQOKi)C |#|px7pi:lxʌ;LAYjm˜`)<ً: |VpzcCLH4 iϢP{TMmD3ܪhIfLzm_gj(uтŋE:"՟VU$uFPsN17Hr }J%Q9N-N<@Ckz سJU t r<@/I2ɲ0}q=sHQRCo7-@/nhG_V8Ncwȯ&nZO )oV4q}7p6mr4smTP`0$QB1͜yݢ_q\kOBS{2~22,]MhB )o$(Ƣ8I'YDRR0BXs.6.Y7a"{g˵dM';ijc@¾R&>K$LW7-Joˍ 9/`@3imN  δjCdrC ElE u^GEM8  ϭ'9JpzzcU91N^cM4]i=^F?Li:T<EH9.m6-`nY9feS;Kn+B<VpJFML-V_{/ZߋzPi1a|3 爄R2m \@K0 L?eT\k -xڷJ.L_;oEԸCL1R.;MV1EqX @;3&TG~6Qb - 1RNœ /CGQ-@GG~;u DN8)1y3@Ekez eOw&xEux2F0złC{B;}M;V :Nk=d>~AjGH kn\E1ZQ)*%wĵX.}A;m)ۏ*KümHY=a(yP-68W;b6'wх{{`nd!Ed4y0&P_$^MzT/_6`I![eFHDltxx~<dYŻ;bp*3ǡi"."1$Hz3iIP׫(.ޛԨA8 ; i1n4J}W8v&KH@y-n`m\`{Nl-E _%l0:|ۻnߘ>T˯uT72:&s^:Cm!1,~yQVlyArJv <+'Iz+ Vi1PC;"Nvv1ݥ-K /_SKy[_6HzTED/OWt1^7޷EiŤE>ޙZu tY"vڇy@oc3 ։c*>e޶Uh\dSffLq:)fCr&3wdhϺ]"&%ݣFzgGN6tOFU+Zy#oYpll?^oѭ"֦C`p cfeFG{e}狸¶=ށ8w ,ĴqK͒d?{N_/Sxm(yju(g5-5Rcv&ͤ/?}*v7⥴prF7YXf"Kg[o?ʯ!xxh 3kjZ@iiqZVGJ8j6Zs#W8q&eciq#*}(1 Ag9<h5kѓ=Zj|wf|5{^u݈e6pAq%"jm gsru!z4Is܂[/ nNPsm:6S\v8$;7kIZrvMC qJnF}wh=,ig".Ȼz څ$ z=){EHʳiz Nc#Em >AD. ;th~$hRHcP8KZ@: 5LՀ ~Sp"jOs"cm\]g(iCAK^YSgІ>(bcb@>9Jutbಶݞm6J_WAM$W[@X~v9>"i?n1h{QZ_eլf͒z5#ㅡ*G'QC@mjs]Ž"~xAɟYjzlK- C%zg$~n\|;$:g1"gXgn'qQ@iJ'~O"yo-3S 5- ^;3ְâcM65q7Ex ʠ0Boj'Mj FU 2P?һe<SӾ"'#aпK]RdY%V)րp &j/r'>d%b uIeo1p[blUY%Õk1¸[h _63qNqMԧމV.CI3'yM  ^G/"z]~tFMcF~W׼WNAQ$mFq_:wp8K^9"? $[͹-(M)aw̓&tJ9JyޢfU08kC][rJS~)U7ueRTTR~=:%'D%IȈQ0 0JNͯecWAR TV^]i±hp_ϊ bKNGV@GȎeT[G2|/ANS&u:0Udx2|LuvLZ8qZ^z"Te y)?lz bh EO(CclzD&ߤi1&tzRh-g0qh)Qj6'eJnòM*Q/kCkL4-TWEڙIv F>i+ʶ*_ N}D[>kQ&.2 -RQM:,q+J[㷃 (D?p殝[1_4]eq&Z@D8?OL mpnk28.#qGj.p;v 6傒GʼnzV^#hn_b77>-.wヸ2-*(aE,7E,t۸1֫~ #pf_ř4f3=jĖl>xe4\HXZDI{[_ߟ6p vnCW3gq?!<Xub-%/"8Dtݒ|9p,]7eۭH`RLS]nPsZc~\lo&z9iTrԞ;BqkN6g.%y%[M[ Eq[*zDEAheR)DH ϣ0;9^Y&]2Hk8k5EM}z~J&ru0Lu33l6AϞ.N&ys<'tLf${gYCN_OήllŢEWߠoņ)|GG~yH FġzDJ {Ir^k]>WxjMFaw)-zI~B혼ȼ AݏCJBiѵ~vvbn[cnDz?)jmU%xt2G4f_`T,3 uQC~2JO|jhF/Co:j4"^@mJjI'f>i }S❱NXb4, Őp1ȓ5Kf{-GgDj_@Z]l}TU?1xwS $:v0cxKɫL ?tM-\[/]N1xIR?imSzwID]:ԗ>L؍T$^g=:wI/.eE[GO1٨I ԖOptǓ5(`#m҆Ť>_p;mkè]zqyY|V,Ƅ^ҒЂH ո6 &r'QҒcއU:ENB-E$cQ=v%?cRoRVnfzQJwFUiYWq$Z}I3_nz5BU 0/[摑k]FO mHJl]jNHR"o°Jm@S,{Iт tN!8`Mx7Lrb IsD׽[)@VAkƲmd XJs6Csӄ\6r ĉvUH|VAQ$H{@ru0fJ! |wjoXb@DMhRT^|#%@Yl=Ǵr;Vh6# ) r#1,p o8ĭRafr”?lrn3`q=ԭF~1!C53u OĸqЄv)~7W9a9-WƄ~sb'8]E^{ ~< Xl[ZĿS)FxDxN+_EY])(eO"UU}[õs;N!,Q7 eu_4Fm#rv҂HJEZ:H؀pQ ?!HVMϚ{+h,Gn gV1cmyLF/Z۸syB3Bˍ3R:m} ފ{A~уb%;Pݒj͢ي}&z=>6XN/GFbb[ 禩DWi(C%1~zۨ Prܹ X{Y%WD:-2 YhEb1Ero[?S51dy:J!1û]-s& e 1;(ރJk2BJIHnQք=!a9YJo#Kx*2v7[=yrtp.%ea1(68:C)i5­!9MZH^oS_\1=%"Iۚx ju\ۣ~J53 5$ez泦](WߍGT[78QKµwξ :5<Ҷޘy4YCd$"BqpjoM%#ɽY֪@BptX"qd_=3;*Jaڎ>߇d%A&}f@Bl>0_7 )I +N{_g)&ڲ˯z/[K]>0+A*?`1|3OUjpjj3 fV>9ztuL`ۧ;l'_duev^=WqS(:rtLU%OzwB="[ȱެ~aS1}G۔~|L݅_sNv谺VL}Xoq+m~T?#:$L0PWwΆP B#=VFG߯5*EYmH/ۆ9zi6p&ߏM+??^5[^=>n@Ѧ>oW o'NPys}/>}>G uLgT,94GXQzu"gZf ()POV)YNFauy4ݝ A~ԺSuc c<^8vTRI%NmUA{\Q_ZhM }s\|7\ Mrn@)?n]_%ގsi6ͦ9W_wiWƏ/] ,S87qfܞY=sds<_gr{em/C ]>>'O:+g^i> $ln%.);843ۀ3y9|S˃SՙSgH1b=N8r)JЈb*ŪS)Vn./8ER +qlƀE\)( <'nXnhyv X8ii9aS% IvRtKq,'Vm Xogڞg G(} jcuuD=4'u=֯S\QQj/(*$Мc@0Y|7nlX$UCjR//KVjN27P+ӴV`C ?j&/%I& .Y81pĪ &,[L[4n/2.~͑<}r9\;;$񌆷 ;kZꅢĒeN8>%,,QSrK[dšmG@ g i,1݆J]@- 2Qæc(Iu?~)vi7K KnU3w?,'^^7Dž M px\2}@!*' ύAE}"`e[blE\a'M>9A0`va x1LAw~v!>@APkfO ֋Qa=SFвN8UTfUd)-QuzB V-9'cK2,v 2&2S r/USK rJ@>K8= >+--1p|3h ["gTYK(3j:-2b@9S ];A!j|x3] %\YmwT'm0bTӓi@iE3ReN:^-˜2퓗N ?@ QCE~uu5+epoEk~6)ei@q ݹ"IϘ28aּk=_E}js$GpwSM27nO\PWa*"J]d8"KBy-ߌ>oUogSC2^=2(ѯewHgy}Z7]>'Y`=F]>q?flӄwڜ|rDv׏-X:J>GRֿ"mO/?}38n-VnfVe{G 8Ki=O"@iSX$_׫&SeygssvJҮ`FeI$a#i_F]+V\b9N*r٩xZI;^X/˵K/Xh5nWg|ngXܘx aVT?i=#(뢕iym6+(xƳ+<(c~]<:g:GoH`JRW=I}GGxJ u9lԥWGǕ1ƯY#Ri6ͦ/-}"m֢}!Qg$ .Sz0 ~OU,5?].m[.+4J[{KL򕨨|)vyq5\}:]}ji{e(ݲ4B'7eGEX/7nJApZRq+nբm۾S*@LQ L،_!WQ7)i81v; ݀PuJXc]'UzGDUM1̨Bf׀O4OiYzo%ciyNi.m,;o~w.Խk# 4YikZƸ}BAFF3ףW*,.pxpsZ 錭ԩx(<_7;ԧmr 9JH[=F _Kja.Z_?mM#[Q='=RSTڠeFv`i/fk"q4-:&epDϔDQb&ad0J5eMcvؐ5 ,;64HZa^ԛ1BS1oJ k֙Qsz<#LD=g#e߶3TCq)oF-PmyjQۊQa4Nss)6e!x <UU© Qh !d1 t9re U.HڊT;7iEݴQ7N%V(iy`O} ˇ@(NhB'Bpf,JeaJ/4Kz ((.Beݲؗ'1usץ'߁GrP۱¬="%ufAB!,ߕҗRL`}+Z$*@[/Zuo}qc:+XL#IȸYk#%/,Ea\Z~OQJ8vE N0Wx8-2OH?q㠟vˀE .#sB:#}Q\Mj}BaO6h];:uZj\PdvDxuȌؠḌ6Dչy{^cz4kOZ$4"XF ?G(QKڧf8`Թ/X}Qs8ߦ>hm,g+'g0=J+ B_4>%5}4gV hqNu&if1p9^'PgA6&ឮyk5uԧHVX!_~L#E Ԙ}6ͦs/-ܕ}e`c ?5Ԟϼ\qs A!@8^S(NyIo0*S#.uخ5*E[L7IU=qlDjQH #apR*Z-"<[=X~V),I5%Il$&&ކgk۾њmЀNP*0k~)IZbgyRݭu:Py8<j)JV@Ķ[1`E8}WOmZdqW `jڞ n72f H"F y%- 6UAiDj>gœvŠS9jX1xq9Yevu]Yo\G1yt&ktTD$\c jh)SPtUHsB׹| 5Ljy+eYIq(~lP`;dUBV-*vT5 F(WSa1pa` U}ޭ*Fc%v;}IQoWK(-ɷAj%qL8߇U*(ӪaܪA[89b>u%*ai[Z\'2c]$^"xĀT ص.Hѥj#OPN+}@ZG`עؑL27I`ȄݠmXzvʕFT n4{hwMG׌6zًGd\;7DM1)YniaIQfy wcJwwtOkVُյ cQ5-}F,5=LwZQ aZzɻw+İA\ݥ~AE|Tƅ:iZߠ>ΠmbC{',͍*b.,ng4 mcxb2"-Zuy Vi6Swnצ=2X2t٢%jlX LD8R`f`,M"׫ Nu0 t̤Q8XJqR34pС%IIfq&7csjn8L^ ʍS_*__8=VyˍB\v页aٛ--}rIYE琹#0 OyNk\^0:XJA]$5D}rP3gi0GRi@Ğz*݌G-} "N)IWyKupfm~M߈:+o>]< SAWRz,F%\\N{p-Vۥֵ|#"X^_cC1bIP[?!\~SèCrm #P tjevG8 =Zh)Vie){Pr,*[sci1$vFo5 鰸3Ѿtrހ֠*s9]⇅"[]{]M裖صiflMJe#p|'AھsB|ɢbc§ ŜM|~- X>D.r)<9z&h諫ڮEdGeBGabԝr4pT.6RǢSnT*vs\4%Ky3Jܣ8; bI_fpMEC QPq+UMҨi^vɶP{xgqW2VQݪ׃4S[#δNeJVœ"HRD2c #pN"5[AA\_>鶠3lyxC9bj* ?/>􈱘n6'КC.SV r¡"8qR_)H*5Ϙ'D+֙cIΚ̠+1;\pG̑MNͦ4?MH8||eH`-Vߩ(Gʫ-M"1h$ ڢ,Sy7M Y2NGyo¶f3b~ɒy+7ňC?oa'Q N3Z ΋O3]׏u/jxT$m+ΓaZmPSכi8:҆1"fi+P>P*H6c#s )D%?Lz~ k*Hk.Fi~ Ɣ٥jx(n8EPmo9%q\FL0V/W@Ͽtb?WB9Հ$-SbZUbAagPMiK צ_uPxB,h%VGH[-&ڀiU^Y-? ɂ_ 9=CP Mڶd؄S=vd@`דj8?Eb7ԥSD?X{0W;x,*UN#Q/Z%|,uӢ]'\,UCߦe Hg+w d_kZyM$gԽjMJ#Si6+^ Nis䕋.8]lˌL8L4sa!2\O4,PjAPOF|7Rn\Rq88QjxTF~h:FzR)9#M' iEDQ=z_Vm;G~8~@vQ wPs}==$]=/NS@@*bnEaJ΀Q=#EӺSz~tvd7A8J!GIz$(c,^^`ŲE4i\|>|\\Yu U6{'.:hfmt#kY?+a1}43l1.&|(xHrf<5֋c f mNIr1}'nb!JI,!5NI np-#o3yI} k3Is~+݇5&?DN-tB :>c%]7NꋠNA8ZZ >)\?qG'[_PߗuD.o=b(}Q_QE8$訠G;" .BOR~qOa.uY[uw+ξ]~%mQkgqђ_k;GYxQ$ۡ6(QqfR0ѝ4J%~ h0q)b/t X1 *W̦G`QiS>[i>JßFo,-~@;%@fC 诩~Q8"7!@ߓe+*XEK@wlMmzz'YQ{/&QԹpFF|h}ф`S_2<H@93Þ99u@.,1&B8Qw# .7;AA\ÐGc R\A؈:RP.ę$U F#vh4* 1J<peFTj9cMɦ_M=c4 i]+|DDiqI)%qof9|-a-1`x(xaҶP:-PF7"8@`ڏT.puZJOA")/x(H} jd(HlRsԿYݲu#[x@J%)vu2^oݻ$֣O4)Nz S 6S"8K$&bNWQ.`o@ ÀuOk6~G4Vc| ó5P^J2-"@av=n9~zJ얥_ [Rhf}mS W m&=" x'nĨ]vd"|V$ӐՉwɵBSdv^ĄzBfU.LӃ"諠ND8 a.ڢƭ^i G~ѺH0^փfZ:JD_lվ_ ڤ5ʟjw\诣y֐̴pi6Q'}_h^7WvvACї()Nj9yQVk\zhG0*V suV3e:\FIPs,&w1rс;3[rf3hPe=-cDSC7ٺA&Fjz1qQ7͛WMѼV&ix@8u]7OҨy I'xV֫=D3QF#nխTP^ ibڰcGf+Nփ3~3'C\&l k;;vr9- .׀%Vz x:3Ӌ%ݓXāO*ZmXFa|2mYzR)Y}KkHjf- *+Z-u5H}d^Z*wcgjWetGt;Ǖ(RB,QGX-?.P|  _bin+:n.&4DҒ5- &ˆyv{ጴwh[֠,UiujelOX٠~JrCC {{o6*}/Ѱv<4N2 X,be)mVDw;hb <2!SѽW9_h!|@d~sG[z5$#(J x|$;cXMN&t+bkʈWw ZVPԙ7=8ޫ%tQ$0}bMװ_d$0^!6]## mXw]O0bFAA.3yxwMi6c΍#-.].]2˔yhf䡿 nuӄxʅfW ?^lPRYf ۏc?M[bIaTsw ՚WKj7Xv\Qe(P)4a ,b0 5s %F(aPn`Wlϋy0I¤}lg#,b:L3㺨3'BF\׹P'+JPG]r=OvPOѨN*xmi/NgEqE2b |I됏X#E7G uqM1":Ըm.7; !J tPD\7b Z&%eVUn^qM+>шN=Fw?!0c {Z[蘣7'Z>ch'$I#JSvdA1"etmҏ#:FLl'RC ]Ih>z^54YN ;R Ve")4%`eAS{0<$H3?+e*G]n].?V+F -Fn:e;9ZMa-,D-9gt%)p7KIuW:b@tDgz>m^W+#g$EMczD6JcqH>32r}jJz҈Z bWZSzD0v):&[\qoM]xZzLԩū7((7yj7O utt-F 葃_k 3ձ|Pu7ܸ uoJUC8_|Q-U1nrOnGDzwrPzΈ̽ zVb>ӥbeʷ?Si6ͦ-m28]F5 ޗ-꯫G3w*2esyӲ:4IH9wdŖ8[!F9 6xxД'׈*)^ |F7胓r>}|Ҵ$nQFG$nW<zUj6eñ*`_X`M:ӑ2N{#EĄ8\IcXp (4(vLʶ@EJ ì^6dgt*W1Az7*, *Q<}2/ ]%]9#WIEe| +ˮKjl31%DIkqwONҡITT QJM+)loF@mGmw ס.:}x~!oJW"{Zx0mmi3)4'[߳&Jc  ]0"\s^h1o,zjMD0r{N#2KuCE~3-mkzP+Q~g`L]>A^#vq5yU;DKկŒ|JwViLT#߳x~.\u6ͦɗb.\8h-^ N4#N^kBYryX4g?̢3+k#NQƍ4\1#^@^.Ӻge{zePG"`d$VAQ\adV')ʲx4 9SqAXoh(Jzn1)^IG ^oV)4M[ahHhK鉏RP89˂3E?HA0Bv1P7`۪$A,I/X`C2;c#QIjC bGgXh6snܠAC \D*DXcK@ 7NSqWA_$dY{_oi`IJ)+LsDT)pfOʁVjަ:{j|Vn0HoW#NcLv}}Jǚʞtg= 5eTJ}_J1Ӵ O2v-9ղв_JoUZ˫y^'=X ݢ{v C]-\/Ϡ*p =ly995Gbvׇy{p^y>i.Q.`"E<(Ƿ~zPgKގށht̠/Ia gAzRWb_Dz)&u{v-d<i/D-|Vꏁg"i=J`1\ ; 45z˨G81(_{pwR]u"rk3N-SF!##Oȹw?F E xZ+GwbVIN.Oe˭" u([ '6L+uTHwzxL4f#x|_ c≾dND65A_]W+xyjX,([$e28I= B.Eլ5`$S#8CHFNB9ϭ!d#d<DQ#*bA@ފ?;y`Bbmt\4jQ2(٪ P#e:`#Jim4?lX3qGrcXyp5 8GqjW'L$]/b~1nLOd?\7zbɹͬZOuYoI],Zݽ~7n5 cf#t<qD꼩{/r٧y8C3,k9jmzyN^{j8&#pb12:7;)G}OY{W5E>)C+} bU6m|oSMdu\" uyv㏁Е"%אcnlm ƛ AQ׿,~qLߧ(s_Zu]'2usf@N /3~_dTl7"W%yrQ()Zۨ~TDܟMi6ͦ%חbrR|/?1F~Wc䅯sI2WɨΛX+9)~5-lnr $qDIX4>7L('~ &UTDA_gqnMgi'Ө^}ߍ\? q @z(eC4\JIčˍ%|]y\o:\n4RSD^P9/΂LZ4g|݉e|QI Oo2"`P\wu0^Չe_\ua׻+-FgѾ6ӲG *>#B l.5^̱[x?,z% qܦY{aVӑĆ׫Ht!gG3ؘ+5ton_}S%J}F|p@#7 ""*GxuѶ.DC|rywQ-0+{\#ޣkTlc+}6j~%B޻FS+FKma -G`l+(Qqu2oSj}E's=vQ[WCz c:|Af`Ir ?lIk[[j˵ѴBSMoM;V nc·?-Ey-Cwq˧?G;j\QUj#A~[qhh-c|Xq@ [$&vܵCxqMi6ͦmȂvi]KsÅ t{N#/sn>>}YyJ1]׉ (uUܢƍxnU-V݊T\7Quf0l4_tQ[RSˍ[ \k6A$O8Z-ejɛSNN1q]Ѣ ֒:7ё'e 0eV&t5Qyq/#79ZIP20ȓ jBL0`UDJVƺq#ߪ9ҹ8 {"fۍܩxkJ(sQbhx,ǎj5?~!Y~J-ihc$󸑠i%%H>4rp6f;q QF`]C" 5: sѯ2N?6&L焙_v*֗?[$fpPtoR7q_#c^e*;dlu 9@kϪ'#mٮ|eiNtH殾OIUY'JFGDEL8V+zwB[ַ Ǹ^^Kox?i#\g! 97vO)ʔGOYVfzP0h pFֻx9*<yo @_"x|f| [&JGj6ͦ;/E[w^q17v{ms^AR)=d-H~@Grx5Qʕ_+ ՊSlwռ(i^(ˁ9$JT, ={$CcS"Պ>V*ժ[w0TF0]k$u:eYILg8!s&j%ϡSO4^JUۭQaPbwqíd2;8G+InӦaUq]m(M>]%G_>߁K 9&2fL«/\4b& , !+JL3NRVMJ?.͟7^60T5}p ) T># 9F>gSuBLvwx؃Vwt!'晄%E,MO˕];I#\{A65MFcn4aހ[;d4lGLO>$[sΪ5WcV=,Uާo]kSK´5Rk'.r;̮/,Znul__n]NM% B?V4A!i_ңa17nĹ?U40kԷ(!u3b:944\ᔡ+u= vD4tVzR2-m&ny!)yu.*owG3`v9C jQ(*>񛔇5&_wyuIk\ڇ<)E5: _]$HWʍ ?PcNj}B;(s&\;:vH\s,4C>qFu@],(0Ϟ݋\dۛ[5B#ުfp>kTmRo%#Z )r9O+u70Oq?UVgᦾ=:!y|w/gy nM_@<~uB+/uς˖P`Lc+=t0*vwdpfʹ_Ԛ;Mh Nm@ٺ"2?ݞG! seGsJRy1caؚ{<5mgmdR4=d3:?o)#KRhy 6q!*ʲ0imBhO5iWvk r,;ɨg5GR-,yvMYqJ4Pg7 y^o OXz@E|ﱉU v|/YL^w讕8W|b=+Ҿ-fa_7Ypwv}'QCJʰF~†X :/@RfI>IY7r)]I%c{TS<$۷ɲq 3>hb\P8B./\nUrXj;f˖컅KhXU+zyʐ*3KZ |YX> Hk7cCl9jɠb>;18:Q?ٳBWv0pX [C(C\Kc$BxGQZ?+sʴC(8N)pXUx<UĒ/_s8v#z:GU&<@YV^/ 𬑥j8#g'RWHg-GlJY }@~ }= nSKUxg_c]r׸)SyzR§կ4fӫa{'A/'-͒L )! +?K9ae#>/}f]_-c0nĩW^Yyv)Q,/jIR)yu!i3F8B'QTMKnHzn섍O'i^4`Py| kqSL`dQ9ֈ79GY_x7`R* ȟwJrk[J/vQ>Ϩnʃz}rM3uyRv[wބ^#Ca=Zɼ&miey=seʲǟZm0#TV%6P|:&Џ ];Dq:t'T$MdvoQ'$E9c/ԛ@#i plz#~,QdkۑoX9iZ lM~cEc$ʻ+.\M$~rϾ+1 B'A:"g.1S +HG6?dĈ=(;!k3d7 D8VQ4tGpB\4~ +|j:@<":U`2g-{tzK({ęzp"KvR&Q1*jj[F#n#!DwԈe4ƣ{Sk%V"uݣRGA!Sތ5zy?JE\bE"b> W:=8u)ڼ9Jǂ}s`I6cg?'"qe^k[+/G捦=(ٔ3Mk_cm_'=CE`Grj B :flMJe>;m>/~e1% R90'y&7|.N׹bs^6Q%/zfܼ^K+2vbϋ%Tgǹl<LCD,(ĩ9_vqNqD2:b,b.JBӂ}´ MDˈlN6lc{Q{L.l}\=U1줃[K-qip=$[ lF%IKiw_M$$<ߜ1:?n ǐb B^=k9ѓ>+֫q5lzZGqw FH8(q l=[JIwް첹.7,\.qri GI τg>9z=z̙tN_~^Zt±Sءc'OvFpSggISgN9cg°<};̙'m\?5:~ڱO'n@pr9}.?s*̲˲LJ,Pq^&Y =?Ί9IQIX&E"q2l6c.P>Ӳ B?ϋ4rdmg2,KQ'*@6 (r(. PyƖ,dˣ"N+*5|F+on7Y_=-W_ m},m>"W! R{q>M?,Qx?֨igeZJwLp#Z\TX-=k1BMi)&џuh&SwVo荇b9zZ6H ЅTĽ.v5!lA\uMqbBQbtlAFuBm}i\`7!7FCڊ>=ijP/O V!ԸO{jYI5rR_6_'va̛A>v8 xB~'-5R\YAYq|un{kMm_RcT$3:6IzЇ+zY-q #܉Uf'dT )W~:\=jAuTj[C=23gunWVUd=(zS1W)㝎*v8*^zZ5r}Ӫ-SJ=w>mט|(NQ4iW<5r\X6z|f(G7KoLUQSrڜnļc^53Mf}WioS] JY-W ZIe(;"4< l;(ݔZzcNw`O.ϜYngFӣcE8::mLq/;tiQ;řTSNq;E)p7D>"rR]].HT8IRdE6{El5jyf yhgejc52o<<s8EqGJqQԨ6ꉀo{^^A4-/} #_8h6-f`7ՙU\N}?%; fTF5fˬvv+l][$ Jy>gYvzG vN'젉vlw國P P;w:s:s|t y @]4obق R/z-˶dow>~37/*n-rMo_6 ӗpolJ[l-F<!fY#CA R3](ӏ 0m8,cX9bt?Os6qk/@OM Mr_v!FlR;7Ւk=mA[#Zmͳn:ZҴf y1|yD`w`Jipm(#㘷Rt/V !6])ڕz2'x uؾ9O/1PZK,URx) A_eoA{/ hG\9cFGnD%G:qa4_pAzNY+0ƿͪڛ?Den'@ٽ/:TGpyeЙ`Yȿu`*Blw@ ,7ɸ{>2 x8"9n'kyg,YJo)7[zM\}ϩ8݉>ٟ.R!􎿲J*or]j+##%]xkr ꛠ5qHk G]C>vjm \ q|}ПPo#8mZMPj+Vr=/DWuwL?)Wm9L􃚾aLR7p?s R[0O] kgΌiZiD1ppïqZiEEJgfCfIilfIhOäi҈8ȋgY$CSxiO,M4Naw-^BWy=7<snnd>OmqySraQ}k(C,CFzΎ.8g>8}ns5['&>p/Ћ,"Cu+Jr_Ct@/WIJ=*V(n\coœ]:AdU4(1ZFu-?bZ_Ts&%xG•à|.~ [zWt_Dīĩ7 ݷaxy+ee)byRhٻd |НhXs葧 c\cBgʼ͊ѿݠQԸחb_ u%Bi̴97KOLჩ4)}߭<+DŽx % b{Muos^ݯܺ[{a'^EQV+y=TspfQ^DAW߈Da<ߏ(rFVsZ8N(bOMͦ[lH(ЊV;~ ~@k-Z 9uϩjf? 6:kڼŗLZ@σjdmmm3FQlDZISuװ|,\&Q2i"6u}b?6A\+qLS?xlaK[k0dS3/ Ok9Q73 !VcArk4"#㡟=Xw[5jR5u=Y}ң̳*}!<t;K7+S,=]/8vΙnLy[E@uϳ,ݰ^@(̊2Pfq۾["\ߍv}?% ?)w[CӫWzWv-dUS#ix]5+Cf=!u1*L}"1|X~:^)%ֈJV{c\P-;܍?e%]OkpJ GƿC)0r~Ŧ +Qvz0srӿ*cKB?.vSJD¹WfI UYwwl`]7yƳ-WcTL5k^)r'3峟0O0>ɻ uy"]pм('QMkSTuX YY-:i sق`.xZ6~J9Vۈ*-澖SIϨ쒮[QV߄_<^)5›8h~3J4s W0`wSJׁvOd{*MWz<v g:.G.EG- ]=]˗+!^`;۝jZDIۨգVM Pq5k.r fӆ_o:Q¦[jԢk~}u#ԓOf' P[ժ n+l9pj5(JÔd7[ALw&^iv۞AJgT8p\6 5"+-zI  UsC`{"Wԗ5u ՟[R_6x/ M V x{E5I%8S]6M*څ-'}H]䵎ZKJPܸk\ #nO4wa_ZH6g /YVKalK5zU1ÀL;ꨔԭ/5 *\"мF* RFz{YNu'9s#: eka@_R6K5}6QQkWK(FDpqG9 ;+܁PY5TJ?鿝 O8Cx.`ɲh%;o"i9}_-%f5F(UjM?dLB/Fcihx-Λꏍ ŞX V5n6#rܚǧO aS~z;3Z܆0SQ_0=MPq][}!.[T6!7}mHK*Zxl&b5i"[!e_nϧ- XjE4gd??v qPfF^F5),O4=:;9|Pn@X5GzYDOf@j5c ݯnSj֑W>; HKD]zC=K}z-K8gY'Z0q=]N[A Gf\$꣒E~ViJr55]hۺ@}HfqՐ.5픬{0P3Df~4uȚ&qDc4LV`?qTz }~mY8܈LSoBSCoGJSi*9#IB͚sS/,>4p;BCJ-D4,)۶ VO9yj.pZTQ00i\U̥_vX ayIF9y+åa'^ڴ""#Wny(2L( FWL7nvQ$bq\06ɢL) +kљ$ʜZ4FO<)CY5*b%4tnE֌YGrBS A*F;r[{*|v<ԞȢ@kEc.XeB^e#1ge|a %n >%}=A9ի9]&.nT;[%xdB؟Y2ZQQ21#ɥm<4l,vq@EuBI>-EqijkQ'd+-mPFtU7Rw'Q^yٞ׉ur{ZG;ʖ .{@ЖvC6ǂi^Kd4D~/ ~V®[!=#6bMC(I` >f$c݆<-CァC>KXښ[gS5UZ+OC({0_Ib%.z7͵zzwu&){>:_N/}o>### $Gҝv24i(~=^ DfUG5Yk:eɫQv68dF>+D\_-6i;Nd"[aeWD7BuXuUxA C/h۸GD1+v\sIPw[rBIu}LΓ.I{p2ȻYNg-og{eD ҆e|2> sh*M)) '?_z"20-QW5zzAq Wιʨ(򀊀QERNڭV3+"zw$MtI5>8S?vdgG/7I')Y"ɲ(PR7!qq,I]ߎ㖸;r$VŔ&Q[a+tCׯfZuקxvl㭑Эfug!J{aجY,tb/ ُ_>q"OHb><"IiZ޻Ϝx>,hn6cٸʨ'(>uG+ut8X!"t|3&LVݟяXLSۀ2=a_5u27&&=~\<_k-<2V820tsÚqnšj={ @6AФji+E@hY )8}֢\%ӆvu>bzstXӏRۍ''CIѻ{ _ C#FcUN]e%> FI<z#ﭐ' ~J0U!qO98 ~ 3C'L\ {^͕0Mڧ=80pf])5RG-kWSYkX$%GA].FjҌfi ٝ\_#i[QVj'ab=!N}&z]hLY յR=`~Hib&*+r$O'j,HExz$Xcd'8fN&le)'AL4.>y.p#uE,\tB縼Q%?X|?Yk[mNj#$f,VCЊfiDQ^Yxv#&vaVČƒiE. #SDE2mw~ dL$/*5uNk6χZGMr,-bݴ^˃S376I>[}Eܱ?5l\3³B]?QܙD]^M7#T" q-$&t)06NCOMMA I(G<,AZ[لpϓ%{rT@5=yZ`+`?j}z6zr5Tn @nU[z@zwCoK]b6 ąPF߮2a'AwDΫOو7M}R} 9)T2kVJh{mѐ}NiS' ׈s͠Xii ;D [*:jq2TNC2HyC isZ$>Si*M􃙞0 N8|z}vɂ]0o\U™ J; `(hدN٧Ő}ebQja;7mykd|%H].Nu*~],Mj+*vFQlHumVtbz#Te( !Fq{JLE4gn5VL&Ŗ ~( ߫ib5*>$뤧O*Ux @ڪ7EzYhrElh;m2ęsU}G5ADà GUWFA Ч8Evq\/D}תL5Y5|CQ򬆌X ϱG4=&wnb|Si*M+} sx .% _WQn20+ ,J>&s4ںFX^0JEҦ%[6'}IPta,r Z}Q=lRC=*QӨj [_bUFķ3ZJ~FXϩWdLc}=Z&vLb@3˚z 6b9 WW i`!/Ƿ@moq M6. *dnH[Yy9sR 69l:ecO3gwaHMQB-lbo'HoVoa̫ǀl)-yQSi*M/&17 ,^7X%d^9y(qN8u|7ܤ{MuZaaI,m®(g@Oe f0f.]C$JcpH(4ܖbBF>ЪKbkѠf-6Wv6FmA3%HH4mu)Qq::sXV}&;vvwHL36sT 01Ml6+cX [ 3(FȂ enR~}} }fjO]blǭ-f[PZEzAQ n/Œ&S ;K;}®5fv-.&Z|Јq> A{B="4hvxqI|ҾgO8O!hmN+ Bz^T**lFMjU 2Pڔ4Tz3Fcߙȼ<(s9y%ֵ6ٍ΋cW}1Ĺ>NpT;#*(,;Mep^L\M7!i7%-Yi{)YY;kKui oEY\7,Ƞˋ<I#ŗʛu;X62yf꺮Ƒ.5sy)i2]E\iDi5ض݊ |8~ų*vھy^:'P4Mb,?8 tF qNl^5j-_*.7l1^xc+m<ߒB;Gإ)&mj`O4Wӻ!tch0ozޫ 8dm1|"fH$˷.L35CVZ?V&R9k IQcEL ss?'pFLlZ ģATGFkJTZmz9l}YcA EK룍Z;#&?QY}I@uYT:,Jk'*;Q0NJ r5 {5@FfN>gF?a'dF-aQnlh5=);# *8S7nElo?[\7!]E^Qќ t݊/#(O}Ux4 ?)& A>Pv@Ui^v{ns]1J&|:-fTÖfU^u1Ӣ.ч8Xsps 6dWwWcQWJ׫Uo6eMCMU&+Ef"uqFtH)Vz% 9\݅>]x5YqԾOBb}qz6Fr|DxSYѳb2jNx¼SzNŽx5 E=ҿtNpk .OKy M3tqn\Ax#^^A+y FdE;%ȯy@]@nʛnVܚ2Uif4#ϯԒkfj-Z~F<:]aժUjy K.|jnHߘtJK,aj0<~,33.bfya"mНt׼%|#~]k^% c7;(:Y"~O4T:7\N'y1o18[ˍD}AdΞtNGG\PBWk&@TfIZm$vz^s1=/JmN(=ϲV֊v'HF"` hfYN۔T [,dBGƁ t3ԫ{~!BL" NWE HY0\hր8 "qϳ MCrmh3v%0MB#<16҉e 'V-j2ml屙s4׃xFTD-+Fۇk*_Q?/BUJyh)ujPѯqL`ngdDz3Ifi&6brRj mb'l@toePuuZت@ J̶Y|rT16Fp4R ZBfqLm⨹*h˓Vq7MDnVy 1oP =˗>,$nw)+qO=$Eqf9U .%ިaVyo/jiM j$QnDP/KN=g) Wg+F.ճrONz׸E,y!נFz50I{P~*>$7\4zաyE]z5K{U9Zo j=q]%u4A0nG;/1c|r7 Wo?SX.AahUEM!GWjg@t$ ddz.O= "" {@qgnFg2I  W#Li6 0 %j4ZvХfh>lCP/J/]2l1pc(%fN  8s4S;%I@M-V$oKm0Mz_52} ou%j%n}MkQJ17Y׋30_T-J&5"~O [vRϫYRRn4Xy@c" J ( M*ba CT ={ANO_wN-uf7FGaMT sZ<J\4PJ;lM{af>+^9Nd$O_eډz<~ hjd5ՎP2>s&L$VSt;J3xwve'?/d< ^>kvaU<5YhLLn2ކOqcRi!v ~%6luqf1 ,zބ;vϷ}k@U~uzrQPU˺n[m4AG}ގ_OPufp3OEbҕbZdjlֽ6;rBFfgPAgHI lb@?W1YJDJoT~ Dk߭>o50:X욒ЁΏrM1ī7I |5!(-ƉĈ!} *kij %=5cyM.+q^|:fSMӧVYPooқsU%m.5No&TJ #sC/jΝK]ɹ`Pmu[aܑ[oeaa[[j6[QHY]w8kz4fPF%3ڨ90qՎeY| [_">7g⍌mۘ,zYtAdQ1\Jei^KaFA>R$3Aѕ$L(*yZo촹Le"[@Sab:CP>a|6bDOOrW[pDiܝfCfipъgz'L; ˀY#1Cxj!XCF#&FQ4d:ޑdG WAzo_R4oZm %A7PQ7Ѭ(p݌3!ub :2ݦDsQ$nL#R@ϕdתQN?n$5_7VC{: pAXuQ0*Wa&9i`2snPVͰhM0eKSnk*xrd}'!Tj;TvGb!ү\ؤGKZ *?՝V3r0X Vׇl~ڞپ{i3f-I$4}Nmבkq@c,Bouǎp$]ۯQ\v| -^}˴Xt!}߯4J JRO6SbeA 4Oi+5F,aI4MyZitY0IR” +Ct;HRi#SA؉SiwXVH9G *=ud G!.ki# 2$D"Fܭix'vOa_<"96haho0-dX~n u.# 4PHgcbiUUbGC;GdY~ XAw.ݫ.gn`/PtZd Ih{0bKJş8 #u̳R'M1tEXdZWGrΑ#y,$e2k-lgJͥ iKeV ͐ްK)2.~Σӣ8K8|v豪<ebkIђ(x@1ceEٝ{,l4=B\vF%\64j{Uco5o<nj/]F]t>d8[ T0bxt9ؓ\oUP\nih>D5 p¼EuQG[o&%- `,@,%aLJqpC8S/Wu9=Mܒ:⡾`[1YS+hk/ڤp9[B b1m`h?3jAVE'b2hhfeT7 1L]m`ZɶE֌.],m/0כפ5 ďң҆kIINl׊S үZEi@Rsд֍ xHL`xNᯓ,@PKr5g 1 ϡoY7t 4{*J@nO~{P0pN}'_} BW<B ;/AEX(3+J] q|=#|Fִ)x s_kVwDݦw1Oۇ $'Z>txw.%W_J'@?TJ:FÞx gϒ`Oλd]4W-R|,rKOv;3;Ιq{|)`X˗&>ċ&Qil'KN< b*u/m;G*NPJ\f@V9s)4=js"dh%i2'86p\bmKQV_emsk[ xezy?+ᐞy"?M*kەS:sPF?]К33RLmSc(;'5w>~ M {\-PooT?ya|HԘW?^y2ҿ0s8Py\p%7w?lb$7/h {iTmJ\hyF_J&tt]dY~vĝw>y%b0aim*՛BM(!RXij6[7Ӥ]m5x2f[=Ҡ z42LE}hI㟵J/ƮYKiLC27 yg]+ic04Fk=/}ca(mR^:1޻ #rke?xGwVcȻW_4=9E'}DXۖ!_BmԛgiTU5 r{JSi*M _2Ǯ_1 )/Z@ƅ#a@PaJ{1~UkUNε>4LZl/ POrk8;8 bŵӚDK:C MHKȏYSxQJlA)ރl}~9=:U,L-7PSj7˸5>z=s7l;J\.wv_+5g2yXEd ?uo˕!As4ekidq_@;@ۍBpLm,ڋ=/BQ UJA)q5r+ZGQS{Vߔ~னP5c+VgAYa/4WwJ8r-&vxGrzDL6i"3-!x XfVAkFuz qfwU[ ԻdRF{ZR䎡Ǖ+#Y+q90ϜC_RGP:cL7K7HB;qŻkԯ[>-\+@YϿ6E7 [nTWQaʷ흪P+TJ?.]QBC_ y&wuuΣΪ[)5n:B(htqo" H<>hh<-ɒ%J(E&x)=Xcg7ޝ7f!BZtUVfdDf||_ISj,Ivuߴ^3:w#JUpeKߧoCKTT3'Ϝ>zzf噓'e+g+lrL:ݬ9. :હc7q킹Νn<5+N຺yŘ CuӍӽKi^{=lv*MQoVW%Vz [T,vՍ7E|jܿS=?Mf+/Nak7Aﰚ=s} ,rCi !U:9]MsBw] Zthz~SWy:~̕JگBo-QQ6PK nF#R!p2J]{ި~I3i&Kөxtނ L_H1@@gVg*͓N:sjiudd3Z~I{d3OVpȲ?9UyjY\Z;R eSj#wѸsisʓJN,p+zeWqYyY㺙9ρ\[qUɒ8 C^T8q]`׵°ZudKFnA1YJYHĿYgWkD$$IҤy< )OM7N7i^χy7`kש+9ͦ8jI "]SQ!JPHF9JcR%Hi|S^MkQ,j[ Wc/!sALX ~͝V.&'& VjĚe~5NMB[K`'@J+S_GU:κAAΆEjK{IA qMhEWH@ZW@RI݄#iZt~,4e@kW{qE9VU:HsT߁Hoxm`^وD !-bjYô|PN 5=@1wű4eO'r_DBۂ|Ϫ2pP 9&sދm #- ~v{|Eۭ4;|t?LF>>ó- EoݮnJI[ !OyH~CR~E,Er "x?-oj%RܹG oGzkEqj&8e+nw?\'d81K,$8G_fwH;\%}QhBKSsI30J]/ŋ-H>bi~33+O9y2r Phyz}jgV,TjJɑHmO ih4;u&-:2÷gUidA (K4M$ ,"KlדռFf9Vc8 MC4kqv 'Px\Gϫ4"Y%A$i*Fcv̮Wtjoaˏ\Ql꺄ƞdY-I<\/:_ Nú[f]!lpAXvgGIHjPUɩ9JZpB׭qV݊_kaݏBRN_l@AVJ%K}6T#J/.?bᒉusve{/ŭ4Q.D]];EdاnQWYzNfq3[sV[JcTE  {%~Sէ0S W&EPK۩4]8Zט6E<%eٞY-rS IEӸ҈Mmu%>*[WWSXW(XJ5uu?8UoU}7"j=2F;^DmpBBRh9^qV9-zqe*@3'>)/$Wsje\;ϨuT1E)TM/wm@oR0|"՚aPb\$"ACM˝@z+U_7o;/KkJ,q3!mPvb5*XGFm:*A-\8^Ig. M )ف^=~AW#LAחe)y2*v9nGOVÁdڱYSƕN@cpʍk5UдE ?:~_㉣ב!'Kn+=?76rPW?Do~KNAۅ5ҊCrs虭id4^.ĭ}eK[̽Z^Uī/uﳖ4|_g'[֜'o{KZVY,[^9Lެ._6lӗ"ݞ@m,;yji~*WQ35@Ka`F8TMJq <qԠh700!ŷ ^g% J0!r?J=˳01Fڳ_(5H 7& (6nsJd=ώ3eŽ,@Q@h`3w<ߋPJND^aJ~`q7(vÂp Zpj8@^ ;nH\~m*kBUnl{8]`t;.»s/XxĊyK7oڹ'.\8t՗}.0imS8;(۬ܥZ?Ɂ;̣9dmӳsJw)uIq\c2e/W)#\%;;e/w# n' Laޡn$2&hN\E1}BL~&䅆j[Eԁ:PE.P3iM loa| @ٚp:;O hԋ͖恣VZh?o3X#O޶ԒKjȢE/@r:A_%Y hpýNj6%epe )zļWww}ߡMG7(ZO8XzF^!fCd8}po9R\߈ ,7fLI%wo굡⅀.TgE?a폃"MJ f#Д2M@{ڞf!.y%@Y#h7"*T 0>/d.HQ: |6E\]qRƟn,걟,&nzm$* zsju߶KvŒ8#ʺnXqvvX :Knɒu \YK^ gk8mJ^ hu[db|uʖ_ƈ&w6ta0Hc} }HZqZ_Dcr}BkczljrcNg.ކ9ρjL%?Cn.ޞ-uu$n` vjUWŊ|°)l3zgeUD̵ϴ[j-ϩcCfn ҇_>vpDvu5[/N>ϴZ~chWQr̽n_:pβ5y(b9oEoߏZRA-πnP<|,ڴE#F=K=jul^| vT }<,B8eenWV&:lr~&ͤ4~F#$1UQ_F|h>-^^*],L7Elj#/m/g(K  n ,GdRs\b?":qY(Oqn#k#gר 솂,7;Х)-T@f#'ܓ<`ZʻrKQiQYǕFA 7xLCd#($0#iI86ФSvP|BU 8ivZ6$$AZ\4HaheQU_b̀˗- /ޱt]*XK"HVdKxU@Հu<$@A5v'HsF9K+Y^rLk( c{FCiǣGg(<`HkuZR-6!qn)PkB͌8\1&,C\ x餵dœ@ǃID䗤9HBlj5q ctz'^O8O %2 V+uqr?N\r|"ı[wC +" iMUs;B+] r}^_գmnbۨ"KP.8nPQOb[s-g`j'`R`iFDO f̆d{/9-{B/Y)! >;!/ *:(ВW%PLU >26Jvt24h~*bCQR1j¼ C wLv7ŃV #E6/ޣJnJ4P]iN[ۄO 1 z\)caC6jYH`9}Ø ,հzH ͪ{0 (\%09Oj{pG9s?w|oQsSi-,U,5ZYJ4&1ցkDžG0FUzUcOXN݈\iEPB-}Ѝ,நZMXde~Z4dyB;odžjXW޿5,PoAmUРзW8:V մ =9Msm%uz'e^$O:l795 0}M4jض<%FBAyZπ-h׀ E#( {8<p'$~h|0OǤGq8Qkmc[]\ S~c־ G$.?$ N.A? oR5,+7֧^#Rߴ,cxZ*x]ĘI370 Sjs L;o5GU OTOj߬g_&b?hhA8r, k]F׃<N&UE 8VC -YRH9n@ ZYN9sP$pl%7hE:^ICYZ,6"b2=.w@H ^Z0O)mpGjF4Z` 1Csu<;fĕs`M"NFԿ59ΈYO _vw6 mZ9nA9Eˠ5hIpPߊ<ڨace(:fcr!<, bM8[^*1Ln͉h6g+HNA-k@ٖS­ϊIC~poiEg4;_˚1#d'='/UkuhPUgy67zR#*aa(CitNLuYcFܧE]h#FAnL_7Aß]ƤFZDҽ+߬&wF>OKY%+.MIM?hGDػ+Wzؖ.-Y*'+7w+j#}0 ea{@ݸQiu*M0>wQMow?rz?E\?ZV"_Umf[SVRuࣈv>财xqEm/ISxiOW N-;DعEY})5hpJs0ySRۭfUآ^ E+sՖ,X4YY|75hzdPSa (_FV~=GXZ`zqE<`,ce9Lt( x[z%_!"X ݥތ^o7bWK>nT-' %gUJWo)weݣb?ʼnj&ͤK?40ӄwW]}.XP}tEJbQj F#)+*=qH@,ݵfuz sٝs B̵Ӵ\ǣAQ ӈĊY :QR3k9 5 x vhN+w7 }?<4@S4Krsk~3OoFFoȍk̴Q4Mm 7p躅.UJ^q+zNXv/+nX5{Nťi nB9ܠ8}Dr֓Ra؞~=*S[}З:hxɧh5~)t rCǫ_*l@?%J+ϝXwk.vYi>{|Bov3SKT K ֆi%< ^#ﰔmJQeK .%]E_P̻ka`VAĀ =Z%'i]mtYx[݂;./ Pwl iԼF\k{jn|E6k SP -#Ɣ+J!K/:_l2%t>*%E%L$Pހq&݂K=j\ cSG@_7;COLT5j~nvp JW\QeOT6пo/OSjqӢQv@FqYQ0~}EwF?J1aU\5} SfNrۡMJҮ"p]x~*?.-VzsaS^B?<3^s+>QV2\ :|2DŽqp1ELjb'Q?nql{4u}wށdp`Ҿpz,nlPoB^ ]rȕ*o5T\)w\/n8kɧ.VϪ98Zz[|&2`| ўپ*?nTwOf.Pus/my?w}^Q \6YJ)ǛVǸkgLɧ6tǩZVkFG-)ȶt1=S?5]V!۶~> Tv cڝ b Uv*XfiY-qK}XJqZ ʶ ,u'J48JI 0IfinڮC߶=`}e!m*Cq. cqNBTA_ ]su5VR5Yjt܄lЩF 'I"6y z/gu|sR< 2}=z^)QӘe#nx$oIEif3Is,Ĺа )mYG=[v#ʝm~HTzr$&M;&L6_?WgQ m=PN}6ojg5&|km0W'K["A˼l6NZ6 x8m2}AONT;Q dkm~u̡d8%ʫ J#;P'UWh! ~dzI[uQA* Xz#J[1K)^(q$FFe1`mRgКۥZlP6ổƃqD {Fݖт.3r8پC @M}A@UB_kc P GI)Ap=rA kkLI3AA}|Kˠ 3H>c4|Î:e٩lAm'j~*9$!TDrY$*'4jOfGgGڜ>.m&;<rL :Z뻀l=Qf4J)Mռ<$$eN>WH###) 8F$7ɀ1iC=~4OЪCssP5N\41 DIPuJ%pbj}Vyp?!J rNK`tƴ*zհ&Byduɀ1{ h,u]s/C2jZoW eh$ɸ |O2+AALthۦ̷V]"A!jJoPo;w^B#w>؄i`1ॖˬ}ɍV ֒#hÞ~hUo5=);˽JoQN (h."e`Qc?_)n4)AsGŷn3LV^V>QGMXFԴmTD :J@QY_w-c6`FIt败Vg~mVVKqOSYR? ׈\TW֘@syj3Pvsŧץw+=R1$ZoKIZ|~U} 5%:{qPi3iYKRzeG5o*.? J甎hŔHuhHKʯz Z^nV+\9u\-KV{Vȍ*cX+vgC +GTC)u%1"SF:c -ocy t(\~D 9>fLK r]L__PT5ʞ/ZЧ|^"8I;qNuu A@Àq iyrPu4wj?`zC^1"MDc{h8:C^2T}s|>$`ǀlr)jC]tPr\'=;oDP&ԫ8^,bGœHP7y{Z74t+zN|{\ ]ytK%mS h4S,i6&mI<4EsIxΏyZ4˓1?.qGxuh#2|%; \Kca&5s/":h]Fk9 M{佯ciSN4sy;$@,\vK2SOK40︉6dI9?.f8zN'vwb=va!0.63-WҡTn=.gM^\[%-pl´Ek@ZVo+çﴣ| ̺)"^)gRM^0ww _Vto0W;lL\[fM"/yKoT1ɿJt3'ʀ[iO J38P8 tRleђMQ2=Qg]k5 #zEloOoNvc~ W^)fM(ҿx%pW9eVjRQMvHdi=o+TmiuB!T'б,OX+&7@]ƒ$g׮qYLȴs=JKѕEwGp+6kgUoT;-m2QHm__17]h)re*C?=RFi; "Uk+;9rZpZ$"O'~⩔MAY6<<μ3oT҆h78(!EtϨfsl 8HS1hDxP֬'Q\գ(jbe~Ͳثy!Y:{1ӇQW_oH_JyNHl8V 940.R7X;êu7*J%ljX9cy׵+װlH4ð^ZԝJA% E$_R'V,YkkůJLǗ~w0q&XsWW"svd}0-r]y:`H*jR=7xۊjru=.Z3V1mPz)%W ĔyxrQD~=i#&@;Zh˺iHILY%Sd3N2o: @czt=$:#FoÍ?7 Of22疾:dL9/Zh+_oE^d6}+'ש? We6ˢ6vq5Z5ƍݷheqr5oeO 5/H9 <oAY8+[WQi˺cUOu(l?(q݃ɘ܄;2cj{ v~{ۮr{;>cj)JBwXCnur X$ϒA;j\Je @_.~TA'7(;#OD(TlB%ыHzt.:F]2n'#~@Z'YemgL7m]C?:J,`uưzja^ |?\I874H$(!џ# e9&x GMa2gns*t3 |xG$ 9NϮ7.Ci Ccya7i m$"P; }?a[dL`>b^=bBqkXw^4B5K9|6,׶Ti6skI; Գf/w=ʮ~'\!]prm6%sm`u:CJK%ܬq~tРt J~EkMj+ d;ݺ3Mb=*g[V #Ai88<]8rPmӤzKe2.%V#)0_dFp%SCGPƝV[9jK;LhKtbhi7 }N ʡFܙ~R,Ssڷf|1(mqыweΠzMA{dTa2Z ]Sv 7-[ɱUP ~Yi KՒ}L<ʎK/SzDFJks9im@;@LI3i&5fY-Z m-~\@F;h?d[Sُ$kbk*;(KOB/ JѺO,ftBЋ~LdA: 4ĠDQ:KJ:M ]1_ʄ)f38Z1!çi깵n0rʎoa(q N֪T ,E~X{RTsZADR4"E m?rC?ar ,nPFz ku\UdzhZ/ =>6D șjGRPFꓹ>qwi6H^2&ڡ@{t?'7 wI\>h!F?"!N8 `ZܮZHo`ϛ}j-ro'%|7 L ^KfADj8chٳ4XX()dȟ6*6ehH0&Ny r]=(jBFuBO\_.%}yGXsT}읖ےYPWűyDi۠;tXa>ire(RI3i&ӯ^7]-mpܫQsbQNv~;ۡ[:@!̗k!ɖp'hNπe*㬳Aξ}vKjEZj7}wV7 5m%\$۽fBA6 [waLCXQ+9nJ t ci DI ˦~ir9eAcEA_ZLY̘zz;\sպJZ{t3-f]'RvQVgrѠZKuHo]Eh RJ5~y2TZNq>*TLOۢS)γ˨]{*7[ M.zD8ElBvecpIKJt91C}ܨVͨ=ΤN?gbyLţ h"5Z1[ԝ=l~.,.=uJ=? is7j԰dzxY5ЄȸժWw*.w\훳^/K%GFe].\.WZn5uuTNz˚ Q襸sh<@4߽c@Y{Z&<qc`*Pg.1bVfkr.!ZaqQ)n87vmž@Z7u)}4ôZyořYⰐL9 Λ%u60q\gkSRZ: *tTQHeK~d2M : oSn->*%t+JWx3ϗZGCh!8Z'Fbj7矐w)bZ|/Ɓ4ӪkD1$fY{UkiU VUܡ >,ȗTj EN1`i*jC߇D?+v`se}2vE8D~!H|6?ΝGg$SЧXvP9*زgCtyQ}UVjwsKlq/eLYТDb"GYҎ,tDEjfC9|.'ae]w)AwaSB9ɫ7(.>u<ԿW:fDqz#өúl?KT\x:@y1£iY۞O* M ַ+[T\o! va[-QI+Mi$B:~rԀg t%"qK-@ mJv/VVJzcܹECμG = ?Coqyeu#TlK}R#6 B1jߤ5re)67X{PַO 9|jlk"g$!~: < ̤O>|!tL},Q/c>y~ߥ4=k?1({^Q$ۼXe/I2;2$ksmg?O=߭\<3:O$!%tgϮU,#}rkU,ہ 8eՂ*QPcdx8GvS ;{vJewhFG~B+R_gR? ;].\7YS\.@>H(`j,0 ˌ1_.4Tw(AVC.m\.uj}%;AIÉ.9|q%7(xv'=F[S^>8P=Hi5)Zncgz ,+ @8TKJvnI\I$:S~øb3L>2Dg-:)RE= We4Fz𨚭1PJB;>Rd{R*y`ki%!X)D4X9VؿL?+5ϫVĐVSsLp8h|H- #죏K +=QU926"8¸`*krmP,PQ9PKFzJ)Vs _4yoQ{@_٫d޶TQ);)p+L]\=J\:',%j.i̘K^>2:Wvi Z[5bz<Ϥ_ S2t(/틃vKx]blNzP9܂OAygn .01f43Pcq^b^aB\{^ d@IV4CMĭP!34J @ |קL -)Eg8TI[-TP2g F!8cj8ï1g+F|M%`yUE/bLz fժW ST0TW<)UՊS)T 61 AyPB9߾KvգPP9_D!z楈iһz}"'b} Wf鼠ᛢ=^A& qÝV3ݢ B#j\}N5BjG5 ^rΐґ%4bYQ5-btMK)r\_ܵi)寠?wYH%cVA|eEsYbFU bJ--|7[Ϫя-;)mI=9 OaQ9NSb ȷg-PFM);U}<\OҁJ4hFAfpLzݤ?n:!.Y{E^8ҥUo5#2΢r/]zј"lv^9ƴ~={,d{Wk`TUmǖ"-,vF8 )[z-YcPuqڮۮQ݈YD糌ŐQ`NaPdΪTuܔj TG\?T9Du_ݸZ6I Q@?O,JA~sx=s@|Ҧ7ҸGyr|6}zǗ1D{>! %6 ?QNx eճ)iiN~_О=)&`IFOFwfTF?G?R n 4=+1ҕhN`DNJ}H\U|J8w@MO g[@h-דؑWD6$J?b8^yj9c/ LN)~-уjxD),[M,MV\.yVE-ׁ(ld U絉 DC 1-l6fKAZkhm4U^g< B|fӊ) ffٝo޾=UaLZsu~F$N"AY,IBӯ&lah rn'q3Ueky^1!@WIZq=tRN@cEqfrOZ>r&OEG OK9{qVp7朠 m)e+ohU~rj$dYwA 3ShWZ>eK绬-ln,:p_wF+H%RC {B >(۬=||>[bA?gxxQꭊp( QC_iQf]ѡQj5J玟(ji5GQeOM]!GC\NJJ218uH(+ԸXk%?,\E1.J]jk0S֥F_" !:BӬu,]+!{OEjl^Q2?r CC@C" m IV!.D> gnA._D'< !w dأ&^Jz>sUu+`L)w'c ͔}esjNb`r]mO%y&U W']F Dw sH`ߛYwvYD@*H+R_gxQxl$ժ̟[.U[f@>ew to@*NeAF УO|扔ܾpMti9-{ (rBC/U \W}'zno{nUwnB.IdKdzӾKޱ XHDɗ$!  }߱IH2 ,13MTid慐ֽ?˽wHʙϱTU}I׮zddW,X|D1:鹧sϜ=:gVӎ[Xs^U pa>=wxn";tϮqç3+Lu]1z6 gNW\wiT|_$yW,(fV߈AV $f4iX|̊P,OqErH#k&CY5qiq|c'cyՎ)[vUV.RkoޣF7,nNJީRSjQGЛ{ &>;Է.u]vS=orCeکΥ rU=;ԕzJU&eU/I߫@]Lz"83R҅_#e=P ~O^c-2pAy8~ڸԡaп|Y(խ69G?oR6׫UF?:77Aku'~+A%PyJʚ=@2j;Vc-DɫpV4*'q瀡^긌ŐOZzoR }{ԇUhMY&3jT'N6U{@۔w7m\o4fLI?1ӎ.%1ӂE9-^L 4^6Rz<uzbMQp g}qV^qL1==kN;k칫殙{vnNš&WYs;{vn" ](PڊagՊ+VYhpy[q@Sn-W܊ïJ[u`x9\ ~ LSKN@HA |J낧Ee\G6TZ^4m~>`(Ȉ h$½fQ2FQ^f+AETS@WQ'E^$]4Rdkr؞"-Xidtdӂf] u |u>v헫. pWTdm-zXa X zA_gpĚשkRԽ,Gf%(RQL8-9czqS^)mb U[tZiPc}Y'WR~܂6 SclmVV>gzlZH[-ԶMg;p@M!B)P[>RfIE\!xE=^;x|W="upk(Ґi^SdJߋQpmRɜꐙqXz)2vN돛k, 2^i)wJƾsw?iLf$&ϚzM]+-wJ`xJIhf쓞 5e%/(C0 TrQFkYK(oulXdN< ɽUƔi rlC}]3i&3Oq@_=2ꁪy+=bO+}>svs6uή9{tsŚ,MwãY+V \ RLN9;|vtxΞuV+ӣ&&X3noYZCqќid&f3γ8O IiE@ȗCM #F~ !oRbdC&!PlIxค,<ޙeyA--XH^Qؼoy|CY :4<8R ǎRrA/b]2EDoqpK]^uv\Q7@k {ͦPE%iަfחWίMJ2]'nPk;gϘ&Xzx=ՌuUe~w ̝[Кn}f=S]^x 2 XbZ3PQq%o>χ@ѝrtcqz5- cGz Hz'IP—LI+KqgF,[#KG }@jPKP =N;awxxUa, hלqV Ok4 i3"D{teM|ȔC¢0^QρI1pQ%_I8pHD+39L1Pgi>99zgGYٵޠ[ĸu&pf$Uϭ("(j^@i5s$P6ˊ&v60ݙQ#VE@yʦF7Cah \ zQTհyF$aۖJ c=l?TE@ݕj%jThU\zհ>V*^_ȳ]dl%&?s1{}\V=< x |N+N}k,eZeKnJ4/j NmX)0(A=B#w&N0hB*$xpvϔPJMퟒRƄ-{^)[ZzXJzH1ْl됬Dҭu#VbJKu?8$X$7?eiF9OzVӒ#ӐwƹD8k{RڵόN\tafB4ZrAb}gM~[Q+-`j%kp}Rpƒ(cCfLaƐPÿXDUA0>3Q&Z)yFjGћɝg)"^;(ys_%ysWAԐm*r?Gǎu "-)#Џz`{^lA۞@8w WЏȼߴroS+Ƕ_U[kqM-ͥ!4.}=ňU(bWԇq곤'_s@e-U^]*WHRVz&-?X0$?)1Qja"S-[fRz9KsK{@Jj[woo mw+P]hyIm{ݲ'^+#& C8-vtȼ>)RQ]2^I5"gBfP ;gL0, |:v pȒŋĠ~Z[Lv'T;wٳgN8?=w>@|.phjtstxUbL[L/iϜu9s-Vz <g,YEX \ˢ@ZsDyBdNڑɊq W&bJIJ4>s,M2\f),Nmv(ߋ$}#u(Ԛi=%;4HP$Tƹ59Q=N$ rsQ]Sd/ My!+RG2k؋R1TAqfICji(1A 8e(![8,U jU|^s]htB.@CP.Cz>!.mSZ|%/nZ:Kދb|U~,/{P@HDžwA|0,a hif'T w`)|; zT)ݎƥ BfAuc18.miQn2eN]]ņ.eQt2b&¥ g}&> J;v{B-AmF(}O)aa;)%vPzY=(V_݉ۥ%Rz\lk/FLl5wh{ғն|ȹD_kP{JZA_93T0]ed@)T/VOǖo(9aFvŅv˲Ƞ0cF=sJ܄.lb>R)ͺ+fu 5k>U~P~ Mb{(r|yԗG?c==jAUK59Jf V1y[ ^ԽtoA鿈qha*c\4n];=kYFM}]Uf6(O[ f' mXz<".EœSu|"Δ0<,忔Zmpw/(>chҷ+ :Sשpina e=T\[!,]BIFf ?QV_;f1L02@c9|)]t1uD-UyQ KrREIY tU}~i8 0\ 2I#7HDMW]Tb\N^uKT3u+aRn/຀ h ԅ_*sVꍤ>(KJi`VJ5r|τ )Kx^~ Rjiy2/# ,!Un='׏N]3Mi-T'与DrʔY~Boa/V.%eq =WzC 9ܡ~MU\>ކKىX^WJ~V_8T4C @{MߑOKF7pX>BP1kE{mu=jEԍzukfG}T<'UѽezZd)FjXU}<,7_;侽a*2̤4fi>J0v}7e8F5XK=am"7 ?6==|:-<'_ sp:ls9,򁫂4$Mm?0Rʞ,f*,,QJNQ\&Q D Qk5,!0"S*~'i#p5j8YNV{UTe%wjPoqVZ.w6<ۮ4m`Z-ۼ $JCrj4űHbr% K5/ЍJJɹ+m?lӒM`%E}r$ EKưnK&ԎҌIA gݡd>bg:>h%SDUEh C)yD::$&P{~ ѧ#vщ{KGO9Jm[NfQZܰ_^^F+VΛ&LZ2c]iIjPqԥ#9f$/uS#)@[H9I5hϝ菲q'ȳ_6Yqj`^m!Oi}%h&ƀS)DlI|Tz[h,-LWYWNеˌ zP6I5۰h~ =ܣ~5^k^W.VrxȓEn?eJm*#|Mad<|d [K QG4Կ A}s#F}T$WDJR % yҴqiǿO}W\#'"ys6qerd;guP Ϟ+C⮈b0u|y3/μ˴q֜(h&WtnE?oi:0#mNpZ\K4ںӅы5h;`_G]X6#j= xed,žڴ"\ٍ'QZm\OWK+${\H[c f/0+тGP`/]ruP:*>+&hmQkPDd,.)/Ђtք'+)[4xWաuh}3l GD#f0mc26P[Rgzu["F>$*-ŴY eTO/J0c-g@AW-.P&~ŒTWZ;wX ׶eڄ I3%wќ>mw;Ei3uĞ}Ꝑ1EuCru 05^Q?܊D Zw@ˎ}X_k/P/Wɾ{0jz AݖnϘvCc˛_(Vz6I:/X{)!$7NDi,jJwɴz'Afn qܷ[oo 'N RAA7ks1q~u#Heߧ>}s*xCH=H{A0O~L7/ *3BۺK -]tȂ^h9Uࣨsթ1hscTJ  DHTGl+4#@\j#s%oqH"BwRqXHq=%F˨{I b:5'98˾8HKFIBg)F4Iq5; q MϿ,ȯ_h]E-mـͼŌ_x j{mN#m]a4k(<&4hbjBotLVq+khXM ஐ25N1seuۨ%{U- c@7kvK&%i1(Q*o>^#܏3Ϡ*ڮ׀DRZ  #hzK(|nm+%i`7 BfF%b] qϬ!wVx_l{Yl8 w\Ӹ?2('VkO긑|jo50Z|wYόX2;vIGDzwliJ8Ac/~vVoʙabσXS-R~ +Aw[5mx+qXv"𮈵n7cdhi%X1EwЧpe<` zy4}J}E6curpJ٠ͽ(_X[AF[bp—Eu^@V.}D$wP-Qſ֩V_4z2~_m3,6]mmÝ_VZfZb-r4'33'83nke]"՚Z9 s>jkKk6jY- >O ~7Z97~GeW2F{؛T- I6[7FJ6W}vؽp?'s3>}ݲ:V;Oy)V%>3kAVERg=4 μI)؍ܻ/ؔ9wRP۠QZ^"Bp} >!JﳔerFG{SZNuſ. aj*2^T%K,;Oer4${z ]O0i|I3i&#92~a-!nruHޒ?ԷM~C="zRԠ%h)]x5%Nڌ15'Q&IokDI4وPC'q%?)h1}n,ő\-ڦUMcmA'82*t3aA<>^rnK=)ǜE53VGo$JH5' ڥ,^GiJIކ(wc(F.ɏݹ ȶzX?+}|TѺU,I+f OVT9@( Ȼ$0>jƹ{ղ)OS2"㨇=:֔Mm?l)ir 8%l%e?1w ͸z;(apS-mwaE*2nFċx/~ ܹA5 /1M(PֶII>m _hu2.ubd䠾]F(09lOJDb;GQc7+kٳϏ+-%5/D#E۰yJ"6`ZܷG ٲ۱GMV)-mGf7D&b5 k\0lmO%j\*tkNA/׍J~`bK>\jf)cԎu c6 s$'&cUqo{-9xC,uݞi_`ZtIKmQ;s}-=FiMgNR~S<g%zDNU2Jj|}87w6jNi^q3GFPtkڱlX+ğ9+d 9>s]8/_W3i&pz?a'{>=׌,]B^G,<_AQP r%%?s:I%z K9L’$IԌr3nR,6ZySǵcgBJjzQ깕J# 'P;N8 b߯Ŷ_^ke!)yաlReїl4<ii0D5.Q#McQ$qÉf{%Ur;rYH #KNj*zaճki'6pxS}nݭ֨ƍ$A"%V/[I.@+/\k~b%¹& %r'ҼW'){իbi̳xG)v 1وl XpϛcYaveh]/|ՇM3 [,(ۃcK=Dpy4!}2JBf[+,D;R^,Q$%t/@׾1cXT߀ϓXj FO;Pez+j .GܪɞiK8nm.(3T#$f>ڼja禂!KsǥgIFc;ԏqAFd(B%yii ukDirW#&oɢg_ej%_)Tk`r|BJ:11y1OI89F*Pnt9 eP-/Gs(ִZe ЭAk䠮gĵJ!KCkgTV-LM)ЯcFQN*|}!=jzS)c_A'*JZ0"};N^ͤ4~P$A23?tP9r~HuNp-ȎsF5bw [ĝT,R"^+>svpWz*Y|TBGSIE󆊡!zb<渐 *Y3ɵh*n2diy6wYWN'z9p "=nZ%ӓGyS0sC?40ځAl&!C>Qx a&YVa]E^^2c\iO\u*X6u(yvDC8"# Ǐ0Z :58C;F< 5h^b6QY.[󗎍\𲠷RN-3I^2} HPl<b{Ղ~\FwSLϻvSS-RA'ȱ* =U=.{B9fQ+ ɵuz ^+6@a=~%LZHޣ&50գenC>!HXB1Lu]/#Q:,nǞa_PLNO h<$pxd]K7^-h*!_Ev?!/zh̲۪-*z3<: e}LJXUj1~B̵Ki[icAZ7=L_2:}{xgwH}Dxw-O @ ݽbӇ&k Eyt KQ^_#ǍQ/HH[7Po&O³R{F'eLtWz'*lQw@MZ,K10\  ΐwQ*gYx=glQ%~^$wS1ntȳN<2wGwQfP`a] mxaq~x?1 FC[M-+3(qm`sO1mgwY %C9Z 魻Xfqi-lRarYD}ĿE,ͤL{ iء/\wj>mAQ ]jNht+z]%E1렪/ځ, S*C:眤H%4DcT\c*)r&Mv?8MdAىB,A8f46G!??zbpniy^OQZq2ZuHGRkؿ'iT jD}^J tNy=!!{:Z*@(ߨ2aŏÆɮ{x1u% 6-|h2W\߾D~C IuOZ|ٶCK"M}BX,FS꠱Nޠh? u?_ԯTN2ˆOUүhg97a" ͒; ' UhI;DVDwsW}OJulGU}^Rcf%sȄtIGtk϶l+(cG-]\+tw!z;a)Ϙh J- =:%WDK(FzPqMAVj7HͱZ6j-˙T`U ^(zS,mk§'o'2s3h< L">Xj1'bڍ A'@X Q?mqKaY<#zQJ.#~^O\4j&l }Q='s4 /P^R jSAFHRE+ )V+QO]P5S"{j&ͤIk/™|_msuG,QoX%0E LrJOӘ;#zd (vO&t1L0fUc҆@sdLSqTft'Sq( b3q9IWqO^wqr.Q9#QxqѰ6ӘzuT%1 "a6Q'< 0NlPif".3;<ȉq\\VmT8GQ48~ IUJ8VPtҕځe5#)3D쵫gbsW܆uF3:PGEo}[gqeXCNɺ~X8ݲrNENY܋jEe-UY~w &ADh@gBoNrz^qpqsړ&XK3&uR\y4<#[Q~+n nЫy/PY0maE0%kV} s1$Z(Z'FG_GzOW-o]w^1׉kVщΜH4\Ҏ=Z DN˼n^ uCEbL|>2~m%6&RZAW4hu μmT:z nʸn|à]4'9Y叴9z\WAWI?u_Y9r&ҽ=7kĎzeY/SVގ3)f*f Q/uOiE]o ="=IS[| m{um}~+ݦGov<;~0q!-5ݎtS&hX2GGy ~=%.\]^k2yD@@OM}ұ<5"}U <o4f?d9Q4뗱RZx>KOxF\tX#˿祁t ӜC;f2T̡K7yb103sZ 7Có] '&޼yg3 hȺLQ+E!(j4JXB#}5<'//It/LgXw0TqӼY݂ JKG>Gt S(oI^b(jR/19~IJ /m5OAeT 7C=#|1#%^M i\ɬ1g% '#ϧm[1rx>.h6D0_68ZDMOX->"q6b:"G,݇S^[J< 9,#D0Z1ąMcuox"#B Ϩ>iUKFFDЪUZ~ Akܥq)Ge_kcx=@_ފOur go XDEŪX۳Et:J0fLI3r_0b`U}2Hpde,Sa'+vsU8==ڜn>=bikW=;΂4-\.G)(NB{@ypmO ]! z9LMsH({ނ?\G]B1n="ԫۧkyF2Y79k9 kjY=+9C$mOo{mߎp|Pۯ<#Jf'e^4{`+_Z6BhPKINYRf= 7-ZRᏟT_(e|kdxX_kϻk%FW-jRwneGž س2n H vXv=Q CF?V~(h:8ZghйO/=Q@ې1RSoVٯlsQK1fjxS쵠S3]/W(bq*[v5o﷥W doQe/̷`b<ͶZ^EݾcD* zJK\8F/vu;vOzCKw SXD'WJ.V ا4FꛪiݣNV]#S }ENAݱ<$E /f(vw uPDQPq<’[~̔9j5zI෭fLI? _42 hd%m N7G%/H8s[9Is{\{@JH5jaHtyI1eLI"QHD'nmwJn7JSIfX_\(=?E)>#uJvS11PЌ02]u_ie @ZRƢY0k]Kk3NN뺵Z9~#B?J4?ךNQGQ:Q@%m$QJr9+F(nk?tـA\Wy4P{@ZR( ÿc$[= F-42r턢beuBVn>&5Fxi#?gB GpE|=o *QNYbocq:CbFhʉVȧ"F.T+5m$DKݵ֋Ot250`_rh-eJݶK<3Ūq`0ؙhpR m{%}(_SP`|'*NNvw+ͨ.]?^LhjLvܠz\H\]uYQ?g,9W#*u1^j8rʾFX=jQh݇rb_t\n3Yŝǀ-J}WY%x!WW-(^EɷVh~@"p0 #(Eq}bՇR5/D9%c#{HbPzUV\p,z#h$ kgFQvm8Q'@ @$VAk}٭IU[F^%}'i3^ԝz/F,.=5Til^b{u'`L 8- JyV%H%A眔vwKn󦗹ĸ>}L0W/V^ej++9Zʪ wDS6bُ9>oPXPo[N97\yKG^" ( "njo C dlaJxw&k(ۿ%R]&8.' Z{gO󢓸64V;)fe(=cU]sp ;CeU+g{ԇP&yv)q#h'Y^ayVHfb,:~ l&2$PO#K%i#SHۭ(f r1ueĕ/^C#`:!rr˖9YZJ4yDߐsG2^X); r}r:غ7}IX">@Qs-p46{9 ܤF63)DAxPi܋d <ò_.݃vu Ә=76l|jD^]+g;3WD>-1b*3jn]v[կ#O _mŇ+3)w/{"Fy-}ܿ^g =}<0gӚaiwU%|د1'?~u`JTm}F['hxd C+dt}T(9|-2ğB+nD|[ͤ4f?䟏ztG/{[`# -/;Ւ|+Jǁj6S^JN-M)q0mB߄u*Æ4ɓf3ahl((˚&>~}r̘pҹ[yz=-gzp{PnWo0g81Тt+LKwP,N#J[=>)q}+!c14/~}pҸNc@dtJ0zѽ2^JFnpZ,XDr2+ [ӒB3Kg]Waa9%~-`:}O 9, `1]ڮ?AЖBݰÉt'HMHhL:gS*=>UGG=|rHYZQ;o>fLI32rV5BC~M\y&Zwro!QHT" &D "LD! }wz]GYє(0 L*Pd˖wwξB]>]t_UOA%3swӭ{+niW/X`UW/X`buWmQz͙SNyz:T5yse2ovScͱ`<k3kg)3+g8}Tul3VJj^-ٶ9p~gy7x8ϳqyANioQMX y(\yi$(yCA~&im+w{bɕ -w,\Hnjw܉j;Gj-Sʍ~vUn?Vt@xGU/^{[J=>VL8,]TޭnsKT}xPG.5#>.)yvڋg^TCgaӦI?ԔzX,NHJmϡ? ])i[C[R;6VzJy(y2wvGU?J*}a*drZ_:; Z 昹a ½A)%5^ ypiZNL,lCh8vZ{PF1=ް](sz0,m@{JmSR^6ZUII gpKDL.[e˖IJ9S`i={f8=^}řt4q-vNn?fLn.WtNWO7VJ2I%eEZZAHӤ  <6* %j:E"eiy^eI|T Kvo z`9$L$Z(R4(IFJeW@bQIz,F7\qZU}*þG㹶\{-'igqT* (-u/m{B\.W'y^/%oa[>6Dx vuWsloD_r2FI-( ,"{z1 ) `sPvm#D*,9b_#M ƙoVzt)K&bqu4>N ɧCRN38t E`(KS—A/I]Z:%.Ѵ?BHxH)4|5ΚzUaYnzx"  Kk;j$;~ ٩*J d?ѹMƴOZ˷3Nı7}<ʜ*oG/CS ]Y 1)䄞 o'V;[Nu[#'àmyD}_VD'Al91P08xsVngB3*R>8=e)a+r;A9_ş"V5``!P7Vs݊'cB9w3e.*?JӪ*enQ0CBR}n\}m(]Cv.7W*IIӿjY/-ZEKRgOO{3vuYmvq>۸9;~t>;;9}j)g=zlؙ]̞nΎ l:`Lv=5(;/c ANQ1͸Ey݉2 zLu HpB}P~ՋRӦ}1E>BsqG q^(J f_~?$Y(-DjS3iܷ,'V&@ve7Ms,t ?A ҡ톒[LO4`mf>` OHm{b:{=RfZ> o9_T*aiwqu!odl֩qt woNɌQ W8k$w-^/9'AV)M0ud>+ךfwy0Yl*2F^Qz;e- C?7~Ç}S:6Oww2tEW/Xxvʺ5DTWKT^VPy*䔧Oٸ>;6~ڱO*pSQ]-V6Wիǝf>66AQ?3;28xuܞEk5ew\.l~)'\0O|wfWMkYHc%!wuu|`Os)UFzI\T )?8a'``aV5&T+l6X0w򋱱&5΍%p 5dĝ( 4l k6Hoky}MB@N0g,$GG\ֲL~N4&tʫ&V.zifbROgcX_W|~Gr5kt\iD C Jӹ=k'[d-V p2F& ]b0b~"%/}- = ^IFQ_?%(qAL:^"ݢS%)ۋ}Cj50~rD~FZٍ~C!){H֭ң`j?p'!9-myWàm3"w~ xγ¾+{  ̊ mgdN '4="ȯ^M)W>o}" ^k]`+A0;mϳH8O?R:\{@$ǰ9 #Nԅp pѐ CRoԑ#' b^AUҷnӛ!vzfZSߙUڨsZkзW) oE-dĔk/_3{˶A薃 lyhբWMlZ|ehʍw,TdG AID3m>"3 =iiZF 4%u j5XRaR(k[?PrVNkzQkASߴȂֈj.cb҈uR1o[x1ѿd&C.-{I6pCGOZa腴_Zl} wwHM~KIRzPt'vm[|>vfKz-^er*8v ,=cq>$b~GQX2>Z$\anqaz7v#pӘO|mɺ\J3653UDxW~DĻ>TΏ'Tܛu(RZ" 9${ӛT-!hd&8ruHJj9y>GQ$:)݌~{;{%iKlҜ7B@}EIf'E޴JzCͱf9lJu30žiŻ+=c,ҽ]}|DžݿQܯQElK/kߍYSxG!jY3eܬRJG~#:Z=+">6wڸ( +xPQjoǬha _\WI/_D %譻|Ri>Pf(>y3?1x~jve1[>5vTT$fyQǶdyq]o h~aDM^4ʩɭa@@E eU<)j=e[@a?j@NK}x'YJCKПj#x>V1hþU|; &/Rr4~jwY~GL8v[%_1-o#nQԭvƏCsROJ߁Ͻr?aTڊvغ9붵]n <z cAkoۨq}FќNOnRCzd^iMQI~2(֒>K·*)-O;zUvgEm8C `I3HրiIxj.zG ;uHHm@/1 ?y1[i+./t c>&|D"7?[8UgB{ "V98#{g.~B=_Ff -bʰKuD>nwt-U8]%Ei@28'82Hlޅ?@(wڿEwʋA%q=Qa)_4wÜ3v{X)yU1Ω{ϩNtb|:ucx|tŊ,Xd?1"sZWq(JRYĀeR (쪗W];ZۭUNmۮqivZԲ@(5(jl7]kĨHH9#7ZY !ժe^/ʃ['zQ\MR4ΰkg`Y^<+}ϋ$Lk?t* 2\I̯VfEahhG̔Php80  ƣY{/Vc7\69"':O Z0zN!}<;:fP2 gB,,d<+yywc!=b?ߗWf -AX,=J[MJODZ,Q%"Ǝ\,uٳ-Y$r=uv;I"~MJ]e*X v}K=&D܃LC"렋Ne'jүz}e[s}VN7zzt{oZ"gRdOޚC] #tOZ^^|t!7a08ՀÆWJt͠Sp^?p1!n~FE"qq%v̎Eʽ~g@MԯEwJ2?3 N#6uQ]z>t=+Pt<@zS3bɴ#d BJPA 8 <)b-*y Zƹ/=s YvU;Xac.IRk wzl1 S"̩0HzB7xY< O%<)umT WUiM)IUjirXx:i7B=9M˷XzE W,e*Yťƌ+1FOBe\DATt^YFKW [wՐoju.K mNKv9VökU7-I D(IV}Fb°>ĵ+]R1 @دȉ|uGu@GDn:F~9X̍wVu!+1)ecc4Dc[]Ah$thj5:aӂa,U`TJf⊆@RА$̢ N8ʿ0o;!}h!bQNɨ|jC'YXzĪK]VXJ]\OT6$xf: B-.Tk6Y߶\%BQ"@^HB@$R{l09K4k,9URFkPH(t(sN|-uʧ%8jgڶج%}C)Cz:mD;IsO# YogE\'Xt 9/{9=*fJ8W_4\F~v)ig+r?twgvPi+(F»{&D@{9H+_Fnyf3}Rf[LRY 7[{2>UL}ReCZgrAМϡ.i⺭Uw!0 p̌`KO`3O+P]Sr|>v ELV렓1 Z Ϥ_NH AZB#KΔ(}WنK94pR7S-ey8kZ|&(&+W}tp<.(QcCDB7MCg7eiމh%9IJǣ$rkp_]a uAFfp"gSh=밿RFJjSe`8^yJ|տ}W@D:Rǔ2 L;K]}kd͑@ >Gevl-=~\uR's!\_$r.Hr" 'OcX{N ~*dYSg4ԨN$i2J#ͤ6/n ۍIC8n\-U/Q]-,v-w4j0hu&^|ɄWzA㽠#ý[C8}U^~}ܘϕ0\:^N[u~@ȫ,ےKX$I C[}n!{N Uz;r@0sel"!R c8 8}= >_Cp#JqU?6ܙN-T9>S4Uj";Ig>Lw8n,ؿ¤)tzףo47v ƶZC%9M$Һ~И*=P:\.ѪvI{561VPM`pK³uR']>b\_"tNo],YW>8Y+C 7\y|4 W@<(-RFvؼy>wyZև | p)=aye/bp .Ԩ?Bρx"z6>\cJS/UKԫV^aHy|3,λkU}Q|>O|*pU<,ob#>{L]<)k7jֈ[&JjX'0CL*^WP.BGmIfhO_}mSc^udyU)ȗ^zx33j<@z[Y=o;cq|IcZq3ZY+VIY΃(~קڸo2 .B]@%;1seݞkc |<82+d}p1III?lzbգ.sfߢW/Xx uv_z+7lE|%zz50+jIDf/K8Oѐ>) d,bieiQL-̒$۩VKzPw|8QW*>Y4N"yyM&jɮN2I}upRPqڠS`#M3AaH#uuN-Y0iobUk9 L$V댎L=@]vǴKF.E,UXW,!",Mq:}J?X:z*v12EMZcQ ن96=&DD){% f~+APp;p@9|{<( "UPϨ'6cxr*Tm+&sOI/7qOQn1hxBų#6d*Y-WU'uR'uR'SH+$V*KR<.˗-߻(y̩wT8[* \7tFn4Y4Yo)`SV|M硵Ͱ6cMbǔ7S|-7 Rb,C9c4cZQ9QX8UčF.J_@Q8A /Wk8z!\d'y1[OfXmToĥW>z/m*UXgI{CbOu@xxAJT8W$VAn~lGo!|7e>?z\-v֠d~ _N~@!շBRzYiW@fB.ZU7':hFهd˞G2a ;Ɍo!A:d^#^+}G\3b㭣b[,f Ӏ +.K> tW{kw47|1s7esf{;mf.2Jw$ xJ]mHg[dys"٭ާZ9BuHFi7wBc>%|^Uߣ0a|Y#j hV;iàv\o '֍hdDV?`'G"?ț Ro7#*mp\[GD];29bRRO! Z?"hviZHߺ䵻ۖQq}_G *-@W ?)Z5G-MM Im Ó00Ge++ -jpj:S^IǼ^[F5 lH6,oKB!Y"kfuf-/|Y<=ws,ʌc.AӨ&b C}Hjiܥ|J̇]"s%g1CވY>WV1f=WܧNjV_3Ѥ4( _ $r (#[ d1-hNN+*XpgV3[I2-ZyՂ) ϼ#!K{Ƌ햽,K3z fVhӺ̗qiD4Eq|hk6́"EM =(E(x^{e/YTw+NX6:L'(C)xga9,ROnLJcMw*hNŒq1i/Oe qkR<״:BbI-oɌ*bX&"ybΡZXAv"w&|-Ӂ Xyd렎{1hjl6J,gR>|SWw0zw;rØ5_Ԗ5:~tSbiv Ϩ˝,̓ۖ/J9_\HT:=:^-Aw($j̓}$r8 @IR4b7adi:]0c4]qIE/eă".S4a"Oi| FX^jbIdT'NLxT=dZ$thț6fL4ꓨzuC])RCXPFN#xZTLz!'=݋6r=~ yCpqRrQ<-&M z9t̒1U]t$h*4v˙lGvkBuR'uR'u?29X1~ef .Z|E,P{eRb>9n>w1p\VQvXȳ$7yXU-J jC ܯMZ(hU_8v% "Q`77A7GgtgCFJKe-Dߎ2^n2WGzT0-9U@iN?l<{Vh S$2*އE-2Q."RjUMV/ Ԟ!mw(~I:֌ß]1nZ `djA6Gɑ]嶧RF#A\|!1L -{#x[>ت}vc ?.s`x4k=R]5_Ϛk;sc j%t:/Ұ^>OG+m6K ת/}9MAE$П+gF%nҭ(xԦ5%VI]7s.6߷ }rQőB&eضqqᾞKVQ-?MΟA9i~L?eE{l-K:5B!ϩ+o巉zg\$33h+XexZC% #_d @7[WѳuW-!xrIwHg,Κ92S~rFVؿM[[{_D> aczJi=+(G>Y^ʦf\:xQdQE?)GՅtX֧2B|E'u2`v 4d>1~eN peJew8KZyy^= N#*8i  RC{e<+"e1(Wag<+E;G_c1`rc>*ŝUy&7crK8 ":HRۍTLj;ț,Z0q+.).r8$ cFQh騿= f%o`M˷i⒣"@Y.ZU[0ϪG$ IImX.NSfo`Epa9܊c0Obhbb)]aDN1\98%O_%cJ,jvpw* 4O;ԉGҀf⠚2%Df~pVu!6Ts2u\znX_µ;eܮz/FE'NSUkn6 q ;R3ڹK8D-tߍ9WFLj_1:G$=b넋1e⊥t]bzem~g([xY9d⇑oo6M{, @)H nn{UZ|i7Xr0Ŝa/|ϳ8pэjI=2FiFyhT'@.P[AQRJgB)7\U/·l0 g!׮ )߬ x3[EÈr;pR9 $0yZrux넞 L؎sNkQ!+D׶mzz<AkD^UQG%$| $ruҀ4ׯZp岅ů\_Fi|51ȻUt8[au)vsqY/a^V1„:cN}cfKF~9ߝkO[VxNbi1R߾V(!J8"혡Pte-:Zk0oˊ~ 4Q#i sK kPP^FDvcP< Rۍax?aDZ;/[ԧ~;O*CGKqzwtBf Q/yh[lQY>ڬⴊ֦8:VڮStR]ګ'L=uCY%G4wwN6<_f3ލb" g(*:~]hx$B}?= m|_'N-d.}Pq^lZ 125!>sۅ >?gU'u;W ~t^x^/_*xp,*AR^9jyIX~qRG#}.R Ê{A^\O0N@?WC'Q=NFsѦm׵u%&^y(5p_?ةgCAGCiO*4V(py^֚ wpұ2\#uMVPOn;FY 7} ~#"XzcDžy=>W~[g;di; `E3{F>Dk tY9x|sQ|2-# m80^5Ţ>֪iTKHco uR'uR'u?aq[àŋ|"Q򜘫OXѧZ)U*Rp+n@s0Ul' 5y"ȉ+JՋr5>w]g8 aǫTâ,FǑIyM9L\DjI"77\GyzK]v^%QdɈTl7+aud巴ףɟ]IJhh5#n@IW顃SMAZk41}--Yt -Y`=M^mYj)w8n TӢi.+㈩ewU}I84L!$=qc7-=j3>-f@uPo ;*z" tbx^[g11|pkC5?C j 6s 1{S3t=rSj([n i8W:,"[cf~OE+5m5_GJ<$.zsj]U׵{Z*[:N MZl2匌ߐʇ,-csIm@71Gh(Zn*{Biu@;R mg)Vנ3mGie$<fHi$=["?@dpQ!1(Y])KfOGIIHJ/nk5pG[%^y9EucKrOx}]V u0YQY\QvQ1ğrernlg:c"TdAF=goL3xlyUY_"Ms D:EJ[s-oۀ>%=G^)pzE.#YbjX/oW3X8]ϫY#k$0͒,qgbCЉy$I"C6zF}(FXհHq:jipa#ifv}lĒ-R^zѢj{n^vWQ7nVo{Cg-SR0ڏ 3SM)zIMYquה6:Ur<.rnJau:n1B}[q}zǓ;F=) 8 1~u˪-#IRP N0+=6u}2=*lhFtI}>^uxZMfoBqO=Iۭg qJfT5 %VaԿceuQH?}K=>u8^-Se֫ WץN*8tn@{31Rj>uکک~YgSnZLK/]52d2KJ|/ॳҚbtZ<T̙5ן./^?|QΜmP^_)9ܹ괲R555Fi5k+k׮)53ʙJf9wf 9`k֬]S<tvxn}gΞk[X>=IOYU<=|t}ӕ`{iI 8qEw0U* ~׉02RU8L4 ?BX,T*nPQ5ma;Q裢~ڹBkSuKHR)n60L( Qm*>4TZXA5׷;Qq%vN)(EFIfi =&Έ0K8 E48< 51bd@ݯրZBPk_"_GAy  ^qj1%Ui- p:~RY>nъ˃Վ[N.BQ&]쨀"5S "f .#Yn)3b+GVhyD8nyUKR{>m )NiOf%5_)<_[-"IM1BAJ&ް@5];.%CzpG(حBu0ү/7wM]/cަdUw;qkƴNvR{߃Я-Y.T?svNO nQFKGG|"K[W88fmrՠJIOBuH fC~߹0TFhq@T(|L񗒻 ZfĎ.$95 Vx3g?[3y{.BK'p nˌނ$Cgy4mvIq^nuΘij('Xi'O{j7]J?qD^k;k?vֳO=U;TOm3|g3F?{ɓzh)7 g9˽sN SқyɹS>nW'i@v]ؕ dRP{{VcfFwKpKx]Ñ>_Y)R枸u>j= y6ˈTףJvź\]FbLQC;S;S;"ҵs.4ZZx媑J=YqF?( =w"Ο^3.9BqTooT뵡j걟R dL5$HCDMN#)#g#\6Qk1~,5_@ac1TGk<^P\`A6D+a8t h2¨K(z˵SL~up%>2p36{^ynk]g ﰔF7>y 0Bim˔zBƍ- AǴW9ҝG{4Zai~VMŻ]z0jf3=+xJ3b_*N/'MŹ2vǥ)sך/O+'2%-'l̈́9*q0=3ynы9m|~AuwltDXwd}A݂ɗ&Uַ4,ڌ|zަsL5^Mn9iI ǥWߕNޥ 2/QavjvjvzӎK()[|D6~g֯_snm~8]c757G4*d[.xA&Y%" E")Tlqxr(HDBP'/"ɆpnHzRO^o{DV 0U=Z=J3Ƴs`A ΀2?YFʹ9TF ]Cu]N*Hs4 c!J6]I'c1OnpczU~:;oKiy߬V#kj45.j5eM)tN P¦i{mYMDسӌ„P͡ ܇zN $:ZE)٥4H|@>Ss$ q#p2(-ĵI4Rhj2 GA$Ⱦ` &qVm픺ڎnSN=-!jϗRڲ9V^i HvBO*}Rv=64jgV1.ӓywhz i?vjvjvt\h5_y/VX h5|)^}S bK]sr&C(Ճz`8~"#@Bݪ$ , |,%K#!0nF5G>q!u(HBA %Wt=8\*,NbذyU!J3ߵ.W~(. ]FG.ƾs# VߋKVlT pҧVXpD2i9bnl>:AɯIiz@q݄i\xƜ2`P=Buj*9~T+FuM}FAz{Qiv!Ճ>v^QN|SIFS2*:ZIn^*Klɕ1GpZvP++b4'\R&m?k2Z@_sPlA3-*,- ] kâ2m?(^_FrS.Q;&{u!=jvjv&炱Qs 06h2%jUl͚7W`xT< @!U, MZU7R08$~,$xJA?0dc!M(Pc!X !r.LB}uTQz1e & ևk*pY\-ʠ,mapW)qLTOiuIK7/,Ë,ONa&i w9iԝ,6<7,=*z4!;\sq8blp;[6X[kg#TlC]/J𝨏ȭShQf QX_ ,;b}$:$kгܢ%##,_2j?v!r< ,[1$5#9Qҿ^CQ\NY@ Ǥw:&F>G0^7HS:ci.JqYh1f&j1aM*R01G?Ѧ =2%2i̊F,ArFIY~t5ke893#G'Uqqeރ GککgN.RXV,Y52rdp Fά9I]v], Fn۞9FaV Nbw<@VU afCbQՇ̧bdI$Q\#Lhq5z@A%COq 2_bB,Y渎 i\#QxtqeW;}r330|2Jes}\/*G}(қ;Aw9s{8FvSFNRKٌﵖ2 Rm|"l71mC9!;ԏAokzJ9BEZ DPsS:X4|/*AAK2w]e1PiHд>qکxAXTD^Dm>3OO 鿨)c;Uq@XZWnɒ{@jRf۩ک huilt1JWjk@,5.}w|"/8"ԙըS*_@'IgQD MR%-Y(Pa ]uA},FiJqkL DQfQy\teMTEVhj*.-}ۦF-ny'6ry5ܦi#̻S4t0#l?ioș#` kp) y)Q0Ƌ$i+6=2W-Ӕcc N%UKÀ%lG!\E~3Z-isj43v~=iY֔[PL͋[Wmq[(uҜdx~[\-P/UeKÀ,Ӊ1쑣۸J?nw(yS87=q1=t\ CP]کک~W vV#YdѪѕ#H4|AC Jodo]K2hoTtrfq[M6SxO'SyNշTTZ6<Κ݀!(UJfu!;,y3c1ix1?)WjQ>"ߥҤKǹe/$Qy8ֿ 0QuTųW䠑/v^iX5]~A@ ty풪{ =KT,wJ:FH[UMA\ѐpLRBxJfDͳ-fR#_}YH5mROg8>#D[|\8tA V:X9Y>=vjvj ({l\-V]o(>/U?ƦWl %JE!@>$&NC:atAe2ésȯXEI&dA(TqT[je9WR q֒8 kԨ5ϿjUyG?9_+vkEV#bٕB>_w+mnע0omNP(.^3 "FW(b|.lDGı!0Gr}[5r{VZ-h'10ǔ}8ݑZl^ :ԯ z|r+'}o^@7I>>q" =bj^mQ-6%EJ̚-+~ua G=$3qh7^.rNN^6}'K+WYhRuHҙk ]+Ng dOſ)*z_Ugg~Ł(pY؏zX"?R/2Ϊyt-xy\. FVs2EEz~#:hMX@vAx=N"'fe 8YUkڨIFUT8zi5ѕXO"OIA"1S.3d~ hd9N9%fҪӯ &Qa‡ZF?YQaT(8,ǁHQ;'z-撑? Ł,dG+>*# %ߎ(2GBY8arRQ!&aW 4,L1N3t\PɐpWZUB 0J-Y' ^i<朒+c9OjH+ ٫p+w>"g{Dk[6ؓj7<8hQty_sQiʨ=}k@SOn f3-7 ݘ 2@KEmC[뀙Uң|}V)vF޷ůia!sKx5%.`%Ĝc3'3PgnPZzPլYTaf <+[ړI3*3GJMPJnz\ z x'bH%oyYU,aA'knyF5+}Œl>tuo"U< l>N:A: Sx)/W9n h}r(gb3!܀e֠?U!y<}= Z=wjʴA>Kw4|S^m6-Uk9 ('zt q|\B}gP>e?b&ܰ=iO{Kk \o~$wJM&ngeS 5a*~N-,7_*Pͳ j#އQ8a G[7JeQl`ăl7DޭjM! ?db3Hcjz]9:K8:EpkսU~ԣf7`pN9+[nL.n:B_*KƘh{\|hNl 7d+0h1ô*!|~X N}UЧcGNJ=yV"MXB^bt >-M^uO^~:hZ8Qש n}Wp,M:?(f>LxNd[USu)Pe5MnZPMV+EǏ=u q8P.}js9d+*ZଲOEP`i?IA8Z)~uPrBR b(V+A?D.@jEnu_(\$_6n壗]_ e!緱OJp|nTVS"vS7#Fx/Y4n%9N2>4鈜MtRbq@xp_f=(WoF'q}\OH؂L+mn9;U<{o 7aCF>,qNPOc©܋?' Kv@A}Պp@4AMRCZ" zw36^Tca$=hKǫYƦQMQ*Kn3Q#N%NGITB,m4AcӔQӬ̧J~#iU¥8&ϽրX!ҚuG]eшGhTy0DN#kޚ~{1wRQQ󄾃DaAץ~ؿŢkG3_zdVQ,j *!Ώncw5i;D FMO 03V}[vn7X2<1RbA(BTc?Րa\ĉaj&ͧ1y)M_ jlW^A z?2w!׫n82;,|%40Z+#;7^+k.PZRYߌ(1L7;)✪_k̃ZI%AsWNik 4݉<yOk.V{Vu =ڂ^IW?PNonzy.yW,#~O!l2 OqS ]Sƹe*𣘊QD@ @AU#I"n*ij"*AhjmQ-*o E¤JLwEV4 0yE/3?&@Iʘ)Jc#OI?GEqkQA O4˥Cz)rb1W PF%@RTrxNgbHT L-jBoRXt8cJͶj~ lUighiW#4d1W*~-:z#]r|ҥ뮽vKWpqmpqn<׵/\P#eh\}vGcKRMF]g:cL/ ӽ$,`5d.6wC- F$?)SZ/t!>QUFZDuERZtP˿FeZ/PvJc) :%|fŬ]?^zp諭}(ݔoXfXt ([VU~}62nmf&k3H̭(}R2K߯ryD6|6%{3}Qd3~ 5POfUZ3F3z-מY@fy7` 9zuJQ bYYj[N ͺxk?$m-MN{\z8[%zn9,r;z 0(o23 ǻZyLa6nΧ0^e{iFQG47z05-hj'>NVS apW'ţ*5= TDCMD-2s߫wb%@ji5OܹӼ_nB@Z^-~s5fg+M ɖG[shyFLIfzM]V;,#71[z5mm2U#,Au =݇:ԲQ4-n=9C]HUUrhiWlm0h+Dӛ>j쯛܁ワRrF!]Df]q= K$y?skV*fKZ0D~Y@N Yi:^m,( C(,L ;7-2T qH@Nxv]xFk +($,v&`W#dv]CdvPnYb W+&+N4fX:XDMVYdv 7Tȧ :t]Z3`J5Sуʔ h(P{1j$7zL7tQVa:l-t?!޷.Ռ F穯YeUScT6ݭrnXz=3C>~`lDc-8 &w͚MˋZs wޯ[p)ߨpVE:'**[_ۭhkGx!8:< Z@/n*(Ɓ ާjs0OQkMMg!MO GzjchJ+z+OMeSaoX oBqC̞C>_~]6z܉N:OzеJ#։əWGLdh?ڷ6mt?3YJ<>3 f51z7.YK{3rj%yzɝqQ_NsS^].]52x؍ª.́byu9_>TSW @`ZT? C۱ZZJ+JTNuOZ QX8pժ]p jJPo/B/8sHj컥7Wb9N1Tv$F:Uَc_wjcWjN-EKH90Itxh!au6 C8z=&Oqnv⹅Su"ɨP˒*\QWY}>4յ_M LY=̒z b]! qM&N+,aP1- (uFzI>j'1éS&#j  `pr:CpFf2QsDi^,BZ56U{~t*\ߜćD n~6Rv [0W`cЩH^:B׭2MhU |iړ_~KBt\|7 )aӓ KWCYrV tqr0{+gZaPXF8LGMDC!r/{[61ɿ[Z2FcY% 8w1Gsg?AqG8܂G>#NXX}2BGG:I 75+<!&B8 \3;$elM"Ťj#_nZLi| Od${$곖oӬ@ſbF$مe m2 y-Xbu\EfPgԻ1ڻhy%T2DڼU;߸0tM I+Ê`F3]ե|(ԼPpބz}G> cuek 4$i.+kF,rP~8X6Z|lryΗri4O4mH+QrTM[Dw;Jj$@s( wbeǔwXWWN&| ϗ O7uT;G/ \/E+WT[ا ]jHv_qX$>-9 o:8+UR>_(@V+T܊kvqP* /hAZ|? J} ^\4M8 O*H$2}vƮA zCȖkrDZ#Q"eLa2 WnA'8\@1@C IYؼQ1zk&NӸN4T1h+wc*/>.0.0q[@Z$1:oxt|eV,g/+ciçlbKfèa=SElZQ  4q1ɟ6[r9:Z*=rm|f)(-PLPt\} dwGh i >ml;BUQah!oqPL/؜tLxS btƅo̔öCLqzXw &g!7hT-KqQQLC?cfx+g;Rc/g %w|[Dh5) PsboӃG0nG*ö *N6gP#}cHk+VsEj蛿_ih ʌc:Soxہ7 }Ij~BV͠􄒏PcA<餟#(x(Z s.M/hL>t|RjAJVXjV԰SM +V{jvN_7 -*^/ RGVe+otϣ/_a^+εOt8E.^e rΨ2Zi]QDmUrK%&tLeHG8mbHci Fdh=XuMa;nPV=9dQIfQ=K!c }(< u*5xހU) Af8,(ls6iwJATallt,!D=WXjBvZ߅ ?h6Qwu@_A\V9U>[t|˺"QCIPcC+5 aZӿ˰UʡڻڇD4Sbi$yg=);F/x0?ŎCR5%9$q:"d_i wA5!{JncB=xB3{ͩp+֖k1Ax e~ G2'oFtL\(]{i9-N:!oZ?-źT/D<}Cc2~)#FGAx;N,i&"11'[(7^tXίHژh%cЀ-]/'\OQ6ܡR:- {%za PC8Q2jJi 0.8aN8; HRVY[dzC'Ōi =ZQ糭i 9RMA$ʻE&I"{Ӣ >tPboChc(X>.g~GܛVwE94 zzܤ|ҡ[)')J@f\Ӧwɧeu1ݬF jЪ@mS nc*B}GPf,zE bE.ר@N} '^1Y~ buc8 8/=3 ]nÎy:BYߖoyo^SXGI؇~ѮyTzUzp- }PNo~zlU*pR:U:X?S ÂA?z9S%+ 5ߕNE~!_("N֨ vHS \PMsZB~ x~`;$YOr^\%NUG@n ٵ8y~T rE|*15jhI|E:D6BS{5,Af,bnE5jC q) 0DI[NaK1΍zj 8E6BHAaB6+J n!lj:%\ bgek$ⶳD&!t0TF[-LX%ҴiZe5]7m.Ie6nx0J]0O<ϊ fuK煭 IT?QOYl}Li;##T}FF 3z2/ѻݥZ تnحi[0VY]' , 5c-0h6:Ѓ}&y;=Oƙ;O]"H;`t-NRc5O΋^L{0zXk̯7W؃.r@ig4#?e6J&,`.+8w (ofS V[<"ܩ+P{a/7K?Vz,AbPV[^I]Lm>;%~6Ln'A1>թ֡UdM[RʡuiH%YY7(-l[t/Z?Y.QWCYvYPynloB,`Mb8+" o7q: wja(CJ Aq'v{D҅l^d~u0zubP=Ef~/jUPU/VSEK{&T0 tﴬyۈy0(QbUJ5`$2+u/Fb+NdϳSK`tJubq~!;9;h8[Z]"2M h@M#X\9Ϡu"/hc^!O3JsWXQDAQd=:FX*=۫Fq:$qt,K*\.r\KH2!%@ԩ" x1͕gX[sF O%~\x4/\ 8 kkXVl|vji\!oZpZD%_VRERΗ*V]\9ntEKFǷjg tlfRCOsaщ*4ˍvwN)dYPGqǣ}ˉXn6VdiYph's'n~f jf^3vҸ="-l4Yk]i8)u? Dͣ) #hlB/E:5%fXtfF5R``X-FhMiW,2 M؃!B4>:oiO( :bݜ)R=sh2렀.A'GS*U=t5n RKLqΠ=a⌂!54C+*vAIES} #^r-ѴJ1tM,⫖-g~kDNs-VKyB%~}ZǠ .F<}KAq@JU[s%W%iQڢt+6&bctfǀ.RK&,Zd]k?j=3F'@)9?ޢhi_1yŨPҫlHX !+Zx;Ii qK.ͮS#4q8C,Hmo :O.~N)Z6#g-_ɞ'1c2u>x8%vadO_Cވ1?awȕVQPڭ>&e6^L|[AWEYS;wŮpU`eKLQ5YVr7%/g[ Wa#$S1LPCT!UF9AHgu|TZŢE/w %(_pj)y} r`"GG/nvfm7SRbW$BQ1S ARWW^HDMڧժ!vL@Oy -&D:fH}Pؼ zv</f=/mVzLwس4!ASѱ^l3<&᧸Ei^=ːUʨk\zNVYB #Aؔ2O(?.g -nk9 5mL+/`l:C2J079)R|IK5k?).%a_}wFY%ec|e ]Y~GK]!NK?ص @i~ }Jǒ=arNK/~k?ꝭw/<A:5vӼ* ƹ j6!} {(fLbNDvYҐ:cs#"'źu/2"/]WJpkpz&eI`^oZ^W0^d?/tMkqZB5Z] tq%3F R"˼ M9cNN8i13>uXKF{:lDƄԳQ]'EY(հGG'@ri枧%/QqsȎUknPLmGwUO"q\= VZٕ@>C|/UP9F݊?3.}!++t+l w}76cW&YhO~AcL~Wd#x>YWN:&h{:-_i,Gzҟ=l0ޖk ɠS'/;& Q3ΞS.nbu@;vSZ^h~oAMk0Z4ClNк[ Px00Xn*;봿"{-d=kS9G/̤o0*K=,)n FV##J)v9e2]~#v{ZwW:0O)0%nk;*lvjvFiBC9V \Wy&|noRު{oUV4ڒ n2^ﭖZj%/c5,I&,0xË6$e!d2l9U 00Ok,Ω{mJ?6W9o_'xoŕW]{ X⅋-H JT]s퓎3f'2T͙;q2V<^9|e3'['fW챓+OZi׆O 'Gh1g,Cmã+O9S3-{tlܶ3+gZɱSjc'O:Y;ub,iPhk|lVo@#h uԲʱՙ,ƪ9s,ÕQ:.ɲ, 50ϳ G,o6G?AN\IkI40˳L;/<ϻڍ9Kლ6mfe̷sjuځd&>?.wHj-ޏ[WH{qg Rbڨ uVGNP2%LI,qPT?]}O^\\߄j9^7SWzP&g#۩^QyՓjڏLIY]dJ sLmԄP٭Ioŷ~><Ŕ,22$k~uM;P cԛY]z&oҼRG듪wT^e||'ůߴiؓ:heNз~Pڥރr:]/}&e@OH|,cSDϔɌō-hNu\*̠I%)sTU̬owܙ;z[ݣǧqEK=QgϦϨR1UUse.Y\t)wWxG(7 \R%뀙}J}U uuPHH NW/]%3qɹ-Yԍ~Txߏ뎺E5ܱorMREfn/)uJiDK+[9PUJ\*C{Vxڭ~_~mlGfN #vz?~'zV923̛hg >ϓwܴeoˌ٣.V7S@W p|2ހ[?נq>GS|%kSrw4,o0JM '`d6˯Ӗ-B @fZ}_b6'v5fZP4wc0oY-]~!EI߬R 15ZZ[qLgTfqTƞqVj wk'SOֆWά<NUik3-9V:SʕaaԐH3+n`']Kƙ{iQGu#C$V)W( @iɥʹy쑡Vs] <|7i.>> WDu?Hra@Vje-4n!g+MT!W@\ͲV9<캶ȑpk(J^V:V<vmΉ֛$^tRT%;oPJ.עV+'ۃ<-.]11EĦM5cN'-әKʹZ< 1}\B}t.3O"rGN^-,\06[Aiۅ[Mʣ#J:e7w0 H=NMGm,gsR/A!{م`|# V \vXo%]’yځ+wxm`r{P|3:u V,B\+vZrcfw C ^C%V?BO(*b-\e{@K7EqlY 'v|~ jpz0i;؊1\cJiJ8nUf HY5u@Yـ^hԟX^࿥ZG<ݦ>Zjk;oXǷKH]+;؉{ho-bM+9nz>t Ч9rVXJ8s`ۥm$[e6.6QSBh8J34!hM,F5JiHZ|ŋ9V@-Xd)bZ-d"w$ɄG\ƻDH&Ye#fh,vѢ|n<3KIQՕ͇>[nandRENJ[iiNK`A#;~( )˜+J  >o2.ȳ](hViڭYh3<^4kK5/l\T*B-;i{Vf5p`vkؠ"&eʿ`3 ^ jY>&}!<}P)x^0+\MQWfލ+hϊ됌q9f|®,ttxciyJxEF%ΞZks T'>&C,r^@vJ~flM6>pj+--_]}ߩk k |6ܚ!;. 'NTO:yž9533>洲6S˫cfZ-g)]\9c_xu϶A6XCj4IhԫjIjwe -˥rѶz=J~%zK2?*X+uؖjmCm۴?'f}T^434Jmв3Z7ODp}L:(~|#7y/H /&T{>SoC.3|+ܙom`U2'qm~O)MlwN??$߶3DNj3 Cij-\-rvkzwf~ne_'- ZĎ~QƀelyqP+̧] YG-9.U-qZ}P%[Epzk nnd+4Rf G@%/: z؍PAЍf{}j6ͦyb(vkz}p+b:j;~^kcaS+['c'QGp=flғFgNjmfV|6gr'g^OTO;Ɲ6ze33rDMrFF$i6 Q>bshYD`LԀp#.~Dq5vsdA.@E!`5 0jO$"h@фs0:΀ƨhJQ#(˩OaݠL6 L]ۏ(^ )%%a V|'=GR5`ڼ,m0,3oq0 `ltk\kN#(Bb0Js,^#.\z^9le^= < }ixe.[:Xoə.@M|wi\=X|uj]e[6Ѱa~B.OP~*C\u{*zDĨMG,.)[~"9btI\w{^:WJRyN-J #$P<ن7[} ,me3DIFm8hvp~o jmвW6eH 7pqZM×1sd?Y8ԶL<ɕ*z4e q=րbnd <(X2/9|](%cfhݾNnIiK7[E+w/(ϺA)#,=e Yg6u,nԸPWDOS{;mdߡi z>^^m8F I9*uvY@EuhJA@EEz+}^o8}Zȿ+˥ZJ@ɷz_y1|X`X˻bs*jB^n+Q2M/5G0vzE_/nY/:~mCtzuF?*]HMcfA~GJl mp-rSUd4l ju/GEmBES[j؈2@wU-ހڸ5Ei6ү aw|K]p /_1||?vCq'Od+FXTVubIwV`玑,Հʲ!Ըnr1,Wi'Q.۵ZШE1eFq\u_ ( (nlM#1soV$beyqjUZEUIRph uROH4uK>h-*)D&LpWlq, P d o>GaW),f{iF-n<#oe u$T5\D畱Ҩs*cgAυnĥ~tSiwJ%r,DIiH@6@ARÿ~J'ߔܷiki6 Pj |k6֢LtA4#%mL[IVjA@.␑3-6OH$1%߶ɼ铺V:! Dȭ/cAߢYdK6@jCAIuRZλź9!Hj=B%Z[#Kdzypuo |[\g^J8+7a\g,Gfnl phHש㨳HweO9G}Ȓ{q: I}<'V&5uA01l٦1#'+")񥊠 Ks նڃy oIpleWeW%BtNTGEm2)O=湧Ԍl6K];Aß㦞OSQi6x{Qv:/u.\|dC﷋wt<8$ k:GU_w x~5\T/9b)y ?t/GT'TQTQ7gG[qЭ *^Pяº] U(U*%JU\z[zP +0 vĤqO mwvݲ [BR)(U iՠZ-H`KE8|94NIӸ%DGQsȗ!ׯZ >ڥ~ҎߐwAu1jٌm5oDق:}֠- ēlS,7 w:_L6yF%izE}Ud3PK(凞bHWKI &k I*-g=׈dI X쐋l&9Cv u\㠊} =@(nJx6j{b@KJ֪!˾_p$?;S2rC-A݄ke]qmcԴqx"Pfy W m},4 5l  r A;V=W>\W[fVŬ\[W(ג9} K) zEmK <8 쑅(kr>ղ&!E^19K5flM?tm|O/\lU.`%R)9%lTJ%ߩQJCiFa- GnU'ʂekCgJ'(y\7Q0K%ye (mjjZ@Tm V˥s"\t^@<8PqS nqHBK(%i8d;;*jQKף_r*Rȅn8A$nQ&J5~,2-TsȽ$}t:f p[5ꓲ`^}Y#*XVԎgRRǩUR]=Ĝv gvub$~^CDP@L h5B@z|Bs3 6QeTE[tqtDM;U2ܧ4L]\CtsquQ>]P%"e-R4'ȺIDۗ Dͬ#''nUi6ͦ4ewoϊ9\vхUPiQ+kA~XlZN'ڍx$t3uA ۶35?5j[lj#F e\.G׃EUğ[sU۷׭E2<^5LxqdYQ@FԈʃjE"ݫբ$9cbdJD#ԑ5j?d/Kԭ~i2e -;#MSZ&-9j引2fޤS c%@VMGj43I#atJ JeQ0SY/|ŋSn VJgnEBm~$..rHn K$^Z$%4:5XjЌG h_0^؏k{B Dm&}O|Xͪ Wm?=$"HL^7ַiZAkO뷀Ikp`jV[1nUu)kmY9P'R2/qrOӍԗ^̳g8jYaF!zzazspJ;<@V~ngfg͌jYynq6 D̙TC[mg~gB@ӲZo1Q2V t@'\/f9DAFv߈}]vƣZ lM?g9?xz"F\|zda7 5\r>j{]f"OG$xRp0 |ۋ3<,}ӓ.6Mߵ=R4k=,4n$b>2 }W, uf6 'ù jFI >E0.9vTD3Ac-`P jQcZڶ](CyjkdQEi{n#)z΀&C/]pˍM急IT5jaR.E#q4W>jn#@DjAҠwMq4@cluYn&oY7q=F}zD`'Ay;e5)mCݏ 7}RʀVl">͕F> _bڄZuكc]U#~CbPg$~]Ӊm 9\ըV5h5/F@#h;?ZԮ[ȣA NNadVW ME`[aLO;Ï'ܲ13A$ F{%4г}=l:8*ZC<<*v:ŀ6]P(xD!Sb1KܭO2ݨ6`ho+e~w݀vߤZ2m|>~G"ҏ4~PiQf l^/ u%[?0*ցtNõ8LZC2I q#ʚB{~% ^fHzh$"R_ <]&~1 HGgl\5$nY%ŴiWcnYtL y`eѲ Xa61+3]GyԵJZ>(ߞ&qJMW/򇥷k$A9F{jO<*o ʉZFK$mGu'h$G?4|S};T96XuԳĆekj/>G K ĉe q#Ï=ԢWM{ niyzlK7`'4e pExx=upmx%Ǯ`$#prч@ߨ4flM uZb _-Si@uLɥVT(ܲ[snukZIF/(ˎ5o) jAP)U$ H, 'CCDkq{e%-nqݯ<&#?A+͔Ѽ4if#ZDOy{; }}nP+-yTxJE#H5t>,{cEHK]^s~7+eҤҦe: .cq? k}Lrh C!tlqѧ9t7nl6TCtXve]tF|R@@6|,QuǥgD˘N :"TuI}r.S~ WZGмP<J֥~@.uu1#>KT<)}ba=le+Zx^V-m1}\xQ{ޒn,s=fQ˝~96eU 炪Xg'FJnVw7 ^Awa>3mpNT*jyc@NW8{vI-GՙDAS!V[Gɋɸ ƻCimYj%PQFolMi6%MԿV16\#/\~p ˭bnHW6:g@8g&IinPV ^5º)oi%PnFf^# kMEǥ_e6Tz p)qڌe=Kz@[s[KON?{l% :c+UFG5BsƢL)mJM4}e4+Zk׎٪ԙa6P{K.sz0+M)OZ-H=rԙ-61a4i,Z?FֶG!\4q.Pgl2Ni_PGhSW+M\ V^1XM^DR4Kn4js,IB{:#KHz'jR,jP@i[tČ\c >Mi6ͦ lک׷{[|Ѣ% |VG)s9aՀ_,qĴ'k.sӛy̛Kj%CiH"q8N|vcaf| +|') F ըE=! 8WO(\fYRԂq܂ea{[$Lى]pFЭP5nVsjYԨm-؁h}iVzX@/R';E{ 5xi>bRiֶѨC_,YQ:=]r|BA=hW86%jC=>dYQwQS_ Og9"1*-9ڧ'4t* x٠^DgY7FVSlұ(GtJB߲7/wJo (,}lF) BFc'E3R9ؒEܤs+"D+hMJT;Z^%DQ%Ō@wI<6G}A-[zB5?lZ, ̴Us<^vZ٧Z gh=V \|Hړ%E~_PMy$.u9~]XG$-{9%Wl"PzTi1mcH[{q15"4 ^ФC※ OSyzEuxhiQSe!c( kkhe rçˢ lMi6/ekg,^x -[~J=-"K/>uqѼ6*JHdVDPԧG?Hidy3n SH#p96h<?֌lq.GWy32rLV~\q bt_%'EuX`Nqvj$>'cṛJs& e6N.1復?]"?$)ZmŔ6 ZOᕐTMTn' :Fx53N6<ӑ>~h D;Ը2&JTߒJH4':D 48{|Fk7hn̽nԤ7g=UIj Kꭀg߉B BKUDyj2g:j8?_1կ :GR:?w}<}:sX'qyǙq6ؒ?.lj6ͦy)SZ>st9!.]D5=?3OD`Gz~ҵ&=;V֚_&fi j KJJ];(uA-4n&Äi*c$ME#)E-QQ3Z$# +ؠ PNTme^2hvKB@ɴB3Bys$PpvzKj@5uTc\63|L^$4WtOQz{~,an @EuzYc̸m URBd&H2%X}Tu`\(ʥfSG2ڋey1 [UsēD'B uh>c9G퀑^ >},oZzCOOê4+Xt2^$ \6#XwFUd̜|&!-ɑV5XoB:86dFkH,ܥX=O?z4W-нU=ئ+p#uXNa|VB ԥ>cS6KE:a =^/ 7G[/ f #JEe_l_Pk9i *ZEP[q4ؼԺGE$Jql.YFG r-G;=&GڹѢ r}/sr v*@庖M:_pk[MV\Uqy3[[_"\`>-?3tMsG93r5f(&Xmr#|JZ.ԩ'HcI(tlsep!s~Q؈+%Y*X?R6mܟ:Xvл7h!s_*b%!ֱG}"*DWRsf72D?eXFT:GAc٥nCn-=#$%^uۥ5bb:lIWVZ<_5+Pk=oʜ(IڳW]%N Z=M [02)Hw O֚%cGKxqrvdbU+eQ>VoUxsfzzG.ok-ߏoMkn4"v%ZSW XZp!x.iwz蘼N͵Xm"kalaҷ7?2: D=9N uZ^ϲMi68tY^p%.q[ ~==S͜s <:m _ujaF / $,mmh-5vFP#t>9HQ [ jFU*ZWnysmay@z Yf_Y ȗi\Kg^ VQM`!(,R{)%%Y8_ A@*kWҀV}DqZ?'<,xZ~\{=bZ1ʵbІhG?bA=ėZp&Z$u@ 0=)ttJҺbtOQ@k;K.;P3EX4-=>':FS;Xf?τ?VlXim6:f} ۿY'ZCNuB8tj? ՛EMah Qaya^s LTF]B'cNOcBNZ{y6IW6[oSoAkEJßy?ߪDw4|tR wwJ7Eh1_׊弍-juxCjI3Op xVNku W}|B5\afxhhxp3:Xm2b?+#3hioƵ7mBLp' ]^{EYFM-\)5nSwXMײ?)0j)ݪ9mFb&jՇlMi6`S,yy7Yt9`ޢK(chH?)Oۀ-{p=VFgfZNLIf&inP̣x_m{~zA-<]522ҊCHi5$͸,hʉ%i+m-IGP[մZi.i+v:HuH!摹v[Rm7E7mIf+4o(5T]o(W|V~%nJtꄩ6WRtl8w=}Y޲iYAKP+ɓ4oITF!i| ,ì$S w*}@r>h4Щx䵪&F-?8W$yTFzLTF}fW"]rqVnib-ֶ35F˦(GXhwRxL7ۃnLKʔަAs(iw@D= uAnAZ:9M`^-b"Y/mVN۵ }\kCu 4=&'u%"?r{kYC[AzS6>{; ;ߏGlZ_etzU)N}KƬ&E\/[Nyk#uNW:Tcj(ݢtNޅ@9gO#*^^pb+bB뻖RxK+Z[n5ԯXTwvWs'Ei[NdnSuWj*%VrY@ԁ:Sl#?+9?ɖ3h߯JFF͚``S?)fxrA5.mŬ NkFy=W]!;Z R&m"ȡu4m]: ^ƅFT߆Qf<7dNYz͕1!OY,qY1qP{֜iǔMn^ .Wm*J(PPF\ql@ߚJ%wW58]n3%2b)W OEoAϡGegQ8ƌ6czsȹ|Oufp1@tq'qzNFIB(U= \)+خS?qmPAqnAR8Q`n0=7(,s-[*B)l4 cp6p Do $,vś[v嶒z9n8袃9%'.]q]g\IϜ+'j%=װcUKDn}Xvœq]Rgrgmܖ,)٠gLRnB@ɨy3=&1]>r@Ot4AXC"=%質vּmj6fb5 Vz"4 vwwbu/Zl1o$ON)&L{C&M}{E=ޘ~sq֦'G1~b }rEN4$m3eJ+(#uטj=IxPK{}yQA7;Ր1eOʩj@*A;zC!eI{.'ՎJ^1 n݆1J_RTgS>˯:kKU ~(u'w J9OJ+g}Iŀbu?K[π{,<#^r຺XsA)g>"AGL+ӗOTs<-}{Lt/N\]VYڻ(?_)10fD敎I%Rr*^/e8*vQ{I Z{ԇe<@I|)_[Խb̕fpecJcwD`%}R7ȗVȺ:X$cn<ڨ~K\aH֕˞QY (0f/}lj"jy+.^|…˗/T}ߐ'yzh:hk:Pji3j6UۥkPE1_$Cz,kOyB`͟?ߦeēk5PRI*sXzh Z(yDHHLuf@VƉͣ&p*G)īt7bS/z^ya&0]fCzf6`D4U۫׽ t]׋ ] ^q8,hV֨ժjTkD7Jr zUσ*~mKXl\h:iiP.3EqΥt !ݿXL0#ۋ8rsL#~:(_dm%"H ?Y`zB=,{e A6NC$? ?kve+Vs%飢 M+Eާh˕OO>Նr{pvQB,)\<o1)%P4eLrpAS\Wkc0ygERW|R_ &B}R[%!'uPK}=~Z<ڎ>,e t7JŸmXP?g̷N^ IZ,'DUh`_Cn[|I􏼙z܌I }j6Ƶ}x%{j="bchAVYȃr)Zש*q+I:bJ@[mhO~E2~=v0`-F̈2o&ՙC/5Wڑ4X4Gwo/A+Gpln_Q܀x2GXWum1z\d#6sqYz%f-I~x.u5_9)O)ٺl6bk_E?)NZk l/SM$꾎QijshnSQVJ:1ft'Bӭ:W;#gr,]BMU$(A68T+>!R C9K:PI~ Y2j= قm7uzZeuMr(OS.N&]|q3NpϚQJSNg6r9ЮTjsۊW,Z61xyM8^C n{Ī+^ɪ5τnIU|xDS"QJU=e<Z`/)_[W)iqcOSPèiy8V(>S[DOuo{Mvު]~H#J +FmDdɃEQ$<ι`fdxF XTKUe~{vxJHSNۮ7i2XÑ!p*9|-N^uQGAÑ] ))i/QŴ2O.\2ȹ; thYLJ=Ә4 ^ $OjEbd夬|d,h R$hdYs}Ӥ5I؛(o6z 5_VGD͔<,[#h6j4DY6sjZcN ݐTnCNʔzE+~~BY"_v2P)%Ƚ,kI6zXb<ʤFJC#}q֋aJ]KWzr։rbw)qnTr6H:1%і^~cFvM,JQjv(3ۧh%_tC{m2G}NGg RtͣFנ.6}nP%Q$RwĪҾD>DIUMKW= ~ 7 ڇ2_#>LOiZhڠ:1W]"iK@Icw#Lca[j}u?+t[2f:g.i$Bq_Q˹KC΂[}c4)D|'Iko֡}uz 1\qfا$пWza#ߍnʲ#[`覊I..ȹ'%zZ}"]' sX[do~C8EЖzelE?c)43}W"&z ){RrE" E1vNb2MJ bMD׃]ocCF/D E7>#GiI[5.B%BWƁZR;O]MYvAh@tګt^oܦjwG^Xb;EvuylM?tO7BCW u&wuu**q- Dٸ^%ɰlٚxǚe{tKARHHYY3ޙ~vQ"4[3+3x"2x_`=9۝NUV'-_lUW_-tty*C dmK 9*|lZ->4y̷4 X1/9>)mxA.ɓ!?_ TЏ> GS0g ~yta`HɄ3H~J܂4ik{) _ӺY)a@Xrg´U6]nw/{֔B^A= mWrv9:nԭRF ]$P`%w'J[p@ӯ*PBm*H97/3uF~c5J@qGW{;Q{SփuR'>7R!л 1.E[):2s?#梄 er G8%=-u;w-#T?A ȵH9^w>"oW=ǵjCckKK1xW3wD]-8OP+萷 >@ҳt8.}B?{yl ?/ v!va `K]::o~/-ͫL)l4(6rj9}ieIQЙRI)R&BȇE~@os|xxY|8kΥvc&"Y#%DN34M`/MWDqEU4$.gsQeV2 x4.M}(Ռ6{=|/OԫTRq/I^^'QRr<@ŤUj KO%4G#&s($G ?IսxZA:i(_EsjyϺ8|F2H0M~y93G&FL vk>EKO |['ջ, ,eO]^z8g|Ou <*Pp/IP8%جCNL1(r'd;׾x=[_O+۞7f?׵?:k ]1!=A='"u9 ݍZ[A ʆpGޯ9JaJ` .p g-H'? ”2WA{V@)V&Zpyb<"#5m|Exb .V]rd1f%;ש~Y&kNiN߄1A7bo6_Nn&=RZL"mq ]'}* -@=azkLw ߠWNN%}iiGe&/1ɤkȾm4oSt he}F͗[0bMZBvɗ5 >}>8U}-Y xRUwZ=WTS HBU`?jwn4*H DDh^#mM1Cfr #FF{4f 7):|F#MjXҮS}_604#i9AF(C* 0}&YdkV>$ʕJay$y5\O00xpS/$1eD mh;~X #ױ]5.v\ k(Ѳ썀u V+nA`1e>m̧ Iv!Eú)jT#UFAeI<[&9 | ^4v~#R~XlI vNsfc/Cvg` (et|Dy {X^bԠOe)-iqoԬazu-MmseAj&@'^dKAktb7+Ýf5(Rfi2W UEkApRVE)~C;Aw*%G/Fܙ@+`UT\/|䀿9,R-h/TK]uhZ_=/5$sOX;TKOPs^u]ȝ&W1(o!.C~W?=ôNއrg^viMR"yA-6"(W v#od!?U)Uv pd'Kg^<(4VJ g=lm=!E7ZB]' cF*zDVD[w9MW}@>ǥN=JkBL)_H[$c¿҇)U=~_RZCT^ a=ի_+ksow*NwľUʚ|ޡC`hC{sm@O8)_;6ZzR{>J No}P7W #VVa6NX{Բj -l`z]tOӧVrV#+GV3SfFVӫϜYm#gFGΊ|}zТrȊO\7V83gL>DF Š ̃OӧFVFVϬ> T; CV33CrT 99bAu`(b$=Z]q."L-U@" `{\v)M,IZQ4Nȶ~ =b)z@pp9p߈.8Rrwu'(WBX(0N4s]ьD)j"^ C)m7FBFƤ9j5d8 a^S*" >DYU#b<AMY@͌i0G9lEKEp!oFEea짐c$^}_#En 4=Q9n7Yl=ZZDѬM}װZ-\)ĨR]:WZz5l~!?eDDMFC/h\? ḩ$9=p蘔rH^4H,wl!sjSf(T#8-Fy"jD܈uԹG-@b\ؤ(zM)6P7jj2FݎWKxƕF>#'unnhT֗C7{e6A2dMu>и"8e{;jKPz5˚xA8/SZqZuo* F( V^Za}8A+mw]23 NX ɗ]fI1(Ǐ;%%0=[DуR5q%6[D =- Psxԁ z5ǼIvj JE.ثBiWJljQ/turZlAJ=mkaDWOݾ 9m}RD :(. 8k)c1 ú *aʁ-yWo@U 9~sz5fo(5^-ZE]T$(m:4] 0jq .,U+qX$$ӄ>s&an0*[|iL$U^~W+oD,#0g¤'hLQ'l>z¶Id0Ce1(@~| G7`!/P2WYp>_7ɸ 1 ƀ04⧓ >UZ0-e>,OC&eH@w(!G88PPOuwʓkJ !u&R/‚ V#51!"lŀ(+pZD9mǽ]T˼CdLdpmq?!%~.0?30fl ??!. N*8U-d W&wW:WP3 <$Dx+yE$Nl@(ј$F\r7e4s}?|G=IGQxE (v񈸶_,sl.nW 'zXV]b`RAA\.UJA5HjxAaTmU^@8OJss0VTn戄3N,nGIQSz&<NP J;Vh\J&fQҥ\YjJE֫ڢFrbLJk!sv*-PGpR3h(^QH;d_q RqgҰASi1UqmֳUG){gYQ}(ɜ++ۅo +aj!QZmJ<#e{ %A/ZɺwHW^J ܻD$#u$jiy2)mtoGM6,^Fet iVVh]cR.1,u݅u7ҞVfz]g܆4jEԋ4?[- ZX)l+?KU}PoZ-=>~ 珀cK,8(8T}ypH8J3jL'"& EfTt>jԥd j6̆0~fEp S[,T.^JL@4? P%fݻIK\*:|#+Vppkbȓz|i^ DYq-FZ`H ;Sv4p:BبT NDi# 9iaw0e4$Hb8n&eZ(D..UR <RT e3M}׫Vk_@qljNыc$`דTZ'Hض[]`5.QeSC^/zUuFrP_>827..?jхT7/j Z `e,猢y*H|r!zIǘ2Ӗ%|V O&{>g'+ 0IŢgL?0[ĺdUN˒k; ו2ɖI5]l[;7Q.3:3g ߇roQF!v3oܷ<[-)|\%w@v6D`=( MNg6 8:lru V+MxYSdĠs>%ʌL%ʴ ent'qРIcvK @l*~Gڧ_n)YD떿'T:& *hnՋȥ7] OQq E1u"KrEu S\Ja1@QH+ygzY\e܆q lOկmp/pC[SS#Ug .N@iQ^W^iϊOnE@>!ʚהlo֊zDB-#rNrƐ:u܏HL>/4Z#4t]k/b}K›XULմK -G {]f=$_<\Lh72ڈ4I2ĦEؕN4TUFƘl[<.&#ܚ5%׋*j~u R܀ub:[{K5b~1__AY.J.}{:8:sQ.vf~g?(FOvo{[KFW.ɒ>,V di~EXzn4NLmPQr۹6Nic͏aSRi%ZcڇD*@m)ѫ k$$T.6<`;ߍj#Q`}n愮WΥdAZ}#~/՚]>^񣐾wBȱT-J7b/\YtAB\%&` HNsT/e{#&g*Vt8JwU^ qtGJ_-: e NOKձ(F2 V['cS/%I+hdI2FɶMF\[]w"_ry2kůDOM@D-3%F]1E{`ok˹BlHneINWRx:<P -~||SfXUiUW_[Fߘ`\хSIPHק"ql ]#$x/G. ?:J?K45N ' |g OXyA[sk|H5qZS2uӘ4,mPINYfqIs6)Q=c ^=x*O]CH|pJ.gy^bsE yZSpacěརҝ]pj}U\9N^f6Q, ʖJ%jWbljKRٵ&xDQ8Y {E,5X$A V9LPur\C <)1]zw%V*<A-ěoT\h|բyW̟OL;|%W[5| .N/Ir$\#(7Sk6)?MI5$Ϟ1XqŤVۯy?%Zcr.O9 R⮍aE?t,1UsN)7}*9h|hdNu+F'Q.qHov#@fat[“) =F# gx1m/7+=x  ^; sT+vh9êe">crۭ쬖|WjqO^-{jW[1*YUbIPt-<'w -4mh$l@] JG+ w>۩wt.-Bĥ2_HS 7x5-q68SixVZR} cDih]-A)1 PZńo~y})_Ut] J?X;9 ([2Gk9ӼHy@E~RR^9>^br%=o)|f.Ʈ<.{@C11uJЦGZ?ZiK2cߤ1k.PWo븗vm~LMvM~Az;%ś $Q7)Zamƫz"AQ1铷3 5;ΆDI{~>)cUG7Z8WӪtT6p*feI-~@~9jv>1QRpDc ]Ec]>+5two`]B0OѝM߈9 $0WYer"P8X$LWQ\w"۵ꀀ\*KHHQgL}(z U, C`g @RC犇}j֜pgSQӾ6LDb|FxIk)ES{שsqPWE޻L~mJ:юm&h5bHoȉir&DzyTd87h=U 'fY)rd}.GkmbK*NȴMg/ԝVz{qs }sR{d@6Ϣ󢿕r_Fns}ʼ\Ա/b՛k(!.HZO;\6;qO>fl i}_1΢qB1L^T7'QsCn4=36tN(MrssFඈ͜ǸAfs8i6X96CCf$Cv)~1.M: MNf3}ۧPk.׳Aߵ}Vo$_0HRɋ:xX7\͒l+P+FJ,,ϓ0Two뉟a!SJP`AMDg5<<(:9(TL%+/] <9pofo9H~3,%H{oh CaG aӈ{ZJ:+SbVaY9Ra/bB\Z M J, @TzIKvlQJgS'GDڈz̘oi>cY.q=i= *ZvB`iL-2Z;SrwPĚ»J{ QE{uM9?ijT p_6yBiQr ?mR넨E%ly#4P>#fBq} uL)%Njø3% zIIgŶJ4ۋC/4|NE\'>Y'[1t"&U+(knHZpŖ6?+>}Tҷh߀/p'D$u}KxM"cR.3#x%TbJu $-ډ\,QjyZBZӒT$ .qA+7Xl֧3-`FFtpׁ(cJ~dЍTmq3Rዥ{BO" C&D򛭷@0ȝ~n4"MGAjRR|u_=[HnһAIvc:pF`N f(ڏwdS[fI[Og -͠zҵ"0f{E < bs[01k:[ow 4.e ]F1hQrQO?a.\>Soy|c5`&hO$< Gye"n0rx+zf$f1c. e^V4 و<8}@|jד9uTvWȏ6 ZD)l.^ߣ0 UK=ιb#zt]?!ħU$î7躤 }'r~'QZ!*"?J,u0*C C$p GX EI5=׉ jamqg۵7,Z:~ŢU.r}7ѷ2HK = r 'm[Ȩ c`oA[kqıK~ziF+r4?ǀ?ƒvñz?RsĖHK9j16e6KƨRaGU3>BI6"Փ:rBsWzdk2U(=*ț_w$'ߢhL@<=ٱeGR"mتBPK?%GbߪߒZ m& =a̸86GMa ?\}cZgyOr| ;@]*~"ub)Pj`ˈ\^;ls@.# {L8j1=ߴGvL8ꑅK(&%^`3~Ӗ}U怽$hUk) Y;Q(5(m<Ҧn7s?CO/c1 ]cvW듸CjQ}DDZśo_Ik?ܗSts"k &3խqW\bֈi9"[^OK{LR-Gd3E{xs'z̠^F2ɕߖ{s_bӜ#XsRfwɞ@}GMBW}_A~6I߅ޓaK{=awLHO<:"QnZy'o4oHٗn~U5fO" $-vmY0jYFQ뢈Zu? lzT,8^5ԪQęyDO,ohJñ1L\$;,J+M^Ҕ>JvqޜmX7IT>5Ȕr(a>pj-uhHY;sa Z7,!LIF[SԵ]5R=?}$؊w.t#뻠x7%fÛM}P !HF܇v_A CuhF ?u 8Ȣ(qբkS<`6[*Ky-\n-BMzl۲T琺[@ٟJ]h)Z{HXZ&i?ՃAٚX PC+^I: .vc~ٔnɐޡ8cLɵZP210;3Z[ x=dS}FijFlԥ~G4:.2u>mi7 X9!PK$I /b?AP4%0`6UoJ\zK"bm[a\Q(|Mhoint6@E>_YtZPs2OcK^=Fj&iܛl>7X"9Z:{W:AaYo2Jh}U܎ =Ln֪ 0%=mń.bEUQm?Z{d)20tjJ}9LϿ'| \4\cKJ;Jl:p9)6͠DjЍz"6 5SThp>y^Ԉu߸Qj@͞Dц` TM͆5*!qzyQtyrU?gk>s̒3>F? !b XQyK,ͨw}91j-BtTKr7qgYA֬C4" 0 J֌Uj@yJ|/!?Ž\#jfnxSp$6r}A dH.9)@2䮏/@t^-]\"(Rr 4gZsӤ:$$Lq\;N@(Kˆ^šWh$ @X`bV"OUjVRjb0ւjRTx T7Q-\J U^P(v[rlҋĔ2Mc rV԰6NzݪgzDo [ƨɒ5 kxyF}QȒ^&DZ/im2ʖHolsl3^z؇DZ`L=&߆)t-$$1="45=r򃪥;{(BRfyўC Kgi2( T˭,0bD/Zpoh˲I9{90e_}V wSUKy^ӆF.~´4Şw"K7ȗO ~*%l,muvHi?/"-jeq[j!.UFmILby~NYt_~ }[,>"[R|^!m&rQo2ۡzC[v=R͹FCZ$. ]zcuYzЬu/Y+RZZA*nYÂ[PG7#kGO;џWA OH }u+r ,(ߑҾ.^'^&ȏ0Nwv~;ZKcjōGfX鷨Id V^)ߡ_mj^E?[Z\:h75GZqJ-piӪoIj_kB`/=Z gWl=]ה^ - hˤW;:CXQsfwu ?oG?څ鼅^:`tRyQ?ۗkhP4Q^mrn^ myLy,cB*_+.;!+ GTϩs߉] !H(sc&5m"qZ=YЫV$Qxp\wOb4E$<$ (̘ ij@ZcQy#Vq`\)V ?*&USӪWEu]1U IgTGssvP-Mm(ΘgRR 4aHz3H%<ѢeIj9 E,Oc…툘Ͼdy\]bw2~2m7koI G̤t uCQߐTϸ:bD⠉3Op/BnٯCn3M q uvIW82G@ 2\ChfR5  *o!31M 8͆gAAZ9xC"Tz-Щb̅0c4~5%;ߪi&Eu1:)eknMQhQ=Źf"Pֲu(th+waAA}CI /9Mpۀk|j Ё@;[5K'Ukm w: JDIϳN77(\;$v+- jS䝠I6 k =!;}6ܰ,_;a#+DHxgEMKRFh,B(]#6$[LKscҢU{$rZh-)8YY-MU\bZcC'U,Qc9aU@Nsޒ#^"ƅRBFCo]IqFL\wc,K({^f֞ω;76;nY >_}S剦K("bfnW]-(%;AͿ,_eqZϗ[; EJ\hg@TJA#:5 A;6'Yz->fO> cp!7IZ`hS-I i{Qp1n{Z5FSb"Bmdyz>f-MzH i9ɖMQG5j@R?Oks\˵+X pܒ 3c9S! `UB+zAXY^^\ &n]U,G(woQu՞5Ɋ^2u]jX~`؃G(yTR4ɉW1x6RD'hA< ھeiɟ;2FKA.ep@τp<߃̯[jMG t^*$p`Gb~A5!w]&QNOz1>Ȓ37eeEXқbQKhC^g@顉\G_Z]K"sWJQ !-.K qҲs2x* \߮APAIG4ʦsƌGɆZd1=~LQTkGS(nI5r۞- X73gFf.(t[b8AyHUW iIZx>=2i%ܞD;j9pW#z<ժfU9QTĥQ\&OcTj4 btâ+- &`EHRqM{-7)p%"vָ0 L/0` e9jRY-Ǵ6YHCbBN'@ݏj2SD5:rZ{vNȚCfR;~FO&l˄KmD+}q^ׇ|~CU,Hw1p. fc"lBa> 89Ljc—bW'ڸY-ˤ˲eɇEݐ*}`ԛe*Z|5 fWe4P#a6̆0~>Y#9 Mz-U%j4`wa1|J?H+ϊʠb\V("QȳlEX?REK&}E6hk;vɶJ\|Cף4CTzn\ּ I=rzb@ ez[#/I+PlFqAtH{A=qQЫ";t=ʍ$o>}CE ["7Iv5) .Fڰ;?B4OGp2TDڀN#,ȫ8{RA^ĀYu*qY=WM(o.߰t+/_5=O;ϝo^X]p@[櫢Q4 >4r=>#@\AT7ػii QFeJ`\X@ns?5˴/\oݥ DZvZs-B*헍41F2Z3g5(2 ;XaWL/I.u#PEf=M3#s0f|\U>"\|}Vu`RyiƳ fy d9jO-]=+ݏ6Ԝbksu1x g7Z'N‰s%\ISNCn'f#0J-1?.vi՝fmLLT7 M]%UiQ-A0^ɽUr$ҋ.^v" z>齷sKĤ{Bty7W_|r.Q2X>0fDW9P*\.ϢRMA^4!U2W.^VÌ'64ـD1=-N{0Ԝ.WxfRE5[ȶ6/8w֪N<-WwkoRh݊ZߟY0 ]jEeq^[;c⟓'=G#ǧ͠y -%47X\Jv%}K5X[eNc,u0A[ЎT ŕ6̕uJ/.4W]zN7_b3Fwwˆ Wa6 E}꼀Q<ϛTx =+KRӣ]uXp+nPh_[rK5uSm‚\s1F1DZk[pv8E'q\ky\ \ PZJq"/(IS W)\悬z370Mq̲*}PR1B:J T(p2@ej6,{k[Z/ՀiBN1;p8|6p-?aۤfF'ǫd_~ ~`J!(]ftƯX:j%.0 gfQ8n-L(pc]m2Ĵ0kW[-A >:=-F-@~c %;Xs|'B%]Χzm-wbU='{{TK|} n.m:zmy կ}ZxW D5vH2{}<4n]\a=f4&{%C-9x8>>)𾻽a1Kջ6k)e*nM{-e䋭Ϩ;%;cZ)y>YD%.E}m"DsIOsۥtnaTk"e+1h3Bm&Ŕ,ʧGLRN8xCEYGt癕\pW1Dv?|Ԕa}FքgBIf_mKq/}=\fqEnmu0-pm`p/FZvQMZ a\}˲<H(i"nFb⸃M;EQs} .|\ԊrW0r+5]Q;NvЫ5u^v2v15FtP R$iq?$nHaRۑ7QF p9 br 1˃ Et9ɖy퍎Q.! fa>޻۸}AuzhAݘ~ͽ{l,mDF|q%_P!v B/toaPE˰z ŵ4Qc˱Y.:ޭ%+ض_JYJ"hvIQvܭfYwQ%&"Ͳ0MA@ă@sڪGеnZq:.!יE>y{O&jX綦OK-ۣF-OA܁VP/X#ESFAQ!/vM}LjݲWA_Uu2%.=nlOQ܉̳T&Az?gphCrwul҇v3oG[y-g#S*JSI;^Jd]w ?>(q?!sI1sflYWBCHy\gy'խs,UuSխF[՘-VU־ZjZKK-d`53IXg${/ $";^0ĀIs3ɬi' 3{fp>Nה׬Ymy<_էW4FW^ڜ_]7OY'OΟC]:iec6H2>E+Sf#-EcՐ%?%PPڽ6KG@yԤxmWAN㇍@]ͫ hxrzI=mtX|Bv;d AuSz ^Wx; ^5)#Q=e#QM֛JKa<( ^$tDͺMxGi`'yxp/O&IyZc=.O>ћd%sŚ/,vJJ;6n>n/ҋtQP8d¥l,ffs]]:v k\386xnf''c?3VV[T:AE'ςū%%v28)pe[U/NYROSeYj YZRpa!gWJuX-^QEAgۮEY8V͛0j ( /_J102uqe㚦cUuf1gGW4aS`˖Ll^Ь}t_xO#hf;vJ[lF•$0ɓ8'" Jwڊ},B٫wvWw9}J{~FhӲs16yNJڅsD$Nv\8񎵗z{ԭDʞ5.{h[v %{7=kJ쑳݆x'7ȗvӍ51\=ؐO[ q/]x֞v7XKwRAmmhr3 tvCIyAk]KfՠAo YKhEB,SPAv#}W-sISq3*h؎<t^|n%tt:|_xPj #c}:ߎVjVjVGiͮ rg߸8nx0W 52{S}~]!GI}@jrU8\1mx1xVפ(_X!9h+wb܊<_v,#o7ZЌ?f({<&sDѨi AS(G0b0M 8ڞn\\.9̢,0[t>Y̙ny bF'7Q!4ECzn"Y,3zdD2@?5@>f=N1^|~Jz^b.G(0v˸yщ%Wg/WzdB_a[; F Bŵ['A1A-q}#(Q Gin^P_FKXƄ `杠zR(A[k ގE? n3Լ Tz}c?mt2Z+[Yx2jyu8}Z?La4Lo!YR'1(xlGcЃfM慝~в+R*v҂kx۲VV{nfNqA;~#}b-Q1-Eދ݌O.>DuQj`}ۆYF^P+x*b wd MgR3[Z#ݣaf0sB߾8\2rC#CYȿDr >(('NOc''V@mkQk~jTjvy0j;=aӫb $zXimq`2YXOpXgٿ(ZynծlqxへVLq=K?jp-kYRϪQ hgza2ҋ(NLԛjIF5^f,+It0TlE@(lq\QN|*YqJ藜Wҩsl'L?jY:Q,:N/:bX+հ0ӍDQQ; yK儖mZ4+"Sdk Jũ~>hظdd+cì]YyRx!x)o ?m"cl;n=GYۥD 1 bГrCP Ba& iͰҌ[!$Дn'xii>2zbatz GE '62!Ԧp63äF Ğ,Q41cQ7PǤ<;d|gs\(Ie*,zOBcM&kGeXLF)?(ttveHiĘ ? lmcH2* ~"4MVC?2 t !i޽x]KjT,yi-Z'Vmy܀WruPCB=4fs8/<ܬ**R8(;Ym[hqq9dla蕷Ym;^'>6( fi*"HxI PB'c AU'( $1. UN6|m^,3Zf,zY[,u|Z~J-8nbEgfZ4^y.NG:O `m3T<з=N_%3|dW=a ˏ -|  jI2/E0Wz|ߋ axYU4 p< 5L4/ W v )o{O d_>m݇9y 6Gw}ɏjӈn$ GyuWY(]EA"܊Wd'`*shiދmwMqsس:zݳ"DžYd%~9կwwL++r9fQ3]&&.7nHq/I)U`f{AMM&}M> dQsyq ݀kFmvrW7`{ˤ4}VcE-ƛ}UvZZZW'}Xcc'WirY2Lh~=(IZ Ӑu8B|Qh#K~*? n:MvbWՠUʀW!m畼R,VזDZN5o0jPqur\.Ea:]tVgY_.:@}U;J qbs x9AiauY} v٪˖DLlJ?^tRvM$/ y$0M#Oݝ@h[c(3i<2JX|=FO\fPҁ \w܀6iAE5gmS8n u죈.XC1̸ Өn}{(xP1AS Cی>Wh.5nO$Ky?IAX_-n eJ g5 YX~2Izbɱ Ps54t;:N}[(j;&t zƣIWI 4M ,/4Y*_nKqPtP˼ ʷhTWY?SrA󨨆rbӋ?FgMZZ '-M  eY%U+JRgLJ{9},̻dYnPN] qg R-_*E~qb? =J}awѨ꩙4BgpDaz85lD6idF>[& nfƲЬlfl Y-Ҙγ~4 I*V"̑s]'7M΃KV]R xԼPn=vW(iY"g1oEh^g{ij LX@k;Mpxޅ%Gs2dnn A7[WU ~zÔN7َet9L 2dUENpb4d[$B7%,K[^.R1 Unhfuct>f(_k/cL=4HS{lt!Aа@s/*DR}Z9G9Pv-b,-P4(Ƴ]1/Qςo|s pٝdkIJl\s\"VӔ`i ޯËian8qf\MQnr"!כ .YԐݾ؀1>d$8 4V1]S6bC@?vnE [NGzte9 svm@_b<я^.mIXץoR+R+OOi\pi.lhp0ݭr>6xl77]c]It^l7NN5ݰ'B.;lWkݶ v*S" dzCReq|,;U;V:aY9PqqW($n'vαŜinhWEhNE^!0M\u0 N(a*|QFբ, R?baFu 18.]I9 g-ظdhODxm"<%Q>AmJC[x J.z(8OocgfVycZq>#XJ!njl;) ZZ&-({iF+-#V1?@UzPΒc8(Xufr >`y@M0`?WJ/R tn;uEX_J`L&b,劅1MܸPsu>A'7eXMrr -m)if= y7ĹRlA[W=ޱFd&}UAv`Hrl#2f&7I \x(Gn9+ o38lɰAxDý#o ̓&262&cWcx<a-|󡒲t>LJ#{p>ZJ*xj\FX,6G½5罂oVjVj_Lze߻FV[1? |gRQ,عbl+lwZ,Vmߏ9'W U߶@c-/ #t߯8hs J;9#7`˶Yڊ3J^! Z827b 0z5nipVOb<gA%e3j^Y^_VhR7h2ԕ,8̢IfEYz\wY I?Wj!:0MF\Z(̮q| zA).F^q;!ϋC:G >)IN윽@Jj.ûQ CR_u342}l&XKq3?ǥ`;]U]{FO]Qi%_9#&dFr=/1/ Ӛy5Д;ᑽޅy@j >k;;Gx, 3Q9|1e؞d/j"`CIIާ_{5!4>":kхr qs<1C8#(DL[xkE1\l mBZ`{1]h2V8.7O8_VΟ@+пg5#:d}ztc*}ToS~c~S68`N;^dIZKhyV๤"ߐݼFtLmXu3Zsn&tZDyJW1)q9AGd|ct1]g+jǻ*uLӡ؝3֐0 ^S\.Cs81.g霪 O`?ۭ>xS퓝SC'pw?^5rN\tSs *x¢征3M>UU~nWϽʁq3W#"Wg,n*Jkf&n r~_[6/ǤF~'Jު--ޙ] bL|:nw׵; |R?ԸxMr7 X+WKpt lֲw ;cVXXl5`=X"Vbq7\WprŠ0[,ەk; ʊ9U]zVOJY#5\*'Ksv8ӵ}.зlfP4~ٯF+TQƷLS E&h2_eޤ\Fxe+e۵Y<],"%W,];b%u>ZGfe($U<rڹo)IA>ecDr(ֈq 15sMfo[ JCk ضiUv1VjkmL2B]fҰ}JჀPfK1]Nez+]n l{)?I]0@C-cs,#lֲNhf:;mlT_iRiVPN˸tJ?EᇂoIoY%b2`T/.Jjw42touoVALQA mM)t 53NOe;Q/NUBNn 9 (OzqHG~X/jy鴌ܤ(PnVV!{ܟGvq WZmdj4fh m^kz3)uS̰o!qe,lsryX<_n,VF@f$zb߃ pm0%Y}B[34p?dͽuN鳂͇d^qiV;жR+/:}\ |;n#B\>-_ޤW,]Ϳ"VF>ҟ|8ɶ'-vS(0UsBPĝB:~%VYStYK!ǡ:?kylKl= Y7y~U-ef[``gNL<>ֲJTAW5 K7[4 <_;j%Y} F7\@#> (BKesuFJ%B7oР7g1*9REʛ5 zQoUۥO5@[ k+?W Fm0hwg0Srx"Z-kZ6Tpk^~-l  QYqKt?F2VD^%N޷nP+P79 rAZ RLbm팆N}bKTIan>.y>^\<) _{?I Czo5I9'~G9ui6Ӏ^^RQ+R+R+iɹPm={d.W-a㣆khOwE 3VBٿn*7 }fS!'t9JZP-uJ*sq JEB+"!ŵb7kz e4f +QjF#|͔-ޖ~r8aV 6"Fx HdfWE3aOf.q%O <`te1#¯:UGCoGރ+ݟ+UZ(&m~j:/,1{WzY}sm\ymkۀ3%\Scp5[tnAWfvx =F i\5{V)aQI ^'R$Nz%~WV.!<n9ϐ u)P~q-rMrH?==/yzZ\=N}2Dc,۠ɻff]n5>n^.On:U~5P^~6*VjVyәsQ66(.2+G:|"d)Թz OŢ e;F|uV/z"q@,n/s@TK&9x)p.;1=?S|)E/9Q%)U%A0{I{{8 #t 4^ lgդsX<Ɗi'>#EH 8,;$IY-P,!EI,.Ij Y8ȕ]%ܖЮ(ZFY' G@@QuRoZڏz⢹,a)a]$7ט^%b+ֺz(\_6]>vdxbdv^c'Im66q.w lb/b`2ڤww JzPy䝔a`tVEU׆Cvߩ]m! |1Af<|rphSݎ M'ޛQw!c %`mӪyCYGm/ 8`N.ol*ֈYȽ_`d $*]j @+үFOF)yߧ}PS^D׊ .nfΧ/ߠѡ}AqǹYPTy{3(فv^툹8p`!>C=R k/'߫`9tJPIm"|\T,O_̛N:9ɩ:NV>- فZadvV|\tN>,欜V$$~5x1kq|0amH,Yf8ĮqYI.rGf&uE~0]=VYzcaI1+Ѹ/1l~?X*vn:A{&43ag!DK4bmmMSSˆjcjGhаAfїm&"JDU\%v]qA=Z|^|gD֌WǑ(E)la2CykH_>ZxEU1QID5묠RVdqo1,aX|?d簏AYǽ-ϡ5[JHM% ,-vIVH=at]oǼ`I1B4vhqF?&}f#x9;Ijt33e =xzX;d8,v$PK+ߜ9ܿQG.n;&+%؀%_6*Bfm50bWs9z"@B11t/)75;C-,<\lqwn,?[0r0ڍQQ9"Va~o5 #p3R+R+|C碼M&X(oɒ蟓ki Mwq#̟eg}G[pUtL fZ&Ǣw̼rfyd?c^8\Yu2bYdX$E0zNx~5QWʁr'e\՘kñq1sM. dn ?xc!zQOlm6@d9ی"qba3GQcڐ\ŋѽڀrZ) &u{MbtaKV0UP B<"b/\Z[9l.Qf)-Rր}x뺇Wy7M~!F53-p 2+MV=!] UT_#FQ#ҽ@k(.{WkZ Fz8KanȵQ.mH&SAn%ckK݋6fMEYEV ׿N9U.0t]McF>ZWs7,4#JJJ?O칐L>]\*t+F8,$M5O1c4c](u{VPvfeyl\5ZŋJas_V7M$(Ac08|x`n5 Ekr}*i*8*bBIVMs\vb, QGklote<˰)s 42TdN+M uThԆMx!޽ch3YYJ.ea8F백UTM^_߳O+0s^SWZm#3cQ\`s.;$T$=@-8!urg&2͐QJqaKtqǨ /`+$WƁf H)Ū#BkU(9A79vtޢ͖3 P^8FPŖ}+5DJGKJkS##.5%kMHmX ksր892U5!190=M*ĜP<#7]N39B? ?a +[MVjVj}QJ^K-X,[AK4vjg.gioh+P56flnysu9[)ZNWŜS4+̐[sYu0@ ,~G*J~*vߴ>eGgsIjI#]/a$I.^̊lqr̽$KYmX/YVZ4-^.ΒdqRO8}ZEo?)y%lQ}j^8dQxQj!|^^ !],r~qY#ۢdQͫ-JEEtQ".Bz}q$Z. ޏPo9+[ԹO !Y|HwơKF^22|I+ Gw_(-59 x_kg4*.a= j%UpeSIA:NJ}N a^_FTm8lZ7hԔۦَO4k-3j.UC:"4 Op)0s* <0Hq&B)>҈oʇ賝";AstIFm oA)jO .f-(%ǯ*-2H\ة@ $.ZwiW< /knq0PdžxyF\?5oI6tw $=#:@&=j]pݺA_cA=xmNz~P5לW/3)efdԹoH/5{̼i ƣjyAǃP4Xo A) `w*qJޮmRIlUvH]pol~ܹ|QϞc}qӐm)!./,OG@UfbClˤ{-Tb--U{dT-Wޥ-+CZLAъ]FJ=z?Z%\tz$с:QMm!ACz9{i 3O՛QhϴWiZp?y\x~Z~˚XbHW[5 |V,Wsfg'Z?lѳj}x?gržrmZ̔c%1o HCyKc|k/mXw:ޑYҫvvHB)d!qz VbDeߒJ&Kn9ccf)G4E_KW?KYLɄW(uk;Gd~ѦwwYz< $Ӿ{% ptI$<ݢ;3)~~ x'W؈{Iq- z/mǓU€%,T!MG[39ZapW%~]TuӣpX<ٲm^0Cr4;1b5`|wE-~OxF{N5wb20zPˀvXFī58:"PA`{~hCq:<"(7.2vs(WF$YLNed~Ɵ(zDvbL1B_? kVjVUNkTkꦔ_Y/j1%VG'8}ĿET.jw {/*u۶W QMV+uCHl $U‛$B3R T#_/ }`+ n aء^Pfi=eΏ8C`V*u J *vCK~_㫟u=>+֫Nalrӎ^k0&! M^kL%Aٛɻ%niv :b6e)Q@">}<>%f&|iZ$uƻ%gMΖൕZZ Iuǭ^sqeV -$LF+l`cLk<׌"m=qٟ xYmx/ ]s;WXv9 ^+(T9{o}2E( +aGjTt{\{RqYWx 3Xq*Q$erT+cl1`mYk -5hА] 'Isf2rT!I pc1be}fa^KjZ-̲Jwt P\yAmLr> :&L4SW<|mوWzxKr٥[~\KMNR,a45#iJlu{&XũXx  ޔో<е>})3cv ̩й l3Kq;@2C)PhhuZT¯NѦ_4ťTJwX 9&Ȳ^cv%ϊK aP7E;IXJ8rOf>h8&aq R v#?*cf⽤৚t6J>a=}yyK]t W51y=S@ӭBQcٵoc+B!׷7U~q+o~xB6y8)7b&tkmxNJa%vӇi0 Tn0ckzn*'Y%$>-69ۇqAF]fNOݥ*+.i!?%PC<)'a>;Fe_]`W2[סg]@k/yltE[Xrm/AP.o7q>>~Ǿ̒ZU#jx:FJ;= ߢbtFQVlL 0 `^~Qa8vhZ)Mرj8lMAZ+3$\M}IEl0"$qU|p}'*g3V\ b M(.3vt1 {<Ұ?e,I \,\B0X3&쳘JdB *㺀hB 7TY1qr;|ޅwX"qCcm–]pڂYvia}F *& FT68PA0cWYôps_ Ź9z TՎYmۅ*o*ˌ-#*y۠A<ǤaiN^D{EIq'a >bbyCƅ[Aܩs4۾d5 2V SNT~/~s oqXWfƨ/H_g .[ҔnMcx`_4mx$_VDya"T-13WГq ՠlk#si{Ye-oBM@1Y ǰV }ޝVfͧ[qfݍ4k/cEFn(_S+R+N, BCU y&5wOc0]]U]wu0D tr MP$%P"ư=z-9u?d[-JHI ޷xȖud[#sƾص(BkٲlGL=]]Y_WW\i^=4:S+c3cfs:1{f:9 %|WK]+vk/۵_5q Aiu1,RE$WYEWzHN,8RijjeQ%)Nr\2.I#mygȘ~5I3ς p=*:Pn]JG?J: t݊z VP~ >W_Ѵ=fjߌ6ݦ6V:*am=B=IW.9>>9tBU '{ۥAȯ۞K]O%O_%}ԵU(7%=ћ-@JOKTuYk {!K2/qu>)TLI^>OɪJ>1r[ݥ: {ICK8W@q->σ K8:Y(yW7>Z.EGj)Tn%S(gONY_/9-uSBKoUm?t(nS[5G52NWﰔnSεFqttҺ!|^x`bɘڪ~W~^'# JYCߦȵB*uF݁~Qzwn4^LWPqn1 r_c F\Ks?fBE#Ǜ9.Yj %wpc|| l@٦^Ϝ)gm# [:3W*}nɯ0˥Rz}Sѯի_K di"qg0q0՜zXq'3@I r+,=0JjQJ0)$}ϏB\rb9ޢȓ8)##h!_$',` /H5\I !SN޻CʥWߥ+Y %a j %U{̚hV:8;e3cyY=6fl6m쌓7+pz353k83l%Ϝ虼Zm:93[dX)pP/]p)Ut1 q2@pnez +cw8 Xc$xK8aEy4#$I@^_-,!SHH1$Y[2PO>ϤS#g"ہk]T~ YrR'˳^^jY2OdTZySJQjX[ܩet{Q3-"#|nZ| ) [XohEg#C[|J@=!&ɵcWJ\i=\W_c! w?%@MðU֭ I)|^<@|]^3:)\Hnrr cZY?eF)p 5"e<Ӭ>=3F3p WkJWUfJ6Syu&dY{t* 6#!QSrIQq/ xn Z)TpPQQWbZEiD"FcQԈZ5$4}bYSNkA\q&@i:6Z0wV<]6J$ "J }X8w<0j ֪Sp](iI &mNjÚ[)+78}u oALi8%R% j;,X[p)hO.֋/߰b|tنbnA<#@e rFZji5 G9 /ajƣ&9o005wʤ%@À crD, ~9& , \g4>@RnAm *2n*XΨZ!HݬII]ԽP ,ruvK D޻ 2< a㦗(692h:rq}BjnӒRFgJ]YhݍT^eS::5Ի (&LWXS-_E+d!s! I´rkrgA޿cQxlhggpWF´*ivQ塞kgj&mRwd<u`S`Fm4yHu{uOvܩNq'nJ4i*q9,nХONsZa%40&)w>j2)C\mi#vߐ7^Cd\Nָg7ߠ t\KM>Ozc:to[de%c?OΌkʬfMeFaM{%ǪٚKՙH5I! E`b#o6RSJ&If]*.X຃LQ$)e9b :dS޸!9F >̇F7QsL p:9HO{qē%8gϣd{qH&\M)MRJU}Gͨ4d6Fz|Vo6Ҵh17qWkf7}ߵ$N`i5` = ;^Qx~v}?=7 \t⫖^xҕG_qI[z˹~{lM&h,' RZ#/Ɣy[J#>)1dFIOɼ=9 3~Ւq>Zc y;/(Hsms5,u@?#0(ls}5Bߣ gGNPMԺ3]hVo5z1*v ?"ǜ6D//rupֈ7ϵPuk)+֥48ow.e|UXK<--bI_ ۧ)ßH\hEo8P;tJѾy֡6~h,&G| (搴Fki+cҋz/$n)J0>D vI/hn1h(R7t,nTi~6^Yh/+]A/m[S@GpM) m5-@z{.ܵUh?.,ХHj|S>1)ASDm,羬j4FAOV_:i}Dؽ 2Sc+m[0r7J=Z~=(goRAc;".n[+̑6Ћ/kI90~6i H^7%櫈A7pfT(>zVoiżipi H na^Av s\Kthp.3zN#Ϫ7v Z2 WZF ?Lm\5/㕃ەRXVi9X}ޓFQ._*zAaqP 2/!9AP$$sC=:RӸ1:irŵ8־tq=D`K;M%W}u뤼^8MP=D*2Q{B"mxRjmmTb:9%Ĝ\'Elp:4ty /ۯ~u4$S_H Ў_R@&Vx|k_,*d0(`ayکއ2:;Ju?gM]k}JN#YØ*;S r돛A۵prcsނN;\Ksi.ͥ g7y/[BåWOja]\T=ttVkvj(;*Z$WnZ=^7G YIUP S%T[*QFBaaw.Z>az$Ɛ,0\gqZP'T3Y]xtfqxï_1=yK سQֳļ[T̄7[\Xu-%r+DZ/`=DJbOKJJ-ѹ7l@ϺFW-nV?XN#+J'M˴F_`pǭی:lk (/sPkjM T}LQI:G^Sn0_h9rpz@$ur@-{,U~/}G6D2Dȝ"Ygt;jK ʴutb=@Iߢr씀{اѓzz'N[Ĝr?Vͥ4\qr×08Y %UFs[pI\Za;:3t2ԜUTmdc* #IX4-ʓ |miNCɇzP_;Eq5 ۰iڈsdʆ"q I<̛a#rryG$ zYs|2M%#Ej47.$~>44/É'YTz7#،/]3KI/3NElX ˳'9m4ZTf%ZR+8=P5s}/.5!{v ]wpXjkFF_2OvaK-46^*E$}1֘6!ښ6AxX R5B8v>\=j.%i͂2 /CF[GyAY[Utvrhd~W 55"<5)#-TyhoHA"-"K%bA yM}^ָcLk`u@(6Jg &V!8;%ܭ&ҢI@&3X+֜{Dxהht֎"e /5stqkWZjhoǵg^([(7W/KuY>ҏSkӢ>hQ'_OYEWF(pz'@MW{қk=(q 04a(99X^/gXB{<)uAص_;d^nqxP_l'FϊS)i6ujE zާYuoAkq|BlPN@ˮwq$y^'ZYk4yius%,^vՊŢJǔ5lp'^'Am [*څ^P*ٶիz`;g (u Y\/#$ =.J'tѵ d ưL"0W *ZϵK[mG=P"T%)#xnWKBͺĦApQg92#A 93cFgv Z yq;(%P3)EW( c};|J|vڡ&h|\OFک3;qS9kj&^[-xqdqF#V 7a,㬙%ٍ.VVQ:)%߅YRnW7L[r+{:?ߓ#QO:ދe䌦Q[#/%@[q>3CD~ie LAC&>YEZKG\H\E*nzQjZ9h3j9p/?lM@裵vƏ?B Բ@".jbW r~J j#ovb;^;-:&%A-'@ h12LU7oΕf|,zC^*ڎ}Ϭ1'6UڏUr4E6"c~^h7#jB{o H<)"x l??j.,d\kl!)AX|gi6%$: Z@:H¯MgMQߡm&78)]/d[,f[t%>&:.|">'#m>ܔ E=U \Ks?vBy|y%$FZVcR(&j^ǜ*@llM3Y3<ӬVY6VY]9=[Κg5љ1r p |͌8ͼ9k*aR==f&qi PaY9e55T\JO/,9nDq@4 ?FbEDY߾ 蔼~;,1طkEKx*HDL0Ko:Ku&60 {.\?$@]>BqH5ܖF0&@lּ5 qHTj&ե^;& [2 Xb2djt6uRˮ "_rKK1]f1Gke#s>T[ngAjۉ^4g)rAr͵F_K}^SKdWy>ާu K N5z׏.5PVKTKZRIGRB2;rN ]\yPS'& FdjmʷFҽ b$RvV)"-4aC `#}q~ƪfiZ劘qeĥ;̼yұ,zYicZc8.Ln.ߧdp~.& VRJbBn4$kQF1)p:ƨ5e;vJi'mgh𞋖~mKsZ5 RI#xiXݭf:a,-cqTayR(i/k0r.ͥ{B9C\ GFJ 5 A忿g0$]gŠS_E)YŁ_2$)5\ ZrQG9}Moz&C"<Q-QӯƐ<ѨrGbԒ4͛ pD ̗-¨&` 3m.l7F$Ntxhش7BJ`(ML ?F3p Z3n2OeBʡt144h6y(N'm;y1\~|S;\8 7 쐸szӵC2'^Up`Ly5ȅڒRGyZJ{HA&͚l?@FpDWX/:S:'ݪAޫZG䁺z3XC-2W'$uKȇn㘪u~msX唁EQh[/2=B !LkoB'knw]K"{Bޝ3uJ.e@.Κ7%dcߌKDBʢC͓+c˯nМ5uR20gA'ƃX*OP`r!WZYz)u^:iՔD[Y寎t}ξ>ax>-#+v\Eql; D)}ZeVgr~8^c/rX?/s]r?7Au(G[p˝+/,>Ų;UL:G-s,Îrb0}D˅; C6haI:N֍魛7c|Qqu;FMF*ZɸM{ExK_C뻥#O7o1OvLx)Ɩ?>^ai -@(~z 7 CK} =V1d'{),?ܵj.ͥtqyh %Qu X jm7 #va!)ܗpXxЋwE#ƄhNA#n8R|zPuPXbA|([ܷM#2Rp\Q~?%$w^_nEddjDB"|NPe U'NW;Af\W葍T RuH/DDsZ{Eiף(5~(r'ň#"S({k1 jO4\K!]JyR[(W{L N;+qRx K9})lwO,lA3\Eq\.JFV/φmz=χe{dhwEmtia۟4z1s(y`A*anzdsj~̝J K2W}u- ˗.Y tث,j9eξԀẁŖbv::]\uI(pN/JnKnWJp: PDCS}+iҜg&N*-mV~E[m4#Yڑvzr"}ۥm>-$(ų j(LJe9]fXqa78[Q{~-Bk]_ t!ù(K -j丯EͅhDtѢEI.ʐdWi6Ȱp" ̋,9 .Z0^<,*_h~ܐ/Z\ݱWKChaDqB^:]f]5>:dqyu(q2YIK6s|+$k S/-6C-FǚXW/?k4>)2-Tz[*Ș$I%W9P:N&܃8]wۥQ1Ni]LL񅖎;)vzzDv!]XIߠg./1e,G=7˝:ҲneK)wTt'rg (gthE:q|34<'9ȵiD ll]WԾRwTTz{GʛhȵQ?n6 G7Tbx@iѝUs):"3:Evvaf%RvJi9[4em&Tkon6 tM#W[yPppk\9"Ŀ`mje^A_gR_< O e? 7H[ ,:\`x,@<$?/^P׫?T,tk"gK 啫g띠>%Q3 +iCݨ{/yFZBLԲ $vuŇ5#x1-p$r?#2[J!i7ޏ. @!Xu Uf6owUZh(\-2^j.ͥ/霑t1.zcce+._RbgF*JjWJ?Q&e=)%DYR2N_xmJn9IE߾EFgZ-c"A1?De2d6)7Čyq ofz vk͔Q7-:%F#ߤNȩ(OAynd^GbכKXȫ`_FEM(>AL;_*# j8Qi3)+qv0=:ͤ뻌2S4%'ZPO̤;PoUAFw=ejl3jI%zL5h-] 4phԷ:2MSHAqZ6bE2wX-><_Q4؈ar7$cơ!Y j%>KYr v.KױJD 88`ӊkS]za*0u~;j{ ʳ 2:MUm7(~Pn%z~ڍڥzdW(Vŵ^&>r|Ȓ#W.e:Fсvu! !>(s-a˚sRrLH0 xS :`ߣtN)2$^y@lh{)Unrr En(lszM.y)iW$kx6MIK>FBU;Q2y()AzN +ʒ[pg՛#A6|%pzGxxw8?O@ߧ:;Z'ޠZ`]aG_>j@a\Yv 􁽦#Y0X`ڌ^vkG'T:li磖AdQf/"w1<&Ak@L7:RqG[rs퀓2~&M ~vD k%&e>< z&Qwhzh{8&+JL:Ed0jBU$/BbkݧUɝ#˖OXk.i9/qu͗F]2ތz6a|NR.ϥƿS9C]eFFO kwzm}4Lg\i_+= f\?ދf$6ζvcB reݖW@5+nTzj{ܽA"w!u\J 2\iyr|'4zwBwJKlY:s~]8si.ۤ Aٓ1zcкxd%=GV^!s="c,@16gٙ$@Ǫ4P‡gsF:G1N,J@Z8*9? fashDvJ͓, ̷+N} ̳(CFU'7É_XXbh.8uG?S 8ggy)\P)~љlaS,4 Mɗܰb5K_qIUt |6p?6j7-3h_H>liȱNtvD;^kN"{:8l,=ޅ7CPP`Cۊ2;Ro]w:aڸU̥Zm|yP <).x5voAm 6#Ro a̵c0{|ТBmbA尿MHopHkB-}.qmٍYNsC6+NUǘe>`XZ.~LLƆuĈʭos}N/EO:ǡy;pW嵠@IR=4\Mr?"K/Y-fK}) 2^4‘ .T:Sx{\.n:I8,lk4qq$uf/k*~{S5aTF/Oe줖1c\ِ pMX7Fbvѻ8R 'Z$(;(6rQc7X. @UL M#?T2l֔j+Fڀ@*F4k܈#znT3~ztOBQHE>(p;T{l7P! wHFTm چeVw T%W+jU;KtH];Ql7HM kl1VnUh Рq0fRwAuDFpN15+N414k wtIsZZ1Jdii)yaϼҮϪ΃Ɇ0+V>tNFQ-G#VEnGbbV8[v+oV3'.ޥ/58)q f^1~dNt8w ~EeI)I_z>\d5ń ;UVf2oһ6T>\_)j/X֊Yar>k ڳU=(5_VӤZfmxrQU0^g;;D0xD^c8PSFmmܹC`-BCU?q޼߸bѲTKsAƅxu)yeKWǫ|ǭmRU?hN3?`aǚVqdYHwCcnic]|d%ƷmǷ-W `Ǖg )fk19wt='gWZ v[[x&/-e3EޫLt`CS<$ybnNso+=2ߢƀY&) ej](r]BƣAq钚Cw9ŴI}'kHshd::c~^]o]nWo*Ҧ6ʬZ uhJzu7dݫa%Uifchȕ"%lܯWVK-zS Oh@ Sv}mg'9ivb[pwo~GuVf9 f:4{q>^ ?lKզ2$ѸD<` \~1JƻKV*[OK|y([)jO&M2bNIڂ3Ѭu: }^W v|@%7 ‡Cb.XO`SlړhYm/;.D4퀤NK(+[586uef{1NG04~|v~BCZ u&wuQUYUwVu.Nvh4h7["%K/쬾olؖd˖x,ɒe^7/ M]3$2x"2zeoQER$[uu7^K,_V.W]Y)ߩ>yB|n=>|rvnΞhV^S-XsRupvbx$Tm\Gե'ztxtȉիlԞ='tllTOY62:z4;Z-\c892{dHstM:hVVWG#l5+'f=zr2p6UgJ:r:r4r4Ziڕٓ9ZuJ1 ,i-jzZK9Jm#\,#yn?mw|ߏi%%;U*G~UJ_BY;~'UJ!T*^5M(+AP,K84I%K$]M(k5G^ Gq8EU| P),<+6 n&CF$JWLB܍0'^62-B֤SЛ"se fYjiȖ5f#ۘgH! 1%y: TYq\I662~hKV/|̂W߆j2IՍ7t5~}]םJS=j4ݢ,5)SSA|#6~ګɜc;-W߽~jԷnQsCͨi)u]vm_$>ejEzDe;=PUP; Avwyvȷ;Pgʰݧ~Nu{u -M >߻Uq=A:}UjhE}[%1ugUj@)LPy|ɕ'>-f=?(O;R˖#ȿ WwJFWQ&|)iyƬWڭ~=)ȰSmoIu& :Fkeu-4#2r3p/Y~bkZ>sWUJͬΧ [h[+Wz+P;ZŲZ+'K6huFã#'K'Jf*#óHsuvzLg,wW,Y#ɕ$U| RhdL݄ 휓خi  \I4{rjBDH4LdT~8 CQ2@zmFa)nFĵQ#*֐6F3Y4 -&2l$Eb9fp4 6IspѢ&jj6f3598mv`㬙mL;.Z$u)H=d5x*o6,lrò]v?zJHվ~Rz@CL"4R/3y6[k|7!]hs|V/'qn9 ֘5Ņn4oU[pg ``^\ѽb$ ֙}! -BnP׃+r{K- _z%gMUPSOIi销ŀׂA5p+С4'+`ﷄ+{ſWRbw/bQF0jsZjNԸ]Ƒ2Ϡ$<(U2^92J5Whhp~v %ݼDQ%A4< Ğ|G݄Be|)YYZSZQ?VFc hwJ/ZQZ - U6Ot'zփcH$IP@:7 'GzTA1z+J?K*.ɷ@=B-@ZU,^iM`<c=I\S?0Е'`-Oèq&PމP6Ҷwhj#FuH+cnw f_bi\jtZbͨH`Yt5gd>KK gڍ'e@#u5( de feY>^]O7@ip/sWI_ŷۀUJ*cD~ }<އ4s=v'_~{tRץW]xUVى+ëOc>\ 3СDAvva&Ax6=(N lf #^W DN~DaGPI z%#lBz{ys uDm%$KG18gƌ FoZE ԋTERh4g7)kI@*E(li&& 7T'U!CYL| ) ,]]P{/$`H#8ĕ|Z2w%WG_\:T[҉uKE>Q/hq$7FU@VOԔҫiA]FTH[r\߀JDAB;k\{+S[ƷttK7az>\D^3vbEbb%NMU[Pb To>~AY`r0퐾leZ]³S@Ka:vbȻ]F|Lo`?eFD Ww߶H- ؂Jk~h؆<+-H{l^z( WR.*tʯ=)xK {eq! o* :dNn\&ijSpcܦ~_V1ޯLI~E7]ֿ*=>Ge.S2ړf2V;"ЃͲWrAÝ~\ifS@(PȡSG({<d Y)Y}UѧHsLEGy~({$d^:]ĤkA د~>zz>iv햱\|<8?d jeO(%{[drSS72.LQZc9&_0V/MhGQGl<߭B䨣_:٫ͧO->O/ }@+-%+T9zb;=;?BGp5m$W)BRsRusmg}y?ruz9P۵\ʴ|:N|` )yN_^DM@4!8kUdRIPڤt 2 W`[S zCC͘D5?b Y\ޠC&qMMdb? ܶ5Eez^:I6D පDp&@)1'iOyG˗^qZ@78Q6ۘhgHGpߗՈ+2\c)k$NO>%X[(Y:cdե֘Yok4JF=j/UZ@ PrH/3FE1a5>o!F ZY/mkRZCmlLS<$bhCK9\׫ATX[źY&r>&Jk%abTC7=yԒ㔺WNfZ c2vmNf ocv\KnUe 6'gΩ>x[Ñ2OIq[|ft3_0N?rȎOy\ި{,(Np9yH|O3 J"i- ˖q.^lZl?d1O/͞?%]SI 7 *g^e񓤑I%I$-PO S%`u]fZQ*.9}´ZK#O2Vkӥa^$`xqHF$6E4 h&jOd"lė&?i,J VgLixp0Fעf3?`(ajcpQɛhY5E.6Y .JV^?<_OSwb]!6Vs㊿}-ݛ "6Vbf6hY[E]#s(mjԺP@e弲GP*4YmBp.޸ϜT2b묺nZu3w!viJ&o/P#%[hlp1Q+Si!TҲ+^Hp_;D'DzxX}+)1^P'gĝ6>C)}6-g>\9~[Q2[P21-<hI1K=$Z(9WwusiAEǤuBDsQ*gm^܆Z, ^3v4%Ȑ{EVvPz ^sVVj lv!%{;aAZ ÏYcuXmCuZc@ĺOoŲ7lHTϢfQn5 <)s ɴ4܁9s=zq< ~)=.8Oˬ#.- ]d՚/Z*NˁU<>u}r]o-m>{}AB┩m9 W;,~MQuFXE7s+jMNcW @FkVdz ϣ Ͻ> A!\Qa=hqp$A9ꨬ_ONfp{S'q.[BV8ο+ZzTq$WhE-ZDl0 ucZYdr.8N{m-]R~e^Efb/~N^2fR@)Em -@ 86o\iq'TKpU ݩmJ*HfڢJ _A~f߭{dd]k(ww ֵOĪ#:#uJUpp!xHsQR@O[Wg}n}\<.wQirP\j zƫɇO[ztNGy4ztNIt TAǤvBp*'1}킳xMQܤQhCr3xtjm*@ܺ# oQ ER x`7Md/1wwɘ|JBÚڪ*G^)3oFg&{=Zcr(p*mnjSeWFmL(>q[=/i>"4 2U+K/_SJ^= =>OK| z\3J)iŃ(Աш&`PZJN 3P#*ADqfV"?iSFe@m 2~;r-"uOsݼ]$!K@5 0 TJ*v#x^L\N!s) j55s0E^DNqv*aI&5"fTjAL$ €^ b Jm`Z-xu2"˖+C-(Gftlqm疊i 7Z nN$r(HSRh_Iw:; K2[+ϐȧͿV*>!@1B:; &EUiV:$6 զ6eLOaMgK0noirmB6j5&;-nOהSkKUaJ<|EDa )S~D;qO ڇ~  S ۪ezmR==|J}H|#~> wI(4#Ƹhí'j6_Qߒ 2eEfaZ zb݂\#XI yE<."DFv ~tNw z/fz'CIWNwcT1AYe߆yu.ݪ6Y 1z 0gnRy偄yzc'ZI}VFfS?q'cwtM65R&YE|0O/_o8~j=+\aWr |M5^uw.[.^T ޷C)R .Vf@Xuv͚ՑHV)UK'kLJG\+@'<{ķRu Au qix0 SS-3|6K0mYHoI:L%R#}Z h~ {+ 53ӧSE-6!߯Ӿ(eaPA-VE~=p|ŵ q]t$)j%Dmz@tS)J'^гU u7"fjD ^e P4 cjDTb_XT B= +ZUJE^ b_Mue t>,%% ؔ"J\։qE>rX.XG]:\/;Q,)(bӂG䬖Ү\IZYح6ly9-i5B>h| }G>A, h-ggQ+K #45v 8+ s tzPhA(Y.|G)#EX Xvt7`X\yVS::&mo &@dF6k]Zfo G?koyoJfi{J2~,DwFpL]DRhNJ^jSS- -~ɢ'm5ey:ۺ6|&zB8_f+2}\jC/ C6sZ kh>iĠ>Vɻj\ӭЛ g,9b_Z_+w krr1A$ƔJזnZw.M[RmlH IGurPG*^)@]ehMg`l8+J.ݏ;H]2zTz[lnm7 h\Ui!Ua7cӬb n^|H/K<]ҥ˗.^q;͂SC+U/Z=㣫YҤ$@AǣEi3ͨ&9) N [tՐu f{Ilf%E9L#r٧s Rpf D&QQ'p h&"fMNakzb̝0ՏǡWdHfQ+YzsP\C 9FEM7(U&Q52)xm,#@y38jNļ[~kQdjS*Jo.1B֥_ {{>媣MM+ԨT?2~ SrG[j@k8ԫ&+-S.!PN4O {;֖14"8+jnӔ+'lugDMs4hCHYJ;'v6D都5f.ZB>Zw2W>G|2Oi~)$DCU[w1yFD?5~LR=>S&%[9bYFΖ ń'.4O%?nȌmrWQ^#m[ŤdO? ݢ1%e??  7(jdNcstZASJ K_c>3^<:;'A^c}F//JgniMI{IlZ=).-v܏\7;b8cK}1{㧁iw/+zqG1XCi0&QG"%cja#-Gߌ]gKn䥠+ZQI?Gƶqm<g8=qrGέc?jlM63RFӘG)qT\q81<^ʣeC݇|kVi|=[㨫Kw nr =l>TkSU \ْE\s@1wt9ރ>܀=ʕUC73X`Ub6A;xM($uҀVbv7`M6"Z$wπ?f>8ϊpy-4#"_fGZ\K0Z)=(엿ZE󔝽. ڭK`Zk6;őm1«13f42}˸3/atngɕNS\F!{P܂72[$N&$l kÉqt3s}ƑJ~D푭,\؈ϻԷPC=RWCy m1Nd 7/&01.)-v4zY}H -f~+#xZܸ^ ~ŠE Qz] c[T`7qW}j/s~j~pu(_]}llz@x4!.`S9 mDZI(kꃊ-|OgՐ<F_ 8OH['/`FrJ25W*OUϖ\ϙWq85䚍ګQ+Y HE_ӱ?͂西f;v+_hʱ}?,#So:A%8ba1+A5N+9N 몖8NxD5Дv4( bqE4 t8y 5@ʤi@dqFw@H*-ωz#hFP0l~VGޢ26y'Y h(a-8 Wb Í4\~FQ1R!u\FDYd`f-Re@7[epѾvG!xO#}cbmw4W.|t|6!wpR~BmRu aX/{F8jh碡R[p7;\oauzQȕW JrB[Mc,En_.ȉ9>ӂngk_*hb> ڸї|Sl{!z(ӽMuH]Dc3c cgq7'BJ% R^Dcs_{'J[ZsY…>uv?#HFX 6 َxgRdN$< n+ %. @g^ҷ_s6FwI(Rav b|;'? XӌӽJ_C.:ך$fnBzM^tBcRWZ9zY]XZg/ 32W>7 '#b-_ 7GU,<zl5]yܨ<.ѫeXKӆG+,8'Vk˼E7[g1,߯x_m2gdV 8-*TD%qy|Hf2k~|FoD--)#(@ %z:[ 7Pe}m m+Wo ob}DPwk ٚTX(Q`,HpZP.J7|Oi(u@nojUtrQ)ð¿: `8P,VJ߯@x[ J  ˅bx"a=GgQ DAßLe7(x5?)Nq*#^jZ㹸JX,֒.[?&DG;qb(%$K*㶽-9aj vLn{/;tͱ{S,GuSmB̐_NB>[ o4)Tpe6 MZK[N~PEA"כUlQ>>}6%C ުOX'kx sCri11*6r6#o4=8nEPݫ$ Fs>chs(}Ҿhe֩kƵfaXR-gH90,v-ՀChdrכeJ?6@7nk׸XTi>ͧ4{s}@YpɪtClrٓQR*%R|khpIj_wۆNT~Vc bTj+ʼn E3Ҁ";~WS:9TywJ-kSsžzͭUQ@VsZj>ZsRQ |)Q3y>fUWX6y5.tMo J^QHD@E6Y[EoH:O%F'}m>.1dkx֙s;h":(2ebk962mu< J^$JL NRD}.<ԝ;%vKLgr]QsAUƴtQ:Zj^.rZLD=rP 5Mj儮Gh7zbg)HN|=en oS4>?^F.5PВ7QuF1x xץ6zl7Nb[fFamAke/Ea^l~Qn2"Smܡ1g6'ӁI7sw>ap18#m > :{[[0KK[^v/2݉:VW>eo!+m_^x`/F(hvIwաUzXw\)En?V%v[W"bEE3a5њn X`הocvI?Q }F#/܊l@C[HTdשYoA z`_v:<3DqZKL\b] i3֯7ael{$x9[\LkμTJd?^nBVK;^1^@|Oy Nq{x.`Ѿt.^LΞΝ`&ƜfE|S;[sN\8}S_[Cbkat@Yǿb XZ)_BHdY:" 8:.<8"R3{ZDH!cƣiJ j@ux4c/4m{|SG14؏=%qc!Æx^$6o\7%F Q= | vAQ t<,(ZЮ+8f׈I˽@e\4*mzg-Zi>s>BF+Q[sJՅt5b:z4'jfӎFzELqTNe^j.ikQC߶b&h8 NznUc8zvA* a1($wQuJҐ[?Zf jF6Ĉ'dd?i(fTkd94̘HUIM:GdK ;,g? a SLϲ`hpp[鲥+/(feT o'fݮZ 5]c:%t_[LڲЃO}epj)!jG$jO)A]l=N©MwZuj;ʃM+N E;z"a .Q[m =)k ": ƕ;n+Q8eip(1k8aIaL'Q/?-J =G]`fhE=aQoҎ)[(GO#ul؍Rl6&Aݨ F?SDalzd2m3ؒCxҠZ 9Npx?#< Mքppt7nK?n&yZ '}B^BC 2(&W}hi"ĔJb:U*yq\r4*/y8HP)+A 6vH@ôf>!lygrIPЎ_)4CqԩWWnEk}:[WNT4 J}bѯ~kv^)+j*j_B?psUZabA C@iQJg ES3+P$sH)E^i2#\/_ \mA>Qt%6;,1<.f\{d2Ѣ/1t~o(o/"FB_rfC!%YwwzMR010G]1#Z1Ƽxa#(`/lU:{ HB/t_&6/9$f3LiQIicY<41fhc+ƚ#Q;wviy1;0JzSimU<*=JwOqZu;Fv+-+.0gq[N :=cm`?AnWԨ |.Y#f;j%ۆX^tE~Z~|y]PE9 ](effS]"\@D<ߒ{:a(oJA[ʈiĴŌUU"4jdh1dFNw .ޜ=ϧ_N1qV!ub1Y~jmesPV#xk ԶAk媶ɹb0Nj/A<2!v\uڈ.wqJizj7g rVv.sW[@sΪ߱ڕ@ww3 KAY`Kͧ4|Oi!WK/9gir(~ŗ;pzrdh%k5}ISDr+=Ƅ^D0-ˁ/ЏчW|Zi8sP,h9":ĽG? `KkZ:y5hwFjrĊ3Flo9)UWlWYY?g@?ܯpZh?y(^~ҺM5DH z? ~~T!z4{>pSJsO jr.ԳEl6,3cxSfDt@3f/ -[=IG dM.2|K[b=~M)#YWC]qP)..hk[2g fNʻE bX>{Ԍ*륮e9Ҟ D|d*B"ni-09 7-t͛ Χ4޹\<8qo]@CoEOoI;}ʄ1kݷHѓ#VfAEIB8JPK;vJt]Wx"8P 9F* CzdC!P/U͐⻴Hĕ`aq-u:,ld'0wsxOq؏}M=ϣr-Gdxt7/2bb TI4L1Md0eyJ*CTL{` EUx' gh=nCaIcϩTBw 0Mvs$U\Ώ S|!,!@9e ֈ3D} ڄ8fnO11 鑓15vj15_m4J).9Q""-֩~8fԇ&'*e,ځߔ^W1U4p&(jhEh8c7Ci3 "c7m,=I3ZCSulZ 7L/ЛPb4`ס' $-=$穄G {!{Q0F2є(c< #yk^rn}X6[|j3p:_/<,7OE.EI> Ipg`NTr! ~hŲt_E%}p<1..ЮL>zЌl6o5~>ͧ;B-q.׷t{/^r;etZkڭ^MF')RMRPZh0 6Қyu:oQ v}0ojJA94eM,[䂮FלFHEYA 4)§'8:E"+o521vMB^[UkMK8H[bJ|$)%姱6mH=t䬃<+x;EFէ% ɝ{eQ,;~<"kdہF Q_QKV:OG&6UB0YRLKdԏ$^&=GJliEWK;Ӡx\:bƅOuԓY vACkD:nwFj)NP|e(T޹b2:Vs2"*(8L"> hz&F'xfڨi\b8DL$M7B9v /5]>u8X6-!sȎQ`xKOgDhZX5Ȥqߣ~b:t{'hF]+]lA_R7v[ַ]͑2bk J|^+6`yлC̴/We{1&"E72_?|OoF7j4 T,LR'іSW ҜXV79En9LjU_'xtJy~Œ]k~V l E^)g18T/PuOǁ9%))PfR ^En a#΅"۔-8*kd"6CCi38HB䄎I0wPq :(^M%MfuΕ6Ftӈ'וF0&#0HM m,!)M3XIa R0(HͪMnX vɲ?i1 %ZRز]![FfC7DdD󲑨BK:Ǚτ0hܣ)*mt6A){g)Dƫ)giތ5q c'DlZPߒNg%ѕ{rK˫xLr2 =byH-ÇgnՒn\ύ([<}Uߖ3}ۏF-f㭲}؉ڬTJ #k$ž6#]~]lv=fiXrp (;Ŏsdp9e|Ί G#*84qF.3qaP?f\-iWd`M߻Lh!7s`>iӼ:qz.J{lIքcZ,~ZQڿmj9iJ Zs^twc lY[}Dz:ehցdZRMrts/*ZbMgE9A:]j}EoJR:b'JV":{d2p|̱+doWڦ[OQvqy7UR|ԲmRu.ꡌOM@u>δm\hAT*W[A; NNZ%]~1h}2"Ư?.m3qǷ_2{-9 LQyPF{Q^O5=`ӌ4Io`-Ӟ% J=ի?xk XGN1` 뉖b} 뺡!dbE~J71U=0#RttBe /ԣűUJnF~%Ye?'AS*y8v_z@ Η U\c9S]\(x^+ ՠZ.h ׵ߌږOnX?-rrѷSRK Ɍ>-KQLc d&QJGcVO`x%Zql9K&R@9"HxS7mRR/{|Mn24!dD/%LFwyҽKA>Ԁ-/G>EzXrF=z?kΘ^̺E8KNb#g,u %nJ8Ƕ4aQzƢmR N).79 hzx#4Y|Ý?4֩[ҫG[`QdzE=x_h2&|bHEAu]C<ý"<7ߤ8292G :J}`vEֵ} F_˸wKzڐ|C]ct/07[>{ lKϟUi>ͧw##zඍEKY+O՛=-ebޔڀd rF$| 0-ST*nF DQ-DaVJ@mvVCZT Mα} \w0m;l>`JB)Q8`Ziv+ǵ(rO¨+˞O_u'F3-t-!4Ilda4p٤ u;<ǫQk7IJTdt9Nj&&eFrEM*RJCAaߤe\bas,"zД?"zo.}HDc&yQu7vi̥kYʸdubw)X\l] *3ƫ^5Of6Զ_i^6.T9+}PE-FVJ'kQ|i|c{%k4~Qs[ﱻ1yG嗭CƕKUҩF/XS$YG79]\ a7hSqD@ȸ_E!*_$nuį֪^294 }cQD| kroELQS0XJFupHyG,E-ev8DWr$H2mSrRЮ<˂joq+e b8yn7KN(iUκSoϙ*{5,tZWxPB%|#^Rvc&PADKHޡT) ٜєXkOv?LS&t޶EĤPiUIi\CJmbRڦZ׺;jm;nIiR#|ۯ㻔$r7 mHEn'>zu' s 7xzW'fa=|k@469"ZcM?^2W9OZ}]Rαm(ʀ:xhk|O3$'rBC/yp\}>̛y̻ (V H.x$ (YE;"Lo$r9*얓JYǎeKluKl)|٤jwk=CJ[lyݿu@pË+m|e]opukY=zz(ϜYn\:{- g2̷qu&JgǗ=1>4>1vvb"ť,[$˲0[gY4IR?bPp(LjAY'iaŸ%aI\KxĿZV \s8Cl#K16ul+W['FMl\52n׻y]ln>vSmR@A7 ڃ׬jWaWq/2QT;+xulZulF@r+1<{Kx}*k~ZTա.çN[U8[H;~:%794f1[.U9 w˕Hưi*yٯTєRP+Cq^*3>)GjU[pvXXR&H$=@!!wa9,aW~ MُmV[uȪGש\GMO.x;R T2ڀa?v* Apim4R> $bܒsy֎viuRfAU@@tܭ^^_Cj"\|_W5[}Ig)9[.%,zw  I*!uܟ"sFm2P&HAPۑ:<{^}Ay.]ۿnS-2h \&q}-pjǁǟD^Z&u/Jы!6ӎ)yj1݁g24'q)aorVԳ(MF kE1EyR:Kb0P"/ElG?P*hzG6z]d$k|N=Qz`A̧[a !=iPAliEhͅ:N/mRHy0O^󢏿D2oVYtۑ[B8V ӎ7M, bR_[! -K݇#8j÷TAMR*=y}?E:1p0AűKE뇵ZՂWjrX zRP>vx [+nP)JucWO߰jKl@@AZj4|vߒ3vM"nތp8c X-Tv~:+}vL,GU3`-%iϫ'Sq; ;J 0ۑOd%vBgV4꽒wKó,71ː]kH+UO!k`꼪Y]&EJ0 8ҩwHND(ۏwSta>tft۠{)߳Rm@jx;|﬩?P8dj*8 Zt7!vAWPuJliN.oO@^}1KYq"t}~Qܯ]K{TdEYѴ2 E?$ \z<+DL*Í:n1r~9r8\߆:]UGs"4OktitI&1NĻgVi8Zh%gvK#{;RB^e5 &gNx0R-M Cݸz;q2pҝNo]:ܢrA)9{Ѧ |@cbl̬7ӊp[7f]WqKZB<CI Qi} µr bU D>QfRsB] $C1;E|څW }H2#"$94sh7SR*{Q~BT"寃X["Z1D,^ ,Wv >r/ؽJkuF=XKfLiqiqqh]:[:4F^'D~1OLۍlhh28h4%v8-g.5ōgR>ggo3CgdTΞ?&1{qbUŊ?gJcKo4ƗCAP &q--k#NN@4Mg`k~nœJTFY (O˜:/fYȠ ,-wk9Cn2ư5ƭ9S1y߮B1{:U@Cr=ؼ 1\k=L!61uBc$G[F8.)ϟ9"/څ4:sω3r~H5Mmx~\fh/(MGwZڅ7-bwBtJ-m|E l 'LGܒ!4?~`|5,SxhB*w!j棐I{lIMxepS;9Z|W}e1ѐCxFɷMhHޡtKe~BI~(]vo芺rY45꫎zկXGgLhB %: nns0hҞ[IH%uɝ x |h]wȑO! ;vڥ?kS/at ☎# ?*[A4m> =v / Mb_P_E>hG]R[S{%m̄Q3X f_.ҋ)s,6ʚCˈ/\TF[Kjc9|ehWpgrX?aYwi/7Zf^Ge&_L=a? GVD]hgiJk2mW8 A$IB'vJMHHlSaH[ժ4 54aވoykSs$gBkeOM$q5Nt-H*)J/ݚ=BI5%BnTՊNSEA_ kbO +iz'29zšX Z 0ɵ Z%5PFA5"+q-` D8i0@vA"^1wG5Rb.A/ DK^<]D( WbPT Zx*ͮ0K,ˋ`4~5*gmƋ`l <͏}W G)f d+76$isTjvꇐ ޤ7e$:wC$X4[祍D6~~I܅/CHZe="tǺAdz4:jSr9L~ g8Qh%W+͊brX?pbm?msBe(;22륧 uļs,5{=CgUbo~VYU?ISBZT:`U/%⃭z0@WE'ى].ހW.=HUJq\ 0tZ"f6FZ4hm$IOϣ2k WӴ^<ᕼjhD( h\Hz%뮏i̍ti`^ݠW256K,pOy1{ 9OO^3Jq^tq-- c<*#i+5I|<@&Ls)=-y1Ī$oJeLY!x@[Sj-&kTS?5fLKsS{Z$+f Mʵ $C!2tm"׌~$Me7eFZ-]֛ɜn|OKifyz ^+`HN1cipWOY+yHDXz[V^LSW_ 3P')&?-MCo{D"2C#R? ^rqqא>_Fjҭ{J|1"=O\knor@/Uk#O3[[j# T6LQڀ{Ti"S(F =KJ>k.܃&7#.mR[PfZ[ Ɉޓ*!qL t:$փ&O2}n`=]桱?{Xi) o6~VҼqN!r 5y#ys_o[5^vc>m~ 3u\~.c>" *˜p,$9Vv\JjIG 4rmyV\$0~p|5 #:˝~\S<͙I$ȑ9Y9h&W.R\MK1H}x8mdh0s>JStzK@'~9jJG5;N,v!1'9srd] äH(kuV6h&?>*nF-W;ܣLsnj?!SGIhNdCm=aĮIB٠C㔌7Q2ph}h+SWb4YEW GJBelt]ᨋz\}A1u]B'TMdEډ:]VT:u~OKIw,_-v }!땋{ 3Gs@DA«pr QTa9t¯]̶Sm|k׬%Wa逝5/bVǖ6fCXZ(z ^HJnՏ8G-Kޫ >bn5#2boelj9zŵ(KJ ]\JdO [0'5ry-KēǸتFYSI\MEtMimmiH&&FfBʶ]Ĉ2I`?Їah\;q2CBz[ں\f2c(q-w&u%9+gѣ,} "gOF!vq";s*W^&xYlXB= RfvZ8 v7kgB%T:#ns爔b9&9<-ڠvzŪS; 3˻Biһ$33Iik0buK35)%ջLf3vu؏˗\zlY&lc.yfZ!rf{^ybԓl;!tw.reH:Yǐk?a5"Eߤ|լ-*m39:%K&C{\}Td1 |׬E_hۗze|j}/̝7XS]Ζ[0@+Kjd"}Hk}D~kퟤXOBπP_7 e%c{8Tiq/{12oeA,>tMcp7jߔ$fY:#. i P:Z֠\p ]k/ΙYZ"8|,S 1So"7DtddhUW,:-j1>yiu-]?dMN.GM:xO*fYѠ]j|J515 {H{NCߠ.mmvK)ICL"yyу^{.iK|IsNIz5 v_u pB-+1oiۃ+2A{lUٳ="@CʭtĘ[3^i5"]v|}Kc^mX/7ͳo靤 y[Mu{:`\ep$L̕qZ2<}1{;qU#׮H .@Wo'viEc??+{9j  (9Kb0VVt""[b”GHa2>@{eU祵28I񰘃e@?r}SKШ-c!K M\>'f\ bBd^ 5[iiBwDT@i k?M.ax ~T6IxfM~DjGySTFqa.;$=a!.)^SMyAd;d7ݱO[h9w7q=&`OkO'"n.f#~f=FC{f,qR됌Ѻ^}RcהHt"o\dP^kZMk^ T xIqINՏ޵i.,a7.>l.|_8,{WY )jde ]Nb.n&BYKQK'!Nf*b3 f%&nS%bmjqZtYvD%53=&pZK;&RKj=hGt/є1V{K0ϙ n2lU5~N\p9Xn2( z ԣ$7[o&DY.*I8IuEw, bւ_70C~~BJ-*.Q9`93kgЧW~34̷G5j|HrH&敺ڢaqTCbSzIW k7˒u%S?hnt-C'%^H&p͑Uw>Ҽy^xZr`ftk\6%gsS#Y U5 V9j>lr =uAmv4t|K5bAˑaØ[]5✥G#.ϥ^3J/in؟ A/ao'e`V;$a7{*S:kc=fό$΋EUڎ-nžkzKuuQoFR5m{mu=x ,R{+HiPI+d[>PQq]YG>g3|p"=iNSU٢Hpe?i1i!}h[YfvrM\M]K>zcEIr[5rJ \(5# h#zl@g ^ѩVM'#= 4a(OԿ^yHԽڸI9Ҍ,G;&lZ{ѺK3oڵߕijp udvٵt9.&i%6]5z5xuu}s:S53.|T-uGWX9bwUK%)m;Yaն*UEU}eϥ1sZ (2@^0s(*Aaڶqk?RX@y8k @|@^ܦi1GI VLYԂzI{nYo>PA;WibLKYs,@Fה[A50\~z蚵)ws= qCj:,Jy,S4J{fQ/W}Yhj1g?{XoY2͢\oJ+K6^k9x^ߠEȓm^7D'{W62PM~<*WOR1җ=m a*pAsnBdo57Rb]*bk]0v;ދ8޹{h9~8',IԴ8e#l~FlIQ/8RfN2Ic@d{E2tzB,3.v/B˔lck'Gƻ>Ksl{N9ڧ9rߴlfYnU'hRtLk6oR<{M}9I]vY?,Ʌ_mni/BOG}J(uw#JpNՙ)g_h[[vB5j q`q-h skAe RǕM}tz:,!;2zwLk7]¬Y> \ߥwKjCu 'xۦ'nSnd7qҵq$*J*e-Z>^Z* TiWh4*ws׽sOti3W4ϻQ۵оGGvD]DDVn6ri7V*WۚV" S5CsBf4͜ḥzaHyT* ӕsk;?fvޅ}3OIGͰStU&vOO{g~Z!_KNp;OR/ 2NR x?Agma =PI=ţjNzN˴me+BthɄ³ 5MC Hh6i6i6^OZF)ǯh{ё]@)0G9JPTQLG0u)q"YjUEMmW;QժjҮDTZ!:%jNU5ҢX㚰b^,VުZܲ -#ˊrFXZ^*Ub ZDՊ5ˢ[ͶE"jV:jܬ¾u0K4ݶl^;a 'Fm;(Pvx` "P0 BVݒ$qL8!/"0ɱ?΅:پLC5dzaPi=ϖ3dr T4C'1T,j[| LtQOs_QkZ9YUH>֘kTF3 kOerCf( ^mI][PcVYzd7 vfR]y%GB2POo@"$jDIC:%֕H0->:1z]]ω?VwM ݹTj(W`IbZ-h]܁T52#~eQccox=m%19Kٴ:?Rt<=Yb=2 8{wac_ByKG)X%&x|ۙJo$+:h¨d43 q20dcr+C. ɛQ2_]Kbb ߴhAyV ~_R:)l&^Cy8@Y%O; (bd^_ޥ #=`6KK:wEƬw<̺clfl rH]*wQǧ#ZU[UR<۝J݉;ZzQͪf"4jnzSo7M+kZEkvmPd #D$B GaZXEێbad=ח؀6$s4<  7 B'.K|< 80Ra`XDpˆ$4bLDc}w/> voGF M7pȟA%\IY+.ֲqua^mFd N?j73--SMp=#ov/q3ɏ{J/L7i}/I_~LfE{?2K-$[rrW?X]lûz$KC$YYƫu$.ՋW_.Bp۽1PwYF!Xr\kɽ}WFrObi L34?mkfȥ+[(x?]09QK%&^3教2scy*3ߗWYyy5,u&ɁAVXz +-⵲Jf0yXZ!n(zۺy迹rR=|~}={=׃A~zgAqzPLzPt:ߢczɳaՃ4 ⿵4C^:S&n_z=(SUe迹rR=|~}=ʾtΤaWXzϘ^i}| yVV^[Y+ Y=(KѨ⿵4C=AU׃*UuՃ*S\nJvG\oU_NYgra1 *zatkQP֯=,N3U j?MDz%$~p_ @dxMVFp k2 ߓÅ$)ȅrDo7."ARk_Vå$)ȥrЉ:E$HJ1"B￟&2dMXo#Hu;Rueܒƚey.{wrJr=5$*ŋ \g i>%z.ó4+>./>.#|xXOu;Xzo1.=5TaifӴϢQ1蟎UAwҹS%cWZzqO,eOY+ a6沧*hn?lZKs흩&;r_OW@_6߼jͫ{Wɻ2bO 40n]qP 5~00q"3xEy;)&&B6jg$HF q HG(#$ik9$[BmԑIۨ#!ɰ )F$Ie$ȁ Rݨ# QGB $"p;1X72_v߻F,Ju0̃|B?(Di z0ЩT6r#3Gy0C'8`"Q(05-Gf= z~F' bz$Ƨ 'R<hʳ#F1h$P6"(Me#q+e#\6"*f#&a6BxMevf#W @i}mb#8}d#=GmЇ6D8Wm`cAmm$W6bf7Aix#77Qy~#8D@0jo#r4đ8ő`2OHADP2NHDYDTHMsl# y@G^DG^ķ:tq㧑jh_-,7LĂ@;:(Ă@;r(x#,qģ B,q#_Ŗ4G<у4G1򑣁&<уO}A&->R֢h=-*x_w \х)ҝ/t?`X Qh|\WDaP<ZWp@؆jCtB6t,qvj]9-tr6 g5w9-(h}HCDy6@R%J`}K󤍵z * H/8x >čiK!5zi\8DH} Ii)R𫅅X *v$ =AX *v*ETRk#8ГThg#p*pNY *v< =AXKw *U"RvHx0*.3AlR~J 3Al2qPgM\=*aLB=-q@ĦTL'&x GŦM[DŽ?ž;7 cգE5Z{YW /!fh9P't+ЭAӏ2-݁P+Ő!}L:ն mthF a "4jNB2aNHW !lE1Z;YW!'!f tj_NZώcƜ%!kcΫƜKݞ Be;t]^B):C "Tu,PĐ /fntw~pb"]R/uJ͓ylv'61x j!5!P:[F㭗Pɚ6 "&dghXKA٢6ZҼj%l2XdIb6Mʥߺ !D-RK(e O^B˜m6lXOo ,=xc8:Q=Z )K 4a('IX 7$C QZ}R^HAX4iڦ&a).ݐEH",H*;e,n{UYxl4g8IjWy9MR8i]CaOZ8ER<]y9A#ĩMZiRi'd8M:),HYk/'h85Iicy9MR<>LrSXY:wNf! HZ;N)Pu&򢚥ځ9=\ UXws[돑TVR\? [!ZYdڝ[nZZ{h1+D+,kBω..#m '-lhMkwti{V]>ZGZl]8iaTwETMwz_q\cYkJŅoE Ӝš=+zlZ,4P i[ҷpNUfߗU$T +1m6P-zC4\R̍*Vj*4;`7븹seEߪ2R~W>3-)[% F/FVלqb*zZpũZiHڸ]┿$q*b:ZpJvqW6.? !NkN*6i~]V˿ !Nul]c NOwqjW6..Nqj"huN{8eop"FSqق׻8+].N$78uI14M}d P"P?Y|pRI1'*]ңn| --w"NU*/WArr؁ 9!TyRu-j -E.T c Dܨ&i).wBNUG]f˨څ*HKQ qzh>V?-A{zTX ѪclYhMRhh^o˭ՕV-֕B&=>[.Z[h!+B+VͰkA[ֵV-ֵBئ>D[.Z[h!O"Ң5bܜ3-NOu\GRtx7BCMG/YB $##&Ddy7'OObnU{}twr9{l6kfW|ˋ~"-M߿VyR_|]dŷOŗ_<滼_%?YtXGϋ>2cO3`>? ~w6+Y\C^_c^X>ԹZ,e`C00K\C^VH34+ 6y!`}$1JŽalqUŽ.aVItVlW%, B'/&[K6%K6BS >f-a1fq]b1τO'ɪ_7B#51G] L,0|Y*ѨŊȲ9mڿﴵĄ|Ń3V-+ Y!Zh7iэ/n -G#VaemlښlBVml6o/Jkkf^LWSeB'ʕaQT*UgBJcTEUBE ܇JLuSڽ57VuhV*W5Xa1+DHɊ5iE Y!ZnaSX΃iImU΃iQ+D6[sEkVe+Bɽе{knvᴄ*[pZ ѪMjlEњUي GkM5|hڋ̡%tEIf^X#}[slW, L2yNoM!%J!BRS957aQfqU¢1/l˺̝ޚ0Yb,qUd ^>[;u66c1/lR譝$l%l{!`Ieom)a1fq]b1τO6+N"&޽vh_&f2vfm|GIƞI*idgN њ&(L!ZG:lv&i.R +ծ2ne]vÌ4&m9em# !N-'Lms2m# !N斓S.Mrm+ s[Y0B iRh[YSœTJZœVJ4V0'`PxMZ "je]q+J}Pɑ|x;QҸQ'*Sy[Y$[YrB`oZY([YqB<VC%q+N.QҸQGų_o\ѵTKڸuz.jhҦѷ0I0-dhz [V%q+ ҂VV%m*}+ Ӛq+ BV56\t+8ne]OT⸕1/lMҿYb,qbfOZY,[YB湾H0K0셀ҧ, lǭ, y!`t?M,ǭ, {O%nJʺmbW-Jk2ЧɞW=~zUmbW̲-s8b+D6i m´մ7u+?N}. _âE-znY}]NU$_ZEݢG*qJI.;3]|ʲr(Nqn98iRΌ)T,TYV.?S!MJ-r88 GqFS)M*-r8=T-T~V.A'`8Udr2C QYsNqI*E(NBg/885ҤE([%5?-AUȑ|xi2GUCy*PɩέnmIZm*PoV&(T*UQB%fa\nD5KRu9!Ttn(T*UQ#P }x-rc%2ۇEլʕl VjX *MjwdEњUъ-1c6^ڪlӂVV-m[f+֤V-dhɽ3wli mUvᴠU&ҦEnhMڪlEBVM5E_֘EnUڋ"ŽLTNWY\(` f޿NWt܄Y⪄a/,>-rlW%, B0Y^;"7a*ÀY⪄ɪ R4Nd9,xƼi[tm(0K\m(0셀ҧݢu Ƽ>>4O/o|:x%LZb.cgֶGjdfϵJ.˂9s9U͙kOJRF얓&9U !N-'B T6g0'`8Ҥ6g0&99#ĩ&C^ќFeܜTKm`N&99ķZ5d<[ќVm.H̵j5ЉH>eRӜFiܜB%T7g(I7g(*PTj`T4n`T j@T4n@T ʥKn`T4n`TpbB^ k\TqsZjh3֤3BĴ^j %qs҂VV-mR}sӚqsBV - %qs҂VVHJߜ&mܜcaj6Wt͙kע8n\L4991/lӿTٜa,qܜaK3,3BL<{!`IAsqsc^4Oeesqs^vn{"O_}Uzܿo0JFM0zOL~vg8zuܧΦUh0ҧyoυfӱ6R;(j(E3JQs(koV"0B "Xjn0"]]B0:;,wX] ̻_aYY9Xڶ}5,|ml@JÑaOpFh|c&kOoNk4.\nmX:om2 g~k666ֆm ^۵aK6X:Xt+OOP q CJ y7\)xEH4jֆ" 6AkCi ]rڰtʭe;\K̑>GP :pOp|JD+ G6OpFh|ڰgeW36VxPfw\6,r|m+:$r±tfp[٬A8f^ BW}ݬBHVxr,;LĂ@ӝݵ$ aknaPNm&eeT%eY(3f7)aPP^KJbAtIi&,ʤJYdT\Uڧ0I x(ZR  9d΁nVE-kik꿯[l AWh2te71h;^L dB9JMyJyhB97MM cR49$M.PUf49MM R]ƃz/&if[d@K]Urn)6P=8 rZ~B1o%{C KWC lg&(k l~WbKn6wYm8 lCe{^@@+֥16' tu 6P>8X/%(7%(+}}K%'9 |Zl)Rtfͣ*c#'GO=0 Qhx\}9+om8 lCգC3:4 $t5 lm :jt@M2:TCP@BWP@,P٤2OڹeeU֤hYƍmn”Mfԝ.} ,6PßNOm8]ߕ6R(ɡXJP0 OP0 b?Y<BCM$G{Ac>o|jE6`vmKƲ|MWfdvUE'dާ晨w~7߼{4/˧_wi+m~駏?O?Tp}Bb1ľ_/^~(Qyuc՞yBw-Ds#?!a5=U뚺G?.KHB2_EG1H I>5OCz[r _ v) .OI~+p߹4jӱvzPET}e'G4VB%uDS[Kj;.tMRj .u>h$ϴ)Yr"Ug@ؔL3uiga3ͰW͙fثLc 32ipmpϋp-Xr X+J=Jǥ>9ʚK4.I|uGVJtUbJJ *a_U¾}#W F\%J7vo*a^*jiӕ&\o3\b_c'4DRONJUͥgzI|eCU+M>tWޚJLɒW nJ ݲg;vK|&\ssKkZI\W ӱ"烫*qBI|eC&=zptUbJJ &]1%JHqӻe!~*2GJ'|x#I dHfx^v}D2&s2gJ[HA _ ˗9SƝ 뇇vp[Zk@x;v+2gjEgA@VFeh}w3Er! +c5kʜ)A['A׭rUv$mHm\v sREUsA78\.tkAㆤqB 7㘔kGZtSEutA 7K3tάu2G* ܌bM5*g(87x'Vq\kN;?BxIrEsܮrby-z+ ! Ⲩϵn1j1c C͈pńXyH@ dh|sϵ璆rE5t P7! h \A Cܚn$.\.(WVC{!2c JC!WVCJC&144>;m;v]hޤW87QڣȐpKjC$? ϔ˦M.ЭP+[!r)fD\CJC4WRCJC24=kvP:[/Aa(ɕAa@ΈfH Lbhih|mM -SpzL $OZpkG͕@:<.m- \zC1ԍϣo:) ]5tܹȐ#R \Ԇ dh|6/3 7tYa@ `>=355afCܝ喯#+ퟐ\k+s Of cH ^ 6:\ɡ3 P`1z54J0` C!PCG54Jaʢjn!23=3s%~V02 35dp!0!-7 ) >`A]‘:B8*0:n2\+i5$weYqJI>XTI{$IqsZIs2$!HHf\)*F- @hr9XTI_ $.ۖ;c$-DEDgLB<"@ ;oE A|]U-;{DEtzA2@:v]')<)*v&]$ OU8v>]')zN 4]iIQH/hQE]H'$)gֵB2TaRq~C$ٿEuuJ* GAZ1$VV- ٚ;tSN=ծejkHi F!ʂ`:~]m+dͰ [s>:[QJ[0*鱶&˲$G'߯gi .%]z,4۞枽/xO$zqIPv^DK*CDT͝{WUhIUT$HUM(W"ђP Usئԫ#*UI:U0 RJʫUhIUeH9̲=:T 'Q̕ps*U0 Qe Jq^~C*) S+c*UW|UJTpzU4U R5wΖUWU:T$HUE)׫|UBH^+nBu]"+0$=$o"\%GҭO@6 y)䉧cza{Yy$RHC'OEfa{,O=xxr#@Z:x:eyjFW A tt?,S0(rϲ< SI ]IgOOs9RWY?շ_BI'$)rb)'R5G,U REj+fVEUP U 4~ZUYhQUeBH*қOJ3ӫUhQUdHRhz?,UsT!R1h?-[2Mu+Hn4ՄQ-C16O++˖V-"z=M꠷EEuQ-K1&Ok+˖V-"{;ȇz[$[T[G-rime٢ʲ>  {SMKa?-KH庢pQuȪYrd?,a!\T`Y0$,med?ZX.Ẑuc²pQe XߣH =R Eva,H_#,x a3dZaQZa0 f)K#,*,GpjN1g Tb7I;bcInM+SN{̶vԱ;q&bv8⭥] [ӯ[չ$Gc`dnmlIm؂P-&dKj렴 [v?@odKj+Jlm6}Tg m$Yҵp;9( e"Lm dآܯpȳ [oZ7.m- l]euRڂQ-a:nW k+lUEݔܺU6_[g-rrh6_[Yyg.w;]$ ܉fޮe7dN4A iV9 {@SG!t)gaOD L;9YrOTR rg OB*R 䩢'=9 ='n hgN4\-z?߉K$Hmɧo hQS !AHW^:PUU^ #AZJ;9ZTUYhgUEUu "!RxgV5G*KBzA(4iG:Ce;wiҥlQ]);s)- UR |lA(iP3"٢:m(VE1V3٢ʲ [swŸ/llQmնPdN3٢ʲ> n %lho1\T]'2|'S a-`gE% cAB/_ w0aQja0 fr3  aow;(\Tat a%X`geo<X01h$,U^) gO%6"mQQNGw5 ~*NE.FS *OGK_RWI6+ү(VM1F'"ْʱ [w*d+ɖ֭l{--[ 0G [IJ[0 e =ɖV-ښ wƹz%ўht-;`O [e{- <[ e=ø$l]eu>DQ*nfe AA|/襁=D'ٺk Pd0N'ۢ|meBP~Ϲ 4OO ˍ?{{q=>xO@)HS1Ӝ,9c'y}uHˊNE-+:>IJ0dRL egJ+ln[kj[4[T[-r=llQmeقPй/@Z[G--l5c=llQmeقPl6uHDT\ U׉ %O,/ (&{i}e aUv6'VY-, UY- fA 4ɞ@ZaYB²a,HX]m'V{DŽE c0 =wsp90$w~ \U^),U^) gA'Ta9Bra d:n#-p?_l,NM;re8,go|g,]G,8#>lN @lWv [0 QL#mlIm؂P-{Gv [IJ[0 e(w`[$[R[9 Tbks~x);g4Zv8dd FAl1~C-}}]^|Kd*YBC=#G)1=O01.ڙ#F ȒIg>GhYbfd^k42W$ֻf=9n6__o>L55/~ֹ{[wmu=4|nkӸ?}/ͰmEWo~# >Fm^0uO'mesa/E([]anjhׯbFOMSn?=H|ur x2@AB3}^iNF.DOm d$a=U*Os2r!(Jݹ7JORur*D]pnJ9fPUm(0u!+N UJCTTiW]* U]*D%܋+N UJCz'(MN܎zڼڄs?"UȆ`YH0aV:ʖφJKeBQBnjsnLj^mlvHen¬uX*[>-- E is{Z/%ڗ"Q^bYT|6T[*[п?7)feO"+B !aX#$͜K%,CƱ(aUunWYk¢pŽh%au^*a!00E }RaJEPXh%n_*a!Y#cQBw?wn]z3`BaQ8VaRa4+>z{SX+9v朻0wyU2ɩ zgB.S Uwmƥ 3_E]%0UE%]0n4D6RZ[vu?lwm\[ m%Hm*E[C%13,זƖFjKcB[7U thl\\=Օ#յ+|OY:tN\_*a")00<oΑ7]]sbziv>sskצnGEj"4u%saŠ([)Rm m]ekPhFQmޖזluu|mK{TE#o dvTv{ݾy1:Lzh1x[iB&{ q 4Km3U"<5U%!OHDEO*K4mbH*ْO~[ U.PSRŐUFvӐ]i7bU>BET|ϱ+N UJCT|ZmWh[T+Wő(UVRh[ *K4TU*U 靠49UC*HJο?E ՕQ,ErcmT|6TZ*[%f%tkծܖȆjkWnDQ:mT|6T[*[%:vZimmlHeko 峡R٢Pelվwׯö@Z\14pb4yfax%HNl ¡S X0˟Ul v,Cv,F(aVrL-VJX*L%cQ|_H+Ls¢p;'fQœ ɶշa!Y#cQ|wGŶUmKEXmK,JX'9Nn ,UFX*L#c}+8mNAU3TbwEX]XY,o6 A9Mw/f+6NF1g|oPC6([4e$-Ԗ_3|oO r8R]—{E g7xa")00<o͔6鷗́'lt%;\29@=ieEodv!tew֘zZ6([W:ڢQ.toKfkKeAQzUvhek0m|ml1(?|;o8˕c`s|N>^ɷgh Dy2Ң񴧶p"D(O'ȓ=u'Dyj^7 U]\!QdW> @* UV"Qdc>@K4TU*U R%zy UhUq$JU#)9@DCURŐ Jnԉ}kls)]ʆJ?CR(V+1mlT(eKt-- E{? mlHc$7h[>-- ^`r#~m{;bcЈb8T]1 0(a -,CƱ(at7psCv,F(aXbs¡ S X0׷fVPAxJϢcZXǾxX0ahpsc-FSۓm/9yg>z <3,)W3|wD34}~F1Jb|[%آP-15-@JzUhFQjmKd#EČ-כ_0pv<Do D8R`*a+y>ޜ#|_o~{ xHײ%FQ-{;-E5C3A|m m(Vax[%󵥲Š([Ἶ?uu5-@ٺֱE1*Xx[%󵥲ŠIܛ5"4?7]]'G!eL(Or >WyW.D(O䩑AN'*aa8}+'Dyr/ OG˞OdO I'0Ŀr*OKH#OGfa*O4HG'0Ŀr*O譀،iuo $m`DhD3 6E(U%խ*Uh)WbH*ٕ}-VVGCUUH*٘O9vکT]RbH*ћCJ3m B4TUw8IҪRDCURŐ JS%:ö@ZVr%*dCu%g,CQ:q@ZY*[>*-- Ez7jWnKdC+E([x[ -- Ֆ"l*tm5ج5Yb[2}-E23imllT({q9[zmb4KCu3 Ų(aVrL-֗JX L%cQB/߹I ; ¡ ; Y0'9.H+L%,CƱ(aoŶ@ZarC&9a4IMu a{? -*l[(,*l[(gQRip48ַfO*1qSX]XY,o:c$;;}:}E۪7([Iv!D-EٲږFjKcB/[ǟǠ́K0+ GkWrϳS#θćtBrg'$W H OYRLwfhW陈Jsa#g"lufwx[2;_Z*[ {H Pu(E([C1oKfkKeA1jѻ~[@;|m m(ʖ0m|ml1(?μ?~yN>X=4V @;K4TU*U R%{it`Uh(J烅whUhT;AMZѡ?q iҥl:*EQzږφJKeBQD>iKdC+E[M%1mlT(e+tM=llŶXe ж|6T[*[п7ݼ pb@yM{(aXbg¡S X˻n}3 ¡ ; YVr:bg¡ S Xw', *lY0E %;}Ʊ(ac%,*l[(gŧH]%9F ܼ ;Bu*~5wӱ; C0@4UKh[")-- nelTEu Օ#ugQšewD8R`*a+y{cz-F +6+|gI68tOW%s`SEW۪|G?~š~o Ck(Va 'ےRbP-[i-l]ekPhF1*XxO%󵥲Š([wé[xOuc-E٪#L dvTs;snygvZ<@S'p;NNڥO ʘ*Q {iT/\^Q܋'S+!Vο'*'0r_/M 塪6((%\)9_bx>-M*jہ캪!XU(V URܕ6JjUJBT5m6jPEUWH@)JUR5GJ !}I(MNU)nODmճd]f6A e(VO17*Ke+fJKe B!zpmLo7jPndjPn DA ńallQmlA(Ȗ]0'l5Yr[$[T[r[ (ƍ>Ke+fjKe B$oMVuI?]4\T]w K eA hYiN\Y A8-xzV7.@\SC FHDUt<b*:?Ħ FH{r9ZԔT!$H!nŪbv U REq;<|X.3?X9%i-29`P/ ;&KiUX.Rg0 rf${7UΖt;h3 9 h&7u+veu+v gX3%]Vg*g+ 9g_>H~MI'riI(OzH|,^_YKg8 V.&, %,~z-ql n{֣ n{Vx⊒ UK?f[$:wlS U=DJ [ۻsD[g|Fv'<0 e&p[4;_Z*[ {͸2$"ldkTh FA-זlŎ֏_2""ldk\h FA<8nfkKe AE[o= V~ قkٲkV) 8Lklu؜luO[=yP~27[bN*[ e9dv 4 m [cƁVhl(V1>w-`rCgq$\04.z@&މΘYs\nA#l5Ja :zo&BX UN% bA:sas”$p콭.JME^NfJ"Ԭ>PO$]0%.gdhJ9{ g1]TfJg r:01V(wFEuv8a\vgA,L Ahn.;:;*0YA}vA,L }E@IP3o1LrJ;wI9 q2h-bSjh6/4kcj;+4D9w4ږxQ)a4Hy&0ZC6/ TNYNr%^R\ AȓAӾP˪mW 񓎻#4oG'}?BI]nFy2~+x+7ocv0 rrn6htIA0 Y0mrC:q,yK! v ҷt ql6hl-d<[rgVC-ز5Ǹ~זJߺ4R]7:60 f9m9h|!,H黶kǭ{nv* a ܮF WN‚-=~0~KʽuBa7 ; Ys|nA#+L' aŞS{Za/HOG95yx?A"{TN m*DA:k:ş:lْ[8l!(VdKncbV2+P+m(ȖyزcCb뤴eW6nᤴ [cyHlPr+Bi @AiCb무ծ,"lYi @A<zV6nzI0>g0.ĝDWEG-6k DEG'Ƃl!pQC af;iTbv*a sa;i) S CXxm|\X U^% bA 8VR.00pڜ0O <%F/c$]Tct~ɕ0șw*S:2S:`3Ӡjg$]Tg39CZgJg1]TgJg rF~oX6[MQጦp g yHL,L }E@!>LCZh'2N~DxQ8D[Ci\֚R/*66h9 W䑝 m,^Tmg6i3ڔږxQ)a4H}&d!\U[P A'd捸N/{)ӆ m pjkjki6I"P< t?EJu( [ctז/P2^ xp*{Vx/P`$qo> CXw?Gƅ'&&<_aRa0 9lj7 |!,H_~f&&<_aRa0 8'7 |!S|O]-P 6>&Ved(DAzY[pBl`prd>l9i͇[ pn>dsL'|(n>PczCpzI0!KK1:hlv-\v,Hoo=l>E R‚7V [EX'|(6*L) aAX_? ي6pa1\Ta{0 śpQ)!Wzhw憐m>|MjNM g ͇g1]TfJg rF;}gqG쌤q g-C.339]sB6`g$]TgG3987 tQ]`*STBC˲rO0O@0cXؒppȀ xG=]}!?NVwnG>5_X *loƱ(a Fu0 Cfư(a/F{0 ¡ {0 XZsfv *(a6%LuUqm]j۽~QD:Tcػ WF(gNщΦť(Lu8ڱřH`qF(g^FՑMPQ0ʙ] #[MLCuv8#aA^gFgS:TgFgZU?07vӗ_?gxNbxzh$?pךQ[ͨQ99=pW٠MCv6hiZنüڌb_MyMrralbN]nB8L_q?E,;f].nl'\8 FD37"Hgt^d;aJj|#"ÙHG挂Q♠o/6"8gtxѠ߈p&ґ:9`Ѹ?@/ꍈ;o8cCo E k5ûdx"Fa OMQ6B [++fQ: .D000E nxI [++f1B95 !L+&aMy~6﫻w17^jzq)naTz}-( JBLeҘNLm%e~Ej4&h+,G.0"P-l*0af떍\fAQƔbbnh\.(l]£luӈ]V\Pغlqbbnі[.(l]{-J`}[ *]. q[lJ\څY/E 4¡(aQtGurbQa{)IŢ~7:Q-00E S}8vn4_já {X09܅XTQ-00Zpڔ0ݏ_G>B,JL6՘a2F9.ĢʌΦť(Lu~t[LCuv8#aAڅXԙٔՙck˭hq&ҡ:;Z0YAAB,lJ茂 r&{ԧ]EĘ$xNbzh֤RB,jͨ-Cf(m* AlF(mNޅXTQ[ͨQę 69OjPɡ~ROyM.M[۴q4J8LqbYm|m*}6Fi .Zٴxl87%U|0}xSIJě"Npo|c/q8}J;GRJ|/oO EF9ߋ ӗ"Hg4rVk"2tl(, `{y:Rg\g(aߕEdC Qâ鎾+^U$bQtS? A{nP1,J\h/á {XVsjx/"C-00ZpR3/""tt(F94{Φť(Lua"hg" cBlJ茂Qdߖ ֙Lhp(g^D)33 FRcNm;.c{OXzpjC6Ug4J[$?ۅX<iCq6 uE!dXX>ۛm퍧qJ6Zټxl8?)$#m?*6EBCM#)$|@^^ `y4dɂx?GQ(}1*VF$:ߋwm%E5l6ӿ7ǿ_8~}oeӲ//swo/u;?˪ n F~٬~+"hVse5ĦoόKvUNOǞ A i`:-3)T]/Il^%8ìh'ѤJ''M#F8iL!t6Mh'mg#JaN+[44LO{-@ǿlGPeu3EWuaV~H9KO=2cL WƲ8cndx)vNc 2V3,6U[u4chgԠf5K33&33ư8c j. MSU/j&XÛF8oFjmcszм9q4Λ<ӻ|['vo*썦QB 9xuG㼉3|/lyۚ4Gg]iT3mGrx}n͟{,按3Be 6]ٕslrݥaZ:4a&ґAI`xF8/7E&8ii:2i/x'դ/Mtd|('-5m&HiI:2i;4I5iKi"44 : BN &ήǟ(Mp͢55pi`Lb4ư8c,P?[4 jfq* ҄ ϘS@;*g&c kpӟi4rWJ~QFW4 .ML/#jN+[SWp5N]=bt@p8ufuՊ3vYDK&6kGB&&!bqb?YD;]áiaqn?0 +9alfl2F8cz l4v fiaq?mW0UЌݹQ,Θ^A&sC34ưN3֩=?4.MC&?_0D:4eÝ0NZIA&9sJӡAsJ`4fm-ythvi$4ԥtҜthҜ('Mbi"GH&mF8i&u4NSڜMS{+@}V<jt2%aMCv'q:D:mNo177y'ꪤ4MCvtxiABRH-C(o<ӻxQHM^gxhM㼕U&w>o1{]8op-J7{Sؼmh-hT'KKyyh_ Ґ&N ΟKwI^|lԻ9N2F@]6^I?6T 4 UY C(8iiz9T8i&@a&ґII`xR V %Ȥh'mФ/Ptd|(~璹F;3B(OCZx΅fqJ  =iaq⹠0vg&iLO_-C<r߈&+JܾA8c pi`Lb4ư8c,P7E3g&c 3OiQt*Mpn3vYV4a0&33ư{?m37_=}uN.M??-l![}p3eDqz) Ht}3}kxE:䔲*ʅ+P8u(NWUiN%KSWdXySt 4z +ʩ@qjiei"utj +pt"PFs:YHt}p +@6U2&_4qJ5#OJF8cz[Ʈj4ư8cz UHgl26C3uX1ޏwsC34ư(cǻJ9;1K~Ti"1k84cNc tYcjϟ~y,MC&⿠th ;#aI.Ms6CF8ij;ZHФIYЬe쉆kciABRH-C(o<mD:oG7፦qJD:oNo177y(w4ΛyKy9o-hT&nޕxuGu-J7{SؼmhѨR&-cѾ!-Η:q3p['N$;.%a΀eӬ(.+|Jzw^ax^!t-^ %P R  4LOu0υ $Y 37BRUH/ +g^ggQmKNW<\_ՉMx)Tu{B8cAJ:a0ư8cDP7}7g&c k^-?P%m:-ecgsqoVkМ tU.At6g]Rs0 .AtUϺ]Asj:aU]UkNV' cu @qAWoNt(NW9Z0 .Z`hNqF TCháW!{33ؐ5ZgL9Ţ zoA k84cNc 37.TЌݹQ,Θ^N]áscXo'{cvP{ ͱ1MlWlv'֤NР9Q0NϿENd:4i;4Ik5ëis:4iNi&&LX U'hi"G AڜMS{+@+<4mǪ{J<4kq%{]YtoUQhTCT' b<4nNo&Om?~9`U'Xo*MU5 ͛GA?7͛h֨NxuG㼉3|Nt<6o[7?x :M\>ޓ] ?4},K9c0|&s ]I5i"44 Ig5m%HiI:2i/h%,4ii"44 _?}4Ƒa1s]"K^g3eǟyDq*ТA=Ω@#+Bh_AE=t]v5Vq.s?׬xc]{kgsUˏ=Aԃ` 5P7-cۭI>JK1h'ԤF+'M#Fqf'5U7~܄vm\g7yk`2&Q9FA}DvN]J߳t-PE{mmPZ+cr zB8c53(UϘ ϗ-g:6ehŮJ5vYA^0cX!V]/Mp5vY^Jxi`Lkgaͭ#0w<"KJ6v*{XkaDqJi-ָ`E8]ճ.FWМntEAtϺ]t҄AWg\0"PVszti 7.Mt(NWTB&x]l>] iN@& qi @lKN5@KZ8t "WʢBJxi`Nc 3zj0&xcs8Tc{14(KcpƜgLul.4á{pXZzxi`՘z#8Y٨PV#6+Un$0NZI_0HӡBsJ`4ӌ$4AKPȏ/?TnΘ8#شZ_H]\Y']FI ME 4O㤉3B%HiI:Ri/h'Ҥ/Jt|(& 4tеqdQ^~f`Q⑻&&QZsJtQ KdEtӵBSU7_AظVxfqZ ϗ-݅0HA|hgӠ^0cXuS ^݅kl5Fc(4(c2<_c>c kn-CkG?G~=}1^8q>Sh>SzQbBe}PJs:9::uu+pt"PUkN/']SW2 St5Ϻ]L N>]lN>] 5WN]3r"PNsj(:;u+ pv"P^s(zլl/l<{.Z`ڜPqe^H|ElSp)Ԣ"Q,ΘnōiNc 3zz* k7C5XAZHki՘〈m70(á{pXFJ(֘-11Fpb֘/_%"3ᒐQ&ҡ*3 wF8iQ(֙SڜS㤩"&ҡJ;x0NZIA/J6CF(iVsvHP=H'Ԥ^/J6CF P&NMeQ"->5I `O4TO*Eڜޖxܜ8M.ǃUbQ"ÛF8oF5ɢDZoNoK/||=RJ|i /?64Ah'MƩIxiC-Mh酠IZH^$z3oM0~(N8#u?~_ .AJsϠ%H]$hN@% Dv|aZN-;u384fqƢ ϗ-K%7. jfqz *u 111E?^~%8cw;[,XA .a0&53ư |=el`] l k-(NWPX[6 G.骟u1)8oE8].FWԜ ]0誌]iN@% q] @qziu ָ.aE(];|%']Ѹ.aE^ Lvhvx{[,к64]'8c޴K¡iaqTo.A[¡{q,XA%.a0v jiaqT?MB91k5(cpƜN6ϟ[x¦dWӡ*OI4)is:ThNizn%hi"G &5AڜUS+7SC4U!q*M*u 944 Vc<tʹώKc 3uq/ Z݅kd5F(c]A^0cXۿ)U2rg.<_cg14(c2<_c>c kn-> ŗbx.p/\d*3/ *ˈt՚SiDѩZxSt5Ϻ]9*3N]u1:ͩrDUl,l<ɩ@qzirDSW kx{tr9"uvV66E8]r9"ީ_XxN]Y];+rDK-G|moKo+AIaB|.0cr>'pNSu4QCr'N=HK.-bա+$; jEE8]芄AWOt-P0Ȋ+WEqDtE Kd˧@[.mH|euު,XA^0cXj"v" jfqJ j 111[b|} " jfqƂ טÚ[zqþZV$~FV3 k-(NW95:oUg }芚Ӡ3]qߠ@q[]z BC͎ezfflA6gpۉc^yMyG)ު+9U+=wϯwO?wo~eՄ>_>^o}?ZC|⏲j7\0v˺49K>~9yCtBsӬz5g#ʩ@qJiӯ:tݲg8t1(NW9u}tꚳgE^ L49ekwIN#O1~HX05huc[81k6fl2C3wXV%l̘-11.n,a1؃t_ڍ=4v fia.klP”.{,th. p(iuIDNiK:4hNi&w*Lle4M#q*M&f收CF8ir4rvHФ=H'֤f"mgNiK:4iNiYiPu)jkG;v_Rd<4k?qZf֦qszh7y"hTET<4og7y5Q[[鍣qҌϋaki}byh)4jQ[{[鍣q.w}^[%Mc7{i_ RwO{4Q zOk6,Fy"gI)9Wt!LkN^KJs0(NW9ݍӬ͖OOtAvU1N~m^u%zaE8]7ΰ6]>]";?]>]PuOЮM+OEqznnm|Dv~|$+n?ǃgd(Zc + ͢5 hucX7e;j.+MB9wc"b}Y;+3 F8oF I"6GA=ުUto*M *D:oNo177Fy頝?Ut~֛M^g4[QeR-cq4Λ8#,Enfo:Odbm|b<6o>o[AI뛪W{[b|lg9_1x>/cFUhh_ 0Dzgzz^a4q^.TQ"6JK1¬h'Ӥ&ґII`xRE)Ti~Vii:2i4I4TՉIIȤQ0{<-)! ~U,P܏1=pki<2kGaϪ~FupQVxY|QpsO1hg,h( dx~|g, -Z݅gl5F8cFa0&33ư|u/T-Q|+9]\;b(NW9= 0ꍽ.u1^A`t(JWY] UiN( Jc @qh 6( ֜Qt5Az-0˴M(njG2Z8,~*@5 [8;1,Θ;GP7C3wX1O-11S|[Qb84cc2VT5 [84cNc n6_Y(thd#}rdq*MjAڒ S㤩oMB5 ZH&F8i&FaCF8ijߝ(hi"G 㤵45 %44 VrJ0ܱI\>bW4[Q%Q0xи9q4Λ<Ta?FzSмh-5 ͛GA=(Xo*7Y`4[QQxr7yg=pFzSؼh~jd>yȸ۟{{ݜ1qFX~eR$=; ]Ik5īi"44 IgP'-MG&U 4LOA NҒtdfi4VAHG&'}#su為(bA=qĮnǟ nߠYJ4a0&sOqpcXx=&8cw;Y,XA%\0cXx 膺z*Mp3vYV4a0&33ư{i|=B/4iQ:B>[_/ӥeCqz l$>]l>] 5<"t_+9l$ rj3N]U>btUSDU46E8]As,M$^9u&3r"PZsZYHtڕ&3ќN&]&3|t"Pjg,ė*Me#OJ3F8cznj4ư8czo UHgl2C3wX1OwvpC34ư(c𧻹{p[¡{pX1A&sC34ưN5D:diQ&ҡ)gq҂&u4ΙSڒ S㤩H6[k#MCvH#aF]H')mI&)q?W[!MCvtHcaNJ]H')mI&)>+MfnD:j'q4^dxhN2Lõ4۠Q!)MqszhN(P&y;۽xhvoB]o $Y 㤕 4LOӟd0.oĂ 'Fx  * =iaq⹠ ԡ hgѠ( dx~|g,ꧯ hgӠ.P1"#poU El..=b(Nנ90誌.E)YԜ6 `E8]ճ.FWМ-PtAt՚Ӡ X0"PFsz@a ]j΀( c @5~g@GZ8􁈬btU@pjVo:u+MgE^ LkNJ/U86<*M,F~ncwCâzkUHgl2C3wX1OwvpC34ưӛBC{ˮֵEepS 䮖SۉcnN ))OIȵ8{ε pqۘp܅xoqMn_gw~5'?/M]RϮm^צ~ϿMJ/~z?*~=v?/nH۟_Ϸo$X?X/WA ׍SkijE]\Aem ٧"KFL{7X'-jRٓƜ9Р9Q0NZ#Ie]IUl6&&ҡI;x0NZI'6CF8i$U}%ŲژGH&F8iIbO 6CFP IJv)jv%򿢬xh.h6y+5P['5)77y7&5#NU[ǵÛF8oAubszyszh7y;HEq;E:>{Sм]hfo45* s͛GMwPw2m.FoxlVoը8NoNoS<6o>o ˭?4:v q|lv?p9NZ]Ҭκb׎:5'ҧ?{ÌFIkBڦyn& U,=WU 㤕TIi}|D:2i>i6BSuC>iY:2i4I v}|D:2i>iLsiibnǜvjk(N`5rꞡc`߹,XԠ8iL4ư8cӽ ƶMTe]jl⌵Ԏ6c>c2c 36vU]uڌ;[,XҠrcXs>7 .PáscX'7۩s~*@ڛ]OLv>@0NZI/PР9Q0N:a_*PD:4i4I4 ic:4iNiM ZH&F(iФ/PФ9Q7]\LP_](>@ЬbhqAUGA,cE(Xo*M͛GA; 7͛,hѨ(PMr7ywq,Pt<6o{7?l~NZYX.~g{d?7§?z{so܃enΘ#:UX.?̎2+zܥa(4) 4 O㤉;B$Vxi6KG&S4I4) 4LO㤉A57` R,Y ՚T 4LO獧Wgbԡ.oĂJJyfq j҄ =iaqƦ@lbglu҄ ϘMjCgl͢4a0&33ư彏7O~іٷ4*4Q&J|a@?_^&TΗ4Z ]Gn G. Ϻ]椩U8uj3N]u1 u]'1yKtSNN]ɰ /Ӝz*M,tEaN]ӕ4'NN]qd|N]49]U8}e(M,|a5#OJF8cQXiaq>FazuáۻQ,XР$JsC34ư8c?6݃؃E *Eib9cNcphƜki9Z{ib9dr5LCS&qZM43144 ISg8Hƭc#MCvH#aIA&6CF(iA=D:4iG4I+5)rҜthҜ(- C^XI,c]T<4k'=`m44T9Mи9q4ΛPת4ÛF8oQ*M,m鍣q r?MC&Yo4jTPw>oS<獣q=&Vmoy۽4[Ҩ$Kk6c RyMaW'VN@f=w9_ 8}_,ץfx#l>P/0N/ux6K?*Ph'-hR i"44 I7Oo Y:2i4IAHG&'w.5z#uoĂ 5ڭ ;k5( 1{M^.Pp;Y,XҠ.P1,X]@[gl5F8cE@a0&33ưEG`/^׏TU(P<|l.E>'h#uFŠ8].FWԜmtFAt5Ϻ]Th 2( Ӝ( @aE8]Is@a ]Ӣ X0"P&F۔^ TxhW¡",XA.Pá〈} @áۻQ,XA%\0C34ư8c?B ؃5=11Zp{:_k(ٵthd|gdq:MjAژ S㤩3;KB ZH&F(imI/PФ9Q0N8W?xҡI;ڥ0NZI%^0HӡIsJ`o(IC+P<Ьb#hqj Dm鍣qč*c`y;;4[Q-Q0xyszh7q;.,PT<4oziN"Q0x>o&8X`xlvo4M *e_x~ub=|_ ?`Y3&c:ʮCyܥaJ^0HȠQ0N#)\ ґI,qjMj҄AHG&'qE 2Xi6KG&`F8i&E4a&ґII`Y{A#TxWg7§(Mp 4Kc2<1KEx~NVc42 pi`LggaqƦ[@W4[gl5F8cpi`Lgga{oLK뿪ghti-ia+rtib@|QZs*::uU+pt"PhN-©+ocNcphƜgLfJ11k5(|ƜЌ91ׂfsSib>dr%LCS&qҒ&%]ϙSژ S̟ɸu,;xthi$VjRKIsJӡIsJ`4ym|Ҏi2C M 414144 F4y ڡ>&vؗ(k2Xh6yg9Mи9q4Λ@QMCvvxiVҬ417)77yPEib>ory7yKJw>oS<獣Q*qGEib1o{7qJ 46o>oS<6o>o 7qS:_bįN\_f=w9_ 8}_xzٸfE@q;痍7ҧ?*PI/PfP R EMJx M#F8i⦐B V ґI;0Юj5UBa==[{v߶tM.,:q{ZBU'-434( 111E Ӎ vSPu3jfqJ pu`LggaqƦ[@ T-3vYA N1hqV|@[[b-(NWԜt.At5Ϻ]D `].u14hu 1V' ˿Ӣ X0"PRqb{6 g.4D]:aE^ Lv Չ#@ E#v8c`?R0CG{1SgTpu66C3XF"\0C34ư8c?lB ؃u {84cNc d7fkyo/4ǪGlcv528b0JZ,4īic:4hNi&M9lJB ZH&F8i&%:a6CF8i[4M#qjMxu mL&)tBCώeaQ f{'F^DZ'0|QQQU-r0`\ةVWw]Wl7?^Z޿vs~^uմӿPկ?Vnw!tF/V}-(_%h''{[QaFuo<荣qނ@FTSF T\b[o1Vg g Utu3ih5g#p4"Pk7[Uu3TF]5"tL NF]s6 '.5zZu31"PFq.yM-yMt9q#gXѨkFQz+0]VW8}5}k<#(ҿ|-S!bqtc_OunPko4ư8cF:-PM(gL<FcpƌgLuu3l4a؃ 4_lԘ-11NpBؠqcvvF4^Rb:Te؇F8`ZDFiK:ThFiz~7E`&ҡJ;X0NӤi(oufFiK:TiFi-EH*hF8i^DόҖtҌ({)W},JvاqԒZ;kiQC(V[荣q䉠&YHlz;4۠Q.YH-CfoC%O|/%z7՛g4[Qu(qwWnr7yge[,J۾؛m_썧qޜF(Vo6o177 YoUm۫u{S$%X=/ s8}^x~}f eH?64Ah'MB׻_ %PK4I i"44 nxR[B&NFv ʘEqͩѥ]"; .Y2x.h]/M٭|}KYhg֠/McXx誮 ]xNhgi/McX_Ǿ&8cw;Y1A^(0&5f3ư1?7ԗzW+#6#Z8]Aszt @W_P@q]Ast @PP@QEVXuݲg8t1(NW954Q.\(E8]NsZti@W[4Q@qZD._4Q@xřvYGltv-+Xc_~Zg& ¡haqto?MAK%~-& ¡3cX1ϳm,C5`1Ʊ(cҠ^(0v jhaܬT?^Kجj:Ter,qMD%*44 IS=g$ ZH*`F8i&9|i@ڒUQ㤩?Lߔ-MD:TiG4I4i& -PQVty[xĆZ;aGlXy5&& x܌8MZWMCv6xi(O,MxPq4Λ<tn&Xo*79ziF4Q-c6o&74AzX틽4Gfm5jKϾ]{zxK{,按3E%IsK. uTD:Rh6i&ixQ#X Ei"44 3m<uӷ FvE EQ|9](%sp0"Pgwn+hQ ױǠYFxQ ϗvڑ%8cw;YVjxQ טο^.-Jp5v.5F8cyxQ טZZZ|[G~=u]E+3'XP&BW_DѦ떍<ѦAq]USDWeUou텍ghE L)δ,J$Ԣyl)_K8jQbf(gL7Fgo4v Z{1ӽ}_E&cK8Tc{14O6:-11E ßq&L-Jb8Tcc3VkSi¡3cX'd>(?Ua3IsDZgFiK:ThFiz0E`&ҡJ;X0N$%J3J[ҡJ3J`4h&ҡJ;Z0NZФZ/JfCfF P&Ou;oENb\dڕfԷ *E_+9Otڕg8u(NWhʨ˯ou+ Ѩ@.ל^-G$rħ|‘P3ư8c߮6:{[81,ʘ׽}ת刴&cK8Tc{14C6:-114m4aj97C5`2F8cZHkh՘z'8!kL刴 Q&ҡ*s3 wF8i^j֙QڒQɞ?T,ji2A MrDZiFiK:TiFi&Q["MCvH#aA^H+(mI*(>'q9"-4W2dy ǵ)&7 )#P9u7E1pnuv/3 (. ~m|Dv~|\8uY]j\8MU6]$;?].4rڵ"PgN,UneE|w*,fqƢTMϘ Ϗ53߾}\]ʦ u6c'hgՠvn`>c2c 3͠|\^bYv jfqz 3hucXjZ 'u=EY_üuɕlh7IP9_F+hwu]G)yStϺ]8uM3|p"P.Ə} gE9zqa}a2ž~63wáۻQ,Θ^㸹ll`k84cNc 37n|c\ph\(gL/`cƜƮЌ91ׂf=?&nR&ҡ)'0 5T6CF8ij/e[k#MCvH#aNH̜thҜ('M GH&Fi(4I[SڜMS{#@]V<4E؄oiY`m4VjT?65%77y'v1=tK>og7፦qj&C8otO~MCv4[QaBmmNoK<獣qa݅~ku$[xlfo]lN>] jNUDKOxN]iN-SWOxSte"+6Sz%0MNWU(P/UÑPUEX1؏% nNcphwcX1ۏmuuáۻQ,Θ^CvpC34ư8czo6KBph\(gL/]PUtƜƮЌ91ׂf=k]HLF)Д[ wF8i&E]H)mN)q_O7ZvHФoݢ q3o{$՛y5Uyy[yyh_ R 6pw F&N1yo "n6W<6yaʼnǞ A0yqҖB]ƾUQ"6|fcY0NZIQ%n''M#F8iI];^4q;i$Y EMTuv|D:2i>iL9ia vLvM<2kGawUDZըQc 326W@ Mx~Vc43VjP & dx~||y4\{ge1_4FKFݻfR&&T֗ 5-Dѩ\ G.Ϻ]T*P8u(NWiN-KSWdxStei"ҩ+46StBs:YHt&3+hN/KN]Ja>8uWdu3vYDK&NòMÑPEX1OnlNcphwcX1W*M3wáۻQ,Θ^ǻEvpC34ư8cz6K*Mph\(gL/MTtƜƮЌ91ׂf=Ki"2y4ath ;#a^z]H)mN)QJwɸoK<6o>o+AIa'nN|i2\\Mܝza΀照/_X/Pˏ ( 㤉B]VM(HiIz9TF8iQz@a&ґII`4qRhc V %Ȥh'դ/Ptd|(~璹F[-gX F@{B8cUp`L4ư(cr.hЎ*@ jfqƂE@a0&33ư8cYn@ jfq*  ϘÚ/=./? PUm@][N"vψtEͩFAWmlt(NWjND]0"PYל-Pt5AtBsZ@a ]$~!Pu3](Ԝ( @aE^ Lm4 5ڵp腈<`5 cphwcX1we (xcs84c{1k4( k84cNc 36.TЌݹQ,XA-\0C34ư^ NlT{kͱvov52xaФ( thМ('M]1ݗ 4M!qJMAڜMSצּ 4M#qjMx mN&)Fnjcz<4k'q1hqjGAߍ_(Xo*Mu͛G㼉] Q xhd(omQ=Q0x[>o& p@zSؼh#s-5*œ:}zCC:A~3&/Ǿu+K8i&xi M#F8ixi#,qM xi M#F8itUd)-IG&`F8i&xi M#F:.Xwvuv+|o,XWhPKc2<1[Mco *Mpn3v9kBCͮEP G qwlGjy?}~&QȪ#U _^ xn/ן}o޿~yє]jſji^~/?]e/_{-8?~mp~Ҡn3|؝v?? =z0ư8c MU USl5v{e4F8c3(͘Ϙ Ϙsb>} /*ľd5]ͺʪ/  Ͻ!̨TΗj5g_u]G)yStuϺ]\R*l .Ϻ]М~4NN]S6 '.*5'^Sה<+./~]٧떍<٧AqjͩN\kFSz-0mVW#8mQ\Oek8#(ҿf|p)ֻ #YADmlNcphwcXVWolCebq: 7 4v fiaqzjK\ph\(g,jui7-11Fp{~[6vݗO"2M>H'Ԥz$mld944 I;[5e [k#MCvH#aZʑ9Ф9Q0Nx]iB=D:4iG4I ԍ)mN&)>+M.6eQmh"ƚfB{B4[QqBmmjNoK<4nNo&O}Q_WjXy;;4[ԨzBmmlNoK<4oNoV0o~cyЬxԨrBmmNoK<獣qneZ.fo*MMm獣}+H1MnǕn$%=w9/ s>/iyuAuB <$!'җ?{Iw?l~M UZfF8i&7R\44LO㤉B,CU ]YZL,qҢ&7R>i>i"44 ߹|m]-g"\לrt誵KVWo]<>Z߹,XA .Sgl9}?Yz+3v jfqj p`LggaqƖ@ EUp3v  ϘÚ/=/e~ HȷEG"4G]`E8].FWԜ6 `E(]uU*(Pn3|Ҝ-PtAt՚Ӡ X0"PFsZ0 Az-0kug@GZ8BD~@ [8;1,ΘT-Ќ=8gנ( nЌ91,Θ{P76C32F(cMA%\0C34ưNl1\xͮCS&;#3ViR is:4hNivf/ (hi"G 5T 944 IS;~kVthҎi$jR is:4iNie/.6(ЬG⢝y5$ oK<4nNo&OmU5Dy;;4[(4* %77y~z(Xo*7Y`4[Q5Q0x[>o& p@Azؼx#s34e>#s=|}͟{,按3B(B[dŕ%K8i&xi M#F8iжi)-IG&K4I5) 4LO㤉A 2Xi#v0KaФ/Mtd|(72Wg\P߈&[_ &}fq* pi`L4ư8cYm=g.c 3b蛶Khgՠ& dx~||ypy?h/vq974qQ.J|3eDqz Ht}n3}+>"t]-DWU\x©@qg]Js*YHt&3֜Z&]&3r"PFsZYHtڕ&3+hN'KN]Ja>8ufu3vYDK&>6kGB&&!bqb?[;¡iaqnߌ7mu[¡{q,XԠR&sC34ư(c𧻹J91+5VtƜnЌ917e=Z4qxC)[ҡ)'ጃqjMti"3944 IS;;ݑ [k#MCvH#aIA&IsJӡIsJ`4V[#MCvH#aNJ]H')mN&)>+Mzj/tN2%aMCv'qޢFIi"6%77FyD4OD:og7፦qJD:oNoK<4oNo&O.^&yYo*7yF8oF4qm^q4Λ8#Einfo:O*eibm|ޖxl|8ڷIa|w'~u38M܃z1y!s8vUeφ yqyHZ@AJKϡ 4I 4LOc qnPtq@IKӑI;X0NZI/Ptd|(~kMBW77bA5ڭ ;5 c2<1[]фC(8cw;Y,XР.P1,rmێ?:(8cw;[,XA\0cXEEfG (|+ ]\{.Q90誌.E~#YԜmtFAtUϺ]4h 1( ќ( @aE8]Asz@a ]jND ]X0"P&wvx,9c*Po&`y۽4GgjT- Չ'W'×? sݜ1qF@Չ'Fz9ԯN. ҄AHG'qK$/h%)4) 4LO-P 2Xi#vJaJ:4a&ґII`z\msA/Y'VW nߠYFj4a0&sOqpcX,ЕU7g.g/_=}A&.῿gg A&&T֗ E~ XrHtpt"PYҜ [©+\x©@qg]FsZYHtڕ&3+hN'KWN]Ja^9u(NW82:tݲg8t1(NW9,M$>8u+MgE^ LkNJ/UM#OJư8cz~nj4ư(cF&ۻЌ](gLݢzc;8¡scX1Owsۍ%L&hcK84cc3VkPJ9¡scXoS{Ki"2yNْM?g4ԥtΜthМ('MH&ӡI;80NZIQ&IsJӡIsJ`4jrk9;zthҎi$5)D:iNis:4iNi9i<nj/tN2%ʚf$.cO4\K㼕%tڜޖxhܜ8Mڢ"P&y;۽xhvo:ضÒiԑd\p8^{8?>p_g?tw~xw?z_u/嗏|?/eEw|q8`~-48ս̅/׿8| _P@qj mz0j#`E8]^q\qm]MX֦Aq);Nd5Fɨ@:+(Nuu,5Gc}`(ce76v2#Wq2cX\|}=\dl*dbq 'rnjP1,X)@>nK3 Dq HgҠRa'8cFc 1@6,vxs8(S6W 8'֤'Ld':hFi&g~_dap{c"MT:dF8i&=io23JCfF8ir4.i:ig4FI3M=io>3JCfF P&O>Է&ϊr8[;eMzJaAõ4[Qa@MjFosy݌8Mn#NU{ZkC4[Qڛ،Pq4Λ8rZɨKԎ]ɨ@#k> dm˼Ѿ^ŌZ9uƠYZ*:fL/BF.KUx]R,XAa=f3ư8cB^!ˠhkS{M5F(ceA [=f3&{faMť-~x>FyoG~yy&obݳytب-)=aJDq ml5FlE8].FW9_ԕu:5dF]^u1j*ltkt1(Nל\%uzaќJ%Zj^ػ֨@q8Xz2r5<uSt])>2%TP ۔8r*(1a3>2%VXgLVQ3ve ƦPM(gL>Q3P1,Θ}zgSA \;1sˠĪnjP1wԜ_ԕ JL_:er8'kSAUMաF3J`45^Ni:i'4I TĪӌҦPQ0JSݿa J:l&CvH#a\ J:(muQ{/@MT<dVKjIXS^kiRrXu\j77y'7J5xS~k hiAU~3zh7y:ó9(7zS~ 7yUY\{\n8o0|AuX4[Ш [f6捣}#H!'wAj+Bܢ>qwYW>/DV\r<4qVw?6 46\CV Nڲz:Th8i&9<4 MTG:&GƑz>)* ة=@h{d̢8]NsJ44KԎ]ɨ@,1]`{uN}B8c^H0&[faq泀/}祠glUuGl{z:%qq M*D4Qi44 I._7pPtڛTi#%8cY<ӠJ$=f3ưh36Oyuo9%%h+[WwY:Z0NZ XX$MV7Q0>x7|;0p+#2KoO[՝|΂qtUSQWs g.r]r+3*7w!3"P.hN% ]j#ðs . d\bmdv@QJN# ]QWaع֨@qr 2.d62 ;dE LU(Nb _*.v:T X0Ӄ53šhaql Xdl*dbqxo;hl, ʭw0Mš3X1=7N%=f46zha5%s\bdrnM1DuÝ0NZФ>3JCfF(iƲEu"qrM:.4:iFi&"R gg4Y괳A 㤕TIJӌҦPQDS`:.lXnKƚ,Ea4\K9rIJیPq4Λ< K,5xS~k hkTX%f6荣q E\borC&Yo44/g6osyqGU0n~ĪߎTyߎh-רR%m.GFB|R_/1j8񍉶,nY;,+\ N" UYNBNdžyq°G'HiP R O?#zӤE7Eϼ&'tg|ֿ5 McנB.D.Q;]6]J?aOuq{h:>aYA%H0&[faQ| {jfqr rph",11'yϳ5eDVwY:0NZ 84"MV7Qg`y.@h\[Nby0P.9HU%t(NW5ǡ)].1@qW]95HU'&t(JW_hh"AO M$"P\q/ ^X֦Aq D<14@l%_i3:Qz"#2Ӄ5$4`l,Fc 3gC8cG1}[&š3cX1=Ph76zdbq=H06zhal%Xhܕݪu(i>ӤM$HCfF8ijÎ$P,H'Ф&MաN3J`ywYV _B4]s4I4ᡉiSuӌ({.+z'I~HcgpYqgp}}z:7&qq*MxP"A4M"f8#Ed*(\{xxm׎-~?EqjшD.Q;v '.'bkQ;]d]$hN@# Dxwt(=Wt]fxw:W,X4cxlglg٦OGA تx.hg G$cXzpfWH<{]֦#YuDٻ A+;9bj/On?߾ⷪ+MŢ_~iKݕՋ~enH׍_zJKX/WA j֍nSkrB"T}(?gteػ;caRH=sJӡ9Q0NZ%Ie[ i7vHPi$4IFӜtiNiVKR]D7&ҡ=H'Ѥn$9PӜ(ZI`S$򿠬xk?q:jCuszh7y#q:T<ԷME jC}szhJʪ([Gfo:ۅf8oFjC}szh7qGӗqvI6{SXvo44P[7%GJb֛)TuՏG6[_%!.> T_wVhVg.xi~O6Gz BqKPumk˪+=À"QNs%"P.q/B]Mhu0J:u(NWԜ%"PJFWXn0z)CYtZ[]x_G[+5Aaa>c2<_11[N]W  ڶ*zc'|NVc434(ΠϘ wga鏸sƖ~Yj  '啒aeq0NZLZ=9|ќ|x{2^ܺwl&[OÈtu35s]ѩkFE8].FWԜ_6>+l .EܺuJ) N.]s6 '. 4zgxҩkFStͩ:;uM3֜fl}5e#ީ@%981r#1.ˮC/>>O⌵4KnuCG{1Sgr* [/t.cs8Ա4\^:¡91,Θ:OТol:2F(cMA%(a0v :4ư^ Nv>QE'l>v5j>38i&5Aڜ)qԙ?LsТ-MCM;x0NZI_0Hӡ9Q0N:E/JD:ԴG 㤵E 9jS{#@F.( (C];'l@NUoKX].Q/D\?XJ fԷ *'̈t 9:tݲg8t1(NW|E )p*W7p"PYҜJ.D$NN]ʖ3+hN N]aeKa^:u(NW9\Htڕ-g8;u(NW9\HtwV6Sz%0mVW+9aS"_j!k GB-DL,\uԨd4v Nc 3a !al:wXAZH;4v :4ư(cQv"xcs8Ա1+5(cNcpcNc tYc?}5L_2LO0 MBD39*S㤩33?6[DzGHvH#aF6)mNF8iߏ߂,DM;ztiG4I4 iӜtiNiYiЄic}YHv֗/k*I ZO4XME BD6%Gc _Pmm⡾hԨ.YHC}szh7y;b!"gxorF8oAd!].yh7qGB]fo:썧q*BZ|ޖxo>o+AYo0刻‰_$%XԻ/ s/mauf(q6W]}aʼn=Aԃ` 㤉BM%RiCUZ`F8iQ:4q444'QJqSc?~;̼:qߴYZ4`F8i&5ji>i"iOgpkU;&g]<ҵawU@ˠQ%Lq}@ _2fqƖA׷G-SpsO1hgѠ/S||[@r#(o_2ʰ|ֿy>혟Opն1pVO;biFל t7誌]u_t㠻AtϺ]^AWm 0"P9 ` ֜ 0{]hND q/@th?z^] >SG6deq~0d/`gL훲hcK8ԱE ^-âuŸOuebqJ j[811Zpr}P雸#6L0NZФPќ('Mi  ti4Ik4 tiNiqeh/&ҡ=H'ӤPӜ(y ʹyxk'1o|މiQ `CuszhZfU;p/⡾hԨH-Pߜ8M2zSP|;덦qނFu^.yh7qGқ7{isl^hT{sdzgܛ?`Y3&7ÌqPϱcqq:Mj]4'q]RZ4c4I]44'Qq;}1~1 @JKґh'Ԥ0HH|(>odg^ж I#6oT434([c2<1[]q݅;vYFx `L;3ư0XӇï_fj#tlVi͕lu~o@28]rB;utWƦ7E8].FWԜFNh' felz .E~YԜV'NN]ʔ3ҜN'^:uu+Sҩ@qLuFŠ8]r=ީ\2xN]Y]j=Oau GB O,FOigLVicK8ԱԨcNcpcNc 3NdqS9؃Ţuuj=-z-8]֘:Oߤ %٧#vFHZ&g'q*M*@{39*S㤩3ךc#MCM;x0NZIQMsJӡ9Q0NiLsɌve7~[4~h—?50νsYJx`L4ư8c˽/~o9cwhg֠n71y~SzMS+p#8duݞĐ#8deCqZiim8mE8]ݳ.FW9:m +>u%G zpAtvhn7"PJq/2y]l>] 4']8nE^ Ln1,848CVQG`odq~"d`gLc pc{1qn7CscX1uŸf(vuccqƢEx`uiaLc,9:`li\KZ&0NZIn7Hӡ9Q0N<_Sd:ԴC M*v9jS ӯB45F8i&upAڜ5)PY,- 16C];GpLuv%G㼉ASvқv{iQn7x[⡾9q4[%nMۂngxorHFqBCMi pFWTuiD?B4$ñ-߆ᑇd%h)o' nv[~}N]dg a cnO7l6??'ᯏ_?x:yo?_V1m6Pj UϨz9؛G)F^  #9{8i۷EtZ Ozd˸*ajM m9휲nP_Npg4iR9IȠ٤Q0NODϤgҲtdҞKaI͕'&M#fF8iDmL]IەJӑIەJaIJ f&ґII`zQiMH!ڸUᲩfotY>P1 s&Psklg4&׮bg4ư8c,;WUifPj&|}hgѠ83f3ưum<~lNL7xaEl6?. Vgn7Pk QNsI׵7ku(N s}32k芊/'v^뚍\AQJs.gn^K1F]4|o9h5f#p4"PZs3'zo5f#ި@QP_V:~sp*άF8cz/\XƮjo4ư8czkʅۚMЌmM(gL,l`;k84cFc 36|W.,a;؝4~0cFcphƌk Ԟ ]ll?bthNwp(i]I@ZvFiS:4hFiv][Zvi"E ՚ (mJ&(qJӹlo&ҡI[0NZIq -gFiS:4iFi)bziG;lRxT<4k' F8o^܈ZԌR<4nFo&OUڥuhy;4[Q݈Z،R<4oFo&N޹KK,ft<4oMzi7_iToۼxvG㼉3yۖ{Sؼm˽4[QQ-cfѾMBӶ xA򱉻Sr^ pRf9~Ċ cCv@8iǾnr;)-K_Un'0Nפ/HȤ٤Q0NZ:)b9iy:2iRicRc43Vkdٌ1duN1M=ﱒL6vz%{dUtUh[uFaoŠ8]ݓ.F t¶v. O]h@W]Xn/E8]Qs^),"P tr{.rr{PXn/E^ jűgx*cǹpjYվRgL/cP5ZgLC*Ʀphƶ&c3 ]á3cX1JNKЌYq,XР.C3f4ư^ jW{~<^n:Дɞ=}~15)iS:4hFiߍ]6NKФ,H'iR MФQ0ND;Vnthi$hҦthҌ(Z-Ey 1VnJeЬDi+8oF5D[荣q v֛hF8oAQn/y3zh7y:Mv֛MYo45#R>4v{5c0x{[=c\H_vrݥaF^ M#fF8iyNJґI{V,q:M x@HG&&q7U9iy:2iRi<4 D:2i6iLVg'R5Ph B{1v;1Es,סi 휱;Y1A \h/0&gfaMŪbկ7p9ætùas&[;]hQk QFsjt퍺5썺}4 LWeԦ2"P.4Li/\@qzd=Ҩi/\K.銚B{hϴhE(]sDYht73-kxoE^ _gx`*gTy٦|MUB"Q,Θ^/ 5ZgLV|ƶ&cS84c[1h6511S؛ K*R84cwc35S|ƌƮЌ1ׂV=|p*C&_SR:4e=gkRԅ|ΌҦthЌ('M~uKk"MCH#aҤ MФQ0N{*瓶HФ-H'֤FI3JҡI3J`o_&Om;>q DQùGXSЬDQvhը.+fq3zh7y"8BsVhhy;4Λרy3zKмq4Λ<sHyl֛MYo4kT 7mR6Tn' 4 uvNZ~IaV"^n/&ґII`tR8 rIiY:2ibi45)i"44 ﹬htFV?`5ڥr;wυfqz jr{1v;1K炾 _C1E* r{1>c6c k*Y=% _iGfӓ(Y=`%B֜mkj yj5C¶v.t1x^ t(NWМ tr{.g| Pnu]k8t1(NW tr{.J`V+.?`ǹpjY~RgL/!cph7cX1.Ʀphƶ&c3 ]á3cX1J¡3X1 ]á3cXg՞?+?`thdO>I r{)44 IS;?v٠r;-MCH#aI/HҡI3J` }JФ X'iR MФQ7Z* PcY;V*+q D[荣q䉠Okv֛hF8oF9^-Cf8otЅ'7͛,ih-hT$RgFiS:4hFi&vXUc[ZvT:4iri4kӅ|ҌҦthҌ('-JR3<Ş -D:4i{4FIs&]h'(mJ&(~U~|8Q;)Kʚf # 8oFŬОO[荣qĉ ~i-Qhhy;4[QMVh-Cf8otXWY=7Yfxhd1F8o^\VhWn6o&n(۶ܛm[qz >7o6o)77 Uo餐^9oNx󱉻Sr^JpxՕfE~Y"|zRn < XvRZ~NJaZ^ M#fF8ipWx#+F}n5ɩr{^eفB|vK}]}vﶬJpfxOTk}݄]sw[hgkPkdٌ1,X:Ó-P3v>cRc43kPkdٌ1_znp@S7=VM^_tAXrz]/i"P.UkND{baO@t5 %ABC͎e'$df% ?z1xgdߏЏ2o"E[$Ω:@'@Z%5vÿO׿կeV>R׏Ծ/˪vw[?|@|=O>BvIj49ͺ{1{.j59ݺQט\٨@q4='z4kx4"PoMU=l}.Q?rp*zַF8cA׍nUe.zh}&cS84c{1+5(\AncƌnЌ1,X@uyi7ݝ؝9 /v0C3f4ư OS{~_jc۽~th. wF8i&5ic#;MРQ0N+]ffk-;Xthi$5 (mJ&(qTו)EH&hF8iA@όҦthҌ(;Ry E}]lQ;vgxh."qJ*G֦f6Cf8o-8Uh[s(s iT366977y*Saki}MCve{iF܈یxhތ8*NW풜McF?kTQ¤?}G[zd˸2YzMmYŰ촮הxuWe<49IȠ٤Q0JZ;ZW`m>iEȤʖF8i&57RX44LMӷ=/MZ4qw:m>Se?P12o(NwQN]@#k> *u)]YjmюZ똻c,XAa cXyڢGgmfʌr-3v5F8c^ Ԭ͘͘ OϘÚ>O/ϟ1/pGr<`v/4_R̵lu{}JEq$:tݲk8t1(J/^t1J͹]uF]c6r QtU/]Ns*Ybtf5'K쑮{.,߸{.j4%H٨]io\٨@qZz4+kx4"PoM3<[0#_~m\*,B~x`*Ǜ-ZgLCmldbQ:]nЌ1,Θd;ol fdbq*3f4v fha4|Z]bLO FHLGqjMϙQڔ Q㤩;kZvHФ,H'դFI3JҡI3J`4O"MCvH#aNJ]b'(mJ&(.)M|5>e(/mMcF8oFľ6o6os<6o6o+A IoPUMT}mv/qQ>6qw^ >/$jơ,OPx+}B;y^a4q^p]-^h'EPvR cUEI/gHȤ٤Q0}rcU/F~[ [$UiN3t5ϒ5 V"~:gYZJОaLGfaq@vnx*s;YV\h0&3f3ưt*.he Xj%;1btuS ]UfC;Ct]63t̆v.*_t1*ͩB{:О@q4h=CWYhE8]th=CWYhE8]О+d3t75HThjkԲ-,Θ^G B{[81,ΘThMЌM(gLC*gC3f4ư(c$ThMЌݙQ,Θ^.gC3f4ư NXUj_j:4e-ʆqҜ&О!mJ(qߎ5NKФ,H'$3MФQ0N;VhthҎi$5 iS:4iFidU%OM=>q"z<4k'Q}d4[Ш(gxq3zh7'Om= -zSм hԨ@3мq4Λ<tuhB;MC&٬7ysB{9]n8o05rB;McΧk4Boeʾ>[=X^wSaz4V%Vvrݥa4I ^bϐ&ґAI`4qFvx#*[ M x=CHG&&ĉBc-N>Hkeod?3Pb'o(NW9-g٩k8u(ctg_7V"eu1hgiKdxzlgl;6+P3O)5% c2<=c6c k?>Ƭ/8_^q9}Ks%[P#TW&5HѨ^Jo\Ѩ@q]9leG f*q Qt5ŋ.FW9,GNF]J|NF]Ui%H׽Q_io\ýQt9i:tM5M(֜R#]F]J|iT=J~|‘P%cXV*Ǜ-ZgLmU{Oڼټؼټq)$jiVפt>6qw^9 o53V3HlNh'MVnIiQz:TFDOwTB{\{L6y*'t3Bוû<*;+N]H+4'U ]";=]6]JaIOg1VxzwXhgҠgcXub윱ExzNhg W3ٌ1c T#z(S1U'RD DqZinv6@q.FW9fg ]^t_,9ZeeV3t(NW9g U ]U)e#pbP.9grU ]$ 9Te kWӲ-,XA%\e0v V{1S}Wp76C37X1AgC3f4ư8cjP76C3vg2F8cA\e0v fhaTj_Uٟj:4e\ˆqJMrx=Cڔ Qɝ,Tegthi,4īҦthҌ('Me55*U os<4nFo&OU7,zSм h-h#xhތ8孔 zSмJ6덦qJ**{9]n8opUv֛m=ȺiUg}=|{,3B}{4>'T>vrݥaF^_ϐ&ґAI`53W3B뚦R*ynmd_;&oޑ(N3t5Ke,:+NO![t)z...j}[v;V O1wYR<\\0&#f3ư8c߅* Ϭ@u"<=c\c434( c2<=c6c k|\.L=8*/q,>T.o@Dg>B%}8]t:uuz5}D;Uue=z .^t1:tݲk8t1(JW~%X׽QWlo]ýQtSzlU/[p6"PJsQ\u=u565<u7&u9'c__)_S8r>a3hFc 3&wP,/flo0&¡,XAA3f4v fhaqƼ vc Su؝uTbƌnЌ1ƗNŐ LCS&;# wF(iuI*/(mJ(qle4M"q*Mr4)44 IէbҎi"E ՚Tq}1iFiS:4iFiuIiPdT\_Ib?7ܚf$ # 8oF6977y'Gy;vp#|BC͎,y>AbiՈMe"رlMz6q_"j.G]N]>$n:Ϯ6~VP2ծnv]>tŋl]Qvj *Wt 8~klDvzl˭Wu}}\yktsu(Nר9㶦˦Kd˦@!+zc9+OWY|X0E* +ݚ0111 ;_usݺ4CSw֌r݅gkfq WfLgfan1yHE4mdc"|>3QNq<ۺJ[6ҦAqg]AswWTF]K6ʨ@qܳ.Fר9m]'%Yɨ@q\OWF]K6WF]uPTzr[٨kFp6"PZsٹѨkFѨ@!Q/I\D ?| EX1꽛mFcphko4ư8cjoT|argc!4\n¡3cX1ojޝ51s\ݙ1[84cFc ฤ1ou S7;{EQ(th.wp8i^L+CРQ0JڨVeG4M"qjMj(mM&(q[fi""qZMg(mM&(dmlk3mۣvOXml;~jc4[Q۩xh܌8M|Sk{{o*M9rD}=[荣q[g:MC&kؤ7y o!]n(o^-X_gxlhKUY|QEEtP|H/o\}*qO!ˊ5)$jN3tpt(N88tE8]8Kd˦@qM%:銳uŢ8]NszKd˦@')]at\SbU=Y1A5\S0&#f3ưc]v TS݅gkfqj jz111~|SdW]vz$q9BY%k6Չ:պR2QVsٻtF]Fzg QtuϺ]洲w验ڍ2*.u1t:uu5kԜ^#]^u(NלQ#]gq;QtՕxYSt}45|4"PfHg~z`GTM9k GVj F8czc??@㝽-1,Θϝvgj꼱5hwv`G[84cFc 3vKrل:m,C3`1Ʊ8cϘ-11Fp\Ҙwk% NYHL6ጃqFMϙQښ Q㤩=m"MCvH#a$kФQ0N顦OZi&ҡI+-H'ѤVI3J[ӡI3J`ohLJkEHQ;%Kƚf$ F8oFQM=6G:z@qg]As➡kȬg"P.9gr ]5*e#k8t1(Nלg3+kIXq+d- %eq~n"amgLph&c3sgC3f4ư8cj4);m,C3`1Ʊ8c9a͘z#8fc˫~{57ӡ)m 9M{544 IS{qiAwZH&hF8i^<^qϐCfF(iw\;VqgthJ4I5+thҌ([JVy Z{U˶Y;lͧqZrD=[荣q䉠+7qz{͛GӁT<4ozi7Qgx r7yg VIo:C7{$jfר^VyGd.}M,KowƜ8#^hK(uMnwi'$3tdl('M6^k'EȤȖF8i&x=CHG&&q59iq:2i\iH'Ҥ0V6Sڔ S㤩l/Lֶ7977 MoI!dUW_`Ot+wťݩ{9/qs>/yV+1nB!B0yqB(66×i߀Y%ìh%-fi"44 IO .@ryfiI:2i4I+4td|(ii_n˚y.[[Vq鐳Sh#xυfq* 'Pyk4&÷4ư8c Y.M}%baNVc73vYF T/͘Ϙ ߞ115Ux8cGv%{dD+YQVsI^ut*mm.Ϻp]MWqJmU]ӕ?btSvXn7"PRsjnU]UiN Zcݠ@qj͉hݠ+]lUQ~U¡/eU[,Θ^r5ZgLC*Ʀph.c3 ƮЌ91,X7C ycS84cw.c3cphƜ46Xq12ӾǾ78i&En6CF8ij.Tnthi$VkRiS:4iNivx+D:4iG4I Tv)44 VJeM.O>Xl9(c2;5&os<4nNoVA[6-Qngxho4kT$os<4oNo6BUyC9oI<4oy38oFn6c}8k;,T<6o{7xF~['{l[Yz26B;Ty$}:vͭ<4 i"44 IYvRZLڧfi45)v4LO tGX#v0Ka\^h7HȤQ0o<]햕mEPήϟ(s⌕T…v1u1n ߞTÅv1=c>c k*V=Ū_>ov?Nzq8ƚf$# 8oFОNGAly;;xho4d'tޜxhޜ8M)~]hOMYo*7Yf4[Q1)+y>o&S7Womoyۛ4[Q,/͛͛GF7qR^9-~3pmqqI>6qw^Kœ EЦѬ"Zr;y^a4q^(Cfxo_*h'դ/td|('MZNJKґI;0JZ4)v4LO\6ja>#e]o+Pv5|@B8cp`Lo]iaqsA6 ߞUr ߞ115Ucz(?b%l$JVXʈt5Ӡmm6"PjN@]6"PVE]nE8]Dnv.*g| Pnu]k8t1(NW9%Zn7*v.Z`6+ݱTrgr#Vq\ UGl8czRn7Cݾlr;ol fl2F8cz: P`͘ PBv؝%p`͘z#8ƨuX4.CS&{ڏf'-פ/MР9Q0Ne4M#qJMrAڔMS,'ڱr;+MCvtHcaZ^n7HҡIsJ`ohT)o+GTIfRy rGA_Yo*ME*r͛GcL6ˈr;MC&Kڬ7y5*'osUAG:>j43kP c2|*Nc 36b ߞ⌕B ߞ115vտfޝ.G3Xxجaօ.Kٯ^:պ>|QZsZNtڅ5y eC;ѕ9uŅ5dN]>btEɉ㷿˺N.]S6r '. E*2e=ʩ+_h\+.5D٩Zh\٩@q ͩe=ѩ^h\G.Z`M] Lė*w_pp*T}d(gҠRiNc 3vXОel fl2F8cEUhOgi͘〈 M6+K*Ʀph\(gՠ\sC34ưN4&||\hOLv/e22a3FI+3Mu=3)44 I;zm-;xthi$VhR 9MФ9Q0Njx}.vHФ=H'Ҥ 9MФ9QnJkw//}aUw?}ݷ_oUƻ۽K`?4\jf$Uӽ;v!xJF?qޜF3ʭ{;xh܌8 QM v6xSм hkQacތb<4oFo6T[݈oro* Mr3ơ[荣QކJ|s jC5oro*}7Z[QjGo.T{w}/?bxg[17ƚ5eNn$=#tݥaVɭϙMHG&q|z^ל>i/%Ȥ(F8iN'&M#fF&@/vOKukeoκpv߉?]1eIv'BHkqc].Q;FNW< }Uun7kuLv ף|Kw  T/vmldx~le,?iL7u׭ةأJ,XArk3f3&3f3ưgk:#F=0{y/s%[ބ&A|8]Lh5g#p4"PYiʨkF2"PYktw]ɨkFdE8]\On]+9WF]4gޫ\u6ꚳk8u(FPUFNXkFQz-0}VW8nPߋ8_K8r#ۄEX1؇덶olFcph7cX1۷SVrc1u4m.h͘〈 Kdl fdbqz on̘-11Fp|֘.{ONFH.0 &Fv0J[ҡA3J`4󻹳ֲEH&`F(iuISammfFiK:4iFiļ-D:4iG4Ik45'(mI&(!+M{:j'Q=58šf$ʱ3 F8oFĞN[荣q ͐y;xho4kTHJxhތ8M}RbOMIo:7Y&4۠Q>)?zVn6o&KW۾ܛm_QޚJZYb_7͛GRB֛8)\q}kw|NK򱉻Sr>'y4B o*I_\h'%PvR uB{4LMӏ.7M<) U3.`57 ڹG,kG DvF]J?g炡ZV ױ9 …c2+( ʞRUx|-U*"Q,ؠhFc 3wЫ*{:c{%~j|h͘〈 nLKb84cwc3iPPUtƌnЌ17Ԟ?7V!xkRӡ)F8`^Z]eO(mI(qZi"E T*{:iFiK:4iFi& d:4iG4FI &y]eO'(mI&(!+M~qvXcxhN";pm,hTHxh܌8M~v6xSм hӨ6fy3zh7y:𾯒*{:ozSмJ6덦qz*g6o1{\n8o⌰rEѼ틽xlxm(/kfyyh_ Rz'N<,cw|N+ePUZ+oI煡ҒuZ;)駟OWBhRjiQE3_Ȏ?VMEOgHӕfA9],iN ttt(%+[BgoXfqz p ϏJS@]nX7{3=?e?%y'mHH.HA3Jc`ˇCX|=/4XD/DQ,9.56 t(NWhN@BaC@tϺ]wB;떍\ɦAqh@W]Xh/E8]th@WWXh/E8]^sZh/ k~gThjk jY~,Θ^V ¡haQ\h-ЌM(gLS*C3f4ư8cjß{P6áXVj^`͘z#8chԞ?+?`=thd7V 9Mrx@ڒ QɝThgthi,5 ҖthҌ('MM;}+D:4iG4I B{%44 VrES@38 Xl=(>`Er֨(xиq4Λ<\xy;4[Q(xмq4Λ<zSмb6덦qޜFD[ۼq4Λ8#,\Nzؼ틽4}#SmFYhػ 3&kw?`uw. M{4 M2MNB7*û|l#;W>6Dqjqh}@]@q`h|;stJu(NW9-Z_/%eE^!4azT_[:434(c2]zS_\a37hFc 3wRt&cK84c{1Ez?<ڍ `4v fhaqԆ?$%Lic1;1k4UtƌnЌ17Ԟ?7!M)JYLL6gጃq:M򺾞ΙQڒ Q㤩jnk-;Xthi$ktҌҖthҌ('MnzvHФ-H'mФZI3J[ҡI3J`ohJP]_OG$jaMCvؙki7_iTi3zиq4Λ<4˳D}=lF8oFΛ[荣qz:ozSм6덦q:rI}ѳr=.yh7yF5qE}Ѽ˽xlhרZ-cfѾ&N K x鸸$;,s\N?YT>/O?"QxRf{JsנJ.E*h@OMts:7)tu(NW9-"PJNW<M?b|K,XA5\b/0&#f3ưǜUXGSGIR+mpBC͎ۍYp<@ Y$U#CVe"Hl+q +&{=R%o49udq/W­ipG?wxw^/}]Yw?MYTw|޽/_CKN~o#+a ڲʟ?gс׬ʗm-J^Oq8|'?([f?P'P_G]ai(NW9u]Qא!3"Pr͹wr!9CnE8]œ.FW9Uǩul g.rSwz]׽Qאި@q*i;Nb5d#gu(NW9u]l Kivu5S7YuߋO9_S8rM"Q,Θ^khl V{1ӻmync[b ƦphƎ&c3{o.hl fhaƪԷvuVKeXw(5AK r.jt1x't(NW4E; v.E+$vt(NW8û76kFpbPRsN; Km]7]Pg;Ú{kgaTgL/ïA: ph7cX1¡;Q,Θ^jN06C3f4ư8cz贈Pg76C3vg2F8czoN06C3f4ư^ nUϫ=x-ΰj:4e~a%(imIl'HҡA3J`4CE lD:4i'4I+5; ҦthҌ('MuQld:4iA Uv)44 ZvRZa]xh΢ a+iFN6Cf8oF4o;۬7qZrDg;͛GA˜lT<4o{zikTAtr7yslsޢxlގhsT(5kv>oM#Uc4K{;婭,E.,JGzfw.Uv4 MwQiҢtdҞ%KaFN&ґII`v6yѿiҢtdNh'դi'HȤ٤Q0og|/e/^Ea}^E41Vy`Ld4ư˹+]ȋڬI_\./ot5Q~ݻe˽G{]6P;RQRsZўueF]Һų@qܓ.FW9Agc]QWXVZΐu(NW(ܺMטlŠ8]^s Q6uu՜Jc]j:Ũ@qԢl`U/`E^ Leؗ*e5#PeEX12olFcc81,ΘV3v4¡;Q,Θ^gnc;Ќ1,ΘN[1ol fdbql1111Jp1o Ƌ!s'LCS&{ wF8i^jU6^̙Qڔ QɝCZNi2A Mrl4)44 FI+\ l"MCY0NZIAf6CfF^ P+M\;|t*/F,J箮XЬEqXiTƋi3zq3zh7y#eż] T<4o7y5eżмq4Λ4sx1o4zSм,덦q޼F9]6^>+y6o&Sor./McvL8oA,͛͛GRž7'n [n '^}Lݩg9_0x/<^+\Y^<>C%dž}q}u[cRZU<&0NӤ/'HȤ٤Q0N)4WVIiQ:2idi4VkË D:2i6iL?s٩Ѻk7@3T jx=sY1A.'{81`^p[WVY6[Qy 0(NWP"G19CfŠ(]UUhN6itM]U>bt9)q2x@q*qh8AK,'"PZsxI,'"PFs8T<~gkF-,Θ^jo4ư8czrx¡;Q,X*~+9Ѳ4Λ(?͛GUPP6o|o*M7y5Qڼټؼټq)$53n۾9\W2pW?!.&!¡2piufV{R׆\|'9'{ nF8iLj] ҊE(=}'X4I.|Y<)gЖ?9v?om5?鐳GO=0ew+Y1AUlW6B˕Э-ż4?vll-*+5vF]c6r ;.ju1Z9+'ҨkF4"PYkpnYިkFaoE8]vY׵Qט\õQti|oiYkF`E(]U9 ˺lԍtI]NsFʽcԏ"3%xdX04|Cĭ=&1C〈ݾʌmLƦph6&c3hа=1C3f4ư8cjo3+)+14hݶ2cFcphƌkIcjo 㪕]xQZ?qe"#6H'$7V6Qڔ Q㤩kLծe[4M"QRQMФQ0NCy^iZ,D:4i;4I4HkQڔMQ{#@O-O}΋+m_̅Xg9(4 ?4[Q~DmjFos<4nFo&Oiʱs T<4o7y4M]y3zy3zh7q:]DyZOq9{\n8o05'1McF}Dc)5DžMt#]ZGR,K)cwrw(=}͒. Uq4 M㤉3BWƤ(h'$3tdl('MB/ҢtdҶh'Ӥ3tdl(7f>b5p=V] jl43kP 3UlTz?^|,p<k8xA.ߟ(& j/laI@qg]9mf M ]g].8]:xd#װbPJsZ<2֜-gj2ќ-gj3ԍ$gUR8t#Qh>ӋH8%ZgL}cbcqz p8%11SoǼ)+1R\<0v fhaT߬.՞?F+?`}thdך U iS:4hFi&w{FP&ӡI0NZI5^<ΐ6CfF8ir?WǴ4M"q:M x8CڔMQ{#@O]S@ӏ ŊXg9(4>`|(G3иq4Λ<4`y;4ʛ+5%xhތ8M|?|0X@٘7hgҠ3UlTz)VY=Y}h< N៞ßW0FLQ_lkguFagŠ8].FW9Ng#]Q[\CiE8]YלJ#]{jr {. S˲qڨ^h\õQt)Xr:Y6t5ieHםQ_h\ÝQ.R>#_l|L5#W#F8czïlFcph7cX1WeYqa) X#͕sD#Ԫq\FӅЕg^ns(%k>.w@W U9架,X W3ٌ1WrT_N&|^Շ,dc;_LiNvh3tU ]U=bt՚S ]uf6Ct5Ϻ]4h8CWY9E8]h8CWY9E8]^szrϬg"P^sZ92+ԍ$g UwXl)( ;leQƼ^o@*.jo4ư8cz\9MЌmL(gLÓyra͘〈 lAcؕ5• cphƌkI6ͼhb4[LLgwحl'ӤW3MРQ0NaUii"E q)44 IS7|D:4i;4FIKMq)44 FU^?UwXg92O>ViTKT3иq4Λ<Te4`y;4[Qgxy3zh7y:hỆ1MC&7y4 os<捣qҙ+Ǭ7&M=רZV|^D_n|=H^wSazU+~V[IO_z10JZ(5kD:2h6i& U׌IiQ:2i/0NZIgHȤ٤Q08Qh כ S8nn>J3@Y3t5l1R@wX]v-<=_fq: q1115JO=5*#[]0ޟ~OJ/.,ⷺ`iLK3q.hV;diߝg`.8>#D] Vz^an+kB/I++8iQ).OMHG&&]o<*'\_{w]݂qs%|r ǔ%< E F8]'<Ե7ٹkueuemtu:l|6(.eqƜ &fLGfaM7df7;o),zm7$'l!f7G ,Dq\wskF`E8]ݓ.FWМ늼rl*.t1 wulF]VsV0kxaE8]z?iYɦ떍\ɦAqqʃF]c6r K鲺tCh9;)k nY$,Bž*GkFnjo4ư8cz̻"[)~x&¡3cX1Ꮭn9blflg1Ʊ8c7Vfh͘z%8َY.4cM;(i$ MРQ0N[ii"E 5TeiS:4iFi&P/d:4i4Ik5)eiS:4iFieK>^zl+,Cv%7Xɧy4*eos<4nFo&O Q6fxhNo4k#xhތ8Mk+lLzм,鍧Q޺Jjl\mۼq4Λ8#LmIlzSؼm˽4}# lM{x`YzgĦW5ㇵ]ʒuldW\wi'դ tdl('m>#* Ɯ4gx'$ tdl(~L)4v M5m)+ ,kN t5썺HtgBWwH'PaP%+1y|0}Χ¬3<5k6r5Vt5l`/YW`E8]I՜({ʨ+.YW2"P.)xOnYѦ떍\ѦAqԲfzaU/tWQtʚqd.tWdE8]Qs'u57"P/:L%ghO5ė.7B)_S8rf<a3>ՌhFc 3wᙼ[VU͘76C35X1O7C3f4ư8cjljƴ9y U81[84cFc 1/͜krkR6CS&#p8iAsf6CfF8ijcȯe{4M"qҢ&9]3N'(mJ&(QҢ}3|xv0HФ X'֤kMФQgS@q:jGQ_<]J5QGqޜFI86977y'.mR3Ndy;4Λ(Ԍy3zy3zh7y:{$5td]yuYMrIr9{\n8o05&Emxl޶x-jT5yyyyh Rx|R_*i`;O |lvYg>/<^UY5^9>aEЕdž*yqBZrLJKס*Ǥ4~>^$*iQY3_[ɞ浚޳ҧ,5y- ecRWU6&u(N ttt(,k>U1PfWv( 8i!!El\"M(M̻|şfE l|^mV^f!Uh{uF`Š(]uUkNg tՅ]obe;QﰒO9*rDٸGA?@Yo*M5q977yP _,T<4o4ziV#mIlyKyۖz+4eGi|x9|ws=h^wsƂ^ϊ}CӘ[wy'$ tdl(~xiNr޳]g+~mdW{xǢ(]m9ٹku(N|"o7, bRW}.j4ǣ]";?]6]JˍjxM T-Z ;a6!pDLϙQ>.Kϸwb+]-prkR»-|D}2JQNsٕMt5++Mz\-NG(*.$šf(*# F8oA|R-Nm荣qtNo*MEI87977Fy t jq:o"zSмɊ,덦qj Ir9{\n8opkIjyۖ{Sؼm˽4Λ('Kf6cf>&N X{ xˋqqI>6q;,3\N?,ji}j<ֲ֧]3)'G Ƥ$;w `L"Q9-"P.q.nxR0&u%"Q9-"PPFW?5j`ʮ'Pzkqq4346}0K/P0. V]f4El.jt1x1[6f t(NW4C ‚q.5']`\@q_ Ƽ[6r '.E銕h@W]X0.E^ Lfk=X3[nʺ=X3+dqb?5`\`Fc 3w Ƽ)~x ¡3cX1=6`¡ۙQ,Θ^C nЌ1WE/ `l)2ٕ8i&x@ڔ Q㤩ߏ}"`LKФ-H#*Mx@ڔMQ㤩Uii"E 5q)44 ZrŞr7@=XYf(`yk5*os<4nFo&N/WDy;4[Q5Q0.6Cf8otPvS`yEYMq9{\n8o05$1Mc-F&HmՕFyY0N,*TY=+E|$0%JN,Kಒ|UjW0Dq h@MtAT}I]Iv~"QVsjH\Kd˦@q~xR$&u%"QNs"Z$.%eE-yۯrË`"=؉]KOء Ei2=?gFi l`n~`=>וX}g\\k]$>r \Bڹ]" +DQJs:ٌMt5~j4'fl2 uՕk=bt"qh/{WhE8]^s,'^uŅv5\PBC͎5 <坕63c{b;q +/#QȪ+yNնg8@g~(Gԗfa}o~ߤ7}y/~WX7|*~ e6y,`~۲UPL^m^-]tEͩzNѩkFSz+0NqʢvH3k Gg}a34(\@qi\iaQƪBUŒm]phƶ.c34(^@Œ9¡scXRڮŒ\phv.c3VieisC34ư N\5VKP?r_.y|+B)Дa2qMl6CF8ije)l&ҡI{0NZԤp%-mfNic:4iNi&?O!MCvpHcaIJZϜthҜ({֤5e E7Rd<4kg?3qނF9Mи9q4Λ<8eQ/k'7፦q*6C8otP,:u+7ۙf8oF9Mм9q4Λ8#tYwVsٛmkF8oQZޜަxl|8gVBUuu9 nocSr>%p}^]Ҭtc]v<7seSg`x\Hz^aFf{l9i0,}:zU Mn4?i>i"44 I'*z3;i{,Y Un8?i>i"44 ?CפMgp>5*C kG` ^u4ce3NXD:fM:XÈtsYo!St]Ns.[pk(+"tӼKט\ѥBqkuV׃SWKN]UjNi jc֠@q*i>AWctڪjkŹ֜>kUͅCd;􀵪,XAܧ5C〈>^>C}ZebqƢ%Ok0v fiaqԆ?Զ>-ol fl2F8cIܧ5C34ư j*=+kO{jTДjhq҂&5x mL)qΟ ԧthi$ViRi thҜ('MmYtx&ӡI;80NZI Ф9Qcp 2QXNE Dm鍣q ƺ&7፦qޒF5Dm鍣Q:y:H1Dⱶ+7y U}Z){\8o0>-Mc5{iJ4*>}hX/̇#51qF{u]ʲt34hR;i"44 IgВҲtd^0NZԤtd|('MR(/:,Y %MAHG&'c_H=-F}aX:z[?.i3jgvRAԚ0#'٘:tݲk8t1(NWUiNLWf P8u(NWhN)SW9\StS"hig.\ÃStEie4urjgڙ pr"PNs,f>:uřv5|t"Po]Օ$']c4󥊠Vk GBA.c15oNcphwcX1ۧSja[l]phƶ.c3VjPPE|ƜnЌ91,ΘQ"(ol fl2F8cUϘ-11Np1Û"h>dxoMd:4e8`g,jRE|ΜthМ('MuzZHФ=H'ӤFAIsJӡIsJ`4۟S4GH&F(iФ9Ф9QԭJ: ԛEWIk2( 4\K㼕UeE|ڜަxhܜ8Mt Qy;94[Q1+6C8otSWgE|dyFM㼵dEлg>oS<獣qa촉"ݼmt<6o[7y4*"ܼMؼq)z'Ūw'^z҆۩g9 8}^x@OH*z T Hjg>/0N8/m8JJׯCBIi4VjRKi"44 I'tkK,Y ՚P4LO x7RBrL6ur#VN08]hѠ4 +btuS-Gr4"Ph)Ԡ6B +hNB c)Ԡ@qJRAWg,t(NW9 -t%c)Ԡ@jP ‚sBG4Gdeqb?/)¡iaqnB BicS84c[1TP[84cNc 36{Bycc84c;1KP[84cNc vjJXh62o|aI /Р9Q0NBii"G URAژMS㤩~+D:4i4Ik4Kic:4iNi1jy =1Y;#Vư8oQj6C8oDPO9P֛F8oIQ 5xyszhFpIzSXeMD)mq4Λ8#6Jzؼmxfi*d)ٷ>boG,[}5c0{;#YHGJS;K8i&5x M#F8ip^/Ҳtd^0NZԤA D:2i>iLzIN(b{ZMP [Gfmo48o)C2˛G鍢S_KmbêV: d)mN5cF+hN-SW=S:\St/]4ߘ*5N]Ubt5:ht4E8]DYt=8uř5<8u(NWTN>]lN>] iNuLG0\N]tRuSÊu GBA#aQƢ^쇷DžiNc 3vU4ccqJ jT41[84cNc 36u.,aá۹Q,XAQAsC34ư N\5%tS42lgNic:4hNivfh4Kk#MCH#aN6CF8ijNu|i"G u&5OSژMS{/@ݪ4y 8fu|ԎfvT<4kGQ3h6y+5*fu|ڜަxhܜ8MMCvrxiZBVm鍣q頮.&k7͛5hըAMr7yg[MAmkyڽ4[Q͛͛GLҪ7qR_t(z7p,z)a΀煕U*4+V[HGT;yqy,}:T5F8i&j&ґII`aMtREhj 8.#~"h:C%j&qszhcE ()|YrT>ll'`CqZiѮAWk:t(NW|4']Gh:t(NWzхtujAtIh5Ԡ+]U*%Ze#pbPJs*jU]G؅O`Ah&#O`A~xw>R 5C>p576C3uX1_BP[84cNc 36UCicS84c;1Kj-11NpA]P{*:6ҡ)-'I TP144 IS; P5&ҡI{0NZIФ9Q0NX5&ҡI;x0NZIФ9QV<zV }+ЬE |dqޢF%j6C8oDgj(MCv{iQQ 5xyszhRSP֛NJSh-hT oS<獣qa춁P֛mkF} -]YiTg)t>)l=X^w׌3CMO`l>)N. 5:AHG'q!*:()-KG&Y EM:AHG&'O5i?/cu'ָiqR xM#FZo}-緵ׄ/_WZ렿]_WWl9]T:Z3fDqtߘ:8uuåk88u(NWUiN\WԕKKP8u(NW(pd^ѧ떍\ѧAqZ zp ͥkxp"P9NN]}GsNN]iN#꠹wDBCUˮEՂ=r|?3nmw #5|G_UuIO! cWRn!7?|l9?|^__t!:|_Cû_}?\5Uw}=WoyVs̷@p ת-;i '/aNޜ~rp*. F(c*fil Gb4ư8cT+3u¡ۺQ,XAT̘͘⌕yЌ<8gҠ Wfil fia&jVY+C|y/?Дa p8iAԭ̙Sڔ S5eֲGH&mF8i&=im3sJҡIsJ`47y4ud:4i4FI3Mz~6CF^ P&OMhMk;qQNYЬi44\KMm鍣q䉠mSdںvrxSмhҨz@mlNos<4oNo&NMEʺm,ٛLK8oA9м9q4Λ8#4jnmu;''{Sؼmӽ4[Q݀Zޜxl|8AI-_yBٮ-p'gm78\N7ՅLu:;Μ.8> BFXyqy몢%i'`Lz:.Ti4VhR=IIȤQ0}GIO yV r]Qۛ;lQ<2k;BVT9iszȸ9Q6uN'#ookXEa!=DE($8]Aqze=t5|yj5Ь2!̩@q']&Ӝ9ʲSא\ѩ@qr͹ރWt9u 59u(NW9z_urk89u(NW9Mߩ\u$VCt-5 >`pQ,:>`TgL/}i&áiaqn߿G) UCЌ91,ΘT Ќ<8gӠ&áscX'j՞5>`thd{ iS:4hNi&w: P5&ӡI;0NZI5^ M6CF8irːPZH&F8i&x54AڔMS{-@JF+Ou;v>`xh֎rHJq*jh977y'vT<4o'7y4! xhޜ8孓*zSXqY7y5& xuG㼉3m76O="Ԩ\VCYGβY=X^wcˋPͩYwqe&)N]I5 D:2h>iL6,kB}PglQ<2kSLKqjP7E㼵Ueeyz3ȼӽ4[gP5^ M&yszhS9aM7w.;* [.ZB\oK[VS?պ:bQ\s r4N]BpN]U83 F&n|qpCՕfxA+T+Hj|^aӘgyf-^[{U:Mq h7E㼕u O 7>M^pe8Pt<`/;x~^'8]Ths/AWKE8]Iќm%{ }4'E]!蘠@QLs蘠I,:&"P\qEG^ט\ɧAq Ѣc<蘠@h7.:R8BX%Ӌ=x`l V{1ӻ}#ol fl2F8czBEcc84cNc 37OycS84c;1K~_ phƜ+[*WÊ߲M0JZiRMР9Q0Nii"G EiS:4iNiu#Vtthi$ViRMФ9Q-P/Ѱ+,Cv")y Eos<4nNo&Oe #MCvrxiVrm鍣q>#Mc5gh-dEos<獣qaljEG֛mBK(4EǛ_>YÑ6ғ36gn~ROQ]c6r '.5U=ީ\ϭ\ýSz)0!+(NߠzƗ/(_S8r7a3D9Uf46Cݾggl26C3uX1oʕ l46C34ư(cFHXYTU76C3sX1uphƜ+iԞ?|j!4(ДÝ0NZI9sJҡAsJ`4|=D:4i{4I5)U=;iNiS:4iNi}\ճvHФ2kд/pq)8N]gXىp.#/{vNu*GUҞ:9::ǩ+$m9ԩ|hθtu4SWVn{ޝ;s:ǩ$kl!ޣ:ԩ|lu4SWV# |KST7cSTQuAϭɏ> |ɸ3lv՗k֫:wU+HJ4EDY\P|7Uc4[gP%^K&yszhӑm__MHWU }EuS>4unuSmnfСNCSwpcq".Z$sp_ TY>Aa6A^:;L^:xxgo@8{4х;{ eq* B͞쩓E7yolaqr ^{q<Ξ:_LŨB=foGś:Y1\F~-ެ#śY KKr̛:_L:@$3L>R9dG+3ʣB: WԩE]߉ ՙ|d;8N]aYubS'pnazZkKoK^W.]2`Qm0NZeHy&rF+mLG8i4^Z\匴--_\GF8i͓4^ZkI,iGbrG4I,%C#-\\ǝ[U%Y24Nniar'4I-%C#-Y\ǽ[{-@mTZaH}t*kdx< Mȕ@Q4Λ= nVNnocx5 ɦ'򡉓Mǘ#qβ]23V7CCVGBC KnF,`N`&ٔ7ď Vl'axlx#(:D!;jDؿVEzlRSԽx|Q=t%+?~͏?\oLUIr$y{oW_^0oy$_sHcU|εA8L],mY"SѩYSѩqL#SV7泦N]xEu6ds7jiEiL ZYhC m FajbކxZ0ot/莈۷ϚDüՠ;cކxּ!4F{VzYVzh7 t2v6ijM {:#;Bfcէ^YgMSq|&a e+vV7泆NaȾ߬֜@@.ߚ֜Hԑݡ헱[su^>ܚqr~kNṅ[s"uC-Ap(- :[s3hWQXD&ܚxp(r5 pk0{5@kNdo9=٫µ2~kna U@kNdo9= lBܚ]B),[s[K+.QsJK+Ż>$/y 2/&Ɉ8,0SWPVoʉy`SNLjw1⏅{]_a+YFº]{cF7u]DžuM äUdQK3eul&=JåՔT%"-UK+fDH"ͤ4\ү{i'jiL+r'ji QR׽SjS4ICR ϼRژιRäYJ2~݋HQK33 uܨ3䂺Խ6s${4LBüUu/ @ a^ugy7{Iy[)A4̛"{yS{Y0od;e-{Iy[+A4țI) ^tކxּ!sT/z#;BI;S݋Yk_|a|qLX3V7泆NaȾ`S"wS峦Ha,ea݋NZݘϚ::#CTSѩYSѩqENngMZPNj $u/:v'^i= ܝxȃy=Ga{SۛSxpMI݋Ve/fo {YJaԽMa<^YM{ K=ۃyjRzp7xGZ{cSū{=^Jaa,~kn&o0ޥzh/2Ov?$yv~f/$o%\l8]c?aW_1Ҏy.&a*J*URXI`4( VSRŭ∤U*H4\$/9aI$ a2J%Z_I``$҆t$0irnI$-DؙZ<΋dzcSZLüe%!/!4 )%1/IA4̛_yBü? g$x$ o6_yB;HӖgK;|>_18L]FY9$R7%:#BCKu^>_q:KY_Hԑu?/ ypIaJʪ%1/A xh yRq@i< Ҏya@Ido%= vO/_<^RXD&_xphv/_<^Fa/M$0{~1.%^K=Uac\_Ko/4,);XR~${`I%%ѤޟzƙQ)aeBCBioD-0.1.0/test/data/bins.bam.bai000066400000000000000000000071201273003163100163570ustar00rootroot00000000000000BAIIoQooL'~6IQoboIτoo }Jbo54K54'~'Qoτoo2oII6rt(haRMv`pu*{u*==#F8Jrt(Dt(iRNeQQQ!ee^ xx8KDt(3=ju*OS͌͌\詠`ۗ`L663= =ku*Vmu*P*([(7FF8M =|=lVmu*u*N|=5U#Qmu*(=O5U#Qo#Qn(=p=Po#QO+eop==QO+eyz+ep=AQRyz+e+eqAQ9QS+eD? yr9QQIJJt(t(==#Q#Q+e5+e yȌzz?P?ZܻQ") u*su*!==+QQZ'eedx"͌ y``TD? y ysQZeU yV ylȌjȌtZeeVjȌfȌuexWfȌȌvx&txXȌ+zw&txxY+zzxxFxm͌/͌Zzyzy/͌͌[yzS?z͌͌\S?}?{͌;]}?|;^vz}_vzܻ~F``ܻ>F`j`a>xj``bx&QQ`wM(cQtfQwM((I~5t(t(_$== #Q(#QdtfQQ((J=<+e+e y+ yv(ȌüȌeQ+([JFKOzz??qлf+ [JFFLcY (QaQ g aF#F@6~###Jkkkkkkkt(t(t(t(t(t(t(t(t(t(t(t(t(t(t(!t(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(Bt(@BioD-0.1.0/test/data/corrupted_zlib_archive.bam000066400000000000000000003634111273003163100214320ustar00rootroot00000000000000BCgsretd``pp 23 J/JK,Ir J(2*057E3Yp1 abBu68Lj]gBCG} mgU歛w_U93[r)V R!$D`Dq.պA3n(\@;6vTPQIjDE[A[~?ORUUXy?TaK+U*ϬϜ?=0F3MIn-NãhAQ |?)!EB Oy\Q_y]JuSTZG}hj_d/+J??IFHݟʽQrԹc{G唿+} ByI JJ`֧PƽߙP,R$:<<=hD9,`ˇX˯0,n`6u٤3. Iڇ{ <'d3XibyC8%]1ם>; tfnTt($QtсW<ҳLH_?SQG՛ g=8~w:Ghn\^,B#Ob`\ jK9Uipw_Ãpxg'o11'wq!;Y_}|σx֛u`ڟM{]< CB q c9}CN `κ^o1 }ŀ@(M,XL,∾2,# j1E"rop-v=< m"J+B#$(4 AY Ƴɀi I Ex*e< PϡL&PΝwP.Sg)ux"ű<*j4,X!$@S&c2fVlYB(B[ȇ4&mƶ&Ke#f.,-!t8[%N_Dή/}Ζ:흹^:; \` `R` @K葼˩ HW|pHI-RA<Đ֛1SPb8Fڙ;[:w8(:v6qhP<hPa}- .#@ ӃQt*A2TT"dʠŁ4 `h '!x1L$-ps3$N@ys Evf!4g)Z|>GcӛW9{2B aMb0Y#X;{'`MN HѤ+ZILݫdz]Te(7d]p=g{Y:bdY@%`Rp<)*Y<ъmX>">l4L] (>?33 n],I9bti{{ܸtyF˜Dκdw:nk/"wcڦ}u(QIyFL0s&BRXK'K,.;x7LU .^AH[;}>ƻ+僕Voc*Qs ^"l6EXfׅs[*/bۛOIK&QtͅB{8<_p/QQ\vщrtq4iEL 9O|YX^eܝMKfAoJׁȔ$%3<X>]Qo# `:#> $O""җ% -4 4WqKvzE<^WƼS{|];zcv-,)S S;2)[v3"B: dIYϞfiC5R PMcpMb.k;iF39KtZ{1Ɋwbs@?®i547M,ithHñ/"y͊v4c;|X'Uc[+&K~7 )Tԛ.phAie,}Ȱ`]ez5c %BC j?!Y_;v~|}chZ#kZ3ij5jF4bph<ߒtgc\k2mYpa_IhvNp *)bM~Yk”+PVҟah|xQi".Z?^apZGlpZ(٦zV%eޘV#ܜagD{CIx}yF{X%BB S7s<̱3wŎjӘˤJXN(7N N0k"up~}z mJGv:i8τNJ"νp9G4G',bHS~3#?V A,bnpis]NEYruDm;ATL. u E2rGĝ> &qOą%D}J,8wJ,.JA#seESjƒZZ.v~iYmԚHzY[ۊHa'<.XL[o)2a}+  'Ts%]{}q<$l҄r/j՗cUK 4z輎0v8#Ħ-vAfTϣFUG:Xn22;+<"Y>3K>|BmqGwq H=)~0Qړil9 mBxI7(ZwWXȊglzMgδrWT؍Qj_^rubx}H>?X}xN^0!㝈|^E kY&_ :pm;3F%$I} SA1~;+<7xp^q RiĹ`열&b~GܠK)CDZ:?cU' h6:vl)wIDleMRʰ6-a7Ѫ8-h10́ F\VZJ{DjpOޯAIrKr94݃= Qh/+m:5i^X0$9;bX +Y?X93;9LZYNn`a[w_׆R( n.Yd:m#a['tn> (A{{>tE{n,n%K Dܛ>" CK6-pѲbhk˨xЕhb.͇@aX2|-׺@1Ϭ4GNgFݔF,ܶð9^ىnBL :_m%q|YEO\#=vO#iBO˷mH(Dﶀ௿"D!cW vAaνfF,OZFPVYV~`~=f~gtztfgFo(%Pgn bDDtA#Ԣ1̂l8-Qچ)m@_fJ$,0qh+7qBLoZs(\Fz#tV}Q~w#Z"E3<:oCI63Ұ$E:Y2% S:ab:bZo +|5^_]_X\{la,fJs\yĐ-5dyƒKϢnl<~?NE={RfdUFb2!B1 Bl↋D(x=6jI#IҪזov~_It1G᫃!`,a}>-'Rg@(eG}Kg(⻲.2Z{#)J˙WHay%D4d$EWyk~& AILH+xe"4ˢފ.E:Mڧǫk*ɾ -ފѪI*VQuyv;sX&c#Q$,9  5*\xc_˺-޹2Pᬙ,0ʘHjD1z%}5^Fj)xB˺,8)+x)"oo ъݺ؊ҷa]E9-`RpsP?XM l ulTYf9(:xUIF(Ae묧Z<A|Z$fg1/6G!%,Ӟ8.vf+rCět *ܜYū,Wp:Ƴc,eAqɉqFj9]D @ ;'坨Cq>@>HmFb\|Hʂ_rh8%!Icg,O9Wrz'[q7V{qNz4B/*AN{,ZU:RGyhHF ktrH[&)OD<{_@עZ^=&"jGq4Ѹ'=uZU4O-$pH5Y p/3 #b>ǵ2}6s Jv­0gY#{;5Ib5E{`V:K&\l7yN:VpZCr)Ow0K/lE)}9< %*oyG)*cMq|1#t -d4H>CC)Xpy hM8b vMקrmH(jYv-tn#7) @iMm0%%y nOb?i >[9Ac΢sؚ e5 Ύ"ѻ;Tݟq2UEgM!`aGgK@ys^V K0]9'!U$^چ"%)4V4Fw(E! RJB?/\y;wN2/Qy!A`@+h5c1\Ud_c٬vaV%%`,La`jE0jj=r,%&!; Ϳءp" n! y_]PMp0D?qēEfzW yzUz,5^p 2 G,@lpEtp?,ٰ?=,ʽ&h,Y>`XWç m(a0-,ksU&tuXF7`I Seͬ '务{$mr$=ECi*P̓‘87(_ ~8gc^Yrf=p3HJDO;jSb_@di߽Gj;f?`Hɯq%grJj[WZT-(\4.hYVe!U_- ӡRcDZB611Yly,4Y,o X K̊&lUQ[z:(r I9-EzWu;2QB*Ŋ?qJ`J>G*<5Ҩȗg[ّW\^1+2R ].ffkV4s=U7cZslxXNni/߂40iاÂ瞗Gt)lyyު* *4n`ѷݧ%=t,膛q<*YE64ǘ8Wzd-Ӽ|!8l6rqrZ9q@\2}hB快!6$2l\N:$/uĢ\Au(`TT mv#i91k247l q^(Wf \I|.2WCL5á^ղҝ9WtO„\͓rۡhKz}'wyAudyNJΐ[P\f4iarsUj$D;*)P 9Hn3"I:UT:=4fv\t^i%}b[ "k۩E}f| up u/1-ALpD7-VܮYI$Jw\[o5h'^D0D"tnC0Usj Λhfrv5at1N(sf$%y{g0pAEsw< eQdV"I)hhfHŲ(W^GH*Gr 8#}~iXڀ)΄Z F'.\3\ϑH kq:~`_.!S2K_ H?Z6)3W3ET1n2GvJ+yrC1[[M8މt 2mٲe254kZC)rq@A;n,3.W4tZ:hXdռhV~_\LyUWΪlQw4XL>0C1ito$Н:Lna5Ļ=BDn9zhaK滎QM*7˱Hܙ&XpD:R'$IBnoҵ*X`X1.0%M|9Nk9svmd.-W;BLv :7qsɔYyFIjA¤ "іE͆z_T:mPjdus{m3с!8Opἀ2Qjl4cUYO.zC:X՛ xGڽ7# :[zT Y>x6͢`ׂY~rJRC3_MTO$;Lfѫs$˜1bz%bw5s#U;Ky{qX7Nh%?WdkBi.K.f4M.,:(-uq%3w[d 4s^FI~0>6.Βڄٔ`[EaQs˽r9/)<$jaS\C^u8== M~'J$._uq>*bML-uQj klF p ۿ/j 9t1monF ؚ_/BªعO"W_VbWJpa.]Cww[{{G YE3@k)M͂<_ljs)g aLO&]%w<)d)Ԥ/Y}tXNh\rw\3>S`yԧ.:cL1,΀)_%Jr-kE,ɑG 2{92 !RC-~т>228.ku:pI,s!=+VL NūǐLY/*FQvmd#IV42vu\uK18S=l,GQl,#X-F@[BL '%} 3~c-& X>÷<`hΜ7H˲Kwd)_95~?9gcd ˿Ar^].zwdÆtʹ_λ]/?*PXe)%#UMZC/yy7wZlnxfvC !uآ֡-b2XM9umтըֈEاEp) [T])E5͏#hGY 1c;qZ)ʵgG5eFA,+=a'UCd¢NڅE:M.csIqhܝֺ[?!ܱ#˚}jx 0UBJqZ(`--Xp2YL}4"fW-0ǬoA,( I!z cLcYo]X`:8]t͛7qSP巜mZ'(]KRv9EaM<:5d,18exb:+wm߯4p0|&TY싀ZR1s9g`/#E㕑Ns%K+,7?I;r T]bYk۞)"qwb{ɱ{DzR#eg3޷*'t7,6-<Ϻ?t eեܣcz1ys~B4!<dVD%>{NH.`,Vrcő}6iBi8:uԲYdy,t`iQh¶MRr$tY7ᤓ /hF+!RҌ'K:aÖvOԢa;u}S,gai˻L^0W'&^od5@u7BMGte=Mూ:9 LSse ͆]UuG2 4Ź}n3hZVc7Ï8 K[2Hy)i/:|U\4}8VFb#}76_TbFq\QY994 aRfad5 PӹTFl64J4̶CQF.nPm=O#H "WyXMDhhKP.p~vBh]=hc2a!fԧ_^``MYR8W#o^4N~Bsrƴx0gn4^1`s[^/{oErX)ziOB$YnXjC527b8JlyPV5fdzh&8ah㐤Ş’RCܔIUXÔ2&1z?~;d988#KΪfDg,`ѧB9\yŻ$n54ͲNiܾR0kZErIArװu\˘ç=nOhu]I#,͂ *tKID4I A\h*\k *,&pVFD#Xu@y갖H8/Θ\ VX5'Xw0B1MV%\hL΋ 9 A꯱-:TM^7Q9h*SJHZ0W%ݼ3<|< -"t(7]ҠO<ͷhD#p+/C3;jU:zJ>[fnufJ"ZX8%LxKG`ڡ悉D!H (U -'{tY2zWPV@óQ>!mbߵv] j3LJWFeVŬ,Օ-gA1ͨjޑk/.GxlmE$JFXW]iޙpUtj@ qc|y@2V2oȑ|։HZ+p [,ɂn46L-.bgY7*H[/wXQGhc.QR c[,#JܢsӻjoFվĥ<̓Z\ bW]X6HckIX ޵i0&IRǶA'byʙ` ~k*ڇ|֗ lQx̖ukYyF{ 3*PLeft=Z`,2bhdW7c~NVj^IvL t0PZ#딣mMb4tp`u{A#L*$g]'MإPJh~o02$Yw i v1(n΁ql 6sfB{QDJdܳĐX' vȪ ~S(TH=;nO/0\TTx,χ F I<&wX(aU "N,sg-,e!(\ ``&JQ |/7}k9YD?#d9l"\ђH'm*-?mbݭzI FU0usotn9;<_϶ףدgRO к 䛯/O*jo5b˨pi a!2:jf֋,PTe#`3 te(نQ}6.\P߁o4=\\]4ۭ$lnނ6ejnÍ>`OxJ>h;GR;-UYEwcBm)%N2L îI\]pؾIjw:7KD[\}qAf5ܢ`:~a`4bn*y\ FZ+ms;K# Y休\#'=xOҷhZw1>ddi:YkYd!0*˜jr2g0#(vwGxAAٟF]0̜}qm8WLǻ"[^J*-+쬝5S=En9 !z:VttZ3)\sɡ~~Ӝo3 Z]60t`Olc_f4\rDXcR0qf'/ZD&95cUYC:7OZ274ڑz@lsYfP{S{~Y# 4.dfӴ2JCk&7џT&Bq8C{0t(A >\t ɡp?^-KOXk 4Ik`$(9 s+@yR@ek B9R\8kv5Qa|hm`޿Ae>LC+* A"l`WHpZ3,jamu;?ͱղA@`(tmfmE"DFE6Do#SvG|ʕ>8C|pѤשacUJ|Uݧ:,\Px6n^Fhb- !BS{gUZtࠆ2IKfbOA 7@-q,b&1 s#OPo}E*`ƛx'UL&{8a3jlkHTqEٌ\`R%3JsGY,^w} 󭀵ԓF5\K8Gc27irU}t\ti-Kq," BB;z*K8x[s';*3%]0:fEЂ>-heNSHMz=@$LϡpS_ZdQ77k;dod#8O3jrj $\v+*m|ވǎ ao^|_1Ř]=p &R+zFOF;xwʼnʡC~xEZ b"iWE#M1*]Pt܉תrj)oV'<,.׎ŪQcَE۴sJ؅uX9c5 ˝26&GvQ˶]t>3li1"⸘إLv5i7ޏX%&(wR̿|6Tԡ }UhPN**CTxnjCoMRfaoosw-٧iySKq̓:벦H߅gtO.c@* Kru>D Cl4[uSk7+7 Q33cإ}Yuh_J(C|uDg "˾A܅ɽjߢp_ O{XF&~Nrt؆mKaf*XL_:v>p8B Cҷ,=zyBC G} xgY49I&f?G2 R ZNiPU\QA|]1 S *U">cWPn+aeqe{tsc{(ϓVJ䶛הn+=>޻G?2q>Ѭԅsiaqx8y!e |VIW ɛ'Wq&d7OɲZ* N=0̀&#J IC%Y ^ y^Mk+Ky^zʁ<\@rR , ?O.hr32̇p4w'~o̱4:mJŤ IEC"" xĀ"{^J,8W#) I*HʟD@|2{Ӟ oFmJi( ZE5@X&Awԝ#/#"rOܷ-&IlpBrfˊEdQXq΢13Z x<,m'_$i$a !r`b`I ,eǚS/}.0I&7Y&Ow&0t)b1dk%&1rr,Rv a\^[&L>sjXG[HO ܀ysHR4ATnupfР h@ 'S)Ci])^rؕU@Ơ`W}~ L, B'>î8F( ->dSs*A$%*e>Գ/UѻK}ie51VQCeY|&IU0%f 06R >J94,<K|4Gz^(i@ JMQ ~,hUDc  6f4f^At}wE6kӐِrMAFޜ-{x+ŕc{fy}wa랬N!`v1fP:=ݯS%S'+¾Tyz>}`^`1$ygxlMw”Ē^&g[! ,s3_pdu0 ):PĜA > ץCAbIۀ7KEn }*PhTDB ''hĭkTL#45unpGa^(2u`[*MGS(xe<,.gtwKc+'4K._y6b@>F]Ӻ-N午E1c`w*X2_2"NO Xꉼ&IR09?6ѽ:(@3a .T2,*A'MJWLPOU\E#П.фV$0FEN)EONBSoԀ5ռZ)ŗ#I RM;2ޟ$7snFЙH`9n 8 Qq+EjOktjYF ɀ_L\bE3L4Qڲԑ$Pe^$kԟKGH:UNr'a@iRT2BYA=6#h6硽$E"yፘ ,p|#p `v2Π/p̀.L[$}Kl`I8^,FO`0Z(SX6[dAGR- H.< 18RA4,Wouܹ,w1`Nq[_i]ⰸ(,O)ϨF/rLGeWZ-O@{aezM{{MMr,f^"oeN\A)Y 0IJ] \L&>W;TrDdW P^\@Fo=/VO H.*MRׯBt:%'@N!p7 ٗ6~GD z3%7`5ןgRRlN`Ti^Q  $LԊ$iFiT.Ὁi 0̫,02a~w1dsv RHCRiH=ɴJ(hd w9^'heM&G 7cĴje݄T $j. +걪τx>bed4@)+>'e&a 7&.7gj0CTYC<ȴLC1 B6Y\NC~)Oh)1Ll !6%{|`*JLF x)-Z` qa}c^݄?T/ll8o+ k?Qs߻e>9x<޾37 IX~X71s10]4*'YVju}Yݨ—͍ͭVekU,\x+Cx 0$L[=DI=d![a}_<nbEСZ'5dʹ!1OAԚW~lmtl>f2@m+˼:>QRrU!\br:;OD{m,R? tɌ+ϵ4F,_Yca([ 'dQ3Cp0LJ`(XN0z9|)Y!4Im|sIYyeͨc5s' JxZOoWIVk^F""nz}Hiɭ@sA)?XgF`3T0G4HZZ1Z@J+ÐD AAj*ꐜuvOwݓp0 i7jji=mJ1 NWD/"@I&%G `3AJyp8[Tgum SQ̹PΞxt@4YaO"̓様0 !~1S礈߳w{Ѝ\.gz Vv'*v% ,W(f$ lڱ lגVHSR!h ErtXvL;JdOT&Aφ8u%E3m7KKDiyz2̛A] 6^g?}3xz3ˉ1G-ͳzeL+ݮD20*II\YT2?dPrVO"Lb,㲌uΒ\|*$Dcym2e RDAZ^a!QM!d<@XŞBǐfu¸5åbх]y#<^w[-:{qLIiXQ7_}$_FDެw1dw0;\"FDQ#4q4Ò6fF. F}[a-.pLy!-';@բeJ2rw(8L][)R,l(e4+U%= {D@X͌pȟM4;Yfj%rIP-ls[C3pUS-!ǭ[#}[Vy۔>0 #JLR$Eܲ8ol Tzn~ejl:na3FgїIL|A]E0RJZxkAolCt \|gr7@~ؙ:RTu(3~BC*r{{rV j@d$N8 KQ% *s(URvos8t+, Q^Ao: _B,tı;b5 {oast |.;.gn4- xiHb:CbALq$r!f^*&yBFR[m%eitH 5WrK;#F|\ǀ7Dz](vdH`S@|3Ji!),D~%Zn^ W伎b|:a*"{}#ռJD-l!(ct_#i]q[@nJT`Gc SKף"cv\]$[|/5+D \(HA${;&cst ̵0STHJ=s0Gש҄ FeFbq}yyt_|FbE m*׿+O=WoU:;r3H-f3jf@$WȊBmy & ot]ָ8ĜšPpE2B߃Zea}JE?P>TR[Ь344;EMsq5e73Uec%YcR]`j%T$F4׈/$Z(HLa8SOy²Va[xݮ۱u6fbޒw> k:KA%Ds`k^U[>Fcyx㊅EZ=ܺ]c=X0r z>_EQDb)X]h?Q-.؝h8P__(a_8Wg[xE (!,@Zpok3h8`uP]̾$ #Y|{FaE^!4I*YR'q<+gCTy 9U0D.&U>8g9F>hE/)]zԣOqg..,{(* |e@1|o`Pn Ns T{a{5&C^xQb/M( ZەfDQDQ5Eb4C‚ר"&P C^Vaɷ֪Y44la="Q>JKӒ8qИ0,vrΜؐ(O!Eg" 6IG+W-t%b& M_ZYNBn=Rv@P/uZ.ҢKė,7eϢ<]סA?́rDD9eD;/V+Tjvl? .+?!{>cd!%]@fq4LG)qJhdIU Yh]?[W^GhPpq`4.v#Pw\4ӥw9"\(#l.ƵI`m sic-ɷy}jGϯؓKia7gj!0tqFEN"QŠݯi1=1@}sL2>fuccנ ۗ|b}\캳Q-yH}+O=Bt )/X$<\_8Q獫."dY]R3/ȥv-TRWɆ˃bhcW Ԡ넝NX;dl\%3:\n^Ke[g(8qМ.$ V炲<)Q]*[E u3exY1BXQSh`7D,Ս0ER%q\o )fTde\TM.̔'Dkh<6bxwDFz|iM?<:5:ٺP@.7[ ;Q.ԱE`ѾL/xB]sGZ%Q[OboGO\ȍ lQ1]6n阦2Ѿk<g`aڐ#&ξj@,Ex{֣/*N]N#LUGW"uq`>ʹ<_h,]8^i4U]0v}^|! bcIί(t!|GDU.x`FYz kV Bߒi^@ R $7d&f6Mb^D&`֪֪*[F=-e5Iki^SCg |]QƂXdj]wCU}vOwr|Lx$sx03&%aqY嗋iingLjHp;qD%T*rܪ䤳N '41AGrEAbOS(z QWI3K_^d܃kj2˽Aݸ&{ 7Yq(mam6pP:/:fS~ 鞏kyBZW융Υƙ 6:W +1 tcDrVLbmQ­گ{o*)}ZE/%wЁ_Nj} nc*Uq\GƢ J{ } E TRDkp%+; Lo9|k>sl/7\::x7Vt؏)it'PgA!v֒i* >m;פKz3 .(9h#lmG"Hgv[4h}\pjAIAa"IKW6VIp,7ٳW'|ߠae6kXtm]e,0;h#BtYY靈;t]ȵuXtgD0U*+t#o/)U7S։`.+۸E-h2ʌ),.mZFj]4,+5 3n0G䵰)4!?@1(ܧ|@ EM6z6I銢LեUoWmQlqB):]7mUPdɢ(ɓ(o;,|rDwo^odAXF\Lꉁ_@Зt73EdrqN 1OZs=X[_>Z\b5n/-\/ $x|{އK#@Qeq@QkI500iAՊkfUkEù5!ȑ#)85^:M:%m-i, |EWkZuQpxdi<;F=oGUe-Y+vK$궒L5,8d弸`3PpzT$gk&7+mM7.d@3E7:7ZB[BZ#W Du7)CO#cC{1UP3c&Iҝ x$Z3D3xğ&[(PL},NX C(bp$75&sUOLF`9E,ۯh!=]2 _X2rN@"r,Z S0<}h2h Be~@14*ޘeڥ=,&, wKL~Yodse`$0K͜:U&6鉱 MW&}^1EdBwyZszr(0AgP$Y.;R=km(ܹۤEg+n)7Rxb'CJ{{;bb8&ͼR®1x  ٧@vX\ >UϸWI0fdFF{Uxvhнhvؕ_瞔Eڅv-m(!)ȺSVwp>F6uI ;DZ[eZ8-J}5!+2mQ (G+P̭rQa$x+j#$@K]M]}.SSǀJjW4(%N_(0VL6IIJn:u(' ^n$6KŪx=Qmȹ1 Z~~HD恱ǝE*C!FwVaKEA;¢ԃ }ފt<\OsCĆrO@bK(D.{LLzcy4nޭ]+w+mT[`+6&X OfLX'Jq ^D;66?\:/B o$ Y^y#P)+E=U/ e8"%L MSh(n(:vTւ,3[{/pC8<\/Ud)w5~n_9^fܤoB{{WT6:-mhŸϡdy-7 ͍&2[8wދ{]YXC<<!\t/xv-npr-҅ejeKG^x߹.*qY1l3䎜F~Yc0bIue.r.Xގkqہ6؟[>W8MY[ qd-^G)l h(E^+,gmCE^]~aB-͐>1mlx̲,+!!U}~!7JEgˀ Լ OhQ)dQ$kck#%ezX$tmTdZڽԣots ˈG;reK^jw@؞ۇw`\EIMc/{pމ~Dcrh Y_YHS Aa qv-8q$]G 1@ C | Pv"Ȭx׏mk/[wKvʲ]{ %a6 ɞ)*ڛ>}#}iV<[ql$aA#u>k'6 ALhPv6Uw/M2roxmo?㜺=5tr C_)QX}a*UE0QEQFCI4y ֲ,eYYOCrqDC|G|a6qq|("w:E Gx׷uwRc+83YݬW\;=uzOy¤Ir&J4pϲW8ޟ0KʻX0ljڬ\m̋UUf?K[yYag= pvA]>19bp 3_[Ariֺ\M$VYIe~8܄+5=3*.uΎI4"f[hL4.']*. '[\6ֿALFIA<`aWd3R|x=F5nJxlƵMOӳݽ Q] jJVюVy#HSwCpgx[ɑWo}7X# .khT$RųQHݮ@1tߊ\ƱRF");B v/AIrn[XCO`f4hTI%aHfe7a1S2gֽ7y CTeĝmaQ㫂rAeo.+]dA_N2dBw辟d,on~q? "W_.yЀMbߚVƏ/+V qM&CVpv/P^'!2~x*sA 4ךIhSO;,]"/?|ɠ w K[u甕:d?x(,Y%@-țW;ZFsgoci_ѡ&9٧B 9F32sd6UG^OlILR,k=zod]qL4u1둣"^|zyzp7̧3,9e%ĭQq*`hu׷c-ƻt=qIY3˷.'~!R-s5nMq oMD|i՜\SOBrTf2\rL\$3Ig[ؾȿr 1f+6B~a9h)UbYk xboo"n(J!|%W 6mR!F] kv.=P3\CLq?.qR MZJ_Pس˿.cѝLt5!)?),,BkZK!(dLL@R;X7V9+kEweesIhC@D(A e^bnkg#rroXȞlN6jIOJyph~78tH^65ѮHLSM8F4zCPn$Em,Vg^,t+jBk7r0)q,U{Y|8bR'$[fH7=ry*JÂ*3J%E;#eo4MRjeX;X)X&|jQfr2"+ _ylaA\~7ME a=ʔDo-bGܬ֧'f]HN4 aUGFJusWE'J8NtYF[>yFou_ 7:IBhvm5zʢ1x\0t\eo8|RpFoيc&s+؟qVբ=rH5,lt܄HO=m"UhH_Q݄/ xk!4b_I|˜j#I0:xP|+7ft$M´۽ˇncS ..w[RbAxow^X.QmSʒwv vYF:8J։]4y#r]K    Kec %Bg7e`)6p,[f~A\qlԩu&pӜMF惡v>-)1^1wL&YtTp|sn>,dNqBQN8VF<iba弍jrP{4.M .ʻTy,:.o 32qD=&[\W;3viP69mP1(Жu:\YOMwbQ=B{ݻAse\{>)+9`ߏ2hQtmh$u[qC-(ueJ_hy_9DEJH粬wB`o=sxc/FNt:։uұi˂s(N,41KkD9k_e -Swd7~H8a/^#nWL?K-dlYp6ӁU+r.s%QVl:t.,g8d+/xhPeIB$[,bs%nlFY^7[+M+jV{C?tҋ4;-#ȹV+/޽&azZOr0kI.0#i+zm0T+z? `^>Ycץk7 _# G2;ԙt=/WZ fe I}Ciɢp}̌V}E-gM6 ٬^ȫ4-g-w(X_]U^ &UX*-V(WԱd!nIa-~΄GjٲX~@/6*zsL5;Ύ(i#_;w7R\^ :q@rx;_ܟíb ~aɓ, Uc:,&`1ULtqO=|`_KoWT ).E6 \kpf3ԙ ӆm01n(JNdGĸ ~5Q[i++UH7ps)tѶtD8")G=xȑ_&e;r튂Ŕ;i"CBX&_Bw@h6ۦ,2!gMun2B3셟k;7 ؝ o|~Ns  I 0 ¨LBѰ(Ȏ=@-Q> nXA(4;49h(na~țCc`C}}mB99E:gbmq\¤kib!/\uڐr[󢠷P$Y^7a?"lA9uIwq/)]x7 :36nCnbu rߪ\% TgvP?nf't#i =t{ǗDݷv',nA=N=4N}E˗%~9w<1`B5={Ik$}ԝ ם-Mk .`Isxho^cLžAW3ʈH^|Zu7&>OHZؘr7ˊK'ޢIc[oa)g.zE5io;;еG4+ZX-ye.F~=6&x?$>8ƢP"YxUވ_rO7'+!u,YI+2^eh@; qߙ*=1h*R9%nEHbºĈ Ily+*/&x!a9dӕ'*6˺))T, EeMܕC<u#pg#&*$"2{*J6oOaRQ<bQ]BNZIܝZV\+޾Sr.;8bw" ˢ"fY}i&.teBn oz૜:liIe ԩqE łb,/rus&.rbF7lR^x8X"*aJjc3) Kʟϳ;bҤqdXp&Nɪa(ofYK cohO'=#6s1ȷEPeAvl9ReukJ Ǵ)k'E }| ۳qWR>.e{*fIXy[clSkYm{LΫ/;bϿ[m9ʵTBLM%ƟT) )DHR|^ia&97{٘ t!icqt:&,< jdˢĖCы@I?q2.)9qG@X8.=TKO;&q.eř\3;GpV M"Q Tp;-|,6=XHNyT,v ʫ76f-!aӛW_6ځBCSF}y|W]gaRUv_;-@;M%98".iIB Afp?**;AAv "(J\a߻{]~w_*'*Jni<7g oOy2Oƃl8*|S9jħ^|$5f?aI78|M7m7N7=wSg7'-Ug>Gǽ.@t>K]@b_^c"&#: ܓy%cop M'Qw:9a`Hy^{fix o3 2)N#s` &xVsLUF|<ϺpHh4Htף0 !iԪWVr^|e (2$tYF'dexu` )iI)[[p@@P]aRr%|fW> `ޛ'Af#>BiP(p$sAJvv[4bԢ&o(;LH( A{d8 &,#iY  }?|AvFeh2Gz5ac)N48@0@HB*gpo(4PXND|9!:?ŷYgTyq] F.,.Du2B+fdwm;\7:K4>??;?MFR8ʪ,^+R(K;L$iԓVِE -.,ם܇[4Oo•S@JbX .ter"upҶ? Q0i4au! O8 B0w: f:}X@9-SKaJ W\XhZ^w8̦NE_p,7#-pһ}<{d>gD0^ E Ka*>0^P]&ݓIV^ě@1Ț؉%yqŅZ ,W2,ږ`pYQMHm|\GeHѧ#Ռp:21C'rȾoW]kvHi_ >WF\/MmHNO孎wP2,0(Rz>Y.j[t;]aPO,F[5X$,vCLYl%ɰ<ޥ4@^K# trK u@ 8z KTd_oa/g.q޸  PmK$H @U&FpQ΁rh5lxb?CRfSvUПmxѸ<Z74]K+bs_ӭ:?żП)q_ bר/0BS!DPVuŇF0B !~kYDOK8/RebxC!}Td%)+HP6]⡡bw냰EOѐ疥C;l҈AE*e~[<4.G227ݝrEętA#&`=m^lE'eda4mEhL Xvj E~6J{;t,?3-11FCNld *p++9i21(ȮKIYKiUJ4I|Ɓ_?2` iM4$4@Z(BMX?e磓HA#.q{iZY|Bò K$zL 5`߸-4apLi{|IhtQ#ވip&RKq&J] 5D}E|j2Չ"F&ZDHLnq@SKc\K'?s֜-hd9[J M@5fu@(B -yKjbLc?5)KAXb lxT qef1szθq'C0ZՏhox6RjeQ*E7S? |v&'4,0Ү 9뤱^Ps ?G4ع MB?|B:qP(+\G4X G4%gӿ6Z v9юȰ`1 ,^QE'ʹ3LM^BcAE> SÂ^n@"F)H+ (Kٽ K7F.f{`rN?C{\,I+40ݬ9G65fY`!w0ɼLDy4jՊ°U(OXAG(mI#$#Q IR QPNN$\ e%-"T茶?&Y)_<*<=N/ >~Teő\:ù-w8߬#0`,0?H٢6$Eµ R.hiɘ #FKS-nڪma"WVb{4kֿ sQLxM`Xd⢋}+Q>J<q1F}*Y8Yv@^| 'lTF *ᕽfscVo6xe@ u-h,C=?Dѯ-eyT$z;( hRG}t(B?w[ dK]ea:OzpwjP@`۲㑜RRGX}EPp"=G%˳ .H} ̘䰜)X\OX& T6rKDyjR~ř{XnN'8mرlémMœTzzbQS0ph%tF|A+sD|ja?u3 `3SXY`(PS-2'?E8X2XE.XF> .+ja8l], $. PA8`JrK_M%?&t9t[ uSQ$prŨ(SSr|C"רo\i_R7V2?Jg~:EalLmJU!2-E!arXnlns30Il'U\Uf ٟCF,!fË<$"-yWPTgLtx`t x.UOzTNc4Â5,:5dȎXC<,) Yd D`l)Δe5„<].54d`jzXf"7JI Dx( .}:PjU+bQXM;X Lq!"mQ MǓ 9ו{YY'ZX A-lX: ^j`* HE]֣\w{.}{gJ0f(:Ԓ3vUr x}cz"A!w8uR?pZ?P9=llL\ ɲpO#1"kޠؘe@m.5?S:cBՒQ GlKj/+fH]4]d;OʹSNr*̗]?d1_^!`u5.4FUHE~%_Ydd/ ˘gU F5F9eOJWMAcZ;y]eKA<Zٺ}̢F92RfFfhڕl4HHVs92Q3w .fehh(cbrU7ĚG;!\5%E1*Xa_k>~>S :$AR๖ϯ993Ɋ (Vb@0n#8כsH@:&P2d>15:8AA};)~\̺JrYXtwXb.77xg1v\HOpCiJQ nV,ao%syP!M?`+t>\X'nR5 Qaqy@, 42{g. Vn#-NU7KKXLGs}SKKY0 ;Cv,#f&@潊:] 銸%=W:H\ip(t40l8,K#b ŲkhEi8!1Us b5UX2i,ۨTdE Y5E j++n଺qɓcfP(aTQ*l#L:3=%h8)7 ('F&AyI e X'Jɘ(;Njs ( ;y_`2h[R"u}j2 f`|F,,Z)aNޓ,zX ZGzp,IRKw疫9yYD I/?k?zia%TSlPrdYʖ/ z.R]!}e6zéJɐ/)5kΡ%E/Xe)'L,$$m=>igҒ~w7g@L\XP 2:gN Pʗ(TM+k/lsqFF~JӐ8C$/5`xB=je̩%fE}dh)L'tr@VlӶ[ZHcЏ鐎p"MT@ RFERJ1qUl[o&8mE%錢!4KnwTͨ569? CzҺ,)6& +tdȝ@H4h؋ ]F5@`kvج=2^o-~i?MbbE?ZV|""3|&:5/USw$aHS`;!qHM8Yz;&izK%5?AlJG]u@/XG|D??SNQfdB)ZqB/Qz{)U4.q7RAr fEg &D3hcb>cs93<#Ry~Fga:"QdX]FSܴ)X}QA9EC -J"dfOt%|ijhfL' 8sﱜғdpfށ(+ XKBa%F* q~b%Y[DV 445s&-׌06"-"?MZ96dIq}{KBT$lP'hjd<(H(9P/-c6ohR !+q8(J4؝(c&F &r"_\tRJ^0a&k%[ɐҤy"~yErH4y0КN*gv=DN4y!XHJK7m4=8h}c=y( tk%,we ?t Ft?9_E+Rp$=#4qפ_>Qʷ9Nx,*+KΤl ͤŪ^]6z)(2j]TV-z儾|I6QHD1q`وӚnZvXb.*QRB/=`<׹Qv >Xsר [\8-I' cӞtB9Fq~&]^Z|ŶnzXsBfl>z#J$4n eyFnaq: 3"MW)VZ:uA,\ </(nU i#ȴ 2ULgoZضTVFSC(YvF96[I%KmDJ"Ƹ) >!35th#%}h_Q-%`bAxFD6R©"nF[NNŁR)JVQ<$APVYao+6.6r( 4t`Lۈk6-3iJ0TEm]h'sxh7f't;͝=",(,Ѝ7/pc uaOiMd[ ZYT.\efBuiuGmN#DsTѕXS0n]V:UmiX@m .=Ζt%Fez]2k d734*HHQumlňb=##8V;)M,^OKbh,qA@I-`[l_q<49mT=Z[#W'@`Ed]ϣcTd&m:WThaIQMMV1FK̊dq`/#Mo /4};:k( m*7MB (1lYau&^or\gd^,ǭl Q2$0̪SfŤ Xh>71KF?:ȕz3Lzmoy1RK8Ǹ̛-0_?aXq"j`m0g [,)s xrv8ʊk$|,թD 58#vI<$?e.Q#asE1.PU Ds3j1 o胳fO4UԀvLhAY+TxWxF`[sZWgnhM@qIQQ] px{"gg]iwgqe@dD\H9M'6c٘g"ꤱ!K7q Ao AFuBx|55$^M{-޸E7Vi8 YQGPT~ŕśU#00 sAo!y$NG~˝97ڜnYhM9.{oҗFkv>!`/8*# YE,pJj{bW1-좤,At11|EcޢXa@-rˣUEE;s4k\ -J2Qi̵m|rqDfԌN:-pVҸo]G|̙ECa`p0ON"*N^mqOA^\J3+(!}7 B(P&i7hpU .-|ؒfFZmN9AF`\=\- (xDjUޚ48ŷI$;YL-"N3C$:Q4KtK%e/vFuwY*Pt}zhllHA??敗&'ӆqL1 M˲>t_?6(9c- HT4r,:UQ d5@;,l_m\8נT[aÂRFo FG HI3\H:jhU)9&(y)7oٲBa=BM/#nx\E&ɨ-6(rK9I<XZZؿI <,;-Phg)u@Y/EwI3Y 9+dXg}wC SXܩl^#op/Y= ka x[tI- O[ qa۵3TYkmk4ZƧ ޢ`_Z812#YP Khn.>cTCiWy9@*wR/֮9/g-dA:Uw[ CK]PY"W\+qL0Ra"P̖d>aY Mؒ r)=s ;쌎vðV}c>I|ȃ_;pWԘ.HܾrW:$4+ƙ^¼B̡r}. a.Ѡ1Jl`Nf4{by}EQCci5J XH/X 2lR&t%nf`$epT5m {b,\b;G._x f-I0׽~qt K+* Ř:U,MCHYƒ@{D>M)[z 4na(W4Sy=e#0 a9>˟sܤVɄ]/[NsmQi 5_?tQ-)zXRE ,øCף)܂|wCREO5d7l420jߵY [Z7,-5̯-zRA0{Y奎d?HXȺɏ y;rXJ1o훔L$ ܕ2E!EoЕT"sƵgJ%i"6LrqErˍ*mJ&xZ1Y0' NzZDk1(2YyJ,Ksp}NqA1+ qV ,8$ XnSQ V H6Ԩ t.d#z_)@ZYy,hfl 7nt'i9%L9ݴѯXON b>[ʚ)'|rpޯZh훓-#,x kL.YRqe0b9t1F膟?YѤNYeU;1 ` zX[jr`|/{Se5H?ED"~L c8Ng_Zbd3_&-Kktudyɦt>䎢v6|t(%8oX>"$r9tVZW` AaB0a}y sʈb|Ζ'9GⒷw*HبcIU}~goa{kk8p0 Z(Ny">Wi\~"O(Qi 9 KbBK} ~@e=LBd !̽FذDerm񢉥n^Ș زs癮y\a9tKFw5KFå Bp0ctCKܞ.\@ VEH8JTshg7]dX(c./RE4ByZnxFYJgl>*rrRi0j60kx(nS)&M,zR΋\dž/bON#8ݛ>(yzjv1q:,[,$ވ^3w\9`$$ĸ~pml➌*K]x6`J4N}6pU$xro5DI)l[4ʪ1*{D{95:XW~M0QŮ{ |m lWsAm:pgb!᳿/)t<ٌymqTng)[ >rXnһTOtX$_k7 h|6YjVobz_ ~Im9硒9NEA^bK?3]4n_8*RK|c2} 18 gd\lĬ3ͅk{ȹMl Sʄ^p6$Hn _jj҉ 9 zU9ٶ@e>ߧ`;|Nh5d,U:-q^A]I'\^@X'"CL901l17pCLx\cϞӸ+ V'  3}K0R;C ([Ύ*l<'\E@vk6D!mW-:틘5."JSOc8-+MO}˘ ZH*atJd)PR:({!N_a ~|>|IYU?*yk8.qQĻӸPnj<g/I$tq X|etNK?׶u[XxɮXz"JLI/?`C&(vy('AI/b~OyDGiwiB|c<[r\*WhF]iQ_伒q8jX(uH]a>^L&c0yH}k¯pblާF_B8s0bl^ICT+Dlxf] dkiъ#VIL}EC3M^ DzIlBX݊9*,$5߬T63u,dتx]~ k>\YKy%)GIkӛ-ˬu@ ɧ p[+Mc E2gs0 ?s@h:o-)\c!O=3f٠"n/$'#*bJ&)>D5<>ٔ9d:K@[n;P+zr5낃ɊLح!rg1s9.W3J̖(q(ʯ]ka~6dK@ڍ:3D\XϘ|d)u|.`t \Z#HɂIn̷+Q 4%qp_gQ?"{8\ e6 ms2rLc:LV X̯6˓\t{E K~\QkYqSZqOz W>Y4[*g0pje Q׳o"u39L@(H[j>MͬD:q1v E{ۉ\۷ddݓCřk2F^1mШ0@bH(jJtaWoQr>;;6,ɪ!|\Ax-xƸ$AYry=ču6,˲^2I3C  yʿ>ާr) " X#%o[ w'\Vahb<}Le@1s l/tIZ);{Ԗ nEL{U)x ˉ]XwN (b@7Yb8,%ˏXJ4J:ONN 8!iߴ8r8(x(wKM|lw"@}9 QJcq{>e;)lPNzpxxSU F6Zp:M4*ULm|l[LHa5 ÞӍoeC1` &E\Y9IL]8)d}8$ :Mm6 ,(|Lž(P"2Uo/t}nW1,8ihcLtW)qI0CN[:.Ѧv%ăaDC~WUKʈoQ"e*w*X\X!87N6(y3!63\5lt--g@{X|*N JXˎϻ%N8,יոl;(f|T2FRAbvԇBc)SEy0 S*씐(%x"DxYw2ap8e6'Dq"ƄC+op-ahwh(&Ei@rWn eYr-ֱ\< ST$K ʕ7NfC|e$\ :W XQDy(Ej$% aH^h(;dODD KѺJq0HZ!XEkf{=*lgRV# s[RKŲc]- vv.Q !I=??Lq b+uNmHU86ti3cn;7n=}jh ^։r;Md:K2ıĒdF-%a5&̱J҈9Q]ChDy,FT`yE/Ő .px,)ͭk 55Sk=k{JkkNܞ[KƉ3 s|%uF\V!F8Ձµ⍗~(f0o ݵz&4lM/p]rqtXa~%\J/GNN ~}mkcKBdt;w%pBQ5*ËCrvh'Ks~@Uv⯭+kAQU=mE * *!QK]+S1tgGJXفZPiT*u`(nQrp3_ULyq:E8VJ=.Y*, JI M@369sާѤTV+tET1v K[rK)! 8ژAd#9A=iAdۀ_I ǶTJ6]Wdm͖lI#.7sK mPAf;^cKt]>h8XZuZ3Ͽ2٠-Cr~kWN7diх~BEdݪфcI 2EHoߥ-EK6-ndVnЈ~*+ҐHSΖ,̟&zMIMn)IeP8Viy|xxkAC'XN=)U,$ IID$!mxwUKiwg.Xxoe؏1b<U $TKEU4we9Y1XV$9/h #P;%N ȗʦG⁽ A$g`3ZSm i;@U(Pn/0W}|hg| ﻦUbZz{EYnu8N~SڨSTqE}B12kt = fgl!k/{ԡ.ZbGHG6@S5k%sK:]Ek 9#CSwgqF/\zvC?@NN9!$x7Z6hV8veU-tzH9=_J=_vuں/ȗeĢWXG9Uژ}9<]ݘ*bWZrkt.jE)WY rAD:Iky_p,~gNapey[Bny*8qrɢmڛE ]gvn2TG BFv=97x6N^#M(:FYKQȌRiFV[&J 85v.3''r99@nZn&Ax̀lt3jަ'>9V},ZnN!TA0a!A]!s&QQ7isM0i+monQqjb1 V0h u{,9[5a[ċsN+3feLcRrd j[6,*m:׮  ݜKli/ޢYpt|a)|\bW0- K♳u, DH#[jlXEeYoR,5N%;x<:5G~)0;,׫'lb*EJ.%Mu49K%mՂB-ZX6ǑW.ps|*XN04,F^{=IŋXb))r.Q"+u ӫmD\UCPgHHF:,Ⓒ@._66j }MG9 5DsgCrŝ}JKzp&m?j+OU$ƭg.Ϝ/˹1y9o +@UY3L> 7@>Qv&AYVN5}w+ht(5$MedYL,YGzYH&}5]FR蠼cwͷlF'7 -D؛@r]Po,/sJ &04C{<¼euQ:f!`"'9/Y[NF 0.A$ɡ&^K> ܨ1C@Ҡo o2 [jyㆌ:ڪ rWŞV}L7 I[Ӷ5HJk2'Y0ubX2w*Xti@XEPRKd"V@(l$ >[n'BwY~N!aV*oR ŲĄLQ:H,i&x;- >Z*Ptf1.hcKhDO#n-se*gzX_߬նjx$la:'bZ@b xLBCC} dY_4s~YifƲ~ݯO9eKk㢈ʱJsdfKJb8U@+$@b 6gymW?ՠ;Uc[g#ׯ?lX]gY5d8ivBDa;:>Ӣ xE^OZ((oi\d)@4:$Y ;1p>E(ϳ&9#wp*oRgP8UnϞOhzr`{M#zN&ny}Sf}\"3^-0cD7m"sۧ4vcZR@T06śnVƀ"at$10CTRD}t X՘Z#8;YeMi m$ k? 쳙bctt plS &V`||vEj6DC R{EZi/ɀ@/ǧkf_ EpK!2 Y`j-˓dm ǢBis(`͌neQ\$kZeŲr @Y(kSIM8V+~)%i gr eRT fu/M '-;-Ө"gg nACE< Xti L^XS|+/.s/$^ӄ# ~ed r|q> l dDt+;W-@s>wg&j@w0]*bL\*Xj:XkfLs+^EӅ,&U.dd*[y37dHIAiI 1g: \ 7~C }T =Pb̑Cܬ4ˬ3PհXk{NXT쓈r||D2HLH'_1b%;&0Pcc( %RO*8L-,wr/bU(JH,[ߺmP>׫llʢWOv4-cHmPea k}818F4̎m-(<\f}QT/*f,NɟlK bP}'#80GISR$%o=i:f <H>yXe {;8IL4\ (d!ڿOTܺaE)Ax:#=>Zȶp(jFz8P 2o9r]֊4Zr*U 'eJrܗj 44:`ɂAǷ%O Ư\2,kc"hr{e,,hF hAx` L蘸\@m%2]skq,c5&tyRSs$TKyuNbB# LM<cɹ"i8 C`(,,|Yóbaay,,d^Ϲl,,эIlQ'mH<=Q$/R@$HϒcZED"p^uib@ntbc- Cк Ѽ~>axt\4 \.hYFF#2! {N]H,~9" mNiɋW*tCadB睼StS 5;npXBJ;/mRp@_4p,Y b4#-:Lj MWiGfXM,/h^@.{5]JES*]2)Č_>I||<<*``hJ %t9jGa{gg$_O6Dtd@M qP"6:w:hx}L5 4VWgâڣ;rKxǼ7siP~vPnk S?w1W\={O`>>0\FLaֈ%T3F8 <0 ֈI1ic>}P8܃rU{t%7P} LY֠ ^\^QgX>*w Sl0|<R%}#qit'=$M5Wy(ˆ- !FfaT2Ē0&}Cr2Iʓ(_7*衏*CU>J?(DI{1MHI;EOS/qX qDyhhD\pLFBHLہTa$mug2R9[qTMRFPKQcJE.waQ2w [>%ŏ8_3z3()-NPq:x2WPHB iwq4%5DaH/)"a7rD, JMH Q@g#lgrS|ɥ=Pʘy0euI&/*_jP[dH. YPEEl=P2~Kj٣i)MNq/9' d@dq(\{/'}Bx\Gd }!I7AK`H<)Pr^ d*Y$TR"}JBb4и$": aӰ+Wnsdmq@Qj@ $I &S}"܈ÃyaG$hCΆaKa'$M/PCJIb Lgvr@AJ31D#NP)"NsCyTxP*"LCGh*\DI4i [:!x>I;s_@QI$-YtL$#q-V.ŎA$fHbfDr^W79eK>n$JFi}Rb|@"'|7:>S'HXaN4ɣ:;2@A0C 7_?`((`9,ebyCp[XMk%㫕s Ez\ʀy4a8:]`)ez%W3,^&+&~|QZiKXfxꄲ.Z'7yYCg\? d;`k:7'& }څ9 iO6?z(JLu G$X#HoXz,Cʳ:,/w`Qa=Y5&&-'o bMx{p^&70`C'yC@Y檮qY6w]A!lS,ṡ~ކ?˱2R"FT9}oOl2 D4@*>,5 ԹtO8.Zw4Tӈ1ܘx@}g*`[ 4 'D NGt@/GCyP¡2JИ$d2c&a8nX^گK%Cb lQȎ[tzSSLbr,R4 (<6P.D4Q ͂toV(w=A.؄w{kGJHW{pzvdBlRbk3ɲ8E/&t}<ܑ+pqY:tiZ;[.U0qdC SA;#P?k|Ѭ+ qM(T$ܛ2#E0K"`mi&-M{^lӖ­6pJsTq-b>Y`Z~TO>dqKl h_߰#;VIrU 6Is0J/|0na$aunx(I~$4u>>޽' ɴtM|鳀q"[&Noqe~Z2/Z&b.W$ M" X%PݖYo[8U*U*߉ @?{X&%liq<.̽BHVɘ Gh?GZP"F0*5Nzz'Sfdžnn(zHG;PȮɸW .:1C&/(R@|^'ƴ艃L8ɬ:Z7^5I1p)Xe-+>܏E-ł8V(HR1y&b#[vť@6N@,]14 h[0/2G} Yjr@]+1l:µtXVCqt(m_%vv>_1 $:&; )Bht7 PXL-:q]!|AW;)C'TdVX!gHqe-yJAb:{OJʸ"i>g%#2E!2^!*:BBٟM&!={BIoCj= m Yfˑ K#NDIcOѰJ>f}E 1MfrВ"DAy3bE9 εl扰ٍNKPFsY],,(oczeBb;/V hFġ)8k .@~Iv~HvX%ȑf miWT-iع'^&`}p[&w=:9 ½98̹lK V E"OgV4wx&+jt=~;^eܑ0s.+E :.C?-$h%a%O P@td.WA-Z-Ź6 @6WIx\J%a-f~!G/>apл4i" 40 'v5绥+y8틵'悜 4}dN*|.2-lHT̩d701u^X2NN^T.[v[Y*pv.78&Indr8M7fwsQz]f*iPY&c2g5^9r?,Qm6YNxwF,h/O.I:mmDxe+-VVחv;ʍ7M%v,HAg z܎ÜUt/]$OdVpŽG(fBVLgCn–gX`';ۉs+ }Ik~]iMYPvEεI,F|\7v!@R{` |Zp חM,*$Lj{JDx8[@'WvgXUȯ:wG,ï 1hod6ngVr݅.5_m$!Oz`m0aNhRrUl!y]eXP&/O{=Hbq atʍ'o?,N:@ b!Q$ܟM<|QЙ0yB Ӈd2`bSYڔ9QcUwd1C`= lɝ/ Npz4 `C/V<&$hmMo)8Y$f% f T1FAqϭI>wZƹ6 a! sVrPQU)[X(L4Wo7nႿ̻A;#s<+״CdM4-E娋{VӪ~gv_@,fD 3 @_ۂӌHa`89C$jQ5O.oei89˂ŧ>&ô,:)n (rm'pI@4zfa9 0d&ECr|@J> k-R{LpJ$ ];6dP%sKD3[ڏʋ´w)&oS25%3C"֖LщL^R%> شTw3MK:Vq|ujnN,P 9VЁ[C6J_VZeGXk)rනd|%u;O ,>/}%kCB$D2<m"qU˵Ӡܥk tuwŔc\CaO{@s4^N%g ex' -ArXZjw18:{<RZ~y_!ћ7t6%@~$ B1{ ^\XK 7} o#Iuޅwx >rا5Ir/ڵx'HIPB=vgE %]wƠ,2nͿ3ojY$=йJg.anN5ve%2e>8 tb .Yra"]w2aprAOۗ* 3= sˀj1UuƻlD4]!VH a4th#KV#f1s5 A2 01n:r:Ylء.ȹ\C](kv1p4q|ag잧h'[ÜɵKuvVB>$Ibc8:UP"̟Aᜋ&k@m"|%Ls:)Z$r 19KHqƾG5=/go? e~%5& AM²a|v1eC˓do qoI}L[Y ;.y{HR fτ#$߿\nh Ф'|!l|Ծ VYQjD(X,NX>Ps,?< Sd>m@s]„X YYAX=:qIs-F?sGd2&^(2l$YcWw]5b?JU>*/X4L1&͸toξSrް{ϖ&AQy|%$ƴX=K9-({<y9 ;?dB0{2-grhlG]moiXQ» ǁEx_g''s"v@;:"}F(y{xu0@hrˁrZ!NDF/)+:\t/7ϮI&^VEl,K]G-וʹg \/):St.xQKoǎh%^P/f[wV<Κ֍ lf'Q^3)#jL|4|ʟAGeAܳlVq0P(SE ;pzꔁX ހr{2Yds˛}lM#QIcErqHLnF'|`yThWd-~5Xayԧ]ʹFX =`"qVLre8? SXR+WHTx%UXTͤxK1يо2YRX H {rHywI= I StUif+ L;;ͩƔhShL $ϙ(#%h;~ ='d]vd25R)YэS_*_ ~"yJaNw?cHW*#khV .zc0gaN6O ό' e^0ErnΞoX^AM0*Ƕj $ߙ-pvJ`lo Ȍ;U<+ E&W~Vko^c !e2s|_b]SQpCfu$`$]P|ߒELi}YlL7|j\-XK99o {D*Wع[=&#˅xHGMr{In9~OqE]N#A7NYުMD;,)Aw3XXBSPsyºxIKvmV]F6n!i4]i*q%kU$d\mgCrɩxV?a?k5V7)(}&=; <6T H"i+>+kZW C<\7$C6iHMt ,k =6Fc-;2sn'p(jeL)άB -gmqcD]gajqQ\[M<>t ŸJ^~y4~X'f+k>hiT,jejkCnK05ꗕMqcXT55̮nB q+˃[)*c#yt wmPc |q[7:#m4%"u*!VmZ,"[?/xW#@IB th$N|-ֳ6XF:V8VQiT 8khFC]< }]g7qpOW86j)R7 'uCivޭB/l^f5PlQ7.H<\(v6<4w'  R2YW4D&ŷҽ1D9͊7*Sqb ,0Feew?c~:Hi Sg嵕d+b$-" o3JN"K]SB6hVqa= PؕfoV߬{NL$`%Ϟ,\d9Gn1",nq`֥ɕN.L4%.79U'&a; gerћN/4M=!S*䡋r=!D/iE-8g#cd#$P(И$ӢK1.8l/h۔.5$YAwD+ drիs/8t nJ6:7z̹+:׾kŅV\aw4>(q/\Ety|,8#Ok8[;R`@`zZ ! m?3ϵL4k[ܦ0^@ni݀Gp[V }tm&^G!Ht=X`,I}i YR$.+kax.(8^78]NdU~> /龲oskE#E Es$ EUݞC>i^xK9kDIn]F -Z${ZTd8MS+1Q5&4hĪEA1"╒ =;ûe^L!oqCAtɩioFEvKB/'ܡ#3$s癚 yv |Fb igdaghSkyDerwzS䐌&HXH[W,wR cs 8ڻN^i"IYWί@Ğ5@U8?*93Zy.6)QKoRvwq*p^˚@v^9c]:@^ ćJ?yZso6,{8Z112;\ bm|< Iϡ~50@jJP!)MfhN0%THYxySe{0|)(<뇒~k>˪<@nȺ0 (Wtp2 6X@ 8ĵV DzZAb޾@Ŗؒ 2[csO =`^];(Ia pѐ'yM5%=mjR!Nu1^G[L>-+CpQ,+X0'$wc:_)X'/I9.si#wD,Kj JqLqB ҟHAR7NL97:n{ݭ8qo`|#anGɥ!pӁHK(xC(v1N& p^1B@z1O쐙B$뗮ߘmŴo˃ Q bǻn H CH=A7mQvsd*2Q 5c!;t,_P%3IzR& iL*2"[tHPҕS#`ZGڞ*Q !0a $cN浐u) =>UrY8B3pNvٷ90qiͬM?V%.1؟.y`/(ѩRp5fL0(quRUJ[Ч/tAZפ7l(XPrT|例\(އ"3Ҹ :i[&OX|9ʼntd݉4DT-wAg%*dэ$B"y]0jEE}SH__rwx]<(P.8q2ȷ#Qt|Cݸ$y U9)Lꌲ%jnp,`_ZeSƈ-wvIvJg(>MD{IwZ a3:}~ND)dUgD/ߌ'Ɖ[߬@>h|^giF$x$ͳ4Ar=`?ˑ-h[xᏯM 9.>JI2a8OYez)$韄J~ぽ#0# 8 ݺ8,Z%K8!=حw,5lU'RgEw#IOw[+{ZAbcb%2%p3mI$VY?qNS>w5mp3t6d"[- w%Ͳ[b7)9nzWx^,;GR,ɝ(3W,eڤJz@yq*{pP6w[HHO;su qyƠaݤ6x%`UTwlS#:\C_ߦuL5HjһQ TЍw^ԩǚZ$NH.G Ikz./,Zk˛˭K.1oXI4sI]L5|#Ű$A>qD9K#V;,אhB^ d.`5x Y^isLF T5*Xrf{@:ndօX Rxc *}XC׶aM2ِbYEv^R{h_ *\HY (cȼ`]Վ@ b u7,䀒3Yu>΀g(͊N&;(JV5_|\*>YtqTww~ƴs9^";NLKPnxL{CoLb}MLi>:pk!_MePH7&|=[$TǸ;r|!IbyHŤ@[s,i]ӳgv}Mൎj`͘rNXXmC妦vixd}X(f 9$6`阵:o9~sڢYH~#M͉툘$"k2tLfsfy]`eau*!$[7; 49:,"i'I2Uq&a%z;߳a|L ќC'Sθwh| '13 -iHPQv@FxFK,(+8!ΘV9b(μ8nEEe5-!(r6NU-vagI.f{ёQJTʰ,irr"_kbhs}L$^.s/p/ >ԕI,w.YGnf1H+_VC]s:%mVV8 HMR⃾dyJwYf' fw\%$:076q"q: @IL3%[yI>(b);8aU]W{pDh 7G:fmepid{ߒBl<%7Tb$OMXK{m%I1IVwlr2lD|t@1CGݤ%XM9>,]Oxd#t߉tR h6~EzEC RVۛPK\_` [i(3!gbiY,Tg~z$F4RE ObR,hEo:<>sX-^nn X%W,2 ?#2f0g kHs{7󕍍Fk{#JrZ J@Y(K(f>UJ %i#B`,asw#,{1]O&`}cLKXē5w;1n'eo Ѿ:yrÓ :1*/6:p̒6\Uŋc"R^?֏x-Q„m .,y[kgzrx<@Hy@"-Z[v!_&l䀂RAy$:6ULN*q B(؋j xzBC+E} ewUgW]]U]UդIL%$ݷ{_tUwL"38&2fa*Rǧ0lT dMd\G\`D>u2ݎՂ\k׫#޽ݘuo Ə>۷`2ͧy>'t2͹Ao݃`|p6heY7[[ӬG'KcSϴ_zfgvgw3 ̛3LӼ_M󪚎x$K,K eK)!uiCWG`^/!| $eFhZ1@˂`<vZa؋T{bWcwG=:o-xrn\MI:)i5 IZgOҟà #e$Ytd)G|<. ABe&ó2ϱ7P,} Xv 8Dy?-i`_aOpK:,M΢{$MȢ9P*@(q>({Ka=&.C$CW%cCs`iTzǁ ɉHS:I # O'# hAR'[@L+!dhơ$2DɚYhX,Q'tð\cj -Et.ps` gb@9h hҪ= Kr%|ΠkK587$@V3dAC鬀x,JY;O'VԧY8F(FZ.d4p::bGH)AQ{I$UrU$IH sir;>(Oq(jV@ՂѢeK\$U.(P{x3uS+Fݰ`Pcmp)g7uƒ]$ ڑY }cMoWMԷ~1x#` Kv:G3Z[u|B )GA*DG@~$0v54-K8y4ɟnуB`vfD q |ׅ;D ۸6,Ee>,or.ڕ>t\UAׄXՋW4l,R=^9@C4F`áKF,I b7 2^˺e^IΣS 9PhUr 8;As _WjHK9psjuP6[iwe̩w;.$QpYv4lflH'uϖ| ]W5B~ބӐ[4_-~6x!]W -<dܳ`>BpoYRoq() ]iΐ H r[*v~!* L 0 w$ۛ4!#4Ejո˴ m`T ݴ(;bT݃xN}iQPbg>.a:`NÏ| vŬ@Pux*Ўv1%pP%S!Q8U=쵿& 7ÝCľ$h4F:0IଏCԲ>va? 'hLԀehB՜IczA̸}ˡ]?$xTKjtc`"3QbD[uVı<[y QA1|plO 0>[ڙf5t@^XbiY|5.ѯ;TݷUG#>#`Lm`B-wyY7[qdǣ_weSi^1s?_N y47m$QP"}Oh!plݖ޺{Q",Z\ $NX@`#;ѣ'U0 W[-% D"QHLʢ0X$Q4P 1q`=Xbx"ᤓ.L{QZ1LGUZY $Z*.(H{vY95ZDYMG\w, mǎBKʲWp$o5lQ˫48& ۪F݀R(`?'H`%JK}xq^,eFE Bgͪ#.V%2|5Ct#b41UCp@lƨ|i(Sed޳aXF>~ȡe>htc}1wt=Z&!'$VKxN Gy LcqB ݋,NK}"PC&>/UYMb#5[`6%-bU6\Xma.hnv!):&BJw]\JjwO`]aј}&u"5409, 6 8lx>3ҁ+=e2?J(^&ae6iy%ADWvX^,IVb>а/k:nXa5[.:VZ8"$!bQN;Kaea)#cb:BFqK8Hۭ hi]Nt aP"U)-C^,vl($" ,o\a2* xف=ztr)"L56Q9 x +u/ȑ|]"uxQՁTPB%Qam%OJ2 Gc<{;GS$%)%eEm4n |X>kC9y~V9Bɬɚ١Tɝ>Pö\Vo|\aa$ Hqa{!=!:J5M5eenXĥ4d0\|ġW0|J׀8 ZV,]Jhuq;2[O@64]Ҏ?u[˛sZ* }U.cWr}aGv_.5oǠ2,AbCMpG%uq:NGҞC`r<bFk} Ux;@Xwaba~Տ+4dIgG(Ye(I:A8t쟠:ha Xclӊ2'Q A PZFph3| 0e>-V`8 bKceErnωV,&bxyqD42>|=aX;›j \K@rX;qRFq[K.3JZVM|qW^9%?$q #) rY$$'я))j$6U <*+cl+ +rA~ʂ' ߓw1"0Ҩr<ǝO:wxJ2i9&709Q>ݰL`U$?fWM^wG⽢?mbY(Qd 0*v&19:=VD(~RrLы.AV0*(hJ~kaU^#=by7Jk c3_D|3aρ3aP'ѿCaTᤌC-J2 &]xqOj%;ʆSUG/a7&YpդǢ(cvO2gPϊ,?`Bb˰؉6Xti')ĝ1<H oq4 cGpr6h%0Ԙd'#3""N?ree2L](&bU7$t} :VG\n/9|--1 RI.2nІ:jg5H,I4hc^@@IȲFՆGD;We&y#W/_Fcy|"K`LwfK`,Zrp7튤7ޥŋo Z 7|#9ҴӠ`q|QNcR0ŊNjW-48[y%>_:kf1]NDaD[Z VebWBeT[ ذ8|ߘ.V_Y, hV˕{%s?6 *4*1 * LJd=V63j5A H֧b&oCͪLۆ:3u5X~3#q(Mt Gvg[ִEt>*ͅ0tl$Nvn%=մ4>#\34baQf=:[!˱,ٔsYnXZjMXCu&Jݽu\Pd s0t+5`|z@Tgv)ЋcNJ`l]$8YcCn7e-)/V#QуG4[(,s KRTRD fxґD?_Ig'8KLKuf:^Z{Kǎ;=MTFL*M 2?a'q[mMt'$шӬxa Sߥ/oFҴ5Pt2QX;BsA,dЂ?u.@Ҵ pfv#Z b 8q>(]m=,Z43sE"-.cLlc<$v,^;juWt?%|0b&49*Br?u[QĆzGC3_aO͈X`Q(w'uLZw/h[G 85yl,##7ٺATKL{I4]Ɨ72b?ژlX,@XJi ˆ}d3-W)PL3ܭ4V.g,? :k'd Ŏ@"i$yA{lƒ%[ Cg9)X.q\E_}uNEHh2b5&iZU8#Y +XF(ffaܮT$#mَwA^&*> EqL+V&TV$$m^?uvZݦx!x{c\IVF $*WM|9%0!Hb9',UE^pUs Xp9U:auo0jo'AJ?:rZ͡\Pԯɯ42p: 5`Ұt%2/3 +b&eM;-{,P" Qdo49(rV+]/HGhKyS{I_^(CS/ct:ѭ^OMcdai{XQ2R)Ne*{b. ^`џ@TLcXf SlKiU-#U0`Q|"} Hӵr)ƶOb\o U^8N%@XvNW@H3kEf IfAIA#u.dr yÅS0]1qFۉ9韎"<{e -8d^]hv6 1 {.Y}*Gj JP/wu1@NgI;ԪY][Frfn uWq/1Fe-gs 1ݏ6N+2dKLH^e?&%vk 4=%bTpǻ2Jo;7XQX/57?ճꂂ@L֧=-\6Fpn NHnUc}eai-I[w=/\)Wp:"xլ.mgͥyN&mn>^SĎ ~̙ˊu牃,lҍ"L1`+*k"<8bHкE,u-_ŝXZa[ҌazTl LG£~S - `Qk)W4Umʺ[>]'yƹCT{Ëb>ura;zo@=er3Ѱha gb1l|4lc1B3. bbZ Z!q_|QqČ?=\[flma![h' $fYb5]c&rNOǥFp@H$uM6"RewQ (ҩ,!=sX~><~LV7KR,KjEYڍ8lup0B,EX\X5Y/P0фfzx0~ZEF‘+}Plxw9\:w׾@0w1&ҲX&Mh9v]ʻ0MeM`!<3xCX6k=8Q9v.mC6j1+HG"jI"䍼8rOj2k!+A ?l=.BZ(YR1ᙞ:6WQX{k.Xn4Wth|Ngh=Utm7 tڌ*kEp6qyM(Q:GkZ y!1'T0us!1TzH7Iƙ&1#&hyd3\3ji8 -o_ϗZӐ\2E' a\MCG/8fKqiFF1{C0MQG#` Ƌh>Z$_7l)ꊔXMF.iv (3#UNG8]OAW%k7Ŷ{P%aJq'x!!DCh 핤W),i5$e6X ek3ޏ:z'#m맡m ]F1PrZf =|)*$ ̋> E ^Ƽlg dx4٠A,ZZ{(QH5 W?Dxsgul&plUlog ֹq+bYL)NXIVAJ",1cN>,\hn)K󲾏&t^["iAywSss·%SV9gH zNSQ$mYVEb `R'#W߂N#4>_Q&#YHYCqv`  ,/*jp,HEJvqНAXk6K T_/GY):9+ÙApc{?]>;s_wY_y8;U1YٛAThV\rȚC4!bpȍ ,>Uhy*B%#p5[% l̈.qφre6a:BRܞ _}Vq/Xg$\ `^4]޴SIs弍TopB(t;nդc.63@G2yI-|,okis\T}!?`.,)Q|Bu 'G:YBt0eȴL;݃:D rDBMsJDٲ:<5cenc ޲:85xr_!Yn=F2=3}Ғ>d`m0AiHd{-|*ɠh!X\yzSYXv -,AYh԰z,X~Q&UC0D&+T,?svy^LIg~eӱ{R|HM'M?I(pHӴ͋}z~xh=J-O Wzpp m"MG1PH{]ѴqMvkӗ Ώ[gAy {R ^Er;>⾋-H)Hn $V Ex1Ӆ<tú#jt+(y>^G@VɢwH8f߱,Y匮 gTI&#MqmH2r9L,s$U &nɈ,;G.ѮɴcD-:fy-,xW+ʮ"D|%_OM?"(]6J휖C,>;o>C1BZjl9fÂALI= xWs֜Ke/$3MJ9} ].g]xg2 lU{n7X Lf"OB\&(\^$[߯\0wuln;h38A"Z\= J]:Y YΑWYc?kgw ,k)C JP$Ԉ(= 95׏ذjKNK 4D9pk%j[\Vsw8ސy g M^9gxz%fGby`^&0Vմe{#Ұ4MI= XLjTGB]yK/ݟ`"ޑIp yda_P7..&8Qc{b{`,`yr![_dgI.A)/lYvv&Tc\'Rx0D|l*Σp;fTMq!-KII.dE\2Nx.P <Ad1vX%AIOAvd5ڥH&ǬǃcٛmT 褱X\L'Ew[˄7m #B̆1٣bWb:_~;D%7͓! d;+FX(6p2ځ+ L`cC^j  !c~wXzV7e'[wެ5t)m.ӣaE]/mPev4Y qQ” hVOp}BIZJWàH Y0ȟy˛v3f<2C ʶi쉁(QDi#| &ջ$|&Cpx3.@Iz<8(Sܡ? ː=8{b , mPu 5tDcTGYY>1!g1\oHC68GG̦ WXX[G;nn$QY1Sx=WA9*O{*d]4NW_nܴE7?F1we7wi"nE&lAZg5ַ0kRlkI#sf X x}cv  PL~(5kOp(˪}#р)F*Kq@a7ym G;>`JM&Fy;^h^`phHFK'K aPRKjG 1= I?U'KO1^lW;,,ΒUUUW3a&d|} WeɽX^2sF?:tEs_9n9,,ޒ OلsjJnHWļ&,{C'i$axi 孄[O+"&IZaJH|?Eq0]jLNT.S`e/:M{g;2R4$EuĭiĹ&vmM1vkٽCSҩIxР~k'6{,g}DsʄQX`fnD"P Csѐ" !(ݖAyF_ s7S]2lˀQ]!.36YVf|^$P,`2juHX̶ t"PgBd5؟6 K#O8פFT]db J7DFQ}d]Bj?+DqƜl"CKf>G7 V2H,=|p p%*[dX:>E,t) .Vkw,фa/ Äg=TYQw˼gJ2'S_ $e(otYdzؚd ZGpA,gquA76\dlёi>>Ŝ|Rϗؒyn'򁩓ݬ~˛@Mp!^ X躶uD>,>z/ F$9OLJn-2_0)wN]L$ҰQ,b#I[5Y \-^[bxK1x/^K/p'2IJ;L&Oq¼AgX( 8#Cgy׈gg#0/h !Vk0 sO՘)Ț|ڍ5`jGC} >wp*06%Nw#ὝB)_gaYD<$an&Ƙ'@ `1Kz8:khg%9ǡ_vpy[/Bƃ`Ҵ'ć'Ea#?ӊcG:6Wy4!/Izw\z*4V ]%RxҴ#λb-8"III߃˯:(U0u ϣBIՌ$,1 _.'W$ToWJ00h^O'Njx-:\l=tt}ӪZiCKf/5x05{:ÙtM@/<#J҅9?5,8Ӹ~1gEkĔ`zBÑ)Ч_}rA72{ kƀz4ɧqE U{JA FoQ1XҲ(qαrf/Ml:ÔC`[Opn$b5[OQ޻m1LC+Ha/q'<4`TP&mIK){y/&vRqEĈ/9D!ulI$ 8RcocMyrY4(]q9&!7=q,\qcufss3mylk~\p|NKO6+>+_`m,☭@ {F}zkKtq6$gmsm듎K6KB42rsB/xhX4 c{C iQ`Y Hb bi1fL ݷ 9x;8>P|팪q&1t)ᛀME,fL-k%dX1.}]n x2n6B^TETXxSG,ƤZ$œe\dիsTY%;)Kd=s3}}꧚v_N~ ?q c4#F瀬)Q4i@ vۤ7Ejz֧g>3Cvx@ZKiNL{ZTL|-MYzN M(hB8b۾d(f"ZphBZ>Kno6#&z[a"δ75]} hл/}/SJ׉,< mG| >lB"IK Qo@&ф\NZe(KXT/8.=Td n>h-d Y.42!1,;fGuH,0-Z3ԇ=wRۆ4! C =d:l>ruXP[ ,)ZFi XY6V~fXFJ !,*TBC,E} dwYg^_nխNu@{ZXNBD68*8zQ罦IQgqs.E`XȨxF2תurh4.Oj4n^xq'M;Ngٰ*fdV?`kk+n/x<ݝWt9lwxq3s೓?82Lft6*~$n7v֙f~o“o&m3o |l @ 8JL%\ J5<[׳jV z&S8 IM >ݑz ]:aL r0 IU@!Ԉ WFgPFAi.ˠF=XK8]Bݯ)a0(p8 Ѵ Pt&ID 2AyL@KSL`6 &A ި@8>;NR go>]Ƴh6b0=<&B.}Le4b|PB@Գh806,]O0qٵcnt21.&#쭫v11t>$ᬞ Fi JURzLpȇ&w1"y:T0yf@z<3fä)1g/G>+ҭghL+n86^WOYf'[SW0|vT]L2 3PID>>ɶf+B?и}L CT.c2pm#h jC2:ϮT.Qg* Yn, , Kͭ*pϞ"mY;XXtJLf,c&m 0(`r3|vf΁駱iK+ݬYr8~)%YH%,L8ib@4%G9BM?[yf "쁁ꄰagdgP߭" @S8.3#޴GoGϛGgH8 ˮ~K:_s U(H+j1D9!o:ɇa5\T$ww?eXJ8 ` cr}E0^U$v 0>8 hFO?? _A윘g0ʸ<]abz{6#&ݺFy!GlTS 4c 0 ,1&W%J=q76$|Hf(3k!5]ķd Q+MCW0}̓ ;~igwPt br[J l˰-¤?ޖt\LS*_u1ybqx}ijbe8ٍف:f5â"PSvPEfsPKin!^ \HQIǡԀ&fl'[E=hS^[գdL2L%m:AId4N"S *B $fm9;9'w#ӦL7AцpABy+k8k#"1tI`?OJ -XCᬚ 4JR66ֺbڠz\TK*\!޽Q;lDT: htf8?KWY Q>0SsM$GA :s!y`rԩ,O%;I+7-Ζٞ219W4 T V©!G!e50ޚP#CNc 5 P6P}k趺{M2ߓtx)bN 3Jq-q  קC"Zxxxx{q= (vμ6.hlL^2!_M1ma,fOHr =L+~ N'ixYt;m$S+ UCN/Fp ?t(2I--|Hxs-]'u6@oevwOFB.a!h^>PoW>[ uqbÒc`Inӽ۷(tOJXtMJ}B g~f*wPdP?pZânx X>*:>; /h@M_ N{.,@vhjdm(mXx·Q5| }z@tGe<< a+URND1 ZH^|٨JB ,a`B8Q֛2ʩ2_pX,C="wd8$RG-x$yhD.cRz.hLRz L;]V'# Y@ct9`|Y:텂2(7qx@,I!p& D{Cr`Lv'TqMHJn ADPQ.c@6= ]F 1I/%EtW/^6\Ze<ʎL%ɱHi>@b74'9?)V>,DdATF!&^QXbt %Êe@x &VI!ibH, [ʼT!pU9RjH 37Z)[]Lei\-> syӮ)YEHl3/+3ɲ h)we`(~,ɢ<܈YEc*mA ֠`@4Q~g8ߜuvdb+,ä}5fU5(ydP$]&Ѱ:*/Ǔ^{R.]}RKWaz0K$^OB NH^}?o % JLXL)Ϙ9 - ʳ}dǽD( LpMx/O Ia9EKơ`B,<^+(;8vXhHעraA#t@AU_ %]kx3բ;0d0YJFm,I,bN(]=CNXʁ+L^94QV2Ċ(HLH( k`Aam\@|Er˟g1na-\*\Zu(/gL`7`WG!FW[o}2zA~O^\pKѢ.:"2P1K̢̥S-vp _  $ʪDMܾGXJ b۰"}pتkDҁ$f9j~:A#JJCl0x1-,Vi'3^ 0 +9e5PSX;dMðld:5!?b>ӼxVE<U|>ˡ\pm%2)]]-t1z`S;jj/#0aZkX,euϦf8Kr0Gt"L]@eW,\b_ՏdcR# |abctQgtfRݕae_@0O@|Ê;͙<iEbʓǕ•cy_/5\0V1]]N=X4O%N3>Rtqek5I^{(%죒SГoiQbVAd :]/I#{Ģu6 Dzj`P(M2qhnkXȈYw[ qC-xA`N r>л@3Le(lIE42˜2'2'u}TŲ10K*(I: Y8#E蚢omG[FVL#pnj,U7(t2A(ӡ|> eD+taǴMפIدx{ YҺƲ Ŝh*J4 J#-8$Kr+N;x`wX^95QfLDlӞ+y.zaq !K NG$K$O]%.gD>Bz&CM# `rmHGzxCtx)p~޶-(̑c!5`Szt(;{Ġ?9y{v#!G-bVLqtBIBMM]c,9ѻ/"XgO! <%1$ XG=#4| M^G k<;NI(camVJ|z|~W~g ,#и=/aNr3!|G.z|/ ")EYϢ\l#R2³b%ā~LAgs{S3t㝊xs,?TbQTWwd`<)7n`j).QfVL%b< =|C Zj"508ΨjꂷP3hf&{IcrΚ"T=ʻrJ`K$@ F#]4v8wiLms&MWs<*F1 DZ,%Jǘ-PςX^6 QX:PN@xFX;ǻ{&&7emxf_KDߣ`INu+-.1JThmV#2,////,|d0|Çvx'_Ъšрyn~i9#*ѩ8C&L`lI׈LI3IÊb1T` 6LNpKIB{'&`{ ,^ަ9↊ԉ<<"r2'ZENeaW,/vӛ\ Y8%ЇXXډp,s^r{,Cbd7CNn%_.!)S*jD{8Lnq @)3(+> /.%Y=pP$3,B郊i-[7my+_:K qkT7 θoD D:?wSW'Aq-؂Fi凣{8] /$z/񕤾tЍgEZD> x˼MR-J)5V_9nʦs@z$7E5./uX)Z"BˢF$=*|xƛܙZ)|{|C*M xD^+%鐀 dYDmdҒ+…'}y#a5r%רZʙ j:]R݄Eq`FD猫z<J/oGm>DGK~EvDifFֻņH2rL6 tGb>v\70Z EjXU hyZ;A@+/_W;Lk[qVg85s9oo y"(I2_$VsŃ'&D .-9=EkD҄+cƯduN L=" ,fz΂T85`_]9C¼U d=b&IٌV}%pvݗ"Φbטcbf<$:ͯ1@TA:AEو n!邽|͛Ble&GlQk^f[($1ZF%$֕c7H{㩯uҵ-ul>?i8>òM(W~+y'>O>~y"AI;xB2,;<* Y >IvS(HRsTJۨHr%N?#y2f|wkhtolIA< Zd.\԰1$;/=.$VGMY)/47Q Z:nZ 4-X&g0?zHtPf<$H<`a5 *|Zs)o_ D 6oY 1y%xi!@ `0)9S.xYz,V,HEL9w;4e|"Zn2fz.)S|O3Rv1ɂ3rAOgܣ`I[)1q^_Zc#u1r_!I_:ˍ:G+zSMC N$@Cdz'WHx^jq3Y/R'QyEݥ>9IFΰw;sJܳ^"go°OsMJ8ieaA#N2# K/:,oEL 85Й4I:0)EHâ 3BeM-hnsc|M)6,BBR0JPp`/u1`)a]l2"C9ͱpV))XE9W ֩ݱ-RW?X(4f (b_TJ>bPRtsVG5OŠc_d%G(f9!).G[7-e@0 `D)w%tzAh--Ŏ״i@w#i%.9Pl-M{sZWY mla#WOmlċ|8U% ],z\x&짩٢CWĐCBfS|t1R͢ sE譎 eX=aW./Kp򾈬X R_"[zȲs[ӟ-a>Y, hFK-*ꅲNj fΩ\eWڷ>ķ9dLɑᓳN:@J4Ik6pLN88zz[Xp']) \&yV{RNIv9v-//%2Z$R]J̒ms:%-M"Ab(5q iK6mFQStai>1CBC},ؕ{%9V#Hzl뮪s F$t`-,é=}nˑ1z 6Z<3|^L:cce@BQ_a(VgI"^@JkY%ZLߙi ӡzH9{e;eSN;["Cb[-I{? aP6ED= .͸CFIdzwlH=r]M{ vBtL\^P\ fSAVN(Y̨UWv-l;M d~阉fX\K7EZ&yw9>rQeıGt˻vAn8ik$yܼAǝd%܇3˱[>(]}):s۟l0Z-:4N͕ ܌+p|n&Q\ݶJܰp5$0qEhc^fFV{<+FxKjڅ|L֥zȣ|{AbVjSѵ eȴ|!F-$z7㨗4#e&"H>#f75jYl-E7%< ]iSq8-;ou*ob=}nR7-EEZaAcDy!òE}4g>;=Pa88&+c׳n0xApfw@Yd7's}#yKHLP1{`c.Hwg21K6ȡ<Ȧy%Pp g34XnW}biB1lj۬cلYYM Cɤ2˲DIoij\0HDyJ-4'+WiCpFﰸSSJrMwE'RUmL=篵ɢ$O⁂Turk5ץbq7>ЕbۈpG~ E.o4 ;((ʇsak8~Ylkn,6Ifuח<>g!8Ypm'R(Bn;*t,[jj\3|d>_+Vq,P*p;:g))B3T+YvǸ|>8<:Ƽ STĜYt_W71G㇕42&*) \T$Ò%V#f*9CyqO~[]ΗVJ>D~pGYs6sft馚'"Q muvp^Vd^.qOXzV~X8_ab>DyDh~6*{(A5 1EnQ#M;ϊn 2di*t[C<$yVm;IX &Љūq0/gI*z7r|Os"so* (:8I_+ ,mVOM<ϢJ%a1)XdF (;ɒ?ߋԭ O*`1UWm_2p걺GBIn{OӪ%{L0'@N[@k)e~H-l%AGRS3RY ț[Epl3xGD65Ь:E+2 !@Jn@h O(~},Yts`:xj,mnZi?',}ơyolʝS]1q,Kؒs?RY9lޚbёnpXI&rNþߊdyaaTwT["shd٠J8_ŤPbN<[> .!9PhǔJ%= ӄ-k:塆^n35c}dѸXN&I+Xv)$OpON͗52a2w>H=tY3?ဦ! L=3'' :2EFU7' bl>ovƅtXloδ$1HS*2xo6(1Lc }1'E\?s*Y, xe5y,ː|I3.v%Ǵ)JsM`+Q/K9#(_pD8 "9%k5iۉ4H!W#y/@vB6}Mi;!dtmnW#9f=7?Ծ,@KtV rkɔ1!d2?&GPŚlؼ90ބ+g/:1̍AT1wˑ2`PDI"V鏐TĈ Q \IFr _`?PS*cn/52I2rIJe&(Ɯɵ =YBedGR[WשּB0u̚bQ(bPl,Q܍ T2~F="֥D|Xaq_(:"C]0cxι>kE}'Xh"\>0-RΒX= 1D^X<));Pr` }+sp-*$ϮKzgzU;7+Ean`ɽi{Ec& I*IHG,ĵ(] ]kt W/upp} KzRFܬg$1%TӘCNXb'2>N9P⛕<"[-( 47/q4/I,JUQ;|qxǃA&V7a ٳFQ5#\R TĽ M[$gg[QG_Y0IhrNm9+K^(4/z4qL1dLdER|˱C9@$v]c@YQNև,Wc=Itn!%xʻ!)Yl`nA?ɒ^R(&Y~Y-I1Y6`1|GmCńgO}iUȊ $Qz s]ZC,_S@NX``N֦ʛѼq~i83鴒TGM(Ļ*cD+Sok[ØaRyʅH& iµf2-[E;:UR $mfy"| AeGmo8$Kq;$`9|N ´07`|v)tPV|eN7H*o vYѰu@"r#nJHu${/oIo*Y + ..18ܦKqHXSb1v)!`3mb,-c.uLl@YP#:ߖ: (b㉦Nu`R%#C;(ɋu(oͻɒXl0gǤ=4 0]Nv~Z]elXCEwRJǜI}| Z4 F *9TJ\a'_+}y y 9ee~u:z+If]b &@(F ..5޽}|pbKAsl}96Zk3 ¯i]mڼ-ۆm%IxwHS 㴧Ġ,ц3:ģvxo&x ă^8k1pt;2TFR ȓ|7n֭Wz$H#V~`䁲i3q>}PgNYh(uq:H,=q%w%_ԎKvJF^n(`h9)۲oUrccGS\(rucKe.Lx#Ӎգyv4I~48py*ua3Oxc>JY/Ş0Ti^P-PE'p(gU&]"G\BNb4w▝ZOBr]:y.m 0$BC hiF@rLb.6Ʋn.,!e8cy"nc}eN1e,6>ca`&(η+ ċ))p&]x3xAeVW`hI[M!)`Q5]t,*W^Y*|.RP GAG0⍻Ɯ1\tny ߟ Cy6 s5Ҧ3=WMos\TC)g{Gyc>8 g^} d ,IF}X8^p>=ڐ12 6/C ~yGK(%YXKf-,.1jdy 6qc5k2xmD(>ߒ+H.a n͹Vmjٳt?Ԓc&P.HjPd+ 4h<,8 W$"Z\W!NO$*viX0,sf<|#-Κe53mjx],17m%|Eܫ[v9* ռrynXG}wn%&iΜ[JR sA:KrS@gֵ^;PylwmDy'ei78'\Nv‘(8fVxiI2u'Sņʔ0?@#Q}@i(n-F9*ex"^fY]qו͙pإX$߼)x \%1׳j4`cyʹ︺Sl)B~B2!~1 B{3r;"wG./EZ;,~9wfZ(f Ĺ[?c_؟;kdGEse(^0+f +摖:M&Y6aA)FTyT4V#(XժFD\Sgfr$7]bdH2[t:7#U2F  Mz\/'!, K78avĈ8 S2t!k#$3#DI1 jQMH( -j@ݦ xO y˄ miZΝLHg wH#V@ c `F5a,(EIٲH\7V1 Jn`1+EAQ&/DҶ<'E+JjkMtMMqKuM^첥 %r0[r˖2?_LO(qu| w _j'#2$rtJB1lv.DP[9"[2u-r,nZl^`q&B,Cq",B ts5E w ,%zZ.ZDrR'ZfE|1Ay҉вnpnźx"efí[T$:C,pSo0XeC_6?!H|Yid ̏5O;o!.]iM:M7sV6/:p#X0n%sy+b&3Xv%3`.l0{c}0ޫZiws$5僐C붳 /xB^a7|7I!ݧ"k.qoQt8|DdAޙ.1^]WN>(sHb> - [a :HHWDv-G/jCRpRG>(sRuNdk/?@4c /^Y%Re}{8ۢӎ sI޵G`-K.,"mjɆ8%\R,Wx^i[nrԳr7[P[R9>.EJ),8z,Բw~OBCmYXQ<m4rln^YL}m˛[vjGEOkH !Z8Ms3/[(@zUۄ"b 6,ҥt!љˮpu-ZmB9Y k5 1LIܠyhmld0V х=ȮM|!2(2gam-{Qͽ9+'T8R84 wRtO&!Xdg=q04(| 4X;+L|8/JY a 8$_y&cNPYsA=PӪ^Df 6E?Z|'3cT9EIV*J\Xd7/pfá}fy`00mkd,{(!@o6*ML4Y3C4sٲcK[RV M @1)A1./ȺBCC} wUg%uuV_W/n"Yjdy$MF< 3 4I0Qaꈂ0NE2!BPDPp@!đctUO*_~OJ%RqMKJw~V J??ύ;iw:io8,/-vg, p??p}}뭷\_;/s}iH_T'[3>$g8ݾKar{ ߅X&|~k'`thO'ӝP¤$ (M(?ʛdO?0'̷#a3qه)`F`0;IV 5njQ|iEySE b?KAX79ߙLȴ;NGNȅ% .Bd,KC:Sna;R쐛gP ;Sp:uLF͎usE:fy.6u>.U {a TM ' \AB(9#JpX& x qMjȃEX `iS,I|tr`}Y!6]*O2](j2<2e6xK,uK> \K3P]L=KeU)˳,τ0:%^3ˆ)SO"O#<< t4rcAY'Envr~OjSؚ Uu%!>}\f|B`L; ?},>ն]B~oo,07wHn+Ql`қ?ӝQtcdXjR',y~@f&;7'OMH)64_<(=QUЇ~EeF`MO" &w,1Ĥhno4q73]'??P,!MeIh" ?m3,^;K-(%3<GQkے+l!"m˦|,=w oR?r,GE  >սi HRU+R`C#ʃ"6QETT$PR*UW|t \ Jp -4-e}/Peu>d0vfL3'$Kjg_11'̒O+a &vT(کQy9%%drKj`y;`Fi]z]ð?fI*)80+-~Ot0c2U&/ $L߼To2(A_./w3!qWU,a 3%Mf }&[_H2#~EG: @ E83IrN5x-xȰJnIyCR0%%!JK'=;Ph^˺0_ܢ]w]x)sRf"|-*RUXcG\H=X=LS TQHzh˺u#yp 5F,{0&џhrz}R.iҽeIjBi`l=N(NY~~KEnm҃,6q;y(,?x0XIIҁ qco +Pn}SP۸W:퇁.,$8bb~gpoC2WTY ,`t{! = YE U&@DŽGwZξXxqJWaLne,Cci¥UiC2q"d?`scC5mzMM`Diy]i&-EntY -ѝD&9 E#JT:1iw=PʍFM#0MXEЎ|iBUtYS(<Jy]j4SR{,_fZ~ȡB%y,}Zh8t1R߉ zrO^xBcUL؁hu@&MvCp$ U &Z(P8'½Ŵ80]YP< 'i.3qv<ΟU;&Q{nH̭%ž1+]Z/ka,8@nNCDwĚ MCÝXbIWW-=q+ymĊ軔PqV.N YgTsZL43t_!k!CO8ԡTk6 p6:m2R ^r{SNxZg1R:l0.9:O"23xƝ"Cpi%atJH(5t!C\z}].uEtՋv^*bE ˛Xe?ҽ>s `RLu\]y̸b4!qv8R" 2LMZf\\P%lȀBR%DD^ T+r h/nM8Ex}-(522QԴQTSbuW)1lߛE% 5/'hG&jX%^56Y򏣝*\NÒZtApqوd _dxᕸRqYsV}.(XҧdZQDa{ &ƃ0i5*rFBC~ukYtᅫܹ9*h`"x91@O!+~%QPX$OZ^g!z˲Pcҩ$mMޞUmeW~AƬ4|eᅲg"JMlSB4<@\"*࿰&rp-yG>2Aw ]%Ú8vCCjAQR^t\g,l"°DζSIY_p諪D $Q\bkG?M $N=o*vGk;X,CGa4, k}OLI gDxf٠Kxe7(v2{"I]XL΅>|oӧ.O*-ܤEps"V־::AjQ#HU7Cf4CfH=T`n%N"5bU gͅ:Vݪ.w;9Nv9=aQplI^!+BX{FZ7bч iY)/ԉA:vp .*+egp:.oCs)õe)'ͲE\ºm,qF sr dU+&#CC|[g*UqVB@1]zY t(N$0cTHN )tk-, y=_Ωe@IӜLtuZhsA"W5$mmkwoJVEa5#I1."6"5}qy5hɽWoy9!:}AmD);>G5vyz8C9!&,O [8~t;ի.9CԡIn=p^FX1?.[bJE0ևHo%V]r)&I$Sg1hXDW<{G5AgQM>| m :1>9my}aPڹDm&1]SHO 鈍 j$imA4iфlJqΉa& 6T,igcsΎHRL9ߖ m.nv%dA(M3/Xl!R"&S |dFt'nYۀ edǣDbG;5j o#k(ZyՉʗOelE Gع #3I_j7+@L5qKx(l shN&rVcDqa"Ŕj@ Z0ߐkV3# c?kT Y0&Pt(՜$S{ f J G7GK!jŭUl.N@PLoQgE逢.}Ҩԏ4?CȪ&IN<ҬCIy3 %mEwg8! >w 0˧%HsN}1o pXgJ MYH+5YO&AnVVy.(@RC_+UN\Fio[|3Ȝ*+|Lw1A#嗆O\'[?2MXHf SMe?eVķ4eYL %.{q"iߦk΃ռ\S=탇9(eh2ss;e#=.c0݉,:5_-PXn9R-F`?.H6EtEE(ʬy$cb˫W`B`a`pO7hv[a)'Qao؊bQ6YwDzp0>RweD]ts1,[ɶMŧeGe )S+Noݹ܆ 9S{m 3%kIcb91kvEpPt0󄵚p3enHjFx f\'A7zg@v˜5dc&{v PfX,3 EעȶGZ3%ḯ3`KM-4tb/Y`V:8І_БݵfF51 = )ța$ &aFL BغX!8a/|?4Z^X)mSrب#t .Z yFYrֱg>?ǫq=i@X_=QYf@ImJÉOY1CgXC86aORvAfÚv"v^6X!]v806{{ f]Tia'gYؐhOvBMޒx((H ,ݖvt޼ %&VC !ni_}SRg-&8  EqܬlxbiK D's$Fw@LTLDd,U=n=VzhYˆqwtW ؂\!,NQr(=Payi=^C6i~Z1l\K} t Qʕh]Wb^)Cj;,ȰOJ.jO7w'IOaU;YeD2imS޵g|(Τ-۷n-kzį$WсiZ eEbqURB(7i=Y B{L̎UMt3MVܬo".I LE!9:*|~ժ7C: ^D<xǡہ(. .9Ǖfbs" V&eqJQlY/Sҹj+b7**X[nkQQglpDz=ݲkkۃəğp;ąX7ǻV0+!}f^[h퉲=nsme<ۥP6Y[o .{8@hz(sH2k/yOXfIf0 n,ɷj"<@#w8O (KTd|8J*f0NqZF 70Bit\-0 -l7X\9. l{feo9c=}6s 71wi`YL BqN:v&i?TW2޹ҕVkmzq#HH:wX˓zUC"3,˴TPFc4N^xᢇŊVЫ Q>YW C IEJ5Hu fs5ҽ~հ'ΖEN2p ըf'[uJX] m ŭ\9RNynY[6=Yo5$FmMAHg/XjZV""vRaYE,u£&8XPsҍذo|РFi⮛J5 :nBrnu^]zUr׃$_eX܆ %R+c£QniRS ڐC %ݲ,^6{_*{}g- zZ*d1dihLJ-turΒ`5jOإddFV.޶HUr+(2>lY.ck(F9/Wd{.0c(!o}@Sc ={g]U90Jtm5}*_l"F%y/0>и36)JEpܫ*ƪ=e^P>82rrH%^T+Uzg'*AZ bv(Q.Ͳ%lni.rw_iM+b犸n;I#i&Qn@(n*s8(޷b ҏgj^RG>2.ls@cڠ!ͦ@³ C?d\Z\ai ,r6DWX\P\:eK;X`e$]J;gr(dD4,-}ţq cuئn-^"iDj<=-; ąI.j`$ϳTbfQUҲxN [vF_ǂcM8vA7j5a=!J۵*~ Y[S j?$F]J(g>+tA=f)*'6OdB8 ,d&M}{ e&J9˵>ir7O 4O+_-XP t<0Q{;b}K̥n,Y@ c6'֕voyC\&Vgz. }V`w?]~M|lye1vL ɚejo-,GiLѵLsY^(Ҵ|\qYآ~>\?ֶgSjrǠʷʞ'٧TRx#;=cAn5΋²(Pvu":*_4HI 썈hvcNBY}Cћm\S I}s N]:<b^Je)Ѭ^k4덕͵ ڬVd$4˰*XPjXǁ]]mid]PUm@`XCD4TLND1 U|}^iL,O0FNϘT //{{B=(X[T e{\9d bjaϐDZ?'|d_V muE:8-1=&RAd6< S]j"PD,mZKטuE0q=u$LMO2\wgɫy܍; O_wCHVp(Vy-XIW[jPFkb-FUr <Ӵs 1 ܖ!|)KHFyn@1>7}qseaْn\&GU2ˡϱ?,F82x:|YgA5 )5x{Rs<&.A(t]۸keh&&WB}}8"kpN. )2iz57xxt}Eйrz?t Ih&XBQqQO~tpztz:'|_kE4R7*P Y@yY.V8;F >QNfoWQTE}붱xeI&x:CG+'b|$&f?a~~~EHq(R]"_%f ֟j㶖2I$¯8m̍Zi1n2@@ uK-pw)۽KYs.]͖}\5, MW.L$ 9͡xkE%Q7w+m ɱ1DKY,eЮt_|vu ұKʮ #8̀Gwz]u DR2,jeZ W@? OMZs_HuՅdƊo(3hThXrひ]xE<ٮu?v_R[cpּsDywY,2- P%7}%d`NEO[CȆ9L5ФiobX"3ְdy,*nB,,]ZV}nwHDm"nO+&v_*i NX9eϐ& -1!id@N;$]JsMcO7ђN(VFs+giQ: Vm>㜛.4kWfqڋ걂^݄sw!w:؄\C>VJ Uv(93wAbܭࠬ _hLrsɛӑjQܾncRŏB8j1Ϋ ()D"4 #kÓLA"yT`".Cެ(5ϬeA6yB+M|'-;dqt/RQƼ|8LeTо4MAwsQkϴI"N;)<.:$IJ4b[,8Y%dD^@@T,2eρts rc3XmH!yX9Ϩ̋\f_-:ooQdFn/y+~DpX{*` T9LYLZ(>6ne<,kEYOTЌBVĤ?*FVsj錎تu"Ju"]J(=$;*fʿX} z2z2d.ٳnTOCb?ޅ(`Lt8"P²aګS}tSDNO5sfn_xNU*@t*E{sfgaVy0MiúQ.-x^ #"U GXpQZہ Qesͨ =,p{-euH1n!&t[;tňy;/*ޭsɨAcxvyD(}w2tvãx>:Ai-5:BHF&KXg> xJò:%=ieq\\YNԹvɩQoee K9Y:C$:Y}:bG[B LJGZ ^)CI!oA#g߄17Rxߡ8K{/2- ظ[bɇ=SLBm  t|djYr*Ϝ?=0F3MIn-NãhAQ |?)!EB Oy\Q_y]JuSTZG}hj_d/+J??IFHݟʽQrԹc{G唿+} ByI JJ`֧PƽߙP,R$:<<=hD9,`ˇX˯0,n`6u٤3. Iڇ{ <'d3XibyC8%]1ם>; tfnTt($QtсW<ҳLH_?SQG՛ g=8~w:Ghn\^,B#Ob`\ jK9Uipw_Ãpxg'o11'wq!;Y_}|σx֛u`ڟM{]< CB q c9}CN `κ^o1 }ŀ@(M,XL,∾2,# j1E"rop-v=< m"J+B#$(G4AY Ƴɀi I Ex*e< PϡL&PΝwP.Sg)ux"ű<*j4,X!$@S&c2fVlYB(B[ȇ4&mƶ&Ke#f.,-!t8[%N_Dή/}Ζ:흹^:; \` `R` @K葼˩ HW|pHI-RA<Đ֛1SPb8Fڙ;[:w8(:v6qhP<hPa}- .#@ ӃQt*A2TT"dʠŁ4 `h '!x1L$-ps3$N@ys Evf!4g)Z|>GcӛW9{2B aMb0Y#X;{'`MN HѤ+ZILݫdz]Te(7d]p=g{Y:bdY@%`Rp<)*Y<ъmX>">l4L] (>?33 n],I9bti{{ܸtyF˜Dκdw:nk/"wcڦ}u(QIyFL0s&BRXK'K,.;x7LU .^AH[;}>ƻ+僕Voc*Qs ^"l6EXfׅs[*/bۛOIK&QtͅB{8<_p/QQ\vщrtq4iEL 9O|YX^eܝMKfAoJׁȔ$%3<X>]Qo# `:#> $O""җ% -4 4WqKvzE<^WƼS{|];zcv-,)S S;2)[v3"B: dIYϞfiC5R PMcpMb.k;iF39KtZ{1Ɋwbs@?®i547M,ithHñ/"y͊v4c;|X'Uc[+&K~7 )Tԛ.phAie,}Ȱ`]ez5c %BC j?!Y_;v~|}chZ#kZ3ij5jF4bph<ߒtgc\k2mYpa_IhvNp *)bM~Yk”+PVҟah|xQi".Z?^apZGlpZ(٦zV%eޘV#ܜagD{CIx}yF{X%BB S7s<̱3wŎjӘˤJXN(7N N0k"up~}z mJGv:i8τNJ"νp9G4G',bHS~3#?V A,bnpis]NEYruDm;ATL. u E2rGĝ> &qOą%D}J,8wJ,.JA#seESjƒZZ.v~iYmԚHzY[ۊHa'<.XL[o)2a}+  'Ts%]{}q<$l҄r/j՗cUK 4z輎0v8#Ħ-vAfTϣFUG:Xn22;+<"Y>3K>|BmqGwq H=)~0Qړil9 mBxI7(ZwWXȊglzMgδrWT؍Qj_^rubx}H>?X}xN^0!㝈|^E kY&_ :pm;3F%$I} SA1~;+<7xp^q RiĹ`열&b~GܠK)CDZ:?cU' h6:vl)wIDleMRʰ6-a7Ѫ8-h10́ F\VZJ{DjpOޯAIrKr94݃= Qh/+m:5i^X0$9;bX +Y?X93;9LZYNn`a[w_׆R( n.Yd:m#a['tn> (A{{>tE{n,n%K Dܛ>" CK6-pѲbhk˨xЕhb.͇@aX2|-׺@1Ϭ4GNgFݔF,ܶð9^ىnBL :_m%q|YEO\#=vO#iBO˷mH(Dﶀ௿"D!cW vAaνfF,OZFPVYV~`~=f~gtztfgFo(%Pgn bDDtA#Ԣ1̂l8-Qچ)m@_fJ$,0qh+7qBLoZs(\Fz#tV}Q~w#Z"E3<:oCI63Ұ$E:Y2% S:ab:bZo +|5^_]_X\{la,fJs\yĐ-5dyƒKϢnl<~?NE={RfdUFb2!B1 Bl↋D(x=6jI#IҪזov~_It1G᫃!`,a}>-'Rg@(eG}Kg(⻲.2Z{#)J˙WHay%D4d$EWyk~& AILH+xe"4ˢފ.E:Mڧǫk*ɾ -ފѪI*VQuyv;sX&c#Q$,9  5*\xc_˺-޹2Pᬙ,0ʘHjD1z%}5^Fj)xB˺,8)+x)"oo ъݺ؊ҷa]E9-`RpsP?XM l ulTYf9(:xUIF(Ae묧Z<A|Z$fg1/6G!%,Ӟ8.vf+rCět *ܜYū,Wp:Ƴc,eAqɉqFj9]D @ ;'坨Cq>@>HmFb\|Hʂ_rh8%!Icg,O9Wrz'[q7V{qNz4B/*AN{,ZU:RGyhHF ktrH[&)OD<{_@עZ^=&"jGq4Ѹ'=uZU4O-$pH5Y p/3 #b>ǵ2}6s Jv­0gY#{;5Ib5E{`V:K&\l7yN:VpZCr)Ow0K/lE)}9< %*oyG)*cMq|1#t -d4H>CC)Xpy hM8b vMקrmH(jYv-tn#7) @iMm0%%y nOb?i >[9Ac΢sؚ e5 Ύ"ѻ;Tݟq2UEgM!`aGgK@ys^V K0]9'!U$^چ"%)4V4Fw(E! RJB?/\y;wN2/Qy!A`@+h5c1\Ud_c٬vaV%%`,La`jE0jj=r,%&!; Ϳءp" n! y_]PMp0D?qēEfzW yzUz,5^p 2 G,@lpEtp?,ٰ?=,ʽ&h,Y>`XWç m(a0-,ksU&tuXF7`I Seͬ '务{$mr$=ECi*P̓‘87(_ ~8gc^Yrf=p3HJDO;jSb_@di߽Gj;f?`Hɯq%grJj[WZT-(\4.hYVe!U_- ӡRcDZB611Yly,4Y,o X K̊&lUQ[z:(r I9-EzWu;2QB*Ŋ?qJ`J>G*<5Ҩȗg[ّW\^1+2R ].ffkV4s=U7cZslxXNni/߂40iاÂ瞗Gt)lyyު* *4n`ѷݧ%=t,膛q<*YE64ǘ8Wzd-Ӽ|!8l6rqrZ9q@\2}hB快!6$2l\N:$/uĢ\Au(`TT mv#i91k247l q^(Wf \I|.2WCL5á^ղҝ9WtO„\͓rۡhKz}'wyAudyNJΐ[P\f4iarsUj$D;*)P 9Hn3"I:UT:=4fv\t^i%}b[ "k۩E}f| up u/1-ALpD7-VܮYI$Jw\[o5h'^D0D"tnC0Usj Λhfrv5at1N(sf$%y{g0pAEsw< eQdV"I)hhfHŲ(W^GH*Gr 8#}~iXڀ)΄Z F'.\3\ϑH kq:~`_.!S2K_ H?Z6)3W3ET1n2GvJ+yrC1[[M8މt 2mٲe254kZC)rq@A;n,3.W4tZ:hXdռhV~_\LyUWΪlQw4XL>0C1ito$Н:Lna5Ļ=BDn9zhaK滎QM*7˱Hܙ&XpD:R'$IBnoҵ*X`X1.0%M|9Nk9svmd.-W;BLv :7qsɔYyFIjA¤ "іE͆z_T:mPjdus{m3с!8Opἀ2Qjl4cUYO.zC:X՛ xGڽ7# :[zT Y>x6͢`ׂY~rJRC3_MTO$;Lfѫs$˜1bz%bw5s#U;Ky{qX7Nh%?WdkBi.K.f4M.,:(-uq%3w[d 4s^FI~0>6.Βڄٔ`[EaQs˽r9/)<$jaS\C^u8== M~'J$._uq>*bML-uQj klF p ۿ/j 9t1monF ؚ_/BªعO"W_VbWJpa.]Cww[{{G YE3@k)M͂<_ljs)g aLO&]%w<)d)Ԥ/Y}tXNh\rw\3>S`yԧ.:cL1,΀)_%Jr-kE,ɑG 2{92 !RC-~т>228.ku:pI,s!=+VL NūǐLY/*FQvmd#IV42vu\uK18S=l,GQl,#X-F@[BL '%} 3~c-& X>÷<`hΜ7H˲Kwd)_95~?9gcd ˿Ar^].zwdÆtʹ_λ]/?*PXe)%#UMZC/yy7wZlnxfvC !uآ֡-b2XM9umтըֈEاEp) [T])E5͏#hGY 1c;qZ)ʵgG5eFA,+=a'UCd¢NڅE:M.csIqhܝֺ[?!ܱ#˚}jx 0UBJqZ(`--Xp2YL}4"fW-0ǬoA,( I!z cLcYo]X`:8]t͛7qSP巜mZ'(]KRv9EaM<:5d,18exb:+wm߯4p0|&TY싀ZR1s9g`/#E㕑Ns%K+,7?I;r T]bYk۞)"qwb{ɱ{DzR#eg3޷*'t7,6-<Ϻ?t eեܣcz1ys~B4!<dVD%>{NH.`,Vrcő}6iBi8:uԲYdy,t`iQh¶MRr$tY7ᤓ /hF+!RҌ'K:aÖvOԢa;u}S,gai˻L^0W'&^od5@u7BMGte=Mూ:9 LSse ͆]UuG2 4Ź}n3hZVc7Ï8 K[2Hy)i/:|U\4}8VFb#}76_TbFq\QY994 aRfad5 PӹTFl64J4̶CQF.nPm=O#H "WyXMDhhKP.p~vBh]=hc2a!fԧ_^``MYR8W#o^4N~Bsrƴx0gn4^1`s[^/{oErX)ziOB$YnXjC527b8JlyPV5fdzh&8ah㐤Ş’RCܔIUXÔ2&1z?~;d988#KΪfDg,`ѧB9\yŻ$n54ͲNiܾR0kZErIArװu\˘ç=nOhu]I#,͂ *tKID4I A\h*\k *,&pVFD#Xu@y갖H8/Θ\ VX5'Xw0B1MV%\hL΋ 9 A꯱-:TM^7Q9h*SJHZ0W%ݼ3<|< -"t(7]ҠO<ͷhD#p+/C3;jU:zJ>[fnufJ"ZX8%LxKG`ڡ悉D!H (U -'{tY2zWPV@óQ>!mbߵv] j3LJWFeVŬ,Օ-gA1ͨjޑk/.GxlmE$JFXW]iޙpUtj@ qc|y@2V2oȑ|։HZ+p [,ɂn46L-.bgY7*H[/wXQGhc.QR c[,#JܢsӻjoFվĥ<̓Z\ bW]X6HckIX ޵i0&IRǶA'byʙ` ~k*ڇ|֗ lQx̖ukYyF{ 3*PLeft=Z`,2bhdW7c~NVj^IvL t0PZ#딣mMb4tp`u{A#L*$g]'MإPJh~o02$Yw i v1(n΁ql 6sfB{QDJdܳĐX' vȪ ~S(TH=;nO/0\TTx,χ F I<&wX(aU "N,sg-,e!(\ ``&JQ |/7}k9YD?#d9l"\ђH'm*-?mbݭzI FU0usotn9;<_϶ףدgRO к 䛯/O*jo5b˨pi a!2:jf֋,PTe#`3 te(نQ}6.\P߁o4=\\]4ۭ$lnނ6ejnÍ>`OxJ>h;GR;-UYEwcBm)%N2L îI\]pؾIjw:7KD[\}qAf5ܢ`:~a`4bn*y\ FZ+ms;K# Y休\#'=xOҷhZw1>ddi:YkYd!0*˜jr2g0#(vwGxAAٟF]0̜}qm8WLǻ"[^J*-+쬝5S=En9 !z:VttZ3)\sɡ~~Ӝo3 Z]60t`Olc_f4\rDXcR0qf'/ZD&95cUYC:7OZ274ڑz@lsYfP{S{~Y# 4.dfӴ2JCk&7џT&Bq8C{0t(A >\t ɡp?^-KOXk 4Ik`$(9 s+@yR@ek B9R\8kv5Qa|hm`޿Ae>LC+* A"l`WHpZ3,jamu;?ͱղA@`(tmfmE"DFE6Do#SvG|ʕ>8C|pѤשacUJ|Uݧ:,\Px6n^Fhb- !BS{gUZtࠆ2IKfbOA 7@-q,b&1 s#OPo}E*`ƛx'UL&{8a3jlkHTqEٌ\`R%3JsGY,^w} 󭀵ԓF5\K8Gc27irU}t\ti-Kq," BB;z*K8x[s';*3%]0:fEЂ>-heNSHMz=@$LϡpS_ZdQ77k;dod#8O3jrj $\v+*m|ވǎ ao^|_1Ř]=p &R+zFOF;xwʼnʡC~xEZ b"iWE#M1*]Pt܉תrj)oV'<,.׎ŪQcَE۴sJ؅uX9c5 ˝26&GvQ˶]t>3li1"⸘إLv5i7ޏX%&(wR̿|6Tԡ }UhPN**CTxnjCoMRfaoosw-٧iySKq̓:벦H߅gtO.c@* Kru>D Cl4[uSk7+7 Q33cإ}Yuh_J(C|uDg "˾A܅ɽjߢp_ O{XF&~Nrt؆mKaf*XL_:v>p8B Cҷ,=zyBC G} xgY49I&f?G2 R ZNiPU\QA|]1 S *U">cWPn+aeqe{tsc{(ϓVJ䶛הn+=>޻G?2q>Ѭԅsiaqx8y!e |VIW ɛ'Wq&d7OɲZ* N=0̀&#J IC%Y ^ y^Mk+Ky^zʁ<\@rR , ?O.hr32̇p4w'~o̱4:mJŤ IEC"" xĀ"{^J,8W#) I*HʟD@|2{Ӟ oFmJi( ZE5@X&Awԝ#/#"rOܷ-&IlpBrfˊEdQXq΢13Z x<,m'_$i$a !r`b`I ,eǚS/}.0I&7Y&Ow&0t)b1dk%&1rr,Rv a\^[&L>sjXG[HO ܀ysHR4ATnupfР h@ 'S)Ci])^rؕU@Ơ`W}~ L, B'>î8F( ->dSs*A$%*e>Գ/UѻK}ie51VQCeY|&IU0%f 06R >J94,<K|4Gz^(i@ JMQ ~,hUDc  6f4f^At}wE6kӐِrMAFޜ-{x+ŕc{fy}wa랬N!`v1fP:=ݯS%S'+¾Tyz>}`^`1$ygxlMw”Ē^&g[! ,s3_pdu0 ):PĜA > ץCAbIۀ7KEn }*PhTDB ''hĭkTL#45unpGa^(2u`[*MGS(xe<,.gtwKc+'4K._y6b@>F]Ӻ-N午E1c`w*X2_2"NO Xꉼ&IR09?6ѽ:(@3a .T2,*A'MJWLPOU\E#П.фV$0FEN)EONBSoԀ5ռZ)ŗ#I RM;2ޟ$7snFЙH`9n 8 Qq+EjOktjYF ɀ_L\bE3L4Qڲԑ$Pe^$kԟKGH:UNr'a@iRT2BYA=6#h6硽$E"yፘ ,p|#p `v2Π/p̀.L[$}Kl`I8^,FO`0Z(SX6[dAGR- H.< 18RA4,Wouܹ,w1`Nq[_i]ⰸ(,O)ϨF/rLGeWZ-O@{aezM{{MMr,f^"oeN\A)Y 0IJ] \L&>W;TrDdW P^\@Fo=/VO H.*MRׯBt:%'@N!p7 ٗ6~GD z3%7`5ןgRRlN`Ti^Q  $LԊ$iFiT.Ὁi 0̫,02a~w1dsv RHCRiH=ɴJ(hd w9^'heM&G 7cĴje݄T $j. +걪τx>bed4@)+>'e&a 7&.7gj0CTYC<ȴLC1 B6Y\NC~)Oh)1Ll !6%{|`*JLF x)-Z` qa}c^݄?T/ll8o+ k?Qs߻e>9x<޾37 IX~X71s10]4*'YVju}Yݨ—͍ͭVekU,\x+Cx 0$L[=DI=d![a}_<nbEСZ'5dʹ!1OAԚW~lmtl>f2@m+˼:>QRrU!\br:;OD{m,R? tɌ+ϵ4F,_Yca([ 'dQ3Cp0LJ`(XN0z9|)Y!4Im|sIYyeͨc5s' JxZOoWIVk^F""nz}Hiɭ@sA)?XgF`3T0G4HZZ1Z@J+ÐD AAj*ꐜuvOwݓp0 i7jji=mJ1 NWD/"@I&%G `3AJyp8[Tgum SQ̹PΞxt@4YaO"̓様0 !~1S礈߳w{Ѝ\.gz Vv'*v% ,W(f$ lڱ lגVHSR!h ErtXvL;JdOT&Aφ8u%E3m7KKDiyz2̛A] 6^g?}3xz3ˉ1G-ͳzeL+ݮD20*II\YT2?dPrVO"Lb,㲌uΒ\|*$Dcym2e RDAZ^a!QM!d<@XŞBǐfu¸5åbх]y#<^w[-:{qLIiXQ7_}$_FDެw1dw0;\"FDQ#4q4Ò6fF. F}[a-.pLy!-';@բeJ2rw(8L][)R,l(e4+U%= {D@X͌pȟM4;Yfj%rIP-ls[C3pUS-!ǭ[#}[Vy۔>0 #JLR$Eܲ8ol Tzn~ejl:na3FgїIL|A]E0RJZxkAolCt \|gr7@~ؙ:RTu(3~BC*r{{rV j@d$N8 KQ% *s(URvos8t+, Q^Ao: _B,tı;b5 {oast |.;.gn4- xiHb:CbALq$r!f^*&yBFR[m%eitH 5WrK;#F|\ǀ7Dz](vdH`S@|3Ji!),D~%Zn^ W伎b|:a*"{}#ռJD-l!(ct_#i]q[@nJT`Gc SKף"cv\]$[|/5+D \(HA${;&cst ̵0STHJ=s0Gש҄ FeFbq}yyt_|FbE m*׿+O=WoU:;r3H-f3jf@$WȊBmy & ot]ָ8ĜšPpE2B߃Zea}JE?P>TR[Ь344;EMsq5e73Uec%YcR]`j%T$F4׈/$Z(HLa8SOy²Va[xݮ۱u6fbޒw> k:KA%Ds`k^U[>Fcyx㊅EZ=ܺ]c=X0r z>_EQDb)X]h?Q-.؝h8P__(a_8Wg[xE (!,@Zpok3h8`uP]̾$ #Y|{FaE^!4I*YR'q<+gCTy 9U0D.&U>8g9F>hE/)]zԣOqg..,{(* |e@1|o`Pn Ns T{a{5&C^xQb/M( ZەfDQDQ5Eb4C‚ר"&P C^Vaɷ֪Y44la="Q>JKӒ8qИ0,vrΜؐ(O!Eg" 6IG+W-t%b& M_ZYNBn=Rv@P/uZ.ҢKė,7eϢ<]סA?́rDD9eD;/V+Tjvl? .+?!{>cd!%]@fq4LG)qJhdIU Yh]?[W^GhPpq`4.v#Pw\4ӥw9"\(#l.ƵI`m sic-ɷy}jGϯؓKia7gj!0tqFEN"QŠݯi1=1@}sL2>fuccנ ۗ|b}\캳Q-yH}+O=Bt )/X$<\_8Q獫."dY]R3/ȥv-TRWɆ˃bhcW Ԡ넝NX;dl\%3:\n^Ke[g(8qМ.$ V炲<)Q]*[E u3exY1BXQSh`7D,Ս0ER%q\o )fTde\TM.̔'Dkh<6bxwDFz|iM?<:5:ٺP@.7[ ;Q.ԱE`ѾL/xB]sGZ%Q[OboGO\ȍ lQ1]6n阦2Ѿk<g`aڐ#&ξj@,Ex{֣/*N]N#LUGW"uq`>ʹ<_h,]8^i4U]0v}^|! bcIί(t!|GDU.x`FYz kV Bߒi^@ R $7d&f6Mb^D&`֪֪*[F=-e5Iki^SCg |]QƂXdj]wCU}vOwr|Lx$sx03&%aqY嗋iingLjHp;qD%T*rܪ䤳N '41AGrEAbOS(z QWI3K_^d܃kj2˽Aݸ&{ 7Yq(mam6pP:/:fS~ 鞏kyBZW융Υƙ 6:W +1 tcDrVLbmQ­گ{o*)}ZE/%wЁ_Nj} nc*Uq\GƢ J{ } E TRDkp%+; Lo9|k>sl/7\::x7Vt؏)it'PgA!v֒i* >m;פKz3 .(9h#lmG"Hgv[4h}\pjAIAa"IKW6VIp,7ٳW'|ߠae6kXtm]e,0;h#BtYY靈;t]ȵuXtgD0U*+t#o/)U7S։`.+۸E-h2ʌ),.mZFj]4,+5 3n0G䵰)4!?@1(ܧ|@ EM6z6I銢LեUoWmQlqB):]7mUPdɢ(ɓ(o;,|rDwo^odAXF\Lꉁ_@Зt73EdrqN 1OZs=X[_>Z\b5n/-\/ $x|{އK#@Qeq@QkI500iAՊkfUkEù5!ȑ#)85^:M:%m-i, |EWkZuQpxdi<;F=oGUe-Y+vK$궒L5,8d弸`3PpzT$gk&7+mM7.d@3E7:7ZB[BZ#W Du7)CO#cC{1UP3c&Iҝ x$Z3D3xğ&[(PL},NX C(bp$75&sUOLF`9E,ۯh!=]2 _X2rN@"r,Z S0<}h2h Be~@14*ޘeڥ=,&, wKL~Yodse`$0K͜:U&6鉱 MW&}^1EdBwyZszr(0AgP$Y.;R=km(ܹۤEg+n)7Rxb'CJ{{;bb8&ͼR®1x  ٧@vX\ >UϸWI0fdFF{Uxvhнhvؕ_瞔Eڅv-m(!)ȺSVwp>F6uI ;DZ[eZ8-J}5!+2mQ (G+P̭rQa$x+j#$@K]M]}.SSǀJjW4(%N_(0VL6IIJn:u(' ^n$6KŪx=Qmȹ1 Z~~HD恱ǝE*C!FwVaKEA;¢ԃ }ފt<\OsCĆrO@bK(D.{LLzcy4nޭ]+w+mT[`+6&X OfLX'Jq ^D;66?\:/B o$ Y^y#P)+E=U/ e8"%L MSh(n(:vTւ,3[{/pC8<\/Ud)w5~n_9^fܤoB{{WT6:-mhŸϡdy-7 ͍&2[8wދ{]YXC<<!\t/xv-npr-҅ejeKG^x߹.*qY1l3䎜F~Yc0bIue.r.Xގkqہ6؟[>W8MY[ qd-^G)l h(E^+,gmCE^]~aB-͐>1mlx̲,+!!U}~!7JEgˀ Լ OhQ)dQ$kck#%ezX$tmTdZڽԣots ˈG;reK^jw@؞ۇw`\EIMc/{pމ~Dcrh Y_YHS Aa qv-8q$]G 1@ C | Pv"Ȭx׏mk/[wKvʲ]{ %a6 ɞ)*ڛ>}#}iV<[ql$aA#u>k'6 ALhPv6Uw/M2roxmo?㜺=5tr C_)QX}a*UE0QEQFCI4y ֲ,eYYOCrqDC|G|a6qq|("w:E Gx׷uwRc+83YݬW\;=uzOy¤Ir&J4pϲW8ޟ0KʻX0ljڬ\m̋UUf?K[yYag= pvA]>19bp 3_[Ariֺ\M$VYIe~8܄+5=3*.uΎI4"f[hL4.']*. '[\6ֿALFIA<`aWd3R|x=F5nJxlƵMOӳݽ Q] jJVюVy#HSwCpgx[ɑWo}7X# .khT$RųQHݮ@1tߊ\ƱRF");B v/AIrn[XCO`f4hTI%aHfe7a1S2gֽ7y CTeĝmaQ㫂rAeo.+]dA_N2dBw辟d,on~q? "W_.yЀMbߚVƏ/+V qM&CVpv/P^'!2~x*sA 4ךIhSO;,]"/?|ɠ w K[u甕:d?x(,Y%@-țW;ZFsgoci_ѡ&9٧B 9F32sd6UG^OlILR,k=zod]qL4u1둣"^|zyzp7̧3,9e%ĭQq*`hu׷c-ƻt=qIY3˷.'~!R-s5nMq oMD|i՜\SOBrTf2\rL\$3Ig[ؾȿr 1f+6B~a9h)UbYk xboo"n(J!|%W 6mR!F] kv.=P3\CLq?.qR MZJ_Pس˿.cѝLt5!)?),,BkZK!(dLL@R;X7V9+kEweesIhC@D(A e^bnkg#rroXȞlN6jIOJyph~78tH^65ѮHLSM8F4zCPn$Em,Vg^,t+jBk7r0)q,U{Y|8bR'$[fH7=ry*JÂ*3J%E;#eo4MRjeX;X)X&|jQfr2"+ _ylaA\~7ME a=ʔDo-bGܬ֧'f]HN4 aUGFJusWE'J8NtYF[>yFou_ 7:IBhvm5zʢ1x\0t\eo8|RpFoيc&s+؟qVբ=rH5,lt܄HO=m"UhH_Q݄/ xk!4b_I|˜j#I0:xP|+7ft$M´۽ˇncS ..w[RbAxow^X.QmSʒwv vYF:8J։]4y#r]K    Kec %Bg7e`)6p,[f~A\qlԩu&pӜMF惡v>-)1^1wL&YtTp|sn>,dNqBQN8VF<iba弍jrP{4.M .ʻTy,:.o 32qD=&[\W;3viP69mP1(Жu:\YOMwbQ=B{ݻAse\{>)+9`ߏ2hQtmh$u[qC-(ueJ_hy_9DEJH粬wB`o=sxc/FNt:։uұi˂s(N,41KkD9k_e -Swd7~H8a/^#nWL?K-dlYp6ӁU+r.s%QVl:t.,g8d+/xhPeIB$[,bs%nlFY^7[+M+jV{C?tҋ4;-#ȹV+/޽&azZOr0kI.0#i+zm0T+z? `^>Ycץk7 _# G2;ԙt=/WZ fe I}Ciɢp}̌V}E-gM6 ٬^ȫ4-g-w(X_]U^ &UX*-V(WԱd!nIa-~΄GjٲX~@/6*zsL5;Ύ(i#_;w7R\^ :q@rx;_ܟíb ~aɓ, Uc:,&`1ULtqO=|`_KoWT ).E6 \kpf3ԙ ӆm01n(JNdGĸ ~5Q[i++UH7ps)tѶtD8")G=xȑ_&e;r튂Ŕ;i"CBX&_Bw@h6ۦ,2!gMun2B3셟k;7 ؝ o|~Ns  I 0 ¨LBѰ(Ȏ=@-Q> nXA(4;49h(na~țCc`C}}mB99E:gbmq\¤kib!/\uڐr[󢠷P$Y^7a?"lA9uIwq/)]x7 :36nCnbu rߪ\% TgvP?nf't#i =t{ǗDݷv',nA=N=4N}E˗%~9w<1`B5={Ik$}ԝ ם-Mk .`Isxho^cLžAW3ʈH^|Zu7&>OHZؘr7ˊK'ޢIc[oa)g.zE5io;;еG4+ZX-ye.F~=6&x?$>8ƢP"YxUވ_rO7'+!u,YI+2^eh@; qߙ*=1h*R9%nEHbºĈ Ily+*/&x!a9dӕ'*6˺))T, EeMܕC<u#pg#&*$"2{*J6oOaRQ<bQ]BNZIܝZV\+޾Sr.;8bw" ˢ"fY}i&.teBn oz૜:liIe ԩqE łb,/rus&.rbF7lR^x8X"*aJjc3) Kʟϳ;bҤqdXp&Nɪa(ofYK cohO'=#6s1ȷEPeAvl9ReukJ Ǵ)k'E }| ۳qWR>.e{*fIXy[clSkYm{LΫ/;bϿ[m9ʵTBLM%ƟT) )DHR|^ia&97{٘ t!icqt:&,< jdˢĖCы@I?q2.)9qG@X8.=TKO;&q.eř\3;GpV M"Q Tp;-|,6=XHNyT,v ʫ76f-!aӛW_6ځBCSF}y|W]gaRUv_;-@;M%98".iIB Afp?**;AAv "(J\a߻{]~w_*'*Jni<7g oOy2Oƃl8*|S9jħ^|$5f?aI78|M7m7N7=wSg7'-Ug>Gǽ.@t>K]@b_^c"&#: ܓy%cop M'Qw:9a`Hy^{fix o3 2)N#s` &xVsLUF|<ϺpHh4Htף0 !iԪWVr^|e (2$tYF'dexu` )iI)[[p@@P]aRr%|fW> `ޛ'Af#>BiP(p$sAJvv[4bԢ&o(;LH( A{d8 &,#iY  }?|AvFeh2Gz5ac)N48@0@HB*gpo(4PXND|9!:?ŷYgTyq] F.,.Du2B+fdwm;\7:K4>??;?MFR8ʪ,^+R(K;L$iԓVِE -.,ם܇[4Oo•S@JbX .ter"upҶ? Q0i4au! O8 B0w: f:}X@9-SKaJ W\XhZ^w8̦NE_p,7#-pһ}<{d>gD0^ E Ka*>0^P]&ݓIV^ě@1Ț؉%yqŅZ ,W2,ږ`pYQMHm|\GeHѧ#Ռp:21C'rȾoW]kvHi_ >WF\/MmHNO孎wP2,0(Rz>Y.j[t;]aPO,F[5X$,vCLYl%ɰ<ޥ4@^K# trK u@ 8z KTd_oa/g.q޸  PmK$H @U&FpQ΁rh5lxb?CRfSvUПmxѸ<Z74]K+bs_ӭ:?żП)q_ bר/0BS!DPVuŇF0B !~kYDOK8/RebxC!}Td%)+HP6]⡡bw냰EOѐ疥C;l҈AE*e~[<4.G227ݝrEętA#&`=m^lE'eda4mEhL Xvj E~6J{;t,?3-11FCNld *p++9i21(ȮKIYKiUJ4I|Ɓ_?2` iM4$4@Z(BMX?e磓HA#.q{iZY|Bò K$zL 5`߸-4apLi{|IhtQ#ވip&RKq&J] 5D}E|j2Չ"F&ZDHLnq@SKc\K'?s֜-hd9[J M@5fu@(B -yKjbLc?5)KAXb lxT qef1szθq'C0ZՏhox6RjeQ*E7S? |v&'4,0Ү 9뤱^Ps ?G4ع MB?|B:qP(+\G4X G4%gӿ6Z v9юȰ`1 ,^QE'ʹ3LM^BcAE> SÂ^n@"F)H+ (Kٽ K7F.f{`rN?C{\,I+40ݬ9G65fY`!w0ɼLDy4jՊ°U(OXAG(mI#$#Q IR QPNN$\ e%-"T茶?&Y)_<*<=N/ >~Teő\:ù-w8߬#0`,0?H٢6$Eµ R.hiɘ #FKS-nڪma"WVb{4kֿ sQLxM`Xd⢋}+Q>J<q1F}*Y8Yv@^| 'lTF *ᕽfscVo6xe@ u-h,C=?Dѯ-eyT$z;( hRG}t(B?w[ dK]ea:OzpwjP@`۲㑜RRGX}EPp"=G%˳ .H} ̘䰜)X\OX& T6rKDyjR~ř{XnN'8mرlémMœTzzbQS0ph%tF|A+sD|ja?u3 `3SXY`(PS-2'?E8X2XE.XF> .+ja8l], $. PA8`JrK_M%?&t9t[ uSQ$prŨ(SSr|C"רo\i_R7V2?Jg~:EalLmJU!2-E!arXnlns30Il'U\Uf ٟCF,!fË<$"-yWPTgLtx`t x.UOzTNc4Â5,:5dȎXC<,) Yd D`l)Δe5„<].54d`jzXf"7JI Dx( .}:PjU+bQXM;X Lq!"mQ MǓ 9ו{YY'ZX A-lX: ^j`* HE]֣\w{.}{gJ0f(:Ԓ3vUr x}cz"A!w8uR?pZ?P9=llL\ ɲpO#1"kޠؘe@m.5?S:cBՒQ GlKj/+fH]4]d;OʹSNr*̗]?d1_^!`u5.4FUHE~%_Ydd/ ˘gU F5F9eOJWMAcZ;y]eKA<Zٺ}̢F92RfFfhڕl4HHVs92Q3w .fehh(cbrU7ĚG;!\5%E1*Xa_k>~>S :$AR๖ϯ993Ɋ (Vb@0n#8כsH@:&P2d>15:8AA};)~\̺JrYXtwXb.77xg1v\HOpCiJQ nV,ao%syP!M?`+t>\X'nR5 Qaqy@, 42{g. Vn#-NU7KKXLGs}SKKY0 ;Cv,#f&@潊:] 銸%=W:H\ip(t40l8,K#b ŲkhEi8!1Us b5UX2i,ۨTdE Y5E j++n଺qɓcfP(aTQ*l#L:3=%h8)7 ('F&AyI e X'Jɘ(;Njs ( ;y_`2h[R"u}j2 f`|F,,Z)aNޓ,zX ZGzp,IRKw疫9yYD I/?k?zia%TSlPrdYʖ/ z.R]!}e6zéJɐ/)5kΡ%E/Xe)'L,$$m=>igҒ~w7g@L\XP 2:gN Pʗ(TM+k/lsqFF~JӐ8C$/5`xB=je̩%fE}dh)L'tr@VlӶ[ZHcЏ鐎p"MT@ RFERJ1qUl[o&8mE%錢!4KnwTͨ569? CzҺ,)6& +tdȝ@H4h؋ ]F5@`kvج=2^o-~i?MbbE?ZV|""3|&:5/USw$aHS`;!qHM8Yz;&izK%5?AlJG]u@/XG|D??SNQfdB)ZqB/Qz{)U4.q7RAr fEg &D3hcb>cs93<#Ry~Fga:"QdX]FSܴ)X}QA9EC -J"dfOt%|ijhfL' 8sﱜғdpfށ(+ XKBa%F* q~b%Y[DV 445s&-׌06"-"?MZ96dIq}{KBT$lP'hjd<(H(9P/-c6ohR !+q8(J4؝(c&F &r"_\tRJ^0a&k%[ɐҤy"~yErH4y0КN*gv=DN4y!XHJK7m4=8h}c=y( tk%,we ?t Ft?9_E+Rp$=#4qפ_>Qʷ9Nx,*+KΤl ͤŪ^]6z)(2j]TV-z儾|I6QHD1q`وӚnZvXb.*QRB/=`<׹Qv >Xsר [\8-I' cӞtB9Fq~&]^Z|ŶnzXsBfl>z#J$4n eyFnaq: 3"MW)VZ:uA,\ </(nU i#ȴ 2ULgoZضTVFSC(YvF96[I%KmDJ"Ƹ) >!35th#%}h_Q-%`bAxFD6R©"nF[NNŁR)JVQ<$APVYao+6.6r( 4t`Lۈk6-3iJ0TEm]h'sxh7f't;͝=",(,Ѝ7/pc uaOiMd[ ZYT.\efBuiuGmN#DsTѕXS0n]V:UmiX@m .=Ζt%Fez]2k d734*HHQumlňb=##8V;)M,^OKbh,qA@I-`[l_q<49mT=Z[#W'@`Ed]ϣcTd&m:WThaIQMMV1FK̊dq`/#Mo /4};:k( m*7MB (1lYau&^or\gd^,ǭl Q2$0̪SfŤ Xh>71KF?:ȕz3Lzmoy1RK8Ǹ̛-0_?aXq"j`m0g [,)s xrv8ʊk$|,թD 58#vI<$?e.Q#asE1.PU Ds3j1 o胳fO4UԀvLhAY+TxWxF`[sZWgnhM@qIQQ] px{"gg]iwgqe@dD\H9M'6c٘g"ꤱ!K7q Ao AFuBx|55$^M{-޸E7Vi8 YQGPT~ŕśU#00 sAo!y$NG~˝97ڜnYhM9.{oҗFkv>!`/8*# YE,pJj{bW1-좤,At11|EcޢXa@-rˣUEE;s4k\ -J2Qi̵m|rqDfԌN:-pVҸo]G|̙ECa`p0ON"*N^mqOA^\J3+(!}7 B(P&i7hpU .-|ؒfFZmN9AF`\=\- (xDjUޚ48ŷI$;YL-"N3C$:Q4KtK%e/vFuwY*Pt}zhllHA??敗&'ӆqL1 M˲>t_?6(9c- HT4r,:UQ d5@;,l_m\8נT[aÂRFo FG HI3\H:jhU)9&(y)7oٲBa=BM/#nx\E&ɨ-6(rK9I<XZZؿI <,;-Phg)u@Y/EwI3Y 9+dXg}wC SXܩl^#op/Y= ka x[tI- O[ qa۵3TYkmk4ZƧ ޢ`_Z812#YP Khn.>cTCiWy9@*wR/֮9/g-dA:Uw[ CK]PY"W\+qL0Ra"P̖d>aY Mؒ r)=s ;쌎vðV}c>I|ȃ_;pWԘ.HܾrW:$4+ƙ^¼B̡r}. a.Ѡ1Jl`Nf4{by}EQCci5J XH/X 2lR&t%nf`$epT5m {b,\b;G._x f-I0׽~qt K+* Ř:U,MCHYƒ@{D>M)[z 4na(W4Sy=e#0 a9>˟sܤVɄ]/[NsmQi 5_?tQ-)zXRE ,øCף)܂|wCREO5d7l420jߵY [Z7,-5̯-zRA0{Y奎d?HXȺɏ y;rXJ1o훔L$ ܕ2E!EoЕT"sƵgJ%i"6LrqErˍ*mJ&xZ1Y0' NzZDk1(2YyJ,Ksp}NqA1+ qV ,8$ XnSQ V H6Ԩ t.d#z_)@ZYy,hfl 7nt'i9%L9ݴѯXON b>[ʚ)'|rpޯZh훓-#,x kL.YRqe0b9t1F膟?YѤNYeU;1 ` zX[jr`|/{Se5H?ED"~L c8Ng_Zbd3_&-Kktudyɦt>䎢v6|t(%8oX>"$r9tVZW` AaB0a}y sʈb|Ζ'9GⒷw*HبcIU}~goa{kk8p0 Z(Ny">Wi\~"O(Qi 9 KbBK} ~@e=LBd !̽FذDerm񢉥n^Ș زs癮y\a9tKFw5KFå Bp0ctCKܞ.\@ VEH8JTshg7]dX(c./RE4ByZnxFYJgl>*rrRi0j60kx(nS)&M,zR΋\dž/bON#8ݛ>(yzjv1q:,[,$ވ^3w\9`$$ĸ~pml➌*K]x6`J4N}6pU$xro5DI)l[4ʪ1*{D{95:XW~M0QŮ{ |m lWsAm:pgb!᳿/)t<ٌymqTng)[ >rXnһTOtX$_k7 h|6YjVobz_ ~Im9硒9NEA^bK?3]4n_8*RK|c2} 18 gd\lĬ3ͅk{ȹMl Sʄ^p6$Hn _jj҉ 9 zU9ٶ@e>ߧ`;|Nh5d,U:-q^A]I'\^@X'"CL901l17pCLx\cϞӸ+ V'  3}K0R;C ([Ύ*l<'\E@vk6D!mW-:틘5."JSOc8-+MO}˘ ZH*atJd)PR:({!N_a ~|>|IYU?*yk8.qQĻӸPnj<g/I$tq X|etNK?׶u[XxɮXz"JLI/?`C&(vy('AI/b~OyDGiwiB|c<[r\*WhF]iQ_伒q8jX(uH]a>^L&c0yH}k¯pblާF_B8s0bl^ICT+Dlxf] dkiъ#VIL}EC3M^ DzIlBX݊9*,$5߬T63u,dتx]~ k>\YKy%)GIkӛ-ˬu@ ɧ p[+Mc E2gs0 ?s@h:o-)\c!O=3f٠"n/$'#*bJ&)>D5<>ٔ9d:K@[n;P+zr5낃ɊLح!rg1s9.W3J̖(q(ʯ]ka~6dK@ڍ:3D\XϘ|d)u|.`t \Z#HɂIn̷+Q 4%qp_gQ?"{8\ e6 ms2rLc:LV X̯6˓\t{E K~\QkYqSZqOz W>Y4[*g0pje Q׳o"u39L@(H[j>MͬD:q1v E{ۉ\۷ddݓCřk2F^1mШ0@bH(jJtaWoQr>;;6,ɪ!|\Ax-xƸ$AYry=ču6,˲^2I3C  yʿ>ާr) " X#%o[ w'\Vahb<}Le@1s l/tIZ);{Ԗ nEL{U)x ˉ]XwN (b@7Yb8,%ˏXJ4J:ONN 8!iߴ8r8(x(wKM|lw"@}9 QJcq{>e;)lPNzpxxSU F6Zp:M4*ULm|l[LHa5 ÞӍoeC1` &E\Y9IL]8)d}8$ :Mm6 ,(|Lž(P"2Uo/t}nW1,8ihcLtW)qI0CN[:.Ѧv%ăaDC~WUKʈoQ"e*w*X\X!87N6(y3!63\5lt--g@{X|*N JXˎϻ%N8,יոl;(f|T2FRAbvԇBc)SEy0 S*씐(%x"DxYw2ap8e6'Dq"ƄC+op-ahwh(&Ei@rWn eYr-ֱ\< ST$K ʕ7NfC|e$\ :W XQDy(Ej$% aH^h(;dODD KѺJq0HZ!XEkf{=*lgRV# s[RKŲc]- vv.Q !I=??Lq b+uNmHU86ti3cn;7n=}jh ^։r;Md:K2ıĒdF-%a5&̱J҈9Q]ChDy,FT`yE/Ő .px,)ͭk 55Sk=k{JkkNܞ[KƉ3 s|%uF\V!F8Ձµ⍗~(f0o ݵz&4lM/p]rqtXa~%\J/GNN ~}mkcKBdt;w%pBQ5*ËCrvh'Ks~@Uv⯭+kAQU=mE * *!QK]+S1tgGJXفZPiT*u`(nQrp3_ULyq:E8VJ=.Y*, JI M@369sާѤTV+tET1v K[rK)! 8ژAd#9A=iAdۀ_I ǶTJ6]Wdm͖lI#.7sK mPAf;^cKt]>h8XZuZ3Ͽ2٠-Cr~kWN7diх~BEdݪфcI 2EHoߥ-EK6-ndVnЈ~*+ҐHSΖ,̟&zMIMn)IeP8Viy|xxkAC'XN=)U,$ IID$!mxwUKiwg.Xxoe؏1b<U $TKEU4we9Y1XV$9/h #P;%N ȗʦG⁽ A$g`3ZSm i;@U(Pn/0W}|hg| ﻦUbZz{EYnu8N~SڨSTqE}B12kt = fgl!k/{ԡ.ZbGHG6@S5k%sK:]Ek 9#CSwgqF/\zvC?@NN9!$x7Z6hV8veU-tzH9=_J=_vuں/ȗeĢWXG9Uژ}9<]ݘ*bWZrkt.jE)WY rAD:Iky_p,~gNapey[Bny*8qrɢmڛE ]gvn2TG BFv=97x6N^#M(:FYKQȌRiFV[&J 85v.3''r99@nZn&Ax̀lt3jަ'>9V},ZnN!TA0a!A]!s&QQ7isM0i+monQqjb1 V0h u{,9[5a[ċsN+3feLcRrd j[6,*m:׮  ݜKli/ޢYpt|a)|\bW0- K♳u, DH#[jlXEeYoR,5N%;x<:5G~)0;,׫'lb*EJ.%Mu49K%mՂB-ZX6ǑW.ps|*XN04,F^{=IŋXb))r.Q"+u ӫmD\UCPgHHF:,Ⓒ@._66j }MG9 5DsgCrŝ}JKzp&m?j+OU$ƭg.Ϝ/˹1y9o +@UY3L> 7@>Qv&AYVN5}w+ht(5$MedYL,YGzYH&}5]FR蠼cwͷlF'7 -D؛@r]Po,/sJ &04C{<¼euQ:f!`"'9/Y[NF 0.A$ɡ&^K> ܨ1C@Ҡo o2 [jyㆌ:ڪ rWŞV}L7 I[Ӷ5HJk2'Y0ubX2w*Xti@XEPRKd"V@(l$ >[n'BwY~N!aV*oR ŲĄLQ:H,i&x;- >Z*Ptf1.hcKhDO#n-se*gzX_߬նjx$la:'bZ@b xLBCC} dY_4s~YifƲ~ݯO9eKk㢈ʱJsdfKJb8U@+$@b 6gymW?ՠ;Uc[g#ׯ?lX]gY5d8ivBDa;:>Ӣ xE^OZ((oi\d)@4:$Y ;1p>E(ϳ&9#wp*oRgP8UnϞOhzr`{M#zN&ny}Sf}\"3^-0cD7m"sۧ4vcZR@T06śnVƀ"at$10CTRD}t X՘Z#8;YeMi m$ k? 쳙bctt plS &V`||vEj6DC R{EZi/ɀ@/ǧkf_ EpK!2 Y`j-˓dm ǢBis(`͌neQ\$kZeŲr @Y(kSIM8V+~)%i gr eRT fu/M '-;-Ө"gg nACE< Xti L^XS|+/.s/$^ӄ# ~ed r|q> l dDt+;W-@s>wg&j@w0]*bL\*Xj:XkfLs+^EӅ,&U.dd*[y37dHIAiI 1g: \ 7~C }T =Pb̑Cܬ4ˬ3PհXk{NXT쓈r||D2HLH'_1b%;&0Pcc( %RO*8L-,wr/bU(JH,[ߺmP>׫llʢWOv4-cHmPea k}818F4̎m-(<\f}QT/*f,NɟlK bP}'#80GISR$%o=i:f <H>yXe {;8IL4\ (d!ڿOTܺaE)Ax:#=>Zȶp(jFz8P 2o9r]֊4Zr*U 'eJrܗj 44:`ɂAǷ%O Ư\2,kc"hr{e,,hF hAx` L蘸\@m%2]skq,c5&tyRSs$TKyuNbB# LM<cɹ"i8 C`(,,|Yóbaay,,d^Ϲl,,эIlQ'mH<=Q$/R@$HϒcZED"p^uib@ntbc- Cк Ѽ~>axt\4 \.hYFF#2! {N]H,~9" mNiɋW*tCadB睼StS 5;npXBJ;/mRp@_4p,Y b4#-:Lj MWiGfXM,/h^@.{5]JES*]2)Č_>I||<<*``hJ %t9jGa{gg$_O6Dtd@M qP"6:w:hx}L5 4VWgâڣ;rKxǼ7siP~vPnk S?w1W\={O`>>0\FLaֈ%T3F8 <0 ֈI1ic>}P8܃rU{t%7P} LY֠ ^\^QgX>*w Sl0|<R%}#qit'=$M5Wy(ˆ- !FfaT2Ē0&}Cr2Iʓ(_7*衏*CU>J?(DI{1MHI;EOS/qX qDyhhD\pLFBHLہTa$mug2R9[qTMRFPKQcJE.waQ2w [>%ŏ8_3z3()-NPq:x2WPHB iwq4%5DaH/)"a7rD, JMH Q@g#lgrS|ɥ=Pʘy0euI&/*_jP[dH. YPEEl=P2~Kj٣i)MNq/9' d@dq(\{/'}Bx\Gd }!I7AK`H<)Pr^ d*Y$TR"}JBb4и$": aӰ+Wnsdmq@Qj@ $I &S}"܈ÃyaG$hCΆaKa'$M/PCJIb Lgvr@AJ31D#NP)"NsCyTxP*"LCGh*\DI4i [:!x>I;s_@QI$-YtL$#q-V.ŎA$fHbfDr^W79eK>n$JFi}Rb|@"'|7:>S'HXaN4ɣ:;2@A0C 7_?`((`9,ebyCp[XMk%㫕s Ez\ʀy4a8:]`)ez%W3,^&+&~|QZiKXfxꄲ.Z'7yYCg\? d;`k:7'& }څ9 iO6?z(JLu G$X#HoXz,Cʳ:,/w`Qa=Y5&&-'o bMx{p^&70`C'yC@Y檮qY6w]A!lS,ṡ~ކ?˱2R"FT9}oOl2 D4@*>,5 ԹtO8.Zw4Tӈ1ܘx@}g*`[ 4 'D NGt@/GCyP¡2JИ$d2c&a8nX^گK%Cb lQȎ[tzSSLbr,R4 (<6P.D4Q ͂toV(w=A.؄w{kGJHW{pzvdBlRbk3ɲ8E/&t}<ܑ+pqY:tiZ;[.U0qdC SA;#P?k|Ѭ+ qM(T$ܛ2#E0K"`mi&-M{^lӖ­6pJsTq-b>Y`Z~TO>dqKl h_߰#;VIrU 6Is0J/|0na$aunx(I~$4u>>޽' ɴtM|鳀q"[&Noqe~Z2/Z&b.W$ M" X%PݖYo[8U*U*߉ @?{X&%liq<.̽BHVɘ Gh?GZP"F0*5Nzz'Sfdžnn(zHG;PȮɸW .:1C&/(R@|^'ƴ艃L8ɬ:Z7^5I1p)Xe-+>܏E-ł8V(HR1y&b#[vť@6N@,]14 h[0/2G} Yjr@]+1l:µtXVCqt(m_%vv>_1 $:&; )Bht7 PXL-:q]!|AW;)C'TdVX!gHqe-yJAb:{OJʸ"i>g%#2E!2^!*:BBٟM&!={BIoCj= m Yfˑ K#NDIcOѰJ>f}E 1MfrВ"DAy3bE9 εl扰ٍNKPFsY],,(oczeBb;/V hFġ)8k .@~Iv~HvX%ȑf miWT-iع'^&`}p[&w=:9 ½98̹lK V E"OgV4wx&+jt=~;^eܑ0s.+E :.C?-$h%a%O P@td.WA-Z-Ź6 @6WIx\J%a-f~!G/>apл4i" 40 'v5绥+y8틵'悜 4}dN*|.2-lHT̩d701u^X2NN^T.[v[Y*pv.78&Indr8M7fwsQz]f*iPY&c2g5^9r?,Qm6YNxwF,h/O.I:mmDxe+-VVחv;ʍ7M%v,HAg z܎ÜUt/]$OdVpŽG(fBVLgCn–gX`';ۉs+ }Ik~]iMYPvEεI,F|\7v!@R{` |Zp חM,*$Lj{JDx8[@'WvgXUȯ:wG,ï 1hod6ngVr݅.5_m$!Oz`m0aNhRrUl!y]eXP&/O{=Hbq atʍ'o?,N:@ b!Q$ܟM<|QЙ0yB Ӈd2`bSYڔ9QcUwd1C`= lɝ/ Npz4 `C/V<&$hmMo)8Y$f% f T1FAqϭI>wZƹ6 a! sVrPQU)[X(L4Wo7nႿ̻A;#s<+״CdM4-E娋{VӪ~gv_@,fD 3 @_ۂӌHa`89C$jQ5O.oei89˂ŧ>&ô,:)n (rm'pI@4zfa9 0d&ECr|@J> k-R{LpJ$ ];6dP%sKD3[ڏʋ´w)&oS25%3C"֖LщL^R%> شTw3MK:Vq|ujnN,P 9VЁ[C6J_VZeGXk)rනd|%u;O ,>/}%kCB$D2<m"qU˵Ӡܥk tuwŔc\CaO{@s4^N%g ex' -ArXZjw18:{<RZ~y_!ћ7t6%@~$ B1{ ^\XK 7} o#Iuޅwx >rا5Ir/ڵx'HIPB=vgE %]wƠ,2nͿ3ojY$=йJg.anN5ve%2e>8 tb .Yra"]w2aprAOۗ* 3= sˀj1UuƻlD4]!VH a4th#KV#f1s5 A2 01n:r:Ylء.ȹ\C](kv1p4q|ag잧h'[ÜɵKuvVB>$Ibc8:UP"̟Aᜋ&k@m"|%Ls:)Z$r 19KHqƾG5=/go? e~%5& AM²a|v1eC˓do qoI}L[Y ;.y{HR fτ#$߿\nh Ф'|!l|Ծ VYQjD(X,NX>Ps,?< Sd>m@s]„X YYAX=:qIs-F?sGd2&^(2l$YcWw]5b?JU>*/X4L1&͸toξSrް{ϖ&AQy|%$ƴX=K9-({<y9 ;?dB0{2-grhlG]moiXQ» ǁEx_g''s"v@;:"}F(y{xu0@hrˁrZ!NDF/)+:\t/7ϮI&^VEl,K]G-וʹg \/):St.xQKoǎh%^P/f[wV<Κ֍ lf'Q^3)#jL|4|ʟAGeAܳlVq0P(SE ;pzꔁX ހr{2Yds˛}lM#QIcErqHLnF'|`yThWd-~5Xayԧ]ʹFX =`"qVLre8? SXR+WHTx%UXTͤxK1يо2YRX H {rHywI= I StUif+ L;;ͩƔhShL $ϙ(#%h;~ ='d]vd25R)YэS_*_ ~"yJaNw?cHW*#khV .zc0gaN6O ό' e^0ErnΞoX^AM0*Ƕj $ߙ-pvJ`lo Ȍ;U<+ E&W~Vko^c !e2s|_b]SQpCfu$`$]P|ߒELi}YlL7|j\-XK99o {D*Wع[=&#˅xHGMr{In9~OqE]N#A7NYުMD;,)Aw3XXBSPsyºxIKvmV]F6n!i4]i*q%kU$d\mgCrɩxV?a?k5V7)(}&=; <6T H"i+>+kZW C<\7$C6iHMt ,k =6Fc-;2sn'p(jeL)άB -gmqcD]gajqQ\[M<>t ŸJ^~y4~X'f+k>hiT,jejkCnK05ꗕMqcXT55̮nB q+˃[)*c#yt wmPc |q[7:#m4%"u*!VmZ,"[?/xW#@IB th$N|-ֳ6XF:V8VQiT 8khFC]< }]g7qpOW86j)R7 'uCivޭB/l^f5PlQ7.H<\(v6<4w'  R2YW4D&ŷҽ1D9͊7*Sqb ,0Feew?c~:Hi Sg嵕d+b$-" o3JN"K]SB6hVqa= PؕfoV߬{NL$`%Ϟ,\d9Gn1",nq`֥ɕN.L4%.79U'&a; gerћN/4M=!S*䡋r=!D/iE-8g#cd#$P(И$ӢK1.8l/h۔.5$YAwD+ drիs/8t nJ6:7z̹+:׾kŅV\aw4>(q/\Ety|,8#Ok8[;R`@`zZ ! m?3ϵL4k[ܦ0^@ni݀Gp[V }tm&^G!Ht=X`,I}i YR$.+kax.(8^78]NdU~> /龲oskE#E Es$ EUݞC>i^xK9kDIn]F -Z${ZTd8MS+1Q5&4hĪEA1"╒ =;ûe^L!oqCAtɩioFEvKB/'ܡ#3$s癚 yv |Fb igdaghSkyDerwzS䐌&HXH[W,wR cs 8ڻN^i"IYWί@Ğ5@U8?*93Zy.6)QKoRvwq*p^˚@v^9c]:@^ ćJ?yZso6,{8Z112;\ bm|< Iϡ~50@jJP!)MfhN0%THYxySe{0|)(<뇒~k>˪<@nȺ0 (Wtp2 6X@ 8ĵV DzZAb޾@Ŗؒ 2[csO =`^];(Ia pѐ'yM5%=mjR!Nu1^G[L>-+CpQ,+X0'$wc:_)X'/I9.si#wD,Kj JqLqB ҟHAR7NL97:n{ݭ8qo`|#anGɥ!pӁHK(xC(v1N& p^1B@z1O쐙B$뗮ߘmŴo˃ Q bǻn H CH=A7mQvsd*2Q 5c!;t,_P%3IzR& iL*2"[tHPҕS#`ZGڞ*Q !0a $cN浐u) =>UrY8B3pNvٷ90qiͬM?V%.1؟.y`/(ѩRp5fL0(quRUJ[Ч/tAZפ7l(XPrT|例\(އ"3Ҹ :i[&OX|9ʼntd݉4DT-wAg%*dэ$B"y]0jEE}SH__rwx]<(P.8q2ȷ#Qt|Cݸ$y U9)Lꌲ%jnp,`_ZeSƈ-wvIvJg(>MD{IwZ a3:}~ND)dUgD/ߌ'Ɖ[߬@>h|^giF$x$ͳ4Ar=`?ˑ-h[xᏯM 9.>JI2a8OYez)$韄J~ぽ#0# 8 ݺ8,Z%K8!=حw,5lU'RgEw#IOw[+{ZAbcb%2%p3mI$VY?qNS>w5mp3t6d"[- w%Ͳ[b7)9nzWx^,;GR,ɝ(3W,eڤJz@yq*{pP6w[HHO;su qyƠaݤ6x%`UTwlS#:\C_ߦuL5HjһQ TЍw^ԩǚZ$NH.G Ikz./,Zk˛˭K.1oXI4sI]L5|#Ű$A>qD9K#V;,אhB^ d.`5x Y^isLF T5*Xrf{@:ndօX Rxc *}XC׶aM2ِbYEv^R{h_ *\HY (cȼ`]Վ@ b u7,䀒3Yu>΀g(͊N&;(JV5_|\*>YtqTww~ƴs9^";NLKPnxL{CoLb}MLi>:pk!_MePH7&|=[$TǸ;r|!IbyHŤ@[s,i]ӳgv}Mൎj`͘rNXXmC妦vixd}X(f 9$6`阵:o9~sڢYH~#M͉툘$"k2tLfsfy]`eau*!$[7; 49:,"i'I2Uq&a%z;߳a|L ќC'Sθwh| '13 -iHPQv@FxFK,(+8!ΘV9b(μ8nEEe5-!(r6NU-vagI.f{ёQJTʰ,irr"_kbhs}L$^.s/p/ >ԕI,w.YGnf1H+_VC]s:%mVV8 HMR⃾dyJwYf' fw\%$:076q"q: @IL3%[yI>(b);8aU]W{pDh 7G:fmepid{ߒBl<%7Tb$OMXK{m%I1IVwlr2lD|t@1CGݤ%XM9>,]Oxd#t߉tR h6~EzEC RVۛPK\_` [i(3!gbiY,Tg~z$F4RE ObR,hEo:<>sX-^nn X%W,2 ?#2f0g kHs{7󕍍Fk{#JrZ J@Y(K(f>UJ %i#B`,asw#,{1]O&`}cLKXē5w;1n'eo Ѿ:yrÓ :1*/6:p̒6\Uŋc"R^?֏x-Q„m .,y[kgzrx<@Hy@"-Z[v!_&l䀂RAy$:6ULN*q B(؋j xzBC+E} ewUgW]]U]UդIL%$ݷ{_tUwL"38&2fa*Rǧ0lT dMd\G\`D>u2ݎՂ\k׫#޽ݘuo Ə>۷`2ͧy>'t2͹Ao݃`|p6heY7[[ӬG'KcSϴ_zfgvgw3 ̛3LӼ_M󪚎x$K,K eK)!uiCWG`^/!| $eFhZ1@˂`<vZa؋T{bWcwG=:o-xrn\MI:)i5 IZgOҟà #e$Ytd)G|<. ABe&ó2ϱ7P,} Xv 8Dy?-i`_aOpK:,M΢{$MȢ9P*@(q>({Ka=&.C$CW%cCs`iTzǁ ɉHS:I # O'# hAR'[@L+!dhơ$2DɚYhX,Q'tð\cj -Et.ps` gb@9h hҪ= Kr%|ΠkK587$@V3dAC鬀x,JY;O'VԧY8F(FZ.d4p::bGH)AQ{I$UrU$IH sir;>(Oq(jV@ՂѢeK\$U.(P{x3uS+Fݰ`Pcmp)g7uƒ]$ ڑY }cMoWMԷ~1x#` Kv:G3Z[u|B )GA*DG@~$0v54-K8y4ɟnуB`vfD q |ׅ;D ۸6,Ee>,or.ڕ>t\UAׄXՋW4l,R=^9@C4F`áKF,I b7 2^˺e^IΣS 9PhUr 8;As _WjHK9psjuP6[iwe̩w;.$QpYv4lflH'uϖ| ]W5B~ބӐ[4_-~6x!]W -<dܳ`>BpoYRoq() ]iΐ H r[*v~!* L 0 w$ۛ4!#4Ejո˴ m`T ݴ(;bT݃xN}iQPbg>.a:`NÏ| vŬ@Pux*Ўv1%pP%S!Q8U=쵿& 7ÝCľ$h4F:0IଏCԲ>va? 'hLԀehB՜IczA̸}ˡ]?$xTKjtc`"3QbD[uVı<[y QA1|plO 0>[ڙf5t@^XbiY|5.ѯ;TݷUG#>#`Lm`B-wyY7[qdǣ_weSi^1s?_N y47m$QP"}Oh!plݖ޺{Q",Z\ $NX@`#;ѣ'U0 W[-% D"QHLʢ0X$Q4P 1q`=Xbx"ᤓ.L{QZ1LGUZY $Z*.(H{vY95ZDYMG\w, mǎBKʲWp$o5lQ˫48& ۪F݀R(`?'H`%JK}xq^,eFE Bgͪ#.V%2|5Ct#b41UCp@lƨ|i(Sed޳aXF>~ȡe>htc}1wt=Z&!'$VKxN Gy LcqB ݋,NK}"PC&>/UYMb#5[`6%-bU6\Xma.hnv!):&BJw]\JjwO`]aј}&u"5409, 6 8lx>3ҁ+=e2?J(^&ae6iy%ADWvX^,IVb>а/k:nXa5[.:VZ8"$!bQN;Kaea)#cb:BFqK8Hۭ hi]Nt aP"U)-C^,vl($" ,o\a2* xف=ztr)"L56Q9 x +u/ȑ|]"uxQՁTPB%Qam%OJ2 Gc<{;GS$%)%eEm4n |X>kC9y~V9Bɬɚ١Tɝ>Pö\Vo|\aa$ Hqa{!=!:J5M5eenXĥ4d0\|ġW0|J׀8 ZV,]Jhuq;2[O@64]Ҏ?u[˛sZ* }U.cWr}aGv_.5oǠ2,AbCMpG%uq:NGҞC`r<bFk} Ux;@Xwaba~Տ+4dIgG(Ye(I:A8t쟠:ha Xclӊ2'Q A PZFph3| 0e>-V`8 bKceErnωV,&bxyqD42>|=aX;›j \K@rX;qRFq[K.3JZVM|qW^9%?$q #) rY$$'я))j$6U <*+cl+ +rA~ʂ' ߓw1"0Ҩr<ǝO:wxJ2i9&709Q>ݰL`U$?fWM^wG⽢?mbY(Qd 0*v&19:=VD(~RrLы.AV0*(hJ~kaU^#=by7Jk c3_D|3aρ3aP'ѿCaTᤌC-J2 &]xqOj%;ʆSUG/a7&YpդǢ(cvO2gPϊ,?`Bb˰؉6Xti')ĝ1<H oq4 cGpr6h%0Ԙd'#3""N?ree2L](&bU7$t} :VG\n/9|--1 RI.2nІ:jg5H,I4hc^@@IȲFՆGD;We&y#W/_Fcy|"K`LwfK`,Zrp7튤7ޥŋo Z 7|#9ҴӠ`q|QNcR0ŊNjW-48[y%>_:kf1]NDaD[Z VebWBeT[ ذ8|ߘ.V_Y, hV˕{%s?6 *4*1 * LJd=V63j5A H֧b&oCͪLۆ:3u5X~3#q(Mt Gvg[ִEt>*ͅ0tl$Nvn%=մ4>#\34baQf=:[!˱,ٔsYnXZjMXCu&Jݽu\Pd s0t+5`|z@Tgv)ЋcNJ`l]$8YcCn7e-)/V#QуG4[(,s KRTRD fxґD?_Ig'8KLKuf:^Z{Kǎ;=MTFL*M 2?a'q[mMt'$шӬxa Sߥ/oFҴ5Pt2QX;BsA,dЂ?u.@Ҵ pfv#Z b 8q>(]m=,Z43sE"-.cLlc<$v,^;juWt?%|0b&49*Br?u[QĆzGC3_aO͈X`Q(w'uLZw/h[G 85yl,##7ٺATKL{I4]Ɨ72b?ژlX,@XJi ˆ}d3-W)PL3ܭ4V.g,? :k'd Ŏ@"i$yA{lƒ%[ Cg9)X.q\E_}uNEHh2b5&iZU8#Y +XF(ffaܮT$#mَwA^&*> EqL+V&TV$$m^?uvZݦx!x{c\IVF $*WM|9%0!Hb9',UE^pUs Xp9U:auo0jo'AJ?:rZ͡\Pԯɯ42p: 5`Ұt%2/3 +b&eM;-{,P" Qdo49(rV+]/HGhKyS{I_^(CS/ct:ѭ^OMcdai{XQ2R)Ne*{b. ^`џ@TLcXf SlKiU-#U0`Q|"} Hӵr)ƶOb\o U^8N%@XvNW@H3kEf IfAIA#u.dr yÅS0]1qFۉ9韎"<{e -8d^]hv6 1 {.Y}*Gj JP/wu1@NgI;ԪY][Frfn uWq/1Fe-gs 1ݏ6N+2dKLH^e?&%vk 4=%bTpǻ2Jo;7XQX/57?ճꂂ@L֧=-\6Fpn NHnUc}eai-I[w=/\)Wp:"xլ.mgͥyN&mn>^SĎ ~̙ˊu牃,lҍ"L1`+*k"<8bHкE,u-_ŝXZa[ҌazTl LG£~S - `Qk)W4Umʺ[>]'yƹCT{Ëb>ura;zo@=er3Ѱha gb1l|4lc1B3. bbZ Z!q_|QqČ?=\[flma![h' $fYb5]c&rNOǥFp@H$uM6"RewQ (ҩ,!=sX~><~LV7KR,KjEYڍ8lup0B,EX\X5Y/P0фfzx0~ZEF‘+}Plxw9\:w׾@0w1&ҲX&Mh9v]ʻ0MeM`!<3xCX6k=8Q9v.mC6j1+HG"jI"䍼8rOj2k!+A ?l=.BZ(YR1ᙞ:6WQX{k.Xn4Wth|Ngh=Utm7 tڌ*kEp6qyM(Q:GkZ y!1'T0us!1TzH7Iƙ&1#&hyd3\3ji8 -o_ϗZӐ\2E' a\MCG/8fKqiFF1{C0MQG#` Ƌh>Z$_7l)ꊔXMF.iv (3#UNG8]OAW%k7Ŷ{P%aJq'x!!DCh 핤W),i5$e6X ek3ޏ:z'#m맡m ]F1PrZf =|)*$ ̋> E ^Ƽlg dx4٠A,ZZ{(QH5 W?Dxsgul&plUlog ֹq+bYL)NXIVAJ",1cN>,\hn)K󲾏&t^["iAywSss·%SV9gH zNSQ$mYVEb `R'#W߂N#4>_Q&#YHYCqv`  ,/*jp,HEJvqНAXk6K T_/GY):9+ÙApc{?]>;s_wY_y8;U1YٛAThV\rȚC4!bpȍ ,>Uhy*B%#p5[% l̈.qφre6a:BRܞ _}Vq/Xg$\ `^4]޴SIs弍TopB(t;nդc.63@G2yI-|,okis\T}!?`.,)Q|Bu 'G:YBt0eȴL;݃:D rDBMsJDٲ:<5cenc ޲:85xr_!Yn=F2=3}Ғ>d`m0AiHd{-|*ɠh!X\yzSYXv -,AYh԰z,X~Q&UC0D&+T,?svy^LIg~eӱ{R|HM'M?I(pHӴ͋}z~xh=J-O Wzpp m"MG1PH{]ѴqMvkӗ Ώ[gAy {R ^Er;>⾋-H)Hn $V Ex1Ӆ<tú#jt+(y>^G@VɢwH8f߱,Y匮 gTI&#MqmH2r9L,s$U &nɈ,;G.ѮɴcD-:fy-,xW+ʮ"D|%_OM?"(]6J휖C,>;o>C1BZjl9fÂALI= xWs֜Ke/$3MJ9} ].g]xg2 lU{n7X Lf"OB\&(\^$[߯\0wuln;h38A"Z\= J]:Y YΑWYc?kgw ,k)C JP$Ԉ(= 95׏ذjKNK 4D9pk%j[\Vsw8ސy g M^9gxz%fGby`^&0Vմe{#Ұ4MI= XLjTGB]yK/ݟ`"ޑIp yda_P7..&8Qc{b{`,`yr![_dgI.A)/lYvv&Tc\'Rx0D|l*Σp;fTMq!-KII.dE\2Nx.P <Ad1vX%AIOAvd5ڥH&ǬǃcٛmT 褱X\L'Ew[˄7m #B̆1٣bWb:_~;D%7͓! d;+FX(6p2ځ+ L`cC^j  !c~wXzV7e'[wެ5t)m.ӣaE]/mPev4Y qQ” hVOp}BIZJWàH Y0ȟy˛v3f<2C ʶi쉁(QDi#| &ջ$|&Cpx3.@Iz<8(Sܡ? ː=8{b , mPu 5tDcTGYY>1!g1\oHC68GG̦ WXX[G;nn$QY1Sx=WA9*O{*d]4NW_nܴE7?F1we7wi"nE&lAZg5ַ0kRlkI#sf X x}cv  PL~(5kOp(˪}#р)F*Kq@a7ym G;>`JM&Fy;^h^`phHFK'K aPRKjG 1= I?U'KO1^lW;,,ΒUUUW3a&d|} WeɽX^2sF?:tEs_9n9,,ޒ OلsjJnHWļ&,{C'i$axi 孄[O+"&IZaJH|?Eq0]jLNT.S`e/:M{g;2R4$EuĭiĹ&vmM1vkٽCSҩIxР~k'6{,g}DsʄQX`fnD"P Csѐ" !(ݖAyF_ s7S]2lˀQ]!.36YVf|^$P,`2juHX̶ t"PgBd5؟6 K#O8פFT]db J7DFQ}d]Bj?+DqƜl"CKf>G7 V2H,=|p p%*[dX:>E,t) .Vkw,фa/ Äg=TYQw˼gJ2'S_ $e(otYdzؚd ZGpA,gquA76\dlёi>>Ŝ|Rϗؒyn'򁩓ݬ~˛@Mp!^ X躶uD>,>z/ F$9OLJn-2_0)wN]L$ҰQ,b#I[5Y \-^[bxK1x/^K/p'2IJ;L&Oq¼AgX( 8#Cgy׈gg#0/h !Vk0 sO՘)Ț|ڍ5`jGC} >wp*06%Nw#ὝB)_gaYD<$an&Ƙ'@ `1Kz8:khg%9ǡ_vpy[/Bƃ`Ҵ'ć'Ea#?ӊcG:6Wy4!/Izw\z*4V ]%RxҴ#λb-8"III߃˯:(U0u ϣBIՌ$,1 _.'W$ToWJ00h^O'Njx-:\l=tt}ӪZiCKf/5x05{:ÙtM@/<#J҅9?5,8Ӹ~1gEkĔ`zBÑ)Ч_}rA72{ kƀz4ɧqE U{JA FoQ1XҲ(qαrf/Ml:ÔC`[Opn$b5[OQ޻m1LC+Ha/q'<4`TP&mIK){y/&vRqEĈ/9D!ulI$ 8RcocMyrY4(]q9&!7=q,\qcufss3mylk~\p|NKO6+>+_`m,☭@ {F}zkKtq6$gmsm듎K6KB42rsB/xhX4 c{C iQ`Y Hb bi1fL ݷ 9x;8>P|팪q&1t)ᛀME,fL-k%dX1.}]n x2n6B^TETXxSG,ƤZ$œe\dիsTY%;)Kd=s3}}꧚v_N~ ?q c4#F瀬)Q4i@ vۤ7Ejz֧g>3Cvx@ZKiNL{ZTL|-MYzN M(hB8b۾d(f"ZphBZ>Kno6#&z[a"δ75]} hл/}/SJ׉,< mG| >lB"IK Qo@&ф\NZe(KXT/8.=Td n>h-d Y.42!1,;fGuH,0-Z3ԇ=wRۆ4! C =d:l>ruXP[ ,)ZFi XY6V~fXFJ !,*TBC,E} dwYg^_nխNu@{ZXNBD68*8zQ罦IQgqs.E`XȨxF2תurh4.Oj4n^xq'M;Ngٰ*fdV?`kk+n/x<ݝWt9lwxq3s೓?82Lft6*~$n7v֙f~o“o&m3o |l @ 8JL%\ J5<[׳jV z&S8 IM >ݑz ]:aL r0 IU@!Ԉ WFgPFAi.ˠF=XK8]Bݯ)a0(p8 Ѵ Pt&ID 2AyL@KSL`6 &A ި@8>;NR go>]Ƴh6b0=<&B.}Le4b|PB@Գh806,]O0qٵcnt21.&#쭫v11t>$ᬞ Fi JURzLpȇ&w1"y:T0yf@z<3fä)1g/G>+ҭghL+n86^WOYf'[SW0|vT]L2 3PID>>ɶf+B?и}L CT.c2pm#h jC2:ϮT.Qg* Yn, , Kͭ*pϞ"mY;XXtJLf,c&m 0(`r3|vf΁駱iK+ݬYr8~)%YH%,L8ib@4%G9BM?[yf "쁁ꄰagdgP߭" @S8.3#޴GoGϛGgH8 ˮ~K:_s U(H+j1D9!o:ɇa5\T$ww?eXJ8 ` cr}E0^U$v 0>8 hFO?? _A윘g0ʸ<]abz{6#&ݺFy!GlTS 4c 0 ,1&W%J=q76$|Hf(3k!5]ķd Q+MCW0}̓ ;~igwPt br[J l˰-¤?ޖt\LS*_u1ybqx}ijbe8ٍف:f5â"PSvPEfsPKin!^ \HQIǡԀ&fl'[E=hS^[գdL2L%m:AId4N"S *B $fm9;9'w#ӦL7AцpABy+k8k#"1tI`?OJ -XCᬚ 4JR66ֺbڠz\TK*\!޽Q;lDT: htf8?KWY Q>0SsM$GA :s!y`rԩ,O%;I+7-Ζٞ219W4 T V©!G!e50ޚP#CNc 5 P6P}k趺{M2ߓtx)bN 3Jq-q  קC"Zxxxx{q= (vμ6.hlL^2!_M1ma,fOHr =L+~ N'ixYt;m$S+ UCN/Fp ?t(2I--|Hxs-]'u6@oevwOFB.a!h^>PoW>[ uqbÒc`Inӽ۷(tOJXtMJ}B g~f*wPdP?pZânx X>*:>; /h@M_ N{.,@vhjdm(mXx·Q5| }z@tGe<< a+URND1 ZH^|٨JB ,a`B8Q֛2ʩ2_pX,C="wd8$RG-x$yhD.cRz.hLRz L;]V'# Y@ct9`|Y:텂2(7qx@,I!p& D{Cr`Lv'TqMHJn ADPQ.c@6= ]F 1I/%EtW/^6\Ze<ʎL%ɱHi>@b74'9?)V>,DdATF!&^QXbt %Êe@x &VI!ibH, [ʼT!pU9RjH 37Z)[]Lei\-> syӮ)YEHl3/+3ɲ h)we`(~,ɢ<܈YEc*mA ֠`@4Q~g8ߜuvdb+,ä}5fU5(ydP$]&Ѱ:*/Ǔ^{R.]}RKWaz0K$^OB NH^}?o % JLXL)Ϙ9 - ʳ}dǽD( LpMx/O Ia9EKơ`B,<^+(;8vXhHעraA#t@AU_ %]kx3բ;0d0YJFm,I,bN(]=CNXʁ+L^94QV2Ċ(HLH( k`Aam\@|Er˟g1na-\*\Zu(/gL`7`WG!FW[o}2zA~O^\pKѢ.:"2P1K̢̥S-vp _  $ʪDMܾGXJ b۰"}pتkDҁ$f9j~:A#JJCl0x1-,Vi'3^ 0 +9e5PSX;dMðld:5!?b>ӼxVE<U|>ˡ\pm%2)]]-t1z`S;jj/#0aZkX,euϦf8Kr0Gt"L]@eW,\b_ՏdcR# |abctQgtfRݕae_@0O@|Ê;͙<iEbʓǕ•cy_/5\0V1]]N=X4O%N3>Rtqek5I^{(%죒SГoiQbVAd :]/I#{Ģu6 Dzj`P(M2qhnkXȈYw[ qC-xA`N r>л@3Le(lIE42˜2'2'u}TŲ10K*(I: Y8#E蚢omG[FVL#pnj,U7(t2A(ӡ|> eD+taǴMפIدx{ YҺƲ Ŝh*J4 J#-8$Kr+N;x`wX^95QfLDlӞ+y.zaq !K NG$K$O]%.gD>Bz&CM# `rmHGzxCtx)p~޶-(̑c!5`Szt(;{Ġ?9y{v#!G-bVLqtBIBMM]c,9ѻ/"XgO! <%1$ XG=#4| M^G k<;NI(camVJ|z|~W~g ,#и=/aNr3!|G.z|/ ")EYϢ\l#R2³b%ā~LAgs{S3t㝊xs,?TbQTWwd`<)7n`j).QfVL%b< =|C Zj"508ΨjꂷP3hf&{IcrΚ"T=ʻrJ`K$@ F#]4v8wiLms&MWs<*F1 DZ,%Jǘ-PςX^6 QX:PN@xFX;ǻ{&&7emxf_KDߣ`INu+-.1JThmV#2,////,|d0|Çvx'_Ъšрyn~i9#*ѩ8C&L`lI׈LI3IÊb1T` 6LNpKIB{'&`{ ,^ަ9↊ԉ<<"r2'ZENeaW,/vӛ\ Y8%ЇXXډp,s^r{,Cbd7CNn%_.!)S*jD{8Lnq @)3(+> /.%Y=pP$3,B郊i-[7my+_:K qkT7 θoD D:?wSW'Aq-؂Fi凣{8] /$z/񕤾tЍgEZD> x˼MR-J)5V_9nʦs@z$7E5./uX)Z"BˢF$=*|xƛܙZ)|{|C*M xD^+%鐀 dYDmdҒ+…'}y#a5r%רZʙ j:]R݄Eq`FD猫z<J/oGm>DGK~EvDifFֻņH2rL6 tGb>v\70Z EjXU hyZ;A@+/_W;Lk[qVg85s9oo y"(I2_$VsŃ'&D .-9=EkD҄+cƯduN L=" ,fz΂T85`_]9C¼U d=b&IٌV}%pvݗ"Φbטcbf<$:ͯ1@TA:AEو n!邽|͛Ble&GlQk^f[($1ZF%$֕c7H{㩯uҵ-ul>?i8>òM(W~+y'>O>~y"AI;xB2,;<* Y >IvS(HRsTJۨHr%N?#y2f|wkhtolIA< Zd.\԰1$;/=.$VGMY)/47Q Z:nZ 4-X&g0?zHtPf<$H<`a5 *|Zs)o_ D 6oY 1y%xi!@ `0)9S.xYz,V,HEL9w;4e|"Zn2fz.)S|O3Rv1ɂ3rAOgܣ`I[)1q^_Zc#u1r_!I_:ˍ:G+zSMC N$@Cdz'WHx^jq3Y/R'QyEݥ>9IFΰw;sJܳ^"go°OsMJ8ieaA#N2# K/:,oEL 85Й4I:0)EHâ 3BeM-hnsc|M)6,BBR0JPp`/u1`)a]l2"C9ͱpV))XE9W ֩ݱ-RW?X(4f (b_TJ>bPRtsVG5OŠc_d%G(f9!).G[7-e@0 `D)w%tzAh--Ŏ״i@w#i%.9Pl-M{sZWY mla#WOmlċ|8U% ],z\x&짩٢CWĐCBfS|t1R͢ sE譎 eX=aW./Kp򾈬X R_"[zȲs[ӟ-a>Y, hFK-*ꅲNj fΩ\eWڷ>ķ9dLɑᓳN:@J4Ik6pLN88zz[Xp']) \&yV{RNIv9v-//%2Z$R]J̒ms:%-M"Ab(5q iK6mFQStai>1CBC},ؕ{%9V#Hzl뮪s F$t`-,é=}nˑ1z 6Z<3|^L:cce@BQ_a(VgI"^@JkY%ZLߙi ӡzH9{e;eSN;["Cb[-I{? aP6ED= .͸CFIdzwlH=r]M{ vBtL\^P\ fSAVN(Y̨UWv-l;M d~阉fX\K7EZ&yw9>rQeıGt˻vAn8ik$yܼAǝd%܇3˱[>(]}):s۟l0Z-:4N͕ ܌+p|n&Q\ݶJܰp5$0qEhc^fFV{<+FxKjڅ|L֥zȣ|{AbVjSѵ eȴ|!F-$z7㨗4#e&"H>#f75jYl-E7%< ]iSq8-;ou*ob=}nR7-EEZaAcDy!òE}4g>;=Pa88&+c׳n0xApfw@Yd7's}#yKHLP1{`c.Hwg21K6ȡ<Ȧy%Pp g34XnW}biB1lj۬cلYYM Cɤ2˲DIoij\0HDyJ-4'+WiCpFﰸSSJrMwE'RUmL=篵ɢ$O⁂Turk5ץbq7>ЕbۈpG~ E.o4 ;((ʇsak8~Ylkn,6Ifuח<>g!8Ypm'R(Bn;*t,[jj\3|d>_+Vq,P*p;:g))B3T+YvǸ|>8<:Ƽ STĜYt_W71G㇕42&*) \T$Ò%V#f*9CyqO~[]ΗVJ>D~pGYs6sft馚'"Q muvp^Vd^.qOXzV~X8_ab>DyDh~6*{(A5 1EnQ#M;ϊn 2di*t[C<$yVm;IX &Љūq0/gI*z7r|Os"so* (:8I_+ ,mVOM<ϢJ%a1)XdF (;ɒ?ߋԭ O*`1UWm_2p걺GBIn{OӪ%{L0'@N[@k)e~H-l%AGRS3RY ț[Epl3xGD65Ь:E+2 !@Jn@h O(~},Yts`:xj,mnZi?',}ơyolʝS]1q,Kؒs?RY9lޚbёnpXI&rNþߊdyaaTwT["shd٠J8_ŤPbN<[> .!9PhǔJ%= ӄ-k:塆^n35c}dѸXN&I+Xv)$OpON͗52a2w>H=tY3?ဦ! L=3'' :2EFU7' bl>ovƅtXloδ$1HS*2xo6(1Lc }1'E\?s*Y, xe5y,ː|I3.v%Ǵ)JsM`+Q/K9#(_pD8 "9%k5iۉ4H!W#y/@vB6}Mi;!dtmnW#9f=7?Ծ,@KtV rkɔ1!d2?&GPŚlؼ90ބ+g/:1̍AT1wˑ2`PDI"V鏐TĈ Q \IFr _`?PS*cn/52I2rIJe&(Ɯɵ =YBedGR[WשּB0u̚bQ(bPl,Q܍ T2~F="֥D|Xaq_(:"C]0cxι>kE}'Xh"\>0-RΒX= 1D^X<));Pr` }+sp-*$ϮKzgzU;7+Ean`ɽi{Ec& I*IHG,ĵ(] ]kt W/upp} KzRFܬg$1%TӘCNXb'2>N9P⛕<"[-( 47/q4/I,JUQ;|qxǃA&V7a ٳFQ5#\R TĽ M[$gg[QG_Y0IhrNm9+K^(4/z4qL1dLdER|˱C9@$v]c@YQNև,Wc=Itn!%xʻ!)Yl`nA?ɒ^R(&Y~Y-I1Y6`1|GmCńgO}iUȊ $Qz s]ZC,_S@NX``N֦ʛѼq~i83鴒TGM(Ļ*cD+Sok[ØaRyʅH& iµf2-[E;:UR $mfy"| AeGmo8$Kq;$`9|N ´07`|v)tPV|eN7H*o vYѰu@"r#nJHu${/oIo*Y + ..18ܦKqHXSb1v)!`3mb,-c.uLl@YP#:ߖ: (b㉦Nu`R%#C;(ɋu(oͻɒXl0gǤ=4 0]Nv~Z]elXCEwRJǜI}| Z4 F *9TJ\a'_+}y y 9ee~u:z+If]b &@(F ..5޽}|pbKAsl}96Zk3 ¯i]mڼ-ۆm%IxwHS 㴧Ġ,ц3:ģvxo&x ă^8k1pt;2TFR ȓ|7n֭Wz$H#V~`䁲i3q>}PgNYh(uq:H,=q%w%_ԎKvJF^n(`h9)۲oUrccGS\(rucKe.Lx#Ӎգyv4I~48py*ua3Oxc>JY/Ş0Ti^P-PE'p(gU&]"G\BNb4w▝ZOBr]:y.m 0$BC hiF@rLb.6Ʋn.,!e8cy"nc}eN1e,6>ca`&(η+ ċ))p&]x3xAeVW`hI[M!)`Q5]t,*W^Y*|.RP GAG0⍻Ɯ1\tny ߟ Cy6 s5Ҧ3=WMos\TC)g{Gyc>8 g^} d ,IF}X8^p>=ڐ12 6/C ~yGK(%YXKf-,.1jdy 6qc5k2xmD(>ߒ+H.a n͹Vmjٳt?Ԓc&P.HjPd+ 4h<,8 W$"Z\W!NO$*viX0,sf<|#-Κe53mjx],17m%|Eܫ[v9* ռrynXG}wn%&iΜ[JR sA:KrS@gֵ^;PylwmDy'ei78'\Nv‘(8fVxiI2u'Sņʔ0?@#Q}@i(n-F9*ex"^fY]qו͙pإX$߼)x \%1׳j4`cyʹ︺Sl)B~B2!~1 B{3r;"wG./EZ;,~9wfZ(f Ĺ[?c_؟;kdGEse(^0+f +摖:M&Y6aA)FTyT4V#(XժFD\Sgfr$7]bdH2[t:7#U2F  Mz\/'!, K78avĈ8 S2t!k#$3#DI1 jQMH( -j@ݦ xO y˄ miZΝLHg wH#V@ c `F5a,(EIٲH\7V1 Jn`1+EAQ&/DҶ<'E+JjkMtMMqKuM^첥 %r0[r˖2?_LO(qu| w _j'#2$rtJB1lv.DP[9"[2u-r,nZl^`q&B,Cq",B ts5E w ,%zZ.ZDrR'ZfE|1Ay҉вnpnźx"efí[T$:C,pSo0XeC_6?!H|Yid ̏5O;o!.]iM:M7sV6/:p#X0n%sy+b&3Xv%3`.l0{c}0ޫZiws$5僐C붳 /xB^a7|7I!ݧ"k.qoQt8|DdAޙ.1^]WN>(sHb> - [a :HHWDv-G/jCRpRG>(sRuNdk/?@4c /^Y%Re}{8ۢӎ sI޵G`-K.,"mjɆ8%\R,Wx^i[nrԳr7[P[R9>.EJ),8z,Բw~OBCmYXQ<m4rln^YL}m˛[vjGEOkH !Z8Ms3/[(@zUۄ"b 6,ҥt!љˮpu-ZmB9Y k5 1LIܠyhmld0V х=ȮM|!2(2gam-{Qͽ9+'T8R84 wRtO&!Xdg=q04(| 4X;+L|8/JY a 8$_y&cNPYsA=PӪ^Df 6E?Z|'3cT9EIV*J\Xd7/pfá}fy`00mkd,{(!@o6*ML4Y3C4sٲcK[RV M @1)A1./ȺBCC} wUg%uuV_W/n"Yjdy$MF< 3 4I0Qaꈂ0NE2!BPDPp@!đctUO*_~OJ%RqMKJw~V J??ύ;iw:io8,/-vg, p??p}}뭷\_;/s}iH_T'[3>$g8ݾKar{ ߅X&|~k'`thO'ӝP¤$ (M(?ʛdO?0'̷#a3qه)`F`0;IV 5njQ|iEySE b?KAX79ߙLȴ;NGNȅ% .Bd,KC:Sna;R쐛gP ;Sp:uLF͎usE:fy.6u>.U {a TM ' \AB(9#JpX& x qMjȃEX `iS,I|tr`}Y!6]*O2](j2<2e6xK,uK> \K3P]L=KeU)˳,τ0:%^3ˆ)SO"O#<< t4rcAY'Envr~OjSؚ Uu%!>}\f|B`L; ?},>ն]B~oo,07wHn+Ql`қ?ӝQtcdXjR',y~@f&;7'OMH)64_<(=QUЇ~EeF`MO" &w,1Ĥhno4q73]'??P,!MeIh" ?m3,^;K-(%3<GQkے+l!"m˦|,=w oR?r,GE  >սi HRU+R`C#ʃ"6QETT$PR*UW|t \ Jp -4-e}/Peu>d0vfL3'$Kjg_11'̒O+a &vT(کQy9%%drKj`y;`Fi]z]ð?fI*)80+-~Ot0c2U&/ $L߼To2(A_./w3!qWU,a 3%Mf }&[_H2#~EG: @ E83IrN5x-xȰJnIyCR0%%!JK'=;Ph^˺0_ܢ]w]x)sRf"|-*RUXcG\H=X=LS TQHzh˺u#yp 5F,{0&џhrz}R.iҽeIjBi`l=N(NY~~KEnm҃,6q;y(,?x0XIIҁ qco +Pn}SP۸W:퇁.,$8bb~gpoC2WTY ,`t{! = YE U&@DŽGwZξXxqJWaLne,Cci¥UiC2q"d?`scC5mzMM`Diy]i&-EntY -ѝD&9 E#JT:1iw=PʍFM#0MXEЎ|iBUtYS(<Jy]j4SR{,_fZ~ȡB%y,}Zh8t1R߉ zrO^xBcUL؁hu@&MvCp$ U &Z(P8'½Ŵ80]YP< 'i.3qv<ΟU;&Q{nH̭%ž1+]Z/ka,8@nNCDwĚ MCÝXbIWW-=q+ymĊ軔PqV.N YgTsZL43t_!k!CO8ԡTk6 p6:m2R ^r{SNxZg1R:l0.9:O"23xƝ"Cpi%atJH(5t!C\z}].uEtՋv^*bE ˛Xe?ҽ>s `RLu\]y̸b4!qv8R" 2LMZf\\P%lȀBR%DD^ T+r h/nM8Ex}-(522QԴQTSbuW)1lߛE% 5/'hG&jX%^56Y򏣝*\NÒZtApqوd _dxᕸRqYsV}.(XҧdZQDa{ &ƃ0i5*rFBC~ukYtᅫܹ9*h`"x91@O!+~%QPX$OZ^g!z˲Pcҩ$mMޞUmeW~AƬ4|eᅲg"JMlSB4<@\"*࿰&rp-yG>2Aw ]%Ú8vCCjAQR^t\g,l"°DζSIY_p諪D $Q\bkG?M $N=o*vGk;X,CGa4, k}OLI gDxf٠Kxe7(v2{"I]XL΅>|oӧ.O*-ܤEps"V־::AjQ#HU7Cf4CfH=T`n%N"5bU gͅ:Vݪ.w;9Nv9=aQplI^!+BX{FZ7bч iY)/ԉA:vp .*+egp:.oCs)õe)'ͲE\ºm,qF sr dU+&#CC|[g*UqVB@1]zY t(N$0cTHN )tk-, y=_Ωe@IӜLtuZhsA"W5$mmkwoJVEa5#I1."6"5}qy5hɽWoy9!:}AmD);>G5vyz8C9!&,O [8~t;ի.9CԡIn=p^FX1?.[bJE0ևHo%V]r)&I$Sg1hXDW<{G5AgQM>| m :1>9my}aPڹDm&1]SHO 鈍 j$imA4iфlJqΉa& 6T,igcsΎHRL9ߖ m.nv%dA(M3/Xl!R"&S |dFt'nYۀ edǣDbG;5j o#k(ZyՉʗOelE Gع #3I_j7+@L5qKx(l shN&rVcDqa"Ŕj@ Z0ߐkV3# c?kT Y0&Pt(՜$S{ f J G7GK!jŭUl.N@PLoQgE逢.}Ҩԏ4?CȪ&IN<ҬCIy3 %mEwg8! >w 0˧%HsN}1o pXgJ MYH+5YO&AnVVy.(@RC_+UN\Fio[|3Ȝ*+|Lw1A#嗆O\'[?2MXHf SMe?eVķ4eYL %.{q"iߦk΃ռ\S=탇9(eh2ss;e#=.c0݉,:5_-PXn9R-F`?.H6EtEE(ʬy$cb˫W`B`a`pO7hv[a)'Qao؊bQ6YwDzp0>RweD]ts1,[ɶMŧeGe )S+Noݹ܆ 9S{m 3%kIcb91kvEpPt0󄵚p3enHjFx f\'A7zg@v˜5dc&{v PfX,3 EעȶGZ3%ḯ3`KM-4tb/Y`V:8І_БݵfF51 = )ța$ &aFL BغX!8a/|?4Z^X)mSrب#t .Z yFYrֱg>?ǫq=i@X_=QYf@ImJÉOY1CgXC86aORvAfÚv"v^6X!]v806{{ f]Tia'gYؐhOvBMޒx((H ,ݖvt޼ %&VC !ni_}SRg-&8  EqܬlxbiK D's$Fw@LTLDd,U=n=VzhYˆqwtW ؂\!,NQr(=Payi=^C6i~Z1l\K} t Qʕh]Wb^)Cj;,ȰOJ.jO7w'IOaU;YeD2imS޵g|(Τ-۷n-kzį$WсiZ eEbqURB(7i=Y B{L̎UMt3MVܬo".I LE!9:*|~ժ7C: ^D<xǡہ(. .9Ǖfbs" V&eqJQlY/Sҹj+b7**X[nkQQglpDz=ݲkkۃəğp;ąX7ǻV0+!}f^[h퉲=nsme<ۥP6Y[o .{8@hz(sH2k/yOXfIf0 n,ɷj"<@#w8O (KTd|8J*f0NqZF 70Bit\-0 -l7X\9. l{feo9c=}6s 71wi`YL BqN:v&i?TW2޹ҕVkmzq#HH:wX˓zUC"3,˴TPFc4N^xᢇŊVЫ Q>YW C IEJ5Hu fs5ҽ~հ'ΖEN2p ըf'[uJX] m ŭ\9RNynY[6=Yo5$FmMAHg/XjZV""vRaYE,u£&8XPsҍذo|РFi⮛J5 :nBrnu^]zUr׃$_eX܆ %R+c£QniRS ڐC %ݲ,^6{_*{}g- zZ*d1dihLJ-turΒ`5jOإddFV.޶HUr+(2>lY.ck(F9/Wd{.0c(!o}@Sc ={g]U90Jtm5}*_l"F%y/0>и36)JEpܫ*ƪ=e^P>82rrH%^T+Uzg'*AZ bv(Q.Ͳ%lni.rw_iM+b犸n;I#i&Qn@(n*s8(޷b ҏgj^RG>2.ls@cڠ!ͦ@³ C?d\Z\ai ,r6DWX\P\:eK;X`e$]J;gr(dD4,-}ţq cuئn-^"iDj<=-; ąI.j`$ϳTbfQUҲxN [vF_ǂcM8vA7j5a=!J۵*~ Y[S j?$F]J(g>+tA=f)*'6OdB8 ,d&M}{ e&J9˵>ir7O 4O+_-XP t<0Q{;b}K̥n,Y@ c6'֕voyC\&Vgz. }V`w?]~M|lye1vL ɚejo-,GiLѵLsY^(Ҵ|\qYآ~>\?ֶgSjrǠʷʞ'٧TRx#;=cAn5΋²(Pvu":*_4HI 썈hvcNBY}Cћm\S I}s N]:<b^Je)Ѭ^k4덕͵ ڬVd$4˰*XPjXǁ]]mid]PUm@`XCD4TLND1 U|}^iL,O0FNϘT //{{B=(X[T e{\9d bjaϐDZ?'|d_V muE:8-1=&RAd6< S]j"PD,mZKטuE0q=u$LMO2\wgɫy܍; O_wCHVp(Vy-XIW[jPFkb-FUr <Ӵs 1 ܖ!|)KHFyn@1>7}qseaْn\&GU2ˡϱ?,F82x:|YgA5 )5x{Rs<&.A(t]۸keh&&WB}}8"kpN. )2iz57xxt}Eйrz?t Ih&XBQqQO~tpztz:'|_kE4R7*P Y@yY.V8;F >QNfoWQTE}붱xeI&x:CG+'b|$&f?a~~~EHq(R]"_%f ֟j㶖2I$¯8m̍Zi1n2@@ uK-pw)۽KYs.]͖}\5, MW.L$ 9͡xkE%Q7w+m ɱ1DKY,eЮt_|vu ұKʮ #8̀Gwz]u DR2,jeZ W@? OMZs_HuՅdƊo(3hThXrひ]xE<ٮu?v_R[cpּsDywY,2- P%7}%d`NEO[CȆ9L5ФiobX"3ְdy,*nB,,]ZV}nwHDm"nO+&v_*i NX9eϐ& -1!id@N;$]JsMcO7ђN(VFs+giQ: Vm>㜛.4kWfqڋ걂^݄sw!w:؄\C>VJ Uv(93wAbܭࠬ _hLrsɛӑjQܾncRŏB8j1Ϋ ()D"4 #kÓLA"yT`".Cެ(5ϬeA6yB+M|'-;dqt/RQƼ|8LeTо4MAwsQkϴI"N;)<.:$IJ4b[,8Y%dD^@@T,2eρts rc3XmH!yX9Ϩ̋\f_-:ooQdFn/y+~DpX{*` T9LYLZ(>6ne<,kEYOTЌBVĤ?*FVsj錎تu"Ju"]J(=$;*fʿX} z2z2d.ٳnTOCb?ޅ(`Lt8"P²aګS}tSDNO5sfn_xNU*@t*E{sfgaVy0MiúQ.-x^ #"U GXpQZہ Qesͨ =,p{-euH1n!&t[;tňy;/*ޭsɨAcxvyD(}w2tvãx>:Ai-5:BHF&KXg> xJò:%=ieq\\YNԹvɩQoee K9Y:C$:Y}:bG[B LJGZ ^)CI!oA#g߄17Rxߡ8K{/2- ظ[bɇ=SLBm  t|djYr*Ϝ?=0F3MIn-NãhAQ |?)!EB Oy\Q_y]JuSTZG}hj_d/+J??IFHݟʽQrԹc{G唿+} ByI JJ`֧PƽߙP,R$:<<=hD9,`ˇX˯0,n`6u٤3. Iڇ{ <'d3XibyC8%]1ם>; tfnTt($QtсW<ҳLH_?SQG՛ g=8~w:Ghn\^,B#Ob`\ jK9Uipw_Ãpxg'o11'wq!;Y_}|σx֛u`ڟM{]< CB q c9}CN `κ^o1 }ŀ@(M,XL,∾2,# j1E"rop-v=< m"J+B#$(G4AY Ƴɀi I Ex*e< PϡL&PΝwP.Sg)ux"ű<*j4,X!$@S&c2fVlYB(B[ȇ4&mƶ&Ke#f.,-!t8[%N_Dή/}Ζ:흹^:; \` `R` @K葼˩ HW|pHI-RA<Đ֛1SPb8Fڙ;[:w8(:v6qhP<hPa}- .#@ ӃQt*A2TT"dʠŁ4 `h '!x1L$-ps3$N@ys Evf!4g)Z|>GcӛW9{2B aMb0Y#X;{'`MN HѤ+ZILݫdz]Te(7d]p=g{Y:bdY@%`Rp<)*Y<ъmX>">l4L] (>?33 n],I9bti{{ܸtyF˜Dκdw:nk/"wcڦ}u(QIyFL0s&BRXK'K,.;x7LU .^AH[;}>ƻ+僕Voc*Qs ^"l6EXfׅs[*/bۛOIK&QtͅB{8<_p/QQ\vщrtq4iEL 9O|YX^eܝMKfAoJׁȔ$%3<X>]Qo# `:#> $O""җ% -4 4WqKvzE<^WƼS{|];zcv-,)S S;2)[v3"B: dIYϞfiC5R PMcpMb.k;iF39KtZ{1Ɋwbs@?®i547M,ithHñ/"y͊v4c;|X'Uc[+&K~7 )Tԛ.phAie,}Ȱ`]ez5c %BC j?!Y_;v~|}chZ#kZ3ij5jF4bph<ߒtgc\k2mYpa_IhvNp *)bM~Yk”+PVҟah|xQi".Z?^apZGlpZ(٦zV%eޘV#ܜagD{CIx}yF{X%BB S7s<̱3wŎjӘˤJXN(7N N0k"up~}z mJGv:i8τNJ"νp9G4G',bHS~3#?V A,bnpis]NEYruDm;ATL. u E2rGĝ> &qOą%D}J,8wJ,.JA#seESjƒZZ.v~iYmԚHzY[ۊHa'<.XL[o)2a}+  'Ts%]{}q<$l҄r/j՗cUK 4z輎0v8#Ħ-vAfTϣFUG:Xn22;+<"Y>3K>|BmqGwq H=)~0Qړil9 mBxI7(ZwWXȊglzMgδrWT؍Qj_^rubx}H>?X}xN^0!㝈|^E kY&_ :pm;3F%$I} SA1~;+<7xp^q RiĹ`열&b~GܠK)CDZ:?cU' h6:vl)wIDleMRʰ6-a7Ѫ8-h10́ F\VZJ{DjpOޯAIrKr94݃= Qh/+m:5i^X0$9;bX +Y?X93;9LZYNn`a[w_׆R( n.Yd:m#a['tn> (A{{>tE{n,n%K Dܛ>" CK6-pѲbhk˨xЕhb.͇@aX2|-׺@1Ϭ4GNgFݔF,ܶð9^ىnBL :_m%q|YEO\#=vO#iBO˷mH(Dﶀ௿"D!cW vAaνfF,OZFPVYV~`~=f~gtztfgFo(%Pgn bDDtA#Ԣ1̂l8-Qچ)m@_fJ$,0qh+7qBLoZs(\Fz#tV}Q~w#Z"E3<:oCI63Ұ$E:Y2% S:ab:bZo +|5^_]_X\{la,fJs\yĐ-5dyƒKϢnl<~?NE={RfdUFb2!B1 Bl↋D(x=6jI#IҪזov~_It1G᫃!`,a}>-'Rg@(eG}Kg(⻲.2Z{#)J˙WHay%D4d$EWyk~& AILH+xe"4ˢފ.E:Mڧǫk*ɾ -ފѪI*VQuyv;sX&c#Q$,9  5*\xc_˺-޹2Pᬙ,0ʘHjD1z%}5^Fj)xB˺,8)+x)"oo ъݺ؊ҷa]E9-`RpsP?XM l ulTYf9(:xUIF(Ae묧Z<A|Z$fg1/6G!%,Ӟ8.vf+rCět *ܜYū,Wp:Ƴc,eAqɉqFj9]D @ ;'坨Cq>@>HmFb\|Hʂ_rh8%!Icg,O9Wrz'[q7V{qNz4B/*AN{,ZU:RGyhHF ktrH[&)OD<{_@עZ^=&"jGq4Ѹ'=uZU4O-$pH5Y p/3 #b>ǵ2}6s Jv­0gY#{;5Ib5E{`V:K&\l7yN:VpZCr)Ow0K/lE)}9< %*oyG)*cMq|1#t -d4H>CC)Xpy hM8b vMקrmH(jYv-tn#7) @iMm0%%y nOb?i >[9Ac΢sؚ e5 Ύ"ѻ;Tݟq2UEgM!`aGgK@ys^V K0]9'!U$^چ"%)4V4Fw(E! RJB?/\y;wN2/Qy!A`@+h5c1\Ud_c٬vaV%%`,La`jE0jj=r,%&!; Ϳءp" n! y_]PMp0D?qēEfzW yzUz,5^p 2 G,@lpEtp?,ٰ?=,ʽ&h,Y>`XWç m(a0-,ksU&tuXF7`I Seͬ '务{$mr$=ECi*P̓‘87(_ ~8gc^Yrf=p3HJDO;jSb_@di߽Gj;f?`Hɯq%grJj[WZT-(\4.hYVe!U_- ӡRcDZB611Yly,4Y,o X K̊&lUQ[z:(r I9-EzWu;2QB*Ŋ?qJ`J>G*<5Ҩȗg[ّW\^1+2R ].ffkV4s=U7cZslxXNni/߂40iاÂ瞗Gt)lyyު* *4n`ѷݧ%=t,膛q<*YE64ǘ8Wzd-Ӽ|!8l6rqrZ9q@\2}hB快!6$2l\N:$/uĢ\Au(`TT mv#i91k247l q^(Wf \I|.2WCL5á^ղҝ9WtO„\͓rۡhKz}'wyAudyNJΐ[P\f4iarsUj$D;*)P 9Hn3"I:UT:=4fv\t^i%}b[ "k۩E}f| up u/1-ALpD7-VܮYI$Jw\[o5h'^D0D"tnC0Usj Λhfrv5at1N(sf$%y{g0pAEsw< eQdV"I)hhfHŲ(W^GH*Gr 8#}~iXڀ)΄Z F'.\3\ϑH kq:~`_.!S2K_ H?Z6)3W3ET1n2GvJ+yrC1[[M8މt 2mٲe254kZC)rq@A;n,3.W4tZ:hXdռhV~_\LyUWΪlQw4XL>0C1ito$Н:Lna5Ļ=BDn9zhaK滎QM*7˱Hܙ&XpD:R'$IBnoҵ*X`X1.0%M|9Nk9svmd.-W;BLv :7qsɔYyFIjA¤ "іE͆z_T:mPjdus{m3с!8Opἀ2Qjl4cUYO.zC:X՛ xGڽ7# :[zT Y>x6͢`ׂY~rJRC3_MTO$;Lfѫs$˜1bz%bw5s#U;Ky{qX7Nh%?WdkBi.K.f4M.,:(-uq%3w[d 4s^FI~0>6.Βڄٔ`[EaQs˽r9/)<$jaS\C^u8== M~'J$._uq>*bML-uQj klF p ۿ/j 9t1monF ؚ_/BªعO"W_VbWJpa.]Cww[{{G YE3@k)M͂<_ljs)g aLO&]%w<)d)Ԥ/Y}tXNh\rw\3>S`yԧ.:cL1,΀)_%Jr-kE,ɑG 2{92 !RC-~т>228.ku:pI,s!=+VL NūǐLY/*FQvmd#IV42vu\uK18S=l,GQl,#X-F@[BL '%} 3~c-& X>÷<`hΜ7H˲Kwd)_95~?9gcd ˿Ar^].zwdÆtʹ_λ]/?*PXe)%#UMZC/yy7wZlnxfvC !uآ֡-b2XM9umтըֈEاEp) [T])E5͏#hGY 1c;qZ)ʵgG5eFA,+=a'UCd¢NڅE:M.csIqhܝֺ[?!ܱ#˚}jx 0UBJqZ(`--Xp2YL}4"fW-0ǬoA,( I!z cLcYo]X`:8]t͛7qSP巜mZ'(]KRv9EaM<:5d,18exb:+wm߯4p0|&TY싀ZR1s9g`/#E㕑Ns%K+,7?I;r T]bYk۞)"qwb{ɱ{DzR#eg3޷*'t7,6-<Ϻ?t eեܣcz1ys~B4!<dVD%>{NH.`,Vrcő}6iBi8:uԲYdy,t`iQh¶MRr$tY7ᤓ /hF+!RҌ'K:aÖvOԢa;u}S,gai˻L^0W'&^od5@u7BMGte=Mూ:9 LSse ͆]UuG2 4Ź}n3hZVc7Ï8 K[2Hy)i/:|U\4}8VFb#}76_TbFq\QY994 aRfad5 PӹTFl64J4̶CQF.nPm=O#H "WyXMDhhKP.p~vBh]=hc2a!fԧ_^``MYR8W#o^4N~Bsrƴx0gn4^1`s[^/{oErX)ziOB$YnXjC527b8JlyPV5fdzh&8ah㐤Ş’RCܔIUXÔ2&1z?~;d988#KΪfDg,`ѧB9\yŻ$n54ͲNiܾR0kZErIArװu\˘ç=nOhu]I#,͂ *tKID4I A\h*\k *,&pVFD#Xu@y갖H8/Θ\ VX5'Xw0B1MV%\hL΋ 9 A꯱-:TM^7Q9h*SJHZ0W%ݼ3<|< -"t(7]ҠO<ͷhD#p+/C3;jU:zJ>[fnufJ"ZX8%LxKG`ڡ悉D!H (U -'{tY2zWPV@óQ>!mbߵv] j3LJWFeVŬ,Օ-gA1ͨjޑk/.GxlmE$JFXW]iޙpUtj@ qc|y@2V2oȑ|։HZ+p [,ɂn46L-.bgY7*H[/wXQGhc.QR c[,#JܢsӻjoFվĥ<̓Z\ bW]X6HckIX ޵i0&IRǶA'byʙ` ~k*ڇ|֗ lQx̖ukYyF{ 3*PLeft=Z`,2bhdW7c~NVj^IvL t0PZ#딣mMb4tp`u{A#L*$g]'MإPJh~o02$Yw i v1(n΁ql 6sfB{QDJdܳĐX' vȪ ~S(TH=;nO/0\TTx,χ F I<&wX(aU "N,sg-,e!(\ ``&JQ |/7}k9YD?#d9l"\ђH'm*-?mbݭzI FU0usotn9;<_϶ףدgRO к 䛯/O*jo5b˨pi a!2:jf֋,PTe#`3 te(نQ}6.\P߁o4=\\]4ۭ$lnނ6ejnÍ>`OxJ>h;GR;-UYEwcBm)%N2L îI\]pؾIjw:7KD[\}qAf5ܢ`:~a`4bn*y\ FZ+ms;K# Y休\#'=xOҷhZw1>ddi:YkYd!0*˜jr2g0#(vwGxAAٟF]0̜}qm8WLǻ"[^J*-+쬝5S=En9 !z:VttZ3)\sɡ~~Ӝo3 Z]60t`Olc_f4\rDXcR0qf'/ZD&95cUYC:7OZ274ڑz@lsYfP{S{~Y# 4.dfӴ2JCk&7џT&Bq8C{0t(A >\t ɡp?^-KOXk 4Ik`$(9 s+@yR@ek B9R\8kv5Qa|hm`޿Ae>LC+* A"l`WHpZ3,jamu;?ͱղA@`(tmfmE"DFE6Do#SvG|ʕ>8C|pѤשacUJ|Uݧ:,\Px6n^Fhb- !BS{gUZtࠆ2IKfbOA 7@-q,b&1 s#OPo}E*`ƛx'UL&{8a3jlkHTqEٌ\`R%3JsGY,^w} 󭀵ԓF5\K8Gc27irU}t\ti-Kq," BB;z*K8x[s';*3%]0:fEЂ>-heNSHMz=@$LϡpS_ZdQ77k;dod#8O3jrj $\v+*m|ވǎ ao^|_1Ř]=p &R+zFOF;xwʼnʡC~xEZ b"iWE#M1*]Pt܉תrj)oV'<,.׎ŪQcَE۴sJ؅uX9c5 ˝26&GvQ˶]t>3li1"⸘إLv5i7ޏX%&(wR̿|6Tԡ }UhPN**CTxnjCoMRfaoosw-٧iySKq̓:벦H߅gtO.c@* Kru>D Cl4[uSk7+7 Q33cإ}Yuh_J(C|uDg "˾A܅ɽjߢp_ O{XF&~Nrt؆mKaf*XL_:v>p8B Cҷ,=zyBC G} xgY49I&f?G2 R ZNiPU\QA|]1 S *U">cWPn+aeqe{tsc{(ϓVJ䶛הn+=>޻G?2q>Ѭԅsiaqx8y!e |VIW ɛ'Wq&d7OɲZ* N=0̀&#J IC%Y ^ y^Mk+Ky^zʁ<\@rR , ?O.hr32̇p4w'~o̱4:mJŤ IEC"" xĀ"{^J,8W#) I*HʟD@|2{Ӟ oFmJi( ZE5@X&Awԝ#/#"rOܷ-&IlpBrfˊEdQXq΢13Z x<,m'_$i$a !r`b`I ,eǚS/}.0I&7Y&Ow&0t)b1dk%&1rr,Rv a\^[&L>sjXG[HO ܀ysHR4ATnupfР h@ 'S)Ci])^rؕU@Ơ`W}~ L, B'>î8F( ->dSs*A$%*e>Գ/UѻK}ie51VQCeY|&IU0%f 06R >J94,<K|4Gz^(i@ JMQ ~,hUDc  6f4f^At}wE6kӐِrMAFޜ-{x+ŕc{fy}wa랬N!`v1fP:=ݯS%S'+¾Tyz>}`^`1$ygxlMw”Ē^&g[! ,s3_pdu0 ):PĜA > ץCAbIۀ7KEn }*PhTDB ''hĭkTL#45unpGa^(2u`[*MGS(xe<,.gtwKc+'4K._y6b@>F]Ӻ-N午E1c`w*X2_2"NO Xꉼ&IR09?6ѽ:(@3a .T2,*A'MJWLPOU\E#П.фV$0FEN)EONBSoԀ5ռZ)ŗ#I RM;2ޟ$7snFЙH`9n 8 Qq+EjOktjYF ɀ_L\bE3L4Qڲԑ$Pe^$kԟKGH:UNr'a@iRT2BYA=6#h6硽$E"yፘ ,p|#p `v2Π/p̀.L[$}Kl`I8^,FO`0Z(SX6[dAGR- H.< 18RA4,Wouܹ,w1`Nq[_i]ⰸ(,O)ϨF/rLGeWZ-O@{aezM{{MMr,f^"oeN\A)Y 0IJ] \L&>W;TrDdW P^\@Fo=/VO H.*MRׯBt:%'@N!p7 ٗ6~GD z3%7`5ןgRRlN`Ti^Q  $LԊ$iFiT.Ὁi 0̫,02a~w1dsv RHCRiH=ɴJ(hd w9^'heM&G 7cĴje݄T $j. +걪τx>bed4@)+>'e&a 7&.7gj0CTYC<ȴLC1 B6Y\NC~)Oh)1Ll !6%{|`*JLF x)-Z` qa}c^݄?T/ll8o+ k?Qs߻e>9x<޾37 IX~X71s10]4*'YVju}Yݨ—͍ͭVekU,\x+Cx 0$L[=DI=d![a}_<nbEСZ'5dʹ!1OAԚW~lmtl>f2@m+˼:>QRrU!\br:;OD{m,R? tɌ+ϵ4F,_Yca([ 'dQ3Cp0LJ`(XN0z9|)Y!4Im|sIYyeͨc5s' JxZOoWIVk^F""nz}Hiɭ@sA)?XgF`3T0G4HZZ1Z@J+ÐD AAj*ꐜuvOwݓp0 i7jji=mJ1 NWD/"@I&%G `3AJyp8[Tgum SQ̹PΞxt@4YaO"̓様0 !~1S礈߳w{Ѝ\.gz Vv'*v% ,W(f$ lڱ lגVHSR!h ErtXvL;JdOT&Aφ8u%E3m7KKDiyz2̛A] 6^g?}3xz3ˉ1G-ͳzeL+ݮD20*II\YT2?dPrVO"Lb,㲌uΒ\|*$Dcym2e RDAZ^a!QM!d<@XŞBǐfu¸5åbх]y#<^w[-:{qLIiXQ7_}$_FDެw1dw0;\"FDQ#4q4Ò6fF. F}[a-.pLy!-';@բeJ2rw(8L][)R,l(e4+U%= {D@X͌pȟM4;Yfj%rIP-ls[C3pUS-!ǭ[#}[Vy۔>0 #JLR$Eܲ8ol Tzn~ejl:na3FgїIL|A]E0RJZxkAolCt \|gr7@~ؙ:RTu(3~BC*r{{rV j@d$N8 KQ% *s(URvos8t+, Q^Ao: _B,tı;b5 {oast |.;.gn4- xiHb:CbALq$r!f^*&yBFR[m%eitH 5WrK;#F|\ǀ7Dz](vdH`S@|3Ji!),D~%Zn^ W伎b|:a*"{}#ռJD-l!(ct_#i]q[@nJT`Gc SKף"cv\]$[|/5+D \(HA${;&cst ̵0STHJ=s0Gש҄ FeFbq}yyt_|FbE m*׿+O=WoU:;r3H-f3jf@$WȊBmy & ot]ָ8ĜšPpE2B߃Zea}JE?P>TR[Ь344;EMsq5e73Uec%YcR]`j%T$F4׈/$Z(HLa8SOy²Va[xݮ۱u6fbޒw> k:KA%Ds`k^U[>Fcyx㊅EZ=ܺ]c=X0r z>_EQDb)X]h?Q-.؝h8P__(a_8Wg[xE (!,@Zpok3h8`uP]̾$ #Y|{FaE^!4I*YR'q<+gCTy 9U0D.&U>8g9F>hE/)]zԣOqg..,{(* |e@1|o`Pn Ns T{a{5&C^xQb/M( ZەfDQDQ5Eb4C‚ר"&P C^Vaɷ֪Y44la="Q>JKӒ8qИ0,vrΜؐ(O!Eg" 6IG+W-t%b& M_ZYNBn=Rv@P/uZ.ҢKė,7eϢ<]סA?́rDD9eD;/V+Tjvl? .+?!{>cd!%]@fq4LG)qJhdIU Yh]?[W^GhPpq`4.v#Pw\4ӥw9"\(#l.ƵI`m sic-ɷy}jGϯؓKia7gj!0tqFEN"QŠݯi1=1@}sL2>fuccנ ۗ|b}\캳Q-yH}+O=Bt )/X$<\_8Q獫."dY]R3/ȥv-TRWɆ˃bhcW Ԡ넝NX;dl\%3:\n^Ke[g(8qМ.$ V炲<)Q]*[E u3exY1BXQSh`7D,Ս0ER%q\o )fTde\TM.̔'Dkh<6bxwDFz|iM?<:5:ٺP@.7[ ;Q.ԱE`ѾL/xB]sGZ%Q[OboGO\ȍ lQ1]6n阦2Ѿk<g`aڐ#&ξj@,Ex{֣/*N]N#LUGW"uq`>ʹ<_h,]8^i4U]0v}^|! bcIί(t!|GDU.x`FYz kV Bߒi^@ R $7d&f6Mb^D&`֪֪*[F=-e5Iki^SCg |]QƂXdj]wCU}vOwr|Lx$sx03&%aqY嗋iingLjHp;qD%T*rܪ䤳N '41AGrEAbOS(z QWI3K_^d܃kj2˽Aݸ&{ 7Yq(mam6pP:/:fS~ 鞏kyBZW융Υƙ 6:W +1 tcDrVLbmQ­گ{o*)}ZE/%wЁ_Nj} nc*Uq\GƢ J{ } E TRDkp%+; Lo9|k>sl/7\::x7Vt؏)it'PgA!v֒i* >m;פKz3 .(9h#lmG"Hgv[4h}\pjAIAa"IKW6VIp,7ٳW'|ߠae6kXtm]e,0;h#BtYY靈;t]ȵuXtgD0U*+t#o/)U7S։`.+۸E-h2ʌ),.mZFj]4,+5 3n0G䵰)4!?@1(ܧ|@ EM6z6I銢LեUoWmQlqB):]7mUPdɢ(ɓ(o;,|rDwo^odAXF\Lꉁ_@Зt73EdrqN 1OZs=X[_>Z\b5n/-\/ $x|{އK#@Qeq@QkI500iAՊkfUkEù5!ȑ#)85^:M:%m-i, |EWkZuQpxdi<;F=oGUe-Y+vK$궒L5,8d弸`3PpzT$gk&7+mM7.d@3E7:7ZB[BZ#W Du7)CO#cC{1UP3c&Iҝ x$Z3D3xğ&[(PL},NX C(bp$75&sUOLF`9E,ۯh!=]2 _X2rN@"r,Z S0<}h2h Be~@14*ޘeڥ=,&, wKL~Yodse`$0K͜:U&6鉱 MW&}^1EdBwyZszr(0AgP$Y.;R=km(ܹۤEg+n)7Rxb'CJ{{;bb8&ͼR®1x  ٧@vX\ >UϸWI0fdFF{Uxvhнhvؕ_瞔Eڅv-m(!)ȺSVwp>F6uI ;DZ[eZ8-J}5!+2mQ (G+P̭rQa$x+j#$@K]M]}.SSǀJjW4(%N_(0VL6IIJn:u(' ^n$6KŪx=Qmȹ1 Z~~HD恱ǝE*C!FwVaKEA;¢ԃ }ފt<\OsCĆrO@bK(D.{LLzcy4nޭ]+w+mT[`+6&X OfLX'Jq ^D;66?\:/B o$ Y^y#P)+E=U/ e8"%L MSh(n(:vTւ,3[{/pC8<\/Ud)w5~n_9^fܤoB{{WT6:-mhŸϡdy-7 ͍&2[8wދ{]YXC<<!\t/xv-npr-҅ejeKG^x߹.*qY1l3䎜F~Yc0bIue.r.Xގkqہ6؟[>W8MY[ qd-^G)l h(E^+,gmCE^]~aB-͐>1mlx̲,+!!U}~!7JEgˀ Լ OhQ)dQ$kck#%ezX$tmTdZڽԣots ˈG;reK^jw@؞ۇw`\EIMc/{pމ~Dcrh Y_YHS Aa qv-8q$]G 1@ C | Pv"Ȭx׏mk/[wKvʲ]{ %a6 ɞ)*ڛ>}#}iV<[ql$aA#u>k'6 ALhPv6Uw/M2roxmo?㜺=5tr C_)QX}a*UE0QEQFCI4y ֲ,eYYOCrqDC|G|a6qq|("w:E Gx׷uwRc+83YݬW\;=uzOy¤Ir&J4pϲW8ޟ0KʻX0ljڬ\m̋UUf?K[yYag= pvA]>19bp 3_[Ariֺ\M$VYIe~8܄+5=3*.uΎI4"f[hL4.']*. '[\6ֿALFIA<`aWd3R|x=F5nJxlƵMOӳݽ Q] jJVюVy#HSwCpgx[ɑWo}7X# .khT$RųQHݮ@1tߊ\ƱRF");B v/AIrn[XCO`f4hTI%aHfe7a1S2gֽ7y CTeĝmaQ㫂rAeo.+]dA_N2dBw辟d,on~q? "W_.yЀMbߚVƏ/+V qM&CVpv/P^'!2~x*sA 4ךIhSO;,]"/?|ɠ w K[u甕:d?x(,Y%@-țW;ZFsgoci_ѡ&9٧B 9F32sd6UG^OlILR,k=zod]qL4u1둣"^|zyzp7̧3,9e%ĭQq*`hu׷c-ƻt=qIY3˷.'~!R-s5nMq oMD|i՜\SOBrTf2\rL\$3Ig[ؾȿr 1f+6B~a9h)UbYk xboo"n(J!|%W 6mR!F] kv.=P3\CLq?.qR MZJ_Pس˿.cѝLt5!)?),,BkZK!(dLL@R;X7V9+kEweesIhC@D(A e^bnkg#rroXȞlN6jIOJyph~78tH^65ѮHLSM8F4zCPn$Em,Vg^,t+jBk7r0)q,U{Y|8bR'$[fH7=ry*JÂ*3J%E;#eo4MRjeX;X)X&|jQfr2"+ _ylaA\~7ME a=ʔDo-bGܬ֧'f]HN4 aUGFJusWE'J8NtYF[>yFou_ 7:IBhvm5zʢ1x\0t\eo8|RpFoيc&s+؟qVբ=rH5,lt܄HO=m"UhH_Q݄/ xk!4b_I|˜j#I0:xP|+7ft$M´۽ˇncS ..w[RbAxow^X.QmSʒwv vYF:8J։]4y#r]K    Kec %Bg7e`)6p,[f~A\qlԩu&pӜMF惡v>-)1^1wL&YtTp|sn>,dNqBQN8VF<iba弍jrP{4.M .ʻTy,:.o 32qD=&[\W;3viP69mP1(Жu:\YOMwbQ=B{ݻAse\{>)+9`ߏ2hQtmh$u[qC-(ueJ_hy_9DEJH粬wB`o=sxc/FNt:։uұi˂s(N,41KkD9k_e -Swd7~H8a/^#nWL?K-dlYp6ӁU+r.s%QVl:t.,g8d+/xhPeIB$[,bs%nlFY^7[+M+jV{C?tҋ4;-#ȹV+/޽&azZOr0kI.0#i+zm0T+z? `^>Ycץk7 _# G2;ԙt=/WZ fe I}Ciɢp}̌V}E-gM6 ٬^ȫ4-g-w(X_]U^ &UX*-V(WԱd!nIa-~΄GjٲX~@/6*zsL5;Ύ(i#_;w7R\^ :q@rx;_ܟíb ~aɓ, Uc:,&`1ULtqO=|`_KoWT ).E6 \kpf3ԙ ӆm01n(JNdGĸ ~5Q[i++UH7ps)tѶtD8")G=xȑ_&e;r튂Ŕ;i"CBX&_Bw@h6ۦ,2!gMun2B3셟k;7 ؝ o|~Ns  I 0 ¨LBѰ(Ȏ=@-Q> nXA(4;49h(na~țCc`C}}mB99E:gbmq\¤kib!/\uڐr[󢠷P$Y^7a?"lA9uIwq/)]x7 :36nCnbu rߪ\% TgvP?nf't#i =t{ǗDݷv',nA=N=4N}E˗%~9w<1`B5={Ik$}ԝ ם-Mk .`Isxho^cLžAW3ʈH^|Zu7&>OHZؘr7ˊK'ޢIc[oa)g.zE5io;;еG4+ZX-ye.F~=6&x?$>8ƢP"YxUވ_rO7'+!u,YI+2^eh@; qߙ*=1h*R9%nEHbºĈ Ily+*/&x!a9dӕ'*6˺))T, EeMܕC<u#pg#&*$"2{*J6oOaRQ<bQ]BNZIܝZV\+޾Sr.;8bw" ˢ"fY}i&.teBn oz૜:liIe ԩqE łb,/rus&.rbF7lR^x8X"*aJjc3) Kʟϳ;bҤqdXp&Nɪa(ofYK cohO'=#6s1ȷEPeAvl9ReukJ Ǵ)k'E }| ۳qWR>.e{*fIXy[clSkYm{LΫ/;bϿ[m9ʵTBLM%ƟT) )DHR|^ia&97{٘ t!icqt:&,< jdˢĖCы@I?q2.)9qG@X8.=TKO;&q.eř\3;GpV M"Q Tp;-|,6=XHNyT,v ʫ76f-!aӛW_6ځBCSF}y|W]gaRUv_;-@;M%98".iIB Afp?**;AAv "(J\a߻{]~w_*'*Jni<7g oOy2Oƃl8*|S9jħ^|$5f?aI78|M7m7N7=wSg7'-Ug>Gǽ.@t>K]@b_^c"&#: ܓy%cop M'Qw:9a`Hy^{fix o3 2)N#s` &xVsLUF|<ϺpHh4Htף0 !iԪWVr^|e (2$tYF'dexu` )iI)[[p@@P]aRr%|fW> `ޛ'Af#>BiP(p$sAJvv[4bԢ&o(;LH( A{d8 &,#iY  }?|AvFeh2Gz5ac)N48@0@HB*gpo(4PXND|9!:?ŷYgTyq] F.,.Du2B+fdwm;\7:K4>??;?MFR8ʪ,^+R(K;L$iԓVِE -.,ם܇[4Oo•S@JbX .ter"upҶ? Q0i4au! O8 B0w: f:}X@9-SKaJ W\XhZ^w8̦NE_p,7#-pһ}<{d>gD0^ E Ka*>0^P]&ݓIV^ě@1Ț؉%yqŅZ ,W2,ږ`pYQMHm|\GeHѧ#Ռp:21C'rȾoW]kvHi_ >WF\/MmHNO孎wP2,0(Rz>Y.j[t;]aPO,F[5X$,vCLYl%ɰ<ޥ4@^K# trK u@ 8z KTd_oa/g.q޸  PmK$H @U&FpQ΁rh5lxb?CRfSvUПmxѸ<Z74]K+bs_ӭ:?żП)q_ bר/0BS!DPVuŇF0B !~kYDOK8/RebxC!}Td%)+HP6]⡡bw냰EOѐ疥C;l҈AE*e~[<4.G227ݝrEętA#&`=m^lE'eda4mEhL Xvj E~6J{;t,?3-11FCNld *p++9i21(ȮKIYKiUJ4I|Ɓ_?2` iM4$4@Z(BMX?e磓HA#.q{iZY|Bò K$zL 5`߸-4apLi{|IhtQ#ވip&RKq&J] 5D}E|j2Չ"F&ZDHLnq@SKc\K'?s֜-hd9[J M@5fu@(B -yKjbLc?5)KAXb lxT qef1szθq'C0ZՏhox6RjeQ*E7S? |v&'4,0Ү 9뤱^Ps ?G4ع MB?|B:qP(+\G4X G4%gӿ6Z v9юȰ`1 ,^QE'ʹ3LM^BcAE> SÂ^n@"F)H+ (Kٽ K7F.f{`rN?C{\,I+40ݬ9G65fY`!w0ɼLDy4jՊ°U(OXAG(mI#$#Q IR QPNN$\ e%-"T茶?&Y)_<*<=N/ >~Teő\:ù-w8߬#0`,0?H٢6$Eµ R.hiɘ #FKS-nڪma"WVb{4kֿ sQLxM`Xd⢋}+Q>J<q1F}*Y8Yv@^| 'lTF *ᕽfscVo6xe@ u-h,C=?Dѯ-eyT$z;( hRG}t(B?w[ dK]ea:OzpwjP@`۲㑜RRGX}EPp"=G%˳ .H} ̘䰜)X\OX& T6rKDyjR~ř{XnN'8mرlémMœTzzbQS0ph%tF|A+sD|ja?u3 `3SXY`(PS-2'?E8X2XE.XF> .+ja8l], $. PA8`JrK_M%?&t9t[ uSQ$prŨ(SSr|C"רo\i_R7V2?Jg~:EalLmJU!2-E!arXnlns30Il'U\Uf ٟCF,!fË<$"-yWPTgLtx`t x.UOzTNc4Â5,:5dȎXC<,) Yd D`l)Δe5„<].54d`jzXf"7JI Dx( .}:PjU+bQXM;X Lq!"mQ MǓ 9ו{YY'ZX A-lX: ^j`* HE]֣\w{.}{gJ0f(:Ԓ3vUr x}cz"A!w8uR?pZ?P9=llL\ ɲpO#1"kޠؘe@m.5?S:cBՒQ GlKj/+fH]4]d;OʹSNr*̗]?d1_^!`u5.4FUHE~%_Ydd/ ˘gU F5F9eOJWMAcZ;y]eKA<Zٺ}̢F92RfFfhڕl4HHVs92Q3w .fehh(cbrU7ĚG;!\5%E1*Xa_k>~>S :$AR๖ϯ993Ɋ (Vb@0n#8כsH@:&P2d>15:8AA};)~\̺JrYXtwXb.77xg1v\HOpCiJQ nV,ao%syP!M?`+t>\X'nR5 Qaqy@, 42{g. Vn#-NU7KKXLGs}SKKY0 ;Cv,#f&@潊:] 銸%=W:H\ip(t40l8,K#b ŲkhEi8!1Us b5UX2i,ۨTdE Y5E j++n଺qɓcfP(aTQ*l#L:3=%h8)7 ('F&AyI e X'Jɘ(;Njs ( ;y_`2h[R"u}j2 f`|F,,Z)aNޓ,zX ZGzp,IRKw疫9yYD I/?k?zia%TSlPrdYʖ/ z.R]!}e6zéJɐ/)5kΡ%E/Xe)'L,$$m=>igҒ~w7g@L\XP 2:gN Pʗ(TM+k/lsqFF~JӐ8C$/5`xB=je̩%fE}dh)L'tr@VlӶ[ZHcЏ鐎p"MT@ RFERJ1qUl[o&8mE%錢!4KnwTͨ569? CzҺ,)6& +tdȝ@H4h؋ ]F5@`kvج=2^o-~i?MbbE?ZV|""3|&:5/USw$aHS`;!qHM8Yz;&izK%5?AlJG]u@/XG|D??SNQfdB)ZqB/Qz{)U4.q7RAr fEg &D3hcb>cs93<#Ry~Fga:"QdX]FSܴ)X}QA9EC -J"dfOt%|ijhfL' 8sﱜғdpfށ(+ XKBa%F* q~b%Y[DV 445s&-׌06"-"?MZ96dIq}{KBT$lP'hjd<(H(9P/-c6ohR !+q8(J4؝(c&F &r"_\tRJ^0a&k%[ɐҤy"~yErH4y0КN*gv=DN4y!XHJK7m4=8h}c=y( tk%,we ?t Ft?9_E+Rp$=#4qפ_>Qʷ9Nx,*+KΤl ͤŪ^]6z)(2j]TV-z儾|I6QHD1q`وӚnZvXb.*QRB/=`<׹Qv >Xsר [\8-I' cӞtB9Fq~&]^Z|ŶnzXsBfl>z#J$4n eyFnaq: 3"MW)VZ:uA,\ </(nU i#ȴ 2ULgoZضTVFSC(YvF96[I%KmDJ"Ƹ) >!35th#%}h_Q-%`bAxFD6R©"nF[NNŁR)JVQ<$APVYao+6.6r( 4t`Lۈk6-3iJ0TEm]h'sxh7f't;͝=",(,Ѝ7/pc uaOiMd[ ZYT.\efBuiuGmN#DsTѕXS0n]V:UmiX@m .=Ζt%Fez]2k d734*HHQumlňb=##8V;)M,^OKbh,qA@I-`[l_q<49mT=Z[#W'@`Ed]ϣcTd&m:WThaIQMMV1FK̊dq`/#Mo /4};:k( m*7MB (1lYau&^or\gd^,ǭl Q2$0̪SfŤ Xh>71KF?:ȕz3Lzmoy1RK8Ǹ̛-0_?aXq"j`m0g [,)s xrv8ʊk$|,թD 58#vI<$?e.Q#asE1.PU Ds3j1 o胳fO4UԀvLhAY+TxWxF`[sZWgnhM@qIQQ] px{"gg]iwgqe@dD\H9M'6c٘g"ꤱ!K7q Ao AFuBx|55$^M{-޸E7Vi8 YQGPT~ŕśU#00 sAo!y$NG~˝97ڜnYhM9.{oҗFkv>!`/8*# YE,pJj{bW1-좤,At11|EcޢXa@-rˣUEE;s4k\ -J2Qi̵m|rqDfԌN:-pVҸo]G|̙ECa`p0ON"*N^mqOA^\J3+(!}7 B(P&i7hpU .-|ؒfFZmN9AF`\=\- (xDjUޚ48ŷI$;YL-"N3C$:Q4KtK%e/vFuwY*Pt}zhllHA??敗&'ӆqL1 M˲>t_?6(9c- HT4r,:UQ d5@;,l_m\8נT[aÂRFo FG HI3\H:jhU)9&(y)7oٲBa=BM/#nx\E&ɨ-6(rK9I<XZZؿI <,;-Phg)u@Y/EwI3Y 9+dXg}wC SXܩl^#op/Y= ka x[tI- O[ qa۵3TYkmk4ZƧ ޢ`_Z812#YP Khn.>cTCiWy9@*wR/֮9/g-dA:Uw[ CK]PY"W\+qL0Ra"P̖d>aY Mؒ r)=s ;쌎vðV}c>I|ȃ_;pWԘ.HܾrW:$4+ƙ^¼B̡r}. a.Ѡ1Jl`Nf4{by}EQCci5J XH/X 2lR&t%nf`$epT5m {b,\b;G._x f-I0׽~qt K+* Ř:U,MCHYƒ@{D>M)[z 4na(W4Sy=e#0 a9>˟sܤVɄ]/[NsmQi 5_?tQ-)zXRE ,øCף)܂|wCREO5d7l420jߵY [Z7,-5̯-zRA0{Y奎d?HXȺɏ y;rXJ1o훔L$ ܕ2E!EoЕT"sƵgJ%i"6LrqErˍ*mJ&xZ1Y0' NzZDk1(2YyJ,Ksp}NqA1+ qV ,8$ XnSQ V H6Ԩ t.d#z_)@ZYy,hfl 7nt'i9%L9ݴѯXON b>[ʚ)'|rpޯZh훓-#,x kL.YRqe0b9t1F膟?YѤNYeU;1 ` zX[jr`|/{Se5H?ED"~L c8Ng_Zbd3_&-Kktudyɦt>䎢v6|t(%8oX>"$r9tVZW` AaB0a}y sʈb|Ζ'9GⒷw*HبcIU}~goa{kk8p0 Z(Ny">Wi\~"O(Qi 9 KbBK} ~@e=LBd !̽FذDerm񢉥n^Ș زs癮y\a9tKFw5KFå Bp0ctCKܞ.\@ VEH8JTshg7]dX(c./RE4ByZnxFYJgl>*rrRi0j60kx(nS)&M,zR΋\dž/bON#8ݛ>(yzjv1q:,[,$ވ^3w\9`$$ĸ~pml➌*K]x6`J4N}6pU$xro5DI)l[4ʪ1*{D{95:XW~M0QŮ{ |m lWsAm:pgb!᳿/)t<ٌymqTng)[ >rXnһTOtX$_k7 h|6YjVobz_ ~Im9硒9NEA^bK?3]4n_8*RK|c2} 18 gd\lĬ3ͅk{ȹMl Sʄ^p6$Hn _jj҉ 9 zU9ٶ@e>ߧ`;|Nh5d,U:-q^A]I'\^@X'"CL901l17pCLx\cϞӸ+ V'  3}K0R;C ([Ύ*l<'\E@vk6D!mW-:틘5."JSOc8-+MO}˘ ZH*atJd)PR:({!N_a ~|>|IYU?*yk8.qQĻӸPnj<g/I$tq X|etNK?׶u[XxɮXz"JLI/?`C&(vy('AI/b~OyDGiwiB|c<[r\*WhF]iQ_伒q8jX(uH]a>^L&c0yH}k¯pblާF_B8s0bl^ICT+Dlxf] dkiъ#VIL}EC3M^ DzIlBX݊9*,$5߬T63u,dتx]~ k>\YKy%)GIkӛ-ˬu@ ɧ p[+Mc E2gs0 ?s@h:o-)\c!O=3f٠"n/$'#*bJ&)>D5<>ٔ9d:K@[n;P+zr5낃ɊLح!rg1s9.W3J̖(q(ʯ]ka~6dK@ڍ:3D\XϘ|d)u|.`t \Z#HɂIn̷+Q 4%qp_gQ?"{8\ e6 ms2rLc:LV X̯6˓\t{E K~\QkYqSZqOz W>Y4[*g0pje Q׳o"u39L@(H[j>MͬD:q1v E{ۉ\۷ddݓCřk2F^1mШ0@bH(jJtaWoQr>;;6,ɪ!|\Ax-xƸ$AYry=ču6,˲^2I3C  yʿ>ާr) " X#%o[ w'\Vahb<}Le@1s l/tIZ);{Ԗ nEL{U)x ˉ]XwN (b@7Yb8,%ˏXJ4J:ONN 8!iߴ8r8(x(wKM|lw"@}9 QJcq{>e;)lPNzpxxSU F6Zp:M4*ULm|l[LHa5 ÞӍoeC1` &E\Y9IL]8)d}8$ :Mm6 ,(|Lž(P"2Uo/t}nW1,8ihcLtW)qI0CN[:.Ѧv%ăaDC~WUKʈoQ"e*w*X\X!87N6(y3!63\5lt--g@{X|*N JXˎϻ%N8,יոl;(f|T2FRAbvԇBc)SEy0 S*씐(%x"DxYw2ap8e6'Dq"ƄC+op-ahwh(&Ei@rWn eYr-ֱ\< ST$K ʕ7NfC|e$\ :W XQDy(Ej$% aH^h(;dODD KѺJq0HZ!XEkf{=*lgRV# s[RKŲc]- vv.Q !I=??Lq b+uNmHU86ti3cn;7n=}jh ^։r;Md:K2ıĒdF-%a5&̱J҈9Q]ChDy,FT`yE/Ő .px,)ͭk 55Sk=k{JkkNܞ[KƉ3 s|%uF\V!F8Ձµ⍗~(f0o ݵz&4lM/p]rqtXa~%\J/GNN ~}mkcKBdt;w%pBQ5*ËCrvh'Ks~@Uv⯭+kAQU=mE * *!QK]+S1tgGJXفZPiT*u`(nQrp3_ULyq:E8VJ=.Y*, JI M@369sާѤTV+tET1v K[rK)! 8ژAd#9A=iAdۀ_I ǶTJ6]Wdm͖lI#.7sK mPAf;^cKt]>h8XZuZ3Ͽ2٠-Cr~kWN7diх~BEdݪфcI 2EHoߥ-EK6-ndVnЈ~*+ҐHSΖ,̟&zMIMn)IeP8Viy|xxkAC'XN=)U,$ IID$!mxwUKiwg.Xxoe؏1b<U $TKEU4we9Y1XV$9/h #P;%N ȗʦG⁽ A$g`3ZSm i;@U(Pn/0W}|hg| ﻦUbZz{EYnu8N~SڨSTqE}B12kt = fgl!k/{ԡ.ZbGHG6@S5k%sK:]Ek 9#CSwgqF/\zvC?@NN9!$x7Z6hV8veU-tzH9=_J=_vuں/ȗeĢWXG9Uژ}9<]ݘ*bWZrkt.jE)WY rAD:Iky_p,~gNapey[Bny*8qrɢmڛE ]gvn2TG BFv=97x6N^#M(:FYKQȌRiFV[&J 85v.3''r99@nZn&Ax̀lt3jަ'>9V},ZnN!TA0a!A]!s&QQ7isM0i+monQqjb1 V0h u{,9[5a[ċsN+3feLcRrd j[6,*m:׮  ݜKli/ޢYpt|a)|\bW0- K♳u, DH#[jlXEeYoR,5N%;x<:5G~)0;,׫'lb*EJ.%Mu49K%mՂB-ZX6ǑW.ps|*XN04,F^{=IŋXb))r.Q"+u ӫmD\UCPgHHF:,Ⓒ@._66j }MG9 5DsgCrŝ}JKzp&m?j+OU$ƭg.Ϝ/˹1y9o +@UY3L> 7@>Qv&AYVN5}w+ht(5$MedYL,YGzYH&}5]FR蠼cwͷlF'7 -D؛@r]Po,/sJ &04C{<¼euQ:f!`"'9/Y[NF 0.A$ɡ&^K> ܨ1C@Ҡo o2 [jyㆌ:ڪ rWŞV}L7 I[Ӷ5HJk2'Y0ubX2w*Xti@XEPRKd"V@(l$ >[n'BwY~N!aV*oR ŲĄLQ:H,i&x;- >Z*Ptf1.hcKhDO#n-se*gzX_߬նjx$la:'bZ@b xLBCC} dY_4s~YifƲ~ݯO9eKk㢈ʱJsdfKJb8U@+$@b 6gymW?ՠ;Uc[g#ׯ?lX]gY5d8ivBDa;:>Ӣ xE^OZ((oi\d)@4:$Y ;1p>E(ϳ&9#wp*oRgP8UnϞOhzr`{M#zN&ny}Sf}\"3^-0cD7m"sۧ4vcZR@T06śnVƀ"at$10CTRD}t X՘Z#8;YeMi m$ k? 쳙bctt plS &V`||vEj6DC R{EZi/ɀ@/ǧkf_ EpK!2 Y`j-˓dm ǢBis(`͌neQ\$kZeŲr @Y(kSIM8V+~)%i gr eRT fu/M '-;-Ө"gg nACE< Xti L^XS|+/.s/$^ӄ# ~ed r|q> l dDt+;W-@s>wg&j@w0]*bL\*Xj:XkfLs+^EӅ,&U.dd*[y37dHIAiI 1g: \ 7~C }T =Pb̑Cܬ4ˬ3PհXk{NXT쓈r||D2HLH'_1b%;&0Pcc( %RO*8L-,wr/bU(JH,[ߺmP>׫llʢWOv4-cHmPea k}818F4̎m-(<\f}QT/*f,NɟlK bP}'#80GISR$%o=i:f <H>yXe {;8IL4\ (d!ڿOTܺaE)Ax:#=>Zȶp(jFz8P 2o9r]֊4Zr*U 'eJrܗj 44:`ɂAǷ%O Ư\2,kc"hr{e,,hF hAx` L蘸\@m%2]skq,c5&tyRSs$TKyuNbB# LM<cɹ"i8 C`(,,|Yóbaay,,d^Ϲl,,эIlQ'mH<=Q$/R@$HϒcZED"p^uib@ntbc- Cк Ѽ~>axt\4 \.hYFF#2! {N]H,~9" mNiɋW*tCadB睼StS 5;npXBJ;/mRp@_4p,Y b4#-:Lj MWiGfXM,/h^@.{5]JES*]2)Č_>I||<<*``hJ %t9jGa{gg$_O6Dtd@M qP"6:w:hx}L5 4VWgâڣ;rKxǼ7siP~vPnk S?w1W\={O`>>0\FLaֈ%T3F8 <0 ֈI1ic>}P8܃rU{t%7P} LY֠ ^\^QgX>*w Sl0|<R%}#qit'=$M5Wy(ˆ- !FfaT2Ē0&}Cr2Iʓ(_7*衏*CU>J?(DI{1MHI;EOS/qX qDyhhD\pLFBHLہTa$mug2R9[qTMRFPKQcJE.waQ2w [>%ŏ8_3z3()-NPq:x2WPHB iwq4%5DaH/)"a7rD, JMH Q@g#lgrS|ɥ=Pʘy0euI&/*_jP[dH. YPEEl=P2~Kj٣i)MNq/9' d@dq(\{/'}Bx\Gd }!I7AK`H<)Pr^ d*Y$TR"}JBb4и$": aӰ+Wnsdmq@Qj@ $I &S}"܈ÃyaG$hCΆaKa'$M/PCJIb Lgvr@AJ31D#NP)"NsCyTxP*"LCGh*\DI4i [:!x>I;s_@QI$-YtL$#q-V.ŎA$fHbfDr^W79eK>n$JFi}Rb|@"'|7:>S'HXaN4ɣ:;2@A0C 7_?`((`9,ebyCp[XMk%㫕s Ez\ʀy4a8:]`)ez%W3,^&+&~|QZiKXfxꄲ.Z'7yYCg\? d;`k:7'& }څ9 iO6?z(JLu G$X#HoXz,Cʳ:,/w`Qa=Y5&&-'o bMx{p^&70`C'yC@Y檮qY6w]A!lS,ṡ~ކ?˱2R"FT9}oOl2 D4@*>,5 ԹtO8.Zw4Tӈ1ܘx@}g*`[ 4 'D NGt@/GCyP¡2JИ$d2c&a8nX^گK%Cb lQȎ[tzSSLbr,R4 (<6P.D4Q ͂toV(w=A.؄w{kGJHW{pzvdBlRbk3ɲ8E/&t}<ܑ+pqY:tiZ;[.U0qdC SA;#P?k|Ѭ+ qM(T$ܛ2#E0K"`mi&-M{^lӖ­6pJsTq-b>Y`Z~TO>dqKl h_߰#;VIrU 6Is0J/|0na$aunx(I~$4u>>޽' ɴtM|鳀q"[&Noqe~Z2/Z&b.W$ M" X%PݖYo[8U*U*߉ @?{X&%liq<.̽BHVɘ Gh?GZP"F0*5Nzz'Sfdžnn(zHG;PȮɸW .:1C&/(R@|^'ƴ艃L8ɬ:Z7^5I1p)Xe-+>܏E-ł8V(HR1y&b#[vť@6N@,]14 h[0/2G} Yjr@]+1l:µtXVCqt(m_%vv>_1 $:&; )Bht7 PXL-:q]!|AW;)C'TdVX!gHqe-yJAb:{OJʸ"i>g%#2E!2^!*:BBٟM&!={BIoCj= m Yfˑ K#NDIcOѰJ>f}E 1MfrВ"DAy3bE9 εl扰ٍNKPFsY],,(oczeBb;/V hFġ)8k .@~Iv~HvX%ȑf miWT-iع'^&`}p[&w=:9 ½98̹lK V E"OgV4wx&+jt=~;^eܑ0s.+E :.C?-$h%a%O P@td.WA-Z-Ź6 @6WIx\J%a-f~!G/>apл4i" 40 'v5绥+y8틵'悜 4}dN*|.2-lHT̩d701u^X2NN^T.[v[Y*pv.78&Indr8M7fwsQz]f*iPY&c2g5^9r?,Qm6YNxwF,h/O.I:mmDxe+-VVחv;ʍ7M%v,HAg z܎ÜUt/]$OdVpŽG(fBVLgCn–gX`';ۉs+ }Ik~]iMYPvEεI,F|\7v!@R{` |Zp חM,*$Lj{JDx8[@'WvgXUȯ:wG,ï 1hod6ngVr݅.5_m$!Oz`m0aNhRrUl!y]eXP&/O{=Hbq atʍ'o?,N:@ b!Q$ܟM<|QЙ0yB Ӈd2`bSYڔ9QcUwd1C`= lɝ/ Npz4 `C/V<&$hmMo)8Y$f% f T1FAqϭI>wZƹ6 a! sVrPQU)[X(L4Wo7nႿ̻A;#s<+״CdM4-E娋{VӪ~gv_@,fD 3 @_ۂӌHa`89C$jQ5O.oei89˂ŧ>&ô,:)n (rm'pI@4zfa9 0d&ECr|@J> k-R{LpJ$ ];6dP%sKD3[ڏʋ´w)&oS25%3C"֖LщL^R%> شTw3MK:Vq|ujnN,P 9VЁ[C6J_VZeGXk)rනd|%u;O ,>/}%kCB$D2<m"qU˵Ӡܥk tuwŔc\CaO{@s4^N%g ex' -ArXZjw18:{<RZ~y_!ћ7t6%@~$ B1{ ^\XK 7} o#Iuޅwx >rا5Ir/ڵx'HIPB=vgE %]wƠ,2nͿ3ojY$=йJg.anN5ve%2e>8 tb .Yra"]w2aprAOۗ* 3= sˀj1UuƻlD4]!VH a4th#KV#f1s5 A2 01n:r:Ylء.ȹ\C](kv1p4q|ag잧h'[ÜɵKuvVB>$Ibc8:UP"̟Aᜋ&k@m"|%Ls:)Z$r 19KHqƾG5=/go? e~%5& AM²a|v1eC˓do qoI}L[Y ;.y{HR fτ#$߿\nh Ф'|!l|Ծ VYQjD(X,NX>Ps,?< Sd>m@s]„X YYAX=:qIs-F?sGd2&^(2l$YcWw]5b?JU>*/X4L1&͸toξSrް{ϖ&AQy|%$ƴX=K9-({<y9 ;?dB0{2-grhlG]moiXQ» ǁEx_g''s"v@;:"}F(y{xu0@hrˁrZ!NDF/)+:\t/7ϮI&^VEl,K]G-וʹg \/):St.xQKoǎh%^P/f[wV<Κ֍ lf'Q^3)#jL|4|ʟAGeAܳlVq0P(SE ;pzꔁX ހr{2Yds˛}lM#QIcErqHLnF'|`yThWd-~5Xayԧ]ʹFX =`"qVLre8? SXR+WHTx%UXTͤxK1يо2YRX H {rHywI= I StUif+ L;;ͩƔhShL $ϙ(#%h;~ ='d]vd25R)YэS_*_ ~"yJaNw?cHW*#khV .zc0gaN6O ό' e^0ErnΞoX^AM0*Ƕj $ߙ-pvJ`lo Ȍ;U<+ E&W~Vko^c !e2s|_b]SQpCfu$`$]P|ߒELi}YlL7|j\-XK99o {D*Wع[=&#˅xHGMr{In9~OqE]N#A7NYުMD;,)Aw3XXBSPsyºxIKvmV]F6n!i4]i*q%kU$d\mgCrɩxV?a?k5V7)(}&=; <6T H"i+>+kZW C<\7$C6iHMt ,k =6Fc-;2sn'p(jeL)άB -gmqcD]gajqQ\[M<>t ŸJ^~y4~X'f+k>hiT,jejkCnK05ꗕMqcXT55̮nB q+˃[)*c#yt wmPc |q[7:#m4%"u*!VmZ,"[?/xW#@IB th$N|-ֳ6XF:V8VQiT 8khFC]< }]g7qpOW86j)R7 'uCivޭB/l^f5PlQ7.H<\(v6<4w'  R2YW4D&ŷҽ1D9͊7*Sqb ,0Feew?c~:Hi Sg嵕d+b$-" o3JN"K]SB6hVqa= PؕfoV߬{NL$`%Ϟ,\d9Gn1",nq`֥ɕN.L4%.79U'&a; gerћN/4M=!S*䡋r=!D/iE-8g#cd#$P(И$ӢK1.8l/h۔.5$YAwD+ drիs/8t nJ6:7z̹+:׾kŅV\aw4>(q/\Ety|,8#Ok8[;R`@`zZ ! m?3ϵL4k[ܦ0^@ni݀Gp[V }tm&^G!Ht=X`,I}i YR$.+kax.(8^78]NdU~> /龲oskE#E Es$ EUݞC>i^xK9kDIn]F -Z${ZTd8MS+1Q5&4hĪEA1"╒ =;ûe^L!oqCAtɩioFEvKB/'ܡ#3$s癚 yv |Fb igdaghSkyDerwzS䐌&HXH[W,wR cs 8ڻN^i"IYWί@Ğ5@U8?*93Zy.6)QKoRvwq*p^˚@v^9c]:@^ ćJ?yZso6,{8Z112;\ bm|< Iϡ~50@jJP!)MfhN0%THYxySe{0|)(<뇒~k>˪<@nȺ0 (Wtp2 6X@ 8ĵV DzZAb޾@Ŗؒ 2[csO =`^];(Ia pѐ'yM5%=mjR!Nu1^G[L>-+CpQ,+X0'$wc:_)X'/I9.si#wD,Kj JqLqB ҟHAR7NL97:n{ݭ8qo`|#anGɥ!pӁHK(xC(v1N& p^1B@z1O쐙B$뗮ߘmŴo˃ Q bǻn H CH=A7mQvsd*2Q 5c!;t,_P%3IzR& iL*2"[tHPҕS#`ZGڞ*Q !0a $cN浐u) =>UrY8B3pNvٷ90qiͬM?V%.1؟.y`/(ѩRp5fL0(quRUJ[Ч/tAZפ7l(XPrT|例\(އ"3Ҹ :i[&OX|9ʼntd݉4DT-wAg%*dэ$B"y]0jEE}SH__rwx]<(P.8q2ȷ#Qt|Cݸ$y U9)Lꌲ%jnp,`_ZeSƈ-wvIvJg(>MD{IwZ a3:}~ND)dUgD/ߌ'Ɖ[߬@>h|^giF$x$ͳ4Ar=`?ˑ-h[xᏯM 9.>JI2a8OYez)$韄J~ぽ#0# 8 ݺ8,Z%K8!=حw,5lU'RgEw#IOw[+{ZAbcb%2%p3mI$VY?qNS>w5mp3t6d"[- w%Ͳ[b7)9nzWx^,;GR,ɝ(3W,eڤJz@yq*{pP6w[HHO;su qyƠaݤ6x%`UTwlS#:\C_ߦuL5HjһQ TЍw^ԩǚZ$NH.G Ikz./,Zk˛˭K.1oXI4sI]L5|#Ű$A>qD9K#V;,אhB^ d.`5x Y^isLF T5*Xrf{@:ndօX Rxc *}XC׶aM2ِbYEv^R{h_ *\HY (cȼ`]Վ@ b u7,䀒3Yu>΀g(͊N&;(JV5_|\*>YtqTww~ƴs9^";NLKPnxL{CoLb}MLi>:pk!_MePH7&|=[$TǸ;r|!IbyHŤ@[s,i]ӳgv}Mൎj`͘rNXXmC妦vixd}X(f 9$6`阵:o9~sڢYH~#M͉툘$"k2tLfsfy]`eau*!$[7; 49:,"i'I2Uq&a%z;߳a|L ќC'Sθwh| '13 -iHPQv@FxFK,(+8!ΘV9b(μ8nEEe5-!(r6NU-vagI.f{ёQJTʰ,irr"_kbhs}L$^.s/p/ >ԕI,w.YGnf1H+_VC]s:%mVV8 HMR⃾dyJwYf' fw\%$:076q"q: @IL3%[yI>(b);8aU]W{pDh 7G:fmepid{ߒBl<%7Tb$OMXK{m%I1IVwlr2lD|t@1CGݤ%XM9>,]Oxd#t߉tR h6~EzEC RVۛPK\_` [i(3!gbiY,Tg~z$F4RE ObR,hEo:<>sX-^nn X%W,2 ?#2f0g kHs{7󕍍Fk{#JrZ J@Y(K(f>UJ %i#B`,asw#,{1]O&`}cLKXē5w;1n'eo Ѿ:yrÓ :1*/6:p̒6\Uŋc"R^?֏x-Q„m .,y[kgzrx<@Hy@"-Z[v!_&l䀂RAy$:6ULN*q B(؋j xzBC+E} ewUgW]]U]UդIL%$ݷ{_tUwL"38&2fa*Rǧ0lT dMd\G\`D>u2ݎՂ\k׫#޽ݘuo Ə>۷`2ͧy>'t2͹Ao݃`|p6heY7[[ӬG'KcSϴ_zfgvgw3 ̛3LӼ_M󪚎x$K,K eK)!uiCWG`^/!| $eFhZ1@˂`<vZa؋T{bWcwG=:o-xrn\MI:)i5 IZgOҟà #e$Ytd)G|<. ABe&ó2ϱ7P,} Xv 8Dy?-i`_aOpK:,M΢{$MȢ9P*@(q>({Ka=&.C$CW%cCs`iTzǁ ɉHS:I # O'# hAR'[@L+!dhơ$2DɚYhX,Q'tð\cj -Et.ps` gb@9h hҪ= Kr%|ΠkK587$@V3dAC鬀x,JY;O'VԧY8F(FZ.d4p::bGH)AQ{I$UrU$IH sir;>(Oq(jV@ՂѢeK\$U.(P{x3uS+Fݰ`Pcmp)g7uƒ]$ ڑY }cMoWMԷ~1x#` Kv:G3Z[u|B )GA*DG@~$0v54-K8y4ɟnуB`vfD q |ׅ;D ۸6,Ee>,or.ڕ>t\UAׄXՋW4l,R=^9@C4F`áKF,I b7 2^˺e^IΣS 9PhUr 8;As _WjHK9psjuP6[iwe̩w;.$QpYv4lflH'uϖ| ]W5B~ބӐ[4_-~6x!]W -<dܳ`>BpoYRoq() ]iΐ H r[*v~!* L 0 w$ۛ4!#4Ejո˴ m`T ݴ(;bT݃xN}iQPbg>.a:`NÏ| vŬ@Pux*Ўv1%pP%S!Q8U=쵿& 7ÝCľ$h4F:0IଏCԲ>va? 'hLԀehB՜IczA̸}ˡ]?$xTKjtc`"3QbD[uVı<[y QA1|plO 0>[ڙf5t@^XbiY|5.ѯ;TݷUG#>#`Lm`B-wyY7[qdǣ_weSi^1s?_N y47m$QP"}Oh!plݖ޺{Q",Z\ $NX@`#;ѣ'U0 W[-% D"QHLʢ0X$Q4P 1q`=Xbx"ᤓ.L{QZ1LGUZY $Z*.(H{vY95ZDYMG\w, mǎBKʲWp$o5lQ˫48& ۪F݀R(`?'H`%JK}xq^,eFE Bgͪ#.V%2|5Ct#b41UCp@lƨ|i(Sed޳aXF>~ȡe>htc}1wt=Z&!'$VKxN Gy LcqB ݋,NK}"PC&>/UYMb#5[`6%-bU6\Xma.hnv!):&BJw]\JjwO`]aј}&u"5409, 6 8lx>3ҁ+=e2?J(^&ae6iy%ADWvX^,IVb>а/k:nXa5[.:VZ8"$!bQN;Kaea)#cb:BFqK8Hۭ hi]Nt aP"U)-C^,vl($" ,o\a2* xف=ztr)"L56Q9 x +u/ȑ|]"uxQՁTPB%Qam%OJ2 Gc<{;GS$%)%eEm4n |X>kC9y~V9Bɬɚ١Tɝ>Pö\Vo|\aa$ Hqa{!=!:J5M5eenXĥ4d0\|ġW0|J׀8 ZV,]Jhuq;2[O@64]Ҏ?u[˛sZ* }U.cWr}aGv_.5oǠ2,AbCMpG%uq:NGҞC`r<bFk} Ux;@Xwaba~Տ+4dIgG(Ye(I:A8t쟠:ha Xclӊ2'Q A PZFph3| 0e>-V`8 bKceErnωV,&bxyqD42>|=aX;›j \K@rX;qRFq[K.3JZVM|qW^9%?$q #) rY$$'я))j$6U <*+cl+ +rA~ʂ' ߓw1"0Ҩr<ǝO:wxJ2i9&709Q>ݰL`U$?fWM^wG⽢?mbY(Qd 0*v&19:=VD(~RrLы.AV0*(hJ~kaU^#=by7Jk c3_D|3aρ3aP'ѿCaTᤌC-J2 &]xqOj%;ʆSUG/a7&YpդǢ(cvO2gPϊ,?`Bb˰؉6Xti')ĝ1<H oq4 cGpr6h%0Ԙd'#3""N?ree2L](&bU7$t} :VG\n/9|--1 RI.2nІ:jg5H,I4hc^@@IȲFՆGD;We&y#W/_Fcy|"K`LwfK`,Zrp7튤7ޥŋo Z 7|#9ҴӠ`q|QNcR0ŊNjW-48[y%>_:kf1]NDaD[Z VebWBeT[ ذ8|ߘ.V_Y, hV˕{%s?6 *4*1 * LJd=V63j5A H֧b&oCͪLۆ:3u5X~3#q(Mt Gvg[ִEt>*ͅ0tl$Nvn%=մ4>#\34baQf=:[!˱,ٔsYnXZjMXCu&Jݽu\Pd s0t+5`|z@Tgv)ЋcNJ`l]$8YcCn7e-)/V#QуG4[(,s KRTRD fxґD?_Ig'8KLKuf:^Z{Kǎ;=MTFL*M 2?a'q[mMt'$шӬxa Sߥ/oFҴ5Pt2QX;BsA,dЂ?u.@Ҵ pfv#Z b 8q>(]m=,Z43sE"-.cLlc<$v,^;juWt?%|0b&49*Br?u[QĆzGC3_aO͈X`Q(w'uLZw/h[G 85yl,##7ٺATKL{I4]Ɨ72b?ژlX,@XJi ˆ}d3-W)PL3ܭ4V.g,? :k'd Ŏ@"i$yA{lƒ%[ Cg9)X.q\E_}uNEHh2b5&iZU8#Y +XF(ffaܮT$#mَwA^&*> EqL+V&TV$$m^?uvZݦx!x{c\IVF $*WM|9%0!Hb9',UE^pUs Xp9U:auo0jo'AJ?:rZ͡\Pԯɯ42p: 5`Ұt%2/3 +b&eM;-{,P" Qdo49(rV+]/HGhKyS{I_^(CS/ct:ѭ^OMcdai{XQ2R)Ne*{b. ^`џ@TLcXf SlKiU-#U0`Q|"} Hӵr)ƶOb\o U^8N%@XvNW@H3kEf IfAIA#u.dr yÅS0]1qFۉ9韎"<{e -8d^]hv6 1 {.Y}*Gj JP/wu1@NgI;ԪY][Frfn uWq/1Fe-gs 1ݏ6N+2dKLH^e?&%vk 4=%bTpǻ2Jo;7XQX/57?ճꂂ@L֧=-\6Fpn NHnUc}eai-I[w=/\)Wp:"xլ.mgͥyN&mn>^SĎ ~̙ˊu牃,lҍ"L1`+*k"<8bHкE,u-_ŝXZa[ҌazTl LG£~S - `Qk)W4Umʺ[>]'yƹCT{Ëb>ura;zo@=er3Ѱha gb1l|4lc1B3. bbZ Z!q_|QqČ?=\[flma![h' $fYb5]c&rNOǥFp@H$uM6"RewQ (ҩ,!=sX~><~LV7KR,KjEYڍ8lup0B,EX\X5Y/P0фfzx0~ZEF‘+}Plxw9\:w׾@0w1&ҲX&Mh9v]ʻ0MeM`!<3xCX6k=8Q9v.mC6j1+HG"jI"䍼8rOj2k!+A ?l=.BZ(YR1ᙞ:6WQX{k.Xn4Wth|Ngh=Utm7 tڌ*kEp6qyM(Q:GkZ y!1'T0us!1TzH7Iƙ&1#&hyd3\3ji8 -o_ϗZӐ\2E' a\MCG/8fKqiFF1{C0MQG#` Ƌh>Z$_7l)ꊔXMF.iv (3#UNG8]OAW%k7Ŷ{P%aJq'x!!DCh 핤W),i5$e6X ek3ޏ:z'#m맡m ]F1PrZf =|)*$ ̋> E ^Ƽlg dx4٠A,ZZ{(QH5 W?Dxsgul&plUlog ֹq+bYL)NXIVAJ",1cN>,\hn)K󲾏&t^["iAywSss·%SV9gH zNSQ$mYVEb `R'#W߂N#4>_Q&#YHYCqv`  ,/*jp,HEJvqНAXk6K T_/GY):9+ÙApc{?]>;s_wY_y8;U1YٛAThV\rȚC4!bpȍ ,>Uhy*B%#p5[% l̈.qφre6a:BRܞ _}Vq/Xg$\ `^4]޴SIs弍TopB(t;nդc.63@G2yI-|,okis\T}!?`.,)Q|Bu 'G:YBt0eȴL;݃:D rDBMsJDٲ:<5cenc ޲:85xr_!Yn=F2=3}Ғ>d`m0AiHd{-|*ɠh!X\yzSYXv -,AYh԰z,X~Q&UC0D&+T,?svy^LIg~eӱ{R|HM'M?I(pHӴ͋}z~xh=J-O Wzpp m"MG1PH{]ѴqMvkӗ Ώ[gAy {R ^Er;>⾋-H)Hn $V Ex1Ӆ<tú#jt+(y>^G@VɢwH8f߱,Y匮 gTI&#MqmH2r9L,s$U &nɈ,;G.ѮɴcD-:fy-,xW+ʮ"D|%_OM?"(]6J휖C,>;o>C1BZjl9fÂALI= xWs֜Ke/$3MJ9} ].g]xg2 lU{n7X Lf"OB\&(\^$[߯\0wuln;h38A"Z\= J]:Y YΑWYc?kgw ,k)C JP$Ԉ(= 95׏ذjKNK 4D9pk%j[\Vsw8ސy g M^9gxz%fGby`^&0Vմe{#Ұ4MI= XLjTGB]yK/ݟ`"ޑIp yda_P7..&8Qc{b{`,`yr![_dgI.A)/lYvv&Tc\'Rx0D|l*Σp;fTMq!-KII.dE\2Nx.P <Ad1vX%AIOAvd5ڥH&ǬǃcٛmT 褱X\L'Ew[˄7m #B̆1٣bWb:_~;D%7͓! d;+FX(6p2ځ+ L`cC^j  !c~wXzV7e'[wެ5t)m.ӣaE]/mPev4Y qQ” hVOp}BIZJWàH Y0ȟy˛v3f<2C ʶi쉁(QDi#| &ջ$|&Cpx3.@Iz<8(Sܡ? ː=8{b , mPu 5tDcTGYY>1!g1\oHC68GG̦ WXX[G;nn$QY1Sx=WA9*O{*d]4NW_nܴE7?F1we7wi"nE&lAZg5ַ0kRlkI#sf X x}cv  PL~(5kOp(˪}#р)F*Kq@a7ym G;>`JM&Fy;^h^`phHFK'K aPRKjG 1= I?U'KO1^lW;,,ΒUUUW3a&d|} WeɽX^2sF?:tEs_9n9,,ޒ OلsjJnHWļ&,{C'i$axi 孄[O+"&IZaJH|?Eq0]jLNT.S`e/:M{g;2R4$EuĭiĹ&vmM1vkٽCSҩIxР~k'6{,g}DsʄQX`fnD"P Csѐ" !(ݖAyF_ s7S]2lˀQ]!.36YVf|^$P,`2juHX̶ t"PgBd5؟6 K#O8פFT]db J7DFQ}d]Bj?+DqƜl"CKf>G7 V2H,=|p p%*[dX:>E,t) .Vkw,фa/ Äg=TYQw˼gJ2'S_ $e(otYdzؚd ZGpA,gquA76\dlёi>>Ŝ|Rϗؒyn'򁩓ݬ~˛@Mp!^ X躶uD>,>z/ F$9OLJn-2_0)wN]L$ҰQ,b#I[5Y \-^[bxK1x/^K/p'2IJ;L&Oq¼AgX( 8#Cgy׈gg#0/h !Vk0 sO՘)Ț|ڍ5`jGC} >wp*06%Nw#ὝB)_gaYD<$an&Ƙ'@ `1Kz8:khg%9ǡ_vpy[/Bƃ`Ҵ'ć'Ea#?ӊcG:6Wy4!/Izw\z*4V ]%RxҴ#λb-8"III߃˯:(U0u ϣBIՌ$,1 _.'W$ToWJ00h^O'Njx-:\l=tt}ӪZiCKf/5x05{:ÙtM@/<#J҅9?5,8Ӹ~1gEkĔ`zBÑ)Ч_}rA72{ kƀz4ɧqE U{JA FoQ1XҲ(qαrf/Ml:ÔC`[Opn$b5[OQ޻m1LC+Ha/q'<4`TP&mIK){y/&vRqEĈ/9D!ulI$ 8RcocMyrY4(]q9&!7=q,\qcufss3mylk~\p|NKO6+>+_`m,☭@ {F}zkKtq6$gmsm듎K6KB42rsB/xhX4 c{C iQ`Y Hb bi1fL ݷ 9x;8>P|팪q&1t)ᛀME,fL-k%dX1.}]n x2n6B^TETXxSG,ƤZ$œe\dիsTY%;)Kd=s3}}꧚v_N~ ?q c4#F瀬)Q4i@ vۤ7Ejz֧g>3Cvx@ZKiNL{ZTL|-MYzN M(hB8b۾d(f"ZphBZ>Kno6#&z[a"δ75]} hл/}/SJ׉,< mG| >lB"IK Qo@&ф\NZe(KXT/8.=Td n>h-d Y.42!1,;fGuH,0-Z3ԇ=wRۆ4! C =d:l>ruXP[ ,)ZFi XY6V~fXFJ !,*TBC,E} dwYg^_nխNu@{ZXNBD68*8zQ罦IQgqs.E`XȨxF2תurh4.Oj4n^xq'M;Ngٰ*fdV?`kk+n/x<ݝWt9lwxq3s೓?82Lft6*~$n7v֙f~o“o&m3o |l @ 8JL%\ J5<[׳jV z&S8 IM >ݑz ]:aL r0 IU@!Ԉ WFgPFAi.ˠF=XK8]Bݯ)a0(p8 Ѵ Pt&ID 2AyL@KSL`6 &A ި@8>;NR go>]Ƴh6b0=<&B.}Le4b|PB@Գh806,]O0qٵcnt21.&#쭫v11t>$ᬞ Fi JURzLpȇ&w1"y:T0yf@z<3fä)1g/G>+ҭghL+n86^WOYf'[SW0|vT]L2 3PID>>ɶf+B?и}L CT.c2pm#h jC2:ϮT.Qg* Yn, , Kͭ*pϞ"mY;XXtJLf,c&m 0(`r3|vf΁駱iK+ݬYr8~)%YH%,L8ib@4%G9BM?[yf "쁁ꄰagdgP߭" @S8.3#޴GoGϛGgH8 ˮ~K:_s U(H+j1D9!o:ɇa5\T$ww?eXJ8 ` cr}E0^U$v 0>8 hFO?? _A윘g0ʸ<]abz{6#&ݺFy!GlTS 4c 0 ,1&W%J=q76$|Hf(3k!5]ķd Q+MCW0}̓ ;~igwPt br[J l˰-¤?ޖt\LS*_u1ybqx}ijbe8ٍف:f5â"PSvPEfsPKin!^ \HQIǡԀ&fl'[E=hS^[գdL2L%m:AId4N"S *B $fm9;9'w#ӦL7AцpABy+k8k#"1tI`?OJ -XCᬚ 4JR66ֺbڠz\TK*\!޽Q;lDT: htf8?KWY Q>0SsM$GA :s!y`rԩ,O%;I+7-Ζٞ219W4 T V©!G!e50ޚP#CNc 5 P6P}k趺{M2ߓtx)bN 3Jq-q  קC"Zxxxx{q= (vμ6.hlL^2!_M1ma,fOHr =L+~ N'ixYt;m$S+ UCN/Fp ?t(2I--|Hxs-]'u6@oevwOFB.a!h^>PoW>[ uqbÒc`Inӽ۷(tOJXtMJ}B g~f*wPdP?pZânx X>*:>; /h@M_ N{.,@vhjdm(mXx·Q5| }z@tGe<< a+URND1 ZH^|٨JB ,a`B8Q֛2ʩ2_pX,C="wd8$RG-x$yhD.cRz.hLRz L;]V'# Y@ct9`|Y:텂2(7qx@,I!p& D{Cr`Lv'TqMHJn ADPQ.c@6= ]F 1I/%EtW/^6\Ze<ʎL%ɱHi>@b74'9?)V>,DdATF!&^QXbt %Êe@x &VI!ibH, [ʼT!pU9RjH 37Z)[]Lei\-> syӮ)YEHl3/+3ɲ h)we`(~,ɢ<܈YEc*mA ֠`@4Q~g8ߜuvdb+,ä}5fU5(ydP$]&Ѱ:*/Ǔ^{R.]}RKWaz0K$^OB NH^}?o % JLXL)Ϙ9 - ʳ}dǽD( LpMx/O Ia9EKơ`B,<^+(;8vXhHעraA#t@AU_ %]kx3բ;0d0YJFm,I,bN(]=CNXʁ+L^94QV2Ċ(HLH( k`Aam\@|Er˟g1na-\*\Zu(/gL`7`WG!FW[o}2zA~O^\pKѢ.:"2P1K̢̥S-vp _  $ʪDMܾGXJ b۰"}pتkDҁ$f9j~:A#JJCl0x1-,Vi'3^ 0 +9e5PSX;dMðld:5!?b>ӼxVE<U|>ˡ\pm%2)]]-t1z`S;jj/#0aZkX,euϦf8Kr0Gt"L]@eW,\b_ՏdcR# |abctQgtfRݕae_@0O@|Ê;͙<iEbʓǕ•cy_/5\0V1]]N=X4O%N3>Rtqek5I^{(%죒SГoiQbVAd :]/I#{Ģu6 Dzj`P(M2qhnkXȈYw[ qC-xA`N r>л@3Le(lIE42˜2'2'u}TŲ10K*(I: Y8#E蚢omG[FVL#pnj,U7(t2A(ӡ|> eD+taǴMפIدx{ YҺƲ Ŝh*J4 J#-8$Kr+N;x`wX^95QfLDlӞ+y.zaq !K NG$K$O]%.gD>Bz&CM# `rmHGzxCtx)p~޶-(̑c!5`Szt(;{Ġ?9y{v#!G-bVLqtBIBMM]c,9ѻ/"XgO! <%1$ XG=#4| M^G k<;NI(camVJ|z|~W~g ,#и=/aNr3!|G.z|/ ")EYϢ\l#R2³b%ā~LAgs{S3t㝊xs,?TbQTWwd`<)7n`j).QfVL%b< =|C Zj"508ΨjꂷP3hf&{IcrΚ"T=ʻrJ`K$@ F#]4v8wiLms&MWs<*F1 DZ,%Jǘ-PςX^6 QX:PN@xFX;ǻ{&&7emxf_KDߣ`INu+-.1JThmV#2,////,|d0|Çvx'_Ъšрyn~i9#*ѩ8C&L`lI׈LI3IÊb1T` 6LNpKIB{'&`{ ,^ަ9↊ԉ<<"r2'ZENeaW,/vӛ\ Y8%ЇXXډp,s^r{,Cbd7CNn%_.!)S*jD{8Lnq @)3(+> /.%Y=pP$3,B郊i-[7my+_:K qkT7 θoD D:?wSW'Aq-؂Fi凣{8] /$z/񕤾tЍgEZD> x˼MR-J)5V_9nʦs@z$7E5./uX)Z"BˢF$=*|xƛܙZ)|{|C*M xD^+%鐀 dYDmdҒ+…'}y#a5r%רZʙ j:]R݄Eq`FD猫z<J/oGm>DGK~EvDifFֻņH2rL6 tGb>v\70Z EjXU hyZ;A@+/_W;Lk[qVg85s9oo y"(I2_$VsŃ'&D .-9=EkD҄+cƯduN L=" ,fz΂T85`_]9C¼U d=b&IٌV}%pvݗ"Φbטcbf<$:ͯ1@TA:AEو n!邽|͛Ble&GlQk^f[($1ZF%$֕c7H{㩯uҵ-ul>?i8>òM(W~+y'>O>~y"AI;xB2,;<* Y >IvS(HRsTJۨHr%N?#y2f|wkhtolIA< Zd.\԰1$;/=.$VGMY)/47Q Z:nZ 4-X&g0?zHtPf<$H<`a5 *|Zs)o_ D 6oY 1y%xi!@ `0)9S.xYz,V,HEL9w;4e|"Zn2fz.)S|O3Rv1ɂ3rAOgܣ`I[)1q^_Zc#u1r_!I_:ˍ:G+zSMC N$@Cdz'WHx^jq3Y/R'QyEݥ>9IFΰw;sJܳ^"go°OsMJ8ieaA#N2# K/:,oEL 85Й4I:0)EHâ 3BeM-hnsc|M)6,BBR0JPp`/u1`)a]l2"C9ͱpV))XE9W ֩ݱ-RW?X(4f (b_TJ>bPRtsVG5OŠc_d%G(f9!).G[7-e@0 `D)w%tzAh--Ŏ״i@w#i%.9Pl-M{sZWY mla#WOmlċ|8U% ],z\x&짩٢CWĐCBfS|t1R͢ sE譎 eX=aW./Kp򾈬X R_"[zȲs[ӟ-a>Y, hFK-*ꅲNj fΩ\eWڷ>ķ9dLɑᓳN:@J4Ik6pLN88zz[Xp']) \&yV{RNIv9v-//%2Z$R]J̒ms:%-M"Ab(5q iK6mFQStai>1CBC},ؕ{%9V#Hzl뮪s F$t`-,é=}nˑ1z 6Z<3|^L:cce@BQ_a(VgI"^@JkY%ZLߙi ӡzH9{e;eSN;["Cb[-I{? aP6ED= .͸CFIdzwlH=r]M{ vBtL\^P\ fSAVN(Y̨UWv-l;M d~阉fX\K7EZ&yw9>rQeıGt˻vAn8ik$yܼAǝd%܇3˱[>(]}):s۟l0Z-:4N͕ ܌+p|n&Q\ݶJܰp5$0qEhc^fFV{<+FxKjڅ|L֥zȣ|{AbVjSѵ eȴ|!F-$z7㨗4#e&"H>#f75jYl-E7%< ]iSq8-;ou*ob=}nR7-EEZaAcDy!òE}4g>;=Pa88&+c׳n0xApfw@Yd7's}#yKHLP1{`c.Hwg21K6ȡ<Ȧy%Pp g34XnW}biB1lj۬cلYYM Cɤ2˲DIoij\0HDyJ-4'+WiCpFﰸSSJrMwE'RUmL=篵ɢ$O⁂Turk5ץbq7>ЕbۈpG~ E.o4 ;((ʇsak8~Ylkn,6Ifuח<>g!8Ypm'R(Bn;*t,[jj\3|d>_+Vq,P*p;:g))B3T+YvǸ|>8<:Ƽ STĜYt_W71G㇕42&*) \T$Ò%V#f*9CyqO~[]ΗVJ>D~pGYs6sft馚'"Q muvp^Vd^.qOXzV~X8_ab>DyDh~6*{(A5 1EnQ#M;ϊn 2di*t[C<$yVm;IX &Љūq0/gI*z7r|Os"so* (:8I_+ ,mVOM<ϢJ%a1)XdF (;ɒ?ߋԭ O*`1UWm_2p걺GBIn{OӪ%{L0'@N[@k)e~H-l%AGRS3RY ț[Epl3xGD65Ь:E+2 !@Jn@h O(~},Yts`:xj,mnZi?',}ơyolʝS]1q,Kؒs?RY9lޚbёnpXI&rNþߊdyaaTwT["shd٠J8_ŤPbN<[> .!9PhǔJ%= ӄ-k:塆^n35c}dѸXN&I+Xv)$OpON͗52a2w>H=tY3?ဦ! L=3'' :2EFU7' bl>ovƅtXloδ$1HS*2xo6(1Lc }1'E\?s*Y, xe5y,ː|I3.v%Ǵ)JsM`+Q/K9#(_pD8 "9%k5iۉ4H!W#y/@vB6}Mi;!dtmnW#9f=7?Ծ,@KtV rkɔ1!d2?&GPŚlؼ90ބ+g/:1̍AT1wˑ2`PDI"V鏐TĈ Q \IFr _`?PS*cn/52I2rIJe&(Ɯɵ =YBedGR[WשּB0u̚bQ(bPl,Q܍ T2~F="֥D|Xaq_(:"C]0cxι>kE}'Xh"\>0-RΒX= 1D^X<));Pr` }+sp-*$ϮKzgzU;7+Ean`ɽi{Ec& I*IHG,ĵ(] ]kt W/upp} KzRFܬg$1%TӘCNXb'2>N9P⛕<"[-( 47/q4/I,JUQ;|qxǃA&V7a ٳFQ5#\R TĽ M[$gg[QG_Y0IhrNm9+K^(4/z4qL1dLdER|˱C9@$v]c@YQNև,Wc=Itn!%xʻ!)Yl`nA?ɒ^R(&Y~Y-I1Y6`1|GmCńgO}iUȊ $Qz s]ZC,_S@NX``N֦ʛѼq~i83鴒TGM(Ļ*cD+Sok[ØaRyʅH& iµf2-[E;:UR $mfy"| AeGmo8$Kq;$`9|N ´07`|v)tPV|eN7H*o vYѰu@"r#nJHu${/oIo*Y + ..18ܦKqHXSb1v)!`3mb,-c.uLl@YP#:ߖ: (b㉦Nu`R%#C;(ɋu(oͻɒXl0gǤ=4 0]Nv~Z]elXCEwRJǜI}| Z4 F *9TJ\a'_+}y y 9ee~u:z+If]b &@(F ..5޽}|pbKAsl}96Zk3 ¯i]mڼ-ۆm%IxwHS 㴧Ġ,ц3:ģvxo&x ă^8k1pt;2TFR ȓ|7n֭Wz$H#V~`䁲i3q>}PgNYh(uq:H,=q%w%_ԎKvJF^n(`h9)۲oUrccGS\(rucKe.Lx#Ӎգyv4I~48py*ua3Oxc>JY/Ş0Ti^P-PE'p(gU&]"G\BNb4w▝ZOBr]:y.m 0$BC hiF@rLb.6Ʋn.,!e8cy"nc}eN1e,6>ca`&(η+ ċ))p&]x3xAeVW`hI[M!)`Q5]t,*W^Y*|.RP GAG0⍻Ɯ1\tny ߟ Cy6 s5Ҧ3=WMos\TC)g{Gyc>8 g^} d ,IF}X8^p>=ڐ12 6/C ~yGK(%YXKf-,.1jdy 6qc5k2xmD(>ߒ+H.a n͹Vmjٳt?Ԓc&P.HjPd+ 4h<,8 W$"Z\W!NO$*viX0,sf<|#-Κe53mjx],17m%|Eܫ[v9* ռrynXG}wn%&iΜ[JR sA:KrS@gֵ^;PylwmDy'ei78'\Nv‘(8fVxiI2u'Sņʔ0?@#Q}@i(n-F9*ex"^fY]qו͙pإX$߼)x \%1׳j4`cyʹ︺Sl)B~B2!~1 B{3r;"wG./EZ;,~9wfZ(f Ĺ[?c_؟;kdGEse(^0+f +摖:M&Y6aA)FTyT4V#(XժFD\Sgfr$7]bdH2[t:7#U2F  Mz\/'!, K78avĈ8 S2t!k#$3#DI1 jQMH( -j@ݦ xO y˄ miZΝLHg wH#V@ c `F5a,(EIٲH\7V1 Jn`1+EAQ&/DҶ<'E+JjkMtMMqKuM^첥 %r0[r˖2?_LO(qu| w _j'#2$rtJB1lv.DP[9"[2u-r,nZl^`q&B,Cq",B ts5E w ,%zZ.ZDrR'ZfE|1Ay҉вnpnźx"efí[T$:C,pSo0XeC_6?!H|Yid ̏5O;o!.]iM:M7sV6/:p#X0n%sy+b&3Xv%3`.l0{c}0ޫZiws$5僐C붳 /xB^a7|7I!ݧ"k.qoQt8|DdAޙ.1^]WN>(sHb> - [a :HHWDv-G/jCRpRG>(sRuNdk/?@4c /^Y%Re}{8ۢӎ sI޵G`-K.,"mjɆ8%\R,Wx^i[nrԳr7[P[R9>.EJ),8z,Բw~OBCmYXQ<m4rln^YL}m˛[vjGEOkH !Z8Ms3/[(@zUۄ"b 6,ҥt!љˮpu-ZmB9Y k5 1LIܠyhmld0V х=ȮM|!2(2gam-{Qͽ9+'T8R84 wRtO&!Xdg=q04(| 4X;+L|8/JY a 8$_y&cNPYsA=PӪ^Df 6E?Z|'3cT9EIV*J\Xd7/pfá}fy`00mkd,{(!@o6*ML4Y3C4sٲcK[RV M @1)A1./ȺBCC} wUg%uuV_W/n"Yjdy$MF< 3 4I0Qaꈂ0NE2!BPDPp@!đctUO*_~OJ%RqMKJw~V J??ύ;iw:io8,/-vg, p??p}}뭷\_;/s}iH_T'[3>$g8ݾKar{ ߅X&|~k'`thO'ӝP¤$ (M(?ʛdO?0'̷#a3qه)`F`0;IV 5njQ|iEySE b?KAX79ߙLȴ;NGNȅ% .Bd,KC:Sna;R쐛gP ;Sp:uLF͎usE:fy.6u>.U {a TM ' \AB(9#JpX& x qMjȃEX `iS,I|tr`}Y!6]*O2](j2<2e6xK,uK> \K3P]L=KeU)˳,τ0:%^3ˆ)SO"O#<< t4rcAY'Envr~OjSؚ Uu%!>}\f|B`L; ?},>ն]B~oo,07wHn+Ql`қ?ӝQtcdXjR',y~@f&;7'OMH)64_<(=QUЇ~EeF`MO" &w,1Ĥhno4q73]'??P,!MeIh" ?m3,^;K-(%3<GQkے+l!"m˦|,=w oR?r,GE  >սi HRU+R`C#ʃ"6QETT$PR*UW|t \ Jp -4-e}/Peu>d0vfL3'$Kjg_11'̒O+a &vT(کQy9%%drKj`y;`Fi]z]ð?fI*)80+-~Ot0c2U&/ $L߼To2(A_./w3!qWU,a 3%Mf }&[_H2#~EG: @ E83IrN5x-xȰJnIyCR0%%!JK'=;Ph^˺0_ܢ]w]x)sRf"|-*RUXcG\H=X=LS TQHzh˺u#yp 5F,{0&џhrz}R.iҽeIjBi`l=N(NY~~KEnm҃,6q;y(,?x0XIIҁ qco +Pn}SP۸W:퇁.,$8bb~gpoC2WTY ,`t{! = YE U&@DŽGwZξXxqJWaLne,Cci¥UiC2q"d?`scC5mzMM`Diy]i&-EntY -ѝD&9 E#JT:1iw=PʍFM#0MXEЎ|iBUtYS(<Jy]j4SR{,_fZ~ȡB%y,}Zh8t1R߉ zrO^xBcUL؁hu@&MvCp$ U &Z(P8'½Ŵ80]YP< 'i.3qv<ΟU;&Q{nH̭%ž1+]Z/ka,8@nNCDwĚ MCÝXbIWW-=q+ymĊ軔PqV.N YgTsZL43t_!k!CO8ԡTk6 p6:m2R ^r{SNxZg1R:l0.9:O"23xƝ"Cpi%atJH(5t!C\z}].uEtՋv^*bE ˛Xe?ҽ>s `RLu\]y̸b4!qv8R" 2LMZf\\P%lȀBR%DD^ T+r h/nM8Ex}-(522QԴQTSbuW)1lߛE% 5/'hG&jX%^56Y򏣝*\NÒZtApqوd _dxᕸRqYsV}.(XҧdZQDa{ &ƃ0i5*rFBC~ukYtᅫܹ9*h`"x91@O!+~%QPX$OZ^g!z˲Pcҩ$mMޞUmeW~AƬ4|eᅲg"JMlSB4<@\"*࿰&rp-yG>2Aw ]%Ú8vCCjAQR^t\g,l"°DζSIY_p諪D $Q\bkG?M $N=o*vGk;X,CGa4, k}OLI gDxf٠Kxe7(v2{"I]XL΅>|oӧ.O*-ܤEps"V־::AjQ#HU7Cf4CfH=T`n%N"5bU gͅ:Vݪ.w;9Nv9=aQplI^!+BX{FZ7bч iY)/ԉA:vp .*+egp:.oCs)õe)'ͲE\ºm,qF sr dU+&#CC|[g*UqVB@1]zY t(N$0cTHN )tk-, y=_Ωe@IӜLtuZhsA"W5$mmkwoJVEa5#I1."6"5}qy5hɽWoy9!:}AmD);>G5vyz8C9!&,O [8~t;ի.9CԡIn=p^FX1?.[bJE0ևHo%V]r)&I$Sg1hXDW<{G5AgQM>| m :1>9my}aPڹDm&1]SHO 鈍 j$imA4iфlJqΉa& 6T,igcsΎHRL9ߖ m.nv%dA(M3/Xl!R"&S |dFt'nYۀ edǣDbG;5j o#k(ZyՉʗOelE Gع #3I_j7+@L5qKx(l shN&rVcDqa"Ŕj@ Z0ߐkV3# c?kT Y0&Pt(՜$S{ f J G7GK!jŭUl.N@PLoQgE逢.}Ҩԏ4?CȪ&IN<ҬCIy3 %mEwg8! >w 0˧%HsN}1o pXgJ MYH+5YO&AnVVy.(@RC_+UN\Fio[|3Ȝ*+|Lw1A#嗆O\'[?2MXHf SMe?eVķ4eYL %.{q"iߦk΃ռ\S=탇9(eh2ss;e#=.c0݉,:5_-PXn9R-F`?.H6EtEE(ʬy$cb˫W`B`a`pO7hv[a)'Qao؊bQ6YwDzp0>RweD]ts1,[ɶMŧeGe )S+Noݹ܆ 9S{m 3%kIcb91kvEpPt0󄵚p3enHjFx f\'A7zg@v˜5dc&{v PfX,3 EעȶGZ3%ḯ3`KM-4tb/Y`V:8І_БݵfF51 = )ța$ &aFL BغX!8a/|?4Z^X)mSrب#t .Z yFYrֱg>?ǫq=i@X_=QYf@ImJÉOY1CgXC86aORvAfÚv"v^6X!]v806{{ f]Tia'gYؐhOvBMޒx((H ,ݖvt޼ %&VC !ni_}SRg-&8  EqܬlxbiK D's$Fw@LTLDd,U=n=VzhYˆqwtW ؂\!,NQr(=Payi=^C6i~Z1l\K} t Qʕh]Wb^)Cj;,ȰOJ.jO7w'IOaU;YeD2imS޵g|(Τ-۷n-kzį$WсiZ eEbqURB(7i=Y B{L̎UMt3MVܬo".I LE!9:*|~ժ7C: ^D<xǡہ(. .9Ǖfbs" V&eqJQlY/Sҹj+b7**X[nkQQglpDz=ݲkkۃəğp;ąX7ǻV0+!}f^[h퉲=nsme<ۥP6Y[o .{8@hz(sH2k/yOXfIf0 n,ɷj"<@#w8O (KTd|8J*f0NqZF 70Bit\-0 -l7X\9. l{feo9c=}6s 71wi`YL BqN:v&i?TW2޹ҕVkmzq#HH:wX˓zUC"3,˴TPFc4N^xᢇŊVЫ Q>YW C IEJ5Hu fs5ҽ~հ'ΖEN2p ըf'[uJX] m ŭ\9RNynY[6=Yo5$FmMAHg/XjZV""vRaYE,u£&8XPsҍذo|РFi⮛J5 :nBrnu^]zUr׃$_eX܆ %R+c£QniRS ڐC %ݲ,^6{_*{}g- zZ*d1dihLJ-turΒ`5jOإddFV.޶HUr+(2>lY.ck(F9/Wd{.0c(!o}@Sc ={g]U90Jtm5}*_l"F%y/0>и36)JEpܫ*ƪ=e^P>82rrH%^T+Uzg'*AZ bv(Q.Ͳ%lni.rw_iM+b犸n;I#i&Qn@(n*s8(޷b ҏgj^RG>2.ls@cڠ!ͦ@³ C?d\Z\ai ,r6DWX\P\:eK;X`e$]J;gr(dD4,-}ţq cuئn-^"iDj<=-; ąI.j`$ϳTbfQUҲxN [vF_ǂcM8vA7j5a=!J۵*~ Y[S j?$F]J(g>+tA=f)*'6OdB8 ,d&M}{ e&J9˵>ir7O 4O+_-XP t<0Q{;b}K̥n,Y@ c6'֕voyC\&Vgz. }V`w?]~M|lye1vL ɚejo-,GiLѵLsY^(Ҵ|\qYآ~>\?ֶgSjrǠʷʞ'٧TRx#;=cAn5΋²(Pvu":*_4HI 썈hvcNBY}Cћm\S I}s N]:<b^Je)Ѭ^k4덕͵ ڬVd$4˰*XPjXǁ]]mid]PUm@`XCD4TLND1 U|}^iL,O0FNϘT //{{B=(X[T e{\9d bjaϐDZ?'|d_V muE:8-1=&RAd6< S]j"PD,mZKטuE0q=u$LMO2\wgɫy܍; O_wCHVp(Vy-XIW[jPFkb-FUr <Ӵs 1 ܖ!|)KHFyn@1>7}qseaْn\&GU2ˡϱ?,F82x:|YgA5 )5x{Rs<&.A(t]۸keh&&WB}}8"kpN. )2iz57xxt}Eйrz?t Ih&XBQqQO~tpztz:'|_kE4R7*P Y@yY.V8;F >QNfoWQTE}붱xeI&x:CG+'b|$&f?a~~~EHq(R]"_%f ֟j㶖2I$¯8m̍Zi1n2@@ uK-pw)۽KYs.]͖}\5, MW.L$ 9͡xkE%Q7w+m ɱ1DKY,eЮt_|vu ұKʮ #8̀Gwz]u DR2,jeZ W@? OMZs_HuՅdƊo(3hThXrひ]xE<ٮu?v_R[cpּsDywY,2- P%7}%d`NEO[CȆ9L5ФiobX"3ְdy,*nB,,]ZV}nwHDm"nO+&v_*i NX9eϐ& -1!id@N;$]JsMcO7ђN(VFs+giQ: Vm>㜛.4kWfqڋ걂^݄sw!w:؄\C>VJ Uv(93wAbܭࠬ _hLrsɛӑjQܾncRŏB8j1Ϋ ()D"4 #kÓLA"yT`".Cެ(5ϬeA6yB+M|'-;dqt/RQƼ|8LeTо4MAwsQkϴI"N;)<.:$IJ4b[,8Y%dD^@@T,2eρts rc3XmH!yX9Ϩ̋\f_-:ooQdFn/y+~DpX{*` T9LYLZ(>6ne<,kEYOTЌBVĤ?*FVsj錎تu"Ju"]J(=$;*fʿX} z2z2d.ٳnTOCb?ޅ(`Lt8"P²aګS}tSDNO5sfn_xNU*@t*E{sfgaVy0MiúQ.-x^ #"U GXpQZہ Qesͨ =,p{-euH1n!&t[;tňy;/*ޭsɨAcxvyD(}w2tvãx>:Ai-5:BHF&KXg> xJò:%=ieq\\YNԹvɩQoee K9Y:C$:Y}:bG[B LJGZ ^)CI!oA#g߄17Rxߡ8K{/2- ظ[bɇ=SLBm  t|djYr*<<<<1>><<<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_66:4:240:264:231 121 chr1 213 66 35M = 213 0 TGTAATGAAAACTATATTTATGCTATTCAGTTCTA 9;,;;62<9<)29<<<;96<<<;<<7<<<<<<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_66:4:240:264:231 181 chr1 213 0 * = 213 0 CAACAGATCAAGAAGGAGGGGCAATGGACGAGTTA %15+5022))0&<<)0)+7:4+&<0<<:0<<<7<< MF:i:192 EAS1_93:7:14:426:613 99 chr1 214 99 35M = 379 200 GTAATGAAAACTATATTTATGCTATTCAGTTCTAA ======;=;==========;;==3=;==-=<;<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_93:2:173:995:93 163 chr1 215 99 35M = 382 202 TAATGAAAACTATATTTATGCTATTCAGTTCTAAA <<<<<<<<<<<<<<<<<<<7:<<<<;:<:<<<<:7 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_64:6:195:348:703 163 chr1 215 99 35M = 353 173 TAATGAAAACTATATTTATGCTATTCAGTTCTAAA <<<<<<<;<<<<<;:<<<<<<<<<<<<:<1:<:7< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_108:2:62:879:264 163 chr1 216 99 35M = 396 215 AATGAAAACTATATTTATGCTATTCAGTTCTAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_61:4:83:452:970 99 chr1 216 99 35M = 379 198 AATGAAAACTATATTTATGCTATTCAGTTCTAAAT ==========================;======== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS218_1:2:64:1318:1711 99 chr1 218 99 35M = 389 206 TGAAAACTATATTTATGCTATTCAGTTCTAAATAT <<<<<<<<<<<<<<<<7<<<<<<<:<<<<<2<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_589:8:113:968:19 83 chr1 219 99 35M = 50 -204 GAAAACTATATTTATGCTATTCAGTTCTAAATATA 8;<;8;9<<<<<<<9<:<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_93:4:160:896:275 163 chr1 220 99 35M = 387 202 AAAACTATATTTATGCTATTCAGTTCTAAATATAG ============<====<==<====<==<==;=:6 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_591:6:181:191:418 163 chr1 221 99 36M = 387 202 AAACTATATTTATGCTATTCAGTTCTAAATATAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<988 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:7:242:354:637 99 chr1 222 99 36M = 417 231 AACTATATTTATGCTATTCAGTTCTAAATATAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<6<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_589:1:122:77:789 163 chr1 223 99 35M = 396 208 ACTATATTTATGCTATTCAGTTCTAAATATAGAAA <<<:<4<<9<:7<<<:<<<7<<<<<<<<<<9<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_591:5:42:540:501 147 chr1 224 99 36M = 60 -200 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_591:6:155:12:674 83 chr1 224 99 36M = 52 -208 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT ;<<<<<<<<<<;<<<<;<<<<8<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_593:4:106:316:452 147 chr1 224 99 36M = 49 -211 CTATATTTATGCTATTCAGTTCTAAATATAGAAATT :<<<<<;<<<<:<<:<<<<<<7<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:5:89:525:113 163 chr1 227 78 40M = 397 210 TATTTATGCTATTCAGTTATAAATATAGAAATTGAAACAG <1<7<6;+0;7;7'<70;-<7<:<:<<5<<:9<5:7:%:7 MF:i:18 Aq:i:39 NM:i:1 UQ:i:12 H0:i:0 H1:i:1 EAS54_65:3:321:311:983 147 chr1 228 99 35M = 51 -212 ATTTATGCTATTCAGTTCTAAATATAGAAATTGAA ;;4;;<7<<<<<<77<<<<<<<<<<17<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_65:8:76:493:708 147 chr1 229 44 35M = 73 -191 TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA 5/)63.&1517(544(055(0454&7706566679 MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_71:2:125:628:79 163 chr1 229 99 35M = 400 205 TTTATGCTATTCAGTTCTAAATATAGAAATTGAAA ==================<6<====<<:<==7;:: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_32:5:78:583:499 83 chr1 229 74 35M = 37 -227 TTTACGCTATTCAGTACTAAATATAGAAATTGAAA &6&9774&<;67<44&-4<;<9<7<<<<<;<<<<< MF:i:18 Aq:i:37 NM:i:2 UQ:i:27 H0:i:0 H1:i:1 EAS54_67:3:175:730:949 83 chr1 230 99 35M = 70 -195 TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC <<<<;+<<<<7<;<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_45:1:84:275:1572 163 chr1 230 99 35M = 394 199 TTATGCTATTCAGTTCTAAATATAGAAATTGAAAC /6;;;4;;;;;;;;7;;4;.4;;;;;6;;;77077 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_108:4:248:753:731 99 chr1 231 99 35M = 402 206 TATGCTATTCAGTTCTAAATATAGAAATTGAAACA <<<<<<<<<<<8<<<<<<<<<<<<:<<<<&<:<.: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_45:1:9:1289:215 99 chr1 231 99 35M = 394 198 TATGCTATTCAGTTCTAAATATAGAAATTGAAACA ;;;;;;9;;;67;;;;;99;9;;;;;;;;977747 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_595:7:188:802:71 163 chr1 232 99 35M = 415 218 ATGCTATTCAGTTCTAAATATAGAAATTGAAACAG <<<<<<<<<;<<<<<9<<<:<<<:<<<<<<:<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_93:7:252:171:323 83 chr1 234 99 35M = 43 -226 GCTATTCAGTTCTAAATATAGAAATTGAAACAGCT ;8<;<=3=6==:====;;======;========== MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS192_3:5:223:142:410 147 chr1 235 99 35M = 60 -210 CTATTCAGTTCTAAATATAGAAATTGAAACAGCTG 8;<<<;<<<<;<<<<<<;<;<<<<<<<<<<<<;<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_30:1:243:10:911 83 chr1 236 99 35M = 63 -208 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT ;<;;;<4;9:<<<;<<;<<<<<;;<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_45:6:5:730:1436 163 chr1 236 99 35M = 403 202 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGT ;;;;;;;;;;;;;;;;;;8;;;;;8;;;;;67777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:2:57:1672:1890 121 chr1 236 75 40M = 236 0 TATTCAGTTCTAAATATAGAAATTGAAACAGCTGTGTTTA :;;;9<8;;*<<<<<<:<<<<<<<<1:<<<<<<<<<<<7< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:2:57:1672:1890 181 chr1 236 0 * = 236 0 CCCCCCCCCCCCCCCCCAGCCACTGCGGCCCCCCCAGCCA -+)%)'-'+,,<066,))090+:&486083:5&&:<<5<0 MF:i:192 EAS1_105:2:299:360:220 99 chr1 237 99 35M = 403 201 ATTCAGTTCTAAATATAGAAATTGAAACAGCTGTG <<<<<<<9<9<<<<<<<<<<<<<<<<<5<;<0<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_1:2:24:1037:84 163 chr1 238 99 35M = 415 212 TTCAGTTCTAAATATAGAAATTGAAACAGCTGTGT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<;:<57< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_105:3:86:823:683 163 chr1 240 99 35M = 408 203 CAGTTCTAAATATAGAAATTGAAACAGCTGTGTTT <<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;9<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_53:4:130:568:978 99 chr1 246 88 35M = 434 223 TAAATATAGAAATTGAAACAGCTGTGTTTAGTGAC 7<<;<<;<7<:;<7<<<<<<<<);4;+<7+3+%;< MF:i:18 Aq:i:24 NM:i:1 UQ:i:26 H0:i:1 H1:i:0 EAS114_45:4:73:1208:495 163 chr1 246 99 35M = 431 220 TAAATATAGAAATTGAAACAGCTGTGTTTAGTGCC ;;;;;;;;;;;;;;;;;;;;;;;;5;;;;;37377 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_97:7:264:642:506 99 chr1 247 99 35M = 420 208 AAATATAGAAATTGAAACAGCTGTGTTTATTGTAT <<;<<<<<<;<<<;:;;:;;<<;<<<<;*+;*&.4 MF:i:18 Aq:i:56 NM:i:3 UQ:i:28 H0:i:1 H1:i:0 EAS114_28:5:104:350:749 163 chr1 247 99 36M = 415 204 AAATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT <<8<<<<<<<<<<<;<<<<<<<<0;<<<9;<85;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_61:6:227:259:597 147 chr1 248 99 35M = 61 -222 AATATAGAAATTGAAACAGCTGTGTTTAGTGCCTT <8<;2;9;<;;-92<;;;<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS112_32:7:113:809:364 99 chr1 250 99 35M = 413 198 TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<7<;<;<<<4 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS188_7:2:218:877:489 83 chr1 250 86 35M = 80 -205 TATAGAAATTGAAACAGCTGTGTTTAGTGCCTTTG 9<<<8<<<;<9<<<<<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_97:7:20:979:96 83 chr1 254 99 35M = 79 -210 GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA '9996;(:;-<;1<<<<=<<<<=<<<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS188_7:2:259:219:114 99 chr1 254 99 35M = 411 192 GAAATTGAAACAGCTGTGTTTAGTGCCTTTGTTCA <<<<<<<<<<<<<<<;<<<<<<7<7<<<<<0<<9< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_39:6:13:1034:1144 99 chr1 256 99 35M = 429 208 AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA <<<<<<<<<<<<<<<<<<<<<<<<3<<<;<<;<++ MF:i:18 Aq:i:69 NM:i:2 UQ:i:48 H0:i:1 H1:i:0 EAS221_1:2:29:1486:672 147 chr1 256 99 35M = 79 -212 AATTGAAACAGCTGTGTTTAGTGCCTTTGTTCACA <<:<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<++ MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0 EAS139_11:7:46:695:738 163 chr1 259 74 35M = 428 204 TGAAACAGCTGAGTTTAGCGCCTGTGTTCACATAG <;<<<<;<<),&4<3<<7&7<0;)).3;79;7<;0 MF:i:130 Aq:i:74 NM:i:3 UQ:i:18 H0:i:0 H1:i:0 EAS139_11:8:26:1221:222 163 chr1 261 99 35M = 446 220 AAACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_64:3:190:727:308 147 chr1 263 99 35M = 103 -195 ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG ;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_26:3:284:261:124 83 chr1 263 99 35M = 79 -219 ACAGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTG ===27===.====&===========;;======== MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS112_34:7:141:80:875 147 chr1 265 99 35M = 110 -190 AGCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCA 6/<;84<;<;<<<<<<5<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:3:24:1135:563 163 chr1 266 99 40M = 446 220 GCTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAACC <<<<:<<<<:1:<<<<<<.<<<<<<<<;<;;;43+:30:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_1:2:90:986:1224 83 chr1 267 99 35M = 67 -235 CTGTGTTTAGTGCCTTTGTTCAACCCCCTTGCAAC <7*37;;;;;;;9<<;<7<<<<<<<<<<<;;<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:7:287:492:169 99 chr1 269 99 36M = 449 216 GTGTTTAGTGCCTTTGTTCAACCCCCTTGCAACAAC <<<7<<<<<<<<<<<<<<<<<<<<<<<8;;<;6<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS218_4:1:48:9:409 99 chr1 271 75 18M5I12M = 464 228 GTTTAGTGCCTTTGTTCACATAGACCCCCTTGCAA <<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 EAS139_19:1:87:1222:878 163 chr1 272 10 40M = 435 203 TATAGGGCCTTTGTTCAAACCCCTTGCAACAACCTTGAGA &+6<6&<:<<9<1112<<;)9227>>>>>>>>>>>>>;<>>>>><<>>>;<+<>=>>+==>>==<==<=8=><:;8/;7<<<<<<<<;<:<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_591:2:240:603:890 83 chr1 740 99 36M = 590 -186 GCTCCCAAGAGGGAAAGCTTTCAACGCTTCTAGCCA ;+&+//&<<<<<<<<<<9<<<8<<<<9<<<<<<<<< MF:i:18 Aq:i:66 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 B7_591:7:129:956:115 163 chr1 740 99 36M = 927 223 GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;877- MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_53:4:168:528:288 83 chr1 740 99 35M = 570 -205 GCTCCCCAGAGGGAAAGCTTTCAACGCTTCTAGCC 8<%<31;<<;<;<<<<<<<;<<<<<<<<<<;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_65:8:275:851:240 147 chr1 743 99 35M = 561 -217 CCCCAGAGGGAAAGCTTTCAACGTTTCTAGCCATT 66614/&3616630666&66666&66666868666 MF:i:18 Aq:i:31 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 EAS188_7:6:205:873:464 147 chr1 743 99 35M = 552 -226 CCCCAGAGGGAAAGCTTTCAACGCTTCTAGCCATT <-((+:+;289<--;<;-;<:;;<<<;;<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_65:6:37:610:260 163 chr1 745 99 35M = 913 203 CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC <<<;<;<<7<<<<<<<<<<<<<<;6<963;;;3;1 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS192_3:7:93:945:176 147 chr1 745 99 35M = 582 -198 CCAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTC 6;;;8<<3<<8.<;6)<<<<<9<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_593:6:61:628:681 83 chr1 746 99 36M = 586 -196 CAGAGGGAAAGCTTTCAACGCTTCTAGCCATTTCTT 95<<<<<<<<;<<<<;<<<:<<;;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_65:7:288:552:440 83 chr1 747 87 35M = 560 -222 AGAGGGAACGCTTTCAACTCTTCTAGCCATTTCTT 9<<%'%<<.2<<<<<<<<5:<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:2 UQ:i:33 H0:i:0 H1:i:0 EAS56_53:2:170:265:818 163 chr1 748 10 35M = 920 207 GAGGGGAAGCTTTCAACGCTTCTAGCACTTTCTTT <<<<<(5/959<8.<9<8<<<2<&59&&:22:8+( MF:i:18 Aq:i:10 NM:i:3 UQ:i:17 H0:i:0 H1:i:0 B7_595:2:251:121:479 83 chr1 750 99 35M = 572 -213 GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG <<<<<6'..663;&<<;<<9<<<9<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_1:8:67:1797:1931 147 chr1 750 99 35M = 562 -223 GGGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_103:2:226:302:758 83 chr1 751 99 35M = 556 -230 GGAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGG ;<<<<9;<<<<<<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:33 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_32:2:163:618:570 83 chr1 751 99 35M = 571 -215 GGAAAGCTGTCAACGCTTCTAGCCATTTCTTTTGG <9774<88&:8<:8<8:8<8<<<<<;88<88<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 EAS1_97:3:73:292:429 99 chr1 752 99 35M = 920 203 GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTTGC <<<<<<<<<<7<<;<<<<<<<2<<<5<<<<<:%)< MF:i:18 Aq:i:69 NM:i:1 UQ:i:4 H0:i:1 H1:i:0 EAS1_108:3:82:356:253 99 chr1 752 99 35M = 927 210 GAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC ===================<========;===39= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_30:6:62:386:959 147 chr1 752 99 35M = 594 -193 AAAAGCTTTCAACGCTTCTAGCCATTTCTTTTGGC %;71131((<<6<92(+<1<<;<-3<8<<;<;;<< MF:i:18 Aq:i:57 NM:i:1 UQ:i:4 H0:i:1 H1:i:0 EAS51_62:3:263:74:407 83 chr1 754 99 35M = 574 -215 AAGCTTTCAACGCTTCTAGCCATTTCTTTTGGCAT ;;88<::+;<)<5<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_597:3:67:620:344 99 chr1 755 99 35M = 905 185 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT <<<<2<:2<<<<<<7<<<<:<<*<<<<<<***3<< MF:i:18 Aq:i:33 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_610:6:148:776:486 83 chr1 755 99 35M = 578 -212 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT ;:<<<;<<;<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_61:3:150:933:810 83 chr1 755 99 35M = 593 -197 AGCTTTCAACGCTTCTAGCCATTTCTTTTGGCATT :89===:=:=;;==;==================== MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_64:4:102:467:897 99 chr1 756 97 35M = 940 219 GCTTTCAACGCTTCTAGCCATTTCTTTTGTCTTTT <<<<9<<<<9<2<<<&,/=====>=>=>>>=>>==>=>>>>>> MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_595:3:297:637:86 83 chr1 869 99 35M = 704 -200 TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG <:75<;<;;<<<<<<;;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:1 UQ:i:26 H0:i:1 H1:i:0 EAS54_65:3:290:558:349 147 chr1 869 99 35M = 719 -185 TCTCAGCTAGGGGAACAGGGAGGTGCACTAATGCG 2;2;;'5&;<<5<<;5/<<<<<7<<;+;<<+1<8< MF:i:18 Aq:i:59 NM:i:1 UQ:i:6 H0:i:1 H1:i:0 EAS1_95:3:308:956:873 99 chr1 870 99 35M = 1068 233 CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC <<<<<<<<<<<<<;<;<;1<<<<<.<9<;<<<<+; MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_78:7:147:64:416 147 chr1 870 99 35M = 701 -204 CTCATCTAGGGGAACAGGGAGGTGCACTAATGCGC /;49;:6<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_593:4:30:812:345 163 chr1 871 99 36M = 1036 201 TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCTC <<<<<<<7<;<<7<;77;3<&0-;<5<;6<1'13<: MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_73:7:134:243:630 163 chr1 871 99 35M = 1052 216 TCATCTAGGGGAACAGGGAGGCGCACTAATGAGCT <<<:<<<<::1:818;;&::<>.; MF:i:18 Aq:i:35 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 EAS54_81:2:31:98:804 147 chr1 982 99 35M = 805 -212 CTTTACTGTCATAACTATGAAGAGACTATTGCCAG ====;========7===================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_103:2:235:805:373 163 chr1 983 99 35M = 1146 198 TTTACTGTCATAACTATGAAGAGACTATTTCCAGA <<<<<<<<<<<<<<<<<<<<;<;<<<<<<;;<99; MF:i:18 Aq:i:74 NM:i:1 UQ:i:26 H0:i:1 H1:i:0 EAS114_28:5:11:868:62 99 chr1 983 99 36M = 1154 207 TTTACTGTCATAACTATGAAGAGACTATTGCCAGAT <<<<<<<<<<<<<<<<<<<<:<<<;<<<<(7:7039 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_81:2:280:512:316 163 chr1 984 99 35M = 1159 210 TTACTGTCATAACTATGAAGAGACTATTGCCAGCT ==<========6==4==6;;==:===;=2/:+8%6 MF:i:18 Aq:i:68 NM:i:1 UQ:i:4 H0:i:1 H1:i:0 EAS1_93:5:292:122:666 99 chr1 985 99 35M = 1159 209 TACTGTCATAACTATGAAGAGACTATTGTCAGATG <<<<<<6<<<<<<<<8;<<<<<<<<<<3&9+;;(; MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 EAS56_53:1:23:403:981 99 chr1 985 99 35M = 1151 201 TACTGTCATAACTATGAAGAGACTATTGCCAGATG <8<<<;<<<<<<;<<<<<<8;<<<9<9,3;,6(91 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_45:7:33:1566:588 99 chr1 985 76 35M = 1166 216 TACTGTCATAACTATGAAGAGCCTATTGCCAGATG <;.;;;;6;;;;6;;29;;;<+9;;;.3;;73797 MF:i:18 Aq:i:37 NM:i:1 UQ:i:10 H0:i:0 H1:i:1 EAS139_11:7:92:367:1495 83 chr1 987 99 35M = 820 -202 CTGTCATAACTATGAAGAGACTATTGCCAGATGAA <8<88<<<<7<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS220_1:8:38:1576:1923 83 chr1 987 99 35M = 822 -200 CTGTCATAACTATGAAGAGACTATTGCCAGATGAA 8;<98<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_595:7:190:481:295 163 chr1 990 99 35M = 1161 206 TCATAACTATGAAGAGACTATTGCCAGATGAACCA <<<<<<<<<<<<<<<<<<<<<<9<<<<<9<7<2:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS112_32:7:168:117:441 99 chr1 990 99 35M = 1151 196 TCATAACTATGAAGAGACTATTGCCAGATGAACCA <<3<<<<<<<<<<<<<<<<<<<+<<17;<;:<995 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_73:3:239:796:221 163 chr1 992 99 35M = 1160 203 ATAACTATGAAGAGACTATTGCCAGCTGACCCCCC <<<7<<7<<7<<7<;<<<<<,;;,+'<+/+99%:' MF:i:18 Aq:i:37 NM:i:4 UQ:i:26 H0:i:0 H1:i:1 EAS220_1:4:69:88:1154 147 chr1 992 99 35M = 805 -222 ATAACTATGAAGAGACTATTGCCAGATGAACCACA <<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_3:8:34:956:1309 99 chr1 994 99 35M = 1168 209 AACTATGAAGAGACTATTGCCAGATGAACCACACA <<<<<<7<<<<<<<<<<<6<<<<<<<<<<<:<8<8 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_108:5:229:717:121 99 chr1 995 99 35M = 1150 190 ACTATGAAGAGACTATTGCCAGATGAACCACACAC =================<)=<4<0=.<<<71;41& MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 EAS219_1:1:67:191:668 99 chr1 995 99 35M = 1134 174 ACTATGAAGAGACTATTGCCAGATGAACCACACCT <<<<<<<<<<<<<<<<<6<<;<;<;<<<<<<6;%2 MF:i:18 Aq:i:74 NM:i:1 UQ:i:4 H0:i:1 H1:i:0 EAS51_64:3:309:303:278 163 chr1 996 99 35M = 1178 217 CTATGAAGAGACTATTGCCAGATGAACCACACATT <<<<<<<<<<<<<<<<+<<+<<7<<<<<5<<<;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_1:8:60:1020:1259 99 chr1 996 99 35M = 1157 196 CTATGAAGAGACTATTGCCAGATGAACCACACATT <;<<<<;<<<<<<<<<;<<<<<<<8<<<<<:<:<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS218_4:7:89:1487:520 83 chr1 997 99 35M = 805 -227 TATGAAGAGACTATTGCCAGATGAACCACACATTA 4;;/<<<<<:<;<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_610:4:15:805:420 163 chr1 998 35 35M = 1164 201 ATGAAGAGACTATTCACATGTGAACCACACATTTA ;73;;;;67.;1<<+*.;*&<4947<&474&*9*( MF:i:130 Aq:i:35 NM:i:4 UQ:i:33 H0:i:0 H1:i:0 EAS56_57:3:119:761:239 147 chr1 999 99 35M = 813 -221 TGAAGAGACTATTGCCAGATGAACCACACATTAAT ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS112_34:7:142:457:584 99 chr1 999 99 35M = 1160 196 TGAAGAGACTATTTCCAGATGAACCACACATTAAT <<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_63:7:190:95:706 147 chr1 1078 99 35M = 920 -193 TTGTGTCCATGTACACACGCTGTCCTATGTACTTA 9;97437;<;;<<;<;<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_589:1:101:825:28 83 chr1 1079 99 35M = 879 -235 TGTGTCCATGTACACACGCTGTCCTATGTACTTAT 0;0'0;<<<<<<8<;<<<<;;3<<;;<<<8<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_66:4:188:460:1000 99 chr1 1080 99 35M = 1251 206 GTGTCCATGTACACACGCTGTCCTATGTACTTATC <<<<<<<<<<<<<<<<7<<;:4;44<;;:8;;9;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_95:3:268:523:511 99 chr1 1081 99 35M = 1241 195 TGTCCATGTACACACGCTGTCCTATGTACTTATCA <<<<<<<<<<<<<<<<<<<<;<<<<6<:9<<3<44 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:6:54:263:585 99 chr1 1081 99 36M = 1254 209 TGTCCATGTACACACGCTGTCCTATGTACTTATCAT <<<<<<<<<<<<<<<<<<<:;<<;<:;::<<;;:;4 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_66:7:174:987:334 83 chr1 1082 99 35M = 908 -209 GTCCATGTACACACGCTGTCCTATGTACTTATCAT ,;<;;<<<&<<<1<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_71:6:224:932:942 99 chr1 1082 99 34M = 1250 203 GTCCATGTACACACGCTGTCCTATGTACTTATCA <<<<<<<<<<<<<<<<<<<<<<;<<<<7<<(;3, MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_45:1:12:1296:358 99 chr1 1082 96 35M = 1252 205 GTCCATGTACACACGCTGTCCTATGTACTTATCAT ;;;6;7;7;;;;;7;9;;-*1;9;699/99/7477 MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_32:2:306:119:56 147 chr1 1083 99 35M = 919 -199 TCCATGTACACACGCTGTCCTATGTACTTATCATG ;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_95:4:66:179:118 163 chr1 1084 99 35M = 1262 213 CCATGTACACACGCTGTCCTATGTACTTATCATGA <<<<<<<<<<<<<<<<<<<<<<<<<<:<<;<<6<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_105:2:110:584:649 99 chr1 1084 99 35M = 1266 217 CCATGTACACACGCTGTCCTATGTACTTATCATGA <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<::<38 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS218_1:4:28:315:310 163 chr1 1085 99 35M = 1242 192 CATGTACACACGCTGTCCTATGTACTTATCATGAC <<<<<<<<<<<<<<<<<<<<<:<+.<<.<+7<*17 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_595:7:242:4:593 147 chr1 1086 99 35M = 905 -216 ATATACACACGCTGTCCTATGTACTTATCATGACT 1.%55877+8+88808887+7;7;18:8;;;.&;8 MF:i:18 Aq:i:53 NM:i:1 UQ:i:4 H0:i:1 H1:i:0 EAS1_93:1:131:946:353 163 chr1 1087 99 35M = 1249 197 TGTACACACGCTGTCCTATGTACTTATCATGACTC <<<<<<<<<<<<<;<<<<;;<<<<<<<;<:52;<2 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_1:4:4:1732:88 99 chr1 1087 99 35M = 1265 213 TGTACACACGCTGTCCTATGTACTTATCATGACTC <<<<<<<<<<<<<<<<<2<8;8<;<8;<2;2:<:< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_595:4:58:703:72 83 chr1 1088 99 35M = 905 -218 GTACACACGCTGTCCTATGTACTTATCATGACTCT 5&<<7;+95;7'6<<<<<.<<<<<;<<9<7<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_59:5:113:694:725 163 chr1 1088 99 35M = 1266 213 GTACACACGCTGTCCTATGTACTTATCATGACTCT <<<<<<<<<<<<9<<<<<:<<<<<<<<<<:;;<;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_65:5:278:848:765 147 chr1 1088 99 35M = 920 -203 GTACACACGCTGTCCTATGTACTTATCATGACTCT 7;;<;5<55<<;;<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:6:234:787:12 163 chr1 1092 97 35M = 1257 200 ACACGCTGGCCTATGTACTTATAATGACTCTATCC <;<<<9<<&+9;3;<993;<9<+94;9&41;08%9 MF:i:18 Aq:i:24 NM:i:2 UQ:i:15 H0:i:0 H1:i:0 EAS218_1:4:15:856:340 147 chr1 1093 99 35M = 936 -192 CACGCTGTCCTATGTACTTATCATGACTCTATCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_62:2:258:266:101 163 chr1 1094 99 35M = 1285 226 ACGCTGTCCTATGTACTTATCATGACTCTATCCCA <<<<<<<<<<<<<<<<<<5<;,<-2<<<<;68<<6 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_59:2:177:552:234 147 chr1 1094 99 35M = 903 -226 ACGCTGTCCTATGTACTTATCATGACTCTATCCCA ::;:=;=99=====;;====;==========<=== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_30:1:134:379:893 147 chr1 1095 99 35M = 927 -203 CGCTGTCCTATGTACTTATCATGACTCTATCCCAA 7137::;<<<<<<<;<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_105:8:256:404:584 147 chr1 1096 99 35M = 928 -203 ACTGTCCTATGTACTTATCATGACTCTATCCCAAA &&326+23<3<<<+:<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_595:3:57:735:151 99 chr1 1121 94 35M = 1314 228 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC <<<<<<<<8<<8<:<<*<:<<<4<<<;,<<<<:<: MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_81:8:142:858:903 147 chr1 1121 99 35M = 943 -213 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC <<<<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:7:247:522:670 83 chr1 1121 99 35M = 960 -196 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTC ;;;9;:<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:3:75:732:442 99 chr1 1121 99 40M = 1293 212 CTATCCCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG <<<<<;<<<<<9<<<;<<;<<<5<<;8<<<<<<<<;:9%% MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_99:7:183:645:699 99 chr1 1122 86 35M = 1281 194 TATCCCAAATTCCCAATTACGTCCTATCTTCTTCT <<9<9<<<<<<<<<;<<;<<*175;173<;;;<-/ MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS192_3:6:175:437:950 163 chr1 1126 99 35M = 1298 207 CCAAATTCCCAATTACGTCCTATCTTCTTCTTAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:59 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_63:3:93:1002:845 83 chr1 1129 99 35M = 954 -210 AATTCCCAATTACGTCCTATCTTCTTCTTAGGGAA <<::;;;<<<<<<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_62:6:50:542:881 163 chr1 1132 99 35M = 1324 227 TCCCAATTACGTCCTATCTTCTTCTTAGGTAAGAA <<<<<4<09<<9<<2<<<<<<<<<<<2/.&2<%<7 MF:i:18 Aq:i:63 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 EAS1_99:3:118:851:285 83 chr1 1133 99 35M = 953 -215 CCCAATTACGTCCTATCTTCTTCTTAGGGAAGAAC 3+7<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS219_1:1:67:191:668 147 chr1 1134 99 35M = 995 -174 CCAATTACGTCCTATCTTCTTCTTAGGGAAGAACA <<<<<7<<7<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_595:7:166:203:416 83 chr1 1136 99 35M = 963 -208 AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC <<<<<<<<::<<<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_45:2:15:1497:1530 99 chr1 1136 99 35M = 1314 213 AATTACGTCCTATCTTCTTCTTAGGGAAGAACAGC 0<;;;9;;86<;;;<<&<<.<<;)3;7;654-471 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_65:8:206:563:262 83 chr1 1137 99 35M = 971 -201 ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT <<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_26:4:40:352:151 99 chr1 1137 99 35M = 1327 225 ATTACGTCCTATCTTCTTCTTAGGGAAGAACAGCT <<<<<<<<<<<<<<<;<<9<<<<:<<<<;<99<3< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_593:7:67:302:762 99 chr1 1138 99 36M = 1313 211 TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<;;65;<-<;<:8<<<3 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_97:5:84:927:843 147 chr1 1138 99 35M = 938 -235 TTACGTCCTATCTTCTTCTTAGGGAAGAACAGCTT 588;<:<<<<<<<6<<<<;<<<:/<<3<:;<*<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_99:5:147:479:41 163 chr1 1139 99 35M = 1322 218 TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<::6<<;<<<;;9;;6 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_105:3:329:177:267 83 chr1 1139 99 35M = 962 -212 TACGTCCTATCTTCTTCTTAGGGAAGAACAGCTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_589:7:72:916:763 163 chr1 1142 99 35M = 1340 233 GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT ==7>==9>=7=>=>>=>> MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_65:4:91:267:655 147 chr1 1365 99 35M = 1204 -196 TGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGT ;,:;5:<6:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_1:2:91:856:504 99 chr1 1366 99 35M = 1520 189 GTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTT <<<<<<<<<<<<<<7<<<<<<<7<<<&;<<<&&<& MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 EAS1_108:2:170:326:433 99 chr1 1367 99 35M = 1535 203 TTGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGG =====<=9===:=<:==2=======2:===9==/5 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_93:6:132:717:233 99 chr1 1368 99 35M = 1529 196 TGTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGA <<<<<<<<<<<<;<<<<<<<<<<<7<<<<&-<4<1 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:1:14:420:712 99 chr1 1368 99 40M = 1525 197 TGTTGGTTTTCTGTTTCTTTGTTTGATTTTTTTGAAGACA <<<<<<<<<<<<;<<<<<<<;<<<-;<<<&,<&*8111:6 MF:i:18 Aq:i:66 NM:i:3 UQ:i:21 H0:i:1 H1:i:0 EAS114_39:4:43:1047:1626 163 chr1 1369 99 35M = 1523 189 GTTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAA <<<<<<<<<<<<<<<<<<<:<<<:<<<<:+;-4:( MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_45:2:20:413:1334 147 chr1 1370 99 35M = 1215 -190 TTGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAG 88878777;:;:1:;9;;;6;;;6;9;;;;;296; MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_62:5:154:669:853 83 chr1 1371 99 35M = 1193 -213 TGGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGA <::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_610:7:117:857:942 99 chr1 1372 99 35M = 1527 190 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC <<<<<<<<<<<<<<<<<<<<<<<<<:6<;;7;9<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:6:145:144:796 147 chr1 1372 99 35M = 1181 -226 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC ;<<<;<<<<<<<<<;<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_32:6:88:162:587 147 chr1 1372 99 35M = 1189 -218 GGTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGAC 386;;388-<8;<;68<<;;<;<6<<<8<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_1:8:73:108:1621 99 chr1 1373 99 35M = 1532 194 GTTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACA <<<<<<<<71<<<<<<<<<+<<<<70:0<9<<61< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS112_34:6:127:153:861 147 chr1 1374 99 35M = 1202 -207 TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT :;:6;9<<1;<<95<<<9<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS188_7:2:152:765:744 163 chr1 1374 99 35M = 1534 195 TTTTCTGTTTCTTTGTTTGATTTGGTGGAAGACAT <<<<<<<<<<<<<<<<<<:<<<<<<<<&<7293<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_73:3:313:827:992 147 chr1 1379 99 35M = 1197 -217 TGTTTCTTTGTTTGATTTGGTGGAAGACATAATCC '187:1'<75<.*<<:5<..<<*<<917<<7<<17 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_64:3:7:268:263 121 chr1 1381 22 35M = 1381 0 TTGCGTTATTTGAGTTGGTGGAAGACATAATCCCA ',)*&2<$7+<<<'<-<7<<<<<<<7<<7><>;>+>>/;>>=>=>=:>><>=<<==;)<=8; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS218_4:7:85:923:726 147 chr2 199 99 35M = 43 -191 GTAAAGTAACTGAACCTATGAGTCACAGGTATTCC <:<<<%3<<1<<86<<-<<<<<<<<<<<<6<<1<< MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_103:5:285:241:560 83 chr2 200 99 35M = 37 -198 TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT :<<<<;<<,<<<<5<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_30:6:41:461:436 163 chr2 200 74 35M = 389 224 TAAAGTAACTGAACCTATGAGTCACAGGTATTCCT <<<<<<<<<<<<<<<<<<<:<<<<<<<<;<;;;:; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_61:6:25:949:33 99 chr2 201 99 35M = 383 217 AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG =;===/8========*==&;6=&=&:=6&:=::67 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_3:2:60:590:1760 99 chr2 201 99 35M = 376 210 AAAGTAACTGAACCTATGAGTCACAGGTATTCCTG <:<<<<<2<<<<:<::<<<::<<<<<6<<<<<<<6 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_45:6:86:693:234 163 chr2 202 82 35M = 388 221 AAGTAACTGAACCTATGAGTCACAGGTATTCCTGA ;;;;;;;;;;;;;;;;9;;;;;;;;99;;&70777 MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:6:4:223:776 163 chr2 203 93 35M = 387 219 AGTAACTGAACCTATGAGTCACAGGTATTCCTGAG <<<<<<<<<<<<<<<<<<<<<<<<<9<<<:;<;2< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_39:3:88:84:1558 99 chr2 203 95 35M = 394 226 AGTAACTGAACCTATGAGTCACAGGTATTCCTGTG <<;<<<<<<<<<<<<;;<<<<<<<::<<<<<<7&< MF:i:18 Aq:i:22 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 B7_597:2:168:829:88 163 chr2 205 99 35M = 369 199 TAACTGAACCTATGAGTCACAGGTATTCCTGAGGA <<<<<<<<<<<<<<<<<<<<<<<6<<<<<<9;4;2 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:1:168:389:889 147 chr2 205 99 36M = 37 -204 TAACTGAACCTATGAGTCACAGGTATTCCTGAGGAA ;<<;;56;==================8========8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_71:5:81:685:141 99 chr2 207 85 34M = 382 210 ACTGAACCTATGAGTCACAGGTATTCCTGAGGAA <<<<<<<<<<<<<<<<<<<<<;;<<;<<<',7,7 MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:4:26:1312:1400 99 chr2 207 99 40M = 385 218 ACTGAACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA <<<<;<<<:<<:<;<:<<<;:;<<<<<<:<8<1;;:::88 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_71:4:127:725:381 83 chr2 209 99 34M = 39 -204 TGAACCTATGAGTCACAGGTATTCCTGAGGAAAA +<<.<<;<;<<<3;<;<<<<<<6<8;<<<<<<<1 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS188_7:2:19:736:559 99 chr2 209 99 35M = 370 196 TGAACCTATGAGTCACAGGTATTCCTGAGGAAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_26:3:117:284:589 83 chr2 210 99 35M = 43 -202 GAACCTATGAGTCACAGGTATTCCTGAGGAAAAAG ==8==;==================;========== MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_610:5:120:596:847 163 chr2 211 83 35M = 410 234 AACCTATGAGTCACAGGTATTCCTGAGGAAAAAGA <<<<<<<<<<<<<;<<<9<<<<<<<;:<62;58;2 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1 B7_610:5:51:904:391 163 chr2 212 97 35M = 401 224 ACCTATGAGTCACAGGTATTCCTGAGGAAAAAGAA <<<<<<<<<<<<<<<<<;<<<<<;:;<2<6;;;;; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_11:8:96:1314:1448 163 chr2 213 93 35M = 388 210 CCTATGAGTCACAGGTATTCCTGAGGAAAAATAAA <<<<<<<<<<<<<<<<<<<<<<<<5<4<<<<-<<< MF:i:18 Aq:i:18 NM:i:1 UQ:i:12 H0:i:1 H1:i:0 EAS139_19:3:73:1158:535 163 chr2 213 99 40M = 377 204 CCTATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTG <<<<<<<<<<<<<<<<<<<<<<8<;;<<<<<9<<9::8:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_591:2:223:583:968 147 chr2 215 88 36M = 47 -204 TATGAGGCACAGGTATTCCTGAGGAAAAAGAAAAAG 1<';<<&%-:<<<<<:66%<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 EAS1_97:3:160:173:889 163 chr2 215 99 35M = 379 199 TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA <<<<<<<<<<<<<<<<<<<<;0<7<<;<<<;7<09 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_39:1:28:350:895 83 chr2 215 95 35M = 48 -202 TATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAA :<;<<<:;<-<<<<<4;77<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_53:4:45:707:147 163 chr2 216 99 35M = 424 243 ATGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAG <<<<<<<<<<<<&<<<<:<<9<<<9<<<<75;;;< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS220_1:8:18:1757:95 99 chr2 216 45 35M = 374 193 ATGAGTCGCAGGTATTCCTGAGGAAAAAGAAAAAG <<<<<<<<<<<<<<<<<<<1<:<<<<<<:<<<;:< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 EAS51_66:6:310:747:415 163 chr2 217 99 35M = 387 205 TGAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGT <<<<<<<<<<<<<<<<<<:<<<<<;<<<<<;<;<; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:2:114:938:216 147 chr2 218 99 36M = 63 -191 GAGTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGA <<<<7<6<<<<<<<6<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_93:1:179:629:513 163 chr2 220 99 35M = 409 224 GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG <<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_45:4:88:55:1187 99 chr2 220 66 35M = 391 206 GTCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAG ;;<;;;<<99<<;;<;;;;;:;49;:;;;;87898 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_62:5:119:38:945 99 chr2 221 99 35M = 428 242 TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA <<<<<<<<<<<<<<<8<<<<<8<<<8<;<<7<:<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_65:6:67:800:450 147 chr2 221 99 35M = 41 -215 TCACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGA 9-<9<;<<<<9;5<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_610:5:102:915:87 147 chr2 222 99 35M = 65 -192 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA ;<8<;;<<<<7;<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_26:1:113:367:659 163 chr2 222 72 35M = 390 203 CACAGGTATTCCTGAGGAAAAAGAAAAAGCGAGAA =9====8==========:=:=====9=:=&====5 MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 EAS218_1:2:26:211:481 147 chr2 222 99 35M = 43 -214 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA :<:<<<<<<9:5<<<<<<<<<<<<<<:<:<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS219_FC30151:3:90:1906:1528 83 chr2 222 99 35M = 41 -216 CACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAA :<<<<<<<<<3:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_591:2:13:100:876 163 chr2 223 73 36M = 397 210 ACAGGGATTCCTGAGGAAAAAGAAAAAGTGAGAAGT <8<<<*<2<7<<<6<<<<<<6<<8<<<<5<<<<4<9 MF:i:18 Aq:i:30 NM:i:1 UQ:i:9 H0:i:0 H1:i:1 EAS56_63:5:117:570:971 163 chr2 223 99 35M = 413 225 ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG <<<<<<<<<<<<<;;;<<<<6<7;9;<:;<;<;;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_3:8:50:1203:1094 83 chr2 223 99 35M = 46 -212 ACAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAG <7<<<<<5:+63<<<<<<<<<<<<<<<<2<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_67:6:107:395:312 83 chr2 224 99 35M = 44 -215 CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT ;<;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_73:3:29:833:612 83 chr2 224 99 35M = 58 -201 CAGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGT <<;<<<;<::<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_610:7:158:943:467 83 chr2 225 99 35M = 57 -203 AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT <:<<;;<:5<<<<<<<<<<<<<<<<<<;<<<;<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_59:2:201:768:529 163 chr2 225 99 35M = 396 206 AGGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTT ==========================1=======; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS188_7:6:11:994:584 99 chr2 226 97 35M = 417 226 GGTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTT <<<<<<<<<<<7<<<<<<<<<<<<<6<<<<<<3<6 MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:2:206:873:186 83 chr2 227 99 35M = 66 -196 GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG ;<<;--7<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_63:4:38:28:122 83 chr2 227 99 35M = 46 -216 GTATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTG ;9;9;-1<<<<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_93:5:66:372:343 83 chr2 228 99 35M = 40 -223 TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG ;<1;89<<<<<;<9<<<<9<<<;8<9<;<<<<<;8 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_97:3:277:144:848 83 chr2 228 99 35M = 64 -199 TATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGG <<<)63<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:6:21:1601:1666 83 chr2 228 99 40M = 56 -212 TATTACTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA -;;3&1<<<<<<<<<<<<1<<<<<<<<<<<7<<<<<<<<=<<<<<<<<<<<<<< MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:2:23:268:529 153 chr2 329 71 35M * 0 0 TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT 7;<<<<<<57;-<<<<<<:<77<<<<<<<;<;<<< MF:i:32 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_26:2:315:219:7 153 chr2 330 69 35M * 0 0 GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG 7==::<2=8<<<=====>888<=2=>==>,>,>>8 MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS192_3:4:63:5:870 83 chr2 330 75 35M = 148 -217 GAAAGAGGCTCAAAGAATGCCAGGAAGATACATTG :<;<;<<<4:;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_591:5:243:557:560 163 chr2 331 75 36M = 499 204 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<<<9<<<<<<<<<<<<<<<<<<;<<89<<9<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_593:2:270:430:269 163 chr2 331 99 36M = 519 224 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;7;: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_66:6:284:442:747 89 chr2 331 75 35M * 0 0 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC <;<<<<<:<;<<<<<<<<;<<<<<<<<<<<<<<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS218_4:7:71:31:1973 89 chr2 331 76 35M * 0 0 AAAGAGGCTCAAAGAATGCCAGGAAGATACATTGC <<<<<7<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_93:2:30:466:652 147 chr2 332 98 35M = 163 -204 AAGAGGCTAAAAGAATGCCAGGAAGATACATTGCA <<<<<;3;&<<<<<<<============= MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:4 H1:i:13 EAS114_39:3:88:84:1558 147 chr2 394 95 35M = 203 -226 ATCAGACTATCTAAAGTCAACATGAAGGAAAAAAA ;;<<;<<;<<5<<<<<<;<<:<<<;<<<<<<;<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:2 H1:i:3 EAS56_59:2:201:768:529 83 chr2 396 99 35M = 225 -206 CAGACTATCTAAAGTCAACATGAAGGAAAAAAATT 3<:<9<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_591:2:13:100:876 83 chr2 397 73 36M = 223 -210 AGAATATATAAAGTCAACATGAAGGAAAAAAATTCT ;9<$<<<$<<<<<<<<75<<<<<<<9<9<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:6 H0:i:1 H1:i:1 EAS139_11:4:26:137:1382 99 chr2 397 99 35M = 579 217 AGACTATCTAAAGTCAACATGAAGGAAAAAAATTC <<<<<<7<<<77<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_59:1:93:490:901 83 chr2 445 99 35M = 280 -200 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA <<<<<<<;<<<;<<<;<<;<<;<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS112_34:7:96:489:453 99 chr2 445 99 35M = 625 215 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_26:6:46:13:880 147 chr2 445 99 35M = 290 -190 AGAAAAGCATACAGTCATCTATAAAGGAAATCCCA =&====8==========0================= MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:2:167:905:852 163 chr2 445 99 36M = 647 238 AGAAAAGCATACAGTCATCTATAAAGAAAATCCCAT <<<7<<<<<<<<<<<<<<:<:<<:::&.<:<66:3< MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 EAS219_FC30151:3:13:674:1717 163 chr2 445 99 35M = 623 213 AGAAAAGCATGCAGTCATCTATAAAGGAAATCCCA <<<<<<<<<<%<<<<<<<<<<<<<<<<<<<;:;;; MF:i:18 Aq:i:45 NM:i:1 UQ:i:4 H0:i:0 H1:i:1 EAS51_62:7:196:511:896 83 chr2 446 99 35M = 283 -198 GAAAAGCATACAGTCATCTATAAAGGAAATCCCAT 8<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_53:1:154:118:488 163 chr2 447 99 35M = 624 212 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<<<<<<<<<<<<<<<<<<<:7<<<<7<:;;:: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:2:44:153:969 83 chr2 447 95 35M = 245 -237 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<5<:7<72<51<7<*79<<<<<5<<<<<<<<<2< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:4:215:246:640 99 chr2 447 99 36M = 624 213 AAAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<9<;<<<<<<<<<<9;<<<<<<3;<;3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS219_1:7:94:1655:1921 147 chr2 447 85 35M = 258 -224 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<;:===<==;<==<;================; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_1:6:60:1037:1146 147 chr2 447 99 35M = 250 -232 AAAAGCATACAGTCATCTATAAAGGAAATCCCATC <<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_65:1:23:536:229 99 chr2 448 99 35M = 614 201 AAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<<<<<<<<:<8<:<<;<<<<<<7<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS112_34:6:130:865:838 163 chr2 448 99 35M = 649 236 AAAGCATACAGTCATCTATAAAGGAAATCCCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:<;3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_59:2:239:1001:406 99 chr2 450 99 35M = 634 219 AGCATACAGTCATCTATAAAGGAAATCCCATCAGA <<<<<<7<<<<<<<<8<;<<<7<<<<36<<3<:33 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_97:3:147:423:584 147 chr2 451 99 35M = 277 -209 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA 27<;<3<<<+<<;<<<;;-4<<<<<;<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_99:1:187:715:521 83 chr2 451 99 35M = 291 -195 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA <7<:<9<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_67:3:172:196:746 99 chr2 451 99 35M = 620 204 GCATACAGTCATCTATAAAGGAAATCCCATCAGAA <<<<<<<<9<<<<9<<<<<<<<<;<<<<6<<<<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_71:3:267:821:860 83 chr2 451 99 34M = 296 -189 GCATACAGTCATCTATAAAGGAAATCCCATCAGA $&<<<.<:;6<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3 EAS56_61:7:7:682:201 83 chr2 452 99 35M = 288 -199 CATACAGTCATCTATAAAGGAAATCCCATCAGAAT 0:8;5<8<1:78<<<<<<<<<<<<:8<<2<<<<:< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_589:3:82:13:897 163 chr2 453 99 35M = 606 188 ATACAGTCATCTATAAAGGAAATCCCAGCAGAATA <<<<;<<<<<<;<;<;5<51;<1<<<<%<<<<,58 MF:i:18 Aq:i:41 NM:i:1 UQ:i:4 H0:i:0 H1:i:1 EAS56_53:6:180:695:621 99 chr2 453 99 35M = 637 219 ATACAGTCATCTATAAAGGAAATCCCATCAGAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:2:158:909:321 83 chr2 453 99 35M = 271 -217 ATACAGTCATCTATAAAGGAAATCCCATCAGAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_26:2:237:497:165 99 chr2 454 99 35M = 619 200 TACAGTCATCTATAAAGGAAATCCCATCAGAATAA 8===<8===========37=<===7=;7=8===== MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_99:2:152:355:962 83 chr2 456 99 35M = 269 -222 CAGTCATCTATAAAGGAAATCCCATCAGAATAACA &<.9.<;+;<;<<<<<<<<<<::<<:<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2 EAS192_3:4:255:549:422 83 chr2 456 99 35M = 295 -196 AAGTCATCTATAAAGGAAATCCCATCAGAATAACA &<;;+<;4;<<<<<<<<<<<;<;<<;<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:2 EAS220_1:4:100:20:1199 163 chr2 456 99 35M = 614 193 CAGTCATCTATAAAGGAAATCCCATCAGAATAACA 7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_67:5:71:408:741 163 chr2 457 99 35M = 637 215 AGTCATCTATAAAGGAAATCCCATCAGAATAACAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_66:5:285:395:450 147 chr2 458 99 35M = 269 -224 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT 8)3<8+;<)<<<<<<<<97:7<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_73:3:4:854:140 99 chr2 458 72 35M = 638 215 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT <<<6<<<:<6<<<:36:<<<<3<<8:.6<38::4< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_59:6:227:657:95 147 chr2 458 99 35M = 280 -213 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT ;3;<);<<<<<<<<<<<<18<<<<<<<<<<<<<<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:7:57:324:546 83 chr2 458 99 36M = 281 -213 GTCATCTATAAAGGAAATCCCATCAGAATAACAATG ;;5<;,<<<;;<<<<<<<97<<<<<<<<<<9<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:4:26:274:1078 83 chr2 458 99 40M = 282 -216 GTCATCTATAAAGGAAATCCCATCAGAATAACAATGGGCT 9:*:64<<;<<<<<<<<<;8;<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS188_7:6:107:636:642 163 chr2 458 99 35M = 630 207 GTCATCTATAAAGGAAATCCCATCAGAATAACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_81:7:226:869:36 147 chr2 461 99 35M = 273 -223 ATATATAAAGGAAATCCCATCAGAATAACAATGGG <0/)&<=,==4>4=>>= MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS218_1:8:82:1540:77 163 chr2 619 99 35M = 786 202 GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_67:3:172:196:746 147 chr2 620 99 35M = 451 -204 AAATAAAGTCAAGTCTTTCCTGACAAGCAAATGCT <<<;><<+<<<<:<<<<2<;<<<;<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_73:7:97:892:419 163 chr2 621 99 35M = 800 214 AATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS192_3:4:312:915:751 147 chr2 621 99 35M = 461 -195 AATAAAGTCAAGTCTTTCCTGACAAGCAAAAGCTA <:-<<<99:::);:7<4;8<<<<<<<;<2<+8<;< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1 EAS1_93:4:325:352:67 163 chr2 622 99 35M = 794 207 ATAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAA ==================<========<=<;-=== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_97:4:83:731:540 99 chr2 623 99 35M = 804 216 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<;<<<<<<<<<<<<<:<7<*;&;<;;9 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS188_7:5:74:329:459 163 chr2 623 99 35M = 795 207 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9;599 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS219_FC30151:3:13:674:1717 83 chr2 623 99 35M = 445 -213 TAAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_105:1:141:415:738 69 chr2 624 0 * = 624 0 TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT <<<<<<<<<<<<<<<<<<<<<<<;<<<<<;<8<<< MF:i:192 EAS1_105:1:141:415:738 137 chr2 624 76 35M = 624 0 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<<<<<<<<<<<<<<<<<<<<<:<<;<<;<<<<6: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_53:1:154:118:488 83 chr2 624 99 35M = 447 -212 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<<;58<<95:<<;<;<<<;<<<;;<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_59:5:198:929:684 83 chr2 624 99 35M = 471 -188 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGA <<;<<<<<:<<<<<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:4:215:246:640 147 chr2 624 99 36M = 447 -213 AAAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT ;<<,<<<96<<:<:<9<6<97<<<<<9<<<<9<<9< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_103:2:234:167:381 83 chr2 625 99 35M = 443 -217 AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT <<;<;<<<<;<<<<7<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS112_34:7:96:489:453 147 chr2 625 99 35M = 445 -215 AAGTCAAGTCTTTCCTGACAAGCAAATGCTAAGAT ;<;;;<<<<5:<<:<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_93:3:79:879:15 99 chr2 626 99 35M = 790 199 AGTCAAGTCTTTCCTGACAAGCAAATGCTAAGATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<2<;<<1< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_53:2:59:286:290 147 chr2 628 99 35M = 467 -196 TCAAGTCTTTCCTGACAAGCAAATGCTAAGATAAT 77<<<<7<<<97<<,7<<<;<<<;<9<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_95:5:263:511:936 99 chr2 629 99 35M = 801 207 CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT <<<<<<<<<<<<<<<<<;<<<<<;<<:<:<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_30:3:181:582:435 147 chr2 629 99 35M = 471 -193 CAAGTCTTTCCTGACAAGCAAATGCTAAGATAATT <<<<<<<<;<<<<<;<<4<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS188_7:6:107:636:642 83 chr2 630 99 35M = 458 -207 AAGTCTTTCCTGACAAGCAAATGCTAAGATAATTC <<<<<<<;<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS112_34:4:12:273:89 83 chr2 631 99 35M = 477 -189 AGTCTTTCCTGACAAGCAAATGCTAAGATAATTCA <:737<288<<<7<<<<<<<<<:9<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_59:2:239:1001:406 147 chr2 634 99 35M = 450 -219 CTTTCCTGACAAGCAAATGCTAAGATAATTCATCA 0':.71;;:9==9=;====;=;============= MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS188_4:7:96:899:106 147 chr2 636 99 35M = 462 -209 TTCCTGACAAGCAAATGCTAAGATAATTCATCATC ;;;;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_65:6:67:56:806 147 chr2 637 99 35M = 464 -208 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA 844:8;7<88;8<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_67:5:71:408:741 83 chr2 637 99 35M = 457 -215 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA ;7;<;<0<<<<<<<<:;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_53:6:180:695:621 147 chr2 637 99 35M = 453 -219 TACTGAAAAGCAAATGCTAAGATAATTCATCATCA ;&377<&<<;7<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:2 UQ:i:10 H0:i:1 H1:i:0 EAS114_30:6:49:656:507 147 chr2 637 99 35M = 468 -204 TCCTGACAAGCAAATGCTAAGATAATTCATCATCA %44;;<:<<;<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_73:3:4:854:140 147 chr2 638 72 35M = 458 -215 CCTGACAAGCAAATGCTAAGATAATTCATCATCAC :9':<;<<<;<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:1:85:1521:58 99 chr2 639 99 40M = 813 214 CTGACAAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<9<<<<<<<<<<<<<7<<<<<<<<<<<<;;:7: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_39:2:57:1064:925 137 chr2 640 76 35M * 0 0 TGACAAGCAAATGCTAAGATAATTCATCATCACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:32 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_103:3:323:196:855 163 chr2 642 99 35M = 809 202 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<<<<<7<<<<<<:<<<<<<<<<<<<<<<<<;7: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_67:5:117:33:262 163 chr2 642 99 35M = 814 207 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_11:1:59:742:549 99 chr2 642 99 35M = 816 209 ACAAGCAAATGCTAAGATAATTCATCATCACTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:2:55:562:403 163 chr2 643 99 36M = 825 218 CAAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<;<;: MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_71:7:97:743:602 163 chr2 644 99 35M = 821 211 AAGCAAATGCTAAGATAATTCATCATCACTAAACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<: MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:2:167:905:852 83 chr2 647 99 36M = 445 -238 CAAATGCTAAGATAATTCATCATCACTAAACCAGTC +<<<9;7;<<+<<<<<39<;9<;9<<7<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS112_34:6:130:865:838 83 chr2 649 99 35M = 448 -236 AATGCTAAGATAATTCATCATCACTAAACCAGTCC ;<:84<<<4<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS219_1:1:60:1420:660 163 chr2 649 99 35M = 808 194 AATGCTAAGATAATTCATCATCACTAAACCAGTCC <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_593:3:180:89:582 99 chr2 650 99 36M = 809 195 ATGCTAAGATAATTCATCATCACTAAACCAGTCCTA <<<<<<<<<7<<<<<<<<<7<<<:<<<:<<::77:< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_99:1:86:871:319 147 chr2 651 71 35M = 494 -192 TGCTAAGATAATTCATCATCACTAAACCAGTCCTA 7;+1;<:<<<<<<<<;<<;<<9<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:2:236:841:20 83 chr2 652 99 35M = 467 -220 GCTAAGATAATTCATCATCACTAAACCAGTCCTAT 7;<<<;<<<<;;<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_62:2:133:8:379 83 chr2 653 99 35M = 470 -218 ATAAGATAATTCATCATCACTAAACCAGTCCTATA &=========='==7==0=2====28===00==== MF:i:18 Aq:i:70 NM:i:1 UQ:i:5 H0:i:1 H1:i:0 EAS1_105:8:96:720:940 83 chr2 654 99 35M = 467 -222 TAAGATAATTCATCATCACTAAACCAGTCCTATAA *<<<<;<<<9<<;,<;0<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:5:71:994:576 99 chr2 655 99 35M = 805 185 AAGATAATTCATCATCACTAAACCAGTCCTATAAG <<<<<<<<<<<<<<<<<<<<<<<;<<5<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_103:4:164:79:134 147 chr2 656 99 35M = 488 -203 AGATAATTCATCATCACTAAACCAGTCCTATAAGA <;<;<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:6:78:1029:512 83 chr2 656 99 40M = 500 -196 AGATAATTCATCATCACTAAACCAGTCCTATAAGAAATGC ;;;;;<;;<<<.<<6;<<;<;8<<<<::<<<<<<<<;<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_93:1:214:784:690 147 chr2 657 99 35M = 472 -220 GATAATTCATCATCACTAAACCAGTCCTATAAGAA -<7<<7<:<<2<<<<;<<<<<;<<<<3<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1 EAS220_1:4:6:1178:1105 99 chr2 657 93 35M = 830 208 GATAATTCATCATCACTAAACCAGTCCTATAAGAA <<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_99:7:171:196:287 83 chr2 658 99 35M = 485 -208 ATAATTCATCATCACTAAACCAGTCCTATAAGAAA <;;;98;<;&<;;<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_28:1:220:801:282 99 chr2 660 99 36M = 837 213 AATTCATCATCACTAAACCAGTCCTATAAGAAATGC <<<<<<<<<<<<<<<<<<<<<;<+<;<<<<<::<<: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2 EAS221_1:2:73:955:728 163 chr2 660 44 35M = 823 198 AATTCATCATCACTAAACCAGTCCTATAAGAAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:1 H1:i:2 EAS1_105:1:3:903:957 147 chr2 661 99 35M = 516 -180 ATTCATCATCACTAAACCAGTCCTATAAGAAATGC <%12<&<<<;<:<<<<<<<<<7<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1 EAS56_65:2:224:579:433 83 chr2 662 99 35M = 485 -212 TTCATCATCACTAAACCAGTCCTATAAGAAATGCT '<08/8<+<>===> MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_105:2:146:374:692 99 chr2 690 99 35M = 874 219 AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA <<<<<<<<<<<<<<<=>>>==>>===>==> MF:i:130 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 EAS1_108:6:159:493:275 99 chr2 760 72 35M = 939 214 ACAAAACTCACAGGTTTTATAAAACAATTAATTGA =====3============================= MF:i:130 Aq:i:72 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 EAS139_11:1:81:1019:558 163 chr2 760 77 35M = 926 201 ACAAAACTCACAGGTTTTATAAAACAATTAATTGA <<<<<<<<<<<6<<<<<<<<<<<<<<<<<<<<<7< MF:i:130 Aq:i:77 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 EAS51_62:7:162:195:761 163 chr2 767 30 18M4I13M = 922 190 TCACAGGTTTTATAAAACAATTAATTGAGACTACA <<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;; MF:i:130 Aq:i:30 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 B7_597:3:115:646:430 147 chr2 768 45 17M4I14M = 582 -217 CACAGGTTTTATAAAACAATTAATTGAGACTACAG 5;5<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:45 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 EAS114_30:6:243:209:110 163 chr2 768 48 17M4I14M = 920 187 CACAGGTTTTATAAAACAATTAATTGAGACTACAG <<<<<;<;<<<;<<<<<<<<<<<;<:;<<:;;+85 MF:i:130 Aq:i:48 NM:i:0 UQ:i:0 H0:i:0 H1:i:0 EAS1_108:2:266:994:429 147 chr2 769 76 16M4I15M = 612 -188 ACAGGTTTTATAAAACAATTAATTGAGACTACAGA <<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:1:85:1521:58 147 chr2 813 99 40M = 639 -214 AAATTAACATTACAACAGGAACAAAACCTCATATATCAAT :::86<<:<<8<<<<;<<8<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS188_7:4:164:719:947 99 chr2 813 99 35M = 1005 227 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS219_1:1:50:257:341 163 chr2 813 99 35M = 971 193 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<7<6<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_67:5:117:33:262 83 chr2 814 99 35M = 642 -207 AATTAACATTACAACAGGAACAAAACCTCATATAT <<;;<<;<:8<7<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS218_1:8:90:706:1276 163 chr2 814 99 35M = 980 201 AATTAACATTACAACAGGAACAAAACCTCATATAT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:<:< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_108:2:116:966:193 163 chr2 815 99 35M = 967 187 ATTAACATTACAACAGGAACAAAACCTCATATATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_11:1:59:742:549 147 chr2 816 99 35M = 642 -209 TTAACATTACAACAGGAACAAAACCTCATATATCA -<<<3<<<<6<<6<<<<<6<<<<6<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_11:7:74:213:877 99 chr2 816 99 35M = 996 215 TTAACATTACAACAGGAACAAAACCTCATATATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2 B7_610:3:85:219:371 163 chr2 817 99 35M = 967 185 TAACATTACAACAGGAACAAAACCTCATATATCAA <<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<;<; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_108:2:176:653:957 163 chr2 819 82 35M = 982 198 ACATTACAACAGGAACAAAACCTCATATATCAATA ????????????<==>=>=>=>>>==>>>=>>> MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_19:5:57:366:844 83 chr2 877 99 40M = 708 -209 AAATTCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT ;;;7:8&555<,;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_32:3:236:475:254 163 chr2 880 99 35M = 1051 206 TTCCCCCACTTAAGAGATATAGATTGGCAGAACAG <<<<<<<<<<<<<<<<<<<<<<<<<:::<:;>=>>>>==>=>>>==>=>=:=====;=:=6:::6 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS218_1:2:10:686:1024 163 chr2 947 99 35M = 1103 191 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT <:<<<<:<<<<<<<<<<:<:<<<<<<<<<<<5<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_73:5:53:61:31 163 chr2 949 99 35M = 1122 208 AAGAAACTCATTAATAAAGACATGAGTTCAGATAA <<<7;<7<<<;7<;;<7<7<7<;5<73<<<;>588>9<>7:<0<9; MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 B7_589:2:30:644:942 99 chr2 1045 83 35M = 1229 219 TATATCAGATAAAGCACACTTTAAATCAACAACAG <<<<<<<<<<<<<<<<<<<<<<<9<<<<<<9;<9< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:3 B7_591:2:123:924:645 83 chr2 1045 84 36M = 861 -220 TATATCAGATAAAGCACACTTTAAATCAACAACAGT ;<<<<*<<<<<<<<8<<<<<><<<<<><<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 EAS51_62:4:308:614:911 99 chr2 1319 90 35M = 1493 209 TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<8< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 EAS54_65:3:155:541:234 83 chr2 1319 99 35M = 1151 -203 TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA 78;<7<<<<<<<<<<<<<<;<<<<<<<<<<;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:6:175:289:351 147 chr2 1319 99 35M = 1144 -210 TGCGCTTGTACTTCTAAATCTATAAAAAAATTAAA 9;;:+<<<<<;<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_593:7:283:186:707 83 chr2 1321 99 36M = 1154 -203 CGCTTGTACTTCTAAATCTATAACAAAATTAAAATT 889;<7;<7<<7<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 EAS1_105:3:308:66:538 147 chr2 1321 99 35M = 1138 -218 CGCTTGTACTTCTAAATCTATAACAAAATTAAAAT 996999;<9;<:<<<<<:<<7<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 EAS1_108:5:11:555:330 163 chr2 1321 99 35M = 1492 206 CGCTTGTACTTCTAAATCTATAAAAAAATTAAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<4<;< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS51_66:7:84:411:336 73 chr2 1322 75 35M * 0 0 GCTTGTACTTCTAAATCTATAAAAAAATTAAAATT <<<;<<<;<<<<<<<<<<<<:<<;<<<<<<;8<;< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS139_11:5:52:1278:1478 163 chr2 1322 47 35M = 1513 226 GCTTGTACTTCTAAATCTATAACAAAATTAAAATT <<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<9<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 EAS56_53:3:101:809:776 147 chr2 1326 99 35M = 1160 -201 GTACTTCTAAATCTATAAAAAAATTAAAATTTAAC <<<-<;7;<<<<:;<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS192_3:3:221:881:916 147 chr2 1327 96 35M = 1168 -194 TAATTCTAAATCTAGAACAAAATTAAAATTTAACA 44%-4(5<;9/,:<68:1<:8<:<<84;<<<<<;< MF:i:18 Aq:i:24 NM:i:3 UQ:i:41 H0:i:0 H1:i:0 EAS1_105:1:28:745:352 147 chr2 1329 99 35M = 1159 -205 CTTCTAAATCTATAACAAAATTAAAATTTAACAAA 4;;*;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 EAS114_45:2:23:1754:796 99 chr2 1329 99 35M = 1488 194 CTTCTAAATCTATAAAAAAATTAAAATTTAACAAA ;<<;<;<;<;<;<<;;;;;<<<<;;<<<<<97999 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_97:2:96:419:327 147 chr2 1331 99 35M = 1149 -217 TCTAAATCTATAACAAAATTAAAATTTAACAAAAG ;1<<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1 EAS1_97:4:274:287:423 163 chr2 1332 75 35M = 1515 218 CTAAATCTATAAAAAAATTAAAATTTAACAAAAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS219_1:7:35:392:2042 83 chr2 1332 99 35M = 1168 -199 ATAAATCTATAAAAAAATTAAAATTTAACAAAAGT +<<<<4<>>>>;>>&>->9>9;4>->>>>,4>9>,<1> MF:i:18 Aq:i:27 NM:i:1 UQ:i:5 H0:i:0 H1:i:1 EAS139_19:2:82:154:1333 99 chr2 1349 77 40M = 1511 202 TTAAAATTTAACAAAAGTAAATAAAACACACAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;:;: MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:1 H1:i:0 EAS188_7:1:290:286:763 99 chr2 1349 75 35M = 1515 201 TTAAAATTTAACAAAAGTAAATAAAACACATAGCT <<<<<<<<<<<<<<<<7<<<<<<<<<<<<<<<8<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS221_1:4:3:248:1491 73 chr2 1349 99 35M * 0 0 TTAAAATTTAACAAAAGTAAATAAAACACATAGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:8:< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS114_39:3:6:1064:1805 99 chr2 1350 99 35M = 1502 187 TAAAATTTAACAAAAGTAAATAAAACACATAGCTA <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_595:6:137:811:130 83 chr2 1351 99 35M = 1175 -211 AAAATTTAACAAAAGTAAATAAAACACATAGCTAA <<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_108:1:155:809:543 83 chr2 1352 99 35M = 1156 -231 AAATTTAACAAAAGTAAATAAAACACATAGCTAAA <<<+0<<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_63:3:41:468:459 99 chr2 1352 75 35M = 1513 196 AAATTTAACAAAAGTAAATAAAACACATAGCTAAA <<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<;;7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_108:4:31:622:216 73 chr2 1354 99 35M * 0 0 ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<96<7 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS54_71:8:105:854:975 163 chr2 1354 71 35M = 1523 202 ATTTAACAAAAGTAAATAAAACACATAGCTAAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<7:<;;;;5 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 B7_610:7:26:749:174 147 chr2 1357 78 35M = 1183 -209 TAACAAAAGTAAATAAAACACATAGCTAAAACTAA (<<)<<<<6<<<<<<<<<<&:<3<<<6<<<)<:<< MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS56_57:6:21:553:57 147 chr2 1358 99 35M = 1197 -196 AACAAAAGTAAATAAAACACATAGCTAAAACTAAA <<+<<<<<<<<<;<<<<8<<<<<<8<<<<<;<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0 EAS1_97:2:128:629:484 83 chr2 1359 96 35M = 1185 -209 AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA :(::<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:82 H1:i:85 B7_589:6:33:356:636 73 chr2 1520 0 35M * 0 0 TTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTTT <<<<<<<8;<<<<<<<<<<<<<7<<<<<<<;;3&3 MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:14 H1:i:85 EAS114_45:6:86:859:1779 137 chr2 1520 0 35M * 0 0 TTTTTTTCATTTCTCTTTTTTTTTTTTTTTTTTTT ;;;;;;;;;;;;;;;;;;;;;;;;;;;8;;)7699 MF:i:32 Aq:i:0 NM:i:1 UQ:i:26 H0:i:0 H1:i:15 EAS54_71:8:105:854:975 83 chr2 1523 71 33M = 1354 -202 TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTG <<<<;<:<<;<&<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85 EAS51_62:4:187:907:145 153 chr2 1524 28 35M * 0 0 TTTCTTCTCTCTCTTTTTTTTTTTTTTTATTGCAT <<<+;;,6<<<<6<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:28 NM:i:3 UQ:i:59 H0:i:0 H1:i:0 EAS54_71:4:284:269:882 73 chr2 1524 0 34M * 0 0 TTTCTTTTCTCTTTTTTTTTTTTTTGTTTTTGCA <;<<<<<8<7<8;<<<;<7<<<<<;272;73&&) MF:i:32 Aq:i:0 NM:i:1 UQ:i:17 H0:i:0 H1:i:85 EAS56_63:4:141:9:811 137 chr2 1524 10 35M * 0 0 TTTCTTTTCTCCTTTTTTTTTTTTTTTTTCTACAT <<<;<<<<<<<;<;<:<<<;<<<<<<<<..));;. MF:i:32 Aq:i:0 NM:i:3 UQ:i:47 H0:i:2 H1:i:27 EAS114_30:6:277:397:932 73 chr2 1524 0 35M * 0 0 TTTCTTTTCACTTTTTTTTTTTTTTTTTTTTACTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<:8(,0%( MF:i:32 Aq:i:0 NM:i:3 UQ:i:42 H0:i:2 H1:i:85 EAS139_11:7:50:1229:1313 83 chr2 1528 77 35M = 1376 -187 TTTTTTCTTTTTTTTTTTTTTTTTTTTGCATGCCA <<<<,<&<7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:11 H0:i:3 H1:i:7 EAS54_65:3:320:20:250 147 chr2 1532 77 35M = 1367 -200 TTTTTTTTTTTTTTTTTTTTTTTGCATGCCAGAAA +'''/<<<<7:;+<;::<<<;;<<<<<<<<<<<<< MF:i:18 Aq:i:6 NM:i:2 UQ:i:24 H0:i:1 H1:i:2 EAS114_26:7:37:79:581 83 chr2 1533 68 35M = 1349 -219 TTTTTTTTTTTTTTTTTTTTTTTCATGCCAGAAAA 3,,,===6===<===<;=====-============ MF:i:18 Aq:i:27 NM:i:2 UQ:i:23 H0:i:0 H1:i:1 BioD-0.1.0/test/data/illu_20_chunk.bam000066400000000000000000000166111273003163100173350ustar00rootroot00000000000000BCM\]\u+9@ ӭ:_VH<3Όtw4ڞQwh1C0$118l7q_ c<-$crnw*&was=_:|n]=_K/\^ ={mNK/⅕U DRX(uF\*@ʍ4=^p!d?AN/_F{t88#/߶H N& _Lݓ z?ٙS߻W_899Z#a` S,#$T9XB8!!z F[*W@c[ N9!I )h͍4Y478X Q NH(  RB xI- mE" M *M ΤAQUk.|PmE" h"U-:j51*5e;k+ULKY<^fRF#X`Tp+<Š Z IN`E7R4ʅѷ8#a*H,DLbh|@aB0xq:QsOe24GhiZ(0BH^F5KCZx%Srep:igdk ĮP!zbL\ـ~č#JZ(uZ5K:(mV@,P`U6CbNQG7y4 ͉LO`Y % ɅU[̉ph%zCJq+#W}# ׎HbDlחT $\(&Z3XXͬ3[lXS^j0L"aH(b' GI[j|i᱆105<ƖpxcoTHBV:kM[gFk y Cb 6 iw(3Ud18iϵMXxڝ9nt=΄\Zbɨ\k)lH25Q"[6iL0֣9l-3;ZZPRںl"5*X$Z4u C)9="=Zkq:#yv0xD|*9Mqlj1"<*J@a**M,#-.0t'*@IRj}Б,e4\KCʰ1aaZ1dG,! $@$AP,cr`I*ѡt-/x ԯ~Q*YwE,ۇiG8&Q#RKTDr| 1!Y°>x:A2)opxGSmץDORg$\ vsK/]+70hЕ뛫76VvV_ȹK˸B|evYk;trs>d'SI=\GCy{M{0Hиrq%{PrBNw Fqwz\O]V5Q䡧Gx+1 \ʦGGIm{=YRSxtu `ŃrW|֡΅O/L`hL1atOCS8/st e#)·FUԳٷӗS;ޏS44OpNy[᫓tݱh;oޱ΃zYD;<^yz=r0s&w_uΗr]+!C|Ȳ4]jXu\ksGSdC7H ԏ9?SA=Sk|nm|ߦyrx{x:۾+ۻkۛ:]txv]<~=<tdV!`Z%̅";=?9MAp64;_|/o@}}`}}}}P}}0}J[{~!\ŅwR_<0}u_eF'~!+|'qZ$p/#FᓘaYhAs=z}und}njrо2vKJ?*|x<.[#znVI8r]{'|RL}Ņ +2f͵͍k{׶{;Wlߺye{o1SfRv QYxeˋvwol]^ٻr΍++ybͣճ(LV.\tq^C{|ބvrt2qramswoқ=d3op{`tmph'B]tvgީO26b(7f@e5ʽ~Fѝ"iG+?h(AQ(/6zeO^oÆ(/ߧj^yyC hW Xkoи1j{?6͆(g{gs(ZlU|z?J꽦n™XђWBC ͙Kl\gůA1{_F0(g|S;*)iT+fǂXDB $+H,Abe D$܉͹ X `q _ѵpxq^jw_wkZ[>|!Y+9|fJa5UÕ,+}~HSkՉ)N):#I Z"32.xbD)] 0jsaz8u]{np`g݇g+98k,lv~1g題pHcr'Ogi<$ʽ4e/@>Jngۥ4rcC> 67/8[not '8$ ()8msO: cTQgUFD>9|pNq+pnMnm8D3?@?2T+8ʣ_hQk,< pC S/GUF;c-I<JXK+˓cN9cl7o8GRc`&'WoTgH,/zX$ZM,$@INWBUfQ; !Zԥ/\G%]饚a/zKu,nAa۽N֬eDx̓ "hLSJ( DF#GU!2_V@,E$D\T:-^XCMMɦa?.N]o\3KB[I,oɡ/牆|r$JZEY2U%Xl&9Ui8Yj(FD5BZlݴ?zPjuV i9̆)\Z~xЉW d'4Pg"5>$K HcBQ*bWf{: 즷fOpF1ZMϲP3+gjoe(V[;#H^鄢\%ʒ!S]e$)LV\_]Sf65^҅j<1N벁?t~>>٫7V?/2SCECuԍҼ'$|mT!cUV ml 3jeJeqKNO:߀^`hinXo2"BcJ xlg ѵ0&ٌuI)yn5:^/>uUeŚQ폧UFF5:EA$h9);RĨbbAK)MB^(ƚ&޸uk°?߮Z şP$[ !ExȰWdT9'k\jbįL4X~,;Ac= )a.v{n :ߘley*POcRq?v֦, Ջ.\MUcg7I11П:5۝n?n86*D~2geI sU\ TIsUzA>i: ՘ 蹜L nޚĵSkjџeH~,:RK)9ɜƠL1G'O'}gC,G^+:z@OL_/b7 O3o?.6fY{リY HJdJJ=wTO|g1.,A{5ɝ"vX84K$5/Fk1ZW'TKhX, }`-t{ ۾mU=֩-hsjS,_B))b$O)@,|J½ Xw= -`4ӫ۪Zө<3s\.ԜIM,I1a[]k҈% U $lHRx]@ #eDm^jNXfN_/}_[F+A): xI reh?oVWTG,5?2V(dg+~nvSv}ZpNlZYfޚcÎ*A6[rt :$&hkK{%#Σ*--r(:AhmqՕ*e %[a}e} 1>NI*sH,5r֕a<4 qYjDHE^!,YVv՗r[FVofՁ7=L:g*1,D^D*턕UTSтx,hq3yi23&BCBioD-0.1.0/test/data/ion_20_chunk.bam000066400000000000000000007041411273003163100171570ustar00rootroot00000000000000BCWϋD.wq3H^]*Ut:3==0+HHw=Iz,E(x,xًm <_mzeVaq鯾Wޗg^D֦39 B7[[Ҡgc=a (h`qP D5儎 `w@l\ZN0y*\kQ@3✡QUSEJcΠ~` CuLDkz)cS*Џ @!o)S5V ytXɕ7@ӱu|1z=s*3ROErXHr (V堘 #f+s]>Yݰo뭽irn[(<~8X4 [oQ%~JC` `!f&aXXzsZv'aW*./=0bAY"Hݶy8j~LݹۻVo(1&}&~cvW!9Yof~iK cfc7^R6^:9#7G&ؼϳm?h,{fM|۝X5$+JFLq4vͰf(vwIJ:@Gx*FJ5yZ,QL&Oe\{EME49'Oy0gA7(&,I U ݅;SƋT{AtI)(sW[!dQŲE!Q׶Ee+^1l9`e̲x}VԦ Ϊřlvn;Ti+ \CDd%DnV lf; m4&n{e9٣CCY$bx):S043t,ѵ7 21m}$XVNd嶬,d%VǞ AjӀ5k 7[S>&+m?(AA(z/G^ɣpZ MdۣkeQx%J/,AG|u8]g+{_->_D_Tn\-%/7Jm 4idBCV ]Wu%|Ϋՠ77*Y`lTRI2`,lɖ<ȚRUIUgɒlc68dtD!# 66dI tZWdH`uztY{}mƤ1C+hSk(t4_ь,\s%udBJ{7ֽc̘ovFk}FG.3oY}޲y+GW捞^tpztYpOhe+ TrerhP[y jj+GG>]N֖-&gә|>Ntf2D3%b-ɏ]DJQT3L"wy.Kt&qi<a.et& ϸWd<̧t1 A7x>JDN;JVJJa&-Td+e|)oZ# 27nY2|rTtˊ-̕C[W^Ц#v?>184bnquܴv/z,[ۉߋ?g34mvߤn\Z#fimf%ui'0з=xM4̍ȭ[tf[tW$^|;JSc&kF߇Li1W[3n6ט^\5;̷P6gpŇC71eAwfTژq?;M<܏:*sJ͗qVZ/i N|-4P2m2Wl y?>Oߎ5!MsO)L|`'Ͱ`ph֞2sqE-8~1h/0?%~ۊp{8z ҸzPV<mO߾|~Wߴ55Ϻ\U7 xF)3eeߗv ,3zḑaSxF'=Ѝޟ0/63}|' |؟4W -46}꧗%W{xʧOS?r?`\[ /_vo{^?p~i-]ȟ F@V+h@oZz=JZhTqy5eULZ t:OGQ\(Ge yZ@<Da0,\TS|.ۣZ %Tq]6WFE nSCo2ۃ+.Zȝ}~^Hnn9}0e8Zwo3*|ƱQ=nVi;^{ibs'Fc!},<ڔYo ^Ƅh}fȘ?6N.6_l% ($di1ĺàT#d2ڂDqs>S0?gQC;:,ڈ&zuLuۯcGJ=h.T+w=$uJs2݈|@18k?֎KM&C41I%'ڽ -g>uJ\[}짂ɿh9:cJDN7iksB=mRK̼E{=E.&y[qb6DKE ދ=p˖ca6sNpX* qD,TRj5ODdT-VJqV/R Ĺ+(+u*rޠ :)Vt&ҹTWAѝ *Uq>q5'v#0n` qz'mOڭ{bĵ-ȃa,QϏ؄r5FڂoFkm`įrDZ^l3 |:?'i1=~6nYW}ۅ3c'"kG "}Y>qh:dzMԼ~w-vjFH2F`JNvɭ[ў/λ$-㔀ЎV J:?W-{l&k&j汆x:h^5:ڀlH9n5Dbݸ{N=yz҈G-L'Pi^u `lK󸽐/P /K̠1 t?c&ZeGm*M`}V޳ B [ IQ72 !KRZfAvk2pb:wLZ!x+CD@ZrR&``8e%BX(`ەʫrubҐĚ{w*-:$"vL1w@^rt!v)ojC TĤ 7 sBC ڗw.iskew x%Ֆ} rؤ}9/XĔy} #&WmE9qG &Xmuu p:39qijw%~u9t >/с+mZˋ.;WX{,֧^b_f QBwU&ztkvGdD@7Lh6=;.G]584hѳ әlTʗ+9q3-ETL]QVK5%.:]dJQTj♈"dV&x4< > )9e]PUQJ<YɃj`iT!jdB|^1:l dqdpŽDu*\X҂c̏9o0=ASLkF1cfR#sm nM8&%3 oBeJ}8qqP~AiBsi:q}D|eLݒ냂o^1Oمެ!,n2EÞރ>kKŘڭ~yܯ]iG{QgdX##mV/lc5Sq*hr翶krϮ6XN+jـFn eR"C3MB$z2f6=WҥpEK Gm.{  ,WSR7s1#a$a1 KL Rb7Hq],QPHi1UNV#yU\O \nx5!hl[0|'54w Z4'[p5,uMzvh-*iZ+/jEwGDmV,=P4`#)ns="g{Hh7LܹM9;E'[󏾮~7݆%u ݸ*ioQILJ4إ39z5K>%i Jܭ>9zݗ=i1 ?=g+ïTKgWӸR}52r4+?,N(8AAm]-̦J.x0%:UseA}żmA4OȎ,Wiȸ#OF#h*w^IƀHs5I WD4F(ݹt.7"r_\(U0 & ē15D'u`]N Gu?m)7|39Ai&:6q&"wtmfuہz|3GF+yUuԩL4Re)h=C6ʄL1ns 39PSTMgph)fZ3#*q'%ڙRr2ϮSZO%A3DŽ/KfԚ-4g;3A' 07[dH\z ;j3}y6ReOc"B)*o.LdTA& J~J4kA tTRD+Od.aAbX hĝdBZ %{ :ϖ "wRdg2_vg"נT*Uj,lmE1ƾ(Mc_?9`'>|Mc@t\H< ;)qsŸf6ewCodq8'qkq$8cPNM}b~KaTb9hCV U=j4'R-S0yz4`-LE_f'?֙(>T{>XNO R |J\>'.A+t*hVʕLKsݰP,ԫTxhMWZz- J"ۻRe:U.콙Lꥸ @XDUj|.GkSY/E /h@?cBZg~wV/kk^7q(tDF}^(w"._̢ԍf@E:ZoY1cM{;}@uc\@FN#Pp}^mF^DŽ̫l&שi,PrH!=p ~X3ȿCy]c(2KoR.7فA Pn aLIL~e6dݪi uݨgEIrUZ@8l܋I>k<nσ}CCRk?lۧ6J9n3}>/^JQunϡy6 χC4^dDJrom=!QX)(Lv$ %Y.KaONRTdRJF4>)uQfLO:N_Hx;]ޅrTdF|A6e2YddTd뵨Ӟ$⢥> JCρE+ ˷FgBs0#m\ #Ոun.N\j`tlP ls{!ZTghm/.FQZGhp<]+v$eEYvU25:Ӎ'TV T]so26\w %ECEzO0?kѶ?0wz=oCi}Խ*jBF,-!y,.m՞'|D`y=jI^B@QiDn hy-qM)i{tY/IЦ)h-M}~iA9JSw2رm^tqe12鹒.A=0^/YX_7J]LZrT׌CJi!^@QVe|Dber^!OvV%w|\2Fz5K >Jh<-%*cMKILu> T\I#A0k'=X0Ed4! ysnw]G=w[l 6U՜hЁQL҄^%վU,wrFB x؋!˼ٓjorR*q-M?h3{53Sm6*{/dyqTvrZmC0HArT9ϩ/Åj3S,aNR+B/ϊ^a^%%l DL;!E[ǭ3Sa^2756-Ln3M!3.!=̦J$YHK6H2pD&T`N2gf󥴏DET,t33bXqv6LKi蔏&χ W6h1t9 JtI*U* * -_W"H ('A]:dmjUt,'0dӀWdFIj(yOΎ YF9wC8p6 킊?3a4?Ciy} PMBC܈R- NG}97wvV.`= !̘I6DWo5Mf1eQ3`\o}٘4iB _kw6;S)N\$H^0M4:?@ҿ=[@t%DɌ 13 p>arY79S}Z[e5NtP4m`z5igr&:{7ͭ:~Jcr|l g˟(P| =`^,2o7N +OjA@WT+l7p(GG&:S#7~h+ RT+3\vzA. óqҡC+):&gq9aTcA8_m<}1mݒ>,Jpm>TQpv{4!z5Ey Oވk8MC)s߿΋DY n}>l>( `NF'U+NK~p&. Jg@iwtn3IeG-b̎%CϺ%]&rZ:UFY@Zwp8|%lEk{_)7h4Wv,4_*uZђElM@C&xt6FVb§L.RD:s =*K3> 8 'ٴ"<*:r\}#s33Z1`n_'6C>ۣOm~LCWyC\vhMN w$Z>sڃ+=pl6=^ 8BM>}CuqBzSxp=eHyyto!^:{гFx=Jn™Mc~4z})Ȧ2O!Ҿ+QOֱO Ne554o%]B_ ȁE Ǜ_Ɯ1౸Bf6=Wn=_V|t|{"&V%6NQo7U(+,3nz(JJBReۃtO:LMVŘ6VqmoV0,2N^-#fۼ_Ob!L)': V@ف{]]s;&oׄCGq\D͊qK^ekV4 \E${!&~c~$].A3`@ o>K|la+ ~ uu%|3j:X4qF-a b/f6@-܄)q;nAXFO QS9f5^~u_T\6dQX"]Jl J0*23\+PXT:O]4 :A:(FQ(eJ (Z1t%Eoy>ܢ =m l0~6ۤb4']b9*7cຩ4b!3~]IpΠXB^@o6L|MAcs W;ο_B^^H毶x?Jg\dPg+3}2 &!R|enwW:G~WY.%݈QN»ͰM=WxE_֟S-X T}J8R^d \;$c`Ow+;L߬`?yW4WHmچuanw[m2bwKqJj @2c>_DBc"5|jƽu髭 +g{WKO?g\hE[tf2(*a1,Ιƿ|>^*~P)a"d<T0Y,~%O\OSP> a:HADRL2p%JoƗD"O_l-ʢ/_>|h%Kqd|Ń}ҵS7|Ic>rVb8I6)P5);Z$(pxqu`D 8+wK5.g`5 ge"f.4 ~!Mek?3 {CF)ߨ|w0JȴhfZr54X'r(y9l=h)Ktk3W6 _`2vnEq":0DR9 *T~a2lR1lJc.EEQY!<a',]D{W-RYŴf?$-ӂ+X/ jY]no2YĽNz"ˇl73>S1kqR݃ić$&%jB uQ3ռԦGs%zU#zwۥ>L&[Tބol57>Rqx>zgLR|* yHߦ,# d;.)<.Ka%D@y#`sp#x'uhE^ P>R4=Zr&.͸vJp(i8dQ3zӄ@[f}:,MaSg:\V8/-b3ƽOzMWbuy|$!p7-DQXM r\F\y [;<@R"DӉ|N"Kd2i|gmBΉfݕJ0]N\: ƟLD&o!NCOy~Q4?" ɔ8O`,bbX1@;p.N&ts%}kqǬkCg]+1Tws ] Ny=f߯W˯ͼ `PB 9W',G 04i[fTjD~^K|&!x\l׹|dS7}!:2,캤<in0ȃ+%>莫fq+tr|BkE3(@LGOBIq_ÿ7;;ֲ:4^am`sՔ!ЯL}5"Ϣ?0nr,[ϋO 74#IV/S+q uR,OF`mNqt'Чx:Y*J& M].m@[-CsaVjM\ 8eʙY$ST-kbAg5`|_)N'M]y}|9|r<7yznq:ݗ1a^T -Va.x*CSK<:a:c4r#.t^"kgv$~D܂s1?o?;Y_S ?Ԯ'9aCc3@_ j}7y!-y# IռH$9.dm@oTo}Hϳ`5$B12Tn1Cr ٩ m2lݏVW!Mu&Q 嶲GȽȕh)oϿяuvn9oU[h0٩8?C- @[#Ҭvo&=[Գq0K2G5t:I{>;K:Pۏv6/ ѡ7iRQQjck5J;3L ȝjJRtwSTTLQa!=HE ve]VVtO'TlPʕ\.Ĺ>.r2R3%lZ[˦xw#?Frn " + kBBI1ڗz8Ƚ iMoӕ:U`l]b\$&c)_Čw 1G;=+4{eJ4?e?xD~31՗Q[czNd)MbRt7$5]"ǽCDZusݨ+{}7ysXdcML5qߏ{{? M>n7/4<9wqm}x+nCZ:y79zˣ>ՃnvoZ[Ejܪm8Z4rìi-P=IcӒon3G#ă*|o|̦G_J^\/de8h~#K.le,u Y{'RTw#]u#UB*B^+תlΐYVQRIe/K˒JlwPHJVͿ b>5Z)*AQ;D۟P\Ls rNܤuW e!c&%LBjc oðK.&͛@&G?3\"JccpXpP𕀒;3?_0' H[LE AԤhB`s$7t*6-RAxB&NYrԼVque/*jK>c.nOIP4ލx)9+;f6+qkjLaf~v9o[3l(mwN#YVPYqy%+8  ̟5ʷKἂn|`JlOsc.w[ރ(88OyGRTK#hfcg$s&jN7͘A=9}|W>w)NpۤfwtrmB﬒6uJMw`% Bu cpf6wЦse0JB q= zxisLsG摤~SՆ@QݹIM>vR%٫;f9Ŵ3ןnmg]iugzG=l .ֶ #8uE:5 Q9Ց,!.(e2T\-S(xqq:ՄaO "Ga x@\xB6D0FaFRQ~:+p*49Jt|}$a)f|E+,H7 YE{f0OB#XzaD5m -&n,ީ%ާs`xqc)a? 4= aIg;c>k#6Тdɓ@I}<,rXJ=hVG FKɴ|}o~+6еAPW3Î RiUnn@2ɣ:ׄqaxI縁9cUyPCK $R,))m4M5͠-·iEZLm83z⩚ l%Ȓ3Z>H*x=˜EpMtTtKKy;ġ=& ^?l:+.?S' Qy#~~7qIj'A'?MVDMB2 /M"?:@qx {m /D8jE=-o3N.Esւ}@8rs:a'5=x,Mi GgQ?_jk}=d@NN.覩-I֍+) ȣ ѿ3m>w@gyXs%&Q\QMz'=:o3-|M.@Ye>Y i/~謳ɻ \ڕ<c̵gk(+?\n~[ cOK=\\iL郎t 2G‡\Xk{pKΚNb7L*[>J0K{L&E"8pa؛nM&_7d|_ W=[M 6N#ntwwCx ź`Ӡԅ,bn\.N6Ow?30GZt< Zgfð {lM?-g' \=ڂ!̑Eծ֖^%qGr̶+cҜjkJ5dj jAՍ!pt xz0ڦ"s\m0/Ɖ-p7a2-6=f68ܵhK}T)m>~u[{i9I97>Q }s^Fŋ`g-V ò!3i0VK7 !Asl7(~ 20)s\OӯpyFX /|^qJ._O,貥J\ǑZ52J%#P߲VD?e w.L-_#oc@PqGx|-\b wVŤ^%ytӿ_+U֯}Pc{?zBn{ ,sD&?46 !&퍈!\a7'7fr+2Eq7¶1J0mTf3),xqՐF;mJ_A롻NM%v\U?icS}Kx3?M*qfnO֏y=wg>oF5u[c΅vJ;0`wyIxG{/eu?|K89.taႅ|qk`?O'ɧkk]30MW t;bԍ/A:if\:VsQX{dݐNC*L0.up>Sfݝ.9۝wt~g$T@{Rak?_k9P6uRh8Wj7wNiY md_:=q :qɸ2Q[]Zez#SFȇ>M'q@ v@ -jwQvSm3NooC ?2^ X8`kT0.!O3k6Y|?^ojys"n =<8λ-Khs[jη/2*O4lv0 _Pñ"5m1j+lT!cUl?3kΉ] =ՄL?ܺ,~ [H_Io.1qҌ|+=KSdmGR"܊4~&(kZ}*.r_H F?$yQ*eKf qn\&eYj1jܹH%kw.ҫ>3|EQ5_J1ʤF#ÝZ/dw?N[MbD )ҋcC; N]35 閶)}7& : aدAϓޜulLnI@_Kn6>hUvg[ sHf)t7~R/YnoV )3w[̤]ϐSSo|2{%r 2C҈Q=UOPMK*E=crq錵E7_֨27{g(r/Ϲ`d0[ o3?+'FG9~Ls& p? #ψM%WJAr 39S*(A]N&w4:]`M*ИBk:}pHQGpi{u׻1u6x?y>@E(^ t~_ywq{7VGyU #V&q ATO yB܌*U+~Oo>nvGS [(Zu'rKF-9Z[T["sRl~q3¯ 7yGRκQE* mHNs,e'q1%nSjkN[TM:j>FZ{@ A6pRi}HfctS o5456c)$_&S߱;Ig_+)m?(w;==!D]stykuw4|8t d5F`>[q,XEvcmHɏq8jm7ׂ^&m,NCDsAOшf6=ZΒ2ո#CiZ F?I?w87JR])XRT1_l%t<ٕL&fË.{q͵b4RaS&X.=bzuĚ[󎬹ڇp|_/]to):Z*X$υ=`k]nWw ~ M\'3DJQΦoOo?{z `ܢ➋>~?A栗bUaȊ֔FTY۳j/Cu\AjT -gsԓ]T*/ҥQ"LtȬJVY{ZYA/ð3-q(V|^ph|ds0Za" D~#+ dYZ.eh.cIlz>_C,\, 4dŕldd{3tJJSdD L6DQT,#?d6 PFlԛv34VZЊӅ<4DQqKL:֜#ql]jXmvڴƘ>)iȚfdQ?#=y E3'Ff,5{yn.YIwXwq;qO6е01}[_5g-nNӷѥx̎L},F NFy|̎i^q@>ac /gc7{ebnGP ҍ\{џ1p\_[?썼1զ(W,!ejpXQN_KORqMϷtIEC"*tA.k'бsj-TY4ZaۼRa,bTsLh1Ȋa1(2S)&c䜴8Ck#QQ989ɝ4rI;䕞AT>)Z5ph?1sg@p b3i>H`XG4hnLk5fNһ]aJGw?&\s\,QpR^1nεvpF u\y{dW{qtRlFYu*bϝNgCZ}!ոİgN'U11Xz MMּS%PJ2ebD[t\὘cs;UkG7aPFq~w)o?Y%C0lzKYKZ†?ЎABV~ѕJR/p}TUDKz]@P7u 2aT-9. MWA l\L2aufQZ(HPvTJ['bX̦R"rK^K;]ۅ#BVsaquM*a6&.L$jEZozDŽ3zgz ׷s)dʈojZ:w o#CšۅČ >FNy+cUԮN3(ČoR5g$.vqLǼO[SyF̘͝{o 5=ҪT_.sunHQkĨ3W[^$k]Hcv1-O\ӫMͯEm[Gc-ڈ|uBנybMϷt)<Q!E\vƹ"? 2U6JѠ9-(,s5nQ*QWţ@0IT*b5៛Y6 $>#C!; Z}LlyoJM !2rj雐t5#nh4*qn\h771_78j51|Y`,Sߥdl!:>XaNj0%]WƼo=rUpB64}Yإ*Ig^+Y8~O1֚T5s DmwI蹼m hz|>dRulz~>׻+.\^WꖽC>KBj0TW84.47S05y@30tP.oq:饮T1d8ުn*܆˽ E{3iRD>ݙN瑺mEs-3t> ςjz _na ~[GL0.ݬc݌q:-4g[GC~%05oz\X8x:8jX=t}!&gHmmL`zm_!ܕ0L_* ߠpU"d_i`rx dqoOc{2kb0QvdGsd݊٘f 7WﺝN߸u1b{ٯCo e؍en/m3UjAsLLUNꯛ~/S聽=xxkCҮN_UN(mFo/׶+)ܞ8nsѻ')mb:#`gmlk*7qSˍ2Y+r&Hś|*Lq[LiaX*Wf> Qj޲ Y B#6r傏AdX t&ݕRTzUnm0huXDg7&8:މ@YIac(s'H%'Xb_œfצIuc%B0cHGwqPnKJvDBHNn[,"&PK_l'| 'kxT zenZ 4 H wˬKvJj78lBK& eBتt?o :7^>ߓ;qls8,<ˋ:32EԘ˸1?U3on42 R]~*7CwTJYC,Mށ4WۣϟgkK4NZڜt֊+^tpzԬ峖7j,_:kƌ޻|yd3+`}5VZ,oO/_>kf3{zycƒ+b>k43[Fl6 ZĖVlzXb5sf G\bD6ŰVk!_b b䋼c#fcƌZgv,rYd1TWv-uTިFl94~te[/zfUWo;ګ.ᑣw8cx|j]nۇξ-K%4Is$L9.c6ffLb[ά1M8'xV3O/`Zo5P1_1]ؚ0;t)3Nx}81|މL!1f%Kիטahkׁ#:|O}q1>71Qn6szĠ_/iEv ;??hyT7ۂCxmD9GI9>_xc yX^^4f·1kmW)L]艖+ln?Y_!\#j!?{a`@CGn2ǭƝӵDk:Zsy>G;/%M ̛/.y[oT"_M~[p{M^z)^y^Ճ\W( 82,F82 0 ~Az3%9RPY@tDx t1}6ϟl0޷|_!sNl3 Yܕ!coP#n?k^{~TcMR%URՃ#YgYۦނxZӲKwN_n3Lm GPw g8lJ`:OQ~72&Pmvcc>q(ifN{sghclTO6d/C/øY7.wk2Kv&=(b"ϛESb2W0٨S-:Y@sfޠ n6)`a&ԐJZ#Ukq$y jŁb@ nUj@F@CoQ*ISCJ¸ g?KT6@;(x%g;fl!=æ+lńO2]sx8XO6rU|ީKp<2nn $ _wN~W}\ \kEZTO 7[ʗ`0V}94G65qanڿBMeY`?(AF7:kr#'٫e>;ڀk m@=NW8> o?kcmC*)Nl>-&F/a;T߆8Z-рup[toۜiPyó.6 \ 6ki4[Y`ql̠xhč'SiFڢ7 00DDQ0$13'%qp-Iv.ԛԃ:ލVtJ|#IN,͘/ w7N=W9'L툎M$SDtK~KuqWTvyxpn1y\@[M]p RO-<>^zy:xf߃^D5.JT|opk8I1lVj\+ r+Q)foL2St3aϦ3ar\RД8ٖC!tq,t].^2{L|QvQsɺ-MxvIЛCxz>!> 2'ف'{8z2]O0ܲ[%2,cf}4sHp7!M̿g_RYCt&9[<˅:a]oF+~oJH<nظFYACR9qcZ2 ,nm{w L\Zf71 $|gJn ]>B/ԋbƍ'o(u|y7 m{y?~g9x\ }fܘ90q=bu^8ŵp c2+l!D\.S<ոGB28QT*"l &YTR P[QՇέq7[Sq)!v5_7䈟Rvvre?dcQ_4`G7u5Mq!h;G5S__2nفh\D>dŃӼ:T[U^G?m.ռc/ﰱrq=K^C6Ɯ:XM-=kq)g6[u4T}:<?^=b 3gI{2RdJ4f,h6R_*qTփ|^*jjAFԈꕸ/a r0 B3`7]\z=AdQDjh_d٬ڵZ=(Ee 58Ssҷ]x7O7'CJT7_|HmfI=SWB@ϸiwK|a%5倻E. 1Eǟ8ECivyT/ WXA5:pJnsp8 uXW)OuOJh^˥ 9 :PI٣_}8F`GWC= P]\^2Ɠ}ʍa8/ ۠Fc~{ 8xRs֤0/ `҅ kȰ_1Ӕ$qI$k_yN+  w};.w&82oN>/^Ղ+DQ%|*q `A}0`>f!kCKE  =5 BIhi X8u<ݍczMfnh鐗Vf8on38wͼrc샠m\!ơ#R2LVٍ N^] =9Y*l=z{QOs_g?t"g.#zr%з3ˎk_̕\= +d)Հ*[yP:wvE˶VsjTF.3nl[5urۇrhDJs.ǟAӞ*A_߮hHp4~ZDu'Wh%mv*$נ;x t҅(:[PJhJp9h>)%|X LQ\/W)@\ 7OfQW媄|>d < 9(2,P ( ! !ܪ\6РV  SGY&ES;AlDw. am WBR! 0wV[׋.ƶXsx0EP˘f: `r^ehuT`T6h€Bk-0 +?knW$KA41z|Z- +r>_Po_A O;ffx Zx, U7Hp7^T[nN z /N֣;~7%Mט?KT'9zqJHr^fL]nilY3uc))Z\zPzr=Z]SU]o_ζ. Rpעfש_2|T#j8Sǎ٭Rq]m4/–n }0löQve:糕ny5m.{߁OSV.eP֐[8t;E>D*]5VIy2 &%$5"xRƓtp5cj_>_KeыsS^i?g?@;xF jV :c-Z xZE p0FVB&WtHJU|b^Ks3 >GqC'ƀq t՘]y=yx)c=垃+vj>;5uxcލLYt2T'uVsđ]8Eyn>/c Lv7S<(AY0ӥYBI^_ eطI'~@fGo}*'p7rygw}tGB5XO[me-*! (B+i6Jmw?~%4}jby@nZҾOj{'Pv ±}Zp3*a,lxjWZüv{Ւ[UccܨvJ-Pɝ&_z?w>#rRVܒQEhf4ZzZsZA̙A_z=[BN o^; 6`EZM/YP'Z_}i'́*1>VM:hԞ['6Nc6@ a߯Ƕf0aKKn ĿM ̇Qw vzG= aKi~0. nmGbecDrޙ;p#Zc~UstҌh~9(B~qmk ߨ۔D1Pk_a-|mc8  He7&4NG}hlkZ0i)DZ#sCF_yw+`R(Gys #Ybx:z_-귛tU@R)-8^iwF0 ~حR@%5&*wL_3˼L0^drKn$q9g KqSJ8^zK=Yl*As 5Y"hʅjX,~{ ܭF+¾\!WvQ4-FɄJ\Z*~e}USiӊC$QI{ڌP{тG?%LL;&-jd߸B /j5Ao(j1 ;O.Z t| Cj,A.EQsJh>A"\6 ~gj (e2R4sR5#QjO!s?ȩoZe'd5DNltL{)/?njcOz?:QdTmBj{$uD[yWjɑ%lY}(-z:<=Lq8{IHUeF%~hʀЍ,™)$Q5S0 j,סs%LS1䭾֢x[7j*s?}L)i}|MK.>bHƬ̓*K췐7{ugq؅\{GC2jT4n F7k;⺎kv~Ͷ۷ w*-NOw.TdW P$#nk# ? i ӆsܠ̸T*7[F6j|UZP e,LEȱCPs/UшI|Mzl4n4f4%`.>GB EȨ9!A^["6!~!٩78SkrX1[Dbuwiz=+ϭv2vO;W"_bHDgHBu{F~苒5 GQ:2>"ҝWNINHRWw?k3D^%%]wq3l˟o9CyH~FהH|yI,RlTγT?@zuQ%޸qc,"v ̋ʹŘq&>8i*ϋϋfScbsO?g`m)`ƒ+)|WtH<֤4d@ 4Ѭ\juPX I)(!> |oTCRa.'(s8 G*W,jjrW: 8b(hd0΁} |h9ãxR-0(hU_[dKdMBNſ',׀2Mںݦm}_.aWJi;NSZqy0ϟP=TmHuHT3ɭU^z.k󞭲@mEOqٞގ]ԭ[O="vO 6Y74;v9qMSIJ@m~-IcCt zdG@ :vH.)m-^5ޮ\V8*E-M IkNwlf[zǠW,QԿ\}临Ut7nzJ~uɨ> p֑r9هoR^|G;uG%]8]QWg_ K[z󯙆;'x̴Ppqe{uu/3Qyt*l cxby׆Uv tAb++qsQP | °3ao._]XjW*Lr:n,AkS"]Ap()U| P[j ]h].(|ZlT{x9`f!!FԏSiC yu7]zwǠ1--fsuJuPYWӛޥs_i(e!kOer6 {l4kGkutQA.T/A{@u<Иl%xNTԵs$z>6׋[Gpwo3ݬ0i _;dkO#4n|L/m5:ZeQ:E~G<}D5mƹv#3m2 xGҢdi6$+Dv:\@*qD=M[B7{5zO#܍($RL7E6'l!n3ۊ]r.tu/`6&M/8->~1>-X'omǽS v]S}g^{`@luDoZkD_g 1w{pifѼj9+:Zs4`=n6jMRx|r)*YyJL_ F/!!HMlXkQVfvkClvzϵNMtүmq0p_Ѣ?eeBFsALT͙7͜#_u LI&2AY?b=q@X#=Ozc^rcDہg;Z?b~hxc6 6\{zޢ&QW:>oǁi:⤳Pmb̎色ȕXiĮ)Kc(DZt+}si|[:Lleo;k:MGgun 1Ĝ;=yRRA2ҟc n)-cL)md[+k>eaNNmf2lET:q* +ӛ͖2L2IgJ@XEa2 qkܛf Kf,J0Eyas*Mp7A웵DxȸJ$X\`8`s^͂}k_TE7xv7M91mnˇ|_iE)C)@ ]h;/׸bFs(^/iKI9J>(I5^V#@'8h[,&pWѦbQEԄw鱥?-8); 2xIkzէM^`:KORpنr0R秘2(B)iڜ_D 4WDڇ5bJ?#"-^X2G=ˈgiE蝇{sNkH3*BQj6'N9 :^ZZ + HQ+j! a\#4Cw K0 4;/9/ zUcU/ȸV^.:gݟTpau!(NnjA-屟PCq`VɧK3xAooۯ}†' ^ne-/jAߎ=oF;hj uX6\4EHHnx@N{d^/#0-^Gʼn o´s ^ Ƞ 9Y&QzK bI-_co7B F|zwԫGfҬ8צҦ.;梹I-z.""0zV r9b?_\%TaT[.i^I-qXjCo-Jǭ:"OBSMkI[*S.z@JT;'`蜫, h>?&9AǞ;m6˦[^,mpak)|4nxŸש>iͣrֶptmmaӿ4LhyZh3"۹:px^~ʩѪd\qXoϻ#PjZ@eAdA)$StX.K.,wiR.#}6v_MĮI+)|texNʭ:˧$/4$fq ۨS hOh)^8A=j֚ueW> UU|l(f{3AQT2}U ZjR*Y25r#:*$;+QTj~hAM9;DRwՉBmCо1CoesEniz88ڳu80U^)v3yDF%$ZM;#:ec=eTj?fs.]40'%Ўc`?^!f[eݠŊ}/^%RM"Ai͸zOs#ٜt F F`t?_5|.S:#kmWD ( Bk(wм܌|1}nʱݥ&rI8˚'BQPoVW{)2ӭyJڇ$B'aX"FY}^޳2|e?!w1cCKU=}tN3nelQGt"oǺ55qc#QA9bn4#r!8)S:d^nDyJ*J}"YvaۀkZܴm=a؃?^z4*_| (xpswB*1!Ip.<}?w-%~,:Εx8±\:oF+INI,>ink)A*1"e N"sϟ ;_HQ:Rgg%AKevCݫp &[.{"D^ɘ(^ԏ(Wq$L[/K8V # c>YYAe_NcH*M\lrm(R6i(CN1/~"Fq\uh_dAu\Rj Y~ f S8$ze>cԐ{#N8G}[}H!1/NwJ5?]$}[oIW?Jj4et䵺c j2.n{Zf 'XǓ.NY.rtSͅ^x#KF,"Z8v hĠvJ) _Bl%*DzPH"ƾK:)vt9\cB.,-+L/ vces=hwW(UNȇA<1'|m0ìm67$NjUau0'vp֛v4BԯX*F`~veSe)>룙2}%+8Jm+OMy X4I@Y;dF2H-Z$ja-CB,GdA:{\4ݯq/{I:v(+JZVޘi/ ,fp*wu0/62թoC[@ D%B|R*Sì"鏑t\WTjKk Si:673.tJgmj[4w{ldz z}>g`6e +<KBO&߂bP)|XzGaT88:xtdf L)I=. &ԯJ p.‚[8wE7@ҙv:G.wvPy /7YB:w䓦Nj g;D O?i1M5O\MߜoĖ+ e]Rm6rP߭葒Str3ino??2( XV:!^-n3mE@A'qi q,X5Lq+U9 xLl^ ;4J|I"Fq64|9ԄrX:V5 Z ?f.*rlG͏ ezCQSgz@y%ln?X+7$=ZGt q x-^4yN3@D]骽%+j5h+<>+JT,H3:7f)#U,0HŒ ymǶ >13GS@'oN O=|؋,$b8V!ձ5#*.r,kā~t@tYյgɿaӊn~ Cr?ex* ǀRbNS-cjMҍ-[iKnB߁;C$/ϥ2^lۮ.Q6ߔI;ΘNawFe,w{ˀea!E7d|O9z scܼdqdK9Gj'H<*j+_=nt̻gO٦ui;ifQXӪxo6Q;KxŦ œ.gӠydP:6:)rJ!ӝV鼓Sd J1E-"eèIMpl"d)' pCj>ϕd!ȑX!$șsoC ;%e11&"Fq'#ׂDZѯ`YLq*?*]x C$~G %TNBYjE~|׸<_|DǺAph&ŬG0.Vz$T}FƒnVz̗7鄱agp4}QmE_I!%S3)mK8^|}r\jF6+9s8Z͞mN0B}Z6 $r1>5paq49*.IG2kkn5|ymrJ ( 3#ENO:ji$Vas3lnA1ne?՝zQAC_z0*s5jq<>,f+\ J%plK"鑞$E^ZXVDUgVIZQƹg/Xx*Z<2|;F6祝IMk [R4^Ωxq@֚K 6~5j԰[V# Rl%Y+`%ٗDw ]q`| 'ǼۧFs^I-UNrBouB(A@jd#C,{i=v'cݨS%z)~6Np cP3_o485D~*^LM)ρg@V}j!t3(j/0~åH`?2M"M΄NwyEW H 3Җ=TŌgqO& BGO&R<#xFpZ5 cyb\(ⲓOo|j̊T.1R?h4-&FBiƽs9i;#8%5NY`|"ied-vLO)2Ƚ(ټ(23yG,L{o5|ޭKX jFQs#2ԤS_WȅP9siP~ӒMJ/%nW''t'jA:{Jl۽PCB  ،J_a$Fr}k0f8|Ii:=[Ξ="y IW>Wz|ZT,L/aϸQZlEqr/aI~3؟q zݹZcf͊TkP"(T##OI`V̤l5Kz<q@oڍjqkwJd#uMJSJic[8]^[Wͽnh".\dq _Ё 8 d@}S{B".Ydҙmƌ jC> fkdvU?[~?a?BS6M'̩A[xuƌ1bz`L!s2РKB *QQk-urd=LĒbNy@BjY0c֩?{ϞQ7@JUe2 Z yvzޛt]OE;.Ne:Q WyZ~,ZdtsY !7 !sL&M,JRZ-(L)- q5j놽>P02t&]T S dA-r/87̹Kao>0GLsN )z? z\s+ [%j+k%I[zk>.]>F~.:NMKm> -VRRPUIjH%_QcxZ==SSRɇ.6|+hZȦXޓ@uߍۮKnxG*ˆۖ\a)8:N? _. ;؂RVkס.T58WQzLGtSҏ`s|._]Zs+737{njSl[eY[3[-)&cVٳAϩ/sVm)Gyfܺ{Zgխc|k5j՚ fZkQX,Cg5]:rx%]:ZR*Rt&wӅ R%\mⰏ~bC?I=D#®Q8}5le_$@#)=uv A[>Ǥe넗L;$>ş>im|>k\/Gtkc1n֘qk@rL+/|klU%wG0]02ToQ戰:lЖCOy/zzLTxCezx2MGoG\"R=R&఩(F|a Oj~1ºT`2fkFڢt/_jFEۋ#b4:#ZfЫ24nj:ѴNgsFY,1f~o;ɺO܈u{6z"?Pӫ:s $z;g^sov7s).v6,K,#2֗8׏.Yߠ?뽞Ov 3˲UGcsUw;@] N<ǎoA3ܢ%5b1NjIkҍcP q^m>pve^m/T};1u TjC .5K̽ 2| w4~v2tsۄ}tߜǜr>3kRXEAKsaSɷ7bԾ2a!3A."YN1җHfrҚ.pQ9PLr63wtg>F&H ~uh{X:orK1 K1d [o2= `bŅ*~$#];)hLt PΕo2J0eb`PG.*KOxxc-*1̊sVL-+U}@uŘR?5p{yjw1_=IyG9Co6tJ^~ݪQi za6e_5((jnͷSߣŤrJ(wu{Z̐oĵL(6Giji `PYW[<)+ 7SeN 9rDsuX-LtKbq19{n#mѱB͈V²EF-:!kRch9wAJA0FjzV*a:?yPb} Vܠ 4-Q^F}BpeC|y+$#^lU*v \T;<%rΫVvb=toa.w7_م-Sf3uѼf|_' 9\$u/wn3?e\hz2t!ԭNyu2.r?/.aPɐύL˛AUZ5iUfj5b![(єZ#hIFm}*#AUV3V^ o hOF&muNܨ&r2T $P^dfߙO`̿ mo?o/c"&0˴A/sJ߳ƯJqcR4'i"m c~U\Ov Ŗ)]vO8P 2`p6jWhѭo/8m?bԺƥyaRd۲>!'==lr]sKJkVr =Q1:fR%I}Vs@ Bn!9w80sThX[/dO|Fq}hyM9}y={/#>iљ܊`ނzo0!njWӖ.FT§|MKѼg|/ZDcBCS \Wy&-uȋZbk-k_ZjҒڒ,"&!LBlvbbc00 IH$g$O&d}s%˒m;oOwUݺn;f)3{[*a7?!a[4se3f͛s3 =f 9K-9}qc˗.ON_zrKX:}icuҥt2<^8}O{\^H/=tF}:.~E&dHjRJt ώsT3PoȱHF .5_5 xp?n;9WM8֡36ZIa~|s-}_Z(5ߥn,69_$ІbN\ h_N s6݄ڈ\qk|FūO q .&(¼OE=|=R貺coDˮVci-gl72ԀD?7q7߉Duaam%5j*kW\'_3n]%:#"\q6VKۭ^LcϿbd[vᬽvo32^?BMWtTp~NToF\.NUfQG0ZR768;|XYqM]xR;On(м^k֛\P@~j/(V 7pA^g VP*ϝlhhf8ޯ[B=&@ێz\dx\Gl; xb$ŤGo ,&c5]Y2m">?. "!5v*͟f*@x}Q%8NmpSzn*Ïz?sv)wvǑj0% ;>{~íoTa ׯp~Q{;lVbXᄎ<]>7xS5Kܷ4H:S;ku Ok9(ouڹu'/sq3'?ׄU۩~_ZPwGm2TB̳ .>gsy!p{RQ:l9IOIK(J (p`r {qM\|-QSR,\õ4E,=[ID[b -|V&gH/* O36*M󄤭@<Y;sٚƭS =s{{_=F_Jԟ>ɭ%^Nzf,޿"cKlRDqՃ=۽4;C.qtثazLٳ^6s^y2)h~u(XȜ+Z7Wh/T;Ԃ`tJ/r/@AqxFjpM-K5)1]iԬ ,QPdc=ӦߋDF饒~, ~sYx_0}),|y9ӞۦR:8[o02WJ%M?6#$JJC=Oy6(uB_"9/V)%%)Iܓd5`ysZV5ˀplo/ x&[#»lu\0<^re `-uHhDóhC@k5<ʟ`*<ӐaE[G8Oa nf6/dwZ"%T?)P#-+$c1軱ҭhK`B%{݅^O5|o6$vcO%yڱD,EGTQo+,r\z Hm5 jJɞ/ud˚IptMG;vUZYصVq[Z]2;Or?zj!d2/s>gL-)r‹3@feH1c0JpYT#_o*o`(4GI%m1ڔ?Qo`wLr3xOWDOBai2R{ۮ^9_'^H ՝߁o~ޣ*WoN%Zo)7bG[uZžfOnC-6hu٥g9yr䈹]S~O2<2fϥ\c™/VFSU2xU%pfT/o?(DRIWrب7qa 7XWrzB g&u8=ٜޥxnU*F\ρg5?z~`70dԯOYtNg^([")p'ht(~5ۅDnG=:|YeV7Q G XQ :T$1]3[0mh=,}G|]`// fCno^-z[^٢Wv .V hCX>ǫPs.w#Xȗܜ\*зCZt1) f(,iP5|/z^R2^p4V'&-鸼_s|s^/zϏyb=w-^|N^T?;X/>yTPU)hjf3I 54RŒRmMec t\ r݉D>K'`DG {_, Fu'_N$O .3yEkn=un>]3juo+p+h‘EJJ&%P{;"L4;>{>G+)qf~snW]l7 8 nqJU{XܣzKzUog?rѣطG7,b:P;qCgouUp+rPN%Qr'r mdoP=F6WOG_vǬ Ŏގ^%<׊sұ'zo ~kb\beɟzU3ֺn.lw 噜Lqy^^`ȓ9 zZ"͖jupw`OH8jl'-P7(ʞ(mrVéU:GRk F*Y(>9U@sFǁM^vb'@.j_c;*ؤKx|rWmr?zt o{zv۩EFYJV\<5"/qP{Bu?I6׎(].N}(eӹ7=W3`UFLt3+(u+ܘ1nT u~z>{5B}R}M/%JcG*| 2'P{msثsYƦ '_Zj!,MX?V97zp,_2]M JoTv6;z1rdzqy/Q Z@슘_;>߳t hҥI1-/Jb? ڟǓd]+'Rd H{^e-iPxHP8 ڎ`'w)xLR0OiW>) bن ? XNFn|Z<&}Dv=o->qL9} ̪-Hso 'S&Ŀr(GQl%+L`MVv`y͜ph4HQwpgn&˫ nl<堭#WX\_ ^\?yZ_L $ɎD9ʖT'LB.v5 V Ll Tۛdt2P S_*SX'tQN8úcв%3-X64y.jm /{KS8+3[8~=ú녺ô?u:i+p=Rf!XP|:.cm'w|ˈ=2:ri/j25{{yΛ_y'SGІm [lPB7* e~λ- λZ"e}VdocH m[Rn n~-)HyQ#oN49y0=a.%0>:%ʻ֪g n8=|`u3b˱uXmo(nG[9N&dX/Ьwo?_zEKwM=i/]U7A4=ؕ^r(TΧ/KT&*ËZ>/KKZ5酽tOTʕ\TJz)lT2?@0m|)4ej@R\Ǧ urRA[bRiiӦu?/eM7{BtLj7@mq=*@n0-BrdVލN)!$·7w#:e-=*9Mw,/`˅ s?j4)PS+Pu`B|=580/D^c&K-R 1[C}qajjqFL69#bh%(f{5{ R}_5\:<;a52D>8QW}G`qTowDlCrB'7mD1 w-ch40E}l>lV~S?^q{S>3Oy3^MmܿUi ggX0ujQT2l'S.jFcК[9*T'nhٮV[T(/ysʦRR*OҼZ*z2RrL%_)SŞ0hT{R afJ:taܭK>nfwfsUݸu@.6նqnCd792I CdD"&[.@\EHaCh-h'Rgk~efR*W֗̔FN1 zD=Kz4:Brƛ܎h>;YR}ߢq~2t83]uz1ɤZ&r5^bTmx{|NFH{ͬk#j={r5WM萓#>.U|O5Jsu, ͪIoMѵd襖 yQ0"p#t 25r#_r+#Ae7ZH:_c^ r\/}{dx]%dZ%{&)gwJŎ5Jf7LZwl㾯RSf?,MӒ@#e@mNl6Ȃ9P?rzHu@TPC<x#7!ܰf4|5t%B}ȽsM-Q4~w^o4/d9F{ i[PNqvc\N On~3=^Py6QyЋʕR4-[^x6Ji6kFn'_2xB&U%.?g%rlTjxElNC8ٜTبB"әhJ/ *4& Jsw}ml'1wC7^]˯# lhO3J zzkUnJ v %Ӈru}Iғк^1wֵsl"#F!ҁf{(ת4Nr)Sf2)T*՝,t;j"*gw",%ygg[;g/U ܾ=[ю.בKa^%eelS":PgvԊ"| /"#̣,# &yJl_;߂rcK{ua->`+ΌKs5':Ÿ+yv }Xߖ:rWk|aMըZeuhkûՊVu#VUOoV>;Bf~z}+#wfk:~}MAi058w32),.WhKNIɝ^$ %G1w7~1`d7쵢k!l#ZGfІ=^Lw/9.)nr+>j4hJ\U;v] S+>=*"+Rwpml{ SAfə>13#e׀fSt?<ʖwOQ[N=~Y|[Ј8 Cbz |<>fޛ&5{XH&KkmW7zJ".}5PN|7rltd:wXwfݨy+4 %GQz%D?1i>ez4F|ϳoGaR Hj3d3}An|ȭwZ<6Un>@6jh\6y 1֏''=Mn.WYC ^|qT2ёsfݳ4oBCn*^l 9(H/6$ \pUdRfs %>izU."7kzgK>fn:-ދ~*\n3ߙS뙚w].1 ,Ǔ]ҭ&fPHRMo*pBu )yhE`/!wd'4qbJ<ؼC/-3ḓpv^O/iFI[2Kfَ=hušnL)ڳK+1m %ǖ'{GNG%5Y~e[Vܠ WRb$4>Ε1tTBɵQfKuG#WѲkG<_DY*-Of:s.lg;].qЇ"}QApRhX0v juT =A|`V 5#!t(7T:ȨXRN#l=Q%Jr9z.߈rsn&!ԑ6rpǮzg\ׄljFRAZN9恈v:3 =$] y/^/iD:p;fFG.oT' * "4*Ziu'f^L{ѣv4ȏ6FÁ立HxB iVkUsRȓWی+gZ@7>3{z}& j !{1=,E[^F̴i-09O3HFQkOoQm OS:EfѯY/X>iIQ=6׸FRÍW`q\+zҽ$`Q.3v\/P0(GEԳ\+TIW :%7/"":|@f D vMmi ~Z>㮗2f`U%Z@ZkH!BzC=UI /qKg7KRa)c8FăY$1o|BDžv}RYlyt^(3MYSo٫,U͈NkR%w_xеWJVEZe h&?E28O#R6tٜ06ݯ䤈9ǁ^GIȋU0ޗ8_.+'\/m虻Pba |蒗ftML&'yެbr4000. E5t6BzVWHrYF]gYp؋\kr.O#=.FE9*V"Tr0u {kUP|D$UmGҶIOSYBk!O9 @<zsPkqs~뒨G}N7n2TDĀoho'ڵSPb;>qVQqaR*MdLYR{3gBfITx}Y-A2;io5pSITpoD*&rzfwB}O{]|@ ^YR(B֜KG] %h9sK{ Efrbĵb60ݷӫѭ f \|6>^>;i -{̟ʌ՝b&.(lTjƺTQqH}i^HaEQWacJX,*L I.YxozP.vqF9͚s^r3'qJL--ʩvYE`|۵_Hf =IĖ.G 䇃0$X.aT{Q T 2Cz+q}Au»թ噃-ypdݠusߑ<(6vWg:?|?5LFͺ'H:JOTV\&rRjT"b9΀@ETړ/RpT˙t:KH "q NWQ zݑe\yfdںlh4kB5n,p$QU |l9c&m8MWZ{L^Siw)t?jR@5ow~`~.w(|jϕ٭@!-i~Y {Ip[󈒟VАkO|H_5KdF˓V"ݎ3IVwٕQ# ;Ҽ# sSmft>@#{Ur`1_}N~"_ϓ>p:Box_ʇ=o4f/vg!O4wI'Ijn3t1iBj"rR"Si89d SRSR|2'B/z3HR.gR) o)fpm9*Q:_,d NUt\J&l!O1IK:-#ep|7E?Pg;v31K=+[VjLWel7yS# .QZo;žna9n~ Ihqykˀ:\a܍HjEܸ"n4eZaURh!"-K2[n(1;.Hx7؍scpE6alZhv( mnw"<}7⌼5^0Fro ,f˼)֙vkwܢ}`swWp^4c_dz:\h?8k,j'̳{^;BkW"/٨lTSx ZPLV3S MH"zP•ԔtX YdkVd(VQvhU#Y G姁YKf=:كN-y3:D iq-r[-[ŹeecpBNBԎiaLaۄ/d}b{ Vy_Z`d)LkK̤cBd<~c0\"Ai0mY1nSxh~<^&5 v3/q+C]Ivw: s5߀ZQ-eF Pqp"Gja 9F4kىm-+x(kǸ$RGc,jAJ-q*NEޒ:@;Vl 6AIi0Қ!SsУ^i^$*t,^oT?_ךQXjs]iU@Jr(RSAn_ؠSo4CZz`cXƺ_pHDIg0$i(nqpd7ч}/^TaO$=qKq_5 sur⁗x e:uνTɑ7ˣ]vm/Ip}(c_k^)=EgoN^; %zdouP>a)4gjKGIM+ oDpf9sGkפD, S_]yԻP'QSH6)vUnhU8ޗ=ns⼋=^OW:%gMϝ" v+B!7rPkAќ1.-9cx7MmJXb_RsQ<1kZ͵r/4Y@yIK$xHP B.=tFԬףWFOt#??,-:,|%1yI1ѿ=#dPGstZ+^[8ȸ̯KŅǁRi"zrʿ ό)S麗 k~p;p#Vކ훥~-_Ծm@ܿhۜDQQauj~Wk0 Tx#OK9cL;F"|yq:M쫁FՒddzb\ύFZr*/XuQixITWzL"Bk:PQKiQ*$$l6*b_\jZ0˙By΋2 p)Z-z}5,c:9Aތo\k)pԨҰ4ɡ #`y(!|ȩwȨ(]KߚGm=jI;ZZNY+n X^7H,C!lxů1L յVK GeM'΄V#㴮0|'j/N qKcУ~Teq}}>*y| Yv04;CY6eAHBioc'hُ] - HNSΛ{bxsXP`К~; )+WLcyO+*J1sD`/BVIzBY!pקF-94^%`Fwv\>QvMSS`X,gSj5T2R%\MRtߗHc]+ŸdܴȴyJTvg*E^u­K8$=MH㩜wdY1?;a@:q܍oJ drTLý&3pxM1h,!IV(B  2 moQc]53mR#GOɞ. wP(cM 'pGZ"2ǴU@ilVV[I!׋RlHcf S]߱*Գa~+;Ar[)ǁ|{="чng-y:NS~NCcgӘ-i}̾}3w_<F!;4=Jz[^$UJsFpsb -SџdT~Pk&[ǂdcTngjCy1aމ?jF;A@:35}roK*')8`众qj7zwug}8PHj@zk/In&cAu9<֍'kH^C+[B3ޙ8 qs$B\m+Ӎ$Z%hDWm( JOgi2L+م ؑ{\L>烀k7Vk炔5߿#v(QO?!zٞN#^0y_TtZ?lJ1K<*eZ:oAeIROfYjzTKBl4&1(9d8P)شGutAI|5ՈP<$5:~; n_#˫t^|wJ4%>r,:a/(عڋpjp| ULixZVmyyv!36Oc{#FC 2GɘO^]zk/0U7/ߣh/Goz9n;yvTCT;{B=˗ڟyx ӵF:! NhI{R9]d{3Q!dntԕJ ^G.Met] C$si9U#JdqIep O2^aNQ coIHيϳׯ{`f^gwi=:v yVZvIL-9Z#1QMzxB丈r_ݱ{t^'\m{5ՒFs&N-4#O2pD# UWqfQhQ\OdJJ/' ] pjUۅJ%t9ƀ P,sLur\gl2Ǹ$O)tg`(UOGY3)yˑ>:˺O:E_Ϝ;z}[+ (V5eȻbm@GjnxG:/Ke r]Q>J(+6-vګ/#J-_O(Jށ~I6Cb16,srkqV7fX+*E~_Ǎq9=)nL 5˧K5|߂{aX7gQ}t~P_FSΑ։׏ފfh+]W,;^Ni}.X0yyvs+#)j0WQT FkXQP@{3Uy8rt^P}0K$c+ŨW`H1Q&٪2} _d’ t5r#SM!e>B];nLp/axM wKKޏ[LJS@>8QSr 5؜s)pH=&)uD?JN_1ԅ8#Ag_%d]֡`rFQXk}NMvyN#n)ǣ_'iv"aEn/:Dͻ{,:u[s;_~Hsd kl0vwS n"ry_(nK(=~B*_dB\ Z5"4ۈ$ `ܳ]B1̔TM5-ߴIH`ϓ6KЍBsFpKy?V|vu̾4퐜tbԯ~ZXa>({+G3?Xouݥg݂~ET5ǰCH8^r&=ጣۅifӯÌFRR;h.?jCxV0g#{&>w|79tWvZu^fGN`qz"j|8<#+lQ؆8> [8W7fH*VWt[ۥ1JwKl~k:k(q[i&1^*i+ '>uGig9]ۭ/ . &''pVy^}g NkiܙoퟩZxZyr5Q=k0ʤC>M5zUXƽwkKEfrHqwjN]GiY9`"=;Բ5ȡOwɣۯڹm!¡v}KJ K-~ qQT Tb_w>-"S̤j2G3(giXW?ɧs\$*ŊV̥t%' UpJEg*3Z߂s g (Do#9,ay+`c&YRHb4<$d¢[?{~ βtgx9Oۤxpd'(O{Hi֪ҏ~cd?琣@ABAis^^Z{|M pߗn1 7*ǥMЂ `;#K5 9,GՎA/R=Jat^ :gпh@vR>YA3'Se8IZ 宾^g'lqRɇO-UyW$*$ުI4gzIy>ޑ>)IPq +8>9d,<xnF_*EyԷte(܁q}DB]v83hoHu Jv)2QL/8M;B{/ Sg=_; Mar֩5 k>|l-G|dT{ R'O LT*)\E;.'bOZ BPTA].#@<ߟ( 38n&}6!Up0!Fd:9 Mw2m Xk%O…6ukz}N+jŋi n{H+tޯ͌@BTry1{Bj9IzޤO7 r6ZY+?E׹q 2}c}rx⎐[X=>ۀ #o2JK%h܆ޫɂ ׫+)jzimd7> j6lSNJ5$K$bv2y\}qz (WB?1{dz# 3sZnSz.\iHu"uidF lfD^%QĢ*ZzFz㧐m-MAY@nțb)A1\eb^ 8oE[kɱlGg{2qOs(ᓀ|RJpxOJ쭞OES.Zr}F{ZZ;*t^xC8p@R;Iwk Wfps)^yX-pr<|S:f[oL#-)sOv|#RHi/O`żS\!`Ng+x7eZ{5[+&dz)>c9.9svEv}A΀ԤS%eeۖIf{ɝ :uUZt:LúB&R=L2#R2"_2)2ME"JEZ3TBD5Hb"ӟʥ\ GCflHwZ1<~Fk|R՝Zޫ0W6枳3E>{q~72jT9͵˗b}ބc*KNtZ cTpA2c$t܉O9GhB =ܫu@nM# FaՎ# !oQ@|iD-n0{8TOV<}[DɋRZc'StC{ ik,av^{T֠Y?޺=I j{ƤcXw{8Q4_ҕ>L/qܹsBEv>j!#>p\>'œjJęt&`G)*TlT*'Rq)3JYX.gC1RJi+g$# t&LWV+@yႭ枟m{!h=\;~~&{BQa yk! 9[g#UvGa[& MA0^-!BQLn$<J|/  BXN01>SyN7IQt5wοeEVu{ɪ>s_@ɿ3)B/OroI ;-`06!+$j}[C"o7z_8m?n*]fMx WzSc +~/:&AĥˋXO?l^$:ݲiMn8b|W)V}2GNR]BCVO \]%|oVw{^nEIӭ2Y,c˶l˒K͒U'!`BHH IHb;ds8!q !0>``|73{-+-۫w_~Ø1浫f?QI{}Gt/[l1^,Yd&{ƙ+{l_93+Wɟ_wx|xc|~2r}̪|~HVݻ2?ȏje=3<2z=[o$FRc|$Q$fR/\V BQ4B\%RT*kBTד$,sytrA)DB!Sl.W r\AGZНCnQZ-8Z!c1lvӊ-v]`\7elRʩʚQ-K>rxO؁3_7eV❛Xcrui ef0) 9dvͦ2k}ws3 k֘t7 ͓OTyZh^8R^R7 l_8$7&24H =o^8ÿ*jqcvĥbh?P:[$71ʘB%$9 IPeJqX*B@ IlP=xRg׍nsw.|T^E .5Gیcx'AgF8_5yW${WU?W9#оW=44418X(Qq=[.F ɔәP1TK88:4=T833/PP0*ԀAJf,R.,aĸ:w窹\oVAԕ͖Yǵ‡@X,O챥7-\8q+Fld!|)!uS=-ذOcO% |]! Y&CT|Y||ZS~S|d~X>)k!L`~TsP71Ǣo6+P15{Z04mEyqק(V*Ḏ6/AzD*WA͜J _Qs/5Ȣ<>U]iAelM.'t;t`}`{1{Xfڄ\isGZ5&o7jrˏ엀=j)Al:>] m2t|˖1U6Haf12:Q12ךq=eڔu&Ӻ#3%kC߫qKW'*yz~hw&?bQN6ϼ{c/e~*@Z,W3\w.JA5W.ud5 ܦsjEQ\KekA0qA5aJgjeA>+@LI|ƴa:c|]ցf4#t  KWz qG4c촗pNy\J -V zthR4\XK˛7m?WI8,yfCu4wⷔ6?O+%sMEtm'SZQ89ʝh-]bƼ>5ԴrDGkanWmJhE4,$ `%x]Rsy01hV dJJZdB_>+V\(7*JĽާ@K_05~QZ 48̵ZON Y)!^s5$E"Ϫ5:]O%aymS8 Fo:$1]5;mL.zZTCC8X<7u -}%d_Sv(XhOh=\K/3-plB/{}q=IBrgl(E8NX^YC|ø/(rL'nyq@[^V粠8`$VHKL$A(dCgږ{Fm̽θM!Nv%#|Q( wOX.%9]!qՀA `NshN yԗO² mr)~xDh31.׼EQA֥TjOmVͷ>:hI%v_y RvxŢe(vZ mاi,~(ϼ4:|s'4\s16]ㇵxj.Idnij5V$ܕhnoԷZ=U=\7b,nSK¨ݨq]Lqcp [1K0ҟ3=wm¾bJ?y68O<ؒQ.[zs<RW\ִ}֬zX,c!؜%*s/50 c'jT*]#`n8F3!OšD p!*Fl@-s^P"AX<1_16-pxplvTd<Qd#̔Pgw~v&-~?dlM Y#k? ó~@\Rөh,]ch)^=8څUB{6ZP`UM8&Na bds8=eFS:(7?e}K˚YRQc};-lL(spȸ) m<ϠUl~T revF$>i"/ƶn6/1Tu/ Vv|ݦ:i+> ܤwy>sœy60ozfv/_j{qr/O=Wb䓧Jq[@.7kOP+$QVJ%|)jaMK]7քRu#犥z$i(3.aEDI6Fiszi*%`ԴHJ0O$,X+>FO\|(R@?IHiJJth3ׁB5$3Lp:cDKZ]OIaSۄ9szgQ~?JGH0v"!޻x?ʯ\G[bѳH c8`X_-ՄXmS?c?^t-6F-%KmzR(űݠ p.B @jh4k-Sרr\R'_ {pX\Q: QO)'mz9.8eZJBM%(3=h\6覾nЍrɁSbQԟ?c`u!6CD2ΥǍCouNӵ`>+dVk%EBn<#6ކkH@pԷ_f0'Y6L7`mF@f}տa~_-܁RՇ#*V!/NJpf-/n5{%N[;pZKmAEva\4q4z" 괥B9ϼ|RI'(לx߿ǎ#txffNUY0/xf7Q9u( ̜met m,_|e?g\&cUPRdQ)fGqTIT׀äL9pZ5Q$ެxT7ꍰ݄̌Zƺ. Ϯ4pdžQ#RWAM8>beW-w6N1ۊǴS Zj d52 t-S|l"I8I. n-֩RqCV@N];*vG-~m.fΝsR8mҀU1Qݨ9Zp:|!G[nai:}br#bUЪ^Oa?eD?~CƏSS. GPq3^,gN±QǼh#_xxI5 5mVG*ף$+HX P;ø9{smmWF>A!V{9ojź '4| ޸Qxv+%ak?'ezZGoV*#2h+SH/Ȑf,jmuMMp\qKa-ul4m[V^b7n;Ka.a˧($\]:'imϹҲ"'j9N)sKs?4l\̢c?."GF4|q3Ƈ+|yf+g weA$Pro] !TluRl;ˉ0˗ Ɉ.+%sF q%ZroDQ^XV- t6rjj\%W,s;fNk~[Zh\N|6NJΦeLF)1(tx͛e'.LќF>s,$ s2!]Zut #A6Ry5q蜂ŧ4 >_W~\߰ }oF&gF]>=hجAm&Ե =J<,I8~n5gf\!]}e;^\dwˈ6#ɿaШ[nTw7kp;Ω{ LSJv=G&M(˘1KӅX>/\DKGa`]6Z7J{ N"E7d][fZ%5g pTd1=k(OC91oْ$O3Z3f^ pRi2{ PđdU&y#llSi;!mxW@}x<=-sC^tMbo݃#mxV?7]_ ~3{qJt Vân~B-9wqn._s7А63@rʚ؍Nyߩs)L+>7N/X&$nfԸHw `Z'Z&q iA ۮQr2s+&/{<նhW%i7wM3֠?dɆmGH n5ΒndǽA7_ٍEK!L_EN-:;[LKLgp1)V{{.7zN$ ,13#^ j+%>A; Tʷy.>qe"B{ڙ6;ʉIc1˦v]hZqxyeyTQR;eq ]sl٬SB(;eI 7>>f=`o#9S5u\v[l6 jƼ _-jL7A|_|ko=r9]H%zٶ!+:.g'*n./hE ͚ U^Bdb) bfdq$aEҙPy(>ЙS)/,^>qܺ{9[i|ɛn+wƷ`xZz ܬ8n9`e"K9)=ޟ~0C47wBNq+ӓ&p-j_9o|k{fy';w xn[/(:Ȱue߇{V,}]-j6E0g?r' +F~0uc~V TzG|Y)~$CBT̈ͪ =Gn0Xڂo4/Cې赫;P8ӧ\nWInϥgyE.Y2jޗv>3,>G1:5lE 0|*2uV $n֢ZD)D.@\>_Lk5Cۑ$K.` <8K:_ BxXO~iV@s(Հ)7F8nt[S^{8ۯ!Bwʛ[r#ʗiiKy#h Kz׽,֠yZp >`)M2{B,a&`ZG1ۼR͝6~]|\MS6$f H b. $q4ܠ ыX3`Znƕ:zS';WxX]%!k s9 l{uKmژQ]-Z˂8rpV0R9-"B^#4{?WW/YApΉtX5(>{>Ȝy mps&/r%]ѯ&zxK󂻺?E1I?2f5~ܸ9&Krc`Z_sA-IZœ. p҅/ .-b pOhA ʄpRt 8_|;峹r-qu'C0[$΋WsYVj)<8SшfR<%*bI_R0Fk "FGǓS@MdO?7%ud֘spu3jZN/OyQ+M#;sFŻF'+Vt;/c ;MhCM'WW{?ܮ~_)+" 8v|2@[^5$Js'05:ܜ4ܧ Y٤tyX{*w*G۴mona!rc`F/%u=Yoy4F+>:q./%-fbmo= ېWFsanq*ğ|KIeF_CǶ'a}H`WoޤGZ'0P?INzThܫe#a~#y*ʎ1Z{bh\+x5bVNdmvn`o@þ3͝*˭\o`NE"L?}r3R:./A5m;T.LB|@8iF|M(e8gb|uh2.^6\@Q&ɕDP.WYQO#t$ۈx*[jҖIp~>8Z͇(~cN,>9VvP~Ѩ)aˁUK/#YA\ٟ}L ׂ($aeN?6Fr?OiO?'ŢP:Gom$|wDO_V{QZ76MB( fG&$un"Cϫ{,$P<`k~,mÝlo5'kf )݂:\{ {[p?N?_-ZpC0/≯Y?BaܚJw4Ƌ!-AӮ_@V#v{Q"-\wKKgK/t!y⥌dP1HiRu97Fy QBw9y7Yʠk嘑zbx/x'd8}xgNCAFNHm8)###a'6iv)RƴDaqK˓COmk iRyoM;ӶYNiۖ6CP9[9#NvoH ɜ>E;GìxTJyXuͼi0?a_˙su{F}vnbjXDOZ/VX~X!q89[Gy+Cg*)[ߥGtŋ6edn.2c֑r:͠ w 栫%|gŖc~<߿|Ts%KیYl QA~,Dup'G3\o.۝d UjF!R9}. ܺ'XO ӊ |1~~|ߣ}ВKڳI fRut&0hׁӞHIq3%#wsк` nSÞhu: }7uTFRqS{]2ثwʛgb ^є>괹COFMm@^@yT;u]WvQ33Uڗ{ݬmMtJDx.ͥ:FZ!.tԻOc)zDbH-k jQT߄RTrK,#>(p">E:B|,T0q5I] Ie</ℋ媴y#. ő+hs\ӒI 6%%Xn#M >bi÷ 7 x26n[tЙ5HO"1C;qִmq?1T5v̞?(1~Qehk6(׉-+)65Sv"Q2=+.LQkvy Yj[iՖvG >i$Ap_2n{p`I&Q3ՓOnܛ~Tmc'܆e H.99i4k.U圴Ϡ7)ڎdCxoF.C@êtq Q[/ze` ;fܤ?uЁOt(N:8ި%5]Z {gIRmh\;@& oRh %ɠ<;*ߙOG^P0>Lz}{!pAWT gm;P̡m?ey)@ڼ>iz$"{!oC̶PwzqE+z}$]MLC"(D#S"yurJ+ɍ)m*Dȿ"i>FbN;ڍgJ9IyeLh9M;|7ZrHGM+rTg~R֫W;44xX,v/![ZJZeYRSfNkb}FhtAM ;QO+,ߧEP]sa_l\^D@cFG/]n&}_2}vY43r Ni_$bPbkT+O #v#[8NFy1|^jRؤCۋZUט=ov`POXiV(}ON}9g8mMxCYϙidoN,&wDž4kC}B0Jκ]^k횽-&oi,8niLGM„Q٣Z[[3;sőzK/bmywQ+Xf#%r)uU\WF\>j<y'n|(/9bm-fGX:Fއr:T+^@ iB@A\đx@. [n[|*ox"r߲ďigy0{5b 7疲C฻ObKZj{iټBm?尘@rlS{kbJ%iq͵=ui9>Y/^<ݡVmň9wgtk;mDCں!Q5/Z YElw %1{,_At G'_ۋ-^5z_>X6QWn w./$eX*ظfCB6Qi29Tu?f'5q ;A\[A{<t\O\9\|H%R˜T֢A[ ΟToBn/Γ~'_;!aWxH^z*Mj$~Wˀv̄;C+y'T =^ Fvi}QvFJL2j1?xUmn q)-31e4#ELaGgH]ʵR_)Kbw .7iźaQT/:-[C \\rj.TKM#*1^MJY6*iZP"XSEgیD,q.~Y⌝iy_Adv{,Ʊdb&[j;=5[/1oLd"D5 vpTf ~X7e16w(@M?ô<eYQ`t1 T=c9(̒T d PX^Dbx*6/bђ 8>.'fr_·p`/='q_|ymsDԦ_ܝo6ֲͨ7'*iRW3pPQ8m< 8gE,E%v=Z;`95SۦHK5:UʩLV#M?}{$='ݵlE߬EJI- gqgg{Y^Qȱ٬?<H[1]ߍHp_dM=R& qZV2!ڔԫmZ"l9t'5 ~7Gc| &~ߜϷZ+nP 495{:$鐄ݜ8w 5iPeAZu=Yp{Å.bԟ2ӾwA C -ce.]<˞s TbHEP NQ-%Z\1qi5 @o6I 3 & D-v Gz|,̠)Gգtۨ96K뷣1v x[~QУGty~]cNٔD @P&m?fPo e1My\|4-q{9b"2<2k&o X0HGqh.ߐ~-eUyvF- Խ硗T DbX/Z]xXbP*% LŊz3WlTe*m*~4f]2Z um#Qܬ5ext-Ÿ.yJHα]tt6{IRJ?/u&Jn6 XBaF":Y7NmznHu05`* N4Zܰ~z:Q/]y"CZ>B a? Ad#X$A]^è^:,5xZ6ÌP %49)sPDց̾#u."Tד-= (_u(>GxVcFru1e˦g8vb+X ^:Rԯ_v@ĒK,x+oqE?D;qicU qf:i31Z1/*1r.Pgpv1B_Qɧ}.KL'-)[Ijf8P4t@@lGA>!f }Zs@(|D#n͛~cwCce&G{e[F ]L\ۅ}_ч~ R(@redE呑ykypNv#Q@hpʝ}#)_=a(N\q0l!Wcf ͑s+cvӓFQļ?{d=vx0c;mL]M0m1k{FA4)sv2gwr틸b/X,]f4˂5˞,]Ky;{Ԫ==w 'ѳAa˫or^*V#曥¼s+MZw.f^ĉe7]ΟnBwmgdث#Nyl< fll(@Q8^p*t: 9c^isּLuzgr/)I.ߛ[}0W7HVB&?-mBo?-!޴4i3'miJ_y=}1_W=OnwڏG,5!?ZX0 WC2dtaHFVUWHwn݄ĆAblj|YbH=G'O4l2КʵzR(Z-A-F棐f%՚xzАmSfR%'`r،EuI y bh(~Қ \W c0;-]NO~DֽҴġhVLu }9P-OKS^Kj]Zތ&mGԿ/I2)X${+$GvߪO'`*'ѿEez OhBmɻ:* Ӝh>𰹱-;ڹKs?>&*BCNW}&?wzSnyo- !3Q!%h4.[n!cB $B!@ ;`1!@v!!l;q<߷Ι{lI+6I>3\ҏr-/[j9^WʇE֭[&omom߆u}ή]s6uvԝu}ukuwݵn]*ݐJY|ц;צ֕Sή[׷am8.Z{6ZsE5aX)( 4% ($2~ T*2^AQ9*J)*RESTTԊ-\ʑ僜_*% edT.EAȋ=%? xL&ےD"*F ;|\nh`Հ ]5ۼ~t@b]z

v4#nҧ># ڒtCO[|"\^A\7'Mώ}s|uz(uuh]}ޕ7u֭[{kշ Ӕ,*)&LP Rf~!,, AX(t*|r~NѴX B"[Lzl6^`agE0P8(ΤquTaRmZVH)bU#W^\~f^)Bimv鸛:JD.I}ݡv8EqsG9R,@Iox"{Z"SE@yr^ ,Abp'Amrw?ڷ_Uĭ&"eܤd#Z& ?d7QEPċkIӜ~U^d5XBfv{٫wHxiƵovͲlmnЂy-G_[]kk[X}Ze_x_ KǼM[A'}ySe*q;ZҨWkU4?[gWBzߜsի. sBߏe%iVHEoH*QHtʅTb"ڤb\C$N Xܧz+fkHsh̸k>'Vmq-NqUԥ(gCѶk=>-VcmQDmlkW7{c#rz\%"!Pލ{Nh(_~&^Gu ٩:,k)kco#s?~œ~mטb1xE=)JlCV@0W4?Ky +T{fe [9 6ȧ}Bsޫu[/MŖÖW\}B˲e3T5Y*KA-[+~)9MeIk*ፔ ( j5, *;*$Qܻ"v%\Ztzsw2QRs*WGT9lcCO(Gsx{td YJ1po-sD+?šb#_qn3Z9YZ 9e|Z6Mʀbq\Vw|FErӨG6II^@W^zinQ]:$e!]LEW)[\ZO\Q.S+ *jQR C( BEʘ˹\6[R}v.ʅR qׁ5PmK**GJ!D%(07d2!(VrT^zNWϕ0w? %n 8AD8gdɣ#--9 h#&$Pt9 "sBQڠ*|yQ߮YoicnI~._[:9 k.5JL VWC@cdcrQlt4+iC]:?`lװO}Ф1ՄؿD ;ݧb*2%ЬOr\ͷbfOH],;M|=1[ ɨgrؕ0'?Jc&Y CA~-1L9 ͫu[ t)ˈQPʖt@=])ڙLe > 6jBn *ש0[ˊs+]P(xW p:A~Nk+cUM@gY-s5W2H4*7 B&X. 锾f@0 8JRTU>TRg_,&vm^l"}}{SKz@'J1.|>(f.kHd\˿ )T[ҧNr2aЗTT.LSb^'qKYt<ՙV-*2¨RVgFG E1Pn.AQ,t+aG(݉S 2&)2n(pp?G4:yFMJe\NH<0^k'=&|xlnSfL! .. 8hĆ[򰔶TVmʔXRU WRĈ84vJP>}7Z~k_fA{ '%ͤ|Dh,@>Op?zM<trᓁrMy\qU}o 0i1V!NX7k8٬y;=3*V,BL<0ḏ)2Ȑ35QO AYH/4Ae0 }!aS.X劥aV*ՠR JUk}}}٪^}=Wd&rC?@V =ys(*bC&JBfZ kA XMT~å#hB{;ػU ivA!y{ccɖ;^q,uvCNP7)Ȅp d’Ð]#*BanAQng'!dTdb~11&Np߽n=]< </ovںˋQ',]e0xX&3N{Ry[qc(oYDqՀOU?'Mm.ɠwT@f7b!2CȌ!m9xWun}ٮ) K[{KȥqY~-1V7S:$B&SP~\-E40+3,?uCwjh7 IB啊\z(ҊLP *j ~ Q7yxrsb9>][Z Gx0 b`M}(sATaAV#|gwjc芄ʇJ uQ:`}8 Y ԣ9?jn3D%_-#nCN3"v(Z6r{KT3PP^1}?8LIs8(>)ͱfJ]/n7LN|өɉu۵k!]lπ0zFT^MWf^:M$'X,p>\W=+}nK7ksŴ1 u^)ArAsP*b9a/U,d0O:J-ڒtuKͧ +W4@Z؀qB$L y/Q"wPpbO,"_|YRnfbJ?efE]e(6@ iUw$Xg,{\MAG0|ٓ4~aѲ[~sc+3P{鴳V߇y%PYO+ $~A;[ܿKP[K! F3f p{:ew4βG?qxXE5:Dr5gqFp*W"}Zhu{Pm7s꜕'5ŚMn&E~90bi#PK/WC?(ESy/\)~Ԁbh EV85J{ܣ<60;"3lzq |V[m{BL8!E󇉚#x@F T̽BVMJzZִk54m%_ ,;lݽ-Jf FiG3~1>bt)E 'L|;_$@r?7hյ-mӹb眰hڦe.3؊'[-FI?B̃eGYŽmb ?Z(noc?Q)Q4-bE[6%=̡K`-6r01U|`np-rj'LȨՙP\۱dI S35 #YzP/+-Bo|>ysp n?P]e\9({\^j1{RJ=HDJ)* aU!)ʓP7D^S)MSg.CAg)%NIsz_J%S<^*|?8ۼR)de@+OSN~(SamX vJ!Zl3vM$S"Yk#4U;ܧgă Z0t 4ivI-W)vs9P9i}%vF[lQ=<9?7dLivъZ|=h>whuϰWkb-SF>3lomcYwkJQ`5 {Iĵ ~3 ;Η?;bqYAvpzgtjE eB(*$&}OxP黛wr^|iVHfwl-EP92jR[ti a- %}K*B\ ﵪf-V,*Ɵfu: 1k}g:ϫsffF5n#e5Ӓt c[e_qgҷ[4JR@'xBA: IYp{e[G.(vuWI db[lOqnP`KDws ou"oa]}V#vrXqX&E+e赔fe>_uKsv}y1gע-\I\ާ(Hֹ6r#K&y^d,Ez|?- Ud z!]L!rG%ו)?UD9ׇM:3@ _*"x oأA> i T* s_CXCX b\Q4uta&iS]34 |&|DA̒8A76^B=F0C'"ۊ-l| xK8lΟUrl@RHF7-\%!F,"Pf ҝr~wTo1K &*ld6[isX?-;ЩbB>Gj :*f i8լ& c6 Ŕ桠1se/7&zK^2CКflIɤ~jK$P]+~ʑ楓餗DVo|jjΐf<Ǒ DԬ2_D~Qq ,RyTи.FNP9NXb ~\cH!fL!HvQ,:gl]'5n%_+|T\gFŒf}H"b27 ya)`J]/8犓4MinW @?%~ 3usb{;ˬGjy7wS Nq\^5;)IڏWrJw\zR|=,Qk .&4šY'Lm ^y$51pV6V~i}{Z#i<RRZ-{!ӼP2B 3jZZ-gVI5VJeQ~:+|RԂEԣ+U|ˑ a)}gj H-~:${YI-\G*iIL01YTQE OOņ>cn%^St-gqx<}h?Qd[X\.c1o992ڥjfk|b4mv<-[v="2'0[f]a Be1f)18iLv87F7Kh6,Db~yդ-W~-;\Ob^ g'Ze#>kbgkI+E/ay:)83XcUop+#0w6I3ܯaYH[*_T^}!=\vBlT7eJT*`ً*=E!czoNE~0xa!3 Gb((Cïv"ϲu#E,~3 sQ3f1fuOvm۵ sHG gI묓],<O0nsO8DI!+8F!wMKs(Y)khR2g aglnr5iwi~Fʒ2Kt٣`yS g )]GXd%-7M >&ˌաk{3QNYYAqf .mm#gȷ/9Iwk);T>Mzl u'ЧmNL,# 'Ln0i ^%tj>Ƹjrןao"@{Z .sPyEA<W#q,}N۽Ϋ-9 isyS=$6MΚbZ|H,mXU'YR]b/@ N@:h,򶺉BZH YӼh|?L'ɖd6V+cTB>)%qd&)vx:' zu.$,Gޕjqr?R:(!G6 uj]և LO)vҢY]Z-c8XO9XimJU͓n0߁4:N^[1.! 76_2u?k5|u\ok\bCE s=De9l#eZj]i_L4JeG mSW32[=7q4gb u8ŭGlks|4I4a }'RY@:~f? m)A6pQQ.WP;fZ}jWnyنBzA( Dd95@ª8Mre< $I8W"p(:Sx{'lɸ-|.0" @Fq-Nz9@4_n4DO*t;ibv7% iA(;&n{?7+ޭ}CBGX]΋3-DMn#F`?peuA뗜ikSNs=0*WxN}\/%X{m^ki?@5&7 T{!V&肒ŗЃ^yf|768VB{LP)|8RPx$T|+++N l18/xE/FPB!5<9٘Ԋa&s2.(ߠפ ^ ~o݅au&KX 9(w>W0+n^Q4K0QSCF=#}^sYn!6Hdr!@(=64\;GYA]4[.|ovF r.whMQmo 8IZWRXQܠ˚BS"^bpDך l˽ )N(lgY6b|cb6Y'ߔGĻ] reAK$!Z!qe66HRb":Q]OIܥ tjriqS&8 6ȯ V wk;!]L鿝6d >3@@Ӂ~}*A[򼸗NQܤW*$dȕj))6rlnvoʣ`Jgtpآv) 25uNyX`lu;1$HӪcYea;ǐ,حSP O  rfw~ǜ7z:RUtX|yq:>_ڹ# i!ߖcO<|> \HD]NT683R/QTeСd@fz@T A>HR%% /Ooh>%q|A-TtA~Luʜb_k֊]DQ?J(<<ӾŻcTy3m)XV3$k0L9q۟] ؍s¬!o~ev8m.ǪA.ط@J~R~ az],WPڬ"]k6wRPյߩAfEܯ5GWSICe1C,o ڍ D{(Ͱov!YmRTBqlY*&uAϔIN 7#lAV\"OvnL󇟈[qqy(-ȊHW{4f.}4*>,&Wt7O@qyĺWvyymǃ''83|$b6RXR@WE]zi/ʕTƮq-L X3RJ0̈jzL.ջ M!ĺSVL. IO p?{xuӜX6i EV7)%~.iE)zDzt> O [yqWQ\zg`M<βD) [TL ;3FN2+жh#1W4BÍef?Mck8][E[ϚCo~T:B1r`pJ]'`١\}ڡ ŵ٢m\nk(٘TPfF%A=ѷ\#gKh[Z$M5ݣ3 ~_C%3zb}Lfʷikبi}!Ouc`e1R6U\2̺]2L$QR#׆{p>JmOz tLwm Tj9 `x~j,k#+4&؀@;EFFֱIlp/G(46 vr˅ۤ.|(s':J(VBqKձaF[/.4e+SI GԟDJ"DӤt1|Zs0= -T/UMiK\VSfJ.JaaȫykF~^3.n`[ $Y U8<].֨p>twHEi,EizcمLZ=j-;ؐimHh:F\b:8ptdXLcX b\ațwӵ-9BN ~Lcy聾HԸc=zlQ9jus0|7Vk=6yLZhB2YI"M?:OunBz;ܦVijj#}Wo4QivF "Csw':;)esL7cg[Njo̽M,)Gn \@T.x/K%/TZѥ}"C4 ^&*KaV[ҿB`pK$ J[ (͆vC(iQ\ۖL /嶌eD["%VUn I,lJQs=6M*EYipq9۶8ѭܟ>yle@퀴ck~2Ns?ɠhal1;_{1qDsauus]y5V5ʽli4RS/qmͲw6ksP .4/Ɩ]H ÖT6 a#찕Dh\ɓ+P =[gD^ƃWG"w/0`s4R(i;!\Y;lfUE먅SNF7nqX1RMpzw6yę %ÌnqAT1?HZ+3&%s ,+>qί÷Ś`m:Y^gi'XNz~uיMD`ҨY.ɺ Iqeus0Irܨ9+)m}'}⾵u?zAjx-x/C _sz#$ ^Nsf4AyuPbVkrDAgحzmE65r^>"QɅt=Wbע23 "X\YN=c=a;WߙJ'{_ t2],{7+Oݳ-X :V jw2lWhvq 94do"Ac„X5kD1_oU1Ja-]` Aq*Y8ns#t^A73hiR\z[!ܭZ Tw+.1O(,MUKo0F*%LFok!-si@g@!,_9 ?|a?OK+~*!K{}/UW/Ηg6B?UJLS\;Vs=W:ݙ0$Z!S|~|> 9vI !$iۺAr]"?2u#&~LRjMsʥ+bn7];r*sͷI#NJ{7+iv5β[\s;{#}ZMnqzh ElmAJ`1b|V[rpsDZ/zM@.\Z/g~E^Z ߣ[~], ަt[Cvr6tٿ_i^ zvЕk\g1R`PὯWհ+׷<.GჍ(Wk>@0Fֳ,h5ssqi]d6 y\M~C1wU0x|j0$>7w?]b5*”Whs,qG)L B7tܮQ7~w%\FT0k6p!F>sUZA^ixOP$8C_І{L+  Pov.x >-nqu!BoUӦv5~f'ffs4I>:=fgߓr}>% bKZN.zT7 K1 {@o~Te!Ӟ5T%̖T*Uj3 I$aؓS=ỶXʕ (fDeD}.X! .r(3 J<.clY f1]wױiT>ҺM{2CsfxC h^hxT9c5ʅ^@V:ڂ܃C>‚ [ÈCq-s)w7i2*e3<<ʖ<.u4ٿ |)=C˜^-6Efoвo{~'s3RӾMn;݅!AoM(Bl=Z3N/W#xH 9Ϸȟk=N-dF%apJˀA+.6W`q6O܎\d톳|ʰO>̨㇅tw˻a A!qy|/\&/WGuѺu+r B%.zŢ@tg\.Lzn}dXLQ}dB!k_:AГ W ,SaVDBkٵkfZ)>o9|6PbHov5']#ھͬRU:r+@yGy̅~,q[Jm|6ȆkL4NGi$[(}bӑqA~w~wxxkȥ"}w&Jsv\M)z6 8ߘڀd;'ݓ_H[Tcp/ tM|M~TnNA޹Gؘ޽0`xkF|DE+k.uP9le"o[ uD!ћfrlO\I*=IZs'CSY$@:h^?W/>08f`˟#n]ma;GWUVI9$US|3rZGuLkإuc̢=z>_9oflfy40tm!m+NI\ukdw%7F75lMpVmm@o .>K<:bFEźC>ÚHT{r-{-f =ڭw7›eNjt^-X=34ll3ŧ{KFrŴFlg(+ڶOM>oާʵA/z&Wijc;EQ-T/r.4I~͕ڢEP"#G Q.>A?#(#5HBQT"?x𧞡ÜF6{*{vT̃U^P2EU`]6_lΣ$d9.k#$NCDP..^bt~:Ǒ`٘[qnOHM.:9ft`#[i,l9huNQSEqL3u#n0#:\oR~X[b6] q#5[l!ip~̜s0nmԔGg,l[k3.5q"vltaE"c3ox4CW꧜ zʙl\WOOu2 *yk!.y2BxPy ) 0Q7҅bJ)*_B).*mԋr0^&]R?"n)BD(BเÈ3V,L:`4^REg О.ʓ춝(اiKm\SwutSMq\x Ox @c}WqG߱ ii c~P,AѨ:N1 mA- LZb ?Lu/qђ!1?/x9 tmJre'5_Џ~l]ܟ +6cX r8$'C5EFuc1m[3ۆCzfcs:3&Sd(-$EVGrXkn &N?;7O{'k4`-RSEO=I6h|g\,Tâ;VFQ[p]<YpC iݡ.8Akg lPV86[4/ 0-iZ( |tEziV f1ךYQrSWB7㔢 lXΤ.f!MͭQd;(8h*%63v:~z%Cܑ^㴃H? 3#؎BxS" Yx~xl%MVMV6͋<}~NAAetg pS(aǕgLBiA.{dpI~qG!,!(EBV*ǙgVjR+_9t`r(M(M}ω8^}/c oB5z]+ :p .jWl`ԱaHzrSQ'n$4nT9Գ c]Xuts1w wnү0#_˛hL4crڄX7 {x[AP~yN9 %39ua• \-E;:A{1w$:-ݧ(=>縖0sRct;3Ͼ7UQ{FwhC6NwZ)7]LP~ ?5ޛX]f!]<C; BCU]Wy.vΙv>uO,QI*dZfQe[6%n  $@fl0`=@RM0 ,pj}/\ova;:m2+L7Fцckf6qӇOc: ow筸z1_WcжvsLq<zːc;}ȇ_4ٳ J5zRӥ:vu)nlj|;ucR_3esca_VϦ}+K\̯j8raGU[ 37O~@O2mEf >-Nbۯy_n#&OBc?UCz2)[o'W#Z.eKو] dVg1z-e<܎QW_7ۓ~TyğΟ! t3}1NXx} ~&_xk/l <>yt>^72FX(ԫjs j4́pѨYkbGZ%@' aX7ԛFT |M:/d 8 FjF f^j32FD:ݢ5V֛AZG.*O K3LOkFYDi( ip}bn@v^oى}#\1fD8".0o\; xGojY+ @(f"~1-PoӧvZi j0pϼ_C&|[cNo;Uy Spt7h>wTv рav_Xw\ GP援m֠v-kTO= Nѱyu6z=IA6kSW,O-CZA L =B{;כmDn)눮(u̧j~^t}ҡVܫ2]^O g f#m{QFAP |f+d֯JV j\,Ht1: fͺh:j1 mb7Zҏϴ?oP ?pxi ,u~Gp9H @ikx[y9?&MoV ˨ztѴPЁ[јi0q|₭?Zg,ז?dLϯSK"9L f ͘>׌&-~\^p +tUVͦT*HKw8Y ?WWJ~%,as&_ĐP j%̯h4̼,Y v_yP\5@6}B>/J :wμٗBq8 u3֋0[p?{bWr<%:25bu|P:H0JoP $]>Ӽ{R?m,'!̘{^p9ZtSdz?5xONG}Ut_QFaaJ>|._d[y\QgL.٪ydܛa!.ę Mb0gphRÉ\Ҫ>qJiOEcH}?Dgȼ/I};-&ӵ.; .*%!o4 StpNf>XZ0 qVX %7ZTïym (g8uE3毱LJ nppc]J̔{%Z>AEZW̫FoejkCY4 F2zk%V} 3_4y}7^1G?lְ46-UN1n37NO`|Ҋʭ3Fv -MqF\;%Zvᛧg+"LWS{ `C3C^KPaѼ٨s.,W7)Ө@ie0+rJm``JYáMPePlprf3n-$S59+u͠V9Eڭ!Oԏ3jP,֛졋Nܝ1+yu(qn~2q|wXٮX·W{)l `stok><((~X)MLȄ;*ѸSh&Ro(L"Ao#4D/-F_mcMD|S9whN#bkW`~W̘ҴFEoc[5Q}Ԫza1r^Nܥ [D1G^L b7uPobp #V#w u~]f2=uK+yωÃ@郳GY:}H=Px2>i~B\AP0Ut&S`L:*' BEo.W.J%U*0M `x"UAlUT@8N)ӄa涱yw9H2!21K RmN ])oQi^B P҉47y^m nI;W\^=QYӦCx[P<\_.j>\+Cv}x{iA{]9G,m|kTFK {4Cz#Ž^z3żgOH8H.l0<8sϹH@oB)Co$\(#2)Ѩd˒ 4!jXj9Hzh5jj_!/в10 ǥ$=%jdqIld IAUȂ!D9 z],i04bmHw ٯxqՓnBy]x8'}܉G @󌣻V}':wNR!EQWkf1rEI\?m]>LiⷔƽD̍FL1Qm֤ ݔw@5Gqr_dUVjX4|oC vrp!i JMoh';3N{Z3:Zg'T*|VcS 7^37zqݍ%GpC]zǭ0fkn{a,&A)ҖD fқ),Q<*e-Xw9E5d=:[7dNE-Oxל@wϚ9h jaTb{&Apx|!GZ{S8XEκIwFv%u<};$ە&[vzÀ>eͽ<7f%,2y0Y0iTWꬪ׺bNOk ۍ5]a-;cktD|kdûDgeC+M2rcyKkb,[OVԔFD~kـ-1i 4!k?Fܼbڴ E]`uYpԶo4u(-FӮ(5j5R"# xDqh >E|sZ/=\.쪆023emAї\ fa]6@^ܱGƴ]j3a|j%f푡 Hi˔tjp_¾8y uS{6 :@N'SQ|985-ν3ufr(Jߍ~PHpmSQȅb}TaJk䜱F% hZB=[JB`eեr}i4IgZ@Mu zlzm9Eʣ3֓}*0D*s>`{槞9Í VF N7 fRo\&lOglr.Z*۸zԬZTd6st:34zE2JJ_AE:+QV<̤+( "emw->(ώHd˼z%^pj).`5~o M Gr? T ލ=Ƶ*7i~h&?n:|B+c91P'@9R^ݤmy ߉·p>I14K1- ES!k6r%ϛ'ny7UD[_^8<}نmR%qz楅 VYt/kܥnǫAk7j(qP=3q~|>|Kv՝O^zl!M#cf,ͦ5svm%I]rT2FP[Ўժӵ #̣ inL[6ôdntMQy]"f+,)Ǐ0vۋ"N1ۣܳ;阢SD>u:̇4Ct>p̻E[5~gS3c/z&3́|9F)aǵV\լK(5ZRWj!<9GAQ0 k6Bf$[!@vJEuT*T)̡ėe+?vp:#AtgP@thq.jܹ1db91?xcx,'0%lĀ"C2~c NҕsfrQcGαad|l\!0sPt[rbC؏[3GZ´5'W]BuGIDZ)3ܵT]oXNE,j2e˯bzmL!/O,FtFdctd8xL4wbmgU^Þ8]ȸ8jK5wd;Ouгgnhְy(n9Y΍ְcb:!~ \(l9#e6|Χ8Svd)쨚f[0\>K;9*EAzXY!iImB)[t:.g2gBt UzUIk3(>ӞwXfi[V]*sfR.$vaAϯɣxy`:p`ez,9Uzy~0$>΄ptʎ eWϯxV|I*d0 |u)&W2}k#ҮnrDj3 /y*PzV~Fvjt@΋)] |#U^}^SU^7\5TRIC0h}`x @*vaosʛԷzPwr 2L}ykϞI93yB$ fFNz _kנ[Xm6#jIOn1}Ypz:+3}!`Io 3_A덁Hq/HDf< ( jj$;LWA >DoAqPx`FT*5%zr)z Qad=}aܙD+g!"ע] usgq=6͍2*(53NqޘIH݌\kܗ}~_uba^mvaY|? c&}<;nRIb޷ijbxF=/ڷp0oT_Ӽ=ȧ)( y'/qV[̍z@xG{!a|&0Owyۀvnً MFL"enW߬U+wJqI~a]C8OW~:܁0 U2 =|Kʮ:˔L޳yq6C6uj|& yz2*0T\^I}#u>sVwcimiky7p9- ԽMżϨxXH(aZL'tP,S2_шdL)e7)$Yzy߯(N%t{.Ez= [>4ȞNIBciP=gxEֿ"G3qm'sчKyCQ?2gqJ1jHƏ @5@u &Dr|ķ|@yFҫcu{U"^S:0ruHp44y1{p_:sy^:Tl:Aw>,ǿ>4Ad47u:Jh[7d=zK([ο#n )9GWm;o+84ZbtV=[eu?yZ0GŗѺZMv#&E5#V=Np-u2k; & I]yNͨtẠ̃N(װ$)R.hʔW\Q/~liLᵺ ѡoыyT+4ҴigFZ0{E7o g>9";.$;=pGM*S&jnsȄ$V$n/{tc>`S<VT ݠmdAgpB/Y:[`aDf/>xX%832 .q &t]hUb_d(r\ffjt'=:ѿ1s@Nt)]YhgKM`]Sa{-R盿p9C2`C~8Wx˩T6a& +˴sv.G^ĤMonBvIRکgx6] y0`_E>2(IaճܫN1}d점1s.=]ӱ d/. ?& .Aقp&Z5TEa4R]L/ӓ ,n>=`y{.W9JEFU(!HW뽜E$P6Q!rB+f҄ME.|Cc[tGi\z IH'ŨoRUP(t>b,@#o7)WLՋɍ#qgd-&Tt?}CgAjw{c3b\Fq;'$]uŮ%؎8M4`]0[dVIǘLJiGNdR>ELaNA\k4xB>5֔e\mM0RI ;Ӈɸ5R6>}՗'SolƓ C~p1w)Vev ȏ>amóEZT2ggI_vlC -:}G?E&RM6E<͕ؠ/d*ڏmv_U]vk-cұ/4dʹr+euM@ɠ z Q췥<ۢz$jhADp"W~Qx&wȳE8:eDj 8wG.tڳsI7b%>mѪJL/ ɒZԃA&-m 5~_>0FREؿCA@j aюZq?(=,HIKW]f gyTJZ:jd:OiQ.@b%\`lY̬EyFG?g<+e ke׽F%VnYsRNzŹiN'3 `-졤ԫ=i3x|-y:fu2I R"g!WB௟C lnpOvl1ovv3X'#goEƳ9}t׭n)Ǚ[=ZN[vοЁ=Zugb$Ɂ(SNhQghZZv#QXީnІ c j/Qm>?hȱ˻A=(z90 fD&>^ yʹDN'k ^Kg\8~';xz'#w˱J$d_vGi郊):}\qI& g(#S/E!A+"aG/(3CF48Vrѯ5j"l-dHZjIgzpANz\)|R),q_C., ՐK6[pi4\ɥR~a3?u<+TU;]#vyd8_OM[ZJMDn [wAR:rX̰?y:0(_V\m~LN0'G8iT=bǪVjD˼1 ZBdgW6vl֗l~o=k۽OGR6Ua!\P5L&~k#y6^CvTcئ!vk}{̝%u`Ow[UjڷfSIOo2ikRiRЯX={욇S-ԑ*U>\)ᴟL `rL:b.drq+Z'mOg3LFV$=,TF﯄jX~%/KZ>^[Q &eי|CC3.|ςNG]ƹ,ҿx?f/nV]jorG18xvn-6!qmȿ|wiMg%}^ܼnWΜtjI2.K~H} {P ]}[j**jU)jZzOr>вU* ~'FSzػ^r=iUa5cz|\4S`xX$fFl]ɘiǰ`КA80mRIm^u$[' b7zv-ޕ>އo^c<ُjn“{:2V3EQ݊YkIOyOz/x1w8#r񽥖m<Ah<{ /4ɳ9ij780sT 󌳟b8(i|YJ;?B/U\;$IdQg'l9\[,t&aW*8B (AgCrdMY0{΢y\4)[㶳4>g3E ! j1A)ux%V"$ջeZ]nFl51NQ#1"(1ioЄrԬkHT@.w E^Q_ӈ t'[jh %o*q64"mv+6]C=DŽf{ >kd!$W0fqjÉޏuW$l6QzOG3Z1@% 4*ݍ QS RΫ$MCBᘦKGQ:KV|Bj{0v&F2wԇ/ǃɃ2_/IKo9LIfh9g_)%̈gŠg? ðr0s4,ҩ$H 164%,fI cTJ9g|]ja> (%*3y! 4tZ$\FcQ~&3? &{6ýZ4>(9'44b.BOXEl9V ?eʹ]f~F>k<ūGDb}7!%Fq.GZ,u{mL3ہͶV0I g`4͠E q/_&LIqǟ Zr5ĵ J+"oqlY@1BNӜ1 \?ԷqۘڏǑb5?[tlw8s 3p[4A16l)Ș^)-iKѽ #`V_v(ccrq?Acy>uIJ!9(QV5x3~'^;BI8isk/ig2N8ع qמŽϘJ8OUh~,~6iE0gih:.JgȾ=HR 4`?.S=L=YNS./]Τiڝ_MZ1*!^U[L@=c 4}]V)Ҫ~+7Y A[y5wdx!7gquGnB'dR-9@L2Goqhmיq =f8v+wɇYk BoV uJ&Vsyw s$PMżԐڷkl`J/?`tC4o>q_ѷW5' (66#Ϭf`r96N$ץ (}FDyZә_bY,f_82f{]51a- -7HϼiG$Ə_Szu<)YZgw͹I22'qE υ*I)j~d'/z /r[O\p^y;_8t22 G9?QFk|f5 q&Փ󁴫pő9#fN_4cE"t%>{6Y1V.BWbfͭ:^:x1Wvy̴Pr[+QКᛄ|'t_1ώƁF+ҔI yWx~B(bѻ^=d"m`xOTX6Jlўz2zs¯eֽ~gy0݊Ez f'^?3G}TW ;$|A XY>3]W)jYkPJ52ȑrJ|So8^WV+S1_@nt& |?>e##;e 9K1vC'{6L3I.ĦggΝ;1IF,R3owGX\F5U4pL_F2imD9k9Fxe?-# i? MdUJD-%}ⳆZ4}Υ ]ם?r|l@+"˸u"fPb ;h5aG fmB%'d E`lI+ 1+L1iΡKdׅBywyut$8^V=j ZL>5Ik%_<:.:6-ne..4GI"M]z*fsCǁć5F-Ԫ,-ص^v귔4'q9=_F4>SZ(:scCIEq{ *uc"R?BKFm%+ˡsPR Kz)o@t8.n/C*H}wv\|ps:<}^xaې`{|JT \^ދjT\5,Ә;U.N+iufruPN*#U1]=dQXT)E֊bT(*:caӝ%a5,EMß}Y /rxbۃg5h\1AЧ% dkM8v >Fa~Y'?HQ@n6JwMvWӿ t(^lR7[1v/b@HJ,o>19Aw 8q=rɁf 8gZ^8ۨZk [݈3& )`9A4Gg$]pْ{6+eQ)a7`rʙyKeYas4 r?"Ku31q3{Fz `ZCzUwuzߎS{pͺc9}פM~ ? r948gӟ R~\!R LR~-9g2ALC)SyPX̕\KqLL:NJ)N2rL;R\Z*|i VU1aP9+Ã%/$MXrQRoXXG]a⠻ Gtyǂг^++r_~0M dcz[*u_\/k*ZQq[.6O˴摆k}{\a>`}ˋ.(#HQCmguڙď;IJ{0q@v83݁!G !ü3*jeͶh80sI6gGZnC^߄y"c^ݭ02Yc^>Jwd7ښ|"m{SǰA=cgS/ _pp3.t`}j(Ν5[@g9E#I&f\(E@K|X"f1棨TyEĺL+ꮉ\,b*Nf2~OPjEA=]`_?e^W,R%CQT>t Eg̻ Ȧ &4Z_~zrӳwT{8ϦN^ FynWGvWLe4{zWYZ@z;wLINfz'm>,`aDSW||IÒ)}ArF?3ȩtκXMH`m B|J sDA? %7HoR)IY݄Wpg'E>ML 6=ٮ<3bV¡RkՇ/ayVZF$ eW8 v/Vh1M#N#k3P"gP̵ *իA DZߌnFׅ?![>*xN0ԨR$H_vSA 9Ϛ;֙A~vq,{PՐg됖wTTLUzVgPBM9ED*晃 ig\r\46`<.ׅb1d 25Z9WT\+6ԁΏi>wh<hMW+FͲmyXBر3w8:#W`ewqY ?M)[.xef_=>8,۞=.{g(&̫hm0SU@5o= [+jJZj9]'–G]Zd %d?1TÌ y:ļ=]:}_0gf`/<="kDCO{d(uԘڳE]E%^~HF>*iB/Sb i:u(^|91!.o8qr=X[14.e3z\I_ _fMNP_*IKϢZϝ hw8jMBMC__A*t&0H$$p),WRJ~*^ɤt5S)+e!~"ڵe2\^^ DrN6rC Q"r<2:v6ެ 4Z@0} ~43@g-e6u^m_#LX.:@%s!8]Iη> ]qPY e6P0ōN1迗 _O# WBr わ8rC@z51h]f&o>@YRg}6 E.c,$Sm2!VI_y<~Ӝ1k_E1rbޝA?u ZZdeyK0 -W?/rSMS^E o{oySZ*iLO% ݠ:>6!%xvGޛeVݩ`y_9S4ɲ/t) =u CKTJ Wz*:gss/V}?] t*^].v$j1|^V:%{PJ%jk ޺+ KU*R -yo?w"pBPT< G E Zp05۵mJ#+09+&p*<|.ӿzŻtS[)3e{ :++ܼR`z<:ހSޅH6'+5dN+vM3U( YwkH&As6[HkK$ŨV>{t#jMVCZ=p3|dO(q gz/sNNN91{=iH9*9;jF®0?CqkvdIs܍ *!9cnu!D6\E? җ_z{9HcD@կϺXZ`BCfxA-UpmMR“tɘ(!s w3B#S]ք3jmF8DL^g*/ܧ"3C ΁' Åȳhw>٣ ka|h}oUv?F% 0Tw-'6RѧbṂ5J9pn-&h/+Gs7)6w%kiLe>{*\/~ԍ+~sf2oYN3o)5,x8uKM?ţj%Kf3t\,3J@N#E/c=^䩌0-r Z puX>`Io%G},.,wTm8;e-8Hm8_oQ?*7gր¡}i5.E(j֦5WoЧuz 9nSpŜۃ3lOK1D \ހB$?UV0x:^|@>(gM(٧C"K}N~NA~41i-Fī6Q)H%K;t z e\O:z5uE5VFaԧf=ES 2`y|,^编vf3o.N<#mb69❿S~~[4|94fb1^cnJ $ɞ[\ȢbWE> c[W8oɃr9+ɕ ]N`u߃ޣ^PrYMFdx8j8XDc,jLn6)RqFD 5h@gx1v32R.^Eo74da (?s/쪛6VN6yyb4iuG^-x*fMqN̞>=cLl{ wlb w*b!A4mj9łQ(Bgʑq VLh!|%*RJALKн2 (D!GA5㚑Q tFاsY# fk5gE3%xI;qѾ%ĢZV WֺZW6֬Dݎo0/4]>*>p<&o'UU".+mf }FukjV摟+6w•dKjsJ"@|;>P2@ܟ Vyrd++ٷW{/Nuxx6_d8UZݥiUCd.p2H-Ղ*гY@vkc!KU;*Sq0NpmQD  2a^b,uAvͰò& l׉`^R)jk՟ѱ\UoA!/#4-w_{w\l87x7j=N rNvcNmL+/~RZN{D$0%ޤy͒ 4t|ȴf q^texrȧfD#PIQ܋@#̖% Rsǯ:ehܡ #{TR^6["cY7 2r\gz)W*Vg$i?"s (GUB@䓸55IԛMBw: [V;GTJg7p#[Zi<&Rm8oچ۟ңQ}5Vذ$;p&-H_ۢӂX"MdP[=ZScϚA䒀""C/@Ql4ʪ{lioC^b+6W .ی}~ǻ %ޯyʥ&#xk)%h'Oou^В&(|5:mu2da̷PS~3E؝zT@>.1%v#i1>thѾ7r!U>UP|-ɛNkFS0K09hzp̍jS1Gw?f#Y?92Z߀8w=>)o}_ S7]jGx?f;>k(c^}?Mdbrs3⧎ZW)fj} gks%4o'ca3j{LCK4eӍ,7Cxa57 &39h>YwGqwmx^~@_o1_ ft(2C+_'M1_qW!1GEy~m54'PA=?(}RޅށQ[v-xP 9󗞹]dNO׺-}sv_08?kѼa󔱸67 x8->+MӖo{Ŵqaw΢bǾ_*4U( +a٬7ҴԊywT\<^p\*~X-JBJYO|IAoeFh6I#mf3 +AZkֳ`:jqëVѨNn{fϟ;tYKg-_8D-9wx~>7!yn6]^s' 5n ʄZeSnxŶ? װ`8%Linv)hju^?oI2=}!>x%1!mudmgK{OsH5[~|up/dƊSy>)ܶ{K_qf\(axk5Gi*ٷbTWҰZβz%WV75jQWJѨTͤ 8YZN[Aˆ}VTRPpw=K'd >[m..}/[{[J]:|;kL]Agw n+Q-\)"? {ђvg<5߫`OCr1uv$X>?`xIC`lqsn%'>U5nǙlMzwI(n۩#V k4 QL#zWbx 2Œz }1,UxSgn ϣݠ3*ü3zjBb|F)cz^p?4F5zws 7މ;p^Z jWHq<͉iJ.ya=֣K}mz*do|9;d/^x9 NΘ6m9 Ҋ0\$|hZ+[^wrYkzFVO˸%V6eCx3k4 k`sX8 *Aw\qZ5gb,bZXOG$ФDtkΔAf/0Fx32n]$&ݸ1?g`nsuvБ ջ108=-c-~z,o$V<#؃bѲ^ < &o<㕅6͠xuha@1qLBe {G;퀳[X}Q'i7Rߠ <Fݫm6۳F-˙$\tO5Qyx; xhyXFlubO>G jO;_)iEQr9ibTQ.K8N#/p,Ӱ}/A|7 *|ײ/;́"7[YfiIP|3({i שt.=wѥs.;k@'עx@Sl_/ۥ ޑ9Gu<#:vL['bdvpJ%|_߁>ߏ߫z[?X4T{y(jK΢ke=l3ROhAnSN&0*ỳ5NOvlLKpĞ[v0KZAvq| ;r}>)1oe+ d8;qqe-6ja0`Omt”ȫx~{z3a^sg׷d?"uo75LLϛj}%о=C7=@29+{V⼽~7U/ů'/2ux1[|-/^'uqܜv)L?֧eWBo+zhlnhyUZ9xh^Pͷm =uSl`͒Q5+<2:qG6uh&/`_'Ŝ ܊nħ{1R1DR3Wa}xn{`=ܹbs_Py>$Wc,kVPZiMW8mi>]QZڬ؜?8J/r hM[ѬLJY@a0Zl!F5,rZCCa?8Ye ^1͚~2/>_2|v\O\6;Z"{}H;@v4nH/==OjXٖۚpE<*X zEsjwYV,`0-eis;Oh%8%c/3d{1ցY{"sX#v u7ľyF;T=$\Tߣs[E7 <v<)9~BO|'nXƘlJ1\%S z#|oQ`hf]ӭwTJ%\w럮c-q4<kWp?(<W'u. C=V2X"c?eF+@:i~ _<+gAV$%TyxlDn1C ]7x-ݸYг ~#ktb-r6%x{>o- <#9t=ڍ=䇽>!!&6 Rm#U<8Y(5V]oudb`;Vs՗u(eR`Hc_y|_E}ӣH>Iz!?%=L6Q~ttwyXMJN AgnǨu౤yqV6Ƃ&mzr*Ht-N^?{Ej'K_=Xfԩg\xAI((ޖzkA1 %)ԡ_ b2(F\Y&R-xIR+F JAO[X ,/B& -h|+F?r&8]^0|u κ3Л4(eb#J&&-$Q& v iAJgK'z.ۏoĠ>V y7Y3Aa;pnɷqُmJUM+-U~NQ#QH`moJ\@Ld1.7?*1FQhKl\o/2gBQ栙ox4ޛb[n >[. R2d6^C(Cs-׈mλǿB8{ݮu['v>9sF|}"o0f\}u?uuo錃{!f ԰Pj3V:;$N}m<փoaz[}tҟB)pi$myH|xYi?qT}۾}}{Rj2EHIZ,R%brKvUa),E~B?H;Ж$p4M@[Cƹ΢JD-H)]~oM%Fӏ%Fj6!V&l:ajItSRiV }n\u?b^`%@gՖZazc@pr9Y3Gc_m2xgAf Җ9 Ք A˘|E?ڿfJ6 u3+ ڳF!e~nfҀG(}>rEޘ-x C)+)`$ߍIê8}67!ʳm{-~xN^> c\N#_S pANZ;1!3>~diT']rw?:o:B\_8hs'VlEd\ðL4KN̻=Ok\ ?H"^ȲR`aWϕAӴZYRe_Qh`]Fo YV-TiMݤZ6cs=g,;n7m2[%jj.; : >` ugmuw'pSp$VyV.NodطBjD'xf`Ez %g#B OPҀœ4}LͫW~g[a35rW=mf):s>l=&=*-oi7֐q̕.vZO)܀O4$yaU3fA]"ӻvAt`ad_º,j$VC!)ޠWۀDCZqa`^鑚WpOߠ#|ۜg(^ DO?z3 9ZwNtd$nBOssmIVߕU8cjo&zR>P-I5 93_G욏֑& _p^NxK j1r% sޕxgun39"/_&U..٧k[K;l[z9Y!iuLl>6V?"wLJ1R+wg:NЮ%I5?\RF.NE/``>Iyf!﷞l:(J(X`.W*,_=Y40(T &*Klh[̕}@_O(,9T J-Vڟ`-rv-{~ː$ņ7bԻܼLSЃ樻cv %Y 6bD V-;S |R¯y8~0c^R7{tN7 p X~CGzDOj'Gpn>|pCJ`;6Ft2GJ0Eڋ2/^m] "ζο AL(OjN%4x/˻#1j_M>ԛMv7רdȽ;:2$ I6RYec(fՅ?Iy@A[q$W50|"_:Ép…/~FJ4t#b=n6ZI:0ҸXs "FJmd1E:Ɂ}72Z`, z.M16fJ&-G΀xIy&NylWPWYs#ݸ܇dRW35m V (2>Od/}8U+dъ#W0'vHS=Ԫ^q̇E`491^"UcWٯ/+nRi/:Pom+G%j_t+zwo J||]3 vֵQˍE#ރ5AN#']8V*a-ʓn،qr^]Cx"c}BZ*ע׫s /BVZTwgENgf72ga;YsX*1+<`*#=K.9‡UZM#}8R_F\/Djů Nv"h@iMy ~}  r|к%GrjQ7h=װ0δ1ďw u<,v>5}iǍǩ |K'J꬯ T)t~ j^Ps{c0ח2NG69(>iܗGS7A)Z5y,dg&yg9כ1Þvt RuY^-[)mN2껍4rzGIbj؆^kQ:cciu/ ga ;8b&L}?͸ ٘:t}+2ٶK3v_tp.7 hx3HB?OJO\4Z(jՆ7v_Ո!RNgD@$yBO2xrE߯JiL|*8n{'I_e`Xu>6?#C=xlɽ7Ng̍+fGĶ݆Qzb`k\q̍Lg<0o.Գ~KQ3)#m v _ixeUN|ވv3no, %]j0a}j@i$;ڛyospZFNXk^4DԻjFb`-kب{Oyw5t,5LJے^܏R7^9"^REn}ӦJ2[^ڥgPo^旴> 0ƞ_tۯ\"Zn/3?rzQճzc0VR4(P,jZOꍸ^.,JYZo4*4,m@☂I!MAÄ.>ѫ&QHRKI,(ìd2o N6mP.k#Us[΍Z g7OنtdN7iCwmmN&H.: ?ɜfmy* ?{!?#Feܘ!AtWqꬣ%&w{ǁëx?\eU?|0ڠ}9 8߰>v}wsy?jH9 ]~y|=,P,cwkخ^>a3I_ZqظcEGwzNgZ#ƒjI@Xwn0zjm7b?9j-rZvʗq]mV#5܍*SBVz_R{L%lV_ ~Ȣh n0~|`*:6I8I7(%qag S'gQPPk(hz0UJE@%'ս|z}Z)l )oAHYŠ~!"}NcE9ۚ@Ѧhs7Bu4Wz@ C!f >RTˤ?xKNV@C|L&6#e&ZUP#*I@W6LM|]RR]5L^Q?8iQ )Ww/pw`oV&H? 9q fa@wقs:ceoq_{#jv7LlhZ<]V4iAńԠK龟a9oS{"jeX*ygMƅ"}whb0XXiOؚٞ'Wuow45:T~F7Zخحv4} />eZ;&:qpzh)(a<~{s$d;3ɓJ8w {{qNwk[0kEGq?T?X {<[z8 .iys6Q VtdB@߽kbRzB۶dZvi\MEvRys=$71S1FF|c8D/sF5k>'>"E>ϸDvшVeQqD.\*7+agAtPqZ#Kz3mfiO_pcZ(u_=rH6)qd^"޽<\=.HKM] sn\7P~zqzvE3cz' g>t#:@Nأ=mqGIPA"M٤pLiGTcV9MU4 Erriߡ@vzlf]HY;ɬ&]kȷ5EFE2GhCZg(4RLuN; h.#wA[i۽Up}}7bGn= 'C?tUܥ]|g*e] ydeǝ-au0_$-$n,3Qd F#wnAcW L<⍄=fHXyْlZcc۝jq(L1ȣ;`/g0]\YdsnV|5.~|\.9+0,U\rS69X-^]UFmq<+s;6@~ ?FQlM._^sUrݫ׸kpI>Yuxysfz;5Ӎ;. v#iZ KVWƗ|4 b' 7)HC(60쵞IT);D)xJ%u@>44GCҰN_=\xft]Aj!eZi>01 XJUZ@Fdr۴{pY̦a>E`Zv%;:|g/̾gz܁4%/(q{4^hHiZvQ/@`:osSL8)`L!0rIѭ{z<Рtz۪T׷;L x 0qw7=kO&z`]=w{+s^)3*%Oc*n<r+"Cl%xf.PC UVj8+Ԏ&UJp~%̾O`4ӸCo2yzdgAΏuW1NeQnU-Ӏ."0=fywgZF(yKd0rmu9Ui>ϗr ITbˏ~!)vn`.(x*PnFPZsxY Ƚ-϶ `v^="HHl[s YںGыN#2T,8Pz3zJ SSTKUЬkWF4GՂe8B'o;4E4@}Xv,r-[V4ȟ_N*z"g:n1Ļ( 8:AI@/|IMzaVjݷpH2fbyVѻ+BL0>䔍Da?aDw+Zw.qG#.qHG=g#:Ywv)Jw c~piU~qΎL>o|suiu(MABEtfZYBx]PXXk6B,ͤDC$iYLuCe6ȦTRA4j2ϓg#ӕo\j#y>3(&J2eIۤ~1wgl"Q8?uؠ;Y6&޵ ]\7E>EO{P/:XD[}K{k>^-J0eBـAH d"Y1prLjpt&zXP#?d_Rűȼ q]S~oPF3Kfǜ(vLݣb"u}ӻXLx~]SZ3K2|&n=ܼ)+zj0zƭD}y/;8x /˧5Oq7P;<+>/"Ϟ?zL y9]'y9=z<[i< 3e a268ᦍZZ*̭[b$rP`eȮ$f\S|&ޭ5mk!M. G[}܇e}Y_yHg(#F>g8p@ `ܰ"StY>&4-/i& 9v,|ZM651Wq|ƪD Gݣ5Fj_7O{R77β(6 V5(DǀypF$k]m(1Tu!jװ}{(y/Fkτ2U^sLΙ<U#%θ(Mke( 3q:ot݄9g{Blwk Y9A)-KqfvQYԛ_ )$ Z|c`2$Oq. KQ1FSe DeEi5<>Ǥd:S;? 6~1k!}2݌=dp '?}ν(b(dYW 65:'í6Yܟ!͹Oȭ ^ ;(>+oSM`m\4ʳ56+W%y0PrZ+I}8p P4 '̈J 0$A7} ) &@?gx#1BDYQS^xDf=ͺdfn^ c̣s gm4w/z ^~`OZʛTpI؆/^8 s=79LFlǂKŷ}ӵn/w $Lz8ڸ'LqU;}a(1db:#rXM*$P营|+^RV(dg5It*3lx/Tn*V~@gKx\놓UkTR$Gh~Huu#qۧ! ;7V۶4C2Y뜺’V@WmjuWۤc6b1yͯU-o3 8 lmn1d#orcӪml[S/67ZfM&6K<~g6T<̛=n&ݮgl 0z3?ow [zhwy =8R{g8n*8;[Ȑܴb* |m^| ^s/Io&{6)^df\܍k?足Y>"26Ä̝ ?f[V!$챢r "#KE1j@Ƨ'ZMR[**Q?IP[_Pʙ0)VʵVO#w3n >Ҭ3T[mhUlޓ6;r[ҭAez2ݨ&<꒪*8 ,eѾl_.26ŸyH5mg'KV۬rxV̫DSI_Z?LQF'ރX;^'PpL>WBaBu@5QTV)li[?-4bcZH$n"#fꁣvWf7xvu%82A [ oZ6ʄmn%6w0=ݻ=.ebʘ9o qccEPSHH毑?}b1Fx@iߋc.aEgN^N 23|!0LT+q1X5#V4 h!RX(QFQo6 V$a +VefiDI9a F3јħMFo c<) *FCr}d`9lڢ ܆ f(lsܘ` >^j7k%ѾoTHGqW;ު#M|ڣ^g{<<#'G1u'^*txꝲZ`2n 1uG)Tc>:2kFYs*g}u8s(`E$IԭzX¯:[\7(d 0Wb-_:Dm*՚N7S~& KvW=\Ƞró+P4<Ŭ۵f>lrzA:f){\g\4TrW&f̓;u}kQSBC:0qV u} .mwni/QTYϦُqV ڋ<' ZP|H]->`GhWHQ\ DXky-_欵H)Y!*aR ,d4ø)ç[ έo̙hL:kGϙw8  S6y6`Fr!Y+G q0a;"--6_:g2 Z}_,eZKort~6&M.U$q{=jaEfkZz.o[x@ONqMRT4^|OjUEcn|xy]ܾf)!1afwɯ4W:ZPRй1olYy쵛*!Ųt\1iTQJo{v/꫌]܍qik797{o#zTQ]Tg"OF14#K)_degeU|zV97z2_~zm-/n8*$g={x!mF gS:wCSXȾTOV$ebr*^*bkiѭNi ^s\R,Ձ#ŠT%?*'_*п1 Y@]Ej'?P2Iwg ]䇍职}=4t6Ԟ`tݜ٣KgRuL̿E_iOJZ<f- ](EPFDk>W6d3óyV&n="u{4^=zE$nǤ$3B M_IOU 0-6=@ҭd;R2 Sf P̔Z qK~Տ"ZWvvisZ qg:9o43l2YMlwIsB(H+ƾ`>KJ+ŊYnb~ћ/}hFn} [h- PYY\o363N[ñ̀}*x=v($k?эfR͘ŷ6<{+g^`ѼaA:-P;LU1ui&F\5N%ja>Jr(n#8.Z8>WȀR[C-Zf'YzjdAj&Td HUlԢ2 k)~ܺ'6ʲ _b+3Ovwtr̅S[a?EH_YrY Ge,As?x Wd{UpzuK< ُR.?!M2t]LBu)TWǼ~͗Ve%hBgi_97nEfos5F /w v{%LT u;AKOmR]N6[6:Rwy]U9Fŕ~f%MlM6ggS4f"(cy N*?ك7+zԨr³ KΘRo p=yg]`uHBE%lA!hhBz\OIܫO$VivXnr(o+8'JQlu_1DqO r$(M0$m[*lĐ)Ar5֣m~=ch"M9[f oe5IխP)N! Omkԛ>Fp)M3CVHֆ]Z"@٧k(ֽP\?ƎSS"8Z+)LjuĖ=ben71fyT+AkE*2 A郞QhĚ #L Wz "I&W_q*rˋ$茇$upY)@ 3PE;AFILǤTͥ B(m.yr-KX 1׫f3 Q&D4}Tܿ-n#֨ΉP{?cո\18&íޭ{TpI5Q7׎gv)*;Z+P"Q&ԘjS UVڹǣ!$*Z 7*/]Ҋ'Wsʡ ڇ\%ɿkEd2o.Կn^T|;ѷklVnUV!=i㇧keI6؅tou\܁z"RQgSsz<g9,2VY*$FbͰV$ yðT(壠*Kj0iԕy$˽9Ĕ E~ P$妕1lCryLs /, B~ x]"LBk mX9 ;&@owy$Ac80$YZ)y ?&y4ɅԘ7/Xu^8c~z#/. L"c͡S G s{8ٳfvOe@]r4<Ѹ(wFɫDn_{VOLӭ 6{.JI%EXV>]]Ԑ,ʌi$IXq> I$ ,*h6J& A)Ag '2 s ԇh=t J~N7;V 5̆')N@amR,P.!}`^3XoTEj ߕm$ę^Q Gc.ҢX>׉b25d5[ c=hٻ{@&blVIbgR})墤>;!kf ( ˽k+772u&t3J~fT! DG8G@d.ۼ:[̝d[l(:,i>,y (Ȝ|fQY;jͅ^0矜c$Y@3g]2̛aL.O4cœ sI 2{9=_}ݙǼ*68SBU~sZRٝBf9dl}g~Smpԋ(qT l:,L&7b͛Q&׳MG`Zٟu?Aokfx˛#ZذWy@X:yLȺzA73R^,On'1k9|]Sݛ=ЂP#e嘚O8KcK~m8;ϝf7W ^|"gdY1~L4J Sʵd(Z$Svxj@ u*F%zX>fI^?$i\Z%EvDE%dIi׃OLRI$,3_R9U}sΓ44K}V6S@wey$%nXZHq v%0GɫIxsMX]!15)0l&0J8r3zf@m#Yismiw.'voޗGnw+ULSݫlR6{tXSVsuY#C}'Z@ńN1JR>ީl̏z|젴ݮ:v1.{Կ68{{א!md{;ma =ǽS#r-z;b~ %r*[֞K {AYrϜbdnV:sd,j+IҔ[dΥ1Ͱ ~T2q:06(tTUdBחF}ΚUu(gAOXfY5'JvپVӇR`ɿwXBԪȜ)[YK1t|-/a+54b&2 *! MEQ 'N 6n.icT#2$k}NQ£N V uD>JGl@M.m{pgq*8eB]ZvR8{gy5C'η_b3dqM81+# *}ZC )ʤE =Nea8$5آ8szuK &[F}Z 癜o^%(['mR *_޽]1@:p3f e>FB9F2}+.Md;{a|8݅Ō9/e簪gc?ՄߓJnVn_?ѢeP_g;.+]Wl^BnY[7ΌΛRFL9z5gO9=E DQQrF1]o1KbfƝAX)=M"P-Ҋ§,$Ivu'A[gVxUb֓2S&i^.b,8Cʪ1f כ ܅K\ ,M#nrB'} ? 0hGdxpyTlJ  >+w߂c6O%*\ȶovkj"|Y^UYOSzt0*rnqC(BE#+{MMHl)Կ>c&UkbA﷣H+o7֯o? JZ'nʐf9.LY>O(Ծ_ZܜҞD 6-vޓq uSk91Z3ɇs(KrȺ7̐Z?Ify=?)*arcf$n^NvD/\EyВBC/Xy%z]]: @BB3AsH(Kk{e,ۢr"@J$*,YzZdok;C!{NUnu1`y'3 Y}ɜ]2g…؛]u1˗/]ںkv=,}3*KW._Z.Z˗͚1cw#VxakݳkkY.gY+=[i-}`zt\)J>(Vո^:BX`+sLl!UBXQIkLaT IQTr\&+0 0l6GfDps8(b٨oZΣgoYpyc+.[`rd}Պ-#5+#7n;.4\=ٽtoشv:˶,[FoBE1{:j}{Li5[\cRH\mَ^&R.]a6)[ezpNy'97xϚq9ٍw>lӯךއsYoi`O;&m.E݋Z2+ptXn]j]7?h>; u݀ ߍX/ܫu(ue)فZ۔Pl"?F9b_0k7ݬG=DfPU |tWȉu(ଣ&Ʊȩe8?#F5rsf 5;by\WfW4,.QnB.]﨎q2{̕w">+YC&"24/l'''ݸ{<~/{ɜGVs,_< *=`{Xv7eW8 H} ZEB)<֒Zn>Z1* B=fz Hr\ Vt[_m 4͑VnQ9(lZq eB\.Hnh4Zo{us.bsڴv2Aj>uz 1 6 I]&?Eg_ 51{9˝ۀ_;=r@nԏ2 z- ?k#XujF6H[ G^o?B L[ƗQq`:7~.þ˵D:z?#A)-qZb?`ܔ͕>31;qPmUޗ8!m ʼ.Eʽ][oPwX܀jہQ>fpƏPܜ-2/F ڙ5؆oJzh 9jkp8~dM6f4eq%.l?>Y=Hp 9n7~=k٬W߳l==˗wHӨ<|F^v5 ZmR)A B@F6VҨWkv/ ,Qȝѹt^)T*R.p"(%ȣ4P*1 !Qk$դT*%FqɭjăQ* L Drl.=kN)q`PqDcp|QL]2a`Zs̸=8´)Var%&eUvFvM3a3q.*6tc8BT~j7s? ( =J{># mffChm5*8c8v#ٵ9SSݿmt{WہQ^?Dy T̾YrDw[֪܆ilnC_Ы5 %etBt%կT.YԱ wn9/;Ї;QFZ3s{gG6NQ]!(r݇8^Y˲^m@w"U )s(g%ҭ4S.H۞iONE!_U=gb?*QZr9 $#ؚ#Vah60 phi<DlP,];TS.ǔr#wR7QRFau8 bH #pF2o=Iow]S&N @¨Jy`0nN8i,qO{1ҬFqx6*GYFO4ڴWXo8z:, @$vax~3bE ̪.7Xf9ds #5  q-V,J%W(z*$Ő˧!+jXi6X.WLwC QX̑uDE A|(ĵ$$Qy@`.z9 zOFjhZQ̭ b,歘tecbyX~)X 8aʡG;| >l{DI+g(9lN/ kVo~junY|ϘGmJ%[Ӳȿh0ix'$Eh+ns.çnԈCߵ_esFCv%% i.i>k~8Y 3n.Uh}b.VR✟G{5TMՔ=o϶^_A:נfо<[mѷ*R&fa)_7;5eQl#H\qD4zkdPTۑJZN̏F_pϿ'b  Xd[<{LcWSv~2=+p}gXZP0-djͤJbĭ b@ s'@xP$*p>@9R*j@xV+sʵB%A(N `%A!й է@c)2M [SUCRo$1` 8m3D[tyR-f2Q fmڗ<!4`;K=35&SY2gt7r6QLuTԆaWR{FɯP;G|_(7mV=Nҽhw]|! |B}):7YdE:mBO3=(͸ EF: ϛw؊Zk6Y tyIUZkテq | eͶ$~?1N;/nО[ ``ޢ~|q~"3sz_4g!kJX`<$]\]k2SƯr8ϼV6>v vB(#_mS} @sKh_enSO#-;(AM ^Q&PS"2>$%(z}c͇p!˘)Pzx\ i-n'FO q'ŇtTN(5;p(+m^b{ΘDYl:{ K:CF{=h VN:"Fak>;t|F59ރ_^Q|SZ_GVK2r+"ӥe_kY{C)t0AnK>?8S =wz܅Kl3ҝ )s5lWv6s҂<Hz\D j$҈#-`kV+WeVmn7Ff a\.0̠H1.Q)H=h|y =gՌ3]@?8BPbݛ%JQ jZ ď/!qO7(h/qb2K7|f։ hϬݚV vY3ZQ3,E;,H^3KۯCޏ3?mC n##X7O#Tو;Miz R$ƋNonP6LGn!dκ-6Ԅuz-eP+|}*ip?GMUԛqn.,ǓL W._ӺF\uJUQӶmN;pHwzL=2VY ̕}ȗ ﶿ87=Y=h/"`ݭG=P_;Y)r s@zpN9 Z.=Rm(DeEQ@&"z@9IRDyIAɔͤ3uC850Du 4`Gr% ԅ0BZG1rZ}'ycG.8kĦ; 67'NnfzdȥpEDh6F#%8X3kNBGͯNlԭJHHCeH9(mZʼ:S{^*<5;|E{INx%֬j@P!Z+82jn:(547_ tuGc5w^ I$L"}Gz]= A~C'[T^Yq/#i*Pɑ)/UkvY:jLǷKseHyK/x>sjH} g^AuA"`E!=SK=^0ܢsxnS˱wHyz"b;u::z?{.twS,4 ̕+5\K4&J倳%z㓠mոJ;.6BvTI.H|SAuڨBPS͹\rJZIi5 ) RiIn6Ψ|} *SntD$/ mI)K6!7S'/Rt40U9J3f5"ilk۵j~4c~4^N5Vr+$he;=@^YϢ JѻB㸯ڣv!#cGjPD \fhQ{֧mTL# ݤYj_6ik^ohN8-Y_p1/o6{LR PR{:^h ý0>RRפ":- wg][UpFiD\^d ݋QZ^x~d8Ul:Ff%h$JQT zR/K 1F7 TBYkQ'ҵZ0NB :AX+ja.l)ǵF,/M8&1=)reQ[K:ѼC$>Ck8s<,ou:@ǡ젅G`[<96R-cVi|RCc #%01TFٌBoӌ0,THcGPeEӷeBYt0|1A1;hoKfx e';8pZPgV Q!G1k>kPN&BL|,xIݧ9wg^9"s&ka2R.:@@д;|P|T;n&T*T6 \d]p[a[[GZ vCR! xG\Ltr .]=~i6iޑXUWaCt48VHac{7 >);Y6{{}Ax/C.}Ɖi1L1= ŧ`U,ՎInƽV۸>.T˶w]ma DžOtyn#іFΖ[P[gHi9FZv?{rLU} ۽3ke=ɈΒ&л=A= A0뿌2y<3\෕u;  h]ݫ0dXp4/ yD{s fOο^qRCfejɼG_epjڝ_:KfA]hVz\a~3@+/3S{ c+ M)ϿWjNAGp.v\ n`P &j EW1xϻwey̙7g\3"}gc:(WQ &;IIa\'RcR+@ibf ARKz,HYR74(yK݌+q9*AzL9=1:Vj9۳\HN(m&0FRR!Rvys~E 4v݂~i6O6&9Rl5t{iJ;f7.1"B :{=kڌO('gS Û_ N3lP6, ^ޖ!r]peWy}%P;bGJL q>l*բGu[#?Dvt׭ =)H9 z2(isX:'Xsj$q=.ˆ0>Ow:ޱ2z̼)];cz]_e3~v\ZÚ~>g~@ `L^ ,k(Re;7>-K~N~D]V^ahؖ'@1fF_۽^(/B4$Kܰ JW@yǕMTϻd_I$~;Z i]f}7XM]H(^qpKA?0ԫx<৆o`UwK׽ţ/=;p'w_n;%srOe!:Q <$Iܬ7Z.Ky%ǖ4f4 ڶHݨ?Dm۵ Ήr<(1͕IՃ-f[f1/DRZGl8gcA~3x/ͽ{[mu4tL 9?nDQY՞"gK~lw0ۙvH}M/\[YYJ+mR aSI 3.M ރRj˚z~~;eMq3_6ևyxS#~fJQLLJا}z{:U}VfmblSGV]8lc}3&DNjq;Zd\K`[%eH$v6QK7$>f%>2XwF0~O[*:Zҧf 54-? 'Kҋө38BɔFk;n|합QspSDtLQvOf%eV[g9Z(َɲ +wAI}KPBy/]^q9y(5hhk'x-Jδa>&/nUZAr/ař$+c`".O(W.{| 0mògv« zw!H$An6)ոI'nK:=5BT;̯x"渮L;=4hnWѣT>/r|ӉP\0?o\Is0hvR@Qz3GtX fiZ-,bQbŢ<0e.!:Q3bR_1*+It1p;64q')"X YRqw6O Ȳ\*C>vf,xu7tȏE޿үN@¨ 3M{()1^78e(c}[ r+*m:G잛hG~M8kwʲ,waW<Ɨ+0fC10i"<4 'hf\5 c3bnG>_ou=p[`Wm}ǕK brq֟(tx`0k}Q+">`:i$c:Z+/9߾ruf"z8Mo/LQ|rW/&\ΧtkHu,YDgiTAQ3I5JH2o$7 .ESx:jUkոf7|Ԫ\XEЉύ ?jdfNf[ݖRPv*؇/zFMS6|:nR`3M5xDZ~-YVjNI6AN@#  u(x̝~ 23[i:Yy#W"q `3yVꮱY( T]פSdnY2 oN/wLDzLPϽ6GD 25Zb|7wZ)4i+*-N)m^yYHDZϘ҃罝g~h:1ww*~fnni.qLG;u0ql^[">/!=+>S._J ZF\6\$l$8(KNI☍L7ƀfv#uЀτdl8f2)HOBwӍ8i'S O+>At~N|HY$ r73EDK+qvףu)`5JE. U Е!8JJi'ln{L%Ծ TM(&^Nq ŏx rvӃ~F9Sw*xj»}KBxc+9OJ5SĹ:g,fƉc^܏}90(+nc_:}TYgc숈n]>qw ?Bil7` TĄͨi\$uQp%QC$}WvfUq.`yщؼ vs̡S󞭂݌&EZ@b#)ʍtQ/h:W"rVp^HmP+XA! q8Y,^aa1 Iw'1Ci1*DtBzWs= )BZFFϑL`Dq8᭣.Ai:>Jf.a8.-{}P/ v+n.= HWq.miR)C[,NHe~1I]`*&C!1`pb9Mr=`!(&L_ !6+(AY.5ÀsR3mԸi:Hés}f =ՠRQq~ڌX牉۸9M:Mi;0CНFl5VԐU;RW(*l6W+MG-ߪ⼒ w<þJaPv jJlS\v9s̝3:WK̝yf»:P1*/<(4٬&Q-@m-'7\9GY ]U(Ke)!YDVG!VAR҅Փȟ$U7)`^EVL%tGqN,Z%xbZiv;ݩn?; Oҫo}%zѝI]X we cX;NvQDdm.  råZ;%~I'P/)L-s}(_^iW4;:YdMG9- F0F8RKz|ۏ=)!?1Ԧmy;~JDŽR xc)oT8|?R~b^nz]j_ 'RDq/&Z75FJ}D{0LGьIIm;zpW K~A*KWH?2_TDyrFtDua>x"B_uFWs,܅&B1U9,ւuOU+e[>7raXWR rZH䍢dd|BY+\;3Lk0xi sԹx(e*I)!@5KCb :/wQqA{؊ysύpizx+l0@Kl"}_-ќnǝ5ɜ ɛJ 6dLă~TaMUy\:uvH-ѧ{ZN5?I(1G&wy`rKyfZ)Bcqq!QBmn)8g]۔iscf߹|A p,:V]|ahLst1_d8= s!2ljb SAJ5_|_õʙPfeuk<].#Z=B]Ƚȧ B@Ʌv:g(Z+Aoa"\]oTۥ1{?m4ՌYJ}>ݡ(#ƼZTN *r-e~2bCFmƃ] 'Z)ƉmQ{UWSvǸK!l^.aVIQKa.q4ƣ(IUBAr@L@ndݲ 0,VYQ):tXW8>F IqXq1S. P7E*qj-~i,x&|߮Eq D.!đMD7(nU[b9Oo+rWP2Y{4P^oב޹_m.R1$z\Ҭ\n;GKs,dyK]-OZX,\stJzTM7ϼ[bRe+1082B{y" U9(5&)gϦhVT|dd)j%tIN!=^4qXd;%^D$,s|=OUW 꿩u~qµ1>@#j2/,fW*OڴSHB)n8+?В*͋l#> VN%[ID^y͸lеH_9O}ͰCs.Xb^:g΀uE|6[$~tTtgJ h|6bjEQKA&Jp4@R\W[/b^[PK@F񲴴UoVZ.+)T15B4Q]qgCZxnϘ4i1%ճS@$巽g'n$al6Ez9d>|~e*$>ѴVigAe m_OttWP퀔KAp-8^d0FF䈟` 2% t#JY֡)ZQ_+K/'Vfxڱ+=e 7b?:%:LZΘc]VqŶ_ >.sr ;^~=JC,'E u LDP.5 K #^kvRdcWO`Қ2/]' ȩO$O>kҒy&:>k yH\qX?=/cӹs}ʴ?'Dxy=5 *Z4ӊHL8kqTgt|TsQzX*ek\E,jmdH7Fgq;i+juYi֌t '/C.Z1:*O HO )x)uѥƍ32\tt!|CC׭v8iq֝u-ڎ&w/Lf$ ?*as>pT/"I3/BL]Vt3ny6y lʖ+Vl׀ErzXoD_v%n b:>Z&(;]7ZMF I Uԋ`/hBF_~F|qy;EJfxJcy=e%%sIZg~"j.~2ޛ͊3?5 zpqEۿ -R2D$U[-ރ^inϒ?cGBt4֫"f3LCU5ߋCtCŚF1 _ɉ 1L;I-)<ۏLO3G9O闢GjWާRje-ӡ{|^3 }.Ol'7>ONc7i=Y9['caѹ8A/ȇM%ZFL 8Afȭ5H\.rC UIFFw&ΕH'`lэPrԌc} G0@Xc4ݛ<0;sa )ip.i}m;&tStwšLq]i| (.ic* |n[Sߙ+w RioaiѼ}eXr3LAӧdV)NMkՃCƈe:c*[^{W tRJ;1uaCy7#AyzlZVE 'e~+cD3/7HvjH%ss&ed'@^#~8mHyѹɉyumr+G9Pf3 yD`k0LiٳSyJ}nhUJ J˥*-d轃 ص.bm>8bXχqP@aPmCM( \ll$`DI=n#jeDP\3(%|9F眃|Ɍ"ۅ{oBHJ#9.[2v9vM{7uC-:gNWGv$ ‰epmlMrX,3aC:9=}ӽ~=ڧdސ]Sq:cdoR[uyʷqW Rrd d4ZN2;֍_tʥQsM"|o_$.=֥wP_c61 :s[AaxlȚӅ{wՇSgQ+~kњ/6 KiMlɫpp205E;Wʐ!: 1(OV/y]0`=gο7=r=)BRs T]MX C@x2bX(N/=cFf44,8}0L"~H GJX. @BTW)^F "*j4i]3||wP.J b`ф`˹9in<<G,ȝ^0.ф4ҏkakR8>VGH Etuy;dlהps@ٻ`x`'B3F#qq\mI}>NWfT[`/g.CSjf)RpI ЋU0N m|2_8_$σՆȩfvoCx3ؼẇ_R5{ LhRln-Ɵȭ7IwO8̧/yD~UgQt@=w-̛?||'y>iw fL#gO uQʰZ"+a v:ױ/!$kA.(rN+mҹE, hrW*Lq(PBK8'FH}B.C]r\67<?' ̄\JJBW)熇|zz襋捭X'GKNv ̉U YyS!t^f-C)2+BOZ/ {!j3E}"f0+KIo)r>aZŎZ;*DM 8l{Ar'5A9Bqү}QZnWpTÃ[57si3aVynіڈc ͖03v7}ȥ_nT:8`{U\Ͱ%w3,R>BlnlDKh4Ͽgf\3g/94L/uc 7vѢWc5Q2RHcjFX,7"Z4EfR&=v<ҠG>G(8 GZA JJ!ۅV|:٧ sqy4G$KgFE}Ҿu fDq 7g,e-0=\'3%23]_zY8Bnt Cg[C2LK4z"f/t#C^(zUr@7!$t?J0.rduq$}wz-g띕Lm[\)% ؊4/DKʲO/*'Ӟ&b-ұ69fQ׀k*I`mE<F1 prLE_S[sX?얡cݒC!1HP}O(ɪxm)eT!`U] ~I^rɦDnϧqLsf.'sT Hr1Ӟ~=!o!IJ6H*dp֌w2xP 1bgltS*f`Gtaجy {[dOw+:{ɹw>&˸nS1j\OI7(+iF*x$N9ơx/6IYu1E?۴aH^F\:;![/C5/Z=~$m7szDB \,ng03nIUYqvJa$-tHr&Iu8w J7B F>g+/$Qy=Q|"YH5I0uߜvv2[g47'7y?agFl˾^%%!zެ߉ft ː7b\a\L}Av>bx&M>4-^h:-hl?Klq\:VB쒞UrT\.4&Wi-הzPAMURQT!d!K}Tl70Ȗ8gjtOn T! =s93n6;Yad9K->k3۔@yB)mej }W#Do/l5N㵈1mu[GU !`@g Wjf3^!\8z}/p 5 bk*}:q *6eޚRl Y޳Rhn@.7KwL򋓗_ođOhHsa7c%Lj)neRHu)У;sJ&d>d<c巫o7_w^O:+14sc88t;2b6ٮaujJzB5 }m'|fwd@q}:~. ^/[V@bX,Z-Fr=@TʥriL*s5َVY!A"jTvkw:IZ=5Rl(Gv003Ff fϾ]kgǷ THfWgyvNn.Kܦc{Xw陬G#>e1-xxa<Eڃz3>R/f/#|Ԣ{E5]B/!A{+"*:).{ܟ}X5"!ɻdB{;S(toy5ufeO}][6coC_w*+.ژ}^]7Z8FƱY H5 w s<2sVa*lԂ׳{j2^Ʌe| +~y"L/wnk ).\=2k MMOp)r |ߗbȌR$ {1!~}{Vz="3\%ߗUs|6 ˹l@m kJ%2'jKjDeQ%0W3N-Tb$e\V.:>_{%R(#`>SyFA,];Mk'39)f6 -El}+|18n#tVX][18B2!@ Yn0(7 hIGiq _dx:xc?r)rvav!Yt`P] l?j%d[WC31xAsB^4p%e7(Uhc1]\f.;4|޴rbJ΂SjFFs?v݀iC#7cvu6^p:W޷z)lk66T]ދc< jrKr"Xq+{uQ޿ i_Ϭ=o/;:]Ƿw$n`Vӈ%glPq IJp5jR"9[ |T+*a1U*EGbW J1GRfn‹dS.LGMj^'o/FQ?(P-TjQh6NF.;zB77?Ȕ;ـ&̷u)@ߐǧ@pq$dRx݈4F$Tr_. Džòy^Ӳney-m)WoVB=Zv}># AҨsAsm0MxI{d{mEv'jw¸[9lGˮqD-m  ؿ |w29}h_nmqk_B7kebX[YFMTqaz;CvFh/дOGׂZ\!_мhIƑ7-mt` JFQ`F; jnPwG[pUq>9pw1~}W+[H#PF* fR͒;uRC'> E!C6!úݹ6 ި}>tm~DyFVNd'ZZsUqRcUI+Ek fVq;[z0Nfqwʢ]Հp5ݺޜ~~ϻt3[~T3^'A>@gʼn40-kd'A)?C`n׍ZB.DW#XI$W($*KQZeh/tê3|6HCĮ%k@/e 6FFI#r53a_r:EKƖ.:7J{)@8=QT DKkr1Ȱ.)h.`K f"̷~Y;{zsR gO(t?;k$h*J#) {Ubu*t;@,z~7uzD,eϨǮGH3lhOYby(eayJDix,BCW \Wy&|N^Uսޥ XARk5%j[[wKj%ox66K  $ ’$f l ~2Ofdf},BrE]{E^H1_WJy@@k=jllU,^~8ֺW a!* -_zk[ccZjk.ZiT ӴZ-{Z-U0[( |X*( j84 |I\A/JV^ƑrJZf6MS ܥF#n2AKZ^e|mvWP7l;Akx=vz2)Jo>|^mަ)j9}="ݲK#=D}Ït ~ kvZף̀](s=ѽy !<@9p&Rݮ n^1WN55Cj!p8D#,ףu;qj̳pH9222n ZEVZTݢ< Tb8RHܗ^JNQ=KRR/f0FFKy: 4̕|._(Dq>]kqIZK(rAYV7gIqVg/_+2EArE VB6Ľ8.q\)?J֏(s^x7D+eW_a+{>xn<4x& :!-~Lsܘ'q7@: |;>q6=\ <-9մͼ@z7-f{@∉Mɺ86!. `Yq9I' —#S$:lrpN}_g/ _:l]+/aRS5CC[Dwz!A2{/. #xPnl8X?!Ve4n5o1wkx7u}jg| Ic4NݧZނry'vHՎC{c h aߋ (Rxfx^|y.2k<{}aYaœsy$%4˵|6Iz3|r̻QcǛ{ |X+QT*qK,0NST'iQ=$nC\jTi4mHכfcp 2 ,WYEm8 iS[Hh<&L##"U^Rx:wb(Tzڿw|vj[X=)dTC,g50՚kpKě?,%4l*@~a1|NQxμ\5uvoo."YS~kYbvCjUF#7x@۫Wۓv=xWt\PB '12ZJ:iD(Z-˹\ythyTGI- ur G[!"j8|-І@=Mf!~4YL/Gk6AO`4 u|`\c)=s:p!ũ"wxʠZn}вY?BN_E֎,VT~mEc^͖?իMY&PBv1?cSfIzJb| ث#<^fWK^jМB̚_|*3J?fHV@AnH96۴s˝D9Ǵډ_Cûpm֍zݷMsK8ML Sz.s5=n)F99jZ"q#HN8{Q*Je4+(^n4m6@y"Es'V?Ww,jG4gOH#ڑۋrٓ)85f~^({VnkC-*1gu:ҏZ1{@w9{[x85a_ʞ+r@ڰOwj+^4n(߅6u~`YQ߈W8hf0n6s%u^A@=TNnt@501P};ra.(fwhN4(~;TZ"e{5jbDj{B%٧ubأOIt@vc?'oMڗA -+(wک(=uv^h]s>B$CSɎi#( <,QŵJ?r!mÞZT+d%(4jiT$>uI9_$~ެffB-UZiHevXj5Y-D̻>gl ܁']{hp ͎EnҞm-ɾ/(&gHʹ|Yg:r ~fwiVpTġaݷNK6u a !`Q.du"ǐ>)Jy,+͉5 a&K/SOoV?(谾[qz'̈ }Kc)Ts&f"h8+.W^mqFJ{5ڷVغKj{F$S։s*3Ty2lnĀqYw=():5dd>_H+6?jyNhy/yM_Кrgp R0AQsC!u;ЃvM]ђ/V^{ 7M/b7 I9wK}vƂSMZ zJv8Əp|Ol_̈=cR42.Ѫ7Ewm2lp,#"<_pyfZkx>v*[:+nI5i%b;Nu{ %\D{fSHj:`4h>y|L2(!) A>KtS>qg?@'Ԧ Q|[gW?%1vq=ݨ/wu{ƉF7+g[x8y׼ƲH?-'\ Ю),R.3.cтy _w >k-OCaD,m 5 i oI3!EIbܝP5ӡttJrlFzŬ֫ZVբb|.dpx !Q hG0W{P巐B%o}xϪfa;vv6} GxFI)rHwxIN0YT#vR:} PrF$Q)4I!RɼI+jC7I @ǵZtD=M6po6NcgV{]i]ut}qWZo}*y-^ A?R5Zos3Gtjt<)Hy+BCEu .ٮ^ZN](x_'W};|׸)~̱fP]YGynƸz'A:ܙk}-"@_p(-Z䊹/wPsaQ.>K=nQ%EYz=LYs=M:ƒ@T:cat?0:dLb q2AGW@VᒑF$p$>]mhGtgP eӒynϘ/b!`ٴy8idϻ+|uHiWq>=(ʺ:VJxHn\)]mRo6&&mHxcpg2Uxs8MI,$\!R؏7>ZV\ZVpit!`#ilHQA= yUgC? u~ԛy.YE O~ÉdG}/(}X2o`< ^%16׻ѯ}D.? jFpH}f™㧚-nE'eSpCxO)ͳoӾ}az7;j|z*/I. 8.|4_A;:T ^<zZ*R);(Ĩ* Gt$A>j9*eZA6D> TnȹRF)aڼQcZK]W\z FcU =B63͕Ž~zH_p:3qn&"˞^wDQ> nuK19i6͸٤rkѬ/)%iZEJ6_Y<8nŬ|VJ 95V ۑT!AAII>d +珮l"ynDY#O><]^=B_kyL-fOx2fiujiOwοpL/iL^HB KGȺS]/2Y)J #ɨQ+Ϡy#p[Ku?iުB˙ |T{wH*~-m3V~;ͻQiDȍ*;U'%GeRXEېKyyn_;1(#+\4 DI?zKl>(OY3;O6NBoZLJ8_[hiǁ̈՜D1F 3NBC,Qh3{{3pR91 0`c-7 li[[ *1IgKS6 ܏6]Z }83erU{`I^IyZަks%**.e+˘3f.]HQG):gu9e 7l/rL>-7zƟ "y)U&p# 6 ^nOvvR?1>԰8`2s: 6bTWƼiQ8_Do.|vcpֈ\gb~f}PX *}Wro73IҢ5YXmbvZM 8Pp'J[_WHx-xjSu1R8V PޕSC <9R).Y<"<"uDrz>;i@ {yhM;~T8FbΛ>}[ dmP%&խ7FS I-jFX(q8H$lV#0}钴E2x3I\ JqRpHը [QY@=U>Cn@;Gۤ,E;8ʘw32Pͽhz{FeL>RA jBʏ5wxI7NDiGW7,k#>ʼȀshC; BoO!m*ho<=3$(϶y?L7o#JaC=$'Tnyc搩K݇ngt}ep~ESFtS2"]k-(0G4vD%>S'1=˪5*1g%`>aۓHu>cfp R#U.;efה‡^1/ k~R]%930/0[beiyq̿<Ou?|f} 0ÒDQPP̂H;gPn=A+A.FDq ț=A6/'wiuC';_fR I-V,\bM=4MɃ)$SR$g`4@ԋMZ1  [D8|7ݧŲPt?&@ N Qܷ_l2\t9AqJR>EjB'mǽi&EN)n0߷ef%p^l~޾4؍˲TG\i7_@}.:a$7In3liOV$ބu7Y7s=5"nO6RY3Rש0_sc8o3?Q۳"ٝ@.!?gv3.:\|sy5%+pekrfx|;bip'Eʵxqߑ^wރqo џ8Bnc"_pN 8^T>La9UNu;(qԉ&1naHi-t!GѥR%l4ⴘF"aRZ-l#4+j7VH@FX*DAB0I|zZo7u|Y&C ݣsOb< Vw۟4f &/'D3G%qPX&a:ħv-T6 ,^Aˇr5sBCG5/>VxjJ _/a-[9vܛܨsVZwHrbjfeғpBU_оz.81R KΊ5}E#GE8}gqz=zQuf57Q4 o*:` zU\ߩM}ӸuK^!8f[ގy1}^O!Xy暟 ̄ ~<eiPf#J+E:(K-ddZ u!*s3\b\E[ 7 ka\ZRw h9p,>-Qt .v A>1ezj >N/Xx8S;5>Lx$6u^GFNDqpޜ;eY)pwy cBɫ٪AIv93QhmG]G^! >,^ d:'^ʹ\a[=rҧ^%qn0S--ceHdc\gO1б{݄͋m уg|s4{Jɋĝ ]y0D\^bG^\L'~y`#umǟ^rS+Z^"k?F(]}iWL1n7z ݪߌ;OۑJ^V\s/uEr};qU#ę/5Wzq?k;wLˇg#SPE,AW5 e[bFZ{\a]=+w&G1"DQT6`^B(D.T|Xktf)RŴ4^`żam矻b3ަO{Ƭ0mP(:7kIf9!oYzUӲt-^l#qz]C-H# O,'۠`&xaO3S#n *CIʈHvygi߯>+J81uL|^cȜ̘<;syMF'/JrkQktrX߂x!~/9U;HS[1>lvv ŻpQ=:y//E]eo#5n3IhoB+a C\1|3z=v>KH[d/Ƣ<|QH!(DqĖ˅V^UfhJ4 ARɻ/8 =A_ PPZ\.r1ި1$ a`JI$|`;{,a1A5ALzPnA>h;LR;}׎Ik&@a{O|%]#^v=gͿ4?}Λh^b(Su xRwhZM ?j'^?R\+ U۶N-U]j9 m*W &ENc 8GǪ*;d z\=w/&* isF=U Hujt"J*NQ-qR(HnAykJUs2<=}I\N;$o4[CK\HSǸ Ǚ1ݤ-^= v .q8 ޸wP"RB:#U] '۽Bӯљ{ ftG{r黍қ"x¬w%Jd(O_fJR߷LdTۀ%+Q 2v;M'(8c`lIj:p]+mӏaKWІm0Ӕ! =$BYYҘ]BVŻ[uW }{151";dE5^~ %wEDͷj=EE*~DμF-ei&,ol1ni>3KЋ-/]zWNs3 QR{1zE ^X4c,IgKq[ 7N=|\kq%2Gzs jc8.Qw02Ps$ӵu)uӌfF'VΛќrלzE*9lմ 9ߍxۅ?^suZ{SWfx:HזLֶ8%$%nёVaaJmWI%{yv'H :&g!<_00pAelo5&aj^e8bT^aG)k{_J6Ͱ- [es5?. h|7 PfÒS١2EhۍZK NIÖ{m^ͬ0| YQ̿J/hGӴ3XOVxxȟP8FF:GrMr cu/|\ Gϟor^/󋰜yv!lˍG*FvH ވ4hOkM(##;q*pj8i3Ӄ^v^/n"5\>|v5y>=,c+'4;VK2+JYM6Nw9wrF4;xgژ=%^ȼ^CMbR@gNZ&}G qKRCy,?. 84Q]-|q$3z|EN>> 3NŘh*LI5/l'PSD߮Voڽq3R<\kсѮF 嬏R8zow[W}(R qo9E_oj[~L;Chc<ާzҮlHp}`z/SK6㳅ZPϛo~ܘqO ; 蓼Hellx&9rM >\Ej ZɐȣÊtԥ:"Vwz+x TfZTW0OPl!N]X%uDQLiL> CɴrȊsWaނ &V.8ew_+{c2#"t<hVpm'oM :[)w`b *iTs35%";0 dɥ!E:k,)mkzᯑ !+[j!ot, nLju!+6!܈[,wQР.n@ߤx :;JrBۥզ~Y;N-UQϭ(瘬Tz&k>^=e:;b1 |E7ЍJ\bvLN\Y%)5<\'{D3?(QCW٫$M:Ei[P6MMxNw{t G1P͈.N9l ʽͯPy ǜ Wӌ D?/BwP}{FܥKzw3 Z?I@$r)q$-papz)J4KF XV큏Dp$D\Y qTGkSԂ0_̡$MKE-FggIIo.E$Of>tmV{32v9]ٿoSSl&:hz4l@ 3Z<߬p*}焃N\oUkzMWf^?(5J&Ψ5EmYw ̛Kl|b?2:V)MSc7* 2 lqzh2EV FQ};1yܦdgnw }u{IM)jتw59E48&9ь :23%xڔG瘞Ak\@{:zВGo; fʺzɻI2z+x\ {N/^8փ#硆}>TO9ڋQ% 9Zss]\q{pPJUҖcPz#E8'Q>O+)V*8Z!dXŤP*Z)@^bEE$)= 6лT2E%Dpz^3d8 v~vy3}znYnwl(-t[oĒs84*;[OXڤ_-< ްvn]~J5EڈXs^AicQn9zQ![hne޾O{G?QZVH{џvSڬ~];dD[sH nK\ڡ6i$^qmW*kP?.mfJN&ƣܣ\9Ȁ4?~3h>!nj}jӀdIw8nC_ܮe-#f)F^o(uQ}B<=0z|5Wzz~NJ?}{:_.z= K5B>\C&4jw RwW bG @]7ŤDIRK*I5T'O2PU%vE"W-esk^ɧ4 bF+*:7jB*m(f:_Au#=W[iyvdli7Rq!܌J{i1texK9K{)̴J%8NQ,_d;7ۥ$y850&/w0?r{TIٮ~s$oJ9-=U4 G !'\QG&嘛$NpیIo@-Ns=RR-SlqLVWaG0?w~n /A~2 8/=Et0r N:wk$<lj`@d,I(b#vLהּl [R)PzU+yw>/+v.2b9' qV\.0cP*eu]oFrMz(vH5lg:3df5w|5Ɣ12GTm O`GOݾSTH( T6u4XRr4_wrWgF{I6zYt˺o@\a7sJp iwOjrz}%{I\jl]*f1ʹ_MNqVJ5nt>^|=XnVV>@ټC6gRYaM3*,O=z&G4݄v -Ju=jV8prlt6b.r qi3bE[L|?|Ӝ]uCj T@16fH*IX @].0F:C ^KшOۅ1( ikz}^oȞrh$ſpddHYo$(lT .$o4Rֆ.UPHcU%P捎N=hi Vj[7a>?+%lT̙zθb0Gz <| Pl)c})oQ:N::̀JN {lTE?ZN?"3)F\eE`D~^mRv<(4WŃXC:)5'㎯xPg&h.(蠜vM4ߧrm<hq֋zr͜HvK}t Fuc<0V]k~g {l){ij.6/ qn#J떡1]RK)yI(c;}8\oJdZѥtOrb^ sd{U?XO};5?Olwwm-0cn-&6kCuo6=j{KX$܄T_Ug_2L֔Nm;Tn_F}0Ӭ1r/wNs}VYT[xV艹Sh~^VOBd#Nl;ܹQB4NZi%Զ& _)i|\㨥TC)#r1JFyGHa ib(aM.㟮(b#1<pr 爏{0oBJ%i'fnԞ3ɉ,/ܔϴ{Go\~@ssh8̨yrf(~WFn6f|ڛMJ%8z8r6S%ڜ6v21M;WoU{-Ȗqy+ikL CdΟvn[AE3y b#5SAOR`P N׎vSR7XSڕ>EA&6MEw|TLfO@=ť^r}qn澱祁}facS|Rbب2Je*ȗ>Nz>WzR. =>A:I*7 rPry9=.dPNfQwiszxE+Ll<ͼ4f\'~٬rHΥ~ĵx0't6.5nJ'w!VfneKP.;jYS=^|TVgVWtzЋyf7ЯbcI#AV`n gp v~>M\;$x.nd-"_qm-g\kiS^\A~S sj`Η-KٱqNMU9LYa\Lw(VW^V,w{A;~&`ey%RlO[t]~_[}U4DzL'.hL!_^ױ3}<W(o\Fy\p=!Ͽ̂gqz^Ef 2 N j)VO^>1_m=Dœ:uZXR.HwܟĭtAMAzW::lgV0)^]R?26D;8f(:Ν`V|Hi:!g_?W+t1LAi b9 Czg\9B]vr B- hW8 Q)Ȗ u6ٰqR3Nd!A5#NaE:I 69 Kn>xxwS/Db8Cۍpf~8̔G*U,riMعʬ0F۽yId<>=KJPnC> tSc'+seԼR軯 }Y7fƩY7Kd!aW C8[#Ӿ5dI\rzwA%_do,h`l$9Dz̋r|O9BHCE母`bV),Ƕlޝƍm%1Omyu?}m^C%)WS ̘hb>qk&g۴cc&Q`1>;]5MzUBTY5~pq;>xXIh6#9Z4 @:We3SכC@4ͨN׌)h4LUxہvWZkqӱR)&qT\0GT6Q#~w|[Τs')ZS+o֟3 7Nlb0ѢCQ{l5mW0;$(.xFtBtl'#7KMSnw?95bp9_"`Z5ڮcȁZ#\j>`:AH ǥ܁u|mssʤ4Pzgo6Ƈ戽MQJIq,fZ9^s9Cm7t)2bn_HKP:u/֪Ey{iM~ߏ 8>u6xiڎ-ѤP۪}4R$4;l%ARD ܴ]Γ!ef2Fx<>q"_9U9.…'-f~wm>3kZqX"F(6MgZ{>UeZ |֊AIcVĕJzq<@MJSҤT,Uj4d<j8̺!5A H_%N{:4$d,oԏ7ʭ$; 1iuq(+Qv3,;to O/oY:ۧ>̖I,pP÷NFϐb!sBNe :NT(4n 82i@cA8}X:mK>N/I'eɶ(_Ν!p>ZoB y ;]Էw]BCVX^Wy.>/#,<.%7:F3Qlw&$HrI!pH0`)61Po <9$9}GXV$su-iګ]_7\omU:MƼ'|4/^˖ dxxacr8fe5^qŊ+V]1WFGm^Q]qŜ9CA.:^x\6чuF#V<\_~M{X,$M g2ݙLdadY3J+L2*ur ȇkiKrAq\.gL)elg>ZL;0W- BDIXڶ|䱅Fͣc ZtUK盱unya՘z˶c'<{xdYsT+_mA׍؅|gf7f 1k7{]ܢﭼf3~Fd֡nYsWvvk[QF3o1?<p0 ģ"9x:=Yiڎ{;s߄ǹ wY㓀}vu%w1oO1=Μ&[Bu F<5棸cWYE(b8ۏ6~M,u0h<M~?}AEQ\IIaq/gs\wUVJj4JkQ3z؏larǃ`~I͡<ux<_m:tu viO݊}=BKxo={@XtJ+~Wj `/??=P~?>ݮ] W+V7OgD:8Q )dɖˀ.*>a^דV0a jRb%@Az1I˥RϊWR jA zQ&aF`hBVӿ1 O1_^[wߤ*CǣYl6)[E 9,ݙnDlŶKG6p[f}a=g..0i#Kڝv.IZOR%7̬&r1$AqFRtwD\KI&QG|*]" -y]$\XȀ㴎CɜRT,q+I1CThA^yL^:~h=`<ySxx`vi9mQd{qf6)w94{풉2-. ^t`Y$-ݚ~=,%WPPm^l[Q 5?=^ht \̯Ǒ{Mcbn2|:2obǍz>cdN܂r$ nVn6Գ6mwҏȘيhE[cMkm`%>|Jys=^Ŕ;8{W3zE{HΒubWoFp }ñV74._ӝkߍ JoؼRcn,8Z&@[7ѝ@#D[YLck7KOҋ{_EJ׾ލ?f7~20yOn/ޠs.FRMHX$7NroPS*ajsF夐ՠ-h넾۱ݼg I.3ُXhoԎal`ܜiX e>IB" _d(ޡˍ8rؼP( d ѪV0&ʻ %1YKawdH}el-ɯSisDNTr \Ceo -4-?_1_n=j<IewL̜]G߶psPv]Y%oAnېr%,[Ns-˗dxde[<;>E\N0pQTJpIm7:I@¿JEt> r-b17SZ\SVbVrE\jj MIw$5%#ɰ ;faeq`>!01g8شdxI{i1:13|H2d+k,WĢكbdbňISG %3Jhq~-(uYb~~e~,S@\.~QH gDSc P  ~їã-fb4:tt@qmz<ߋx[c۬bSfy$dF?:W{VVԘXyuAѤɡcu?DI>'O.|O< P (i6}5tja;ѫ5u k#q3:\\|C7A(Gn:U(+UL{; ƉY?eY{iN7%F% OJYJ>6 m<>K=YKX d},V:w _jXk$h*u#q~]W')4kc wJd58Nvip]?2g,=(]ƮQ7K 1J_e?P\s6b8:-jG7P^P'zY2;fONXE MˡEwiKtzNŐKBgqW=x*|8bPYt1W߭%J6(ĨV+bB9B; 5vm8&0L+tx͕Jl.c9i 6H^MI=z=|@"e=j$8%DOI[o<("7-zOa<{H pΙڼVB _ؿS-~T#(ir~2_*G[a8ҡ8"Eͷ V =VF/e2X!jvԔ-CIBSRp:j6Z~r )N+B>ߕ^#zJRHh~6ɰF=S7o]8-6Z9BK' ti[4W+&1Q5\%{u n9b[ꐹ#HsN_t'y ǑᥠK/pIs]^?1kqë0d|i}Ŝ hvt4dkQ拕Ri4vU"B$Q$NZXK0\T@JRZa(uz^,AOj%>R-J(,J=>$ju7Z2|M#sY}TNj#"ڛPj.OKd; ;,貒Ip8R(sh&f\+J %lvMlV$oZphc%NMQiAkm ) qV;$*3^H'-z]s=k3 i499ɜCqu6S 51M>b5^h pG7,Yzgczp5k\<\٩1?Zв5~ + bihs:kEG'0;QzzIz.w\TY\ܘ^.]T[rK VOZ-&8&\c0K&&.}{@ì3B ø+Bt >@j'Έ˵Z*y@FHJ8wܹx:{oVDV }B!wP+CB>a~k^3R$,>p[$/ZMsݬr{3p'X$ڷ͜#L4!m*1;V_E9Z g7G4[131QCc BF<1*R> TK6KhOq!9 ]URϝK!r5 R,rAR b6FTѦlӒQ}?$p˭Ժ -BL)Y@G$ fΈb ҔPҾZpw@n mO l2;xZp'mc)~[UІVijp8Yn<Ū4 Džݪ68 ^e(c8%>iJNdq7Zzbى_B Oݚ7\ya*ۢ WQ5GCt>=Qs;f3'F}n} |,ՕznEK逜&Yv8v ؆@+hKOrJVzV _D%E+31,yK? Kfܑ}'[ JLY"*rM}haCӸ-ıd[,o:_](Pߔ٪% L?[뎝=l3Qߓ };fJ-CZoK7K\CFQ!{ҟqHxp:HIj\$=I RAAOh٘zXL IR7HQ‰rKCCJu(mZЃR:ݖcmh(7b)sߓӖ ;@l\/O>AMˉȘ;idN{.ٙdߤ7!'iwv5-9qCvz $Ӟ҉;KH$JZ^קG FZ-my6M!N*λ";>mz'%'9!sOyҌ̌Je*Q 0]{T(a/pK{U[Ey]"1? Sq'{-w}hvJN75bx4/=MrB#f>'?RݾOYDw>mAݛ0'|\Rosʴ/^62ʴ8S}iY "tsIR,[Ө|_P[J@]\O>͗Ts:"ұr0a$:44)fA( =EjjG1y>Wɢ` 5yAIS5>ə~R-Y5XC,x۳## }&+qkifk0o6=2јyv?뤋EyZcq jn% !:|h#W"`g]2Ct!ncsVR`ؗIowPn_G=ܺsWzX-v=Z,Ei- }̕`OӷmE85$Ÿ훆Zu`z1yNzJiͶ{TwOkb,RƛT6ZӼ:a?#WoA-Zd<в1G:.9߻NNt1O1L!t~^}J l{@e=5 ÐҠ `i%M)(4:;Q8,`i KRvEa>~=B|A_UOcDž@1=Jb\ϯڳbı-4Ά ,_9Ba,g8A 'ўA=;΅3Z{{vIy;8a,1F{Yl;nO?;m> esX3@w "A'*XՒ@a}^Ԓ&ql}~bqJ_3笄 &/2Fbr-;86/51SGeAb |篹\'-mB*OQp&?C?oG[w7hz|cN}Q m8Q̏q; %}k=p̤ =~EuC {j;kmicfu8v&=՚u /ggٝ$9V, :;9l/qu3 W_6yj}ΝVC 8sBWM1{Reeӝ%lVA\O-M?r +q9 cw dXץJRM(OՄDull98doy NVg{tTH}{y3ЌvNY[csɹkAژo:;<'$K{:/8c ڷMoQ =?ia ~~X-~]=G֟'x+ VΓ+.qhM2_^Vv`F% ꕪ>܈DI1. {׻՛O3þ<%滺?)I?3Nnx7Rh0nͻ9ӧ٦'as@ʆI˼Q-rL+26SF~ x D7Ὠ+Rrѥ=m8lh{[ΩBr~أgrԺR ͛j5$ (/4$ )5%q\엝98T0ORpzm›.#T{TʡȀGw!*`.Mּ-:N0(̬KǗ/XB6 FnsvBASCxZ+|SiVrm^\nzoWv&>v<:n=DvUl<ƩjP^Dލ\lҢ1cVEtlu{Ca|F8Ǚ#BaMs3{yydkSB7>Q{ ~=αS}o6٧;$ajZ,s4`Gݘ-'D/t!]/]BE+[ϭj01IB+iI5QͣPv!#tq_sR_9EŚWhh\ u: ɓkUji ^,T(&^5CC 5l!OEDh =Na_/MNhK_oN9wX1uE0 ٶ8+6(`&Dض>0u|=ӾMNO!iR1ONIebKJV@ w;Ӝ(mxZa Zdyh̩ ww]M?x ㄾmz-lUiwαmf}#-K,?`Gj[Q+u&9DAZg2my'ygY#u'=lMnU˿j:俕.&$HK*U{$hÕKKz֋-⢑"4rA<JKŷzR&:PJD]@hVqz [MQDMyGe qKsT#2!In^kio*&Ub?Yr`-#J;霺g_<'Ouh96ɗ!|zI%/VTkE΃zys\ZV@uƉE~}GZbR6v)uٕUhڣ:57_0~7ZΙ__Avy7lD&77qߢ-1W nU}I0amfs@6d6/^ѥcsƧ]!l-qﻲ\2~.\lWJ_|5~Os]ںqC#-~ܿr!>ElWAC`y,I p:!ߡt.Edsy؛.A,T ╫g8=eճ_P'qCf\L&IXds]\.DU狅F7Iys=a!)qsqt%ua?/+U4Ux-x];YD.Jj^>7&iPϽX=[5oAk ~')uwDu\<m^HizP y&LMû 8˹&jqP C{^ w{-1UX?%K1V/_3/lrjkڳl9c9^/ YV2$1kÿ@{vil[O>16 QM'ZWk:+3˳Vb h{D=fG=P").k^G9UrsbFOSnpkLFG5~Sv,׷amq:Wc7}9x6.4^|X4zxg3ZlF*a`L)2Xt\uQҎvB>gLQrPŀP(BP Lkk%՘  5ҿc6&qWjiX&>؋{*ulD3/L$RN<%ÿo AMt~d[- [q1,5">Bֶ~'f\eg.}}EZGu ;В@(>% Y8X#iJ"nϛR"󗊎2t*VkqdbBVmi;/UgG}j:]ITL)`|3McW>ti6`HF˯é7M{Ǘ]L./XsBdnJE5gל Fv!> ^L!.j4ҡZ&vFyr֒Zn<:aJkUN30w9Wi]d>iwxnuc^d>{׽snCGwéS0>?Yv&UQWrN'R>YlEkGA[s}B 48.ڕ^pT3QgĖ%w&R ?Q57oۀ-[UL3ڬBgBeO aT^R`Zh$ۉ=3Vn$_DŽࠜN$0_wl@;6I@\[GCfqrn>j5':WP\YfY*v&ISW^'|vn՛&N$iԯcnj;vsV Amش~3_tNGmN輐ËH+]2YxXrpʜ S*dܳS|OsC̵R:}+&:i\2XF"/&G_?c)% T-BDwLCohRAQ>{в ʾ qoo.TSL}*+g^R)>&ܞh/Aޛ~䘓ls.bް%!w)/(Fu=(̟\&/wO!hn]ď'zYz{!CgcW C^hm kCc1OiJ >n\eֹi+YrƟn0o,ݍ'ifg sdaUԒĤ/UεK` w -Zbipfw>OZqw]"˦iwT<\.cfiJyzˆ\S૤K庁}Abڠۤ,]%\46,Xi  V cƟ az^TqV+}JykJB듒/ҳ*⟏#[@q%4=yԮt9鰋ݢ}N7g,nOZ'c& @O㜓W5F,{If{{ͧ(4%ۼ2˙'z_ T+ZQ l{;;<<z5j7uub$1m8>L(r;r5/̃R0 RVkd(oiH;w#k|]tx项4⤌]T|˘#7e^69Q`\]9ߧ6ދknW_i܇0Θ&+nD[2.ǥtqwuBzYp)y5ArWtŅDfHs>K{]qHEq)*Q 2hR`h.w17YPB2Tdd"^.G zOye C|_I2/0\>^ Cb4{MK_qtfU{;l%61 D4e33IyĻ+z¶w;K$as~Ȯ9~1,B甽 dwQKs}jF,kM/D/iNRB/_.\֙~@Q>/~4EYy2@C3+EoΟT`44nfc8纤!}񥏜٫[teLpxMS\i!|=M=-ox[DΖ~ *h1/]3&d_hǧΉX0wO'Lj ȹ]toJisz]R¿ d^f9c{uuL/7WY> B0} ;tn^;Q۸O:hݨ}=4}=mz8!wTcfdluyVw 8'}3׺3M(;nLJY;& ZRp__t sK eS>=1b9$Ȳ$Th&6CPRIqT<2p<sy"((lT^܁0jT596u1//AMVk3v;MR.] {6>obۇ[t\D o&; pD cĻ)ܜ7 AhB9j `l4 -FL|d*ݒtX~M!{tcřhs/=Sc|_<e)!~ErZMM)>?7>:2fFA2.h:jYg5Ǵtz# j=.w!u: Kn{%*Sl_`y'+Զ܆rkp*xr #!(ٺ7I?|f^au FIz?-Ǹ4| 3H݅nZO\ pƀK1'l7i&sk0Ie P+/S^E'! ^1 ΅0lnH=eX4X1/O+@$V5,dF@ڭ$ 7VPC:HLDP sJl:نl!]wT;l._gJw 6:t8ziPԭD%'u2iN&w7Gx*f<#W\tb]z>$7>;)}r\~ɽU{μq)7޴Rs3UN̝.Y)9;*/f<ŅOm4ċ:Z?`FY#Jd* JlL&&H% 3')DOkW}d1UF )uL6U7"d CFzޠ֕BekfsΘ`RPzc_@YDNlN5U:}ڽWݲtF .˴$s%8ۿ@|o‘DJ@qR&d*N>:_r!D,'O)^yL<9sRζ:XPXhJɿ ]^ߓzļȎvi8oy##6}6- r STS Ju>oWaK$~BilU䘧50)'kPi[75@Z7r46-)*cCOW ypގi2 r߉_\{QnqIqѥ7;rJ,Z4mΒ< %չ9g;oȅ1h|Er/M8-4Nb!,q:DΙr^h:y RjD+|XJ+4IH5EٕZ-헤 pQXHK zJwg/Ǽ)Q<ۼ5cbs^zol=oB?q_fzh4\]YaeDd>,]9q[h=w!!(N EGT7dVKMZ0΅j9T=ٞ{lq6e@szNb-&aTڬK$B罫Pjjh hDCH.-5o{ l^ dO99kj9BoXt)2bCbj筚\ !_gUF̚v<n55 a\**׾.,Ź'ߦj;l q؋t){@Bl0G]9N\R\}Vq ?u'SM`93.;_zX rOE[ҴiZ=+͏13S^_Pg)Nߩ\w^ނ[񉢚88. 헠Keq% )"Y@ZOi, c>LeblS`I&o 8(2+\!Wzrd{q>ҤX(F4*$b@cI5UHbsBSF]@ԗqʽS8C}<MGOo-9D52^KRyQe>W )*[*B;WMGSSŜ.Ӎ7JA0K&Twr+CuPx41ƛ9dΠ< ݹ]ۃٵլnBmMz<>nFT~[bH)swy2!uG49|ѷqt)ͷeWƅc.vrY* AdR?wtNf#ޜ,]zY@GYO Hb ]%ՊB'1d48PZMn5z*&lPbB(Vȵ4?n;S?s*jD:RݘӘzZzTh[7e֔cǼ8-)@鷹GSwmnFNZ!w\O>7h}yGgSv]Gݮ{bIW6y$y\[yj*L[fR` uPFaFCG|ۅ#q8>.2 wk=,sf)NjM=+}8AKv:ۥqo?#s VmMuەM@Iʬ4-!?4{ڽCz_mUOT[6g )D=3{kFV?*oFP,YjKM!3]?KdBz[d//DK(,b1* \hRb[%q؛ ߛ&Xo!U yʻ_<*\ŨXS$[B!)$I(_ZMkCz-yT*M#}6ݍx |H)4N3k%23Mcҝhp;?)P+% >v󿭑t}k;ٙ7d#)M0/ό k[+LS.qC$n2]7# 'F%je-O ,s=ONMCȽlݝ%ױ ce(ǞJ'q3( YC IrTZO%M3G*g&cL^ѦsaKK(|J0l=1 F3'5nWm yNH:GQ#ǽW9ҖE>v:X[ջ4SˇK^o{?>BMFN[2R[q &͏Mޞ\qb=>`0F]{cS:1wW(ߵ5ݖ!'px=2>Y,E49/9LcnY@͑6#bZݡRZı/;į/db3@WL ~]Eb1JȱM0V=M.?I\hĤJ=LPN!t0/c28N[RDs=f\:XD~P])?jFW1RWSBR-NY{l2[uSdb$~T(Q kAF?h[+M1yqb8v.>I?`KɝRWqHXW";$5D/A7<ܥL<}P9vhyZm5P`ôO0faE-ߍE1/P2joZ.V2x2h3X=/+P櫶lj-u{:{]GuEM;KO |᳼,Z`uJyιL``̃@W4^MBE}\!z\>l6۞-3RP.A!ߝC +JVrO@j5CyJ_|wE"82 e3S*yW3eԋ6-?jyC4tMN=|XQt$^up?)x&=02^$cXgAA#mʩA3zYz|MNAcýraAa7h8ZəWt?Wd_ 8-Sz{rt#1b;ʍH<}كxexwSѠ:ӌǰ]*[܄q=)qytk~ɋ@(Y;/J>A_x aV%yVpֆvʠmc,9[էձ߸|2+~/%[>W|6|^l7q$&M. 6H*I jsHWڛ9NuhsM{#KR頹GEuV^FKB `탃dQY m QB(/A42 LUWbZkqU[mj"DH,=$->o^iPn tGWu]w ZATͲ8h-i遁{GDVЕשu~ $bo"Vh>,^(6!:CKQaȝev .oʬy{,omCmH&;ysW€6/=KWA:|LbHoY/K_m%D4BC2} tuXh@M!EqpHjm$Ȍؒ=Nhl'3^K%Z,[#ۊLɢęD3j AxΉ|kkFWD;bϿDb`+{zDҸ]/~7 {\lGَgOw yw /->szi;=UG,=w;Zuxdxx,R.ECޞA=X:(d AP,&ܰ^ AqrR #8X*éT +vRnX,;ımLe[ fEahLlr\6viu;o{oYٷblmƵ;o+zdڝڦW\{'<9ݳBnX?0e۷2"9%>= 9"cYɓr@l2*g6:Ex0mrZpuZAÝxNrק^{^4{Jތ6Kǥ {dS1;${7I|׶cIߎK$>{qޕ{l6+G.~D@Z_obn\/ͨ5\LN})|J>ل8OPk`MǑhI 9j {˵N}FZ޽OP-:a̯co?r=ۑ{qC+5g׵37qvȇKZcl9칆|7* |X^kڱ7ΧRlY!e>_evh-N5&g0'u%;Qak:[;-wbx̅//@@?=+x'srqC]Cg3C#Kop;q\u7`a* +0,EI'(&L8_,PuR|q @8Ntۃ@ݐm^mP. 0ڣwIWarZ? .YF<9noh&qA^j !Nai!Hʷ /ԂifP'tyLN@ d6@(l~[iYr%ᐂo\bȆSh]mdJ7 7 ^ޗQ,jW8R#R~b "*NB-CߌV^Cm~.ul韪;.}1gP2+z^'MĘwHz١ًSo>vxøPGGpulܸ-Kr xI *nv ,W,䋁KWT+LmѿBd6u B}+Db lG9RiBoFdnJ94:ew3zTn>>Z9ط|mKG ~ %? QIDg}}+nQ& m$>JA<6g)Uv+6,y3R1|_\K|gGNK")G~w8^`4b~Cj>*Nb;rNJ2 )!EZRZiWD<9ur3|(kkl}œg@@w<mh9_@ע6[CA CbHُp"ͨŽQ+oPE-YZJӄ ۃ(hjexՆ5͸]ա5 p<9#4m؎@"B,c s@uZ((tFߌ'YOjNn辘1L9mG*{5J=-ȷcȻ 1UA-(@TG-4~ٮun K"V%Q8Mp"V-v ˔#%Ϩ 8i!Vk]aEZjh?obѳ@B.J'2M&܎b<ܤzb'EvDRF4CF{aԭ]ktG %4QޭMB6W6xم;)VNmo6(яh0H@F<Z@yΙ b|Ze[Ѻ .Z|Su¾P2C|%UG Xj4̠Unmi;B@%u:$b!V-EO Gf,٥u<>j?IUc>z 0yQz7Ns eµ?#%sJ2 Y; Z8SY{q~_ՋoAUZ3&<hMܜClɧP¤0G|0!#(-h1rꝪF@ZŶ崪^w)q5[@;4#G9<` xO8@|L;ϴZ,o_z*z[)N Z RgUoxiǣ^fZAT Nձj{ݢu;/#&zI 56[uqw +އ(i3AsqhX 6'B aٽ=^jG9,{KNoujWB>_RT]8X:vn:C&.~GkVċq1C*)f3M(k[-nI@ łT-0fZѲ6ϧbNMȗLR\V;#u(vޕkw]5g.z nv˵g53z*,: $Fj 3 %N"@ v>0V3$+ɧ͘9i|<:eƪ^&Y9tf\,s.UAN>q'9WnY hF :z܉g :Ǒ-`? %'ԧpfgw9)@n锜q,:çT A;^KߦBw >_ۿyl?we"ϣ`GՁF}r*ߠ# H5հ9FZ=AQIk*vޤt-c1<[Mhላ-Q5f؉(EC%KPG ܻ9ՕŠn*}騫$ VO/_dP(8[d^gg'YoAEuTټtn)x%0 sD6R6vtV;%l؛+BdT:;+ tFa{z_"@#G-%jd5%,~pt]o&oS&N-FQQM_ G#B Eq zCXն(~BSF8(cAΙϫAC0z_F RTcJHթXԵLQCfޢ (Ռ96 ^ilIhkܒZ7N.>,KWpZՒa?¹c.S-k%rXy_'tԖ h{$lU8l&kZ{30߀zy(N? ÿgs{~!! +7 /9kwmYvH=!Ԙ GZn ]s\^|_ Ԇj]Ǎy>8jW=8NЧV$K,|2jlpؚkV^"'n:M/f6A@ MޠwaFZE|YhV}(/p^RMg;&[BBf_} msHӺtU*J8Ę+:k.臶A\ֆҎk/ɵ^i!ڔ,P1y Cak *. CfQS %jU~͔{v]L u]3Oڳ\ίtn} .Y; pݢ)0/n(B>6$C`z<{F{F{5S^aU}PגY fuޟ=Fb"p ߬H2~C6\;#/Ӻ.ո Pzu4e(S"ʥ^#dJC$PǪ2_2L$R0j -IlQP* rPhɯ2iR5r6܃xz:"*+W=(-WՔTLW}*.3#(kTލzhR>ȗ#E]%ӄr.ʿ?SrD{o#lU~@=g9gt˹[;#[TO ˍb=hK+7|8s+Y" s+5Z'MY^DrNy)sI\>yT2i:qj%`Y2V!rb` WQ⤝p[0璄ב q}3RX,f|? %qWW-VyRܤRvq!lЭuI"[ >t>ԃF]&ƭus%h74hұ{,ERD jyd.>!*ngUXnk2| ƥ#H-tP@ji.ӻBJI{[jڂgܻZ`]kZ3b>m)!itL(߬FUMXw=r$<F) 4}373ˀ,CetX"QSvhqנqP}w`} xyfV /WjoZu!JJ.OY5|xD' [mh<] SRӜĥ%I ^!:ί\)sL]\%ϩvڐWvϦ)^&ε^+UwVm\_M+j.\Wn %[˕<]56woo;I2:q^`nŰcjV;?}SA3::Ue ,'6QEm͸:ð3T+&)v*Pz:RA%T{JU3e!f}EZ]F=(j*R2M YaTQV}We $S6=$im 1\.<ۤm4mFY 7oS'YxgK ?g%*SܔiAQꤑt']YW|um5\эV_ynX.׍nk)LX(3dVI/sjkZ/APoCΎΎJ%_f#jv~̜'D"u:n$sڌ!f 蹍GVDX{x\ӑD9M!OEb x PUp2$w5n"`}Z,o{ŶcHMHzt2ڣ J3;+Nt\+;~!mMVp2YQ U5fZOzC5H]',*})\߃?"'q*wWnjFD5c:2bW׻n# Q_U{s~2ZP;V$T-]SSzÈ{aαNA?JvE{UH#s/A>ĩ:i`S zLrn{:F:Zfc~*k׾쎝lWg9q="|;ɫ lj)@ ֩OMijJ 0-YU=O]OL.ZN905jm'V&ru5ѢY%Y]uJYKJ#2&HXiDDÙ;PP_ku~yJb#KLR[îjLِD7Zpa: G5&Lvj=-vSR=ݯ"&{'w y_-lxy}M3=:ڢZ[knqvn7/Mb|ʂ&oØ["jV'*IɘviףhֆFk"o"}ޣRADɠ਻PA:j˙c$@t-$V:v^s:h-.kAOo}~D*&cjki1RMWKJ]]ޙ.Kn;_ΤRlP )G>JT:ḭ n0(W"v3$@tV9Dv;SGn5(yLFD2%KEgK ܉t\5fmoإ75Г!5T#Je}9xȱ2QYwcb'rz;ZogQ'A5FgdvkJ\ap$LޝJ\{QΕ-rj@]^C{BIuzleJz)ߨ:ިZteP(끽6' YoWM M*D>v*Dƶ0S=굻,_ufٗ5՚/(d" k/O6+j{q{\^]l}ގ4 9o*ss(8߆Nr=tdgggY*)aKaPq>A_q10 blߌ܂.~p%gޥcw 6 )q݂-Y^oȣ>7dUתfKFݦt7P|d!1:'?0f;Yc}cUĢ5:mՐVyShk*] 4#ǨF((X0;\ي\ *ټenkюd|`#D ]"g̠%_:Jq٪M>y=MKd5)Iykdș6d1#8]I@_mB@8}֡g7`̥{neuۘ*X{3_cA68:Sg N<_ 2 |uj$]/(L^:b3Ӻ<w^n׼rIz/[SdEs/|/^LioD(`cꈎ6}\h ]7닲oP#Lm^ĜB{`-nĊg}ӨzRk?+YI`T zu֖`VR̼?tLv}ߖ1_'$ٕ|mmȰ8;v7;F6Wb'iD$_1]SR5}:@8-@69\}Ȓr%9zIqLuO@MچV [ MAqG.C;T=lAZuL>MO@|CԲgZ{Jߍw] *=k鷠Vk_Wbx SjBCBioD-0.1.0/test/data/long_header.bam000066400000000000000000000237501273003163100171500ustar00rootroot00000000000000BC"uq]ox~[#%dAlc`OlyKŊb;T ڋso_?/_w/׿_~7?NTO??쬟~?+ن5.LPCz-Lj^#z=^(EA/ zQЋ^%(Es%(EI/JzQҋ^E^E D/ZE/ZE/ZEE/*EE/*zQы6hӋ6hӋ6h#E^E^5EM/jzQ#EM/jzѡzѡzѡzѡ\#zѡ]zѥ]zѥ]zѥ]zѥ]X^X7Ñpe?wápi?| +;K[kzP$&!T KeBhBP(F!T SBhBzP,f!T [BhBP0!T c%ChBzP4!T keChBP8!TsChBzP}\Y8qgǥSk>}\[8qoŵk7>}\]8qw嵏k>}\_8ql7>}\a8q%Sl>}\c8q El7>}\e8q0el>}\g8q@Džm7>}\i8qPǥSm>}\k8q`Ŷm7>}\m8qp嶏m#*>#,(>Ҳ#.˾G`Q}$fGdQ}df}Gi}fGm}fGq}4gGu}tgGy}gG}}gG}4hG}th!G}h1GV>#H(>&#J>.#L(>Ҵ6#N>>#P(>F#R>2N#T(>RV#V>r^#X(>f#Z>ܭkZqVܮkZqVܯl[qVܰGl[qVܱl%[qVܲl5[qVܳmE[qVܴGmU[qVܵme[qVܶmu[qVܷnŅ[qVܸGnŕ[qVܹnť[qVܺnŵ[qVܻo[qVܼGo[qVܽo[qVܾo[qVܿp\qWGp\qWp%\q Wp5\qWqE\qWGqU\qWqe\qWqu\qWrŅ\q"WGrŕ\q&Wrť\q*Wrŵ\q.Ws\q2WGs\q6Ws\q:Ws\q>Wt]qBWGt]qFWt%]qJWt5]qNWuE]qRWGuU]qVWue]qZWuu]q^WvŅ]qbWGvŕ]qfWvť]qjWvŵ]qnWw]qrWGw]qvWw]qzWw]q~Wx^qWGx^qWx%^qWx5^qWyE^qWGyU^qWye^qWyu^qWzŅ^qWGzŕ^qWzť^qWzŵ^qW{^qWG{^qW{^qW{^qW|_qWG|_qW|%_qW|5_qW}E_qWG}U_qW}e_qW}u_qW~Ņ_qWG~ŕ_qW~ť_qW~ŵ_qW_qWG_qW_qW_qW`qXG`qX%`q Xǀ5`qXE`qXGU`qXe`qXǁu`qXŅ`q"XGŕ`q&X ť`q*X ǂŵ`q.X `q2X G`q6X G1݇x,‰ ,N∰",;␰$,N [☰&, {⠰(,N ⨰*, ⰰ,,N ⸰., 0,N Ȱ2, ;а4,N [ذ6, {స8,N谸:,<,N>,@,NB,;D,N[F,{ H,N(J,0L,N8N,@P,NHR,;PT,N[XV,{`X,NhZ,p\,Nx^,‱`,N∱b,;␱d,N[☱f,{⠱h,N⨱j,ⰱl,N⸱n,p,Nȱr,;бt,N[رv,{౸x,N豸z,|,N~,,N , ;,N![,!{ ,N"(,"0,N#8,#@,N$H,$;P,N%[X,%{`,N&h,&p,N'x,'′,N(∲,(;␲,N)[☲,){⠲,N*⨲,*ⰲ,N+⸲,+,N,Ȳ,,;в,N-[ز,-{ಸ,N.貸,.𲸼,N/,/,N0,0;,N1[,1{ ,N2(,20,N38,3@,N4H,4;P,N5[X,5{`,N6h,6p,N7x,7″,N8∳,8;␳,N9[☳,9{⠳,N:⨳,:]sp9?w_g?~)?Ca~?8?ßOOa>-TiۧO>-avK-avK-aݒvK-iݒvK-iݒvK-nYv˲[ݲe,e-nYvK-eRvK-eRvK-ele-nv˶[ݲmle-mvK-mvK-mrc-n9v˱[rc\-nv˵[rk\ᖿc?~*UWɯ_%J~*UW_~UUW_~UUW_~UUW_~UUW_~UU˯Z~_W-jU˯Z~UUW_U~UUW_U~UUWmjUۯ~_WmjUW_~UUW_~UUW_uWUǯ:~_uW]Uׯ~_uW]p=lg{8p=lg{8p=lg{8p=lg{8p=lg{8p=lg{8p=lg{8p=lg{8p=lg{8p=lg{8p=lg{8p=lg{8p=lOg{:ٞt=lOg{:ٞt=lOg{:ٞt=lOg{:ٞt=lOg{:ٞt=lOg{:ٞt=lOg{:ٞt=lOg{:ٞt=lOg{:ٞt=lOg{:ٞt=lOg{:ٞt=lOg{:ٞt=lOg{:پپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپ^rl/g{9^rl/g{9^rl/g{9^rl/g{9^rl/g{9^rl/g{9^rl/g{9^rl/g{9^rl/g{9^rl/g{9^rl/g{9^rl/g{9^rپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپپlog{;vlog{;vlog{;vlog{;vlog{;vlog{;vlog{;vlog{;vlog{;vlog{;vlog{;vlog{;vlog{;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~lpg1>}iܧq}iܧq}iŸ/}1q_b/}9q_rܗ/}kܷ}kܷ}kܷ}kܷ}kܷ}5q_jWո}5qqqqqq_z}=q_zw}gw}gw}gw}gw}gw}ww}ww}ww}ww}c?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?4Cc?bG1#~؏c?bG1#~؏c?bG1#~؏c?bG1#~؏c?bG1#~؏c?bG1#~؏c?bG1#~؏c?bG1#~؏c?bG1#~؏c?bG1#~؏c?bG1#~؏c?bG1#~؏c?bG1#~؏c?rGȱ9#~؏c?rGȱ9#~؏c?rGȱ9#~؏c?rGȱ9#~؏c?rGȱ9#~؏c?rGȱ9#~؏?0dBCE]+%Ak:tdGd$٢q,믯覇^:ooo[o[/_ /;;~7/nzC߇>}_W_W_W5~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~4~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~?G#~?G#~?G#~?G#~?G#~?G#~?G#~?G#~?G#~?G#~?G#~?G#~?/ (BCBioD-0.1.0/test/data/mg1655_chunk.bam000066400000000000000000020261111273003163100170110ustar00rootroot00000000000000BCUn0w3w{I v~X6ClҮ8GN2ԉ7#fhuדIdyM30}Jz+ !3^& Ï -[ڎ{ߍ11{,|j Lg03o|>2nRC0 )& \m`Z#sSB]&OmH,|QĪ Llc"j`b AIT wpM\OIO*JH r?Q!Lx}}f0~{yR7 D>:-ƣذ8V[C FhMlk YCu"F={OD Q Pe-'݋NN/BBC_\yy_'tuQ /WUDH$Hi5" HD 2DP-[g5X``I0(Ywfgs̞Vy4VT.=Um7-_Mou8#bIYg>I $IIG;EQVMghieI74Ovn'iI E(<9q܌I ePvQ33$ NrT~ I(r]w<'* E!08GV68Oq;j+$T1ON"9.ڨA6(CӸEƏ&!!e$nm<-ppY`[a+̆l qԬjڦfc[lX  i3h^fy6xx8cv|p~uf]Ø7x߯#"nG/~o13=Ì7!aHfajMAgV(, 3=ea n alD٣]/#m5bŷ(:GʩhomGm^}?8Jk9o7_G\*[cr3(SxqdHw?QaX7J:\yY=ga wTڏ|6;͔Y;:6" wQr9jnQy3޳HN ~uh/yϻkȋ1] 6+nF#k(j{ewoï7p⚶"β j;/"uU-:-is-{riW*|Hwpdu| >*aQF]5|^Bю݄m=O| ߬]p-Cϐ},jV0^@hTkrݯ؁06 \ykMҿ ,}J)YJgqʻ<>71ٙ;YOuY (Ak?o;RWFgj| Stߩ_RGtAffP-l=~r]mރ\2i}{TybV+{i OX+ /Wn-_٧z/b9]kq)56R!yxSKQ.n{?GZݼ~xZ]hѢ͟x?s߅FxXT''=Sȓ˪dWO޳lyui{iv{+FdqrYTcFTu p{em̭VwO.={si4.?P*ːJ;?^^Yv8j6^,La&$`+iK4յ;m?ȫi3ɲ'awڝN'q6/b4J;Qn7@NE8b@knZ6`蜎p]mӤ+&c6ٍzaP `aRXbu$L&mi'4 hR)2A!l"aY JZ|Fss+hŅZ\*wVJZ$׃)9^[A#.ʅZ'lB9K"5kIB RT§Xk5jMv+lEɲ3e9ew?gPa~4ca|{1!g ^؋n7WWސ>枯guK֚Ƹ>}K4+7NL {4c-ޛFڧЧ\v!%0Ֆ:wQx1UFWL+OK.t~:nieʝ;;QķlnyƲ7{9nG#y0ž2u"l11t,OO߁9Z ~T6-#V-VLs *'*G\>VÈm=4m,*Q.sjd >붊^mP gI]!,P;an}M*TF[iVh(6W!^K[?_Ssb[6jD׊73`(;cuY' pZG]}*XT6|K*n12bMq3\@Dy,fYb~-7;]اBj~Z_"M6iHStnF lz[¿CoG RN%oAN렱#Key~PB$G(O~R}s/>=_ǧi$XB/=g+_>CJ@ ξjSi)h4\,jlKEW͛wGp]2 +=!ZYƼǾؾGэXA٠;;0> aXFӃn9N#w X8!B6u |#Dϫѭt=F*e Ϧ\i^C!m6]I[7o7s<{ :0zQgz 9^;!Jik"'{H8Ƹה]8:mn1c yZRک?%VvuНn )Q uZw?b @Q ~fc*^m?^$͈ ޵ /rouDo Q,oJ7|#XÏQf C_o~hĽViϟEl:<}ݻE7τnb2HA VST^)'.2st߰px>K loXeTB  jq{*V*1?FٲMލVoS'qwCvf6m@w ]%{_߇|$rev`[ \Z ){ŵUz? =R6z-zžScIpػ,Aŷ˧MݼC%_e=sq}n u_EpA٠#of&b؟IF%kT[Z)) -fQ*(jOU.\q>T.~T~V*f7IjP6$aJͼDPyz";{'eJ4K `G!(jAq 7Tw vgi$e<I'h;R?Euz9v'\kq77[J3s2s[qvb (wz``v:M!BL1$wD6bc8<:^?t©^:t⅄?b=lˀ(Xj^S"BO WBٯ0 `vtTo6#j_\K+"uNno+gQ Ǒ7fHr^NբQ s ka1pt")߮P zALn[N~"#uB1kÁnyXڏgd7A ǃher n Q7*OHR 2ꢇ[TJvؼ[ĝ?*5A@zJVOg~ &Lҫf>rTpOcgr |Rcx?g^?]މ/ح| .K\aVuzx95W~ݞMK%tKSeF$kV'8ݨZJQAݧHFKQC+s9>UK7|8ljv"bޗ";T6qfJ_|@oQL'`9 O}]Ohkn0*Xoy!UsyK&91nB !3[C-].nW79JtI QQ\C='iuaìuW ZߦZqrR0ڕbk;TD Q)6֙;iD,"4dAyI+2m=,x^v'SyKȋkΜX ֎ TXH&_0봻0] (׋iZOPg7Kq:1Q6\IT *A$+B?z @K$mO+RZYjMZRQ\F8F& aڪc՞(XDQKZ0ٕZϮ;5sȍfgaI(%:eWӛ܊(z=3.A'5.9k]ȳT{ :sMY%\ډv1 f7 i]w+_:GKAE_"G3N`o攭n2VH\m{*R鵀vV]q/[dAjpo7( \2$k*M|k;fdB~KzY}WRۑ.>N+*3pWʽzEyrBEcE3Pۣ4_rum[>HK'݄ׯi>piZ!G]p|i %`|"-gVddh _Ryݤܲ>8vPniIlO97 wp[}Y7/\1koh,9j,@vl A=͆k1p,/xSeps5hRJ[z6tvcm-`;v`FR@*#ssybaZi.ægv!|~CKZ;Th< 5?@h(S=oǞ1X%dEPVJ?ɌA .4yDjgU c8H.09rx[*j$^oX2UBa.nwkR˘_@zZxA~W'nlDz>vԕڳyQNJK!1QY` 0_ԩ*@e0eG*Kq9@X-2bg nڎ2:d!8m&@LJG!|`'= t"z픨)uϴ WB'aJ¥:@0,GAF~P$Vq)rw7Z(4Cpi +dzPK2ڗQK,}CJ`WB ]ԴTdngujaQ2(4Na8z=u ?^ElNAL]^5ӓ9XHtk@E} H boy!,nHu=sE0 %fݿر[o!.0[Mftcdy{ {Mcp\ނT>Zbϊ jL(6s5A'jARrwRq`{ɧs.EޥTsoU[qqnR o+-078-C*\Ǽ=;tȠQ(˭~:sbPG!Q1sNjes洛pY .9w/݀,W,jiIj?jOӴH  i&:=Rl2OIɠ]9 ,*q/ʏjOL"-@k\FC-ԃ!.4H(ɛ “&nIܧ:sMj [F-$mVV8L8ѿެ(CwH$Xu8i<Y =k+?g\j@ Ayya=sVϩg݌*c)UjI^+v5foǰXIE˺uVaSl8~3B_qSvceTYb:"Ҳ=#?F8{U%Cڧt$l#_U|Х0:0bTS/*';P(mNRF[&/+V WQYTs|ZdCZRy_,F&YTg3.M{('@u~L-Ǫ~0_3%|gͽs-l~5_+_hLqc I?wzꢪ EWݪZ,5ʢx 4>Ե+1NxBZ)nW{Y}SL*n@Y퓉VOK*w^ދ :.؋oE1g~?(-q?Uo3;P''X^FO!ѫٹ}xwds-SǞA wk-񋦠kp<-~S;0glU%\Ծj?v"qә9>YE} }\h t{axF]`Ϻp2މM8Qj9P2oT]7n.(w۝nw޼%fqfiܽ݊:4}ĕYՋ *v /OCuO8nakJx&q%jI zX AINɺ T؊( !0yX4ۊJ \%ٌ"ZKS/5 Ȑ)Jf4RUK~ZZY>FA*|A3f-V^J%7(jUKtPkFM+::8ynodN}$%K!;㠞T~c?k%LDlqo}NsNo@Va?ԗ z6rL{:sk>` )>J.LV2]fm?}AwfM,Z3UJfooV|֒%6tlw~Q}"^, ݳF91W!{Pj c9d|WAY"YF~6KErrS]ի:O*Swľo~ ?P:juq N,R7J"z{ *ʞv.$#-c\,G7o9yPy_6LI/U%1rry|»Wĸ=ې83yzG];*P f9l Bnuqϝ˩n3ETH]23iQCt|ƓxR>3wI@!RŲ+?nGkZIu1 ;SN*]ab-grt\>l̍7ſYri/{Zugkwk_t35::%';kjhKPӛDfpݷOQηSXj;,]^g+cT:<=/WmJc[hoia,78b.3؁9ʳ<\=PɧfĵUن@ttC8ԷuxAc-/t oq C=;B ^ 2^o/;Dhh,uT-gגܺpsPc8Ɯ3i Pb|mH/ 8]pťT>]dy @7z_4|3(#@zգjP Rr\Ikp]H,A3Iz P)]PթĚuN?a%MZHAm~%ʦ!A"O g4?aSDWR)e6) .E\*ip_rlEB,ׁ1%iFi0$7q^oF`͔֒FRW~c0f4Fc8A*Ud"l~![BGjjچھqю nCjs3>{(dFVcg8uڬ?WlDygۡ<[E9?V9 _{эi!ZԨUnDC*HbyR 9~M!muîFɧ#IHsFêڧ͒7gDٍ"}X]/jʎ8N#7䞿c0 :`D^l=]ccQ#_5;cst0 (οʧ ^qϪ I}rҿYiXIPJ2JSTAVij6Vٯ*JRMQjk fXm6.l6VX+rmVaPk հ !KBqIZ%¸5b\ DW N,8mEL<:1:1hF4krf,JT5RƈX M"4|7#tmFqF'-Yi'q8hjV~@7 ]m곆 S%@MFЭ1=r4%#~~P5Xޮn7!z܈EtӉSW /NJ-{k~ݧk;1JtĉC aװ֕Fzvv*jen4_{B;+F?7ªJ>ci<\מttB!6! c;*餲`R(1sJj} ~mԽ< 2)u .]Ax-n6B|ڣ 5i_PèՕQ7g`HKp 8=iTԱ0JN@|%޳ޯBo''طոn1ksuJ׸.s3WZ?J>)r`5]:+F0s r2= X>k(NegjfW,mۤF?+v(m!-}zq?1׳k"q>&u Z1G<6Tާybƃ#]k={{ZeY[UC%L(&o6sP&Bޯ}ÿiC4_'-}xE#hScOqDyugr+LGPo?8 /\ q}Կ:=O.lm* N4ӴM]ȓKSk-w~ҽ;.5,r )쌅q 4MR4roIT.T,ˁ_ZZ 7ՂZ+iQ B/(\x4j7[v`${D͸V$hR"LcQۉkNhENg]yjwhj絻5`ǶVNMyEM۝Pd\TVW !t_#zeuOVy8_1aȠ3Y8֛iY`hh4R?QlJ[wp-yX#^n1`"Ո;j6i'Gc;qW) 9ˉ=gjZ1f-.-çaZɹD wf):Kײ궦bv[אQ(T2Amp*7/JuVI-OF m>H)ʢx`MZ mϗY}kjX=O:)ځ]9*`vl 失tRKBg{uhۗђz?@ h+{=@IO4:إ6*,BGQvV_S>ANWW|-jJ¥,1TgqڿU=0ͤLPE3Tك/&rr:jԳ,颊$'zP/V􏚄%Pq,Z B-&F,c f$͚|>^*~+I\)C&v/\XTs%fa%APJZ(GuU 0dkAyT'i5mz~^v~j?q6t 3| Ik~bqHs:fװ~Nwm DoM{Y}l1?/}MgsV a\alɾw˶&*EY=S,bv&B\>YGî\|S?{3~oGe[b1x#r/} u3ރΐ3 {I=-k%QS[._&iarCN_pMDV#Փwb9gԴT+uas?~OWLKdVo) t됯RWϾȨkI\h.nD 8 +E}e8t=b[zl:R'|u $j7Rr3طi0yZ8~iWR 8kk cnD4SQwJ&u9UʰzTænj],>.X{g:0'a{+e 5Ķ<WߔXfG[QnUvc5D-]׃ ;%H!nYge4Bply<Ě׻ JeFJh'~YsD8=i<Ͷ_6Ԣ2cnn#,$}X{J1爪z8QPA=˥;bFY#3$\gʹz3PiE${ Q x/QQu^6 Yf;Ǵ) F VTOgemk-ufMU*u-&QXC DB٥G*a7h:ρšv1#Z9~ =qP&%E󖸓P;SI* aEkb-0Ft5v`C*ƄۣnI-3b܉Et.Z 8V0.'\:)Wui"猰nW 6MB~Xw揟s7}:mɵ+ /mEUuk׮[q&O[C簛k~廲JnhsNafwgdE ]Iyh?*iPF9TJn<.OH@ζ pLy%п؍}17Pv {4`"p^DŽ ĉ_qi cBCyI<鵄_u@~wH.\KO-^bt*"nb©z#tVʵ H}_9CjiQLox!r QJCmXfm9 UآZXq&*r~^irvDA9+[i~VO*a q;n~d $Fm 57.|[Hq92f8>?mNn=ͻ¥Uk"<[5?;Ζf/#5˝[%ܓZ E/-ckaCFn/z܀|k;q]HwK]6<]eDj+_-<{ɧ#RgyS/F#FD)hzGM@0`\Foh֮D+$ꔧK-@UQZ4F(VJڑ]ڛd=Vi/an'B-1 o8IxJjpARmđy2_֓`"EBuT l'QF*z=IR rܬF 1 +t w!$'8V'(lA:V)UFJX)mԏDib(Xԩ-Z'W?M!|""_y=*}H++{8^$DkO=s|ؗn2Myls}Kpi]6 mIB\}?̋ds?A b=wDe)#:-N;m%uϻ`%^>밌J2ar"kUVϹ5{ :;(1w*+ܟĹzXҽ6sz^V%+ZϠ9>CoG'Ǎ5C#]o{MUwZ6u 7+rtz$omu^לc[1i4tcl?=5a׾n1Vf̾IY}gQWTCjN!}Nlv7z;X8t5j=.=71.;P#v)zF3Iq-aM?3?[Vj_oQK[ՋL~GGlaxπc@=ZK)ؽzx؞ձ?#'o<*l&z2*ӛp^/W >+i2. ѵ܀zZm]- L)9j{ҵMrzi'Y5:?|gZa3}pI!:N?5,fH!Q.ع=E:+cZ7KK7~Ty&%=7${8߫~Pu>e}>~`2kנVrKYM-Z8'o1MݯUH{ 1Tʫ*.xkG]F7y\KT#w8RuFߢ=ozd=_Ϙ/laVWwgT~g}t#;?CVUIm'cbmz v'BMrz\exmyw Lf7-HUle.~}iWcGךX3 oE?a$f57fVz-\.nǩ_!n] L/8EK̕ǩCosտI&\*Ţq[B8v;R;g u?023*E9dKߙ-M8f4H$Y%yFBdƁkb*Rѹk_SE\KHSa~@ iZIAWVǪQ~ůfzPkRHB%.Q.WeddIԒ9?V*Ҍ^JNVCz[MI-O#8E~R_IjM#3ZZ)Fϓ.\rKtj% LAYQ"]r:0ϫrde[V*˱[\g`Tg+[+$QqvR>t,lnJn{()kV{Y6{mv YyDB/֟.SP},9߇[1.-KCwS>_SY4^_nVw[O>i5ٙQ\S7e ֿ) mϬ/xYoO(ݴN[Wj.eQj iYv+ҢX=ǜmSx(GDWH%#!)gZhSJ:A-W2v w;@#I~qWO՟jesJ!LƜ3_=S*G=YA\`V,k\To5HOR٠~g4*~@7j-cjRSZ MkM<ArXI3f.Dz PS$Ÿ^Z@8? p\V܈8۬5hDI;@Jv{dVyP Q;ֲ$(pL l$ f  cO f=,IiRII؏')? * aߧFo?`ؼݮ4_/AW(WC>I_v=#eϩy;"IUVs׶-u |[|@9T7I/!w=jn[̽ 䭎AvOV2 jcI|T4FtlD{fuK͗:o w3uZɡڱ\TuZRd\ 'a='mZgYR+蠕w+XCr\fˈzz{9{q;9m;ܼ5}x>֟3Sn~vqiz~FF]S`h{mSA(?}'c*ט/)sZ-з_jtjW/aSzE KM8't}\~aT*>UiX8*"|?hr (+Yȉ}|QOͰt4ڤnEFr( X:\+rҔvމ,:lMڸ<դ8ma@s`&V6`t@<{`̪ڧwNBdb[F wXLeNZ*N+8\nOZ qKYC*I Fz-*TO+|*%X߇r۬e8EO5@5"u9Ct~S^Q8QdA93/ uήB>B.u{.܂g9Ap{=#oNR eܢQ yV>&s?ʟ1ޣz5MT[3gVMjDҳfDFxS(8Ji`Ukmlmu-(x+Ч'?,cwZM42nh r0%ʛgf5Wf6m1.M mM6̓+(Wk\8 nVmhW~{ouPm iyZKc̹o !!ήGgP4)E{ '*RK70u CgT:ry'X?w6BK=Xއg+l:r|YO3'M2P!8G.=j@D=H(Ϣ'6Q薿 $i5BҖjLv$iQG-'==b@~=Q-ANBm8͸Sݬt1 D\"B=IV~@XC Wjrb>εJ+QE~0\B#Ns֔ʮ)گNR9A:͠<6Ak';w2l2v1)1pE9tOU-m(`]~-X'?Q/T3 ћ7?]#`q }[" ]/ 7ud/ʐ[z82((~D>e` #rQ!JZ&6m"D[27sfޫ~BDsg(d7 1ipE a/~dgb&;'+ M|DńV3D+a&Sy Dx(mmጥpZ^NR>pMNjx-82gX|;Ns [ Qޟ~k F`^cj?wJ)YLcaF鑌X1:R4ݍu9^XE'-oR2$I& #h,0 E.e*cl6,$KvG./]Y[/;ՍtĚӽު^wvI[[?6g?py`\-(sj#з#)Gqctl<~)nVD61c^D5yA*ik3x^Pc0iC(At̙A?qgyZM+-xf*%S_QZto7і{@7xݹ{]ePzU zg|^稛]W[QWU1= &9߫>lΦ2C_'Rݹ)Hu_ ;}SD ;gy,wLXu5eu:yz;՘^ ;}\ݻĩtkQ_;`ꉵ'O5V-v֬#۩ӭrm4WY Yꬩ:5Ή5SeD5$po}uo \_]ﴀq b-;IYv2,`Z QԛYDg~@e3qƸUL |?E80e@jQ?N'zEA/N4JxIjec~"k_='(fsYkQaY(\(8Ij3"Σ$V4YZԂGvoe:lf nG9hqzڠ^mb9Ѭq VaBM ^;UBRiJ>sVl cYTx &Y]]Gu\#P@(?Qõ槼G̿q5G0>RCI>c$RTQc#yh&&ǥ!@cB{܍R%O"Ÿz93*N͇ C:msjn/@mCyG%8U8p,!McT&BIr+G "QQU~0ˬ@ZkwJFype/$JPTQKWіW62e.BW(}imSpnwT0ّ:F+ s?]n,\x)@QsKDi<#pL=ڲA#F7->kCO.O?#-5 z.lj>``SJ[b Y9](2e@uPiw,Б3ĭN$Dq+Ac~H8՞jKw2b2)#VSS ;B1qVYT"I27T;$̀)Xw@1 $n$f`RZf>SS@cSaj1R5œjG!tt)M8N|Z-(uŅ.Q((JaҍT1/-E_μ|OMO1'j65s/fUqef!m2vF4L阉oN\&4/򈱨h\}o5盏+*\IL7-™-PJz+*㠨 "Q,G'6ᝠ䠉5?(-UKw iLm5yƂ[ȩע0FV;E] o1%Vt_m?3z@зiY1v! Ԑ>#o;q)\;Fow+fzuړsaT*2^\ [1a ǭ)Q,{B-UO|Q}ݿGuڵ+.s=mGsj O}y՘GP} pL^?qHs :sYPev=/Ťw5oszˍh+o|s>$}׾8d.4$UXu?c3WاՅnXl ߶s#!3E+:Ñu9ΦշT5 (^|z{ տ< `LJ8R@['W 63v;<ֽc'{oTԎݷ\#8Ўmh0h8vk:m4luTvK':n,dh{ u<):m,,yH-(!pTsb@TGW ev(Ѳ|w8!)KqilaM}F@%W=<ž3WIø>Z[U AywekK-)Ǝ'74ܧs(o'8c E151?J0t/c \|u>9#n! ƧeSlj,5$7cݎ !J 18v9ݦh 4ȱ=s]ms\!K ݬ}tg3[q8_Tz?ѕ'X_:"^RQ ZvX5\oRBs]T;6g~͐u7Uk_.]y. U?+6O[jYjfXF&'yV (a=ZN,pޯ3))UW(%>)``$y;-4)&jYe $&ͱzo[ 7ǚ~auVk%IV c4ZНnZĮ1hHVj4E)Qa>_T$n+B'p5'aQQM|ʙdkx$:̭B/qL IXj'7ܻ/z+21'@TۂR>}wA&vJjU*=񀦡=#^miVJg#X8^Ij1ND@$ViDlӘd<9Lr&gE9׺U"|%s#J1w'֫Jy΁3gqt-谚d8L"i(&;*)eKw= 018 U]w@{7( j%-CkguۍG8 iJ ?7K~t8ymERücfc#1!gOA_?%5 8*k;jojߧV:sWgpXQ2He'̞վB?vz*(ysʼ?wdwCchKꇦFG_vȾ}<.? PT0u3ilQ?G^=YV=JG@7P&pi>-;!;NƓE{,5Z QS0a$sJ;G\\$vh1}Ku1'mFD|IT[Q*NOaj |gid8XyL{9x qtڰK: 5 Öqjq6M?eT%Pݾ/./]e/)zvc;ߦQւJ9T ;pbԼ1ʸfK2fV <ʼS㲏*{VE.]vG,*ZIV )euQnZ60nQL L)yĭvVqN@g 0O[Yn6v-Wv%78͒vh6ͨMqAV+3fZfie͉f;dЬFfI~s k$URjFVoMڞ/ Q۬&\VļY.N\ ;/<ަ U7rڸZ Nz~^lhBL)]+ x1ip:L6X)Q-A01ʵ?c^˟G ?_rq[R'Y^p*MG2Q2 #ѿ_0KFC8f ۫MzPuYD lR&iЬė`Xmʽ ]T/`!~gu |XJ ~ tCDOpPe `h>-O6mpi0{=m{f!dMSs؅bޡ35Ӏe7"Qm$YB N=;B(:$ǦIom,(Tɿ]_x#IzL:et}F2*(vɳ΍i669݂* 4IDy{= _1VF矃gFRRbr``uP= ^}@j_33dgw+Y}V.|vH~[$_tJTjJcz])cJ/q6W09JFUOʟQW]M̄wpuji>E^wyUP=~ Xd uy+.]jlHZdqhSTmj*06d(JǍFçP^YDYP7ڔC~0v-[( N%oۊZ^Z]0 v 5輈&Po+P Vȶ"%E{WŢn-.z^QV5BV\Z-8wS |`82kJiXdiGȽW.*-BכF{M:^)P ڊ@/r| o쟒_z;0-cxk1ϛoNSCݞtf٭ȵAPo뛘ן&6㪕qmÄȭ9Ywjڃ!Ѷ.?C{\MxHj/kr}!CvoeX|]Q>s|&G͈BY-zNnqѽԌNGk`r4R \H~@9C &Y,JHA;t/ .eѓ4˄(b9`a;(ʬ@vdoG|hTZ0Yy1%Wa{cQ9<)^\'L:7e(Ge]GPՖqؽMj@ce}-cꧽ\VTӦoK4,-ͮ=BOan!g#:t+OTNRK- F=?ւlr\j;OijOc_Nn0> ?&n%ϿYiy]g~ZdeF)Q~LF0g>0|#CԾ@`'xJSZof$C1QG<؋qUׯJ߁_6XG%zyX3R ovWh:~)XŐl/nMt̽T sL[V8FΆ1]w$@Zk(~)Λ7(Q U' R(NQ+rtn݂ж DEIxwkudI ?ΠC9p(iX 4RQ9 \ev>)u~?^tG'J"*(j&dζ^b+2@0f+9Lpnb*nvPߜjyQNgIh0?TR%TPh ( knhd`T e]'^`f9[ud4awʎ(5328U*\;mNdOBAzc hوR-ANo@*{Ĺ /e:e-[W;7Fq1pank(J:FG̸\U8{Bels|!Z+IszTmYIg/֝*<Xt\hkS"*G:pq|gTԾ1ζ9eRk-Ym ؈{-s G }<$`YN0@nT>g=֙o ?rOlQG dfNmhΊ79V8D̠?õ 2F(: }G"'P^9wb:66oM ;.ؗ?4gt6 0Ԙ_;篤éͺoBczu{Ϧ~4G) OCv΢ޢ%K8[dŃݴ19bQo[Ruzݔ)cወz,enÉNE-X.IdI띳8u_MnwIqN겘8L =ӲvS.d(@¢noQލ"kqOKI[$ħo<txvZ=l(Il?jY jq"ʊAlSĜ49=!b4AuGj' wMkk݂TsԘ~fkX׈7cGSrvmYCG7&ǟ ~QeLeX"2I/mCz;ӵ2mb,uA9dL;knH Ok$^`:\/%a70ҟ8Wjp>5,';ehx>/6VgwcsQ L f] I}Fo?iݻyDNw"__'s$9~8p>>~')8j,xE9 !m<#CYFLd~T !H2D ,c-pj=\hPjc{3M~b?=E<*IYqHho<9ZG} ٧b3YZ𮁒.qzˀijQ̻ KḐ5_vO)y:#ǹ3*Fc\No~ZbX l:a:\N3l/] |岕fM.ī^WPx]uJzJrED^LȭT/_mwޢE?f[tE8GN1\)i8)~ԻDay7jE%*lg4fRESdt vrg>q'-h:]B˽%"(©pjb*-}Ȝ<@yA؈0i䔃&_4kiɢz̢aLˢa7 IQ,bF* b7VBg̚A? ?nS~,N˯[ZR{\LHc(0;oVH96|G  Y ueNNW.mk➏E:j시Ad؉r0%Yuq~gQ]Se߷T&nRk`Z#@v}f2# w(zA]WpI/A@yq*d6l3mv91rI$'xi ;]VmLԌӼHL$wCLW=slAXɑ#(W}P%O{:}ԗge x uzwvȘGN6s,76l{[7Sjꣂv̬sZ R`8NTF`edi8zmz:uG=7Ʃ-0Ne^h̆O8jwV+p a*A=_DkԦv9v Q?q\дm ;Ӳ}uV/ԧ5ck-tUF]&:vDy)[X_2`&;E$_G4(ZzsjY_|6,af#:pPF]:g܅RfM?G3udw5a#C:#X\ [H=.)a R\Mh+W~Je4M 9jΦ7}ԇrڙ`u 3MZsmx P뛢w`kmV5:QZvWv] |NqVv D G_'̲NLfQB^ PGۛ.萔r SY@@SIJZ|T  0k@)1.펦ij)Lw,졊.;KKI96;+Q;rP6钕SLs+u_Q`AMKoqoVd.ʥ @Z^g o.x3poG]=ΚaVsm6gf= g%ohoΩ,S&|C* twV1r׷iyr_rM:`& ϧ#|~ܸ%bo@痨,3} lsG+\8-E..~j@3=;ϋ#:VWQ:e`swXq5Y wND{C+hՋ姅k%Ɠ{ƶ9.>T;v8/.LUhkYcHeƖwUJ+CF~9*p{`t6o5|zF ϿPRsoZ)jmoOO}Z;[65?hx2Nv,YV1DvTs}E:!mI7q@0('0̓0[ӸYk6:߯MB0mSO4kAͱyA+n$Jcꌥ0PTQdq;_)*K[2XUݪUnGtkD?OѲzV4M?iJ L>n*l~4ˈړ".yDִҩ0@]J;iY9dQrMz|M|;B%-< !Ezf4Jr\( ^rMα'z֧8wͯ6M U*1pg_swK޴3yVOhFf4}11 96~S#Bȅ%=6Kzc:׷VvHߴpat0GR7_s3aGqޣʆ mE2 ]Wn0_*ŧSwɽ]I?Y;3iUʆ%{<7z>.NGG="xچ%3*[o,FU%a+JzBSns quhy8Dy5(4~X`+]Rnmu`Սu멆ٝ^&2Ү~0;Q@i}sTC};aF˕pDic:nF\ ӗ߬@+c+c3C|^׮:|q} uPs(!\e@rjl 8&B^FF w?0lS&V ~.:m=q_bmuN6?/U2ZLұG[Qeq!C?|ԥK|3Qkn49Ja/3@z.G9LfΦOCn3w&zʥ_sIE+6'mP7ƬAkZ`n$Njڥ'i*oLMU~"SQFQI,*PmRdgVoVe_meu?3GK' w[I7naeTEmAzz8ʋ^dT($M: 2,,鴅5ðlƩ~=jQ||)-<I+y^ X _4Q$v1jm?fTfRԃ(KJ~( H^ϤH~jڄK R暬FdEvVy\l?vdh-FNG c=Ť0!X7f~3> 9,vsim;Qi;*NZcR$Lu/*P!aߪV$&6!츌DH{]Iw:ʉG[n9>iO&Ngu+'"w2}\*.=#eL:`vC:V}S$@a1Ea~ o8X ~)"rʽ@=jvǷEޥx2V#NXȦW>.Oq)]O۩/lr29}IϏ8>+-r4XcCҺb$m"b oAwRS j#}B I7{Be~љP"nuiqi;[LRdS.(}|Vo6 8W`5M$»򫌵 6PIܮv J'^Ϫ1=/1677tuԻ0Jp+5VFnQ:IMM_96 ԟ@7Aik_]NUrs!#V] GvisAU[ XW űf;xNaxa!uZB&H¦I&W']˗ZZ u4 Y5ΨzfI[U)@]9 ͳx4;QV0<.bqCp ۔tu QZEPpYDyD6T'Rt-;y äP@Un'EJkv4L}-yK6b24*~A.iπM/OZPJY NFtYfPmg@vV~mAZ*M$ k4HHqi0XQD8~g-nWj[/xe`EgE6z-3-puLp_7U׷u*NT+| %W<cߐn/ytc2V+!Tf(|?JIo1uIVMz`'2$S.ɽv0~9dkΏvMwcZ ,68oRZ ߳|ɴ>a.+J_ ⡧u!w Z]+aɻYB6=#= O|F'/`agh# 4! !inp?dwWx;0g_}+N?WÎū`zTJR<6h(p|r`F@z@Y 9-c8o6/i͓G?jE88NqwEe3t G kilcFxfRxxIc ԚhkuQ_t%0-[L>o5}ޜMg;?oU=Օ-3\U<\Hd?FDAQ S=uSp.;REb.N)(K?ɋPaiwqG~hT7+I{JeZ^ oH(Kpb*TA :HqVnR 4LyM<,0f8OD B r8K")J(ludcAnůV渌A6r2oӒ fhIei٢r!msj|TIR44i2jׂfD^% Z .xy+Z𹷃V-~ ڈs 1֐jF{ \<9Xve'*av+.HD׷u s\sR;}ɇ19yؼ{yJڣ1yo(SzzDm;8 9W鯂a;c0B1QbF.94almt@y7E%YT=nÆx = ,V=J wbo=a[1'c%yTyBbFsrzr~!&Oy_4M_~<HiqcJucFrN0zCڏS;cV e9{>3~&hzgZ ~> _739^n+6W41vYbr.h#dL6xƗ*}HOw^ 7*f˔ۂ{##VGt䬎1㻑8׍#Nn׹06EgYW!U\wMx7FΓur@W!=*;P  1.l4TmJ;6qL ך/6K>7.hGuT|LeY7 9FU?o뙿E4|8?J`Yo L+xrl:ӯSg0Zq/]s7W=Hкv*(t\tR`Q*jU0TQйSӳ.KZX\q0EKN"QY[eߴ8e)vC ]!CE1# !lQPZ5@Y+@oyұ>:fQN5vlV1 c*5PtQVZdUyB+#p1W飶J= A D;|V//٨oC+f.:܋NjTwDo14b7,/e+p|:btu?'jKok4>yUe9e¹"d:D9cs5Dv!{-;OyN >FO|tFSw  -}Xq[u0ʖ7.} k 3gӪJ|\|% zVK$|@\u{q-rvu]gP2ώyWFB=0 EIEȘnҵifȭfUFWz_aϽi>$Qs%3g/;Z* <Oӱ8!Z;+g͕(CnFq,PX˝NˍAzh0x_`Ƶ\S^^c2Ʌ:JdFG{qመq9w m^{LXHA'ԼXv4#cƊd+WcLϊү(Ӄ8M:{ͨRkR|(>m?pu7RMl}c<9ǴZf'ȮW~ u6Q:9P2HIKf h/򏛾cYA;N֭[l}G[q1ƜӋQ7γ#S}3ߊs|lzz3:uA>te{)8*; WujU+vk)Y.s:Oʢ SQNqSVQGSޢLP0/J]M逵,vg;4 (ہX.hdKg݄QU VEo+~kIPZ*]t8jC?Ap>>,_q`ҳ`bS [0%{8 區5^^$nuG_;U7[Ӳ*5ҙg{4VƲM'PgMʠ.sgVRIe-sڠ=թzkZSZLՂ8i ȩՒv3IO5:VO8 4e'?7,ɊL): hgSAh5PbVh6ՆTT[q`J+M[F0[aV0´hQD H 4/$ eifT.8KM4@0m9V+vMۀpj*b,f3촕&eQ& q/]r-ńo?9U/\c77pSUZޟ}Q<#S}Ra໕j$ʸ KgEedwk<<~,m<,mbיgҬ$Pz\ܫyn_o6?Dy (+3Iъ#7=rfO 駗qW'1ș8jQcyy &i$%9*Jc˧,{ue\)htj|טӬ8_^$8S 4G]K̻]5&8 gM!IywnTK̝R5mG&{{T0nN&g+ߐ)>Xosgt6ӽo>G9w?;ǩRtY'?fuo n8Ntm3]v:ӡ5S=(#N5@1F'q^ cRĦ" MQeC#WEϴ7ecZ}ҠH|\u=]ge5+q}lq (-^N& @TMwD@nMB|;_FWI KfaGףV}v6~#Re׆7`=G#_SNieiވt IIU`]!Gob$@9`Ƽ/W6PX}}θwͫ%{QjZo1Ơgw~u: VRbz8^dj'׮*;FccP5׮^PJ]NjEQ@fڭVկ;%|ZF^]睤 ߯j BUop#;.*SR+zf+ 女FqT$F~iUU~= tzq7yAê|QONLw deZWt1"hDPUb-ZTTG% ȣQ>Nv{9%P@_@nѴ6.쥝@hA !w/z"jƽEidbzLμ#e(C3ݱ{ݾ!W5/l)7p3gmjAmθ#v:S}c O(/K=ǛPcdQ^2:TW(&)rDS>y? + JX;;!wXj}v|*]gQ'Oϖ(YFq<ֿNk^avFBGs_w[mQ8t}v0ȓLە'9l[ٵt9vHIpӬtK$CǑuJPޕR374&]+qn{eܶW8過~xTXupX;4f t=U?c|oo0nȫ6Q |E4s8-mA?>@uq{櫰jy. 95\l67 =mԵɩ^% 8Om>C7 ~A4k> >,t׾N-ĸPcC8?6أ?ZcgZ0s/ߪ+@.1O.~Qn ʽ0BKtmuo}6MeO_t{\,]v4Wq;QԢѿi4P΢E$xCeG21TdCQ@a]C7\Z\TqaP:?(h" WnEmeQkiUY$&մ6E7I3If$Cw …ʅAb6 ݸ7JBU *??sDw)fwdy{n4TbPQL! U#v"V|.U/aRW@ 9j)0fa!0jQAѬ|)Q~E0BXD )ׯ5Şzn:ۀf=dCJnF:Ὗ[)a}*ʃ_ J !vΑ:y{nfz U2L]4X9ejt|'a %ܿҒW8gL?Y[d^Ӓ\pكB^srJ زU*b[O31]#8|PZU0)&@oܞ "K Aʁ-_zX>~")dr Hۍ 3N.=6Bt94l;) u (^)iBF$;Gӣ2muq4L)>K㜸oخ3>J=7OLŴiRCRoI!Zl9wXhHCZ#. j^X$[˓qH?pGG.+rBb[П0 @Q( ^lqgd1dYX^=9/\?`t=|mQ~4? 1>l'i ]䌱olV,p"C9*ZV∣!ԙI [CYSa >?yM^`d/RoMTw?~sf:BC_y\}x_/@WtU% A,$AN[wW;Fl؎bĎg"{8,( ;)RbI^dLf3}߽UiBq&Cypt-w߲q(1Kw.[.능v(pIcV='kO4׮nZƩ%ީkkŒmU'NՖ4kkz'W\Yuj͉'>"v֬!۩KNcuQuKVY}(NuVDΚFĚbɚSKΉfsɚSk{kZ8jm}F٬U*v)hT*jШգ^Z-jvOR)MfZVKMlQ٪*J 4$ˊ,ɳ^4fTjA#K4KNI<ϒatEz[NI:΢:Iq{ݤt -eF'/" Z!RJ$mFRnܨA# "O{ݼfYX CU?| LQ:Q-"0dI׼ B҂e<*^(8߼j.x2s/e[ sGj+.^Kc}#[Wac|ڡ [7'6u,fu9w}n3ߌӍf0{Uo)אj}Z%J盚6[?g73?vt9F1cս_Qo3?@!*\ͩc2CsiiyCz= <]wP/$?ouKkOQ]}E;1ZՃi36ȵxOS|o^EۼYгS#11~1G̈́?wU.{ѨaQ=']RkL=јiۦO_Ux-|׌pڍ;4W-J c.B-w:gBΦtWЫqoMsgfQl '4x'>4? d;z~}'q\F5gNr q%ԽЍ||`d|VcY9jT_I5/HUQ2 ^ysCu"DY颼ung(rQ qa^v;(g1i*vT3s w'',jEmѰKEՃr#y*,MҸ ͢4Ybx4ZYIQ@'AG!Fy7( | ð\hF@Q;6ȣvJ3 Z ךmT]TtAWШeܯ,zo,]IZz;jS85Z;`5ŊYGL0k1׬;rϪ]MAB(VZO%۝Sq}/;%,t\g,^=V Ѭ0ʱ{hEc2ݏQmn82Dہ*a}v;wQA!';Z?B yu=<}EuTC&\/,uswmAwcf>ܥ{ )y[ 1,˽'u:']m`DȻGyEC4+̟1໴3Mq}Bz\Ov_Dy_%_VwT ;ճs_AFԦg{gQ|ՊXR^}UTz}=+^A+C+ܿYhn}Ǖsxq3]^5QWn_4y" %'sa<>b~;v*%.AiG\- ڴ[o/`i.~@?;CzIwnAPA+<{4 M Ⱦ6T nv2a!S66W=+gƟuu?o<(4zc!7ffY_Dըƅ;Ys.Kc3qNԪ: N]x]B#8ũRRial ?jPEf@y p]Q)5*ȏ-|"qBa(a1@l)2; udi&(AG / 7i h0&[svAq'r!-.da3dkjq fd،&kAIlq@mH:.(`@J^IL$,|1wĞU- 4t */ZbJr[q%-;}|Lp H/13}UY][e=Ua>[ (Ļqr(h{)!>ƀOi}t^aI+&ڋ6o3F|PzZzZ--7K|Vҫ CmڍoԾ:p =,dt4Kpϔ1N~dNdbdܞøjOY>q69 #ムW "=n\(>=qzl0_77bϩ`.pk;"ğ DPze(oEIM݉k7WWGSw=0HVr9'/}owr*ϼ УmI~ ś5>w= h;/!i 'Pyו :8_8/4.'ҵ s0xJyj67;p]k;Mz5ʷ1WaN61It.KWtso+x-]~K͋M$8PウQϓuwjkO-P⒴\y+'n*,*1XWus]N;qM*ruf٥TenN3T5:0O+AhVJV;4ҤYV!%"Ȑ1&D0 @XRTYkͨT5f f*<V*]+(<#w-bϣ6$qws߶$faU@fZd:aAQѮq?B /o+.td{+6%r]pmq};<&O2g|P׈Ly:>:qߩ{ ]ZvaStrE2V uGPasVz"=+QZD $l %10,܃^c"c# +!0_|!$ej3B\wbgJt=qWœ-ju$9v|$"j|B(o{h-(t K4J~?cE8m8nPmzC9KZQ]{o{_5V_aIv0Xųo¸7V&[G]W\3qʔ^FzX\ą5n1FzGĿRf3~8N=2_q}3ߣ5JhӨaFJݟ$ǹq܃2xxOD۴͵Ƣ]؎gN]R#hӎ9cXp4כI|^>Gj<ύ>y*q;i7@ ꇔ5GFјxkI AF1>#*3Y4gbwN7~g`8|GIOK2jފi8l^ tCˍOjξIõSQ>u)+N(f0zqJԳE.Nt-~a+Fj+ {r.K|6oMW\p2" .42<lȗDaT&kp (+M0./(jJYB"WiU5)Lt+u@ueJihPʙVH`dQhHfB4Jʓc1n7V=~i&,R@DZRB7 uBL nNz=|PZțF7HНA0Y+IZH[(SIbИEcjduZj:V6l&`D0k5 uDI42mf~\j׬4j>,ZoEĨs-qu >+ }J羫kM5TQm*O9'|:V#靯[g^מqzoW||{iX6Õ=Q-+ Gb "C[WmLK#ÍgPf0ggOڵxp'r[W~vQWbG]/JoR׈0>ۿ=Uw1y#57>u&5W_f/\3󈀷g/s\4 l~W?]O 8jgzдN+uR־jڿD{̟qt.KDip6Iҕ+zJ<ع6/U#\R٦&f(nP)MU߯V^/Dfnx8%gYNS$A- VSuig;Xn9 uΝj%E"o28$F= ք<ŵ]Lw;^'dQK)^zgݤ6A~NUV3 {Ig3ǒ'n7[ =Yk4iR݄MӶ)=Um2ENAmHtdEt?LNܧU-ԕgt">SV9_)'Oا_nw8$@}]߬_݃bÓZ` nM}:own :UbVeV2n! CqYCW剿vm͝S+Zo؇tc1>%=ZSMkqu61iUXq8[ xMp~6gچkuX 4lcL@U=#t9qU&eW٧܍i|]|nB[#ŝ3Ϙˮ"}=Z zWC!zCeUO1ppZmYs(wZP x;GV)}ɝЌdڔĮiS^oFIsaO{UhfxP4ބR@qIFRۓt\k{7ìwnO#L^p >2݁k-H7*755n|Twys{\5mwdѹ.GuB *1_ÛD1~;nzU\\Q+e L#y<<ٍ-@ c&լX4Rf1fIۯG J+$<B[ոFpĶ̯ bc9Υwj:+ħ(Y8 }/5H^]ًCWu,ba3l}(*Uz(Ēy+l[eAOFdXo(4JFeZkaFq0$ 򄾓$ڈчY\*ڱ+G==ǥ?@ N朜 HgAe?b٣g߶-wc&nX7kux8eWNzc3898pިrqw@|;KnL,: Lq|`'ݩ{bN5 Q<*~܄忻@ /yOJKضo,80hi9qedh696k}ҭ| Nܵ%>)Jq^qlR@3(E໕14Z2?lʙQMʻMOϨ2Roi8}GyXZOkal4};mgw>'齭2gW!Dd\"ޗָQvXqO)5IfiX_k4"͕ܿ. Oro+1fyF[,l&й>̊{o'Xȏ2ҹt.M93NYp貕W\t? ;Y|+zZL-AL,oZc@aQ7 SmRiU?Y"Zic._7h! ,iDMҤu?f]$ "~v,2Tl`\<&&?F!P#_L;҈%0T^tu\%) ]/_,M8lTIXҊr4A$:Y[qZ^0x-V&'WV Z -iTL7YFUY@AJhJ׷_cM[*"(74݉ t9њ=8Pɾ2׬>v zCcǍo3RŒY=(q@\ByETӦoeྫv8#赯lGox/0|}yNnAZa 6}cgVoqS u7;$"7èSȜEܪ<kp [e} ۟_ÎTOla 6SS> ;s#OJ<3peF7ݣQyRz6ROG1 pЏyq2'/ug w?zg7ʽY<{ aM?qKߕipĬK.&t|Ɓ|돉w(lu-a=2 }ܡ4"يO2<}˜Kgz&Pݱ>jfYL߻t9/|v Krҙp]{-up7Z2COZjp2L1/ժjo$qXZ@z֢qPFeLu8h4B  9FT-5ޠ&P֞7R)MalQhQH~e|2ITIVAٯCD@Mww/Ěۼ_XgV 7D࣍]hT{ Y*.+Yqƴ[ VPZF|T;4ܿm#PWH{[֬oV39,V܃f7Z%;rFi[U&jġWC3xw0~FF~ Z%#!"Y^ܧqgG%O_-6}1&S/$T_4鈷yk=lE_:f~ō~7QW7?+'L_|XV,V1uqUѭcz )۠(i:14)z͹T'-G-wDoe9iq0~.Fl>1釘#ƢY=Ԁ}Dlu'Ӝ'CfLю~6rKc&XǤ~}0V#$xflq6Y<8mďaPGILm^͍?.YqA^ZwTI4ƏV}$QUzm$R='T$~N##@{8y;w; AUhjݒ}`o\݈q<>g)v0\R9v|=%9j2}I3ƹ·-uRø/Wا>s.KoJ,4bZb !ҵ䋉ryܴO"uџӢEtiw"YD<#”{9/?!X̅wY!PEMꀁej5$eYigQwRNM["/ ͤ|M ZشCVT$S?K|Lw,IB6¾JhF#P6c*C>BE]Oe1S x;aآH쾝Y_^],\?;81ou| bFqG:+OL˥e?WXv8ԊtIHHSWX ^δ׽]wuvzy,&e?ƴh?q':5Qڬ]ig|t)\Q(tcAOFĥ˵%i`b69z@]a,4 +p|wǾTx5֟3<7^ ct}ԃtS-Cr.~\^=%Rg r="TT9lj*igmEv{=fV2oEb yXqZj$׷{|d`iOX'x`Ռgz1Z}l9/ߎURӶ=gx:8=0q C=Fw騛x4m=mqӷINOI`4#U =zXk2=Wmz]uvx?fP?&t1AZi2Kכ#'7)Y>l^'/qKI }%ԓھܬ|lT~T7Gm)iqh3>ΥwJƿӺ~٬]@_P˗v_?tG/4J {$>Q36*V4Z4FyAѷhq;T5?E}v2]oER+FX&V˴iN-T Q<͏uXGq#S ȤCNZjQeܣ@^=<өz2:]OF-NCq;فaNj_44f@R'T9EϋU8)zXӨ7GWZqE?Vs_WpHVQĸUl`suwPjM c ³+H`xfnɆy|^{SH4EFwD@joZhLeѰֳ|gп̣c8$8uծ3UȶʫIHȵhVw7Nzm#t}XOQyvn>1r7'c-*,ըP]c]֧PUZ7!1'b}Q͠ *#Ъ/*zJ=A6Fz&(*Yu$TMqQk]ZʧgzDvPao-NC|"v`5 }Xw;ShuT}^ \+8ۆ8 .c>;>5 6Wk[qwgFћ=L?vX#r ۬ u vBjC֋ϫIj~ ' s.KҏOg=YT=/|//XyYJ T݌22qtMR(H` `G/NqcՃ('\~JyH2v@*}=f9`}΍vYien@ Ucr ?-jgL0ꭕz$-t?-Am>ya4^Ao:ecNxؿч}Vv=du@>"_?Dp t!lکֹϟAk*97 m 1wܽX1'g-Kjouu[ <pe5bZt.z:,f:lc8*xG褐]+9^q[i# 9 9_0OQ~x{=~]ڔ{Ԧ*[rú.l66YY`t:ަл]Bf&Pr=Y 1#o_u4܋O ~>"|򀱻&U??v#7ܹL}UCz.'rfXf.tn>).=1@e W$ᎆ D$ %::gڋx>ȜKOrn[/K-˴גV}yjqfi]񆆩U0^ v>+VԎ'ݕ/ (hQj đ6$4賤w{;6 SiBAb9$arʊ#ϸhyX̚7ԼqW.hsXkN3 6idp)<7`!c%YHa"q7ceUU qVE'1Ӫyݱ~+ߨ3`%m ozG+3}Y4 I*J/8{gkBxʛJ-!sV>R;tpGꛜ6hSܦD$eVNCj>l3YzHJV Ic.icƼE/E+, 3~<9apJ(%׀C*_gSxh2^<>i2}W T So8Q250v@NHUןSVP 3CYgpɉ2 Ө K@3u}s#-UznwH#|rgP8+Qf 6pDn?MQ_#M\.k8TCy6_#1z(U)%ηcs:wRлlH Z5SRWcmlXޅ $'d7U6JZW_WO2y?~SΥs'9}a,vOV\@+m_5f ?r#y+Nz'&j 4jl6Zcf}"()SI2z=.O?e$Έ!;awҀ!JOfI3hɂ%Ehq*U hrҚ)`5eO(JEh4Pj6A5n45!%%l Z ϲO( K&bz"ƍ"h6AF9.ok4ʊS:g(7(4N%ܚ:uzylѓ{0vSKtMKb"h]zVJR׾rq+Z 㾥6qqMw,D2ѧ !ҕNKT{h]TuY-)-p.o\<5OMPzee;,Ha)oFW1w|ڏ~^6Pv6I Z1{y̿QVٕ:&q:[6V#*̗2ʼ ^<_9qfm*Ǔz]׶~Ȏx¾ޢ<;pʗ$GYF-8Qgy[Jp rhB(}H)[:Vz%`;(y宖WN#PIE:ķRGNZ5ʝQI(4~>#9yڅdy#v e䲚 :Pr z|c7JnfdP|zR`:>lϵ [kӢg69.v;Wßqt< ]oA'S{LlT}<=,.ܿv0(5ƣ= P6"xڝUV;uNηַ]&aUh Dl R47uO޸Fڱ/̏\@_rߣcYd[~_wBR. mO۫oh9"Y%G&pN:i,9:71ZGZJ_x}>8 2cs/jDH3a3\;)'r>#\n7bnE_} \ܺ˜Ke3!댅r9KWo .3y ;ymKԿUK psfAa&'[I3˓$nDž|JYbwZ%:E|'҄ 1J'&C "~Da2)cE%iFO,^Im+'$j8s MKU`~y顤-t^x+hs'BoM\:,"JK 6Xo圷:Ix76:XQlQ8 F څ~}'tEtz@ gVzt`l"a鳊ɍ-Z2}%)yjk&me{) ~iuɍl鳀}ƽԂn? 9ʆ嬞ay)ʌ8Is݂YÎ}W V~Wk.r9YOEMQ"M輸 GţR{\ ec>Xy}4Sʐ^ԻVW9vc/0w\K9/刟u>8h3{,9,VM1j gAi@˥z洢 救c{_qp[Ƚ΍u>f.Amz>WB=|ɗ@UL,5ף1x*0aoW!c=i{p ke7{8>ZEش^QiVuNI7ha<+x#jX9k)eYhmFy, Tp"O$rD_Kr-J~FI~ WkBx`SЬc~/URn->0v6VкW?ߧ4ou>ǜgt˜V֑Ґb 2Yi/(z\X{541\(k[5sDҘg҃I"'߂'8W=^.hTvWlTI#+1?1oB{? NIgvn.d4y7:tgFQM9'z'<~ni~냾!.ÂaF)X>0=*{qw=r lHzsۖ}re#ȹ^cBuGMjtq';X*}_4ZIX)io9{ggg<;?@ߞCƕ8hc,P (e/˘nm6z|X ֬5V>l]4YN5n@7en~Z~>gਜ!njfdl|(-qVANfM$H6ZHP]}j y[?۪Ԍk^C'}صڳ:5g?V=5Warc8FyynLswϦiEagm&|rm*g7"2|~}n >LdOsNҷ \RmX9tͅ[qgs.KcgM{U֋/`e+|wzwHa{g"vU۠RNF84d~jfduL DT'9g$ ~e҈fQ v=JVFOx@7foW0nq8N=Lq{r4Jv{1ֈ5[~3ւFժLV 'C V'INf[y64炰[mƁVL6f$ͰޜW*AlL(ɱXRo?O~3HV\)I"D8`tnnvq6jA^pVx;lmw*qً_Vio+f}:-O \7.%Yowu:[ʛ-vL+'P%"  6ϛ6u)j<ƛkkϙ/vJwl TY7T\\[gPdbƛ/JK6N#?ֆxx/xCnOȮݢ[I: CWKF.KU ɍ-P,M̃us$)\(:ʋLnK)敨;P^;iv4}8|jN\JVqmbH ;zcp|܉MF/џ7.4GV䝃;[kT>@РmآPsᰱyL6؄FA\tqeVȷ϶=+FqnZƍ&P} lSY*kORY F\:3 ZlŴZzuj,vð s}$넵=guV$šT)S\J-aש INae'`4r, [e 7)$Mڔ~fI2969IXǃF╧kqL۪ͱFeZm3 ^Qw"A'`2M *vdVDvZF@ewv">kmDQ9D+~Pa ܮu]~m5d7mJl6-?V8WAC&+-:r9r=nqxS/>;y;iY'{|њl-g~gsu.q[]&U÷mwcu_z!-X,IeBʼ q1uEO3z?Vw"x2-/O2:L|ؙ y::@eK6vjziX)j52:{gR0`:ۆok$Nw; ]aEGj@Lp?O."5N3[U -vk@$/eVw{Cwm_5+ a\N5T'?5+Lr3u'C"fᒺv0K0U* c ۝r1ԵeyUn?O݁ޯRѫWOnʚm-n-ܣbiv7il^c26y1yXm/x%_Jol@wïVqEc-z.-Ը x{qv,W:0}@&mḴ]:@l1ls/@{~]'90swj͸^_̀~@z:͖+\3ϡL(jkJ.z4G I@{̘iV6b |o5*opnxi8P3"X-oU _UvM݅jXq{f2l6:ޮ.(w|nB#b}-/IY|MQwu,, 59ɪ|QCD2ˎΰFd3hx=ToA-Rn.k=A_8iL4Fu_$DF_IՓ='~ul'J=@:OBa0jӤL3kC _-h?i&ff!;.j˨~PgׁmH4rA (1Xk77RGAVqy9,I5/?77f>+5VhǦJ.k 3#o/v5R.;8r}<6i5|}m:\lΥss~e/}e\4}g M[4\"4v'ts ZZ54K?=a'˛@APyG8xV~YvzE"9x;9iEAXҨti"clةE,]Ҽ3Vvb>"LS!< AT @22>.ދNju їV'ʓD=,K5ke Hա# ^\~ͯj8M+jSbZk䌆%y+ho 5 q@aAOWݼ'}`=a ZQW!,<1Ek>jA%3Åx#6؇gkEGQw0e|ߩمഖ(jq{}L~ pHmo_QB&FȵS*q#׍U$]PI-en6 Ļ#Ew4ȫǩujpoS۸_6EromKVs@Sz=1 /yqv-O <Ŷ otI3دԪ_<>-hGŠUKs\s'8z,G*SVhwjU N:ާc`n(/Ț`]*E?(R>6J(n-֎1). 0bG"QE179")mWw6|f_UGJ}Oj?Zo3WT~0,c^|JLHƫ.a}z8jUœaxRD'{CwSh߭׽pL7[Grt[<;΂od>K*mE Uf|d*W ` ƴ G@1)Ͼ$LJtDs;8Υ  mTa]~᲋Hn=Ye\ybIh5&Sԝ7zyjUF4v4kRԢ?Zv9a֡|4^*mGiL1`#A\QT2Qʋ0p$YnJʯd>;-ٔYr~)02P8z9Fa!P*@m64QJ{_<yR;A*'~ d^/[/AVg@IۣgbYLizUHP`VX$@8>~[%( 0Z: A&i7l:33](mQТ?/pP\EVh!-!=} ]9y9'㊩~M^Ri [s_IG)JWCB‘R &5>+;쥴Poryl t_TS[[M76~6_g*!aqmPЎЗ]-E هzw؂\lcYmCJi3۔800|Fn }|n[TH:A' :1.];L/[zVz [dкbRv}&xgt=CMe局n!8AʑㅴJ|FcYZ>Ѯ#xcT!(byJ\U=rk74 u==2!5<APxX_"f3׵ 3;Th)vbc.M]:o|. TV߳&ϨG_1ο)Jg"/?ǕsYd=#kWm\#(<~.w1(cyI=ơr8VuRӁ1xH* ?Xwv8'MWguCN>,&Z^ +ie 4 ..v)[K*mS9%A@NuOi_/iՃBC6_wy8m8^\sv+JX$2"H 7I`ȂZ8l:^'%S 콈%+qIxd}gTTSo;ww޲f(?f׆yg-]y…]/Z|Rɘ*`1+VOj8zze{ՉS'W:uV;;jxDmŪN/>wzW+ӧ>U+V8Uۧ;+OOuV++OO;'xz)TS][mܮvWV,qzWZTmũ4C?I , aEaT8kE%N{A)y[VNp[RD08,H[Yn'y<a8Y Z!E\5Wh9fnY#4G{ WnW͚+h-_{joڃdԖk9a3̘Q̨;Mef1cf;>1'̰rm6wf|1S)h{|c6cf rl0/ܰ4bg?eQM܆+\#zte}kWnƬA-=|A1@1'zۄ#*Jg(uD?§,nf.} CD_&я!QϦ#8qw\zW1s5ˌ,|)ѷtvksk1#=}V"IrvPh|yM.zz0ǜ+|;JtܮgeTƈµ?gycR]QU4f+ZR&(cx¬40h,* i} :͝#h4ycVzqlm50Z4k;FW~kcЯ,g{y ̼͢|̍v܌э{}_ 3W|:KoU_OʯhTd Qŋڪ'N'+;xyTo4a|܏W-?|toEԪ'k'Wj:1np߉O'zj+jm˗ǝU+Aɪ{'vQ-aH\jGy#OղSoqPx (X83!ąN'렖vxUki>TFQ*ieQ#Zx춻EveaT̢8KIIL5@͸\yY^ wVbS&q-`׫~^ ?nEQ$e 'jD6Hq4f h2L, f g D~.4؏Jua YE9 x( 8KpfIJ\*ˍr\.]xnjR(+|%>CBMd=V)9S(VX;w̓XF3Kzi>ꕰn;0VBOk:[͠mNw}mp= D5D s"*XoڻC+\P l[_1@,Cn&rR˷7o籚> zNgA;!cBa!o Ox,Z&N ks*y?%2վEꕔCz$3g1.>ЛBrK޳J$K[B1eR#BGҴ8k,~Y"j:cG{׈@?u!&ۉj3+ϛ+Лy6WxOϚW# ]P*)|_l~&gpeRx7w~K?QV3*wּ+[O*+} 80}\ƄyfCT€% ;zs"Ǩuqo{ڟp3ŋV cYqO{W0Oum(ڠOׂ PMe\_u1k٤QI#z\^~ѓFs\l# HuǸ,zܣ9$=s/sfе9͟aAèycwY N>&~F0ʷk;*==F4Q ޘXo<$4@эؿ Is>OY}(u'eKB.J]l9q}qtmzժj{d{EDgxV];Ԋ UOVOXHTW^'{m~;>9ݮ.oY\T|?K*jgq<^VQ? 0Ղ6U(lE$aLim>AWjEaN[Ft 跋N;ofE ¨]$EBvX |Tu:nʍ7P_  .pbL "봑7?͂h> @ZNq:8N xMu(ZMZ Y0Q" {lAط`v-AaRaV*zYw{DU0ȇ~+JC+붺S>ҙO.Rҹd_ JEC\nŠδx}VAh ٯU oZb'oTwQKjJ_'?3֢!h5P֤IQݦl ;o a+aB b^5q x"oFȯ"6oF~O'k-Z&J̪k$MfE}GYxrU֧1GdA #B6Q#ݡVO;~Lی|vu%ۅR(9qoz^SϷ ˎ>5]wmvp F͎Cn[C(qqK^!"{٧~͂1 ;Լ&4bZYi 8~C9Ma+ڥ<<?e̍aqj?.wbRAw,(;qw 5v@͎;܋l܅T`?-6u*?^lr݆vqFۦϹ Փg_Wzc.(aGF&w (:kޓ9:Q!\ݮn?;zdL v\&p|;1PZ+ȍG_Xz2z5J}h38Ōۨ~&ξô؇B/(xtmƛ7daN/Rgo(uK/[zE{Ry| WEVӢQ6O3sitłGEJi6Y &$MN R5NA_.ZVKYQ :k[(Eh5 R%JK%6J~ɯ՚Z'dyǵzxRKR=jQs$m9i)muJK L񚱓ATβ n_~q ( ʹZ7RQLz7Ҡr QAV lrԜ,O~%,_ts C3 $( ,n7mRF$qT/jAN.PgCzS,ئIryݤ:)يiN!ax ic}瑢~Xx~}'蘧O/>?m!v-˼Ō0k=.j\R]=/pvsBw{de!ܻ BO.,n\tϪCDXp7$zy<_-C8E2-ICasǷ?}SlQۤ@J)|M:N\v/goLO89Tf6V[ſ̕4&K=OA+N到OovhhnLj#l~s,Z+ȇUPY5o|vfFP =ìX\{5 D R\e;&jc 4Tcnȇ2'㨝D(cE8Oy0?cs-Y }.>u~D!~"pP0ۇן5k~G" +uw3z=I,Mi3ʴ )X&Lo.]̒qPu9Χ?&`ʟ;0tᲅ-bXv].\DZ$^l'F+e8d*Qk$IͰ jdW$ޒr4Q`I@P`3$Gi܈<~V^ĨT8F`,I`|HՃ 8radiތ,S+%?W4Z0Ih3ig(,"Ma0I`:$igp ŭ"FX&ZADipzZ0gFRmEڍZ򒻦 ]VK@VZHYWC$$o%\;s CRr5HXu[}w Ipuݎ5N]{f6NuJEG^?Rswx9=৽B~G"aq (y/pǥ[m4c|;ob v л;x[1@NHzߩnP/}-Ş5DyQCN{R#'ݵ޽XFEW*̬5")Ò]hNBWӎ@Y*y7z9;~Nv@Ku*ATە*ԗ#?m=G44QAgxI 6'ЫusnC9/ŝ/55 P[)<wc4;ΧoRwԭkxv?wse_LengRz2^TG䟢p?(G'y~~J*?W~G@+ F+G^}XO"8pw3gsFLrܝGTCݡfe̸Y oKϸ|Jqh_fPhuѲ.[xEf!Ql$֪rV q3[-YSg[N끶EORTN4MF4 Kae9peےR6R 3J+4Nc8Jz\KiX8OE\[@Z vͩ ~(ZFdy6,.|?YVvN-i[(jٴ ݍvZ*sC5b,t܎5XVF#=E{\#B RM(ޚ6lG3:|6윣OFA;jMXb WhNltDC9$; ]ΆC_lf߈yQϫhyj.hoIm=QKrۉ>On? o (ڬH(t76K_ufh娥Gk$0,VP>!v:)ֿpуW0/N`Lh6<Z?]}!G)0$L#ߛ4G%#8!w5㙬E޼(ڠEMx @50&crz3Mc$" )ГgMҭw7c6iF}|\  5W, u=/HPߌfނnTxI@{Wt>O9gﱙ9</K,$?6H'klnw(E6ModTr:4(jg 8eq&dHFԘv[E#o7ZkwQ Z^j- ]4;8IR'C;;)-9HZr i#y!-iI]@MZtFA0N N$ϚܦD3k/XJZ9-Q]݈bW3Z9֢-Q O ~Elv|d`n>B Xa%q{7cu\.$"|Y$QΨ[I0PHR+?[Ƶ¾~)Q1Ҭ9}@gjT^Un @|L̵XmCk;4C;KƢ.2BoYpcF%-&#,URlE׮E9>s战[Ѹؽ3.}:u4 mwVO a ̜GӞfNdJ =&LY`ϽlCٔ4ң[aq, !{FTx ވƷEh+ceFE lRԞ5Vibf7ҕ}Szo|ѷ vT|}*qnBX;xf!fw'N_uw< BF*ا2Ӡjxmz̺ZcO9/Ap23R23}F?;uF! {֩D^O=FG~c:ZK Pv|,yqc?-=#\sun7 {>ylϙx#F*J0+>)u ds gcވ(sؓI3R3Ot>N?#Ϟ.Y_tAO?n7M:j+ BjJxA&9g[0.mwŢ(:y+a6X^jg(V"KӍ8({ i'ieDT-RT@ʴ@= ѩ `aTE5fd,GFPTVM.7T]6vyM֓N/ۀbAV68F,Zyj蔉鑮"CMV̆|ABgHӠ6VbKX\J,dڡ~@.T<'?P:ن<bBcrnhř3WZu9/g|LWi9"s}cڅ O 6`)4/w88:"wK>!vZpwsfP_0˓[ĝ6ԴzVzt⾾NΤt@&3U?Oj֨mzVq1n9s td;>O2л%:=WkGD3e&9ڂz[; ' &68ۧ9:߈@y]ڥv%zՈSܸ$(;.r&Lq< @\fcYNU '&~ѷQ JPGG?QCIK=ߐ! WwȠ]mlĕ(VStµ~hmo˚GC⥝ܦXJ/}DZ'%uXTr)(F`H[}tb;T3~3>e09V[s|g"oXvU٧nT}Zo[ 5ςoSz,?JgЕ#zF+?i΄=^jg0Oih:nz'b}w n_u1?Y=2u۫: 3d#Oz+xv|_n~0)94@^re -\tY-gDN)=q!v7Z/fXT GPP3.^ڀ>U<}e!P@&5?wVGVq,GL)sA2^-Nަ?NYBfW+ hPE3c}j"VqFeFy'gʚ`DJGq{v)ie@ԧ:AMw eRjh_F ek$%=5!"3#3\9wbhyqn6ۓ@#Yy;ܜ̄kn\n[-cz\U_{3֐ ӏow|Z=yS<Fp_S7_G]̂M[B5ZJwDO`|_0 jW\=gQ˄^-~ڍ4چY/7K^ߢ\ t456jGQ= G(Qb O1Q9 ot2ݓ:83Rpc=>ݠ 7?~"-Ts@K-T],coVO>1~ZKj?(҈kq6Tk!-$L YZdt ?^ aFyiEArC?K0AQ.OҦ<^& m~ڕ ᬟ)SsKq1Ji8mDyyܟT-4TÂ-D"`yYGʮhI^ḲZlgm'yfz`jUʯo]t'A.%gY<(1iX(+?|X)ܕH H˺D)*Nrg5w-;!~=&4Oe^/.Ou :eӷ2H fTKmȨk!PuVnw%kd\l<j'=?=#M9{ډifr$J3\O[]-)f2<Ƣ)5mnO` zvW~ ք4^IhIi?z )e0=_;YLͦGϡu D#UdGI-Pv̦d cVOi.V=3H:=9;wa.~q2Nӿ6P"]R۴e w@;yǖwn>'w6u|DJ6=Zq4apYG!nȋ0~+Q:a/OO^YD{,<(%=+ھA2aAݼ_17A?Y:Y ︱+NWKxYrGգ;5~tdT-]jΧ''BWʨ,\")뒁X0GqӸ @2b,˛1ۧQ hi GavK].eb4 *`0U=3{%6KBm2ƅpW~X:Xm[\Qqw}xYyS=(le};kߣs?4&jƓz6?4:<(-S3VtIsj83TC<qɻġg#^ }H,zj FJө9[ qYRz'_a,smR[m v chv-zb>$7~N=!,Yg& 묜.+Q7m/W5)Y+ w>׌}phȲvz8Pq88uվDg?H>$QY>@~社:3p]jVDWgۜv zͼ[h Zsϸ|<@cnG[Ye_5nQDzZ< cpr6i[k:Djosc@U=Ot>奕ũp.z^P--S?@&`h#%? N8l=K3ɌAfUg@͘ MVyIJ%' jwvD\!k$ 6Eq;]Eqt 1jH>+rxH$*jku?s4+MԐQIOԘ]0MX ׶'1Sڑm[^BG]gjkGK.:V)qȍҤ8+;~(ꈱG=V^'.cW氓c]WVx]uVy$o][NÌ8O]?i*_;#1 4wкAPa};(S1nQu1XԈ qTYqfR}{ \yPW.pY X,gֵqkKXlֹkD9@VgAg 3No:ǜ 2g$x h›`[+nf𽪕ݍW 4FxSCE-palRnTH$jG!,z}v^r8#[Z7QY{PYvC (q=僞= l1-PvYYm2g\9:G4΂unw\>8wBpq$")'>\yYkJqۍ8-bϛy@ӏq^3Q m|l]h=A=bwȭ %,Uуcv;:?ޟO^qm O0n~E-\D+ d1;}r&-gi=4%qU:r:j?'YGGi^.bDp*OxN(j'(hFi=[~ȆJɯ~5@:K|)K6kFUz©0'b95O0)a5,M,Ψse͌ziךIZ_(/hKNyg/^4nђO.YƀXQaAĐ:HOnqW.# Wc)UDC;J.٭3փGH9櫒PXy"E.?6=]d<5.73lVu'g oeLYwu +n]iFx80MbI\-z ʝb'y|+]dXQ+JṱStWi Q}WF\4;e#?e>EoV\kAOܻIMs@}~؂6U h6(F͓Wa?1֬+t ٿE _yy,ImOK:;6BYaԨXo dUJ$ ֳS v3;p9z~ؙ {¹Gq9 9n&Cߵwzf")|$N6Sxظ3K!gb%Bޓ_=jv!nw@7[FHt̟G9,VI~sΧKG뒋.I3ދުHe?g<β3r}Y~:q3Rbi%*@p͢f|?5j4&iS iBS$zC&3h'],-wrf*ĿNV0F#h$Wj6DaNj0U $Ga5 FEE?ki0EI:i;CnQLmwz _Ox>#Μ&(3=.5IBݢ%ۥj0m [̟zc-N匸KY_V˖ުÓ;[M\ds8uxf?JހgUQPdVz֢> &91PBb+tsNYi,ѝ:of1xxw 086*gsgS)6zjpg< cb M~Y,~tJl8>~̋S-_R0P;G\,\vmSq^~mYT]/2J{Q(8.uQd鳂j{D.]c{k P|ίAnMÓH GOИL]+7ǻ=`N auoXJ4hs>s)נOJ+-e[W4[>T]/ ^cga\5"\/hΧ鿷tâ5S/?%zŒX,pҾ}1cWꝬm|GgIKˁ (J5If l4 dN5Ie%"3i$Ma{] nhF[#!LW|rǺ DNVjIڞ[=#rIV侮.%h;5Uh#K "6f7(yV VT TYGQ(j:4Eٷ;2Y{^;X9Lv+j} 1cEҽ[DϠLIFĄ/i()ǰE6}hp-Ze,9Z4 I,l) ][lј>}mHE Q1|; -Y.tF~潕K}=!ټd#tfǓs8wa: ^Q>@w*z>-2w.ժ=$ÔOb6Lk1Y ;.QF5ĸGǐ|:ΧgO_cM/\zŋ.XlW@C?I4'j{U~U*f7+z9MT $Lܸ 0vH6#,1g,iAƌqZX0O,փ Ih4ZΗzG*r2*u`T@ZՎkWݾ`+/ƚ DkK~ldoa)/'Ϳ6vEƽsxGsc}fVuD6 LDA=ũS+-ZKX7jmVyk1}W}#q-аIH6t=/*D}ߗ,ꨱ薺7:~Xɺv.KܡndWϫ[P3Ζd$CXĞ͛=wŲia௃s~INV2s6WdooW%@݈1ޔvĽ{2ɟl {4k(.mP=q=Jo?u28j>U|,rZ\mT6=M(gi9CK݈bwhw:+BSY`fKp 32Pi+~lP1<3(>[΢wUVL_s/Vw/c+f r.o+${ . y]Zy&C-폈>iڝt)Y:E:Ε A vܯ%HہǭL~8N^06SKT~B_6ŗG{>ג(Χ|I_<ХKRxx''q TI 3d&etKnRJ.&մe?SA Vk!f֊6 0 [0HT\wQLԙIIZ`GMTޞzwڍF ӕO'L۝nmu(kϑGAAOiH>@c[YĜYJL=n6"sDxb4_2h Buq/4nU>7N|s;X"$!)D s@HZ;삻K0CP`xGMZxi`"0R E;}v:<Q*[D,cum{Z-f?k hsozNUP{R+j]#6x =m}{PYt]nwd{O|V rD_ScoL~D#E0;Yب zۤ]mxpFыm{@W+}0oU[7n/Xx̌,o/LZsߌqd͐5.>pT}8^2}@}^a7-nqG4~VmnQstoK:`>: g^PY<wn ;GW.OI!>D}1GQm,V˭n!8F#MQ>mi c7} lqPQ=ޝYck1 s~9Χ7~$= /lK/]f~HZ[%mQh<hBIdtl6G>d# 6yn/zD}-jӃ%c %dX©a#v4 ^aAP A2Ӝ3֓"+}YAE*[E;h |-FP]0LZXƈL x!}̔q=H㨡QXDh~Aw"E YJLiȞFIG Ыҥ?⏊d:ʆh+Kkn.IfqU( +X7;xb03 yr5"MF,k"=LƲ!HVu鰍 c$\$akôbJKbH߽"7òҰ頱:3M'zJ0RQz&Q qH] iN56_A=.9 =ߡ:  %þ헷Zƴ1N{t_$m/K\۱ 9qg܁[% xte~+O&/lNi&ה0VV{Bc:@zwhLvv>6>?n֚oaV3F*$>yӁ2)'%=JoÌMC U*͊ҙiλ' oFkXgOMgxExpq|O_lˆ]|eOTDٮMI2et2?`9n{c 봗wk ߯Hԗ&(߅v^X+*ZRӋ/V49qLOȕSPx-*OתfeRnx}<JxL֧A~!Ia+ͲA SfV&r͢\ K EX+JgΫƓ_ 4@#q ?˝уnrY O[~j6 4Ta.L^BTJF3ϲ8i⥝VޤR-YllI6bV:aj~T!:Vjz۽~7fn;ycݖ6ZPX ; Jm^ud>BIݬFekoX;|:.CAwAV7z]/~>==jL\p|ʰ-֧<}O#QK7-[V'5e7+5UD9@\Y^tu[aR#v%rk}¹^yLk ]P6bz}؜QAFc*PEc7hcbqcߡ4Bm eƿ~ B:r3q7xPJ/ W<9S w."n>lΧeMA1zSeXtKI_qtw䉓ӧxVDa3dDzLIp^Ȼ)/n*uQ`;m0.*Pd)z b߱UU@xQlFFR[A?`:QK40BJ>y_[$ aAl[FiF;vNҰT+M/ikĮUQLy 0ͬ`!~h4zٚ/nƍF-, bE]rN[Q  b-Xvv @\0P%-ΗIpQy@K.-1 u="5MͥgΉ:2FN90Y\aJPbEXB0 :],{daĞN:8DU+OULw8CW0hI@BFKi-{Rb~>l{YF٭m7 18W7uw ~mkړQǓ4u5Կߏ7oTE>ܱw+fgwu!!Q] YZFecX 8;!63b6 n0' ~C': ^7R?5W AWèy i#}mV~S[*wք"q[(Sސ[ī 4;v&kٙycJzr 뭖-%Z%n۷M/m!(ZZ䯓dz?rv-1n uW8gV[>jAM6.<ֺqu\?Q^26n8P%Z{=>{R^'{k@WY1nO}ONwis7|ȶBtFlBalٛ4ocC>Mc|:>`O^tl-3ȟݯRWMOǝ!=pKTڈyU H,ʍ;)- #nqSlm0(dQa g4)=FU &~4"%b;yʹVEi^M)cs2lh“IJc3+@a- hLu]ZQhn8){ fD3kS'zbATm1e-`@Fy,PϢ+: fic1e0 o TG 8gz}huv)F>@6FɅ~f aE)]ڨF2"ɅX\iՁ-[!t9 ֒Mu2+Ō/w*: ;Eer̈́Kv\Epd43\^W>/V,P\PϨžyһKl f{{,s!)=o&Rq@U? ۶K-BԱ ;y.׏L"4`YOK=Y+gs\.[y}gcwv:14jx0UTPY7P|v LgO1BqSA [5^Qˏ(^IJ sA({ߑ5fG{Qskԩ)~mC ;S}72~W&:pöGh}-n~K3bPo^1`;njy.(5M B'q*w3|:>fU{liKثx:DU@l =\P):m2JZmðL%?f!rl(-p72D{ ;JNMW۸) }b!R`6Zz*㌎+xrR](^{7 nϹ7?QmccW)eӪ}SQ,ֺ}Rrc) &\X!{O{"1][FkSc$@)ѦZtGlTÎېOÎVcsSy7/[9IZ6䦗1-}7_=,נbqB<8`&,c-ZGWZD*T*TDqTҜxj"Ʈ fYϫ Kr2A@I"_RsW`z+̵'W@J}\?!3>f1zJZSWNyaD|5Aj_aƃkMA<AO922ގy:ct_"hE|~@cGŋ uv&R?Cbi~=<.D͡Hoֺ~_m?bNI$ihtO@s|>OZ3u<}jVI dQKbY+@n, Z^րª[k}ozQv0_]e=2BC_]u&XK7{ ! (&@3nt#Q wֲz۲JD`ieٻoW̆SAxU._©Su_u%JҿAU2]TUR?{ˮZ`٢exeuܹ_߁JՎZ^;2_ۧcVbS1^[>b'V;ç}>vj|eQ'+ǖV'mS+WWO:q>?qrՊU'sXjyqɚ]'vmyqԛUʾƑ8v3jz}$F9eYa,M(\ǮvEպ5ʍ%iy7Ss$DċJɩQNN^}yi&APc68Kc4[F$I<ȋx4ϓ4yd,cY5vݨj:eSCe1&Ss+޳Pݼr¥뮼b|Ư[EjS| YԚ6v7ii^_Rg0nAOr_?E*vjFT(cB݅RZ{P?۟;P{/ZhM9. z qbL`V\pG # J{_xd^Z_/2=n6nγ(zȷswյhmj/([͜8^m/j/4Ko_wUVӲB}UPu̩#`5ڿs:uW>~+%?7˨Us dzN}AxO1>}Mw PR?ogk6ͦ1#r>];#. \X}ֈ,\a#S'Qdb:9 {EWc+VO+kO"g.NVˋ?dԊڊJdqV@+5g+)OyQ[u*Z/V'WWN'jO8~bd(`,"qJf `Tl1rw%i$0|kV{"kzx&-Ȥ R/ =h {)c0/}rM(N#?BW`$ A2NIYLrRQ9eBX V+i E^Ey:5B Zep7( GjRmvj mWKmJ!x-$q4*e+qv r]e'<\;It-nEX^5[C9zŞcm0vѢ.%zNz^;r6 !h`=9 [@ӂzڸob.qʴ`>}%H ߔ\)kUFγe xE JofeX•gt kل`Mہ Az yoY5c4fEÂI 9 hUc Wvihz^%V'ܯQ4f@A:@!''ܽj=БS@kd4,}9Y]e§ &crTcƌdzt=\[WjiɑҪs+_8A9ߛ^N&N Ȉ˘)$gÝ _?SS=o6\꽂vcNЗ~oUfפԺ 5@\z(̬[`.Xm>Fd,J2vHy=OfdA+/Nm<3I}fwTim̖3hJ8E0L7Ȯ3 ;͟ME|z>P3Thb1b;<&P Ab%Q-l_8#ww6)f wWG{@PgvQj߁'rsRPZ:˨hOynP} :Xf_5||8=>w=67x1ZU`@ KwO5(;fl/7'z0]K=/_uaTקߕV{-}xA,Xu8yx~U?v~^jh'W@ЕHt{# ϡۓN];OOIhzCPT*1+IA(Jȉ}ik6^š3d{uyaڕAq'XÑqQqn4*J2ToՇ*>q*[#~4I% D8l r¨54$ 4Gj2T^353(&(Ga$,B 5{Z/[mP|^̫J'd*W׭ʇ (-"cz';ܨizpnQro>xD5pu|(a4)3q续$7._LJ$|3,0]ޏ{P%jDžkp,j#Jw+/r:lj~51Dh.M|CZ&N$̍л}22grABò:ҝ/Z ӠHWɽ,rnWZ[#:Xȱ^̷Xd8x{Zi} -uuvc) g5ssHJ8%wX FΒ5uZ{wɼ ߷ W''տE>GOFVF ں#cN<~Ih.ybԯq]ƭmq Aa֗i+z;z>flMd [K ]E/WwGDzjUZ zsX^[~jl/NX~֮VܠRT˱l٥Z /(>M+M.všVإȭT&pZM\T#s0yfVP m;t%jȭu4Ӭ)XM(pt=/4j u՜;&液"S|8MݚȉWnxIS Yq"r|tj" V+O 0WEiA4K"KsP 0E$Mx>t&"INf!A/À\݅e%KV,M(eΟ(r܈ y#l7L =XJzퟓ߭AR?hs(!씥y3J'.dJQ {*-i'0MD޻P]aH0G #iJ~I7 PRfx 3ZDSFf'+ w!@H+ ܂6mM4dd!(K>4 |H<Xs̷zQN : {poX`e^#ʾS^Y#\_C"*} !>bc/FC;p`<kR'MA6V?roDRl\q0*hO`$9 5m@845$߁پӌwL٬V*nJh)QxV9"Abi)S v0]651jzo eLW8}Öa[々P7wB/y'~ۡJ2ƬJo ,x~P =_6[PFQro C~#6VE1@ΧS 3&Ay? |lAAUHIBcl>*W5o-kC6nmԤUPUxҐV4~pDt?Pj TH5'tu;VG*`gq*#Z uvZ:rp6.4jFM SY麉#;IҸEdvD%E븾`en'v0c:rϔ}I1vPs4vl>rӸIgQ&U*6jf)60HM+oۙoml~;+ZQ~CL<$(VZhS1!&m1k*BcXEo?r1hRHHWdm'`ފy%ִ8^ 9+qC*zPd5'V(hi KM>+(MUYb%(RT=Zه :7J=#KC/lr<|B9ى:=EUE/4ؽ$I;j݆ۍXk#Nٯ!(Tc>%Aq ӟ0#X6j^ࢧ䕣ƕ J"^Ճ!/L;8ou}F}pH~M;zԷ1aG-µ^uL}Rn"kq?mI^ԿkvΌҨ틂;Nޚ.`*mh:2K "8lhW3\s z}^f/>y_>3%*2ȍH$R]s7Οpq;c:fgC+*[__2Hi%AS-Aj!Oaro0?`6EHq $aSy9Q!W͝_mڷK|C 1bIFt~P̼[DkѯvK(\ߠu"}f׶XW&R4>e~K;-EKg9~58ǖVqIUJv4f C۶a ?x6ef Ѹ iaͭ\V0LWR5f䖀Gn0l^#:_EE$iұ=/qUhR䔚 3diR-5HX1nj$py*ZI˫ 9ܬkC/ Ci2mG(Q@dlWVЛY(.Ej%ئh6H|[1*q}^;GE?g-m15s<Xv… `͋,rXWĩJΓP ,\;Bǎ"i4r;u"PhԺhhm(h)zV/ k&o#݋qHέֽ*΢>Ye܆zX="[qX6dή xwoo:"Bĺz,D2%箺C^RPi6<nK]/ YUwr xN#Zr3 Eqg-EFq#XV7 `$ZۍiG_yL7ά<`37l_eSBzlϋ-a{tiavg#ہ׍?D. Wˠ!Mjd">3)8m>1&TZWӘ]zvspԿC^o.(cfb6_Wu5(n24-ǚ7Nލ8Ƃ#'[F.T77O8[Y5w{DOԤ\6czjA{U\PhjбZz 9̸ZQǿRo_k^CiGP_cwD}P;0"hl1^-_ )U++DzZE=H\$PgN~<x,{ĔO[qV>Ť iʕ%E$iJ[@EAؓks94eMYcD`#76G" ͔4OgR7w=O0g%yG? 0reW\|/𣭗· aYn,}@C3׬ڍTŰs1~7I3Nli`MP/ 5FT rwu]/*A}(477ۈd$Zп^dê3_lth$T^VS8U7+l0VH=a#9Qվ#Yjpp*22upy9mհ3?=>p7 3?I[ W (O{EnrF0I1((ڦs &FEe ;mT? ۠aԲ cx0 t.5J2/UT@j7lM? ,?T_zgXp+Z`%곀?ZjZEARr>))*9OcJ0c#jf"*bm'Z{3k@|YBKE (6ʶт~4t=?j8Bkf9ጦ[ eczuH?E}?nB"棭]FQ.Zn$NiOO ]׍[(?[ FsvIP9N7πI(.iUAT&Es8|4MZID T9#R"`T5o#qv+ t- x}ɿ js1# Fzr]^6uMEP 1G, ~;!9iGUo`S:~])s yK$eYڋS?GrW)h7(X{扭]ATZ-aӪq9{P=JlZHkuVS)t4Xӊ#0)WqU3u{lGz<,78!'JR&SIPzyv(ψo={iO׹ Xo,SVY/HϪJJ˺'ЃuƃC6Jh%+'pn"m9FJvb0J@IjBJKYQgs׼Yv mUP?үv뢐g]7 }AuM9ƏʬP."KM%̬Nbk!3h ;2$}<|T[i'hPZ.l?V%<_D3\b6ͦS/!/]p)_]>1 WWO5a^4kQ'@bZDz-Q%(DW̛GG52 c*'@6 ј%k859=^TsqF*.<@!sT:]M0,r];t]'BXuC7if~-"¢3AiVل{yy>p=WGdReZr[4:-f&vfSyH\\OQ8G J^')qݓ+ǯ$VScqQj9ͨQUy|ڇMhVa#xN/\̪I%}D{ptHV`U^i}5:z28M`yb'g~H @_1FJDUxnGOI=LÝE @6U]K "g&3]u%cP5Z}: $u/.XwҢaY9.Nu0ggqVx(nO2 eG#Ys3ڃ1š0~QYe标 E,یˠoRׂ֊v}OzBʇ@n ͻNК*DSZfl~ st)߇RMsP{%k?*HMZ=1((=yAf-gfԨT-"EYKrzt$im^6}J[E桚t$Rtƴ}975_Y{䌈zיq=] ٔI t>Ҩ0-䳆OȎV07bɫmJYlz:6o(OPD#ߓNq(Ex>UU*9{2*:nqYZC DwT\rٸͥF[2@q-;ۤTų,hah)mOjQzrIWoH걆d|[׀VZg(OOfNSEaC0:D?`\#plOAƒt_vX)a:bN {%xit$gh|h^l\ C3Z{,.\O.vV#"}?F,nmNo;9T,%t0%no ? qp]VU,]#tU?>k?p§P}-OދɬtڿY*iVe-ڻ^GU "DWiTIZM?tK9o%,34'dOF fC$}UQ?#.5f:KHE¥j]ViR42ҼHy숅S4,L$+7(;m ەAQ^'y Gzr<qqղhN  ؏RMCS,Cvqᨘ[Q\7Lbz}NS)E)>EFF:>!tkAxܭ6B8ޝzI8 ag Mo)mm^9ڎS, FAծ6PūA=EG.(DE2^@zt~8t&~ii)!_?Jd(} (eK*B2 A4_òr%Mo` M`xzQ>f{ڇRKI}o$&= }|j_ۚe,"=rN^k͆-fǦI sKIE$‚r:.hB.ck}AJ/m~ fVM?(ris?:6nLjmcgPs8{UM( 793htްD >~+w %~םy?o1B*(?%#\XlG;sd.& ( ݄QAY?HNO^Bt˖.QW?JR)nOb'8͊SFA3s <-jLA϶hi~[/6Òkhj-#> qC.#'6[5)41=k0>`\Ya.a3{xJdxFDm/p?̷cmt@ﲴv4CYkXs`9ٍj:d `މ8##t )֧e'O|Jv 7yO=>t/UrD ^`_mG?ХYC9 u @e;AzUmnDnv)ezpVpe\pHWɘ%^,見q7"fݍm=)ԑs[UǏcE}I dx?5e6a1:/cRw.c<61j~I-J1)3zn.-v%LwlYe֨1?x|Cr-f='4e9鐝hRj#;QrHI1QNx0RGT;XgA}Znm`jPr3'bAi 5CWUazu;zNo/L9<83Zفmx;ٜWL}(;GFu4,I||* oDɝX<x7Ho&LuT[F6 \VWwNDzJlU4I ßy{ i p/Eq㢁zu|yCk%{MwG7J?FH?oW+/htDiji6(.ZtD;]WGa?@iHi}" 3QҬ5/s$_iqF(+ :z*&lQa,HQS3IEqql&i>ΒF5 d#ԝpة:vubW*7c?q3HG u[Sxv9NvkhYDl%qJVz&$qV6]AqY+ڨHkk$yak`eۮA F=I0OhZ u .^Zǔr\|v Kϳ%N"jv`>"?/ ,0 u (1?TH^.G\ʵE -4و>| #a  sz :$2˸kO8}9!/tJѡvjHJ\Y|K]+<(zS)iʡuh~oW/WB?X+Qk^wx # (4!r<:~U_6MMq]Ȼqz߮Hcu.ܡ:e SId+H4KE#XG@k'g*Zǝ06zSo~ AAn6&@z2 ƧM&PˈїT?~B =y"N \gdˡaa/EӒKtfw8IyNEGF(A;f ,;` /5GrԴ{غA](_c4\֯5-cR"' lbxԸ嶅uӢ7LwgT|y ۤ Vو5Q_3w̅"л=x^IMқy>UpٮC 뷨+LwW3f͛f2Ӫq)s}qodG`'Aa>ί U߷jNշ#IqD;^ך̎6Rg(NYT85׋OVTEn0m`8wj6Y&ALq+D@tPDtD)Ib`u@pScTAJ]RI+JPeQFuU6O|ľ`TOTP+U1 s5.a斋aF\%xT{zEIB,.s #ekiǙ="B|wpFXw]i.$}S3SE.3?%y|FӢRud3loX\*1N%,Eqm钆!*t?:&RTGi"{ϔn[}`D1ךS/ E̿`bhUddkBhuHi,ZviyF`獦B+?* th$Q|0/ RawH 0,HH=t63tW2MUdQ;WߝztQ7)z"z@WeiЛDwK+-vZ8un~3zy3 c؎N1'^Pl魆g}[fa0L:_R'O^ ^3rpw~SVv{ztO;`\׈%lzz:LWDŽr{r[2>_*8:n=C‰?SYlM߷[Ofn`];K_)MT[i] e?]v]B1Е4HJ9i=5%8)`H@P sV\*lDYo6 NJO+vhz`3XR%>>%i&* |I3euCA34CA6(F)̒)j `\-EE^%{8yBk)o2jjiӼhg_ 7}6\w(w5uƟY Ru\sfYNI\w!#Vx5-{y֞R.΄^ZVJQ!]I\j %m"qZ-ƛm7үN{č>v#ǙsĖ\`36ӛK k(iqq+5)>-<X[D>R]sR\aiɅ 2\$+mqVX tde׀pG-ٛfI<4=-pEp*k,푏5%c7SEq2%V/@„z^"NJ0ȫdg˱vA[L]߇ MN3ZۇN qr}WwWMEY\<8(.U7+G7)Q<#3(~Qu:ʑ0MsĄnFyƻB9mş*!WgpF m2j}x8"\ʡ?z=@H+[ ЌR8SRw[_͏( (_ EΝj^e9$spkƩR>s$ :B#}=*VjG| J;~{q_5 wZgnB?P7RѷQAlr) J#B I?\8B9O}ρ.`+1$qh | PJofa1?2](ĻimtukæwnUAIuŢD?SS~F~qW`Qb>s3GZo@T4=/""êc&ur6"97o (PޭZGPeTlK$*=#"__q?$. CyAq.ql,DaD's^^sDUoE߃Jq`{LtITdN \B/q/ݫJ3jZK"<^%OI V7Jīm5f1J܊箪k H+ ILřP߭76KGǓEAp{Bj+3/vcG ?LЄ3CUKyG;muA̒''dҪ}FL5biS-Vw8(q4spR\dMXh=ጸ PZ|Tn7ԟol1j*~v}C?O  pU}ǕFF5zȝ6(\cN/;\8ףQ1oB_vH+TDi;(Ηu1=tԴ'2cTq{' "-)PυC|?(֣wf-&r9P0m(ёm3%lxFaЧ;.GG<84G$9:p@;. 3jւZKb2z/E%cLȘEN:itPÙ P:c*wLiTEosQЗ+ /ϊ7\e"NtCjseLsЏ1I oUg)CqGϸ+0FY|Rn_D-*-<(5;?`fГqPNu|#=$ڑD]"Z3*!(uuP"ćf'qgZ}'͒Abj| 0s'ߚ֤j ,IE.SXE#>-Y:B&[ghm2q}C ]"b^֣#Qې=ŴHlwΨE׫ODGZ݀vS35Ը.3VZ9JA̭K 'ޠ6@GjxRN̔7Kj̆>к +e>-Ǻo2 dDc;iE{AZ)M!_z6֦BtK=]>΢7Xi(5^' sجď.1iĔ:jХ5>LeTWR`E1 ?)תr ͈6tBBlA% 7=ϙJ4`i=޵G:$o3b$?lZ\hGT}L=,qIJrwy(ޫ:)hZ_s{lX*eRrx±^`5$w`d@ x FD,À | B >ж'C5[M9k[Jw?u 8R so̚BJ7ܿNzj6ͦN?ge'9= .Fp+FzIܐ}qҸ}?h<,p[3ςԋ=Ed5s2dO槭Xl~+A|>[t.3gFW÷v~Y{>heQr0<ߣc%t1}h;AA?:?"h"@7(HҨT`~iԥ =iњ"G:(Ȳ >aZ5s:[uSJjYݲvȨRư^I9qhJG52j,--M\uϪ^:?LSXjiFĹ(iBZvPrDK.:e(w#YͧQߐ5!3Ҿ-7u?Sz3Ef{l4V:TL6绬iAFίH9F`aa#ט@^ Fa4{͂DJl Ӈȏ3vg UU|t+\fl1#t2~syA AT­bqNQ?gk209 Dq*!7qjg݂# %Tg%KVZk`Y}U8~# t]5N(`nӏ!B6ejwd)~9*x9x6J/Fvt.VF×J^st^sn'A[eYCaDٟ܄O7@#Ϧ㞞4HHtt}>\yŢ\xbʀtU|. PtT5(7zR~eQUʕzC"o1g ~|$ C!7ŤC;vCc{adKͼ(L0C7K0$v-s/ewĦ&mO&i"F0^O#NuFEtJtIsp7;sy ĄjۊhųT.Z,nJFE2ݤdvγz1bB1u^W &/qR} ũyhr/v.F]k[ʢG.ư\a4W<}ZJܧiW*»Zl+FY︮mjneDs Q+#Q?b'H]#|.HYKQ?pAP5"pBBۄ,kӂ}haZ9W>vMy\ZFg'F6Zc1Q1NK'@ ̗1C9q܈[3:%âMNNo7Qd_*:]w<%tSVK5 9g9Wh"nkSNfމF(2TUQpv(t3zҫ~Ij' UM hgYƍ~= oé*_{{FsQ#\3Jt"'K$*:Qžr͕S c[j6ͦ/.İFY㗐.I\UtEUN4Klԩyba Kr׮َtC<"Ii3a URZ Tm knI;0lMZN ^\M3^*GES:U*F-04S <6[<[OcBvQ9'ijvF"K)=PO)D]t>~ W544bі Γ8LIAOy  )mI'Z]+m%c+ʱV{t4kgtf% ^TXڤ2ֲǪ;;Hbswoo!l}FV恮6&qMvA]_Vg'5ڙ{UP.=rkZ#b0#mv܆ݳ_JTdG;^ F0T{=$IIX"(GlP4"el5bޑP}z(Mk E}Tzy,1wrHƽIJɕG,%Ewz 5#""Y'gPs5}%yQ\=Fԭ"^'*#9Y$njM*#r~3S"rtlTmHyeSӁ=<q^ňeRM#HȵKO}ZhQ\,-m9:י^0%>:N2 z1bS b:`ịmS_p`qDZ2d:A>}VxBY}P4ohH)ϣ/%c?:&%\ĵʵh3"%ȼgۙ<=yCfX x?N-}d^h>/-a_NBPy|L~+zѪ$:br08:`YO$;m]iϡ-.z22x7-YI?/,6f[B|jI_^x1-Q5h\Sjm %ҊR~igq:nyvv0K{dmx&b}TzYVY:w5Max61)kԙMlb"E=V _HŃ<Ăx^AQL~L+_9 S&#*>+&dPE)o)XF10IHB@_L@eR D Yߕȅ{VL^/Auck'syy@vߔҡQ;Ђ o8cR|GD;ŵEhEPUگ1zܳri*\ k Kr]!}4 FqOX'ׁI VG(_e/l ҠNMm9Q6xg.IJ^wTSSRn3s#r{LzfSL޼CL}+zk:>ԋ -i*StVeDfAт<0!L55u7⩂&n*+|0SOzvc1ł956u)EPPyhüEǏ+D,ۅ]Y&w]4陟2>5Oz,o'|<8ԲO85~jkvԸ_hˊTi/[T.N7זBryry1xSͨUOcj+^Aor<,=j mPjIm5~λR Ե,j|X zWJ,$÷/#(P څi6P~o;,qe7봇ϊz =ʷn7>@ P{TQŻ/[jI۲nx5њRU7JMGѫiOHxr?Gm'R}Hk 襃J??ݵ(ɤ_?,kSx% ٫wrk'hv8~Q#SqߗRz̉g >B32/xUfqg@';M:?PVWԷFM"msFzW+Гr_ke+ZkHL8yÙxJedFKa$xO1kfWES7}@qN?ym_z} œ]o: eM70*#g0 |XϏ+U']nzC42ޣr{?xCͦ4fNo6;zBˁ/B}ѿv*~DsNE];.VX^,nql%8/β0kX0oc9bZq3+VGyq&ERdix@Y8Oʵsq0f̵]oV쪓Iuif;mdi`i'wx2D})o i6׍4}O:B̢4%Bfϱ]p\/!f2v^vR-Jѯe⺞-_[ &o[Z5 #)@~CK&^tQjP7T3+ua=WmX^y} w{aZvW^ < $b3%9Tz("Z|Bu^ىOQ+ij+Y>:#FL#@!7"re TYӂO%;VJgԋhc DF(a *}@OJiqThrZxTM*^*hd0JPUpH=@`3TZ`?4 N@^?j"v,-]jO+I^ =Vn߻BﵸϘcx𿂱y (\w __~D⃂_B ;PmxP_oQ&l ɃCR%s3f'n؇o^=4Q)xDG9 j%wFhyXƟCGϵ1*"::0h[2 !uꤦu=r_/svSR8:@>|EkT??h)2w>mTen`l|ۃ1^߈krxnȆzY8lM?_Q}9x zk`KU/Z UP?ciCϘWC:||8qy'Ooı'ԶOal_^juFvmiĉz{SK˗ t\ډWqm{4 "?` ,LaZCCa>ʹա~Q8bCeIqU+CJٶ8V*Ԕ/" ¸2d$΋$+Ҭ>p0t|ǎqky$QAu]4pAv){^Hi`D{P 87t#.{ :zn @@Ħ#RPoM,]xb'/?q/::7Ic wdey, /\s^/va)A,]}-Zpc9Y'5=keA$P= 7xJ1knY8l,ChZG1RߔAKOu *3UnC)rbE ms9^!/9o,}nZtrZ﷛>U:n&bYௗҷ`eU%>תu_6n\dLT( txQ ZhM pw-NՏ_T|Gfj==p} f&%n(T6$B{1Ҝ'/`fM+x5nc中@_@cd|m|Wd6٘y+WH4I_Ω cK]I(7 \%3nQd_כu՛.9֗TgF[%?at ߀ת%Bm2j0#s{LH̋ǔŁ^ӋxՀ9E! F}= wSd&n׫K= :oÒ l ~E5.8_Sm3flMߝ:'^D.X@ye"'9(yԉztnJV,7@ÒKO/;q>Y,ob٩eIDVj͛FVo7V[mBgynk>I\4=wn~QJf֞j;"v;{T N Zqp+ anhN,L/Ă#]FcE A!#᱌ aYp Di=)y7v[>(tYY;Z3m1!YŅsPO0MKˏ 0A@H/@@IVINiRY9*Jrv~i{PH %A mho`Y:^8ͳ\d ēP~ tfF/2``d@WžGSkc)5c=cW=W o;RrV4/v_ lFWN)-oA[ $9I88e|}gd}WfND7/~rg+%rؗERGz6)OZRuӁ=(K]dq9:nŘ72NZfF8j<G'ӠO9~S-b|ՠQֽ-vi2+-u@kj)"Mm1(=CJk(mgP}BQ3U+aI3"?,Sb+pW8PObBY]vhd O'Կ #_2ZًOVwA1kd4/;4~ҧ{hYU8l|^dgJGxTҒ/QVJvōm͋"uK?,3/#s$R'2 v=@M4Gv`fifkn3ˢuJ۶DŽ&i X溡&Yi~໡[-9NF,N_ƀ}E3j[M$iQKJ-~؀q&mZ;7Υ*dDcY 03Ca wyK+Ҵhm4hk|nS3=DOK+ԛVͲ)L(Ӥw^[EΝXq aY/Uc)#n=%hBj5z}R7KDL˺P1usPI;d͚|Õ 8V k7`}\b=D͏g7^5cW,ٟǕn.Ϛ֍蠱 XmG}6qrע.T&RV*{[QAL1Lv1OʝCz/MgMvwXEb5V/ൊ6CGE7ȲcQnn} 2)АAhσgۥ׈$,5?ix@dKj-ʔ߇o+]K@o u#WEdCj {E=b7qUr{PNb_ףM2&ei r-Q >if {|#/;Qh]2'bvo8=nU mYY+-Oj$btG_ǽw1 ʲ\S1xuRh'C[v:e7E/|R{E8ÝEZJ@xS|U%f\]ߜQB0bw9Xi3WiNp6h{>xRU1oør7rmާflz}^<15>]xb_|hd i N/Vzq*s@S)TfViV$!K)~Pqʡƶ[ x 8!9qIFn͵" D0N5IhAVWg۶TJE țAg J `NVE/ ՜:Sς蕐1!ksӹY?ly*V91 1y( )`º5F#?LPnqIVty bd \Z:Fe.Ex&XzKDD)|R](AX4W{ 븪!,BC.IDA>Sz.aFJQ6BA!qePFqnUj/oF@7Tt۰~X UGF&QH'd>$Jvm.,fyV?s, [(3 n; D]cQ0dQ|qA!vqI"ࣞYv3xw;ϑr}%f:f7O`NqYCM2> PPhWZ`,%TוJDfc0#PyqhZ6<ъk5\lJ$frw շћ_ ruP]fy^i#o-55_K:@)z5. .Q/xR5flyM_2Pp@ *,b_2z^>vT]t2OO5.S܋}䉓h- :~VvuvҶş.E]=dkhn^vݤ>\w݀2< YX:5Dng~%v ѱ-A r%t$xE=ڍ6[O4KA2w@qu;KZBRF,QճxqZYD>NaAyvF <*"2-}`fǀqzDlh[D+cwZt0 unѩ,l=J-,%Q1?]Izf޽\zؾ1c*߶*]+w!pҤ\`Ν5=5{>U·RnAU G}Lm@]M K+af5 #NjeFoB-Ǩl v ݉|Xl `~(0hKGcs#=x!φ92R4*3b0A t\lQuBR*3(P:9uB%>k%(&so3Xb=,J1 NwneT W~S2桟h Lx?+0jQtfX]}3}9`֪ѹ\ wȵ#>A27=wQlMo?:D̺K~%8hMc_-.x@KVB_i4yOQ<0N7"ˀ2ʚiK)h$JK7$){F1즮z^sDd)!"bQadVZ4|$_x.)bh%<  [ 4;Q*9 |#8K('NTIϣ!S習z`^6\K8U2TGڱq];N$J *8hy(N؏k֕4"^?fOCulpXl3X),.ըhFiRL~.~ t'"(Fԙ#@ȗm7x} *K~H>,ȝmevmV<ՁM똵_txL*> ,wT~ K0i~ am!DݒK_e7ay]UKH.[TZ,ޭ4 |Cx8ݍF? #,k)о1Mkk `JRqľ$V-Ev'% }򕆞O(-,$̴9eP ^W g_ оڌz#^3w~_oZ)A9UrIiՙ]l t5,5 !u}?mnNwFlTAc|(%b̥W1/^F61đ#NP|HĽm b.-S[hOŀ~]p!˷I1y.VxP("Q5GGe uUU?+ }mѻ#ea!_%9,#:NYП 8-z{M5Kw@+Ium #W/xrleSFIK+.o)ulM?8`K5e6fǥ E1e&5jMrpI HRK y5y=0QZeصa_$Y+cG`Fv:k&>poBˈO >Aby%˒44m4=a&?xe׫cq^hnmvljڔfZR#So .DUXOKK^Op)'ꅇvmD$t}ei] nʙ rQi2~^irL0ͧi?fkD ^qW"|Bw4cQINP"[yؔ]քƐ9LƢPMw>o$L/f=atCX&ɽj”g˧XЦjׇ,J5G.ThswJ 򞰹.GI (xJx4"?:*"f@dNÀ [sNC0)mjI#'pE>ÄBӢEhyH91SgE<|ŜNCz }qD;h11*21uB3;2! uٞkgGS=kqOIKyVY߀7{GH.ÝB_M1"0-sceЃ5 y@Pd3lh~>KN0_ƌ綊^uǷ٩^GQoǽCUi6ͦt|(Jzx% .SasT[0.9 ݙۨ5n5, /bz0fx@f,(O(F88r$eD^q:vX0dm4^qq28H(c al :F 'v:TmTꁃ%&'NgN4<; 3AߨNU8F'A%aփ BQ층^{a-)c5U*E }?Cuu7~ˆO[Q/lNRWz}H[{;7KLOХ[o]5J 9+WyjMqߩvmW]Bdu_Vtg+LjJ JnZQô (}8W^:6<"T%v/qЉw"\)HOuB5Kz#lR RwAo˭ZPt xjPBeĦ (1Ym ?o #|WgP!TXTM.#O}WD> >$/:bc >䬋#tCA;ZfDl~ r=Fz^ʹN1)p8"VSi-.Sz+Apb14j"NENA >$RiuXr1S߇(V 4@iה2({YuRߣ-$KRaiKT(=so( t0s0^kWϨ\0щ"tuE8,7 f\%42v+JYŴ:7ՠU>9n½;E0S|ޤ.QO.Pdl= ipvQ׌cLM>(bO%< f&Y&3){HuƴXOL=hfԹ忏>;2le)lCǑh. Ob͘Qi6'=ahXt˾zͿv]B\he؁{P3 IGԟC{,4iY`u:پJ)gƮ]QTb(M{ȓs*rQhШ!wa]f݆חEqQSKv vyuנ;$uC.z=݈2G]lEx"cQ㖀%ǔ/ #F$dFq!JjX͏U]7"r2^ ާ:rnD ux&#Lx|DMKvކ_$`U" *;GrA4]Q5VzL6P?+JoOZ9MQFy@0~Q`>$gWaUޤ^̨tBo2{}藮hwKW>yiPGҦ4t'z(I_aֺRA/׻@FGdρ>_^1̚Q])#+0=d"e(I~ވ0F8׳WǣB15djmV{C rBc&9>n;I"߲2Ra$G n>I#+~x!3r]Uuڰ1ݤދJcHKG~чa,zY|2)/߈}fSZ#k(:nVB݀3 QǼ֞ 'A'H{SK_zB g券sQ~glz?0KP>Zhכ8۵V7F:f~ֵ-8Ÿ2;@jZywYJ) [*ӏղIg !@Lp U[Uڟ?tbF7Ge5U&uX؋gK&lr/pQP}]5CȭLbJ̪;b-OR_6$X'g1bnA:M>ُ]yހ)TW&18C|9#Bͦh`h76R`%.Ln!.(j-[q^-D(JUҋ{f9q߼%meHyR.7X섄lnKٌ qޜ%RDRcC0sq ,AR$ 3iiYZ6ohK9kX6,H4JPI 0g|$<trcGs曛$[:h.AsG :g{n$õ4(MQOv--oFŗ%4` zWRmED' R7c($e{~Gk@sǣd:uR߁jPr銼_?J>G1f+RR]ruz :rQzYݥDPE¨xz$Hմi0R8Mqs!P܏gt+C7oh] QyPsH8w4߇ƃw|_lI}9 6&n\:ؘ8 HZ3s9W:tB'Av8m]灩Ļ%LACvʾ1']4I|>bݥ Z|9pԧivlƅKm[#1}ۢHjɮEyD4tkUIk%k 鈡[O_LDike) M%,K_%mhC[:qmpVkBe#JG{zB6dϛvΥuF`hߟ=(9(%/(-eV6NE1 ?I-fC!_8귋GR< HskH-xEu^}N<]0+ ) -SůXqA>Rqᘃz(Gdtiji6T W.YW@s OEi@jPBXdqN_$pܺdO:kE nݭWphxYTa{35"ȕ lxWjīzir(/_'LʍQ ?ZVG٫eVl3JFGQ&h"ʀP4RO­z 0)j#~N F5ͳh1O\2ΥD' PjhA,2TSysjy&U[)$rMV0!k>.1Q). ⭎`'*Pun7V FbHOxrXqKD ߆;CFشG2}h^vrnQ#!t@I lD!ܧO}3z='}CN~m[QZ5\ɋOGjH[bg5m@ ={duT+RFAGK v`7;J˛ŏaUuPnD%8j?A Օ»?fɫrZ6(cFq(pF;$Pm;P`{2FPWݦeJJI.F]/[0~ɯXG ?'Yh v P8[cKʑ]E V󐱣2FbYf3|6s\Q){es O<]n&fAJ;g=<  ([ĠF+6?QĶD}}BUGm{ Œ8JhwҴ?Z. Dq1s~qSrgy`wa}P-k諏Ѣ\?%GSi<MYݸJ\Qr}Չa+VڜUVԣ}i+ a=7Ka>.OLV@L䯭 E@T9uY"'^, @)SkH F qi&01qiW1= J\QPlDE͛=XJ=a$ԆnY93J  `K-ݑ H%=ޥ▤>t"n3i.EP>"guuz׺mpt|8kOCst6dvV?TWfg`9/Іm݇,Ԟ0Qg{`qQ̰YeW yhUЬkRn3(̒^Y qנrH9gߠahZْyeH bZF{Ti^We=pg ǭ{%!/BZzLƄgJC5t[eFMkrc3§̳;(c[\3C3=xIW"u(czUG;o5e^HׁR+%vK䴎7AŇGQѤո #?ɁkϋL? tGr&zlM2>Xa /Zr`.Tqug؝8}ΒU'[O/mJ)J @'i!CS*`K֒]N 񲜡ĬR"NuH\8\܀7mE Y -:I+\/g\𑠒2ֈ\Xi+|L#Vf ;QAog3bpgsJDN;% ܵ<6.4XS(LxD;M@Q ZM%Vx<ʢ =EVeM m9Nsu‰,zĮ®?f2\˒TYH'Ш /ߞ=%~Z^Vf5^0*,\A Ea! mP8̱Q`%Jy]i>ڜJ-3hYI")&Ј^\ֵdʖVB EBf[0!ZAs$)՝b4i Ob2Aɩ>e&%0L9:wxY|u~}[8JP1hG H/eŨB+DժSaC(}RM)3?62 GFާ@Ӏ!r]$NJwb͚wشtb:0=[NNB]Fě{Ln?Gd.N)} m/z1agAWȁLGAnYp#t1:fcKIiS3Ώ_WZޣiw5ꫢ_E>mɷ!^\4ƨ̟NE\Wn}?h|-'e+K(g ߎ{#L}ZLgl3v1V\~rvbU yp''!H1rSJZRQ&J#^!b2:F9=:(5ŁJ`X3oق2 ܊ R9%P9Z/xfdHϥSO'&zN<P4Oܬ=75XM$Yyּ j L1Phصq)Fqcq'ly`>#ǵy מ[kVx\?/,aB}Z'o|Э63m'ӘkJӶCVi޾dOW٦x܎~[5fgJó:INW, z'RHI1jvaۛNAci`r|{(q8hAӍZe=,=9n%E]Ԓm9#7 G9ãIM}D"^twDҸopjR>oofRڂcկim7>b"i:hnG=kĠ7i֡W))c-#6:6A7eF_WQi.q Dm[f36Sb 5HMr"7l6ڴYGdx^vދ]bApNIJZ tV~w1Ыǔ{@MlU4p'~) >:9FAvC7}m9՘5dr̓3fO'ys)רO^ȱK%v[Ccbi#:mc*+AQ9 f د9hFɉǖS s)y$:QD38'u,HiA*js48I84S9ru^Wmb\4c (׳]fD<*C4}#46t˵؍ض]Z(Nm\3-*5Ǐ#?cx8ӂKz攪i8. ϵc,J ߕ~OJ \1T0呫qXC](V+.oF\hh J%O\SZwxI4I*4vDQzMo9ea=JoCz;kVK<<%Anj)n֟[^ ~n[lit+'MXE}DԈAUwJB2~ئ)KɱqAݷ߷FT>Qz0`D0jj15B1 JM&ʭA`5\w$Sݣ5ůBFh1` X+qYٵ*y)zi{R2$˕FO*m9"ҿ~kwVzܑBK-yy{W_Kn %m{Wڦsf!9[7{̔(cߘV`M@ۜ~[uQ9ޒhaVs^ށG%|T>].zM\\fKKL\16'AuuҿQfPMw0X],SwHbbyJ`R@g A?̠{|OJ˜ -@|oPG|ΈyXEd?wJE~flYObەV N,2`";QEkیRH Uq] c>e Š]1jq"TNx YH9[A=Q?B7u̩uwy1`Ij z4rV25!OqխQmsMj0[͓h 9- Mz죅6o2,)0Y;(I0g&kE\˨a7EBƥ VٛO-|O|3#Em+6bٷ@dg162 0'=-1_ i,\@v٫:!ދcxl7zT\c$Q y9Qr e扮/.mkvD̈)GzL9"}nf3^#v$QQ, {b; >tQ:RZX8{ч*HiEQyeyK}))#IϢpj+@Rǧw櫛WDTB4n,R@Pl4h#;GUm oOw 0jk7f |H|oJ6'c&fpe14դ)TC ;jW) ܜ )= F;.PqiCqKoqn@[3jm씐z$6AӤ&[/saB"̌$f;.D:y(s3:MqQr&'/FpJSpB‡!sPȷNk< ?eƞn(,X쵫TC%N (e:?b[/.LX P|(-LSC߷DQ.xT^)m(VyB>u"UFRS;&i6Ͼ I,Z(u29t]];#όOQJ T; ҂VV ?>MUU@%GqZaV]RxҚS.)95t+X â&u F~2bJr_\?v'r@8m@A(3X*5D/YMC Js\h3;HCFi~4M56DT,1v1*{ 7) Z͎(*Zʁ]ԛä.fYN~b"m:}1꓀3 *.W!H"+n3r+tu~-=:0 +g\.aQ2tNPww[E(QKɴf8PyPAuE׋|S[3dL2#x@~plHtVۤ& Bˀ9[(bI fIB@enNKʣ^e|^d@whs@b,LtJ?!F u:3Br'7 _{ FG.e& jG6ﲨGC5s=Xnʄ#4m\ix}7bO,q˩Hu9jPF˼ {viE8@WGb7 uEʦQPQh"FuGe.n4>4!J{WDy!n̰/:E7LZslI`بR*;$Ht+\op*'͑ݴ=*Pxg(s?jzETvP\6mːh\ V!]*c?3;T AD'ݵRIȒAMk)Q]?Q\1)6rC_Lh׬GE]=^O@jua AX-򲣥c="&F EzuU(9 4?jkLP%<9еZklp Ur#OcYko7wNJ@q&ޅLJ;wOՂZ"&Ӧ5.>(sҮ[b .!>!¹M~Du:(g;IJˢVY;h[HwB??»ϧ|6|)nkkp.B[f/Rf~QF=(ezXRlSFo:l_Q35>ˊu$,p M)c3cUR`iuBsn^%/qI7o8v Oft{೫Gz.G1N{6݌:O_ܐ%f|؋uL; [E0:,LkcV=S 9~q 7''aٕL`-lQfSo7vV|YMEMnJͦvL(uѢKтSRyQh a5{5F%ipK)&0[v#4S9 <*F4*o6TЫ (uQGI{8*%cWG+ f@aD'ڻ((ڝJ&3cƠ.] n;II18 ~IwH0|&H6J½{{ ~&{jns+ogQnDQa ;Ңӭ[hS(hUeEZ}S(j[cb" |1x=4]mDŚQ3T#^ {<~aXZ;Uq\ 7Ѷ~c/)ڎ7S3mV}Cvqۉ^fOu=#,5*37r<.m6pX,4C\##J5mT -G;3wrK}Г+YXAy2G#|D]Ɣ[=P>u.d8BfJ]q&G sNAwW+7Lz T_յxjϾ. 9n]DOռqvX֮ش2鲔lyκ ;x+O]=ohe+s%ՖYos~4pH+eCGu=ﳈc"ҧIɵ,aW sQnθvS,ӱF祐)&d? JeImtP*'l\m ߗT=a3yy/<~M[X\@E ҧzZNU~"TBC/_w]u'XK7n5؂$ 6D0 Dn4FAJK5xw?{,3k,*P%fIbI˔=ͮ=lR<ؤ._©SuթsN}cPIAng,$[r7]y }ţ՝U_Mt?Y:uZ=j>rz^|Y}YުZ:e-dkXuyu'ٲZfKOUOK[cKGZKVmgTVerm-_vjd5li5[~zyVK~r$.=yȩZFkcK[?gY$$[lc>#kpWuܢe7V̚64=&^(M$$gq yՂEIƪ8S0P2{^mЫiu 0;Ua\n6s8ObKd8Rí7S-ja,ap+VxlrZ1 Sx/ $M<|#bAgYʼ  8Ga NӬ9hWW?85⚍ ZyFV=b_sܸt_aNn5)}6U>oQ[.U}NOA$PRr3Wg|ڂZu-O]hc&S3YTƝ={@49K㠡kBq,띪r%%c=^sAw/њP1wOϬ0>G Bw:wлZ[mZ6K?Pv?ON"ܽG'nB]:$%WGvte>R,k;4&=SSKǖ˖Uz ¨FQ]/Ӏ%7TAnqǑBpe.k5Fae 8ʀӈmA TD DvpA rѩ5/  6H*9p IGQzZ -C ^PKitA ?A^ire̪!^CWa<;z4KQO׀J=e~ы8"oM?o l ه'o;ZB(-ף0WWjX*p#}$X=_jFr:?YYv>fN3SD?2o6Ӝ@\3ψP(M R،p^4q&2YV*7 d7 M4TEDy=Fu]&NvD+!2M=q#4u4͇cŢ}.@ܫO5}A;Nƍ4znPQfDҨM`uR8J%Fm dJ._* LC]JqX.~iűSUTb^=B=vn_O̟+/CP?F] F7w~Q (]Jnr~ȇ"ݷvI %KMNrR%>#c-A+kdmBH?^9 |_86֟7$:rJ<5zmPJ#< 5g'KJN3%8^RzQw~3 9Y[r֢Ekx6,?(M%%]Uf4}{vAAԽyIѿ~T)fx|_\BpKD=%-<{6wX4{yԝRNUSpu>'epfǃ$uO\ ?+Rdl6? zFCԶT.3T#3T̤*tK^kW"z O[tǷ ZeJ_A-> X#-VǗ/+!G6ppsXͤVLR*:ԲhRL::z%뭏PO!J(9@T%`'p]i9 WcH)U pcA%/hyI -]+ʗN~f#.qI#NfDy2'Iw>Ut$m=/Kīx^\@(6gs/oFZY+N0=䈚z=ɣ(M|s^m(k^ x~kܴ]Ԑy@_"2jap늑fLZ-4;NQ&mp3m&M7N[x탞يXkF[txNlM9\~ue)5{#>/) 'DQF__ŷ8ycx嬢yZ< YB 5mmde3f6~F :mRًӠaZGݞ.CZh= Z@ DG.C"ˈKCC* w &Ӳo 0wHKgjun4V+,~H(2!shhH[F暈٢~YztHcM\EI^D{~ j)u*ԗ.v1\߱&T}yI)wzjˌFαh#( )U"=7T;Ashi6jk)Yp<M,ׇПM-ݗɽfmV4iZcPwJY:1V+wvw-h Zo/8񣲯Nʿ nv ܋(JjMt6b1* k2Ӎr+e>)jluM.٠ycGw@pځO Z~9'{)p}5d9jO \Ա$>{0co,8AWdizw99&ZbH Sg~KoPߕ95[D+%P^kvtX|JKak~[7zsrsX)6K/8o=$F7e=Qw}iqlEP3vVJ# c/'팼,bheqW~"*~RhK#>|-JzJ$J[T_o'5Ŷ J2zFH߲?mf$B#5Jm"/{MNْH)X)M.!7]w w Riu,xB+vK?8bU}TàwZ oMkQ{[{ѓOO{Dtt}JCGfQ Tlrwv{.hc6`Ⳣ9[?*x׬ h[iZ!\)Z\%.J=~O M3lkRoPfL-ѳ ' Np7'=*5][~pa~ >.LϟJ'eS3qKZ:n7/c1Q6kq,̖F30,`R{4_ZVZ)+@Ct`ە}VZ:(=j;рq5JgmmԯTZ5MTh:!=!Ɯ.Z8 t xnQalDy\jޅOxpsL4(ܬGowy\~,Q%Isܔʺ<et"DZ 'lq]eAJJD@8K&h#5Md l)zqć.0zf/Jc?k8;}NҤhE*cIZh6uIZK̋*@ifժ.jPm~ ۈ4Pʶ 41RF#0(;aMs$ @I[D 0Β4 ƞ[ 뻶]Q6u9ht⟉FORjLsmi=%%C$+y0> g$P2thB%A> Y 61 BW;E6E7!iH,ҘHK}vpfCwRuȝ^zCz^N bE joS'OIOf2~ePS(a*n߄f;톫{#uhMߧ$Wڹ(yX ,OF \fq8N<*=i{C)alSoм%J»o@tZ2o}sH ӧgJoBi]FD -n8Ѽߊ‰NJ.U"f(ύ{Kh/~5GAA8e#57lߥtz3. `̕w}Vɿ٘,.o6z5>xm͂dM5K0)ٌ'g31p 23\'+WL,>kmz_B?}/19٩/ct+vUjJo=W턦 7tz'e95 +dn1V2gsmz*\: .fJ?}f1^-ݣ}i +iI2kY>w5sI3n@n_&Ѽh%CuVlq¼T}yvyZ=|/ vl%7 r.Ro/n@hM 5XW*؎ݰ0yr#KN-$-zBd T*r:mKЏ?P,ہ] \Db 's4"n? ø.3s EV@&1m2]nq ATbGh0niiC^qV6TaT&j@M.~3F5G3ρOOs )=7r Q:~Pt=AnfTT]JP%d9 n[Eg^moh6W!+^:ES}Ji2þ`a~ZYyaGquPux99bam="kh湊d^-8蘔u/6W(>>B|h9Gm&Ec izq Ԗ93uQۤYeHW+Ե=WJ jj}2"%% 0~"T豚%g${?'WI3魚J ~:y`t1<ԫW#yşұ}{y N4~h8Xl():ؙaSpe)bJ \p/1x8́8ileI^il;0tJ4Q/ d7+fLƉo]%8n( Mb@eC@7;Pd~7B︁bIǙg{~PАh;*TNaӑ8Bnv3LhH_3Ո^@ȭ $jf1Ȝ0NQ+f@VڢA*cNcycj\RoatѲ}Ȼ3rO~B4 #Aٟi7iY>.q)MF}nٻTַًA6wUkIөk#-q4oܴX/҇%P"sA4&eеK%% cߺExpX1B'Drhq ;a& }i9uQ BCt:j?aXi|-mJsZO\'{DηC cIoȽF[<$:P>QjUjeq (?hj֑K8}"Rs0OwMw1yHf8JOH#kρE:>c:6|Qt.]u> w_gLKftzICW]ϵʇ%%W5yX_$y$!]SUY'q:հbF<۬*F|'uy~Soḥ5>4MS8NO;ؐ=ܩe=D]ywqC(I_P\!lu:ۨnL1=&5_ h}F12:#6 =z vkN(=/gU0CPqEw6e\PZLیOaN`JRg%0JFhzxG@훌Sj&ͤcubĿuW-yх Fn2ubhZBSAWJ :`aX*^뺌 d /ݸ[dۡV"9cum h4"Ga`zD0pN9NTkQl6[I?j%3`9 UR3AK[d{M6QlX1&2Ftgfˆ<i֊7tqѥ**b|)1LI@Im ie~K 4!{Q3HT۵.Ӗ@O<ӌ%S@,͙ӥ$'Nl͢!:O!1p@m?( diF9dSpr]$E914`Eڜo|j' PtDz&_kOxuF.ި6V>$ Qn`O'IG!4 f y»O)CM^+?4dKTDhwDADUh,u%u MHs]b1iG(m4 [Eحʽ^\w 7t fWx#kH;/A3b&*$ 'ai0c uфϒd|;,fUƛ;n%|%5\{4mE5ɌxThc㢮Msp+C9 TmK8m@=O ފv}6^ A'<,0]V#ݪx3>{ߝJl. Y"1jzRwZ> R·!ZתAf̉q:m*@HU»fOw 4Fmj'g2'IvΓ8oW t,3YV7 /Y,ʘb|=/_[ zI48LB|b\+à>K v֓$j$ xz(C;r9"/#0voЬPQBphF KE{ի~~Z{j~*(/1}\)&Zqc4m-x֜M>^0a6DD:mxOK4~iQ i R^Ec C٫~F."׫w-MwIsKcBݞ%'4thCj3wD uDGv =Z!x(OvIE h"/{8@15> ?mx#:t@5PI%j{3tЌ#:#cZFe@!1`JikWdL`d21 i.Ἢ%3_{SFͤ; V>`b3IiZpnk}s:,'Ghc/V}聆yceh {A5f!ޥ`{賗]+R[UcrQ#9a|Kߢ'֊rLI|7Oψ͙S=Ytk{z:sfA5 ^TOp\OL`HdO.ĜX =+VqSbD~X}ZKRu 4D=۩ MuCiodi]ta؈B' @a8{ft4QTj<^HxA2!۱eYDod5 . QGo. E#eZ6Y5aiv+0¿?HG B45m7)BLuK=oY̖eN! |a?-p u@`k}i:L]b;SZ<+=9hbUjm)5SR^@DhRhr\"M.oUR*-z|ZixU:jl+ނz KmK.lu0^e !O\ۧQ{HG9(ӂ$8"㦍l7e -50Pwo:IC_ĶhʬL-st\FnWs, *!'jk?ڗkGh#yf>a̋}ԧӮFxp&y m?rQWyL Afθ 90zcrW:%}<܉N~"?޼WzoQ؆hHx_/^kl{{2}5 {( 6G%3`vZw%LXcZUp{hcOT[e޾5usG@ӀS<`x zwjCmkRؤc6@Lq^f~.WFKx!t|5W)雾1f85?3SmxKp,P=}rp>Z/6G *݄bp/{{8*QkqEkeq'fDezDzw?!5ׯa9j g5J.^9;ybvz;W!ت: s08[s#3{\-Ĩ_>_*YfJ K4*;LlyG%yZ]z=|?dߘ>7 q.VLX/m ֿ/`MSJv= y^S11`f0K6%;J4M$8`jkFGW_0>6h|l/Fe?hvsb  xZ;GQPZ"(ɖ: }Fryh2#V L8_)6aɭX^x L0[%6u}x ҏF8o9<on" ց l;1[Tm-gG7wD+(tdZн"&r u}鴴-OMPW zdJgV=,͏nX{DHQ3~fli) z*b%6z,WJ .DEoFlESRwzMuXK6׆{;nm/K,T$4'U6~ O hPU80''6H8ѽ3\G{mђL=/`V_-"S%p_t0˅؏DS}$-qڈR%S.zm3֛,s m \0чz0bwʈ串s<>ffȟׄG60@)>Ǥ7؍v؟o49h;+˄ ]* X2O}یy MWi:utf3lz<爪zݯN#sI $I*i=J$ $^򸩣=5;i&Q9]&՞Aӊ6% H xDg)o XD^E⋕<iLBPy."݅4o1Zlt.8], 2a!i"k^sh=ģtuImDq¨5s1.V7 ̿ƬLݪjT PBk`gي讝G'*&׍}3J?&ѕ|u'9| yێ{2y̙azEǸHawXrS(jV@i^M/ջqcJip=٣/J!>,A1(ΦDHx@p@B':3aive\$fw(ؠ ~'ъƙZ0>A~Rf'>i16׻1Kjƿ}J$Wmsh؂܋\Qi)]*2kR P':dwaϩUkU@S0/Q[#bS@СÑ.k*%y逴T3,2'2q%yr e=v'ZM+f *ϋVcqS]7uB>$9lm$zp`shQbs-=5g)e|%z^t]b b&}G u-7C+ȊNW*woS qSK^,o1_Ԭj[̤I_ne(˅PK/Q߶O+?J/[5:U7dЎ1((e (SN6yTx^Ԕ V^6~R"FB\ˇa@輕Ǹ-fʃ H[M$iGK kN[m~h#(-twdN&s,ڻ]|%|,n'rx%/=(巚sHktU7aMcOirSB,,!=4@Y'u4, Ҷey͡#fJFVm܃_+ZίOg, g9FN?.E͈(x#ѕp zC+6]fLz?0u.]F::Λ?h6 pk$4+ù>*fsFDZM?s:Ulh+55!hGyͼ MۥDl߆#'*1׀wwԤ_T=fNdzʫuxg mh[֗Yd"a3 yt CuEC'|bTXY-mcd9r0ͷ䴀 χ%ߏ|{sAm=*^lAǶ՚J}Z_r uj?T ׯAf3֣3i&җ/ŨSZ pb.\:,;yAL 6ZaVa=& «րՂW~G~VA ^~bu1$HqjQ XB%yAgjC tZsJ*nXYG]}1TFrPsAd<-5\~F{ʛg}&Q^!+3a؞4UyE'y>M1 B͘Д#h`+cA#W@*m Vpv] XM߈f #'z{9meԼJ9ΦTeW%F1߇'c ml=a9q}؃Id$!LJ;OLIoT4&(/2Kh:oUHVٟl}k 2tGg8c!W3*!ۦzə9b߯~\i#mض6aõmϳS&Q6"Ċw\ 9nVb%pՊSyub _uBqja6Jvim*F=rl \=/G[~5GvTCikރ6s?Q3Ͷn DJ@ *((y91MKբ[mJF>%"d`lŠQ{W1+q냸U164 idKbbQrJ~Ο6h(Z|6 +Ew aʈ=} >r θt;CG}ӋyΝ ߯SZ/\->֫y5#Bj|^DvZZC޵'E͸*Koԫ&.ɚ8ηjνXGscD2!6eU>(ziY :z*j'vIq[]fə7h]&@+CaaZ ֋לX#cL@Jg6`1fLoNz)45 #^5H,}G7~Jni;^58c3nR I3Q3mc5yĽhyU(pЩT zPHrhvY5{Ҭ7ѺRWqiޢj>X~q/uUݴ8F?UN-yAxJq8Sg]lf\6F[G6}gDžhJYKa, Lh)*y>& P3-/=m2v9$VDÓ@z'uyGk.;ӏ̨*q).͝m٪N*C]܇?F[b[=qʾQJiC?͟gsJ%ۇ:8sWHTDɸ^F+[yĀ8kU R|c゚5Q.e:utxF&#R5ʒ:#7kϤ[Q .n袅@ .PJZ 9g?%:\=Y> 4B Cq{τw>gS=ؚʹ3R]n$.{O~w2[츑q;A 1P'󄦑38F"VĘR%il7// SZ#-&i͒0#(s+ t]BhaRquҏhJ9%'aЈ3?[t*<Y#VǭVw}9tȡz5 R*!Q V2V+ k&JH%?󘨟Bڋ|Zh n C^jl}@GO8$]La5S"%E)wP\5GS]e(ImsCʾmN-[`mF{k }G)ʳVh[(x!H שhg6 K=|-Ϊ!7,PDy\a^d- `38ze -$zzŢ}mMW҇d#wƏ|29,|tg7W ׯЮ%&?@Kz;鋗"IdZV2zy G髴h:;K#C?=hۮaTJ%;r09eÊ,(*B̝x~gMiĀiLrI=s\7Vubu:K_p4c 6CiTLPT|O}Uҩ/R2oFm$p3UzyaAX2龜Il-1(ěC4Ԍ(AHH }1DỊr8%ZZz:e}JI@]PSz6)JtVf;5めe IREE"(v!1SF s/E4 4ԅs淏ࢳjf3g:ߜ9pH fx2G&WmOl]Չ_yGqq.}ք -ѽJVnvYwJO>7/MJ ;2 {V9 yq9:]-o!َ tI=C%dk؝,?\&޲_~ե^`ђex]|2uuY*W %VZjw+\(Zˏ՚7vtE>Z1V[Ywt]GZ+U[cry#+:|dGrXrVmH.#]Vu] d5Mݘ~w^qVjW[fn}C]j+m/jS*4%e,ލx4׭J^7K%yץNTYM|~Ө};<;,{#>3]`mjԺ_^]$^ רˤnupRmPոEF,^ihUiy 'X~[}uOB-s :u]mt~P.:w,oRύ/Ǒا.17y.WScګ%/ {ZdPC{I3ŵ Ӄ­)UVO({8>Ex\kʕgA>%w̉>'IIΏǵOfR/Z,/%oȌ%oKM2KvHos/kR^7W#~o]j̓ uDbt/h%cL=o[yߊyF,k2>P3^eR+;zlӇwQWW[;3ywɽUxs8u }](־+^݂5*zXTofG7jUz}="Xz?jV6f~z%xu G>|r5U1rmـ<)Jݪڿ ݛsB=Yv6w OI _37 zQ bu,j6ͦ^"m;k|n?B=/Xxٹ?-".7֚by-9)b}d|yhqjy;Bhn.ƈHcFBh~$YȀ2"ky\[q3S97L0#͚EaKҪTW$L-~" Tݡr7<Q&AZV e@_ͤE0m5%hl&QԒiB=@!/n'y@~]# V$ ׮TA+fi8TJJv킆4/RQA%a1m j ڃ] uAJ(5]ɢ_F&ry {3Oys7h#ݥ^20 ӗ1\ c$LpEBL*lFɍXNk[ %ZBL˧O1k$<Ʒeb>Z&'~) xy/rj*IXT?_ԛ!eҨo dXOc1vn@!eŷKsSRX:D`^zXŒEKɜa̓*Ck\#u2~}jga1#oCf2m6܌vaX@Fm: dޠ~! 'VDfOo3Hj6ͦ H{E ,"]T]h."w GW+p% e싲7s@CR(b85x+vJi`< ȮhlҰ]/ $ 3Q h5I(zU0\7`u0 >Cn5.9ՁJ'ex`A v݊56p$@h#MbDDaꢚd.@ica%Gn:qAY^$-߰R\. }-iY^8]; b@gs8sH-҃қl%| KX"뤙仰4yhhzЍ@P)$S?Rf,p%,Z1 0xuQ*Ӄl@;Q#y]  k+0uMJM۰k`M|ڇ:)Z+ "^Y$I-jAw!Z{"8Ф$Iap&QSHʭC'K}b]X if<,'S^N݋zVRZy}KFoW$:#vZc^/{v[-ѻ5JG~kjKi8뤶+J%wm@'0^pd \ E?%T5[(nc` `ӠaX-Ʒ9?40|插D Ye[qPoxث 76[ ޺oPrD] |I4,zxR@h>M-ߜ/:'a\1/=[{H=vFCjo' ׁ_gYh 5dδ%^FDcoFr>mՄW)T)a5̱-j i5OC 0#0''a蹿[fk @q3vMԵZEC}_/+ 0#2-5f?tϩkgހt%H-Կ֎Vj#cG@Wwdb *ԏ+ {yDYXd-V"g.8://GiW {|͏-)EZcop#ycՠS#ʍrRuPZ4fLDau5KRB0Omƒ3XVZ+Z(Fn Ju͸Hq*/"`=dw<8^= SҺDVGdT??ki6GYVof,Drf֔ 7fɂE?~ /[mJfT=eQ7 0݅2+2;i@% :JX*CY]N{ԦۤJy% яh-gTkX)ӵvK,ٍeA %y;d)CM;R9У\V1m1?o+zMʫ^IVÝ2>mŷdh@.I/ ,8F9!az@h[Bm'!y=(w܋{%~% bEW1(Ү/0wZ P%j?`|s=_0EfJx;mÿuCnC/ɷ?WX\#->zz-c(~@YTn@v#nMxcRk'e݋n!lY^䫩^pyF7a>1޿żN61m S ?%z@?*d(z1(r]ppHy37]aUٖ4miOHPP_/9өx}U!(hR#gkl9Oru3&մ畘Y;oA똡_ۿwAcFJZ&vr gJ~[Yd 'ĘFE-kMj~_Fۯ~ŌeM6,=iDBwZs0J10VgX~eflyK6nY6a [.=O}Qi9`"S=fzyV}5 Q\;~-t}4׍(J( z=Y$(e{nG \&PQl|uZWA#~о[5_7_Z͎Qk*Z/ +-#߯WpsB/)W+5^XWD3zQ#:Ez={lE4餖1qAx#70?\j cI) =Q[?" q Vs_i'Ere~_i HaOoIP.nw1ۇL?wH꯰D'[Q{j[Qӣ>bQD@()Jk](e`n^\mxqA )t;ы-ai,PkSKg6rR(C|zѧPE煂AdG8?J~d)}CgChTi3$V$a[zⵊ:: ]X:9+7Dw9^.12jtD{'K@.eϬ5ߣ΢\=F\Pz\zt9u<يoPZ#v~(367Gi}ST@p[gU|= K:) Foz-r7aB l==EN7nyVyyNKIj,h6@byNQdQfqYYе. k7b@ɔ;Yʫ|J RiRϜ~4 I_G;lVlpʀ;AD'Tlh5}&Iވ|~#FJakvFj{ND J9t9.G)b7 h1(W.b|Le,:S >R{Rem­Z7-k(!@).@V_E>ZRXW"`(1emY-:' 4)SوwoXI -ޤ@ަ!NEĐrS*X*g:-BAvQZR#!*.t ϡ$.ǝHRR= o[j~]M(g$w/j`OyB1ק̈7l5*ح7#A۰H?PxSڛF518J߇hQ[,s#7 .9\S=q_y}` @=zTmJ8,Oj6ͦ9騁hgYi70Av>ST 3˴DT umۀ@~@ o pЂxưwЅK&.=YMXrG o,z6\k5UEo^4i{Qf15mbseļASJi}e!!'ԶGĹĄew]ڙ;WEҿZpp[fAa]¡Ow%dp81zqL=enގoNYb8߂>πGe^>>Lvv[qut9oX}2{mEzO[EOg=+,<U.ʬ`}(KtIT)ߕdo g|`}Om hz\Dٯb1l2u5fӿ:#ϝI۽Xt%I[)h6ӏBZtvvjnVr$ < 81%I¿ʈ3V*N:(ϓF#R/l5ύ~Qӿ= QjPe\bę&a+n>5 <"lFT;&,ɛͼjƸJP2dCѐxnM)]7C#e1"iIAf:"|9ǂ2Y61wn֔Ra4 Д/YZ-hhnY#ΛnPltc{ G7fZwe`j(RK4t]G4]RVOȂI 5צ`m^/=SZ@rF#zwT[l:m@}R6%~QԬEjQdu=h6i֮O[bJ!ʚ^:(y8o^?pKC YH\DS4:^qpO;.5a 3 fdRzC:ZL=Jk#6va2}Bv#P#0h6[/g;˚Q>8Ҁ~^`)2ҷڃGN1;GLׂ!?@[{VQ׍ 2 v"oG۠N{T{&isާ:[>@{eN7v5#1tl""ݿ+cuxѰUݺu)дCٖ6$A\#XGb }=^IOs\ף,j^!ׯ5QX?! ǧoMsm"6>jjd>|?Bo{L 0m ]^۪~PtG)s=̐!:]UPh9/dvn/|YJ͖-l]-G7lM? =tΚxk˟d:DVBQ{ފjGkvQˏZ֑*Q(  4(eze~uMsܼH}%p[j@;m`<ü:U705$( bGsBgԦkTg3678}i$R$%T&cʁ_ b8`4kV=:ljC?vgQ^.HcvF&픜=PIC8f<%gĩ+Aq*{G@ˍ0]ѮGpm׹D$gߧ]'n2\=//nEu,Zxgu^{۶t,OVnQrxB'z+WojJ\Nb=ioĨ|gl/̨vPM52#˧Oc-^Ĕ\ħ_*#nqj7TU`cH.qŪ'#>.}ي{ -ϬFX ~y}Um**PӐjY3&EDlW#"$C<+l7jA->rO t~[dCRmӋV20e2;!2`ڎȐo,:wn\OԘQ_F-hw=dgN \q=J5m*`DIvA[$ ݶP_cE2H2>EQưGp+x4#FmFiV* 2H*#\zIuVIꠃLpYb5֪;m2$SFTꎃJ8B4 J("ܴ(ҹyB,3t7>#8Fh6aPݫgP9uLNR0HHUĥyHLӔL{ 93%waե'.Z`E.[xނ3מՇv.$VՍpsumDD*2AuU,FߓwL"2_CDUk'gD>aڨtL&_+*zKBqZ";{+z;H^ "=`p߫;O:頄)rUbM beDy1 ЧF?F[]R7q&|oпN;@#׵q]?0n[$27 >ǔ5R8s%Rh 6a3F |'u Z&ߋ58':YmPXSA#qkh3CsY% .Ӷ\Tʲ`$*#ZD=)R4z&;4/\=&ߵd Ԏsopzk(y>,upp~z hPˈ?b} T1zǍwTtT[0~ب!Jo5@]&0=oC~ {;J-\{?6S6xe yzO rn."i6 [PBsZe$wx0,A!):Q-&MLBxkQhƺ6n3 )b<IIR-0.;KjI24dC@8%}>MR6T=Kq M %IX"smN "rŶmǵa%7MC[ @D+V|6m~;<4]K~ҝ#R}N-Vk%&uk7֏{ӂ;;-d'܏ͯLqy.z ~#r%xC9A6{XDt~z!-]. BF+쐼,X=F̩+3&!vC!_SmnS&aD'J&7 3<C~NU-bzfBq59zXFLRQt`"yPdFUDoOy 5(<u RF3l#pIMhrn>.B;A}"S,9%WH/{> ~3hD>"^5j3;-9}?\ u4؆5k xF"d,qFY6a .ļ1zը~bd~bցܦћsiPv֜sqnWxuJ8TQ}F,jZr}mOQ"xǤV@څhfؔPmGGۉΜSrhWZթVedYMW82g:'5^&<>KM̺s2ߕ<;-gdDKJnةd^fȱEg/>88Aac!9)BJ5[3I4Fq^hHl~R$V탈ȑw夑m3tIM,}]R,nqԠGǎ6S)>˔v^ ^<11A5rOGέ-5v~'vd-LJ&XDלy3cx%挒ҘWb=k;7GQ<(&.STOHm16Z>rP-!h.vk\h%^%Vy8%rJ,@ L\%}TwF'bɷMό5ؖ(ңg}hq RX˚}A#~=><h\+RP]6auuDzo5Y-wc;T6:Z/SЭ5N9j6sB6ٛ2ޕM+=ʆcwHoƍ}<;+|׫T}Z&/}q܇xpJ[X0LNI]Wօx-5f?FhL}~ҥrRAw*L+]Z ,VUnZ(JR@z{NnӾBYkNE ߕ0PbtN0ӏJ\/.E(k_/Ug隱N5I}kaa~e)a;n- 0c;*zqG(^eVs$"DxY"ў/ޏHyֽCsYQH ~w% ',Ztfo0椠%Gia*8o'Ҽ;)?oAN|ĚqY?~' ,ϴVs\QRzd1#5pZlm4=z.7(-11œX{̲,䬧JkqqQ0}AO>9^"j E:;,Q } g9s\ݯ#hhz#h~dC 'm@-@ .raچ2/ ,^lnJE bJ  ?,%I>[QG*˥kR#!,ե=*;ګ~F p(yQohMџeBt^qx^oGG "!dva0諌RjVAO/4dӇ?ɨ'sSN* r'j ZYzlX)w2WloXת4flL}rh *@Vīgf 8';Bsrλڒ+Oqb{sh.䔴\yZuE6 (NJY%*CX.4veZiTjI4**\ɭa^Eu(tLZqxPqӞ\דᩛ/ "YzUA|QF!!%gsbT`3 "]A,ji$;%tɀ<(Bpza{Rq+ I7gzy6yO'SȕNTqޤ3aʛPƮ*$Xj#DKS܏GEqY$xi.\hĥ&.Z|ĥwF?{j0t*i(=FX r 1u0^]k_o [k1uЮa:eqs;\+A3c<ƍjr&¤k4}OP6sZfсS? .D?g%OM)৥wp̸=S>-j90hYCZzlIIЪ'Dqm/3>އS>/s ,9`w=4OOvp{e'!RP4mtݡ ݒxxa0L,2t+YDw1ҋ[A0SΰZ⿚Ӂ1:nVJ)؏@kO./o$XK$sC6sh$3N (F !t=5 ޹tĸKn`D] իH0֚1NbưW1y7xJb#~ ={ZUٕ@: `>lkQj9ĹqxA[doov ߉ZP:ҔALF"oH}j  ϩ)3"_N(Ibߡz~Z]|+:iؓr#V==XtR[%b -/g7DΓVi6ͦ[M%bCr̥}RuWo!}#5qkY3nQdYS+yQ/9daZm(/1h蓵2%ZHX<z Mf\Ā@_$.%4fBotObLPUg=Р3K2`$L)@=cmMT(}ѣćpSq[Qfl2}Wt -U< ѣN%=Cɮ1S5HDQg. V ׏FVA$K'UfQq:RpOq.:cty:DB,ь{ KߤRF඾RC³]s$|>eRjY,.+&M0ǶU%\o$< 4A|֋3uF<$^sϧDЦL}꘺UNߦG@o?z+55=A}Jn'DDJ<]fg Otƙu>-:#b>9eY: <={ZMw,\C⇄C!ﳠcR,Nn+ @ӡK)~rF|w_ m^dbhe36Zvnp-;CY(YM@OXJnbڨĸ%u8|"7HN4RπڃѹZWr2 GvC-Mz64rDN3ҧ]8le 7˙AtK۪ X0&x1M6eށCq ĥS [S> cN->15πfnz2([JE\݌j9AQd#8WJJ3W .F6jqT1,Lϛ є . [LF[1GkoH>o+mU0 t`qi CoCk2fxߥT \PlqZ%F"[@U>E14f?N-Pr:^N:ZlU y=PGFoA>r~jY2x,3l6ѬZn;<(uyHiV@bo='hyq)}=L]ϗ$;KBBFǤ7Gf͹qc49h-`E,+7Y֠|J,qbb@p*%elu$Lf ?o.v!LܛMyE"'ꇨTQaGkzQyp邅?*]3#;QEn2I~uJ~ܡclZq+< mkUf"r壃x7-!gƄ!-,=c1k| 3hݗvPn9i#^qu7hZ 7b_ :n?3l55mz^|j}J|pV\5k۲U`nj9 `=BOB^`cҳqK : O) (={պv,NΚyU/uo<;g]e~^%;,y L x_.MQӥ_# {KV%s K\KSTrFOKT݂7 O7+D~ *eNgqΜrܿ!2\:;'<7#qSպ?Ip)]-S{Иu>CLC['(y=iK[__/OU+J$ZMgF:>l:##2q>ih&WBnw{y Y.gp].L.X+c#cOo]*ȅb;53N9] SuF{kwrƠOk1"_ͦ~o.D ]ץ.P_? @`摉Qkr:kdu|J] ]21bI%>Jċs m@3HJ$+l@"34vTVݪ'f]CF}TP59O.#?m5lRTj]nqzncEf$4FeQBm=FCLs۲hAdA-e [N8ֺs/׸^eI DE] &O.+c\A?Wm|EsY>eK)UW+ %aCA~#"M("u cA+ulހY 5xkR2k܄NOy;ukqN5Sh ~J-u־[%4xj29ttJEWeZ džQP mAJ96xh2y>?<4y uhr>dg@˷+zpR9s]+eJH]k9$).m~4Wmt33'̡QiHϚͦ4gf{Qtg3?ه,^p3Qڼw1b"3A[]s@U#n}~Rf%4Z쇕YB tWF`đ!_F*q6=j0rO%ȒSw$ !b2.14IR>QR> y1cJ6Pj Ukbd~6(YZGf,4O"bH c"g> 4V1Ժ)w!5PnPs֡U \k"*lىOޫ^_z+b$@IʑKOv(a~ٌgr]4,r5InT>*n)8QӍO#1 cщ豓M<#ϫyRgnŲaed/sSGP\O+FZdikX_F]SZ& tK7=q(8F+UCmWufJjvjZeڏz:|}&Yoh%,! b`ԇYR:vD>M R^iM9(aC_B᭨adotl\B`cP2Gt^فb"Zr - Wc$4e6 hѼu6 "._NnU7r}Qq :[^]Jt`H ܭ5SzquX"LȸZ{[i x{G)W͖C>Uɖw=)Vڞl6aeflz_6#&l.Xta.;_iMI/Rb+V-0G%cc#.xe(#2y\2/U21!a@=l䩐4^/S1]vK\GQPI{E[I #qoS:<ݣ&E̡uj=NBR6#/GUSvjW\^7$ޮ;mjvKh?vm;rkv\/GqN UsKr~N!h jE@Tq s+W*I/]r+}7bEa+~ 0OK#WBrUG"KC+>\T1}L)YJj9MAZ՜%Bu+CX'9gXE`3nx4bh( LJX'd!`Y-m|[ilȀjsO"(Bz9n0e٧eEUڷWDn3 S!Q;҆I O?UJr,bRV, ztD{^ގg@(%l\Aj7u"+Zod0qdTk:ږT+%Q&/+%XaZ@Y$YhJ4B &q@^>֦ 2CN᎖^2PT+I6 ꯉO¤d$DA\'-(3#*~X^J +pfPNiK4wJ Ҡ0 P[mKйMc2ۃQI`{#UĒ'>P%[O|OWԘ9pBT907{ g#{L)SQ}@U,F^ʸi[>1̒g:碭]Q䅖qFִ}S wPxCGKY| @GZ>-UʴJ Q?(boD -(2aHKUm>2Q F^{@ͷ,_sV: ONyx@:7qO1+L]2 7ڞygƒ)ڿg{gwRA iw/Pb-e7Tou>f給~ݗH8(Fm7;3X.jÃVzsJo~~${4&aP_9(~:m~A<8nנ` @)`6ͦYS!Ɲ~<Ϡ_p2*~jzO3Ď:#, C!Aб5]5#(Z+:}_arO@!AQSbW CnUW&@_$+u~XѢ31'%ǰni{j -%RV-͵&;?ʼn7UҳUos.-| [n`IufQ}55%^WPj9 ]koo:)abh=(ivu^ GFz&6qu o]8#izo+#YΔ]*鵠oPZeϲNWVZo8Ne,_DI4NI72/ܘPHmL)G͘=glM?_Sf+Kghx4ehޯ6<]CJ*؏Yyt`W`B!Vx9z@3sM= k!AkWKjåIqi^wJ C{QܩFUЭSuY8kH/$V!y,#(\i^3w݀& 01}20(g&`%)(p3ss yZ" GE:jYgb4?RL gQBp"N%Zj֊$^FؕC|_ yB`>!zœӯ(n 1 ȭEZq'(hY;>^ anY$y[@>fR)qʴKB _kĜYc[Yo 6(w4 jR`-FԙUpX6sh7KHZ,x zOD$}⚡Fl 6 ~ٲ_F lvH19eZ&p@Hs,-_\6hl8bvP 7&o 7XV\"K r!"y&uK*hӊEY[>bxp'&'I1[0"ShZ VfӦ% P``xz,O L+C$C+C4!ks ` /B#2BC_i\u&Jr{keb1lJEؗBU@a(PɆԶl[#w(JH b"W[Os1>f}޹[3>ȋk~sҼ>vfR8>>6WxV욍( #/NVq$iq$ndQ%qTsZӴ$M8k]wY+csٳ6?$,tK8׍}u($*;)*L=\ux0r+MQo#,M(Qwcu6 .hOAY'gIQċĝ6o<\ red3AZ'jWIRsؖC;zꚉ-+VL[brWlw+ȔR^37v-W[n܇u[oLILMקv~Uŭ)y=OqeU𭢞PjP={3jX: S9r^W'<(WQ|*uHƿه}jzu_PˠPfg~=)u>Gc'Xڔ@OцRN]j4_ۑ)fH]#w7##P·%f7$oYx(5`AۼK~m("|k WU RnCeKSҿ',P{#ԋNe|o{ӓ|[ }eM}d} <ق +i5 R2o;c7*ݫNA~|%ʯ;ݦ~\yDm~Om@5>.P7*G)g'vȫosj Sa1~ {ULLF6x ^gePA)΁Y-᪒>̼݅gj@QP=*g<+4،9 ~yg18 Fg9(ӰKh>̹_U!`Uۅ1t>?bY`ÂQXAQ'Q>jzFV=*uC OI=o2v3o*%oX:AiýipV#wX#2mAݬQsz]ς4Y|k,*iXhZP>C^R6_ŷ أwZB|9W m#zbN[cMKF5m:t Z,5hz@BVaA|2n6$sv<Y˷!v?'g-TѓC%[ymj$˧Ɨd v%ޞD*o\! &N'~=ن5ROr2~YKnZ-ekQފE5prFzsBRk̺,{93(FfP}c-bȿg\Y'Q'w9ƑQ괡%\95e>bV?.T|^y}?z8,઒gcNrֺj~LͧLw6^v hZn+Q?إYQ4 VB +`@ (='yeA DAqFf5Dxsk)(DaYUj c &AA 6Jk4OE>@q8d~PiB]#a>HC8b4$@1Rq%[!Q  8 VJ`ƈ$ \׭~\*Uoƌ+V-f|߹q7[PA6wx3MCDZO, N# ZƻxERu@Ԑ1=FRv]( Yf\;B! r!B,Zk!F^C|VX(o7w9ɰ5m:N`";-o0QW'˷!"sh+bj 7KOx ʟ߯CJztAFDmEF;3R l NZ \B!l|sJQEm+G-]ԩvWKwbFwD7^_jݠ g%*6 Pܨ܆|s`H6cLs@0sŵpE;2[Hv\o4g0׷)2}͇ShwhtP:իГ2b4k2+"ew(܍%c[Amqdi:5$^~ݠ.3c[QpkOKl꽅Y5|YJ f'f\1ϋ\}%zt~5Dּ.yksΘ_o̭9v4.&֌5 i}oS{}lS, xg|9|b,??>>W^!Ϝo}qSMb~on;F݋K'&Ә+cc"n G970h s*G=-L@QDPYE&@Z(u9a]: 1V$vcשZIcvFae;#9\;<6K&[iT] -qxGjNTkޘP֎;țܪƸUO{s.UKuaORAwm; Q۩n =UZwЩ&Q؊[vͩNiVv^/ٵZ‡#l[_4?*UjP٢_v}}%VY'Rwٓ#{>4|9!/*(ط:v#5jCOQg,$kak>0p504 zZ5?,; (ZZi{3h8NAiHDxhҔ^rlZ|=ofRhiAz_=z+:_E_~({B' mN~G4R25..V_u겞  |pafҏ}]mFy#fGe+܍@R},Vݔ'#?ǐXn?Pݹ!?ր;l\fM кN4Ī1vAwoǛʣߴ nVWn'Z_EaRzyibtl%zG%A}=j=7׃01BZ8MƚYpB1;5קTm>v;F8uO(eVwP^*~1:W/ K[M..7*c<|?d].=1hcGeΓx?Px-\Zh):5V:+4sNQ}h\9m2_E; ї/=E +ݦ~Gk o7TU?w1|xLIDSQN?%}>+{O鿗>kmog^qW/WXzc _h?ڮ9KSfbnXgx#犱1Lű zؽǖu41s|v/ȏ5qO1hD lj"SϮi&[w#Fqq'A5iW(n4<7Fͦ#/"9IJ9y.%+ e;]y8qj\܊;B֝ȍ^C?HiBˎ9H? kx^ B`Lrݩ~ Y;@}iREz^*V JN!.Íeihj_vxQ[EV3ẓlkVS [S%oy~ՅW&W 5;YL]>htz.(7-ZG &75L!Hcr LnRNSOt}A$zoW qeVIHP_  i9hd'y.῵șaH-+VL;F߻Ej~P5 TJa|9n^7,t,&4٫$&)A^{OmGSޓi%82;O: )ctO3ײ>=#N9Ƶ.=`nG٭I-[7 ~]5w&k#*K,o25g+"<kQE>>@J4hͺmӢ}]@jyU =֨x 5|XSچR[M*mmU^W< :J[d08ꦓ 9u}2GQ)'6Ե_XTkÞ^vP+|ށ|_;^Ȉj؁o #d׮=܇٫JΫ~0S F7|Z5Өk1 ccm(R~2j${E7NC@;)u.Q.|'b-(Oj>ͧ^fD<׋W53[-[ْ-( ̡e'^ҎHqh/[$^eˊŋeŒee^aqiP^^.Q-֓q˲E1,NS[8t%K2j3Q]D]Y-YV,[/,C(Gm 0Z% Ͷ2 "FEmzRʖQaDC%i'|\Zh +M坸+13^XbP>r+C< &MpFD;Rs iGrc9h3ki/]TcPzU Z8jGH'Ej0f ) 1ewזA*3RD*ԚWE2?-^E)ۅ{k=)XR#9*>5z6SFƍ3$S\ufDdD]g9# 6ze.2BQTiSzJQJ߫!":CR$8uC3(Wt4$RWL iǠY'2O2Q5~`UB)AcOgK[lq9kwscS&=6{PuiWRoX*uE]5GdDf:~V0ˤdz:Wcj0/PWȻXڶQ߅j)h enC/m#J[R">m6%}+ˌ3N]v|Kq6>oy%O/dӥlj_+NR|Yѥ>(q+^9IcN'I++ZI Nh{čq9M/ io9aSgyVd—v9SQ tQ8kI ܏ڲ(U+Y.1z;w]LuPsݪ3d/|/',^ mnG*֖i-e0/Mp"m>cԫWf^ݫq|s]͐/^cQDDB"GN@RRwxsS^5hrX<_ bz#}G4thDcC=G,ۂgħZK6ʡ.X5'5Jէ_(`3(}NiӒWN};*wF,dDzjIЇDoO$!pPf`&W_ihw!b-6{OKNK\1o5'4Ulw KgwZ~ }J*&Mei=geW<է~ җ~pzvB Fdq\kS&zq#5l)>0Y{;%2iwo٫:j>dl7X3X EA}2Ȉxm591%8]}"kc55;ij`DcVK z:n}ʴk M=}&]'C +J= Yme<ģS o=Vg+.Xs`DKEaY;&hEbihm0EPg;w*q ϩ fMɋh^DH'Iiԝ@WGTf uHAq$hS*X8~x g;B@ngܦHt(Ǝm'SN ]!C8iR ;612SK@50p nBԋ8_ǭa:. ];QG.$~aFtߩ8 Y:jV~3Rz{kaHDqF0"~op;S[l[nM˩]3rVڠҦkO:٧wmo_,j ġX&Vanl[qҕ{%H,= ĝbԽ4Q\Nŵ_*kAQ ATEIApYHWE4 0洎C5+q}suj" LZz5nzX4gd J -b (}Xs㿡=qj<ۨXZЛ+oΑB#@6&">l!̮'Tߌ1^ԫ?zS.5_8#;>!nLGߛ &×;z3|%2 ՓJ|Cٿ⽘/_OV])7"frsfoc27ɺF4^Bo_}VX}pm-fU>BkHdlz]"v{eOa͏J{{013ΠFZӪ7 },7z}6 feY2Gm Zv XqJ@[;+tXH9yws ]:i z4')ػpFljFY#ei'bC5??>v.z\p|η 4tbM+kc=Xty.%RYiwx9:Qz/s=*ຮ@.V'+QpavIK  3`TVݴ >^Rili%p,rhP[1/4ПQm~]GºfrRzq+r ,Ke.tLY)}TiEc7&μWոqmR%KcP2`OUd=/T 8%O{ 5Jw`Pzyw !10[nEݗd}gH-Pkp2;,OjOgsnϊW?_ A}J at63Bdfgpg#8\2F,9|O?o 8:V˗^\nv 'j_~!D e{.4u0 0ƈ;5"0 6Jj64zNa#n#Y4mVI":1i7{aج5>u ˆ.Hi+glTh/GhVQ(oWmi;T4e-I=㿴ȈI[`bBTin#CH VN4O==_`{Mie@$h!{NM1-Z 2Iy~[?9}@\΁kIJx[S@ u*~-=WX;4b׵yKzF^{4 +Bw@,ވEDV7z;5-wzk^*_k1b~@4 m5.oMSBcU`hRtR$1p58(;sAaŞ6P|FamfGVPW2ںmm dvPw]ZiToLmNޮ8zq#F:Í&ZA4*t٬ >÷ HVO k<w${vJFj~S> 3V W[@clhHs^eX5>"^MJ hr`a6{xVsIOxzy(@o@F05TᯫϙJ 1F\'\ L_;C`â۱EHXf۪k^LhJC燀3޾NU/otl&}z.;A^ 3G;inPz{~j˸,nYQuŰeZ|kUgze-Gc (gcfؒ@k< %O^DaC&,A)m{ oPGgqlx@EPmo7btԶ?Z!_n_gOHAyƸ]+WcW0c6q6^`5e 6J:(3Lj!>mE*.uxfnSH04LJEԟ7=RF^Tͳ5r\y\QP}0c,7$*k ":tM`e DaD-u?/5ï0zͺgi緑=0z$hV&4,MdmebV<|_b \8!ITT1kT (MqN.:"RR{++U`Wa)o@@S7T?~#>$OOWEB,0:Tqn&[UBσe1HIdƗӘPwboOӔH{Ϛr^e_<*C2@F ˯P-Ro:Qr&d,I  (\f RyfԻVrpl~{aiqH .hm) Wà#ͩU2H/gd&QY_;E9 }sX/7iZ0)l0pmM @O7nSW~4G ϣ]<-X/X ^VQ3wd"O%)(Z7x|ŀWϙvPU"uwA.4Zz2##h{0tMH~%<?=CGboZ/Q/.rhkrvOyl:Nݲ$1F,KZT:#R5q>JɻAa;݊-} ~1 Y5_,yV 7b|HuhjHJ?<>g/#o;;ZdT6^_:M \K|O? HhZyYb>[#K?eZR+Y¬oұv~VxfS;A _VвKvUB˗h؏a 4on1=J6]N<^ #"SX%z~-šmV 2 W/̲8hݩ7j:N=r " 0 ZN'a'v*ulC)P)fԁ4B!rAvHMk?G>dvԎ3IP^o*ڶv6d@s CB2es &rPIu}k,j؀| KOAqϗE7$xSOf0>ʹLCv*[P~BFzAimP{=='#EK\nJ|]uįil+ =lCY\2nt҇p!3'n ~IT/ TQJx@S]jt`w.ĵC}Fv`xip]9w|~XL(!GUKlhޏ9z>js]̥@e)' N-#R9[}\ͧ9m6tY1R]q =.pZQɎzi3B0q~|22g谞4ůҐQB6V^d@gq0A0`aQIA_*'<|Bi(K -)%0fҖ|Qh uH \vUZ̞i(xFcr~]%kQjEc={<*%[zn«W?jO v焳/PTJFElgQϺ5EAƟ]%57Lmk@R=$CoTzLT}nY_)GT`*3q}*;z:Dv/ }i"]=8XNtsȄ[=FFW>czN*'"Ͽ-c40 Oa|NnK'] <);z]~܊YL O(}LvK&>6㫐;RͧX{ದv'8E.dHڈ4O{sRf)F+(.TA:]q aa+Z5Ymn :vQ9N 7 8@ɐQZ," 86~Q+=4$~l54K5{[Oz%i GG g.cȉIV+E#\L^л溍nEHc XRB߮N ة:q)ݸ?X2bkgDތsemQ/.Eo\IED$s<4O߄;\D[b%u5(n;(uDBSj i4_B SBLɝ}Zɀw8:G*6|JeY53E(W #+0ޔ+dk YQN4ΚP_d^(k9r}]I: ԫЪV-7Kc?FA?X,kKCDVb~O6I=[1|=--sK6ԙF ko:,Jy\i,9J߿_vyRu1ƴD3+Tu wk{(/xjb~)"xGFMGeI)l_O8F-F}Ϛj☥m{^A9/ֶlȨiZZFL?W.Z$T -*Q-Ha{^P=ƒFOZS\%ǝ@O$eF6?i}U)`.Qs~F\}qo!iGT#@_n)%Ck?|Ou66,<+E+6iʭ{~bx玭T5n_H+Xq (zr|oq7_0kZZn!n٥Z͎ Vmbu*&#`J $.R Os ԖLYA8^uWjە2hR+~8ϭ4n_74R,V w}Oj>i|O}/zA,ۓ;GTj7׮-6䫺&_|&sOAsxStP(o({nӕ6@+&0̳NJXGE-HɈ[DhQTRu;|Ę|J"Y  3m&@@ FaS xp *'rX@blBj~Jrgᙆ9TpyQqP<3`"B@~(-Ш] 7יӪ] }DBQ?gN'֖gz'[ѹ1/ǃN xLwm| N꫻M,zF7-<,iIվJƍ/F7C{̀LC6$`A)(yZ9Mu~TZFzz9 jZ%}JGCggd\ aF bk:P=2VFͧ4ҿ7 psy,Σl\B /PGm .5.ACإoZy;\8qI&Pt3~>=wL( [Y>):V&CD̾bLB71'kJ@kōò[zMj֣;!#M>uP"/2=r.ilqC Uk)(G72f4.B}2:ZQ|7'ڠZnzdpeRy=3ZhღֳO:X4o>yaUSW^,Ҭ>v/.rƵT }oGbKQBP Np0rj t"I>&P؋6ZV&QE-dx-Bf*! =n5SUKnرT]@r@p-` NL%UVY#Vyj!%u#ln7w:B~=#=%9fc:{.#Er(2Nv $2K`m9@#JYCnJQ?Hɑ//ڋ'Ґo":9ܝEJ'wUMuUh(DZΙc߷vX0ek-#@uH;{\!x[6FX]tzV3J9'ΟR:rSNq>e#;ux[;ttL49l i>e H}`ËUُ|Z1y2^LK,rt{\(O2,ug_w/}ﯛ|]葺u -{( yCLLc$t>ͧ4>}٨#ٓh |^rzҏ=kN41tX1޹4Oo]"< TnM;y d^\@ B/*4,bPYGYZ*^<deHpn_z;_&R,hO4~灏 hnot- ik1)j^-X.t!2,r|5.A4Qᯎy@'9R#cY +wΕZo3+jhPcA46#0gj{nj-tr̸ߣx$&Gk-zhԿk+n0!}Rў.4O^0)^E$ w} > ų8zb$A})cӧWzB>' q+zI8vL}(9[L@{w?, uYwF˓rfIυePIzNeO˼^sN:@/µEۍ5|/Yr @<$֏ҭ~,>݄0?yUlPsEYiQղjݩipA?Ľ{ ZYY1(ҧƭH9n]b 8. Q/;\^3eNiR@t.EbY峌Fu+;<t(@6l8Nvͳ3|,[jwQ$`#߶+>l(/ae65S{WG-0@}4OBRiv"N ʟBʯnv:{ﶶ 4ˬ JTB)zL}Wll@#u>~S\~Y(@Ii|}ғ]R))ILenƤHxUվFA4JDMڂa=X$)`pZ(tвfM:'K F=YeiΟaPzM6-&*Æ/%cΧ#R @qZXי{됗4YbMP >~N1UɔQD{73GڪJS%| GB)Nȳ<~\)jV]+^G(}ԤWP:f >)n'f`Q9"8?ܹQ⥎fUdɴP6V\u<KQ#R)mFIFwi^$U~:h]n(gDҬe(t\P='b>(]]>vk#m}=|'IpG9ƣNEQ9u{%^fT$x< f츥>oLHX]3NY"7˵=ve"2S-=_ aeTBP7/М4M>(-ȨJ>eR-R|VB-AaoTR^ @p$zg( ~Fu ڲO^Xv5+18 e;JdaeGqU{-8{+ƻ.H^53u^Q>ͧ? W' Wk%p5Wﱴ2ߝ7ϠS۝_Uk}l"V4lz#M0G9xZPQpO9ҐȚ$4pQi4~2@=6rpw$èQv}sQҙ)-Hq!Kq^ܠL! s=/.N[R0?rQΪxQc 3*qCMr!ǕFi ݕ,)lj򊱕V^qJi:Un3xSnB΀A n|Q_4;Z(yw=WRM|.DGl7Z J ܢJ] (yN~QMMC: >#ګ#(ˉBٍȱ 5Mj2jP/K J2?1QQ28)l"ԕfdd7)a.6V%-{/U8|g$uoi%'~ؘ=. ڟ9rAyZsmf@}EhpeVN ZQOdBfnu!"z8+ޫppsi03n6.EIwQ%>#<Y<[DVA;>i\!SWhoT0`xV_5ZSB(@IY%wv!'A㸴OX 4>h̙ v9[hDgbkPԠ<%Zop0C x'U 4Z"L=5{@!qd~|>>+J7>Ro~3}<ݮ:vFI,Q6EyeM@jq[[4\?C 1nEC:gGEAԮ7]7=OL9o PwL"szQc{CfM$aHhS"D8d1%z*7l J8xVLH-q^gljd7t{g^`CxM/(oi8*y~fG9(ۙ5ZjD l98"OɍJIm2W9{q`PzH0B+gPW0+?.:"փjN%mZNKpԦk_1Z-- :~)O2>Q3d7 wC &#~xJubFt uPÏES>Yo·bpU14whʡںgQBѶAX Nl!*}:% kۯIij.l9Y/fqS"xbSwZ~ AGѳS*s7 t6OVS&MǦ;5gjD aEȓZc)y\clGmbS]"ƮK%Z|\gFRGB1C1G혯xKp5 ȶ;?wn5uC2 pų}ꘚO;6ttl}d4@]\ފ @Zo &=DEإE> &Nm6'&{=K`{^sG<1/tsC:3gpJsBpjbYL$zT4  S/VծjV d[?A/hakf%Ys@m%0gƺuˈSXES qA3J<}`oQXЯ|I㻡|mi޶,W'V<%v8t+Hx_ջf (n<,V%aF`/CBC/\]y&Xs@{ Be! BI э L%`Yϙ93Yl,"ER ))Q, gxz}_{aBc{,[{+W[__3J;?5lU=S6{|7~%K^%K^Z͘E';k\uXݪ֦ŪSՋ+j';~m:ӫuVUO9y8qԚUkN~kj~Q-NUVөLWN@5O-,ZZ:Y;՚V֬.VUls䉓Nu4[~jwj5\]ѳ1Sx(} F쐸bӻm؝$>c_fd/iͳ{˸YyĀf,vQE7ʍC9jTsw|^yw >2xAKZossZAأΑ&8C|ޤC]|ʒz1 >h㸼l>YnfkÿP ξבW9׈-9aŏoީ!3zfFcxF ݁9'n^l%Uj̧ gZpస~'s>Z'QsД?AޭG@_4-̀]{0k|JptWs%PkV^e<2TԪ5ի+O-kZв/Zz f`kuer!N.~pQ:Y-Z}ʪjd/pҪN+]MX]ujuѪypMxWNv U~Q;LYzp )ZvQ΃kN-.UNM/Zg[5r)@NS6Pj@z!bG,n$hMu:vgqՁ݀M4XQGUI3Q 2T1T:NQ4>99h2%(Ո7sbt"eMa\P3enTuy ;cQ՚ x|Zf$0)B@mTnqE@ ۨH / 5 KT39e8h tۈ<+ C  bk  6ia_/YgOz\BNci:jkpup9o<~5g{`Q ~#͗ő5A={J}Kj!$DM3f>ŧA 61u\J 'Mj尹Ynt׹8.7~3"KvP _1[ƏpGv'O.s?5mqQ@=AV1q Cobwr=Pb1TOxwviէnhϻ8{^ۥ'5s<"1q XYQ`Q xf6fʝr\*ΗaF{W7~ i 3agrD3/F|wh߮Gw8~6t%[Ǖ>qk+M]ŷڰ|GaT aVΘo4~g.UjzkW+>)_2dAi/4U2RT.7_*Oa%ѱ8hoaIx$~%+j7h%s5kWrB8(k`:Sb 7NcEZR/ҸARf7 *ryYO4*r8M4JZPE4R-706,r0Z++qZHQ2FFy5ۨ$#NQD!v]7\-05eI[ iiII,*J)xѢ88MRi "9&T v[@ .]bf3^y%G/XWxnѕ2|LWrS2CEhu a 4tҳ l4_U.V^bj]XiF[5R.p;!X8IiͿ3\ Y8@z.-ٻ?FB8?$ИDq/,>u0#9cjĂWpJByyd<,?G$}X9Y"Q'ך0%uh|]$nA]f@?kTxX@O[5>rf=5MtWѷAcz?z %I99?w UÆˠ q|f=)^n {$f5m D΃#kcAc]>~d޽pݎoSGy79yHXUƎ0u\5!= ^-'m(>ޯaͮmZPi't~\`/j-2ۓw >(Hea:!:mv^Â%sA?V&G(φ}94bԜ ʝY' >q;Zj̔ͰgG8,\=eCC6iPLɝ~z[tJa 6Ī{?Čx#pj9{旼8#r .d~|@RU>u2i>-}=s|~,vҕ+e߹oDU9j%$/Zv+y{B 6L1$NnX8\C? @Vgaj9pZ^fd x-ͳvc} $SN;|Q49699>Yo!j #b6FQ7UG;&6c#aEc?kFb!!xwAeRV jh̉wV8.bZY=^Nc5Ibs"tsۤžA8>Dۃcj`8(DwklxՉw(>{ZJz7J\xt];]8]>,؝D+?9`Tto7xnN\|PI)ؚDxF)=:A6`;UPfR?9.4K3&숞ۯϾ16+_R>)0v>wώyF׀uf9=د{OsovЍ>G<s{HL`ԇ0pޑqŌ C==n~ڽKXӍIAFuo5ӏ?pHu`u2+(.ftϊouZ:xW)v%:_VO*vl4t-iwj ^MJ) w9wXZ l=EW;yΧ@tL ӡ)lK@9)A7b! 8))" 59 !:,־|qD>Pٙ*Zŋŋ:(wK$t RC0ϊ$+"K Zeb8ձi_RNH%ӏ_ Baa8倖%]ڎi.n?l^۵Dk)L4ߪ&P?¨-쌡~-[\FND3jyPȊmF$B%ڞyu>P;%bs]Ιc;9e C~]gąȖS?=K@^, +}5\ָѢv^`}+: CљUq݆|9꽸?,#to^7Fs>)oUnKS.o8|Lz["G$G;'.>(Y9A>Gp x6~}mQU0'uKamʷ*h :qp%+ 鷫̃sҘg<;5396 :(ndNqcK݇oQː(5Ię#_1])$g"{%9zV7L yƉ8gyN<}N>A͸3 )zζ/Ǫ>Yjk$zt`և{ e|5V a:@/wTs~Xf?&r> -{tYcG%x_g(F|kO69ePSWͧ[Э\%@5W]y풥+V\e>7ЪN/Z5;[I"@*MNA3.њʢ]I/yVO9VR8J0L @^e1@eQd{bv&{׳)4m""K@Ӣh<9B˸DT.eA9 Z2)qF[z%e\'-SR!kRʊ:Z gԦStEaiNhI֢!?5$n #kfa#RTo$)aJfRK5TUK~ǧ/F QW.K/m cCTw_HvVbX=,=I}jAݍo@Zq>3ߧc>]X4VwǰmGwnwb(}F簠nV k%]C\ )t2Gi80wTں5lBK#B)>NϨm("3+V0KP !aT#A I[ĻugO;t[whCui^~6œ#:?5а#V & <펬`X$(23&0/nȏXFqv؍WcR\XKz?*n/uΠYa{FZEo2Ǎ}:.}X,U L7Χ)ބ 3lP<چܜ9(=7{doC/It6Im4{Z='O ]`lC 3y=V|nF] 4"6a!UsMh _ͣBXW{ ~D!eڃ i~ռ>cW{p5]|O7=t%p:ֿf?OAT{O d+i/\xSwE5 2oPA{5rzʼnv:~G錱B79i;(ѤGqԀj!>G_8~N%{n} >wTvEVWsZ@3hsd qg~eY>yN#|SiLfcW^AN|D3`{F\yjx] !s14GMyJ*]s3 K]1s" m޻` nC!p(ƌbOG_":]K(nW6 4weԙi݂|zp:FY18[W?Fw c Y&8j?1Fԗ)FdNF8|9%c4݁ZvQp'P| ZgaǗs6т~@Z]MQYV*8NXS>!e;'tj$?m"~F9ǶOrhP&W˷ބsͧO/so OXB1+WӾ|/$^6/D2β0 8zZOgi)*M`٪fY"rPjYqeEDKϓ?M8 ÌHS C?q%(L4Nj֌YQXȚX,-I cjFa)F%m$()$EWfL)HB?7Kzʟ_*e ʎsww5_|_4q TK ..BW.$ҼH.$>gp׸37<+k>שּׁAqUء2E7zT\G`EYa-_ſn"Z98V2|l699 XjA iIքgt(zzlaa^N`9mZC|ּy GO$V#)zA9wpP4!q- i@P_C[;X]kF20Ca/.0ﳞTC>,[ Q|Qk/j֢꺥O?c 4E/9. pgov7֒nTgحN,}RGuٳ[t(Uz>.pǘWzeYknyw!}$rL9_w15p1}ߤy.>ڛJY>Do l~+~\uY7ry>ozuA@R5fLe\=job'I|nͧ4rֻbPz*[AW^J/5xqe4YI'E4Rhi Ւ_i3rVY)4Հt&8ۯAh6O8|ixZ +>`R%bL4Ƹ (Aj^| +.ic]_sW0_N3|gſ^b.V&"urNgS> xvY3Ȭ Hg\֘zs{]7٥^VܶWwsX 6jyB{ZWП9/IZW׼gsG*t{Ϳw\gBEu ,9Y v,EԣϛpzƈՏ-xBOY]$@Ln7oƥudA>t_֒~ " 1g>H`Ba3CYƑ׎7pB{L$}}NeF)Ņ4|_s"H[b~I ˷bL)^x|'sz{)yԏtEf+6yXPD~ \}Q0J?Ur<@ͦ?F=s5!$PG3ޮ)Uy]-߀B>qxOi>ͧ;a=`g=V^*-[xwKy~`ݏP|oQ"Nz=˱G&Q!Rj-0> QHDlfY]38%XˤB8ZeHi傰:FI4hB%I#uy3Mcj=L9'M$'), 0n&QJyfT@T^/Rz 5qOz +RdOtσj0V8ZP)7}"W5ב4^ړ91.ƈ\9cOk@nquRrS0{]SV<)"f@Fq Z17/ iuY噑^ oƽiq'(Zv1O;}Bpǝ1v6t SoU uҎg 0z@&Bk@S$t6*qâv!.ۈhyx3.K!VQ6$Ess3OuɝL7}'0. EY b?~c?nA{cDnhqE۬j񪛃3հtd]F()ht609#Pf ͘(f _^Q|ͧ$$hOi>$Fo_?kleQP1.1+Ok''&NkYjEAG$S-62F|X(v0NB0x4q'j d(xA۸N_MT;ow zur;t/ɱEi2as72c}SL $S{,N-Q;O;rԚjwC_9E:%mPYB@  BTs"o3ֳ4Z.kIT*JR']=e?~X*hT.>x\}@cds3~-Il4f*E x3~+^{NX從 txL!gKjF$LѲ$=ՒYxs.oܩN= 3:Q2;-{)5BmjnW=ah[fקq>Lo١Ma{sqSmoCq=[Gh.nC~O9D*` +zl} ^2]O"!2 ~n orF~Ho.p\{QwP3!5#pObLal$#3m<nk h75?6z:Mu4MXb={tn^lBw*nFɧ~LJx #=OcGt?!MNvD^Bs߲>Ǽ]NA+@:_c372;'ى ˚Mw9]5USޤs~qXAtH7q}͒sK!ZwLyonL"~\7|'#TzCz,؃)o3 4|/_:_s銕 `l9V{+SNzCI@Cj0#IFkk<\_x\FPpg?^T<ٍN60d'AA&jgMVOXJ+?B O5ۣQ)X'RE4 :I5YN?"Dj4sr{$&;crsN{-58sVeלsJCUސ[k^E}Q-BجR0oh|+1ֺ.k&vh> aʳ~%oE $!-X+}|#d̻|i8#.(>伢E1r C #>!̜Yv'yǡ/su o,[{* >M8m3vL]xJ7k=;H+7۴CփqsێJ9m |3` ڬR-T`ÿ/5Lxp=KeŲkcr#9.Wf \ :Fh{OA> ^G]?7kHun7+0!E<&T=o얥;_3 n "mnCg9A/ ݢc{3wzBFiכ_֓zֵsrlo34~|{DpЁ[,JWzV^cj N' jTid0"i F VY:$=-򬛁X~hiSجORXH r- J5> ɰ*hʐi#M*d29 )d4 [t哥ᇕG<3^oLq2EAkV|`ْk.A7?۴nHQhEڰ\& u9 *oϾ-_+`Θֻ ;$5 p8c'X g%)+ 9t}ͨUsX3Ijzy|oB;E+"ܵ\sƢ RQ }/>AZ1 d-t\Aq4M޳{ڏ}y~ZEe܋_x= :ߢ{Y5]砩|#9Eg a*]?R; !_AskhdИGuqjy.gqr]x# 13!*8c#ߜOΩzq#vLK7!6I&Wv%j2"xawOev\%8fZCh7p|mμK4Oq*](X3Y| ]yK^iߥK ~(D=K ]X4_תr4ja3 Fj5kqd'h^c\, xOuNcL[,/ cכQ3 ǣR%q-MQ44MZ3`Uӌ'v0[H<#vEqmMRe zbv0iL!%*Uaa p嗄tݾd@V.S E 68҄3 b9> }j\ltf/` gB t>aܻmȻ>y1:Y в# $S+ :ɣSNn˿ >XQnz`sV{#slTϋ2 8^5vo˕'nj=r6ֹ mGEKs|C9p;e0u*4Qh\ۓ;Eq](gXo(NNvYh~Oiyorn#J#/Qm.VDϭ4ϨQc]N !ou-~~IejL"2@?7J\B 8ΌC1}'ʲoko0T|K#Kf`~͠E:+gcBvii-S#iC:Arey4$vzc>1=nwwZ}|BO׿q0id>h 4=K-h<|lΧtzA; r8K2>%ls=f{ۿGEWk)8j$ԉ0MV+tP,qaZXRZD0ԫqגdE2NEO<~YV˛a(OK G%Tl?w=id J95 qT$1b]aWAO6^)#fǵZAa$DWTqz$#H9H9nd8YndӸ6Y*MjI0fЈ'#[~E0LZT7Z9dIR-kIt(#$ԯHZZ*go9y+ze3-t4A@Fo  铕a :Hx=2!"m'0ݭ aF{-I-p}6oϔ&047:GLf&+>ʦuSOɫ3]+>Mڏ~;@ I $YӀ "5@Y@osA[;{9}zkXW6'Y1!'--E|;.[z=J%TKއ.um8Y!ߟ9Qz׌=i-G{)z?q+2i>פ'47/!\b}\&5+OaI `UPt9τ[ #c#7Ɗ3qNh[3u/^o$EZd3G-l-\Tg*%o- T"2h7e(Pכ.7#P+gYSSГ T43[+oQ. & Rl=2+ eoTHF=Ip#! \J(.WfLhBAgrUDI<rP*Je,Z䎳D򨞤1 }~`՗tTɨ4VFcva'$Nb_SHY8=Ff v5i NxăۥuƲ=ZBϻ K̘ OTf^T&W]vLUֶavQ6FB3+%5%EQZۨu^fkT1UȿNo39P|LL} yiri4G:<ӫ|V.߭bE!`5^u^~w}xnO/)_7FAi<&*XmA®3B6{j OEƥ{vFbǁڡ9w4(:g :piDki914\*K('(9}QgIۍU ]{apB{3.bYG1s^T}=)X7c|y.`<=$aw-~/>+P+^Xozڦ# d\gJ>?%͹k1=iThll%ɼVG$^q8{aCpZx\U/^F%hq\Gz <zǝrjSi\voh`'=% atя8_d̕EvsZftGY3{~M@Cz6+>{}Y[!m2Vt}t ӌ bF}̧cb׭?R|U®W_>>5d2L7}wodԅ[YJT HHZtN'ST*hCX/ Myw |ZPy0t7E&+zY6:S t2H( E-,d8U{f0N-}CiNL Dž),hcB%$UqzlJcFd^SʧEYau,h$@cJ $NiTؑ-F#ȟVӔOJ9 ՚qfe3.Y9K~=|1~cV3z&Iw:,CTEZ|[6 9b[v~&61 Ks2npG=+sjb}qoyE2PoTquefN{U_!ro)?A=ݢugI_OGM7n & ߨLׅ9}A8㞔8Ygtc,.+λvj θyظݔYDC|rcG{0ѳ+1jݨ>4^TV{P6J-w-/n5zux>kZoV9F~ꏚw:ZvnQo3]8Tjzy76V/wn(dqoQ7lҴ ېzGۄixc9`>`K>G(v8DTݧ%絞=;WVo ʐ0v:lD{ox/:M 5aI#@NwYq3kѵ MwM{16~I 5!c,n}3ni#)鯫ĚV6@׵Xχu ]F8p?rC9o<_*Al'68^/1*/%)I;9:~cQ235ϧ7O;/K^s+_.rtߛ5)~3F%o4ިGT*GʥQ.WʺPd#mA4QWQ &*A0y#QLHa K͈KMdHmFN5a3SMlaX9OQ>`8e~<3)K␮傓«t,*6 ?3 kq[=){6~#vj<ZϗDUgQ ןPD)w7juVŝƴ~QԆl{l/|=j#Q3#ioT8~)R-CqmޯQPyIr9lC}D+ӝ;D=miZ~3֪PN9tPN}Ec *:(-ow,q P0!A.Eys7w7Я! .ӆ{EnV Z2ɏX-5[nsR:{+<8}5v7hntM1+*"dyσכ1ԓLh13-]u]пF]6}a1'&' ڄ0qrR#2q?M)I|o=+wi[̥+RҥK̟OZiIwWY[V2m99#eEҚʧr:eJ ۍFcaZXysޙwKI1faIZy9Zti^Dv;iu2(|!}xW(]w{}Bz=j-_ަYSkj -Z0G;m8Y4p<@WK1[#AzgTŋt)'ףqj}#wgQb$J%LY3hAPN \-Q#.Vkj5`ٴ"?٨^,IFx62PO іst9&_6 ASG ut؍ikDvp\BbReۈ5M+*mPo{`Fg,u7&~oμ]-#]=Xnu8u )nZYշgs5&UcH. ʓiÀWuyJm/o⩚PN!pXj~16`EfQmJW0ʞ19Knk,Əz-@ME1EFUuQScBG[#6O6]P?i˜sQݻQ׵Դ:lm\t}zȍy7vnqü=\#ޕ$T@O= »A|t!H}exgnQW^dUK6w32Κꢿ6BK'OV,UO:u8YtąU`Vf/w%zX}Է_p^P#Cnq^GKA byF ʣx3*a3OI3!28M Ah֋"oMkk(fZ Qu<gT3- 䌃LZ:VHj\1ӭl‚q&UYEhe,NK,Q (r@N%(踞^A hfiܢiٛcnUg^zѷBCRJWni!7.;]ק݈N/JrDxu ?_T<{:g _}q1]o{e@6q1Y{`V͛?zDsnIkkW]y6A=y s?ov'qgf hK/w v8ۢ9L7}N|X7G>4@M ? םy1v+i.ZYܤ@Fq)7^|tcEi6BٕLvFnZIixGpݏ~sNގrԇ=uY \y7^gpty;F1> a!8Do4NMJ@rz e,g+]e~IN68iTF[f6+VA[\!Vg1iNpfj{=mRZHSS()jMI])}~|rr,j6'ɱ $4]JڭvQg,\A)'sgtHKz"vWݳ Ua+,@qWn?iH,E%*$4҈c`[6guЕOT!؛aD(Lj8^ǂj7fBA(&&O/E*R?I=uP<mV.v+2ӓo>jhBnm\d_sr 3(5^s'\gssZYkz&:YA_):;]6Wyv^FQriֶɭӠ׈ #.*己@ F fO1 $7xV9X7 Vfݡ~7,;%{IvΛTZ@ BÂWU "f{uwkB7 1/'V{Luwݱ,%$UAlxNcA9MWJI7~=Qj tZ7Gjo_D_5 3>fG'qX@/h9*FĒSnN|gdzKySrj?"5js}{Bܻڹżk}.hL;=+鶴-pJ3u"?eTa8ڮA{>dмyi<5;#CB~cg 7:(:ZђN5]51 5{یkSєBEnjafݢwaAޣmfʜ+7;'g+} Ux5bؚ]omɭ[;+G,cx1$Kgo!b>ͧiZ齄3t+m%W^MSW,5k]uPBNrBQ_aًvar;2yY3m$(@@y8M\Hc8j-J0jf @eZ1[ús#jxr A# C_/0*JlNf~2P7,U2rRϒ&08IAe4G+fZB5SL²hSԬjZ\ #h ɯKy5&QKQRPkHtf,!*;-o7ۘ ! ՚]Оip ۰^zX{si֑X;mqx 5݅,cNb {BoY9d]'|kߧvHkO݉J(po25~O۟Ȱ2j/7wnǝULvwzD+68wQ Ͼw~g\-\:k9c@ ^ AhˍƳe/3n~ܝq,g[U{ggӃf-&YUWBp8Щ#Xd6RnF~AHFa~|q+*j͏Ę'N4bz:!w#EIaD؏9T+g+vy7wPw˃Edzwj ɢ{V!r[ ) +K4:,.QmI~͗9;}~_9?yl4g8{ypipP{iT^Iܵ4aQ|=w$.p(~-S2Y6p'V{ڰ֢|OWȍBC^ ]ux_ z/I@A 8 *L"EM$ I-wt:m;+tKEʚ8<9;Iwgu굲W{{H r3HrU{w8s{FOŪg擞1%޻p;W߹bW4gƬΜZ{ D]kOvͬלZ]vzrՙ'ׯ]֯doOw5ﯮvׯ;9;nmOQEĉO̜i4oִ[o?yj]qdTO [?yhkWN9y'׮KӴ4,-<)40LXFi\[dyͺcAJ, (QKA%l" NJ֫(YQa;k'EH^/q۸Rj&IVEfvhNLOOwIۨ#'|ti]Ni˺".(*4yEeY==dʵ; EQ*MÏ l*riea%)JN;ɚY02\*pUH?NJ"]b˚m-[uV]uc7]N\5\Mpnfl8z{مGsy?̢dfAs+~1K̐rbqoGsXe`h|UWx|.F73;Y\=:FvVcGYPAł~3ol§y ΔߛQVP5vO!guڨ^ߤaWY=C*1i v3ʐͷ̼x7#A{KQPrqat4OwxoC^-52hE;ܽh=o97fW<=|ePv28>s F'ś_h}i,F2~ܥo5#N̂_ *7q ug+~R#;A7gvAiT N{CŤyGYվQ7ը7 .yWֳ&G1[qYsO a]lqp~U4K9)UÔ8n]m ZO*m/{5E|z팫Ca7Lw'/17a6l0|QO/XV>y5vO|-[5>7O?wϩ׻Q]^.܅߮oc'ѿ?_xӪirq?Fo̬1|LaއOan[,n7&/wb*}FVDA"t,3`oHFڄ:kg]4tYrƨ0ތQ)c%(K)3V Nah7dְ|23ϡ! *⼷xD!@,`曆J}7F  }LTLޅ֙Ypo70 Q)I=(\{r=~>ܦre-v!(=(  ̿ 9x{CY1;#k:8x2)5UޠM~=xOZ@wkp4vLKя1Ե݌O,Ɨ\ GąYp[潆+E{4Jv3k̇5yaͶ2$]JHy[nTcWO1G] {͓Kaa[١ȹ~Θ>Ƨy̓sHK>̣q.yPN<"?aF{@-F!XdxƄ-}L F3j47rSzce/ q ꡝ#Q4г53(xUo$xXs uͯȞJkhP j6rjUvaN:E7D.ʀu lm#S"`\15!Q,17tyN(nw P tePFɧy}45o y:|DO[h vv^}Dht^jxw]oAl磻;߯I?CO9]G_ZJɷx-Vw Jwize'rD*c%cw]mQ/F!Y|N6+\CȷmG&"-hegK4^S#ڔz3X$,jiqo4ku!Hп9^G!p:[B߶hEK6!*NsH亮y1o+jMO7Q&ZπhDYcSŋ \:io| tWN06SҞ= `PK zǿoS_ꃇEkucܨ'd\$9:~"Z^js3˜뙛0BRs,_?,78Jtk?@ E0{2wkM9>|I/Cp߮g{#!εh)ҥnǹb'|A@^T#nd]b|;ї9S&-np5H½ହ Zc=F:Z=W6a1^ij6Mt1tg35^@gzv\}y0:rIenT[%rGs\(ӲeyVO0HqYX6’gQ(NFehZ6՘mBFzfI";wڛF'ib)Q]عJ ZESYsmFE:G &pqCbtE񠠎)Iə;ɂRM8iCH\[AiGjĭ3ǩasдE@7P2aV+aдlhX@ji\Ӥd huUDҞ?Ei3;ܥ߫ӱZ}̐zCV:/ zHj8`NCzm4UvA BF:!mN238O }CӐ)/*mȱޗJԼ@JN q,ʲ{Oݠr Z!r}ھ d?GRh4eQ~8M %qZIzKӐMcш&pqHzӨuv.7WFq'.6 ǼkwK$~~oH ?V1sG:฻cNPBF]s7 3UKHF>2B_ͨv9O ޤzq!AnFp.Fag~?^hB&YТ#Z aQfgjj>I!>cGEfxpʢB@q5y0 >>ߧm3/UNگ>~A9,K,;vLH~̟st'MXlg̯ktf9}g(KNj29?׃3\;:ir3@ΗUf0ej]c+S`oBm[Oσk?,E9s-JմFZv=|\'q siCd:>ܙ7vNz9og<́;_*͡\ ؞^ ڞ”ڀHWRU -2mTƏZC~N+ÿLƙE+I:QY^dvf0^ʁqzNDձ !xy20 e(@q/5[c%' mwf#ܚh62'V3>n֧X)æJ_s@RJ 2IZďȟ(ZI%@q#m˶ި\'_fa{GYoR;#nSv\_;, 8I :]Z[rnQ2"}wr\snl6Fv,O/5|M]o"-KKTS3^{qm ww4uGE]}m7lr6ζc99F3ӽE:|Zw虏4/}.駗~Gh|֟+XM+2#X/כOt(lzV#S4V aVǭf1 ~Ԍ;IsOn"ݶ2@Jƭ(ydX aef9kTv:qhtbBC @ L tv7AD+ 0+p"7m!Q@2&;\moHjq^v9PEOT?nz&6YAnwlW/ vuC#6n4=!5'1a|#е{)Bts ^LKaύ[ּOF}2|E34z3ϰv^QH0ʝv*#hS~g@mHaF<.sVvSxB*K܋Ry3(=ZzZ}Zp=2&6&eZZgm(mU퓮sCnvq^b| pn 1<-Bup< b/BHIoiId(~gPs*rzUuj7WPvޅ0r'^EjB4&cwлyaT,!cl7,j _^_c8s378=$Xh9ya[0k}|\ͼY"fhb%!<4)S~f-~{-_|9fCb~;@ҹ*W^_i?ؿg??nf,H]{?Y&I tu4 7Qz«qJKG*D8^-a=l9WnjiJbBl5Q%QZzI}Ÿ~1TFTm4Rp=a)ԈEƂai-A[ETTqԈB4AQ\V`º4>i'&qR?(JQ4AhԌrPH *SA Ai7ctQo%2Zn6-1RhT. R IezP.EAbzv30AHUxRÑer,QQљy4zKI{'V:q#و6BBnp`mܙeoA{ho03˂_.TIEQ\'6:/fvU wO dLcDx;€O_G3wgVxc镁B+t9JQz\=D8DD*!z:a  ͍Z+gXyr'2PxEԒtXܠ伸ZG bR:?W\[Lnv*5wAn'S@U@+6$ q:ui}q~50>64t Quq zH=s4r 3af+J pn!p$Pڱ>awlVOR嫺U'-w}?$ArͲ3N4&UeeÌM:/c1Gb?$>c͡;5ԘЪ⃨E.ʶsiۥj<5XqDW؈ e@_mxɧƚsUR)E/64hg34rk!gZ§ӪRW1V6j%w8U|/f(o>n(QXpI_=Gdb Jyʥ8g6?zzYtQf2b5Pm>B7)ROK4Te)[3gE;do`wlvFQQzyAfQK$I?o,u^_։_bay[^osH3 Qa.Yۓ/@/N[-I;(t2L3O$J'I9DK|?) %*HjY;=91ƚEl=J/Aro.~px^cAIq#6{(^Yg&xH٫hvέ2\LJ}Tq|9zPHϩy/$n3g,-}sQ}=ݻeކzˠW7EXZ~-<rӵ5 EM DtM|\q5Gwq,KcUsQ ͋Ϙi7ǷT:(*;/j 1+iUc2*݈ۢ l7;' )F; =$Nj3=j %MޣywJݏ~Bua!ɛ0X>t!Ec!t1MH1Hw/4/Vj"گ=u? nз&Iy;΂(Le@mi06|51$R;NZZ]8c$y=;D ])!/,[/hXz@H= U7iV è(Y ד ԧa6<4[IZ2g`9H"ms*LmInГ2F5Ͳ MpκqE(Iȧ$Z@6DjÇ :M)+-`FNж O7_M<.J[\۽׷ Xr/]/;1>rFe@_{ɤCF08uLfo8lHr g8dlw?:v+Ԧ Ox=+}q!i+ru_z__3CF9OI<Y0~N&{L3YI]kwY͞(yΖu?6xQŵC풝܃|mygKY  ix̌erq-%MhNQN~Ι޾k]DyzؐmOZ4p;\aG_\X8;"ͧ1neʔIqL?vzBzƶ;ܪ&)m8M辧u|o [=XOH]~RΈ#2$'2~Hy% 3ކAkߕDm3Qba>)VKSvut1u>Zeepml7]jVeڰrqG5ڄq|`R'A@RsjP+Wi(ҴJE0owS|S=,iM¾8a&"Vv;o4F&{j2 B`,`$ۨ]9~ rG> F[ G<. 1(&j!~Xk5I#,%-ԓfh5eI+pe?.?D[;*+H+wuy> "jo4wHA֛}8xl;eԤv(GB-/H:xKRqn!"uS(t/R/D ޻q/_"g,rdyY.{==ҟ"cs{t=w>Z0cV2Xݬ [(APy,楇06LߨڪCjPP.mjLEǢI ÿ7:w30"j::)4ѯgQkyz3~L"o?) ab@'YrY} Z 7 F=GI nU &gS`@w( M9t@F/GKԘ˽AQ? OA͘75TA9g~nN! &Eq\Vo8_Gfsm(x$CXՍ]}N=}] 6&j6c5wҧe[6 bX=ЀnnV*&5g#nX1 ھ]~Z#>'p퀱nG:g@3fv65ӷIQHk[p?ҡ85?t{iYp~^g=s~7n^W+]̳=M0jXfHܱW)cWks?w7kE'm_4qmfwVhhD.Lݮ=0n!s|W\mc&zce η֮~ҋbϙΏAv}v:_zof Բow8iJĖ*|'b\0-Sbx{IFtY f1}VȲmg9F /oZ";1 _C4QgZ;&e(dʙ)ٍSd2#}ؓ.r/#=tGGxa#uIu^tiMX,ԣk@)t[X1kg^z條J(B7y_8T(Q鯽mC۩a6m{w)î, Y GFq`@tXc4w: oYM 8R|Y.~ɽ>z.(@Davw-o_Tx= @?@N[YC s`lhGG|N^(mGm ~nt>Q"pSs =5K~9>*ۭ;7&,Im!ݞ|v NƖk>2=y`G2aFΞGh+>jHA'A^̬7%C:'B;,N㇎byBN,^r{{ fqO8eb썭ID^GqlFols {H+YǥycO^imbiKӳIY`_'QQK9Rt蠱{Zkٕٜ>|r|ku~GT<xvβQc=f=;#W|2i h( ÚoLvj:Y)GUm jLImD "fh9]g>UnQ6C|xbX˄X.[*Pnn>n=nAq<#7!s(_2}ΡD;^y~^}Tͭdž_z*<~~fiZ+ЪO5Ta4ڒg\dVb6u"|&i+I(R?|:v*OYTZ : \k -7:$9Gi&@ JxRyRh-jiD?U $ (AXi+>iZVZ-Z >NV#@4R=F27~X,8_V+.KZ0,JDR),U'ufLjuܳU Z/s @ ZiTg&>7ڈ=ݪRS*UD7W2ϿgF39³NIH7VٳI'P00 !^mQ-|ž}XowKb럣1 eُ܏5\nSEuջMD8yLV,)87a. Kۈ?Ɔ :ؒt){I~pƅ%) ,0<ܧ>1Gsԣ..'A5s;`>Xx6 8w K7 *LF> 3d % Og{KnTkwPԭΫ9tVz!܄gهX){*g zn~(Pi:a, Fe!cO_:*7lhnCsFeyvAyrLHZ{ug%r-? ΥZym7Ó0@[<pMr[PϞiR%0c8K'nU#͕QCФ;HO)(@;ۜZPx ~14$5k@Sƺم+pc2;%Ut]p-~3cܛ3:tfj66DC|ROв0'/KiNCZ&1+0#̺o p|0f)Zzh]](eS&(.R*ZuC*uߴⲫ{ŕfD }r}Z`DȓՓkfNjw'N(ά?0hXWYs[ԉuEx/+ehxJQ4DRMf'~8ը7xfR[uTV@nՠaQDX$ .J%fR $uiLXɟIyMd+#sXJqACX!؎uDSAjWjV'ٷE*W$͕^9fME57#>aNBlF~Ƽ}qil^ 7qbz8ѓ}A@q\Zk1|8G ga:ޞIV3)x@mpw~{lq >{&7a0,MWD2B6 SƸp44!.M$Fr>BrsXkǀOtf9K#izZ #Q&ky ȹDШgbju(QۀַlMy.\wZg#ԽI2;l,4\m (HsGkzno#%Ftz4)C291𐉚+ CÑ>%&na6ǂYC7='bItq|_j8yĀ= g:'6<*bccF@2OCc DGpøAsYyw‹5i#碡.+kljZrN8.bt# \q%_fp/۟)~󧿵׈w$ZS0(cSJRTT%qBNED4q`W[F0,OIWYDQ UIX +[p; >OG T ׁZP^=񈱧QZ<0:R]*{ܷ-<zӺ3k'aWTS@_ºVQIb]8{yP!Zhujs7fG5̰fs-uNnzz6\9Oz\:19&s$ eܡdӡ潚Kv~#M7_g83nJT'29qʎ.g) oa{`ws4oǹ(qm_4|mՌ5i3:pjcUZ5  Ohe~m0 V ԴhQ>y F5d=V+lw`|z3ݙD{s.;UwZo^@Arx~ ^5h& 0thAAv oiA}S [4i v-EGQHv i;'bqaDzLLKhtt>ah{ [67\4ΚnK!aox{< L9[ԱDϻS$dn1Ho_t>j,re=-.Cumݞ [{c3Laх[g}"cVKhy-i؉kӈ<܊{g5rSrnYRH[*R78gkph ϳDhyLnX5 (ak2HXDm;['A΂kKpu+1=dD}];qŮ>]~YG}hEezDŽmMNw nBYJm v8#}Źk݁kw6eGܦm]vō|Z5՗=b\:z{.jwxkMb{c+bg`q4ƍ24[mui'yh#-vdf-/zZmgY8k'FzDZU EhF MpV< Xb0{"S@ rʲ.nѰd9X>_0Fvy+׋n7>rMZt:^ߧ%>⏤.aB{z\~81KQv̼Ku6T4yDֻq<^q1]L?9HkA m2F*s?"VS (D/v[~5F=LxfpJUD4M[yL;vt߈zO|ETj/y2ͤFzƒ2s Ji<z?x'&9f1v mϻ:߳K9 ݔጲlEu*Q%ڰY\O!L;-ZũJ9!tW@(җ#o Q$aϬf3(-0XAwV.z# }?Ե7!??ԗT-qJb2 /N!Z٭M[x4yoH80sۜJZ9:"BBx;nzԋfez*1~Şgʽa:=' 7iiH4gddn;(t[uX-P [Q'#SUDoOtpq6xTH*j6a ]_j^ G{МRhׇ;O>CfG%6v&=όIv3ԏiōvnTM׻]yu3#.qyE<5W*sO4˴;_R;<#k\Vq_QM[jXwP&v-zd9f6կgmNk3Ljip)e;<|N`\/j9L8]=Y[iC7Y3c;gqӮ *ZtBiJt-A4++̵ش2[:ka#~_K7;AEGz*8&JRt@ l7sH pF|\coU=9W m ~ T\zkEcHq{>1ŏhrʐc3{.~mLtF|Btwb+qcdŐѻgzKE"GJTR/5<KU`NBQTڶ*ձ *D賟e\osk.b'-* !(a -Tl{Aj/=WG!vR]fN{мLX*mL @* {m.ͅIR~~"$ \ՑCNS/X~PnKK/N˯8'D \KT.x&ި>.zڼ["s\kP6n>$/3:(0-VE/mq+m{ *P)QTT`Z|~HnҼKxnc,RIV GrE&#ͻM(_'aQxSIZks;gnx'c)Yx<*͛@Og%œ S8E7SK.?|'tc=j1Ǿca|i{T ׷UU-Ǝj)6/%jW_F7 IKeBQ͈ yys:D[}6ך>VIi;a~Iqnκ>7G7TܯYkQZ[ L0;=__s*Ǧe/)8*8^[j:n,.g9|Peʷ[/`]zW^zoйX_<ذKTjSלT5}JsF8#i;3Z  2fuZ-Um'JjZN8/V\R2&~TFV\{XMb,δcFq^ ӰThFDFܬa-Hf:JIYkjTjTzPctڨ,M6n@$ f\BQIkT\KA|Vo&6e] pA88fiio:ka@[~Ղ&h[W~1z7w # gabsž^r _geH߶UI{i=a[Aqr@!1 @IEB7wrLM?ߏK,`\HFC ͠7 B+i Nw'7n(ݪnjm변=O٪]Sb ?h!Pwr8@0Ϛ.H.ڰb7_E|Ȭ0t/'H9tLDkuаTFqꏙ]9`z00F=9LE87R;-|-b ҫ;HzH'x(INF`w{9wjO}y f×47^yK߮*Y.A_xbovyf.j R?,X}%=/*#-/u\t=ߤ$?"ߨrT `PW˕\c%/3f p̟Jr90n5*@|cAPufFJ(W+Χ>3ScT Sǘl)R6`ZeGq+if*^|KVF(O1h9Hb4 }0!:2~F^5< è&*CQ;SB֡45TNvӏ,oĥY(+(cSzl & WIxQޠYiV~F+WέYrUWzUsk.?V_0oƳ{'0fwTgw3Y78ŐM6^y56AJc%8x[~l}.*KAeurd]ٞMr5K P??g>,dpNYemt/9ʳT$?`%}e@VQS8zgJ\`CLng[YkSz[/_SY1'/sw3 M):uڄ蜨Y\E\'<]BXj\-I Ue}i& a#GD>S*JeD8VxXc֙? *2z6aFa=7ƻ-TuyiEbq{1k3wtJyJͫ}%W a$yS\pWm8ORkhL-~\cEt5P LIc,"4TsG+ɚiHx߃kķ=3 Gg'V עu`5j1 =XEvOI=c fk&ͯfFX2}`>f>-wiUSmxx)nmr<jh>Ii;NTN@7%gCCw/7%KtfX:ݫSQGlf@kiAߍݪwS'Yt1MHo7.#Uy%=t?[ږkj.VP2hjy,Lxq0jiQ#Jh\Gsrr+ɗg˧g.tROԉz䬯=DQݾD~LE̗/ϻ˻NYFz0jS/g>3i'm4)>( rJGfsy;w e˻e"F;I^86;˳nAT#<3t[t[˗Og 7KW]}@MHl,(F3ڨ6A J [b~qD iYQdZ}R2QQ\5HYgwg, x8wv`2.w0d̹D۝f%waNAhS(*.(h/ x:qlD=Pl3o zϢTпs_I1@O-g 6h {Ie:~*3 R(w4|ދFly'[`y@6 xv$ߣ]lrFb8zs3̾>P ;_Ĺ`L5h$pi'Gf hiE2K.xwЍۢˇ.1@ANl;O<.z;1U _h`M0\G_ʳJp3e&h@="A1<: <22|U*(nb0`3A!s,8NsAc@7L!]VPbT6c݂$hpfKrh n20@a3@8]e(< ` v貄<@c jvXw" :t0 ,%a7 .(t U]Yk>!h7| c yG|Gip0Z@/XPYu@G( -@vBCXw\}&X刎{@B ,P rzx%Q"tmw̎g8ʲ(̜&0S-c{=bT~Myf]1+<[}% .|ŋ1ex1Օ+JV*UVV:U;ZUm\՜ZmS,X˛8]ZYjVV6YrET&n:fSҚ{4Y9Q-hYujeY;9YZqfZ랕+N&Z-\s<89qϚS+kW4+WZ1+NSzoNO{jb5n 7ie(Jqp/JX4ͬIeYZu+H%$nAyq3Ka),I3*pRIÑJ|(J&NYגv[qNfmE,BTI*aƑn7$IZyJ[,Z8gQGZqL'M\K=NZq|[ l>L9#:ȷut7z ;`{ϪV<{טY WjϘz'}P{Hߞ%;M?>/+;5_ԋ %;A\kG?v]?Y7o91/uƶQ2W獸8Uz@ ati3gUc֬uT|8sE։n\՛[]N!~mߖ mЌVZQ||X~QsFUԟb=~5[euN<~l!{״R@c{&=key2>k>FӵFY=Yzj7b̝:57 xƵgt;淵kF']5zw%>kι2so JUl)7;c5gh %GkAtguziCw}\xts&ޣ+XIF}_6NP=-7}3q죸"Y_󟚫~|_BcI8u4LxF3t~3qՅŴ2sM@ (KBPRqAPK0J#MqHj%B kxk*fI$ĩY= ctY?/L ?ւ2RfoiP('4+5R"X`,k%1[LDHL8A~*(.R?`Ij=H,xi;[$7⸆V'@ՠ-$הGR)QjX(T-\r@VPBc#~`{$}ZbjC1/ /%.)t Lfu r/@!Pzy)@ AVPb+^6!2F7Y]q!l j,ejЂw {ݎ ,$bAqEA_U=O}!߀z/;έqR;>'̷D!1GU=0h `ǽZv}YnOX^;Vbmkhef@EA%=UO8#$z~pC? w] _Vxfj*W퍹y=r&&;C~R׎}flѠCL Wo1ԠQr ַWtO؍.3i+f̕rrro*/\~ ,d~5V<ɉ)&`XhP šZR8 pRW#hšbGQTFuǣzT U3c :0(UQ-1ʀ`\.ˣqXʸH%,cfegq-25,Y=.q#YTE8zi g0́A3ffZ uL`6t2o3h`f3i)OsBMr嫗NXhzՔ.AHѪ6\s \XP<)?A 0q* hw+ 9.WA6m/@wH9~բnse3w{`xA}yug^4-hmZtqiC(}3p߭*w1跚AI=b,yG6U7W\q-AAHzʢ )-def=!D-Ͽg*i,b@S1j_)'K%/HP{Q y\ǣ ( ,,Ay4 ScڣR jׁ# (r%k&Yh^xkU uQ0WS=Dllf %+8*Evs6-i, Ö́s\訍oۦ~4ռœeIdAW:Ғv ́~fq jL'I3O1>i%ov.[CYA{QH[gM[Vb{ l3ҀRXS6/RC^:G ,) IBOl(+ )Gu;:vqoj|BEOn7 ͢;3Q/ˠo3O/hʳ}̱]ÀV_G|Iu`x5wtzgжܾ(xZ NpO#q,:x<1JgD߬3^?/bX{- Z085]0m7GM :Rk]3+~ۇv&6W@ү1!jΏ⩽O{;nP|Pf3B ljތZHJqQۏi΍ՖپY:38'wz_6U38|hz@eQIsIs~[hYcc֥vGUDZ|GE&q]4ˬ`JǃF>(mѧZ#[EA c*5S#ՠG: ?c}NCjp4[k-O+ {LF+klNX{ 5Ӈ >jߛ=Z3YdfYǕurGX8mSG'Ѭêi̕?L^(]@ye^pѢE eO_o5zNy<36Ii-BaGա8_mS^[hYQ]v5Z-ʓ p3dF:qyRu̹cqލQ>>gnZ-&+=ܠi觟Ew{Nb+n%=%.Uς`t4I /p8$|~ @[/!y51Ej2xs#XQ=&{j[T~SPb zqQd_?܄%|Hth;%̟t#/#Z!o8xs|A~cgifܜYng4yԻͯh6OFn,X zp ^?nk hكu\A>4uK`1\vXh4nDϿ)M~FwBoֺ! 0iğ>п_@ C#u{]ӯ5f̕2W:>%Nmߢ˖,.1Eg5dvСP&;O6Hʛ Gݙ = 尓_l|u 3:c臲r6`UCV~{[~ qfS um{w~cat4(A8&3*g~_Ŵl!yg*Eo%̀utc-ezGBPCU Ϛ2W\+;0i?lީox_x2?,8EyGMBJI8N$app- z\kqARkRKj1~zi)*JU`lA6tRoBKxH={0z^~2>rԐ?"jMW j i^X1kƸoms{ϣ WN7ӷ*f?a [f/z̕2WA^g4H%ˉ.;jS;dߥGzMs֪{j@=eTG]mMe6]RJ%kDY3r-T$UK[0,7c@)iDht=2%^4ƥsϙo[{zWAq~31&. P#a}ůntu v$h<ň#FI3vxD@[|b>Q>2١;4ar&Frb~nK'\+3j}p^7[\+P#cMo6T%KwMdiW^z l4L$ѨU+>g6ISXB!lrf UFi +MS;i&i|Q8Z HL8!tI'FliX;s6bv-gjJRAHkq\S2V6ba_)Xi.bP5BV*jJ: ֨ՂZP/TRïu45[r,['}m~ k}Ѭ\ڦGH G(7((K}`n= QU@XO%Ab$_Y\[R⾂kVHoޏ󇝼sdË=86 wx\''CNfAWNPnsAbyI8g{3ķC5*O0 G1N<Nj5opX: ң{Ld*[I,ǽtqK)92%?3vQnn\~ ~tQ(!dPMh(QN+TC^k Wp= TGg9Wi'X\Swz6ZENn5ux!uuJ88mtӓ W󒨭>u{78l- .IkhHqLȻZO~GN}qȌ5c7)yB 놣 LguZLicܼd Z]Zh=}]l=nWժ=Z--ֻݤ>6*j3<]o:ψ1Ek\In}zo6$=Wn݊&'+KHn >rD\,/n_ƽrE -br(S_c]oJϟ<9G0 աxѥ_*åR\eq1^&ՠZ q4pIQ"Ȃr0Ke[ j8z$Z- 7،zMmeL3mQE.<2$ʭ7)r7ρ`oI  > i+a^S(i$ˣVF~3f~B,hefC7y&y0,>Ϙ_^HZ_ ø "ƦA_}-Z4˦W/^hɥ8upRXK-36BǃڤatO%/=qݰ䎚F1[1*~> ͨSx< o&bi!k:i0fiRZ"jJh(wJ,cVDpTмd[[1)\Md@뢗Ֆ ;ȍ#_j{{߉]Ƕ:*$sV)"sYbZf>:@\s/lqS1ۮ*.OPUuז;p5AQ?qBf4_U]N̨>Q9Æ<(<]! ϩ.5kEA=zmQLDlAXKǭ6m $'՚ywF~9dϦYDI9*lv2s5ޤ k͟JѨ'틘Fvpn1讓m0MN|;nZ=Ӷ'M.J&dgil77t7zWuAu!_@0 I2'm27(ƥ_*֊{yV,TkJ#EZ݅F0\-FkS WRyF&J* Feuo՟ZsT[`׻ЌbQmF6촃`x-f$jz*Vx}j:rԵ$=q},:iF[C$z G`7Csl -zVH{EQԱ (qai59ꥨ5a^ȷsDܲ2t+h%8u1č̾jߓog1wNyi@L[?TO<]x&HoҬZ.4ոW/?lR/Yb_]b#L]7s0J%BH.*H'UV.65lwX/p$)R!l4i3o[`BPt4S?FFGu2O;a4o "]zNEq[yc3Vz~{\n ^S] i{!%̨9y25D{d&୒<„ S`hErtMzQ6X6 B'=ITٷA#<|FQLt6FGV!?P,O?,; +wzFSc@%hcݫ>Ι ኏ ͺH/{ŬepPIrhW3e}@5= If9>)78N#i_oою`#b[6/r%'չS.g&3 #*fn0:nT,GdwU<֭=!~#Oɬ|^T!2f`NtfS/ /cW\ 2CG1\vz)}hs0 @[_zќ\,C _pRŋk0"~EifVTB C?˛|fY(/5dl6Z|1'(TJ˴Q)[?S 7qɭQz NOR&K|*rn[y{f2LD̓ iq+itМDuv~t]%mi?":Z`@&szA(p+llM%rMTF7Lx9zjR4ƽ *F>k?%?}-±LthpWwmSrFi}&_r*īV7zky`̯Ij?jx(Heɪ#gsj7(w׫_wO6bRIõꅹd]uVNj7gx'J2@c&J,W5_78c2RrӨHN烐gL?n6ّ\1!vWyA׍E9OxGELuv?>oGڱa^]ezexSy!8Lj\ƀ1^w8ۯsw!Tn@LGѭreJn"'pOsGV]ߧ6Xi6<ԵC. MnVVdKVE[nϽ>- ӓZ;^'oU_rqGݠs%,']+al)>=&{1ܑ\.'z|qrOt'1݆Ve{(.iT o@LǕy̕&_äxXEeZp)C|%`k1gK&Rf9e+n'{",l焅4/ZYK)|ы|r"%lӋZ͘ N^4E0d^l5$X4KyequwW|gW7h#mܳz>*ʭrXCҶ^Y hEofl.O)$NIcZ?W1*ߵF~}Ўqs<" qZ6 fy(Y,g{&1Ŷ{8J>{>JmA׃Ejj>=usӒ c1Evg9紑 5϶q7)n/ϓgo7ւky]Ԝ0 }C&/Գne@YيysvrN5ur|yRcy=W]23:l1$O+>u~Ŝk C˘ƢPٞtm1M;"j}$8ǐqc_ }d=?#mw5G'~ tߨ=,gu'l]O_!~ۤ9]eXnNVǼ^Oޗ]` xii,/ J/-a=WS5Bђ'3.g3YWheGfykD`o<#,}6;ߖ2W~t3#-˼?zz҅/\5.X˃\=~~&:{^:@v?*W̐Y-%b/Х?r9JXxE,eTF:XPrZ.?R.AT/DQq=i=pRI+#ߏ&7' 6z7> m@yUͭtJrB$fj1ŤLTiRAJ~B| ",NJCꕥn'з-T wXqjـ֔ahtOL6#߯bAFp'Ǵ!!Bvtةh&Pv(jR:,*| Uρ7z}N܇pW;s80ġM˹:[|L$*k>x|LTtnSkʱ\ {$l" =BL7:nqIZ5)]}C?]r -z k%\鑣_m;d5}ME)"'^룓sLWdQ}x,3[ˈbOzgFr^C]R=evZ 4ȗLrYw>n݇kkwc+V> (e-r[W7Va=,Qjm3;ق<ʳ);?,書hrzU'ya>cy b@7rG0isEYCaWԾ&yB\~RM~]dK5Ĥ9] sۀ9:h6^zoܵnEQHى;Y]=-9 ƻ<ל=_p$Ѩ89`zBgr#:d/o }^6@Fo8maLC,}5zWc&H-餆fnwMSo(QF1H^@cCq]y|*`)-ʑ`!o'nc?Vcwgd LYs3r>YFc ԪOgX "M`5%jGˣ5{;.IԠl;J)|Oz ;{_*ݬԲ6 Laa5[5n<'?(4fV+ye/~P­NA":xJ+\mic;E: icmFGf]ֶˏOo!imT}$#v7lh ;~ߕjGo=8{c#KE~ NqWM;?;;+)Ȱvtr_C?cxD%M|:N=JMaWK"5W~J:6%;lbQ#ѿe՜hE ro&TJyֳ$T,aAd5w辙t@@x1Q8;oJS9r'zNL J ,Cc`bv*aPzm2>I' y*1TVgVVb[T k :_ڤ߳@Ry6'mOq qb$ ׆S)UvC>%u= AAʗ\%Y.rS?&>?<O C}Hc:Ģً;W k n1ίa2^Gns,&NMm}DGIkV!W\6Y젱O'{~Ҵ߳IgiHHkD;!;6wC]XZoѵÈmmx3pց.3"=ݝtA%˞hz.k}9?lx܌p 178(ì~/o凰=Qwm |μss_~W޻kQsV :v|&L@űW;mR>S>ngt#]i6v˾Od6kb"؈xw{}j:lVj_//wç\+?u ݽT^Ƽ.37Z{}E<]+?#鯩BRwʭjP\Y c8 Ұ>&mLشAT$l6waG+ay4 BZa!J I>&tcmKa) C A}+B?}?a3+Ia=)CEm4 վ2h jvդ~9iq6Z]͛ITՂFqqF♚/P9ɢ84hFuT $mSb:((TFVw1VyErT!󽆺<ղ֛N_tK_;B8 ?Kh~v4:ߎ36կbI{qE`o㢾g(F9Zg,4~Tگ9ȳ\{gE<.pxF+s林~7g"/e/1[Z?#P[' JaXVicƵ;7a5: gZ.A1g QUN:9:)s$'i*%A)# ,AOki~2]m{Rg3v6cp჊țN \QkuqT 8f1q`מ0҈su(YQVk98kv=fsFcI4:|t׉6)obNuTIA=ۀf\}~{5~x-q4ji3>k/:Ox7(jE~XE @seܦ~Q+46 }4q>QReglˣCNYuOM]6buWr(<=5er;9KہsӚ1V#nڣ|JtgnDlGOvnGkUEB9k3~3µbI ~v]ct!&0\+sǡ|@~{he@ .Yd SI+˙(:EQ955E=eTI陙ٌR g1j)dfx|+yKЭOT52mr+'ߏ?ezHjJ7>i&QxeБQHκbiƧRGITgjIQITV@\.gJ[f+(e~EhDaER9.~#i&zKzXV,5GjqM*x5Wj/ԇ oݸ~Ք4tF}RqrPgV %MIm; *wLz>BD>_p: &<^$U#mJ!Gud$:?Q0rTK%E*cT0Q\j)fm'fHMg$ 9H:q mb3ߖsFpQ$s@{T8b pP}pՇ4Y{cFs m"Л'@1ur Iznp.ψB ^ufZ#~muKXS2L@ۤ=-e7]hf<\gF:SlI-RM&{IŴǹ^ur ä.S1mF$OL2!QyU$}5m0,ӚZ RytflnC; [4IS7_B&vcdߊO%c|@OjktruqZ-9Q@Ǡn&8C@Zr^{iȧ)9Q_JQV,dXAzFLcŰ>oצfs&Է'&3Fntf[1]ىnIՠ"P6Xun0_gNC=wi (\+?gytᲥjKͽDžϻLOC2/i8)~|YRzRRP Z-(Y)֪RKV5nb=V ա_P!.7jiZ8` ׎}N J5fK浴1%!)nZʠDZT(NIi'AP ct\Jhxfԋ K3eAr,iCfPP(TZ.1+)h-aja\ZP\hTH3HF\(N`PK ZT[_t%˦\~]([F+a^wy 3e_5ߕ}ذk]6Bok#A0#N[n' F>ڳY.'*IUb!r Rgi{f| H~tȎIis[zȿ7G= HF+{3qCXxj3FDB%L6Aà$ 4fXm.>|*6qciīCb]z7#f)Su㉌vd$6`.vc}}'ڛQɃX?v"w=עnZ ¾j>7b  {4 }ڜ(G1CH >`\EjclR yXC z<_~ Gӭ鰛3`)Ds|^V۔g^}ϢnuݼLs`m*887G}{t׻tE\Jqv'skn!;p9 dq>< ~൵w o\S_BCXi\yXދ5.z=tYt_6 @@#EIľ\,Ν")Yf;OȲ-⾓"](K5N&d3}I„ƞ=tӧm'ʿcPmT1-pҕx_|Goǫo ~Ǘ5g53Սw^vvݙ3E;Μ]wڳbmuMhܹz]mF٬(⼳5gv;uPzYFyfQLmݢE5V{UU׬;[F{\wvMsNc͚]h.Z{vѺ5^vM[sfsmo;k^)'JRJZdj(,KY;z[>vǷ G y^;}yЮl3!3#{(>k7taq{q{E3U"lyܢ;}ځͣ,xS]9X.%xmJcCx{[AY/Z PrL}}wamoI;`^ >W͍d v8~ u\b/hdGQ㷗0#n7\c2o8ΐQ_g\kfz\5D'ָm4uQr^@^s9Hxhxx_VԄ2hf+~ݥ_?uޘ^U7:?Q}!iz ޟ00xLsNSuڝ'B2J7)7.֙~,߮1U(FĞl&G>qfr~̝G8^n~ *3[5}>dƸy;l7_~Ih=jk|V^uYߏ9vWwe&ǧOx lp+e~]ޏ'+Eզ3w͚=oWVW'"M5\UV?#Pc^<|Z{Y%h5ß՘a ڿ7Kq硭9kjM\+]o3j~|%Zd{jw4y6:wg>{ (ά,Z{NqI@G hUWjhY\#OxOZ< 4`ПA)&cZA-Z=}H3 "?p27 jS~5h- &jhV!".2ȋ hl< nk=JPCӸYEE倱i'-,N:EA3$ 3?"oh1!fhey{A/!ӝńI#;YOԁzqf՝ggE'yo>Q<$.I׸S; 0! 7k5%5[yiسhFst]Y\@jMď2eJx*, F G-th*,]/ΌV@hlWԕ>mn:>ʦ(М-+4USý'ވwzT r kc}~w_~ξ?t~ rW]iyDnŒ3'fY;烟 <9 @=| 5G?cbCĻ@3; o3w ΐhu=ڛg`i_ G'qt7*F@+=yP-ݎru\kCw^a-qƈ߿5yc_[vkDӬ)CjmXKD>nMi 5SyI>)"\+bWDjV?>b]qᇖ,]t9:}A?-شsh h[rcՊAQ 4ʍTvŭvqjJm$3N8̂ & A 4V E'Y$8H8ى;)2 ǰEiJIcZ8$AuP@^j:DYVtBUofTv)3BQ1m%ihvJ K1%YJkBj,i'INhKli4YM B3fLE $ rEtl` 5jNV 5 " ^bBՉwP UwArH_ Ds@+RR)*G\%D z@J)jz;jO4|Acr`#Ç$=rݶP8EଏNwhkԵODVɝsIHɓBT=,;v)FY(g(KIˈSFHyN C%޸֤s'dcqA mJ-uHUy>|"jxi7a{@յ&LǜmBا1^ߏ_r&\(Z5PC^1- iL犗ČQj7!;(v aն0TUj~a=JzVS7سZyX9c bݚ}/fj,Jߍ~f}|^q3f,9zg<}!m\dD52|K}̭=H%م^J<Խ\mQ0'O߬WXh:Y r>ُv9@wU5b%tisqڄti:t1v_]CN-y-cHhuUGSxIѬu'ܪ8Z uEq]2~ (Ӄ=@ݏ^ It{_٪ >:zjձWa^[!蘳}Y)lЎ1@(HF5NK|t3F2ğ茡Bha*_\85$>_1|47 %z賾$bxM~ԧhC!I˖FA\aQxsPfe7 GͿA?x #jƝgҞ]FA@mڧDYms~zx`wF4?i{8ьIǹNmX}1TM?̛o8x9cܺ#^}F<$%#(!Pc{-[fiv_#w}::tLޔZ zNৄt&u;YڮG? -X `Ǭoug&c6zY98-G/p$GAka %@KJGړx{p4Y$ _ee& rFZN<>Mcvw+?Od)|D-cOi7I/Y`cbgɭn_@#Z '̿*+ vS`gq '8~Mq{ ٰ8^:`6W?{+4b<~e˗= E V蟍_w(֮[]JyD4ܯAGgi[/7*6IÍ|8'3EmNAB|ģ2ce8pg|ѩf e1ܣoyJmYBr:2 2bk_>Hy°DK“☱N$wȱz!Icxm7+!+EՈdzYOXwpLB}m3 PJXD ̚(}Z39CZMc^C>.=/w|-SAf[D?oD}>{c j!S|p<GhfT~_~0Y>$U~ѳS!Q8p6y8uw;?ٵigIf&t$YK],PN\]ZAӐfca~Na={AνUk#Y݌g\~Q<g8֧}޻­!s)F|xFc]{R?CNk%xWR4gU }-u/gh>}]'mܯ>40 w}'`MnVP¾7:Hk7 k2nPU=q~ :{_<׌):Bim0%5WRL|>5p6H΀/seZOt.Yrޗ,[a^LRl7GQ{ Uo(, [An o'iu :3= 4Mf4ni5HB4k͌qMgwբ(=9Ӥå$R.Q <:<)bV-FEqw@DAqTQ3R68j7#4vT׉r_fX+kFSopyMđőT CK'yŕy|y8 ЭrҩBSb7>&<(ASmʣ fV?z%{2=(}a(tI67Fp\ ʏUp3@SeyY};#t<،yHc 7jy='*I)nWnȌ]{Z?|!*nKOsD꒜v8WKg>Xft\-cʴlk%8^(u58gaVV)7?eD1[<:SR'Ϣͨ74^2t:-@(8Fa-5JPJVr1lf9ӬH`د+q J;xl6IfQ巃ˋVP%s%,FI,an=# y3Q_5x7,"ޠB-F?.o>JR>iLO:z@W7yV=Vz H^X {֏+W QV}kfG8WmҚ?xW7Fdv@ Q5NW#2:[PKFU1rAJB)p7`f%cx}Vm؛̛e%hB@k 1,g0/i R4Ku!6s>)!@KDh9r̗4#0yfg]xZv[$vm*+d<`"#r&7g(#Mo4A[G12i i*0ݫb\ j&N4T=f>xG('YB\1+C .Ь9Y#O(|D&ÿ*?v4ÖǬ4rIcA>huSծEŘםZ )\Ujm\ygpj%ߗ-Yn֗x}hVkFu)a-p'bv3n4񅺶rhQy[VZQ1PqZ+hBt֦ZPg,AtTகD_%ğA=1CeLtQdZaPfrR{LӺ46FZ E9?,m9ZU5)AO;dA#B)cBBzIy~Λ1*X(<[7#E) D?šM!2C=ȸok )(:W{mcw]bZM6bd{H: |#Uʿ]3NF1O9~͊Y_Ak_H2xn3VCY媱FVbm#LWQ[7j~Si1zlcfYkTs&j}?"PϓsۀғƦ<֘s-VZY]lV̒u{FtV{kgΚ9)Eۖs}곎sf:W[kY#zW:ȓ_챏ĹJ/#. &wml([x5 fiŚ@Kc<ƲC+&̉Mchz{jIe|_ٗ+ckL ._,\72se̕bwВĕ+V}Ŋ!+!~ȱJ+w֬ə2$i'MlqGT*=|轞EPrXY_vz~BAJ ˧]ǃ nQ܉guA2 +Iϳ_ y^n$}3뚃!UBEo:%K0,oU!8V6 (?Qn{fA\7vC+)ZLK'玃 cG4oGP7S5ܴ1],NmBRl 0S8J 4z\9ü޵0 ݮLdIH?.qshفVfmҎ.Jy?I =`RJC65i}{A,2;C<8Jb2rя([-SY=Bhj8 ~ W"J%Z_wՃ_$mm2Al\+9"t>T+qcxpźs 2?{_)b܆i?t' T_V&*~IpOZͲ_.O˥ٌw/&jŭFg+*WV~#TJ?Q8nLkA @tBrM ?!jTU~L6i۝:yܒY֞^ܐ2kvw .XELYFLlWcݨy_hOɏvZ@ghNaĔ:\Y{2^  ܍ q8əbZˢvSm/ga_:cS =uL n.tagh8KҾYHO~PP fa# LvV4aaf8+Vѧi֧0I~rnX/s[VZm4gY+e Gv?-`݊J ~7 /J2F )h3&Urvg6.nt~=#c' wK@Q7x3|1=.HXjg$ʾ2~" +E鄴Cna! vV^3wyEZ}t=|vvSuϬB^dIxFs[Khҽ1g|L\)ѱ:.80JGN3m+z DÊQ"s#,/}[]۵7@=xxu%i}T uLZLT?sF h^̼SLtW|H=9G^qZ~֚{qkQvsZ]c*Ȳ鈨7@YZyh1cը3ώv#V*کˠW8'µM`ESiҷ0AP)VwmV6W@Kݦo/(E{1xf4Sz_4]䘮:^gfm^k oč?rsE=\)VZwI\V׷}j+U)򮀤ۜ 3nɣinoZ]rZڙ>d㽜¹ MJ3¢0j,!02#ľO3l0l b(RB8c|N,\YaVд5]6fs՜j̝Uw 춈wz~#h 0G,M-C%)$Χl؏ۦ0~IP:}eiSZbs_t~9(ߤr3v"?"  ~Dmopn)' R~LVG W eV&&]gحsWi+| 9i.x5) *S1><ڸGve^66c|;$U٭.xi|P#W}(Δ`[[v.G0}g}(, M{6کoEnn;{,R\|_ƬOLv=R3gf˵]JS88Dt|X*mlN$o]u=&wq yge]$JB @cҘf_j .h抏A͸0]. ٮ]s${uyIV YQ]UCa>!*Ǐz j/x~,v/y?w`~JѪ?54r[o'Xb?C;I|>]S/E^)k6{'h+hEJ31g2wFd?`lBy|Fr_+ު?Qq}VqCU|-L9kUO 2L.@)`?zng~x#ѴG+ng([\+s寲s&ڻߒ>;h-_m-_n*nq:r~6I힭A3I*`f[eVVC󅲶Do̠S $ʢ4# 8nMUZU@r,?]NN13N5fr3w:^.xY7<ٱ$rRV`L4lnQPf&8](jתr% T\N*robIEQ- ܧV5tֈc?ӨY@V-jje귚詝>Wi7P{~KvKn-εQ` E7~jf ڭJLK=\ =v[S]<.kXƶSU6!"{º2W&_}+ܜaʝef\CK._qa.x;w\ר^&/U'na+1UR]Gy` A|yV4B^eIg(錛u餛ZͰH<+ڝ"a9Ml0˺SH!nuIQtS 4/ I:HsznwF3VnF٠JXH´#c~NJ=uG$=`d ʍRT X SQ1EJ;Ll9cmEMevE9aw'̍Y1+K۝])r̥+f6/AƯp.Z=~%Ua+dXɲߩ>] V6H=J$vxҊuƩqWe<7!3m?]}whɰ<$z*H [>PIIɽJ"ѷlajO7}()WpmFnsvh nrL~A5Z>jC˛Xlv?l?>Rٯ%VN9[!uӏqC.F] >&L/vA"!qcmW"ɽ芗9K ӯ9U!avjX:})b4K/GN{P\D6I nfDSX&@K_g*řsub+/ڝΣ=O;;jc޺i(f;ncgzewCߓ|Vmݚ7cńټE?7ٔ&U!%Q e:O+=QvF ;D?=y%j=^|9@?RM:>Zz.>51,U/Wk\1S>x_v{߃gy'$3D>'0 t3W_SΖ}K";%ꢋSJ8R%$J"Z4cnh+$6fz8.7n6J0Ռ(<^WfL-hfԒF$8\lTD6wi)M(jNLy1׉ ϚF:L\F0=ͅKW-]8mnp|v{]T*HF$١ڎIlU*o 5ܫ Ns8fSӐ᭟ߊ~nKZ NӦI|4nG%th]oOMzgepc̽*ۘ(8R:Haٔ2|N Q4 6){r<"ES.i^ݿ؀?F!IѬAQ2.L!8+L EI5ħ!Լ^1{TG] v l,j`6CPY\(~3~LS $ژ:Gq ZaѺaye43A ;޿YsWDuSy\+seM,_tï QZq!tY~4|~"/ջonS5+Li~V,<-~5aXכ<^ѣ^ǒ"`(1NͩE˳=~O"W,gV^e([]t@^4RhclmrEo9}PjLG f@ӕl̞/X>f2 I״=`&斾˼Y ` G/.9FJSr+|ẍ́#g旿X_cX?>.%|i.d܀5CНa88RߛYc_t&j7}#jk{zDzoEq7;x=1CA<+85DIld3cGy|;& F~mx|9#cxaC+\QfX ԩ@YВ]}-z`񼣲4s.)Goq!v݌؊ꝯlp~{slρK5Gݔs @m?#7N%˭9:7vkgͪ[3[%WugEbDVgN;augج1Y>xxPΓ( xeJCAzDs߃f̕]{\ZFyެZ´Xn ,X9fsַdY]k6,psxbȭ]G/LӝnqR-nv t>Ty n30HmS$TTi5&H8/v RwҘbPx:iG 8gvDLY;hQQ"M̳Pɭ+=UԳq$>~AzVOpVj!]Mi $5I.SX0J4rm}ԮV'*Mz+r;Fßʕ Rw̋fV_ %}rd᭛7_M$.ߓuO9=+h`sfܭo #٣(D^xt6$tϪaAРޘ"Vv)E.P@*K2dmCcp d,s D a YS 8|UOsl @&F-O#N' t9#1'-هL Dn/dcRii|JIgŷYpHy2[ 䆧 8oyqx>KЖ6KtwfNLi"t1̀ 'dX#q%`'|]W/ o h55hhq%UYE,g籪1,v-)QUeOR\.-MsDe24ױR½xՃ8(s&{3c,<"szV,BI&'nƚǵVYo]fzna__(?(ql*?U|jaw(=+>=*yzݭqkB>$@,\Z[zָiը9cqLs}rcb B,sIȣ[ Όptg# *zFn(~ߥ~+T`]G5V∝o&v͕*`iVo;fuɊeKW]hngGkA?1LƸc`Dq@JAb0"^QH€V178#׽Y3QUmXRm7^qme@EV[K#!8 $ԔLcHlvzen59Ywωgߍɵlف: :rvsQRˡ  4rcp<~bI=w3~Gup?ϥj>l-ɐڸn&w?pmwF=**jcR]%,ֈY s]I128笒$2%e7}bϩ3i&ߩ BUU:sLJUa6Xu O:Fqzd4[rVXz\=1m7{B5Y5n@Rks+eԠ9nC,Uo \F3+䨪jL8ڍb˳nG%K{4 е%=Riy[ӗiU[M'{&]k{d} cu`lt isV^V5P̕׷|¾ԧ&ϣ>]bŇ,Yj,xs?DB:0 4k&I+i21؅fXdYuYN/վ0 -ՅfYh*LZ:t T(lE_iǵvڎ0 XUxdGqQ2^nэjZRkZ^Ac0ju(f}^/ʵFYkM^~,rmn Cc΅w@MEMˆnPX^g!ƣu 翦XS !يWBĊm%.$܇bvS8j۝{0k0&l\3f}G^N˒;DDov犎_ŒiJ='Em[>.F=%F5Eƌ=(ꝊhC1vj*e*lW21(&!~Fo =MK^lzmг/5x{{0ڱ@ۂG5 F!!_uQ4G.VNI=Ǵɤec&#_ *E#9C[eE6nl6MbRQ 6*㗛h# \&̽| h:COݘwN-) ـQ}~iU`,w/cuP 5}}a~|<icNs+se̕͵HBCYi\y%P[[2-^fhY,YVR P¾H% {zݶ%Y %"EMHQmn/3=sgGO>3ވL!2SA"+-_|}7-ݸQ7GLmn_mT?\W}+fٲ.e+p2b̺3k&,\S;ԩS׭Yw;kM: Zqw''SջﮭM[{zҵkjT?nmzs7S>dc67Δ?yf֯κgNתkQ(KQ55Ecr͙uɵKduTuj&9}i|?*?#Oe~P<˚I/jgq6*cJIYcY)A-ffj5|\q&~dx&Y0JvڭUI^d.vi.NaX-(dJjQFQpi[tQYvdwKxY-K:)z\ޙ̋YqЖFv!HqE7tnZ4͢:jwqq~-^7 )9ot+Y{w;~O/7\U+f\|]c_2ܪIi.ojOx`k6ՠ131AG3hSOS1{fYſ89jRT5o/s}B}֛W۴y4Әqs>O{sY\ Y]yYĿf ء6/ vG0~E t~9h&DyyӺc-OaM57s7wk.\q;4;?#iof Qt)?8hk :~ 38:wh=82=v1q߀)׎ox3>;0%HWqŋn.pKn9j\GfxUGA8cϡ/]fd6j60YkÝsw+þ6I{À'<1--\ѕƬ̚EmUs=言Ø}5hhf\e ,ȗau|vDsXq^Ϛ+c4'81|n<1qDo *{Wj@DZ< 1|{!gd|H-C ѼQ {r4ͧ0Cch@G~ f5S/ kṝV?.w|OI}nߗ 6 䱮88'a(oO9^o 6.}n@qcsPA8Fb`Ƹ = NfAGE7]>qf}i!.:peX=#_0?oorފ֓Z>Ok6ͪAmԼ (hAh#/t7YWNb!Q0d~Ott}%ǵ{W/e<\}5;d=]Xׇpc"3$5f-fm PRgm3?-6̾._G8q  To@ s"~ˍVq5svT%Xplm3軧8<շ<ۯzwky:qS@?LĨyHkѯgUsDṵG)[td _[>=qٍ?43_[\}[F鲕^moӳo.юCX\wN ^4k3SjkjQȲڢS]wf]WOMkqjiQ:U[tisf***MNMUwQX3VR ~,i=/:YJ`,kU?O,+d8K 6 TJ j7vI-kјyZ1PbWbiSi5]j)[Be»$ dy :$͢}R4충KOi' G"j8vqAm*1dRl._9s/]53uɥ/Fku䋓{U7ߒY}JŸeyfޠk6?Vt_;y5mkb~΍*2a󸮞o'Y_j9 wʝctn)PԵ7鋪6"]۽XϪ/KOY2עم{?Cf3UQ &iqG{1mg0KX68=&8rQ7JO<ı/E+4ގA8^ONǩ_0آ~w8HOI8LO8~_vښ(kݥ_|2,H % dsX7b-z=+f >WOJ_`]Z'w2q*~>=('݆f7~v̗)q>tO9dKye_k⩵ҵgS 'Ϭ[{)pL<ҩ_ҵ3{ZWƪAPjQe1tiUpZ %cfUKZd͠YP frq(M$mEaT-kѾ*FjY4Xs悚4M+0$iyel6iohScYt%E*(.v"À"lm]f#)~P>VeRӊPywo8mdDTU}/͛mk%]2< cAgҦh+{DU?_PAya;|#*%؊?PBY,euPYj㪧.IYakXJjֻ{n5UQr<JHNhrxk8Uս]~X%(s2b1JC2]gu\07 6`Q2cGh@۞Caa?sf ^o0&ac):(@#W A{C5ӈ~ _'06a}ZtD/C?? :-hpzM[UQm Nb[U^ E9{NV.*-rV ,M8h|*c3~g5@0'zF+gQ擳Z'0hvV1s-V\eaas=̚;]u sF}16O 3['bcUU԰B*l-pk 4_L~ςjVhPz{#>>lϹS7}1=誺7c3/F@|bil=b*ݍ%}xsZWokd٪u-{!=NźWqmʠg'xzy|y+_uD;Cg-_jY6lעgKNv?HmeD7PSMC?ъ5S"&I3k!X v% F f|eh4+hT0kTZ֢vQq6Z ȋvEF0@4bZiČmyvɼٌ6Z~ 4[@iDVKa7P;' 0M[ iҨa&1 qoލpHD6psdI:2wَ"a]x'3W/ $$=FHJoH<z}sybo)?yq܏sGr ? A)_@{ۜ;gݣCJ~s7Gjq a6A<4ۍqBk:{R]#{P/%".`xFښK6lTܼ(CgwMM Ɂũz[П[) Z=Y=J7u$} h0 qЖQ%m+Q"ǝ @M OgP/6uHƞ G^Co3q2*E4K^xV1,CG7."wx'3nNeԣ= cO`ݣ_i̗7·RГyoLp*vL?,әڧY(1(^TU)O:Ύ1ͪ>WfT1`2?#T;-T[!7[n{Br#(u}8:I˚˞1ׇ+n(x>A[}q̘ O4ӅEg[&wQqHlƯ{U0:1vQcEj7fmun\9P,cIn7֘sR8'^}nEׂk "[j}rl=#Ʈ^wP/IKc^ZZhLߙ{4R<$sO']vG6΢}Iۨ=x߆}tC|Zc@hPKͰ2_zPD3jCx"q!]by<@"cNJGUpg61 W*/-*qTX8nd$Mpt1<,P=ur#h\ *J+$)UzMr-2M5-d;ooT06ϒ4,582v[+/djÅ]/)m1Ynu /zZB)TH"j^3 . 4<m6BNNEM1e9>CxC}gZGȻWEEUhާsjjڊu$.Fh#Z=[?UJO3{#jX |ƪwӂ-~X?jw| /ԅs yF-*^5]E= ax9kgC>8V>Ϸ{R€ױY-z-9{pnOK+xr},14>7U-&VF˖{0H-yTi_@C1Бn̗2_ 6X22\r%U,K5k#YN'D/RΛe8ðTka+f4zu0FZ JkגV3 z\F%$J ZzTɠR)IGIZԌ&|?nƵ$ B?i(e\ I\G_>sBG/7*B*إ$w(u8ԝ<"!?+ lӝ˾{)`),m^+/guehy l@+e*WGr|_6fm߁"o;&'!WY+!Yʫ/ bXPO_26jb>Ƌ^obWd7㻯 ɑ,r"rL+=ZBٯ8̠#TB KN@kJ?f#†k݉d}v3 h\9(1a)sAhF* .ӋfH;%76J>z_\ح񻌱̗2_|ɔtn-"W]jeLy!8zLS$ft4N;@kM6͙y;0eYѡ[]UZ&ߔ!ʝ] &lqMZ;M$k6^o5DQ&ifQ)@aǵWGIi?AU^L8Gw240¸7qjPm_3TTb$O3Z)A2ƱR@dyi?,|״dOP[aш[hZqFIu.6j`ZEZlAZ LQE7ue/Pi7*Ӭ]YtD8<4bEDNc8iغ{DNpːu 0T {V˦Z\(Tlv'a' b@?*"\!G~;,=%e .u 85R*BkAzL+|Mt~RUsT+ ֣ՋvHTǹR/Z>k3. :G_6lc*Jx+>I<ɑpfa&ލ-E,iYsx/g'0@Lxn}U\z@ ۇVE}-s950:+dXZ^8w!}@l-lE+Vq9f2{=0=R.Hݨ^s-ꂛ.={Q uv櫡"rF boa{p@VӛVV٫dU7ۨmjSKZnܦ7gRZ5K4+<]x#a)9>nS ?*m`-T܊kވ2|v|e~mgO]@Su}X]C2k<|y&=}7u>sg2 nkpKGe;zb۔.z<яx2pN0YswdM}DސK{q3;aBYtclkϣxX<2glxh)%ƚ=:f=E˾t|1.dcF!g֯պ&~XL<>o=S쏂򽐌8K#лԳlL/(jo~ >&1 r|0}=n+q ffGFyJifAOf\՜` 6c#X&u'{'q1Ҽ`l^Ϯ7 W-% v w3B'4uJ>Fi}XN#O`oPO/L3^YcSw{ƙq"1^a$ކ?_Ţa?#im(\ k|/SPDۙAҘ_@ի~f%V0<93-nt=f^j"{LіH; jv03v=(Zi` 蔗v-4M' %llFf4MEaR ^YLwuTG+~ .fK\( AE5Z0 ℸ2K(I~&6̛@!=($I LM̜vQ>sհ dëeHmQBS9sWpbV*JǂfبG+->+3zZo&( X[n% ˯GrKgXupj;ި$."A\cC:^Z"q%[>a۫7 N!%!&xs[(It8%k5iV H݀|Bܲf]/:5kG2}O1yNn_̵Uv'1`CҔ"榋ކ+}|Ca9? f&.߯~Հ},v?<d# z9*R:)M>*w~-s/'UgNkAgXhpPP)}v&nemקws;b0!Ii*ΥU렶$:E֟P H;QWV1ȱrPq{qY}ŞvrOMt9)~Zǯ1jiKqHH^>Әshmhs5vWp~7;Pϰs3 ~pTJw;/+58>A`o7j}Q]16FSj{+L/"~|G\JA˔O%b5L>9awb\B5BW1wb|E y3"*V~Mw:~UTJo[UNl~EHD;t8/y+WJFsY4`>+ZupuܱIyҍ~+&O6ߕ93_V'_N-Ͳ[ 噜jvh/+z,]V TNXZҤ I6|v /aDGgH?ncS7CU1 q/t̚JD0J4wæ ܜv]}q'gc}h$NsIVʸNH*w:yj%A;NjEAnadOmb+d f05$M`ogh)Ks㤋';q&>jvDQOdP{I/w'I` )6=xR ^␝n#{UeEo I2;x@@TTCsrTt<f(иg\QߏKq4;SҌG3>C ˪GXCUI-^LV ĊLV wjj;QzĚMSeިS٭حyXɔ|q#rEZVAͪ._';1FSofON 7A[N7ʤ8_(}]G0J[A^;[4bzK=_6CJD>]r4>o+9We`\Ҵ:,-d=j8>]c- PzVOA4Ԙ|qmnqn1PJ[ >a@9+ס/;Roo+-%{ :s\rnr`M}ޜ):"#g@U/z͉k@K.3AzĵB Me]S:g݊::yoy++|R S8OcH }G{ʣ1`;&mLcKeic9 Tl'sxz=\dI 4Gx/{5_rc6'wwxw|y̗)ƁG,L˥d]|LBRF.%Ŭ5V^e>KK.=3a.N[^y(7i ՏisH&C!);3&A瞐qaެ# c̀, -'vc]؝bFU%r2hKT[bF=E3Rf' zȹr;!T6_8nA!Yѧ N\cf3l^ ]%3"VdQ 0> AXϘb>O$2u͠^Oqe1xB׀qzB3WXu$7BT_+ e,sm0W@LmPv:`kAOCI1|X\Q'臕z]gM/&E "}<DZ!63h>X &㟧'w@mOqڥFn[(۳|^yo!(!vKB}sgaanYu]]GkOmgkyc82 Qmuvݸ얗.B\ ׳\;p3@OL?*M7)FPjog16c~\X6Dne8cr4q5^=HS:~kGkA-JXÌKb>#3"{V~Rsa;pfS-|\3u\aJ[ncs'0 v5xe}w]82ϦlVt-럓^غ^IzeXnQ yF}6^+D+TWirT^gzLjʭqEmZ:vR3%%Ep].RzY^]3#0G\݈|~}ЖYOTNpF1 okG0 {%up?0y/'WvQg,DDdIe Qgn! iI-ja߶IBZy[wjEEH4qȒ!MQ_;ҋfqJt-a "#m 2c4mGP8TډF򅍝tۄX3AX1di$MInjcI+_JPh+&%#΍HTMjDT FҊzX'4M2i7G Rg^zُę׽gYiI;8io)yYȦ.G[™־Mrh8Uoms`ʗQ" 4S^QER]L o^GTw1_w%^Bl*=z^v$MR Cg^)B&s<̕U5~Pvij>qBUB)K͈QQw]l\rtpk8TNyy/䐋2vAS%ms|!CfZXcN*NtS2‡ׁGD_RLӴEum*'m]-BƪRcf=j+1ŪUcvе6f }1p.>jC]>ȣf[qPIHDUΙGHemHz̓Mh!zf!O(z|_ytO_KLy znDՀ˂>>*?kWs}#v}~5XYIyKn'̀$Zg3=y0(˚YItF2:a!x7_Q}}Rv*n'i maa}Y2_!CguA7]y/]a?6q?q_I?ԡɻ, ~DK" hh+##6̀Z2R V c?if҅fTF QOT#6Zѵp. xPDTiWۂR2FÆ7#jƕ~$ܼpYcC2zɗXDw9?#TLw bZKڱR_QT gن,8z{o$>Y^NdaB9N@WOAgw2D%`U\Hɉ*^G:{ؽ H:ug'r۬R9SnԾ+IQQ4yO8yZ580GP`:\1Jn4JROΝp)1-Pϻt% ct{(y}m~=+2e+F`Lêa#4Y<~4kt=G7 GȬATކq(ձK:*?W-Mtzm)?`z{zmpk:m^;b}IEGoN7r}}wT;:gz:WMLIX(ZȎ:,gW򚧱ت8+T k^ʎ o@zb8.J,v>nt;q<<*gho9C|E_MgΣKc]޼=fߕ@~cwyt"~0u:Џ6(;osvEQ;o)4_?rE7{(ZW\b2sŸ k.iVgBvm>}xpq: ]-Gq۽q\>8u,pjVnMpQ^ᨵv:*Z (!jl~AfF+`ՏX6M:q2M#cw} A{V7&cE.Rx)Fqqֹwѷ isLN(#|CͲEq5;6um=dj!zX* !Dڃ9 r]|V|f!lOa&%v۴٘HYwb~|up3_|/+ G7-_q*|.[~;/[DZSi%a$!3IVJRX-gK \7ZZGƍ8kjA l8Y*EM `/[Hޔ7jjQ){{aWMF&,DD>Ŋnߝ^TqdU@4^|Nȡ.θN3৓>4AQ܄x'Krt“ei)bE8p˜ny5MtpjRRzD!gVXtz'zFp2iHwF]jVͦ;MY eB}~mnviXYC0k%4RWw{ )8]#a2pxrn7-32/T'ᬡF)T-<Jr"p3TA>"oMLΚyC֩Q߁?'w۸=G}1ƥ$㠅c}ӞO4oJEJ/5A?36~ Tjz=ϺH+#MKq׊10u4iA^:y>q 哦{|͑v򐱁Ǎ5.?ߧ)ט3yG;/=aqqjwKLhh7F踰ȹ:6[7`㨉`~[ ;s\{qz{z8Q\n{H~{qf qKD}] ɥ mhG4md? |A ixK,o~i1j_wnw5;+!-FbX^Ix)@0ohH|QOGZ>': JnffK38^)uZ;j&hX?X>i~Sq34W@/j/~U1*oS;~7>Mϲ0_߇ *JܾKW1l|JKt5WU \}ki2b]c1+cj}Fs0̚Vڨ~p"n4X-rcA)iSMXt eVe,19zl3u&IDİPd]n2z 7NrwV́3j; gY7) T&nhv )%)6 rļ9S+Dݵv-'';BEr'4]n)FH.MV; j=Y0҂ жqۦRomDմ>5E`%xbݐ#m<ض{̫ ܆CBD ͗"'`Z ]l&mC[FhaG&n{{M>*FO^B;oKdrYNr);IN|~hᐹ]Nc&?G^VpOQ0ߛ06S"7'R9>I]r ^19gQLk|Wr%Lat;<ӽ6UQ a x޴\&e\yc_G z~;eo`wZe]Bez!տ'<:])2% *I5?IB͐lr;tly2IYSH q ͤ!kI8RTgdd£tL Ij5fz4g<2ϝ)_KqAQvR4L4 K);$/;IC|3O&sk&kw2 h3-W0шO(;/ɒ(It6F.3f-±zn.Mo3xڳ/8g~$߀Tظb?R+oLcË>d h7=c(\Tbyʢ}1;&Uר6:xx6*<{t" Pl?!vAYc;d~ʣ0!Őp#V3%͓ R;ax(q͐u02(%Ao B5!oXgE1yi_?#uQa]ۀ;ϱ@ɛLu=*WˣQ_u[U.7WGjJ#}%mdgJ؍ʼ(qgQ9(WlF<_.ȟ)/?9^>Fzͼ.q>V2w Z5xH'V7+xҨCdi4$MˣzVq-a| '˾?Z Jq~9 pUAa:&ozTpg5зe.d۔'5 1? yJ^ C~=~Zyܓ矽;Xd" l|;_qa6 ѣ!)(5jp3qJs$&"r>wA#Tgc7]2wm1}QVdmن"ZXo ֮wTʐ݃2:;bvר=q|E= 1d7"E PWt$?{ ߒC*k߬]o 4G2fXS}3LD,{l?#. ^C&?e̗2_޲%q v}<(W.j;י.w%C &֒8M,(ji aX I%hAբ0J*J6| (̢B.fiF"ZXL҈qɲX4R;GԆ8G4#TA¨U4PMatQy}t9 AuU?M ZKq kZ0 y% CV x5n ~G4^ePpǭVԈmF֬lfj%3W^r4ߨ[;-wf6`=C'inCb1)wf ^k= WJ?UBħBHzek jSE./@+Y `ϛ@rv__J8KCu:;m@2.'4V+Ɯ6/`\5ٱk*wjh= 9&!߉yeCf_tɛ0V@_eR]~jOc>i%=W"ǽʮB\94uOh7G[ݯzdf,]wk:Z2 %hɆns뤋:=D)g~자ٲ7XԜxIǽq mk̯f\Sioj繍{7Wi8_|y||(M9fe˙e8qjN>Di`I/:,ti̻;rknɖyws .hIh%%ydޔsa}9;ŋsN̒b h<]n0Fܬ`"Nvd8qUKDa, pi5jx"cqX1/+ nPXؒ(nye2ͳZ:Oe܎u3n'y;-RƤ,.MfPt-;)pd7E7.XЏd Xϴc{@k;#ztx).</+{' )ww2dH8wHw Tn9S٭= >Z*7e11."M+׹E=w+~$Qtb zXX{9x؍}G{sZ̡'u9WaL2)Ӿ)96w(j06Ŧa{{ȩ3j#} Sbm>fıj6TşǃΡޏ TV6v-KjLI\v;ş'L|mp4an՝T΄L4.re4Ht+K^k/ AM SvcQ{uеvR]XG@?5vD5zTܡ-wn6хwzN)4e@mᛵt c8'l̍>.BŘwmnqM/flڭ2B_Eay2` =5cẺsBe6_kЭp;z},Ҍ7 kazY-c%eTŌLuK=*GT0B BzFbl`ĂnnȽKw_ T`r*j\=azޝLDk0CHXE;@#Aݫe} f(.rRo >`!7H⹋QpyCAˑzZvΥ QTGӍbS~ټVNJ]k\#9A J8ChaB]^O΄l-i荺 t!E&ԳjwUFxuc_`Nmpv ?k5shqi. [W -<~0u78RI~\n珝/epnTBC [w]}`f.=r!ZB#AЖE !$z z%*`{V%q^"[UH&R(-ٲNֳ[ye}PĖlr.1ܯ.6#5u_sݍW_ru^ru͕1ӵΝM;iz^lܴV4y-?_}6պ6Н8]Οk/6lh6 ŹjwϝncCmC^lw/l(6֫ntZu#꩝x~|^Lw7swCAЭ֢<͒T&vE43\!IIލ<*5ק<ˢS|A$ R?̋s$IN+z=BjDQhjA [zesSsg*sk֮4?r`WWwkΘo8`6l}s1L{?{z˟ sYdNhޝwPN怮gN9AEz3F9}:nv}?~"I3dٍ,>/7 1=K^fZ\Lt3zg5܏w K?2[7^m75PqWz=3 ^0͂O.c,KͼUA=f'w)Z{ׁg@^'c10ZmS!>}[\shi/)dz;;C|5.Xؽ`FQr7>-Qq;~| T{y7CwLGw JG{0@*Oha^hG&rlDfӣ>JYf#{9ߨcnf L~͍&vyhd8_Xok,O{^_2Taϰ+,o$,UW/,?.PaY` <*zn,, ˼ۼ,u<^3K#} 3XFZĕzq؅޸>̛/} 1drGGp?,$7 ԻDiAŃnrY\/?{Pfczø$dQRqdE=$ژ؂C2#tz 0@.kۀ1ckr?:"GXpO.cb|sFp^W뫼F8;Ɵ՘fs㴾`Sz}I*qU9yf1K&Z^zJn8ΡGx 0}fFmZ<b{Ú#Sw# }qmK؇{ރo>3h9Cv,M?sGj|~)0)KW7FGb>T^k46^<_lNWƆt~aæzѨv+6L֦ő z\7rsSyuùڦFqaz*yZu7 6nLm7LmTgSkbtN_hlnPCq݀wC+sb8%lM¿C dޖEY'A:Ѳ}+4M:AXӤ$iIwFaJ,i+GEI9NZF#KĄz֢4mB F#4e+lFiLafi懥pEq= a8Bc(KI4N&J5\U6e1rW=-bxɰ:v 0n'qL~9n$rH=r3I$ q,q2u_ z-~Ve^,O;Âe,v9=w^Y nJxaD)Šł~MCpĵK%-/o+= 5հZZqqnv Iy@*Z_7=2Rqph FY8C F-ԋ4>\8Sʨy}Yd1%J”HΛ*ib`O9Cp|-zMagט#y|Fk4vo<)އ'l{jn* w c<~n O#Sڄ03\=|vZ%w?A e>A;E%0i9$ 7ԲJoڙ9oz?MG7ފQ8>xgԭ#f/c魯 9I?e7 K'~H_r|d]r} &E) ! M|ZY &) :ˢe> (6‡N(eșe)JLN\N0>hw:iǂ+PM199E }`PWC"$~,:aYP0th%1+@mH)C@f0ZDF hI&Jv!d7'Ej=(UZ8nnףN_$V " f.@t?Zy \ލNVԊɕ}C+_룏r4}PwZC<537tbb+-.⳸ǦPŞG,=)|G,8|a1ь¦Dž-O _O<-1/>p _ Vaw]KEfQ+*G_(kVUo'!ED^s$5ܷݧ.N"l1UzϺzE>~=-JO7 hwcDtDçji-E/#C.ސe,vv8^ 99hыW v>|D{y!xh\9qĿ"l Zm zI3zoQ`L+Nz-uLfk(-sVTٓ\zf~{AGzp#( Hwih} W̗BZH?>N_":wƧNW^.]eV֬1c?s)T/PZڮE~\kd̈́PVQSf-q#n^%q'(Ҍ'P"@mC,I0 EA01)= (IEa0:LiRܚDWe$Os ɜ-rP+Q#nRP4'&*a iX[_J}j4ZH9(j]k#z82QʵVr#x0s*|. #&p< ?d(pK۵qyyRCٜ22 }y|Pd@=^s%w5ss5E . 3@6Ċ&?/˼n2OaW N-{b|"Qr0̪mŢs?%ߐ: ~A9%^]N-ӦY#gmLa#6Է;݉QJP WAחH8:iovBx>%LzAetx  tP<:#@: 9ϠKsg`JËkmz'Pv ,gfQy^JX>^ztLIè8 71i]oD-ĹM; ~s-!xRВi@ aGC´NfUgXJK({Z%dHhu~ߐkip,bPڊ?S6VPE87vFiŅ_F׺Ƹ٨JqndP\0af}s+SUs05$S[n!-K͝ .S"pqv/GUo&334"n6[yǝnߋ qfMSS5zWG4KCKiT z6𑊚YEúpbbSZ Ayד | Had%{-Oi5* .+E׍!(F۵tazj']Fi|㍷ЏV}lX^8eݬâql/Se}"Ǣ%vn_n rZX$w7rt@wOXC_^ԌFGEo9ç=< '՛D0h x1g;*V>_A.-<];%a~%~*msb޲ZH i!-CoS*"-֬cXvߵ6k]'YlŲ,/ b*s\d? PzIӶ%mIXfwEyǨ"˖-i5M4pfljyAEq| ylK!`3iGҵOϲ6%@uE;n oJP'%4uR5Jo* u~5#4ƨSIOf԰l6 Y(+;5tCNe~JPŽ[-2MpDUro CvWݔ|$ ĸt~ۯ(CZ+O3##֢ J}p rx$jݵ9' zN[𬏕9Qt<7C C!xyIFFV:ӯ8[QiW=}-R=~gESGxE͚&g7UO"9-sʂ11h|m{HѮ՗G9GOͫ_twV^}}mr4^A;h0#>_Cy ,yA\{¼H#{:,n.4{T/ءY9R%>0ԳC~f@G1u#r\= }'c4&Z߯z|WvhMۮh2%Jk|DZ-kfΛAa:0zٳ*ڍBZ3Dޥσ-NczЙc֫Yڣ 6oϏ;MyƮ9Y)dOv!-OB_5b֘+{e]uA}Mo^kƆMt~]I͡It): SDkRq2>)RšDףjIWR&I1n+nwhAm]L|@lP7D)$>PF!V-x<ĘUv;a؈ST(آzcV6 γhut#D[m$nR)1`<,+P d@<tq*u?jq4> g9 $YV e#z=j ,̀eQl\MV؊(uʋ!JwTK|Յ>:מh ĸzB*KZ(O8Lq0yץ])0ʽW #X9);hV\F2_eQa7{}`zi!iQ^ ;*TCVkh:wyɝ7 !gyZ~x>: $B'2C:A5)O9c!Sqwg*s8g o1z=Cs/(!:olnѰ%f17}Ԑ)'fVTWd,~8;gn0o!JқՖu!.gn nVa17 #E y:%|]]Mvedǁ?9wsPjzf[koYgGZ_eo͋`Uv8z<(|UVVAdtgֽ?HY:'ڟJQlA%L6cE?ʧ3;˳uGKtustu.<s8^׀TI,rͱIaMt^ߌ[9*A|v5moi Ysj8ouSڵ?Ԭ9knWAqsDvHr1컾bV]c yQ$|a-/8;gIR?oSQ8|%׭Yc^oy߂t\Zv+rydbhD_FvJ[qq#[~y>gDtKgrLʣ~ţF~o`"3)ۤMwl]n#/۰/*~wM@\<ݚȵ" +_:>e2&WA]"pv $`P'W <>ϙ)k=zV{TNK;qP"Rϸ:x=}ac1;]ɍ@3XGhiHNʸw#N~T9) +g%WV?~Qv(֞ZR+5Z>+V{~'A~fHHy`9У;чtOA2ߎs̓y%+77*džB=/"iEE(3qCSnZO@i*)mFri$5񶠖5p ȋOXpdiYRFK+%W{~>|koe6{yBB!!(?^/)I:˜z[txgCݓfZ=9n= {pX| i;R7褀o%f3VY4c#t]MbGiĞ-*>!+(~{R9G]߾Tfw\Gd\[Qz -H PIDžQh.5ڞƶp_+nM43M}{Ϫip=b~k-`~[H vN5%KW^rekךdž:_݄fݢS$T157QjV$SnAW1~v&Bro5[O?Z+Q߯qEF/8-%yƁ k~mhd$h拲$N=O䖵'0!{I)ap"J0$r4yN䌧Y3PI~U?`Ŭjz^+ģZԃrˣ;5*/_}4ߍnW\xt#G;Y޾1֩d[`.T$[5{gkwAOr5Κ^9M#)<glʴgICw;'&zX>C~7x[^|(-E^+7X[鹆f:wk~I[~P@ qSU 4ݤ;=dC.7.IOBg1n0,kgo i}G7Z}0{*oqCX.yn:ƷQݑU; ${CrxSᴳs >YieeL:#'o) {jePϨdJp#Nbw~cɤБK79j"Zv:ir8D#UGA =uܬRb|0SXS,XX9r?Ԕ.+g;IaɋG˫}N}±,uB%:iֻ']K3]iͬiP\FA| jv~aXcxy!-NZtyO!cj2)lR)=4< ZނEd;#w*>!9#!_"rXϬu!&p[֙[/I*þGU,ŧl`Ǔ…crFH._e%-߻U"ѻ[G{FRH >RiYg\,5Yc텎ySΪm5X^sǴ '5c}KU ֑:xrýa=M[ (<'JKRD6YAg^hOXu^E v d=xh n@>s/mqI0~CŠt_L)q>Y{͠WD'j-0JpLCo+s<@lq(h̞3}N(hkNiP/ٹt"Z4nsݢe7K?&L'etF'%u [k1ޏ+z/c.͹Y:Gtl|Y6;6\;":.i,J1r(t/V.Lt:\''G~_JMvDcV4OSz×yn2Ƨ$_2_b~^3ȯQuJP-c) 04qLJAPr0YH 鯗h79_u _.[+=+|?, Jj ƱiGyW8lU:R=1o=b# j'UoI.l"< v懁 =1LX2Z(his"W)h<$4n qa3E_*F *ĐQOL4A0Q5($VjTo5ZaQo*r<2јkafVM[A݊HU3iD_;5g6]Q4Hw+FIsOg87aOVv3ƌy'%θ+<_tMo@AL{3C:*SQⓖaK>:WT泔,Eߑf6fb?7ʡw|_U󀞫D%Y$ (}P>,{ <{9\2P>C$͊?B{L.kèxRneSdzX_8VyǏDDih13U#~3݁@dʯʸ:%"|aqտ};Zϔ/h}TS=~|-}ZYOƲfMN|^y06zSqΘ⿨TOcEMq ?%Nޣ!_(_ ko'FZjRΟQspӛg |;0[guQй=8O CNK:oOQ39wi<T4nEa:+ś NxB;~mf\\({=?H3iW' j+ z\j&Z$%42b3˂z)daRD.debrզ'mfi)Ux,Ѵx[1^.G!#V#DzJKV&(W[rPcn'56^WZUXTiRlvhQO\n(`]rNķ{`䯺bjpO?Rn0Ōrk`2U~ֹЁ?\krѰnwDJv!xU+j>plz2Ρ<Ún *;ȰvL΋Y J߈U;^OlT4z;;u raQ(8>X5vT}BbM^Upuc ^EWys4zkÙܢЭ /-܏O(m'D+) CY)#ÔކFR߃5OPU'߮QQ=? ~8- }T Scl 2ߤirC /UsϘ_Dtaк9RnvlCõ1'6oz?ov5>Xћ}ޤ{!wsv6xķ.^Aj7MIH1ԸBZH ɦdB{3Gj|~w~5]1E{g85G|g}Sd(V!qp/.H9c:#^Y!9O\ WIES蜧Wv<o0nA%U4X}%yvӇ) =+$yR5t¹űʆGwO7/)W%oHxȝSɓ}W"9O1r*K:c4rs#zMޡ1>ԧPK&ӌ~!yYYI7NL|ȥHSI5-< ?}Ŭ'l2?UQ>eFWi/)Aw_EtNòiļ].G<0o(,%?)lW׼F3˯뜜E:a1ira@1C^{ôQ3vޜG cl+Mwx6OP1ת'UڛFa!-鵷]Gj|rE(]~) ]dCƾϚwu>[* Y9 nwCͪ[-++.CNw:يnwy'a5bI܈E^Ӊg+D˗/fbf][wY,ˋd4_wRh+V@I'bE'4b8 !q;EwENFYYg pgYɺY@hɊ.G&..G "RM0vئ*fTx{J#fFQ^FgNQtiY z7e\N,;^U+` QԊJW[/Er.^~ի]֞y/oV`SbUO ~s3^[{Nh%(&fvNwY8ybŧ\ł3gP;q>W3YrKv};;֞}H4qzQmCkK@?ˍ]XP=C[$jqǦǰ,?x Tǟ.k_"`[@sR~ϓ%yomğͲEfhSdW_q{kPtUbU[)h^\9گIܿG[k9'3/pJ!gQ+Bzw! &Xk8/oqp,BU9?X ﬗYfq|עsq[p< .ʠLnMNmp?(5ERӵmy]zj%c\ܜD 9OE_׃)LQ۾ިpV2s'㦢e#R"c}ooD4co{Loc@k'0܀;Ob+ڸk8ۮIݽ-\.BӯKrCRƧK4?+K}+j!*p\s{TC=zF,oo0ȜA}w!-Dg־1Rׅ_3ZvpmջEna'pRB\>0鳒ָ[,):9g~2uFbzծzD)}I,ըVkZgYQ=&@~.c8.P`7VFiM@ 5F1;B6s:'motŅ_ Q-٭FATKa$D29Mx4eyEI'fxIg [cbBa;j),%;^P8'ASא6>&бOPNz\w9S U ]6i_i6rQuWuPk+cF=F(B z!+hs3iJ^y} wfIszB`{+{9#}Cy;XnK_Ɵ~o!>(w g6=Ycd|ς2k@?T8>&:FRPp@T}VD{j5?d>v9tRi})`rkt4"1$z< S:ٷ?:^Mu6&E@iQh̟F᠛/}Q#~/ 2:o'i{ \rua Wy=~erx|&//{I\4w@VP<0^ھ-BZH??P]z^W^@z50aje:JQJREolvD]Fq3ɒzP, +uܔrj\?QakÊ-mfM|EepQ\&w+,E޳-~ۡ9/)y9Ji9 6a~/4f$%_x45JI{g7dl+-:?yPJ4Gȭ׬ś~3cw~S?xBZH?8E.[{9U/L: 6s ZAPI:eq7 ZpBŊI3c@xbucv"*nvW$D\E06w4.t:]+,xpI:S]ƴCF v㬕yL ˑ/d#wi3I(I ? Q<7Io'Z$3ZRh6hG.e nl&PҴ,_^!Ͷbթ7Z-),z]Jŏ݄*юz г+J3Ƨ|". αY"טaU[|:o{<&0DwZU _qY\wXO}+πC#VX߀NyVٔ³n&FOn&̉K(UG mE+c\8j+l/v1Nkg@h)Xɗ5w~ގOgJ_{Rt:Qׯ2ۧQfl<ύ`M+@4sp]Y>%E7`2ˣnTJc34ONWM~ 5."zKJT" 葓'sAڎ(rFUgnQ JX- n>!t ;TCku$hʁm-*{J811XlQtPf7!,MLH&4'>v&ly!s B4r{L"c:|R=e3(y~/29(pY}247hƖ}n n$zn7-A&1=߹ nuq*O um%P 4(ٴ ͋o=r&'S=-!gDYu텀=y7qRohP1h_D9֏XqE\eָ2./ v~́ˑ9?6@KP~ k4ny`a!-o+u4PRTp 0*ltT Y: !#5rg\iA;x*tc (Kr2@b*U(="%T w3bB6Oi*/U 2R٠hJq~óԔMWq$iQna [Džt~4J56h  AQWIތVR'-5f,z ׸1u^,+L?x xFiA -}? zpi8B BϪI;]I.*\tbzVrӋ~I9Xh !5d^H_cϵ70:1FV|yhZ OY1he{K̀ &cLk8~[ѣ:L_NfP7uXsʞH gR<#*Y?-ˊOkmt *ϭCLϙ328^-w\!Mѻ˴FO](jպ+VYny% FeCJiv:+dVx=eTw tf@() ?O@vNwQ'UR;IM]0lSSy'TZF)SOT R4IKI\mih|yBks,J"?@s 3BHۢHEe5 mhVf^HIrցYAj_Ifޢè(*ny٥kz7z`mϦ1$a*9,/OVx1 P複~;y ϊO8 KS1ؕb~|AK < P| N'!:)Wc~H}#zAcǼnz܋/9ת[tLQqEԋnvܝ{ɚsVe?ZݞbS?MOfY#Y j+zA4x>ߺ3Yr[2lώm_vr@;;{;#ߣ8qz|vK*뗞us ֳv*mIٯ9 lKϻzoka w?%wnw9Q|B6qC"z+*sr9~}7ҍt<$I3y\e*]ǵnJ5Rt D۞WSkb4tHy2ޜE٫Aߑ eO*[^lumuW`Nwxj!)};t8|of5tzsƹKN~g=g艂g4ii;K]>2~ي ^C4O#(>= KxH,MDdt&%,MDa ӫTNh$ cԎjAֈqT- å,m튎Qx4ZKrfըO1@RPDJ\ZZT.Q+n5fP/ >)QkHNܸF\n]~O4Vx*#{@ XM`m,_ %ZN>ڹUݳ=%icڿҧ[PM b_ѵ\Rʃ D>m ,q*9cfMòW@MފRBUw1r Ή%uGFlGEd\FTRa2s~8nAoB5Y) sx=-\JζnwsEg-l/_B D[濂R*BZH 金?FBCV \y&v_/n4j}K_U7MJNEv[\@kw7FJ$Pۆ;qL|ؖdS$ "M'3''99'v￷ L0rF)Q_޻o=ѣ$}Tij_YJI#%KW]VWmJ=5ΏGkY:-3o8- WWl΍̕F֦Yqhz~Q)kkF*wn0-+zbFqdtF}GF2227ivw>o<2u|\bčKW^Ӹ6޼SZw5Ԭ}{>sd`ETRmx?, ]=W.Lu@uڏO!7בqծVX^(.t>kF_˩K표;R3ۥfQL﷦Ջ^ }k{|S>)ߺkLIomxI>j\}Rm:3~?%D2i qzfZ(|A=uͨ-z@ اHK;J}N^ 4ۏёN(T3c$OJmoHʻ ~B.X3HZQҋx!fuw Uۥ. f1G%Sj={Gew^>E:ҏV_^qZl]8M2vtI-6OJ~iDNs`-P\mT^qv?1SB>*@nз3&tu 9]N޷?y3݁^m֌yL_>34Qz+/0F jezQ-oխ2 krB>U=uVƨpCݫwūK]:&9-PlаGVMxPU!/IO=//KHfq9Ǐ1YGmtX7l8㿷]em=n'"ЏfY%:=/K `t[G0^Rү`k5B#A}sRxwйdյˮ[+,Av`ѹ.eHcҹb%*g~ųgKpcpH);e^6R]g/m;w\. WJ6\iVΝ_+עڳd 7+[;8wڑgQ54"DƜŬrvrH.? : LI@]Qzqai0 onmO&Qfiaq=Vu0 ª_t\@(ruďV4NAhWw]v(lAS0pU?$&]?8R?(F5#W+脍ba}RAgAF. f%*40*r>Wy; }+q!{}_ATv ˞[.* ky)9^/ JA7n^X5nX X.Ǫ|s=hC?/{2ri ܻ,7Òqԓxڋ]m껠^ۆںPf;Nhʠە,KsLv;J>R'/u 3`j.쇷F"\-A bG[<6fk[Z3tJ&.z^v'QeXD"71 ј7ǥ_&A']vjĒ9Ҙm0Na^>ƿI=+4P/TUG*ضREݸU )Zٯz[)Y+v%5߀~ k>*[J7uZj[ʪϴ T"nsm݂>w`jL/}BqP٧UIfݗ%+e 'Eu\ŠOoc5iL*/3p>&:qAKԩre:USj߫O|=z*"PW rg?Uƿ4~/{ĪcJ|v_\VV>ܸ#W'A^ hdV!@$!>U xe2Np"ĬZ1?d NptZ.Đd?E1bu:pf\]'M0 uӴfdJkHh!nN+U*)Im;^v5MM@O,b\qKb.FNPU+@|w+/]( (2M|mx.Toʦa`M\{P)aE5vgCEk[̛vl/<%>7 VpJ_cCv/ȡʦIhx !|ЧVYҎq+v;F;dk,8ua)u\#Sl#? ];.a 94ٕr@no4GA ɩa.ybȌu3(sAGPZ [iHe:cZVxu"3CzlYFfxX&j8" tBJϢ8=fXqddRMVBӀSy6g1}|T=SɶZa;sA"W)Й3/ dZE) cL} Xl R- ZRBB :$Z?>uU~@@f JF2]3)ϙsE[s񵖚Oi>̧F_t 귮t,[lX/OLyR#I%Y%VnP(V#Z5 qxqU?H_ȿc't/#@f~Wb(&4Nz=N,$0 E8L`= ]En$)>T^ڋ+] ,KaQ0E)8nQz]; 1c%׶bdnճR:eus]EN4mԳz=2`~4(ID)y ;T):Ǭu 5smϣyZ]bKW-}O\W`Ԍ8J&'ۣfoU_UvNSC3#[ju[=ZB厇e߉͵ eSKoE=f$ۈsoa%a91Qn`踱I4!-s^juH%Lna7n6%&"SdԂ7~G`)4dDh~ߟŞ<>ĩ"Ԑ7.E6V.ja6+)Тco1ۦ1/Ӡ`'%{AEi߰ƾ&y>-diq\1e$uЈیVCG $`NsRVB+Jk)n9"~Dc`fw?!k"ϯ \;9crzM5k,C8nLS ;jl4`ݏCA '&s/v<7zaL5!hI;9h{ ^J \fz^EGd>.5x;fr{P-'2pg(Cn9Y kXݦ`;f/5 GuefX7}"V*1HMϢۤB?^}!Ǥ#G%f2F=-I Q{[kDU>X|܊zI4VQ^((Z$ӌt})E\Qߴ;h-T PYHYR_^DEv5ӏ3}ÔobɕK.]DV)ԏhBj\ג` i*)!:@M!3-N)f< ?A otd 1GPЍmDI^+Ȃ3qmM7@*Y60)pЏa}_rռBRI(imSDXӋ4dzV"8F P#to,>FXJCw5+ 01f|ZD#ÐOƋ6/泞OIfktΣ0X?{_bMʓMdq[+n!QRs0-)9h-nL;[/rvqh.3 wsRA\'[O:D*xqoK,&kSMiTxyj,FgnciAO .BSwhF?%Ρi~G  q W:2Km<5q!F jvƕDž ;!r;pw.I ~NF҂/{܎9(hiMB5-@"JM:h}@Mb&shw2[K㌰N;fbϣC/Qj[= ]iI 1{…24Q] M9*T؏Hk9=t0$Gmb5"an2]~@edL]C@jCmʮ. !+GU\寂l-L-"^o`)ȸ|O?u0 pF3ݴX)3+5YX\h {AnJ|\>ZT{m.0AVA ͧHA_2EaXG@2R.k%۹B&KI5ieͲ#6/ ?݆{7?'#܍Sw6y SR_Ӡ>o~RdY/N9xSvZnpw=iph@yX ,4 c(}[uቾVQ5P#:Z,[#U< v#">gNa^l+PKܾIp$#=,f#!GN{w.Ni>ͧ4ӏ'3|&Wt W/z*`[⬑4a#Ȳ ^Nu20lQ%YJ3mZSu:aQo > -[)&ZWuN5z=LXa-Q=m{-k4DLX҈Jh'h)M0y6".۶Ce~\4"eK<ϡ\6IA%7W3aoibtzZ7aϢYVY_My`hRt) 8TKj)3vޒyXTv[~+"NNS97ɺjJ3odѶD;ϫ,-S,/\Q3}Z1B% _NjNfo; |q.~~j&[/4@>w4#"]y$!]Z; RGm7YQyO- )u1iL%AxhҎY OH̥^cY;Eu!3Xn,2ݪ`;vzSq;f0D>=cZMu4/8 +h!Z$pj܇d =:(Pq< 砸N>)e2 O #duf^N;B-+)5óR☴~Ɵ>+dura4}FWIFjV~ 9d ތF)SBIidLkϢ]bīzġRYia5]#4~] 9+QC4WYkf}Oi ¤oP ScAO׶(-G*Tg zNGS ఞd2Հ Z&U@:AX\zc?B85$t?FWgŲ yM#Q%$8V+F2ǵ8 ,Ȣ8 ? j`K lb[v#F׏"JO9"[}?r] ~ūSIB8TZ jD|ؾl;pE6͓vhw;2B!_r*^:gznUWMҋMP9ߧ*g;zJ2JK(8pߩ|YN߅'z겥W}jy4bOC@ʰ> &QcQlB#SJyY= !$<ۡbK>d\ @ɶ}"_4gHm,âZZh5-U"M۞=btsXΗ14j~ ۜXIZVplҤ&JRt5uWRTmi)zR/c /:IPBvJ=EJ)V"*(Ҷ&Je mH:_W|rdw[h}@%ܱ|ĮBĶ@OZ"&zɬY[ zJfLuہ7f2vMMJo De )>ڌɣަ/>k즖x{&1v-dh6LM3ʽyv-Y{Zoj-Rb )Om.P؏t"՗ 6,S/2S)r_;ћ; @eٯ4s$My0_O";ТIٷEܿ]Wgc/TiF&>6ob_nuF{O"p=.-xCFߚPCl^p&swh?at13}uKr&)E}H.5ﷴt>0X/lZz _tektXļǔ>A չGY3xHACK/k[j'qأ:T#Tz!Z# Lq[>M*2Ϩ?2f2qɴё64ڍ _)}K_PjΈwL95h5g =i[_f/z"ʄkPoQ T4p؋]ki>줹Kqnx s%x_Zt_p?Srg s=_!dB_kOFc(¡xh?3:14T_lC }kP8&cײdY$^ٵ{\Y{rV,l hqh/C\%/Z H L:V?v\`ؘ^zլN[Nj4D +v `S@Pw y,n}4dQq6([{Jq*N! +bZup> ڛqʕ{8tV@Kƴ˸'5V> -F:!GO$y Ӭ\ [n oD ˮ։Ov+-.xhΣvD3}ӜDZm2G-y`R Ca@iuӎ{RާSm>:-_lU|27kWV+}hknO44~"Hub<؇XV7/>nUGUeG[X-+!sp{ ͟1A Az 36f(  gz࣎Rs 4=_'5D C4-]~w vci!S ѭN`w9ǣ1A*yq(uBv.INh'hm%VLY|2^uKr*&H-<,mp\WC%̊o.8VtFo>kvܞr "?qkKZgI9|jl;2R햢jP#8Ej\7Fzȕc}߈P 38 YzJq94$F _k:NxχCpۋQL:`&rlND4f0MBWob}k4+ z+,$ \Qm)0q:c9/3S8̝t=N@>ҟ1&ͭWxA~6 h'%~Ե+ǾVpY h t){UVS\J4Qwv'Ąi;}kWoRt-U\&(CMB! ;͌1ij({pm3#Z+nYfpquђ?nz=ցuf{ćlSՇ3zڏNӇ.}ϧLnjw˃뻹YNk]ţ⿊{Wr˥|Jrj%t r9_(1}]tbT C7[X *|],"7 zAQ0aso@ԪWvWr%'ʎ_ Eq}t,[(ť^2 a8fINDd p[N6Ɏ7h>&Vo{xjQxݍg'atH@^Y< Z[~=84x[ LK½ʕ&/"mF Q?7?!8b&Nta4-m#VG1i6,7)CCC~I %m jKa/#*MX{ĢGRvWD+ՆPJzV/o>p!="k{a٤ƷVŕ66+qHdDja*-f]W[nT+'vql[3_iwJ⮸ZfA u*IW[mwZGYSі4|O3kb_I W0vɵx_rpi/RIC8,1& NYӁpp0uy} W41O%_'q&nkLz gOI6IB׵]POJ ?tݨ /kg``PCR.tHtĈ.yt3M=hwFץya/C~BjՉP% Z ݶ ; CFAGW*5WpA) CU+yJAҝ+*Zfm3MV pNȕ+&6]N3NEbb{A&ƸK B'j?v Z~Z}U@sY P{ noL_1^1еMM&>dM c&i7є4FOIi9cM 24caQ#9ƥLXI71iY4ڛ:~>[R7ۧm\1md[E7e\{EW6] ޙ8 N}F%6B[~hmY:n$њ6m4 ᶘ+mpQC-gj;Κ`vN66yLuJKuP#fOJ,nFWnJ7Y+wIȘA]JG.4kbD=mTX-Tse~G4힗Zf2cz}7Eb'.H7{D~aL A;e3T3};aq5%FS"?ak ~7bvgPvsFOXwJ`6]=ucF&dn r+:NC VX< &DZ#B0RP\f''m,=Wo-&zXM߆RŘxB ͬ~3'- o0ˏ01R7rLib/ġxX ͧ'>WK/_N˖-_;|kO drvx҈3sYຎ%7!S` !xq@@`tM?@5D^յyvX,Tk5T7:bD>#1VGeubZz,)Ӑ=0,aPQ4'4%M1 p3J}QTl 9+BwVAgI5 ZG _Kþ iP Bd5?\qj@ K{i?]A{U_ܼe"PP=v9P6&[`SEޖk<QFXY4s3 jim{oզC`/`$PV3 C^Iom!Bӫ6 SIjShflE|{o ueDg04:<>.r^b ah64=eM,nC>xi' cXiSF_"ˮ7DEH"XF!6_O/7y8%w~F׃9QQV4JeZM WP"N*k*U0K5?# 'KAP#B7.TKb;OG@(PWv)j._n0 qTĔڹc[Q'8D (n"a1`LH1jDJT*(:Mۡ4ignQz亵Xx˸ PǾY&ʛdfuף;xeP?BLE].:!cA3]J%TrQA'iY l 2d(: *xI^bGQ܃'Hz8.N'z7C1fҊu:gd 4I /[=qkW\RW/ǫ{Bt hHj<4eɎ2rl-3r&COga%O6BKӱ[y:ӴAۻ6Aiuk-<.5>L|cMY]ILOeU\pwݢ:YFMV 8% U#PGb {6h~ZX aLCٝfWEl3h~D獉5aU--[AebNw/$^hS4Ї6bGk]+xDN&l5VLruY|ɜ8&rh~A}}!h~\WɌ҇kRspICL9&#&h+B:hp<)-->G/v@4^meGГf4 `/)&$0hČw Jzڃ6:i~Nȳ-#=1; #s0i4t)sOb NL=;FWYgvD9"ާQA6'iv'D~a팙)]W[U/a4=}| ~ac`ԡ[ژ JEQNcʯjV ~Zt^OʓcŘGNGe Ôx`"H܋Ethg 4N’Ўu :$ltxA(sEyω>S%Ynꓲw(?:y|lqOGVW'W>xUby\J=^6U~ʅTMS!A'M,Ig/ ӌiҏx/~a6=ŵ$kto;YJ-ҋR`4'"DI Ҹ<pV Lq#m $sDZh;.뫵`LWž=D~\-!/HQPqJHZ+ bRnSB.t]ۗQ\ĹrxDLYzgkk-h[mU&Q<.fWX4cL5:wX j,4b d~Ju\b=&0>i\!N֤v8)k`6_FvX? |eƉK3n+#6 5ȝABל8ԣ$gn8 -تr'7iwRuҋI2 Pw\?8eV,?!;bCOM}Y&I,28tG]cVԤ?)ML{'D2%IM}QUo$Qٕ+RbQ. wJ k5)8Ү.F8Kqf,_bzyqC\~Y4-UAݛz׍ȯ]. :tT8j-rrE}޲S)}IK5ȋPEZRfW-VπDnAqa E0}(E⺨6r=KqJ)VjٮČ+f><+'Q䡟[U rď|+Aäز` :^)O\TJ+I|wr㕼Gsa,/sɾjUK'n\rK_iv\-{ӡRaiC$|)qrDvՈGTZK]m1R=j-h7-djښ\%fv<[_aiwa*c'h/Pi hvdo&{M܀|"2(/ |E'q;&|%j룊Qj83JyjD[]FEd8Ρp&зEjDfqeMJ~RX0D7π/A}B{H*s~JۅOEt]K]ͯK8`5J?tE3 11HsA`.9S{zKn5ǪPCn9B{Ṭ"r>׉덝]isBV#0-ER̝1!Qg.rׂWtvj=KDŵypasv[~D5)5hF5Bߵ=o67/B+gѧ㲎?t8"-:73@YZ>%[1Pk=NKӢ̧4;yH}%Zݑkɥ\d20lrW;w+KG**ktxј̝L ҹs#i:z.KQYQ`ӑ\k=?͍;s##WٹRZU0~[0 $zIEMc4&1N-N$SLRqqw\v{P]~L儯j!0FqҀXNƞEt/13Vm&4΢A.*) kN}3%DX_q<+bSTavB/Hj^^\u\. QGlW ZWsѮyn{%3kTi#e8e|H_O hc3\,JyƄM &y h\ ]y_˨K4[Qb}y' vBzQ&L)鰉u/Kh-~QDQWtXĬbiAе$'tTFHKT !4.qIBO9ci$pkg5j(}Rnw {1qp:ĕa3 4L:&#tئZ6%07mҧO~g>}[w~hiϵ@}/hJC895M:*kBw='kE4BMϚQZَRGr*8!3zn:ю߅NN5>~uhuMB EGލy6Y Ryf38hҘ.4ٗ-['hJN#<|LVD]J@#5hu&+*kbFb$uh.;([ü k!zɨ*%i$GFv>i|5_U +uҺp9jH5ݗ[k7\uZ)t,[dw"ωGe='—2l] ,S9P lDcPh,s'J~I4J⹣_3thv9/ k:^kϷ[17CϦ[N=zyC z}f`a <#<9yO\=OgMK| n3\KKרBߏ^Ƕ}ۏb!. }aٌ(<&̽hW?oݏP`O_|Oi>A({q ",xV}Ū&q?Nd?ZSm窕R/]ZvXb1Wj|4;%z$B`0kaVJ5*V*G^YX C?*žR:%cשf15FݎjP]4%40v]B¸GcjK4rNыSFqzS?=#?J Xq`WJ% C8ƁWbLŐ-P3IQ@ە~a#yZ #Xqwz_t{MCoGYu1zlх sl*#V"a;7?%Ӳ֫$L-y!b`5{Y%}0(=f]RI!9Y:tT*eN\PO rf WQ! $[AcYTm7#/,ڼ>nLG JO!5ű9MS~S9u>ͧtX]/V\W/ױnЩD^FJ#ȂF#d 84ɚci仮[!s<(pj-VY:ЙOsġ&5,p$;ūOReK(v>(AiF&WuqƘIz+])a%}@QoҍX8uG1i\͊]kB7`mA5(8(8?"? & %UЯ ^ɳZZ @(m޶/3Y=q-b))O]g]$D?k-۲UivPHx p\:kôHGՍf?ilZv'[NnS!!묳eÆh k6wFp>;MU_LZ5EkzDxaCSǔ֞<-v _3rr,מH?#CC_GDkW _7و|O4?d|6k&v+-S&>~eǍMmA&_ țwTVɊ>%%; _(<6^͸.8jLq)v)(JSs1ź0bP*~BanT`ݲ_ml7>LcRO!ZʩbJ-q85ߵ=ʤQuĞ]tvTUo$y@Yc1c)zU;||/Ȁ`84J4ߙYHhj3O l2Q·~t FNU'\Ym o/cW6>1>K'j/:qW%qM&mRfEje_Oc?nETji.a耿O"ߘXz`l8OС6c4_ŝccRr9@ZIBoBc0w7郇vD.}"ݏLZd]}Q~FvGMO*M_"ef%fBL2TCFuz&rQi9qCOk/o4<"Y <+t~k(t 1f7-X!2$q lҺZ'(׋9qJ΋B6M{hzKϺnjqz̽%w"1M!MԎԡu[bFae>ͧç Jx Ep(IܝvͶ_Y]i/K]9zqSoRJAr%TBC-e; 8zjdł L ;z+bcQP %6cT@`BX.Gm;4VkdFq:iq\\˧ 1r8%-4d>ϫq5I߯Ł/8J+qT45"\'} FGC6oNjkZި$seڨwnO\xD$ ܀~|%y&:jUM/JNnSF4^$B˰+tt*\zE5rwP͞L8gM*%{rVKiaY" + κ{#vYs"]\:.M8n*?eؠ'Z L@aEؚ 4d;'^(.Lt=L_'f,yOD^2ы%V1Z=e5C$|غE0a:M9+]Y2pؿo9#p3:9|H h KrpY+P{QqmL4]&&uSMMkK{@hu@́BL򿉑79"6}T}Yt 8rRv$? :)S|.8;d mQA X ]/ NI\cYu*qeEy@Vg24(Xz̫3)pZs|;+?ow~*=f]~Bz7r' eJ>*1lb~sn~󧨇ǚYɿ0-pA%Yf%O M^pArR U"^(^3 GfiuԢkXދZKհdk7iwsŁ/s;GF201w8+UܫPVσB7pz=2Կ*o=j l|iK7`_+BCHVdyX~otx773|b @K`$ "Oor$  xw-)Q &Eݳgڣcﮏ+J2ju꯿xҨ_6n{7Ӝj1!DO4E0E) Wzf~Z&,Cw0,ba0݈(jUUY'.W+j5LN~QUj ,+ 32V̼et߼`Ftβ$37߇s9zNElrߊVb̤1ӧmxfoNu EϠ%[ӳ6;9n>e.1x#U̔Zaم,'zWQ-{f޵8" IVk=GWE}=ٻp7ŕ~I\}<-3x_82Ņaƨi| $:ɵgk{3x6ֈa7Fqq̎&5Nr{7q;eǩݎ,{M&Uބ`;8rSO/q}nҐYhڎ>qu >}cVjgH\Iu97xFi}&i0fGg/\GN ˌ2Z +:j΁|"WkcHߌ:8c͗@Ij4p v}Jg|ڳ \k|!IտGj>[fS β#pP-~\7cU_Ul'0[ףk[x0SarFz wHfyQSi9[[Ks}Bs%;8Qs=ff+#-V}8Y( [S8up{\f9/_yZǑ__> hXZFy5NLV8M$ĝz~Hk[光h'q^1WNI3N5E~fI܊Spj<)meEaI~3Hx1&"p JzҊd}މv͙Nlv:ԛ333A5mM$NNd!xKPaјN3@Mڔi>b5[Q<1hLT 8fbѨA⧷!ÕkV\|ʕw#u@s^8Y0/[!g^o^#}ǰxZ 85Q,n'RyL1nRW; HZnt.T_>Cn-}\ψλ~uq}F曰|N-WFu :>fruP?d, {%ht irT U6`&U78b84mzhXưůcyBl:aV{n- ZЫ#(hXu5a'?wmKDuq&3OaxA`xIџW+P?ufg9Gc(6B5_w:F][>yje36vghUiAcceqe7`n-MGЀa3ikp{kcaEƸ~}ڋr(M tiܬ͋4_@냀` hi'AS?]c:WCSf,Wlؿ|pE`jj2~@V$]JJnY&`U/ϳnt{ee%eIVeVlݤvr8Ɣ&slyNE(3|eem!+nlf9%Yجz8RnDTP+oCW+XuI`er՗!r;U봧u+U/_:o]j<ysBVC8hgȝZoTX9nvY^(46^/+2gb-;6&oGaYﺳ:·jqk&E_"PBY(>"}CxjW+5r}}]l+_n_o{5֝__ o(_ףZ56,[*_||}]nFo-[{_ ׵-uί]~Z̶a]W_WzТm[/m{7n/׭+ji*CAЬWA=4AIYA3O;Tq~ҬVZ+|r>Q>AGI, ,SB8ڒV棅4YRDED |nSPb-(8dyFHJSQ]{%TRpTC.T; }v󦓒Kr5 8k;ֿS1 }7_j%r-XsB>GPהb5s!ʹE{*h1g(K+60:g"\g%%Oݬc/'@Ǥԕ[m7סC8Z8=ڥ.ʪn6wJ]<*Vlc8<Uš@;qiC8YEfR? DWIy]96,ْg\ ļO!ΰ{5E}:~)SxTJ\86}ˎRb.:t׎a/)Vg {@~Ou>beqtQAi=.3&|z}S[5{ѯgUϴ(Hm0:ϡsslNN~v@'t/5PǨ$ShcyP=z$rj`O:z6زY#}B\;hƸ]'{rB3myנ-+Πƴ{WP"QɂY( GTm~hU}p՗-7=zO˿Zw1B+z=JtN4\kGAF85'g8sZR$ͳ42E<wd@,IzE]@(̓" w{J$OA Y M)c8=piMf{ey9;ITpl^qB/6`_wz9%^uYTCE7ynC+ / NHG><Ǵn~Z0dL7t0c’5&UX(zYF:u^--Kʤ\)4㒼_KӀA\I-A<{ʩկR ,9GYRVLwQ9ih;yRE5q"nN'#:Ŏ13$o' xBPq^ڳ}m¯8&D)/=XgdqŲ ?{Z`#QQsuCiq7]='B>8`~\CT0zPJU彧>\gG o 4lgTcڶY*yQm_[08Mxl;P/h60oH֧oX[AO?E*r f"K,S0]̓*72[1Ϲ-@BiqX[JTs;j7So/%j$x V@h<~~AT7f,^)uQrBܟ1CPBQ,AOHߪv!V򕗭<2$xk_W"sY/+I tV7|+⥽|I -EyN 2u^tt/[8/[:ۛKfҢL$tmYrenI&Kx\j`/sK޻׋NuQVdk t\:&"Lꥣr.$e/͗y,vQ3f ȢȆ f^.Ճ)D$I]T4ez^ri'M:9`uYdޕZE/Z)'4dIW, %6|;0K:;1, vO@tY8]SڜYIྋYRo-:NUn-Âo 6YYvgbi{1<")x[-{QӨ-4}Y^=x(a$O:[/O=V7> 6vm'FUpr9TM'؄+w9J+|Jctewލ2t;6;h=FK/¦gIcGтݮp +{9PDOsavY'%Z{ڤ\~= !8i=Oo`.KitS5sf;v!rJZGWctxYN' xV}x=.>TͷM]c^>Qf݀]e{>m?Adf)O, o3hی.q4A :T5vnaB5m\-b̿CKn3\G<  D᧍ᐶ%U  dY/iU6uO'57"jC+`>rP͚ F.=-+Nn7v`5§O[+BY(?9NVߙw9\f5kVL4L)#]DL("ぬhY; BvVN($y >;5TI 0IFx?G `X4#4Yc˵ -#y3|dzEbvn\ZG>])R`nZK>gy,Jf1W;sVe\[iWOzog-cA-Ձ|@+0>Yn>c> f9Nn=kH@=`.SY&yXq(34Yۧ밾]-m|Z^"#~mmi>И417#k.<#p-݂XbLMƮ'd3ƊtDZbQ3e+߁lIdI:k4t>0f"jjiy=zg5VXh= *~ P!C^uN"`N;19t䍵9I~CBQ!>ﴶϽXA3!bBY( ϧw%껋WXW\z?"{ソ`5yI̗$E3*Ls*b^RodXhWHQ^"A.AM3H n姜.ݸ䄖ucuY5R4ķ1ݯuo#f2Zܯ3k5ڞq{w~P~R8ZO e'gN;.{=+f\9#n6WNfT>ΌWEڦbr= OnTFkp-[m"|mIVmP]y@wi#gF+1VlC_B]5o/m_y -MnjY'ZAWOD)3G eXpsʊwS}ŕk=SVT8^ua]kY-$7a8tɰuM093f!e8Y+Ss32M;'|\"%K{Z$sp#ł~; WjY~Ywiey;ʢ jSivgsRfeV+hUՀBŷǔYq?(Uf=l! ~K=ئ B)+Pam =~ެI:='^2}`-5u|@'CIG]@PQ-m2ԕ q}"n=Acx]&V7N:: xEQb~-Hy^E0d D0.ohX$hz렶c,ucX.0Ǐv|iۧm;Fp'/K8f.C/GfG翮v5;t1~,XNc~$dìU.q "Ƨ?hBY( 'ð7p WY}ǫa5]5G=Eɋ"̊.9U2)5EE+lg\)/ ,Kcgg1Fy80 !pY)1\Z܌i'&ܙTs* %!]+j*>?QmTj+ #mqgiC&IgEA<]6o_o @~A! skoD4b[< qyer`n)(z 2j'v k |ԩ9.kN2lЎ My\B|ǰϘh߽NvS&';4B⏆PGma 9~ 莳r!epbV-_U{qpFp~黦1-307טDZ{\o+z`=޷S8v=S:Kps?laW_[:C1fS۸C'QoF9/O]jϨ-xG& Ƽ-l8v(WØ)xD{! jjOavXWd|EN[(lߘH)̥!j/@Mtm`tܴC󓈺>yY`̏kM5KeY7glfQ:oY~\nxwL|"R^EB4I⇭D}z&͍D5xOh"E>AU$~[Xb)荀Y!SXTlP7֖2-fL@QM,<d ~aϞTx-@t:xUf-d+"-w(EsOa 5+ΚEU]ֽ8I.:Y\suL1kfAyy//"ׂ35,Ȭ팱W$bO;.c O7b gPCe $fiHOx۱T <-Aenp8)Ϙ%6A݂էqkyk;j;иKc3,8f=@ODn{w*ó [y4T}C} 1DxguYPBY( VZ7ns̻Wh^xm.?-q[| 2d^ɐJVdyM([uƚ˾VuqHҌR^C'nة+w.atMAic 8h,h.l(F:hL׃zZҩOi[ZRj*kA%TU| V^: ՟O%l| O1Oo x;Θ+<"O;D4O+=XqXK+ZH2Yk!r\k9Z%c}|XU&Mʼn6Vu F>,"LO-|ֵћK2[c/s 8 6[zn3s,89 4YD\7 "~8&x܎^//~D=BmD>9|XhkA|1YP5TtP+(0m 4~w_3V|@L۵kdUje?cJ ?ݦ+0];y)!U]"u*Li2FRшSK:7%cWm+CsmBY( G|9J.wx+XW1;o\57rHC\(<](6B Z.LPd)a坴,fSmZ] "f2&yelax}Q ~yu0)K{Y!̓>%iJ#uo#kfQ?4s؜IfTuqj@6Qs\fAh!+Jt=qQhGq21 ؚ2!I( ѿt^jfEYPvjAU>t+J5T:FRz`j|+|W^{^:e sa.c\pY( H4ʸuLg\SҾ*٘oQdcj| FUb$UdE-k 9(X/zz^N6O spVCfCeoB/ֽ;l)Jk:hp̭hu*hvwEߗe Hntue, p$N?u;3h[c.IAYNs4cn< ׎* Ztgәs.Z39m_4} cdc,f(Vrn%'@6_ ӯpКҠ}O|QpuN]2:+ōr`Qè6 |v9 Kŋ!=,1}BwޣKߵ כr,( ~A)Pcu8sHނQNwZ!~7=WAV?ox5 ƃ̶w([]+\rp?6;7i:glO+r~”ޔ:,/{ []62Alɫay٠M9uǀrrVU| [y%Dzx*1Vѷ$7CxʌSl4T6ihfV_nu,^weWr7e KUߎS[5ZŒdvו ]Z7LrAzN0s-rA% ݁BaR 3={Ӕ0R> 8iV1}) æD:$Mf){QtqZ P/2A HWA=.٦NlL$m􄖇Q4q)=Ɋz5D޻w Vg*Z2یz2 0=V7>k+l WM8GX꘬X~#B8+XmouVdwSrApfŋf} ū{_4L">ǣG5@QVW=+8yqS@{%yTW~yf>f }1_(.[]mu5CC' ޳)Vs01rh Nϻbʜd91*-{պ=p*z%Zhs1>۹ @k:/5S=1fV\X뼾Y i˹3htgDVďCtܟPqc֗gQ[8w\) r&_9Xiޫ8߹O8xg=Zph^ixȍ:̙^8(f'mmCoLEڨo6+gkVgΨaG}īc;EU||Bl՝ y_hx^t]~b+\qa+6G2 1^LT ߀pA|RmHHI#%p&4g-/jEQ:3Fjf.:aQ%mvl:yp?b-~Yr.o1z|c卥yMNg)r+1A #i˗M3 .^h,;~MУK?z ܟէe:UR_R{4p |i6a7 o8bcrtf#ΐ@1׫,676w ?" sWc5 r܇0cI.۬t:71_&>_{fӠ="kmیZɛ iaO(A#Sƿ9abn竘8q#Q:PʏV A=c~Q1+ט?lWd.̐铕8.ˈn9,ECi.c&ݔ}4%)s%ՉX4=htJgơ=^ HiO)#fv4mn.6gcF1HF(-JlʚƝ %m'i:3L4QDt.C7mY^4/:Ewt%A%Ho%5ys`lDٷ l4x'qq+uaA n& Y6<9W(tDI\ .LyR\5_T?ۄR攪얛^w=;m1s_.Rja3Ǝ p-fsᒭBÊ=ؤ\V $WYN"yGFnS~I]u=#\`d}ld۟qONcY P*u130$sa;ͨ_6.PxTކoS fd|\Lo] GGN\uT&=Ċp?n]-ж X*㱣8>VɲY{ +Ϯ>)͘?4AWhD &]: "d-KgQw$.%YwRECd2Pgd8Wvsfj&29ZF͇.<w`߄`퐗03QKsx*W6gdO3Ǿf&lH Vv>SCojjE?IӺ:,KHk%P ~5oHkXN`u\ n|Gى^}Q|ƥDfӄ k4ԟF#|Z1~r8N׋z8b{ms~pEJxME_86e<}U[J'# &cԠb_Eh9Տo`6Kc-5s]0<Al1)'PBQ*+/<󃗰\~%ʕS2w?2gr 5?yX tIJeTlQA2de͜M"Z%2I9'[J tHVDy_B\I(Iddf)2,fE(f#jD8A֞nqN8MP}:NI2>\~$a;vJO`բe v~R~QEe'߯*~J6(V~+w_u٪X~I8sK)ţ\bA_X8lC=gKnay{lhgSO]rCgLqrf2hgpzB;[7Sv+F}BGL3/kGX** a[ik~SٜqkKUIz4A/-"yN~G,; RCJPO ׽߳!67̠?sõx>"M):%-Iw}(%Thȡ >,d:Wc}IPm<7nV4 x~ ~_*xj0_>. sLZMC;iRTDεsa_u/YlR{DHz[ު:)H(7.WIzy$0'djڋXC1gvٟ;3,'So^[aVc|ۼ_߮.1=ym{F{/l|bZvFm|lj("PѤN8v|VVԁ5O)AAv&=RF+|ko=)aE?|cwX<.d'f,W6߹j\jW^f?2z~fxY[iHV-it|?I[? Ӱq'~tSMҔ1ʩ\ĹF:t `&U4j'E}m7㒎>Tnv6~kQ0/Nl)f@,.qr|,]ygSNîYۜVq9֬Qd6gwpF8(;yE?+mѴ"7YWpk/}GrO jdsR xœ;վ8hy,񚾥pG1%P&$S!c@ !wn31-:gpJxC2{}|QzNG߭6mUkVF mE^SCoz6]5ObyWE c&UgI>w3o6,+58`;(I5~NsLr5"|N,r;ƻe5cqǶgt$?ǭqpX={Z?v]8c {t!?1?5qMs>Nj|ػzN ;\nJ+S/V]۩PG_p vW4( huh{w5Rܚ3<9޳]B~UB,v@kN%"\kH&M6Dax3}Aiu?AZZqtNZL_8OtjuS4wDk04~qJ(lL1"dXC[1*q'aDY 4%k~ U19@rj8e`N+*p6a8M4 כޜofIڬ5g՘:%%V̲f$Y…$Ѐ9Y89l BiV)=U#`;cLzjZ(ѡdi%BT`+"y~^qs\J(ʼFjK!|UжrI¨FZ eEVbK#uƄQ\u--ߔpSh}VGthJDu5 pZp".g]z\'E:9d,EbAwz zvu>glCi-,jn̬b N-xM=j,Xw#?Ue[Sx*c~~-s,Ϛ>8?{߳6j7ۨ = ?͏ݲT; =48?!*c %m>g2c.M>Q2,:g|n&~\m,E=D?! z8PpbOK=yUbη`OUc0_w͸ -g*9FIdjiFq㴀C΃}5806(h aM2kռ<@Nd tWySg_F01#S}ɲ ^73LcE`~\m^ޅLX9oǍm mb,sOz#Z6xX7_|T̎ ;5|D'^Fj̈ی M{5&YdAry8cn@&0^ӊk2M4S]nV&e|{ܬ53 e;H}V:u ?˖/F~*`/ j^WFs9 <ՌDstA,)alͤGp $JZYpGk ? i R+_B@483IR*b;y,14]kn/_FWGK)?buT3RΓ4QiƔ,nwsjdIn3RWBa±@);${O@{'a҃k 4* M#ץ`{1X;U!Wk_9$[ ۘh<ϖ~:W=kw >x:<<ɬ[E^=Kˤi,;9|(CxC 2]?V`^'yL%(#1㤓mewI0)ω_ȃ/aQ&La^6p)w&> ]Sm(Ӓndqsnm㯬3ςEoRZ!HA+:wT{کktq'z8݌?3\kyhܠ1 cS3 z(8 sEG-{'M;qL?H[E)ѳoUxN~k7F#Ic!Q}]Dr(ZBY( e;|[-W_v 1Ƀ %^;M :°C3LlJHWvӴM8t]4.*V L+d2\ShQa3[" m.\0O܌veh , Ŋi:ٜ2V,`QzƝ$oSi&+.Pn?_6.0X.ǥI㻥|{be6o4-Fl*ѷ[77yj};mfT|Eڣ \wJŌI(wF[ע* x3Jd;-@w oD}%_y'jkX%QTj*o܇8pYUbeԷE7:a1N STWz j%"mɂq}N}7d=GA7Ou:@fG"QvP]:o}Ů7-o3"DaH)(Y{')z^uT;%t 7g_vpp+uQzUf 羬)@IMg24'[( e,?kN,(BK%ֹM~|ɌXߔt1KYP%^H.h I|Xq '2^7Ii1fEulΤͪߎ4l2:8xA]@TҞ%][<&k%ӗM2`l49~|?)1'a׍&|@&v+/%KT=['Ic\Vu,ϿպUoGk7\Y* ξE6 4)InTW'zȷ2SyLUKS~ &0nVmCO;\~28F o ܀z]pSkmn;&u94[>5&Yc.؍u 16݂3SM,}#0ʹuvnXy7{ʑ|]+309Q٬ zz|6O)n\;7ʾ*8. ”(ZlQyCz`76>-& 2a̡8j[-j7~zBF$1lٿv|`Pun}3C|A^yx+(z,Wqa=֙n9+V]pW3 /ᤳX]}t64Z(ʲWlb[&KGҹ,;v`=R ˒h 2e fg33J jҥw'Kp [W./0-F]a\Z M4Pe A4CISl6X*-y٥<g 怇SEAeAO:q6lfA4 EI&+u{a'MyaZQqQ vFRk:MBkp_] >LqՊZ}/hwX.Nv`tkX=Z:%!˓Nfjs}˧`yAF7b/Q.IQhk4wX!eyG~epIլKÈj;lj{3 m]a{ni~ v3@dΟ#/^S/p83*hsnokX0^ޢoa kT|j>6J6Y3j3Wpӟj?ûm.Iwci7(eDN<۔97)R cvh2Գ,_^`X/˩(lɧ\&&pϕ2,^3"P9kaQ ̢,L{v;@͌aN`Eq-޸2DEݼK©tm r¸y6 3$ē9pe4~P j~+)섭Vi'd VZgTق$tՠP[媉a5wvʧDA`B+\vIGEv'4qZ"\4q udYj+nFuz;'hiHzL۰"?ڢv":q94 /zF3u.]ûs;7Uif\ϩ'/7IE)2o :rHijShOP?3V~~ԳFKޤF<+}Z=$0SBᴬ0ℏ!/v,H1mǴf_䤙.MDpGp5K{X4pzND$DX=VW:9mB ~ܖԍ.8OZ95\}C3uw p|+Ŝme|=ŝKSRy9suss:y6B2q࣠ZNWP[=wGcU}4ċ<#>PǀI2(ݨ)p<({=f 荲*UfPBok PBCU\y&x_B^TrUuA- DFEQېgzϱwg0% ,1 `ΤEYZY33={f￷Hxƒly] }~O_WnRe˖R$[v7]wˮ Z0_[SWF3Wڣ˝JTZ'+N=m^7*+ϬόʩVrQ'N+O+ gF*5ڪ5N)\VWo*\Rc}GM?09YܬJ=<[U&߿ڔojԮ>)C]hja(u?O(׋:RNYu: ٦ mQvsT?U#GQB5ދ/Rw২ u|>o7eh`{*x"lW _1PKmDM/9<7VY: ʖQ(;=6@Z8pC2<# [ Q=i\o+^-)CN{ByN-\jYʌ&#gA>U͌c߇: w(%Q6/%#ڍ#RJĚcn츌^ fRf>i]Yd2՘-BǸ*XA×*nB= )h:Y(5+5h*$jܧ<;AZ{GAeAMixE{\Pq% |-7OYn”h>!z i̘6SUzҭR*})Fxrf~XQc.ʝW)Gg%)UAn;yߐǤ_-ou%1v#2j%k)>)0SJ cPSz [2,Pp'>Qht^{}›~u+L^z N m@)1 }(7!sK2e-HsBlMOƪ[v۽Y\.Xl1~/[LwKJ_xv=y^i~`u(R'1ZQFzRvJayu0p?@0J|DRW(b$β< aH9.  DQ<=!eEENY3f<1l z 5CSy~ZtbE-X|eWuKxM +/}!$JɫK^MźӼ螖|Ne+c.>pQ$z/uX-B*{d-pϠ~ŗn& JHQ^uc&ڿEE/8&ť.ܛB}aL˝Sz]wpPg@.T@Msqm-,([PKX 5zQ1vbu)cBA/*(\uh"( ~yiSՈy#E5"߯_z 4Ni%-R.H3?jIkIdY&P,}znI]7M3S( jw+ wi3JH15ViՁf@R-(zdFh R ?JNP^b^B;Azz8YqlRrNTբ(q-0.S^Sq6MJ` j!C'\RZ>k {QbP^F~| ]PV]8.z^Cpΰ^A}^8[mCL(ɫ!ـ'Rִrg ߦve67EvU3IwH.Wi&ID"*AlȚ+*+epfU2ҤA2ߺ.وz%S,ca"W 6n|&UT~1ݨ UV]qNuR~- Uה}Y|> nXHȟX)7TnEr5"]L$85E719>w[1Pܿۤ%Ϣn3LM_li)$[4`sWe{ˀRm!a~RP%:Z/;UZRJ( _bu^ x^QLEgĥj.z\*W+^5<}? ߃1R4,~1.;mwXƜ9;Bajݠ[&ZMZ#F;Ε-bc Gl\݃G[ bZllPAS6[mUy Hvm-ReOi!n= r{%uR}I)6'җ5 ^5K"EfA}UX0,+Yd\#QPڅ {DļKfjL!9>-OكxBɨegF6P}ReDOKmd$Yd~]Sz.miG|b[O"o(_O>g$m {њ w`GV8R 풘~4EhtlMF͟hW_տ4AeHk2^Bz꟔K)*LjaXWr^/ Fha q^PԃSm;JjjVtF;Ɂ٪U׋@=8T2fԛ ?Hf&q5#T+@~1>IIP1i6F9y*xOh;Q7*ֳf65PC - b`b.O4NhhtեhV~cʹɬ*<,WO,O{AO6?,8D 0T 3gP,*ی$9uJ*h,Z0${pAbݖ6Wu{K g7JNɥl}R(fۻŷRb_PjܹH]weO }X$E$M$@TZe;衕l{my3ӡ;k1z9;#p+.{X;΀_1^GD)~ x u/_Er}\0Qq,"@_xu9g/q`^A2zwϔ8*H kze )r y8t}'. CJyNkUY=cUf9Mb:9d5zF뷂R䮩\/se>Q,-2ݟ㉘Alѻ \z\oL<Ԉ̏Xs6y^';_+_G/=_7!?ino-kI=AP vi6sM6~щ6W_VF/YJG-(w~pnN+Z^Aѹ$ji:0^)8!ꂁj}eYSsAű2rVzw݁QP9M0n-$@[<jzI߂˾I߇K_z9#>hLmK\8ߐg;%WewШ5ȫl/?V|)!K^J,/Xurq}/ԍx?*:)UDۅ%L @йCZ PDEu-_OK=;{./.E) nP^ןEX4O(y,χ%"Wmш%>:ϋl^|nz^ƍEv?A,CoD҂ YnRma{QwWg S[v=noҟ5JShmj6ͦ4fӏWzBa]-ΪKcf޶߮eo:wT6$ueUUKE |°]تVaTjSq$YW*0Ҳf{yAP*ʕV\KW4zyz ^8eωU| 0,Z}3> vzǕ̀HJm LK~Sp;DBoQ̖m xplPq܀REԥZ0څh(t}Y+79T_i^#9.Oාe- ʰHct"38ృQe${TZ:Ѣd+K-cQHflMb1 @nZPN n"ʼ,~iAF <i!׋8Oi_s|,xE۱mj52E4"1$JOBm ;q]i~9SRUGYU_XQF`Xa>z.^~0nq ̢.8*:x[QA)qm:,zZ JּGMjlh=]R>uN}WҨ)ZoO$GP6o7u@˾h|[ 3mٲn0OIsJ+t^*J{% ߋ2&!BSADbEYIv3vEC4~R.cҿ8|1B dQ /J(u+JhLzP64_E?GWƌ2Zup5N5C2*( Ej6ͦ4f+}B5j4 .V/\4l^5~0l΅!s-((?i_DLXU2r߷*qeY=K-4ZpͺoQf]ƪ<ǭ8z-N*׊4@_ï,xN_1% /Xryեd۱SUjGZ;]&㊦;MD~iLp.'*e\'hB@ #*{LKI:>eby*fʈ+GYND*G Ƙt0'=5 [֛w13QۛrEKS(<(H { C`4: G[ N/''nuE ?|OˑNiA};uc酑Xv]-ĻV~tbМ!Xl'3?,54[-BO +_P: Ś_'{YIPw%(bEC1-[{ lE/-Q7mj`L"A1o5]b`ǝa 7a "ԚtZtζk's.]CoJC=%]ŝ}]g4@ m]2_TdFǾvмHv׋}v=ae C_RʄGJF6x.an NrٞFTSV3˲$FFSr 81hXCS.nL.2:$qNLyaqdzqPku^.{CI Y_jK"w3Cy-۴V.z~Zp/3wZ8k$EWKP碉0\֋}N.nǰTn%ފXoFLsŰdʠCxO ЈKXB+c7޴zz>@5z9r. H¿IDƚR댵 N5" , x ,~; j?ﳮS(zT[K/.PC4|NGȎr8NK#%8@eĪ(UegRc*õ@<nob47n]?eQ6*)7ZW29zN|>%@2fY=6ƌ{Rr\73)wd|d/_r{^)t=rX+0hytȜd- `q?0%=2X{ 3Aj<}e#$8FCxnsT6]:U0c~3sUoCCG/-r:s;pL r&fJ6x5[N4^+%iSBFHWA ,U˄[r('Q&!0'iVxYEI-N\ 6uj *i#l4bԖ؏J~Rp7z { ("#S51ώPY3b5dfC4rn062Y+l:'簙$/ϕ"dHgɘ 9Q!!j5$-ͥtmrzzо"E,EuH=sn:ᢔ"dX,vX"|!_蓙,r~0emH(Ґ}x nbjwؽ CXgL\Ow )Q"9|5oXjy\~?jw\h:+yyV#pqP,X3b ܉67g)3:O02u RS,Ztw {[NpW1)-+7aޘNeGWZ'O@,=}޴f cŸ?٣lU;F1VNPdqnq~ 爬01r"nG}݃%ט1gѤ!w8C+Gq9nn4|<4c+jЛ;Txf,v^kzpECn<1qvuuGercS!^KX>Go‘>9kR8WMA6M針y ,԰Gr;eNKJxGm0VK`RvZTsmwڮQyPbHн44|[q)p'cX>%=HzRQsLʠ p\( c䎃W^X~t@MNb Ar5O+I%(9xѵK[jo_'UJU]¥~"QoiTsyx \>(Z^uA:G;AXよ&N ጄHS"^$$W[񖜐5x\vZOIP}9n\(Vڭt-zRƝb[13glMnB!>ۮOV/OKvA'~':t!ƅAhdRW~]* VE R;P.RP/W*^yA.C{PT)U۶ "u4YӤ]V Zt/IFBI S~hĴKG?Jig s+IH]K<[y5VӴZ3ORf5n3t^#MDX K)c&-'豑0@r2^cQZOo,ڈAf4,2ȬEQ"FFf#j2F6kk\Nܱ)avSjhmt \ L}ЧhX1314ҧnEHScs@S!I-+>/'2U%")9 yRoG&y/O~Ne;!W?`mYb IGL1q9H@_P}oaE5)t$k ݔk'HۭF!ja7,xw{: o:ɓg:#M7 .)=^pUs[c} XIfCΜrт^_ev`rj `ȧ_( sm&aPo⯎owa7yL\.߈KDFy3%q8=&sj݁`<\~A7JV@l0P%VЍDH;};ߛO#OQ@: Y'A@>hщO ߕ,]"ލkd~՚Zog]i|g?Q9?IQ쿑9M!nZCByWιgsCג*ޅ|Gx.3~E6* ?c߂돱:#>' p\o{0O_e̕Xs#S Ei6f N|r/Y꫖\,8j 2Y#zHJD,`qi&we3 l2yX. YH0Q\ |c9a$DIܨ򐒪n+TfhAMZj6z &˵oG>ؙ3z=hp)K,5W6 2 bI:J^ױМs!Bim<]Jm:"5g u{e-xJQ}vQr>D?]n`RTC[ڄfP SOsȕiYފkN@FB?.e/>!>/(}G^S0nl}М(7^9x>31[bZ(fȵk$.6A|JX/ xy1"O`h~P)9`m-gš 2g%sҧ)y[[7\i#LkF%cƃw?nzW8  TMOŔ3T˨;@_&> иC8_휵Au.Ŕs,9[һE;conVÔ Wgo(.rKu/jMW[k)&M? oFk3l܍zR)6-*XnZ 1?)??x@,4XzQۨRP4gj5j[ȌWĥe<=qq_hW@5ovR)s1790c ^@ p%Błj!Sx bHDsQ]j 6`pyX$1,_ӸT7^ڈ:J%Ѐ6Xc✴eOhgbևsǥ7-n:c^0Jz& ,ZiQ\Ӎ (\]#BJZ9"Mv6"iZH<.=}و6;*h}6ӻ,yٮ0(tuZ9n-'Ɛ9.i]¹OvXm7p-v  \E.o۝oQVsS"vx:qZaxд}C' ]iJG}e4K[㧥bC{rd6xr {zp~@Y19ǕvUDIR?I_?@G!E( [E6!.iisAǃ8yq#U5s9erMccJBzYGJ? :)lb` 31>=,[yxVeN-F)OȻ_ZFqN੡D]p ~_H>(b<$i*e,rޥn?Hjg|_b6)wY`rֻ1pD~flO k4b; PhtBuF?ܣOtm&!FO#^7,Es>YE~͋((ۈf.h+f;YCJf</oGT%d'=S(%b#*nR#_tGqH\k&ͫWb?""FKS9/ W#׮8a{KR-9a4v| V9^z4EX*.t!?pqE L_>ƯTb:##L|QuLmHL jFmH"h IgIE)(1j.ڿ0)i]:G-p-Q&;92HcB.eϞN4517_d9 ߜ݀zpF;p ę-#hhGo+e{tP/:k)I.M V5o:QXV۲G:8\Xm'2" DŖam]P&u~A$k=z-WrrsD,<7y`[w^?|n_SM[sSr]/ggN`͡Je_q=Ys3i(#;=VmIXJTQJ? h` Ta5fl8Xna# 櫮R2C`nTeNm`sI{SKA(*]QFaIjů% cf@1QJ$J풔10+k8TcXoFQD`f;#ڙX* m ڕ%qIŵ`9TXn6(Y+ K.NP*Qf0`S90FWuN˾GefsFauT Di AZmtɉ5K'_`Ëŗbέ3g#Sqo2{ ("l3Q*oѶi ""(?Tڂ: =Tòt1]M6.:1P3i(byXr=}8vVwWA=@'L D~G$D;RriNb-|X?wb}ZrW퓐LhW"<2xuŎmQ0F9G#^CqCfgoTůLNaVe]E4@ [2K׫dMΣ曤^X)/tj^a8acbា!6m-wƚqV7ƫHuP4y):\_WH/AlG .-y;m$U["UJ=U1XK{~l_m?kI\YQ` c^HˈK Dgl1Gmj{WrFU'@-q )_TśDzl̑:NZpZ"[t_'GvGEPX0Z̔}2 )s7;4^ǵ*Kq@W."-XǞ^1:7W JjgГnI#aY5JiDAXcJvH$wvO ơyxg* [=grڝX M?,As;K _ giYZj2q#-D;;A㔑u__z0.^=k=p}nj"6h`%\!qe`6K]:?&H(إ-W>%tv7E \GƜZRB:'5VFyS?Аed‘:o!dJWj QZ܎cΰV 9d8~_'cm~9~Д= =S9\w<`1gZ>zAN̽ӈե2_f@2-^< ZwYJA%HFKz4kIЩeG߶^=WGd/Gi:;AUR4d.6պ,fNŷDip0Ki+[V7Q6I(W4Z(@"OT?jvɎ$y66kٙeʹH qH-FʳD;IZqX%;5MVI>wI"i5|QkuTJZZ¿s< $7]OUn8 h9n^l2wٸDGDd8=fjrnrG5)ןŏqHm_m(G0E\ZUl3o$7[RvIWwy\=`Dmwv㓪ȞW Fv|0pgEX-PTuhӀop n1A']_OZ\;;k+i14>iMPȳPSypQq B#(UPErD\}jjUdk02cp|7)}Va%-g_y©zIϕ8CR[j+"` 3pp۶HPokjڪILV׀zxی;xڄTƬ t0Lр#CX 8MٔVZ|\C @|o1h--@L1YuUWp0$Gx8b:߫h aQ 0PKXGE([@|C5*1٠#*rհJcsQ,sT?"FIpg%!&t S&0lMM?6QfY#\<_"5Xwe/CaXKQ4!R!2.iPZUER SdU9yz$}P˰K 5%02x}HA簑ŀtg.\"4B#J&U[^ i4f[KލX+{imI])IґXuj&/ge Zegk=k,CwqI!TkJy,a:bh[k8&#o'kcR]l@ݲ .ωf5cUJ`HyOФu J6LS=O d>wj{~lrTŽXhGpV8_ ۛxOݢEɴ_8->fFK-Rt㷨rf-yca;؁^ۤ%0?l@9b9a/t1 یԳ搀%렫 XNQNU6l?_;퐨EJ+>]y\ K pՔ>J s4L1&Gn.us#VQf!fOSSOq+1vyZZG:3bHn=f,@cm=*x@zFͦNL@zlt닗-CRxAUݲ3ub~0(}b}3/ۍMsi?ch0]}ZrO|O:lFˡ/-bim;›wj)}ZF}x̦4flM~M߲W_3e TwH ơDvy9e4AP<aI3gZ#@9X:H_ /I%>7ȓF*1KFG FY݉1A覴YtH?cS0g"#ԧe2r}QUЯiߊ<)-k馺^-3:O(eUqik9F [-Ob~w ų҆Ngs?f/9W9W[ܠ,[ @:R?Zl`6jp8t`x.`u+y-I.凉@G 5&Gj-F}~Ro36!Dn DI:ꢟ3#1SC3F$ =fDvCnR>ǶWa2P< ~ .㻷;w)vo-F︢Lʪ-AˢZ kNҮb'o⊶+4ކ?U=סv3ĵv@Lwo22t*ObeԊ]sγ%oI)y[RWMKzvި&IWׅ׃Z6Y5Q 'Utt~u@e9"?-e"%3<_| gzJVɫr8-/#zU;@7t,\sYQm v_cǍX+glJNmhOA>=r&w[s=@sM wϨ?-cԇVby^1wqGŅ@~}p`#څA.2)rG|\%X;MڧeAXlJlMi68vtBC0}ypyk܃83>f@0mG3FbQfQ_##ё3㋣]wcv#MˍѳXcl(;Kvgã4zXljN6:.624V^̄qqf.]eio84Y4jEq8IبgIb_,&q+LI- p?NiZo e`6TO}MJ~ōz=[jPu8׈z6%h%?Eq{놱[P3iT[JPg4KBmVo<'R+F|x8qsmڶWkq8;2˳FׅIUHס[az]#LuctFv z)_cı}'nJqlb70q gՖ jjd=vm=m[sRAա&fwS<:xӼjW/8JMc^ZjۻPaf5:WxY^Юejb{xNl"nc->HR!B/vqVލ6p ,~ΐNCA]vjM=C:Th9W-'JXR;u_} wk_r}z_T~ V4~|2m*\Sl[oGS̸Pz'z`e 0k_FW2Gkۭj}s5b(ӣzqjecl^0?cQ꯸}A=G]l ^hv9vB Ϡ9w.k*tGE,`S2 s)ytTAùqMmMyѿG2]hs>gxg8 76{rN/po#~b 2n;pa6K?,s>U>YP~Zʹ-+w"o !6}Vz$JۤaZU2cv=SFFCV +3#o=mS(Gk?6_ڄ.!l8{#s%#g4me3cËO/=8(Radj _Zqz*)N`WK89-Wj80.GI"$Z}/E% qBI-JQ:tf>`#󒴆Q ,Y#`(0aEU' aV-G@a)SrZ<݄9TܨV؏T&uƂ'iZKZdY3Yı_Ѓg, lrȺm+׭ްrJa 5x_":,}\ H~ҠY;%D`pn/(+.#( z^c^Y>z^X]NԳ mJm!h *fmX|*K&Enk?E2J_nLjGÁ%=@eؿ64'Œwc~E9åsuO= 4S9nFM}V Lق+tvӨ>y@NTlSN~3ل9jOs L'@'IK|;8'P{?|!>6L{*1!ΟeQΒ3cdl͍"h:GUH"q%YhVr~K +%y^)/FBOLZ ZƚPGj)-O;ݤ= 6&޸vM+V^qCdie$@B2pU9,J%7*%ύJS`,a]$%a5C\Nk"D D3 W?GF^i4X=Fwu`1ZX-دwJ$f5zo]f~ u^*6L$,;f<ZYzeaºתL\9 yRW)z{AVVY<\ - /sh}7[گdu[ E˭Iu"&Şu:>k2>_(4҆Ryzr P; &#ǰ7VXlQCe@w܅:H/;>N}УKl?_ /JPz,U Dw'4xϓ_@zDd)-t#dz7ozk[iUQ<vrl|Xzf.5KZc|9G<:tD5PF G1|sq\ GYX/W*!eF0G-zk4li8եPoIW1NʕQ,$j@۾m\׎ST-j8ղY *Qe Y> 8IwJf dz=BJր,2Z|ǁ%MPnQ亹b?^\ lw{9wskTT/EQyHStqPRQRPsZ-vV9:W)^Z#[Y`A9Ti>427ZZ9k$Z\6 n7 bҘS=,}2VK#*[i5K֋zjqJT1"cr6=Ad|2UrMjTzD m:Ҿ6P+j:]ѷoWQ^6($t~ΨC$vb\ +Ӄ=L^i Œ(X-TsII(9!rirQMAEB_̛H gЊř{-;{H޴gO[F \-RZJ?Ox~k+WtYnj]{)^kcRBwJEQB\ujIMU5 >ZkIr|o8k$E^ov :g?E=FqyF\q-i!bMIc/ߧĤ{\'<Jzȯc DR)δЇ (:^Mϐ*-l/ g+bFUЪ =pF_w9" [(TFE~#Ki)iAUA{m[7b]rVZ*uE{NHcxlNgʋوDgq|,-Δr8sFy<|6Ύdc?N'\{Ptǝe!IFq{،QV(J\}hQqR誛 qӸ>44X-h{ V4C3ˢLF}88JI0 +F:LmiT@m9ˆkiU*~=Ӳ\VӒWrDk0V2@Z yvj욍k.ڨU)p({ł} CҨuMhGfMo~ͼ8Mm6.O: 4h|׌N-P3EKZK{6.] gw◱tb :)ДuRiH+madLձ"?x)KzK("ˡ؋l?Kb􊧄hJfg{AftShq֠w12z,NEۓnyO˼};d 3k"jPӄ;E"}~c)C^yS1)$Ozq;ZQ?@}2V~)lTRu]o(ժޖ'V{K> <[}ڊQSc'Z׊ x9j{d-N?zT䑀OjlD/+ ?,%ocЏcZkMhOF& #jKi)-Vh0jk-m{kn\ xZG<~*X g1DaX" ϥA,b=j%0[<"KRFTP,AE!=]$%(N3;$'0A@(ZP.HbqbI&jGQf${ćV:c ͵{Ka%\ߧm Zl;@s[bSZҭ]yMA_|/ڽXz)ܚoӦd%`4QZȴ;T zV ^كRk21c7FL+GJ|iB B 2kG_v7$^3<(f)уuAE~$R tV|,JLqD^D+d7vM@HeҖADX9a}<=ȶA~%:mb=D/MӁVyzFѼҫ4s`$Oɫit/x%=EĎTZܫRBV !j3©Hb{Q79#ƻAS8&Gd)u#99F.5(H?4Ezl_4R뭘+0Y\b +D`#3Nu={8;0bﻹ}e7^`Df4nT_G{_$݂zգSgM] =\m#;䧳RfZismw֮ר/鷷߱f{+ xN;IAm %IE}c`f֯_T6of;u2Fe[q'c*1RR/ВDUqU>}}Q -ܭ"Lz_bi|܃|+٫Z>kGj)-SeZ^K~h׬VSWJ,tQW,EA6D$ݘD~vq&`J>"A"(^D6w4jժdG6狫Ka9+((~ 7&iQ@r@z Q_ Wo~_j1TT,U[kmc' jg@Qy^%Z:@rM++k"r2FKUd{st]Y2Oa?ogZnҒOb{A}iY.8FG+@Kcsv*34Hуv)뢏RZZ&~\Yɣ.׽>,G;#J/3z^%2cPZpnխJG-!kJE{ %UJh9L=hIJ&QOjVZꦥ2 -wyS _5I!Ժ˘5M#q<Λ53{CO闃V6V@G9n!s7#jf͙SmB yokx~ 9Q,|Z0!1~I;MXOEᑄy&]_hIlv㳪HF7>Ő5^=0CJ1h{.kk8.~v52O\N%Ouh`?D$)Ò=0Kqa͏jUq9.^ETZ\*^T-9ZͶ(ˁ?P{vm B`@N棈^%u&- @.qU(cȗ?Q\jq0/ߚC{Q"t\Dx3A&6"I< -\[Oi4=ߟB\-}ߗEr%v:I̙z$ZM ri8h$˯ĒkNcPžk|xuVMF{iJdEl7gO-tW)qURҤii\ bZL?u:I=tNc6n:o2Cޭ&3@)׉%c\XkuwR([(`FDpgU谝e,A_:.žMoS狸&Uڃ6OЍ^oC$;w|8mQdwhH']q:C+n>+-1|Z).AZ-kHZa^-QxԌm2@[3YE%Ώ|XGI!|LOHYMm'e:m%:5{T 7K:JFO+H7SN F:m*e@4Vv/O5Vjٛ hT[ jYDb }`)%H gzh8gܼ|Y%.j~2T$H^Klג!v*9w,mvso]>.13 UG$sw4a,0eO)->oTEQm!S&xCh@vk9ڵ]A1Yic_CcϠFp/gռ .EJE uqL̘x7Aޡ`8nڑr' j9E>V%2'zUْ(E-1$ZcZ ?|w{ՔW/O_04tz@+^ [%[Z=Tƽґ^ߵkHV? D W\D*_e! JL1K%Q Hl(JjP'^4, B4e>d"8nm"d*Ӣ9W J'MX2:8kjcJA^t(R)%wbGJ#}A3CɊzru~Z繕+FuPMieY!1- #KgiDM#s5hkv:<_$qT3mřj~G$s-1X367%rGogKjJdd~~znJc"1s5O/_3#U>sw")k|Tk&s|/QI*VJOvEu |1,F1$֎}1y+g0z+]w/]h6]ތx?lrH?O ?+lW|ފ!v<Ҩ+uLY,PtbnzDt}bC^v>oLA ^@p}|-Wse5E 4߃ 5J2f'9U6A_ͦsPe|/>OnnmBC%}k\u޹}`"]A)2w"ov `P|H" xoJ-Wʼn+䒝rXO$$RdYrRNJʩJswI ,%9l/ΝݧO{w9x$Nr+ ?:7zǖ֬XMS.+)|3g#BPQάŅB>4 kad8kYٳg/Խ YU_ʇ-Ӫ{pvvlNyaمB7ùyv̙pc *B,f5B? =>5ŝxQ^eb#c~꠱XϲF~&iKz!yey8g_-< $ 4r9$K3i-OR_Z@ eAoRveR9hEgD_hc8Ƶ9hwI@,N;QjRx^vAk(:Vi&qu\C {ɌEapׂː uSRFJZᶛ"H8>Zz [ 5ʧwh*]IoJ&h DM່޻2Olɋ+fZA*AƄ^OV1+xT>+SN-aMg^$"hܪ2g)j\;INTK͘$RUc̹cf!yn9:t8NEO%YEz\nmFqҝ~x.ү#<| dnC1u'(K~@F(ΪxdQ@ 1{`0vObdRAHsQH >0dnMuW~kۥ$]c'K d|Bf!=͡?M(WO5WQp[d ˓H?B16/@!CRMJZI#5=v-u`ӆu8]G YߟPߥֿa@͑F72XpbnƐY?cVXtCi8U EEﰊ8)}/{V p .\s:,(Z+$L$D%(Q%m2}@0qӱ<Ԁk(HYRJ1m0 C@k {8q0&EB+Y1Ʒ lGrjw`5&l1ߛ_ 5m/@zxo75a}tPZi$qNj0]p$WBhwvne?qh$Ir8){&ΙHY:Gg.G_A%]b!Zo@ԥ_û3SDO39$ ^%%諊H+XkH~I>|(pP+镠wBI4GsbM#yJ rAxmnZ[v`pjc<]pńn 5=pIz~V8\}= Ci)-UrJG@z1 n)ɭ~<WՔ"Be]c*ub,٬RZnc"}F6+F;qmی̇0P:2cQM-%+h׉9Bq`B]z} ,-jo(]P/Q Ub$cndt|-U ɭ(\$_ƻ cpq}Cۀ^ +i%M}ٲwm 7f=}#<~&f/q vőlQ̳ ae:[ЂY7qhB>4d6G^Pf5 C?. 5Μi Y9F9!%쑲z.9q!`yl+Zqx3 cr8W&A$Q˲0 ? J0 Sl@ 㠢eQߩQ;UB ɶ%y'i*eXA$n YdY8{1Sͪ fqX^7eT8u8՝$Ng(.[`7Q="" L\&IZFLJlyQ3=PBqe-V8]l^f WήmbT)r˦vKv2fĹy;;](u;@!V36U9ʘ$-GQwNho/ЫB9i>ךx`(B;fA1qMRb\Sn D VN;r ӯV_CEf-<J"9q]{*{Ez 8T cE`:2;AumOX~xv-l3 ˯"iM,;~AMҹ2F8A#1Ut n15CqfGoEDK&h?+Йm_cBa}QK0O[t}& YҰ K{p ~vZWlooӭOy;2;%Z|;mMtj)!=? a`o>lfhm7l|.vEۊqU؄W,]%Jz<ˣ4%gYJ%.U`;,M#Xt8:y8n/Uv.rㄠۦle4LA$B{Cr3^mHṶT#;'=n{{{5_V.ެ{kxukqkf)Opz5h-ٻ__- 3?׸$4'oX71ep`b˚MjGmZJՌmmzVB9 m%7&Ě!XI@>#kjJ'e-+ǖ9&YuۡӺ3*r̋rNɯ4/P6f/c2+T)_wf;%Kvp_G7m@7,VOz2z&[ad0n=?ZT(N%P@ʘ)z*h>v|>(jJZIX]O2?w_vԵk7mWR1#8~WMܠH\v̫/ͲjT0N-UB/E2;]t.u]'r#/RzQ(LmZh.!PXa9H<{JE/ u /);E^S-qѪeڡ>TJAA^0%ڱgqq5 aemNf ~Qeq|\F)iVyzTqرƵ78PPr%< UjIV[[wRJ/K2Qqdih6Y(Hp Zaك37!÷`ŸMVd͢xP JyxC ڊ?Vu~Ib̑ {3%/N'|FV1vB9yHGsy(I9\< ) |q rXʅ=RxB+Ί~҇iT+V>R%jcv.lrUwIqYbٵۏ޶JŸZ5Jro0;AРzA@jEVH4A{e~y<5lj6Ѻhw3/ I2{KLjso?]c}}h7Zybcd 8btլ_k>hC9~]ZRvPc0Nh%VJI+{=f7] n~``pFBڍ]6}C'n_Oh-ضU$H(ж^e[]/,ˉWuUY,p<_ ؖfWńl;Ǽka䘎߮cg /Cqz~l9N5IӐ~=edP'>4v\[5'eNDa`vɍS~5aOh5N7d+v+Q?y·7k;Î+ز:$o+)_wvhؓFR* ΘuФpӂރqM, nw^$/;3+1$ukIll87a_EQ<*SE1}ϰexQq+8һ>쓞JܣMYؗyH ml`nxNDY;N2%Q^cGJmhn[GZQsQzER}~f#ĥ,C4='MOF8ʟOll61 ο0#jQm9}ؠ*F/'ަu!El׀%oW̸,xSlZ $*2uzXb/Ar?V /oY}ZdCH"KU1وdsw7~`فౕ*Fbv6WljlNk kZм @?GJZI+i%㤻?RrXKu K@ANӦb7U/5C:nT S5E/`ɖW8='2#EHA@ݲC*~p}@qR|_{[ #z!AwˈO-KIX`+j6$Q)Y= 9!Ny|@ON BdӲ\{TsE;0:Cv'{L׿GQv/[RRW6kq悖?sv1Ϭ9^akw6IQ_ᔗE;d(;uV {)~ -4*dȑ<;%MF;F EBU={7Y RDu>[M*,״3IYω|="a_VJYjӧ*{nXT?hV I'ﺼqYƎS˴?`_R&~WNΏHIQP YJbuW ޛ(3;H(rEnpXhQ[vgh+];?zܸxtu_l" -xVM&Dq:&kJj E!AM/Od^ adaQe]K92ǵ砧{̭0QR(:Z%ǃx@%?Tu9_SBKŢ.w0y@*VhyXZڐ]("_#2 :ӲiIއju"eOS>{nֻp oPyk--m7m҃ioTEFIuQ$L5ZI+i%¥ F0\~lBC\w\y'x_uFWՍDJLPl`H"FF@R%lZgx7΍MǦ&}Cbb嵉ĹZvmrz{]~sDnON:;йd{=45vsSv}nk"sc6ڭsvO^S+jթ5j#|ĿfqgIyY$UYmG](N z2%_QeUM$p\v˾&;nbWlͤMTʠxoղ&SwfC +nEyIh1\Iȍ*U۵$4t +N¿ӦAԜzI*zMJΧ:O'QO m+vKmwj(Bˤv[Tԍ{MkJSEZex~֚Sjܺ]j݃$QWJ Iߦ^Mc~tt+O5-ۻBԗoگ8[#KFRMuj2Y4_ķ͠|/A=CU[}^mW1׸ wSzvdqN}fN :2)1X԰ăRwx"߭X }z#Л톞^̋RG_/SR3W~OK'u ia5]gp|^D#]XzU*<9{{Q`;z}xLV^cvf|G}7H} *R?O*X-7+׬`zukTl1ElW<77'v'jo|`hc'bj2ۓ7T{j|Qv>[vP{l2M=;9U;v19k ,܈:O'j5??Wj箱]7q$Zn 02%˳,EV,L8+$Ŀ$iᆃK@m(Cȋ". 5I4*eY^il$kznNx;1bRirz~Q$(w^*P"Zy 2l8ϊ|,>:$$jLb[EZY HȓX6*p%mcR|02h+odigHV"vd 86X]3MqNTrS'K+1 3]zȑI*J» ygK:')D{%߬`6d̼∺!Q#G;Yb'][Y=fE ^2薸cX[<0d@A|e P15r)E2'W_QJ)ҏKrK;%t &c:p x=02.(}PFXJXWԢJ&82%V]zԳ33:g 9EDM [CI2{.5stqϣYI)J,%lR o-ɰ Y׻XjAZ, 5 H_@*@U6dY)19Q!7[x^BO1?(kd(؎9gd /`8>wml|W>o$cO"6y?^n5tA(G`.Өw%?`_pى|WkLO(;2tL>t{Nc?!3W$ys?$[A 2 2vAh}Hfe/V&Բ_p'fRNg+&Y wHςd|PnW+_uݏvn19Bq1;e**t?< !>kɷҪ,j#؇'&{Oc\ w`P1' N}q|Wj=q1OSZ!^?'] 8Ӝ8Q<(O?+/k#c(0, @S¾V_E8˲f Pj&Ag5'@M#/ 4B5IRjKMjQ&^dAA8hV*4 Cm 8Wd"-7u0jρk6xP[@@fIX 0Zm#GsFyFhQ9ƾU$qaşjv+`J7`/\[U3#:Q=E/@ B<$2. a/mF}cǻ/K %iRNH5AcBٱ mVA{Qzʓ eRÀ|!%q,X^5PfFCxT Y!WQ7,Y꫊ޔPsraiQ쬰fe(4Y0jfq`;Ѡ3sE $ރf)2є%~W#Nnd>-WsBe~z9=B%gbtյK PΣwZ0y4s,o?h>JTv@Zz45xV(-݆9lkè{}wbrUwX5mncnhx@= g1)6B\>}1OwP~iizZNXl}6 \=pxٙ}O-2^3d&O }Y/`$4@>5UEXN!z>)6OQoZsRa8*D ڽS/4} 9OmVXnzR]S:)`4n@? 'ݟR]ɹn"~;Ի1gORZJoUR*U\{cغrZ{z U BG BCAk|Ek4wJ&V+Jk^h&qQ܀Q]^sBܡ4fMQ@4Ҍ/R/M |0bx$xGHec4DC@,)ҜR`F;) ^* dEI<6@TQN+iP& PfXn:h)y5v:@Z}\~ݛbOL{Ψb".YD&Oh ,^D EqH]m܈x^2&WZnN/<14O!7~<Ck7nOhCYV4DU_VO hZxE]>KLЯE2D(V~UG1F 9hFZ8#6WO~$NГw ݁ Eu(X%٪4Չ9x#ȿϢUk&;1֖A+F_Dn~Y=%A[e6 5Z\L$9]y?$ NarV'3r t6^Wslcy'Q2B2>IFT]c-YgAO_O0Ϝ.3f-LNY\ֈ_ĝ6}8"rTnh@t҈ܽM6(Lf[%8t/5UGKiWhZcMߓ"DY.sw2HCR1jYГCƤ3G3J-h1U@Kd{R`܍+6N,D}wKE1$\F-;!0{e7ouM0-Gb>OQ1(-;+V&bg uPOfF?ǽg2RZJ(26G+Ȕs_~07 -&s⡚:ع?Q ')c:?t(&A8)dʲX0$FIuC\$m&YLyIȕFYSQNL)2R# 0WR)"N(NZn46J^W Pga4L@i 8zi֛[s@W껮Swfz6nݏ8 }3/ 7̆$^n#F(MW|aWʯ}kW رq9;Xi,^$C޷#n`Lth&!MJg?I= {? %[Q@ㆡjh: X?-Ow-#kpiQjN`Xkއ(GG&wԈا=Yn/deaj'&ænC9FHL5%"ܣruz(,&}ݪ*4(|Z"j"B.@Dkx ^{қB[~u9U^*5W9TM+ 2H.jM AN8#Birta,("d\af}2'L-sm+|J)RZJiĎ+.7;[=.kd'ss:ηdl~n 5/*ȩVKl du;("ʳΐPdMQ9h4u/E~jI\l 6hnccY;6!+ڭ֊\ lEݦgKzҦi@;kh d;h~dy['Tz,\*ZʓCc#؅՞1ȁ*[q2)ԥ)jAD J}U>r!_x;?j3 5:m)xtX0#.7ﱘtʧY2WQ:ׁNgĞE뾃Rri&7XaZBq#;393U2h8@p<,5b+)SDLC R\jk9YZG9(#י e9/ 3fMZ*j,pFZdPm_(2P4h[Hf:i2J;%wG=J;hX L{E1"*ؿg[TBNZj+B} nۅ/HY~'E<Ҵ#?w\c܌m(jQ^0qu _ǕER3t܊/e6T+ (zm@y4<8 `ˌS`5VD8G~~S!M%92z\۰|cwϞBk b$̟[hbc{E4y@%"ۛaAEg^Sz.yZRY䚒]X 爙+\,4Ƣ~˔(Q` jI/EʵAl^;g> e'2sl= Jf^Vq\c Ooߊ[ E߃k§&|֬{]<دb٥Jf+ߟAV'@LL]ڵu%ʶНmȀ(oLx1 #`M 㺔[O <=57_FU&7f@eʋ4K :AiDTj8+"mI7Ă&S .'jQlJK䡈( c1Hzo5FTJ=A\)מTI&[;%a&eǣdfy8IzI:[<}ǯnG$_Iȩ 8\uՆ`]v"1 xz,C|w{TWG9k0A6E2;)mInw|w1ݳh@j,L\~:lԲCL6*p྇yR`?jl5\j#?!6EcR&c=#"T.m؍6Z#f'_9jDcĜ~=,w[}${35:64yVMi4A#?,,a4O٪V2uHubf]5E&3>-df4fj5E2Rq\ZwbtO_yS6k=re)YTaN[=X\-a%pPy\{R^cյ = >&H mUK *: %cˊ*lF^M^FNX.oq> t2Xgj1DU;{]߇F r=hG"楮~] R_+c5$oZ &[o|j @~}?*zqhT5g0bj1U6Eiq12~:XFANXs.NqԤd7èkS9n}NsݓW\ôw]y~ViU}tz/~&AdvdN890~ONSBIߗcbZEDnp\ zh^p݆jQ/u^Љ-`/- -\P }K ١u-3ЁP21D;,^Q?UO ;@%_i9ܹYdJurEy$z?,w'F:GkƥOTP;O=""5BFNP1gD2: #ʧ:$tG +QG!a޿WـjJnƴFb_Qt{EUNg*ww؎"Mv◹[ߛQѯJ 93dT![Чe#|?zE:zS"mԅ:Q>yЊfb#e ~!$"脜nblOj^u {Pƈɕ4l"[ *.k툌fYQLs葅;%a2y- >r=4yfsu;8F@/+qPTT^PZJKi)-7Ok$(ko\f( fߏ ^z㼷k +ոb!fp\@;X$ v&Т9ih(&q9Z(tjQ(n\'̀hk'YeĠTfEew S7P0Fv%~E c;n2uQ,.DQ3ڠS /ڮ҂nFКSsIV^0lx@Wj]*34JZ #M鈍ϣVHl2ymݧ'5jLq*bBQsLW^HuU+׽u/ӪؘT Kik /j %:*LJ"IHacu; FyJۥ.hsR}c}8 sU Led2;}2,C̳3rk'?l뤱"esL+8kqFQO=vw +R\2mj o+ ۸[F?sZ8Ob\(m9ƒNϡ~L9b́%Gϔ+W_k:nuus긠mύY'_xjJJG,a$~E;N~5=-7-25Ѕ'wJd:E hOKZgUǺX;uq+!%h-Ռ[QYS5&>lgqlߍr/,N]JKJ6pJW;x5k%| S wH{-G(Ҽc|y'u#3"ЏJY#^l@j'^eZzqPGk\)w(*%H 1xSEWܨh ñމqe"s1ӣ-օi }RVmuVO+V^5q alJ3yuK[e^K@B#gȝ/88"K#*} )+|ħx#w{=M'ЯԀyO_ᮙG)u}^1P9~zZJK_.C \tUk_=j>5A=7.`>e~:CI`Ap8A9yhM'8/Z#D<8( BHǑyzDA*.m7H#e Oq=?4qmp#^9O&I[v^yzh^qa(u<;偎NЭjm~!#iVmT"}rõ[W|ShHА&zK h.,.5ꄵ8`FxlN`~'_)ϔ;,F)&xxaŒoсQyո+P3~1a)@KhLmOiGEۃ,MUYIQۭ.aM.{jAhڃq$KDnv 錴&'kMMPL0K{zXPz^@y|'<8h$m:/#lW⬣IGd]TrPYDL9 h~FfGvL(g)Iģ^zCy@ rNrq/6 X ު6bƿK10qi:\(yYj\1Wtj.]1,7r4l;rQޭ~Y SJ23qZHŵ& m7*  Tæ= T}DŊJGszPJ<&p젼jU>%m31s&gv,%>P!bT+xX?\G=OqݮTjq۰RiMm Ah8NhXׯg+sya&Ǧu{|vΟ8OkE=??VzjcE{ƍc'ܯO{ߨ8FJ%JS|w+J ;JRC?L"/@ٍ ]rZ,Ɖ"w&UVn7 M mڑmꎛخGdm)`40 0Zq;6=]g%OLc*y\uh41Uﴦ,xT5OT я#܄T;eɄzSc |gh^OCpTm7 <,\Q!ke8q+9(젺ܥcS@LD5 4;Qx Q(INsx6p;D!e,K(6Ri[8@1k(Z-fPi62Ӌv{_&EWK+Cr| ~%[utQ_1MGR9^])U hEQk}>u=FvL)^dWEK#ݘ"5${%]m>fN5q Qո52DCd3Haar :xNL;>>rvPPM]S:Ǖ]e2:fL-}X FNbKѳ2]SxBDҫOxhs'#SCa)m^wU3Y5"}o0) ۰NJj{D@5EE$!AGu PSM0#2+\_l8#Q=8N0&fܪH Pl}z<+eYe|vɜ~Xz-WO%ǨЍI+>^E-= fΘs&S=G&>[gnXJ_f,m8>DT#{Nꪛ֑ºMZyZ|rRcڥ~zӅK:7V_z`XOv;ci1-q4>Stuѹ,IFIcRi@FOQB\ M+ie55c3cX&{<CNfra<i&C ckxINemƕ%&2ZN@,[ujf<YF͊[vVp"'yv֪?lWyJu%lagADaIVBn]_p\omRbvJȦ| |iUYA C%n+JlUۯVOXM1l0v< FK7:tnQaė:+\{-)w1G\ixs5#hDV3V{M}-1AQP+zVDJ"dڡG OUF*嘺#KN\;}HlvKVU6iӃ9T¶ oOr.w4mwKcYuR7QʧD8"sT}R[_*(.61'Oo*1 졞pmb,u$<,w9eоNac}7K_/>~Oh QgM,#bs-cʾaOF_a9 Z(Շ8NMT?2/Hy#'JצҌ۫cQIW**m7b13Μ@#qkqߥRzo V1 ka} u"ԎYR$;@RI|8A@/4C/-cũT˱Iݲ[Y AID%PcJ%;g8iYD a CgBjMDĴ㢍8IȠEMAR&U׵Ze8r Z~h6$:F>Op yL`wQk"s[Yz锞i\Ҡ^Q/q/Dz649mFn]N၊<\v̚I.Ǩ;)kp?Xrj( 6(C+h`5uj͛ZR I_R z&̓ ;~ܻQ]r><R"G]ii1! g9{ JKKhi^]zH0;r"G].bMnMCb hogQpz-eϳcʘK]/-sLysR! %iAo2q2w1،zߜ$ 3 %w <4d_1eMM9mQfWBy#h 8pԽ_F#>GQ:Д67yDzqYG!hn #R&2NU$;dn> eIQEu3"F#<Edg1;Mj*rʛP;<OpqIIgVb†c9>,joX1oQ{8v|_I;@FEeX#!F_pyn ك[N`!cܡ^Q5-tަյjY'a4GϴߒC,/A1Qɓ8VmH[A.18.oQO{PwTEnhsam XыԈ|=>wuO-?{[:oDfo\sW҇olhA?&&6ir =ӣȔz? ie -?Z@eH<]<9 OI}׉(bϫ94R(X_Qhw&)]Ъ<[Dlmԓ8(X/LIp)oYJgr.W[~k 0KiZЕ A<]O344$rʨJt>* Mz0yxp(OxbSڢ̘Ѣ0lPLT\i :qHJe( ~÷O>A4A!1A# c.{MT-hZJ~"v3Eϯ3\f{ypbv(rGǷPŅ([bB-#…(iyuX>O9R?I%c]oVQJ\.!)8#5Yigx"t>1#nVunB5[$l9G~]껋~y)9iY,ftuzky~3Rǁ{fbC^EmƔ[Pİ3&S[ܡd ! mSK7(S=2R_sH,ô1uσV:ٔM_?^{sϰF 35bN?HРybˆ)G.9_^;;1xK.eFyu.³ H9l'!^^{Uu%տ42n(/W7D;N9f`I.iflnDk0@!Arw,6yaǞO|$[z#oP3@sQhS=sy .l G鳬J$?kԻ:T E3.yꉎ@!}ErdYge/SÂ<̌"|1~Ľ{:~Y6ɘkj)-AkMwʛ yᆫ֩XU2??IVG0nOM * J`,o@X>h66 GbW=verr(}䱝#ȟeXF ;FJ| 4T,&O\OߋӨF1F(ukn}ɣfP+VAy4IPJ# t4S/,!2g+*Ѻ[֢(6 zIb9_D$Li@n@+Gm;:@&IAG p\MUke6LOXM#w>p9=bV]4Ч4|tx2jSlGüz"aZ($leuNX LG\O7vx5p4XOAwQ9 m-H`4)}@dv@_~)GI%ae;’U%=2}<^1 UnI5K@/,NIʼn42#1`}r./Pc?)?U4+}I81[얙9~,yFeG:BH@6l[LM{jU1x@ڔcH(!Ek(K0A7kΕU#c *3h!,u7[qPg0hٷ.zxiRL)z32⵫}>fcTRvl wuM rn ;11"n=ek2,?RA[Є,Gi17ch!Ҿ~ᮯ:`F@+-&~BrnCj6` B'_J~<;>#.S}M> <7Ir<CnFhƤ!G{k> ЖbZN YFB]Gmţ(k{>ͦa ͎IF37de7VKi)$Nan ! }uMD̑E-ublbk z|M&ENLđ;,E[GQ!2![˴(dM9%mxN(Fy&1ɉ&B['q=;' MV> ܼ '1eKR)̒ ث8\MJ0)(E,@Cܬ@:Pt} Y`PN;b} HZu+u@V|1,t+7lX3u՛v[cKrՃ.@GPALzKsRFީz]H#DM".<Dx!E'15UDoR[^$fĞMﴨFnVS^%nW dh"܌T㳝"J/yF$TyjԺEJ=^2#bD:(.LQ f1Kb,V.ᑇE=GZV ڟʷ9Ӌ-:/eJJǻ/ȏ~hd9-f|JhN3cVCuIf8ppxZieFi1Ϙ-^3ؒ >.W5Ϫ OWNal2N˼@}j"jL,R2y+t$iqdJ*S5~dTelF|Nb{qW`s8.-nbyMY[J>1H5eI'#>rC0'A|%LC;M~샎ÔJ\8&=PzHd;@ Vq"u[}s^JP3~쩿j/՘+8Ӡ8U9Rzүly1.8H\GZNe?0cZڞ&?M!fX17ƔŊݎ[1ݷ аɨ5\fVd#"sGv Uf@N\j͠E<#ݣ% *R9WƠEXL*]++N+xjR+WY@Q tL<COJLmEG"=U1jiJ,MtfD|vmaN7uSwzF(vŞZ֚ͲꔉZտe)T-䳌cW(~.z5ƎAr|V-`=%W^2'{w =%lwV@˗; t9#TX~}-ڢR[>Ψk0wT"lxjG$5MCgKߴ՝]c(q [O[YǤ^dž~Qj&lymviwM㢏&zxeYnjg0Е>jPh:5 (ΐۥfY[job,a@x_ I[vZ݂^U__ǼJb9>IuEXsʢ0zFq+ "!rzՂ`un`}^`֯~2@_WY\Dīaެu?V#`Ǧ T uRW`+K<̴U"DYrhA_Zl5!pd>Ǩ3`f2ƕT<$kdϨKF+j@^-rWןK'W:{x\OPVϬ2zE?y: \ :8A#'0~{ѾMQ eI[承]$,l` *FRLR7hݸн=OE/ےa)-Pڛu~qx@UDJx&9ڜ ???5yM\hy;E(gu|x.s_%@Hl%Ĩ)5I[3j~Q[xt5 bBl+T%r`(>5=`פXɊ|$𽜮St,f8ԺGnqzA7jR?[N/@eyV(z &v6&bqD" 4=Xa͡qA"r0pje; 4)bDZ]8rzo>qꃵ(IZ:,f*6]Ru'"zA0@7CO+ `E9Z+J5"x5-b ˀ6}z:B6YM6@Kj(3iIYnMKr;F<>M;TDZgXqHڞ@;O )<}qFrsOX}u+Av^6Aǔ, otg?.;)'+([BZ͑/-鄏..9ɭ/a`gڪ23\ݭ:ilx@QC_/VoXM ed%2V ҇D_oĕeCR3zPJoz1=JD˼,^Y8.#-'I}~Yᤞ˾ZS+-uN8(Q\|"^=Y''Ԑ>!^hrbnxImf(MOHS>|{B>- pCyH6@%cK" Zֶ2wil zAB' zU"%^Sٯx+*z(7t?]pDӴȗ-&S߲gBk_6svbQxV~T[2 LVmJ}5W2"* C[ %`M$7z s<z<!Z*]wuZŎӨ~wۮ:N27{L\Ø\hU鯄ahnıS맟ó++fzF0MfD($~SV/]+WoXk2EIx2 Y-{ļC2֌P6˜ nr'0RGC2`!=zEQ}9t=(C#,ں"J(-Ji:~&77_j}hu5j+뫭@v,ۘK y4li쐴 ئaf}`W ̲G@RZJKi)---7rī/9}o,G\v `UWV3 %ۇb7m&4@dp0/.Zk3nI.A=䑔Tf,s>2x2L$Xզc= Jː(L2tꍚu <7B9u|OJ =i(q nQIR I3pd1}{bj3%:z~24Od( Fc?Ot[KY^s@iWt(bWpmjT+h0uK`LW86[Q= VYGMiORJK^ökg.p}EyHe:DivGyÐ')T( o졷a-Ց:pL;THN,LE/C"gQܛ+%7 LPL쒚~ϴdc`DҳOV= PA3*QRR5M12)ЊW-/cm*\J>g#ǀs|X$0Z~QŶՓSnj\27pȀNm;H4$[,E ~̯ⵋ3yNm;#.`}DҷД-]HϔQ_AiJ%IRëJ?EXm)56aŖկqRmhKS_Ӂ'K"ӫ!%s4(+m ۏ`&%\ƶIsf"{K:BMQHP?/ARS@7~T+SُmE}.C19ީQ x k'KYʪ5`.~3*PK7+׎oz||E3%tKQU%!OY$px\Qb YDEelL#XBGVB05Y;!mQ~thX|y62Ry| Z u뱮YGy,CjQG-jcqަ&WPMV;E3,6:nȤ&ql8~%ilyɛyV7rǝwtwn!+`+kfIpvv~+JYv$b(}[ j\O`uJI'pTzQ9z*qf~>Nl?Yn׻NXJ@_ a=J(؟V&k#D z+,MK k -@.9G+J-yYrXYaUnkR:7I-b=Ǥ~BP&gbRN+Djk83=:ү0{Maii[rHK%Fwǝ/[Z!㘁rbx=;a(eoZLh[@a_d@6DCF!%Ac  I6`(UBĥ!@W0idݻm Vx)dQd{< >lH2BCN \yޫzUェzjjm@c%e[fwFc p("vKNfΌ=s<[,ɦ(JH&Pei,qf&cO&߽ aǶ,Yq]{{wwe@L蓧^o}}R~Aύol^-r|G!q9*f܎#k*_@]9)NĻ͖n2^ߏ=;.-ɭx),NpP`2(2gx)zr^{X?!Ox}ORXcSqq+wOf.ݥޏrV~\nskrksOfV]GvG3C/4峚Âim{g>_gnFrAmDѳЧ5~H݉bSysۃC gQgbp5b'+%l}OŌX"klu‘!P~Ejb:^ 1O/q6eW_{UZz׮YF6 쌛/k,Ӎbe6/U덼ss;iwޘb^wŖE:Y5.Ξ>efq1/f:EųggfgΟetbE#OfGQRy",ϋ6^R?$pU1y$9ދfY0dWdYZ ^ExQ珹QI[H8SKI+M$CHq#$rzH eY%k&yY;NS!g (rsQ&Y.z\*wL:̺wgwM^3%<0|Uz.-WcYh(? ,ߝxG f #bpm0[iFUӾ&S5ΠPp‘4Ŕm -Fq<Ӽ#fG~]S62imΨ>SO[i{?m K|HSOکJ)5^/ǶJe[|Ny/   mk;, ?9,AXۯHehǯ_aG0R\|ѧg;)A|[1}D?#:F. }B 4AKwc)\W)^&Sf~ߢ>LCY[Ƅ@ch h{֡*u5~S(VoSPod]߇l 'TˇZc;jh.FZs|C2y e!Yh'iOz^[(P;؞KCԆ$}πMb?ȼLdo]s:,N+rjgċpQgUޙngg:Vgrrbi(Ll8 TV+V+F^XVëYhļ,ǀRMBXV*^a/ӸѪ /F48/(r$>P2Aȥ\n~TiF+*%K@cA ?hv( qg1x3L8CVMk3ICOs2rUus*@c2n$%rq5n[Љyb"/vig\bE&) 9&5{Q,dܼgor} lF йnWY=oʞ`+/fσV띚rpRV177 /~[(GF#(N8p%NC2exmғx*m.W0ҏd%%.hj!?JA:KB{ZьBtƣŒyF9ZvQmӥtHѵ)Dտ8,4Gu؎Z%G !dwZUZdZq+i ΒloӒ{e^ߧa&bF_XG,a$۵v/I~qek>)9ftUf "~?Z爐tɡzy5yU9zAW)9=J[#3xT_w4Oi{Oh^qTKڏ:%: F\OX:.ȷA*dnGԫxEC}87&W@7Pq*#h\̧+1~`mG$AӲBlT魅Q܏&*^:ʡs(n>rWju+/x}""&&ߣin{_qo}=״ D#7QυEyf1`O۞u02$ƾG|OD{ripes>mplK $ uk^Ϟl;/͞kk.۴I>79w˪UbSL:eLOWguoYi/fWmq;L̜hvfWw`#HZo4u>81Β<ī~YђfiڈcRoT*'xI9`G5Yi Y(K,q GA+ U=TF-ʹf!07Ucd|/V0@y<1RWӤ6^$FndE"^dDD Kc. "Oflu9j dq8~Y]MiR@;&K[轌.lQD<Q]%~ Jr!!<0;[T05{\WPKO%˝VBuF )-)ȱTxQ!ۭ%V҉Qz:y nGJb(TzA8j5ݪ6XԲirgBL՘۝1dz)<5FOlp2U;諣eb/ULyvN_`?\^Qs!3gYåSK rwiTKkoY-52rv}հck܂P;153&G/Ѷ Z0ֱy:t,,Zn>k1R2tTBMwۧ#.f9v/ wj(>sԛ'>A [:G:۳" y|glo?!l;WuD +n&F,gڜ>0@#)Yw-J5c g6ޓ ˋ㉣ѺnE:s3ԳA _Ox΀%M5uZU.9re^nF5ʺ{~ @DuV@MmP;dE5fch/mu;D.-,kA^Pe_Я{/APpUB5a, AL=bw \ |)wJ56γVȣO`^|7sLfK:eQ"*Yh iѴ7 ߨUOPwq~g)}r/ҋTw*|(83R!ܦ$,IoҬvZ+jbR!Ƴ B3sOH/B/m._riUk/_fM|h*ih6Y1YX~ŏH:iY\͒&q[\qJ*/$ |?N0bKRW2iʼn$*$h=!!U}2*RgRQ3v޸%mƑVݨZ0;xVG*͠Ra+h4;vzKv/b7>D?>wF|߯\AAdsU5$- FCzfb#QOj;*!|?ڣd; `d>Y#A5,hNF1jbNtx;ĕ0ryQ;^: !;4.4sYVGTe{Eۀ6' gtlUԈV2r0ܵhޫkQg\{V;~k'5!-^=GRC;h jR>k!f--*U?:嘜_x8]=ѧ7 r" c6i%E uUw"jS<4gQT U' !B;z- 㦚鬘.L\@sHtݩW <]Y`@g_c@iF[i5k6'x7 /- J-Ч!5εV9 ThLJ75Hʒ&2Ӆds*bAt5$bUQޫDų29j;2~UxZre#w.,yTDRf춅k5QsuF{B^A;\fլQW>2s9Jg}_ufµ6a=9# |igL`{. w($bܮu͓`}G׵cZ0sm&$u --;|3JF|xy .G,3rؗ/Yasg[叡8#=omwZw0f0h}H[3 RLU.%a߇Op넪FM Oh:"=vUϋ1o1Y/B/K鶼n&Lz-j^q<0jf?e_G$X=,NҶ*Tjrw8r :0^iJů+>/ϲ;7HC`40|2g#*1pEq;UFRk<,qrT9$, W(l4Je2~t#UB0BrJ]P\P0P9a@ &5.WcAsĶYO\yJE3ڭByX;!<K"mPJoZoT;T^i<9rpq`iRY"U%! ?1v˯ XsBb BQ)f+Q {&}>;OKL?lDf/j❨4JpܦߧGZ#ݦeBL1H<&8B_ӽ~Kr~ZIE*)[2T _COTvˡe_ѻ7=AdO먻WsW53!%?TCiFn v+쁛ԗFwj߾`rA*XzB}/dptK@~D.^^E8ej# 4d\qjk7]%W\G8>Vy>ue"iFuzyFMJͯ[]PaQ#ϳ (W}ͤ'~@ha#FoG5@ZԖbyAnjhEtlU淭[>o\\\-wЊg']5 ;pݸo9.#YK̩#jFYU?dz=njDNC|)Yqv-O]P}{X>xUo-״Փ)ut+ԸXQGRƒ(I]sP몊`lZ'l6tfzzث_:wݥ5hkmXKڰA67\x%TWZ R){պzBX7Xܨ72whT*f;^gMW$S( ]/hYY^1jKj}uZ-u7<\e "iT]c#MF'A5cS BfP h-Au/YFf8KvSILwQܠ!ϹYeYnN3<"?W}N7]MQal|iitς0ReZ z|]Br7֯)K@zd (oh]<&ΪWmRyhPڌi^x~Б35M-n ]7̇U|ޯ~YR =_)~FCv3UτP؆ꈜӣWjX|r JO{qm>|Ƹ92|ۄgFd{/rDe6\K>f[m4:쳗TH>-W/&wM.!'o^O8:K- ?a@y i Y7sV? hM\)kZh5\wD_x((ìz.>t@WќW 9 aUPnhftZ6aq]E-njs=iޣgpНQ$?g3u oÿq҂^^^p!*3B%'oYi>3LT*^EI+5j*n¸VpWð~͏$ʨ;Ƚž;t3I8*K#nɉN[-I nV+hiRrpǍ0hZEgPͧd?Ƨ.)>9nig9nWK>yH~[<9@֏ƳN^9|@_WYExFڈgf5%v> 4-_&(ET;5[]hZ>jpϪ&hD}v}ɖ^]>JrCg///"]V3bo/Fk Q#θ?i?9c HyqT{֏zC_4F}ѸkIR%#і>}F\*Xo\oyV?G\)ut MbH/B/B/(:L8u˥-SשGkяMKQq5~^ V`lY&iC 6#f+jIG0 kA- Ҩ҂vYǾ)=mPmbUߏtrN(meIf~=8a, |58E;d/ (+5fgi 9hsv}}ETT-\ .&IP+WUDq;x핫v1Qs$Di|Ћy$7oк{Ro4*]j^pt1]uCShX0utG:ƑKyE=_.i{rv*ٰCBiZ4\Ipom65"Z=&,I4 4ڜbK9k8wR)R$u޷ۅ;ﶀ{a2An nNSV߈]o)6K6p]C$~{AtXaR`˙u{^IhױŮ~+Je !&Wm*xA{nt?oKrynRpm]]4gnCsukyEtw̎Y@g̴C[&Gc;cS5f絯cI ϦRw6c[!?V=G[e:͓\Gه3 wWio4p8䧷A]#\w@Ym}xhxTi< KWp)]c~)!M-6%zB|ec9w~W{܎G:~{, }1qcv^ɩ;5 Bu#ցAp\˶GҲ ػ1m&^̼BsII?'0+]zLɛsG^$Wl@A~MDvyzPmAǼ;q+I~y*yߣ#G'[ g\3nWxq-$~ T#]R8˭OYFN:-_+GFQzAV21GqTwb(T4b6$OzByk~|Xvr]\ t54د>*ڇm2ۍ?:3N zh~r% QE/>ƔxӚqrլ{uiE숝Dx@IaĎ4#e/#٢7?v|r2G)1rXSB58I|6m`I\8t;ͲZe{N^d7 e ۵4i49%{ͷ>lzO7/rۂz6ŮO5Mq9ڛlNic˵&5ݐ9S}J))bE+r/iZ\|/: [&ص}i~t F,b'ZG?s;GT=zZptFƇm~fC4LNyy;rNyF~Ѯ}q4Virl!]Gs/>Urq )tv=j7٥{ MvA\W74=>cu=}Z UQEQʵhJ~H{~A:].Od5~oRsG{e%Ac^%Yuwc&ĺn.Z1.F>fx_ 6uճ?QfX\^U/y^o;z]WI:BԅG-EU$"[AnVkE^z6Iي$ -.*@h?f7UV!GcT4I[9/:fZ(tU,̲5ςxŻH?եFīlHJ=K)=RZ4my5hj9/0AHJQwiEcd4aB"G5>e,cWC vث3)M/+-И_wƟ41A _tr.ZaScb(>v+cttu֬ϯ#HGtp۲xh"ލo&kjwUVCOk}Eg\~{A71Z }/a=K<\:!-vY1Cg7'\*q>Ϩ}|-?%NKg [z.C{О1t[F,< o3 `-TK?&zI_뭠Y.VIGX|CZ9XЎHnNl66HE<t, 59ɴb^/A9]+/j_ >}@$a@z }x2k8189oΨ^Q4R dJJ'*nVXA;b Z5z W̨Q:Л-U!흲'=BwxD3HEF.aTHUP!!FI*?vJ9QkƤ30jZ/qO6iZ2?*bը=FEnԕsJ+/PЋ*}ݪ>Bo1F5h\ Ҿnɨi\/@1CK,X5=J >?:*i3q1`UyH5_E<&GI(,R0ZQE, 9"; HAdŖȘϨ*_xL㼊HӴ#AYfHc6Ry\cא߈mURn^oQ%Bw%yp-h_~rO!N8݈2л5?r^ȫz?{pwozjz5YWK#1lYL3 +jBN8o\nҌ0~o!^M\E&ƒ8YA" Xf/-%i-j^rˣ,įW¨R9,g=2x$ILx5=li<o5GB7([X>"8c@I2+1:x4oi\B/B/\nw3aoDM[-53>~(+\-ijxJMYЕ t7NdITk!>4=JuGDAcn3|Z\ύ}~L ]f@Qn 4JT4Zqp|߫VJrkj(؜*R^#G@zy+Nuy\-hWae~Qo@״!:#L4-Xݜ‹btL;mW3+LRb,5whc@ƃSwiTܽ,ƌiDܫ;WYԲ")Ny︚4}Ca)_^)gj@vnOT6 +U"VG u5fTx+LCRG=&F;sL>9)ea~rLdXВU>U=H~?ieG#'U'Q [4nn>yVAjTa 7<`8C(ie*ᨋ/zzfKn ɥ o\=uSS2=c CK(^oK={vfumx&Z'J4ju te\![ULf17Nš$N(iBSy"FިLh4vQ xng4J9kA~z:^i͆ߪ#eZ؋uGQ*}|s/o܎k驍Wl|S̸ow Eʡ}R2s${In='j2{Vr[;K2g\)uEvQ* krm;)U[Z*wMN^j~{)?װl5=it5f'=2TNRd~^R ?S.x삲 Ix$ѯBc$3@8dhA<؜N"rpЦdE$99JA^v[s5,13F9d/Crl ( 1算nZf\˅S쎦G]?4vJׯ,UfWYhWfn J@noOӧmZaeyLIF UfVszgCSE)6:rP{[?Imnn,NZ!#Oc.6M^^QE;-֥iq*Λ;NV/$1[n`ٙuwژwf9Y,+:EҼ]W;IA#~E'St ]4:Fiī1`LVRĪ':v3w^H#'VLLĝNY,j1/8 : hp8IC/JQ6ԝ\Qr&^ɋ[q*a=}ZcQNz8hdƪ V4[-f3<|xPQ=h) :; ?GqT3Drڧ,zyr] ̑HdT2~e8le\KX bĸgH4G1.l27z#|͍u;b 4` O1C?Wm'M~gQ:Gjǘ}i&sZ8a[i: zscK-`L"&yj0(GM5wM X3~Al-Kk:W%۲03 D:O&Gh>dM\sI{ Ꝓ-F[5JLVg;ٌ'bV-fΡ~O.s.l |F_r6٪zNSz^%}1RXw:k$%o¨.YعAQ;S7굪mdzguh_9I7t߉|i=Ӗ4ދ'm8Fl:jKҝ3 A$N:٦՝#ڻC=N60/ޥ_G翓!aұ<*#}:HVغ˝ʧկ&j9j\m^腿/UIۏK9t[;N2gwW虙-ʕJ9lI+ +1<6.LEW6Re`@M  |?cŜdQLLYu#yi<хK8ۓUvvѦX $/pl$+&'3n\jjϿUY'sP|ɸ3:IBEtrơ`ŗVYlzh9p'ܥoݥ,@ a.hܧѱ5pF6|ٺ]y@|G*) 4JCCTJZ+5wQR1cU}<= HG>p # 1ޥrR` ΰ~qa,Ȍo }О!Ђ;(H1oǭ^*nӑҴW<؇mFݬm6iɥ{/ϡ>9ɀweWcKӴ>%}i>4d$?q?aDK9~5W#bwQ5O{?)] IDTw:]zZ?W*rtyiw V_a-'dKeq5?j\):ߩzYi}T˲S6g|3n:Z2|B_vePo}qmRcU W}>* ?X8gۗK dlqe/}:Y/B8әK~f3rS觤^1 TtkUMV@&&r֜'ۍ,[ڣSw1s5D q9FEgdڙL2YnAgv @ri'ϛd1&&: wVvdՃY6TU(΃2髺(t2Hۓ(%Yzl[6[qFq~ŵ=y[,/I%ϫ[Icz+J0lunz軮[m*7*47䮻..T$Iq lAGw[܆OGT~'r 8Gp}.ƺ㓪We.yV<ٮ0Xyڳ 7C\,/5~s*Yv]G,֒kIK=h')9}t)&'ոr쳶~uԒ:5Rqѱ^<,zT~9O9[νʹAe7k%}&g=rJ-sLs8ا쮅e0D;Ѳlc(nYWmluV\W%K͎5olh.إz106ܪu ɟݸƴ1P3:-%olOJ2puj16e5=7$44|n`,c|0؜"gCzhFmWqg;:h[}~W鲖~]t>#מfhN{}]\=ҧmۓ:B_C 91?㰥>hy>{=-Lg59￷$Lh4%n?]]&نANW??#{GTȌ٫9vA| ^{4:E߇.fe #Ix_;#&݋!|-r[Cx-Fq}JH3B*Pˀa٭u?`k`i~h7&mIaoF^ѻ=rT{v\1ilAV٥yI>!*^PJp<%f!8c*x'$Wk;p7cUvӇ'ujK7=/_F +]Ok?ٮ<*%g/e3rˈtԾZ6t=t< %.ZSY`g`dL+sDgc{3s<JAIr6KГ>pi -}tQpXFAA_nWʇ7۠r5E=}V r/u t4canwn^+|~>#uFAΰny^ =x0/oԼat^T@)&VkkLɧ:٬ssw?1<|y19_m~Q;vu6Q9YStx1^kZikϜ]>VVwVgV?}fę3Y>YWN;sԙgO jTܵJM43ck:ӕvL쩉N'oLLdYmD6lqeg'&:3QsgRidg*X㸚ȝq+(˙dQR;a)e4Nl)iDAG q38ky6 $Ab_enx5QcqBXC3ʂ, ^_łuBg*^ UlQ8׀_̧?rы˗.x]rKO>3qLꜚ8v)"՝Ξ=f3kN8ژY라rL8sv⌛ѱcڼ>3:k܎Ξn>{jcg׺h6^!LLI;(현 2-ˀوQ fvPEPiȍmVKMhg4CQoi'@Q5$4GѼoQHX-~1wұW:WAW:K\BTACf P'rmEQnl` ,H%@Yݫ rݫE@u0.e4 E׍zX ^#7+Wujp0[)&@*RԨ5W7S_QXuQ*-u e#ט'A,S e3B9$ ;oZ+A*&rCp1+B6´Q +ӂm&1i]-ga>hdf1yYc4q!W:^8h}JQ⎁ɇcmsQ*8&g$M 9xphpK*T-ϥvʾX:^. =IGX{gʀkU**4mx8JU Z(܊W /_wSZݩpJ#;QAP=<1#qF찳ɔ>Fd<~=ߩRW&O۴M3AksW`~fY4OL#/ F? z>ȯ?-SS@p 9#{J!߇yq#`z+b=7d͸9MMěO\й'B@=Wg-pn7r1obx0IPޓ#mUxN9zOj}ʃ'41}W: m|ʲPb[Aay'Cpߡ/R =%JK@ |K*|EO]Nͺ|~K."[t%WLO0gqBk4}QFQ_<ƅ8K &B8E(XR%>R(R³ *,5د{Z&q)0R#uk /~_oɬ-ea 8"1mZƀVW/vrLnf;E)[~kГvi<`fF[GA]]>qX" Uq zw?V=s[i]7KWXָGSlYoÚ0 SW=0~S[-^2ŝIJL?ڽQ(9&ݴ[-8ǫi\[Xꨯ|wA63W^a:pںSfuD2X*]ͧ4|g~ϊ#uc]VIUOSݼRIZg93&T|wgyhD<6Jmlw:ytQƷ8n8ɲI $i%(4kGiBT ڣ )%y錎 Y4=qY!(9vݎ;xU ~D6P%[)! ij1:@IjIw)qZO\&a֎)DA ~ = AxtT~wJ !5N(lLA#R3^NW\jr|ʋTg|ͧ/T2sSefT%}M$g7HYՓp^{LhIH9ȭ:2"WY!w]֤;\[pw |~|6ܡҕC9 3(ŪjhsU:ەfՖowUN<0ĊN[C]{o_.u"*s1ijEf)n%n=Zޕ 9 ;bp󔖿Ymv%7%>DTW߀{x<(cQչc /b䶡O [n@l/VkTDF́} V7ONܑe5֖5aԕB7b ~pu |2M7o's7@ ͮipxXG)?p_ONݑSTr1}9.ƖtVLz^-C q|3O:~F?e?%n]mGh3J]*:sp#`wiݔO% MՒ+oA|XKrqVS`lʲBo~N_|>8yߨߞ@]+{G9wrsbgܭBIڟ(ܯOSN Xwj p,q|GCUˏ+ Ъ/WGf| sm>OwC_ N<$i>⦯Xuˬ__{}tUĩ+ɹg Vo꘿e]YXV?kg'T:Mt*kϸٵg&cYmb굵3ck'Nz"kt&(v|mc|J{7ڵ kjTwhRQƙ w-lgg+;\b`(Ͳ,c @_֛!B#^7=2O%KN;Jhh@Ipq-iZDh(]  [Gus 8H^ c&6c8$6߯eiЀ8PwYW8(fZĭJ9zՃRP`)iVYG*^-&粑:z[/Rhh˕ިjqn}h.tŚU+'/\ .Rzvׅ3qY"C~'Y,=eDsr%vCi)~KQ8 ;Q}PXSHtrNX|J 5*kyWP;U} kʋ%ociW W bV4 *:C͛Ny\y*e vn":6 {LgVZA` d8/ru_/U4֎CP(5Oյ b@+00l$Wl~(y$*^J!ֵN%=vtVО#ʭhtv6- U/VNCȕSc7(uXm)MڣbcfrsݠZkc\n_F>ѣ7ֹuԪdu*46o/%FH8ڬQgBW;5gvܤw qקfTzUl++ET5tB!&|w: q<+{Y _΁~nu4;&ftHOtyrdt=:~.pQ -?W冈=3Zf7۔oTIo|H߶ Bڍ.BK]F`{J2R@ץiZ.f3'cW#aYQv9UqZFxz&_ =jCS [azUsKPuK^FWU|A\tKeTQxÖ^i b 9JmzA+lE~Q E:*_ݭVK7P 6FcWA̵FVjjZ@>k!`IWZ?gPyD ң]Jy&#W; xĂ@~C-FP-bJ8@S*2t?_5Em0~]u(ְڵxZ^q+88yGńVL )k${>,*[} PJ*7+e/˦T[mwRRR!rπ@Җn0h9!QJ-}w@՛пhoP<&.V3v&(|v@Zt-ʋbfّ*<'Vp3RQ h tc6 Pw }CKbvhYq֟Ƥ( Ѓ2rr1s-W;%OƸXʺ6i>ͧOZb>eחX.[uR|`aŬS}=׃uXsT[n#t;y% rP r٬7ZrY9R.{VWdE ]xJ }.O,K"@Lي3E-`u7p]j$ռ$,MfdWwQ1j 0Z5RW$f"ڽI,P]O>i.z"_>"&JHzfRr\kc7"CsrP>QŠJ3y) 0y(̕G?t`A귪Rc3<5oS*](_I{$u']c%1kۄq]hE_L(+\(DzA3HR+j'p:WAoJ;l_=ߠoo%?AVB|L*]l׫@rZΧ}܁Q CϝkDLke=e r-V+s7zDgqmchᏔ%gJl9ҵVs iGީyvE졎`OfY,傛_g(݉}E+t;1hHZo 994$ :M|ŮdQu|O? u)^.r:vZzF%o{ ^LC_Hsơr ׬Y\a&q3͖>M%I@8J[(WQՉ cc| iI4tɓ,e5(&~("F>Fm:yG~ cճl{,k5*}Z1htPO -'])}NM}E\;tNEk[zK Z-X➐I,}&mDPٍ+B$~^ eI[ا5(Қxu=z f]pY];o>$]65Tu&pF?Py\p`DCV_ޝBc:F=2N̽Oǧ 7}߈ Gk:}Ug{g`NJGp Kfg8͠kPk=n;zo"[3w)4|X v^s O Ug<ľ&;U 4fh|ͿPz9%q|U;Q+fs k' y6 6Obʮnٚ:7gn_joo `Z]jPxWޥVyu1zBB p>Ld$q<9{p}x+}xA;z OviIl |8ߎ)3W !QT܎ Zwnuɼh]rj՗Z!,bV +/ FǕ쯶]h^T>1q`ڏm)V0mWv"sk1#RiPp4U% @/5&SZ^-m0](M/i% CLG]s436KpŌ9JRz')"IF4f{I RZJgI8yuVfY(E<hܒ5[q@FӋc_<\ ^Z0mQFVJEj4Z>63[1ŭ0MB)lxįռF+y#VT% 0OPғ j^ZN/[6e/*^Br3 szذ.&sO58Nj~V7`z4gB_wq򤮢;z;@:`(a?kvoCp<_W{̺a*jӟhe~H 24(13RQ9Ok_:ш},@i y: NA1S@OZ[Tr(=fmּ;6⎛]sDۥayҵM GlX]-J~J Q#(RopV]St4QL:#E)p[lX*bnQ$A1Y%]rs:0pDd gZxGC΅OŨc@1_bVjT32 wvqG7Kb YACQ^/Jq?fFߎ]&dI5@M&;.g툗j sŶ+0A}u~,7v09[`,VkZ~B5|q/7e n (Fq ;tnB$H7k/#(4L}s τF }O>!=sΎ:ZeA(+Mg8AշKW!t3:Sޭցw(N . yTWz&̒;WΧOZl;iCq5.]t5XJÎa+sBA6ޣ,;hTgg @Q'e(Jzk̴{MuJWWv0386b[El4e.)iLhYv=o؏' t}^ `\%ŲW&|mB .]19\C]{jgԳ?{%ƈٯ9z* (ӥ?mǂy^HAKD\i #4k] v-);ƕN`D QưG[9&b251((Uш h`pv#ԧB-. )Fs,uzzS|r>:ϝX{40y +ȻpΊ |B6,1V8baq{D2O+?ejITkEjtOڭ8YDNف6 "u}*/`xl ;n&8E˝:r{Pk5!Q'+tGd?#1+~Z螶FҚK̔!c,$w(p }@'fRx.8-Խ][: @a GfcVP hv>%ms&A|Rlޡ :*>j݈s<;bq6*KVz^#;w?rА oihzQ3i=7VCw>d {W~%߯ͧ4~y5p\?ru"q_*/a =V*%3]WqO'Ƒ/M4[晆ŌTcW=i̸k73C$rМxNa(cG57 %VP,yOѧ|St扭7ڀ>!ūA&cVݯTf  Kj$%V}Ӛܘ!0T4cvHkn3.y>jVn3FJ敃NOqF1xFyedf'a$GkU`vŚ=۞Vz":Vs=jnԡQIrPBcq|Nla*;Ae Ty~~ -n|N#؍5~\$9E$-m}@m$-Y>4tI-M'jl7a|gSQ%kD $e+B *v4Q2%ݠ߉=Uұy#j_@[PÍVJbTRG;896 !~۪jn8Nt6- |/U#Yب)Eňi7}178bDÂ+${Tm9W,wT:EptWǹvdOqH:ȱ^*ށGY0z}&a=>h{0TǼ9'JMwY\s&.h1G]]rD ?+fW;{ 5|AhOKO 0w|DByڳv?&+w6)6ZA1py3zGmu3D̡o.s/Ա߈NZbZkv1\{v19n2/kن&o\1d_s`GĬ;un1-8{S^WEM1Y+w|OFMk_. K_!̝E@MR@C!e)Ae`M*5(`f3l/d5|߭]ǔZzTb4 S4X/Tϫ5XIh$VBTtHlMA(Dទ=<qUKbz>3gmº:fVkp"8YI5{7@ pF}]t=ZlvyO)Fd)G_UǗ9A8yЫ=]Tc r~RV+Ĩy;4`)"}I&Իgz4ޤ8vrH~~סU4vڝ7|H5یcd<(/0%"3>GpEi+_=]~K4[4O!}.q'˺|=~ 9>O^ s&M&@VV=3Ny!<2 #vS%tm TY UO 3U&FZtE!o/I1N fhv]?Mc^\ͮ_D__aeM۹G#&r:]w?3b7eW]d!;'+uu]h GdWtޭ{Mx8nq8;nL֌4e@WF:#d }ܩ9ߡ#l1fߪhW!GWA}䌑.ru^#i>ͧ4O3}JvYõ__:KWUWq?F_OpX9=S9M17n0<:1A5%S+E9ڹi㹜<;hcD4i%qX;Oc"1$DѹQpEh/8U(ȯa? qLݫZ/a<Ku%MCzs3(Wà\w+^bTԂ$8Jͦyv+ø+`kkoֽ0M .&VJF iElYQ}0 "4;-RO9 FLaWkr*=ԛE~/_b͊P{B^ 2k1s 8-ۣ)itR >YX ךC2k`M 'aUR0/'T\O @pmJj߯埵eF^ReDO3M^7tCaQlFQ߰gTlm1ק[$hc/MoJߌ:Y` ;|g;"٤ceBصlxR*УqQ^Se+3|Ίv`e< #M6r|3tc}R,TG.sx%G@ YE.71FŪ8W89d}_; NFᧀ'Oy;Th1ތ~P6M:9=%Wa\ݭ1RDČQsI}zx=G^П[u ssH9(~ E%}@4,FU'=ס!COO;2%3 MX=X~7jΏmr5^]6`bmW*8wK۔cTokM7'|޷*: @٢=W~{P.QÞ>yT1<ֶA FNLډ>7 pkѨIՄbvn0J= ?ͷԷj+1 i΍*}DP*fqЫ1a{}g?uw zH97h/[HGzʅVaJ,UQ.]~R܇җ8&ܝ1GhmCBDzz+zd< Z? *5 zzNߣ7}Ժ >P6gkjP;m!bJLFrws`(g(G*rIͧwz Owͺ=W] ^W\3wcߕOkW7?; ĴP*rL'B kZlnj5K@K ,dy@ 5Bya-f`UԽFFU5uc0TGxceį0#M 6)f^Vϭt1ěUXOy nDq^Z?GYgf#_XOtG)=v=8(q8IL"\9o$ 43 0畑Yzu9{.c`J/4Ҟ9tc5V 3ei5+CDČuԃ6(dS:p5#8NY:5`MOy/S ggT5:'\iDGn@鸕u 1NR34g\У1/@cZ1PR Idy=oءFHqY6km:*)y2ױk^j,V2Vu o1C9z['!CöiIkc1+:Xn0|B4dX|m½ ?@ր;7(;bFN)pqBsXU&Aٌ{FzӒ wAaJ}9r='>oowh޹Y&% w+tЬr!NK#MM9@O#->Q9Yp/:UPn5zBL8[-tَ< J6O96|2NAflfх87)K(n6 68$ jF{~H-dqgzg@bfi'ϒŋW4tT$Iu`2 H0E6cnY-6.GmCYEI E#e"hdžxAؑuŽ8tI+aLG!xR(ҥo圡[glM8-ꌢuۓ3)RtOY#=bN_QtrJ X@Ӫ0ݫKٓzA)ώ٬9zg nl5m#xDT XVeFu@;,5ѣz%Kr.xcׯg>w^m6+G1VUazɥΈ0崚"܌+zkϞBI}7&ă ='퐂A Jʬ8]k3}3\_!=lm0^5Z6`J mrI U' և5Ҩ=cz^w+dTK _ [ Hӣt*5vv*5QUeóghvz[k7ܤ*psF[NǑpxHQ9G s_`m1/i Zi#2]ZB<10j0ZVq,85^/ŠO) ۮ"ݭgP ΍sؿnլaa:`,^5vE/g6johk֜#J6AC,sq=Tߗ/#@OLwLLއ^\-%k؏++:ʇq\+Ӈ0F =j>ͧOK[,yXr[s ;/[B>tzŞe.V j חZY;}@}y6q* R(yVn-U%+1NAziՋz+֒VV y@kiPԳ㛹XħY°\p+FhЊCp5jٛ#z64J͉q6< (0_Em>} @g(Fe}W> Aۭt6fcv:<u%FT TV;yʢ|$<%(R~`BiZ+T.litR=j%KFվgjR`K,ܜ&7^rr|rJE/n$;s!xR1gsqYY-^F>G C4IKd{@%=bH(.1ZD \)'\WlJSٻOk7ң'.&<6 jZX{u־٪wX:QBxɳ*22Jj== ڤ؈)0j͊'0H~]4خ.L&;;lջUlxӫRikSzZ 3-KUv˟}.W#cSgt,>f1=6֠bbbS>a~&#ŌhќbJ8/=1xEt w|imޥ%6<*QP #0Do+Mf418d yj lM~g:3&,֜GƲai dg:;+_/؝^ :):Ey49(>#;ngVA#Xv%zt\^|HD<ݕoJbܭinA]{kzڟ̇uFފ;֩wiet ]'xr>ƪكpZj˧yFGp֣4k.r=&&&1uZ<fԧPbto.i:Eܔ=;p3$xΈqT-ׂꬶUl:LG>4ڵOgrdڣs"HveKdW\z||A}r)qch0F^lj=eڜ`<1㩍!"y0m*{#@_']eC{˄AUaL瞄flYfa H,FIʵB4H\.ahZ [U*A3)Íz8)qu~˅ƒ\b/jK^ϼȘ('Jia]9 U]v3VkɵȡOu&X߻/\KnFH: ._UDswO>EVCdDtCz4&Vk@&f-ǎ^E h[оN?sk{dUfm7<5u![s۔#RI;g} /fG P4>#}*:~+ݨxw͎Rg$>Ƈ3IEe_o e@N>'l%}DW,ATrH>g[.EB0 %āBc4{W%C*%YŵRHBW-1Q hAf!v=z)lGnciPO,w^3li1ǔCζl{|Ogn(b-mz}|Պ+6m"sxLs@k6qyX̓)4gq}rHĄ8k9M_&:XGU?xAa Zq7xJ8M8zf(vBz^z5OX֝;X욍)܁8ٰ4w_U|OIK>"[_XXvJK/{jAB~y=cqu9n4jDf]zvn`bİ7,L3Z/.٨m#?i9SMUr6SϛT(/Tԃ{4_+CmPjK07U0kJʀnLFi9د2Q#ycr(Ls~S0{D$ M1l!eȔє!H]V z= Kœ eEDBD䐘c MPNJ8ֵ`/V[T x"2 W}ݬ9?dƚ?kkHt!1Ȉ.EqXW!2"7M|g'"2wtM ad[D[Xc.ઋla4-ɴ&>y2IL}A۬Cb|sA]lhOtt2-G8Zg,bDF~% 24 h_0;I᜜O[L.c87b5E,^іҞyQx~Rh`6Cc".fōnHdCH7+;i=*>g [aΛd h0&mRA1"}L'oiG-헮|aGuf#9qA-,r1:;t> 0&Aga9cЙ>@wNQ ǧW bBnU3i~O(6dqٯ}"wyM)+tF; osb]m4w̍j6CY)Dp"ez}T_4IɫYw@j:rU.]j0@1bʮy4|]#m^Y`"v]K6Dʀ(⹌ԙ )1!|Гu=wvSn|Z^?f5\nپ5lT)ҥ"[6^/h;m}}*cϭ=uƺWKd-F %6+*:6oD5qm49!QC'R~Y VrV닺(pC4MrSlQጱ؍YQoffZ5]8Ɠ[f̈? Z htMjyZ-ϸYi*wkÎ۬9FG)R](t<vO(н=cL6Ȅi` Hݨcdw`tF UKDV{;,zd (Q;ѳHĆw27lCګ]J 5Bd4fbM)^zPBCqU䜣_T_;E!}̧4~Fa s6bCe+"^t\YE8JH˯RZj JCRX6u?aԈV֨\T/7zU{7D<;+:@`RVz`'<R?z%n ~_)*f,$?tkVhe? z`, Ak{_'76 ,D  #o"ʑ{t.opP^{sLgay&r{tv')zJe?$tJ#̧4ӏ>j~G_u·/Q:W\Tcs3s?65BCP \yX=tnOHa'@[Wľ<JW"r =Ǔ؞qĎ-˦lmW")eKe;cx$O2WuyN,GWv-UWK{u{W5Nۅsjֹx]4YuxQ϶gOO峫۫նmnN5V;ի5cUva㧊jI#?΋)ke-o5~z}؏(ͳ8ϑZJiW!էva #1vN^oW=j§jD~߆ﻔ;_M3j+ -_hGEkTI5Rj->WZQfzfI՟m+uzC},_QAـZd1-R09&КRC ^ ^Ї,sҷIp$D ֭iYuHg;VZ8#WQ\@Bl:&$O(8O;QFu]WFbPƊvgF@Ԉէ"{ђPꛠlz*ڷ 0Upy|ފ=nBod *L,7G}OSB[n,U_}چ?*ov 4{7 w9fgTMFseJm%HS([9R`̫1j2:S,SWj5"v7O zièɒ+1yd\Q 4/I_T se̛pp|'o[ע ~ً:RQBE ߣocZ'vb6A%j{fqBfc[N Π$uqmz6wECݕ1"TOuB8GQRa.^rJc,RuptTˍ:o/ƭ9zR(,Ɔ'2_ĝa **&w\KҘ^9jSj|:][⿘\pѢe+/_xպRKiiӧOmrbӾUڱvX3 0xzf^ͮ>ټxO_=~)D mƶ|xs ai#fJxg邢ՊZ|Bâ9 fYBi5L[m`t~DT[}a/+ rfEt؊fYp-4&L)1\Au/ 2HwQUA83VzFQ1)-  W۫EaVfZCYr.V\tُĊ9+V} PB+N k7x~_'JrƳuu=QA<\}׋\Ө=X-AJ$V ڦ~ GQۓi1W7,o> <\`EjRJWmhXZ6Ii4jF ԛf-):d}+~ ::*b_Pf5OJʕK{ql,`%#GV)1"V2x7,k\p'%`^cOHևPrTArxMV^RڲzQNCgQph^L@MiQeebQk?^Q$ Q'%wl(cֽ[z'ї#kP)&p3sN:on`5qZ?}iYzܷ; >.gf?f4{dVy|d^uۻ)l:z1ڄ{MOWzʏ =`Z1(KL>Jͪq'|>AA+-\^Wo}f7\zIc}5>zOxD-T~8>?b'2$a%@S$P2L10 Ғ0 ϣY+׽lFQ(b8Q{4(JЫC^\yl4æաsZZlɏBKW!d>lYp!/ACXFJxϓEM/ڬI<ϔ?, HIGPlF }S_W)-BNև,M BɐR?'ߎE +̞CX,P<1,nw!JC3:(jVzGPK?zާVK^e.TbrJ=e gFBy@eF6; PCuç3hoDMRIK{@E83$tk{5ՖKsi.ͥ m6 6Qt0ނ .|!.S*mJI+?Wp1Gx1.n\QLVj%)^9Q~H͔@[/ϔ x7%{PupGݑh(E99z򽠕Eӆg5B3f˵UhWaTGdIΧA&sn>{$%B៨%95w]S <%W& UQ%eB9D^{$^xDz[^B0^oxTQُ2ڒlg*w3heZ_^)OքǤkA!7oʌ[V81o)۽N+9 u'SWzy+f:q۽l͞SA{/q殟Ksi._9qBi᪪yhxr@PE^uflQ?jnxokfkUUoʝUc8ճckkbxh߿X^=v Qv>e 'LNkƪ5;"P!hc֠5xRVIU];pKU 6ZrY/a#m:%͸yq^V+{ErP1 zqQE4Gm6CwQ]r6 =DzAE68$ZyYIdc=neERFcx[ me ^3 h‰@s  /t<h.ϥT3صOEP[d)^Eƒx̍ٵ ZcU{ԶըfYNB,jY"QEIqY,WuRq:"O$l6dN؉6\;i,s׳qAF1(R4ϵi 9iT+8/N/|O$ 2EZi;mq Z%0["-P([hJd&Pt.~`@[jb)GY~.*\t!TQ!N"3KceVipM|Tgy({ED]LZhzƠL>QgzSqނ5uĚw &ݏ}(6XVi:=s.rӱnTz ObKDL#":: L (13「ŵ1Qy +ru\DmϓRVE>*So#:G1hqETRMXӧ0lwnQ, }} Z#cAq;:Zzjwyvߓ*eiKYXhBy"靖kq`Js5@Bo%C U(m`2C+EjTH?̘ A;\}DX+t8cmXRO#E1v,60S恒pM|hhY0L̲ GȵN(7ix4kWZ#;<[c%;1cZCDOP;EE6̲a1MGup2*MoŬ}R iݨb%CȻQVɻClj6U޽{\K?Z}JJTM+ =PV.\bQOsm A#ۼȊ@0i JznN4 s_94#p瀕]Xemcc B[ƒ!ypM#ۀx5(3$Nj*V4a\ִH.˛&(,=S<:n|ލR G]UjM Բxs oƂHlR?1\Ksi.]FuPe˾06_;.p^rex]bX=d֊y\}u8s{MK|]TKaبVרڵZ׆#j5 *H8N fRTf{M\qJNZxmxUՆa%MϷ umz$9M_CYVi3BQ5R6$q80\% ]Vh6YE`)`4FROhbhc;37ؕ>zAPtq)W= Sibm@fPR )J}EZ i~jWIQ*۞ / ‧Ƭ"pi,*ϯӀ0< Д !ynZ0 l UF#N$*jT&oq+HRu$%8Kmq\"9u?JJz⟽GK;Ew7an9li!*Ny,AUN EMZq>1)kG{s54,Te9Mݡ4'tV~ )R E:)8b%}_owH?Tի~W>*ڄ^t@l? =+/t>dz{>*<*yΠ+}wH8q:kgGubKmz1LWִhX|QFBʹŬcTfazQtb~0}j>q~&h#ѾI+>dqQB:6 Y`}}j?}n/\-5.^]u`uuTeqCwqyĜF9AM94~]$Ts7f 9 |֌ɔ3[EVT"OlYg?&C2ZZeZ=xmJټ=zyP'1ڑ<1 lVONe?pLPVS~)@Gv+Ÿ'Ї%k)ٰ_`'ˍބI2c(򔿬5h $_H- )8fx=Ks.9j^z~.+E+ſ,וVoWCF|iQD4LӐlG"|iTA>moY%^m~~ن'J! 膮O'+tuͨ=~ivLOF?U47_CW4!=X NeSX D:m鑆>c ^ҎXζNޱW|{Mw8;bǁ7^PhCbPa[ʌO&/+{΀{DN皫 :"~1=h>5[S>$ho,`-̌W6I%>Zw(ZF9`1!GP.ס{ľBub(< vLZZhN06)Q ʮkG, E Y7}T|m'WepduizwR8s+^zqGmWsK ܁=]]H8uW>AI 9xV,f\Kw-j%<)\|ŒE@K,R7[ Χ?de]1kfRΛ;}N dA4v:jծ>kZ9;kA4砀2MM+c,k8}q(%|KVvnËv#]460jf h7KiE3iHִ}M@a~v"q Źʛ7,^tCP"Lz\KrES0-0UcuoS{%kݣWK:cn}aq#{W D4`͇.2zͱP)Ty 谈&R(v{E9[CB-}\i \L`0;{-F )\/fס6$~Q %GP7jE@- RA ꗄBӯތԞ8;k H%TKGzE#U_? [{c?۸g}ë׋Pg(mTC1.eSZ|1/GV_Hs1ڎ9akIUx@}n!]Ιo3mjnA17fZm#<@Fmucpf9t)6Q\Ksa  . \t.Q hR $4/@1B0ϫ Qz7E' S?pq4kd~D^kJЍHU&ȕd9@h#ujs7$ ˮ] ˎ_5Ѣf\kFq~ӎ Ɂ P ׽K$n)'AFi{HzD|#kr8FlyvI:UqQٌz=5f0wēHC%cCM* nCZeLt;q+W-0Q&k]F#mnx`c?V?SD`SǐV}X>'Yk-G iGm"޺N ? TeJHzoɧ bM64ho6 Bkttm5붚3P9ˤq^,̳^YpUNbʘ[yUmGÝM]§Ao yO+⍐||":}%@`k0}KupŔG[%A*Ě7W.$1!Vjz֚lWϴ(HPA%[_7mO&NV!卂mњI/6Ǝ§^jv(m~C}"`/s.1~P< ǦLߕ{;{gPޅ̱^szdn|HC8]y 3Mo2]k{^eףaA> 9ߢbQWrj.ͥ~K}5ϲ6lrO4|^Yּw,~:W|U+5\5KTsP>0f&u*̀A|GEЊǶݒ]-Z-Q|)A^-*I[Fjy*& uPVsKE TWm`wʑ >M((-mCM=rV&T+jRȋyk{#((Lsgޕ0jHSK5t<h7rN0(tTQDh⟇y34m6:V:wzZDyH-QB󽠱`˜#y‰+7,Z4jĪ wոv/_v(/%M?<#fDZ*5C^nŸc.I{A)Gi]"S@W}XF"u`?}k+n.Nj["2qn62:+'-]O#5}C,g$P݋ꛂ#'}o="#%| IΊA=0);ruTG8٬.y%=ʶh[綠z_e#42π)\8trtXz|(퓞Ge蟒x[QnRM]^9~K[w]RZ!mg䙹^2ƮqA9d|hYUX].jxVwW'`o4p=/ iA*ǛӠGEEy0wek0 oL{ek;oDK5`KWzdȕǁ;JڹNpܡ~ |w#۾QrFu2^#ʱx6#ٍ1FEF5-rXFV|A6龈ȆXq|:Lq:;O?o}V')6dSJ/tI[us9(KİQ^ؾ7Vj`LCIR#Q1&43Ϸ0N'q$yb07Q,oiHoI*mGF0GnXѭ8`hmyCqA*hiCY/i&a)|RGO~fIOOXi4NYǫ1%%@8DA9?|࢕K&\tKVLlXt2 #8}>rZĢڷ[´]$@oAI 2#>({Ozv?ke#Π-{Rb|Bu";{QoI &AAV]8%AzA뤨pv7˂H=hAI I.C?k|3Qb-aQH ǚ%QdLd⣎ݲ䨠aqy!-:. m%Fk>hj-N th#OP{9i mN䳠xH]zDh7OOm5;L]2}4(zj8r73ror{DYxBF9>J(BqUgR]e lS'VD* ~ <)]>=EXڦ?@ w5IL(ӋYzN >iޜRXy{vIK{1QSPs}Q e\]ű]<ݸ_}(yKKu.%Lp25R]wF չDgzf #UȞ5G⏟}k(a ʳ(O 76js ƈX}5`ĎVY䘘x=İ=[ wHy"cFy@K0oppF^. $ xVT͠.=<H}uge|/g }@q]6}p 8} 5*ՠD};v'_dFo~Zp({n'4c}nV_2Jsi.ݧƿ;QӚ ߕ.[X{jD`"yl{i>e<2ϽĞ_i}!'a,>6 >yN1fFTÐ.ߛY&g6mT5,^,rskv4:A^>UJxU'YL5F9ꖪC&@;4Vuj5bAG@CU8P(jQn /eU |DYիa; *}z:CIOZn'+K="ٍk3"6U[dO[W zj{zM<5-J$N)ciw V+3nQCrεwZ#!ԽE(yGwiEj=`^vs8lIk!?.Q/uko3K[@o13wv{ H+?< 䤌nCh2mxJGO*Tb_o?kUEHѵb BrowI[LJ'Uay۾]. WGݙ^s(^ө4dƋs/}L|1Sޔkv1d(1LϟR#qOaLc9"%qV J[ +3dFCo蔸`_zG5&xMH*u`? 8}v%E`Օ=;6iaFO+'AIНWeq;M;bqIKsǚfđWRX{H|W(UUj@-5W:}Oؠe)QquS?jdJůT_ 2j5? 87{a&)y FfY֏,8smTYЮ.C,8 4'K 3dAWp-hQW8Pf#Ib'Ni)ry!ޕy8IY[Ř[h].>},z|gbkߛ΂%Zi9)5"+~ybu~/ogtBqvYH<~#c&=#qtD]m[̉+H-c%;\A8r؃Ulz^yFDQ{6Q9yzU!+Q3#+H<U_ ӳ"9Kw܈Uiڧ% aD_< Bӷ4h($1Sf5-#Z$ aL:R̘5{ҒLu&{UFM6Z i_VQ >dUjQE7mFIuRyɬ VNxs׎j5,vGsi.ͥ4}KN=L?fǞ2=pyYQ#7 GVmw굀phW/ĬZ~-D3ϸ,&`j WNzn%ݞ~ciP?Wsi.ͥNcP' ۉ/\zBq@﹮1wj"$ڤx3@I~$q^Oz\BvWD]mt#Lenz5FħNso'FPI2ee<gs} >#;IkR+3$(\ߕDE#hI\P$'niE-X@v̊-d3BS</"o|8y82;gtq?a}hi5ދ0x/^G$y5`ꛕG5-Q_uֵ5ZH9# OCS2[& fO} GՐNI+B9-c_1*cH4KPpgC-q$>nCW$f(f#\Ը3!c#A--*by5ςqm9bmiO:`̌~V*ޥ퍃3_:qC 0q RkX=7|Ѷ kVM(}̠Og%yY_ψc=rgHtQ=JQwܩ߈z) u J=RE4_iA(.YA/Y^-{J?>2j^(6-WO+KE;Z6/fOMIG4ΚYBþZqQA*Q]M.j- lebrp@؏[Y6_#8ܳ166yxtfLlƿ&%43/yn7oCu(AYkB) :s'6ݍk81gD@j+GSܿ*4ߌ{8J>:1JRBPy\iWZw !P˞n0I/[EBS?QeXpp\rp=`o*iD "UZ.tf6U{KʞCmzvxUg| RO %/Q# čJG^?_YrXsjsi.-R(=~rRKyb+2䒅j-Jc5/dcvNI@qdevKnR83\mI2F GzDWEx$dc)[a'yẎr4F)U Z jTl8蜧$.pzb[um|h?& >pA,  2şEv6.:=3 UACAuSkse`vCUrzxGmuJI[!Ԇ{ a8_#'ͯ=X6oIBcf՞(:"6,NNUP<:%Yni<M׃r*Iv >yD WʮU JTi 2}\FkvY#-- R/$UwPeФ!^}niKsi.ͥA L:Mj4?.pZp .^H-,<?>>=W^5{*g-z y0L/I)&4]ewA2ɩQloN ;q\k'ߋwGP?%6ܧק-1Sx[txz-*N>AZl?61PI(I`ܵ}~Ksi.ͥ4:BCBioD-0.1.0/test/data/no_block_size.bam000066400000000000000000003634111273003163100175220ustar00rootroot00000000000000Begsretd``pp 23 J/JK,Ir J(2*057E3Yp1 abBu68Lj]gBCG} mgU歛w_U93[r)V R!$D`Dq.պA3n(\@;6vTPQIjDE[A[~?ORUUXy?TaK+U*ϬϜ?=0F3MIn-NãhAQ |?)!EB Oy\Q_y]JuSTZG}hj_d/+J??IFHݟʽQrԹc{G唿+} ByI JJ`֧PƽߙP,R$:<<=hD9,`ˇX˯0,n`6u٤3. Iڇ{ <'d3XibyC8%]1ם>; tfnTt($QtсW<ҳLH_?SQG՛ g=8~w:Ghn\^,B#Ob`\ jK9Uipw_Ãpxg'o11'wq!;Y_}|σx֛u`ڟM{]< CB q c9}CN `κ^o1 }ŀ@(M,XL,∾2,# j1E"rop-v=< m"J+B#$(G4AY Ƴɀi I Ex*e< PϡL&PΝwP.Sg)ux"ű<*j4,X!$@S&c2fVlYB(B[ȇ4&mƶ&Ke#f.,-!t8[%N_Dή/}Ζ:흹^:; \` `R` @K葼˩ HW|pHI-RA<Đ֛1SPb8Fڙ;[:w8(:v6qhP<hPa}- .#@ ӃQt*A2TT"dʠŁ4 `h '!x1L$-ps3$N@ys Evf!4g)Z|>GcӛW9{2B aMb0Y#X;{'`MN HѤ+ZILݫdz]Te(7d]p=g{Y:bdY@%`Rp<)*Y<ъmX>">l4L] (>?33 n],I9bti{{ܸtyF˜Dκdw:nk/"wcڦ}u(QIyFL0s&BRXK'K,.;x7LU .^AH[;}>ƻ+僕Voc*Qs ^"l6EXfׅs[*/bۛOIK&QtͅB{8<_p/QQ\vщrtq4iEL 9O|YX^eܝMKfAoJׁȔ$%3<X>]Qo# `:#> $O""җ% -4 4WqKvzE<^WƼS{|];zcv-,)S S;2)[v3"B: dIYϞfiC5R PMcpMb.k;iF39KtZ{1Ɋwbs@?®i547M,ithHñ/"y͊v4c;|X'Uc[+&K~7 )Tԛ.phAie,}Ȱ`]ez5c %BC j?!Y_;v~|}chZ#kZ3ij5jF4bph<ߒtgc\k2mYpa_IhvNp *)bM~Yk”+PVҟah|xQi".Z?^apZGlpZ(٦zV%eޘV#ܜagD{CIx}yF{X%BB S7s<̱3wŎjӘˤJXN(7N N0k"up~}z mJGv:i8τNJ"νp9G4G',bHS~3#?V A,bnpis]NEYruDm;ATL. u E2rGĝ> &qOą%D}J,8wJ,.JA#seESjƒZZ.v~iYmԚHzY[ۊHa'<.XL[o)2a}+  'Ts%]{}q<$l҄r/j՗cUK 4z輎0v8#Ħ-vAfTϣFUG:Xn22;+<"Y>3K>|BmqGwq H=)~0Qړil9 mBxI7(ZwWXȊglzMgδrWT؍Qj_^rubx}H>?X}xN^0!㝈|^E kY&_ :pm;3F%$I} SA1~;+<7xp^q RiĹ`열&b~GܠK)CDZ:?cU' h6:vl)wIDleMRʰ6-a7Ѫ8-h10́ F\VZJ{DjpOޯAIrKr94݃= Qh/+m:5i^X0$9;bX +Y?X93;9LZYNn`a[w_׆R( n.Yd:m#a['tn> (A{{>tE{n,n%K Dܛ>" CK6-pѲbhk˨xЕhb.͇@aX2|-׺@1Ϭ4GNgFݔF,ܶð9^ىnBL :_m%q|YEO\#=vO#iBO˷mH(Dﶀ௿"D!cW vAaνfF,OZFPVYV~`~=f~gtztfgFo(%Pgn bDDtA#Ԣ1̂l8-Qچ)m@_fJ$,0qh+7qBLoZs(\Fz#tV}Q~w#Z"E3<:oCI63Ұ$E:Y2% S:ab:bZo +|5^_]_X\{la,fJs\yĐ-5dyƒKϢnl<~?NE={RfdUFb2!B1 Bl↋D(x=6jI#IҪזov~_It1G᫃!`,a}>-'Rg@(eG}Kg(⻲.2Z{#)J˙WHay%D4d$EWyk~& AILH+xe"4ˢފ.E:Mڧǫk*ɾ -ފѪI*VQuyv;sX&c#Q$,9  5*\xc_˺-޹2Pᬙ,0ʘHjD1z%}5^Fj)xB˺,8)+x)"oo ъݺ؊ҷa]E9-`RpsP?XM l ulTYf9(:xUIF(Ae묧Z<A|Z$fg1/6G!%,Ӟ8.vf+rCět *ܜYū,Wp:Ƴc,eAqɉqFj9]D @ ;'坨Cq>@>HmFb\|Hʂ_rh8%!Icg,O9Wrz'[q7V{qNz4B/*AN{,ZU:RGyhHF ktrH[&)OD<{_@עZ^=&"jGq4Ѹ'=uZU4O-$pH5Y p/3 #b>ǵ2}6s Jv­0gY#{;5Ib5E{`V:K&\l7yN:VpZCr)Ow0K/lE)}9< %*oyG)*cMq|1#t -d4H>CC)Xpy hM8b vMקrmH(jYv-tn#7) @iMm0%%y nOb?i >[9Ac΢sؚ e5 Ύ"ѻ;Tݟq2UEgM!`aGgK@ys^V K0]9'!U$^چ"%)4V4Fw(E! RJB?/\y;wN2/Qy!A`@+h5c1\Ud_c٬vaV%%`,La`jE0jj=r,%&!; Ϳءp" n! y_]PMp0D?qēEfzW yzUz,5^p 2 G,@lpEtp?,ٰ?=,ʽ&h,Y>`XWç m(a0-,ksU&tuXF7`I Seͬ '务{$mr$=ECi*P̓‘87(_ ~8gc^Yrf=p3HJDO;jSb_@di߽Gj;f?`Hɯq%grJj[WZT-(\4.hYVe!U_- ӡRcDZB611Yly,4Y,o X K̊&lUQ[z:(r I9-EzWu;2QB*Ŋ?qJ`J>G*<5Ҩȗg[ّW\^1+2R ].ffkV4s=U7cZslxXNni/߂40iاÂ瞗Gt)lyyު* *4n`ѷݧ%=t,膛q<*YE64ǘ8Wzd-Ӽ|!8l6rqrZ9q@\2}hB快!6$2l\N:$/uĢ\Au(`TT mv#i91k247l q^(Wf \I|.2WCL5á^ղҝ9WtO„\͓rۡhKz}'wyAudyNJΐ[P\f4iarsUj$D;*)P 9Hn3"I:UT:=4fv\t^i%}b[ "k۩E}f| up u/1-ALpD7-VܮYI$Jw\[o5h'^D0D"tnC0Usj Λhfrv5at1N(sf$%y{g0pAEsw< eQdV"I)hhfHŲ(W^GH*Gr 8#}~iXڀ)΄Z F'.\3\ϑH kq:~`_.!S2K_ H?Z6)3W3ET1n2GvJ+yrC1[[M8މt 2mٲe254kZC)rq@A;n,3.W4tZ:hXdռhV~_\LyUWΪlQw4XL>0C1ito$Н:Lna5Ļ=BDn9zhaK滎QM*7˱Hܙ&XpD:R'$IBnoҵ*X`X1.0%M|9Nk9svmd.-W;BLv :7qsɔYyFIjA¤ "іE͆z_T:mPjdus{m3с!8Opἀ2Qjl4cUYO.zC:X՛ xGڽ7# :[zT Y>x6͢`ׂY~rJRC3_MTO$;Lfѫs$˜1bz%bw5s#U;Ky{qX7Nh%?WdkBi.K.f4M.,:(-uq%3w[d 4s^FI~0>6.Βڄٔ`[EaQs˽r9/)<$jaS\C^u8== M~'J$._uq>*bML-uQj klF p ۿ/j 9t1monF ؚ_/BªعO"W_VbWJpa.]Cww[{{G YE3@k)M͂<_ljs)g aLO&]%w<)d)Ԥ/Y}tXNh\rw\3>S`yԧ.:cL1,΀)_%Jr-kE,ɑG 2{92 !RC-~т>228.ku:pI,s!=+VL NūǐLY/*FQvmd#IV42vu\uK18S=l,GQl,#X-F@[BL '%} 3~c-& X>÷<`hΜ7H˲Kwd)_95~?9gcd ˿Ar^].zwdÆtʹ_λ]/?*PXe)%#UMZC/yy7wZlnxfvC !uآ֡-b2XM9umтըֈEاEp) [T])E5͏#hGY 1c;qZ)ʵgG5eFA,+=a'UCd¢NڅE:M.csIqhܝֺ[?!ܱ#˚}jx 0UBJqZ(`--Xp2YL}4"fW-0ǬoA,( I!z cLcYo]X`:8]t͛7qSP巜mZ'(]KRv9EaM<:5d,18exb:+wm߯4p0|&TY싀ZR1s9g`/#E㕑Ns%K+,7?I;r T]bYk۞)"qwb{ɱ{DzR#eg3޷*'t7,6-<Ϻ?t eեܣcz1ys~B4!<dVD%>{NH.`,Vrcő}6iBi8:uԲYdy,t`iQh¶MRr$tY7ᤓ /hF+!RҌ'K:aÖvOԢa;u}S,gai˻L^0W'&^od5@u7BMGte=Mూ:9 LSse ͆]UuG2 4Ź}n3hZVc7Ï8 K[2Hy)i/:|U\4}8VFb#}76_TbFq\QY994 aRfad5 PӹTFl64J4̶CQF.nPm=O#H "WyXMDhhKP.p~vBh]=hc2a!fԧ_^``MYR8W#o^4N~Bsrƴx0gn4^1`s[^/{oErX)ziOB$YnXjC527b8JlyPV5fdzh&8ah㐤Ş’RCܔIUXÔ2&1z?~;d988#KΪfDg,`ѧB9\yŻ$n54ͲNiܾR0kZErIArװu\˘ç=nOhu]I#,͂ *tKID4I A\h*\k *,&pVFD#Xu@y갖H8/Θ\ VX5'Xw0B1MV%\hL΋ 9 A꯱-:TM^7Q9h*SJHZ0W%ݼ3<|< -"t(7]ҠO<ͷhD#p+/C3;jU:zJ>[fnufJ"ZX8%LxKG`ڡ悉D!H (U -'{tY2zWPV@óQ>!mbߵv] j3LJWFeVŬ,Օ-gA1ͨjޑk/.GxlmE$JFXW]iޙpUtj@ qc|y@2V2oȑ|։HZ+p [,ɂn46L-.bgY7*H[/wXQGhc.QR c[,#JܢsӻjoFվĥ<̓Z\ bW]X6HckIX ޵i0&IRǶA'byʙ` ~k*ڇ|֗ lQx̖ukYyF{ 3*PLeft=Z`,2bhdW7c~NVj^IvL t0PZ#딣mMb4tp`u{A#L*$g]'MإPJh~o02$Yw i v1(n΁ql 6sfB{QDJdܳĐX' vȪ ~S(TH=;nO/0\TTx,χ F I<&wX(aU "N,sg-,e!(\ ``&JQ |/7}k9YD?#d9l"\ђH'm*-?mbݭzI FU0usotn9;<_϶ףدgRO к 䛯/O*jo5b˨pi a!2:jf֋,PTe#`3 te(نQ}6.\P߁o4=\\]4ۭ$lnނ6ejnÍ>`OxJ>h;GR;-UYEwcBm)%N2L îI\]pؾIjw:7KD[\}qAf5ܢ`:~a`4bn*y\ FZ+ms;K# Y休\#'=xOҷhZw1>ddi:YkYd!0*˜jr2g0#(vwGxAAٟF]0̜}qm8WLǻ"[^J*-+쬝5S=En9 !z:VttZ3)\sɡ~~Ӝo3 Z]60t`Olc_f4\rDXcR0qf'/ZD&95cUYC:7OZ274ڑz@lsYfP{S{~Y# 4.dfӴ2JCk&7џT&Bq8C{0t(A >\t ɡp?^-KOXk 4Ik`$(9 s+@yR@ek B9R\8kv5Qa|hm`޿Ae>LC+* A"l`WHpZ3,jamu;?ͱղA@`(tmfmE"DFE6Do#SvG|ʕ>8C|pѤשacUJ|Uݧ:,\Px6n^Fhb- !BS{gUZtࠆ2IKfbOA 7@-q,b&1 s#OPo}E*`ƛx'UL&{8a3jlkHTqEٌ\`R%3JsGY,^w} 󭀵ԓF5\K8Gc27irU}t\ti-Kq," BB;z*K8x[s';*3%]0:fEЂ>-heNSHMz=@$LϡpS_ZdQ77k;dod#8O3jrj $\v+*m|ވǎ ao^|_1Ř]=p &R+zFOF;xwʼnʡC~xEZ b"iWE#M1*]Pt܉תrj)oV'<,.׎ŪQcَE۴sJ؅uX9c5 ˝26&GvQ˶]t>3li1"⸘إLv5i7ޏX%&(wR̿|6Tԡ }UhPN**CTxnjCoMRfaoosw-٧iySKq̓:벦H߅gtO.c@* Kru>D Cl4[uSk7+7 Q33cإ}Yuh_J(C|uDg "˾A܅ɽjߢp_ O{XF&~Nrt؆mKaf*XL_:v>p8B Cҷ,=zyBC G} xgY49I&f?G2 R ZNiPU\QA|]1 S *U">cWPn+aeqe{tsc{(ϓVJ䶛הn+=>޻G?2q>Ѭԅsiaqx8y!e |VIW ɛ'Wq&d7OɲZ* N=0̀&#J IC%Y ^ y^Mk+Ky^zʁ<\@rR , ?O.hr32̇p4w'~o̱4:mJŤ IEC"" xĀ"{^J,8W#) I*HʟD@|2{Ӟ oFmJi( ZE5@X&Awԝ#/#"rOܷ-&IlpBrfˊEdQXq΢13Z x<,m'_$i$a !r`b`I ,eǚS/}.0I&7Y&Ow&0t)b1dk%&1rr,Rv a\^[&L>sjXG[HO ܀ysHR4ATnupfР h@ 'S)Ci])^rؕU@Ơ`W}~ L, B'>î8F( ->dSs*A$%*e>Գ/UѻK}ie51VQCeY|&IU0%f 06R >J94,<K|4Gz^(i@ JMQ ~,hUDc  6f4f^At}wE6kӐِrMAFޜ-{x+ŕc{fy}wa랬N!`v1fP:=ݯS%S'+¾Tyz>}`^`1$ygxlMw”Ē^&g[! ,s3_pdu0 ):PĜA > ץCAbIۀ7KEn }*PhTDB ''hĭkTL#45unpGa^(2u`[*MGS(xe<,.gtwKc+'4K._y6b@>F]Ӻ-N午E1c`w*X2_2"NO Xꉼ&IR09?6ѽ:(@3a .T2,*A'MJWLPOU\E#П.фV$0FEN)EONBSoԀ5ռZ)ŗ#I RM;2ޟ$7snFЙH`9n 8 Qq+EjOktjYF ɀ_L\bE3L4Qڲԑ$Pe^$kԟKGH:UNr'a@iRT2BYA=6#h6硽$E"yፘ ,p|#p `v2Π/p̀.L[$}Kl`I8^,FO`0Z(SX6[dAGR- H.< 18RA4,Wouܹ,w1`Nq[_i]ⰸ(,O)ϨF/rLGeWZ-O@{aezM{{MMr,f^"oeN\A)Y 0IJ] \L&>W;TrDdW P^\@Fo=/VO H.*MRׯBt:%'@N!p7 ٗ6~GD z3%7`5ןgRRlN`Ti^Q  $LԊ$iFiT.Ὁi 0̫,02a~w1dsv RHCRiH=ɴJ(hd w9^'heM&G 7cĴje݄T $j. +걪τx>bed4@)+>'e&a 7&.7gj0CTYC<ȴLC1 B6Y\NC~)Oh)1Ll !6%{|`*JLF x)-Z` qa}c^݄?T/ll8o+ k?Qs߻e>9x<޾37 IX~X71s10]4*'YVju}Yݨ—͍ͭVekU,\x+Cx 0$L[=DI=d![a}_<nbEСZ'5dʹ!1OAԚW~lmtl>f2@m+˼:>QRrU!\br:;OD{m,R? tɌ+ϵ4F,_Yca([ 'dQ3Cp0LJ`(XN0z9|)Y!4Im|sIYyeͨc5s' JxZOoWIVk^F""nz}Hiɭ@sA)?XgF`3T0G4HZZ1Z@J+ÐD AAj*ꐜuvOwݓp0 i7jji=mJ1 NWD/"@I&%G `3AJyp8[Tgum SQ̹PΞxt@4YaO"̓様0 !~1S礈߳w{Ѝ\.gz Vv'*v% ,W(f$ lڱ lגVHSR!h ErtXvL;JdOT&Aφ8u%E3m7KKDiyz2̛A] 6^g?}3xz3ˉ1G-ͳzeL+ݮD20*II\YT2?dPrVO"Lb,㲌uΒ\|*$Dcym2e RDAZ^a!QM!d<@XŞBǐfu¸5åbх]y#<^w[-:{qLIiXQ7_}$_FDެw1dw0;\"FDQ#4q4Ò6fF. F}[a-.pLy!-';@բeJ2rw(8L][)R,l(e4+U%= {D@X͌pȟM4;Yfj%rIP-ls[C3pUS-!ǭ[#}[Vy۔>0 #JLR$Eܲ8ol Tzn~ejl:na3FgїIL|A]E0RJZxkAolCt \|gr7@~ؙ:RTu(3~BC*r{{rV j@d$N8 KQ% *s(URvos8t+, Q^Ao: _B,tı;b5 {oast |.;.gn4- xiHb:CbALq$r!f^*&yBFR[m%eitH 5WrK;#F|\ǀ7Dz](vdH`S@|3Ji!),D~%Zn^ W伎b|:a*"{}#ռJD-l!(ct_#i]q[@nJT`Gc SKף"cv\]$[|/5+D \(HA${;&cst ̵0STHJ=s0Gש҄ FeFbq}yyt_|FbE m*׿+O=WoU:;r3H-f3jf@$WȊBmy & ot]ָ8ĜšPpE2B߃Zea}JE?P>TR[Ь344;EMsq5e73Uec%YcR]`j%T$F4׈/$Z(HLa8SOy²Va[xݮ۱u6fbޒw> k:KA%Ds`k^U[>Fcyx㊅EZ=ܺ]c=X0r z>_EQDb)X]h?Q-.؝h8P__(a_8Wg[xE (!,@Zpok3h8`uP]̾$ #Y|{FaE^!4I*YR'q<+gCTy 9U0D.&U>8g9F>hE/)]zԣOqg..,{(* |e@1|o`Pn Ns T{a{5&C^xQb/M( ZەfDQDQ5Eb4C‚ר"&P C^Vaɷ֪Y44la="Q>JKӒ8qИ0,vrΜؐ(O!Eg" 6IG+W-t%b& M_ZYNBn=Rv@P/uZ.ҢKė,7eϢ<]סA?́rDD9eD;/V+Tjvl? .+?!{>cd!%]@fq4LG)qJhdIU Yh]?[W^GhPpq`4.v#Pw\4ӥw9"\(#l.ƵI`m sic-ɷy}jGϯؓKia7gj!0tqFEN"QŠݯi1=1@}sL2>fuccנ ۗ|b}\캳Q-yH}+O=Bt )/X$<\_8Q獫."dY]R3/ȥv-TRWɆ˃bhcW Ԡ넝NX;dl\%3:\n^Ke[g(8qМ.$ V炲<)Q]*[E u3exY1BXQSh`7D,Ս0ER%q\o )fTde\TM.̔'Dkh<6bxwDFz|iM?<:5:ٺP@.7[ ;Q.ԱE`ѾL/xB]sGZ%Q[OboGO\ȍ lQ1]6n阦2Ѿk<g`aڐ#&ξj@,Ex{֣/*N]N#LUGW"uq`>ʹ<_h,]8^i4U]0v}^|! bcIί(t!|GDU.x`FYz kV Bߒi^@ R $7d&f6Mb^D&`֪֪*[F=-e5Iki^SCg |]QƂXdj]wCU}vOwr|Lx$sx03&%aqY嗋iingLjHp;qD%T*rܪ䤳N '41AGrEAbOS(z QWI3K_^d܃kj2˽Aݸ&{ 7Yq(mam6pP:/:fS~ 鞏kyBZW융Υƙ 6:W +1 tcDrVLbmQ­گ{o*)}ZE/%wЁ_Nj} nc*Uq\GƢ J{ } E TRDkp%+; Lo9|k>sl/7\::x7Vt؏)it'PgA!v֒i* >m;פKz3 .(9h#lmG"Hgv[4h}\pjAIAa"IKW6VIp,7ٳW'|ߠae6kXtm]e,0;h#BtYY靈;t]ȵuXtgD0U*+t#o/)U7S։`.+۸E-h2ʌ),.mZFj]4,+5 3n0G䵰)4!?@1(ܧ|@ EM6z6I銢LեUoWmQlqB):]7mUPdɢ(ɓ(o;,|rDwo^odAXF\Lꉁ_@Зt73EdrqN 1OZs=X[_>Z\b5n/-\/ $x|{އK#@Qeq@QkI500iAՊkfUkEù5!ȑ#)85^:M:%m-i, |EWkZuQpxdi<;F=oGUe-Y+vK$궒L5,8d弸`3PpzT$gk&7+mM7.d@3E7:7ZB[BZ#W Du7)CO#cC{1UP3c&Iҝ x$Z3D3xğ&[(PL},NX C(bp$75&sUOLF`9E,ۯh!=]2 _X2rN@"r,Z S0<}h2h Be~@14*ޘeڥ=,&, wKL~Yodse`$0K͜:U&6鉱 MW&}^1EdBwyZszr(0AgP$Y.;R=km(ܹۤEg+n)7Rxb'CJ{{;bb8&ͼR®1x  ٧@vX\ >UϸWI0fdFF{Uxvhнhvؕ_瞔Eڅv-m(!)ȺSVwp>F6uI ;DZ[eZ8-J}5!+2mQ (G+P̭rQa$x+j#$@K]M]}.SSǀJjW4(%N_(0VL6IIJn:u(' ^n$6KŪx=Qmȹ1 Z~~HD恱ǝE*C!FwVaKEA;¢ԃ }ފt<\OsCĆrO@bK(D.{LLzcy4nޭ]+w+mT[`+6&X OfLX'Jq ^D;66?\:/B o$ Y^y#P)+E=U/ e8"%L MSh(n(:vTւ,3[{/pC8<\/Ud)w5~n_9^fܤoB{{WT6:-mhŸϡdy-7 ͍&2[8wދ{]YXC<<!\t/xv-npr-҅ejeKG^x߹.*qY1l3䎜F~Yc0bIue.r.Xގkqہ6؟[>W8MY[ qd-^G)l h(E^+,gmCE^]~aB-͐>1mlx̲,+!!U}~!7JEgˀ Լ OhQ)dQ$kck#%ezX$tmTdZڽԣots ˈG;reK^jw@؞ۇw`\EIMc/{pމ~Dcrh Y_YHS Aa qv-8q$]G 1@ C | Pv"Ȭx׏mk/[wKvʲ]{ %a6 ɞ)*ڛ>}#}iV<[ql$aA#u>k'6 ALhPv6Uw/M2roxmo?㜺=5tr C_)QX}a*UE0QEQFCI4y ֲ,eYYOCrqDC|G|a6qq|("w:E Gx׷uwRc+83YݬW\;=uzOy¤Ir&J4pϲW8ޟ0KʻX0ljڬ\m̋UUf?K[yYag= pvA]>19bp 3_[Ariֺ\M$VYIe~8܄+5=3*.uΎI4"f[hL4.']*. '[\6ֿALFIA<`aWd3R|x=F5nJxlƵMOӳݽ Q] jJVюVy#HSwCpgx[ɑWo}7X# .khT$RųQHݮ@1tߊ\ƱRF");B v/AIrn[XCO`f4hTI%aHfe7a1S2gֽ7y CTeĝmaQ㫂rAeo.+]dA_N2dBw辟d,on~q? "W_.yЀMbߚVƏ/+V qM&CVpv/P^'!2~x*sA 4ךIhSO;,]"/?|ɠ w K[u甕:d?x(,Y%@-țW;ZFsgoci_ѡ&9٧B 9F32sd6UG^OlILR,k=zod]qL4u1둣"^|zyzp7̧3,9e%ĭQq*`hu׷c-ƻt=qIY3˷.'~!R-s5nMq oMD|i՜\SOBrTf2\rL\$3Ig[ؾȿr 1f+6B~a9h)UbYk xboo"n(J!|%W 6mR!F] kv.=P3\CLq?.qR MZJ_Pس˿.cѝLt5!)?),,BkZK!(dLL@R;X7V9+kEweesIhC@D(A e^bnkg#rroXȞlN6jIOJyph~78tH^65ѮHLSM8F4zCPn$Em,Vg^,t+jBk7r0)q,U{Y|8bR'$[fH7=ry*JÂ*3J%E;#eo4MRjeX;X)X&|jQfr2"+ _ylaA\~7ME a=ʔDo-bGܬ֧'f]HN4 aUGFJusWE'J8NtYF[>yFou_ 7:IBhvm5zʢ1x\0t\eo8|RpFoيc&s+؟qVբ=rH5,lt܄HO=m"UhH_Q݄/ xk!4b_I|˜j#I0:xP|+7ft$M´۽ˇncS ..w[RbAxow^X.QmSʒwv vYF:8J։]4y#r]K    Kec %Bg7e`)6p,[f~A\qlԩu&pӜMF惡v>-)1^1wL&YtTp|sn>,dNqBQN8VF<iba弍jrP{4.M .ʻTy,:.o 32qD=&[\W;3viP69mP1(Жu:\YOMwbQ=B{ݻAse\{>)+9`ߏ2hQtmh$u[qC-(ueJ_hy_9DEJH粬wB`o=sxc/FNt:։uұi˂s(N,41KkD9k_e -Swd7~H8a/^#nWL?K-dlYp6ӁU+r.s%QVl:t.,g8d+/xhPeIB$[,bs%nlFY^7[+M+jV{C?tҋ4;-#ȹV+/޽&azZOr0kI.0#i+zm0T+z? `^>Ycץk7 _# G2;ԙt=/WZ fe I}Ciɢp}̌V}E-gM6 ٬^ȫ4-g-w(X_]U^ &UX*-V(WԱd!nIa-~΄GjٲX~@/6*zsL5;Ύ(i#_;w7R\^ :q@rx;_ܟíb ~aɓ, Uc:,&`1ULtqO=|`_KoWT ).E6 \kpf3ԙ ӆm01n(JNdGĸ ~5Q[i++UH7ps)tѶtD8")G=xȑ_&e;r튂Ŕ;i"CBX&_Bw@h6ۦ,2!gMun2B3셟k;7 ؝ o|~Ns  I 0 ¨LBѰ(Ȏ=@-Q> nXA(4;49h(na~țCc`C}}mB99E:gbmq\¤kib!/\uڐr[󢠷P$Y^7a?"lA9uIwq/)]x7 :36nCnbu rߪ\% TgvP?nf't#i =t{ǗDݷv',nA=N=4N}E˗%~9w<1`B5={Ik$}ԝ ם-Mk .`Isxho^cLžAW3ʈH^|Zu7&>OHZؘr7ˊK'ޢIc[oa)g.zE5io;;еG4+ZX-ye.F~=6&x?$>8ƢP"YxUވ_rO7'+!u,YI+2^eh@; qߙ*=1h*R9%nEHbºĈ Ily+*/&x!a9dӕ'*6˺))T, EeMܕC<u#pg#&*$"2{*J6oOaRQ<bQ]BNZIܝZV\+޾Sr.;8bw" ˢ"fY}i&.teBn oz૜:liIe ԩqE łb,/rus&.rbF7lR^x8X"*aJjc3) Kʟϳ;bҤqdXp&Nɪa(ofYK cohO'=#6s1ȷEPeAvl9ReukJ Ǵ)k'E }| ۳qWR>.e{*fIXy[clSkYm{LΫ/;bϿ[m9ʵTBLM%ƟT) )DHR|^ia&97{٘ t!icqt:&,< jdˢĖCы@I?q2.)9qG@X8.=TKO;&q.eř\3;GpV M"Q Tp;-|,6=XHNyT,v ʫ76f-!aӛW_6ځBCSF}y|W]gaRUv_;-@;M%98".iIB Afp?**;AAv "(J\a߻{]~w_*'*Jni<7g oOy2Oƃl8*|S9jħ^|$5f?aI78|M7m7N7=wSg7'-Ug>Gǽ.@t>K]@b_^c"&#: ܓy%cop M'Qw:9a`Hy^{fix o3 2)N#s` &xVsLUF|<ϺpHh4Htף0 !iԪWVr^|e (2$tYF'dexu` )iI)[[p@@P]aRr%|fW> `ޛ'Af#>BiP(p$sAJvv[4bԢ&o(;LH( A{d8 &,#iY  }?|AvFeh2Gz5ac)N48@0@HB*gpo(4PXND|9!:?ŷYgTyq] F.,.Du2B+fdwm;\7:K4>??;?MFR8ʪ,^+R(K;L$iԓVِE -.,ם܇[4Oo•S@JbX .ter"upҶ? Q0i4au! O8 B0w: f:}X@9-SKaJ W\XhZ^w8̦NE_p,7#-pһ}<{d>gD0^ E Ka*>0^P]&ݓIV^ě@1Ț؉%yqŅZ ,W2,ږ`pYQMHm|\GeHѧ#Ռp:21C'rȾoW]kvHi_ >WF\/MmHNO孎wP2,0(Rz>Y.j[t;]aPO,F[5X$,vCLYl%ɰ<ޥ4@^K# trK u@ 8z KTd_oa/g.q޸  PmK$H @U&FpQ΁rh5lxb?CRfSvUПmxѸ<Z74]K+bs_ӭ:?żП)q_ bר/0BS!DPVuŇF0B !~kYDOK8/RebxC!}Td%)+HP6]⡡bw냰EOѐ疥C;l҈AE*e~[<4.G227ݝrEętA#&`=m^lE'eda4mEhL Xvj E~6J{;t,?3-11FCNld *p++9i21(ȮKIYKiUJ4I|Ɓ_?2` iM4$4@Z(BMX?e磓HA#.q{iZY|Bò K$zL 5`߸-4apLi{|IhtQ#ވip&RKq&J] 5D}E|j2Չ"F&ZDHLnq@SKc\K'?s֜-hd9[J M@5fu@(B -yKjbLc?5)KAXb lxT qef1szθq'C0ZՏhox6RjeQ*E7S? |v&'4,0Ү 9뤱^Ps ?G4ع MB?|B:qP(+\G4X G4%gӿ6Z v9юȰ`1 ,^QE'ʹ3LM^BcAE> SÂ^n@"F)H+ (Kٽ K7F.f{`rN?C{\,I+40ݬ9G65fY`!w0ɼLDy4jՊ°U(OXAG(mI#$#Q IR QPNN$\ e%-"T茶?&Y)_<*<=N/ >~Teő\:ù-w8߬#0`,0?H٢6$Eµ R.hiɘ #FKS-nڪma"WVb{4kֿ sQLxM`Xd⢋}+Q>J<q1F}*Y8Yv@^| 'lTF *ᕽfscVo6xe@ u-h,C=?Dѯ-eyT$z;( hRG}t(B?w[ dK]ea:OzpwjP@`۲㑜RRGX}EPp"=G%˳ .H} ̘䰜)X\OX& T6rKDyjR~ř{XnN'8mرlémMœTzzbQS0ph%tF|A+sD|ja?u3 `3SXY`(PS-2'?E8X2XE.XF> .+ja8l], $. PA8`JrK_M%?&t9t[ uSQ$prŨ(SSr|C"רo\i_R7V2?Jg~:EalLmJU!2-E!arXnlns30Il'U\Uf ٟCF,!fË<$"-yWPTgLtx`t x.UOzTNc4Â5,:5dȎXC<,) Yd D`l)Δe5„<].54d`jzXf"7JI Dx( .}:PjU+bQXM;X Lq!"mQ MǓ 9ו{YY'ZX A-lX: ^j`* HE]֣\w{.}{gJ0f(:Ԓ3vUr x}cz"A!w8uR?pZ?P9=llL\ ɲpO#1"kޠؘe@m.5?S:cBՒQ GlKj/+fH]4]d;OʹSNr*̗]?d1_^!`u5.4FUHE~%_Ydd/ ˘gU F5F9eOJWMAcZ;y]eKA<Zٺ}̢F92RfFfhڕl4HHVs92Q3w .fehh(cbrU7ĚG;!\5%E1*Xa_k>~>S :$AR๖ϯ993Ɋ (Vb@0n#8כsH@:&P2d>15:8AA};)~\̺JrYXtwXb.77xg1v\HOpCiJQ nV,ao%syP!M?`+t>\X'nR5 Qaqy@, 42{g. Vn#-NU7KKXLGs}SKKY0 ;Cv,#f&@潊:] 銸%=W:H\ip(t40l8,K#b ŲkhEi8!1Us b5UX2i,ۨTdE Y5E j++n଺qɓcfP(aTQ*l#L:3=%h8)7 ('F&AyI e X'Jɘ(;Njs ( ;y_`2h[R"u}j2 f`|F,,Z)aNޓ,zX ZGzp,IRKw疫9yYD I/?k?zia%TSlPrdYʖ/ z.R]!}e6zéJɐ/)5kΡ%E/Xe)'L,$$m=>igҒ~w7g@L\XP 2:gN Pʗ(TM+k/lsqFF~JӐ8C$/5`xB=je̩%fE}dh)L'tr@VlӶ[ZHcЏ鐎p"MT@ RFERJ1qUl[o&8mE%錢!4KnwTͨ569? CzҺ,)6& +tdȝ@H4h؋ ]F5@`kvج=2^o-~i?MbbE?ZV|""3|&:5/USw$aHS`;!qHM8Yz;&izK%5?AlJG]u@/XG|D??SNQfdB)ZqB/Qz{)U4.q7RAr fEg &D3hcb>cs93<#Ry~Fga:"QdX]FSܴ)X}QA9EC -J"dfOt%|ijhfL' 8sﱜғdpfށ(+ XKBa%F* q~b%Y[DV 445s&-׌06"-"?MZ96dIq}{KBT$lP'hjd<(H(9P/-c6ohR !+q8(J4؝(c&F &r"_\tRJ^0a&k%[ɐҤy"~yErH4y0КN*gv=DN4y!XHJK7m4=8h}c=y( tk%,we ?t Ft?9_E+Rp$=#4qפ_>Qʷ9Nx,*+KΤl ͤŪ^]6z)(2j]TV-z儾|I6QHD1q`وӚnZvXb.*QRB/=`<׹Qv >Xsר [\8-I' cӞtB9Fq~&]^Z|ŶnzXsBfl>z#J$4n eyFnaq: 3"MW)VZ:uA,\ </(nU i#ȴ 2ULgoZضTVFSC(YvF96[I%KmDJ"Ƹ) >!35th#%}h_Q-%`bAxFD6R©"nF[NNŁR)JVQ<$APVYao+6.6r( 4t`Lۈk6-3iJ0TEm]h'sxh7f't;͝=",(,Ѝ7/pc uaOiMd[ ZYT.\efBuiuGmN#DsTѕXS0n]V:UmiX@m .=Ζt%Fez]2k d734*HHQumlňb=##8V;)M,^OKbh,qA@I-`[l_q<49mT=Z[#W'@`Ed]ϣcTd&m:WThaIQMMV1FK̊dq`/#Mo /4};:k( m*7MB (1lYau&^or\gd^,ǭl Q2$0̪SfŤ Xh>71KF?:ȕz3Lzmoy1RK8Ǹ̛-0_?aXq"j`m0g [,)s xrv8ʊk$|,թD 58#vI<$?e.Q#asE1.PU Ds3j1 o胳fO4UԀvLhAY+TxWxF`[sZWgnhM@qIQQ] px{"gg]iwgqe@dD\H9M'6c٘g"ꤱ!K7q Ao AFuBx|55$^M{-޸E7Vi8 YQGPT~ŕśU#00 sAo!y$NG~˝97ڜnYhM9.{oҗFkv>!`/8*# YE,pJj{bW1-좤,At11|EcޢXa@-rˣUEE;s4k\ -J2Qi̵m|rqDfԌN:-pVҸo]G|̙ECa`p0ON"*N^mqOA^\J3+(!}7 B(P&i7hpU .-|ؒfFZmN9AF`\=\- (xDjUޚ48ŷI$;YL-"N3C$:Q4KtK%e/vFuwY*Pt}zhllHA??敗&'ӆqL1 M˲>t_?6(9c- HT4r,:UQ d5@;,l_m\8נT[aÂRFo FG HI3\H:jhU)9&(y)7oٲBa=BM/#nx\E&ɨ-6(rK9I<XZZؿI <,;-Phg)u@Y/EwI3Y 9+dXg}wC SXܩl^#op/Y= ka x[tI- O[ qa۵3TYkmk4ZƧ ޢ`_Z812#YP Khn.>cTCiWy9@*wR/֮9/g-dA:Uw[ CK]PY"W\+qL0Ra"P̖d>aY Mؒ r)=s ;쌎vðV}c>I|ȃ_;pWԘ.HܾrW:$4+ƙ^¼B̡r}. a.Ѡ1Jl`Nf4{by}EQCci5J XH/X 2lR&t%nf`$epT5m {b,\b;G._x f-I0׽~qt K+* Ř:U,MCHYƒ@{D>M)[z 4na(W4Sy=e#0 a9>˟sܤVɄ]/[NsmQi 5_?tQ-)zXRE ,øCף)܂|wCREO5d7l420jߵY [Z7,-5̯-zRA0{Y奎d?HXȺɏ y;rXJ1o훔L$ ܕ2E!EoЕT"sƵgJ%i"6LrqErˍ*mJ&xZ1Y0' NzZDk1(2YyJ,Ksp}NqA1+ qV ,8$ XnSQ V H6Ԩ t.d#z_)@ZYy,hfl 7nt'i9%L9ݴѯXON b>[ʚ)'|rpޯZh훓-#,x kL.YRqe0b9t1F膟?YѤNYeU;1 ` zX[jr`|/{Se5H?ED"~L c8Ng_Zbd3_&-Kktudyɦt>䎢v6|t(%8oX>"$r9tVZW` AaB0a}y sʈb|Ζ'9GⒷw*HبcIU}~goa{kk8p0 Z(Ny">Wi\~"O(Qi 9 KbBK} ~@e=LBd !̽FذDerm񢉥n^Ș زs癮y\a9tKFw5KFå Bp0ctCKܞ.\@ VEH8JTshg7]dX(c./RE4ByZnxFYJgl>*rrRi0j60kx(nS)&M,zR΋\dž/bON#8ݛ>(yzjv1q:,[,$ވ^3w\9`$$ĸ~pml➌*K]x6`J4N}6pU$xro5DI)l[4ʪ1*{D{95:XW~M0QŮ{ |m lWsAm:pgb!᳿/)t<ٌymqTng)[ >rXnһTOtX$_k7 h|6YjVobz_ ~Im9硒9NEA^bK?3]4n_8*RK|c2} 18 gd\lĬ3ͅk{ȹMl Sʄ^p6$Hn _jj҉ 9 zU9ٶ@e>ߧ`;|Nh5d,U:-q^A]I'\^@X'"CL901l17pCLx\cϞӸ+ V'  3}K0R;C ([Ύ*l<'\E@vk6D!mW-:틘5."JSOc8-+MO}˘ ZH*atJd)PR:({!N_a ~|>|IYU?*yk8.qQĻӸPnj<g/I$tq X|etNK?׶u[XxɮXz"JLI/?`C&(vy('AI/b~OyDGiwiB|c<[r\*WhF]iQ_伒q8jX(uH]a>^L&c0yH}k¯pblާF_B8s0bl^ICT+Dlxf] dkiъ#VIL}EC3M^ DzIlBX݊9*,$5߬T63u,dتx]~ k>\YKy%)GIkӛ-ˬu@ ɧ p[+Mc E2gs0 ?s@h:o-)\c!O=3f٠"n/$'#*bJ&)>D5<>ٔ9d:K@[n;P+zr5낃ɊLح!rg1s9.W3J̖(q(ʯ]ka~6dK@ڍ:3D\XϘ|d)u|.`t \Z#HɂIn̷+Q 4%qp_gQ?"{8\ e6 ms2rLc:LV X̯6˓\t{E K~\QkYqSZqOz W>Y4[*g0pje Q׳o"u39L@(H[j>MͬD:q1v E{ۉ\۷ddݓCřk2F^1mШ0@bH(jJtaWoQr>;;6,ɪ!|\Ax-xƸ$AYry=ču6,˲^2I3C  yʿ>ާr) " X#%o[ w'\Vahb<}Le@1s l/tIZ);{Ԗ nEL{U)x ˉ]XwN (b@7Yb8,%ˏXJ4J:ONN 8!iߴ8r8(x(wKM|lw"@}9 QJcq{>e;)lPNzpxxSU F6Zp:M4*ULm|l[LHa5 ÞӍoeC1` &E\Y9IL]8)d}8$ :Mm6 ,(|Lž(P"2Uo/t}nW1,8ihcLtW)qI0CN[:.Ѧv%ăaDC~WUKʈoQ"e*w*X\X!87N6(y3!63\5lt--g@{X|*N JXˎϻ%N8,יոl;(f|T2FRAbvԇBc)SEy0 S*씐(%x"DxYw2ap8e6'Dq"ƄC+op-ahwh(&Ei@rWn eYr-ֱ\< ST$K ʕ7NfC|e$\ :W XQDy(Ej$% aH^h(;dODD KѺJq0HZ!XEkf{=*lgRV# s[RKŲc]- vv.Q !I=??Lq b+uNmHU86ti3cn;7n=}jh ^։r;Md:K2ıĒdF-%a5&̱J҈9Q]ChDy,FT`yE/Ő .px,)ͭk 55Sk=k{JkkNܞ[KƉ3 s|%uF\V!F8Ձµ⍗~(f0o ݵz&4lM/p]rqtXa~%\J/GNN ~}mkcKBdt;w%pBQ5*ËCrvh'Ks~@Uv⯭+kAQU=mE * *!QK]+S1tgGJXفZPiT*u`(nQrp3_ULyq:E8VJ=.Y*, JI M@369sާѤTV+tET1v K[rK)! 8ژAd#9A=iAdۀ_I ǶTJ6]Wdm͖lI#.7sK mPAf;^cKt]>h8XZuZ3Ͽ2٠-Cr~kWN7diх~BEdݪфcI 2EHoߥ-EK6-ndVnЈ~*+ҐHSΖ,̟&zMIMn)IeP8Viy|xxkAC'XN=)U,$ IID$!mxwUKiwg.Xxoe؏1b<U $TKEU4we9Y1XV$9/h #P;%N ȗʦG⁽ A$g`3ZSm i;@U(Pn/0W}|hg| ﻦUbZz{EYnu8N~SڨSTqE}B12kt = fgl!k/{ԡ.ZbGHG6@S5k%sK:]Ek 9#CSwgqF/\zvC?@NN9!$x7Z6hV8veU-tzH9=_J=_vuں/ȗeĢWXG9Uژ}9<]ݘ*bWZrkt.jE)WY rAD:Iky_p,~gNapey[Bny*8qrɢmڛE ]gvn2TG BFv=97x6N^#M(:FYKQȌRiFV[&J 85v.3''r99@nZn&Ax̀lt3jަ'>9V},ZnN!TA0a!A]!s&QQ7isM0i+monQqjb1 V0h u{,9[5a[ċsN+3feLcRrd j[6,*m:׮  ݜKli/ޢYpt|a)|\bW0- K♳u, DH#[jlXEeYoR,5N%;x<:5G~)0;,׫'lb*EJ.%Mu49K%mՂB-ZX6ǑW.ps|*XN04,F^{=IŋXb))r.Q"+u ӫmD\UCPgHHF:,Ⓒ@._66j }MG9 5DsgCrŝ}JKzp&m?j+OU$ƭg.Ϝ/˹1y9o +@UY3L> 7@>Qv&AYVN5}w+ht(5$MedYL,YGzYH&}5]FR蠼cwͷlF'7 -D؛@r]Po,/sJ &04C{<¼euQ:f!`"'9/Y[NF 0.A$ɡ&^K> ܨ1C@Ҡo o2 [jyㆌ:ڪ rWŞV}L7 I[Ӷ5HJk2'Y0ubX2w*Xti@XEPRKd"V@(l$ >[n'BwY~N!aV*oR ŲĄLQ:H,i&x;- >Z*Ptf1.hcKhDO#n-se*gzX_߬նjx$la:'bZ@b xLBCC} dY_4s~YifƲ~ݯO9eKk㢈ʱJsdfKJb8U@+$@b 6gymW?ՠ;Uc[g#ׯ?lX]gY5d8ivBDa;:>Ӣ xE^OZ((oi\d)@4:$Y ;1p>E(ϳ&9#wp*oRgP8UnϞOhzr`{M#zN&ny}Sf}\"3^-0cD7m"sۧ4vcZR@T06śnVƀ"at$10CTRD}t X՘Z#8;YeMi m$ k? 쳙bctt plS &V`||vEj6DC R{EZi/ɀ@/ǧkf_ EpK!2 Y`j-˓dm ǢBis(`͌neQ\$kZeŲr @Y(kSIM8V+~)%i gr eRT fu/M '-;-Ө"gg nACE< Xti L^XS|+/.s/$^ӄ# ~ed r|q> l dDt+;W-@s>wg&j@w0]*bL\*Xj:XkfLs+^EӅ,&U.dd*[y37dHIAiI 1g: \ 7~C }T =Pb̑Cܬ4ˬ3PհXk{NXT쓈r||D2HLH'_1b%;&0Pcc( %RO*8L-,wr/bU(JH,[ߺmP>׫llʢWOv4-cHmPea k}818F4̎m-(<\f}QT/*f,NɟlK bP}'#80GISR$%o=i:f <H>yXe {;8IL4\ (d!ڿOTܺaE)Ax:#=>Zȶp(jFz8P 2o9r]֊4Zr*U 'eJrܗj 44:`ɂAǷ%O Ư\2,kc"hr{e,,hF hAx` L蘸\@m%2]skq,c5&tyRSs$TKyuNbB# LM<cɹ"i8 C`(,,|Yóbaay,,d^Ϲl,,эIlQ'mH<=Q$/R@$HϒcZED"p^uib@ntbc- Cк Ѽ~>axt\4 \.hYFF#2! {N]H,~9" mNiɋW*tCadB睼StS 5;npXBJ;/mRp@_4p,Y b4#-:Lj MWiGfXM,/h^@.{5]JES*]2)Č_>I||<<*``hJ %t9jGa{gg$_O6Dtd@M qP"6:w:hx}L5 4VWgâڣ;rKxǼ7siP~vPnk S?w1W\={O`>>0\FLaֈ%T3F8 <0 ֈI1ic>}P8܃rU{t%7P} LY֠ ^\^QgX>*w Sl0|<R%}#qit'=$M5Wy(ˆ- !FfaT2Ē0&}Cr2Iʓ(_7*衏*CU>J?(DI{1MHI;EOS/qX qDyhhD\pLFBHLہTa$mug2R9[qTMRFPKQcJE.waQ2w [>%ŏ8_3z3()-NPq:x2WPHB iwq4%5DaH/)"a7rD, JMH Q@g#lgrS|ɥ=Pʘy0euI&/*_jP[dH. YPEEl=P2~Kj٣i)MNq/9' d@dq(\{/'}Bx\Gd }!I7AK`H<)Pr^ d*Y$TR"}JBb4и$": aӰ+Wnsdmq@Qj@ $I &S}"܈ÃyaG$hCΆaKa'$M/PCJIb Lgvr@AJ31D#NP)"NsCyTxP*"LCGh*\DI4i [:!x>I;s_@QI$-YtL$#q-V.ŎA$fHbfDr^W79eK>n$JFi}Rb|@"'|7:>S'HXaN4ɣ:;2@A0C 7_?`((`9,ebyCp[XMk%㫕s Ez\ʀy4a8:]`)ez%W3,^&+&~|QZiKXfxꄲ.Z'7yYCg\? d;`k:7'& }څ9 iO6?z(JLu G$X#HoXz,Cʳ:,/w`Qa=Y5&&-'o bMx{p^&70`C'yC@Y檮qY6w]A!lS,ṡ~ކ?˱2R"FT9}oOl2 D4@*>,5 ԹtO8.Zw4Tӈ1ܘx@}g*`[ 4 'D NGt@/GCyP¡2JИ$d2c&a8nX^گK%Cb lQȎ[tzSSLbr,R4 (<6P.D4Q ͂toV(w=A.؄w{kGJHW{pzvdBlRbk3ɲ8E/&t}<ܑ+pqY:tiZ;[.U0qdC SA;#P?k|Ѭ+ qM(T$ܛ2#E0K"`mi&-M{^lӖ­6pJsTq-b>Y`Z~TO>dqKl h_߰#;VIrU 6Is0J/|0na$aunx(I~$4u>>޽' ɴtM|鳀q"[&Noqe~Z2/Z&b.W$ M" X%PݖYo[8U*U*߉ @?{X&%liq<.̽BHVɘ Gh?GZP"F0*5Nzz'Sfdžnn(zHG;PȮɸW .:1C&/(R@|^'ƴ艃L8ɬ:Z7^5I1p)Xe-+>܏E-ł8V(HR1y&b#[vť@6N@,]14 h[0/2G} Yjr@]+1l:µtXVCqt(m_%vv>_1 $:&; )Bht7 PXL-:q]!|AW;)C'TdVX!gHqe-yJAb:{OJʸ"i>g%#2E!2^!*:BBٟM&!={BIoCj= m Yfˑ K#NDIcOѰJ>f}E 1MfrВ"DAy3bE9 εl扰ٍNKPFsY],,(oczeBb;/V hFġ)8k .@~Iv~HvX%ȑf miWT-iع'^&`}p[&w=:9 ½98̹lK V E"OgV4wx&+jt=~;^eܑ0s.+E :.C?-$h%a%O P@td.WA-Z-Ź6 @6WIx\J%a-f~!G/>apл4i" 40 'v5绥+y8틵'悜 4}dN*|.2-lHT̩d701u^X2NN^T.[v[Y*pv.78&Indr8M7fwsQz]f*iPY&c2g5^9r?,Qm6YNxwF,h/O.I:mmDxe+-VVחv;ʍ7M%v,HAg z܎ÜUt/]$OdVpŽG(fBVLgCn–gX`';ۉs+ }Ik~]iMYPvEεI,F|\7v!@R{` |Zp חM,*$Lj{JDx8[@'WvgXUȯ:wG,ï 1hod6ngVr݅.5_m$!Oz`m0aNhRrUl!y]eXP&/O{=Hbq atʍ'o?,N:@ b!Q$ܟM<|QЙ0yB Ӈd2`bSYڔ9QcUwd1C`= lɝ/ Npz4 `C/V<&$hmMo)8Y$f% f T1FAqϭI>wZƹ6 a! sVrPQU)[X(L4Wo7nႿ̻A;#s<+״CdM4-E娋{VӪ~gv_@,fD 3 @_ۂӌHa`89C$jQ5O.oei89˂ŧ>&ô,:)n (rm'pI@4zfa9 0d&ECr|@J> k-R{LpJ$ ];6dP%sKD3[ڏʋ´w)&oS25%3C"֖LщL^R%> شTw3MK:Vq|ujnN,P 9VЁ[C6J_VZeGXk)rනd|%u;O ,>/}%kCB$D2<m"qU˵Ӡܥk tuwŔc\CaO{@s4^N%g ex' -ArXZjw18:{<RZ~y_!ћ7t6%@~$ B1{ ^\XK 7} o#Iuޅwx >rا5Ir/ڵx'HIPB=vgE %]wƠ,2nͿ3ojY$=йJg.anN5ve%2e>8 tb .Yra"]w2aprAOۗ* 3= sˀj1UuƻlD4]!VH a4th#KV#f1s5 A2 01n:r:Ylء.ȹ\C](kv1p4q|ag잧h'[ÜɵKuvVB>$Ibc8:UP"̟Aᜋ&k@m"|%Ls:)Z$r 19KHqƾG5=/go? e~%5& AM²a|v1eC˓do qoI}L[Y ;.y{HR fτ#$߿\nh Ф'|!l|Ծ VYQjD(X,NX>Ps,?< Sd>m@s]„X YYAX=:qIs-F?sGd2&^(2l$YcWw]5b?JU>*/X4L1&͸toξSrް{ϖ&AQy|%$ƴX=K9-({<y9 ;?dB0{2-grhlG]moiXQ» ǁEx_g''s"v@;:"}F(y{xu0@hrˁrZ!NDF/)+:\t/7ϮI&^VEl,K]G-וʹg \/):St.xQKoǎh%^P/f[wV<Κ֍ lf'Q^3)#jL|4|ʟAGeAܳlVq0P(SE ;pzꔁX ހr{2Yds˛}lM#QIcErqHLnF'|`yThWd-~5Xayԧ]ʹFX =`"qVLre8? SXR+WHTx%UXTͤxK1يо2YRX H {rHywI= I StUif+ L;;ͩƔhShL $ϙ(#%h;~ ='d]vd25R)YэS_*_ ~"yJaNw?cHW*#khV .zc0gaN6O ό' e^0ErnΞoX^AM0*Ƕj $ߙ-pvJ`lo Ȍ;U<+ E&W~Vko^c !e2s|_b]SQpCfu$`$]P|ߒELi}YlL7|j\-XK99o {D*Wع[=&#˅xHGMr{In9~OqE]N#A7NYުMD;,)Aw3XXBSPsyºxIKvmV]F6n!i4]i*q%kU$d\mgCrɩxV?a?k5V7)(}&=; <6T H"i+>+kZW C<\7$C6iHMt ,k =6Fc-;2sn'p(jeL)άB -gmqcD]gajqQ\[M<>t ŸJ^~y4~X'f+k>hiT,jejkCnK05ꗕMqcXT55̮nB q+˃[)*c#yt wmPc |q[7:#m4%"u*!VmZ,"[?/xW#@IB th$N|-ֳ6XF:V8VQiT 8khFC]< }]g7qpOW86j)R7 'uCivޭB/l^f5PlQ7.H<\(v6<4w'  R2YW4D&ŷҽ1D9͊7*Sqb ,0Feew?c~:Hi Sg嵕d+b$-" o3JN"K]SB6hVqa= PؕfoV߬{NL$`%Ϟ,\d9Gn1",nq`֥ɕN.L4%.79U'&a; gerћN/4M=!S*䡋r=!D/iE-8g#cd#$P(И$ӢK1.8l/h۔.5$YAwD+ drիs/8t nJ6:7z̹+:׾kŅV\aw4>(q/\Ety|,8#Ok8[;R`@`zZ ! m?3ϵL4k[ܦ0^@ni݀Gp[V }tm&^G!Ht=X`,I}i YR$.+kax.(8^78]NdU~> /龲oskE#E Es$ EUݞC>i^xK9kDIn]F -Z${ZTd8MS+1Q5&4hĪEA1"╒ =;ûe^L!oqCAtɩioFEvKB/'ܡ#3$s癚 yv |Fb igdaghSkyDerwzS䐌&HXH[W,wR cs 8ڻN^i"IYWί@Ğ5@U8?*93Zy.6)QKoRvwq*p^˚@v^9c]:@^ ćJ?yZso6,{8Z112;\ bm|< Iϡ~50@jJP!)MfhN0%THYxySe{0|)(<뇒~k>˪<@nȺ0 (Wtp2 6X@ 8ĵV DzZAb޾@Ŗؒ 2[csO =`^];(Ia pѐ'yM5%=mjR!Nu1^G[L>-+CpQ,+X0'$wc:_)X'/I9.si#wD,Kj JqLqB ҟHAR7NL97:n{ݭ8qo`|#anGɥ!pӁHK(xC(v1N& p^1B@z1O쐙B$뗮ߘmŴo˃ Q bǻn H CH=A7mQvsd*2Q 5c!;t,_P%3IzR& iL*2"[tHPҕS#`ZGڞ*Q !0a $cN浐u) =>UrY8B3pNvٷ90qiͬM?V%.1؟.y`/(ѩRp5fL0(quRUJ[Ч/tAZפ7l(XPrT|例\(އ"3Ҹ :i[&OX|9ʼntd݉4DT-wAg%*dэ$B"y]0jEE}SH__rwx]<(P.8q2ȷ#Qt|Cݸ$y U9)Lꌲ%jnp,`_ZeSƈ-wvIvJg(>MD{IwZ a3:}~ND)dUgD/ߌ'Ɖ[߬@>h|^giF$x$ͳ4Ar=`?ˑ-h[xᏯM 9.>JI2a8OYez)$韄J~ぽ#0# 8 ݺ8,Z%K8!=حw,5lU'RgEw#IOw[+{ZAbcb%2%p3mI$VY?qNS>w5mp3t6d"[- w%Ͳ[b7)9nzWx^,;GR,ɝ(3W,eڤJz@yq*{pP6w[HHO;su qyƠaݤ6x%`UTwlS#:\C_ߦuL5HjһQ TЍw^ԩǚZ$NH.G Ikz./,Zk˛˭K.1oXI4sI]L5|#Ű$A>qD9K#V;,אhB^ d.`5x Y^isLF T5*Xrf{@:ndօX Rxc *}XC׶aM2ِbYEv^R{h_ *\HY (cȼ`]Վ@ b u7,䀒3Yu>΀g(͊N&;(JV5_|\*>YtqTww~ƴs9^";NLKPnxL{CoLb}MLi>:pk!_MePH7&|=[$TǸ;r|!IbyHŤ@[s,i]ӳgv}Mൎj`͘rNXXmC妦vixd}X(f 9$6`阵:o9~sڢYH~#M͉툘$"k2tLfsfy]`eau*!$[7; 49:,"i'I2Uq&a%z;߳a|L ќC'Sθwh| '13 -iHPQv@FxFK,(+8!ΘV9b(μ8nEEe5-!(r6NU-vagI.f{ёQJTʰ,irr"_kbhs}L$^.s/p/ >ԕI,w.YGnf1H+_VC]s:%mVV8 HMR⃾dyJwYf' fw\%$:076q"q: @IL3%[yI>(b);8aU]W{pDh 7G:fmepid{ߒBl<%7Tb$OMXK{m%I1IVwlr2lD|t@1CGݤ%XM9>,]Oxd#t߉tR h6~EzEC RVۛPK\_` [i(3!gbiY,Tg~z$F4RE ObR,hEo:<>sX-^nn X%W,2 ?#2f0g kHs{7󕍍Fk{#JrZ J@Y(K(f>UJ %i#B`,asw#,{1]O&`}cLKXē5w;1n'eo Ѿ:yrÓ :1*/6:p̒6\Uŋc"R^?֏x-Q„m .,y[kgzrx<@Hy@"-Z[v!_&l䀂RAy$:6ULN*q B(؋j xzBC+E} ewUgW]]U]UդIL%$ݷ{_tUwL"38&2fa*Rǧ0lT dMd\G\`D>u2ݎՂ\k׫#޽ݘuo Ə>۷`2ͧy>'t2͹Ao݃`|p6heY7[[ӬG'KcSϴ_zfgvgw3 ̛3LӼ_M󪚎x$K,K eK)!uiCWG`^/!| $eFhZ1@˂`<vZa؋T{bWcwG=:o-xrn\MI:)i5 IZgOҟà #e$Ytd)G|<. ABe&ó2ϱ7P,} Xv 8Dy?-i`_aOpK:,M΢{$MȢ9P*@(q>({Ka=&.C$CW%cCs`iTzǁ ɉHS:I # O'# hAR'[@L+!dhơ$2DɚYhX,Q'tð\cj -Et.ps` gb@9h hҪ= Kr%|ΠkK587$@V3dAC鬀x,JY;O'VԧY8F(FZ.d4p::bGH)AQ{I$UrU$IH sir;>(Oq(jV@ՂѢeK\$U.(P{x3uS+Fݰ`Pcmp)g7uƒ]$ ڑY }cMoWMԷ~1x#` Kv:G3Z[u|B )GA*DG@~$0v54-K8y4ɟnуB`vfD q |ׅ;D ۸6,Ee>,or.ڕ>t\UAׄXՋW4l,R=^9@C4F`áKF,I b7 2^˺e^IΣS 9PhUr 8;As _WjHK9psjuP6[iwe̩w;.$QpYv4lflH'uϖ| ]W5B~ބӐ[4_-~6x!]W -<dܳ`>BpoYRoq() ]iΐ H r[*v~!* L 0 w$ۛ4!#4Ejո˴ m`T ݴ(;bT݃xN}iQPbg>.a:`NÏ| vŬ@Pux*Ўv1%pP%S!Q8U=쵿& 7ÝCľ$h4F:0IଏCԲ>va? 'hLԀehB՜IczA̸}ˡ]?$xTKjtc`"3QbD[uVı<[y QA1|plO 0>[ڙf5t@^XbiY|5.ѯ;TݷUG#>#`Lm`B-wyY7[qdǣ_weSi^1s?_N y47m$QP"}Oh!plݖ޺{Q",Z\ $NX@`#;ѣ'U0 W[-% D"QHLʢ0X$Q4P 1q`=Xbx"ᤓ.L{QZ1LGUZY $Z*.(H{vY95ZDYMG\w, mǎBKʲWp$o5lQ˫48& ۪F݀R(`?'H`%JK}xq^,eFE Bgͪ#.V%2|5Ct#b41UCp@lƨ|i(Sed޳aXF>~ȡe>htc}1wt=Z&!'$VKxN Gy LcqB ݋,NK}"PC&>/UYMb#5[`6%-bU6\Xma.hnv!):&BJw]\JjwO`]aј}&u"5409, 6 8lx>3ҁ+=e2?J(^&ae6iy%ADWvX^,IVb>а/k:nXa5[.:VZ8"$!bQN;Kaea)#cb:BFqK8Hۭ hi]Nt aP"U)-C^,vl($" ,o\a2* xف=ztr)"L56Q9 x +u/ȑ|]"uxQՁTPB%Qam%OJ2 Gc<{;GS$%)%eEm4n |X>kC9y~V9Bɬɚ١Tɝ>Pö\Vo|\aa$ Hqa{!=!:J5M5eenXĥ4d0\|ġW0|J׀8 ZV,]Jhuq;2[O@64]Ҏ?u[˛sZ* }U.cWr}aGv_.5oǠ2,AbCMpG%uq:NGҞC`r<bFk} Ux;@Xwaba~Տ+4dIgG(Ye(I:A8t쟠:ha Xclӊ2'Q A PZFph3| 0e>-V`8 bKceErnωV,&bxyqD42>|=aX;›j \K@rX;qRFq[K.3JZVM|qW^9%?$q #) rY$$'я))j$6U <*+cl+ +rA~ʂ' ߓw1"0Ҩr<ǝO:wxJ2i9&709Q>ݰL`U$?fWM^wG⽢?mbY(Qd 0*v&19:=VD(~RrLы.AV0*(hJ~kaU^#=by7Jk c3_D|3aρ3aP'ѿCaTᤌC-J2 &]xqOj%;ʆSUG/a7&YpդǢ(cvO2gPϊ,?`Bb˰؉6Xti')ĝ1<H oq4 cGpr6h%0Ԙd'#3""N?ree2L](&bU7$t} :VG\n/9|--1 RI.2nІ:jg5H,I4hc^@@IȲFՆGD;We&y#W/_Fcy|"K`LwfK`,Zrp7튤7ޥŋo Z 7|#9ҴӠ`q|QNcR0ŊNjW-48[y%>_:kf1]NDaD[Z VebWBeT[ ذ8|ߘ.V_Y, hV˕{%s?6 *4*1 * LJd=V63j5A H֧b&oCͪLۆ:3u5X~3#q(Mt Gvg[ִEt>*ͅ0tl$Nvn%=մ4>#\34baQf=:[!˱,ٔsYnXZjMXCu&Jݽu\Pd s0t+5`|z@Tgv)ЋcNJ`l]$8YcCn7e-)/V#QуG4[(,s KRTRD fxґD?_Ig'8KLKuf:^Z{Kǎ;=MTFL*M 2?a'q[mMt'$шӬxa Sߥ/oFҴ5Pt2QX;BsA,dЂ?u.@Ҵ pfv#Z b 8q>(]m=,Z43sE"-.cLlc<$v,^;juWt?%|0b&49*Br?u[QĆzGC3_aO͈X`Q(w'uLZw/h[G 85yl,##7ٺATKL{I4]Ɨ72b?ژlX,@XJi ˆ}d3-W)PL3ܭ4V.g,? :k'd Ŏ@"i$yA{lƒ%[ Cg9)X.q\E_}uNEHh2b5&iZU8#Y +XF(ffaܮT$#mَwA^&*> EqL+V&TV$$m^?uvZݦx!x{c\IVF $*WM|9%0!Hb9',UE^pUs Xp9U:auo0jo'AJ?:rZ͡\Pԯɯ42p: 5`Ұt%2/3 +b&eM;-{,P" Qdo49(rV+]/HGhKyS{I_^(CS/ct:ѭ^OMcdai{XQ2R)Ne*{b. ^`џ@TLcXf SlKiU-#U0`Q|"} Hӵr)ƶOb\o U^8N%@XvNW@H3kEf IfAIA#u.dr yÅS0]1qFۉ9韎"<{e -8d^]hv6 1 {.Y}*Gj JP/wu1@NgI;ԪY][Frfn uWq/1Fe-gs 1ݏ6N+2dKLH^e?&%vk 4=%bTpǻ2Jo;7XQX/57?ճꂂ@L֧=-\6Fpn NHnUc}eai-I[w=/\)Wp:"xլ.mgͥyN&mn>^SĎ ~̙ˊu牃,lҍ"L1`+*k"<8bHкE,u-_ŝXZa[ҌazTl LG£~S - `Qk)W4Umʺ[>]'yƹCT{Ëb>ura;zo@=er3Ѱha gb1l|4lc1B3. bbZ Z!q_|QqČ?=\[flma![h' $fYb5]c&rNOǥFp@H$uM6"RewQ (ҩ,!=sX~><~LV7KR,KjEYڍ8lup0B,EX\X5Y/P0фfzx0~ZEF‘+}Plxw9\:w׾@0w1&ҲX&Mh9v]ʻ0MeM`!<3xCX6k=8Q9v.mC6j1+HG"jI"䍼8rOj2k!+A ?l=.BZ(YR1ᙞ:6WQX{k.Xn4Wth|Ngh=Utm7 tڌ*kEp6qyM(Q:GkZ y!1'T0us!1TzH7Iƙ&1#&hyd3\3ji8 -o_ϗZӐ\2E' a\MCG/8fKqiFF1{C0MQG#` Ƌh>Z$_7l)ꊔXMF.iv (3#UNG8]OAW%k7Ŷ{P%aJq'x!!DCh 핤W),i5$e6X ek3ޏ:z'#m맡m ]F1PrZf =|)*$ ̋> E ^Ƽlg dx4٠A,ZZ{(QH5 W?Dxsgul&plUlog ֹq+bYL)NXIVAJ",1cN>,\hn)K󲾏&t^["iAywSss·%SV9gH zNSQ$mYVEb `R'#W߂N#4>_Q&#YHYCqv`  ,/*jp,HEJvqНAXk6K T_/GY):9+ÙApc{?]>;s_wY_y8;U1YٛAThV\rȚC4!bpȍ ,>Uhy*B%#p5[% l̈.qφre6a:BRܞ _}Vq/Xg$\ `^4]޴SIs弍TopB(t;nդc.63@G2yI-|,okis\T}!?`.,)Q|Bu 'G:YBt0eȴL;݃:D rDBMsJDٲ:<5cenc ޲:85xr_!Yn=F2=3}Ғ>d`m0AiHd{-|*ɠh!X\yzSYXv -,AYh԰z,X~Q&UC0D&+T,?svy^LIg~eӱ{R|HM'M?I(pHӴ͋}z~xh=J-O Wzpp m"MG1PH{]ѴqMvkӗ Ώ[gAy {R ^Er;>⾋-H)Hn $V Ex1Ӆ<tú#jt+(y>^G@VɢwH8f߱,Y匮 gTI&#MqmH2r9L,s$U &nɈ,;G.ѮɴcD-:fy-,xW+ʮ"D|%_OM?"(]6J휖C,>;o>C1BZjl9fÂALI= xWs֜Ke/$3MJ9} ].g]xg2 lU{n7X Lf"OB\&(\^$[߯\0wuln;h38A"Z\= J]:Y YΑWYc?kgw ,k)C JP$Ԉ(= 95׏ذjKNK 4D9pk%j[\Vsw8ސy g M^9gxz%fGby`^&0Vմe{#Ұ4MI= XLjTGB]yK/ݟ`"ޑIp yda_P7..&8Qc{b{`,`yr![_dgI.A)/lYvv&Tc\'Rx0D|l*Σp;fTMq!-KII.dE\2Nx.P <Ad1vX%AIOAvd5ڥH&ǬǃcٛmT 褱X\L'Ew[˄7m #B̆1٣bWb:_~;D%7͓! d;+FX(6p2ځ+ L`cC^j  !c~wXzV7e'[wެ5t)m.ӣaE]/mPev4Y qQ” hVOp}BIZJWàH Y0ȟy˛v3f<2C ʶi쉁(QDi#| &ջ$|&Cpx3.@Iz<8(Sܡ? ː=8{b , mPu 5tDcTGYY>1!g1\oHC68GG̦ WXX[G;nn$QY1Sx=WA9*O{*d]4NW_nܴE7?F1we7wi"nE&lAZg5ַ0kRlkI#sf X x}cv  PL~(5kOp(˪}#р)F*Kq@a7ym G;>`JM&Fy;^h^`phHFK'K aPRKjG 1= I?U'KO1^lW;,,ΒUUUW3a&d|} WeɽX^2sF?:tEs_9n9,,ޒ OلsjJnHWļ&,{C'i$axi 孄[O+"&IZaJH|?Eq0]jLNT.S`e/:M{g;2R4$EuĭiĹ&vmM1vkٽCSҩIxР~k'6{,g}DsʄQX`fnD"P Csѐ" !(ݖAyF_ s7S]2lˀQ]!.36YVf|^$P,`2juHX̶ t"PgBd5؟6 K#O8פFT]db J7DFQ}d]Bj?+DqƜl"CKf>G7 V2H,=|p p%*[dX:>E,t) .Vkw,фa/ Äg=TYQw˼gJ2'S_ $e(otYdzؚd ZGpA,gquA76\dlёi>>Ŝ|Rϗؒyn'򁩓ݬ~˛@Mp!^ X躶uD>,>z/ F$9OLJn-2_0)wN]L$ҰQ,b#I[5Y \-^[bxK1x/^K/p'2IJ;L&Oq¼AgX( 8#Cgy׈gg#0/h !Vk0 sO՘)Ț|ڍ5`jGC} >wp*06%Nw#ὝB)_gaYD<$an&Ƙ'@ `1Kz8:khg%9ǡ_vpy[/Bƃ`Ҵ'ć'Ea#?ӊcG:6Wy4!/Izw\z*4V ]%RxҴ#λb-8"III߃˯:(U0u ϣBIՌ$,1 _.'W$ToWJ00h^O'Njx-:\l=tt}ӪZiCKf/5x05{:ÙtM@/<#J҅9?5,8Ӹ~1gEkĔ`zBÑ)Ч_}rA72{ kƀz4ɧqE U{JA FoQ1XҲ(qαrf/Ml:ÔC`[Opn$b5[OQ޻m1LC+Ha/q'<4`TP&mIK){y/&vRqEĈ/9D!ulI$ 8RcocMyrY4(]q9&!7=q,\qcufss3mylk~\p|NKO6+>+_`m,☭@ {F}zkKtq6$gmsm듎K6KB42rsB/xhX4 c{C iQ`Y Hb bi1fL ݷ 9x;8>P|팪q&1t)ᛀME,fL-k%dX1.}]n x2n6B^TETXxSG,ƤZ$œe\dիsTY%;)Kd=s3}}꧚v_N~ ?q c4#F瀬)Q4i@ vۤ7Ejz֧g>3Cvx@ZKiNL{ZTL|-MYzN M(hB8b۾d(f"ZphBZ>Kno6#&z[a"δ75]} hл/}/SJ׉,< mG| >lB"IK Qo@&ф\NZe(KXT/8.=Td n>h-d Y.42!1,;fGuH,0-Z3ԇ=wRۆ4! C =d:l>ruXP[ ,)ZFi XY6V~fXFJ !,*TBC,E} dwYg^_nխNu@{ZXNBD68*8zQ罦IQgqs.E`XȨxF2תurh4.Oj4n^xq'M;Ngٰ*fdV?`kk+n/x<ݝWt9lwxq3s೓?82Lft6*~$n7v֙f~o“o&m3o |l @ 8JL%\ J5<[׳jV z&S8 IM >ݑz ]:aL r0 IU@!Ԉ WFgPFAi.ˠF=XK8]Bݯ)a0(p8 Ѵ Pt&ID 2AyL@KSL`6 &A ި@8>;NR go>]Ƴh6b0=<&B.}Le4b|PB@Գh806,]O0qٵcnt21.&#쭫v11t>$ᬞ Fi JURzLpȇ&w1"y:T0yf@z<3fä)1g/G>+ҭghL+n86^WOYf'[SW0|vT]L2 3PID>>ɶf+B?и}L CT.c2pm#h jC2:ϮT.Qg* Yn, , Kͭ*pϞ"mY;XXtJLf,c&m 0(`r3|vf΁駱iK+ݬYr8~)%YH%,L8ib@4%G9BM?[yf "쁁ꄰagdgP߭" @S8.3#޴GoGϛGgH8 ˮ~K:_s U(H+j1D9!o:ɇa5\T$ww?eXJ8 ` cr}E0^U$v 0>8 hFO?? _A윘g0ʸ<]abz{6#&ݺFy!GlTS 4c 0 ,1&W%J=q76$|Hf(3k!5]ķd Q+MCW0}̓ ;~igwPt br[J l˰-¤?ޖt\LS*_u1ybqx}ijbe8ٍف:f5â"PSvPEfsPKin!^ \HQIǡԀ&fl'[E=hS^[գdL2L%m:AId4N"S *B $fm9;9'w#ӦL7AцpABy+k8k#"1tI`?OJ -XCᬚ 4JR66ֺbڠz\TK*\!޽Q;lDT: htf8?KWY Q>0SsM$GA :s!y`rԩ,O%;I+7-Ζٞ219W4 T V©!G!e50ޚP#CNc 5 P6P}k趺{M2ߓtx)bN 3Jq-q  קC"Zxxxx{q= (vμ6.hlL^2!_M1ma,fOHr =L+~ N'ixYt;m$S+ UCN/Fp ?t(2I--|Hxs-]'u6@oevwOFB.a!h^>PoW>[ uqbÒc`Inӽ۷(tOJXtMJ}B g~f*wPdP?pZânx X>*:>; /h@M_ N{.,@vhjdm(mXx·Q5| }z@tGe<< a+URND1 ZH^|٨JB ,a`B8Q֛2ʩ2_pX,C="wd8$RG-x$yhD.cRz.hLRz L;]V'# Y@ct9`|Y:텂2(7qx@,I!p& D{Cr`Lv'TqMHJn ADPQ.c@6= ]F 1I/%EtW/^6\Ze<ʎL%ɱHi>@b74'9?)V>,DdATF!&^QXbt %Êe@x &VI!ibH, [ʼT!pU9RjH 37Z)[]Lei\-> syӮ)YEHl3/+3ɲ h)we`(~,ɢ<܈YEc*mA ֠`@4Q~g8ߜuvdb+,ä}5fU5(ydP$]&Ѱ:*/Ǔ^{R.]}RKWaz0K$^OB NH^}?o % JLXL)Ϙ9 - ʳ}dǽD( LpMx/O Ia9EKơ`B,<^+(;8vXhHעraA#t@AU_ %]kx3բ;0d0YJFm,I,bN(]=CNXʁ+L^94QV2Ċ(HLH( k`Aam\@|Er˟g1na-\*\Zu(/gL`7`WG!FW[o}2zA~O^\pKѢ.:"2P1K̢̥S-vp _  $ʪDMܾGXJ b۰"}pتkDҁ$f9j~:A#JJCl0x1-,Vi'3^ 0 +9e5PSX;dMðld:5!?b>ӼxVE<U|>ˡ\pm%2)]]-t1z`S;jj/#0aZkX,euϦf8Kr0Gt"L]@eW,\b_ՏdcR# |abctQgtfRݕae_@0O@|Ê;͙<iEbʓǕ•cy_/5\0V1]]N=X4O%N3>Rtqek5I^{(%죒SГoiQbVAd :]/I#{Ģu6 Dzj`P(M2qhnkXȈYw[ qC-xA`N r>л@3Le(lIE42˜2'2'u}TŲ10K*(I: Y8#E蚢omG[FVL#pnj,U7(t2A(ӡ|> eD+taǴMפIدx{ YҺƲ Ŝh*J4 J#-8$Kr+N;x`wX^95QfLDlӞ+y.zaq !K NG$K$O]%.gD>Bz&CM# `rmHGzxCtx)p~޶-(̑c!5`Szt(;{Ġ?9y{v#!G-bVLqtBIBMM]c,9ѻ/"XgO! <%1$ XG=#4| M^G k<;NI(camVJ|z|~W~g ,#и=/aNr3!|G.z|/ ")EYϢ\l#R2³b%ā~LAgs{S3t㝊xs,?TbQTWwd`<)7n`j).QfVL%b< =|C Zj"508ΨjꂷP3hf&{IcrΚ"T=ʻrJ`K$@ F#]4v8wiLms&MWs<*F1 DZ,%Jǘ-PςX^6 QX:PN@xFX;ǻ{&&7emxf_KDߣ`INu+-.1JThmV#2,////,|d0|Çvx'_Ъšрyn~i9#*ѩ8C&L`lI׈LI3IÊb1T` 6LNpKIB{'&`{ ,^ަ9↊ԉ<<"r2'ZENeaW,/vӛ\ Y8%ЇXXډp,s^r{,Cbd7CNn%_.!)S*jD{8Lnq @)3(+> /.%Y=pP$3,B郊i-[7my+_:K qkT7 θoD D:?wSW'Aq-؂Fi凣{8] /$z/񕤾tЍgEZD> x˼MR-J)5V_9nʦs@z$7E5./uX)Z"BˢF$=*|xƛܙZ)|{|C*M xD^+%鐀 dYDmdҒ+…'}y#a5r%רZʙ j:]R݄Eq`FD猫z<J/oGm>DGK~EvDifFֻņH2rL6 tGb>v\70Z EjXU hyZ;A@+/_W;Lk[qVg85s9oo y"(I2_$VsŃ'&D .-9=EkD҄+cƯduN L=" ,fz΂T85`_]9C¼U d=b&IٌV}%pvݗ"Φbטcbf<$:ͯ1@TA:AEو n!邽|͛Ble&GlQk^f[($1ZF%$֕c7H{㩯uҵ-ul>?i8>òM(W~+y'>O>~y"AI;xB2,;<* Y >IvS(HRsTJۨHr%N?#y2f|wkhtolIA< Zd.\԰1$;/=.$VGMY)/47Q Z:nZ 4-X&g0?zHtPf<$H<`a5 *|Zs)o_ D 6oY 1y%xi!@ `0)9S.xYz,V,HEL9w;4e|"Zn2fz.)S|O3Rv1ɂ3rAOgܣ`I[)1q^_Zc#u1r_!I_:ˍ:G+zSMC N$@Cdz'WHx^jq3Y/R'QyEݥ>9IFΰw;sJܳ^"go°OsMJ8ieaA#N2# K/:,oEL 85Й4I:0)EHâ 3BeM-hnsc|M)6,BBR0JPp`/u1`)a]l2"C9ͱpV))XE9W ֩ݱ-RW?X(4f (b_TJ>bPRtsVG5OŠc_d%G(f9!).G[7-e@0 `D)w%tzAh--Ŏ״i@w#i%.9Pl-M{sZWY mla#WOmlċ|8U% ],z\x&짩٢CWĐCBfS|t1R͢ sE譎 eX=aW./Kp򾈬X R_"[zȲs[ӟ-a>Y, hFK-*ꅲNj fΩ\eWڷ>ķ9dLɑᓳN:@J4Ik6pLN88zz[Xp']) \&yV{RNIv9v-//%2Z$R]J̒ms:%-M"Ab(5q iK6mFQStai>1CBC},ؕ{%9V#Hzl뮪s F$t`-,é=}nˑ1z 6Z<3|^L:cce@BQ_a(VgI"^@JkY%ZLߙi ӡzH9{e;eSN;["Cb[-I{? aP6ED= .͸CFIdzwlH=r]M{ vBtL\^P\ fSAVN(Y̨UWv-l;M d~阉fX\K7EZ&yw9>rQeıGt˻vAn8ik$yܼAǝd%܇3˱[>(]}):s۟l0Z-:4N͕ ܌+p|n&Q\ݶJܰp5$0qEhc^fFV{<+FxKjڅ|L֥zȣ|{AbVjSѵ eȴ|!F-$z7㨗4#e&"H>#f75jYl-E7%< ]iSq8-;ou*ob=}nR7-EEZaAcDy!òE}4g>;=Pa88&+c׳n0xApfw@Yd7's}#yKHLP1{`c.Hwg21K6ȡ<Ȧy%Pp g34XnW}biB1lj۬cلYYM Cɤ2˲DIoij\0HDyJ-4'+WiCpFﰸSSJrMwE'RUmL=篵ɢ$O⁂Turk5ץbq7>ЕbۈpG~ E.o4 ;((ʇsak8~Ylkn,6Ifuח<>g!8Ypm'R(Bn;*t,[jj\3|d>_+Vq,P*p;:g))B3T+YvǸ|>8<:Ƽ STĜYt_W71G㇕42&*) \T$Ò%V#f*9CyqO~[]ΗVJ>D~pGYs6sft馚'"Q muvp^Vd^.qOXzV~X8_ab>DyDh~6*{(A5 1EnQ#M;ϊn 2di*t[C<$yVm;IX &Љūq0/gI*z7r|Os"so* (:8I_+ ,mVOM<ϢJ%a1)XdF (;ɒ?ߋԭ O*`1UWm_2p걺GBIn{OӪ%{L0'@N[@k)e~H-l%AGRS3RY ț[Epl3xGD65Ь:E+2 !@Jn@h O(~},Yts`:xj,mnZi?',}ơyolʝS]1q,Kؒs?RY9lޚbёnpXI&rNþߊdyaaTwT["shd٠J8_ŤPbN<[> .!9PhǔJ%= ӄ-k:塆^n35c}dѸXN&I+Xv)$OpON͗52a2w>H=tY3?ဦ! L=3'' :2EFU7' bl>ovƅtXloδ$1HS*2xo6(1Lc }1'E\?s*Y, xe5y,ː|I3.v%Ǵ)JsM`+Q/K9#(_pD8 "9%k5iۉ4H!W#y/@vB6}Mi;!dtmnW#9f=7?Ծ,@KtV rkɔ1!d2?&GPŚlؼ90ބ+g/:1̍AT1wˑ2`PDI"V鏐TĈ Q \IFr _`?PS*cn/52I2rIJe&(Ɯɵ =YBedGR[WשּB0u̚bQ(bPl,Q܍ T2~F="֥D|Xaq_(:"C]0cxι>kE}'Xh"\>0-RΒX= 1D^X<));Pr` }+sp-*$ϮKzgzU;7+Ean`ɽi{Ec& I*IHG,ĵ(] ]kt W/upp} KzRFܬg$1%TӘCNXb'2>N9P⛕<"[-( 47/q4/I,JUQ;|qxǃA&V7a ٳFQ5#\R TĽ M[$gg[QG_Y0IhrNm9+K^(4/z4qL1dLdER|˱C9@$v]c@YQNև,Wc=Itn!%xʻ!)Yl`nA?ɒ^R(&Y~Y-I1Y6`1|GmCńgO}iUȊ $Qz s]ZC,_S@NX``N֦ʛѼq~i83鴒TGM(Ļ*cD+Sok[ØaRyʅH& iµf2-[E;:UR $mfy"| AeGmo8$Kq;$`9|N ´07`|v)tPV|eN7H*o vYѰu@"r#nJHu${/oIo*Y + ..18ܦKqHXSb1v)!`3mb,-c.uLl@YP#:ߖ: (b㉦Nu`R%#C;(ɋu(oͻɒXl0gǤ=4 0]Nv~Z]elXCEwRJǜI}| Z4 F *9TJ\a'_+}y y 9ee~u:z+If]b &@(F ..5޽}|pbKAsl}96Zk3 ¯i]mڼ-ۆm%IxwHS 㴧Ġ,ц3:ģvxo&x ă^8k1pt;2TFR ȓ|7n֭Wz$H#V~`䁲i3q>}PgNYh(uq:H,=q%w%_ԎKvJF^n(`h9)۲oUrccGS\(rucKe.Lx#Ӎգyv4I~48py*ua3Oxc>JY/Ş0Ti^P-PE'p(gU&]"G\BNb4w▝ZOBr]:y.m 0$BC hiF@rLb.6Ʋn.,!e8cy"nc}eN1e,6>ca`&(η+ ċ))p&]x3xAeVW`hI[M!)`Q5]t,*W^Y*|.RP GAG0⍻Ɯ1\tny ߟ Cy6 s5Ҧ3=WMos\TC)g{Gyc>8 g^} d ,IF}X8^p>=ڐ12 6/C ~yGK(%YXKf-,.1jdy 6qc5k2xmD(>ߒ+H.a n͹Vmjٳt?Ԓc&P.HjPd+ 4h<,8 W$"Z\W!NO$*viX0,sf<|#-Κe53mjx],17m%|Eܫ[v9* ռrynXG}wn%&iΜ[JR sA:KrS@gֵ^;PylwmDy'ei78'\Nv‘(8fVxiI2u'Sņʔ0?@#Q}@i(n-F9*ex"^fY]qו͙pإX$߼)x \%1׳j4`cyʹ︺Sl)B~B2!~1 B{3r;"wG./EZ;,~9wfZ(f Ĺ[?c_؟;kdGEse(^0+f +摖:M&Y6aA)FTyT4V#(XժFD\Sgfr$7]bdH2[t:7#U2F  Mz\/'!, K78avĈ8 S2t!k#$3#DI1 jQMH( -j@ݦ xO y˄ miZΝLHg wH#V@ c `F5a,(EIٲH\7V1 Jn`1+EAQ&/DҶ<'E+JjkMtMMqKuM^첥 %r0[r˖2?_LO(qu| w _j'#2$rtJB1lv.DP[9"[2u-r,nZl^`q&B,Cq",B ts5E w ,%zZ.ZDrR'ZfE|1Ay҉вnpnźx"efí[T$:C,pSo0XeC_6?!H|Yid ̏5O;o!.]iM:M7sV6/:p#X0n%sy+b&3Xv%3`.l0{c}0ޫZiws$5僐C붳 /xB^a7|7I!ݧ"k.qoQt8|DdAޙ.1^]WN>(sHb> - [a :HHWDv-G/jCRpRG>(sRuNdk/?@4c /^Y%Re}{8ۢӎ sI޵G`-K.,"mjɆ8%\R,Wx^i[nrԳr7[P[R9>.EJ),8z,Բw~OBCmYXQ<m4rln^YL}m˛[vjGEOkH !Z8Ms3/[(@zUۄ"b 6,ҥt!љˮpu-ZmB9Y k5 1LIܠyhmld0V х=ȮM|!2(2gam-{Qͽ9+'T8R84 wRtO&!Xdg=q04(| 4X;+L|8/JY a 8$_y&cNPYsA=PӪ^Df 6E?Z|'3cT9EIV*J\Xd7/pfá}fy`00mkd,{(!@o6*ML4Y3C4sٲcK[RV M @1)A1./ȺBCC} wUg%uuV_W/n"Yjdy$MF< 3 4I0Qaꈂ0NE2!BPDPp@!đctUO*_~OJ%RqMKJw~V J??ύ;iw:io8,/-vg, p??p}}뭷\_;/s}iH_T'[3>$g8ݾKar{ ߅X&|~k'`thO'ӝP¤$ (M(?ʛdO?0'̷#a3qه)`F`0;IV 5njQ|iEySE b?KAX79ߙLȴ;NGNȅ% .Bd,KC:Sna;R쐛gP ;Sp:uLF͎usE:fy.6u>.U {a TM ' \AB(9#JpX& x qMjȃEX `iS,I|tr`}Y!6]*O2](j2<2e6xK,uK> \K3P]L=KeU)˳,τ0:%^3ˆ)SO"O#<< t4rcAY'Envr~OjSؚ Uu%!>}\f|B`L; ?},>ն]B~oo,07wHn+Ql`қ?ӝQtcdXjR',y~@f&;7'OMH)64_<(=QUЇ~EeF`MO" &w,1Ĥhno4q73]'??P,!MeIh" ?m3,^;K-(%3<GQkے+l!"m˦|,=w oR?r,GE  >սi HRU+R`C#ʃ"6QETT$PR*UW|t \ Jp -4-e}/Peu>d0vfL3'$Kjg_11'̒O+a &vT(کQy9%%drKj`y;`Fi]z]ð?fI*)80+-~Ot0c2U&/ $L߼To2(A_./w3!qWU,a 3%Mf }&[_H2#~EG: @ E83IrN5x-xȰJnIyCR0%%!JK'=;Ph^˺0_ܢ]w]x)sRf"|-*RUXcG\H=X=LS TQHzh˺u#yp 5F,{0&џhrz}R.iҽeIjBi`l=N(NY~~KEnm҃,6q;y(,?x0XIIҁ qco +Pn}SP۸W:퇁.,$8bb~gpoC2WTY ,`t{! = YE U&@DŽGwZξXxqJWaLne,Cci¥UiC2q"d?`scC5mzMM`Diy]i&-EntY -ѝD&9 E#JT:1iw=PʍFM#0MXEЎ|iBUtYS(<Jy]j4SR{,_fZ~ȡB%y,}Zh8t1R߉ zrO^xBcUL؁hu@&MvCp$ U &Z(P8'½Ŵ80]YP< 'i.3qv<ΟU;&Q{nH̭%ž1+]Z/ka,8@nNCDwĚ MCÝXbIWW-=q+ymĊ軔PqV.N YgTsZL43t_!k!CO8ԡTk6 p6:m2R ^r{SNxZg1R:l0.9:O"23xƝ"Cpi%atJH(5t!C\z}].uEtՋv^*bE ˛Xe?ҽ>s `RLu\]y̸b4!qv8R" 2LMZf\\P%lȀBR%DD^ T+r h/nM8Ex}-(522QԴQTSbuW)1lߛE% 5/'hG&jX%^56Y򏣝*\NÒZtApqوd _dxᕸRqYsV}.(XҧdZQDa{ &ƃ0i5*rFBC~ukYtᅫܹ9*h`"x91@O!+~%QPX$OZ^g!z˲Pcҩ$mMޞUmeW~AƬ4|eᅲg"JMlSB4<@\"*࿰&rp-yG>2Aw ]%Ú8vCCjAQR^t\g,l"°DζSIY_p諪D $Q\bkG?M $N=o*vGk;X,CGa4, k}OLI gDxf٠Kxe7(v2{"I]XL΅>|oӧ.O*-ܤEps"V־::AjQ#HU7Cf4CfH=T`n%N"5bU gͅ:Vݪ.w;9Nv9=aQplI^!+BX{FZ7bч iY)/ԉA:vp .*+egp:.oCs)õe)'ͲE\ºm,qF sr dU+&#CC|[g*UqVB@1]zY t(N$0cTHN )tk-, y=_Ωe@IӜLtuZhsA"W5$mmkwoJVEa5#I1."6"5}qy5hɽWoy9!:}AmD);>G5vyz8C9!&,O [8~t;ի.9CԡIn=p^FX1?.[bJE0ևHo%V]r)&I$Sg1hXDW<{G5AgQM>| m :1>9my}aPڹDm&1]SHO 鈍 j$imA4iфlJqΉa& 6T,igcsΎHRL9ߖ m.nv%dA(M3/Xl!R"&S |dFt'nYۀ edǣDbG;5j o#k(ZyՉʗOelE Gع #3I_j7+@L5qKx(l shN&rVcDqa"Ŕj@ Z0ߐkV3# c?kT Y0&Pt(՜$S{ f J G7GK!jŭUl.N@PLoQgE逢.}Ҩԏ4?CȪ&IN<ҬCIy3 %mEwg8! >w 0˧%HsN}1o pXgJ MYH+5YO&AnVVy.(@RC_+UN\Fio[|3Ȝ*+|Lw1A#嗆O\'[?2MXHf SMe?eVķ4eYL %.{q"iߦk΃ռ\S=탇9(eh2ss;e#=.c0݉,:5_-PXn9R-F`?.H6EtEE(ʬy$cb˫W`B`a`pO7hv[a)'Qao؊bQ6YwDzp0>RweD]ts1,[ɶMŧeGe )S+Noݹ܆ 9S{m 3%kIcb91kvEpPt0󄵚p3enHjFx f\'A7zg@v˜5dc&{v PfX,3 EעȶGZ3%ḯ3`KM-4tb/Y`V:8І_БݵfF51 = )ța$ &aFL BغX!8a/|?4Z^X)mSrب#t .Z yFYrֱg>?ǫq=i@X_=QYf@ImJÉOY1CgXC86aORvAfÚv"v^6X!]v806{{ f]Tia'gYؐhOvBMޒx((H ,ݖvt޼ %&VC !ni_}SRg-&8  EqܬlxbiK D's$Fw@LTLDd,U=n=VzhYˆqwtW ؂\!,NQr(=Payi=^C6i~Z1l\K} t Qʕh]Wb^)Cj;,ȰOJ.jO7w'IOaU;YeD2imS޵g|(Τ-۷n-kzį$WсiZ eEbqURB(7i=Y B{L̎UMt3MVܬo".I LE!9:*|~ժ7C: ^D<xǡہ(. .9Ǖfbs" V&eqJQlY/Sҹj+b7**X[nkQQglpDz=ݲkkۃəğp;ąX7ǻV0+!}f^[h퉲=nsme<ۥP6Y[o .{8@hz(sH2k/yOXfIf0 n,ɷj"<@#w8O (KTd|8J*f0NqZF 70Bit\-0 -l7X\9. l{feo9c=}6s 71wi`YL BqN:v&i?TW2޹ҕVkmzq#HH:wX˓zUC"3,˴TPFc4N^xᢇŊVЫ Q>YW C IEJ5Hu fs5ҽ~հ'ΖEN2p ըf'[uJX] m ŭ\9RNynY[6=Yo5$FmMAHg/XjZV""vRaYE,u£&8XPsҍذo|РFi⮛J5 :nBrnu^]zUr׃$_eX܆ %R+c£QniRS ڐC %ݲ,^6{_*{}g- zZ*d1dihLJ-turΒ`5jOإddFV.޶HUr+(2>lY.ck(F9/Wd{.0c(!o}@Sc ={g]U90Jtm5}*_l"F%y/0>и36)JEpܫ*ƪ=e^P>82rrH%^T+Uzg'*AZ bv(Q.Ͳ%lni.rw_iM+b犸n;I#i&Qn@(n*s8(޷b ҏgj^RG>2.ls@cڠ!ͦ@³ C?d\Z\ai ,r6DWX\P\:eK;X`e$]J;gr(dD4,-}ţq cuئn-^"iDj<=-; ąI.j`$ϳTbfQUҲxN [vF_ǂcM8vA7j5a=!J۵*~ Y[S j?$F]J(g>+tA=f)*'6OdB8 ,d&M}{ e&J9˵>ir7O 4O+_-XP t<0Q{;b}K̥n,Y@ c6'֕voyC\&Vgz. }V`w?]~M|lye1vL ɚejo-,GiLѵLsY^(Ҵ|\qYآ~>\?ֶgSjrǠʷʞ'٧TRx#;=cAn5΋²(Pvu":*_4HI 썈hvcNBY}Cћm\S I}s N]:<b^Je)Ѭ^k4덕͵ ڬVd$4˰*XPjXǁ]]mid]PUm@`XCD4TLND1 U|}^iL,O0FNϘT //{{B=(X[T e{\9d bjaϐDZ?'|d_V muE:8-1=&RAd6< S]j"PD,mZKטuE0q=u$LMO2\wgɫy܍; O_wCHVp(Vy-XIW[jPFkb-FUr <Ӵs 1 ܖ!|)KHFyn@1>7}qseaْn\&GU2ˡϱ?,F82x:|YgA5 )5x{Rs<&.A(t]۸keh&&WB}}8"kpN. )2iz57xxt}Eйrz?t Ih&XBQqQO~tpztz:'|_kE4R7*P Y@yY.V8;F >QNfoWQTE}붱xeI&x:CG+'b|$&f?a~~~EHq(R]"_%f ֟j㶖2I$¯8m̍Zi1n2@@ uK-pw)۽KYs.]͖}\5, MW.L$ 9͡xkE%Q7w+m ɱ1DKY,eЮt_|vu ұKʮ #8̀Gwz]u DR2,jeZ W@? OMZs_HuՅdƊo(3hThXrひ]xE<ٮu?v_R[cpּsDywY,2- P%7}%d`NEO[CȆ9L5ФiobX"3ְdy,*nB,,]ZV}nwHDm"nO+&v_*i NX9eϐ& -1!id@N;$]JsMcO7ђN(VFs+giQ: Vm>㜛.4kWfqڋ걂^݄sw!w:؄\C>VJ Uv(93wAbܭࠬ _hLrsɛӑjQܾncRŏB8j1Ϋ ()D"4 #kÓLA"yT`".Cެ(5ϬeA6yB+M|'-;dqt/RQƼ|8LeTо4MAwsQkϴI"N;)<.:$IJ4b[,8Y%dD^@@T,2eρts rc3XmH!yX9Ϩ̋\f_-:ooQdFn/y+~DpX{*` T9LYLZ(>6ne<,kEYOTЌBVĤ?*FVsj錎تu"Ju"]J(=$;*fʿX} z2z2d.ٳnTOCb?ޅ(`Lt8"P²aګS}tSDNO5sfn_xNU*@t*E{sfgaVy0MiúQ.-x^ #"U GXpQZہ Qesͨ =,p{-euH1n!&t[;tňy;/*ޭsɨAcxvyD(}w2tvãx>:Ai-5:BHF&KXg> xJò:%=ieq\\YNԹvɩQoee K9Y:C$:Y}:bG[B LJGZ ^)CI!oA#g߄17Rxߡ8K{/2- ظ[bɇ=SLBm  t|djYr*ʜo.&W|9%L}ylzdu5:Oku)c`?¾sDR"FeS!}hg-#递oo϶)6ZA4ppR?R-Pi8GKT~nk鐤P5{);>'\{Q Nug~rɊR$%Z((D f}z[K?f2y~?2ti^x{sN6:c|lׯt+򘕟.N ،YcH\)"j,Z':4>HY'ݾԮ0MH4ly `>XڊV~nviW̕3']5ک_|w= i?x͛&`m7| Md;wQ|g1,;d.܌15۹ ⽮#V#ƔOTRϪDwRhJ}T1VYA^NP|>e{Jow[HPM̏/?5L#-&<Ѹs{MHl] 0wܒ[ָf\\  4[@v#]Y]7ߨ\x`7_L'#ә{rVqֵ@%X[TYby)PL39f@!_y)P_ׯk^ 78B>gei^ ?lΟy)Ps8N@o"߼y)P\s9n@o!ߺy)P<8^@]]ﺚG>k^ _Py)Pok^ BΏo^ ߏ @90y)P! i^ "_Ty)Pb9q@K/%%/Ej^ 2_Vy)P0aN@ˑ/嚗@WTh^ J_Yy)P*8U@՚Ah^ Z_[y)Ph^ :_Wy)Pz9}@o oD76j^ &Ԥy)Pf9s@G94y)P[8K@ ߹y)PV[9k@ېommoGk^ .w9ݻ@wth^ N٩y)P.8W@ݚAh^ 8{Ej^ >קy)P~9@#߿y)P8@B~ i^ a?Ϝ?=0F3MIn-NãhAQ |?)!EB Oy\Q_y]JuSTZG}hj_d/+J??IFHݟʽQrԹc{G唿+} ByI JJ`֧PƽߙP,R$:<<=hD9,`ˇX˯0,n`6u٤3. Iڇ{ <'d3XibyC8%]1ם>; tfnTt($QtсW<ҳLH_?SQG՛ g=8~w:Ghn\^,B#Ob`\ jK9Uipw_Ãpxg'o11'wq!;Y_}|σx֛u`ڟM{]< CB q c9}CN `κ^o1 }ŀ@(M,XL,∾2,# j1E"rop-v=< m"J+B#$(G4AY Ƴɀi I Ex*e< PϡL&PΝwP.Sg)ux"ű<*j4,X!$@S&c2fVlYB(B[ȇ4&mƶ&Ke#f.,-!t8[%N_Dή/}Ζ:흹^:; \` `R` @K葼˩ HW|pHI-RA<Đ֛1SPb8Fڙ;[:w8(:v6qhP<hPa}- .#@ ӃQt*A2TT"dʠŁ4 `h '!x1L$-ps3$N@ys Evf!4g)Z|>GcӛW9{2B aMb0Y#X;{'`MN HѤ+ZILݫdz]Te(7d]p=g{Y:bdY@%`Rp<)*Y<ъmX>">l4L] (>?33 n],I9bti{{ܸtyF˜Dκdw:nk/"wcڦ}u(QIyFL0s&BRXK'K,.;x7LU .^AH[;}>ƻ+僕Voc*Qs ^"l6EXfׅs[*/bۛOIK&QtͅB{8<_p/QQ\vщrtq4iEL 9O|YX^eܝMKfAoJׁȔ$%3<X>]Qo# `:#> $O""җ% -4 4WqKvzE<^WƼS{|];zcv-,)S S;2)[v3"B: dIYϞfiC5R PMcpMb.k;iF39KtZ{1Ɋwbs@?®i547M,ithHñ/"y͊v4c;|X'Uc[+&K~7 )Tԛ.phAie,}Ȱ`]ez5c %BC j?!Y_;v~|}chZ#kZ3ij5jF4bph<ߒtgc\k2mYpa_IhvNp *)bM~Yk”+PVҟah|xQi".Z?^apZGlpZ(٦zV%eޘV#ܜagD{CIx}yF{X%BB S7s<̱3wŎjӘˤJXN(7N N0k"up~}z mJGv:i8τNJ"νp9G4G',bHS~3#?V A,bnpis]NEYruDm;ATL. u E2rGĝ> &qOą%D}J,8wJ,.JA#seESjƒZZ.v~iYmԚHzY[ۊHa'<.XL[o)2a}+  'Ts%]{}q<$l҄r/j՗cUK 4z輎0v8#Ħ-vAfTϣFUG:Xn22;+<"Y>3K>|BmqGwq H=)~0Qړil9 mBxI7(ZwWXȊglzMgδrWT؍Qj_^rubx}H>?X}xN^0!㝈|^E kY&_ :pm;3F%$I} SA1~;+<7xp^q RiĹ`열&b~GܠK)CDZ:?cU' h6:vl)wIDleMRʰ6-a7Ѫ8-h10́ F\VZJ{DjpOޯAIrKr94݃= Qh/+m:5i^X0$9;bX +Y?X93;9LZYNn`a[w_׆R( n.Yd:m#a['tn> (A{{>tE{n,n%K Dܛ>" CK6-pѲbhk˨xЕhb.͇@aX2|-׺@1Ϭ4GNgFݔF,ܶð9^ىnBL :_m%q|YEO\#=vO#iBO˷mH(Dﶀ௿"D!cW vAaνfF,OZFPVYV~`~=f~gtztfgFo(%Pgn bDDtA#Ԣ1̂l8-Qچ)m@_fJ$,0qh+7qBLoZs(\Fz#tV}Q~w#Z"E3<:oCI63Ұ$E:Y2% S:ab:bZo +|5^_]_X\{la,fJs\yĐ-5dyƒKϢnl<~?NE={RfdUFb2!B1 Bl↋D(x=6jI#IҪזov~_It1G᫃!`,a}>-'Rg@(eG}Kg(⻲.2Z{#)J˙WHay%D4d$EWyk~& AILH+xe"4ˢފ.E:Mڧǫk*ɾ -ފѪI*VQuyv;sX&c#Q$,9  5*\xc_˺-޹2Pᬙ,0ʘHjD1z%}5^Fj)xB˺,8)+x)"oo ъݺ؊ҷa]E9-`RpsP?XM l ulTYf9(:xUIF(Ae묧Z<A|Z$fg1/6G!%,Ӟ8.vf+rCět *ܜYū,Wp:Ƴc,eAqɉqFj9]D @ ;'坨Cq>@>HmFb\|Hʂ_rh8%!Icg,O9Wrz'[q7V{qNz4B/*AN{,ZU:RGyhHF ktrH[&)OD<{_@עZ^=&"jGq4Ѹ'=uZU4O-$pH5Y p/3 #b>ǵ2}6s Jv­0gY#{;5Ib5E{`V:K&\l7yN:VpZCr)Ow0K/lE)}9< %*oyG)*cMq|1#t -d4H>CC)Xpy hM8b vMקrmH(jYv-tn#7) @iMm0%%y nOb?i >[9Ac΢sؚ e5 Ύ"ѻ;Tݟq2UEgM!`aGgK@ys^V K0]9'!U$^چ"%)4V4Fw(E! RJB?/\y;wN2/Qy!A`@+h5c1\Ud_c٬vaV%%`,La`jE0jj=r,%&!; Ϳءp" n! y_]PMp0D?qēEfzW yzUz,5^p 2 G,@lpEtp?,ٰ?=,ʽ&h,Y>`XWç m(a0-,ksU&tuXF7`I Seͬ '务{$mr$=ECi*P̓‘87(_ ~8gc^Yrf=p3HJDO;jSb_@di߽Gj;f?`Hɯq%grJj[WZT-(\4.hYVe!U_- ӡRcDZB611Yly,4Y,o X K̊&lUQ[z:(r I9-EzWu;2QB*Ŋ?qJ`J>G*<5Ҩȗg[ّW\^1+2R ].ffkV4s=U7cZslxXNni/߂40iاÂ瞗Gt)lyyު* *4n`ѷݧ%=t,膛q<*YE64ǘ8Wzd-Ӽ|!8l6rqrZ9q@\2}hB快!6$2l\N:$/uĢ\Au(`TT mv#i91k247l q^(Wf \I|.2WCL5á^ղҝ9WtO„\͓rۡhKz}'wyAudyNJΐ[P\f4iarsUj$D;*)P 9Hn3"I:UT:=4fv\t^i%}b[ "k۩E}f| up u/1-ALpD7-VܮYI$Jw\[o5h'^D0D"tnC0Usj Λhfrv5at1N(sf$%y{g0pAEsw< eQdV"I)hhfHŲ(W^GH*Gr 8#}~iXڀ)΄Z F'.\3\ϑH kq:~`_.!S2K_ H?Z6)3W3ET1n2GvJ+yrC1[[M8މt 2mٲe254kZC)rq@A;n,3.W4tZ:hXdռhV~_\LyUWΪlQw4XL>0C1ito$Н:Lna5Ļ=BDn9zhaK滎QM*7˱Hܙ&XpD:R'$IBnoҵ*X`X1.0%M|9Nk9svmd.-W;BLv :7qsɔYyFIjA¤ "іE͆z_T:mPjdus{m3с!8Opἀ2Qjl4cUYO.zC:X՛ xGڽ7# :[zT Y>x6͢`ׂY~rJRC3_MTO$;Lfѫs$˜1bz%bw5s#U;Ky{qX7Nh%?WdkBi.K.f4M.,:(-uq%3w[d 4s^FI~0>6.Βڄٔ`[EaQs˽r9/)<$jaS\C^u8== M~'J$._uq>*bML-uQj klF p ۿ/j 9t1monF ؚ_/BªعO"W_VbWJpa.]Cww[{{G YE3@k)M͂<_ljs)g aLO&]%w<)d)Ԥ/Y}tXNh\rw\3>S`yԧ.:cL1,΀)_%Jr-kE,ɑG 2{92 !RC-~т>228.ku:pI,s!=+VL NūǐLY/*FQvmd#IV42vu\uK18S=l,GQl,#X-F@[BL '%} 3~c-& X>÷<`hΜ7H˲Kwd)_95~?9gcd ˿Ar^].zwdÆtʹ_λ]/?*PXe)%#UMZC/yy7wZlnxfvC !uآ֡-b2XM9umтըֈEاEp) [T])E5͏#hGY 1c;qZ)ʵgG5eFA,+=a'UCd¢NڅE:M.csIqhܝֺ[?!ܱ#˚}jx 0UBJqZ(`--Xp2YL}4"fW-0ǬoA,( I!z cLcYo]X`:8]t͛7qSP巜mZ'(]KRv9EaM<:5d,18exb:+wm߯4p0|&TY싀ZR1s9g`/#E㕑Ns%K+,7?I;r T]bYk۞)"qwb{ɱ{DzR#eg3޷*'t7,6-<Ϻ?t eեܣcz1ys~B4!<dVD%>{NH.`,Vrcő}6iBi8:uԲYdy,t`iQh¶MRr$tY7ᤓ /hF+!RҌ'K:aÖvOԢa;u}S,gai˻L^0W'&^od5@u7BMGte=Mూ:9 LSse ͆]UuG2 4Ź}n3hZVc7Ï8 K[2Hy)i/:|U\4}8VFb#}76_TbFq\QY994 aRfad5 PӹTFl64J4̶CQF.nPm=O#H "WyXMDhhKP.p~vBh]=hc2a!fԧ_^``MYR8W#o^4N~Bsrƴx0gn4^1`s[^/{oErX)ziOB$YnXjC527b8JlyPV5fdzh&8ah㐤Ş’RCܔIUXÔ2&1z?~;d988#KΪfDg,`ѧB9\yŻ$n54ͲNiܾR0kZErIArװu\˘ç=nOhu]I#,͂ *tKID4I A\h*\k *,&pVFD#Xu@y갖H8/Θ\ VX5'Xw0B1MV%\hL΋ 9 A꯱-:TM^7Q9h*SJHZ0W%ݼ3<|< -"t(7]ҠO<ͷhD#p+/C3;jU:zJ>[fnufJ"ZX8%LxKG`ڡ悉D!H (U -'{tY2zWPV@óQ>!mbߵv] j3LJWFeVŬ,Օ-gA1ͨjޑk/.GxlmE$JFXW]iޙpUtj@ qc|y@2V2oȑ|։HZ+p [,ɂn46L-.bgY7*H[/wXQGhc.QR c[,#JܢsӻjoFվĥ<̓Z\ bW]X6HckIX ޵i0&IRǶA'byʙ` ~k*ڇ|֗ lQx̖ukYyF{ 3*PLeft=Z`,2bhdW7c~NVj^IvL t0PZ#딣mMb4tp`u{A#L*$g]'MإPJh~o02$Yw i v1(n΁ql 6sfB{QDJdܳĐX' vȪ ~S(TH=;nO/0\TTx,χ F I<&wX(aU "N,sg-,e!(\ ``&JQ |/7}k9YD?#d9l"\ђH'm*-?mbݭzI FU0usotn9;<_϶ףدgRO к 䛯/O*jo5b˨pi a!2:jf֋,PTe#`3 te(نQ}6.\P߁o4=\\]4ۭ$lnނ6ejnÍ>`OxJ>h;GR;-UYEwcBm)%N2L îI\]pؾIjw:7KD[\}qAf5ܢ`:~a`4bn*y\ FZ+ms;K# Y休\#'=xOҷhZw1>ddi:YkYd!0*˜jr2g0#(vwGxAAٟF]0̜}qm8WLǻ"[^J*-+쬝5S=En9 !z:VttZ3)\sɡ~~Ӝo3 Z]60t`Olc_f4\rDXcR0qf'/ZD&95cUYC:7OZ274ڑz@lsYfP{S{~Y# 4.dfӴ2JCk&7џT&Bq8C{0t(A >\t ɡp?^-KOXk 4Ik`$(9 s+@yR@ek B9R\8kv5Qa|hm`޿Ae>LC+* A"l`WHpZ3,jamu;?ͱղA@`(tmfmE"DFE6Do#SvG|ʕ>8C|pѤשacUJ|Uݧ:,\Px6n^Fhb- !BS{gUZtࠆ2IKfbOA 7@-q,b&1 s#OPo}E*`ƛx'UL&{8a3jlkHTqEٌ\`R%3JsGY,^w} 󭀵ԓF5\K8Gc27irU}t\ti-Kq," BB;z*K8x[s';*3%]0:fEЂ>-heNSHMz=@$LϡpS_ZdQ77k;dod#8O3jrj $\v+*m|ވǎ ao^|_1Ř]=p &R+zFOF;xwʼnʡC~xEZ b"iWE#M1*]Pt܉תrj)oV'<,.׎ŪQcَE۴sJ؅uX9c5 ˝26&GvQ˶]t>3li1"⸘إLv5i7ޏX%&(wR̿|6Tԡ }UhPN**CTxnjCoMRfaoosw-٧iySKq̓:벦H߅gtO.c@* Kru>D Cl4[uSk7+7 Q33cإ}Yuh_J(C|uDg "˾A܅ɽjߢp_ O{XF&~Nrt؆mKaf*XL_:v>p8B Cҷ,=zyBC G} xgY49I&f?G2 R ZNiPU\QA|]1 S *U">cWPn+aeqe{tsc{(ϓVJ䶛הn+=>޻G?2q>Ѭԅsiaqx8y!e |VIW ɛ'Wq&d7OɲZ* N=0̀&#J IC%Y ^ y^Mk+Ky^zʁ<\@rR , ?O.hr32̇p4w'~o̱4:mJŤ IEC"" xĀ"{^J,8W#) I*HʟD@|2{Ӟ oFmJi( ZE5@X&Awԝ#/#"rOܷ-&IlpBrfˊEdQXq΢13Z x<,m'_$i$a !r`b`I ,eǚS/}.0I&7Y&Ow&0t)b1dk%&1rr,Rv a\^[&L>sjXG[HO ܀ysHR4ATnupfР h@ 'S)Ci])^rؕU@Ơ`W}~ L, B'>î8F( ->dSs*A$%*e>Գ/UѻK}ie51VQCeY|&IU0%f 06R >J94,<K|4Gz^(i@ JMQ ~,hUDc  6f4f^At}wE6kӐِrMAFޜ-{x+ŕc{fy}wa랬N!`v1fP:=ݯS%S'+¾Tyz>}`^`1$ygxlMw”Ē^&g[! ,s3_pdu0 ):PĜA > ץCAbIۀ7KEn }*PhTDB ''hĭkTL#45unpGa^(2u`[*MGS(xe<,.gtwKc+'4K._y6b@>F]Ӻ-N午E1c`w*X2_2"NO Xꉼ&IR09?6ѽ:(@3a .T2,*A'MJWLPOU\E#П.фV$0FEN)EONBSoԀ5ռZ)ŗ#I RM;2ޟ$7snFЙH`9n 8 Qq+EjOktjYF ɀ_L\bE3L4Qڲԑ$Pe^$kԟKGH:UNr'a@iRT2BYA=6#h6硽$E"yፘ ,p|#p `v2Π/p̀.L[$}Kl`I8^,FO`0Z(SX6[dAGR- H.< 18RA4,Wouܹ,w1`Nq[_i]ⰸ(,O)ϨF/rLGeWZ-O@{aezM{{MMr,f^"oeN\A)Y 0IJ] \L&>W;TrDdW P^\@Fo=/VO H.*MRׯBt:%'@N!p7 ٗ6~GD z3%7`5ןgRRlN`Ti^Q  $LԊ$iFiT.Ὁi 0̫,02a~w1dsv RHCRiH=ɴJ(hd w9^'heM&G 7cĴje݄T $j. +걪τx>bed4@)+>'e&a 7&.7gj0CTYC<ȴLC1 B6Y\NC~)Oh)1Ll !6%{|`*JLF x)-Z` qa}c^݄?T/ll8o+ k?Qs߻e>9x<޾37 IX~X71s10]4*'YVju}Yݨ—͍ͭVekU,\x+Cx 0$L[=DI=d![a}_<nbEСZ'5dʹ!1OAԚW~lmtl>f2@m+˼:>QRrU!\br:;OD{m,R? tɌ+ϵ4F,_Yca([ 'dQ3Cp0LJ`(XN0z9|)Y!4Im|sIYyeͨc5s' JxZOoWIVk^F""nz}Hiɭ@sA)?XgF`3T0G4HZZ1Z@J+ÐD AAj*ꐜuvOwݓp0 i7jji=mJ1 NWD/"@I&%G `3AJyp8[Tgum SQ̹PΞxt@4YaO"̓様0 !~1S礈߳w{Ѝ\.gz Vv'*v% ,W(f$ lڱ lגVHSR!h ErtXvL;JdOT&Aφ8u%E3m7KKDiyz2̛A] 6^g?}3xz3ˉ1G-ͳzeL+ݮD20*II\YT2?dPrVO"Lb,㲌uΒ\|*$Dcym2e RDAZ^a!QM!d<@XŞBǐfu¸5åbх]y#<^w[-:{qLIiXQ7_}$_FDެw1dw0;\"FDQ#4q4Ò6fF. F}[a-.pLy!-';@բeJ2rw(8L][)R,l(e4+U%= {D@X͌pȟM4;Yfj%rIP-ls[C3pUS-!ǭ[#}[Vy۔>0 #JLR$Eܲ8ol Tzn~ejl:na3FgїIL|A]E0RJZxkAolCt \|gr7@~ؙ:RTu(3~BC*r{{rV j@d$N8 KQ% *s(URvos8t+, Q^Ao: _B,tı;b5 {oast |.;.gn4- xiHb:CbALq$r!f^*&yBFR[m%eitH 5WrK;#F|\ǀ7Dz](vdH`S@|3Ji!),D~%Zn^ W伎b|:a*"{}#ռJD-l!(ct_#i]q[@nJT`Gc SKף"cv\]$[|/5+D \(HA${;&cst ̵0STHJ=s0Gש҄ FeFbq}yyt_|FbE m*׿+O=WoU:;r3H-f3jf@$WȊBmy & ot]ָ8ĜšPpE2B߃Zea}JE?P>TR[Ь344;EMsq5e73Uec%YcR]`j%T$F4׈/$Z(HLa8SOy²Va[xݮ۱u6fbޒw> k:KA%Ds`k^U[>Fcyx㊅EZ=ܺ]c=X0r z>_EQDb)X]h?Q-.؝h8P__(a_8Wg[xE (!,@Zpok3h8`uP]̾$ #Y|{FaE^!4I*YR'q<+gCTy 9U0D.&U>8g9F>hE/)]zԣOqg..,{(* |e@1|o`Pn Ns T{a{5&C^xQb/M( ZەfDQDQ5Eb4C‚ר"&P C^Vaɷ֪Y44la="Q>JKӒ8qИ0,vrΜؐ(O!Eg" 6IG+W-t%b& M_ZYNBn=Rv@P/uZ.ҢKė,7eϢ<]סA?́rDD9eD;/V+Tjvl? .+?!{>cd!%]@fq4LG)qJhdIU Yh]?[W^GhPpq`4.v#Pw\4ӥw9"\(#l.ƵI`m sic-ɷy}jGϯؓKia7gj!0tqFEN"QŠݯi1=1@}sL2>fuccנ ۗ|b}\캳Q-yH}+O=Bt )/X$<\_8Q獫."dY]R3/ȥv-TRWɆ˃bhcW Ԡ넝NX;dl\%3:\n^Ke[g(8qМ.$ V炲<)Q]*[E u3exY1BXQSh`7D,Ս0ER%q\o )fTde\TM.̔'Dkh<6bxwDFz|iM?<:5:ٺP@.7[ ;Q.ԱE`ѾL/xB]sGZ%Q[OboGO\ȍ lQ1]6n阦2Ѿk<g`aڐ#&ξj@,Ex{֣/*N]N#LUGW"uq`>ʹ<_h,]8^i4U]0v}^|! bcIί(t!|GDU.x`FYz kV Bߒi^@ R $7d&f6Mb^D&`֪֪*[F=-e5Iki^SCg |]QƂXdj]wCU}vOwr|Lx$sx03&%aqY嗋iingLjHp;qD%T*rܪ䤳N '41AGrEAbOS(z QWI3K_^d܃kj2˽Aݸ&{ 7Yq(mam6pP:/:fS~ 鞏kyBZW융Υƙ 6:W +1 tcDrVLbmQ­گ{o*)}ZE/%wЁ_Nj} nc*Uq\GƢ J{ } E TRDkp%+; Lo9|k>sl/7\::x7Vt؏)it'PgA!v֒i* >m;פKz3 .(9h#lmG"Hgv[4h}\pjAIAa"IKW6VIp,7ٳW'|ߠae6kXtm]e,0;h#BtYY靈;t]ȵuXtgD0U*+t#o/)U7S։`.+۸E-h2ʌ),.mZFj]4,+5 3n0G䵰)4!?@1(ܧ|@ EM6z6I銢LեUoWmQlqB):]7mUPdɢ(ɓ(o;,|rDwo^odAXF\Lꉁ_@Зt73EdrqN 1OZs=X[_>Z\b5n/-\/ $x|{އK#@Qeq@QkI500iAՊkfUkEù5!ȑ#)85^:M:%m-i, |EWkZuQpxdi<;F=oGUe-Y+vK$궒L5,8d弸`3PpzT$gk&7+mM7.d@3E7:7ZB[BZ#W Du7)CO#cC{1UP3c&Iҝ x$Z3D3xğ&[(PL},NX C(bp$75&sUOLF`9E,ۯh!=]2 _X2rN@"r,Z S0<}h2h Be~@14*ޘeڥ=,&, wKL~Yodse`$0K͜:U&6鉱 MW&}^1EdBwyZszr(0AgP$Y.;R=km(ܹۤEg+n)7Rxb'CJ{{;bb8&ͼR®1x  ٧@vX\ >UϸWI0fdFF{Uxvhнhvؕ_瞔Eڅv-m(!)ȺSVwp>F6uI ;DZ[eZ8-J}5!+2mQ (G+P̭rQa$x+j#$@K]M]}.SSǀJjW4(%N_(0VL6IIJn:u(' ^n$6KŪx=Qmȹ1 Z~~HD恱ǝE*C!FwVaKEA;¢ԃ }ފt<\OsCĆrO@bK(D.{LLzcy4nޭ]+w+mT[`+6&X OfLX'Jq ^D;66?\:/B o$ Y^y#P)+E=U/ e8"%L MSh(n(:vTւ,3[{/pC8<\/Ud)w5~n_9^fܤoB{{WT6:-mhŸϡdy-7 ͍&2[8wދ{]YXC<<!\t/xv-npr-҅ejeKG^x߹.*qY1l3䎜F~Yc0bIue.r.Xގkqہ6؟[>W8MY[ qd-^G)l h(E^+,gmCE^]~aB-͐>1mlx̲,+!!U}~!7JEgˀ Լ OhQ)dQ$kck#%ezX$tmTdZڽԣots ˈG;reK^jw@؞ۇw`\EIMc/{pމ~Dcrh Y_YHS Aa qv-8q$]G 1@ C | Pv"Ȭx׏mk/[wKvʲ]{ %a6 ɞ)*ڛ>}#}iV<[ql$aA#u>k'6 ALhPv6Uw/M2roxmo?㜺=5tr C_)QX}a*UE0QEQFCI4y ֲ,eYYOCrqDC|G|a6qq|("w:E Gx׷uwRc+83YݬW\;=uzOy¤Ir&J4pϲW8ޟ0KʻX0ljڬ\m̋UUf?K[yYag= pvA]>19bp 3_[Ariֺ\M$VYIe~8܄+5=3*.uΎI4"f[hL4.']*. '[\6ֿALFIA<`aWd3R|x=F5nJxlƵMOӳݽ Q] jJVюVy#HSwCpgx[ɑWo}7X# .khT$RųQHݮ@1tߊ\ƱRF");B v/AIrn[XCO`f4hTI%aHfe7a1S2gֽ7y CTeĝmaQ㫂rAeo.+]dA_N2dBw辟d,on~q? "W_.yЀMbߚVƏ/+V qM&CVpv/P^'!2~x*sA 4ךIhSO;,]"/?|ɠ w K[u甕:d?x(,Y%@-țW;ZFsgoci_ѡ&9٧B 9F32sd6UG^OlILR,k=zod]qL4u1둣"^|zyzp7̧3,9e%ĭQq*`hu׷c-ƻt=qIY3˷.'~!R-s5nMq oMD|i՜\SOBrTf2\rL\$3Ig[ؾȿr 1f+6B~a9h)UbYk xboo"n(J!|%W 6mR!F] kv.=P3\CLq?.qR MZJ_Pس˿.cѝLt5!)?),,BkZK!(dLL@R;X7V9+kEweesIhC@D(A e^bnkg#rroXȞlN6jIOJyph~78tH^65ѮHLSM8F4zCPn$Em,Vg^,t+jBk7r0)q,U{Y|8bR'$[fH7=ry*JÂ*3J%E;#eo4MRjeX;X)X&|jQfr2"+ _ylaA\~7ME a=ʔDo-bGܬ֧'f]HN4 aUGFJusWE'J8NtYF[>yFou_ 7:IBhvm5zʢ1x\0t\eo8|RpFoيc&s+؟qVբ=rH5,lt܄HO=m"UhH_Q݄/ xk!4b_I|˜j#I0:xP|+7ft$M´۽ˇncS ..w[RbAxow^X.QmSʒwv vYF:8J։]4y#r]K    Kec %Bg7e`)6p,[f~A\qlԩu&pӜMF惡v>-)1^1wL&YtTp|sn>,dNqBQN8VF<iba弍jrP{4.M .ʻTy,:.o 32qD=&[\W;3viP69mP1(Жu:\YOMwbQ=B{ݻAse\{>)+9`ߏ2hQtmh$u[qC-(ueJ_hy_9DEJH粬wB`o=sxc/FNt:։uұi˂s(N,41KkD9k_e -Swd7~H8a/^#nWL?K-dlYp6ӁU+r.s%QVl:t.,g8d+/xhPeIB$[,bs%nlFY^7[+M+jV{C?tҋ4;-#ȹV+/޽&azZOr0kI.0#i+zm0T+z? `^>Ycץk7 _# G2;ԙt=/WZ fe I}Ciɢp}̌V}E-gM6 ٬^ȫ4-g-w(X_]U^ &UX*-V(WԱd!nIa-~΄GjٲX~@/6*zsL5;Ύ(i#_;w7R\^ :q@rx;_ܟíb ~aɓ, Uc:,&`1ULtqO=|`_KoWT ).E6 \kpf3ԙ ӆm01n(JNdGĸ ~5Q[i++UH7ps)tѶtD8")G=xȑ_&e;r튂Ŕ;i"CBX&_Bw@h6ۦ,2!gMun2B3셟k;7 ؝ o|~Ns  I 0 ¨LBѰ(Ȏ=@-Q> nXA(4;49h(na~țCc`C}}mB99E:gbmq\¤kib!/\uڐr[󢠷P$Y^7a?"lA9uIwq/)]x7 :36nCnbu rߪ\% TgvP?nf't#i =t{ǗDݷv',nA=N=4N}E˗%~9w<1`B5={Ik$}ԝ ם-Mk .`Isxho^cLžAW3ʈH^|Zu7&>OHZؘr7ˊK'ޢIc[oa)g.zE5io;;еG4+ZX-ye.F~=6&x?$>8ƢP"YxUވ_rO7'+!u,YI+2^eh@; qߙ*=1h*R9%nEHbºĈ Ily+*/&x!a9dӕ'*6˺))T, EeMܕC<u#pg#&*$"2{*J6oOaRQ<bQ]BNZIܝZV\+޾Sr.;8bw" ˢ"fY}i&.teBn oz૜:liIe ԩqE łb,/rus&.rbF7lR^x8X"*aJjc3) Kʟϳ;bҤqdXp&Nɪa(ofYK cohO'=#6s1ȷEPeAvl9ReukJ Ǵ)k'E }| ۳qWR>.e{*fIXy[clSkYm{LΫ/;bϿ[m9ʵTBLM%ƟT) )DHR|^ia&97{٘ t!icqt:&,< jdˢĖCы@I?q2.)9qG@X8.=TKO;&q.eř\3;GpV M"Q Tp;-|,6=XHNyT,v ʫ76f-!aӛW_6ځBCSF}y|W]gaRUv_;-@;M%98".iIB Afp?**;AAv "(J\a߻{]~w_*'*Jni<7g oOy2Oƃl8*|S9jħ^|$5f?aI78|M7m7N7=wSg7'-Ug>Gǽ.@t>K]@b_^c"&#: ܓy%cop M'Qw:9a`Hy^{fix o3 2)N#s` &xVsLUF|<ϺpHh4Htף0 !iԪWVr^|e (2$tYF'dexu` )iI)[[p@@P]aRr%|fW> `ޛ'Af#>BiP(p$sAJvv[4bԢ&o(;LH( A{d8 &,#iY  }?|AvFeh2Gz5ac)N48@0@HB*gpo(4PXND|9!:?ŷYgTyq] F.,.Du2B+fdwm;\7:K4>??;?MFR8ʪ,^+R(K;L$iԓVِE -.,ם܇[4Oo•S@JbX .ter"upҶ? Q0i4au! O8 B0w: f:}X@9-SKaJ W\XhZ^w8̦NE_p,7#-pһ}<{d>gD0^ E Ka*>0^P]&ݓIV^ě@1Ț؉%yqŅZ ,W2,ږ`pYQMHm|\GeHѧ#Ռp:21C'rȾoW]kvHi_ >WF\/MmHNO孎wP2,0(Rz>Y.j[t;]aPO,F[5X$,vCLYl%ɰ<ޥ4@^K# trK u@ 8z KTd_oa/g.q޸  PmK$H @U&FpQ΁rh5lxb?CRfSvUПmxѸ<Z74]K+bs_ӭ:?żП)q_ bר/0BS!DPVuŇF0B !~kYDOK8/RebxC!}Td%)+HP6]⡡bw냰EOѐ疥C;l҈AE*e~[<4.G227ݝrEętA#&`=m^lE'eda4mEhL Xvj E~6J{;t,?3-11FCNld *p++9i21(ȮKIYKiUJ4I|Ɓ_?2` iM4$4@Z(BMX?e磓HA#.q{iZY|Bò K$zL 5`߸-4apLi{|IhtQ#ވip&RKq&J] 5D}E|j2Չ"F&ZDHLnq@SKc\K'?s֜-hd9[J M@5fu@(B -yKjbLc?5)KAXb lxT qef1szθq'C0ZՏhox6RjeQ*E7S? |v&'4,0Ү 9뤱^Ps ?G4ع MB?|B:qP(+\G4X G4%gӿ6Z v9юȰ`1 ,^QE'ʹ3LM^BcAE> SÂ^n@"F)H+ (Kٽ K7F.f{`rN?C{\,I+40ݬ9G65fY`!w0ɼLDy4jՊ°U(OXAG(mI#$#Q IR QPNN$\ e%-"T茶?&Y)_<*<=N/ >~Teő\:ù-w8߬#0`,0?H٢6$Eµ R.hiɘ #FKS-nڪma"WVb{4kֿ sQLxM`Xd⢋}+Q>J<q1F}*Y8Yv@^| 'lTF *ᕽfscVo6xe@ u-h,C=?Dѯ-eyT$z;( hRG}t(B?w[ dK]ea:OzpwjP@`۲㑜RRGX}EPp"=G%˳ .H} ̘䰜)X\OX& T6rKDyjR~ř{XnN'8mرlémMœTzzbQS0ph%tF|A+sD|ja?u3 `3SXY`(PS-2'?E8X2XE.XF> .+ja8l], $. PA8`JrK_M%?&t9t[ uSQ$prŨ(SSr|C"רo\i_R7V2?Jg~:EalLmJU!2-E!arXnlns30Il'U\Uf ٟCF,!fË<$"-yWPTgLtx`t x.UOzTNc4Â5,:5dȎXC<,) Yd D`l)Δe5„<].54d`jzXf"7JI Dx( .}:PjU+bQXM;X Lq!"mQ MǓ 9ו{YY'ZX A-lX: ^j`* HE]֣\w{.}{gJ0f(:Ԓ3vUr x}cz"A!w8uR?pZ?P9=llL\ ɲpO#1"kޠؘe@m.5?S:cBՒQ GlKj/+fH]4]d;OʹSNr*̗]?d1_^!`u5.4FUHE~%_Ydd/ ˘gU F5F9eOJWMAcZ;y]eKA<Zٺ}̢F92RfFfhڕl4HHVs92Q3w .fehh(cbrU7ĚG;!\5%E1*Xa_k>~>S :$AR๖ϯ993Ɋ (Vb@0n#8כsH@:&P2d>15:8AA};)~\̺JrYXtwXb.77xg1v\HOpCiJQ nV,ao%syP!M?`+t>\X'nR5 Qaqy@, 42{g. Vn#-NU7KKXLGs}SKKY0 ;Cv,#f&@潊:] 銸%=W:H\ip(t40l8,K#b ŲkhEi8!1Us b5UX2i,ۨTdE Y5E j++n଺qɓcfP(aTQ*l#L:3=%h8)7 ('F&AyI e X'Jɘ(;Njs ( ;y_`2h[R"u}j2 f`|F,,Z)aNޓ,zX ZGzp,IRKw疫9yYD I/?k?zia%TSlPrdYʖ/ z.R]!}e6zéJɐ/)5kΡ%E/Xe)'L,$$m=>igҒ~w7g@L\XP 2:gN Pʗ(TM+k/lsqFF~JӐ8C$/5`xB=je̩%fE}dh)L'tr@VlӶ[ZHcЏ鐎p"MT@ RFERJ1qUl[o&8mE%錢!4KnwTͨ569? CzҺ,)6& +tdȝ@H4h؋ ]F5@`kvج=2^o-~i?MbbE?ZV|""3|&:5/USw$aHS`;!qHM8Yz;&izK%5?AlJG]u@/XG|D??SNQfdB)ZqB/Qz{)U4.q7RAr fEg &D3hcb>cs93<#Ry~Fga:"QdX]FSܴ)X}QA9EC -J"dfOt%|ijhfL' 8sﱜғdpfށ(+ XKBa%F* q~b%Y[DV 445s&-׌06"-"?MZ96dIq}{KBT$lP'hjd<(H(9P/-c6ohR !+q8(J4؝(c&F &r"_\tRJ^0a&k%[ɐҤy"~yErH4y0КN*gv=DN4y!XHJK7m4=8h}c=y( tk%,we ?t Ft?9_E+Rp$=#4qפ_>Qʷ9Nx,*+KΤl ͤŪ^]6z)(2j]TV-z儾|I6QHD1q`وӚnZvXb.*QRB/=`<׹Qv >Xsר [\8-I' cӞtB9Fq~&]^Z|ŶnzXsBfl>z#J$4n eyFnaq: 3"MW)VZ:uA,\ </(nU i#ȴ 2ULgoZضTVFSC(YvF96[I%KmDJ"Ƹ) >!35th#%}h_Q-%`bAxFD6R©"nF[NNŁR)JVQ<$APVYao+6.6r( 4t`Lۈk6-3iJ0TEm]h'sxh7f't;͝=",(,Ѝ7/pc uaOiMd[ ZYT.\efBuiuGmN#DsTѕXS0n]V:UmiX@m .=Ζt%Fez]2k d734*HHQumlňb=##8V;)M,^OKbh,qA@I-`[l_q<49mT=Z[#W'@`Ed]ϣcTd&m:WThaIQMMV1FK̊dq`/#Mo /4};:k( m*7MB (1lYau&^or\gd^,ǭl Q2$0̪SfŤ Xh>71KF?:ȕz3Lzmoy1RK8Ǹ̛-0_?aXq"j`m0g [,)s xrv8ʊk$|,թD 58#vI<$?e.Q#asE1.PU Ds3j1 o胳fO4UԀvLhAY+TxWxF`[sZWgnhM@qIQQ] px{"gg]iwgqe@dD\H9M'6c٘g"ꤱ!K7q Ao AFuBx|55$^M{-޸E7Vi8 YQGPT~ŕśU#00 sAo!y$NG~˝97ڜnYhM9.{oҗFkv>!`/8*# YE,pJj{bW1-좤,At11|EcޢXa@-rˣUEE;s4k\ -J2Qi̵m|rqDfԌN:-pVҸo]G|̙ECa`p0ON"*N^mqOA^\J3+(!}7 B(P&i7hpU .-|ؒfFZmN9AF`\=\- (xDjUޚ48ŷI$;YL-"N3C$:Q4KtK%e/vFuwY*Pt}zhllHA??敗&'ӆqL1 M˲>t_?6(9c- HT4r,:UQ d5@;,l_m\8נT[aÂRFo FG HI3\H:jhU)9&(y)7oٲBa=BM/#nx\E&ɨ-6(rK9I<XZZؿI <,;-Phg)u@Y/EwI3Y 9+dXg}wC SXܩl^#op/Y= ka x[tI- O[ qa۵3TYkmk4ZƧ ޢ`_Z812#YP Khn.>cTCiWy9@*wR/֮9/g-dA:Uw[ CK]PY"W\+qL0Ra"P̖d>aY Mؒ r)=s ;쌎vðV}c>I|ȃ_;pWԘ.HܾrW:$4+ƙ^¼B̡r}. a.Ѡ1Jl`Nf4{by}EQCci5J XH/X 2lR&t%nf`$epT5m {b,\b;G._x f-I0׽~qt K+* Ř:U,MCHYƒ@{D>M)[z 4na(W4Sy=e#0 a9>˟sܤVɄ]/[NsmQi 5_?tQ-)zXRE ,øCף)܂|wCREO5d7l420jߵY [Z7,-5̯-zRA0{Y奎d?HXȺɏ y;rXJ1o훔L$ ܕ2E!EoЕT"sƵgJ%i"6LrqErˍ*mJ&xZ1Y0' NzZDk1(2YyJ,Ksp}NqA1+ qV ,8$ XnSQ V H6Ԩ t.d#z_)@ZYy,hfl 7nt'i9%L9ݴѯXON b>[ʚ)'|rpޯZh훓-#,x kL.YRqe0b9t1F膟?YѤNYeU;1 ` zX[jr`|/{Se5H?ED"~L c8Ng_Zbd3_&-Kktudyɦt>䎢v6|t(%8oX>"$r9tVZW` AaB0a}y sʈb|Ζ'9GⒷw*HبcIU}~goa{kk8p0 Z(Ny">Wi\~"O(Qi 9 KbBK} ~@e=LBd !̽FذDerm񢉥n^Ș زs癮y\a9tKFw5KFå Bp0ctCKܞ.\@ VEH8JTshg7]dX(c./RE4ByZnxFYJgl>*rrRi0j60kx(nS)&M,zR΋\dž/bON#8ݛ>(yzjv1q:,[,$ވ^3w\9`$$ĸ~pml➌*K]x6`J4N}6pU$xro5DI)l[4ʪ1*{D{95:XW~M0QŮ{ |m lWsAm:pgb!᳿/)t<ٌymqTng)[ >rXnһTOtX$_k7 h|6YjVobz_ ~Im9硒9NEA^bK?3]4n_8*RK|c2} 18 gd\lĬ3ͅk{ȹMl Sʄ^p6$Hn _jj҉ 9 zU9ٶ@e>ߧ`;|Nh5d,U:-q^A]I'\^@X'"CL901l17pCLx\cϞӸ+ V'  3}K0R;C ([Ύ*l<'\E@vk6D!mW-:틘5."JSOc8-+MO}˘ ZH*atJd)PR:({!N_a ~|>|IYU?*yk8.qQĻӸPnj<g/I$tq X|etNK?׶u[XxɮXz"JLI/?`C&(vy('AI/b~OyDGiwiB|c<[r\*WhF]iQ_伒q8jX(uH]a>^L&c0yH}k¯pblާF_B8s0bl^ICT+Dlxf] dkiъ#VIL}EC3M^ DzIlBX݊9*,$5߬T63u,dتx]~ k>\YKy%)GIkӛ-ˬu@ ɧ p[+Mc E2gs0 ?s@h:o-)\c!O=3f٠"n/$'#*bJ&)>D5<>ٔ9d:K@[n;P+zr5낃ɊLح!rg1s9.W3J̖(q(ʯ]ka~6dK@ڍ:3D\XϘ|d)u|.`t \Z#HɂIn̷+Q 4%qp_gQ?"{8\ e6 ms2rLc:LV X̯6˓\t{E K~\QkYqSZqOz W>Y4[*g0pje Q׳o"u39L@(H[j>MͬD:q1v E{ۉ\۷ddݓCřk2F^1mШ0@bH(jJtaWoQr>;;6,ɪ!|\Ax-xƸ$AYry=ču6,˲^2I3C  yʿ>ާr) " X#%o[ w'\Vahb<}Le@1s l/tIZ);{Ԗ nEL{U)x ˉ]XwN (b@7Yb8,%ˏXJ4J:ONN 8!iߴ8r8(x(wKM|lw"@}9 QJcq{>e;)lPNzpxxSU F6Zp:M4*ULm|l[LHa5 ÞӍoeC1` &E\Y9IL]8)d}8$ :Mm6 ,(|Lž(P"2Uo/t}nW1,8ihcLtW)qI0CN[:.Ѧv%ăaDC~WUKʈoQ"e*w*X\X!87N6(y3!63\5lt--g@{X|*N JXˎϻ%N8,יոl;(f|T2FRAbvԇBc)SEy0 S*씐(%x"DxYw2ap8e6'Dq"ƄC+op-ahwh(&Ei@rWn eYr-ֱ\< ST$K ʕ7NfC|e$\ :W XQDy(Ej$% aH^h(;dODD KѺJq0HZ!XEkf{=*lgRV# s[RKŲc]- vv.Q !I=??Lq b+uNmHU86ti3cn;7n=}jh ^։r;Md:K2ıĒdF-%a5&̱J҈9Q]ChDy,FT`yE/Ő .px,)ͭk 55Sk=k{JkkNܞ[KƉ3 s|%uF\V!F8Ձµ⍗~(f0o ݵz&4lM/p]rqtXa~%\J/GNN ~}mkcKBdt;w%pBQ5*ËCrvh'Ks~@Uv⯭+kAQU=mE * *!QK]+S1tgGJXفZPiT*u`(nQrp3_ULyq:E8VJ=.Y*, JI M@369sާѤTV+tET1v K[rK)! 8ژAd#9A=iAdۀ_I ǶTJ6]Wdm͖lI#.7sK mPAf;^cKt]>h8XZuZ3Ͽ2٠-Cr~kWN7diх~BEdݪфcI 2EHoߥ-EK6-ndVnЈ~*+ҐHSΖ,̟&zMIMn)IeP8Viy|xxkAC'XN=)U,$ IID$!mxwUKiwg.Xxoe؏1b<U $TKEU4we9Y1XV$9/h #P;%N ȗʦG⁽ A$g`3ZSm i;@U(Pn/0W}|hg| ﻦUbZz{EYnu8N~SڨSTqE}B12kt = fgl!k/{ԡ.ZbGHG6@S5k%sK:]Ek 9#CSwgqF/\zvC?@NN9!$x7Z6hV8veU-tzH9=_J=_vuں/ȗeĢWXG9Uژ}9<]ݘ*bWZrkt.jE)WY rAD:Iky_p,~gNapey[Bny*8qrɢmڛE ]gvn2TG BFv=97x6N^#M(:FYKQȌRiFV[&J 85v.3''r99@nZn&Ax̀lt3jަ'>9V},ZnN!TA0a!A]!s&QQ7isM0i+monQqjb1 V0h u{,9[5a[ċsN+3feLcRrd j[6,*m:׮  ݜKli/ޢYpt|a)|\bW0- K♳u, DH#[jlXEeYoR,5N%;x<:5G~)0;,׫'lb*EJ.%Mu49K%mՂB-ZX6ǑW.ps|*XN04,F^{=IŋXb))r.Q"+u ӫmD\UCPgHHF:,Ⓒ@._66j }MG9 5DsgCrŝ}JKzp&m?j+OU$ƭg.Ϝ/˹1y9o +@UY3L> 7@>Qv&AYVN5}w+ht(5$MedYL,YGzYH&}5]FR蠼cwͷlF'7 -D؛@r]Po,/sJ &04C{<¼euQ:f!`"'9/Y[NF 0.A$ɡ&^K> ܨ1C@Ҡo o2 [jyㆌ:ڪ rWŞV}L7 I[Ӷ5HJk2'Y0ubX2w*Xti@XEPRKd"V@(l$ >[n'BwY~N!aV*oR ŲĄLQ:H,i&x;- >Z*Ptf1.hcKhDO#n-se*gzX_߬նjx$la:'bZ@b xLBCC} dY_4s~YifƲ~ݯO9eKk㢈ʱJsdfKJb8U@+$@b 6gymW?ՠ;Uc[g#ׯ?lX]gY5d8ivBDa;:>Ӣ xE^OZ((oi\d)@4:$Y ;1p>E(ϳ&9#wp*oRgP8UnϞOhzr`{M#zN&ny}Sf}\"3^-0cD7m"sۧ4vcZR@T06śnVƀ"at$10CTRD}t X՘Z#8;YeMi m$ k? 쳙bctt plS &V`||vEj6DC R{EZi/ɀ@/ǧkf_ EpK!2 Y`j-˓dm ǢBis(`͌neQ\$kZeŲr @Y(kSIM8V+~)%i gr eRT fu/M '-;-Ө"gg nACE< Xti L^XS|+/.s/$^ӄ# ~ed r|q> l dDt+;W-@s>wg&j@w0]*bL\*Xj:XkfLs+^EӅ,&U.dd*[y37dHIAiI 1g: \ 7~C }T =Pb̑Cܬ4ˬ3PհXk{NXT쓈r||D2HLH'_1b%;&0Pcc( %RO*8L-,wr/bU(JH,[ߺmP>׫llʢWOv4-cHmPea k}818F4̎m-(<\f}QT/*f,NɟlK bP}'#80GISR$%o=i:f <H>yXe {;8IL4\ (d!ڿOTܺaE)Ax:#=>Zȶp(jFz8P 2o9r]֊4Zr*U 'eJrܗj 44:`ɂAǷ%O Ư\2,kc"hr{e,,hF hAx` L蘸\@m%2]skq,c5&tyRSs$TKyuNbB# LM<cɹ"i8 C`(,,|Yóbaay,,d^Ϲl,,эIlQ'mH<=Q$/R@$HϒcZED"p^uib@ntbc- Cк Ѽ~>axt\4 \.hYFF#2! {N]H,~9" mNiɋW*tCadB睼StS 5;npXBJ;/mRp@_4p,Y b4#-:Lj MWiGfXM,/h^@.{5]JES*]2)Č_>I||<<*``hJ %t9jGa{gg$_O6Dtd@M qP"6:w:hx}L5 4VWgâڣ;rKxǼ7siP~vPnk S?w1W\={O`>>0\FLaֈ%T3F8 <0 ֈI1ic>}P8܃rU{t%7P} LY֠ ^\^QgX>*w Sl0|<R%}#qit'=$M5Wy(ˆ- !FfaT2Ē0&}Cr2Iʓ(_7*衏*CU>J?(DI{1MHI;EOS/qX qDyhhD\pLFBHLہTa$mug2R9[qTMRFPKQcJE.waQ2w [>%ŏ8_3z3()-NPq:x2WPHB iwq4%5DaH/)"a7rD, JMH Q@g#lgrS|ɥ=Pʘy0euI&/*_jP[dH. YPEEl=P2~Kj٣i)MNq/9' d@dq(\{/'}Bx\Gd }!I7AK`H<)Pr^ d*Y$TR"}JBb4и$": aӰ+Wnsdmq@Qj@ $I &S}"܈ÃyaG$hCΆaKa'$M/PCJIb Lgvr@AJ31D#NP)"NsCyTxP*"LCGh*\DI4i [:!x>I;s_@QI$-YtL$#q-V.ŎA$fHbfDr^W79eK>n$JFi}Rb|@"'|7:>S'HXaN4ɣ:;2@A0C 7_?`((`9,ebyCp[XMk%㫕s Ez\ʀy4a8:]`)ez%W3,^&+&~|QZiKXfxꄲ.Z'7yYCg\? d;`k:7'& }څ9 iO6?z(JLu G$X#HoXz,Cʳ:,/w`Qa=Y5&&-'o bMx{p^&70`C'yC@Y檮qY6w]A!lS,ṡ~ކ?˱2R"FT9}oOl2 D4@*>,5 ԹtO8.Zw4Tӈ1ܘx@}g*`[ 4 'D NGt@/GCyP¡2JИ$d2c&a8nX^گK%Cb lQȎ[tzSSLbr,R4 (<6P.D4Q ͂toV(w=A.؄w{kGJHW{pzvdBlRbk3ɲ8E/&t}<ܑ+pqY:tiZ;[.U0qdC SA;#P?k|Ѭ+ qM(T$ܛ2#E0K"`mi&-M{^lӖ­6pJsTq-b>Y`Z~TO>dqKl h_߰#;VIrU 6Is0J/|0na$aunx(I~$4u>>޽' ɴtM|鳀q"[&Noqe~Z2/Z&b.W$ M" X%PݖYo[8U*U*߉ @?{X&%liq<.̽BHVɘ Gh?GZP"F0*5Nzz'Sfdžnn(zHG;PȮɸW .:1C&/(R@|^'ƴ艃L8ɬ:Z7^5I1p)Xe-+>܏E-ł8V(HR1y&b#[vť@6N@,]14 h[0/2G} Yjr@]+1l:µtXVCqt(m_%vv>_1 $:&; )Bht7 PXL-:q]!|AW;)C'TdVX!gHqe-yJAb:{OJʸ"i>g%#2E!2^!*:BBٟM&!={BIoCj= m Yfˑ K#NDIcOѰJ>f}E 1MfrВ"DAy3bE9 εl扰ٍNKPFsY],,(oczeBb;/V hFġ)8k .@~Iv~HvX%ȑf miWT-iع'^&`}p[&w=:9 ½98̹lK V E"OgV4wx&+jt=~;^eܑ0s.+E :.C?-$h%a%O P@td.WA-Z-Ź6 @6WIx\J%a-f~!G/>apл4i" 40 'v5绥+y8틵'悜 4}dN*|.2-lHT̩d701u^X2NN^T.[v[Y*pv.78&Indr8M7fwsQz]f*iPY&c2g5^9r?,Qm6YNxwF,h/O.I:mmDxe+-VVחv;ʍ7M%v,HAg z܎ÜUt/]$OdVpŽG(fBVLgCn–gX`';ۉs+ }Ik~]iMYPvEεI,F|\7v!@R{` |Zp חM,*$Lj{JDx8[@'WvgXUȯ:wG,ï 1hod6ngVr݅.5_m$!Oz`m0aNhRrUl!y]eXP&/O{=Hbq atʍ'o?,N:@ b!Q$ܟM<|QЙ0yB Ӈd2`bSYڔ9QcUwd1C`= lɝ/ Npz4 `C/V<&$hmMo)8Y$f% f T1FAqϭI>wZƹ6 a! sVrPQU)[X(L4Wo7nႿ̻A;#s<+״CdM4-E娋{VӪ~gv_@,fD 3 @_ۂӌHa`89C$jQ5O.oei89˂ŧ>&ô,:)n (rm'pI@4zfa9 0d&ECr|@J> k-R{LpJ$ ];6dP%sKD3[ڏʋ´w)&oS25%3C"֖LщL^R%> شTw3MK:Vq|ujnN,P 9VЁ[C6J_VZeGXk)rනd|%u;O ,>/}%kCB$D2<m"qU˵Ӡܥk tuwŔc\CaO{@s4^N%g ex' -ArXZjw18:{<RZ~y_!ћ7t6%@~$ B1{ ^\XK 7} o#Iuޅwx >rا5Ir/ڵx'HIPB=vgE %]wƠ,2nͿ3ojY$=йJg.anN5ve%2e>8 tb .Yra"]w2aprAOۗ* 3= sˀj1UuƻlD4]!VH a4th#KV#f1s5 A2 01n:r:Ylء.ȹ\C](kv1p4q|ag잧h'[ÜɵKuvVB>$Ibc8:UP"̟Aᜋ&k@m"|%Ls:)Z$r 19KHqƾG5=/go? e~%5& AM²a|v1eC˓do qoI}L[Y ;.y{HR fτ#$߿\nh Ф'|!l|Ծ VYQjD(X,NX>Ps,?< Sd>m@s]„X YYAX=:qIs-F?sGd2&^(2l$YcWw]5b?JU>*/X4L1&͸toξSrް{ϖ&AQy|%$ƴX=K9-({<y9 ;?dB0{2-grhlG]moiXQ» ǁEx_g''s"v@;:"}F(y{xu0@hrˁrZ!NDF/)+:\t/7ϮI&^VEl,K]G-וʹg \/):St.xQKoǎh%^P/f[wV<Κ֍ lf'Q^3)#jL|4|ʟAGeAܳlVq0P(SE ;pzꔁX ހr{2Yds˛}lM#QIcErqHLnF'|`yThWd-~5Xayԧ]ʹFX =`"qVLre8? SXR+WHTx%UXTͤxK1يо2YRX H {rHywI= I StUif+ L;;ͩƔhShL $ϙ(#%h;~ ='d]vd25R)YэS_*_ ~"yJaNw?cHW*#khV .zc0gaN6O ό' e^0ErnΞoX^AM0*Ƕj $ߙ-pvJ`lo Ȍ;U<+ E&W~Vko^c !e2s|_b]SQpCfu$`$]P|ߒELi}YlL7|j\-XK99o {D*Wع[=&#˅xHGMr{In9~OqE]N#A7NYުMD;,)Aw3XXBSPsyºxIKvmV]F6n!i4]i*q%kU$d\mgCrɩxV?a?k5V7)(}&=; <6T H"i+>+kZW C<\7$C6iHMt ,k =6Fc-;2sn'p(jeL)άB -gmqcD]gajqQ\[M<>t ŸJ^~y4~X'f+k>hiT,jejkCnK05ꗕMqcXT55̮nB q+˃[)*c#yt wmPc |q[7:#m4%"u*!VmZ,"[?/xW#@IB th$N|-ֳ6XF:V8VQiT 8khFC]< }]g7qpOW86j)R7 'uCivޭB/l^f5PlQ7.H<\(v6<4w'  R2YW4D&ŷҽ1D9͊7*Sqb ,0Feew?c~:Hi Sg嵕d+b$-" o3JN"K]SB6hVqa= PؕfoV߬{NL$`%Ϟ,\d9Gn1",nq`֥ɕN.L4%.79U'&a; gerћN/4M=!S*䡋r=!D/iE-8g#cd#$P(И$ӢK1.8l/h۔.5$YAwD+ drիs/8t nJ6:7z̹+:׾kŅV\aw4>(q/\Ety|,8#Ok8[;R`@`zZ ! m?3ϵL4k[ܦ0^@ni݀Gp[V }tm&^G!Ht=X`,I}i YR$.+kax.(8^78]NdU~> /龲oskE#E Es$ EUݞC>i^xK9kDIn]F -Z${ZTd8MS+1Q5&4hĪEA1"╒ =;ûe^L!oqCAtɩioFEvKB/'ܡ#3$s癚 yv |Fb igdaghSkyDerwzS䐌&HXH[W,wR cs 8ڻN^i"IYWί@Ğ5@U8?*93Zy.6)QKoRvwq*p^˚@v^9c]:@^ ćJ?yZso6,{8Z112;\ bm|< Iϡ~50@jJP!)MfhN0%THYxySe{0|)(<뇒~k>˪<@nȺ0 (Wtp2 6X@ 8ĵV DzZAb޾@Ŗؒ 2[csO =`^];(Ia pѐ'yM5%=mjR!Nu1^G[L>-+CpQ,+X0'$wc:_)X'/I9.si#wD,Kj JqLqB ҟHAR7NL97:n{ݭ8qo`|#anGɥ!pӁHK(xC(v1N& p^1B@z1O쐙B$뗮ߘmŴo˃ Q bǻn H CH=A7mQvsd*2Q 5c!;t,_P%3IzR& iL*2"[tHPҕS#`ZGڞ*Q !0a $cN浐u) =>UrY8B3pNvٷ90qiͬM?V%.1؟.y`/(ѩRp5fL0(quRUJ[Ч/tAZפ7l(XPrT|例\(އ"3Ҹ :i[&OX|9ʼntd݉4DT-wAg%*dэ$B"y]0jEE}SH__rwx]<(P.8q2ȷ#Qt|Cݸ$y U9)Lꌲ%jnp,`_ZeSƈ-wvIvJg(>MD{IwZ a3:}~ND)dUgD/ߌ'Ɖ[߬@>h|^giF$x$ͳ4Ar=`?ˑ-h[xᏯM 9.>JI2a8OYez)$韄J~ぽ#0# 8 ݺ8,Z%K8!=حw,5lU'RgEw#IOw[+{ZAbcb%2%p3mI$VY?qNS>w5mp3t6d"[- w%Ͳ[b7)9nzWx^,;GR,ɝ(3W,eڤJz@yq*{pP6w[HHO;su qyƠaݤ6x%`UTwlS#:\C_ߦuL5HjһQ TЍw^ԩǚZ$NH.G Ikz./,Zk˛˭K.1oXI4sI]L5|#Ű$A>qD9K#V;,אhB^ d.`5x Y^isLF T5*Xrf{@:ndօX Rxc *}XC׶aM2ِbYEv^R{h_ *\HY (cȼ`]Վ@ b u7,䀒3Yu>΀g(͊N&;(JV5_|\*>YtqTww~ƴs9^";NLKPnxL{CoLb}MLi>:pk!_MePH7&|=[$TǸ;r|!IbyHŤ@[s,i]ӳgv}Mൎj`͘rNXXmC妦vixd}X(f 9$6`阵:o9~sڢYH~#M͉툘$"k2tLfsfy]`eau*!$[7; 49:,"i'I2Uq&a%z;߳a|L ќC'Sθwh| '13 -iHPQv@FxFK,(+8!ΘV9b(μ8nEEe5-!(r6NU-vagI.f{ёQJTʰ,irr"_kbhs}L$^.s/p/ >ԕI,w.YGnf1H+_VC]s:%mVV8 HMR⃾dyJwYf' fw\%$:076q"q: @IL3%[yI>(b);8aU]W{pDh 7G:fmepid{ߒBl<%7Tb$OMXK{m%I1IVwlr2lD|t@1CGݤ%XM9>,]Oxd#t߉tR h6~EzEC RVۛPK\_` [i(3!gbiY,Tg~z$F4RE ObR,hEo:<>sX-^nn X%W,2 ?#2f0g kHs{7󕍍Fk{#JrZ J@Y(K(f>UJ %i#B`,asw#,{1]O&`}cLKXē5w;1n'eo Ѿ:yrÓ :1*/6:p̒6\Uŋc"R^?֏x-Q„m .,y[kgzrx<@Hy@"-Z[v!_&l䀂RAy$:6ULN*q B(؋j xzBC+E} ewUgW]]U]UդIL%$ݷ{_tUwL"38&2fa*Rǧ0lT dMd\G\`D>u2ݎՂ\k׫#޽ݘuo Ə>۷`2ͧy>'t2͹Ao݃`|p6heY7[[ӬG'KcSϴ_zfgvgw3 ̛3LӼ_M󪚎x$K,K eK)!uiCWG`^/!| $eFhZ1@˂`<vZa؋T{bWcwG=:o-xrn\MI:)i5 IZgOҟà #e$Ytd)G|<. ABe&ó2ϱ7P,} Xv 8Dy?-i`_aOpK:,M΢{$MȢ9P*@(q>({Ka=&.C$CW%cCs`iTzǁ ɉHS:I # O'# hAR'[@L+!dhơ$2DɚYhX,Q'tð\cj -Et.ps` gb@9h hҪ= Kr%|ΠkK587$@V3dAC鬀x,JY;O'VԧY8F(FZ.d4p::bGH)AQ{I$UrU$IH sir;>(Oq(jV@ՂѢeK\$U.(P{x3uS+Fݰ`Pcmp)g7uƒ]$ ڑY }cMoWMԷ~1x#` Kv:G3Z[u|B )GA*DG@~$0v54-K8y4ɟnуB`vfD q |ׅ;D ۸6,Ee>,or.ڕ>t\UAׄXՋW4l,R=^9@C4F`áKF,I b7 2^˺e^IΣS 9PhUr 8;As _WjHK9psjuP6[iwe̩w;.$QpYv4lflH'uϖ| ]W5B~ބӐ[4_-~6x!]W -<dܳ`>BpoYRoq() ]iΐ H r[*v~!* L 0 w$ۛ4!#4Ejո˴ m`T ݴ(;bT݃xN}iQPbg>.a:`NÏ| vŬ@Pux*Ўv1%pP%S!Q8U=쵿& 7ÝCľ$h4F:0IଏCԲ>va? 'hLԀehB՜IczA̸}ˡ]?$xTKjtc`"3QbD[uVı<[y QA1|plO 0>[ڙf5t@^XbiY|5.ѯ;TݷUG#>#`Lm`B-wyY7[qdǣ_weSi^1s?_N y47m$QP"}Oh!plݖ޺{Q",Z\ $NX@`#;ѣ'U0 W[-% D"QHLʢ0X$Q4P 1q`=Xbx"ᤓ.L{QZ1LGUZY $Z*.(H{vY95ZDYMG\w, mǎBKʲWp$o5lQ˫48& ۪F݀R(`?'H`%JK}xq^,eFE Bgͪ#.V%2|5Ct#b41UCp@lƨ|i(Sed޳aXF>~ȡe>htc}1wt=Z&!'$VKxN Gy LcqB ݋,NK}"PC&>/UYMb#5[`6%-bU6\Xma.hnv!):&BJw]\JjwO`]aј}&u"5409, 6 8lx>3ҁ+=e2?J(^&ae6iy%ADWvX^,IVb>а/k:nXa5[.:VZ8"$!bQN;Kaea)#cb:BFqK8Hۭ hi]Nt aP"U)-C^,vl($" ,o\a2* xف=ztr)"L56Q9 x +u/ȑ|]"uxQՁTPB%Qam%OJ2 Gc<{;GS$%)%eEm4n |X>kC9y~V9Bɬɚ١Tɝ>Pö\Vo|\aa$ Hqa{!=!:J5M5eenXĥ4d0\|ġW0|J׀8 ZV,]Jhuq;2[O@64]Ҏ?u[˛sZ* }U.cWr}aGv_.5oǠ2,AbCMpG%uq:NGҞC`r<bFk} Ux;@Xwaba~Տ+4dIgG(Ye(I:A8t쟠:ha Xclӊ2'Q A PZFph3| 0e>-V`8 bKceErnωV,&bxyqD42>|=aX;›j \K@rX;qRFq[K.3JZVM|qW^9%?$q #) rY$$'я))j$6U <*+cl+ +rA~ʂ' ߓw1"0Ҩr<ǝO:wxJ2i9&709Q>ݰL`U$?fWM^wG⽢?mbY(Qd 0*v&19:=VD(~RrLы.AV0*(hJ~kaU^#=by7Jk c3_D|3aρ3aP'ѿCaTᤌC-J2 &]xqOj%;ʆSUG/a7&YpդǢ(cvO2gPϊ,?`Bb˰؉6Xti')ĝ1<H oq4 cGpr6h%0Ԙd'#3""N?ree2L](&bU7$t} :VG\n/9|--1 RI.2nІ:jg5H,I4hc^@@IȲFՆGD;We&y#W/_Fcy|"K`LwfK`,Zrp7튤7ޥŋo Z 7|#9ҴӠ`q|QNcR0ŊNjW-48[y%>_:kf1]NDaD[Z VebWBeT[ ذ8|ߘ.V_Y, hV˕{%s?6 *4*1 * LJd=V63j5A H֧b&oCͪLۆ:3u5X~3#q(Mt Gvg[ִEt>*ͅ0tl$Nvn%=մ4>#\34baQf=:[!˱,ٔsYnXZjMXCu&Jݽu\Pd s0t+5`|z@Tgv)ЋcNJ`l]$8YcCn7e-)/V#QуG4[(,s KRTRD fxґD?_Ig'8KLKuf:^Z{Kǎ;=MTFL*M 2?a'q[mMt'$шӬxa Sߥ/oFҴ5Pt2QX;BsA,dЂ?u.@Ҵ pfv#Z b 8q>(]m=,Z43sE"-.cLlc<$v,^;juWt?%|0b&49*Br?u[QĆzGC3_aO͈X`Q(w'uLZw/h[G 85yl,##7ٺATKL{I4]Ɨ72b?ژlX,@XJi ˆ}d3-W)PL3ܭ4V.g,? :k'd Ŏ@"i$yA{lƒ%[ Cg9)X.q\E_}uNEHh2b5&iZU8#Y +XF(ffaܮT$#mَwA^&*> EqL+V&TV$$m^?uvZݦx!x{c\IVF $*WM|9%0!Hb9',UE^pUs Xp9U:auo0jo'AJ?:rZ͡\Pԯɯ42p: 5`Ұt%2/3 +b&eM;-{,P" Qdo49(rV+]/HGhKyS{I_^(CS/ct:ѭ^OMcdai{XQ2R)Ne*{b. ^`џ@TLcXf SlKiU-#U0`Q|"} Hӵr)ƶOb\o U^8N%@XvNW@H3kEf IfAIA#u.dr yÅS0]1qFۉ9韎"<{e -8d^]hv6 1 {.Y}*Gj JP/wu1@NgI;ԪY][Frfn uWq/1Fe-gs 1ݏ6N+2dKLH^e?&%vk 4=%bTpǻ2Jo;7XQX/57?ճꂂ@L֧=-\6Fpn NHnUc}eai-I[w=/\)Wp:"xլ.mgͥyN&mn>^SĎ ~̙ˊu牃,lҍ"L1`+*k"<8bHкE,u-_ŝXZa[ҌazTl LG£~S - `Qk)W4Umʺ[>]'yƹCT{Ëb>ura;zo@=er3Ѱha gb1l|4lc1B3. bbZ Z!q_|QqČ?=\[flma![h' $fYb5]c&rNOǥFp@H$uM6"RewQ (ҩ,!=sX~><~LV7KR,KjEYڍ8lup0B,EX\X5Y/P0фfzx0~ZEF‘+}Plxw9\:w׾@0w1&ҲX&Mh9v]ʻ0MeM`!<3xCX6k=8Q9v.mC6j1+HG"jI"䍼8rOj2k!+A ?l=.BZ(YR1ᙞ:6WQX{k.Xn4Wth|Ngh=Utm7 tڌ*kEp6qyM(Q:GkZ y!1'T0us!1TzH7Iƙ&1#&hyd3\3ji8 -o_ϗZӐ\2E' a\MCG/8fKqiFF1{C0MQG#` Ƌh>Z$_7l)ꊔXMF.iv (3#UNG8]OAW%k7Ŷ{P%aJq'x!!DCh 핤W),i5$e6X ek3ޏ:z'#m맡m ]F1PrZf =|)*$ ̋> E ^Ƽlg dx4٠A,ZZ{(QH5 W?Dxsgul&plUlog ֹq+bYL)NXIVAJ",1cN>,\hn)K󲾏&t^["iAywSss·%SV9gH zNSQ$mYVEb `R'#W߂N#4>_Q&#YHYCqv`  ,/*jp,HEJvqНAXk6K T_/GY):9+ÙApc{?]>;s_wY_y8;U1YٛAThV\rȚC4!bpȍ ,>Uhy*B%#p5[% l̈.qφre6a:BRܞ _}Vq/Xg$\ `^4]޴SIs弍TopB(t;nդc.63@G2yI-|,okis\T}!?`.,)Q|Bu 'G:YBt0eȴL;݃:D rDBMsJDٲ:<5cenc ޲:85xr_!Yn=F2=3}Ғ>d`m0AiHd{-|*ɠh!X\yzSYXv -,AYh԰z,X~Q&UC0D&+T,?svy^LIg~eӱ{R|HM'M?I(pHӴ͋}z~xh=J-O Wzpp m"MG1PH{]ѴqMvkӗ Ώ[gAy {R ^Er;>⾋-H)Hn $V Ex1Ӆ<tú#jt+(y>^G@VɢwH8f߱,Y匮 gTI&#MqmH2r9L,s$U &nɈ,;G.ѮɴcD-:fy-,xW+ʮ"D|%_OM?"(]6J휖C,>;o>C1BZjl9fÂALI= xWs֜Ke/$3MJ9} ].g]xg2 lU{n7X Lf"OB\&(\^$[߯\0wuln;h38A"Z\= J]:Y YΑWYc?kgw ,k)C JP$Ԉ(= 95׏ذjKNK 4D9pk%j[\Vsw8ސy g M^9gxz%fGby`^&0Vմe{#Ұ4MI= XLjTGB]yK/ݟ`"ޑIp yda_P7..&8Qc{b{`,`yr![_dgI.A)/lYvv&Tc\'Rx0D|l*Σp;fTMq!-KII.dE\2Nx.P <Ad1vX%AIOAvd5ڥH&ǬǃcٛmT 褱X\L'Ew[˄7m #B̆1٣bWb:_~;D%7͓! d;+FX(6p2ځ+ L`cC^j  !c~wXzV7e'[wެ5t)m.ӣaE]/mPev4Y qQ” hVOp}BIZJWàH Y0ȟy˛v3f<2C ʶi쉁(QDi#| &ջ$|&Cpx3.@Iz<8(Sܡ? ː=8{b , mPu 5tDcTGYY>1!g1\oHC68GG̦ WXX[G;nn$QY1Sx=WA9*O{*d]4NW_nܴE7?F1we7wi"nE&lAZg5ַ0kRlkI#sf X x}cv  PL~(5kOp(˪}#р)F*Kq@a7ym G;>`JM&Fy;^h^`phHFK'K aPRKjG 1= I?U'KO1^lW;,,ΒUUUW3a&d|} WeɽX^2sF?:tEs_9n9,,ޒ OلsjJnHWļ&,{C'i$axi 孄[O+"&IZaJH|?Eq0]jLNT.S`e/:M{g;2R4$EuĭiĹ&vmM1vkٽCSҩIxР~k'6{,g}DsʄQX`fnD"P Csѐ" !(ݖAyF_ s7S]2lˀQ]!.36YVf|^$P,`2juHX̶ t"PgBd5؟6 K#O8פFT]db J7DFQ}d]Bj?+DqƜl"CKf>G7 V2H,=|p p%*[dX:>E,t) .Vkw,фa/ Äg=TYQw˼gJ2'S_ $e(otYdzؚd ZGpA,gquA76\dlёi>>Ŝ|Rϗؒyn'򁩓ݬ~˛@Mp!^ X躶uD>,>z/ F$9OLJn-2_0)wN]L$ҰQ,b#I[5Y \-^[bxK1x/^K/p'2IJ;L&Oq¼AgX( 8#Cgy׈gg#0/h !Vk0 sO՘)Ț|ڍ5`jGC} >wp*06%Nw#ὝB)_gaYD<$an&Ƙ'@ `1Kz8:khg%9ǡ_vpy[/Bƃ`Ҵ'ć'Ea#?ӊcG:6Wy4!/Izw\z*4V ]%RxҴ#λb-8"III߃˯:(U0u ϣBIՌ$,1 _.'W$ToWJ00h^O'Njx-:\l=tt}ӪZiCKf/5x05{:ÙtM@/<#J҅9?5,8Ӹ~1gEkĔ`zBÑ)Ч_}rA72{ kƀz4ɧqE U{JA FoQ1XҲ(qαrf/Ml:ÔC`[Opn$b5[OQ޻m1LC+Ha/q'<4`TP&mIK){y/&vRqEĈ/9D!ulI$ 8RcocMyrY4(]q9&!7=q,\qcufss3mylk~\p|NKO6+>+_`m,☭@ {F}zkKtq6$gmsm듎K6KB42rsB/xhX4 c{C iQ`Y Hb bi1fL ݷ 9x;8>P|팪q&1t)ᛀME,fL-k%dX1.}]n x2n6B^TETXxSG,ƤZ$œe\dիsTY%;)Kd=s3}}꧚v_N~ ?q c4#F瀬)Q4i@ vۤ7Ejz֧g>3Cvx@ZKiNL{ZTL|-MYzN M(hB8b۾d(f"ZphBZ>Kno6#&z[a"δ75]} hл/}/SJ׉,< mG| >lB"IK Qo@&ф\NZe(KXT/8.=Td n>h-d Y.42!1,;fGuH,0-Z3ԇ=wRۆ4! C =d:l>ruXP[ ,)ZFi XY6V~fXFJ !,*TBC,E} dwYg^_nխNu@{ZXNBD68*8zQ罦IQgqs.E`XȨxF2תurh4.Oj4n^xq'M;Ngٰ*fdV?`kk+n/x<ݝWt9lwxq3s೓?82Lft6*~$n7v֙f~o“o&m3o |l @ 8JL%\ J5<[׳jV z&S8 IM >ݑz ]:aL r0 IU@!Ԉ WFgPFAi.ˠF=XK8]Bݯ)a0(p8 Ѵ Pt&ID 2AyL@KSL`6 &A ި@8>;NR go>]Ƴh6b0=<&B.}Le4b|PB@Գh806,]O0qٵcnt21.&#쭫v11t>$ᬞ Fi JURzLpȇ&w1"y:T0yf@z<3fä)1g/G>+ҭghL+n86^WOYf'[SW0|vT]L2 3PID>>ɶf+B?и}L CT.c2pm#h jC2:ϮT.Qg* Yn, , Kͭ*pϞ"mY;XXtJLf,c&m 0(`r3|vf΁駱iK+ݬYr8~)%YH%,L8ib@4%G9BM?[yf "쁁ꄰagdgP߭" @S8.3#޴GoGϛGgH8 ˮ~K:_s U(H+j1D9!o:ɇa5\T$ww?eXJ8 ` cr}E0^U$v 0>8 hFO?? _A윘g0ʸ<]abz{6#&ݺFy!GlTS 4c 0 ,1&W%J=q76$|Hf(3k!5]ķd Q+MCW0}̓ ;~igwPt br[J l˰-¤?ޖt\LS*_u1ybqx}ijbe8ٍف:f5â"PSvPEfsPKin!^ \HQIǡԀ&fl'[E=hS^[գdL2L%m:AId4N"S *B $fm9;9'w#ӦL7AцpABy+k8k#"1tI`?OJ -XCᬚ 4JR66ֺbڠz\TK*\!޽Q;lDT: htf8?KWY Q>0SsM$GA :s!y`rԩ,O%;I+7-Ζٞ219W4 T V©!G!e50ޚP#CNc 5 P6P}k趺{M2ߓtx)bN 3Jq-q  קC"Zxxxx{q= (vμ6.hlL^2!_M1ma,fOHr =L+~ N'ixYt;m$S+ UCN/Fp ?t(2I--|Hxs-]'u6@oevwOFB.a!h^>PoW>[ uqbÒc`Inӽ۷(tOJXtMJ}B g~f*wPdP?pZânx X>*:>; /h@M_ N{.,@vhjdm(mXx·Q5| }z@tGe<< a+URND1 ZH^|٨JB ,a`B8Q֛2ʩ2_pX,C="wd8$RG-x$yhD.cRz.hLRz L;]V'# Y@ct9`|Y:텂2(7qx@,I!p& D{Cr`Lv'TqMHJn ADPQ.c@6= ]F 1I/%EtW/^6\Ze<ʎL%ɱHi>@b74'9?)V>,DdATF!&^QXbt %Êe@x &VI!ibH, [ʼT!pU9RjH 37Z)[]Lei\-> syӮ)YEHl3/+3ɲ h)we`(~,ɢ<܈YEc*mA ֠`@4Q~g8ߜuvdb+,ä}5fU5(ydP$]&Ѱ:*/Ǔ^{R.]}RKWaz0K$^OB NH^}?o % JLXL)Ϙ9 - ʳ}dǽD( LpMx/O Ia9EKơ`B,<^+(;8vXhHעraA#t@AU_ %]kx3բ;0d0YJFm,I,bN(]=CNXʁ+L^94QV2Ċ(HLH( k`Aam\@|Er˟g1na-\*\Zu(/gL`7`WG!FW[o}2zA~O^\pKѢ.:"2P1K̢̥S-vp _  $ʪDMܾGXJ b۰"}pتkDҁ$f9j~:A#JJCl0x1-,Vi'3^ 0 +9e5PSX;dMðld:5!?b>ӼxVE<U|>ˡ\pm%2)]]-t1z`S;jj/#0aZkX,euϦf8Kr0Gt"L]@eW,\b_ՏdcR# |abctQgtfRݕae_@0O@|Ê;͙<iEbʓǕ•cy_/5\0V1]]N=X4O%N3>Rtqek5I^{(%죒SГoiQbVAd :]/I#{Ģu6 Dzj`P(M2qhnkXȈYw[ qC-xA`N r>л@3Le(lIE42˜2'2'u}TŲ10K*(I: Y8#E蚢omG[FVL#pnj,U7(t2A(ӡ|> eD+taǴMפIدx{ YҺƲ Ŝh*J4 J#-8$Kr+N;x`wX^95QfLDlӞ+y.zaq !K NG$K$O]%.gD>Bz&CM# `rmHGzxCtx)p~޶-(̑c!5`Szt(;{Ġ?9y{v#!G-bVLqtBIBMM]c,9ѻ/"XgO! <%1$ XG=#4| M^G k<;NI(camVJ|z|~W~g ,#и=/aNr3!|G.z|/ ")EYϢ\l#R2³b%ā~LAgs{S3t㝊xs,?TbQTWwd`<)7n`j).QfVL%b< =|C Zj"508ΨjꂷP3hf&{IcrΚ"T=ʻrJ`K$@ F#]4v8wiLms&MWs<*F1 DZ,%Jǘ-PςX^6 QX:PN@xFX;ǻ{&&7emxf_KDߣ`INu+-.1JThmV#2,////,|d0|Çvx'_Ъšрyn~i9#*ѩ8C&L`lI׈LI3IÊb1T` 6LNpKIB{'&`{ ,^ަ9↊ԉ<<"r2'ZENeaW,/vӛ\ Y8%ЇXXډp,s^r{,Cbd7CNn%_.!)S*jD{8Lnq @)3(+> /.%Y=pP$3,B郊i-[7my+_:K qkT7 θoD D:?wSW'Aq-؂Fi凣{8] /$z/񕤾tЍgEZD> x˼MR-J)5V_9nʦs@z$7E5./uX)Z"BˢF$=*|xƛܙZ)|{|C*M xD^+%鐀 dYDmdҒ+…'}y#a5r%רZʙ j:]R݄Eq`FD猫z<J/oGm>DGK~EvDifFֻņH2rL6 tGb>v\70Z EjXU hyZ;A@+/_W;Lk[qVg85s9oo y"(I2_$VsŃ'&D .-9=EkD҄+cƯduN L=" ,fz΂T85`_]9C¼U d=b&IٌV}%pvݗ"Φbטcbf<$:ͯ1@TA:AEو n!邽|͛Ble&GlQk^f[($1ZF%$֕c7H{㩯uҵ-ul>?i8>òM(W~+y'>O>~y"AI;xB2,;<* Y >IvS(HRsTJۨHr%N?#y2f|wkhtolIA< Zd.\԰1$;/=.$VGMY)/47Q Z:nZ 4-X&g0?zHtPf<$H<`a5 *|Zs)o_ D 6oY 1y%xi!@ `0)9S.xYz,V,HEL9w;4e|"Zn2fz.)S|O3Rv1ɂ3rAOgܣ`I[)1q^_Zc#u1r_!I_:ˍ:G+zSMC N$@Cdz'WHx^jq3Y/R'QyEݥ>9IFΰw;sJܳ^"go°OsMJ8ieaA#N2# K/:,oEL 85Й4I:0)EHâ 3BeM-hnsc|M)6,BBR0JPp`/u1`)a]l2"C9ͱpV))XE9W ֩ݱ-RW?X(4f (b_TJ>bPRtsVG5OŠc_d%G(f9!).G[7-e@0 `D)w%tzAh--Ŏ״i@w#i%.9Pl-M{sZWY mla#WOmlċ|8U% ],z\x&짩٢CWĐCBfS|t1R͢ sE譎 eX=aW./Kp򾈬X R_"[zȲs[ӟ-a>Y, hFK-*ꅲNj fΩ\eWڷ>ķ9dLɑᓳN:@J4Ik6pLN88zz[Xp']) \&yV{RNIv9v-//%2Z$R]J̒ms:%-M"Ab(5q iK6mFQStai>1CBC},ؕ{%9V#Hzl뮪s F$t`-,é=}nˑ1z 6Z<3|^L:cce@BQ_a(VgI"^@JkY%ZLߙi ӡzH9{e;eSN;["Cb[-I{? aP6ED= .͸CFIdzwlH=r]M{ vBtL\^P\ fSAVN(Y̨UWv-l;M d~阉fX\K7EZ&yw9>rQeıGt˻vAn8ik$yܼAǝd%܇3˱[>(]}):s۟l0Z-:4N͕ ܌+p|n&Q\ݶJܰp5$0qEhc^fFV{<+FxKjڅ|L֥zȣ|{AbVjSѵ eȴ|!F-$z7㨗4#e&"H>#f75jYl-E7%< ]iSq8-;ou*ob=}nR7-EEZaAcDy!òE}4g>;=Pa88&+c׳n0xApfw@Yd7's}#yKHLP1{`c.Hwg21K6ȡ<Ȧy%Pp g34XnW}biB1lj۬cلYYM Cɤ2˲DIoij\0HDyJ-4'+WiCpFﰸSSJrMwE'RUmL=篵ɢ$O⁂Turk5ץbq7>ЕbۈpG~ E.o4 ;((ʇsak8~Ylkn,6Ifuח<>g!8Ypm'R(Bn;*t,[jj\3|d>_+Vq,P*p;:g))B3T+YvǸ|>8<:Ƽ STĜYt_W71G㇕42&*) \T$Ò%V#f*9CyqO~[]ΗVJ>D~pGYs6sft馚'"Q muvp^Vd^.qOXzV~X8_ab>DyDh~6*{(A5 1EnQ#M;ϊn 2di*t[C<$yVm;IX &Љūq0/gI*z7r|Os"so* (:8I_+ ,mVOM<ϢJ%a1)XdF (;ɒ?ߋԭ O*`1UWm_2p걺GBIn{OӪ%{L0'@N[@k)e~H-l%AGRS3RY ț[Epl3xGD65Ь:E+2 !@Jn@h O(~},Yts`:xj,mnZi?',}ơyolʝS]1q,Kؒs?RY9lޚbёnpXI&rNþߊdyaaTwT["shd٠J8_ŤPbN<[> .!9PhǔJ%= ӄ-k:塆^n35c}dѸXN&I+Xv)$OpON͗52a2w>H=tY3?ဦ! L=3'' :2EFU7' bl>ovƅtXloδ$1HS*2xo6(1Lc }1'E\?s*Y, xe5y,ː|I3.v%Ǵ)JsM`+Q/K9#(_pD8 "9%k5iۉ4H!W#y/@vB6}Mi;!dtmnW#9f=7?Ծ,@KtV rkɔ1!d2?&GPŚlؼ90ބ+g/:1̍AT1wˑ2`PDI"V鏐TĈ Q \IFr _`?PS*cn/52I2rIJe&(Ɯɵ =YBedGR[WשּB0u̚bQ(bPl,Q܍ T2~F="֥D|Xaq_(:"C]0cxι>kE}'Xh"\>0-RΒX= 1D^X<));Pr` }+sp-*$ϮKzgzU;7+Ean`ɽi{Ec& I*IHG,ĵ(] ]kt W/upp} KzRFܬg$1%TӘCNXb'2>N9P⛕<"[-( 47/q4/I,JUQ;|qxǃA&V7a ٳFQ5#\R TĽ M[$gg[QG_Y0IhrNm9+K^(4/z4qL1dLdER|˱C9@$v]c@YQNև,Wc=Itn!%xʻ!)Yl`nA?ɒ^R(&Y~Y-I1Y6`1|GmCńgO}iUȊ $Qz s]ZC,_S@NX``N֦ʛѼq~i83鴒TGM(Ļ*cD+Sok[ØaRyʅH& iµf2-[E;:UR $mfy"| AeGmo8$Kq;$`9|N ´07`|v)tPV|eN7H*o vYѰu@"r#nJHu${/oIo*Y + ..18ܦKqHXSb1v)!`3mb,-c.uLl@YP#:ߖ: (b㉦Nu`R%#C;(ɋu(oͻɒXl0gǤ=4 0]Nv~Z]elXCEwRJǜI}| Z4 F *9TJ\a'_+}y y 9ee~u:z+If]b &@(F ..5޽}|pbKAsl}96Zk3 ¯i]mڼ-ۆm%IxwHS 㴧Ġ,ц3:ģvxo&x ă^8k1pt;2TFR ȓ|7n֭Wz$H#V~`䁲i3q>}PgNYh(uq:H,=q%w%_ԎKvJF^n(`h9)۲oUrccGS\(rucKe.Lx#Ӎգyv4I~48py*ua3Oxc>JY/Ş0Ti^P-PE'p(gU&]"G\BNb4w▝ZOBr]:y.m 0$BC hiF@rLb.6Ʋn.,!e8cy"nc}eN1e,6>ca`&(η+ ċ))p&]x3xAeVW`hI[M!)`Q5]t,*W^Y*|.RP GAG0⍻Ɯ1\tny ߟ Cy6 s5Ҧ3=WMos\TC)g{Gyc>8 g^} d ,IF}X8^p>=ڐ12 6/C ~yGK(%YXKf-,.1jdy 6qc5k2xmD(>ߒ+H.a n͹Vmjٳt?Ԓc&P.HjPd+ 4h<,8 W$"Z\W!NO$*viX0,sf<|#-Κe53mjx],17m%|Eܫ[v9* ռrynXG}wn%&iΜ[JR sA:KrS@gֵ^;PylwmDy'ei78'\Nv‘(8fVxiI2u'Sņʔ0?@#Q}@i(n-F9*ex"^fY]qו͙pإX$߼)x \%1׳j4`cyʹ︺Sl)B~B2!~1 B{3r;"wG./EZ;,~9wfZ(f Ĺ[?c_؟;kdGEse(^0+f +摖:M&Y6aA)FTyT4V#(XժFD\Sgfr$7]bdH2[t:7#U2F  Mz\/'!, K78avĈ8 S2t!k#$3#DI1 jQMH( -j@ݦ xO y˄ miZΝLHg wH#V@ c `F5a,(EIٲH\7V1 Jn`1+EAQ&/DҶ<'E+JjkMtMMqKuM^첥 %r0[r˖2?_LO(qu| w _j'#2$rtJB1lv.DP[9"[2u-r,nZl^`q&B,Cq",B ts5E w ,%zZ.ZDrR'ZfE|1Ay҉вnpnźx"efí[T$:C,pSo0XeC_6?!H|Yid ̏5O;o!.]iM:M7sV6/:p#X0n%sy+b&3Xv%3`.l0{c}0ޫZiws$5僐C붳 /xB^a7|7I!ݧ"k.qoQt8|DdAޙ.1^]WN>(sHb> - [a :HHWDv-G/jCRpRG>(sRuNdk/?@4c /^Y%Re}{8ۢӎ sI޵G`-K.,"mjɆ8%\R,Wx^i[nrԳr7[P[R9>.EJ),8z,Բw~OBCmYXQ<m4rln^YL}m˛[vjGEOkH !Z8Ms3/[(@zUۄ"b 6,ҥt!љˮpu-ZmB9Y k5 1LIܠyhmld0V х=ȮM|!2(2gam-{Qͽ9+'T8R84 wRtO&!Xdg=q04(| 4X;+L|8/JY a 8$_y&cNPYsA=PӪ^Df 6E?Z|'3cT9EIV*J\Xd7/pfá}fy`00mkd,{(!@o6*ML4Y3C4sٲcK[RV M @1)A1./ȺBCC} wUg%uuV_W/n"Yjdy$MF< 3 4I0Qaꈂ0NE2!BPDPp@!đctUO*_~OJ%RqMKJw~V J??ύ;iw:io8,/-vg, p??p}}뭷\_;/s}iH_T'[3>$g8ݾKar{ ߅X&|~k'`thO'ӝP¤$ (M(?ʛdO?0'̷#a3qه)`F`0;IV 5njQ|iEySE b?KAX79ߙLȴ;NGNȅ% .Bd,KC:Sna;R쐛gP ;Sp:uLF͎usE:fy.6u>.U {a TM ' \AB(9#JpX& x qMjȃEX `iS,I|tr`}Y!6]*O2](j2<2e6xK,uK> \K3P]L=KeU)˳,τ0:%^3ˆ)SO"O#<< t4rcAY'Envr~OjSؚ Uu%!>}\f|B`L; ?},>ն]B~oo,07wHn+Ql`қ?ӝQtcdXjR',y~@f&;7'OMH)64_<(=QUЇ~EeF`MO" &w,1Ĥhno4q73]'??P,!MeIh" ?m3,^;K-(%3<GQkے+l!"m˦|,=w oR?r,GE  >սi HRU+R`C#ʃ"6QETT$PR*UW|t \ Jp -4-e}/Peu>d0vfL3'$Kjg_11'̒O+a &vT(کQy9%%drKj`y;`Fi]z]ð?fI*)80+-~Ot0c2U&/ $L߼To2(A_./w3!qWU,a 3%Mf }&[_H2#~EG: @ E83IrN5x-xȰJnIyCR0%%!JK'=;Ph^˺0_ܢ]w]x)sRf"|-*RUXcG\H=X=LS TQHzh˺u#yp 5F,{0&џhrz}R.iҽeIjBi`l=N(NY~~KEnm҃,6q;y(,?x0XIIҁ qco +Pn}SP۸W:퇁.,$8bb~gpoC2WTY ,`t{! = YE U&@DŽGwZξXxqJWaLne,Cci¥UiC2q"d?`scC5mzMM`Diy]i&-EntY -ѝD&9 E#JT:1iw=PʍFM#0MXEЎ|iBUtYS(<Jy]j4SR{,_fZ~ȡB%y,}Zh8t1R߉ zrO^xBcUL؁hu@&MvCp$ U &Z(P8'½Ŵ80]YP< 'i.3qv<ΟU;&Q{nH̭%ž1+]Z/ka,8@nNCDwĚ MCÝXbIWW-=q+ymĊ軔PqV.N YgTsZL43t_!k!CO8ԡTk6 p6:m2R ^r{SNxZg1R:l0.9:O"23xƝ"Cpi%atJH(5t!C\z}].uEtՋv^*bE ˛Xe?ҽ>s `RLu\]y̸b4!qv8R" 2LMZf\\P%lȀBR%DD^ T+r h/nM8Ex}-(522QԴQTSbuW)1lߛE% 5/'hG&jX%^56Y򏣝*\NÒZtApqوd _dxᕸRqYsV}.(XҧdZQDa{ &ƃ0i5*rFBC~ukYtᅫܹ9*h`"x91@O!+~%QPX$OZ^g!z˲Pcҩ$mMޞUmeW~AƬ4|eᅲg"JMlSB4<@\"*࿰&rp-yG>2Aw ]%Ú8vCCjAQR^t\g,l"°DζSIY_p諪D $Q\bkG?M $N=o*vGk;X,CGa4, k}OLI gDxf٠Kxe7(v2{"I]XL΅>|oӧ.O*-ܤEps"V־::AjQ#HU7Cf4CfH=T`n%N"5bU gͅ:Vݪ.w;9Nv9=aQplI^!+BX{FZ7bч iY)/ԉA:vp .*+egp:.oCs)õe)'ͲE\ºm,qF sr dU+&#CC|[g*UqVB@1]zY t(N$0cTHN )tk-, y=_Ωe@IӜLtuZhsA"W5$mmkwoJVEa5#I1."6"5}qy5hɽWoy9!:}AmD);>G5vyz8C9!&,O [8~t;ի.9CԡIn=p^FX1?.[bJE0ևHo%V]r)&I$Sg1hXDW<{G5AgQM>| m :1>9my}aPڹDm&1]SHO 鈍 j$imA4iфlJqΉa& 6T,igcsΎHRL9ߖ m.nv%dA(M3/Xl!R"&S |dFt'nYۀ edǣDbG;5j o#k(ZyՉʗOelE Gع #3I_j7+@L5qKx(l shN&rVcDqa"Ŕj@ Z0ߐkV3# c?kT Y0&Pt(՜$S{ f J G7GK!jŭUl.N@PLoQgE逢.}Ҩԏ4?CȪ&IN<ҬCIy3 %mEwg8! >w 0˧%HsN}1o pXgJ MYH+5YO&AnVVy.(@RC_+UN\Fio[|3Ȝ*+|Lw1A#嗆O\'[?2MXHf SMe?eVķ4eYL %.{q"iߦk΃ռ\S=탇9(eh2ss;e#=.c0݉,:5_-PXn9R-F`?.H6EtEE(ʬy$cb˫W`B`a`pO7hv[a)'Qao؊bQ6YwDzp0>RweD]ts1,[ɶMŧeGe )S+Noݹ܆ 9S{m 3%kIcb91kvEpPt0󄵚p3enHjFx f\'A7zg@v˜5dc&{v PfX,3 EעȶGZ3%ḯ3`KM-4tb/Y`V:8І_БݵfF51 = )ța$ &aFL BغX!8a/|?4Z^X)mSrب#t .Z yFYrֱg>?ǫq=i@X_=QYf@ImJÉOY1CgXC86aORvAfÚv"v^6X!]v806{{ f]Tia'gYؐhOvBMޒx((H ,ݖvt޼ %&VC !ni_}SRg-&8  EqܬlxbiK D's$Fw@LTLDd,U=n=VzhYˆqwtW ؂\!,NQr(=Payi=^C6i~Z1l\K} t Qʕh]Wb^)Cj;,ȰOJ.jO7w'IOaU;YeD2imS޵g|(Τ-۷n-kzį$WсiZ eEbqURB(7i=Y B{L̎UMt3MVܬo".I LE!9:*|~ժ7C: ^D<xǡہ(. .9Ǖfbs" V&eqJQlY/Sҹj+b7**X[nkQQglpDz=ݲkkۃəğp;ąX7ǻV0+!}f^[h퉲=nsme<ۥP6Y[o .{8@hz(sH2k/yOXfIf0 n,ɷj"<@#w8O (KTd|8J*f0NqZF 70Bit\-0 -l7X\9. l{feo9c=}6s 71wi`YL BqN:v&i?TW2޹ҕVkmzq#HH:wX˓zUC"3,˴TPFc4N^xᢇŊVЫ Q>YW C IEJ5Hu fs5ҽ~հ'ΖEN2p ըf'[uJX] m ŭ\9RNynY[6=Yo5$FmMAHg/XjZV""vRaYE,u£&8XPsҍذo|РFi⮛J5 :nBrnu^]zUr׃$_eX܆ %R+c£QniRS ڐC %ݲ,^6{_*{}g- zZ*d1dihLJ-turΒ`5jOإddFV.޶HUr+(2>lY.ck(F9/Wd{.0c(!o}@Sc ={g]U90Jtm5}*_l"F%y/0>и36)JEpܫ*ƪ=e^P>82rrH%^T+Uzg'*AZ bv(Q.Ͳ%lni.rw_iM+b犸n;I#i&Qn@(n*s8(޷b ҏgj^RG>2.ls@cڠ!ͦ@³ C?d\Z\ai ,r6DWX\P\:eK;X`e$]J;gr(dD4,-}ţq cuئn-^"iDj<=-; ąI.j`$ϳTbfQUҲxN [vF_ǂcM8vA7j5a=!J۵*~ Y[S j?$F]J(g>+tA=f)*'6OdB8 ,d&M}{ e&J9˵>ir7O 4O+_-XP t<0Q{;b}K̥n,Y@ c6'֕voyC\&Vgz. }V`w?]~M|lye1vL ɚejo-,GiLѵLsY^(Ҵ|\qYآ~>\?ֶgSjrǠʷʞ'٧TRx#;=cAn5΋²(Pvu":*_4HI 썈hvcNBY}Cћm\S I}s N]:<b^Je)Ѭ^k4덕͵ ڬVd$4˰*XPjXǁ]]mid]PUm@`XCD4TLND1 U|}^iL,O0FNϘT //{{B=(X[T e{\9d bjaϐDZ?'|d_V muE:8-1=&RAd6< S]j"PD,mZKטuE0q=u$LMO2\wgɫy܍; O_wCHVp(Vy-XIW[jPFkb-FUr <Ӵs 1 ܖ!|)KHFyn@1>7}qseaْn\&GU2ˡϱ?,F82x:|YgA5 )5x{Rs<&.A(t]۸keh&&WB}}8"kpN. )2iz57xxt}Eйrz?t Ih&XBQqQO~tpztz:'|_kE4R7*P Y@yY.V8;F >QNfoWQTE}붱xeI&x:CG+'b|$&f?a~~~EHq(R]"_%f ֟j㶖2I$¯8m̍Zi1n2@@ uK-pw)۽KYs.]͖}\5, MW.L$ 9͡xkE%Q7w+m ɱ1DKY,eЮt_|vu ұKʮ #8̀Gwz]u DR2,jeZ W@? OMZs_HuՅdƊo(3hThXrひ]xE<ٮu?v_R[cpּsDywY,2- P%7}%d`NEO[CȆ9L5ФiobX"3ְdy,*nB,,]ZV}nwHDm"nO+&v_*i NX9eϐ& -1!id@N;$]JsMcO7ђN(VFs+giQ: Vm>㜛.4kWfqڋ걂^݄sw!w:؄\C>VJ Uv(93wAbܭࠬ _hLrsɛӑjQܾncRŏB8j1Ϋ ()D"4 #kÓLA"yT`".Cެ(5ϬeA6yB+M|'-;dqt/RQƼ|8LeTо4MAwsQkϴI"N;)<.:$IJ4b[,8Y%dD^@@T,2eρts rc3XmH!yX9Ϩ̋\f_-:ooQdFn/y+~DpX{*` T9LYLZ(>6ne<,kEYOTЌBVĤ?*FVsj錎تu"Ju"]J(=$;*fʿX} z2z2d.ٳnTOCb?ޅ(`Lt8"P²aګS}tSDNO5sfn_xNU*@t*E{sfgaVy0MiúQ.-x^ #"U GXpQZہ Qesͨ =,p{-euH1n!&t[;tňy;/*ޭsɨAcxvyD(}w2tvãx>:Ai-5:BHF&KXg> xJò:%=ieq\\YNԹvɩQoee K9Y:C$:Y}:bG[B LJGZ ^)CI!oA#g߄17Rxߡ8K{/2- ظ[bɇ=SLBm  t|djYr*Ϝ?=0F3MIn-NãhAQ |?)!EB Oy\Q_y]JuSTZG}hj_d/+J??IFHݟʽQrԹc{G唿+} ByI JJ`֧PƽߙP,R$:<<=hD9,`ˇX˯0,n`6u٤3. Iڇ{ <'d3XibyC8%]1ם>; tfnTt($QtсW<ҳLH_?SQG՛ g=8~w:Ghn\^,B#Ob`\ jK9Uipw_Ãpxg'o11'wq!;Y_}|σx֛u`ڟM{]< CB q c9}CN `κ^o1 }ŀ@(M,XL,∾2,# j1E"rop-v=< m"J+B#$(G4AY Ƴɀi I Ex*e< PϡL&PΝwP.Sg)ux"ű<*j4,X!$@S&c2fVlYB(B[ȇ4&mƶ&Ke#f.,-!t8[%N_Dή/}Ζ:흹^:; \` `R` @K葼˩ HW|pHI-RA<Đ֛1SPb8Fڙ;[:w8(:v6qhP<hPa}- .#@ ӃQt*A2TT"dʠŁ4 `h '!x1L$-ps3$N@ys Evf!4g)Z|>GcӛW9{2B aMb0Y#X;{'`MN HѤ+ZILݫdz]Te(7d]p=g{Y:bdY@%`Rp<)*Y<ъmX>">l4L] (>?33 n],I9bti{{ܸtyF˜Dκdw:nk/"wcڦ}u(QIyFL0s&BRXK'K,.;x7LU .^AH[;}>ƻ+僕Voc*Qs ^"l6EXfׅs[*/bۛOIK&QtͅB{8<_p/QQ\vщrtq4iEL 9O|YX^eܝMKfAoJׁȔ$%3<X>]Qo# `:#> $O""җ% -4 4WqKvzE<^WƼS{|];zcv-,)S S;2)[v3"B: dIYϞfiC5R PMcpMb.k;iF39KtZ{1Ɋwbs@?®i547M,ithHñ/"y͊v4c;|X'Uc[+&K~7 )Tԛ.phAie,}Ȱ`]ez5c %BC j?!Y_;v~|}chZ#kZ3ij5jF4bph<ߒtgc\k2mYpa_IhvNp *)bM~Yk”+PVҟah|xQi".Z?^apZGlpZ(٦zV%eޘV#ܜagD{CIx}yF{X%BB S7s<̱3wŎjӘˤJXN(7N N0k"up~}z mJGv:i8τNJ"νp9G4G',bHS~3#?V A,bnpis]NEYruDm;ATL. u E2rGĝ> &qOą%D}J,8wJ,.JA#seESjƒZZ.v~iYmԚHzY[ۊHa'<.XL[o)2a}+  'Ts%]{}q<$l҄r/j՗cUK 4z輎0v8#Ħ-vAfTϣFUG:Xn22;+<"Y>3K>|BmqGwq H=)~0Qړil9 mBxI7(ZwWXȊglzMgδrWT؍Qj_^rubx}H>?X}xN^0!㝈|^E kY&_ :pm;3F%$I} SA1~;+<7xp^q RiĹ`열&b~GܠK)CDZ:?cU' h6:vl)wIDleMRʰ6-a7Ѫ8-h10́ F\VZJ{DjpOޯAIrKr94݃= Qh/+m:5i^X0$9;bX +Y?X93;9LZYNn`a[w_׆R( n.Yd:m#a['tn> (A{{>tE{n,n%K Dܛ>" CK6-pѲbhk˨xЕhb.͇@aX2|-׺@1Ϭ4GNgFݔF,ܶð9^ىnBL :_m%q|YEO\#=vO#iBO˷mH(Dﶀ௿"D!cW vAaνfF,OZFPVYV~`~=f~gtztfgFo(%Pgn bDDtA#Ԣ1̂l8-Qچ)m@_fJ$,0qh+7qBLoZs(\Fz#tV}Q~w#Z"E3<:oCI63Ұ$E:Y2% S:ab:bZo +|5^_]_X\{la,fJs\yĐ-5dyƒKϢnl<~?NE={RfdUFb2!B1 Bl↋D(x=6jI#IҪזov~_It1G᫃!`,a}>-'Rg@(eG}Kg(⻲.2Z{#)J˙WHay%D4d$EWyk~& AILH+xe"4ˢފ.E:Mڧǫk*ɾ -ފѪI*VQuyv;sX&c#Q$,9  5*\xc_˺-޹2Pᬙ,0ʘHjD1z%}5^Fj)xB˺,8)+x)"oo ъݺ؊ҷa]E9-`RpsP?XM l ulTYf9(:xUIF(Ae묧Z<A|Z$fg1/6G!%,Ӟ8.vf+rCět *ܜYū,Wp:Ƴc,eAqɉqFj9]D @ ;'坨Cq>@>HmFb\|Hʂ_rh8%!Icg,O9Wrz'[q7V{qNz4B/*AN{,ZU:RGyhHF ktrH[&)OD<{_@עZ^=&"jGq4Ѹ'=uZU4O-$pH5Y p/3 #b>ǵ2}6s Jv­0gY#{;5Ib5E{`V:K&\l7yN:VpZCr)Ow0K/lE)}9< %*oyG)*cMq|1#t -d4H>CC)Xpy hM8b vMקrmH(jYv-tn#7) @iMm0%%y nOb?i >[9Ac΢sؚ e5 Ύ"ѻ;Tݟq2UEgM!`aGgK@ys^V K0]9'!U$^چ"%)4V4Fw(E! RJB?/\y;wN2/Qy!A`@+h5c1\Ud_c٬vaV%%`,La`jE0jj=r,%&!; Ϳءp" n! y_]PMp0D?qēEfzW yzUz,5^p 2 G,@lpEtp?,ٰ?=,ʽ&h,Y>`XWç m(a0-,ksU&tuXF7`I Seͬ '务{$mr$=ECi*P̓‘87(_ ~8gc^Yrf=p3HJDO;jSb_@di߽Gj;f?`Hɯq%grJj[WZT-(\4.hYVe!U_- ӡRcDZB611Yly,4Y,o X K̊&lUQ[z:(r I9-EzWu;2QB*Ŋ?qJ`J>G*<5Ҩȗg[ّW\^1+2R ].ffkV4s=U7cZslxXNni/߂40iاÂ瞗Gt)lyyު* *4n`ѷݧ%=t,膛q<*YE64ǘ8Wzd-Ӽ|!8l6rqrZ9q@\2}hB快!6$2l\N:$/uĢ\Au(`TT mv#i91k247l q^(Wf \I|.2WCL5á^ղҝ9WtO„\͓rۡhKz}'wyAudyNJΐ[P\f4iarsUj$D;*)P 9Hn3"I:UT:=4fv\t^i%}b[ "k۩E}f| up u/1-ALpD7-VܮYI$Jw\[o5h'^D0D"tnC0Usj Λhfrv5at1N(sf$%y{g0pAEsw< eQdV"I)hhfHŲ(W^GH*Gr 8#}~iXڀ)΄Z F'.\3\ϑH kq:~`_.!S2K_ H?Z6)3W3ET1n2GvJ+yrC1[[M8މt 2mٲe254kZC)rq@A;n,3.W4tZ:hXdռhV~_\LyUWΪlQw4XL>0C1ito$Н:Lna5Ļ=BDn9zhaK滎QM*7˱Hܙ&XpD:R'$IBnoҵ*X`X1.0%M|9Nk9svmd.-W;BLv :7qsɔYyFIjA¤ "іE͆z_T:mPjdus{m3с!8Opἀ2Qjl4cUYO.zC:X՛ xGڽ7# :[zT Y>x6͢`ׂY~rJRC3_MTO$;Lfѫs$˜1bz%bw5s#U;Ky{qX7Nh%?WdkBi.K.f4M.,:(-uq%3w[d 4s^FI~0>6.Βڄٔ`[EaQs˽r9/)<$jaS\C^u8== M~'J$._uq>*bML-uQj klF p ۿ/j 9t1monF ؚ_/BªعO"W_VbWJpa.]Cww[{{G YE3@k)M͂<_ljs)g aLO&]%w<)d)Ԥ/Y}tXNh\rw\3>S`yԧ.:cL1,΀)_%Jr-kE,ɑG 2{92 !RC-~т>228.ku:pI,s!=+VL NūǐLY/*FQvmd#IV42vu\uK18S=l,GQl,#X-F@[BL '%} 3~c-& X>÷<`hΜ7H˲Kwd)_95~?9gcd ˿Ar^].zwdÆtʹ_λ]/?*PXe)%#UMZC/yy7wZlnxfvC !uآ֡-b2XM9umтըֈEاEp) [T])E5͏#hGY 1c;qZ)ʵgG5eFA,+=a'UCd¢NڅE:M.csIqhܝֺ[?!ܱ#˚}jx 0UBJqZ(`--Xp2YL}4"fW-0ǬoA,( I!z cLcYo]X`:8]t͛7qSP巜mZ'(]KRv9EaM<:5d,18exb:+wm߯4p0|&TY싀ZR1s9g`/#E㕑Ns%K+,7?I;r T]bYk۞)"qwb{ɱ{DzR#eg3޷*'t7,6-<Ϻ?t eեܣcz1ys~B4!<dVD%>{NH.`,Vrcő}6iBi8:uԲYdy,t`iQh¶MRr$tY7ᤓ /hF+!RҌ'K:aÖvOԢa;u}S,gai˻L^0W'&^od5@u7BMGte=Mూ:9 LSse ͆]UuG2 4Ź}n3hZVc7Ï8 K[2Hy)i/:|U\4}8VFb#}76_TbFq\QY994 aRfad5 PӹTFl64J4̶CQF.nPm=O#H "WyXMDhhKP.p~vBh]=hc2a!fԧ_^``MYR8W#o^4N~Bsrƴx0gn4^1`s[^/{oErX)ziOB$YnXjC527b8JlyPV5fdzh&8ah㐤Ş’RCܔIUXÔ2&1z?~;d988#KΪfDg,`ѧB9\yŻ$n54ͲNiܾR0kZErIArװu\˘ç=nOhu]I#,͂ *tKID4I A\h*\k *,&pVFD#Xu@y갖H8/Θ\ VX5'Xw0B1MV%\hL΋ 9 A꯱-:TM^7Q9h*SJHZ0W%ݼ3<|< -"t(7]ҠO<ͷhD#p+/C3;jU:zJ>[fnufJ"ZX8%LxKG`ڡ悉D!H (U -'{tY2zWPV@óQ>!mbߵv] j3LJWFeVŬ,Օ-gA1ͨjޑk/.GxlmE$JFXW]iޙpUtj@ qc|y@2V2oȑ|։HZ+p [,ɂn46L-.bgY7*H[/wXQGhc.QR c[,#JܢsӻjoFվĥ<̓Z\ bW]X6HckIX ޵i0&IRǶA'byʙ` ~k*ڇ|֗ lQx̖ukYyF{ 3*PLeft=Z`,2bhdW7c~NVj^IvL t0PZ#딣mMb4tp`u{A#L*$g]'MإPJh~o02$Yw i v1(n΁ql 6sfB{QDJdܳĐX' vȪ ~S(TH=;nO/0\TTx,χ F I<&wX(aU "N,sg-,e!(\ ``&JQ |/7}k9YD?#d9l"\ђH'm*-?mbݭzI FU0usotn9;<_϶ףدgRO к 䛯/O*jo5b˨pi a!2:jf֋,PTe#`3 te(نQ}6.\P߁o4=\\]4ۭ$lnނ6ejnÍ>`OxJ>h;GR;-UYEwcBm)%N2L îI\]pؾIjw:7KD[\}qAf5ܢ`:~a`4bn*y\ FZ+ms;K# Y休\#'=xOҷhZw1>ddi:YkYd!0*˜jr2g0#(vwGxAAٟF]0̜}qm8WLǻ"[^J*-+쬝5S=En9 !z:VttZ3)\sɡ~~Ӝo3 Z]60t`Olc_f4\rDXcR0qf'/ZD&95cUYC:7OZ274ڑz@lsYfP{S{~Y# 4.dfӴ2JCk&7џT&Bq8C{0t(A >\t ɡp?^-KOXk 4Ik`$(9 s+@yR@ek B9R\8kv5Qa|hm`޿Ae>LC+* A"l`WHpZ3,jamu;?ͱղA@`(tmfmE"DFE6Do#SvG|ʕ>8C|pѤשacUJ|Uݧ:,\Px6n^Fhb- !BS{gUZtࠆ2IKfbOA 7@-q,b&1 s#OPo}E*`ƛx'UL&{8a3jlkHTqEٌ\`R%3JsGY,^w} 󭀵ԓF5\K8Gc27irU}t\ti-Kq," BB;z*K8x[s';*3%]0:fEЂ>-heNSHMz=@$LϡpS_ZdQ77k;dod#8O3jrj $\v+*m|ވǎ ao^|_1Ř]=p &R+zFOF;xwʼnʡC~xEZ b"iWE#M1*]Pt܉תrj)oV'<,.׎ŪQcَE۴sJ؅uX9c5 ˝26&GvQ˶]t>3li1"⸘إLv5i7ޏX%&(wR̿|6Tԡ }UhPN**CTxnjCoMRfaoosw-٧iySKq̓:벦H߅gtO.c@* Kru>D Cl4[uSk7+7 Q33cإ}Yuh_J(C|uDg "˾A܅ɽjߢp_ O{XF&~Nrt؆mKaf*XL_:v>p8B Cҷ,=zyBC G} xgY49I&f?G2 R ZNiPU\QA|]1 S *U">cWPn+aeqe{tsc{(ϓVJ䶛הn+=>޻G?2q>Ѭԅsiaqx8y!e |VIW ɛ'Wq&d7OɲZ* N=0̀&#J IC%Y ^ y^Mk+Ky^zʁ<\@rR , ?O.hr32̇p4w'~o̱4:mJŤ IEC"" xĀ"{^J,8W#) I*HʟD@|2{Ӟ oFmJi( ZE5@X&Awԝ#/#"rOܷ-&IlpBrfˊEdQXq΢13Z x<,m'_$i$a !r`b`I ,eǚS/}.0I&7Y&Ow&0t)b1dk%&1rr,Rv a\^[&L>sjXG[HO ܀ysHR4ATnupfР h@ 'S)Ci])^rؕU@Ơ`W}~ L, B'>î8F( ->dSs*A$%*e>Գ/UѻK}ie51VQCeY|&IU0%f 06R >J94,<K|4Gz^(i@ JMQ ~,hUDc  6f4f^At}wE6kӐِrMAFޜ-{x+ŕc{fy}wa랬N!`v1fP:=ݯS%S'+¾Tyz>}`^`1$ygxlMw”Ē^&g[! ,s3_pdu0 ):PĜA > ץCAbIۀ7KEn }*PhTDB ''hĭkTL#45unpGa^(2u`[*MGS(xe<,.gtwKc+'4K._y6b@>F]Ӻ-N午E1c`w*X2_2"NO Xꉼ&IR09?6ѽ:(@3a .T2,*A'MJWLPOU\E#П.фV$0FEN)EONBSoԀ5ռZ)ŗ#I RM;2ޟ$7snFЙH`9n 8 Qq+EjOktjYF ɀ_L\bE3L4Qڲԑ$Pe^$kԟKGH:UNr'a@iRT2BYA=6#h6硽$E"yፘ ,p|#p `v2Π/p̀.L[$}Kl`I8^,FO`0Z(SX6[dAGR- H.< 18RA4,Wouܹ,w1`Nq[_i]ⰸ(,O)ϨF/rLGeWZ-O@{aezM{{MMr,f^"oeN\A)Y 0IJ] \L&>W;TrDdW P^\@Fo=/VO H.*MRׯBt:%'@N!p7 ٗ6~GD z3%7`5ןgRRlN`Ti^Q  $LԊ$iFiT.Ὁi 0̫,02a~w1dsv RHCRiH=ɴJ(hd w9^'heM&G 7cĴje݄T $j. +걪τx>bed4@)+>'e&a 7&.7gj0CTYC<ȴLC1 B6Y\NC~)Oh)1Ll !6%{|`*JLF x)-Z` qa}c^݄?T/ll8o+ k?Qs߻e>9x<޾37 IX~X71s10]4*'YVju}Yݨ—͍ͭVekU,\x+Cx 0$L[=DI=d![a}_<nbEСZ'5dʹ!1OAԚW~lmtl>f2@m+˼:>QRrU!\br:;OD{m,R? tɌ+ϵ4F,_Yca([ 'dQ3Cp0LJ`(XN0z9|)Y!4Im|sIYyeͨc5s' JxZOoWIVk^F""nz}Hiɭ@sA)?XgF`3T0G4HZZ1Z@J+ÐD AAj*ꐜuvOwݓp0 i7jji=mJ1 NWD/"@I&%G `3AJyp8[Tgum SQ̹PΞxt@4YaO"̓様0 !~1S礈߳w{Ѝ\.gz Vv'*v% ,W(f$ lڱ lגVHSR!h ErtXvL;JdOT&Aφ8u%E3m7KKDiyz2̛A] 6^g?}3xz3ˉ1G-ͳzeL+ݮD20*II\YT2?dPrVO"Lb,㲌uΒ\|*$Dcym2e RDAZ^a!QM!d<@XŞBǐfu¸5åbх]y#<^w[-:{qLIiXQ7_}$_FDެw1dw0;\"FDQ#4q4Ò6fF. F}[a-.pLy!-';@բeJ2rw(8L][)R,l(e4+U%= {D@X͌pȟM4;Yfj%rIP-ls[C3pUS-!ǭ[#}[Vy۔>0 #JLR$Eܲ8ol Tzn~ejl:na3FgїIL|A]E0RJZxkAolCt \|gr7@~ؙ:RTu(3~BC*r{{rV j@d$N8 KQ% *s(URvos8t+, Q^Ao: _B,tı;b5 {oast |.;.gn4- xiHb:CbALq$r!f^*&yBFR[m%eitH 5WrK;#F|\ǀ7Dz](vdH`S@|3Ji!),D~%Zn^ W伎b|:a*"{}#ռJD-l!(ct_#i]q[@nJT`Gc SKף"cv\]$[|/5+D \(HA${;&cst ̵0STHJ=s0Gש҄ FeFbq}yyt_|FbE m*׿+O=WoU:;r3H-f3jf@$WȊBmy & ot]ָ8ĜšPpE2B߃Zea}JE?P>TR[Ь344;EMsq5e73Uec%YcR]`j%T$F4׈/$Z(HLa8SOy²Va[xݮ۱u6fbޒw> k:KA%Ds`k^U[>Fcyx㊅EZ=ܺ]c=X0r z>_EQDb)X]h?Q-.؝h8P__(a_8Wg[xE (!,@Zpok3h8`uP]̾$ #Y|{FaE^!4I*YR'q<+gCTy 9U0D.&U>8g9F>hE/)]zԣOqg..,{(* |e@1|o`Pn Ns T{a{5&C^xQb/M( ZەfDQDQ5Eb4C‚ר"&P C^Vaɷ֪Y44la="Q>JKӒ8qИ0,vrΜؐ(O!Eg" 6IG+W-t%b& M_ZYNBn=Rv@P/uZ.ҢKė,7eϢ<]סA?́rDD9eD;/V+Tjvl? .+?!{>cd!%]@fq4LG)qJhdIU Yh]?[W^GhPpq`4.v#Pw\4ӥw9"\(#l.ƵI`m sic-ɷy}jGϯؓKia7gj!0tqFEN"QŠݯi1=1@}sL2>fuccנ ۗ|b}\캳Q-yH}+O=Bt )/X$<\_8Q獫."dY]R3/ȥv-TRWɆ˃bhcW Ԡ넝NX;dl\%3:\n^Ke[g(8qМ.$ V炲<)Q]*[E u3exY1BXQSh`7D,Ս0ER%q\o )fTde\TM.̔'Dkh<6bxwDFz|iM?<:5:ٺP@.7[ ;Q.ԱE`ѾL/xB]sGZ%Q[OboGO\ȍ lQ1]6n阦2Ѿk<g`aڐ#&ξj@,Ex{֣/*N]N#LUGW"uq`>ʹ<_h,]8^i4U]0v}^|! bcIί(t!|GDU.x`FYz kV Bߒi^@ R $7d&f6Mb^D&`֪֪*[F=-e5Iki^SCg |]QƂXdj]wCU}vOwr|Lx$sx03&%aqY嗋iingLjHp;qD%T*rܪ䤳N '41AGrEAbOS(z QWI3K_^d܃kj2˽Aݸ&{ 7Yq(mam6pP:/:fS~ 鞏kyBZW융Υƙ 6:W +1 tcDrVLbmQ­گ{o*)}ZE/%wЁ_Nj} nc*Uq\GƢ J{ } E TRDkp%+; Lo9|k>sl/7\::x7Vt؏)it'PgA!v֒i* >m;פKz3 .(9h#lmG"Hgv[4h}\pjAIAa"IKW6VIp,7ٳW'|ߠae6kXtm]e,0;h#BtYY靈;t]ȵuXtgD0U*+t#o/)U7S։`.+۸E-h2ʌ),.mZFj]4,+5 3n0G䵰)4!?@1(ܧ|@ EM6z6I銢LեUoWmQlqB):]7mUPdɢ(ɓ(o;,|rDwo^odAXF\Lꉁ_@Зt73EdrqN 1OZs=X[_>Z\b5n/-\/ $x|{އK#@Qeq@QkI500iAՊkfUkEù5!ȑ#)85^:M:%m-i, |EWkZuQpxdi<;F=oGUe-Y+vK$궒L5,8d弸`3PpzT$gk&7+mM7.d@3E7:7ZB[BZ#W Du7)CO#cC{1UP3c&Iҝ x$Z3D3xğ&[(PL},NX C(bp$75&sUOLF`9E,ۯh!=]2 _X2rN@"r,Z S0<}h2h Be~@14*ޘeڥ=,&, wKL~Yodse`$0K͜:U&6鉱 MW&}^1EdBwyZszr(0AgP$Y.;R=km(ܹۤEg+n)7Rxb'CJ{{;bb8&ͼR®1x  ٧@vX\ >UϸWI0fdFF{Uxvhнhvؕ_瞔Eڅv-m(!)ȺSVwp>F6uI ;DZ[eZ8-J}5!+2mQ (G+P̭rQa$x+j#$@K]M]}.SSǀJjW4(%N_(0VL6IIJn:u(' ^n$6KŪx=Qmȹ1 Z~~HD恱ǝE*C!FwVaKEA;¢ԃ }ފt<\OsCĆrO@bK(D.{LLzcy4nޭ]+w+mT[`+6&X OfLX'Jq ^D;66?\:/B o$ Y^y#P)+E=U/ e8"%L MSh(n(:vTւ,3[{/pC8<\/Ud)w5~n_9^fܤoB{{WT6:-mhŸϡdy-7 ͍&2[8wދ{]YXC<<!\t/xv-npr-҅ejeKG^x߹.*qY1l3䎜F~Yc0bIue.r.Xގkqہ6؟[>W8MY[ qd-^G)l h(E^+,gmCE^]~aB-͐>1mlx̲,+!!U}~!7JEgˀ Լ OhQ)dQ$kck#%ezX$tmTdZڽԣots ˈG;reK^jw@؞ۇw`\EIMc/{pމ~Dcrh Y_YHS Aa qv-8q$]G 1@ C | Pv"Ȭx׏mk/[wKvʲ]{ %a6 ɞ)*ڛ>}#}iV<[ql$aA#u>k'6 ALhPv6Uw/M2roxmo?㜺=5tr C_)QX}a*UE0QEQFCI4y ֲ,eYYOCrqDC|G|a6qq|("w:E Gx׷uwRc+83YݬW\;=uzOy¤Ir&J4pϲW8ޟ0KʻX0ljڬ\m̋UUf?K[yYag= pvA]>19bp 3_[Ariֺ\M$VYIe~8܄+5=3*.uΎI4"f[hL4.']*. '[\6ֿALFIA<`aWd3R|x=F5nJxlƵMOӳݽ Q] jJVюVy#HSwCpgx[ɑWo}7X# .khT$RųQHݮ@1tߊ\ƱRF");B v/AIrn[XCO`f4hTI%aHfe7a1S2gֽ7y CTeĝmaQ㫂rAeo.+]dA_N2dBw辟d,on~q? "W_.yЀMbߚVƏ/+V qM&CVpv/P^'!2~x*sA 4ךIhSO;,]"/?|ɠ w K[u甕:d?x(,Y%@-țW;ZFsgoci_ѡ&9٧B 9F32sd6UG^OlILR,k=zod]qL4u1둣"^|zyzp7̧3,9e%ĭQq*`hu׷c-ƻt=qIY3˷.'~!R-s5nMq oMD|i՜\SOBrTf2\rL\$3Ig[ؾȿr 1f+6B~a9h)UbYk xboo"n(J!|%W 6mR!F] kv.=P3\CLq?.qR MZJ_Pس˿.cѝLt5!)?),,BkZK!(dLL@R;X7V9+kEweesIhC@D(A e^bnkg#rroXȞlN6jIOJyph~78tH^65ѮHLSM8F4zCPn$Em,Vg^,t+jBk7r0)q,U{Y|8bR'$[fH7=ry*JÂ*3J%E;#eo4MRjeX;X)X&|jQfr2"+ _ylaA\~7ME a=ʔDo-bGܬ֧'f]HN4 aUGFJusWE'J8NtYF[>yFou_ 7:IBhvm5zʢ1x\0t\eo8|RpFoيc&s+؟qVբ=rH5,lt܄HO=m"UhH_Q݄/ xk!4b_I|˜j#I0:xP|+7ft$M´۽ˇncS ..w[RbAxow^X.QmSʒwv vYF:8J։]4y#r]K    Kec %Bg7e`)6p,[f~A\qlԩu&pӜMF惡v>-)1^1wL&YtTp|sn>,dNqBQN8VF<iba弍jrP{4.M .ʻTy,:.o 32qD=&[\W;3viP69mP1(Жu:\YOMwbQ=B{ݻAse\{>)+9`ߏ2hQtmh$u[qC-(ueJ_hy_9DEJH粬wB`o=sxc/FNt:։uұi˂s(N,41KkD9k_e -Swd7~H8a/^#nWL?K-dlYp6ӁU+r.s%QVl:t.,g8d+/xhPeIB$[,bs%nlFY^7[+M+jV{C?tҋ4;-#ȹV+/޽&azZOr0kI.0#i+zm0T+z? `^>Ycץk7 _# G2;ԙt=/WZ fe I}Ciɢp}̌V}E-gM6 ٬^ȫ4-g-w(X_]U^ &UX*-V(WԱd!nIa-~΄GjٲX~@/6*zsL5;Ύ(i#_;w7R\^ :q@rx;_ܟíb ~aɓ, Uc:,&`1ULtqO=|`_KoWT ).E6 \kpf3ԙ ӆm01n(JNdGĸ ~5Q[i++UH7ps)tѶtD8")G=xȑ_&e;r튂Ŕ;i"CBX&_Bw@h6ۦ,2!gMun2B3셟k;7 ؝ o|~Ns  I 0 ¨LBѰ(Ȏ=@-Q> nXA(4;49h(na~țCc`C}}mB99E:gbmq\¤kib!/\uڐr[󢠷P$Y^7a?"lA9uIwq/)]x7 :36nCnbu rߪ\% TgvP?nf't#i =t{ǗDݷv',nA=N=4N}E˗%~9w<1`B5={Ik$}ԝ ם-Mk .`Isxho^cLžAW3ʈH^|Zu7&>OHZؘr7ˊK'ޢIc[oa)g.zE5io;;еG4+ZX-ye.F~=6&x?$>8ƢP"YxUވ_rO7'+!u,YI+2^eh@; qߙ*=1h*R9%nEHbºĈ Ily+*/&x!a9dӕ'*6˺))T, EeMܕC<u#pg#&*$"2{*J6oOaRQ<bQ]BNZIܝZV\+޾Sr.;8bw" ˢ"fY}i&.teBn oz૜:liIe ԩqE łb,/rus&.rbF7lR^x8X"*aJjc3) Kʟϳ;bҤqdXp&Nɪa(ofYK cohO'=#6s1ȷEPeAvl9ReukJ Ǵ)k'E }| ۳qWR>.e{*fIXy[clSkYm{LΫ/;bϿ[m9ʵTBLM%ƟT) )DHR|^ia&97{٘ t!icqt:&,< jdˢĖCы@I?q2.)9qG@X8.=TKO;&q.eř\3;GpV M"Q Tp;-|,6=XHNyT,v ʫ76f-!aӛW_6ځBCSF}y|W]gaRUv_;-@;M%98".iIB Afp?**;AAv "(J\a߻{]~w_*'*Jni<7g oOy2Oƃl8*|S9jħ^|$5f?aI78|M7m7N7=wSg7'-Ug>Gǽ.@t>K]@b_^c"&#: ܓy%cop M'Qw:9a`Hy^{fix o3 2)N#s` &xVsLUF|<ϺpHh4Htף0 !iԪWVr^|e (2$tYF'dexu` )iI)[[p@@P]aRr%|fW> `ޛ'Af#>BiP(p$sAJvv[4bԢ&o(;LH( A{d8 &,#iY  }?|AvFeh2Gz5ac)N48@0@HB*gpo(4PXND|9!:?ŷYgTyq] F.,.Du2B+fdwm;\7:K4>??;?MFR8ʪ,^+R(K;L$iԓVِE -.,ם܇[4Oo•S@JbX .ter"upҶ? Q0i4au! O8 B0w: f:}X@9-SKaJ W\XhZ^w8̦NE_p,7#-pһ}<{d>gD0^ E Ka*>0^P]&ݓIV^ě@1Ț؉%yqŅZ ,W2,ږ`pYQMHm|\GeHѧ#Ռp:21C'rȾoW]kvHi_ >WF\/MmHNO孎wP2,0(Rz>Y.j[t;]aPO,F[5X$,vCLYl%ɰ<ޥ4@^K# trK u@ 8z KTd_oa/g.q޸  PmK$H @U&FpQ΁rh5lxb?CRfSvUПmxѸ<Z74]K+bs_ӭ:?żП)q_ bר/0BS!DPVuŇF0B !~kYDOK8/RebxC!}Td%)+HP6]⡡bw냰EOѐ疥C;l҈AE*e~[<4.G227ݝrEętA#&`=m^lE'eda4mEhL Xvj E~6J{;t,?3-11FCNld *p++9i21(ȮKIYKiUJ4I|Ɓ_?2` iM4$4@Z(BMX?e磓HA#.q{iZY|Bò K$zL 5`߸-4apLi{|IhtQ#ވip&RKq&J] 5D}E|j2Չ"F&ZDHLnq@SKc\K'?s֜-hd9[J M@5fu@(B -yKjbLc?5)KAXb lxT qef1szθq'C0ZՏhox6RjeQ*E7S? |v&'4,0Ү 9뤱^Ps ?G4ع MB?|B:qP(+\G4X G4%gӿ6Z v9юȰ`1 ,^QE'ʹ3LM^BcAE> SÂ^n@"F)H+ (Kٽ K7F.f{`rN?C{\,I+40ݬ9G65fY`!w0ɼLDy4jՊ°U(OXAG(mI#$#Q IR QPNN$\ e%-"T茶?&Y)_<*<=N/ >~Teő\:ù-w8߬#0`,0?H٢6$Eµ R.hiɘ #FKS-nڪma"WVb{4kֿ sQLxM`Xd⢋}+Q>J<q1F}*Y8Yv@^| 'lTF *ᕽfscVo6xe@ u-h,C=?Dѯ-eyT$z;( hRG}t(B?w[ dK]ea:OzpwjP@`۲㑜RRGX}EPp"=G%˳ .H} ̘䰜)X\OX& T6rKDyjR~ř{XnN'8mرlémMœTzzbQS0ph%tF|A+sD|ja?u3 `3SXY`(PS-2'?E8X2XE.XF> .+ja8l], $. PA8`JrK_M%?&t9t[ uSQ$prŨ(SSr|C"רo\i_R7V2?Jg~:EalLmJU!2-E!arXnlns30Il'U\Uf ٟCF,!fË<$"-yWPTgLtx`t x.UOzTNc4Â5,:5dȎXC<,) Yd D`l)Δe5„<].54d`jzXf"7JI Dx( .}:PjU+bQXM;X Lq!"mQ MǓ 9ו{YY'ZX A-lX: ^j`* HE]֣\w{.}{gJ0f(:Ԓ3vUr x}cz"A!w8uR?pZ?P9=llL\ ɲpO#1"kޠؘe@m.5?S:cBՒQ GlKj/+fH]4]d;OʹSNr*̗]?d1_^!`u5.4FUHE~%_Ydd/ ˘gU F5F9eOJWMAcZ;y]eKA<Zٺ}̢F92RfFfhڕl4HHVs92Q3w .fehh(cbrU7ĚG;!\5%E1*Xa_k>~>S :$AR๖ϯ993Ɋ (Vb@0n#8כsH@:&P2d>15:8AA};)~\̺JrYXtwXb.77xg1v\HOpCiJQ nV,ao%syP!M?`+t>\X'nR5 Qaqy@, 42{g. Vn#-NU7KKXLGs}SKKY0 ;Cv,#f&@潊:] 銸%=W:H\ip(t40l8,K#b ŲkhEi8!1Us b5UX2i,ۨTdE Y5E j++n଺qɓcfP(aTQ*l#L:3=%h8)7 ('F&AyI e X'Jɘ(;Njs ( ;y_`2h[R"u}j2 f`|F,,Z)aNޓ,zX ZGzp,IRKw疫9yYD I/?k?zia%TSlPrdYʖ/ z.R]!}e6zéJɐ/)5kΡ%E/Xe)'L,$$m=>igҒ~w7g@L\XP 2:gN Pʗ(TM+k/lsqFF~JӐ8C$/5`xB=je̩%fE}dh)L'tr@VlӶ[ZHcЏ鐎p"MT@ RFERJ1qUl[o&8mE%錢!4KnwTͨ569? CzҺ,)6& +tdȝ@H4h؋ ]F5@`kvج=2^o-~i?MbbE?ZV|""3|&:5/USw$aHS`;!qHM8Yz;&izK%5?AlJG]u@/XG|D??SNQfdB)ZqB/Qz{)U4.q7RAr fEg &D3hcb>cs93<#Ry~Fga:"QdX]FSܴ)X}QA9EC -J"dfOt%|ijhfL' 8sﱜғdpfށ(+ XKBa%F* q~b%Y[DV 445s&-׌06"-"?MZ96dIq}{KBT$lP'hjd<(H(9P/-c6ohR !+q8(J4؝(c&F &r"_\tRJ^0a&k%[ɐҤy"~yErH4y0КN*gv=DN4y!XHJK7m4=8h}c=y( tk%,we ?t Ft?9_E+Rp$=#4qפ_>Qʷ9Nx,*+KΤl ͤŪ^]6z)(2j]TV-z儾|I6QHD1q`وӚnZvXb.*QRB/=`<׹Qv >Xsר [\8-I' cӞtB9Fq~&]^Z|ŶnzXsBfl>z#J$4n eyFnaq: 3"MW)VZ:uA,\ </(nU i#ȴ 2ULgoZضTVFSC(YvF96[I%KmDJ"Ƹ) >!35th#%}h_Q-%`bAxFD6R©"nF[NNŁR)JVQ<$APVYao+6.6r( 4t`Lۈk6-3iJ0TEm]h'sxh7f't;͝=",(,Ѝ7/pc uaOiMd[ ZYT.\efBuiuGmN#DsTѕXS0n]V:UmiX@m .=Ζt%Fez]2k d734*HHQumlňb=##8V;)M,^OKbh,qA@I-`[l_q<49mT=Z[#W'@`Ed]ϣcTd&m:WThaIQMMV1FK̊dq`/#Mo /4};:k( m*7MB (1lYau&^or\gd^,ǭl Q2$0̪SfŤ Xh>71KF?:ȕz3Lzmoy1RK8Ǹ̛-0_?aXq"j`m0g [,)s xrv8ʊk$|,թD 58#vI<$?e.Q#asE1.PU Ds3j1 o胳fO4UԀvLhAY+TxWxF`[sZWgnhM@qIQQ] px{"gg]iwgqe@dD\H9M'6c٘g"ꤱ!K7q Ao AFuBx|55$^M{-޸E7Vi8 YQGPT~ŕśU#00 sAo!y$NG~˝97ڜnYhM9.{oҗFkv>!`/8*# YE,pJj{bW1-좤,At11|EcޢXa@-rˣUEE;s4k\ -J2Qi̵m|rqDfԌN:-pVҸo]G|̙ECa`p0ON"*N^mqOA^\J3+(!}7 B(P&i7hpU .-|ؒfFZmN9AF`\=\- (xDjUޚ48ŷI$;YL-"N3C$:Q4KtK%e/vFuwY*Pt}zhllHA??敗&'ӆqL1 M˲>t_?6(9c- HT4r,:UQ d5@;,l_m\8נT[aÂRFo FG HI3\H:jhU)9&(y)7oٲBa=BM/#nx\E&ɨ-6(rK9I<XZZؿI <,;-Phg)u@Y/EwI3Y 9+dXg}wC SXܩl^#op/Y= ka x[tI- O[ qa۵3TYkmk4ZƧ ޢ`_Z812#YP Khn.>cTCiWy9@*wR/֮9/g-dA:Uw[ CK]PY"W\+qL0Ra"P̖d>aY Mؒ r)=s ;쌎vðV}c>I|ȃ_;pWԘ.HܾrW:$4+ƙ^¼B̡r}. a.Ѡ1Jl`Nf4{by}EQCci5J XH/X 2lR&t%nf`$epT5m {b,\b;G._x f-I0׽~qt K+* Ř:U,MCHYƒ@{D>M)[z 4na(W4Sy=e#0 a9>˟sܤVɄ]/[NsmQi 5_?tQ-)zXRE ,øCף)܂|wCREO5d7l420jߵY [Z7,-5̯-zRA0{Y奎d?HXȺɏ y;rXJ1o훔L$ ܕ2E!EoЕT"sƵgJ%i"6LrqErˍ*mJ&xZ1Y0' NzZDk1(2YyJ,Ksp}NqA1+ qV ,8$ XnSQ V H6Ԩ t.d#z_)@ZYy,hfl 7nt'i9%L9ݴѯXON b>[ʚ)'|rpޯZh훓-#,x kL.YRqe0b9t1F膟?YѤNYeU;1 ` zX[jr`|/{Se5H?ED"~L c8Ng_Zbd3_&-Kktudyɦt>䎢v6|t(%8oX>"$r9tVZW` AaB0a}y sʈb|Ζ'9GⒷw*HبcIU}~goa{kk8p0 Z(Ny">Wi\~"O(Qi 9 KbBK} ~@e=LBd !̽FذDerm񢉥n^Ș زs癮y\a9tKFw5KFå Bp0ctCKܞ.\@ VEH8JTshg7]dX(c./RE4ByZnxFYJgl>*rrRi0j60kx(nS)&M,zR΋\dž/bON#8ݛ>(yzjv1q:,[,$ވ^3w\9`$$ĸ~pml➌*K]x6`J4N}6pU$xro5DI)l[4ʪ1*{D{95:XW~M0QŮ{ |m lWsAm:pgb!᳿/)t<ٌymqTng)[ >rXnһTOtX$_k7 h|6YjVobz_ ~Im9硒9NEA^bK?3]4n_8*RK|c2} 18 gd\lĬ3ͅk{ȹMl Sʄ^p6$Hn _jj҉ 9 zU9ٶ@e>ߧ`;|Nh5d,U:-q^A]I'\^@X'"CL901l17pCLx\cϞӸ+ V'  3}K0R;C ([Ύ*l<'\E@vk6D!mW-:틘5."JSOc8-+MO}˘ ZH*atJd)PR:({!N_a ~|>|IYU?*yk8.qQĻӸPnj<g/I$tq X|etNK?׶u[XxɮXz"JLI/?`C&(vy('AI/b~OyDGiwiB|c<[r\*WhF]iQ_伒q8jX(uH]a>^L&c0yH}k¯pblާF_B8s0bl^ICT+Dlxf] dkiъ#VIL}EC3M^ DzIlBX݊9*,$5߬T63u,dتx]~ k>\YKy%)GIkӛ-ˬu@ ɧ p[+Mc E2gs0 ?s@h:o-)\c!O=3f٠"n/$'#*bJ&)>D5<>ٔ9d:K@[n;P+zr5낃ɊLح!rg1s9.W3J̖(q(ʯ]ka~6dK@ڍ:3D\XϘ|d)u|.`t \Z#HɂIn̷+Q 4%qp_gQ?"{8\ e6 ms2rLc:LV X̯6˓\t{E K~\QkYqSZqOz W>Y4[*g0pje Q׳o"u39L@(H[j>MͬD:q1v E{ۉ\۷ddݓCřk2F^1mШ0@bH(jJtaWoQr>;;6,ɪ!|\Ax-xƸ$AYry=ču6,˲^2I3C  yʿ>ާr) " X#%o[ w'\Vahb<}Le@1s l/tIZ);{Ԗ nEL{U)x ˉ]XwN (b@7Yb8,%ˏXJ4J:ONN 8!iߴ8r8(x(wKM|lw"@}9 QJcq{>e;)lPNzpxxSU F6Zp:M4*ULm|l[LHa5 ÞӍoeC1` &E\Y9IL]8)d}8$ :Mm6 ,(|Lž(P"2Uo/t}nW1,8ihcLtW)qI0CN[:.Ѧv%ăaDC~WUKʈoQ"e*w*X\X!87N6(y3!63\5lt--g@{X|*N JXˎϻ%N8,יոl;(f|T2FRAbvԇBc)SEy0 S*씐(%x"DxYw2ap8e6'Dq"ƄC+op-ahwh(&Ei@rWn eYr-ֱ\< ST$K ʕ7NfC|e$\ :W XQDy(Ej$% aH^h(;dODD KѺJq0HZ!XEkf{=*lgRV# s[RKŲc]- vv.Q !I=??Lq b+uNmHU86ti3cn;7n=}jh ^։r;Md:K2ıĒdF-%a5&̱J҈9Q]ChDy,FT`yE/Ő .px,)ͭk 55Sk=k{JkkNܞ[KƉ3 s|%uF\V!F8Ձµ⍗~(f0o ݵz&4lM/p]rqtXa~%\J/GNN ~}mkcKBdt;w%pBQ5*ËCrvh'Ks~@Uv⯭+kAQU=mE * *!QK]+S1tgGJXفZPiT*u`(nQrp3_ULyq:E8VJ=.Y*, JI M@369sާѤTV+tET1v K[rK)! 8ژAd#9A=iAdۀ_I ǶTJ6]Wdm͖lI#.7sK mPAf;^cKt]>h8XZuZ3Ͽ2٠-Cr~kWN7diх~BEdݪфcI 2EHoߥ-EK6-ndVnЈ~*+ҐHSΖ,̟&zMIMn)IeP8Viy|xxkAC'XN=)U,$ IID$!mxwUKiwg.Xxoe؏1b<U $TKEU4we9Y1XV$9/h #P;%N ȗʦG⁽ A$g`3ZSm i;@U(Pn/0W}|hg| ﻦUbZz{EYnu8N~SڨSTqE}B12kt = fgl!k/{ԡ.ZbGHG6@S5k%sK:]Ek 9#CSwgqF/\zvC?@NN9!$x7Z6hV8veU-tzH9=_J=_vuں/ȗeĢWXG9Uژ}9<]ݘ*bWZrkt.jE)WY rAD:Iky_p,~gNapey[Bny*8qrɢmڛE ]gvn2TG BFv=97x6N^#M(:FYKQȌRiFV[&J 85v.3''r99@nZn&Ax̀lt3jަ'>9V},ZnN!TA0a!A]!s&QQ7isM0i+monQqjb1 V0h u{,9[5a[ċsN+3feLcRrd j[6,*m:׮  ݜKli/ޢYpt|a)|\bW0- K♳u, DH#[jlXEeYoR,5N%;x<:5G~)0;,׫'lb*EJ.%Mu49K%mՂB-ZX6ǑW.ps|*XN04,F^{=IŋXb))r.Q"+u ӫmD\UCPgHHF:,Ⓒ@._66j }MG9 5DsgCrŝ}JKzp&m?j+OU$ƭg.Ϝ/˹1y9o +@UY3L> 7@>Qv&AYVN5}w+ht(5$MedYL,YGzYH&}5]FR蠼cwͷlF'7 -D؛@r]Po,/sJ &04C{<¼euQ:f!`"'9/Y[NF 0.A$ɡ&^K> ܨ1C@Ҡo o2 [jyㆌ:ڪ rWŞV}L7 I[Ӷ5HJk2'Y0ubX2w*Xti@XEPRKd"V@(l$ >[n'BwY~N!aV*oR ŲĄLQ:H,i&x;- >Z*Ptf1.hcKhDO#n-se*gzX_߬նjx$la:'bZ@b xLBCC} dY_4s~YifƲ~ݯO9eKk㢈ʱJsdfKJb8U@+$@b 6gymW?ՠ;Uc[g#ׯ?lX]gY5d8ivBDa;:>Ӣ xE^OZ((oi\d)@4:$Y ;1p>E(ϳ&9#wp*oRgP8UnϞOhzr`{M#zN&ny}Sf}\"3^-0cD7m"sۧ4vcZR@T06śnVƀ"at$10CTRD}t X՘Z#8;YeMi m$ k? 쳙bctt plS &V`||vEj6DC R{EZi/ɀ@/ǧkf_ EpK!2 Y`j-˓dm ǢBis(`͌neQ\$kZeŲr @Y(kSIM8V+~)%i gr eRT fu/M '-;-Ө"gg nACE< Xti L^XS|+/.s/$^ӄ# ~ed r|q> l dDt+;W-@s>wg&j@w0]*bL\*Xj:XkfLs+^EӅ,&U.dd*[y37dHIAiI 1g: \ 7~C }T =Pb̑Cܬ4ˬ3PհXk{NXT쓈r||D2HLH'_1b%;&0Pcc( %RO*8L-,wr/bU(JH,[ߺmP>׫llʢWOv4-cHmPea k}818F4̎m-(<\f}QT/*f,NɟlK bP}'#80GISR$%o=i:f <H>yXe {;8IL4\ (d!ڿOTܺaE)Ax:#=>Zȶp(jFz8P 2o9r]֊4Zr*U 'eJrܗj 44:`ɂAǷ%O Ư\2,kc"hr{e,,hF hAx` L蘸\@m%2]skq,c5&tyRSs$TKyuNbB# LM<cɹ"i8 C`(,,|Yóbaay,,d^Ϲl,,эIlQ'mH<=Q$/R@$HϒcZED"p^uib@ntbc- Cк Ѽ~>axt\4 \.hYFF#2! {N]H,~9" mNiɋW*tCadB睼StS 5;npXBJ;/mRp@_4p,Y b4#-:Lj MWiGfXM,/h^@.{5]JES*]2)Č_>I||<<*``hJ %t9jGa{gg$_O6Dtd@M qP"6:w:hx}L5 4VWgâڣ;rKxǼ7siP~vPnk S?w1W\={O`>>0\FLaֈ%T3F8 <0 ֈI1ic>}P8܃rU{t%7P} LY֠ ^\^QgX>*w Sl0|<R%}#qit'=$M5Wy(ˆ- !FfaT2Ē0&}Cr2Iʓ(_7*衏*CU>J?(DI{1MHI;EOS/qX qDyhhD\pLFBHLہTa$mug2R9[qTMRFPKQcJE.waQ2w [>%ŏ8_3z3()-NPq:x2WPHB iwq4%5DaH/)"a7rD, JMH Q@g#lgrS|ɥ=Pʘy0euI&/*_jP[dH. YPEEl=P2~Kj٣i)MNq/9' d@dq(\{/'}Bx\Gd }!I7AK`H<)Pr^ d*Y$TR"}JBb4и$": aӰ+Wnsdmq@Qj@ $I &S}"܈ÃyaG$hCΆaKa'$M/PCJIb Lgvr@AJ31D#NP)"NsCyTxP*"LCGh*\DI4i [:!x>I;s_@QI$-YtL$#q-V.ŎA$fHbfDr^W79eK>n$JFi}Rb|@"'|7:>S'HXaN4ɣ:;2@A0C 7_?`((`9,ebyCp[XMk%㫕s Ez\ʀy4a8:]`)ez%W3,^&+&~|QZiKXfxꄲ.Z'7yYCg\? d;`k:7'& }څ9 iO6?z(JLu G$X#HoXz,Cʳ:,/w`Qa=Y5&&-'o bMx{p^&70`C'yC@Y檮qY6w]A!lS,ṡ~ކ?˱2R"FT9}oOl2 D4@*>,5 ԹtO8.Zw4Tӈ1ܘx@}g*`[ 4 'D NGt@/GCyP¡2JИ$d2c&a8nX^گK%Cb lQȎ[tzSSLbr,R4 (<6P.D4Q ͂toV(w=A.؄w{kGJHW{pzvdBlRbk3ɲ8E/&t}<ܑ+pqY:tiZ;[.U0qdC SA;#P?k|Ѭ+ qM(T$ܛ2#E0K"`mi&-M{^lӖ­6pJsTq-b>Y`Z~TO>dqKl h_߰#;VIrU 6Is0J/|0na$aunx(I~$4u>>޽' ɴtM|鳀q"[&Noqe~Z2/Z&b.W$ M" X%PݖYo[8U*U*߉ @?{X&%liq<.̽BHVɘ Gh?GZP"F0*5Nzz'Sfdžnn(zHG;PȮɸW .:1C&/(R@|^'ƴ艃L8ɬ:Z7^5I1p)Xe-+>܏E-ł8V(HR1y&b#[vť@6N@,]14 h[0/2G} Yjr@]+1l:µtXVCqt(m_%vv>_1 $:&; )Bht7 PXL-:q]!|AW;)C'TdVX!gHqe-yJAb:{OJʸ"i>g%#2E!2^!*:BBٟM&!={BIoCj= m Yfˑ K#NDIcOѰJ>f}E 1MfrВ"DAy3bE9 εl扰ٍNKPFsY],,(oczeBb;/V hFġ)8k .@~Iv~HvX%ȑf miWT-iع'^&`}p[&w=:9 ½98̹lK V E"OgV4wx&+jt=~;^eܑ0s.+E :.C?-$h%a%O P@td.WA-Z-Ź6 @6WIx\J%a-f~!G/>apл4i" 40 'v5绥+y8틵'悜 4}dN*|.2-lHT̩d701u^X2NN^T.[v[Y*pv.78&Indr8M7fwsQz]f*iPY&c2g5^9r?,Qm6YNxwF,h/O.I:mmDxe+-VVחv;ʍ7M%v,HAg z܎ÜUt/]$OdVpŽG(fBVLgCn–gX`';ۉs+ }Ik~]iMYPvEεI,F|\7v!@R{` |Zp חM,*$Lj{JDx8[@'WvgXUȯ:wG,ï 1hod6ngVr݅.5_m$!Oz`m0aNhRrUl!y]eXP&/O{=Hbq atʍ'o?,N:@ b!Q$ܟM<|QЙ0yB Ӈd2`bSYڔ9QcUwd1C`= lɝ/ Npz4 `C/V<&$hmMo)8Y$f% f T1FAqϭI>wZƹ6 a! sVrPQU)[X(L4Wo7nႿ̻A;#s<+״CdM4-E娋{VӪ~gv_@,fD 3 @_ۂӌHa`89C$jQ5O.oei89˂ŧ>&ô,:)n (rm'pI@4zfa9 0d&ECr|@J> k-R{LpJ$ ];6dP%sKD3[ڏʋ´w)&oS25%3C"֖LщL^R%> شTw3MK:Vq|ujnN,P 9VЁ[C6J_VZeGXk)rනd|%u;O ,>/}%kCB$D2<m"qU˵Ӡܥk tuwŔc\CaO{@s4^N%g ex' -ArXZjw18:{<RZ~y_!ћ7t6%@~$ B1{ ^\XK 7} o#Iuޅwx >rا5Ir/ڵx'HIPB=vgE %]wƠ,2nͿ3ojY$=йJg.anN5ve%2e>8 tb .Yra"]w2aprAOۗ* 3= sˀj1UuƻlD4]!VH a4th#KV#f1s5 A2 01n:r:Ylء.ȹ\C](kv1p4q|ag잧h'[ÜɵKuvVB>$Ibc8:UP"̟Aᜋ&k@m"|%Ls:)Z$r 19KHqƾG5=/go? e~%5& AM²a|v1eC˓do qoI}L[Y ;.y{HR fτ#$߿\nh Ф'|!l|Ծ VYQjD(X,NX>Ps,?< Sd>m@s]„X YYAX=:qIs-F?sGd2&^(2l$YcWw]5b?JU>*/X4L1&͸toξSrް{ϖ&AQy|%$ƴX=K9-({<y9 ;?dB0{2-grhlG]moiXQ» ǁEx_g''s"v@;:"}F(y{xu0@hrˁrZ!NDF/)+:\t/7ϮI&^VEl,K]G-וʹg \/):St.xQKoǎh%^P/f[wV<Κ֍ lf'Q^3)#jL|4|ʟAGeAܳlVq0P(SE ;pzꔁX ހr{2Yds˛}lM#QIcErqHLnF'|`yThWd-~5Xayԧ]ʹFX =`"qVLre8? SXR+WHTx%UXTͤxK1يо2YRX H {rHywI= I StUif+ L;;ͩƔhShL $ϙ(#%h;~ ='d]vd25R)YэS_*_ ~"yJaNw?cHW*#khV .zc0gaN6O ό' e^0ErnΞoX^AM0*Ƕj $ߙ-pvJ`lo Ȍ;U<+ E&W~Vko^c !e2s|_b]SQpCfu$`$]P|ߒELi}YlL7|j\-XK99o {D*Wع[=&#˅xHGMr{In9~OqE]N#A7NYުMD;,)Aw3XXBSPsyºxIKvmV]F6n!i4]i*q%kU$d\mgCrɩxV?a?k5V7)(}&=; <6T H"i+>+kZW C<\7$C6iHMt ,k =6Fc-;2sn'p(jeL)άB -gmqcD]gajqQ\[M<>t ŸJ^~y4~X'f+k>hiT,jejkCnK05ꗕMqcXT55̮nB q+˃[)*c#yt wmPc |q[7:#m4%"u*!VmZ,"[?/xW#@IB th$N|-ֳ6XF:V8VQiT 8khFC]< }]g7qpOW86j)R7 'uCivޭB/l^f5PlQ7.H<\(v6<4w'  R2YW4D&ŷҽ1D9͊7*Sqb ,0Feew?c~:Hi Sg嵕d+b$-" o3JN"K]SB6hVqa= PؕfoV߬{NL$`%Ϟ,\d9Gn1",nq`֥ɕN.L4%.79U'&a; gerћN/4M=!S*䡋r=!D/iE-8g#cd#$P(И$ӢK1.8l/h۔.5$YAwD+ drիs/8t nJ6:7z̹+:׾kŅV\aw4>(q/\Ety|,8#Ok8[;R`@`zZ ! m?3ϵL4k[ܦ0^@ni݀Gp[V }tm&^G!Ht=X`,I}i YR$.+kax.(8^78]NdU~> /龲oskE#E Es$ EUݞC>i^xK9kDIn]F -Z${ZTd8MS+1Q5&4hĪEA1"╒ =;ûe^L!oqCAtɩioFEvKB/'ܡ#3$s癚 yv |Fb igdaghSkyDerwzS䐌&HXH[W,wR cs 8ڻN^i"IYWί@Ğ5@U8?*93Zy.6)QKoRvwq*p^˚@v^9c]:@^ ćJ?yZso6,{8Z112;\ bm|< Iϡ~50@jJP!)MfhN0%THYxySe{0|)(<뇒~k>˪<@nȺ0 (Wtp2 6X@ 8ĵV DzZAb޾@Ŗؒ 2[csO =`^];(Ia pѐ'yM5%=mjR!Nu1^G[L>-+CpQ,+X0'$wc:_)X'/I9.si#wD,Kj JqLqB ҟHAR7NL97:n{ݭ8qo`|#anGɥ!pӁHK(xC(v1N& p^1B@z1O쐙B$뗮ߘmŴo˃ Q bǻn H CH=A7mQvsd*2Q 5c!;t,_P%3IzR& iL*2"[tHPҕS#`ZGڞ*Q !0a $cN浐u) =>UrY8B3pNvٷ90qiͬM?V%.1؟.y`/(ѩRp5fL0(quRUJ[Ч/tAZפ7l(XPrT|例\(އ"3Ҹ :i[&OX|9ʼntd݉4DT-wAg%*dэ$B"y]0jEE}SH__rwx]<(P.8q2ȷ#Qt|Cݸ$y U9)Lꌲ%jnp,`_ZeSƈ-wvIvJg(>MD{IwZ a3:}~ND)dUgD/ߌ'Ɖ[߬@>h|^giF$x$ͳ4Ar=`?ˑ-h[xᏯM 9.>JI2a8OYez)$韄J~ぽ#0# 8 ݺ8,Z%K8!=حw,5lU'RgEw#IOw[+{ZAbcb%2%p3mI$VY?qNS>w5mp3t6d"[- w%Ͳ[b7)9nzWx^,;GR,ɝ(3W,eڤJz@yq*{pP6w[HHO;su qyƠaݤ6x%`UTwlS#:\C_ߦuL5HjһQ TЍw^ԩǚZ$NH.G Ikz./,Zk˛˭K.1oXI4sI]L5|#Ű$A>qD9K#V;,אhB^ d.`5x Y^isLF T5*Xrf{@:ndօX Rxc *}XC׶aM2ِbYEv^R{h_ *\HY (cȼ`]Վ@ b u7,䀒3Yu>΀g(͊N&;(JV5_|\*>YtqTww~ƴs9^";NLKPnxL{CoLb}MLi>:pk!_MePH7&|=[$TǸ;r|!IbyHŤ@[s,i]ӳgv}Mൎj`͘rNXXmC妦vixd}X(f 9$6`阵:o9~sڢYH~#M͉툘$"k2tLfsfy]`eau*!$[7; 49:,"i'I2Uq&a%z;߳a|L ќC'Sθwh| '13 -iHPQv@FxFK,(+8!ΘV9b(μ8nEEe5-!(r6NU-vagI.f{ёQJTʰ,irr"_kbhs}L$^.s/p/ >ԕI,w.YGnf1H+_VC]s:%mVV8 HMR⃾dyJwYf' fw\%$:076q"q: @IL3%[yI>(b);8aU]W{pDh 7G:fmepid{ߒBl<%7Tb$OMXK{m%I1IVwlr2lD|t@1CGݤ%XM9>,]Oxd#t߉tR h6~EzEC RVۛPK\_` [i(3!gbiY,Tg~z$F4RE ObR,hEo:<>sX-^nn X%W,2 ?#2f0g kHs{7󕍍Fk{#JrZ J@Y(K(f>UJ %i#B`,asw#,{1]O&`}cLKXē5w;1n'eo Ѿ:yrÓ :1*/6:p̒6\Uŋc"R^?֏x-Q„m .,y[kgzrx<@Hy@"-Z[v!_&l䀂RAy$:6ULN*q B(؋j xzBC+E} ewUgW]]U]UդIL%$ݷ{_tUwL"38&2fa*Rǧ0lT dMd\G\`D>u2ݎՂ\k׫#޽ݘuo Ə>۷`2ͧy>'t2͹Ao݃`|p6heY7[[ӬG'KcSϴ_zfgvgw3 ̛3LӼ_M󪚎x$K,K eK)!uiCWG`^/!| $eFhZ1@˂`<vZa؋T{bWcwG=:o-xrn\MI:)i5 IZgOҟà #e$Ytd)G|<. ABe&ó2ϱ7P,} Xv 8Dy?-i`_aOpK:,M΢{$MȢ9P*@(q>({Ka=&.C$CW%cCs`iTzǁ ɉHS:I # O'# hAR'[@L+!dhơ$2DɚYhX,Q'tð\cj -Et.ps` gb@9h hҪ= Kr%|ΠkK587$@V3dAC鬀x,JY;O'VԧY8F(FZ.d4p::bGH)AQ{I$UrU$IH sir;>(Oq(jV@ՂѢeK\$U.(P{x3uS+Fݰ`Pcmp)g7uƒ]$ ڑY }cMoWMԷ~1x#` Kv:G3Z[u|B )GA*DG@~$0v54-K8y4ɟnуB`vfD q |ׅ;D ۸6,Ee>,or.ڕ>t\UAׄXՋW4l,R=^9@C4F`áKF,I b7 2^˺e^IΣS 9PhUr 8;As _WjHK9psjuP6[iwe̩w;.$QpYv4lflH'uϖ| ]W5B~ބӐ[4_-~6x!]W -<dܳ`>BpoYRoq() ]iΐ H r[*v~!* L 0 w$ۛ4!#4Ejո˴ m`T ݴ(;bT݃xN}iQPbg>.a:`NÏ| vŬ@Pux*Ўv1%pP%S!Q8U=쵿& 7ÝCľ$h4F:0IଏCԲ>va? 'hLԀehB՜IczA̸}ˡ]?$xTKjtc`"3QbD[uVı<[y QA1|plO 0>[ڙf5t@^XbiY|5.ѯ;TݷUG#>#`Lm`B-wyY7[qdǣ_weSi^1s?_N y47m$QP"}Oh!plݖ޺{Q",Z\ $NX@`#;ѣ'U0 W[-% D"QHLʢ0X$Q4P 1q`=Xbx"ᤓ.L{QZ1LGUZY $Z*.(H{vY95ZDYMG\w, mǎBKʲWp$o5lQ˫48& ۪F݀R(`?'H`%JK}xq^,eFE Bgͪ#.V%2|5Ct#b41UCp@lƨ|i(Sed޳aXF>~ȡe>htc}1wt=Z&!'$VKxN Gy LcqB ݋,NK}"PC&>/UYMb#5[`6%-bU6\Xma.hnv!):&BJw]\JjwO`]aј}&u"5409, 6 8lx>3ҁ+=e2?J(^&ae6iy%ADWvX^,IVb>а/k:nXa5[.:VZ8"$!bQN;Kaea)#cb:BFqK8Hۭ hi]Nt aP"U)-C^,vl($" ,o\a2* xف=ztr)"L56Q9 x +u/ȑ|]"uxQՁTPB%Qam%OJ2 Gc<{;GS$%)%eEm4n |X>kC9y~V9Bɬɚ١Tɝ>Pö\Vo|\aa$ Hqa{!=!:J5M5eenXĥ4d0\|ġW0|J׀8 ZV,]Jhuq;2[O@64]Ҏ?u[˛sZ* }U.cWr}aGv_.5oǠ2,AbCMpG%uq:NGҞC`r<bFk} Ux;@Xwaba~Տ+4dIgG(Ye(I:A8t쟠:ha Xclӊ2'Q A PZFph3| 0e>-V`8 bKceErnωV,&bxyqD42>|=aX;›j \K@rX;qRFq[K.3JZVM|qW^9%?$q #) rY$$'я))j$6U <*+cl+ +rA~ʂ' ߓw1"0Ҩr<ǝO:wxJ2i9&709Q>ݰL`U$?fWM^wG⽢?mbY(Qd 0*v&19:=VD(~RrLы.AV0*(hJ~kaU^#=by7Jk c3_D|3aρ3aP'ѿCaTᤌC-J2 &]xqOj%;ʆSUG/a7&YpդǢ(cvO2gPϊ,?`Bb˰؉6Xti')ĝ1<H oq4 cGpr6h%0Ԙd'#3""N?ree2L](&bU7$t} :VG\n/9|--1 RI.2nІ:jg5H,I4hc^@@IȲFՆGD;We&y#W/_Fcy|"K`LwfK`,Zrp7튤7ޥŋo Z 7|#9ҴӠ`q|QNcR0ŊNjW-48[y%>_:kf1]NDaD[Z VebWBeT[ ذ8|ߘ.V_Y, hV˕{%s?6 *4*1 * LJd=V63j5A H֧b&oCͪLۆ:3u5X~3#q(Mt Gvg[ִEt>*ͅ0tl$Nvn%=մ4>#\34baQf=:[!˱,ٔsYnXZjMXCu&Jݽu\Pd s0t+5`|z@Tgv)ЋcNJ`l]$8YcCn7e-)/V#QуG4[(,s KRTRD fxґD?_Ig'8KLKuf:^Z{Kǎ;=MTFL*M 2?a'q[mMt'$шӬxa Sߥ/oFҴ5Pt2QX;BsA,dЂ?u.@Ҵ pfv#Z b 8q>(]m=,Z43sE"-.cLlc<$v,^;juWt?%|0b&49*Br?u[QĆzGC3_aO͈X`Q(w'uLZw/h[G 85yl,##7ٺATKL{I4]Ɨ72b?ژlX,@XJi ˆ}d3-W)PL3ܭ4V.g,? :k'd Ŏ@"i$yA{lƒ%[ Cg9)X.q\E_}uNEHh2b5&iZU8#Y +XF(ffaܮT$#mَwA^&*> EqL+V&TV$$m^?uvZݦx!x{c\IVF $*WM|9%0!Hb9',UE^pUs Xp9U:auo0jo'AJ?:rZ͡\Pԯɯ42p: 5`Ұt%2/3 +b&eM;-{,P" Qdo49(rV+]/HGhKyS{I_^(CS/ct:ѭ^OMcdai{XQ2R)Ne*{b. ^`џ@TLcXf SlKiU-#U0`Q|"} Hӵr)ƶOb\o U^8N%@XvNW@H3kEf IfAIA#u.dr yÅS0]1qFۉ9韎"<{e -8d^]hv6 1 {.Y}*Gj JP/wu1@NgI;ԪY][Frfn uWq/1Fe-gs 1ݏ6N+2dKLH^e?&%vk 4=%bTpǻ2Jo;7XQX/57?ճꂂ@L֧=-\6Fpn NHnUc}eai-I[w=/\)Wp:"xլ.mgͥyN&mn>^SĎ ~̙ˊu牃,lҍ"L1`+*k"<8bHкE,u-_ŝXZa[ҌazTl LG£~S - `Qk)W4Umʺ[>]'yƹCT{Ëb>ura;zo@=er3Ѱha gb1l|4lc1B3. bbZ Z!q_|QqČ?=\[flma![h' $fYb5]c&rNOǥFp@H$uM6"RewQ (ҩ,!=sX~><~LV7KR,KjEYڍ8lup0B,EX\X5Y/P0фfzx0~ZEF‘+}Plxw9\:w׾@0w1&ҲX&Mh9v]ʻ0MeM`!<3xCX6k=8Q9v.mC6j1+HG"jI"䍼8rOj2k!+A ?l=.BZ(YR1ᙞ:6WQX{k.Xn4Wth|Ngh=Utm7 tڌ*kEp6qyM(Q:GkZ y!1'T0us!1TzH7Iƙ&1#&hyd3\3ji8 -o_ϗZӐ\2E' a\MCG/8fKqiFF1{C0MQG#` Ƌh>Z$_7l)ꊔXMF.iv (3#UNG8]OAW%k7Ŷ{P%aJq'x!!DCh 핤W),i5$e6X ek3ޏ:z'#m맡m ]F1PrZf =|)*$ ̋> E ^Ƽlg dx4٠A,ZZ{(QH5 W?Dxsgul&plUlog ֹq+bYL)NXIVAJ",1cN>,\hn)K󲾏&t^["iAywSss·%SV9gH zNSQ$mYVEb `R'#W߂N#4>_Q&#YHYCqv`  ,/*jp,HEJvqНAXk6K T_/GY):9+ÙApc{?]>;s_wY_y8;U1YٛAThV\rȚC4!bpȍ ,>Uhy*B%#p5[% l̈.qφre6a:BRܞ _}Vq/Xg$\ `^4]޴SIs弍TopB(t;nդc.63@G2yI-|,okis\T}!?`.,)Q|Bu 'G:YBt0eȴL;݃:D rDBMsJDٲ:<5cenc ޲:85xr_!Yn=F2=3}Ғ>d`m0AiHd{-|*ɠh!X\yzSYXv -,AYh԰z,X~Q&UC0D&+T,?svy^LIg~eӱ{R|HM'M?I(pHӴ͋}z~xh=J-O Wzpp m"MG1PH{]ѴqMvkӗ Ώ[gAy {R ^Er;>⾋-H)Hn $V Ex1Ӆ<tú#jt+(y>^G@VɢwH8f߱,Y匮 gTI&#MqmH2r9L,s$U &nɈ,;G.ѮɴcD-:fy-,xW+ʮ"D|%_OM?"(]6J휖C,>;o>C1BZjl9fÂALI= xWs֜Ke/$3MJ9} ].g]xg2 lU{n7X Lf"OB\&(\^$[߯\0wuln;h38A"Z\= J]:Y YΑWYc?kgw ,k)C JP$Ԉ(= 95׏ذjKNK 4D9pk%j[\Vsw8ސy g M^9gxz%fGby`^&0Vմe{#Ұ4MI= XLjTGB]yK/ݟ`"ޑIp yda_P7..&8Qc{b{`,`yr![_dgI.A)/lYvv&Tc\'Rx0D|l*Σp;fTMq!-KII.dE\2Nx.P <Ad1vX%AIOAvd5ڥH&ǬǃcٛmT 褱X\L'Ew[˄7m #B̆1٣bWb:_~;D%7͓! d;+FX(6p2ځ+ L`cC^j  !c~wXzV7e'[wެ5t)m.ӣaE]/mPev4Y qQ” hVOp}BIZJWàH Y0ȟy˛v3f<2C ʶi쉁(QDi#| &ջ$|&Cpx3.@Iz<8(Sܡ? ː=8{b , mPu 5tDcTGYY>1!g1\oHC68GG̦ WXX[G;nn$QY1Sx=WA9*O{*d]4NW_nܴE7?F1we7wi"nE&lAZg5ַ0kRlkI#sf X x}cv  PL~(5kOp(˪}#р)F*Kq@a7ym G;>`JM&Fy;^h^`phHFK'K aPRKjG 1= I?U'KO1^lW;,,ΒUUUW3a&d|} WeɽX^2sF?:tEs_9n9,,ޒ OلsjJnHWļ&,{C'i$axi 孄[O+"&IZaJH|?Eq0]jLNT.S`e/:M{g;2R4$EuĭiĹ&vmM1vkٽCSҩIxР~k'6{,g}DsʄQX`fnD"P Csѐ" !(ݖAyF_ s7S]2lˀQ]!.36YVf|^$P,`2juHX̶ t"PgBd5؟6 K#O8פFT]db J7DFQ}d]Bj?+DqƜl"CKf>G7 V2H,=|p p%*[dX:>E,t) .Vkw,фa/ Äg=TYQw˼gJ2'S_ $e(otYdzؚd ZGpA,gquA76\dlёi>>Ŝ|Rϗؒyn'򁩓ݬ~˛@Mp!^ X躶uD>,>z/ F$9OLJn-2_0)wN]L$ҰQ,b#I[5Y \-^[bxK1x/^K/p'2IJ;L&Oq¼AgX( 8#Cgy׈gg#0/h !Vk0 sO՘)Ț|ڍ5`jGC} >wp*06%Nw#ὝB)_gaYD<$an&Ƙ'@ `1Kz8:khg%9ǡ_vpy[/Bƃ`Ҵ'ć'Ea#?ӊcG:6Wy4!/Izw\z*4V ]%RxҴ#λb-8"III߃˯:(U0u ϣBIՌ$,1 _.'W$ToWJ00h^O'Njx-:\l=tt}ӪZiCKf/5x05{:ÙtM@/<#J҅9?5,8Ӹ~1gEkĔ`zBÑ)Ч_}rA72{ kƀz4ɧqE U{JA FoQ1XҲ(qαrf/Ml:ÔC`[Opn$b5[OQ޻m1LC+Ha/q'<4`TP&mIK){y/&vRqEĈ/9D!ulI$ 8RcocMyrY4(]q9&!7=q,\qcufss3mylk~\p|NKO6+>+_`m,☭@ {F}zkKtq6$gmsm듎K6KB42rsB/xhX4 c{C iQ`Y Hb bi1fL ݷ 9x;8>P|팪q&1t)ᛀME,fL-k%dX1.}]n x2n6B^TETXxSG,ƤZ$œe\dիsTY%;)Kd=s3}}꧚v_N~ ?q c4#F瀬)Q4i@ vۤ7Ejz֧g>3Cvx@ZKiNL{ZTL|-MYzN M(hB8b۾d(f"ZphBZ>Kno6#&z[a"δ75]} hл/}/SJ׉,< mG| >lB"IK Qo@&ф\NZe(KXT/8.=Td n>h-d Y.42!1,;fGuH,0-Z3ԇ=wRۆ4! C =d:l>ruXP[ ,)ZFi XY6V~fXFJ !,*TBC,E} dwYg^_nխNu@{ZXNBD68*8zQ罦IQgqs.E`XȨxF2תurh4.Oj4n^xq'M;Ngٰ*fdV?`kk+n/x<ݝWt9lwxq3s೓?82Lft6*~$n7v֙f~o“o&m3o |l @ 8JL%\ J5<[׳jV z&S8 IM >ݑz ]:aL r0 IU@!Ԉ WFgPFAi.ˠF=XK8]Bݯ)a0(p8 Ѵ Pt&ID 2AyL@KSL`6 &A ި@8>;NR go>]Ƴh6b0=<&B.}Le4b|PB@Գh806,]O0qٵcnt21.&#쭫v11t>$ᬞ Fi JURzLpȇ&w1"y:T0yf@z<3fä)1g/G>+ҭghL+n86^WOYf'[SW0|vT]L2 3PID>>ɶf+B?и}L CT.c2pm#h jC2:ϮT.Qg* Yn, , Kͭ*pϞ"mY;XXtJLf,c&m 0(`r3|vf΁駱iK+ݬYr8~)%YH%,L8ib@4%G9BM?[yf "쁁ꄰagdgP߭" @S8.3#޴GoGϛGgH8 ˮ~K:_s U(H+j1D9!o:ɇa5\T$ww?eXJ8 ` cr}E0^U$v 0>8 hFO?? _A윘g0ʸ<]abz{6#&ݺFy!GlTS 4c 0 ,1&W%J=q76$|Hf(3k!5]ķd Q+MCW0}̓ ;~igwPt br[J l˰-¤?ޖt\LS*_u1ybqx}ijbe8ٍف:f5â"PSvPEfsPKin!^ \HQIǡԀ&fl'[E=hS^[գdL2L%m:AId4N"S *B $fm9;9'w#ӦL7AцpABy+k8k#"1tI`?OJ -XCᬚ 4JR66ֺbڠz\TK*\!޽Q;lDT: htf8?KWY Q>0SsM$GA :s!y`rԩ,O%;I+7-Ζٞ219W4 T V©!G!e50ޚP#CNc 5 P6P}k趺{M2ߓtx)bN 3Jq-q  קC"Zxxxx{q= (vμ6.hlL^2!_M1ma,fOHr =L+~ N'ixYt;m$S+ UCN/Fp ?t(2I--|Hxs-]'u6@oevwOFB.a!h^>PoW>[ uqbÒc`Inӽ۷(tOJXtMJ}B g~f*wPdP?pZânx X>*:>; /h@M_ N{.,@vhjdm(mXx·Q5| }z@tGe<< a+URND1 ZH^|٨JB ,a`B8Q֛2ʩ2_pX,C="wd8$RG-x$yhD.cRz.hLRz L;]V'# Y@ct9`|Y:텂2(7qx@,I!p& D{Cr`Lv'TqMHJn ADPQ.c@6= ]F 1I/%EtW/^6\Ze<ʎL%ɱHi>@b74'9?)V>,DdATF!&^QXbt %Êe@x &VI!ibH, [ʼT!pU9RjH 37Z)[]Lei\-> syӮ)YEHl3/+3ɲ h)we`(~,ɢ<܈YEc*mA ֠`@4Q~g8ߜuvdb+,ä}5fU5(ydP$]&Ѱ:*/Ǔ^{R.]}RKWaz0K$^OB NH^}?o % JLXL)Ϙ9 - ʳ}dǽD( LpMx/O Ia9EKơ`B,<^+(;8vXhHעraA#t@AU_ %]kx3բ;0d0YJFm,I,bN(]=CNXʁ+L^94QV2Ċ(HLH( k`Aam\@|Er˟g1na-\*\Zu(/gL`7`WG!FW[o}2zA~O^\pKѢ.:"2P1K̢̥S-vp _  $ʪDMܾGXJ b۰"}pتkDҁ$f9j~:A#JJCl0x1-,Vi'3^ 0 +9e5PSX;dMðld:5!?b>ӼxVE<U|>ˡ\pm%2)]]-t1z`S;jj/#0aZkX,euϦf8Kr0Gt"L]@eW,\b_ՏdcR# |abctQgtfRݕae_@0O@|Ê;͙<iEbʓǕ•cy_/5\0V1]]N=X4O%N3>Rtqek5I^{(%죒SГoiQbVAd :]/I#{Ģu6 Dzj`P(M2qhnkXȈYw[ qC-xA`N r>л@3Le(lIE42˜2'2'u}TŲ10K*(I: Y8#E蚢omG[FVL#pnj,U7(t2A(ӡ|> eD+taǴMפIدx{ YҺƲ Ŝh*J4 J#-8$Kr+N;x`wX^95QfLDlӞ+y.zaq !K NG$K$O]%.gD>Bz&CM# `rmHGzxCtx)p~޶-(̑c!5`Szt(;{Ġ?9y{v#!G-bVLqtBIBMM]c,9ѻ/"XgO! <%1$ XG=#4| M^G k<;NI(camVJ|z|~W~g ,#и=/aNr3!|G.z|/ ")EYϢ\l#R2³b%ā~LAgs{S3t㝊xs,?TbQTWwd`<)7n`j).QfVL%b< =|C Zj"508ΨjꂷP3hf&{IcrΚ"T=ʻrJ`K$@ F#]4v8wiLms&MWs<*F1 DZ,%Jǘ-PςX^6 QX:PN@xFX;ǻ{&&7emxf_KDߣ`INu+-.1JThmV#2,////,|d0|Çvx'_Ъšрyn~i9#*ѩ8C&L`lI׈LI3IÊb1T` 6LNpKIB{'&`{ ,^ަ9↊ԉ<<"r2'ZENeaW,/vӛ\ Y8%ЇXXډp,s^r{,Cbd7CNn%_.!)S*jD{8Lnq @)3(+> /.%Y=pP$3,B郊i-[7my+_:K qkT7 θoD D:?wSW'Aq-؂Fi凣{8] /$z/񕤾tЍgEZD> x˼MR-J)5V_9nʦs@z$7E5./uX)Z"BˢF$=*|xƛܙZ)|{|C*M xD^+%鐀 dYDmdҒ+…'}y#a5r%רZʙ j:]R݄Eq`FD猫z<J/oGm>DGK~EvDifFֻņH2rL6 tGb>v\70Z EjXU hyZ;A@+/_W;Lk[qVg85s9oo y"(I2_$VsŃ'&D .-9=EkD҄+cƯduN L=" ,fz΂T85`_]9C¼U d=b&IٌV}%pvݗ"Φbטcbf<$:ͯ1@TA:AEو n!邽|͛Ble&GlQk^f[($1ZF%$֕c7H{㩯uҵ-ul>?i8>òM(W~+y'>O>~y"AI;xB2,;<* Y >IvS(HRsTJۨHr%N?#y2f|wkhtolIA< Zd.\԰1$;/=.$VGMY)/47Q Z:nZ 4-X&g0?zHtPf<$H<`a5 *|Zs)o_ D 6oY 1y%xi!@ `0)9S.xYz,V,HEL9w;4e|"Zn2fz.)S|O3Rv1ɂ3rAOgܣ`I[)1q^_Zc#u1r_!I_:ˍ:G+zSMC N$@Cdz'WHx^jq3Y/R'QyEݥ>9IFΰw;sJܳ^"go°OsMJ8ieaA#N2# K/:,oEL 85Й4I:0)EHâ 3BeM-hnsc|M)6,BBR0JPp`/u1`)a]l2"C9ͱpV))XE9W ֩ݱ-RW?X(4f (b_TJ>bPRtsVG5OŠc_d%G(f9!).G[7-e@0 `D)w%tzAh--Ŏ״i@w#i%.9Pl-M{sZWY mla#WOmlċ|8U% ],z\x&짩٢CWĐCBfS|t1R͢ sE譎 eX=aW./Kp򾈬X R_"[zȲs[ӟ-a>Y, hFK-*ꅲNj fΩ\eWڷ>ķ9dLɑᓳN:@J4Ik6pLN88zz[Xp']) \&yV{RNIv9v-//%2Z$R]J̒ms:%-M"Ab(5q iK6mFQStai>1CBC},ؕ{%9V#Hzl뮪s F$t`-,é=}nˑ1z 6Z<3|^L:cce@BQ_a(VgI"^@JkY%ZLߙi ӡzH9{e;eSN;["Cb[-I{? aP6ED= .͸CFIdzwlH=r]M{ vBtL\^P\ fSAVN(Y̨UWv-l;M d~阉fX\K7EZ&yw9>rQeıGt˻vAn8ik$yܼAǝd%܇3˱[>(]}):s۟l0Z-:4N͕ ܌+p|n&Q\ݶJܰp5$0qEhc^fFV{<+FxKjڅ|L֥zȣ|{AbVjSѵ eȴ|!F-$z7㨗4#e&"H>#f75jYl-E7%< ]iSq8-;ou*ob=}nR7-EEZaAcDy!òE}4g>;=Pa88&+c׳n0xApfw@Yd7's}#yKHLP1{`c.Hwg21K6ȡ<Ȧy%Pp g34XnW}biB1lj۬cلYYM Cɤ2˲DIoij\0HDyJ-4'+WiCpFﰸSSJrMwE'RUmL=篵ɢ$O⁂Turk5ץbq7>ЕbۈpG~ E.o4 ;((ʇsak8~Ylkn,6Ifuח<>g!8Ypm'R(Bn;*t,[jj\3|d>_+Vq,P*p;:g))B3T+YvǸ|>8<:Ƽ STĜYt_W71G㇕42&*) \T$Ò%V#f*9CyqO~[]ΗVJ>D~pGYs6sft馚'"Q muvp^Vd^.qOXzV~X8_ab>DyDh~6*{(A5 1EnQ#M;ϊn 2di*t[C<$yVm;IX &Љūq0/gI*z7r|Os"so* (:8I_+ ,mVOM<ϢJ%a1)XdF (;ɒ?ߋԭ O*`1UWm_2p걺GBIn{OӪ%{L0'@N[@k)e~H-l%AGRS3RY ț[Epl3xGD65Ь:E+2 !@Jn@h O(~},Yts`:xj,mnZi?',}ơyolʝS]1q,Kؒs?RY9lޚbёnpXI&rNþߊdyaaTwT["shd٠J8_ŤPbN<[> .!9PhǔJ%= ӄ-k:塆^n35c}dѸXN&I+Xv)$OpON͗52a2w>H=tY3?ဦ! L=3'' :2EFU7' bl>ovƅtXloδ$1HS*2xo6(1Lc }1'E\?s*Y, xe5y,ː|I3.v%Ǵ)JsM`+Q/K9#(_pD8 "9%k5iۉ4H!W#y/@vB6}Mi;!dtmnW#9f=7?Ծ,@KtV rkɔ1!d2?&GPŚlؼ90ބ+g/:1̍AT1wˑ2`PDI"V鏐TĈ Q \IFr _`?PS*cn/52I2rIJe&(Ɯɵ =YBedGR[WשּB0u̚bQ(bPl,Q܍ T2~F="֥D|Xaq_(:"C]0cxι>kE}'Xh"\>0-RΒX= 1D^X<));Pr` }+sp-*$ϮKzgzU;7+Ean`ɽi{Ec& I*IHG,ĵ(] ]kt W/upp} KzRFܬg$1%TӘCNXb'2>N9P⛕<"[-( 47/q4/I,JUQ;|qxǃA&V7a ٳFQ5#\R TĽ M[$gg[QG_Y0IhrNm9+K^(4/z4qL1dLdER|˱C9@$v]c@YQNև,Wc=Itn!%xʻ!)Yl`nA?ɒ^R(&Y~Y-I1Y6`1|GmCńgO}iUȊ $Qz s]ZC,_S@NX``N֦ʛѼq~i83鴒TGM(Ļ*cD+Sok[ØaRyʅH& iµf2-[E;:UR $mfy"| AeGmo8$Kq;$`9|N ´07`|v)tPV|eN7H*o vYѰu@"r#nJHu${/oIo*Y + ..18ܦKqHXSb1v)!`3mb,-c.uLl@YP#:ߖ: (b㉦Nu`R%#C;(ɋu(oͻɒXl0gǤ=4 0]Nv~Z]elXCEwRJǜI}| Z4 F *9TJ\a'_+}y y 9ee~u:z+If]b &@(F ..5޽}|pbKAsl}96Zk3 ¯i]mڼ-ۆm%IxwHS 㴧Ġ,ц3:ģvxo&x ă^8k1pt;2TFR ȓ|7n֭Wz$H#V~`䁲i3q>}PgNYh(uq:H,=q%w%_ԎKvJF^n(`h9)۲oUrccGS\(rucKe.Lx#Ӎգyv4I~48py*ua3Oxc>JY/Ş0Ti^P-PE'p(gU&]"G\BNb4w▝ZOBr]:y.m 0$BC hiF@rLb.6Ʋn.,!e8cy"nc}eN1e,6>ca`&(η+ ċ))p&]x3xAeVW`hI[M!)`Q5]t,*W^Y*|.RP GAG0⍻Ɯ1\tny ߟ Cy6 s5Ҧ3=WMos\TC)g{Gyc>8 g^} d ,IF}X8^p>=ڐ12 6/C ~yGK(%YXKf-,.1jdy 6qc5k2xmD(>ߒ+H.a n͹Vmjٳt?Ԓc&P.HjPd+ 4h<,8 W$"Z\W!NO$*viX0,sf<|#-Κe53mjx],17m%|Eܫ[v9* ռrynXG}wn%&iΜ[JR sA:KrS@gֵ^;PylwmDy'ei78'\Nv‘(8fVxiI2u'Sņʔ0?@#Q}@i(n-F9*ex"^fY]qו͙pإX$߼)x \%1׳j4`cyʹ︺Sl)B~B2!~1 B{3r;"wG./EZ;,~9wfZ(f Ĺ[?c_؟;kdGEse(^0+f +摖:M&Y6aA)FTyT4V#(XժFD\Sgfr$7]bdH2[t:7#U2F  Mz\/'!, K78avĈ8 S2t!k#$3#DI1 jQMH( -j@ݦ xO y˄ miZΝLHg wH#V@ c `F5a,(EIٲH\7V1 Jn`1+EAQ&/DҶ<'E+JjkMtMMqKuM^첥 %r0[r˖2?_LO(qu| w _j'#2$rtJB1lv.DP[9"[2u-r,nZl^`q&B,Cq",B ts5E w ,%zZ.ZDrR'ZfE|1Ay҉вnpnźx"efí[T$:C,pSo0XeC_6?!H|Yid ̏5O;o!.]iM:M7sV6/:p#X0n%sy+b&3Xv%3`.l0{c}0ޫZiws$5僐C붳 /xB^a7|7I!ݧ"k.qoQt8|DdAޙ.1^]WN>(sHb> - [a :HHWDv-G/jCRpRG>(sRuNdk/?@4c /^Y%Re}{8ۢӎ sI޵G`-K.,"mjɆ8%\R,Wx^i[nrԳr7[P[R9>.EJ),8z,Բw~OBCmYXQ<m4rln^YL}m˛[vjGEOkH !Z8Ms3/[(@zUۄ"b 6,ҥt!љˮpu-ZmB9Y k5 1LIܠyhmld0V х=ȮM|!2(2gam-{Qͽ9+'T8R84 wRtO&!Xdg=q04(| 4X;+L|8/JY a 8$_y&cNPYsA=PӪ^Df 6E?Z|'3cT9EIV*J\Xd7/pfá}fy`00mkd,{(!@o6*ML4Y3C4sٲcK[RV M @1)A1./ȺBCC} wUg%uuV_W/n"Yjdy$MF< 3 4I0Qaꈂ0NE2!BPDPp@!đctUO*_~OJ%RqMKJw~V J??ύ;iw:io8,/-vg, p??p}}뭷\_;/s}iH_T'[3>$g8ݾKar{ ߅X&|~k'`thO'ӝP¤$ (M(?ʛdO?0'̷#a3qه)`F`0;IV 5njQ|iEySE b?KAX79ߙLȴ;NGNȅ% .Bd,KC:Sna;R쐛gP ;Sp:uLF͎usE:fy.6u>.U {a TM ' \AB(9#JpX& x qMjȃEX `iS,I|tr`}Y!6]*O2](j2<2e6xK,uK> \K3P]L=KeU)˳,τ0:%^3ˆ)SO"O#<< t4rcAY'Envr~OjSؚ Uu%!>}\f|B`L; ?},>ն]B~oo,07wHn+Ql`қ?ӝQtcdXjR',y~@f&;7'OMH)64_<(=QUЇ~EeF`MO" &w,1Ĥhno4q73]'??P,!MeIh" ?m3,^;K-(%3<GQkے+l!"m˦|,=w oR?r,GE  >սi HRU+R`C#ʃ"6QETT$PR*UW|t \ Jp -4-e}/Peu>d0vfL3'$Kjg_11'̒O+a &vT(کQy9%%drKj`y;`Fi]z]ð?fI*)80+-~Ot0c2U&/ $L߼To2(A_./w3!qWU,a 3%Mf }&[_H2#~EG: @ E83IrN5x-xȰJnIyCR0%%!JK'=;Ph^˺0_ܢ]w]x)sRf"|-*RUXcG\H=X=LS TQHzh˺u#yp 5F,{0&џhrz}R.iҽeIjBi`l=N(NY~~KEnm҃,6q;y(,?x0XIIҁ qco +Pn}SP۸W:퇁.,$8bb~gpoC2WTY ,`t{! = YE U&@DŽGwZξXxqJWaLne,Cci¥UiC2q"d?`scC5mzMM`Diy]i&-EntY -ѝD&9 E#JT:1iw=PʍFM#0MXEЎ|iBUtYS(<Jy]j4SR{,_fZ~ȡB%y,}Zh8t1R߉ zrO^xBcUL؁hu@&MvCp$ U &Z(P8'½Ŵ80]YP< 'i.3qv<ΟU;&Q{nH̭%ž1+]Z/ka,8@nNCDwĚ MCÝXbIWW-=q+ymĊ軔PqV.N YgTsZL43t_!k!CO8ԡTk6 p6:m2R ^r{SNxZg1R:l0.9:O"23xƝ"Cpi%atJH(5t!C\z}].uEtՋv^*bE ˛Xe?ҽ>s `RLu\]y̸b4!qv8R" 2LMZf\\P%lȀBR%DD^ T+r h/nM8Ex}-(522QԴQTSbuW)1lߛE% 5/'hG&jX%^56Y򏣝*\NÒZtApqوd _dxᕸRqYsV}.(XҧdZQDa{ &ƃ0i5*rFBC~ukYtᅫܹ9*h`"x91@O!+~%QPX$OZ^g!z˲Pcҩ$mMޞUmeW~AƬ4|eᅲg"JMlSB4<@\"*࿰&rp-yG>2Aw ]%Ú8vCCjAQR^t\g,l"°DζSIY_p諪D $Q\bkG?M $N=o*vGk;X,CGa4, k}OLI gDxf٠Kxe7(v2{"I]XL΅>|oӧ.O*-ܤEps"V־::AjQ#HU7Cf4CfH=T`n%N"5bU gͅ:Vݪ.w;9Nv9=aQplI^!+BX{FZ7bч iY)/ԉA:vp .*+egp:.oCs)õe)'ͲE\ºm,qF sr dU+&#CC|[g*UqVB@1]zY t(N$0cTHN )tk-, y=_Ωe@IӜLtuZhsA"W5$mmkwoJVEa5#I1."6"5}qy5hɽWoy9!:}AmD);>G5vyz8C9!&,O [8~t;ի.9CԡIn=p^FX1?.[bJE0ևHo%V]r)&I$Sg1hXDW<{G5AgQM>| m :1>9my}aPڹDm&1]SHO 鈍 j$imA4iфlJqΉa& 6T,igcsΎHRL9ߖ m.nv%dA(M3/Xl!R"&S |dFt'nYۀ edǣDbG;5j o#k(ZyՉʗOelE Gع #3I_j7+@L5qKx(l shN&rVcDqa"Ŕj@ Z0ߐkV3# c?kT Y0&Pt(՜$S{ f J G7GK!jŭUl.N@PLoQgE逢.}Ҩԏ4?CȪ&IN<ҬCIy3 %mEwg8! >w 0˧%HsN}1o pXgJ MYH+5YO&AnVVy.(@RC_+UN\Fio[|3Ȝ*+|Lw1A#嗆O\'[?2MXHf SMe?eVķ4eYL %.{q"iߦk΃ռ\S=탇9(eh2ss;e#=.c0݉,:5_-PXn9R-F`?.H6EtEE(ʬy$cb˫W`B`a`pO7hv[a)'Qao؊bQ6YwDzp0>RweD]ts1,[ɶMŧeGe )S+Noݹ܆ 9S{m 3%kIcb91kvEpPt0󄵚p3enHjFx f\'A7zg@v˜5dc&{v PfX,3 EעȶGZ3%ḯ3`KM-4tb/Y`V:8І_БݵfF51 = )ța$ &aFL BغX!8a/|?4Z^X)mSrب#t .Z yFYrֱg>?ǫq=i@X_=QYf@ImJÉOY1CgXC86aORvAfÚv"v^6X!]v806{{ f]Tia'gYؐhOvBMޒx((H ,ݖvt޼ %&VC !ni_}SRg-&8  EqܬlxbiK D's$Fw@LTLDd,U=n=VzhYˆqwtW ؂\!,NQr(=Payi=^C6i~Z1l\K} t Qʕh]Wb^)Cj;,ȰOJ.jO7w'IOaU;YeD2imS޵g|(Τ-۷n-kzį$WсiZ eEbqURB(7i=Y B{L̎UMt3MVܬo".I LE!9:*|~ժ7C: ^D<xǡہ(. .9Ǖfbs" V&eqJQlY/Sҹj+b7**X[nkQQglpDz=ݲkkۃəğp;ąX7ǻV0+!}f^[h퉲=nsme<ۥP6Y[o .{8@hz(sH2k/yOXfIf0 n,ɷj"<@#w8O (KTd|8J*f0NqZF 70Bit\-0 -l7X\9. l{feo9c=}6s 71wi`YL BqN:v&i?TW2޹ҕVkmzq#HH:wX˓zUC"3,˴TPFc4N^xᢇŊVЫ Q>YW C IEJ5Hu fs5ҽ~հ'ΖEN2p ըf'[uJX] m ŭ\9RNynY[6=Yo5$FmMAHg/XjZV""vRaYE,u£&8XPsҍذo|РFi⮛J5 :nBrnu^]zUr׃$_eX܆ %R+c£QniRS ڐC %ݲ,^6{_*{}g- zZ*d1dihLJ-turΒ`5jOإddFV.޶HUr+(2>lY.ck(F9/Wd{.0c(!o}@Sc ={g]U90Jtm5}*_l"F%y/0>и36)JEpܫ*ƪ=e^P>82rrH%^T+Uzg'*AZ bv(Q.Ͳ%lni.rw_iM+b犸n;I#i&Qn@(n*s8(޷b ҏgj^RG>2.ls@cڠ!ͦ@³ C?d\Z\ai ,r6DWX\P\:eK;X`e$]J;gr(dD4,-}ţq cuئn-^"iDj<=-; ąI.j`$ϳTbfQUҲxN [vF_ǂcM8vA7j5a=!J۵*~ Y[S j?$F]J(g>+tA=f)*'6OdB8 ,d&M}{ e&J9˵>ir7O 4O+_-XP t<0Q{;b}K̥n,Y@ c6'֕voyC\&Vgz. }V`w?]~M|lye1vL ɚejo-,GiLѵLsY^(Ҵ|\qYآ~>\?ֶgSjrǠʷʞ'٧TRx#;=cAn5΋²(Pvu":*_4HI 썈hvcNBY}Cћm\S I}s N]:<b^Je)Ѭ^k4덕͵ ڬVd$4˰*XPjXǁ]]mid]PUm@`XCD4TLND1 U|}^iL,O0FNϘT //{{B=(X[T e{\9d bjaϐDZ?'|d_V muE:8-1=&RAd6< S]j"PD,mZKטuE0q=u$LMO2\wgɫy܍; O_wCHVp(Vy-XIW[jPFkb-FUr <Ӵs 1 ܖ!|)KHFyn@1>7}qseaْn\&GU2ˡϱ?,F82x:|YgA5 )5x{Rs<&.A(t]۸keh&&WB}}8"kpN. )2iz57xxt}Eйrz?t Ih&XBQqQO~tpztz:'|_kE4R7*P Y@yY.V8;F >QNfoWQTE}붱xeI&x:CG+'b|$&f?a~~~EHq(R]"_%f ֟j㶖2I$¯8m̍Zi1n2@@ uK-pw)۽KYs.]͖}\5, MW.L$ 9͡xkE%Q7w+m ɱ1DKY,eЮt_|vu ұKʮ #8̀Gwz]u DR2,jeZ W@? OMZs_HuՅdƊo(3hThXrひ]xE<ٮu?v_R[cpּsDywY,2- P%7}%d`NEO[CȆ9L5ФiobX"3ְdy,*nB,,]ZV}nwHDm"nO+&v_*i NX9eϐ& -1!id@N;$]JsMcO7ђN(VFs+giQ: Vm>㜛.4kWfqڋ걂^݄sw!w:؄\C>VJ Uv(93wAbܭࠬ _hLrsɛӑjQܾncRŏB8j1Ϋ ()D"4 #kÓLA"yT`".Cެ(5ϬeA6yB+M|'-;dqt/RQƼ|8LeTо4MAwsQkϴI"N;)<.:$IJ4b[,8Y%dD^@@T,2eρts rc3XmH!yX9Ϩ̋\f_-:ooQdFn/y+~DpX{*` T9LYLZ(>6ne<,kEYOTЌBVĤ?*FVsj錎تu"Ju"]J(=$;*fʿX} z2z2d.ٳnTOCb?ޅ(`Lt8"P²aګS}tSDNO5sfn_xNU*@t*E{sfgaVy0MiúQ.-x^ #"U GXpQZہ Qesͨ =,p{-euH1n!&t[;tňy;/*ޭsɨAcxvyD(}w2tvãx>:Ai-5:BHF&KXg> xJò:%=ieq\\YNԹvɩQoee K9Y:C$:Y}:bG[B LJGZ ^)CI!oA#g߄17Rxߡ8K{/2- ظ[bɇ=SLBm  t|djYr* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import bio.bam.reader; import bio.bam.writer; import bio.sam.reader; import bio.sam.header; import bio.bam.md.core; import bio.bam.md.reconstruct; import bio.bam.pileup; import bio.bam.baseinfo; import bio.bam.validation.samheader; import bio.bam.validation.alignment; import bio.bam.utils.samheadermerger; import bio.sam.utils.recordparser; import bio.core.bgzf.block; import bio.core.bgzf.inputstream; import bio.core.bgzf.outputstream; import bio.core.utils.roundbuf; import bio.core.utils.range; import bio.core.utils.tmpfile; import bio.core.utils.stream; import bio.core.sequence; import bio.core.base; import bio.core.tinymap; import bio.core.utils.roundbuf; import std.path; import std.range; import std.stdio; import std.stream; import std.algorithm; import std.array; import std.conv; import std.exception; import std.math; import std.typetuple; import std.regex; CigarOperation[] cigarFromString(string cigar) { return match(cigar, regex(`(\d+)([A-Z=])`, "g")).map!(m => CigarOperation(m[1].to!uint, m[2].to!char)).array; } unittest { writeln("Testing extracting SAM header..."); auto fn = buildPath(dirName(__FILE__), "data", "ex1_header.bam"); auto bf = new BamReader(fn); assert(bf.header.format_version == "1.3"); assert(bf.header.sorting_order == SortingOrder.coordinate); assert(bf.header.sequences.length == 2); assert(bf.header.getSequenceIndex("chr1") == 0); assert(bf.header.sequences["chr2"].length == 1584); fn = buildPath(dirName(__FILE__), "data", "bins.bam"); bf = new BamReader(fn); assert(bf.header.sorting_order == SortingOrder.unknown); assert(bf.header.sequences.length == 3); assert(bf.header.read_groups.length == 0); assert(bf.header.getSequenceIndex("large") == 2); assert(bf.header.sequences["small"].length == 65536); { writeln("Testing alignment parsing..."); fn = buildPath(dirName(__FILE__), "data", "ex1_header.bam"); bf = new BamReader(fn); auto reads = bf.reads; auto read = reads.front; assert(equal(read.sequence, "CTCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA")); assert(equal(map!"cast(char)(a + 33)"(read.base_qualities), "<<<7<<<;<<<<<<<<8;;<7;4<;<;;;;;94<;")); assert(bf.reference(read.ref_id).name == "chr1"); assert(read.name == "EAS56_57:6:190:289:82"); assert(read.flag == 69); assert(read.position == 99); assert(read.mapping_quality == 0); reads.popFront(); reads.popFront(); assert(reads.front.cigarString() == "35M"); assert(reads.front.to!string() == "EAS51_64:3:190:727:308 99 chr1 103 99 35M = 263 195 GGTGCAGAGCCGAGTCACGGGGTTGCCAGCACAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<::<<<844 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0"); assert(bf.header.getSequenceIndex("chr1") == read.ref_id); } assert(bf.reads.front.name == "EAS56_57:6:190:289:82"); writeln("Testing tag parsing..."); fn = buildPath(dirName(__FILE__), "data", "tags.bam"); bf = new BamReader(fn); foreach (alignment; bf.reads) { auto name = alignment.name; assert(name[0..4] == "tag_"); char[] tag; name = name[4..$]; while (name[0] != ':') { tag ~= name[0]; name = name[1..$]; } name = name[1..$]; auto value = alignment[tag.idup].toSam(); if (name != value) { writeln("tag: ", tag, "\tname: ", name, "\tvalue: ", value); writeln("value bam_typeid: ", alignment[tag.idup].bam_typeid); } assert(name == value); } writeln("Testing exception handling..."); fn = buildPath(dirName(__FILE__), "data", "duplicated_block_size.bam"); assertThrown!BgzfException(new BamReader(fn)); fn = buildPath(dirName(__FILE__), "data", "no_block_size.bam"); assertThrown!BgzfException(new BamReader(fn)); fn = buildPath(dirName(__FILE__), "data", "wrong_extra_gzip_length.bam"); assertThrown!BgzfException(new BamReader(fn)); fn = buildPath(dirName(__FILE__), "data", "wrong_bc_subfield_length.bam"); assertThrown!BgzfException(reduce!"a+b.sequence_length"(0, (new BamReader(fn)).reads!withoutOffsets)); fn = buildPath(dirName(__FILE__), "data", "corrupted_zlib_archive.bam"); import bio.core.utils.zlib; assertThrown!ZlibException(walkLength((new BamReader(fn)).reads)); writeln("Testing random access..."); fn = buildPath(dirName(__FILE__), "data", "bins.bam"); bf = new BamReader(fn); void compareWithNaiveApproach(int beg, int end) { auto refseq = array(bf["large"][beg .. end]); auto naive = array(filter!((BamRead a) { return a.ref_id != -1 && bf.reference(a.ref_id).name == "large" && a.position < end && a.position + a.basesCovered() > beg; }) (bf.reads!withoutOffsets)); if (!equal(naive, refseq)) { writeln(beg); writeln(end); writeln(array(map!"a.name"(refseq))); writeln(array(map!"a.name"(naive))); } assert(equal(refseq, naive)); } compareWithNaiveApproach(1400, 1500); compareWithNaiveApproach( 10, 123); compareWithNaiveApproach( 135, 1236); compareWithNaiveApproach(1350, 3612); compareWithNaiveApproach( 643, 1732); compareWithNaiveApproach( 267, 1463); compareWithNaiveApproach( 0, 30); compareWithNaiveApproach(1363, 1612); compareWithNaiveApproach( 361, 1231); compareWithNaiveApproach( 322, 612); compareWithNaiveApproach( 912, 938); compareWithNaiveApproach( 0, 3000); compareWithNaiveApproach( 0, 100); compareWithNaiveApproach( 0, 1000); compareWithNaiveApproach( 0, 1900); compareWithNaiveApproach( 1, 279); for (auto i = 50_000; i < 1_000_000; i += 50_000) { compareWithNaiveApproach(i, i + 100); } { auto fst_offset_tiny = bf["tiny"].startVirtualOffset(); auto fst_offset_small = bf["small"].startVirtualOffset(); auto fst_offset_large = bf["large"].startVirtualOffset(); auto fst_read_tiny = bf.getReadAt(fst_offset_tiny); auto fst_read_small = bf.getReadAt(fst_offset_small); auto fst_read_large = bf.getReadAt(fst_offset_large); assert(fst_read_tiny.name == "tiny:r1:0..1:len1:bin4681:hexbin0x1249"); assert(fst_read_small.name == "small:r1:0..1:len1:bin4681:hexbin0x1249"); assert(fst_read_large.name == "large:r1:0..1:len1:bin4681:hexbin0x1249"); } writeln("Testing Value code..."); Value v = 5; assert(v.is_integer); assert(v.toSam() == "i:5"); assert(v == 5); assert(v == "5"); assert(v != [1,2,3]); v = "abc"; assert(v.is_string); assert(v.toSam() == "Z:abc"); assert(v == "abc"); v = [1, 2, 3]; assert(v.is_numeric_array); assert(v.toSam() == "B:i,1,2,3"); assert(v == [1,2,3]); assert(v == "[1, 2, 3]"); v = [1.5, 2.3, 17.0]; assert(v.is_numeric_array); assert(v.toSam() == "B:f,1.5,2.3,17"); assert(approxEqual(to!(float[])(v), [1.5, 2.3, 17])); v = 5.6; assert(v.is_float); assert(v.toSam() == "f:5.6"); assert(approxEqual(to!float(v), 5.6)); v = -17; assert(v.is_signed); assert(v.toSam() == "i:-17"); assert(v == -17); assert(v == "-17"); v = 297u; assert(v.is_unsigned); assert(v.toSam() == "i:297"); assert(v == 297); assert(v == "297"); short[] array_of_shorts = [4, 5, 6]; v = array_of_shorts; assert(v.is_numeric_array); assert(v.toSam() == "B:s,4,5,6"); assert(to!(short[])(v) == array_of_shorts); assert(v == [4,5,6]); assert(v == "[4, 5, 6]"); v = null; assert(v.is_nothing); v = "0eabcf123"; v.setHexadecimalFlag(); assert(v.is_hexadecimal_string); assert(v == "0eabcf123"); writeln("Testing parseAlignmentLine/toSam functions..."); fn = buildPath(dirName(__FILE__), "data", "ex1_header.bam"); bf = new BamReader(fn); foreach (read; bf.reads) { auto line = read.to!string(); auto read2 = parseAlignmentLine(line, bf.header); read2.associateWithReader(bf); if (read != read2) { writeln(read); writeln(read2); writeln(read.raw_data); writeln(read2.raw_data); } assert(read == read2); } fn = buildPath(dirName(__FILE__), "data", "tags.bam"); bf = new BamReader(fn); foreach (read; bf.reads) { auto line = read.to!string(); auto read2 = parseAlignmentLine(line, bf.header); if (read != read2 && isValid(read)) { writeln(read.name); } assert(read == read2 || !isValid(read)); } writeln("Testing BAM writing..."); fn = buildPath(dirName(__FILE__), "data", "ex1_header.bam"); bf = new BamReader(fn); { string tmp = tmpFile("12035913820619231129310.bam"); auto stream = new bio.core.utils.stream.File(tmp, "wb+"); auto writer = new BamWriter(stream); writer.writeSamHeader(bf.header); writer.writeReferenceSequenceInfo(bf.reference_sequences); foreach (read; bf.reads) writer.writeRecord(read); writer.flush(); stream.seekSet(0); assert(walkLength((new BamReader(stream)).reads) == 3270); stream.close(); } writeln("Testing SAM reading..."); { auto sf = new SamReader(buildPath(dirName(__FILE__), "data", "ex1_header.sam")); assert(sf.reads.front.ref_id == 0); assert(equal(sf.reads, bf.reads!withoutOffsets)); } writeln("Testing pileup (high-level aspects)..."); { // All of pileup functions should automatically filter out unmapped reads. // When reads in a range are aligned to different references, // pileup objects should process only the first one. bf = new BamReader(fn); // chr1, chr2 { auto pileup = makePileup(bf.reads); foreach (column; pileup) { foreach (read; column.reads) { assert(bf.reference_sequences[read.ref_id].name == "chr1"); assert(read.ref_id == column.ref_id); assert(!read.is_unmapped); } } } // However, if pileupColumns is used, columns corresponding to chr1 // should come first, and after them -- those for chr2 { auto columns = pileupColumns(bf.reads); int current_ref_id = -1; // [99 .. 1569] [1 .. 1567] int[2] expected_columns = [1470, 1567]; foreach (column; columns) { int ref_id = column.ref_id; --expected_columns[ref_id]; if (ref_id != current_ref_id) { assert(ref_id > current_ref_id); switch (ref_id) { case 0: assert(column.reads.front.name == "EAS56_57:6:190:289:82"); assert(column.position == 99); break; case 1: assert(column.reads.front.name == "B7_591:8:4:841:340"); assert(column.position == 0); break; default: break; } current_ref_id = ref_id; } if (!column.reads.empty) { foreach (read; column.reads) { assert(read.ref_id == ref_id); assert(!read.is_unmapped); } } } assert(expected_columns == [0, 0]); } } writeln("Testing basesWith functionality..."); { fn = buildPath(dirName(__FILE__), "data", "mg1655_chunk.bam"); bf = new BamReader(fn); auto rg = bf.header.read_groups.values.front; auto flow_order = rg.flow_order; auto key_sequence = rg.key_sequence; auto reads = array(bf.reads); auto read = reads[1]; assert(!read.is_reverse_strand); alias TypeTuple!("FZ", "MD", Option.cigarExtra, Option.mdCurrentOp, Option.mdPreviousOp, Option.mdNextOp) Options; auto bases = basesWith!Options(read, arg!"flowOrder"(flow_order), arg!"keySequence"(key_sequence)); typeof(bases.front) bfront; bases.constructFront(&bfront); assert(bfront.md_operation.is_match); assert(bfront.md_operation.match == 309); assert(bfront.md_operation_offset == 0); assert(bfront.previous_md_operation.isNull); assert(bfront.next_md_operation.is_deletion); assert(equal(bfront.next_md_operation.deletion, "G")); assert(equal(bfront.cigar_after, read.cigar[1 .. $])); assert(equal(drop(map!"a.reference_base"(bases), 191), "-CCCGATTGGTCGTTGCTTTACGCTGATTGGCGAGTCCGGGGAACGTACCTTTGCTATCAGTCCAGGCCACATGAACCAGCTGCGGGCTGAAAGCATTCCGGAAGATGTGATTGCCGGACCTCGGCACTGGTTCTCACCTCATATCTGGTGCGTTGCAAGCCGGGTGAACCCATGCCGGAAGCACCATGAAAGCCATTGAGTACGCGAAGAAATATA")); assert(equal(bases, read.sequence)); assert(equal(take(map!"a.flow_call.intensity_value"(bases), 92), [219, 219, 194, 194, 92, 107, 83, 198, 198, 78, // A A C C T G A T T A 292, 292, 292, 81, 79, 78, 95, 99, 315, 315, 315, // C C C A T C A G T T T 89, 79, 290, 290, 290, 100, 209, 209, 87, 80, // G C G G G T G G C A 191, 191, 101, 179, 179, 210, 210, 99, 184, 184, // C C A T T G G T A A 90, 91, 193, 193, 66, 100, 112, 79, 108, 106, 212, 212, // C A C C A T G C A C A A 90, 96, 111, 94, 64, 94, 187, 187, 84, 110, 98, 102, 100, // C T A C T C G G T G C T C 93, 89, 205, 205, 107, 98, 96, 91, 203, 203, 68, 180, 180, // G C G G A C G A C C G T T 118, 246, 246, 91, 102, 94, 116, 90, 99, 101, 298, 298, 298 // C G G T G C T G C T G G G ])); // bases must be the same foreach (r; reads) { if (r.is_unmapped) continue; if (r.cigar.length == 0) continue; if (r.is_reverse_strand) { bases = basesWith!Options(r, arg!"flowOrder"(flow_order), arg!"keySequence"(key_sequence)); // if reverse strand, bases are also reverse complemented assert(equal(bases, map!"a.complement"(retro(r.sequence)))); } else { bases = basesWith!Options(r, arg!"flowOrder"(flow_order), arg!"keySequence"(key_sequence)); assert(equal(bases, r.sequence)); } } } writeln("Testing extended CIGAR conversion..."); auto cigars = ["2M1D7M1D6M1D13M1D5M1D12M2D7M1D10M1D17M1D12M3D23M", "12M2D9M1D14M1D16M2D7M1D4M1D12M1D9M1D15M1D6M1D14M1S", "8S13M2I20M2D6M1D11M1D16M2D10M2D4M1D15M1D4M1D4M", "5M1D3M1D14M1D9M2D15M1D18M1D10M2D22M1I6M1D11M4S", "1S24M1D8M1D11M2D7M2D8M2D14M1D6M1D28M", "1S20M1D7M2D8M1D9M1D11M2D12M1D10M1D10M1D5M1D6M1D3M", "19M1D12M1D8M1D6M1I3M1D28M1D11M1D4M1D9M2D9M1I2M", "11S9M2D23M1D10M1I4M1D17M2D11M2D11M1D3M1D10M", "76M8D14M"].map!cigarFromString.array; auto md_ops = ["2^G7^G6^T13^C5^G12^AC1T5^G10^T17^A12^TAA0T22", "6T1A3^TA9^T14^G10A0G4^AT0A6^T4^A12^C9^T15^T6^C14", "19C1T11^TC1T4^C11^T16^TG0A0C8^CT4^G15^T4^T4", "5^T3^G8G0T4^T9^AT1A13^T18^A10^AT0G10T1A14^A11", "24^T8^A11^AT0A6^TA0T7^AG0C13^C6^T9G0C0A16", "20^G4G2^GC0T7^G9^T11^AT5A6^G10^T10^A5^A6^C3", "13C0A4^A9A2^T8^C9^C10A0T16^T11^C4^C9^CA0G10", "9^TT8C0T13^T5A8^C2T14^CA11^TA0T10^T3^A9T0", "60T14A0^TATGTGTG14"].map!mdOperations.array; auto expected = ["2=1D7=1D6=1D13=1D5=1D12=2D1=1X5=1D10=1D17=1D12=3D1X22=", "6=1X1=1X3=2D9=1D14=1D10=2X4=2D1X6=1D4=1D12=1D9=1D15=1D6=1D14=1S", "8S13=2I6=1X1=1X11=2D1=1X4=1D11=1D16=2D2X8=2D4=1D15=1D4=1D4=", "5=1D3=1D8=2X4=1D9=2D1=1X13=1D18=1D10=2D1X10=1X1=1X8=1I6=1D11=4S", "1S24=1D8=1D11=2D1X6=2D1X7=2D1X13=1D6=1D9=3X16=", "1S20=1D4=1X2=2D1X7=1D9=1D11=2D5=1X6=1D10=1D10=1D5=1D6=1D3=", "13=2X4=1D9=1X2=1D8=1D6=1I3=1D10=2X16=1D11=1D4=1D9=2D1X8=1I2=", "11S9=2D8=2X13=1D5=1X4=1I4=1D2=1X14=2D11=2D1X10=1D3=1D9=1X", "60=1X14=1X8D14="].map!cigarFromString.array; foreach (cigar, md, expected_cigar; zip(cigars, md_ops, expected)) assert(makeExtendedCigar(cigar, md).equal(expected_cigar)); /* https://github.com/lomereiter/sambamba/issues/137 */ { fn = buildPath(dirName(__FILE__), "data", "b.sam"); auto sam = new SamReader(fn); auto writer = new BamWriter("/dev/null", 0); writer.writeSamHeader(sam.header); writer.writeReferenceSequenceInfo(sam.reference_sequences); foreach (r; sam.reads) writer.writeRecord(r); writer.finish(); } } void main() { }