[med-svn] [libbiod] 01/02: New upstream version 0.1.0
Andreas Tille
tille at debian.org
Sun Feb 26 06:37:27 UTC 2017
This is an automated email from the git hooks/post-receive script.
tille pushed a commit to branch master
in repository libbiod.
commit 7c34c122c9fd249c74206a345234c90034e6ed89
Author: Andreas Tille <tille at debian.org>
Date: Sun Feb 26 07:36:00 2017 +0100
New upstream version 0.1.0
---
.gitignore | 5 +
.travis.yml | 3 +
LICENSE | 17 +
README.md | 25 +
bio/bam/abstractreader.d | 49 +
bio/bam/bai/bin.d | 92 +
bio/bam/bai/indexing.d | 364 ++
bio/bam/baifile.d | 169 +
bio/bam/baseinfo.d | 727 +++
bio/bam/constants.d | 37 +
bio/bam/iontorrent/flowcall.d | 320 ++
bio/bam/iontorrent/flowindex.d | 99 +
bio/bam/md/core.d | 4 +
bio/bam/md/operation.d | 147 +
bio/bam/md/parse.d | 182 +
bio/bam/md/reconstruct.d | 439 ++
bio/bam/multireader.d | 429 ++
bio/bam/pileup.d | 1008 ++++
bio/bam/randomaccessmanager.d | 468 ++
bio/bam/read.d | 1796 +++++++
bio/bam/reader.d | 594 +++
bio/bam/readrange.d | 199 +
bio/bam/reference.d | 221 +
bio/bam/referenceinfo.d | 63 +
bio/bam/region.d | 65 +
bio/bam/snpcallers/maq.d | 541 ++
bio/bam/snpcallers/simple.d | 47 +
bio/bam/splitter.d | 106 +
bio/bam/tagvalue.d | 588 +++
bio/bam/thirdparty/msgpack.d | 5173 ++++++++++++++++++++
bio/bam/utils/array.d | 113 +
bio/bam/utils/graph.d | 92 +
bio/bam/utils/samheadermerger.d | 404 ++
bio/bam/utils/value.d | 121 +
bio/bam/validation/alignment.d | 562 +++
bio/bam/validation/samheader.d | 446 ++
bio/bam/writer.d | 292 ++
bio/core/base.d | 268 +
bio/core/bgzf/block.d | 197 +
bio/core/bgzf/chunk.d | 41 +
bio/core/bgzf/compress.d | 113 +
bio/core/bgzf/constants.d | 61 +
bio/core/bgzf/inputstream.d | 522 ++
bio/core/bgzf/outputstream.d | 244 +
bio/core/bgzf/virtualoffset.d | 95 +
bio/core/call.d | 106 +
bio/core/fasta.d | 52 +
bio/core/genotype.d | 93 +
bio/core/kmer.d | 113 +
bio/core/region.d | 234 +
bio/core/sequence.d | 230 +
bio/core/tinymap.d | 312 ++
bio/core/utils/algo.d | 162 +
bio/core/utils/bylinefast.d | 142 +
bio/core/utils/format.d | 312 ++
bio/core/utils/memoize.d | 272 +
bio/core/utils/outbuffer.d | 108 +
bio/core/utils/range.d | 280 ++
bio/core/utils/roundbuf.d | 102 +
bio/core/utils/stream.d | 167 +
bio/core/utils/switchendianness.d | 50 +
bio/core/utils/tmpfile.d | 20 +
bio/core/utils/zlib.d | 280 ++
bio/maf/block.d | 73 +
bio/maf/parser.d | 827 ++++
bio/maf/reader.d | 105 +
bio/sam/header.d | 800 +++
bio/sam/reader.d | 222 +
bio/sam/utils/fastrecordparser.d | 4711 ++++++++++++++++++
bio/sam/utils/recordparser.d | 1457 ++++++
bio/sff/constants.d | 5 +
bio/sff/index.d | 6 +
bio/sff/read.d | 26 +
bio/sff/reader.d | 152 +
bio/sff/readrange.d | 128 +
bio/sff/utils/roundup.d | 13 +
bio/sff/writer.d | 116 +
dub.json | 12 +
examples/calculate_gc_content_from_reference.d | 35 +
examples/create_bam_from_scratch.d | 38 +
examples/iterate_tags.d | 42 +
examples/make_pileup.d | 28 +
examples/print_base_info.d | 36 +
examples/read_bam_file.d | 37 +
examples/transverse_multiple_bam_files.d | 32 +
src_ragel/Makefile | 28 +
src_ragel/maf_block.rl | 153 +
src_ragel/region.rl | 86 +
src_ragel/sam_alignment.rl | 524 ++
src_ragel/workarounds/fix_static_const.sh | 6 +
.../workarounds/fix_switch_case_fallthrough.sh | 6 +
test/data/b.sam | 3993 +++++++++++++++
test/data/b7_295_chunk.bam | Bin 0 -> 420938 bytes
test/data/bins.bam | Bin 0 -> 129222 bytes
test/data/bins.bam.bai | Bin 0 -> 3664 bytes
test/data/corrupted_zlib_archive.bam | Bin 0 -> 124681 bytes
test/data/duplicated_block_size.bam | Bin 0 -> 124687 bytes
test/data/ex1_header.bam | Bin 0 -> 124681 bytes
test/data/ex1_header.bam.bai | Bin 0 -> 176 bytes
test/data/ex1_header.sam | 3273 +++++++++++++
test/data/illu_20_chunk.bam | Bin 0 -> 7561 bytes
test/data/ion_20_chunk.bam | Bin 0 -> 231521 bytes
test/data/long_header.bam | Bin 0 -> 10216 bytes
test/data/mg1655_chunk.bam | Bin 0 -> 535625 bytes
test/data/no_block_size.bam | Bin 0 -> 124681 bytes
test/data/tags.bam | Bin 0 -> 3592 bytes
test/data/tags.bam.bai | Bin 0 -> 104 bytes
test/data/wrong_bc_subfield_length.bam | Bin 0 -> 124681 bytes
test/data/wrong_extra_gzip_length.bam | Bin 0 -> 124681 bytes
test/unittests.d | 482 ++
110 files changed, 38035 insertions(+)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..433d266
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+.dub
+docs.json
+__dummy.html
+*.o
+*.obj
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..d7b3485
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,3 @@
+language: d
+script:
+- rdmd -unittest -d test/unittests.d
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..fc825c7
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,17 @@
+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.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..319569e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,25 @@
+### 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
diff --git a/bio/bam/abstractreader.d b/bio/bam/abstractreader.d
new file mode 100644
index 0000000..402baea
--- /dev/null
+++ b/bio/bam/abstractreader.d
@@ -0,0 +1,49 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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();
+}
diff --git a/bio/bam/bai/bin.d b/bio/bam/bai/bin.d
new file mode 100644
index 0000000..296e7bc
--- /dev/null
+++ b/bio/bam/bai/bin.d
@@ -0,0 +1,92 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+}
diff --git a/bio/bam/bai/indexing.d b/bio/bam/bai/indexing.d
new file mode 100644
index 0000000..270f5e6
--- /dev/null
+++ b/bio/bam/bai/indexing.d
@@ -0,0 +1,364 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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();
+}
diff --git a/bio/bam/baifile.d b/bio/bam/baifile.d
new file mode 100644
index 0000000..57359a9
--- /dev/null
+++ b/bio/bam/baifile.d
@@ -0,0 +1,169 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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:
+ ///
+ /// [........ at ...........!..............!.................................]
+ /// . ..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);
+ }
+ }
+ }
+}
diff --git a/bio/bam/baseinfo.d b/bio/bam/baseinfo.d
new file mode 100644
index 0000000..aca9772
--- /dev/null
+++ b/bio/bam/baseinfo.d
@@ -0,0 +1,727 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+ }
+ }
+ }
+ }
+}
diff --git a/bio/bam/constants.d b/bio/bam/constants.d
new file mode 100644
index 0000000..9d12ad6
--- /dev/null
+++ b/bio/bam/constants.d
@@ -0,0 +1,37 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
diff --git a/bio/bam/iontorrent/flowcall.d b/bio/bam/iontorrent/flowcall.d
new file mode 100644
index 0000000..75746fb
--- /dev/null
+++ b/bio/bam/iontorrent/flowcall.d
@@ -0,0 +1,320 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+}
diff --git a/bio/bam/iontorrent/flowindex.d b/bio/bam/iontorrent/flowindex.d
new file mode 100644
index 0000000..35a0b22
--- /dev/null
+++ b/bio/bam/iontorrent/flowindex.d
@@ -0,0 +1,99 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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]));
+}
diff --git a/bio/bam/md/core.d b/bio/bam/md/core.d
new file mode 100644
index 0000000..a5e5b00
--- /dev/null
+++ b/bio/bam/md/core.d
@@ -0,0 +1,4 @@
+module bio.bam.md.core;
+
+public import bio.bam.md.operation;
+public import bio.bam.md.parse;
diff --git a/bio/bam/md/operation.d b/bio/bam/md/operation.d
new file mode 100644
index 0000000..2f8eef2
--- /dev/null
+++ b/bio/bam/md/operation.d
@@ -0,0 +1,147 @@
+module 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;
+}
diff --git a/bio/bam/md/parse.d b/bio/bam/md/parse.d
new file mode 100644
index 0000000..0b2793b
--- /dev/null
+++ b/bio/bam/md/parse.d
@@ -0,0 +1,182 @@
+module 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)]));
+}
diff --git a/bio/bam/md/reconstruct.d b/bio/bam/md/reconstruct.d
new file mode 100644
index 0000000..3865e30
--- /dev/null
+++ b/bio/bam/md/reconstruct.d
@@ -0,0 +1,439 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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"));
+}
diff --git a/bio/bam/multireader.d b/bio/bam/multireader.d
new file mode 100644
index 0000000..2a9705f
--- /dev/null
+++ b/bio/bam/multireader.d
@@ -0,0 +1,429 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2016 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+ }
+}
diff --git a/bio/bam/pileup.d b/bio/bam/pileup.d
new file mode 100644
index 0000000..576a16b
--- /dev/null
+++ b/bio/bam/pileup.d
@@ -0,0 +1,1008 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2016 Artem Tarasov <lomereiter at gmail.com>
+
+ 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
+/// <ul>
+/// $(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)</ul>
+/// $(BR)
+/// It is clear from the above that current CIGAR operation cannot be an insertion.
+/// The following are suggested ways to check for them:
+/// <ul>
+/// $(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'))</ul>
+/// $(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);
+}
diff --git a/bio/bam/randomaccessmanager.d b/bio/bam/randomaccessmanager.d
new file mode 100644
index 0000000..e5beb4b
--- /dev/null
+++ b/bio/bam/randomaccessmanager.d
@@ -0,0 +1,468 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2014 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+ }
+}
diff --git a/bio/bam/read.d b/bio/bam/read.d
new file mode 100644
index 0000000..3d15881
--- /dev/null
+++ b/bio/bam/read.d
@@ -0,0 +1,1796 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2016 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+}
diff --git a/bio/bam/reader.d b/bio/bam/reader.d
new file mode 100644
index 0000000..fae864f
--- /dev/null
+++ b/bio/bam/reader.d
@@ -0,0 +1,594 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+ }
+ }
+}
diff --git a/bio/bam/readrange.d b/bio/bam/readrange.d
new file mode 100644
index 0000000..1a2ec87
--- /dev/null
+++ b/bio/bam/readrange.d
@@ -0,0 +1,199 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2014 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+}
diff --git a/bio/bam/reference.d b/bio/bam/reference.d
new file mode 100644
index 0000000..997e6b4
--- /dev/null
+++ b/bio/bam/reference.d
@@ -0,0 +1,221 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2014 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+}
diff --git a/bio/bam/referenceinfo.d b/bio/bam/referenceinfo.d
new file mode 100644
index 0000000..3824fe8
--- /dev/null
+++ b/bio/bam/referenceinfo.d
@@ -0,0 +1,63 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+ }
+}
diff --git a/bio/bam/region.d b/bio/bam/region.d
new file mode 100644
index 0000000..68b4819
--- /dev/null
+++ b/bio/bam/region.d
@@ -0,0 +1,65 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2014 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+ }
+}
diff --git a/bio/bam/snpcallers/maq.d b/bio/bam/snpcallers/maq.d
new file mode 100644
index 0000000..2cb8a4b
--- /dev/null
+++ b/bio/bam/snpcallers/maq.d
@@ -0,0 +1,541 @@
+module 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);
+ }
+}
diff --git a/bio/bam/snpcallers/simple.d b/bio/bam/snpcallers/simple.d
new file mode 100644
index 0000000..8cc4015
--- /dev/null
+++ b/bio/bam/snpcallers/simple.d
@@ -0,0 +1,47 @@
+module 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));
+}
diff --git a/bio/bam/splitter.d b/bio/bam/splitter.d
new file mode 100644
index 0000000..7de00cc
--- /dev/null
+++ b/bio/bam/splitter.d
@@ -0,0 +1,106 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+}
diff --git a/bio/bam/tagvalue.d b/bio/bam/tagvalue.d
new file mode 100644
index 0000000..dbd9aad
--- /dev/null
+++ b/bio/bam/tagvalue.d
@@ -0,0 +1,588 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2014 Artem Tarasov <lomereiter at gmail.com>
+
+ 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());
+ }
+}
diff --git a/bio/bam/thirdparty/msgpack.d b/bio/bam/thirdparty/msgpack.d
new file mode 100644
index 0000000..bf5ca5b
--- /dev/null
+++ b/bio/bam/thirdparty/msgpack.d
@@ -0,0 +1,5173 @@
+// 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: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>.
+ * 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;
+
+
+ at 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
+ */
+ at trusted
+void callbackUInt(ref Value value, ulong number)
+{
+ value.type = Value.Type.unsigned;
+ value.via.uinteger = number;
+}
+
+
+/// ditto
+ at trusted
+void callbackInt(ref Value value, long number)
+{
+ value.type = Value.Type.signed;
+ value.via.integer = number;
+}
+
+
+/// ditto
+ at trusted
+void callbackFloat(ref Value value, real number)
+{
+ value.type = Value.Type.floating;
+ value.via.floating = number;
+}
+
+
+/// ditto
+ at trusted
+void callbackRaw(ref Value value, ubyte[] raw)
+{
+ value.type = Value.Type.raw;
+ value.via.raw = raw;
+}
+
+
+/// ditto
+ at 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
+ at 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
+ at safe
+void callbackNil(ref Value value)
+{
+ value.type = Value.Type.nil;
+}
+
+
+/// ditto
+ at 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.
+ */
+ at safe
+pure void onCastError()
+{
+ throw new MessagePackException("Attempt to cast with another type");
+}
+
+
+/*
+ * A callback for type-mismatched error in deserialization process.
+ */
+ at 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));
+}
diff --git a/bio/bam/utils/array.d b/bio/bam/utils/array.d
new file mode 100644
index 0000000..4e5f8a1
--- /dev/null
+++ b/bio/bam/utils/array.d
@@ -0,0 +1,113 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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]);
+}
diff --git a/bio/bam/utils/graph.d b/bio/bam/utils/graph.d
new file mode 100644
index 0000000..a226e6f
--- /dev/null
+++ b/bio/bam/utils/graph.d
@@ -0,0 +1,92 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+}
diff --git a/bio/bam/utils/samheadermerger.d b/bio/bam/utils/samheadermerger.d
new file mode 100644
index 0000000..c4633c7
--- /dev/null
+++ b/bio/bam/utils/samheadermerger.d
@@ -0,0 +1,404 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2014 Artem Tarasov <lomereiter at gmail.com>
+
+ 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));
+ }
+}
diff --git a/bio/bam/utils/value.d b/bio/bam/utils/value.d
new file mode 100644
index 0000000..8f787fe
--- /dev/null
+++ b/bio/bam/utils/value.d
@@ -0,0 +1,121 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+ }
+}
diff --git a/bio/bam/validation/alignment.d b/bio/bam/validation/alignment.d
new file mode 100644
index 0000000..ac4b9fa
--- /dev/null
+++ b/bio/bam/validation/alignment.d
@@ -0,0 +1,562 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+}
diff --git a/bio/bam/validation/samheader.d b/bio/bam/validation/samheader.d
new file mode 100644
index 0000000..9f64529
--- /dev/null
+++ b/bio/bam/validation/samheader.d
@@ -0,0 +1,446 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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 at SQ\tSN:chr1\tLN:1575");
+ assert(isValid(valid_header));
+
+ auto empty_seq_name = new SamHeader("@HD\tVN:1.3\tSO:coordinate\n at SQ\tSN:\tLN:1575");
+ assert(!isValid(empty_seq_name));
+
+ auto missing_seq_name = new SamHeader("@HD\tVN:1.3\tSO:coordinate\n at SQ\tLN:1575");
+ assert(!isValid(missing_seq_name));
+
+ auto missing_seq_length = new SamHeader("@HD\tVN:1.3\tSO:coordinate\n at SQ\tSN:chr1");
+ assert(!isValid(missing_seq_length));
+
+ auto seq_length_out_of_range = new SamHeader("@HD\tVN:1.3\tSO:coordinate\n at 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 at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at RG ID:ERR016155 LB:HUMgdtRAGDIAAPE SM:HG00125 PI:488 CN:BGI PL:ILLUMINA DS:SRP001294
+ at RG ID:ERR016156 LB:HUMgdtRAGDIAAPE SM:HG00125 PI:489 CN:BGI PL:ILLUMINA DS:SRP001294
+ at RG ID:ERR016157 LB:HUMgdtRAGDIAAPE SM:HG00125 PI:488 CN:BGI PL:ILLUMINA DS:SRP001294
+ at PG ID:bwa_index PN:bwa VN:0.5.9-r16 CL:bwa index -a bwtsw $reference_fasta
+ at 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
+ at 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)
+ at 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)
+ at 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
+ at 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
+ at 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)
+ at 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)
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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
+ at 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));
+}
diff --git a/bio/bam/writer.d b/bio/bam/writer.d
new file mode 100644
index 0000000..187b40a
--- /dev/null
+++ b/bio/bam/writer.d
@@ -0,0 +1,292 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2015 Artem Tarasov <lomereiter at gmail.com>
+
+ 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
+ }
+}
diff --git a/bio/core/base.d b/bio/core/base.d
new file mode 100644
index 0000000..777d821
--- /dev/null
+++ b/bio/core/base.d
@@ -0,0 +1,268 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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'));
+}
diff --git a/bio/core/bgzf/block.d b/bio/core/bgzf/block.d
new file mode 100644
index 0000000..2253585
--- /dev/null
+++ b/bio/core/bgzf/block.d
@@ -0,0 +1,197 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2014 Artem Tarasov <lomereiter at gmail.com>
+
+ 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]);
+}
diff --git a/bio/core/bgzf/chunk.d b/bio/core/bgzf/chunk.d
new file mode 100644
index 0000000..529cc00
--- /dev/null
+++ b/bio/core/bgzf/chunk.d
@@ -0,0 +1,41 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+ }
+}
diff --git a/bio/core/bgzf/compress.d b/bio/core/bgzf/compress.d
new file mode 100644
index 0000000..5bf01ad
--- /dev/null
+++ b/bio/core/bgzf/compress.d
@@ -0,0 +1,113 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2014 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+}
diff --git a/bio/core/bgzf/constants.d b/bio/core/bgzf/constants.d
new file mode 100644
index 0000000..1985309
--- /dev/null
+++ b/bio/core/bgzf/constants.d
@@ -0,0 +1,61 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
diff --git a/bio/core/bgzf/inputstream.d b/bio/core/bgzf/inputstream.d
new file mode 100644
index 0000000..fa9548b
--- /dev/null
+++ b/bio/core/bgzf/inputstream.d
@@ -0,0 +1,522 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+ }
+}
diff --git a/bio/core/bgzf/outputstream.d b/bio/core/bgzf/outputstream.d
new file mode 100644
index 0000000..b9f3d07
--- /dev/null
+++ b/bio/core/bgzf/outputstream.d
@@ -0,0 +1,244 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+ }
+}
diff --git a/bio/core/bgzf/virtualoffset.d b/bio/core/bgzf/virtualoffset.d
new file mode 100644
index 0000000..7272827
--- /dev/null
+++ b/bio/core/bgzf/virtualoffset.d
@@ -0,0 +1,95 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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 "<coffset>/<uoffset>"
+ 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);
+}
diff --git a/bio/core/call.d b/bio/core/call.d
new file mode 100644
index 0000000..488a05c
--- /dev/null
+++ b/bio/core/call.d
@@ -0,0 +1,106 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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');
+}
diff --git a/bio/core/fasta.d b/bio/core/fasta.d
new file mode 100644
index 0000000..a1a8249
--- /dev/null
+++ b/bio/core/fasta.d
@@ -0,0 +1,52 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+}
diff --git a/bio/core/genotype.d b/bio/core/genotype.d
new file mode 100644
index 0000000..ac20143
--- /dev/null
+++ b/bio/core/genotype.d
@@ -0,0 +1,93 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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'))));
+}
diff --git a/bio/core/kmer.d b/bio/core/kmer.d
new file mode 100644
index 0000000..83111e6
--- /dev/null
+++ b/bio/core/kmer.d
@@ -0,0 +1,113 @@
+module 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);
+}
diff --git a/bio/core/region.d b/bio/core/region.d
new file mode 100644
index 0000000..d2589bc
--- /dev/null
+++ b/bio/core/region.d
@@ -0,0 +1,234 @@
+
+#line 1 "region.rl"
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+}
diff --git a/bio/core/sequence.d b/bio/core/sequence.d
new file mode 100644
index 0000000..b87b865
--- /dev/null
+++ b/bio/core/sequence.d
@@ -0,0 +1,230 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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));
+}
diff --git a/bio/core/tinymap.d b/bio/core/tinymap.d
new file mode 100644
index 0000000..718acf4
--- /dev/null
+++ b/bio/core/tinymap.d
@@ -0,0 +1,312 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+ }
+}
diff --git a/bio/core/utils/algo.d b/bio/core/utils/algo.d
new file mode 100644
index 0000000..1916dde
--- /dev/null
+++ b/bio/core/utils/algo.d
@@ -0,0 +1,162 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2014 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+}
diff --git a/bio/core/utils/bylinefast.d b/bio/core/utils/bylinefast.d
new file mode 100644
index 0000000..50fb756
--- /dev/null
+++ b/bio/core/utils/bylinefast.d
@@ -0,0 +1,142 @@
+/// 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();
+ }
+ }
+}
diff --git a/bio/core/utils/format.d b/bio/core/utils/format.d
new file mode 100644
index 0000000..ae8b4e6
--- /dev/null
+++ b/bio/core/utils/format.d
@@ -0,0 +1,312 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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); }
diff --git a/bio/core/utils/memoize.d b/bio/core/utils/memoize.d
new file mode 100644
index 0000000..81da494
--- /dev/null
+++ b/bio/core/utils/memoize.d
@@ -0,0 +1,272 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+}
diff --git a/bio/core/utils/outbuffer.d b/bio/core/utils/outbuffer.d
new file mode 100644
index 0000000..56c0879
--- /dev/null
+++ b/bio/core/utils/outbuffer.d
@@ -0,0 +1,108 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+ }
+}
diff --git a/bio/core/utils/range.d b/bio/core/utils/range.d
new file mode 100644
index 0000000..c3a2f45
--- /dev/null
+++ b/bio/core/utils/range.d
@@ -0,0 +1,280 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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]));
+}
diff --git a/bio/core/utils/roundbuf.d b/bio/core/utils/roundbuf.d
new file mode 100644
index 0000000..e319b75
--- /dev/null
+++ b/bio/core/utils/roundbuf.d
@@ -0,0 +1,102 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+}
diff --git a/bio/core/utils/stream.d b/bio/core/utils/stream.d
new file mode 100644
index 0000000..6c5146d
--- /dev/null
+++ b/bio/core/utils/stream.d
@@ -0,0 +1,167 @@
+module 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;
+ }
+}
diff --git a/bio/core/utils/switchendianness.d b/bio/core/utils/switchendianness.d
new file mode 100644
index 0000000..7b141cf
--- /dev/null
+++ b/bio/core/utils/switchendianness.d
@@ -0,0 +1,50 @@
+/**
+ (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);
+ }
+ }
+ }
+}
diff --git a/bio/core/utils/tmpfile.d b/bio/core/utils/tmpfile.d
new file mode 100644
index 0000000..c3f16e6
--- /dev/null
+++ b/bio/core/utils/tmpfile.d
@@ -0,0 +1,20 @@
+module 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;
+}
diff --git a/bio/core/utils/zlib.d b/bio/core/utils/zlib.d
new file mode 100644
index 0000000..c25d345
--- /dev/null
+++ b/bio/core/utils/zlib.d
@@ -0,0 +1,280 @@
+// 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));
+}
+
diff --git a/bio/maf/block.d b/bio/maf/block.d
new file mode 100644
index 0000000..5395e76
--- /dev/null
+++ b/bio/maf/block.d
@@ -0,0 +1,73 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+}
diff --git a/bio/maf/parser.d b/bio/maf/parser.d
new file mode 100644
index 0000000..4576c04
--- /dev/null
+++ b/bio/maf/parser.d
@@ -0,0 +1,827 @@
+module bio.maf.parser;
+#line 1 "maf_block.rl"
+/*
+ This file is part of BioD.
+ Copyright (C) 2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+}
diff --git a/bio/maf/reader.d b/bio/maf/reader.d
new file mode 100644
index 0000000..708c5b3
--- /dev/null
+++ b/bio/maf/reader.d
@@ -0,0 +1,105 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+ }
+}
diff --git a/bio/sam/header.d b/bio/sam/header.d
new file mode 100644
index 0000000..b6ec094
--- /dev/null
+++ b/bio/sam/header.d
@@ -0,0 +1,800 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2015 Artem Tarasov <lomereiter at gmail.com>
+
+ 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 at 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 at 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 at 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 at 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 at SQ\tSN:yay\tLN:111\n at 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 at CO\tthis is a comment\n");
+}
diff --git a/bio/sam/reader.d b/bio/sam/reader.d
new file mode 100644
index 0000000..e7724ed
--- /dev/null
+++ b/bio/sam/reader.d
@@ -0,0 +1,222 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+ }
+ }
+}
diff --git a/bio/sam/utils/fastrecordparser.d b/bio/sam/utils/fastrecordparser.d
new file mode 100644
index 0000000..04c8faf
--- /dev/null
+++ b/bio/sam/utils/fastrecordparser.d
@@ -0,0 +1,4711 @@
+module bio.sam.utils.fastrecordparser;
+
+#line 1 "sam_alignment.rl"
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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\ [...]
+
+ 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);
+}
diff --git a/bio/sam/utils/recordparser.d b/bio/sam/utils/recordparser.d
new file mode 100644
index 0000000..2b38044
--- /dev/null
+++ b/bio/sam/utils/recordparser.d
@@ -0,0 +1,1457 @@
+module bio.sam.utils.recordparser;
+
+#line 1 "sam_alignment.rl"
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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\ [...]
+
+ 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);
+}
diff --git a/bio/sff/constants.d b/bio/sff/constants.d
new file mode 100644
index 0000000..15e2a4e
--- /dev/null
+++ b/bio/sff/constants.d
@@ -0,0 +1,5 @@
+module bio.sff.constants;
+
+immutable SFF_MAGIC = 0x2E736666;
+
+immutable char[4] SFF_VERSION = [0, 0, 0, 1];
diff --git a/bio/sff/index.d b/bio/sff/index.d
new file mode 100644
index 0000000..c6dadcd
--- /dev/null
+++ b/bio/sff/index.d
@@ -0,0 +1,6 @@
+module bio.sff.index;
+
+struct IndexLocation {
+ ulong offset;
+ uint length;
+}
diff --git a/bio/sff/read.d b/bio/sff/read.d
new file mode 100644
index 0000000..d4ea996
--- /dev/null
+++ b/bio/sff/read.d
@@ -0,0 +1,26 @@
+module 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;
+}
diff --git a/bio/sff/reader.d b/bio/sff/reader.d
new file mode 100644
index 0000000..d0c21a2
--- /dev/null
+++ b/bio/sff/reader.d
@@ -0,0 +1,152 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+ }
+ }
+}
diff --git a/bio/sff/readrange.d b/bio/sff/readrange.d
new file mode 100644
index 0000000..eda29d3
--- /dev/null
+++ b/bio/sff/readrange.d
@@ -0,0 +1,128 @@
+module 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();
+ }
+}
diff --git a/bio/sff/utils/roundup.d b/bio/sff/utils/roundup.d
new file mode 100644
index 0000000..8b84230
--- /dev/null
+++ b/bio/sff/utils/roundup.d
@@ -0,0 +1,13 @@
+module 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));
+}
diff --git a/bio/sff/writer.d b/bio/sff/writer.d
new file mode 100644
index 0000000..7937d79
--- /dev/null
+++ b/bio/sff/writer.d
@@ -0,0 +1,116 @@
+module 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;
+ }
+ }
+}
diff --git a/dub.json b/dub.json
new file mode 100644
index 0000000..ec26904
--- /dev/null
+++ b/dub.json
@@ -0,0 +1,12 @@
+{
+ "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"]
+}
diff --git a/examples/calculate_gc_content_from_reference.d b/examples/calculate_gc_content_from_reference.d
new file mode 100644
index 0000000..5b97af5
--- /dev/null
+++ b/examples/calculate_gc_content_from_reference.d
@@ -0,0 +1,35 @@
+// 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");
+}
diff --git a/examples/create_bam_from_scratch.d b/examples/create_bam_from_scratch.d
new file mode 100644
index 0000000..ad6053a
--- /dev/null
+++ b/examples/create_bam_from_scratch.d
@@ -0,0 +1,38 @@
+// 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
+}
diff --git a/examples/iterate_tags.d b/examples/iterate_tags.d
new file mode 100644
index 0000000..8883a3e
--- /dev/null
+++ b/examples/iterate_tags.d
@@ -0,0 +1,42 @@
+// 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);
+}
diff --git a/examples/make_pileup.d b/examples/make_pileup.d
new file mode 100644
index 0000000..bf57643
--- /dev/null
+++ b/examples/make_pileup.d
@@ -0,0 +1,28 @@
+// 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));
+}
diff --git a/examples/print_base_info.d b/examples/print_base_info.d
new file mode 100644
index 0000000..31c0bb2
--- /dev/null
+++ b/examples/print_base_info.d
@@ -0,0 +1,36 @@
+// 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
+ }
+}
diff --git a/examples/read_bam_file.d b/examples/read_bam_file.d
new file mode 100644
index 0000000..aa823de
--- /dev/null
+++ b/examples/read_bam_file.d
@@ -0,0 +1,37 @@
+// 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);
+ }
+ }
+}
diff --git a/examples/transverse_multiple_bam_files.d b/examples/transverse_multiple_bam_files.d
new file mode 100644
index 0000000..655623b
--- /dev/null
+++ b/examples/transverse_multiple_bam_files.d
@@ -0,0 +1,32 @@
+// 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)());
+ }
+}
diff --git a/src_ragel/Makefile b/src_ragel/Makefile
new file mode 100644
index 0000000..5a59bf6
--- /dev/null
+++ b/src_ragel/Makefile
@@ -0,0 +1,28 @@
+all: 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
diff --git a/src_ragel/maf_block.rl b/src_ragel/maf_block.rl
new file mode 100644
index 0000000..31a0599
--- /dev/null
+++ b/src_ragel/maf_block.rl
@@ -0,0 +1,153 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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;
+}
diff --git a/src_ragel/region.rl b/src_ragel/region.rl
new file mode 100644
index 0000000..f18749c
--- /dev/null
+++ b/src_ragel/region.rl
@@ -0,0 +1,86 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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);
+}
diff --git a/src_ragel/sam_alignment.rl b/src_ragel/sam_alignment.rl
new file mode 100644
index 0000000..8e39aeb
--- /dev/null
+++ b/src_ragel/sam_alignment.rl
@@ -0,0 +1,524 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012 Artem Tarasov <lomereiter at gmail.com>
+
+ 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\ [...]
+
+ 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);
+}
diff --git a/src_ragel/workarounds/fix_static_const.sh b/src_ragel/workarounds/fix_static_const.sh
new file mode 100755
index 0000000..053d86a
--- /dev/null
+++ b/src_ragel/workarounds/fix_static_const.sh
@@ -0,0 +1,6 @@
+#!/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
diff --git a/src_ragel/workarounds/fix_switch_case_fallthrough.sh b/src_ragel/workarounds/fix_switch_case_fallthrough.sh
new file mode 100755
index 0000000..fb8bc32
--- /dev/null
+++ b/src_ragel/workarounds/fix_switch_case_fallthrough.sh
@@ -0,0 +1,6 @@
+#!/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
diff --git a/test/data/b.sam b/test/data/b.sam
new file mode 100644
index 0000000..e7108a4
--- /dev/null
+++ b/test/data/b.sam
@@ -0,0 +1,3993 @@
+ at SQ SN:KI519610.1 LN:7371162
+ at SQ SN:KI519611.1 LN:6947489
+ at SQ SN:KI519612.1 LN:6918293
+ at SQ SN:KI519613.1 LN:6837434
+ at SQ SN:KI519614.1 LN:6763396
+ at SQ SN:KI519615.1 LN:6332452
+ at SQ SN:KI519616.1 LN:6276451
+ at SQ SN:KI519617.1 LN:5572511
+ at SQ SN:KI519618.1 LN:5495115
+ at SQ SN:KI519619.1 LN:5440583
+ at SQ SN:KI519621.1 LN:5070431
+ at SQ SN:KI519620.1 LN:4922413
+ at SQ SN:KI519622.1 LN:4748392
+ at SQ SN:KI519623.1 LN:4655775
+ at SQ SN:KI519624.1 LN:4650977
+ at SQ SN:KI519625.1 LN:4509838
+ at SQ SN:KI519626.1 LN:4499790
+ at SQ SN:KI519627.1 LN:4428330
+ at SQ SN:KI519628.1 LN:4296375
+ at SQ SN:KI519629.1 LN:4196014
+ at SQ SN:KI519630.1 LN:4187583
+ at SQ SN:KI519631.1 LN:4020106
+ at SQ SN:KI519636.1 LN:3829262
+ at SQ SN:KI519635.1 LN:3790307
+ at SQ SN:KI519637.1 LN:3779408
+ at SQ SN:KI519638.1 LN:3737520
+ at SQ SN:KI519639.1 LN:3697357
+ at SQ SN:KI519640.1 LN:3625908
+ at SQ SN:KI519641.1 LN:3524602
+ at SQ SN:KI519642.1 LN:3520658
+ at SQ SN:KI519646.1 LN:3472673
+ at SQ SN:KI519647.1 LN:3433689
+ at SQ SN:KI519645.1 LN:3399124
+ at SQ SN:KI519643.1 LN:3391058
+ at SQ SN:KI519644.1 LN:3353568
+ at SQ SN:KI519649.1 LN:3348245
+ at SQ SN:KI519648.1 LN:3324142
+ at SQ SN:KI519650.1 LN:3294432
+ at SQ SN:KI519652.1 LN:3075602
+ at SQ SN:KI519651.1 LN:3028220
+ at SQ SN:KI519655.1 LN:2996542
+ at SQ SN:KI519657.1 LN:2978479
+ at SQ SN:KI519654.1 LN:2964381
+ at SQ SN:KI519653.1 LN:2941644
+ at SQ SN:KI519658.1 LN:2911915
+ at SQ SN:KI519656.1 LN:2866051
+ at SQ SN:KI519665.1 LN:2802555
+ at SQ SN:KI519664.1 LN:2768972
+ at SQ SN:KI519666.1 LN:2756912
+ at SQ SN:KI519662.1 LN:2746655
+ at SQ SN:KI519671.1 LN:2736407
+ at SQ SN:KI519663.1 LN:2732034
+ at SQ SN:KI519667.1 LN:2700494
+ at SQ SN:KI519670.1 LN:2693619
+ at SQ SN:KI519675.1 LN:2689749
+ at SQ SN:KI519682.1 LN:2678482
+ at SQ SN:KI519673.1 LN:2651320
+ at SQ SN:KI519676.1 LN:2644023
+ at SQ SN:KI519672.1 LN:2625533
+ at SQ SN:KI519674.1 LN:2603862
+ at SQ SN:KI519677.1 LN:2562819
+ at SQ SN:KI519681.1 LN:2559699
+ at SQ SN:KI519678.1 LN:2541669
+ at SQ SN:KI519679.1 LN:2523309
+ at SQ SN:KI519680.1 LN:2496394
+ at SQ SN:KI519683.1 LN:2468174
+ at SQ SN:KI519689.1 LN:2412920
+ at SQ SN:KI519687.1 LN:2406367
+ at SQ SN:KI519688.1 LN:2395390
+ at SQ SN:KI519690.1 LN:2380662
+ at SQ SN:KI519691.1 LN:2326230
+ at SQ SN:KI519632.1 LN:2315295
+ at SQ SN:KI519692.1 LN:2283808
+ at SQ SN:KI519702.1 LN:2237016
+ at SQ SN:KI519693.1 LN:2236488
+ at SQ SN:KI519701.1 LN:2222512
+ at SQ SN:KI519694.1 LN:2205101
+ at SQ SN:KI519706.1 LN:2179591
+ at SQ SN:KI519698.1 LN:2176608
+ at SQ SN:KI519699.1 LN:2166626
+ at SQ SN:KI519704.1 LN:2160866
+ at SQ SN:KI519700.1 LN:2154442
+ at SQ SN:KI519713.1 LN:2131986
+ at SQ SN:KI519703.1 LN:2131553
+ at SQ SN:KI519710.1 LN:2127424
+ at SQ SN:KI519707.1 LN:2113952
+ at SQ SN:KI519709.1 LN:2099011
+ at SQ SN:KI519705.1 LN:2098595
+ at SQ SN:KI519708.1 LN:2070844
+ at SQ SN:KI519717.1 LN:2040063
+ at SQ SN:KI519716.1 LN:2009684
+ at SQ SN:KI519715.1 LN:2002839
+ at SQ SN:KI519714.1 LN:1989185
+ at SQ SN:KI519722.1 LN:1963560
+ at SQ SN:KI519721.1 LN:1926226
+ at SQ SN:KI519723.1 LN:1907358
+ at SQ SN:KI519727.1 LN:1906830
+ at SQ SN:KI519724.1 LN:1906291
+ at SQ SN:KI519726.1 LN:1889071
+ at SQ SN:KI519725.1 LN:1864432
+ at SQ SN:KI519731.1 LN:1861053
+ at SQ SN:KI519728.1 LN:1811343
+ at SQ SN:KI519669.1 LN:1811098
+ at SQ SN:KI519729.1 LN:1799720
+ at SQ SN:KI519738.1 LN:1792795
+ at SQ SN:KI519732.1 LN:1786033
+ at SQ SN:KI519746.1 LN:1784876
+ at SQ SN:KI519733.1 LN:1781427
+ at SQ SN:KI519734.1 LN:1781272
+ at SQ SN:KI519730.1 LN:1775154
+ at SQ SN:KI519744.1 LN:1739180
+ at SQ SN:KI519737.1 LN:1731755
+ at SQ SN:KI519741.1 LN:1710938
+ at SQ SN:KI519740.1 LN:1703701
+ at SQ SN:KI519739.1 LN:1695159
+ at SQ SN:KI519743.1 LN:1683997
+ at SQ SN:KI519742.1 LN:1677075
+ at SQ SN:KI519752.1 LN:1672257
+ at SQ SN:KI519751.1 LN:1652273
+ at SQ SN:KI519745.1 LN:1644723
+ at SQ SN:KI519754.1 LN:1626270
+ at SQ SN:KI519749.1 LN:1619037
+ at SQ SN:KI519764.1 LN:1614693
+ at SQ SN:KI519753.1 LN:1613567
+ at SQ SN:KI519757.1 LN:1605941
+ at SQ SN:KI519750.1 LN:1604880
+ at SQ SN:KI519755.1 LN:1599760
+ at SQ SN:KI519759.1 LN:1588068
+ at SQ SN:KI519768.1 LN:1584072
+ at SQ SN:KI519756.1 LN:1574226
+ at SQ SN:KI519758.1 LN:1566783
+ at SQ SN:KI519794.1 LN:1557440
+ at SQ SN:KI519760.1 LN:1555868
+ at SQ SN:KI519659.1 LN:1552333
+ at SQ SN:KI519762.1 LN:1538851
+ at SQ SN:KI519761.1 LN:1531781
+ at SQ SN:KI519763.1 LN:1530583
+ at SQ SN:KI519780.1 LN:1498556
+ at SQ SN:KI519765.1 LN:1489811
+ at SQ SN:KI519766.1 LN:1480175
+ at SQ SN:KI519778.1 LN:1474717
+ at SQ SN:KI519767.1 LN:1467576
+ at SQ SN:KI519696.1 LN:1461874
+ at SQ SN:KI519785.1 LN:1459804
+ at SQ SN:KI519782.1 LN:1450754
+ at SQ SN:KI519777.1 LN:1448886
+ at SQ SN:KI519770.1 LN:1445858
+ at SQ SN:KI519769.1 LN:1444509
+ at SQ SN:KI519789.1 LN:1434793
+ at SQ SN:KI519774.1 LN:1425059
+ at SQ SN:KI519781.1 LN:1417595
+ at SQ SN:KI519779.1 LN:1396063
+ at SQ SN:KI519783.1 LN:1395917
+ at SQ SN:KI519784.1 LN:1392090
+ at SQ SN:KI519712.1 LN:1390571
+ at SQ SN:KI519748.1 LN:1388881
+ at SQ SN:KI519718.1 LN:1388505
+ at SQ SN:KI519792.1 LN:1386350
+ at SQ SN:KI519793.1 LN:1361616
+ at SQ SN:KI519788.1 LN:1337905
+ at SQ SN:KI519799.1 LN:1334890
+ at SQ SN:KI519684.1 LN:1306545
+ at SQ SN:KI519795.1 LN:1300078
+ at SQ SN:KI519796.1 LN:1286892
+ at SQ SN:KI519828.1 LN:1274659
+ at SQ SN:KI519797.1 LN:1259385
+ at SQ SN:KI519807.1 LN:1258761
+ at SQ SN:KI519802.1 LN:1257344
+ at SQ SN:KI519800.1 LN:1256563
+ at SQ SN:KI519810.1 LN:1255825
+ at SQ SN:KI519798.1 LN:1254985
+ at SQ SN:KI519803.1 LN:1248170
+ at SQ SN:KI519808.1 LN:1247848
+ at SQ SN:KI519801.1 LN:1244885
+ at SQ SN:KI519811.1 LN:1224301
+ at SQ SN:KI519634.1 LN:1219852
+ at SQ SN:KI519813.1 LN:1205613
+ at SQ SN:KI519809.1 LN:1205357
+ at SQ SN:KI519817.1 LN:1186184
+ at SQ SN:KI519816.1 LN:1186110
+ at SQ SN:KI519812.1 LN:1185550
+ at SQ SN:KI519815.1 LN:1178258
+ at SQ SN:KI519814.1 LN:1173082
+ at SQ SN:KI519818.1 LN:1172663
+ at SQ SN:KI519826.1 LN:1170828
+ at SQ SN:KI519827.1 LN:1157162
+ at SQ SN:KI519822.1 LN:1142353
+ at SQ SN:KI519839.1 LN:1138628
+ at SQ SN:KI519824.1 LN:1137989
+ at SQ SN:KI519830.1 LN:1135900
+ at SQ SN:KI519819.1 LN:1132448
+ at SQ SN:KI519820.1 LN:1125946
+ at SQ SN:KI519821.1 LN:1124386
+ at SQ SN:KI519823.1 LN:1109832
+ at SQ SN:KI519829.1 LN:1095521
+ at SQ SN:KI519825.1 LN:1092861
+ at SQ SN:KI519831.1 LN:1063445
+ at SQ SN:KI519838.1 LN:1060955
+ at SQ SN:KI519875.1 LN:1059628
+ at SQ SN:KI519861.1 LN:1059351
+ at SQ SN:KI519846.1 LN:1059277
+ at SQ SN:KI519840.1 LN:1054501
+ at SQ SN:KI519851.1 LN:1050102
+ at SQ SN:KI519843.1 LN:1038444
+ at SQ SN:KI519850.1 LN:1038069
+ at SQ SN:KI519842.1 LN:1037213
+ at SQ SN:KI519844.1 LN:1037165
+ at SQ SN:KI519661.1 LN:1022744
+ at SQ SN:KI519787.1 LN:1016951
+ at SQ SN:KI519849.1 LN:1015261
+ at SQ SN:KI519872.1 LN:1015164
+ at SQ SN:KI519847.1 LN:1013289
+ at SQ SN:KI519841.1 LN:1012499
+ at SQ SN:KI519845.1 LN:1003796
+ at SQ SN:KI519848.1 LN:995373
+ at SQ SN:KI519852.1 LN:974716
+ at SQ SN:KI519855.1 LN:970463
+ at SQ SN:KI519911.1 LN:968941
+ at SQ SN:KI519736.1 LN:967356
+ at SQ SN:KI519853.1 LN:965584
+ at SQ SN:KI519860.1 LN:964003
+ at SQ SN:KI519854.1 LN:963790
+ at SQ SN:KI519871.1 LN:959082
+ at SQ SN:KI519856.1 LN:958155
+ at SQ SN:KI519865.1 LN:956798
+ at SQ SN:KI519862.1 LN:951962
+ at SQ SN:KI519866.1 LN:950557
+ at SQ SN:KI519790.1 LN:941629
+ at SQ SN:KI519868.1 LN:938526
+ at SQ SN:KI519874.1 LN:933200
+ at SQ SN:KI519889.1 LN:929221
+ at SQ SN:KI519834.1 LN:925248
+ at SQ SN:KI519864.1 LN:922375
+ at SQ SN:KI519867.1 LN:921651
+ at SQ SN:KI519863.1 LN:920975
+ at SQ SN:KI519869.1 LN:914213
+ at SQ SN:KI519870.1 LN:912190
+ at SQ SN:KI519873.1 LN:910789
+ at SQ SN:KI519882.1 LN:902355
+ at SQ SN:KI519886.1 LN:900483
+ at SQ SN:KI519879.1 LN:894957
+ at SQ SN:KI519878.1 LN:891046
+ at SQ SN:KI519880.1 LN:890306
+ at SQ SN:KI519909.1 LN:884389
+ at SQ SN:KI519907.1 LN:883781
+ at SQ SN:KI519933.1 LN:882922
+ at SQ SN:KI519888.1 LN:875738
+ at SQ SN:KI519881.1 LN:874553
+ at SQ SN:KI519883.1 LN:873715
+ at SQ SN:KI519884.1 LN:870982
+ at SQ SN:KI519668.1 LN:869747
+ at SQ SN:KI519885.1 LN:869286
+ at SQ SN:KI519887.1 LN:864056
+ at SQ SN:KI519898.1 LN:863864
+ at SQ SN:KI519904.1 LN:853971
+ at SQ SN:KI519890.1 LN:852193
+ at SQ SN:KI519910.1 LN:849445
+ at SQ SN:KI519806.1 LN:848400
+ at SQ SN:KI519891.1 LN:842662
+ at SQ SN:KI519892.1 LN:827976
+ at SQ SN:KI519895.1 LN:822168
+ at SQ SN:KI519897.1 LN:822165
+ at SQ SN:KI519894.1 LN:818708
+ at SQ SN:KI519899.1 LN:813829
+ at SQ SN:KI519893.1 LN:812624
+ at SQ SN:KI519902.1 LN:807081
+ at SQ SN:KI519906.1 LN:803884
+ at SQ SN:KI519896.1 LN:797563
+ at SQ SN:KI519901.1 LN:796020
+ at SQ SN:KI519914.1 LN:788024
+ at SQ SN:KI519735.1 LN:785736
+ at SQ SN:KI519912.1 LN:778065
+ at SQ SN:KI519918.1 LN:777749
+ at SQ SN:KI519903.1 LN:775132
+ at SQ SN:KI519908.1 LN:771799
+ at SQ SN:KI519900.1 LN:771364
+ at SQ SN:KI519965.1 LN:771059
+ at SQ SN:KI519905.1 LN:767762
+ at SQ SN:KI519917.1 LN:765758
+ at SQ SN:KI519927.1 LN:761915
+ at SQ SN:KI519775.1 LN:760855
+ at SQ SN:KI519928.1 LN:759973
+ at SQ SN:KI519711.1 LN:755634
+ at SQ SN:KI519949.1 LN:754338
+ at SQ SN:KI519922.1 LN:754001
+ at SQ SN:KI519913.1 LN:753778
+ at SQ SN:KI519915.1 LN:752597
+ at SQ SN:KI519920.1 LN:749598
+ at SQ SN:KI519938.1 LN:745602
+ at SQ SN:KI519919.1 LN:742264
+ at SQ SN:KI519929.1 LN:738552
+ at SQ SN:KI519962.1 LN:735966
+ at SQ SN:KI519916.1 LN:735135
+ at SQ SN:KI519930.1 LN:726307
+ at SQ SN:KI519921.1 LN:726227
+ at SQ SN:KI519773.1 LN:719481
+ at SQ SN:KI519953.1 LN:716867
+ at SQ SN:KI519932.1 LN:707630
+ at SQ SN:KI519940.1 LN:705928
+ at SQ SN:KI519939.1 LN:700049
+ at SQ SN:KI519931.1 LN:696527
+ at SQ SN:KI519948.1 LN:691795
+ at SQ SN:KI519954.1 LN:691586
+ at SQ SN:KI519961.1 LN:687448
+ at SQ SN:KI519951.1 LN:685491
+ at SQ SN:KI519943.1 LN:684417
+ at SQ SN:KI519941.1 LN:678485
+ at SQ SN:KI519942.1 LN:672617
+ at SQ SN:KI519947.1 LN:668769
+ at SQ SN:KI519956.1 LN:664594
+ at SQ SN:KI519944.1 LN:664082
+ at SQ SN:KI519832.1 LN:662663
+ at SQ SN:KI519989.1 LN:662588
+ at SQ SN:KI519946.1 LN:660346
+ at SQ SN:KI519950.1 LN:659193
+ at SQ SN:KI519945.1 LN:658969
+ at SQ SN:KI519955.1 LN:654438
+ at SQ SN:KI519952.1 LN:653361
+ at SQ SN:KI519960.1 LN:642004
+ at SQ SN:KI519958.1 LN:638882
+ at SQ SN:KI519971.1 LN:633982
+ at SQ SN:KI519957.1 LN:630528
+ at SQ SN:KI519988.1 LN:627464
+ at SQ SN:KI520029.1 LN:626045
+ at SQ SN:KI519959.1 LN:625887
+ at SQ SN:KI519970.1 LN:622852
+ at SQ SN:KI519966.1 LN:619930
+ at SQ SN:KI519963.1 LN:609584
+ at SQ SN:KI519978.1 LN:607914
+ at SQ SN:KI519984.1 LN:605445
+ at SQ SN:KI519964.1 LN:603058
+ at SQ SN:KI519968.1 LN:602535
+ at SQ SN:KI519975.1 LN:600300
+ at SQ SN:KI519967.1 LN:596463
+ at SQ SN:KI519974.1 LN:588339
+ at SQ SN:KI519969.1 LN:583331
+ at SQ SN:KI519992.1 LN:581546
+ at SQ SN:KI519977.1 LN:579885
+ at SQ SN:KI520006.1 LN:576246
+ at SQ SN:KI519986.1 LN:575316
+ at SQ SN:KI519972.1 LN:571581
+ at SQ SN:KI519980.1 LN:568648
+ at SQ SN:KI519973.1 LN:568369
+ at SQ SN:KI519981.1 LN:566801
+ at SQ SN:KI519996.1 LN:565380
+ at SQ SN:KI519991.1 LN:563587
+ at SQ SN:KI519998.1 LN:560316
+ at SQ SN:KI519976.1 LN:559898
+ at SQ SN:KI519982.1 LN:559835
+ at SQ SN:KI519995.1 LN:559258
+ at SQ SN:KI519985.1 LN:557415
+ at SQ SN:KI519979.1 LN:555766
+ at SQ SN:KI520014.1 LN:553579
+ at SQ SN:KI520020.1 LN:549452
+ at SQ SN:KI519983.1 LN:547823
+ at SQ SN:KI520035.1 LN:543115
+ at SQ SN:KI519994.1 LN:543031
+ at SQ SN:KI519990.1 LN:540785
+ at SQ SN:KI520004.1 LN:535403
+ at SQ SN:KI520008.1 LN:534882
+ at SQ SN:KI520009.1 LN:534642
+ at SQ SN:KI519987.1 LN:532583
+ at SQ SN:KI519993.1 LN:530512
+ at SQ SN:KI520010.1 LN:529360
+ at SQ SN:KI520001.1 LN:529284
+ at SQ SN:KI520007.1 LN:528357
+ at SQ SN:KI520000.1 LN:525057
+ at SQ SN:KI519877.1 LN:523006
+ at SQ SN:KI520032.1 LN:522705
+ at SQ SN:KI519999.1 LN:521480
+ at SQ SN:KI520034.1 LN:520491
+ at SQ SN:KI520043.1 LN:519751
+ at SQ SN:KI519836.1 LN:518977
+ at SQ SN:KI519997.1 LN:518452
+ at SQ SN:KI519695.1 LN:518063
+ at SQ SN:KI519685.1 LN:514431
+ at SQ SN:KI520018.1 LN:509616
+ at SQ SN:KI520005.1 LN:507319
+ at SQ SN:KI520030.1 LN:507239
+ at SQ SN:KI520021.1 LN:506354
+ at SQ SN:KI520039.1 LN:506306
+ at SQ SN:KI519937.1 LN:505706
+ at SQ SN:KI520051.1 LN:505600
+ at SQ SN:KI520013.1 LN:505209
+ at SQ SN:KI520087.1 LN:504423
+ at SQ SN:KI520012.1 LN:502706
+ at SQ SN:KI520016.1 LN:502101
+ at SQ SN:KI520003.1 LN:493858
+ at SQ SN:KI520002.1 LN:493657
+ at SQ SN:KI520011.1 LN:482030
+ at SQ SN:KI519935.1 LN:480924
+ at SQ SN:KI520019.1 LN:476917
+ at SQ SN:KI519857.1 LN:474583
+ at SQ SN:KI520015.1 LN:473372
+ at SQ SN:KI520027.1 LN:473005
+ at SQ SN:KI520022.1 LN:470305
+ at SQ SN:KI520024.1 LN:468697
+ at SQ SN:KI520017.1 LN:466971
+ at SQ SN:KI520026.1 LN:465720
+ at SQ SN:KI520023.1 LN:463412
+ at SQ SN:KI520059.1 LN:458122
+ at SQ SN:KI520028.1 LN:454640
+ at SQ SN:KI520045.1 LN:454046
+ at SQ SN:KI520083.1 LN:453176
+ at SQ SN:KI520070.1 LN:452620
+ at SQ SN:KI520031.1 LN:450924
+ at SQ SN:KI520025.1 LN:450637
+ at SQ SN:KI520038.1 LN:448234
+ at SQ SN:KI520062.1 LN:447699
+ at SQ SN:KI520033.1 LN:447587
+ at SQ SN:KI520080.1 LN:447015
+ at SQ SN:KI520037.1 LN:446940
+ at SQ SN:KI520041.1 LN:446192
+ at SQ SN:KI520085.1 LN:440649
+ at SQ SN:KI520081.1 LN:439641
+ at SQ SN:KI519786.1 LN:439226
+ at SQ SN:KI520050.1 LN:437507
+ at SQ SN:KI520048.1 LN:437292
+ at SQ SN:KI520036.1 LN:435694
+ at SQ SN:KI520058.1 LN:435626
+ at SQ SN:KI520046.1 LN:434190
+ at SQ SN:KI520065.1 LN:430277
+ at SQ SN:KI520057.1 LN:429902
+ at SQ SN:KI519776.1 LN:427902
+ at SQ SN:KI520113.1 LN:427709
+ at SQ SN:KI520040.1 LN:427024
+ at SQ SN:KI519837.1 LN:426656
+ at SQ SN:KI520068.1 LN:425765
+ at SQ SN:KI520074.1 LN:423533
+ at SQ SN:KI520076.1 LN:423323
+ at SQ SN:KI520082.1 LN:422639
+ at SQ SN:KI520044.1 LN:422061
+ at SQ SN:KI520042.1 LN:419721
+ at SQ SN:KI520079.1 LN:419275
+ at SQ SN:KI520061.1 LN:417825
+ at SQ SN:KI520056.1 LN:417084
+ at SQ SN:KI520047.1 LN:415443
+ at SQ SN:KI520090.1 LN:413523
+ at SQ SN:KI520049.1 LN:412000
+ at SQ SN:KI520066.1 LN:410900
+ at SQ SN:KI520060.1 LN:409490
+ at SQ SN:KI520054.1 LN:409435
+ at SQ SN:KI520052.1 LN:408866
+ at SQ SN:KI520063.1 LN:407519
+ at SQ SN:KI520091.1 LN:407022
+ at SQ SN:KI520053.1 LN:406309
+ at SQ SN:KI520172.1 LN:404925
+ at SQ SN:KI520115.1 LN:404264
+ at SQ SN:KI520055.1 LN:403415
+ at SQ SN:KI520103.1 LN:400728
+ at SQ SN:KI519876.1 LN:398940
+ at SQ SN:KI520069.1 LN:398684
+ at SQ SN:KI520077.1 LN:397753
+ at SQ SN:KI519719.1 LN:396053
+ at SQ SN:KI520067.1 LN:395666
+ at SQ SN:KI520089.1 LN:389347
+ at SQ SN:KI520064.1 LN:388264
+ at SQ SN:KI520118.1 LN:387933
+ at SQ SN:KI520084.1 LN:384971
+ at SQ SN:KI520128.1 LN:384735
+ at SQ SN:KI520073.1 LN:382847
+ at SQ SN:KI520092.1 LN:382578
+ at SQ SN:KI520072.1 LN:382531
+ at SQ SN:KI520097.1 LN:382298
+ at SQ SN:KI520095.1 LN:381882
+ at SQ SN:KI520100.1 LN:381356
+ at SQ SN:KI520071.1 LN:380422
+ at SQ SN:KI520126.1 LN:378002
+ at SQ SN:KI520102.1 LN:377144
+ at SQ SN:KI520078.1 LN:377084
+ at SQ SN:KI520088.1 LN:376007
+ at SQ SN:KI520075.1 LN:375669
+ at SQ SN:KI520110.1 LN:375366
+ at SQ SN:KI520086.1 LN:375081
+ at SQ SN:KI520108.1 LN:374458
+ at SQ SN:KI519791.1 LN:373509
+ at SQ SN:KI520101.1 LN:372465
+ at SQ SN:KI520116.1 LN:371853
+ at SQ SN:KI520122.1 LN:370636
+ at SQ SN:KI519923.1 LN:368044
+ at SQ SN:KI520131.1 LN:365234
+ at SQ SN:KI520109.1 LN:364701
+ at SQ SN:KI520107.1 LN:362761
+ at SQ SN:KI520094.1 LN:361044
+ at SQ SN:KI520093.1 LN:357061
+ at SQ SN:KI520137.1 LN:355941
+ at SQ SN:KI520099.1 LN:355574
+ at SQ SN:KI520129.1 LN:355473
+ at SQ SN:KI520098.1 LN:352742
+ at SQ SN:KI520164.1 LN:352441
+ at SQ SN:KI520121.1 LN:351959
+ at SQ SN:KI520174.1 LN:351136
+ at SQ SN:KI520139.1 LN:350348
+ at SQ SN:KI520127.1 LN:349287
+ at SQ SN:KI520142.1 LN:348601
+ at SQ SN:KI519924.1 LN:348421
+ at SQ SN:KI520114.1 LN:347693
+ at SQ SN:KI520112.1 LN:347396
+ at SQ SN:KI520156.1 LN:346606
+ at SQ SN:KI520105.1 LN:346576
+ at SQ SN:KI520096.1 LN:344468
+ at SQ SN:KI520153.1 LN:342675
+ at SQ SN:KI520157.1 LN:338025
+ at SQ SN:KI520170.1 LN:336371
+ at SQ SN:KI520140.1 LN:336194
+ at SQ SN:KI520104.1 LN:335012
+ at SQ SN:KI520106.1 LN:333405
+ at SQ SN:KI520141.1 LN:326349
+ at SQ SN:KI520162.1 LN:324406
+ at SQ SN:KI520111.1 LN:322854
+ at SQ SN:KI519833.1 LN:319746
+ at SQ SN:KI520119.1 LN:319101
+ at SQ SN:KI519771.1 LN:317676
+ at SQ SN:KI520117.1 LN:317542
+ at SQ SN:KI520173.1 LN:317477
+ at SQ SN:KI520145.1 LN:313854
+ at SQ SN:KI520143.1 LN:313238
+ at SQ SN:KI520205.1 LN:313058
+ at SQ SN:KI520130.1 LN:312863
+ at SQ SN:KI520120.1 LN:311908
+ at SQ SN:KI520151.1 LN:310662
+ at SQ SN:KI520124.1 LN:310103
+ at SQ SN:KI520154.1 LN:309997
+ at SQ SN:KI520123.1 LN:309176
+ at SQ SN:KI519925.1 LN:309090
+ at SQ SN:KI520147.1 LN:309081
+ at SQ SN:KI520125.1 LN:308575
+ at SQ SN:KI520133.1 LN:300920
+ at SQ SN:KI520180.1 LN:299290
+ at SQ SN:KI520203.1 LN:299269
+ at SQ SN:KI520132.1 LN:298778
+ at SQ SN:KI520158.1 LN:295424
+ at SQ SN:KI520194.1 LN:295397
+ at SQ SN:KI520134.1 LN:291763
+ at SQ SN:KI520179.1 LN:291680
+ at SQ SN:KI520135.1 LN:291595
+ at SQ SN:KI520136.1 LN:290460
+ at SQ SN:KI520138.1 LN:289575
+ at SQ SN:KI520169.1 LN:289567
+ at SQ SN:KI520171.1 LN:288891
+ at SQ SN:KI520233.1 LN:288862
+ at SQ SN:KI520176.1 LN:287470
+ at SQ SN:KI520187.1 LN:286838
+ at SQ SN:KI520183.1 LN:286128
+ at SQ SN:KI520167.1 LN:284188
+ at SQ SN:KI520234.1 LN:282972
+ at SQ SN:KI520144.1 LN:281831
+ at SQ SN:KI520168.1 LN:281631
+ at SQ SN:KI520148.1 LN:281439
+ at SQ SN:KI520146.1 LN:280126
+ at SQ SN:KI520216.1 LN:279272
+ at SQ SN:KI520166.1 LN:279222
+ at SQ SN:KI520160.1 LN:278575
+ at SQ SN:KI520149.1 LN:278352
+ at SQ SN:KI520165.1 LN:276949
+ at SQ SN:KI520152.1 LN:275923
+ at SQ SN:KI520150.1 LN:275635
+ at SQ SN:KI520159.1 LN:274370
+ at SQ SN:KI520155.1 LN:274014
+ at SQ SN:KI519926.1 LN:273463
+ at SQ SN:KI520188.1 LN:272857
+ at SQ SN:KI519747.1 LN:272820
+ at SQ SN:KI520211.1 LN:271927
+ at SQ SN:KI520241.1 LN:271584
+ at SQ SN:KI520163.1 LN:271045
+ at SQ SN:KI520161.1 LN:270610
+ at SQ SN:KI520182.1 LN:270233
+ at SQ SN:KI520221.1 LN:268699
+ at SQ SN:KI520189.1 LN:268692
+ at SQ SN:KI520195.1 LN:267267
+ at SQ SN:KI520190.1 LN:263297
+ at SQ SN:KI520191.1 LN:261118
+ at SQ SN:KI520181.1 LN:259438
+ at SQ SN:KI520201.1 LN:258131
+ at SQ SN:KI520178.1 LN:256862
+ at SQ SN:KI520175.1 LN:255093
+ at SQ SN:KI520274.1 LN:251942
+ at SQ SN:KI520177.1 LN:251228
+ at SQ SN:KI520254.1 LN:249901
+ at SQ SN:KI520200.1 LN:249189
+ at SQ SN:KI520184.1 LN:248793
+ at SQ SN:KI520227.1 LN:248699
+ at SQ SN:KI520207.1 LN:248653
+ at SQ SN:KI520206.1 LN:247634
+ at SQ SN:KI520213.1 LN:247574
+ at SQ SN:KI520223.1 LN:247389
+ at SQ SN:KI520220.1 LN:246891
+ at SQ SN:KI520232.1 LN:244918
+ at SQ SN:KI520193.1 LN:243540
+ at SQ SN:KI520218.1 LN:243011
+ at SQ SN:KI520246.1 LN:242798
+ at SQ SN:KI520185.1 LN:242026
+ at SQ SN:KI520202.1 LN:240588
+ at SQ SN:KI520222.1 LN:240514
+ at SQ SN:KI520242.1 LN:240488
+ at SQ SN:KI520250.1 LN:240157
+ at SQ SN:KI519835.1 LN:239066
+ at SQ SN:KI520199.1 LN:238313
+ at SQ SN:KI520186.1 LN:237782
+ at SQ SN:KI520208.1 LN:234779
+ at SQ SN:KI520210.1 LN:233258
+ at SQ SN:KI520240.1 LN:232981
+ at SQ SN:KI519805.1 LN:232184
+ at SQ SN:KI520272.1 LN:231816
+ at SQ SN:KI520298.1 LN:231714
+ at SQ SN:KI520280.1 LN:230535
+ at SQ SN:KI520224.1 LN:230024
+ at SQ SN:KI520192.1 LN:229931
+ at SQ SN:KI520209.1 LN:228034
+ at SQ SN:KI520214.1 LN:227180
+ at SQ SN:KI520198.1 LN:226910
+ at SQ SN:KI520212.1 LN:225548
+ at SQ SN:KI520286.1 LN:225408
+ at SQ SN:KI520204.1 LN:224843
+ at SQ SN:KI520337.1 LN:224588
+ at SQ SN:KI520238.1 LN:224070
+ at SQ SN:KI520251.1 LN:221851
+ at SQ SN:KI520262.1 LN:221724
+ at SQ SN:KI520197.1 LN:221577
+ at SQ SN:KI520196.1 LN:221011
+ at SQ SN:KI520263.1 LN:219963
+ at SQ SN:AYCK01029288.1 LN:217642
+ at SQ SN:KI520230.1 LN:215567
+ at SQ SN:KI520239.1 LN:214331
+ at SQ SN:KI520248.1 LN:213703
+ at SQ SN:KI520226.1 LN:213676
+ at SQ SN:KI520252.1 LN:212215
+ at SQ SN:KI520215.1 LN:210585
+ at SQ SN:KI520236.1 LN:210066
+ at SQ SN:KI520255.1 LN:209853
+ at SQ SN:KI520217.1 LN:209494
+ at SQ SN:KI520294.1 LN:208447
+ at SQ SN:KI520219.1 LN:207366
+ at SQ SN:KI520287.1 LN:207131
+ at SQ SN:KI520244.1 LN:207082
+ at SQ SN:KI520225.1 LN:206357
+ at SQ SN:KI520275.1 LN:205121
+ at SQ SN:KI520229.1 LN:205104
+ at SQ SN:KI519934.1 LN:204207
+ at SQ SN:KI520293.1 LN:203594
+ at SQ SN:KI520228.1 LN:203207
+ at SQ SN:KI520253.1 LN:201804
+ at SQ SN:KI520257.1 LN:201040
+ at SQ SN:KI520290.1 LN:200991
+ at SQ SN:KI520243.1 LN:200799
+ at SQ SN:KI520384.1 LN:199246
+ at SQ SN:KI520235.1 LN:199095
+ at SQ SN:KI520307.1 LN:198729
+ at SQ SN:KI520258.1 LN:198661
+ at SQ SN:KI520231.1 LN:196868
+ at SQ SN:KI520266.1 LN:196255
+ at SQ SN:KI520269.1 LN:195608
+ at SQ SN:KI520249.1 LN:194834
+ at SQ SN:KI520277.1 LN:194531
+ at SQ SN:KI520314.1 LN:193413
+ at SQ SN:KI520295.1 LN:193130
+ at SQ SN:KI520247.1 LN:191670
+ at SQ SN:KI520279.1 LN:191289
+ at SQ SN:KI520259.1 LN:190194
+ at SQ SN:KI520237.1 LN:189929
+ at SQ SN:KI520281.1 LN:189718
+ at SQ SN:KI520324.1 LN:187651
+ at SQ SN:KI520302.1 LN:186984
+ at SQ SN:KI520264.1 LN:186601
+ at SQ SN:KI520256.1 LN:186297
+ at SQ SN:KI519936.1 LN:185566
+ at SQ SN:AYCK01029289.1 LN:185159
+ at SQ SN:KI520267.1 LN:185035
+ at SQ SN:KI520245.1 LN:184504
+ at SQ SN:KI520305.1 LN:182977
+ at SQ SN:KI520348.1 LN:181425
+ at SQ SN:KI520316.1 LN:181331
+ at SQ SN:KI520319.1 LN:180653
+ at SQ SN:KI520261.1 LN:179840
+ at SQ SN:KI520289.1 LN:179371
+ at SQ SN:KI520273.1 LN:178588
+ at SQ SN:KI520410.1 LN:175697
+ at SQ SN:KI520260.1 LN:174977
+ at SQ SN:KI520285.1 LN:174321
+ at SQ SN:KI520265.1 LN:174077
+ at SQ SN:KI520336.1 LN:173929
+ at SQ SN:KI520271.1 LN:173542
+ at SQ SN:KI520270.1 LN:173310
+ at SQ SN:KI520282.1 LN:173006
+ at SQ SN:KI520292.1 LN:171933
+ at SQ SN:KI520268.1 LN:171865
+ at SQ SN:KI520296.1 LN:170665
+ at SQ SN:KI520306.1 LN:170557
+ at SQ SN:KI520291.1 LN:169956
+ at SQ SN:KI520308.1 LN:169428
+ at SQ SN:KI520330.1 LN:168879
+ at SQ SN:KI520299.1 LN:168403
+ at SQ SN:KI520300.1 LN:167961
+ at SQ SN:KI520359.1 LN:167673
+ at SQ SN:KI520315.1 LN:167546
+ at SQ SN:KI520284.1 LN:167249
+ at SQ SN:KI519686.1 LN:165893
+ at SQ SN:KI520288.1 LN:165557
+ at SQ SN:KI519804.1 LN:165389
+ at SQ SN:KI519859.1 LN:164080
+ at SQ SN:KI520724.1 LN:163645
+ at SQ SN:KI520276.1 LN:163523
+ at SQ SN:KI520311.1 LN:163180
+ at SQ SN:KI520278.1 LN:162630
+ at SQ SN:KI520309.1 LN:162129
+ at SQ SN:KI520313.1 LN:160864
+ at SQ SN:KI520452.1 LN:160818
+ at SQ SN:KI520283.1 LN:160675
+ at SQ SN:KI520321.1 LN:160374
+ at SQ SN:KI519697.1 LN:159964
+ at SQ SN:KI520340.1 LN:159394
+ at SQ SN:KI520332.1 LN:159301
+ at SQ SN:KI520322.1 LN:158481
+ at SQ SN:KI520301.1 LN:157826
+ at SQ SN:AYCK01023213.1 LN:157164
+ at SQ SN:KI520326.1 LN:156492
+ at SQ SN:KI520369.1 LN:156405
+ at SQ SN:KI520342.1 LN:155957
+ at SQ SN:KI519772.1 LN:154583
+ at SQ SN:KI520318.1 LN:153756
+ at SQ SN:KI520418.1 LN:153448
+ at SQ SN:KI520297.1 LN:153401
+ at SQ SN:KI520327.1 LN:153009
+ at SQ SN:KI520368.1 LN:151711
+ at SQ SN:KI520382.1 LN:151293
+ at SQ SN:KI520370.1 LN:149541
+ at SQ SN:KI520317.1 LN:149329
+ at SQ SN:KI520323.1 LN:149300
+ at SQ SN:KI520303.1 LN:147834
+ at SQ SN:KI520304.1 LN:147612
+ at SQ SN:KI520312.1 LN:142288
+ at SQ SN:KI520372.1 LN:140985
+ at SQ SN:KI520377.1 LN:140944
+ at SQ SN:KI520310.1 LN:140894
+ at SQ SN:KI520394.1 LN:140891
+ at SQ SN:KI520353.1 LN:140746
+ at SQ SN:KI520329.1 LN:140510
+ at SQ SN:KI520325.1 LN:139765
+ at SQ SN:KI520335.1 LN:139405
+ at SQ SN:KI520391.1 LN:139209
+ at SQ SN:KI520351.1 LN:139188
+ at SQ SN:KI520379.1 LN:139157
+ at SQ SN:KI519660.1 LN:139139
+ at SQ SN:KI520338.1 LN:138761
+ at SQ SN:KI520333.1 LN:137260
+ at SQ SN:KI520389.1 LN:135924
+ at SQ SN:KI520356.1 LN:134320
+ at SQ SN:KI520397.1 LN:134207
+ at SQ SN:KI520366.1 LN:133966
+ at SQ SN:KI520354.1 LN:133775
+ at SQ SN:KI520320.1 LN:133607
+ at SQ SN:KI520383.1 LN:133534
+ at SQ SN:KI520451.1 LN:133445
+ at SQ SN:KI519858.1 LN:133015
+ at SQ SN:KI519633.1 LN:132715
+ at SQ SN:KI520347.1 LN:132454
+ at SQ SN:KI520421.1 LN:132140
+ at SQ SN:KI520331.1 LN:132060
+ at SQ SN:KI520346.1 LN:131209
+ at SQ SN:KI520357.1 LN:130674
+ at SQ SN:KI520349.1 LN:130030
+ at SQ SN:KI520381.1 LN:129537
+ at SQ SN:KI520341.1 LN:129054
+ at SQ SN:KI519720.1 LN:129031
+ at SQ SN:KI520388.1 LN:128779
+ at SQ SN:KI520328.1 LN:128571
+ at SQ SN:KI520402.1 LN:127597
+ at SQ SN:KI520395.1 LN:127227
+ at SQ SN:KI520364.1 LN:127112
+ at SQ SN:KI520339.1 LN:127070
+ at SQ SN:KI520358.1 LN:127049
+ at SQ SN:KI520361.1 LN:126701
+ at SQ SN:KI520401.1 LN:126509
+ at SQ SN:KI520398.1 LN:126246
+ at SQ SN:KI520345.1 LN:125722
+ at SQ SN:KI520334.1 LN:125567
+ at SQ SN:KI520362.1 LN:124729
+ at SQ SN:KI520367.1 LN:122791
+ at SQ SN:KI520363.1 LN:122676
+ at SQ SN:KI520424.1 LN:122296
+ at SQ SN:KI520343.1 LN:122112
+ at SQ SN:KI520390.1 LN:121529
+ at SQ SN:KI520344.1 LN:121002
+ at SQ SN:KI520477.1 LN:120989
+ at SQ SN:KI520392.1 LN:120670
+ at SQ SN:KI520375.1 LN:120570
+ at SQ SN:KI520396.1 LN:120194
+ at SQ SN:KI520352.1 LN:120067
+ at SQ SN:KI520433.1 LN:119929
+ at SQ SN:KI520360.1 LN:119459
+ at SQ SN:KI520371.1 LN:119288
+ at SQ SN:KI520350.1 LN:117786
+ at SQ SN:KI520449.1 LN:117374
+ at SQ SN:KI520439.1 LN:116931
+ at SQ SN:KI520365.1 LN:116892
+ at SQ SN:KI520409.1 LN:116268
+ at SQ SN:KI520456.1 LN:116061
+ at SQ SN:KI520407.1 LN:115525
+ at SQ SN:KI520461.1 LN:115253
+ at SQ SN:KI520355.1 LN:115220
+ at SQ SN:KI520386.1 LN:115085
+ at SQ SN:KI520420.1 LN:113501
+ at SQ SN:KI520417.1 LN:113100
+ at SQ SN:KI520440.1 LN:112599
+ at SQ SN:KI520426.1 LN:111581
+ at SQ SN:KI520486.1 LN:111072
+ at SQ SN:KI520436.1 LN:110802
+ at SQ SN:KI520469.1 LN:109903
+ at SQ SN:KI520496.1 LN:109297
+ at SQ SN:KI520373.1 LN:108999
+ at SQ SN:KI520376.1 LN:108683
+ at SQ SN:KI520454.1 LN:108439
+ at SQ SN:KI520393.1 LN:108389
+ at SQ SN:KI520422.1 LN:108307
+ at SQ SN:KI520378.1 LN:108081
+ at SQ SN:KI520380.1 LN:107822
+ at SQ SN:KI520399.1 LN:107590
+ at SQ SN:KI520374.1 LN:106847
+ at SQ SN:KI520405.1 LN:106386
+ at SQ SN:KI520404.1 LN:106151
+ at SQ SN:KI520457.1 LN:105623
+ at SQ SN:KI520387.1 LN:105290
+ at SQ SN:KI520419.1 LN:104470
+ at SQ SN:KI520411.1 LN:104424
+ at SQ SN:KI520385.1 LN:104321
+ at SQ SN:KI520403.1 LN:104231
+ at SQ SN:KI520406.1 LN:103581
+ at SQ SN:KI520479.1 LN:102530
+ at SQ SN:KI520465.1 LN:102402
+ at SQ SN:KI520423.1 LN:101899
+ at SQ SN:KI520520.1 LN:101730
+ at SQ SN:KI520400.1 LN:101182
+ at SQ SN:KI520414.1 LN:100961
+ at SQ SN:KI520478.1 LN:99711
+ at SQ SN:KI520455.1 LN:99659
+ at SQ SN:KI520468.1 LN:99325
+ at SQ SN:KI520412.1 LN:99202
+ at SQ SN:KI520471.1 LN:98675
+ at SQ SN:KI520415.1 LN:98626
+ at SQ SN:KI520442.1 LN:98356
+ at SQ SN:KI520437.1 LN:98346
+ at SQ SN:KI520408.1 LN:97627
+ at SQ SN:KI520416.1 LN:97544
+ at SQ SN:KI520519.1 LN:96699
+ at SQ SN:KI520427.1 LN:96482
+ at SQ SN:KI520431.1 LN:96318
+ at SQ SN:KI520428.1 LN:96212
+ at SQ SN:KI520434.1 LN:96026
+ at SQ SN:KI520480.1 LN:95852
+ at SQ SN:KI520487.1 LN:95657
+ at SQ SN:KI520435.1 LN:95488
+ at SQ SN:KI520413.1 LN:95283
+ at SQ SN:KI520438.1 LN:94996
+ at SQ SN:KI520513.1 LN:94967
+ at SQ SN:KI520443.1 LN:93120
+ at SQ SN:KI520518.1 LN:92751
+ at SQ SN:KI520446.1 LN:92538
+ at SQ SN:KI520441.1 LN:92004
+ at SQ SN:KI520453.1 LN:91818
+ at SQ SN:KI520425.1 LN:91762
+ at SQ SN:KI520444.1 LN:91472
+ at SQ SN:KI520511.1 LN:91339
+ at SQ SN:KI520430.1 LN:90531
+ at SQ SN:KI520450.1 LN:90445
+ at SQ SN:KI520432.1 LN:90088
+ at SQ SN:KI520445.1 LN:90047
+ at SQ SN:KI520429.1 LN:90004
+ at SQ SN:KI520492.1 LN:89648
+ at SQ SN:KI520460.1 LN:89178
+ at SQ SN:KI520475.1 LN:88565
+ at SQ SN:KI520791.1 LN:88224
+ at SQ SN:KI520503.1 LN:88012
+ at SQ SN:KI520551.1 LN:87789
+ at SQ SN:KI520545.1 LN:87455
+ at SQ SN:KI520448.1 LN:87094
+ at SQ SN:KI520841.1 LN:86339
+ at SQ SN:AYCK01025055.1 LN:86337
+ at SQ SN:KI520463.1 LN:86280
+ at SQ SN:KI520481.1 LN:85987
+ at SQ SN:KI520447.1 LN:85878
+ at SQ SN:KI520515.1 LN:85607
+ at SQ SN:KI520548.1 LN:84918
+ at SQ SN:KI520472.1 LN:84705
+ at SQ SN:KI520464.1 LN:83744
+ at SQ SN:KI520462.1 LN:83712
+ at SQ SN:KI520488.1 LN:82986
+ at SQ SN:KI520485.1 LN:82809
+ at SQ SN:KI520459.1 LN:82396
+ at SQ SN:KI520470.1 LN:82377
+ at SQ SN:KI520533.1 LN:81810
+ at SQ SN:KI520473.1 LN:81802
+ at SQ SN:KI520517.1 LN:81704
+ at SQ SN:KI520541.1 LN:80906
+ at SQ SN:KI520494.1 LN:80886
+ at SQ SN:KI520467.1 LN:80771
+ at SQ SN:KI520483.1 LN:80479
+ at SQ SN:KI520497.1 LN:79444
+ at SQ SN:KI520495.1 LN:78984
+ at SQ SN:KI520466.1 LN:78140
+ at SQ SN:KI520589.1 LN:77810
+ at SQ SN:KI520474.1 LN:77377
+ at SQ SN:KI520535.1 LN:77059
+ at SQ SN:KI520560.1 LN:76857
+ at SQ SN:KI520500.1 LN:76674
+ at SQ SN:KI520572.1 LN:76339
+ at SQ SN:KI520482.1 LN:76061
+ at SQ SN:KI520576.1 LN:75724
+ at SQ SN:KI520538.1 LN:75498
+ at SQ SN:KI520590.1 LN:74966
+ at SQ SN:KI520579.1 LN:74809
+ at SQ SN:KI520484.1 LN:74740
+ at SQ SN:KI520499.1 LN:74688
+ at SQ SN:KI520491.1 LN:74548
+ at SQ SN:KI520600.1 LN:74083
+ at SQ SN:KI520476.1 LN:73888
+ at SQ SN:KI520550.1 LN:73756
+ at SQ SN:KI520507.1 LN:73618
+ at SQ SN:KI520512.1 LN:73616
+ at SQ SN:KI520559.1 LN:73352
+ at SQ SN:KI520567.1 LN:72658
+ at SQ SN:KI520458.1 LN:72654
+ at SQ SN:KI520498.1 LN:72622
+ at SQ SN:KI520490.1 LN:72463
+ at SQ SN:KI520561.1 LN:72240
+ at SQ SN:KI520493.1 LN:70882
+ at SQ SN:KI520522.1 LN:70750
+ at SQ SN:KI520506.1 LN:70487
+ at SQ SN:KI520526.1 LN:70369
+ at SQ SN:KI520504.1 LN:69925
+ at SQ SN:KI520532.1 LN:69904
+ at SQ SN:KI520489.1 LN:69751
+ at SQ SN:KI520570.1 LN:69704
+ at SQ SN:KI520501.1 LN:69418
+ at SQ SN:KI520528.1 LN:69131
+ at SQ SN:KI520505.1 LN:69101
+ at SQ SN:KI520502.1 LN:69082
+ at SQ SN:KI520537.1 LN:68929
+ at SQ SN:KI520521.1 LN:68623
+ at SQ SN:KI520527.1 LN:68601
+ at SQ SN:KI520584.1 LN:68201
+ at SQ SN:AYCK01029290.1 LN:68042
+ at SQ SN:KI520529.1 LN:68026
+ at SQ SN:KI520508.1 LN:67959
+ at SQ SN:KI520622.1 LN:67573
+ at SQ SN:KI520652.1 LN:67563
+ at SQ SN:KI520651.1 LN:67474
+ at SQ SN:KI520568.1 LN:67093
+ at SQ SN:KI520514.1 LN:66919
+ at SQ SN:KI520531.1 LN:66546
+ at SQ SN:KI520516.1 LN:66414
+ at SQ SN:KI520542.1 LN:66195
+ at SQ SN:KI520540.1 LN:65469
+ at SQ SN:KI520509.1 LN:65172
+ at SQ SN:KI520631.1 LN:64877
+ at SQ SN:KI520534.1 LN:64651
+ at SQ SN:KI520555.1 LN:64502
+ at SQ SN:KI520510.1 LN:64478
+ at SQ SN:KI520525.1 LN:63751
+ at SQ SN:KI520546.1 LN:63185
+ at SQ SN:KI520549.1 LN:62810
+ at SQ SN:KI520523.1 LN:62653
+ at SQ SN:KI520536.1 LN:62634
+ at SQ SN:KI520524.1 LN:62487
+ at SQ SN:KI520530.1 LN:60693
+ at SQ SN:KI520630.1 LN:60407
+ at SQ SN:KI520592.1 LN:60319
+ at SQ SN:KI520543.1 LN:59652
+ at SQ SN:KI520539.1 LN:58666
+ at SQ SN:KI520558.1 LN:58616
+ at SQ SN:KI520544.1 LN:58165
+ at SQ SN:KI520547.1 LN:57681
+ at SQ SN:KI520615.1 LN:57478
+ at SQ SN:KI520694.1 LN:57021
+ at SQ SN:KI520659.1 LN:56766
+ at SQ SN:KI520564.1 LN:56492
+ at SQ SN:KI520554.1 LN:56184
+ at SQ SN:KI520553.1 LN:56049
+ at SQ SN:KI520573.1 LN:55853
+ at SQ SN:KI520556.1 LN:55538
+ at SQ SN:KI520591.1 LN:55523
+ at SQ SN:KI520552.1 LN:55081
+ at SQ SN:KI520683.1 LN:55008
+ at SQ SN:KI520730.1 LN:54928
+ at SQ SN:KI520654.1 LN:54908
+ at SQ SN:KI520577.1 LN:54635
+ at SQ SN:KI520687.1 LN:53728
+ at SQ SN:KI520672.1 LN:53587
+ at SQ SN:KI520578.1 LN:53492
+ at SQ SN:KI520800.1 LN:53469
+ at SQ SN:KI520827.1 LN:53448
+ at SQ SN:KI520571.1 LN:53397
+ at SQ SN:KI520919.1 LN:53191
+ at SQ SN:KI520585.1 LN:53187
+ at SQ SN:KI520566.1 LN:52626
+ at SQ SN:KI520569.1 LN:52157
+ at SQ SN:KI520979.1 LN:51626
+ at SQ SN:KI520583.1 LN:51445
+ at SQ SN:KI520562.1 LN:51347
+ at SQ SN:KI520557.1 LN:51080
+ at SQ SN:KI520602.1 LN:51033
+ at SQ SN:KI520670.1 LN:50996
+ at SQ SN:KI520597.1 LN:50594
+ at SQ SN:KI520563.1 LN:50552
+ at SQ SN:KI520978.1 LN:50518
+ at SQ SN:KI520946.1 LN:50498
+ at SQ SN:KI520588.1 LN:50438
+ at SQ SN:KI520580.1 LN:50042
+ at SQ SN:KI520822.1 LN:49815
+ at SQ SN:KI520565.1 LN:49551
+ at SQ SN:KI520587.1 LN:49299
+ at SQ SN:KI520581.1 LN:49031
+ at SQ SN:KI520802.1 LN:48958
+ at SQ SN:KI521064.1 LN:48871
+ at SQ SN:KI520685.1 LN:48757
+ at SQ SN:KI520786.1 LN:48721
+ at SQ SN:KI520605.1 LN:48703
+ at SQ SN:KI520575.1 LN:48362
+ at SQ SN:KI520818.1 LN:48304
+ at SQ SN:KI520612.1 LN:48258
+ at SQ SN:KI520574.1 LN:46900
+ at SQ SN:KI520595.1 LN:46728
+ at SQ SN:KI520955.1 LN:46694
+ at SQ SN:KI520582.1 LN:46616
+ at SQ SN:KI520586.1 LN:46205
+ at SQ SN:KI520596.1 LN:46128
+ at SQ SN:KI520599.1 LN:45894
+ at SQ SN:KI520669.1 LN:45724
+ at SQ SN:KI520635.1 LN:45266
+ at SQ SN:KI520610.1 LN:45133
+ at SQ SN:KI520617.1 LN:45086
+ at SQ SN:KI520598.1 LN:45084
+ at SQ SN:KI520781.1 LN:44997
+ at SQ SN:KI521144.1 LN:44961
+ at SQ SN:KI520906.1 LN:44912
+ at SQ SN:KI520834.1 LN:44752
+ at SQ SN:AYCK01029291.1 LN:44628
+ at SQ SN:KI520607.1 LN:44581
+ at SQ SN:KI520601.1 LN:44163
+ at SQ SN:KI520619.1 LN:44110
+ at SQ SN:KI520606.1 LN:43996
+ at SQ SN:KI520594.1 LN:43787
+ at SQ SN:KI520614.1 LN:43774
+ at SQ SN:KI520850.1 LN:43238
+ at SQ SN:KI520608.1 LN:43134
+ at SQ SN:KI520640.1 LN:43132
+ at SQ SN:KI521049.1 LN:42975
+ at SQ SN:KI520593.1 LN:42785
+ at SQ SN:KI520609.1 LN:42703
+ at SQ SN:KI520618.1 LN:42655
+ at SQ SN:KI520604.1 LN:42365
+ at SQ SN:KI520700.1 LN:42092
+ at SQ SN:KI520633.1 LN:42043
+ at SQ SN:KI521162.1 LN:42033
+ at SQ SN:KI521316.1 LN:41581
+ at SQ SN:KI520623.1 LN:41501
+ at SQ SN:KI520624.1 LN:41007
+ at SQ SN:KI520611.1 LN:40886
+ at SQ SN:KI520603.1 LN:40715
+ at SQ SN:KI521143.1 LN:40673
+ at SQ SN:KI520621.1 LN:40664
+ at SQ SN:KI520790.1 LN:40496
+ at SQ SN:KI520626.1 LN:40319
+ at SQ SN:AYCK01029292.1 LN:39974
+ at SQ SN:KI520639.1 LN:39905
+ at SQ SN:KI520620.1 LN:39834
+ at SQ SN:KI520613.1 LN:39701
+ at SQ SN:KI520638.1 LN:39682
+ at SQ SN:KI520871.1 LN:39637
+ at SQ SN:AYCK01026491.1 LN:39627
+ at SQ SN:AYCK01029293.1 LN:39302
+ at SQ SN:KI520625.1 LN:39294
+ at SQ SN:KI520616.1 LN:39126
+ at SQ SN:KI520629.1 LN:39004
+ at SQ SN:KI520632.1 LN:38926
+ at SQ SN:KI520628.1 LN:38744
+ at SQ SN:KI520627.1 LN:38464
+ at SQ SN:KI520643.1 LN:38347
+ at SQ SN:KI520636.1 LN:38230
+ at SQ SN:KI520657.1 LN:38083
+ at SQ SN:KI520634.1 LN:37541
+ at SQ SN:AYCK01029294.1 LN:37038
+ at SQ SN:KI520641.1 LN:36885
+ at SQ SN:AYCK01029295.1 LN:36763
+ at SQ SN:KI520655.1 LN:36468
+ at SQ SN:KI520645.1 LN:36382
+ at SQ SN:KI520647.1 LN:36270
+ at SQ SN:KI520637.1 LN:36264
+ at SQ SN:KI520644.1 LN:36138
+ at SQ SN:AYCK01029296.1 LN:35975
+ at SQ SN:AYCK01026643.1 LN:35792
+ at SQ SN:KI520663.1 LN:35771
+ at SQ SN:KI520646.1 LN:35763
+ at SQ SN:KI520681.1 LN:35676
+ at SQ SN:KI520649.1 LN:35024
+ at SQ SN:AYCK01029297.1 LN:34617
+ at SQ SN:KI520642.1 LN:34540
+ at SQ SN:KI520665.1 LN:34320
+ at SQ SN:AYCK01029298.1 LN:34301
+ at SQ SN:KI520648.1 LN:34270
+ at SQ SN:KI520661.1 LN:34248
+ at SQ SN:KI520677.1 LN:33994
+ at SQ SN:KI520680.1 LN:33822
+ at SQ SN:KI520650.1 LN:33767
+ at SQ SN:KI520699.1 LN:33478
+ at SQ SN:KI520697.1 LN:33048
+ at SQ SN:AYCK01029299.1 LN:32913
+ at SQ SN:KI520653.1 LN:32895
+ at SQ SN:KI520695.1 LN:32619
+ at SQ SN:KI520656.1 LN:32577
+ at SQ SN:KI520666.1 LN:32406
+ at SQ SN:KI520662.1 LN:32283
+ at SQ SN:KI520660.1 LN:32247
+ at SQ SN:AYCK01029300.1 LN:32186
+ at SQ SN:KI520667.1 LN:32133
+ at SQ SN:KI520658.1 LN:32033
+ at SQ SN:KI520692.1 LN:31950
+ at SQ SN:KI520696.1 LN:31568
+ at SQ SN:KI520664.1 LN:31488
+ at SQ SN:KI520675.1 LN:31455
+ at SQ SN:KI520668.1 LN:31332
+ at SQ SN:KI520673.1 LN:31210
+ at SQ SN:KI520679.1 LN:31069
+ at SQ SN:AYCK01029301.1 LN:31045
+ at SQ SN:KI520688.1 LN:30992
+ at SQ SN:KI520689.1 LN:30905
+ at SQ SN:KI520701.1 LN:30864
+ at SQ SN:KI520674.1 LN:30839
+ at SQ SN:KI520693.1 LN:30740
+ at SQ SN:AYCK01029302.1 LN:30691
+ at SQ SN:AYCK01029303.1 LN:30551
+ at SQ SN:KI520671.1 LN:30528
+ at SQ SN:KI520707.1 LN:30249
+ at SQ SN:KI520691.1 LN:30224
+ at SQ SN:KI520676.1 LN:30218
+ at SQ SN:KI520684.1 LN:30201
+ at SQ SN:AYCK01026785.1 LN:30098
+ at SQ SN:KI520722.1 LN:29992
+ at SQ SN:KI520678.1 LN:29964
+ at SQ SN:KI520682.1 LN:29753
+ at SQ SN:AYCK01029304.1 LN:29654
+ at SQ SN:AYCK01026801.1 LN:29513
+ at SQ SN:KI520718.1 LN:29432
+ at SQ SN:KI520686.1 LN:29164
+ at SQ SN:AYCK01029305.1 LN:29145
+ at SQ SN:KI520702.1 LN:29111
+ at SQ SN:KI520709.1 LN:29026
+ at SQ SN:KI520690.1 LN:29018
+ at SQ SN:KI521081.1 LN:28845
+ at SQ SN:AYCK01029306.1 LN:28822
+ at SQ SN:KI520706.1 LN:28816
+ at SQ SN:AYCK01029307.1 LN:28463
+ at SQ SN:AYCK01029308.1 LN:28452
+ at SQ SN:KI520721.1 LN:28367
+ at SQ SN:KI520698.1 LN:28192
+ at SQ SN:KI520756.1 LN:28165
+ at SQ SN:KI520746.1 LN:28027
+ at SQ SN:KI520703.1 LN:28000
+ at SQ SN:KI520731.1 LN:27968
+ at SQ SN:KI520736.1 LN:27822
+ at SQ SN:AYCK01026880.1 LN:27790
+ at SQ SN:KI520704.1 LN:27738
+ at SQ SN:KI520713.1 LN:27715
+ at SQ SN:KI520708.1 LN:27698
+ at SQ SN:KI520705.1 LN:27570
+ at SQ SN:KI520727.1 LN:27500
+ at SQ SN:AYCK01029309.1 LN:27204
+ at SQ SN:KI520710.1 LN:27185
+ at SQ SN:KI520711.1 LN:27164
+ at SQ SN:KI520712.1 LN:26988
+ at SQ SN:AYCK01029310.1 LN:26955
+ at SQ SN:KI520794.1 LN:26938
+ at SQ SN:KI520735.1 LN:26930
+ at SQ SN:KI520714.1 LN:26713
+ at SQ SN:KI520717.1 LN:26537
+ at SQ SN:KI520740.1 LN:26497
+ at SQ SN:AYCK01029311.1 LN:26471
+ at SQ SN:KI520745.1 LN:26381
+ at SQ SN:KI520754.1 LN:26357
+ at SQ SN:KI520763.1 LN:26338
+ at SQ SN:KI520719.1 LN:26313
+ at SQ SN:KI520716.1 LN:26285
+ at SQ SN:KI520720.1 LN:26281
+ at SQ SN:KI520737.1 LN:26201
+ at SQ SN:KI520734.1 LN:26199
+ at SQ SN:KI520715.1 LN:26153
+ at SQ SN:KI520726.1 LN:25825
+ at SQ SN:KI520723.1 LN:25650
+ at SQ SN:AYCK01026963.1 LN:25583
+ at SQ SN:KI520728.1 LN:25513
+ at SQ SN:KI520732.1 LN:25413
+ at SQ SN:KI520725.1 LN:25396
+ at SQ SN:AYCK01029312.1 LN:25327
+ at SQ SN:KI520780.1 LN:25287
+ at SQ SN:KI520774.1 LN:25046
+ at SQ SN:KI520738.1 LN:25044
+ at SQ SN:AYCK01029313.1 LN:25013
+ at SQ SN:AYCK01029314.1 LN:24931
+ at SQ SN:KI520748.1 LN:24883
+ at SQ SN:KI520788.1 LN:24860
+ at SQ SN:KI520742.1 LN:24850
+ at SQ SN:KI520729.1 LN:24785
+ at SQ SN:KI520767.1 LN:24688
+ at SQ SN:KI520733.1 LN:24654
+ at SQ SN:KI520771.1 LN:24643
+ at SQ SN:KI520741.1 LN:24589
+ at SQ SN:AYCK01029315.1 LN:24575
+ at SQ SN:KI520743.1 LN:24488
+ at SQ SN:KI520750.1 LN:24401
+ at SQ SN:KI520744.1 LN:24382
+ at SQ SN:KI520772.1 LN:24230
+ at SQ SN:KI520782.1 LN:24131
+ at SQ SN:KI520739.1 LN:24090
+ at SQ SN:KI520762.1 LN:23918
+ at SQ SN:KI520747.1 LN:23866
+ at SQ SN:AYCK01029316.1 LN:23766
+ at SQ SN:KI520749.1 LN:23629
+ at SQ SN:KI520751.1 LN:23615
+ at SQ SN:KI520839.1 LN:23613
+ at SQ SN:KI520835.1 LN:23562
+ at SQ SN:KI520757.1 LN:23559
+ at SQ SN:AYCK01029317.1 LN:23515
+ at SQ SN:KI520752.1 LN:23468
+ at SQ SN:KI520753.1 LN:23464
+ at SQ SN:KI520848.1 LN:23408
+ at SQ SN:KI520796.1 LN:23395
+ at SQ SN:AYCK01029318.1 LN:23162
+ at SQ SN:KI520766.1 LN:23155
+ at SQ SN:KI520765.1 LN:23018
+ at SQ SN:AYCK01029319.1 LN:22924
+ at SQ SN:KI520758.1 LN:22767
+ at SQ SN:KI520760.1 LN:22764
+ at SQ SN:AYCK01029320.1 LN:22759
+ at SQ SN:KI520755.1 LN:22688
+ at SQ SN:KI520895.1 LN:22650
+ at SQ SN:KI520761.1 LN:22628
+ at SQ SN:KI520764.1 LN:22598
+ at SQ SN:AYCK01029321.1 LN:22579
+ at SQ SN:KI520773.1 LN:22457
+ at SQ SN:KI520769.1 LN:22250
+ at SQ SN:KI520759.1 LN:22104
+ at SQ SN:KI520768.1 LN:22081
+ at SQ SN:AYCK01029322.1 LN:22044
+ at SQ SN:KI520819.1 LN:21919
+ at SQ SN:AYCK01029323.1 LN:21906
+ at SQ SN:KI520815.1 LN:21905
+ at SQ SN:KI520798.1 LN:21901
+ at SQ SN:KI520777.1 LN:21872
+ at SQ SN:KI520799.1 LN:21856
+ at SQ SN:KI520820.1 LN:21797
+ at SQ SN:KI520803.1 LN:21735
+ at SQ SN:KI520883.1 LN:21722
+ at SQ SN:KI520770.1 LN:21584
+ at SQ SN:KI520808.1 LN:21581
+ at SQ SN:AYCK01029324.1 LN:21575
+ at SQ SN:KI520776.1 LN:21537
+ at SQ SN:KI520778.1 LN:21507
+ at SQ SN:AYCK01029325.1 LN:21495
+ at SQ SN:KI520775.1 LN:21471
+ at SQ SN:KI520881.1 LN:21448
+ at SQ SN:KI520779.1 LN:21387
+ at SQ SN:AYCK01029326.1 LN:21362
+ at SQ SN:KI520784.1 LN:21354
+ at SQ SN:AYCK01029327.1 LN:21291
+ at SQ SN:KI520785.1 LN:21255
+ at SQ SN:KI520902.1 LN:21236
+ at SQ SN:KI520783.1 LN:21122
+ at SQ SN:KI520792.1 LN:21105
+ at SQ SN:AYCK01029328.1 LN:21086
+ at SQ SN:KI520789.1 LN:21003
+ at SQ SN:AYCK01029329.1 LN:20990
+ at SQ SN:KI520787.1 LN:20961
+ at SQ SN:KI520797.1 LN:20921
+ at SQ SN:AYCK01029330.1 LN:20900
+ at SQ SN:AYCK01029331.1 LN:20871
+ at SQ SN:AYCK01029332.1 LN:20848
+ at SQ SN:KI520812.1 LN:20807
+ at SQ SN:KI520795.1 LN:20762
+ at SQ SN:KI520793.1 LN:20756
+ at SQ SN:KI520806.1 LN:20723
+ at SQ SN:AYCK01029333.1 LN:20649
+ at SQ SN:KI520844.1 LN:20648
+ at SQ SN:AYCK01029334.1 LN:20640
+ at SQ SN:KI520855.1 LN:20621
+ at SQ SN:AYCK01029335.1 LN:20619
+ at SQ SN:KI520807.1 LN:20580
+ at SQ SN:AYCK01029336.1 LN:20441
+ at SQ SN:KI520886.1 LN:20375
+ at SQ SN:KI520823.1 LN:20370
+ at SQ SN:AYCK01029337.1 LN:20352
+ at SQ SN:KI520832.1 LN:20262
+ at SQ SN:AYCK01029338.1 LN:20195
+ at SQ SN:KI520863.1 LN:20161
+ at SQ SN:KI520831.1 LN:20128
+ at SQ SN:KI520811.1 LN:20109
+ at SQ SN:KI520862.1 LN:20105
+ at SQ SN:KI520901.1 LN:20008
+ at SQ SN:KI520816.1 LN:20000
+ at SQ SN:KI520809.1 LN:19949
+ at SQ SN:AYCK01029339.1 LN:19924
+ at SQ SN:KI520828.1 LN:19903
+ at SQ SN:KI520810.1 LN:19884
+ at SQ SN:KI520814.1 LN:19855
+ at SQ SN:KI520813.1 LN:19835
+ at SQ SN:AYCK01029340.1 LN:19800
+ at SQ SN:KI520838.1 LN:19791
+ at SQ SN:KI520804.1 LN:19731
+ at SQ SN:KI520821.1 LN:19703
+ at SQ SN:KI520833.1 LN:19679
+ at SQ SN:KI520817.1 LN:19671
+ at SQ SN:KI520868.1 LN:19633
+ at SQ SN:KI520824.1 LN:19575
+ at SQ SN:KI520842.1 LN:19573
+ at SQ SN:KI520826.1 LN:19565
+ at SQ SN:AYCK01029341.1 LN:19556
+ at SQ SN:KI520825.1 LN:19522
+ at SQ SN:KI520801.1 LN:19520
+ at SQ SN:KI520805.1 LN:19517
+ at SQ SN:KI520846.1 LN:19505
+ at SQ SN:KI520860.1 LN:19486
+ at SQ SN:AYCK01029342.1 LN:19420
+ at SQ SN:KI520851.1 LN:19336
+ at SQ SN:AYCK01029343.1 LN:19181
+ at SQ SN:KI520829.1 LN:19116
+ at SQ SN:KI520830.1 LN:19075
+ at SQ SN:AYCK01029344.1 LN:19070
+ at SQ SN:KI520843.1 LN:19046
+ at SQ SN:KI520853.1 LN:19014
+ at SQ SN:KI520840.1 LN:18780
+ at SQ SN:KI520892.1 LN:18769
+ at SQ SN:KI520837.1 LN:18713
+ at SQ SN:AYCK01029345.1 LN:18700
+ at SQ SN:KI520836.1 LN:18680
+ at SQ SN:AYCK01029346.1 LN:18635
+ at SQ SN:KI520897.1 LN:18550
+ at SQ SN:KI520879.1 LN:18544
+ at SQ SN:KI520857.1 LN:18514
+ at SQ SN:KI520898.1 LN:18496
+ at SQ SN:KI520847.1 LN:18483
+ at SQ SN:AYCK01029347.1 LN:18480
+ at SQ SN:AYCK01027316.1 LN:18475
+ at SQ SN:AYCK01029348.1 LN:18468
+ at SQ SN:AYCK01027317.1 LN:18345
+ at SQ SN:KI520876.1 LN:18333
+ at SQ SN:AYCK01029349.1 LN:18295
+ at SQ SN:KI520890.1 LN:18215
+ at SQ SN:KI520866.1 LN:18162
+ at SQ SN:AYCK01029350.1 LN:18082
+ at SQ SN:KI520864.1 LN:18053
+ at SQ SN:AYCK01029351.1 LN:18040
+ at SQ SN:KI520852.1 LN:18031
+ at SQ SN:KI520845.1 LN:17999
+ at SQ SN:KI520849.1 LN:17975
+ at SQ SN:KI521025.1 LN:17836
+ at SQ SN:KI520928.1 LN:17785
+ at SQ SN:AYCK01029352.1 LN:17742
+ at SQ SN:KI520878.1 LN:17673
+ at SQ SN:KI520959.1 LN:17665
+ at SQ SN:KI520856.1 LN:17643
+ at SQ SN:AYCK01029353.1 LN:17636
+ at SQ SN:KI520859.1 LN:17608
+ at SQ SN:AYCK01029354.1 LN:17533
+ at SQ SN:KI520861.1 LN:17499
+ at SQ SN:KI520903.1 LN:17314
+ at SQ SN:AYCK01029355.1 LN:17304
+ at SQ SN:KI521242.1 LN:17234
+ at SQ SN:KI520858.1 LN:17233
+ at SQ SN:KI520899.1 LN:17218
+ at SQ SN:AYCK01029356.1 LN:17131
+ at SQ SN:AYCK01027401.1 LN:17086
+ at SQ SN:KI520869.1 LN:17072
+ at SQ SN:AYCK01029357.1 LN:17055
+ at SQ SN:AYCK01029358.1 LN:17038
+ at SQ SN:KI520854.1 LN:17035
+ at SQ SN:KI520900.1 LN:16974
+ at SQ SN:KI520867.1 LN:16970
+ at SQ SN:KI520915.1 LN:16962
+ at SQ SN:KI520884.1 LN:16944
+ at SQ SN:KI520865.1 LN:16940
+ at SQ SN:KI520951.1 LN:16834
+ at SQ SN:KI520873.1 LN:16788
+ at SQ SN:KI520872.1 LN:16756
+ at SQ SN:AYCK01029359.1 LN:16720
+ at SQ SN:KI520874.1 LN:16710
+ at SQ SN:KI520870.1 LN:16602
+ at SQ SN:KI520887.1 LN:16567
+ at SQ SN:AYCK01027430.1 LN:16522
+ at SQ SN:KI520965.1 LN:16482
+ at SQ SN:KI520961.1 LN:16464
+ at SQ SN:KI520880.1 LN:16456
+ at SQ SN:KI520922.1 LN:16424
+ at SQ SN:KI520916.1 LN:16419
+ at SQ SN:AYCK01027434.1 LN:16337
+ at SQ SN:KI520875.1 LN:16312
+ at SQ SN:KI520882.1 LN:16304
+ at SQ SN:AYCK01027438.1 LN:16279
+ at SQ SN:AYCK01029360.1 LN:16263
+ at SQ SN:KI520911.1 LN:16223
+ at SQ SN:KI520921.1 LN:16211
+ at SQ SN:KI520893.1 LN:16176
+ at SQ SN:KI520885.1 LN:16164
+ at SQ SN:AYCK01029361.1 LN:16160
+ at SQ SN:AYCK01029362.1 LN:16158
+ at SQ SN:KI520889.1 LN:16112
+ at SQ SN:KI520912.1 LN:16107
+ at SQ SN:AYCK01029363.1 LN:16084
+ at SQ SN:AYCK01029364.1 LN:16084
+ at SQ SN:AYCK01027446.1 LN:16063
+ at SQ SN:KI520896.1 LN:16021
+ at SQ SN:KI520925.1 LN:15944
+ at SQ SN:KI520932.1 LN:15924
+ at SQ SN:KI520891.1 LN:15903
+ at SQ SN:KI520894.1 LN:15866
+ at SQ SN:KI520904.1 LN:15842
+ at SQ SN:KI520907.1 LN:15825
+ at SQ SN:AYCK01029365.1 LN:15807
+ at SQ SN:KI520913.1 LN:15802
+ at SQ SN:AYCK01029366.1 LN:15796
+ at SQ SN:KI520909.1 LN:15789
+ at SQ SN:AYCK01027463.1 LN:15749
+ at SQ SN:AYCK01027464.1 LN:15735
+ at SQ SN:KI520945.1 LN:15721
+ at SQ SN:KI520976.1 LN:15700
+ at SQ SN:KI520920.1 LN:15684
+ at SQ SN:AYCK01029367.1 LN:15666
+ at SQ SN:KI520935.1 LN:15641
+ at SQ SN:KI520877.1 LN:15554
+ at SQ SN:AYCK01029368.1 LN:15519
+ at SQ SN:KI520964.1 LN:15515
+ at SQ SN:KI520910.1 LN:15506
+ at SQ SN:KI520950.1 LN:15502
+ at SQ SN:KI520986.1 LN:15463
+ at SQ SN:AYCK01029369.1 LN:15463
+ at SQ SN:KI520943.1 LN:15456
+ at SQ SN:AYCK01029370.1 LN:15453
+ at SQ SN:KI520991.1 LN:15431
+ at SQ SN:KI520888.1 LN:15419
+ at SQ SN:KI520958.1 LN:15375
+ at SQ SN:AYCK01029371.1 LN:15354
+ at SQ SN:KI520914.1 LN:15292
+ at SQ SN:AYCK01029372.1 LN:15282
+ at SQ SN:KI520917.1 LN:15258
+ at SQ SN:KI520905.1 LN:15216
+ at SQ SN:KI520977.1 LN:15199
+ at SQ SN:AYCK01029373.1 LN:15192
+ at SQ SN:KI520923.1 LN:15127
+ at SQ SN:KI520918.1 LN:15122
+ at SQ SN:AYCK01029374.1 LN:15072
+ at SQ SN:KI520908.1 LN:15016
+ at SQ SN:KI520930.1 LN:15009
+ at SQ SN:KI520924.1 LN:14988
+ at SQ SN:KI520938.1 LN:14988
+ at SQ SN:AYCK01029375.1 LN:14977
+ at SQ SN:AYCK01029376.1 LN:14970
+ at SQ SN:KI520940.1 LN:14963
+ at SQ SN:AYCK01027574.1 LN:14897
+ at SQ SN:AYCK01029377.1 LN:14883
+ at SQ SN:AYCK01029378.1 LN:14873
+ at SQ SN:AYCK01029379.1 LN:14841
+ at SQ SN:KI520927.1 LN:14823
+ at SQ SN:KI521099.1 LN:14755
+ at SQ SN:KI520926.1 LN:14743
+ at SQ SN:AYCK01029380.1 LN:14718
+ at SQ SN:AYCK01029381.1 LN:14684
+ at SQ SN:KI520931.1 LN:14678
+ at SQ SN:AYCK01027588.1 LN:14677
+ at SQ SN:AYCK01029382.1 LN:14674
+ at SQ SN:KI520929.1 LN:14672
+ at SQ SN:AYCK01029383.1 LN:14667
+ at SQ SN:KI520994.1 LN:14607
+ at SQ SN:KI520990.1 LN:14600
+ at SQ SN:KI520933.1 LN:14554
+ at SQ SN:KI520942.1 LN:14551
+ at SQ SN:AYCK01027592.1 LN:14547
+ at SQ SN:AYCK01029384.1 LN:14496
+ at SQ SN:AYCK01029385.1 LN:14442
+ at SQ SN:KI521023.1 LN:14399
+ at SQ SN:AYCK01029386.1 LN:14385
+ at SQ SN:AYCK01029387.1 LN:14372
+ at SQ SN:KI520974.1 LN:14362
+ at SQ SN:KI520934.1 LN:14354
+ at SQ SN:AYCK01029388.1 LN:14312
+ at SQ SN:KI520937.1 LN:14309
+ at SQ SN:AYCK01029389.1 LN:14253
+ at SQ SN:KI520954.1 LN:14229
+ at SQ SN:AYCK01029390.1 LN:14226
+ at SQ SN:AYCK01029391.1 LN:14226
+ at SQ SN:KI520936.1 LN:14220
+ at SQ SN:KI520963.1 LN:14220
+ at SQ SN:KI520939.1 LN:14184
+ at SQ SN:AYCK01029392.1 LN:14126
+ at SQ SN:AYCK01029393.1 LN:14124
+ at SQ SN:AYCK01029394.1 LN:14089
+ at SQ SN:AYCK01029395.1 LN:14087
+ at SQ SN:AYCK01027630.1 LN:14083
+ at SQ SN:AYCK01029396.1 LN:14030
+ at SQ SN:KI520999.1 LN:14024
+ at SQ SN:AYCK01029397.1 LN:13934
+ at SQ SN:KI521014.1 LN:13921
+ at SQ SN:KI520941.1 LN:13911
+ at SQ SN:KI520992.1 LN:13861
+ at SQ SN:AYCK01029398.1 LN:13730
+ at SQ SN:KI520947.1 LN:13722
+ at SQ SN:KI520949.1 LN:13706
+ at SQ SN:KI520948.1 LN:13687
+ at SQ SN:AYCK01029399.1 LN:13617
+ at SQ SN:KI520973.1 LN:13599
+ at SQ SN:AYCK01029400.1 LN:13549
+ at SQ SN:AYCK01029401.1 LN:13452
+ at SQ SN:KI520944.1 LN:13420
+ at SQ SN:KI521015.1 LN:13385
+ at SQ SN:KI520953.1 LN:13384
+ at SQ SN:KI520952.1 LN:13322
+ at SQ SN:AYCK01029402.1 LN:13293
+ at SQ SN:KI521012.1 LN:13275
+ at SQ SN:AYCK01029403.1 LN:13221
+ at SQ SN:AYCK01029404.1 LN:13159
+ at SQ SN:AYCK01029405.1 LN:13125
+ at SQ SN:AYCK01029406.1 LN:13120
+ at SQ SN:KI521011.1 LN:13059
+ at SQ SN:KI520980.1 LN:13011
+ at SQ SN:KI520997.1 LN:13007
+ at SQ SN:KI521092.1 LN:12994
+ at SQ SN:AYCK01029407.1 LN:12973
+ at SQ SN:KI520957.1 LN:12968
+ at SQ SN:AYCK01029408.1 LN:12919
+ at SQ SN:AYCK01029409.1 LN:12893
+ at SQ SN:KI520960.1 LN:12886
+ at SQ SN:KI520968.1 LN:12812
+ at SQ SN:KI520989.1 LN:12791
+ at SQ SN:KI520962.1 LN:12786
+ at SQ SN:KI521080.1 LN:12785
+ at SQ SN:KI520975.1 LN:12740
+ at SQ SN:KI520969.1 LN:12730
+ at SQ SN:AYCK01027705.1 LN:12677
+ at SQ SN:KI520966.1 LN:12661
+ at SQ SN:AYCK01029410.1 LN:12651
+ at SQ SN:KI520956.1 LN:12614
+ at SQ SN:AYCK01029411.1 LN:12611
+ at SQ SN:KI521001.1 LN:12578
+ at SQ SN:AYCK01029412.1 LN:12562
+ at SQ SN:AYCK01029413.1 LN:12476
+ at SQ SN:KI520971.1 LN:12472
+ at SQ SN:KI520981.1 LN:12447
+ at SQ SN:KI520970.1 LN:12399
+ at SQ SN:KI520967.1 LN:12392
+ at SQ SN:AYCK01029414.1 LN:12345
+ at SQ SN:KI520984.1 LN:12280
+ at SQ SN:KI520985.1 LN:12253
+ at SQ SN:KI520988.1 LN:12227
+ at SQ SN:AYCK01029415.1 LN:12226
+ at SQ SN:KI520972.1 LN:12201
+ at SQ SN:AYCK01029416.1 LN:12192
+ at SQ SN:AYCK01029417.1 LN:12185
+ at SQ SN:KI520987.1 LN:12179
+ at SQ SN:KI520983.1 LN:12149
+ at SQ SN:KI521000.1 LN:12147
+ at SQ SN:KI521003.1 LN:12124
+ at SQ SN:AYCK01029418.1 LN:12113
+ at SQ SN:AYCK01029419.1 LN:12108
+ at SQ SN:KI521042.1 LN:12027
+ at SQ SN:KI520995.1 LN:12026
+ at SQ SN:KI521017.1 LN:12016
+ at SQ SN:KI520982.1 LN:11987
+ at SQ SN:KI521054.1 LN:11980
+ at SQ SN:KI520996.1 LN:11978
+ at SQ SN:AYCK01029420.1 LN:11971
+ at SQ SN:AYCK01029421.1 LN:11956
+ at SQ SN:AYCK01029422.1 LN:11946
+ at SQ SN:KI521028.1 LN:11921
+ at SQ SN:KI521037.1 LN:11914
+ at SQ SN:AYCK01029423.1 LN:11898
+ at SQ SN:AYCK01029424.1 LN:11895
+ at SQ SN:KI520998.1 LN:11856
+ at SQ SN:KI520993.1 LN:11853
+ at SQ SN:AYCK01029425.1 LN:11811
+ at SQ SN:AYCK01029426.1 LN:11748
+ at SQ SN:AYCK01029427.1 LN:11732
+ at SQ SN:KI521013.1 LN:11708
+ at SQ SN:KI521007.1 LN:11643
+ at SQ SN:AYCK01029428.1 LN:11643
+ at SQ SN:KI521008.1 LN:11642
+ at SQ SN:KI521020.1 LN:11601
+ at SQ SN:KI521010.1 LN:11552
+ at SQ SN:KI521043.1 LN:11540
+ at SQ SN:KI521051.1 LN:11519
+ at SQ SN:AYCK01027784.1 LN:11501
+ at SQ SN:AYCK01027785.1 LN:11501
+ at SQ SN:KI521016.1 LN:11473
+ at SQ SN:KI521002.1 LN:11416
+ at SQ SN:KI521019.1 LN:11385
+ at SQ SN:KI521006.1 LN:11367
+ at SQ SN:AYCK01029429.1 LN:11351
+ at SQ SN:KI521005.1 LN:11343
+ at SQ SN:KI521077.1 LN:11329
+ at SQ SN:KI521004.1 LN:11314
+ at SQ SN:KI521021.1 LN:11297
+ at SQ SN:AYCK01027822.1 LN:11254
+ at SQ SN:AYCK01029430.1 LN:11239
+ at SQ SN:AYCK01029431.1 LN:11190
+ at SQ SN:AYCK01029432.1 LN:11184
+ at SQ SN:AYCK01029433.1 LN:11119
+ at SQ SN:AYCK01029434.1 LN:11069
+ at SQ SN:KI521026.1 LN:11067
+ at SQ SN:KI521038.1 LN:11051
+ at SQ SN:KI521009.1 LN:11049
+ at SQ SN:AYCK01029435.1 LN:11046
+ at SQ SN:KI521018.1 LN:11021
+ at SQ SN:AYCK01029436.1 LN:10983
+ at SQ SN:AYCK01027864.1 LN:10963
+ at SQ SN:AYCK01029437.1 LN:10938
+ at SQ SN:AYCK01029438.1 LN:10938
+ at SQ SN:AYCK01029439.1 LN:10915
+ at SQ SN:KI521031.1 LN:10913
+ at SQ SN:KI521029.1 LN:10895
+ at SQ SN:KI521096.1 LN:10892
+ at SQ SN:KI521030.1 LN:10872
+ at SQ SN:KI521058.1 LN:10868
+ at SQ SN:KI521027.1 LN:10855
+ at SQ SN:AYCK01029440.1 LN:10836
+ at SQ SN:KI521033.1 LN:10787
+ at SQ SN:AYCK01029441.1 LN:10785
+ at SQ SN:KI521024.1 LN:10769
+ at SQ SN:KI521052.1 LN:10764
+ at SQ SN:KI521059.1 LN:10757
+ at SQ SN:AYCK01027885.1 LN:10737
+ at SQ SN:AYCK01029442.1 LN:10724
+ at SQ SN:AYCK01029443.1 LN:10694
+ at SQ SN:KI521171.1 LN:10672
+ at SQ SN:KI521035.1 LN:10655
+ at SQ SN:KI521039.1 LN:10629
+ at SQ SN:KI521040.1 LN:10611
+ at SQ SN:AYCK01027894.1 LN:10591
+ at SQ SN:AYCK01029444.1 LN:10569
+ at SQ SN:AYCK01029445.1 LN:10517
+ at SQ SN:KI521048.1 LN:10513
+ at SQ SN:KI521036.1 LN:10510
+ at SQ SN:KI521034.1 LN:10486
+ at SQ SN:KI521032.1 LN:10470
+ at SQ SN:KI521041.1 LN:10448
+ at SQ SN:AYCK01029446.1 LN:10413
+ at SQ SN:AYCK01029447.1 LN:10399
+ at SQ SN:KI521127.1 LN:10384
+ at SQ SN:AYCK01029448.1 LN:10372
+ at SQ SN:AYCK01029449.1 LN:10313
+ at SQ SN:KI521045.1 LN:10292
+ at SQ SN:KI521055.1 LN:10279
+ at SQ SN:KI521050.1 LN:10230
+ at SQ SN:AYCK01029450.1 LN:10229
+ at SQ SN:AYCK01029451.1 LN:10221
+ at SQ SN:KI521046.1 LN:10202
+ at SQ SN:KI521047.1 LN:10186
+ at SQ SN:AYCK01029452.1 LN:10171
+ at SQ SN:AYCK01029453.1 LN:10169
+ at SQ SN:AYCK01029454.1 LN:10154
+ at SQ SN:KI521056.1 LN:10148
+ at SQ SN:KI521083.1 LN:10148
+ at SQ SN:KI521053.1 LN:10116
+ at SQ SN:KI521057.1 LN:10080
+ at SQ SN:AYCK01029455.1 LN:10042
+ at SQ SN:AYCK01029456.1 LN:10019
+ at SQ SN:AYCK01029457.1 LN:10012
+ at SQ SN:KI521088.1 LN:10009
+ at SQ SN:KI521061.1 LN:9939
+ at SQ SN:KI521044.1 LN:9936
+ at SQ SN:AYCK01029458.1 LN:9929
+ at SQ SN:KI521063.1 LN:9925
+ at SQ SN:KI521060.1 LN:9919
+ at SQ SN:AYCK01029459.1 LN:9910
+ at SQ SN:AYCK01029460.1 LN:9908
+ at SQ SN:KI521107.1 LN:9886
+ at SQ SN:AYCK01029461.1 LN:9875
+ at SQ SN:KI521094.1 LN:9872
+ at SQ SN:AYCK01029462.1 LN:9865
+ at SQ SN:KI521068.1 LN:9858
+ at SQ SN:AYCK01029463.1 LN:9854
+ at SQ SN:KI521070.1 LN:9846
+ at SQ SN:KI521066.1 LN:9838
+ at SQ SN:AYCK01029464.1 LN:9838
+ at SQ SN:KI521075.1 LN:9814
+ at SQ SN:KI521065.1 LN:9812
+ at SQ SN:KI521161.1 LN:9788
+ at SQ SN:KI521062.1 LN:9784
+ at SQ SN:KI521151.1 LN:9778
+ at SQ SN:KI521069.1 LN:9749
+ at SQ SN:KI521072.1 LN:9710
+ at SQ SN:KI521074.1 LN:9647
+ at SQ SN:KI521073.1 LN:9622
+ at SQ SN:KI521148.1 LN:9597
+ at SQ SN:AYCK01029465.1 LN:9589
+ at SQ SN:AYCK01029466.1 LN:9553
+ at SQ SN:KI521067.1 LN:9547
+ at SQ SN:AYCK01029467.1 LN:9528
+ at SQ SN:AYCK01029468.1 LN:9527
+ at SQ SN:KI521082.1 LN:9508
+ at SQ SN:KI521078.1 LN:9468
+ at SQ SN:KI521079.1 LN:9443
+ at SQ SN:AYCK01027989.1 LN:9421
+ at SQ SN:AYCK01029469.1 LN:9421
+ at SQ SN:AYCK01029470.1 LN:9399
+ at SQ SN:AYCK01029471.1 LN:9390
+ at SQ SN:AYCK01029472.1 LN:9352
+ at SQ SN:KI521172.1 LN:9345
+ at SQ SN:KI521084.1 LN:9332
+ at SQ SN:KI521076.1 LN:9328
+ at SQ SN:AYCK01029473.1 LN:9320
+ at SQ SN:AYCK01029474.1 LN:9317
+ at SQ SN:KI521095.1 LN:9312
+ at SQ SN:KI521022.1 LN:9281
+ at SQ SN:AYCK01029475.1 LN:9267
+ at SQ SN:AYCK01028016.1 LN:9260
+ at SQ SN:KI521071.1 LN:9222
+ at SQ SN:AYCK01029476.1 LN:9200
+ at SQ SN:AYCK01029477.1 LN:9199
+ at SQ SN:KI521090.1 LN:9193
+ at SQ SN:KI521142.1 LN:9189
+ at SQ SN:KI521089.1 LN:9186
+ at SQ SN:KI521105.1 LN:9163
+ at SQ SN:KI521091.1 LN:9153
+ at SQ SN:KI521085.1 LN:9141
+ at SQ SN:AYCK01029478.1 LN:9140
+ at SQ SN:AYCK01029479.1 LN:9118
+ at SQ SN:AYCK01029480.1 LN:9103
+ at SQ SN:KI521087.1 LN:9101
+ at SQ SN:KI521100.1 LN:9085
+ at SQ SN:KI521086.1 LN:9074
+ at SQ SN:AYCK01029481.1 LN:9068
+ at SQ SN:KI521097.1 LN:9031
+ at SQ SN:AYCK01029482.1 LN:9029
+ at SQ SN:AYCK01029483.1 LN:9020
+ at SQ SN:AYCK01029484.1 LN:9015
+ at SQ SN:KI521098.1 LN:9014
+ at SQ SN:AYCK01029485.1 LN:9006
+ at SQ SN:AYCK01029486.1 LN:8974
+ at SQ SN:KI521101.1 LN:8965
+ at SQ SN:AYCK01029487.1 LN:8959
+ at SQ SN:AYCK01029488.1 LN:8959
+ at SQ SN:AYCK01029489.1 LN:8946
+ at SQ SN:AYCK01029490.1 LN:8946
+ at SQ SN:KI521093.1 LN:8944
+ at SQ SN:AYCK01029491.1 LN:8938
+ at SQ SN:AYCK01029492.1 LN:8883
+ at SQ SN:AYCK01029493.1 LN:8875
+ at SQ SN:KI521102.1 LN:8872
+ at SQ SN:AYCK01029494.1 LN:8866
+ at SQ SN:KI521104.1 LN:8823
+ at SQ SN:KI521106.1 LN:8817
+ at SQ SN:KI521116.1 LN:8796
+ at SQ SN:AYCK01029495.1 LN:8781
+ at SQ SN:AYCK01029496.1 LN:8758
+ at SQ SN:AYCK01028067.1 LN:8738
+ at SQ SN:KI521108.1 LN:8730
+ at SQ SN:KI521103.1 LN:8727
+ at SQ SN:KI521109.1 LN:8698
+ at SQ SN:KI521113.1 LN:8694
+ at SQ SN:AYCK01029497.1 LN:8687
+ at SQ SN:KI521112.1 LN:8615
+ at SQ SN:KI521110.1 LN:8592
+ at SQ SN:AYCK01029498.1 LN:8592
+ at SQ SN:AYCK01029499.1 LN:8578
+ at SQ SN:AYCK01029500.1 LN:8575
+ at SQ SN:KI521111.1 LN:8556
+ at SQ SN:KI521114.1 LN:8529
+ at SQ SN:AYCK01029501.1 LN:8439
+ at SQ SN:KI521115.1 LN:8435
+ at SQ SN:KI521118.1 LN:8402
+ at SQ SN:AYCK01029502.1 LN:8395
+ at SQ SN:KI521122.1 LN:8369
+ at SQ SN:AYCK01029503.1 LN:8363
+ at SQ SN:AYCK01029504.1 LN:8356
+ at SQ SN:AYCK01029505.1 LN:8355
+ at SQ SN:KI521121.1 LN:8333
+ at SQ SN:AYCK01028103.1 LN:8332
+ at SQ SN:KI521149.1 LN:8301
+ at SQ SN:KI521125.1 LN:8285
+ at SQ SN:AYCK01029506.1 LN:8252
+ at SQ SN:AYCK01028117.1 LN:8249
+ at SQ SN:KI521117.1 LN:8234
+ at SQ SN:KI521120.1 LN:8232
+ at SQ SN:KI521129.1 LN:8229
+ at SQ SN:KI521119.1 LN:8203
+ at SQ SN:KI521126.1 LN:8177
+ at SQ SN:AYCK01029507.1 LN:8173
+ at SQ SN:KI521130.1 LN:8163
+ at SQ SN:AYCK01029508.1 LN:8158
+ at SQ SN:AYCK01029509.1 LN:8155
+ at SQ SN:AYCK01029510.1 LN:8154
+ at SQ SN:AYCK01029511.1 LN:8147
+ at SQ SN:KI521123.1 LN:8145
+ at SQ SN:AYCK01029512.1 LN:8136
+ at SQ SN:AYCK01028135.1 LN:8133
+ at SQ SN:AYCK01028136.1 LN:8133
+ at SQ SN:AYCK01028137.1 LN:8132
+ at SQ SN:KI521269.1 LN:8112
+ at SQ SN:KI521124.1 LN:8111
+ at SQ SN:KI521132.1 LN:8092
+ at SQ SN:KI521145.1 LN:8074
+ at SQ SN:KI521135.1 LN:8062
+ at SQ SN:AYCK01029513.1 LN:8061
+ at SQ SN:AYCK01029514.1 LN:8060
+ at SQ SN:AYCK01029515.1 LN:8054
+ at SQ SN:AYCK01029516.1 LN:8054
+ at SQ SN:KI521136.1 LN:8048
+ at SQ SN:AYCK01029517.1 LN:8040
+ at SQ SN:KI521134.1 LN:8029
+ at SQ SN:KI521133.1 LN:8027
+ at SQ SN:AYCK01029518.1 LN:7989
+ at SQ SN:AYCK01029519.1 LN:7952
+ at SQ SN:AYCK01029520.1 LN:7940
+ at SQ SN:KI521128.1 LN:7937
+ at SQ SN:KI521137.1 LN:7925
+ at SQ SN:KI521138.1 LN:7921
+ at SQ SN:AYCK01029521.1 LN:7892
+ at SQ SN:KI521141.1 LN:7891
+ at SQ SN:AYCK01029522.1 LN:7849
+ at SQ SN:AYCK01029523.1 LN:7815
+ at SQ SN:AYCK01029524.1 LN:7804
+ at SQ SN:KI521175.1 LN:7792
+ at SQ SN:KI521139.1 LN:7788
+ at SQ SN:AYCK01029525.1 LN:7773
+ at SQ SN:AYCK01029526.1 LN:7759
+ at SQ SN:AYCK01029527.1 LN:7746
+ at SQ SN:AYCK01029528.1 LN:7726
+ at SQ SN:AYCK01029529.1 LN:7722
+ at SQ SN:AYCK01029530.1 LN:7706
+ at SQ SN:KI521140.1 LN:7705
+ at SQ SN:KI521164.1 LN:7698
+ at SQ SN:AYCK01029531.1 LN:7696
+ at SQ SN:AYCK01029532.1 LN:7691
+ at SQ SN:AYCK01029533.1 LN:7672
+ at SQ SN:AYCK01029534.1 LN:7665
+ at SQ SN:KI521147.1 LN:7657
+ at SQ SN:KI521160.1 LN:7616
+ at SQ SN:KI521146.1 LN:7605
+ at SQ SN:AYCK01029535.1 LN:7551
+ at SQ SN:KI521230.1 LN:7545
+ at SQ SN:AYCK01029536.1 LN:7538
+ at SQ SN:AYCK01029537.1 LN:7532
+ at SQ SN:AYCK01029538.1 LN:7516
+ at SQ SN:AYCK01029539.1 LN:7504
+ at SQ SN:AYCK01029540.1 LN:7504
+ at SQ SN:AYCK01029541.1 LN:7502
+ at SQ SN:KI521154.1 LN:7499
+ at SQ SN:KI521260.1 LN:7497
+ at SQ SN:AYCK01029542.1 LN:7496
+ at SQ SN:KI521155.1 LN:7495
+ at SQ SN:AYCK01029543.1 LN:7491
+ at SQ SN:AYCK01029544.1 LN:7474
+ at SQ SN:KI521153.1 LN:7473
+ at SQ SN:AYCK01029545.1 LN:7471
+ at SQ SN:AYCK01029546.1 LN:7469
+ at SQ SN:AYCK01029547.1 LN:7460
+ at SQ SN:KI521158.1 LN:7455
+ at SQ SN:AYCK01029548.1 LN:7441
+ at SQ SN:AYCK01029549.1 LN:7435
+ at SQ SN:AYCK01028195.1 LN:7433
+ at SQ SN:AYCK01029550.1 LN:7429
+ at SQ SN:AYCK01029551.1 LN:7424
+ at SQ SN:KI521156.1 LN:7386
+ at SQ SN:AYCK01029552.1 LN:7334
+ at SQ SN:AYCK01029553.1 LN:7323
+ at SQ SN:AYCK01029554.1 LN:7314
+ at SQ SN:KI521157.1 LN:7309
+ at SQ SN:AYCK01029555.1 LN:7299
+ at SQ SN:AYCK01029556.1 LN:7291
+ at SQ SN:KI521290.1 LN:7289
+ at SQ SN:AYCK01029557.1 LN:7289
+ at SQ SN:KI521165.1 LN:7284
+ at SQ SN:AYCK01029558.1 LN:7263
+ at SQ SN:KI521177.1 LN:7233
+ at SQ SN:KI521176.1 LN:7212
+ at SQ SN:AYCK01029559.1 LN:7211
+ at SQ SN:AYCK01029560.1 LN:7200
+ at SQ SN:KI521163.1 LN:7199
+ at SQ SN:AYCK01029561.1 LN:7185
+ at SQ SN:AYCK01029562.1 LN:7181
+ at SQ SN:AYCK01029563.1 LN:7181
+ at SQ SN:KI521170.1 LN:7173
+ at SQ SN:AYCK01029564.1 LN:7166
+ at SQ SN:AYCK01029565.1 LN:7164
+ at SQ SN:KI521152.1 LN:7156
+ at SQ SN:AYCK01029566.1 LN:7147
+ at SQ SN:KI521131.1 LN:7146
+ at SQ SN:AYCK01029567.1 LN:7146
+ at SQ SN:KI521183.1 LN:7114
+ at SQ SN:KI521167.1 LN:7101
+ at SQ SN:AYCK01029568.1 LN:7101
+ at SQ SN:AYCK01029569.1 LN:7089
+ at SQ SN:KI521168.1 LN:7088
+ at SQ SN:KI521174.1 LN:7083
+ at SQ SN:AYCK01029570.1 LN:7038
+ at SQ SN:KI521191.1 LN:7035
+ at SQ SN:AYCK01029571.1 LN:7035
+ at SQ SN:AYCK01029572.1 LN:7033
+ at SQ SN:AYCK01029573.1 LN:7033
+ at SQ SN:KI521249.1 LN:7018
+ at SQ SN:AYCK01029574.1 LN:6999
+ at SQ SN:KI521169.1 LN:6995
+ at SQ SN:KI521173.1 LN:6982
+ at SQ SN:AYCK01029575.1 LN:6976
+ at SQ SN:AYCK01029576.1 LN:6963
+ at SQ SN:AYCK01029577.1 LN:6956
+ at SQ SN:KI521159.1 LN:6947
+ at SQ SN:AYCK01029578.1 LN:6946
+ at SQ SN:AYCK01029579.1 LN:6946
+ at SQ SN:AYCK01029580.1 LN:6937
+ at SQ SN:KI521224.1 LN:6928
+ at SQ SN:KI521180.1 LN:6921
+ at SQ SN:KI521181.1 LN:6910
+ at SQ SN:AYCK01029581.1 LN:6891
+ at SQ SN:KI521220.1 LN:6888
+ at SQ SN:KI521178.1 LN:6870
+ at SQ SN:AYCK01029582.1 LN:6818
+ at SQ SN:AYCK01029583.1 LN:6793
+ at SQ SN:AYCK01029584.1 LN:6757
+ at SQ SN:KI521166.1 LN:6725
+ at SQ SN:KI521150.1 LN:6713
+ at SQ SN:KI521179.1 LN:6702
+ at SQ SN:KI521187.1 LN:6689
+ at SQ SN:KI521185.1 LN:6686
+ at SQ SN:KI521197.1 LN:6686
+ at SQ SN:AYCK01029585.1 LN:6666
+ at SQ SN:KI521188.1 LN:6665
+ at SQ SN:AYCK01029586.1 LN:6664
+ at SQ SN:AYCK01029587.1 LN:6663
+ at SQ SN:AYCK01029588.1 LN:6654
+ at SQ SN:AYCK01029589.1 LN:6654
+ at SQ SN:AYCK01029590.1 LN:6654
+ at SQ SN:AYCK01029591.1 LN:6652
+ at SQ SN:KI521186.1 LN:6650
+ at SQ SN:AYCK01029592.1 LN:6634
+ at SQ SN:KI521190.1 LN:6628
+ at SQ SN:KI521198.1 LN:6620
+ at SQ SN:AYCK01029593.1 LN:6618
+ at SQ SN:KI521182.1 LN:6616
+ at SQ SN:AYCK01029594.1 LN:6606
+ at SQ SN:AYCK01029595.1 LN:6585
+ at SQ SN:AYCK01028268.1 LN:6571
+ at SQ SN:AYCK01028269.1 LN:6570
+ at SQ SN:AYCK01028270.1 LN:6570
+ at SQ SN:AYCK01029596.1 LN:6567
+ at SQ SN:KI521284.1 LN:6560
+ at SQ SN:KI521193.1 LN:6550
+ at SQ SN:AYCK01028271.1 LN:6542
+ at SQ SN:AYCK01028272.1 LN:6526
+ at SQ SN:KI521195.1 LN:6519
+ at SQ SN:AYCK01029597.1 LN:6518
+ at SQ SN:AYCK01029598.1 LN:6518
+ at SQ SN:KI521194.1 LN:6514
+ at SQ SN:AYCK01029599.1 LN:6504
+ at SQ SN:AYCK01029600.1 LN:6492
+ at SQ SN:AYCK01029601.1 LN:6478
+ at SQ SN:AYCK01029602.1 LN:6461
+ at SQ SN:AYCK01029603.1 LN:6445
+ at SQ SN:AYCK01029604.1 LN:6432
+ at SQ SN:KI521196.1 LN:6420
+ at SQ SN:AYCK01029605.1 LN:6418
+ at SQ SN:KI521229.1 LN:6406
+ at SQ SN:KI521189.1 LN:6396
+ at SQ SN:AYCK01028287.1 LN:6395
+ at SQ SN:AYCK01029606.1 LN:6376
+ at SQ SN:KI521211.1 LN:6375
+ at SQ SN:KI521199.1 LN:6372
+ at SQ SN:KI521201.1 LN:6331
+ at SQ SN:KI521192.1 LN:6321
+ at SQ SN:AYCK01029607.1 LN:6320
+ at SQ SN:KI521184.1 LN:6295
+ at SQ SN:AYCK01029608.1 LN:6291
+ at SQ SN:KI521202.1 LN:6285
+ at SQ SN:AYCK01029609.1 LN:6284
+ at SQ SN:KI521203.1 LN:6269
+ at SQ SN:KI521204.1 LN:6268
+ at SQ SN:AYCK01029610.1 LN:6260
+ at SQ SN:AYCK01029611.1 LN:6250
+ at SQ SN:KI521223.1 LN:6248
+ at SQ SN:AYCK01029612.1 LN:6219
+ at SQ SN:KI521200.1 LN:6212
+ at SQ SN:AYCK01029613.1 LN:6212
+ at SQ SN:KI521208.1 LN:6180
+ at SQ SN:KI521205.1 LN:6169
+ at SQ SN:AYCK01029614.1 LN:6153
+ at SQ SN:AYCK01029615.1 LN:6147
+ at SQ SN:KI521212.1 LN:6139
+ at SQ SN:AYCK01029616.1 LN:6097
+ at SQ SN:AYCK01029617.1 LN:6096
+ at SQ SN:AYCK01029618.1 LN:6096
+ at SQ SN:KI521213.1 LN:6074
+ at SQ SN:KI521209.1 LN:6070
+ at SQ SN:KI521207.1 LN:6020
+ at SQ SN:KI521214.1 LN:6019
+ at SQ SN:KI521219.1 LN:6014
+ at SQ SN:KI521218.1 LN:5996
+ at SQ SN:AYCK01029619.1 LN:5992
+ at SQ SN:AYCK01028328.1 LN:5990
+ at SQ SN:KI521210.1 LN:5989
+ at SQ SN:KI521304.1 LN:5983
+ at SQ SN:AYCK01029620.1 LN:5978
+ at SQ SN:KI521238.1 LN:5974
+ at SQ SN:AYCK01029621.1 LN:5962
+ at SQ SN:AYCK01029622.1 LN:5960
+ at SQ SN:AYCK01029623.1 LN:5959
+ at SQ SN:AYCK01029624.1 LN:5954
+ at SQ SN:AYCK01029625.1 LN:5953
+ at SQ SN:KI521221.1 LN:5942
+ at SQ SN:AYCK01029626.1 LN:5933
+ at SQ SN:AYCK01029627.1 LN:5930
+ at SQ SN:AYCK01029628.1 LN:5918
+ at SQ SN:KI521231.1 LN:5902
+ at SQ SN:AYCK01029629.1 LN:5897
+ at SQ SN:KI521228.1 LN:5895
+ at SQ SN:AYCK01028340.1 LN:5882
+ at SQ SN:AYCK01029630.1 LN:5882
+ at SQ SN:AYCK01029631.1 LN:5878
+ at SQ SN:AYCK01029632.1 LN:5871
+ at SQ SN:AYCK01028341.1 LN:5868
+ at SQ SN:KI521215.1 LN:5868
+ at SQ SN:AYCK01029633.1 LN:5860
+ at SQ SN:AYCK01029634.1 LN:5850
+ at SQ SN:AYCK01028342.1 LN:5849
+ at SQ SN:AYCK01028343.1 LN:5849
+ at SQ SN:KI521227.1 LN:5847
+ at SQ SN:KI521206.1 LN:5844
+ at SQ SN:KI521232.1 LN:5842
+ at SQ SN:AYCK01029635.1 LN:5841
+ at SQ SN:KI521349.1 LN:5820
+ at SQ SN:AYCK01028346.1 LN:5816
+ at SQ SN:AYCK01029636.1 LN:5813
+ at SQ SN:AYCK01029637.1 LN:5800
+ at SQ SN:KI521272.1 LN:5789
+ at SQ SN:KI521235.1 LN:5785
+ at SQ SN:KI521275.1 LN:5782
+ at SQ SN:AYCK01028350.1 LN:5780
+ at SQ SN:AYCK01029638.1 LN:5780
+ at SQ SN:AYCK01029639.1 LN:5772
+ at SQ SN:AYCK01029640.1 LN:5771
+ at SQ SN:KI521217.1 LN:5756
+ at SQ SN:AYCK01029641.1 LN:5744
+ at SQ SN:KI521222.1 LN:5739
+ at SQ SN:AYCK01028353.1 LN:5738
+ at SQ SN:AYCK01029642.1 LN:5725
+ at SQ SN:KI521241.1 LN:5717
+ at SQ SN:KI521233.1 LN:5704
+ at SQ SN:KI521226.1 LN:5703
+ at SQ SN:KI521344.1 LN:5701
+ at SQ SN:AYCK01029643.1 LN:5697
+ at SQ SN:AYCK01029644.1 LN:5683
+ at SQ SN:AYCK01029645.1 LN:5675
+ at SQ SN:KI521225.1 LN:5673
+ at SQ SN:AYCK01029646.1 LN:5672
+ at SQ SN:AYCK01029647.1 LN:5665
+ at SQ SN:KI521236.1 LN:5661
+ at SQ SN:KI521244.1 LN:5660
+ at SQ SN:AYCK01029648.1 LN:5658
+ at SQ SN:AYCK01029649.1 LN:5645
+ at SQ SN:KI521216.1 LN:5642
+ at SQ SN:AYCK01028362.1 LN:5640
+ at SQ SN:AYCK01028363.1 LN:5640
+ at SQ SN:AYCK01029650.1 LN:5639
+ at SQ SN:AYCK01029651.1 LN:5636
+ at SQ SN:KI521247.1 LN:5618
+ at SQ SN:KI521243.1 LN:5606
+ at SQ SN:KI521248.1 LN:5605
+ at SQ SN:KI521357.1 LN:5593
+ at SQ SN:KI521239.1 LN:5589
+ at SQ SN:AYCK01029652.1 LN:5584
+ at SQ SN:AYCK01029653.1 LN:5560
+ at SQ SN:AYCK01029654.1 LN:5545
+ at SQ SN:AYCK01029655.1 LN:5528
+ at SQ SN:KI521240.1 LN:5522
+ at SQ SN:KI521252.1 LN:5511
+ at SQ SN:KI521258.1 LN:5501
+ at SQ SN:AYCK01029656.1 LN:5495
+ at SQ SN:KI521261.1 LN:5482
+ at SQ SN:KI521262.1 LN:5472
+ at SQ SN:AYCK01028384.1 LN:5464
+ at SQ SN:KI521234.1 LN:5462
+ at SQ SN:KI521264.1 LN:5453
+ at SQ SN:AYCK01029657.1 LN:5445
+ at SQ SN:KI521245.1 LN:5444
+ at SQ SN:AYCK01029658.1 LN:5442
+ at SQ SN:KI521254.1 LN:5438
+ at SQ SN:AYCK01029659.1 LN:5413
+ at SQ SN:AYCK01029660.1 LN:5407
+ at SQ SN:KI521255.1 LN:5392
+ at SQ SN:KI521259.1 LN:5387
+ at SQ SN:KI521268.1 LN:5378
+ at SQ SN:KI521251.1 LN:5368
+ at SQ SN:AYCK01029661.1 LN:5367
+ at SQ SN:AYCK01029662.1 LN:5366
+ at SQ SN:KI521266.1 LN:5362
+ at SQ SN:KI521257.1 LN:5359
+ at SQ SN:AYCK01029663.1 LN:5358
+ at SQ SN:AYCK01029664.1 LN:5357
+ at SQ SN:AYCK01029665.1 LN:5357
+ at SQ SN:AYCK01029666.1 LN:5355
+ at SQ SN:AYCK01029667.1 LN:5349
+ at SQ SN:KI521270.1 LN:5346
+ at SQ SN:AYCK01029668.1 LN:5340
+ at SQ SN:KI521237.1 LN:5333
+ at SQ SN:KI521273.1 LN:5327
+ at SQ SN:KI521280.1 LN:5316
+ at SQ SN:KI521265.1 LN:5297
+ at SQ SN:AYCK01028395.1 LN:5289
+ at SQ SN:KI521253.1 LN:5288
+ at SQ SN:AYCK01029669.1 LN:5283
+ at SQ SN:AYCK01028400.1 LN:5281
+ at SQ SN:AYCK01029670.1 LN:5281
+ at SQ SN:AYCK01029671.1 LN:5278
+ at SQ SN:AYCK01029672.1 LN:5275
+ at SQ SN:KI521317.1 LN:5268
+ at SQ SN:AYCK01029673.1 LN:5264
+ at SQ SN:KI521250.1 LN:5262
+ at SQ SN:KI521274.1 LN:5258
+ at SQ SN:KI521256.1 LN:5250
+ at SQ SN:AYCK01029674.1 LN:5249
+ at SQ SN:AYCK01029675.1 LN:5231
+ at SQ SN:AYCK01029676.1 LN:5219
+ at SQ SN:AYCK01029677.1 LN:5213
+ at SQ SN:AYCK01029678.1 LN:5187
+ at SQ SN:AYCK01029679.1 LN:5167
+ at SQ SN:KI521287.1 LN:5148
+ at SQ SN:AYCK01029680.1 LN:5142
+ at SQ SN:KI521278.1 LN:5135
+ at SQ SN:KI521277.1 LN:5124
+ at SQ SN:AYCK01029681.1 LN:5115
+ at SQ SN:KI521300.1 LN:5112
+ at SQ SN:AYCK01029682.1 LN:5109
+ at SQ SN:AYCK01029683.1 LN:5103
+ at SQ SN:AYCK01029684.1 LN:5097
+ at SQ SN:AYCK01029685.1 LN:5087
+ at SQ SN:KI521271.1 LN:5061
+ at SQ SN:KI521315.1 LN:5054
+ at SQ SN:KI521279.1 LN:5041
+ at SQ SN:AYCK01029686.1 LN:5025
+ at SQ SN:AYCK01029687.1 LN:5005
+ at SQ SN:KI521276.1 LN:5003
+ at SQ SN:AYCK01029688.1 LN:4988
+ at SQ SN:KI521288.1 LN:4987
+ at SQ SN:AYCK01029689.1 LN:4981
+ at SQ SN:AYCK01029690.1 LN:4980
+ at SQ SN:AYCK01029691.1 LN:4975
+ at SQ SN:AYCK01028453.1 LN:4934
+ at SQ SN:AYCK01029692.1 LN:4929
+ at SQ SN:AYCK01028456.1 LN:4913
+ at SQ SN:KI521289.1 LN:4910
+ at SQ SN:KI521263.1 LN:4899
+ at SQ SN:KI521281.1 LN:4878
+ at SQ SN:AYCK01029693.1 LN:4868
+ at SQ SN:AYCK01029694.1 LN:4865
+ at SQ SN:AYCK01029695.1 LN:4863
+ at SQ SN:AYCK01029696.1 LN:4862
+ at SQ SN:AYCK01029697.1 LN:4854
+ at SQ SN:AYCK01029698.1 LN:4851
+ at SQ SN:AYCK01029699.1 LN:4849
+ at SQ SN:AYCK01029700.1 LN:4841
+ at SQ SN:AYCK01029701.1 LN:4841
+ at SQ SN:AYCK01029702.1 LN:4836
+ at SQ SN:KI521246.1 LN:4828
+ at SQ SN:AYCK01029703.1 LN:4825
+ at SQ SN:KI521292.1 LN:4814
+ at SQ SN:KI521295.1 LN:4811
+ at SQ SN:KI521285.1 LN:4800
+ at SQ SN:AYCK01029704.1 LN:4800
+ at SQ SN:KI521298.1 LN:4772
+ at SQ SN:AYCK01029705.1 LN:4751
+ at SQ SN:KI521360.1 LN:4739
+ at SQ SN:KI521301.1 LN:4738
+ at SQ SN:AYCK01029706.1 LN:4737
+ at SQ SN:AYCK01029707.1 LN:4736
+ at SQ SN:AYCK01029708.1 LN:4732
+ at SQ SN:KI521299.1 LN:4723
+ at SQ SN:KI521294.1 LN:4716
+ at SQ SN:KI521283.1 LN:4690
+ at SQ SN:AYCK01029709.1 LN:4690
+ at SQ SN:AYCK01029710.1 LN:4684
+ at SQ SN:AYCK01029711.1 LN:4683
+ at SQ SN:AYCK01029712.1 LN:4669
+ at SQ SN:AYCK01029713.1 LN:4664
+ at SQ SN:AYCK01029714.1 LN:4654
+ at SQ SN:AYCK01029715.1 LN:4653
+ at SQ SN:KI521267.1 LN:4650
+ at SQ SN:AYCK01029716.1 LN:4646
+ at SQ SN:KI521297.1 LN:4645
+ at SQ SN:KI521291.1 LN:4644
+ at SQ SN:KI521293.1 LN:4640
+ at SQ SN:AYCK01029717.1 LN:4629
+ at SQ SN:AYCK01028502.1 LN:4615
+ at SQ SN:AYCK01029718.1 LN:4614
+ at SQ SN:AYCK01029719.1 LN:4608
+ at SQ SN:KI521282.1 LN:4594
+ at SQ SN:AYCK01029720.1 LN:4572
+ at SQ SN:KI521306.1 LN:4569
+ at SQ SN:AYCK01029721.1 LN:4567
+ at SQ SN:AYCK01029722.1 LN:4563
+ at SQ SN:AYCK01029723.1 LN:4561
+ at SQ SN:AYCK01029724.1 LN:4557
+ at SQ SN:AYCK01028514.1 LN:4545
+ at SQ SN:AYCK01029725.1 LN:4541
+ at SQ SN:AYCK01029726.1 LN:4534
+ at SQ SN:AYCK01029727.1 LN:4534
+ at SQ SN:KI521305.1 LN:4512
+ at SQ SN:KI521303.1 LN:4504
+ at SQ SN:AYCK01029728.1 LN:4503
+ at SQ SN:KI521308.1 LN:4500
+ at SQ SN:AYCK01029729.1 LN:4500
+ at SQ SN:AYCK01028523.1 LN:4492
+ at SQ SN:AYCK01029730.1 LN:4492
+ at SQ SN:KI521310.1 LN:4488
+ at SQ SN:KI521296.1 LN:4485
+ at SQ SN:KI521302.1 LN:4478
+ at SQ SN:AYCK01029731.1 LN:4467
+ at SQ SN:KI521319.1 LN:4456
+ at SQ SN:AYCK01028542.1 LN:4454
+ at SQ SN:KI521313.1 LN:4453
+ at SQ SN:AYCK01029732.1 LN:4445
+ at SQ SN:AYCK01029733.1 LN:4444
+ at SQ SN:AYCK01029734.1 LN:4444
+ at SQ SN:AYCK01029735.1 LN:4437
+ at SQ SN:AYCK01029736.1 LN:4434
+ at SQ SN:AYCK01029737.1 LN:4427
+ at SQ SN:AYCK01029738.1 LN:4427
+ at SQ SN:AYCK01029739.1 LN:4425
+ at SQ SN:KI521312.1 LN:4424
+ at SQ SN:KI521318.1 LN:4412
+ at SQ SN:AYCK01029740.1 LN:4409
+ at SQ SN:AYCK01029741.1 LN:4407
+ at SQ SN:KI521324.1 LN:4394
+ at SQ SN:KI521326.1 LN:4381
+ at SQ SN:AYCK01029742.1 LN:4381
+ at SQ SN:AYCK01029743.1 LN:4371
+ at SQ SN:KI521307.1 LN:4369
+ at SQ SN:AYCK01029744.1 LN:4369
+ at SQ SN:AYCK01029745.1 LN:4367
+ at SQ SN:AYCK01029746.1 LN:4361
+ at SQ SN:AYCK01029747.1 LN:4352
+ at SQ SN:AYCK01029748.1 LN:4350
+ at SQ SN:AYCK01029749.1 LN:4337
+ at SQ SN:AYCK01028563.1 LN:4332
+ at SQ SN:KI521320.1 LN:4328
+ at SQ SN:KI521331.1 LN:4325
+ at SQ SN:AYCK01029750.1 LN:4315
+ at SQ SN:AYCK01029751.1 LN:4308
+ at SQ SN:AYCK01029752.1 LN:4300
+ at SQ SN:AYCK01028566.1 LN:4295
+ at SQ SN:KI521327.1 LN:4292
+ at SQ SN:KI521323.1 LN:4285
+ at SQ SN:KI521309.1 LN:4277
+ at SQ SN:KI521321.1 LN:4275
+ at SQ SN:KI521322.1 LN:4269
+ at SQ SN:AYCK01029753.1 LN:4258
+ at SQ SN:AYCK01029754.1 LN:4257
+ at SQ SN:AYCK01029755.1 LN:4251
+ at SQ SN:KI521329.1 LN:4249
+ at SQ SN:AYCK01029756.1 LN:4247
+ at SQ SN:AYCK01029757.1 LN:4243
+ at SQ SN:AYCK01029758.1 LN:4238
+ at SQ SN:KI521400.1 LN:4213
+ at SQ SN:AYCK01029759.1 LN:4204
+ at SQ SN:AYCK01029760.1 LN:4201
+ at SQ SN:AYCK01029761.1 LN:4195
+ at SQ SN:KI521341.1 LN:4192
+ at SQ SN:AYCK01029762.1 LN:4184
+ at SQ SN:AYCK01029763.1 LN:4184
+ at SQ SN:AYCK01029764.1 LN:4176
+ at SQ SN:AYCK01029765.1 LN:4175
+ at SQ SN:AYCK01029766.1 LN:4169
+ at SQ SN:AYCK01029767.1 LN:4169
+ at SQ SN:AYCK01029768.1 LN:4167
+ at SQ SN:AYCK01029769.1 LN:4163
+ at SQ SN:AYCK01029770.1 LN:4158
+ at SQ SN:AYCK01029771.1 LN:4155
+ at SQ SN:KI521325.1 LN:4154
+ at SQ SN:KI521314.1 LN:4151
+ at SQ SN:KI521338.1 LN:4146
+ at SQ SN:KI521348.1 LN:4143
+ at SQ SN:AYCK01029772.1 LN:4143
+ at SQ SN:AYCK01029773.1 LN:4135
+ at SQ SN:AYCK01029774.1 LN:4132
+ at SQ SN:AYCK01029775.1 LN:4128
+ at SQ SN:KI521345.1 LN:4122
+ at SQ SN:AYCK01029776.1 LN:4119
+ at SQ SN:KI521337.1 LN:4112
+ at SQ SN:AYCK01029777.1 LN:4093
+ at SQ SN:AYCK01028585.1 LN:4087
+ at SQ SN:AYCK01028586.1 LN:4079
+ at SQ SN:AYCK01029778.1 LN:4076
+ at SQ SN:AYCK01029779.1 LN:4066
+ at SQ SN:KI521355.1 LN:4060
+ at SQ SN:KI521339.1 LN:4057
+ at SQ SN:KI521354.1 LN:4053
+ at SQ SN:AYCK01028591.1 LN:4046
+ at SQ SN:AYCK01029780.1 LN:4046
+ at SQ SN:AYCK01029781.1 LN:4045
+ at SQ SN:KI521330.1 LN:4043
+ at SQ SN:KI521286.1 LN:4037
+ at SQ SN:AYCK01029782.1 LN:4033
+ at SQ SN:KI521356.1 LN:4032
+ at SQ SN:AYCK01029783.1 LN:4030
+ at SQ SN:KI521407.1 LN:4026
+ at SQ SN:KI521332.1 LN:4022
+ at SQ SN:AYCK01029784.1 LN:4018
+ at SQ SN:AYCK01029785.1 LN:4011
+ at SQ SN:KI521350.1 LN:4006
+ at SQ SN:KI521328.1 LN:4005
+ at SQ SN:AYCK01029786.1 LN:3998
+ at SQ SN:KI521361.1 LN:3996
+ at SQ SN:AYCK01029787.1 LN:3988
+ at SQ SN:AYCK01029788.1 LN:3981
+ at SQ SN:AYCK01029789.1 LN:3977
+ at SQ SN:KI521359.1 LN:3973
+ at SQ SN:AYCK01029790.1 LN:3965
+ at SQ SN:KI521358.1 LN:3961
+ at SQ SN:AYCK01029791.1 LN:3961
+ at SQ SN:KI521343.1 LN:3951
+ at SQ SN:AYCK01029792.1 LN:3951
+ at SQ SN:AYCK01029793.1 LN:3950
+ at SQ SN:KI521342.1 LN:3948
+ at SQ SN:AYCK01029794.1 LN:3945
+ at SQ SN:KI521369.1 LN:3944
+ at SQ SN:AYCK01029795.1 LN:3937
+ at SQ SN:KI521370.1 LN:3936
+ at SQ SN:KI521367.1 LN:3929
+ at SQ SN:AYCK01029796.1 LN:3929
+ at SQ SN:AYCK01029797.1 LN:3925
+ at SQ SN:KI521362.1 LN:3921
+ at SQ SN:AYCK01029798.1 LN:3919
+ at SQ SN:KI521352.1 LN:3916
+ at SQ SN:AYCK01029799.1 LN:3912
+ at SQ SN:KI521340.1 LN:3906
+ at SQ SN:AYCK01029800.1 LN:3899
+ at SQ SN:KI521351.1 LN:3898
+ at SQ SN:AYCK01029801.1 LN:3896
+ at SQ SN:KI521347.1 LN:3892
+ at SQ SN:KI521427.1 LN:3883
+ at SQ SN:AYCK01028610.1 LN:3882
+ at SQ SN:KI521378.1 LN:3882
+ at SQ SN:KI521346.1 LN:3879
+ at SQ SN:AYCK01029802.1 LN:3876
+ at SQ SN:AYCK01029803.1 LN:3876
+ at SQ SN:AYCK01029804.1 LN:3874
+ at SQ SN:AYCK01029805.1 LN:3869
+ at SQ SN:AYCK01029806.1 LN:3865
+ at SQ SN:AYCK01028611.1 LN:3861
+ at SQ SN:AYCK01028612.1 LN:3861
+ at SQ SN:KI521353.1 LN:3857
+ at SQ SN:KI521379.1 LN:3857
+ at SQ SN:AYCK01029807.1 LN:3854
+ at SQ SN:AYCK01029808.1 LN:3831
+ at SQ SN:KI521377.1 LN:3830
+ at SQ SN:KI521366.1 LN:3815
+ at SQ SN:AYCK01029809.1 LN:3813
+ at SQ SN:KI521373.1 LN:3808
+ at SQ SN:KI521381.1 LN:3800
+ at SQ SN:KI521372.1 LN:3797
+ at SQ SN:AYCK01029810.1 LN:3797
+ at SQ SN:KI521334.1 LN:3796
+ at SQ SN:AYCK01029811.1 LN:3791
+ at SQ SN:AYCK01029812.1 LN:3790
+ at SQ SN:AYCK01029813.1 LN:3789
+ at SQ SN:KI521374.1 LN:3787
+ at SQ SN:AYCK01029814.1 LN:3787
+ at SQ SN:AYCK01029815.1 LN:3786
+ at SQ SN:AYCK01029816.1 LN:3780
+ at SQ SN:KI521385.1 LN:3779
+ at SQ SN:AYCK01028627.1 LN:3773
+ at SQ SN:AYCK01028632.1 LN:3770
+ at SQ SN:AYCK01029817.1 LN:3768
+ at SQ SN:KI521386.1 LN:3766
+ at SQ SN:KI521375.1 LN:3765
+ at SQ SN:AYCK01029818.1 LN:3741
+ at SQ SN:AYCK01029819.1 LN:3741
+ at SQ SN:AYCK01029820.1 LN:3738
+ at SQ SN:AYCK01029821.1 LN:3729
+ at SQ SN:KI521368.1 LN:3726
+ at SQ SN:KI521393.1 LN:3714
+ at SQ SN:KI521390.1 LN:3713
+ at SQ SN:AYCK01029822.1 LN:3707
+ at SQ SN:AYCK01029823.1 LN:3707
+ at SQ SN:AYCK01029824.1 LN:3702
+ at SQ SN:AYCK01029825.1 LN:3701
+ at SQ SN:KI521371.1 LN:3700
+ at SQ SN:KI521388.1 LN:3694
+ at SQ SN:KI521363.1 LN:3693
+ at SQ SN:AYCK01029826.1 LN:3693
+ at SQ SN:KI521333.1 LN:3692
+ at SQ SN:AYCK01029827.1 LN:3684
+ at SQ SN:KI521383.1 LN:3681
+ at SQ SN:AYCK01028646.1 LN:3679
+ at SQ SN:AYCK01029828.1 LN:3674
+ at SQ SN:KI521397.1 LN:3662
+ at SQ SN:KI521365.1 LN:3661
+ at SQ SN:AYCK01029829.1 LN:3661
+ at SQ SN:AYCK01029830.1 LN:3661
+ at SQ SN:AYCK01029831.1 LN:3656
+ at SQ SN:KI521395.1 LN:3653
+ at SQ SN:AYCK01029832.1 LN:3652
+ at SQ SN:AYCK01029833.1 LN:3643
+ at SQ SN:AYCK01029834.1 LN:3639
+ at SQ SN:KI521376.1 LN:3637
+ at SQ SN:KI521394.1 LN:3635
+ at SQ SN:KI521336.1 LN:3631
+ at SQ SN:AYCK01029835.1 LN:3630
+ at SQ SN:KI521364.1 LN:3628
+ at SQ SN:AYCK01029836.1 LN:3627
+ at SQ SN:AYCK01029837.1 LN:3625
+ at SQ SN:AYCK01029838.1 LN:3618
+ at SQ SN:AYCK01029839.1 LN:3609
+ at SQ SN:KI521391.1 LN:3608
+ at SQ SN:AYCK01029840.1 LN:3608
+ at SQ SN:KI521384.1 LN:3604
+ at SQ SN:AYCK01029841.1 LN:3604
+ at SQ SN:AYCK01029842.1 LN:3595
+ at SQ SN:AYCK01029843.1 LN:3589
+ at SQ SN:AYCK01029844.1 LN:3581
+ at SQ SN:KI521402.1 LN:3578
+ at SQ SN:KI521405.1 LN:3577
+ at SQ SN:KI521404.1 LN:3574
+ at SQ SN:AYCK01028653.1 LN:3569
+ at SQ SN:AYCK01029845.1 LN:3569
+ at SQ SN:KI521471.1 LN:3562
+ at SQ SN:AYCK01029846.1 LN:3562
+ at SQ SN:AYCK01029847.1 LN:3555
+ at SQ SN:AYCK01029848.1 LN:3554
+ at SQ SN:AYCK01029849.1 LN:3552
+ at SQ SN:AYCK01029850.1 LN:3551
+ at SQ SN:KI521406.1 LN:3549
+ at SQ SN:KI521311.1 LN:3547
+ at SQ SN:KI521392.1 LN:3542
+ at SQ SN:AYCK01029851.1 LN:3542
+ at SQ SN:KI521403.1 LN:3539
+ at SQ SN:AYCK01028664.1 LN:3526
+ at SQ SN:AYCK01028665.1 LN:3524
+ at SQ SN:AYCK01029852.1 LN:3523
+ at SQ SN:AYCK01029853.1 LN:3521
+ at SQ SN:AYCK01029854.1 LN:3513
+ at SQ SN:AYCK01029855.1 LN:3513
+ at SQ SN:KI521396.1 LN:3509
+ at SQ SN:AYCK01029856.1 LN:3509
+ at SQ SN:KI521389.1 LN:3505
+ at SQ SN:AYCK01029857.1 LN:3504
+ at SQ SN:AYCK01028666.1 LN:3503
+ at SQ SN:AYCK01029858.1 LN:3501
+ at SQ SN:AYCK01029859.1 LN:3496
+ at SQ SN:AYCK01029860.1 LN:3492
+ at SQ SN:KI521335.1 LN:3488
+ at SQ SN:AYCK01029861.1 LN:3486
+ at SQ SN:AYCK01029862.1 LN:3483
+ at SQ SN:KI521410.1 LN:3480
+ at SQ SN:AYCK01029863.1 LN:3474
+ at SQ SN:AYCK01029864.1 LN:3465
+ at SQ SN:AYCK01029865.1 LN:3461
+ at SQ SN:AYCK01029866.1 LN:3460
+ at SQ SN:AYCK01029867.1 LN:3459
+ at SQ SN:AYCK01029868.1 LN:3458
+ at SQ SN:AYCK01029869.1 LN:3455
+ at SQ SN:AYCK01029870.1 LN:3454
+ at SQ SN:KI521408.1 LN:3448
+ at SQ SN:AYCK01029871.1 LN:3448
+ at SQ SN:KI521380.1 LN:3446
+ at SQ SN:KI521398.1 LN:3445
+ at SQ SN:AYCK01029872.1 LN:3442
+ at SQ SN:KI521415.1 LN:3438
+ at SQ SN:KI521401.1 LN:3433
+ at SQ SN:AYCK01028689.1 LN:3426
+ at SQ SN:KI521416.1 LN:3426
+ at SQ SN:AYCK01029873.1 LN:3420
+ at SQ SN:AYCK01029874.1 LN:3407
+ at SQ SN:AYCK01029875.1 LN:3406
+ at SQ SN:AYCK01029876.1 LN:3403
+ at SQ SN:AYCK01029877.1 LN:3394
+ at SQ SN:KI521387.1 LN:3389
+ at SQ SN:AYCK01029878.1 LN:3384
+ at SQ SN:AYCK01028698.1 LN:3380
+ at SQ SN:AYCK01029879.1 LN:3377
+ at SQ SN:KI521419.1 LN:3374
+ at SQ SN:KI521417.1 LN:3373
+ at SQ SN:AYCK01029880.1 LN:3364
+ at SQ SN:KI521414.1 LN:3360
+ at SQ SN:AYCK01029881.1 LN:3352
+ at SQ SN:AYCK01029882.1 LN:3335
+ at SQ SN:AYCK01029883.1 LN:3329
+ at SQ SN:AYCK01028705.1 LN:3326
+ at SQ SN:AYCK01029884.1 LN:3325
+ at SQ SN:AYCK01029885.1 LN:3324
+ at SQ SN:AYCK01029886.1 LN:3315
+ at SQ SN:AYCK01029887.1 LN:3315
+ at SQ SN:KI521399.1 LN:3311
+ at SQ SN:KI521461.1 LN:3306
+ at SQ SN:AYCK01029888.1 LN:3306
+ at SQ SN:AYCK01029889.1 LN:3306
+ at SQ SN:AYCK01029890.1 LN:3305
+ at SQ SN:AYCK01028712.1 LN:3300
+ at SQ SN:AYCK01028713.1 LN:3300
+ at SQ SN:AYCK01028716.1 LN:3296
+ at SQ SN:AYCK01029891.1 LN:3293
+ at SQ SN:KI521411.1 LN:3287
+ at SQ SN:AYCK01029892.1 LN:3285
+ at SQ SN:AYCK01028721.1 LN:3283
+ at SQ SN:AYCK01029893.1 LN:3279
+ at SQ SN:AYCK01029894.1 LN:3273
+ at SQ SN:AYCK01029895.1 LN:3272
+ at SQ SN:AYCK01029896.1 LN:3269
+ at SQ SN:AYCK01029897.1 LN:3264
+ at SQ SN:AYCK01029898.1 LN:3264
+ at SQ SN:AYCK01029899.1 LN:3263
+ at SQ SN:AYCK01029900.1 LN:3258
+ at SQ SN:AYCK01029901.1 LN:3256
+ at SQ SN:AYCK01029902.1 LN:3255
+ at SQ SN:AYCK01029903.1 LN:3252
+ at SQ SN:AYCK01029904.1 LN:3248
+ at SQ SN:AYCK01029905.1 LN:3246
+ at SQ SN:AYCK01029906.1 LN:3237
+ at SQ SN:KI521428.1 LN:3227
+ at SQ SN:KI521433.1 LN:3222
+ at SQ SN:KI521431.1 LN:3220
+ at SQ SN:KI521434.1 LN:3219
+ at SQ SN:KI521425.1 LN:3215
+ at SQ SN:KI521435.1 LN:3215
+ at SQ SN:AYCK01028734.1 LN:3213
+ at SQ SN:KI521421.1 LN:3212
+ at SQ SN:AYCK01029907.1 LN:3211
+ at SQ SN:AYCK01029908.1 LN:3211
+ at SQ SN:AYCK01029909.1 LN:3205
+ at SQ SN:KI521424.1 LN:3204
+ at SQ SN:AYCK01029910.1 LN:3204
+ at SQ SN:AYCK01028737.1 LN:3203
+ at SQ SN:AYCK01028738.1 LN:3201
+ at SQ SN:KI521422.1 LN:3200
+ at SQ SN:AYCK01029911.1 LN:3199
+ at SQ SN:AYCK01029912.1 LN:3198
+ at SQ SN:AYCK01029913.1 LN:3196
+ at SQ SN:AYCK01029914.1 LN:3191
+ at SQ SN:AYCK01029915.1 LN:3189
+ at SQ SN:AYCK01028745.1 LN:3187
+ at SQ SN:KI521437.1 LN:3179
+ at SQ SN:AYCK01029916.1 LN:3173
+ at SQ SN:AYCK01029917.1 LN:3172
+ at SQ SN:AYCK01029918.1 LN:3172
+ at SQ SN:KI521420.1 LN:3168
+ at SQ SN:KI521438.1 LN:3153
+ at SQ SN:AYCK01029919.1 LN:3153
+ at SQ SN:AYCK01028752.1 LN:3151
+ at SQ SN:AYCK01028753.1 LN:3151
+ at SQ SN:AYCK01029920.1 LN:3147
+ at SQ SN:KI521423.1 LN:3145
+ at SQ SN:KI521439.1 LN:3143
+ at SQ SN:AYCK01029921.1 LN:3143
+ at SQ SN:AYCK01029922.1 LN:3140
+ at SQ SN:AYCK01028756.1 LN:3139
+ at SQ SN:AYCK01029923.1 LN:3139
+ at SQ SN:AYCK01029924.1 LN:3138
+ at SQ SN:KI521430.1 LN:3137
+ at SQ SN:AYCK01029925.1 LN:3137
+ at SQ SN:KI521440.1 LN:3135
+ at SQ SN:KI521441.1 LN:3131
+ at SQ SN:KI521443.1 LN:3123
+ at SQ SN:AYCK01029926.1 LN:3113
+ at SQ SN:KI521436.1 LN:3112
+ at SQ SN:AYCK01029927.1 LN:3110
+ at SQ SN:AYCK01029928.1 LN:3077
+ at SQ SN:AYCK01029929.1 LN:3076
+ at SQ SN:AYCK01029930.1 LN:3074
+ at SQ SN:AYCK01029931.1 LN:3071
+ at SQ SN:KI521382.1 LN:3070
+ at SQ SN:KI521409.1 LN:3070
+ at SQ SN:AYCK01029932.1 LN:3070
+ at SQ SN:KI521418.1 LN:3069
+ at SQ SN:AYCK01029933.1 LN:3069
+ at SQ SN:AYCK01029934.1 LN:3065
+ at SQ SN:KI521413.1 LN:3061
+ at SQ SN:AYCK01029935.1 LN:3057
+ at SQ SN:AYCK01029936.1 LN:3055
+ at SQ SN:AYCK01029937.1 LN:3044
+ at SQ SN:KI521444.1 LN:3041
+ at SQ SN:AYCK01029938.1 LN:3035
+ at SQ SN:AYCK01029939.1 LN:3034
+ at SQ SN:AYCK01029940.1 LN:3034
+ at SQ SN:AYCK01029941.1 LN:3024
+ at SQ SN:KI521429.1 LN:3021
+ at SQ SN:AYCK01029942.1 LN:3018
+ at SQ SN:AYCK01029943.1 LN:3017
+ at SQ SN:KI521448.1 LN:3011
+ at SQ SN:KI521447.1 LN:3002
+ at SQ SN:AYCK01029944.1 LN:3000
+ at SQ SN:AYCK01029945.1 LN:3000
+ at SQ SN:KI521426.1 LN:2991
+ at SQ SN:AYCK01029946.1 LN:2985
+ at SQ SN:AYCK01028790.1 LN:2979
+ at SQ SN:AYCK01029947.1 LN:2973
+ at SQ SN:AYCK01029948.1 LN:2960
+ at SQ SN:AYCK01029949.1 LN:2959
+ at SQ SN:AYCK01029950.1 LN:2958
+ at SQ SN:KI521445.1 LN:2957
+ at SQ SN:AYCK01029951.1 LN:2944
+ at SQ SN:AYCK01029952.1 LN:2943
+ at SQ SN:KI521442.1 LN:2921
+ at SQ SN:AYCK01029953.1 LN:2916
+ at SQ SN:KI521453.1 LN:2914
+ at SQ SN:AYCK01029954.1 LN:2908
+ at SQ SN:AYCK01029955.1 LN:2902
+ at SQ SN:AYCK01029956.1 LN:2898
+ at SQ SN:AYCK01029957.1 LN:2896
+ at SQ SN:AYCK01029958.1 LN:2889
+ at SQ SN:AYCK01029959.1 LN:2888
+ at SQ SN:KI521455.1 LN:2882
+ at SQ SN:AYCK01029960.1 LN:2882
+ at SQ SN:AYCK01029961.1 LN:2879
+ at SQ SN:AYCK01029962.1 LN:2875
+ at SQ SN:KI521454.1 LN:2868
+ at SQ SN:AYCK01029963.1 LN:2861
+ at SQ SN:AYCK01029964.1 LN:2859
+ at SQ SN:AYCK01029965.1 LN:2855
+ at SQ SN:KI521456.1 LN:2854
+ at SQ SN:AYCK01029966.1 LN:2854
+ at SQ SN:AYCK01029967.1 LN:2848
+ at SQ SN:KI521457.1 LN:2828
+ at SQ SN:AYCK01029968.1 LN:2827
+ at SQ SN:KI521432.1 LN:2820
+ at SQ SN:AYCK01029969.1 LN:2819
+ at SQ SN:AYCK01029970.1 LN:2814
+ at SQ SN:KI521446.1 LN:2809
+ at SQ SN:AYCK01029971.1 LN:2808
+ at SQ SN:AYCK01029972.1 LN:2805
+ at SQ SN:KI521450.1 LN:2803
+ at SQ SN:AYCK01028833.1 LN:2792
+ at SQ SN:KI521451.1 LN:2790
+ at SQ SN:AYCK01028834.1 LN:2786
+ at SQ SN:AYCK01028835.1 LN:2786
+ at SQ SN:AYCK01029973.1 LN:2785
+ at SQ SN:AYCK01029974.1 LN:2784
+ at SQ SN:AYCK01029975.1 LN:2778
+ at SQ SN:AYCK01029976.1 LN:2754
+ at SQ SN:KI521449.1 LN:2751
+ at SQ SN:AYCK01029977.1 LN:2740
+ at SQ SN:AYCK01029978.1 LN:2738
+ at SQ SN:AYCK01028850.1 LN:2735
+ at SQ SN:KI521460.1 LN:2732
+ at SQ SN:AYCK01029979.1 LN:2728
+ at SQ SN:AYCK01029980.1 LN:2724
+ at SQ SN:AYCK01029981.1 LN:2717
+ at SQ SN:AYCK01028855.1 LN:2713
+ at SQ SN:AYCK01029982.1 LN:2712
+ at SQ SN:AYCK01029983.1 LN:2710
+ at SQ SN:AYCK01029984.1 LN:2704
+ at SQ SN:AYCK01029985.1 LN:2700
+ at SQ SN:AYCK01029986.1 LN:2695
+ at SQ SN:KI521459.1 LN:2694
+ at SQ SN:AYCK01029987.1 LN:2693
+ at SQ SN:AYCK01029988.1 LN:2692
+ at SQ SN:AYCK01029989.1 LN:2688
+ at SQ SN:AYCK01029990.1 LN:2682
+ at SQ SN:AYCK01029991.1 LN:2682
+ at SQ SN:AYCK01029992.1 LN:2673
+ at SQ SN:AYCK01029993.1 LN:2673
+ at SQ SN:KI521452.1 LN:2671
+ at SQ SN:AYCK01029994.1 LN:2671
+ at SQ SN:KI521458.1 LN:2670
+ at SQ SN:AYCK01029995.1 LN:2666
+ at SQ SN:AYCK01029996.1 LN:2658
+ at SQ SN:AYCK01029997.1 LN:2657
+ at SQ SN:AYCK01029998.1 LN:2654
+ at SQ SN:AYCK01029999.1 LN:2654
+ at SQ SN:AYCK01030000.1 LN:2651
+ at SQ SN:AYCK01030001.1 LN:2644
+ at SQ SN:AYCK01030002.1 LN:2643
+ at SQ SN:AYCK01030003.1 LN:2632
+ at SQ SN:AYCK01030004.1 LN:2631
+ at SQ SN:AYCK01030005.1 LN:2626
+ at SQ SN:AYCK01030006.1 LN:2625
+ at SQ SN:AYCK01030007.1 LN:2623
+ at SQ SN:AYCK01030008.1 LN:2619
+ at SQ SN:AYCK01030009.1 LN:2619
+ at SQ SN:KI521464.1 LN:2618
+ at SQ SN:AYCK01030010.1 LN:2605
+ at SQ SN:AYCK01030011.1 LN:2603
+ at SQ SN:AYCK01030012.1 LN:2602
+ at SQ SN:AYCK01030013.1 LN:2593
+ at SQ SN:AYCK01030014.1 LN:2581
+ at SQ SN:AYCK01030015.1 LN:2580
+ at SQ SN:AYCK01030016.1 LN:2576
+ at SQ SN:AYCK01030017.1 LN:2574
+ at SQ SN:AYCK01030018.1 LN:2571
+ at SQ SN:AYCK01028883.1 LN:2568
+ at SQ SN:AYCK01030019.1 LN:2564
+ at SQ SN:AYCK01030020.1 LN:2564
+ at SQ SN:AYCK01030021.1 LN:2560
+ at SQ SN:AYCK01028884.1 LN:2557
+ at SQ SN:AYCK01028885.1 LN:2557
+ at SQ SN:AYCK01030022.1 LN:2557
+ at SQ SN:KI521466.1 LN:2547
+ at SQ SN:AYCK01030023.1 LN:2540
+ at SQ SN:AYCK01028891.1 LN:2538
+ at SQ SN:AYCK01030024.1 LN:2537
+ at SQ SN:AYCK01030025.1 LN:2530
+ at SQ SN:AYCK01028892.1 LN:2527
+ at SQ SN:KI521465.1 LN:2525
+ at SQ SN:AYCK01028860.1 LN:2524
+ at SQ SN:AYCK01030026.1 LN:2524
+ at SQ SN:AYCK01030027.1 LN:2520
+ at SQ SN:AYCK01028893.1 LN:2518
+ at SQ SN:AYCK01030028.1 LN:2518
+ at SQ SN:AYCK01030029.1 LN:2517
+ at SQ SN:AYCK01028894.1 LN:2512
+ at SQ SN:AYCK01030030.1 LN:2512
+ at SQ SN:AYCK01028895.1 LN:2509
+ at SQ SN:AYCK01030031.1 LN:2507
+ at SQ SN:AYCK01030032.1 LN:2507
+ at SQ SN:AYCK01030033.1 LN:2506
+ at SQ SN:AYCK01028896.1 LN:2504
+ at SQ SN:AYCK01030034.1 LN:2501
+ at SQ SN:AYCK01030035.1 LN:2499
+ at SQ SN:KI521412.1 LN:2497
+ at SQ SN:AYCK01030036.1 LN:2496
+ at SQ SN:AYCK01028901.1 LN:2495
+ at SQ SN:AYCK01030037.1 LN:2495
+ at SQ SN:AYCK01030038.1 LN:2493
+ at SQ SN:AYCK01028872.1 LN:2490
+ at SQ SN:KI521469.1 LN:2489
+ at SQ SN:AYCK01030039.1 LN:2488
+ at SQ SN:AYCK01030040.1 LN:2486
+ at SQ SN:AYCK01030041.1 LN:2485
+ at SQ SN:AYCK01028904.1 LN:2479
+ at SQ SN:AYCK01030042.1 LN:2478
+ at SQ SN:AYCK01030043.1 LN:2476
+ at SQ SN:AYCK01030044.1 LN:2467
+ at SQ SN:AYCK01028909.1 LN:2460
+ at SQ SN:AYCK01030045.1 LN:2460
+ at SQ SN:AYCK01030046.1 LN:2456
+ at SQ SN:AYCK01030047.1 LN:2453
+ at SQ SN:AYCK01030048.1 LN:2451
+ at SQ SN:KI521463.1 LN:2448
+ at SQ SN:AYCK01030049.1 LN:2448
+ at SQ SN:KI521468.1 LN:2445
+ at SQ SN:AYCK01030050.1 LN:2443
+ at SQ SN:AYCK01030051.1 LN:2439
+ at SQ SN:AYCK01030052.1 LN:2438
+ at SQ SN:AYCK01030053.1 LN:2434
+ at SQ SN:AYCK01030054.1 LN:2430
+ at SQ SN:AYCK01030055.1 LN:2430
+ at SQ SN:AYCK01030056.1 LN:2430
+ at SQ SN:AYCK01030057.1 LN:2429
+ at SQ SN:AYCK01030058.1 LN:2424
+ at SQ SN:AYCK01030059.1 LN:2421
+ at SQ SN:AYCK01030060.1 LN:2415
+ at SQ SN:AYCK01030061.1 LN:2415
+ at SQ SN:AYCK01030062.1 LN:2410
+ at SQ SN:AYCK01030063.1 LN:2409
+ at SQ SN:AYCK01030064.1 LN:2408
+ at SQ SN:AYCK01030065.1 LN:2407
+ at SQ SN:KI521462.1 LN:2398
+ at SQ SN:AYCK01030066.1 LN:2397
+ at SQ SN:AYCK01030067.1 LN:2392
+ at SQ SN:AYCK01030068.1 LN:2386
+ at SQ SN:AYCK01030069.1 LN:2385
+ at SQ SN:AYCK01030070.1 LN:2382
+ at SQ SN:AYCK01030071.1 LN:2380
+ at SQ SN:AYCK01030072.1 LN:2379
+ at SQ SN:AYCK01030073.1 LN:2378
+ at SQ SN:AYCK01028922.1 LN:2377
+ at SQ SN:AYCK01028923.1 LN:2377
+ at SQ SN:AYCK01030074.1 LN:2377
+ at SQ SN:AYCK01030075.1 LN:2372
+ at SQ SN:AYCK01030076.1 LN:2371
+ at SQ SN:AYCK01030077.1 LN:2369
+ at SQ SN:AYCK01030078.1 LN:2368
+ at SQ SN:AYCK01030079.1 LN:2366
+ at SQ SN:AYCK01030080.1 LN:2357
+ at SQ SN:AYCK01030081.1 LN:2355
+ at SQ SN:AYCK01030082.1 LN:2354
+ at SQ SN:AYCK01030083.1 LN:2353
+ at SQ SN:AYCK01030084.1 LN:2349
+ at SQ SN:KI521472.1 LN:2345
+ at SQ SN:AYCK01030085.1 LN:2345
+ at SQ SN:KI521473.1 LN:2338
+ at SQ SN:AYCK01030086.1 LN:2333
+ at SQ SN:AYCK01030087.1 LN:2332
+ at SQ SN:KI521470.1 LN:2329
+ at SQ SN:AYCK01030088.1 LN:2315
+ at SQ SN:AYCK01030089.1 LN:2308
+ at SQ SN:AYCK01030090.1 LN:2306
+ at SQ SN:KI521479.1 LN:2305
+ at SQ SN:AYCK01030091.1 LN:2304
+ at SQ SN:AYCK01028934.1 LN:2301
+ at SQ SN:AYCK01030092.1 LN:2300
+ at SQ SN:AYCK01030093.1 LN:2299
+ at SQ SN:AYCK01030094.1 LN:2294
+ at SQ SN:KI521481.1 LN:2293
+ at SQ SN:AYCK01030095.1 LN:2292
+ at SQ SN:AYCK01030096.1 LN:2289
+ at SQ SN:AYCK01030097.1 LN:2289
+ at SQ SN:AYCK01030098.1 LN:2288
+ at SQ SN:AYCK01030099.1 LN:2285
+ at SQ SN:AYCK01030100.1 LN:2284
+ at SQ SN:AYCK01030101.1 LN:2282
+ at SQ SN:KI521476.1 LN:2268
+ at SQ SN:AYCK01028941.1 LN:2265
+ at SQ SN:AYCK01028947.1 LN:2259
+ at SQ SN:AYCK01030102.1 LN:2259
+ at SQ SN:AYCK01030103.1 LN:2258
+ at SQ SN:AYCK01030104.1 LN:2254
+ at SQ SN:AYCK01030105.1 LN:2252
+ at SQ SN:AYCK01030106.1 LN:2252
+ at SQ SN:AYCK01030107.1 LN:2244
+ at SQ SN:KI521475.1 LN:2242
+ at SQ SN:KI521467.1 LN:2240
+ at SQ SN:AYCK01030108.1 LN:2237
+ at SQ SN:AYCK01030109.1 LN:2236
+ at SQ SN:AYCK01030110.1 LN:2234
+ at SQ SN:AYCK01028954.1 LN:2232
+ at SQ SN:AYCK01030111.1 LN:2229
+ at SQ SN:AYCK01030112.1 LN:2225
+ at SQ SN:AYCK01030113.1 LN:2223
+ at SQ SN:AYCK01030114.1 LN:2223
+ at SQ SN:AYCK01030115.1 LN:2221
+ at SQ SN:KI521477.1 LN:2220
+ at SQ SN:AYCK01030116.1 LN:2220
+ at SQ SN:AYCK01030117.1 LN:2218
+ at SQ SN:AYCK01030118.1 LN:2218
+ at SQ SN:AYCK01030119.1 LN:2215
+ at SQ SN:AYCK01030120.1 LN:2214
+ at SQ SN:AYCK01030121.1 LN:2211
+ at SQ SN:AYCK01030122.1 LN:2207
+ at SQ SN:AYCK01030123.1 LN:2206
+ at SQ SN:AYCK01030124.1 LN:2206
+ at SQ SN:AYCK01028966.1 LN:2201
+ at SQ SN:AYCK01030125.1 LN:2201
+ at SQ SN:AYCK01030126.1 LN:2199
+ at SQ SN:AYCK01030127.1 LN:2194
+ at SQ SN:AYCK01030128.1 LN:2193
+ at SQ SN:AYCK01030129.1 LN:2193
+ at SQ SN:AYCK01030130.1 LN:2192
+ at SQ SN:AYCK01030131.1 LN:2190
+ at SQ SN:AYCK01030132.1 LN:2186
+ at SQ SN:KI521485.1 LN:2184
+ at SQ SN:KI521474.1 LN:2183
+ at SQ SN:AYCK01030133.1 LN:2182
+ at SQ SN:AYCK01030134.1 LN:2182
+ at SQ SN:KI521480.1 LN:2181
+ at SQ SN:AYCK01028969.1 LN:2177
+ at SQ SN:AYCK01030135.1 LN:2172
+ at SQ SN:KI521478.1 LN:2171
+ at SQ SN:AYCK01030136.1 LN:2171
+ at SQ SN:AYCK01030137.1 LN:2170
+ at SQ SN:AYCK01030138.1 LN:2170
+ at SQ SN:AYCK01030139.1 LN:2170
+ at SQ SN:AYCK01030140.1 LN:2168
+ at SQ SN:AYCK01030141.1 LN:2161
+ at SQ SN:AYCK01030142.1 LN:2156
+ at SQ SN:AYCK01030143.1 LN:2154
+ at SQ SN:AYCK01030144.1 LN:2150
+ at SQ SN:AYCK01030145.1 LN:2150
+ at SQ SN:AYCK01030146.1 LN:2148
+ at SQ SN:AYCK01030147.1 LN:2147
+ at SQ SN:AYCK01030148.1 LN:2144
+ at SQ SN:AYCK01030149.1 LN:2143
+ at SQ SN:AYCK01030150.1 LN:2143
+ at SQ SN:AYCK01030151.1 LN:2142
+ at SQ SN:AYCK01030152.1 LN:2140
+ at SQ SN:AYCK01030153.1 LN:2131
+ at SQ SN:AYCK01030154.1 LN:2131
+ at SQ SN:AYCK01030155.1 LN:2130
+ at SQ SN:AYCK01030156.1 LN:2130
+ at SQ SN:AYCK01028961.1 LN:2129
+ at SQ SN:AYCK01030157.1 LN:2129
+ at SQ SN:KI521484.1 LN:2128
+ at SQ SN:AYCK01030158.1 LN:2127
+ at SQ SN:AYCK01028982.1 LN:2120
+ at SQ SN:AYCK01028983.1 LN:2115
+ at SQ SN:AYCK01030159.1 LN:2113
+ at SQ SN:AYCK01030160.1 LN:2113
+ at SQ SN:AYCK01030161.1 LN:2111
+ at SQ SN:AYCK01030162.1 LN:2110
+ at SQ SN:AYCK01030163.1 LN:2107
+ at SQ SN:AYCK01030164.1 LN:2106
+ at SQ SN:AYCK01030165.1 LN:2106
+ at SQ SN:AYCK01030166.1 LN:2105
+ at SQ SN:AYCK01030167.1 LN:2105
+ at SQ SN:AYCK01030168.1 LN:2102
+ at SQ SN:AYCK01030169.1 LN:2098
+ at SQ SN:AYCK01030170.1 LN:2098
+ at SQ SN:AYCK01030171.1 LN:2096
+ at SQ SN:AYCK01028986.1 LN:2091
+ at SQ SN:AYCK01030172.1 LN:2090
+ at SQ SN:AYCK01030173.1 LN:2085
+ at SQ SN:AYCK01030174.1 LN:2084
+ at SQ SN:AYCK01028987.1 LN:2078
+ at SQ SN:AYCK01030175.1 LN:2077
+ at SQ SN:AYCK01030176.1 LN:2072
+ at SQ SN:AYCK01030177.1 LN:2072
+ at SQ SN:AYCK01030178.1 LN:2070
+ at SQ SN:AYCK01030179.1 LN:2068
+ at SQ SN:AYCK01030180.1 LN:2061
+ at SQ SN:AYCK01030181.1 LN:2059
+ at SQ SN:AYCK01030182.1 LN:2058
+ at SQ SN:AYCK01030183.1 LN:2057
+ at SQ SN:AYCK01030184.1 LN:2055
+ at SQ SN:AYCK01030185.1 LN:2054
+ at SQ SN:AYCK01030186.1 LN:2053
+ at SQ SN:AYCK01030187.1 LN:2051
+ at SQ SN:AYCK01030188.1 LN:2049
+ at SQ SN:AYCK01030189.1 LN:2048
+ at SQ SN:AYCK01030190.1 LN:2044
+ at SQ SN:AYCK01030191.1 LN:2043
+ at SQ SN:KI521486.1 LN:2037
+ at SQ SN:AYCK01030192.1 LN:2037
+ at SQ SN:AYCK01030193.1 LN:2037
+ at SQ SN:KI521482.1 LN:2030
+ at SQ SN:AYCK01030194.1 LN:2030
+ at SQ SN:AYCK01028993.1 LN:2029
+ at SQ SN:AYCK01028994.1 LN:2026
+ at SQ SN:AYCK01030195.1 LN:2024
+ at SQ SN:AYCK01030196.1 LN:2019
+ at SQ SN:AYCK01028995.1 LN:2017
+ at SQ SN:AYCK01030197.1 LN:2016
+ at SQ SN:AYCK01028998.1 LN:2012
+ at SQ SN:AYCK01030198.1 LN:2010
+ at SQ SN:AYCK01030199.1 LN:2009
+ at SQ SN:AYCK01029001.1 LN:2008
+ at SQ SN:AYCK01030200.1 LN:2005
+ at SQ SN:AYCK01030201.1 LN:2005
+ at SQ SN:AYCK01030202.1 LN:2003
+ at SQ SN:AYCK01030203.1 LN:1999
+ at SQ SN:AYCK01030204.1 LN:1995
+ at SQ SN:AYCK01030205.1 LN:1995
+ at SQ SN:AYCK01030206.1 LN:1994
+ at SQ SN:AYCK01030207.1 LN:1989
+ at SQ SN:AYCK01030208.1 LN:1988
+ at SQ SN:KI521483.1 LN:1983
+ at SQ SN:AYCK01030209.1 LN:1982
+ at SQ SN:AYCK01030210.1 LN:1976
+ at SQ SN:AYCK01030211.1 LN:1976
+ at SQ SN:AYCK01030212.1 LN:1972
+ at SQ SN:AYCK01030213.1 LN:1972
+ at SQ SN:AYCK01030214.1 LN:1971
+ at SQ SN:AYCK01030215.1 LN:1968
+ at SQ SN:AYCK01030216.1 LN:1966
+ at SQ SN:AYCK01030217.1 LN:1965
+ at SQ SN:AYCK01030218.1 LN:1964
+ at SQ SN:AYCK01030219.1 LN:1964
+ at SQ SN:AYCK01030220.1 LN:1963
+ at SQ SN:AYCK01030221.1 LN:1960
+ at SQ SN:AYCK01030222.1 LN:1955
+ at SQ SN:AYCK01030223.1 LN:1954
+ at SQ SN:AYCK01030224.1 LN:1951
+ at SQ SN:AYCK01030225.1 LN:1950
+ at SQ SN:AYCK01030226.1 LN:1950
+ at SQ SN:AYCK01030227.1 LN:1945
+ at SQ SN:AYCK01030228.1 LN:1944
+ at SQ SN:AYCK01030229.1 LN:1944
+ at SQ SN:AYCK01030230.1 LN:1944
+ at SQ SN:AYCK01030231.1 LN:1943
+ at SQ SN:AYCK01030232.1 LN:1943
+ at SQ SN:AYCK01030233.1 LN:1940
+ at SQ SN:AYCK01030234.1 LN:1939
+ at SQ SN:AYCK01030235.1 LN:1937
+ at SQ SN:AYCK01030236.1 LN:1935
+ at SQ SN:AYCK01030237.1 LN:1933
+ at SQ SN:AYCK01029010.1 LN:1932
+ at SQ SN:AYCK01030238.1 LN:1932
+ at SQ SN:AYCK01030239.1 LN:1931
+ at SQ SN:AYCK01030240.1 LN:1930
+ at SQ SN:AYCK01030241.1 LN:1921
+ at SQ SN:AYCK01029011.1 LN:1919
+ at SQ SN:AYCK01030242.1 LN:1919
+ at SQ SN:AYCK01029012.1 LN:1918
+ at SQ SN:AYCK01030243.1 LN:1918
+ at SQ SN:AYCK01030244.1 LN:1917
+ at SQ SN:AYCK01030245.1 LN:1914
+ at SQ SN:AYCK01030246.1 LN:1914
+ at SQ SN:AYCK01030247.1 LN:1910
+ at SQ SN:AYCK01030248.1 LN:1908
+ at SQ SN:AYCK01030249.1 LN:1905
+ at SQ SN:AYCK01030250.1 LN:1903
+ at SQ SN:AYCK01030251.1 LN:1903
+ at SQ SN:AYCK01030252.1 LN:1899
+ at SQ SN:AYCK01030253.1 LN:1896
+ at SQ SN:AYCK01030254.1 LN:1895
+ at SQ SN:AYCK01029015.1 LN:1894
+ at SQ SN:AYCK01030255.1 LN:1893
+ at SQ SN:AYCK01030256.1 LN:1891
+ at SQ SN:AYCK01030257.1 LN:1890
+ at SQ SN:AYCK01029018.1 LN:1887
+ at SQ SN:AYCK01030258.1 LN:1886
+ at SQ SN:AYCK01030259.1 LN:1885
+ at SQ SN:AYCK01030260.1 LN:1885
+ at SQ SN:AYCK01030261.1 LN:1883
+ at SQ SN:AYCK01028988.1 LN:1882
+ at SQ SN:AYCK01030262.1 LN:1882
+ at SQ SN:AYCK01030263.1 LN:1879
+ at SQ SN:AYCK01030264.1 LN:1875
+ at SQ SN:AYCK01030265.1 LN:1867
+ at SQ SN:AYCK01030266.1 LN:1866
+ at SQ SN:AYCK01030267.1 LN:1866
+ at SQ SN:AYCK01029021.1 LN:1862
+ at SQ SN:AYCK01030268.1 LN:1860
+ at SQ SN:AYCK01030269.1 LN:1857
+ at SQ SN:AYCK01030270.1 LN:1856
+ at SQ SN:AYCK01030271.1 LN:1855
+ at SQ SN:AYCK01029024.1 LN:1853
+ at SQ SN:AYCK01030272.1 LN:1853
+ at SQ SN:AYCK01030273.1 LN:1849
+ at SQ SN:AYCK01030274.1 LN:1848
+ at SQ SN:AYCK01030275.1 LN:1847
+ at SQ SN:AYCK01029027.1 LN:1846
+ at SQ SN:AYCK01030276.1 LN:1843
+ at SQ SN:AYCK01030277.1 LN:1841
+ at SQ SN:AYCK01030278.1 LN:1841
+ at SQ SN:AYCK01030279.1 LN:1841
+ at SQ SN:AYCK01030280.1 LN:1840
+ at SQ SN:AYCK01029028.1 LN:1837
+ at SQ SN:AYCK01030281.1 LN:1836
+ at SQ SN:AYCK01030282.1 LN:1833
+ at SQ SN:AYCK01030283.1 LN:1822
+ at SQ SN:AYCK01030284.1 LN:1822
+ at SQ SN:AYCK01030285.1 LN:1820
+ at SQ SN:AYCK01030286.1 LN:1819
+ at SQ SN:AYCK01030287.1 LN:1812
+ at SQ SN:AYCK01029031.1 LN:1808
+ at SQ SN:AYCK01030288.1 LN:1807
+ at SQ SN:AYCK01030289.1 LN:1806
+ at SQ SN:AYCK01030290.1 LN:1803
+ at SQ SN:AYCK01029034.1 LN:1802
+ at SQ SN:AYCK01030291.1 LN:1797
+ at SQ SN:AYCK01030292.1 LN:1795
+ at SQ SN:AYCK01030293.1 LN:1794
+ at SQ SN:AYCK01030294.1 LN:1791
+ at SQ SN:AYCK01030295.1 LN:1790
+ at SQ SN:AYCK01030296.1 LN:1790
+ at SQ SN:AYCK01030297.1 LN:1789
+ at SQ SN:AYCK01030298.1 LN:1787
+ at SQ SN:AYCK01030299.1 LN:1786
+ at SQ SN:AYCK01030300.1 LN:1786
+ at SQ SN:AYCK01029037.1 LN:1780
+ at SQ SN:AYCK01030301.1 LN:1780
+ at SQ SN:AYCK01029038.1 LN:1778
+ at SQ SN:AYCK01030302.1 LN:1778
+ at SQ SN:AYCK01029039.1 LN:1777
+ at SQ SN:AYCK01030303.1 LN:1776
+ at SQ SN:AYCK01030304.1 LN:1776
+ at SQ SN:AYCK01030305.1 LN:1776
+ at SQ SN:AYCK01030306.1 LN:1773
+ at SQ SN:AYCK01030307.1 LN:1771
+ at SQ SN:AYCK01030308.1 LN:1768
+ at SQ SN:AYCK01030309.1 LN:1764
+ at SQ SN:AYCK01030310.1 LN:1764
+ at SQ SN:AYCK01030311.1 LN:1764
+ at SQ SN:AYCK01030312.1 LN:1760
+ at SQ SN:AYCK01030313.1 LN:1758
+ at SQ SN:AYCK01030314.1 LN:1758
+ at SQ SN:AYCK01030315.1 LN:1757
+ at SQ SN:AYCK01030316.1 LN:1756
+ at SQ SN:AYCK01030317.1 LN:1756
+ at SQ SN:AYCK01030318.1 LN:1751
+ at SQ SN:AYCK01030319.1 LN:1744
+ at SQ SN:AYCK01029040.1 LN:1743
+ at SQ SN:AYCK01030320.1 LN:1743
+ at SQ SN:AYCK01029041.1 LN:1741
+ at SQ SN:AYCK01030321.1 LN:1741
+ at SQ SN:AYCK01030322.1 LN:1741
+ at SQ SN:AYCK01030323.1 LN:1738
+ at SQ SN:AYCK01030324.1 LN:1735
+ at SQ SN:AYCK01030325.1 LN:1734
+ at SQ SN:AYCK01030326.1 LN:1734
+ at SQ SN:AYCK01030327.1 LN:1733
+ at SQ SN:AYCK01029042.1 LN:1730
+ at SQ SN:AYCK01030328.1 LN:1730
+ at SQ SN:AYCK01030329.1 LN:1729
+ at SQ SN:AYCK01030330.1 LN:1727
+ at SQ SN:AYCK01030331.1 LN:1717
+ at SQ SN:AYCK01030332.1 LN:1716
+ at SQ SN:AYCK01030333.1 LN:1715
+ at SQ SN:AYCK01030334.1 LN:1714
+ at SQ SN:AYCK01030335.1 LN:1714
+ at SQ SN:AYCK01030336.1 LN:1712
+ at SQ SN:AYCK01030337.1 LN:1711
+ at SQ SN:AYCK01029046.1 LN:1709
+ at SQ SN:AYCK01029047.1 LN:1706
+ at SQ SN:AYCK01030338.1 LN:1705
+ at SQ SN:AYCK01030339.1 LN:1703
+ at SQ SN:AYCK01030340.1 LN:1698
+ at SQ SN:AYCK01030341.1 LN:1698
+ at SQ SN:AYCK01030342.1 LN:1698
+ at SQ SN:AYCK01030343.1 LN:1697
+ at SQ SN:AYCK01030344.1 LN:1694
+ at SQ SN:AYCK01030345.1 LN:1689
+ at SQ SN:AYCK01030346.1 LN:1688
+ at SQ SN:AYCK01030347.1 LN:1686
+ at SQ SN:AYCK01030348.1 LN:1686
+ at SQ SN:AYCK01030349.1 LN:1685
+ at SQ SN:AYCK01030350.1 LN:1684
+ at SQ SN:AYCK01030351.1 LN:1677
+ at SQ SN:AYCK01030352.1 LN:1676
+ at SQ SN:AYCK01030353.1 LN:1673
+ at SQ SN:AYCK01030354.1 LN:1673
+ at SQ SN:AYCK01030355.1 LN:1671
+ at SQ SN:AYCK01030356.1 LN:1671
+ at SQ SN:AYCK01030357.1 LN:1663
+ at SQ SN:AYCK01029048.1 LN:1661
+ at SQ SN:KI521488.1 LN:1661
+ at SQ SN:AYCK01030358.1 LN:1658
+ at SQ SN:AYCK01030359.1 LN:1658
+ at SQ SN:AYCK01030360.1 LN:1656
+ at SQ SN:AYCK01029049.1 LN:1655
+ at SQ SN:AYCK01030361.1 LN:1653
+ at SQ SN:AYCK01030362.1 LN:1653
+ at SQ SN:AYCK01029050.1 LN:1652
+ at SQ SN:AYCK01030363.1 LN:1652
+ at SQ SN:AYCK01030364.1 LN:1650
+ at SQ SN:KI521487.1 LN:1649
+ at SQ SN:AYCK01030365.1 LN:1649
+ at SQ SN:AYCK01030366.1 LN:1649
+ at SQ SN:AYCK01030367.1 LN:1648
+ at SQ SN:AYCK01029051.1 LN:1646
+ at SQ SN:AYCK01030368.1 LN:1645
+ at SQ SN:AYCK01030369.1 LN:1642
+ at SQ SN:AYCK01030370.1 LN:1641
+ at SQ SN:AYCK01030371.1 LN:1639
+ at SQ SN:AYCK01030372.1 LN:1638
+ at SQ SN:AYCK01030373.1 LN:1637
+ at SQ SN:AYCK01030374.1 LN:1637
+ at SQ SN:AYCK01030375.1 LN:1635
+ at SQ SN:AYCK01029054.1 LN:1634
+ at SQ SN:AYCK01030376.1 LN:1631
+ at SQ SN:AYCK01030377.1 LN:1631
+ at SQ SN:AYCK01030378.1 LN:1626
+ at SQ SN:AYCK01030379.1 LN:1625
+ at SQ SN:AYCK01030380.1 LN:1624
+ at SQ SN:AYCK01030381.1 LN:1623
+ at SQ SN:AYCK01030382.1 LN:1621
+ at SQ SN:AYCK01030383.1 LN:1619
+ at SQ SN:AYCK01030384.1 LN:1618
+ at SQ SN:AYCK01030385.1 LN:1617
+ at SQ SN:AYCK01030386.1 LN:1617
+ at SQ SN:AYCK01030387.1 LN:1616
+ at SQ SN:AYCK01030388.1 LN:1615
+ at SQ SN:AYCK01030389.1 LN:1612
+ at SQ SN:AYCK01030390.1 LN:1611
+ at SQ SN:AYCK01030391.1 LN:1610
+ at SQ SN:AYCK01030392.1 LN:1610
+ at SQ SN:AYCK01030393.1 LN:1609
+ at SQ SN:AYCK01030394.1 LN:1609
+ at SQ SN:AYCK01030395.1 LN:1609
+ at SQ SN:AYCK01030396.1 LN:1608
+ at SQ SN:AYCK01030397.1 LN:1608
+ at SQ SN:AYCK01030398.1 LN:1607
+ at SQ SN:AYCK01030399.1 LN:1605
+ at SQ SN:AYCK01030400.1 LN:1603
+ at SQ SN:AYCK01030401.1 LN:1601
+ at SQ SN:AYCK01030402.1 LN:1599
+ at SQ SN:AYCK01030403.1 LN:1598
+ at SQ SN:AYCK01030404.1 LN:1598
+ at SQ SN:AYCK01030405.1 LN:1593
+ at SQ SN:AYCK01030406.1 LN:1592
+ at SQ SN:AYCK01030407.1 LN:1591
+ at SQ SN:AYCK01030408.1 LN:1591
+ at SQ SN:AYCK01030409.1 LN:1591
+ at SQ SN:AYCK01030410.1 LN:1589
+ at SQ SN:AYCK01030411.1 LN:1588
+ at SQ SN:AYCK01030412.1 LN:1586
+ at SQ SN:AYCK01030413.1 LN:1586
+ at SQ SN:AYCK01029062.1 LN:1584
+ at SQ SN:AYCK01030414.1 LN:1584
+ at SQ SN:AYCK01030415.1 LN:1584
+ at SQ SN:AYCK01030416.1 LN:1582
+ at SQ SN:AYCK01030417.1 LN:1581
+ at SQ SN:AYCK01030418.1 LN:1574
+ at SQ SN:AYCK01030419.1 LN:1574
+ at SQ SN:AYCK01030420.1 LN:1572
+ at SQ SN:AYCK01030421.1 LN:1568
+ at SQ SN:AYCK01030422.1 LN:1568
+ at SQ SN:AYCK01030423.1 LN:1568
+ at SQ SN:AYCK01030424.1 LN:1567
+ at SQ SN:AYCK01030425.1 LN:1567
+ at SQ SN:AYCK01030426.1 LN:1565
+ at SQ SN:AYCK01030427.1 LN:1565
+ at SQ SN:AYCK01030428.1 LN:1565
+ at SQ SN:AYCK01030429.1 LN:1565
+ at SQ SN:AYCK01030430.1 LN:1564
+ at SQ SN:AYCK01030431.1 LN:1563
+ at SQ SN:AYCK01030432.1 LN:1561
+ at SQ SN:AYCK01030433.1 LN:1561
+ at SQ SN:AYCK01030434.1 LN:1560
+ at SQ SN:AYCK01030435.1 LN:1559
+ at SQ SN:AYCK01030436.1 LN:1559
+ at SQ SN:AYCK01030437.1 LN:1558
+ at SQ SN:AYCK01030438.1 LN:1558
+ at SQ SN:AYCK01030439.1 LN:1557
+ at SQ SN:AYCK01030440.1 LN:1556
+ at SQ SN:AYCK01030441.1 LN:1556
+ at SQ SN:AYCK01030442.1 LN:1555
+ at SQ SN:AYCK01030443.1 LN:1553
+ at SQ SN:AYCK01030444.1 LN:1552
+ at SQ SN:AYCK01030445.1 LN:1551
+ at SQ SN:AYCK01030446.1 LN:1550
+ at SQ SN:AYCK01030447.1 LN:1548
+ at SQ SN:AYCK01030448.1 LN:1546
+ at SQ SN:AYCK01030449.1 LN:1546
+ at SQ SN:AYCK01030450.1 LN:1544
+ at SQ SN:AYCK01030451.1 LN:1543
+ at SQ SN:AYCK01030452.1 LN:1542
+ at SQ SN:AYCK01030453.1 LN:1541
+ at SQ SN:AYCK01030454.1 LN:1540
+ at SQ SN:AYCK01030455.1 LN:1539
+ at SQ SN:AYCK01030456.1 LN:1539
+ at SQ SN:AYCK01030457.1 LN:1537
+ at SQ SN:AYCK01030458.1 LN:1536
+ at SQ SN:AYCK01030459.1 LN:1535
+ at SQ SN:AYCK01030460.1 LN:1535
+ at SQ SN:AYCK01030461.1 LN:1534
+ at SQ SN:AYCK01030462.1 LN:1534
+ at SQ SN:AYCK01030463.1 LN:1533
+ at SQ SN:AYCK01030464.1 LN:1530
+ at SQ SN:AYCK01030465.1 LN:1527
+ at SQ SN:AYCK01030466.1 LN:1527
+ at SQ SN:AYCK01030467.1 LN:1526
+ at SQ SN:AYCK01030468.1 LN:1523
+ at SQ SN:AYCK01030469.1 LN:1522
+ at SQ SN:AYCK01030470.1 LN:1517
+ at SQ SN:AYCK01030471.1 LN:1516
+ at SQ SN:AYCK01030472.1 LN:1516
+ at SQ SN:AYCK01030473.1 LN:1515
+ at SQ SN:AYCK01030474.1 LN:1514
+ at SQ SN:AYCK01030475.1 LN:1514
+ at SQ SN:AYCK01030476.1 LN:1512
+ at SQ SN:AYCK01030477.1 LN:1511
+ at SQ SN:AYCK01030478.1 LN:1509
+ at SQ SN:AYCK01030479.1 LN:1507
+ at SQ SN:AYCK01030480.1 LN:1507
+ at SQ SN:AYCK01030481.1 LN:1505
+ at SQ SN:AYCK01029071.1 LN:1503
+ at SQ SN:AYCK01030482.1 LN:1503
+ at SQ SN:AYCK01030483.1 LN:1503
+ at SQ SN:AYCK01030484.1 LN:1502
+ at SQ SN:AYCK01030485.1 LN:1502
+ at SQ SN:AYCK01030486.1 LN:1501
+ at SQ SN:AYCK01029074.1 LN:1500
+ at SQ SN:AYCK01030487.1 LN:1498
+ at SQ SN:AYCK01030488.1 LN:1497
+ at SQ SN:AYCK01030489.1 LN:1494
+ at SQ SN:AYCK01030490.1 LN:1494
+ at SQ SN:AYCK01030491.1 LN:1493
+ at SQ SN:AYCK01030492.1 LN:1493
+ at SQ SN:AYCK01030493.1 LN:1492
+ at SQ SN:AYCK01030494.1 LN:1491
+ at SQ SN:AYCK01030495.1 LN:1491
+ at SQ SN:AYCK01030496.1 LN:1489
+ at SQ SN:AYCK01030497.1 LN:1488
+ at SQ SN:AYCK01030498.1 LN:1488
+ at SQ SN:AYCK01029075.1 LN:1487
+ at SQ SN:AYCK01030499.1 LN:1487
+ at SQ SN:AYCK01029076.1 LN:1486
+ at SQ SN:AYCK01030500.1 LN:1486
+ at SQ SN:AYCK01030501.1 LN:1483
+ at SQ SN:AYCK01030502.1 LN:1481
+ at SQ SN:AYCK01030503.1 LN:1479
+ at SQ SN:AYCK01030504.1 LN:1478
+ at SQ SN:AYCK01030505.1 LN:1478
+ at SQ SN:AYCK01030506.1 LN:1478
+ at SQ SN:AYCK01030507.1 LN:1474
+ at SQ SN:AYCK01030508.1 LN:1473
+ at SQ SN:AYCK01030509.1 LN:1473
+ at SQ SN:AYCK01030510.1 LN:1472
+ at SQ SN:AYCK01030511.1 LN:1471
+ at SQ SN:AYCK01030512.1 LN:1468
+ at SQ SN:AYCK01030513.1 LN:1467
+ at SQ SN:AYCK01030514.1 LN:1467
+ at SQ SN:AYCK01030515.1 LN:1464
+ at SQ SN:AYCK01030516.1 LN:1463
+ at SQ SN:AYCK01030517.1 LN:1461
+ at SQ SN:AYCK01030518.1 LN:1460
+ at SQ SN:AYCK01030519.1 LN:1458
+ at SQ SN:AYCK01030520.1 LN:1457
+ at SQ SN:AYCK01030521.1 LN:1456
+ at SQ SN:AYCK01030522.1 LN:1456
+ at SQ SN:AYCK01030523.1 LN:1456
+ at SQ SN:AYCK01030524.1 LN:1455
+ at SQ SN:AYCK01030525.1 LN:1454
+ at SQ SN:AYCK01030526.1 LN:1453
+ at SQ SN:AYCK01030527.1 LN:1453
+ at SQ SN:AYCK01029079.1 LN:1451
+ at SQ SN:AYCK01030528.1 LN:1448
+ at SQ SN:AYCK01030529.1 LN:1446
+ at SQ SN:AYCK01030530.1 LN:1445
+ at SQ SN:AYCK01029080.1 LN:1444
+ at SQ SN:AYCK01030531.1 LN:1443
+ at SQ SN:AYCK01030532.1 LN:1441
+ at SQ SN:AYCK01030533.1 LN:1440
+ at SQ SN:AYCK01030534.1 LN:1438
+ at SQ SN:AYCK01030535.1 LN:1438
+ at SQ SN:AYCK01030536.1 LN:1437
+ at SQ SN:AYCK01030537.1 LN:1436
+ at SQ SN:AYCK01030538.1 LN:1435
+ at SQ SN:AYCK01030539.1 LN:1434
+ at SQ SN:AYCK01030540.1 LN:1434
+ at SQ SN:AYCK01030541.1 LN:1433
+ at SQ SN:AYCK01029083.1 LN:1432
+ at SQ SN:AYCK01030542.1 LN:1431
+ at SQ SN:AYCK01030543.1 LN:1430
+ at SQ SN:AYCK01030544.1 LN:1430
+ at SQ SN:AYCK01029084.1 LN:1428
+ at SQ SN:AYCK01030545.1 LN:1428
+ at SQ SN:AYCK01030546.1 LN:1428
+ at SQ SN:AYCK01030547.1 LN:1428
+ at SQ SN:AYCK01029085.1 LN:1426
+ at SQ SN:AYCK01030548.1 LN:1425
+ at SQ SN:AYCK01030549.1 LN:1425
+ at SQ SN:AYCK01029088.1 LN:1424
+ at SQ SN:AYCK01030550.1 LN:1423
+ at SQ SN:AYCK01030551.1 LN:1421
+ at SQ SN:AYCK01030552.1 LN:1421
+ at SQ SN:AYCK01030553.1 LN:1421
+ at SQ SN:AYCK01030554.1 LN:1420
+ at SQ SN:AYCK01029091.1 LN:1419
+ at SQ SN:AYCK01030555.1 LN:1419
+ at SQ SN:AYCK01030556.1 LN:1418
+ at SQ SN:AYCK01030557.1 LN:1418
+ at SQ SN:AYCK01029092.1 LN:1417
+ at SQ SN:AYCK01030558.1 LN:1416
+ at SQ SN:AYCK01030559.1 LN:1416
+ at SQ SN:AYCK01030560.1 LN:1414
+ at SQ SN:AYCK01030561.1 LN:1413
+ at SQ SN:AYCK01030562.1 LN:1413
+ at SQ SN:AYCK01029061.1 LN:1412
+ at SQ SN:AYCK01030563.1 LN:1412
+ at SQ SN:AYCK01030564.1 LN:1409
+ at SQ SN:AYCK01030565.1 LN:1407
+ at SQ SN:AYCK01030566.1 LN:1406
+ at SQ SN:AYCK01030567.1 LN:1405
+ at SQ SN:AYCK01030568.1 LN:1405
+ at SQ SN:AYCK01030569.1 LN:1404
+ at SQ SN:AYCK01030570.1 LN:1403
+ at SQ SN:AYCK01030571.1 LN:1402
+ at SQ SN:AYCK01030572.1 LN:1400
+ at SQ SN:AYCK01030573.1 LN:1399
+ at SQ SN:AYCK01030574.1 LN:1399
+ at SQ SN:AYCK01029095.1 LN:1398
+ at SQ SN:AYCK01030575.1 LN:1398
+ at SQ SN:AYCK01030576.1 LN:1398
+ at SQ SN:AYCK01030577.1 LN:1398
+ at SQ SN:AYCK01030578.1 LN:1397
+ at SQ SN:AYCK01030579.1 LN:1395
+ at SQ SN:AYCK01030580.1 LN:1395
+ at SQ SN:AYCK01030581.1 LN:1395
+ at SQ SN:AYCK01030582.1 LN:1394
+ at SQ SN:AYCK01030583.1 LN:1393
+ at SQ SN:AYCK01030584.1 LN:1393
+ at SQ SN:AYCK01030585.1 LN:1393
+ at SQ SN:AYCK01030586.1 LN:1391
+ at SQ SN:AYCK01030587.1 LN:1390
+ at SQ SN:AYCK01029096.1 LN:1388
+ at SQ SN:AYCK01030588.1 LN:1388
+ at SQ SN:AYCK01030589.1 LN:1387
+ at SQ SN:AYCK01030590.1 LN:1383
+ at SQ SN:AYCK01030591.1 LN:1383
+ at SQ SN:AYCK01030592.1 LN:1380
+ at SQ SN:AYCK01030593.1 LN:1378
+ at SQ SN:AYCK01030594.1 LN:1378
+ at SQ SN:AYCK01030595.1 LN:1375
+ at SQ SN:AYCK01030596.1 LN:1373
+ at SQ SN:AYCK01030597.1 LN:1373
+ at SQ SN:AYCK01030598.1 LN:1372
+ at SQ SN:AYCK01029097.1 LN:1371
+ at SQ SN:AYCK01029098.1 LN:1369
+ at SQ SN:AYCK01030599.1 LN:1368
+ at SQ SN:AYCK01029099.1 LN:1367
+ at SQ SN:AYCK01030600.1 LN:1367
+ at SQ SN:AYCK01030601.1 LN:1367
+ at SQ SN:AYCK01030602.1 LN:1366
+ at SQ SN:AYCK01030603.1 LN:1363
+ at SQ SN:AYCK01030604.1 LN:1361
+ at SQ SN:AYCK01030605.1 LN:1361
+ at SQ SN:AYCK01030606.1 LN:1359
+ at SQ SN:AYCK01030607.1 LN:1359
+ at SQ SN:AYCK01030608.1 LN:1358
+ at SQ SN:AYCK01030609.1 LN:1357
+ at SQ SN:AYCK01030610.1 LN:1356
+ at SQ SN:AYCK01029102.1 LN:1355
+ at SQ SN:AYCK01030611.1 LN:1354
+ at SQ SN:AYCK01030612.1 LN:1354
+ at SQ SN:AYCK01029103.1 LN:1353
+ at SQ SN:AYCK01030613.1 LN:1352
+ at SQ SN:AYCK01030614.1 LN:1352
+ at SQ SN:AYCK01030615.1 LN:1351
+ at SQ SN:AYCK01029104.1 LN:1350
+ at SQ SN:AYCK01030616.1 LN:1350
+ at SQ SN:AYCK01030617.1 LN:1350
+ at SQ SN:AYCK01030618.1 LN:1349
+ at SQ SN:AYCK01030619.1 LN:1349
+ at SQ SN:AYCK01030620.1 LN:1348
+ at SQ SN:AYCK01029105.1 LN:1347
+ at SQ SN:AYCK01030621.1 LN:1347
+ at SQ SN:AYCK01030622.1 LN:1346
+ at SQ SN:AYCK01030623.1 LN:1344
+ at SQ SN:AYCK01029106.1 LN:1343
+ at SQ SN:AYCK01030624.1 LN:1343
+ at SQ SN:AYCK01030625.1 LN:1341
+ at SQ SN:AYCK01030626.1 LN:1340
+ at SQ SN:AYCK01030627.1 LN:1339
+ at SQ SN:AYCK01030628.1 LN:1338
+ at SQ SN:AYCK01030629.1 LN:1338
+ at SQ SN:AYCK01030630.1 LN:1338
+ at SQ SN:AYCK01030631.1 LN:1338
+ at SQ SN:AYCK01030632.1 LN:1337
+ at SQ SN:AYCK01030633.1 LN:1337
+ at SQ SN:AYCK01030634.1 LN:1337
+ at SQ SN:AYCK01030635.1 LN:1337
+ at SQ SN:AYCK01030636.1 LN:1337
+ at SQ SN:AYCK01030637.1 LN:1336
+ at SQ SN:AYCK01030638.1 LN:1333
+ at SQ SN:AYCK01030639.1 LN:1333
+ at SQ SN:AYCK01030640.1 LN:1332
+ at SQ SN:AYCK01030641.1 LN:1332
+ at SQ SN:AYCK01030642.1 LN:1332
+ at SQ SN:AYCK01030643.1 LN:1329
+ at SQ SN:AYCK01030644.1 LN:1329
+ at SQ SN:AYCK01030645.1 LN:1327
+ at SQ SN:AYCK01030646.1 LN:1327
+ at SQ SN:AYCK01029109.1 LN:1326
+ at SQ SN:AYCK01030647.1 LN:1326
+ at SQ SN:AYCK01030648.1 LN:1325
+ at SQ SN:AYCK01030649.1 LN:1325
+ at SQ SN:AYCK01030650.1 LN:1324
+ at SQ SN:AYCK01030651.1 LN:1323
+ at SQ SN:AYCK01030652.1 LN:1323
+ at SQ SN:AYCK01029110.1 LN:1321
+ at SQ SN:AYCK01030653.1 LN:1320
+ at SQ SN:AYCK01029113.1 LN:1319
+ at SQ SN:AYCK01029114.1 LN:1317
+ at SQ SN:AYCK01030654.1 LN:1317
+ at SQ SN:AYCK01030655.1 LN:1317
+ at SQ SN:AYCK01029115.1 LN:1316
+ at SQ SN:AYCK01030656.1 LN:1316
+ at SQ SN:AYCK01030657.1 LN:1316
+ at SQ SN:AYCK01030658.1 LN:1316
+ at SQ SN:AYCK01030659.1 LN:1315
+ at SQ SN:AYCK01030660.1 LN:1315
+ at SQ SN:AYCK01030661.1 LN:1315
+ at SQ SN:AYCK01030662.1 LN:1312
+ at SQ SN:AYCK01030663.1 LN:1312
+ at SQ SN:AYCK01030664.1 LN:1312
+ at SQ SN:AYCK01030665.1 LN:1312
+ at SQ SN:AYCK01030666.1 LN:1310
+ at SQ SN:AYCK01030667.1 LN:1305
+ at SQ SN:AYCK01030668.1 LN:1305
+ at SQ SN:AYCK01030669.1 LN:1305
+ at SQ SN:AYCK01030670.1 LN:1305
+ at SQ SN:AYCK01030671.1 LN:1304
+ at SQ SN:AYCK01030672.1 LN:1304
+ at SQ SN:AYCK01030673.1 LN:1303
+ at SQ SN:AYCK01030674.1 LN:1303
+ at SQ SN:AYCK01030675.1 LN:1303
+ at SQ SN:AYCK01030676.1 LN:1302
+ at SQ SN:AYCK01030677.1 LN:1302
+ at SQ SN:AYCK01030678.1 LN:1301
+ at SQ SN:AYCK01029118.1 LN:1300
+ at SQ SN:AYCK01030679.1 LN:1300
+ at SQ SN:AYCK01030680.1 LN:1299
+ at SQ SN:AYCK01030681.1 LN:1298
+ at SQ SN:AYCK01030682.1 LN:1296
+ at SQ SN:AYCK01030683.1 LN:1295
+ at SQ SN:AYCK01030684.1 LN:1294
+ at SQ SN:AYCK01030685.1 LN:1293
+ at SQ SN:AYCK01030686.1 LN:1292
+ at SQ SN:AYCK01029123.1 LN:1291
+ at SQ SN:AYCK01030687.1 LN:1291
+ at SQ SN:AYCK01030688.1 LN:1291
+ at SQ SN:AYCK01030689.1 LN:1291
+ at SQ SN:AYCK01029124.1 LN:1290
+ at SQ SN:AYCK01030690.1 LN:1289
+ at SQ SN:AYCK01030691.1 LN:1289
+ at SQ SN:AYCK01030692.1 LN:1288
+ at SQ SN:AYCK01030693.1 LN:1286
+ at SQ SN:AYCK01030694.1 LN:1286
+ at SQ SN:AYCK01029125.1 LN:1285
+ at SQ SN:AYCK01030695.1 LN:1285
+ at SQ SN:AYCK01030696.1 LN:1285
+ at SQ SN:AYCK01029126.1 LN:1284
+ at SQ SN:AYCK01030697.1 LN:1283
+ at SQ SN:AYCK01029127.1 LN:1282
+ at SQ SN:AYCK01030698.1 LN:1282
+ at SQ SN:AYCK01030699.1 LN:1282
+ at SQ SN:AYCK01029128.1 LN:1281
+ at SQ SN:AYCK01029131.1 LN:1281
+ at SQ SN:AYCK01030700.1 LN:1281
+ at SQ SN:AYCK01030701.1 LN:1281
+ at SQ SN:AYCK01030702.1 LN:1280
+ at SQ SN:AYCK01030703.1 LN:1278
+ at SQ SN:AYCK01030704.1 LN:1278
+ at SQ SN:AYCK01030705.1 LN:1276
+ at SQ SN:AYCK01030706.1 LN:1275
+ at SQ SN:AYCK01030707.1 LN:1274
+ at SQ SN:AYCK01030708.1 LN:1273
+ at SQ SN:AYCK01030709.1 LN:1273
+ at SQ SN:AYCK01030710.1 LN:1271
+ at SQ SN:AYCK01029132.1 LN:1268
+ at SQ SN:AYCK01030711.1 LN:1268
+ at SQ SN:AYCK01030712.1 LN:1268
+ at SQ SN:AYCK01030713.1 LN:1266
+ at SQ SN:AYCK01030714.1 LN:1266
+ at SQ SN:AYCK01030715.1 LN:1266
+ at SQ SN:AYCK01030716.1 LN:1264
+ at SQ SN:AYCK01030717.1 LN:1263
+ at SQ SN:AYCK01030718.1 LN:1263
+ at SQ SN:AYCK01030719.1 LN:1263
+ at SQ SN:AYCK01030720.1 LN:1263
+ at SQ SN:AYCK01030721.1 LN:1262
+ at SQ SN:AYCK01030722.1 LN:1262
+ at SQ SN:AYCK01030723.1 LN:1261
+ at SQ SN:AYCK01030724.1 LN:1261
+ at SQ SN:AYCK01030725.1 LN:1260
+ at SQ SN:AYCK01030726.1 LN:1260
+ at SQ SN:AYCK01030727.1 LN:1260
+ at SQ SN:AYCK01029133.1 LN:1257
+ at SQ SN:AYCK01030728.1 LN:1257
+ at SQ SN:AYCK01030729.1 LN:1257
+ at SQ SN:AYCK01030730.1 LN:1257
+ at SQ SN:AYCK01030731.1 LN:1257
+ at SQ SN:AYCK01030732.1 LN:1257
+ at SQ SN:AYCK01030733.1 LN:1257
+ at SQ SN:AYCK01029136.1 LN:1255
+ at SQ SN:AYCK01030734.1 LN:1253
+ at SQ SN:AYCK01030735.1 LN:1253
+ at SQ SN:AYCK01030736.1 LN:1252
+ at SQ SN:AYCK01030737.1 LN:1252
+ at SQ SN:AYCK01030738.1 LN:1252
+ at SQ SN:AYCK01030739.1 LN:1250
+ at SQ SN:AYCK01030740.1 LN:1250
+ at SQ SN:AYCK01030741.1 LN:1249
+ at SQ SN:AYCK01030742.1 LN:1249
+ at SQ SN:AYCK01030743.1 LN:1248
+ at SQ SN:AYCK01029137.1 LN:1247
+ at SQ SN:AYCK01030744.1 LN:1246
+ at SQ SN:AYCK01029138.1 LN:1245
+ at SQ SN:AYCK01030745.1 LN:1245
+ at SQ SN:AYCK01030746.1 LN:1244
+ at SQ SN:AYCK01030747.1 LN:1244
+ at SQ SN:AYCK01030748.1 LN:1243
+ at SQ SN:AYCK01029140.1 LN:1240
+ at SQ SN:AYCK01030749.1 LN:1240
+ at SQ SN:AYCK01030750.1 LN:1239
+ at SQ SN:AYCK01030751.1 LN:1238
+ at SQ SN:AYCK01030752.1 LN:1237
+ at SQ SN:AYCK01030753.1 LN:1236
+ at SQ SN:AYCK01029143.1 LN:1235
+ at SQ SN:AYCK01029144.1 LN:1235
+ at SQ SN:AYCK01030754.1 LN:1234
+ at SQ SN:AYCK01030755.1 LN:1234
+ at SQ SN:AYCK01030756.1 LN:1233
+ at SQ SN:AYCK01030757.1 LN:1233
+ at SQ SN:AYCK01030758.1 LN:1232
+ at SQ SN:AYCK01030759.1 LN:1232
+ at SQ SN:AYCK01030760.1 LN:1231
+ at SQ SN:AYCK01029147.1 LN:1230
+ at SQ SN:AYCK01030761.1 LN:1230
+ at SQ SN:AYCK01029148.1 LN:1228
+ at SQ SN:AYCK01030762.1 LN:1228
+ at SQ SN:AYCK01030763.1 LN:1228
+ at SQ SN:AYCK01030764.1 LN:1227
+ at SQ SN:AYCK01030765.1 LN:1226
+ at SQ SN:AYCK01030766.1 LN:1225
+ at SQ SN:AYCK01029149.1 LN:1222
+ at SQ SN:AYCK01030767.1 LN:1222
+ at SQ SN:AYCK01030768.1 LN:1221
+ at SQ SN:AYCK01029150.1 LN:1220
+ at SQ SN:AYCK01030769.1 LN:1220
+ at SQ SN:AYCK01029151.1 LN:1219
+ at SQ SN:AYCK01030770.1 LN:1219
+ at SQ SN:AYCK01030771.1 LN:1219
+ at SQ SN:AYCK01030772.1 LN:1219
+ at SQ SN:AYCK01030773.1 LN:1218
+ at SQ SN:AYCK01030774.1 LN:1217
+ at SQ SN:AYCK01030775.1 LN:1215
+ at SQ SN:AYCK01030776.1 LN:1214
+ at SQ SN:AYCK01030777.1 LN:1214
+ at SQ SN:AYCK01030778.1 LN:1213
+ at SQ SN:AYCK01029154.1 LN:1212
+ at SQ SN:AYCK01029155.1 LN:1211
+ at SQ SN:AYCK01030779.1 LN:1211
+ at SQ SN:AYCK01030780.1 LN:1210
+ at SQ SN:AYCK01030781.1 LN:1208
+ at SQ SN:AYCK01030782.1 LN:1208
+ at SQ SN:AYCK01030783.1 LN:1207
+ at SQ SN:AYCK01030784.1 LN:1206
+ at SQ SN:AYCK01030785.1 LN:1205
+ at SQ SN:AYCK01030786.1 LN:1205
+ at SQ SN:AYCK01030787.1 LN:1204
+ at SQ SN:AYCK01030788.1 LN:1204
+ at SQ SN:AYCK01030789.1 LN:1203
+ at SQ SN:AYCK01030790.1 LN:1203
+ at SQ SN:AYCK01030791.1 LN:1203
+ at SQ SN:AYCK01029156.1 LN:1202
+ at SQ SN:AYCK01030792.1 LN:1202
+ at SQ SN:AYCK01030793.1 LN:1199
+ at SQ SN:AYCK01030794.1 LN:1197
+ at SQ SN:AYCK01030795.1 LN:1196
+ at SQ SN:AYCK01030796.1 LN:1196
+ at SQ SN:AYCK01030797.1 LN:1195
+ at SQ SN:AYCK01030798.1 LN:1195
+ at SQ SN:AYCK01030799.1 LN:1193
+ at SQ SN:AYCK01030800.1 LN:1192
+ at SQ SN:AYCK01030801.1 LN:1192
+ at SQ SN:AYCK01029157.1 LN:1191
+ at SQ SN:AYCK01030802.1 LN:1191
+ at SQ SN:AYCK01030803.1 LN:1190
+ at SQ SN:AYCK01030804.1 LN:1188
+ at SQ SN:AYCK01030805.1 LN:1188
+ at SQ SN:AYCK01030806.1 LN:1188
+ at SQ SN:AYCK01030807.1 LN:1188
+ at SQ SN:AYCK01030808.1 LN:1187
+ at SQ SN:AYCK01030809.1 LN:1187
+ at SQ SN:AYCK01029158.1 LN:1186
+ at SQ SN:AYCK01029159.1 LN:1186
+ at SQ SN:AYCK01030810.1 LN:1185
+ at SQ SN:AYCK01030811.1 LN:1185
+ at SQ SN:AYCK01030812.1 LN:1185
+ at SQ SN:AYCK01030813.1 LN:1184
+ at SQ SN:AYCK01029160.1 LN:1183
+ at SQ SN:AYCK01030814.1 LN:1183
+ at SQ SN:AYCK01030815.1 LN:1181
+ at SQ SN:AYCK01030816.1 LN:1181
+ at SQ SN:AYCK01030817.1 LN:1180
+ at SQ SN:AYCK01030818.1 LN:1180
+ at SQ SN:AYCK01030819.1 LN:1178
+ at SQ SN:AYCK01030820.1 LN:1178
+ at SQ SN:AYCK01030821.1 LN:1178
+ at SQ SN:AYCK01030822.1 LN:1178
+ at SQ SN:AYCK01030823.1 LN:1178
+ at SQ SN:AYCK01030824.1 LN:1177
+ at SQ SN:AYCK01030825.1 LN:1177
+ at SQ SN:AYCK01030826.1 LN:1176
+ at SQ SN:AYCK01030827.1 LN:1175
+ at SQ SN:AYCK01030828.1 LN:1174
+ at SQ SN:AYCK01030829.1 LN:1174
+ at SQ SN:AYCK01029161.1 LN:1173
+ at SQ SN:AYCK01030830.1 LN:1172
+ at SQ SN:AYCK01030831.1 LN:1172
+ at SQ SN:AYCK01030832.1 LN:1169
+ at SQ SN:AYCK01030833.1 LN:1169
+ at SQ SN:AYCK01030834.1 LN:1169
+ at SQ SN:AYCK01029162.1 LN:1168
+ at SQ SN:AYCK01030835.1 LN:1168
+ at SQ SN:AYCK01030836.1 LN:1168
+ at SQ SN:AYCK01029163.1 LN:1167
+ at SQ SN:AYCK01029164.1 LN:1167
+ at SQ SN:AYCK01030837.1 LN:1167
+ at SQ SN:AYCK01030838.1 LN:1167
+ at SQ SN:AYCK01030839.1 LN:1167
+ at SQ SN:AYCK01030840.1 LN:1167
+ at SQ SN:AYCK01029165.1 LN:1163
+ at SQ SN:AYCK01030841.1 LN:1163
+ at SQ SN:AYCK01030842.1 LN:1163
+ at SQ SN:AYCK01030843.1 LN:1162
+ at SQ SN:AYCK01029166.1 LN:1161
+ at SQ SN:AYCK01030844.1 LN:1161
+ at SQ SN:AYCK01030845.1 LN:1161
+ at SQ SN:AYCK01030846.1 LN:1160
+ at SQ SN:AYCK01030847.1 LN:1160
+ at SQ SN:AYCK01030848.1 LN:1160
+ at SQ SN:AYCK01030849.1 LN:1160
+ at SQ SN:AYCK01030850.1 LN:1159
+ at SQ SN:AYCK01030851.1 LN:1158
+ at SQ SN:AYCK01030852.1 LN:1158
+ at SQ SN:AYCK01030853.1 LN:1157
+ at SQ SN:AYCK01030854.1 LN:1157
+ at SQ SN:AYCK01030855.1 LN:1156
+ at SQ SN:AYCK01030856.1 LN:1155
+ at SQ SN:AYCK01030857.1 LN:1155
+ at SQ SN:AYCK01030858.1 LN:1154
+ at SQ SN:AYCK01030859.1 LN:1153
+ at SQ SN:AYCK01029167.1 LN:1152
+ at SQ SN:AYCK01029168.1 LN:1150
+ at SQ SN:AYCK01030860.1 LN:1150
+ at SQ SN:AYCK01030861.1 LN:1149
+ at SQ SN:AYCK01030862.1 LN:1149
+ at SQ SN:AYCK01030863.1 LN:1148
+ at SQ SN:AYCK01029169.1 LN:1146
+ at SQ SN:AYCK01030864.1 LN:1146
+ at SQ SN:AYCK01030865.1 LN:1146
+ at SQ SN:AYCK01029170.1 LN:1145
+ at SQ SN:AYCK01030866.1 LN:1145
+ at SQ SN:AYCK01030867.1 LN:1145
+ at SQ SN:AYCK01029171.1 LN:1144
+ at SQ SN:AYCK01030868.1 LN:1144
+ at SQ SN:AYCK01030869.1 LN:1144
+ at SQ SN:AYCK01030870.1 LN:1144
+ at SQ SN:AYCK01030871.1 LN:1144
+ at SQ SN:AYCK01030872.1 LN:1143
+ at SQ SN:AYCK01030873.1 LN:1143
+ at SQ SN:AYCK01030874.1 LN:1143
+ at SQ SN:AYCK01030875.1 LN:1142
+ at SQ SN:AYCK01030876.1 LN:1142
+ at SQ SN:AYCK01030877.1 LN:1142
+ at SQ SN:AYCK01029172.1 LN:1141
+ at SQ SN:AYCK01029173.1 LN:1141
+ at SQ SN:AYCK01029174.1 LN:1140
+ at SQ SN:AYCK01030878.1 LN:1140
+ at SQ SN:AYCK01030879.1 LN:1140
+ at SQ SN:AYCK01029175.1 LN:1139
+ at SQ SN:AYCK01030880.1 LN:1139
+ at SQ SN:AYCK01030881.1 LN:1139
+ at SQ SN:AYCK01030882.1 LN:1138
+ at SQ SN:AYCK01030883.1 LN:1137
+ at SQ SN:AYCK01030884.1 LN:1136
+ at SQ SN:AYCK01030885.1 LN:1134
+ at SQ SN:AYCK01030886.1 LN:1133
+ at SQ SN:AYCK01030887.1 LN:1132
+ at SQ SN:AYCK01030888.1 LN:1132
+ at SQ SN:AYCK01030889.1 LN:1132
+ at SQ SN:AYCK01030890.1 LN:1132
+ at SQ SN:AYCK01030891.1 LN:1130
+ at SQ SN:AYCK01030892.1 LN:1130
+ at SQ SN:AYCK01029176.1 LN:1126
+ at SQ SN:AYCK01029177.1 LN:1125
+ at SQ SN:AYCK01030893.1 LN:1125
+ at SQ SN:AYCK01030894.1 LN:1125
+ at SQ SN:AYCK01029178.1 LN:1124
+ at SQ SN:AYCK01030895.1 LN:1124
+ at SQ SN:AYCK01030896.1 LN:1123
+ at SQ SN:AYCK01030897.1 LN:1123
+ at SQ SN:AYCK01030898.1 LN:1123
+ at SQ SN:AYCK01030899.1 LN:1123
+ at SQ SN:AYCK01029179.1 LN:1122
+ at SQ SN:AYCK01030900.1 LN:1122
+ at SQ SN:AYCK01030901.1 LN:1121
+ at SQ SN:AYCK01030902.1 LN:1121
+ at SQ SN:AYCK01030903.1 LN:1119
+ at SQ SN:AYCK01030904.1 LN:1119
+ at SQ SN:AYCK01030905.1 LN:1117
+ at SQ SN:AYCK01030906.1 LN:1116
+ at SQ SN:AYCK01030907.1 LN:1116
+ at SQ SN:AYCK01030908.1 LN:1116
+ at SQ SN:AYCK01030909.1 LN:1115
+ at SQ SN:AYCK01030910.1 LN:1115
+ at SQ SN:AYCK01029180.1 LN:1114
+ at SQ SN:AYCK01030911.1 LN:1114
+ at SQ SN:AYCK01030912.1 LN:1114
+ at SQ SN:AYCK01030913.1 LN:1113
+ at SQ SN:AYCK01030914.1 LN:1113
+ at SQ SN:AYCK01030915.1 LN:1112
+ at SQ SN:AYCK01030916.1 LN:1112
+ at SQ SN:AYCK01030917.1 LN:1111
+ at SQ SN:AYCK01030918.1 LN:1111
+ at SQ SN:AYCK01030919.1 LN:1111
+ at SQ SN:AYCK01030920.1 LN:1110
+ at SQ SN:AYCK01030921.1 LN:1109
+ at SQ SN:AYCK01030922.1 LN:1107
+ at SQ SN:AYCK01030923.1 LN:1106
+ at SQ SN:AYCK01030924.1 LN:1106
+ at SQ SN:AYCK01029181.1 LN:1105
+ at SQ SN:AYCK01030925.1 LN:1104
+ at SQ SN:AYCK01029182.1 LN:1103
+ at SQ SN:AYCK01030926.1 LN:1103
+ at SQ SN:AYCK01030927.1 LN:1102
+ at SQ SN:AYCK01030928.1 LN:1098
+ at SQ SN:AYCK01030929.1 LN:1095
+ at SQ SN:AYCK01030930.1 LN:1094
+ at SQ SN:AYCK01029183.1 LN:1092
+ at SQ SN:AYCK01029184.1 LN:1092
+ at SQ SN:AYCK01030931.1 LN:1092
+ at SQ SN:AYCK01030932.1 LN:1092
+ at SQ SN:AYCK01030933.1 LN:1090
+ at SQ SN:AYCK01030934.1 LN:1089
+ at SQ SN:AYCK01030935.1 LN:1086
+ at SQ SN:AYCK01030936.1 LN:1085
+ at SQ SN:AYCK01030937.1 LN:1084
+ at SQ SN:AYCK01030938.1 LN:1083
+ at SQ SN:AYCK01029185.1 LN:1082
+ at SQ SN:AYCK01030939.1 LN:1082
+ at SQ SN:AYCK01030940.1 LN:1082
+ at SQ SN:AYCK01030941.1 LN:1082
+ at SQ SN:AYCK01030942.1 LN:1081
+ at SQ SN:AYCK01030943.1 LN:1080
+ at SQ SN:AYCK01030944.1 LN:1080
+ at SQ SN:AYCK01030945.1 LN:1079
+ at SQ SN:AYCK01030946.1 LN:1079
+ at SQ SN:AYCK01030947.1 LN:1079
+ at SQ SN:AYCK01029139.1 LN:1078
+ at SQ SN:AYCK01029186.1 LN:1078
+ at SQ SN:AYCK01030948.1 LN:1078
+ at SQ SN:AYCK01029187.1 LN:1077
+ at SQ SN:AYCK01030949.1 LN:1077
+ at SQ SN:AYCK01030950.1 LN:1075
+ at SQ SN:AYCK01030951.1 LN:1074
+ at SQ SN:AYCK01030952.1 LN:1073
+ at SQ SN:AYCK01030953.1 LN:1073
+ at SQ SN:AYCK01030954.1 LN:1072
+ at SQ SN:AYCK01030955.1 LN:1072
+ at SQ SN:AYCK01029188.1 LN:1071
+ at SQ SN:AYCK01030956.1 LN:1070
+ at SQ SN:AYCK01030957.1 LN:1067
+ at SQ SN:AYCK01030958.1 LN:1067
+ at SQ SN:AYCK01030959.1 LN:1065
+ at SQ SN:AYCK01030960.1 LN:1064
+ at SQ SN:AYCK01030961.1 LN:1064
+ at SQ SN:AYCK01030962.1 LN:1064
+ at SQ SN:AYCK01029189.1 LN:1063
+ at SQ SN:AYCK01029190.1 LN:1061
+ at SQ SN:AYCK01029191.1 LN:1061
+ at SQ SN:AYCK01030963.1 LN:1061
+ at SQ SN:AYCK01029192.1 LN:1060
+ at SQ SN:AYCK01029193.1 LN:1060
+ at SQ SN:AYCK01030964.1 LN:1059
+ at SQ SN:AYCK01030965.1 LN:1058
+ at SQ SN:AYCK01030966.1 LN:1057
+ at SQ SN:AYCK01030967.1 LN:1056
+ at SQ SN:AYCK01029194.1 LN:1054
+ at SQ SN:AYCK01030968.1 LN:1053
+ at SQ SN:AYCK01030969.1 LN:1050
+ at SQ SN:AYCK01030970.1 LN:1050
+ at SQ SN:AYCK01030971.1 LN:1050
+ at SQ SN:AYCK01030972.1 LN:1048
+ at SQ SN:AYCK01029195.1 LN:1047
+ at SQ SN:AYCK01029196.1 LN:1047
+ at SQ SN:AYCK01030973.1 LN:1047
+ at SQ SN:AYCK01030974.1 LN:1046
+ at SQ SN:AYCK01030975.1 LN:1045
+ at SQ SN:AYCK01030976.1 LN:1045
+ at SQ SN:AYCK01030977.1 LN:1044
+ at SQ SN:AYCK01030978.1 LN:1040
+ at SQ SN:AYCK01029197.1 LN:1038
+ at SQ SN:AYCK01029198.1 LN:1038
+ at SQ SN:AYCK01030979.1 LN:1038
+ at SQ SN:AYCK01030980.1 LN:1038
+ at SQ SN:AYCK01030981.1 LN:1037
+ at SQ SN:AYCK01030982.1 LN:1037
+ at SQ SN:AYCK01030983.1 LN:1035
+ at SQ SN:AYCK01030984.1 LN:1035
+ at SQ SN:AYCK01029199.1 LN:1029
+ at SQ SN:AYCK01030985.1 LN:1028
+ at SQ SN:AYCK01029200.1 LN:1026
+ at SQ SN:AYCK01030986.1 LN:1024
+ at SQ SN:AYCK01029201.1 LN:1022
+ at SQ SN:AYCK01030987.1 LN:1022
+ at SQ SN:AYCK01030988.1 LN:1021
+ at SQ SN:AYCK01029202.1 LN:1016
+ at SQ SN:AYCK01030989.1 LN:1016
+ at SQ SN:AYCK01030990.1 LN:1015
+ at SQ SN:AYCK01030991.1 LN:1014
+ at SQ SN:AYCK01030992.1 LN:1014
+ at SQ SN:AYCK01029203.1 LN:1012
+ at SQ SN:AYCK01030993.1 LN:1011
+ at SQ SN:AYCK01030994.1 LN:1011
+ at SQ SN:AYCK01029204.1 LN:1010
+ at SQ SN:AYCK01030995.1 LN:1010
+ at SQ SN:AYCK01029205.1 LN:1008
+ at SQ SN:AYCK01030996.1 LN:1007
+ at SQ SN:AYCK01030997.1 LN:1007
+ at SQ SN:AYCK01030998.1 LN:1006
+ at SQ SN:AYCK01030999.1 LN:1006
+ at SQ SN:AYCK01031000.1 LN:1004
+ at SQ SN:AYCK01029206.1 LN:1002
+ at SQ SN:AYCK01031001.1 LN:1002
+ at SQ SN:AYCK01031002.1 LN:1002
+ at SQ SN:AYCK01031003.1 LN:1001
+ at SQ SN:AYCK01031004.1 LN:1001
+ at SQ SN:AYCK01031005.1 LN:992
+ at SQ SN:AYCK01031006.1 LN:992
+ at SQ SN:AYCK01031007.1 LN:992
+ at SQ SN:AYCK01031008.1 LN:990
+ at SQ SN:AYCK01029207.1 LN:989
+ at SQ SN:AYCK01031009.1 LN:987
+ at SQ SN:AYCK01031010.1 LN:987
+ at SQ SN:AYCK01031011.1 LN:986
+ at SQ SN:AYCK01029208.1 LN:983
+ at SQ SN:AYCK01031012.1 LN:983
+ at SQ SN:AYCK01031013.1 LN:982
+ at SQ SN:AYCK01031014.1 LN:980
+ at SQ SN:AYCK01031015.1 LN:979
+ at SQ SN:AYCK01031016.1 LN:976
+ at SQ SN:AYCK01031017.1 LN:974
+ at SQ SN:AYCK01031018.1 LN:973
+ at SQ SN:AYCK01031019.1 LN:970
+ at SQ SN:AYCK01029209.1 LN:968
+ at SQ SN:AYCK01031020.1 LN:967
+ at SQ SN:AYCK01031021.1 LN:967
+ at SQ SN:AYCK01031022.1 LN:966
+ at SQ SN:AYCK01029210.1 LN:965
+ at SQ SN:AYCK01031023.1 LN:963
+ at SQ SN:AYCK01029211.1 LN:959
+ at SQ SN:AYCK01031024.1 LN:957
+ at SQ SN:AYCK01031025.1 LN:948
+ at SQ SN:AYCK01031026.1 LN:947
+ at SQ SN:AYCK01029212.1 LN:940
+ at SQ SN:AYCK01029213.1 LN:934
+ at SQ SN:AYCK01031027.1 LN:932
+ at SQ SN:AYCK01031028.1 LN:927
+ at SQ SN:AYCK01029214.1 LN:925
+ at SQ SN:AYCK01029215.1 LN:922
+ at SQ SN:AYCK01031029.1 LN:919
+ at SQ SN:AYCK01031030.1 LN:917
+ at SQ SN:AYCK01029216.1 LN:914
+ at SQ SN:AYCK01029217.1 LN:900
+ at SQ SN:AYCK01029218.1 LN:890
+ at SQ SN:AYCK01029219.1 LN:888
+ at SQ SN:AYCK01029220.1 LN:864
+ at SQ SN:AYCK01029221.1 LN:855
+ at SQ SN:AYCK01029222.1 LN:827
+ at SQ SN:AYCK01029223.1 LN:826
+ at SQ SN:AYCK01031031.1 LN:823
+ at SQ SN:AYCK01029224.1 LN:812
+ at SQ SN:AYCK01029225.1 LN:811
+ at SQ SN:AYCK01029228.1 LN:787
+ at SQ SN:AYCK01029229.1 LN:776
+ at SQ SN:AYCK01029230.1 LN:774
+ at SQ SN:AYCK01029231.1 LN:773
+ at SQ SN:AYCK01029232.1 LN:773
+ at SQ SN:AYCK01029233.1 LN:768
+ at SQ SN:AYCK01029234.1 LN:760
+ at SQ SN:AYCK01029235.1 LN:758
+ at SQ SN:AYCK01029236.1 LN:756
+ at SQ SN:AYCK01031032.1 LN:737
+ at SQ SN:AYCK01029237.1 LN:723
+ at SQ SN:AYCK01031033.1 LN:719
+ at SQ SN:AYCK01029238.1 LN:714
+ at SQ SN:AYCK01029239.1 LN:712
+ at SQ SN:AYCK01029240.1 LN:709
+ at SQ SN:AYCK01029241.1 LN:698
+ at SQ SN:AYCK01031034.1 LN:677
+ at SQ SN:AYCK01029244.1 LN:634
+ at SQ SN:AYCK01029245.1 LN:621
+ at SQ SN:AYCK01031035.1 LN:614
+ at SQ SN:AYCK01031036.1 LN:608
+ at SQ SN:AYCK01029246.1 LN:604
+ at SQ SN:AYCK01029247.1 LN:595
+ at SQ SN:AYCK01029248.1 LN:592
+ at SQ SN:AYCK01029249.1 LN:586
+ at SQ SN:AYCK01029250.1 LN:578
+ at SQ SN:AYCK01029251.1 LN:563
+ at SQ SN:AYCK01029252.1 LN:559
+ at SQ SN:AYCK01031037.1 LN:556
+ at SQ SN:AYCK01029253.1 LN:553
+ at SQ SN:AYCK01031038.1 LN:550
+ at SQ SN:AYCK01029254.1 LN:545
+ at SQ SN:AYCK01029255.1 LN:545
+ at SQ SN:AYCK01031039.1 LN:541
+ at SQ SN:AYCK01029256.1 LN:532
+ at SQ SN:AYCK01029257.1 LN:500
+ at SQ SN:AYCK01031040.1 LN:499
+ at SQ SN:AYCK01031041.1 LN:492
+ at SQ SN:AYCK01029258.1 LN:489
+ at SQ SN:AYCK01029259.1 LN:473
+ at SQ SN:AYCK01029260.1 LN:471
+ at SQ SN:AYCK01031042.1 LN:466
+ at SQ SN:AYCK01029261.1 LN:461
+ at SQ SN:AYCK01029262.1 LN:456
+ at SQ SN:AYCK01031043.1 LN:456
+ at SQ SN:AYCK01029263.1 LN:439
+ at SQ SN:AYCK01029264.1 LN:435
+ at SQ SN:AYCK01031044.1 LN:417
+ at SQ SN:AYCK01029265.1 LN:397
+ at SQ SN:AYCK01031045.1 LN:388
+ at SQ SN:AYCK01031046.1 LN:387
+ at SQ SN:AYCK01031047.1 LN:384
+ at SQ SN:AYCK01031048.1 LN:379
+ at SQ SN:AYCK01029266.1 LN:377
+ at SQ SN:AYCK01029267.1 LN:366
+ at SQ SN:AYCK01029268.1 LN:364
+ at SQ SN:AYCK01029269.1 LN:361
+ at SQ SN:AYCK01031049.1 LN:356
+ at SQ SN:AYCK01029270.1 LN:353
+ at SQ SN:AYCK01029271.1 LN:353
+ at SQ SN:AYCK01031050.1 LN:333
+ at SQ SN:AYCK01029272.1 LN:329
+ at SQ SN:AYCK01029273.1 LN:324
+ at SQ SN:AYCK01029274.1 LN:320
+ at SQ SN:AYCK01029275.1 LN:316
+ at SQ SN:AYCK01029276.1 LN:314
+ at SQ SN:AYCK01029277.1 LN:309
+ at SQ SN:AYCK01031051.1 LN:301
+ at SQ SN:AYCK01031052.1 LN:301
+ at SQ SN:AYCK01029278.1 LN:298
+ at SQ SN:AYCK01029279.1 LN:295
+ at SQ SN:AYCK01029280.1 LN:294
+ at SQ SN:AYCK01031053.1 LN:293
+ at SQ SN:AYCK01031054.1 LN:289
+ at SQ SN:AYCK01029281.1 LN:277
+ at SQ SN:AYCK01029282.1 LN:276
+ at SQ SN:AYCK01031055.1 LN:269
+ at SQ SN:AYCK01031056.1 LN:268
+ at SQ SN:AYCK01029283.1 LN:267
+ at SQ SN:AYCK01029284.1 LN:252
+ at SQ SN:AYCK01031057.1 LN:245
+ at SQ SN:AYCK01031058.1 LN:240
+ at SQ SN:AYCK01029285.1 LN:233
+ at SQ SN:AYCK01029286.1 LN:218
+ at SQ SN:AYCK01029287.1 LN:202
+ at 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
+ at 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
+ at 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
+ at 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
diff --git a/test/data/b7_295_chunk.bam b/test/data/b7_295_chunk.bam
new file mode 100644
index 0000000..6eb87ed
Binary files /dev/null and b/test/data/b7_295_chunk.bam differ
diff --git a/test/data/bins.bam b/test/data/bins.bam
new file mode 100644
index 0000000..d04b8da
Binary files /dev/null and b/test/data/bins.bam differ
diff --git a/test/data/bins.bam.bai b/test/data/bins.bam.bai
new file mode 100644
index 0000000..134d1f5
Binary files /dev/null and b/test/data/bins.bam.bai differ
diff --git a/test/data/corrupted_zlib_archive.bam b/test/data/corrupted_zlib_archive.bam
new file mode 100644
index 0000000..8ceaf9c
Binary files /dev/null and b/test/data/corrupted_zlib_archive.bam differ
diff --git a/test/data/duplicated_block_size.bam b/test/data/duplicated_block_size.bam
new file mode 100644
index 0000000..22d1855
Binary files /dev/null and b/test/data/duplicated_block_size.bam differ
diff --git a/test/data/ex1_header.bam b/test/data/ex1_header.bam
new file mode 100644
index 0000000..9f43127
Binary files /dev/null and b/test/data/ex1_header.bam differ
diff --git a/test/data/ex1_header.bam.bai b/test/data/ex1_header.bam.bai
new file mode 100644
index 0000000..e6165bb
Binary files /dev/null and b/test/data/ex1_header.bam.bai differ
diff --git a/test/data/ex1_header.sam b/test/data/ex1_header.sam
new file mode 100644
index 0000000..81a4229
--- /dev/null
+++ b/test/data/ex1_header.sam
@@ -0,0 +1,3273 @@
+ at HD VN:1.3 SO:coordinate
+ at SQ SN:chr1 LN:1575
+ at SQ SN:chr2 LN:1584
+EAS56_57:6:190:289:82 69 chr1 100 0 * = 100 0 CTCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA <<<7<<<;<<<<<<<<8;;<7;4<;<;;;;;94<; MF:i:192
+EAS56_57:6:190:289:82 137 chr1 100 73 35M = 100 0 AGGGGTGCAGAGCCGAGTCACGGGGTTGCCAGCAC <<<<<<;<<<<<<<<<<;<<;<<<<;8<6;9;;2; MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+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
+EAS112_34:7:141:80:875 99 chr1 110 99 35M = 265 190 AGCCGAGTCACGGGGTTGCCAGCACAGGGGCTTAA <<<<<<<<<<<<<<<<<<<<<<:<<8;<<8+7;-7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:40:1128:1940 163 chr1 112 99 35M = 291 214 CCGAGTCACGGGGTTGCCAGCACAGGGGCTTAACC <<<<<<<<<<<<<<<<<<<;<<5;;<<<9;;;;7: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:290:319:736 69 chr1 113 0 * = 113 0 GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC <<<<<<:7:<.<<<<7<<.<.<<.9*<4<:<4%74 MF:i:192
+EAS51_62:5:290:319:736 137 chr1 113 73 35M = 113 0 CGAGTCACGGGGTTGCCAGCACAGGGGCTTAACCT ==;=======7====6=;==:;;====66=::27: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:132:493:921 69 chr1 119 0 * = 119 0 GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC <<<<<<<<<<<<<<<<<<<;<<<<77;0<;;6777 MF:i:192
+B7_597:2:132:493:921 137 chr1 119 75 35M = 119 0 ACGGGGTTGCCAGCACAGGGGCTTAACCTCTGGTG <<<<<<<<<<<<<<<<;<<<<<<<<;<<<<;;88: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:283:799:560 163 chr1 121 66 35M = 283 197 GGGGTTGCCAGCACAGGGGCTTAACCTCTGGTGAC <<<<+<<<<8<<<+<<<<<;<<:07;8;7402447 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:225:195:543 99 chr1 123 99 35M = 299 211 GGTTGCCAGCACAGGGGCTTAACCTCTGGTGACTG <<<<<<<<<<<<<<<<<<<<<<<9<<;::388998 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:114:714:317 99 chr1 126 99 35M = 311 220 TGCCAGCACAGGGGCTTAACCTCTGGTGACTGCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<5;<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:70:147:84 163 chr1 128 73 35M = 285 192 CCAGCACAGGGGCTTAACCTCTGGTGACTGCCAGA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;(5<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:187:227:818 163 chr1 129 99 35M = 290 196 CAGCACAGGGGCTTAACCTCTGGTGACTGCCAGAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:77:29:126 99 chr1 131 99 35M = 315 219 GCACAGGGGCTTAACCTCTGGTGACTGCCAGAGCT <<<<<<<<<<3<<<<<<<;;;7<;<<449<-:977 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:327:795:103 99 chr1 133 99 35M = 302 204 ACAGGGGCTTAACCTCTGGTGACTGCCAGAGCTGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:139:117:262 69 chr1 135 0 * = 135 0 GTTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAAC <<<7<<<<<<<<<<<<<<<<<<<;<;<<<<<37;3 MF:i:192
+EAS114_30:3:139:117:262 137 chr1 135 76 35M = 135 0 AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG <<<<;<<<<<<<<<<<<<:<<<<<:<<8<<<<:<: MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:29:817:854 73 chr1 135 77 35M = 135 0 AGGGGCTTAACCTCTGGTGACTGCCAGAGCTGCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:29:817:854 133 chr1 135 0 * = 135 0 GTTCTCAAGGTTGTTGCAAGGGGGTTTATGTGAAC <<<<<<<<<<<<<<<1..;:;;;;1%407)07&7. MF:i:192
+EAS192_3:6:170:169:57 163 chr1 138 99 35M = 296 193 GGCTTGACCTCTGGTGACTGCCAGAGCTGCTGGCC <<<<<;<<<<<<;<<<<<<<<<<<<:<<<<<;;+% MF:i:18 Aq:i:45 NM:i:2 UQ:i:30 H0:i:0 H1:i:1
+B7_595:4:84:802:737 99 chr1 140 68 35M = 284 179 CTTAACCTCTGGTGACTGCCAGAGCTGCTGGCAAG <<<<<<<<<<;9<9<<<;<<;73;<<<<<37;1+. MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:78:583:670 163 chr1 142 99 35M = 316 209 TAACCTCTGGTGACTGCCAGAGCTGCTGGCAAGCT <<<<<<<<<<;;;<;;<<<:7;5;<5;;<2--8-; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:90:435:691 99 chr1 147 99 35M = 318 206 TCTGGTGACTGCCAGAGCTGCTGGCAAGCTAGAGT <<<<<<<<<<;<<<;<<<<:<<<;<81;<<1;784 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:13:122:187 163 chr1 153 99 35M = 343 225 GACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCCTT <<<<<<<;<;<<<;<<<<:;6<<<<;;;;:<<%%< MF:i:18 Aq:i:69 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS221_1:6:69:735:1915 99 chr1 154 99 35M = 321 202 ACTGCCAGAGCTGCTGGCAAGCTAGAGTCCCATTT <<<<<<<<;<<<<<<<<<;<<<<;<8<<<<;1:<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:66:959:1311 163 chr1 159 95 35M = 336 212 CAGAGCTGCTGGCAAGCTAGAGGCCCATCTGGAGC ;;4;;;+;;;-01;;&-;;4;;&;;73)(&**274 MF:i:18 Aq:i:31 NM:i:2 UQ:i:12 H0:i:0 H1:i:1
+EAS56_57:6:325:759:288 99 chr1 163 99 35M = 341 213 GCTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCT 8<;<<<<81<<<<<;<<;<<<;9</;6;;809034 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:82:926:112 99 chr1 164 99 35M = 328 199 CTGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTC <;<<<<<<<<<5<<<<<<<<<<<<<<<;<<1:<4< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:324:728:956 99 chr1 165 99 35M = 322 192 TGCTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCT <<<<<<<<<<<<<<<<<<<<8<<<:<::;;;;<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:294:525:849 163 chr1 167 99 35M = 340 208 CTGGCAAGCTAGAGTCCCATTTGGAGCCCCTCTAA <<<<<<<<<<<<<<<<<<<<<<9+<:<<<<9;;15 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:159:125:297 163 chr1 170 99 35M = 337 202 GCAAGCTAGAGTCCCATTTGGAGCCACTCTAAGAC <<<<<<<<<<<<<<;<<<;<;<<6;)<:9;26;39 MF:i:18 Aq:i:43 NM:i:2 UQ:i:26 H0:i:0 H1:i:1
+EAS54_65:6:164:797:930 99 chr1 173 99 35M = 332 194 AGCTAGAGACCCATTTGGAGCCCCTCTAAGCCGTT <<<<<<<<<<<<<<<;;;:<<<<<;<;<<<<<,:: MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_81:7:293:355:321 163 chr1 174 99 35M = 356 217 GCTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTC <<<:<;<<<<<<<;<<<<<<<<<;<<;4<<<:+:< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:209:653:400 163 chr1 175 99 35M = 340 200 CTAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCT <;<9<<+<2<9<,;;64;<<<<;8<00*1<48:+8 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:62:1109:804 163 chr1 176 99 35M = 350 209 TAGAGTCCCATTTGGAGCCCCTCTAAGCCGTTCTA <<<<<<<<<<<<<:<<:<<<<<<:<:<<<<;;;;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:303:402:142 163 chr1 181 99 35M = 343 197 TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT <8<<<<<<<<<<<<<<<<<<<<<<<46<648;;'; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:321:642:388 163 chr1 181 99 35M = 357 209 TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<8; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:1:1140:1206 163 chr1 181 99 35M = 368 222 TCCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGT ;;;;;;;;;;;;;:9;;7;;:;:;97;:;:88888 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:155:68:326 99 chr1 182 99 36M = 332 186 CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:19:886:279 99 chr1 182 99 35M = 337 190 CCCATTTGGAGCCCCTCTAAGCCGTTCTATTTGTA <9<<<<<<<<<<<<6<28:<<85<<<<<2<;<9<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:4:143:69:578 147 chr1 185 98 35M = 36 -184 ATTGGGAGCCCCTCTAAGCCGTTCTATTTGTAATG 222&<21<<<<12<7<01<<<<<0<<<<<<<20<< MF:i:18 Aq:i:35 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_71:4:13:981:659 181 chr1 187 0 * = 188 0 CGGGACAATGGACGAGGTAAACCGCACATTGACAA +)---3&&3&--+0)&+3:7777).333:<06<<< MF:i:192
+EAS54_71:4:13:981:659 121 chr1 188 37 34M = 187 0 TGTAGCCCCTCTAAGGCGTTCTATTTGTAATGAA ()&)06636;;<664*6;<<<<<<<<<<<<<<<1 MF:i:64 Aq:i:0 NM:i:2 UQ:i:14 H0:i:0 H1:i:1
+B7_610:1:37:652:403 163 chr1 193 99 35M = 347 189 CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT <<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:282:274:50 163 chr1 193 99 35M = 371 213 CCCCTCTAAGCCGTTCTATTTGTAATGAAAACTAT <<<<<<<<<<<<<<<<<;<<<<<99<9<5909;5; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:133:460:542 99 chr1 195 99 36M = 356 197 CCTATAAGCCGTTCTATTTGTAATGAAAACTATATT <<<<<<<<<<<;<<<<<<<<<<<<;<<<<<<<<<<; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_73:5:44:498:945 99 chr1 195 82 35M = 377 217 CCTATAAGCCGTTCTATTTGTAATGAAAACTATAT ;<;<<<<<<<<<<9<;<:<<<<<<:<<<<;:;<3< MF:i:18 Aq:i:37 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_610:1:139:152:856 99 chr1 198 99 35M = 392 229 CTAAGCCGTTCTATTTGTAATGAAAACTATATTTA <<<<<<<<;<<<<<<<<<<;<;<<<;<<<<;<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:323:639:311 163 chr1 200 99 36M = 357 193 AAGCCGTTCTATTTGTAATGAAAACTATATTTAGGC <<<<<<<<<<<<<<<<<<<2<<<<<<;<<<<<<81< MF:i:18 Aq:i:70 NM:i:1 UQ:i:23 H0:i:1 H1:i:0
+EAS114_39:2:18:967:582 163 chr1 200 99 35M = 398 233 AAGCCGTTCTATTTGTAATGAAAACTATATTTATG <<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<<<8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:186:850:838 99 chr1 205 99 35M = 389 219 GTTCTATTTGTAATGAAAACTATATTTATGCTATT <<<<<;<<<<<<<<<<<:<<<<<;<<<;</<<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:126:558:408 163 chr1 206 99 35M = 368 197 TTCTATTTGTAATGAAAACTATATTTATGCTATTC <<<<<<<<<<<<<:<<<<<<<<<<<<<<7<;<<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:157:643:175 163 chr1 206 99 35M = 380 209 TTCTATTTGTAATGAAAACTATATTTATGCTATTC <<<<<<<<;<<<<<<<<<<<<<<<<<<<)<<<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:141:711:813 99 chr1 209 99 35M = 370 196 TATTTGTAATGAAAACTATATTTATGCTATTCAGT <<<<<<<<<<;<<<<<<<<<<<<<<;<<<<<<:+< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:115:538:276 163 chr1 209 99 35M = 360 186 TATTTGTAATGAAAACTATATTTATGCTATTCAGT <<<<<<<<;<<<;;<<<;<:<<<:<<<<<<;;;7; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:51:1429:1043 83 chr1 209 99 35M = 59 -185 TATTTGTAATGAAAACTATATTTATGCTATTCAGT 9<5<<<<<<<<<<<<<9<<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:176:168:513 163 chr1 210 99 35M = 410 235 ATTTGTAATGAAAACTATATTTATGCTATTCAGTT <<<<;<<<<<<<<<<<<<<<<<<<:&<<<<:;0;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:282:817:710 99 chr1 211 99 35M = 384 208 TTTGTAATGAAAACTATATTTATGCTATTCAGTTC <<<<<<<<<<<<<<<<<<<<<<<;:<<<<:8,<<8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:65:787:74 83 chr1 213 88 35M = 61 -187 TGTAATGAAAACTATATTTATGCTATTCAGTTCTA 44848=:1661/66==?:<=:?6><<<<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</);;;2-79;)/769 MF:i:18 Aq:i:10 NM:i:3 UQ:i:41 H0:i:0 H1:i:0
+B7_591:7:200:192:373 163 chr1 275 75 14M5I17M = 451 212 AGTGCCTTTGTTCACATAGACCCCCTTGCAACAACC <<<<<<<<<<<<<<<<<<<<<<<<<:<:<;5<<;<< MF:i:130 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_65:1:163:846:223 163 chr1 278 74 11M5I19M = 463 220 GCCTTTGTTCACATAGACCCCCTTGCAACAACCTT <<<<;<<;4<<<;;9<<<<<+<<;<</27;;47;. MF:i:130 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:7:283:799:560 83 chr1 283 66 35M = 121 -197 ACATAGACCCCCTTGCAACAACCTTGAGAACCCCA <4<6<8;;6<<<+;<:<<;<<<<<<<<<<<<<<<< MF:i:130 Aq:i:66 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+B7_595:4:84:802:737 147 chr1 284 68 35M = 140 -179 CATAGACCCCCTTGCAACAACCTTGAGAACCCCAG +<1<-;69;;;;8;:<<6<;<<<<<<<<<<<<<<< MF:i:130 Aq:i:68 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS51_66:5:308:400:602 163 chr1 285 71 35M = 470 220 ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG ;<<<<<<<<<<<<<<<<<<<<<<<<;;;<<;<;76 MF:i:130 Aq:i:71 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS54_81:2:285:367:932 163 chr1 285 74 35M = 440 190 ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG ===========;======;=====;=======5== MF:i:130 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_39:1:70:147:84 83 chr1 285 73 35M = 128 -192 ATAGACCCCCTTGCAACAACCTTGAGAACCCCAGG <<<:<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<; MF:i:130 Aq:i:73 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS51_62:3:314:386:190 99 chr1 287 98 35M = 459 207 AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA ++<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<<< MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS56_65:1:53:272:944 99 chr1 287 99 35M = 447 195 CAACCCCCTTGCAACAACCTTGCGAACCCCAGGGA <<<<<<<<<<<<.7<.<<<<<<-<-<<<<<&<222 MF:i:18 Aq:i:41 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS188_7:5:112:51:128 163 chr1 287 99 35M = 477 225 AGACCCCCTTGCAACAACCTTGAGAACCCCAGGGA ++<<<<<<<<<<<<<5<<<<<<<<<<<<<<;<;<6 MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS56_57:6:44:280:641 163 chr1 288 99 35M = 454 201 AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA ;<<<<<<<<<<66<;<<<<<;<<2;;;<<;;;;,; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:75:946:1035 99 chr1 288 99 35M = 480 227 AACCCCCTTGCAACAACCTTGAGAACCCCAGGGAA <<<<<<<<<<;<<<;<<<<<<<8;<6<<<<44<:4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:187:227:818 83 chr1 290 99 35M = 129 -196 CCCCCTTGCAACAACCTTGAGAACCCCAGGGAATT <<9<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:40:1128:1940 83 chr1 291 99 35M = 112 -214 CCCCTTACAACAACCTTGAGAACCCCAGGGAATTT <<<:///77:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS54_71:4:72:63:435 99 chr1 293 99 34M = 490 232 CCTTGCAACAACCTTGAGAACCCCAGGGAATTTG <<<<<<<<<<<<<<<<<<<<;<<<;<;;39:7:7 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:271:244:568 99 chr1 294 99 35M = 481 222 CTTGCAACAACCTTGAGAACCCCAGGGAATTTGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:82:902:868 99 chr1 295 99 35M = 471 211 TTGCAACAACCTTGAGAACCCCAGGGAATTTGTCA <<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:313:83:546 163 chr1 296 99 35M = 454 193 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA <<<<<<<<<<;<<<<<<<<<<<<<<4<<<:<;<<9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:57:786:414 163 chr1 296 99 35M = 453 192 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA <<<<<<<<<<<<<<<<<<<<<<<:<<:<<:;;7<7 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:260:985:520 163 chr1 296 99 35M = 468 207 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA <<<<<<<<<<<<<<<<<;:;<<;<:<<<,:1;)<; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:170:169:57 83 chr1 296 99 35M = 138 -193 TGCAACAACCTTGAGAACCCCAGGGAATTTGTCAA 778<:<<<9<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:199:327:965 163 chr1 297 91 35M = 494 232 NCAACAACCTTGAGAACCCCAGGGAATTTGTCAAT !,+*+++++++++++*+++++++**)+*+**+(** MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+B7_610:5:147:68:353 163 chr1 299 99 35M = 486 222 AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT <;<;<<7<<<<<<<7<<;;<7<4<8<<<8.;4;;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:225:195:543 147 chr1 299 99 35M = 123 -211 AACAACCTTGAGAACCCCAGGGAATTTGTCAATGT ;;8;;+;(<<<<<<<<7;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:303:184:14 163 chr1 301 99 35M = 479 213 CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA <<<<<<8<0<<<<-<-98<<--<<<6;076;75+& MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:326:309:149 163 chr1 301 99 35M = 467 201 CAACCTTGAGAACCCCAGGGAATTTGTCAATGTCA <<<<<<<<<<<<<<<<<<<<:<<<<<<<<<;;;;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:327:795:103 147 chr1 302 99 35M = 133 -204 AACCTTGAGAACCCCAGGGAATTTGTCAATGTCAG ;::;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:110:355:323 99 chr1 303 99 35M = 477 209 ACCTTGAGAACCCCAGGGAATTTGTCAATGTCAGG <<<<<<<<<<<<<<<<<<<<<<<<;<<<<;;<<8; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:18:1418:237 99 chr1 304 99 35M = 503 234 CCTTGAGAACCCCAGGGAATTTGTCAATGTCAGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<7< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:112:203:90 163 chr1 305 99 35M = 470 200 CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA <<:<<<<<<<<.<<<<<<<<<<<<6<:867<8884 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:319:246:304 99 chr1 305 99 35M = 472 202 CTTGAGAACCCCAGGGAATTTGTCAATGTCAGGGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:114:714:317 147 chr1 311 99 35M = 126 -220 AACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGC ;8<;:<<;<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:5:327:991:508 99 chr1 312 99 35M = 495 218 ACCCCAGGGAATTTGTCAATGTCAGGGAAGGAGCA <<<<<<<<<<<<<<<<<<<<<;<;:<7:47;:75; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:77:29:126 147 chr1 315 99 35M = 131 -219 ACAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT ()9;;<<<<<<<<<<5<<<7<<<<<<;<<<;7<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS219_1:1:37:1004:1136 99 chr1 315 99 35M = 473 193 CCAGGGAATTTGTCAATGTCAGGGAAGGAGCATTT <<<<<<<<<<<<<<;<<<;<<<<<:<<;;369<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:78:583:670 83 chr1 316 99 35M = 142 -209 CAGGGAATTTGTCAATGTCAGGGAAGGAGCATTTT 8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:90:435:691 147 chr1 318 99 35M = 147 -206 GGGAATTTGTCAATGTCAGGGAAGGAGCATTTTGT ;;<;;;+<<:<<<:<;;<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:69:735:1915 147 chr1 321 99 35M = 154 -202 AATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAG <<::<<<7<<<<7<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:324:728:956 147 chr1 322 99 35M = 165 -192 ATTTGTCAATGTCAGGGAAGGAGCATTTTGTCAGT <;;;;5;<<0<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:269:280:716 99 chr1 323 99 35M = 490 202 TTTGTCAATGTCAGGGAAGGAGCATTTTTTCAGTT <<<<<<<<<2<<:2:1<<7/2/:3<<<<*<3($<< MF:i:18 Aq:i:58 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS54_73:3:88:24:744 163 chr1 325 84 35M = 484 194 TGTCAATGTCAGGGAAGGAGCATTTTTGAAGTTTA <7*:<<::.'<<<<:<<:<<'<63'6+'303*%%+ MF:i:18 Aq:i:21 NM:i:5 UQ:i:53 H0:i:0 H1:i:0
+EAS1_108:7:82:926:112 147 chr1 328 99 35M = 164 -199 CAATGTCAGGGAAGGAGCATTTTGTCAGTTGCCAA <1:/<*6<<6<<<<<6<<<<<<4<<<<82<+<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS56_63:7:185:213:330 163 chr1 328 99 35M = 502 209 CAATGTCAGGGAAGGAGCATTTTGTCAGTTACCAA <<<<<<<<<;<<;<<<<<;<<<<;;;<<;<<;<38 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:277:458:330 163 chr1 329 99 36M = 490 197 AATGTCAGGGAAGGAGCCTTTTGTCAGTTACCAAAT <<7<<<<<<<<<2<<<%,<6<&<<,<<<<:<<<<(7 MF:i:18 Aq:i:41 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+B7_595:1:81:1000:375 163 chr1 329 90 35M = 524 230 NATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAA !.............................+.(+. MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS220_1:8:33:672:473 99 chr1 330 99 35M = 515 220 ATGTCAGGGAAGGAGCATTTTGTCAGTTACCAAAT <<<<<<<<7<7<7<<62<<<<66<15*/99*5241 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:164:797:930 147 chr1 332 99 35M = 173 -194 GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGT ;;:;8<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:155:68:326 147 chr1 332 99 36M = 182 -186 GTCAGGGAAGGAGCATTTTGTCAGTTACCAAATGTG ;<<<:6<<<<<<6<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:202:39:380 99 chr1 334 99 35M = 513 214 CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT <<<<<<<<<<<<<<<<<;<<:;<<18<84:<&<+< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:42:1091:1726 99 chr1 334 99 35M = 502 203 CAGGGAAGGAGCATTTTGTCAGTTACCAAATGTGT <<<<<<<<<<<<<<<<<<<<<<8<<<<<<8:<.<: MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:66:959:1311 83 chr1 336 95 35M = 159 -212 GGGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT 67.68:4::6;;;7:6:;:5;8;;<<:;;<;;;;< MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:200:559:765 99 chr1 337 99 36M = 521 220 GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTAT <<<<<<<<<<<<<<7<<<<<<;<<;;4<7<9;<<-; MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:328:669:662 99 chr1 337 99 34M = 512 210 GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTT <<<<<<<<<<<<<<<<<<<<<<<<+9;<;;.<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:159:125:297 83 chr1 337 99 35M = 170 -202 GGAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA 89<;;8<<;<;<4<;<8<<<<;;8<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:19:886:279 147 chr1 337 99 35M = 182 -190 GAAAGGAGCATTTTGTCAGTTACCAAATGTGTTTA 9%<2)2.2::<;<<<2<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:67 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+B7_595:1:209:653:400 83 chr1 340 99 35M = 175 -200 AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA <69<98<+<<6<<4<<<<</4<<:<4<<<<<<<<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:294:525:849 83 chr1 340 99 35M = 167 -208 AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA ;<;:;:<;<;<<<3<<<;<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:87:1375:1303 163 chr1 340 99 35M = 529 224 AGGAGCATTTTGTCAGTTACCAAATGTGTTTATTA <<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:325:759:288 147 chr1 341 99 35M = 163 -213 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC 9;<9<;<;;<;<;<;<<<:<;<<<;<<<<<;<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:76:786:458 163 chr1 341 99 35M = 502 196 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC <<.<<<<2<<:84<:<<<:<8<<)<)429<2<<8< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:210:880:606 163 chr1 341 99 35M = 518 212 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAT <<<<<<<<<<<<<<<<<<;<<<<<<:<<<<3<<8& MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS192_3:3:257:611:440 99 chr1 341 99 35M = 524 218 GGAGCATTTTGTCAGTTACCAAATGTGTTTATTAC <<<<<<<<<<<<<<<<<<<<8<<<<;<<<<8<<+5 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:303:402:142 83 chr1 343 99 35M = 181 -197 AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA ;;;;;<9<<8;<<<<7<<;<<<<;<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:13:122:187 83 chr1 343 99 35M = 153 -225 AGCATTTTGTCAGTTACCAAATGTGTTTATTACCA <<&<;;<<<;7<<<<;<;<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:80:885:513 163 chr1 344 99 35M = 507 198 GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG <<<<<<<<<<<<<<<<<<<:<<<<2:<;<<75<7; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:90:1873:89 99 chr1 344 99 35M = 531 222 GCATTTTGTCAGTTACCAAATGTGTTTATTACCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<7<<<7 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:1:37:652:403 83 chr1 347 99 35M = 193 -189 TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG <;<<<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:28:701:724 163 chr1 347 99 35M = 521 209 TTTTGTCAGTTACCAAATGTGTTTATTACCAGAGG <<<<<<7<<<<<<7::<:<<-<<::::::<747:: MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:66:655:769 99 chr1 348 99 35M = 515 202 TTTGTCAGTTACCAAATGTGTTTATTACCAGAGGG 8;<<<<<8<<<<<;<<<7<;<<<<<;<7<27<;;7 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:231:339:551 163 chr1 350 99 35M = 527 212 TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT <<<<<<;<<<<<<;<<<<<<<<<<;5<<46;<;:1 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:129:694:359 163 chr1 350 88 35M = 525 210 TGTCAGTTACCAAATGTGTTTATTACCCGAGGGAT ============+7=======:==;;;'=;==7;= MF:i:18 Aq:i:43 NM:i:1 UQ:i:6 H0:i:0 H1:i:1
+EAS220_1:2:62:1109:804 83 chr1 350 99 35M = 176 -209 TGTCAGTTACCAAATGTGTTTATTACCAGAGGGAT <<<<<:<<<::<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:157:935:374 99 chr1 353 99 35M = 512 194 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA <<<<<<<<<<;<<;;<<<<<<<<<::8'5++;+11 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:103:111:720 99 chr1 353 99 36M = 512 195 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGAG <<<<<<<<<<<<<<<<<<<<<<<<<5<<<5;<5<:; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:311:100:539 163 chr1 353 99 35M = 508 190 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA <<<<;<<<<;<<<<<;<<<<<<<<<:<::;7;<0; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:195:348:703 83 chr1 353 99 35M = 215 -173 CAGTTACCAAATGTGTTTATTACCAGAGGGATGGA <9<<9</<<<<<<<<<<<<<<2<8<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:72:308:839 163 chr1 354 99 40M = 517 203 AGTTACCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG <<<<<<<<<<<<<<<<<<<<<<<<9<<<<;<99494416: MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:133:460:542 147 chr1 356 99 36M = 195 -197 TTACCAAATGTGTTTATTACCAGAGGGATGGAGGGA ;:;7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:293:355:321 83 chr1 356 99 35M = 174 -217 TTACCAAATGTGTTTATTACCAGAGGGATGGAGGG <<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:323:639:311 83 chr1 357 99 36M = 200 -193 TACCAAATGTGTTTATTACCAGAGGGATGGAGGGAA -94<<<<<<<4<<<<<<<<2<<<<<7<<<-<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:321:642:388 83 chr1 357 99 33M = 181 -209 TACCAAATGTGTTTATTACCAGAGGGATGGAGG 19<<<<<8<<<<<<<<;<<<<<<<<<<7<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:4:262:456:74 99 chr1 357 99 35M = 504 182 TACCAAATGTGTTTATTACCAGAGGGATGGAGGGA <<<<<<<<<<<<<<<<<<<<:;;:;7:<::7<7:3 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:95:426:791 99 chr1 359 99 35M = 547 223 CCAAATGTGTTTATTACCAGAGGGATGGAGGGAAG <<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<,<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:115:538:276 83 chr1 360 99 35M = 209 -186 CAAATGTGTTTATTACCAGAGGGATGGAGGGAAGA :<<<<<<<<;;<5<<;<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:196:533:921 99 chr1 361 99 35M = 526 200 AAATGTGTTTATTACCAGAGGGATGGAGGGAAGAG =====1========8===:===7======971=3= MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:121:380:656 99 chr1 362 99 35M = 542 215 AATGTGTTTATTACCAGAGGGATGGAGGGAAGAGG <<<<<<<<<<<<<<<<<<<<<<<<:<:<<83<:<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:34:970:1374 99 chr1 363 99 35M = 520 192 ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG <<<<<<<<<<<<<<;7<77;<<;<;;9;;:86::: MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:29:1061:574 163 chr1 363 99 35M = 563 235 ATGTGTTTATTACCAGAGGGATGGAGGGAAGAGGG <<<<<<<<<<<<<<<<<<;<<<<<<;<<8<:<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:124:243:35 99 chr1 364 60 35M = 544 215 TGTGTTTATTACCAGAGGGATGGAGGGAAGAGCGA <<<<<;;<<<<<<:<<<.<<<:++5+:1(;1;$<( MF:i:18 Aq:i:60 NM:i:1 UQ:i:3 H0:i:1 H1:i:0
+EAS114_30:2:272:750:698 163 chr1 365 80 35M = 538 208 GTGTTTATTACCAGAGGGATGGAGGGATGACGGAC <)<<<<<7;<<<4<;7<<<<78068:(%<3*861, MF:i:18 Aq:i:37 NM:i:2 UQ:i:13 H0:i:0 H1:i:1
+EAS56_53:3:126:558:408 83 chr1 368 99 35M = 206 -197 TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT <:<<:;;<<<<<<<<8<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:1:1140:1206 83 chr1 368 99 35M = 181 -222 TTTATTACCAGAGGGATGGAGGGAAGAGGGACGCT 77977::99;;;:;;<;;;:;;;<<;<;;;;<;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:141:711:813 147 chr1 370 99 35M = 209 -196 TATTACCAGAGGGATGGAGGGAAGAGGGACGCTGA =<5<5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:282:274:50 83 chr1 371 99 35M = 193 -213 ATTACCAGAGGGATGGAGGGAAGAGGGACGCTGAA </7;/:<<<<<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:46:485:482 99 chr1 371 94 35M = 530 194 ATTACCAGAGGGATGAAGGGAAGAGGGACGCTGAA <<<<<<<<<<<<<<<<<<<<<<<6<<<<<:<:89< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_63:1:119:446:185 163 chr1 372 99 35M = 562 225 TTACCAGAGGGATGGAGGGAAGAGGGACGCTGAAG <<<<<<<7<<<4<<<<9<<54<:<7<5:<::7-5; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:168:69:605 163 chr1 373 67 36M = 565 228 TACCCGAGGGATGGAGGGTAGAGGGACGCTGAAGTG <<<4(<<<<<<<<<<<<<(1<6<-<2<<7<<6<<++ MF:i:18 Aq:i:26 NM:i:4 UQ:i:59 H0:i:0 H1:i:0
+EAS114_32:6:78:909:394 163 chr1 373 81 35M = 554 216 TACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGA <<<<<<8<<<&<<<-<<<14,4;<<-0<2+<)/82 MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:5:41:118:1246 99 chr1 374 99 35M = 548 209 ACCAGAGGGATGGAGGGAAGAGGGACGCTGAAGAA <<<<<<<<<<<<<<<<<<<<<<<</<<<<<<1<<( MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:44:498:945 147 chr1 377 82 35M = 195 -217 ATAGGGATGGAGGGAAGAGGGCCGCTGAAGAACTT <%*50<7<4<<<7<,<<.<8/,9<:</<<<;<;<< MF:i:18 Aq:i:37 NM:i:2 UQ:i:15 H0:i:0 H1:i:1
+EAS114_39:5:50:972:1286 163 chr1 377 99 35M = 559 217 AGAGGGATGGAGGGAAGAGGGACGCTGAAGAACTT <<<<<<<<<<<<<<<<<;<<<<<<<<<6<<7:7:; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:82:164:1924 163 chr1 378 99 35M = 542 199 GAGGGATGGAGGGAAGAGGGACGCTGAAGAACTTT <<<<<<<<<<<<<<<<<<<<8<<<<<<3<<'<7<8 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:14:426:613 147 chr1 379 99 35M = 214 -200 AGGGAGGGAGGGAAGAGGGACGCTGAAGAACTTTG :<<<<&<<<<<<<<<<<<<<6<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_61:4:83:452:970 147 chr1 379 99 35M = 216 -198 AGGGATGGAGGGAAGAGGGACGCTGAAGAACTTTG <<<39<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:157:643:175 83 chr1 380 99 35M = 206 -209 GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA ;<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:61:1797:113 99 chr1 380 99 35M = 551 206 GGGATGGAGGGAAGAGGGACGCTGAAGAACTTTGA <<<<<<;<<<<;:<3<<<<;;<<<8<<;:<<;3<. MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:90:828:633 163 chr1 381 99 36M = 537 192 GGATGGAGGGAAGAGGGACGCTGAAGAACTTTGATG <<<<<<<<<<<8<;96<;<<<<<99<2<<;<96<8; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:61:433:385 163 chr1 381 99 35M = 579 233 GGATGGAGGGAAGAGGGACGCTGAAGCACTTTGAT <<<<<<<<<<<<<<<<<;<<;<<6<<)91<<;;,; MF:i:18 Aq:i:43 NM:i:1 UQ:i:8 H0:i:0 H1:i:1
+EAS1_93:2:173:995:93 83 chr1 382 99 35M = 215 -202 GCTGGAGGGAAGAGGGACGCTGAAGAACTTTGATG <(0<<9<<<7<<<<<<7<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:73 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS54_71:3:254:32:275 99 chr1 382 99 34M = 575 228 GATGGAGGGAAGAGGGACGCTGAAGAACTTTGAT <<<<<<<<<<<<<<<<<<<<<<;;<:<::<:2*< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:282:817:710 147 chr1 384 99 35M = 211 -208 TGGAGGGAAGAGGGACGCTGAAGAACTTTGATGCC 366=6;======8====:========;======== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:75:217:337 163 chr1 386 99 35M = 568 217 GAGGGAAGAGGGACGCTGAAGAACTTTGATGCCCT ;;;;;;;;;;;;;;;;;;8;;;;;;;;;;;88787 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:181:191:418 83 chr1 387 99 36M = 221 -202 AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:160:896:275 83 chr1 387 99 35M = 220 -202 AGGGAAGAGGGACGCTGAAGAACTTTGATGCCCTC ;;;9;<<<<<<;<;;<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:88:1656:896 99 chr1 387 99 40M = 538 191 AGGGAAGAGGGATGCTGAAGAACTTTGATGCCCTCTTCTT <<<9<<<<<<<9<<<;<<<<<<<<<;6<<;7<<<<::9:; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_597:8:186:850:838 147 chr1 389 99 35M = 205 -219 GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT <;<;<;<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:64:1318:1711 147 chr1 389 99 35M = 218 -206 GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:78:1478:1446 99 chr1 389 99 35M = 560 206 GGAAGAGGGACGCTGAAGAACTTTGATGCCCTCTT <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<:<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:82:879:246 163 chr1 391 99 35M = 576 220 AAGAGGGACGCTGAAGAATTTTGATGCCCTCTTCT <<<<<<<<<<<<<<<<<<&<<<77<<-<<<6<62< MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_610:1:139:152:856 147 chr1 392 99 35M = 198 -229 AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT <<<<<;<<<<<<<<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:162:503:769 99 chr1 392 99 35M = 571 214 AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT ========================:========== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:216:988:883 163 chr1 392 99 35M = 584 227 AGAGGGACGCTGAAGAACTTTGATGCCCTCTTCTT <<<<<<<<<<<<8;<;88<;8;;;;828;8;8;;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:118:523:591 163 chr1 393 99 35M = 563 205 GAGGGACGCTGAAGAACTTTGATGCCCTCTTCTTC <<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<;;<; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:3:168:741:680 163 chr1 394 99 35M = 562 203 AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC <<<<<<<<<<<<<<<<<<<<<<<<<1<<<<<<<<< MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:9:1289:215 147 chr1 394 99 35M = 231 -198 AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC 7747*7;;;;+;;:2;7;:1;;9:;:;:;;:;::; MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:84:275:1572 83 chr1 394 99 35M = 230 -199 AGGGACGCTGAAGAACTTTGATGCCCTCTTCTTCC 777777::7:;74;:;:7;:::;;;;:;;8;;;<; MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:77:789 83 chr1 396 99 35M = 223 -208 GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA 9<;<:<<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:62:879:264 83 chr1 396 99 35M = 216 -215 GGACGCTGAAGAACTTTGATGCCCTCTTCTTCCAA ====:=<============================ MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:89:525:113 83 chr1 397 78 40M = 227 -210 GACGCTGAAGAACTTTGATTCCCTCTTCTTCCAAAGATGA );:+4-&<<+<<:<+<)<<<7<8<8:<:<<:<82::<<2< MF:i:18 Aq:i:39 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_39:2:18:967:582 83 chr1 398 99 35M = 200 -233 ACGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAG <:<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:140:522:212 163 chr1 399 99 35M = 568 204 CGCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA <<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<;95; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:125:628:79 83 chr1 400 99 34M = 229 -205 GCTGAAGAACTTTGATGCCCTCTTCTTCCAAAGA 95&<<<<<<<63<<<6<<<<8<;<<8<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:185:312:167 163 chr1 401 99 35M = 562 196 CTGAAGAACTTTGATGCCCTCTTCTTCCAAAGATG ===========================;855;=== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:248:753:731 147 chr1 402 99 35M = 231 -206 TGAAGAACTTTGATGCCCTCTTCTTCCAAAGATGA 7;55;=,=89=====3===9=======9======= MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:299:360:220 147 chr1 403 99 35M = 237 -201 GAAGAACTTAGATGCCCTCTTCTTCCAAAGATGAA 66<;;4;<<()<<4<<<<<<;<<;<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:7 H0:i:0 H1:i:1
+EAS114_45:6:5:730:1436 83 chr1 403 99 35M = 236 -202 GAAGAACTTTGATGCCCTCTTCTTCCAAAGATGAA 7977979;;;;;;;;;7;3<;2<;26;<;<<;;<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:134:868:252 99 chr1 404 99 36M = 595 227 AAGAACTTTGATGCCCTCTTCTTCCAAAGATGAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<;:<<<:<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:165:431:857 99 chr1 406 99 35M = 559 188 GAACTTTGATGCCCTCTTCTTCCAAAGATGAAACG <<<<<<<<<<<<<<<<<<<<<<<6&:<7<:76,;; MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:86:823:683 83 chr1 408 99 35M = 240 -203 ACTTTGATGCCCTCTTCTTCCAAAGATGAAACGCG <4<<<<<<<<:<<6<<7<<<8<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:176:168:513 83 chr1 410 99 35M = 210 -235 TTTGATGCCCTCTTCTTCCAAAGATGAAACGCGTA ;0;;;7:<<<<<<<;<<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:259:219:114 147 chr1 411 99 35M = 254 -192 TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA 666<:6/:6::6::<:::<<<;<<<<<<<<;<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:84:1013:1074 121 chr1 411 71 35M = 411 0 TTGATGCCCTCTTCTTCCAAAGATGAAACGCGTAA 8;;<;8744<7<<4<<47<<<<<<7<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:84:1013:1074 181 chr1 411 0 * = 411 0 GCAAGGGGGTCTATGTGAACAAAGGCACTAAACAC <7<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:192
+EAS54_81:7:325:150:465 99 chr1 412 99 35M = 598 221 TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<3;;: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:179:13:782 163 chr1 412 99 35M = 568 191 TGATGCCCTCTTCTTCCAAAGATGAAACGCGTAAC <<<<<<<<<<<<<<<<<:<<:7<<<<::<7<:-:1 MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:113:809:364 147 chr1 413 99 35M = 250 -198 GATGCCCTCTTCTTCCAAAGATGAAACGCGTAACT ;<;;;<<<:<6<<<::<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:188:802:71 83 chr1 415 99 35M = 232 -218 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC ;;;;<:::<<<<<7<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:204:264:413 99 chr1 415 96 34M = 593 213 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTG <<<<<<<<<<<<<;:59<+<<:<<<9<<;:62<) MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:104:350:749 83 chr1 415 99 36M = 247 -204 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGCG ;<93;9;<3;<<<;<<<<<;<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:24:1037:84 83 chr1 415 99 35M = 238 -212 TGCCCTCTTCTTCCAAAGATGAAACGCGTAACTGC <;<<;<<<7<<7&<<<<<<;<<<;<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:242:354:637 147 chr1 417 99 36M = 222 -231 CCCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT 8<;;;;;<<<8;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:37:761:635 99 chr1 418 99 35M = 581 198 CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT <6<<<<<<6<<<<<<<<<<<<<<<<<8<8<<4<4< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:44:1578:1674 99 chr1 418 99 35M = 573 190 CCTCTTCTTCCAAAGATGAAACGCGTAACTGCGCT ;<<;<<;<<;;;;;9<;9;;<9:;;<:;9;76669 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:120:63:653 99 chr1 420 99 35M = 598 213 TCTTCTTCCAAAGATGAAACGCGTAACTGCGCTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<9<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:264:642:506 147 chr1 420 99 35M = 247 -208 ACTTCATCCAAAGATGAAACGCGTAACTGCGCTCT &;(-/)-1&:<<9<25<<<<2<1<';8<<<:888< MF:i:18 Aq:i:56 NM:i:2 UQ:i:13 H0:i:1 H1:i:0
+EAS188_7:3:101:572:491 99 chr1 425 99 35M = 600 210 TTCCAAAGATGAAACGCGTAACTGCGCTCTCATTC <<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<1<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:27:1881:486 163 chr1 427 99 35M = 607 215 CCAAAGATGAAACGCGTAACTGCGCTCTCATTCAC ;;;;;;;;;;;;;;1;;;;;;;;78;8;8;8878/ MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:120:14:944 163 chr1 428 99 35M = 621 228 CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT <<<<<<<<<<<<<<<;<<<<<;<<<<<<<:;8;;7 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:46:695:738 83 chr1 428 74 35M = 259 -204 CAAAGATGAAACGCGTAACTGCGCTCTCATTCACT <<<<2<5<<-<<<<<<<4<<<<<<<<<<<<<<3<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:13:1034:1144 147 chr1 429 99 35M = 256 -208 AAAGATGAAACGCGTAACTGCGCTCTCATTCACTC <<:%<9)<<<<<<8<<<<9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:91:360:585 99 chr1 430 99 35M = 586 191 AAGATGAAACGCGTAACTGCGCTCTCATTCACTCC <<<<9<<<<<;<<<;<<77<<<;<;;<;;<;<;;< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:73:1208:495 83 chr1 431 99 35M = 246 -220 AGATGAAACGCGTAACTGCGCTCTCATTCACTCCA 8-889<<;<;;:<;<;;;;;;<<;;<;;;;<<;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:16:1081:1894 163 chr1 431 99 35M = 624 228 AGATGAAACGCGTAACTGGGCTCTCATTCACTCCA <<<<<<<<<<<<<<<<<<8<<<<;<<;<<<<<<<+ MF:i:18 Aq:i:45 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS188_4:7:35:408:348 117 chr1 433 0 * = 433 0 GGTTCTCAAGGTTGTTGCAATGGGGTCTATGTGAA .73<;<<:77<<<<<<<<<<-<<;<<<<<<<<<<< MF:i:192
+EAS188_4:7:35:408:348 185 chr1 433 35 35M = 433 0 AAGAAACGCGTAACTGCGCTCTCATACACTCCAGC 4,'3<6;)2);<3<-6<;<;7+7<5+<<<7<<<<< MF:i:64 Aq:i:0 NM:i:2 UQ:i:21 H0:i:0 H1:i:1
+EAS56_53:4:130:568:978 147 chr1 434 88 35M = 246 -223 TGAAACGCGAAACTGCACTCTCATTCACTCCAGCT --;066;;62<<<2&<+<+<2;<<2<<<;<<<7<< MF:i:18 Aq:i:24 NM:i:2 UQ:i:27 H0:i:0 H1:i:0
+EAS139_19:1:87:1222:878 83 chr1 435 34 40M = 272 -203 TCAGCGCGTCACTCCGCTCTCATTCACCCCAGCTCCCTGT !!;*:885<&<<<)8&<:<<<8<8<::*<4<88<<<8<<< MF:i:18 Aq:i:10 NM:i:6 UQ:i:42 H0:i:0 H1:i:0
+EAS51_64:6:143:763:480 117 chr1 436 0 * = 436 0 CTGAAGGTTGTTGCAAGGGGGTCTATGTGAACAAA ;<&-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:192
+EAS51_64:6:143:763:480 185 chr1 436 70 35M = 436 0 AAACGCGTAACTGCGCTCTCATTCACTCCAGCTCC ::3<:6<<<:<<<<7<<<<<<<<)6<<<1<<<<;< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:145:607:216 163 chr1 437 99 35M = 596 194 AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC <<<<<<<<8<<<<<<<<<<4<<<7<:<<1<<;;99 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:46:285:790 121 chr1 437 72 35M = 437 0 AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC ;;<8<;<<<<88<8<<;;<;<<;<<<<<<<<;<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:46:285:790 181 chr1 437 0 * = 437 0 TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG !!<<3<<<;;<<<<<<<<<;<;7<<7<<<<<<;<< MF:i:192
+EAS56_59:4:329:577:757 117 chr1 437 0 * = 437 0 TCAAGGTTGTTGCAAGGGGGTCTATGTGAACAAAG !!<<<<9;<:<<;<<<<<<<<;<<<<<<<<<<<<< MF:i:192
+EAS56_59:4:329:577:757 185 chr1 437 72 35M = 437 0 AACGCGTAACTGCGCTCTCATTCACTCCAGCTCCC ;;;888;<<<<<<6<<<2;<<<<<<;<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:57:722:347 163 chr1 439 99 35M = 599 195 CGCGTAACTGCGCTCTCATTCACTCCAGCTCCCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:285:367:932 83 chr1 440 74 35M = 285 -190 GCGTAACTGCGCTCTCATTCACTCCAGCTCCCTGT 9=5==;=;7===;==;=================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:38:842:395 73 chr1 442 77 35M * 0 0 GTAACTGCGCTCTCATTCACTCCAGCTCCCTGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<93<;9 MF:i:32 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:8:14:601:624 163 chr1 446 99 35M = 622 211 CTGCGCTCTCATTCACTCCAGCTCCCTGTCAACCC <<1<<<<<<<<<<<<<<<<<3<<::<<7<<1,<:( MF:i:18 Aq:i:69 NM:i:2 UQ:i:18 H0:i:1 H1:i:0
+EAS114_45:3:3:1377:1663 99 chr1 446 99 35M = 626 215 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA <<;;;;<:;;:<;;<;;<;:;;<;9;;::977676 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:26:1221:222 83 chr1 446 99 35M = 261 -220 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA <<<<<<<:<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:82:566:1096 99 chr1 446 99 35M = 621 210 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCA <<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<;<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:24:1135:563 83 chr1 446 99 40M = 266 -220 CTGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA 6+96:87<&8<<79:<;<<<<:<<;<<<<<<;;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:53:272:944 147 chr1 447 99 35M = 287 -195 TGCGCTCTCATTCACTCCAGCTCCCTGTCACCCAA &94<4&8.6<6&;<:0:8;;:6;<;:<*<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:287:492:169 147 chr1 449 99 36M = 269 -216 CGCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG ;/;6<<<<4(<(<<<<6<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:49:163:904 163 chr1 450 99 35M = 616 201 GCTCTCATTCACTCCAGCTCCCTGTCACCCAATGG ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78958 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:200:192:373 83 chr1 451 75 36M = 275 -212 CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC <<<8<<<4<4<<<<<:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:253:285:104 163 chr1 451 99 35M = 627 211 CTCTCATTCACTCCAGCTCCCTGTCACCCAATGGA ======================:========7==; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:151:159:43 99 chr1 452 99 35M = 645 228 TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC <<<<<<<;<<<8<<<;<;8<<<<7<77;;79<09+ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:1:115:868:887 163 chr1 452 99 35M = 650 233 TCTCATTCACTCCAGCTCCCTGTCACCCAATGGAC >>>>>>>>>>>>>>;<>>>>><<>>>;<+<</;;1 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:57:786:414 83 chr1 453 99 35M = 296 -192 CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC ;;;8;1;:<<<<;<::;;<<<<;<;;<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:197:170:559 121 chr1 453 71 35M = 453 0 CTCATTCACTCCAGCTCCCTGTCACCCAATGGACC <:<;;:<5<5<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:197:170:559 181 chr1 453 0 * = 453 0 TTCTCAAGGTTGTTGCAAGGGGGTCTATGTGAACA :;;;;<<<<<<8<<<<<<<<<<<<<<<<<<<<<<< MF:i:192
+EAS1_103:7:313:83:546 83 chr1 454 99 35M = 296 -193 TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT ;)<994<;<<<<<<<;<<<<<<<<<<<<<<5<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:44:280:641 83 chr1 454 99 35M = 288 -201 TCATTCACTCCAGCTCCCTGTCACCCAATGGACCT 9;<<9;9;;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:60:837:923 163 chr1 457 61 36M = 641 220 TTCACGCCAGCTCCCTGTCACCCAATGGACCTCTGA <<<<<4<<+<<*<<<<88<<<<<'*<4-+<<4&<40 MF:i:18 Aq:i:24 NM:i:2 UQ:i:24 H0:i:0 H1:i:1
+EAS114_45:5:85:401:1190 163 chr1 458 99 35M = 652 229 TCACTCCAGCTCCCTGTCACCCAATGGACCTGTGA 4;;;1;;;;;;.6;;;(;;/;/;3;;;7;(3&063 MF:i:18 Aq:i:55 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:314:386:190 147 chr1 459 98 35M = 287 -207 CACTCCAGCTCCCTGTCACCCAATGGACCTGTGAT 76;%;<<3<9;<69<<<7;;;<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:2:831:692 99 chr1 462 99 35M = 634 207 TCCAGCTCCCTGTCACCCAATGGACCTGTGATATC <<<<<<<<;<<<<<<<<<<9<<:9<<<;;96<796 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:163:846:223 83 chr1 463 74 35M = 278 -220 CCAGCTCCCTGTCACCCAATGGACCTGTGATATCT <7<5<*<<<<0<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:48:9:409 147 chr1 464 75 35M = 271 -228 CAGCTCCCTGTCACCCAATGGACCTGTGATATCTG <<<<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:134:751:831 99 chr1 465 99 36M = 651 222 AGCTCCCTGTCACCCAATGGACCTGTGATATCTGGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<948 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:326:309:149 83 chr1 467 99 35M = 301 -201 CTCCCTGTCACCCAATGGACCTGTGATATCTGGAT ;;<<;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:260:985:520 83 chr1 468 99 35M = 296 -207 TCCCTGTCACCCAATGGACCTGTGATATCTGGATT ;9;7<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:112:203:90 83 chr1 470 99 35M = 305 -200 CCTGTCACCCAATGGACCTGTGATATCTGGATTCT ;<;:;<;;;<<<<<<<<<:<<<7<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:308:400:602 83 chr1 470 71 35M = 285 -220 CCTGTCACCCAATGGACCTGTGATATCTGGATTCT ;77;2<<;<7<<;<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:82:902:868 147 chr1 471 99 35M = 295 -211 CTGTCACCCAATGGACCTGTGATATCTGGATTCTG <<;;<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:153:977:200 163 chr1 472 99 35M = 640 203 TGTCACCCAATGGACCTGTGATATCTGGATTCTGG ;<<;<<<<7<<;;;;;<<6<<<<<86;;8<;8;6; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:319:246:304 147 chr1 472 99 35M = 305 -202 TGTCACCCAATGGACCTGTGATATCTGGATTCTGG ;;<;;;<<<<8;<<<<;<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:37:1004:1136 147 chr1 473 99 35M = 315 -193 GTCACCCAATGGACCTGTGATATCTGGATTCTGGG </8<<<<7<+<<<<<<<,<<<<<<<<<6<<<<1<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:59:396:359 99 chr1 474 99 35M = 670 231 TCACCCAATGGACCTGTGATATCTGGATTCTGGGA <<9;;<;<;;;;<;;9;;;;;<;;;;;<;;77677 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:45:1769:1130 163 chr1 476 99 35M = 635 194 ACCCAATGGACCTGTGATATCTGGATTCTGGGAAA ;;;;;;;;;;;;9;;;;;;19;;;9;;;;176777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:110:355:323 147 chr1 477 99 35M = 303 -209 CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT 6069;1<<;4<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:28:708:463 99 chr1 477 99 36M = 672 231 CCCAATGGACCTGTGATATCTGGATTCTGGGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;<:<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:112:51:128 83 chr1 477 99 35M = 287 -225 CCCAATGGACCTGTGATATCTGGATTCTGGGAAAT ;9<;;:<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:303:184:14 83 chr1 479 99 35M = 301 -213 CAATGGACCTGTGATATCTGGATTCTGGGAAATTC :<<.<;;7<:<<<<<<7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:84:101:328 163 chr1 480 99 35M = 673 228 AATGGACCTGTGATATCTGGATTCTGGGAAATTCT <<<;<<<<<<<<;<<<<<<<<<<:<;;<44;;<;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:228:354:203 99 chr1 480 99 34M = 643 198 AATGGACCTGTGATATCTGGATTCTGGGAAATTC 88<<<8<<<<<<<<<8<<<<<<<<<4<<<4/9/; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:38:856:336 99 chr1 480 99 33M = 656 211 AATGGACCTGTGATATCTGGATTCTGGGAAATT <<<<<<<<<<<;;<;<;<:69<<;<5-500373 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:75:946:1035 147 chr1 480 99 35M = 288 -227 AATGGACCTGTGATATCTGGATTCTGGGAAATTCT <<)4</<5<<<<<<<<<<<<<<<<<<<<<66<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:271:244:568 147 chr1 481 99 35M = 294 -222 ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT ;<<<<<<;<;<<<<<<<<<<;;<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:8:129:477:427 99 chr1 481 99 35M = 652 206 ATGGACCTGTGATATCTGGATTCTGGGAAATTCTT <<<<<<<<<<<<<<<<<<;;<<<<::<9<;<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:262:297:601 163 chr1 482 99 35M = 635 188 TGGACCTGTGATATCTGGATTCTGGGAAATTCTTC <<<<;<<9<<57<<7<<<;<<;77-;;53<<;;<7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:88:24:744 83 chr1 484 84 35M = 325 -194 GTCCTGTGATATCTGGATTCTGGGAAATTCTTCAT 4%++88;-9<;<<<+8<<<:<;8:<<<<<<<<<<< MF:i:18 Aq:i:21 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+B7_610:5:147:68:353 83 chr1 486 99 35M = 299 -222 CCTTTGATATCTGGATTCTGGGAAATTCTTCATCC <<;;<<<<<<<<+;<<;<<0;<<<<;<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS51_78:7:316:961:576 99 chr1 488 65 35M = 666 213 TGTGATATCTGGATTCTGGGAAATTCTTCATCCCG <<<<<<<;<<<<;<<:<<;<;<<:;<9+34;;6%/ MF:i:18 Aq:i:65 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_61:8:7:171:402 99 chr1 489 99 35M = 682 228 GTGATATCTGGATTCTGGGAAATTCTTCATCCTGG <<<<<<<<<<<<<<<;/<<<<;<<<<<;<<1<<<4 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:277:458:330 83 chr1 490 99 36M = 329 -197 TGATATCTGGATTCTGGGAAATTCTTCATCCTGGAC <<<<<8;<<<1<;7<<<;<<<<<<<<7<<7<<<<;7 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:269:280:716 147 chr1 490 99 35M = 323 -202 TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA 6;<;;6:;<<<;64;<<<<<<<<;<<;<<;<<<<< MF:i:18 Aq:i:58 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:72:63:435 147 chr1 490 99 35M = 293 -232 TGATATCTGGATTCTGGGAAATTCTTCATCCTGGA ::<;<<<<;;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:46:900:610 99 chr1 491 99 35M = 684 228 GATATCTGGATTCTGGGAAATTCTTCATCCTGGAC <<<<<<<<<<<<;<<<<<<<<<<<<<<<<<;;4;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:189:467:475 99 chr1 493 99 35M = 683 225 TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC <<<<<<<<<<<<;;;<<<<<<<<<:<<<<:+<<;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:201:959:19 99 chr1 493 99 35M = 681 223 TATCTGGATTCTGGGAAATTCTTCATCCTGGACCC <<<<<<<<<<<<<<;<<<:<;<<;<<;+;+<3494 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:240:593:842 99 chr1 494 99 35M = 660 201 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT ============<================9===:= MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:29:381:169 163 chr1 494 99 35M = 641 182 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT <<<<<<<<<<<2<288;<<;<<:4<:<<;&92929 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:199:327:965 83 chr1 494 91 35M = 297 -232 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT <5<:<<<58<:<<<<<<8<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:87:323:895 99 chr1 494 99 35M = 671 212 ATCTGGATTCTGGGAAATTCTTCATCCTGGACCCT ;<<;;;;<<;<959;;;<;:<<;9<;;;4377788 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:5:327:991:508 147 chr1 495 99 35M = 312 -218 TCTGGATTCTGGGAAATTCTTCATCCTGGACCCTG 0:;::<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:6:882:784 163 chr1 496 99 35M = 686 225 CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGA <<<<<<<<<<<<<:<<<<<<<<<<<<:6::::<,2 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:175:705:982 99 chr1 496 89 36M = 660 200 CTGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG <<<<;<<;<<<<<<<<<<<<<;<<+<:;39;+<40< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:30:92:753 99 chr1 497 99 35M = 673 211 TGGATTCTGGGAAATTCTTCATCCTGGACCCTGAG <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:245:323:744 163 chr1 499 99 35M = 679 215 GATTCTGGGAAATTCTTCATCCTGGACCCTGAGAG <;<<<<<<<<<<<<<<<<<<<<<;<+<<<<<<<4< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:76:786:458 83 chr1 502 99 35M = 341 -196 TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT ;<;:7<.<<<<<8;<<<<<<<6<;8<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:185:213:330 83 chr1 502 99 35M = 328 -209 TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT ;4<<<;<<<<<<<<;<<;;;<<<<9<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:42:1091:1726 147 chr1 502 99 35M = 334 -203 TCTGGGAAATTCTTCATCCTGGACCCTGAGAGATT 4443838<4<8<87<<3</8<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:12:158:458 99 chr1 503 84 36M = 675 208 CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT <77<<<7<<<<<<<<<<<<5<4;<<;5<;;+2<+;; MF:i:18 Aq:i:15 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:277:590:364 163 chr1 503 99 35M = 681 213 CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC <<<<<8<<<<<<<<;<<<<<;;<7<<;;7858;;8 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:18:1418:237 147 chr1 503 99 35M = 304 -234 CTGGGAAATTCTTCATCCTGGACCCTGAGAGATTC <<:<<<<<<<<:<<<<<<<<<:<<<<<<<<<<<<: MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:4:262:456:74 147 chr1 504 99 35M = 357 -182 TGGGAAATTCTTCATCCTGGACCCTGAGAGATTCT 862;<<<:;<;<<<;;;<<<<;;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:186:989:869 99 chr1 505 99 34M = 655 185 GGGAAATTCTTCATCCTGGACCCTGAGAGATTCT <<<<<<<<<<<<<<<<<<<<7;:<<<<<<<<<$< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:80:885:513 83 chr1 507 99 35M = 344 -198 GAAATTCTTCATCCTGGACCCTGAGAGATTCTGCA <7<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:311:100:539 83 chr1 508 99 35M = 353 -190 AAATTCTTCATCCTGGACCCTGAGAGATTCTGCAG ;<;<<;;<;<<;<<<<<;9<<<;<<<<<<<<9<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:199:511:426 163 chr1 509 99 35M = 669 195 AATTCTTCATCCTGGACCCTGAGAGATTCTGCAGC <<<<<<<<<<<<<<;<<<<<<:<<<<<<<<<;:<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:26:227:1053 99 chr1 510 99 35M = 663 188 ATTCTTCATCCTGGACCCTGAGAGATTCTGCAGCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:172:622:707 99 chr1 511 99 35M = 685 209 TTCTTCATCCTGGACCCTGAGAGATTCTGCAGCCC <<<<<<<<<<<<<<<<<<<<<<;<<<<<<:<5:<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:157:935:374 147 chr1 512 99 35M = 353 -194 TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCA 94988994.<:<+42::<<<<<:<:<4<<<<;<1< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:103:111:720 147 chr1 512 99 36M = 353 -195 TCTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG ;4<<<;)<<-<9<;<<7<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:328:669:662 147 chr1 512 99 35M = 337 -210 TCTTCATCCTGTACCCTGAGAGATTCTGCAGCCCA 4<<;<<8<.<88.<<;4<<<<<<<4<.<<<<7<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS51_64:5:202:39:380 147 chr1 513 99 35M = 334 -214 CTTCATCCTGGACCCTGAGAGATTCTGCAGCCCAG /92/;2<+2<<<<64<<<<<<<<<<<<<<<<7<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:66:655:769 147 chr1 515 99 35M = 348 -202 TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT 8<<;:69<;:;9<2<*9<;6<<<<<17<;<3+<;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:7:526:343 99 chr1 515 99 35M = 698 218 TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT <<<<<<<<<<<<<<<:<<<5<<<<<<5;<<<+8<; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:33:672:473 147 chr1 515 99 35M = 330 -220 TCATCCTGGACCCTGAGAGATTCTGCAGCCCAGCT 5<70<<55<4<24.5<<<<<<<<<6<<<<<<2<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:72:308:839 83 chr1 517 99 40M = 354 -203 ATCGTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT :8:.:<;<<5<<<<<<<<<<<<<<<<;:<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:2 UQ:i:40 H0:i:0 H1:i:1
+EAS56_61:1:210:880:606 83 chr1 518 99 35M = 341 -212 TCCTGGACCCTGAGAGATTCTGCAGCCCAGCTCCA .<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:80:760:490 99 chr1 520 99 34M = 686 201 CTGGACCCTGAGAGATTCTGCAGCCCAGCTCCAG <<<<<<<<<<8<;<7<<<<<<;<;;<2<;<<<1, MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:34:970:1374 147 chr1 520 99 35M = 363 -192 CTGGACCCTGAGAGATTCTGCAGCCCAGATCCAGA <6<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_593:1:200:559:765 147 chr1 521 99 36M = 337 -220 TGGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT 8<;;4<3;<;<<<<<<5<<;;<<98;;<<<<;<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_53:8:28:701:724 83 chr1 521 99 35M = 347 -209 TGGACCCTGAGAGATTCTGCAGCCCAGCTCCAGAT .;..3;8.8<8;<<;9<9<<<7;<<<<<<<<7<<7 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:318:345:156 163 chr1 522 99 35M = 695 208 GGACCCTGAGAGATTCTGCAGCCCAGATCCAGATT <<<<<<<<:<<<<<<<<5<:5<<<3:'<72')*;9 MF:i:18 Aq:i:39 NM:i:1 UQ:i:6 H0:i:0 H1:i:1
+B7_595:1:81:1000:375 83 chr1 524 90 35M = 329 -230 ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGC ;8<;+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:13:1155:631 163 chr1 524 99 40M = 668 184 ACCCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTG <<<<<<;<<;<<<<<<;<<<<<9<;<;94<<%<<<7:777 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:257:611:440 147 chr1 524 99 35M = 341 -218 ACCCTGAGAGATTCTGCAGCCCAGATCCAGATTGC 2<;;8<;;<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:6:129:694:359 83 chr1 525 88 35M = 350 -210 CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT 7777<7<7;77+<3<<;<<;<<<<;<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_11:6:11:285:1567 163 chr1 525 99 35M = 685 195 CCCTGAGAGATTCTGCAGCCCAGATCCAGATTGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:1:196:533:921 147 chr1 526 99 35M = 361 -200 CCTGAGAGATTCTGCAGCCCAGATCCAGATTGCTT 7<<<<7<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_11:2:6:251:1557 163 chr1 526 99 35M = 700 209 CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:20:492:850 99 chr1 526 78 35M = 694 203 CCTGAGAGATTCTGCAGCCCAGCTCCAGATTGCTT <7<<<<<<<<<<<.<54<7&<<<7<74<2<<<2<< MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:231:339:551 83 chr1 527 99 35M = 350 -212 CTGAGAGATTCTGCAGCCCAGATCCAGATTGCTTG <;<<;<<<<<<<<<<;:<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_19:4:68:1122:79 99 chr1 528 99 40M = 687 199 TGAGAGATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCT <<<<<<<<<<<<<;<<<<;<<<<<<;<<<4;<<4;99::; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:87:1375:1303 83 chr1 529 99 35M = 340 -224 GAGAGATTCTGCAGCCCAGATCCAGATTGCTTGTG :<;<(<<<<<<<<<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS220_1:8:46:485:482 147 chr1 530 94 35M = 371 -194 AGAGATTCTGCAGCCCAGATCCAGATTGCTTGTGG <<<<<::<<<<<<<<6<<<<<<<<<6<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS218_4:7:90:1873:89 147 chr1 531 99 35M = 344 -222 GAGATTCTGCAGCCCAGATCCAGATTGCTTGTGGT <<<<;49<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:5:238:31:968 99 chr1 534 99 35M = 717 218 ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTG 9======8====*=====,=1=======<=7:::, MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:78:773:660 163 chr1 534 99 36M = 711 213 ATTCTGCAGCCCAGCTCCAGATTGCTTGTGGTCTGA <<<<<<<<;<<<<<<<<<8<8<<;<<<;<<;7<<4: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:90:828:633 83 chr1 537 99 36M = 381 -192 CTGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG <<<;<;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_30:2:272:750:698 83 chr1 538 80 35M = 365 -208 TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAG 0<;8;64;<<<;<;.<+;:<4;4<;<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_19:3:88:1656:896 147 chr1 538 99 40M = 387 -191 TGCAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCTGC 6/8::*9/*3*'<88<:9*<<<8<<<;<<<<<<<<;<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS54_61:6:126:541:194 163 chr1 540 97 35M = 730 225 CAGCCCAGATCCAGATTGCTTGTGGTCTGACAGGC <<<<<<<<8<<<<<8<<<<<<<<<8<<<428+<80 MF:i:18 Aq:i:43 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS114_28:4:9:55:730 163 chr1 540 99 36M = 722 218 CAGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT >>=>>+==>>==<==<=8=><:;8/;7</5724-2; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:278:918:892 99 chr1 541 99 35M = 720 214 AGCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCT =============:====================8 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:243:876:758 99 chr1 541 99 35M = 712 206 AGCCCAGATCCAGATTGCTTGTGGTCTGACAGGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;78<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_65:5:121:380:656 147 chr1 542 99 35M = 362 -215 GCCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTG :;<<;<<1<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:82:164:1924 83 chr1 542 99 35M = 378 -199 GCCCAGCACCAGATTGCTTGTGGTCTGACAGGCTG 6<<<<<<-<<<<<<<<<2<<06<9<<<<<1<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS114_30:6:163:312:891 99 chr1 543 99 35M = 709 201 CCCAGCTCCAGATTGCTTGTGGTCTGACAGGCTGC <<<<<<<<<;<<<<<<<<<<<<<<<<:;;<;;<;0 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:124:243:35 147 chr1 544 60 35M = 364 -215 GCATATCCAGATTGCTGGTGGTCTGACAGGCAGCA &+<+;<694;+&99<<2<;423<26<-<<<<,<3< MF:i:130 Aq:i:60 NM:i:2 UQ:i:28 H0:i:0 H1:i:0
+B7_591:1:191:462:705 99 chr1 545 99 36M = 721 212 CAGATCCAGATTGCTTGTGGTCTGACAGGCTGCAAC <<<<<<<<<<<<<<<<<<<;<<<<<<<;<<<<::<6 MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_610:8:95:426:791 147 chr1 547 99 35M = 359 -223 GNTCCAGATTGCTTGTGGTCTGACAGGCTGCAACT !!!!<<<<<;;<<<<;<<;<;;<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:1 UQ:i:23 H0:i:1 H1:i:0
+EAS218_4:5:41:118:1246 147 chr1 548 99 35M = 374 -209 CTCCAGATTGCTTGTGGTCTGACAGGCTGCAACTG <<<<<<<<<<<<<<<+<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:27:973:518 99 chr1 549 99 35M = 691 177 TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT <<<<<<<<<<<<<<;<<<<7<<<<<<<<88;0:8; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:4:679:110 99 chr1 549 99 35M = 705 191 TCCAGATTGCTTGTGGTCTGACAGGCTGCAACTGT <<<<<<<<<<<<<<<<<<<;<<<<<<<<::<;;:7 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:297:283:948 163 chr1 550 99 35M = 727 212 CCAGATTGCTTGTGGTCTGACAGGCTGCAACTGTG <<<<<<<<<<<<<<<<<<<<<<<:<<9;)+1;19- MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:61:1797:113 147 chr1 551 99 35M = 380 -206 CAGATAGCTTGTGGTCTGACAGGCTGCAACTGTGA <<0<<&<<<<;<<4;;3<;<:<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS188_7:6:205:873:464 99 chr1 552 99 35M = 743 226 AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG <<<<<<<<<7<<<<<<<<<<<<:<<,:<:<<<<:: MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:33:1168:1762 99 chr1 552 99 35M = 728 211 AGATTGCTTGTGGTCTGACAGGCTGCAACTGTGAG <<<<<<<<<<<<<<<<;<<;<;<<<<<<<<:;2:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:78:909:394 83 chr1 554 81 35M = 373 -216 ATTGCTTGGTGTCTGACAGGCTGCAACTGTGAGCC 6167&+&&/&//734/3<<<9*<;;3<3<;9<<3< MF:i:18 Aq:i:21 NM:i:2 UQ:i:19 H0:i:0 H1:i:0
+EAS1_103:2:226:302:758 163 chr1 556 99 35M = 751 230 TGCTTGTGGTCTGACAGGCTGCAACTTTGAGCGNT <<<<<<<;;;,<;<92;66<;))42<&2&(/1!!! MF:i:18 Aq:i:33 NM:i:2 UQ:i:9 H0:i:0 H1:i:1
+EAS114_28:5:206:671:49 163 chr1 557 99 36M = 719 198 GCTTGTGGTCTGACAGGCTGCAACTGTGAGCCATCA <<<<<<;<<<<8<<<;;<<<3<<8<8<35+,55;,3 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:165:431:857 147 chr1 559 99 35M = 406 -188 TTGGGGTCTGACAGGCTGCAACTGTGAGCCATCAC ''7'/;'1%0447<<<*<6<<<*<*<<<<6<<<<< MF:i:18 Aq:i:53 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS114_39:5:50:972:1286 83 chr1 559 99 35M = 377 -217 TTGTGGTCTGACAGGCTGCAACTGTGAGCCATCAC :;;7;7;;0<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:288:552:440 163 chr1 560 87 35M = 747 222 TGTGGTCTGACAGGCTGCAACTGTGAGCCTTCCAT <<<<71<77<<<:<<<&<4<<77<16<88&36+%% MF:i:18 Aq:i:26 NM:i:4 UQ:i:26 H0:i:1 H1:i:0
+EAS221_1:8:78:1478:1446 147 chr1 560 99 35M = 389 -206 TGTGGTCTGACAGGCTGCAACTGTGAGCCATCACA <8,8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:275:851:240 99 chr1 561 99 35M = 743 217 GTGGTCTGACAGGCTGCAACTGTGAGCCATCACAA <<<<<<<<<<<<<<<<<<<<<<<:<<4<7<<<<<< MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:185:312:167 83 chr1 562 99 35M = 401 -196 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT <<8:<8<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:1:119:446:185 83 chr1 562 99 35M = 372 -225 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT +70730;<0<77;;<<<<<9<<<<<<9<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:3:168:741:680 83 chr1 562 99 35M = 394 -203 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT <<5<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:67:1797:1931 99 chr1 562 99 35M = 750 223 TGGTCTGACAGGCTGCAACTGTGAGCCATCACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:228:182:717 99 chr1 563 99 35M = 729 201 GGTCTGACAGGCTGCAACTGTGAGCCATCCCCATG <=9============5==5=<,59<=1=<&;&;;7 MF:i:18 Aq:i:66 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS112_34:7:118:523:591 83 chr1 563 99 35M = 393 -205 GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG 4:--&0:67<<8:<<<<<<<<<<<:4<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:29:1061:574 83 chr1 563 99 35M = 363 -235 GGTCTGACAGGCTGCAACTGTGAGCCATCACAATG <87<5<<9<<<66<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:168:69:605 83 chr1 565 67 36M = 373 -228 TCTGACAGGCGGCAACTGTGAGCCATCACAATGAAC '<'<144<0<&<<<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS221_3:4:90:247:212 99 chr1 567 99 35M = 733 201 TGACAGGCTGCAACTGTGAGCCATCACAATGAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<8< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:140:522:212 83 chr1 568 99 35M = 399 -204 GACAGGCTGCAACTGTGAGCCATCACAATGAACAA :;8;:::<<:<<<<<<<<<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:179:13:782 83 chr1 568 99 35M = 412 -191 GACAGTCTACAACTGTGAGCCATCACAATGAACAA &37.3&;3'*<3<;9<9<<5<<<<<<<<<9<<<<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:11 H0:i:0 H1:i:1
+EAS114_45:3:75:217:337 83 chr1 568 99 35M = 386 -217 GACAGGCTGCAACTGTGAGCCATCACAATGAACAA 4779797;;;<;:4;;<<<77<;;;7<<;<;<;<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:168:528:288 163 chr1 570 99 35M = 740 205 CAGGCTGCAACTGTGAGCCATCACAATGAACAACA <<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<;<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:162:503:769 147 chr1 571 99 35M = 392 -214 AGGCTGCAACTGTGAGCCATCACAATGAACAACAG ;:;1;=8=;:+=====;&==7============== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:163:618:570 163 chr1 571 99 35M = 751 215 AGGCTGCAACTGTGAGCCATCACAATGAACAACAG <<<<<<<8<<<<<<<<<<<<<+<.7<<..<;&;8; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:251:121:479 163 chr1 572 99 35M = 750 213 GGCTGCAACTGTGAGCCATCACAATGAACAACAGG <<<<<<<<<<<;:<<<<;:;:<:<;:188;7:<+( MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:44:1578:1674 147 chr1 573 99 35M = 418 -190 GCTGCAACTGTGAGCCATCACAATGAACAACAGGA 62631;;4;;;8;;48;;7;8;;;;;;;;;8;;;; MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:263:74:407 163 chr1 574 99 35M = 754 215 CTGCAACTGTGAGCCATCACAATGAACAACAGGAA <<<<2<<<<<<:<<<9<<4<<<<:<<<<9<999.7 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:254:32:275 147 chr1 575 99 35M = 382 -228 TGCAACTGTGAGCCATCACAATGAACAACAGGAAG (6+<;+6:9<<:7:<95<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:82:879:246 83 chr1 576 99 35M = 391 -220 ACAACTGTGAGCCATCACAATGAACAACAGGAAGA %+=661;&===:&==1<5======1========== MF:i:18 Aq:i:43 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS54_71:4:165:397:25 163 chr1 576 99 35M = 759 217 GCAACTGTGAGCCATCACAATGAACAACAGGAAGA <<7<<<<<<)97<6<:3:60:3+37-37+<:33:3 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:148:776:486 163 chr1 578 99 35M = 755 212 AACTGTGAGCCATCACAATGAACAACAGGAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:59:1576:946 99 chr1 578 99 35M = 761 218 AACTGTGAGCCATCACAATGAACAACAGGAAGAAA <:<<<<<<<<<<<<:<:<<<<<<<8<<::1<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:61:433:385 83 chr1 579 99 35M = 381 -233 ACTGTGAGCCATCACAATGAACAACAGGAAGAAAA <*97<<<<&9<<;<&<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:37:761:635 147 chr1 581 99 35M = 418 -198 TGTGAGCCATCACAATGAACAACAGGAAGAAAAGG +37:<088<+<<;<<;<<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:178:192:499 163 chr1 582 99 35M = 768 221 GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT <<<<<<<;<1<<<<<<;<<;6<<3666;;;;;/6/ MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:93:945:176 99 chr1 582 99 35M = 745 198 GTGAGCCATCACAATGAACAACAGGAAGAAAAGGT <<<<<<<<<<<<<<<<<<<<<;<<<<;;<;:7;<3 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:216:988:883 83 chr1 584 99 35M = 392 -227 AAGCCAACACAATGAACAACAGGAAGAAAAGGTCT (=/1+=&:=&======<==<=============== MF:i:18 Aq:i:68 NM:i:2 UQ:i:12 H0:i:1 H1:i:0
+EAS114_39:1:12:884:219 99 chr1 584 99 35M = 756 207 GAGCCATCACAATGAACAACAGGAAGAAAAGGTCT <<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<5:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:61:628:681 163 chr1 586 99 36M = 746 196 GCCATCACAATGAACAACAGGAAGAAAAGGTCTTTC <<<<<<<<<<<<<<<<<<<;<<<<<<<:<<;;;;;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:91:360:585 147 chr1 586 99 35M = 430 -191 GACATCACAATGAACAACAGGAAGAAAAGGTCTTT 5&&<<3:;<<<<<<)<<3<<<<<<<;;<<<<;<<< MF:i:18 Aq:i:67 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS139_11:6:89:1151:1878 99 chr1 587 99 35M = 757 205 CCATCACAATGAACAACAGGAAGAAAAGGTCTTTC <;;<<<<<;;;<<<<4;;::;<;8;;<;;8:<8<4 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:40:1596:1433 99 chr1 587 99 40M = 756 209 CCATCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG <<<<<<<<<<<<<<<<<<<<<<<<;<<<<1<<<<<::;:: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:4:1620:413 99 chr1 588 99 35M = 768 215 CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA <<<<<<<<<<6<<<6<<<;<6<9-1<;<&66<<<2 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:65:1928:1125 99 chr1 588 99 35M = 784 231 CATCACAATGAACAACAGGAAGAAAAGGTCTTTCA <<;<<<7<<7<;<7<<<<<<<7<<<<;<.-;<+88 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:123:998:248 163 chr1 589 99 35M = 776 222 ATCACAATGAACAACAGGAAGAAAAGGTCTTTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<;9<<<68< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:240:603:890 163 chr1 590 99 36M = 740 186 TCACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA <<<<<<<<<<<<<<<<<<;<:<<:<<;<<<<<8865 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:20:762:748 163 chr1 591 99 35M = 777 221 CACAATGAACAACAGGAAGAAAAGGTCTTTCAAAA =================================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:246:313:499 99 chr1 592 99 35M = 757 200 ACAATGAACAACAGGAAGAAAAGGTCTTTCAAAAG <<<<<<<<<<<<<;<;<<<<<<<<;<<<<<;;<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:6:7:858:437 99 chr1 593 99 35M = 773 215 CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG <<<<<<<<<<<<<<<<<<<<<;<3<<<<<<<<<33 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:150:933:810 163 chr1 593 99 35M = 755 197 CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG =================================== MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:204:264:413 147 chr1 593 96 35M = 415 -213 CAATGAACAACAGAAAGAAAAGTTCTTTCAAAAGG 1==(4=::;/7::&===;====/=;===;;===== MF:i:18 Aq:i:27 NM:i:2 UQ:i:19 H0:i:0 H1:i:0
+EAS139_11:3:65:556:1505 163 chr1 593 99 35M = 790 232 CAATGAACAACAGGAAGAAAAGGTCTTTCAAAAGG <<<<<<<<<<<<<<<<<<<<<<<6<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:62:386:959 99 chr1 594 99 35M = 752 193 AATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGT <<8<<<<;<<<<-<<87;</<;<+<;5<+;;<3;+ MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:134:868:252 147 chr1 595 99 36M = 404 -227 ATGAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGA <;<<<8<<<<<<<<<<<<<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:252:19:955 99 chr1 596 84 35M = 771 210 TGAACAAAAGGAAGAAAAGGTCTTTCAAAAGGTGA <<<<<<<<<<4<<<<9<<+9)9<<4:9+<<0<909 MF:i:18 Aq:i:41 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_67:4:145:607:216 83 chr1 596 99 35M = 437 -194 TGAAAAACAGGAAGAAAAGGTCTTTCAAAAGGTGA /;<<&<<8<<<<<<<<<<<<<;872<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_65:8:140:924:923 163 chr1 597 99 35M = 767 205 GAACAACAGGAAGAAAAGGTCTTTCAAAAGGTGAT <<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<5;<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:120:63:653 147 chr1 598 99 35M = 420 -213 AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG <<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:204:779:181 163 chr1 598 99 35M = 779 216 AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG <<<<<<5<<:<<<<<8<<,<<<<<<<<<<91<91< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:325:150:465 147 chr1 598 99 35M = 412 -221 AACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATG <<:<<<<<<<<;<:<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:57:722:347 83 chr1 599 99 35M = 439 -195 ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:266:842 163 chr1 599 99 35M = 784 220 ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT =====)===========8=====7882855355'5 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:183:852:253 163 chr1 599 99 35M = 773 209 ACAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<;;<8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:30:887:404 163 chr1 600 99 35M = 789 224 CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG <<<<<<<<<<;<<<<<<<<<<<<<<<<:(<<<7;7 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:101:572:491 147 chr1 600 99 35M = 425 -210 CAACAGGAAGAAAAGGTCTTTCAAAAGGTGATGTG 8<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:73:730:487 99 chr1 604 99 35M = 770 201 AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT <<<<<<<<<<<<<<<<<<<9<<<<<<:<<<;<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:172:896:83 99 chr1 604 99 34M = 786 217 AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGT <<<<<<<<<<<<<<<<<:;;+;<<<<<<<<9;;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:154:762:630 163 chr1 604 99 35M = 792 223 AGGAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:99:756:130 163 chr1 606 99 35M = 798 227 GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:11:360:1577 99 chr1 606 99 35M = 781 210 GAAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCT <<<<<<<<<<<<<<<<<4<;;<<;;<;<<<8<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:27:1881:486 83 chr1 607 99 35M = 427 -215 AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC 99797;;9:<:;;;<;;;;<<<;;;;<;<;;<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:5:497:687 99 chr1 607 99 35M = 789 217 AAGAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:142:63:937 163 chr1 609 99 36M = 777 204 GAAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC <<<<<<<<<<<<<<<<<:<<<<<<<<<;<<:<<:<: MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:36:485:632 163 chr1 610 99 36M = 784 210 AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<;<18; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:8:36:927:478 99 chr1 610 99 35M = 798 223 AAAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATC <<<<<<<<<<<<<<<<;<<<<<:<:<<<<8<9;<8 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:169:862:829 163 chr1 611 99 35M = 772 195 AAAGGTCTTTCAAAAGGTGATGTGTGTTCTCATCA <<<<<<<<<<<<<<<<<;<<<;<;<<<<:<;;<78 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:63:424:1643 163 chr1 614 99 35M = 798 219 GGTCTTTCAAAAGGTGATGTGTGTTCTCATCAACC ;;<<<<<<;<<<<<<<<<<5;9;<<<<<<<<<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:20:41:138 99 chr1 615 99 35M = 774 194 GTCTTTCAAAAGGTGATGTGTGTTCTCATCAACCT <<<<<<<<<<<<<<<<<<<<<<<<7<;<<<<<(<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:49:163:904 83 chr1 616 99 35M = 450 -201 TCTTTCAAAAGGTGATGTGTGTTCTCATCAACCTC 79779<<<<<;;;;9;;<<7<;*9<<<7<<;<<;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:135:543:760 99 chr1 619 99 35M = 787 203 TTCAAAAGGTGATGTGTGTTCTCATCAACCTCATA <<<<;;<;<<<<<<<9<<<<<<<<<<<;<<<<5<: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:131:742:561 163 chr1 620 99 35M = 790 205 TCAAAAGGTGATGTGTGTTCTCATCAACCTCATAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:120:14:944 83 chr1 621 99 35M = 428 -228 CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA :;<<;<;<;<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:82:566:1096 147 chr1 621 99 35M = 446 -210 CAAAAGGTGATGTGTGTTCTCATCAACCTCATACA <<<<<<<<<<:<<<<<<<:<<<<<<:<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:8:14:601:624 83 chr1 622 99 35M = 446 -211 AAAAGGTGATGTGTGTTCTCATCAACCTCATACAC 1;;;;==5===.(=9=5=========8====;=== MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:5:538:401 99 chr1 624 99 40M = 788 204 AAGGTGATGTGTGTTCTCATCAACCTCATACACACACATG <<<<;<<<<<<<<<<<<<<<;<::7<<;<53:<98;;;;; MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:16:1081:1894 83 chr1 624 99 35M = 431 -228 AAGGTGATGTGTGTTCTCATCAACCTCATACACAC ;5;;&<;<<<<<<<<;<;<<;<<<;<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:3:1377:1663 147 chr1 626 99 35M = 446 -215 GGTGATGTGTGTTCTCATCAACCTCATACACACAC 6-88663;8;81;;66;8;;89939;;;67;2;;; MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:253:285:104 83 chr1 627 99 35M = 451 -211 GTGATGTGTGTTCTCATCAACCTCATACACACACA 2<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:66:1282:1215 99 chr1 627 99 35M = 794 202 GTGATGTGTGTTCTCATCAACCTCATACACACACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:2:1200:1076 163 chr1 629 99 35M = 786 192 GATGTGTGTTCTCATCAACCTCATACACACACATG ;;;;;;;;;;/;;;;;;;;6;;9;489;;;88888 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:194:688:289 99 chr1 631 99 35M = 795 199 TGTGTGTTCTCATCAACCTCATACACACACATGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<:; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:19:855:491 99 chr1 631 99 35M = 783 187 TGTGTGTTCTCATCAACCTCATACACACACATGGT <<<<<<<<<<<;<<.:<<<<;;;<4<:<:<7<;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:215:133:909 99 chr1 631 99 34M = 789 193 TGTGTGTTCTCATCAACCTCATACACACACATGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<996( MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:35:378:681 99 chr1 632 99 35M = 812 215 GTGTGTTCTCATCAACCTCATACACACACATGGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:40:758:116 163 chr1 632 99 40M = 814 222 GTGTGTTCTCATCAACCTCATACACACACATGGTTTAGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:7262 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:2:831:692 147 chr1 634 99 35M = 462 -207 GTGTTCTCATCAACCTCATACACACACATGGTTTA 2749'979<9<<<6;<<<0<;<<<<<3<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:162:594:858 99 chr1 634 99 35M = 818 219 GTGTTCTCATCAACCTCATACACACACATGGTTTA <<<<<<<<<<<<<<<<<9<;<<<<<<<<<<3<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:233:478:792 99 chr1 634 99 35M = 791 192 GTGTTCTCATCAACCTCATACACACACATGGTTTA <<<<<<<<<<<<<<<<<<<+<<<<<<<9<<<+;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:262:297:601 83 chr1 635 99 35M = 482 -188 TGTTCTCATCAACCTCATACACACACATGGTTTAG ;;<26;;;<;<7;<<<<<99<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:45:1769:1130 83 chr1 635 99 35M = 476 -194 TGTTCTCATCAACCTCATACACACACATGGTTTAG 88989;<;97;9<<;<;;;;9<98<<<<<<<;<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:4:153:977:200 83 chr1 640 99 35M = 472 -203 TCATCAACCTCATACACACACATGGTTTAGGGGTA 1:<83<<9;;9<<9;;<<;<<;;;;<;;<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:60:837:923 83 chr1 641 61 36M = 457 -220 CATCAACCGCATACACTCACATGGTTTAGGGGTATA 0<4<<<02.<99+<+&!<<<<+<<<<<<<<<<<<3< MF:i:18 Aq:i:24 NM:i:2 UQ:i:13 H0:i:0 H1:i:0
+EAS51_66:3:29:381:169 83 chr1 641 99 35M = 494 -182 CATCAACCTCATACACACACATGGTTTAGGGGTAT 2<82<;66<:<;<:<;<;<8<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:96:836:737 99 chr1 642 99 35M = 841 234 ATCAACCTCATACACACACATGGTTTAGGGGTATA <<<<<<71<<<<<<<<<<899<:5<<<96858<<. MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:228:354:203 147 chr1 643 99 35M = 480 -198 TCAACCTCATACACACACATGGTTTAGGGGTATAA %1<851<5<<<982<<<<<<<<::<<<<7<<<<3< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:151:159:43 147 chr1 645 99 35M = 452 -228 AACCTCATACACACACATGGTTTAGGGGTATAATA ;;4;6<<;<<<<7<77<6;<6<<<<<;;<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:182:404:693 163 chr1 646 99 35M = 812 201 ACCTCATACACACACATGGTTTAGGGGTATAATAC <<<<<<<<<<<<<<<<<<<<<<:::<6<;<94;77 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:4:841:339 163 chr1 646 99 35M = 793 182 ACCTCATACACACACATGGTTTAGGGGTATAATAC <<<<<<<<<<<<<<<<<;<7<<&;;<5<+<;7<<; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:156:857:494 163 chr1 648 99 35M = 838 225 CTCATACACACACATGGTTTAGGGGTATAATACCT <<<<<<<<<<<<<<<<<6<<<<<<<<<<<<<<:<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:165:464:123 99 chr1 650 99 35M = 814 199 CATACACACACATGGTTTAGGGGTATAATACCTCT ===============7==============8==== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:1:115:868:887 83 chr1 650 99 35M = 452 -233 CATACACACACATGGTTTAGGGGTATAATACCTCT ==;==8=;=;========================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:134:751:831 147 chr1 651 99 36M = 465 -222 ATACACACACATGGTTTAGGGGTATAATACCTCTAC ;:<4<8<<<;<;<<5<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:192:716:235 163 chr1 651 99 35M = 798 182 ATACACACACATGGTTTAGGGGTATAATACCTCTA ======================9==:<==:;;69; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:40:594:752 99 chr1 651 99 35M = 831 215 ATACACACACATGGTTTAGGGGTATAATACCTCTA <<<<<<<<<<;<<<;<<<::;<:;<;:<;;;<;<: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:184:17:636 121 chr1 652 76 35M = 652 0 TACACACACATGGTTTAGGGGTATAATACCTCTAC 8<89<<:<<<;;;<<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:184:17:636 181 chr1 652 0 * = 652 0 TTTTTTTTTTTTTTTTTTTTTTTTTTTTCACAGGT !!!!!!!!!!!!!!!!!!!!!!!!!!!77777777 MF:i:192
+EAS1_108:8:129:477:427 147 chr1 652 99 35M = 481 -206 TACACACACATGGTTTAGGGGTATAATACCTCTAC <<<9;<<9<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:130:912:658 163 chr1 652 99 35M = 841 224 TACACACACATGGTTTAGGGGTATAATACCTCTAC <<<<<;<<<<<<;<<<<<<<<<<<<<<<<<7<;;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:85:401:1190 83 chr1 652 99 35M = 458 -229 TACACACACATGGTTTAGGGGTATAATACCTCTAC 64778:;69739:;+9::7;;;<;6<;7;;;;;7< MF:i:18 Aq:i:55 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:4:1502:1911 163 chr1 652 99 40M = 802 190 TACACACACATGGTTTAGGGGTATAATACCTCTACATGGC <<<:4<<<<<<;<<<<;9;5<95<;<<;9+;1612:1::: MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:198:691:595 163 chr1 655 99 35M = 847 227 ACACACATGGTTTAGGGGTATAATACCTCTACATG ==============&===============;7;=1 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:186:989:869 147 chr1 655 99 35M = 505 -185 ACACACATGGTTTAGGGGTATAATACCTCTACATG ;<<;:<<<7:<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:38:856:336 147 chr1 656 99 35M = 480 -211 CACACATGGTTTAGGGGTATAATACCTCTACATGG 2;4;4<:;6:5:<<;:;<<;<<;<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:49:271:588 163 chr1 658 99 35M = 830 207 CACATGGTTTAGGGGTATAATACCTCTACATGGCT <<<<<<<<<<<<<<5:<<<<<<:<<<<<<<:7%9< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:240:593:842 147 chr1 660 99 35M = 494 -201 CATGGTTTAGGGGTATAATACCTCTACATGGCTGA *<<<;<<6<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:175:705:982 147 chr1 660 89 36M = 496 -200 CATGGTTTAGGGGTATAATACCTCTACATGGCTGAT ')'''''')'''''*')*)'*)')))+,'*)+'*,! MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS221_3:6:26:227:1053 147 chr1 663 99 35M = 510 -188 GGTTTAGGGGTATAATACCTCTACATGGCTGATTA <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:316:961:576 147 chr1 666 65 35M = 488 -213 TTACGGGTGTAATCTCTCTACATGGCTAATTATGA (++%%+++),+,+*++,+,,-,**+,-&-,+-+-- MF:i:130 Aq:i:65 NM:i:5 UQ:i:36 H0:i:0 H1:i:0
+EAS56_63:5:96:788:614 163 chr1 667 99 35M = 862 230 TAGGGGTATAATACCTCTACATGGCTGATTATGAA <<<<<<<<<<<<<<<<<<<<<<;6;<<;;<;;7;9 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:13:1155:631 83 chr1 668 99 40M = 524 -184 AGGGGTATAATACCTCTACATGGCTGATTATGAAAACAAT ;:398<<;<<<<<;<3<;;<<<<;;<<<<<<<<<<;<<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:199:511:426 83 chr1 669 99 35M = 509 -195 GGGGTATAATACCTCTACATGGCTGATTATGAAAA <:7:<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:124:241:608 99 chr1 670 99 35M = 856 221 GGGTATAATACCTCTACATGGCTGATTATGAAAAC <<<<<<<<<;<<<<<<<<<;;<<<;<<<<;;8;;: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:59:396:359 147 chr1 670 99 35M = 474 -231 GGGTATAATACCTCTACATGGCTGATTATGAAAAC 28288;;;;;;;;;::;;;;:;;;;;;;;;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:87:323:895 147 chr1 671 99 35M = 494 -212 GGTATAATACCTCTACATGGCTGATTATGAAAACA 55777;;;939;9;;9;;;;9;;;;;;;;;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:28:708:463 147 chr1 672 99 36M = 477 -231 GTATAATACCTCTACATGGCTGATTATGAAAACAAT ;;<;<<====3=====5=================== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:84:101:328 83 chr1 673 99 35M = 480 -228 TATAATACCTCTACATGGCTGATTATGAAAACAAT <<<<<<<<:<<<<<<<<<6<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:30:92:753 147 chr1 673 99 35M = 497 -211 TATAATACCTCTACATGGCTGATTATGAAAACAAT <<<<<<;<<<<<<:<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:8:88:90:59 73 chr1 674 37 35M = 674 0 ATAATACCTCTACATGTCTGATTATGAAAACAATG <<<<<<<4;7;<<<;;47;&9..1;6&4<755;1; MF:i:64 Aq:i:0 NM:i:1 UQ:i:19 H0:i:0 H1:i:1
+EAS112_32:8:88:90:59 133 chr1 674 0 * = 674 0 TGCACCTCCCTGTTCACCTAGATGCTAGGAGGACA =7595=92=72.=+5(:4=9092((.2&(&%07%. MF:i:192
+B7_593:1:12:158:458 147 chr1 675 84 36M = 503 -208 TAATAATGCTACATGGATGATTATGAAATCAATGTT ++++++$((+*+++++++++++++&+++++++++++ MF:i:18 Aq:i:15 NM:i:5 UQ:i:40 H0:i:0 H1:i:0
+B7_593:4:28:781:723 99 chr1 676 99 36M = 855 215 AATACCTCTACATGGCTGATTATGAAAACAATGTTC <<<<<<<<<7<<<;;<<;;<<;<5<4<7<;7<+:<9 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:27:856:401 163 chr1 679 99 35M = 871 227 ACCTCTACATGGCTGATTATGAAAACAATGTTCCC ======6===;2==;===;=+=92=;5+=&556:6 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:245:323:744 83 chr1 679 99 35M = 499 -215 ACCTCTACATGGCTGATTATGAAAACAATGTTCCC /.848299;&;9;9;=2.=7========;;===== MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:31:948:254 99 chr1 680 99 35M = 849 204 CCTCTACATGGCTGATTATGAAAACAATGTTCCCC <<<<<<<<<<<<<<<<<<<;<<<<<:<<8<;;;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:277:590:364 83 chr1 681 99 35M = 503 -213 CTCTACATGGCTGATTATGAAAACAATGTTCCCCA :::<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:201:959:19 147 chr1 681 99 35M = 493 -223 CTCTACATGGCTGATTATTAAAACAATGTTCCCCA ;4;.9<:0&/<5<::<<9/.<<<<<<<<<<<<;<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS56_61:8:7:171:402 147 chr1 682 99 35M = 489 -228 TCTACATGGCTGATTATGAAAACAATGTTCCCCAG :086::::847:<7<<7<<<<<<;7<<;<<<<7<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:67:317:249 99 chr1 683 26 35M = 840 192 CTACATGGCTGATTATGAAATCTATGTTCCCCATA <<<<<<;<<<<;:;<<7;<<.<&3<;;<<(;;6.< MF:i:18 Aq:i:26 NM:i:3 UQ:i:31 H0:i:0 H1:i:0
+EAS51_64:4:189:467:475 147 chr1 683 99 35M = 493 -225 CTACATGGCTGATTATGAAAACAATGTTCCCCAGA *.;*;7<75<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:46:900:610 147 chr1 684 99 35M = 491 -228 TACATGGCTGATTATGAAAACAATGTTCCCCAGAT <;5<;<<<;<<<<<<;<<<<<<<<<<8<<<<<8<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:232:351:909 99 chr1 685 80 36M = 843 194 ACATGGCTGATTATGAAATCAATGTTCCCCAGATGC <<<<<99<<<<<<99<7<'<9<<<6<<+<;7;<<&; MF:i:18 Aq:i:39 NM:i:2 UQ:i:11 H0:i:0 H1:i:1
+EAS139_11:6:11:285:1567 83 chr1 685 99 35M = 525 -195 ACATGGCTGATTATGAAAACAATGTTCCCCAGATA <8<4<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:172:622:707 147 chr1 685 99 35M = 511 -209 ACATGGCTGATTATGAAAACAATGTTCCCCAGATA 92<3996;<<<<<<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:6:882:784 83 chr1 686 99 35M = 496 -225 CATGGCTGATTATGAAAACAATGTTCCCCAGATAC 4;7<;64<<:<<4<<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:80:760:490 147 chr1 686 99 35M = 520 -201 CATGGCTGATTATGAAAACAATGTTCCCCAGATAC %::::+<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:68:1122:79 147 chr1 687 99 40M = 528 -199 ATGGCTGATTATGAAAACAATGTTCCCCAGATACCATCCC ::77*:1<<<<<<<<<<<<<<<:;<<<;<<<<<<8<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:264:988:663 99 chr1 688 99 35M = 875 222 TGGCTGATTATGAAAACAATGTTCCCCAGATACCA <<<<<<<<<<<1<4<<<4<<0<;<-<74*(<&51- MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:3:233:911 163 chr1 688 99 35M = 868 215 TGGCTGATTATGAAAACAATGTTCCCCAGATACCA <<<<<<<<<<<<<<<<<;<<<<<<<<<<;<;<<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:187:925:547 99 chr1 689 99 35M = 857 203 GGCTGATTATGAAAACAATGTTCCCAAGATACCAT 43<<<:9<;;;:7<<<<6<:<8<-4-/,81<(48: MF:i:18 Aq:i:37 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS56_65:5:75:637:650 163 chr1 691 99 35M = 868 212 CTGATTATGAAAACAATGTTCCCCAGATACCATCC <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:27:973:518 147 chr1 691 99 35M = 549 -177 CTGATTATGAAAACAATGTTCCCCAGATACCATCC +<<<<<<9<<<<<<<<<<<;<;<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:20:492:850 147 chr1 694 10 35M = 526 -203 AGTATGAAAACAATGTTCCCCAGATGCCGTCCCGG :.5:+.;;&91:;79:766:1:9+6&:1&&:+:)) MF:i:18 Aq:i:10 NM:i:4 UQ:i:31 H0:i:0 H1:i:0
+EAS51_64:4:318:345:156 83 chr1 695 99 35M = 522 -208 TTATGAAAACAATGTTCCCCAGATACCATCCCTGT ;8<8<<<<<;<<:<<;<;77<<<<<;<<;<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:5:863:302 99 chr1 698 99 35M = 866 203 TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:7:526:343 147 chr1 698 99 35M = 515 -218 TGAAAACAGTGTTCCCCAGATACCATCCCTGTCTT (7:;;;<<;;;<1<1<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS114_26:2:73:513:102 99 chr1 698 99 35M = 868 205 TGAAAACAATGTTCCCCAGATACCATCCCTGTCTT ===========================;======= MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:6:251:1557 83 chr1 700 99 35M = 526 -209 AAAACAATGTTCCCCAGATACCATCCCTGTCTTAC <<<<<<<<<<<<6:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:147:64:416 99 chr1 701 99 35M = 870 204 AAACAATGTCCCCCAGATACCATCCCTGTCTTACT <<<<<<<<<<<<<<<;<<<<<;<<<<;;:<;;;;; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_595:3:297:637:86 163 chr1 704 99 35M = 869 200 CAATGTTCCCCAGATACCATCCCTGTCTTACTTCC <<<<<<<<<<<<;+<+;<;<:<<<<<9<<957<;( MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:160:272:398 163 chr1 705 99 35M = 891 221 AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA 9<<<3<<<<<<<<<<<9<<;8<<<<;<+.;;89.. MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:4:679:110 147 chr1 705 99 35M = 549 -191 AATGTTCCCCAGATACCATCCCTGTCTTACTTCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:163:312:891 147 chr1 709 99 35M = 543 -201 TTCCCCAGATACCGTCCCTGTCTTACTTCCAGCTC 0.<;;8<<<0<<<<<<<<<<6<<<<<<8<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_28:3:78:773:660 83 chr1 711 99 36M = 534 -213 CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC 7<;7<<<7;9<<8;<<<<<<;<<<<<<<<<<7<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:5:63:875:1339 163 chr1 711 99 35M = 879 203 CCCCAGATACCATCCCTGTCTTACTTCCAGCTCCC <<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:243:876:758 147 chr1 712 99 35M = 541 -206 CCCAGATACCATCCCTGTCTTACTTCCAGCTCCCC 0%3<1;.70;3363;31;<<<<<<6<<<;<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:104:153:698 163 chr1 713 99 36M = 896 219 CCAGATACCATCCCTGTCTTACTTCCAGCTCCCCAG ;<<<<<<;6<<<<<<<<<<;<<<<;<;;;<.<::50 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:86:498:373 163 chr1 716 99 35M = 894 213 GATACCATCCCTGTCTTACTTCCAGCTCACCAGAG <<<<<<<<<<<<<<<<<<<<<<<5:<<<:<;7+67 MF:i:18 Aq:i:69 NM:i:1 UQ:i:25 H0:i:1 H1:i:0
+EAS1_95:6:87:734:888 163 chr1 717 99 35M = 900 218 ATACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG ===========;8=========;;=;====;;3(; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:238:31:968 147 chr1 717 99 35M = 534 -218 ACACCATCCCTGTCTTACTTCCAGCTCCCCAGAGG =(.7=5%===9:7==+==77=============== MF:i:18 Aq:i:69 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS54_65:3:290:558:349 99 chr1 719 99 35M = 869 185 ACCATCCCTGTCTTACTTCCAGCTCCCCAGCGGGA <<<;<<;<;<188<<<8::<686+4:<<6:&3)*& MF:i:18 Aq:i:59 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_28:5:206:671:49 83 chr1 719 99 36M = 557 -198 ACCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA ;<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:278:918:892 147 chr1 720 99 35M = 541 -214 CCATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAA =6=3=<===&========================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:1:191:462:705 147 chr1 721 99 36M = 545 -212 CATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAG <<'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:9:55:730 83 chr1 722 99 36M = 540 -218 ATCCCTGTCTTACTTCCAGCTCCCCAGAGGGAAAGC <:<;;<6<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:45:462:455 163 chr1 723 99 35M = 874 186 TCCCTGTCTTACTTCCAGCTCCCCAGACGGAACGC <<<<<<8<<<;<;<<<;<<<<<<<6;8&:80;733 MF:i:18 Aq:i:43 NM:i:2 UQ:i:27 H0:i:0 H1:i:1
+EAS114_28:2:149:650:44 163 chr1 726 99 36M = 902 212 CTGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC <<<<<<<<<<<<<<<<<<<<<<<<<;6<<;<<7<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:297:283:948 83 chr1 727 99 35M = 550 -212 TGTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTC 6;;3;6<<66<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:33:1168:1762 147 chr1 728 99 35M = 552 -211 GTCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCA 79<9;3<<<4<<<97<;;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:228:182:717 147 chr1 729 99 35M = 563 -201 TCTTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAA 778;8;474<<<;2;;<2<<<<<<<<;<;;9<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:8:1351:1986 163 chr1 729 99 35M = 911 217 TCTTACTTCCAGATCCCCAGAGGGAAAGCTTTCAA <<<<<<<<<<<<-<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS51_64:4:163:31:455 163 chr1 730 99 35M = 886 191 CTTACTTCCAGCTCCCCAGAGGGACAGCTNNCAAC <+<<<<<<<;0+<<<<;06070-9(0(9<!!5)05 MF:i:18 Aq:i:31 NM:i:3 UQ:i:7 H0:i:0 H1:i:1
+EAS54_61:6:126:541:194 83 chr1 730 97 35M = 540 -225 AGTACGACCAGCTCCCCAGAGGGAAAGCTTTCAAC +%&:/+(46=47&71/2==;=;8====28212=== MF:i:18 Aq:i:43 NM:i:4 UQ:i:40 H0:i:1 H1:i:0
+EAS51_62:7:178:286:414 163 chr1 731 99 35M = 907 211 TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG <<<<<<<<<<<<<<<<8<<<<<<<<<1<<<1;998 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:35:361:546 163 chr1 731 99 35M = 892 196 TTACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACG <<<<<<<<<<<<<<<<;<5<<<<<;<2<<<:<8<4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:90:247:212 147 chr1 733 99 35M = 567 -201 ACTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCT 7655:;87;<;;;8<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:149:354:667 99 chr1 734 99 35M = 888 189 CTTCCAGCTCCCCAGAGGGAAAGCTTTCAACGCTT <<<<<<<<<<<<<<<<<<<><<<<<<<<;<:<<<< 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<<<&,/</<<<<7<<;&&<$;*< MF:i:18 Aq:i:37 NM:i:2 UQ:i:8 H0:i:1 H1:i:0
+EAS114_39:1:12:884:219 147 chr1 756 99 35M = 584 -207 GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTT 7;::<:<<<7<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:40:1596:1433 147 chr1 756 99 40M = 587 -209 GCTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT -:8:1841<4;<88<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:7:761:623 99 chr1 757 99 35M = 938 216 CTTTCAACGCTTCTAGCCATTTCTTTTGGCATTTG <<<<<<<<<<<<<8<<<<;;<0<<<<<;;<;<;;& MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:246:313:499 147 chr1 757 99 35M = 592 -200 CTTTAAACGCTTCTAGCCATTTCTTTTGGCATTTG +;77%;;;&:;:7;<<<<<6<:<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS139_11:6:89:1151:1878 147 chr1 757 99 35M = 587 -205 CTTTCAACGATTCTAGCCATTTCTTTTGGCATTTG 8<66,,<<<<<<:<<<<<9<<<:<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_71:4:165:397:25 83 chr1 759 99 34M = 576 -217 TTCAACGCTTCTAGCCATTTCTTTTGGCATTTGC &(33'60;-'+'<7;<<*3-<;;183<<<;<;<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:59:1576:946 147 chr1 761 99 35M = 578 -218 CAACGCTTCTAGCCATTTCTTTTGGCATTTGCCTT 9<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:256:407:470 163 chr1 762 99 35M = 939 212 AACGCTTCTAGCCATTTCTTTTGGCATTTGCCTTC <<<<<<<<;<;<<<<<<<<<;;<</<<;;83;7;9 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:148:437:481 163 chr1 764 99 36M = 949 221 CGCTTCTAGCCATTTCTTTTGGCATTTGCCTTCAGA <<<<<<<<<<<<<<<<<<<<<;<<<<<;<<<<;0;8 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:140:924:923 83 chr1 767 99 35M = 597 -205 TTTTAGCCATTTCTTTTGGCATTTGCCTTCAGACC <<&<<;;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_103:4:143:560:194 99 chr1 768 99 35M = 946 213 TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC <<<<;;<<<<<<<<<<<6<;<<<<;;<<;9<999< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:178:192:499 83 chr1 768 99 35M = 582 -221 TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC 86<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:4:1620:413 147 chr1 768 99 35M = 588 -215 TCTAGCCATTTCTTTTGGCATTTGCCTTCAGACCC -<<<7<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:73:730:487 147 chr1 770 99 35M = 604 -201 TAGCCATTTCTTTTGGCATTTGCCTTCAGACCCTA <;;<<2;<;<<<;0<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:179:389:585 163 chr1 770 24 35M = 953 218 TGGCCACTTTTTATCGCATTTCCCTTTAGAACCTA <.4<9.4+.+'&-220<+<4<6<<20*6;<0(9<% MF:i:130 Aq:i:24 NM:i:7 UQ:i:103 H0:i:0 H1:i:0
+B7_595:1:252:19:955 147 chr1 771 84 35M = 596 -210 AGCCAGTTCTTTTGGCATTTGCCTTCAGACCCTCC <8<884<<<<<<68<<<<<<<2<;<<;<+<<<;<< MF:i:18 Aq:i:41 NM:i:2 UQ:i:46 H0:i:0 H1:i:1
+EAS54_71:4:169:862:829 83 chr1 772 99 34M = 611 -195 GCCATTTCTTTTGGCATTTGCCTTCAGACCCTAC ,1<6<<<<<7<<<<<<<<<<<<<<<<<7<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:6:7:858:437 147 chr1 773 99 35M = 593 -215 CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC 7;<4;;:;80<;<;<<<<<<:<<;<<<;;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:183:852:253 83 chr1 773 99 35M = 599 -209 CCATTTCTTTTGGCATTTGCCTTCAGACCCTACAC ;<9<;<<<<<<<<;<<<<<;<<<;<<<<;<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:20:41:138 147 chr1 774 99 35M = 615 -194 CATTTCTTTTGGCATTTGCCTTCAGACCCTACACG ;;;<;<<<::<<<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:123:998:248 83 chr1 776 99 35M = 589 -222 TTTCTTTTGGCATTTGCCTTCAGACCCTACACGAA ;:;5;<;:<9<<<<<:<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:142:63:937 83 chr1 777 99 36M = 609 -204 TTCTTTTGGCATTTGCCTTCAGACCCTACACGAATG ;;;<;<<<<;<<<<<;:<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:20:762:748 83 chr1 777 99 35M = 591 -221 TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT =:747;7=;;==7=;==7===7==7;========= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:149:953:349 99 chr1 777 99 35M = 915 173 TTCTTTTGGCATTTGCCTTCAGACCCTACACGAAT <<<<<<<<;<<<<<<<<<<<;7:<:<<:<:;;::; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:46:981:766 163 chr1 778 99 35M = 933 190 TCTTTTGGCATTTGCCTTCAGACCCTACACGAATG <<<<<<<<<<<<<;<<<<<-<;<<<<-<-<;-:6; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:204:779:181 83 chr1 779 99 35M = 598 -216 CTTTTGGCATTTGCCTTCAGACCCTACACGAATGC ;:;/*<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:11:360:1577 147 chr1 781 99 35M = 606 -210 TTTGGCATTTGCCTTCAGACCCTACACGAATGCGT 1<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:5:491:391 99 chr1 782 99 35M = 917 170 TTGGCATTTGCCTTCAGACCCTACACGAATGCGTC =========;===;==:4=========;3;==7;= MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:186:199:927 99 chr1 783 99 35M = 802 54 TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT <77<<<<2<;<<<<<06<<<<<<<<60<<684/6& MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:8:19:855:491 147 chr1 783 99 35M = 631 -187 TGGCATTTGCCTTCAGACCCTACACGAATGCGTCT 8<<<<;:<<<<:<<<<<:<;;<<<<<<<;<<<;<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:36:485:632 83 chr1 784 99 36M = 610 -210 GGCATTTGCCTTCAGACCCTACACGAATGCGTCTCT 0;;;<<;<<<;<<<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:266:842 83 chr1 784 99 35M = 599 -220 GGCATTTGCCTTCAGACCCTACACGAATGCGTCTC <9<<6;9<;9;;<<<<;;;9<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:65:1928:1125 147 chr1 784 99 35M = 588 -231 GGCATTTGCCTTCAGACCCTACACGAATACGTCTC <+<<<2<4<<<0<<4<<<<<6<<<6<<<'<<<<0< MF:i:18 Aq:i:41 NM:i:1 UQ:i:6 H0:i:0 H1:i:1
+EAS221_3:4:66:584:407 163 chr1 785 99 35M = 954 204 GCATTTGCCTTCAGACCCTACACGAATGCGTCTCT <<<*9<9<<<1<<<<<<<<*<59<4<)<2<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:172:896:83 147 chr1 786 99 35M = 604 -217 CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA ;<.5.;;<+;<<<<<<<4<<<<<<<;<<<<<;<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:2:1200:1076 83 chr1 786 99 35M = 629 -192 CATTTGCCTTCAGACCCTACACGAATGCGTCTCTA 7779779;9;:;;4;;9;;:7;<<<7;;;:<;<<; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:135:543:760 147 chr1 787 99 35M = 619 -203 ATTTGCCTTCAGACCCTACACGAATGCGTCTCTAC ;;.;;8;<8;<<32;<<<<<7<<<<<9<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:5:538:401 147 chr1 788 99 40M = 624 -204 TTTGCCTTCACACCCTACACGAATGCGTCTCTGCCACAGG 671&7::49:&0<<<(<::<&<<<:<<<<<<<&<<<<1<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:10 H0:i:0 H1:i:1
+EAS54_71:6:215:133:909 147 chr1 789 99 35M = 631 -193 TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA 7758;<;<;8<<<<;<;<<<<<:;<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:30:887:404 83 chr1 789 99 35M = 600 -224 TTGCCTTCAGACCCTGCACGAATGCGTCTCTACCA <<<<5<;::<<<;<<.<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:13 H0:i:0 H1:i:1
+EAS219_1:1:5:497:687 147 chr1 789 99 35M = 607 -217 TTGCCTTCAGACCCTACACGAATGCGTCTCTACCA <8<<8<<<;<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:131:742:561 83 chr1 790 99 35M = 620 -205 TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC <:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:65:556:1505 83 chr1 790 99 35M = 593 -232 TGCCTTCAGACCCTACACGAATGCGTCTCTACCAC <6<8<<4<8;;;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:233:478:792 147 chr1 791 99 35M = 634 -192 GCCTTCAGACCCTACACGAATGCGTCTCTACCACA 6<;9:<<9-<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:66:257:524 99 chr1 791 99 35M = 959 203 GCCTTCAGACCCTACACGAATGCGTCTCTACCACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<% MF:i:18 Aq:i:73 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_53:4:154:762:630 83 chr1 792 99 35M = 604 -223 CCTTCAGACCCTACACGAATGCGTCTCTACCACAG <<-::<91<<<<;<;<<<<;<<<<<<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:4:841:339 83 chr1 793 99 35M = 646 -182 CTTCAGACCCTACACGAATGCGTCTCTACCACAGG 77-):22<<<33;<5<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:66:1282:1215 147 chr1 794 99 35M = 627 -202 TTCAGACCCTACACGAATGCGTCTCTACCACAGGG ::;<;<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:194:688:289 147 chr1 795 99 35M = 631 -199 TCAGACCCTACACGAATGCGTCTCTACCACAGGGG ;8;%28<;<<<<<<<<;<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:8:36:927:478 147 chr1 798 99 35M = 610 -223 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT ,6;;;3;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:99:756:130 83 chr1 798 99 35M = 606 -227 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT ;;<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:192:716:235 83 chr1 798 99 35M = 651 -182 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT <5<<<8<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:63:424:1643 83 chr1 798 99 35M = 614 -219 GACCCTACACGAATGCGTCTCTACCACAGGGGGCT 9+<<<+7<<<<<<<<<<<<<<<<<8<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:14:360:580 99 chr1 799 99 35M = 963 199 ACCCTACACGAATGCGTCTCTACCACAGGGGGCGG ===========3===;5<==8;====79==.=5'5 MF:i:18 Aq:i:68 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS51_78:7:186:199:927 147 chr1 802 99 35M = 783 -54 CTACGCGAATGCGTCTCTACCACAGGGGGCTGCGC -;++)6<*8+;&<&/<<<<7<<71<<<<<6<<<7< MF:i:18 Aq:i:57 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS139_19:3:4:1502:1911 83 chr1 802 99 40M = 652 -190 CTACACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTTT :+:::5/;99<;<&<*<-9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:187:791:153 99 chr1 803 99 35M = 958 190 TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG <<<<<<<<<<<<<<<<<<<<<:+;;<;<88*6;68 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:63:527:1923 99 chr1 803 99 35M = 981 213 TACACGAATGCGTCTCTACCACAGGGGGCTGCGCG <<<<<<<<<<<<<<<<<:<<<<3<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:31:98:804 99 chr1 805 99 35M = 982 212 CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGC =======9===;============5=;9=;=;==& MF:i:18 Aq:i:74 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS218_4:7:89:1487:520 163 chr1 805 99 35M = 997 227 CACGAATGCGTCTCTACCACAGGGGGCTGCGCGGT 8<<<6/<<<<<<<<<:<<8<:<<3<<:668<86<3 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:69:88:1154 99 chr1 805 99 35M = 992 222 CACGAATGCGTCTCTACCACAGGCGGCTGCGCGGT <<<<<<<<<<<<<<<<<<<<<<<2<<<<:<<<<<7 MF:i:18 Aq:i:47 NM:i:1 UQ:i:17 H0:i:0 H1:i:1
+EAS114_26:1:99:212:522 163 chr1 806 99 35M = 1002 231 ACGAATGCGTCTCTACCACAGGGGGCTGCGCGGTT ================8==;====;=;===1==:8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:35:378:681 147 chr1 812 99 35M = 632 -215 GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT :<5-<);;;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:182:404:693 83 chr1 812 99 35M = 646 -201 GCGTCTCTACCACAGGGGGCTGCGCGGTTTCCCAT <;7;;4<<<<<<<7<<7<<<<<<<<<8<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:119:761:239 99 chr1 813 99 35M = 999 221 CGTCTCTACCACAGGGGGCTGCGCGGTTTCCCATC <<<<<<<<<<<<6<<<<<<;<2<<<<;<<<<<;;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:165:464:123 147 chr1 814 99 35M = 650 -199 GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCA 9;<)<<%<<9<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:40:758:116 83 chr1 814 99 40M = 632 -222 GTCTCTACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG 25/8/:<75:2<<<<<<7<<;<<<<<<<88;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:55:506:125 99 chr1 817 99 35M = 982 200 TCTACCACAGGGGGCTGCGCGGTTTCCCATCATGA <<<<<<<<<;<9<;<<;558<<<<5(5*<<<<<51 MF:i:18 Aq:i:35 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:162:594:858 147 chr1 818 99 35M = 634 -219 CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA 90;<99;==99==;4=:========;=====;=== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:55:74:1040 99 chr1 818 99 35M = 975 192 CTACCACAGGGGGCTGCGCGGTTTCCCATCATGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:100:708:1984 99 chr1 819 99 35M = 1015 231 TACCACAGGGGGCTGCGCGGTTTCCCATCATGAAG <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<7%: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:92:367:1495 163 chr1 820 99 35M = 987 202 ACCACAGGGGGCTGCGCGGTTTCCCATCATGAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<6<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:49:905:27 163 chr1 821 68 35M = 1000 214 CCACAGGGGGCTGCGCGGTTTCCCATCCTGAAGCA <<;<.89<9.<2<9<:91+447.9,04&000(,+( MF:i:18 Aq:i:31 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS218_4:7:87:964:826 163 chr1 822 99 35M = 999 212 CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC <<<<<<<<<<<<<<<<<<<<<<<<<<1<<8;4;;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:38:1576:1923 163 chr1 822 99 35M = 987 200 CACAGGGGGCTGCGCGGTTTCCCATCATGAAGCAC <<<<<<<<<<<<<<<<<<<<<<<<<<;<<:;<<;< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:337:968 99 chr1 823 85 35M = 981 193 ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT <<<<<;<<<<<<<<<<<<<<<<<<<;<<;;<;;;; MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:187:294:947 99 chr1 823 99 35M = 1002 214 ACAGGGGGCTGCGCGGTTTCCCATCATGAAGCACT <<<<<<<<<<<<<<<<:<<<<<&<<%:<)7;7::4 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:49:271:588 83 chr1 830 99 35M = 658 -207 GCTGCGCGGTTTCCCATCATGAAGCACTGAACTTC :0=:===:<===;;===;================= MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:40:594:752 147 chr1 831 99 35M = 651 -215 CTGCGCGGTTTCCCATCATGAAGCACTGAACTTCC ;7;9<;;;<;<;:<<;;<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:163:757:432 99 chr1 837 99 35M = 1013 211 GGTTTCCCATCATGAAGCACTGAACTTCCACGTCT <<<<<<<;<<<<<<<<;<;<<<<<<<<<<<<83:< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:156:857:494 83 chr1 838 99 35M = 648 -225 GTTTCCCATCATGAAGCACTGAACTTCCACGTCTC <<<8<:5<<;<<8<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:84:91:614 163 chr1 839 99 35M = 1019 215 TTTCCCATCATGAAGCACTGATCTTCCACGTCTCA ;4<<<<<-84<<<;<<<<8<7.<4<<;77&:%<:: MF:i:18 Aq:i:39 NM:i:1 UQ:i:13 H0:i:0 H1:i:1
+EAS51_64:7:152:918:824 163 chr1 839 99 35M = 1033 229 TTTCCCATCATGAAGCACTGAACTTCCACGTCTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:67:317:249 147 chr1 840 26 35M = 683 -192 TTCCCATCATGACGCACCGAACTTCCACGTCTCAT .5;7;++;<8.;&:7<<.5<<<<7<<7<<<<<<;7 MF:i:130 Aq:i:26 NM:i:2 UQ:i:18 H0:i:0 H1:i:0
+EAS51_62:7:96:836:737 147 chr1 841 99 35M = 642 -234 TCCCATCATGAAGCACTGAACTTCCACGTCTCATC 1<;<7;;1;8;;8:<<1<;<<;<<<<<<<<<<;<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:130:912:658 83 chr1 841 99 35M = 652 -224 TCCCATCATGAAGCACTGAACTTCCACGTCTCATC ;=;;;<<<<<=55=;==<=======<========= MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:75:934:439 163 chr1 842 99 35M = 1001 194 CCCATCATGAAGCACTGAACTTCCACGTCTCATCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:212:329:348 163 chr1 842 99 35M = 1020 212 CCCATCATGAAGCACTGAACTTCCACGTCTCATCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:49:183:435 163 chr1 843 99 35M = 1005 197 CCATCATGAAGCACTGAACTTCCACGTCTCATCTA <<<<<<<<<<<<<<<<<<<<<<<<<<;;<;:;8;: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:280:133:495 99 chr1 843 99 35M = 1015 207 CCATCATGAAGCACTGAACTTCCACGTCTCATCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:232:351:909 147 chr1 843 80 36M = 685 -194 CCATCATGAAGCGCTGAACTTCCACGTCTCATCTAG :8%3<8====130=8==+===;=3=8===48==;3* MF:i:18 Aq:i:39 NM:i:1 UQ:i:15 H0:i:0 H1:i:1
+EAS221_1:8:77:781:676 163 chr1 846 99 35M = 1010 199 TCATGAAGCACTGAACTTCCACGTATCATCTAGGG <<<<<<<5<<5<<<<<<<<<<<<13<<2<<<<<,< MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS1_95:2:198:691:595 83 chr1 847 99 35M = 655 -227 CATGAAGCACTGAACTTCCACGTCTCATCTAGGGG :=:;=;===========;================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:31:948:254 147 chr1 849 99 35M = 680 -204 TGAAGCACTGAACTTCCACGTCTCATCTAGGGGAA 7;;;98<<7<<<<<<<<<<<<<<<<<<8<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:278:440:902 99 chr1 851 99 35M = 1032 216 AAGCACTGAACTTCCACGTCTCATCTAGGGGAACA =========<==<==============:;;=;=;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:74:674:124 163 chr1 854 99 35M = 1041 222 CACTGAACTTCCACGTCTCATCTAGGGGAACAGGG <<<<<<<<<<<<:<;<<<<;<<<<;9;<<;;.;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:28:781:723 147 chr1 855 99 36M = 676 -215 ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG 8488<::;4;;<:;;;::<;7<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:28:474:566 163 chr1 855 99 36M = 1018 199 ACTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG <<<<<<<<<<<<<<<<<<<<<<<:<;<;;<<7;8;< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:124:241:608 147 chr1 856 99 35M = 670 -221 CTGAACTTCCACGTCTCATCTAGGGGAACAGGGAG 9;;<<;<<<;<<<;<:<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:187:925:547 147 chr1 857 99 35M = 689 -203 TGAACTTCCACGTCTCATCTAGGGGAACAGGGAGG ((988+&8<<;<09<;<<9<<4<<-<99<<;<9<; MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:9:512:826 99 chr1 859 99 35M = 1021 197 AACTTCCACGTCTCATCTAGGGGAACAGGGAGGTG 67<<<;;;<;;<<;;<;<:;9;;;9;;;;<59777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:194:696:490 99 chr1 862 99 35M = 1026 199 TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC <<<<<<<<<<<<<<<<<<<;5<<<<<:<1<8<<<8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:96:788:614 83 chr1 862 99 35M = 667 -230 TTCCACGTCTCATCTAGGGGAACAGGGAGGTGCAC ;9;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:81:786:340 163 chr1 863 99 35M = 1033 205 TCCACGTCTCATCTAGGGGAACAGAGAGGTGCACT <<<<7<<<<<<<<<<<<<<7<<;<&<<;;7<7;;; MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS192_3:7:298:644:697 163 chr1 863 99 35M = 1035 207 TCCACGTCTCATCTAGGGGAACAGGGAGGTGCACT <<<<<<<<<<<<<<<::;;;6<8:;;9;98;668; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:178:305:843 163 chr1 864 99 35M = 1037 208 CCACGTCTCATCTAGGGGAACAGGGAGGTGCACTA <<<<<<<<<<<<<<<<<<<:<<<<<;<<:<<:<;: MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:5:863:302 147 chr1 866 99 35M = 698 -203 ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT :4:29:<<<9;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:30:788:376 99 chr1 866 99 35M = 1038 207 ACGTCTCATCTAGGGGAACAGGGAGGTGCACTAAT <<<<<<<<<<<<:<<<<<<<<:<;<<(<7;7;:(; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:143:310:958 163 chr1 868 99 35M = 1048 215 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC <<<<<<<<<<<8<8<<<<<;;7<<<;6;<<+4;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:3:233:911 83 chr1 868 99 35M = 688 -215 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:75:637:650 83 chr1 868 99 35M = 691 -212 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC <<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:73:513:102 147 chr1 868 99 35M = 698 -205 GTCTCATCTAGGGGAACAGGGAGGTGCACTAATGC ==::===8=>=====>=>=>>>=>>==>=>>>>>> 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 <<<:<<<<</<<<-<<<<6/<-<:<5+<::-2</2 MF:i:18 Aq:i:39 NM:i:2 UQ:i:29 H0:i:0 H1:i:1
+EAS54_81:2:27:856:401 83 chr1 871 99 35M = 679 -227 TCATCTAGGGGAACAGGGAGGTGCACTAATGCGCT .'=.93======;;====;======;===;=;=== MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:45:462:455 83 chr1 874 99 35M = 723 -186 TCTAGGGGAACAGGGAGGTGCACTAATGCGCTCCA 62*<;;;;<<;<<9;;<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:264:988:663 147 chr1 875 99 35M = 688 -222 CGAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC (%<:4<4<<7<<1-:<1766<66<<<<+<:<;8;< MF:i:18 Aq:i:60 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_63:1:145:71:26 163 chr1 875 99 35M = 1040 200 CTAGGGGAACAGGGAGGTGCACTAATGCGCTCCAC <<<<<<<<<<<<<<<<<;<;;<<;<;<9<9;;99; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:101:825:28 163 chr1 879 99 35M = 1079 235 GGGAACAGGGGGGTGCACTAATGCGCTCCACGCCC <<86<<;<78<<<)<;4<67<;<;<74-7;,;8,; MF:i:18 Aq:i:39 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS218_4:5:63:875:1339 83 chr1 879 99 35M = 711 -203 GGGAACAGGGAGGTGCACTAATGCGCTCCACGCCC ;;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:290:270:557 99 chr1 880 99 35M = 1052 207 GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA <<<<<<<<<<<<<;<<<<9<:;<<<<<<5<0<<;+ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:134:853:558 163 chr1 880 99 35M = 1071 226 GGAACAGGGAGGTGCACTAATGCGCTCCACGCCCA ==========================9=9=;<;<5 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:282:567:481 99 chr1 880 88 35M = 1064 219 GGAACAGGGAGGCGCACTAATGCGCTCCACGCCCA <<<<<<<<<<<<3<7<7<<<<;<<0)<<<<<<<<3 MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS114_30:1:154:818:165 163 chr1 881 99 35M = 1041 195 GAACAGGGAGGTGCACTAATGCGCTCCACGCCCAA <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<:7;:; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:301:54:240 163 chr1 882 99 35M = 1061 214 AACAGGGAGGTGCACTAATGCGCTCCACGCCCAAG <<<<:<9<<<<:<<<<9<<<<<<690<<6</<(83 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:12:402:843 163 chr1 885 99 35M = 1072 222 AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:262:965:756 99 chr1 885 99 35M = 1069 219 AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<9;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:30:816:90 163 chr1 885 99 35M = 1057 207 AGGGAGGTGCACTAATGCGCTCCACGCCCCAGCCC <<<<<<<<<<<<<<<<<<<:<<<<<<::1&(1::7 MF:i:18 Aq:i:69 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS188_7:4:171:104:398 163 chr1 885 99 35M = 1066 216 AGGGAGGTGCACTAATGCGCTCCACGCCCAAGCCC =========)===97===3===4===4==,)=/)= MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:163:31:455 83 chr1 886 99 35M = 730 -191 GGGAGGTGCACTAATGCGCTCCACGCCCAAGCCCT 8;<<;<<<78+<=</<<=;23<=<<<<<<<<<<<< MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:149:354:667 147 chr1 888 99 35M = 734 -189 GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC ;<;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:18:571:1110 99 chr1 888 99 35M = 1070 217 GAGGTGCACTAATGCGCTCCACGCCCAAGCCCTTC 7<<<<<<<<<<<<;<<<<<<<<<<<<788<<<;6< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:312:837:406 163 chr1 889 99 35M = 1048 194 AGGTGCACTAATGCGCTCCACGCCCAAGCCCTTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:160:272:398 83 chr1 891 99 35M = 705 -221 GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA 3:,<,;;<<;<<1<<<<<<<;<;<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:228:587:504 99 chr1 891 65 35M = 1050 194 GTGCACTAATGCGCTCCACGCCCAAGCCCTTCTCA <<<<7<<7;7<<3<<<<7<<<<<*3<<<<74<:<* MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:35:361:546 83 chr1 892 99 35M = 731 -196 TGCACTAATGCGCTCCACGCCCAAGCCCTTCTCAC :4;4;;<<;4<8<;;<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:84:438:1505 99 chr1 893 99 40M = 1068 215 GCACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTTC 35<<:;9<;<;5<<<:<3<<7:<9/<)<<:::9<&5;;+1 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:277:482:316 163 chr1 894 99 35M = 1098 239 CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG <<<<<<<<<<<<<<;<;<<<:<;<<<<;<<<1<1; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:86:498:373 83 chr1 894 99 35M = 716 -213 CACTAATGCGCTCCACGCCCAAGCCCTTCTCACAG ):)4:<5<<<<;89<<<969<<<:<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:236:498:526 163 chr1 895 99 35M = 1048 188 ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT =================================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:43:1120:878 99 chr1 895 99 35M = 1075 215 ACTAATGCGCTCCACGCCCAAGCCCTTCTCACAGT <<<<<<<<<<<<<<<<<<<<8<<<<<<<<<<=7;7 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:104:153:698 83 chr1 896 99 36M = 713 -219 CTAATGCGCTCCACGCCCAAGCCCTTCTCACAGTTT 69<<)9<<:5:6<<<16:<6/<6<1<<<<<:<:<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:166:42:147 99 chr1 898 99 35M = 1048 185 AATGCGCTCCACGCCCAAGCCCTTCTAACAGTTTC <<;<<<<<<<<<<<<<<<<;6<<64;)<<7;7;;; MF:i:18 Aq:i:43 NM:i:1 UQ:i:8 H0:i:0 H1:i:1
+B7_595:2:178:77:424 99 chr1 900 99 35M = 1058 193 TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG <<<<<<<<<<<<<<<6<<;<<<<<<<<6<;<<<<6 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:87:734:888 83 chr1 900 99 35M = 717 -218 TGCGCTCCACGCCCAAGCCCTTCTCACAGTTTCTG 56<<86;:<<<4;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:149:650:44 83 chr1 902 99 36M = 726 -212 CGCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC ;8<<</<<:<<595<<9<<<<<<<<<<<<<<3<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:177:552:234 99 chr1 903 99 35M = 1094 226 GCTCCACGCCCAAGCCCTTCTCACAGTTTCTGCCC <<<<<<<<<<<<<;<<<<<<<<9<969<<<<3<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:58:703:72 163 chr1 905 99 35M = 1088 218 TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC 2<7<<<<<<<<<<<8:<<<<8<(<8<:::8.::<3 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:242:4:593 99 chr1 905 99 35M = 1086 216 TCCACGCCCAAGCCCTTCTCACAGTTTCTGCCCCC <<<<<<<<<<<8<<<<-<<<<<88;<;<<8<;88< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:67:620:344 147 chr1 905 99 35M = 755 -185 CCCCCGCCCAAGCCCTTCTCACAGTTTCTGCCCCC +++*+++#++++++,++++++++,,+,&+,,,,+, MF:i:18 Aq:i:33 NM:i:2 UQ:i:19 H0:i:1 H1:i:0
+EAS51_62:7:178:286:414 83 chr1 907 99 35M = 731 -211 CACGCCCAAGCCCTTCTCACAGTTTCTGCCCCCAG 68;38::<<;<<8;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:174:987:334 163 chr1 908 99 35M = 1082 209 ACACCCAAGCCCTTCTCACAGTTTCTGCCCCCAGC <<;4<<<<;;</4<4<+<<<<<;<<<<<</<93+2 MF:i:18 Aq:i:41 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS219_FC30151:1:55:8:1412 163 chr1 910 99 35M = 1072 197 GCCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:8:1351:1986 83 chr1 911 99 35M = 729 -217 CCCAAGCCCTTCTCACAGTTTCTGCCCCCAGCATG <8;<<<<<<<<<<<;<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:37:610:260 83 chr1 913 99 35M = 745 -203 CAAGCCCTTCTCACAGTTTCTGCCCCCAGCATGGT /74<.<4.&<<<:<<<<::<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:228:189:826 99 chr1 914 99 35M = 1112 233 AAGCCCTTCTCACAGTTTCTGCCCCCCGCATGGTT ;9=========;=1======9=====1;=<3=:6; MF:i:18 Aq:i:45 NM:i:1 UQ:i:16 H0:i:0 H1:i:1
+EAS56_59:3:149:953:349 147 chr1 915 99 35M = 777 -173 AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG 2;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:24:1374:211 99 chr1 915 99 35M = 1064 184 AGCCCTTCTCACAGTTTCTGCCCCCAGCATGGTTG ;;:<<;<;:;;;;;;;;;;<::;;;6;;2+74917 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:5:491:391 147 chr1 917 99 35M = 782 -170 CCCTGCTCACAGTTTCTGCCCCCAGCATGGTTGTA -/+5-.&&:5+:92=6===========9======= MF:i:18 Aq:i:62 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS114_32:2:306:119:56 99 chr1 919 99 35M = 1083 199 CTTCTCACAGTTTCTGCCCCCAGCATGGTTGTACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:216:381:608 163 chr1 920 99 35M = 1075 190 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<<<<<<<<<<<;;+<6:<;26; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:73:292:429 147 chr1 920 99 35M = 752 -203 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG ;6;6;<<<<<;<<<<;<<<<<<<<7<<<<<<5<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:2:170:265:818 83 chr1 920 73 35M = 748 -207 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG 3+;%;.;;<<9+;3;;;<<<;57<1<;<<<<<<<; MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:278:906:933 99 chr1 920 99 35M = 1071 186 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<. MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:190:95:706 99 chr1 920 99 35M = 1078 193 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<9<<<<<;;<;<;;<<;<;;<, MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:278:848:765 99 chr1 920 99 35M = 1088 203 TTCTCACAGTTTCTGCCCCCAGCATGGTTGTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:29:249:878 163 chr1 921 99 35M = 1077 191 TCTCACAGTTTCTGCCCCCAGCATGGTTGTACTGG <<<<<<<<<<<<<<<<<<<<<<:<:<<=<<:<<6& MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:259:467:737 163 chr1 923 99 36M = 1102 215 TCACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCA <<<<<<<<<<<<7<<<<<<<'<<.<<<<<<;;;<67 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:24:195:604 163 chr1 923 99 35M = 1098 210 TCACAGTTTCTGCCCCCAGCATGGTTGTACTGTGC <;<<<<<<<<<89<<<<<868<8;6<8;3(38&<8 MF:i:18 Aq:i:65 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_32:4:42:923:169 163 chr1 925 99 35M = 1099 209 ACAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAA 9<<<;9<<<<<;<;<<.<<;<;6<<<<1;8<<-0; MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:29:529:379 163 chr1 926 99 35M = 1117 226 CAGTTTCTGCCCCCAGCATGGTTGTACTGGGCAAT <<<<<<<<8<<<<<<<<<<<<<<<<<;<672;<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:26:785:882 163 chr1 926 99 35M = 1107 216 CAGTTTCTGCCCCAAGCATGGTTGTACTGGGCAAT <<<0<<<<<<<<<6,<<)<<<<<<<&<<0<<,<'< MF:i:18 Aq:i:39 NM:i:1 UQ:i:21 H0:i:0 H1:i:1
+B7_591:7:129:956:115 83 chr1 927 99 36M = 740 -223 AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC <<:<9<4<<<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:82:356:253 147 chr1 927 99 35M = 752 -210 AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA 97;7<<;;<<<<<7;<<:<<<9<<;<<<9<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:134:379:893 99 chr1 927 99 35M = 1095 203 AGTTTCTGCCCCCAGCATGGTTGTACTGGGCAATA <<<<<<<<<<<<<5<<<<;<<<<<;<:5;<<4+<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:256:404:584 99 chr1 928 99 35M = 1096 203 GTTTCTGCCCCCAGCATGGTTGTACTGGGCAATAC <<<<<<<<<<<<<<<<<<<<<7<3;<:;;3:3:</ MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:76:333:905 163 chr1 929 99 35M = 1076 182 TTTCTGCCCCCAGCATGGTTGTACTGGGCAATACA <<<<<7;<;<<6<<6<<7<<7<)&<4+6)0+<;(0 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:11:646:628 99 chr1 930 99 36M = 1106 212 TTCTGCCCCCAGCATGGTTGTACTGGGCAATACATG <<<<<<<<<<6<<<<<<<<<<<<</<;<<<<<<6<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:136:389:320 99 chr1 930 99 35M = 1100 205 TTCTGCCCCCAGCATGGTTGTACTGGGCAATACAT 7<<<<<;<<7<6<<;;<;<;;677<6;(27;<(97 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:6:93:334:858 99 chr1 932 99 35M = 1106 209 CTGCCCCCAGCATGGTTGTACTTGGCAATACATGA <<<<<<<<;<<<<;;<<9<<<<&;&<<9<9;/;&; MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_597:3:46:981:766 83 chr1 933 99 35M = 778 -190 TGCCCCCAGCATGGTTGTACTGGGCAATACATGAG /<<<;/;<<316<<<3<<<<7<<<7<<<;<<<<<7 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:209:159:130 99 chr1 934 99 34M = 1109 210 GCCCCCAGCATGGTTGTACTGGGCAATACATGAG <<<<<<8<<<<<<&<<+7<<4<<<22<;<<<<3< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:111:796:737 99 chr1 936 99 35M = 1112 211 CCCCAGCATGGTTGTACTGGGCAATACATGTGATT <<<<<<<<<<<<<<<:<<;7;<<<<993<4%:%<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS218_1:4:15:856:340 99 chr1 936 99 35M = 1093 192 CCCCAGCATGGTTGCACTGGGCAATACATGAGATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<77<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_610:5:7:761:623 147 chr1 938 99 35M = 757 -216 CCGGCATGGTTGTACTGGGCAATACATGAGATTAT ::';-8);<<<<;<1<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS1_97:5:84:927:843 99 chr1 938 99 35M = 1138 235 CCAGCATGGTTGTACTGGGCAATACATGAGATTAT <<<<<<<<<<<<<;9;;4;<<0<<7<<9<;<:<5< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:273:901:459 99 chr1 938 99 35M = 1098 195 CCAGCATGGTTGTACTGGGCAATACATGAGATTAT <<8<<<;<;8<;<;<;7+8<788<;;22<27;77; MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:256:407:470 83 chr1 939 99 35M = 762 -212 CAGCATGGTTGTACTGGGCAATACATGAGATTATT 7.47;0;;5<4033*<<<<<9,<<<<<;<<<<<3< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:77:251:446 163 chr1 939 99 35M = 1110 206 CAGCATGGTTGTACTGGGCAATACATGAGATTATT <<9<<<<<<<<<<<<<97<<<<<<<<<96<<<+<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:102:467:897 147 chr1 940 97 35M = 756 -219 AGCATGGTTGTACAGGGCAATACATGAGATTATTA 83333<+02<:<.&<+<.<::7<<::<<<<:<<<< MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS221_1:6:92:1807:1185 99 chr1 940 99 35M = 1119 214 AGCATGGTTGTACTGGGCAATACATGAGATTATTA <<<<<<<<<<<<<<<:<<<<<<:<<<<;<<<;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:142:858:903 99 chr1 943 99 35M = 1121 213 ATGGTTGTACTGGGCAATACATGAGATTATTAGGA ======;====5=======9======;===3=5=; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:143:560:194 147 chr1 946 99 35M = 768 -213 GTTGTACTGGGCAATACATGAGATTATTAGGAAAT 9:<;7<:::<:<;<<<<<<<<<<:<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:148:437:481 83 chr1 949 99 36M = 764 -221 GTACTGGGCAATACATGAGATTATTAGGAAATGCTT <<<;<<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:75:917:886 163 chr1 951 99 35M = 1110 194 ACTGGGCAATACATGAGATTATTAGGAAATGCTTT <<<<<<<<<<<<<<:<<<<<<<<<71<<<:6<:8< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:118:851:285 163 chr1 953 99 35M = 1133 215 TGGGCAATACATGAGATTATTAGGAAATGCTTTAC <<<<<<<<<<<<<<<<<<<<<<<;;<;<:<<<<;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:179:389:585 83 chr1 953 24 35M = 770 -218 TGTGAAATGAATGAGATTATTAGGAAATGCTTTAC ;<)<;*;9*+<;<<,,<,<4<4<<<<<;<4<9494 MF:i:18 Aq:i:24 NM:i:4 UQ:i:53 H0:i:0 H1:i:0
+EAS114_30:7:269:944:220 163 chr1 953 99 35M = 1147 229 TGGGCAATACATGAGATTATTAGGAAATGCTTTAC <<<<<<<8<<<<<<<<<<<<<<<;<<<<<;<<;81 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:3:93:1002:845 163 chr1 954 99 35M = 1129 210 GGGCAATACATGAGATTATTAGGAAATGCTTTACT <<<<<<<<<<<<<<<<<<<<<:<<;<<<;<<<</< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:66:584:407 83 chr1 954 99 35M = 785 -204 GGGCAATACATGAGATTATTAGGAAATGCTTTACT <<84<<<766<<<.6<<<<<<4<<7<<<<<<<7<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:63:48:631 163 chr1 957 99 35M = 1143 221 CAATACATGAGATTATTAGGAAATGCTTTACTGTC <<<<<<;<<7</<<<<<<;;;<<<;<;<<7;;);< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:187:791:153 147 chr1 958 99 35M = 803 -190 AATACATGAGATTATTAGGAAATGCTTTACTGTCA :;55&<99<<1<;<<8<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:72:1809:1398 99 chr1 958 99 35M = 1145 222 AATACATGAGATTATTAGGAAATGCTTTACTGTCA <<<<<<<<<<<<<<<<<<::<9<<<<<<<<<6<<: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:66:257:524 147 chr1 959 99 35M = 791 -203 ATACATGAGATTATTAGGAAATGCTTTACTGTCAT <;<<<<<<<<3<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:247:522:670 163 chr1 960 99 35M = 1121 196 TACATGAGATTATTAGGAAATGCTTTACTGTCATA <<<<<<<<<<<<<<<;<<<<<<<<<<<<<5;<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:37:400:627 163 chr1 961 99 35M = 1154 228 ACATGAGATTATTAGGAAATGCTTTACTGTCATAA <<<<<<7+<<<<<<2615<<6<<<<5<<1<<;:74 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:329:177:267 163 chr1 962 99 35M = 1139 212 CATGAGATTATTAGGAAATGCTTTACTGTCATAAC <<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<9; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:166:203:416 163 chr1 963 99 35M = 1136 208 ATGAGATTATTAGGAAATGCTTTACTGTCATAACT <<<<<<<<<<<<<<<<<<;<<<<<<<;<<<<<97< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:14:360:580 147 chr1 963 99 35M = 799 -199 ATGAGATTATTAGGAAATGCTTTACTGTCATAACT <,1<;<;;<<<<<1<<<;<7<<6<:;;<<<<<<;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:193:38:987 163 chr1 964 99 35M = 1158 229 TGAGATTATTAGGAAATGCTTTACTGTCATAACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<:;:;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:39:59:738 163 chr1 965 99 35M = 1142 212 GAGATTATTAGGAAATGCTTTACTGTCATAATTAT 3<8.<<<<<<<-<<<<3<388;;880<0<0)-722 MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS51_66:4:209:92:210 163 chr1 965 99 35M = 1156 226 GAGATTATTAGGAAATGCTTTACTGTCATAACTAT <<<<<<<<<<<<<<<<;<<<<<<<5<7<<;;;<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:86:308:648 99 chr1 970 99 35M = 1161 226 TATTAGGAAATGCTTTACTGTCATAACTATGAAGA =8=====;=8======;=======35==;=;.;25 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:206:563:262 163 chr1 971 99 35M = 1137 201 ATTAGGAAATGCTTTACTGTCATAACTATGAAGAG <<<<<<<<<;<<<<<<<<<<<<;<<<<<<<-;<4; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:82:822:767 99 chr1 972 99 35M = 1165 228 TTAGGAAATGCTTTACTGTCATAACTATGAAGAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<.<<.<,< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:207:926:427 163 chr1 973 99 35M = 1159 221 TAGGAAATGCTTTACTGTCATAACTATGAAGAGAC <<<<<<7<<<<<;<<<<<6:<;<6<&<58<<6::: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:144:28:475 99 chr1 974 99 35M = 1167 228 AGGAAATGCTTTACTGTCATAACTATGAAGAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<::8< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:55:74:1040 147 chr1 975 99 35M = 818 -192 GGAAATGCTTTACTGTCATAACTATGAAGAGACTA ;;;;;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:274:176:479 99 chr1 976 99 35M = 1144 203 GAAATGCTTTACTGTCATAACTATGAAGAGACTAT <<<<<<<<<<<<<;<<<<<<<<<<;<<9<59<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:122:337:968 147 chr1 981 10 35M = 823 -193 GCTTTACTGTCTAAACTATGAAGAGACTATTGCCA %454<75!7<+!990<9<6<<<<6<</<<<<<<<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:24 H0:i:0 H1:i:0
+EAS114_28:7:157:786:424 99 chr1 981 99 36M = 1171 226 GCTTTACTGTCATAACTATGAAGAGACTATTGCCAG <<<<<<<<<<<<<;<<<<<<;<<;<<;<<<<+4:70 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:63:527:1923 147 chr1 981 99 35M = 803 -213 GCTTTACTGTCATAACCATGAAGAGACTATTGCCA 9<<<8<-8;;8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:7:55:506:125 147 chr1 982 99 35M = 817 -200 CTTTACTGTCATAACTATGAAGAGACTACTGCCAG 118%67;1;8,4:187<4>::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 <<<<<<<<<<<<</<<,6<66<<<;<;;<*4744. MF:i:18 Aq:i:41 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS218_4:7:87:964:826 83 chr1 999 99 35M = 822 -212 TGAAGAGACTATTGCCAGATGAACCACACATTAAT )6<<<<<<:;<6<<::<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:49:905:27 83 chr1 1000 68 35M = 821 -214 GAAGAGACTATTGCCAGTTGAACCACACATTAATA 99515<<&<<6595-56%;86&<;<<<6<<<<6;< MF:i:18 Aq:i:31 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS1_108:3:75:934:439 83 chr1 1001 99 35M = 842 -194 AAGAGACTATTGCCAGATGAACCACACATTAATAC ==7=:=========================<==== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:99:212:522 83 chr1 1002 99 35M = 806 -231 AGAGACTATTGCCAGATGAACCACACATTAATACT <1<16<7<3<<;;<8<<<<<<<<<<<<;<<<<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:187:294:947 147 chr1 1002 99 35M = 823 -214 AGAGACTATTGCCAGATGAACCACACATTAATACT <<:<<8181;<8<<<<<<<<8<<<<<<<<<<<<<: MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:2:152:860:286 163 chr1 1004 99 35M = 1171 202 AGACTATTGCCAGATGAACCACACATTAATACTAT <;<<<;<<0:<3<:<<2<<<<<7+<7+47<9(999 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:49:183:435 83 chr1 1005 99 35M = 843 -197 GACTATTGCCAGATGAACCACACATTAATACTATG 1<7<<<<;:<<<<<;<<<;<<<;<;<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:63:854:610 163 chr1 1005 99 35M = 1180 210 GACTATTGCCAGATGAACCACACATTAATACTATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:12:276:1797 99 chr1 1006 99 35M = 1190 219 ACTATTGCCAGATGAACCACACATTAATACTATGT <<<<<<<<<<<<:</<<9<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:190:42:671 163 chr1 1008 99 36M = 1192 220 TATTGCCAGATGAACCACACATTAATACTATGTTTC <<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:67:692:110 99 chr1 1009 99 35M = 1175 201 ATTGCCAGATGAACCACACATTAATACTATGTTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:61:183:767 99 chr1 1010 99 35M = 1195 220 TTGCCAGATGAACCACACCTTAATACTATGTTTCT <<<<<<<<<<;<<<9<9<+<<<8<<<<<<;8<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS221_1:8:77:781:676 83 chr1 1010 99 35M = 846 -199 TTGCCAGATGAACCACACATTAATACTATGTTTCT :<;<2<<<<<<26<<<<6<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:21:132:1423 99 chr1 1012 99 35M = 1178 201 GCCAGATGAACCACACATTAATACTATGTTTCTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:163:757:432 147 chr1 1013 99 35M = 837 -211 CCAGATGAACCACACATTAATACTATGTTTCTCAT 1+<8<<<<<<;<5<;<<<<<;5<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_30:3:302:288:657 99 chr1 1013 99 35M = 1173 195 CCAGATGAACCACACATTAATACTATGTTTCTTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:97:1584:777 99 chr1 1013 99 35M = 1200 222 CCAGATGAACCACACATTAATACTATGTTTCTTAT <<;<;;;;<;<;<<;;;;;;;;;;;;;;:;79979 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:280:133:495 147 chr1 1015 99 35M = 843 -207 AGATGAACCACACATTAATACTATGTTTCTTATCT <:<9:<<7:<6<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:100:708:1984 147 chr1 1015 99 35M = 819 -231 AGATGAACCACACATTAATACTATGTTTCTTATCT :8<(8<)9<;<<<<+<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:182:313:319 99 chr1 1016 99 35M = 1180 199 GATGAACCACACATTAATACTATGTTTCTTATCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<<;<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:41:474:283 99 chr1 1018 99 35M = 1182 199 TGAACCACACATTAATACTATGTTTCTTATCTGCA <<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<+<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:28:474:566 83 chr1 1018 99 36M = 855 -199 TGAACCACACATTAATACTATGTTTCTTATCTGCAC ;<<<+<<<<5<<<<<<;;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:84:91:614 83 chr1 1019 99 35M = 839 -215 GAACCACACATTAATACTATGTTTCTTATCTGCAC <<;;<<<7<<<<<<<;<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:159:222:274 99 chr1 1019 99 35M = 1189 205 GAACCACACATTAATACTATGTTTCTTATCTGCAC =;9====;=9==59=+==9========9===5;7= MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:62:603:1552 163 chr1 1019 99 35M = 1180 196 GAACCACACATTAATACTATGTTTCTTATCTGCAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:212:329:348 83 chr1 1020 99 34M = 842 -212 AACCACACATTAATACTATGTTTCTTATCTGCAC 8<6:<:<<<;<<<;<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:233:97:262 99 chr1 1021 99 34M = 1175 189 ACCACACATTAATACTATGTTTCTTATCTGCCCA <<<<<<<<<<<;<;<<:<<<<<<<<<<<<.<&77 MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_45:7:9:512:826 147 chr1 1021 99 35M = 859 -197 ACCACACATTAATACTATGTTTCTTATCTGCACAT 76777:;;;;;;;;;;;;;;;;;;;;;;;;;:;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:29:794:282 163 chr1 1025 99 36M = 1196 207 CACATTAATACTATGTTTCTTATCTGCACATTACTA <<<<<<<<<<<<<<<<<<<<<;<<<&<<;:<<8<<8 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:278:524:521 163 chr1 1025 99 35M = 1224 234 CACATTAATACTATGTTTCTTATCTGCACATTACT <<<;<<;<<<<<<<;<<<<<<<<<<7;5;<<<;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:39:966:551 99 chr1 1026 99 35M = 1205 214 ACATTAATACTATGTTTCTTATCTGCACATTACTA <<<<<<<<<<<<<<<<<<<<<<<<:<;<&<<&<<; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:194:696:490 147 chr1 1026 99 35M = 862 -199 ACATTAATACTATGTTTCTTATCTGCACATTACTA ========;======;==========8==:===== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:305:565:952 99 chr1 1030 99 36M = 1213 219 TAATACTATGTTTCTTATCTGCACATTACTACCCTG 7<<<<<<<<<7<<<<<<<<<7<<<;;<;<;<<<<<+ MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:287:258:321 99 chr1 1030 99 35M = 1194 199 TAATACTATGTTTCTTATCTGCACATTACTACCCT <<<<<<<<<<<;<<<<<<<<42:<+<<<;<<;;;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:278:440:902 147 chr1 1032 99 35M = 851 -216 ATACTATGTTTCTTATCTGCACATTACTACCCTGC <;7;4<;<;;;<<;<;;;<<<<<9<<<;<<<<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:180:905:36 99 chr1 1033 99 35M = 1212 214 TACTATGTTTCTTATCTGCACATTACTACCCTGCA ==========8===;;=========;==77%41=; MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:152:918:824 83 chr1 1033 99 35M = 839 -229 TACTATGTTTCTTATCTGCACATTACTACCCTGCA ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:81:786:340 83 chr1 1033 99 35M = 863 -205 TACTATGTTTCTTATCTGCACATTACTACCCTGCA ;<;<<<;<<;<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:196:11:27 163 chr1 1035 65 36M = 1198 199 CTATGTTTCTTATCTGCNCATTACTACCCTGCAATT <<<<<<<<;<<<<<<<8!4<<<;+<88;8<+2,8<; MF:i:18 Aq:i:24 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS192_3:7:298:644:697 83 chr1 1035 99 35M = 863 -207 CTATGTTTCTTATCTGCACATTACTACCCTGCAAT 8:<8;<;:7;<<;4;:+<7<<<<;<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:812:345 83 chr1 1036 99 36M = 871 -201 TATGTTTCTTATCTGCACATTACTACCCTGCAATTA ;<;<<<<5<<<:<;<:<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:1:178:305:843 83 chr1 1037 99 35M = 864 -208 ATGTTTCTTATCTGCACATTACTACCCTGCAATTA <<<<<<<4<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:30:788:376 147 chr1 1038 99 35M = 866 -207 TGTTTCTTATCTGCACATTACTACCCTGCAATTAA :5<<4:88;9<<<<<;<<<<;<8<;<<<<1<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:1:145:71:26 83 chr1 1040 99 35M = 875 -200 TTTCTTATCTGCACATTACTACCCTGCAATTAATA 882;8;<;;887<<<;;<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:157:42:763 163 chr1 1040 99 35M = 1203 198 TTTCTTATCTGCACATTACTACCCTGCAATTATTA <<;<;<<<<<;<:4<<<<<<<<<;;4<<<:;;+;+ MF:i:18 Aq:i:61 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+B7_589:8:74:674:124 83 chr1 1041 99 35M = 854 -222 TTCTTATCTGCACATTACTACCCTGCAATTAATAT ;;;;;<<:<<:<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:154:818:165 83 chr1 1041 99 35M = 881 -195 TTCTTATCTGCACATTACTACCCTGCAATTAATAT ;;;;<<<;<;;<;<<<<;<<;;;<<;<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:319:174:811 99 chr1 1044 99 35M = 1242 233 TTATCTGCACATTTCTACCCTGCAATTAATATAAT <<<<<<<<<;<<<<<<<<<;;<<<<<<<8<<;9<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_19:3:87:133:930 163 chr1 1044 99 40M = 1198 194 TTATCTGCACATTACTACCCTGCAATTAATATAATTGTGT <<<7<<<<;<<;7<<7<<;;<<<;<5;<;;;5;;<:/48: MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:44:1466:425 163 chr1 1044 99 35M = 1213 204 TTATCTGCACATTACTACCCTGCAATTAATATAAT <<<<<<<<<<<<<<<<<<<<<;<<<<<<;<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:236:498:526 83 chr1 1048 99 35M = 895 -188 CAGCACATTACTACCCTGCAATTAATATAATTGTG <%88<;<:8<<<<:<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_64:3:143:310:958 83 chr1 1048 99 35M = 868 -215 CTGCACATTACTACCCTGCAATTAATATAATTGTG 84<;<6<<<<;<<<;;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:312:837:406 83 chr1 1048 99 35M = 889 -194 CTGCACATTACTACCCTGCAATTAATATAATTGTG ;<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:166:42:147 147 chr1 1048 99 35M = 898 -185 CTGCACATTACTACCCTGCAATTAATATAATTGTG 3.7;;;;:<<<77<<3<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:279:763:945 99 chr1 1048 99 36M = 1210 198 CTGCACATTACTACCCTGCAATTAATATAATTGTGT <<<<<<<<<<<<<<<<<<<4:<<47<:<;<<</<9< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:82:998:566 163 chr1 1050 99 35M = 1227 212 GCACATTACTACCCTGCAATTAATATAATTGTGTC <<<<<<<:<<0<<<<:<82<<::<4<<;<<4<4<; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:228:587:504 147 chr1 1050 65 35M = 891 -194 GCACATTACGACCCGGCAAGGTGTATAATTGTGTC ;4;4;&&82&04+&&48;3&3&*<7<47<<;-<-8 MF:i:130 Aq:i:65 NM:i:6 UQ:i:47 H0:i:0 H1:i:0
+B7_595:6:290:270:557 147 chr1 1052 99 35M = 880 -207 ACATTACTACCCTGCAATTAATATAATTGTGTCCA 87:9;;;<851+:5.<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:134:243:630 83 chr1 1052 99 35M = 871 -216 ACATTACTACCCTGCAATTAATATAATTGTGTCCA 63<;37:<*&:<<<,,*<<:7<<7<<<<<<<::<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:47:303:887 163 chr1 1052 96 35M = 1240 223 ACATTACTACCCTGCCATTAATATACTTGTGTCCA <<;;<+<9<<<<<9<(6<;//</<8(<<89;6084 MF:i:18 Aq:i:25 NM:i:2 UQ:i:14 H0:i:0 H1:i:0
+EAS221_3:8:74:770:1712 163 chr1 1052 99 35M = 1208 191 ACATTACTACCCTGCAATTAATATAATTGTGTCCA <<<<<<<<<<<<<<<<<<<5<<<<<<<<<<<<7<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:29:575:453 163 chr1 1056 99 36M = 1228 208 TACTACCCTGCAATTAATATAATTGTGTCCATTTAC <<<<<<<<<<<<<<<<<<<<<<<<7<1<:<9<&<98 MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_97:5:318:177:383 163 chr1 1056 99 35M = 1251 230 TACTACCCTGCAATTAATATAATTGTGTCCATGTA ;<<<<<<<<;<<<<<<<<<<<<<<<<<<7<;1'<; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:179:549:753 99 chr1 1056 99 35M = 1218 197 TACTACCCTGCAATTAATATAATTGTGTCCATGTA <<<<<<<<<<<<<<<<<<<<<<<<8<7<<<:<9<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:30:816:90 83 chr1 1057 99 35M = 885 -207 ACTACCCTGCAATTAATATAATTGTGTCCATGTAC :<3:%9299<<<<<<<<<5<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:178:77:424 147 chr1 1058 99 35M = 900 -193 CTACCCTGCAATTAATATAATTGTGTCCATGTACA :5:8<;<;:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:301:54:240 83 chr1 1061 99 35M = 882 -214 CCCTGCAATTAATATAATTGTGTCCATGTACACAC &..*3===1=========5.5==5===4====:5= MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:91:521:517 99 chr1 1061 99 35M = 1239 213 CCCTGCAATTAATATAATTGTGTCCATGTACACAC <<<<<<<<<<<<<<<<9<<<<<<<<<<8<<;;;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:24:1374:211 147 chr1 1064 99 35M = 915 -184 TGCAATTAATATAATTGTGTCCATGTACACACGCT 77661;;;5;;:;;:;:;;;;;;8:;;;:;;;;;: MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:282:567:481 147 chr1 1064 88 35M = 880 -219 TGCAATTAATATAATTGTGTCCACGTACACACGCT <9<6<;<9<<<;<<<;<5<7<5</7<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS188_7:4:171:104:398 83 chr1 1066 99 35M = 885 -216 CAATTAATATAATTGTGTCCATGTACACACGCTGT 79<+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:9:80:353 163 chr1 1067 99 35M = 1233 201 AATTAATATAATTGTGTCCATGTACACACGCTGTC <<<<<<<<<<<<<<<<<<<<<6<<<;;<<5<<2;2 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:42:920:522 163 chr1 1067 99 35M = 1244 212 AATTAATATAATTGTGTCCATGTACACACGCTGTT <<<<<<<<<<<<<:<<<<<<<:<<<<<<<:;;::& MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_95:3:308:956:873 147 chr1 1068 99 35M = 870 -233 ATAAAAATAAGTGTGTCCATGTACACACGCTGTCC 91.97&9499&-1*98*19999839999.9&9799 MF:i:18 Aq:i:31 NM:i:3 UQ:i:23 H0:i:0 H1:i:1
+EAS139_19:6:84:438:1505 147 chr1 1068 99 40M = 893 -215 ATTAATATAATTGTGTCCATGTACACACTCTGTCCTATGT :0::413::;:::0:179::3<;<:<9<&6<<<;<019<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS51_62:3:55:340:837 163 chr1 1069 99 35M = 1238 204 TTAATATAATTGTGTCCATGTACACACGCTGTCCT <<;<<;<<<<<8<;<<<;<7<<<;<<<<<93+79( MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:262:965:756 147 chr1 1069 99 35M = 885 -219 TTAATATAATTGTGTCCATGTACACACGCTGTCCT <<:<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:18:571:1110 147 chr1 1070 99 35M = 888 -217 TAATATAATTGTGTCCATGTACACACGCTGTCCTA 9<<;<;==;;=;=<;<=================== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:40:918:950 163 chr1 1071 99 35M = 1247 211 AATATAATTGTGTCCATGTACACACGCTTTCCTTT =========,=9=====2=7===7=0==&=+3=-= MF:i:18 Aq:i:65 NM:i:2 UQ:i:17 H0:i:1 H1:i:0
+EAS1_97:2:59:882:980 163 chr1 1071 99 35M = 1263 227 AATATAATTGTGTCCATGTACACACGCTGTCCTAT <<<<<<<<<8<<<<<9<+<<<9<<<1<<77889+6 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:134:853:558 83 chr1 1071 99 35M = 880 -226 AATATAATTGTGTCCATGTACACACGCTGTCCTAT <<<<8<<<7<<<<;;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:278:906:933 147 chr1 1071 99 35M = 920 -186 AATATAATTGTGTCCATGTACACACGCTGTCCTAT <88::<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:12:402:843 83 chr1 1072 99 35M = 885 -222 ATATAATTGTGTCCATGTACACACGCTGTCCTATG <7<+<<11<9<<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:160:434:853 163 chr1 1072 99 35M = 1259 222 ATATAATTGTGTCCATGTACACACGCTGTCCTATG <<<<<<<<<<<<<<<<<<<<<<,<<<<:<<<<,<: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:55:8:1412 83 chr1 1072 99 35M = 910 -197 ATATAATTGTGTCCATGTACACACGCTGTCCTATG <<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:219:294:861 163 chr1 1073 99 35M = 1244 206 TATAATTGTGTCCATGTACACACGCTGTCCTCTGT <<<<<<<<<<<<<9<<<5<9<<<9<<544<<'<+: MF:i:18 Aq:i:69 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS220_1:4:14:1665:1772 163 chr1 1073 84 35M = 1263 225 TATAATGGTGTCCATGTACACACGCTGTCCTATGT <<<<<7*<<<<<<<<<78<5<<7<<5<556<(73( MF:i:18 Aq:i:39 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+B7_591:3:45:294:380 163 chr1 1074 80 36M = 1233 195 ATAATTGTGTCCATGTACACACGATGTCATATGTAC <<<<<<<<9<<<<<<<<<70<<7<6272&:3<+</% MF:i:18 Aq:i:39 NM:i:2 UQ:i:32 H0:i:0 H1:i:1
+EAS1_108:7:222:538:267 99 chr1 1074 99 35M = 1228 189 ATAATTGTGTCCATGTACACACGCTGTCCTATTTA <<<<<<<<<<<<<<<<<<<<<;<<<<74;;39%6+ MF:i:18 Aq:i:67 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_93:1:216:381:608 83 chr1 1075 99 35M = 920 -190 TAATTGTGTCCATGTACACTCGCTGTCCTATGTAC 55<99<<<99;<;<<(<39&7<<<<<<<<<<<<<9 MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS54_67:1:138:186:274 99 chr1 1075 99 35M = 1231 191 TAATTGTGTCCATGTACACACGCTGTCCTATGTAC =39====9===;=;=;=9=;=====;===-=+=-7 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:43:1120:878 147 chr1 1075 99 35M = 895 -215 TAATTGTGTCCATGTACACACGCTGTCCTATGTAC <<<;<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:166:776:590 163 chr1 1075 99 35M = 1252 212 TAATTGTGTCCATGTACACACGCTGTCCTATGTAC <<<<<</<<<<<<<<<<<<<'<=<:26.</79<:: MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:76:333:905 83 chr1 1076 99 35M = 929 -182 AATTGTGTCCATGTACACACGCTGTCCTATGTACT <<;<<<<;7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:29:249:878 83 chr1 1077 99 35M = 921 -191 ATTGTGTCCATGTACACACGCTGTCCTATGTACTT <,;<9<;<:<<<<<<<<<<<<<<<<<<<<<<><<< 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<<<+:<</<<8<<<:7:<<<<<<<< MF:i:18 Aq:i:60 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_30:4:317:378:535 163 chr1 1096 99 35M = 1258 197 GCTGTCCTATGTACTTATCATGACTCTATCCCAAA <<<<<<<<<<<<:<<<<<<<<<;<<;<8<;:7:1( MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:277:482:316 83 chr1 1098 99 35M = 894 -239 TGTCCTATGTACTTATCATGACTCTATCCCAAATT 9998;<<<<<;;<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:273:901:459 147 chr1 1098 99 35M = 938 -195 TGTCCTATGTACTTATCATGACTCTATCCCAAATT 4;+/+7,;<8+&<;;82;;<8<8<2<;<<<<<<<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:316:25:230 163 chr1 1098 99 35M = 1273 210 TGTCCTATGTACTTATCATGACTCTATCCCAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<);2;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:24:195:604 83 chr1 1098 99 35M = 923 -210 TGTCCTATGTACTTATCATGACTCTATCCCAAATT ;6<02;<<<<59<<;<;<<<<9<3<<<<<<<<<;< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:42:923:169 83 chr1 1099 99 35M = 925 -209 TTCCTATGTACTTATCATGAATCTATCCCAAATTC &;972<;&<9<,;;;<<<;<&99<<;<;;3<<3<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:10 H0:i:0 H1:i:1
+EAS114_45:6:59:1548:1096 163 chr1 1099 99 35M = 1297 233 GTCCTATGTACTTATCATGACTCTATCCCAAATTC ;.;;;;;;;;6;;;;;;;;;;;;;;;73;;77777 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:136:389:320 147 chr1 1100 99 35M = 930 -205 TCCTATGTACTTATCATGACTCTATCCCAAATTCC .5:,666<)<8<:<<:66<<<<<<<<<<5<<7<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:122:342:296 99 chr1 1100 99 35M = 1256 191 TCCTATGTACTTATCATGACTCTATCCCAAATTCC <<<<<<<<<<<<<<<<<<<<<<<<<;<<*<<<<9< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:259:467:737 83 chr1 1102 99 36M = 923 -215 CTATGTACTTATCATGACTCTATCCCAAATTCCCAA 8<<<<<<<:<<<<<<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:71:832:743 163 chr1 1102 99 35M = 1290 223 CTATGTACTTATCATGACTCTATCCCAAATTCCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<*<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:105:521:563 163 chr1 1103 72 35M = 1267 199 TATGTACTTATCATGACTCTATCCCAAATTCCCAA ;<)<9995<9<<59<7<<<<7<7<35,0,544<3( MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:201:195:757 163 chr1 1103 99 35M = 1298 230 TATGTACTTATCATGACTCTATCCCAAATTCCCAA <<<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;;8 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:6:585:132 163 chr1 1105 23 36M = 1276 207 TGTACTTATCATGTTTCTTTCCTAATTTTTCAATTA 6666166&6)+61))646+6&)&%&-44))1'144' MF:i:130 Aq:i:23 NM:i:7 UQ:i:59 H0:i:0 H1:i:0
+EAS1_105:2:179:532:82 99 chr1 1105 99 35M = 1285 215 TGTACTTATCATGACTCTATCCCAAATTCCCAATT <<<<<<<<<<<<<<<<<<<<3<;<;<<<<:<8<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:11:646:628 147 chr1 1106 99 36M = 930 -212 GTACTTATCATGACTCTATCCCAAATTCCCAATTAC <<<3<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<6< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:6:93:334:858 147 chr1 1106 99 35M = 932 -209 GTACTTATCATGACTCTATCCCAAATTCCCAATTA ;<;+;;<<;<<<<<;<<<<;;8<<<<8<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:26:785:882 83 chr1 1107 99 35M = 926 -216 TACTTATCATGACTCTATCCCAAATTCCCAATTAC <<&5&<<<<5.;5<'<<;.76<<<<<7<7<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:4:54:989:654 99 chr1 1108 99 35M = 1296 223 ACTTATCATGACTCTATCCCAAATTCCCAATTACG <<<<<<<<<<<<<<<9<<<<<<9<<<<<1<<<88; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:202:326:680 163 chr1 1108 78 35M = 1268 195 ACTTATCATGACTCTATCCCAAATTCTCAATTACG <<<<<<<4<<<*<<<*<<<7..:7<3*:7.7<+.; MF:i:18 Aq:i:37 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+B7_597:3:53:616:842 163 chr1 1109 99 35M = 1288 214 CTTATCATGACTCTATCCCAAATTCCCACTTACGT <<<<<<<<<<<<<<<<<<<;07<<<<<-&<<-<4; MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_71:4:209:159:130 147 chr1 1109 99 35M = 934 -210 CTTATCATGACTCTATCCCAAATTCCCAATTACGT ;:6<:<8::;<<<;<-<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:75:917:886 83 chr1 1110 99 35M = 951 -194 TTATCATGACTCTATCCCAAATTCCCAATTACGTC <<<<8<<<<<<8<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:286:753:854 163 chr1 1110 99 35M = 1288 213 TTATCATGACTCTATCCCAAATTCCCAATTACGTC <<<<<<<<<<<<<<<<<<3<<<<<<9999<;<<9; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:290:146:36 99 chr1 1110 99 35M = 1280 205 TTATCATGACTCTATCCCAAATTCCCAATTACGTC <<<<<<<<<<<<<<<<<<<<<<<8<<<<<;;<;;< MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:93:1475:542 163 chr1 1110 99 35M = 1254 179 TTATCATGACTCTATCCCAAATTCCCAATTACGTC ;;;;;;;;;;;;;;;;;;;;;;9;;;9;;;77777 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:77:251:446 83 chr1 1110 99 35M = 939 -206 TTATCATGACTCTATCCCAAATGCCCAATTACGTC <<24,:8<<<:1<<<:35<:<:,<<<<<<:5:<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+EAS1_105:3:176:431:647 163 chr1 1112 99 35M = 1285 208 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT <<<<<<<<<<<<<<<<2<<<<<<<<6<<<<9<<6< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:111:796:737 147 chr1 1112 99 35M = 936 -211 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT <3<<<<<<<<<<<7<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:228:189:826 147 chr1 1112 99 35M = 914 -233 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT :74=:.==1========================== MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:35:631:594 163 chr1 1112 99 35M = 1271 194 ATCATGACTCTATCCCAAATTCCCAATTACGTCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:29:529:379 83 chr1 1117 99 35M = 926 -226 GACTCTATCCCAAATTCCCAATTACGTCCTATCTT ;<<<:<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:74:596:137 99 chr1 1119 91 35M = 1294 210 CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT <<<<<<<<<</4<<<<<<*<:6<<<<<<<<;/3<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:92:1807:1185 147 chr1 1119 99 35M = 940 -214 CTCTATCCCAAATTCCCAATTACGTCCTATCTTCT <<<<<<9<<<<<<<<<<<<<<<<<<<<<<><<<<< 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 </:8<8)<<<<:<<<<<;.89<:67<.;<<7+336 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:124:128:489 99 chr1 1142 99 35M = 1348 241 GTCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGT <<<<<<<<<<<<<<<<<6:6<<-4<::;;<<:48< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:39:59:738 83 chr1 1142 99 35M = 965 -212 GTCCTATGTTCTTCTTAGGGAAGAACAGCTTAGGT ;.;4;<;3<<9<<9<&<<9<<<<<;<9<;<<;9<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS1_99:6:63:48:631 83 chr1 1143 99 35M = 957 -221 TCCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTA ;*:;;<2<<2779;:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:274:176:479 147 chr1 1144 99 35M = 976 -203 CCTATCTTCTTCTTAGGGAAGAACAGCTTAGGTAT 7)<<7<626<<7<<<<<<<<<<<<<<<<<<<3<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:72:1809:1398 147 chr1 1145 99 35M = 958 -222 CTATCTTCTTCTTAGGGAAGAACAGCTTAGGTATC ;:;;:<7: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 83 chr1 1146 99 35M = 983 -198 TATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCA <<;<<<<<<9<9<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:269:944:220 83 chr1 1147 99 35M = 953 -229 ATCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAA <;<;8<<;7<<<<<;<<-<<<<<<;<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:174:597:66 163 chr1 1148 99 35M = 1307 194 TCTTCTTCTTAGGGAAGAACAGCTTAGGTATCAAT <<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;6;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:229:717:121 147 chr1 1150 99 35M = 995 -190 TTCTTCTGAGGGAAGAACAGCTTAGGTATCAATTT 6;-;7<<(<<<<<8<18<7<<<<<<<<<;<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:7 H0:i:0 H1:i:1
+EAS56_53:1:23:403:981 147 chr1 1151 99 35M = 985 -201 TCTTCATAGGGAAGAACAGCTTAGGTATCAATTTG (;3+<&3<</7<<<<<<;<<<<<<<<<<<<</<2< MF:i:18 Aq:i:65 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS112_32:7:168:117:441 147 chr1 1151 99 35M = 990 -196 TCTTCTTAGGGAAGAACAGCTTAGGTATCAATTTG ;;;;3;<<<<<<<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:52:1455:1212 99 chr1 1153 99 40M = 1304 191 TTCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTCT <9<<<99<;<<9<;<-<<<6<<75;;<*%<5<3+.8:*5; MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:37:400:627 83 chr1 1154 99 35M = 961 -228 TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTG 474*;<<9<;<<<;<<:<<<<<<;<<<<<<;<<;< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:11:868:62 147 chr1 1154 99 36M = 983 -207 TCTTAGGGAAGAACAGCTTAGGTATCAATTTGGTGT ;;77;;7<<<<<<<<7<<<;<7<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:209:92:210 83 chr1 1156 99 35M = 965 -226 TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT ;9;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:128:394:455 163 chr1 1156 99 35M = 1313 192 TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT ======6==========;===9==;5===;==;== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:316:949:122 99 chr1 1156 99 35M = 1321 200 TTAGGGAAGAACAGCTTAGGTATCAATTTGGTGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<0<:<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:60:1020:1259 147 chr1 1157 99 35M = 996 -196 TAGGGAAGAACAGCTTAGGTATCAATTTGGTGTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:193:38:987 83 chr1 1158 99 35M = 964 -229 AGGGAAGAACAGCTTAGGTATCAATTTTGTGTTCT <<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_93:5:292:122:666 147 chr1 1159 99 35M = 985 -209 GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG <;<;;<<<<<:<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:280:512:316 83 chr1 1159 99 35M = 984 -210 GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG ;9===;======;7==;;======;=====;==== MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:207:926:427 83 chr1 1159 99 35M = 973 -221 GGGAAGAACAGCTTAGGTATCAATTTGGTGTTCTG ;;7<<;4<<<2<<;<<<<<<<<<<7<;<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:239:796:221 83 chr1 1160 99 35M = 992 -203 GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT ;;<<;<<;<<<+:<<<4<4<<<<<<<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:142:457:584 147 chr1 1160 99 35M = 999 -196 GGAAGAACAGCTTAGGTATCAATTTGGTGTTCTGT 8::<:<<9<<.<:<<<<<<<<<<<7<<<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:190:481:295 83 chr1 1161 99 35M = 990 -206 GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG ;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:86:308:648 147 chr1 1161 99 35M = 970 -226 GAAGAACAGCTTAGGTATCAATTTGGTGTTCTGTG <7<<<;<<<<+;<<<2<5<<<77;<<2<;;<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:182:23:585 99 chr1 1163 99 35M = 1336 208 AGAACAGCTTAGGTATCAATTTGGTGTTCTGTGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:216:650:516 99 chr1 1164 99 36M = 1326 198 GAACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:15:805:420 83 chr1 1164 35 35M = 998 -201 GAACAGTTTAGGTATCAATTTGGTGTTCTTTGTAA <64<59&996<(64<)7).68<0<0<<7741<1:< MF:i:18 Aq:i:35 NM:i:2 UQ:i:24 H0:i:0 H1:i:1
+EAS56_65:6:82:822:767 147 chr1 1165 99 35M = 972 -228 AACAGCTTAGGTATCAATTTGGTGTTCTGTGTAAA <<9<<<<<<<<<<;;<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:33:1566:588 147 chr1 1166 76 35M = 985 -216 ACAGCTTAGGCATCAATTTGGTGTTCTGTGTAAAG -6246;;97;77;;97;;;;;;9;7;79;)&;37; MF:i:18 Aq:i:37 NM:i:1 UQ:i:22 H0:i:0 H1:i:1
+EAS1_93:1:20:635:509 163 chr1 1167 99 35M = 1333 201 CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT <<<<<<<<<;<<<<;<<<;<;;;<<<;<<<<<<(8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:144:28:475 147 chr1 1167 99 35M = 974 -228 CAGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGT ;;;9;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:36:1402:1709 163 chr1 1168 99 35M = 1326 193 AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC <<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<:9<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:34:956:1309 147 chr1 1168 99 35M = 994 -209 AGCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTC 9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:157:784:936 163 chr1 1169 99 35M = 1356 222 GCTTAGGTATCAATTTGGTGTTCTGTGTAAAGTCT <<<<<<<<<<<<<<<<<:<<<<<<;<<<<814<4< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:2:152:860:286 83 chr1 1171 99 35M = 1004 -202 TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCA 2;5;8<<;5<<<;<2<8<<<<<<;8<;<<<<;<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:157:786:424 147 chr1 1171 99 36M = 981 -226 TTAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG ;<;2;;<<<;<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:33:1407:94 163 chr1 1172 99 35M = 1360 223 TAGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAG ;;;;;;;6:;;:::7;:;;;;:::;;;;:;47771 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:302:288:657 147 chr1 1173 99 35M = 1013 -195 AGGTATCAATTTGGTGTTCTGTGTAAAGTCTCAGG <:5<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:233:97:262 147 chr1 1175 99 35M = 1021 -189 GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA --;;7<;<;;:;<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:67:692:110 147 chr1 1175 99 35M = 1009 -201 GTATCAATTTGGTGTTCTGTGTAAAGTCTCAGGGA ;;<<8<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:68:692:347 163 chr1 1176 99 36M = 1351 211 TATCAATTTGGTGTTCTGTGTAAAGTCTCATGGAGC <<<<<<<<<+6<;<<<<3<:<<<<6<8<<<&*/;*0 MF:i:18 Aq:i:64 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS51_64:3:309:303:278 83 chr1 1178 99 35M = 996 -217 TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC <:<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:21:132:1423 147 chr1 1178 99 35M = 1012 -201 TCAATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCC :<<<<<6<<;<<;<5<;<<<<<<;<6<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:63:854:610 83 chr1 1180 99 35M = 1005 -210 AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT :.5;2<:88<<72:<<;<<7<8;<;/<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:182:313:319 147 chr1 1180 99 35M = 1016 -199 AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT </<;185;8<;;87<;8<<<<8<;83<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:62:603:1552 83 chr1 1180 99 35M = 1019 -196 AATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGT 8::;:<<6<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:145:144:796 99 chr1 1181 99 35M = 1372 226 ATTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTC <<<<<<<<<<<<<<;<<<<<<;<<<<<<4;4;<;/ MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:41:474:283 147 chr1 1182 99 35M = 1018 -199 TTTGGTGTTCTGTGTAAAGTCTCAGGGAGCCGTCC 6/;;;88;;<:;48<<<<<;<;<<<<<<<<<<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:329:458:365 99 chr1 1186 99 35M = 1364 213 GTGTTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGT ==========================9======== MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:159:222:274 147 chr1 1189 99 35M = 1019 -205 GTCTGGGGAAAGTCTCAGGGAGCCGTCCGTGTCCT ''7*<&<'<<<<.<2<<<<<<<<<<+<<<8<8<<; MF:i:18 Aq:i:37 NM:i:3 UQ:i:17 H0:i:0 H1:i:1
+EAS114_32:6:88:162:587 99 chr1 1189 99 35M = 1372 218 TTCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCT <;<<<<<<<<<;<5<;<;<<7<++<<2&*:322+7 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:148:340:479 99 chr1 1190 99 35M = 1364 209 TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC <<<<<<<<<<<<<<<<:<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:12:276:1797 147 chr1 1190 99 35M = 1006 -219 TCTGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTC )9<02)<<<<<<<<<<<<<1<<<<&<<<<9<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:190:42:671 83 chr1 1192 99 36M = 1008 -220 TGTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA <<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:321:271:138 99 chr1 1193 99 35M = 1394 236 GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA <<<<<<<<<<<<<<<<<<<<<;9<<;<<;;<88;& MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:154:669:853 163 chr1 1193 99 35M = 1371 213 GTGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCA ============<===.====<:=<9=<<<9;:;2 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:287:258:321 147 chr1 1194 99 35M = 1030 -199 TGTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCAT :.<9<)<;<9<.<<:<:+5:<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:61:183:767 147 chr1 1195 99 35M = 1010 -220 GTAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATC 6&.;;<3<363<<<<<<<<8<<<6<<<<3<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:29:794:282 83 chr1 1196 99 36M = 1025 -207 TAAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG 7<<<<45::-<<<<<;<<-;<<;<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:313:827:992 99 chr1 1197 99 35M = 1379 217 AAAGTCTCAGGGAGCCGTCCGTGTCCTCCCATCTG <<<<6<<<<:<<<<<66<<<:33:<<<80<;6<8+ MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:196:11:27 83 chr1 1198 65 36M = 1035 -199 AAGACCCAGTTAGCCGTCCGTGTCCTCCCATCTGGC 96&6<'<7:!!<,:;+7<<6:<<<<<<<<<7<7;:< MF:i:18 Aq:i:24 NM:i:4 UQ:i:27 H0:i:0 H1:i:0
+EAS139_19:3:87:133:930 83 chr1 1198 99 40M = 1044 -194 CAGTCTCAGGGCGCCGTCCGTTTCCTCCCATCTGGCCTCG )8&)907)-;9&,<<9)<;<<0<;<<99<<<<<<;<<9<< MF:i:18 Aq:i:39 NM:i:3 UQ:i:28 H0:i:0 H1:i:1
+EAS114_45:7:97:1584:777 147 chr1 1200 99 35M = 1013 -222 GTCTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCC 66746,9::9;;;;:;;;;;;;;;;;;;;;:;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:127:153:861 99 chr1 1202 99 35M = 1374 207 CTCAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTC <<<<<<<<<<<<<<<<<<<<<<<=<*<<<24;;:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:157:42:763 83 chr1 1203 99 35M = 1040 -198 TCTGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCG 4++;((2(5;24<./<:<<<<<<<<;<<88<<<<9 MF:i:18 Aq:i:61 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_65:4:91:267:655 99 chr1 1204 99 35M = 1365 196 CAGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGT <<<<<<<<<<<<<<<<<<<<<;:;;7<9477<74; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:39:966:551 147 chr1 1205 99 35M = 1026 -214 AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC 8;;;;;<<6'<<<+8<<<1<<<<4<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:61:38:1182 163 chr1 1205 99 35M = 1388 218 AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:47:352:1492 99 chr1 1205 99 40M = 1385 220 AGGGAGCCGTCCGTGTCCTCCCATCTGGCCTCGCCCACTA :<<<::<24<04-&<;<<2<<<&<60)&<5<<6*8:)9+* MF:i:18 Aq:i:53 NM:i:3 UQ:i:28 H0:i:1 H1:i:0
+EAS221_3:8:74:770:1712 83 chr1 1208 99 35M = 1052 -191 GAGCCGTCCGTGTCCTCCCATCTGGCCTCGTCCAC 3.&::6<<<9<6:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:279:763:945 147 chr1 1210 99 36M = 1048 -198 GCCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT +9:-+<:1-44<<':<;<+<-<<<;:<<;;<<<<<0 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:306:388:342 163 chr1 1211 99 35M = 1398 222 CCGTCCGTGTCCTCCCATCTGGCCTCGTCCACACT ================5====:=====;==1=4== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:180:905:36 147 chr1 1212 99 35M = 1033 -214 CCTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG 6%%<;<662<<*;<<<8<<:<<<<<<<<<<<<<<; MF:i:18 Aq:i:65 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS218_1:2:19:752:816 99 chr1 1212 99 35M = 1394 217 CGTCCGTGTCCTCCCATCTGGCCTCGTCCACACTG <<<<<<<<<<<<<<<<<<<8<7;<;<<767277;6 MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:305:565:952 147 chr1 1213 99 36M = 1030 -219 GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT 5(<1<147<81<*8--8<<<7<91<<<;+<+<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:44:1466:425 83 chr1 1213 99 35M = 1044 -204 GTCCGTGTCCTCCCATCTGGCCTCGTCCACACTGG 6-<<9<<:<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:68:64:783 163 chr1 1214 99 35M = 1402 223 TCCGTGTCCTCCCATCTGGCCTCGTCCACACTGGT <<<<<<<<<<<<<<<<<;;<<<<<<;<<<9:<<:9 MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:7:64:37:257 163 chr1 1215 99 35M = 1389 209 CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT ================<=====;===8;4====== MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:20:413:1334 99 chr1 1215 99 35M = 1370 190 CCGTGTCCTCCCATCTGGCCTCGTCCACACTGGTT 7<<;<<<.;<;67;7;;;:;;3;<59+...77677 MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:179:549:753 147 chr1 1218 99 35M = 1056 -197 TGTCCTCCCATCTGGCCTCGTCCACACTGGTTCTC :77<</<<<::<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:16:823:343 99 chr1 1223 99 35M = 1403 215 TCCCATCTGGCCTCGTCCACACTGGTTCTCTTGAA ================================4== MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:266:556:252 99 chr1 1224 99 35M = 1392 203 CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA <<<<<<<<<<<<<<<<<;<<<<<<4;;<;;;<7;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:278:524:521 83 chr1 1224 99 35M = 1025 -234 CCCATCTGGCCTCGTCCACACTGGTTCTCTTGAAA 7777,<;<<7<<<<;;<<;;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:72:1426:1883 99 chr1 1226 99 35M = 1405 214 CATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:82:998:566 83 chr1 1227 99 35M = 1050 -212 ATCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCT <9<9<<<<2<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:6:29:575:453 83 chr1 1228 99 36M = 1056 -208 TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTTG ;<<<;;<:<<<;<;<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:222:538:267 147 chr1 1228 99 35M = 1074 -189 TCTGGCCTCGTCCACACTGGTTCTCTTGAAAGCTT 52/8-<<7<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:138:186:274 147 chr1 1231 99 35M = 1075 -191 GGCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGG <;<<<<<6;<<<<<3<<36;3;<9<<<<<<3;<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:137:895:681 99 chr1 1232 99 35M = 1418 221 GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<-8<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:71:636:533 99 chr1 1232 99 35M = 1398 201 GCCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGC <<<<<<<<<<<<<<<<<<<<<<<7<<<5<<<-847 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:45:294:380 83 chr1 1233 80 36M = 1074 -195 CCTCGTCCACACTGGTTCGCTTGAAAGCTTGGGCTG ;<+<7<<<<;7<,<7<<<+/7;<<;<<;7<<<;<<< MF:i:18 Aq:i:39 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS51_66:8:9:80:353 83 chr1 1233 99 35M = 1067 -201 CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT ;;5;:8<:<:;:;<<<<;<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:73:302:1574 99 chr1 1233 99 35M = 1429 231 CCTCGTCCACACTGGTTCTCTTGAAAGCTTGGGCT <<<<<<<<<<;<<<<<<<<<<<<+:;<<;:8;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:131:779:345 163 chr1 1237 99 35M = 1399 197 GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA ============================9====;= MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:159:71:155 99 chr1 1237 99 35M = 1428 226 GTCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAA =========;=<======;=:=3;==;=6<==;=; MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:55:340:837 83 chr1 1238 99 35M = 1069 -204 TCCACACTGGTTCTCTTGAAAGCTTGGGCTGTAAT 61378<::<<<5:<;;:<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:91:521:517 147 chr1 1239 99 35M = 1061 -213 CCACACTGGTTCTCTTGAAAGCTTGGGCTGTAATG 8;8<4=:===7===9=============<====== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:47:303:887 83 chr1 1240 96 35M = 1052 -223 CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA <;<6<;<;<8<<<8<<<<;<<<.<<<<<<<8<8;< MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:74:570:695 163 chr1 1240 99 35M = 1436 231 CACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGA =========================7====;8<8; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:268:523:511 147 chr1 1241 99 35M = 1081 -195 ACACTGGTTCTCTTGAAAGCTTGGGCTGTAATGAT 8<7<99<<<<<<<<<:<<<<<<4<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:319:174:811 147 chr1 1242 99 35M = 1044 -233 CACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATG ;7;3<<3.<<<<<<<<<<<4<<<<<<<<<<<<<0< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:28:315:310 83 chr1 1242 99 35M = 1085 -192 AAACTGTTCTCTTGAAAGCTTGGGCTGTAATGATG +%,768<<:<:<2<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:4 UQ:i:70 H0:i:1 H1:i:0
+EAS1_108:1:328:614:638 99 chr1 1243 99 35M = 1428 220 ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGC <<<<<<<<<<<<<<<<<<<<4/;<<9<<<<7<<*: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:63:930:152 163 chr1 1243 99 35M = 1410 202 ACTGGTTCTCTTGAAAGCTTGGGCTGTAATGATTC <<<<;<<<<<<<7<<;::<<)726;)<99<)&;&+ MF:i:18 Aq:i:59 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_59:1:219:294:861 83 chr1 1244 99 35M = 1073 -206 CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC ;,;<;<<<;&<<<<<<<5<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:6:42:920:522 83 chr1 1244 99 35M = 1067 -212 CTGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCC ;;;;;99<;<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:87:89:696 99 chr1 1245 99 36M = 1419 210 TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCC <<<<<<<<<<<<<<<<<<<<<<<<<<;<:;<<<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:166:979:531 163 chr1 1245 99 35M = 1410 200 TGGTTCTCTTGAAAGCTTGGGCTGTAATGATGCCC <<</<<<<<<<<<9<<9<<;<7<<<<9<<<9<,)6 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:40:918:950 83 chr1 1247 99 35M = 1071 -211 GTTCTCTTGAAAGCTTGGGCTGTAATGATGCCCCT =0=&&33======;=====.=============== MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:131:946:353 83 chr1 1249 99 35M = 1087 -197 TCTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTG <<:<<66<<<6<<4<<<:8<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:224:932:942 147 chr1 1250 99 35M = 1082 -203 CTCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGG <;<<;;<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:318:177:383 83 chr1 1251 99 35M = 1056 -230 TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC 5:9;7;777<<7<<<<<<<<<<<<<<<<<<<<<<4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:188:460:1000 147 chr1 1251 99 35M = 1080 -206 TCTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGC +;+077<7;<57<;;8<<<<<<<<<<8<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:12:1296:358 147 chr1 1252 96 35M = 1082 -205 CTTGAAAGCTTGGTCTGTAATGATGCCCCTTGGCC -770074;;6;&42;:2;;;:;;;;:;;/:;;;;: MF:i:18 Aq:i:37 NM:i:1 UQ:i:17 H0:i:0 H1:i:1
+EAS188_4:5:166:776:590 83 chr1 1252 99 35M = 1075 -212 CTTGAAAGCTTGGGCTGTAATGATGCCCCTTGGCC <;:;<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:54:263:585 147 chr1 1254 99 36M = 1081 -209 TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCATC 1:::6<<<<;;;<4<<<<<<<<6<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:93:1475:542 83 chr1 1254 99 35M = 1110 -179 TGAAAGCTTGGGCTGTAATGATGCCCCTTGGCCAT 98987:9:<:;:;;;;;<<;<;<;;;;<<<;;;<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:122:342:296 147 chr1 1256 99 35M = 1100 -191 AAAGCTTGGGCTGTAATGATGCCCCTTGGCCATCA <:;:<<<;<2<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:234:787:12 83 chr1 1257 97 35M = 1092 -200 AAGCTTGGGCTGTAATGATGCCCCTTGGCCATCAC ;;.<;;994<;9<<;;;<<<<<<<7<<<<<<<<<; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:317:378:535 83 chr1 1258 99 35M = 1096 -197 AGCTTGGGCTGTAATGATGCCCCTTGGCCATCACC ;7;':<77<<;<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:160:434:853 83 chr1 1259 99 35M = 1072 -222 GCTTGGGCTGTAATGATGCCCCTTGGCCATCACCC ;;*4;<;<<<;<<<<<<<8<<<;<<<<<<<<8<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:18:1498:1475 163 chr1 1260 99 35M = 1427 202 CTTGGGCTGTAATGATGCCCCTTGGCCATCACCCG <<<<<7<<<<<<+<<-3<<3<:<2<1<<:<<<<<+ MF:i:18 Aq:i:71 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+B7_593:2:104:744:280 99 chr1 1262 64 36M = 1421 195 TGGGCTGTAATGATGCCCCTTGTCCATCACCCGGTC <<<<<<<<<<<<<<;<;<<<<:4<<4<<0<;80+;: MF:i:18 Aq:i:21 NM:i:2 UQ:i:34 H0:i:0 H1:i:1
+EAS1_95:4:66:179:118 83 chr1 1262 99 35M = 1084 -213 TGGGCTGTAATGATGCCCCTTGGCCATCACCCAGT <<99<<<<<<<<<<<<<<<<<<<9<<<:<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:277:194:143 99 chr1 1262 99 35M = 1444 217 TGGGCTGTAATGATGCCCCTTGGCCATCACCCGGT <<<<<<<<<<<;<<<<<<<<<<9;<<<8</<<6<: MF:i:18 Aq:i:72 NM:i:1 UQ:i:21 H0:i:1 H1:i:0
+EAS1_97:2:59:882:980 83 chr1 1263 99 35M = 1071 -227 GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC 7339%<6<<<<<;<<9<<8<<<<;<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS220_1:4:14:1665:1772 83 chr1 1263 84 35M = 1073 -225 GGGCTGTAATGATGCCCCTTGGCCATCACCCGGTC <&7<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_57:2:259:42:969 163 chr1 1265 99 35M = 1426 196 GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC <<<<<;<<;<<3<<<;9<36<<29;<<;;;</;<2 MF:i:18 Aq:i:69 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS221_1:4:4:1732:88 147 chr1 1265 99 35M = 1087 -213 GCTGTAATGATGCCCCTTGGCCATCACCCGGTCCC :<4<:<<:<::<<<<<::<<<<<:<:<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:2:110:584:649 147 chr1 1266 99 35M = 1084 -217 CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT ++:4686<<68<;<;<;<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_59:5:113:694:725 83 chr1 1266 99 35M = 1088 -213 CTGTAATGATGCCCCTTGGCCATCACCCGGTCCCT ;::<<:<:<<<<<<<<<<:<:<<<<<<;<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_1:8:58:369:244 163 chr1 1266 99 35M = 1436 205 CTGTAATGATGCCCCTTGGCCATCACCCAGTCCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:105:521:563 83 chr1 1267 10 35M = 1103 -199 TGTAATGCTGCCCCTTGGCCATCCCCCGGTCCCTG /8)-8/6(98<967<3<<979<<1<<<7<<<<7<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:45 H0:i:0 H1:i:0
+EAS188_4:5:202:326:680 83 chr1 1268 78 35M = 1108 -195 GTAATGATGCCCCTTGGCCATCACCCGGTCCCTGC +33<81<:*<;<;;30;<<<;<<<8<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS192_3:6:216:292:528 99 chr1 1269 99 35M = 1438 204 TAATGATGCCCCTTGGCCATCACCCAGTCCCTGCC <;<;<<<<<<<;<<<<<<<<;;;;:;;:<%<;1;: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1864:477 163 chr1 1270 99 35M = 1465 230 AATGATGCCCCTTGGCCATCACCCAGTCCCTGCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:35:631:594 83 chr1 1271 99 35M = 1112 -194 ATGATGCCCCTTGGCCATCACCCGGTCCCTGCCCC <<<<4<<<<<.<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS112_34:8:103:812:255 99 chr1 1272 99 35M = 1461 224 TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCC <<<<<<<<<<<<<<<9<<;<<<39;;<;32:7;7+ MF:i:18 Aq:i:69 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS188_7:4:259:869:641 99 chr1 1272 99 35M = 1435 198 TGATGCCCCTTGGCCATCACCCAGTCCCTGCCCCA <<<<<<<<<<<<<<<<<<<<<,;<:<<<<<<<<<1 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:316:25:230 83 chr1 1273 99 35M = 1098 -210 GATGCCCCTTGGCCATCACCCGGTCCCTGCCCCAT 8;8;<<;<;;<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_1:6:38:1071:155 99 chr1 1274 99 35M = 1465 226 ATGCCCCTTGGCCATCACCCAGTCCCTGCCCCATC <<<<<<<<<<<<<:<<<<<<<<8<<<:<<:;;8:; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:6:585:132 83 chr1 1276 23 36M = 1105 -207 GCCCCTTGACCACCACCCAGTCCCTGCCCCATCTCT :<473$'<+5;7*+<7<&<37<7<<<<7;;7<<:<7 MF:i:18 Aq:i:23 NM:i:2 UQ:i:19 H0:i:0 H1:i:0
+B7_595:6:47:720:789 99 chr1 1278 90 35M = 1455 212 CCCTTGGCCATCACCCGGTCCCGGCCCCTTCTCTT <<72<<<<<<<<;;<7;,0<2;*7<2;<*;;<<64 MF:i:18 Aq:i:25 NM:i:3 UQ:i:44 H0:i:0 H1:i:0
+EAS192_3:6:185:868:496 163 chr1 1278 99 35M = 1442 199 CCCTTGGCCATCACCCAGTCCCTGCCCCATCTCTT <<<<<<<<<<<<;<<<;<<<<<<<<<<<9<<;<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:290:146:36 147 chr1 1280 99 35M = 1110 -205 CTTTCCCATCCCCCGGTCCCTGCCCCATCTCTTGT 7;%%%<8-4<(<<<7<<<:<:<<<<<<<<<<<<<< MF:i:18 Aq:i:25 NM:i:4 UQ:i:37 H0:i:0 H1:i:0
+B7_593:5:267:71:603 99 chr1 1281 99 36M = 1446 201 TTGGCCATCACCCAGTCCCTGCCCCATCTCTTGTAA <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<9; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:183:645:699 147 chr1 1281 86 35M = 1122 -194 GTGGCCCTCCCCCATTCCCTGCCCCATCTCTTGTA &)))2-&420<<<'--<6:6-<7<<<+:7<65<<< MF:i:18 Aq:i:21 NM:i:4 UQ:i:37 H0:i:0 H1:i:0
+EAS1_105:2:179:532:82 147 chr1 1285 99 35M = 1105 -215 CCATCACCCGGTCCCTGCCCCATCTCTTGTAATCT <:96<6<<<<89<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:3:176:431:647 83 chr1 1285 99 35M = 1112 -208 CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT <(9(<<<7;<<7<<<<<<<7<<<<<<7<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:258:266:101 83 chr1 1285 99 35M = 1094 -226 CCATCACCCAGTCCCTGCCCCATCTCTTGTAATCT %==/7&8=======:===6================ MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:179:735:569 163 chr1 1286 99 35M = 1461 210 CATCACCCGGTCCCTGCCCCATCTCTTGTAATCTC <<<<<<<<<<<<<<<<<<<<3<<<<<<<<4/<;<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS188_7:3:200:712:439 163 chr1 1286 99 35M = 1435 184 CGTCACCCGGTCCCTGCCCCATCTCTTGTAATCTC <7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:2 UQ:i:49 H0:i:0 H1:i:0
+EAS1_103:5:319:165:698 99 chr1 1287 99 35M = 1485 233 ATCACCCAGTCCCTGCCCCATATCTTGTAATCTCT <<<<<<<<<<<<<<<<<<<3<9<<<<<<<;<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:24 H0:i:0 H1:i:1
+B7_597:3:53:616:842 83 chr1 1288 99 35M = 1109 -214 TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC ;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:286:753:854 83 chr1 1288 99 35M = 1110 -213 TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC ;<2<<<,57:<<9<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:14:1256:204 99 chr1 1288 99 35M = 1467 214 TCACCCAGTCCCTGCCCCATCTCTTGTAATCTCTC <<<<<;;;;;;<;;;;;;;<;<;;;;<:-;79697 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:289:132:526 99 chr1 1289 99 36M = 1472 219 CACCCGGTCCCTGCCCCATCTCTTGTAATCTCTCTC <<<<<<<<<<<<<<<<<<<<<<<<<<8<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS218_1:4:71:832:743 83 chr1 1290 99 35M = 1102 -223 ACCCAGTCCCTGCCCCATCTCTTGTAATCTCTCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:102:511:946 99 chr1 1291 26 35M = 1461 205 CCCAGTCCCTGCCCCATCTCGGGTAATCTCTCTCC <<9<<;<<<<;<<<<;<<7;%<5<<0<<<)<.<.+ MF:i:18 Aq:i:26 NM:i:2 UQ:i:31 H0:i:0 H1:i:0
+EAS114_39:5:42:1223:1087 99 chr1 1293 99 35M = 1479 221 CAGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTT <<<<<<<<<<<<<5<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:75:732:442 147 chr1 1293 99 40M = 1121 -212 CGGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC 7,*&28<61:88<.7<:<<:6<1<85:<:1<5<&::<<&< MF:i:18 Aq:i:60 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS54_73:3:23:502:103 163 chr1 1294 99 35M = 1486 227 AGTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTT <2<<<<<<<<<<.<<<<<<<:1&:<<<7<<<<<<: MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:74:596:137 147 chr1 1294 91 35M = 1119 -210 GGTCCCTGCCCCATCGCTTGTAATCTCTCGCCTTT +40778449779049'+*87489498949%89948 MF:i:18 Aq:i:22 NM:i:3 UQ:i:32 H0:i:0 H1:i:0
+EAS51_66:8:36:688:722 99 chr1 1295 99 35M = 1469 209 GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:60:182:718 163 chr1 1295 99 35M = 1485 225 GTCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTT <<<<<<<<<<<<<<<<<<<<7<<<<<<<<<;<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:4:54:989:654 147 chr1 1296 99 35M = 1108 -223 TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT ,<1<2<<<;9)9<<;<<;<<<4<<<;<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:9:203:653 163 chr1 1296 99 35M = 1488 227 TCCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTT <<<<<<<<<<<<<<<<<<<<<<::<9<<<<<;;;< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:322:631:245 163 chr1 1297 99 36M = 1474 213 CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC <<<<<<<<<<<<<<<<<0<<<<<<<<<<<<<<<<5; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:59:1548:1096 83 chr1 1297 99 35M = 1099 -233 CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG 88888;;88;;;;8;;9;;;<<<<<<<<<<<<<<; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:52:1779:1664 99 chr1 1297 99 35M = 1462 200 CCCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTG <<<<<<<<<<<<<<<<<<71<<<<<<<<<<<<<<% MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:218:173:667 99 chr1 1298 99 35M = 1448 185 CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC <<<<<<<<<<<<<<<6<<<<<<<<<<<<<<<<<.< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:175:437:950 83 chr1 1298 99 35M = 1126 -207 CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC ;;5:;;9<<:<;<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:201:195:757 83 chr1 1298 99 35M = 1103 -230 CCTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGC :<':<:<<46<:<;:<;<;<<9<<<<<<<<;<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:8:377:655 99 chr1 1299 99 35M = 1473 209 CTGCCCCATCTCTTGTAATCTCTCTCCTTTTTGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:50:950:562 99 chr1 1301 99 35M = 1473 207 GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGC <<<<<<<<<<<<<<<&<<8<<<<<<<5<:<+<:+; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:153:543:671 99 chr1 1301 99 34M = 1465 199 GCCCCATCTCTTGTAATCTCTCTCCTTTTTGCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<<7 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:33:1193:664 163 chr1 1301 99 40M = 1474 213 GCCCCATCTCTTGTAATCTCTCTCCTTTTTTCTGCATCCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<%:<'<9:::9 MF:i:18 Aq:i:71 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_93:1:253:59:242 99 chr1 1302 99 35M = 1478 211 CCCCATCTCTTGTAATCTCTCTCCTTTTTGCTGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<</<<9;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:52:1455:1212 147 chr1 1304 99 40M = 1153 -191 CCATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGT 6::4::;4%;9:<79)<:<;<<:4::7<<9<&+71<9;<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:316:176:543 99 chr1 1305 99 35M = 1469 199 CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC ====<=9===<<<=====9====<<=3==,96==9 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:50:1339:1154 163 chr1 1305 99 35M = 1481 211 CATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCC ==========<<==============;==7<;<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:169:292:652 99 chr1 1306 99 35M = 1510 239 ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC <<<<<<<<<<<<<<<<<<<<<<<<<6<<-<<<<8< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:11:706:1030 99 chr1 1306 92 35M = 1469 198 ATCTCTTGTAATCTCTCTCATCTTTGCTGCATCCC <<<2<<2<<<<<<<<<<<<0<&<<<+<:2<4<<): MF:i:18 Aq:i:26 NM:i:2 UQ:i:20 H0:i:0 H1:i:0
+EAS221_3:6:70:843:706 99 chr1 1306 99 35M = 1449 178 ATCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCC <<<<<<<<<<<<<<<<<<<<<<<<<5<<5<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:7:174:597:66 83 chr1 1307 99 35M = 1148 -194 TCTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCT 9<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:7:1547:1933 163 chr1 1308 99 35M = 1497 224 CTCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTG <<<<<<<<<<<<<<<<<<<<<<<:<<8<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:117:411 163 chr1 1309 99 36M = 1482 209 TCTTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTC <<<<<<<<<<<<<<<<<<<<<<7<<:<<<<<<<<<: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:53:156:845 99 chr1 1311 99 35M = 1487 211 TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT <<<<<<8<<<.<<<<.6<<--<-<<<<<<<6<<<< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:90:1403:1635 99 chr1 1311 99 35M = 1480 204 TTGTAATCTCTCTCCTTTTTGCTGCATCCCTGTCT <<;<;<<<<;<;<;;<<<<<9;<.;;<:;99.979 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:67:302:762 147 chr1 1313 99 36M = 1138 -211 GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC :8;88<;<<<;<<8<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:270:448:491 99 chr1 1313 99 35M = 1501 223 GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC <<<<<<<<<<<<<<<<<<&<<.<<<<<<<:;;;<; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:82:932:400 99 chr1 1313 97 34M = 1486 208 GTAATCTCTCTCCTCTTCGCTGCATCCCTGTCTT <<<<<<8<1<<<<8+<<&<<<8<<<<<<<+(,/8 MF:i:18 Aq:i:25 NM:i:2 UQ:i:15 H0:i:0 H1:i:0
+EAS54_81:2:128:394:455 83 chr1 1313 99 35M = 1156 -192 GTAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTC ;=;9.=5=;=9====;;================== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:57:735:151 147 chr1 1314 94 35M = 1121 -228 TAAACTCTCACCTTATTGCTGCATCCCTGTCTTCC 07;+79:;<)<<9<+8<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:3 UQ:i:28 H0:i:0 H1:i:0
+EAS114_28:6:51:506:878 163 chr1 1314 99 36M = 1501 223 TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCT <<<<<<<<<<<<<<<<<4<<<<<<<<<<0<<<<<:; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:15:1497:1530 147 chr1 1314 99 35M = 1136 -213 TAATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCC 77778:;;;:;;;;:9;:;;;;;;;;;9;:;;;;; MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:9:1595:1826 99 chr1 1316 99 35M = 1494 213 ATCTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:73:273:488 163 chr1 1318 99 35M = 1512 229 CTCTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTG <<<<<2<88<88<<<8<<1<<<<<<68<<<;<;<* MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:1:199:760:42 163 chr1 1318 24 35M = 1489 206 CTCTCTAATTTTTGCTGCTTCCATGTCTTACTCTG +2&2&2&22222220222&220-222-22-22-22 MF:i:130 Aq:i:24 NM:i:5 UQ:i:51 H0:i:0 H1:i:0
+EAS1_95:7:61:702:720 163 chr1 1320 99 35M = 1500 215 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC ==============;=======&=========3:= MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:41:576:1016 163 chr1 1320 99 35M = 1503 218 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC <<<<<<<<<<<<<<;<<<;<<<<<<<<<<<4<::< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:115:683:296 99 chr1 1320 99 35M = 1514 229 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC <<<<<<<<<<<8<<<<<<<<<<6<<<<3<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:63:1265:820 99 chr1 1320 99 35M = 1480 195 CTCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTC <<<<<<<<<<27<<<<<<<<<<<<<<<<<<<<03< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:7:92:288:1354 163 chr1 1321 99 40M = 1480 199 TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT <<<<<<:<<<<<<<<<<<8<<:<<<<;;<8<<<8<:8+:: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:316:949:122 147 chr1 1321 99 35M = 1156 -200 TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT 59899<<<<;;<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:37:1626:862 163 chr1 1321 99 35M = 1489 203 TCTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:5:147:479:41 83 chr1 1322 99 35M = 1139 -218 CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTT ;:;:;<::<:<<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:73:936:1509 163 chr1 1322 99 40M = 1502 220 CTCCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTTATTT <<<<<<<<<7<<7<<<<<<<;<<<<<<<<<:<:<;%8::: MF:i:18 Aq:i:75 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_62:6:50:542:881 83 chr1 1324 99 35M = 1132 -227 CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA +2<<<;<3;29<6<5;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:71:85:629 163 chr1 1324 99 35M = 1484 195 CCTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGA <<<<<<<<<<9<<<<<<<<<<<<<<<<<5<9<<+6 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:191:948:257 163 chr1 1325 99 35M = 1493 203 CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT :<<<<<<<<9<:<<<<<<:<<<<;<<<<8<<<<7< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:249:986:224 99 chr1 1325 99 35M = 1499 209 CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT =========5======7878===98==7=9==.-= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:6:1067:91 163 chr1 1325 99 35M = 1483 193 CTTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGAT <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<:8<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:216:650:516 147 chr1 1326 99 36M = 1164 -198 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ;9;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:18:376:416 163 chr1 1326 99 35M = 1510 219 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGTTT <<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;:(<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS114_28:5:209:778:588 163 chr1 1326 99 36M = 1514 224 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT <<<<<<<<;<<<<<<<<<;<<<;<8<8<<<<;7;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:36:1402:1709 83 chr1 1326 99 35M = 1168 -193 TTTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATT ;;;:<<<;<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:40:352:151 147 chr1 1327 99 35M = 1137 -225 TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ;=;;5=:-=9=====;;================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:139:331:63 99 chr1 1327 99 35M = 1486 194 TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT ====================<<============= MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:11:1274:1230 163 chr1 1327 99 35M = 1507 215 TTTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:36:678:316 99 chr1 1328 99 35M = 1500 207 TTTGCTGCATCCCTGTCTTCCTCTGTCTTGATTTA <<<<<<<<<<<<<<;<<<<<<<<<;<<<<,2<<<) MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:102:825:507 163 chr1 1330 99 35M = 1501 206 TGCTGCATCCCTGTCTTCCTCTGTCTTGATTTACT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:171:343:758 99 chr1 1331 99 36M = 1494 199 GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG <<<<<<<<<<<<<<<<<<<<<;<<<<59<<<9;<<3 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:85:1224:625 99 chr1 1331 99 35M = 1532 236 GCTGCATCCCTGTCTTCCTCTGTCTTGATTTCCTT <<<<<<<<<;<<;<<7<<:<<7.<<<:&7<<.<;< MF:i:18 Aq:i:70 NM:i:1 UQ:i:13 H0:i:1 H1:i:0
+EAS188_7:5:308:354:124 99 chr1 1331 99 35M = 1507 211 GCTGCATCCCTGTCTTCCTCTGTCTTGATTTACTT <<<<<<<<<<<<<<<<<<<<<;<<<<;<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:7:22:22:934 163 chr1 1332 99 35M = 1500 203 CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG <<<<<<<<<<<6<<<;<<<;84;<<48;<;6;<;) MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:71:707:568 163 chr1 1332 99 35M = 1518 221 CTGCATCCCTGTCTTCCTCTGTCTTGATTTACTTG <<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:123:610:472 99 chr1 1333 99 35M = 1504 206 TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT <<<<<<<<<<:<<<<<<<<<<<<<+:<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:20:635:509 83 chr1 1333 99 35M = 1167 -201 TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT 50<59<<9<9<<<<<<<<<<<<<<<<<<<6<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:92:213:217 99 chr1 1333 99 35M = 1515 217 TGCATCCCTGTCTTCCTCTGTCTTGATTTACTTGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:47:471:858 163 chr1 1335 99 35M = 1487 187 CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG <<;<<<<<<<<9<<<4;;<<<<;<<<<<.<<4;<4 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:90:406:631 163 chr1 1335 99 35M = 1525 225 CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG <<<<<<<<<<<<<<<<<:<<<<:;<<<<;<<8;<8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:81:1723:1820 99 chr1 1335 99 35M = 1524 224 CATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:182:23:585 147 chr1 1336 99 35M = 1163 -208 ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT 9:<<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:150:508:757 163 chr1 1336 99 35M = 1483 182 ATCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGT <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<8<<,< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:261:504:780 163 chr1 1337 99 35M = 1501 199 TCCCTGTCTTCCTCTGTCTTGATTTACTTGTTGTT <<<<<<<<<<<<<<<<<<<</2<<<9<<<5<<,<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:324:515:230 163 chr1 1339 99 35M = 1512 207 CCTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGG <<;<<<<<<<<<<<<<<<:<<<<8<<<4<<4<<34 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:72:916:763 83 chr1 1340 99 35M = 1142 -233 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT <;;:<<<<<<<;<<;;;<<<<<<<<<;;<;<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:194:168:684 99 chr1 1340 99 36M = 1512 208 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGTT <<<<<<<<<<<<<<<<<<<<<<<<<<7<<.<<6-<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:113:43:634 163 chr1 1340 99 35M = 1500 195 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTTTT <<<<<<<<<<<<.<<<<<<<<<<<<</<<2;;%%; MF:i:18 Aq:i:45 NM:i:2 UQ:i:8 H0:i:1 H1:i:0
+EAS54_71:5:16:434:204 163 chr1 1340 99 35M = 1522 216 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT =================;)===8===:==7;<+%; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:246:205:734 73 chr1 1340 65 35M = 1340 0 CTGTCTTCCTCTGTCTTGATTTACTTGTTGTTGGT <<<4<<6666<<6<:<<<3<<<:'<<:<<<<;6<+ MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:246:205:734 133 chr1 1340 0 * = 1340 0 CTCCAGGGAAGTTATCTCTCATCTAGANNNNNTTG <<<<<<:/<<<,6'</7;<-+9<<;<7!!!!!8<, MF:i:192
+EAS54_65:3:102:884:63 163 chr1 1341 99 35M = 1481 175 TGTCTTCCTCTGTCTTGATTTCCTTGTTGTTGGTT <<<<<<<<<<<<<<<<<3<<<%<<<9<<9<<7+;< MF:i:18 Aq:i:43 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS51_64:3:67:782:132 99 chr1 1343 99 35M = 1498 190 TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT <<<<<<<<<<<<<<<<<<<<<<<<<<:<<;4<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:70:348:972 163 chr1 1343 99 35M = 1528 220 TCTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTT <.<<3+.7<<7<<:78:<<7<:<7:<3<<7.:::< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:9:206:901 99 chr1 1344 99 35M = 1517 208 CTTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTC <<<<<<<<<<<<<<<<<<<<<<5<<5<<%%:<<<7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:21:443:404 99 chr1 1345 99 35M = 1529 219 TTCCTCTGTCTTGATTTACTTGTTGTTGGTTTTCT <<<<<<<<<<<<<<<<<<<<<7<<;<<;+<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:148:286:316 163 chr1 1347 99 35M = 1531 219 CCTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGT <<<<<<<<+<<7<<<<<<<6<<<6<142<<<6<2< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:77:48:860 99 chr1 1348 99 35M = 1521 208 CTCTGTCTTGATTTACTTGTTGTTTGTTTTCTGTT =========;===========9==*;5=;=;=,7= MF:i:18 Aq:i:45 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+EAS51_64:6:124:128:489 147 chr1 1348 99 35M = 1142 -241 CTCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTT ::55<<<8<<<6<<;<<<<<<<<7<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:213:54:878 137 chr1 1348 99 35M * 0 0 CTCTGTCTTGATTTACTTGTTGTTGGTTTTTTGTT <<<<<<<<<;<<<<<<<<:<<:<<++<<<<%<%<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS218_1:4:73:42:1038 163 chr1 1349 99 35M = 1513 199 TCTGTCTTGATTTACTTGTTGTTGGTTTTCTGTTT <<<<<<<<<<<<<<<<<<<<<<<:<<<<<.<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:320:505:814 99 chr1 1350 99 35M = 1515 200 CTGTCTTGATTTACTTGTTGTTGGTTTTCTTTTTC <<<<<<<<<<<<<<<<;<<8<<76<<<<;<&<<<7 MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_593:2:68:692:347 83 chr1 1351 99 36M = 1176 -211 TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCTT 9<;;;;<<<:<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:252:428:683 137 chr1 1351 99 35M * 0 0 TGTCTTGATTTACTTGTTGTTGGTTTTCTGTTTCT <<<<<<;<<<<<<<<7<<7<<&+<<<<:<&<<<4< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:73:182:444 99 chr1 1354 99 34M = 1533 214 CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTT <<<<;;<<<<<<<<<<<<;<;<<<<<:<<<<<7< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:63:267:545 163 chr1 1354 99 35M = 1524 205 CTTGATTTACTTGTTGTTGGTTTTCTGTTTCTTTG <<<<<<<<<<<<:<<<<<::<<<<<<.<<<;;;;5 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:177:562:806 99 chr1 1356 99 35M = 1515 194 TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTTTT <;<29<99<<;<<<9<20<9<<5;;<<<<<<<+.< MF:i:18 Aq:i:35 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS51_62:7:157:784:936 83 chr1 1356 99 35M = 1169 -222 TGATTTACTTGTTGTTGGTTTTCTGTTTCTTTGTT <:<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:209:345:87 163 chr1 1360 99 35M = 1513 188 TTACTTGTTGTTGGTTTTCTGTTTCTTTTTTTGAT <<<<<<<<<<<<<<<<<<<<;<<<-<<<6<<<+8< MF:i:18 Aq:i:71 NM:i:1 UQ:i:21 H0:i:1 H1:i:0
+EAS114_45:1:33:1407:94 83 chr1 1360 99 35M = 1172 -223 TTACTTGTTGTTGGTTTTCTGTTTCTTTGTTTGAT 77477;4;;;;;44;;;;;;7;;;;;;;9;;;;;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:2:434:715 163 chr1 1363 99 35M = 1527 199 CTTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTT <<<<<<<<<<<<<<<<<;<<<<<<<0<<<68<<<+ MF:i:18 Aq:i:71 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_65:4:137:319:642 137 chr1 1363 99 35M * 0 0 CTTGTTGTTGGTTTTCTGTTTCTTTTTTTGATTTT <<<<<<<<<27<<<<<<<<<<<<<<&;<<&3;;<% MF:i:18 Aq:i:41 NM:i:2 UQ:i:9 H0:i:0 H1:i:1
+B7_610:3:148:340:479 147 chr1 1364 99 35M = 1190 -209 TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG <<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:329:458:365 147 chr1 1364 99 35M = 1186 -213 TTGTTGTTGGTTTTCTGTTTCTTTGTTTGATTTGG ====:==9========>==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<<</4/;<< MF:i:64 Aq:i:0 NM:i:4 UQ:i:22 H0:i:0 H1:i:0
+EAS51_64:3:7:268:263 181 chr1 1381 0 * = 1381 0 TCGTACAGAAGTTTAATGGAGCCTTGGGACCTTAC !!66'&+/&'8+2''1+'611'&6&+/&+.&+1'& MF:i:192
+EAS139_19:1:47:352:1492 147 chr1 1385 99 40M = 1205 -220 TTTGTTTTGTATGGTGGAAGACATAATCCCACGCTTCCTA +7+/7+/%%1'6+3++1;:</<<5<)27<<9<)9<<9<7< MF:i:18 Aq:i:53 NM:i:3 UQ:i:14 H0:i:1 H1:i:0
+EAS139_11:5:61:38:1182 83 chr1 1388 99 35M = 1205 -218 GTTTGATTTGGTGGAAGACATAATCCCACGCTTCC 9:;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:7:64:37:257 83 chr1 1389 99 35M = 1215 -209 TTTGATTTGGTGGAAGACATAATCCCACGCTTCCT ;47<<47+9<4<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:266:556:252 147 chr1 1392 99 35M = 1224 -203 GATTTGGTGGAAGACATAATCCCACGCTTCCTATG .8558<72<(<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:321:271:138 147 chr1 1394 99 35M = 1193 -236 TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA 261:5969==9=:=<==<================= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:19:752:816 147 chr1 1394 99 35M = 1212 -217 TTTGGTGGAAGACATAATCCCACGCTTCCTATGGA +<<+<--/<<<<4<2<<<<45<<<:<<<<<<+<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:306:388:342 83 chr1 1398 99 35M = 1211 -222 GGGGAAGACATAATCCCACGCTTCCTATGGAAAGG 9/<9;<<<;<;<<7<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS114_39:1:71:636:533 147 chr1 1398 99 35M = 1232 -201 GTGGAAGACATAATCCCACGCTTCCTATGGAAAGG ,51(<<8<:<<<<<<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:131:779:345 83 chr1 1399 99 35M = 1237 -197 TGGAAGACATAATCCCACGCTTCCTATGGAAAGGT <<7<<<<<<<<:<<<<<<<<<<<<<;<<<<<<;<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:68:64:783 83 chr1 1402 99 35M = 1214 -223 AAGACATAATCCCACGCTTCCTATGGAAAGGTTGT <<9<8<6<<<<<;<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:16:823:343 147 chr1 1403 99 35M = 1223 -215 AGACATAACCCCACGCTTCCTATGGAAAGGTTGTT <<<:<<<;+;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS219_FC30151:5:72:1426:1883 147 chr1 1405 99 35M = 1226 -214 ACATAATCCCACGCTTCCTATGGAAAGGTTGTTGG ;9<;<;0<;<;<<<<;<<<;:<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:166:979:531 83 chr1 1410 99 35M = 1245 -200 ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT 81<<<3<*<<:<<<<<<<8<<<<<<<<<<<<:<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:63:930:152 83 chr1 1410 99 35M = 1243 -202 ATCCCACGCTTCCTATGGAAAGGTTGTTGGGAGAT ;:4:8;:::;=:8;=;========;=:======== MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:137:895:681 147 chr1 1418 99 35M = 1232 -221 CTTCCTATGGAAAGGTTGTTGGGAGATTTTTAATG 4;5+6;<<<<<<<<<9;<4<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:87:89:696 147 chr1 1419 99 36M = 1245 -210 TTCCTATGGAAAGGTTGTTGGGAGATTTTTAATGAT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:104:744:280 147 chr1 1421 64 36M = 1262 -195 CATATGGAAAGGTTGTTGGGATTTTTTTAATGATTC '&+74*0<'/.47:8<<<<;<7''6/1<<<.<<68< MF:i:18 Aq:i:21 NM:i:3 UQ:i:33 H0:i:0 H1:i:0
+EAS56_57:2:259:42:969 83 chr1 1426 99 35M = 1265 -196 GGAAAGGTTGTTGGGAGATTTTTAATGATTCCTCA <<<6<<<<<<-<<<<<<;<<;<6<<<<<<<;<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:18:1498:1475 83 chr1 1427 99 35M = 1260 -202 GAAAGGTTGTTGGGAGATTTTTAATGATTCCTCAA :<4<*7<<<<<<<:<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:328:614:638 147 chr1 1428 99 35M = 1243 -220 AAAGGTTGTTGGGAGATTTTTAATGATTCCTCAAT <<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:159:71:155 147 chr1 1428 99 35M = 1237 -226 AAAGGTTGTTGGGAGATTTTTAATGATTCCTCGAT 5;;9<<:<;:<<<<7<<7;<3<<<:<<<;<<<<<; MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_39:1:73:302:1574 147 chr1 1429 99 35M = 1233 -231 AAGGTTGTTGGGAGATTTTTAATGATTCCTCAATG 7<88;;<;;<;;<<<<<<<<<<<<<<<<<<<<<1< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:200:712:439 83 chr1 1435 99 35M = 1286 -184 GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA <;<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<<<7 MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:259:869:641 147 chr1 1435 99 35M = 1272 -198 GTTGGGAGATTTTTAATGATTCCTCAATGTTAAAA 99=:=9=99<=========<=<<============ MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:74:570:695 83 chr1 1436 99 35M = 1240 -231 TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT .;:8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:58:369:244 83 chr1 1436 99 35M = 1266 -205 TTGGGAGATTTTTAATGATTCCTCAATGTTAAAAT <<<<<<<<<<<<<<<<<<<<;<<;<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:216:292:528 147 chr1 1438 99 35M = 1269 -204 GGGAGATTTTTAATGATTCCTCAATGTTAAAATGT ;:;;8<<<<<<<<<<<<<:<<;<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:185:868:496 83 chr1 1442 99 35M = 1278 -199 GATTTTTAATGATTCCTCAATGTTAAAATGTCTAT :;;<;;<<<<<<<<;4<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:277:194:143 147 chr1 1444 99 35M = 1262 -217 TTTTTAATGATTCCTCAATGTTAAAATGTCTATTT ;<<;<<<;8;<0<7<<<<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:267:71:603 147 chr1 1446 99 36M = 1281 -201 TTTAATGATTCCTCAATGTTAAAATGTCTATTTTTG 9;;<;<<<;;<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:218:173:667 147 chr1 1448 99 35M = 1298 -185 TAATGATTCCTCAATGTTAAAATGTCTATTTTTGT <<<<<<;<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:70:843:706 147 chr1 1449 99 35M = 1306 -178 AATGATTCCTCAATGTTAAAATGTCTATTTTTGTC <<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:47:720:789 147 chr1 1455 90 35M = 1278 -212 TCCTCAATGTTAAAATGTCTATTTTTGTCTTGACA /)040<.878<<<<;8<;<9<9;<<<<<<<<<<93 MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:102:511:946 147 chr1 1461 26 35M = 1291 -205 ATGTAAAAGTGACTGTTATTGTCTTGACACCCAAC <%-4:6<:/&46;/*;<*84<0<'<&*<2<<<<<< MF:i:130 Aq:i:26 NM:i:5 UQ:i:78 H0:i:0 H1:i:0
+EAS112_34:8:103:812:255 147 chr1 1461 99 35M = 1272 -224 ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC 7:777:7<<::7<7<7<<:7<7<:<<<<<<<<<7< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:179:735:569 83 chr1 1461 99 35M = 1286 -210 ATGTTAAAATGTCTATTTTTGTCTTGACACCCAAC <5<3:<<<<5;8<<<55;<:</:<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:52:1779:1664 147 chr1 1462 99 35M = 1297 -200 TGTTAAAATGTCTATTTTTGTCTTGACACCCAACT 6;;:;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:153:543:671 147 chr1 1465 99 35M = 1301 -199 TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT ;;;;;=;==================;========= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:38:1071:155 147 chr1 1465 99 35M = 1274 -226 TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT <<62<<<<<<3<<<<</<<<<<<<%<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1864:477 83 chr1 1465 99 35M = 1270 -230 TAAAATGTCTATTTTTGTCTTGACACCCAACTAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:14:1256:204 147 chr1 1467 99 35M = 1288 -214 AAATGTCTATTTTTGTCTTGACACCCAACTAATAT 66777:;;37;;:;;0;:;;;;):;;:7;;;;;;; MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:316:176:543 147 chr1 1469 99 35M = 1305 -199 ATGTCTATTTTTGTCTTGACACCCAACTAATATTT <<)/3<<<&<*<<0<<8<<82</5<<<<<88<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:36:688:722 147 chr1 1469 99 35M = 1295 -209 ATGTCTATTTTTGTCTTGACACCCAACTAATATTT <;;<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:11:706:1030 147 chr1 1469 92 35M = 1306 -198 ATGTCTATTTTTGTCTTGACACCCAACTAATATTT +<5069+9<<<<+<;<<<<;<<77<7<<;<<;<<< MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:289:132:526 147 chr1 1472 99 36M = 1289 -219 TCTATTTTTGTCTTGACACCCAACTAATATTTGTCT ;<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:50:950:562 147 chr1 1473 99 35M = 1301 -207 CTATTTTTGTCTTGACACCCTACTAATATTTGTCT <<3<<<8<;<<<<<<+<<8<&<<<<7<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS188_4:5:8:377:655 147 chr1 1473 99 35M = 1299 -209 CTATTTTTGTCTTGACACCCAACTAATATTTGTCT ;<8;;:<;<<:<;<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:322:631:245 83 chr1 1474 99 36M = 1297 -213 TATTTTTGTCTTGACACCCAACTAATATTTGTCTGA <<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:33:1193:664 83 chr1 1474 99 40M = 1301 -213 TATTTTTGTCTTGACACCCAACTAATATTTGTCTGAGCAA ;;;;;;<;;-9<<<:</+9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:253:59:242 147 chr1 1478 99 35M = 1302 -211 TTTGTCTTGACACCCAACTAATATTTGTCTGAGCA <<<:<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:42:1223:1087 147 chr1 1479 99 35M = 1293 -221 TTGTCTTGACACCCAACTAATATTTGTCTGAGCAA ;:<<<:<7<<<;;<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:90:1403:1635 147 chr1 1480 99 35M = 1311 -204 TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA 86878;;;8;788;;;;;;;;;;;;;8;5;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:7:92:288:1354 83 chr1 1480 99 40M = 1321 -199 TGTCTTGACACCCAACTAATATTTGTCTGAGCAAAACAGT ::::;;;<<<<9;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:63:1265:820 147 chr1 1480 99 35M = 1320 -195 TGTCTTGACACCCAACTAATATTTGTCTGAGCAAA <<<<<<3<<1<<<<<<<7<<<<<<<<<<<<<<<+< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:102:884:63 83 chr1 1481 99 35M = 1341 -175 GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA <;7;;<<8<;8;<<<8<<<<<<8<<<8;<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:50:1339:1154 83 chr1 1481 99 35M = 1305 -211 GTCTTGACACCCAACTAATATTTGTCTGAGCAAAA 7;7;8;<5<:86<<;<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:30:117:411 83 chr1 1482 99 36M = 1309 -209 TCTTGACACCCAACTAATATTTGTCTGAGCAAAACA ;88<<<<<:<7<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:150:508:757 83 chr1 1483 99 35M = 1336 -182 CTTGACACCCAACTAATATTTGTCTGAGCAAAACA 6;;;<8<6;8<<8<<<<<;<<<<;<<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:6:1067:91 83 chr1 1483 99 35M = 1325 -193 CTTGACACCCAACTAATATTTGTCTGAGCAAAACA 3<;<<:;9;<<7;;<;<<<;<<<;<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:71:85:629 83 chr1 1484 99 35M = 1324 -195 TTGACACCCAACTAATATTTGTCTGAGCAAAACAG ,,1<1<7&%<9+:<<9<<9<<<<<<<<5<<<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:319:165:698 147 chr1 1485 99 35M = 1287 -233 TGACACCCAACTAATATTTGTCTGAGCAAAACAGT ;5;2;<:;<<:<<<<<<<<<;:;<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:60:182:718 83 chr1 1485 99 35M = 1295 -225 TGACACCCAACTAATATTTGTCTGAGCAAAACAGT <<<:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:82:932:400 147 chr1 1486 97 35M = 1313 -208 GACACCCAACTAATATTTGTCTGAGCAAAACAGTC <<;<<72<<7<<<<<<<<<<;<<<+7<<<<<<<<< MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:23:502:103 83 chr1 1486 99 35M = 1294 -227 GACACCCAACTAATATTTGTCTGAGCAAAACAGTC 4:386:6<:::<:<:4:+<::4<<<6<<<<<<<66 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:139:331:63 147 chr1 1486 99 35M = 1327 -194 GACACCCAACTAATATTTGTCTGAGCAAAACAGTC 7===================:=:============ MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:53:156:845 147 chr1 1487 99 35M = 1311 -211 ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT 171(*00,0;;&;7=77=;5;;(;1:=5======= MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:47:471:858 83 chr1 1487 99 35M = 1335 -187 ACACCCAACTAATATTTGTCTGAGCAAAACAGTCT /;9<<63<<<<3<;<<<<<<<<<<<<<<<<<<<9< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:9:203:653 83 chr1 1488 99 35M = 1296 -227 CACCCAACTAATATTTGTCTGAGCAAAACAGTCTA 37))&<8<<<<<7<4<;<777<<:<<<<<<<<;<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:1:199:760:42 83 chr1 1489 24 35M = 1318 -206 ACCCAATTAATATTTTTCTTAGCAAAACAGTCTAG 58*5.<+<<<<,4<<**<90**9<<<<<<4<<<<< MF:i:18 Aq:i:24 NM:i:3 UQ:i:34 H0:i:0 H1:i:0
+EAS218_1:4:37:1626:862 83 chr1 1489 99 35M = 1321 -203 ACCCAACTAATATTTGTCTGAGCAAAACAGTCTAG :663<<3<<<<<<<<<<:<<<<7<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:191:948:257 83 chr1 1493 99 35M = 1325 -203 AACTAATATTTGTCTGAGCAAAACAGTCTAGATGA :;;;;<<<<<<5<5<<<<<<<<7<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:171:343:758 147 chr1 1494 99 36M = 1331 -199 ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAGA :+;;<<<<<;<;:<<<;;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:9:1595:1826 147 chr1 1494 99 35M = 1316 -213 ACTAATATTTGTCTGAGCAAAACAGTCTAGATGAG ;76;;6:9<9<963;<<7<<<<<<<;<;<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:7:1547:1933 83 chr1 1497 99 35M = 1308 -224 AATATTTGACTGAGCAAAACAGTCTAGATGAGAGA <<<<<<<<-<<<<<:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS51_64:3:67:782:132 147 chr1 1498 99 35M = 1343 -190 ATATTTGTCTGAGCAAAACAGTCTAGATGAGAGAG ;;<;;;<<;;<<<;<<<;<<<;<<<<<<<<<<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:249:986:224 147 chr1 1499 99 35M = 1325 -209 TATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGA <<<3<;<;;<<;8<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:61:702:720 83 chr1 1500 99 35M = 1320 -215 ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA <<<4<4+0;<<:<<<<<<<<-<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:113:43:634 83 chr1 1500 99 35M = 1340 -195 ATTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAA ;9;1;<5:<<<%<<<<;<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS56_53:7:22:22:934 83 chr1 1500 99 35M = 1332 -203 ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA <+72::72<<60<<<<<<<96<<<<0<<<<1<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:36:678:316 147 chr1 1500 99 35M = 1328 -207 ATTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAA <<72.2,;;<)6<<<<:<<;;<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:102:825:507 83 chr1 1501 99 35M = 1330 -206 TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC <05<<<<<<<7<<<<<<<<<<<<<7<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:261:504:780 83 chr1 1501 99 35M = 1337 -199 TTTGTCTGAGAAAAACAGTCTAGATGAGAGAGAAC 80;8(;0==8+====;==49=============== MF:i:18 Aq:i:43 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS51_78:7:270:448:491 147 chr1 1501 99 35M = 1313 -223 TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAAC 7;;;;+2;<<+<<<<<<<<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:51:506:878 83 chr1 1501 99 36M = 1314 -223 TTTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACT <970;49;<;+<<<:<<<;;<<<<<<<<<<<<<<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:73:936:1509 83 chr1 1502 99 40M = 1322 -220 TTGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT 99;66:<<;-<<<<:<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:41:576:1016 83 chr1 1503 99 35M = 1320 -218 TGTCTGAGCAAAACAGTCTAGATGAGAGAGAACTT :<;<<<<<6<<<<;<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:123:610:472 147 chr1 1504 99 35M = 1333 -206 GTCTGAGCAAAACAGTCTAGATGAGAGAGAACTTC :<::+<<9<<9<<<<=<<<<<=<<<<<<<<?<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:308:354:124 147 chr1 1507 99 35M = 1331 -211 TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT %+<)2<<<<<<<<8<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:11:1274:1230 83 chr1 1507 99 35M = 1327 -215 TGAGCAAAACAGTCTAGATGAGAGAGAACTTCCCT .<<<<<<<<<<<<<<<<5<<<<<<<<<<5<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:169:292:652 147 chr1 1510 99 35M = 1306 -239 GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA 79919-<-<<<<<<<<<<<<<<<<<<<6<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:18:376:416 83 chr1 1510 99 35M = 1326 -219 GCAAAACAGTCTAGATGAGAGAGAACTTCCCTGGA 70<<<<<<<7<7<<<2<<<<<<<<<<8<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:194:168:684 147 chr1 1512 99 36M = 1340 -208 AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT ;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:73:273:488 83 chr1 1512 99 35M = 1318 -229 AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAGG </<<:<<9;;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:324:515:230 83 chr1 1512 99 34M = 1339 -207 AAAACAGTCTAGATGAGAGAGAACTTCCCTGGAG 7<<1<<<7<+<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:1:209:345:87 83 chr1 1513 99 35M = 1360 -188 AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT <<;<<<<5<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:73:42:1038 83 chr1 1513 99 35M = 1349 -199 AAACAGTCTAGATGAGAGAGAACTTCCCTGGAGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:209:778:588 83 chr1 1514 99 36M = 1326 -224 AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT ;8;98;;;<3<<<<<<<<<;<<;<<<<<;<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:1:115:683:296 147 chr1 1514 99 35M = 1320 -229 AACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTC <<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:92:213:217 147 chr1 1515 99 35M = 1333 -217 ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT <<<<<:<<<<<<<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:177:562:806 147 chr1 1515 99 35M = 1356 -194 ACAGTGTAGATGAGAGAGACCTTCCCTGGAGGTCT )2<9;'/:<5<<<:<<:<:&5:&<8,<<+:<&<<< MF:i:18 Aq:i:35 NM:i:2 UQ:i:11 H0:i:0 H1:i:1
+EAS1_103:3:320:505:814 147 chr1 1515 99 35M = 1350 -200 ACAGTCTAGATGAGAGAGAACTTCCCTGGAGGTCT <2<;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:9:206:901 147 chr1 1517 99 35M = 1344 -208 AGTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGA <<<<<<<<<<<<<.<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:71:707:568 83 chr1 1518 99 35M = 1332 -221 GTCTAGATGAGAGAGAACTTCCCTGGAGGTCTGAT ;9;<;<<<<<;<<<<<;<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:91:856:504 147 chr1 1520 99 35M = 1366 -189 CTAGATGAGAGAGAACTTCCCTGGAGGTCTGATGG :::<<:<<<<<<<<<<<<<<<<<<<<<:<:<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:77:48:860 147 chr1 1521 99 35M = 1348 -208 TAGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC ;8;8;<9<9<<<<<<<<<4<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:16:434:204 83 chr1 1522 99 34M = 1340 -216 AGATGAGAGAGAACTTCCCTGGAGGTCTGATGGC <:7:<<<<<<<<<<<9<<<+<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:43:1047:1626 83 chr1 1523 99 35M = 1369 -189 GATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGT <<4<<<<<<<<<<<:<<<;<<<<<:<7<<;<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:81:1723:1820 147 chr1 1524 99 35M = 1335 -224 ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT ;6;;;<<<<<<<<<<<2<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:63:267:545 83 chr1 1524 99 35M = 1354 -205 ATGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:90:406:631 83 chr1 1525 99 35M = 1335 -225 TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTT <<<:<:<<<-<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:14:420:712 147 chr1 1525 99 40M = 1368 -197 TGAGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCC 1::::<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:2:434:715 83 chr1 1527 99 35M = 1363 -199 AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT <<<<<<<<<:;<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:117:857:942 147 chr1 1527 99 35M = 1372 -190 AGAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCT <<;<<<<<<<9<<<8<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:70:348:972 83 chr1 1528 99 35M = 1343 -220 GAGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTC <99<-7<<7<<<87<<<)<<<<<<8<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:132:717:233 147 chr1 1529 99 35M = 1368 -196 AGAGAACTTCCCTGGAGGTCTGATGGAGTTTCTCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS188_7:4:21:443:404 147 chr1 1529 99 35M = 1345 -219 AGAGAACTTCCCTGGAGGTCTGATGGCGTTTCTCC =9=9=9==:========================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:148:286:316 83 chr1 1531 99 35M = 1347 -219 AGAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCT ;::::;9/:<9<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:85:1224:625 147 chr1 1532 99 35M = 1331 -236 GAACTCCCCTGGAGGTCTGATGGCGTTTCTCCCTC 17;;7&-;<;<;:<6<<:;<<<<<<<;<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS221_1:8:73:108:1621 147 chr1 1532 99 35M = 1373 -194 GAACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTC <<8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:73:182:444 147 chr1 1533 99 35M = 1354 -214 AACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCG :1<4;;::<<;<<<<;<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:152:765:744 83 chr1 1534 99 35M = 1374 -195 ACTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGT 6<;6<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:170:326:433 147 chr1 1535 99 35M = 1367 -203 CTTCCCTGGAGGTCTGATGGCGTTTCTCCCTCGTC :44<<<<<<<<<<:6<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:8:4:841:340 73 chr2 1 99 36M * 0 0 TTCAAATGAACTTCTGTAATTGAAAAATTCATTTAA <<<<<<<<;<<<<<<<<;<<<<<;<;:<<<<<<<;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:4:142:943:582 73 chr2 1 99 35M * 0 0 TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA <<<<<<;<<<<<<:<<;<<<<;<<<;<<<:;<<<5 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:43:859:229 153 chr2 1 66 35M * 0 0 TTCAAATGAACTTCTGTAATTGAAAAATTCATTTA +37<=<.;<<7.;77<5<<0<<<;<<<27<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:286:923:549 73 chr2 2 99 35M * 0 0 TCAAATGAACTTCTGTAATTGAAAAATTCATTTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:117:578:853 73 chr2 5 99 35M * 0 0 AATGAACTTCTGTAATTGAAAAATTCATTTAAGAA <;<9<<<<<;<<;<<<<<<<<<<<,<98;<;;&92 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:289:472:86 137 chr2 6 99 35M * 0 0 ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:302:997:951 73 chr2 6 69 35M * 0 0 ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA <<<<<<<<<<;<<:<<52<<:;;<6<<;<:<2:9/ MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:13:1729:1844 73 chr2 6 99 35M * 0 0 ATGAACTTCTGTAATTGAAAAATTCATTTAAGAAA <<<;;<;7<<<<4<<<<762;6<<<<<<<;6;618 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:43:239:977 137 chr2 7 99 36M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;7;<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:233:191:520 73 chr2 7 99 35M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2<8<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:75:555:1591 137 chr2 7 99 35M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:43:656:1866 137 chr2 7 99 35M * 0 0 TGAACTTCTGTAATTGAAAAATTCATTTAAGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;:; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:100:563:301 137 chr2 8 99 35M * 0 0 GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;8;;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:126:526:276 137 chr2 8 84 35M * 0 0 GAACTTCTGTAATTGAAAAATTCATTTAAGAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:161:366:544 137 chr2 11 99 35M * 0 0 CTTCTGTAATTGAAAAATTCATTTAAGAAATTACA <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:326:652:890 73 chr2 12 99 35M * 0 0 TTCTGTAATTGAAAAATTCATTTAAGAAATTACAA <<<<<<<<<<2<<<<<<<<<<<<<<+<8:<<9998 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:238:441:727 73 chr2 16 99 35M * 0 0 GTAATTGAAAAATTCATTTAAGAAATTACAAAATA <<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<;;<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:64:507:478 137 chr2 17 99 35M * 0 0 TAATTGAAAAATTCATTTAAGAAATTACAAAATAT <<<<<;<<<<<<<<<<<<<<<;;;<<<;<<8;<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:8:118:440:850 137 chr2 18 99 35M * 0 0 AATTGAAAAATTCATTTAAGAAATTACAAAATATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<949<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:270:995:918 137 chr2 24 84 35M * 0 0 AAAATTCATTTAAGAAATTACAAAATATAGTTGAA <<<<<<<<<<<<<:<<<<<<8<8<8<<<<:<;4;4 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:305:819:245 73 chr2 25 98 35M * 0 0 AAATTCATTTAAGAAATTACAAAATATAGTTGAAA 8<<<<8<;<<<<<;<8<<8<8<<<<8<<<899<<+ MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_26:7:13:172:720 73 chr2 26 99 35M * 0 0 AATTCATTTAAGAAATTACAAAATATAGTTGAAAG ============:3<==:====<=9=3===;==83 MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_63:7:34:334:825 73 chr2 30 99 35M * 0 0 CATTTAAGAAATTACAAAATATAGTTGAAAGCTCT <<<<<<<<<<<<<<<<<<<<<<<<3;<<<<6<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:32:1379:738 137 chr2 33 99 35M * 0 0 TTAAGAAATTACAAAATATAGTTGAAAGCTCTAAC ;;;;;;;8;;;;;;;;;;;;;;;;;;;;;;88888 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:5:70:318:1631 137 chr2 34 99 40M * 0 0 TAAGAAATTACAAAATATAGTTGAAAGCTCTAACAATAGA <<<<<<;<<<<<<<<<<<<;9:<<<<<<<<<<<<<:::78 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:285:241:560 163 chr2 37 99 35M = 200 198 GAAATTACAAAATATAGTTGAAAGCTCTAACAATA <<<<<<<<<<;<<<<;<<<<<<<<<<<<;<;;;<. MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:168:389:889 99 chr2 37 99 36M = 205 204 GAAATTACAAAATATAGTTGAAAGCTCTAACAATAG <<<<<<<<<<<<<<<<<<<<;<<<<<<<;9;;<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:127:725:381 163 chr2 39 99 35M = 209 204 AATTACAAAATATAGTTGAAAGCTCTAACAATAGA <<<<<<<<<<<<<<<<<<<<<;<<<<;;;;;<<8: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_93:5:66:372:343 163 chr2 40 99 35M = 228 223 ATTACAAAATATAGTTGAAAGATCTAACAATAGAC <<<<<<<<<<8<<<<<6<<<8&8<<<<<58<:<:: MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS56_65:6:67:800:450 99 chr2 41 99 35M = 221 215 TTACAAAATATAGTTGAAAGCTCTAACAATAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:90:1906:1528 163 chr2 41 99 35M = 222 216 TTACAAAATATAGTTGAAAGCTCTAACAATAGACT <<<<<<<<<<<<<<<:<<<:<<<<;<<<<<;:7:; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:117:284:589 163 chr2 43 99 35M = 210 202 ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA ==================================0 MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:26:211:481 99 chr2 43 99 35M = 222 214 ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA <<<<<<<<<<<<<<<<<<<<<<<7<<<<<:<7<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:85:923:726 99 chr2 43 99 35M = 199 191 ACAAAATATAGTTGAAAGCTCTAACAATAGACTAA <<<<<<<7<<<<<<<<<<<55<<<9<*<<<991<4 MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:107:395:312 163 chr2 44 99 35M = 224 215 CAAAATATAGTTGAAAGCTCTAACAATAGACTAAA <<<<<<<<<<<<<<<<<<<<<<<<<;<;;<:<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_597:7:5:753:806 163 chr2 45 99 35M = 197 187 AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC <<<<<<<<<<<<<<<<<<<<<<<<<<7:-<;;3;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_103:3:277:921:474 163 chr2 45 99 35M = 241 231 AAAATATAGTTGAAAGCTCTAACAATAGACTAAAC <<<<<<<<<<<<<<<:<<<<<<<<<<<5<<;;;;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_63:4:38:28:122 163 chr2 46 99 35M = 227 216 AAATATAGTTGAAAGCTCTAACAATAGACTAAACC <<<<<<;<<<<<<<;<<<<6<<<<<<:<<<<;;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS221_3:8:50:1203:1094 163 chr2 46 99 35M = 223 212 AAATATAGTTGAAAGCTCTAACAATAGACTAAACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_591:2:223:583:968 99 chr2 47 88 36M = 215 204 AATATAGTTGAAAGCTCTAACAATAGACTAAACCAA <<<<<<<29<<<<4<<<<<<<<<<<7<<7<..<<47 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:1:28:350:895 163 chr2 48 95 35M = 215 202 ATATAGTTGAAAGCTCTAACAATAGACTAAACCAA <<<<<<<<;<;<<<<<<<<<;;<<;<<<<<;;<;8 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_45:7:69:1130:832 99 chr2 50 94 35M = 231 216 ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC ;;2<;<;;<;9;<;;;;;;;7;8;;7;;;;77437 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS188_7:3:296:224:724 163 chr2 50 99 35M = 234 219 ATAGTTGAAAGCTCTAACAATAGACTAAACCAAGC <<<<;<<<<<<7;<<<<<6<<<06<<<<<<2(<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_595:4:319:250:718 163 chr2 52 99 35M = 240 223 AGTTGAAAGCTCTAACAATAGACTAAACCAAGCAG <<<<<<<<<<<;<<5<5;<851;85;)9;;8594; MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_73:3:203:419:243 163 chr2 54 99 35M = 237 218 TTGAAAGCTCTAACAATAGACTAAACCAAGCAGAA <<<<<<<<<<<<<<<9<;<8<<<;<<<;<<<4<77 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:21:1601:1666 163 chr2 56 99 40M = 228 212 GAAAGCTCTAACAATAGACTAAACCAAGCAGAAGAAAGAG 7<<<<<<<<:<<7<<<:<<<<<<4<<44<<914<;:5::: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:158:943:467 163 chr2 57 99 35M = 225 203 AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA <<<<<;<<<<<<<<<<<<<<;;<<<<<<<<<;8<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:54:91:1232 99 chr2 57 99 35M = 246 224 AAAGCTCTAACAATAGACTAAACCAAGCAGAAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:29:833:612 163 chr2 58 99 35M = 224 201 AAGCTCTAACAATAGACTAAACCAAGCAGAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<<;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:1:189:503:110 163 chr2 63 79 35M = 229 201 CTAACAATAGACTAAACCAAGCAGAAGAAAGAGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:< MF:i:18 Aq:i:0 NM:i:1 UQ:i:25 H0:i:2 H1:i:0
+EAS114_28:2:114:938:216 99 chr2 63 99 36M = 218 191 CTAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_95:5:257:654:116 99 chr2 64 99 35M = 231 202 TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<<<<<<<<<<<<<<;:<<<<<<<<<88 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_97:3:277:144:848 163 chr2 64 99 35M = 228 199 TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<;<<<<<<<<<<<<<<<<<3<<9;;6; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_108:4:75:166:463 99 chr2 64 99 35M = 250 221 TAACAATAGACTAAACCAAGCAGAAGAAAGAGGTT <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<++3 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:4
+B7_610:5:102:915:87 99 chr2 65 99 35M = 222 192 AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC <<<<<<<<<<<<<<<<<<<<;<<<<<3<<;<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:3 H1:i:0
+EAS54_71:3:78:855:352 163 chr2 65 99 35M = 240 209 AACAATAGACTAAACCAAGCAGAAGAAAGAGGTTC <<<<<<<<;<<<<<<<<<;<<<<<<<<;<;<<:<: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:3 H1:i:0
+EAS56_57:2:206:873:186 163 chr2 66 99 35M = 227 196 ACAATAGACTAAACCAAGCAGAAGAAAGAGGTTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;53 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_93:6:238:514:194 163 chr2 68 99 35M = 265 232 AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<;<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:3:285:489:327 99 chr2 68 99 35M = 233 200 AATAGACTAAACCAAGCAGAAGAAAGAGGTTCAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_67:1:15:381:715 99 chr2 72 99 35M = 237 200 GACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTT ;=====;===9==;===9;;;=4;9=====;==== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:199:818:124 99 chr2 73 99 35M = 266 228 ACTAAACCAAGCAGAAGAAAGAGGTTCAGAACTTG <<<<<<<<<<<<<<<<<;<<;<<;7<<<<<<9<9; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:182:1002:639 163 chr2 77 99 35M = 246 204 AACCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGA <<<<<<<<<<<<<<<<<<<<<9-<<<<4<;<;;<; MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:945:2005 163 chr2 77 99 35M = 262 220 AACCAAGCAGAAGAAAGAGGCTCAGAACTTGAAGA <<<<<<<<<<<<<<<<<<<<%<<<<<<;<<<<<<< MF:i:18 Aq:i:44 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+B7_591:5:254:542:848 99 chr2 79 99 36M = 233 190 CCAAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAA <<<;<<<<<<<<<<<<<<<;4<;8<<<;;9<9;8;9 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:71:517:742 99 chr2 81 99 35M = 266 220 AAGCAGAAGAAAGAGGTTCAGAACTTGAAGACAAG <<<<<<<<<<<<;<<<<<<<<<<<<<48:4<<<<3 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:254:617:73 163 chr2 83 99 35M = 266 218 GCAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTC <<<<<<<<<<<<<<<<<<<<<<<<<;<<<6;:;4% MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:13:1507:1146 99 chr2 84 99 35M = 278 229 CAGAAGAAAGAGGTTCAGAACTTGAAGACAAGTCT ;<9;;;;<<;;;;<<;<;;;;<;;<<;<;<99777 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:32:686:735 99 chr2 84 78 35M = 255 206 CAGAAGAAAGAGGTTCANANNNTGANGACAAGTCT <<<<<<<<<<<<<<<<<!<!!!<<<!<<<<<<<<< MF:i:130 Aq:i:78 NM:i:5 UQ:i:0 H0:i:0 H1:i:0
+EAS56_57:3:112:729:591 99 chr2 86 99 35M = 283 232 GAAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:17:1222:783 163 chr2 87 99 35M = 251 199 AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCGT <<<<<<<)<<<16<<;<<<6<4<:<4<+://<7)< MF:i:18 Aq:i:59 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS188_7:6:46:122:479 99 chr2 87 99 35M = 248 196 AAGAAAGAGGTTCAGAACTTGAAGACAAGTCTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:313:531:169 163 chr2 89 99 36M = 250 197 GAAAGAGGTTCAGAACTTGAAGACAAGTCTCTTATG <<<<<<<<<<<<<;<<<<<<<<<<<:<<:<;<<;<2 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:148:170:895 99 chr2 91 99 35M = 247 191 AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA <<<<<<<<<<9<<<<<6<<<<<<<<<<<<<<<<6< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:34:380:815 163 chr2 91 99 35M = 283 227 AAGAGGTTCAGAACTTGAAGACAAGTCTCTTATGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:210:809:735 163 chr2 93 99 35M = 291 233 GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<5<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:40:925:442 163 chr2 93 99 35M = 271 213 GAGGTTCAGAACTTGAAGACAAGTCTCTTATGAAT ;<;<<<<<<<<<<<3;<7;:<;;<<<;<<:<32<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:169:256:888 163 chr2 94 99 35M = 270 210 AGGTTCAGAACTTGAAGACAAGTCTCTTATGAATT <<<<<<<<<<<<<<<<<<<<<<;;<;<<;<<:;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:117:156:84 99 chr2 95 99 35M = 285 225 GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:35:522:294 163 chr2 95 99 35M = 272 212 GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA ===============================:=:= MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:41:653:1568 163 chr2 95 99 35M = 266 206 GGTTCAGAACTTGAAGACAAGTCTCTTATGAATTA ;;;;;;;8;;;;;;;;;;;;;;;;;;;;;;88888 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:178:276:693 163 chr2 96 99 36M = 259 199 GTTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:223:440:667 99 chr2 97 99 35M = 282 220 TTCAGAACTTGAAGACAAGTCTCTTATGAATTAAC <<<<<<<<<<<<<<<<<<<;<<<<<<<<;<<<<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:194:470:416 99 chr2 98 99 35M = 265 202 TCAGAACTTGAAGACAAGTCTCTTATGAATTAACC <<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:61:1000:1534 163 chr2 104 99 35M = 286 217 CTTGAAGACAAGTCTCTTATGAATTAACCCAGTCA <<<<4:<:<1)<<<<<<<+<:44<</7<<<)4:<) MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:145:383:182 163 chr2 105 99 35M = 291 221 TTGAAGACAAGTCTCTTATGAATTAACCCAGTCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;;<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:63:816:921 163 chr2 106 99 35M = 291 220 TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<4<846 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:77:1780:693 99 chr2 106 99 40M = 276 210 TGAAGACAAGTCTCTTATGAATTAACCCAGTCAGACAAAA <<<<<<<<<<<<;<<:<<;<<<<<<<<<<<<;<<<;;:69 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:215:861:605 163 chr2 107 94 36M = 262 191 NAAGACAAGTCTCTTATGAATTAACCCAGTCAGACA !+++++++++++++++++++++++++++++++++++ MF:i:18 Aq:i:19 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS221_3:2:22:1623:709 99 chr2 107 99 35M = 287 215 GAAGACAAGTCTCTTATGAATTAACCCAGTCAGAC <<<<<<<<<7<<<<<<<:<<<<<<<<:85:<:2<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:54:436:1452 163 chr2 108 99 35M = 275 202 AAGACAAGTCTCTTATGAATTAACCCAGTCAGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<;<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:42:333:516 163 chr2 109 99 35M = 296 222 AGACAAGTCTCTTATGAATTAACCCAGTCAGACAA <<<<<5<*<2<<<<<<<<<<<<<<<<<<<<<<<</ MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:119:730:190 99 chr2 114 99 35M = 301 222 AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA <<<9<;;<<<;<<<<<<<8<<<1<<918<;;;<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:63:727:203 99 chr2 114 99 35M = 278 199 AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:27:577:849 163 chr2 114 99 35M = 316 237 AGTCTCTTATGAATTAACCCAGTCAGACAAAAATA <<<<<<<<<<<<<<<<<<<<;:<<<;<<<<<<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:5:259:250 99 chr2 115 99 35M = 269 189 GTCTCTTATGAATTAACCCAGTCAGACAAAAATAA <<<<<<<<<<<<<<<<<<<<;<<<;5<<5<;7<:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:17:989:186 99 chr2 120 91 35M = 299 214 TTATGAATTAACCCAGTCAGACAAAAATAAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<:<<;<7;:::: MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_45:2:33:1445:1357 99 chr2 121 85 35M = 299 213 TATGAATTAACCCAGTCAGACAAAAATAAAGAAAA ;;<;<<<<<<;;;<9:;:;;;;;:;:;;;;99777 MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:7
+EAS221_3:4:30:1452:1563 163 chr2 122 94 35M = 313 226 ATGAATTAACCAAGTCAGACAAAAATAAAGAAAAA <<<<<<<<<<<<<<:<<<<1<<<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_45:1:77:1000:1780 163 chr2 123 66 35M = 279 191 TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA ;;;:;;;;;;;/;;;7:4;;7;;;;;;;;;77777 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:6 H1:i:47
+EAS114_45:4:48:310:473 99 chr2 123 66 35M = 298 210 TGAATTAACCCAGTCAGACAAAAATAAAGAAAAAA <<<;<<;;;<<;;<;;;;;;;;;;;;;;;;89799 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:6 H1:i:47
+B7_591:2:279:124:41 99 chr2 124 69 36M = 307 219 GAATTAACCCAGTCAGACAAAAANNAAGAAAAAAGA <<<<<<<7/<8<<<<<<<<<<4*!!<<7<7<<5<<3 MF:i:18 Aq:i:0 NM:i:2 UQ:i:0 H0:i:0 H1:i:0
+EAS112_32:8:89:254:332 163 chr2 124 76 35M = 291 202 GAATTAACCCAGTCAGACAAAAATAAAGAAAAAAG ==================;=========;=7;;<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:4 H1:i:36
+B7_597:7:103:731:697 99 chr2 125 72 35M = 304 214 AATTAACCCAGTCAGACAAAAATAAAGAAAAAAGA <<<<<<<<<<<<<<<<<<:<:<<6<<<<<<<:<;: MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:9 H1:i:55
+EAS139_11:2:71:83:58 163 chr2 148 77 9M2I24M = 349 236 AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:77 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS192_3:4:63:5:870 163 chr2 148 75 9M2I24M = 330 217 AAAGAAAAAAGAATTTTAAAAATGAACAGAGCTTT <<;<<<<<<<<<<<<<<<<<;<<<<<<<<<;;<<< MF:i:130 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS139_19:2:29:1822:1881 163 chr2 150 74 7M2I31M = 328 218 AGAAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAGAAG <<<<<<<<<<<<4<<<<<<<<<<<<<<:<<<:<<;::::: MF:i:130 Aq:i:74 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS221_3:2:100:1147:124 163 chr2 150 99 35M = 345 230 AAAAAAGAATTTTAAAAATGAACAGAGCTTTCAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<< MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS192_3:8:6:104:118 163 chr2 154 99 35M = 323 204 AAGAATTTTAAAAATGAACAGAGCTTTCAAGAAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<=<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_593:6:185:96:948 99 chr2 160 99 36M = 324 200 TTTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT <<<<<<<<<;6<<<<<<<<<;<<<;;<<<<<<<;<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:7:213:309:373 163 chr2 161 99 35M = 317 191 TTAAAAATGAACAGAGCTTTCAAGAAGTATGAGAT <;<<<<<<;<7<<<<<-<<<<<<<<<<<<<<4<7< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:30:466:652 99 chr2 163 98 35M = 332 204 AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA <<<<<<<<<<<<<<<<<<<<<<<<;<<<4;7<<<7 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:156:21:69 163 chr2 163 99 35M = 362 234 AAAAATGAACAGAGCTTTCAAGAAGTATGAGATTA <<<<<<<<<<<<<<<<<<<<<<<:<4<<<:<;<;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:197:52:58 163 chr2 165 99 35M = 323 193 AAATGAACAGAGCTTTCAAGAAGTATGAGATTATG <<<<<<<<<<<<<<<<<<9<<<<2<<<<<<;<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:214:946:229 163 chr2 165 99 35M = 339 209 AAATGAACAGAGCTTTCAAGAAGTATGATATTATG <<<<<<<<<<<<<<<<<::<;;;<;<;7<:<<7<2 MF:i:18 Aq:i:65 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+EAS192_3:4:293:168:240 99 chr2 167 99 35M = 340 208 ATGAACAGAGCTTTCAAGAAGTATGAGATTATGTA <<<<;<<<;;;<;<<;;;<<;;<<::::<<;;+;7 MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:208:118:673 99 chr2 169 76 35M = 332 198 GAACAGAGCTTTCAAGAAGTATGAGATTATGTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:71:478:175 163 chr2 171 99 35M = 317 181 ACAGAGCTTTCAAGAAGTATGAGATTATGTAAAGT <<<<<<<<<<<;<<<<<;<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:177:24:389 163 chr2 175 99 35M = 365 225 AGCTTTCAAGAAGTATGAGATTATGTAAAGTAACT <<<<<<<<<<<<<<<<<<<<<<<<7<;;<;9969; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:14:1211:1332 163 chr2 178 99 35M = 351 208 TTTCAAGAAGTATGAGATTATGTAAAGTAACTGAA ;;.;;;;;;;3;;;;;6;;;;;;8;;;;;;63777 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:324:238:736 163 chr2 180 99 35M = 367 222 TCAAGAAGTATGAGATTATGTAAAGTAACTGAACC =================================== MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:9:648:712 99 chr2 182 99 35M = 358 211 AAGAAGTATGAGATTATGTAAAGTAACTGAACCTA <9<;<<<<<<<;<<<<<8<<<<9<<;<<8)<:1<: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:41:1308:619 163 chr2 184 99 35M = 360 211 GAAGTATGAGATTATGTAAAGTAACTGAACCTATG <6+<*<<<<<<<:<<<<<<<:<<&<<<<1<6<11: MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:328:537:640 99 chr2 185 99 35M = 352 202 AAGTATGAGATTATGTAAAGTAACTGAACCTATGA <;<<<<<<;<<<<<<<<<:;<<8<<<;:<<<;<;9 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:86:697:941 163 chr2 187 99 35M = 341 189 GTATGAGATTATGTAAAGTAACTGAACCTATGAGT =====================<=<==<<====;=5 MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:224:592:744 99 chr2 188 99 35M = 383 230 TATGAGATTATGTAAAGTAACTGAACCTATGAGTC <<<<<<<<<<<<<<<<;<<<<<7<<<<<<<&<*<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:135:354:66 99 chr2 188 99 35M = 356 203 TATGAGATTATGTAAAGTAACTGAACCTATGAGTC <<<<<<<<<<<<<<<<;<<<<<<<<<<;<<2<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:71:311:202 163 chr2 188 99 35M = 379 226 TATGAGATTATGTAAAGTAACTGAACCTATGAGTC <<<<<<<<<<<<<<<<:4<<<<<<<<<<<<8;4;: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:50:30:15 99 chr2 192 39 35M = 358 201 AGATTATGTAAAGTAACTTAACCTATGAGTCCAAG +:79.68872.:9&:92/.299169/5+/6/3/&2 MF:i:18 Aq:i:10 NM:i:3 UQ:i:45 H0:i:0 H1:i:1
+EAS192_3:5:287:334:110 73 chr2 196 73 35M = 196 0 TATGTAAAGTAACTGAACCTATGAGTCACAGGTAT <<<<<<<<<<<<<<<<<<4;<<<<<<<::6<55:. MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:287:334:110 133 chr2 196 0 * = 196 0 GATGAATACTAAGATTGATGTAGCAGCTTTTGCAA .5+7)09<))&-&:33953<-./&&&)((;+3399 MF:i:192
+B7_597:7:5:753:806 83 chr2 197 99 35M = 45 -187 ATGTAAAGTAACTGAACCTATGAGTCACAGGTATT ;:<:<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:149:572:877 163 chr2 197 99 36M = 334 173 ATGTAAAGTAACTGAACCTATGAGTCACAGGTATTC =>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<<<</<<<<<</<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_57:1:189:503:110 83 chr2 229 79 35M = 63 -201 ATTCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGA =;;6:============================== MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:5:257:654:116 147 chr2 231 99 35M = 64 -202 TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA 0+37<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:69:1130:832 147 chr2 231 94 35M = 50 -216 TCCTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAA 6)377;3;;;;;;;;;1;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:254:542:848 147 chr2 233 99 36M = 79 -190 CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC ,:4<8<<<<<<<<<<<<<;:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:285:489:327 147 chr2 233 99 35M = 68 -200 CTGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAA 9;;<<8<<<<<<<<<<<<;<<<<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:163:611:211 163 chr2 234 99 35M = 405 206 TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC ============8===============;=6;;<; MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:296:224:724 83 chr2 234 99 35M = 50 -219 TGAGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAAC 8<<<5<<<<<<<<<<<<<<<<<<<<7<<<<<;<9< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:58:271:612 99 chr2 236 99 35M = 415 214 AGGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTA <;<<<<<<<<<7<<<<<<<<<<<<<<+47<<;<:: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:15:381:715 147 chr2 237 99 35M = 72 -200 GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT <<<<<<<<<<<<<<9<<<<<<97;<<<<<<<<9<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:3:203:419:243 83 chr2 237 99 35M = 54 -218 GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:41:1281:1785 99 chr2 237 99 35M = 399 197 GGAAAAAGAAAAAGTGAGAAGTTTGGAAAAACTAT <<<<<<<<<<<<<<<<<<<<<;<<<;<<<<<<<8< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:218:858:445 99 chr2 239 99 35M = 421 217 AAAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT ;===5=;=======;==3======9;,79==;=== MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:4:319:250:718 83 chr2 240 99 35M = 52 -223 AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG <;:<<<<;<<<:<<<<<<49:<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:92:493:891 99 chr2 240 99 35M = 408 203 AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTG <<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<8 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:78:855:352 83 chr2 240 99 34M = 65 -209 AAAAGAAAAAGTGAGAAGTTTGGAAAAACTATTT 2<<<<<<<9<<4<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:277:921:474 83 chr2 241 99 35M = 45 -231 AAAGAAAAAGTGAGAAGTTTGGAAAAACTATTTGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:41:199:388 99 chr2 243 99 35M = 403 195 AGAAAAAGTGAGAAGTTTGGAAAAACTATTTGAGG ;;<<<<<;;<<<<<<;;<;;<<;;<<<<<<99999 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:307:481:625 99 chr2 245 99 36M = 410 201 AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;9<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:134:126:465 99 chr2 245 99 35M = 434 224 AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA <<<<<<<<<<<<<;<<<<<<<<<<<<<5<<:<<41 MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:44:153:969 163 chr2 245 95 35M = 447 237 AAAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAA *:::7<77<:<<<<:<<(597:<:<9//7<529/0 MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:182:1002:639 83 chr2 246 99 35M = 77 -204 AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG <<;;9;9<<<<<<;<7;<;<<<<;;<<<;<<7;<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:54:91:1232 147 chr2 246 99 35M = 57 -224 AAAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAG ;;;;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:204:737:61 163 chr2 247 99 35M = 437 225 AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT <<<<<<<<<<<<<<<<<<<<<<<<<:<<9<+4:<0 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:148:170:895 147 chr2 247 99 35M = 91 -191 AAAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGT <<9<<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:46:122:479 147 chr2 248 99 35M = 87 -196 AAGTGAGAAGTTTGGAAGAACTATTTGAGGAAGTA <<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS219_1:7:16:1343:1621 99 chr2 248 99 35M = 426 213 AAGTGAGAAGTTTGGAAAAACTATTTGAGGAAGTA <<<<<<<<8<<<<;<<<;<;<<<<<<<:;4;71:; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:313:531:169 83 chr2 250 99 36M = 89 -197 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT 98;<;;<<;8<<<<<<<<<<<8<<<<<<<<8<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:75:166:463 147 chr2 250 99 35M = 64 -221 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT <<<<<============================== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:130:260:553 99 chr2 250 99 34M = 439 224 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGCAC <<<<<1<<<<<<<<<<6<<81</<4*2;7:+90( MF:i:18 Aq:i:42 NM:i:2 UQ:i:31 H0:i:1 H1:i:0
+EAS56_59:2:60:677:921 99 chr2 250 96 35M = 393 178 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:60:1037:1146 99 chr2 250 99 35M = 447 232 GTGAGAAGTTTGGAAAAACTATTTGAGGAAGTAAT <<<<<<<<<<<<<<<<<<<<<<<<<;<:;;;;;;< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:17:1222:783 83 chr2 251 99 35M = 87 -199 TGAGAAGTTTGGAAAAACTATTTGAGGAAGTAATT 6<<<8<69<8199<7<<<6<<<<<<<<<1:<:<<: MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:96:491:1891 163 chr2 253 99 35M = 409 191 AGAAGTTTGGAAAAACTATTTGAGGAAGTAATTGG <:<<<<<::<<<<<<<<<<<<<<<<:<<::7<<:7 MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:75:615:555 99 chr2 255 99 35M = 416 196 AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG <<<<<<<<<<<<<<<<<<<<<;<;<<<29<;.484 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:32:686:735 147 chr2 255 78 35M = 84 -206 AAGTTTGGAAAAACTATTTGAGGAAGTAATTGGGG <<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:65:85:1547 163 chr2 257 99 35M = 434 212 GTTTGGAAAAACTATTTGAGGAAGTAATTGGGGAA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<:<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:94:1655:1921 99 chr2 258 85 35M = 447 224 TTTGGAAAAACTATTTGAGGAAGTAATTGGGGAAA <<<8<<<<<<<<<8<<8;8<;<;<;;<<9+868<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_610:7:177:469:800 99 chr2 259 99 35M = 433 209 TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA <<<<<<<<<<<<<<<<<<<<<<<<;<<;;<<<;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:178:276:693 83 chr2 259 99 36M = 96 -199 TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAAC :;<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:14:697:541 99 chr2 259 99 35M = 432 208 TTGGAAAAACTATTTGAGGAAGTAATTGGGGAAAA <<<<<<<<<<<<<<<<<<<:<<<<<<<;;;;8;;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:37:156:134 163 chr2 261 99 35M = 443 217 GGAAAAACTATTTGAGGAAGTAATTGGGGAAAACC ;;;;;;;;;;9;;;;;;;;;;;;;;;9;;;77679 MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:215:861:605 83 chr2 262 94 36M = 107 -191 GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC ;<<<<<;:<7:<<<;<<<<<<<;:<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:945:2005 83 chr2 262 99 35M = 77 -220 GAAAAACTATTTGAGGAAGTAATTGGGGAAAACCT 7<<<<;;<<;<<<<<7<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:52:751:360 163 chr2 263 99 35M = 443 215 AAAAACTATTTGAGGAAGTAATTGGGGAAAACCTC <<<<<<<<<<<<<<<<<<<<<<<:76<<<<;9:;: MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:238:514:194 83 chr2 265 99 35M = 68 -232 AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT <<6<<<<:9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:194:470:416 147 chr2 265 99 35M = 98 -202 AAACTATTTGAGGAAGTAATTGGGGAAAACCTCTT <<<7<<;<<<<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:71:517:742 147 chr2 266 99 35M = 81 -220 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT <<<<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:254:617:73 83 chr2 266 99 35M = 83 -218 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT <<:<<<9;<<<;;<:<-<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:199:818:124 147 chr2 266 99 35M = 73 -228 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:41:653:1568 83 chr2 266 99 35M = 95 -206 AACTATTTGAGGAAGTAATTGGGGAAAACCTCTTT 977979;:;<;;;;;;<<5;<;<;<<<;;;;;;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:211:84:84 99 chr2 268 99 35M = 440 207 CTATTTGAGGAAGTAATTGGGGAAAACCTCTTTAG <<<<<<<<<<<<<<<<:<<:<<:<<<44<4<<9<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:152:355:962 163 chr2 269 99 35M = 456 222 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT <;<<<<<;8<<<<<<<<<;5;;88<<3<<<<<&0; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:285:395:450 99 chr2 269 99 35M = 458 224 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT <<<<<<<;<<<;<<<<<;:<:7<;<;7<7<<;;7< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:15:568:42 121 chr2 269 69 35M = 269 0 TTTTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT !!;:<8<;<<<8<<<<<<<<8<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:2 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:15:568:42 181 chr2 269 0 * = 269 0 TTTTTTTTTTTGTTTTTTTTTTTTTTTTTTTTATA !!!!!!!!!++++!!!!!!!!!!!!!!!!!!!,!, MF:i:192
+EAS192_3:8:6:237:885 99 chr2 269 99 35M = 433 199 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT <<<<<<<<9<<<<<<<<<<<<<<<<<<<<<;;;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:5:5:259:250 147 chr2 269 99 35M = 115 -189 TATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT 8<83;<<<<<<<<<<5<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:206:994:556 73 chr2 270 75 35M = 270 0 ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:206:994:556 133 chr2 270 0 * = 270 0 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:192
+EAS54_71:4:169:256:888 83 chr2 270 99 34M = 94 -210 ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGT &<<:<;<<;;<8<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:317:72:221 163 chr2 270 99 35M = 422 187 ATTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTC ===========;=======;;:==6=;=====;== MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:40:925:442 83 chr2 271 99 35M = 93 -213 TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT =;================================= MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:158:909:321 163 chr2 271 99 35M = 453 217 TTTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:35:522:294 83 chr2 272 99 35M = 95 -212 TTGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:176:971:874 163 chr2 273 76 35M = 432 195 TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG <<<<<<<<<<<<<:<;<<<<<<<<<<<<<5<<<<7 MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:226:869:36 99 chr2 273 99 35M = 461 223 TGAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTG :<<<<,:<;:.:<<:<<717,;2171717717116 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:106:595:322 163 chr2 274 99 35M = 440 201 GAGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:54:436:1452 83 chr2 275 99 35M = 108 -202 AGGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:77:1780:693 147 chr2 276 99 40M = 106 -210 GGAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGAT :**::799<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:147:423:584 99 chr2 277 99 35M = 451 209 GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;96 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:188:782:483 163 chr2 277 99 35M = 431 189 GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<7<;77 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:78:1314:1275 99 chr2 277 99 35M = 469 227 GAAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAG <<<<<<<<<<<<<<<<<<<<<6<<<<<<<<<<<<8 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:63:727:203 147 chr2 278 99 35M = 114 -199 AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA <<;7<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:13:1507:1146 147 chr2 278 99 35M = 84 -229 AAGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGA 88788;,;:-:2;;;;;;;;:;:;;;;;;;;;;;; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:77:1000:1780 83 chr2 279 66 35M = 123 -191 AGTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAG 777774;;4-7;;;;;;:;;;:;;;<;;;;<<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:93:490:901 163 chr2 280 99 35M = 445 200 GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA <<<<<<<<<<<<<;<<<<<<<;<<<<<:<<1+4-8 MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:227:657:95 99 chr2 280 99 35M = 458 213 GTAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<8<85 MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:57:324:546 163 chr2 281 99 36M = 458 213 TAATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT <<<<<<<<<<<<<<<<<<<<<:<<<8:8<<;::;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:223:440:667 147 chr2 282 99 35M = 97 -220 AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATT <<;;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:26:274:1078 163 chr2 282 99 40M = 458 216 AATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC <<<2<<<<<<<<<<<<<<<<<<<<<<<<<;;:;;;::::: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:196:511:896 163 chr2 283 99 35M = 446 198 ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT <<<<<<<<<<<<<<<<<<<<<<<<;<<<4<88;<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:112:729:591 147 chr2 283 99 35M = 86 -232 ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:34:380:815 83 chr2 283 99 35M = 91 -227 ATTGGGGAAAACCTCTTTAGTCTTGCTAGAGATTT ;;;;<<<<<<;<<<<;<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:117:156:84 147 chr2 285 99 35M = 95 -225 TGGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAG <;;<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:61:1000:1534 83 chr2 286 99 35M = 104 -217 GGGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGA <<;<<<<;;<<;6;<<<;<4;<<7<<<<<;<<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:22:1623:709 147 chr2 287 99 35M = 107 -215 GGGAAAACCTCTTTAGTCTTGCTAGAGATTTAGAC <'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:7:682:201 163 chr2 288 99 35M = 452 199 GGAAAACCTCTTTAGTCTTGCTAGAGATTTAGACA <<<<<<<7<<7<<<<77&;-9<97<76<;<<993< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:91:89:666 153 chr2 289 60 35M * 0 0 GAAAACCTCTTTAGTCTTGCTAGAGATTTAGACAT 74752;;4;;;;;;;;7);;;4;;;;)4;;;;;13 MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:46:13:880 99 chr2 290 99 35M = 445 190 AAAACCTCTTTAGTCTTGCTAGAGATTTAGACATC <<<<<<<<<<<<<<<<<<<<;<7<3<<<9<+;;<9 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:187:715:521 163 chr2 291 99 35M = 451 195 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<<<<<<<<<<<<<<<:<<<<<<<;<<;<;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:210:809:735 83 chr2 291 99 35M = 93 -233 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:145:383:182 83 chr2 291 99 35M = 105 -221 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:8:89:254:332 83 chr2 291 76 35M = 124 -202 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<:<;<<<<<<<<9<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:63:816:921 83 chr2 291 99 35M = 106 -220 AAACCTCTTTAGTCTTGCTAGAGATTTAGACATCT <<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:280:662:939 99 chr2 294 99 35M = 442 183 CCTCTTTAGTCTTGCTAGAGATTTAGACATCTAAA <<<<<<<<<<<<<;<<<;;7<<<<<<<<<<<<:8< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:250:628:423 163 chr2 295 99 36M = 489 230 CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG <<<<<<<<<<<<<<<<<<:;<<<<:<<<<;;;;;;4 MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:255:549:422 163 chr2 295 99 35M = 456 196 CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT <<<<<<<<<<<<<<<<;<<<<<<<:<<<<<<;;;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:2:491:1886 89 chr2 295 75 35M * 0 0 CTCTTTAGTCTTGCTAGAGATTTAGACATCTAAAT <<:<8:<<<:<<<<<<<<<<<9<<<<<<<<<<<<: MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:267:821:860 163 chr2 296 99 35M = 451 189 TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG ;<<<<<8<<<<<8<<;<8<<<<<5<;<<<<<2;<5 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:42:333:516 83 chr2 296 99 35M = 109 -222 TCTTTAGTCTTGCTAGAGATTTAGACATCTAAATG <<<<<<<<7<63<7<<<<<<<<<<<7<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:119:161:322 99 chr2 297 99 35M = 479 217 CTTTAGTCTTGCTAGAGATTTAGACATCTAAATGA <<<<<<<<<<<<<<;<<<<<<<;<<<<<<<<<</6 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:48:310:473 147 chr2 298 66 35M = 123 -210 TTTAGTCTTGCTAGAGATTTAGACATCTAAATGAA 77999;;6;;;;;;;;;;;;;;;9;;;;;;;;;;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:159:273:253 153 chr2 299 76 35M * 0 0 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA <<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:181:392:500 99 chr2 299 99 35M = 470 206 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA <<<<<:<<<2<<<<;5<<<<29+<<)</65<7.24 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:17:989:186 147 chr2 299 91 35M = 120 -214 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA 87;38$<3=/<==============9========= MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:33:1445:1357 147 chr2 299 85 35M = 121 -213 TTAGTCTTGCTAGAGATTTAGACATCTAAATGAAA 88888;;;;;;;:;;;;;;;:;9;;;;;;;;;;;; MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:119:730:190 147 chr2 301 99 35M = 114 -222 AGTCTTGCTAGAGATTTAGACATCTAAATGAAAGA ;;;3;<<:<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:62:969:12 99 chr2 303 99 35M = 464 196 TCTTGCTAGAGATTTAGACATCTAAATGAAAGAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:103:731:697 147 chr2 304 72 35M = 125 -214 CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC :::;3:<<<<<<<:<<<<<<:<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:111:142:21 163 chr2 304 99 35M = 479 210 CTTGCTAGAGATTTAGACATCTAAATGAAAGAGGC <<<<<<<<:<:<<<<<<<<<<<<<<<<<<<<;<;9 MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:7:319:280:57 99 chr2 306 99 35M = 467 196 TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC ;==========;=====6;=========;=<;6;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:76:205:587 163 chr2 306 99 35M = 483 212 TGCTAGAGATTTAGACATCTAAATGAAAGAGGCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:279:124:41 147 chr2 307 69 36M = 124 -219 GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA :17<8<<<:&<<<<<<:;'<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:10:349:1147 153 chr2 307 74 40M * 0 0 GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA :/:::<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:16 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:22:490:2011 99 chr2 307 99 35M = 485 213 GCTAGAGATTTAGACATCTAAATGAAAGAGGCTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:46:173:214 163 chr2 308 99 35M = 487 214 CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA <<<<<<<<<<<<<<<<<<<<<<<<<;<3<<<<<<; MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:283:577:398 99 chr2 308 99 35M = 488 215 CTAGAGATTTAGACATCTAAATGAAAGAGGCTCAA <<<<<<<<<<<<<<<<<<<9<<<<<<<<<;<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:27:280:592 99 chr2 310 99 36M = 484 210 AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAGA <<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<5< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:3:11:1238:1728 163 chr2 310 99 35M = 475 200 AGAGATTTAGACATCTAAATGAAAGAGGCTCAAAG <<7<<<<<;<<<<<<<<<<<<;<<<;<<<<<<;;< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:118:121:760 89 chr2 311 77 36M * 0 0 GAGATTTAGACATCTAAATGAAAGAGGCTCAAAGAA :<<<;;<<<<6<;<<<;<<<<;<<<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:7:318:679:883 153 chr2 313 75 35M * 0 0 GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT <<;4<<;<:<<7<<<<<<<<<<<<<<<<<<<<<<< MF:i:32 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:30:1452:1563 83 chr2 313 94 35M = 122 -226 GATTTAGACATCTAAATGAAAGAGGCTCAAAGAAT <<39<<<59<<:<<+<<<6<<:<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:189:130:136 99 chr2 314 79 35M = 494 215 ATTTAGACATCTAAATGAAAGAGGCTCAAAGAATG ==<<=================<<====<<=;=6== MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:27:577:849 83 chr2 316 99 35M = 114 -237 TTAGACATCTAAATGAAAGAGGCTCAAAGAATGCC 5:<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:71:478:175 83 chr2 317 99 35M = 171 -181 TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA <<<<;<96<<<<;<<<<<<<<<77<<<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:38:999:463 99 chr2 317 39 35M = 503 221 TAGACATCTAAATGAAAGNNGCNNNAAGAATGCCA 7<<<<<<<<:07<<:<<7!!<<!!!::<88<<<<4 MF:i:130 Aq:i:39 NM:i:5 UQ:i:0 H0:i:0 H1:i:0
+EAS54_71:8:215:830:609 89 chr2 317 71 33M * 0 0 AAGACATCTAAATGAAAGAGGCTCAAAGAATGC +<)<:<<:<<<<<<<<<9<<<<<;<<<<<<<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS188_7:7:213:309:373 83 chr2 317 99 35M = 161 -191 TAGACATCTAAATGAAAGAGGCTCAAAGAATGCCA <<<86<82<<<<<<<<<<<<<<<9<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:45:1339:1807 153 chr2 319 64 35M * 0 0 GACATCTAAATGAAAGAGGCTCAAAGAATGCCAGG 77797;;:;::&:;;0:;8;;4;;:;;6;;;;;;; MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:197:52:58 83 chr2 323 99 35M = 165 -193 TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA <7;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:8:6:104:118 83 chr2 323 99 35M = 154 -204 TCTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGA ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:185:96:948 147 chr2 324 99 36M = 160 -200 CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATA 6<;;<;<<;<<<<<747<<<<<<<<77<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:61:346:384 163 chr2 324 68 35M = 496 207 CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT <<;<<<<<<<<9<;<<9;<6<2;<6<<<;9*558; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:177:800:714 163 chr2 324 76 35M = 497 208 CTAAATGAAAGAGGCTCAAAGAATGCCAGGAAGAT <<<<<<<<<<<<<<<<<<<<<;<<<;<;<<<<<;< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:329:339:408 99 chr2 325 99 36M = 515 226 TAAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:214:565:337 99 chr2 326 99 35M = 481 190 AAATGAAAGAGGCTCAAAGAATGCCAGGAAGATAC <;<<<<<<<<<<<<<<;<<<<9<<<<<;;;;<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:296:401:60 89 chr2 327 68 35M * 0 0 AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA <<*<<<<7<<)<<3<<<9<<<<<<<<<<<<<<;<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:88:1413:14 89 chr2 327 76 35M * 0 0 AATGAAAGAGGCTCAAAGAATGCCAGGAAGATACA <<<<<<<<<<<;;;<<<<<<;<;;<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:34:649:318 163 chr2 328 65 35M = 481 188 ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACAT 9<<3<<<9<<<<<<<<<7<<9<<0<<.0<*:77,; MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:29:1822:1881 83 chr2 328 74 40M = 150 -218 ATGAAAGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA ;87;;<<<;<5<5<<<<<<<;<<<<<<<<<<<<:<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:187:199:369 153 chr2 329 74 35M * 0 0 TGAAAGAGGCTCAAAGAATGCCAGGAAGATACATT ;<><<<<<<<<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;&<<<<<<<</6<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS56_61:3:208:118:673 147 chr2 332 76 35M = 169 -198 AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA <<<<<;;<;<<<<<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:95:1530:28 163 chr2 332 74 35M = 490 193 AAGAGGCTCAAAGAATGCCAGGAAGATACATTGCA ;;;;;;;;;;:;;;;;;;8;;;;;;;;;;;77747 MF:i:18 Aq:i:9 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:104:965:517 73 chr2 333 77 35M = 333 0 AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA <<<<<<<<<<<<<<<<<<<<<:<<<<<<<8<<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:104:965:517 133 chr2 333 0 * = 333 0 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:192
+EAS54_65:7:155:629:357 163 chr2 333 99 35M = 521 223 AGAGGCTCAAAGAATGCCAGGAAGATACATTGCAA <<<<<<<<8<8<<6<<<<<<<<;<9<5<;<;;941 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:149:572:877 83 chr2 334 99 36M = 197 -173 GAGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA 6<94693<;<<<<;;<<<<<<<<<<;9<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:53:544:889 99 chr2 335 76 35M = 495 195 AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA <<<<<<<<;<<<<<<<<<<<<<<<<<;<<<<<;<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:226:370:91 99 chr2 335 99 35M = 482 182 AGGCTCAAAGAATGCCAGGAAGATACATTGCAAGA 8<<<;<8<8<;<<<8<<;7<7;8784<<,;864<& MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:119:651:88 163 chr2 337 99 35M = 527 225 GCTCAAAGAATGCCAGGAAGATACATTGCAAGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:20:592:496 163 chr2 338 75 35M = 498 195 CTCAAAGAATGCCAGGAAGATACATTGCAAGACAG <<<<<<<<<<<<<<<<<<<<<<<<<==<<<<<<:< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:214:946:229 83 chr2 339 99 35M = 165 -209 ACAAAGAATGCCAGGAAGATACATTGCAAGACAGA )+<<<*<<77;8<;7<<8<4<;<88<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS188_7:5:163:982:695 99 chr2 339 77 35M = 499 195 TCAAAGAATGCCAGGAAGATACATTGCAAGACAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:14:1872:1521 163 chr2 339 62 35M = 500 196 TCAAAGAATGCCAGGAAGATACATTGCAAGTCAGA 7<<<<77<<<3<3<7.'<<<<<7<67<+.0%4*<4 MF:i:18 Aq:i:2 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS192_3:4:293:168:240 147 chr2 340 99 35M = 167 -208 CAAAGAATGCCAGGAAGATACATTGCAAGACAGAC +;;;;<8<<86<<<<<<<;;8;7;<;<8<8;<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:86:697:941 83 chr2 341 99 35M = 187 -189 AAAAAAATCCCGGAAGATACATTGCAAGACAGACT 1<<%<<<1:<58<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:4 UQ:i:67 H0:i:0 H1:i:0
+EAS54_71:4:14:88:306 99 chr2 341 99 34M = 521 215 AAAGAATGCCAGGAAGATACATTGCAAGACAGAC <<<<<<8<<<<<<;<<<3<<<8<<;<;;<15<:6 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:183:697:555 163 chr2 341 84 35M = 505 199 AAAGAATGCCAGGAAGATACATTGCCAGACAGACT =====================:===&==:;==5;; MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS56_57:3:41:739:907 163 chr2 344 99 35M = 520 211 GAATGCCAGGAAGATACATTGCAAGACAGACTTCA <<<<<<<<<<<<<<<<<<<<<<<<;<9<<<;;;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:100:1147:124 83 chr2 345 99 35M = 150 -230 AATGCCAGGAAGATACATTGCAAGACAGACTTCAT <<<<96<<<<<<<<<<<<<<<<<<<<<<:<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:127:828:697 99 chr2 346 99 35M = 552 241 ATGCCAGGAAGATACATTGCAAGACAGACTTCATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:62:125:888 163 chr2 347 99 35M = 504 192 TGCCAGGAAGATACATTGCAAGACAGACTTCATCA <<<<<<<<<<<<<<<<<<<::<<<:7<::<:;<<: MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:1:1598:843 163 chr2 347 99 40M = 500 193 TGCCAGGAAGATACATTGCAAGACAGACTTCATCAAGATA <<<<<<8<<<<<<<<<<<<<<<<<<<<<<<<<<8<4:8:: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:71:83:58 83 chr2 349 77 35M = 148 -236 CCAGGAAGATACATTGCAAGACAGACTTCATCAAG 8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:88:1454:418 163 chr2 349 99 35M = 522 208 CCAGGAAGATACATTGCAAGACAGACTTCATCAAG :<<:<<<<<<<<<<<::::<:<:<9<5<<<<<<8: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:36:649:554 163 chr2 350 99 35M = 523 208 CAGGAAGATACATTGCAAGACAGACTTCATCAAGA <<<<<4<<8<<<<<<8<6<<88<<<<<<<-;<;0; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:189:831:878 163 chr2 351 99 35M = 555 239 AGGAAGATACATTGCAAGACAGACTTCATCAAGAT :<<<2<<<<<<<<<<:8<8<<<<<<<<<<87489; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:14:1211:1332 83 chr2 351 99 35M = 178 -208 AGGAAGATACATTGCAAGACAGACTTCATCAAGAT 978961;;991;97;<;;<;<<;;;;;<;;<:8:< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:4:328:537:640 147 chr2 352 99 35M = 185 -202 GGAAGATACATTGCAAGACAGACTTCATCAAGATA ;:<<;<<<<<::<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:85:361:418 99 chr2 353 99 36M = 517 200 GAAGATACATTGCAAGACAGACTTCATCAAGATATG <<<<<<<<<<<<<;<<<<<<<<<<<<<<;4;<<<<3 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:329:437:643 99 chr2 354 99 36M = 540 222 AAGATACATTGCAAGACAGACTTCATCAAGATATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<<<1 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:135:354:66 147 chr2 356 99 35M = 188 -203 GATACATTGCAAGACAGACTTCATCAAGATATGTA ;;;;7<<<<:<<<<;<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:9:648:712 147 chr2 358 99 35M = 182 -211 TACATTGCAAGACAGACTTCATCAAGATATGTAGT *;0;;;95<<<<7<<<;;<<<;;<<<<;<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:36:1184:994 163 chr2 358 99 35M = 518 195 TACATTGCAAGACAGACTTCATCAAGATATGTAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8<<8< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:50:30:15 147 chr2 358 10 35M = 192 -201 TACATTGCAAGACAGTCGTCAGCAAGATATGTAGT 1-%-22&&)&11,&/&&176<&<<<222<,6,<<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:26 H0:i:0 H1:i:0
+EAS51_66:4:322:350:374 163 chr2 360 99 35M = 546 221 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:41:745:603 163 chr2 360 99 35M = 536 211 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA <<<<<<<<<<<<:<<<<<<<<<<<<<<<6<:8<<: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:138:186:459 163 chr2 360 97 35M = 518 193 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA <*<<7<<0<7<<+<-:<<&<:6:4:0-:<<2.:5< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:41:1308:619 83 chr2 360 99 35M = 184 -211 CATTGCAAGACAGACTTCATCAAGATATGTAGTCA 0<9476<<<<<0<<<2<&<0<.<<<<<<<<<.<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:125:884:276 163 chr2 362 99 35M = 541 214 TTGCAAGACAGACTTCATCAAGATATGTAGTCATC <<<<<<<<<<<8<<<<<<<<<<<<<<<<<<;;<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:156:21:69 83 chr2 362 99 35M = 163 -234 TTGCAAGACAGACTTCATCAAGATATGTAGTCATC <:3:<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:66:1381:181 163 chr2 362 99 40M = 544 222 TTGCAAGACAGACTTCATCAAGATATGTAGTCATCAGACT <<6<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<::4:7 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:11:1261:1200 163 chr2 362 99 35M = 558 231 TTGCAAGACAGACTTCATCAAGTTATGTAGTCATC <<<<<<<<<<<;<<<<<<<<;<<<;<:<<8<<:<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_99:5:191:885:623 163 chr2 363 99 35M = 551 223 TGCAAGACAGACTTCATCAAGATATGTAGTCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:53:783:78 99 chr2 363 99 35M = 561 233 TGCAAGACAGACTTCATCAAGATATGTAGTCATCA <<<<<<<<<<<<<<<<<<<<<<<<<;<<;<7;<:; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:177:24:389 83 chr2 365 99 35M = 175 -225 CAAGACAGACTTCATCAAGATATGTAGTCATCAGA +<<;<9<<<9<<;<<7<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:58:684:520 99 chr2 367 99 35M = 538 206 AGACAGACTTCATCAAGATATGTAGTCATCAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:71:187:824 99 chr2 367 99 35M = 534 202 AGACAGACTTCATCAAGATATGTAGTCATCAGACT ;===;======3==;==========4=;=7;;3;6 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:324:238:736 83 chr2 367 99 35M = 180 -222 AGACAGACTTCATCAAGATATGTAGTCATCAGACT <<<9<<<70,<<4<<<<<7<4<7<<<<<0<<<<<7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:19:306:982 99 chr2 368 99 35M = 538 205 GACAGACTTCATCAAGATATGTAGTCATCAGACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:168:829:88 83 chr2 369 99 35M = 205 -199 ACAGACTTCATCAAGATATGTAGTCATCAGACTAT <,,;<838883;;;<<<<<;<8<8;<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:122:589:134 163 chr2 369 99 35M = 562 228 ACAGACTTCATCAAGATATGTAGTCATCAGACTAT <<:<<:<:<<<<<:<8<<<<<<<:<::<<<4:<;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:303:970:243 163 chr2 370 99 35M = 564 229 CAGACTTCATCAAGATATGTAGTCATCAGACTATC <<<<<<<<<<<<<<<<<<<<;;<<<<<<<<<8<8< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:2:19:736:559 147 chr2 370 99 35M = 209 -196 AAGACTTCATCAAGATATGTAGTCATCAGACTATC )<7<2;;4<<4<<<<;<<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS51_66:3:246:711:981 99 chr2 371 99 35M = 559 223 AGACTTCATCAAGATATGTAGTCATCAGACTATCT <<<<<<<<;<<<<:;<<;;<:<<<4<<:4;00<;< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:89:1164:573 99 chr2 371 99 35M = 560 224 AGACTTCATCAAGAGATGTAGTCATCAGACTATCT <:<<;<2<<<<<<<&:2<;<;<<<<;,+;:<<4:< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS220_1:8:18:1757:95 147 chr2 374 45 35M = 216 -193 CTTCATCAAGATATGTAGTCATCAGACTATCTAAA <<<6<&:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:284:597:682 99 chr2 375 99 35M = 557 217 TTCATCAAGATATGTAGTCATCAGACTATCTAAAG <<<<<<<9<<<<<;<<6<<<<<;<9<<<<<<1;;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:10:394:392 99 chr2 376 99 35M = 542 201 TCATCAAGATATGTAGTCATCAGACTATCTAAATT <<<<<<<<<<<<<<<<<<<:<<<<<<;<<;;:6&; MF:i:18 Aq:i:68 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_97:5:28:538:148 163 chr2 376 99 35M = 557 216 TCATCAAGATATGTAGTCATCAGACTATCTAAAGT <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<+771; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:60:590:1760 147 chr2 376 99 35M = 201 -210 TCATCAAGATATGTAGTCATCAGACTATCTAAAGT <8<-<<<<<<<82<<<4<<<<<<<<<<<<<8<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:73:1158:535 83 chr2 377 99 40M = 213 -204 AATAAAGATATGTAGTCATCAGACTATCTAAAGTCAACAT +;6+;<;<<<<<<<<<0<<;<<<;<<<8<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:2 UQ:i:20 H0:i:1 H1:i:0
+EAS188_7:3:182:104:921 99 chr2 378 99 35M = 575 232 ATCAAGATATGTAGTCATCAGACTATCTAAAGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:3:160:173:889 83 chr2 379 99 35M = 215 -199 TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA ;)<</<8<<<<<<</<;<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:71:311:202 83 chr2 379 99 35M = 188 -226 TCAAGATATGTAGTCATCAGACTATCTAAAGTCAA ;6<;<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:315:201:673 163 chr2 381 45 36M = 542 197 AAGATATGTAGTCATCAGACTATCTAAAGTCAACAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<<<<:; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:228:915:631 163 chr2 381 66 35M = 547 201 AAGATATGTAGTCATCAGACTATCTAAAGTCAACA =================;==========4====== MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:228:736:747 163 chr2 381 68 35M = 542 196 AAGATATGTAGTCATCAGACTATCTAAAGTCAACA <<<<<<<<<;<<<<<<<;;<<;<<<<;::<;;7;7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:263:689:572 99 chr2 381 68 35M = 553 207 AAGATATGTAGTCATCAGACTATCTAAAGTCAACA <<<<;<<<<<;<<<<<<&;;<<<;<<:<+;;7;;7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:5:81:685:141 147 chr2 382 85 35M = 207 -210 AGATATGTAGTCATCAGACTATCTAAAGTCAACAT ;+;(;)..=3.1=.7=;=8;==<4====;====== MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:2 H1:i:2
+EAS114_32:1:208:971:600 163 chr2 382 99 35M = 559 212 AGATATGTAGTCATCAGACTATCTAAAGTCAACAT <<<<<<<<<<<<<<<<<8<<:<<<0;44<<:4<:< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:7:1864:1569 99 chr2 382 99 35M = 561 214 AGATATGTAGTCATCAGACTATCTAAAGTCAACAT <<<<<<<<<<<<<<<<<<<<<<<<<<:<<<8<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:224:592:744 147 chr2 383 99 35M = 188 -230 GATATGTAGTCATCAGACTATCTAAAGTCAACATG 6<6<<<<<<9+<6-<<<:<:<:<<<<<:<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:6:25:949:33 147 chr2 383 99 35M = 201 -217 GATATGTAGTCATCAGACTATCTAAAGTCAACATG -<4<666<<-7<5<<<<<(<<<<<<<<<<<<<<-< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS54_73:5:271:874:367 163 chr2 384 99 35M = 560 211 ATATGTAGTCATCAGACTATCTAAAGTCAACATTA <<<<<<<<<<<<<<4<;<;<:<;4<4<<99<7<+% MF:i:18 Aq:i:51 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS139_19:4:26:1312:1400 147 chr2 385 99 40M = 207 -218 TATGTAGTCATCAGACTATCTAAAGTCAACATGAAGGAAA ::77:<;:+6<+<<<;<<74<<<;<<;<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:2
+EAS51_66:6:310:747:415 83 chr2 387 99 35M = 217 -205 TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG ;<<<;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:2 H1:i:6
+EAS56_57:6:4:223:776 83 chr2 387 93 35M = 203 -219 TGTAGTCATCAGACTATCTAAAGTCAACATGAAGG <;9<;<0<<;<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:2 H1:i:6
+EAS114_28:3:32:492:907 99 chr2 387 95 36M = 571 220 TGTAGTCATCAGACTATCTAAAGTCAACATGAAGGA <<<<<<<<<<<<<<<<<<<;<;;<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_26:4:110:840:431 163 chr2 388 93 35M = 567 214 GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA =====================5:======54=+3+ MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_45:6:86:693:234 83 chr2 388 82 35M = 202 -221 GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA 83997;<;;;;98;;3*6<<;<:8;;;;;<;;<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:3 H1:i:13
+EAS139_11:8:96:1314:1448 83 chr2 388 93 35M = 213 -210 GTAGTCATCAGACTATCTAAAGTCAACATGAAGGA <<<<7<<:<<<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:3 H1:i:8
+EAS114_30:6:41:461:436 83 chr2 389 74 35M = 200 -224 TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA ;<986<;6<<<<<<<;<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:3 H1:i:13
+EAS221_3:8:55:932:613 163 chr2 389 77 35M = 568 214 TAGTCATCAGACTATCTAAAGTCAACATGAAGGAA <<<<<<<<<<<<<<<<<<<<<8<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:3 H1:i:10
+EAS1_97:5:219:174:684 163 chr2 390 71 35M = 560 205 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<<<<<<<<<<8<8<<<7<<;<<<<<2<;&;;;;9 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS56_57:5:24:284:360 163 chr2 390 76 35M = 567 212 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<<<<<<<<<<<<<<<<;<<<<<<<;<9;<;99;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS114_26:1:113:367:659 83 chr2 390 72 35M = 222 -203 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<5<0&9;<3<<<<<9<<<<4<;<9<9<<<<7<3< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:3 H1:i:17
+EAS114_32:5:109:199:592 163 chr2 390 72 35M = 576 221 AGTCATCAGACTATCTAAAGTCAACATGAAGGAAA <<<<<<<<<<<;:<;;<<:;6<<;:;:<<+;;;<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS114_45:4:88:55:1187 147 chr2 391 66 35M = 220 -206 GTCATCAGACTATCTAAAGTCAACATGAAGGAAAA 7769,7;;;;;;;;;;;;;;9;;;;;;;;;;;;;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:2 H1:i:7
+EAS56_59:2:60:677:921 147 chr2 393 96 35M = 250 -178 CATCAGACTATCTAAAGTCAACATGAAGGAAAAAA ========9==;======8==>============= 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<<<<<<</<<+<<<<<<7<+<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_67:3:197:261:624 99 chr2 398 99 35M = 587 224 GACTATCTAAAGTCAACATGAAGGAAAAAAATTCT <<<<<<<<<<<;<<<<<<<;<<;<<<<<<;<<<9< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS218_4:3:41:1281:1785 147 chr2 399 99 35M = 237 -197 ACTATCTAAAGTCAACATGAAGGAAAAAAATTCTA <6<<<6<<<<<<:<<6<:<<<<<<<<<<<<6<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_610:5:51:904:391 83 chr2 401 97 35M = 212 -224 TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA ;<96<<<<<<7<<7<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_63:7:137:139:248 163 chr2 401 97 35M = 569 203 TATCTAAAGTCAACATGAAGGAAAAAAATTCTAAA <<<<<<<<<9<<<<<<<<<<;<<<<<<<;;<;<;< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:3 H1:i:2
+B7_610:7:15:696:693 163 chr2 403 34 35M = 570 202 TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT 2:+:7<<3<<<<<6+36<<<<<<<6<<6&<<;<.7 MF:i:18 Aq:i:10 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS114_45:2:41:199:388 147 chr2 403 99 35M = 243 -195 TCTAAAGTCAACATGAAGGAAAAAAATTCTAAAAT 84898;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:163:611:211 83 chr2 405 99 35M = 234 -206 TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA <<<<9<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:114:19:769 163 chr2 405 90 35M = 572 202 TAAAGTCAACATGAAGGAAAAAAATTCTAAAATCA <<<<<*2;6;<<<4.;;<&;;<.<40)<);5-/7; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS51_64:7:92:493:891 147 chr2 408 99 35M = 240 -203 AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA <383<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:5:996:2000 163 chr2 408 99 35M = 575 202 AGTCAACATGAAGGAAAAAAATTCTAAAATCAGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_93:1:179:629:513 83 chr2 409 99 35M = 220 -224 GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA <;,<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:84:1505:1037 99 chr2 409 99 35M = 586 212 GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA <<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<::) MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS221_1:6:96:491:1891 83 chr2 409 99 35M = 253 -191 GTCAACATGAAGGAAAAAAATTCTAAAATCAGCAA :;5<<7<;:<<;<<<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:307:481:625 147 chr2 410 99 36M = 245 -201 TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA ;4<<4<;;<<;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+B7_610:5:120:596:847 83 chr2 410 83 35M = 211 -234 TCAACATGAAGGAAAAAAATTCTAAAATCAGCAAG ;/<<:<;<<<<<<<<<<<<<;;<<<<<;<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_45:3:3:864:1888 99 chr2 411 99 35M = 579 203 CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA ;<<;;<<;;;<;;<<;<;<<;<<;8<<:<;79799 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:34:1614:558 99 chr2 411 99 35M = 569 193 CAACATGAAGGAAAAAAATTCTAAAATCAGCAAGA <<<<<<<<<<<7<<<<<8<<<<<<2<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:5:117:570:971 83 chr2 413 99 35M = 223 -225 ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA <,<9<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS112_34:8:45:800:733 163 chr2 413 99 35M = 607 229 ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA <<<</<<<<<<<<<<<<<<<2<9<<<<<5*5;599 MF:i:18 Aq:i:34 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS219_FC30151:7:87:1289:83 163 chr2 413 99 35M = 585 207 ACATGAAGGAAAAAAATTCTAAAATCAGCAAGAGA <<<<<<<<<<<<<<<<<<<<<;<<<<<;<<<<<<: MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:4:58:271:612 147 chr2 415 99 35M = 236 -214 ATGAAGGAAAAAAATTCTAAAATCAGCAAGAGCAA ;:2=<<;<<<<<<:67:<<:<<<<<<<<<<<<,<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:11 H0:i:0 H1:i:2
+EAS1_108:1:33:779:821 163 chr2 416 99 35M = 579 198 TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS112_34:6:75:615:555 147 chr2 416 99 35M = 255 -196 TGAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAA ;<<<;<<<<<<<<<:;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS188_7:6:11:994:584 147 chr2 417 97 35M = 226 -226 GAAGGAAAAAAATTCTAAAATCAGCAAGAGAAAAG <<<<;<<<<<<<;<:<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS114_26:7:218:858:445 147 chr2 421 99 35M = 239 -217 GAAAAAAATTCTAAAATCAGCAAGAGAAAAGCATA ;<<<<<<<8;:<<<<<<;<<:<<<<<<<<<<<<;< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_81:2:317:72:221 83 chr2 422 99 35M = 270 -187 AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC =========:======;==;=============== MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:70:766:2016 163 chr2 422 99 35M = 607 220 AAAAAAATTCTAAAATCAGCAAGAGAAAAGCATAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS56_53:4:45:707:147 83 chr2 424 99 35M = 216 -243 AAAAATTCTAAAATCAGCAAGAGAAAAGCATACAG <<<<<<;3<<<<<4;<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:16:1343:1621 147 chr2 426 99 35M = 248 -213 AAATTCTAAAATCAGCAAGAGAAAAGCATACAGTC ;<<9;7=====;;==<==================< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:184:912:258 99 chr2 428 99 35M = 582 189 ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:119:38:945 147 chr2 428 99 35M = 221 -242 ATTCTAAAATCAGCAAGAGAAAAGCATACAGTCAT =;;8=====:========<================ MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:95:235:746 163 chr2 430 99 35M = 598 203 TCTAAAATCAGCAAGAGAAAAGCATACAGACATCT <<<<;<<<<<<<<79<<<<<<<<<<<<<<*;;;<9 MF:i:18 Aq:i:72 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS1_99:2:188:782:483 83 chr2 431 99 35M = 277 -189 CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA 7<<<<<<4<;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:39:348:594 163 chr2 431 99 35M = 600 204 CTAAAATCAGCAAGAGAAAAGCATACAGTCATCTA <<;<<<<<<<<<;<;;<<<<<<<<<<;<<<:<:<: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:176:971:874 83 chr2 432 76 9M1D26M = 273 -195 TAAAATCAGAAGAGAAAAGCATACAGTCATCTATA <<<<<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:3:14:697:541 147 chr2 432 99 35M = 259 -208 TAAAAGCAGCAAGAGAAAAGCATACAGTCATCTAT 8<<<<&6<;8<<<<<<<<<<<<;<<<<;<<<<<<8 MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+B7_610:7:177:469:800 147 chr2 433 99 35M = 259 -209 AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA =<<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:131:518:588 163 chr2 433 99 35M = 607 209 AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<1<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:8:6:237:885 147 chr2 433 99 35M = 269 -199 AAAATCAGCAAGAGAAAAGCATACAGTCATCTATA <<<<1:<;:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:134:126:465 147 chr2 434 99 35M = 245 -224 AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA <<;:&<3)<<7<:<<<<.:<<<<<8<<<<<<<<<< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:104:402:732 163 chr2 434 99 35M = 610 211 AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA =========================7=;===;=:= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:65:85:1547 83 chr2 434 99 35M = 257 -212 AAATCAGCAAGAGAAAAGCATACAGTCATCTATAA <<<<<<;:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:2:85:686:696 163 chr2 435 99 35M = 594 193 AATCAGCAAGAGAAAAGCATACAGTCATCTATAAA ==================<=====:==<=<;=:== MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:144:242:602 163 chr2 436 99 36M = 611 211 ATCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG ========================;=====<;;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:204:737:61 83 chr2 437 99 35M = 247 -225 TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG (7=72=;==2=====<===<<============== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:124:253:889 163 chr2 437 99 35M = 598 196 TCAGCAAGAGAAAAGCATACAGTCATCTATAAAGG <<<<<<6<<:<<<<<<<<<<<<<;;<<;<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:310:155:312 163 chr2 438 99 35M = 606 203 CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA ;<<<;<<<8<<<<<<<<<<<<;<<<<<8<<<<8<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:78:692:671 99 chr2 438 99 35M = 610 207 CAGCAAGAGAAAAGCATACAGTCATCTATAAAGGA <<<<<<<<<<<<<;<<<<<<<:<<:<<<:8<<0;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:130:260:553 147 chr2 439 99 35M = 250 -224 AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA <*;<<7<);<<;9;<5<*<9<;<<;;<7<<<<<1< MF:i:18 Aq:i:42 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:60:163:1612 163 chr2 439 99 35M = 617 213 AGCAAGAGAAAAGCATACAGTCATCTATAAAGGAA <<<<<<<<<21<<<<<<<<<3<--<+<<<+<<63< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:106:595:322 83 chr2 440 99 35M = 274 -201 GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA ;+<<<<<<<<<<<<<<<<<<;<<7<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:211:84:84 147 chr2 440 99 35M = 268 -207 GCAAGAGAAAAGCATACAGTCATCTATAAAGGAAA 6:<<:<<<<<<9<<<<<<<<<<<;<<<;;;<;<3; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:280:662:939 147 chr2 442 99 35M = 294 -183 AAGAGAAAAGCATACAGTCATCTATAAAGGAAATC <<;<;<<<<<:<<<;<<<;<<;<<<<<<<<<<<;< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:52:751:360 83 chr2 443 99 35M = 263 -215 AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC <-<9<<<<<6<<<8<<;;<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:234:167:381 163 chr2 443 99 35M = 625 217 AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC <<<<<<<<<<<<<<<<<<<<<<<<<;<<<;;7<;; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:37:156:134 83 chr2 443 99 35M = 261 -217 AGAGAAAAGCATACAGTCATCTATAAAGGAAATCC 99998<<<<:<<<<<<<;<<><<<<<<<<<<<<<< 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/)</<<<:<<<<<)<<7<<<<<+55<<1<<<:< MF:i:18 Aq:i:59 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS192_3:4:312:915:751 99 chr2 461 99 35M = 621 195 ATCTATAAAGGAAATCCCATCAGAATAACAATGGG <2<<<<<<<8;<<<<<<<<:<<<<8<<<<<84,4: MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:7:96:899:106 99 chr2 462 99 35M = 636 209 TCTATAAAGGAAATCCCATCAGAATAACAATGGGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:62:969:12 147 chr2 464 99 35M = 303 -196 TATAAAGGAAATCCCATCAGAATAACAATGGGCTT <<;<;<::<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:6:67:56:806 99 chr2 464 99 35M = 637 208 TATAAAGGAAATCCCATCAGAATAACAATGGGCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<:7: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:37:611:267 99 chr2 464 99 35M = 610 181 TATAAAGGAAATCCCATAAGAATAACAATGGGCTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_93:7:319:280:57 147 chr2 467 99 35M = 306 -196 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:96:720:940 163 chr2 467 99 35M = 654 222 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<;<<<<<<<<<<;9<<8<<6<;:;<;;.;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:2:59:286:290 99 chr2 467 99 35M = 628 196 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<<<;<<<;<<<<<<<<<<<<<;;;<<;7;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:236:841:20 163 chr2 467 99 35M = 652 220 AAAGGAAATCCCATCAGAATAACAATGGGCTTCTC <<<<<<<<<<<<<<<<<7<<<<:<<9<<<<;<:<9 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:49:656:507 99 chr2 468 99 35M = 637 204 AAGGAAATCCCATCAGAATAACAATGGGCTTCTCA <<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:78:1314:1275 147 chr2 469 99 35M = 277 -227 AGGAAATCCCATCAGAATAACAATGGGCTTCTCAG <<<<<<<<6:<<<<<<<<<<<<<<<<<<<<<<<1< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:6:181:392:500 147 chr2 470 99 35M = 299 -206 GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC /5<<;(88<<<;<;<<6<<<<<7<<<<<<<7<<<< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:133:8:379 163 chr2 470 99 35M = 653 218 GGAAATCCCATCAGAATAACAATGGGCTTCTCAGC <<<<<<<<<<<<<<<<<<<<<<<<8;<<8<<<:6< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:198:929:684 163 chr2 471 99 35M = 624 188 GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA <7<<<<;<<<<<<<<<<<<;<<<<<:<<<<::<:7 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:181:582:435 99 chr2 471 99 35M = 629 193 GAAATCCCATCAGAATAACAATGGGCTTCTCAGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;:: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:1:214:784:690 99 chr2 472 99 35M = 657 220 AAATCCCATCAGAATAACAATGGGCTTCTCAGCGG <<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<4<44 MF:i:18 Aq:i:30 NM:i:1 UQ:i:19 H0:i:1 H1:i:0
+EAS114_39:3:11:1238:1728 83 chr2 475 99 35M = 310 -200 TCCCATCAGAATAACAATGGGCTTCTCAGCGGAAA :677<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS112_34:4:12:273:89 163 chr2 477 99 35M = 631 189 CCATCAGAATAACAATGGGCTTCTCAGCGGAAACC ==========<====:=========+===4414;; MF:i:18 Aq:i:71 NM:i:1 UQ:i:28 H0:i:1 H1:i:0
+EAS56_63:2:119:161:322 147 chr2 479 99 35M = 297 -217 ATCAGAATAACAATGGGCTTCTCAGCAGAAACCTT <83<;<<;<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_30:2:111:142:21 83 chr2 479 99 35M = 304 -210 ATCAGAATAACAATGGGCTTCACAGCGGAAACCTT ;88<:<;;<6<;;<<<:<<<<;<<<<<<<<;<<<< MF:i:18 Aq:i:28 NM:i:2 UQ:i:53 H0:i:0 H1:i:0
+EAS1_99:1:34:649:318 83 chr2 481 65 35M = 328 -188 AAGAATAACAATGGGCTTCACAGCGGAACCCTTAC )<7<<3<<<<<<+<1<;<8&<<<<<<<<<<<<<<< MF:i:130 Aq:i:65 NM:i:3 UQ:i:59 H0:i:0 H1:i:0
+EAS114_30:6:214:565:337 147 chr2 481 99 35M = 326 -190 CAGAATAACAATGGGCTTCTCAGCAGAAACCTTAC ;;<;<1<9<<<8<<<<<;<<<<<<8<<<;<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:226:370:91 147 chr2 482 99 35M = 335 -182 AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA <':<6<;<<<;2<;<-7;;;<<<<<<<;;;<<7;< MF:i:18 Aq:i:43 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS139_11:6:13:682:680 99 chr2 482 99 35M = 685 238 AGAATAACAATGGGCTTCTCAGCGGAAACCTTACA <<<<<<<<<<<<<:<<<<<<<<<<;<;<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_593:2:273:348:37 163 chr2 483 99 36M = 688 241 GAATAACAATGGGCTTCTCAGCAGAAACCTTACACG <<<<<<<9<49<<<;<<<<*<<19<15;<</5<;.5 MF:i:18 Aq:i:41 NM:i:1 UQ:i:13 H0:i:1 H1:i:0
+EAS139_11:8:76:205:587 83 chr2 483 99 35M = 306 -212 GAATAACAATGGGCTTCTCAGCGGAAACCTTACGA 8<<5<<<<<<<<<<<<<<<<<<<<<<<<<7<<</< MF:i:18 Aq:i:28 NM:i:2 UQ:i:41 H0:i:0 H1:i:0
+B7_591:2:27:280:592 147 chr2 484 99 36M = 310 -210 AATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC <<<<<<<<<<<8<<<<<<<<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_99:7:171:196:287 163 chr2 485 99 35M = 658 208 ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC <<<<<<<<<<<<<<<<<<<<<;6<<<<<<2:8<0: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:2:224:579:433 163 chr2 485 99 35M = 662 212 ATAACAATGGGCTTCTCAGCAGAAACCTTACAAGC <<<<<<<<<<<<<<<<<:<<<<<<<<<<<8<+8;: MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:22:490:2011 147 chr2 485 99 35M = 307 -213 ATAACAATGGGCTTCTCAGCGGAAACCTTACAAGC <7<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_65:6:46:173:214 83 chr2 487 99 35M = 308 -214 AACAATGGGCTTCTCAGCAGAAACCTTACAAGCCA <<2<<<<<<<<<<<5<<5<7<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:4 H1:i:6
+EAS1_103:4:164:79:134 99 chr2 488 99 35M = 656 203 ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_32:2:283:577:398 147 chr2 488 99 35M = 308 -215 ACAATGGGCTTCTCAGCGGAAACCTTACAAGCCAG ;8;;&<<<;<;67<;<;<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:29 NM:i:1 UQ:i:27 H0:i:0 H1:i:2
+EAS54_67:5:149:639:910 163 chr2 489 99 35M = 669 215 CAATGGGCTTCTCAGCAGAAACCTTACAAGCCAGA <<<<<<<<<<<<<<<<<<<<<<<<7<;;<<;<<;< MF:i:18 Aq:i:42 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:250:628:423 83 chr2 489 99 36M = 295 -230 CAATGGGCTTCTCAGCGGAAACCTTACAAGCCAGAA +<<4;;9;;7.;7<;7<;<<<;;<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_108:1:242:419:512 163 chr2 490 94 35M = 672 217 AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA <<8<<<<<<<<<<<<<<<<<<<<<<<<;<8<(<30 MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_45:1:95:1530:28 83 chr2 490 74 35M = 332 -193 AATGGGCTTCTCAGCAGAAACCTTACAAGCCAGAA 77741(9;;994;5;;4;;1;;;;;1;<;<<<<;< MF:i:18 Aq:i:9 NM:i:0 UQ:i:0 H0:i:42 H1:i:45
+EAS192_3:6:326:887:180 163 chr2 492 73 35M = 672 215 TGGGCTTCTCAGCAGAAACCTTACAAGCCAGAAGC ;<<<<<;<<<<<<<<<8<<<<<<<<<<<<0<;;<+ MF:i:18 Aq:i:0 NM:i:1 UQ:i:25 H0:i:3 H1:i:7
+EAS1_99:1:86:871:319 99 chr2 494 71 35M = 651 192 GGCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGA <<<<<:<<<:<:<<<<<<<<<<<<8<<:<1;<::) MF:i:18 Aq:i:0 NM:i:1 UQ:i:25 H0:i:0 H1:i:4
+EAS56_57:1:189:130:136 147 chr2 494 79 35M = 314 -215 GGCTTCTCAGCAGAAACCTTACAAGCCAGAAGAGA 823;23<7<57<7<<<<<;<<;<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:63 H1:i:85
+EAS51_64:7:140:752:822 99 chr2 495 76 35M = 667 207 GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT <<<<<<<<<<<<<<<<<7<<<<<<<<<<<<<;<:; MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:5
+EAS56_57:5:53:544:889 147 chr2 495 76 35M = 335 -195 GCTTCTCAGCGGAAACCTTACAAGCCAGAAGAGAT ,<;<<<;<<<<<<<<<:;;<<<<<;;<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:2 H1:i:32
+EAS54_65:4:61:346:384 83 chr2 496 68 35M = 324 -207 CAACTAAGAAGAAACCTTACAAGCCAGAAGAGATT 7&$+&,<<+;;<;;<<6<<8<<<;<<;<<<<<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:19 H0:i:1 H1:i:53
+EAS54_81:8:177:800:714 83 chr2 497 76 35M = 324 -208 TTCTCAGCAGAAACCTTACAAGCCAGAAGAGATTG =;3=+=<:=<========8================ MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:29 H1:i:85
+B7_597:6:20:592:496 83 chr2 498 75 35M = 338 -195 TCTCAGCGGAAACCTTACAAGCCAGAAGAGATTGG 97<7;<;<;<<<<;<9<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:5 H1:i:48
+B7_591:5:243:557:560 83 chr2 499 75 36M = 331 -204 CTAAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT 69&<;&<&<<;6.<<<+<<<;;<<<<<<<<;<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:9
+EAS188_7:5:163:982:695 147 chr2 499 77 35M = 339 -195 CTCAGCAGAAACCTTACAAGCCAGAAGAGATTGGA <:<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:7 H1:i:42
+EAS139_19:1:1:1598:843 83 chr2 500 99 40M = 347 -193 TCAGCGGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT 1)::6::<<;<98<<<<<<9<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:1 UQ:i:25 H0:i:1 H1:i:0
+EAS139_19:6:78:1029:512 163 chr2 500 99 40M = 656 196 TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT <0:;<<<<<<<<<:<<:;<<<;<7<<;<7;;;:6;::672 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:14:1872:1521 83 chr2 500 62 35M = 339 -196 TCATCAAAAACCTTACAAGCCAGAAGAGATTGGAT /1<%73&7<1<3577,<<<7/733<<<<<<<<1<< MF:i:18 Aq:i:2 NM:i:2 UQ:i:9 H0:i:1 H1:i:8
+EAS221_3:6:51:1486:1131 163 chr2 500 77 35M = 685 220 TCAGCAGAAACCTTACAAGCCAGAAGAGATTGGAT <<<<<<<<<;<<<<<<<<<1<5<<8<<<'<;<<;1 MF:i:18 Aq:i:3 NM:i:0 UQ:i:0 H0:i:22 H1:i:22
+EAS192_3:6:45:183:25 163 chr2 501 95 35M = 672 206 CAGCGGAAACCTTACAAGCCAGAAGAGATTGGATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<86;<;:; MF:i:18 Aq:i:23 NM:i:1 UQ:i:27 H0:i:0 H1:i:2
+B7_597:4:38:999:463 147 chr2 503 39 35M = 317 -221 GCGGAAACCTTACAAGCCAGAAGAGATTGGATCTA .*:&<<0<0!<<+<<<<<<<<<<<<<0<<<<<<<< MF:i:18 Aq:i:39 NM:i:2 UQ:i:25 H0:i:0 H1:i:1
+EAS114_45:1:30:1882:1210 163 chr2 503 82 35M = 665 197 GCAGAAACCTTACAAGCCAGAAGAGATTGGATCTA ;;::;;;;:;;;;;:;;;;;;9;;:7;;8:77777 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_108:6:222:579:961 163 chr2 504 99 35M = 679 210 CAGAAACCTTACAAGCCAGAAGAGATTGGATCTAA <<<<<<<<<<<<<<<<<<<<<<<<<7<<:7;;;68 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:92:875:345 163 chr2 504 99 35M = 690 221 CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_63:8:62:125:888 83 chr2 504 99 35M = 347 -192 CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA ,;3<<<8;;3<,<<<8;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+EAS221_1:2:23:127:880 99 chr2 504 99 35M = 686 217 CGGAAACCTTACAAGCCAGAAGAGATTGGATCTAA <<<<<<<<<<<<<<<<<<<;;<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS51_66:8:43:972:506 163 chr2 505 99 35M = 686 216 AGAAACCTTACAAGCCAGAAGAGATTGGATCTAAT <;<<<<<<<<<<<<6;<;<<<<<<<<<<:;;<;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:183:697:555 83 chr2 505 84 35M = 341 -199 AGAAATCTTAGAAGCCAGAAGAGATTGGATCTAAT <<<;&,.;);&96<84<<81<<&<<<9<<8<8<<1 MF:i:18 Aq:i:37 NM:i:2 UQ:i:16 H0:i:0 H1:i:1
+EAS221_3:8:65:463:703 99 chr2 506 99 35M = 693 222 GAAACCTTACAAGCCAGAAGAGATTGGATCTAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:101:752:996 163 chr2 508 99 35M = 687 214 AACCTTACAAGCCAGAAGAGATTGGATCTAATTTT <<<<<<<<<<<<<<<;<<<<<9<<<<<<;<<;;;; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:267:953:459 99 chr2 509 99 35M = 667 193 ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT <<<<<<<<<9<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:33:1240:846 99 chr2 509 99 35M = 685 211 ACCTTACAAGCCAGAAGAGATTGGATCTAATTTTT <<<<<<<<<<<<7<<2<;<<;<<<;<<<:6:<<<: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:135:401:735 99 chr2 510 99 35M = 703 228 CCTTACAAGCCAGAAGAGATTGGATCTAATTTTTG <<<<<<<<<<<<<<<<<<<<<;<<<<<8<<<<<<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:3:186:68 99 chr2 512 99 35M = 687 210 TTACAAGCCAGAAGAGATTGGATCTAATTTTTGTA <<<<<<<<<<<<;<<<<<<<<<<<<;;<<<<<&%8 MF:i:18 Aq:i:71 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_78:7:164:727:977 163 chr2 513 99 35M = 689 211 TACAAGCCAGAAGAGATTGGATCTAATTTTTCGAC <<<<<<<<<<<<<<<<<<<<<<<<<9<<<<;;79; MF:i:18 Aq:i:75 NM:i:1 UQ:i:26 H0:i:1 H1:i:0
+B7_589:1:110:543:934 163 chr2 514 99 35M = 700 221 ACAAGCCAGAAGAGATTGGATCTAATTTTTGGACT <<<<<<<<<<<<;<<<<<;;<<<;;<<<<<,,;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:329:339:408 147 chr2 515 99 36M = 325 -226 CAATCCAGAAGAGATTGGATCTAATTTTTGGACTTC 7<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:1 UQ:i:27 H0:i:1 H1:i:0
+EAS56_59:5:325:544:349 163 chr2 515 99 35M = 716 236 CAAGCCAGAAGAGATTGGATCTAATTTTTGGACTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<6;;;<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:3:903:957 99 chr2 516 99 35M = 661 180 AAGCCAGAAGAGATTGGATCTAATTTTTGGACTTC <<<<<<<<<<<<<<<<;;<;<;<<<<<<66<;<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:85:361:418 147 chr2 517 99 36M = 353 -200 AGCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT ;;;5<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:138:186:459 83 chr2 518 97 35M = 360 -193 GCCAGAAGAGATTGGAGCTAATTTTTGGACTTCTT +/2/;<:<&7:7</<2&<<<&<<<<<<<<<8<<:3 MF:i:18 Aq:i:37 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS139_11:4:36:1184:994 83 chr2 518 99 35M = 358 -195 GCCAGAAGAGATTGGATCTAATTTTTGGACTTCTT <84<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:270:430:269 83 chr2 519 99 36M = 331 -224 CCAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA 28<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:295:882:282 163 chr2 520 99 35M = 691 206 CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA ========================<6<======8; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:3:41:739:907 83 chr2 520 99 35M = 344 -211 CAGAAGAGATTGGATCTAATTTTTGGACTTCTTAA ;<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:272:240:950 163 chr2 520 97 35M = 696 211 CAGCAGAGCTTGGATCTAATTTTTGGACTTCTTCA 6<<&:<<<&<::;&7<<<3<;<<;<:;:<8:<<(< MF:i:18 Aq:i:25 NM:i:3 UQ:i:17 H0:i:0 H1:i:0
+EAS54_65:7:155:629:357 83 chr2 521 99 35M = 333 -223 AGAAGAGATTGGATCTAATTTTTGGACTTCTTAAA <<<<<<<<;<<<<<<<<<<<<6<<<<<<<<<;<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:14:88:306 147 chr2 521 99 35M = 341 -215 AGAAGAGATTAGATCTAATTTTTGGACTTCTTAAA <1;<;<;<4<&<<<:<<<:<<<<;<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS1_108:5:115:193:231 163 chr2 522 99 35M = 684 197 GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG <<<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<6<7 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:88:1454:418 83 chr2 522 99 35M = 349 -208 GAAGAGATTGGATCTAATTTTTGGACTTCTTAAAG <<<<<<<<<<6<96<<<1911<<<1<<<<<<<<<1 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:36:649:554 83 chr2 523 99 35M = 350 -208 AAGAGATTGGATCTAATTTTTGGACTTCTTAAAGA <<<<<888;<<<;<<<;<;<8<<<<8<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:119:651:88 83 chr2 527 99 35M = 337 -225 GATTGGATCTAATTTTTGGACTTCTTAAAGAAAAA <<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:57:826:977 163 chr2 528 99 35M = 693 200 ATTGGATCTAATTTTTGGACTTCTTAAAGAAAAAA <<<<<<<<<<<<<<<<+<<<<<<<<6<9:6<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:285:417:147 99 chr2 529 99 35M = 712 218 TTGGATCTAATTTTTGGACTTCTTAAAGAAAAAAA <<<<<<<<<<<<<<<;8<<<<<<<<<;6<:<;<<; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:160:130:351 99 chr2 530 99 35M = 697 202 TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA <<<<<<<<<<<<<<<;<<<<4<<<<<;<<<:<<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:287:665:495 163 chr2 530 99 35M = 702 207 TGGATCTAATTTTTGGACTTCTTAAAGAAAAAAAA ==========================98====8=8 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:71:187:824 147 chr2 534 99 35M = 367 -202 TCTAATTTTTGGACTTCTTAAAGAAAAAAAAACCT 0040;<7<<<<0<7<<<;<7*<<<<<7<<771<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:70:445:1289 99 chr2 535 99 35M = 702 202 CTAATTTTTGGACTTCTTAAAGAAAAAAAAACCTG <<<<<<<<<<2<<<<<<<<<<:<<<<<<<;;;;<: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:7:41:745:603 83 chr2 536 99 35M = 360 -211 TAATTTTTGGACTTCTTAAAGAAAAAAAAACCTGT ;<<;;<;<8<<<<<<<<<<<;<<;<<<<<<<<<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:197:759:975 163 chr2 537 99 35M = 698 196 AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:140:253:322 99 chr2 537 99 35M = 689 187 AATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTC <<<<<<<<<<<<<;<<<<<<<<<<<<<<<;;;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:58:684:520 147 chr2 538 99 35M = 367 -206 ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA <85;;:<<<7<<7<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:19:306:982 147 chr2 538 99 35M = 368 -205 ATTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCA <<<<<<<<<9<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:273:562:954 99 chr2 539 99 35M = 722 218 TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;:;;;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:78:775:555 99 chr2 539 99 35M = 691 187 TTTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAA 6:<<<<:<<<<6:<<)::8<6<<:<<)<::63832 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:49:330:699 163 chr2 540 99 35M = 722 217 TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAA ==;=================;======5;;;==5= MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:329:437:643 147 chr2 540 99 36M = 354 -222 TTTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC 885<8;;<;3,8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:125:884:276 83 chr2 541 99 35M = 362 -214 TTTGGACTTCTTAAAGAAAAAAAAACCTGTCAAAC ,;;3,<7<;7<<===;============;====== MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:4:315:201:673 83 chr2 542 45 36M = 381 -197 TTGGACTTATTAAAGAAAAAAAAACCTGTCAAACAC ;;;;<-;;&;;<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_597:3:10:394:392 147 chr2 542 99 35M = 376 -201 TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA 28-:;0-<0<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:1:228:736:747 83 chr2 542 68 35M = 381 -196 TTGGACTTCTTAAAGAAAAAAAAACCTGTCAAACA <07<<&<;+<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:267:394:437 163 chr2 544 99 35M = 735 226 GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACG <<<<<<<<<<;<;<<<<<;;<<<<<;<<:;8<;<8 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:66:1381:181 83 chr2 544 99 40M = 362 -222 GGACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT ;;;+;;&<7<<<+<<<<<<<;<;8<<<;<<<<8<<<;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:74:668:424 99 chr2 545 99 40M = 707 202 GACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;::;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:322:350:374 83 chr2 546 99 35M = 360 -221 ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA <+;8&84<<<:<<<<<<<<<<;<<<<<<<;<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:307:208:477 163 chr2 546 99 35M = 710 199 ACTTCTTAAAGAAAAAAAAACCTGTCAAACACGAA <<<<<<<;<<;<<<<<<<<<<<<<<<<;:<<<88; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:228:915:631 83 chr2 547 66 35M = 381 -201 ATTATTAAAGAAAAAAAAACCTGTCAAACACGAAT &-))-*===/=========9====4========== MF:i:18 Aq:i:0 NM:i:2 UQ:i:13 H0:i:1 H1:i:0
+EAS1_93:5:246:177:525 99 chr2 549 98 35M = 738 224 TCTTAAAGAAAAAAAAACCTGTCAAACACGAATGT <<<<<<<<<<<<<<<<<<<<<1<<<<<<;;;<8;; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:93:634:323 99 chr2 550 99 35M = 721 206 CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT <<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<,<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:8:165:441:708 163 chr2 550 99 35M = 737 222 CTTAAAGAAAAAAAAACCTGTCAAACACGAATGTT =<===============================99 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:5:191:885:623 83 chr2 551 99 35M = 363 -223 TTAAAGAAAAAAAAACCTGTCAAACACGAATGTTA 66<<<<<<<<<<<<<2<<<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:127:828:697 147 chr2 552 99 35M = 346 -241 TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT ;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:115:249:673 163 chr2 552 99 35M = 743 226 TAAAGAAAAAAAAACCTGTCAAACACGAATGTTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<6< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:263:689:572 147 chr2 553 68 35M = 381 -207 AAAGAAAAAAAAACCTGTCAAACACGAATGTTATG <9<2<<<<<<<<<22;;02<<<9<<;9<9<<;<<3 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:99:1632:76 99 chr2 553 99 40M = 705 192 AAAGAAAAAAAACCCTGTCAAACACGAATGTTATGCCCTG <<<<<<<<<<<<*<<<<8<9<<<<<<<<<9;;;;<18:;: MF:i:18 Aq:i:47 NM:i:1 UQ:i:9 H0:i:0 H1:i:1
+EAS54_71:7:250:698:842 163 chr2 554 99 35M = 753 233 AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<24 MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:41:314:1173 99 chr2 554 99 35M = 718 199 AAGAAAAAAAAACCTGTCAAACACGAATGTTATGC <;<<<<<<<;;<<<<<-<<<;;;<;8<*;;<<<<' MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:189:831:878 83 chr2 555 99 35M = 351 -239 AGAAAAAAAAACCTGTCAAACACGAATGTTATGCC <9<<<<<<<<<<;9<:<<<<<6<<<<<<<;<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:216:47:302 99 chr2 557 99 35M = 729 207 AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT <<<<<<<<<<<7<<<<<<<<<<<<+<<<<<//6;< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:28:538:148 83 chr2 557 99 35M = 376 -216 AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT <<<<<<<<<<7;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:284:597:682 147 chr2 557 99 35M = 375 -217 AAAAAAAAACCTGTCAAACACGAATGTTATGCCCT <<<<<<<<9;;7<;:<<<:<;<<<<<<<<;<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:11:1261:1200 83 chr2 558 99 35M = 362 -231 AAAAAAAACCTGTCAAACACGAATGTTATGCCCTG <<<<<<<:<<6<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:246:711:981 147 chr2 559 99 35M = 371 -223 AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC ;;:;7<<:5:<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:1:208:971:600 83 chr2 559 99 35M = 382 -212 AAAAAAACCTGTCAAACACGAATGTTATGCCCTGC <<<<<<<3*+<4/<<<<7<<<<0<<:<8<<<<0<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:219:174:684 83 chr2 560 71 35M = 390 -205 AAAAAAACTGTCAAACACGAATGTTATGCCCTGCT <<<<:;+9<<<;<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS51_66:7:4:234:610 163 chr2 560 84 35M = 729 204 AAAAAACCTGTCAAACACGAATGTTATGCCCTCCT <<<<<<<<7;<<<;7<7;7;7<;-<-<&<<<0%06 MF:i:18 Aq:i:22 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS54_73:5:271:874:367 83 chr2 560 99 35M = 384 -211 AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT <<<<<<5;<<<:<<<;<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:2:168:1878 99 chr2 560 37 35M = 743 218 AAAAAACCTGGCAAACACGAATGTTATGACATGTN ;<:;;<:<;<;<;;;;:;<;:::&9:&:68&6&*! MF:i:18 Aq:i:37 NM:i:5 UQ:i:61 H0:i:0 H1:i:1
+EAS221_1:6:89:1164:573 147 chr2 560 99 35M = 371 -224 AAAAAACCTGTCAAACACGAATGTTATGCCCTGCT 3<<<6<%7<<08<<4<3<<103<1<<<<<<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:53:783:78 147 chr2 561 99 35M = 363 -233 AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA <;;;;<<0<,<<<<<<<<<;<<<;<;<<<<;<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:30:570:902 163 chr2 561 99 35M = 730 204 AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA <<<<<<<<<<<;4<<:<<44<<<<<<<<<<<4<<+ MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:7:1864:1569 147 chr2 561 99 35M = 382 -214 AAAAACCTGTCAAACACGAATGTTATGCCCTGCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:89:942:84 163 chr2 562 74 35M = 759 232 AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:122:589:134 83 chr2 562 99 35M = 369 -228 AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA ;<;4<<538<<;<<;<<<<';,:<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:77:1529:522 99 chr2 562 99 35M = 722 195 AAAACCTGTCAAACACGAATGTTATGCCCTGCTAA <<;<<<<<<<<<<<4<<4<;;:;2:7<<<2*<;;8 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:48:805:860 99 chr2 563 78 35M = 755 227 AAACCTGTCAAACACGAATGTTATGCCCTGCTAAA <<<<<<<;<<<<<<<41;<<8<<<<<<<8+<4,+; MF:i:18 Aq:i:13 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:144:492:61 99 chr2 564 99 35M = 728 199 AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC <<<;<<<<<<<<<<<;<<<<<<7:<<<<::;9;;6 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:3:303:970:243 83 chr2 564 99 35M = 370 -229 AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC <<0+<<<,<4<:<:<<<<<<<<<<<::<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:78:806:800 163 chr2 564 99 40M = 717 193 AACCTGTCAAACACGAATGTTATGCCCTGCTAAACTAAGC <<<<<<<<<<<<<<<<<<<4<<:<1<0<;<9;<:78:::: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:94:1440:2016 163 chr2 564 99 35M = 751 222 AACCTGTCAAACACGAATGTTATGCCCTGCTAAAC <<<<<<<<<<<<<<<<<<<;<<;;;<<:<8:::75 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:103:443:166 163 chr2 565 99 35M = 747 217 ACCTGTCAAACACGAATGTTATGCCCTGCTAAACT <<<<<<<<<<<<<<<<<<<<;<<<<<<<1<-;;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:24:284:360 83 chr2 567 76 35M = 390 -212 CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA :;<;:<<<;<<<<<<<<<<<<<<<<<;;<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:3:166:626:836 163 chr2 567 99 35M = 757 225 CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA <<<<<<<<<<<<<<<<<<<<9<<<<<<<<;<;;;9 MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:110:840:431 83 chr2 567 93 35M = 388 -214 CTGTCAAACACGAATGTTATGCCCTGCTAAACTAA 77<;7<<<<<<<<<4<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:116:738:142 99 chr2 568 99 35M = 722 189 TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG <<<<<<<<<<<<<<<<<<<;<<<<;<<<<<<<:;2 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:55:932:613 83 chr2 568 77 35M = 389 -214 TGTCAAACACGAATGTTATGCCCTGCTAAACTAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:137:139:248 83 chr2 569 97 35M = 401 -203 GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC ;;;99<<<;<;;<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:34:1614:558 147 chr2 569 99 35M = 411 -193 GTCAAACACGAATGTTATGCCCTGCTAAACTAAGC <<9<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:15:696:693 83 chr2 570 10 35M = 403 -202 TCAAACACGAATGTTAATCCCTGCTAAACTAATCA )6<:7<.7<6.<0&&<&3:&7<<7<0<<<<<<<<< MF:i:18 Aq:i:10 NM:i:3 UQ:i:50 H0:i:0 H1:i:0
+EAS114_28:3:32:492:907 147 chr2 571 95 36M = 387 -220 CAAACACGAATGTTATGCCCTGCTAAACTAAGCATC 8<;<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:1:114:19:769 83 chr2 572 90 35M = 405 -202 AAACACGAATGTTATGCCCTGCTAAACTAAGCATC 5+;+3/6;<+;/8<8*/<7/59<97147<;;9<7< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:182:104:921 147 chr2 575 99 35M = 378 -232 CACGAATGTTATGCCCTGCTAAACTAAGCATCATA ;<;<<<<<<:<<<<<:<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:5:996:2000 83 chr2 575 99 35M = 408 -202 CACGAATGTTATGCCCTGCTAAACTAAGCATCATA <<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:109:199:592 83 chr2 576 72 35M = 390 -221 ACGAATATTATGCCCTGCTAAACTAAGCATCATAA ;9<9<:&:<<<<;;<;;<<<<<<<<<;<<<<<<<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS219_1:3:90:219:528 163 chr2 576 75 35M = 758 217 ACGAATGTTATGCCCTGCTAAACTAAGCATCATAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<9 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:94:294:387 163 chr2 578 99 35M = 736 193 GAATGTTATGCCCTGCTAAACTAAGCATCATAAAT <<<<<<<;<<<<<<<<<:<<<<<<<<<<<<;)7;; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:33:779:821 83 chr2 579 99 35M = 416 -198 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG <<730<<<<9<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:5:43:114:617 163 chr2 579 99 35M = 738 194 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG =============;=========;=========== MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:23:944:377 99 chr2 579 75 36M = 757 214 AATGTTATGCCCTGCTAAACTAAGCATCATAAATGA <<<<<<<<9<<<<;<<<<<<<<<;<7<<<<;8;<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:3:864:1888 147 chr2 579 99 35M = 411 -203 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG 888588;;;;;;;;;;;;;;;;;;;;8;;;;;;;; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:26:137:1382 147 chr2 579 99 35M = 397 -217 AATGTTATGCCCTGCTAAACTAAGCATCATAAATG <<-<8<<<<<<:<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:265:251:147 163 chr2 581 99 35M = 754 208 TGTTATGCCCTGCTAAACTAAGCATCATAAATGAA <<<<<<<<<<<<<<88<<<80:;<<<<<;:4;;:4 MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:5:184:912:258 147 chr2 582 99 35M = 428 -189 GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG <;;<<<<;:<<7<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:115:646:430 99 chr2 582 45 35M = 768 217 GTTATGCCCTGCTAAACTTAGCATCATAAATGAAG <7<<<<<<<<<<<<;<<<<<;<7<<<<;5;<;67< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_108:3:24:319:429 163 chr2 582 99 35M = 740 193 GTTATGCCCTGCTAAACTAAGCATCATAAATGAAG <<<<<<<<<<<<<<<<;<<<<<<<<1<<-6<<</< MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:8:49:182:192 99 chr2 582 99 35M = 750 203 GTTATGCCCTGCTAAACTGAGCATCATAAATGAAG =====================;============< MF:i:18 Aq:i:49 NM:i:1 UQ:i:28 H0:i:0 H1:i:1
+EAS114_45:1:100:979:1863 99 chr2 583 85 35M = 757 209 TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG ;<;;;;;;;7;;;79;;77;9;;99;974;677-6 MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:53:458:581 73 chr2 583 77 35M = 583 0 TTATGCCCTGCTAAACTAAGCATCATAAATGAAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:53:458:581 133 chr2 583 0 * = 583 0 CTCAATTAATTGTTTTATAAAACCTGTGAGTTTTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<99<<<<< MF:i:192
+B7_589:6:108:958:42 163 chr2 584 81 35M = 755 206 TATGCCCTGCTAAACTAAGCATCATAAATGAAGGG <<<<<<<<<<<<<<<<<<<<1<<<<<<9<<;<5<: MF:i:18 Aq:i:9 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:89:457:591 99 chr2 585 69 35M = 770 216 ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG <<<<<<<<<<<4<<<<<<<<<<<<8<7/4<<<<4+ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:87:1289:83 83 chr2 585 99 35M = 413 -207 ATGCCCTGCTAAACTAAGCATCATAAATGAAGGGG <<<::<<<:<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:1:84:1505:1037 147 chr2 586 99 35M = 409 -212 TGCCCTGCTAAACTAAGCATCATAAATGAAGGGGA <<966<<7<<<<7<<<<9<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:197:261:624 147 chr2 587 99 35M = 398 -224 GCCCTGCTAAACTAAGCATCATAAATGAAGGGGAA 866;2:/;<<<;:<<<;<;;<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:118:41:489 163 chr2 588 76 35M = 779 226 CCCTGCTAAACTAAGCATCATAAATGAAGGGGAAA <<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<95: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:157:361:309 99 chr2 589 99 35M = 747 193 CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<;<;<;<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_39:6:71:644:1792 163 chr2 589 84 35M = 754 200 CCTGCTAAACTAAGCATCATAAATGAAGGGGAAAT <<<<<<<;<<<<<<<<<<;<<<<<<<<<;<;:<:< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_589:2:9:49:661 163 chr2 591 99 35M = 747 191 TGCTAAACTAAGCATCATAAATGAAGCGGAAATAA <<<<<<<<<<<<<<<<;<<<<<<;:<<;;;7<9;9 MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_71:2:85:686:696 83 chr2 594 99 34M = 435 -193 TAAACTAAGCATCATAAATGAAGTGGAAATAAAG :<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS188_7:1:177:522:118 69 chr2 594 0 * = 594 0 TCTCAATTAATTGTTTTATAAAACCTGTGAGTTTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<57<<<< MF:i:192
+EAS188_7:1:177:522:118 137 chr2 594 49 35M = 594 0 TAAACTAAGCATCATAAATGAAGGGGAAATAAAGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:103:870:105 99 chr2 595 44 35M = 778 214 AAACTAAGCATCATAAATGAAGGGGAAATAAAGTC <<<<<<<<<<<<<<<<<<<<<<<<8<<<<<;<<7; MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS51_62:8:52:967:804 73 chr2 596 76 35M = 596 0 AACTAAGCATCATAAATGAAGGGGAAATAAAGTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:8:52:967:804 133 chr2 596 0 * = 596 0 TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT ===============<=======<<===<====== MF:i:192
+EAS1_108:6:95:235:746 83 chr2 598 99 35M = 430 -203 CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG ==&=;===7=3===8======;=;8===8=====; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:124:253:889 83 chr2 598 99 35M = 437 -196 CTAAGCATCATAAATGAAGGGGAAATAAAGTCAAG 8<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:6:174:650:125 99 chr2 600 76 35M = 770 201 AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:39:348:594 83 chr2 600 99 35M = 431 -204 AAGCATCATAAATGAAGGGGAAATAAAGTCAAGTC <<;;<;:<;<<<;<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:92:693:228 99 chr2 601 75 35M = 770 200 AGCATCATAAATGAAGGGGAAATAAAGTCAAGTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;9<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:285:349:797 163 chr2 604 76 35M = 773 200 ATCATAAATGAAGGGGAAATAAAGTCAAGTCTTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:3:82:13:897 83 chr2 606 99 35M = 453 -188 CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT ,<2<;<<;<<<<;;;<<;<<<<<<<;;;;<<<<<< MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:310:155:312 83 chr2 606 99 35M = 438 -203 CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT 2;<<;<<;<<;;/<<<<<<;<<<<8<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:45:178:1321 163 chr2 606 77 35M = 771 196 CATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:193:420:78 99 chr2 607 99 35M = 787 215 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:131:518:588 83 chr2 607 99 35M = 433 -209 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <.<<<<<<<<4<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:45:800:733 83 chr2 607 99 35M = 413 -229 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <7<<7&<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:34 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:70:766:2016 83 chr2 607 99 35M = 422 -220 ATAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:2:1217:398 163 chr2 608 99 40M = 780 212 TAAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC <<<<<<<<<<<<<;<<<<<<<7<<<3<<<<;<<<<9:7:: MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:73:1458:1337 163 chr2 609 99 35M = 806 232 AAATGAAGGGGAAATAAAGTCAAGTCTTTCCTGAC <<<<<;;;<<<<<<<<<<<<<<<<<<<;<<7;;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:104:402:732 83 chr2 610 99 35M = 434 -211 AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:37:611:267 147 chr2 610 99 35M = 464 -181 AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA <<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:78:692:671 147 chr2 610 99 35M = 438 -207 AATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACA <<);<<;;<<<<<;<<<<<<<<<<<<<6<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:144:242:602 83 chr2 611 99 36M = 436 -211 ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:6:1243:981 69 chr2 611 0 * = 611 0 TTACCTAGTTGCTCTGTAGTCTCAATTAATTGTTT <<<<8<<8<<<<2<<<<<<<<8<55<<8*<<8<<< MF:i:192
+EAS219_FC30151:5:6:1243:981 137 chr2 611 68 35M = 611 0 ATGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAA <;<;;<<<;3;;3<<<;<<;<7%<<<.1<<<..<3 MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:291:404:199 163 chr2 612 76 36M = 777 197 TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<: MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:266:994:429 99 chr2 612 76 35M = 769 188 TGAAGGGGAAATAAAGTCAAGTCTTTCCTGACAAG =====================9=======4===:= MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:7:159:253:353 163 chr2 613 67 35M = 778 196 GAAGGGGAAATAAAGTCAAGTCTTTCCTGACAGGC <<<<<<<<<<<<<<<<<<<<<<<<<<<<0,%4(+, MF:i:18 Aq:i:67 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS1_108:5:175:149:296 163 chr2 614 99 35M = 811 232 AAGGGGAAATAAAGTCAAGCCTTTCCTGACAAGCA <<<<<<<<<<<<<<<<<<<49<<<<<<<<<<<<;4 MF:i:18 Aq:i:45 NM:i:1 UQ:i:19 H0:i:0 H1:i:1
+EAS56_65:1:23:536:229 147 chr2 614 99 35M = 448 -201 AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA <<99<<<<<;<<<;2<<<<<<;<<<9<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:100:20:1199 83 chr2 614 99 35M = 456 -193 AAGGGGAAATAAAGTCAAGTCTTTCCTGACAAGCA :<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:181:713:140 99 chr2 615 84 35M = 793 213 AGGGGAAATAAAGTCAAGTATTTCCTGACAAGCAA <7<<<<<<<<<<<<7<7<6+<<<5;<;<2<;;+;; MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS139_19:6:82:1051:921 163 chr2 616 99 40M = 800 224 GGGGAAATAAAGTCAAGGCTTTCCTGACAAGCAAATGCTA <<<<<9<799<<<<7::/<<<9<7:9:;2:7552+9''66 MF:i:18 Aq:i:41 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS192_3:3:309:187:267 163 chr2 616 99 35M = 786 205 GGGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAA <<<<<<<<<<<<<<<<<<<<<<<;<;<;<;68;;8 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:115:649:259 99 chr2 617 99 36M = 782 201 GGGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;<<9 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:261:267:597 163 chr2 617 86 35M = 787 205 GGGTAATAAAGTCAAGTCTTTCCTGACAAGCAAAT <<<<<<<<<;<<<<<7<<<<<<<<<:7<7<;44:; MF:i:18 Aq:i:41 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:4:123:1001:580 163 chr2 617 43 35M = 771 185 GGGAANTAAAGTCAAGTCTTTCCTGACAAGCAAAT =====!=====================1.8131*= MF:i:18 Aq:i:43 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+EAS139_11:7:60:163:1612 83 chr2 617 99 35M = 439 -213 GGGAACTAAAGTCAAGTCTTTCCTGACAAGCAAAT -<<<<)<<<<<<<<<<<<<<<<<<<<<8<<<<<<< MF:i:18 Aq:i:59 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS54_65:4:325:795:213 163 chr2 618 99 35M = 790 207 GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG <<<<<<<;<<<<;;<<<<<<<<<<<<;:<</;/;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:165:665:220 163 chr2 618 76 35M = 779 196 GGAAATAAAGTCAAGTCTTTCCTGACAAGCAAATG <<<<<<<<<<<<<<<<<<<<<;<;;<<<;;<;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:22:206:150 163 chr2 619 99 35M = 792 208 GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC ==========================::=5&;<2< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:237:497:165 147 chr2 619 99 35M = 454 -200 GAAATAAAGTCAAGTCTTTCCTGACAAGCAAATGC 9=:=======2=27======<>&<=,==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<+<</<<:<<<<<8<<9<38<<<<<<<<; MF:i:18 Aq:i:31 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:209:824:866 163 chr2 665 73 35M = 828 198 ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:30:1882:1210 83 chr2 665 82 35M = 503 -197 ATCATCACTAAACCAGTCCTATAAGAAATGCTCAA 776778;5;;;;8;;7:8;;;;;;;<<<;;;;;<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:181:476:394 163 chr2 666 99 35M = 847 216 TCATCACTAAACCAGTCCTATAAGAAATGCTCAAA <<<<<<<<<<<<<<<<<<<<<<<<<;<<:<<<:;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:267:953:459 147 chr2 667 99 35M = 509 -193 CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA %<07<94========<<================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:7:140:752:822 147 chr2 667 76 35M = 495 -207 CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA ;<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:322:391:742 99 chr2 667 99 35M = 847 215 CATCACTAAACCAGTCCTATAAGAAATGCTCAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:5:149:639:910 83 chr2 669 99 35M = 489 -215 TCACTAAACCAGTCCTATAAGAAATGCTCAAAAGA <;49;<<;;<<<<8;<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:42 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:242:419:512 83 chr2 672 94 35M = 490 -217 CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT *:<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:45:183:25 83 chr2 672 95 35M = 501 -206 CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT ;1<<;<<<;;;;<<<<<+<<<<<<<<<9<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:326:887:180 83 chr2 672 73 35M = 492 -215 CTAAACCAGTCCTATAAGAAATGCTCAAAAGAATT 8:<<:<5<<<;7<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:145:635:390 163 chr2 673 99 35M = 860 222 TAAACCAGTCCTATAAGAAATGCTCAAAAGAATTG <<<<<<<<<<<<<<<<<<:<<<<<<<8<<<::;;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:31:628:1820 163 chr2 675 98 35M = 828 188 AACCAGTCCTATAAGAAATGCTCAAAAGAATTGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:7:117:452:744 163 chr2 676 99 35M = 850 209 ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA <<<<<<<<<<;<<<;<<<<<<<<<<:<<<<<<<;; MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:297:949:26 163 chr2 676 99 35M = 842 201 ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:17:437:1378 163 chr2 676 99 35M = 847 206 ACCAGTCCTATAAGAAATGCTCAAAAGAATTGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:222:579:961 83 chr2 679 99 35M = 504 -210 AGTCCTATAAGAAATGCTCAAAAGAATTGTAAAAG =58====;==8=======;================ MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:98:995:929 163 chr2 680 99 35M = 844 199 GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT <;<;<8<;<<;1;<<<<<;<;;;08;<;<1&0+8< MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:76:1765:700 163 chr2 680 99 35M = 866 221 GTCCTATAAGAAATGCTCAAAAGAATTGTAAAAGT ;;6;;;;;;;;;6;;;;6;;;;;;;;;;;;88878 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:68:306:409 99 chr2 682 99 40M = 856 214 CCTATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;:;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:115:193:231 83 chr2 684 99 35M = 522 -197 TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA =========7===========<============= MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:57:1675:720 99 chr2 684 99 35M = 841 192 TATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:13:682:680 147 chr2 685 99 35M = 482 -238 ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA <<<<<<<<<<:<5<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:6:51:1486:1131 83 chr2 685 77 35M = 500 -220 ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA <<<<<<<<<<,<6<<<<<<<<<<<<<<<<<<7<<< MF:i:18 Aq:i:3 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:33:1240:846 147 chr2 685 99 35M = 509 -211 ATAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAA <<<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:8:43:972:506 83 chr2 686 99 35M = 505 -216 TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT ;<<<<<<<+;<;<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:23:127:880 147 chr2 686 99 35M = 504 -217 TAAGAAATGCTCAAAAGAATTGTAAAAGTCAAAAT <<<<<<<<<%<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:101:752:996 83 chr2 687 99 35M = 508 -214 AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT <<<<<<<<7<7<<<<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:6:3:186:68 147 chr2 687 99 35M = 512 -210 AAGAAATGCTCAAAAGAATTGTAAAAGTCAAAATT <<;<<<<<&:,<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:273:348:37 83 chr2 688 99 36M = 483 -241 AGAAATGCGCAAAAGAATTGTAAAAGTCAAAATTAA 9;7;;0<++1<<<;<7<+;;1<<<;<17<<<<<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS51_78:7:164:727:977 83 chr2 689 99 35M = 513 -211 GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA ;<;<;<:<:<<<<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:6:140:253:322 147 chr2 689 99 35M = 537 -187 GAAATGCTCAAAAGAATTGTAAAAGTCAAAATTAA =;===;54:====================>>===> 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:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:1:92:875:345 83 chr2 690 99 35M = 504 -221 AAATGCTCAAAAGAATTGTAAAAGTCAAAATTAAA <<<;<.;7<<<<<<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:45:601:439 163 chr2 691 99 35M = 864 208 AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG <<<<;<<<<<<<<<<<<<<<<4<<<<9<<<<<<;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:5:295:882:282 83 chr2 691 99 35M = 520 -206 AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG <<:<8<-<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:78:775:555 147 chr2 691 99 35M = 539 -187 AATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAG <<-<%4/<<<<<<<<<<<<<<<<<5<<<0<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:255:796:239 99 chr2 692 99 35M = 869 212 ATGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGT <<<<<<<<6<<<<<<<<<<<<<<<<;6<<<:<:<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:57:826:977 83 chr2 693 99 35M = 528 -200 TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT 875:6<<<<<<<<<<<<<<<;<<<<<<;8<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:187:996:432 99 chr2 693 99 36M = 860 203 TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:8:65:463:703 147 chr2 693 99 35M = 506 -222 TGCTCAAAAGAATTGTAAAAGTCAAAATTAAAGTT <<3<9<<<<<<<8<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:288:384:444 163 chr2 696 99 35M = 855 194 TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:5:272:240:950 83 chr2 696 97 35M = 520 -211 TCAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAA 37<<<<<<<<<<<<<<<<<<<<<<;;<;<<<<<<; MF:i:18 Aq:i:25 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:160:130:351 147 chr2 697 99 35M = 530 -202 CAAAAGAATTGTAAAAGTCAAAATTAAAGTTCAAT 4<;;<;<<<-<<<<<<<<<<;;<<<<;<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:189:530:40 163 chr2 698 99 36M = 883 221 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATAC <<<<<<<<<<;<<<<<:<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:168:247:414 99 chr2 698 99 35M = 876 213 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA <<<<<<<<<<<<<<<<*<<<<<<<<<;:6<<<<<; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:6:197:759:975 83 chr2 698 99 35M = 537 -196 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:29:411:1208 99 chr2 698 99 40M = 882 224 AAAAGAATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC <<<<;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:110:543:934 83 chr2 700 99 35M = 514 -221 AAGAATTGTAAAAGTCAAAATTAAAGTTCAATACT <<<<<5<<;<<<<<<;<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:3:287:665:495 83 chr2 702 99 35M = 530 -207 GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA ===,9=;;====7=====5===;==1========= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:70:445:1289 147 chr2 702 99 35M = 535 -202 GAATTGTAAAAGTCAAAATTAAAGTTCAATACTCA <<<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:172:827:592 163 chr2 703 99 35M = 899 231 AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC =;=======;==;===:==========;==9<<.3 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:135:401:735 147 chr2 703 99 35M = 510 -228 AATTGTAAAAGTCAAAATTAAAGTTCAATACTCAC <<::7<<<<<<::<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:39:208:644 99 chr2 704 99 35M = 859 190 ATTGTAAAAGTCAAAATTAAAGTTCAATACTCACC <;<<<<<;;:<<;;<<<<<<;;;;;;.<;<79997 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:99:1632:76 147 chr2 705 99 40M = 553 -192 TTGTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATA 4641::<<4<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:52:1144:509 99 chr2 706 99 35M = 867 196 TGTAAAAGTCAAAATTAAAGTTCAATACTCACCAT <<<<<<<<<<<<<<<<<<<;<<<<<<<;<;<<;<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:116:157:612 99 chr2 707 99 35M = 889 217 GTAAAAGTCAAAATTAAAGTTCAATACTCACCATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:36:481:1079 163 chr2 707 99 40M = 881 214 GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::8 MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:74:668:424 147 chr2 707 99 40M = 545 -202 GTAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAA :::::<<96<<<<<;<<<;<<5<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:122:398:994 163 chr2 708 99 35M = 871 198 TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA <:<9<<<<<<4<<<;9<<<<<98<;<<<:;<;<;7 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:36:1231:1381 99 chr2 708 99 35M = 891 218 TAAAAGTCAAAATTAAAGTTCAATACTCACCATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:57:366:844 163 chr2 708 99 40M = 877 209 TAAAAGTCAAAATTAAAGTTCAATACTCACCATCATAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<::::7: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:307:208:477 83 chr2 710 99 35M = 546 -199 AAAGTCAAAATTAAAGTTCAATACTCACCATCATA <<<<<.<<<<<<<<<<<<;<;<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:3:285:417:147 147 chr2 712 99 35M = 529 -218 AGTCAAAATTAAAGTTCAATACTCACCATCATAAA <..)<<<<;<<<<7<;-<<;<<<<<;8<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:325:544:349 83 chr2 716 99 35M = 515 -236 AAAATTAAAGTTCAATACTCACCATCATAAATACA <<<<57<<<7<;6<<<<;<7<7;<<7<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:33:357:858 163 chr2 716 99 35M = 870 189 AAAATTAAAGTTCAATACTCACCATCATAAATACA <<<<<<<<<<<<<<<<:<<<<<<:<<<<;<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:78:806:800 83 chr2 717 99 40M = 564 -193 AAATTAAAGTTCAATACTCACCATCATAAATACACACAAA ::;9:<<<;<<:<<<<:<.<1:<<1<<<<<<;<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:41:314:1173 147 chr2 718 99 35M = 554 -199 AATTAAAGTTCAATACTCACCATCATAAATACACA <<2**<<82/<<<<<<<<<<9<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:82:963:128 163 chr2 719 99 35M = 905 221 ATTAAAGTTCAATACTCACCATCATAAATACACAC <<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;<<; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:240:719:799 99 chr2 720 99 35M = 900 215 TTAAAGTTCAATACTCACCATCATAAATACACACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:93:634:323 147 chr2 721 99 35M = 550 -206 TAAAGTTCAATACTCACCATCATAAATACACACAA <<<<;<;<<<<;;<<2<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:12:1335:1372 163 chr2 721 99 40M = 906 225 TAAAGTTCAATACTCACCATCATAAATACACACAAAAGTA <<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<99::.: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:116:738:142 147 chr2 722 99 35M = 568 -189 AAAGTTCAATACTCACCATCATAAATACACACAAA <:<7;+:<<:<<<;<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:2:49:330:699 83 chr2 722 99 35M = 540 -217 AAAGTTCAATACTCACCATCATAAATACACACAAA ===/=;========;=;================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:7:273:562:954 147 chr2 722 99 35M = 539 -218 AAAGTTCAATACTCACCATCATAAATACACACAAA ;<<+;95<<<;5;<<;:<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:6:77:1529:522 147 chr2 722 99 35M = 562 -195 AAAGTTCAATACTCACCATCATAAATACACACAAA <<<;7;,<<<<<<.<,6<<6<<<<<<<;<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1467:1447 163 chr2 722 99 35M = 898 211 AAAGTTCAATACTCACCATCATAAATACACACAAA <<<<<<<<<<<<<<<<<<<<<<7<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:251:819:772 99 chr2 726 99 36M = 881 191 TTCAATACTCACCATCATAAATACACACAAAAGTAC <3<<<9<9<3<</<<<<<<59<3<9<<</9/++*/' MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:144:492:61 147 chr2 728 99 35M = 564 -199 AAATACTCACCATCATAAATACACACAAAAGTACA +;;3;,:7<:;<<7<<<<<<<;;<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS54_73:7:200:65:291 99 chr2 728 99 35M = 930 237 CAATACTCACCATCATAAATACACACAAAAGTACA <<<<1<<<<<<<<<<<<<<<<<<<:<8<<<<:<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:130:609:467 99 chr2 728 99 35M = 877 184 CAATACTCACCATCATAAATACACACAAAAGTACA ==8=====;==8==;=4=;;8=====;6=177.== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:216:47:302 147 chr2 729 99 35M = 557 -207 AATACTCACCATCATAAATACACACAAAAGTACAA <<;<8<:<6<<<;<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:7:4:234:610 83 chr2 729 84 35M = 560 -204 AAAAATCAACATCACAAATACACACAAAAGTACAA <:+:'+&<+'<+'2&<:<7<2<':2<:<<7<7<<< MF:i:18 Aq:i:22 NM:i:4 UQ:i:31 H0:i:0 H1:i:0
+EAS54_81:8:271:180:509 99 chr2 729 99 35M = 896 202 AATACTCACCATCATAAATACACACAAAAGTACAA =============================='==== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:41:530:663 163 chr2 730 99 35M = 908 213 ATACTCACCATCATAAATACACACAAAATTACAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<7;;;;<< MF:i:18 Aq:i:74 NM:i:1 UQ:i:22 H0:i:1 H1:i:0
+EAS114_39:4:30:570:902 83 chr2 730 99 35M = 561 -204 ATACTCACCATCATAAATACGCACAAAAGTACAAA <:<6:6<&:<<6<<<<<<<<.<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:13 H0:i:0 H1:i:1
+EAS1_105:1:87:430:995 99 chr2 731 67 35M = 909 213 TACTCACCATCATAAATACACACAAAATTACAAAA <<;<<7;;;<;<<777;7(77;;1;7;%117;,7( MF:i:18 Aq:i:30 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS114_28:7:215:863:521 163 chr2 732 99 36M = 890 194 ACTCACCATCATAAATACACACAAAAGTACAAAACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:267:394:437 83 chr2 735 99 35M = 544 -226 AAACATCATAAATACACACAAAAGTACAAAACTCA &<&,<8.<;<<<;<8<8<7<<<<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS1_108:6:94:294:387 83 chr2 736 99 35M = 578 -193 ACCATCATAAATACACACAAAAGTACAAAACTCAC 779=53=9===;=:=;=========;========= MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:38:332:54 163 chr2 737 99 36M = 904 203 CCATCATAAATACACACAAAAGTACAAAACTCACAG <;<<<<<<<<<<<<<<<<<<<<<<<<<<<0;;;<;; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:8:165:441:708 83 chr2 737 99 35M = 550 -222 CCATCATAAATACACACAAAAGTACAAAACTCACA 6+<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:246:177:525 147 chr2 738 98 35M = 549 -224 CATCATAAATACACACAAAAGTAAAAAACTCACAG %<(4<2<<<<<:<;<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS114_26:5:43:114:617 83 chr2 738 99 35M = 579 -194 AATCATAAATACACACAAAAGTACAAAACTCACAG +=22=6=================9=========== MF:i:18 Aq:i:52 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS1_99:8:152:778:228 163 chr2 739 99 35M = 915 211 ATCATAAATACACACAAAAGTACAAAACTCACAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:3:24:319:429 83 chr2 740 99 35M = 582 -193 TAATAAATACACACAAAAGTACAAAACTCACAGGT 0%=3%=3====<=9=====89==93==9=6===== MF:i:18 Aq:i:56 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS51_66:5:210:674:911 99 chr2 740 99 35M = 904 199 TCATAAATACACACAAAAGTACAAAACTCACAGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:88:451:1773 99 chr2 742 99 35M = 902 195 ATAAATACACACAAAAGTACAAAACTCACAGGTTT ;;:::<:;:<<;:6::;:;;:::;;<;;;367177 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:2:168:1878 147 chr2 743 37 35M = 560 -218 TAAATACACACAAAAGTAGAAAACGCACCAGTTTT *3/6)9.;;;;;;;;5;;);;;3;(;;;+(;7.)3 MF:i:130 Aq:i:37 NM:i:4 UQ:i:32 H0:i:0 H1:i:0
+EAS188_7:5:115:249:673 83 chr2 743 99 35M = 552 -226 TAAATACACACAAAAGTACAAAACTCACAGGTTTT :<<<;<<<;<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:178:187:610 99 chr2 744 99 35M = 903 194 AAATACACACAAAAGTACAAAACTCACAGGTTTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:9:49:661 83 chr2 747 99 35M = 591 -191 TACACACAAAAGTACAAAACTCACAGGTTTTATAA <<6<5<<<<<<<<<<<<<<<<<<<7<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:157:361:309 147 chr2 747 99 35M = 589 -193 TACACACAAAAGTACAAAACTCACAGGTTTTATAA :<-<5<0<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:103:443:166 83 chr2 747 99 35M = 565 -217 TACACACAAAAGTACAAAACTCACAGGTTTTATAA 7<4<4<:<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:8:49:182:192 147 chr2 750 99 35M = 582 -203 ACACAAAAGTACAAAACTCACAGGTTTTATAAAAC <5<;<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:12:630:707 99 chr2 751 99 35M = 915 199 CACAAAAGTACAAAACTCACAGGTTTTATAAAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:7:94:1440:2016 83 chr2 751 99 35M = 564 -222 CACAAAAGTACAAAACTCACAGGTTTTATAAAACA :<8<<<<9<<9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:206:741:810 163 chr2 753 99 35M = 929 210 CAAAAGTACAAAACTCACAGGTTTTATAAAACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;:-;<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:250:698:842 83 chr2 753 99 34M = 554 -233 AAAAAGTACAAAACTCACAGGTTTTATAAAACAA )<<<<<<<-<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+EAS54_81:6:265:251:147 83 chr2 754 99 35M = 581 -208 AAAAGTACAAAACTCACAGGTTTTATAAAACAATT <<<<::<8<<<;<;8<8<<<<<<<<:<<<<<<<<< MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:71:644:1792 83 chr2 754 84 35M = 589 -200 AAAAGTACAAAACTCACAGGTTTTATAAAACAATT <<<<;<<<<<<:;/<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:6:108:958:42 83 chr2 755 81 35M = 584 -206 AAAGTACAAAACTCACAGGTTTTATAAAACAATTA <<<;;</<<<<;<<<<<<<<<<<<<<<<<<<<<<+ MF:i:18 Aq:i:9 NM:i:1 UQ:i:27 H0:i:0 H1:i:3
+B7_597:8:48:805:860 147 chr2 755 78 35M = 563 -227 AAAGTACAAAACTCACAGGTTTTATAAAACAATTA <<<;3<;7<<97<7<<<<7<4<<<<<<<<<<;8<+ MF:i:18 Aq:i:13 NM:i:1 UQ:i:27 H0:i:0 H1:i:3
+B7_591:3:179:496:161 163 chr2 756 99 36M = 919 199 AAGTACAAAACTCACAGGTTTTATAAAACAATTAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+ MF:i:18 Aq:i:49 NM:i:2 UQ:i:53 H0:i:1 H1:i:0
+EAS56_59:3:166:626:836 83 chr2 757 99 35M = 567 -225 AGTACAAAACTCACAGGTTTTATAAAACAATTAAT <;;7<<<<<<;<7;<<<<<<<<<<<<7<<<<<<<+ MF:i:18 Aq:i:28 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS114_28:5:23:944:377 147 chr2 757 75 36M = 579 -214 AGTACAAAACTCACAGGTTTTATAAAACAATTAATT <;7;8<<<<:<;<:<<<<<<<<<<<<<;<<<<<<<; MF:i:130 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_45:1:100:979:1863 147 chr2 757 85 35M = 583 -209 ATTACAAAACTCACAGGTTTTATAAAACAATTAAT 6&,*3;6;66;9(572692;;;79;4)9;96;59+ MF:i:18 Aq:i:23 NM:i:3 UQ:i:51 H0:i:0 H1:i:0
+EAS219_1:3:90:219:528 83 chr2 758 75 35M = 576 -217 GTACAAAACTCACAGGTTTTATAAAACAATTAATT ;:<5<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_108:5:89:942:84 83 chr2 759 74 35M = 562 -232 TACAAAACTCACAGGTTTTATAAAACAATTAATTG ===================>=>>>==>>===>==> 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:130 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:5:32:461:154 99 chr2 769 71 16M4I15M = 945 211 ACAGGTTTTATAAAACAATTAATTGAGACTACAGA <<<<<<<<<<<<<<<:<<<<<<<<<<<<<<<+<;; MF:i:130 Aq:i:71 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_39:6:7:492:1088 99 chr2 769 57 16M4I15M = 926 192 ACAGGTTTTATAAAACAATTAATTGAGACTACAGA <<<<<<<<<<<<<<<<<<<<<<<<7<:<<<<<<6; MF:i:130 Aq:i:57 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_95:6:174:650:125 147 chr2 770 76 15M4I16M = 600 -201 CAGGTTTTATAAAACAATTAATTGAGACTACAGAG ===;=============================== MF:i:130 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_59:6:89:457:591 147 chr2 770 69 15M4I16M = 585 -216 CAGGTTTTATAAAACAATTAATTGAGACTACATAG 797<<9<<<<<<<3<7<<<<<<<<<<)<<<<<07< MF:i:130 Aq:i:69 NM:i:1 UQ:i:15 H0:i:0 H1:i:0
+EAS114_39:2:38:670:564 99 chr2 770 73 15M4I16M = 930 195 CAGGTTTTATAAAACAATTAATTGAGACTACAGAG <<<<<<<<<<<<<<<<<<<<<<<;<:<<<<;<5<; MF:i:130 Aq:i:73 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS188_7:4:92:693:228 147 chr2 770 75 14M4I17M = 601 -200 AAGGTTTTATAAAAAAATTAATTGAGACTACAGAG 6=77=<<=======&==================== MF:i:130 Aq:i:75 NM:i:1 UQ:i:28 H0:i:0 H1:i:0
+EAS218_1:4:61:1369:440 163 chr2 770 47 15M4I16M = 964 229 CAGGTTTTATAAAACAATTAATTGAGACTACAGAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<8 MF:i:130 Aq:i:47 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_26:4:123:1001:580 83 chr2 771 43 14M4I17M = 617 -185 AGGTTTTATAAAACAATTAATTGAGACTACAGAGC <.00..3<6<<<<<<<3;<<08<<<<<6<<<<<<< MF:i:130 Aq:i:43 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_39:4:10:1312:1558 163 chr2 771 76 14M4I17M = 928 192 AGGTTTTATAAAACAATTAATTGAGACTACAGAGC 5<<<<<<<<<<<<<<<<<<<<<<<;;<<<<<;8;< MF:i:130 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS220_1:8:45:178:1321 83 chr2 771 77 14M4I17M = 606 -196 AGGTTTTATAAAACAATTAATTGAGACTACAGAGC <<<<<<<<<<<<<<<<<:<<:<<<<<<<<<<<<<< MF:i:130 Aq:i:77 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_59:5:125:137:58 163 chr2 772 76 13M4I18M = 932 195 GGTTTTATAAAACAATTAATTGAGACTACAGAGCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<9;< MF:i:130 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS192_3:3:285:349:797 83 chr2 773 76 12M4I19M = 604 -200 GTTTTAAAAAACCAATAATTGAGACTACAGAGCAA ;;<<<7.:<<<..<.<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:76 NM:i:1 UQ:i:13 H0:i:0 H1:i:0
+EAS114_45:5:56:1757:1319 163 chr2 775 67 10M4I21M = 957 217 TTTATAAAACAATTAATTGAGACTACAGAGCAACT ;;;;9;;;;;;;;;;;;;4;9;98;;;;;9388&7 MF:i:130 Aq:i:67 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+B7_591:3:291:404:199 83 chr2 777 76 8M4I24M = 612 -197 TATAAAACAATTAATTGAGACTACAGAGCAACTAGG <<<<<<<7<<9<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS54_65:7:159:253:353 83 chr2 778 67 7M4I24M = 613 -196 ATAAAACAATTAATTGAGACTACAGAGCAACTAGG <8<<<<:<<;;<<<<<<<<<<<;<<<<<<<<<<<< MF:i:130 Aq:i:67 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_57:1:122:38:103 163 chr2 778 79 7M4I24M = 972 229 ATAAAACAATTAATTGAGACTACAGAGCAACTAGG <<<<<<<<<<<<<<<<;<<<<<<<<3<<<<9<8;< MF:i:130 Aq:i:79 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS188_4:5:103:870:105 147 chr2 778 44 7M4I24M = 595 -214 ATAAAACAATTAATTGAGACTACAGAGCAACTAGG <<<<<<<<<<<<<=<:<;<<<<<<<<<<*<<<<<< MF:i:130 Aq:i:44 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_105:8:24:718:322 163 chr2 779 23 35M = 953 209 ACAATTAATTGAGACTACAGACCAATTATGTAAAA 5/7<3+<;<1<<1<95<.&&.&&.<&)5)1)17<% MF:i:130 Aq:i:23 NM:i:3 UQ:i:18 H0:i:0 H1:i:0
+EAS51_64:6:118:41:489 83 chr2 779 76 35M = 588 -226 ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA <+<<;<<<38<<<<5<<3<<<<3<<8<<<<<<<<< MF:i:130 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS56_61:3:165:665:220 83 chr2 779 76 35M = 618 -196 ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA <:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:76 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS114_30:6:238:803:383 99 chr2 779 75 35M = 954 210 ACAATTAATTGAGACTACAGAGCAACTAGGTAAAA <<<<<<<<<<<<;<<<<<;<;<<;<<;<<<9<;<< MF:i:130 Aq:i:75 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS1_105:3:232:364:583 99 chr2 780 71 35M = 956 211 CAATTAATTGAGACTACAGAGCAACTAGGTAAAAA <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:130 Aq:i:71 NM:i:0 UQ:i:0 H0:i:0 H1:i:0
+EAS139_19:2:2:1217:398 83 chr2 780 99 40M = 608 -212 CAATTAATTGAGACTACAGAGCAACTAGGTAAAAAATTAA +;;:9<<66<<<;+<<7<<<<;<<+;<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:3 UQ:i:73 H0:i:1 H1:i:0
+B7_593:2:81:435:410 99 chr2 782 99 36M = 966 220 ATTAATTGAGACTACAGAGCAACTAGGTAAAAAATT <<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<;<<;; MF:i:18 Aq:i:29 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+B7_593:3:115:649:259 147 chr2 782 99 36M = 617 -201 ATTAATTGAGAATACAGAGCAACTAGGTAAAAAATT ;<;<<;<<<<;&<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:3 UQ:i:58 H0:i:0 H1:i:1
+EAS1_93:3:181:93:694 163 chr2 783 99 35M = 954 206 TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT ++<<<<<<;<<<<<<:;8<<;<<<5;<;<<<+<<< MF:i:18 Aq:i:28 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS114_30:1:188:863:790 163 chr2 783 98 35M = 969 221 TTAATTGAGACTACAGAGCAACTAGGTAAAAAATT ++<;<<;;;:<<<<:<:<<:1<<1<<<6:6;4;;4 MF:i:18 Aq:i:27 NM:i:2 UQ:i:54 H0:i:0 H1:i:0
+EAS1_93:2:313:711:530 163 chr2 784 99 35M = 968 219 TAATTGAGACTACAGAGCAACTAGGTAAAAAATTA +<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<: MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_589:7:154:26:712 99 chr2 786 99 35M = 959 208 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC <<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:185:87:475 163 chr2 786 99 36M = 949 199 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:69:1593:819 163 chr2 786 99 40M = 977 231 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAACATTAC <<<<<<<<<<<<<<;<<<<<;;<:<<<<<:<<<<<:777: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:309:187:267 83 chr2 786 99 35M = 616 -205 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC <:0;<;<4<<7<<<<:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:8:82:1540:77 83 chr2 786 99 35M = 619 -202 ATTGAGACTACAGAGCAACTAGGTAAAAAATTAAC <48;<;</;<<<<<<:<<0<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:193:420:78 147 chr2 787 99 35M = 607 -215 TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA 81<<;<9<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:261:267:597 83 chr2 787 86 35M = 617 -205 TTGAGAATAAAGAGCAACTAGGTAAAAAATTAACA *-1<9<+1<+<<<<:<<;9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:41 NM:i:2 UQ:i:20 H0:i:0 H1:i:1
+EAS56_59:4:262:928:237 99 chr2 787 99 35M = 971 219 TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:262:53:888 163 chr2 787 99 35M = 965 213 TTGAGACTACAGAGCAACTAGGTAAAAAATTAACA <<<<<<<<;<<<<<<<<<<;<<;<;<;6<<;<;;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:138:211:582 99 chr2 788 99 35M = 957 204 TGAGACTACAGAGCAAATAGGTAAAAAATTAACAT <<;<<<<<<<<<<<<<&;<;<7<<;<<<<<<<5<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_597:7:113:408:211 99 chr2 789 99 35M = 952 198 GAGACTACAGAGCAACTAGGTAAAAAATTAACATT <<<<<<<<<<<<<<<:&<<<&:<<<<<<<<<<;:/ MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:3:79:879:15 147 chr2 790 99 35M = 626 -199 AGACTACAGAGCAACTAGGTAAAAAATTAACATTA <;;5;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:325:795:213 83 chr2 790 99 35M = 618 -207 AGACTACAGAGCAACTAGGTAAAAAATTAACATTA <<<0<<;<<<<;<<;:<<<<<<<<<<<;<<<<<9< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:4:22:206:150 83 chr2 792 99 35M = 619 -208 AAAAAAGAGCAACTAGGTAAAAAATTAACATTACA 8&)<)<<<<+<<+<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:3 UQ:i:21 H0:i:1 H1:i:0
+EAS56_59:5:181:713:140 147 chr2 793 84 35M = 615 -213 CTACAGAGCAACAAGGTAAAAAATTAACATTACAA 78<+<7<-7;;;&<5<7<<<<7<<<<<<<<<<<7< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_589:7:76:306:561 163 chr2 794 89 35M = 987 228 TACAGAGCAACTAGGTAAAAAATTAACATTACAAC <<)<<<<<<8<<8<<<<<<<;;;<<1<<3;=7<<9 MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:4:325:352:67 83 chr2 794 99 35M = 622 -207 TACAGAGCAACTAGGTAAAAAATTAACATTACAAC ;<8<<<;;<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:310:287:420 99 chr2 794 99 35M = 965 206 TACAGAGCAACTAGGTAAAAAATTAACATTACAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:5:74:329:459 83 chr2 795 99 35M = 623 -207 ACAGAGCAACTAGGTAAAAAATTAACATTACAACA </<;<8/<<9<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:57:1342:1166 99 chr2 796 99 35M = 964 203 CAGAGCAACTAGGTAAAAAATTAACATTACAACAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:542:428 163 chr2 797 99 35M = 965 203 AGAGCAACTAGGTAAAAAATTAACATTACAACAGG 7<4<<<6<<,<9)<<<<6<,<<7<<7<<<<<<<<1 MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:97:892:419 83 chr2 800 99 35M = 621 -214 GCAACTAGGTAAAAAATTAACATTACAACAGGAAC ;8<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:82:1051:921 83 chr2 800 99 40M = 616 -224 GCAAATAGGTAAAAAATTAACATTACAACAGGAACAAAAC 3-::-7<;+:9<;<<<5<;9,::53-;:3<<<<9<<3<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS1_95:5:263:511:936 147 chr2 801 99 35M = 629 -207 CAAATAGGTAAAAAATTAACATTACAACAGGAACA +<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS114_26:7:157:876:302 163 chr2 801 99 35M = 964 198 CAACTAGGTAAAAAATTAACATTACAACACGAACA 2<<;<<<22<<<<<<77<<<<22<7<<<<%-<<1< MF:i:18 Aq:i:66 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS54_65:2:127:288:655 163 chr2 803 99 35M = 999 231 ACTAGGTAAAAAATTAACATTACAACAGGAACAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<<;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:83:731:540 147 chr2 804 99 35M = 623 -216 CTAGGTAAAAAATTAACATTACAACAGGAACAAAA ;7<:+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:82:843:1838 99 chr2 804 99 35M = 999 230 CTAGGTAAAAAATTAACATTACAACAGGAACAAAA ;<<;:;;<<<;;<<<<;;<<;;;;;<;;;;68887 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:71:994:576 147 chr2 805 99 35M = 655 -185 TAGGTAAAAAATTAACATTACAACAGGAACAAAAC <<9;;<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:24:415:944 99 chr2 805 99 35M = 974 204 TAGGTAAAAAATTAACATTACAACAGGAACAAAAC <<<<<<<<<<<<<<<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:3:73:1458:1337 83 chr2 806 99 35M = 609 -232 AGGTAAAAAATTAACATTACAACAGGAACAAAACC <</<<<<<<<6:<::<<<1<<:<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:142:353:398 163 chr2 807 99 35M = 977 205 GGTAAAAAATTAACATTACAACAGGAACAAAACCT =================================9= MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:46:522:426 163 chr2 807 99 35M = 964 192 GGTAAAAAATTAACATTACAACAGGAACAAAACCT =======================:==;<===78== MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:59:871:351 163 chr2 808 99 35M = 963 190 GTAAAAAATTAACATTACAACAGGAACAAAACCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:6:235:505:553 163 chr2 808 99 35M = 987 214 GTAAAAAATTAACATTACAACAGGAACAAAACCTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;:;: MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:60:1420:660 83 chr2 808 99 35M = 649 -194 GTAAAAAATTAACATTACAACAGGAACAAAACCTC 99<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:180:89:582 147 chr2 809 99 36M = 650 -195 TAAAAAATTAACATTACAACAGGAACAAAACCTCAT ;<<<<<<4<<<:<<<<<<<<<6<<<<<<<<<<;<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:323:196:855 83 chr2 809 99 35M = 642 -202 TAAAAAATTAACATTACAACAGGAACAAAACCTCA &<<<<<<09<<7<7;<;<<0<<<<<;<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:295:547:216 163 chr2 809 99 35M = 970 196 TAAAAAATTAACATTACAACAGGAACAAAACCTCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:126:361:250 99 chr2 810 99 35M = 1002 227 AAAAAATTAACATTACAACAGGAACAAAACCTCAT <<<<<<;9<<<<<<<<<<<<<<;;;<<<;<664;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:266:133:789 99 chr2 810 99 35M = 988 213 AAAAAATTAACATTACAACAGGAACAAAACCTCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:175:149:296 83 chr2 811 99 35M = 614 -232 AAAAATTAACATTACAACAGGAACAAAACCTCATA =;==26==;==;================7====== MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:136:260:254 99 chr2 813 99 35M = 988 210 AAATTAACATTACAACAGGAACAAAACCTCATATA <<<<<<<<<<<<<<<<<<><<<<<<<<<<<<<<<< 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:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:64:526:339 163 chr2 819 96 35M = 1019 235 ACATTACAACAGGAACAAAACCTCATATATCAATA <<<<<<<<;<<<<<<<<<<7<:<<<<<<<<<8:<: MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:97:743:602 83 chr2 821 99 34M = 644 -211 ATTACAACAGGAACAAAACCTCATATATCAATAT <(&<:<<&<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:2 H1:i:6
+B7_610:2:75:887:149 163 chr2 823 99 35M = 1004 216 TACAACAGGAACAAAACCTCATATATCAATATTAA <<<<<<<<<<<<<<;<<<<<<<;<<<<<<<;<;;; MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS221_1:2:73:955:728 83 chr2 823 44 35M = 660 -198 TACAACAGGAACAAAACCTCATATATCAATATTAA ;<-<<6<;<<<6<<<<;7<6<<<<<<<<<<<<<<< MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:3 H1:i:18
+EAS1_108:2:102:543:160 163 chr2 825 99 35M = 977 187 CAACAGGAACAAAACCTCATATATCAATATTAACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<6<:< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_28:2:55:562:403 83 chr2 825 99 36M = 643 -218 CAACAGGAACAAAACCTCATATATCAATATTAACTT +<<&<<<<<<<<<<+<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+B7_593:1:19:695:59 99 chr2 826 99 36M = 988 198 AACAGGAACAAAACCTCATATATCAATATTAACTTT <<<<<<<<<<<;<<<<<<<<<;<<;;<;<<7<<<<; MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS221_1:2:8:327:522 163 chr2 826 99 35M = 1001 210 AACAGGAACAAAACCTCATATATCAATATTAACTT <<<<<<<<<<:<<<<<<<<<<:<<<<<<<<<:<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS114_45:6:90:561:850 163 chr2 827 85 35M = 1004 212 ACAGGAACAAAACCTCATATATCAATATTAACTTT ;;;;;;;;;;;;;;;;;;;;;;;;9;9;6;77777 MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:2 H1:i:25
+EAS56_61:5:209:824:866 83 chr2 828 73 35M = 665 -198 CAGCAACAAAACCTCATATATCAATATTAACTTTG ;<:&<<:<<<<;<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:1 UQ:i:5 H0:i:1 H1:i:7
+EAS139_11:2:31:628:1820 83 chr2 828 98 35M = 675 -188 CAGGAACAAAACCTCATATATCAATATTAACTTTG <<<<<<:<<<<:6<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS220_1:4:6:1178:1105 147 chr2 830 93 35M = 657 -208 GGAACAAAACCTCATATATCAATATTAACTTTGAA <:<<9<<<<::7<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:11
+EAS114_28:4:305:707:258 99 chr2 831 58 36M = 992 197 GAACAAAACCTCATATATCAATATTAACTTTGAATA 9<<<<<<<<<<<<;<<-<<;;<;<<9<<;<<+99;7 MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:2 H1:i:9
+EAS54_67:3:114:736:433 163 chr2 832 63 35M = 998 201 AACAAAACCTCATATATCAATATTAACTTTGAATA ;<<9<8;<<<<8<8<;<<;;;0<<8;<;<<47;;; MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_591:7:157:447:758 99 chr2 833 99 36M = 994 197 ACAAAACCTCATATATCAATATTAACTTTGAATAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_591:4:159:508:571 99 chr2 834 84 36M = 989 191 CAAAACCTCATATATCAATATTAACTTTGAATAAAA <<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS54_65:7:68:825:405 163 chr2 835 30 35M = 1015 215 AAAACCTCATATATCAATATTAACTTTGAATAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;9 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+B7_593:3:102:856:670 99 chr2 836 99 36M = 1025 225 AAACCTCATATATCAATATTAACTTTGAATAAAAAG <<<<<<<;<<<;<<;:<<<<<<<<<<:;;<<;<<<7 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:260:827:289 163 chr2 836 99 35M = 999 198 AAACCTCATATATCAATATTAACTTTGAATAAAAA <<<<2<<<<;<<<<;<<<<<<:<<<&-<8<<88<3 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS114_28:1:220:801:282 147 chr2 837 99 36M = 660 -213 AACCTCATATATCAATATTAACTTTGAATAAAAAGG ;7;87;===;==;====:===<==7=========== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:57:1675:720 147 chr2 841 99 35M = 684 -192 TCATATATCAATATTAACTTTGAATAAAAAGGGAT <,<<<<<<:<<<<<<<<:9<<<<<<<<;<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:297:949:26 83 chr2 842 99 35M = 676 -201 CATATATCAATATTAACTTTGAATAAAAAGGGATT 5<;<;<;:<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:1:76:34:691 89 chr2 843 58 35M * 0 0 ATATATCAATATTAACTTTGAATAAAAAGGGATTA <<<<<<16<<<<<916<<<499<966161919<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:5:98:995:929 83 chr2 844 99 35M = 680 -199 TATAACAATATTAACTTTGAATAAAAAGGGATTAA &<+<'7<<+<&<<<7+4<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:63 NM:i:1 UQ:i:6 H0:i:1 H1:i:0
+EAS139_19:3:58:923:1915 163 chr2 846 99 40M = 1007 201 TATCAATATTAACTTTGAATAAAAAGGGATTAAATTCCCC <<<<<<<<<<<<<<<<<<<<<<<<<;<;<<<<<<<::::: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:181:476:394 83 chr2 847 99 35M = 666 -216 AACAATATTAACTTTGAATAAAAAGGGATTAAATT <+;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS112_32:7:322:391:742 147 chr2 847 99 35M = 667 -215 ATCAATATTAACTTTGAATAAAAAGGGATTAAATT <63<<<<9<<<:<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:8:17:437:1378 83 chr2 847 99 35M = 676 -206 ATCAATATTAACTTTGAATAAAAAGGGATTAAATT <<7<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:155:375:623 163 chr2 849 99 35M = 1029 215 CAATATTAACTTTGAATAAAAAGGGATTAAATTCC 0<<<<<;<<<<<<<<<<<<<4<<8<<<<<<<<;<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:29:729:70 163 chr2 850 51 35M = 1009 194 ANTATTANCTTTGANNAAAAAGGGATTAAATTCCC :!<:<<8!::::5:!!:.77::33888633:8777 MF:i:130 Aq:i:51 NM:i:3 UQ:i:0 H0:i:0 H1:i:0
+EAS54_65:7:117:452:744 83 chr2 850 99 35M = 676 -209 AATATTAACTTTGAATAAAAAGGGATTAAATTCCC <;;<;<<<7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:50 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:288:384:444 83 chr2 855 99 35M = 696 -194 TAACTTTGAATAAAAAGGGATTAAATTCCCCCACT ;=9;;<====<=;=/=9;<========<======= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:133:514:754 163 chr2 855 63 36M = 1036 217 TAAATTTGAATAAAAAGGGATTAAATTCCCCCACTT ***&,,,+(*,*********+*)*(***(**((*)( MF:i:18 Aq:i:19 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS139_19:5:68:306:409 147 chr2 856 99 40M = 682 -214 AACTTTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG ::2:7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:3:155:758:710 163 chr2 859 98 35M = 1048 224 TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG =======8================6=:7===:=:= MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:39:208:644 147 chr2 859 99 35M = 704 -190 TTTGAATAAAAAGGGATTAAATTCCCCCACTTAAG 78899;;;;4;;;;;;;;;;;;;;;;;;8;;8;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:16:438:245 89 chr2 860 65 35M * 0 0 TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA 8*8<5'<77;;;;;7<7<<7-<;<<<;;<<<;;79 MF:i:32 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:145:635:390 83 chr2 860 99 35M = 673 -222 TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGA +9;<<;<<<<<;;;<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:6:187:996:432 147 chr2 860 99 36M = 693 -203 TTGAATAAAAAGGGATTAAATTCCCCCACTTAAGAG ;<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:123:924:645 163 chr2 861 84 36M = 1045 220 TGAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA <<<<<<<<<<<<;<<<<<<;<<<<<<<6:<7<1<+< MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:146:961:63 163 chr2 861 86 35M = 1041 215 TGAATAAAAAGGGCTTAAATTCCCCCACTTAAGGG <<+<<<<::+1<;&<<88<<<<;;.<0;;85(;(8 MF:i:18 Aq:i:37 NM:i:2 UQ:i:12 H0:i:0 H1:i:1
+EAS114_30:6:4:665:771 69 chr2 862 0 * = 862 0 GTGCTTTATCTGATATCAATGCCGATAAACTGCCT <<<<<<<<<<<<%<8<3:7:77<(7,:3(:&2:(0 MF:i:192
+EAS114_30:6:4:665:771 137 chr2 862 71 35M = 862 0 GAATAAAAAGGGATTAAATTCCCCCACTTAAGAGA <;<<;<18<;<8<<<<;<;;<<<<1<<<<6;;;;; MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:45:601:439 83 chr2 864 99 35M = 691 -208 ATAAAAAGGGATTAAATTCCCCCACTTAAGAGATA <8<<<<<<1<<<<<<<<)<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:126:966:514 163 chr2 865 99 35M = 1027 197 TAAAAAGGGATTAAATTCCCCCACTTAAGAGATAT <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:76:1765:700 83 chr2 866 99 35M = 680 -221 AAAAAGGGATTAAATTCCCCCACTTAAGAGATATA 77777;;;;7;7;<;;;;+;;<9<<<79;<1<<77 MF:i:18 Aq:i:63 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:155:807:19 99 chr2 867 99 35M = 1074 242 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG <<<<<<<<<<<<<<<<9+<<<<<<9<<9;4<<<<: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:226:885:729 99 chr2 867 98 35M = 1037 205 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG <<<;<<<<<<;<;<<<<<<<:;<<;4;%;<<;<<. MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:1:156:196 99 chr2 867 77 40M = 1042 215 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAGATTGG <<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<:;9:9 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:52:1144:509 147 chr2 867 99 35M = 706 -196 AAAAGGGATTAAATTCCCCCACTTAAGAGATATAG <<<<:<<<<<<<<<<;::;:<;<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:73:735:329 99 chr2 868 99 35M = 1035 202 AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA ================;==;====;=;=======; MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:11:801:386 163 chr2 868 97 35M = 1061 228 AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA <<<<<<<<<<8<<<<<:4<::<854:5<:::;4+4 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:150:94:843 99 chr2 868 75 35M = 1050 217 AAAGGGATTAAATTCCCCCACTTAAGAGATATAGA <<<<<<<<7<<<6<<<<<<<<<<<6<<62<<<<<2 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:255:796:239 147 chr2 869 99 35M = 692 -212 AAGGGATTAAATTCCCCCACTTAAGAGATAGAGAT <<3;;<7:<<<;(7<<7;<<;<<<<<<<<<7<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:22 H0:i:0 H1:i:1
+B7_589:5:147:405:738 163 chr2 870 99 35M = 1048 213 AGGGATTAAATTCCCCCACTTAAGAGATATAGATT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:33:357:858 83 chr2 870 99 35M = 716 -189 AGGGATTAAATTCCCCCACTTAAGAGATATAGATT <;<:<<<<<<<<<;<9<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:122:398:994 83 chr2 871 99 35M = 708 -198 GGGATTAAATTCCCCCACTTAAGAGATATAGATTG 95:<9<<<<:9<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_105:2:146:374:692 147 chr2 874 99 35M = 690 -219 ATTAAATTCCCCCACTTAAGAGATATAGATTGGCA <4:<<<1:<:<::<<<;<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:119:428:415 163 chr2 876 99 36M = 1037 197 TAAATTCCCCCACTTAAGAGATATAGATTGGCAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;<;;; MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:7:168:247:414 147 chr2 876 99 35M = 698 -213 TAAATTCCCCCACTTAAGAGATATAGATTGGCAGA ,;;;,146<6;6<<8<<<<1<8<<<<<<<<<<;1< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:130:609:467 147 chr2 877 99 35M = 728 -184 AAATTCCCCCACTTAAGAGATATAGATTGGCAGAA ===:2===;<====>==>=>=>=>>>==>>>=>>> 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 <<<<<<<<<<<<<<<<<<<<<<<<<:::<:;</;/ MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:251:819:772 147 chr2 881 99 36M = 726 -191 TCCCCCACTTAAGAGATATAGATTGGCAGAACAGAT 6+7++1<<%<<<<<<<+<+<9<<99<9<<<<<<9<< MF:i:18 Aq:i:59 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:36:481:1079 83 chr2 881 99 40M = 707 -214 TCCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAA :11+)*<4;<<<<<<<<<;;<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:29:411:1208 147 chr2 882 99 40M = 698 -224 CCCCCACTTAAGAGATATAGATTGGCAGAACAGATTTAAA 766+6<996<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:62:1076:540 99 chr2 882 99 35M = 1066 219 CCCCCACTTAAGAGATATAGATTGGCAGAACAGAT <<<<<<<<<<;<<<<<<<<<<<<<<<<;;<<;<7; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:189:530:40 83 chr2 883 99 36M = 698 -221 CCCCACTTAAGAGATATAGATTGGCAGAACAGATTT 883;<<<<<<<<<:<<<<<<<<3<;<<<<<<<<;<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:113:856:319 163 chr2 884 99 35M = 1067 216 CCCACTTAAGAGATATAGATTGGCAGAACAGATTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:55:296:1457 99 chr2 884 99 35M = 1061 212 CCCACTTAAGAGATATAGATTGGCAGAACAGATTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:15:881:1932 99 chr2 886 92 35M = 1061 210 CACTTAAGAGATATAGATTGGCAGAACAGATTTAA <<<<<<<<<<<<<<<;<<<<:<<<2<26<8<<;;. MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:116:157:612 147 chr2 889 99 35M = 707 -217 TTAAGAGATATAGATTGGCAGTACAGATTTAAAAA ;;<<<<<<<<<<<<<<<<;<</<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+EAS114_28:7:215:863:521 83 chr2 890 99 36M = 732 -194 TAAGAGATATAGATTGGCAGAACAGATTTAAAAACA ;<<<<<<<<<<<<<;<<;<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:254:572:431 163 chr2 891 97 35M = 1048 192 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <<<<<<<<<<<<<<<<;<<<<<<<<<<<99;;;;; MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:273:424:207 163 chr2 891 99 35M = 1066 210 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <,<,<9<<9<<<<<<<<<<79<,599,<191<99+ MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:4:571:820 163 chr2 891 99 35M = 1071 215 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <<<<<<<<<<<9<<;9<;;;<;6;:<<<3:;;;:6 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:36:1231:1381 147 chr2 891 99 35M = 708 -218 AAGAGATATAGATTGGCAGAACAGATTTAAAAACA <<<<<<;<<<<<<<<<8<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:66:718:481 99 chr2 891 99 40M = 1072 221 AAGAGATATAGATTGGCAGAACAGATTTAAAAACATGAAC <<<<<<<<<<<<<<;<<<<<<<<;<<<<<<<;<<<:1:;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:22:632:176 163 chr2 894 99 36M = 1091 233 AGATATAGATTGGCAGAACAGATTTAAAAACATGAA <<<<<;<<<<<<;<<;<:<<<:<<:<<<;<<<;;;: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:271:180:509 147 chr2 896 99 35M = 729 -202 ATATAGATTGGCAGAACAGATTTAAAAACATGAAC <<<<<<<<<9<:<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:198:564:731 163 chr2 898 99 35M = 1089 226 ATAGATTGGCAGAACAGATTTAAAAACATGAACTA <<<<<;<<<<<<;<<:<<;9<<<<<<<<1;<<58< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:67:1467:1447 83 chr2 898 99 35M = 722 -211 ATAGATTGGCAGAACAGATTTAAAAACATGAACTA <<<<<::<<:<<<<:<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:172:827:592 83 chr2 899 99 35M = 703 -231 TAGATTGGCAGAACAGATTTAAAAACATGAACTAA 8<<<<;7;7<<<<;<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:240:719:799 147 chr2 900 99 35M = 720 -215 AGATTGGCAGAACAGATTTAAAAACATGAACTAAC <:<<<<<:<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:24:1345:1627 73 chr2 900 78 35M = 900 0 AGATTGGCAGAACAGATTTAAAAACATGAACTAAC <<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<8<3 MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:24:1345:1627 133 chr2 900 0 * = 900 0 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:192
+EAS139_19:1:58:726:1746 163 chr2 900 99 40M = 1061 201 AGATTGGCAGAACAGATTTAAAAACATGAACTAACTATAT <<<<<<<<<<<<<<<<<<<6<<<<8<<<<<<<<:8:8:88 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:88:451:1773 147 chr2 902 99 35M = 742 -195 ATTGGCAGAACAGATTTAAAAACATGAACTAACTA 973776;;;;;;;;;::;;;;;;;;;;;;;;3;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:178:187:610 147 chr2 903 99 35M = 744 -194 TTGGCAGAACAGATTTAAAAACATGAACTAACTAT 66:,:<7<<<<<<<1<<<<<<<<<<<<<<<2<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:6:38:332:54 83 chr2 904 99 36M = 737 -203 TGGCAGAACAGATTTAAAAACATGAACTAACTATAT 8;;&<;<<7<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:210:674:911 147 chr2 904 99 35M = 740 -199 TGGCAGAACAGATTTAAAAACATGAACTAACTATA 27;2<;<<5<<<<;;<<<<<;<<<<<<;<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:82:963:128 83 chr2 905 99 35M = 719 -221 GGCAGAACAGATTTAAAAACATGAACTAACTATAT 585<;<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:2:12:1335:1372 83 chr2 906 99 40M = 721 -225 GAAGAACAGATTTAAAAACATGAACTAACTATATGCTGTT :&;;;<*<<<9<<<<<<<<<<<<<<4<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS114_39:1:98:641:1040 163 chr2 907 99 35M = 1085 213 CAGAACAGATTTAAAAACATGAACTAACTATATGC <<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:8:41:530:663 83 chr2 908 99 35M = 730 -213 AGAACAGATTTAAAAACATGAACTAACTATATGCT =8=;*=5==;;=====:=====;===;======== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:87:430:995 147 chr2 909 67 35M = 731 -213 GAAAAGAGTTAAAAACATGAACTAACTATATGCTG 1<4%81<..1<<<<<0<<<<<0.<<9<<(<6<<6< MF:i:18 Aq:i:30 NM:i:2 UQ:i:17 H0:i:0 H1:i:1
+B7_595:3:85:964:950 163 chr2 910 99 35M = 1095 220 AACAGATTTAAAAACATGAACTAACTATATGCTGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;: MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:8:68:570:705 99 chr2 910 99 35M = 1100 225 AACAGATTTAAAAACATGAACTAACTATATGCTGT <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<8< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:198:503:669 99 chr2 912 99 35M = 1107 230 CAGATTTAAAAACATGAACTAACTATATGCTGTTT <<<<<<<<<<;8<<<<<;<<<<<<;<;<8<<8<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:273:545:1001 163 chr2 913 99 35M = 1088 210 AGATTTAAAAACATGAACTAACTATATGCTGTTTA <<<<<<<<<<<<<<<;;<<<<<<;<8;28<8;<<8 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:152:778:228 83 chr2 915 99 35M = 739 -211 ATTTAAAAACATGAACTAACTATATGCTGTTTACA <;;7=<<<<<<;<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:1:53:463:1132 163 chr2 915 99 40M = 1109 234 ATTTAAAAACATGAACTAACTATATGCTGTTTACANGAAA <<<<<<<<<<<<<<<<<<<<<;<<<8<<<<<<<8<!1488 MF:i:18 Aq:i:71 NM:i:1 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:12:630:707 147 chr2 915 99 35M = 751 -199 ATTTAAAAACATGAACTAACTATATGCTGTTTACA <:<<<<<<<;<<<<<9<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:179:119:876 163 chr2 917 60 35M = 1112 230 TTAAAAACATGAACTAACTATATGCTGTTTACCAG <<<<<<<7<<<<<<<8<<<6<<<<<<7<<<:0&<0 MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:1
+EAS1_97:6:308:667:658 99 chr2 918 10 35M = 1116 233 TAAAAACATGAACTAACTATATCCTTCTTACAATA 9<96<<<;<96<<9<51<<<<<1:9++<9*%4;*5 MF:i:18 Aq:i:10 NM:i:4 UQ:i:45 H0:i:0 H1:i:0
+EAS114_28:5:163:832:715 163 chr2 918 99 36M = 1085 203 TAAAAACATGAACTAACTATATGCTGTTTACAAGAA <<0;<9<<<<<<<<<<<<9<<<<<<<<<<<<;;;<6 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:3:179:496:161 83 chr2 919 99 36M = 756 -199 AAAAACATGAACTAACTATATGCTGTTTACAAGAAA <<<<<9<<<<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:8:13:325:483 163 chr2 919 99 35M = 1101 217 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_103:7:139:578:951 163 chr2 919 98 35M = 1095 211 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<;<<<<<<<<<<<<;<<<<<<<<<<0;; MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_108:8:19:929:765 99 chr2 919 98 35M = 1069 185 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;77< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:5:214:644:390 163 chr2 919 72 35M = 1082 198 AAAAACATGAACTAACTATATGCTGTTTACAAGAA <<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_30:6:243:209:110 83 chr2 920 48 35M = 768 -187 AAAACATGAACTAACTATATGCTGTTTACAAGAAA ;<;;;:<:<:;<<;;<;<;<;7<<;<<;;<;<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:247:900:123 99 chr2 920 99 35M = 1123 238 AAAACATGAACTAACTATATGCTGTTTACAAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;<; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS51_62:7:162:195:761 83 chr2 922 30 35M = 767 -190 AACATGAACTAACTATATGCTGTTTACAAGAAACT <<8<<:<<:<<<<<<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS1_103:2:184:980:396 163 chr2 923 99 35M = 1092 204 ACATGAACTAACTATATGCTGTTTACAAGAAACTC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:2:162:272:415 99 chr2 923 83 35M = 1112 224 ACATGAACTAACTATATGCTGTTTACAAGAAACTC <<<<<<<<<<<<<<<<<<<<<<;<<<<<9;<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:184:237:476 163 chr2 925 99 35M = 1101 211 ATGAACTAACTATATGCTGTTTACAAGAAACTCAT <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;<;;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:202:341:984 99 chr2 926 99 35M = 1094 203 TGAACTAACTATATGCTGTTTACAAGAAACTCATT =========================4;======== MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:107:738:484 99 chr2 926 75 35M = 1097 206 TGAACTAACTATATGCTGTTTACAAGAAACTCATT <<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:7:492:1088 147 chr2 926 57 35M = 769 -192 TGAACTAACTATATGCTGTTTACAAGAAACTCATT 4;<<75<<::<:<<<-<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_11:1:81:1019:558 83 chr2 926 77 35M = 760 -201 TGAACTAACTATATGCTGTTTACAAGAAACTCATT <<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:10:1312:1558 83 chr2 928 76 35M = 771 -192 AACTAACTATATGCTGTTTACAAGAAACTCATTAA <<:<<<;<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:4:206:741:810 83 chr2 929 99 34M = 753 -210 ACTAACTATATGCTGTTTACAAGAAACTCATTAA <3<<;5<<<<<;:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:7:200:65:291 147 chr2 930 99 35M = 728 -237 CTAACTATATGCTGTTTACAAGAAACTCATTAATA ;9<;3<<9<7<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:38:670:564 147 chr2 930 73 35M = 770 -195 CTAACTATATGCTGTTTACAAGAAACTCATTAATA 3<<<3:<<<<<:;<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:57:1114:2032 99 chr2 931 99 35M = 1102 206 TAACTATATGCTGTTTACAAGAAACTCATTAATAA <7<<<<<<<<<<<<<<<<<777<<<7<<<<<3<<7 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:125:137:58 83 chr2 932 76 35M = 772 -195 AACTATATGCTGTTTACAAGAAACTCATTAATAAA <<9;<<<<<;<;<<<<;<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:1:38:250:647 163 chr2 933 71 35M = 1100 202 ACTATATGCTGTTTACAAGAAACTCATTAATAAAT <<<<<<<9<<9<<<<<<<6<<<<<<<<<<8<779% MF:i:18 Aq:i:0 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS192_3:6:116:464:261 99 chr2 934 99 35M = 1107 208 CTATATGCTGTTTACAAGAAACTCATTAATAAAGA <<<<<<<<<<<<<<<<<;<<<;<<<<<<<<<;;8< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:168:69:249 163 chr2 936 99 35M = 1125 224 ATATGCTGTTTACAAGAAACTCATTAATAAAGACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:246:647:765 163 chr2 937 99 35M = 1119 217 TATGCTGTTTACAAGAAACTCATTAATAAAGACAT ;<<<<<<<<<;<&<<3+3<<<3<<9&</:/87</8 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:3:307:113:346 163 chr2 938 99 35M = 1123 220 ATGCTGTTTACAAGAAACTCATTAATAAAGACATG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<8 MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:6:159:493:275 147 chr2 939 72 35M = 760 -214 TGCTGTTTACAAGAAACTCATTAATAAAGACATGA 4949;<<<<<<<<<<<6<;<<<<;<<<<<*<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:257:288:731 99 chr2 939 99 34M = 1131 227 TGCTGTTTACAAGAAACTCATTAATAAAGACATG <<<<<<<<8<8<<;<;<<<;<<<5<;;88.8<6< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:231:815:626 163 chr2 940 99 35M = 1119 214 GCTGTTTACAAGAAACTCATTAATAAAGACATGAG <;<<<<9<<<<<<<<<<<<<<<<<;<<;5<<<;:; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:93:77:1338 163 chr2 940 10 35M = 1098 193 GCTGCTTACAAGAAGCGCATTAATAAAGACATGAG <<<<*<2<<<:<4<&<6<8<4<::<8<<<<82;;7 MF:i:18 Aq:i:0 NM:i:3 UQ:i:35 H0:i:0 H1:i:0
+EAS114_45:2:54:1886:719 99 chr2 941 99 35M = 1125 219 CTGTTTACAAGAAACTCATTAATAAAGACATGAGT ;;;9;;<;;;9;;;;;:;<9;:;;;;9;;;99799 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:94:273:165 99 chr2 945 99 35M = 1128 218 TTACAAGAAACTCATTAATAAAGACATGAGTTCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;:7 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:5:32:461:154 147 chr2 945 71 35M = 769 -211 TTACAAGAAACTCATTAATAAAGACATGAGTTCAG ;;</<<<<<;:<.<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:303:131:673 163 chr2 947 99 36M = 1112 201 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<;;; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:10:106:737 163 chr2 947 99 35M = 1106 194 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT <<<;<1<;<<<<<<9<<<<;;<<<<<99<<94008 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:214:950:32 163 chr2 947 99 35M = 1132 220 ACAAGAAACTCATTAATAAAGACATGAGTTCAGGT >>=>>>>==>=>>>==>=>=:=====;=:=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<<</%;/; MF:i:18 Aq:i:66 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS114_28:6:185:87:475 83 chr2 949 99 36M = 786 -199 AAGAAACTCATTAATAAAGACATGAGTTCAGGTAAA <<4<<<+<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:235:899:847 99 chr2 950 99 35M = 1112 197 AGAAACTCATTAATAAAGACATGAGTTCAGGTAAA <<3<;<<<<<<<<<;;<<<<<<<+<<<+6<8<3/< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:193:661:771 163 chr2 952 99 35M = 1129 212 AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG <<<<<<<<<;<<<;;;<<<<<;<<<=;<:;5:9:: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:113:408:211 147 chr2 952 99 35M = 789 -198 AAACTCATTAATAAAGACATGAGTTCAGGTAAAGG <:;:;:<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:8:24:718:322 83 chr2 953 23 35M = 779 -209 AACTCATTAATAATGTCATGAGTTCAGGTAAAGGG 5:+:0;**&+<00&<&<<<5<28<<;;<83<<<<< MF:i:18 Aq:i:23 NM:i:2 UQ:i:10 H0:i:0 H1:i:0
+EAS56_61:5:263:314:696 163 chr2 953 99 35M = 1117 199 AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG <<<<<<<<<<<<<<;<<<<<<<<<<<<:<<;<775 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:93:312:331 163 chr2 953 99 35M = 1145 227 AACTCATTAATAAAGACATGAGTTCAGGTAAAGGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:3:181:93:694 83 chr2 954 99 35M = 783 -206 ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG <4;8<<+<<:<<<<<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:238:803:383 147 chr2 954 75 35M = 779 -210 ACTCATTAATAAAGACATGAGTTCAGGTAAAGGGG ;;<;;<<<<<<<<<<<<<<<<;:<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:44:77:1255 163 chr2 955 99 35M = 1113 193 CTCATTAATAAAGACATGAGTTCAGGTAAAGGGGT ;;;;;;;8;;;7;8;;;;;;;;;;886;;;76777 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:232:364:583 147 chr2 956 71 35M = 780 -211 TCATTAATAAAGACATGAGTTCAGGTAAAGGGGTG ;%;7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:256:354:173 163 chr2 957 99 36M = 1121 200 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3<<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:4:138:211:582 147 chr2 957 99 35M = 788 -204 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG :<8;<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:61:631:567 99 chr2 957 99 35M = 1131 209 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:56:1757:1319 83 chr2 957 67 35M = 775 -217 CATTAATAAAGACATGAGTTCAGGTAAAGGGGTGG &7778<<<<<8<;<<:::;<:<4<<:<:;8<8<;< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:7:154:26:712 147 chr2 959 99 35M = 786 -208 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:10:975:766 163 chr2 959 99 35M = 1166 242 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGAAA <<<<<<<<;<<<<;<:<<;<6;;<<<:6-:+1+;; MF:i:18 Aq:i:64 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_73:5:220:733:736 99 chr2 959 99 35M = 1143 219 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<5<<;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:46:1566:668 163 chr2 959 99 35M = 1148 224 TTAATAAAGACATGAGTTCAGGTAAAGGGGTGGAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:7:59:871:351 83 chr2 963 99 35M = 808 -190 TAAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAG ;<<<<<:<;<<<4;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:46:522:426 83 chr2 964 99 35M = 807 -192 AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA <<<<<:<<<<<<1/<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:157:876:302 83 chr2 964 99 35M = 801 -198 AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA ===:=8=;==:892=,28==88==28====8=;;8 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:61:1369:440 83 chr2 964 47 35M = 770 -229 AAAGACATGATTTCAGGTAAAGGGGTGGAAAAAGA <<<<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+EAS221_1:6:57:1342:1166 147 chr2 964 99 35M = 796 -203 AAAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGA <<<<<;<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:310:287:420 147 chr2 965 99 35M = 794 -206 AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT <<<<;<;<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:262:53:888 83 chr2 965 99 35M = 787 -213 AAGACATGAGTTCAGGTAAAGGGGTGGAAAAAGAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:3:542:428 83 chr2 965 99 35M = 797 -203 AAGACATGAGTTCAGGTACAGGGGTGGAAAAAGAT <<876</3<8874:<8:<)<5<<<;<<<<7<<<:< MF:i:18 Aq:i:41 NM:i:1 UQ:i:8 H0:i:0 H1:i:1
+B7_593:2:81:435:410 147 chr2 966 99 36M = 782 -220 AGACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT ;<;;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:29 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:3:85:219:371 83 chr2 967 99 35M = 817 -185 GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT <<7<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:116:966:193 83 chr2 967 99 35M = 815 -187 GACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGT =================================== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:30:432:228 163 chr2 967 99 35M = 1145 213 GACATGAGTTCAGGGAAAGGGGTGGAAAAAGATGT <<<<<<<<<<<<<<8<<<<<<<<<<<<:<<<<<;; MF:i:18 Aq:i:47 NM:i:1 UQ:i:23 H0:i:0 H1:i:1
+B7_610:1:12:88:200 163 chr2 968 99 35M = 1133 200 ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT <<<<<<<<<<<;<<<<<<<;<<<:<<<<<<9<<5< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:2:313:711:530 83 chr2 968 99 35M = 784 -219 ACATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTT <7;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:74:866:49 163 chr2 969 99 35M = 1143 209 CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC ====================9==91==<=6==;:= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:7:248:17:435 99 chr2 969 99 35M = 1139 205 CATGAGTTCAGGAAAAGGGGTGGAAAAAGATGTTC <<<<8<<<888<+<<<<<;<:<<<<8<<<<<;3<3 MF:i:18 Aq:i:43 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+EAS114_30:1:188:863:790 83 chr2 969 98 35M = 783 -221 CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTC ;<7<<<55<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:75:1503:1399 163 chr2 969 99 40M = 1130 201 CATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC <<<<<<<<<<<<<<<<<<9<<<;<<<<<<;<<<<:::711 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:2:56:155:49 99 chr2 970 99 35M = 1145 210 ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT <<<<<<<<<<<<<<<<<<<<<<;<<;<<<;<9<9; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_4:5:295:547:216 83 chr2 970 99 35M = 809 -196 ATGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:4:262:928:237 147 chr2 971 99 35M = 787 -219 TGAGTTCAGGTAAAGGTGTGGAAAAAGATGTTCTA ;<<<<<;<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS219_1:1:50:257:341 83 chr2 971 99 35M = 813 -193 TGAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:1:122:38:103 83 chr2 972 79 35M = 778 -229 GAGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTAC ===;3<===:=======<================= MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:82:670:302 99 chr2 973 99 35M = 1146 208 AGTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5 MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:8:24:415:944 147 chr2 974 99 35M = 805 -204 GTTCAGGTAAAGGGGTGGAAAAAGATGTTCTACGC <;;<<<<:<<<<<<<;<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:7:108:440:208 99 chr2 975 99 35M = 1142 202 TTCAGGTAAAGGGGAGGAAAAAGATGTTCTACGCA <<<;<<<<<<<<<</<<<<;<<<;<<;<;<64/:+ MF:i:18 Aq:i:43 NM:i:1 UQ:i:14 H0:i:0 H1:i:1
+B7_595:3:229:543:583 99 chr2 976 99 35M = 1139 198 TCAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAA <<<<<<<<<<8<8<9<<<<8<<588<<<<*<2:2* MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:142:353:398 83 chr2 977 99 35M = 807 -205 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA =================================== MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:102:543:160 83 chr2 977 99 35M = 825 -187 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA 9==9=====;=====================<=== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:191:40:536 163 chr2 977 66 35M = 1167 225 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA <<<<<<<<8<<;<<8<<;<;;<<8<<<<<</<74/ MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:272:328:400 163 chr2 977 99 35M = 1151 209 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAA <<<<<<<<;<<<<<<<<<<<<<<<<<<<<<7<;:7 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:69:1593:819 83 chr2 977 99 40M = 786 -231 CAGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA );::7<<<<:;<<<<<<<<<<<<<<<9<<9<3<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_597:3:133:707:886 99 chr2 978 99 35M = 1146 203 AGGTAAAGGGGTGGAAAAAGATGTTCTACGCAAAC <<<<7;<<<<<<<<<;<<<<<<<<<<<<<5<;66< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_591:4:92:411:955 99 chr2 979 99 36M = 1149 206 GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_61:8:60:358:494 99 chr2 979 44 35M = 1179 235 GGTAAAGGGGTGGAAAAAGATGTTCTACGCAAACA <<<<<<<<<<<<<<<<<<<<<<<<<<:<:<<;;4; MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_597:7:41:34:211 163 chr2 980 99 35M = 1164 219 GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<3:;5; MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:40:1291:1045 99 chr2 980 99 35M = 1167 222 GTAAAGGGGTGGAAAAAGATGTTCTACGCAACAAG <<<<<<<<<5<<5<<<<7<<<<<<<<<5<9<&%73 MF:i:18 Aq:i:39 NM:i:2 UQ:i:9 H0:i:1 H1:i:0
+EAS218_1:8:90:706:1276 83 chr2 980 99 35M = 814 -201 GTAAAGGGGTGGAAAAAGATGTTCTACGCAAACAG <;<<<<<<<;<<<<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_32:4:5:396:292 163 chr2 981 99 35M = 1155 209 TAAAGGGGTGGAAAAAGATGTTCTACGCAAACAGA <<<<<<<<<<<<<<;;<<<<:<<<<;;<;;3/&+8 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:2:176:653:957 83 chr2 982 82 35M = 819 -198 AAAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA ===::=============<==<====<======== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS54_71:6:264:705:89 99 chr2 983 99 34M = 1155 207 AAGGGGTGGAAAAAGATGTTCTACGCAAACAGAA <<<<<<<<<<;8<<<<<<<<<<<<<<<&<<,;;( MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:2:66:757:918 163 chr2 985 99 35M = 1143 193 GGGGTGGAAAAAGATGTTCTACGCAAACAGAAACC =================================== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:7:114:506:971 163 chr2 986 99 35M = 1150 199 GGGTGGAAAAAGATGTTCTACGCAAACAGAAACCA =================================== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:220:809:850 99 chr2 986 60 35M = 1187 236 GGGGGGAAAAAGATGTGCTACACAAAAAGATTCCA <<;7;<<0::8<-6:<0624-*<&-93-,8+(&08 MF:i:130 Aq:i:60 NM:i:4 UQ:i:64 H0:i:0 H1:i:0
+B7_589:7:76:306:561 83 chr2 987 89 35M = 794 -228 GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA 9<7<<9<<<<<<7<<71<71*7<<<<<<<<<<1<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS192_3:6:235:505:553 83 chr2 987 99 35M = 808 -214 GGTGGAAAAAGATGTTCTACGCAAACAGAAACCAA ;8518<<<<<;<;<<<;<<;<.<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:19:695:59 147 chr2 988 99 36M = 826 -198 GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAAT ;+;8<<<<<<<<<<<5<<+<:<<;<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:5:136:260:254 147 chr2 988 99 35M = 813 -210 GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA ;:;;<<<<<<<<<<<<<<;<;<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:5:266:133:789 147 chr2 988 99 35M = 810 -213 GTGGAAAAAGATGTTCTACGCAAACAGAAACCAAA 9;;<<<<<<<<<<<<5<<;<5<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_591:4:159:508:571 147 chr2 989 84 36M = 834 -191 TGGAAAAAGATGTTCTACGCAAACAGAAACCAAATG 9<6<<<<<<<<<<<;<<;<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:166:84:766 163 chr2 990 99 35M = 1167 212 GGAAAAAGATGTTCTACGCAAACAGAAACCAAATG <<<<<<<<;<<<<<<<<;<<<<<<;<<<7<;::93 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_61:6:283:963:234 99 chr2 992 99 35M = 1157 200 AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG <<<<<<<<<<<<<<<;<<<<<<<<<<<;<<;<<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:4:184:659:377 99 chr2 992 99 35M = 1173 216 AAAAAGATGTTCTACGCAAACAGAAACCAAATGAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:305:707:258 147 chr2 992 58 36M = 831 -197 AAAAAGATGTTCTACGCAAGCAGAAACCAAATGAGA 3<<7<,;<<<<0<66<6+<%<<<.<<<<<<<<<9<< MF:i:18 Aq:i:17 NM:i:1 UQ:i:4 H0:i:0 H1:i:1
+EAS219_1:7:20:1444:328 99 chr2 993 99 35M = 1149 191 AAAAGATGTTCTACGCAAACAGAAACCAAATGAGA <<<<;<<<<<<<<;<<<<<<<<;<<<<<;<;;8:7 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:157:447:758 147 chr2 994 99 36M = 833 -197 AAAGATGTTCTACGCAAACAGAAACCAAATGAGAGA <<<;<<5<</<<6<5<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:37:763:1437 163 chr2 994 99 35M = 1191 232 AAAGATGTTCTACGCAAACAGAAACCAAATGAGAG ;;;;;6;;;;;;;;;:;6;5;5;;;;;76;767/7 MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:94:1273:1462 163 chr2 995 99 35M = 1166 206 AAGATGTTCTACGCAAACAGAAACCAAATGAGAGA <<<<<<<<<<<<:<<<<<<<<:<<<<:6:7;744; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:7:74:213:877 147 chr2 996 99 35M = 816 -215 AGATGTTCTACGCAAACAGAAACCAAATGAGAGAA <<<<<<<&<<-<-<<<7<<<<<77<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:2:168:61:867 163 chr2 997 99 35M = 1188 226 GATGTTCTACGCAAACAGAAACCAAATGAGAGAAG ====7====================7======6== MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:307:252:632 163 chr2 998 99 35M = 1142 179 ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:;;<;; MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:37:604:389 99 chr2 998 99 35M = 1188 225 ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG <<<<<<<<<3<<<<<4<<<<<9<2;949<;35:95 MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:147:687:428 99 chr2 998 99 35M = 1159 196 ATGTTCTACGCAAACAGAAACCAAATGAGAGAAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:3:114:736:433 83 chr2 998 63 35M = 832 -201 ATGTTCTACGCAAACAGAAACCAAGTGAGAGAAGG <9<9+9;<6<9<<;9<<<<<;<<<99<<<<<<<<< MF:i:18 Aq:i:18 NM:i:1 UQ:i:24 H0:i:0 H1:i:1
+B7_597:8:35:118:589 163 chr2 999 99 35M = 1188 224 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA <<<<<<<<<<<<<<<<<<<<<<<<<<;<:<<<<<9 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:2:127:288:655 83 chr2 999 99 35M = 803 -231 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA <<:<3<<:<.<<<;<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:260:827:289 83 chr2 999 99 35M = 836 -198 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA 6;99+<<<<<<<<<<<<<<6<<<<<7<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:82:843:1838 147 chr2 999 99 35M = 804 -230 TGTTCTACGCAAACAGAAACCAAATGAGAGAAGGA 888829;;;;;;;;;;;;;;:;;;;;;;;;;;;;; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:64:350:174 163 chr2 1000 99 35M = 1166 201 GTTCTACGCAAACAGAAACCAAATGAGAGAAGGAG <<<<<<<<<<<<<<<<<<<<<:<<<<<6<<<<<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:2:8:327:522 83 chr2 1001 99 35M = 826 -210 TTCTACGCAAACAGAAACCAAATGAGAGAAGGAGT ;;4;<-<-<<<7<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:7:126:361:250 147 chr2 1002 99 35M = 810 -227 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA 72:;7</<<<:<-7<<:<<<<<<<:<6<+:<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:189:571:366 163 chr2 1002 99 35M = 1194 227 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA <<<<<<<<<<<<<<<<<<<<<<<<<7<:<<99;;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:202:275:776 163 chr2 1002 99 36M = 1196 230 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTAG <<<<<<<<<<<<<<<<<<<<<;<<9<;;<<<;<;<; MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:194:998:663 163 chr2 1002 99 35M = 1165 198 TCTACGCAAACAGAAACCAAATGAGAGAAGGAGTA <<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<<<8< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:30:599:589 99 chr2 1003 99 36M = 1188 221 CTACGCAAACAGAAACCAAATGAGAGAAGGAGCAGC <<<<<<<<<<<<<<<<<<<<<<<<<<;;<<;<&<<; MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS112_34:4:92:412:435 99 chr2 1003 89 35M = 1184 216 CTACGCAAACAGAAACCAANTGAGAGAAGGAGTAG <<<<<<<4<<<<<<<<<66!<<<<<<6<<77<<97 MF:i:18 Aq:i:43 NM:i:1 UQ:i:0 H0:i:0 H1:i:1
+B7_610:2:75:887:149 83 chr2 1004 99 35M = 823 -216 TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC :<:<0<<<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:2:1422:1820 163 chr2 1004 99 35M = 1164 195 TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC ;7;;;;;;;;:;;;;;;;;;;;;;;;;;;;77777 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:90:561:850 83 chr2 1004 85 35M = 827 -212 TACGCAAACAGAAACCAAATGAGAGAAGGAGTAGC 78376<;;9<;<<;:9<<<6;<;<;;8;;<;/;;; MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:4:164:719:947 147 chr2 1005 99 35M = 813 -227 ACGCAAACAGAAACCAAATGAGAGAAGGAGTAGCT ===,=========6====)================ MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:5:154:952:558 99 chr2 1007 99 35M = 1173 201 GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<:< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:58:923:1915 83 chr2 1007 99 40M = 846 -201 GCAAACAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA :+;;;8<<<<<<,<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:253:175:31 99 chr2 1008 72 35M = 1187 214 CAAACAGAAACCAAATGAGAGAAGGAGTAGCTATA <<<<<<<<<<<<<<<<<<<<<<:<<<<<<<:<;;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:2:29:729:70 83 chr2 1009 51 35M = 850 -194 AAACAGAAACCAAATGAGAGAAGGAGTAGCTATAC <<<:<<<<<<7<<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:174:157:573 163 chr2 1012 99 35M = 1191 214 CAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:197:399:319 163 chr2 1012 99 35M = 1189 212 TAGAAACCAAATGAGAGAAGGAGTAGCTATACTTA +<<<<<<<<<<<<<<<<<;<<<<<<<<<<<;;<<; MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_65:7:68:825:405 83 chr2 1015 30 35M = 835 -215 AAACCAAATGAGAGAAGGAGTAGCTATACTTATAT <<<;<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:13:701:55 99 chr2 1015 99 36M = 1187 208 AAACCAAATGAGAGAAGGAGTAGCTATACTTATATC <<<<<<<<<9<<<9<<<<<<6<<<<<<<6<<6<<6+ MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:128:555:941 153 chr2 1016 10 36M * 0 0 AACCAAAAGAGAGAAGGAGTAGTTATACACATATCA 55--555560355$55555555.57757$7555577 MF:i:32 Aq:i:10 NM:i:4 UQ:i:58 H0:i:0 H1:i:0
+EAS219_FC30151:1:53:140:421 163 chr2 1016 99 35M = 1185 204 AACCAAATGAGAGAAGGAGTAGCTATACTTATATC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:1:64:526:339 83 chr2 1019 96 35M = 819 -235 CAAATGAGAGAAGGAGTATCTATACTTATATCAGA 3<<<7<<;<<<<<<<<<<<;<<<<;<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS192_3:3:194:378:230 163 chr2 1022 99 35M = 1198 211 ATGAGAGAAGGAGTAGCTATACTTATATCAGATAA <<<<<<<<<<<<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:45:239:851 163 chr2 1023 61 35M = 1211 223 TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA <<88;<208<9<;6<<<6269;94<&401-662&2 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:39:956:676 163 chr2 1023 99 35M = 1191 203 TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA ;;;;;;;;;;;;9;;;;;;;;;;;;;;;9957777 MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:15:1763:1143 99 chr2 1023 99 35M = 1193 205 TGAGAGAAGGAGTAGCTATACTTATATCAGATAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:309:109:987 163 chr2 1024 99 35M = 1194 205 GAGAGAAGGAGTAGCTATACTTATATCAGATAAAG <<<<<<<<<<<<<<<<<<<<<<<<<<9<<<;<;;; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_593:3:102:856:670 147 chr2 1025 99 36M = 836 -225 AGAGAAGGAGTAGCTATACTTATATCAGATAAAGCA ;;<<<<:<<<:<<4<<<<<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+B7_610:6:107:252:533 163 chr2 1025 60 35M = 1173 183 AGAGAAGGAGTAGCTATACTTATATCAGATAAAGC <<<<<<<<<<<<<<<<<<<<<<<<<<<;<<;<<;9 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:3 H1:i:3
+EAS56_65:4:126:966:514 83 chr2 1027 99 35M = 865 -197 AGAAGAAGTAGCTATACTTATATCAGATAAAGCAC <4<<<%<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:4 H0:i:1 H1:i:1
+EAS114_26:1:171:527:247 163 chr2 1027 67 35M = 1194 202 AGAAGGAGTAGCTAGACTTATATCAGATAAAGCAC =4==4===8==99=&=8+9=19+.2.6'=99+999 MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:0 H1:i:3
+EAS1_105:1:234:185:359 163 chr2 1029 46 35M = 1183 189 AAGGAGTAGCTATACTTATATCAGATAAAGCACAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;9--: MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:11
+EAS51_66:3:155:375:623 83 chr2 1029 99 35M = 849 -215 AAGGAGTAGCTATACTTATATCAGATAAAGCACAC ;;;;<<:<<<<;<<;<<<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:5:4:939:2021 163 chr2 1031 99 40M = 1197 206 GGAGTAGCTATACTTATATCAGATAAAGCACACTTTAAAT <<<<<<<<<<<<<<<<<<<<<97<<<;<<;<7;<<:48:: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:2
+EAS220_1:2:50:513:882 163 chr2 1031 99 35M = 1192 196 GGAGTAGCTATACTTATATCAGATAAAGCACACTT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:2 H1:i:14
+EAS1_103:5:188:20:592 163 chr2 1032 95 35M = 1202 205 GAGTAGCTATACTTATATCAGATAAAGCACACTTT <<<<<<<<<<<<<<<<<<<<;;<<<<:<<<;<;;< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:3 H1:i:16
+EAS114_45:3:35:896:1588 163 chr2 1032 91 35M = 1205 208 GAGTAGCTATACTTATATCAGATAAAGCACACTTT ;;;;;;;;;;;;;;;;;;;;8;;;;;8;;;88989 MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:3 H1:i:18
+EAS1_108:6:73:735:329 147 chr2 1035 99 35M = 868 -202 TAGCTATACTTATATCAGATAAAGCACACTTTAAA ;;;9;<<7<<<<<<<<<<<<<<<<<<<2<<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:7:133:514:754 83 chr2 1036 63 36M = 855 -217 AGCTATACTTATATCAGATAAAGCACACTTTAAATC ;;4;<;<;<<<<<<<<;<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS218_1:4:62:561:531 163 chr2 1036 99 35M = 1203 202 AGCTATACTTATATCAGATAAAGCACACTTTAAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_593:6:119:428:415 83 chr2 1037 99 36M = 876 -197 GCTATACTTATATCAGATAAAGCACACTTTAAATCA 84<<<<;;<<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_30:2:226:885:729 147 chr2 1037 98 35M = 867 -205 GCTGAACTTACATCAGATAAAGCACACTTTAAATC /*220%.(;<%<3.<<<4<<<<86;<8<<8<<<<< MF:i:18 Aq:i:30 NM:i:3 UQ:i:36 H0:i:0 H1:i:1
+EAS1_108:1:189:863:213 163 chr2 1039 99 35M = 1202 198 TATACTTATATCAGATAAAGCACACTTTAAATCAA <<<<<<<<<<<<<<<<<<<<;<<<;<<<<;7<9;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_597:4:146:961:63 83 chr2 1041 86 35M = 861 -215 TACTTATATCAGATAAAGCACACTTTAAATCAACA 7;;<<<<<;<<<7<<<<<<<<;;<<;<;<<;<<<7 MF:i:18 Aq:i:37 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:68:996:104 99 chr2 1041 70 35M = 1214 208 TACTTATATCAGATAAAGCACACTTTAAATCAACA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:47:1791:444 163 chr2 1041 74 35M = 1213 207 TACTTATATCAGATAAAGCACACTTTAAATCAACA ;3;;;;;;;;;;;;;;;;;;;;;;;;;;;877977 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:4:1:156:196 147 chr2 1042 77 40M = 867 -215 ACTTATATCAGATAAAGCACACTTTAAATCAACAACAGTA :::::<<<<<<<<<<<<<4<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:70:1349:1788 163 chr2 1043 99 35M = 1203 195 ATTATATCAGATAAAGCACACTTTAAATCAACAAC &<8<<<85:580;<:0-><;>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 ;<<<<*<<<<<<</7<2<8<<<<<<<4<<<<<<<<< MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+B7_589:5:147:405:738 83 chr2 1048 99 35M = 870 -213 ATCAGATAAAGCACACTTTAAATCAACAACAGTAA <9/<:<<<<<<<<7</<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_61:3:155:758:710 83 chr2 1048 98 35M = 859 -224 ATCAGATAAAGCACACTTTAAATCAACAACAGTAA =46=4=5===:========:=7=7======11=== MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_73:7:254:572:431 83 chr2 1048 97 35M = 891 -192 ATCAGATAAAGCACACTTTAAATCAACAACAGTAA <63<;<;<<<:7<:<7;<:<<<<:<<<<7<<<<:< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_57:7:33:954:724 163 chr2 1049 97 35M = 1210 196 TCAGATAAAGCACACTTTAAATCAACAACAGTAAA ;<<<<<<<<<<<<<8<<<<:<;;<<;;<;<<;;;; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_63:6:102:816:260 99 chr2 1049 99 35M = 1225 211 TCAGATAAAGCACACTTTAAATCAACAACAGTAAA <<<<<<<<<;<<<<<<<<<<<<<<<<<<<<;;;;; MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS192_3:5:197:914:256 99 chr2 1049 97 35M = 1204 190 TCAGATAAAGCACACTTTAAATCAACAACAGTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<8;::: MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_65:4:150:94:843 147 chr2 1050 0 35M = 868 -217 CAGATACATCCCACTTTAAATCAACCACAGTAAAA 4<9<41*747*7<:9<:7:::<72;+<;::<7<<< MF:i:18 Aq:i:0 NM:i:4 UQ:i:47 H0:i:0 H1:i:0
+EAS1_108:5:321:712:224 163 chr2 1051 58 35M = 1220 204 AGATAAAGCACACTTTAAATCAACAACAGAAAAAT <<<<<<<<2<<<<<<<<<<<<<<<:<<<<(<<:<, MF:i:18 Aq:i:28 NM:i:1 UQ:i:7 H0:i:1 H1:i:2
+EAS114_32:3:236:475:254 83 chr2 1051 99 35M = 880 -206 AGATAAAGCACACTTTAAATCAACAACAGTAAAAT <:<<<<<;9<7<;<<<<<<<<<<9<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:72:1288:1211 99 chr2 1052 84 35M = 1235 218 GATAAAGCACACTTTAAATCAACAACAGTAAAATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_65:2:264:157:150 99 chr2 1054 30 35M = 1238 219 TAAAGCACACTTTAAATCAACAACAGTAAAATAAA <<<<<<9<9<<<<.9;<<9&<97<;9933309605 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS1_95:7:310:800:761 163 chr2 1055 99 35M = 1249 229 AAAGCACACTTTAAATCAACAACAGTAAAATAAAA ===========================+======= MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:88:465:1877 99 chr2 1055 99 35M = 1212 192 AAAGCACACTTTAAATCAACAACAGTAAAATAAAA <<<<<<<<<<;<<<<<<<<<<<<<<<<7<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:66:891:294 163 chr2 1057 99 35M = 1233 211 AGCACACTTTAAATCAACAACAGTAAAATAAAACA <<<<<<<<<<<<<<<<<<<<<<<9<<<<<<;<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:3:100:735:530 163 chr2 1058 99 35M = 1257 234 GCACACTTTAAATCAACAACAGTAAAATAAAACAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:68:440:424 99 chr2 1060 99 35M = 1237 212 ACACTTTAAATCAACAACAGTAAAATAAAACAAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS220_1:8:66:1046:167 99 chr2 1060 99 35M = 1241 216 ACACTTTAAATCAACAACAGTAAAATAAAACAAAG <<<<<:<<<<<<<<<<<<<9<;77<9<7<<;<9;- MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_81:6:11:801:386 83 chr2 1061 97 35M = 868 -228 CACTATAAATCAACAACAGTAAAATAAAACAAAGG 5<2:$6<<<38<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:3 H0:i:1 H1:i:1
+EAS114_28:2:141:7:963 163 chr2 1061 85 36M = 1240 215 CACTTTAAATCAACAACAGTAAAATAAAACAAAGGA <<<<<<<<<<<<;<:<<<<<<1<<&<;<;<<;,<;5 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:2:55:296:1457 147 chr2 1061 99 35M = 884 -212 CACTTTAAATCAACAACAGTAAAATAAAACAAAGG -<%63<<<<<1<<<<<5<<<<<<<<<<<<<<<7<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:1:58:726:1746 83 chr2 1061 99 40M = 900 -201 CAATTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTC &:&::;<<<76<<:<<6<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS221_1:8:15:881:1932 147 chr2 1061 92 35M = 886 -210 CACTTTAAATCAACAACAGTAAAATAAAACAAAGG )<4<<<<<<<4<<4<<4<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_95:5:284:212:932 99 chr2 1063 10 35M = 1257 229 CTTTAAATCAACAACAATAAAAAAAAACAAAGGAG <<9<<<<<<<<<<<<<&&<<<<5<<<<8<<<1:<: MF:i:18 Aq:i:0 NM:i:2 UQ:i:25 H0:i:0 H1:i:0
+EAS139_19:4:18:1335:1514 99 chr2 1063 99 40M = 1235 212 CTTTAAATCAACAACAGTAAAATAAAACAAAGGAGGTCAT <<<;<<<<<<<<<<<<<<<;<:<<;<<<<<<;<;<;;;9; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:273:424:207 83 chr2 1066 99 35M = 891 -210 TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:62:1076:540 147 chr2 1066 99 35M = 882 -219 TAAATCAACAACAGTAAAATAAAACAAAGGAGGTC 6<<;:+=====5=:6===================2 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:8:113:856:319 83 chr2 1067 99 33M = 884 -216 AAATCAACAACAGTAAAATAAAACAAAGGAGGT <<<77<<:<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:8:19:929:765 147 chr2 1069 98 35M = 919 -185 ATCAACAACAGTAAAATAAAACAAAGGAGGTCATC <3+<<;<<;<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:88:54:900 163 chr2 1069 68 35M = 1257 223 ATCAACAACAGAAAAATAAAACAAAGGAGGTCATC .....&.....,....................... MF:i:18 Aq:i:19 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+EAS56_63:7:109:22:383 163 chr2 1071 99 35M = 1244 208 CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;:<<;<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:8:4:571:820 83 chr2 1071 99 35M = 891 -215 CAACAACAGTAAAATAAAACAAAGGAGGTCATCAT &<<7<<1<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:255:441:47 99 chr2 1072 99 35M = 1237 200 AACAACAGTAAAATAAAACAAAGGAGGTCATCATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<6<;:<;< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:3:66:718:481 147 chr2 1072 99 40M = 891 -221 AACAACAGTAAAATAAAACAAAGGAGGTCATCATACAATG ::5::1<;;<<<<<<1<<<<<<<<<<<<7<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:155:807:19 147 chr2 1074 99 35M = 867 -242 CAACAGTAAAATAAAACAAAGGAGGTCATCATACA :==4=5:====:============:========== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:43:1229:1855 163 chr2 1074 99 35M = 1244 205 CAACAGTAAAATAAAACAAAGGAGGTCATCATACA <<<<<<<<<<<<<<<<<<<<<<<<<4<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:125:875:553 99 chr2 1075 99 36M = 1233 194 AACAGTAAAATAAAACAAAGGAGGTCATCATACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;<; MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:118:775:467 163 chr2 1075 99 35M = 1245 205 AACAGTAAAATAAAACAAAGGAGGTCATCATACAA <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:301:161:195 99 chr2 1076 75 35M = 1239 198 ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT <<<<<<<<<<<<<<<<<<<<<<<;<<<<<<:<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:54:695:952 99 chr2 1076 99 35M = 1264 223 ACAGTAAAATAAAACAAAGGAGGTCATCATACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:77:589:741 163 chr2 1078 99 35M = 1263 220 AGTAAAATAAAACAAAGGAGGTCATCATACAATGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:200:263:280 163 chr2 1078 99 35M = 1236 193 AGTAAAATAAAACAAAGGAGGTCATCATACAATGA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<;8<;1 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:64:199:1288 99 chr2 1079 77 35M = 1240 196 GTAAAATAAAACAAAGGAGGTCATCATACAATGAT <<<<<<<<<<<<<<;<<<<<<<<<<<<<<;<<<;< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:27:228:31 99 chr2 1082 99 35M = 1264 217 AAATAAAACAAAGGAGGTCATCATACAATGATAAA <<<<<<<<<<<<<<<<<;9<:;<<<<<<75<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:214:644:390 83 chr2 1082 72 35M = 919 -198 AAATAAAACAAAGGAGGTCATGATACAATGATAAA <<<;<<<<<<<<<<<<<<<<<&<<<<<<<<<<<<< MF:i:18 Aq:i:27 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS114_45:2:79:554:354 99 chr2 1082 63 35M = 1242 195 AAATAAAACAAAGGAGGTCATCATACAATGATAAA 17;<;;+<<;;;;93;;:;3;;;;1;;;;<77744 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:303:542:924 163 chr2 1083 76 35M = 1242 194 AATAAAACAAAGGAGGTCATCATACAATGATAAAA <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:8:26:242:35 99 chr2 1084 99 35M = 1251 202 ATAAAACAAAGGAGGTCATCATACAATGATAAAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:5:163:832:715 83 chr2 1085 99 36M = 918 -203 TAAAACAAAGGAGGTCATCATACAATGATAAAAAGA ;<<<<9<<<<<<<<;;<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:1:98:641:1040 83 chr2 1085 99 35M = 907 -213 TAAAACAAAGGAGGTCATCATACAATGATAAAAAG 4<<<<7<<<<<<<<<:<<;<;<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:32:562:1695 99 chr2 1085 76 35M = 1258 208 TAAAACAAAGGAGGTCATCATACAATGATAAAAAG <<<<<<<<<<<<<<8<<<<<:<<<<<<<:<8<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:6:758:988 163 chr2 1087 99 35M = 1253 201 AAACAAAGGAGGTCATCATACAATGATAAAAAGAT 3+;0;0;;;0;;;;;;5;;;9;;;;90;;;57560 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:5:273:545:1001 83 chr2 1088 99 35M = 913 -210 AACAAAGGAGGTCATCATACAATGATAAAAAGATC <7(<<72;<2;27<;:<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:74:656:272 163 chr2 1088 99 35M = 1245 192 AACAAAGGAGGTCATCATACAATGATAAAAAGATC <<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:198:564:731 83 chr2 1089 99 35M = 898 -226 ACAAAGGAGGTCATCATACAATGATAAAAAGATCA <6<;<<<<<<:7<<;<<<8<<+<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:6:23:885:274 99 chr2 1089 99 35M = 1289 235 ACAAAGGAGGTCATCATACAATGATAAAAAGATCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4<;;< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:22:632:176 83 chr2 1091 99 36M = 894 -233 AAAGGAGGTCATCATACAATGATAAAAAGATCAATT <9<<<<<<<-;<;<<7;6;<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:184:980:396 83 chr2 1092 99 35M = 923 -204 AAGGAGGTCATCATACAATGATAAAAAGATCAATT <<;;<77;;<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:110:984:98 99 chr2 1092 99 36M = 1270 214 AAGGAGGTCATCATACAATGATAAAAAGATCAATTC 98<<<<<<2<<<<<<;;<;;<<<5;5;<<;;<<<<+ MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:1:202:341:984 147 chr2 1094 99 35M = 926 -203 GGAGGTCATCATACAATGATAAAAAGATCAATTCA <<<(<8&<92<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:219:40:833 163 chr2 1094 99 35M = 1278 219 GGAGGTCATCATACAATGATAAAAAGATCAATTCA <<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:23:1126:1886 99 chr2 1094 99 35M = 1268 209 GGAGGTCATCATACAATGATAAAAAGATCAATTCA 7<<<7<<<<<<<<7<<<<<<<<<<<<<;8<;<<5< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:85:964:950 83 chr2 1095 99 35M = 910 -220 GAGGTCATCATACAATGATAAAAAGATCAATTCAG <<8::<<;;<<<;<<6<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:139:578:951 83 chr2 1095 98 35M = 919 -211 GAGGTCATCATACAATGATAAAAAGATCAATTCAG ;<0;:&<:9<<<7<<<<<<<<<<<<<<;<<<<<<< MF:i:18 Aq:i:26 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:107:738:484 147 chr2 1097 75 35M = 926 -206 GGTCATCATACAATGATAAAAAGATCAATTCAGCA .8/<<<7<8<<<<<<<<<<<<<<<<9<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:4:93:77:1338 83 chr2 1098 10 35M = 940 -193 GTCATCATACAATGAAAAAAAGATCAATTCAGCAA <<7<7<<<<<1<7<<&97;;<1<;1<<7<;7<<;< MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_610:8:68:570:705 147 chr2 1100 99 35M = 910 -225 CATCATACAATGATAAAAAGATCAATTCAGCAAGA 4<;4<;;:<<<<<<<<;<<<<<<<<<<<<<<<<;< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS51_62:1:38:250:647 83 chr2 1100 71 35M = 933 -202 AATAATAAAATGATAAAAAGATCAATTCAGCAAGA +<&+<1<,<<7<<7<<<<<<<1,<<<<7<<2<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:34 H0:i:0 H1:i:3
+EAS1_93:8:13:325:483 83 chr2 1101 99 35M = 919 -217 ATCATACAATGATAAAAAGATCAATTCAGCAAGAA ;:;<;=:========;==========;======== MF:i:18 Aq:i:27 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:128:584:952 163 chr2 1101 99 35M = 1277 211 ATCATACAATGATAAAAAGATCAATTCAGCAAGAA <<<<<<<<<<<<<<+<;<<<<<<;<<<;<<<+<66 MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:4:184:237:476 83 chr2 1101 99 35M = 925 -211 ATCATACAATGATAAAAAGATCAATTCAGCAAGAA <;2<;<4<<;<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+EAS51_64:6:300:622:86 163 chr2 1102 99 35M = 1264 197 TCATACAATGATAAAAAGATCAATTCAGCAAGAAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:57:1114:2032 147 chr2 1102 99 35M = 931 -206 TATTACAATGATAAAAAGATCAATTCAGCAAGAAG ;+!5<4<<<<<<<<<<<<<;<&<;7<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:10 H0:i:1 H1:i:6
+B7_593:3:310:193:629 163 chr2 1103 99 36M = 1267 200 CATACAATGATAAAAAGATCAATTCAGCAAGAAGAT <<<<<<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:6:529:366 99 chr2 1103 99 35M = 1291 223 CATACAATGATAAAAAGATCAATTCAGCAAGAAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:10:686:1024 83 chr2 1103 99 35M = 947 -191 CATACAATGATAAAAAGATCAATTCAGCAAGAAGA &<<<3<<<<<<<<<<<<<<7<<<<<<<<<<7<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS114_45:7:14:978:1296 163 chr2 1104 90 35M = 1249 180 ATACAATGATAAAAAGATCAATTCAGCAAGAAGAT ;6;;;;;;;;;;;:;;;;;;;6;;;;;;;;77777 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS56_57:2:237:855:581 99 chr2 1105 87 35M = 1271 201 TACAATGATAAAAAGATCAATTCAGCAAGAAGATA <;4<7<<<;47<<74<:*<<2:<<7.799:2<<9: MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+EAS139_19:7:85:262:751 163 chr2 1105 99 40M = 1305 240 TACAATGATAAAAAGATCAATTCAGCAAGAAGATATAACC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:::92 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:10:106:737 83 chr2 1106 99 35M = 947 -194 ACAATGATAAAAAGATCAATTCAGCAAGAAGATAT <-<<;<<<<<<<<<<<;<<<<;<<;<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:6
+B7_610:6:143:620:158 163 chr2 1107 99 35M = 1283 211 CAATGATAAAAAGATCAATTCAGCAAGAAGATATA <<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS54_67:6:198:503:669 147 chr2 1107 99 35M = 912 -230 CAATGATAAAAAGATCAATTCAGCAAGAAGATATA 5<<:<<;<<<<<<<;;<<9<<<<<<<<;<<<<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS192_3:6:116:464:261 147 chr2 1107 99 35M = 934 -208 CAATGATAAAAAGATCAATTCAGCAAGAAGATATA ;<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_73:5:263:557:988 99 chr2 1108 84 35M = 1289 216 AATGATAAAAAGATCAATTCAGCAAGAAGATATAA <<<<<<<<<<<<<<<<<<<<<;;<<<<<<<<;<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:8
+EAS139_19:1:53:463:1132 83 chr2 1109 99 40M = 915 -234 ATGATAAAAAGATCAATTCAGCAAGAAGATATAACCATCC ;::;:<<<<<<<<:<<;<<<<8<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:46:1528:799 99 chr2 1109 96 35M = 1306 232 ATGATAAAAAGATCAATTCAGCAAGAAGATATAAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:7
+EAS54_81:7:324:472:791 99 chr2 1110 89 35M = 1274 199 TGATAAAAAGATCAATTCAGCAAGAAGATATAACC <<<<<<<<:<<<<<<<<<<<<<<:<<<<<<<<<:3 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+EAS54_61:8:4:173:814 163 chr2 1111 99 35M = 1289 213 GATAAAAAGATCAATTCAGCAAGAAGATATAACCA =====================<==========;== MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+B7_593:3:303:131:673 83 chr2 1112 99 36M = 947 -201 ATAAAAAGATCAATTCAGCAAGAAGATATAACCATC <;<<<<<<<<:<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:235:899:847 147 chr2 1112 99 35M = 950 -197 ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT <7<<<<<<<<:<<<<:<</<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS1_105:8:179:119:876 83 chr2 1112 60 35M = 917 -230 ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT <<<<<<<7<<<<<<;;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_59:2:162:272:415 147 chr2 1112 83 35M = 923 -224 ATAAAAAGATCAATTCAGCAAGAAGATATAACCAT =7=======;5==<<6==1==<============= MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_45:6:44:77:1255 83 chr2 1113 99 35M = 955 -193 TAAAAAGATCAATTCAGCAAGAAGATATAACCATC 79998;;;9:;<696<;.<;;<<;<;<;<;;;<8; MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:162:257:203 163 chr2 1114 99 35M = 1301 222 AAAAAGATCAATTCAGCAAGAAGATATAACCATCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:3:55:464:146 99 chr2 1114 99 35M = 1295 216 AAAAAGATCAATTCAGCAAGAAGATATAACCATCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:6:308:667:658 147 chr2 1116 34 35M = 918 -233 AAAGATCACTTCAGCAATAAGATATAACCATCCTA <9;;;45;&<;&.<5683;84+<;<;+8<;<<8;< MF:i:18 Aq:i:10 NM:i:2 UQ:i:23 H0:i:0 H1:i:0
+EAS56_57:4:98:862:154 163 chr2 1116 99 35M = 1290 209 AAAGATCAATTCAGCAAGAAGATATAACCATCCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<9<:99<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_61:5:263:314:696 83 chr2 1117 99 35M = 953 -199 AAGATCAATTCAGCAAGAAGATATAACCATCCTAC <<;<;:<<<<7<<:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:83:1456:1854 163 chr2 1117 99 35M = 1275 193 AAGATCAATTCAGCAAGAAGATATAACCATCCTAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<2< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:4:231:815:626 83 chr2 1119 99 35M = 940 -214 GATCAATACAGCAAGAAGATATAACCATCCTACTA '<4%<<<22<<,<<;<<4;<<<<<<<<<<<<<<7< MF:i:18 Aq:i:41 NM:i:1 UQ:i:17 H0:i:0 H1:i:1
+EAS114_32:4:246:647:765 83 chr2 1119 99 35M = 937 -217 GATCAATTCAGCAAGAAGATATAACCATCCTACTA 9<+,<<&,39<,<;<<<<<<<&<<<<;0<<3;<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:256:354:173 83 chr2 1121 99 36M = 957 -200 TCAATTCAGCAAGAAGATATAACCATCCTACTAAAT -9<<:9<<;6<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:53:61:31 83 chr2 1122 99 35M = 949 -208 CAATTCAGCAAGAAGATATAACCATCCTACTAAAT 5;;<95<<5<<<<<<<<<<:5;<<<<<<<<<<<<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:308:509:948 99 chr2 1123 99 36M = 1298 211 AATTCAGCAAGAAGATATAACCATCCTACTAAATAC <9<<<<<<<;<7<<;<<<<<<<;<<<<7<<;2;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:2:247:900:123 147 chr2 1123 99 35M = 920 -238 AATTCAGCAAGAAGATATAACCATCCTACTAAATA ;;;;.<<4<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:3:307:113:346 83 chr2 1123 99 35M = 938 -220 AATTCAGCAAGAAGATATAACCATCCTACTAAATA <<<<9<<1<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:1:168:69:249 83 chr2 1125 99 35M = 936 -224 TTCAGCAAGAAGATATAACCATCCTACTAAATACA ;0;<;;<<<<<<<<<<<<<;<<<8<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:54:1886:719 147 chr2 1125 99 35M = 941 -219 TTCAGCAAGAAGATATAACCATCCTACTAAATACA 883777;;:;;;;;;;;;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:94:273:165 147 chr2 1128 99 35M = 945 -218 AGAAAGAAGATATAACCATCCTACTAAATACATAT ;3&;;:<<:<-<-<<8:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS1_95:7:155:530:532 163 chr2 1128 99 35M = 1319 226 AGCAAGAAGATATAACCATCCTACTAAATACATAT =================================== MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:61:1885:163 163 chr2 1128 99 40M = 1281 193 AGCAAGAAGATATAACCATCCTACTAAATACATATGCACC <<<<<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<9::::4 MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:193:661:771 83 chr2 1129 99 35M = 952 -212 GCAAGAAGATATAACCATCCTACTAAATACATATG :&<<<<<<<<<<<<<;<<<;<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:6:75:1503:1399 83 chr2 1130 99 40M = 969 -201 CAAGAAGATATAACCATCCTACTAAATACATATGCACCTA &;;8;<<<;<<<<,6<<70<<7<<<<<<9<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:2:42:28:552 163 chr2 1131 99 35M = 1294 198 AAGAAGATATAACCATCCTACTAAATACATATGCA <<<<<<<<<<<<<<<<<<<<<<<<;<;<3<:;9;8 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:61:631:567 147 chr2 1131 99 35M = 957 -209 AAGAAGATATAACCATCCTACTAAATACATATGCA <<7<<<<<<<<</<<;<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:3:257:288:731 147 chr2 1131 99 35M = 939 -227 AAGAAGATATAACCATCCTACTAAATACATATGCA <<:<<7<<<<<;<5<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:2:214:950:32 83 chr2 1132 99 35M = 947 -220 AGAAGATATAACCATCCTACTAAATACATATGCAC =&==4======:;==6<==:=============== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:1:12:88:200 83 chr2 1133 99 35M = 968 -200 GAAGATATAACCATCCTACTAAATACATATGCACC 9<<;<<<;<;6;<;:<<<7<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:256:444:399 163 chr2 1133 99 35M = 1289 191 GAAGATATAACCATCCTACTAAATACATATGCACC <<<<<<<<<<<<<<<<<<<<<<<<<;;<<<-;<<8 MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:174:753:617 99 chr2 1136 75 35M = 1299 198 GATATAACCATCCTACTAAATACATATGCACCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:115:226:443 99 chr2 1137 99 35M = 1314 212 ATATAACCATCCTACTAAATACATATGCACCTAAC <<<<<<<<<<<<<<<<;<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:26:1867:162 163 chr2 1137 70 35M = 1299 197 ATATAACCATCCTACTAAATACATATGCACCTAAC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78698 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:3:308:66:538 99 chr2 1138 99 35M = 1321 218 TATAACCATCCTACTAAATACATATGCACCTAACA <<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:3:229:543:583 147 chr2 1139 99 35M = 976 -198 ATAACCATCCTACTAAATACATATGCACCTAACAC </<;+5<855;<6<<<<;<<<<<<9<<<<<<<<<< MF:i:18 Aq:i:65 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:17:595:863 163 chr2 1139 89 35M = 1289 185 ATAACCATCCTACTAAATACACATGCACCTAACTC :<4:<<1:<<<9<+<+1<%<7&&9-71<17)7</4 MF:i:18 Aq:i:33 NM:i:2 UQ:i:19 H0:i:0 H1:i:1
+EAS51_62:7:248:17:435 147 chr2 1139 99 35M = 969 -205 ATAACCATCCTACTAAATACATATGCACCTAACAC <1<<88++<:<<:;<;<<<:<<<;<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:6:35:186:412 99 chr2 1139 99 35M = 1306 202 ATAACCATCCTACTAAATACATATGCACCTAACAC <<<<<<<<4<<<<<:<<<<<<:<<<<<<<<<;;<: MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:2:307:252:632 83 chr2 1142 99 35M = 998 -179 ACCATCCTGCTAAATACATATGCACCTAACACAAG <77<;,5<,9<<<<<<;<<<<<7<;<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:11 H0:i:0 H1:i:1
+EAS1_108:7:108:440:208 147 chr2 1142 99 35M = 975 -202 CCCATCCTACTAAATACATATGCACCTAACACAAG +35:486<<4<<<<<<<<<<<-<<<<<7<<)<<<- MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+EAS1_95:7:74:866:49 83 chr2 1143 99 35M = 969 -209 CCAACCTACTAAATACATATGCACCTAACACAAGA :8<&<<<<7<<<<:<<<<<<8<5<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS54_61:2:66:757:918 83 chr2 1143 99 35M = 985 -193 CCATCCTACTAAATACATATGCACCTAACACAAGA <9<45;<<7<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:220:733:736 147 chr2 1143 99 35M = 959 -219 CCATCCTACTAAATACATATGCACCTAACACAAGA :;<77;<<9<<<<<9;<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:175:289:351 99 chr2 1144 99 35M = 1319 210 CATCCTACTAAATACATATGCACCTAACACAAGAC <<<<<<<<<<;<<<<<<<<;<<<<<<<<<<<9<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:2:56:155:49 147 chr2 1145 99 35M = 970 -210 ATCCTACTAAATACATATGCACCTAACACAAGACT ;:5;;<5<<<<<<<<<<<<<<<<<<<<<<<<<<<= MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:299:336:613 99 chr2 1145 99 35M = 1293 183 ATCCTACTAAATACATATGCACCTAACACAAGACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:4:30:432:228 83 chr2 1145 99 35M = 967 -213 ATCCTACTAAATACATATGCACCTAACACAAGACT <76<<<:<<<<<<<;<:<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:5:93:312:331 83 chr2 1145 99 35M = 953 -227 ATCCTACTAAATACATATGCACCTAACACAAGACT <;;:;<6<<<<;<:<<<<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:3:133:707:886 147 chr2 1146 99 35M = 978 -203 ACCTAATAAATACATATGCACCTAACACAAGACTA %5-2;&6<<<<<;<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:9 H0:i:1 H1:i:0
+EAS51_62:3:50:312:219 163 chr2 1146 99 35M = 1288 177 TCCTACTAAATACATATGCACCTAACACAAGACTA <<<<<<<<<<<;<<<<<;<;<<<;<<<<<<;;;;; MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:82:670:302 147 chr2 1146 99 35M = 973 -208 TCCTACTAAATACATATGCACCTAACACAAGACTA %448<7<<<<<<7<<<<<&<<7<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:47:591:698 99 chr2 1146 99 35M = 1313 202 TCCTACTAAATACATATGCACCTAACACAAGACTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:8:122:430:882 99 chr2 1147 99 35M = 1338 226 CCTACTAAATACATATGCACCTAACACAAGACTAC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:4:46:1566:668 83 chr2 1148 99 35M = 959 -224 CTACTAAATACATATGCACCTAACACAAGACTACC 5<<:<<<<<<<<<<<<:<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:4:92:411:955 147 chr2 1149 99 36M = 979 -206 TACTAAATACATATGCACCTAACACAAGACTACCCA 2<+<<<<9<<<<<<<;+<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:2:96:419:327 99 chr2 1149 99 35M = 1331 217 TACTAAATACATATGCACCTAACACAAGACTACCC <<<<<<<<<<<<<<<<<<<<<<;<<<<<<<;;9<9 MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:20:1444:328 147 chr2 1149 99 35M = 993 -191 TACTAAATACATATGCACCTAACACAAGACTACCC 9<3<<==;=<===;=<=====<<===========< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:198:59:675 163 chr2 1150 99 35M = 1315 200 ACTAAATACATATGCACCTAACACAAGACTATCCT <.<<<<<<;<<<<<<<<<<<**<;<;2<;6;&*2& MF:i:18 Aq:i:45 NM:i:2 UQ:i:10 H0:i:1 H1:i:0
+EAS54_61:7:114:506:971 83 chr2 1150 99 35M = 986 -199 ACTAAATACATATGCACCTAACACAAGACTACCCA ;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:2:94:356:809 163 chr2 1151 99 35M = 1334 218 CTAAATACATATGCACCTAACACAAGACTACCCAG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<:; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:155:541:234 163 chr2 1151 99 35M = 1319 203 CTAAATACATATGCACCTAACACAAGACTACCCAG <<7<<<<<<<<<<<<<<<4<<<<<<<<<<<;;;08 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:272:328:400 83 chr2 1151 99 35M = 977 -209 CTAAATACATATGCACCTAACACAAGACTACCCAG 4;<<<<<7<;<<<-<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:283:186:707 163 chr2 1154 99 36M = 1321 203 AATACATATGCACCTAACACAAGACTACCCAGATTC <<<<<<<<<<<<<<<<<<<<<<;<<<<<;<;<<<<8 MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:4:86:660:932 99 chr2 1154 99 35M = 1338 219 AATACATATGCACCTAACACAAGACTACCCAGATT ================================9:= MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:6:264:705:89 147 chr2 1155 99 35M = 983 -207 AAACATATGCACCTAACACAAGACTACCCAGATTC <(<2<&<)<<<7<8<<<<<<<<<<.<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS114_32:4:5:396:292 83 chr2 1155 99 35M = 981 -209 ATACATATGCACCTAACACAAGACTACCCAGATTC <:<6<7<:<:;;;<<<;<7<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:178:342:866 163 chr2 1155 72 35M = 1311 191 ATACATATGCACCTAACACAAGACTACCCAGATTC ;<<<<<;<<<8<<;<;<3<8/<<<<6<<</<8;<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:155:809:543 163 chr2 1156 99 35M = 1352 231 TACATATGCACCTAACACAAGACTACCCAGATTCA <<<<<<<<<<<<<<<<7<;<<<<<<<<<<<1<;<; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:119:880:781 99 chr2 1157 99 35M = 1312 190 ACATATGCACCTAACACAAGACTACCCAGATTCAT <<<<<<<<<<<<<<<<<<<<<<<<+<<<<7<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:6:283:963:234 147 chr2 1157 99 35M = 992 -200 ACATATGCACCTAACACAAGACTACCCAGATTCAT <5<;<;97;;:;<<7<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:28:745:352 99 chr2 1159 99 35M = 1329 205 ATATGCACCTAACACAAGACTACCCAGATTCATAA <<<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:147:687:428 147 chr2 1159 99 35M = 998 -196 ATATGCACCTAACACAAGACTACCCAGATTCATAA ;1<''48;4)<<:<<<<;<<6;<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_53:3:101:809:776 99 chr2 1160 99 35M = 1326 201 TATGCACCTAACACAAGACTACCCAGATTCATAAA <<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:35:538:1882 163 chr2 1160 98 35M = 1337 212 TATGCACCTAACACAAGACTACCCAGATTCATAAA ;);43.50;3;93;;4;3;;;9-7.;*;;966*75 MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:7:41:34:211 83 chr2 1164 99 35M = 980 -219 CACCTAACACAAGACTACCCAGATTCATAAAACAA 7</::<<7<<<<<<;<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:1:2:1422:1820 83 chr2 1164 99 35M = 1004 -195 CACCTAACACAAGACTACCCAGATTCATAAAACAA *4617;;4;1;;79;/7&,4;9;;;7<;;<<<;<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:194:998:663 83 chr2 1165 99 35M = 1002 -198 ACCTAACACAAGACTACCCAGATTCATAAAACAAA ;</<<<7<<<<;<<8<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:8:10:975:766 83 chr2 1166 99 35M = 959 -242 AATAACACAAGACTACCCAGATTCATAAAACAAAT ++4<<+<+<<<<8<<22;<<<<<2<<<<<<<<<<< MF:i:18 Aq:i:64 NM:i:2 UQ:i:24 H0:i:1 H1:i:0
+EAS114_39:6:94:1273:1462 83 chr2 1166 99 35M = 995 -206 CCTAACACAAGACTACCCAGATTCATAAAACAAAT 8.<<<;<:<<<<;<<;;;<<<;<;<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:8:64:350:174 83 chr2 1166 99 35M = 1000 -201 CCTAACACAAGACTACCCAGATTCATAAAACAAAT 709<<;<;<<<<<<<;7<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:166:84:766 83 chr2 1167 99 35M = 990 -212 ATAACACAAGACTACCCAGATTCATAAAACAAATA %8<=+<-<<<</<<<<8<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS1_108:2:85:580:481 163 chr2 1167 99 35M = 1359 227 CTAACACAAGACTACCCAGATTCATAAAACAAATA <<<<<<<<<<<<<:<<<<<<<<<<<<;<<<<6:<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:4:191:40:536 83 chr2 1167 66 35M = 977 -225 ATAAAAAAAGACTACCCAGATTCATAAAACAAATA +1<<,<&<<:<.;<7/7<<<<;.<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:27 H0:i:1 H1:i:0
+EAS218_1:2:40:1291:1045 147 chr2 1167 99 35M = 980 -222 CTAACACAAGACTACCCAGATTCATAAAACAAATA *<<<9<<<<<<:0<9<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:39 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:221:881:916 99 chr2 1168 96 35M = 1327 194 TAACACAAGACTACCCAGATTCATAAAACAAATAC <<;<<8<<;<<<<<<<;<<<<28<:<8<:;<;;;< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:7:35:392:2042 163 chr2 1168 99 35M = 1332 199 TAACACAAGACTACCCAGATTCATAAAACNAATAC ======;==========<<=======7=;!<7;;; MF:i:18 Aq:i:72 NM:i:1 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:192:714:341 163 chr2 1170 99 35M = 1346 211 ACACAAGACTACCCAGATTCATAAAACAAATACTA <<9<<<<<<<<<<<8<<<<<;<<;8<<<88;;;;9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:189:876:833 163 chr2 1173 99 36M = 1349 212 CAAGACTACCCAGATTCATAAAACAAATACTACTAG <<<<<<<<<<<8<8<<<<<;<;;<<;<<<<<;<<<6 MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:299:743:762 163 chr2 1173 99 36M = 1345 208 CAAGACTACCCAGATTCATAAAACAAATACTACTAG <<<;<<<<<<<<<:;<<<.<:<<<<<<<<<<;;;;; MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:107:252:533 83 chr2 1173 60 35M = 1025 -183 CAAGACTACCCAGATTCATAAAACAAATACTACTA 3<<<<+<<96<<<<<<;<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:2 H1:i:1
+EAS1_97:5:154:952:558 147 chr2 1173 99 35M = 1007 -201 AAAGACTACCCAGATTCATAAAACAAATACTACTA %<<9;;<<;;;<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS56_63:4:184:659:377 147 chr2 1173 99 35M = 992 -216 CAAAACTACCCAGATTCATAAAACAAATACTACTA 1;<+<;<6;66<<;<<<<;;<<<8<<<<8<<;<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+B7_595:6:137:811:130 163 chr2 1175 99 35M = 1351 211 AGACTACCCAGATTCATAAAACAAATACTACTAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9;;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:124:367:72 163 chr2 1175 99 35M = 1377 237 AGACTACCCAGATTCATAAAACAAATACTACTAGA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;; MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:8:60:358:494 147 chr2 1179 44 35M = 979 -235 TACCCAGATTCATAAAACAAATACTACTAGACCTA 7<77;<<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:14 NM:i:0 UQ:i:0 H0:i:6 H1:i:36
+EAS114_30:7:319:11:255 163 chr2 1179 92 35M = 1337 193 TACCCAGATTCATAAAACAAATACTACTAGACCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<: MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:10
+B7_610:7:26:749:174 99 chr2 1183 78 35M = 1357 209 CAGATTCATAAAACAAATACTACTAGACCTAAGAG <<<<<<<<<<<<<<<<<<<<<<;<9<8<<<9<;94 MF:i:18 Aq:i:11 NM:i:0 UQ:i:0 H0:i:6 H1:i:31
+EAS1_103:7:112:578:782 99 chr2 1183 89 35M = 1366 218 CAGATTCATAAAACAAATACTACTAGACCTAAGAG <;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<7<<< MF:i:18 Aq:i:20 NM:i:0 UQ:i:0 H0:i:5 H1:i:25
+EAS1_105:1:234:185:359 83 chr2 1183 46 35M = 1029 -189 CAGATTCATAAAACAAATACTACTAGACCTAAGAG <<4<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:9
+EAS112_34:4:92:412:435 147 chr2 1184 89 35M = 1003 -216 AGATTCATAAAACAAATACTACTAGACCTAAGAGG <;<52:=,====:=========<============ MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:24:105:1046 99 chr2 1184 99 35M = 1377 228 AGATTCATAAAACAAATACTACTAGACCTAAGAGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:4 H1:i:2
+EAS1_97:2:128:629:484 163 chr2 1185 96 35M = 1359 209 GATTCATAAAACAAATACTACTAGACCTAAGAGGG <<49<<<<<9<<<<99<<<<<<<<<<<<+<-)7)) MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:4 H1:i:45
+EAS219_FC30151:1:53:140:421 83 chr2 1185 99 35M = 1016 -204 GATTCATAAAACAAATACTACTAGACCTAAGAGGG <<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:99:557:427 163 chr2 1186 99 35M = 1342 191 ATTCATAAAACAAATACTACTAGACCTAAGAGGGA <<<<<<<<<<<<<<<<<<<<<<:<<<<+;<7:8:; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:3:253:175:31 147 chr2 1187 72 35M = 1008 -214 TTCATAAAACAAATACTACTAGACCTAAGAGGGAT ;+;<;<<<<<<<<9<<9<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:4:13:701:55 147 chr2 1187 99 36M = 1015 -208 TTCATAAAACAAATACTACTAGACCTAAGAGGGATG 0:+<7<;9<;<<<<<<<3<<<<<;;<<<:<<3<<<< MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:220:809:850 147 chr2 1187 60 35M = 986 -236 TTCATAAAACAAATACTACTAGACCTAAGAGGGAT 9+5<;*<<<2:0<<8:<*00<<<:<*<<<<<<<<& MF:i:18 Aq:i:60 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:5:30:599:589 147 chr2 1188 99 36M = 1003 -221 TCATAAAACAAATACTACTAGACCTAAGAGGGATGA 90<;<<<<<<<<+<<<;;<;<;<<<<<<<<6<<8<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:35:118:589 83 chr2 1188 99 35M = 999 -224 TCATAAAACAAATACTACTAGACCTAAGAGGGATG 67<<<<<;<<<<<<<:7<<<<:<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:4:37:604:389 147 chr2 1188 99 35M = 998 -225 TCATAAAACAAATACTACTAGACCTAAGAGGGATG 00;:;========9========<9========<== MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_61:2:168:61:867 83 chr2 1188 99 35M = 997 -226 TCATAAAACAAATACTACTAGACCTAAGAGGGATG ;7<<<<<<<<<<<<<7<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:7:197:399:319 83 chr2 1189 99 35M = 1012 -212 CAAAAAACAAATACTACTAGACCTAAGAGGGATGA &<+==<<5<<<8<89;;<<<<<<8<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS114_32:5:267:170:250 163 chr2 1189 99 35M = 1377 223 CATAAAACAAATACTACTAGACCTAAGAGGGATGA <<<<<<<<<<<<<<<<<;<<<;<<<<<<<<<<<<; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:4:174:157:573 83 chr2 1191 99 35M = 1012 -214 TAAAACAAATACTACTAGACCTAAGAGGGATGAGA 8<<<<4<<<<<<<<;<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:39:956:676 83 chr2 1191 99 35M = 1023 -203 TAAAACAAATACTACTAGACCTAAGAGGGATGAGA 899985;;<;:9;;:9<;:9:5;<;;;<;<;<<<< MF:i:18 Aq:i:44 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:37:763:1437 83 chr2 1191 99 35M = 994 -232 TAAAACAAATACTACTAGACCTAAGAGGGATGAGA 79979;<;<;;;<;;;;;;6:;<:;<:8;<<<<;< MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:50:513:882 83 chr2 1192 99 35M = 1031 -196 AAAACAAATACTACTAGACCTAAGAGGGATGAGAA <<<<:<<<<<:<<:<<<<::<<<<<<<<<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:2:15:1763:1143 147 chr2 1193 99 35M = 1023 -205 AAACAAATACTACTAGACCTAAGAGGGATGAGAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:46 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:4:189:571:366 83 chr2 1194 99 35M = 1002 -227 AACAAATACTACTAGACCTAAGAGGGATGAGAAAT <<;<<<<<:<<<;<<<;;;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:3:166:532:438 99 chr2 1194 99 35M = 1386 227 AACAAATACTACTAGACCTAAGAGGGATGAGAAAT <<<<<<<<<<<<<<<;<<;<<;<<<<;<;:;;<;< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:309:109:987 83 chr2 1194 99 35M = 1024 -205 AACAAATACTACTAGACCTAAGAGGGATGAGAAAT <<<<<<:<<;<<<<<;<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:1:171:527:247 83 chr2 1194 67 35M = 1027 -202 AACAAATGCTACTAGACCTAAGAGGGATGAGAAAT <547*9)&&7+;+<<7<<<;<<<;3<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+B7_589:8:139:727:808 163 chr2 1195 99 35M = 1363 203 ACAAATACTACTAGACCTAAGAGGGATGAGAAATT <<<<<<<<<<<<<:<;<<<<<<<<9;<;9<6;<<9 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:202:275:776 83 chr2 1196 99 36M = 1002 -230 CAAATACTACTAGACCTAAGAGGGATGAGAAATTAC ;<<<<;;<<<<<<<;<<<<<<<;<<<<<<<<<<;<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:12:484:836 163 chr2 1197 99 35M = 1372 210 AAATACTACTAGACCTAAGAGGGATGAGAAATTAC <<<<<<<<<<<<<<<<<7<:<<<<<<9<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:6:21:553:57 99 chr2 1197 99 35M = 1358 196 AAATACTACTAGACCTAAGAGGGATGAGAAATTAC <<<<<<<<<<<;;<<<;<<;<<;<<<;;9<;<;<9 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:4:939:2021 83 chr2 1197 99 40M = 1031 -206 AAATACTACTAGACCTAAGAGGGATGAGAAATTACCTAAT ;;;;:8;<5:<<<7/<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:194:378:230 83 chr2 1198 99 35M = 1022 -211 AATACTACTAGACCTAAGAGGGATGAGAAATTACC <<;<8<<:<<<<:<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:49 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:68:242:834 163 chr2 1200 99 36M = 1386 222 TACTACTAGACCTAAGAGGGATGAGAAATTACCTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:2:22:471:500 163 chr2 1200 99 35M = 1365 200 TACTACTAGACCTAAGAGGGATGAGAAATTACCTA =======<=<====:<2===9==;=;9;;=;;;;5 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:139:989:144 163 chr2 1201 99 35M = 1387 221 ACTACTAGACCTAAGAGGGATGAGAAATTACCTAA <<<<<<<<<<<<6<<<<<<<<<;<<<<<<<;;<;; MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:5:188:20:592 83 chr2 1202 95 35M = 1032 -205 CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT 2<<7;<<<<,;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:189:863:213 83 chr2 1202 99 35M = 1039 -198 CTACTAGACCTAAGAGGGATGAGAAATTACCTAAT 7:<7<<<<44;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_1:4:62:561:531 83 chr2 1203 99 35M = 1036 -202 TACTAGACCTAAGAGGGATGAGAAATTACCTAATT <<7<<<<:<8<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:8:70:1349:1788 83 chr2 1203 99 35M = 1043 -195 TACTAGACCTAAGAGGGATGAGAAATTACCTAATT <7;<<8<74;;<1<<71<;7<;;<;<7<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:5:197:914:256 147 chr2 1204 97 35M = 1049 -190 ACTAGACCTAAGAGGGATGAGAAATTACCTAATTG <5;<8<5/;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:35:896:1588 83 chr2 1205 91 35M = 1032 -208 CTAGACCTAAGAGGGATGAGAAATTACCTAATTGG 77999:.:<<;<;;;<<;<;<<<<<;<;;<<<<;; MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:43:47:279 163 chr2 1206 99 35M = 1405 234 TAGACCTAAGAGGGATGAGAAGTTACCTAATTGGT <<<<<<<<<<<<<;:<-<<<<<<<<<<<<:;;+7; MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:2:211:954:174 99 chr2 1207 99 35M = 1393 221 AGACCTAAGAGGGATGAGAAATTACCTAATTGGTA ===============================777= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:2:5:1219:137 99 chr2 1209 99 35M = 1384 210 ACCTAAGAGGGATGAGAAATTACATAATTGGTACA <<<<<<<<<<<<<<<<<<<<<<<(<<<<<<:9<;= MF:i:18 Aq:i:45 NM:i:1 UQ:i:7 H0:i:0 H1:i:1
+EAS56_57:7:33:954:724 83 chr2 1210 97 35M = 1049 -196 CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA ;<;<;<<-7;<<;<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:24 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:176:402:458 163 chr2 1210 99 36M = 1376 202 CCTAAGAGGGATGAGAAATTACCTAATTGGTACAAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<;;<; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:4:81:687:1379 163 chr2 1210 99 35M = 1366 191 CCTAAGAGGGATGAGAAATTACCTAATTGGTACAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:1:45:239:851 83 chr2 1211 61 35M = 1023 -223 CTAAGAGGGATGAGAAATTACCTAATTGGTACAAT *2*0<<<<<<<<<<<<<<<<9<<3<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_65:5:312:985:871 163 chr2 1212 99 35M = 1369 192 TAAGAGGGATGAGAAATTACCTAATTGGTACAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<9<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:38:557:1441 163 chr2 1212 99 35M = 1381 204 TAAGAGGGATGAGAAATTACCTAATTGGTACAATG <<<<<<<<<<<<<<<<<<<<<<<<<<<:<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:3:88:465:1877 147 chr2 1212 99 35M = 1055 -192 TAAGAGGGATGAGAAATTACCTAATTGGTACAATG <<<<<<<:<<<<<<<<:<<<<<<<<<<<<7;<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:7:149:123:265 163 chr2 1213 99 35M = 1395 217 AAGAGGGATGAGAAATTACCTAATTGGTACAATGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<9 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:6:47:1791:444 83 chr2 1213 74 35M = 1041 -207 AAGAGGGATGAGAAATTACCTAATTGGTACAATGT 978879;:;;<:;;<<;:<9<<<<;6;;;;<<<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:6
+EAS51_62:3:68:996:104 147 chr2 1214 70 35M = 1041 -208 AGAGGGATGAGAAATTACCTAATTGGTACAATGTA <1<8<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:21 NM:i:0 UQ:i:0 H0:i:1 H1:i:4
+B7_593:2:68:140:542 99 chr2 1217 95 36M = 1398 217 GGGATGAGAAATTACCTAATTGGTACAATGTACAAT <<<8;<<;<<<<<;<<;<<<<<8;<-<8<82;;;-8 MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:6
+EAS188_7:7:67:719:786 163 chr2 1218 43 35M = 1383 200 GGATGAGAAATTACCTAATTGGTACACTGTACAAT ;;<<<<<<&<<:13&<1<<<:<<<)/&/))<'6-< MF:i:18 Aq:i:13 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS1_108:5:321:712:224 83 chr2 1220 58 35M = 1051 -204 ATGAGAAATTACCTAATTGGTACAATGTACAATAT =;===7;===7=========;=:;=========;= MF:i:18 Aq:i:28 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_26:4:100:238:596 163 chr2 1220 56 35M = 1403 218 ATGAGAAATTACCTAATTGGTACAATGTACAATAT ======9=====;=======5===;====/=;=== MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:13
+EAS51_62:7:312:236:655 163 chr2 1222 99 35M = 1412 225 GAGAAATTACCTAATTGGTACAATGTACAATATTC <<<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:5
+EAS56_63:6:102:816:260 147 chr2 1225 99 35M = 1049 -211 AAATTACCTAATTGGTACAATGTACAATATTCTGA <<<<<<::<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:23 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:34:144:868 163 chr2 1226 76 35M = 1412 221 AATTACCTAATTGGTACAATGTACAATATTCTGAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<4;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:215:516:299 99 chr2 1226 99 35M = 1406 215 AATTACCTAATTGGTACAATGTACAATATTCTGAT <<<<<<;<<<<;;;;<;;<<<<;<<9<;<<1;7/; MF:i:18 Aq:i:64 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:81:12:1231 163 chr2 1228 99 35M = 1391 198 TTACCTAATTGGTACAATGTACAATATTCTGATGA <<<<7<<<<<<<<<<<<<<<<<<<<<<<<<<4<<6 MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:2:30:644:942 147 chr2 1229 83 35M = 1045 -219 TACCTAATTGGTACAATGTACAATATTCTGATGAT 85%+;<<9;<9<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:22 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:41:519:609 163 chr2 1229 99 35M = 1401 207 TACCTAATTGGTACAATGGACAATATTCTGATGAT 1<<<<<<<<<<<<<<<4<-:<+6<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+B7_591:7:116:814:89 99 chr2 1231 99 36M = 1408 213 CCTAATTGGTACAATGTACAATATTCTGATGATGGT <<<<<<<<<<<<<<<<<<<<<<:<<<<;<<;<<66< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:169:714:644 163 chr2 1231 99 35M = 1437 241 CCTAATTGGTACAATGTACAATATTCTGATGATGG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<;< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:73:420:812 99 chr2 1232 66 35M = 1414 217 CTAATTGGTACAATGTACAATATTCTGATGATGGT <<<<<1<<<<::1<7<:<96<9<:<<:4<70:11< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:17:1179:393 99 chr2 1232 99 35M = 1412 215 CTAATTGGTACAATGTACAATATTCTGATGATGGT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<:<<:4< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:118:829:36 99 chr2 1233 99 35M = 1417 219 TAATTGGTACAATGTACAATATTCTGATGATGGTT <<<<<<<<<:<2<<<<<<:<<<<<<<<<<<<71;< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:2:125:875:553 147 chr2 1233 99 36M = 1075 -194 TAATTGGTACAATGTACAATATTCTGATGATGGTTA -;<;:;<<;6<<<<<<6<;<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_32:4:7:282:424 99 chr2 1233 83 35M = 1397 199 TAATTGGTACAATGTACAATATTCTGATGATGGTT <<<3<<<9<<<<3<<<<<9<<<9,<;;9;&*;3,. MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:107:447:488 163 chr2 1233 99 35M = 1412 214 TAATTGGTACAATGTACAATATTCTGATGATGGTT <<<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:7:66:891:294 83 chr2 1233 99 35M = 1057 -211 TAATTGGTACAATGTACAATATTCTGATGATGGTT :<<5;;<<<4<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS56_57:8:72:44:435 99 chr2 1235 76 35M = 1392 192 ATTGGTACAATGTACAATATTCTGATGATGGTTAA <<<<<<<<<<<2;<;<<;<<<;<<8<82<;22<8& MF:i:18 Aq:i:0 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS139_19:4:18:1335:1514 147 chr2 1235 99 40M = 1063 -212 ATTGGTACAATGTACAATATTCTGATGATGGTTACACTAA ::/::<<;<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:7:72:1288:1211 147 chr2 1235 84 35M = 1052 -218 ATTGGTACAATGTACAATATTCTGATGATGGTTAC <);<:<<9<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:200:263:280 83 chr2 1236 99 35M = 1078 -193 TTGGTACAATGTACAATATTCTGATGATGGTTACA )<<<8<:<<<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:5:68:440:424 147 chr2 1237 99 35M = 1060 -212 TGGTACAATGTACAATATTCTGATGATGGTTACAC <<2<<<<<<<<9<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:6:255:441:47 147 chr2 1237 99 35M = 1072 -200 TGGTACAATGTACAATATTCTGATGATGGTTACAC ;;7<;:<<<<<<<<<<;<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:174:557:872 163 chr2 1237 99 35M = 1423 221 TGGTACAATGTACAATATTCTGATGATGGTTACAC <<<<<<<<<<<<<:<<<<<<<7<<;<<6:<<2117 MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS51_64:3:255:45:399 163 chr2 1238 99 35M = 1404 201 GGTACAATGTACAATATTCTGATGATGGTTACACT <<3<8<<8<0<<;<<<0<<<</+8<611<<;71;7 MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:2:264:157:150 147 chr2 1238 30 35M = 1054 -219 GGAAAAATGGACAAGATTCTGATGAGGGTTACACT .3%:+<<*;*<2<<1<1*,*<<7<<+<<<&<<<<< MF:i:130 Aq:i:30 NM:i:3 UQ:i:35 H0:i:0 H1:i:0
+EAS139_19:5:95:944:247 99 chr2 1238 99 40M = 1424 226 GGTACAATGTACAATATTCTGATGATGGTTACACTAAAAG <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<<:;::: MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_105:2:301:161:195 147 chr2 1239 75 35M = 1076 -198 GTACAATGTACAATATTCTGATGATGGTTACACTA ''6%6<6<<<4<<<<<<<<)<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:2:141:7:963 83 chr2 1240 85 36M = 1061 -215 TACAATGTACAATATTCTGATGATGGTTACACTAAA 95+<<9<<5<;;<<;<<;'<<<<<;<<<7<9<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_39:6:76:282:1668 99 chr2 1240 99 35M = 1401 196 TACAATGTACAATATTCTGATGATGGTTACACTAA <<<<<<<<<<<<<<<<<<;<<;<<<<<<;<;<<<8 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:5:64:199:1288 147 chr2 1240 77 35M = 1079 -196 TACAATGTACAATATTCTGATGATGGTTACACTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:49:911:980 163 chr2 1241 99 35M = 1434 228 ACAATGTACAATATTCTGATGATGGTTACACTAAA <<<<<<<<<<;<<<<<<<8<<<<;<;<<88-<;33 MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:66:1046:167 147 chr2 1241 99 35M = 1060 -216 ACAATGTACAATATTCTGATGATGGTTACACTAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:5:303:542:924 83 chr2 1242 76 35M = 1083 -194 CAATGTACAATATTCTGATGATGGTTACACTAAAA +<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS114_45:2:79:554:354 147 chr2 1242 63 35M = 1082 -195 CAATGTACAATATTCTGATGATGGTTACACTAAAA 98988;7;;;;:;;;;;;;;;;:;;;:;;;;;9;; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:248:122:558 163 chr2 1243 99 35M = 1436 228 AATGTACAATATTCTGATGATGGTTACACTAAAAG <<<<:<<<<<<<<<<<<<;<<<<:<6:4<<::6:6 MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:7:109:22:383 83 chr2 1244 99 35M = 1071 -208 ATGTACAATATTCTGATGATGGTTACACTAAAAGC <;9;<8<<<<<<;<<<<<<<<<<<<;<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:43:1229:1855 83 chr2 1244 99 35M = 1074 -205 ATGTACAATATTCTGATGATGGTTACACTAAAAGC 8<<<<;8<<<;;5<<28<<<<<<<<<<<<7;;<<; MF:i:18 Aq:i:48 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_63:2:74:656:272 83 chr2 1245 99 35M = 1088 -192 TGTACAATATTCTGATGATGGTTACACTAAAAGCC ;;;</<<<<<5;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS56_65:7:118:775:467 83 chr2 1245 99 35M = 1075 -205 TGTACAATATTCTGATGATGGTTACACTAAAAGCC <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+B7_593:7:15:244:876 99 chr2 1246 43 36M = 1440 230 GTACAATATTCTGATGATGGTTACACTAAAAGCCCA <<<<<<;<<<<<<<<;<<;;;<<<<<:<<<9;<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:63:28:1549 163 chr2 1247 77 35M = 1439 227 TACAATATTCTGATGATGGTTACACTAAAAGCCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<7;<<<<7 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:310:800:761 83 chr2 1249 99 35M = 1055 -229 CAATATTCTGATGATGGTTACACTAAAAGCCCATA 1<<:<:<:<<<<:<<<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:14:978:1296 83 chr2 1249 90 35M = 1104 -180 CAATATTCTGATGATGGTTACACTAAAAGCCCATA 77177;9;2:;;:;;(;;9;<;;;;:;;;:7;<<; MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:8:26:242:35 147 chr2 1251 99 35M = 1084 -202 ATATTTTGATGATGGTTACACTAAAAGCCCATACT <<<77!!7<;<<<;;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:2 UQ:i:0 H0:i:1 H1:i:8
+EAS114_45:7:6:758:988 83 chr2 1253 99 35M = 1087 -201 ATTCTGATGATGGTTACACTAAAAGCCCATACTTT 3-7*73;;399:9;9;7<-(<;;<;;:;9::;;7; MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:315:412:921 99 chr2 1254 99 35M = 1424 205 TTCTGATGATGGTTACACTACAAGCCCATACTGTA <;<;<<<<<<<;<<<<<<<<8<<<;<<:<<;;+<8 MF:i:18 Aq:i:45 NM:i:2 UQ:i:33 H0:i:0 H1:i:1
+EAS114_30:3:215:840:760 163 chr2 1256 99 35M = 1416 195 CTGATGATGGTTACACTAAAAGCCCATACTTTCCT <<<<<<<<<<<<<<<;<<<88<+<<:<;3585,+: MF:i:18 Aq:i:66 NM:i:1 UQ:i:11 H0:i:1 H1:i:0
+EAS1_95:5:284:212:932 147 chr2 1257 10 35M = 1063 -229 TGATGATGGTTACGCTAAAAGTCCATGCTTTACTG 82%<8:<-:<<:**:<-<<8<)/2/<:/<<<<<<< MF:i:18 Aq:i:0 NM:i:3 UQ:i:42 H0:i:0 H1:i:0
+EAS1_97:4:290:121:79 163 chr2 1257 99 35M = 1420 198 TGATGATGGTTACACTAAAAGCCCATACTTTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<9<<<7;<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:1:88:54:900 83 chr2 1257 68 35M = 1069 -223 TGATGATGGTTACACTAAAAGCCCATACTTCACTG ============;=================;9=== MF:i:18 Aq:i:19 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS188_7:3:100:735:530 83 chr2 1257 99 35M = 1058 -234 TGATGATGGTTACACTAAAAGCCCATACTTTACTG <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:32:562:1695 147 chr2 1258 76 35M = 1085 -208 GATGATGGTTACACTAAAAGCCCATACTTTACTGC :5:::<88/<:<<<<<<<<<7<9<<&<959<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:173:627:465 163 chr2 1260 99 36M = 1444 220 TGATGGTTACACTAAAAGCCCATACTTTACTGCTAC <<<<<<<<<<<<<<<<<<<<<<<;<<<<<2;;4;;7 MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS1_95:1:77:589:741 83 chr2 1263 99 35M = 1078 -220 TGGTTACACTAAAAGCCCATACTTTACTGCTACTC 8=;;==606;========================= MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:8:27:228:31 147 chr2 1264 99 35M = 1082 -217 GGTTACACTAAAAGCCCATACTTTACTGCTACTCA 99;;;<<<<<<:<<;<;<<;<<<<;<<;<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:54:695:952 147 chr2 1264 99 35M = 1076 -223 GGTTACACTAAAAGCCCATACTTTACTGCTACTCA 277%<9<4)<<<<<<<<<;<<<<<<<<<<<<<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:6:300:622:86 83 chr2 1264 99 35M = 1102 -197 GGTTACACTAAAAGCCCATACTTTACTGCTACTCA <:<<<:<6;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:71:62:254 163 chr2 1264 99 35M = 1438 209 GGTTACACTAAAAGCCCATACTTTCCTGCTACTCA <<<<<<7<<<<7<<<<<3<<<<<<&<<.<<::<:% MF:i:18 Aq:i:43 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS114_28:1:168:609:646 99 chr2 1264 99 36M = 1436 208 GGTTACACTAAAAGCCCATACTTTACTGCTACTCAA <<<<<<<<<<<;<<<<<:<8<<<<;<<<<<4<<<9< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:84:92:1246 163 chr2 1265 99 35M = 1437 207 GTTACACTAAAAGCCCATACTTTACTGCTACTCAA <<<<<<<<<<<<<<<<5<:<<5<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:3:310:193:629 83 chr2 1267 99 36M = 1103 -200 TACACTAAAAGCCCATACTTTACTGCTACTCAATAT 9<9<6;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:111:379:700 73 chr2 1268 0 35M = 1268 0 ACACTAAAAGCCCATACTTTACTGCTACTCAATAT 7<<:<<<<02<<6&<</<<</+9/98*<966/3/< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:111:379:700 133 chr2 1268 0 * = 1268 0 CGCACTGGCAATATTTGTGTGTTTACTTTTTTGCA :1+&;;6;:;918;);;):,19.9:).):::.&3( MF:i:192
+EAS114_30:6:137:741:866 163 chr2 1268 99 35M = 1429 196 ACACTAAAAGCCCATACTTTACTGCTACTCAATAT <<<<8<<;;;<<<<;<<<;;;<;4<<8;<<;%<8; MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:7:23:1126:1886 147 chr2 1268 99 35M = 1094 -209 ACACTAAAAGCCCATACTTTACTGCTACTCAATAT 5*.:.5<<::<<<<<<<<:5<<<<<<<<<<:2<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:21:423:169 99 chr2 1270 99 35M = 1468 233 ACTAAAAGCCCATACTTTACTGCTACTCAATATAT <<<<<;<<<<<<;<<<<<;;<<<<<<<<9+:5<;; MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:110:984:98 147 chr2 1270 99 36M = 1092 -214 ACTAAAACCCCATACTTTACTGCTACTCAATATATC :81<<<<+;;8<+<8<<<<<;<<<8;<<<<<<<<8; MF:i:18 Aq:i:70 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS219_FC30151:5:54:1351:910 99 chr2 1270 99 35M = 1448 213 ACTAAAAGCCCATACTTTACTGCTACTCAATATAT <<<<<<8<<<<<<<<<<<<<<<<<<<<<<18<<:< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:2:237:855:581 147 chr2 1271 87 35M = 1105 -201 CTAAACGCCCATACTTTACTGCTACTCAATATATC /+<<<&)2;66;/;;+<;;3133<3<3;9;<999< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_59:8:80:542:549 163 chr2 1271 99 35M = 1443 207 CTAAAAGCCCATACTTTACTGCTACTCAATATATC <<<<<<<<;<<<<<<<<:<<<<-<;;<;7<;3;9; MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:7:1347:375 163 chr2 1271 99 35M = 1436 200 CTAAAAGCCCATACTTTACTGCTACTCAATATATC ;;;;;;;;;;;;;;;;;;;;9;;;8;;;;;97777 MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:191:540:493 99 chr2 1273 99 35M = 1432 194 AAAAGCCCATACTTTACTGCTACTCAATATATCCA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_81:7:324:472:791 147 chr2 1274 89 35M = 1110 -199 AAAGCCAATACTTTACTGCTACTCAATATATCCAT <<.)5*&;;11<<<,5<33:-<<6<<<<:<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS220_1:8:83:1456:1854 83 chr2 1275 99 35M = 1117 -193 AAGCCCATACTTTACTGCTACTCAATATATCCATG <<67<:<8<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:290:247:509 163 chr2 1276 99 35M = 1450 209 AGCCCATACTTTACTGCTACTCAATATATCCATGT <<<<<<<<<<<<<<<4<<<<<<92<;;;<;96;19 MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:90:629:652 99 chr2 1276 99 35M = 1456 215 AGCCCATACTTTACTGCTACTCAATATATCCATGT <<<<<<<<<<<<<<<<<<<<<<<:<;<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:39:1671:1928 163 chr2 1276 99 35M = 1453 212 AGCCCATACTTTACTGCTACTCAATATATCCATGT <<<<<<<;<<<<;<<<<<4<<<;3<<<;<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:128:584:952 83 chr2 1277 99 35M = 1101 -211 GCCCATACTTTACTGCTACTCAATATATCCATGTA 7<;9;0:<<<:<<:<<<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:61 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:28:979:519 163 chr2 1278 99 35M = 1439 196 CCCATACTTTACTGCTACTCAATATATCCATGTAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;9: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:7:219:40:833 83 chr2 1278 99 35M = 1094 -219 CCCATACTTTACTGCTACTCAATATATCCATGTAA <<*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:289:207:323 163 chr2 1279 99 35M = 1462 218 CCATACTTTACTGCTACTCAATATATCCATGTAAC <<<:<<<<<:<<<<<<<<<<;<<899<<13)939; MF:i:18 Aq:i:41 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:45:758:616 163 chr2 1280 99 35M = 1473 228 CATACTTTACTGCTACTCAATATATCCATGTAACA <<<<<<<<<<<<<<<<<<<<<<<<<6<<<<<<;;< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:42:804:114 163 chr2 1281 99 35M = 1452 206 ATACTTTACTGCTACTCAATATATCCATGTAACAA <<<<<<<<<<<<<<<<<<<<<<<<<<:<:<;;<;; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:61:1885:163 83 chr2 1281 99 40M = 1128 -193 ATACTTTACTGCTACTCAATATATCCATGTAACAAATCTG ;:;;;;<<8<<:<<:<;<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:79 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:282:962:46 99 chr2 1282 99 35M = 1437 190 TACTTTACTGCTACTCAATATATCCATGTAACAAA <<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:6:143:620:158 83 chr2 1283 99 35M = 1107 -211 ACTTTACTGCTACTCAATATATCCATGTAACAAAT <4;<;<;<;6<<7<;<<<<<<<;<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:3:50:312:219 83 chr2 1288 99 35M = 1146 -177 ACTGCTACTCAATATATCCATGTAACAAATCTGCG <,;83:<::6<<<<<<<;:<;<<<<;<<<<<<<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_93:5:256:444:399 83 chr2 1289 99 35M = 1133 -191 CTGCTACTCAATATATCCATGTAACAAATCTGCGC ;+549<:<.<<<<<<<;<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:1:17:595:863 83 chr2 1289 89 35M = 1139 -185 AAGCTACTCAATATATCCATGTAACAAATCTGCGC ))55))+2&<<,:5<,0657<<<<:<:<:<<<<<< MF:i:18 Aq:i:33 NM:i:2 UQ:i:16 H0:i:1 H1:i:0
+EAS1_105:6:23:885:274 147 chr2 1289 99 35M = 1089 -235 CTACTACTCAATATATCCATGTAACAAATCTGCGC 2+*27==;;==<<.;:<=<=<============== MF:i:18 Aq:i:51 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+EAS54_61:8:4:173:814 83 chr2 1289 99 35M = 1111 -213 CTGCTACTCAATATATCCATGTAACAAATCTGCGC <<;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:263:557:988 147 chr2 1289 84 35M = 1108 -216 CTGCTACTCAATATATCCATGTAACAAATCTGCGC 1-41:<15+<<<<<<599<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:18 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:2:326:153:231 163 chr2 1290 43 35M = 1477 222 TGCTACTCAATATATCCATGTAACAAATCTGCGCT <<<<<<<<<9<<<<<<<<<,<<<<<<8<<8.;.;4 MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:4:98:862:154 83 chr2 1290 99 35M = 1116 -209 TGCTACTCAATATATCCATGTAACAAATCTGCGCT 856:;7<:<<9<<<9<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:2:6:529:366 147 chr2 1291 99 35M = 1103 -223 GCTACTCAATATATCCATGTAACAAATCTGCGCTT 9;8;8<:<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:299:336:613 147 chr2 1293 99 35M = 1145 -183 TACTCAATATATCCATGTAACAAATCTGCGCTTGT 1;4(+<<5<4<1<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:3
+B7_597:2:42:28:552 83 chr2 1294 99 35M = 1131 -198 ACTCAATATATCCATGTAACAAATCTGCGCTTGTA </8:<<:<<<;;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS114_39:3:55:464:146 147 chr2 1295 99 35M = 1114 -216 CTCAATATATCCATGTAACAAATCTGCGCTTGTAC ;(;;;;<<<<;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:2
+EAS54_67:6:109:953:668 99 chr2 1297 99 35M = 1485 223 CAATATATCCATGTAACAAATCTGCGCTTGTACTT ;<<<<;<<<<<<<<<<<<<<<<<<<<<<<<8<;<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:1
+EAS139_19:1:82:946:392 163 chr2 1297 99 40M = 1493 236 CAATATATCCATGTAACAAATCTGCGCTTGTACTTCAAAA <<<<<<<<<<<<<<<<<<<<<<<<<8<<<8<<8<<:4488 MF:i:18 Aq:i:74 NM:i:1 UQ:i:19 H0:i:1 H1:i:0
+EAS114_28:3:308:509:948 147 chr2 1298 99 36M = 1123 -211 AATATATCCATGTAACAAATCTGCGCTTGTACTTCT ;;+;;;.8<<;;;<<<<<<<<<<<<<8<<<<<;<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:174:753:617 147 chr2 1299 75 35M = 1136 -198 ATATATCCATGTAACAAATCTGCGCTTGTACTTCT <;<;<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:3:26:1867:162 83 chr2 1299 70 35M = 1137 -197 ATATATCCATGTAACAAATCTGCGCTTGTACTTCT 97999:;<<9;;<:<<;;;<;;<<<<<<<;;<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:2:162:257:203 83 chr2 1301 99 35M = 1114 -222 ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA <;<;:<<;<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:62:841:1994 121 chr2 1301 70 35M = 1301 0 ATATCCATGTAACAAATCTGCGCTTGTACTTCTAA 87878;;6:;;:<<<<:<:;;;<;<<<;<;;<;<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:5:62:841:1994 181 chr2 1301 0 * = 1301 0 TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MF:i:192
+EAS139_19:7:44:1807:833 99 chr2 1301 99 40M = 1449 188 ATATCCATGTAACAAATCTGCGCTTGTACTTCTAAATCTA <<<<<<<<<<<<<<<<<<<;<;<<<;<<9<<<<<89;;;: MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:7:280:607:113 163 chr2 1303 99 35M = 1468 200 ATCCATGTAACAAATCTGCGCTTGTACTTCTAAAT ===================;===;=====<=7=9: MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:260:147:818 163 chr2 1303 82 35M = 1497 229 ATCCATGTAACAAATCTGCGCTTTTACTTCTAAAT <<<<<<3<<<<<;<<<<)<1<<<&<7<<<;<4/9< MF:i:18 Aq:i:41 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS54_71:7:194:867:616 99 chr2 1303 99 34M = 1481 213 ATCCATGTAACAAATCTGCGCTTGTACTTCTATT <8<<<<<<<<<<<8<<4<<<<<<8<<3<<5<&(+ MF:i:18 Aq:i:67 NM:i:2 UQ:i:23 H0:i:1 H1:i:0
+EAS139_19:7:85:262:751 83 chr2 1305 99 40M = 1105 -240 CCATGTAACAAATCTGCGCTTGTACTTCTAAATCTATAAC 22;99;<<8<<<<<<<;<;<<<<<;<<;<<<<<<<<<<<+ MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS54_81:6:35:186:412 147 chr2 1306 99 35M = 1139 -202 CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA <<4:6<;<&<:4<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:8:46:1528:799 147 chr2 1306 96 35M = 1109 -232 CATGTAACAAATCTGCGCTTGTACTTCTAAATCTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:5:124:978:501 163 chr2 1307 99 36M = 1499 228 ATGTAACAAATCTGCGCTTGTACTTCTAAATCTATA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<; MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS192_3:3:88:866:774 163 chr2 1307 99 35M = 1478 206 ATGTAACAAATCTGCTCTTGTACTTCTAAATCTAT <<<;<<<<<;<<<<<<<<<<<<<<<<<68<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_1:6:4:1131:104 163 chr2 1307 99 35M = 1487 215 ATGTAACAAATCTGCGCTTGTACTTCTAAATCTAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<;;<<<:: MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:6:178:342:866 83 chr2 1311 72 35M = 1155 -191 AACAAATCTGCGCTTGTACTTCTAAATCTATAAAA <<9<<<&;;<<<<77<;<<<5;:<<<:<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:1:119:880:781 147 chr2 1312 99 35M = 1157 -190 ACAAATCTGCGCTTGTACTTCTAAATCTATAACAA ;8<<;<<<<:<84<<<<:<<<<<<<<<<<<<5<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+B7_591:2:46:220:58 99 chr2 1313 99 36M = 1483 206 CAAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA <<<<<<<<<<<<<<<<<<<<<<9<<<<<<<<<<:<; MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:2:47:591:698 147 chr2 1313 99 35M = 1146 -202 CAAATCTGCGCTTGTACTTCTAAATCTATAACAAA 7;;;;:<<:<:<<<<<7<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_105:1:115:226:443 147 chr2 1314 99 35M = 1137 -212 AAATCTGCGCTTGTACTTCTAAATCTATAAAAAAA <<;;<;<<<<<<<<<<<<:<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:198:59:675 83 chr2 1315 99 35M = 1150 -200 AATCTGCGCTTGTACTTCTAAATCTATAACAAAAT <<<<<4<4<:<<<;7<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS221_3:2:76:1729:813 163 chr2 1317 99 35M = 1506 224 TCTGCGCTTGTACTTCTAAATCTATAAAAAAATTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:147:360:141 99 chr2 1319 47 35M = 1501 218 TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA <<<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<<7 MF:i:18 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS1_95:7:155:530:532 83 chr2 1319 99 35M = 1128 -226 TGCGCTTGTACTTCTAAATCTATAACAAAATTAAA :<<<><<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 +<<<<</<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS54_65:2:94:356:809 83 chr2 1334 99 35M = 1151 -218 AAATCTATAACAAAATTAAAATTTAACAAAAGTAA <<<<3<<<<;;<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:1 UQ:i:26 H0:i:0 H1:i:1
+EAS114_30:7:319:11:255 83 chr2 1337 92 35M = 1179 -193 TCTATAAAAAAATTAAAATTTAACAAAAGTAAATA ;8<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;<<< MF:i:18 Aq:i:17 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:7:35:538:1882 83 chr2 1337 98 35M = 1160 -212 TCTATAACAAAATTAAAATTTAACAAAAGTAAATA 73797;;3<;;<6;;<<<;8:;:;<;:<:;<<;;; MF:i:18 Aq:i:43 NM:i:1 UQ:i:18 H0:i:0 H1:i:1
+EAS51_66:1:64:182:741 153 chr2 1338 10 35M * 0 0 AAAAAAACAAATTAAACTCTAACAAAAGTAAATAA (+;1&(9*%0<*(*&<*5,/+<,&<&<<6<<<<<< MF:i:32 Aq:i:10 NM:i:6 UQ:i:63 H0:i:0 H1:i:0
+EAS54_61:4:86:660:932 147 chr2 1338 99 35M = 1154 -219 ATATAAAAAAATTAAAATTTAACAAAAGTAAATAA &<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:71 NM:i:1 UQ:i:5 H0:i:1 H1:i:0
+EAS56_53:8:122:430:882 147 chr2 1338 99 35M = 1147 -226 CTATAAAAAAATTAAAATTTAACAAAAGTAAATAA 0<<:<<<<<<<:3<<<<<<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_595:6:99:557:427 83 chr2 1342 99 35M = 1186 -191 AACAAAATTAAAATTTAACAAAAGTAAATAAAACA <<-<<<<9<<<<<:<<<<9<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:1 UQ:i:12 H0:i:1 H1:i:0
+B7_593:5:299:743:762 83 chr2 1345 99 36M = 1173 -208 AAAATTAAAATTTAACAAAAGTAAATAAAACACATA ;<<<1<<<<<+<;<;7<<;<<<<<<<<<;<<;;<<7 MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:303:428:326 99 chr2 1345 74 35M = 1515 205 AAAATTAAAATTTAACAAAAGTAAATAAAACACAT <<<<<<<<<<<<<<<<<<<<<<<<<<;<<<<<<<; MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:4:192:714:341 83 chr2 1346 99 35M = 1170 -211 AAATTAAAATTTAACAAAAGTAAATAAAACACATA <<<3;<<<<9:<<</<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:1:189:876:833 83 chr2 1349 99 36M = 1173 -212 TTAAAATTTAACAAAAGTAAATAAAACACATAGCTA 7;<<<<:;;<</<<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:7:37:79:581 163 chr2 1349 68 35M = 1533 219 TTAAAATTTAAAAAAAGTAAATAAAACACATAGCT <>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 :(::<</*;<<99<<<-<;<<<<4<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:1 UQ:i:7 H0:i:1 H1:i:0
+EAS1_108:2:85:580:481 83 chr2 1359 99 35M = 1167 -227 AAAAAAGTAAATAAAACACATAGCTAAAACTAAAA =)====77========8=3====3=========== MF:i:18 Aq:i:71 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+B7_589:8:139:727:808 83 chr2 1363 99 35M = 1195 -203 AAGTAAATAAAACACATAGCTAAAACTAAAAAAGC <<;<<<<<<<<<;<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:2:22:471:500 83 chr2 1365 99 35M = 1200 -200 GTAAATAAAACACATAGCTAAAACTAAAAAAGCAA =9===0====;=77<==8;====;=========== MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_103:7:112:578:782 147 chr2 1366 89 35M = 1183 -218 AAAATAAAACACATAGCTAAAACTAAAAAAGCAAA +<<<%<<<<6<;<<<<6:<<<<:<<<<<<<<<<<< MF:i:18 Aq:i:20 NM:i:1 UQ:i:10 H0:i:1 H1:i:0
+EAS221_3:4:81:687:1379 83 chr2 1366 99 35M = 1210 -191 TAAATAAAACACATAGCTAAAACTAAAAAAGCAAA <<<<<<<<<<<:<<<<:<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_65:3:320:20:250 99 chr2 1367 77 35M = 1532 200 AAATAAAACACATAGCTAAAACTAAAAAAGCAAAA <<<<<<<<<<<<<<<<<;<<<<<<<<<;+:<;<<3 MF:i:18 Aq:i:6 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:5:312:985:871 83 chr2 1369 99 35M = 1212 -192 ATAAAACACATAGCTAAAACTAAAAAAGCAAAAAC <8<<<<.<.<<<<:<<<<<.<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:6:12:484:836 83 chr2 1372 99 35M = 1197 -210 AAACACATAGCTAAAACTAAAAAAGCAAAAACAAA <<<<</<4<<&7<<<<;<<<<<<<<<<<<<1<<<< MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:176:402:458 83 chr2 1376 99 36M = 1210 -202 AAATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA </<+<4&;<<<<7<<<<<<<<;<<<<<<<<<<<<<< MF:i:18 Aq:i:70 NM:i:1 UQ:i:14 H0:i:1 H1:i:0
+EAS139_11:7:50:1229:1313 163 chr2 1376 77 35M = 1528 187 ACATAGCTAAAACTAAAAAAGCAAAAACAAAAACT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_65:4:124:367:72 83 chr2 1377 99 35M = 1175 -237 CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA ,<<<8,<<<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:5:267:170:250 83 chr2 1377 99 35M = 1189 -223 CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA -<;<5-:<<<<;<<<<<<<;;<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS220_1:6:24:105:1046 147 chr2 1377 99 35M = 1184 -228 CATAGCTAAAACTAAAAAAGCAAAAACAAAAACTA +<<<</<<<<<.<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:4:38:557:1441 83 chr2 1381 99 35M = 1212 -204 GATAAAAATAAAAAAGCAAAAACAAAAACTATGCT <&<<<<<,<<<<<<<<8<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:45 NM:i:2 UQ:i:16 H0:i:0 H1:i:1
+EAS188_7:7:67:719:786 83 chr2 1383 43 35M = 1218 -200 TAAAAAAAAAAAAGCAAAAACAAAAACTATGCTAA $<<;<-1<<<8<<*&<;<;,<<3<<<<33<<<33< MF:i:18 Aq:i:13 NM:i:2 UQ:i:28 H0:i:1 H1:i:0
+EAS114_39:2:5:1219:137 147 chr2 1384 99 35M = 1209 -210 AAAACTAAAAAAGCAAAAACAAAAACTATGCTAAG <<<<:<<<<<<<<<<<<<<<<<<<<<<<<<<:<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:7:68:242:834 83 chr2 1386 99 36M = 1200 -222 AAATAAAAAAGCAAAAACAAAAACTATGCTAAGTAT <<68<<<<<<<8<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:1 UQ:i:21 H0:i:1 H1:i:0
+EAS51_66:3:166:532:438 147 chr2 1386 99 35M = 1194 -227 AACTAAAAAAGCAAAAACAAAAACTATGCTAAGTA <<&7<<<<<<<+<<<<<:<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:4:139:989:144 83 chr2 1387 99 35M = 1201 -221 ACTAAAAAAGCAAAAACAAAAACTATGCTAAGTAT <&<<<<<<<<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:3:81:12:1231 83 chr2 1391 99 35M = 1228 -198 AAAAAGCAAAAACAAAAACTATGCTAAGTATTGGT <<<<<<<7<<<<<<<5<'<6/<<<5<<<<<<2<<< MF:i:18 Aq:i:71 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_57:8:72:44:435 147 chr2 1392 76 35M = 1235 -192 AAAAGCAAAAACAAAAACTATGCTAAGTATTGGTA <<<<;7;<<<<;<<<<<<<<<<;<<<;<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_95:2:211:954:174 147 chr2 1393 99 35M = 1207 -221 AAAGAAAAAACAAAAACTATGCTAAGTATTGGTAA ====*=====6======================== MF:i:18 Aq:i:75 NM:i:1 UQ:i:9 H0:i:1 H1:i:0
+B7_595:7:149:123:265 83 chr2 1395 99 35M = 1213 -217 AGCAAAAACAAAAACTATGCTAAGTATTGGTAAAG <;&<<<<<:<<<<<<<<<<;<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_32:4:7:282:424 147 chr2 1397 83 35M = 1233 -199 CAAAAACAAAAACTATGCTAAGTATTGTTAAAGAT 1<<<<<9<<<<<31<77;;;;7<3<<2+;<3<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:10 H0:i:0 H1:i:1
+B7_593:2:68:140:542 147 chr2 1398 95 36M = 1217 -217 AAAAACAAAAACTATGCTAAGTATTGGTAAAGATGT ;;<<;7<<<<<<:<<<:<<<:<<<<<<<<<<<<<<< MF:i:18 Aq:i:19 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_39:6:76:282:1668 147 chr2 1401 99 35M = 1240 -196 AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG <<<<<:<<<8<8<<<<<::<<<<7<<<<<<2<<<8 MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:4:41:519:609 83 chr2 1401 99 35M = 1229 -207 AACAAAAACTATGCTAAGTATTGGTAAAGATGTGG <4;<;<<<<<<<<;4:<<;<<<<<<<<<<<;<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_26:4:100:238:596 83 chr2 1403 56 35M = 1220 -218 CAAAAACTATTCTAAGTATTGGTAAAGATGTGGGG 4<<<<;<3<3&<3<1<5<31<<3<<<<<<2<<;<, MF:i:18 Aq:i:17 NM:i:1 UQ:i:5 H0:i:0 H1:i:1
+EAS51_64:3:255:45:399 83 chr2 1404 99 35M = 1238 -201 AAAAACTATGCTAAGTATTGGTAAAGATGTGGGGA <5<5<4$;;7/<<<177&7;<<<<<<;<<4<<<<< MF:i:18 Aq:i:57 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:6:43:47:279 83 chr2 1405 99 35M = 1206 -234 AAAACTATGCTAAGTATTGGTAAAGATGTGGGGAA <:<<79<<<19<<<1<<9<<+<<<<<3<3<<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_78:7:215:516:299 147 chr2 1406 99 35M = 1226 -215 AAGCTATGCTAAGTATTGGTAAAGATGTGGGGAAA ;;))7<8:855<<4<;:<<87<<<7<<;<<<*3<< MF:i:18 Aq:i:64 NM:i:1 UQ:i:8 H0:i:1 H1:i:0
+B7_591:7:116:814:89 147 chr2 1408 99 36M = 1231 -213 ACTATGCTAAGTATTGGTAAAGATGTGGGGAAAAAA :38<;<;<<<<;<<<<<<<<<<<<<;<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_610:7:34:144:868 83 chr2 1412 76 35M = 1226 -221 AGCTAAGGAATGGGAAAGGTGTGGGGAAAAAAGTA &9+&7<&&0&<6<.0<<7<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:76 NM:i:4 UQ:i:50 H0:i:0 H1:i:0
+EAS51_62:7:312:236:655 83 chr2 1412 99 35M = 1222 -225 TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA <<8;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:6:17:1179:393 147 chr2 1412 99 35M = 1232 -215 TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS188_7:6:107:447:488 83 chr2 1412 99 35M = 1233 -214 TGCTAAGTATTGGTAAAGATGTGGGGAAAAAAGTA <<3<<<<<<6<<<<<<<<<<<<<<<<7<<<<<<<< MF:i:18 Aq:i:53 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:6:73:420:812 147 chr2 1414 66 35M = 1232 -217 CTAAGTATTGGTAAAGATGTGGGGAAAAAAGTAAA 5'<<<,<&,<<,<<<<<7<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:3:215:840:760 83 chr2 1416 99 35M = 1256 -195 AAGTATTGGTAAAGATGTGGGGAAAAAAGTAAACT <<<8<::<;;<<<:<7<7<;;;<<<<<<<<<<;<< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_589:8:118:829:36 147 chr2 1417 99 35M = 1233 -219 AGTATTGGTAAAGATGTGGGGAAAAAAGTAAACTC <8<<;;<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:4:290:121:79 83 chr2 1420 99 35M = 1257 -198 ATTGGTAAAGATGTGGGGAAAAAAGTAAACTCTCA <1<<:<<<<<<<;<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:8:174:557:872 83 chr2 1423 99 35M = 1237 -221 GGTAAAGATGTGGGGAAAAAAGTAAACTCTCAAAT .77<:<9<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:2:315:412:921 147 chr2 1424 99 35M = 1254 -205 GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATA 4-<79;<<<4:;:<<<<<<<<4<<<38<<;<<<<< MF:i:18 Aq:i:45 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:5:95:944:247 147 chr2 1424 99 40M = 1238 -226 GTAAAGATGTGGGGAAAAAAGTAAACTCTCAAATATTGCT :7::;<<<<<;;<<<<<<<<<<<<<<;<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_30:6:137:741:866 83 chr2 1429 99 35M = 1268 -196 GATGAGGGGAAAAAAGTAAACTCTCAAATATTGCT <;0:%<:9<<<:<<<<;<<:<<;0;<<<<<::<<6 MF:i:18 Aq:i:70 NM:i:1 UQ:i:4 H0:i:1 H1:i:0
+EAS188_7:6:191:540:493 147 chr2 1432 99 35M = 1273 -194 GTGGGGAAAAAAGTAAACTCTCAAATATTGCTAGT <<9<1<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:1:49:911:980 83 chr2 1434 99 35M = 1241 -228 GGGGAAAAAAGTAAACTCTCAAATATTGCTAGTGG 44:7<<<<<<<<<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:62 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:1:248:122:558 83 chr2 1436 99 35M = 1243 -228 GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA <;<<<<<<<<<<<;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:52 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:1:168:609:646 147 chr2 1436 99 36M = 1264 -208 GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG ;;<<<<=======;;:;======;==<========= MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:4:7:1347:375 83 chr2 1436 99 35M = 1271 -200 GGAAAAAAGTAAACTCTCAAATATTGCTAGTGGGA 47999<<<;;;;;;:5;:;<;;<;;;;;<;;;;;< MF:i:18 Aq:i:66 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:282:962:46 147 chr2 1437 99 35M = 1282 -190 GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG 69<<<<<:<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_73:5:169:714:644 83 chr2 1437 99 35M = 1231 -241 GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG ;<<<<<<;<<<:<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_11:1:84:92:1246 83 chr2 1437 99 35M = 1265 -207 GAAAAAAGTAAACTCTCAAATATTGCTAGTGGGAG <<<<<<<<<<<<<<<8<<<<<<5<<<<<<<<<<<< MF:i:18 Aq:i:78 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_34:7:71:62:254 83 chr2 1438 99 35M = 1264 -209 AAAAAAGTAAACTCTCAAATATTGCTAGTGGGAGT <<<<<<;8<<<<;<:<<<<<<<;<<;<<<<<<<<< MF:i:18 Aq:i:43 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_97:7:28:979:519 83 chr2 1439 99 35M = 1278 -196 AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA <<<<<6<<<<<<<<<<<<<<<8<<<<<<<<6<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_1:1:63:28:1549 83 chr2 1439 77 35M = 1247 -227 AAAAAGTAAACTCTCAAATATTGCTAGTGGGAGTA <<<<<<<<<:<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_593:7:15:244:876 147 chr2 1440 43 36M = 1246 -230 AAAAGTAAACTCTCAAATATTGCTAGTGTGAGTATA ;<<<7<<<<<.2<-<<<<<<<<<:<<<<<<<<<2<< MF:i:18 Aq:i:0 NM:i:1 UQ:i:27 H0:i:0 H1:i:1
+EAS56_59:8:80:542:549 83 chr2 1443 99 35M = 1271 -207 AGTAAACTCTCAAATATTGCTAGTGGGAGTATAAA =9====7=;=======;;==;========<===== MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_28:3:173:627:465 83 chr2 1444 99 36M = 1260 -220 GTAAACTCTCAAATATTGCTAGTGGGAGTATAAATT :<<<<;<;<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:51 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS219_FC30151:5:54:1351:910 147 chr2 1448 99 35M = 1270 -213 ACTCTCAAATATTGCTAGTGGGAGTATAAATTGTT <7<7;;<<<<<;<<;;<<;<<<<<<<<<<<<<<;< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS139_19:7:44:1807:833 147 chr2 1449 99 40M = 1301 -188 CTCTCAAATATTGCTAGTGGGAGTATAAATTGTTTTCCAC :6:9:<<<6<88<;<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:5:290:247:509 83 chr2 1450 99 35M = 1276 -209 TCTCAAATATTGCTAGTGGGAGTATAAATTGTTTT 49';<<<<<8;<;;<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS112_32:7:42:804:114 83 chr2 1452 99 35M = 1281 -206 TCAAATATTGCTAGTGGGAGTATAAATTGTTTTCC ;9<<;<<<<<<;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS218_4:3:39:1671:1928 83 chr2 1453 99 35M = 1276 -212 CAAATATTGCTAGTGGGAGTATAAATTGTTTTCCA <<<<9<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_59:5:90:629:652 147 chr2 1456 99 35M = 1276 -215 ATATTGCTAGTGGGAGTATAAATTGTTTTCCACTT <:<7::<:<<<<<8<<<<<<<<<<<<<<<<<<<7< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_66:1:289:207:323 83 chr2 1462 99 35M = 1279 -218 CTAGTGGGAGTATAAATTGATTTCCACTTTGGAAA &</<7<<:<7::<<<<+3<-7<<:<7<<<<<<<<< MF:i:18 Aq:i:41 NM:i:1 UQ:i:12 H0:i:0 H1:i:1
+EAS1_95:7:280:607:113 83 chr2 1468 99 35M = 1303 -200 GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT 18<-<<<<<<<<<<<<<8<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:72 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_99:3:21:423:169 147 chr2 1468 99 35M = 1270 -233 GGAGTATAAATTGTTTTCCACTTTGGAAAACAATT ;376;0<<<<99<<<<<<-;<4<<<<<<<<<;<<< MF:i:18 Aq:i:68 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS56_61:3:45:758:616 83 chr2 1473 99 35M = 1280 -228 ATAAATTGTTTTCCACTTTGGAAAACAATTTGGTA <<;<:<<<<<<<<<;<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:54 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_64:2:326:153:231 83 chr2 1477 43 35M = 1290 -222 ATTGTTTTCAACTTTGGAAAACAATTTGGTAATTT ::6=68=<*$;*=========6============= MF:i:18 Aq:i:0 NM:i:1 UQ:i:3 H0:i:0 H1:i:1
+EAS192_3:3:88:866:774 83 chr2 1478 99 35M = 1307 -206 TTGTTTTCCACTTTGGAAAACAATTTGGTAATTTC <<<;<<<<:<<<<<:<8<<<<<<<<<<8<<<<<<< MF:i:18 Aq:i:47 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_71:7:194:867:616 147 chr2 1481 99 35M = 1303 -213 TTTTCCACTTTGGAAAACAATTTGGTAATTTCGTT 38:;;:<:<<<<;<<<<<<<<<<;<<<<<<<<<<< MF:i:18 Aq:i:67 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_591:2:46:220:58 147 chr2 1483 99 36M = 1313 -206 TTCCACTTTGGAAAACAATTTGGTAATTTCGTTTTT 98<<<2<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:75 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS54_67:6:109:953:668 147 chr2 1485 99 35M = 1297 -223 CCACTTTGGAAAACAATTTGGTAATTTCGTTTTTT <:)9<<<<<<<<8:<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:30 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_1:6:4:1131:104 83 chr2 1487 99 35M = 1307 -215 ACTTTGGAAAACAATTTGGTAATTTCGTTTTTTTT 61;;;<<<<<<<<<;:<<<:<<;<<<<;<<<<<<< MF:i:18 Aq:i:73 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS114_45:2:23:1754:796 147 chr2 1488 99 35M = 1329 -194 CTTTGGAAAACAATTTGGTAATTTCGTTTTTTTTT 88897;;;;:;:;;;;;;;;;;;;;;;;;;;;;;; MF:i:18 Aq:i:69 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS1_108:5:11:555:330 83 chr2 1492 99 35M = 1321 -206 GGAAAACAATTTGGTAATTTCGTTTTTTTTTTTTT 6;6;9766+<<<<9:2=<===6============= MF:i:18 Aq:i:56 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:4:308:614:911 147 chr2 1493 90 35M = 1319 -209 AAAAACAATTTGGTAATTTAGTTTTTTTTTTTTTC %<<<;:<::<6,<<<<<<:<:<<<<<<<<<<<<<< MF:i:18 Aq:i:43 NM:i:2 UQ:i:31 H0:i:0 H1:i:1
+EAS139_19:1:82:946:392 83 chr2 1493 99 40M = 1297 -236 GAAAACAATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTC :;:;:,::<:;<<<;;<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:74 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS51_62:2:260:147:818 83 chr2 1497 82 35M = 1303 -229 AAAATTTGGTAATTTAGTTTTTTTTTTTTTCTTTT 6.=..++==6=76==&===========99====== MF:i:18 Aq:i:41 NM:i:2 UQ:i:18 H0:i:0 H1:i:1
+B7_591:5:124:978:501 83 chr2 1499 99 36M = 1307 -228 AATTTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTC <9<;<<::<;<<;<4<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:77 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+B7_597:8:147:360:141 147 chr2 1501 47 13M1D22M = 1319 -218 TTTGGTAATTTAGTTTTTTTTTTTTCTTTTCTCTT <86<<<<73<7<<<<<<<<<<<<<<<<<<<<<<<< MF:i:130 Aq:i:47 NM:i:1 UQ:i:27 H0:i:0 H1:i:0
+EAS114_39:3:6:1064:1805 147 chr2 1502 99 35M = 1350 -187 TTGGTAATTTCGTTTTTTTTTTTTTCTTTTCTCTT ;88<;<;;<<;;<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:76 NM:i:0 UQ:i:0 H0:i:1 H1:i:0
+EAS221_3:2:76:1729:813 83 chr2 1506 99 35M = 1317 -224 TAATTTCGTTTTTTTTTTTTTCTTTTCTCTTTTTT <+6<<<&1<<<<<<<<<<<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:36 NM:i:0 UQ:i:0 H0:i:2 H1:i:0
+EAS54_65:6:326:71:741 153 chr2 1509 0 35M * 0 0 TCTCGTTTTTTTTTCTTTCTTTTCTCTTTTTTTTT !!<66<<<<<<<<<&<<7&<<<<:<*<<<<<<<<1 MF:i:32 Aq:i:0 NM:i:2 UQ:i:22 H0:i:1 H1:i:12
+EAS112_34:6:145:144:263 73 chr2 1509 0 35M * 0 0 TTTCGTTTTTTTTTTTTTTTTTTCCCCTTTCTTTT <<<<<<<<<<<<<<<<+4+4&+&(&&*2&8&&&)& MF:i:32 Aq:i:0 NM:i:4 UQ:i:29 H0:i:0 H1:i:0
+EAS1_105:1:329:407:872 73 chr2 1510 0 35M * 0 0 TTCGTTTTTTTTTTTTTTTTTTCCCTTTTTTTTTT <<<<<<<<<<<<<<<<<<6;<<&4::<++<(&;<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:46 H0:i:0 H1:i:0
+EAS139_19:2:82:154:1333 147 chr2 1511 77 40M = 1349 -202 TTTTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTTTTT :5'::<<<;<<<<<<</3<<<&4&7<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS56_63:3:41:468:459 147 chr2 1513 0 35M = 1352 -196 TTTTTTTTTTTTTTTTTTTCTTTTTTTTTTTTTTT +;<<<<<<<<<<<;&<<;;88&<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS114_28:6:11:151:750 153 chr2 1513 5 36M * 0 0 GTTTTTATTTTTTTCCTCTCTCTTTTTTTTTTTTTT :'1:%4;4<<<+;6;&9+6;/<<<<<<<<<<<<<<< MF:i:32 Aq:i:5 NM:i:3 UQ:i:41 H0:i:0 H1:i:3
+EAS139_11:5:52:1278:1478 83 chr2 1513 47 35M = 1322 -226 GTTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTT .8::<<<<<<<;<<<<<;<<<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:9 H1:i:85
+B7_591:2:309:798:997 153 chr2 1514 0 36M * 0 0 TTTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT 466;<<744077+&7097&%&4<9<<<9<<<::<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:5 H0:i:12 H1:i:85
+EAS1_93:6:218:144:794 121 chr2 1514 0 35M = 1514 0 TTTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT ;92/;5:<6)+<5)67</9<&<&<<<:<<<57<<< MF:i:64 Aq:i:0 NM:i:0 UQ:i:0 H0:i:22 H1:i:85
+EAS1_93:6:218:144:794 181 chr2 1514 0 * = 1514 0 GGGTGCATTGCTATGTTGCGGTCGCTTTGCCTCCT ++(3:&)5<9035<3):-<53<+&&-+)<<&)&<6 MF:i:192
+EAS1_97:6:222:305:337 153 chr2 1514 0 35M * 0 0 TTTTTTTTTTTTTTTTTTCCCTTTTTTTTTTTTTT ;;;;;<<';<<<<*;<<<78;7<7<;<<<<<<<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:32 H0:i:0 H1:i:37
+EAS1_105:3:7:35:528 89 chr2 1514 0 35M * 0 0 TTTTTTTTTTGTTCTTTACTCTTTTTTTTTTTTTT <<<<<<<<<<5<<<(<<%<<-8<<<<<<<<<8<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:24 H0:i:0 H1:i:0
+EAS54_65:2:182:924:833 137 chr2 1514 0 35M * 0 0 TTTTTTTTTTTTTATTTGCGCTTTTTTTTTTTTTT <<<<<<<<<<<<<)7<<)3/:07<<9<9<<==<7< MF:i:32 Aq:i:0 NM:i:3 UQ:i:30 H0:i:0 H1:i:0
+EAS54_81:8:78:735:536 153 chr2 1514 0 35M * 0 0 TTTTTTTTTTTTTCATTTCTCTTTTTTTTTTTTTT ;9<<<<<<<.7<9'%1<<)2::<<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:4 H0:i:0 H1:i:15
+EAS56_59:5:232:336:46 137 chr2 1514 0 35M * 0 0 ATTTTTTTTTTTTCTTTTCTCTTGTTTCTTTTTTT +<<<<<<<<<<<<6<<<<;<6<<&&<,3<<<<3,, MF:i:32 Aq:i:0 NM:i:3 UQ:i:50 H0:i:0 H1:i:0
+EAS188_4:5:308:552:77 89 chr2 1514 0 35M * 0 0 TTTTCTTTTTTTTCTTTTCTCTTTTTTTTTTTTTT 1;-<%<;8<<<<<&<5-<58:5:<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:1 UQ:i:4 H0:i:30 H1:i:85
+B7_597:5:125:957:753 137 chr2 1515 0 35M * 0 0 TTTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTT <8<<<;<8;8//++(,(+++&++(/+008880;;/ MF:i:32 Aq:i:0 NM:i:2 UQ:i:14 H0:i:0 H1:i:1
+EAS1_97:4:274:287:423 83 chr2 1515 0 35M = 1332 -218 TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT 7<<<<9<<9<<<.<<<<90-<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:12 H1:i:85
+EAS54_71:8:234:21:950 89 chr2 1515 0 33M * 0 0 TTTTTTTTTTTTCTCCTCTCTTTTTTTTTTTTT <<<<<<<<<&<;2;&-<,<+;<<<7<<<;<;<; MF:i:32 Aq:i:0 NM:i:2 UQ:i:17 H0:i:0 H1:i:7
+EAS56_61:6:256:67:461 117 chr2 1515 0 * = 1515 0 TCATGTTTGTGTCTTTCTATGCATTTTTTTTTTTT !!7181!63:6-:!-163(-1%-18<<4<<<<<<< MF:i:192
+EAS56_61:6:256:67:461 185 chr2 1515 0 35M = 1515 0 TTGTTTTTTCTTCTTTTCTCTTTTTTTTTTTTTTT *.%53.:)1+9;3397;1795507+335;.&51)5 MF:i:64 Aq:i:0 NM:i:2 UQ:i:14 H0:i:2 H1:i:85
+EAS56_65:8:317:83:500 153 chr2 1515 0 35M * 0 0 TTTTTTTTTTTTCTTTTCTCCTTTTTTTTTTGTTT ;;;;;<<<<<<<3<<<)-;31<<)97<;9<<:<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:41 H0:i:0 H1:i:0
+EAS114_30:2:303:428:326 147 chr2 1515 0 35M = 1345 -205 TTTTTTTTTTTTTTTTTCTCTTTTTTTTTTTTTTT 4<;<<;<;<4<<8;;;;.8+;<<;<8<;<;<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:11 H1:i:85
+EAS188_7:1:290:286:763 147 chr2 1515 75 35M = 1349 -201 TTTTTTTTTTTTCTTTTCTCTTTTTTTTTTTTTTT <<<<;<<<<<<<&<<<<&77<<<<<<<<<<<<<<< MF:i:18 Aq:i:0 NM:i:0 UQ:i:0 H0:i:29 H1:i:85
+B7_591:7:89:67:709 89 chr2 1516 0 36M * 0 0 TTTTTTTTTTTGTCTTCTCTTTTTTTTTTTTTTTTT :7:::9:7:<<7<'<<477<<<<<<<<<:<<<<<:< MF:i:32 Aq:i:0 NM:i:2 UQ:i:28 H0:i:0 H1:i:17
+EAS56_65:3:47:64:359 89 chr2 1516 0 35M * 0 0 TTTTTTTTTTTCTCTCCTCTTTTTTTTTTTTTTTT <<<6<<<<<<<4<4</9<4@<<;<<<<<<<<<<<< MF:i:32 Aq:i:0 NM:i:2 UQ:i:33 H0:i:0 H1:i:6
+EAS56_65:4:296:78:421 121 chr2 1518 0 35M = 1518 0 TCTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTT !!<<<:<<<<..<::<<<<<<<<<<<<<<<<<<<< MF:i:64 Aq:i:0 NM:i:1 UQ:i:4 H0:i:85 H1:i:85
+EAS56_65:4:296:78:421 181 chr2 1518 0 * = 1518 0 TGTTGGTGTTCGTTTTTTCTCCTGTTTCTTTTTCT <<*<4<<<;:<0<<<<<<<<+;<9<<1<<;<<<+: MF:i:192
+EAS1_95:4:238:124:196 89 chr2 1519 0 35M * 0 0 TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT <0<9.<5.5<<<<9<1<<5<<85<5<<<9<:<<<< MF:i:32 Aq:i:0 NM:i:0 UQ:i:0 H0:i:85 H1:i:85
+EAS54_65:7:56:57:985 117 chr2 1519 0 * = 1519 0 TTCTGTCTTCTCTCCTGTCTTCTTTTCTCTTCTTT <9'<.<7<<2<<;77<7<<<<7<7<<<<7<<<2<< MF:i:192
+EAS54_65:7:56:57:985 185 chr2 1519 0 35M = 1519 0 TTTTTTCTCTTTTCTCTTTTTTTTTTTTTTTTTTT 666666*6&1666+64666666666&266666666 MF:i:64 Aq:i:0 NM:i:1 UQ:i:9 H0:i:85 H1:i:85
+EAS56_61:3:5:45:441 89 chr2 1519 0 35M * 0 0 TTTTTTTTCTTTTCTCTTTTTTTTTTTTTTTTTTT ;;58:<:<(:<<11<&<1<<;<<<<><<<<<<<<< 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
diff --git a/test/data/illu_20_chunk.bam b/test/data/illu_20_chunk.bam
new file mode 100644
index 0000000..0d58f27
Binary files /dev/null and b/test/data/illu_20_chunk.bam differ
diff --git a/test/data/ion_20_chunk.bam b/test/data/ion_20_chunk.bam
new file mode 100644
index 0000000..237cbb9
Binary files /dev/null and b/test/data/ion_20_chunk.bam differ
diff --git a/test/data/long_header.bam b/test/data/long_header.bam
new file mode 100644
index 0000000..850e2d1
Binary files /dev/null and b/test/data/long_header.bam differ
diff --git a/test/data/mg1655_chunk.bam b/test/data/mg1655_chunk.bam
new file mode 100644
index 0000000..e5b33df
Binary files /dev/null and b/test/data/mg1655_chunk.bam differ
diff --git a/test/data/no_block_size.bam b/test/data/no_block_size.bam
new file mode 100644
index 0000000..a6fb055
Binary files /dev/null and b/test/data/no_block_size.bam differ
diff --git a/test/data/tags.bam b/test/data/tags.bam
new file mode 100644
index 0000000..3f12a89
Binary files /dev/null and b/test/data/tags.bam differ
diff --git a/test/data/tags.bam.bai b/test/data/tags.bam.bai
new file mode 100644
index 0000000..9822d12
Binary files /dev/null and b/test/data/tags.bam.bai differ
diff --git a/test/data/wrong_bc_subfield_length.bam b/test/data/wrong_bc_subfield_length.bam
new file mode 100644
index 0000000..361126e
Binary files /dev/null and b/test/data/wrong_bc_subfield_length.bam differ
diff --git a/test/data/wrong_extra_gzip_length.bam b/test/data/wrong_extra_gzip_length.bam
new file mode 100644
index 0000000..47c6289
Binary files /dev/null and b/test/data/wrong_extra_gzip_length.bam differ
diff --git a/test/unittests.d b/test/unittests.d
new file mode 100644
index 0000000..4435008
--- /dev/null
+++ b/test/unittests.d
@@ -0,0 +1,482 @@
+/*
+ This file is part of BioD.
+ Copyright (C) 2012-2013 Artem Tarasov <lomereiter at gmail.com>
+
+ 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() {
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/libbiod.git
More information about the debian-med-commit
mailing list