[med-svn] [rna-star] 02/07: Imported Upstream version 2.5.2a+dfsg

Andreas Tille tille at debian.org
Thu May 19 16:16:38 UTC 2016


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository rna-star.

commit 834d1b2d47e8e14953c6825edebc799dc583c8f6
Author: Andreas Tille <tille at debian.org>
Date:   Thu May 19 17:59:26 2016 +0200

    Imported Upstream version 2.5.2a+dfsg
---
 .gitmodules                                       |    3 -
 CHANGES.md                                        |   14 +
 README.md                                         |    2 +-
 RELEASEnotes.md                                   |    2 +-
 source/BAMbinSortByCoordinate.cpp                 |   16 +-
 source/BAMbinSortByCoordinate.h                   |    2 +-
 source/BAMbinSortUnmapped.cpp                     |    8 +-
 source/BAMbinSortUnmapped.h                       |    2 +-
 source/BAMfunctions.cpp                           |   18 +-
 source/BAMoutput.cpp                              |   54 +-
 source/BAMoutput.h                                |    2 +-
 source/ErrorWarning.cpp                           |    2 +-
 source/Genome.cpp                                 |  252 +-
 source/Genome.h                                   |    8 +-
 source/Genome_insertSequences.cpp                 |    8 +-
 source/InOutStreams.cpp                           |   20 +-
 source/InOutStreams.h                             |    4 +-
 source/IncludeDefine.h                            |   14 +-
 source/Makefile                                   |    2 +-
 source/OutSJ.cpp                                  |   16 +-
 source/OutSJ.h                                    |   26 +-
 source/PackedArray.h                              |    6 +-
 source/ParameterInfo.h                            |   34 +-
 source/Parameters.cpp                             |  632 +--
 source/Parameters.h                               |  150 +-
 source/Parameters_openReadsFiles.cpp              |   38 +-
 source/Quantifications.cpp                        |   10 +-
 source/Quantifications.h                          |    6 +-
 source/ReadAlign.cpp                              |   62 +-
 source/ReadAlign.h                                |   70 +-
 source/ReadAlignChunk.cpp                         |   40 +-
 source/ReadAlignChunk.h                           |    8 +-
 source/ReadAlignChunk_mapChunk.cpp                |   44 +-
 source/ReadAlignChunk_processChunks.cpp           |   70 +-
 source/ReadAlign_alignBAM.cpp                     |  173 +-
 source/ReadAlign_assignAlignToWindow.cpp          |   44 +-
 source/ReadAlign_chimericDetection.cpp            |  108 +-
 source/ReadAlign_createExtendWindowsWithAlign.cpp |   22 +-
 source/ReadAlign_mapOneRead.cpp                   |   52 +-
 source/ReadAlign_maxMappableLength2strands.cpp    |   28 +-
 source/ReadAlign_multMapSelect.cpp                |   50 +-
 source/ReadAlign_oneRead.cpp                      |   40 +-
 source/ReadAlign_outputAlignments.cpp             |  173 +-
 source/ReadAlign_outputTranscriptCIGARp.cpp       |   32 +-
 source/ReadAlign_outputTranscriptSAM.cpp          |  148 +-
 source/ReadAlign_outputTranscriptSJ.cpp           |   22 +-
 source/ReadAlign_quantTranscriptome.cpp           |   36 +-
 source/ReadAlign_stitchPieces.cpp                 |  159 +-
 source/ReadAlign_stitchWindowSeeds.cpp            |  164 +-
 source/ReadAlign_storeAligns.cpp                  |   46 +-
 source/STAR.cpp                                   |  194 +-
 source/SequenceFuns.cpp                           |   38 +-
 source/SequenceFuns.h                             |    2 +-
 source/SharedMemory.cpp                           |   24 +-
 source/SharedMemory.h                             |    6 +-
 source/SjdbClass.h                                |    2 +-
 source/Stats.cpp                                  |   26 +-
 source/Stats.h                                    |   12 +-
 source/SuffixArrayFuns.cpp                        |  162 +-
 source/SuffixArrayFuns.h                          |    2 +-
 source/ThreadControl.h                            |    8 +-
 source/Transcript.cpp                             |   18 +-
 source/Transcript.h                               |   34 +-
 source/Transcript_alignScore.cpp                  |    8 +-
 source/Transcriptome.cpp                          |   32 +-
 source/Transcriptome.h                            |    6 +-
 source/Transcriptome_geneCountsAddAlign.cpp       |   26 +-
 source/Transcriptome_quantAlign.cpp               |   28 +-
 source/VERSION                                    |    2 +-
 source/alignSmithWaterman.cpp                     |   76 +-
 source/bamRemoveDuplicates.cpp                    |   54 +-
 source/binarySearch2.cpp                          |    8 +-
 source/blocksOverlap.cpp                          |   14 +-
 source/extendAlign.cpp                            |   28 +-
 source/funCompareUintAndSuffixes.cpp              |   20 +-
 source/funCompareUintAndSuffixes.h                |    6 +-
 source/funCompareUintAndSuffixesMemcmp.cpp        |   33 +
 source/funCompareUintAndSuffixesMemcmp.h          |   10 +
 source/genomeGenerate.cpp                         |  214 +-
 source/genomeParametersWrite.cpp                  |   12 +-
 source/genomeSAindex.cpp                          |   86 +-
 source/genomeScanFastaFiles.cpp                   |   54 +-
 source/insertSeqSA.cpp                            |  141 +-
 source/loadGTF.cpp                                |   80 +-
 source/mapThreadsSpawn.cpp                        |    8 +-
 source/outputSJ.cpp                               |   26 +-
 source/parametersDefault                          |   72 +-
 source/parametersDefault.xxd                      | 4339 +++++++++++----------
 source/readLoad.cpp                               |   66 +-
 source/serviceFuns.cpp                            |   18 +-
 source/signalFromBAM.cpp                          |   54 +-
 source/sjSplitAlign.cpp                           |    2 +-
 source/sjdbBuildIndex.cpp                         |  108 +-
 source/sjdbInsertJunctions.cpp                    |   26 +-
 source/sjdbLoadFromFiles.cpp                      |    6 +-
 source/sjdbLoadFromStream.cpp                     |    2 +-
 source/sjdbPrepare.cpp                            |   58 +-
 source/sortSuffixesBucket.cpp                     |  100 +
 source/sortSuffixesBucket.h                       |    3 +
 source/stitchAlignToTranscript.cpp                |  124 +-
 source/stitchGapIndel.cpp                         |   28 +-
 source/stitchWindowAligns.cpp                     |  140 +-
 source/streamFuns.cpp                             |   16 +-
 source/sysRemoveDir.cpp                           |    2 +-
 104 files changed, 5032 insertions(+), 4574 deletions(-)

diff --git a/.gitmodules b/.gitmodules
index 9f60d88..e69de29 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +0,0 @@
-[submodule "STAR-Fusion"]
-	path = STAR-Fusion
-	url = https://github.com/STAR-Fusion/STAR-Fusion
diff --git a/CHANGES.md b/CHANGES.md
index 10266a3..d6b7d28 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,17 @@
+STAR 2.5.2a 2016/05/10
+======================
+
+* Fixed the "GstrandBit" problem. 
+* Fixed a bug introduced in 2.5.1a that caused problems with single-end alignments output in some cases.
+* Fixed a bug that can cause STARlong seg-faults in rare cases.
+* Fixed a bug that caused output of unmapped mates for single end alignments even with --outSAMunmapped None .
+* Implemented --winReadCoverageRelativeMin and --winReadCoverageBasesMin to control coverage of the alignment windows for STARlong.
+* Implemented --outSAMfilter KeepAllAddedReferences option which will keep all alignments to the added references.
+* Implemented --alignEndsProtrude option to control output of alignments with protruding ends.
+* Implemented --outTmpKeep All option to keep the temporary files.
+* Implemented --alignEndsType Extend5pOfReads12 option for full extension of 5' ends of both mates.
+
+
 STAR 2.5.1b 2016/01/22
 ======================
 
diff --git a/README.md b/README.md
index 295c254..2060019 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ MANUAL
 ======
 https://github.com/alexdobin/STAR/blob/master/doc/STARmanual.pdf
 
-[RELEASEnotes](RELEASEnotes) contains detailed information about the latest major release
+[RELEASEnotes](RELEASEnotes.md) contains detailed information about the latest major release
 
 DIRECTORY CONTENTS
 ==================
diff --git a/RELEASEnotes.md b/RELEASEnotes.md
index 8237aa3..14db415 100644
--- a/RELEASEnotes.md
+++ b/RELEASEnotes.md
@@ -1,4 +1,4 @@
-STAR 2.4.5a 2015/11/06
+STAR 2.5.0a 2015/11/06
 ======================
 
 **STAR now uses essential c++11 features. Compiling from sources requires gcc 4.7.0 or later.**
diff --git a/source/BAMbinSortByCoordinate.cpp b/source/BAMbinSortByCoordinate.cpp
index 86b0f68..c312c88 100644
--- a/source/BAMbinSortByCoordinate.cpp
+++ b/source/BAMbinSortByCoordinate.cpp
@@ -4,7 +4,7 @@
 #include "BAMfunctions.h"
 
 void BAMbinSortByCoordinate(uint32 iBin, uint binN, uint binS, uint nThreads, string dirBAMsort, Parameters *P) {
-      
+
     if (binS==0) return; //nothing to do for empty bins
     //allocate arrays
     char *bamIn=new char[binS+1];
@@ -32,30 +32,30 @@ void BAMbinSortByCoordinate(uint32 iBin, uint binN, uint binS, uint nThreads, st
         errOut << binS <<"   "<< bamInBytes <<"   "<< iBin <<"\n";
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, 1, *P);
     };
-  
+
     //extract coordinates
-    
+
     for (uint ib=0,ia=0;ia<binN;ia++) {
         uint32 *bamIn32=(uint32*) (bamIn+ib);
         startPos[ia*3]  =( ((uint) bamIn32[1]) << 32) | ( (uint)bamIn32[2] );
-        startPos[ia*3+2]=ib;      
+        startPos[ia*3+2]=ib;
         ib+=bamIn32[0]+sizeof(uint32);//note that size of the BAM record does not include the size record itself
         startPos[ia*3+1]=*( (uint*) (bamIn+ib) ); //read order
         ib+=sizeof(uint);
     };
-        
+
     //sort
     qsort((void*) startPos, binN, sizeof(uint)*3, funCompareUint2);
-    
+
     BGZF *bgzfBin;
     bgzfBin=bgzf_open((dirBAMsort+"/b"+to_string((uint) iBin)).c_str(),("w"+to_string((long long) P->outBAMcompression)).c_str());
     outBAMwriteHeader(bgzfBin,P->samHeaderSortedCoord,P->chrName,P->chrLength);
     //send ordered aligns to bgzf one-by-one
     for (uint ia=0;ia<binN;ia++) {
         char* ib=bamIn+startPos[ia*3+2];
-        bgzf_write(bgzfBin,ib, *((uint32*) ib)+sizeof(uint32) ); 
+        bgzf_write(bgzfBin,ib, *((uint32*) ib)+sizeof(uint32) );
     };
-    
+
     bgzf_flush(bgzfBin);
     bgzf_close(bgzfBin);
     //release memory
diff --git a/source/BAMbinSortByCoordinate.h b/source/BAMbinSortByCoordinate.h
index fb87a00..03ed824 100644
--- a/source/BAMbinSortByCoordinate.h
+++ b/source/BAMbinSortByCoordinate.h
@@ -5,5 +5,5 @@
 #include SAMTOOLS_BGZF_H
 
 void BAMbinSortByCoordinate(uint32 iBin, uint binN, uint binS, uint nThreads, string dirBAMsort, Parameters *P);
-       
+
 #endif
\ No newline at end of file
diff --git a/source/BAMbinSortUnmapped.cpp b/source/BAMbinSortUnmapped.cpp
index 7612fdc..c9b7073 100644
--- a/source/BAMbinSortUnmapped.cpp
+++ b/source/BAMbinSortUnmapped.cpp
@@ -8,7 +8,7 @@ void BAMbinSortUnmapped(uint32 iBin, uint nThreads, string dirBAMsort, BGZF *bgz
     bgzfBin=bgzf_open((dirBAMsort+"/b"+to_string((uint) iBin)).c_str(),("w"+to_string((long long) P->outBAMcompression)).c_str());
     outBAMwriteHeader(bgzfBin,P->samHeaderSortedCoord,P->chrName,P->chrLength);
 
-      
+
     vector<string> bamInFile;
     std::map <uint,uint> startPos;
 
@@ -17,7 +17,7 @@ void BAMbinSortUnmapped(uint32 iBin, uint nThreads, string dirBAMsort, BGZF *bgz
         bamInFile.push_back(dirBAMsort+to_string(it)+"/"+to_string((uint) iBin)+".BySJout");
     };
     vector<uint32> bamSize(bamInFile.size(),0);
-    
+
     //allocate arrays
     char **bamIn=new char* [bamInFile.size()];
     ifstream *bamInStream = new ifstream [bamInFile.size()];
@@ -42,7 +42,7 @@ void BAMbinSortUnmapped(uint32 iBin, uint nThreads, string dirBAMsort, BGZF *bgz
         uint startNext=startPos.size()>1 ? (++startPos.begin())->first : (uint) -1;
 
         while (true) {
-            bgzf_write(bgzfBin, bamIn[it], bamSize.at(it)); 
+            bgzf_write(bgzfBin, bamIn[it], bamSize.at(it));
             bamInStream[it].read(bamIn[it],sizeof(int32));//read record size
             if (bamInStream[it].good()) {
                  bamSize[it]=((*(uint32*)bamIn[it])+sizeof(int32));
@@ -58,7 +58,7 @@ void BAMbinSortUnmapped(uint32 iBin, uint nThreads, string dirBAMsort, BGZF *bgz
         };
         startPos.erase(startPos.begin());
     };
-    
+
     bgzf_flush(bgzfBin);
     bgzf_close(bgzfBin);
 
diff --git a/source/BAMbinSortUnmapped.h b/source/BAMbinSortUnmapped.h
index d3bde58..070352a 100644
--- a/source/BAMbinSortUnmapped.h
+++ b/source/BAMbinSortUnmapped.h
@@ -5,5 +5,5 @@
 #include SAMTOOLS_BGZF_H
 
 void BAMbinSortUnmapped(uint32 iBin, uint nThreads, string dirBAMsort, BGZF *bgzfBAM, Parameters *P);
-       
+
 #endif
diff --git a/source/BAMfunctions.cpp b/source/BAMfunctions.cpp
index 6329478..e1c5ea9 100644
--- a/source/BAMfunctions.cpp
+++ b/source/BAMfunctions.cpp
@@ -14,14 +14,14 @@ string bam_cigarString (bam1_t *b) {//output CIGAR string
       };
     };
 
-    
+
 //	if (c->n_cigar) { // cigar
 //		for (int i = 0; i < c->n_cigar; ++i) {
 //			kputw(bam_cigar_oplen(cigar[i]), str);
 //			kputc(bam_cigar_opchr(cigar[i]), str);
 //		}
 //	} else kputc('*', str);
-//    
+//
 //    string cigarString (str->s,str->l);
     return cigarString;
 };
@@ -39,14 +39,14 @@ int bam_read1_fromArray(char *bamChar, bam1_t *b) //modified from samtools bam_r
 
     uint32_t *bamU32=(uint32_t*) bamChar;
     block_len=bamU32[0];
-    
+
 // // 	if (bgzf_read(fp, x, 32) != 32) return -3;
 // // 	if (fp->is_be) {
 // // 		ed_swap_4p(&block_len);
 // // 		for (i = 0; i < 8; ++i) ed_swap_4p(x + i);
 // // 	}
     x=bamU32+1;
-    
+
 	c->tid = x[0]; c->pos = x[1];
 	c->bin = x[2]>>16; c->qual = x[2]>>8&0xff; c->l_qname = x[2]&0xff;
 	c->flag = x[3]>>16; c->n_cigar = x[3]&0xffff;
@@ -67,14 +67,14 @@ int bam_read1_fromArray(char *bamChar, bam1_t *b) //modified from samtools bam_r
 // // 	//b->l_aux = b->l_data - c->n_cigar * 4 - c->l_qname - c->l_qseq - (c->l_qseq+1)/2;
 // // 	if (fp->is_be) swap_data(c, b->l_data, b->data, 0);
     b->data=(uint8_t*) bamChar+4*9;
-    
+
 	return 4 + block_len;
 }
 
 
 void outBAMwriteHeader (BGZF* fp, const string &samh, const vector <string> &chrn, const vector <uint> &chrl) {
     bgzf_write(fp,"BAM\001",4);
-    int32 hlen=samh.size();            
+    int32 hlen=samh.size();
     bgzf_write(fp,(char*) &hlen,sizeof(hlen));
     bgzf_write(fp,samh.c_str(),hlen);
     int32 nchr=(int32) chrn.size();
@@ -97,14 +97,14 @@ TintType bamAttributeInt(const char *bamAux, const char *attrName) {//not tested
         case ('c'):
             return (TintType) *(int8_t*)(attrStart+3);
         case ('s'):
-            return (TintType) *(int16_t*)(attrStart+3);   
+            return (TintType) *(int16_t*)(attrStart+3);
         case ('i'):
             return (TintType) *(int32_t*)(attrStart+3);
         case ('C'):
             return (TintType) *(uint8_t*)(attrStart+3);
         case ('S'):
-            return (TintType) *(uint16_t*)(attrStart+3);   
+            return (TintType) *(uint16_t*)(attrStart+3);
         case ('I'):
             return (TintType) *(uint32_t*)(attrStart+3);
-    };            
+    };
 };
diff --git a/source/BAMoutput.cpp b/source/BAMoutput.cpp
index c5244a9..13f64fb 100644
--- a/source/BAMoutput.cpp
+++ b/source/BAMoutput.cpp
@@ -8,7 +8,7 @@
 BAMoutput::BAMoutput (int iChunk, string tmpDir, Parameters *Pin) {//allocate bam array
 
     P=Pin;
-    
+
     nBins=P->outBAMcoordNbins;
     binSize=P->chunkOutBAMsizeBytes/nBins;
     bamArraySize=binSize*nBins;
@@ -16,9 +16,9 @@ BAMoutput::BAMoutput (int iChunk, string tmpDir, Parameters *Pin) {//allocate ba
 
     bamDir=tmpDir+to_string((uint) iChunk);//local directory for this thread (iChunk)
 
-    mkdir(bamDir.c_str(),P->runDirPerm);    
+    mkdir(bamDir.c_str(),P->runDirPerm);
     binStart=new char* [nBins];
-    binBytes=new uint64 [nBins];    
+    binBytes=new uint64 [nBins];
     binStream=new ofstream* [nBins];
     binTotalN=new uint [nBins];
     binTotalBytes=new uint [nBins];
@@ -29,15 +29,15 @@ BAMoutput::BAMoutput (int iChunk, string tmpDir, Parameters *Pin) {//allocate ba
         binTotalN[ii]=0;
         binTotalBytes[ii]=0;
     };
-    
+
     binSize1=binStart[nBins-1]-binStart[0];
     nBins=1;//start with one bin to estimate genomic bin sizes
 };
 
 BAMoutput::BAMoutput (BGZF *bgzfBAMin, Parameters *Pin) {//allocate BAM array with one bin, streamed directly into bgzf file
-    
-    P=Pin;    
-    
+
+    P=Pin;
+
     bamArraySize=P->chunkOutBAMsizeBytes;
     bamArray = new char [bamArraySize];
     binBytes1=0;
@@ -53,55 +53,55 @@ BAMoutput::BAMoutput (BGZF *bgzfBAMin, Parameters *Pin) {//allocate BAM array wi
 };
 
 void BAMoutput::unsortedOneAlign (char *bamIn, uint bamSize, uint bamSize2) {//record one alignment to the buffer, write buffer if needed
-    
-    if (bamSize==0) return; //no output, could happen if one of the mates is not mapped    
-    
+
+    if (bamSize==0) return; //no output, could happen if one of the mates is not mapped
+
     if (binBytes1+bamSize2 > bamArraySize) {//write out this buffer
 
-        if (g_threadChunks.threadBool) pthread_mutex_lock(&g_threadChunks.mutexOutSAM);  
+        if (g_threadChunks.threadBool) pthread_mutex_lock(&g_threadChunks.mutexOutSAM);
         bgzf_write(bgzfBAM,bamArray,binBytes1);
-        if (g_threadChunks.threadBool) pthread_mutex_unlock(&g_threadChunks.mutexOutSAM); 
-        
+        if (g_threadChunks.threadBool) pthread_mutex_unlock(&g_threadChunks.mutexOutSAM);
+
         binBytes1=0;//rewind the buffer
     };
-    
+
     memcpy(bamArray+binBytes1, bamIn, bamSize);
     binBytes1 += bamSize;
-    
+
 };
 
 void BAMoutput::unsortedFlush () {//flush all alignments
-    if (g_threadChunks.threadBool) pthread_mutex_lock(&g_threadChunks.mutexOutSAM);  
+    if (g_threadChunks.threadBool) pthread_mutex_lock(&g_threadChunks.mutexOutSAM);
     bgzf_write(bgzfBAM,bamArray,binBytes1);
-    if (g_threadChunks.threadBool) pthread_mutex_unlock(&g_threadChunks.mutexOutSAM); 
+    if (g_threadChunks.threadBool) pthread_mutex_unlock(&g_threadChunks.mutexOutSAM);
     binBytes1=0;//rewind the buffer
 };
 
 void BAMoutput::coordOneAlign (char *bamIn, uint bamSize, uint iRead) {
-    
+
     uint32 *bamIn32;
     uint alignG;
     uint32 iBin=0;
-    
+
     if (bamSize==0) {
         return; //no output, could happen if one of the mates is not mapped
     } else {
         //determine which bin this alignment belongs to
-        bamIn32=(uint32*) bamIn;        
-        alignG=( ((uint) bamIn32[1]) << 32 ) | ( (uint)bamIn32[2] );        
+        bamIn32=(uint32*) bamIn;
+        alignG=( ((uint) bamIn32[1]) << 32 ) | ( (uint)bamIn32[2] );
         if (bamIn32[1] == ((uint32) -1) ) {//unmapped
             iBin=P->outBAMcoordNbins-1;
         } else if (nBins>1) {//bin starts have already been determined
             iBin=binarySearch1a <uint64> (alignG, P->outBAMsortingBinStart, (int32) (nBins-1));
         };
     };
-            
+
 //     if ( alignG == (uint32) -1 ) {//unmapped alignment, last bin
 //         iBin=nBins-1;
 //     } else {
 //         iBin=(alignG + chrStart)/binGlen;
 //     };
-        
+
     //write buffer is filled
     if (binBytes[iBin]+bamSize+sizeof(uint) > ( (iBin>0 || nBins>1) ? binSize : binSize1) ) {//write out this buffer
         if ( nBins>1 || iBin==(P->outBAMcoordNbins-1) ) {//normal writing, bins have already been determined
@@ -113,7 +113,7 @@ void BAMoutput::coordOneAlign (char *bamIn, uint bamSize, uint iRead) {
             return;
         };
     };
-    
+
     //record this alignment in its bin
     memcpy(binStart[iBin]+binBytes[iBin], bamIn, bamSize);
     binBytes[iBin] += bamSize;
@@ -159,9 +159,9 @@ void BAMoutput::coordBins() {//define genomic starts for bins
     char *binStartOld=new char [binSize1];
     memcpy(binStartOld,binStart[0],binBytes[0]);
 
-    binBytes[0]=0;    
+    binBytes[0]=0;
     binTotalN[0]=0;
-    binTotalBytes[0]=0;              
+    binTotalBytes[0]=0;
 
     //re-bin all aligns
     for (uint ib=0,ia=0;ia<binTotalNold;ia++) {
@@ -186,7 +186,7 @@ void BAMoutput::coordFlush () {//flush all alignments
 };
 
 void BAMoutput::coordUnmappedPrepareBySJout () {//flush all alignments
-    uint iBin=P->outBAMcoordNbins-1;  
+    uint iBin=P->outBAMcoordNbins-1;
     binStream[iBin]->write(binStart[iBin],binBytes[iBin]);
     binStream[iBin]->flush();
     binBytes[iBin]=0;//rewind the buffer
diff --git a/source/BAMoutput.h b/source/BAMoutput.h
index fd676ef..3228a8e 100644
--- a/source/BAMoutput.h
+++ b/source/BAMoutput.h
@@ -17,7 +17,7 @@ public:
     void unsortedOneAlign (char *bamIn, uint bamSize, uint bamSize2);
     void unsortedFlush ();
     void coordUnmappedPrepareBySJout();
-    
+
     uint32 nBins; //number of bins to split genome into
     uint* binTotalN; //total number of aligns in each bin
     uint* binTotalBytes;//total size of aligns in each bin
diff --git a/source/ErrorWarning.cpp b/source/ErrorWarning.cpp
index 8ced2b1..aa6cf37 100644
--- a/source/ErrorWarning.cpp
+++ b/source/ErrorWarning.cpp
@@ -10,7 +10,7 @@ void exitWithError(string messageOut, ostream &streamOut1, ostream &streamOut2,
     if (streamOut1.good()) {
         streamOut1 << "\n" << messageOut << endl << timeMonthDayTime(timeCurrent) <<" ...... FATAL ERROR, exiting\n"  <<flush;
     };
-    if (streamOut2.good()) {    
+    if (streamOut2.good()) {
         streamOut2 << "\n" << messageOut << endl << timeMonthDayTime(timeCurrent) <<" ...... FATAL ERROR, exiting\n"  <<flush;
     };
     delete P.inOut; //to close files
diff --git a/source/Genome.cpp b/source/Genome.cpp
index 3e76e21..127a5ae 100644
--- a/source/Genome.cpp
+++ b/source/Genome.cpp
@@ -17,7 +17,7 @@
 #define SHM_sizeSA 8
 #define SHM_startG 16
 // #define SHM_startSA 24
-// 
+//
 // //first available byt of the shm
 // #define SHM_startSHM 32
 
@@ -49,11 +49,11 @@ void Genome::freeMemory(){//free big chunks of memory used by genome and suffix
 
 uint Genome::OpenStream(string name, ifstream & stream)
 {
-    stream.open((P->genomeDir+ "/" +name).c_str(), ios::binary); 
+    stream.open((P->genomeDir+ "/" +name).c_str(), ios::binary);
     if (!stream.good()) {
         ostringstream errOut;
         errOut << "EXITING because of FATAL ERROR: could not open genome file "<< P->genomeDir << "/" << name <<"\n" << endl;
-        errOut << "SOLUTION: check that the path to genome files, specified in --genomeDir is correct and the files are present, and have user read permsissions\n" <<flush;     
+        errOut << "SOLUTION: check that the path to genome files, specified in --genomeDir is correct and the files are present, and have user read permsissions\n" <<flush;
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_FILES, *P);
     };
 
@@ -62,7 +62,7 @@ uint Genome::OpenStream(string name, ifstream & stream)
     P->inOut->logMain << "checking " << name << " size";
     stream.seekg (0, ios::end);
     size=(uint) stream.tellg();
-    stream.clear();        
+    stream.clear();
     stream.seekg (0, ios::beg);
     P->inOut->logMain << "file size: "<< size <<" bytes; state: good=" <<stream.good()\
             <<" eof="<<stream.eof()<<" fail="<<stream.fail()<<" bad="<<stream.bad()<<"\n"<<flush;
@@ -72,18 +72,18 @@ uint Genome::OpenStream(string name, ifstream & stream)
 
 
 void Genome::genomeLoad(){//allocate and load Genome
-    
+
     time_t rawtime;
     time ( &rawtime );
-    *(P->inOut->logStdOut) << timeMonthDayTime(rawtime) << " ..... Loading genome\n" <<flush;           
+    *(P->inOut->logStdOut) << timeMonthDayTime(rawtime) << " ..... loading genome\n" <<flush;
 
     uint *shmNG=NULL, *shmNSA=NULL;   //pointers to shm stored values , *shmSG, *shmSSA
     uint64 shmSize=0;//, shmStartG=0; shmStartSA=0;
-    
-    uint L=200,K=6;    
-    
+
+    uint L=200,K=6;
+
     Parameters *P1 = new Parameters;
-    
+
     ifstream parFile((P->genomeDir+("/genomeParameters.txt")).c_str());
     if (parFile.good()) {
         P->inOut->logMain << "Reading genome generation parameters:\n";
@@ -93,10 +93,10 @@ void Genome::genomeLoad(){//allocate and load Genome
     } else {
         ostringstream errOut;
         errOut << "EXITING because of FATAL ERROR: could not open genome file "<< P->genomeDir+("/genomeParameters.txt") << endl;
-        errOut << "SOLUTION: check that the path to genome files, specified in --genomeDir is correct and the files are present, and have user read permsissions\n" <<flush;     
+        errOut << "SOLUTION: check that the path to genome files, specified in --genomeDir is correct and the files are present, and have user read permsissions\n" <<flush;
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_FILES, *P);
-    };            
-    
+    };
+
     //check genome version
     if (P1->versionGenome.size()==0 || P1->versionGenome[0]==0) {//
         ostringstream errOut;
@@ -106,7 +106,7 @@ void Genome::genomeLoad(){//allocate and load Genome
     } else if (P->sjdbFileChrStartEnd.at(0)=="-" && P1->versionGenome.at(0) >= P->versionGenome.at(0)) {//
         P->inOut->logMain << "Genome version is compatible with current STAR version\n";
     } else if (P->sjdbFileChrStartEnd.at(0)!="-" && P1->versionGenome.at(0) >= P->versionGenome.at(1)) {//
-        P->inOut->logMain << "Genome version is compatible with current STAR version\n";        
+        P->inOut->logMain << "Genome version is compatible with current STAR version\n";
     } else {
         ostringstream errOut;
         errOut << "EXITING because of FATAL ERROR: Genome version is INCOMPATIBLE with current STAR version\n";
@@ -124,37 +124,37 @@ void Genome::genomeLoad(){//allocate and load Genome
     {//file exists
         sjdbInfoExists=true;
     };
-    
-    if ( P->sjdbInsert.yes && sjdbInfoExists && P1->sjdbInsert.save=="") 
+
+    if ( P->sjdbInsert.yes && sjdbInfoExists && P1->sjdbInsert.save=="")
     {//if sjdbInsert, and genome had junctions, and genome is old - it should be re-generated with new STAR
         ostringstream errOut;
         errOut << "EXITING because of FATAL ERROR: old Genome is INCOMPATIBLE with on the fly junction insertion\n";
         errOut << "SOLUTION: please re-generate genome from scratch with the latest version of STAR\n";
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_FILES, *P);
     };
-    
+
     //record required genome parameters in P
     P->genomeSAindexNbases=P1->genomeSAindexNbases;
     P->genomeChrBinNbits=P1->genomeChrBinNbits;
     P->genomeChrBinNbases=1LLU<<P->genomeChrBinNbits;
     P->genomeSAsparseD=P1->genomeSAsparseD;
-    if (P->parArray.at(P->sjdbOverhang_par)->inputLevel==0 && P1->sjdbOverhang>0) 
+    if (P->parArray.at(P->sjdbOverhang_par)->inputLevel==0 && P1->sjdbOverhang>0)
     {//if --sjdbOverhang was not defined by user and it was defined >0 at the genome generation step, then use sjdbOverhang from the genome generation step
         P->sjdbOverhang=P1->sjdbOverhang;
         P->inOut->logMain << "--sjdbOverhang = " << P->sjdbOverhang << " taken from the generated genome\n";
-    } else if (sjdbInfoExists && P->parArray.at(P->sjdbOverhang_par)->inputLevel>0 && P->sjdbOverhang!=P1->sjdbOverhang) 
+    } else if (sjdbInfoExists && P->parArray.at(P->sjdbOverhang_par)->inputLevel>0 && P->sjdbOverhang!=P1->sjdbOverhang)
     {//if sjdbOverhang was defined at the genome generation step,the mapping step value has to agree with it
         ostringstream errOut;
         errOut << "EXITING because of fatal PARAMETERS error: present --sjdbOverhang="<<P->sjdbOverhang << " is not equal to the value at the genome generation step ="<< P1->sjdbOverhang << "\n";
-        errOut << "SOLUTION: \n" <<flush;     
+        errOut << "SOLUTION: \n" <<flush;
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_FILES, *P);
     };
-    
+
     P->sjdbLength = P->sjdbOverhang==0 ? 0 : P->sjdbOverhang*2+1;
 
 
-    P->inOut->logMain << "Started loading the genome: " << asctime (localtime ( &rawtime ))<<"\n"<<flush;    
-  
+    P->inOut->logMain << "Started loading the genome: " << asctime (localtime ( &rawtime ))<<"\n"<<flush;
+
     ifstream GenomeIn, SAin, SAiIn;
 
     P->nGenome = OpenStream("Genome",GenomeIn);
@@ -164,10 +164,10 @@ void Genome::genomeLoad(){//allocate and load Genome
     uint SAiInBytes=0;
     SAiInBytes += fstreamReadBig(SAiIn,(char*) &P->genomeSAindexNbases, sizeof(P->genomeSAindexNbases));
     P->genomeSAindexStart = new uint[P->genomeSAindexNbases+1];
-    SAiInBytes += fstreamReadBig(SAiIn,(char*) P->genomeSAindexStart, sizeof(P->genomeSAindexStart[0])*(P->genomeSAindexNbases+1));  
+    SAiInBytes += fstreamReadBig(SAiIn,(char*) P->genomeSAindexStart, sizeof(P->genomeSAindexStart[0])*(P->genomeSAindexNbases+1));
     P->nSAi=P->genomeSAindexStart[P->genomeSAindexNbases];
     P->inOut->logMain << "Read from SAindex: genomeSAindexNbases=" << P->genomeSAindexNbases <<"  nSAi="<< P->nSAi <<endl;
-    
+
 
     /////////////////////////////////// at this point all array sizes should be known: calculate packed array lengths
     P->GstrandBit = (uint) floor(log(P->nGenome)/log(2))+1;
@@ -175,23 +175,23 @@ void Genome::genomeLoad(){//allocate and load Genome
 
     P->GstrandMask = ~(1LLU<<P->GstrandBit);
     P->nSA=(P->nSAbyte*8)/(P->GstrandBit+1);
-    SA.defineBits(P->GstrandBit+1,P->nSA);  
-    
+    SA.defineBits(P->GstrandBit+1,P->nSA);
+
     P->SAiMarkNbit=P->GstrandBit+1;
     P->SAiMarkAbsentBit=P->GstrandBit+2;
-    
+
     P->SAiMarkNmaskC=1LLU << P->SAiMarkNbit;
     P->SAiMarkNmask=~P->SAiMarkNmaskC;
     P->SAiMarkAbsentMaskC=1LLU << P->SAiMarkAbsentBit;
     P->SAiMarkAbsentMask=~P->SAiMarkAbsentMaskC;
-    
-    SAi.defineBits(P->GstrandBit+3,P->nSAi); 
 
-    P->inOut->logMain << "nGenome=" << P->nGenome << ";  nSAbyte=" << P->nSAbyte <<endl<< flush;       
-    P->inOut->logMain <<"GstrandBit="<<int(P->GstrandBit)<<"   SA number of indices="<<P->nSA<<endl<<flush;      
-    
+    SAi.defineBits(P->GstrandBit+3,P->nSAi);
+
+    P->inOut->logMain << "nGenome=" << P->nGenome << ";  nSAbyte=" << P->nSAbyte <<endl<< flush;
+    P->inOut->logMain <<"GstrandBit="<<int(P->GstrandBit)<<"   SA number of indices="<<P->nSA<<endl<<flush;
+
     shmSize=SA.lengthByte + P->nGenome+L+L+SHM_startG+8;
-    shmSize+= SAi.lengthByte;                
+    shmSize+= SAi.lengthByte;
     if (P->annotScoreScale>0) shmSize+=P->nGenome;
 
 
@@ -208,7 +208,7 @@ void Genome::genomeLoad(){//allocate and load Genome
 
             if (!sharedMemory->NeedsAllocation())
             P->inOut->logMain <<"Found genome in shared memory\n"<<flush;
-    
+
     if (P->genomeLoad=="Remove") {//kill the genome and exit
                 if (sharedMemory->NeedsAllocation()) {//did not find genome in shared memory, nothing to kill
             ostringstream errOut;
@@ -216,11 +216,11 @@ void Genome::genomeLoad(){//allocate and load Genome
             exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_FILES, *P);
         } else {
                     sharedMemory->Clean();
-            P->inOut->logMain <<"DONE: removed the genome from shared memory\n"<<flush;            
+            P->inOut->logMain <<"DONE: removed the genome from shared memory\n"<<flush;
                     return;
         };
             }
-     
+
             if (sharedMemory->NeedsAllocation()){
                 P->inOut->logMain <<"Allocating shared memory for genome\n"<<flush;
                 sharedMemory->Allocate(shmSize);
@@ -230,27 +230,27 @@ void Genome::genomeLoad(){//allocate and load Genome
         {
             HandleSharedMemoryException(exc, shmSize);
         }
-    
+
         shmStart = (char*) sharedMemory->GetMapped();
         shmNG= (uint*) (shmStart+SHM_sizeG);
-        shmNSA= (uint*) (shmStart+SHM_sizeSA);       
-   
+        shmNSA= (uint*) (shmStart+SHM_sizeSA);
+
         if (!sharedMemory->IsAllocator())
         {
             // genome is in shared memory or being loaded
             // wait for the process that will populate it
             // and record the sizes
-        
+
         uint iwait=0;
             while (*shmNG != P->nGenome) {
             iwait++;
             P->inOut->logMain <<"Another job is still loading the genome, sleeping for 1 min\n" <<flush;
-            sleep(60);                    
+            sleep(60);
             if (iwait==100) {
                 ostringstream errOut;
                 errOut << "EXITING because of FATAL ERROR: waited too long for the other job to finish loading the genome" << strerror(errno) << "\n" <<flush;
-                    errOut << "SOLUTION: remove the shared memory chunk by running STAR with --genomeLoad Remove, and restart STAR" <<flush;     
-                    exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_LOADING_WAITED_TOO_LONG, *P);                
+                    errOut << "SOLUTION: remove the shared memory chunk by running STAR with --genomeLoad Remove, and restart STAR" <<flush;
+                    exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_LOADING_WAITED_TOO_LONG, *P);
             };
         };
 
@@ -258,10 +258,10 @@ void Genome::genomeLoad(){//allocate and load Genome
             {
                 ostringstream errOut;
                 errOut << "EXITING because of FATAL ERROR: the SA file size did not match what we found in shared memory" << "\n" << flush;
-                errOut << "SOLUTION: remove the shared memory chunk by running STAR with --genomeLoad Remove, and restart STAR" << flush;     
-                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INCONSISTENT_DATA, *P);  
+                errOut << "SOLUTION: remove the shared memory chunk by running STAR with --genomeLoad Remove, and restart STAR" << flush;
+                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INCONSISTENT_DATA, *P);
             }
-        
+
             P->inOut->logMain << "Using shared memory for genome. key=0x" <<hex<<shmKey<<dec<< ";   shmid="<< sharedMemory->GetId() <<endl<<flush;
         }
 
@@ -271,20 +271,20 @@ void Genome::genomeLoad(){//allocate and load Genome
 
         SAi.pointArray(shmNext);
         shmNext += SAi.lengthByte;
-    
+
 //     if (twoPass.pass1readsN==0) {//not 2-pass
 //         shmStartG=SHM_startSHM;
 //         shmStartSA=0;
 //     } else {//2-pass
 //         ostringstream errOut;
 //         errOut << "EXITING because of FATAL ERROR: 2-pass procedure cannot be used with genome already loaded im memory'  "\n" ;
-//         errOut << "SOLUTION: check shared memory settigns as explained in STAR manual, OR run STAR with --genomeLoad NoSharedMemory to avoid using shared memory\n" <<flush;     
+//         errOut << "SOLUTION: check shared memory settigns as explained in STAR manual, OR run STAR with --genomeLoad NoSharedMemory to avoid using shared memory\n" <<flush;
 //         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_SHM, *P);
 //     };
      if (P->annotScoreScale>0) {//optional allocation
             sigG = shmNext;
             shmNext += P->nGenome;
-        }    
+        }
     }
     else if (P->genomeLoad=="NoSharedMemory") // simply allocate memory, do not use shared memory
     {
@@ -293,16 +293,16 @@ void Genome::genomeLoad(){//allocate and load Genome
         {//will insert sequences in the genome, now estimate the extra size
            uint oldlen=P->chrStart.back();//record the old length
            P->genomeInsertChrIndFirst=P->nChrReal;
-           P->genomeInsertL=genomeScanFastaFiles(P,G,false)-oldlen; 
+           P->genomeInsertL=genomeScanFastaFiles(P,G,false)-oldlen;
         };
-        
+
         try {
-            
+
             if (P->sjdbInsert.pass1 || P->sjdbInsert.pass2)
             {//reserve extra memory for insertion at the 1st and/or 2nd step
                 nGenomeInsert=P->nGenome+P->genomeInsertL;
                 nSAinsert=P->nSA+2*P->genomeInsertL;
-                
+
                 nGenomePass1=nGenomeInsert;
                 nSApass1=nSAinsert;
                 if (P->sjdbInsert.pass1)
@@ -310,61 +310,61 @@ void Genome::genomeLoad(){//allocate and load Genome
                     nGenomePass1+=P->limitSjdbInsertNsj*P->sjdbLength;
                     nSApass1+=2*P->limitSjdbInsertNsj*P->sjdbLength;
                 };
-                
+
                 nGenomePass2=nGenomePass1;
                 nSApass2=nSApass1;
                 if (P->sjdbInsert.pass2)
                 {
                     nGenomePass2+=P->limitSjdbInsertNsj*P->sjdbLength;
-                    nSApass2+=2*P->limitSjdbInsertNsj*P->sjdbLength;                    
-                };                
-                
-                G1=new char[nGenomePass2+L+L];        
-                
+                    nSApass2+=2*P->limitSjdbInsertNsj*P->sjdbLength;
+                };
+
+                G1=new char[nGenomePass2+L+L];
+
                 SApass2.defineBits(P->GstrandBit+1,nSApass2);
                 SApass2.allocateArray();
-                
+
                 SApass1.defineBits(P->GstrandBit+1,nSApass1);
                 SApass1.pointArray(SApass2.charArray+SApass2.lengthByte-SApass1.lengthByte);
-                
+
                 SAinsert.defineBits(P->GstrandBit+1,nSAinsert);
                 SAinsert.pointArray(SApass1.charArray+SApass1.lengthByte-SAinsert.lengthByte);
-                
+
                 SA.pointArray(SAinsert.charArray+SAinsert.lengthByte-SA.lengthByte);
-            } else 
+            } else
             {//no sjdb insertions
                 if (P->genomeInsertL==0)
                 {// no sequence insertion, simple allocation
-                    G1=new char[P->nGenome+L+L];        
+                    G1=new char[P->nGenome+L+L];
                     SA.allocateArray();
-                } else 
+                } else
                 {
-                    G1=new char[P->nGenome+L+L+P->genomeInsertL];        
+                    G1=new char[P->nGenome+L+L+P->genomeInsertL];
                     SAinsert.defineBits(P->GstrandBit+1,P->nSA+2*P->genomeInsertL);//TODO: re-define GstrandBit if necessary
                     SAinsert.allocateArray();
                     SA.pointArray(SAinsert.charArray+SAinsert.lengthByte-SA.lengthByte);
                 };
-            };            
+            };
             SAi.allocateArray();
-            P->inOut->logMain <<"Shared memory is not used for genomes. Allocated a private copy of the genome.\n"<<flush;                
+            P->inOut->logMain <<"Shared memory is not used for genomes. Allocated a private copy of the genome.\n"<<flush;
         } catch (exception & exc) {
-            ostringstream errOut;           
+            ostringstream errOut;
             errOut <<"EXITING: fatal error trying to allocate genome arrays, exception thrown: "<<exc.what()<<endl;
             errOut <<"Possible cause 1: not enough RAM. Check if you have enough RAM " << P->nGenome+L+L+SA.lengthByte+SAi.lengthByte+2000000000 << " bytes\n";
             errOut <<"Possible cause 2: not enough virtual memory allowed with ulimit. SOLUTION: run ulimit -v " <<  P->nGenome+L+L+SA.lengthByte+SAi.lengthByte+2000000000<<endl <<flush;
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_MEMORY_ALLOCATION, *P);            
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_MEMORY_ALLOCATION, *P);
         };
-        
+
     }
 
-        
+
 //     if (twopass1readsN==0) {//not 2-pass
 //         shmStartG=SHM_startSHM;
 //         shmStartSA=0;
 //     } else {//2-pass
 //         ostringstream errOut;
 //         errOut << "EXITING because of FATAL ERROR: 2-pass procedure cannot be used with genome already loaded im memory'  "\n" ;
-//         errOut << "SOLUTION: check shared memory settings as explained in STAR manual, OR run STAR with --genomeLoad NoSharedMemory to avoid using shared memory\n" <<flush;     
+//         errOut << "SOLUTION: check shared memory settings as explained in STAR manual, OR run STAR with --genomeLoad NoSharedMemory to avoid using shared memory\n" <<flush;
 //         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_SHM, *P);
 //     };
 
@@ -376,71 +376,71 @@ void Genome::genomeLoad(){//allocate and load Genome
     if (P->genomeLoad=="NoSharedMemory" || isAllocatorProcess) {//load genome and SAs from files
         //load genome
         P->inOut->logMain <<"Genome file size: "<<P->nGenome <<" bytes; state: good=" <<GenomeIn.good()\
-                <<" eof="<<GenomeIn.eof()<<" fail="<<GenomeIn.fail()<<" bad="<<GenomeIn.bad()<<"\n"<<flush;        
-        P->inOut->logMain <<"Loading Genome ... " << flush;        
-        uint genomeReadBytesN=fstreamReadBig(GenomeIn,G,P->nGenome);    
+                <<" eof="<<GenomeIn.eof()<<" fail="<<GenomeIn.fail()<<" bad="<<GenomeIn.bad()<<"\n"<<flush;
+        P->inOut->logMain <<"Loading Genome ... " << flush;
+        uint genomeReadBytesN=fstreamReadBig(GenomeIn,G,P->nGenome);
         P->inOut->logMain <<"done! state: good=" <<GenomeIn.good()\
-                <<" eof="<<GenomeIn.eof()<<" fail="<<GenomeIn.fail()<<" bad="<<GenomeIn.bad()<<"; loaded "<<genomeReadBytesN<<" bytes\n" << flush;            
+                <<" eof="<<GenomeIn.eof()<<" fail="<<GenomeIn.fail()<<" bad="<<GenomeIn.bad()<<"; loaded "<<genomeReadBytesN<<" bytes\n" << flush;
         GenomeIn.close();
-        
+
         for (uint ii=0;ii<L;ii++) {// attach a tail with the largest symbol
             G1[ii]=K-1;
-            G[P->nGenome+ii]=K-1;        
-        };    
-      
+            G[P->nGenome+ii]=K-1;
+        };
+
         //load SAs
         P->inOut->logMain <<"SA file size: "<<SA.lengthByte <<" bytes; state: good=" <<SAin.good()\
-                <<" eof="<<SAin.eof()<<" fail="<<SAin.fail()<<" bad="<<SAin.bad()<<"\n"<<flush;        
-        P->inOut->logMain <<"Loading SA ... " << flush;               
+                <<" eof="<<SAin.eof()<<" fail="<<SAin.fail()<<" bad="<<SAin.bad()<<"\n"<<flush;
+        P->inOut->logMain <<"Loading SA ... " << flush;
         genomeReadBytesN=fstreamReadBig(SAin,SA.charArray, SA.lengthByte);
         P->inOut->logMain <<"done! state: good=" <<SAin.good()\
-                <<" eof="<<SAin.eof()<<" fail="<<SAin.fail()<<" bad="<<SAin.bad()<<"; loaded "<<genomeReadBytesN<<" bytes\n" << flush;            
+                <<" eof="<<SAin.eof()<<" fail="<<SAin.fail()<<" bad="<<SAin.bad()<<"; loaded "<<genomeReadBytesN<<" bytes\n" << flush;
         SAin.close();
-        
-        P->inOut->logMain <<"Loading SAindex ... " << flush;             
+
+        P->inOut->logMain <<"Loading SAindex ... " << flush;
         SAiInBytes +=fstreamReadBig(SAiIn,SAi.charArray, SAi.lengthByte);
-        P->inOut->logMain <<"done: "<<SAiInBytes<<" bytes\n" << flush;       
+        P->inOut->logMain <<"done: "<<SAiInBytes<<" bytes\n" << flush;
     };
-    
-    SAiIn.close();            
 
-    if ((P->genomeLoad=="LoadAndKeep" || 
-         P->genomeLoad=="LoadAndRemove" || 
-         P->genomeLoad=="LoadAndExit") && isAllocatorProcess ) 
+    SAiIn.close();
+
+    if ((P->genomeLoad=="LoadAndKeep" ||
+         P->genomeLoad=="LoadAndRemove" ||
+         P->genomeLoad=="LoadAndExit") && isAllocatorProcess )
     {
         //record sizes. This marks the end of genome loading
         *shmNG=P->nGenome;
         *shmNSA=P->nSAbyte;
     };
-    
+
     time ( &rawtime );
-    P->inOut->logMain << "Finished loading the genome: " << asctime (localtime ( &rawtime )) <<"\n"<<flush;    
-      
+    P->inOut->logMain << "Finished loading the genome: " << asctime (localtime ( &rawtime )) <<"\n"<<flush;
+
     #ifdef COMPILE_FOR_MAC
     {
         uint sum1=0;
         for (uint ii=0;ii<P->nGenome; ii++) sum1 +=  (uint) (unsigned char) G[ii];
-        P->inOut->logMain << "Sum of all Genome bytes: " <<sum1 <<"\n"<<flush;  
-        sum1=0;        
+        P->inOut->logMain << "Sum of all Genome bytes: " <<sum1 <<"\n"<<flush;
+        sum1=0;
         for (uint ii=0;ii<SA.lengthByte; ii++) sum1 +=  (uint) (unsigned char) SA.charArray[ii];
         P->inOut->logMain << "Sum of all SA bytes: " <<sum1 <<"\n"<<flush;
-        sum1=0;        
+        sum1=0;
         for (uint ii=0;ii<SAi.lengthByte; ii++) sum1 +=  (uint) (unsigned char) SAi.charArray[ii];
         P->inOut->logMain << "Sum of all SAi bytes: " <<sum1 <<"\n"<<flush;
     };
     #endif
-    
+
     if (P->genomeLoad=="LoadAndExit") {
 	uint shmSum=0;
 	for (uint ii=0;ii<shmSize;ii++) shmSum+=shmStart[ii];
         P->inOut->logMain << "genomeLoad=LoadAndExit: completed, the genome is loaded and kept in RAM, EXITING now.\n"<<flush;
         return;
     };
-    
+
     insertSequences();
 
     P->chrBinFill();
- 
+
     //splice junctions database
     if (P->nGenome==P->chrStart[P->nChrReal]) {//no sjdb
         P->sjdbN=0;
@@ -448,16 +448,16 @@ void Genome::genomeLoad(){//allocate and load Genome
     } else {//there are sjdb chromosomes
         ifstream sjdbInfo((P->genomeDir+"/sjdbInfo.txt").c_str());
         if (sjdbInfo.fail()) {
-            ostringstream errOut;                            
+            ostringstream errOut;
             errOut << "EXITING because of FATAL error, could not open file " << (P->genomeDir+"/sjdbInfo.txt") <<"\n";
-            errOut << "SOLUTION: check that the path to genome files, specified in --genomeDir is correct and the files are present, and have user read permsissions\n" <<flush;     
+            errOut << "SOLUTION: check that the path to genome files, specified in --genomeDir is correct and the files are present, and have user read permsissions\n" <<flush;
             exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         };
-    
-        
+
+
         sjdbInfo >> P->sjdbN >> P->sjdbOverhang;
-        P->inOut->logMain << "Processing splice junctions database sjdbN=" <<P->sjdbN<<",   sjdbOverhang=" <<P->sjdbOverhang <<" \n";    
-        
+        P->inOut->logMain << "Processing splice junctions database sjdbN=" <<P->sjdbN<<",   sjdbOverhang=" <<P->sjdbOverhang <<" \n";
+
         P->sjChrStart=P->nChrReal;
         P->sjGstart=P->chrStart[P->sjChrStart];
 
@@ -466,13 +466,13 @@ void Genome::genomeLoad(){//allocate and load Genome
         P->sjAstart=new uint [P->sjdbN];
         P->sjdbStart=new uint [P->sjdbN];
         P->sjdbEnd=new uint [P->sjdbN];
-        
+
         P->sjdbMotif=new uint8 [P->sjdbN];
         P->sjdbShiftLeft=new uint8 [P->sjdbN];
         P->sjdbShiftRight=new uint8 [P->sjdbN];
         P->sjdbStrand=new uint8 [P->sjdbN];
 
-        for (uint ii=0;ii<P->sjdbN;ii++) {//get the info about junctions from sjdbInfo.txt       
+        for (uint ii=0;ii<P->sjdbN;ii++) {//get the info about junctions from sjdbInfo.txt
             {
                 uint16 d1,d2,d3,d4;
                 sjdbInfo >> P->sjdbStart[ii] >> P->sjdbEnd[ii] >> d1 >> d2 >> d3 >> d4;
@@ -481,15 +481,15 @@ void Genome::genomeLoad(){//allocate and load Genome
                 P->sjdbShiftRight[ii] = (uint8) d3;
                 P->sjdbStrand[ii] = (uint8) d4;
             };
-            P->sjDstart[ii]   = P->sjdbStart[ii]  - P->sjdbOverhang; 
-            P->sjAstart[ii]   = P->sjdbEnd[ii] + 1;     
+            P->sjDstart[ii]   = P->sjdbStart[ii]  - P->sjdbOverhang;
+            P->sjAstart[ii]   = P->sjdbEnd[ii] + 1;
             if (P->sjdbMotif[ii]==0) {//shinon-canonical junctions back to their true coordinates
                 P->sjDstart[ii] += P->sjdbShiftLeft[ii];
                 P->sjAstart[ii] += P->sjdbShiftLeft[ii];
             };
         };
-    };     
-    
+    };
+
     //check and redefine some parameters
     //max intron size
     if (P->alignIntronMax==0 && P->alignMatesGapMax==0) {
@@ -500,14 +500,14 @@ void Genome::genomeLoad(){//allocate and load Genome
         P->winBinNbits=max( (uint) floor(log2(P->nGenome/40000)+0.5), (uint) floor(log2(max(max(4LLU,P->alignIntronMax),P->alignMatesGapMax)/4)+0.5) );
         P->inOut->logMain << "To accomodate alignIntronMax="<<P->alignIntronMax<<" redefined winBinNbits="<< P->winBinNbits <<endl;
     };
-    
+
     if (P->winBinNbits > P->genomeChrBinNbits) {
        P->inOut->logMain << "winBinNbits=" <<P->winBinNbits <<" > " << "genomeChrBinNbits=" << P->genomeChrBinNbits << "   redefining:\n";
        P->winBinNbits=P->genomeChrBinNbits;
        P->inOut->logMain << "winBinNbits=" <<P->winBinNbits <<endl;
-    };    
-    
-    
+    };
+
+
     if (P->alignIntronMax==0 && P->alignMatesGapMax==0) {
     } else {
         //redefine winFlankNbins,winAnchorDistNbins
@@ -516,7 +516,7 @@ void Genome::genomeLoad(){//allocate and load Genome
         P->inOut->logMain << "To accomodate alignIntronMax="<<P->alignIntronMax<<" and alignMatesGapMax="<<P->alignMatesGapMax<<\
                 ", redefined winFlankNbins="<<P->winFlankNbins<<" and winAnchorDistNbins="<<P->winAnchorDistNbins<<endl;
     };
-    
+
     P->winBinChrNbits=P->genomeChrBinNbits-P->winBinNbits;
     P->winBinN = P->nGenome/(1LLU << P->winBinNbits)+1;//this may be chenaged later
 };
@@ -530,9 +530,9 @@ void Genome::HandleSharedMemoryException(const SharedMemoryException & exc, uint
     int exitCode = EXIT_CODE_SHM;
     switch (exc.GetErrorCode())
     {
-        case EOPENFAILED:            
+        case EOPENFAILED:
             errOut << "EXITING because of FATAL ERROR: problems with shared memory: error from shmget() or shm_open()." << endl << flush;
-            errOut << "SOLUTION: check shared memory settings as explained in STAR manual, OR run STAR with --genomeLoad NoSharedMemory to avoid using shared memory" << endl << flush;     
+            errOut << "SOLUTION: check shared memory settings as explained in STAR manual, OR run STAR with --genomeLoad NoSharedMemory to avoid using shared memory" << endl << flush;
             break;
         case EEXISTS:
             errOut << "EXITING: fatal error from shmget() trying to allocate shared memory piece." << endl;
@@ -548,25 +548,25 @@ void Genome::HandleSharedMemoryException(const SharedMemoryException & exc, uint
             break;
         case EMAPFAILED:
             errOut << "EXITING because of FATAL ERROR: problems with shared memory: error from shmat() while trying to get address of the shared memory piece." << endl << flush;
-            errOut << "SOLUTION: check shared memory settings as explained in STAR manual, OR run STAR with --genomeLoad NoSharedMemory to avoid using shared memory" << endl << flush;     
+            errOut << "SOLUTION: check shared memory settings as explained in STAR manual, OR run STAR with --genomeLoad NoSharedMemory to avoid using shared memory" << endl << flush;
             break;
         case ECLOSE:
-            errOut << "EXITING because of FATAL ERROR: could not close the shared memory object." << endl << flush;     
+            errOut << "EXITING because of FATAL ERROR: could not close the shared memory object." << endl << flush;
             break;
         case EUNLINK:
             #ifdef POSIX_SHARED_MEM
             errOut << "EXITING because of FATAL ERROR:  could not delete the shared object." << endl << flush;
             #else
             errOut << "EXITING because of FATAL ERROR: problems with shared memory: error from shmctl() while trying to remove shared memory piece." << endl << flush;
-            errOut << "SOLUTION: check shared memory settings as explained in STAR manual, OR run STAR with --genomeLoad NoSharedMemory to avoid using shared memory" << endl << flush;     
+            errOut << "SOLUTION: check shared memory settings as explained in STAR manual, OR run STAR with --genomeLoad NoSharedMemory to avoid using shared memory" << endl << flush;
             #endif
             break;
         default:
             errOut << "EXITING because of FATAL ERROR: There was an issue with the shared memory allocation. Try running STAR with --genomeLoad NoSharedMemory to avoid using shared memory.";
             break;
-    }      
+    }
 
-    try 
+    try
     {
         if (sharedMemory != NULL)
             sharedMemory->Clean();
diff --git a/source/Genome.h b/source/Genome.h
index 08f178d..c564be6 100644
--- a/source/Genome.h
+++ b/source/Genome.h
@@ -11,13 +11,13 @@ class Genome {
         char *G, *sigG;
         PackedArray SA,SAinsert,SApass1,SApass2;
         PackedArray SAi;
-        
-        uint nGenomeInsert, nGenomePass1, nGenomePass2, nSAinsert, nSApass1, nSApass2; 
+
+        uint nGenomeInsert, nGenomePass1, nGenomePass2, nSAinsert, nSApass1, nSApass2;
 
         Genome (Parameters* Pin );
         Genome () {};//empty constructor
         ~Genome();
-        
+
         void freeMemory();
         void genomeLoad();
 
@@ -26,7 +26,7 @@ class Genome {
 
     private:
     Parameters* P;
-    key_t shmKey;  
+    key_t shmKey;
     char *shmStart;
     char *G1; //pointer -200 of G
     SharedMemory * sharedMemory;
diff --git a/source/Genome_insertSequences.cpp b/source/Genome_insertSequences.cpp
index 5edf127..4164c25 100644
--- a/source/Genome_insertSequences.cpp
+++ b/source/Genome_insertSequences.cpp
@@ -1,4 +1,4 @@
-/* 
+/*
  * inserts sequences into the SA and SAi indices
  */
 #include "Genome.h"
@@ -12,17 +12,17 @@ if (P->genomeFastaFiles.at(0)!="-")
 {
     time_t rawtime;
     time ( &rawtime );
-    P->inOut->logMain  << timeMonthDayTime(rawtime) << " ..... Inserting extra sequences into genome indexes" <<endl;       
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << " ..... inserting extra sequences into genome indexes" <<endl;
     //move the junctions to free up space for seqs
     // chrStart/Name/Length nChrReal include the extra sequences
     // nGenome is the old, small genome size
     uint sjdblen=P->nGenome-(P->chrStart.back()-P->genomeInsertL);//length of sjdb sequences
     memmove(G+P->chrStart.back(),G+P->chrStart.back()-P->genomeInsertL,sjdblen);
     memset(G+P->chrStart.back()-P->genomeInsertL, GENOME_spacingChar, P->genomeInsertL);//fill empty space with spacing characters
-        
+
     genomeScanFastaFiles(P, G+P->chrStart.back()-P->genomeInsertL, true); //read the seqs from file(s) into the free space
     uint64 nGenomeOld=P->nGenome;
-    P->nGenome=P->chrStart.back()+sjdblen; 
+    P->nGenome=P->chrStart.back()+sjdblen;
     //insert new sequences into the SA
     insertSeqSA(SA, SAinsert, SAi, G, G+P->chrStart.back()-P->genomeInsertL, nGenomeOld-sjdblen, P->genomeInsertL, sjdblen, P);
 
diff --git a/source/InOutStreams.cpp b/source/InOutStreams.cpp
index ef53bfa..f280de9 100644
--- a/source/InOutStreams.cpp
+++ b/source/InOutStreams.cpp
@@ -9,30 +9,30 @@ InOutStreams::InOutStreams() {
 };
 
 InOutStreams::~InOutStreams() {
-    
+
     if (logStdOut!=NULL) logStdOut->flush();
     if (outSAM!=NULL) outSAM->flush();
-    
+
     logStdOutFile.flush();
     outSAMfile.flush();
-    
+
     outChimSAM.flush();
-    outChimJunction.flush();    
+    outChimJunction.flush();
     logProgress.flush();
     logMain.flush();
     logFinal.flush();
     outLocalChains.flush();
-    
+
     logStdOutFile.close();
     outSAMfile.close();
     outChimSAM.close();
-    outChimJunction.close();    
+    outChimJunction.close();
     logProgress.close();
     logMain.close();
-    logFinal.close();    
+    logFinal.close();
     outLocalChains.close();
-    
-    
+
+
     for (int ii=0;ii<2;ii++) {
         if (outUnmappedReadsStream[ii].is_open()) {
             outUnmappedReadsStream[ii].flush();
@@ -40,4 +40,4 @@ InOutStreams::~InOutStreams() {
         }
     };
 };
-   
+
diff --git a/source/InOutStreams.h b/source/InOutStreams.h
index 8013788..441af7f 100644
--- a/source/InOutStreams.h
+++ b/source/InOutStreams.h
@@ -9,10 +9,10 @@ class InOutStreams {
     ostream *logStdOut, *outSAM;
     ofstream logStdOutFile, outSAMfile;
     BGZF *outBAMfileUnsorted, *outBAMfileCoord, *outQuantBAMfile;
-    
+
     ofstream outChimSAM, outChimJunction, logMain, logProgress, logFinal, outUnmappedReadsStream[MAX_N_MATES];
     ifstream readIn[MAX_N_MATES];
-    
+
     //compilation-optional streams
     ofstream outLocalChains;
 
diff --git a/source/IncludeDefine.h b/source/IncludeDefine.h
index 6ce3e21..47a8d53 100644
--- a/source/IncludeDefine.h
+++ b/source/IncludeDefine.h
@@ -9,7 +9,7 @@
 #include <fstream>
 #include <sstream>
 #include <time.h>
-#include <ctime>        
+#include <ctime>
 #include <iomanip>
 #include <vector>
 #include <sys/types.h>
@@ -38,8 +38,12 @@ using namespace std;
   #define SHM_NORESERVE 0
 #endif
 
+#if defined(__mips__) && !defined(SHM_NORESERVE)
+#define SHM_NORESERVE 010000
+#endif
+
 typedef int8_t int8;
-typedef uint8_t uint8; 
+typedef uint8_t uint8;
 
 #define uint unsigned long long
 #define sint signed long long
@@ -100,7 +104,7 @@ typedef uint8_t uint8;
     #define MAX_N_EXONS 1000
 #else
     #define MAX_N_EXONS 20
-#endif     
+#endif
 
 //input reads
 #define MAX_N_MATES 2
@@ -108,7 +112,7 @@ typedef uint8_t uint8;
 #if defined COMPILE_FOR_LONG_READS
     #define DEF_readSeqLengthMax 500000
 #else
-    #define DEF_readSeqLengthMax 500
+    #define DEF_readSeqLengthMax 650
 #endif
 
 #if (DEF_readNameLengthMax > DEF_readSeqLengthMax)
@@ -221,5 +225,5 @@ typedef uint uiWA[WA_SIZE];
 #endif
 
 // #define DEBUG_NreadStart 500000
-        
+
 #endif
diff --git a/source/Makefile b/source/Makefile
index 9ac8a77..435000b 100644
--- a/source/Makefile
+++ b/source/Makefile
@@ -41,7 +41,7 @@ OBJECTS = SharedMemory.o PackedArray.o SuffixArrayFuns.o STAR.o Parameters.o InO
 	ReadAlign_stitchWindowSeeds.o ReadAlign_chimericDetection.o \
         stitchWindowAligns.o extendAlign.o stitchAlignToTranscript.o alignSmithWaterman.o \
         genomeGenerate.o genomeParametersWrite.o genomeScanFastaFiles.o genomeSAindex.o \
-        Genome_insertSequences.o insertSeqSA.o funCompareUintAndSuffixes.o \
+        Genome_insertSequences.o insertSeqSA.o funCompareUintAndSuffixes.o sortSuffixesBucket.o funCompareUintAndSuffixesMemcmp.o \
 	TimeFunctions.o ErrorWarning.o loadGTF.o streamFuns.o stringSubstituteAll.o \
         Transcriptome.o Transcriptome_quantAlign.o ReadAlign_quantTranscriptome.o Quantifications.o Transcriptome_geneCountsAddAlign.o \
         sjdbLoadFromFiles.o sjdbLoadFromStream.o sjdbPrepare.o sjdbBuildIndex.o sjdbInsertJunctions.o mapThreadsSpawn.o \
diff --git a/source/OutSJ.cpp b/source/OutSJ.cpp
index 121f439..71f67b3 100644
--- a/source/OutSJ.cpp
+++ b/source/OutSJ.cpp
@@ -13,7 +13,7 @@ OutSJ::OutSJ (uint nSJmax, Parameters *inP) {//do I need P?
 int compareSJ(const void* i1, const void* i2) {//compare SJs from the data structure
     uint s1=*( (uint*)i1 );
     uint s2=*( (uint*)i2 );
-    
+
     if (s1>s2) {
         return 1;
     } else if (s1<s2) {
@@ -82,14 +82,14 @@ void Junction::outputStream(ostream &outStream, Parameters* P) {
 void Junction::collapseOneSJ(char* isj1P, char* isjP, Parameters* P) {//collapse isj junction into isj1: increase counts in isj1. choose max overhangs, motif, annot
     *(uint32*)(isj1P+countUniqueP)   += *(uint32*)(isjP+countUniqueP);
     *(uint32*)(isj1P+countMultipleP) += *(uint32*)(isjP+countMultipleP);
-    
+
     if (*(uint16*)(isj1P+overhangLeftP) < *(uint16*)(isjP+overhangLeftP) ) {
         *(uint16*)(isj1P+overhangLeftP) = *(uint16*)(isjP+overhangLeftP) ;
     };
     if (*(uint16*)(isj1P+overhangRightP) < *(uint16*)(isjP+overhangRightP) ) {
         *(uint16*)(isj1P+overhangRightP) = *(uint16*)(isjP+overhangRightP) ;
-    };  
-    
+    };
+
     if (*(isj1P+motifP) != *(isjP+motifP) ) {
             stringstream errOut;
             errOut <<"EXITING becaues of BUG: different motifs for the same junction while collapsing junctions\n" \
@@ -97,14 +97,14 @@ void Junction::collapseOneSJ(char* isj1P, char* isjP, Parameters* P) {//collapse
                    <<" "<<int(*(char*)(isj1P+annotP)) <<" "<<int(*(char*)(isjP+annotP))<<"\n";
             exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);\
 //         *(isj1P+motifP) = *(isjP+motifP) ;
-    };      
+    };
     if (*(isj1P+annotP) < *(isjP+annotP) ) {
             stringstream errOut;
             errOut <<"EXITING becaues of BUG: different annotation status for the same junction while collapsing junctions:"\
                    <<*(uint*)(isj1P+startP) <<" "<<*(uint32*)(isj1P+gapP) <<" "<<int(*(char*)(isj1P+annotP)) <<" "<<int(*(char*)(isjP+annotP))<<"\n";
             exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);\
-        
+
 //         *(isj1P+annotP) = *(isjP+annotP) ;
-    };      
-    
+    };
+
 }
diff --git a/source/OutSJ.h b/source/OutSJ.h
index e05f598..aa89899 100644
--- a/source/OutSJ.h
+++ b/source/OutSJ.h
@@ -9,12 +9,12 @@ public:
     const static uint gapP=startP+sizeof(uint);
     const static uint strandP=gapP+sizeof(uint32);
     const static uint motifP=strandP+sizeof(char);
-    const static uint annotP=motifP+sizeof(char);     
-    const static uint countUniqueP=annotP+sizeof(char);     
-    const static uint countMultipleP=countUniqueP+sizeof(uint32);     
-    const static uint overhangLeftP=countMultipleP+sizeof(uint32);     
-    const static uint overhangRightP=overhangLeftP+sizeof(uint16);     
-    
+    const static uint annotP=motifP+sizeof(char);
+    const static uint countUniqueP=annotP+sizeof(char);
+    const static uint countMultipleP=countUniqueP+sizeof(uint32);
+    const static uint overhangLeftP=countMultipleP+sizeof(uint32);
+    const static uint overhangRightP=overhangLeftP+sizeof(uint16);
+
     uint *start;
     uint32 *gap;
     char *strand, *motif, *annot;
@@ -22,7 +22,7 @@ public:
     uint16 *overhangLeft, *overhangRight;
 
     const static uint dataSize=overhangRightP+sizeof(uint16);
-    
+
     void junctionPointer(char* sjPoint, uint isj);
     void outputStream(ostream &outStream, Parameters* P);
     void collapseOneSJ(char* isj1P, char* isjP, Parameters* P);
@@ -33,18 +33,18 @@ class OutSJ {
 public:
     //all junctions
     char* data; //sj array[Njunctions][dataSize]
-    
+
     uint N; //number of junctions stored
-    
+
     Junction oneSJ;
-    
+
     Parameters *P;
-       
+
     OutSJ(uint nSJmax, Parameters *P);
-        
+
     void collapseSJ();//collapse the junctions in data
 //     int compareSJ(void* i1, void* i2);
-    
+
 };
 
 int compareSJ(const void* i1, const void* i2); //external functions
diff --git a/source/PackedArray.h b/source/PackedArray.h
index af479aa..efaad5b 100644
--- a/source/PackedArray.h
+++ b/source/PackedArray.h
@@ -5,14 +5,14 @@
 
 class PackedArray {
     private:
-        uint bitRecMask, wordCompLength;    
+        uint bitRecMask, wordCompLength;
         bool arrayAllocated; //true if charArray was allocated
     public:
         uint wordLength, length, lengthByte;
         uint operator [] (uint ii);
         char* charArray;
-        
-    PackedArray();    
+
+    PackedArray();
     void defineBits (uint Nbits, uint lengthIn);
     void writePacked(uint jj, uint x);
     void allocateArray();
diff --git a/source/ParameterInfo.h b/source/ParameterInfo.h
index ec24e53..cd67c6a 100644
--- a/source/ParameterInfo.h
+++ b/source/ParameterInfo.h
@@ -7,8 +7,8 @@ public:
     int inputLevel; //where the parameter was defined
     int inputLevelAllowed; //at which inpurt level parameter definition is allowed
     virtual void inputValues(istringstream &streamIn) =0;
-    friend std::ostream& operator<< (std::ostream& o, ParameterInfoBase const& b);    
-    virtual ~ParameterInfoBase() {};    
+    friend std::ostream& operator<< (std::ostream& o, ParameterInfoBase const& b);
+    virtual ~ParameterInfoBase() {};
 protected:
     virtual void printValues(std::ostream& o) const = 0;
 };
@@ -21,7 +21,7 @@ inline std::ostream& operator<< (std::ostream& o, ParameterInfoBase const& b) {
 };
 
 
-template <class parameterType> 
+template <class parameterType>
 inline parameterType inputOneValue (istringstream &streamIn) {
     parameterType oneV;
     streamIn >> oneV;
@@ -36,62 +36,62 @@ inline string inputOneValue <string> (istringstream &streamIn) {
     } else {
         streamIn.get();//skip "
         getline(streamIn,oneV,'"');
-    };    
+    };
     return oneV;
 };
 
 
-template <class parameterType> 
+template <class parameterType>
 inline void printOneValue (parameterType *value, std::ostream& outStr) {
     outStr << *value;
 };
 template <>
 inline void printOneValue <string> (string *value, std::ostream& outStr) {
     if ((*value).find_first_of(" \t")!=std::string::npos) {//there is white space in the argument, put "" around
-        outStr << '\"' << *value <<'\"';    
+        outStr << '\"' << *value <<'\"';
     } else {
         outStr << *value;
     };
 };
 
 template <class parameterType>
-class ParameterInfoScalar : public ParameterInfoBase {   
+class ParameterInfoScalar : public ParameterInfoBase {
 public:
     parameterType *value;
     vector <parameterType> allowedValues;
-    
+
     ParameterInfoScalar(int inputLevelIn, int inputLevelAllowedIn, string nameStringIn, parameterType* valueIn) {
         nameString=nameStringIn;
         inputLevel=inputLevelIn;
         inputLevelAllowed=inputLevelAllowedIn;
         value=valueIn;
     };
-    
+
     void inputValues(istringstream &streamIn) {
         *value=inputOneValue <parameterType> (streamIn);
     };
-    
+
     ~ParameterInfoScalar() {};
 protected:
    virtual void printValues(std::ostream& outStr) const {
        printOneValue(value, outStr);
-   };    
-    
+   };
+
 };
 
 template <class parameterType>
-class ParameterInfoVector : public ParameterInfoBase {   
+class ParameterInfoVector : public ParameterInfoBase {
 public:
     vector <parameterType> *value;
     vector <parameterType> allowedValues;
-    
+
     ParameterInfoVector(int inputLevelIn, int inputLevelAllowedIn, string nameStringIn, vector <parameterType> *valueIn) {
         nameString=nameStringIn;
         inputLevel=inputLevelIn;
         inputLevelAllowed=inputLevelAllowedIn;
         value=valueIn;
     };
-    
+
     void inputValues(istringstream &streamIn) {
         (*value).clear();
         while (streamIn.good()) {
@@ -99,7 +99,7 @@ public:
             streamIn >> ws; //remove white space, may arrive at the end of line
         };
     };
-    
+
     ~ParameterInfoVector() {};
 protected:
    virtual void printValues(std::ostream& outStr) const {
@@ -107,6 +107,6 @@ protected:
            printOneValue(&(*value).at(ii),outStr);
            outStr<<"   ";
        };
-   };     
+   };
 };
 #endif
diff --git a/source/Parameters.cpp b/source/Parameters.cpp
index e3eb17d..ef7966a 100644
--- a/source/Parameters.cpp
+++ b/source/Parameters.cpp
@@ -16,45 +16,45 @@
 #define PAR_NAME_PRINT_WIDTH 30
 
 Parameters::Parameters() {//initalize parameters info
-    
+
     inOut = new InOutStreams;
-    
+
     //versions
     parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "versionSTAR", &versionSTAR));
     parArray.push_back(new ParameterInfoVector <uint> (-1, -1, "versionGenome", &versionGenome));
-    
+
     //parameters
     parArray.push_back(new ParameterInfoVector <string> (-1, 2, "parametersFiles", &parametersFiles));
-    
-    //system 
-    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sysShell", &sysShell));            
-    
+
+    //system
+    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sysShell", &sysShell));
+
     //run
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "runMode", &runMode));
-    parArray.push_back(new ParameterInfoScalar <int> (-1, -1, "runThreadN", &runThreadN));        
+    parArray.push_back(new ParameterInfoScalar <int> (-1, -1, "runThreadN", &runThreadN));
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "runDirPerm", &runDirPermIn));
-    parArray.push_back(new ParameterInfoScalar <int> (-1, -1, "runRNGseed", &runRNGseed));        
-    
+    parArray.push_back(new ParameterInfoScalar <int> (-1, -1, "runRNGseed", &runRNGseed));
+
     //genome
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "genomeDir", &genomeDir));
-    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "genomeLoad", &genomeLoad));        
+    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "genomeLoad", &genomeLoad));
     parArray.push_back(new ParameterInfoVector <string> (-1, -1, "genomeFastaFiles", &genomeFastaFiles));
-    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "genomeSAindexNbases", &genomeSAindexNbases));        
-    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "genomeChrBinNbits", &genomeChrBinNbits));        
-    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "genomeSAsparseD", &genomeSAsparseD));        
-    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "genomeSuffixLengthMax", &genomeSuffixLengthMax));        
+    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "genomeSAindexNbases", &genomeSAindexNbases));
+    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "genomeChrBinNbits", &genomeChrBinNbits));
+    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "genomeSAsparseD", &genomeSAsparseD));
+    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "genomeSuffixLengthMax", &genomeSuffixLengthMax));
 
     //read
     parArray.push_back(new ParameterInfoVector <string> (-1, -1, "readFilesIn", &readFilesIn));
     parArray.push_back(new ParameterInfoVector <string> (-1, -1, "readFilesCommand", &readFilesCommand));
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "readMatesLengthsIn", &readMatesLengthsIn));
-    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "readMapNumber", &readMapNumber));     
+    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "readMapNumber", &readMapNumber));
     parArray.push_back(new ParameterInfoVector <string> (-1, -1, "readNameSeparator", &readNameSeparator));
 
-    
+
     //input from BAM
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "inputBAMfile", &inputBAMfile));
-    
+
     //BAM processing
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "bamRemoveDuplicatesType", &bamRemoveDuplicatesType));
     parArray.push_back(new ParameterInfoScalar <uint>   (-1, -1, "bamRemoveDuplicatesMate2basesN", &bamRemoveDuplicatesMate2basesN));
@@ -71,14 +71,15 @@ Parameters::Parameters() {//initalize parameters info
 
     //output
     parArray.push_back(new ParameterInfoScalar <string>     (-1, 2, "outFileNamePrefix", &outFileNamePrefix));
-    parArray.push_back(new ParameterInfoScalar <string>     (-1, 2, "outTmpDir", &outTmpDir)); 
-    parArray.push_back(new ParameterInfoScalar <string>     (-1, 2, "outStd", &outStd));        
+    parArray.push_back(new ParameterInfoScalar <string>     (-1, 2, "outTmpDir", &outTmpDir));
+    parArray.push_back(new ParameterInfoScalar <string>     (-1, 2, "outTmpKeep", &outTmpKeep));
+    parArray.push_back(new ParameterInfoScalar <string>     (-1, 2, "outStd", &outStd));
     parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "outReadsUnmapped", &outReadsUnmapped));
     parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "outQSconversionAdd", &outQSconversionAdd));
     parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "outMultimapperOrder", &outMultimapperOrder.mode));
-    
+
     //outSAM
-    parArray.push_back(new ParameterInfoVector <string>     (-1, -1, "outSAMtype", &outSAMtype));    
+    parArray.push_back(new ParameterInfoVector <string>     (-1, -1, "outSAMtype", &outSAMtype));
     parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "outSAMmode", &outSAMmode));
     parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "outSAMstrandField", &outSAMstrandField));
     parArray.push_back(new ParameterInfoVector <string>     (-1, -1, "outSAMattributes", &outSAMattributes));
@@ -103,7 +104,7 @@ Parameters::Parameters() {//initalize parameters info
    //output SJ filtering
     parArray.push_back(new ParameterInfoScalar <string>  (-1, -1, "outSJfilterReads", &outSJfilterReads));
     parArray.push_back(new ParameterInfoVector <int32>   (-1, -1, "outSJfilterCountUniqueMin", &outSJfilterCountUniqueMin));
-    parArray.push_back(new ParameterInfoVector <int32>   (-1, -1, "outSJfilterCountTotalMin", &outSJfilterCountTotalMin));    
+    parArray.push_back(new ParameterInfoVector <int32>   (-1, -1, "outSJfilterCountTotalMin", &outSJfilterCountTotalMin));
     parArray.push_back(new ParameterInfoVector <int32>   (-1, -1, "outSJfilterOverhangMin", &outSJfilterOverhangMin));
     parArray.push_back(new ParameterInfoVector <int32>   (-1, -1, "outSJfilterDistToOtherSJmin", &outSJfilterDistToOtherSJmin));
     parArray.push_back(new ParameterInfoVector <int32>   (-1, -1, "outSJfilterIntronMaxVsReadN", &outSJfilterIntronMaxVsReadN));
@@ -119,18 +120,18 @@ Parameters::Parameters() {//initalize parameters info
 
     parArray.push_back(new ParameterInfoScalar <uint>     (-1, -1, "outFilterMultimapNmax", &outFilterMultimapNmax));
     parArray.push_back(new ParameterInfoScalar <intScore> (-1, -1, "outFilterMultimapScoreRange", &outFilterMultimapScoreRange));
-    
+
     parArray.push_back(new ParameterInfoScalar <intScore> (-1, -1, "outFilterScoreMin", &outFilterScoreMin));
     parArray.push_back(new ParameterInfoScalar <double>   (-1, -1, "outFilterScoreMinOverLread", &outFilterScoreMinOverLread));
-    
-    parArray.push_back(new ParameterInfoScalar <uint>     (-1, -1, "outFilterMatchNmin", &outFilterMatchNmin));    
-    parArray.push_back(new ParameterInfoScalar <double>   (-1, -1, "outFilterMatchNminOverLread", &outFilterMatchNminOverLread));    
-    
+
+    parArray.push_back(new ParameterInfoScalar <uint>     (-1, -1, "outFilterMatchNmin", &outFilterMatchNmin));
+    parArray.push_back(new ParameterInfoScalar <double>   (-1, -1, "outFilterMatchNminOverLread", &outFilterMatchNminOverLread));
+
     parArray.push_back(new ParameterInfoScalar <uint>     (-1, -1, "outFilterMismatchNmax", &outFilterMismatchNmax));
     parArray.push_back(new ParameterInfoScalar <double>   (-1, -1, "outFilterMismatchNoverLmax", &outFilterMismatchNoverLmax));
     parArray.push_back(new ParameterInfoScalar <double>   (-1, -1, "outFilterMismatchNoverReadLmax", &outFilterMismatchNoverReadLmax));
     parArray.push_back(new ParameterInfoScalar <string>   (-1, -1, "outFilterIntronMotifs", &outFilterIntronMotifs));
-  
+
     //clipping
     parArray.push_back(new ParameterInfoVector <uint>   (-1, -1, "clip5pNbases", &clip5pNbases));
     parArray.push_back(new ParameterInfoVector <uint>   (-1, -1, "clip3pNbases", &clip3pNbases));
@@ -143,7 +144,9 @@ Parameters::Parameters() {//initalize parameters info
     parArray.push_back(new ParameterInfoScalar <uint>   (-1, -1, "winAnchorDistNbins", &winAnchorDistNbins));
     parArray.push_back(new ParameterInfoScalar <uint>   (-1, -1, "winFlankNbins", &winFlankNbins));
     parArray.push_back(new ParameterInfoScalar <uint>   (-1, -1, "winAnchorMultimapNmax", &winAnchorMultimapNmax));
-    
+    parArray.push_back(new ParameterInfoScalar <double>   (-1, -1, "winReadCoverageRelativeMin", &winReadCoverageRelativeMin));
+    parArray.push_back(new ParameterInfoScalar <uint>   (-1, -1, "winReadCoverageBasesMin", &winReadCoverageBasesMin));
+
     //scoring
     parArray.push_back(new ParameterInfoScalar <intScore>   (-1, -1, "scoreGap", &scoreGap));
     parArray.push_back(new ParameterInfoScalar <intScore>   (-1, -1, "scoreGapNoncan", &scoreGapNoncan));
@@ -155,58 +158,60 @@ Parameters::Parameters() {//initalize parameters info
     parArray.push_back(new ParameterInfoScalar <intScore>   (-1, -1, "scoreDelBase", &scoreDelBase));
     parArray.push_back(new ParameterInfoScalar <intScore>   (-1, -1, "scoreDelOpen", &scoreDelOpen));
     parArray.push_back(new ParameterInfoScalar <intScore>   (-1, -1, "scoreInsOpen", &scoreInsOpen));
-    parArray.push_back(new ParameterInfoScalar <intScore>   (-1, -1, "scoreInsBase", &scoreInsBase));   
-    
-    //alignment    
+    parArray.push_back(new ParameterInfoScalar <intScore>   (-1, -1, "scoreInsBase", &scoreInsBase));
+
+    //alignment
     parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedSearchLmax", &seedSearchLmax));
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedSearchStartLmax", &seedSearchStartLmax));    
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedSearchStartLmax", &seedSearchStartLmax));
     parArray.push_back(new ParameterInfoScalar <double>     (-1, -1, "seedSearchStartLmaxOverLread", &seedSearchStartLmaxOverLread));
-    
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedPerReadNmax", &seedPerReadNmax));  
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedPerWindowNmax", &seedPerWindowNmax));  
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedNoneLociPerWindow", &seedNoneLociPerWindow));  
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedMultimapNmax", &seedMultimapNmax)); 
-    
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignIntronMin", &alignIntronMin));        
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignIntronMax", &alignIntronMax));        
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignMatesGapMax", &alignMatesGapMax));        
-
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignTranscriptsPerReadNmax", &alignTranscriptsPerReadNmax));    
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignSJoverhangMin", &alignSJoverhangMin));    
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignSJDBoverhangMin", &alignSJDBoverhangMin));    
+
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedPerReadNmax", &seedPerReadNmax));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedPerWindowNmax", &seedPerWindowNmax));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedNoneLociPerWindow", &seedNoneLociPerWindow));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "seedMultimapNmax", &seedMultimapNmax));
+
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignIntronMin", &alignIntronMin));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignIntronMax", &alignIntronMax));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignMatesGapMax", &alignMatesGapMax));
+
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignTranscriptsPerReadNmax", &alignTranscriptsPerReadNmax));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignSJoverhangMin", &alignSJoverhangMin));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignSJDBoverhangMin", &alignSJDBoverhangMin));
     parArray.push_back(new ParameterInfoVector <int32>      (-1, -1, "alignSJstitchMismatchNmax", &alignSJstitchMismatchNmax));
-    
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignSplicedMateMapLmin", &alignSplicedMateMapLmin));       
-    parArray.push_back(new ParameterInfoScalar <double>     (-1, -1, "alignSplicedMateMapLminOverLmate", &alignSplicedMateMapLminOverLmate));       
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignWindowsPerReadNmax", &alignWindowsPerReadNmax));  
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignTranscriptsPerWindowNmax", &alignTranscriptsPerWindowNmax));  
-    parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "alignEndsType", &alignEndsType.in));  
-    parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "alignSoftClipAtReferenceEnds", &alignSoftClipAtReferenceEnds));  
+
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignSplicedMateMapLmin", &alignSplicedMateMapLmin));
+    parArray.push_back(new ParameterInfoScalar <double>     (-1, -1, "alignSplicedMateMapLminOverLmate", &alignSplicedMateMapLminOverLmate));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignWindowsPerReadNmax", &alignWindowsPerReadNmax));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignTranscriptsPerWindowNmax", &alignTranscriptsPerWindowNmax));
+    parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "alignEndsType", &alignEndsType.in));
+    parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "alignSoftClipAtReferenceEnds", &alignSoftClipAtReferenceEnds));
+
+    parArray.push_back(new ParameterInfoVector <string>     (-1, -1, "alignEndsProtrude", &alignEndsProtrude.in));
 
 
     //chimeric
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "chimSegmentMin", &chimSegmentMin));    
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "chimSegmentMin", &chimSegmentMin));
     parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "chimScoreMin", &chimScoreMin));
-    parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "chimScoreDropMax", &chimScoreDropMax));    
-    parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "chimScoreSeparation", &chimScoreSeparation));    
-    parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "chimScoreJunctionNonGTAG", &chimScoreJunctionNonGTAG));    
-    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "chimJunctionOverhangMin", &chimJunctionOverhangMin));    
+    parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "chimScoreDropMax", &chimScoreDropMax));
+    parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "chimScoreSeparation", &chimScoreSeparation));
+    parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "chimScoreJunctionNonGTAG", &chimScoreJunctionNonGTAG));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "chimJunctionOverhangMin", &chimJunctionOverhangMin));
     parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "chimOutType", &chimOutType));
     parArray.push_back(new ParameterInfoVector <string>     (-1, -1, "chimFilter", &chimFilter));
     parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "chimSegmentReadGapMax", &chimSegmentReadGapMax));
-    
+
     //sjdb
     parArray.push_back(new ParameterInfoVector <string> (-1, -1, "sjdbFileChrStartEnd", &sjdbFileChrStartEnd));
-    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbGTFfile", &sjdbGTFfile));    
-    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbGTFchrPrefix", &sjdbGTFchrPrefix)); 
-    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbGTFfeatureExon", &sjdbGTFfeatureExon)); 
-    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbGTFtagExonParentTranscript", &sjdbGTFtagExonParentTranscript)); 
-    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbGTFtagExonParentGene", &sjdbGTFtagExonParentGene)); 
+    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbGTFfile", &sjdbGTFfile));
+    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbGTFchrPrefix", &sjdbGTFchrPrefix));
+    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbGTFfeatureExon", &sjdbGTFfeatureExon));
+    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbGTFtagExonParentTranscript", &sjdbGTFtagExonParentTranscript));
+    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbGTFtagExonParentGene", &sjdbGTFtagExonParentGene));
     parArray.push_back(new ParameterInfoScalar <uint>   (-1, -1, "sjdbOverhang", &sjdbOverhang));
     sjdbOverhang_par=parArray.size()-1;
     parArray.push_back(new ParameterInfoScalar <int>    (-1, -1, "sjdbScore", &sjdbScore));
-    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbInsertSave", &sjdbInsert.save)); 
-    
+    parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "sjdbInsertSave", &sjdbInsert.save));
+
     //quant
     parArray.push_back(new ParameterInfoVector <string> (-1, -1, "quantMode", &quant.mode));
     parArray.push_back(new ParameterInfoScalar <int>     (-1, -1, "quantTranscriptomeBAMcompression", &quant.trSAM.bamCompression));
@@ -217,23 +222,23 @@ Parameters::Parameters() {//initalize parameters info
     twoPass.pass1readsN_par=parArray.size()-1;
     parArray.push_back(new ParameterInfoScalar <string>   (-1, -1, "twopassMode", &twoPass.mode));
 
-    
+
 //     //SW parameters
 //     parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "swMode", &swMode));
 //     parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "swWinCoverageMinP", &swWinCoverageMinP));
-    
+
     parameterInputName.push_back("Default");
     parameterInputName.push_back("Command-Line-Initial");
-    parameterInputName.push_back("Command-Line");    
+    parameterInputName.push_back("Command-Line");
     parameterInputName.push_back("genomeParameters.txt");
-    
+
 };
 
 
 void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters: default, from files, from command line
-    
+
 ///////// Default parameters
-    
+
     #include "parametersDefault.xxd"
     string parString( (const char*) parametersDefault,parametersDefault_len);
     stringstream parStream (parString);
@@ -245,51 +250,51 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             errOut <<"BUG: DEFAULT parameter value not defined: "<<parArray[ii]->nameString;
             exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
-    };    
-    
+    };
+
 ///////// Initial parameters from Command Line
-    
-    commandLine=""; 
-    string commandLineFile="";    
+
+    commandLine="";
+    string commandLineFile="";
 
     if (argInN>1) {//scan parameters from command line
         commandLine += string(argIn[0]);
         for (int iarg=1; iarg<argInN; iarg++) {
             string oneArg=string(argIn[iarg]);
-            
+
             if (oneArg=="--version") {//print version and exit
                 std::cout << STAR_VERSION <<std::endl;
                 exit(0);
             };
-            
+
             size_t found = oneArg.find("=");
             if (found!=string::npos && oneArg.substr(0,2)=="--") {// --parameter=value
                 string key = oneArg.substr(2, found - 2);
                 string val = oneArg.substr(found + 1);
                 if (val.find_first_of(" \t")!=std::string::npos) {//there is white space in the argument, put "" around
                     val ='\"' + val + '\"';
-                };                
+                };
                 commandLineFile += '\n' + key + ' ' + val;
             }
-            else if (oneArg.substr(0,2)=="--") {//parameter name, cut -- 
+            else if (oneArg.substr(0,2)=="--") {//parameter name, cut --
                 commandLineFile +='\n' + oneArg.substr(2);
             } else {//parameter value
                 if (oneArg.find_first_of(" \t")!=std::string::npos) {//there is white space in the argument, put "" around
                     oneArg ='\"'  + oneArg +'\"';
                 };
-                commandLineFile +=' ' + oneArg;                
-            };            
+                commandLineFile +=' ' + oneArg;
+            };
             commandLine += ' ' + oneArg;
         };
-        istringstream parStreamCommandLine(commandLineFile);   
-        scanAllLines(parStreamCommandLine, 1, 2); //read only initial Command Line parameters 
+        istringstream parStreamCommandLine(commandLineFile);
+        scanAllLines(parStreamCommandLine, 1, 2); //read only initial Command Line parameters
     };
-    
+
 //     need to be careful since runMode and genomeDir are not Command-Line-Initial
 //     if (runMode=="genomeGenerate" && outFileNamePrefix=="./") {// for genome generation, output into genomeDir
 //         outFileNamePrefix=genomeDir;
 //     };
-    
+
     inOut->logMain.open((outFileNamePrefix + "Log.out").c_str());
     if (inOut->logMain.fail()) {
         ostringstream errOut;
@@ -297,12 +302,12 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         errOut <<"Check if the path " << outFileNamePrefix << " exists and you have permissions to write there\n";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     inOut->logMain << "STAR version=" << STAR_VERSION << "\n"<<flush;
-    inOut->logMain << "STAR compilation time,server,dir=" << COMPILATION_TIME_PLACE << "\n"<<flush;   
-    
-    
-    
+    inOut->logMain << "STAR compilation time,server,dir=" << COMPILATION_TIME_PLACE << "\n"<<flush;
+
+
+
     //define what goes to cout
     if (outStd=="Log") {
         inOut->logStdOut=& std::cout;
@@ -314,34 +319,34 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         errOut <<"EXITING because of FATAL PARAMETER error: outStd="<<outStd <<" is not a valid value of the parameter\n";
         errOut <<"SOLUTION: provide a valid value fot outStd: Log / SAM / BAM_Unsorted / BAM_SortedByCoordinate";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
-    };  
-    
+    };
+
     inOut->logMain << "##### DEFAULT parameters:\n" <<flush;
     for (uint ii=0; ii<parArray.size(); ii++) {
         if (parArray[ii]->inputLevel==0) {
             inOut->logMain << setw(PAR_NAME_PRINT_WIDTH) << parArray[ii]->nameString <<"    "<< *(parArray[ii]) << endl;
         };
-    };     
-    
+    };
+
     inOut->logMain <<"##### Command Line:\n"<<commandLine <<endl ;
 
-    inOut->logMain << "##### Initial USER parameters from Command Line:\n";                
+    inOut->logMain << "##### Initial USER parameters from Command Line:\n";
     for (uint ii=0; ii<parArray.size(); ii++) {
         if (parArray[ii]->inputLevel==1) {
             inOut->logMain << setw(PAR_NAME_PRINT_WIDTH) << parArray[ii]->nameString <<"    "<< *(parArray[ii]) << endl;
         };
-    };            
-    
+    };
+
 ///////// Parameters files
-    
+
     if (parametersFiles.at(0) != "-") {//read parameters from a user-defined file
         for (uint ii=0; ii<parametersFiles.size(); ii++) {
             parameterInputName.push_back(parametersFiles.at(ii));
             ifstream parFile(parametersFiles.at(ii).c_str());
             if (parFile.good()) {
-                inOut->logMain << "##### USER parameters from user-defined parameters file " <<parametersFiles.at(ii)<< ":\n" <<flush;        
+                inOut->logMain << "##### USER parameters from user-defined parameters file " <<parametersFiles.at(ii)<< ":\n" <<flush;
                 scanAllLines(parFile, parameterInputName.size()-1, -1);
-                parFile.close();        
+                parFile.close();
             } else {
                 ostringstream errOut;
                 errOut <<"EXITING because of fatal input ERROR: could not open user-defined parameters file " <<parametersFiles.at(ii)<< "\n" <<flush;
@@ -349,15 +354,15 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             };
         };
     };
-    
+
 ///////// Command Line Final
-    
+
     if (argInN>1) {//scan all parameters from command line and override previuos values
-        inOut->logMain << "###### All USER parameters from Command Line:\n" <<flush;   
-        istringstream parStreamCommandLine(commandLineFile);           
+        inOut->logMain << "###### All USER parameters from Command Line:\n" <<flush;
+        istringstream parStreamCommandLine(commandLineFile);
         scanAllLines(parStreamCommandLine, 2, -1);
-    };       
-    
+    };
+
     inOut->logMain << "##### Finished reading parameters from all sources\n\n" << flush;
 
     inOut->logMain << "##### Final user re-defined parameters-----------------:\n" << flush;
@@ -371,21 +376,21 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
                 clFull << "   --" << parArray[ii]->nameString << " " << *(parArray[ii]);
             };
         };
-    };    
+    };
     commandLineFull=clFull.str();
     inOut->logMain << "\n-------------------------------\n##### Final effective command line:\n" <<  clFull.str() << "\n";
-    
+
 //     parOut.close();
-    inOut->logMain << "\n##### Final parameters after user input--------------------------------:\n" << flush;    
+    inOut->logMain << "\n##### Final parameters after user input--------------------------------:\n" << flush;
 //     parOut.open("Parameters.all.out");
     for (uint ii=0; ii<parArray.size(); ii++) {
         inOut->logMain << setw(PAR_NAME_PRINT_WIDTH) << parArray[ii]->nameString <<"    "<< *(parArray[ii]) << endl;
-    }; 
+    };
 //     parOut.close();
-   
+
     inOut->logMain << "----------------------------------------\n\n" << flush;
-    
-    
+
+
     ///////////////////////////////////////// Old variables
     outputBED[0]=0; outputBED[1]=0; //controls the format of starBED output. Will be replaced with HDF5 output
 
@@ -398,12 +403,12 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     maxNsplit=10;
     minLsplit=12;
     minLmap=5;
-  
-    
-    
-////////////////////////////////////////////////////// Calculate and check parameters   
+
+
+
+////////////////////////////////////////////////////// Calculate and check parameters
     iReadAll=0;
-    
+
     if (runDirPermIn=="User_RWX")
     {
         runDirPerm=S_IRWXU;
@@ -415,27 +420,27 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     {
         ostringstream errOut;
         errOut << "EXITING because of FATAL INPUT ERROR: unrecognized option in --runDirPerm=" << runDirPerm << "\n";
-        errOut << "SOLUTION: use one of the allowed values of --runDirPerm : 'User_RWX' or 'All_RWX' \n";     
+        errOut << "SOLUTION: use one of the allowed values of --runDirPerm : 'User_RWX' or 'All_RWX' \n";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     if (outTmpDir=="-") {
         outFileTmp=outFileNamePrefix +"_STARtmp/";
-        sysRemoveDir (outFileTmp);        
+        sysRemoveDir (outFileTmp);
     } else {
         outFileTmp=outTmpDir;
     };
-    
+
     if (mkdir (outFileTmp.c_str(),runDirPerm)!=0) {
         ostringstream errOut;
         errOut <<"EXITING because of fatal ERROR: could not make temporary directory: "<< outFileTmp<<"\n";
         errOut <<"SOLUTION: (i) please check the path and writing permissions \n (ii) if you specified --outTmpDir, and this directory exists - please remove it before running STAR\n"<<flush;
-        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                                    
+        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     //threaded or not
     g_threadChunks.threadBool=(runThreadN>1);
-    
+
     //wigOut parameters
     if (outWigType.at(0)=="None") {
         outWigFlags.yes=false;
@@ -448,7 +453,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     } else {
         ostringstream errOut;
         errOut << "EXITING because of FATAL INPUT ERROR: unrecognized option in --outWigType=" << outWigType.at(0) << "\n";
-        errOut << "SOLUTION: use one of the allowed values of --outWigType : 'None' or 'bedGraph' \n";     
+        errOut << "SOLUTION: use one of the allowed values of --outWigType : 'None' or 'bedGraph' \n";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
     if (outWigStrand.at(0)=="Stranded") {
@@ -458,10 +463,10 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     } else {
         ostringstream errOut;
         errOut << "EXITING because of FATAL INPUT ERROR: unrecognized option in --outWigStrand=" << outWigStrand.at(0) << "\n";
-        errOut << "SOLUTION: use one of the allowed values of --outWigStrand : 'Stranded' or 'Unstranded' \n";     
+        errOut << "SOLUTION: use one of the allowed values of --outWigStrand : 'Stranded' or 'Unstranded' \n";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     if (outWigType.size()==1) {//simple bedGraph
         outWigFlags.type=0;
     } else {
@@ -472,11 +477,11 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         } else {
             ostringstream errOut;
             errOut << "EXITING because of FATAL INPUT ERROR: unrecognized second option in --outWigType=" << outWigType.at(1) << "\n";
-            errOut << "SOLUTION: use one of the allowed values of --outWigType : 'read1_5p' \n";     
+            errOut << "SOLUTION: use one of the allowed values of --outWigType : 'read1_5p' \n";
             exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
     };
-    
+
     //wigOut parameters
     if (outWigNorm.at(0)=="None") {
         outWigFlags.norm=0;
@@ -485,31 +490,31 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     } else {
         ostringstream errOut;
         errOut << "EXITING because of fatal parameter ERROR: unrecognized option in --outWigNorm=" << outWigNorm.at(0) << "\n";
-        errOut << "SOLUTION: use one of the allowed values of --outWigNorm : 'None' or 'RPM' \n";     
+        errOut << "SOLUTION: use one of the allowed values of --outWigNorm : 'None' or 'RPM' \n";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
-    };    
-    
+    };
+
     if (runMode=="alignReads") {
         inOut->logProgress.open((outFileNamePrefix + "Log.progress.out").c_str());
     } else if (runMode=="inputAlignmentsFromBAM") {
         //at the moment, only wiggle output is implemented
         if (outWigFlags.yes) {
-            *inOut->logStdOut << timeMonthDayTime() << " ..... Reading from BAM, output wiggle\n" <<flush;
-            inOut->logMain << timeMonthDayTime()    << " ..... Reading from BAM, output wiggle\n" <<flush;
+            *inOut->logStdOut << timeMonthDayTime() << " ..... reading from BAM, output wiggle\n" <<flush;
+            inOut->logMain << timeMonthDayTime()    << " ..... reading from BAM, output wiggle\n" <<flush;
             string wigOutFileNamePrefix=outFileNamePrefix + "Signal";
             signalFromBAM(inputBAMfile, wigOutFileNamePrefix, *this);
-            *inOut->logStdOut << timeMonthDayTime() << " ..... Done\n" <<flush;
-            inOut->logMain << timeMonthDayTime()    << " ..... Done\n" <<flush;            
+            *inOut->logStdOut << timeMonthDayTime() << " ..... done\n" <<flush;
+            inOut->logMain << timeMonthDayTime()    << " ..... done\n" <<flush;
         } else if (bamRemoveDuplicatesType=="UniqueIdentical") {
-            *inOut->logStdOut << timeMonthDayTime() << " ..... Reading from BAM, remove duplicates, output BAM\n" <<flush;
-            inOut->logMain << timeMonthDayTime()    << " ..... Reading from BAM, remove duplicates, output BAM\n" <<flush;            
+            *inOut->logStdOut << timeMonthDayTime() << " ..... reading from BAM, remove duplicates, output BAM\n" <<flush;
+            inOut->logMain << timeMonthDayTime()    << " ..... reading from BAM, remove duplicates, output BAM\n" <<flush;
             bamRemoveDuplicates(inputBAMfile,(outFileNamePrefix+"Processed.out.bam").c_str(),this);
-            *inOut->logStdOut << timeMonthDayTime() << " ..... Done\n" <<flush;
-            inOut->logMain << timeMonthDayTime()    << " ..... Done\n" <<flush;
+            *inOut->logStdOut << timeMonthDayTime() << " ..... done\n" <<flush;
+            inOut->logMain << timeMonthDayTime()    << " ..... done\n" <<flush;
         } else {
             ostringstream errOut;
             errOut <<"EXITING because of fatal INPUT ERROR: at the moment --runMode inputFromBAM only works with --outWigType bedGraph OR --bamRemoveDuplicatesType Identical"<<"\n";
-            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                                    
+            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
         sysRemoveDir (outFileTmp);
         exit(0);
@@ -524,7 +529,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
                 ostringstream errOut;
                 errOut <<"EXITING because of fatal PARAMETER error: missing BAM option\n";
                 errOut <<"SOLUTION: re-run STAR with one of the allowed values of --outSAMtype BAM Unsorted OR SortedByCoordinate OR both\n";
-                exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                                    
+                exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
             };
             for (uint32 ii=1; ii<outSAMtype.size(); ii++) {
                 if (outSAMtype.at(ii)=="Unsorted") {
@@ -535,7 +540,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
                     ostringstream errOut;
                     errOut <<"EXITING because of fatal input ERROR: unknown value for the word " <<ii+1<<" of outSAMtype: "<< outSAMtype.at(ii) <<"\n";
                     errOut <<"SOLUTION: re-run STAR with one of the allowed values of --outSAMtype BAM Unsorted or SortedByCoordinate or both\n";
-                    exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                                    
+                    exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
                 };
             };
             //TODO check for conflicts
@@ -552,27 +557,27 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
                     outBAMfileCoordName="-";
                 } else {
                     outBAMfileCoordName=outFileNamePrefix + "Aligned.sortedByCoord.out.bam";
-                };                
+                };
                 inOut->outBAMfileCoord = bgzf_open(outBAMfileCoordName.c_str(),("w"+to_string((long long) outBAMcompression)).c_str());
                 if (outBAMsortingThreadN==0) {
                     outBAMsortingThreadNactual=min(6, runThreadN);
                 } else {
                     outBAMsortingThreadNactual=outBAMsortingThreadN;
-                };                
+                };
                 outBAMcoordNbins=max(outBAMsortingThreadNactual*3,10);
                 outBAMsortingBinStart= new uint64 [outBAMcoordNbins];
                 outBAMsortingBinStart[0]=1;//this initial value means that the bin sizes have not been determined yet
-                
+
                 outBAMsortTmpDir=outFileTmp+"/BAMsort/";
-                mkdir(outBAMsortTmpDir.c_str(),runDirPerm);  
-            };                
+                mkdir(outBAMsortTmpDir.c_str(),runDirPerm);
+            };
         } else if (outSAMtype.at(0)=="SAM") {
             if (outSAMtype.size()>1)
             {
                 ostringstream errOut;
                 errOut <<"EXITING because of fatal PARAMETER error: --outSAMtype SAM can cannot be combined with "<<outSAMtype.at(1)<<" or any other options\n";
                 errOut <<"SOLUTION: re-run STAR with with '--outSAMtype SAM' only, or with --outSAMtype BAM Unsorted|SortedByCoordinate\n";
-                exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+                exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
             };
             outSAMbool=true;
             if (outStd=="SAM") {
@@ -582,12 +587,12 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
                 inOut->outSAM = & inOut->outSAMfile;
             };
         } else if (outSAMtype.at(0)=="None") {
-            //nothing to do, all flags are already false                
+            //nothing to do, all flags are already false
         } else {
             ostringstream errOut;
             errOut <<"EXITING because of fatal input ERROR: unknown value for the first word of outSAMtype: "<< outSAMtype.at(0) <<"\n";
             errOut <<"SOLUTION: re-run STAR with one of the allowed values of outSAMtype: BAM or SAM \n"<<flush;
-            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
     };
 
@@ -595,9 +600,9 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         ostringstream errOut;
         errOut <<"EXITING because of fatal PARAMETER error: generating signal with --outWigType requires sorted BAM\n";
         errOut <<"SOLUTION: re-run STAR with with --outSAMtype BAM SortedByCoordinate, or, id you also need unsroted BAM, with --outSAMtype BAM SortedByCoordinate Unsorted\n";
-        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     //versions
     for (uint ii=0;ii<2;ii++) {
         if (parArray[ii]->inputLevel>0) {
@@ -607,20 +612,20 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
     };
-    
+
     //run
     if (runThreadN<=0) {
         ostringstream errOut;
         errOut <<"EXITING: fatal input ERROR: runThreadN must be >0, user-defined runThreadN="<<runThreadN<<"\n";
         exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     //
     if (outFilterType=="BySJout" && outSAMorder=="PairedKeepInputOrder") {
         ostringstream errOut;
         errOut <<"EXITING: fatal input ERROR: --outFilterType=BySJout is not presently compatible with --outSAMorder=PairedKeepInputOrder\n";
         errOut <<"SOLUTION: re-run STAR without setting one of those parameters. Send a feature request to the Authors\n";
-        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);        
+        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
     //SJ filtering
     for (int ii=0;ii<4;ii++) {
@@ -628,10 +633,10 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         if (outSJfilterCountUniqueMin.at(ii)<0) outSJfilterCountUniqueMin.at(ii)=numeric_limits<int32>::max();
         if (outSJfilterCountTotalMin.at(ii)<0) outSJfilterCountTotalMin.at(ii)=numeric_limits<int32>::max();
         if (outSJfilterDistToOtherSJmin.at(ii)<0) outSJfilterDistToOtherSJmin.at(ii)=numeric_limits<int32>::max();
-        
+
         if (alignSJstitchMismatchNmax.at(ii)<0) alignSJstitchMismatchNmax.at(ii)=numeric_limits<int32>::max();
     };
-    
+
     if (limitGenomeGenerateRAM==0) {//must be >0
         inOut->logMain <<"EXITING because of FATAL PARAMETER ERROR: limitGenomeGenerateRAM=0\n";
         inOut->logMain <<"SOLUTION: please specify a >0 value for limitGenomeGenerateRAM\n"<<flush;
@@ -639,8 +644,8 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     } else if (limitGenomeGenerateRAM>1000000000000) {//
         inOut->logMain <<"WARNING: specified limitGenomeGenerateRAM="<<limitGenomeGenerateRAM<<" bytes appears to be too large, if you do not have enough memory the code will crash!\n"<<flush;
     };
-    
-    
+
+
     {//read groups
         if (outSAMattrRGline.at(0)!="-") {
             string linefull;
@@ -659,26 +664,32 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
                     outSAMattrRGlineSplit.back()+="\t" + outSAMattrRGline.at(ii);
                 };
             };
-        };    
+        };
     };
-    
-    outSAMfilter.yes=false;    
+
     outSAMfilter.KeepOnlyAddedReferences=false;
+    outSAMfilter.KeepAllAddedReferences=false;
+    outSAMfilter.yes=true;
     if (outSAMfilter.mode.at(0)=="KeepOnlyAddedReferences")
     {
-        outSAMfilter.yes=true;
         outSAMfilter.KeepOnlyAddedReferences=true;
-    } else if (outSAMfilter.mode.at(0)!="None")
+    } else if (outSAMfilter.mode.at(0)=="KeepAllAddedReferences")  
+    {
+        outSAMfilter.KeepAllAddedReferences=true;
+    } else if (outSAMfilter.mode.at(0)=="None")
+    {
+      outSAMfilter.yes=false;
+    } else
     {
         ostringstream errOut;
         errOut <<"EXITING because of FATAL INPUT ERROR: unknown/unimplemented value for --outSAMfilter: "<<outSAMfilter.mode.at(0) <<"\n";
         errOut <<"SOLUTION: specify one of the allowed values: KeepOnlyAddedReferences or None\n";
-        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-        
+
     if (outMultimapperOrder.mode=="Old_2.4")
     {
-        outMultimapperOrder.random=false;      
+        outMultimapperOrder.random=false;
     } else if (outMultimapperOrder.mode=="Random")
     {
         outMultimapperOrder.random=true;
@@ -687,15 +698,15 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         ostringstream errOut;
         errOut <<"EXITING because of FATAL INPUT ERROR: unknown/unimplemented value for --outMultimapperOrder: "<<outMultimapperOrder.mode <<"\n";
         errOut <<"SOLUTION: specify one of the allowed values: Old_2.4 or SortedByCoordinate or Random\n";
-        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-        
-    
+
+
     readNmates=readFilesIn.size(); //for now the number of mates is defined by the number of input files
-    
+
     if (runMode=="alignReads" && genomeLoad!="Remove" && genomeLoad!="LoadAndExit") {//open reads files to check if they are present
         openReadsFiles();
-               
+
         //check sizes of the mate files, if not the same, assume mates are not the same length
         if (readNmates==1) {
             readMatesEqualLengths=true;
@@ -703,7 +714,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             ostringstream errOut;
             errOut <<"EXITING: because of fatal input ERROR: number of read mates files > 2: " <<readNmates << "\n";
             errOut <<"SOLUTION:specify only one or two files in the --readFilesIn option. If file names contain spaces, use quotes: \"file name\"\n";
-            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         } else if (readMatesLengthsIn=="Equal") {
             readMatesEqualLengths=true;
         } else if (readMatesLengthsIn=="NotEqual") {
@@ -712,7 +723,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             ostringstream errOut;
             errOut <<"EXITING because of FATAL input ERROR: the value of the parameter readMatesLengthsIn=" << readMatesLengthsIn <<" is not among the allowed values: Equal or NotEqual\n";
             errOut <<"SOLUTION: specify one of the allowed values: Equal or NotEqual\n";
-            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
 
         if ( runMode=="alignReads" && outReadsUnmapped=="Fastx" ) {//open unmapped reads file
@@ -721,9 +732,9 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
                 ff << outFileNamePrefix << "Unmapped.out.mate" << imate+1;
                 inOut->outUnmappedReadsStream[imate].open(ff.str().c_str());
             };
-        };        
-        
-        
+        };
+
+
         if (outFilterType=="Normal") {
             outFilterBySJoutStage=0;
         } else if (outFilterType=="BySJout") {
@@ -732,17 +743,17 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             ostringstream errOut;
             errOut <<"EXITING because of FATAL input ERROR: unknown value of parameter outFilterType: " << outFilterType <<"\n";
             errOut <<"SOLUTION: specify one of the allowed values: Normal | BySJout\n";
-            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
     };
-    
+
     if (outSAMmapqUnique<0 || outSAMmapqUnique>255) {
             ostringstream errOut;
             errOut <<"EXITING because of FATAL input ERROR: out of range value for outSAMmapqUnique=" << outSAMmapqUnique <<"\n";
             errOut <<"SOLUTION: specify outSAMmapqUnique within the range of 0 to 255\n";
-            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                        
+            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     // in/out buffers
     #define BUFFER_InSizeFraction 0.5
     if (limitIObufferSize<limitOutSJcollapsed*Junction::dataSize+1000000)
@@ -752,32 +763,32 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         errOut << "--limitOutSJcollapsed*"<<Junction::dataSize<<"="<< limitOutSJcollapsed<<"*"<<Junction::dataSize<<"="<<limitOutSJcollapsed*Junction::dataSize<<"\n";
         errOut <<"SOLUTION: re-run STAR with larger --limitIObufferSize or smaller --limitOutSJcollapsed\n";
         exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
-    };    
+    };
     chunkInSizeBytesArray=(uint) int((limitIObufferSize-limitOutSJcollapsed*Junction::dataSize)*BUFFER_InSizeFraction)/2;
     chunkOutBAMsizeBytes= (uint) int((1.0/BUFFER_InSizeFraction-1.0)*chunkInSizeBytesArray*2.0);
     chunkInSizeBytes=chunkInSizeBytesArray-2*(DEF_readSeqLengthMax+1)-2*DEF_readNameLengthMax;//to prevent overflow
-    
+
     //basic trimming
-    if (clip5pNbases.size()==1 && readNmates==2) clip5pNbases.push_back(clip5pNbases[0]);    
-    if (clip3pNbases.size()==1 && readNmates==2) clip3pNbases.push_back(clip3pNbases[0]);    
-    if (clip3pAfterAdapterNbases.size()==1 && readNmates==2) clip3pAfterAdapterNbases.push_back(clip3pAfterAdapterNbases[0]);    
+    if (clip5pNbases.size()==1 && readNmates==2) clip5pNbases.push_back(clip5pNbases[0]);
+    if (clip3pNbases.size()==1 && readNmates==2) clip3pNbases.push_back(clip3pNbases[0]);
+    if (clip3pAfterAdapterNbases.size()==1 && readNmates==2) clip3pAfterAdapterNbases.push_back(clip3pAfterAdapterNbases[0]);
 
     //adapter clipping
-    if (clip3pAdapterSeq.size()==1 && readNmates==2) clip3pAdapterSeq.push_back(clip3pAdapterSeq[0]);    
-    if (clip3pAdapterMMp.size()==1 && readNmates==2) clip3pAdapterMMp.push_back(clip3pAdapterMMp[0]); 
+    if (clip3pAdapterSeq.size()==1 && readNmates==2) clip3pAdapterSeq.push_back(clip3pAdapterSeq[0]);
+    if (clip3pAdapterMMp.size()==1 && readNmates==2) clip3pAdapterMMp.push_back(clip3pAdapterMMp[0]);
     for (uint imate=0;imate<readNmates;imate++) {
         if (clip3pAdapterSeq.at(imate).at(0)=='-') {// no clipping
-            clip3pAdapterSeq.at(imate).assign(""); 
+            clip3pAdapterSeq.at(imate).assign("");
         } else {//clipping
             clip3pAdapterSeqNum[imate]=new char [clip3pAdapterSeq.at(imate).length()];
             convertNucleotidesToNumbers(clip3pAdapterSeq.at(imate).data(),clip3pAdapterSeqNum[imate],clip3pAdapterSeq.at(imate).length());
             //inOut->fastaOutSeqs.open("Seqs.out.fasta");
         };
     };
-        
+
     //outSAMattributes
-    
-    
+
+
     outSAMattrPresent.NH=false;//TODO re-write as class with constructor?
     outSAMattrPresent.HI=false;
     outSAMattrPresent.AS=false;
@@ -786,58 +797,58 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     outSAMattrPresent.nM=false;
     outSAMattrPresent.jM=false;
     outSAMattrPresent.jI=false;
-    outSAMattrPresent.RG=false;    
+    outSAMattrPresent.RG=false;
     outSAMattrPresent.XS=false;
-    
+
     //for quant SAM output only NH and HI flags
     outSAMattrPresentQuant=outSAMattrPresent;
     outSAMattrPresent.NH=true;
     outSAMattrPresent.NH=true;
     outSAMattrOrderQuant.push_back(ATTR_NH);
     outSAMattrOrderQuant.push_back(ATTR_HI);
-            
+
     vector<string> vAttr1;
     if (outSAMattributes.at(0)=="None") {
     } else if (outSAMattributes.at(0)=="All"){
         vAttr1={"NH","HI","AS","nM","NM","MD","jM","jI"};
     } else if (outSAMattributes.at(0)=="Standard"){
-        vAttr1={"NH","HI","AS","nM"};        
+        vAttr1={"NH","HI","AS","nM"};
     } else {
         vAttr1=outSAMattributes;
     };
-   
+
     for (uint ii=0;ii<vAttr1.size();ii++) {
         if        (vAttr1.at(ii)== "NH") {
             outSAMattrOrder.push_back(ATTR_NH);
             outSAMattrPresent.NH=true;
         } else if (vAttr1.at(ii)== "HI") {
             outSAMattrOrder.push_back(ATTR_HI);
-            outSAMattrPresent.HI=true;            
+            outSAMattrPresent.HI=true;
         } else if (vAttr1.at(ii)== "AS") {
             outSAMattrOrder.push_back(ATTR_AS);
-            outSAMattrPresent.AS=true;            
+            outSAMattrPresent.AS=true;
         } else if (vAttr1.at(ii)== "NM") {
-            outSAMattrOrder.push_back(ATTR_NM); 
-            outSAMattrPresent.NM=true;            
+            outSAMattrOrder.push_back(ATTR_NM);
+            outSAMattrPresent.NM=true;
         } else if (vAttr1.at(ii)== "MD") {
-            outSAMattrOrder.push_back(ATTR_MD); 
-            outSAMattrPresent.MD=true;            
+            outSAMattrOrder.push_back(ATTR_MD);
+            outSAMattrPresent.MD=true;
         } else if (vAttr1.at(ii)== "nM") {
-            outSAMattrOrder.push_back(ATTR_nM); 
-            outSAMattrPresent.nM=true;            
+            outSAMattrOrder.push_back(ATTR_nM);
+            outSAMattrPresent.nM=true;
         } else if (vAttr1.at(ii)== "jM") {
-            outSAMattrOrder.push_back(ATTR_jM); 
-            outSAMattrPresent.jM=true;                        
+            outSAMattrOrder.push_back(ATTR_jM);
+            outSAMattrPresent.jM=true;
         } else if (vAttr1.at(ii)== "jI") {
             outSAMattrOrder.push_back(ATTR_jI);
             outSAMattrPresent.jI=true;
         } else if (vAttr1.at(ii)== "RG") {
             outSAMattrOrder.push_back(ATTR_RG);
             outSAMattrOrderQuant.push_back(ATTR_RG);
-            outSAMattrPresent.RG=true;             
+            outSAMattrPresent.RG=true;
         } else if (vAttr1.at(ii)== "XS") {
             outSAMattrOrder.push_back(ATTR_XS);
-            outSAMattrPresent.XS=true;            
+            outSAMattrPresent.XS=true;
             if (outSAMstrandField!="intronMotif") {
                 inOut->logMain << "WARNING --outSAMattributes contains XS, therefore STAR will use --outSAMstrandField intronMotif" <<endl;
                 outSAMstrandField="intronMotif";
@@ -849,7 +860,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
     };
-    
+
     if (outSAMattrRG.size()>0 && !outSAMattrPresent.RG) {
         outSAMattrOrder.push_back(ATTR_RG);
         outSAMattrOrderQuant.push_back(ATTR_RG);
@@ -858,13 +869,13 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             ostringstream errOut;
             errOut <<"EXITING because of FATAL INPUT ERROR: --outSAMattributes contains RG tag, but --outSAMattrRGline is not set\n";
             errOut <<"SOLUTION: re-run STAR with a valid read group parameter --outSAMattrRGline\n";
-            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);        
+            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     if (outSAMstrandField=="intronMotif" && !outSAMattrPresent.XS) {
         outSAMattrOrder.push_back(ATTR_XS);
         inOut->logMain << "WARNING --outSAMstrandField=intronMotif, therefore STAR will output XS attribute" <<endl;
-    };    
+    };
 
     if (chimOutType=="WithinBAM" && !outSAMattrPresent.NM) {
        outSAMattrOrder.push_back(ATTR_NM);
@@ -876,29 +887,33 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     alignEndsType.ext[1][0]=false;
     alignEndsType.ext[1][1]=false;
 
-    if (alignEndsType.in=="EndToEnd") 
+    if (alignEndsType.in=="EndToEnd")
     {
         alignEndsType.ext[0][0]=true;
         alignEndsType.ext[0][1]=true;
         alignEndsType.ext[1][0]=true;
         alignEndsType.ext[1][1]=true;
-    } else if (alignEndsType.in=="Extend5pOfRead1" ) 
+    } else if (alignEndsType.in=="Extend5pOfRead1" )
     {
         alignEndsType.ext[0][0]=true;
+    } else if (alignEndsType.in=="Extend5pOfReads12" )
+    {
+        alignEndsType.ext[0][0]=true;        
+        alignEndsType.ext[1][0]=true;  
     } else if (alignEndsType.in=="Extend3pOfRead1" )
     {
         alignEndsType.ext[0][1]=true;
     } else if (alignEndsType.in=="Local")
     {
         //nothing to do for now
-    } else 
+    } else
     {
         ostringstream errOut;
         errOut <<"EXITING because of FATAL INPUT ERROR: unknown/unimplemented value for --alignEndsType: "<<alignEndsType.in <<"\n";
         errOut <<"SOLUTION: re-run STAR with --alignEndsType Local OR EndToEnd OR Extend5pOfRead1 OR Extend3pOfRead1\n";
         exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-        
+
 //     #ifdef COMPILE_NO_SHM
 //         if (genomeLoad!="NoSharedMemory") {
 //             ostringstream errOut;
@@ -907,22 +922,22 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
 //             exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
 //         };
 //     #endif
-    
+
     //open compilation-dependent streams
     #ifdef OUTPUT_localChains
             inOut->outLocalChains.open((outFileNamePrefix + "LocalChains.out.tab").c_str());
     #endif
-    
+
 //     genomeNumToNT={'A','C','G','T','N'};
     strcpy(genomeNumToNT,"ACGTN");
-    
+
     if (genomeLoad!="LoadAndKeep" && genomeLoad!="LoadAndRemove" && genomeLoad!="Remove" && genomeLoad!="LoadAndExit" && genomeLoad!="NoSharedMemory") {// find shared memory fragment
         ostringstream errOut;
         errOut << "EXITING because of FATAL INPUT ERROR: --genomeLoad=" << genomeLoad << "\n" <<flush;
-        errOut << "SOLUTION: use one of the allowed values of --genomeLoad : NoSharedMemory,LoadAndKeep,LoadAndRemove,LoadAndExit,Remove.\n" <<flush;     
+        errOut << "SOLUTION: use one of the allowed values of --genomeLoad : NoSharedMemory,LoadAndKeep,LoadAndRemove,LoadAndExit,Remove.\n" <<flush;
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     //quantification parameters
     quant.yes=false;
     quant.geCount.yes=false;
@@ -955,13 +970,13 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             } else {
                 ostringstream errOut;
                 errOut << "EXITING because of fatal INPUT error: unrecognized option in --quant.mode=" << quant.mode.at(ii) << "\n";
-                errOut << "SOLUTION: use one of the allowed values of --quant.mode : TranscriptomeSAM or - .\n";     
+                errOut << "SOLUTION: use one of the allowed values of --quant.mode : TranscriptomeSAM or - .\n";
                 exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
             };
         };
     };
-                    
-    
+
+
     //two-pass
     if (parArray.at(twoPass.pass1readsN_par)->inputLevel>0  && twoPass.mode=="None")
     {
@@ -970,9 +985,9 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         errOut << "SOLUTION: to activate the 2-pass mode, use --twopassMode Basic";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
-    
-    
+
+
+
     twoPass.yes=false;
     if (twoPass.mode!="None") {//2-pass parameters
         if (runMode!="alignReads")
@@ -982,7 +997,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             errOut << "SOLUTION: remove --twopassMode option";
             exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
-        
+
         if (twoPass.mode!="Basic")
         {
             ostringstream errOut;
@@ -990,7 +1005,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             errOut << "SOLUTION: for the 2-pass mode, use allowed values --twopassMode: Basic";
             exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
-        
+
         if (twoPass.pass1readsN==0)
         {
             ostringstream errOut;
@@ -1004,10 +1019,10 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             errOut << "EXITING because of fatal PARAMETERS error: 2-pass method is not compatible with genomeLoad<<"<<genomeLoad<<"\n";
             errOut << "SOLUTION: re-run STAR with --genomeLoad NoSharedMemory ; this is the only compatible option at the moment.s\n";
             exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
-        };        
+        };
         twoPass.yes=true;
         twoPass.dir=outFileNamePrefix+"_STARpass1/";
-        sysRemoveDir (twoPass.dir);                
+        sysRemoveDir (twoPass.dir);
         if (mkdir (twoPass.dir.c_str(),runDirPerm)!=0) {
             ostringstream errOut;
             errOut <<"EXITING because of fatal ERROR: could not make pass1 directory: "<< twoPass.dir<<"\n";
@@ -1015,7 +1030,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
     };
-    
+
    //sjdb insert on the fly
 
     sjdbInsert.pass1=false;
@@ -1026,41 +1041,41 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
        sjdbInsert.pass1=true;
        sjdbInsert.yes=true;
     };
-    if (twoPass.yes) 
+    if (twoPass.yes)
     {
        sjdbInsert.pass2=true;
        sjdbInsert.yes=true;
-    };    
-    
-    if (genomeLoad!="NoSharedMemory" && sjdbInsert.yes ) 
+    };
+
+    if (genomeLoad!="NoSharedMemory" && sjdbInsert.yes )
     {
         ostringstream errOut;
         errOut << "EXITING because of fatal PARAMETERS error: on the fly junction insertion and 2-pass mappng cannot be used with shared memory genome \n" ;
-        errOut << "SOLUTION: run STAR with --genomeLoad NoSharedMemory to avoid using shared memory\n" <<flush;     
+        errOut << "SOLUTION: run STAR with --genomeLoad NoSharedMemory to avoid using shared memory\n" <<flush;
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
-    if (runMode=="alignReads" && sjdbInsert.yes ) 
+
+    if (runMode=="alignReads" && sjdbInsert.yes )
     {//run-time genome directory, this is needed for genome files generated on the fly
         if (sjdbOverhang<=0) {
             ostringstream errOut;
             errOut << "EXITING because of fatal PARAMETERS error: sjdbOverhang <=0 while junctions are inserted on the fly with --sjdbFileChrStartEnd or/and --sjdbGTFfile\n";
             errOut << "SOLUTION: specify sjdbOverhang>0, ideally readmateLength-1";
             exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
-        };        
+        };
         sjdbInsert.outDir=outFileNamePrefix+"_STARgenome/";
-        sysRemoveDir (sjdbInsert.outDir);  
+        sysRemoveDir (sjdbInsert.outDir);
         if (mkdir (sjdbInsert.outDir.c_str(),runDirPerm)!=0) {
             ostringstream errOut;
             errOut <<"EXITING because of fatal ERROR: could not make run-time genome directory directory: "<< sjdbInsert.outDir<<"\n";
             errOut <<"SOLUTION: please check the path and writing permissions \n";
             exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
-        };    
-    };    
-    
+        };
+    };
+
     //final sjdbOverhang value has been determined
     sjdbLength = sjdbOverhang==0 ? 0 : sjdbOverhang*2+1;
-    
+
     if (outBAMcoord && limitBAMsortRAM==0) {//check limitBAMsortRAM
         if (genomeLoad!="NoSharedMemory") {
             ostringstream errOut;
@@ -1077,7 +1092,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             errOut <<"SOLUTION: re-run with --outSAMtype BAM Unsorted/SortedByCoordinate\n";
             exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     //chimeric
     chimPar.filter.genomicN=false;
     for (uint ii=0; ii<chimFilter.size(); ii++)
@@ -1085,11 +1100,11 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         if (chimFilter.at(ii)=="banGenomicN")
         {
             chimPar.filter.genomicN=true;
-        } 
+        }
         else if (chimFilter.at(ii)=="None")
         {//nothing to do
         }
-        else 
+        else
         {
             ostringstream errOut;
             errOut << "EXITING because of fatal PARAMETERS error: unrecognized value of --chimFilter="<<chimFilter.at(ii)<<"\n";
@@ -1097,13 +1112,13 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
     };
-    
+
     for (uint ii=0; ii<readNameSeparator.size(); ii++)
     {
         if (readNameSeparator.at(ii)=="space")
         {
             readNameSeparatorChar.push_back(' ');
-        } 
+        }
         else if (readNameSeparator.at(ii)=="none")
         {
             //nothing to do
@@ -1112,22 +1127,22 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         {
             readNameSeparatorChar.push_back(readNameSeparator.at(ii).at(0));
         }
-        else 
+        else
         {
             ostringstream errOut;
             errOut << "EXITING because of fatal PARAMETERS error: unrecognized value of --readNameSeparator="<<readNameSeparator.at(ii)<<"\n";
             errOut << "SOLUTION: use allowed values: space OR single characters";
             exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
-        };    
+        };
     };
 
 
     //genome parameters
     genomeChrBinNbases=1LLU<<genomeChrBinNbits;
-    
+
     //outSAMunmapped
     outSAMunmapped.yes=false;
-    outSAMunmapped.within=false;    
+    outSAMunmapped.within=false;
     outSAMunmapped.keepPairs=false;
     if (outSAMunmapped.mode.at(0)=="None")
     {//nothing to do
@@ -1135,28 +1150,45 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     {
         outSAMunmapped.yes=true;
         outSAMunmapped.within=true;
-    } else 
+    } else
     {
         ostringstream errOut;
         errOut << "EXITING because of fatal PARAMETERS error: unrecognized first word of --outSAMunmapped="<<outSAMunmapped.mode.at(0)<<"\n";
         errOut << "SOLUTION: use allowed options: None OR Within";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     for (uint ii=1;ii<outSAMunmapped.mode.size();ii++)
     {
         if (outSAMunmapped.mode.at(0)=="Within")
         {
             outSAMunmapped.keepPairs=true;
-        } else 
+        } else
         {
             ostringstream errOut;
             errOut << "EXITING because of fatal PARAMETERS error: unrecognized option in of --outSAMunmapped="<<outSAMunmapped.mode.at(ii)<<"\n";
             errOut << "SOLUTION: use allowed option: KeepPairs";
             exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
-        };    
+        };
+    };
+
+    alignEndsProtrude.nBasesMax=stoi(alignEndsProtrude.in.at(0),nullptr);
+    if (alignEndsProtrude.nBasesMax>0)
+    {//allow ends protrusion
+        if (alignEndsProtrude.in.at(1)=="ConcordantPair")
+        {
+            alignEndsProtrude.concordantPair=true;
+        } else if (alignEndsProtrude.in.at(1)=="DiscordantPair")
+        {
+            alignEndsProtrude.concordantPair=false;
+        } else
+        {
+            ostringstream errOut;
+            errOut << "EXITING because of fatal PARAMETERS error: unrecognized option in of --alignEndsProtrude="<<alignEndsProtrude.in.at(1)<<"\n";
+            errOut << "SOLUTION: use allowed option: ConcordantPair or DiscordantPair";
+            exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
+        };
     };
-    
     ////////////////////////////////////////////////
     inOut->logMain << "Finished loading and checking parameters\n" <<flush;
 };
@@ -1172,14 +1204,14 @@ void Parameters::scanAllLines (istream &streamIn, int inputLevel,  int inputLeve
     };
 };
 
-int Parameters::scanOneLine (string &lineIn, int inputLevel, int inputLevelRequested) {//scan one line and load the parameters, 
+int Parameters::scanOneLine (string &lineIn, int inputLevel, int inputLevelRequested) {//scan one line and load the parameters,
                                                              //0 if comment, 1 if OK
     if (lineIn=="") return 0; //empty line
 
     istringstream lineInStream (lineIn);
-    
-    if (inputLevel==0 && ( lineIn.substr(0,1)==" " || lineIn.substr(0,1)=="\t" ) ) return 0;//for Default input spaces also mark comments, for nice formatting    
-    
+
+    if (inputLevel==0 && ( lineIn.substr(0,1)==" " || lineIn.substr(0,1)=="\t" ) ) return 0;//for Default input spaces also mark comments, for nice formatting
+
     string parIn("");
     lineInStream >> parIn;
     if (parIn=="" || parIn.substr(0,2)=="//" || parIn.substr(0,1)=="#") return 0; //this is a comment
@@ -1188,13 +1220,13 @@ int Parameters::scanOneLine (string &lineIn, int inputLevel, int inputLevelReque
     for (iPar=0; iPar<parArray.size(); iPar++) {
         if (parIn==parArray[iPar]->nameString) {//
             if (inputLevelRequested < 0 || inputLevelRequested == parArray[iPar]->inputLevelAllowed) {
-                break;//will read this parameter values                
+                break;//will read this parameter values
             } else {
-                return 1; //do not read inputs not requested at this level                
+                return 1; //do not read inputs not requested at this level
             };
         };
     };
-    
+
     string parV("");
     lineInStream >> parV;
     if (parV=="") {//parameter value cannot be empty
@@ -1203,9 +1235,9 @@ int Parameters::scanOneLine (string &lineIn, int inputLevel, int inputLevelReque
         errOut << "SOLUTION: use non-empty value for this parameter\n"<<flush;
         exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
-    
+
     lineInStream.str(lineIn); lineInStream.clear(); lineInStream >> parIn; //get the correct state of stream, past reading parIn
-    
+
     if (iPar==parArray.size()) {//string is not identified
         ostringstream errOut;
         errOut << "EXITING: FATAL INPUT ERROR: unrecoginzed parameter name \""<< parIn << "\" in input \"" << parameterInputName.at(inputLevel) <<"\"\n";
@@ -1226,12 +1258,12 @@ int Parameters::scanOneLine (string &lineIn, int inputLevel, int inputLevelReque
             errOut << "SOLUTION: keep only one definition of input parameters in each input source\n"<<flush;
             exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         } else {//read values
-            parArray[iPar]->inputValues(lineInStream);         
+            parArray[iPar]->inputValues(lineInStream);
             parArray[iPar]->inputLevel=inputLevel;
             if ( inOut->logMain.good() ) {
                 inOut->logMain << setiosflags(ios::left) << setw(PAR_NAME_PRINT_WIDTH) << parArray[iPar]->nameString << *(parArray[iPar]);
                 if ( parArray[iPar]->inputLevel > 0 ) inOut->logMain <<"     ~RE-DEFINED";
-                inOut->logMain << endl;    
+                inOut->logMain << endl;
             };
         };
     };
@@ -1240,60 +1272,60 @@ int Parameters::scanOneLine (string &lineIn, int inputLevel, int inputLevelReque
 
 //////////////////////////////////////////////////////////////////////////////////////////
 void Parameters::chrInfoLoad() {//find chrStart,Length,nChr from Genome G
-    
+
     //load chr names
-    ifstream chrStreamIn ( (genomeDir+"/chrName.txt").c_str() );   
+    ifstream chrStreamIn ( (genomeDir+"/chrName.txt").c_str() );
     if (chrStreamIn.fail()) {
-        ostringstream errOut;                            
+        ostringstream errOut;
         errOut << "EXITING because of FATAL error, could not open file " << (genomeDir+"/chrName.txt") <<"\n";
         errOut << "SOLUTION: re-generate genome files with STAR --runMode genomeGenerate\n";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_INPUT_FILES, *this);
     };
-    
+
     char chrInChar[1000];
-    
+
     while (chrStreamIn.good()) {
         string chrIn;
         chrStreamIn.getline(chrInChar,1000);
         chrIn=chrInChar;
         if (chrIn=="") break;
         chrName.push_back(chrIn);
-    };        
+    };
     chrStreamIn.close();
     nChrReal=chrName.size();
 
-    inOut->logMain << "Number of real (reference) chromosmes= " << nChrReal <<"\n"<<flush;
+    inOut->logMain << "Number of real (reference) chromosomes= " << nChrReal <<"\n"<<flush;
     chrStart.resize(nChrReal+1);
     chrLength.resize(nChrReal);
-  
+
     //load chr lengths
-    chrStreamIn.open( (genomeDir+"/chrLength.txt").c_str() );   
+    chrStreamIn.open( (genomeDir+"/chrLength.txt").c_str() );
     if (chrStreamIn.fail()) {
-        ostringstream errOut;                            
+        ostringstream errOut;
         errOut << "EXITING because of FATAL error, could not open file " << (genomeDir+"/chrLength.txt") <<"\n";
         errOut << "SOLUTION: re-generate genome files with STAR --runMode genomeGenerate\n";
-        exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_INPUT_FILES, *this);  
+        exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_INPUT_FILES, *this);
     };
-    
+
     for  (uint ii=0;ii<nChrReal;ii++) {
         chrStreamIn >> chrLength[ii];
-    };    
-    chrStreamIn.close();    
-    
+    };
+    chrStreamIn.close();
+
     //load chr starts
-    chrStreamIn.open( (genomeDir+"/chrStart.txt").c_str() );   
+    chrStreamIn.open( (genomeDir+"/chrStart.txt").c_str() );
     if (chrStreamIn.fail()) {
-        ostringstream errOut;                            
+        ostringstream errOut;
         errOut << "EXITING because of FATAL error, could not open file " << (genomeDir+"/chrStart.txt") <<"\n";
-        errOut << "SOLUTION: re-generate genome files with STAR --runMode genomeGenerate\n";        
+        errOut << "SOLUTION: re-generate genome files with STAR --runMode genomeGenerate\n";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_INPUT_FILES, *this);
-    };   
-    
+    };
+
     for  (uint ii=0;ii<=nChrReal;ii++) {
         chrStreamIn >> chrStart[ii];
-    };    
-    chrStreamIn.close();    
-  
+    };
+    chrStreamIn.close();
+
     //log
     for (uint ii=0; ii<nChrReal;ii++) {
         inOut->logMain << ii+1 <<"\t"<< chrName[ii] <<"\t"<<chrLength[ii]<<"\t"<<chrStart[ii]<<"\n"<<flush;
@@ -1302,7 +1334,7 @@ void Parameters::chrInfoLoad() {//find chrStart,Length,nChr from Genome G
 
 //////////////////////////////////////////////////////////
 void Parameters::chrBinFill() {
-    chrBinN = chrStart[nChrReal]/genomeChrBinNbases+1;    
+    chrBinN = chrStart[nChrReal]/genomeChrBinNbases+1;
     chrBin = new uint [chrBinN];
     for (uint ii=0, ichr=1; ii<chrBinN; ++ii) {
         if (ii*genomeChrBinNbases>=chrStart[ichr]) ichr++;
diff --git a/source/Parameters.h b/source/Parameters.h
index f302ef5..6d6e261 100644
--- a/source/Parameters.h
+++ b/source/Parameters.h
@@ -10,50 +10,52 @@
 #include <signal.h>
 
 class Parameters {
-    
+
     public:
         vector <ParameterInfoBase*> parArray, parArrayInitial;
         vector <string> parameterInputName;
-        
+
         string commandLine, commandLineFull;
-        
+
         //version
         uint versionSTAR;
         vector <uint> versionGenome;
-        
+
         //system parameters
         string sysShell; //shell for executing system commands
-        
+
         // run parameters
         string runMode;
         int runThreadN;
         mode_t runDirPerm;
         string runDirPermIn; //permission for directores created at run-time
         int runRNGseed; //random number generator seed
-    
+
         //parameters
         vector <string> parametersFiles;
-        
+
         //input
         string inputBAMfile;
-        
+
         //genome, SA, ...
         vector <uint> chrStart, chrLength;
         string genomeDir,genomeLoad;
-        vector <string> genomeFastaFiles; 
+        vector <string> genomeFastaFiles;
         uint genomeSAsparseD;//sparsity=distance between indices
         uint genomeInsertL; //total length of the sequence to be inserted on the fly
         uint genomeInsertChrIndFirst; //index of the first inserted chromosome
         uint genomeSuffixLengthMax; //maximum length of the suffixes, has to be longer than read length
-        
+
         //binning,windows,anchors
         uint genomeChrBinNbits, genomeChrBinNbases, chrBinN, *chrBin;
         uint winBinChrNbits, winBinNbits, winAnchorDistNbins, winFlankNbins, winBinN;
         uint winAnchorMultimapNmax; //max number of alignments for anchors
+        double winReadCoverageRelativeMin;
+        uint winReadCoverageBasesMin;
 
         uint genomeSAindexNbases; //length of the SA pre-index strings
         uint *genomeSAindexStart;//starts of the L-mer indices in the SAindex, 1<=L<=genomeSAindexNbases
-        
+
         char genomeNumToNT[6];
         //read parameters
         uint readMapNumber;
@@ -61,44 +63,50 @@ class Parameters {
         int readFilesIndex;
         uint32 readFilesN;
         vector <string> readFilesIn, readFilesInTmp;
-        vector <vector <string>> readFilesNames;
+        vector <vector <string> > readFilesNames;
         uint readNmates;
         string readMatesLengthsIn;
         vector <string> readFilesCommand;
         pid_t readFilesCommandPID[MAX_N_MATES];
-        
+
         vector <string> readNameSeparator;
         vector <char> readNameSeparatorChar;
-        
+
         string outSAMreadID;
-        
-        vector <uint> clip5pNbases, clip3pNbases, clip3pAfterAdapterNbases;    
+
+        vector <uint> clip5pNbases, clip3pNbases, clip3pAfterAdapterNbases;
         vector <double> clip3pAdapterMMp;
         vector <string> clip3pAdapterSeq;
         char *clip3pAdapterSeqNum[MAX_N_MATES];//adapter sequence - numerical
         bool readMatesEqualLengths; //whether or not the read mates have the same length, true if onyl one mate
-        
+
         //align parameters
         uint alignSJoverhangMin,alignSJDBoverhangMin,alignSplicedMateMapLmin; //min SJ donor/acceptor length
         double alignSplicedMateMapLminOverLmate;
         uint alignWindowsPerReadNmax; //max number of alignment windows per read
         uint alignTranscriptsPerWindowNmax; //maximum number of transcripts recorded per window
-        uint alignTranscriptsPerReadNmax;   //max number of alignments per read     
+        uint alignTranscriptsPerReadNmax;   //max number of alignments per read
         uint alignIntronMin;//min length to call a gap an intron
-        uint alignIntronMax;//max length to call 
+        uint alignIntronMax;//max length to call
         uint alignMatesGapMax;//max gap between the mates (if paired-end)
         string alignSoftClipAtReferenceEnds;
         vector <int32> alignSJstitchMismatchNmax;
-        
-        struct 
+
+        struct
         {
             string in;
             bool ext[2][2];
         } alignEndsType;
-        
+
+        struct
+        {
+            vector<string> in;
+            int nBasesMax;
+            bool concordantPair;
+        } alignEndsProtrude;
         
         //seed parameters
-        uint seedMultimapNmax; //max number of multiple alignments per piece          
+        uint seedMultimapNmax; //max number of multiple alignments per piece
         uint seedSearchLmax; //max length of the seed
         uint seedPerReadNmax; //max number of pieces per Read
         uint seedPerWindowNmax; //max number of aligns per window
@@ -108,12 +116,13 @@ class Parameters {
 
         //chunk parameters
         uint chunkInSizeBytes,chunkInSizeBytesArray,chunkOutBAMsizeBytes;
-        
+
         //output
-        string outFileNamePrefix, outStd, outTmpDir;
-        
+        string outFileNamePrefix, outStd;
+        string outTmpDir, outTmpKeep;
+
         //SAM output
-        string outBAMfileCoordName, outBAMfileUnsortedName, outQuantBAMfileName;        
+        string outBAMfileCoordName, outBAMfileUnsortedName, outQuantBAMfileName;
         string samHeader, samHeaderHD, samHeaderSortedCoord;
         string outSAMmode, outSAMstrandField,  outSAMorder, outSAMprimaryFlag;
         vector<string> outSAMattributes, outSAMheaderHD, outSAMheaderPG;
@@ -133,7 +142,7 @@ class Parameters {
         int outBAMsortingThreadN, outBAMsortingThreadNactual;
         uint64 *outBAMsortingBinStart; //genomic starts for bins for sorting BAM files
         uint16 outSAMflagOR, outSAMflagAND;
-        
+
         struct
         {
             vector <string> mode;
@@ -141,42 +150,43 @@ class Parameters {
             bool within;//output unmapped reads within SAM/BAM files
             bool keepPairs;//keep mates together
         } outSAMunmapped;
-        
+
         struct
         {
             vector <string> mode;
             bool yes;
             bool KeepOnlyAddedReferences;
+            bool KeepAllAddedReferences;            
         } outSAMfilter;
-        
+
         struct
         {
             string mode;
             bool random;
         } outMultimapperOrder;
-        
+
         string outReadsUnmapped;
         int outQSconversionAdd;
         string outFileTmp;
-        
+
         //output filtering
         uint outFilterMismatchNmax;
         double outFilterMismatchNoverLmax, outFilterMismatchNoverReadLmax; //max proportion of all MM within all bases
-        
+
         uint outFilterMatchNmin,outFilterMultimapNmax;//min number of matches
         double outFilterScoreMinOverLread, outFilterMatchNminOverLread;//normalzied to read length
         intScore outFilterScoreMin,outFilterMultimapScoreRange;//min score to output
         string outFilterIntronMotifs;
-        string outFilterType; //type of filtering 
-        int outFilterBySJoutStage; //indicates the stage of filtering by SJout 
-        
+        string outFilterType; //type of filtering
+        int outFilterBySJoutStage; //indicates the stage of filtering by SJout
+
         //output filtering SJs
         string outSJfilterReads;
         vector <int32> outSJfilterCountUniqueMin, outSJfilterCountTotalMin;
         vector <int32> outSJfilterOverhangMin;
         vector <int32> outSJfilterDistToOtherSJmin; //min allowed distance to other SJ's donor/acceptor
         vector <int32> outSJfilterIntronMaxVsReadN;
-        
+
         //wiggle output
         vector <string> outWigType, outWigStrand, outWigNorm;
         string outWigReferencesPrefix;
@@ -186,8 +196,8 @@ class Parameters {
             int type;
             int format;
             int norm;
-        } outWigFlags; 
-        
+        } outWigFlags;
+
         //2-pass
 //         uint twoPass.pass1readsN, twoPass.sjLimit;
 //         string twoPass.dir,twopassSJpass1file;
@@ -200,7 +210,7 @@ class Parameters {
             string pass1sjFile;
             string mode;
         } twoPass;
-        
+
         //inserting junctions on the fly
         struct {
             bool yes; //insert?
@@ -209,7 +219,7 @@ class Parameters {
             string save;
             string outDir;
         } sjdbInsert;
-        
+
         //storage limits
         uint limitGenomeGenerateRAM;
         uint limitIObufferSize; //max size of the in/out buffer, bytes
@@ -217,49 +227,49 @@ class Parameters {
         uint limitOutSJoneRead, limitOutSJcollapsed;
         uint limitBAMsortRAM;
         uint limitSjdbInsertNsj;
-        
+
         // penalties
-        intScore scoreGap, scoreGapNoncan, scoreGapGCAG, scoreGapATAC, scoreDelBase, scoreDelOpen, scoreInsBase, scoreInsOpen; 
+        intScore scoreGap, scoreGapNoncan, scoreGapGCAG, scoreGapATAC, scoreDelBase, scoreDelOpen, scoreInsBase, scoreInsOpen;
         intScore scoreStitchSJshift;//Max negative score when
-        double scoreGenomicLengthLog2scale;        
+        double scoreGenomicLengthLog2scale;
 
         //old variables: CLEAN-up needed
         char outputBED[MAX_OUTPUT_FLAG]; //output flags
-        
+
         //SW search
         uint swMode, swWinCoverageMinP;
         //SW penalties
         uint swPeoutFilterMatchNmin, swPenMismatch, swPenGapOpen, swPenGapExtend;
-        uint swHsize;        
-        
+        uint swHsize;
+
         int annotScoreScale;//overall multiplication factor for the annotation
         string annotSignalFile;//binary file with annotation signal
-    
+
         //SJ database parameters
         vector <string> sjdbFileChrStartEnd;
         string sjdbGTFfile, sjdbGTFchrPrefix, sjdbGTFfeatureExon, sjdbGTFtagExonParentTranscript, sjdbGTFtagExonParentGene;
         uint sjdbOverhang,sjdbLength; //length of the donor/acceptor, length of the sj "chromosome" =2*sjdbOverhang+1 including spacer
         int sjdbOverhang_par;
-        int sjdbScore;        
-        
+        int sjdbScore;
+
         uint sjChrStart,sjdbN; //first sj-db chr
         uint sjGstart; //start of the sj-db genome sequence
         uint *sjDstart,*sjAstart,*sjStr, *sjdbStart, *sjdbEnd; //sjdb loci
         uint8 *sjdbMotif; //motifs of annotated junctions
         uint8 *sjdbShiftLeft, *sjdbShiftRight; //shifts of junctions
         uint8 *sjdbStrand; //junctions strand, not used yet
-        
+
         uint sjNovelN, *sjNovelStart, *sjNovelEnd; //novel junctions collapased and filtered
-        
+
         //quantification parameters
             //input
-        
-        struct 
+
+        struct
         {
           bool yes; //if any quantification is done
           vector <string> mode; //quantification mode input string
-                  
-          struct 
+
+          struct
           {
               bool yes;
               bool indel;
@@ -268,42 +278,42 @@ class Parameters {
               int bamCompression;
               string ban;
           } trSAM;
-          
-          struct 
+
+          struct
           {
               bool yes;
               string outFile;
           } geCount;
-          
+
         } quant;
-        
+
         //chimeric
         uint chimSegmentMin, chimJunctionOverhangMin; //min chimeric donor/acceptor length
         uint chimSegmentReadGapMax; //max read gap for stitching chimeric windows
         int chimScoreMin,chimScoreDropMax,chimScoreSeparation, chimScoreJunctionNonGTAG; //min chimeric score
         string chimOutType;
         vector <string> chimFilter;
-        
-        struct 
+
+        struct
         {
             struct
             {
                 bool genomicN;
             } filter;
         } chimPar;
-        
+
         //splitting
         char Qsplit;
         uint maxNsplit, minLsplit, minLmap;
-        
+
         //limits
-    
-        
+
+
     ////////////////////// CLEAN-UP needed
     InOutStreams *inOut; //main input output streams
 
     uint Lread;
-            
+
     //Genome parameters
     uint nGenome, nSA, nSAbyte, nChrReal;//genome length, SA length, # of chromosomes, vector of chromosome start loci
     uint nGenome2, nSA2, nSAbyte2, nChrReal2; //same for the 2nd pass
@@ -312,8 +322,8 @@ class Parameters {
     map <string,uint> chrNameIndex;
     unsigned char GstrandBit, SAiMarkNbit, SAiMarkAbsentBit; //SA index bit for strand information
     uint GstrandMask, SAiMarkAbsentMask, SAiMarkAbsentMaskC, SAiMarkNmask, SAiMarkNmaskC;//maske to remove strand bit from SA index, to remove mark from SAi index
-    
-   
+
+
 
     Parameters();
     void chrInfoLoad(); //find nChr and chrStart from genome
@@ -322,7 +332,7 @@ class Parameters {
     int readPars(); // read parameters from all files
     int scanOneLine (string &lineIn, int inputLevel, int inputLevelRequested);
     void scanAllLines (istream &streamIn, int inputLevel, int inputLevelRequested);
-    void inputParameters (int argInN, char* argIn[]); //input parameters: default, from files, from command line    
+    void inputParameters (int argInN, char* argIn[]); //input parameters: default, from files, from command line
     void openReadsFiles();
     void closeReadsFiles();
 
diff --git a/source/Parameters_openReadsFiles.cpp b/source/Parameters_openReadsFiles.cpp
index e1ae1d8..3729a4a 100644
--- a/source/Parameters_openReadsFiles.cpp
+++ b/source/Parameters_openReadsFiles.cpp
@@ -18,20 +18,20 @@ void Parameters::openReadsFiles() {
             if (inOut->readIn[ii].fail()) {
                 ostringstream errOut;
                 errOut <<"EXITING because of fatal input ERROR: could not open readFilesIn=" << readFilesIn.at(ii) <<"\n";
-                exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
-            };  
-        };    
+                exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
+            };
+        };
     } else {//create fifo files, execute pre-processing command
 
          vector<string> readsCommandFileName;
 
-         readFilesNames.resize(readNmates); 
+         readFilesNames.resize(readNmates);
 
          for (uint imate=0;imate<readNmates;imate++) {//open readIn files
             ostringstream sysCom;
             sysCom << outFileTmp <<"tmp.fifo.read"<<imate+1;
             readFilesInTmp.push_back(sysCom.str());
-            remove(readFilesInTmp.at(imate).c_str());                
+            remove(readFilesInTmp.at(imate).c_str());
             mkfifo(readFilesInTmp.at(imate).c_str(), S_IRUSR | S_IWUSR );
 
             inOut->logMain << "\n   Input read files for mate "<< imate+1 <<", from input string " << readFilesIn.at(imate) <<endl;
@@ -45,7 +45,7 @@ void Parameters::openReadsFiles() {
                 readsCommandFile << "#!" <<sysShell <<"\n";
             };
             readsCommandFile << "exec > \""<<readFilesInTmp.at(imate)<<"\"\n" ; // redirect stdout to temp fifo files
-                        
+
             string readFilesInString(readFilesIn.at(imate));
             size_t pos=0;
             readFilesN=0;
@@ -54,7 +54,7 @@ void Parameters::openReadsFiles() {
                 string file1 = readFilesInString.substr(0, pos);
                 readFilesInString.erase(0, pos + 1);
                 readFilesNames.at(imate).push_back(file1);
-                
+
                 system(("ls -lL " + file1 + " > "+ outFileTmp+"/readFilesIn.info 2>&1").c_str());
                 ifstream readFilesIn_info((outFileTmp+"/readFilesIn.info").c_str());
                 inOut->logMain <<readFilesIn_info.rdbuf();
@@ -68,12 +68,12 @@ void Parameters::openReadsFiles() {
             readsCommandFile.flush();
             readsCommandFile.seekg(0,ios::beg);
             inOut->logMain <<"\n   readsCommandsFile:\n"<<readsCommandFile.rdbuf()<<endl;
-            readsCommandFile.close();            
-            
+            readsCommandFile.close();
+
             chmod(readsCommandFileName.at(imate).c_str(),S_IXUSR | S_IRUSR | S_IWUSR);
-            
+
             readFilesCommandPID[imate]=0;
-            
+
             ostringstream errOut;
             pid_t PID=vfork();
             switch (PID) {
@@ -82,33 +82,33 @@ void Parameters::openReadsFiles() {
                     errOut << errno << ": " << strerror(errno) << "\n";
                     exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
                     break;
-                
+
                 case 0:
                     //this is the child
-                    execlp(readsCommandFileName.at(imate).c_str(), readsCommandFileName.at(imate).c_str(), (char*) NULL); 
+                    execlp(readsCommandFileName.at(imate).c_str(), readsCommandFileName.at(imate).c_str(), (char*) NULL);
                     exit(0);
-                    
+
                 default:
                     //this is the father, record PID of the children
                     readFilesCommandPID[imate]=PID;
             };
-            
+
 //             system((("\""+readsCommandFileName.at(imate)+"\"") + " & ").c_str());
-            inOut->readIn[imate].open(readFilesInTmp.at(imate).c_str());                
+            inOut->readIn[imate].open(readFilesInTmp.at(imate).c_str());
         };
         if (readNmates==2 && readFilesNames.at(0).size() != readFilesNames.at(1).size()) {
             ostringstream errOut;
             errOut <<"EXITING: because of fatal INPUT ERROR: number of input files for mate1: "<<readFilesNames.at(0).size()  << " is not equal to that for mate2: "<< readFilesNames.at(1).size() <<"\n";
             errOut <<"Make sure that the number of files in --readFilesIn is the same for both mates\n";
-            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
 
         if (outSAMattrRG.size()>1 && outSAMattrRG.size()!=readFilesN) {
             ostringstream errOut;
             errOut <<"EXITING: because of fatal INPUT ERROR: number of input read files: "<<readFilesN << " does not agree with number of read group RG entries: "<< outSAMattrRG.size() <<"\n";
             errOut <<"Make sure that the number of RG lines in --outSAMattrRGline is equal to either 1, or the number of input read files in --readFilesIn\n";
-            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
-        } else if (outSAMattrRG.size()==1) {//use the same read group for all files              
+            exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
+        } else if (outSAMattrRG.size()==1) {//use the same read group for all files
             for (uint32 ifile=1;ifile<readFilesN;ifile++) {
                 outSAMattrRG.push_back(outSAMattrRG.at(0));
             };
diff --git a/source/Quantifications.cpp b/source/Quantifications.cpp
index c30585a..efc6ee0 100644
--- a/source/Quantifications.cpp
+++ b/source/Quantifications.cpp
@@ -5,17 +5,17 @@ Quantifications::Quantifications (uint32 nGeIn) {
     geneCounts.nType=3;
     geneCounts.cAmbig = new uintQ[geneCounts.nType];
     geneCounts.cNone = new uintQ[geneCounts.nType];
-    
+
     geneCounts.nGe=nGeIn;
     geneCounts.gCount = new uintQ* [geneCounts.nType];
 
     geneCounts.cMulti=0;
-    for (int itype=0; itype<geneCounts.nType; itype++) 
+    for (int itype=0; itype<geneCounts.nType; itype++)
     {
         geneCounts.cAmbig[itype]=0;
         geneCounts.cNone[itype]=0;
         geneCounts.gCount[itype] = new uintQ [geneCounts.nGe];
-        for (uint32 ii=0; ii<geneCounts.nGe; ii++) 
+        for (uint32 ii=0; ii<geneCounts.nGe; ii++)
         {
             geneCounts.gCount[itype][ii]=0;
         };
@@ -25,11 +25,11 @@ Quantifications::Quantifications (uint32 nGeIn) {
 void Quantifications::addQuants(const Quantifications & quantsIn)
 {
     geneCounts.cMulti += quantsIn.geneCounts.cMulti;
-    for (int itype=0; itype<geneCounts.nType; itype++) 
+    for (int itype=0; itype<geneCounts.nType; itype++)
     {
         geneCounts.cAmbig[itype] += quantsIn.geneCounts.cAmbig[itype];
         geneCounts.cNone[itype] += quantsIn.geneCounts.cNone[itype];
-        for (uint32 ii=0; ii<geneCounts.nGe; ii++) 
+        for (uint32 ii=0; ii<geneCounts.nGe; ii++)
         {
             geneCounts.gCount[itype][ii] += quantsIn.geneCounts.gCount[itype][ii];
         };
diff --git a/source/Quantifications.h b/source/Quantifications.h
index 85d080e..af1c0c2 100644
--- a/source/Quantifications.h
+++ b/source/Quantifications.h
@@ -7,7 +7,7 @@
 class Quantifications {
     public:
         struct {//counting reads per gene, similar to HTseq
-            uint32  nGe;      //number of genes    
+            uint32  nGe;      //number of genes
             int nType; //number of count types (columns)
             uintQ cMulti;     //count multimappers
             uintQ *cAmbig, *cNone;//ambigouous, no-feature
@@ -15,8 +15,8 @@ class Quantifications {
         } geneCounts;
 
     Quantifications (uint32 nGeIn);
-    
+
     void addQuants(const Quantifications & quantsIn); //adds quantsIn to the quants
-}; 
+};
 
 #endif
diff --git a/source/ReadAlign.cpp b/source/ReadAlign.cpp
index a46e198..f546ed4 100644
--- a/source/ReadAlign.cpp
+++ b/source/ReadAlign.cpp
@@ -9,32 +9,32 @@ ReadAlign::ReadAlign (Parameters* Pin, const Genome &genomeIn, Transcriptome *Tr
     SA=genomeIn.SA;
     SAi=genomeIn.SAi;
     sigG=genomeIn.sigG;
-    
-    winBin = new uintWinBin* [2];  
+
+    winBin = new uintWinBin* [2];
     winBin[0] = new uintWinBin [P->winBinN];
-    winBin[1] = new uintWinBin [P->winBinN];      
+    winBin[1] = new uintWinBin [P->winBinN];
     memset(winBin[0],255,sizeof(winBin[0][0])*P->winBinN);
     memset(winBin[1],255,sizeof(winBin[0][0])*P->winBinN);
-    
+
     //RNGs
     rngMultOrder.seed(P->runRNGseed*(iChunk+1));
-    rngUniformReal0to1=std::uniform_real_distribution<double> (0.0, 1.0);    
-    
+    rngUniformReal0to1=std::uniform_real_distribution<double> (0.0, 1.0);
+
     //transcriptome
     if ( P->quant.trSAM.yes ) {
         alignTrAll=new Transcript [P->alignTranscriptsPerReadNmax];
     };
-    
+
 //     statsRA=new StatsAll;
-    
+
     //split
     splitR=new uint*[3];
     splitR[0]=new uint[P->maxNsplit]; splitR[1]=new uint[P->maxNsplit]; splitR[2]=new uint[P->maxNsplit];
-    
+
     //alignments
     PC=new uiPC[P->seedPerReadNmax];
     WC=new uiWC[P->alignWindowsPerReadNmax];
-  
+
     nWA=new uint[P->alignWindowsPerReadNmax];
     nWAP=new uint[P->alignWindowsPerReadNmax];
     WALrec=new uint[P->alignWindowsPerReadNmax];
@@ -51,33 +51,33 @@ ReadAlign::ReadAlign (Parameters* Pin, const Genome &genomeIn, Transcriptome *Tr
 //         P->swHsize=5000000000LLU;
 //         swT = new char [P->swHsize];
 //     };
-    
+
     scoreSeedToSeed = new intScore [P->seedPerWindowNmax*(P->seedPerWindowNmax+1)/2];
     scoreSeedBest = new intScore [P->seedPerWindowNmax];
     scoreSeedBestInd = new uint [P->seedPerWindowNmax];
     scoreSeedBestMM = new uint [P->seedPerWindowNmax];
     seedChain = new uint [P->seedPerWindowNmax];
-    
+
 #endif
-    
+
     WA=new uiWA*[P->alignWindowsPerReadNmax];
     for (uint ii=0;ii<P->alignWindowsPerReadNmax;ii++) WA[ii]=new uiWA[P->seedPerWindowNmax];
 
-    WAincl = new bool [P->seedPerWindowNmax];    
-   
+    WAincl = new bool [P->seedPerWindowNmax];
+
     trAll = new Transcript**[P->alignWindowsPerReadNmax+1];
 
     nWinTr = new uint[P->alignWindowsPerReadNmax];
-    
+
     trArray = new Transcript[P->alignTranscriptsPerReadNmax];
     trArrayPointer =  new Transcript*[P->alignTranscriptsPerReadNmax];
     for (uint ii=0;ii<P->alignTranscriptsPerReadNmax;ii++) trArrayPointer[ii]= &(trArray[ii]);
-    
-    
+
+
     trInit = new Transcript;
-    
+
     //read
-    Read0 = new char*[2];    
+    Read0 = new char*[2];
     Read0[0]  = new char [DEF_readSeqLengthMax+1];
     Read0[1]  = new char [DEF_readSeqLengthMax+1];
 
@@ -90,7 +90,7 @@ ReadAlign::ReadAlign (Parameters* Pin, const Genome &genomeIn, Transcriptome *Tr
         readNameMates[ii]=new char [DEF_readNameLengthMax];
     };
 
-    
+
     outBAMoneAlignNbytes = new uint [P->readNmates+2]; //extra piece for chimeric reads
     outBAMoneAlign = new char* [P->readNmates+2]; //extra piece for chimeric reads
     for (uint ii=0; ii<P->readNmates+2; ii++) {
@@ -98,15 +98,15 @@ ReadAlign::ReadAlign (Parameters* Pin, const Genome &genomeIn, Transcriptome *Tr
     };
 
 
-    
+
     readName = readNameMates[0];
     Read1 = new char*[3];
-    Read1[0]=new char[DEF_readSeqLengthMax+1]; Read1[1]=new char[DEF_readSeqLengthMax+1]; Read1[2]=new char[DEF_readSeqLengthMax+1];    
+    Read1[0]=new char[DEF_readSeqLengthMax+1]; Read1[1]=new char[DEF_readSeqLengthMax+1]; Read1[2]=new char[DEF_readSeqLengthMax+1];
     Qual1=new char*[2]; //modified QSs for scoring
     Qual1[0]=new char[DEF_readSeqLengthMax+1]; Qual1[1]=new char[DEF_readSeqLengthMax+1];
-    
+
     resetN();
-    
+
 };
 
 void ReadAlign::resetN () {//reset resets the counters to 0 for a new read
@@ -116,21 +116,21 @@ void ReadAlign::resetN () {//reset resets the counters to 0 for a new read
     nUM[0]=0;nUM[1]=0;
     storedLmin=0; uniqLmax=0; uniqLmaxInd=0; multLmax=0; multLmaxN=0; multNminL=0; multNmin=0; multNmax=0; multNmaxL=0;
     chimN=0;
-    
+
     for (uint ii=0; ii<P->readNmates; ii++) {
         maxScoreMate[ii]=0;
     };
-    
+
 //     for (uint ii=0;ii<P->alignTranscriptsPerReadNmax;ii++) trArrayPointer[ii]= &(trArray[ii]);
-    
+
 };
 
 void ReadAlign::outTxtMain(ofstream* outTxt, Transcript& t) {
-    
+
     *outTxt << setw(10) << iRead+1 << setw(7) << nTr <<"   "\
             << setw(7) << t.roStart << setw(7) << t.rLength << setw(12) <<  nW  << setw(10)<< mapMarker  << "\t" << t.maxScore << setw(7) << nextWinScore << setw(7) << t.nextTrScore <<"   " \
             << setw(7) << t.nMatch  << setw(7) << t.nMM <<"   "\
             << setw(7) << t.nGap  << setw(10) << t.lGap << setw(7) << t.nDel << setw(7) << t.lDel;
-    
-    *outTxt << "\n"; 
+
+    *outTxt << "\n";
 };
diff --git a/source/ReadAlign.h b/source/ReadAlign.h
index aed1d97..a6a2e05 100644
--- a/source/ReadAlign.h
+++ b/source/ReadAlign.h
@@ -13,24 +13,24 @@
 #include "Quantifications.h"
 #include <random>
 
-class ReadAlign : public Genome 
+class ReadAlign : public Genome
 {
     public:
         Parameters* P; //pointer to the parameters, will be initialized on construction
-          
+
         //mapping statistics
         Stats statsRA;
-        
+
         //quantification
         Transcriptome *chunkTr;
-        
+
         //mapping time
         time_t timeStart, timeFinish;
-        
+
         //random number generators
         std::mt19937 rngMultOrder;//initialize in ReadAlign.cpp
         std::uniform_real_distribution<double> rngUniformReal0to1;//initialize in ReadAlign.cpp
-        
+
         //input,output
         istream* readInStream[MAX_N_MATES];
         ostream* outSAMstream;
@@ -43,21 +43,21 @@ class ReadAlign : public Genome
 //        uint outBAMoneAlignNbytes[MAX_N_MATES];//number of bytes in the tmp BAM array
         char** outBAMoneAlign;
         uint* outBAMoneAlignNbytes;
-        
+
         ostringstream samStreamCIGAR, samStreamSJmotif, samStreamSJintron,samStreamSJannot;
-        
+
         intScore maxScoreMate[MAX_N_MATES];
         intScore *scoreSeedToSeed, *scoreSeedBest;
         uint *scoreSeedBestInd, *seedChain, *scoreSeedBestMM;
-        
+
         bool outFilterPassed; //true if alignment passed all filter and is output to SAM/BAM
-        
+
 //         StatsAll *statsRA;
-        
+
         //transcript
         Transcript* trArray; //linear array of transcripts to store all of them from all windows
-        Transcript** trArrayPointer; //linear array of transcripts to store all of them from all windows            
-        
+        Transcript** trArrayPointer; //linear array of transcripts to store all of them from all windows
+
         //read
         uint iRead, iReadAll, iMate, readFilesIndex;
         char readFilter; //Illumina not passed Y/N
@@ -66,7 +66,7 @@ class ReadAlign : public Genome
         uint clip3pNtotal[MAX_N_MATES], clip5pNtotal[MAX_N_MATES], clip3pAdapterN[MAX_N_MATES]; //total number of trimmed bases from 5p,3p
         int readFileType; //file type: 1=fasta; 2=fastq
         uint outFilterMismatchNmaxTotal;
-        
+
         char dummyChar[4096];
         char** Read0;
         char** Qual0;
@@ -74,59 +74,59 @@ class ReadAlign : public Genome
         char* readName;
         char** Read1;
         char** Qual1; //modified QSs for scoring
-        
-        //split            
+
+        //split
         uint** splitR;
         uint Nsplit;
-        
+
 //         uint fragLength[MAX_N_FRAG], fragStart[MAX_N_FRAG]; //fragment Lengths and Starts in read space
-        
+
         //binned alignments
         uintWinBin **winBin; //binned genome: window ID (number) per bin
-        
+
         //alignments
         uiPC *PC; //pieces coordinates
-        uiWC *WC; //windows coordinates        
+        uiWC *WC; //windows coordinates
         uiWA **WA; //aligments per window
-        
+
         int unmapType; //marker for why a read is unmapped
-        
+
         uint mapMarker; //alignment marker (typically, if there is something wrong)
-        uint nA, nP, nW, nWall, nUM[2]; //number of all alignments,  pieces, windows, U/M, 
+        uint nA, nP, nW, nWall, nUM[2]; //number of all alignments,  pieces, windows, U/M,
         uint *nWA, *nWAP, *WALrec, *WlastAnchor; //number of alignments per window, per window per piece, min recordable length per window
         bool *WAincl; //alginment inclusion mask
-        
+
         uint *swWinCov, *swWinGleft, *swWinGright, *swWinRleft, *swWinRright; //read coverage per window
         char *swT;
-        
+
         uint storedLmin, uniqLmax, uniqLmaxInd, multLmax, multLmaxN, multNmin, multNminL, multNmax, multNmaxL;
         uint nTr, nTrMate; // number of transcripts called
         intScore maxScore, nextWinScore;//maximum alignment score, next best score
-        
+
         uint chimN, chimRepeat, chimStr, chimMotif;
         Transcript trChim[MAX_N_CHIMERAS];
-        
+
         Transcript trA, trA1, *trBest, *trNext, *trInit; //transcript, best tr, next best tr, initialized tr
         Transcript ***trAll; //all transcripts for all windows
         uint *nWinTr; //number of recorded transcripts per window
-        
+
         Transcript *alignC, *extendC, *polyAtailC; //alignment rules/conditions
-        
+
         Transcript* trMult[MAX_N_MULTMAP];//multimapping transcripts
-        Transcript *alignTrAll;//alignments to transcriptome       
-        
+        Transcript *alignTrAll;//alignments to transcriptome
+
         ReadAlign (Parameters* Pin, const Genome &genomeIn, Transcriptome *TrIn, int iChunk);//allocate arrays
         void resetN();//resets the counters to 0
         void multMapSelect();
         int mapOneRead();
         uint maxMappableLength2strands(uint pieceStart, uint pieceLength, uint iDir, uint iSA1, uint iSA2, uint& maxL, uint iFrag);
         void storeAligns (uint iDir, uint Shift, uint Nrep, uint L, uint indStartEnd[2], uint iFrag);
-        
+
         bool outputTranscript(Transcript *trOut, uint nTrOut, ofstream *outBED);
         uint outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint mateChr, uint mateStart, char mateStrand, int unmapType, bool *mateMapped, ostream *outStream);
         int alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint trChrStart, uint mateChr, uint mateStart, char mateStrand, int unmapType, bool *mateMapped, vector<int> outSAMattrOrder, char** outBAMarray, uint* outBAMarrayN);
         void samAttrNM_MD (Transcript const &trOut, uint iEx1, uint iEx2, uint &tagNM, string &tagMD);
-        
+
         void outputTranscriptSJ(Transcript const &trOut, uint nTrOut, OutSJ *outStream, uint sjReadStartN );
         string outputTranscriptCIGARp(Transcript const &trOut);
         void outTxtMain(ofstream*,Transcript&);
@@ -135,8 +135,8 @@ class ReadAlign : public Genome
         void stitchPieces(char **R, char **Q, char *G, PackedArray& SA, uint Lread);
         bool chimericDetection();
         void outputAlignments();
-        void stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char* G);//stitches all seeds in one window: iW
-        
+        void stitchWindowSeeds (uint iW, uint iWrec, bool *WAexcl, char *R, char *Q, char *G);//stitches all seeds in one window: iW
+
         int oneRead();
         uint quantTranscriptome (Transcriptome *Tr, uint nAlignG, Transcript **alignG, Transcript *alignT);
 };
diff --git a/source/ReadAlignChunk.cpp b/source/ReadAlignChunk.cpp
index 26f4eea..9288fa7 100644
--- a/source/ReadAlignChunk.cpp
+++ b/source/ReadAlignChunk.cpp
@@ -3,7 +3,7 @@
 #include "ErrorWarning.h"
 
 ReadAlignChunk::ReadAlignChunk(Parameters* Pin, Genome &genomeIn, Transcriptome *TrIn, int iChunk) : P(Pin) {//initialize chunk
-    
+
     iThread=iChunk;
 
     if ( P->quant.yes ) {//allocate transcriptome structures
@@ -11,12 +11,12 @@ ReadAlignChunk::ReadAlignChunk(Parameters* Pin, Genome &genomeIn, Transcriptome
         chunkTr->quantsAllocate();
     } else {
         chunkTr=NULL;
-    };   
-    
+    };
+
     RA = new ReadAlign(P, genomeIn, chunkTr, iChunk);//new local copy of RA for each chunk
-   
+
     RA->iRead=0;
-    
+
     chunkIn=new char* [P->readNmates];
     readInStream=new istringstream* [P->readNmates];
 //     readInStream=new istringstream* [P->readNmates];
@@ -27,8 +27,8 @@ ReadAlignChunk::ReadAlignChunk(Parameters* Pin, Genome &genomeIn, Transcriptome
        readInStream[ii]->rdbuf()->pubsetbuf(chunkIn[ii],P->chunkInSizeBytesArray);
        RA->readInStream[ii]=readInStream[ii];
     };
-    
-    
+
+
     if (P->outSAMbool) {
         chunkOutBAM=new char [P->chunkOutBAMsizeBytes];
         RA->outBAMarray=chunkOutBAM;
@@ -38,7 +38,7 @@ ReadAlignChunk::ReadAlignChunk(Parameters* Pin, Genome &genomeIn, Transcriptome
         RA->outSAMstream->seekp(0,ios::beg);
         chunkOutBAMtotal=0;
     };
-    
+
     if (P->outBAMunsorted) {
         chunkOutBAMunsorted = new BAMoutput (P->inOut->outBAMfileUnsorted, P);
         RA->outBAMunsorted = chunkOutBAMunsorted;
@@ -46,34 +46,34 @@ ReadAlignChunk::ReadAlignChunk(Parameters* Pin, Genome &genomeIn, Transcriptome
         chunkOutBAMunsorted=NULL;
         RA->outBAMunsorted=NULL;
     };
-    
+
     if (P->outBAMcoord) {
         chunkOutBAMcoord = new BAMoutput (iChunk, P->outBAMsortTmpDir, P);
         RA->outBAMcoord = chunkOutBAMcoord;
     } else {
         chunkOutBAMcoord=NULL;
         RA->outBAMcoord=NULL;
-    };    
-    
+    };
+
     if ( P->quant.trSAM.yes ) {
         chunkOutBAMquant = new BAMoutput (P->inOut->outQuantBAMfile,P);
         RA->outBAMquant = chunkOutBAMquant;
     } else {
         chunkOutBAMquant=NULL;
         RA->outBAMquant=NULL;
-    };         
+    };
 
     chunkOutSJ=new OutSJ (P->limitOutSJcollapsed, P);
     chunkOutSJ1=new OutSJ (P->limitOutSJcollapsed, P);
 
     RA->chunkOutSJ=chunkOutSJ;
     RA->chunkOutSJ1=chunkOutSJ1;
-    
+
     if (P->chimSegmentMin>0) {
         chunkFstreamOpen(P->outFileTmp + "/Chimeric.out.sam.thread", iChunk, RA->chunkOutChimSAM);
-        chunkFstreamOpen(P->outFileTmp + "/Chimeric.out.junction.thread", iChunk, RA->chunkOutChimJunction);   
+        chunkFstreamOpen(P->outFileTmp + "/Chimeric.out.junction.thread", iChunk, RA->chunkOutChimJunction);
     };
-    if (P->outReadsUnmapped=="Fastx" ) {    
+    if (P->outReadsUnmapped=="Fastx" ) {
         chunkFstreamOpen(P->outFileTmp + "/Unmapped.out.mate1.thread",iChunk, RA->chunkOutUnmappedReadsStream[0]);
         if (P->readNmates==2) chunkFstreamOpen(P->outFileTmp + "/Unmapped.out.mate2.thread",iChunk, RA->chunkOutUnmappedReadsStream[1]);
     };
@@ -89,7 +89,7 @@ void ReadAlignChunk::chunkFstreamOpen(string filePrefix, int iChunk, fstream &fs
     fNameStream1 << filePrefix << iChunk;
     string fName1=fNameStream1.str();
     P->inOut->logMain << "Opening the file: " << fName1 << " ... " <<flush;
-    
+
     remove(fName1.c_str()); //remove the file
     fstreamOut.open(fName1.c_str(),ios::out); //create empty file
     fstreamOut.close();
@@ -99,8 +99,8 @@ void ReadAlignChunk::chunkFstreamOpen(string filePrefix, int iChunk, fstream &fs
         P->inOut->logMain << "failed!\n";
         ostringstream errOut;
         errOut << "EXITING because of FATAL ERROR: could not create output file "<< fName1 << "\n";
-        errOut << "Solution: check that you have permission to write this file\n";        
-        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);        
+        errOut << "Solution: check that you have permission to write this file\n";
+        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
     };
     P->inOut->logMain << "ok" <<endl;
 };
@@ -111,6 +111,8 @@ void ReadAlignChunk::chunkFstreamCat (fstream &chunkOut, ofstream &allOut, bool
     if (mutexFlag) pthread_mutex_lock(&mutexVal);
     allOut << chunkOut.rdbuf();
     allOut.clear();
+    allOut.flush();
+    allOut.clear();
     if (mutexFlag) pthread_mutex_unlock(&mutexVal);
     chunkOut.clear();
     chunkOut.seekp(0,ios::beg); //set put pointer at the beginning
@@ -128,7 +130,7 @@ void ReadAlignChunk::chunkFilesCat(ostream *allOut, string filePrefix, uint &iC)
                     allOut->clear();
                     fileChunkIn.close();
                     fileChunkIn.clear();
-                    remove(name1.str().c_str());    
+                    remove(name1.str().c_str());
                     iC++;
                 } else {
                     fileChunkIn.close();
diff --git a/source/ReadAlignChunk.h b/source/ReadAlignChunk.h
index 5d68f06..eeef68b 100644
--- a/source/ReadAlignChunk.h
+++ b/source/ReadAlignChunk.h
@@ -15,25 +15,25 @@ public:
     ReadAlign* RA;
 
     Transcriptome *chunkTr;
-    
+
     char **chunkIn; //space for the chunk of input reads
     char *chunkOutBAM, *chunkOutBAM1;//space for the chunk of output SAM
     OutSJ *chunkOutSJ, *chunkOutSJ1;
 
     BAMoutput *chunkOutBAMcoord, *chunkOutBAMunsorted, *chunkOutBAMquant;
     Quantifications *chunkQuants;
-    
+
     istringstream** readInStream;
     ostringstream*  chunkOutBAMstream;
     ofstream chunkOutBAMfile;
     string chunkOutBAMfileName;
-    
+
     bool noReadsLeft;
     uint iChunkIn; //current chunk # as read from .fastq
     uint iChunkOutSAM; //current chunk # writtedn to Aligned.out.sam
     int iThread; //current thread
     uint chunkOutBAMtotal, chunkOutBAMtotal1; //total number of bytes in the write buffer
-            
+
     ReadAlignChunk(Parameters* Pin, Genome &genomeIn, Transcriptome *TrIn, int iChunk);
     void processChunks();
     void mapChunk();
diff --git a/source/ReadAlignChunk_mapChunk.cpp b/source/ReadAlignChunk_mapChunk.cpp
index 30dbca4..fdeef52 100644
--- a/source/ReadAlignChunk_mapChunk.cpp
+++ b/source/ReadAlignChunk_mapChunk.cpp
@@ -5,20 +5,20 @@
 #include SAMTOOLS_BGZF_H
 
 void ReadAlignChunk::mapChunk() {//map one chunk. Input reads stream has to be setup in RA->readInStream[ii]
-    RA->statsRA.resetN();       
-    
+    RA->statsRA.resetN();
+
     for (uint ii=0;ii<P->readNmates;ii++) {//clear eof and rewind the input streams
         RA->readInStream[ii]->clear();
         RA->readInStream[ii]->seekg(0,ios::beg);
     };
-    
+
     if ( P->outSAMorder == "PairedKeepInputOrder" && P->runThreadN>1 ) {//open chunk file
         ostringstream name1("");
         name1 << P->outFileTmp + "/Aligned.tmp.sam.chunk"<<iChunkIn;
         chunkOutBAMfileName = name1.str();
         chunkOutBAMfile.open(chunkOutBAMfileName.c_str());
-    };    
-    
+    };
+
     int readStatus=0;
     while (readStatus==0) {//main cycle over all reads
 
@@ -29,63 +29,63 @@ void ReadAlignChunk::mapChunk() {//map one chunk. Input reads stream has to be s
 //         chunkOutBAMtotal=(uint) RA->outSAMstream->tellp();
             chunkOutBAMtotal+=RA->outBAMbytes;
             chunkOutBAMtotal1+=RA->outBAMbytes1;
-//             uint ddd=(uint) RA->outSAMstream->tellp();            
+//             uint ddd=(uint) RA->outSAMstream->tellp();
         };
 
-        //write SAM aligns to chunk buffer 
+        //write SAM aligns to chunk buffer
         if (P->outSAMbool) {
             if ( chunkOutBAMtotal > P->chunkOutBAMsizeBytes ) {//this should not happen!
                 ostringstream errOut;
                 errOut <<"EXITING because of fatal error: buffer size for SAM/BAM output is too small\n";
                 errOut <<"Solution: increase input parameter --limitOutSAMoneReadBytes\n";
-                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);                      
+                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
             } else if ( chunkOutBAMtotal + P->limitOutSAMoneReadBytes > P->chunkOutBAMsizeBytes || (readStatus==-1 && noReadsLeft) ) {//write buffer to disk because it's almost full, or all reads are mapped
                 if ( P->outSAMorder == "PairedKeepInputOrder" && P->runThreadN>1 ) {//output chunks into separate files
                     chunkOutBAMfile.write(chunkOutBAM,chunkOutBAMtotal);
                     chunkOutBAMfile.clear(); //in case 0 bytes were written which could set fail bit
                 } else {//standard way, directly into Aligned.out.sam file
                     //SAM output
-                    if (P->runThreadN>1) pthread_mutex_lock(&g_threadChunks.mutexOutSAM);    
+                    if (P->runThreadN>1) pthread_mutex_lock(&g_threadChunks.mutexOutSAM);
                     P->inOut->outSAM->write(chunkOutBAM,chunkOutBAMtotal);
                     P->inOut->outSAM->clear();//in case 0 bytes were written which could set fail bit
                     if (P->runThreadN>1) pthread_mutex_unlock(&g_threadChunks.mutexOutSAM);
                 };
                 RA->outSAMstream->seekp(0,ios::beg); //rewind the chunk storage
                 chunkOutBAMtotal=0;
-            }; 
+            };
         };
-        
+
         //collapse SJ buffer if needed
         if ( chunkOutSJ->N > P->limitOutSJcollapsed ) {//this means the number of collapsed junctions is larger than the chunks size
             ostringstream errOut;
             errOut <<"EXITING because of fatal error: buffer size for SJ output is too small\n";
             errOut <<"Solution: increase input parameter --limitOutSJoneRead\n";
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);                      
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         } else if ( chunkOutSJ->N + P->limitOutSJoneRead > P->limitOutSJcollapsed || (readStatus==-1 && noReadsLeft) ) {//write buffer to disk because it's almost full, or all reads are mapped
             chunkOutSJ->collapseSJ();
             if ( chunkOutSJ->N + 2*P->limitOutSJoneRead > P->limitOutSJcollapsed ) {
                 ostringstream errOut;
                 errOut <<"EXITING because of fatal error: buffer size for SJ output is too small\n";
                 errOut <<"Solution: increase input parameter --limitOutSJcollapsed\n";
-                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);                      
+                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
             };
-        };            
+        };
 
         //collapse SJ1 buffer if needed
         if ( chunkOutSJ1->N > P->limitOutSJcollapsed ) {//this means the number of collapsed junctions is larger than the chunks size
             ostringstream errOut;
             errOut <<"EXITING because of fatal error: buffer size for SJ output is too small\n";
             errOut <<"Solution: increase input parameter --limitOutSJoneRead\n";
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);                      
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         } else if ( chunkOutSJ1->N + P->limitOutSJoneRead > P->limitOutSJcollapsed || (readStatus==-1 && noReadsLeft) ) {//write buffer to disk because it's almost full, or all reads are mapped
             chunkOutSJ1->collapseSJ();
             if ( chunkOutSJ1->N + 2*P->limitOutSJoneRead > P->limitOutSJcollapsed ) {
                 ostringstream errOut;
                 errOut <<"EXITING because of fatal error: buffer size for SJ output is too small\n";
                 errOut <<"Solution: increase input parameter --limitOutSJcollapsed\n";
-                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);                      
+                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
             };
-        };            
+        };
 
     }; //reads cycle
 
@@ -96,13 +96,13 @@ void ReadAlignChunk::mapChunk() {//map one chunk. Input reads stream has to be s
         RA->outSAMstream->seekp(0,ios::beg); //rewind the chunk storage
         chunkOutBAMtotal=0;
         ostringstream name2("");
-        name2 << P->outFileTmp + "/Aligned.out.sam.chunk"<<iChunkIn;                
+        name2 << P->outFileTmp + "/Aligned.out.sam.chunk"<<iChunkIn;
         rename(chunkOutBAMfileName.c_str(),name2.str().c_str());//marks files as completedly written
-    };    
-    
+    };
+
     //add stats, write progress if needed
     if (P->runThreadN>1) pthread_mutex_lock(&g_threadChunks.mutexStats);
     g_statsAll.addStats(RA->statsRA);
     g_statsAll.progressReport(P->inOut->logProgress);
-    if (P->runThreadN>1) pthread_mutex_unlock(&g_threadChunks.mutexStats); 
-};            
+    if (P->runThreadN>1) pthread_mutex_unlock(&g_threadChunks.mutexStats);
+};
diff --git a/source/ReadAlignChunk_processChunks.cpp b/source/ReadAlignChunk_processChunks.cpp
index 3bdef50..f40f470 100644
--- a/source/ReadAlignChunk_processChunks.cpp
+++ b/source/ReadAlignChunk_processChunks.cpp
@@ -3,9 +3,9 @@
 #include "ThreadControl.h"
 #include "ErrorWarning.h"
 
-void ReadAlignChunk::processChunks() {//read-map-write chunks  
+void ReadAlignChunk::processChunks() {//read-map-write chunks
     noReadsLeft=false; //true if there no more reads left in the file
-    
+
     while (!noReadsLeft) {//continue until the input EOF
             //////////////read a chunk from input files and store in memory
         if (P->outFilterBySJoutStage<2) {//read chunks from input file
@@ -19,10 +19,10 @@ void ReadAlignChunk::processChunks() {//read-map-write chunks
                     break;
                 } else if (nextChar=='@') {//fastq, not multi-line
                     P->iReadAll++; //increment read number
-                    for (uint imate=0; imate<P->readNmates; imate++) {//for all mates           
+                    for (uint imate=0; imate<P->readNmates; imate++) {//for all mates
                         uint32 iline=0;
-                        if (P->outFilterBySJoutStage!=2) {//not the 2nd stage of the 2-stage mapping                        
-                            
+                        if (P->outFilterBySJoutStage!=2) {//not the 2nd stage of the 2-stage mapping
+
                             //read or skip the 1st field of the read name line
                             if (P->outSAMreadID=="Number") {
                                 chunkInSizeBytesTotal[imate] += sprintf(chunkIn[imate] + chunkInSizeBytesTotal[imate], "@%llu", P->iReadAll);
@@ -32,7 +32,7 @@ void ReadAlignChunk::processChunks() {//read-map-write chunks
                                 P->inOut->readIn[imate] >> (chunkIn[imate] + chunkInSizeBytesTotal[imate]);
                                 chunkInSizeBytesTotal[imate] += strlen(chunkIn[imate] + chunkInSizeBytesTotal[imate]);
                             };
-                            
+
                             //read the second field of the read name line
                             char passFilterIllumina='N';
                             if (P->inOut->readIn[imate].peek()!='\n') {//2nd field exists
@@ -41,28 +41,28 @@ void ReadAlignChunk::processChunks() {//read-map-write chunks
                                 passFilterIllumina='N';
                                 if (field2.length()>=3 && field2.at(2)=='Y') passFilterIllumina='Y';
                             };
-                            
+
                             //ignore the rest of the read name
                             P->inOut->readIn[imate].ignore(DEF_readNameSeqLengthMax,'\n');
 
                             chunkInSizeBytesTotal[imate] += sprintf(chunkIn[imate] + chunkInSizeBytesTotal[imate], " %llu %c %i \n", P->iReadAll, passFilterIllumina, P->readFilesIndex);
-                            
+
                             iline=1;
                         };
                         //do not need to worry about 2nd stage, that's read directly from the files
 //                         else {//2nd stage of 2-stage mapping
 //                         read index and file index are already recorded with the read name, simply copy it
-//                         P->inOut->readIn[imate].getline(chunkIn[imate] + chunkInSizeBytesTotal[imate], DEF_readNameSeqLengthMax+1 );                            
+//                         P->inOut->readIn[imate].getline(chunkIn[imate] + chunkInSizeBytesTotal[imate], DEF_readNameSeqLengthMax+1 );
 //                         };
                         for (;iline<4;iline++) {//TODO ignore the 3rd line of fastq
                             P->inOut->readIn[imate].getline(chunkIn[imate] + chunkInSizeBytesTotal[imate], DEF_readNameSeqLengthMax+1 );
                             chunkInSizeBytesTotal[imate] += P->inOut->readIn[imate].gcount();
-                            chunkIn[imate][chunkInSizeBytesTotal[imate]-1]='\n';                        
+                            chunkIn[imate][chunkInSizeBytesTotal[imate]-1]='\n';
                         };
                     };
                 } else if (nextChar=='>') {//fasta, can be multiline, which is converted to single line
                     for (uint imate=0; imate<P->readNmates; imate++) {
-                        if (P->outFilterBySJoutStage!=2) {//not the 2nd stage of the 2-stage mapping                        
+                        if (P->outFilterBySJoutStage!=2) {//not the 2nd stage of the 2-stage mapping
 
                             if (P->outSAMreadID=="Number") {
                                 chunkInSizeBytesTotal[imate] += sprintf(chunkIn[imate] + chunkInSizeBytesTotal[imate], ">%llu", P->iReadAll);
@@ -70,29 +70,29 @@ void ReadAlignChunk::processChunks() {//read-map-write chunks
                                 P->inOut->readIn[imate] >> (chunkIn[imate] + chunkInSizeBytesTotal[imate]);
                                 chunkInSizeBytesTotal[imate] += strlen(chunkIn[imate] + chunkInSizeBytesTotal[imate]);
                             };
-                            
+
                             P->inOut->readIn[imate].ignore(DEF_readNameSeqLengthMax,'\n');
 
                             chunkInSizeBytesTotal[imate] += sprintf(chunkIn[imate] + chunkInSizeBytesTotal[imate], " %llu %c %i \n", P->iReadAll, 'N', P->readFilesIndex);
-                            
-                            
+
+
                         };
 //                         else {//2nd stage of 2-stage mapping
 //                         read index and file index are already recorded with the read name, simply copy it
-//                         P->inOut->readIn[imate].getline(chunkIn[imate] + chunkInSizeBytesTotal[imate], DEF_readNameSeqLengthMax+1 );                            
-//                         };                        
-                        nextChar=P->inOut->readIn[imate].peek();                        
+//                         P->inOut->readIn[imate].getline(chunkIn[imate] + chunkInSizeBytesTotal[imate], DEF_readNameSeqLengthMax+1 );
+//                         };
+                        nextChar=P->inOut->readIn[imate].peek();
                         while (nextChar!='@' && nextChar!='>' && nextChar!=' ' && nextChar!='\n' && P->inOut->readIn[imate].good()) {//read multi-line fasta
                             P->inOut->readIn[imate].getline(chunkIn[imate] + chunkInSizeBytesTotal[imate], DEF_readSeqLengthMax + 1 );
                             if (P->inOut->readIn[imate].gcount()<2) break; //no more input
-                            chunkInSizeBytesTotal[imate] += P->inOut->readIn[imate].gcount()-1;   
+                            chunkInSizeBytesTotal[imate] += P->inOut->readIn[imate].gcount()-1;
                             nextChar=P->inOut->readIn[imate].peek();
                         };
-                        chunkIn[imate][chunkInSizeBytesTotal[imate]]='\n'; 
-                        chunkInSizeBytesTotal[imate] ++;   
-                    };                    
+                        chunkIn[imate][chunkInSizeBytesTotal[imate]]='\n';
+                        chunkInSizeBytesTotal[imate] ++;
+                    };
                 } else if (nextChar==' ' || nextChar=='\n' || !P->inOut->readIn[0].good()) {//end of stream
-                    P->inOut->logMain << "Thread #" <<iThread <<" end of input stream, nextChar="<<int(nextChar) <<endl;                    
+                    P->inOut->logMain << "Thread #" <<iThread <<" end of input stream, nextChar="<<int(nextChar) <<endl;
                     break;
                 } else {
                     string word1;
@@ -106,14 +106,14 @@ void ReadAlignChunk::processChunks() {//read-map-write chunks
                             P->inOut->readIn[imate].ignore(numeric_limits<streamsize>::max(),'\n');
                         };
                         P->inOut->logMain<<flush;
-                        pthread_mutex_unlock(&g_threadChunks.mutexLogMain);                        
+                        pthread_mutex_unlock(&g_threadChunks.mutexLogMain);
 //                         if (P->readNmates==2) {//skip the FILE line for the second read
 //                             getline(P->inOut->readIn[1],word1);
 //                         };
                     } else {//error
                         ostringstream errOut;
                         errOut << ERROR_OUT <<" EXITING because of FATAL ERROR in input reads: unknown file format: the read ID should start with @ or > \n";
-                        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);       
+                        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
                     };
                 };
             };
@@ -121,9 +121,9 @@ void ReadAlignChunk::processChunks() {//read-map-write chunks
             if (chunkInSizeBytesTotal[0]==0) {
                 noReadsLeft=true; //true if there no more reads left in the file
                 iChunkIn=g_threadChunks.chunkInN;//to keep things consistent
-                g_threadChunks.chunkInN++;                
+                g_threadChunks.chunkInN++;
             } else {
-                noReadsLeft=false; 
+                noReadsLeft=false;
                 iChunkIn=g_threadChunks.chunkInN;
                 g_threadChunks.chunkInN++;
             };
@@ -131,7 +131,7 @@ void ReadAlignChunk::processChunks() {//read-map-write chunks
             for (uint imate=0; imate<P->readNmates; imate++) chunkIn[imate][chunkInSizeBytesTotal[imate]]='\n';//extra empty line at the end of the chunks
 
             if (P->runThreadN>1) pthread_mutex_unlock(&g_threadChunks.mutexInRead);
-            
+
         } else {//read from one file per thread
             noReadsLeft=true;
             for (uint imate=0; imate<P->readNmates; imate++) {
@@ -140,27 +140,27 @@ void ReadAlignChunk::processChunks() {//read-map-write chunks
                 RA->readInStream[imate]=& RA->chunkOutFilterBySJoutFiles[imate];
             };
         };
-        
+
         mapChunk();
-                
+
         if (iThread==0 && P->runThreadN>1 && P->outSAMorder=="PairedKeepInputOrder") {//concatenate Aligned.* files
             chunkFilesCat(P->inOut->outSAM, P->outFileTmp + "/Aligned.out.sam.chunk", g_threadChunks.chunkOutN);
         };
-        
+
     };//cycle over input chunks
-    
-    if (P->outFilterBySJoutStage!=1 && RA->iRead>0) {//not the first stage of the 2-stage mapping 
+
+    if (P->outFilterBySJoutStage!=1 && RA->iRead>0) {//not the first stage of the 2-stage mapping
         if (P->outBAMunsorted) chunkOutBAMunsorted->unsortedFlush();
         if (P->outBAMcoord) chunkOutBAMcoord->coordFlush();
         if (chunkOutBAMquant!=NULL) chunkOutBAMquant->unsortedFlush();
-        
+
         //the thread is finished mapping reads, concatenate the temp files into output files
-        if (P->chimSegmentMin>0) {    
+        if (P->chimSegmentMin>0) {
             chunkFstreamCat (RA->chunkOutChimSAM, P->inOut->outChimSAM, P->runThreadN>1, g_threadChunks.mutexOutChimSAM);
             chunkFstreamCat (RA->chunkOutChimJunction, P->inOut->outChimJunction, P->runThreadN>1, g_threadChunks.mutexOutChimJunction);
         };
         if (P->outReadsUnmapped=="Fastx" ) {
-            for (uint ii=0;ii<P->readNmates;ii++) {    
+            for (uint ii=0;ii<P->readNmates;ii++) {
                 chunkFstreamCat (RA->chunkOutUnmappedReadsStream[ii],P->inOut->outUnmappedReadsStream[ii], P->runThreadN>1, g_threadChunks.mutexOutUnmappedFastx);
             };
         };
diff --git a/source/ReadAlign_alignBAM.cpp b/source/ReadAlign_alignBAM.cpp
index b7c1737..ad6e644 100644
--- a/source/ReadAlign_alignBAM.cpp
+++ b/source/ReadAlign_alignBAM.cpp
@@ -34,7 +34,7 @@ void ReadAlign::samAttrNM_MD (Transcript const &trOut, uint iEx1, uint iEx2, uin
                 tagNM+=trOut.exons[iex+1][EX_R]-trOut.exons[iex][EX_R]-trOut.exons[iex][EX_L];
             };
         };
-    };      
+    };
     tagMD+=to_string(matchN);
 };
 // calculate bin given an alignment covering [beg,end) (zero-based, half-close-half-open)
@@ -56,19 +56,19 @@ int bamAttrArrayWrite(int32 attr, const char* tagName, char* attrArray ) {
     return 3+sizeof(int32);
 };
 int bamAttrArrayWrite(char attr, const char* tagName, char* attrArray ) {
-    attrArray[0]=tagName[0];attrArray[1]=tagName[1];   
+    attrArray[0]=tagName[0];attrArray[1]=tagName[1];
     attrArray[2]='A';
     attrArray[3]=attr;
     return 3+sizeof(char);
 };
 int bamAttrArrayWrite(string &attr, const char* tagName, char* attrArray ) {
-    attrArray[0]=tagName[0];attrArray[1]=tagName[1];    
+    attrArray[0]=tagName[0];attrArray[1]=tagName[1];
     attrArray[2]='Z';
     memcpy(attrArray+3,attr.c_str(),attr.size()+1);//copy string data including \0
     return 3+attr.size()+1;
 };
 int bamAttrArrayWrite(vector<char> &attr, const char* tagName, char* attrArray ) {
-    attrArray[0]=tagName[0];attrArray[1]=tagName[1];    
+    attrArray[0]=tagName[0];attrArray[1]=tagName[1];
     attrArray[2]='B';
     attrArray[3]='c';
     *( (int32*) (attrArray+4))=attr.size();
@@ -76,7 +76,7 @@ int bamAttrArrayWrite(vector<char> &attr, const char* tagName, char* attrArray )
     return 4+sizeof(int32)+attr.size();
 };
 int bamAttrArrayWrite(vector<int32> &attr, const char* tagName, char* attrArray ) {
-    attrArray[0]=tagName[0];attrArray[1]=tagName[1];    
+    attrArray[0]=tagName[0];attrArray[1]=tagName[1];
     attrArray[2]='B';
     attrArray[3]='i';
     *( (int32*) (attrArray+4))=attr.size();
@@ -85,9 +85,10 @@ int bamAttrArrayWrite(vector<int32> &attr, const char* tagName, char* attrArray
 };
 
 template <typename intType>
-int bamAttrArrayWriteInt(intType x, const char* tagName, char* attrArray, Parameters *P) {//adapted from samtools
-    attrArray[0]=tagName[0];attrArray[1]=tagName[1];    
+int bamAttrArrayWriteInt(intType xIn, const char* tagName, char* attrArray, Parameters *P) {//adapted from samtools
+    attrArray[0]=tagName[0];attrArray[1]=tagName[1];
     #define ATTR_RECORD_INT(_intChar,_intType,_intValue) attrArray[2] = _intChar; *(_intType*)(attrArray+3) = (_intType) _intValue; return 3+sizeof(_intType)
+    int64 x = (int64) xIn;
     if (x < 0) {
         if (x >= -127) {
             ATTR_RECORD_INT('c',int8_t,x);
@@ -99,7 +100,7 @@ int bamAttrArrayWriteInt(intType x, const char* tagName, char* attrArray, Parame
                 ostringstream errOut;
                 errOut <<"EXITING because of FATAL BUG: integer out of range for BAM conversion: "<< x <<"\n";
                 errOut <<"SOLUTION: contact Alex Dobin at dobin at cshl.edu\n";
-                exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);   
+                exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);
             };
         };
     } else {
@@ -113,26 +114,26 @@ int bamAttrArrayWriteInt(intType x, const char* tagName, char* attrArray, Parame
                 ostringstream errOut;
                 errOut <<"EXITING because of FATAL BUG: integer out of range for BAM conversion: "<< x <<"\n";
                 errOut <<"SOLUTION: contact Alex Dobin at dobin at cshl.edu\n";
-                exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);   
+                exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);
             };
         };
-    };   
+    };
 };
-        
 
 
 
-int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint trChrStart, uint mateChr, uint mateStart, char mateStrand, int alignType, bool *mateMapped, vector<int> outSAMattrOrder, char** outBAMarray, uint* outBAMarrayN) {    
-    //return: number of lines (mates)   
- 
+
+int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint trChrStart, uint mateChr, uint mateStart, char mateStrand, int alignType, bool *mateMapped, vector<int> outSAMattrOrder, char** outBAMarray, uint* outBAMarrayN) {
+    //return: number of lines (mates)
+
     //alignType>=0: unmapped reads
     //          -1: normal mapped reads
     //          -11: chimeric alignment, chimeric junction on the left
     //          -12: chimeric alignment, chimeric junction on the right
-    
-    
+
+
     if (P->outSAMmode=="None") return 0; //no SAM/BAM output
-    
+
     uint32 recSize=0; //record size - total for both mates
     outBAMarrayN[0]=0;
     outBAMarrayN[1]=0;
@@ -141,11 +142,11 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
     uint iExMate=0; //last exon of the first mate
 
     uint16 samFLAG=0;
-    uint leftMate=0; //the mate (0 or 1) which is on the left    
+    uint leftMate=0; //the mate (0 or 1) which is on the left
 
-    bool flagPaired = P->readNmates==2;   
-    
-    uint nMates=1;    
+    bool flagPaired = P->readNmates==2;
+
+    uint nMates=1;
     if (alignType<0) {//mapped reads: SAM
         for (iExMate=0;iExMate<trOut.nExons-1;iExMate++) {
             if (trOut.canonSJ[iExMate]==-3){
@@ -158,10 +159,10 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
     };
 
     for (uint imate=0;imate < (alignType<0 ? nMates:P->readNmates);imate++) {
-            
+
         uint iEx1=0;
         uint iEx2=0;
-        uint Mate=0;        
+        uint Mate=0;
         uint Str=0;
         uint32 packedCIGAR[BAM_CIGAR_MaxSize];
         uint32 nCIGAR=0; //number of CIGAR operations
@@ -185,33 +186,33 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
                     mateStart=trOut.exons[0][EX_G] - trChrStart;
                     mateStrand= trOut.Str == (1-imate) ? 0 : 1;
 
-                    if (!trOut.primaryFlag) 
+                    if (!trOut.primaryFlag)
                     {//mapped mate is not primary
                         samFLAG+=0x100;
-                    };                      
-      
+                    };
+
                 } else {//mate unmapped
                     samFLAG+=0x8;
                 };
             };
 
             if (readFilter=='Y') samFLAG+=0x200; //not passing quality control
-            
+
             if (mateMapped[1-imate])
             {//mate is mapped, fill the infromation from trOut
-          
+
             };
-                            
+
             Mate=imate;
             Str=Mate;
-            
+
             attrN=0;
             attrN+=bamAttrArrayWriteInt(0,"NH",attrOutArray+attrN,P);
             attrN+=bamAttrArrayWriteInt(0,"HI",attrOutArray+attrN,P);
             attrN+=bamAttrArrayWriteInt(trOut.maxScore,"AS",attrOutArray+attrN,P);
             attrN+=bamAttrArrayWriteInt(trOut.nMM,"nM",attrOutArray+attrN,P);
             attrN+=bamAttrArrayWrite((to_string((uint) alignType)).at(0), "uT",attrOutArray+attrN); //cast to uint is only necessary for old compilers
-            if (!P->outSAMattrRG.empty()) attrN+=bamAttrArrayWrite(P->outSAMattrRG.at(readFilesIndex),"RG",attrOutArray+attrN);                        
+            if (!P->outSAMattrRG.empty()) attrN+=bamAttrArrayWrite(P->outSAMattrRG.at(readFilesIndex),"RG",attrOutArray+attrN);
 
         } else {//this mate is mapped
             if (flagPaired) {//paired reads
@@ -220,13 +221,13 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
                     if (mateChr>P->nChrReal) samFLAG+=0x0008; //not mapped as pair
                 } else {//properly paired
                     samFLAG+=0x0002; //mapped as pair
-                };                                 
+                };
             } else {//single end
                 samFLAG=0;
             };
 
             if (readFilter=='Y') samFLAG+=0x200; //not passing quality control
-            
+
             if (alignType==-11 || alignType==-12) {
                 samFLAG+=0x800; //mark chimeric alignments
             } else {//only non-chimeric alignments will be marked as non-primary, since chimeric are already marked with 0x800
@@ -235,7 +236,7 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
 
             iEx1 = (imate==0 ? 0 : iExMate+1);
             iEx2 = (imate==0 ? iExMate : trOut.nExons-1);
-            Mate=trOut.exons[iEx1][EX_iFrag];        
+            Mate=trOut.exons[iEx1][EX_iFrag];
             Str= trOut.Str;//note that Strand = the mate on the left
 
             if (Mate==0) {
@@ -243,14 +244,14 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
                 if (nMates==2) samFLAG += (1-Str)*0x20;
             } else {//second mate strand need to be reverted
                 samFLAG += (1-Str)*0x10;
-                if (nMates==2) samFLAG += Str*0x20;            
-            };        
+                if (nMates==2) samFLAG += Str*0x20;
+            };
 
             if (flagPaired) {
                 leftMate=Str;
                 samFLAG += (Mate==0 ? 0x0040 : 0x0080);
                 if (flagPaired && nMates==1 && mateStrand==1) samFLAG +=0x20;//revert strand using inout value of mateStrand (e.g. for chimeric aligns)
-            };        
+            };
 
 
             uint trimL;
@@ -268,8 +269,8 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
 
             trimL1 = trimL + trOut.exons[iEx1][EX_R] - (trOut.exons[iEx1][EX_R]<readLength[leftMate] ? 0 : readLength[leftMate]+1);
             if (trimL1>0) {
-                packedCIGAR[nCIGAR++]=trimL1<<BAM_CIGAR_OperationShift | (alignType==-11 ? BAM_CIGAR_H : BAM_CIGAR_S); 
-            };                      
+                packedCIGAR[nCIGAR++]=trimL1<<BAM_CIGAR_OperationShift | (alignType==-11 ? BAM_CIGAR_H : BAM_CIGAR_S);
+            };
 
             vector<int32> SJintron;
             vector<char> SJmotif;
@@ -280,32 +281,32 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
                     uint gapR=trOut.exons[ii][EX_R]-trOut.exons[ii-1][EX_R]-trOut.exons[ii-1][EX_L];
                     //it's possible to have a D or N and I at the same time
                     if (gapR>0){
-                          
-                        packedCIGAR[nCIGAR++]=gapR<<BAM_CIGAR_OperationShift | BAM_CIGAR_I; 
-                    };                
+
+                        packedCIGAR[nCIGAR++]=gapR<<BAM_CIGAR_OperationShift | BAM_CIGAR_I;
+                    };
                     if (trOut.canonSJ[ii-1]>=0 || trOut.sjAnnot[ii-1]==1) {//junction: N
 
-                        packedCIGAR[nCIGAR++]=gapG<<BAM_CIGAR_OperationShift | BAM_CIGAR_N; 
+                        packedCIGAR[nCIGAR++]=gapG<<BAM_CIGAR_OperationShift | BAM_CIGAR_N;
                         SJmotif.push_back(trOut.canonSJ[ii-1] + (trOut.sjAnnot[ii-1]==0 ? 0 : SJ_SAM_AnnotatedMotifShift)); //record junction type
                         SJintron.push_back((int32) (trOut.exons[ii-1][EX_G] + trOut.exons[ii-1][EX_L] + 1 - trChrStart) );//record intron start
                         SJintron.push_back((int32) (trOut.exons[ii][EX_G] - trChrStart)); //record intron end
                     } else if (gapG>0) {//deletion: N
-                        packedCIGAR[nCIGAR++]=gapG<<BAM_CIGAR_OperationShift | BAM_CIGAR_D;                     
+                        packedCIGAR[nCIGAR++]=gapG<<BAM_CIGAR_OperationShift | BAM_CIGAR_D;
                     };
-                };                
-                packedCIGAR[nCIGAR++]=trOut.exons[ii][EX_L]<<BAM_CIGAR_OperationShift | BAM_CIGAR_M;             
+                };
+                packedCIGAR[nCIGAR++]=trOut.exons[ii][EX_L]<<BAM_CIGAR_OperationShift | BAM_CIGAR_M;
             };
 
             if (SJmotif.size()==0) {//no junctions recorded, mark with -1
-                SJmotif.push_back(-1); 
-                SJintron.push_back(-1); 
+                SJmotif.push_back(-1);
+                SJintron.push_back(-1);
             };
 
             trimR1=(trOut.exons[iEx1][EX_R]<readLength[leftMate] ? \
                 readLengthOriginal[leftMate] : readLength[leftMate]+1+readLengthOriginal[Mate]) \
                 - trOut.exons[iEx2][EX_R]-trOut.exons[iEx2][EX_L] - trimL;
             if ( trimR1 > 0 ) {
-                packedCIGAR[nCIGAR++]=trimR1<<BAM_CIGAR_OperationShift | (alignType==-12 ? BAM_CIGAR_H : BAM_CIGAR_S);             
+                packedCIGAR[nCIGAR++]=trimR1<<BAM_CIGAR_OperationShift | (alignType==-12 ? BAM_CIGAR_H : BAM_CIGAR_S);
             };
 
             MAPQ=P->outSAMmapqUnique;
@@ -332,43 +333,43 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
                         break;
                     case ATTR_AS:
                         attrN+=bamAttrArrayWriteInt(trOut.maxScore,"AS",attrOutArray+attrN,P);
-                        break;                    
+                        break;
                     case ATTR_nM:
                         attrN+=bamAttrArrayWriteInt(trOut.nMM,"nM",attrOutArray+attrN,P);
-                        break;                            
+                        break;
                     case ATTR_jM:
-                        attrN+=bamAttrArrayWrite(SJmotif,"jM",attrOutArray+attrN);                    
-                        break;                            
+                        attrN+=bamAttrArrayWrite(SJmotif,"jM",attrOutArray+attrN);
+                        break;
                     case ATTR_jI:
-                        attrN+=bamAttrArrayWrite(SJintron,"jI",attrOutArray+attrN);                                        
+                        attrN+=bamAttrArrayWrite(SJintron,"jI",attrOutArray+attrN);
                         break;
                     case ATTR_XS:
                         if (trOut.sjMotifStrand==1) {
-                            attrN+=bamAttrArrayWrite('+',"XS",attrOutArray+attrN);                    
+                            attrN+=bamAttrArrayWrite('+',"XS",attrOutArray+attrN);
                         } else if (trOut.sjMotifStrand==2) {
-                            attrN+=bamAttrArrayWrite('-',"XS",attrOutArray+attrN);                    
-                        };                    
+                            attrN+=bamAttrArrayWrite('-',"XS",attrOutArray+attrN);
+                        };
                         break;
                     case ATTR_NM:
-                        if ( tagNM == (uint) -1 ) samAttrNM_MD (trOut, iEx1, iEx2, tagNM, tagMD);                       
+                        if ( tagNM == (uint) -1 ) samAttrNM_MD (trOut, iEx1, iEx2, tagNM, tagMD);
                         attrN+=bamAttrArrayWriteInt(tagNM,"NM",attrOutArray+attrN,P);
                         break;
                     case ATTR_MD:
-                        if ( tagMD.size()==0 ) samAttrNM_MD (trOut, iEx1, iEx2, tagNM, tagMD);                                             
-                        attrN+=bamAttrArrayWrite(tagMD,"MD",attrOutArray+attrN);                    
+                        if ( tagMD.size()==0 ) samAttrNM_MD (trOut, iEx1, iEx2, tagNM, tagMD);
+                        attrN+=bamAttrArrayWrite(tagMD,"MD",attrOutArray+attrN);
                         break;
                     case ATTR_RG:
-                        attrN+=bamAttrArrayWrite(P->outSAMattrRG.at(readFilesIndex),"RG",attrOutArray+attrN);                    
-                        break;                    
+                        attrN+=bamAttrArrayWrite(P->outSAMattrRG.at(readFilesIndex),"RG",attrOutArray+attrN);
+                        break;
                     default:
                         ostringstream errOut;
                         errOut <<"EXITING because of FATAL BUG: unknown/unimplemented SAM atrribute (tag): "<<outSAMattrOrder[ii] <<"\n";
                         errOut <<"SOLUTION: contact Alex Dobin at dobin at cshl.edu\n";
-                        exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);                         
+                        exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);
                 };
             };
         };
-////////////////////////////// prepare sequence and qualities        
+////////////////////////////// prepare sequence and qualities
         char seqMate[DEF_readSeqLengthMax+1], qualMate[DEF_readSeqLengthMax+1];
         char *seqOut=NULL, *qualOut=NULL;
 
@@ -381,9 +382,9 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
             for (uint ii=0;ii<readLengthOriginal[Mate]; ii++) qualMate[ii]=Qual0[Mate][readLengthOriginal[Mate]-1-ii];
             qualMate[readLengthOriginal[Mate]]=0;
             seqOut=&seqMate[0];
-            qualOut=&qualMate[0];            
-        };        
-        
+            qualOut=&qualMate[0];
+        };
+
         uint seqMateLength=readLengthOriginal[Mate];
         if (alignType==-11) {//hard-clip on the left
             seqMateLength-=trimL1;
@@ -393,27 +394,27 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
             seqMateLength-=trimR1;
         } else {//no-chimeric alignment
         };
-        
+
         //pack sequence
-        nuclPackBAM(seqOut,seqMate,seqMateLength);       
-        
+        nuclPackBAM(seqOut,seqMate,seqMateLength);
+
 /////////////////////////////////// write BAM
         uint32 *pBAM=(uint32*) (outBAMarray[imate]);
         recSize=0;
 
-        //1: refID: Reference sequence ID, -1 <= refID <= n ref; -1 for a read without a mapping position.       
+        //1: refID: Reference sequence ID, -1 <= refID <= n ref; -1 for a read without a mapping position.
         if (alignType<0) {
             pBAM[1]=trOut.Chr;
         } else {
             pBAM[1]=(uint32) -1;
         };
-        
+
         //2: pos: 0-based leftmost coordinate (= POS - 1): int32_t
         if (alignType<0) {
             pBAM[2]=trOut.exons[iEx1][EX_G] - trChrStart;
         } else {
             pBAM[2]=(uint32) -1;
-        };            
+        };
 
         //3: bin mq nl bin<<16|MAPQ<<8|l read name; bin is computed by the > reg2bin() function in Section 4.3; l read name is the length> of read name below (= length(QNAME) + 1).> uint32 t
         if (alignType<0) {
@@ -421,10 +422,10 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
                    |( MAPQ<<8 ) | ( strlen(readName) ) ); //note:read length includes 0-char
         } else {
             pBAM[3]=( reg2bin(-1,0) << 16 |  strlen(readName) );//4680=reg2bin(-1,0)
-        };   
-        
+        };
+
         //4: FLAG<<16|n cigar op; n cigar op is the number of operations in CIGAR.
-        pBAM[4]=( ( ((samFLAG & P->outSAMflagAND) | P->outSAMflagOR) << 16 ) | (nCIGAR) ); 
+        pBAM[4]=( ( ((samFLAG & P->outSAMflagAND) | P->outSAMflagOR) << 16 ) | (nCIGAR) );
 
         //5: l seq Length of SEQ
         pBAM[5]=seqMateLength;
@@ -442,7 +443,7 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
         if (nMates>1) {
             pBAM[7]=trOut.exons[(imate==0 ? iExMate+1 : 0)][EX_G] - trChrStart;
         } else if (mateChr<P->nChrReal){
-            pBAM[7]=mateStart-P->chrStart[mateChr];
+            pBAM[7]=mateStart;
         } else {
             pBAM[7]=-1;
         };
@@ -454,22 +455,22 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
             pBAM[8]=(uint32)tlen;
         } else {
             pBAM[8]=0;
-        };            
+        };
 
         recSize+=9*sizeof(int32); //core record size
-        
+
         //Read name1, NULL terminated (QNAME plus a tailing `\0')
-        strcpy(outBAMarray[imate]+recSize,readName+1);        
+        strcpy(outBAMarray[imate]+recSize,readName+1);
         recSize+=strlen(readName);
-        
+
         //CIGAR: op len<<4|op. `MIDNSHP=X'!`012345678'
         memcpy(outBAMarray[imate]+recSize,packedCIGAR, nCIGAR*sizeof(int32));
         recSize+=nCIGAR*sizeof(int32);
-        
+
         //4-bit encoded read: `=ACMGRSVTWYHKDBN'! [0; 15]; other characters mapped to `N'; high nybble 
rst (1st base in the highest 4-bit of the 1st byte)
         memcpy(outBAMarray[imate]+recSize,seqMate,(seqMateLength+1)/2);
         recSize+=(seqMateLength+1)/2;
-        
+
         //Phred base quality (a sequence of 0xFF if absent)
         if (readFileType==2 && P->outSAMmode != "NoQS") {//output qualtiy
             for (uint32 ii=0; ii<seqMateLength; ii++) {
@@ -480,15 +481,15 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
             memset(outBAMarray[imate]+recSize,0xFF,seqMateLength);
         };
         recSize+=seqMateLength;
-        
+
         //atributes
         memcpy(outBAMarray[imate]+recSize,attrOutArray,attrN);
         recSize+=attrN;
-        
+
         //total size of the record
         pBAM[0]=recSize-sizeof(uint32);//record size excluding the size entry itself
         outBAMarrayN[imate]=recSize;
     };//for (uint imate=0;imate<nMates;imate++)
-    
+
     return ( outBAMarrayN[1]==0 ? 1 : 2);
 };
diff --git a/source/ReadAlign_assignAlignToWindow.cpp b/source/ReadAlign_assignAlignToWindow.cpp
index b7cb52b..7195595 100644
--- a/source/ReadAlign_assignAlignToWindow.cpp
+++ b/source/ReadAlign_assignAlignToWindow.cpp
@@ -21,22 +21,22 @@ void ReadAlign::assignAlignToWindow(uint a1, uint aLength, uint aStr, uint aNrep
             };
         };
         if (iA<nWA[iW]) {//found overlap
-            if (aLength>WA[iW][iA][WA_Length]) {//replace 
-                
+            if (aLength>WA[iW][iA][WA_Length]) {//replace
+
                 uint iA0;//iA0 is where the align has to be inserted
-                for (iA0=0;iA0<nWA[iW];iA0++) 
+                for (iA0=0;iA0<nWA[iW];iA0++)
                 {//find the insertion point TODO binary search
-                    if (iA0!=iA && aRstart<WA[iW][iA0][WA_rStart]) 
+                    if (iA0!=iA && aRstart<WA[iW][iA0][WA_rStart])
                     {//do not compare with the piece to be removed
                         break;
                     };
                 };
-                
+
                 if (iA0>iA)
                 {//true insertion place since iA will be removed
                     --iA0;
                 };
-                
+
                 if (iA0<iA) {//shift aligns down
                     for (uint iA1=iA;iA1>iA0;iA1--) {//shift aligns to free up insertion point
                         for (uint ii=0;ii<WA_SIZE;ii++) {
@@ -50,43 +50,43 @@ void ReadAlign::assignAlignToWindow(uint a1, uint aLength, uint aStr, uint aNrep
                         };
                     };
                 };
-                
-                
+
+
                 WA[iW][iA0][WA_rStart]=aRstart;
                 WA[iW][iA0][WA_Length]=aLength;
                 WA[iW][iA0][WA_gStart]=a1;
-                WA[iW][iA0][WA_Nrep]=aNrep;                
+                WA[iW][iA0][WA_Nrep]=aNrep;
                 WA[iW][iA0][WA_Anchor]=int(aAnchor);//=0 if not, =1 if yes
                 WA[iW][iA0][WA_iFrag]=aFrag;
                 WA[iW][iA0][WA_sjA]=sjA;
-                
+
             };
             return; //do not record new align
         };
-    };          
+    };
 
     if (nWA[iW]==P->seedPerWindowNmax) {//too many aligns per window,  re-calcualte min-length, remove the shortest one,
 
-        WALrec[iW]=Lread+1; 
-        for (uint iA=0; iA<nWA[iW]; iA++) {//find the new min-length    
+        WALrec[iW]=Lread+1;
+        for (uint iA=0; iA<nWA[iW]; iA++) {//find the new min-length
             if (WA[iW][iA][WA_Anchor]!=1) WALrec[iW]=min(WALrec[iW],WA[iW][iA][WA_Length]); //protect the anchors - they are not counted for min-length
         };
 
 
         if (WALrec[iW]==Lread+1) {//this could happen if there are too many anchors
-            mapMarker=MARKER_TOO_MANY_ANCHORS_PER_WINDOW;                    
+            mapMarker=MARKER_TOO_MANY_ANCHORS_PER_WINDOW;
             nW=0;
             return;
         };
 
 
-        if (!aAnchor && aLength < WALrec[iW]) return; //alignment is shorter than min-length, do not record - unless it's an anchor                
+        if (!aAnchor && aLength < WALrec[iW]) return; //alignment is shorter than min-length, do not record - unless it's an anchor
 
         uint iA1=0;
         for (uint iA=0; iA<nWA[iW]; iA++) {//remove the shortest aligns
             if ( WA[iW][iA][WA_Anchor]==1 || WA[iW][iA][WA_Length] > WALrec[iW] ) {//re-record the anchors and long aligns
                 for (uint ii=0; ii<WA_SIZE; ii++) WA[iW][iA1][ii]=WA[iW][iA][ii]; //re-record the iA-th alignment into iA1-th place
-                iA1++;                     
+                iA1++;
             };
         };
 
@@ -100,10 +100,10 @@ void ReadAlign::assignAlignToWindow(uint a1, uint aLength, uint aStr, uint aNrep
 
     if ( aAnchor || aLength > WALrec[iW] ) {
         if (nWA[iW]>=P->seedPerWindowNmax) {
-            exitWithError("BUG: iA>=P->seedPerWindowNmax in stitchPieces, exiting",std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);            
+            exitWithError("BUG: iA>=P->seedPerWindowNmax in stitchPieces, exiting",std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);
         };
-     
-        uint iA;                                      
+
+        uint iA;
         for (iA=0;iA<nWA[iW];iA++) {//find the insertion point in case aligns are not sorted by aRstart
                                     //TODO binary search
             if (aRstart<WA[iW][iA][WA_rStart]) break;
@@ -113,12 +113,12 @@ void ReadAlign::assignAlignToWindow(uint a1, uint aLength, uint aStr, uint aNrep
                     WA[iW][iA1][ii]=WA[iW][iA1-1][ii];
             };
         };
-        
-        // now iW is the window to which this align belongs, record it                
+
+        // now iW is the window to which this align belongs, record it
         WA[iW][iA][WA_rStart]=aRstart;
         WA[iW][iA][WA_Length]=aLength;
         WA[iW][iA][WA_gStart]=a1;
-        WA[iW][iA][WA_Nrep]=aNrep;                
+        WA[iW][iA][WA_Nrep]=aNrep;
         WA[iW][iA][WA_Anchor]=int(aAnchor);//=0 if not, =1 if yes
         WA[iW][iA][WA_iFrag]=aFrag;
         WA[iW][iA][WA_sjA]=sjA;
diff --git a/source/ReadAlign_chimericDetection.cpp b/source/ReadAlign_chimericDetection.cpp
index e26c46c..b6e78b4 100644
--- a/source/ReadAlign_chimericDetection.cpp
+++ b/source/ReadAlign_chimericDetection.cpp
@@ -23,7 +23,7 @@ bool ReadAlign::chimericDetection() {
         for (uint iw=0; iw<nW; iw++) {
             for (uint itr=0;itr<nWinTr[iw];itr++) {
                 P->inOut->outLocalChains << trAll[iw][itr]->maxScore<<"\t"<< trAll[iw][itr]->Chr<<"\t"<<trAll[iw][itr]->Str<<"\t"<<trAll[iw][itr]->nExons;
-                for (uint ib=0;ib<trAll[iw][itr]->nExons;ib++) {                    
+                for (uint ib=0;ib<trAll[iw][itr]->nExons;ib++) {
                     P->inOut->outLocalChains <<"\t"<< trAll[iw][itr]->exons[ib][EX_G]-P->chrStart[trAll[iw][itr]->Chr] \
                                              <<"\t"<< trAll[iw][itr]->exons[ib][EX_R] <<"\t"<< trAll[iw][itr]->exons[ib][EX_L];
                 };
@@ -40,12 +40,12 @@ bool ReadAlign::chimericDetection() {
     if (P->chimSegmentMin>0 && trBest->rLength >= P->chimSegmentMin \
             && ( trBest->exons[trBest->nExons-1][EX_R] + trBest->exons[trBest->nExons-1][EX_L] + P->chimSegmentMin <= Lread \
               || trBest->exons[0][EX_R] >= P->chimSegmentMin ) \
-             && trBest->intronMotifs[0]==0 && (trBest->intronMotifs[1]==0 || trBest->intronMotifs[2]==0) ) { 
+             && trBest->intronMotifs[0]==0 && (trBest->intronMotifs[1]==0 || trBest->intronMotifs[2]==0) ) {
             //there is unmapped space at the start/end, and the main window is not a multimapping window, and non non-canonical junctions, and consistend junction motif
         int chimScoreBest=0,chimScoreNext=0;
         trChim[0]=*trBest;
 
-        
+
         uint roStart1=trBest->Str==0 ? trBest->exons[0][EX_R] : Lread - trBest->exons[trBest->nExons-1][EX_R] - trBest->exons[trBest->nExons-1][EX_L];
         uint roEnd1=trBest->Str==0 ? trBest->exons[trBest->nExons-1][EX_R] + trBest->exons[trBest->nExons-1][EX_L] - 1 : Lread - trBest->exons[0][EX_R] - 1;
         if (roStart1>readLength[0]) roStart1--;
@@ -61,7 +61,7 @@ bool ReadAlign::chimericDetection() {
         };
 
         for (uint iW=0; iW<nW; iW++) {//check all other windows for chimeras
-            for (uint iWt=0; iWt<nWinTr[iW]; iWt++){//cycl over transcripts in the window    
+            for (uint iWt=0; iWt<nWinTr[iW]; iWt++){//cycl over transcripts in the window
                 if (trBest!=trAll[iW][0] && iWt>0) break; //for all windows except that of the best transcript - hceck only iWt=0 (best trnascripts)
                 if (trBest==trAll[iW][0] && iWt==0) continue;
     //                 {//same window
@@ -70,7 +70,7 @@ bool ReadAlign::chimericDetection() {
     //                         //start of the last Best exon is before end of the first Chim exon
     //                         if (trBest->exons[trBest->nExons-1][EX_G]<trAll[iW][iWt]->exons[0][EX_G]+trAll[iW][iWt]->exons[0][EX_L]) continue;
     //                     } else {
-    //                         if (trAll[iW][iWt]->exons[trAll[iW][iWt]->nExons-1][EX_G]<trBest->exons[0][EX_G]+trBest->exons[0][EX_L]) continue;                        
+    //                         if (trAll[iW][iWt]->exons[trAll[iW][iWt]->nExons-1][EX_G]<trBest->exons[0][EX_G]+trBest->exons[0][EX_L]) continue;
     //                     };
     //                 };
 
@@ -82,14 +82,14 @@ bool ReadAlign::chimericDetection() {
                     chimStr1=1;
                 } else {//strand opposite to RNA
                     chimStr1=2;
-                };            
+                };
 
                 if (chimStr!=0 && chimStr1!=0 && chimStr!=chimStr1) continue; //chimeric segments have to have consitent strands
 
                 uint roStart2=trAll[iW][iWt]->Str==0 ? trAll[iW][iWt]->exons[0][EX_R] : Lread - trAll[iW][iWt]->exons[trAll[iW][iWt]->nExons-1][EX_R] - trAll[iW][iWt]->exons[trAll[iW][iWt]->nExons-1][EX_L];
                 uint roEnd2=trAll[iW][iWt]->Str==0 ? trAll[iW][iWt]->exons[trAll[iW][iWt]->nExons-1][EX_R] + trAll[iW][iWt]->exons[trAll[iW][iWt]->nExons-1][EX_L] - 1 : Lread - trAll[iW][iWt]->exons[0][EX_R] - 1;
                 if (roStart2>readLength[0]) roStart2--;
-                if (roEnd2>readLength[0]) roEnd2--;          
+                if (roEnd2>readLength[0]) roEnd2--;
 
                 uint chimOverlap = roStart2>roStart1 ?  (roStart2>roEnd1 ? 0 : roEnd1-roStart2+1) : (roEnd2<roStart1 ? 0 : roEnd2-roStart1+1);
                 bool diffMates=(roEnd1 < readLength[0] && roStart2 >= readLength[0]) || (roEnd2 < readLength[0] && roStart1 >= readLength[0]);
@@ -97,27 +97,27 @@ bool ReadAlign::chimericDetection() {
                 //segment lengths && (different mates || small gap between segments)
                 if (roEnd1 > P->chimSegmentMin + roStart1 + chimOverlap && roEnd2> P->chimSegmentMin + roStart2 + chimOverlap  \
                     && ( diffMates || ( (roEnd1 + P->chimSegmentReadGapMax + 1) >= roStart2 && (roEnd2 + P->chimSegmentReadGapMax + 1) >= roStart1 ) ) ) {
-                    
+
                     int chimScore=trBest->maxScore + trAll[iW][iWt]->maxScore - (int)chimOverlap; //subtract overlap to avoid double counting
-                    
+
                     uint overlap1=0;
-                    if (iWt>0 && chimScoreBest>0) 
+                    if (iWt>0 && chimScoreBest>0)
                     {//overlap between chimeric candidate segment and the best chimeric segment so far. Maybe non-zero only if both are in the same window.
                         overlap1=blocksOverlap(trChim[1],*trAll[iW][iWt]);
                     };
 
                     if (chimScore > chimScoreBest && chimScore >= P->chimScoreMin && chimScore+P->chimScoreDropMax >= (int) (readLength[0]+readLength[1]) ) {
-                        trChim[1]=*trAll[iW][iWt];                                      
+                        trChim[1]=*trAll[iW][iWt];
                         if (overlap1==0)
                         {
                             chimScoreNext=chimScoreBest;
                         };
                         chimScoreBest=chimScore;
                         trChim[1].roStart = trChim[1].roStr ==0 ? trChim[1].rStart : Lread - trChim[1].rStart - trChim[1].rLength;
-                        trChim[1].cStart  = trChim[1].gStart - P->chrStart[trChim[1].Chr];      
+                        trChim[1].cStart  = trChim[1].gStart - P->chrStart[trChim[1].Chr];
                         chimStrBest=chimStr1;
                     } else if (chimScore>chimScoreNext && overlap1==0) {//replace the nextscore if it's not the best one and is higher than the previous one
-                        chimScoreNext=chimScore;              
+                        chimScoreNext=chimScore;
                     };
                 };
             };//cycle over window transcripts
@@ -135,26 +135,26 @@ bool ReadAlign::chimericDetection() {
 
             uint chimRepeat0=0,chimRepeat1=0,chimJ0=0,chimJ1=0;
             int chimMotif=0;
-            chimN=2;      
+            chimN=2;
             if ( trChim[0].exons[e0][EX_iFrag] > trChim[1].exons[e1][EX_iFrag] ) {//strange configuration, rare, similar to the next one
                 chimN=0;//reject such chimeras
-                //good test example: 
+                //good test example:
                 //CTTAGCTAGCAGCGTCTTCCCAGTGCCTGGAGGGCCAGTGAGAATGGCACCCTCTGGGATTTTTGCTCCTAGGTCT
                 //TTGAGGTGAAGTTCAAAGATGTGGCTGGCTGTGAGGAGGCCGAGCTAGAGATCATGGAATTTGTGAATTTCTTGAA
             } else if ( trChim[0].exons[e0][EX_iFrag] < trChim[1].exons[e1][EX_iFrag] ) {//mates bracket the chimeric junction
                 chimN=2;
                 chimRepeat=0;
                 chimMotif=-1;
-                if (trChim[0].Str==1) {//negative strand                    
+                if (trChim[0].Str==1) {//negative strand
                     chimJ0=trChim[0].exons[e0][EX_G]-1;
                 } else {
-                    chimJ0=trChim[0].exons[e0][EX_G]+trChim[0].exons[e0][EX_L];                            
-                };            
-                if (trChim[1].Str==0) {//positive strand                    
+                    chimJ0=trChim[0].exons[e0][EX_G]+trChim[0].exons[e0][EX_L];
+                };
+                if (trChim[1].Str==0) {//positive strand
                     chimJ1=trChim[1].exons[e1][EX_G]-1;
                 } else {
-                    chimJ1=trChim[1].exons[e1][EX_G]+trChim[1].exons[e1][EX_L];                            
-                };                    
+                    chimJ1=trChim[1].exons[e1][EX_G]+trChim[1].exons[e1][EX_L];
+                };
             } else {//chimeric junctions is within one of the mates, check and shift chimeric junction if necessary
                 if (trChim[0].exons[e0][EX_L]>=P->chimJunctionOverhangMin && trChim[1].exons[e1][EX_L]>=P->chimJunctionOverhangMin ) {//large enough overhang required
                     uint roStart0 = trChim[0].Str==0 ? trChim[0].exons[e0][EX_R] : Lread - trChim[0].exons[e0][EX_R] - trChim[0].exons[e0][EX_L];
@@ -191,24 +191,24 @@ bool ReadAlign::chimericDetection() {
                         char b01,b02,b11,b12;
                         if (trChim[0].Str==0) {
                             b01=G[trChim[0].exons[e0][EX_G]+jR+1];
-                            b02=G[trChim[0].exons[e0][EX_G]+jR+2];                                
+                            b02=G[trChim[0].exons[e0][EX_G]+jR+2];
                         } else {
                             b01=G[trChim[0].exons[e0][EX_G]+trChim[0].exons[e0][EX_L]-1-jR-1];
                             if (b01<4) b01=3-b01;
                             b02=G[trChim[0].exons[e0][EX_G]+trChim[0].exons[e0][EX_L]-1-jR-2];
-                            if (b02<4) b02=3-b02;                                
-                        };      
+                            if (b02<4) b02=3-b02;
+                        };
                         if (trChim[1].Str==0) {
                             b11=G[trChim[1].exons[e1][EX_G]-roStart1+roStart0+jR-1];
-                            b12=G[trChim[1].exons[e1][EX_G]-roStart1+roStart0+jR];                                
+                            b12=G[trChim[1].exons[e1][EX_G]-roStart1+roStart0+jR];
                         } else {
                             b11=G[trChim[1].exons[e1][EX_G]+trChim[1].exons[e1][EX_L]-1+roStart1-roStart0-jR+1];
                             if (b11<4) b11=3-b11;
                             b12=G[trChim[1].exons[e1][EX_G]+trChim[1].exons[e1][EX_L]-1+roStart1-roStart0-jR];
-                            if (b12<4) b12=3-b12;                                
-                        };        
+                            if (b12<4) b12=3-b12;
+                        };
 
-                        jMotif=0;                        
+                        jMotif=0;
                         if (b01==2 && b02==3 && b11==0 && b12==2) {//GTAG
                             if (chimStr!=2) {
                                 jMotif=1;
@@ -216,8 +216,8 @@ bool ReadAlign::chimericDetection() {
                         } else if(b01==1 && b02==3 && b11==0 && b12==1) {//CTAC
                             if (chimStr!=1) {
                                 jMotif=2;
-                            };            
-                        };  
+                            };
+                        };
 
                         if (bR==b0 && bR!=b1) {
                             jScore++;
@@ -239,21 +239,21 @@ bool ReadAlign::chimericDetection() {
                         if (trChim[0].Str==1) {
                             trChim[0].exons[e0][EX_R] +=trChim[0].exons[e0][EX_L]-jRbest-1;
                             trChim[0].exons[e0][EX_G] +=trChim[0].exons[e0][EX_L]-jRbest-1;
-                            trChim[0].exons[e0][EX_L]=jRbest+1;                        
+                            trChim[0].exons[e0][EX_L]=jRbest+1;
                             chimJ0=trChim[0].exons[e0][EX_G]-1;
                         } else {
                             trChim[0].exons[e0][EX_L]=jRbest+1;
-                            chimJ0=trChim[0].exons[e0][EX_G]+trChim[0].exons[e0][EX_L];                            
-                        };                            
+                            chimJ0=trChim[0].exons[e0][EX_G]+trChim[0].exons[e0][EX_L];
+                        };
 
                         if (trChim[1].Str==0) {
                             trChim[1].exons[e1][EX_R] +=roStart0+jRbest+1-roStart1;
                             trChim[1].exons[e1][EX_G] +=roStart0+jRbest+1-roStart1;
-                            trChim[1].exons[e1][EX_L]=roStart1+trChim[1].exons[e1][EX_L]-roStart0-jRbest-1;  
+                            trChim[1].exons[e1][EX_L]=roStart1+trChim[1].exons[e1][EX_L]-roStart0-jRbest-1;
                             chimJ1=trChim[1].exons[e1][EX_G]-1;
                         } else {
-                            trChim[1].exons[e1][EX_L]=roStart1+trChim[1].exons[e1][EX_L]-roStart0-jRbest-1;  
-                            chimJ1=trChim[1].exons[e1][EX_G]+trChim[1].exons[e1][EX_L];  
+                            trChim[1].exons[e1][EX_L]=roStart1+trChim[1].exons[e1][EX_L]-roStart0-jRbest-1;
+                            chimJ1=trChim[1].exons[e1][EX_G]+trChim[1].exons[e1][EX_L];
                         };
                         //find repeats
                         char b0,b1;
@@ -290,7 +290,7 @@ bool ReadAlign::chimericDetection() {
                                 if (b1<4) b1=3-b1;
                             };
                             if (b0!=b1) break;
-                        };                        
+                        };
                         chimRepeat0=jR;
                     };//chimN>0
                 };//large enough overhang
@@ -304,22 +304,22 @@ bool ReadAlign::chimericDetection() {
                     && ( trChim[0].Str!=trChim[1].Str ||  trChim[0].Chr!=trChim[1].Chr \
                     || (trChim[0].Str==0 ? chimJ1-chimJ0+1LLU : chimJ0-chimJ1+1LLU) > (chimMotif>=0 ? P->alignIntronMax :  P->alignMatesGapMax) ) )
             {//
-             //&& (diff str || diff chr || 
+             //&& (diff str || diff chr ||
              //|| gap > (alignIntronMax,alignMatesGapMax) ) negative gap = very large # because of uint
-                
+
                 if (chimMotif>=0 && \
                      (trChim[0].exons[e0][EX_L]<P->chimJunctionOverhangMin+chimRepeat0 || trChim[1].exons[e1][EX_L]<P->chimJunctionOverhangMin+chimRepeat1) )
                 {//filter out linear junctions that are very close to chimeric junction
                     return false;
                 };
-                        
+
                 chimRecord=true; //chimeric alignment was recorded
 
                 //re-calculate the score for chimeric transcripts
                 trChim[0].alignScore(Read1, G, P);
                 trChim[1].alignScore(Read1, G, P);
-                
-                int chimRepresent=-999, chimType=0;        
+
+                int chimRepresent=-999, chimType=0;
                 if (trChim[0].exons[0][EX_iFrag]!=trChim[0].exons[trChim[0].nExons-1][EX_iFrag]) {//tr0 has both mates
                     chimRepresent = 0;
                     chimType = 1;
@@ -329,8 +329,8 @@ bool ReadAlign::chimericDetection() {
                     chimRepresent = 1;
                     chimType = 1;
                     trChim[1].primaryFlag=true;//paired portion is primary
-                    trChim[0].primaryFlag=false;                    
-                } else if (trChim[0].exons[0][EX_iFrag]!=trChim[1].exons[0][EX_iFrag]) {//tr0 and tr1 are single different mates 
+                    trChim[0].primaryFlag=false;
+                } else if (trChim[0].exons[0][EX_iFrag]!=trChim[1].exons[0][EX_iFrag]) {//tr0 and tr1 are single different mates
                     chimRepresent = -1;
                     chimType = 2;
                     trChim[0].primaryFlag=true;
@@ -339,9 +339,9 @@ bool ReadAlign::chimericDetection() {
                     chimRepresent = (trChim[0].maxScore > trChim[1].maxScore) ? 0 : 1;
                     chimType = 3;
                     trChim[chimRepresent].primaryFlag=true;
-                    trChim[1-chimRepresent].primaryFlag=false;                    
+                    trChim[1-chimRepresent].primaryFlag=false;
                 };
-                
+
                 if (P->chimOutType=="WithinBAM") {//BAM output
                     int alignType, bamN=0, bamIsuppl=-1, bamIrepr=-1;
                     uint bamBytesTotal=0;//estimate of the total size of all bam records, for output buffering
@@ -373,9 +373,9 @@ bool ReadAlign::chimericDetection() {
                                     mateStrand=(uint8_t) (trChim[chimRepresent].Str!=trChim[chimRepresent].exons[iex][EX_iFrag]);
                                 };
                             };
-                            
-                        };    
-                        
+
+                        };
+
                         bamN+=alignBAM(trChim[itr], 1, 1, P->chrStart[trChim[itr].Chr],  mateChr, mateStart, mateStrand, \
                                         alignType, NULL, P->outSAMattrOrder, outBAMoneAlign+bamN, outBAMoneAlignNbytes+bamN);
                         bamBytesTotal+=outBAMoneAlignNbytes[0]+outBAMoneAlignNbytes[1];//outBAMoneAlignNbytes[1] = 0 if SE is recorded
@@ -406,16 +406,16 @@ bool ReadAlign::chimericDetection() {
                         if (P->outBAMunsorted) outBAMunsorted->unsortedOneAlign(outBAMoneAlign[ii], outBAMoneAlignNbytes[ii], ii>0 ? 0 : bamBytesTotal);
                         if (P->outBAMcoord)    outBAMcoord->coordOneAlign(outBAMoneAlign[ii], outBAMoneAlignNbytes[ii], (iReadAll<<32) );
                     };
-                };        
-                
-                
+                };
+
+
                 for (uint iTr=0;iTr<chimN;iTr++) {//write all chimeric pieces to Chimeric.out.sam/junction
                     if (P->readNmates==2) {
                         outputTranscriptSAM(trChim[iTr], chimN, iTr, trChim[1-iTr].Chr, trChim[1-iTr].exons[0][EX_G], (int) (trChim[1-iTr].Str!=trChim[1-iTr].exons[0][EX_iFrag]), -1, NULL, &chunkOutChimSAM);
                     } else {
                         outputTranscriptSAM(trChim[iTr], chimN, iTr, -1, -1, -1, -1, NULL, &chunkOutChimSAM);
-                    };                        
-                };        
+                    };
+                };
                 //junction + SAMp
                 chunkOutChimJunction << P->chrName[trChim[0].Chr] <<"\t"<< chimJ0 - P->chrStart[trChim[0].Chr]+1 <<"\t"<< (trChim[0].Str==0 ? "+":"-") \
                         <<"\t"<< P->chrName[trChim[1].Chr] <<"\t"<< chimJ1 - P->chrStart[trChim[1].Chr]+1 <<"\t"<< (trChim[1].Str==0 ? "+":"-") \
diff --git a/source/ReadAlign_createExtendWindowsWithAlign.cpp b/source/ReadAlign_createExtendWindowsWithAlign.cpp
index 27c9c48..c872faf 100644
--- a/source/ReadAlign_createExtendWindowsWithAlign.cpp
+++ b/source/ReadAlign_createExtendWindowsWithAlign.cpp
@@ -5,17 +5,17 @@
 #include "SequenceFuns.h"
 
 int ReadAlign::createExtendWindowsWithAlign(uint a1, uint aStr) {
-    
+
 
     uint aBin = (a1 >> P->winBinNbits); //align's bin
     uint iBinLeft=aBin, iBinRight=aBin;
     uintWinBin* wB=winBin[aStr];
     uint iBin=-1, iWin=-1, iWinRight=-1;
-    
-    
+
+
     if (wB[aBin]==uintWinBinMax) {//proceed if there is no window at this bin
         //check neighboring bins
-        
+
         bool flagMergeLeft=false;
         if (aBin>0) {//merge left only if there are bins on the left
             for (iBin=aBin-1;  iBin >= ( aBin>P->winAnchorDistNbins ? aBin-P->winAnchorDistNbins : 0 );  --iBin) {//go left, find windows in Anchor range
@@ -57,22 +57,22 @@ int ReadAlign::createExtendWindowsWithAlign(uint a1, uint aStr) {
                 for (uint ii=aBin; ii<=iBin; ii++) {//mark al bins with the existing windows ID
                     wB[ii]=iWin;
                 };
-            };        
+            };
         };
 
-        
+
         if (!flagMergeLeft && !flagMergeRight) {//no merging, a new window was added
             wB[aBin]=iWin=nW; //add new window ID for now, may change it later
             WC[iWin][WC_Chr]=P->chrBin[aBin >> P->winBinChrNbits];
             WC[iWin][WC_Str]=aStr;
             WC[iWin][WC_gEnd]=WC[iWin][WC_gStart]=aBin;
-            ++nW;        
-            if (nW>=P->alignWindowsPerReadNmax) {                 
-                nW=P->alignWindowsPerReadNmax;
+            ++nW;
+            if (nW>=P->alignWindowsPerReadNmax) {
+                nW=P->alignWindowsPerReadNmax-1;
                 return EXIT_createExtendWindowsWithAlign_TOO_MANY_WINDOWS; //too many windows, do not record TODO: record a marker
-            };     
+            };
         } else {//record windows after merging
-            WC[iWin][WC_gStart]=iBinLeft;            
+            WC[iWin][WC_gStart]=iBinLeft;
             WC[iWin][WC_gEnd]=iBinRight;
             if (flagMergeLeft && flagMergeRight) {//kill right window, it was merged with the left one
                 WC[iWinRight][WC_gStart]=1;
diff --git a/source/ReadAlign_mapOneRead.cpp b/source/ReadAlign_mapOneRead.cpp
index e226fdd..fad2b83 100644
--- a/source/ReadAlign_mapOneRead.cpp
+++ b/source/ReadAlign_mapOneRead.cpp
@@ -3,49 +3,49 @@
 #include "Stats.h"
 #include "serviceFuns.cpp"
 
-int ReadAlign::mapOneRead() {   
-    
+int ReadAlign::mapOneRead() {
+
     #ifdef OFF_BEFORE_SEEDING
         #warning OFF_BEFORE_SEEDING
         nW=0;
         return 0;
-    #endif    
-    
-    revertStrand = false; //the 2nd read is awlays on opposite strand. 1st and 2nd reads have already been reversed.        
-    
+    #endif
+
+    revertStrand = false; //the 2nd read is awlays on opposite strand. 1st and 2nd reads have already been reversed.
+
     if (Lread>0) {
         Nsplit=qualitySplit(Read1[0], Qual1[0], Lread, P->Qsplit, P->maxNsplit, P->minLsplit, splitR);
     } else {
         Nsplit=0;
     };
-    
+
     resetN(); //reset aligns counters to 0
-    
+
     //reset/initialize a transcript
     trInit->reset();
     trInit->Chr=0;    trInit->Str=0; trInit->roStr=0;    trInit->cStart=0;     trInit->gLength=0; //to generate nice output of 0 for non-mapped reads
     trInit->iRead=iRead;
     trInit->Lread=Lread;
-    trInit->readLengthPairOriginal=readLengthPairOriginal;       
+    trInit->readLengthPairOriginal=readLengthPairOriginal;
     trInit->nExons=0;
-    
+
     trNext=trBest=trInit;
-       
+
     uint seedSearchStartLmax=min(P->seedSearchStartLmax,(uint) (P->seedSearchStartLmaxOverLread*(Lread-1)));
     // align all good pieces
     for (uint ip=0; ip<Nsplit; ip++) {
-        
+
         uint Nstart = P->seedSearchStartLmax>0 && seedSearchStartLmax<splitR[1][ip] ? splitR[1][ip]/seedSearchStartLmax+1 : 1;
         uint Lstart = splitR[1][ip]/Nstart;
         bool flagDirMap=true;
         for (uint iDir=0; iDir<2; iDir++) {//loop over two directions
-            
+
             uint Lmapped, L;
-            
+
             for (uint istart=0; istart<Nstart; istart++) {
-               
-//               #ifdef COMPILE_FOR_LONG_READS  
-//                       
+
+//               #ifdef COMPILE_FOR_LONG_READS
+//
 //               #else
                 if (flagDirMap || istart>0) {//check if the 1st piece in reveree direction does not need to be remapped
                     Lmapped=0;
@@ -60,33 +60,33 @@ int ReadAlign::mapOneRead() {
                         if (iDir==0 && istart==0 && Lmapped==0 && Shift+L == splitR[1][ip] ) {//this piece maps full length and does not need to be mapped from the opposite direction
                             flagDirMap=false;
                         };
-                        Lmapped+=L;                        
+                        Lmapped+=L;
                     };//while ( istart*Lstart + Lmapped + P->minLmap < splitR[1][ip] )
                 };//if (flagDirMap || istart>0)
-                
+
                 if (P->seedSearchLmax>0) {//search fixed length. Not very efficient, need to improve
                     uint Shift = iDir==0 ? ( splitR[0][ip] + istart*Lstart ) : \
                                    ( splitR[0][ip] + splitR[1][ip] - istart*Lstart-1); //choose Shift for forward or reverse
                     uint seedLength = min(P->seedSearchLmax, iDir==0 ? (splitR[0][ip] + splitR[1][ip]-Shift):(Shift+1) );
                     maxMappableLength2strands(Shift, seedLength, iDir, 0, P->nSA-1, L, splitR[2][ip]);//L=max mappable length, unique or multiple
                 };
-                
-                
+
+
 //               #endif
             };//for (uint istart=0; istart<Nstart; istart++)
         };
     };
-    
+
     #ifdef OFF_AFTER_SEEDING
         #warning OFF_AFTER_SEEDING
         return 0;
     #endif
-    
+
     nTr=0;//nothing mapped yet
     if (Lread<P->outFilterMatchNmin) {//read is too short (trimmed too much?)
         mapMarker=MARKER_READ_TOO_SHORT;
         trBest->rLength=0; //min good piece length
-        nW=0;        
+        nW=0;
     } else if (Nsplit==0) {//no good pieces
         mapMarker=MARKER_NO_GOOD_PIECES;
         trBest->rLength=splitR[1][0]; //min good piece length
@@ -94,12 +94,12 @@ int ReadAlign::mapOneRead() {
     } else if (Nsplit>0 && nA==0) {
         mapMarker=MARKER_ALL_PIECES_EXCEED_seedMultimapNmax;
         trBest->rLength=multNminL;
-        nW=0; 
+        nW=0;
     } else if (Nsplit>0 && nA>0) {//otherwise there are no good pieces, or all pieces map too many times: read cannot be mapped
 //         qsort((void*) PC, nP, sizeof(uint)*PC_SIZE, funCompareUint2);//sort PC by rStart and length
         stitchPieces(Read1, Qual1, G, SA,  Lread);
         if (nW>0) multMapSelect(); //check all the windows and transcripts for multiple mappers
     };
-    
+
     return 0;
 };
diff --git a/source/ReadAlign_maxMappableLength2strands.cpp b/source/ReadAlign_maxMappableLength2strands.cpp
index 9db6618..d81defb 100644
--- a/source/ReadAlign_maxMappableLength2strands.cpp
+++ b/source/ReadAlign_maxMappableLength2strands.cpp
@@ -4,17 +4,17 @@
 
 uint ReadAlign::maxMappableLength2strands(uint pieceStartIn, uint pieceLengthIn, uint iDir, uint iSA1, uint iSA2, uint& maxLbest, uint iFrag) {
     //returns number of mappings, maxMappedLength=mapped length
-    uint Nrep=0, indStartEnd[2], maxL; 
-    
+    uint Nrep=0, indStartEnd[2], maxL;
+
     uint NrepAll[P->genomeSAsparseD], indStartEndAll[P->genomeSAsparseD][2], maxLall[P->genomeSAsparseD];
     maxLbest=0;
-    
+
     bool dirR = iDir==0;
-    
+
     for (uint iDist=0; iDist<min(pieceLengthIn,P->genomeSAsparseD); iDist++) {//cycle through different distances
-        uint pieceStart;        
+        uint pieceStart;
         uint pieceLength=pieceLengthIn-iDist;
-        
+
         //calculate full index
         uint Lmax=min(P->genomeSAindexNbases,pieceLength);
         uint ind1=0;
@@ -40,12 +40,12 @@ uint ReadAlign::maxMappableLength2strands(uint pieceStartIn, uint pieceLengthIn,
                 break;
             } else {//this prefix does not exist, reduce Lind
                 --Lind;
-                ind1 = ind1 >> 2; 
+                ind1 = ind1 >> 2;
             };
         };
 
         if (P->genomeSAindexStart[Lind-1]+ind1+1 < P->genomeSAindexStart[Lind]) {//we are not at the end of the SA
-            iSA2=((SAi[P->genomeSAindexStart[Lind-1]+ind1+1] & P->SAiMarkNmask) & P->SAiMarkAbsentMask) - 1;    
+            iSA2=((SAi[P->genomeSAindexStart[Lind-1]+ind1+1] & P->SAiMarkNmask) & P->SAiMarkAbsentMask) - 1;
         } else {
             iSA2=P->nSA-1;
         };
@@ -56,7 +56,7 @@ uint ReadAlign::maxMappableLength2strands(uint pieceStartIn, uint pieceLengthIn,
     #ifdef SA_SEARCH_FULL
         //full search of the array even if the index search gave maxL
         maxL=0;
-        Nrep = maxMappableLength(Read1, pieceStart, pieceLength, G, SA, iSA1 & P->SAiMarkNmask, iSA2, dirR, maxL, indStartEnd, P);     
+        Nrep = maxMappableLength(Read1, pieceStart, pieceLength, G, SA, iSA1 & P->SAiMarkNmask, iSA2, dirR, maxL, indStartEnd, P);
     #else
         if (Lind < P->genomeSAindexNbases && (iSA1 & P->SAiMarkNmaskC)==0 ) {//no need for SA search
             indStartEnd[0]=iSA1;
@@ -79,10 +79,10 @@ uint ReadAlign::maxMappableLength2strands(uint pieceStartIn, uint pieceLengthIn,
             } else {
                 maxL=0;
             };
-            Nrep = maxMappableLength(Read1, pieceStart, pieceLength, G, SA, iSA1 & P->SAiMarkNmask, iSA2, dirR, maxL, indStartEnd, P);     
+            Nrep = maxMappableLength(Read1, pieceStart, pieceLength, G, SA, iSA1 & P->SAiMarkNmask, iSA2, dirR, maxL, indStartEnd, P);
         };
     #endif
-                
+
         if (maxL+iDist > maxLbest) {//this idist is better
             maxLbest=maxL+iDist;
         };
@@ -91,11 +91,11 @@ uint ReadAlign::maxMappableLength2strands(uint pieceStartIn, uint pieceLengthIn,
         indStartEndAll[iDist][1]=indStartEnd[1];
         maxLall[iDist]=maxL;
     };
-    
+
     for (uint iDist=0; iDist<min(pieceLengthIn,P->genomeSAsparseD); iDist++) {//cycle through different distances, store the ones with largest maxL
         if ( (maxLall[iDist]+iDist) == maxLbest) {
-            storeAligns(iDir, (dirR ? pieceStartIn+iDist : pieceStartIn-iDist), NrepAll[iDist], maxLall[iDist], indStartEndAll[iDist], iFrag);    
+            storeAligns(iDir, (dirR ? pieceStartIn+iDist : pieceStartIn-iDist), NrepAll[iDist], maxLall[iDist], indStartEndAll[iDist], iFrag);
         };
     };
-    return Nrep;    
+    return Nrep;
 };
diff --git a/source/ReadAlign_multMapSelect.cpp b/source/ReadAlign_multMapSelect.cpp
index 5b6230d..4573cf0 100644
--- a/source/ReadAlign_multMapSelect.cpp
+++ b/source/ReadAlign_multMapSelect.cpp
@@ -6,18 +6,18 @@
 #include <random>
 
 void ReadAlign::multMapSelect() {//select multiple mappers from all transcripts of all windows
-    
+
     maxScore=0;
     for (uint iW=0; iW<nW; iW++) {//scan windows
         if (maxScore < trAll[iW][0]->maxScore) maxScore = trAll[iW][0]->maxScore;
     };
-    
+
     if (maxScore!=trBest->maxScore) {
         ostringstream errOut;
         errOut  << "BUG: maxScore!=trBest->maxScore in multMapSelect";
-        exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);                    
+        exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);
     };
-    
+
     bool chimRecord = false;
 
     nTr=0;
@@ -29,30 +29,30 @@ void ReadAlign::multMapSelect() {//select multiple mappers from all transcripts
                 if (nTr==MAX_N_MULTMAP) {//too many alignments for this read, do not record it
                     ostringstream errOut;
                     errOut  << "EXITING: Fatal ERROR: number of alignments exceeds MAX_N_MULTMAP, increase it and re-compile STAR";
-                    exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);                    
+                    exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);
                 };
-                    
+
                 trMult[nTr]=trAll[iW][iTr];
                 trMult[nTr]->Chr = trAll[iW][0]->Chr;
-                trMult[nTr]->Str = trAll[iW][0]->Str;                  
-                trMult[nTr]->roStr = trAll[iW][0]->roStr;                                 
-                
+                trMult[nTr]->Str = trAll[iW][0]->Str;
+                trMult[nTr]->roStr = trAll[iW][0]->roStr;
+
                 if ( (trAll[iW][iTr]->maxScore + P->outFilterMultimapScoreRange) >= maxScore) nTrMate++;
-                
-                nTr++;           
+
+                nTr++;
             };
         };
     };
-    
-    if (nTr > P->outFilterMultimapNmax)
-    {//too multi, no need for further processing, isnce it will be considered unmapped
+
+    if (nTr > P->outFilterMultimapNmax || nTr==0)
+    {//too multi OR no alignments, no need for further processing, since it will be considered unmapped
         return;
     };
-    
-    for (uint iTr=0; iTr<nTr; iTr++) 
-    {              
+
+    for (uint iTr=0; iTr<nTr; iTr++)
+    {
         trMult[iTr]->roStart = trMult[iTr]->roStr==0 ? trMult[iTr]->rStart : Lread - trMult[iTr]->rStart - trMult[iTr]->rLength;
-        trMult[iTr]->cStart=trMult[iTr]->gStart - P->chrStart[trMult[iTr]->Chr];                        
+        trMult[iTr]->cStart=trMult[iTr]->gStart - P->chrStart[trMult[iTr]->Chr];
     };
 
 //     if (P->outMultimapperOrder.sortCoord)
@@ -70,9 +70,9 @@ void ReadAlign::multMapSelect() {//select multiple mappers from all transcripts
 //         {
 //             trMult[itr]=t[s[itr*2+1]];
 //         };
-//         delete [] s;        
+//         delete [] s;
 //     };
-    
+
     if (nTr==1)
     {//unique mappers
         trMult[0]->primaryFlag=true;
@@ -83,7 +83,7 @@ void ReadAlign::multMapSelect() {//select multiple mappers from all transcripts
         {//bring the best alignment to the top of the list. TODO sort alignments by the score?
             for (uint itr=0; itr<nTr; itr++)
             {//move the best aligns to the top of the list
-                if ( trMult[itr]->maxScore == maxScore ) 
+                if ( trMult[itr]->maxScore == maxScore )
                 {
                     swap(trMult[itr],trMult[nbest]);
                     ++nbest;
@@ -102,15 +102,15 @@ void ReadAlign::multMapSelect() {//select multiple mappers from all transcripts
                 int rand1=int (rngUniformReal0to1(rngMultOrder)*itr+0.5);
                 swap(trMult[nbest+itr],trMult[nbest+rand1]);
             };
-        };    
+        };
 
         if ( P->outSAMprimaryFlag=="AllBestScore" )
         {
             for (uint itr=0; itr<nTr; itr++)
             {//mark all best score aligns as primary
-                if ( trMult[itr]->maxScore == maxScore ) trMult[itr]->primaryFlag=true; 
+                if ( trMult[itr]->maxScore == maxScore ) trMult[itr]->primaryFlag=true;
             };
-        } else if (P->outMultimapperOrder.random || P->outSAMmultNmax != (uint) -1) 
+        } else if (P->outMultimapperOrder.random || P->outSAMmultNmax != (uint) -1)
         {
             trMult[0]->primaryFlag=true;//mark as primary the first one in the random ordered list: best scoring aligns are already in front of the list
     //         for (uint itr=0; itr<nTr; itr++)
@@ -120,7 +120,7 @@ void ReadAlign::multMapSelect() {//select multiple mappers from all transcripts
     //         };
         } else
         {//old way
-            trBest->primaryFlag=true;    
+            trBest->primaryFlag=true;
         };
     };
 };
diff --git a/source/ReadAlign_oneRead.cpp b/source/ReadAlign_oneRead.cpp
index f2468b7..6649702 100644
--- a/source/ReadAlign_oneRead.cpp
+++ b/source/ReadAlign_oneRead.cpp
@@ -7,36 +7,36 @@ int ReadAlign::oneRead() {//process one read: load, map, write
 
     //load read name, sequence, quality from the streams into internal arrays
     int readStatus[2];
-    
+
     readStatus[0]=readLoad(*(readInStream[0]), P, 0, readLength[0], readLengthOriginal[0], readNameMates[0], Read0[0], Read1[0], Qual0[0], Qual1[0], clip3pNtotal[0], clip5pNtotal[0], clip3pAdapterN[0], iReadAll, readFilesIndex, readFilter);
     if (P->readNmates==2) {//read the 2nd mate
         readStatus[1]=readLoad(*(readInStream[1]), P, 1, readLength[1], readLengthOriginal[1], readNameMates[1], Read0[1], Read1[0]+readLength[0]+1, Qual0[1], Qual1[0]+readLength[0]+1, clip3pNtotal[1], clip5pNtotal[1], clip3pAdapterN[1], iReadAll, readFilesIndex, readFilter);
-        
+
         if (readStatus[0]!=readStatus[1]) {
             ostringstream errOut;
             errOut << "EXITING because of FATAL ERROR: Read1 and Read2 are not consistent, reached the end of the one before the other one\n";
             errOut << "SOLUTION: Check you your input files: they may be corrupted\n";
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);                      
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         } else if (readStatus[0]==-1) {//finished with the stream
             return -1;
         };
-        
+
         //combine two reads together
         Lread=readLength[0]+readLength[1]+1;
-        readLengthPairOriginal=readLengthOriginal[0]+readLengthOriginal[1]+1;    
+        readLengthPairOriginal=readLengthOriginal[0]+readLengthOriginal[1]+1;
         if (Lread>DEF_readSeqLengthMax) {
             ostringstream errOut;
             errOut << "EXITING because of FATAL ERROR in reads input: Lread of the pair = " << Lread << "   while DEF_readSeqLengthMax=" << DEF_readSeqLengthMax <<endl;
             errOut << "Read Name="<<readNameMates[0]<<endl;
             errOut << "SOLUTION: increase DEF_readSeqLengthMax in IncludeDefine.h and re-compile STAR"<<endl<<flush;
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);                      
-        };                  
-        
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
+        };
+
         Read1[0][readLength[0]]=MARK_FRAG_SPACER_BASE; //marker for spacer base
         Qual1[0][readLength[0]]=0;
         complementSeqNumbers(Read1[0]+readLength[0]+1,Read1[0]+readLength[0]+1,readLength[1]); //returns complement of Reads[ii]
         for (uint ii=0;ii<readLength[1]/2;ii++) {
-            swap(Read1[0][Lread-ii-1],Read1[0][ii+readLength[0]+1]); //reverse complement   
+            swap(Read1[0][Lread-ii-1],Read1[0][ii+readLength[0]+1]); //reverse complement
             swap(Qual1[0][Lread-ii-1],Qual1[0][ii+readLength[0]+1]); //reverse complement   ??? was Qualof the second mate populated
         };
 
@@ -45,40 +45,40 @@ int ReadAlign::oneRead() {//process one read: load, map, write
         if (readStatus[0]==-1) {//finished with the stream
             return -1;
         };
-        
+
         Lread=readLength[0];
         readLengthPairOriginal=readLengthOriginal[0];
         readLength[1]=0;
-        
+
     };
-      
+
     readFileType=readStatus[0];
-    
+
     complementSeqNumbers(Read1[0],Read1[1],Lread); //returns complement of Reads[ii]
     for (uint ii=0;ii<Lread;ii++) {//reverse
         Read1[2][Lread-ii-1]=Read1[1][ii];
         Qual1[1][Lread-ii-1]=Qual1[0][ii];
     };
-    
+
     statsRA.readN++;
     statsRA.readBases += readLength[0]+readLength[1];
-    
+
     //max number of mismatches allowed for this read
     outFilterMismatchNmaxTotal=min(P->outFilterMismatchNmax, (uint) (P->outFilterMismatchNoverReadLmax*(readLength[0]+readLength[1])));
-    
+
     //map the read
     mapOneRead();
-    
+
     #ifdef OFF_BEFORE_OUTPUT
         #warning OFF_BEFORE_OUTPUT
         return 0;
     #endif
     //write out alignments
     outputAlignments();
-    
+
     //debug
 //     cout <<readName<<endl;
-    
+
     return 0;
-    
+
 };
diff --git a/source/ReadAlign_outputAlignments.cpp b/source/ReadAlign_outputAlignments.cpp
index 9714fb3..60c7832 100644
--- a/source/ReadAlign_outputAlignments.cpp
+++ b/source/ReadAlign_outputAlignments.cpp
@@ -3,24 +3,24 @@
 #include "ErrorWarning.h"
 
 void ReadAlign::outputAlignments() {
-    
+
     outBAMbytes=0;
     outBAMbytes1=0;
 
     bool mateMapped[2]={false,false};
-    
+
     if (P->outFilterBySJoutStage<=1) {//no chimeric output for stage=2
         if ( chimericDetection() )
         {
             statsRA.chimericAll++;
-            if ( P->chimOutType=="WithinBAM" ) 
+            if ( P->chimOutType=="WithinBAM" )
             {
                 //if chimeric alignment was recorded in main BAM files, it contains the representative portion, so non-chimeric aligmnent is not output
-                return; 
+                return;
             };
         };
     };
-    
+
     if ( nW==0 ) {//no good windows
         statsRA.unmappedOther++;
         unmapType=0;
@@ -37,7 +37,7 @@ void ReadAlign::outputAlignments() {
     } else {//output transcripts
 
         outFilterPassed=true;
-        
+
         if (P->outFilterBySJoutStage==1) {//filtering by SJout
             for (uint iTr=0;iTr<nTr;iTr++) {//check transcript for unannotated junctions
                 for (uint iex=0;iex<trMult[iTr]->nExons-1;iex++) {//check all junctions
@@ -52,7 +52,7 @@ void ReadAlign::outputAlignments() {
                 unmapType=-3; //the read is not conisddred unmapped
                 statsRA.readN--;
                 statsRA.readBases -= readLength[0]+readLength[1];
-                
+
 //                 if (P->runThreadN>1) pthread_mutex_lock(&g_threadChunks.mutexOutFilterBySJout);
                 for (uint im=0;im<P->readNmates;im++) {
                    chunkOutFilterBySJoutFiles[im] << readNameMates[im] <<" "<< iReadAll <<" "<< readFilter <<" "<< readFilesIndex;
@@ -63,33 +63,53 @@ void ReadAlign::outputAlignments() {
                         chunkOutFilterBySJoutFiles[im] << Qual0[im] <<"\n";
                     };
                 };
-//                 if (P->runThreadN>1) pthread_mutex_unlock(&g_threadChunks.mutexOutFilterBySJout);  
+//                 if (P->runThreadN>1) pthread_mutex_unlock(&g_threadChunks.mutexOutFilterBySJout);
             };
         };
 
         if (P->outSJfilterReads=="All" || nTr==1) {
-            uint sjReadStartN=chunkOutSJ1->N;        
+            uint sjReadStartN=chunkOutSJ1->N;
             for (uint iTr=0;iTr<nTr;iTr++) {//write all transcripts
-                outputTranscriptSJ (*(trMult[iTr]), nTr, chunkOutSJ1, sjReadStartN);            
+                outputTranscriptSJ (*(trMult[iTr]), nTr, chunkOutSJ1, sjReadStartN);
             };
-        };        
+        };
 
         if (outFilterPassed) {
+            uint nTrOut=nTr; //number of aligns to output
             bool outSAMfilterYes=true;
             if (P->outSAMfilter.yes)
             {
                 if (P->outSAMfilter.KeepOnlyAddedReferences)
                 {
-                     for (uint itr=0;itr<nTr;itr++) 
-                     {//check if transcripts map to chr other than added references
-                         if (trMult[itr]->Chr<P->genomeInsertChrIndFirst)
-                         {
-                             outSAMfilterYes=false;
-                             break;
-                         };
-                     };
+                    for (uint itr=0;itr<nTr;itr++)
+                    {//check if transcripts map to chr other than added references
+                        if (trMult[itr]->Chr<P->genomeInsertChrIndFirst)
+                        {
+                            outSAMfilterYes=false;
+                            break;
+                        };
+                    };
+                } else if (P->outSAMfilter.KeepAllAddedReferences)
+                {
+                    nTrOut=0;
+                    for (uint itr=0;itr<nTr;itr++)
+                    {//check if transcripts map to chr other than added references
+                        if (trMult[itr]->Chr>=P->genomeInsertChrIndFirst)
+                        {
+                            trMult[nTrOut]=trMult[itr];
+                            trMult[nTrOut]->primaryFlag=false;
+                            ++nTrOut;
+                        };
+                    };
+                    if (nTrOut==0)
+                    {
+                        outSAMfilterYes=false;
+                    } else
+                    {
+                        trMult[0]->primaryFlag=true;
+                    };
                 };
-            };            
+            };
             if (nTr>1) {//multimappers
                 statsRA.mappedReadsM++;
                 unmapType=-1;
@@ -100,78 +120,81 @@ void ReadAlign::outputAlignments() {
             } else {//cannot be
                 ostringstream errOut;
                 errOut  << "EXITING because of a BUG: nTr=0 in outputAlignments.cpp";
-                exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);                    
-            };            
-            
-            uint nTrOut=min(P->outSAMmultNmax,nTr); //number of to write to SAM/BAM files       
-            
-            for (uint iTr=0;iTr<nTrOut;iTr++) 
-            {//write all transcripts         
+                exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);
+            };
+
+            nTrOut=min(P->outSAMmultNmax,nTrOut); //number of to write to SAM/BAM files
+
+            for (uint iTr=0;iTr<nTrOut;iTr++)
+            {//write all transcripts
                 //mate mapped = true if a mate was present in one of the trancsripts
-                mateMapped[trMult[iTr]->exons[0][EX_iFrag]]=true;
-                mateMapped[trMult[iTr]->exons[trMult[iTr]->nExons-1][EX_iFrag]]=true; 
-                
+                //mateMapped[trMult[iTr]->exons[0][EX_iFrag]]=true;
+                //mateMapped[trMult[iTr]->exons[trMult[iTr]->nExons-1][EX_iFrag]]=true;
+
                 //mateMapped1 = true if a mate is present in this transcript
                 bool mateMapped1[2]={false,false};
                 mateMapped1[trMult[iTr]->exons[0][EX_iFrag]]=true;
-                mateMapped1[trMult[iTr]->exons[trMult[iTr]->nExons-1][EX_iFrag]]=true; 
-                
+                mateMapped1[trMult[iTr]->exons[trMult[iTr]->nExons-1][EX_iFrag]]=true;
+
                 if (P->outSAMbool && outSAMfilterYes)
                 {//SAM output
                     outBAMbytes+=outputTranscriptSAM(*(trMult[iTr]), nTr, iTr, (uint) -1, (uint) -1, 0, -1, NULL, outSAMstream);
                     if (P->outSAMunmapped.keepPairs && P->readNmates>1 && ( !mateMapped1[0] || !mateMapped1[1] ) )
-                    {//keep pairs && paired reads && one of the mates not mapped in this transcript  
-                        outBAMbytes+= outputTranscriptSAM(*(trMult[iTr]), 0, 0, (uint) -1, (uint) -1, 0, 4, mateMapped1, outSAMstream);        
+                    {//keep pairs && paired reads && one of the mates not mapped in this transcript
+                        outBAMbytes+= outputTranscriptSAM(*(trMult[iTr]), 0, 0, (uint) -1, (uint) -1, 0, 4, mateMapped1, outSAMstream);
                     };
                 };
-            
-                if ((P->outBAMunsorted || P->outBAMcoord) && outSAMfilterYes) 
+
+                if ((P->outBAMunsorted || P->outBAMcoord) && outSAMfilterYes)
                 {//BAM output
                     alignBAM(*(trMult[iTr]), nTr, iTr, P->chrStart[trMult[iTr]->Chr], (uint) -1, (uint) -1, 0, -1, NULL, P->outSAMattrOrder,outBAMoneAlign, outBAMoneAlignNbytes);
-                    
+
                     if (P->outBAMunsorted)
                     {//unsorted
-                        for (uint imate=0; imate<P->readNmates; imate++) 
+                        for (uint imate=0; imate<P->readNmates; imate++)
                         {//output each mate
                             outBAMunsorted->unsortedOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], (imate>0 || iTr>0) ? 0 : (outBAMoneAlignNbytes[0]+outBAMoneAlignNbytes[1])*2*nTrOut);
                         };
-                        if (P->outSAMunmapped.keepPairs && P->readNmates>1 && ( !mateMapped1[0] || !mateMapped1[1] ) )                        
-                        {//keep pairs && paired reads && one of the mates not mapped in this transcript  
+                        if (P->outSAMunmapped.keepPairs && P->readNmates>1 && ( !mateMapped1[0] || !mateMapped1[1] ) )
+                        {//keep pairs && paired reads && one of the mates not mapped in this transcript
                             alignBAM(*trMult[iTr], 0, 0, P->chrStart[trMult[iTr]->Chr], (uint) -1, (uint) -1, 0, 4, mateMapped1, P->outSAMattrOrder, outBAMoneAlign, outBAMoneAlignNbytes);
-                            for (uint imate=0; imate<P->readNmates; imate++) 
+                            for (uint imate=0; imate<P->readNmates; imate++)
                             {//output each mate
                                 outBAMunsorted->unsortedOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], (imate>0 || iTr>0) ? 0 : (outBAMoneAlignNbytes[0]+outBAMoneAlignNbytes[1])*2*nTrOut);
-                            };                            
+                            };
                         };
                     };
-                    
+
                     if (P->outBAMcoord)
                     {//coordinate sorted
-                        for (uint imate=0; imate<P->readNmates; imate++) 
+                        for (uint imate=0; imate<P->readNmates; imate++)
                         {//output each mate
-                            outBAMcoord->coordOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], (iReadAll<<32) | (iTr<<8) | trMult[iTr]->exons[0][EX_iFrag] );                        
+                            outBAMcoord->coordOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], (iReadAll<<32) | (iTr<<8) | trMult[iTr]->exons[0][EX_iFrag] );
                         };
                     };
-                    
+
                 };
             };
-                        
-            if (P->readNmates>1 && !(mateMapped[0] && mateMapped[1]) ) 
+
+            mateMapped[trBest->exons[0][EX_iFrag]]=true;
+            mateMapped[trBest->exons[trBest->nExons-1][EX_iFrag]]=true;            
+            
+            if (P->readNmates>1 && !(mateMapped[0] && mateMapped[1]) )
             {
                 unmapType=4;
             };
-            
-            if (unmapType==4)
+
+            if (unmapType==4 && P->outSAMunmapped.yes)
             {//output unmapped end for single-end alignments
                 if (P->outSAMbool && !P->outSAMunmapped.keepPairs && outSAMfilterYes)
                 {
-                    outBAMbytes+= outputTranscriptSAM(*trBest, 0, 0, (uint) -1, (uint) -1, 0, unmapType, mateMapped, outSAMstream);        
+                    outBAMbytes+= outputTranscriptSAM(*trBest, 0, 0, (uint) -1, (uint) -1, 0, unmapType, mateMapped, outSAMstream);
                 };
-                
-                if ( (P->outBAMcoord || (P->outBAMunsorted && !P->outSAMunmapped.keepPairs) ) && outSAMfilterYes) 
+
+                if ( (P->outBAMcoord || (P->outBAMunsorted && !P->outSAMunmapped.keepPairs) ) && outSAMfilterYes)
                 {//BAM output
                     alignBAM(*trBest, 0, 0, P->chrStart[trBest->Chr], (uint) -1, (uint) -1, 0, unmapType, mateMapped, P->outSAMattrOrder, outBAMoneAlign, outBAMoneAlignNbytes);
-                    for (uint imate=0; imate<P->readNmates; imate++) 
+                    for (uint imate=0; imate<P->readNmates; imate++)
                     {//alignBAM output is empty for mapped mate, but still need to scan through it
                         if (P->outBAMunsorted && !P->outSAMunmapped.keepPairs)
                         {
@@ -179,43 +202,43 @@ void ReadAlign::outputAlignments() {
                         };
                         if (P->outBAMcoord)
                         {//KeepPairs option does not affect for sorted BAM since we do not want multiple entries for the same unmapped read
-                            outBAMcoord->coordOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], iReadAll);                                        
+                            outBAMcoord->coordOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], iReadAll);
                         };
                     };
                 };
             };
-            
-            if (P->outSJfilterReads=="All" || nTr==1) 
+
+            if (P->outSJfilterReads=="All" || nTr==1)
             {
-                uint sjReadStartN=chunkOutSJ->N;        
-                for (uint iTr=0;iTr<nTr;iTr++) 
+                uint sjReadStartN=chunkOutSJ->N;
+                for (uint iTr=0;iTr<nTr;iTr++)
                 {//write all transcripts
-                    outputTranscriptSJ (*(trMult[iTr]), nTr, chunkOutSJ, sjReadStartN);            
+                    outputTranscriptSJ (*(trMult[iTr]), nTr, chunkOutSJ, sjReadStartN);
                 };
             };
-            
-            if ( P->quant.geCount.yes ) 
+
+            if ( P->quant.geCount.yes )
             {
                 chunkTr->geneCountsAddAlign(nTr, trMult);
-            };       
-            
-            if ( P->quant.trSAM.yes ) 
+            };
+
+            if ( P->quant.trSAM.yes )
             {//NOTE: the transcripts are changed by this function (soft-clipping extended), cannot be reused
                 quantTranscriptome(chunkTr, nTr, trMult,  alignTrAll);
-            };    
+            };
         };
     };
-    
+
     if (unmapType>=0)
     {
         statsRA.unmappedAll++;
     };
 
     if ( P->outSAMunmapped.within && unmapType>=0 && unmapType<4 ) {//output unmapped within && unmapped read && both mates unmapped
-        if (P->outBAMcoord || P->outBAMunsorted || P->quant.trSAM.yes) 
+        if (P->outBAMcoord || P->outBAMunsorted || P->quant.trSAM.yes)
         {//BAM output
             alignBAM(*trBest, 0, 0, P->chrStart[trBest->Chr], (uint) -1, (uint) -1, 0, unmapType, mateMapped, P->outSAMattrOrder, outBAMoneAlign, outBAMoneAlignNbytes);
-            for (uint imate=0; imate<P->readNmates; imate++) 
+            for (uint imate=0; imate<P->readNmates; imate++)
             {//output each mate
                 if (P->outBAMunsorted)
                 {
@@ -227,15 +250,15 @@ void ReadAlign::outputAlignments() {
                 };
                 if (P->outBAMcoord)
                 {
-                    outBAMcoord->coordOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], iReadAll);                                        
+                    outBAMcoord->coordOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], iReadAll);
                 };
             };
         };
-        
-        if (P->outSAMbool) 
+
+        if (P->outSAMbool)
         {//output SAM
-            outBAMbytes+= outputTranscriptSAM(*trBest, 0, 0, (uint) -1, (uint) -1, 0, unmapType, mateMapped, outSAMstream);        
-        };        
+            outBAMbytes+= outputTranscriptSAM(*trBest, 0, 0, (uint) -1, (uint) -1, 0, unmapType, mateMapped, outSAMstream);
+        };
     };
     if (unmapType>=0 && P->outReadsUnmapped=="Fastx" ){//output to fasta/q files
            for (uint im=0;im<P->readNmates;im++) {
@@ -248,7 +271,7 @@ void ReadAlign::outputAlignments() {
                     chunkOutUnmappedReadsStream[im] << Qual0[im] <<"\n";
                 };
            };
-    }; 
+    };
 };
 
 
diff --git a/source/ReadAlign_outputTranscriptCIGARp.cpp b/source/ReadAlign_outputTranscriptCIGARp.cpp
index d6ac47c..e9a464c 100644
--- a/source/ReadAlign_outputTranscriptCIGARp.cpp
+++ b/source/ReadAlign_outputTranscriptCIGARp.cpp
@@ -3,43 +3,43 @@
 
 string ReadAlign::outputTranscriptCIGARp(Transcript const &trOut) {//generates CIGARp string for the transcript
                                                                    //p is a special CIGAR operation to encode gap between mates. This gap is negative for overlapping mates
-    
+
     string CIGAR;
     samStreamCIGAR.str(std::string());
 
     uint leftMate=0;
     if (P->readFilesIn.size()>1) leftMate=trOut.Str;
-    
+
     uint trimL=trOut.exons[0][EX_R] - (trOut.exons[0][EX_R]<readLengthOriginal[leftMate] ? 0 : readLengthOriginal[leftMate]+1);
     if (trimL>0) {
         samStreamCIGAR << trimL << "S"; //initial trimming
-    };                      
-        
+    };
+
     for (uint ii=0;ii<trOut.nExons;ii++) {//cycle over all exons, record CIGAR
         if (ii>0) {//record gaps
-            uint gapG=trOut.exons[ii][EX_G]-(trOut.exons[ii-1][EX_G]+trOut.exons[ii-1][EX_L]);                
-            
+            uint gapG=trOut.exons[ii][EX_G]-(trOut.exons[ii-1][EX_G]+trOut.exons[ii-1][EX_L]);
+
             if (trOut.exons[ii][EX_G] >= (trOut.exons[ii-1][EX_G]+trOut.exons[ii-1][EX_L]) ) {//
                 if (trOut.canonSJ[ii-1]==-3) {//gap between mates
                     //soft clipping of the second mate
                     uint s1=readLengthOriginal[leftMate]-(trOut.exons[ii-1][EX_R]+trOut.exons[ii-1][EX_L]);
                     uint s2=trOut.exons[ii][EX_R]-(readLengthOriginal[leftMate]+1);
                     if (s1>0){
-                        samStreamCIGAR << s1 << "S";  
-                    };                      
+                        samStreamCIGAR << s1 << "S";
+                    };
                     samStreamCIGAR << gapG << "p";
                     if (s2>0){
-                        samStreamCIGAR << s2 << "S";  
-                    };    
-                    
+                        samStreamCIGAR << s2 << "S";
+                    };
+
                 } else {
                     //it's possible to have a D or N and I for at the same time
-                    uint gapR=trOut.exons[ii][EX_R]-trOut.exons[ii-1][EX_R]-trOut.exons[ii-1][EX_L]; //gapR>0 always                                 
+                    uint gapR=trOut.exons[ii][EX_R]-trOut.exons[ii-1][EX_R]-trOut.exons[ii-1][EX_L]; //gapR>0 always
                     if (gapR>0){
                         samStreamCIGAR << gapR << "I";
-                    };                       
+                    };
                     if (trOut.canonSJ[ii-1]>=0 || trOut.sjAnnot[ii-1]==1) {//junction: N
-                        samStreamCIGAR << gapG << "N";                        
+                        samStreamCIGAR << gapG << "N";
                     } else if (gapG>0) {//deletion
                         samStreamCIGAR << gapG << "D";
                     };
@@ -47,11 +47,11 @@ string ReadAlign::outputTranscriptCIGARp(Transcript const &trOut) {//generates C
             } else {//mates overlap
                 samStreamCIGAR << "-" << (trOut.exons[ii-1][EX_G]+trOut.exons[ii-1][EX_L]) - trOut.exons[ii][EX_G] << "p";
             };
-        };                
+        };
         samStreamCIGAR << trOut.exons[ii][EX_L] << "M";
     };
 
-        
+
     trimL=(trOut.exons[trOut.nExons-1][EX_R]<readLengthOriginal[leftMate] ? readLengthOriginal[leftMate] : readLengthPairOriginal) - trOut.exons[trOut.nExons-1][EX_R]-trOut.exons[trOut.nExons-1][EX_L];
     if ( trimL > 0 ) {
         samStreamCIGAR << trimL << "S"; //final trimming
diff --git a/source/ReadAlign_outputTranscriptSAM.cpp b/source/ReadAlign_outputTranscriptSAM.cpp
index 6f3f7c1..e2e14bf 100644
--- a/source/ReadAlign_outputTranscriptSAM.cpp
+++ b/source/ReadAlign_outputTranscriptSAM.cpp
@@ -2,41 +2,41 @@
 #include "SequenceFuns.h"
 #include "ErrorWarning.h"
 
-uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint mateChr, uint mateStart, char mateStrand, int unmapType, bool *mateMapped, ostream *outStream) {    
-    
-    if (P->outSAMmode=="None") return 0; //no SAM output  
-    
+uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint mateChr, uint mateStart, char mateStrand, int unmapType, bool *mateMapped, ostream *outStream) {
+
+    if (P->outSAMmode=="None") return 0; //no SAM output
+
     uint outStreamPos0=(uint)outStream->tellp();
-    
-    if (unmapType>=0) 
+
+    if (unmapType>=0)
     {//unmapped reads: SAM
         for (uint imate=0;imate<P->readNmates;imate++)
         {//cycle over mates
             if (!mateMapped[imate])
             {
                 uint16 samFLAG=0x4;
-                if (P->readNmates==2) 
+                if (P->readNmates==2)
                 {//paired read
                     samFLAG+=0x1 + (imate==0 ? 0x40 : 0x80);
-                    if (mateMapped[1-imate]) 
+                    if (mateMapped[1-imate])
                     {//mate mapped
-                        if ( trOut.Str != (1-imate) ) 
+                        if ( trOut.Str != (1-imate) )
                         {
                             samFLAG+=0x20;//mate strand reverted
                         };
-                    } else 
+                    } else
                     {//mate unmapped
                         samFLAG+=0x8;
                     };
                 };
 
                 if (readFilter=='Y') samFLAG+=0x200; //not passing quality control
-                
-                if (mateMapped[1-imate] && !trOut.primaryFlag) 
+
+                if (mateMapped[1-imate] && !trOut.primaryFlag)
                 {//mapped mate is not primary
                     samFLAG+=0x100;
                 };
-                
+
                 *outStream << readName+1 <<"\t"<< samFLAG \
                         <<"\t"<< '*' <<"\t"<< '0' <<"\t"<< '0' <<"\t"<< '*';
 
@@ -48,15 +48,15 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
 
                 *outStream <<"\t"<< '0' <<"\t"<< Read0[imate] <<"\t"<< (readFileType==2 ? Qual0[imate]:"*") \
                         <<"\tNH:i:0" <<"\tHI:i:0" <<"\tAS:i:"<<trOut.maxScore <<"\tnM:i:"<<trOut.nMM<<"\tuT:A:" <<unmapType;
-                if (!P->outSAMattrRG.empty()) *outStream<< "\tRG:Z:" <<P->outSAMattrRG.at(readFilesIndex); 
+                if (!P->outSAMattrRG.empty()) *outStream<< "\tRG:Z:" <<P->outSAMattrRG.at(readFilesIndex);
                 *outStream <<"\n";
-                
+
             };
         };
         return (uint)outStream->tellp()-outStreamPos0;
     };//if (unmapType>=0 && outStream != NULL) //unmapped reads: SAM
-    
-    
+
+
     bool flagPaired = P->readNmates==2;
     string CIGAR;
 
@@ -70,40 +70,52 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
         };
     };
 
-    uint samFLAG=0;
-    uint leftMate=0; //the mate (0 or 1) which is on the left
-    for (uint imate=0;imate<nMates;imate++) {
-        if (flagPaired) {//paired reads
-            samFLAG=0x0001;
-            if (iExMate==trOut.nExons-1) {//single mate
-                if (mateChr>P->nChrReal) samFLAG+=0x0008; //not mapped as pair
-            } else {//properly paired
-                samFLAG+=0x0002; //mapped as pair
-            };                                 
-        } else {//single end
-            samFLAG=0;
+    uint samFlagCommon=0;//FLAG common for both mates
+    if (flagPaired) 
+    {//paired reads
+        samFlagCommon=0x0001;
+        if (iExMate==trOut.nExons-1) 
+        {//single mate
+            if (mateChr>P->nChrReal) samFlagCommon+=0x0008; //not mapped as pair
+        } else 
+        {//paired align
+            if (P->alignEndsProtrude.concordantPair || \
+                ( (trOut.exons[0][EX_G] <= trOut.exons[iExMate+1][EX_G]+trOut.exons[0][EX_R]) && \
+                   (trOut.exons[iExMate][EX_G]+trOut.exons[iExMate][EX_L] <= trOut.exons[trOut.nExons-1][EX_G]+Lread-trOut.exons[trOut.nExons-1][EX_R]) )  )                
+            {//properly paired
+                samFlagCommon+=0x0002;
+            };
         };
+    } else 
+    {//single end
+        samFlagCommon=0;
+    };
+
+    if (readFilter=='Y') samFlagCommon+=0x200; //not passing quality control    
 
-        if (readFilter=='Y') samFLAG+=0x200; //not passing quality control
+    uint samFLAG;
+    uint leftMate=0; //the mate (0 or 1) which is on the left
+    for (uint imate=0;imate<nMates;imate++) {
+        samFLAG=samFlagCommon;
 
         uint iEx1 = (imate==0 ? 0 : iExMate+1);
         uint iEx2 = (imate==0 ? iExMate : trOut.nExons-1);
-        uint Mate=trOut.exons[iEx1][EX_iFrag];        
+        uint Mate=trOut.exons[iEx1][EX_iFrag];
         uint Str= trOut.Str;//note that Strand = the mate on the left
-        
+
         if (Mate==0) {
             samFLAG += Str*0x10;
             if (nMates==2) samFLAG += (1-Str)*0x20;
         } else {//second mate strand need to be reverted
             samFLAG += (1-Str)*0x10;
-            if (nMates==2) samFLAG += Str*0x20;            
-        };        
-        
+            if (nMates==2) samFLAG += Str*0x20;
+        };
+
         if (flagPaired) {
             leftMate=Str;
             samFLAG += (Mate==0 ? 0x0040 : 0x0080);
             if (flagPaired && nMates==1 && mateStrand==1) samFLAG +=0x20;//revert strand using inout value of mateStrand (e.g. for chimeric aligns)
-        };        
+        };
 
         //not primary align?
         if (!trOut.primaryFlag) samFLAG +=0x100;
@@ -124,12 +136,12 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
         } else {
             trimL=clip5pNtotal[Mate];
         };
- 
+
         uint trimL1 = trimL + trOut.exons[iEx1][EX_R] - (trOut.exons[iEx1][EX_R]<readLength[leftMate] ? 0 : readLength[leftMate]+1);
         if (trimL1>0) {
             samStreamCIGAR << trimL1 << "S"; //initial trimming
-        };                      
-        
+        };
+
         for (uint ii=iEx1;ii<=iEx2;ii++) {
             if (ii>iEx1) {//record gaps
                 uint gapG=trOut.exons[ii][EX_G]-(trOut.exons[ii-1][EX_G]+trOut.exons[ii-1][EX_L]);
@@ -137,33 +149,33 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
                 //it's possible to have a D or N and I at the same time
                 if (gapR>0){
                     samStreamCIGAR << gapR;
-                    samStreamCIGAR << "I";                            
-                };                
+                    samStreamCIGAR << "I";
+                };
                 if (trOut.canonSJ[ii-1]>=0 || trOut.sjAnnot[ii-1]==1) {//junction: N
-                    samStreamCIGAR << gapG;                        
+                    samStreamCIGAR << gapG;
                     samStreamCIGAR << "N";
                     samStreamSJmotif <<','<< trOut.canonSJ[ii-1] + (trOut.sjAnnot[ii-1]==0 ? 0 : SJ_SAM_AnnotatedMotifShift); //record junction type
-//                     samStreamSJannot <<','<< (int) trOut.sjAnnot[ii-1]; //record annotation type                    
+//                     samStreamSJannot <<','<< (int) trOut.sjAnnot[ii-1]; //record annotation type
                     samStreamSJintron <<','<< trOut.exons[ii-1][EX_G] + trOut.exons[ii-1][EX_L] + 1 - P->chrStart[trOut.Chr] <<','\
                                    << trOut.exons[ii][EX_G] - P->chrStart[trOut.Chr]; //record intron loci
                 } else if (gapG>0) {//deletion: N
                     samStreamCIGAR << gapG;
                     samStreamCIGAR << "D";
                 };
-            };                
+            };
             samStreamCIGAR << trOut.exons[ii][EX_L] << "M";
         };
 
         string SJmotif = samStreamSJmotif.str();
         string SJintron = samStreamSJintron.str();
 //         string SJannot = samStreamSJannot.str();
-        
+
         if (SJmotif.length()==0) {//no junctions recorded, mark with -1
-            SJmotif=",-1"; 
+            SJmotif=",-1";
             SJintron=",-1";
 //             SJannot=",-1";
         };
-        
+
         uint trimR1=(trOut.exons[iEx1][EX_R]<readLength[leftMate] ? \
             readLengthOriginal[leftMate] : readLength[leftMate]+1+readLengthOriginal[Mate]) \
             - trOut.exons[iEx2][EX_R]-trOut.exons[iEx2][EX_L] - trimL;
@@ -172,7 +184,7 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
         };
         CIGAR=samStreamCIGAR.str();
 
-           
+
         char seqMate[DEF_readSeqLengthMax+1], qualMate[DEF_readSeqLengthMax+1];
         char *seqOut=NULL, *qualOut=NULL;
 
@@ -185,9 +197,9 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
             for (uint ii=0;ii<readLengthOriginal[Mate]; ii++) qualMate[ii]=Qual0[Mate][readLengthOriginal[Mate]-1-ii];
             qualMate[readLengthOriginal[Mate]]=0;
             seqOut=&seqMate[0];
-            qualOut=&qualMate[0];            
+            qualOut=&qualMate[0];
         };
-        
+
 //         return;
 
         int MAPQ=P->outSAMmapqUnique;
@@ -198,7 +210,7 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
         } else if (nTrOut==2) {
             MAPQ=3;
         };
-        
+
         *outStream << readName+1 <<"\t"<< ((samFLAG & P->outSAMflagAND) | P->outSAMflagOR) <<"\t"<< P->chrName[trOut.Chr] <<"\t"<< trOut.exons[iEx1][EX_G] + 1 - P->chrStart[trOut.Chr]
                 <<"\t"<< MAPQ <<"\t"<< CIGAR;
 
@@ -211,17 +223,17 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
             *outStream <<"\t"<< "*" <<"\t"<< 0 <<"\t"<< 0;
         };
 
-        
+
         *outStream <<"\t"<< seqOut;
-        
+
         if (readFileType==2 && P->outSAMmode != "NoQS") {//fastq
             *outStream <<"\t"<< qualOut ;
         } else {
             *outStream <<"\t"<< "*";
-        };   
-        
+        };
+
 //         vector<string> customAttr(outSAMattrN,"");
-   
+
         uint tagNM=0;
         string tagMD("");
         if (P->outSAMattrPresent.NM || P->outSAMattrPresent.MD) {
@@ -254,7 +266,7 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
                         tagNM+=trOut.exons[iex+1][EX_R]-trOut.exons[iex][EX_R]-trOut.exons[iex][EX_L];
                     };
                 };
-            };      
+            };
             tagMD+=to_string(matchN);
         };
         for (uint ii=0;ii<P->outSAMattrOrder.size();ii++) {
@@ -267,13 +279,13 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
                     break;
                 case ATTR_AS:
                     *outStream<<"\tAS:i:"<<trOut.maxScore;
-                    break;                    
+                    break;
                 case ATTR_nM:
-                    *outStream<<"\tnM:i:"<<trOut.nMM;   
-                    break;                            
+                    *outStream<<"\tnM:i:"<<trOut.nMM;
+                    break;
                 case ATTR_jM:
                     *outStream<<"\tjM:B:c"<< SJmotif;
-                    break;                            
+                    break;
                 case ATTR_jI:
                     *outStream<<"\tjI:B:i"<< SJintron;
                     break;
@@ -282,7 +294,7 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
                         *outStream<<"\tXS:A:+";
                     } else if (trOut.sjMotifStrand==2) {
                         *outStream<<"\tXS:A:-";
-                    };                    
+                    };
                     break;
                 case ATTR_NM:
                     *outStream<< "\tNM:i:" <<tagNM;
@@ -291,21 +303,21 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
                     *outStream<< "\tMD:Z:" <<tagMD;
                     break;
                 case ATTR_RG:
-                    *outStream<< "\tRG:Z:" <<P->outSAMattrRG.at(readFilesIndex);                    
+                    *outStream<< "\tRG:Z:" <<P->outSAMattrRG.at(readFilesIndex);
                     break;
                 default:
                     ostringstream errOut;
                     errOut <<"EXITING because of FATAL BUG: unknown/unimplemented SAM atrribute (tag): "<<P->outSAMattrOrder[ii] <<"\n";
                     errOut <<"SOLUTION: contact Alex Dobin at dobin at cshl.edu\n";
-                    exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);                         
+                    exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);
             };
         };
-     
-        
+
+
 //         for (uint ii=0;ii<customAttr.size();ii++) *outStream <<"\t"<< customAttr.at(ii); //output all attributes in the right order
-        
+
         *outStream << "\n"; //done with one SAM line
     };//for (uint imate=0;imate<nMates;imate++)
-    
+
     return (uint)outStream->tellp()-outStreamPos0;
 };
diff --git a/source/ReadAlign_outputTranscriptSJ.cpp b/source/ReadAlign_outputTranscriptSJ.cpp
index 26c0ef3..eac1f23 100644
--- a/source/ReadAlign_outputTranscriptSJ.cpp
+++ b/source/ReadAlign_outputTranscriptSJ.cpp
@@ -2,16 +2,16 @@
 #include "OutSJ.h"
 
 void ReadAlign::outputTranscriptSJ(Transcript const &trOut, uint nTrOut, OutSJ *chunkOutSJ, uint sjReadStartN ) {//record junctions in chunkOutSJ array
-    
-    //TODO: make sure that a junction is recorded onyl once from one read. 
+
+    //TODO: make sure that a junction is recorded onyl once from one read.
     //For a multimapper, several alignments may contain the same junctions - now it's recorded several time.
 //     if (nTrOut>1) return; //junctions from multi-mappers are not recorded
-    
+
 //     if (P->outSAMmode=="None") return; //no SAM output
-                   
+
     for (uint iex=0;iex<trOut.nExons-1;iex++) {//record all junctions
         if (trOut.canonSJ[iex]>=0) {//only record junctions, not indels or mate gap
-            chunkOutSJ->oneSJ.junctionPointer(chunkOutSJ->data, chunkOutSJ->N);//get pointer to an empty junction in the data array         
+            chunkOutSJ->oneSJ.junctionPointer(chunkOutSJ->data, chunkOutSJ->N);//get pointer to an empty junction in the data array
             *chunkOutSJ->oneSJ.start=trOut.exons[iex][EX_G]+trOut.exons[iex][EX_L]; //start of the intron
             *chunkOutSJ->oneSJ.gap=trOut.exons[iex+1][EX_G]-*chunkOutSJ->oneSJ.start;
             //overhangs: basic method
@@ -19,8 +19,8 @@ void ReadAlign::outputTranscriptSJ(Transcript const &trOut, uint nTrOut, OutSJ *
             //*chunkOutSJ->oneSJ.overhangRight = (uint32) trOut.exons[iex+1][EX_L];
             //overhangs: min method
             *chunkOutSJ->oneSJ.overhangLeft = min ( (uint32) trOut.exons[iex][EX_L],(uint32) trOut.exons[iex+1][EX_L] );
-            *chunkOutSJ->oneSJ.overhangRight = *chunkOutSJ->oneSJ.overhangLeft;            
-            
+            *chunkOutSJ->oneSJ.overhangRight = *chunkOutSJ->oneSJ.overhangLeft;
+
             //check if this junction has been recorded from this read - this happens when the mates overlap and cross the same junctions
             bool duplicateSJ(false);
             for (uint ii=sjReadStartN; ii<chunkOutSJ->N; ii++) {//TODO if there are many junctions, need to make more efficient
@@ -36,9 +36,9 @@ void ReadAlign::outputTranscriptSJ(Transcript const &trOut, uint nTrOut, OutSJ *
                 };
             };
             if (duplicateSJ) continue; //do not record this junctions
-            
-            *chunkOutSJ->oneSJ.motif=trOut.canonSJ[iex];            
-            *chunkOutSJ->oneSJ.strand=(char) (trOut.canonSJ[iex]==0 ? 0 : (trOut.canonSJ[iex]+1)%2+1);  
+
+            *chunkOutSJ->oneSJ.motif=trOut.canonSJ[iex];
+            *chunkOutSJ->oneSJ.strand=(char) (trOut.canonSJ[iex]==0 ? 0 : (trOut.canonSJ[iex]+1)%2+1);
             *chunkOutSJ->oneSJ.annot=trOut.sjAnnot[iex];
             if (nTrOut==1) {
                 *chunkOutSJ->oneSJ.countUnique=1;
@@ -47,7 +47,7 @@ void ReadAlign::outputTranscriptSJ(Transcript const &trOut, uint nTrOut, OutSJ *
                 *chunkOutSJ->oneSJ.countMultiple=1; //TODO: 1/nTrOut?
                 *chunkOutSJ->oneSJ.countUnique=0; //TODO: 1/nTrOut?
             };
-            
+
             chunkOutSJ->N++;//increment the number of recorded junctions
         };
     };
diff --git a/source/ReadAlign_quantTranscriptome.cpp b/source/ReadAlign_quantTranscriptome.cpp
index 5619b47..a1b1b5d 100644
--- a/source/ReadAlign_quantTranscriptome.cpp
+++ b/source/ReadAlign_quantTranscriptome.cpp
@@ -5,18 +5,18 @@
 #include <random>
 
 uint ReadAlign::quantTranscriptome (Transcriptome *Tr, uint nAlignG, Transcript **alignG, Transcript *alignT) {
-    uint nAlignT=0;    
+    uint nAlignT=0;
     for (uint iag=0; iag<nAlignG; iag++) {//transform all alignments
-        
+
         if (!P->quant.trSAM.indel && (alignG[iag]->nDel>0 || alignG[iag]->nIns>0) )
         {//prevent indels if requested
             continue;
         };
         if (!P->quant.trSAM.singleEnd && (P->readNmates==2 && alignG[iag]->exons[0][EX_iFrag]==alignG[iag]->exons[alignG[iag]->nExons-1][EX_iFrag]) )
         {//prevent single end alignments
-            continue; 
+            continue;
         };
-        
+
         uint nMM1=0;
         char* R=Read1[alignG[iag]->roStr==0 ? 0:2];
         if (!P->quant.trSAM.softClip)
@@ -28,10 +28,10 @@ uint ReadAlign::quantTranscriptome (Transcriptome *Tr, uint nAlignG, Transcript
                 } else if (alignG[iag]->canonSJ[iab-1]==-3) {
                     left1=alignG[iag]->exons[iab][EX_R]-readLength[alignG[iag]->exons[iab-1][EX_iFrag]]-1;
                 };
-                if (iab==alignG[iag]->nExons-1)                    
+                if (iab==alignG[iag]->nExons-1)
                 {//last block of left mates
                     right1=Lread-alignG[iag]->exons[iab][EX_R]-alignG[iag]->exons[iab][EX_L];
-                    
+
                 } else if (alignG[iag]->canonSJ[iab]==-3)
                 {//last block of the right mate (i.e. whole read)
                     right1=readLength[alignG[iag]->exons[iab][EX_iFrag]]-alignG[iag]->exons[iab][EX_R]-alignG[iag]->exons[iab][EX_L];
@@ -46,35 +46,35 @@ uint ReadAlign::quantTranscriptome (Transcriptome *Tr, uint nAlignG, Transcript
                     char r1=R[alignG[iag]->exons[iab][EX_R]+alignG[iag]->exons[iab][EX_L]+b];
                     char g1=G[alignG[iag]->exons[iab][EX_G]+alignG[iag]->exons[iab][EX_L]+b];
                     if ( r1!=g1 && r1<4 && g1<4) ++nMM1;
-                };            
+                };
                 alignG[iag]->exons[iab][EX_R] -= left1;
                 alignG[iag]->exons[iab][EX_G] -= left1;
                 alignG[iag]->exons[iab][EX_L] += left1+right1;
             };
-            
-            if ( (alignG[iag]->nMM + nMM1) > min(outFilterMismatchNmaxTotal, (uint) (P->outFilterMismatchNoverLmax*(Lread-1)) ) ) 
+
+            if ( (alignG[iag]->nMM + nMM1) > min(outFilterMismatchNmaxTotal, (uint) (P->outFilterMismatchNoverLmax*(Lread-1)) ) )
             {//extension of soft clips yielded too many mismatches, no output
                 continue;
             };
         };
-        
+
 //         if (alignG[iag]->mappedLength==(readLength[0]+readLength[1]) && alignG[iag]->nDel==0) {//remove transcripts that contain indels of soft-clipping //TODO make this optional
         nAlignT += Tr->quantAlign(*alignG[iag],alignT+nAlignT);
 //         };
     };
-    
+
     alignT[int(rngUniformReal0to1(rngMultOrder)*nAlignT)].primaryFlag=true;
-    
+
     for (uint iatr=0;iatr<nAlignT;iatr++) {//write all transcripts
 //         alignBAM(alignT[iatr], nAlignT, iatr, 0, (uint) -1, (uint) -1, 0, -1, NULL, outBAMoneAlign, outBAMoneAlignNbytes);
 //         outBAMarray1+=bamBytes;
 //         outBAMbytes1+=bamBytes;
-        alignBAM(alignT[iatr], nAlignT, iatr, 0, (uint) -1, (uint) -1, 0, -1, NULL, P->outSAMattrOrderQuant, outBAMoneAlign, outBAMoneAlignNbytes);        
+        alignBAM(alignT[iatr], nAlignT, iatr, 0, (uint) -1, (uint) -1, 0, -1, NULL, P->outSAMattrOrderQuant, outBAMoneAlign, outBAMoneAlignNbytes);
         for (uint imate=0; imate<P->readNmates; imate++) {//output each mate
             outBAMquant->unsortedOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], (imate>0 || iatr>0) ? 0 : (outBAMoneAlignNbytes[0]+outBAMoneAlignNbytes[1])*2*nAlignT);
-        };        
+        };
     };
-    
+
     //not used anymore, at Colin Dewey's request
 //     if (nAlignT==0 && P->outSAMunmapped=="Within") {//read could be mapped to genome, but not transcriptome - output as unmapped
 //         uint unmapType=5;
@@ -83,8 +83,8 @@ uint ReadAlign::quantTranscriptome (Transcriptome *Tr, uint nAlignG, Transcript
 //             for (uint imate=0; imate<P->readNmates; imate++) {//output each mate
 //                 outBAMquant->unsortedOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], imate>0 ? 0 : outBAMoneAlignNbytes[0]+outBAMoneAlignNbytes[1]);
 //             };
-// 
+//
 //     };
-    
-    return nAlignT;    
+
+    return nAlignT;
 };
diff --git a/source/ReadAlign_stitchPieces.cpp b/source/ReadAlign_stitchPieces.cpp
index 25fa8c4..3488490 100644
--- a/source/ReadAlign_stitchPieces.cpp
+++ b/source/ReadAlign_stitchPieces.cpp
@@ -11,12 +11,12 @@
 #include <time.h>
 
 void ReadAlign::stitchPieces(char **R, char **Q, char *G, PackedArray& SA, uint Lread) {
-    
+
        //zero-out winBin
     memset(winBin[0],255,sizeof(winBin[0][0])*P->winBinN);
     memset(winBin[1],255,sizeof(winBin[0][0])*P->winBinN);
 
-    
+
 //     for (uint iWin=0;iWin<nWall;iWin++) {//zero out winBin
 //         if (WC[iWin][WC_gStart]<=WC[iWin][WC_gEnd]) {//otherwise the window is dead
 //             memset(&(winBin[WC[iWin][WC_Str]][WC[iWin][WC_gStart]]),255,sizeof(winBin[0][0])*(WC[iWin][WC_gEnd]-WC[iWin][WC_gStart]+1));
@@ -25,7 +25,7 @@ void ReadAlign::stitchPieces(char **R, char **Q, char *G, PackedArray& SA, uint
 // //             winBin[WC[WC_Str]
 // //         };
 //     };
-    
+
 //     //debug
 //     for (uint ii=0;ii<P->winBinN;ii++){
 //         if (winBin[0][ii]!=uintWinBinMax || winBin[1][ii]!=uintWinBinMax) {
@@ -36,21 +36,21 @@ void ReadAlign::stitchPieces(char **R, char **Q, char *G, PackedArray& SA, uint
 //             exit(1);
 //         };
 //     };
-    
-    
+
+
     nW=0; //number of windows
     for (uint iP=0; iP<nP; iP++) {//scan through all anchor pieces, create alignment windows
 
 //          if (PC[iP][PC_Nrep]<=P->winAnchorMultimapNmax || PC[iP][PC_Length]>=readLength[PC[iP][PC_iFrag]] ) {//proceed if piece is an anchor, i.e. maps few times or is long enough
        if (PC[iP][PC_Nrep]<=P->winAnchorMultimapNmax ) {//proceed if piece is an anchor, i.e. maps few times
-            
-            uint aDir   = PC[iP][PC_Dir];     
-            uint aLength= PC[iP][PC_Length];            
+
+            uint aDir   = PC[iP][PC_Dir];
+            uint aLength= PC[iP][PC_Length];
 
             for (uint iSA=PC[iP][PC_SAstart]; iSA<=PC[iP][PC_SAend]; iSA++) {//scan through all alignments of this piece
 
                 uint a1 = SA[iSA];
-                uint aStr = a1 >> P->GstrandBit;           
+                uint aStr = a1 >> P->GstrandBit;
                 a1 &= P->GstrandMask; //remove strand bit
 
                 //convert to positive strand
@@ -60,129 +60,129 @@ void ReadAlign::stitchPieces(char **R, char **Q, char *G, PackedArray& SA, uint
                     a1 = P->nGenome - (aLength+a1);
                 } else if (aDir==1 && aStr==1) {
                     aStr=0;
-                    a1 = P->nGenome - (aLength+a1);         
+                    a1 = P->nGenome - (aLength+a1);
                 };
 
-                //final strand            
+                //final strand
                 if (revertStrand) { //modified strand according to user input CHECK!!!!
                     aStr=1-aStr;
-                };   
+                };
 
                 if (a1>=P->sjGstart) {//this is sj align
-                    uint a1D, aLengthD, a1A, aLengthA, sj1;              
+                    uint a1D, aLengthD, a1A, aLengthA, sj1;
                     if (sjAlignSplit(a1, aLength, P, a1D, aLengthD, a1A, aLengthA, sj1)) {//align crosses the junction
 
                         int addStatus=createExtendWindowsWithAlign(a1D, aStr);//add donor piece
                         if (addStatus==EXIT_createExtendWindowsWithAlign_TOO_MANY_WINDOWS) {//too many windows
                             break;
-                        };         
+                        };
                         addStatus=createExtendWindowsWithAlign(a1A, aStr);//add acceptor piece
                         if (addStatus==EXIT_createExtendWindowsWithAlign_TOO_MANY_WINDOWS) {//too many windows
                             break;
-                        };                       
+                        };
                     };
                 } else {//this is a normal genomic read
                     int addStatus=createExtendWindowsWithAlign(a1, aStr);
                     if (addStatus==EXIT_createExtendWindowsWithAlign_TOO_MANY_WINDOWS) {//too many windows
                         break;
-                    };                
-                };           
+                    };
+                };
             }; //for (uint iSA=PC[iP][PC_SAstart]; iSA<=PC[iP][PC_SAend]; iSA++) //scan through all alignments of this piece
         };//if (PC[iP][PC_Nrep]<=P->winAnchorMultimapNmax) //proceed if anchor
     };//for (uint iP=0; iP<nP; iP++) //scan through all anchor pieces, create alignment windows
-    
-    
+
+
     for (uint iWin=0;iWin<nW;iWin++) {//extend windows with flanks
         if (WC[iWin][WC_gStart]<=WC[iWin][WC_gEnd]) {//otherwise the window is dead
-                       
+
             uint wb=WC[iWin][WC_gStart];
             for (uint ii=0; ii<P->winFlankNbins && wb>0 && P->chrBin[(wb-1) >> P->winBinChrNbits]==WC[iWin][WC_Chr];ii++) {
                 wb--;
                 winBin[ WC[iWin][WC_Str] ][ wb ]=(uintWinBin) iWin;
             };
             WC[iWin][WC_gStart] = wb;
-            
+
             wb=WC[iWin][WC_gEnd];
             for (uint ii=0; ii<P->winFlankNbins && wb+1<P->winBinN && P->chrBin[(wb+1) >> P->winBinChrNbits]==WC[iWin][WC_Chr];ii++) {
                 wb++;
                 winBin[ WC[iWin][WC_Str] ][ wb ]=(uintWinBin) iWin;
             };
             WC[iWin][WC_gEnd] = wb;
-            
-          
+
+
         };
         nWA[iWin]=0; //initialize nWA
-        WALrec[iWin]=0; //initialize rec-length        
+        WALrec[iWin]=0; //initialize rec-length
         WlastAnchor[iWin]=-1;
     };
-    
+
     nWall=nW;
-    
+
     #ifdef OFF_BEFORE_SEEDdistribution
         #warning OFF_BEFORE_SEEDdistribution
         nW=0;
         nTr=0;
         return;
     #endif
-        
+
     for (uint iP=0; iP<nP; iP++) {//scan through all pieces/aligns, add them to alignment windows, create alignment coordinates
         uint aNrep=PC[iP][PC_Nrep];
-        uint aFrag=PC[iP][PC_iFrag];  
-        uint aLength=PC[iP][PC_Length];      
-        uint aDir=PC[iP][PC_Dir];     
-        
-        bool aAnchor=(aNrep<=P->winAnchorMultimapNmax); //this align is an anchor or not            
+        uint aFrag=PC[iP][PC_iFrag];
+        uint aLength=PC[iP][PC_Length];
+        uint aDir=PC[iP][PC_Dir];
+
+        bool aAnchor=(aNrep<=P->winAnchorMultimapNmax); //this align is an anchor or not
 
         for (uint ii=0;ii<nW;ii++) {//initialize nWAP
             nWAP[ii]=0;
         };
-        
+
         for (uint iSA=PC[iP][PC_SAstart]; iSA<=PC[iP][PC_SAend]; iSA++) {//scan through all alignments
 
             uint a1 = SA[iSA];
-            uint aStr = a1 >> P->GstrandBit;           
+            uint aStr = a1 >> P->GstrandBit;
             a1 &= P->GstrandMask; //remove strand bit
             uint aRstart=PC[iP][PC_rStart];
 
             //convert to positive strand
             if (aDir==1 && aStr==0) {
                 aStr=1;
-                aRstart = Lread - (aLength+aRstart);                
+                aRstart = Lread - (aLength+aRstart);
             } else if (aDir==0 && aStr==1) {
-                aRstart = Lread - (aLength+aRstart);                                
+                aRstart = Lread - (aLength+aRstart);
                 a1 = P->nGenome - (aLength+a1);
             } else if (aDir==1 && aStr==1) {
                 aStr=0;
-                a1 = P->nGenome - (aLength+a1);         
+                a1 = P->nGenome - (aLength+a1);
             };
-     
-            //final strand            
+
+            //final strand
             if (revertStrand) { //modified strand according to user input CHECK!!!!
                 aStr=1-aStr;
-            };             
+            };
+
 
-            
             if (a1>=P->sjGstart) {//this is sj read
-                uint a1D, aLengthD, a1A, aLengthA, isj1;              
+                uint a1D, aLengthD, a1A, aLengthA, isj1;
                 if (sjAlignSplit(a1, aLength, P, a1D, aLengthD, a1A, aLengthA, isj1)) {//align crosses the junction
 
                         assignAlignToWindow(a1D, aLengthD, aStr, aNrep, aFrag, aRstart, aAnchor, isj1);
                         assignAlignToWindow(a1A, aLengthA, aStr, aNrep, aFrag, aRstart+aLengthD, aAnchor, isj1);
-                        
+
                     } else {//align does not cross the junction
                         continue; //do not check this align, continue to the next one
                     };
-                    
+
                 } else {//this is a normal genomic read
                     assignAlignToWindow(a1, aLength, aStr, aNrep, aFrag, aRstart, aAnchor, -1);
                 };
         };
-        
+
 //         for (uint ii=0;ii<nW;ii++) {//check of some pieces created too many aligns in some windows, and remove those from WA (ie shift nWA indices
 //             if (nWAP[ii]>P->seedNoneLociPerWindow) nWA[ii] -= nWAP[ii];
 //         };
     };
-    
+
     //TODO remove windows that have too many alignments
     //aligns are still sorted by original read coordinates, change direction for negative strand
     // DOES NOT HELP!!!
@@ -217,14 +217,14 @@ for (uint iW=0;iW<nW;iW++) {//check each window
                     swWinCov[iW] += r1+L1-(rLast+1);
                 };
                 rLast=r1+L1-1;
-            };                    
+            };
         };//for (uint ia=0; ia<nWA[iW]; ia++)
 
         if (swWinCov[iW]>swWinCovMax) swWinCovMax=swWinCov[iW];
     };//if (nWA[iW]>0)
 };//for (uint iW=0;iW<nW;iW++)
 for (uint iW=0;iW<nW;iW++) {
-    if (swWinCov[iW]<swWinCovMax*5/10) {//remove windows that are not good enough
+    if (swWinCov[iW]<swWinCovMax*P->winReadCoverageRelativeMin || swWinCov[iW]<P->winReadCoverageBasesMin) {//remove windows that are not good enough
         nWA[iW]=0;
     } else {//merge pieces that are adjacent in R- and G-spaces
         uint ia1=0;
@@ -232,11 +232,11 @@ for (uint iW=0;iW<nW;iW++) {
             if ( WA[iW][ia][WA_rStart] == (WA[iW][ia1][WA_rStart]+WA[iW][ia1][WA_Length]) \
               && WA[iW][ia][WA_gStart] == (WA[iW][ia1][WA_gStart]+WA[iW][ia1][WA_Length]) \
               && WA[iW][ia][WA_iFrag]  ==  WA[iW][ia1][WA_iFrag]     ) {//merge
-                
+
                 WA[iW][ia1][WA_Length] += WA[iW][ia][WA_Length];
                 WA[iW][ia1][WA_Anchor]=max(WA[iW][ia1][WA_Anchor],WA[iW][ia][WA_Anchor]);
                 //NOTE: I am not updating sjA and Nrep fields - this could cause trouble in some cases
-                
+
             } else {//do not merge
                 ia1++;
                 if (ia1!=ia) {//move from ia to ia1
@@ -253,7 +253,7 @@ for (uint iW=0;iW<nW;iW++) {
 //mapping time initialize
 std::time(&timeStart);
 #endif
-    
+
     #ifdef OFF_BEFORE_STITCH
         #warning OFF_BEFORE_STITCH
         nW=0;
@@ -265,28 +265,28 @@ std::time(&timeStart);
     trBest = trNext = trInit; //initialize next/best
     uint iW1=0;//index of non-empty windows
     uint trNtotal=0; //total number of recorded transcripts
-   
+
     for (uint iW=0; iW<nW; iW++) {//transcripts for all windows
 
-        if (nWA[iW]==0) continue; //the window does not contain any aligns because it was merged with other windows        
-        
+        if (nWA[iW]==0) continue; //the window does not contain any aligns because it was merged with other windows
+
 //         {//debug
 //             if ( WA[iW][0][WA_iFrag]==WA[iW][nWA[iW]-1][WA_iFrag] ) continue;
 //         };
-//         
+//
         if (WlastAnchor[iW]<nWA[iW]) {
             WA[ iW ][ WlastAnchor[iW] ][ WA_Anchor]=2; //mark the last anchor
         };
-        
+
         for (uint ii=0;ii<nWA[iW];ii++) WAincl[ii]=false; //initialize mask
-        
-        trInit->nWAmax=max(nWA[iW],trInit->nWAmax);        
+
+        trInit->nWAmax=max(nWA[iW],trInit->nWAmax);
         trA=*trInit; //that one is initialized
         trA.Chr = WC[iW][WC_Chr];
         trA.Str = WC[iW][WC_Str];
         trA.roStr = revertStrand ? 1-trA.Str : trA.Str; //original strand of the read
         trA.maxScore=0;
-        
+
         trAll[iW1]=trArrayPointer+trNtotal;
         if (trNtotal+P->alignTranscriptsPerWindowNmax >= P->alignTranscriptsPerReadNmax) {
             P->inOut->logMain << "WARNING: not enough space allocated for transcript. Did not process all windows for read "<< readName+1 <<endl;
@@ -295,40 +295,59 @@ std::time(&timeStart);
         };
         *(trAll[iW1][0])=trA;
         nWinTr[iW1]=0; //initialize number of transcripts per window
-        
-        
+
+
     #ifdef COMPILE_FOR_LONG_READS
-        stitchWindowSeeds(iW, iW1, R[trA.roStr==0 ? 0:2], Q[trA.roStr], G);
+        stitchWindowSeeds(iW, iW1, NULL, R[trA.roStr==0 ? 0:2], Q[trA.roStr], G);
+        if (P->chimSegmentMin>0) {
+            for (uint ia=0;ia<nWA[iW];ia++)
+            {//mark all seeds that overlap the best (and only for now) transcript trA
+                if (WAincl[ia]) continue;
+                for (uint iex=0;iex<trA.nExons;iex++)
+                {
+                    if ( WA[iW][ia][WA_rStart] < (trA.exons[iex][EX_R]+trA.exons[iex][EX_L]) && \
+                        (WA[iW][ia][WA_rStart]+WA[iW][ia][WA_Length]) > trA.exons[iex][EX_R] && \
+                         WA[iW][ia][WA_gStart] < (trA.exons[iex][EX_G]+trA.exons[iex][EX_L]) && \
+                        (WA[iW][ia][WA_gStart]+WA[iW][ia][WA_Length]) > trA.exons[iex][EX_G] )
+                    {
+                        WAincl[ia]=true;
+                        break;
+                    };
+                    
+                };
+            };
+            stitchWindowSeeds(iW, iW1, WAincl, R[trA.roStr==0 ? 0:2], Q[trA.roStr], G);
+        };
     #else
         stitchWindowAligns(0, nWA[iW], 0, WAincl, 0, 0, trA, Lread, WA[iW], R[trA.roStr==0 ? 0:2], Q[trA.roStr], G, sigG, P, trAll[iW1], nWinTr+iW1, this);
     #endif
-        trAll[iW1][0]->nextTrScore= nWinTr[iW1]==1 ? 0 : trAll[iW1][1]->maxScore;        
-        
+        trAll[iW1][0]->nextTrScore= nWinTr[iW1]==1 ? 0 : trAll[iW1][1]->maxScore;
+
         if (trAll[iW1][0]->maxScore > trBest->maxScore || (trAll[iW1][0]->maxScore == trBest->maxScore && trAll[iW1][0]->gLength < trBest->gLength ) ) {
             trNext=trBest;
             trBest=trAll[iW1][0];
         };
 
-        trNtotal += nWinTr[iW1];        
+        trNtotal += nWinTr[iW1];
         iW1++;
     };
-    
+
     nW=iW1;//only count windows that had alignments
-    
+
 //     {//debug
 //         std::time(&timeFinish);
 //         double timeDiff=difftime(timeFinish,timeStart);
 //         cout << "     "<< timeDiff << "     "<<trBest->maxScore*100/Lread<<"   "<<iRead<<endl;;
 //     };
-    
+
     if (trBest->maxScore==0) {//no window was aligned (could happen if for all windows too many reads are multiples)
         mapMarker = MARKER_NO_GOOD_WINDOW;
         nW=0;
         nTr=0;
         return;
     };
-            
+
     nextWinScore=trNext->maxScore;
-   
+
 };//end of function
 
diff --git a/source/ReadAlign_stitchWindowSeeds.cpp b/source/ReadAlign_stitchWindowSeeds.cpp
index 43d20c2..35b53b6 100644
--- a/source/ReadAlign_stitchWindowSeeds.cpp
+++ b/source/ReadAlign_stitchWindowSeeds.cpp
@@ -8,117 +8,127 @@
 #include "binarySearch2.h"
 #include "ErrorWarning.h"
 
-void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char* G) {//stitches all seeds in one window: iW
+void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, bool *WAexcl, char *R, char *Q, char *G) {//stitches all seeds in one window: iW
 
     for (uint iS1=0;iS1<nWA[iW];iS1++) {
         scoreSeedBest[iS1]=0;
         scoreSeedBestMM[iS1]=0;
         scoreSeedBestInd[iS1]=-1;
+        if (WAexcl!=NULL && WAexcl[iS1]) continue; //do not include this seed
         intScore score2=0;
         for (uint iS2=0;iS2<=iS1;iS2++) {
+            if (WAexcl!=NULL && WAexcl[iS1]) continue; //do not include this seed
             trA1=*trInit;//initialize trA1
             if (iS2<iS1) {
                 trA1.nExons=1;
                 trA1.nMM=scoreSeedBestMM[iS2];
                 trA1.exons[0][EX_R] = WA[iW][iS2][WA_rStart];
                 trA1.exons[0][EX_G] = WA[iW][iS2][WA_gStart];
-                trA1.exons[0][EX_L] = WA[iW][iS2][WA_Length];  
+                trA1.exons[0][EX_L] = WA[iW][iS2][WA_Length];
                 trA1.exons[0][EX_iFrag]=WA[iW][iS2][WA_iFrag];
                 trA1.exons[0][EX_sjA]=WA[iW][iS2][WA_sjA];
                 score2=\
                     stitchAlignToTranscript(WA[iW][iS2][WA_rStart]+WA[iW][iS2][WA_Length]-1, WA[iW][iS2][WA_gStart]+WA[iW][iS2][WA_Length]-1,\
                                         WA[iW][iS1][WA_rStart], WA[iW][iS1][WA_gStart], WA[iW][iS1][WA_Length], WA[iW][iS1][WA_iFrag],  WA[iW][iS1][WA_sjA], \
-                                        P, R, Q, G, &trA1, outFilterMismatchNmaxTotal);  
-                
-                if (P->outFilterBySJoutStage==2 && trA1.nExons>1) 
+                                        P, R, Q, G, &trA1, outFilterMismatchNmaxTotal);
+
+                if (P->outFilterBySJoutStage==2 && trA1.nExons>1)
                 {//junctions have to be present in the filtered set P->sjnovel
                     uint iex=0;
-                    if (trA1.canonSJ[iex]>=0 && trA1.sjAnnot[iex]==0) 
+                    if (trA1.canonSJ[iex]>=0 && trA1.sjAnnot[iex]==0)
                     {
                         uint jS=trA1.exons[iex][EX_G]+trA1.exons[iex][EX_L];
                         uint jE=trA1.exons[iex+1][EX_G]-1;
                         if ( binarySearch2(jS,jE,P->sjNovelStart,P->sjNovelEnd,P->sjNovelN) < 0 ) return;
                     };
-                };                 
+                };
+
+                //check the length of the iS2 exon. TODO: build the transcripts vs iS1, check the actual exon length
+                bool exonLongEnough = trA1.exons[0][EX_L] >= ( trA1.sjAnnot[0]==0 ? P->alignSJoverhangMin : P->alignSJDBoverhangMin );
                 
-                if (score2>0 && score2+scoreSeedBest[iS2] > scoreSeedBest[iS1] ) {
+                if (exonLongEnough && score2>0 && score2+scoreSeedBest[iS2] > scoreSeedBest[iS1] ) {
                     scoreSeedBest[iS1]=score2+scoreSeedBest[iS2];
                     scoreSeedBestMM[iS1]=trA1.nMM;
                     scoreSeedBestInd[iS1]=iS2;
-                };                
+                };
             } else {//extend to the left
-                score2=WA[iW][iS1][WA_Length];                
+                score2=WA[iW][iS1][WA_Length];
                 if ( WA[iW][iS1][WA_rStart]>0 \
                      && extendAlign(R, Q, G, WA[iW][iS1][WA_rStart]-1, WA[iW][iS1][WA_gStart]-1, -1, -1, WA[iW][iS1][WA_rStart], 100000, 0, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
                                     P->alignEndsType.ext[WA[iW][iS1][WA_iFrag]][trA.Str], &trA1) ) {//if could extend
                     score2 += trA1.maxScore;
                 };
-                if (score2 > scoreSeedBest[iS1] ) {
+                
+                bool exonLongEnough = (WA[iW][iS1][WA_Length]+trA1.extendL) >= P->alignSJoverhangMin; //TODO new parameter to control end exons length
+                
+                if (exonLongEnough && score2 > scoreSeedBest[iS1] ) {
                     scoreSeedBest[iS1]=score2;
                     scoreSeedBestInd[iS1]=iS1;
-//                     scoreSeedBestMM[iS1]=trA1.nMM;                    
-                };                                
+//                     scoreSeedBestMM[iS1]=trA1.nMM;
+                };
             };
-            
-
-            
         };
     };
-    
+
     intScore scoreBest=0;
     uint scoreBestInd=0;
     
+
     for (uint iS1=0;iS1<nWA[iW];iS1++) {//find the best alignment
-       trA1=*trInit;//initialize trA1     
-       uint tR2=WA[iW][iS1][WA_rStart]+WA[iW][iS1][WA_Length];
-       uint tG2=WA[iW][iS1][WA_gStart]+WA[iW][iS1][WA_Length];
-       if ( tR2 < Lread-1 \
+        trA1=*trInit;//initialize trA1
+        uint tR2=WA[iW][iS1][WA_rStart]+WA[iW][iS1][WA_Length];
+        uint tG2=WA[iW][iS1][WA_gStart]+WA[iW][iS1][WA_Length];
+        if ( tR2 < Lread-1 \
             && extendAlign(R, Q, G, tR2, tG2, +1, +1, Lread-tR2, 100000, scoreSeedBestMM[iS1], outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
-                           P->alignEndsType.ext[WA[iW][iS1][WA_iFrag]][1-trA.Str], &trA1) ) 
-       {//extend to the right
-           scoreSeedBest[iS1]+=trA1.maxScore;
-       };
-       if (scoreSeedBest[iS1]>scoreBest) {//record new best transcript
-           scoreBest=scoreSeedBest[iS1];
-           scoreBestInd=iS1;
-       };
-    };    
-    
+                           P->alignEndsType.ext[WA[iW][iS1][WA_iFrag]][1-trA.Str], &trA1) )
+        {//extend to the right
+            scoreSeedBest[iS1]+=trA1.maxScore;
+        };
+        
+        bool exonLongEnough = (WA[iW][iS1][WA_Length]+trA1.extendL) >= P->alignSJoverhangMin; //TODO new parameter to control end exons length
+        
+        if (exonLongEnough && scoreSeedBest[iS1]>scoreBest) {//record new best transcript
+            scoreBest=scoreSeedBest[iS1];
+            scoreBestInd=iS1;
+        };
+    };
+
     uint seedN=0;
     while (true) {//construct the sequence of seeds
         seedChain[seedN++]=scoreBestInd;
+        WAincl[scoreBestInd]=true;
         if (scoreBestInd>scoreSeedBestInd[scoreBestInd]){//keep going
             scoreBestInd=scoreSeedBestInd[scoreBestInd];
-        } else {//this seed is hte first one
+        } else {//this seed is the first one
             break;
         };
     };
-    
+
     int Score=0;
-    {//build final transcript form seedChain      
+    {//build final transcript form seedChain
         {//initiate transcript
-            
+
             uint iS1=seedChain[seedN-1];
             Score= WA[iW][iS1][WA_Length];
             trA.maxScore = Score;
             trA.nMatch = WA[iW][iS1][WA_Length]; //# of matches
             trA.nMM = 0;
-            
+
             trA.exons[0][EX_R] = trA.rStart = WA[iW][iS1][WA_rStart];
             trA.exons[0][EX_G] = trA.gStart = WA[iW][iS1][WA_gStart];
-            trA.exons[0][EX_L] = WA[iW][iS1][WA_Length];  
+            trA.exons[0][EX_L] = WA[iW][iS1][WA_Length];
             trA.exons[0][EX_iFrag]=WA[iW][iS1][WA_iFrag];
             trA.exons[0][EX_sjA]=WA[iW][iS1][WA_sjA];
-                
+
             trA.nExons=1;
-            
+
         };
-            
+
         for (uint iSc=seedN-1; iSc>0; iSc--) {//stitch seeds from the chain
             uint iS1=seedChain[iSc], iS2=seedChain[iSc-1];
             int scoreStitch= stitchAlignToTranscript(WA[iW][iS1][WA_rStart]+WA[iW][iS1][WA_Length]-1, WA[iW][iS1][WA_gStart]+WA[iW][iS1][WA_Length]-1,\
                                         WA[iW][iS2][WA_rStart], WA[iW][iS2][WA_gStart], WA[iW][iS2][WA_Length], WA[iW][iS2][WA_iFrag],  WA[iW][iS2][WA_sjA], \
-                                        P, R, Q, G, &trA, outFilterMismatchNmaxTotal);  
+                                        P, R, Q, G, &trA, outFilterMismatchNmaxTotal);
 //            if (scoreStitch>0) {
                 Score+=scoreStitch;
 //           } else {
@@ -126,42 +136,42 @@ void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char*
 //                return;//this should not happen
 //            };
         };
-        
+
         trA.maxScore=Score;
-        
+
         {//extend to the left
             trA1=*trInit;
             if ( trA.exons[0][EX_R]>0 \
-                 && extendAlign(R, Q, G, trA.exons[0][EX_R]-1, trA.exons[0][EX_G]-1, -1, -1, trA.exons[0][EX_R], 100000, 0, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, 
+                 && extendAlign(R, Q, G, trA.exons[0][EX_R]-1, trA.exons[0][EX_G]-1, -1, -1, trA.exons[0][EX_R], 100000, 0, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax,
                     P->alignEndsType.ext[trA.exons[0][EX_iFrag]][trA.Str], &trA1) ) {//if could extend
 
                 trA.add(&trA1);
 
                 trA.exons[0][EX_R] -=  trA1.extendL;
                 trA.exons[0][EX_G] -=  trA1.extendL;
-                trA.exons[0][EX_L] +=  trA1.extendL;  
+                trA.exons[0][EX_L] +=  trA1.extendL;
                 trA.rStart = trA.exons[0][EX_R];
                 trA.gStart = trA.exons[0][EX_G];
             };
-        };        
-        
+        };
+
         {//extend to the right
             uint iS1=seedChain[0];
-            trA1=*trInit;//initialize trA1        
+            trA1=*trInit;//initialize trA1
             uint tR2=WA[iW][iS1][WA_rStart]+WA[iW][iS1][WA_Length];
             uint tG2=WA[iW][iS1][WA_gStart]+WA[iW][iS1][WA_Length];
             if ( tR2 < Lread \
                 && extendAlign(R, Q, G, tR2, tG2, +1, +1, Lread-tR2, 100000, scoreSeedBestMM[iS1], outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
                     P->alignEndsType.ext[trA.exons[trA.nExons-1][EX_iFrag]][1-trA.Str], &trA1) ) {//if could extend
-                    trA.add(&trA1);                    
+                    trA.add(&trA1);
                     trA.exons[trA.nExons-1][EX_L] += trA1.extendL;//extend the length of the last exon
             };
         };
-        
+
     };
-    
+
     //debug: recalculate the number of MM
-//     { 
+//     {
 //         uint nMM1=0;
 //         for (uint iex=0;iex<trA.nExons;iex++) {
 //             for (uint ii=0;ii<trA.exons[iex][EX_L];ii++) {
@@ -174,28 +184,28 @@ void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char*
 //             cout <<nMM1<<"   "<<trA.nMM<<"    "<<readName<<"   "<<iRead<<endl;
 //         };
 //     };
-    
+
     {//calculate some final values for the transcript
         trA.rLength = 0;
         for (uint isj=0;isj<trA.nExons;isj++) {
             trA.rLength += trA.exons[isj][EX_L];
         };
         trA.gLength = trA.exons[trA.nExons-1][EX_G]+1-trA.gStart;
-        
+
         //calculate some final values for the transcript
-        trA.roStart = (trA.roStr == 0) ? trA.rStart : Lread - trA.rStart - trA.rLength;     
-        
+        trA.roStart = (trA.roStr == 0) ? trA.rStart : Lread - trA.rStart - trA.rLength;
+
         if (trA.exons[0][EX_iFrag]==trA.exons[trA.nExons-1][EX_iFrag]) {//mark single fragment transcripts
             trA.iFrag=trA.exons[0][EX_iFrag];
             maxScoreMate[trA.iFrag] = max (maxScoreMate[trA.iFrag] , trA.maxScore);
         } else {
             trA.iFrag=-1;
-        };        
+        };
 
         trA.intronMotifs[0]=0;trA.intronMotifs[1]=0;trA.intronMotifs[2]=0;
         for (uint iex=0;iex<trA.nExons-1;iex++) {
             if (trA.canonSJ[iex]==0) {
-                ++trA.intronMotifs[0]; 
+                ++trA.intronMotifs[0];
             } else if (trA.canonSJ[iex]>0) {
                 ++trA.intronMotifs[2-trA.canonSJ[iex]%2];
             };
@@ -205,8 +215,8 @@ void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char*
             trA.maxScore += int(ceil( log2( (double) ( trA.exons[trA.nExons-1][EX_G]+trA.exons[trA.nExons-1][EX_L] - trA.exons[0][EX_G]) ) \
                      * P->scoreGenomicLengthLog2scale - 0.5));
             trA.maxScore = max(0,trA.maxScore);
-        };        
-        
+        };
+
         //filter strand consistency
         trA.sjMotifStrand=0;
         uint sjN=0;
@@ -217,14 +227,14 @@ void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char*
                     trA.sjMotifStrand=trA.sjStr[iex];
                 } else if (trA.sjMotifStrand != trA.sjStr[iex]) {//inconsistent strand
                     return; //kill this transcript
-                };  
+                };
             };
-        };        
+        };
 
         if (sjN>0 && trA.sjMotifStrand==0 && P->outSAMstrandField=="intronMotif") {//strand not defined for a junction
             return;
-        };        
-        
+        };
+
         if (P->outFilterIntronMotifs=="None") {//no filtering
 
         } else if (P->outFilterIntronMotifs=="RemoveNoncanonical") {
@@ -239,27 +249,31 @@ void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char*
             ostringstream errOut;
             errOut << "EXITING because of FATAL INPUT error: unrecognized value of --outFilterIntronMotifs=" <<P->outFilterIntronMotifs <<"\n";
             errOut << "SOLUTION: re-run STAR with --outFilterIntronMotifs = None -OR- RemoveNoncanonical -OR- RemoveNoncanonicalUnannotated\n";
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);        
-        };        
-        
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
+        };
+
 //         if (P->outFilterIntronMotifs=="KeepCanonical" && (trA.intronMotifs[0]>0 || (trA.intronMotifs[1]>0 && trA.intronMotifs[2]>0) ) ) {//keep only conistent canonical introns
 //             return;
-//         };        
-        
-        
+//         };
+
+
         //check exons lenghts including repeats, do not report a transcript with short exons
 //        for (uint isj=0;isj<trA.nExons-1;isj++) {//check exons for min length, if they precede a junction
 //            if ( trA.canonSJ[isj]>=0 &&
-//               ( trA.exons[isj][EX_L] < P->alignSJoverhangMin + trA.shiftSJ[isj][0] 
-//              || trA.exons[isj+1][EX_L] < P->alignSJoverhangMin + trA.shiftSJ[isj][1]) ) {                  
+//               ( trA.exons[isj][EX_L] < P->alignSJoverhangMin + trA.shiftSJ[isj][0]
+//              || trA.exons[isj+1][EX_L] < P->alignSJoverhangMin + trA.shiftSJ[isj][1]) ) {
 //                return;//do not record this transcript in wTr
 //            };
-//        };          
+//        };
     };
-    
+
+    if (WAexcl==NULL)
     {//record the transcript TODO: allow for multiple transcripts in one window
         *(trAll[iWrec][0])=trA;
         nWinTr[iWrec]=1;
+    } else
+    {//record 2nd best alignment in this window
+        *(trAll[iWrec][1])=trA;
+        nWinTr[iWrec]=2;
     };
-    
 };
diff --git a/source/ReadAlign_storeAligns.cpp b/source/ReadAlign_storeAligns.cpp
index b090fef..ba7536e 100644
--- a/source/ReadAlign_storeAligns.cpp
+++ b/source/ReadAlign_storeAligns.cpp
@@ -12,18 +12,18 @@ void ReadAlign::storeAligns (uint iDir, uint Shift, uint Nrep, uint L, uint indS
     #ifdef OFF_BEFORE_STORE
         #warning OFF_BEFORE_STORE
         return;
-    #endif   
-        
+    #endif
+
     if ( Nrep > P->seedMultimapNmax ) {// if a piece maps too many times, do not store it
         if ( Nrep < multNmin || multNmin==0 ) {multNmin=Nrep; multNminL=L;};
-        return;     
+        return;
     };
 
     nUM[ Nrep==1 ? 0:1] += Nrep;        //add numbers of U/M aligns
     nA += Nrep;
-    
+
     uint rStart=iDir==0 ? Shift : Shift+1-L;//alignment read-start
-        
+
   #define OPTIM_STOREaligns_SIMPLE
   #ifdef OPTIM_STOREaligns_SIMPLE
     //find the place to insert the new entry to keep it sorted
@@ -41,14 +41,14 @@ void ReadAlign::storeAligns (uint iDir, uint Shift, uint Nrep, uint L, uint indS
         for (int jj=0;jj<PC_SIZE;jj++) PC[ii+1][jj]=PC[ii][jj];
     };
 
-    nP++; //now nP is the new number of elements   
-//     
+    nP++; //now nP is the new number of elements
+//
     if (nP > P->seedPerReadNmax) {
         ostringstream errOut;
         errOut <<"EXITING because of FATAL error: too many pieces pere read\n" ;
         errOut <<"SOLUTION: increase input parameter --seedPerReadNmax";
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_RUNTIME, *P);
-    };    
+    };
   #else
 //     int iP3;
 //     for (iP3=nP-1; iP3>=0; iP3--) {
@@ -58,7 +58,7 @@ void ReadAlign::storeAligns (uint iDir, uint Shift, uint Nrep, uint L, uint indS
 //             break;
 //         };
 //     };
-    
+
     int iP2=-1,iP1;
     int nRemove=0;
     for (iP1=0; iP1<nP; iP1++) {
@@ -75,7 +75,7 @@ void ReadAlign::storeAligns (uint iDir, uint Shift, uint Nrep, uint L, uint indS
                 };
             };
         };
-        
+
         if ( rStart <= PC[iP1][PC_rStart] )  {//is old seed within new seed
             if ( rStart+L >= PC[iP1][PC_rStart]+PC[iP1][PC_Length] ) {//old piece is within the new piece
                 //decide whether to keep the new piece
@@ -85,11 +85,11 @@ void ReadAlign::storeAligns (uint iDir, uint Shift, uint Nrep, uint L, uint indS
                 };
             };
         };
-        
+
         if ( iP2==-1 && ( rStart < PC[iP1][PC_rStart] || (rStart == PC[iP1][PC_rStart] && L>PC[iP1][PC_Length]) ) ) {
             iP2=iP1;
         };
-        
+
 
     };
 
@@ -97,21 +97,21 @@ void ReadAlign::storeAligns (uint iDir, uint Shift, uint Nrep, uint L, uint indS
     if (iP2==-1) {//debug
         cout << "BUG: iP2=-1 iRead="<<iRead<<flush;
         exit(-1);
-    };   
-    
+    };
+
     int iP=iP2;
 //     if (iP!=iP3+1) {
 //         cout << "BUG: iP!=iP3+1 iRead="<<iRead<<"   "<<readName<<flush;
 //         exit(-1);
 //     };
-    
+
     if (nRemove==0) {//add piece
         if (nP == P->seedPerReadNmax) {
             ostringstream errOut;
             errOut <<"EXITING because of FATAL error: too many pieces pere read\n" ;
             errOut <<"SOLUTION: increase input parameter --seedPerReadNmax";
             exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_RUNTIME, *P);
-        };        
+        };
         for (int ii=nP-1;ii>=iP;ii--) {//move old entries to free space for the new one
             for (int jj=0;jj<PC_SIZE;jj++) PC[ii+1][jj]=PC[ii][jj];
         };
@@ -129,20 +129,20 @@ void ReadAlign::storeAligns (uint iDir, uint Shift, uint Nrep, uint L, uint indS
                 };
                 ++iP3;
             };
-        };        
+        };
         nP-=nRemove-1;
     };
   #endif
-    
+
     //store new piece
-    PC[iP][PC_rStart]=rStart;  //alignment read-start     
+    PC[iP][PC_rStart]=rStart;  //alignment read-start
     PC[iP][PC_Length]=L;       //alignment length
-    PC[iP][PC_Dir]    = iDir; //direction        
-    PC[iP][PC_Nrep]   = Nrep; //repeat number - for both strands        
+    PC[iP][PC_Dir]    = iDir; //direction
+    PC[iP][PC_Nrep]   = Nrep; //repeat number - for both strands
     PC[iP][PC_SAstart]= indStartEnd[0]; //SA index 1
-    PC[iP][PC_SAend]  = indStartEnd[1]; //SA index 2       
+    PC[iP][PC_SAend]  = indStartEnd[1]; //SA index 2
     PC[iP][PC_iFrag]  = iFrag;
-   
+
     //choose "best" alignment
 
     if (L<storedLmin) L=storedLmin;
diff --git a/source/STAR.cpp b/source/STAR.cpp
index 86df04e..32edc46 100644
--- a/source/STAR.cpp
+++ b/source/STAR.cpp
@@ -34,13 +34,13 @@
 void usage() {
     printf("Usage: STAR  [options]... --genomeDir REFERENCE   --readFilesIn R1.fq R2.fq\n");
     printf("Spliced Transcripts Alignment to a Reference (c) Alexander Dobin, 2009-2015\n\n");
-    
+
     std::cout << parametersDefault;
-    
+
     printf("For more details see:\n");
     printf("<https://github.com/alexdobin/STAR>\n");
     printf("<https://github.com/alexdobin/STAR/blob/master/doc/STARmanual.pdf>\n");
-    
+
     exit(0);
 }
 
@@ -55,37 +55,37 @@ int main(int argInN, char* argIn[]) {
 
     Parameters *P = new Parameters; //all parameters
     P->inputParameters(argInN, argIn);
-    
-    *(P->inOut->logStdOut) << timeMonthDayTime(g_statsAll.timeStart) << " ..... Started STAR run\n" <<flush;           
-    
+
+    *(P->inOut->logStdOut) << timeMonthDayTime(g_statsAll.timeStart) << " ..... started STAR run\n" <<flush;
+
     //generate genome
     if (P->runMode=="genomeGenerate") {
         genomeGenerate(P);
-        (void) sysRemoveDir (P->outFileTmp);        
+        (void) sysRemoveDir (P->outFileTmp);
         P->inOut->logMain << "DONE: Genome generation, EXITING\n" << flush;
         exit(0);
     } else if (P->runMode!="alignReads") {
         P->inOut->logMain << "EXITING because of INPUT ERROR: unknown value of input parameter runMode=" <<P->runMode<<endl<<flush;
         exit(1);
     };
-    
+
     Genome mainGenome (P);
     mainGenome.genomeLoad();
-    if (P->genomeLoad=="LoadAndExit" || P->genomeLoad=="Remove") 
+    if (P->genomeLoad=="LoadAndExit" || P->genomeLoad=="Remove")
     {
         return 0;
     };
-    
-    P->twoPass.pass2=false; //this is the 1st pass    
+
+    P->twoPass.pass2=false; //this is the 1st pass
 
     if (P->genomeFastaFiles.at(0)!="-")
     {//insert sequences in the genome
-        
+
     };
-    
+
     SjdbClass sjdbLoci;
 
-    if (P->sjdbInsert.pass1) 
+    if (P->sjdbInsert.pass1)
     {
         Parameters *P1=new Parameters;
         *P1=*P;
@@ -97,8 +97,8 @@ int main(int argInN, char* argIn[]) {
 
     //calculate genome-related parameters
     Transcriptome *mainTranscriptome=NULL;
-    
-    
+
+
 /////////////////////////////////////////////////////////////////////////////////////////////////START
     if (P->runThreadN>1) {
         g_threadChunks.threadArray=new pthread_t[P->runThreadN];
@@ -111,11 +111,11 @@ int main(int argInN, char* argIn[]) {
         pthread_mutex_init(&g_threadChunks.mutexBAMsortBins, NULL);
     };
 
-    g_statsAll.progressReportHeader(P->inOut->logProgress);    
-    
+    g_statsAll.progressReportHeader(P->inOut->logProgress);
+
     if (P->twoPass.yes) {//2-pass
         //re-define P for the pass1
-        
+
         Parameters *P1=new Parameters;
         *P1=*P;
         //turn off unnecessary calculations
@@ -123,17 +123,17 @@ int main(int argInN, char* argIn[]) {
         P1->outSAMbool=false;
         P1->outBAMunsorted=false;
         P1->outBAMcoord=false;
-    
+
         P1->chimSegmentMin=0;
-        
+
         P1->quant.yes=false;
         P1->quant.trSAM.yes=false;
         P1->quant.geCount.yes=false;
-        
+
         P1->outFilterBySJoutStage=0;
-        
+
         P1->outReadsUnmapped="None";
-        
+
         P1->outFileNamePrefix=P->twoPass.dir;
 
         P1->readMapNumber=P->twoPass.pass1readsN;
@@ -142,28 +142,28 @@ int main(int argInN, char* argIn[]) {
         g_statsAll.resetN();
         time(&g_statsAll.timeStartMap);
         P->inOut->logProgress << timeMonthDayTime(g_statsAll.timeStartMap) <<"\tStarted 1st pass mapping\n" <<flush;
-        *P->inOut->logStdOut << timeMonthDayTime(g_statsAll.timeStartMap) << " ..... Started 1st pass mapping\n" <<flush;
+        *P->inOut->logStdOut << timeMonthDayTime(g_statsAll.timeStartMap) << " ..... started 1st pass mapping\n" <<flush;
 
         //run mapping for Pass1
-        ReadAlignChunk *RAchunk1[P->runThreadN];        
+        ReadAlignChunk *RAchunk1[P->runThreadN];
         for (int ii=0;ii<P1->runThreadN;ii++) {
             RAchunk1[ii]=new ReadAlignChunk(P1, mainGenome, mainTranscriptome, ii);
-        };    
+        };
         mapThreadsSpawn(P1, RAchunk1);
         outputSJ(RAchunk1,P1); //collapse and output junctions
 //         for (int ii=0;ii<P1->runThreadN;ii++) {
 //             delete [] RAchunk[ii];
-//         };          
-        
+//         };
+
         time_t rawtime; time (&rawtime);
         P->inOut->logProgress << timeMonthDayTime(rawtime) <<"\tFinished 1st pass mapping\n";
-        *P->inOut->logStdOut << timeMonthDayTime(rawtime) << " ..... Finished 1st pass mapping\n" <<flush;
+        *P->inOut->logStdOut << timeMonthDayTime(rawtime) << " ..... finished 1st pass mapping\n" <<flush;
         ofstream logFinal1 ( (P->twoPass.dir + "/Log.final.out").c_str());
         g_statsAll.reportFinal(logFinal1);
 
         P->twoPass.pass2=true;//starting the 2nd pass
         P->twoPass.pass1sjFile=P->twoPass.dir+"/SJ.out.tab";
-        
+
         sjdbInsertJunctions(P, P1, mainGenome, sjdbLoci);
 
         //reopen reads files
@@ -172,22 +172,22 @@ int main(int argInN, char* argIn[]) {
     } else {//not 2-pass
         //nothing for now
     };
-    
+
     if ( P->quant.yes ) {//load transcriptome
         mainTranscriptome=new Transcriptome(P);
-    };    
-    
+    };
+
     //initialize Stats
     g_statsAll.resetN();
     time(&g_statsAll.timeStartMap);
-    *P->inOut->logStdOut << timeMonthDayTime(g_statsAll.timeStartMap) << " ..... Started mapping\n" <<flush;
-    
+    *P->inOut->logStdOut << timeMonthDayTime(g_statsAll.timeStartMap) << " ..... started mapping\n" <<flush;
+
     g_statsAll.timeLastReport=g_statsAll.timeStartMap;
 
     //open SAM/BAM files for output
     if (P->outSAMmode != "None") {//open SAM file and write header
         ostringstream samHeaderStream;
-        
+
         for (uint ii=0;ii<P->nChrReal;ii++) {
             samHeaderStream << "@SQ\tSN:"<< P->chrName.at(ii) <<"\tLN:"<<P->chrLength[ii]<<"\n";
         };
@@ -198,10 +198,10 @@ int main(int argInN, char* argIn[]) {
                 samHeaderStream << "\t" << P->outSAMheaderPG.at(ii);
             };
             samHeaderStream << "\n";
-        };        
-        
+        };
+
         samHeaderStream << "@PG\tID:STAR\tPN:STAR\tVN:" << STAR_VERSION <<"\tCL:" << P->commandLineFull <<"\n";
-        
+
         if (P->outSAMheaderCommentFile!="-") {
             ifstream comstream (P->outSAMheaderCommentFile);
             while (comstream.good()) {
@@ -211,15 +211,15 @@ int main(int argInN, char* argIn[]) {
                     samHeaderStream << line1 <<"\n";
                 };
             };
-        };         
-        
+        };
+
 
         for (uint32 ii=0;ii<P->outSAMattrRGlineSplit.size();ii++) {//@RG lines
             samHeaderStream << "@RG\t" << P->outSAMattrRGlineSplit.at(ii) <<"\n";
         };
- 
+
         samHeaderStream <<  "@CO\t" <<"user command line: " << P->commandLine <<"\n";
-        
+
         if (P->outSAMheaderHD.at(0)!="-") {
             P->samHeaderHD = P->outSAMheaderHD.at(0);
             for (uint ii=1;ii<P->outSAMheaderHD.size(); ii++) {
@@ -227,13 +227,13 @@ int main(int argInN, char* argIn[]) {
             };
         } else {
             P->samHeaderHD = "@HD\tVN:1.4";
-        };        
-        
-        
+        };
+
+
         P->samHeader=P->samHeaderHD+"\n"+samHeaderStream.str();
         //for the sorted BAM, need to add SO:cooridnate to the header line
         P->samHeaderSortedCoord=P->samHeaderHD + (P->outSAMheaderHD.size()==0 ? "" : "\tSO:coordinate") + "\n" + samHeaderStream.str();
-        
+
         if (P->outSAMbool) {//
             *P->inOut->outSAM << P->samHeader;
         };
@@ -241,59 +241,59 @@ int main(int argInN, char* argIn[]) {
             outBAMwriteHeader(P->inOut->outBAMfileUnsorted,P->samHeader,P->chrName,P->chrLength);
         };
 //             if (P->outBAMcoord){
-//                 outBAMwriteHeader(P->inOut->outBAMfileCoord,P->samHeader,P->chrName,P->chrLength);            
+//                 outBAMwriteHeader(P->inOut->outBAMfileCoord,P->samHeader,P->chrName,P->chrLength);
 //             };
-        
+
         if ( P->quant.trSAM.yes ) {
             samHeaderStream.str("");
             vector <uint> trlength;
             for (uint32 ii=0;ii<mainTranscriptome->trID.size();ii++) {
                 uint32 iex1=mainTranscriptome->trExI[ii]+mainTranscriptome->trExN[ii]-1; //last exon of the transcript
-                trlength.push_back(mainTranscriptome->exLenCum[iex1]+mainTranscriptome->exSE[2*iex1+1]-mainTranscriptome->exSE[2*iex1]+1);          
+                trlength.push_back(mainTranscriptome->exLenCum[iex1]+mainTranscriptome->exSE[2*iex1+1]-mainTranscriptome->exSE[2*iex1]+1);
                 samHeaderStream << "@SQ\tSN:"<< mainTranscriptome->trID.at(ii) <<"\tLN:"<<trlength.back()<<"\n";
             };
             for (uint32 ii=0;ii<P->outSAMattrRGlineSplit.size();ii++) {//@RG lines
                 samHeaderStream << "@RG\t" << P->outSAMattrRGlineSplit.at(ii) <<"\n";
             };
-            outBAMwriteHeader(P->inOut->outQuantBAMfile,samHeaderStream.str(),mainTranscriptome->trID,trlength);        
+            outBAMwriteHeader(P->inOut->outQuantBAMfile,samHeaderStream.str(),mainTranscriptome->trID,trlength);
         };
-        
+
     };
-    
+
     if (P->chimSegmentMin>0) {
         P->inOut->outChimJunction.open((P->outFileNamePrefix + "Chimeric.out.junction").c_str());
         P->inOut->outChimSAM.open((P->outFileNamePrefix + "Chimeric.out.sam").c_str());
         P->inOut->outChimSAM << P->samHeader;
-        pthread_mutex_init(&g_threadChunks.mutexOutChimSAM, NULL);   
+        pthread_mutex_init(&g_threadChunks.mutexOutChimSAM, NULL);
         pthread_mutex_init(&g_threadChunks.mutexOutChimJunction, NULL);
     };
-         
+
     // P->inOut->logMain << "mlock value="<<mlockall(MCL_CURRENT|MCL_FUTURE) <<"\n"<<flush;
 
-    // prepare chunks and spawn mapping threads    
+    // prepare chunks and spawn mapping threads
     ReadAlignChunk *RAchunk[P->runThreadN];
     for (int ii=0;ii<P->runThreadN;ii++) {
         RAchunk[ii]=new ReadAlignChunk(P, mainGenome, mainTranscriptome, ii);
-    };    
-    
+    };
+
     mapThreadsSpawn(P, RAchunk);
-   
+
     if (P->outFilterBySJoutStage==1) {//completed stage 1, go to stage 2
         P->inOut->logMain << "Completed stage 1 mapping of outFilterBySJout mapping\n"<<flush;
         outputSJ(RAchunk,P);//collapse novel junctions
         P->readFilesIndex=-1;
-        
+
 
         P->outFilterBySJoutStage=2;
         if (P->outBAMcoord) {
-            for (int it=0; it<P->runThreadN; it++) {//prepare the unmapped bin 
+            for (int it=0; it<P->runThreadN; it++) {//prepare the unmapped bin
                 RAchunk[it]->chunkOutBAMcoord->coordUnmappedPrepareBySJout();
             };
         };
 
         mapThreadsSpawn(P, RAchunk);
     };
-    
+
     //close some BAM files
     if (P->inOut->outBAMfileUnsorted!=NULL) {
         bgzf_flush(P->inOut->outBAMfileUnsorted);
@@ -302,15 +302,15 @@ int main(int argInN, char* argIn[]) {
     if (P->inOut->outQuantBAMfile!=NULL) {
         bgzf_flush(P->inOut->outQuantBAMfile);
         bgzf_close(P->inOut->outQuantBAMfile);
-    };      
-    
+    };
+
     if (P->outBAMcoord && P->limitBAMsortRAM==0) {//make it equal ot the genome size
         P->limitBAMsortRAM=P->nGenome+mainGenome.SA.lengthByte+mainGenome.SAi.lengthByte;
     };
-        
+
     //no need for genome anymore, free the memory
     mainGenome.freeMemory();
-    
+
     if ( P->quant.geCount.yes )
     {//output gene quantifications
         for (int ichunk=1; ichunk<P->runThreadN; ichunk++)
@@ -319,24 +319,24 @@ int main(int argInN, char* argIn[]) {
         };
         RAchunk[0]->chunkTr->quantsOutput();
     };
-    
+
     if (P->runThreadN>1 && P->outSAMorder=="PairedKeepInputOrder") {//concatenate Aligned.* files
         RAchunk[0]->chunkFilesCat(P->inOut->outSAM, P->outFileTmp + "/Aligned.out.sam.chunk", g_threadChunks.chunkOutN);
-    };    
+    };
+
 
-    
     if (P->outBAMcoord) {//sort BAM if needed
-        *P->inOut->logStdOut << timeMonthDayTime() << " ..... Started sorting BAM\n" <<flush;
-        P->inOut->logMain << timeMonthDayTime() << " ..... Started sorting BAM\n" <<flush;
+        *P->inOut->logStdOut << timeMonthDayTime() << " ..... started sorting BAM\n" <<flush;
+        P->inOut->logMain << timeMonthDayTime() << " ..... started sorting BAM\n" <<flush;
         uint32 nBins=P->outBAMcoordNbins;
-        
+
         //check max size needed for sorting
         uint maxMem=0;
         for (uint32 ibin=0; ibin<nBins-1; ibin++) {//check akk bins
             uint binS=0;
             for (int it=0; it<P->runThreadN; it++) {//collect sizes from threads
                 binS += RAchunk[it]->chunkOutBAMcoord->binTotalBytes[ibin]+24*RAchunk[it]->chunkOutBAMcoord->binTotalN[ibin];
-            };        
+            };
             if (binS>maxMem) maxMem=binS;
         };
         P->inOut->logMain << "Max memory needed for sorting = "<<maxMem<<endl;
@@ -344,25 +344,25 @@ int main(int argInN, char* argIn[]) {
             ostringstream errOut;
             errOut <<"EXITING because of fatal ERROR: not enough memory for BAM sorting: \n";
             errOut <<"SOLUTION: re-run STAR with at least --limitBAMsortRAM " <<maxMem+1000000000;
-            exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);                                    
+            exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);
         };
-        
-        
+
+
         uint totalMem=0;
 //         P->inOut->logMain << "Started sorting BAM ..." <<endl;
-        #pragma omp parallel num_threads(P->outBAMsortingThreadNactual) 
+        #pragma omp parallel num_threads(P->outBAMsortingThreadNactual)
         #pragma omp for schedule (dynamic,1)
         for (uint32 ibin1=0; ibin1<nBins; ibin1++) {
             uint32 ibin=nBins-1-ibin1;//reverse order to start with the last bin - unmapped reads
-            
+
             uint binN=0, binS=0;
             for (int it=0; it<P->runThreadN; it++) {//collect sizes from threads
                 binN += RAchunk[it]->chunkOutBAMcoord->binTotalN[ibin];
                 binS += RAchunk[it]->chunkOutBAMcoord->binTotalBytes[ibin];
             };
-            
+
             if (binS==0) continue; //empty bin
-  
+
             if (ibin == nBins-1) {//last bin for unmapped reads
                 BAMbinSortUnmapped(ibin,P->runThreadN,P->outBAMsortTmpDir,P->inOut->outBAMfileCoord, P);
             } else {
@@ -385,8 +385,8 @@ int main(int argInN, char* argIn[]) {
         char **bamBinNames = new char* [nBins];
         vector <string> bamBinNamesV;
         for (uint32 ibin=0; ibin<nBins; ibin++) {
-            
-            bamBinNamesV.push_back(P->outBAMsortTmpDir+"/b"+to_string((uint) ibin));            
+
+            bamBinNamesV.push_back(P->outBAMsortTmpDir+"/b"+std::to_string((uint) ibin));
             struct stat buffer;
             if (stat (bamBinNamesV.back().c_str(), &buffer) != 0) {//check if file exists
                 bamBinNamesV.pop_back();
@@ -399,31 +399,37 @@ int main(int argInN, char* argIn[]) {
     };
     //wiggle output
     if (P->outWigFlags.yes) {
-        *P->inOut->logStdOut << timeMonthDayTime() << " ..... Started wiggle output\n" <<flush;
-        P->inOut->logMain << timeMonthDayTime() << " ..... Started wiggle output\n" <<flush;
+        *P->inOut->logStdOut << timeMonthDayTime() << " ..... started wiggle output\n" <<flush;
+        P->inOut->logMain << timeMonthDayTime() << " ..... started wiggle output\n" <<flush;
         string wigOutFileNamePrefix=P->outFileNamePrefix + "Signal";
         signalFromBAM(P->outBAMfileCoordName, wigOutFileNamePrefix, *P);
     };
-    
+
     //aggregate output junctions
     //collapse splice junctions from different threads/chunks, and output them
     outputSJ(RAchunk,P);
-    
+
     g_statsAll.progressReport(P->inOut->logProgress);
     P->inOut->logProgress  << "ALL DONE!\n"<<flush;
     P->inOut->logFinal.open((P->outFileNamePrefix + "Log.final.out").c_str());
     g_statsAll.reportFinal(P->inOut->logFinal);
-    *P->inOut->logStdOut << timeMonthDayTime(g_statsAll.timeFinish) << " ..... Finished successfully\n" <<flush;
-    
+    *P->inOut->logStdOut << timeMonthDayTime(g_statsAll.timeFinish) << " ..... finished successfully\n" <<flush;
+
     P->inOut->logMain  << "ALL DONE!\n"<<flush;
-    sysRemoveDir (P->outFileTmp);
-    
+    if (P->outTmpKeep=="None")
+    {
+        sysRemoveDir (P->outFileTmp);
+    } else
+    {
+        //nothing to do
+    };
+
     P->closeReadsFiles();//this will kill the readFilesCommand processes if necessary
     mainGenome.~Genome(); //need explicit call because of the 'delete P->inOut' below, which will destroy P->inOut->logStdOut
-    
+
     ///@todo create Destructor to destroy P->inOut
     delete P->inOut; //to close files
     delete P;
-    
-    return 0;    
+
+    return 0;
 };
diff --git a/source/SequenceFuns.cpp b/source/SequenceFuns.cpp
index 7e7d8a5..1adcfac 100644
--- a/source/SequenceFuns.cpp
+++ b/source/SequenceFuns.cpp
@@ -4,8 +4,8 @@ void complementSeqNumbers(char* ReadsIn, char* ReadsOut, uint Lread) {//compleme
     for (uint jj=0;jj<Lread;jj++) {
         switch (int(ReadsIn[jj])){
             case (3): ReadsOut[jj]=char(0);break;
-            case (2): ReadsOut[jj]=char(1);break;              
-            case (1): ReadsOut[jj]=char(2);break;                          
+            case (2): ReadsOut[jj]=char(1);break;
+            case (1): ReadsOut[jj]=char(2);break;
             case (0): ReadsOut[jj]=char(3);break;
             default:  ReadsOut[jj]=ReadsIn[jj];
         };
@@ -30,7 +30,7 @@ void revComplementNucleotides(char* ReadsIn, char* ReadsOut, uint Lread) {//comp
             case ('D'): ReadsOut[jj]='H';break;
             case ('V'): ReadsOut[jj]='B';break;
             case ('H'): ReadsOut[jj]='D';break;
-            
+
             case ('a'): ReadsOut[jj]='t';break;
             case ('c'): ReadsOut[jj]='g';break;
             case ('g'): ReadsOut[jj]='c';break;
@@ -45,8 +45,8 @@ void revComplementNucleotides(char* ReadsIn, char* ReadsOut, uint Lread) {//comp
             case ('b'): ReadsOut[jj]='v';break;
             case ('d'): ReadsOut[jj]='h';break;
             case ('v'): ReadsOut[jj]='b';break;
-            case ('h'): ReadsOut[jj]='d';break;            
-            
+            case ('h'): ReadsOut[jj]='d';break;
+
             default:   ReadsOut[jj]=ReadsIn[Lread-1-jj];
         };
     };
@@ -84,13 +84,13 @@ void nuclPackBAM(char* ReadsIn, char* ReadsOut, uint Lread) {//pack nucleotides
     };
 };
 
-void convertNucleotidesToNumbers(const char* R0, char* R1, uint Lread) {//transform sequence  from ACGT into 0-1-2-3 code    
+void convertNucleotidesToNumbers(const char* R0, char* R1, uint Lread) {//transform sequence  from ACGT into 0-1-2-3 code
     for (uint jj=0;jj<Lread;jj++) {
                     switch (int(R0[jj])){
                         case (65): case(97):  R1[jj]=char(0);break;//A
-                        case (67): case(99):  R1[jj]=char(1);break;//C           
-                        case (71): case(103): R1[jj]=char(2);break;//G                       
-                        case (84): case(116): R1[jj]=char(3);break;//T                                
+                        case (67): case(99):  R1[jj]=char(1);break;//C
+                        case (71): case(103): R1[jj]=char(2);break;//G
+                        case (84): case(116): R1[jj]=char(3);break;//T
 //                         case (78): R1[jj]=char(9);break;//N
                         default:   R1[jj]=char(9);//anything else
                     };
@@ -113,7 +113,7 @@ uint chrFind(uint Start, uint i2, uint* chrStart) {// find chromosome from globa
 uint localSearch(const char *x, uint nx, const char *y, uint ny, double pMM){
     //find the best alignment of two short sequences x and y
     //pMM is the maximum percentage of mismatches
-    uint nMatch=0, nMM=0, nMatchBest=0, nMMbest=0, ixBest=nx;            
+    uint nMatch=0, nMM=0, nMatchBest=0, nMMbest=0, ixBest=nx;
     for (uint ix=0;ix<nx;ix++) {
         nMatch=0; nMM=0;
         for (uint iy=0;iy<min(ny,nx-ix);iy++) {
@@ -124,7 +124,7 @@ uint localSearch(const char *x, uint nx, const char *y, uint ny, double pMM){
                 nMM++;
             };
         };
-        
+
         if ( ( nMatch>nMatchBest || (nMatch==nMatchBest && nMM<nMMbest) ) && double(nMM)/double(nMatch)<=pMM) {
             ixBest=ix;
             nMatchBest=nMatch;
@@ -144,27 +144,27 @@ uint qualitySplit(char* r, char* q, uint L, char Qsplit, uint maxNsplit, uint  m
             if (r[iR]==MARK_FRAG_SPACER_BASE) iFrag++; //count read fragments
             iR++;
         };
-        
+
         if (iR==L) break; //exit when reached end of read
-        
+
         iR1=iR;
-        
+
         //find the next bad base
         while ( iR<L && q[iR]>=Qsplit && r[iR]<=3 ) {
             iR++;
-        };        
-               
+        };
+
         if ( (iR-iR1)>LgoodMin ) LgoodMin=iR-iR1;
         if ( (iR-iR1)<minLsplit ) continue; //too short for a good region
-        
+
         splitR[0][iS]=iR1;      //good region start
         splitR[1][iS]=iR-iR1;   //good region length
         splitR[2][iS]=iFrag;    //good region fragment
         iS++;
     };
-    
+
     if (iS==0) splitR[1][0]=LgoodMin; //output min good piece length
-    
+
     return iS;
 };
 
diff --git a/source/SequenceFuns.h b/source/SequenceFuns.h
index 196e00a..96f5c18 100644
--- a/source/SequenceFuns.h
+++ b/source/SequenceFuns.h
@@ -2,7 +2,7 @@
  *
  *
  * A longer description.
- *  
+ *
  * @see something
  */
 
diff --git a/source/SharedMemory.cpp b/source/SharedMemory.cpp
index d5354ca..ff5c67c 100644
--- a/source/SharedMemory.cpp
+++ b/source/SharedMemory.cpp
@@ -45,7 +45,7 @@ SharedMemory::~SharedMemory()
             if (inUse > 0)
             {
                 (*_err) << inUse << " other job(s) are attached to the shared memory segment, will not remove it." <<endl;
-            } 
+            }
             else
             {
                 (*_err) << "No other jobs are attached to the shared memory segment, removing it."<<endl;
@@ -70,7 +70,7 @@ void SharedMemory::Allocate(size_t shmSize)
 
     if (!_needsAllocation)
         ThrowError(EALREADYALLOCATED);
-    
+
     CreateAndInitSharedObject(shmSize);
 
     if (_exception.HasError() && _exception.GetErrorCode() != EEXISTS)
@@ -79,7 +79,7 @@ void SharedMemory::Allocate(size_t shmSize)
     _exception.ClearError(); // someone else came in first so retry open
 
     OpenIfExists();
-    
+
     _isAllocator = true;
 }
 
@@ -99,7 +99,7 @@ string SharedMemory::CounterName()
 
 
 void SharedMemory::CreateAndInitSharedObject(size_t shmSize)
-{    
+{
     unsigned long long toReserve = (unsigned long long) shmSize + sizeof(unsigned long long);
 
 #ifdef POSIX_SHARED_MEM
@@ -147,7 +147,7 @@ void SharedMemory::OpenIfExists()
     if (exists)
     {
         MapSharedObjectToMemory();
-        
+
         _needsAllocation = false;
     }
 }
@@ -168,21 +168,21 @@ void SharedMemory::MapSharedObjectToMemory()
 {
 #ifdef POSIX_SHARED_MEM
     size_t size=0;
-    struct stat buf = SharedMemory::GetSharedObjectInfo(); 
+    struct stat buf = SharedMemory::GetSharedObjectInfo();
     size = (size_t) buf.st_size;
     _mapped = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_NORESERVE, _shmID, (off_t) 0);
 
-    if (_mapped==((void *) -1)) 
+    if (_mapped==((void *) -1))
         ThrowError(EMAPFAILED, errno);
-    
+
     _length = (size_t *) _mapped;
     *_length = size;
 #else
     _mapped= shmat(_shmID, NULL, 0);
 
-    if (_mapped==((void *) -1)) 
+    if (_mapped==((void *) -1))
         ThrowError(EMAPFAILED, errno);
-    
+
     _length = (size_t *) _mapped;
 #endif
 }
@@ -250,7 +250,7 @@ void SharedMemory::EnsureCounter()
     if (!exists)
     {
         errno=0;
-        _sharedCounterID=shmget(_counterKey, 1, IPC_CREAT | IPC_EXCL | SHM_NORESERVE | 0666); 
+        _sharedCounterID=shmget(_counterKey, 1, IPC_CREAT | IPC_EXCL | SHM_NORESERVE | 0666);
 
         if (_sharedCounterID < 0)
             ThrowError(ECOUNTERCREATE, errno);
@@ -260,7 +260,7 @@ void SharedMemory::EnsureCounter()
     {
         _counterMem = shmat(_sharedCounterID, NULL, 0);
 
-        if (_counterMem==((void *) -1)) 
+        if (_counterMem==((void *) -1))
             ThrowError(EMAPFAILED, errno);
     }
 }
diff --git a/source/SharedMemory.h b/source/SharedMemory.h
index dd82170..629a1bd 100644
--- a/source/SharedMemory.h
+++ b/source/SharedMemory.h
@@ -13,7 +13,7 @@
 #include <iostream>
 
 
-enum ErrorState { 
+enum ErrorState {
 ENONE,
 ENOTALLOCATED,
 ETRYAGAIN,
@@ -94,7 +94,7 @@ public:
         {
             if (!_needsAllocation)
                 return *_length - sizeof(size_t);
-            
+
             _exception.SetError(ENOTALLOCATED, 0);
             return -1;
         };
@@ -161,7 +161,7 @@ private:
         key_t _counterKey;
         bool _unloadLast;
         std::ostream * _err;
-        
+
         int SharedObjectsUseCount();
         void OpenIfExists();
         void CreateAndInitSharedObject(size_t shmSize);
diff --git a/source/SjdbClass.h b/source/SjdbClass.h
index bb2a687..08af8da 100644
--- a/source/SjdbClass.h
+++ b/source/SjdbClass.h
@@ -7,7 +7,7 @@
 class SjdbClass {
 public:
     vector <string> chr;
-    vector <uint> start,end;    
+    vector <uint> start,end;
     vector <char> str;
     vector <uint8_t> priority;
 };
diff --git a/source/Stats.cpp b/source/Stats.cpp
index bbbd51d..8b87ceb 100644
--- a/source/Stats.cpp
+++ b/source/Stats.cpp
@@ -21,12 +21,12 @@ Stats::Stats() {//constructor
 
 void Stats::addStats(Stats &S) {//add S to Stats
     readN += S.readN; readBases += S.readBases;
-    mappedMismatchesN += S.mappedMismatchesN; mappedInsN += S.mappedInsN; mappedDelN += S.mappedDelN; 
+    mappedMismatchesN += S.mappedMismatchesN; mappedInsN += S.mappedInsN; mappedDelN += S.mappedDelN;
     mappedInsL += S.mappedInsL; mappedDelL += S.mappedDelL; mappedBases += S.mappedBases;  mappedPortion += S.mappedPortion;
     mappedReadsU += S.mappedReadsU; mappedReadsM += S.mappedReadsM;
     unmappedOther += S.unmappedOther; unmappedShort += S.unmappedShort; unmappedMismatch += S.unmappedMismatch; unmappedMulti += S.unmappedMulti; unmappedAll += S.unmappedAll;
     chimericAll += S.chimericAll;
-            
+
     splicesNsjdb += S.splicesNsjdb;
     for (uint ii=0; ii<SJ_MOTIF_SIZE; ii++) {
         splicesN[ii] +=S.splicesN[ii];
@@ -39,7 +39,7 @@ void Stats::transcriptStats(Transcript &T, uint Lread) {
     mappedDelN += T.nDel;
     mappedInsL += T.lIns;
     mappedDelL += T.lDel;
-    
+
     uint mappedL=0;
     for (uint ii=0; ii<T.nExons; ii++) {
         mappedL += T.exons[ii][EX_L];
@@ -48,7 +48,7 @@ void Stats::transcriptStats(Transcript &T, uint Lread) {
         if (T.canonSJ[ii]>=0) splicesN[T.canonSJ[ii]]++;
         if (T.sjAnnot[ii]==1) splicesNsjdb++;
     };
-                
+
     mappedBases += mappedL;
     mappedPortion += double(mappedL)/double(Lread);
 };
@@ -65,14 +65,14 @@ void Stats::progressReportHeader(ofstream &progressStream) {
     progressStream  <<setw(15)<< " " <<SETW1<< "M/hr" <<SETW3<< "number" <<SETW1<< "length" <<SETW1<< "unique" \
             <<SETW1<< "length" <<SETW1<< "MMrate" \
             <<SETW1<< "multi" <<SETW1<< "multi+" <<SETW1<< "MM" <<SETW1<< "short" <<SETW1<< "other"\
-            << "\n"<<flush;    
+            << "\n"<<flush;
 };
 
 void Stats::progressReport(ofstream &progressStream) {
-    
+
     time_t timeCurrent;
     time( &timeCurrent);
-    
+
     if (difftime(timeCurrent,timeLastReport)>=60.0 && readN>0) {//make the report
         //progressStream.imbue(std::locale(""));
         progressStream <<setw(15)<< timeMonthDayTime(timeCurrent) \
@@ -81,7 +81,7 @@ void Stats::progressReport(ofstream &progressStream) {
                 <<SETW3<< readN \
                 <<SETW1<< (readN>0 ? readBases/readN : 0) \
                 <<SETW2<< (readN>0 ? double(mappedReadsU)/double(readN)*100 : 0)  <<'%' \
-                <<SETW1<< (readN>0 ? double(mappedBases)/double(mappedReadsU) : 0)  
+                <<SETW1<< (readN>0 ? double(mappedBases)/double(mappedReadsU) : 0)
                 <<SETW2<< (readN>0 ? double(mappedMismatchesN)/double(mappedBases)*100 : 0) <<'%' \
                 <<SETW2<< (readN>0 ? double(mappedReadsM)/double(readN)*100 : 0) <<'%'\
                 <<SETW2<< (readN>0 ? double(unmappedMulti)/double(readN)*100 : 0) <<'%'\
@@ -90,14 +90,14 @@ void Stats::progressReport(ofstream &progressStream) {
                 <<SETW2<< (readN>0 ? double(unmappedOther)/double(readN)*100 : 0) <<'%'\
                 <<"\n"<<flush;
         timeLastReport=timeCurrent;
-        
+
     };
 };
 
-void Stats::reportFinal(ofstream &streamOut) {    
+void Stats::reportFinal(ofstream &streamOut) {
     int w1=50;
-    time( &timeFinish);    
-    
+    time( &timeFinish);
+
                                             //<<setiosflags(ios::left)
     streamOut  <<setiosflags(ios::fixed)  << setprecision(2) \
                <<setw(w1)<< "Started job on |\t" << timeMonthDayTime(timeStart)<<"\n" \
@@ -118,7 +118,7 @@ void Stats::reportFinal(ofstream &streamOut) {
                <<setw(w1)<< "Number of splices: GC/AG |\t"                     << splicesN[3]+splicesN[4] << "\n" \
                <<setw(w1)<< "Number of splices: AT/AC |\t"                     << splicesN[5]+splicesN[6] << "\n" \
                <<setw(w1)<< "Number of splices: Non-canonical |\t"             << splicesN[0] << "\n";
-    
+
     streamOut  <<setw(w1)<< "Mismatch rate per base, % |\t"                << double(mappedMismatchesN)/double(mappedBases)*100 <<'%' <<"\n" \
                <<setw(w1)<< "Deletion rate per base |\t"                       << (mappedBases>0 ? double(mappedDelL)/double(mappedBases)*100 : 0) <<'%' <<"\n" \
                <<setw(w1)<< "Deletion average length |\t"                      << (mappedDelN>0 ? double(mappedDelL)/double(mappedDelN) : 0) <<"\n" \
diff --git a/source/Stats.h b/source/Stats.h
index 0efe5f3..9c5f0f7 100644
--- a/source/Stats.h
+++ b/source/Stats.h
@@ -11,20 +11,20 @@ class Stats {
         uint readN;//number of reads from the file
         uint readBases;//number of input bases
 //         uint mateLmax[2], mateLmin[2];//mates' max and min length
-        
+
         uint mappedReadsU, mappedReadsM;
         uint mappedBases, mappedMismatchesN, mappedInsN, mappedDelN, mappedInsL, mappedDelL;
         double mappedPortion; //portion of the read length that has been mapped
-        
+
         uint splicesN[SJ_MOTIF_SIZE];//non-can,3*can,annotated
         uint splicesNsjdb;
-        
+
         uint unmappedOther, unmappedShort, unmappedMismatch, unmappedMulti, unmappedAll;
-        
+
         uint chimericAll;
 
-        time_t timeStart, timeStartMap, timeLastReport, timeFinish;     
-        
+        time_t timeStart, timeStartMap, timeLastReport, timeFinish;
+
         Stats ();
         void resetN();
         void printShort(ostream*);
diff --git a/source/SuffixArrayFuns.cpp b/source/SuffixArrayFuns.cpp
index c1ef95b..3d00efe 100644
--- a/source/SuffixArrayFuns.cpp
+++ b/source/SuffixArrayFuns.cpp
@@ -2,7 +2,7 @@
 #include "PackedArray.h"
 
 inline uint medianUint2(uint a, uint b) {
-    // returns (a+b)/2 
+    // returns (a+b)/2
     return a/2 + b/2 + (a%2 + b%2)/2;
 };
 
@@ -11,46 +11,46 @@ uint compareSeqToGenome(char** s2, uint S, uint N, uint L, char* g, PackedArray&
     // s2[0] read sequence; s2[1] complementary sequence
     // S position to start search from in s2[0],s2[1]
     //dirR forward or reverse direction search on read sequence
-    
+
     register int64 ii;
-    
+
     uint SAstr=SA[iSA];
     bool dirG = (SAstr>>P->GstrandBit) == 0; //forward or reverse strand of the genome
     SAstr &= P->GstrandMask;
-    
-    
+
+
     if (dirR && dirG) {//forward on read, forward on genome
         char* s  = s2[0] + S + L;
         g += SAstr + L;
         for (ii=0;(uint) ii < N-L; ii++)
         {
-            if (s[ii]!=g[ii]) 
+            if (s[ii]!=g[ii])
             {
-                if (s[ii]>g[ii]) 
+                if (s[ii]>g[ii])
                 {
                     compRes=true;
                     return ii+L;
-                } else 
+                } else
                 {
                     compRes=false;
                     return ii+L;
                 };
             };
         };
-//         if (s[ii]>g[ii]) {compRes=true;} else {compRes=false;};        
+//         if (s[ii]>g[ii]) {compRes=true;} else {compRes=false;};
         return N; //exact match
     } else if (dirR && !dirG) {
         char* s  = s2[1] + S + L;
         g += P->nGenome-1-SAstr - L;
         for (ii=0; (uint) ii < N-L; ii++)
         {
-            if (s[ii]!=g[-ii]) 
+            if (s[ii]!=g[-ii])
             {
-                if (s[ii]>g[-ii] || g[-ii]>3) 
+                if (s[ii]>g[-ii] || g[-ii]>3)
                 {
                     compRes=false;
-                    return ii+L;                    
-                } else 
+                    return ii+L;
+                } else
                 {
                     compRes=true;
                     return ii+L;
@@ -79,15 +79,15 @@ uint compareSeqToGenome(char** s2, uint S, uint N, uint L, char* g, PackedArray&
         return N;
     } else {//if (!dirR && !dirG)
         char* s  = s2[0] + S - L;
-        g += P->nGenome-1-SAstr - L;  
+        g += P->nGenome-1-SAstr - L;
         for (ii=0; (uint) ii < N-L; ii++)
         {
-            if (s[-ii]!=g[-ii]) 
+            if (s[-ii]!=g[-ii])
             {
                 if (s[-ii]>g[-ii] || g[-ii]>3)
                 {
                     compRes=false;
-                    return ii+L;                    
+                    return ii+L;
                 } else
                 {
                     compRes=true;
@@ -96,18 +96,18 @@ uint compareSeqToGenome(char** s2, uint S, uint N, uint L, char* g, PackedArray&
             };
         };
         return N;
-    };    
+    };
 };
 
 uint findMultRange(uint i3, uint L3, uint i1, uint L1, uint i1a, uint L1a, uint i1b, uint L1b, char** s, char* g, PackedArray& SA, bool dirR, uint S, Parameters* P) {
     // given SA index i3 and identity length L3, return the index of the farthest element with the same length, starting from i1,L1 or i1a,L1a, or i1b,L1b
-    
-    bool compRes;    
-    
+
+    bool compRes;
+
     if (L1<L3) { //search between i1 and i3
         L1b=L1; i1b=i1; i1a=i3;
     }
-    else { 
+    else {
         if (L1a<L1) {//search between i1a and i1b, else: search bewtween i1a and i1b
             L1b=L1a; i1b=i1a; i1a=i1;
         };
@@ -115,43 +115,43 @@ uint findMultRange(uint i3, uint L3, uint i1, uint L1, uint i1a, uint L1a, uint
     while ( (i1b+1<i1a)|(i1b>i1a+1) ) { //L1a is the target length, i1a...i1b is the initial range, i1c,L1c is the value in the middle
         uint i1c=medianUint2(i1a,i1b);
         //uint L1c=identityLength(&g[SA[i3]+L1b],&g[SA[i1c]+L1b],L3-L1b)+L1b;
-        uint L1c=compareSeqToGenome(s,S,L3,L1b,g,SA,i1c,dirR,compRes, P);                    
+        uint L1c=compareSeqToGenome(s,S,L3,L1b,g,SA,i1c,dirR,compRes, P);
         if (L1c==L3) {
             i1a=i1c;
         }
         else { //L1c<L3, move i1c
             i1b=i1c;L1b=L1c;
         };
-    };      
+    };
     return i1a;
 };
 
 uint maxMappableLength(char** s, uint S, uint N, char* g, PackedArray& SA, uint i1, uint i2, bool dirR, uint& L, uint* indStartEnd, Parameters* P) {
-    // find minimum mappable length of sequence s to the genome g with suffix array SA; length(s)=N; [i1 i2] is 
+    // find minimum mappable length of sequence s to the genome g with suffix array SA; length(s)=N; [i1 i2] is
     // returns number of mappings (1=unique);range indStartEnd; min mapped length = L
     // binary search in SA space
-    
+
     bool compRes;
-    
+
     uint L1,L2,i3,L3,L1a,L1b,L2a,L2b,i1a,i1b,i2a,i2b;
-        
+
     L1=compareSeqToGenome(s,S,N,L,g,SA,i1,dirR,compRes, P);
-    L2=compareSeqToGenome(s,S,N,L,g,SA,i2,dirR,compRes, P);    
+    L2=compareSeqToGenome(s,S,N,L,g,SA,i2,dirR,compRes, P);
 
 //     L1=identityLength(&s[L],&g[SA[i1]]);
 //     L2=identityLength(&s[L],&g[SA[i2]]);
     L= min(L1,L2);
-    
+
     L1a=L1;L1b=L1;i1a=i1;i1b=i1;
     L2a=L2;L2b=L2;i2a=i2;i2b=i2;
-    
+
     i3=i1;L3=L1; //in case i1+1>=i2 an not iteration of the loope below is ever made
     while (i1+1<i2) {//main binary search loop
         i3=medianUint2(i1,i2);
         L3=compareSeqToGenome(s,S,N,L,g,SA,i3,dirR,compRes, P);
 
-        if (L3==N) break; //found exact match, exit the binary search        
-        
+        if (L3==N) break; //found exact match, exit the binary search
+
         if (compRes) { //move 1 to 3
             if (L3>L1) {
                L1b=L1a; L1a=L1; i1b=i1a; i1a=i1;
@@ -161,13 +161,13 @@ uint maxMappableLength(char** s, uint S, uint N, char* g, PackedArray& SA, uint
         else {
             if (L3>L2) { //move 2 to 3
                L2b=L2a; L2a=L2; i2b=i2a; i2a=i2;
-            };            
+            };
             i2=i3;L2=L3;
-        };    
+        };
         L= min(L1,L2);
 
     };
-    
+
     if (L3<N) {//choose longest alignment length between L1 and L2
         if (L1>L2) {
             i3=i1;L3=L1;
@@ -175,14 +175,14 @@ uint maxMappableLength(char** s, uint S, uint N, char* g, PackedArray& SA, uint
             i3=i2;L3=L2;
         };
     };
-    // now i3,L3 is the "best" alignment, i.e. longest length  
-    
+    // now i3,L3 is the "best" alignment, i.e. longest length
+
     // find the range of SA indices in which the identiyLength is the same
     i1=findMultRange(i3,L3,i1,L1,i1a,L1a,i1b,L1b,s,g,SA,dirR,S, P);
     i2=findMultRange(i3,L3,i2,L2,i2a,L2a,i2b,L2b,s,g,SA,dirR,S, P);
 
     L=L3; //output
-    indStartEnd[0]=i1; 
+    indStartEnd[0]=i1;
     indStartEnd[1]=i2;
 
     return i2-i1+1;
@@ -197,21 +197,21 @@ uint suffixArraySearch(char** s2, uint S, uint N, char* G, PackedArray& SA, uint
     // g - genome sequence
     // SA - suffix array
     ///@todo dirR - direction, true=froward, false=reverse!!!!!!!NOT WORKING
-    // i1,i2 = starting indices in SA    
+    // i1,i2 = starting indices in SA
     // L - starting length
     // output: SA index < searched string, i.e. g[SA[index]]<s<g[SA[index+1]]
-    
+
     bool compRes;
-    
+
 //    uint L1=compareSeqToGenome(s,S,N,L,g,SA,i1,dirR,compRes, P);
-//    uint L2=compareSeqToGenome(s,S,N,L,g,SA,i2,dirR,compRes, P);    
+//    uint L2=compareSeqToGenome(s,S,N,L,g,SA,i2,dirR,compRes, P);
     uint L1=0,L2=0;
 
 //     L1=identityLength(&s[L],&g[SA[i1]]);
 //     L2=identityLength(&s[L],&g[SA[i2]]);
     L=min(L1,L2);
-    
-    
+
+
     uint i3=i1,L3=L1; //in case i1+1>=i2 an not iteration of the loope below is ever made
     while (i1+1<i2) {//main binary search loop
         i3=medianUint2(i1,i2);
@@ -224,31 +224,31 @@ uint suffixArraySearch(char** s2, uint S, uint N, char* G, PackedArray& SA, uint
         SAstr &= P->GstrandMask;
 
 
-        if (dirG) 
+        if (dirG)
         {//forward on read, forward on genome
             char* s = s2[0] + S + L;
             char* g = G + SAstr + L;
             for (ii=0;(uint) ii < N-L; ii++)
             {
-                if (s[ii]!=g[ii]) 
+                if (s[ii]!=g[ii])
                 {
                     if (s[ii]>g[ii]) {compRes=true;} else {compRes=false;};
                     break;
                 };
             };
             L3=ii+L;
-        } else 
+        } else
         {
             char* s = s2[1] + S + L;
             char* g = G + P->nGenome-1-SAstr - L;
-            for (ii=0; (uint) ii < N-L; ii++) 
+            for (ii=0; (uint) ii < N-L; ii++)
             {
-                if (s[ii]!=g[-ii]) 
+                if (s[ii]!=g[-ii])
                 {
                     char s1=s[ii],g1=g[-ii];
                     if (s1<4) s1=3-s1;
                     if (g1<4) g1=3-g1;
-                    if (s1>g1) {compRes=true;} else {compRes=false;};                    
+                    if (s1>g1) {compRes=true;} else {compRes=false;};
                     break;
                 };
             };
@@ -259,15 +259,15 @@ uint suffixArraySearch(char** s2, uint S, uint N, char* G, PackedArray& SA, uint
             L=N;
             return i3;
 //             cerr << "Bug L3==N"<<endl;
-//             exit(-1); //found exact match of the whole read length, exit the binary search        
+//             exit(-1); //found exact match of the whole read length, exit the binary search
         };
-        
+
         if (compRes) { //move 1 to 3
             i1=i3;L1=L3;
         }
         else {
             i2=i3;L2=L3;
-        };    
+        };
         L= min(L1,L2);
     };
     return i1;
@@ -292,32 +292,32 @@ uint compareSeqToGenome1(char** s2, uint S, uint N, uint L, char* g, PackedArray
     // s2[0] read sequence; s2[1] complementary sequence
     // S position to start search from in s2[0],s2[1]
     // dirR: strand of the s
-    
+
     //different treatment of 5 (spacer) in the sequence and genome
     // 5 is allowed in the sequence
     // 5 in the genome is < than 5 in the sequence
-    
+
     //TODO no need for complementary sequence
-    
+
     register int64 ii;
-    
+
     uint SAstr=SA[iSA];
     bool dirG = (SAstr>>P->GstrandBit) == 0; //forward or reverse strand of the genome
     SAstr &= P->GstrandMask;
-    
-    
+
+
     if (dirG) {//forward on read, forward on genome
         char* s  = s2[0] + S + L;
         g += SAstr + L;
         for (ii=0;(uint) ii < N-L; ii++)
         {
-            if (s[ii]!=g[ii]) 
+            if (s[ii]!=g[ii])
             {
-                if (s[ii]>g[ii]) 
+                if (s[ii]>g[ii])
                 {
                     compRes=1;
                     return ii+L;
-                } else 
+                } else
                 {
                     compRes=-1;
                     return ii+L;
@@ -328,7 +328,7 @@ uint compareSeqToGenome1(char** s2, uint S, uint N, uint L, char* g, PackedArray
                 return ii+L;
             };
         };
-//         if (s[ii]>g[ii]) {compRes=true;} else {compRes=false;};        
+//         if (s[ii]>g[ii]) {compRes=true;} else {compRes=false;};
         return N; //exact match
     }
     else
@@ -337,7 +337,7 @@ uint compareSeqToGenome1(char** s2, uint S, uint N, uint L, char* g, PackedArray
         g += P->nGenome-1-SAstr - L;
         for (ii=0; (uint) ii < N-L; ii++)
         {
-            if (s[ii]!=g[-ii]) 
+            if (s[ii]!=g[-ii])
             {
                 char s1=s[ii],g1=g[-ii];
                 if (s1<4) s1=3-s1;
@@ -345,11 +345,11 @@ uint compareSeqToGenome1(char** s2, uint S, uint N, uint L, char* g, PackedArray
                 if (s1>g1) {
                     compRes=1;
                     return ii+L;
-                } else 
+                } else
                 {
                     compRes=-1;
                     return ii+L;
-                };                    
+                };
                 break;
             } else if (s[ii]==GENOME_spacingChar)
             {//this already implies the s[ii]==g[ii]
@@ -358,11 +358,11 @@ uint compareSeqToGenome1(char** s2, uint S, uint N, uint L, char* g, PackedArray
             };
         };
         return N;
-    };    
+    };
 };
 
 
-uint suffixArraySearch1(char** s, uint S, uint N, char* g, uint64 gInsert, PackedArray& SA, bool strR, uint i1, uint i2, uint L, Parameters* P) 
+uint suffixArraySearch1(char** s, uint S, uint N, char* g, uint64 gInsert, PackedArray& SA, bool strR, uint i1, uint i2, uint L, Parameters* P)
 {
     // binary search in SA space
     // s[0],s[1] - query sequence, complementary sequence
@@ -372,12 +372,12 @@ uint suffixArraySearch1(char** s, uint S, uint N, char* g, uint64 gInsert, Packe
     // gInsert - index where the sequence insertion happened
     // SA - suffix array
     // strR - strand of the query sequence
-    // i1,i2 = starting indices in SA    
+    // i1,i2 = starting indices in SA
     // L - starting length
     // output: first SA index > searched string, i.e. g[SA[index-1]]<s<g[SA[index]]
-    
+
     int compRes;
-    
+
     uint L1=compareSeqToGenome1(s,S,N,L,g,SA,i1,strR,gInsert,compRes, P);
     if (compRes<0)
     {// the sequence is smaller than the first index of the SA, cannot proceed
@@ -385,15 +385,15 @@ uint suffixArraySearch1(char** s, uint S, uint N, char* g, uint64 gInsert, Packe
         return 0;
     };
 
-    uint L2=compareSeqToGenome1(s,S,N,L,g,SA,i2,strR,gInsert,compRes, P);    
+    uint L2=compareSeqToGenome1(s,S,N,L,g,SA,i2,strR,gInsert,compRes, P);
     if (compRes>0)
     {//the sequence is bigger than the last SA index, return a huge number
         L=L2;
         return -2llu;
     };
-    
+
     L=min(L1,L2);
-    
+
     uint i3=i1,L3=L1; //in case i1+1>=i2 an not iteration of the loope below is ever made
     while (i1+1<i2) {//main binary search loop
         i3=medianUint2(i1,i2);
@@ -402,16 +402,16 @@ uint suffixArraySearch1(char** s, uint S, uint N, char* g, uint64 gInsert, Packe
             L=N;
             return i3;
 //             cerr << "Bug L3==N"<<endl;
-//             exit(-1); //found exact match of the whole read length, exit the binary search        
+//             exit(-1); //found exact match of the whole read length, exit the binary search
         };
-        
-        if (compRes>0) 
+
+        if (compRes>0)
         { //move 1 to 3
             i1=i3;L1=L3;
         } else if (compRes<0)
         {//move 2 to 3
             i2=i3;L2=L3;
-        }  
+        }
         L= min(L1,L2);
     };
     return i2; //index at i2 is always bigger than the sequence
@@ -424,7 +424,7 @@ uint funCalcSAiFromSA(char* G, PackedArray& SA, uint iSA, int L, Parameters* P,
     SAstr &= P->GstrandMask;
     iL4=-1;
     register uint saind=0;
-    if (dirG) 
+    if (dirG)
     {
         register uint128 g1=*( (uint128*) (G+SAstr) );
         for (int ii=0; ii<L; ii++)
@@ -458,9 +458,9 @@ uint funCalcSAiFromSA(char* G, PackedArray& SA, uint iSA, int L, Parameters* P,
         };
         return saind;
     };
-    
+
 };
-         
+
 
 
 
diff --git a/source/SuffixArrayFuns.h b/source/SuffixArrayFuns.h
index 273fe30..a03b09b 100644
--- a/source/SuffixArrayFuns.h
+++ b/source/SuffixArrayFuns.h
@@ -6,7 +6,7 @@
 #include "PackedArray.h"
 
 uint medianUint2(uint, uint);
-uint compareSeqToGenome(char** s2, uint S, uint N, uint L, char* g, PackedArray& SA, uint iSA, bool dirR, bool& comparRes, Parameters* P); 
+uint compareSeqToGenome(char** s2, uint S, uint N, uint L, char* g, PackedArray& SA, uint iSA, bool dirR, bool& comparRes, Parameters* P);
 uint findMultRange(uint i3, uint L3, uint i1, uint L1, uint i1a, uint L1a, uint i1b, uint L1b, char** s, char* g, PackedArray& SA, bool dirR, uint S, Parameters* P);
 uint maxMappableLength(char** s, uint S, uint N, char* g, PackedArray& SA, uint i1, uint i2, bool dirR, uint& L, uint* indStartEnd, Parameters* P);
 void writePacked( char* a, uint jj, uint x);
diff --git a/source/ThreadControl.h b/source/ThreadControl.h
index f06c439..6d719de 100644
--- a/source/ThreadControl.h
+++ b/source/ThreadControl.h
@@ -9,15 +9,15 @@
 class ThreadControl {
 public:
     bool threadBool;
-    
+
     pthread_t *threadArray;
     pthread_mutex_t mutexInRead, mutexOutSAM, mutexOutBAM1, mutexOutChimSAM, mutexOutChimJunction, mutexOutUnmappedFastx, mutexOutFilterBySJout;
     pthread_mutex_t mutexStats, mutexLogMain, mutexBAMsortBins;
-    
+
     uint chunkInN,chunkOutN;
-    
+
     ThreadControl();
-    
+
     static void* threadRAprocessChunks(void *RAchunk) {
         ( (ReadAlignChunk*) RAchunk )->processChunks();
         pthread_exit(0);
diff --git a/source/Transcript.cpp b/source/Transcript.cpp
index c112259..bee27d9 100644
--- a/source/Transcript.cpp
+++ b/source/Transcript.cpp
@@ -8,21 +8,21 @@ void Transcript::reset() {
     extendL=0;
 
 //     for (uint ii=0;ii<4;ii++) {
-//         polyXlength[ii]=0; 
-//         polyXnMM[ii]=0;         
+//         polyXlength[ii]=0;
+//         polyXnMM[ii]=0;
 //     };
     primaryFlag=false;
-    
+
     nWAmax=0;
-    
+
     rStart=0; roStart=0; rLength=0; gStart=0; gLength=0; //read and genomic coordinates
-    
+
     maxScore=0;nextTrScore=0;
     nMatch=0;
     nMM=0;
-    
-    nGap=0; lGap=0; lDel=0; lIns=0; nDel=0; nIns=0; 
-    
+
+    nGap=0; lGap=0; lDel=0; lIns=0; nDel=0; nIns=0;
+
     nUnique=nAnchor=0;
 };
 
@@ -30,7 +30,7 @@ void Transcript::add(Transcript *trIn) {
     maxScore+=trIn->maxScore;
     nMatch+=trIn->nMatch;
     nMM+=trIn->nMM;
-    nGap+=trIn->nGap; lGap+=trIn->lGap;    
+    nGap+=trIn->nGap; lGap+=trIn->lGap;
     lDel+=trIn->lDel; nDel+=trIn->nDel;
     lIns+=trIn->lIns; nIns+=trIn->nIns;
     nUnique+=trIn->nUnique;
diff --git a/source/Transcript.h b/source/Transcript.h
index 7fe3d14..ecbf3f1 100644
--- a/source/Transcript.h
+++ b/source/Transcript.h
@@ -13,43 +13,43 @@ class Transcript {
         int canonSJ[MAX_N_EXONS]; //canonicity of each junction
         uint8 sjAnnot[MAX_N_EXONS]; //anotated or not
         uint8 sjStr[MAX_N_EXONS]; //anotated or not
-        
+
         uint intronMotifs[3];
         uint8 sjMotifStrand;
-        
+
         uint nExons; //number of exons in the read transcript
-        
+
         uint Lread, readLengthPairOriginal;
         uint iRead; //read identifier
-        
+
         int iFrag; //frag number of the transcript, if the the transcript contains only one frag
-        
+
         //loci
         uint rStart, roStart, rLength, gStart, gLength, cStart; //read, original read, and genomic start/length, chromosome start
         uint Chr,Str,roStr; //chromosome and strand and original read Strand
-        
+
         bool primaryFlag;
-       
+
 //         uint polyXlength[4], polyXnMM[4] ;
         uint nWAmax; //number of genes, max number of alignments per gene, total number of alignments for this reads
-        
-        uint nMatch;//min number of matches    
-        uint nMM;//max number of mismatches        
+
+        uint nMatch;//min number of matches
+        uint nMM;//max number of mismatches
         uint mappedLength; //total mapped length, sum of lengths of all blocks(exons)
-        
-        uint extendL; //extension length        
+
+        uint extendL; //extension length
         intScore maxScore; //maximum Score
         intScore nextTrScore; //next after maximum Tr Score
-        
+
 
         uint nGap, lGap; //number of genomic gaps (>alignIntronMin) and their total length
         uint nDel; //number of genomic deletions (ie genomic gaps)
-        uint nIns; //number of (ie read gaps)        
+        uint nIns; //number of (ie read gaps)
         uint lDel; //total genomic deletion length
         uint lIns; //total genomic insertion length
-        
-        uint nUnique, nAnchor; //number of unique pieces in the alignment, number of anchor pieces in the alignment   
-        
+
+        uint nUnique, nAnchor; //number of unique pieces in the alignment, number of anchor pieces in the alignment
+
         Transcript(); //resets to 0
         void reset(); //reset to 0
         void resetMapG(); // reset map to 0
diff --git a/source/Transcript_alignScore.cpp b/source/Transcript_alignScore.cpp
index fc1f255..68943b5 100644
--- a/source/Transcript_alignScore.cpp
+++ b/source/Transcript_alignScore.cpp
@@ -30,19 +30,19 @@ void Transcript::alignScore(char **Read1, char *G, Parameters *P) {//re-calculat
                     break;
                 case -1: //deletion
                     maxScore += (exons[iex+1][EX_G]-exons[iex][EX_G]-exons[iex][EX_L])*P->scoreDelBase + P->scoreDelOpen;
-                    break;        
+                    break;
                 case 0: //non-canonical
                     maxScore += P->scoreGapNoncan+P->scoreGap;
                     break;
                 case 1: case 2: //GTAG
                     maxScore += P->scoreGap;
-                    break;        
+                    break;
                 case 3: case 4: //GCAG
                     maxScore += P->scoreGapGCAG+P->scoreGap;
-                    break;        
+                    break;
                 case 5: case 6: //ATAC
                     maxScore += P->scoreGapATAC+P->scoreGap;
-                    break;                  
+                    break;
             };
         };
     };
diff --git a/source/Transcriptome.cpp b/source/Transcriptome.cpp
index fddcd16..99b0779 100644
--- a/source/Transcriptome.cpp
+++ b/source/Transcriptome.cpp
@@ -3,7 +3,7 @@
 #include "GlobalVariables.h"
 
 Transcriptome::Transcriptome (Parameters* Pin) {
-    
+
     P=Pin;
     trInfoDir = P->sjdbGTFfile=="-" ? P->genomeDir : P->sjdbInsert.outDir; //if GTF file is given at the mapping stage, it's always used for transcript info
 
@@ -46,7 +46,7 @@ Transcriptome::Transcriptome (Parameters* Pin) {
         Ptr=Pin;
 
     };
-    
+
     if ( P->quant.geCount.yes ) {//load exon-gene structures
         ifstream & exinfo = ifstrOpen(trInfoDir+"/exonGeTrInfo.tab", ERROR_OUT, "SOLUTION: utilize --sjdbGTFfile /path/to/annotantions.gtf option at the genome generation step or mapping step", P);
         exinfo >> exG.nEx;
@@ -58,7 +58,7 @@ Transcriptome::Transcriptome (Parameters* Pin) {
         exG.g=new uint32[exG.nEx];
         exG.t=new uint32[exG.nEx];
 
-        
+
         for (uint ii=0;ii<exG.nEx;ii++) {
             int str1;
             exinfo >> exG.s[ii] >> exG.e[ii] >> str1 >> exG.g[ii] >> exG.t[ii];
@@ -70,8 +70,8 @@ Transcriptome::Transcriptome (Parameters* Pin) {
         exG.eMax[0]=exG.e[0];
         for (uint iex=1;iex<exG.nEx;iex++) {
             exG.eMax[iex]=max(exG.eMax[iex-1],exG.e[iex]);
-        };        
-        
+        };
+
         ifstream & geStream = ifstrOpen(trInfoDir+"/geneInfo.tab", ERROR_OUT, "SOLUTION: utilize --sjdbGTFfile /path/to/annotantions.gtf option at the genome generation step or mapping step", P);
         geStream >> nGe;
         geID.resize(nGe);
@@ -79,7 +79,7 @@ Transcriptome::Transcriptome (Parameters* Pin) {
             geStream >> geID[ii];
         };
         geStream.close();
-        
+
 
     };
 };
@@ -92,43 +92,43 @@ void Transcriptome::quantsAllocate() {
 
 void Transcriptome::quantsOutput() {
     ofstream qOut(P->quant.geCount.outFile);
-    
+
     qOut << "N_unmapped";
     for (int itype=0; itype<quants->geneCounts.nType; itype++)
     {
         qOut << "\t" <<g_statsAll.unmappedAll;
     };
     qOut << "\n";
-    
+
     qOut << "N_multimapping";
     for (int itype=0; itype<quants->geneCounts.nType; itype++)
     {
         qOut << "\t" <<quants->geneCounts.cMulti ;
     };
     qOut << "\n";
-    
+
     qOut << "N_noFeature";
     for (int itype=0; itype<quants->geneCounts.nType; itype++)
     {
         qOut << "\t" <<quants->geneCounts.cNone[itype];
-    };    
+    };
     qOut << "\n";
-    
+
     qOut << "N_ambiguous";
     for (int itype=0; itype<quants->geneCounts.nType; itype++)
     {
         qOut << "\t" <<quants->geneCounts.cAmbig[itype];
     };
-    qOut << "\n";    
-    
+    qOut << "\n";
+
     for (uint32 ig=0; ig<nGe; ig++)
-    {    
+    {
         qOut << geID[ig];
-        for (int itype=0; itype<quants->geneCounts.nType; itype++) 
+        for (int itype=0; itype<quants->geneCounts.nType; itype++)
         {
             qOut << "\t" <<quants->geneCounts.gCount[itype][ig];
         };
         qOut << "\n";
-    };    
+    };
     qOut.close();
 };
diff --git a/source/Transcriptome.h b/source/Transcriptome.h
index 0c5cc3f..389bc18 100644
--- a/source/Transcriptome.h
+++ b/source/Transcriptome.h
@@ -16,13 +16,13 @@ public:
     void quantsAllocate(); //allocate quants structure
     void quantsOutput(); //output quantification files
     string trInfoDir;
-    
+
     Parameters* Ptr; //transcriptomic parameters (i.e. chrName,...), to be used with RAtr for output
 
     vector <string> trID, geID; //transcript/gene IDs
     uint32 nTr, nGe; //number of transcript/genes
 
-    uint *trS, *trE, *trEmax; //transcripts start,end,end-max  
+    uint *trS, *trE, *trEmax; //transcripts start,end,end-max
 
     uint32 nEx; //number of exons
     uint16 *trExN; //number of exons per transcript
@@ -42,7 +42,7 @@ public:
 
 private:
     Parameters* P; //normal "genomic" parameters
-    
+
 };
 
 #endif
diff --git a/source/Transcriptome_geneCountsAddAlign.cpp b/source/Transcriptome_geneCountsAddAlign.cpp
index f0a415f..7f33818 100644
--- a/source/Transcriptome_geneCountsAddAlign.cpp
+++ b/source/Transcriptome_geneCountsAddAlign.cpp
@@ -11,23 +11,23 @@ void Transcriptome::geneCountsAddAlign(uint nA, Transcript **aAll) {//add alignm
 
          int64 e1=-1;
 
-         for (int ib=a.nExons-1; ib>=0; ib--) 
+         for (int ib=a.nExons-1; ib>=0; ib--)
          {//scan through all blocks of the alignments
 
              uint64 g1=a.exons[ib][EX_G]+a.exons[ib][EX_L]-1;//end of the block
 
-//              if ((uint)ib==a.nExons-1) 
+//              if ((uint)ib==a.nExons-1)
 //              {//binary search for the first time: end of the block among the starts of exons
                  e1=binarySearch1a<uint64>(g1, exG.s, (int32) exG.nEx);
-//              } else 
-//              {//simple backwards scan 
-//                  while (e1>=0 && exG.s[e1]>g1) 
+//              } else
+//              {//simple backwards scan
+//                  while (e1>=0 && exG.s[e1]>g1)
 //                  {//stop when exon start is less than block end
 //                      --e1;
 //                  };
 //              };
 
-             while (e1>=0 && exG.eMax[e1]>=a.exons[ib][EX_G]) 
+             while (e1>=0 && exG.eMax[e1]>=a.exons[ib][EX_G])
              {//these exons may overlap this block
                  if (exG.e[e1]>=a.exons[ib][EX_G])
                  {//this exon overlaps the block
@@ -38,10 +38,10 @@ void Transcriptome::geneCountsAddAlign(uint nA, Transcript **aAll) {//add alignm
                          if ( itype==1 && a.Str!=str1 && str1<2) continue; //same strand
                          if ( itype==2 && a.Str==str1 && str1<2) continue; //reverse strand
 
-                         if (gene1.at(itype)==-1) 
+                         if (gene1.at(itype)==-1)
                          {//first gene overlapping this read
                              gene1[itype]=exG.g[e1];
-                         } else if (gene1.at(itype)==-2) 
+                         } else if (gene1.at(itype)==-2)
                          {
                              continue;//this align was already founf to be ambig for this strand
                          } else if (gene1.at(itype)!=(int32)exG.g[e1]) {//another gene overlaps this read
@@ -49,24 +49,24 @@ void Transcriptome::geneCountsAddAlign(uint nA, Transcript **aAll) {//add alignm
                          };//otherwise it's the same gene
                      };
                  };
-                 
+
                  --e1;// go to the previous exon
              };
          };
 
-        for (int itype=0; itype<quants->geneCounts.nType; itype++)         
+        for (int itype=0; itype<quants->geneCounts.nType; itype++)
         {
-            if (gene1.at(itype)==-1) 
+            if (gene1.at(itype)==-1)
             {
                 quants->geneCounts.cNone[itype]++;
-            } else if (gene1.at(itype)==-2) 
+            } else if (gene1.at(itype)==-2)
             {
                 quants->geneCounts.cAmbig[itype]++;
             } else
             {
                 quants->geneCounts.gCount[itype][gene1.at(itype)]++;
             };
-         }; 
+         };
      };
 };
 
diff --git a/source/Transcriptome_quantAlign.cpp b/source/Transcriptome_quantAlign.cpp
index 5db324c..92bc05e 100644
--- a/source/Transcriptome_quantAlign.cpp
+++ b/source/Transcriptome_quantAlign.cpp
@@ -9,7 +9,7 @@ int alignToTranscript(Transcript &aG, uint trS1, uint8 trStr1, uint32 *exSE1, ui
     uint32 g1=aG.exons[0][EX_G]-trS1;//start of the transcript
     uint32 ex1=binarySearch1<uint32>(g1, exSE1, 2*exN1);
     if (ex1>=2*exN1) return 0; //align start is to the right of all exons
-    
+
     if (ex1%2==1) {//beginning of the read >=end of an exon
         if (exSE1[ex1]==g1) {//first base of the read is exactly the last base of the exon
             --ex1;
@@ -18,18 +18,18 @@ int alignToTranscript(Transcript &aG, uint trS1, uint8 trStr1, uint32 *exSE1, ui
         };
     };
     ex1=ex1/2; //this is the first exon of the alignment
-    
+
     aT.nExons=0;
     aT.primaryFlag=false;
-    
+
     aG.canonSJ[aG.nExons-1]=-999; //marks the last exons
     for (uint32 iab=0; iab<aG.nExons; iab++) {//scan through all blocks of the align
-        
+
 //         g1+=aG.exons[iab][EX_L]-1;//last base of the block
         if (aG.exons[iab][EX_G]+aG.exons[iab][EX_L]>exSE1[2*ex1+1]+trS1+1) {//block extends past exon end
             return 0;
         };
-        
+
         if (iab==0 || aG.canonSJ[iab-1]<0) {
             aT.exons[aT.nExons][EX_R]=aG.exons[iab][EX_R];
             aT.exons[aT.nExons][EX_G]=aG.exons[iab][EX_G]-trS1-exSE1[2*ex1]+exLenCum1[ex1];
@@ -44,32 +44,32 @@ int alignToTranscript(Transcript &aG, uint trS1, uint8 trStr1, uint32 *exSE1, ui
             case -999: //last exon
                 if (trStr1==2) {//convert align coordinates if on the -strand
                     uint32 trlength=exLenCum1[exN1-1]+exSE1[2*exN1-1]-exSE1[2*exN1-2]+1; //transcript length
-                    for (uint32 iex=0; iex<aT.nExons; iex++) 
+                    for (uint32 iex=0; iex<aT.nExons; iex++)
                     {
                         aT.exons[iex][EX_R]=aG.Lread-(aT.exons[iex][EX_R]+aT.exons[iex][EX_L]);
                         aT.exons[iex][EX_G]=trlength-(aT.exons[iex][EX_G]+aT.exons[iex][EX_L]);
                     };
-                    for (uint32 iex=0; iex<aT.nExons/2; iex++) 
+                    for (uint32 iex=0; iex<aT.nExons/2; iex++)
                     {
                         swap(aT.exons[iex][EX_R],aT.exons[aT.nExons-1-iex][EX_R]);
                         swap(aT.exons[iex][EX_G],aT.exons[aT.nExons-1-iex][EX_G]);
                         swap(aT.exons[iex][EX_L],aT.exons[aT.nExons-1-iex][EX_L]);
                         swap(aT.exons[iex][EX_iFrag],aT.exons[aT.nExons-1-iex][EX_iFrag]);
                     };
-                    for (uint32 iex=0; iex<(aT.nExons-1)/2; iex++) 
+                    for (uint32 iex=0; iex<(aT.nExons-1)/2; iex++)
                     {
                         swap(aT.canonSJ[iex],aT.canonSJ[aT.nExons-2-iex]);
                     };
 
                 };
-                for (uint32 iex=0; iex<aT.nExons; iex++) 
+                for (uint32 iex=0; iex<aT.nExons; iex++)
                 {//no junctions in the transcritomic coordinates
                     aT.sjAnnot[iex]=0;
                     aT.shiftSJ[iex][0]=0;
                     aT.shiftSJ[iex][1]=0;
                     aT.sjStr[iex]=0;
                 };
-                    
+
                 return 1; //reached the end of blocks, align is consistend with this transcript
                 break;
             case -3: //mate connection
@@ -98,13 +98,13 @@ int alignToTranscript(Transcript &aG, uint trS1, uint8 trStr1, uint32 *exSE1, ui
 
 uint32 Transcriptome::quantAlign (Transcript &aG, Transcript *aTall) {
     uint32 nAtr=0; //number of alignments to the transcriptome
-    
+
     //binary search through transcript starts
     uint32 tr1=binarySearch1a<uint>(aG.exons[0][EX_G], trS, nTr);
     if (tr1==(uint32) -1) return 0; //alignment outside of range of all transcripts
-    
+
     uint aGend=aG.exons[aG.nExons-1][EX_G];
-    
+
     ++tr1;
     do {//cycle back through all the transcripts
         --tr1;
@@ -117,6 +117,6 @@ uint32 Transcriptome::quantAlign (Transcript &aG, Transcript *aTall) {
                 };
         };
     } while (trEmax[tr1]>=aGend && tr1>0);
-    
+
     return nAtr;
 };
diff --git a/source/VERSION b/source/VERSION
index 43f76b5..db1d5a3 100644
--- a/source/VERSION
+++ b/source/VERSION
@@ -1 +1 @@
-#define STAR_VERSION "STAR_2.5.1b"
+#define STAR_VERSION "STAR_2.5.2a"
diff --git a/source/alignSmithWaterman.cpp b/source/alignSmithWaterman.cpp
index e3857fe..e7b9673 100644
--- a/source/alignSmithWaterman.cpp
+++ b/source/alignSmithWaterman.cpp
@@ -4,39 +4,39 @@
 intSWscore alignSmithWaterman(char *R, uint rL, char *G, uint gL, \
         intSWscore pMatch, intSWscore pMismatch, intSWscore pGapOpen, intSWscore pGapExtend, \
         char* T, uint Tsize, Transcript &trA) {
-    
+
     intSWscore *H=new intSWscore[rL+1];
-    
+
     uint rL1=rL+1;
     if (rL1*(gL+1)>Tsize) return (intSWscore) 0;
-    
+
     intSWscore *E=new intSWscore[rL1];
-    
+
     memset(H,0,sizeof(H[0])*(rL1));
     memset(E,0,sizeof(E[0])*(rL1));
-    
 
-    
+
+
     intSWscore maxH=0;
     uint maxHr=0, maxHg=0;
-    
+
     for (uint ig=1;ig<=gL;ig++) {//cycle over colums
         intSWscore F=(intSWscore) 0;
         intSWscore HdiagPrev=0;
         for (uint ir=1;ir<=rL;ir++) {//cycle over rows
-            
+
             E[ir]=max( E[ir]-pGapExtend, H[ir]-pGapOpen );
             E[ir]=max( E[ir], (intSWscore) 0 );
-            
+
             F = max( F-pGapExtend, H[ir-1]-pGapOpen );
             F = max( F, (intSWscore) 0);
-            
+
             intSWscore Hdiag = G[ig-1]==R[ir-1] ? HdiagPrev+pMatch : HdiagPrev-pMismatch;
-            
+
 //             if (H[ir]>E[ir] & H[ir]>F)
-                
-            HdiagPrev=H[ir];  
-            
+
+            HdiagPrev=H[ir];
+
             if (F>Hdiag && F>E[ir]) {//insertion (gap in read)
                 H[ir]=F;
                 T[ir+ig*rL1]=1;
@@ -45,21 +45,21 @@ intSWscore alignSmithWaterman(char *R, uint rL, char *G, uint gL, \
                 T[ir+ig*rL1]=2;
             } else {//deletion (gap in genome)
                 H[ir]=E[ir];
-                T[ir+ig*rL1]=3;                
+                T[ir+ig*rL1]=3;
             };
-            
+
             if (H[ir]<0) {
                 H[ir]=0;
             };
-            
+
             if (H[ir]==0) {
                 T[ir+ig*rL1]=0;
             };
-            
+
 //             Hdiag=max(Hdiag,E[ir]);
 //             Hdiag=max(Hdiag,F);
 //             H[ir]=max(Hdiag,(intSWscore) 0);
-            
+
             if (H[ir]>maxH) {
                 maxH=H[ir];
                 maxHr=ir;
@@ -71,7 +71,7 @@ intSWscore alignSmithWaterman(char *R, uint rL, char *G, uint gL, \
             #endif
         };
     };
-    
+
     //traceback the alignment
     //last operation should always be match
     if (T[maxHr+maxHg*rL1]!=2) {
@@ -81,14 +81,14 @@ intSWscore alignSmithWaterman(char *R, uint rL, char *G, uint gL, \
     trA.nExons=0;
     uint ig=maxHg, ir=maxHr;
     char prevOper=0;
-    
+
     trA.nExons=-1;
     while (T[ir+ig*rL1]>0 && ir>0 && ig>0) {
         if (T[ir+ig*rL1]==2) {
             if (prevOper==2) {//increase length
                 trA.exons[trA.nExons][EX_L]++;
             } else {//new exon
-                ++trA.nExons;                  
+                ++trA.nExons;
                 trA.exons[trA.nExons][EX_L]=1;
                 trA.exons[trA.nExons][EX_R]=ir;
                 trA.exons[trA.nExons][EX_G]=ig;
@@ -103,50 +103,50 @@ intSWscore alignSmithWaterman(char *R, uint rL, char *G, uint gL, \
             --ig;
             prevOper=3;
         };
-    };  
-    
+    };
+
     ++trA.nExons;
     for (uint ii=0;ii<trA.nExons;ii++) {//subtract length
         trA.exons[ii][EX_R] -= trA.exons[ii][EX_L]; //note that exon loci have extra +1 because T matrix is shifted by +1
-        trA.exons[ii][EX_G] -= trA.exons[ii][EX_L];        
+        trA.exons[ii][EX_G] -= trA.exons[ii][EX_L];
     };
-    
+
     for (uint ii=0;ii<trA.nExons/2;ii++) {//reverse order
         for (uint jj=0;jj<EX_SIZE;jj++) {
             swap(trA.exons[ii][jj],trA.exons[trA.nExons-1-ii][jj]);
         };
-    };    
-    
+    };
+
 //     for (uint ii=1;ii<trA.nExons;ii++) {//subtract EX_G of the first exon
-//         trA.exons[ii][EX_G] -= trA.exons[0][EX_G];        
+//         trA.exons[ii][EX_G] -= trA.exons[0][EX_G];
 //     };
-    
-    
-    
+
+
+
     #ifdef DEBUG_SW
-            for (uint jj=0;jj<3;jj++) {        
+            for (uint jj=0;jj<3;jj++) {
                 for (uint ii=0;ii<trA.nExons;ii++) {
                     stdOut << trA.exons[jj][trA.nExons-1-ii]<<",";
                 };
                 stdOut <<"\t";
             };
-            stdOut <<endl;    
+            stdOut <<endl;
             stdOut << maxHr <<"\t"<< maxHg << endl;
             for (int ir=0;ir<=rL;ir++){
                 for (int ig=0;ig<=gL;ig++){
                     stdOut << setw(2) << int(T[ir+ig*rL1]) <<"  ";
                 };
                 stdOut <<endl;
-            };            
+            };
     #endif
 //     uint ig=maxHg, ir=maxHr;
 //     uint* rMap=new uint [rL];
 //     int H1, F1, E1;
 //     while (ir>=1 && ig>=1) {
-//         
+//
 //         rMap[ir-1]=ig;
-//         
+//
 //     };
 
-    return maxH;  
+    return maxH;
 };
diff --git a/source/bamRemoveDuplicates.cpp b/source/bamRemoveDuplicates.cpp
index fd5e733..53016c1 100644
--- a/source/bamRemoveDuplicates.cpp
+++ b/source/bamRemoveDuplicates.cpp
@@ -43,7 +43,7 @@ uint32 funStartExtendS(const uint32* const p) {//calculates align start extendin
 uint32 funCigarExtendS(const uint32* const p, uint32* cout) {
     uint32* cig=(uint32*) (((char*) p)+9*4+((p[3]<<24)>>24));
     uint32 n=(p[4]<<16)>>16, n1=n;
-    
+
     if (((cig[0]<<28)>>28) == 4) {
         --n1;
         memcpy((char*) cout, (char*) (cig+1), n1*sizeof(uint32));//copy CIGAR starting from the 2nd operation
@@ -72,10 +72,10 @@ int funCompareCigarsExtendS(const uint32* const pa, const uint32* const pb){
 int funCompareCoordFlagCigarSeq(const void *a, const void *b) {
     uint32* pa1=(uint32*) *(uint32**) a;
     uint32* pa2=(uint32*) *(uint32**) ((char*)a+8);
-    
+
     uint32* pb1=(uint32*) *(uint32**) b;
     uint32* pb2=(uint32*) *(uint32**) ((char*)b+8);
-    
+
     compareReturn(funStartExtendS(pa1),funStartExtendS(pb1));//position match
     compareReturn(funStartExtendS(pa2),funStartExtendS(pb2));//2nd mate position match
     compareReturn(pa1[4]>>16,pb1[4]>>16);//FLAG match
@@ -102,7 +102,7 @@ int funCompareCoordFlagCigarSeq(const void *a, const void *b) {
         if (ii%2>0) {
             compareReturn((sa[ii/2]&15),(sb[ii/2]&15));
             ++ii;
-        };           
+        };
         for (; ii<pa2[5]; ii+=2) {
             compareReturn(sa[ii/2],sb[ii/2]);
         };
@@ -116,21 +116,21 @@ void bamRemoveDuplicates(const string bamFileName, const string bamFileNameOut,
 
     bam1_t *bamA;
     bamA=bam_init1();
-    
+
     BGZF *bamIn=bgzf_open(bamFileName.c_str(),"r");
     bam_hdr_t *bamHeader=bam_hdr_read(bamIn);
-    
+
     BGZF *bgzfOut;
     bgzfOut=bgzf_open(bamFileNameOut.c_str(),("w"+to_string((long long) P->outBAMcompression)).c_str());
     bam_hdr_write(bgzfOut, bamHeader);
-    
+
     uint bamLengthMax=P->limitBAMsortRAM; //max length to load
     if (bamLengthMax==0) bamLengthMax=16000000000;
     uint grNmax=1000000;//max number of alignments
 
     char *bamRaw=new char[bamLengthMax];
     uint *aD=new uint[grNmax*2];
-       
+
     uint bamLength=0;
     uint bamS=0, bamE=0, bamE1=1; //start/end/next-end position for read group search
     uint32 rightMax=0;
@@ -145,12 +145,12 @@ void bamRemoveDuplicates(const string bamFileName, const string bamFileNameOut,
                     ostringstream errOut;
                     errOut <<"EXITING because of fatal ERROR: not enough memory for marking duplicates \n";
                     errOut <<"SOLUTION: re-run STAR with at least --limitBAMsortRAM " <<bamLengthMax*2;
-                    exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);                                    
+                    exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);
                 };
 
                 //write out processed block
                 bgzf_write(bgzfOut,bamRaw,bamS);
-   
+
                 bamLength-=bamS;
                 memmove(bamRaw, bamRaw+bamS,bamLength); //move the non-processed part of the block to the beginning of bamRaw
                 bamLength+=bgzf_read(bamIn, bamRaw+bamLength, bamLengthMax-bamLength);//marks the end of the BAM block that has been read
@@ -162,22 +162,22 @@ void bamRemoveDuplicates(const string bamFileName, const string bamFileNameOut,
                 grN=0;
             };
         };
-   
+
         uint32* bamP=(uint32*) (bamRaw+bamE);//pointer to the 1st mate of the pair
-        bamP[4] |= (0x400<<16);//mark all aligns as duplicate, will unmark          
+        bamP[4] |= (0x400<<16);//mark all aligns as duplicate, will unmark
         uint32 chrE=bamP[1];
         uint32 leftE=bamP[2];
         uint32 rightE=bamP[7];
-        
+
         uint32 chrS=*(uint32*)(bamRaw+bamS+4*1);
-                
+
         if ( chrE !=chrS ||  (rightMax>0 && leftE>rightMax) || bamFileEnd ) {//found new group of reads to be processed, start collapsing procedure
             qsort((void*) aD, grN, sizeof(uint), funCompareNames);
             qsort((void*) aD, grN/2, 2*sizeof(uint), funCompareCoordFlagCigarSeq);
             //go through the list and select non-duplicates
             int bScore=-999, bP=0;
             for (uint pp=0; pp<grN/2; pp++) {
-                uint32* bamP1=(uint32*) aD[pp*2];//pointer to the 1st mate of the pair                           
+                uint32* bamP1=(uint32*) aD[pp*2];//pointer to the 1st mate of the pair
                 bamA->data=((uint8_t*) bamP1)+9*4+((bamP1[3]<<24)>>24)+((bamP1[4]<<16)>>16)*4+(bamP1[5]+1)/2+bamP1[5];//add length for: core, name, cigar, seq, qual
                 bamA->l_data=((uint8_t*) bamP1)+bamP1[0]+1-bamA->data;
                 int score1=bam_aux2i(bam_aux_get(bamA,"AS"));
@@ -191,40 +191,40 @@ void bamRemoveDuplicates(const string bamFileName, const string bamFileNameOut,
                     uint32* bamPb=(uint32*) aD[bP*2+1];//pointer to the 2nd mate of the pair
                     bamPb[4] ^= (0x400<<16);
                     bamPb=(uint32*) aD[bP*2];//pointer to the 1st mate of the pair
-                    bamPb[4] ^= (0x400<<16);   
+                    bamPb[4] ^= (0x400<<16);
                     //cout << ((char*)(bamPb+9)) <<"\n";
                     bScore=-999;//reset best score
-                };                            
+                };
             };
 
-            
+
             //reset for the next group
             if (bamFileEnd) break; //exit the main cycle over blocks
             rightMax=0;
             bamS=bamE;
             grN=0;
         };
-        
+
         bamA->data=((uint8_t*) bamP)+9*4+((bamP[3]<<24)>>24)+((bamP[4]<<16)>>16)*4+(bamP[5]+1)/2+bamP[5];//add length for: core, name, cigar, seq, qual
         bamA->l_data=((uint8_t*) bamP)+bamP[0]+1-bamA->data;
         int nMult=bam_aux2i(bam_aux_get(bamA,"NH"));
-        
-        if (nMult==1) {//record this alignment in the current group, unique mappers only. Multi-mappers will not be considered for collapsing, and will remain marked as duplicates      
+
+        if (nMult==1) {//record this alignment in the current group, unique mappers only. Multi-mappers will not be considered for collapsing, and will remain marked as duplicates
             if (grN>=grNmax) {//reallocate
                 grNmax=grN*2;
-                uint *aD1=new uint[grNmax];     
+                uint *aD1=new uint[grNmax];
                 memcpy((char*) aD1, (char*) aD, grN*sizeof(uint));
                 delete [] aD;
                 aD=aD1;
-                cerr << "reallocated array "<<grNmax<<endl;                
-            };            
-            aD[grN]=(uint) bamRaw+bamE; 
+                cerr << "reallocated array "<<grNmax<<endl;
+            };
+            aD[grN]=(uint) bamRaw+bamE;
             ++grN;
             if (rightE>leftE) {//left mate, record coordinate of its right mate
-                rightMax=max(rightMax, rightE);            
+                rightMax=max(rightMax, rightE);
             };
         };
-        
+
         bamE=bamE1;//shift to the next record
         bamE1=bamE+*(uint32*)(bamRaw+bamE)+4;//next alignment
 
diff --git a/source/binarySearch2.cpp b/source/binarySearch2.cpp
index 6e5afb3..9b48514 100644
--- a/source/binarySearch2.cpp
+++ b/source/binarySearch2.cpp
@@ -4,7 +4,7 @@ int binarySearch2(uint x, uint y, uint *X, uint *Y, int N) {
     //binary search in the sorted list to find the junction
     //check the boundaries first
     if (N==0 || x>X[N-1] || x<X[0]) return -1;
-    
+
     int i1=0, i2=N-1, i3=N/2;
     while (i2>i1+1) {//binary search
         i3=(i1+i2)/2;
@@ -14,7 +14,7 @@ int binarySearch2(uint x, uint y, uint *X, uint *Y, int N) {
             i1=i3;
         };
     };
-    
+
     if (x==X[i1]) {
         i3=i1;
     } else if (x==X[i2]) {
@@ -37,7 +37,7 @@ int binarySearch2(uint x, uint y, uint *X, uint *Y, int N) {
         } else if (y==Y[jj]) {
             return jj;
         };
-    };        
-  
+    };
+
     return -2; //this will happen if jj went past N
 };
diff --git a/source/blocksOverlap.cpp b/source/blocksOverlap.cpp
index 881b5d5..7c6555b 100644
--- a/source/blocksOverlap.cpp
+++ b/source/blocksOverlap.cpp
@@ -1,7 +1,7 @@
 #include "blocksOverlap.h"
 
 uint blocksOverlap(Transcript &t1, Transcript &t2) {//calculate overlap between blocks of two transcripts
-    
+
     uint i1=0, i2=0, nOverlap=0;
     while (i1<t1.nExons && i2<t2.nExons) {//scan through all exons
         uint rs1=t1.exons[i1][EX_R];
@@ -10,7 +10,7 @@ uint blocksOverlap(Transcript &t1, Transcript &t2) {//calculate overlap between
         uint re2=t2.exons[i2][EX_R]+t2.exons[i2][EX_L];
         uint gs1=t1.exons[i1][EX_G];
         uint gs2=t2.exons[i2][EX_G];
-        
+
         if (rs1>=re2) {//t1 block is on the right to t2, no hope of overlap
             i2++;
         } else if (rs2>=re1) {//t2 block is on the right to t1, no hope of overlap
@@ -21,21 +21,21 @@ uint blocksOverlap(Transcript &t1, Transcript &t2) {//calculate overlap between
         } else {//overlap
             nOverlap += min(re1,re2) - max(rs1,rs2);
             if (re1>=re2) i2++;//1 is on the right of 2
-            if (re2>=re1) i1++;//2 is on the right of 1            
+            if (re2>=re1) i1++;//2 is on the right of 1
         };
     };
-    
+
     //debug
 //     uint nO1=0;
 //     for (uint ir=0;ir<t1.Lread;ir++) {
 //         if (t1.gMap[ir]==t2.gMap[ir] && t1.gMap[ir]>0) nO1++;
 //     };
-//     
+//
 //     if (nOverlap!=nO1) {
 //         exit(255);
 //     };
-//         
-    
+//
+
     return nOverlap;
 };
 
diff --git a/source/extendAlign.cpp b/source/extendAlign.cpp
index 1dde38e..3848707 100644
--- a/source/extendAlign.cpp
+++ b/source/extendAlign.cpp
@@ -6,9 +6,9 @@
 bool extendAlign( char* R, char* Q, char* G, uint rStart, uint gStart, int dR, int dG, uint L, uint Lprev, uint nMMprev, uint nMMmax, double pMMmax, bool extendToEnd, Transcript* trA ) {
 
 // find the maximum score
-    
+
 int iS,iG;
-    
+
 int Score=0, nMatch=0, nMM=0;
 trA->maxScore=0;
 
@@ -27,8 +27,8 @@ if (extendToEnd) {//end to end extension
             trA->extendL=0;
             trA->maxScore=-999999999;
             trA->nMatch=0;
-            trA->nMM=nMMmax+1;            
-            return true; 
+            trA->nMM=nMMmax+1;
+            return true;
 //             return false;
         };
         if (R[iS]==MARK_FRAG_SPACER_BASE) break; //no extension through the spacer between fragments
@@ -49,7 +49,7 @@ if (extendToEnd) {//end to end extension
         trA->maxScore=Score;
         trA->nMatch=nMatch;
         trA->nMM=nMM;
-        return true;    
+        return true;
     } else {
         return false;
     };
@@ -60,12 +60,12 @@ if (extendToEnd) {//end to end extension
 for (int i=0;i<(int) L;i++) {
     iS=dR*i;
     iG=dG*i;
-    
+
     if ((gStart+iG)==(uint)(-1) || G[iG]==5 || R[iS]==MARK_FRAG_SPACER_BASE) break; //no extension through chr boundary, or through the spacer between fragments
     if (R[iS]>3 || G[iG]>3) continue;//no penalties for Ns in reads or genome
-    
+
     if (G[iG]==R[iS]) {//Match
-        nMatch++;        
+        nMatch++;
         Score += int(Q[iS]);
         if (Score>trA->maxScore) {//record new maximum
             if (nMM+nMMprev <= min(pMMmax*double(Lprev+i+1), double(nMMmax)) ) {//check nMM, if too many mismatches - do not record this maximum. Do not break - there might be still hope to make a long extension
@@ -73,20 +73,20 @@ for (int i=0;i<(int) L;i++) {
                 trA->maxScore=Score;
                 trA->nMatch=nMatch;
                 trA->nMM=nMM;
-            }; 
-        };    
+            };
+        };
     } else {//MM
-        if (nMM+nMMprev >= min(pMMmax*double(Lprev+L), double(nMMmax)) ) {//there is no hope to extend it further, break      
+        if (nMM+nMMprev >= min(pMMmax*double(Lprev+L), double(nMMmax)) ) {//there is no hope to extend it further, break
             break;
         };
-      
-        nMM++;  
+
+        nMM++;
         Score -= int(Q[iS]);
     };
 };
 
 // decide of the extension worked
-bool extDone =  trA->extendL > 0; 
+bool extDone =  trA->extendL > 0;
 
 return extDone;
 
diff --git a/source/funCompareUintAndSuffixes.cpp b/source/funCompareUintAndSuffixes.cpp
index c62953c..e09ed31 100644
--- a/source/funCompareUintAndSuffixes.cpp
+++ b/source/funCompareUintAndSuffixes.cpp
@@ -1,28 +1,28 @@
 #include "funCompareUintAndSuffixes.h"
-#define uint64 unsigned long long
 
-char* globalGenomeArray;
+char* g_funCompareUintAndSuffixes_G;
+uint64_t g_funCompareUintAndSuffixes_L;
 
 int funCompareUintAndSuffixes ( const void *a, const void *b){
-    uint64* va= ((uint64*) a);
-    uint64* vb= ((uint64*) b);
+    uint64_t* va= ((uint64_t*) a);
+    uint64_t* vb= ((uint64_t*) b);
 
     if (va[0]>vb[0]) {
             return 1;
         } else if (va[0]<vb[0]) {
             return -1;
         } else {//compare suffixes
-            char* ga=globalGenomeArray + *( ((uint64*) a)+1);
-            char* gb=globalGenomeArray + *( ((uint64*) b)+1);
+            char* ga=g_funCompareUintAndSuffixes_G + *( ((uint64_t*) a)+1);
+            char* gb=g_funCompareUintAndSuffixes_G + *( ((uint64_t*) b)+1);
             int ig=0;
             while (true) {
-                if (ga[ig]>gb[ig]) 
+                if (ga[ig]>gb[ig])
                 {// second condition: reached the end of ga, it's >= than any character, but = does not matter
                     return 1;
-                } else if (ga[ig]<gb[ig]) 
+                } else if (ga[ig]<gb[ig])
                 {
                     return -1;
-                } else if (ga[ig]==5) 
+                } else if (ga[ig]==5)
                 {//reached the end of chr, now simply compare the indexes for stable search
                     if (va[1]>vb[1])
                     {
@@ -31,7 +31,7 @@ int funCompareUintAndSuffixes ( const void *a, const void *b){
                     {//va cannot be equal to vb
                         return -1;
                     };
-                } else 
+                } else
                 {//continue
                     ig++;
                 };
diff --git a/source/funCompareUintAndSuffixes.h b/source/funCompareUintAndSuffixes.h
index db2a4b6..e5419c7 100644
--- a/source/funCompareUintAndSuffixes.h
+++ b/source/funCompareUintAndSuffixes.h
@@ -1,7 +1,11 @@
 #ifndef CODE_funCompareUintAndSuffixes
 #define CODE_funCompareUintAndSuffixes
 
-extern char* globalGenomeArray;
+#include <stdint.h>
+
+extern char* g_funCompareUintAndSuffixes_G;
+extern uint64_t g_funCompareUintAndSuffixes_L;
+
 int funCompareUintAndSuffixes ( const void *a, const void *b);
 
 #endif
diff --git a/source/funCompareUintAndSuffixesMemcmp.cpp b/source/funCompareUintAndSuffixesMemcmp.cpp
new file mode 100644
index 0000000..d925a99
--- /dev/null
+++ b/source/funCompareUintAndSuffixesMemcmp.cpp
@@ -0,0 +1,33 @@
+#include "funCompareUintAndSuffixesMemcmp.h"
+#include <string.h> //for memcmp
+
+char* g_funCompareUintAndSuffixesMemcmp_G;
+uint64_t g_funCompareUintAndSuffixesMemcmp_L;
+
+int funCompareUintAndSuffixesMemcmp ( const void *a, const void *b)
+{   
+    uint64_t* va= ((uint64_t*) a);
+    uint64_t* vb= ((uint64_t*) b);
+
+    if (va[0]>vb[0]) 
+    {
+        return 1;
+    } else if (va[0]<vb[0]) 
+    {
+        return -1;
+    } else 
+    {//compare suffixes
+//         char *p5=(char*) memchr(g_funCompareUintAndSuffixesMemcmp_G+va[1],5,g_funCompareUintAndSuffixesMemcmp_L); //first encounter of char=5
+        char *p5=g_funCompareUintAndSuffixesMemcmp_G+va[1]+g_funCompareUintAndSuffixesMemcmp_L;
+        //compare suffixes but only until first char=5
+//         int comp=memcmp(g_funCompareUintAndSuffixesMemcmp_G+va[1],g_funCompareUintAndSuffixesMemcmp_G+vb[1],p5+1-(g_funCompareUintAndSuffixesMemcmp_G+va[1]));
+        int comp=memcmp(g_funCompareUintAndSuffixesMemcmp_G+va[1],g_funCompareUintAndSuffixesMemcmp_G+vb[1],g_funCompareUintAndSuffixesMemcmp_L);
+        
+        if (comp==0)
+        {
+            comp=va[1]>vb[1] ? 1 : -1;
+        };
+//         int comp=va[1]>vb[1] ? 1 : -1;
+        return comp;
+    };
+};
diff --git a/source/funCompareUintAndSuffixesMemcmp.h b/source/funCompareUintAndSuffixesMemcmp.h
new file mode 100644
index 0000000..83c6f92
--- /dev/null
+++ b/source/funCompareUintAndSuffixesMemcmp.h
@@ -0,0 +1,10 @@
+#ifndef CODE_funCompareUintAndSuffixesMemcmp
+#define CODE_funCompareUintAndSuffixesMemcmp
+
+#include <stdint.h>
+
+extern char* g_funCompareUintAndSuffixesMemcmp_G;
+extern uint64_t g_funCompareUintAndSuffixesMemcmp_L;
+int funCompareUintAndSuffixesMemcmp ( const void *a, const void *b);
+
+#endif
\ No newline at end of file
diff --git a/source/genomeGenerate.cpp b/source/genomeGenerate.cpp
index acf9465..00e4b3a 100644
--- a/source/genomeGenerate.cpp
+++ b/source/genomeGenerate.cpp
@@ -22,7 +22,7 @@ uint globalL;
 
 
 inline int funCompareSuffixes ( const void *a, const void *b){
-        
+
     uint *ga=(uint*)((globalG-7LLU)+(*((uint*)a)));
     uint *gb=(uint*)((globalG-7LLU)+(*((uint*)b)));
 
@@ -34,25 +34,25 @@ inline int funCompareSuffixes ( const void *a, const void *b){
     while (jj < globalL) {
         va=*(ga-jj);
         vb=*(gb-jj);
-        
-        #define has5(v) ((((v)^0x0505050505050505) - 0x0101010101010101) & ~((v)^0x0505050505050505) & 0x8080808080808080) 
-        
+
+        #define has5(v) ((((v)^0x0505050505050505) - 0x0101010101010101) & ~((v)^0x0505050505050505) & 0x8080808080808080)
+
         if (has5(va) && has5(vb))
         {//there is 5 in the sequence - only compare bytes before 5
             va1=(uint8*) &va;
             vb1=(uint8*) &vb;
             for (ii=7;ii>=0;ii--)
             {
-                if (va1[ii]>vb1[ii]) 
+                if (va1[ii]>vb1[ii])
                 {
                     return 1;
-                } else if (va1[ii]<vb1[ii]) 
+                } else if (va1[ii]<vb1[ii])
                 {
                     return -1;
                 } else if (va1[ii]==5)
                 {//va=vb at the end of chr
                     if ( *((uint*)a) > *((uint*)b) )
-                    {//anti-stable order,since indexes are sorted in the reverse order 
+                    {//anti-stable order,since indexes are sorted in the reverse order
                         return  -1;
                     } else
                     {//a cannot be equal to b
@@ -62,20 +62,20 @@ inline int funCompareSuffixes ( const void *a, const void *b){
             };
         } else
         {//no 5, simple comparison
-            if (va>vb) 
+            if (va>vb)
             {
                 return 1;
-            } else if (va<vb) 
+            } else if (va<vb)
             {
                 return -1;
             };
         };
         jj++;
     };
-    
+
     //suffixes are equal up to globalL, no simply compare the indexes
     if ( *((uint*)a) > *((uint*)b) )
-    {//anti-stable order,since indexes are sorted in the reverse order 
+    {//anti-stable order,since indexes are sorted in the reverse order
         return  -1;
     } else
     {//a cannot be equal to b
@@ -83,20 +83,20 @@ inline int funCompareSuffixes ( const void *a, const void *b){
     };
 };
 
-// inline bool funCompareSuffixesBool ( const void *a, const void *b) 
+// inline bool funCompareSuffixesBool ( const void *a, const void *b)
 // {
 // 	uint jj=0LLU;
-//         
+//
 // 	uint *ga=(uint*)((globalG-7LLU)+(*((uint*)a)));
 // 	uint *gb=(uint*)((globalG-7LLU)+(*((uint*)b)));
 //     uint va=0,vb=0;
-// 
+//
 // 	while (va==vb && jj<globalL) {
 // 		va=*(ga-jj);
 // 		vb=*(gb-jj);
 // 		jj++;
 // 	};
-// 
+//
 // 	if (va<vb) {
 //         return true;
 // 	} else {
@@ -113,95 +113,95 @@ inline uint funG2strLocus (uint SAstr, uint const N, char const GstrandBit, uint
 };
 
 void genomeGenerate(Parameters *P) {
-    
+
     //check parameters
-    if (P->sjdbOverhang<=0 && (P->sjdbFileChrStartEnd.at(0)!="-" || P->sjdbGTFfile!="-")) 
+    if (P->sjdbOverhang<=0 && (P->sjdbFileChrStartEnd.at(0)!="-" || P->sjdbGTFfile!="-"))
     {
         ostringstream errOut;
         errOut << "EXITING because of FATAL INPUT PARAMETER ERROR: for generating genome with annotations (--sjdbFileChrStartEnd or --sjdbGTFfile options)\n";
         errOut << "you need to specify >0 --sjdbOverhang\n";
-        errOut << "SOLUTION: re-run genome generation specifying non-zero --sjdbOverhang, which ideally should be equal to OneMateLength-1, or could be chosen generically as ~100\n";        
+        errOut << "SOLUTION: re-run genome generation specifying non-zero --sjdbOverhang, which ideally should be equal to OneMateLength-1, or could be chosen generically as ~100\n";
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
-    } 
-    if (P->sjdbFileChrStartEnd.at(0)=="-" && P->sjdbGTFfile=="-") 
+    }
+    if (P->sjdbFileChrStartEnd.at(0)=="-" && P->sjdbGTFfile=="-")
     {
         if (P->parArray.at(P->sjdbOverhang_par)->inputLevel>0 && P->sjdbOverhang>0)
         {
             ostringstream errOut;
             errOut << "EXITING because of FATAL INPUT PARAMETER ERROR: when generating genome without annotations (--sjdbFileChrStartEnd or --sjdbGTFfile options)\n";
             errOut << "do not specify >0 --sjdbOverhang\n";
-            errOut << "SOLUTION: re-run genome generation without --sjdbOverhang option\n";        
+            errOut << "SOLUTION: re-run genome generation without --sjdbOverhang option\n";
             exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         };
         P->sjdbOverhang=0;
     };
-    
+
     //time
     time_t rawTime;
     string timeString;
-    
+
     time(&rawTime);
-    P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... Starting to generate Genome files\n" <<flush;
-    *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... Starting to generate Genome files\n" <<flush;
-    
+    P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... starting to generate Genome files\n" <<flush;
+    *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... starting to generate Genome files\n" <<flush;
+
     //define some parameters from input parameters
     P->genomeChrBinNbases=1LLU << P->genomeChrBinNbits;
     //write genome parameters file
     genomeParametersWrite(P->genomeDir+("/genomeParameters.txt"), P, ERROR_OUT);
-    
-    char *G=NULL, *G1=NULL;        
-    uint nGenomeReal=genomeScanFastaFiles(P,G,false);//first scan the fasta file to find all the sizes  
+
+    char *G=NULL, *G1=NULL;
+    uint nGenomeReal=genomeScanFastaFiles(P,G,false);//first scan the fasta file to find all the sizes
     P->chrBinFill();
 
-    uint L=10000;//maximum length of genome suffix    
+    uint L=10000;//maximum length of genome suffix
     uint nG1alloc=(nGenomeReal + L)*2;
     G1=new char[nG1alloc];
     G=G1+L;
-    
+
     memset(G1,GENOME_spacingChar,nG1alloc);//initialize to K-1 all bytes
- 
-    genomeScanFastaFiles(P,G,true);    //load the genome sequence   
+
+    genomeScanFastaFiles(P,G,true);    //load the genome sequence
 
     uint N = nGenomeReal;
     P->nGenome=N;
-    uint N2 = N*2;     
+    uint N2 = N*2;
 
     ofstream & chrN = ofstrOpen(P->genomeDir+"/chrName.txt",ERROR_OUT, P);
     ofstream & chrS = ofstrOpen(P->genomeDir+"/chrStart.txt",ERROR_OUT, P);
     ofstream & chrL = ofstrOpen(P->genomeDir+"/chrLength.txt",ERROR_OUT, P);
     ofstream & chrNL = ofstrOpen(P->genomeDir+"/chrNameLength.txt",ERROR_OUT, P);
-    
+
     for (uint ii=0;ii<P->nChrReal;ii++) {//output names, starts, lengths
         chrN<<P->chrName[ii]<<"\n";
         chrS<<P->chrStart[ii]<<"\n";
         chrL<<P->chrLength.at(ii)<<"\n";
-        chrNL<<P->chrName[ii]<<"\t"<<P->chrLength.at(ii)<<"\n";        
+        chrNL<<P->chrName[ii]<<"\t"<<P->chrLength.at(ii)<<"\n";
     };
     chrS<<P->chrStart[P->nChrReal]<<"\n";//size of the genome
-    chrN.close();chrL.close();chrS.close(); chrNL.close();   
-    
+    chrN.close();chrL.close();chrS.close(); chrNL.close();
+
     if (P->limitGenomeGenerateRAM < (nG1alloc+nG1alloc/3)) {//allocate nG1alloc/3 for SA generation
-        ostringstream errOut;                            
+        ostringstream errOut;
         errOut <<"EXITING because of FATAL PARAMETER ERROR: limitGenomeGenerateRAM="<< (P->limitGenomeGenerateRAM) <<"is too small for your genome\n";
         errOut <<"SOLUTION: please specify limitGenomeGenerateRAM not less than"<< nG1alloc+nG1alloc/3 <<" and make that much RAM available \n";
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
-    };     
-    
+    };
+
     //preparing to generate SA
     for (uint ii=0;ii<N;ii++) {//- strand
         G[N2-1-ii]=G[ii]<4 ? 3-G[ii] : G[ii];
-    };      
-    
+    };
+
     P->nSA=0;
     for (uint ii=0;ii<N2;ii+=P->genomeSAsparseD) {
         if (G[ii]<4) {
             P->nSA++;
         };
-    };     
-    
-    P->GstrandBit = (uint) floor(log(N)/log(2))+1; 
+    };
+
+    P->GstrandBit = (uint) floor(log(N+P->limitSjdbInsertNsj*P->sjdbLength)/log(2))+1;
     if (P->GstrandBit<32) P->GstrandBit=32; //TODO: use simple access function for SA
-    
+
     P->GstrandMask = ~(1LLU<<P->GstrandBit);
     PackedArray SA1;//SA without sjdb
     SA1.defineBits(P->GstrandBit+1,P->nSA);
@@ -213,21 +213,21 @@ void genomeGenerate(Parameters *P) {
     {//same as SA1
         SA2.defineBits(P->GstrandBit+1,P->nSA);
     };
-        
-    P->inOut->logMain  << "Number of SA indices: "<< P->nSA << "\n"<<flush;    
+
+    P->inOut->logMain  << "Number of SA indices: "<< P->nSA << "\n"<<flush;
 
     //sort SA
     time ( &rawTime );
-    P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... starting to sort  Suffix Array. This may take a long time...\n" <<flush;   
-    *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... starting to sort  Suffix Array. This may take a long time...\n" <<flush;
-   
+    P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... starting to sort Suffix Array. This may take a long time...\n" <<flush;
+    *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... starting to sort Suffix Array. This may take a long time...\n" <<flush;
+
 
 //     if (false)
     {//sort SA chunks
-        
+
         for (uint ii=0;ii<N;ii++) {//re-fill the array backwards for sorting
             swap(G[N2-1-ii],G[ii]);
-        };          
+        };
         globalG=G;
         globalL=P->genomeSuffixLengthMax/sizeof(uint);
         //count the number of indices with 4nt prefix
@@ -244,7 +244,7 @@ void genomeGenerate(Parameters *P) {
         };
 
         uint saChunkSize=(P->limitGenomeGenerateRAM-nG1alloc)/8/P->runThreadN; //number of SA indexes per chunk
-        saChunkSize=saChunkSize*6/10; //allow extra space for qsort            
+        saChunkSize=saChunkSize*6/10; //allow extra space for qsort
         //uint saChunkN=((P->nSA/saChunkSize+1)/P->runThreadN+1)*P->runThreadN;//ensure saChunkN is divisible by P->runThreadN
         //saChunkSize=P->nSA/saChunkN+100000;//final chunk size
         if (P->runThreadN>1) saChunkSize=min(saChunkSize,P->nSA/(P->runThreadN-1));
@@ -260,7 +260,7 @@ void genomeGenerate(Parameters *P) {
             if (chunkSize1 > saChunkSize) {
                 saChunkN++;
                 indPrefStart[saChunkN]=ii;
-                indPrefChunkCount[saChunkN-1]=chunkSize1-indPrefCount[ii];                    
+                indPrefChunkCount[saChunkN-1]=chunkSize1-indPrefCount[ii];
                 chunkSize1=indPrefCount[ii];
             };
         };
@@ -271,7 +271,7 @@ void genomeGenerate(Parameters *P) {
         P->inOut->logMain  << "Number of chunks: " << saChunkN <<";   chunks size limit: " << saChunkSize*8 <<" bytes\n" <<flush;
 
         time ( &rawTime );
-        P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... sorting Suffix Array chunks and saving them to disk...\n" <<flush;   
+        P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... sorting Suffix Array chunks and saving them to disk...\n" <<flush;
         *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... sorting Suffix Array chunks and saving them to disk...\n" <<flush;
 
         #pragma omp parallel for num_threads(P->runThreadN) ordered schedule(dynamic,1)
@@ -291,12 +291,12 @@ void genomeGenerate(Parameters *P) {
 
             //sort the chunk
             qsort(saChunk,indPrefChunkCount[iChunk],sizeof(saChunk[0]),funCompareSuffixes);
-            for (uint ii=0;ii<indPrefChunkCount[iChunk];ii++) {    
+            for (uint ii=0;ii<indPrefChunkCount[iChunk];ii++) {
                 saChunk[ii]=N2-1-saChunk[ii];
-            };  
+            };
             //write files
             string chunkFileName=P->genomeDir+"/SA_"+to_string( (uint) iChunk);
-            ofstream & saChunkFile = ofstrOpen(chunkFileName,ERROR_OUT, P);   
+            ofstream & saChunkFile = ofstrOpen(chunkFileName,ERROR_OUT, P);
             fstreamWriteBig(saChunkFile, (char*) saChunk, sizeof(saChunk[0])*indPrefChunkCount[iChunk],chunkFileName,ERROR_OUT,P);
             saChunkFile.close();
             delete [] saChunk;
@@ -304,18 +304,18 @@ void genomeGenerate(Parameters *P) {
         };
 
         time ( &rawTime );
-        P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... loading chunks from disk, packing SA...\n" <<flush;   
-        *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... loading chunks from disk, packing SA...\n" <<flush;    
+        P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... loading chunks from disk, packing SA...\n" <<flush;
+        *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... loading chunks from disk, packing SA...\n" <<flush;
 
         //read chunks and pack into full SA1
         SA2.allocateArray();
         SA1.pointArray(SA2.charArray + SA2.lengthByte-SA1.lengthByte); //SA1 is shifted to have space for junction insertion
-        uint N2bit= 1LLU << P->GstrandBit;          
+        uint N2bit= 1LLU << P->GstrandBit;
         uint packedInd=0;
 
         #define SA_CHUNK_BLOCK_SIZE 10000000
         uint* saIn=new uint[SA_CHUNK_BLOCK_SIZE]; //TODO make adjustable
-        
+
         #ifdef genenomeGenerate_SA_textOutput
                 ofstream SAtxtStream ((P->genomeDir + "/SAtxt").c_str());
         #endif
@@ -328,7 +328,7 @@ void genomeGenerate(Parameters *P) {
                 uint chunkBytesN=fstreamReadBig(saChunkFile,(char*) saIn,SA_CHUNK_BLOCK_SIZE*sizeof(saIn[0]));
                 for (uint ii=0;ii<chunkBytesN/sizeof(saIn[0]);ii++) {
                     SA1.writePacked( packedInd+ii, (saIn[ii]<N) ? saIn[ii] : ( (saIn[ii]-N) | N2bit ) );
-                    
+
                     #ifdef genenomeGenerate_SA_textOutput
                         SAtxtStream << saIn[ii] << "\n";
                     #endif
@@ -341,59 +341,59 @@ void genomeGenerate(Parameters *P) {
 
         #ifdef genenomeGenerate_SA_textOutput
                 SAtxtStream.close();
-        #endif        
+        #endif
         delete [] saIn;
 
         if (packedInd != P->nSA ) {//
-            ostringstream errOut;                            
+            ostringstream errOut;
             errOut << "EXITING because of FATAL problem while generating the suffix array\n";
             errOut << "The number of indices read from chunks = "<<packedInd<<" is not equal to expected nSA="<<P->nSA<<"\n";
             errOut << "SOLUTION: try to re-run suffix array generation, if it still does not work, report this problem to the author\n"<<flush;
             exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         };
-        
+
         //DONE with suffix array generation
-        
+
         for (uint ii=0;ii<N;ii++) {//return to normal order for future use
             swap(G[N2-1-ii],G[ii]);
-        };         
+        };
         delete [] indPrefCount;
         delete [] indPrefStart;
         delete [] indPrefChunkCount;
-    };    
+    };
 
     time ( &rawTime );
     timeString=asctime(localtime ( &rawTime ));
     timeString.erase(timeString.end()-1,timeString.end());
-    P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... Finished generating suffix array\n" <<flush;  
-    *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... Finished generating suffix array\n" <<flush;          
+    P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... finished generating suffix array\n" <<flush;
+    *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... finished generating suffix array\n" <<flush;
 
 ////////////////////////////////////////
 //          SA index
 //
 //     PackedArray SAold;
-// 
+//
 //     if (true)
 //     {//testing: load SA from disk
 //             //read chunks and pack into full SA1
-//         
+//
 //         ifstream oldSAin("./DirTrue/SA");
 //         oldSAin.seekg (0, ios::end);
 //         P->nSAbyte=(uint) oldSAin.tellg();
-//         oldSAin.clear();        
+//         oldSAin.clear();
 //         oldSAin.seekg (0, ios::beg);
-// 
+//
 //         P->nSA=(P->nSAbyte*8)/(P->GstrandBit+1);
-//         SAold.defineBits(P->GstrandBit+1,P->nSA);  
+//         SAold.defineBits(P->GstrandBit+1,P->nSA);
 //         SAold.allocateArray();
-//         
+//
 //         oldSAin.read(SAold.charArray,SAold.lengthByte);
 //         oldSAin.close();
-//         
+//
 //         SA1=SAold;
 //         SA2=SAold;
 //     };
-    
+
     PackedArray SAip;
     genomeSAindex(G,SA1,P,SAip);
 
@@ -409,58 +409,58 @@ void genomeGenerate(Parameters *P) {
         P->sjdbInsert.outDir=P->genomeDir;
         P->sjdbN=0;//no junctions are loaded yet
         P->twoPass.pass2=false;
-        
+
         Parameters *P1=new Parameters;
-        *P1=*P;        
-        
+        *P1=*P;
+
         sjdbInsertJunctions(P, P1, mainGenome, sjdbLoci);
-        
+
         //write an extra 0 at the end of the array, filling the last bytes that otherwise are not accessible, but will be written to disk
         //this is - to avoid valgrind complaints. Note that SA2 is allocated with plenty of space to spare.
         SA1=mainGenome.SA;
         SA1.writePacked(P->nSA,0);
     };
-    
+
     //write genome to disk
     time ( &rawTime );
-    P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... writing Genome to disk ...\n" <<flush;   
-    *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... writing Genome to disk ...\n" <<flush;   
-    
-    ofstream & genomeOut = ofstrOpen(P->genomeDir+"/Genome",ERROR_OUT, P);   
+    P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... writing Genome to disk ...\n" <<flush;
+    *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... writing Genome to disk ...\n" <<flush;
+
+    ofstream & genomeOut = ofstrOpen(P->genomeDir+"/Genome",ERROR_OUT, P);
     fstreamWriteBig(genomeOut,G,P->nGenome,P->genomeDir+"/Genome",ERROR_OUT,P);
-    genomeOut.close();  
+    genomeOut.close();
 
-    //write SA                
+    //write SA
     time ( &rawTime );
     P->inOut->logMain  << "SA size in bytes: "<<SA1.lengthByte << "\n"<<flush;
 
-    P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... writing Suffix Array to disk ...\n" <<flush;   
-    *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... writing Suffix Array to disk ...\n" <<flush;   
+    P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... writing Suffix Array to disk ...\n" <<flush;
+    *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... writing Suffix Array to disk ...\n" <<flush;
 
-    ofstream & SAout = ofstrOpen(P->genomeDir+"/SA",ERROR_OUT, P);   
+    ofstream & SAout = ofstrOpen(P->genomeDir+"/SA",ERROR_OUT, P);
     fstreamWriteBig(SAout,(char*) SA1.charArray, (streamsize) SA1.lengthByte,P->genomeDir+"/SA",ERROR_OUT,P);
-    SAout.close();    
-    
+    SAout.close();
+
     //write SAi
-    time(&rawTime);    
-    P->inOut->logMain    << timeMonthDayTime(rawTime) <<" ... writing SAindex to disk\n" <<flush;   
-    *P->inOut->logStdOut << timeMonthDayTime(rawTime) <<" ... writing SAindex to disk\n" <<flush;   
-    
+    time(&rawTime);
+    P->inOut->logMain    << timeMonthDayTime(rawTime) <<" ... writing SAindex to disk\n" <<flush;
+    *P->inOut->logStdOut << timeMonthDayTime(rawTime) <<" ... writing SAindex to disk\n" <<flush;
+
     //write SAi to disk
     ofstream & SAiOut = ofstrOpen(P->genomeDir+"/SAindex",ERROR_OUT, P);
 
     fstreamWriteBig(SAiOut, (char*) &P->genomeSAindexNbases, sizeof(P->genomeSAindexNbases),P->genomeDir+"/SAindex",ERROR_OUT,P);
-    fstreamWriteBig(SAiOut, (char*) P->genomeSAindexStart, sizeof(P->genomeSAindexStart[0])*(P->genomeSAindexNbases+1),P->genomeDir+"/SAindex",ERROR_OUT,P);        
+    fstreamWriteBig(SAiOut, (char*) P->genomeSAindexStart, sizeof(P->genomeSAindexStart[0])*(P->genomeSAindexNbases+1),P->genomeDir+"/SAindex",ERROR_OUT,P);
     fstreamWriteBig(SAiOut,  SAip.charArray, SAip.lengthByte,P->genomeDir+"/SAindex",ERROR_OUT,P);
-    SAiOut.close();    
+    SAiOut.close();
 
     SA2.deallocateArray();
 
     time(&rawTime);
     timeString=asctime(localtime ( &rawTime ));
     timeString.erase(timeString.end()-1,timeString.end());
-    
-    time(&rawTime);        
-    P->inOut->logMain    << timeMonthDayTime(rawTime) << " ..... Finished successfully\n" <<flush;    
-    *P->inOut->logStdOut << timeMonthDayTime(rawTime) << " ..... Finished successfully\n" <<flush;
+
+    time(&rawTime);
+    P->inOut->logMain    << timeMonthDayTime(rawTime) << " ..... finished successfully\n" <<flush;
+    *P->inOut->logStdOut << timeMonthDayTime(rawTime) << " ..... finished successfully\n" <<flush;
 };
diff --git a/source/genomeParametersWrite.cpp b/source/genomeParametersWrite.cpp
index 629d0f2..9ce7acb 100644
--- a/source/genomeParametersWrite.cpp
+++ b/source/genomeParametersWrite.cpp
@@ -4,9 +4,9 @@
 void genomeParametersWrite(string fileName, Parameters* P, string errorOut)
 {//write the genome information into the genomePar stream
     ofstream & genomePar = ofstrOpen(fileName, errorOut, P);
-    
+
     genomePar << "### "<<P->commandLineFull <<"\n";
-    
+
     genomePar << "versionGenome\t" << P->versionSTAR <<"\n";
     genomePar << "genomeFastaFiles\t";
     for (uint ii=0;ii<P->genomeFastaFiles.size();ii++) genomePar << P->genomeFastaFiles.at(ii) << " ";
@@ -19,13 +19,13 @@ void genomeParametersWrite(string fileName, Parameters* P, string errorOut)
     genomePar << "sjdbFileChrStartEnd\t";
     for (uint ii=0;ii<P->sjdbFileChrStartEnd.size();ii++) genomePar<< P->sjdbFileChrStartEnd.at(ii) << " ";
     genomePar<<"\n";
-    
+
     genomePar << "sjdbGTFfile\t" << P->sjdbGTFfile <<"\n";
     genomePar << "sjdbGTFchrPrefix\t" << P->sjdbGTFchrPrefix <<"\n";
     genomePar << "sjdbGTFfeatureExon\t" << P->sjdbGTFfeatureExon <<"\n";
     genomePar << "sjdbGTFtagExonParentTranscript\t" << P->sjdbGTFtagExonParentTranscript <<"\n";
     genomePar << "sjdbGTFtagExonParentGene\t" << P->sjdbGTFtagExonParentGene <<"\n";
-    
+
     genomePar << "sjdbInsertSave\t" << P->sjdbInsert.save <<"\n";
-    genomePar.close();      
-};   
+    genomePar.close();
+};
diff --git a/source/genomeSAindex.cpp b/source/genomeSAindex.cpp
index 85349e3..d4bf632 100644
--- a/source/genomeSAindex.cpp
+++ b/source/genomeSAindex.cpp
@@ -1,4 +1,4 @@
-#include "genomeSAindex.h" 
+#include "genomeSAindex.h"
 #include "TimeFunctions.h"
 #include "SuffixArrayFuns.h"
 #include "ErrorWarning.h"
@@ -11,7 +11,7 @@ void genomeSAindex(char * G, PackedArray & SA, Parameters * P, PackedArray & SAi
         P->genomeSAindexStart[ii] = P->genomeSAindexStart[ii-1] + ( 1LLU<<(2*ii) );
     };
     P->nSAi = P->genomeSAindexStart[P->genomeSAindexNbases];
-    
+
     /* testing
     //     uint* SAi1=new uint[P->nSAi];
 
@@ -21,36 +21,36 @@ void genomeSAindex(char * G, PackedArray & SA, Parameters * P, PackedArray & SAi
     ifstream oldSAiin("./DirTrue/SAindex");
     oldSAiin.read(SAio.charArray,8*(P->genomeSAindexNbases+2));//skip first bytes
     oldSAiin.read(SAio.charArray,SAio.lengthByte);
-    oldSAiin.close();      
+    oldSAiin.close();
     */
-    
+
 
     P->SAiMarkNbit=P->GstrandBit+1;
     P->SAiMarkAbsentBit=P->GstrandBit+2;
-    
+
     P->SAiMarkNmaskC=1LLU << P->SAiMarkNbit;
     P->SAiMarkNmask=~P->SAiMarkNmaskC;
     P->SAiMarkAbsentMaskC=1LLU << P->SAiMarkAbsentBit;
     P->SAiMarkAbsentMask=~P->SAiMarkAbsentMaskC;
 
-   
+
     SAi.defineBits(P->GstrandBit+3,P->nSAi);
-    SAi.allocateArray();   
-    
+    SAi.allocateArray();
+
     time_t rawTime;
-    time(&rawTime);    
-    P->inOut->logMain    << timeMonthDayTime(rawTime) <<" ... Generating Suffix Array index\n" <<flush;   
-    *P->inOut->logStdOut << timeMonthDayTime(rawTime) <<" ... Generating Suffix Array index\n" <<flush; 
-    
+    time(&rawTime);
+    P->inOut->logMain    << timeMonthDayTime(rawTime) <<" ... generating Suffix Array index\n" <<flush;
+    *P->inOut->logStdOut << timeMonthDayTime(rawTime) <<" ... generating Suffix Array index\n" <<flush;
+
     /*testing
     PackedArray SA1=SA;
     uint* ind0=new uint[P->genomeSAindexNbases];
 
     for (uint ii=0; ii<P->genomeSAindexNbases; ii++) {
         ind0[ii]=-1;//this is needed in case "AAA...AAA",i.e. indPref=0 is not present in the genome for some lengths
-    };    
+    };
     uint* SAi1=new uint[P->nSAi];
-    
+
     for (uint isa=0; isa<P->nSA; isa++) {//for all suffixes
         if (isa%100000000==0) P->inOut->logMain  << isa*100/P->nSA << "% " << flush;
 
@@ -90,14 +90,14 @@ void genomeSAindex(char * G, PackedArray & SA, Parameters * P, PackedArray & SAi
             };
         };
     };//for (uint isa=0; isa<P->nSA; isa++)
-    */    
-    
-    genomeSAindexChunk(G, SA, P, SAi, 0, SA.length-1);    
-    
-    time(&rawTime);    
-    P->inOut->logMain    << timeMonthDayTime(rawTime) <<" ... Completed Suffix Array index\n" <<flush;   
-    *P->inOut->logStdOut << timeMonthDayTime(rawTime) <<" ... Completed Suffix Array index\n" <<flush; 
-      
+    */
+
+    genomeSAindexChunk(G, SA, P, SAi, 0, SA.length-1);
+
+    time(&rawTime);
+    P->inOut->logMain    << timeMonthDayTime(rawTime) <<" ... completed Suffix Array index\n" <<flush;
+    *P->inOut->logStdOut << timeMonthDayTime(rawTime) <<" ... completed Suffix Array index\n" <<flush;
+
 //     for (uint ii=1;ii<=P->genomeSAindexNbases-1;ii++) {//L-mer indices starts
 //         cout <<ii<<endl;
 //         for (uint jj=P->genomeSAindexStart[ii-1]; jj<P->genomeSAindexStart[ii]; jj++)
@@ -110,10 +110,10 @@ void genomeSAindex(char * G, PackedArray & SA, Parameters * P, PackedArray & SAi
 //         };
 //     };
 
-    
+
  };
- 
- 
+
+
 void genomeSAindexChunk(char * G, PackedArray & SA, Parameters * P, PackedArray & SAi, uint iSA1, uint iSA2)
 {
     uint* ind0=new uint[P->genomeSAindexNbases];
@@ -122,15 +122,15 @@ void genomeSAindexChunk(char * G, PackedArray & SA, Parameters * P, PackedArray
     for (uint ii=0; ii<P->genomeSAindexNbases; ii++) {
         ind0[ii]=-1;//this is needed in case "AAA...AAA",i.e. indPref=0 is not present in the genome for some lengths
         ind0a[ii]=-1;//this is needed in case "AAA...AAA",i.e. indPref=0 is not present in the genome for some lengths
-    };   
-    
+    };
+
     PackedArray SAi1;
     SAi1=SAi;
     SAi1.allocateArray();
-    
+
     uint isaStep=P->nSA/(1llu<<(2*P->genomeSAindexNbases))+1;
 //     isaStep=8;
-    
+
     uint isa=iSA1;
     int iL4;
     uint indFull=funCalcSAiFromSA(G,SA,isa,P->genomeSAindexNbases,P,iL4);
@@ -143,7 +143,7 @@ void genomeSAindexChunk(char * G, PackedArray & SA, Parameters * P, PackedArray
         if (!dirG) SAstr=P->nGenome-1-SAstr;
         uint indPref1=0;
         */
-        
+
         for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {//calculate index
             /*{//testing: old way
                 indPref1 <<= 2;
@@ -163,7 +163,7 @@ void genomeSAindexChunk(char * G, PackedArray & SA, Parameters * P, PackedArray
                     if ( indPref1 > ind0a[iL] || isa==0 ) {//new && good index, record it
                         SAi1.writePacked(P->genomeSAindexStart[iL]+indPref1, isa);
                         for (uint ii=ind0a[iL]+1; ii<indPref1; ii++) {//index is not present, record to the last present suffix
-                            SAi1.writePacked(P->genomeSAindexStart[iL]+ii, isa | P->SAiMarkAbsentMaskC); 
+                            SAi1.writePacked(P->genomeSAindexStart[iL]+ii, isa | P->SAiMarkAbsentMaskC);
                         };
                         ind0a[iL]=indPref1;
                     } else if ( indPref1 < ind0a[iL] ) {
@@ -174,18 +174,18 @@ void genomeSAindexChunk(char * G, PackedArray & SA, Parameters * P, PackedArray
                 };
             };
             */
-            
+
             uint indPref = indFull >> (2*(P->genomeSAindexNbases-1-iL));
 //             if (indPref!=indPref1)
 //                 cout<< iL <<" "<< isa <<" "<< indPref <<" "<<indPref1<<endl;
-            
+
 
             if ( (int)iL==iL4 ) {//this suffix contains N and does not belong in SAi
                 for (uint iL1=iL; iL1 < P->genomeSAindexNbases; iL1++) {
                     SAi.writePacked(P->genomeSAindexStart[iL1]+ind0[iL1],SAi[P->genomeSAindexStart[iL1]+ind0[iL1]] | P->SAiMarkNmaskC);
 //                     if (SAi[P->genomeSAindexStart[iL]+ind0[iL1]] != SAi1[P->genomeSAindexStart[iL]+ind0[iL1]])
 //                         cout<< iL <<" "<< isa <<" "<< indPref <<" "<<indPref1<<endl;
-                    
+
                 };
                 break;//break the iL cycle
             };
@@ -194,13 +194,13 @@ void genomeSAindexChunk(char * G, PackedArray & SA, Parameters * P, PackedArray
                 //testing
 //                 if (funCalcSAiFromSA(G,SA,isa,iL+1,P)!=indPref)
 //                     cout<< iL <<" "<< isa <<" "<< indPref <<" "<<funCalcSAiFromSA(G,SA,isa,iL+1,P)<<endl;
-                        
+
                 SAi.writePacked(P->genomeSAindexStart[iL]+indPref, isa);
 //                 if (SAi[P->genomeSAindexStart[iL]+indPref] != SAi1[P->genomeSAindexStart[iL]+indPref])
 //                     cout<< iL <<" "<< isa <<" "<< indPref <<" "<<indPref1<<endl;
-                
+
                 for (uint ii=ind0[iL]+1; ii<indPref; ii++) {//index is not present, record to the last present suffix
-                    SAi.writePacked(P->genomeSAindexStart[iL]+ii, isa | P->SAiMarkAbsentMaskC); 
+                    SAi.writePacked(P->genomeSAindexStart[iL]+ii, isa | P->SAiMarkAbsentMaskC);
                 };
                 ind0[iL]=indPref;
 
@@ -209,10 +209,10 @@ void genomeSAindexChunk(char * G, PackedArray & SA, Parameters * P, PackedArray
                 errOut << "BUG: next index is smaller than previous, EXITING\n" <<flush;
                 exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
             };
-            
-            
+
+
         };
-        
+
         //find next index not equal to the current one
         funSAiFindNextIndex(P, G, SA, isaStep, isa, indFull, iL4);//indFull and iL4 have been already defined at the previous step
 //         isa++;
@@ -221,7 +221,7 @@ void genomeSAindexChunk(char * G, PackedArray & SA, Parameters * P, PackedArray
     delete [] ind0;
 
  };
- 
+
 void funSAiFindNextIndex(Parameters * P, char * G, PackedArray & SA, uint isaStep, uint & isa, uint & indFull, int & iL4)
  {
     uint indFullPrev=indFull;
@@ -257,8 +257,8 @@ void funSAiFindNextIndex(Parameters * P, char * G, PackedArray & SA, uint isaSte
         };
         if (isa==i1)
         {
-            isa=i2;                    
+            isa=i2;
             indFull=funCalcSAiFromSA(G,SA,isa,P->genomeSAindexNbases,P,iL4);
         };
     };
-};
\ No newline at end of file
+};
diff --git a/source/genomeScanFastaFiles.cpp b/source/genomeScanFastaFiles.cpp
index 94f0fd8..2f0911e 100644
--- a/source/genomeScanFastaFiles.cpp
+++ b/source/genomeScanFastaFiles.cpp
@@ -5,35 +5,35 @@
 uint genomeScanFastaFiles (Parameters *P, char* G, bool flagRun) {//scans fasta files. flagRun=false: check and find full size, flaRun=true: collect all the data
 
     uint N=0;//total number of bases in the genome, including chr "spacers"
-    if (!flagRun && P->chrLength.size()>0) 
+    if (!flagRun && P->chrLength.size()>0)
     {//previous chr records exist
        P->chrStart.pop_back();//remove last record
-       N =  P->chrStart.back()+P->chrLength.back(); 
+       N =  P->chrStart.back()+P->chrLength.back();
     };
 
     ifstream fileIn;
     for (uint ii=0;ii<P->genomeFastaFiles.size();ii++) {//all the input files
         fileIn.open(P->genomeFastaFiles.at(ii).c_str());
-        if ( !fileIn.good() ) 
+        if ( !fileIn.good() )
         {//
             ostringstream errOut;
             errOut << "EXITING because of INPUT ERROR: could not open genomeFastaFile: " <<P->genomeFastaFiles.at(ii) <<"\n";
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);            
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         };
         char cc=fileIn.peek();
-        if ( !fileIn.good() ) 
+        if ( !fileIn.good() )
         {//
             ostringstream errOut;
             errOut << "EXITING because of INPUT ERROR: could not read from genomeFastaFile: " <<P->genomeFastaFiles.at(ii) <<"\n";
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);            
-        };      
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
+        };
         if (cc!='>')
         {
             ostringstream errOut;
             errOut << "EXITING because of INPUT ERROR: the file format of the genomeFastaFile: " <<P->genomeFastaFiles.at(ii) << "is not fasta:";
             errOut << " the first character is " <<cc<<" , not > .\n";
             errOut << " Solution: check formatting of the fasta file. Make sure the file is uncompressed (unzipped).\n";
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);            
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         };         while(!fileIn.eof()) {//read each file until eof
             string lineIn (4096,'.');
             getline(fileIn,lineIn);
@@ -45,15 +45,15 @@ uint genomeScanFastaFiles (Parameters *P, char* G, bool flagRun) {//scans fasta
                     lineInStream >> chrName1;
                     P->chrName.push_back(chrName1);
                 };
-                
-                if (!flagRun && P->chrStart.size()>0) P->chrLength.push_back(N-P->chrStart.at(P->chrStart.size()-1)); //true length of the chr  
-                
+
+                if (!flagRun && P->chrStart.size()>0) P->chrLength.push_back(N-P->chrStart.at(P->chrStart.size()-1)); //true length of the chr
+
                 if (N>0) {//pad the chromosomes to bins boudnaries
                     N = ( (N+1)/P->genomeChrBinNbases+1 )*P->genomeChrBinNbases;
                 };
 
                 if (!flagRun) {
-                    P->chrStart.push_back(N);    
+                    P->chrStart.push_back(N);
                     P->inOut->logMain << P->genomeFastaFiles.at(ii)<<" : chr # " << P->chrStart.size()-1 << "  \""<<P->chrName.at(P->chrStart.size()-1)<<"\" chrStart: "<<N<<"\n"<<flush;
                 };
             } else {//char lines
@@ -61,40 +61,40 @@ uint genomeScanFastaFiles (Parameters *P, char* G, bool flagRun) {//scans fasta
                 N += lineIn.size();
             };
         };
-        fileIn.close();        
+        fileIn.close();
     };
-    
-   
-    if (!flagRun) P->chrLength.push_back(N-P->chrStart.at(P->chrStart.size()-1)); //true length of the chr  
+
+
+    if (!flagRun) P->chrLength.push_back(N-P->chrStart.at(P->chrStart.size()-1)); //true length of the chr
 
     N = ( (N+1)/P->genomeChrBinNbases+1)*P->genomeChrBinNbases;
-        
-    if (!flagRun) 
-    { 
+
+    if (!flagRun)
+    {
         P->nChrReal=P->chrStart.size();
         P->chrStart.push_back(N); //last chromosome end+1
         for (uint ii=0;ii<P->nChrReal;ii++) {
             P->chrNameIndex[P->chrName[ii]]=ii;
         };
-    } else    
+    } else
     {//convert the genome to 0,1,2,3,4
         for (uint jj=0;jj<N;jj++) {
             switch (int(G[jj])){
                 case(65): case(97):  G[jj]=char(0);break;//A
-                case(67): case(99):  G[jj]=char(1);break;//C           
-                case(71): case(103): G[jj]=char(2);break;//G                       
-                case(84): case(116): G[jj]=char(3);break;//T                                
+                case(67): case(99):  G[jj]=char(1);break;//C
+                case(71): case(103): G[jj]=char(2);break;//G
+                case(84): case(116): G[jj]=char(3);break;//T
                 case(78): case(110): G[jj]=char(4);break;//N
                 case(48):            G[jj]=GENOME_spacingChar;break;//chromosomal breaks within the sequences
                 default:              //anything else
                     if (G[jj]!=GENOME_spacingChar) {
                          //P->inOut->logMain << "Unexpected character: char="<< G[jj] << "   int="<<int(G[jj])<<"   at " << jj << " , replacing with N\n";
-                         G[jj]=char(4);                                 
+                         G[jj]=char(4);
                     };
             };
-        }; 
+        };
     };
-    
+
     return N;
-};        
+};
 
diff --git a/source/insertSeqSA.cpp b/source/insertSeqSA.cpp
index e8732d4..5b0508a 100644
--- a/source/insertSeqSA.cpp
+++ b/source/insertSeqSA.cpp
@@ -1,5 +1,5 @@
-/* 
- * inserts sequences into the SA 
+/*
+ * inserts sequences into the SA
  * returns number of SA indexes inserted
  */
 #include "insertSeqSA.h"
@@ -10,28 +10,30 @@
 #include "streamFuns.h"
 #include "binarySearch2.h"
 #include "funCompareUintAndSuffixes.h"
+#include "funCompareUintAndSuffixesMemcmp.h"
 #include <cmath>
-#include "genomeSAindex.h" 
+#include "genomeSAindex.h"
+#include "sortSuffixesBucket.h"
 
 uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char * G, char * G1, uint64 nG, uint64 nG1, uint64 nG2, Parameters * P)
 {//insert new sequences into the SA
-    
+
     uint GstrandBit1 = (uint) floor(log(nG+nG1)/log(2))+1;
     if (GstrandBit1<32) GstrandBit1=32; //TODO: use simple access function for SA
-    if ( GstrandBit1+1 != SA.wordLength) 
+    if ( GstrandBit1+1 != SA.wordLength)
     {//sequence is too long - GstrandBit changed
         ostringstream errOut;
         errOut << "EXITING because of FATAL ERROR: cannot insert sequence on the fly because of strand GstrandBit problem\n";
         errOut << "SOLUTION: please contact STAR author at https://groups.google.com/forum/#!forum/rna-star\n";
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_FILES, *P);
     };
-    
+
     uint N2bit= 1LLU << (SA.wordLength-1);
-    uint strandMask=~N2bit;    
+    uint strandMask=~N2bit;
     for (uint64 isa=0;isa<SA.length; isa++)
     {
         uint64 ind1=SA[isa];
-        if ( (ind1 & N2bit)>0 ) 
+        if ( (ind1 & N2bit)>0 )
         {//- strand
             if ( (ind1 & strandMask)>=nG2 )
             {//the first nG bases
@@ -47,24 +49,24 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
             };
         };
     };
-    
+
     char** seq1=new char*[2];
-    
-    #define GENOME_endFillL 16    
+
+    #define GENOME_endFillL 16
     char* seqq=new char [4*nG1+3*GENOME_endFillL];//ends shouldbe filled with 5 to mark boundaries
-            
+
     seq1[0]=seqq+GENOME_endFillL;//TODO: avoid defining an extra array, use reverse search
     seq1[1]=seqq+2*GENOME_endFillL+2*nG1;
-    
+
     memset(seqq,GENOME_spacingChar,GENOME_endFillL);
     memset(seqq+2*nG1+GENOME_endFillL,GENOME_spacingChar,GENOME_endFillL);
     memset(seqq+4*nG1+2*GENOME_endFillL,GENOME_spacingChar,GENOME_endFillL);
-    
+
     memcpy(seq1[0], G1, nG1);
-    for (uint ii=0; ii<nG1; ii++) 
+    for (uint ii=0; ii<nG1; ii++)
     {//reverse complement sequence
         seq1[0][2*nG1-1-ii]=seq1[0][ii]<4 ? 3-seq1[0][ii] : seq1[0][ii];
-    };    
+    };
     complementSeqNumbers(seq1[0], seq1[1], 2*nG1);//complement
 
     uint64* indArray=new uint64[nG1*2*2+2];// for each base, 1st number - insertion place in SA, 2nd number - index, *2 for reverse compl
@@ -83,7 +85,7 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
             indArray[ii*2+1] = ii;
         };
     };
-    
+
     uint64 nInd=0;//true number of new indices
     for (uint ii=0; ii<2*nG1; ii++) {//remove entries that cannot be inserted, this cannot be done in the parallel cycle above
         if (indArray[ii*2]!= (uint) -1) {
@@ -92,13 +94,50 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
             ++nInd;
         };
     };
-    
+
     time_t rawtime;
     time ( &rawtime );
     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished SA search, number of new SA indices = "<<nInd<<endl;
 
-    globalGenomeArray=seq1[0];
-    qsort((void*) indArray, nInd, 2*sizeof(uint64), funCompareUintAndSuffixes);
+    /*//old-debug
+    uint64* indArray1=new uint64[nG1*2*2+2];
+    memcpy((void*) indArray1, (void*) indArray, 8*(nG1*2*2+2));
+    g_funCompareUintAndSuffixes_G=seq1[0];
+    qsort((void*) indArray1, nInd, 2*sizeof(uint64), funCompareUintAndSuffixes);
+    time ( &rawtime );
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished qsort - old " <<endl;
+    */
+    
+    g_funCompareUintAndSuffixesMemcmp_G=seq1[0];
+    g_funCompareUintAndSuffixesMemcmp_L=P->genomeSuffixLengthMax/sizeof(uint64_t);
+    qsort((void*) indArray, nInd, 2*sizeof(uint64_t), funCompareUintAndSuffixesMemcmp);  
+    
+//     qsort((void*) indArray, nInd, 2*sizeof(uint64), funCompareUint2);
+    time ( &rawtime );
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished qsort" <<endl;
+
+
+    
+    /*//new sorting, 2-step: qsort for indArray, bucket sort for suffixes
+    qsort((void*) indArray, nInd, 2*sizeof(uint64), funCompareUint2);
+    time ( &rawtime );
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished qsort"<<nInd<<endl;
+    
+    sortSuffixesBucket(seq1[0], (void*) indArray, nInd, 2*sizeof(uint64));
+    time ( &rawtime );
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished ordering suffixes"<<nInd<<endl;
+    */
+    
+    /* //debug 
+    for (int ii=0;ii<2*nInd;ii++)
+    {
+        if (indArray[ii]!=indArray1[ii]) 
+        {
+            cout << ii <<"   "<< indArray[ii]  <<"   "<< indArray1[ii] <<endl;
+        };
+    };
+    */
+    
     time ( &rawtime );
     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished sorting SA indices"<<endl;
 
@@ -106,7 +145,7 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
     indArray[2*nInd+1]=-999; //mark the last junction
 
     SA1.defineBits(SA.wordLength,SA.length+nInd);
-    
+
     /*testing
     PackedArray SAo;
     SAo.defineBits(P->GstrandBit+1,P->nSA+nInd);
@@ -115,7 +154,7 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
     oldSAin.read(SAo.charArray,SAo.lengthByte);
     oldSAin.close();
     */
-    
+
     uint isa1=0, isa2=0;
     for (uint isa=0;isa<SA.length;isa++) {
         while (isa==indArray[isa1*2]) {//insert new index before the existing index
@@ -131,10 +170,10 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
                cout <<isa2 <<" "<< SA1[isa2]<<" "<<SAo[isa2]<<endl;
                //sleep(100);
             };
-            */              
+            */
             ++isa2; ++isa1;
-               
-        };        
+
+        };
 
         SA1.writePacked(isa2,SA[isa]); //TODO make sure that the first sj index is not before the first array index
             /*testing
@@ -142,7 +181,7 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
                cout <<isa2 <<" "<< SA1[isa2]<<" "<<SAo[isa2]<<endl;
                //sleep(100);
             };
-            */           
+            */
         ++isa2;
     };
     for (;isa1<nInd;isa1++)
@@ -151,17 +190,17 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
         if (ind1<nG1)
         {
             ind1+=nG;
-        } else 
+        } else
         {//reverse strand
             ind1=(ind1-nG1+nG2) | N2bit;
         };
         SA1.writePacked(isa2,ind1);
         ++isa2;
     };
-        
+
     time ( &rawtime );
-    P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished inserting SA indices" <<endl;   
-    
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished inserting SA indices" <<endl;
+
 //     //SAi insertions
 //     for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {
 //         uint iSeq=0;
@@ -169,11 +208,11 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
 //         for (uint ii=P->genomeSAindexStart[iL];ii<P->genomeSAindexStart[iL+1]; ii++) {//scan through the longest index
 //             if (ii==798466)
 //                 cout <<ii;
-//             
+//
 //             uint iSA1=SAi[ii];
 //             uint iSA2=iSA1 & P->SAiMarkNmask & P->SAiMarkAbsentMask;
-//             
-//             if ( iSeq<nInd && (iSA1 &  P->SAiMarkAbsentMaskC)>0 ) 
+//
+//             if ( iSeq<nInd && (iSA1 &  P->SAiMarkAbsentMaskC)>0 )
 //             {//index missing from the old genome
 //                 uint iSeq1=iSeq;
 //                 int64 ind1=funCalcSAi(seq1[0]+indArray[2*iSeq+1],iL);
@@ -191,31 +230,31 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
 //                 } else {
 //                     iSeq=iSeq1;
 //                 };
-//             } else 
+//             } else
 //             {//index was present in the old genome
 //                 while (iSeq<nInd && indArray[2*iSeq]+1<iSA2) {//for this index insert "smaller" junctions
 //                     ++iSeq;
 //                 };
-//                 
+//
 //                 while (iSeq<nInd && indArray[2*iSeq]+1==iSA2) {//special case, the index falls right behind SAi
 //                     if (funCalcSAi(seq1[0]+indArray[2*iSeq+1],iL) >= (int64) (ii-P->genomeSAindexStart[iL]) ) {//this belongs to the next index
 //                         break;
 //                     };
 //                     ++iSeq;
-//                 };   
-//                 
+//                 };
+//
 //                 SAi.writePacked(ii,iSA1+iSeq);
-//                 
+//
 //                 for (uint ii0=ind0+1; ii0<ii; ii0++) {//fill all the absent indices with this value
 //                     SAi.writePacked(ii0,(iSA2+iSeq) | P->SAiMarkAbsentMaskC);
 //                 };
 //                 ind0=ii;
 //             };
 //         };
-// 
+//
 //     };
 // //     time ( &rawtime );    cout << timeMonthDayTime(rawtime) << "SAi first" <<endl;
-// 
+//
 //     for (uint isj=0;isj<nInd;isj++) {
 //         int64 ind1=0;
 //         for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {
@@ -241,40 +280,40 @@ uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char *
 //     };
 //     time ( &rawtime );
 //     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished SAi" <<endl;
-// 
+//
 //     /* testing
 //     PackedArray SAio=SAi;
 //     SAio.allocateArray();
 //     ifstream oldSAiin("./DirTrue/SAindex");
 //     oldSAiin.read(SAio.charArray,8*(P->genomeSAindexNbases+2));//skip first bytes
 //     oldSAiin.read(SAio.charArray,SAio.lengthByte);
-//     oldSAiin.close();  
-// 
+//     oldSAiin.close();
+//
 //     for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {
 //         for (uint ii=P->genomeSAindexStart[iL];ii<P->genomeSAindexStart[iL+1]; ii++) {//scan through the longets index
 //                 if ( SAio[ii]!=SAi[ii] ) {
 //                     cout <<iL<<" "<<ii<<" "<<SAio[ii]<<" "<<SAi[ii]<<endl;
 //                 };
 //         };
-//     };    
-//     */    
-    
+//     };
+//     */
+
     //change parameters, most parameters are already re-defined in sjdbPrepare.cpp
     SA.defineBits(P->GstrandBit+1,SA.length+nInd);//same as SA2
     SA.pointArray(SA1.charArray);
     P->nSA=SA.length;
     P->nSAbyte=SA.lengthByte;
-    
+
     //generate SAi
     genomeSAindex(G,SA,P,SAi);
-    
+
     time ( &rawtime );
     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished SAi" <<endl;
 
-    
+
 //     P->sjGstart=P->chrStart[P->nChrReal];
 //     memcpy(G+P->chrStart[P->nChrReal],seq1[0], nseq1[0]);
-    
-    
+
+
     return nInd;
 };
diff --git a/source/loadGTF.cpp b/source/loadGTF.cpp
index 5428205..76c236a 100644
--- a/source/loadGTF.cpp
+++ b/source/loadGTF.cpp
@@ -34,37 +34,37 @@
 
 uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file, add junctions to P->sjdb
     //returns number of added junctions
-    if (P->sjdbOverhang>0 && P->sjdbGTFfile!="-") {       
+    if (P->sjdbOverhang>0 && P->sjdbGTFfile!="-") {
         time_t rawTime;
         time(&rawTime);
-        P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ..... Processing annotations GTF\n" <<flush;
-        *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ..... Processing annotations GTF\n" <<flush;           
-        
-        ifstream sjdbStreamIn ( P->sjdbGTFfile.c_str() );   
+        P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ..... processing annotations GTF\n" <<flush;
+        *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ..... processing annotations GTF\n" <<flush;
+
+        ifstream sjdbStreamIn ( P->sjdbGTFfile.c_str() );
         if (sjdbStreamIn.fail()) {
             ostringstream errOut;
             errOut << "FATAL error, could not open file sjdbGTFfile=" << P->sjdbGTFfile <<"\n";
             exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
-        };    
-        
-        if (P->chrNameIndex.size()==0) 
+        };
+
+        if (P->chrNameIndex.size()==0)
         {
             for (uint ii=0;ii<P->nChrReal;ii++) {
                 P->chrNameIndex[P->chrName[ii]]=ii;
-            };        
+            };
         };
         std::map <string,uint> transcriptIDnumber, geneIDnumber;
 
         uint exonN=0;
         while (sjdbStreamIn.good()) {//count the number of exons
-            string chr1,ddd2,featureType;            
+            string chr1,ddd2,featureType;
             sjdbStreamIn >> chr1 >> ddd2 >> featureType;
             if (chr1.substr(0,1)!="#" && featureType==P->sjdbGTFfeatureExon) {
                 exonN++;
             };
             sjdbStreamIn.ignore(1000000000,'\n'); //ignore the rest of the line
         };
-        
+
         if (exonN==0)
         {
             ostringstream errOut;
@@ -74,7 +74,7 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
             errOut << "          If exons are marked with a different word, use --sjdbGTFfeatureExon .\n";
             exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         };
-        
+
         uint* exonLoci=new uint [exonN*GTF_exonLoci_size];
         char* transcriptStrand = new char [exonN];
         vector <string> transcriptID, geneID;
@@ -87,18 +87,18 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
             string oneLine,chr1,ddd2,featureType;
             getline(sjdbStreamIn,oneLine);
             istringstream oneLineStream (oneLine);
-            
+
             oneLineStream >> chr1 >> ddd2 >> featureType;
             if (chr1.substr(0,1)!="#" && featureType==P->sjdbGTFfeatureExon) {//exonic line, process
-                
+
                 if (P->sjdbGTFchrPrefix!="-") chr1=P->sjdbGTFchrPrefix + chr1;
-                
+
                 if (P->chrNameIndex.count(chr1)==0) {//chr not in Genome
                     P->inOut->logMain << "WARNING: while processing sjdbGTFfile=" << P->sjdbGTFfile <<": chromosome '"<<chr1<<"' not found in Genome fasta files for line:\n";
-                    P->inOut->logMain << oneLine <<"\n"<<flush;          
+                    P->inOut->logMain << oneLine <<"\n"<<flush;
                     continue; //do not process exons/transcripts on missing chromosomes
                 };
-                
+
                 uint ex1,ex2;
                 char str1;
                 oneLineStream >> ex1 >> ex2 >> ddd2 >> str1 >> ddd2; //read all fields except the last
@@ -137,7 +137,7 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
                        transcriptStrand[transcriptIDnumber[trID]]=0;
                     };
                 };
-                
+
                 if (gID=="") {//no gene ID
                     P->inOut->logMain << "WARNING: while processing sjdbGTFfile=" << P->sjdbGTFfile <<": no gene_id for line:\n";
                     P->inOut->logMain << oneLine <<"\n"<<flush;
@@ -150,18 +150,18 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
                 exonLoci[GTF_exonStart(exonN)]=ex1+P->chrStart[P->chrNameIndex[chr1]]-1;
                 exonLoci[GTF_exonEnd(exonN)]=ex2+P->chrStart[P->chrNameIndex[chr1]]-1;
                 exonLoci[GTF_exonGeID(exonN)]=geneIDnumber[gID];
-                ++exonN;                
+                ++exonN;
 
             };//if (chr1.substr(0,1)!="#" && featureType=="exon")
         };//
-        
+
         if (exonN==0)
         {
             ostringstream errOut;
             errOut << "Fatal INPUT FILE error, no valid ""exon"" lines in the GTF file: " << P->sjdbGTFfile <<"\n";
             errOut << "Solution: check the formatting of the GTF file. Most likely cause is the difference in chromosome naming between GTF and FASTA file.\n";
             exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
-        };        
+        };
         //sort exonLoci by transcript ID and exon coordinates
         qsort((void*) exonLoci, exonN, sizeof(uint)*GTF_exonLoci_size, funCompareUint2);
 
@@ -195,11 +195,11 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
             geOut.close();
 
         };
-        
+
         {//exon-transcript data structures
             //re-sort transcripts by transcript start/end
             uint* extrLoci=new uint [exonN*GTF_extrLoci_size]; //this also contains transcripts start and end
-            
+
             uint trex1=0;
             for (uint iex=0; iex<=exonN; iex++) {
                 if (iex==exonN || exonLoci[GTF_exonTrID(iex)] != exonLoci[GTF_exonTrID(trex1)]) {
@@ -214,14 +214,14 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
                 extrLoci[GTF_extrExStart(iex)]=exonLoci[GTF_exonStart(iex)];
                 extrLoci[GTF_extrExEnd(iex)]=exonLoci[GTF_exonEnd(iex)];
             };
-            
+
             qsort((void*) extrLoci, exonN, sizeof(uint)*GTF_extrLoci_size, funCompareArrays<uint,5>);
-            
+
             ofstream trOut ((dirOut+"/transcriptInfo.tab").c_str());
             trOut<<transcriptID.size() << "\n";
             ofstream exOut ((dirOut+"/exonInfo.tab").c_str());
             exOut<<exonN<<"\n";
-            
+
             uint trid=extrLoci[GTF_extrTrID(0)];
             uint trex=0;
             uint trstart=extrLoci[GTF_extrTrStart(0)];
@@ -242,11 +242,11 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
                 exOut << extrLoci[GTF_extrExStart(iex)]-trstart <<"\t"<< extrLoci[GTF_extrExEnd(iex)]-trstart <<"\t"<< exlen <<"\n";
                 exlen+=extrLoci[GTF_extrExEnd(iex)]-extrLoci[GTF_extrExStart(iex)]+1;
             };
-            trOut.close();            
-            exOut.close();            
-            
+            trOut.close();
+            exOut.close();
+
         };
-        
+
         //make junctions
         uint* sjLoci = new uint [exonN*3];
         uint trIDn=exonLoci[0];
@@ -257,7 +257,7 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
                 if ( exonLoci[GTF_exonStart(exI)]<=exonLoci[GTF_exonEnd(exI-1)]+1 ) {
                     P->inOut->logMain << "WARNING: while processing sjdbGTFfile=" << P->sjdbGTFfile <<": overlapping or touching exons:\n";
                     P->inOut->logMain << P->chrName[chr1] <<"\t"<< exonLoci[GTF_exonStart(exI-1)]+1-P->chrStart[chr1] << "\t"<< exonLoci[GTF_exonEnd(exI-1)]+1-P->chrStart[chr1]  <<"\n";
-                    P->inOut->logMain << P->chrName[chr1] <<"\t"<< exonLoci[GTF_exonStart(exI)]+1-P->chrStart[chr1] << "\t"<< exonLoci[GTF_exonEnd(exI)]+1-P->chrStart[chr1]  <<"\n";                    
+                    P->inOut->logMain << P->chrName[chr1] <<"\t"<< exonLoci[GTF_exonStart(exI)]+1-P->chrStart[chr1] << "\t"<< exonLoci[GTF_exonEnd(exI)]+1-P->chrStart[chr1]  <<"\n";
                 } else {
                     sjLoci[sjN*3]=exonLoci[GTF_exonEnd(exI-1)]+1;
                     sjLoci[sjN*3+1]=exonLoci[GTF_exonStart(exI)]-1;
@@ -268,10 +268,10 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
                 trIDn=exonLoci[GTF_exonTrID(exI)];
             };
         };
-        
+
         qsort((void*) sjLoci, sjN, sizeof(uint)*3, funCompareUint2);
-        
-        char strandChar[3]={'.','+','-'};                
+
+        char strandChar[3]={'.','+','-'};
         uint sjdbN1=sjdbLoci.chr.size();
         for (uint ii=0;ii<sjN;ii++) {
             if ( ii==0 || (sjLoci[ii*3]!=sjLoci[(ii-1)*3]) || (sjLoci[ii*3+1]!=sjLoci[(ii-1)*3+1]) || (sjLoci[ii*3+2]!=sjLoci[(ii-1)*3+2]) ) {
@@ -282,20 +282,20 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
                 sjdbLoci.str.push_back(strandChar[sjLoci[ii*3+2]]);
             };
         };
-        
+
         ofstream sjdbList ((dirOut+"/sjdbList.fromGTF.out.tab").c_str());
         for (uint ii=sjdbN1;ii<sjdbLoci.chr.size(); ii++) {
             sjdbList << sjdbLoci.chr.at(ii)<<"\t"<< sjdbLoci.start.at(ii) << "\t"<< sjdbLoci.end.at(ii)  <<"\t"<< sjdbLoci.str.at(ii)<<"\n";
         };
         sjdbList.close();
-        
+
         P->inOut->logMain << "Processing sjdbGTFfile=" << P->sjdbGTFfile <<", found:\n";
         P->inOut->logMain << "\t\t"  << transcriptIDnumber.size() <<" transcripts\n" << "\t\t"  << exonN << " exons (non-collapsed)\n" << "\t\t"  << sjdbLoci.chr.size()-sjdbN1 << " collapsed junctions\n";
         time(&rawTime);
-        P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ..... Finished GTF processing\n" <<flush;
-//         *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ..... Finished GTF processing\n" <<flush;           
-        
-        
+        P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ..... finished GTF processing\n" <<flush;
+//         *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ..... finished GTF processing\n" <<flush;
+
+
         return sjdbLoci.chr.size()-sjdbN1;
     } else {
         return 0;
diff --git a/source/mapThreadsSpawn.cpp b/source/mapThreadsSpawn.cpp
index 833ffb5..4283b2e 100644
--- a/source/mapThreadsSpawn.cpp
+++ b/source/mapThreadsSpawn.cpp
@@ -15,9 +15,9 @@ void mapThreadsSpawn (Parameters *P, ReadAlignChunk** RAchunk) {
         P->inOut->logMain << "Created thread # " <<ithread <<"\n"<<flush;
         pthread_mutex_unlock(&g_threadChunks.mutexLogMain);
     };
-    
+
     RAchunk[0]->processChunks(); //start main thread
-    
+
     for (int ithread=1;ithread<P->runThreadN;ithread++) {//wait for all threads to complete
         int threadStatus = pthread_join(g_threadChunks.threadArray[ithread], NULL);
         if (threadStatus>0) {//something went wrong with one of threads
@@ -26,8 +26,8 @@ void mapThreadsSpawn (Parameters *P, ReadAlignChunk** RAchunk) {
                 exitWithError(errOut.str(),std::cerr, P->inOut->logMain, 1, *P);
         };
         pthread_mutex_lock(&g_threadChunks.mutexLogMain);
-        P->inOut->logMain << "Joined thread # " <<ithread <<"\n"<<flush;        
+        P->inOut->logMain << "Joined thread # " <<ithread <<"\n"<<flush;
         pthread_mutex_unlock(&g_threadChunks.mutexLogMain);
     };
 };
-    
\ No newline at end of file
+
diff --git a/source/outputSJ.cpp b/source/outputSJ.cpp
index 9c38018..4c41e79 100644
--- a/source/outputSJ.cpp
+++ b/source/outputSJ.cpp
@@ -7,7 +7,7 @@
 int compareUint(const void* i1, const void* i2) {//compare uint arrays
     uint s1=*( (uint*)i1 );
     uint s2=*( (uint*)i2 );
-    
+
     if (s1>s2) {
         return 1;
     } else if (s1<s2) {
@@ -18,15 +18,15 @@ int compareUint(const void* i1, const void* i2) {//compare uint arrays
 };
 
 void outputSJ(ReadAlignChunk** RAchunk, Parameters* P) {//collapses junctions from all therads/chunks; outputs junctions to file
-    
+
 //     system("echo `date` ..... Writing splice junctions >> Log.timing.out");
 
-    
+
     Junction oneSJ;
     char** sjChunks = new char* [P->runThreadN+1];
     #define OUTSJ_limitScale 5
     OutSJ allSJ (P->limitOutSJcollapsed*OUTSJ_limitScale,P);
-    
+
     if (P->outFilterBySJoutStage!=1) {//chunkOutSJ
         for (int ic=0;ic<P->runThreadN;ic++) {//populate sjChunks with links to data
             sjChunks[ic]=RAchunk[ic]->chunkOutSJ->data;
@@ -38,7 +38,7 @@ void outputSJ(ReadAlignChunk** RAchunk, Parameters* P) {//collapses junctions fr
             memset(sjChunks[ic]+RAchunk[ic]->chunkOutSJ1->N*oneSJ.dataSize,255,oneSJ.dataSize);//mark the junction after last with big number
         };
     };
-    
+
     while (true) {
         int icOut=-1;//chunk from which the junction is output
         for (int ic=0;ic<P->runThreadN;ic++) {//scan through all chunks, find the "smallest" junction
@@ -48,7 +48,7 @@ void outputSJ(ReadAlignChunk** RAchunk, Parameters* P) {//collapses junctions fr
         };
 
         if (icOut<0) break; //no more junctions to output
-        
+
         for (int ic=0;ic<P->runThreadN;ic++) {//scan through all chunks, find the junctions equal to icOut-junction
             if (ic!=icOut && compareSJ((void*) sjChunks[ic], (void*) sjChunks[icOut])==0) {
                 oneSJ.collapseOneSJ(sjChunks[icOut],sjChunks[ic],P);//collapse ic-junction into icOut
@@ -59,7 +59,7 @@ void outputSJ(ReadAlignChunk** RAchunk, Parameters* P) {//collapses junctions fr
         //write out the junction
         oneSJ.junctionPointer(sjChunks[icOut],0);//point to the icOut junction
         //filter the junction
-        bool sjFilter;        
+        bool sjFilter;
         sjFilter=*oneSJ.annot>0 \
                 || ( ( *oneSJ.countUnique>=(uint) P->outSJfilterCountUniqueMin[(*oneSJ.motif+1)/2] \
                     || (*oneSJ.countMultiple+*oneSJ.countUnique)>=(uint) P->outSJfilterCountTotalMin[(*oneSJ.motif+1)/2] )\
@@ -77,10 +77,10 @@ void outputSJ(ReadAlignChunk** RAchunk, Parameters* P) {//collapses junctions fr
                 exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
             };
         };
-        
+
         sjChunks[icOut] += oneSJ.dataSize;//shift icOut-chunk by one junction
     };
-    
+
     bool* sjFilter=new bool[allSJ.N];
     if (P->outFilterBySJoutStage!=2) {
         //filter non-canonical junctions that are close to canonical
@@ -117,7 +117,7 @@ void outputSJ(ReadAlignChunk** RAchunk, Parameters* P) {//collapses junctions fr
             };
         };
     };
-    
+
     //output junctions
     if (P->outFilterBySJoutStage!=1) {//output file
         ofstream outSJfileStream((P->outFileNamePrefix+"SJ.out.tab").c_str());
@@ -130,9 +130,9 @@ void outputSJ(ReadAlignChunk** RAchunk, Parameters* P) {//collapses junctions fr
         outSJfileStream.close();
     } else {//make sjNovel array in P
         P->sjNovelN=0;
-        for (uint ii=0;ii<allSJ.N;ii++) 
+        for (uint ii=0;ii<allSJ.N;ii++)
         {//count novel junctions
-            if (sjFilter[ii]) 
+            if (sjFilter[ii])
             {//only those passing filter
                 oneSJ.junctionPointer(allSJ.data,ii);
                 if (*oneSJ.annot==0) P->sjNovelN++;
@@ -141,7 +141,7 @@ void outputSJ(ReadAlignChunk** RAchunk, Parameters* P) {//collapses junctions fr
         P->sjNovelStart = new uint [P->sjNovelN];
         P->sjNovelEnd = new uint [P->sjNovelN];
         P->inOut->logMain <<"Detected " <<P->sjNovelN<<" novel junctions that passed filtering, will proceed to filter reads that contained unannotated junctions"<<endl;
-        
+
         uint isj=0;
         for (uint ii=0;ii<allSJ.N;ii++) {//write to file
             if (sjFilter[ii]) {
diff --git a/source/parametersDefault b/source/parametersDefault
index bdf1482..0c3eb4b 100644
--- a/source/parametersDefault
+++ b/source/parametersDefault
@@ -10,13 +10,13 @@ parametersFiles          -
 
 ### System
 sysShell            -
-    string: path to the shell binary, preferrably bash, e.g. /bin/bash. 
+    string: path to the shell binary, preferrably bash, e.g. /bin/bash.
                     - ... the default shell is executed, typically /bin/sh. This was reported to fail on some Ubuntu systems - then you need to specify path to bash.
 
 ### Run Parameters
 
 runMode                         alignReads
-    string: type of the run:    
+    string: type of the run:
                                 alignReads             ... map reads
                                 genomeGenerate         ... generate genome files
                                 inputAlignmentsFromBAM ... input alignments from BAM. Presently only works with --outWigType and --bamRemoveDuplicates.
@@ -25,7 +25,7 @@ runThreadN                      1
     int: number of threads to run STAR
 
 runDirPerm                      User_RWX
-    string: permissions for the directories created at the run-time. 
+    string: permissions for the directories created at the run-time.
                                 User_RWX ... user-read/write/execute
                                 All_RWX  ... all-read/write/execute (same as chmod 777)
 
@@ -72,7 +72,7 @@ sjdbGTFfile                             -
     string: path to the GTF file with annotations
 
 sjdbGTFchrPrefix                        -
-    string: prefix for chromosome names in a GTF file (e.g. 'chr' for using ENSMEBL annotations with UCSC geneomes)
+    string: prefix for chromosome names in a GTF file (e.g. 'chr' for using ENSMEBL annotations with UCSC genomes)
 
 sjdbGTFfeatureExon                      exon
     string: feature type in GTF file to be used as exons for building transcripts
@@ -165,6 +165,11 @@ outTmpDir                       -
     string: path to a directory that will be used as temporary by STAR. All contents of this directory will be removed!
             - the temp directory will default to outFileNamePrefix_STARtmp
 
+outTmpKeep                      None
+    string: whether to keep the tempporary files after STAR runs is finished
+                                None ... remove all temporary files
+                                All .. keep all files
+
 outStd                          Log
     string: which output will be directed to stdout (standard out)
                                 Log                    ... log messages
@@ -189,16 +194,16 @@ outMultimapperOrder             Old_2.4
 ### Output: SAM and BAM
 outSAMtype                      SAM
     strings: type of SAM/BAM output
-                                1st word: 
+                                1st word:
                                 BAM  ... output BAM without sorting
                                 SAM  ... output SAM without sorting
                                 None ... no SAM/BAM output
-                                2nd, 3rd: 
+                                2nd, 3rd:
                                 Unsorted           ... standard unsorted
                                 SortedByCoordinate ... sorted by coordinate. This option will allocate extra memory for sorting which can be specified by --limitBAMsortRAM.
 
 outSAMmode                      Full
-    string: mode of SAM output  
+    string: mode of SAM output
                                 None ... no SAM output
                                 Full ... full SAM output
                                 NoQS ... full SAM but without quality scores
@@ -211,7 +216,7 @@ outSAMstrandField                               None
 outSAMattributes                Standard
     string: a string of desired SAM attributes, in the order desired for the output SAM
                                 NH HI AS nM NM MD jM jI XS ... any combination in any order
-                                Standard   ... NH HI AS nM 
+                                Standard   ... NH HI AS nM
                                 All        ... NH HI AS nM NM MD jM jI
                                 None       ... no attributes
 
@@ -224,7 +229,7 @@ outSAMunmapped                  None
                                 None   ... no output
                                 Within ... output unmapped reads within the main SAM file (i.e. Aligned.out.sam)
                                 2nd word:
-                                KeepPairs ... record unmapped mate for each alignment, and, in case of unsroted output, keep it adjacent to its mapped mate.
+                                KeepPairs ... record unmapped mate for each alignment, and, in case of unsorted output, keep it adjacent to its mapped mate.
                                               Only affects multi-mapping reads
 
 outSAMorder                     Paired
@@ -252,7 +257,7 @@ outSAMflagAND           65535
     int: 0 to 65535: sam FLAG will be bitwise AND'd with this value, i.e. FLAG=FLAG & outSAMflagOR. This is applied after all flags have been set by STAR, but before outSAMflagOR. Can be used to unset specific bits that are not set otherwise.
 
 outSAMattrRGline        -
-    string(s): SAM/BAM read group line. The first word contains the read group identifier and must start with "ID:", e.g. --outSAMattrRGline ID:xxx CN:yy "DS:z z z". 
+    string(s): SAM/BAM read group line. The first word contains the read group identifier and must start with "ID:", e.g. --outSAMattrRGline ID:xxx CN:yy "DS:z z z".
             xxx will be added as RG tag to each output alignment. Any spaces in the tag values have to be double quoted.
             Comma separated RG lines correspons to different (comma separated) input files in --readFilesIn. Commas have to be surrounded by spaces, e.g.
             --outSAMattrRGline ID:xxx , ID:zzz "DS:z z" , ID:yyy DS:yyyy
@@ -269,6 +274,8 @@ outSAMheaderCommentFile -
 outSAMfilter            None
     string(s): filter the output into main SAM/BAM files
                         KeepOnlyAddedReferences ... only keep the reads for which all alignments are to the extra reference sequences added with --genomeFastaFiles at the mapping stage.
+                        KeepAllAddedReferences ...  keep all alignments to the extra reference sequences added with --genomeFastaFiles at the mapping stage.
+
 
 outSAMmultNmax          -1
     int: max number of multiple alignments for a read that will be output to the SAM/BAM files.
@@ -295,12 +302,12 @@ outWigType          None
     string(s): type of signal output, e.g. "bedGraph" OR "bedGraph read1_5p". Requires sorted BAM: --outSAMtype BAM SortedByCoordinate .
                     1st word:
                     None       ... no signal output
-                    bedGraph   ... bedGraph format 
+                    bedGraph   ... bedGraph format
                     wiggle     ... wiggle format
                     2nd word:
                     read1_5p   ... signal from only 5' of the 1st read, useful for CAGE/RAMPAGE etc
                     read2      ... signal from only 2nd read
-                    
+
 outWigStrand        Stranded
     string: strandedness of wiggle/bedGraph output
                     Stranded   ...  separate strands, str1 and str2
@@ -308,7 +315,7 @@ outWigStrand        Stranded
 
 outWigReferencesPrefix    -
     string: prefix matching reference names to include in the output wiggle file, e.g. "chr", default "-" - include all references
- 
+
 outWigNorm              RPM
     string: type of normalization for the signal
                         RPM    ... reads per million of mapped reads
@@ -324,7 +331,7 @@ outFilterMultimapScoreRange     1
     int: the score range below the maximum score for multimapping alignments
 
 outFilterMultimapNmax           10
-    int: maximum number of loci the read is allowed to map to. Alignments (all of them) will be output only if the read maps to no more loci than this value. 
+    int: maximum number of loci the read is allowed to map to. Alignments (all of them) will be output only if the read maps to no more loci than this value.
          Otherwise no alignments will be output, and the read will be counted as "mapped to too many loci" in the Log.final.out .
 
 outFilterMismatchNmax           10
@@ -367,12 +374,12 @@ outSJfilterOverhangMin          30  12  12  12
     4 integers:    minimum overhang length for splice junctions on both sides for: (1) non-canonical motifs, (2) GT/AG and CT/AC motif, (3) GC/AG and CT/GC motif, (4) AT/AC and GT/AT motif. -1 means no output for that motif
                                 does not apply to annotated junctions
 
-outSJfilterCountUniqueMin       3   1   1   1 
+outSJfilterCountUniqueMin       3   1   1   1
     4 integers: minimum uniquely mapping read count per junction for: (1) non-canonical motifs, (2) GT/AG and CT/AC motif, (3) GC/AG and CT/GC motif, (4) AT/AC and GT/AT motif. -1 means no output for that motif
                                 Junctions are output if one of outSJfilterCountUniqueMin OR outSJfilterCountTotalMin conditions are satisfied
                                 does not apply to annotated junctions
 
-outSJfilterCountTotalMin     3   1   1   1 
+outSJfilterCountTotalMin     3   1   1   1
     4 integers: minimum total (multi-mapping+unique) read count per junction for: (1) non-canonical motifs, (2) GT/AG and CT/AC motif, (3) GC/AG and CT/GC motif, (4) AT/AC and GT/AT motif. -1 means no output for that motif
                                 Junctions are output if one of outSJfilterCountUniqueMin OR outSJfilterCountTotalMin conditions are satisfied
                                 does not apply to annotated junctions
@@ -382,7 +389,7 @@ outSJfilterDistToOtherSJmin     10  0   5   10
                                 does not apply to annotated junctions
 
 outSJfilterIntronMaxVsReadN        50000 100000 200000
-    N integers>=0: maximum gap allowed for junctions supported by 1,2,3,,,N reads 
+    N integers>=0: maximum gap allowed for junctions supported by 1,2,3,,,N reads
                                 i.e. by default junctions supported by 1 read can have gaps <=50000b, by 2 reads: <=100000b, by 3 reads: <=200000. by >=4 reads any gap <=alignIntronMax
                                 does not apply to annotated junctions
 
@@ -438,7 +445,7 @@ seedPerReadNmax       1000
 seedPerWindowNmax     50
     int>0: max number of seeds per window
 
-seedNoneLociPerWindow    10 
+seedNoneLociPerWindow    10
     int>0: max number of one seed loci per window
 
 alignIntronMin              21
@@ -454,7 +461,7 @@ alignSJoverhangMin          5
     int>0: minimum overhang (i.e. block size) for spliced alignments
 
 alignSJstitchMismatchNmax   0 -1 0 0
-    4*int>=0: maximum number of mismatches for stitching of the splice junctions (-1: no limit). 
+    4*int>=0: maximum number of mismatches for stitching of the splice junctions (-1: no limit).
                             (1) non-canonical motifs, (2) GT/AG and CT/AC motif, (3) GC/AG and CT/GC motif, (4) AT/AC and GT/AT motif.
 
 alignSJDBoverhangMin        3
@@ -465,21 +472,30 @@ alignSplicedMateMapLmin     0
 
 alignSplicedMateMapLminOverLmate 0.66
     float>0: alignSplicedMateMapLmin normalized to mate length
-   
+
 alignWindowsPerReadNmax     10000
     int>0: max number of windows per read
 
 alignTranscriptsPerWindowNmax       100
-    int>0: max number of transcripts per window           
+    int>0: max number of transcripts per window
 
 alignTranscriptsPerReadNmax               10000
     int>0: max number of different alignments per read to consider
 
 alignEndsType           Local
     string: type of read ends alignment
-                        Local           ... standard local alignment with soft-clipping allowed
-                        EndToEnd        ... force end-to-end read alignment, do not soft-clip
-                        Extend5pOfRead1 ... fully extend only the 5p of the read1, all other ends: local alignment
+                        Local             ... standard local alignment with soft-clipping allowed
+                        EndToEnd          ... force end-to-end read alignment, do not soft-clip
+                        Extend5pOfRead1   ... fully extend only the 5p of the read1, all other ends: local alignment
+                        Extend5pOfReads12 ... fully extend only the 5p of the both read1 and read2, all other ends: local alignment
+
+alignEndsProtrude       0    ConcordantPair
+    int, string:        allow protrusion of alignment ends, i.e. start (end) of the +strand mate downstream of the start (end) of the -strand mate
+                        1st word: int: maximum number of protrusion bases allowed
+                        2nd word: string: 
+                                            ConcordantPair ... report alignments with non-zero protrusion as concordant pairs
+                                            DiscordantPair ... report alignments with non-zero protrusion as discordant pairs
+
 
 alignSoftClipAtReferenceEnds Yes
     string: allow the soft-clipping of the alignments past the end of the chromosomes
@@ -492,15 +508,19 @@ winAnchorMultimapNmax           50
     int>0: max number of loci anchors are allowed to map to
 
 winBinNbits                     16
-    int>0: =log2(winBin), where winBin is the size of the bin for the windows/clustering, each window will occupy an integer number of bins. 
+    int>0: =log2(winBin), where winBin is the size of the bin for the windows/clustering, each window will occupy an integer number of bins.
 
 winAnchorDistNbins              9
     int>0: max number of bins between two anchors that allows aggregation of anchors into one window
 
-winFlankNbins               4
+winFlankNbins                   4
     int>0: log2(winFlank), where win Flank is the size of the left and right flanking regions for each window
 
+winReadCoverageRelativeMin      0.5
+    float>=0: minimum relative coverage of the read sequence by the seeds in a window, for STARlong algorithm only.
 
+winReadCoverageBasesMin      0
+    int>0: minimum number of bases covered by the seeds in a window , for STARlong algorithm only.
 
 ### Chimeric Alignments
 chimOutType                 SeparateSAMold
diff --git a/source/parametersDefault.xxd b/source/parametersDefault.xxd
index 41a35eb..2343e05 100644
--- a/source/parametersDefault.xxd
+++ b/source/parametersDefault.xxd
@@ -42,818 +42,837 @@ unsigned char parametersDefault[] = {
   0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x2c, 0x20, 0x70, 0x72, 0x65,
   0x66, 0x65, 0x72, 0x72, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x62, 0x61, 0x73,
   0x68, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x2f, 0x62, 0x69, 0x6e,
-  0x2f, 0x62, 0x61, 0x73, 0x68, 0x2e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x73, 0x68,
-  0x65, 0x6c, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75,
-  0x74, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c,
-  0x6c, 0x79, 0x20, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x68, 0x2e, 0x20,
-  0x54, 0x68, 0x69, 0x73, 0x20, 0x77, 0x61, 0x73, 0x20, 0x72, 0x65, 0x70,
-  0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x61, 0x69,
-  0x6c, 0x20, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x55, 0x62,
-  0x75, 0x6e, 0x74, 0x75, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
-  0x20, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x20,
-  0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63,
-  0x69, 0x66, 0x79, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20,
-  0x62, 0x61, 0x73, 0x68, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x52,
-  0x75, 0x6e, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
-  0x73, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61,
-  0x6c, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x73, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x79,
-  0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x75,
-  0x6e, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x61, 0x64,
-  0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x72, 0x65,
-  0x61, 0x64, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2f, 0x62, 0x61, 0x73, 0x68, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x2d, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x73, 0x68, 0x65,
+  0x6c, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
+  0x65, 0x64, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x6c,
+  0x79, 0x20, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x68, 0x2e, 0x20, 0x54,
+  0x68, 0x69, 0x73, 0x20, 0x77, 0x61, 0x73, 0x20, 0x72, 0x65, 0x70, 0x6f,
+  0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x61, 0x69, 0x6c,
+  0x20, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x55, 0x62, 0x75,
+  0x6e, 0x74, 0x75, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+  0x2d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6e,
+  0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69,
+  0x66, 0x79, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x62,
+  0x61, 0x73, 0x68, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x52, 0x75,
+  0x6e, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73,
+  0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x73, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x79, 0x70,
+  0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e,
+  0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x73, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x6d, 0x61, 0x70, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d,
+  0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x67, 0x65,
+  0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d,
+  0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x41, 0x6c, 0x69,
+  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42,
+  0x41, 0x4d, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74,
+  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20,
+  0x66, 0x72, 0x6f, 0x6d, 0x20, 0x42, 0x41, 0x4d, 0x2e, 0x20, 0x50, 0x72,
+  0x65, 0x73, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
+  0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+  0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x57, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x62, 0x61, 0x6d, 0x52, 0x65,
+  0x6d, 0x6f, 0x76, 0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
+  0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x54, 0x68, 0x72, 0x65,
+  0x61, 0x64, 0x4e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,
-  0x74, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
-  0x2e, 0x2e, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20,
+  0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20,
+  0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e,
+  0x20, 0x53, 0x54, 0x41, 0x52, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x44, 0x69,
+  0x72, 0x50, 0x65, 0x72, 0x6d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x55, 0x73, 0x65, 0x72, 0x5f, 0x52, 0x57, 0x58, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20,
+  0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+  0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65,
+  0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x20, 0x63, 0x72, 0x65, 0x61,
+  0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72,
+  0x75, 0x6e, 0x2d, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x73, 0x65, 0x72, 0x5f, 0x52, 0x57,
+  0x58, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2d, 0x72,
+  0x65, 0x61, 0x64, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2f, 0x65, 0x78,
+  0x65, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x41, 0x6c, 0x6c, 0x5f, 0x52, 0x57, 0x58, 0x20, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x6c, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x2f,
+  0x77, 0x72, 0x69, 0x74, 0x65, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
+  0x65, 0x20, 0x28, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x63,
+  0x68, 0x6d, 0x6f, 0x64, 0x20, 0x37, 0x37, 0x37, 0x29, 0x0a, 0x0a, 0x72,
+  0x75, 0x6e, 0x52, 0x4e, 0x47, 0x73, 0x65, 0x65, 0x64, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x37, 0x37, 0x37, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x72, 0x61, 0x6e, 0x64,
+  0x6f, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x67, 0x65,
+  0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x65, 0x64,
+  0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x47, 0x65, 0x6e, 0x6f, 0x6d,
+  0x65, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73,
+  0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x44, 0x69, 0x72, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2f, 0x47, 0x65, 0x6e, 0x6f,
+  0x6d, 0x65, 0x44, 0x69, 0x72, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20,
+  0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63,
+  0x74, 0x6f, 0x72, 0x79, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x67,
+  0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20,
+  0x61, 0x72, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x28,
+  0x69, 0x66, 0x20, 0x72, 0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x21, 0x3d,
+  0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, 0x65, 0x6e, 0x6f,
+  0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
+  0x62, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
+  0x20, 0x28, 0x69, 0x66, 0x20, 0x72, 0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65,
+  0x3d, 0x3d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, 0x65,
+  0x6e, 0x6f, 0x6d, 0x65, 0x29, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d,
+  0x65, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x53,
+  0x68, 0x61, 0x72, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20,
+  0x6d, 0x6f, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x68, 0x61, 0x72,
+  0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x75, 0x73,
+  0x61, 0x67, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
   0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x70,
-  0x75, 0x74, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
-  0x46, 0x72, 0x6f, 0x6d, 0x42, 0x41, 0x4d, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
-  0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
-  0x65, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x42, 0x41,
-  0x4d, 0x2e, 0x20, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x6c, 0x79,
-  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20,
-  0x77, 0x69, 0x74, 0x68, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x57, 0x69,
-  0x67, 0x54, 0x79, 0x70, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x2d, 0x2d,
-  0x62, 0x61, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x75, 0x70,
-  0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x72, 0x75,
-  0x6e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x4e, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
-  0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74,
-  0x6f, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x53, 0x54, 0x41, 0x52, 0x0a, 0x0a,
-  0x72, 0x75, 0x6e, 0x44, 0x69, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x73, 0x65, 0x72,
-  0x5f, 0x52, 0x57, 0x58, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
-  0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73,
-  0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65,
-  0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73,
-  0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x2d, 0x74, 0x69, 0x6d, 0x65,
-  0x2e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55,
-  0x73, 0x65, 0x72, 0x5f, 0x52, 0x57, 0x58, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
-  0x75, 0x73, 0x65, 0x72, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x77, 0x72,
-  0x69, 0x74, 0x65, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c, 0x6c, 0x5f,
-  0x52, 0x57, 0x58, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x6c,
-  0x2d, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2f,
-  0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x28, 0x73, 0x61, 0x6d,
-  0x65, 0x20, 0x61, 0x73, 0x20, 0x63, 0x68, 0x6d, 0x6f, 0x64, 0x20, 0x37,
-  0x37, 0x37, 0x29, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x52, 0x4e, 0x47, 0x73,
-  0x65, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x37, 0x37, 0x37, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
-  0x3a, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x20, 0x6e, 0x75, 0x6d,
-  0x62, 0x65, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,
-  0x72, 0x20, 0x73, 0x65, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23,
-  0x20, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x50, 0x61, 0x72, 0x61,
-  0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f,
-  0x6d, 0x65, 0x44, 0x69, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x2e, 0x2f, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x44, 0x69, 0x72, 0x2f,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
-  0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
-  0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x77,
-  0x68, 0x65, 0x72, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20,
-  0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x74,
-  0x6f, 0x72, 0x65, 0x64, 0x20, 0x28, 0x69, 0x66, 0x20, 0x72, 0x75, 0x6e,
-  0x4d, 0x6f, 0x64, 0x65, 0x21, 0x3d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
-  0x74, 0x65, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72,
-  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x67, 0x65, 0x6e,
-  0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x69, 0x66, 0x20, 0x72,
-  0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x3d, 0x3d, 0x67, 0x65, 0x6e, 0x65,
-  0x72, 0x61, 0x74, 0x65, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x29, 0x0a,
-  0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x4e, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4d,
-  0x65, 0x6d, 0x6f, 0x72, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
-  0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x6f,
-  0x66, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d,
-  0x6f, 0x72, 0x79, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f,
-  0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65,
-  0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4b, 0x65,
+  0x65, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6c,
+  0x6f, 0x61, 0x64, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69,
+  0x6e, 0x74, 0x6f, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x61,
+  0x6e, 0x64, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x20, 0x69, 0x74, 0x20, 0x69,
+  0x6e, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x66, 0x74,
+  0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x61,
-  0x64, 0x41, 0x6e, 0x64, 0x4b, 0x65, 0x65, 0x70, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x41, 0x6e, 0x64, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x20,
   0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x67, 0x65,
   0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x73, 0x68,
-  0x61, 0x72, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x65,
-  0x70, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x65, 0x6d, 0x6f,
-  0x72, 0x79, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x52, 0x65,
-  0x6d, 0x6f, 0x76, 0x65, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6c,
-  0x6f, 0x61, 0x64, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69,
-  0x6e, 0x74, 0x6f, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x62,
-  0x75, 0x74, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x69, 0x74,
-  0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x45, 0x78, 0x69, 0x74,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x61,
-  0x64, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x74,
-  0x6f, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d,
-  0x6f, 0x72, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x69, 0x74,
-  0x2c, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20,
-  0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66,
-  0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x73, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x64, 0x6f, 0x20,
-  0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x61, 0x6e, 0x79, 0x74,
-  0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x72,
-  0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64,
-  0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d,
-  0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f,
-  0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79,
-  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74,
-  0x20, 0x75, 0x73, 0x65, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20,
-  0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x65, 0x61, 0x63, 0x68,
-  0x20, 0x6a, 0x6f, 0x62, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61,
-  0x76, 0x65, 0x20, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x20, 0x70,
-  0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20,
-  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d,
-  0x65, 0x0a, 0x0a, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x47, 0x65, 0x6e,
-  0x6f, 0x6d, 0x65, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
-  0x6f, 0x6e, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
-  0x73, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x46, 0x61, 0x73,
-  0x74, 0x61, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20,
-  0x70, 0x61, 0x74, 0x68, 0x28, 0x73, 0x29, 0x20, 0x74, 0x6f, 0x20, 0x74,
-  0x68, 0x65, 0x20, 0x66, 0x61, 0x73, 0x74, 0x61, 0x20, 0x66, 0x69, 0x6c,
-  0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x67, 0x65, 0x6e, 0x6f,
-  0x6d, 0x69, 0x63, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65,
+  0x61, 0x72, 0x65, 0x64, 0x20, 0x62, 0x75, 0x74, 0x20, 0x72, 0x65, 0x6d,
+  0x6f, 0x76, 0x65, 0x20, 0x69, 0x74, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72,
+  0x20, 0x72, 0x75, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x41,
+  0x6e, 0x64, 0x45, 0x78, 0x69, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x67, 0x65, 0x6e, 0x6f,
+  0x6d, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x73, 0x68, 0x61, 0x72,
+  0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x65, 0x78, 0x69, 0x74, 0x2c, 0x20, 0x6b, 0x65, 0x65, 0x70,
+  0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f,
+  0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79,
+  0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20,
+  0x72, 0x75, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76,
+  0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61,
+  0x70, 0x20, 0x61, 0x6e, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20,
+  0x6a, 0x75, 0x73, 0x74, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20,
+  0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d,
+  0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72,
+  0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64,
+  0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73, 0x65, 0x20, 0x73,
+  0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79,
+  0x2c, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6a, 0x6f, 0x62, 0x20, 0x77,
+  0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x69, 0x74, 0x73,
+  0x20, 0x6f, 0x77, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65,
+  0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x0a, 0x0a, 0x0a, 0x0a, 0x23,
+  0x23, 0x23, 0x20, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x47, 0x65,
+  0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x61, 0x72,
+  0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x0a, 0x0a, 0x67, 0x65, 0x6e,
+  0x6f, 0x6d, 0x65, 0x46, 0x61, 0x73, 0x74, 0x61, 0x46, 0x69, 0x6c, 0x65,
+  0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x28, 0x73,
+  0x29, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x73,
+  0x74, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x73, 0x65,
+  0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72,
+  0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x73, 0x70, 0x61, 0x63,
+  0x65, 0x73, 0x2e, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x75, 0x73, 0x65,
+  0x64, 0x20, 0x69, 0x66, 0x20, 0x72, 0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65,
+  0x3d, 0x3d, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x47, 0x65, 0x6e, 0x65,
+  0x72, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20,
+  0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64,
+  0x20, 0x62, 0x65, 0x20, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x65,
+  0x78, 0x74, 0x20, 0x46, 0x41, 0x53, 0x54, 0x41, 0x20, 0x66, 0x69, 0x6c,
+  0x65, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x2a, 0x63, 0x61,
+  0x6e, 0x6e, 0x6f, 0x74, 0x2a, 0x20, 0x62, 0x65, 0x20, 0x7a, 0x69, 0x70,
+  0x70, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65,
+  0x43, 0x68, 0x72, 0x42, 0x69, 0x6e, 0x4e, 0x62, 0x69, 0x74, 0x73, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x38,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x3d, 0x6c,
+  0x6f, 0x67, 0x32, 0x28, 0x63, 0x68, 0x72, 0x42, 0x69, 0x6e, 0x29, 0x2c,
+  0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x63, 0x68, 0x72, 0x42, 0x69,
+  0x6e, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a,
+  0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6e,
   0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65,
-  0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c,
-  0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62,
-  0x79, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x4f, 0x6e,
-  0x6c, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x66, 0x20, 0x72,
-  0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x3d, 0x3d, 0x67, 0x65, 0x6e, 0x6f,
-  0x6d, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x2e, 0x20,
-  0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20,
-  0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x70, 0x6c,
-  0x61, 0x69, 0x6e, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x46, 0x41, 0x53,
-  0x54, 0x41, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x68,
-  0x65, 0x79, 0x20, 0x2a, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x2a, 0x20,
-  0x62, 0x65, 0x20, 0x7a, 0x69, 0x70, 0x70, 0x65, 0x64, 0x2e, 0x0a, 0x0a,
-  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x43, 0x68, 0x72, 0x42, 0x69, 0x6e,
-  0x4e, 0x62, 0x69, 0x74, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x31, 0x38, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
-  0x6e, 0x74, 0x3a, 0x20, 0x3d, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x63, 0x68,
-  0x72, 0x42, 0x69, 0x6e, 0x29, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65,
-  0x20, 0x63, 0x68, 0x72, 0x42, 0x69, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74,
-  0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74,
-  0x68, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
-  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61,
-  0x67, 0x65, 0x3a, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x63, 0x68, 0x72,
-  0x6f, 0x6d, 0x6f, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c,
-  0x20, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x69,
-  0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65,
-  0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x73, 0x0a, 0x0a, 0x67,
-  0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x53, 0x41, 0x69, 0x6e, 0x64, 0x65, 0x78,
-  0x4e, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x31, 0x34, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
-  0x74, 0x3a, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x28, 0x62,
-  0x61, 0x73, 0x65, 0x73, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
-  0x20, 0x53, 0x41, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x69, 0x6e, 0x64, 0x65,
-  0x78, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e,
-  0x20, 0x54, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x62,
-  0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x31, 0x30, 0x20, 0x61, 0x6e,
-  0x64, 0x20, 0x31, 0x35, 0x2e, 0x20, 0x4c, 0x6f, 0x6e, 0x67, 0x65, 0x72,
-  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x77, 0x69, 0x6c,
-  0x6c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x6d,
-  0x6f, 0x72, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20,
-  0x62, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x66, 0x61,
-  0x73, 0x74, 0x65, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65,
-  0x73, 0x2e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x53, 0x41,
-  0x73, 0x70, 0x61, 0x72, 0x73, 0x65, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x73, 0x75, 0x66,
-  0x66, 0x75, 0x78, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x70,
-  0x61, 0x72, 0x73, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x69, 0x2e, 0x65, 0x2e,
-  0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65,
-  0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65,
-  0x73, 0x3a, 0x20, 0x75, 0x73, 0x65, 0x20, 0x62, 0x69, 0x67, 0x67, 0x65,
-  0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f,
-  0x20, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x6e, 0x65,
-  0x65, 0x64, 0x65, 0x64, 0x20, 0x52, 0x41, 0x4d, 0x20, 0x61, 0x74, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20,
-  0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x70, 0x65, 0x65,
-  0x64, 0x20, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a,
-  0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x53, 0x75, 0x66, 0x66, 0x69,
-  0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x61, 0x78, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d,
-  0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74,
-  0x68, 0x65, 0x20, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x65, 0x73, 0x2c,
-  0x20, 0x68, 0x61, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x6c,
-  0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x72,
-  0x65, 0x61, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2e, 0x20,
-  0x2d, 0x31, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74,
-  0x65, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x53, 0x70, 0x6c, 0x69,
-  0x63, 0x65, 0x20, 0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
-  0x20, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x0a, 0x73, 0x6a,
-  0x64, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x72, 0x53, 0x74, 0x61,
-  0x72, 0x74, 0x45, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x65, 0x61,
+  0x63, 0x68, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x6f, 0x73, 0x6f, 0x6d,
+  0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x70,
+  0x79, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72,
+  0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62,
+  0x69, 0x6e, 0x73, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x53,
+  0x41, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x62, 0x61, 0x73, 0x65, 0x73,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x34, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6c, 0x65, 0x6e,
+  0x67, 0x74, 0x68, 0x20, 0x28, 0x62, 0x61, 0x73, 0x65, 0x73, 0x29, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41, 0x20, 0x70, 0x72,
+  0x65, 0x2d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x54, 0x79, 0x70, 0x69, 0x63,
+  0x61, 0x6c, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e,
+  0x20, 0x31, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x35, 0x2e, 0x20,
+  0x4c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x20,
+  0x6d, 0x75, 0x63, 0x68, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6d, 0x65,
+  0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x61, 0x6c,
+  0x6c, 0x6f, 0x77, 0x20, 0x66, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x73,
+  0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x67, 0x65,
+  0x6e, 0x6f, 0x6d, 0x65, 0x53, 0x41, 0x73, 0x70, 0x61, 0x72, 0x73, 0x65,
+  0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e,
+  0x30, 0x3a, 0x20, 0x73, 0x75, 0x66, 0x66, 0x75, 0x78, 0x20, 0x61, 0x72,
+  0x72, 0x61, 0x79, 0x20, 0x73, 0x70, 0x61, 0x72, 0x73, 0x69, 0x74, 0x79,
+  0x2c, 0x20, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61,
+  0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20,
+  0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x3a, 0x20, 0x75, 0x73, 0x65,
+  0x20, 0x62, 0x69, 0x67, 0x67, 0x65, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62,
+  0x65, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x63, 0x72, 0x65,
+  0x61, 0x73, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x52,
+  0x41, 0x4d, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f,
+  0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e,
+  0x67, 0x20, 0x73, 0x70, 0x65, 0x65, 0x64, 0x20, 0x72, 0x65, 0x64, 0x75,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d,
+  0x65, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74,
+  0x68, 0x4d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
+  0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6d,
+  0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74,
+  0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x66,
+  0x66, 0x69, 0x78, 0x65, 0x73, 0x2c, 0x20, 0x68, 0x61, 0x73, 0x20, 0x74,
+  0x6f, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20,
+  0x74, 0x68, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x65,
+  0x6e, 0x67, 0x74, 0x68, 0x2e, 0x20, 0x2d, 0x31, 0x20, 0x3d, 0x20, 0x69,
+  0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x2e, 0x0a, 0x0a, 0x23, 0x23,
+  0x23, 0x20, 0x53, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x4a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x44, 0x61, 0x74, 0x61, 0x62,
+  0x61, 0x73, 0x65, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x46, 0x69, 0x6c, 0x65,
+  0x43, 0x68, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x6e, 0x64, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
-  0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20,
-  0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73,
-  0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x69,
-  0x63, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65,
-  0x73, 0x20, 0x28, 0x63, 0x68, 0x72, 0x20, 0x3c, 0x74, 0x61, 0x62, 0x3e,
-  0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3c, 0x74, 0x61, 0x62, 0x3e,
-  0x20, 0x65, 0x6e, 0x64, 0x20, 0x3c, 0x74, 0x61, 0x62, 0x3e, 0x20, 0x73,
-  0x74, 0x72, 0x61, 0x6e, 0x64, 0x29, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74,
-  0x68, 0x65, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x6a, 0x75,
-  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f,
-  0x6e, 0x73, 0x2e, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65,
-  0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62,
-  0x65, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x77,
-  0x61, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20,
-  0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x6e, 0x61, 0x74, 0x65, 0x64,
-  0x2e, 0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x47, 0x54, 0x46, 0x66, 0x69,
-  0x6c, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a,
+  0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6f, 0x72,
+  0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x20, 0x28, 0x63, 0x68, 0x72,
+  0x20, 0x3c, 0x74, 0x61, 0x62, 0x3e, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74,
+  0x20, 0x3c, 0x74, 0x61, 0x62, 0x3e, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x3c,
+  0x74, 0x61, 0x62, 0x3e, 0x20, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x29,
+  0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x6c,
+  0x69, 0x63, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x73, 0x2e, 0x20, 0x4d, 0x75,
+  0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73,
+  0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73, 0x75, 0x70, 0x70,
+  0x6c, 0x69, 0x65, 0x64, 0x20, 0x77, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x69,
+  0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74,
+  0x65, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x73, 0x6a, 0x64,
+  0x62, 0x47, 0x54, 0x46, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x47, 0x54, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x47, 0x54,
+  0x46, 0x63, 0x68, 0x72, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20,
+  0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63,
+  0x68, 0x72, 0x6f, 0x6d, 0x6f, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x6e, 0x61,
+  0x6d, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x47, 0x54, 0x46,
+  0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20,
+  0x27, 0x63, 0x68, 0x72, 0x27, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73,
+  0x69, 0x6e, 0x67, 0x20, 0x45, 0x4e, 0x53, 0x4d, 0x45, 0x42, 0x4c, 0x20,
+  0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x20, 0x55, 0x43, 0x53, 0x43, 0x20, 0x67, 0x65,
+  0x6e, 0x6f, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62,
+  0x47, 0x54, 0x46, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x45, 0x78,
+  0x6f, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x65, 0x78, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
+  0x69, 0x6e, 0x67, 0x3a, 0x20, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65,
+  0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x47, 0x54, 0x46,
+  0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20,
+  0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x65, 0x78, 0x6f, 0x6e,
+  0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69,
+  0x6e, 0x67, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70,
+  0x74, 0x73, 0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x47, 0x54, 0x46, 0x74,
+  0x61, 0x67, 0x45, 0x78, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74,
+  0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x61,
+  0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65,
+  0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x65, 0x78, 0x6f,
+  0x6e, 0x73, 0x27, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x28,
+  0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x22, 0x74, 0x72, 0x61,
+  0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x20,
+  0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x47, 0x54,
+  0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x29, 0x0a, 0x0a, 0x73, 0x6a,
+  0x64, 0x62, 0x47, 0x54, 0x46, 0x74, 0x61, 0x67, 0x45, 0x78, 0x6f, 0x6e,
+  0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x61,
+  0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65,
+  0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x65, 0x78, 0x6f,
+  0x6e, 0x73, 0x27, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x2d, 0x70, 0x61, 0x72,
+  0x65, 0x6e, 0x74, 0x73, 0x20, 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
+  0x74, 0x20, 0x22, 0x67, 0x65, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x20,
+  0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x47, 0x54,
+  0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x29, 0x0a, 0x0a, 0x73, 0x6a,
+  0x64, 0x62, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x6e, 0x6f, 0x72,
+  0x2f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x6f, 0x72, 0x20, 0x73, 0x65,
+  0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61,
+  0x63, 0x68, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x2c, 0x20, 0x69, 0x64, 0x65, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x3d, 0x20,
+  0x28, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+  0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x53,
+  0x63, 0x6f, 0x72, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x65, 0x78,
+  0x74, 0x72, 0x61, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x20, 0x64, 0x61, 0x74,
+  0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x49, 0x6e, 0x73,
+  0x65, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x61, 0x73,
+  0x69, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6c,
+  0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x61, 0x76, 0x65, 0x20, 0x77,
+  0x68, 0x65, 0x6e, 0x20, 0x73, 0x6a, 0x64, 0x62, 0x20, 0x6a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69,
+  0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x66, 0x6c, 0x79, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74,
+  0x65, 0x70, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x42, 0x61, 0x73, 0x69,
+  0x63, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x73,
+  0x6d, 0x61, 0x6c, 0x6c, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x20, 0x2f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x09, 0x09, 0x09,
+  0x09, 0x09, 0x41, 0x6c, 0x6c, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x61, 0x6c, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e,
+  0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x67, 0x20,
+  0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x2c, 0x20, 0x53, 0x41, 0x20, 0x61,
+  0x6e, 0x64, 0x20, 0x53, 0x41, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d,
+  0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63,
+  0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70,
+  0x6c, 0x65, 0x74, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20,
+  0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x0a, 0x0a, 0x23,
+  0x23, 0x23, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x46, 0x69, 0x6c,
+  0x65, 0x73, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x42, 0x41, 0x4d, 0x66,
+  0x69, 0x6c, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x61, 0x74,
-  0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x54, 0x46,
-  0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61,
-  0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a,
-  0x73, 0x6a, 0x64, 0x62, 0x47, 0x54, 0x46, 0x63, 0x68, 0x72, 0x50, 0x72,
-  0x65, 0x66, 0x69, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
-  0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78,
-  0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x6f, 0x73,
-  0x6f, 0x6d, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x69, 0x6e,
-  0x20, 0x61, 0x20, 0x47, 0x54, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20,
-  0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x27, 0x63, 0x68, 0x72, 0x27, 0x20,
-  0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x45, 0x4e,
-  0x53, 0x4d, 0x45, 0x42, 0x4c, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61,
-  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x55,
-  0x43, 0x53, 0x43, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x6f, 0x6d, 0x65, 0x73,
-  0x29, 0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x47, 0x54, 0x46, 0x66, 0x65,
-  0x61, 0x74, 0x75, 0x72, 0x65, 0x45, 0x78, 0x6f, 0x6e, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x6f, 0x6e, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20,
-  0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65,
-  0x20, 0x69, 0x6e, 0x20, 0x47, 0x54, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65,
-  0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20,
-  0x61, 0x73, 0x20, 0x65, 0x78, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72,
-  0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x72,
-  0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x0a, 0x0a, 0x73,
-  0x6a, 0x64, 0x62, 0x47, 0x54, 0x46, 0x74, 0x61, 0x67, 0x45, 0x78, 0x6f,
-  0x6e, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73,
-  0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70,
-  0x74, 0x5f, 0x69, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
-  0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x61, 0x67, 0x20, 0x6e, 0x61, 0x6d,
-  0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64,
-  0x20, 0x61, 0x73, 0x20, 0x65, 0x78, 0x6f, 0x6e, 0x73, 0x27, 0x20, 0x74,
-  0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2d, 0x70, 0x61,
-  0x72, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x28, 0x64, 0x65, 0x66, 0x61, 0x75,
-  0x6c, 0x74, 0x20, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69,
-  0x70, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73,
-  0x20, 0x66, 0x6f, 0x72, 0x20, 0x47, 0x54, 0x46, 0x20, 0x66, 0x69, 0x6c,
-  0x65, 0x73, 0x29, 0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x47, 0x54, 0x46,
-  0x74, 0x61, 0x67, 0x45, 0x78, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x65, 0x6e,
-  0x74, 0x47, 0x65, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x6e,
-  0x65, 0x5f, 0x69, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
-  0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x61, 0x67, 0x20, 0x6e, 0x61, 0x6d,
-  0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64,
-  0x20, 0x61, 0x73, 0x20, 0x65, 0x78, 0x6f, 0x6e, 0x73, 0x27, 0x20, 0x67,
-  0x65, 0x6e, 0x65, 0x2d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x20,
-  0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x22, 0x67, 0x65,
-  0x6e, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73,
-  0x20, 0x66, 0x6f, 0x72, 0x20, 0x47, 0x54, 0x46, 0x20, 0x66, 0x69, 0x6c,
-  0x65, 0x73, 0x29, 0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x4f, 0x76, 0x65,
-  0x72, 0x68, 0x61, 0x6e, 0x67, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20,
-  0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x64, 0x6f, 0x6e, 0x6f, 0x72, 0x2f, 0x61, 0x63, 0x63, 0x65,
-  0x70, 0x74, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63,
-  0x65, 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x69,
-  0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6a, 0x75,
-  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x64, 0x65,
-  0x61, 0x6c, 0x6c, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65,
-  0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x29,
-  0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x61,
-  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x63, 0x6f,
-  0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
-  0x6d, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x72,
-  0x6f, 0x73, 0x73, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65,
-  0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a,
-  0x73, 0x6a, 0x64, 0x62, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x53, 0x61,
-  0x76, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x42, 0x61, 0x73, 0x69, 0x63, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x77, 0x68,
-  0x69, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x6f,
-  0x20, 0x73, 0x61, 0x76, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73,
-  0x6a, 0x64, 0x62, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-  0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74,
-  0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c,
-  0x79, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x70,
-  0x70, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, 0x65, 0x70, 0x0a, 0x09, 0x09,
-  0x09, 0x09, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x20, 0x2e, 0x2e, 0x2e,
-  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x20,
-  0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2f, 0x20, 0x74,
-  0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x66, 0x69,
-  0x6c, 0x65, 0x73, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x41, 0x6c, 0x6c,
-  0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66,
-  0x69, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69,
-  0x6e, 0x67, 0x20, 0x62, 0x69, 0x67, 0x20, 0x47, 0x65, 0x6e, 0x6f, 0x6d,
-  0x65, 0x2c, 0x20, 0x53, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x41,
-  0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73,
-  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
-  0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20,
-  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63,
-  0x74, 0x6f, 0x72, 0x79, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x49, 0x6e,
-  0x70, 0x75, 0x74, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x69, 0x6e,
-  0x70, 0x75, 0x74, 0x42, 0x41, 0x4d, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x68, 0x20, 0x74, 0x6f, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x69, 0x6e, 0x70,
+  0x75, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20,
+  0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68,
+  0x20, 0x2d, 0x2d, 0x72, 0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x69,
+  0x6e, 0x70, 0x75, 0x74, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x41, 0x4d, 0x0a, 0x0a, 0x23,
+  0x23, 0x23, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x50, 0x61, 0x72, 0x61,
+  0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64,
+  0x46, 0x69, 0x6c, 0x65, 0x73, 0x49, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x52, 0x65, 0x61, 0x64, 0x31, 0x20, 0x52, 0x65, 0x61, 0x64, 0x32, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73,
+  0x29, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x20, 0x74, 0x6f, 0x20,
+  0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63,
+  0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74,
+  0x20, 0x72, 0x65, 0x61, 0x64, 0x31, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x2c,
+  0x20, 0x69, 0x66, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2c, 0x20,
+  0x20, 0x72, 0x65, 0x61, 0x64, 0x32, 0x29, 0x0a, 0x0a, 0x72, 0x65, 0x61,
+  0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
+  0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
-  0x6e, 0x67, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20,
-  0x42, 0x41, 0x4d, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x66, 0x69,
-  0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73,
-  0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2d, 0x2d, 0x72, 0x75,
-  0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x41,
-  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x72, 0x6f,
-  0x6d, 0x42, 0x41, 0x4d, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x52, 0x65,
-  0x61, 0x64, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
-  0x73, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73,
-  0x49, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x61, 0x64, 0x31,
-  0x20, 0x52, 0x65, 0x61, 0x64, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
-  0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x70, 0x61,
-  0x74, 0x68, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73,
-  0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
-  0x6e, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64,
-  0x31, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x6e,
-  0x65, 0x65, 0x64, 0x65, 0x64, 0x2c, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64,
-  0x32, 0x29, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65,
-  0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29,
-  0x3a, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69,
-  0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
-  0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6f,
-  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20,
-  0x66, 0x69, 0x6c, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63,
-  0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c,
-  0x64, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x46,
-  0x41, 0x53, 0x54, 0x41, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x41, 0x53, 0x54,
-  0x51, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73,
-  0x65, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74,
-  0x64, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20,
-  0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x20, 0x7a, 0x63, 0x61,
-  0x74, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x63, 0x6f, 0x6d,
-  0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x2e, 0x67, 0x7a, 0x20, 0x66, 0x69,
-  0x6c, 0x65, 0x73, 0x2c, 0x20, 0x62, 0x7a, 0x63, 0x61, 0x74, 0x20, 0x2d,
-  0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65,
-  0x73, 0x73, 0x20, 0x2e, 0x62, 0x7a, 0x32, 0x20, 0x66, 0x69, 0x6c, 0x65,
-  0x73, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x0a, 0x0a, 0x72, 0x65, 0x61,
-  0x64, 0x4d, 0x61, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a,
-  0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72,
-  0x65, 0x61, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x70, 0x20,
-  0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x67,
-  0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61,
+  0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65,
+  0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65,
+  0x61, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69,
+  0x6e, 0x70, 0x75, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x20, 0x54,
+  0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20,
+  0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
+  0x61, 0x74, 0x65, 0x20, 0x46, 0x41, 0x53, 0x54, 0x41, 0x20, 0x6f, 0x72,
+  0x20, 0x46, 0x41, 0x53, 0x54, 0x51, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x20,
+  0x74, 0x6f, 0x20, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
+  0x3a, 0x20, 0x7a, 0x63, 0x61, 0x74, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x20,
+  0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x2e,
+  0x67, 0x7a, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x62, 0x7a,
+  0x63, 0x61, 0x74, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x63,
+  0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x2e, 0x62, 0x7a, 0x32,
+  0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x65, 0x74, 0x63, 0x2e,
+  0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x70, 0x4e, 0x75, 0x6d,
+  0x62, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+  0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74, 0x6f,
+  0x20, 0x6d, 0x61, 0x70, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x2d, 0x31, 0x3a, 0x20, 0x6d, 0x61, 0x70, 0x20,
+  0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x0a, 0x0a, 0x72,
+  0x65, 0x61, 0x64, 0x4d, 0x61, 0x74, 0x65, 0x73, 0x4c, 0x65, 0x6e, 0x67,
+  0x74, 0x68, 0x73, 0x49, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x4e, 0x6f, 0x74, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20,
+  0x45, 0x71, 0x75, 0x61, 0x6c, 0x2f, 0x4e, 0x6f, 0x74, 0x45, 0x71, 0x75,
+  0x61, 0x6c, 0x20, 0x2d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73,
+  0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x73, 0x65,
+  0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2c, 0x71, 0x75, 0x61, 0x6c,
+  0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x6f,
+  0x74, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x20, 0x2f,
+  0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d,
+  0x65, 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x20,
+  0x69, 0x73, 0x20, 0x73, 0x61, 0x66, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61,
+  0x6c, 0x6c, 0x20, 0x73, 0x69, 0x74, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x2e, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65,
+  0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a,
+  0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x28, 0x73,
+  0x29, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x61,
+  0x6d, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c,
+  0x6c, 0x20, 0x62, 0x65, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64,
+  0x20, 0x69, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x28,
+  0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x66,
+  0x74, 0x65, 0x72, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x69, 0x73,
+  0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x74, 0x72, 0x69, 0x6d,
+  0x6d, 0x65, 0x64, 0x29, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x70, 0x33, 0x70,
+  0x4e, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x73, 0x29, 0x3a,
+  0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x29, 0x20, 0x6f,
+  0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63,
+  0x6c, 0x69, 0x70, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x33, 0x70, 0x20,
+  0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65,
+  0x2e, 0x20, 0x49, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x76, 0x61, 0x6c,
+  0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x2c,
+  0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20,
+  0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x73, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74,
+  0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x63, 0x6c,
+  0x69, 0x70, 0x35, 0x70, 0x4e, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
-  0x31, 0x3a, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72,
-  0x65, 0x61, 0x64, 0x73, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61,
-  0x74, 0x65, 0x73, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x49, 0x6e,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f,
-  0x74, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
-  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x45, 0x71, 0x75, 0x61, 0x6c,
-  0x2f, 0x4e, 0x6f, 0x74, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x2d, 0x20,
-  0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6e,
-  0x61, 0x6d, 0x65, 0x73, 0x2c, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63,
-  0x65, 0x73, 0x2c, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73,
-  0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6d, 0x61,
-  0x74, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20,
-  0x73, 0x61, 0x6d, 0x65, 0x20, 0x20, 0x2f, 0x20, 0x6e, 0x6f, 0x74, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x2e, 0x20, 0x4e, 0x6f,
-  0x74, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x73, 0x61,
-  0x66, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x69,
-  0x74, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x72,
-  0x65, 0x61, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x70, 0x61, 0x72,
-  0x61, 0x74, 0x6f, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
-  0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x63, 0x68, 0x61, 0x72,
-  0x61, 0x63, 0x74, 0x65, 0x72, 0x28, 0x73, 0x29, 0x20, 0x73, 0x65, 0x70,
-  0x61, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20,
-  0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
-  0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x74,
-  0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20,
-  0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6f,
-  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x20,
-  0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x73,
-  0x70, 0x61, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x77, 0x61,
-  0x79, 0x73, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x29, 0x0a,
-  0x0a, 0x63, 0x6c, 0x69, 0x70, 0x33, 0x70, 0x4e, 0x62, 0x61, 0x73, 0x65,
-  0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x69, 0x6e, 0x74, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x6e, 0x75, 0x6d, 0x62,
-  0x65, 0x72, 0x28, 0x73, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x73,
-  0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x20, 0x66,
-  0x72, 0x6f, 0x6d, 0x20, 0x33, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x61,
-  0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20,
-  0x6f, 0x6e, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73,
-  0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77,
-  0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d,
-  0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20,
-  0x66, 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6d, 0x61, 0x74,
-  0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x70, 0x35, 0x70, 0x4e,
-  0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x73, 0x29, 0x3a, 0x20,
-  0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x29, 0x20, 0x6f, 0x66,
-  0x20, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c,
-  0x69, 0x70, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x35, 0x70, 0x20, 0x6f,
-  0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x2e,
-  0x20, 0x49, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75,
-  0x65, 0x20, 0x69, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x2c, 0x20,
-  0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61,
-  0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
-  0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74, 0x68,
-  0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x63, 0x6c, 0x69,
-  0x70, 0x33, 0x70, 0x41, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x53, 0x65,
-  0x71, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
-  0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x65,
-  0x72, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20,
+  0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x28, 0x73, 0x29, 0x3a, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28,
+  0x73, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20,
   0x74, 0x6f, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x20, 0x66, 0x72, 0x6f, 0x6d,
-  0x20, 0x33, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20,
-  0x6d, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6f, 0x6e,
+  0x20, 0x35, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20,
+  0x6d, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6f, 0x6e, 0x65,
+  0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x67, 0x69,
+  0x76, 0x65, 0x6e, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c,
+  0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x2e,
+  0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x70, 0x33, 0x70, 0x41, 0x64, 0x61, 0x70,
+  0x74, 0x65, 0x72, 0x53, 0x65, 0x71, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x61,
+  0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65,
+  0x6e, 0x63, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x69, 0x70,
+  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x33, 0x70, 0x20, 0x6f, 0x66, 0x20,
+  0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x20,
+  0x49, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+  0x20, 0x69, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x2c, 0x20, 0x69,
+  0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73,
+  0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61,
+  0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20,
+  0x6d, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x70,
+  0x33, 0x70, 0x41, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x4d, 0x4d, 0x70,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x30, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62,
+  0x6c, 0x65, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x70,
+  0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66,
+  0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20,
+  0x66, 0x6f, 0x72, 0x20, 0x33, 0x70, 0x20, 0x61, 0x64, 0x70, 0x61, 0x74,
+  0x65, 0x72, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20,
+  0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74,
+  0x65, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65,
+  0x6e, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62,
+  0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62,
+  0x6f, 0x74, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a,
+  0x63, 0x6c, 0x69, 0x70, 0x33, 0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x41,
+  0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x4e, 0x62, 0x61, 0x73, 0x65, 0x73,
+  0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+  0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x74, 0x6f,
+  0x20, 0x63, 0x6c, 0x69, 0x70, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x33,
+  0x70, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61,
+  0x74, 0x65, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6c, 0x69,
+  0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6f, 0x6e,
   0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x67,
   0x69, 0x76, 0x65, 0x6e, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c,
   0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64,
   0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f,
   0x72, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73,
-  0x2e, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x70, 0x33, 0x70, 0x41, 0x64, 0x61,
-  0x70, 0x74, 0x65, 0x72, 0x4d, 0x4d, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x31, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x28, 0x73, 0x29,
-  0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72,
-  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x73, 0x6d,
-  0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x33,
-  0x70, 0x20, 0x61, 0x64, 0x70, 0x61, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6c,
-  0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65,
-  0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x20, 0x49,
-  0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
-  0x69, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x2c, 0x20, 0x69, 0x74,
-  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x73,
-  0x75, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d,
-  0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6d,
-  0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x70, 0x33,
-  0x70, 0x41, 0x66, 0x74, 0x65, 0x72, 0x41, 0x64, 0x61, 0x70, 0x74, 0x65,
-  0x72, 0x4e, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x30,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x73, 0x29, 0x3a,
-  0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62,
-  0x61, 0x73, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x69, 0x70,
-  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x33, 0x70, 0x20, 0x6f, 0x66, 0x20,
-  0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x61, 0x66,
-  0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x61, 0x70,
-  0x74, 0x65, 0x72, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67,
-  0x2e, 0x20, 0x49, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x76, 0x61, 0x6c,
-  0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x2c,
-  0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20,
-  0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20,
-  0x73, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74,
-  0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0a, 0x23,
-  0x23, 0x23, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x0a, 0x0a, 0x6c,
-  0x69, 0x6d, 0x69, 0x74, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x47, 0x65,
-  0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x41, 0x4d, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x33, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d,
-  0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c,
-  0x61, 0x62, 0x6c, 0x65, 0x20, 0x52, 0x41, 0x4d, 0x20, 0x28, 0x62, 0x79,
-  0x74, 0x65, 0x73, 0x29, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x6e,
-  0x6f, 0x6d, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
-  0x6f, 0x6e, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x49, 0x4f, 0x62,
-  0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30,
-  0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30,
-  0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,
-  0x62, 0x6c, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20,
-  0x73, 0x69, 0x7a, 0x65, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29,
-  0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x6f,
-  0x75, 0x74, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x70, 0x65, 0x72, 0x20, 0x74,
-  0x68, 0x72, 0x65, 0x61, 0x64, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74,
-  0x4f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x61,
-  0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30,
-  0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30,
-  0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f,
-  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x72, 0x65,
-  0x63, 0x6f, 0x72, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x65,
-  0x20, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6d,
-  0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
-  0x3a, 0x20, 0x3e, 0x28, 0x32, 0x2a, 0x28, 0x4c, 0x65, 0x6e, 0x67, 0x74,
-  0x68, 0x4d, 0x61, 0x74, 0x65, 0x31, 0x2b, 0x4c, 0x65, 0x6e, 0x67, 0x74,
-  0x68, 0x4d, 0x61, 0x74, 0x65, 0x32, 0x2b, 0x31, 0x30, 0x30, 0x29, 0x2a,
-  0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x75, 0x6c,
-  0x74, 0x69, 0x6d, 0x61, 0x70, 0x4e, 0x6d, 0x61, 0x78, 0x0a, 0x0a, 0x6c,
-  0x69, 0x6d, 0x69, 0x74, 0x4f, 0x75, 0x74, 0x53, 0x4a, 0x6f, 0x6e, 0x65,
-  0x52, 0x65, 0x61, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2e, 0x0a, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x4c, 0x69, 0x6d, 0x69,
+  0x74, 0x73, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x47, 0x65, 0x6e,
+  0x6f, 0x6d, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52,
+  0x41, 0x4d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30,
+  0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20,
+  0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x52, 0x41,
+  0x4d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x67, 0x65, 0x6e,
+  0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x6c, 0x69, 0x6d,
+  0x69, 0x74, 0x49, 0x4f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69,
+  0x7a, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x35,
+  0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x61,
+  0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x62, 0x75, 0x66,
+  0x66, 0x65, 0x72, 0x73, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x28, 0x62,
+  0x79, 0x74, 0x65, 0x73, 0x29, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x6e,
+  0x70, 0x75, 0x74, 0x2f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2c, 0x20,
+  0x70, 0x65, 0x72, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x0a, 0x0a,
+  0x6c, 0x69, 0x6d, 0x69, 0x74, 0x4f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x6f,
+  0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x73,
+  0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53,
+  0x41, 0x4d, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2e, 0x20,
+  0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20,
+  0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x3e, 0x28, 0x32, 0x2a, 0x28,
+  0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x65, 0x31, 0x2b,
+  0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x65, 0x32, 0x2b,
+  0x31, 0x30, 0x30, 0x29, 0x2a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74,
+  0x65, 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x4e, 0x6d,
+  0x61, 0x78, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x4f, 0x75, 0x74,
+  0x53, 0x4a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78,
+  0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6a,
+  0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x6f, 0x6e, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x28, 0x69,
+  0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6c,
+  0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6d, 0x61, 0x70, 0x70, 0x65,
+  0x72, 0x73, 0x29, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x4f, 0x75,
+  0x74, 0x53, 0x4a, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30,
+  0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a,
+  0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64,
+  0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a,
+  0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x41, 0x4d, 0x73, 0x6f, 0x72, 0x74,
+  0x52, 0x41, 0x4d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75,
+  0x6d, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20,
+  0x52, 0x41, 0x4d, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x72, 0x74,
+  0x69, 0x6e, 0x67, 0x20, 0x42, 0x41, 0x4d, 0x2e, 0x20, 0x49, 0x66, 0x20,
+  0x3d, 0x30, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
+  0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x64,
+  0x65, 0x78, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2e, 0x20, 0x30, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x6c,
+  0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69,
+  0x74, 0x68, 0x20, 0x2d, 0x2d, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x4c,
+  0x6f, 0x61, 0x64, 0x20, 0x4e, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64,
+  0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f,
+  0x6e, 0x2e, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x53, 0x6a, 0x64,
+  0x62, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4e, 0x73, 0x6a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30,
+  0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d,
+  0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e,
+  0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20,
+  0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x6f,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x79, 0x20, 0x61, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67,
+  0x20, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c,
+  0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20,
+  0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x6f,
+  0x73, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20,
+  0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x31, 0x73, 0x74, 0x20, 0x73,
+  0x74, 0x65, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x32,
+  0x2d, 0x70, 0x61, 0x73, 0x73, 0x20, 0x72, 0x75, 0x6e, 0x0a, 0x0a, 0x0a,
+  0x23, 0x23, 0x23, 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x3a, 0x20,
+  0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x0a, 0x6f, 0x75, 0x74, 0x46,
+  0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69,
+  0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x2e, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
+  0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+  0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x28, 0x69, 0x6e, 0x63,
+  0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20,
+  0x6f, 0x72, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20,
+  0x70, 0x61, 0x74, 0x68, 0x29, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x6f,
+  0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e,
+  0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f,
+  0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x0a,
+  0x0a, 0x6f, 0x75, 0x74, 0x54, 0x6d, 0x70, 0x44, 0x69, 0x72, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x31, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
-  0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62,
-  0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69,
-  0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x65, 0x20,
-  0x72, 0x65, 0x61, 0x64, 0x20, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64,
-  0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74,
-  0x69, 0x2d, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x29, 0x0a, 0x0a,
-  0x6c, 0x69, 0x6d, 0x69, 0x74, 0x4f, 0x75, 0x74, 0x53, 0x4a, 0x63, 0x6f,
-  0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20,
-  0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f,
-  0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63,
-  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74,
-  0x42, 0x41, 0x4d, 0x73, 0x6f, 0x72, 0x74, 0x52, 0x41, 0x4d, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70,
+  0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x64, 0x69, 0x72,
+  0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64,
+  0x20, 0x61, 0x73, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72,
+  0x79, 0x20, 0x62, 0x79, 0x20, 0x53, 0x54, 0x41, 0x52, 0x2e, 0x20, 0x41,
+  0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x64, 0x69, 0x72, 0x65,
+  0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62,
+  0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x21, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x20, 0x64, 0x69,
+  0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x77, 0x69, 0x6c, 0x6c,
+  0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20,
+  0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x50,
+  0x72, 0x65, 0x66, 0x69, 0x78, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x74, 0x6d,
+  0x70, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x6d, 0x70, 0x4b, 0x65, 0x65,
+  0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e,
+  0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
+  0x6e, 0x67, 0x3a, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20,
+  0x74, 0x6f, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x74, 0x65, 0x6d, 0x70, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x20, 0x66,
+  0x69, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x53,
+  0x54, 0x41, 0x52, 0x20, 0x72, 0x75, 0x6e, 0x73, 0x20, 0x69, 0x73, 0x20,
+  0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a,
-  0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x76, 0x61,
-  0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x52, 0x41, 0x4d, 0x20, 0x66,
-  0x6f, 0x72, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x42,
-  0x41, 0x4d, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x3d, 0x30, 0x2c, 0x20, 0x69,
-  0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65,
-  0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e,
-  0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x73, 0x69,
-  0x7a, 0x65, 0x2e, 0x20, 0x30, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
-  0x63, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20,
-  0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2d, 0x2d,
-  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x4e,
-  0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72,
-  0x79, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x6c,
-  0x69, 0x6d, 0x69, 0x74, 0x53, 0x6a, 0x64, 0x62, 0x49, 0x6e, 0x73, 0x65,
-  0x72, 0x74, 0x4e, 0x73, 0x6a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x61,
-  0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
-  0x20, 0x6f, 0x66, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-  0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72,
-  0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67,
-  0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65,
-  0x20, 0x66, 0x6c, 0x79, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20,
-  0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, 0x61, 0x67,
-  0x65, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67,
-  0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20,
-  0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
-  0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x64, 0x65,
-  0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x31, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x6f,
-  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x32, 0x2d, 0x70, 0x61, 0x73, 0x73,
-  0x20, 0x72, 0x75, 0x6e, 0x0a, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x4f,
-  0x75, 0x74, 0x70, 0x75, 0x74, 0x3a, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72,
-  0x61, 0x6c, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61,
-  0x6d, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
-  0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
-  0x3a, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x69, 0x6c,
-  0x65, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66,
-  0x69, 0x78, 0x20, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e,
-  0x67, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65,
-  0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x29,
-  0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62,
-  0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x6f, 0x6e,
-  0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64,
-  0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54,
-  0x6d, 0x70, 0x44, 0x69, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
-  0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74,
-  0x6f, 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72,
-  0x79, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
-  0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x74,
-  0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x20, 0x62, 0x79, 0x20,
-  0x53, 0x54, 0x41, 0x52, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x63, 0x6f,
-  0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
-  0x69, 0x73, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79,
-  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d,
-  0x6f, 0x76, 0x65, 0x64, 0x21, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20,
-  0x74, 0x65, 0x6d, 0x70, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f,
-  0x72, 0x79, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61,
-  0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x46, 0x69,
-  0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78,
-  0x5f, 0x53, 0x54, 0x41, 0x52, 0x74, 0x6d, 0x70, 0x0a, 0x0a, 0x6f, 0x75,
-  0x74, 0x53, 0x74, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x67, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x77, 0x68,
-  0x69, 0x63, 0x68, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x77,
-  0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63,
-  0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x64, 0x6f, 0x75,
-  0x74, 0x20, 0x28, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-  0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x4c, 0x6f, 0x67, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x2e, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x6d, 0x65, 0x73, 0x73,
-  0x61, 0x67, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x53, 0x41, 0x4d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
-  0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x66, 0x6f,
-  0x72, 0x6d, 0x61, 0x74, 0x20, 0x28, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20,
-  0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x72, 0x65,
-  0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x41,
-  0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e, 0x6f, 0x75, 0x74, 0x2e, 0x73,
-  0x61, 0x6d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x2c, 0x20, 0x6e, 0x6f,
-  0x72, 0x6d, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-  0x64, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x77, 0x69, 0x6c,
-  0x6c, 0x20, 0x67, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x4c, 0x6f,
-  0x67, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x41, 0x4d, 0x5f, 0x55, 0x6e,
-  0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x69,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x2e, 0x2e,
+  0x2e, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x6c,
+  0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x20, 0x66,
+  0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x41, 0x6c, 0x6c, 0x20, 0x2e, 0x2e, 0x20, 0x6b, 0x65, 0x65, 0x70,
+  0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x0a,
+  0x6f, 0x75, 0x74, 0x53, 0x74, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x67, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20,
+  0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
+  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x72,
+  0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x64,
+  0x6f, 0x75, 0x74, 0x20, 0x28, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+  0x64, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x4c, 0x6f, 0x67, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x6d, 0x65,
+  0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
+  0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x53, 0x41, 0x4d, 0x20,
+  0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x28, 0x77, 0x68, 0x69, 0x63,
+  0x68, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61,
+  0x72, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f,
+  0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e, 0x6f, 0x75, 0x74,
+  0x2e, 0x73, 0x61, 0x6d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x2c, 0x20,
+  0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64,
+  0x61, 0x72, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x77,
+  0x69, 0x6c, 0x6c, 0x20, 0x67, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20,
+  0x4c, 0x6f, 0x67, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x6f, 0x75, 0x74, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x41, 0x4d, 0x5f,
+  0x55, 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e,
+  0x20, 0x42, 0x41, 0x4d, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c,
+  0x20, 0x75, 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x52,
+  0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x6f, 0x75,
+  0x74, 0x53, 0x41, 0x4d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x42, 0x41, 0x4d,
+  0x20, 0x55, 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x41, 0x4d, 0x5f, 0x53, 0x6f,
+  0x72, 0x74, 0x65, 0x64, 0x42, 0x79, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69,
+  0x6e, 0x61, 0x74, 0x65, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x69,
   0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x42,
   0x41, 0x4d, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x75,
   0x6e, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x71,
   0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x53,
-  0x41, 0x4d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x55,
-  0x6e, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x41, 0x4d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x53,
+  0x6f, 0x72, 0x74, 0x65, 0x64, 0x42, 0x79, 0x43, 0x6f, 0x6f, 0x72, 0x64,
+  0x69, 0x6e, 0x61, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x42, 0x41, 0x4d, 0x5f, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73,
+  0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20,
+  0x42, 0x41, 0x4d, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20,
+  0x75, 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x52, 0x65,
+  0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61,
+  0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73,
+  0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x53, 0x41, 0x4d, 0x0a,
+  0x0a, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x61, 0x64, 0x73, 0x55, 0x6e, 0x6d,
+  0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e,
+  0x65, 0x0a, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75,
+  0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20,
+  0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x6d, 0x61,
+  0x70, 0x70, 0x65, 0x64, 0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x6d,
+  0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f,
+  0x6e, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61,
+  0x20, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20,
+  0x69, 0x6e, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20,
+  0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x29, 0x2e, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x42, 0x41, 0x4d, 0x5f, 0x53, 0x6f, 0x72, 0x74,
-  0x65, 0x64, 0x42, 0x79, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61,
-  0x74, 0x65, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
-  0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x42, 0x41, 0x4d,
-  0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x75, 0x6e, 0x73,
-  0x6f, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69,
-  0x72, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d,
-  0x74, 0x79, 0x70, 0x65, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x53, 0x6f, 0x72,
-  0x74, 0x65, 0x64, 0x42, 0x79, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e,
-  0x61, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46,
+  0x61, 0x73, 0x74, 0x78, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f,
+  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x70,
+  0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, 0x73, 0x74, 0x61, 0x2f,
+  0x66, 0x61, 0x73, 0x74, 0x71, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c,
+  0x20, 0x55, 0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x2e, 0x6f, 0x75,
+  0x74, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x31, 0x2f, 0x32, 0x0a, 0x0a, 0x6f,
+  0x75, 0x74, 0x51, 0x53, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69,
+  0x6f, 0x6e, 0x41, 0x64, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x61, 0x64, 0x64, 0x20, 0x74, 0x68, 0x69,
+  0x73, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x20,
+  0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20,
+  0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x66,
+  0x72, 0x6f, 0x6d, 0x20, 0x49, 0x6c, 0x6c, 0x75, 0x6d, 0x69, 0x6e, 0x61,
+  0x20, 0x74, 0x6f, 0x20, 0x53, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2c, 0x20,
+  0x75, 0x73, 0x65, 0x20, 0x2d, 0x33, 0x31, 0x29, 0x0a, 0x0a, 0x6f, 0x75,
+  0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72,
+  0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x6c, 0x64, 0x5f, 0x32, 0x2e,
+  0x34, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+  0x3a, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6d,
+  0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
+  0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x42, 0x41, 0x4d, 0x5f, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
-  0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
-  0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72,
-  0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x42, 0x41,
-  0x4d, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x75, 0x6e,
-  0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x71, 0x75,
-  0x69, 0x72, 0x65, 0x73, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x6e, 0x74,
-  0x4d, 0x6f, 0x64, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72,
-  0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x53, 0x41, 0x4d, 0x0a, 0x0a, 0x6f,
-  0x75, 0x74, 0x52, 0x65, 0x61, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x61, 0x70,
-  0x70, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a,
-  0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x6f,
-  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x6e, 0x6d,
-  0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61,
-  0x72, 0x74, 0x69, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x70, 0x70,
-  0x65, 0x64, 0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x6d, 0x61, 0x70,
-  0x70, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65,
-  0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70,
-  0x61, 0x69, 0x72, 0x65, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x72, 0x65,
-  0x61, 0x64, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e,
-  0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x69,
-  0x6c, 0x65, 0x28, 0x73, 0x29, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x2e,
-  0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x61, 0x73,
-  0x74, 0x78, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74,
-  0x70, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72,
-  0x61, 0x74, 0x65, 0x20, 0x66, 0x61, 0x73, 0x74, 0x61, 0x2f, 0x66, 0x61,
-  0x73, 0x74, 0x71, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x55,
-  0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x2e, 0x6f, 0x75, 0x74, 0x2e,
-  0x6d, 0x61, 0x74, 0x65, 0x31, 0x2f, 0x32, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
-  0x51, 0x53, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
-  0x41, 0x64, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x69, 0x6e,
-  0x74, 0x3a, 0x20, 0x61, 0x64, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
-  0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x73, 0x63,
-  0x6f, 0x72, 0x65, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x74, 0x6f,
-  0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x66, 0x72, 0x6f,
-  0x6d, 0x20, 0x49, 0x6c, 0x6c, 0x75, 0x6d, 0x69, 0x6e, 0x61, 0x20, 0x74,
-  0x6f, 0x20, 0x53, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x2c, 0x20, 0x75, 0x73,
-  0x65, 0x20, 0x2d, 0x33, 0x31, 0x29, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x4d,
-  0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x4f, 0x72,
-  0x64, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x4f, 0x6c, 0x64, 0x5f, 0x32, 0x2e, 0x34, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20,
-  0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x75, 0x6c,
-  0x74, 0x69, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c,
-  0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66,
-  0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x4f, 0x6c, 0x64, 0x5f, 0x32, 0x2e, 0x34, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x71, 0x75, 0x61, 0x73, 0x69, 0x2d, 0x72, 0x61, 0x6e,
+  0x64, 0x6f, 0x6d, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x75, 0x73,
+  0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x32, 0x2e,
+  0x35, 0x2e, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72,
+  0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20,
+  0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72,
+  0x2e, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73,
+  0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x29, 0x20, 0x61, 0x72, 0x65,
+  0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x61, 0x64, 0x6a, 0x61,
+  0x63, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x65, 0x61, 0x63, 0x68, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x73, 0x74,
+  0x61, 0x79, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x2e,
+  0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6d, 0x65,
+  0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x72,
+  0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x23, 0x23,
+  0x23, 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x3a, 0x20, 0x53, 0x41,
+  0x4d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x41, 0x4d, 0x0a, 0x6f, 0x75,
+  0x74, 0x53, 0x41, 0x4d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x41, 0x4d, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x74,
+  0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42,
+  0x41, 0x4d, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x4f, 0x6c, 0x64, 0x5f, 0x32, 0x2e, 0x34, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
-  0x20, 0x71, 0x75, 0x61, 0x73, 0x69, 0x2d, 0x72, 0x61, 0x6e, 0x64, 0x6f,
-  0x6d, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x75, 0x73, 0x65, 0x64,
-  0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x32, 0x2e, 0x35, 0x2e,
-  0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x61,
-  0x6e, 0x64, 0x6f, 0x6d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x72, 0x61,
-  0x6e, 0x64, 0x6f, 0x6d, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f,
-  0x66, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
-  0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x75,
-  0x6c, 0x74, 0x69, 0x2d, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x2e, 0x20,
-  0x52, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x20, 0x28,
-  0x70, 0x61, 0x69, 0x72, 0x73, 0x29, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61,
-  0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x61, 0x64, 0x6a, 0x61, 0x63, 0x65,
-  0x6e, 0x74, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x69, 0x67,
-  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61,
-  0x63, 0x68, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x73, 0x74, 0x61, 0x79,
-  0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x2e, 0x20, 0x54,
-  0x68, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77,
-  0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x64,
-  0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x6c,
-  0x65, 0x61, 0x73, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20,
-  0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x3a, 0x20, 0x53, 0x41, 0x4d, 0x20,
-  0x61, 0x6e, 0x64, 0x20, 0x42, 0x41, 0x4d, 0x0a, 0x6f, 0x75, 0x74, 0x53,
-  0x41, 0x4d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x53, 0x41, 0x4d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x74, 0x79, 0x70,
-  0x65, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42, 0x41, 0x4d,
-  0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x73, 0x74, 0x20, 0x77, 0x6f,
+  0x72, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x31, 0x73, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64,
-  0x3a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42,
-  0x41, 0x4d, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74, 0x70,
-  0x75, 0x74, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,
-  0x75, 0x74, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x20,
+  0x42, 0x41, 0x4d, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74,
+  0x70, 0x75, 0x74, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x77, 0x69, 0x74, 0x68,
+  0x6f, 0x75, 0x74, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x20,
-  0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x53,
-  0x41, 0x4d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x73,
-  0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x41, 0x4d, 0x20,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20,
+  0x53, 0x41, 0x4d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20,
+  0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
-  0x6e, 0x6f, 0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42, 0x41, 0x4d, 0x20, 0x6f,
-  0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x6e, 0x6f, 0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42, 0x41, 0x4d, 0x20,
+  0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x32, 0x6e, 0x64, 0x2c, 0x20, 0x33, 0x72, 0x64, 0x3a, 0x20,
+  0x20, 0x20, 0x20, 0x32, 0x6e, 0x64, 0x2c, 0x20, 0x33, 0x72, 0x64, 0x3a,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x6e, 0x73,
@@ -880,527 +899,538 @@ unsigned char parametersDefault[] = {
   0x20, 0x20, 0x20, 0x20, 0x46, 0x75, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x6d, 0x6f, 0x64,
   0x65, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x6f, 0x75, 0x74,
-  0x70, 0x75, 0x74, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e,
-  0x6f, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20,
+  0x53, 0x41, 0x4d, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x75, 0x6c,
-  0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x53,
-  0x41, 0x4d, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x75, 0x6c, 0x6c, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x53, 0x41, 0x4d,
+  0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x51, 0x53, 0x20, 0x2e,
-  0x2e, 0x2e, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x53, 0x41, 0x4d, 0x20,
-  0x62, 0x75, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20,
-  0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x73, 0x63, 0x6f, 0x72,
-  0x65, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x73, 0x74,
-  0x72, 0x61, 0x6e, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x51, 0x53, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x62, 0x75,
+  0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x71, 0x75,
+  0x61, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73,
+  0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x73, 0x74, 0x72, 0x61,
+  0x6e, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x43, 0x75, 0x66,
-  0x66, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x2d, 0x6c, 0x69, 0x6b, 0x65, 0x20,
-  0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64,
-  0x20, 0x66, 0x6c, 0x61, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x43, 0x75, 0x66, 0x66, 0x6c,
+  0x69, 0x6e, 0x6b, 0x73, 0x2d, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x73, 0x74,
+  0x72, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x66,
+  0x6c, 0x61, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73,
-  0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
-  0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x6f, 0x74, 0x69, 0x66, 0x20, 0x2e,
-  0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65,
-  0x72, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74,
-  0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20, 0x6d, 0x6f,
-  0x74, 0x69, 0x66, 0x2e, 0x20, 0x52, 0x65, 0x61, 0x64, 0x73, 0x20, 0x77,
-  0x69, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73,
-  0x74, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20,
-  0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61,
-  0x6c, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72,
-  0x65, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x6f,
-  0x75, 0x74, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x61,
-  0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x61, 0x20,
-  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65,
-  0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x61, 0x74,
-  0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x6e,
-  0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x64,
-  0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74,
-  0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x53, 0x41,
-  0x4d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x48,
-  0x20, 0x48, 0x49, 0x20, 0x41, 0x53, 0x20, 0x6e, 0x4d, 0x20, 0x4e, 0x4d,
-  0x20, 0x4d, 0x44, 0x20, 0x6a, 0x4d, 0x20, 0x6a, 0x49, 0x20, 0x58, 0x53,
-  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x6f, 0x6d,
-  0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20,
-  0x61, 0x6e, 0x79, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
-  0x72, 0x64, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x4e, 0x48, 0x20,
-  0x48, 0x49, 0x20, 0x41, 0x53, 0x20, 0x6e, 0x4d, 0x20, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x4e, 0x48, 0x20,
-  0x48, 0x49, 0x20, 0x41, 0x53, 0x20, 0x6e, 0x4d, 0x20, 0x4e, 0x4d, 0x20,
-  0x4d, 0x44, 0x20, 0x6a, 0x4d, 0x20, 0x6a, 0x49, 0x0a, 0x20, 0x20, 0x20,
+  0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x73, 0x65, 0x64,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x72, 0x6f, 0x6e, 0x4d, 0x6f, 0x74, 0x69, 0x66, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x72, 0x69,
+  0x76, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x74, 0x69,
+  0x66, 0x2e, 0x20, 0x52, 0x65, 0x61, 0x64, 0x73, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65,
+  0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x6e, 0x6f,
+  0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20,
+  0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20,
+  0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74,
+  0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x61, 0x74, 0x74,
+  0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53,
+  0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x61, 0x20, 0x73, 0x74,
+  0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x73, 0x69,
+  0x72, 0x65, 0x64, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x61, 0x74, 0x74, 0x72,
+  0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x64, 0x65, 0x73,
+  0x69, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x53, 0x41, 0x4d, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x61,
-  0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x0a, 0x0a, 0x6f,
-  0x75, 0x74, 0x53, 0x41, 0x4d, 0x61, 0x74, 0x74, 0x72, 0x49, 0x48, 0x73,
-  0x74, 0x61, 0x72, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x76,
-  0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65,
-  0x20, 0x49, 0x48, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
-  0x65, 0x2e, 0x20, 0x30, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20,
-  0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
-  0x73, 0x6f, 0x6d, 0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72,
-  0x65, 0x61, 0x6d, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,
-  0x2c, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x43, 0x75,
-  0x66, 0x66, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x53,
-  0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x65, 0x2e, 0x0a, 0x0a, 0x6f,
-  0x75, 0x74, 0x53, 0x41, 0x4d, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65,
-  0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73,
-  0x29, 0x3a, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6f, 0x66,
-  0x20, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x72, 0x65,
-  0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53,
-  0x41, 0x4d, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x48, 0x20, 0x48,
+  0x49, 0x20, 0x41, 0x53, 0x20, 0x6e, 0x4d, 0x20, 0x4e, 0x4d, 0x20, 0x4d,
+  0x44, 0x20, 0x6a, 0x4d, 0x20, 0x6a, 0x49, 0x20, 0x58, 0x53, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69,
+  0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e,
+  0x79, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x73, 0x74, 0x20, 0x77, 0x6f,
-  0x72, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+  0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x4e, 0x48, 0x20, 0x48, 0x49,
+  0x20, 0x41, 0x53, 0x20, 0x6e, 0x4d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e,
-  0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x4e, 0x48, 0x20, 0x48, 0x49, 0x20,
+  0x41, 0x53, 0x20, 0x6e, 0x4d, 0x20, 0x4e, 0x4d, 0x20, 0x4d, 0x44, 0x20,
+  0x6a, 0x4d, 0x20, 0x6a, 0x49, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20,
-  0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x75,
-  0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64,
-  0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
-  0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x66, 0x69,
-  0x6c, 0x65, 0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x41, 0x6c, 0x69,
-  0x67, 0x6e, 0x65, 0x64, 0x2e, 0x6f, 0x75, 0x74, 0x2e, 0x73, 0x61, 0x6d,
-  0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x6e,
-  0x64, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x61, 0x74, 0x74, 0x72,
+  0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53,
+  0x41, 0x4d, 0x61, 0x74, 0x74, 0x72, 0x49, 0x48, 0x73, 0x74, 0x61, 0x72,
+  0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75,
+  0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x48,
+  0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2e, 0x20,
+  0x30, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71,
+  0x75, 0x69, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x73, 0x6f, 0x6d,
+  0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d,
+  0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x73,
+  0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x43, 0x75, 0x66, 0x66, 0x6c,
+  0x69, 0x6e, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x53, 0x74, 0x72, 0x69,
+  0x6e, 0x67, 0x54, 0x69, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53,
+  0x41, 0x4d, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20,
+  0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x6e,
+  0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73,
+  0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41, 0x4d, 0x20,
+  0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x4b, 0x65, 0x65, 0x70, 0x50, 0x61, 0x69, 0x72,
-  0x73, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64,
-  0x20, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x6d, 0x61,
-  0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20,
-  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61,
-  0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20,
-  0x6f, 0x66, 0x20, 0x75, 0x6e, 0x73, 0x72, 0x6f, 0x74, 0x65, 0x64, 0x20,
-  0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x6b, 0x65, 0x65, 0x70,
-  0x20, 0x69, 0x74, 0x20, 0x61, 0x64, 0x6a, 0x61, 0x63, 0x65, 0x6e, 0x74,
-  0x20, 0x74, 0x6f, 0x20, 0x69, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x70, 0x70,
-  0x65, 0x64, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x31, 0x73, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x3a,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e,
+  0x65, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x6f,
+  0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20,
-  0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6d, 0x75, 0x6c, 0x74,
-  0x69, 0x2d, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65,
-  0x61, 0x64, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x6f,
-  0x72, 0x64, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x50, 0x61, 0x69, 0x72, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65,
-  0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20,
-  0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41, 0x4d, 0x20,
-  0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x57, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x75, 0x6e, 0x6d, 0x61,
+  0x70, 0x70, 0x65, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x77,
+  0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61,
+  0x69, 0x6e, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20,
+  0x28, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65,
+  0x64, 0x2e, 0x6f, 0x75, 0x74, 0x2e, 0x73, 0x61, 0x6d, 0x29, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x6e, 0x64, 0x20, 0x77,
+  0x6f, 0x72, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x4b, 0x65, 0x65, 0x70, 0x50, 0x61, 0x69, 0x72, 0x73, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x20, 0x75, 0x6e,
+  0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20,
+  0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x61, 0x6c, 0x69,
+  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x2c,
+  0x20, 0x69, 0x6e, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20,
+  0x75, 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74,
+  0x70, 0x75, 0x74, 0x2c, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x20, 0x69, 0x74,
+  0x20, 0x61, 0x64, 0x6a, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f,
+  0x20, 0x69, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20,
+  0x6d, 0x61, 0x74, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x50, 0x61, 0x69, 0x72, 0x65, 0x64, 0x3a, 0x20, 0x6f,
-  0x6e, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x61, 0x66, 0x74, 0x65,
-  0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20,
-  0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x61, 0x69, 0x72,
-  0x65, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
-  0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x66, 0x66,
+  0x65, 0x63, 0x74, 0x73, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6d,
+  0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73,
+  0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x6f, 0x72, 0x64, 0x65,
+  0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61,
-  0x69, 0x72, 0x65, 0x64, 0x4b, 0x65, 0x65, 0x70, 0x49, 0x6e, 0x70, 0x75,
-  0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x6f, 0x6e, 0x65, 0x20,
+  0x69, 0x72, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
+  0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66,
+  0x20, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x6f, 0x75, 0x74,
+  0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x50, 0x61, 0x69, 0x72, 0x65, 0x64, 0x3a, 0x20, 0x6f, 0x6e, 0x65, 0x20,
   0x6d, 0x61, 0x74, 0x65, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74,
   0x68, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72,
   0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x20,
-  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73,
-  0x20, 0x6b, 0x65, 0x70, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61,
-  0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
-  0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x46, 0x41, 0x53, 0x54, 0x51,
-  0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53,
-  0x41, 0x4d, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x46, 0x6c, 0x61,
-  0x67, 0x09, 0x09, 0x4f, 0x6e, 0x65, 0x42, 0x65, 0x73, 0x74, 0x53, 0x63,
-  0x6f, 0x72, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
-  0x6e, 0x67, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x6c,
-  0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65,
-  0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20,
-  0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x2d, 0x20, 0x61, 0x6c,
-  0x6c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x6c,
-  0x6c, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20,
-  0x77, 0x69, 0x74, 0x68, 0x20, 0x30, 0x78, 0x31, 0x30, 0x30, 0x20, 0x62,
-  0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x4c,
-  0x41, 0x47, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4f,
-  0x6e, 0x65, 0x42, 0x65, 0x73, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x20,
-  0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65,
-  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77,
-  0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74,
-  0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72,
-  0x69, 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x41, 0x6c, 0x6c, 0x42, 0x65, 0x73, 0x74, 0x53, 0x63, 0x6f,
-  0x72, 0x65, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61,
-  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x69,
-  0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20,
-  0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x72,
-  0x69, 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41,
-  0x4d, 0x72, 0x65, 0x61, 0x64, 0x49, 0x44, 0x09, 0x09, 0x09, 0x53, 0x74,
-  0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
-  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
-  0x49, 0x44, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x20, 0x74, 0x79,
-  0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53,
-  0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
-  0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x28,
-  0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x29,
-  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x41,
-  0x53, 0x54, 0x78, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x49, 0x44, 0x20,
-  0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69,
-  0x6e, 0x67, 0x20, 0x2f, 0x31, 0x2c, 0x2f, 0x32, 0x20, 0x66, 0x72, 0x6f,
-  0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72,
-  0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
-  0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65,
-  0x78, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x41,
-  0x53, 0x54, 0x78, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x0a, 0x6f, 0x75,
-  0x74, 0x53, 0x41, 0x4d, 0x6d, 0x61, 0x70, 0x71, 0x55, 0x6e, 0x69, 0x71,
-  0x75, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x35,
-  0x35, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x30,
-  0x20, 0x74, 0x6f, 0x20, 0x32, 0x35, 0x35, 0x3a, 0x20, 0x74, 0x68, 0x65,
-  0x20, 0x4d, 0x41, 0x50, 0x51, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
-  0x66, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x6d,
-  0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53,
-  0x41, 0x4d, 0x66, 0x6c, 0x61, 0x67, 0x4f, 0x52, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x30, 0x20, 0x74, 0x6f, 0x20, 0x36,
-  0x35, 0x35, 0x33, 0x35, 0x3a, 0x20, 0x73, 0x61, 0x6d, 0x20, 0x46, 0x4c,
-  0x41, 0x47, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x62,
-  0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x4f, 0x52, 0x27, 0x64, 0x20,
-  0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61,
-  0x6c, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x46, 0x4c,
-  0x41, 0x47, 0x3d, 0x46, 0x4c, 0x41, 0x47, 0x20, 0x7c, 0x20, 0x6f, 0x75,
-  0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61, 0x67, 0x4f, 0x52, 0x2e, 0x20,
-  0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x70, 0x70, 0x6c,
-  0x69, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6c,
-  0x6c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65,
-  0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79,
-  0x20, 0x53, 0x54, 0x41, 0x52, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61,
-  0x66, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x66,
-  0x6c, 0x61, 0x67, 0x41, 0x4e, 0x44, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20,
-  0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73,
-  0x65, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20,
-  0x62, 0x69, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72,
-  0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x74,
-  0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75,
-  0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61, 0x67, 0x41, 0x4e, 0x44, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x36, 0x35,
-  0x35, 0x33, 0x35, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a,
-  0x20, 0x30, 0x20, 0x74, 0x6f, 0x20, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3a,
-  0x20, 0x73, 0x61, 0x6d, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x20, 0x77, 0x69,
-  0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x62, 0x69, 0x74, 0x77, 0x69, 0x73,
-  0x65, 0x20, 0x41, 0x4e, 0x44, 0x27, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68,
-  0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c,
-  0x20, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x3d, 0x46,
-  0x4c, 0x41, 0x47, 0x20, 0x26, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d,
-  0x66, 0x6c, 0x61, 0x67, 0x4f, 0x52, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73,
-  0x20, 0x69, 0x73, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20,
-  0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x6c,
-  0x61, 0x67, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65,
-  0x6e, 0x20, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x53, 0x54, 0x41,
-  0x52, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72,
-  0x65, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61, 0x67,
-  0x4f, 0x52, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75,
-  0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x73, 0x65, 0x74,
-  0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x62, 0x69,
-  0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20,
-  0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x74, 0x68, 0x65,
-  0x72, 0x77, 0x69, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53,
-  0x41, 0x4d, 0x61, 0x74, 0x74, 0x72, 0x52, 0x47, 0x6c, 0x69, 0x6e, 0x65,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a,
-  0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42, 0x41, 0x4d, 0x20, 0x72, 0x65, 0x61,
-  0x64, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6c, 0x69, 0x6e, 0x65,
-  0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20,
-  0x77, 0x6f, 0x72, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e,
-  0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x67,
-  0x72, 0x6f, 0x75, 0x70, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66,
-  0x69, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74,
-  0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
-  0x22, 0x49, 0x44, 0x3a, 0x22, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20,
-  0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x61, 0x74, 0x74, 0x72,
-  0x52, 0x47, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x44, 0x3a, 0x78, 0x78,
-  0x78, 0x20, 0x43, 0x4e, 0x3a, 0x79, 0x79, 0x20, 0x22, 0x44, 0x53, 0x3a,
-  0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x22, 0x2e, 0x20, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x78, 0x78,
-  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x64,
-  0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x52, 0x47, 0x20, 0x74, 0x61, 0x67,
-  0x20, 0x74, 0x6f, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6f, 0x75, 0x74,
-  0x70, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
-  0x74, 0x2e, 0x20, 0x41, 0x6e, 0x79, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65,
-  0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x67,
-  0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65,
-  0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c,
-  0x65, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f,
-  0x6d, 0x6d, 0x61, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65,
-  0x64, 0x20, 0x52, 0x47, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x63,
-  0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f,
-  0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x28,
-  0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61,
-  0x74, 0x65, 0x64, 0x29, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x66,
-  0x69, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x2d, 0x2d, 0x72, 0x65,
-  0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x49, 0x6e, 0x2e, 0x20, 0x43,
-  0x6f, 0x6d, 0x6d, 0x61, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74,
-  0x6f, 0x20, 0x62, 0x65, 0x20, 0x73, 0x75, 0x72, 0x72, 0x6f, 0x75, 0x6e,
-  0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65,
-  0x73, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6f, 0x75,
-  0x74, 0x53, 0x41, 0x4d, 0x61, 0x74, 0x74, 0x72, 0x52, 0x47, 0x6c, 0x69,
-  0x6e, 0x65, 0x20, 0x49, 0x44, 0x3a, 0x78, 0x78, 0x78, 0x20, 0x2c, 0x20,
-  0x49, 0x44, 0x3a, 0x7a, 0x7a, 0x7a, 0x20, 0x22, 0x44, 0x53, 0x3a, 0x7a,
-  0x20, 0x7a, 0x22, 0x20, 0x2c, 0x20, 0x49, 0x44, 0x3a, 0x79, 0x79, 0x79,
-  0x20, 0x44, 0x53, 0x3a, 0x79, 0x79, 0x79, 0x79, 0x0a, 0x0a, 0x6f, 0x75,
-  0x74, 0x53, 0x41, 0x4d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x44,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x69, 0x72, 0x65,
+  0x64, 0x4b, 0x65, 0x65, 0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x4f, 0x72,
+  0x64, 0x65, 0x72, 0x3a, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x74,
+  0x65, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c,
+  0x6c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x69,
+  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x6b, 0x65,
+  0x70, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20,
+  0x61, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e,
+  0x70, 0x75, 0x74, 0x20, 0x46, 0x41, 0x53, 0x54, 0x51, 0x20, 0x66, 0x69,
+  0x6c, 0x65, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x70,
+  0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x46, 0x6c, 0x61, 0x67, 0x09, 0x09,
+  0x4f, 0x6e, 0x65, 0x42, 0x65, 0x73, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+  0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6f,
+  0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69,
+  0x6d, 0x61, 0x72, 0x79, 0x20, 0x2d, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f,
+  0x74, 0x68, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62,
+  0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x20, 0x30, 0x78, 0x31, 0x30, 0x30, 0x20, 0x62, 0x69, 0x74, 0x20,
+  0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x6e, 0x65, 0x42,
+  0x65, 0x73, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x73, 0x63,
+  0x6f, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x61,
+  0x72, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41,
+  0x6c, 0x6c, 0x42, 0x65, 0x73, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x73, 0x63, 0x6f,
+  0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x61,
+  0x72, 0x79, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x72, 0x65,
+  0x61, 0x64, 0x49, 0x44, 0x09, 0x09, 0x09, 0x53, 0x74, 0x61, 0x6e, 0x64,
+  0x61, 0x72, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
+  0x6e, 0x67, 0x3a, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x49, 0x44, 0x20,
+  0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x61, 0x6e,
+  0x64, 0x61, 0x72, 0x64, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x69, 0x72,
+  0x73, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x28, 0x75, 0x6e, 0x74,
+  0x69, 0x6c, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x29, 0x20, 0x66, 0x72,
+  0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x41, 0x53, 0x54, 0x78,
+  0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x49, 0x44, 0x20, 0x6c, 0x69, 0x6e,
+  0x65, 0x2c, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20,
+  0x2f, 0x31, 0x2c, 0x2f, 0x32, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x20, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x75, 0x6d,
+  0x62, 0x65, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20,
+  0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x41, 0x53, 0x54, 0x78,
+  0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41,
+  0x4d, 0x6d, 0x61, 0x70, 0x71, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x35, 0x35, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x30, 0x20, 0x74, 0x6f,
+  0x20, 0x32, 0x35, 0x35, 0x3a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x41,
+  0x50, 0x51, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70,
+  0x65, 0x72, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x66,
+  0x6c, 0x61, 0x67, 0x4f, 0x52, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x3a, 0x20, 0x30, 0x20, 0x74, 0x6f, 0x20, 0x36, 0x35, 0x35, 0x33,
+  0x35, 0x3a, 0x20, 0x73, 0x61, 0x6d, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x20,
+  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x62, 0x69, 0x74, 0x77,
+  0x69, 0x73, 0x65, 0x20, 0x4f, 0x52, 0x27, 0x64, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+  0x2c, 0x20, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x3d,
+  0x46, 0x4c, 0x41, 0x47, 0x20, 0x7c, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x41,
+  0x4d, 0x66, 0x6c, 0x61, 0x67, 0x4f, 0x52, 0x2e, 0x20, 0x54, 0x68, 0x69,
+  0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64,
+  0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66,
+  0x6c, 0x61, 0x67, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65,
+  0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x53, 0x54,
+  0x41, 0x52, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x66, 0x74, 0x65,
+  0x72, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61, 0x67,
+  0x41, 0x4e, 0x44, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20,
+  0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x20,
+  0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x62, 0x69, 0x74,
+  0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e,
+  0x6f, 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72,
+  0x77, 0x69, 0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41,
+  0x4d, 0x66, 0x6c, 0x61, 0x67, 0x41, 0x4e, 0x44, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x36, 0x35, 0x35, 0x33, 0x35,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x30, 0x20,
+  0x74, 0x6f, 0x20, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3a, 0x20, 0x73, 0x61,
+  0x6d, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
+  0x62, 0x65, 0x20, 0x62, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x41,
+  0x4e, 0x44, 0x27, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68,
+  0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x2e,
+  0x65, 0x2e, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x3d, 0x46, 0x4c, 0x41, 0x47,
+  0x20, 0x26, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61,
+  0x67, 0x4f, 0x52, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
+  0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74,
+  0x65, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73,
+  0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x73,
+  0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x53, 0x54, 0x41, 0x52, 0x2c, 0x20,
+  0x62, 0x75, 0x74, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6f,
+  0x75, 0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61, 0x67, 0x4f, 0x52, 0x2e,
+  0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64,
+  0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x73, 0x70,
+  0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x62, 0x69, 0x74, 0x73, 0x20,
+  0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74,
+  0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69,
+  0x73, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x61,
+  0x74, 0x74, 0x72, 0x52, 0x47, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x53, 0x41,
+  0x4d, 0x2f, 0x42, 0x41, 0x4d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x67,
+  0x72, 0x6f, 0x75, 0x70, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x20, 0x54,
+  0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x77, 0x6f, 0x72,
+  0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x67, 0x72, 0x6f, 0x75,
+  0x70, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x73, 0x74,
+  0x61, 0x72, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x22, 0x49, 0x44,
+  0x3a, 0x22, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x2d, 0x2d, 0x6f,
+  0x75, 0x74, 0x53, 0x41, 0x4d, 0x61, 0x74, 0x74, 0x72, 0x52, 0x47, 0x6c,
+  0x69, 0x6e, 0x65, 0x20, 0x49, 0x44, 0x3a, 0x78, 0x78, 0x78, 0x20, 0x43,
+  0x4e, 0x3a, 0x79, 0x79, 0x20, 0x22, 0x44, 0x53, 0x3a, 0x7a, 0x20, 0x7a,
+  0x20, 0x7a, 0x22, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x78, 0x78, 0x78, 0x20, 0x77, 0x69, 0x6c,
+  0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x61,
+  0x73, 0x20, 0x52, 0x47, 0x20, 0x74, 0x61, 0x67, 0x20, 0x74, 0x6f, 0x20,
+  0x65, 0x61, 0x63, 0x68, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x41,
+  0x6e, 0x79, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x69, 0x6e,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x67, 0x20, 0x76, 0x61, 0x6c,
+  0x75, 0x65, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20,
+  0x62, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x71, 0x75,
+  0x6f, 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x20,
+  0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x52, 0x47,
+  0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65,
+  0x73, 0x70, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x66,
+  0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d,
+  0x61, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x29,
+  0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73,
+  0x20, 0x69, 0x6e, 0x20, 0x2d, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69,
+  0x6c, 0x65, 0x73, 0x49, 0x6e, 0x2e, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61,
+  0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65,
+  0x20, 0x73, 0x75, 0x72, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x65,
+  0x2e, 0x67, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d,
+  0x61, 0x74, 0x74, 0x72, 0x52, 0x47, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x49,
+  0x44, 0x3a, 0x78, 0x78, 0x78, 0x20, 0x2c, 0x20, 0x49, 0x44, 0x3a, 0x7a,
+  0x7a, 0x7a, 0x20, 0x22, 0x44, 0x53, 0x3a, 0x7a, 0x20, 0x7a, 0x22, 0x20,
+  0x2c, 0x20, 0x49, 0x44, 0x3a, 0x79, 0x79, 0x79, 0x20, 0x44, 0x53, 0x3a,
+  0x79, 0x79, 0x79, 0x79, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d,
+  0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x44, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x40, 0x48, 0x44,
+  0x20, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x6c, 0x69,
+  0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41,
+  0x4d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x0a, 0x6f, 0x75,
+  0x74, 0x53, 0x41, 0x4d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x47,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a,
   0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a,
-  0x20, 0x40, 0x48, 0x44, 0x20, 0x28, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72,
-  0x29, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72,
-  0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x68, 0x65, 0x61, 0x64,
-  0x65, 0x72, 0x50, 0x47, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
-  0x6e, 0x67, 0x73, 0x3a, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x40,
-  0x50, 0x47, 0x20, 0x28, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65,
-  0x29, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72,
-  0x20, 0x28, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f,
-  0x6e, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x54, 0x41, 0x52, 0x29, 0x0a, 0x0a,
-  0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72,
-  0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x20,
-  0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
-  0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
-  0x40, 0x43, 0x4f, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74,
-  0x29, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74,
-  0x68, 0x65, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65,
-  0x72, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x66, 0x69, 0x6c,
-  0x74, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x66,
-  0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75,
-  0x74, 0x70, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x6d, 0x61,
-  0x69, 0x6e, 0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42, 0x41, 0x4d, 0x20, 0x66,
-  0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x4b, 0x65, 0x65, 0x70, 0x4f, 0x6e, 0x6c,
-  0x79, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
-  0x6e, 0x63, 0x65, 0x73, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x6e, 0x6c,
-  0x79, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72,
-  0x65, 0x61, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69,
-  0x63, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
-  0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x6f,
-  0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x72,
-  0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x73, 0x65, 0x71,
-  0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64,
-  0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2d, 0x2d, 0x67, 0x65, 0x6e, 0x6f,
-  0x6d, 0x65, 0x46, 0x61, 0x73, 0x74, 0x61, 0x46, 0x69, 0x6c, 0x65, 0x73,
-  0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70,
-  0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x0a,
-  0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x6d, 0x75, 0x6c, 0x74, 0x4e, 0x6d,
-  0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20,
-  0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f,
-  0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x61,
-  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x6f,
-  0x72, 0x20, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x68, 0x61,
-  0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75,
-  0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20,
-  0x53, 0x41, 0x4d, 0x2f, 0x42, 0x41, 0x4d, 0x20, 0x66, 0x69, 0x6c, 0x65,
-  0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x2d, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c,
-  0x6c, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
-  0x20, 0x28, 0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x2d, 0x2d, 0x6f, 0x75,
-  0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69,
-  0x6d, 0x61, 0x70, 0x4e, 0x6d, 0x61, 0x78, 0x29, 0x20, 0x77, 0x69, 0x6c,
-  0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a,
-  0x0a, 0x6f, 0x75, 0x74, 0x42, 0x41, 0x4d, 0x63, 0x6f, 0x6d, 0x70, 0x72,
-  0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20,
-  0x2d, 0x31, 0x20, 0x74, 0x6f, 0x20, 0x31, 0x30, 0x20, 0x20, 0x42, 0x41,
-  0x4d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f,
-  0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2c, 0x20, 0x2d, 0x31, 0x3d,
-  0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70,
-  0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x36, 0x3f, 0x29,
-  0x2c, 0x20, 0x30, 0x3d, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72,
-  0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x30, 0x3d, 0x6d,
-  0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72,
-  0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x42,
-  0x41, 0x4d, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x72,
-  0x65, 0x61, 0x64, 0x4e, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x3e, 0x3d, 0x30, 0x3a, 0x20,
-  0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
-  0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x42, 0x41,
-  0x4d, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x30,
-  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
-  0x74, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x36, 0x2c, 0x2d,
-  0x2d, 0x72, 0x75, 0x6e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x4e, 0x29,
-  0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x70,
-  0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x0a, 0x0a, 0x62,
-  0x61, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x75, 0x70, 0x6c,
-  0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x54, 0x79, 0x70, 0x65, 0x20, 0x20,
-  0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
-  0x3a, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x64, 0x75, 0x70, 0x6c, 0x69,
-  0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
-  0x20, 0x42, 0x41, 0x4d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x66,
-  0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20,
-  0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73,
-  0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x66, 0x65,
-  0x65, 0x64, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x69, 0x6e,
-  0x70, 0x75, 0x74, 0x42, 0x41, 0x4d, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20,
+  0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x40, 0x50, 0x47, 0x20, 0x28,
+  0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x29, 0x20, 0x6c, 0x69,
+  0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41,
+  0x4d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x28, 0x69, 0x6e,
+  0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f,
+  0x20, 0x53, 0x54, 0x41, 0x52, 0x29, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53,
+  0x41, 0x4d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d,
+  0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x2d, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x61,
+  0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69,
+  0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x40, 0x43, 0x4f, 0x20,
+  0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x6c, 0x69,
+  0x6e, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53,
+  0x41, 0x4d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x0a, 0x6f,
+  0x75, 0x74, 0x53, 0x41, 0x4d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e,
+  0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
+  0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65,
+  0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
+  0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x53,
+  0x41, 0x4d, 0x2f, 0x42, 0x41, 0x4d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
+  0x20, 0x4b, 0x65, 0x65, 0x70, 0x4f, 0x6e, 0x6c, 0x79, 0x41, 0x64, 0x64,
+  0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6b, 0x65,
+  0x65, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73,
+  0x20, 0x66, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61,
+  0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+  0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+  0x65, 0x6e, 0x63, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63,
+  0x65, 0x73, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x20, 0x2d, 0x2d, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x46, 0x61,
+  0x73, 0x74, 0x61, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x74, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20,
+  0x73, 0x74, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4b, 0x65, 0x65, 0x70, 0x41,
+  0x6c, 0x6c, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72,
+  0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x20, 0x6b,
+  0x65, 0x65, 0x70, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x72, 0x65, 0x66, 0x65,
+  0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e,
+  0x63, 0x65, 0x73, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x77, 0x69,
+  0x74, 0x68, 0x20, 0x2d, 0x2d, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x46,
+  0x61, 0x73, 0x74, 0x61, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67,
+  0x20, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2e, 0x0a, 0x0a, 0x0a, 0x6f, 0x75,
+  0x74, 0x53, 0x41, 0x4d, 0x6d, 0x75, 0x6c, 0x74, 0x4e, 0x6d, 0x61, 0x78,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x31,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6d, 0x61,
+  0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20,
+  0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x69,
+  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41,
+  0x4d, 0x2f, 0x42, 0x41, 0x4d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x64, 0x75,
-  0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f,
-  0x76, 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69,
-  0x63, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6d, 0x61, 0x72, 0x6b,
-  0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61,
-  0x70, 0x70, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64,
-  0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x75, 0x6e, 0x69,
-  0x71, 0x75, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e,
-  0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e,
-  0x61, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x2c, 0x20,
-  0x43, 0x49, 0x47, 0x41, 0x52, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62,
-  0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x0a,
-  0x0a, 0x62, 0x61, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x75,
-  0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x74, 0x65,
-  0x32, 0x62, 0x61, 0x73, 0x65, 0x73, 0x4e, 0x20, 0x20, 0x20, 0x30, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6e,
-  0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x73,
-  0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20,
-  0x35, 0x27, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x32,
-  0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63,
-  0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x65,
-  0x2e, 0x67, 0x2e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x52, 0x41, 0x4d, 0x50,
-  0x41, 0x47, 0x45, 0x29, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x4f, 0x75,
-  0x74, 0x70, 0x75, 0x74, 0x20, 0x57, 0x69, 0x67, 0x67, 0x6c, 0x65, 0x0a,
-  0x6f, 0x75, 0x74, 0x57, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28,
-  0x73, 0x29, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20,
+  0x20, 0x2d, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x6c, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x28,
+  0x75, 0x70, 0x20, 0x74, 0x6f, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x46,
+  0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61,
+  0x70, 0x4e, 0x6d, 0x61, 0x78, 0x29, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
+  0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x0a, 0x6f,
+  0x75, 0x74, 0x42, 0x41, 0x4d, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73,
+  0x73, 0x69, 0x6f, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x2d, 0x31,
+  0x20, 0x74, 0x6f, 0x20, 0x31, 0x30, 0x20, 0x20, 0x42, 0x41, 0x4d, 0x20,
+  0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20,
+  0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2c, 0x20, 0x2d, 0x31, 0x3d, 0x64, 0x65,
+  0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65,
+  0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x36, 0x3f, 0x29, 0x2c, 0x20,
+  0x30, 0x3d, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73,
+  0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x30, 0x3d, 0x6d, 0x61, 0x78,
+  0x69, 0x6d, 0x75, 0x6d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73,
+  0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x42, 0x41, 0x4d,
+  0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x72, 0x65, 0x61,
+  0x64, 0x4e, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6e, 0x75,
+  0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65,
+  0x61, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x42, 0x41, 0x4d, 0x20,
+  0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x30, 0x20, 0x77,
+  0x69, 0x6c, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20,
+  0x74, 0x6f, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x36, 0x2c, 0x2d, 0x2d, 0x72,
+  0x75, 0x6e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x4e, 0x29, 0x2e, 0x0a,
+  0x0a, 0x23, 0x23, 0x23, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x70, 0x72, 0x6f,
+  0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x0a, 0x0a, 0x62, 0x61, 0x6d,
+  0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63,
+  0x61, 0x74, 0x65, 0x73, 0x54, 0x79, 0x70, 0x65, 0x20, 0x20, 0x2d, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20,
+  0x6d, 0x61, 0x72, 0x6b, 0x20, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61,
+  0x74, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42,
+  0x41, 0x4d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x6e, 0x6f, 0x77, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f,
+  0x72, 0x6b, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x6f, 0x72,
+  0x74, 0x65, 0x64, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x66, 0x65, 0x65, 0x64,
+  0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x70, 0x75,
+  0x74, 0x42, 0x41, 0x4d, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x64, 0x75, 0x70, 0x6c,
+  0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61,
+  0x6c, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x6e,
+  0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61,
+  0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x61,
+  0x6c, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x70,
+  0x65, 0x72, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x75, 0x70,
+  0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75,
+  0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x54,
+  0x68, 0x65, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74,
+  0x65, 0x73, 0x2c, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x2c, 0x20, 0x43, 0x49,
+  0x47, 0x41, 0x52, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20,
+  0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x0a, 0x0a, 0x62,
+  0x61, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x75, 0x70, 0x6c,
+  0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x74, 0x65, 0x32, 0x62,
+  0x61, 0x73, 0x65, 0x73, 0x4e, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6e, 0x75, 0x6d,
+  0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x73,
+  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x35, 0x27,
+  0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x74,
+  0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6c,
+  0x6c, 0x61, 0x70, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x65, 0x2e, 0x67,
+  0x2e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x52, 0x41, 0x4d, 0x50, 0x41, 0x47,
+  0x45, 0x29, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x4f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x20, 0x57, 0x69, 0x67, 0x67, 0x6c, 0x65, 0x0a, 0x6f, 0x75,
+  0x74, 0x57, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29,
+  0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69,
+  0x67, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2c,
+  0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x22, 0x62, 0x65, 0x64, 0x47, 0x72,
+  0x61, 0x70, 0x68, 0x22, 0x20, 0x4f, 0x52, 0x20, 0x22, 0x62, 0x65, 0x64,
+  0x47, 0x72, 0x61, 0x70, 0x68, 0x20, 0x72, 0x65, 0x61, 0x64, 0x31, 0x5f,
+  0x35, 0x70, 0x22, 0x2e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+  0x73, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x42, 0x41, 0x4d,
+  0x3a, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x74, 0x79,
+  0x70, 0x65, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x53, 0x6f, 0x72, 0x74, 0x65,
+  0x64, 0x42, 0x79, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74,
+  0x65, 0x20, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x31, 0x73, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20,
   0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
-  0x74, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x22, 0x62, 0x65, 0x64,
-  0x47, 0x72, 0x61, 0x70, 0x68, 0x22, 0x20, 0x4f, 0x52, 0x20, 0x22, 0x62,
-  0x65, 0x64, 0x47, 0x72, 0x61, 0x70, 0x68, 0x20, 0x72, 0x65, 0x61, 0x64,
-  0x31, 0x5f, 0x35, 0x70, 0x22, 0x2e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69,
-  0x72, 0x65, 0x73, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x42,
-  0x41, 0x4d, 0x3a, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d,
-  0x74, 0x79, 0x70, 0x65, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x53, 0x6f, 0x72,
-  0x74, 0x65, 0x64, 0x42, 0x79, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e,
-  0x61, 0x74, 0x65, 0x20, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x31, 0x73, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e,
-  0x6f, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74,
-  0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x62, 0x65, 0x64, 0x47, 0x72, 0x61, 0x70, 0x68, 0x20, 0x20, 0x20, 0x2e,
-  0x2e, 0x2e, 0x20, 0x62, 0x65, 0x64, 0x47, 0x72, 0x61, 0x70, 0x68, 0x20,
-  0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x77, 0x69, 0x67, 0x67, 0x6c,
-  0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x72,
-  0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72,
-  0x65, 0x61, 0x64, 0x31, 0x5f, 0x35, 0x70, 0x20, 0x20, 0x20, 0x2e, 0x2e,
-  0x2e, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x6f,
-  0x6d, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x35, 0x27, 0x20, 0x6f, 0x66,
-  0x20, 0x74, 0x68, 0x65, 0x20, 0x31, 0x73, 0x74, 0x20, 0x72, 0x65, 0x61,
-  0x64, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x66, 0x6f,
-  0x72, 0x20, 0x43, 0x41, 0x47, 0x45, 0x2f, 0x52, 0x41, 0x4d, 0x50, 0x41,
-  0x47, 0x45, 0x20, 0x65, 0x74, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x32, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c,
-  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x32,
-  0x6e, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x0a, 0x6f, 0x75, 0x74, 0x57, 0x69, 0x67, 0x53,
-  0x74, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x53, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x73, 0x74,
-  0x72, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x20, 0x6f,
-  0x66, 0x20, 0x77, 0x69, 0x67, 0x67, 0x6c, 0x65, 0x2f, 0x62, 0x65, 0x64,
-  0x47, 0x72, 0x61, 0x70, 0x68, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x72,
-  0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
-  0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x73, 0x74,
-  0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x31, 0x20,
-  0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x72, 0x32, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x6e,
-  0x64, 0x65, 0x64, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x20, 0x63, 0x6f, 0x6c,
-  0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x20, 0x73, 0x74, 0x72, 0x61, 0x6e,
-  0x64, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x57, 0x69, 0x67, 0x52, 0x65,
-  0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x50, 0x72, 0x65, 0x66,
-  0x69, 0x78, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x72, 0x65, 0x66,
-  0x69, 0x78, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20,
-  0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6e, 0x61,
-  0x6d, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75,
-  0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75,
-  0x74, 0x70, 0x75, 0x74, 0x20, 0x77, 0x69, 0x67, 0x67, 0x6c, 0x65, 0x20,
-  0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x22,
-  0x63, 0x68, 0x72, 0x22, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
-  0x74, 0x20, 0x22, 0x2d, 0x22, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x63, 0x6c,
-  0x75, 0x64, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x66, 0x65,
-  0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x0a, 0x20, 0x0a, 0x6f, 0x75, 0x74,
+  0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x65,
+  0x64, 0x47, 0x72, 0x61, 0x70, 0x68, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x62, 0x65, 0x64, 0x47, 0x72, 0x61, 0x70, 0x68, 0x20, 0x66, 0x6f,
+  0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x77, 0x69, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x77, 0x69, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x66,
+  0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x32, 0x6e, 0x64, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64,
+  0x31, 0x5f, 0x35, 0x70, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x73,
+  0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f,
+  0x6e, 0x6c, 0x79, 0x20, 0x35, 0x27, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x31, 0x73, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20,
+  0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x43,
+  0x41, 0x47, 0x45, 0x2f, 0x52, 0x41, 0x4d, 0x50, 0x41, 0x47, 0x45, 0x20,
+  0x65, 0x74, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x32, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x72,
+  0x6f, 0x6d, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x32, 0x6e, 0x64, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x57, 0x69, 0x67,
+  0x53, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x53, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x73,
+  0x74, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x73, 0x20,
+  0x6f, 0x66, 0x20, 0x77, 0x69, 0x67, 0x67, 0x6c, 0x65, 0x2f, 0x62, 0x65,
+  0x64, 0x47, 0x72, 0x61, 0x70, 0x68, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
+  0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74,
+  0x72, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x73,
+  0x74, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x31,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x72, 0x32, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x6e, 0x73, 0x74, 0x72, 0x61,
+  0x6e, 0x64, 0x65, 0x64, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x20, 0x63, 0x6f,
+  0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x20, 0x73, 0x74, 0x72, 0x61,
+  0x6e, 0x64, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x57, 0x69, 0x67, 0x52,
+  0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x50, 0x72, 0x65,
+  0x66, 0x69, 0x78, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x72, 0x65,
+  0x66, 0x69, 0x78, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67,
+  0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6e,
+  0x61, 0x6d, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c,
+  0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f,
+  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x77, 0x69, 0x67, 0x67, 0x6c, 0x65,
+  0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20,
+  0x22, 0x63, 0x68, 0x72, 0x22, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75,
+  0x6c, 0x74, 0x20, 0x22, 0x2d, 0x22, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x63,
+  0x6c, 0x75, 0x64, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x66,
+  0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
   0x57, 0x69, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x50, 0x4d,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
@@ -1469,901 +1499,982 @@ unsigned char parametersDefault[] = {
   0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x61, 0x70, 0x73, 0x20,
   0x74, 0x6f, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6c,
   0x6f, 0x63, 0x69, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x69,
-  0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x20, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x74, 0x68, 0x65, 0x72,
-  0x77, 0x69, 0x73, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x61, 0x6c, 0x69, 0x67,
-  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
-  0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x61,
-  0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
-  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e,
-  0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x22, 0x6d, 0x61, 0x70, 0x70,
-  0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6d, 0x61,
-  0x6e, 0x79, 0x20, 0x6c, 0x6f, 0x63, 0x69, 0x22, 0x20, 0x69, 0x6e, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x4c, 0x6f, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x61,
-  0x6c, 0x2e, 0x6f, 0x75, 0x74, 0x20, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
-  0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74,
-  0x63, 0x68, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65,
-  0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f,
-  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69,
-  0x66, 0x20, 0x69, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x20,
-  0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63,
-  0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x69,
-  0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75,
-  0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x73, 0x6d, 0x61,
-  0x74, 0x63, 0x68, 0x4e, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x6d, 0x61, 0x78,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x33, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, 0x61, 0x6c, 0x69,
-  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
-  0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6f, 0x6e,
-  0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x72, 0x61,
-  0x74, 0x69, 0x6f, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61,
-  0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x2a, 0x6d, 0x61,
-  0x70, 0x70, 0x65, 0x64, 0x2a, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
-  0x20, 0x69, 0x73, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61,
-  0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74,
-  0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
-  0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
-  0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x76, 0x65,
-  0x72, 0x52, 0x65, 0x61, 0x64, 0x4c, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x31,
-  0x2e, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74,
-  0x3a, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20,
-  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70,
-  0x75, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69,
-  0x74, 0x73, 0x20, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x20, 0x6f, 0x66, 0x20,
-  0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74,
-  0x6f, 0x20, 0x2a, 0x72, 0x65, 0x61, 0x64, 0x2a, 0x20, 0x6c, 0x65, 0x6e,
-  0x67, 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
-  0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61,
-  0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61,
-  0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69,
-  0x6c, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x4d, 0x69, 0x6e,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
-  0x3a, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20,
-  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70,
-  0x75, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69,
-  0x74, 0x73, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20,
-  0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20,
-  0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20,
-  0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a,
-  0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x63,
-  0x6f, 0x72, 0x65, 0x4d, 0x69, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x4c, 0x72,
-  0x65, 0x61, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x36,
-  0x36, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a,
-  0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x6f, 0x75, 0x74,
-  0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x4d,
-  0x69, 0x6e, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x20, 0x6e, 0x6f, 0x72,
-  0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72,
-  0x65, 0x61, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x28,
-  0x73, 0x75, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73,
-  0x27, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x20, 0x66, 0x6f,
-  0x72, 0x20, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x2d, 0x65, 0x6e, 0x64,
-  0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x29, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
-  0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4e,
-  0x6d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x77,
+  0x69, 0x73, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+  0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62,
+  0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x77,
+  0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+  0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x22, 0x6d, 0x61, 0x70, 0x70, 0x65,
+  0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6d, 0x61, 0x6e,
+  0x79, 0x20, 0x6c, 0x6f, 0x63, 0x69, 0x22, 0x20, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x4c, 0x6f, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x6c,
+  0x2e, 0x6f, 0x75, 0x74, 0x20, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46,
+  0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63,
+  0x68, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
   0x6e, 0x74, 0x3a, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
   0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75,
   0x74, 0x70, 0x75, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66,
-  0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
-  0x6f, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x62,
-  0x61, 0x73, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, 0x68, 0x69, 0x67, 0x68,
-  0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65,
-  0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73,
+  0x20, 0x69, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6d,
+  0x6f, 0x72, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68,
+  0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73,
   0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
-  0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4e,
-  0x6d, 0x69, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x4c, 0x72, 0x65, 0x61, 0x64,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x36, 0x36, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, 0x73, 0x61, 0x6d,
-  0x20, 0x61, 0x73, 0x20, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65,
-  0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6d, 0x69, 0x6e, 0x2c, 0x20,
-  0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a,
-  0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
+  0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74,
+  0x63, 0x68, 0x4e, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x6d, 0x61, 0x78, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x33, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62,
+  0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6f, 0x6e, 0x6c,
+  0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x72, 0x61, 0x74,
+  0x69, 0x6f, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74,
+  0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x2a, 0x6d, 0x61, 0x70,
+  0x70, 0x65, 0x64, 0x2a, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20,
+  0x69, 0x73, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x61, 0x6e,
+  0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f,
+  0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e,
+  0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d,
+  0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x76, 0x65, 0x72,
+  0x52, 0x65, 0x61, 0x64, 0x4c, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x31, 0x2e,
+  0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a,
+  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77,
+  0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
+  0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74,
+  0x73, 0x20, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x20, 0x6f, 0x66, 0x20, 0x6d,
+  0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x6f,
+  0x20, 0x2a, 0x72, 0x65, 0x61, 0x64, 0x2a, 0x20, 0x6c, 0x65, 0x6e, 0x67,
+  0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74,
+  0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c,
+  0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c,
+  0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c,
+  0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x4d, 0x69, 0x6e, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a,
+  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77,
+  0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
+  0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74,
+  0x73, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x68,
+  0x69, 0x67, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f,
+  0x72, 0x20, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74,
+  0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a,
+  0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f,
+  0x72, 0x65, 0x4d, 0x69, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x4c, 0x72, 0x65,
+  0x61, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x36, 0x36,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20,
+  0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x6f, 0x75, 0x74, 0x46,
+  0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x4d, 0x69,
+  0x6e, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x20, 0x6e, 0x6f, 0x72, 0x6d,
+  0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65,
   0x61, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x28, 0x73,
   0x75, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x27,
   0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x20, 0x66, 0x6f, 0x72,
   0x20, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x2d, 0x65, 0x6e, 0x64, 0x20,
-  0x72, 0x65, 0x61, 0x64, 0x73, 0x29, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
-  0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x6e,
-  0x4d, 0x6f, 0x74, 0x69, 0x66, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x66, 0x69,
-  0x6c, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65,
-  0x6e, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65,
-  0x69, 0x72, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x73, 0x0a, 0x09, 0x09,
-  0x09, 0x09, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x73, 0x29, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46,
+  0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6d,
+  0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x3a, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74,
+  0x70, 0x75, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f,
+  0x66, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x62, 0x61,
+  0x73, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65,
+  0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x71,
+  0x75, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+  0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46,
+  0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6d,
+  0x69, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x4c, 0x72, 0x65, 0x61, 0x64, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x36, 0x36, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, 0x73, 0x61, 0x6d, 0x20,
+  0x61, 0x73, 0x20, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
+  0x4d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6d, 0x69, 0x6e, 0x2c, 0x20, 0x62,
+  0x75, 0x74, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65,
+  0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x28, 0x73, 0x75,
+  0x6d, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x27, 0x20,
+  0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x2d, 0x65, 0x6e, 0x64, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x73, 0x29, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46,
+  0x69, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d,
+  0x6f, 0x74, 0x69, 0x66, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x66, 0x69, 0x6c,
+  0x74, 0x65, 0x72, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x69,
+  0x72, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x73, 0x0a, 0x09, 0x09, 0x09,
+  0x09, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
-  0x20, 0x6e, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e,
-  0x67, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65,
-  0x4e, 0x6f, 0x6e, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20,
-  0x6f, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
-  0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74,
-  0x61, 0x69, 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f,
-  0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69,
-  0x6f, 0x6e, 0x73, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x52, 0x65, 0x6d, 0x6f,
-  0x76, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63,
-  0x61, 0x6c, 0x55, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65,
-  0x64, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65,
-  0x72, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
-  0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f,
-  0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61,
-  0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x61, 0x6e,
-  0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63,
-  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x75,
-  0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
-  0x65, 0x64, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x6a, 0x75,
-  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x64, 0x61, 0x74, 0x61,
-  0x62, 0x61, 0x73, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6e,
-  0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x6f, 0x6e, 0x2d,
-  0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x75,
-  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c,
-  0x20, 0x62, 0x65, 0x20, 0x6b, 0x65, 0x70, 0x74, 0x2e, 0x0a, 0x0a, 0x0a,
-  0x0a, 0x23, 0x23, 0x23, 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20,
-  0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x53,
-  0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69,
-  0x6f, 0x6e, 0x73, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c,
-  0x74, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x73, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x41, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
-  0x6e, 0x67, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65,
-  0x61, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69,
-  0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6c,
-  0x61, 0x70, 0x73, 0x65, 0x64, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x6e, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67,
+  0x0a, 0x09, 0x09, 0x09, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e,
+  0x6f, 0x6e, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x6f,
+  0x75, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+  0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61,
+  0x69, 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e,
+  0x69, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x76,
+  0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61,
+  0x6c, 0x55, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72,
+  0x20, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e,
+  0x74, 0x61, 0x69, 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e,
+  0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x61, 0x6e, 0x6e,
+  0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x73,
+  0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65,
+  0x64, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x6a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x64, 0x61, 0x74, 0x61, 0x62,
+  0x61, 0x73, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x6e, 0x6e,
+  0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63,
+  0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
+  0x62, 0x65, 0x20, 0x6b, 0x65, 0x70, 0x74, 0x2e, 0x0a, 0x0a, 0x0a, 0x0a,
+  0x23, 0x23, 0x23, 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x46,
+  0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x53, 0x70,
+  0x6c, 0x69, 0x63, 0x65, 0x20, 0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74,
+  0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41,
+  0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64,
+  0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61,
+  0x70, 0x73, 0x65, 0x64, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20,
+  0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x75,
+  0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c, 0x6c,
+  0x3a, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x2c,
+  0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x2d, 0x20, 0x61, 0x6e, 0x64,
+  0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6d, 0x61, 0x70, 0x70, 0x65,
+  0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x6e, 0x69, 0x71, 0x75,
+  0x65, 0x3a, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x79, 0x20,
+  0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61, 0x64,
+  0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53,
+  0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x68,
+  0x61, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x33, 0x30, 0x20, 0x20, 0x31, 0x32, 0x20, 0x20,
+  0x31, 0x32, 0x20, 0x20, 0x31, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34,
+  0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x73, 0x3a, 0x20, 0x20,
+  0x20, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6f, 0x76,
+  0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74,
+  0x68, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65,
   0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f,
-  0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c,
-  0x6c, 0x3a, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73,
-  0x2c, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x2d, 0x20, 0x61, 0x6e,
-  0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6d, 0x61, 0x70, 0x70,
-  0x65, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x6e, 0x69, 0x71,
-  0x75, 0x65, 0x3a, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x79,
-  0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61,
-  0x64, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
-  0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4f, 0x76, 0x65, 0x72,
-  0x68, 0x61, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0x30, 0x20, 0x20, 0x31, 0x32, 0x20,
-  0x20, 0x31, 0x32, 0x20, 0x20, 0x31, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x34, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x73, 0x3a, 0x20,
-  0x20, 0x20, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6f,
-  0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x20, 0x6c, 0x65, 0x6e, 0x67,
-  0x74, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63,
-  0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
-  0x6f, 0x6e, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x73, 0x69, 0x64, 0x65,
-  0x73, 0x20, 0x66, 0x6f, 0x72, 0x3a, 0x20, 0x28, 0x31, 0x29, 0x20, 0x6e,
-  0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c,
-  0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x73, 0x2c, 0x20, 0x28, 0x32, 0x29,
-  0x20, 0x47, 0x54, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43,
-  0x54, 0x2f, 0x41, 0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20,
-  0x28, 0x33, 0x29, 0x20, 0x47, 0x43, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e,
-  0x64, 0x20, 0x43, 0x54, 0x2f, 0x47, 0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69,
-  0x66, 0x2c, 0x20, 0x28, 0x34, 0x29, 0x20, 0x41, 0x54, 0x2f, 0x41, 0x43,
-  0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x54, 0x20, 0x6d,
-  0x6f, 0x74, 0x69, 0x66, 0x2e, 0x20, 0x2d, 0x31, 0x20, 0x6d, 0x65, 0x61,
-  0x6e, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
-  0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f,
-  0x74, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x6e, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x73, 0x69, 0x64, 0x65, 0x73,
+  0x20, 0x66, 0x6f, 0x72, 0x3a, 0x20, 0x28, 0x31, 0x29, 0x20, 0x6e, 0x6f,
+  0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20,
+  0x6d, 0x6f, 0x74, 0x69, 0x66, 0x73, 0x2c, 0x20, 0x28, 0x32, 0x29, 0x20,
+  0x47, 0x54, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54,
+  0x2f, 0x41, 0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28,
+  0x33, 0x29, 0x20, 0x47, 0x43, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64,
+  0x20, 0x43, 0x54, 0x2f, 0x47, 0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66,
+  0x2c, 0x20, 0x28, 0x34, 0x29, 0x20, 0x41, 0x54, 0x2f, 0x41, 0x43, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x54, 0x20, 0x6d, 0x6f,
+  0x74, 0x69, 0x66, 0x2e, 0x20, 0x2d, 0x31, 0x20, 0x6d, 0x65, 0x61, 0x6e,
+  0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20,
+  0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x74,
+  0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c,
+  0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
+  0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65,
+  0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65,
+  0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0x20,
+  0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x31, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x34, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65,
+  0x72, 0x73, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20,
+  0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x70,
+  0x70, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x63, 0x6f,
+  0x75, 0x6e, 0x74, 0x20, 0x70, 0x65, 0x72, 0x20, 0x6a, 0x75, 0x6e, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x3a, 0x20, 0x28, 0x31,
+  0x29, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69,
+  0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x73, 0x2c, 0x20,
+  0x28, 0x32, 0x29, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x43, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69,
+  0x66, 0x2c, 0x20, 0x28, 0x33, 0x29, 0x20, 0x47, 0x43, 0x2f, 0x41, 0x47,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x47, 0x43, 0x20, 0x6d,
+  0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x34, 0x29, 0x20, 0x41, 0x54,
+  0x2f, 0x41, 0x43, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x54, 0x2f, 0x41,
+  0x54, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2e, 0x20, 0x2d, 0x31, 0x20,
+  0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6f, 0x75, 0x74,
+  0x70, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74,
+  0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20,
+  0x69, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75,
+  0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75,
+  0x6e, 0x74, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4d, 0x69, 0x6e, 0x20,
+  0x4f, 0x52, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74,
+  0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c,
+  0x4d, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x61, 0x74, 0x69, 0x73,
+  0x66, 0x69, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70,
+  0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74,
+  0x61, 0x74, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c,
+  0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x74, 0x61,
+  0x6c, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0x20, 0x20,
+  0x20, 0x31, 0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x34, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72,
+  0x73, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x74,
+  0x6f, 0x74, 0x61, 0x6c, 0x20, 0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d,
+  0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2b, 0x75, 0x6e, 0x69, 0x71,
+  0x75, 0x65, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x63, 0x6f, 0x75,
+  0x6e, 0x74, 0x20, 0x70, 0x65, 0x72, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x3a, 0x20, 0x28, 0x31, 0x29,
+  0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63,
+  0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x73, 0x2c, 0x20, 0x28,
+  0x32, 0x29, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64,
+  0x20, 0x43, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66,
+  0x2c, 0x20, 0x28, 0x33, 0x29, 0x20, 0x47, 0x43, 0x2f, 0x41, 0x47, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x47, 0x43, 0x20, 0x6d, 0x6f,
+  0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x34, 0x29, 0x20, 0x41, 0x54, 0x2f,
+  0x41, 0x43, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x54,
+  0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2e, 0x20, 0x2d, 0x31, 0x20, 0x6d,
+  0x65, 0x61, 0x6e, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+  0x6d, 0x6f, 0x74, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+  0x61, 0x72, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x69,
+  0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x74,
+  0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e,
+  0x74, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4d, 0x69, 0x6e, 0x20, 0x4f,
+  0x52, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65,
+  0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d,
+  0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66,
+  0x69, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70,
   0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61,
   0x74, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
   0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74,
-  0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x71, 0x75,
-  0x65, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x33,
-  0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x31,
-  0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x20, 0x69, 0x6e, 0x74, 0x65,
-  0x67, 0x65, 0x72, 0x73, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75,
-  0x6d, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x6c, 0x79, 0x20, 0x6d,
-  0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
-  0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, 0x65, 0x72, 0x20, 0x6a, 0x75,
-  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x3a, 0x20,
-  0x28, 0x31, 0x29, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f,
-  0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x73,
-  0x2c, 0x20, 0x28, 0x32, 0x29, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x47, 0x20,
-  0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x6d, 0x6f,
-  0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x33, 0x29, 0x20, 0x47, 0x43, 0x2f,
-  0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x47, 0x43,
-  0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x34, 0x29, 0x20,
-  0x41, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x54,
-  0x2f, 0x41, 0x54, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2e, 0x20, 0x2d,
-  0x31, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6f,
-  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68,
-  0x61, 0x74, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
-  0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
-  0x74, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20,
-  0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43,
-  0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4d, 0x69,
-  0x6e, 0x20, 0x4f, 0x52, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69,
-  0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x74,
-  0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74,
-  0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x61, 0x74,
-  0x69, 0x73, 0x66, 0x69, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20,
-  0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x6e,
-  0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74,
-  0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66,
-  0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f,
-  0x74, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x33,
-  0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x31,
-  0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x20, 0x69, 0x6e, 0x74, 0x65,
-  0x67, 0x65, 0x72, 0x73, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75,
-  0x6d, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x28, 0x6d, 0x75, 0x6c,
-  0x74, 0x69, 0x2d, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2b, 0x75,
-  0x6e, 0x69, 0x71, 0x75, 0x65, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
-  0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, 0x65, 0x72, 0x20, 0x6a, 0x75,
-  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x3a, 0x20,
-  0x28, 0x31, 0x29, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f,
-  0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x73,
-  0x2c, 0x20, 0x28, 0x32, 0x29, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x47, 0x20,
-  0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x6d, 0x6f,
-  0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x33, 0x29, 0x20, 0x47, 0x43, 0x2f,
-  0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x47, 0x43,
-  0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x34, 0x29, 0x20,
-  0x41, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x54,
-  0x2f, 0x41, 0x54, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2e, 0x20, 0x2d,
-  0x31, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6f,
-  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68,
-  0x61, 0x74, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
-  0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
-  0x74, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20,
-  0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43,
-  0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4d, 0x69,
-  0x6e, 0x20, 0x4f, 0x52, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69,
-  0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x6f, 0x74,
-  0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74,
-  0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x61, 0x74,
-  0x69, 0x73, 0x66, 0x69, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20,
-  0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x6e,
-  0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74,
-  0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66,
-  0x69, 0x6c, 0x74, 0x65, 0x72, 0x44, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x4f,
-  0x74, 0x68, 0x65, 0x72, 0x53, 0x4a, 0x6d, 0x69, 0x6e, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x31, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x20, 0x35, 0x20,
-  0x20, 0x20, 0x31, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x20, 0x69,
-  0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x73, 0x3e, 0x3d, 0x30, 0x3a, 0x20,
-  0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6c, 0x6c, 0x6f,
-  0x77, 0x65, 0x64, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
-  0x20, 0x74, 0x6f, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6a, 0x75,
-  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x27, 0x20, 0x64, 0x6f, 0x6e,
-  0x6f, 0x72, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x6f, 0x72, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x65, 0x73,
-  0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74,
-  0x6f, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20,
-  0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x6f,
-  0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x6e,
-  0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x56, 0x73, 0x52, 0x65, 0x61,
-  0x64, 0x4e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x35, 0x30,
-  0x30, 0x30, 0x30, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x32,
-  0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x20,
-  0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x73, 0x3e, 0x3d, 0x30, 0x3a,
-  0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x67, 0x61, 0x70,
-  0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72,
+  0x65, 0x72, 0x44, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x4f, 0x74, 0x68, 0x65,
+  0x72, 0x53, 0x4a, 0x6d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31,
+  0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x20, 0x35, 0x20, 0x20, 0x20, 0x31,
+  0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x20, 0x69, 0x6e, 0x74, 0x65,
+  0x67, 0x65, 0x72, 0x73, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e,
+  0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64,
+  0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f,
+  0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x73, 0x27, 0x20, 0x64, 0x6f, 0x6e, 0x6f, 0x72, 0x2f,
+  0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f,
+  0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61,
+  0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53,
+  0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x72, 0x6f,
+  0x6e, 0x4d, 0x61, 0x78, 0x56, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x35, 0x30, 0x30, 0x30, 0x30,
+  0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x20, 0x32, 0x30, 0x30, 0x30,
+  0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x20, 0x69, 0x6e, 0x74,
+  0x65, 0x67, 0x65, 0x72, 0x73, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x61,
+  0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x67, 0x61, 0x70, 0x20, 0x61, 0x6c,
+  0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x75,
+  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70,
+  0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x31, 0x2c, 0x32,
+  0x2c, 0x33, 0x2c, 0x2c, 0x2c, 0x4e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x2e, 0x65,
+  0x2e, 0x20, 0x62, 0x79, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
   0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x73,
   0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
-  0x31, 0x2c, 0x32, 0x2c, 0x33, 0x2c, 0x2c, 0x2c, 0x4e, 0x20, 0x72, 0x65,
-  0x61, 0x64, 0x73, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x64, 0x65, 0x66,
-  0x61, 0x75, 0x6c, 0x74, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
-  0x6e, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64,
-  0x20, 0x62, 0x79, 0x20, 0x31, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x63,
-  0x61, 0x6e, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x67, 0x61, 0x70, 0x73,
-  0x20, 0x3c, 0x3d, 0x35, 0x30, 0x30, 0x30, 0x30, 0x62, 0x2c, 0x20, 0x62,
-  0x79, 0x20, 0x32, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3a, 0x20, 0x3c,
-  0x3d, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x62, 0x2c, 0x20, 0x62, 0x79,
-  0x20, 0x33, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3a, 0x20, 0x3c, 0x3d,
-  0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x3e,
-  0x3d, 0x34, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x79,
-  0x20, 0x67, 0x61, 0x70, 0x20, 0x3c, 0x3d, 0x61, 0x6c, 0x69, 0x67, 0x6e,
-  0x49, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e,
-  0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20,
-  0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a, 0x75,
-  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x23, 0x23, 0x23,
-  0x20, 0x53, 0x63, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x73, 0x63, 0x6f,
-  0x72, 0x65, 0x47, 0x61, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a,
-  0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63,
-  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79,
-  0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e,
-  0x74, 0x20, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20,
-  0x6d, 0x6f, 0x74, 0x69, 0x66, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72,
-  0x65, 0x47, 0x61, 0x70, 0x4e, 0x6f, 0x6e, 0x63, 0x61, 0x6e, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x2d, 0x38, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a,
-  0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63,
-  0x61, 0x6c, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
-  0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20, 0x28, 0x69, 0x6e, 0x20,
-  0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20,
-  0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70, 0x29, 0x0a, 0x0a, 0x73,
-  0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70, 0x47, 0x43, 0x41, 0x47, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x2d, 0x34, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x47,
-  0x43, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f,
-  0x47, 0x43, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
-  0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20, 0x28, 0x69, 0x6e, 0x20,
-  0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20,
-  0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70, 0x29, 0x0a, 0x0a, 0x73,
-  0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70, 0x41, 0x54, 0x41, 0x43, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x2d, 0x38, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x41,
-  0x54, 0x2f, 0x41, 0x43, 0x20, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x54,
-  0x2f, 0x41, 0x54, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
-  0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20, 0x20, 0x28, 0x69,
-  0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
-  0x6f, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70, 0x29, 0x0a,
-  0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x69,
-  0x63, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x32, 0x73,
-  0x63, 0x61, 0x6c, 0x65, 0x20, 0x20, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x73,
-  0x63, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x67, 0x61, 0x72, 0x69, 0x74,
-  0x68, 0x6d, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x73, 0x63, 0x61,
-  0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x67, 0x65, 0x6e,
-  0x6f, 0x6d, 0x69, 0x63, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20,
-  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
-  0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47,
-  0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68,
-  0x4c, 0x6f, 0x67, 0x32, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2a, 0x6c, 0x6f,
-  0x67, 0x32, 0x28, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x4c, 0x65,
-  0x6e, 0x67, 0x74, 0x68, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65,
-  0x44, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x2d, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74,
-  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x70, 0x65, 0x6e,
-  0x61, 0x6c, 0x74, 0x79, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x44,
-  0x65, 0x6c, 0x42, 0x61, 0x73, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
-  0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69,
-  0x6f, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
-  0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20, 0x70, 0x65, 0x72,
-  0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x61, 0x64,
+  0x31, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x68,
+  0x61, 0x76, 0x65, 0x20, 0x67, 0x61, 0x70, 0x73, 0x20, 0x3c, 0x3d, 0x35,
+  0x30, 0x30, 0x30, 0x30, 0x62, 0x2c, 0x20, 0x62, 0x79, 0x20, 0x32, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x73, 0x3a, 0x20, 0x3c, 0x3d, 0x31, 0x30, 0x30,
+  0x30, 0x30, 0x30, 0x62, 0x2c, 0x20, 0x62, 0x79, 0x20, 0x33, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x73, 0x3a, 0x20, 0x3c, 0x3d, 0x32, 0x30, 0x30, 0x30,
+  0x30, 0x30, 0x2e, 0x20, 0x62, 0x79, 0x20, 0x3e, 0x3d, 0x34, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x67, 0x61, 0x70,
+  0x20, 0x3c, 0x3d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x74, 0x72,
+  0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61,
+  0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x6e, 0x6f,
+  0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x53, 0x63, 0x6f,
+  0x72, 0x69, 0x6e, 0x67, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61,
+  0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x73, 0x70, 0x6c,
+  0x69, 0x63, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20, 0x28, 0x69, 0x6e,
+  0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x6e,
+  0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x74, 0x69,
+  0x66, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70,
+  0x4e, 0x6f, 0x6e, 0x63, 0x61, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x38, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6e, 0x6f, 0x6e,
+  0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6a,
+  0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61,
+  0x6c, 0x74, 0x79, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69,
+  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x63, 0x6f, 0x72,
+  0x65, 0x47, 0x61, 0x70, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65,
+  0x47, 0x61, 0x70, 0x47, 0x43, 0x41, 0x47, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2d, 0x34, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x47, 0x43, 0x2f, 0x41, 0x47,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x47, 0x43, 0x20, 0x6a,
+  0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61,
+  0x6c, 0x74, 0x79, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69,
+  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x63, 0x6f, 0x72,
+  0x65, 0x47, 0x61, 0x70, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65,
+  0x47, 0x61, 0x70, 0x41, 0x54, 0x41, 0x43, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2d, 0x38, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x41, 0x54, 0x2f, 0x41, 0x43,
+  0x20, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x54, 0x20,
+  0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e,
+  0x61, 0x6c, 0x74, 0x79, 0x20, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x61, 0x64,
   0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x63,
-  0x6f, 0x72, 0x65, 0x44, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x6e, 0x29, 0x0a,
-  0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x73, 0x4f, 0x70, 0x65,
-  0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x32, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
-  0x70, 0x65, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x0a,
-  0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x73, 0x42, 0x61, 0x73,
-  0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x32, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65,
+  0x6f, 0x72, 0x65, 0x47, 0x61, 0x70, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f,
+  0x72, 0x65, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x4c, 0x65, 0x6e,
+  0x67, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x32, 0x73, 0x63, 0x61, 0x6c, 0x65,
+  0x20, 0x20, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65,
+  0x20, 0x6c, 0x6f, 0x67, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x69, 0x63,
+  0x61, 0x6c, 0x6c, 0x79, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63,
+  0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+  0x3a, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x65, 0x6e, 0x6f, 0x6d,
+  0x69, 0x63, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x32,
+  0x73, 0x63, 0x61, 0x6c, 0x65, 0x2a, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x67,
+  0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+  0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x44, 0x65, 0x6c, 0x4f,
+  0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x32, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+  0x6f, 0x70, 0x65, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79,
+  0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x44, 0x65, 0x6c, 0x42, 0x61,
+  0x73, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x32, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65,
   0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e,
   0x61, 0x6c, 0x74, 0x79, 0x20, 0x70, 0x65, 0x72, 0x20, 0x62, 0x61, 0x73,
   0x65, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69,
-  0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x49,
-  0x6e, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f,
-  0x72, 0x65, 0x53, 0x74, 0x69, 0x74, 0x63, 0x68, 0x53, 0x4a, 0x73, 0x68,
-  0x69, 0x66, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x69,
-  0x6d, 0x75, 0x6d, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x72, 0x65,
-  0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x6c,
-  0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20,
-  0x66, 0x6f, 0x72, 0x20, 0x53, 0x4a, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64,
-  0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x68, 0x65, 0x20,
-  0x73, 0x74, 0x69, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74,
-  0x65, 0x70, 0x0a, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x41, 0x6c, 0x69,
-  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20,
-  0x53, 0x65, 0x65, 0x64, 0x69, 0x6e, 0x67, 0x0a, 0x0a, 0x73, 0x65, 0x65,
-  0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74,
-  0x4c, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x35, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e,
-  0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63,
-  0x68, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x70, 0x6f, 0x69, 0x6e,
-  0x74, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x2d, 0x20, 0x74, 0x68, 0x65,
-  0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x6c,
-  0x69, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x70, 0x69, 0x65, 0x63,
-  0x65, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72,
-  0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76,
-  0x61, 0x6c, 0x75, 0x65, 0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x53, 0x65,
-  0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6d, 0x61,
-  0x78, 0x4f, 0x76, 0x65, 0x72, 0x4c, 0x72, 0x65, 0x61, 0x64, 0x20, 0x20,
-  0x20, 0x20, 0x31, 0x2e, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c,
-  0x6f, 0x61, 0x74, 0x3a, 0x20, 0x73, 0x65, 0x65, 0x64, 0x53, 0x65, 0x61,
+  0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x44,
+  0x65, 0x6c, 0x4f, 0x70, 0x65, 0x6e, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f,
+  0x72, 0x65, 0x49, 0x6e, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x2d, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73,
+  0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20,
+  0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x0a, 0x0a, 0x73, 0x63, 0x6f,
+  0x72, 0x65, 0x49, 0x6e, 0x73, 0x42, 0x61, 0x73, 0x65, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x2d, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73,
+  0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e,
+  0x73, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79,
+  0x20, 0x70, 0x65, 0x72, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x28, 0x69,
+  0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
+  0x6f, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x73, 0x4f, 0x70,
+  0x65, 0x6e, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74,
+  0x69, 0x74, 0x63, 0x68, 0x53, 0x4a, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20,
+  0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x65,
+  0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x53, 0x4a, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x69, 0x65,
+  0x73, 0x20, 0x69, 0x6e, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x69, 0x74,
+  0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, 0x65, 0x70, 0x0a, 0x0a,
+  0x0a, 0x23, 0x23, 0x23, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x65, 0x64,
+  0x69, 0x6e, 0x67, 0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x53, 0x65, 0x61,
   0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6d, 0x61, 0x78,
-  0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20,
-  0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67,
-  0x74, 0x68, 0x20, 0x28, 0x73, 0x75, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x6d,
-  0x61, 0x74, 0x65, 0x73, 0x27, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
-  0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64,
-  0x2d, 0x65, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x29, 0x0a,
-  0x0a, 0x73, 0x65, 0x65, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c,
-  0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20,
-  0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
-  0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6c, 0x65, 0x6e, 0x67,
-  0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65,
-  0x65, 0x64, 0x73, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x3d, 0x30, 0x20, 0x6d,
-  0x61, 0x78, 0x20, 0x73, 0x65, 0x65, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67,
-  0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74,
-  0x65, 0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x4d, 0x75, 0x6c, 0x74, 0x69,
-  0x6d, 0x61, 0x70, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
-  0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x70,
-  0x69, 0x65, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d,
-  0x61, 0x70, 0x20, 0x66, 0x65, 0x77, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61,
-  0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
-  0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65,
-  0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x69,
-  0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65,
-  0x64, 0x75, 0x72, 0x65, 0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x50, 0x65,
-  0x72, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20,
-  0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65,
-  0x65, 0x64, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, 0x64,
-  0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x50, 0x65, 0x72, 0x57, 0x69, 0x6e,
-  0x64, 0x6f, 0x77, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x35, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30,
-  0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
-  0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x65, 0x64, 0x73, 0x20, 0x70, 0x65,
-  0x72, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x0a, 0x0a, 0x73, 0x65,
-  0x65, 0x64, 0x4e, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x63, 0x69, 0x50, 0x65,
-  0x72, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x20, 0x20, 0x20, 0x31,
-  0x30, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30,
-  0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
-  0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x73, 0x65, 0x65, 0x64,
-  0x20, 0x6c, 0x6f, 0x63, 0x69, 0x20, 0x70, 0x65, 0x72, 0x20, 0x77, 0x69,
-  0x6e, 0x64, 0x6f, 0x77, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x49,
-  0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x31,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d,
-  0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x7a, 0x65,
-  0x3a, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x67, 0x61,
-  0x70, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65,
-  0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20, 0x69,
-  0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
-  0x3e, 0x3d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x74, 0x72, 0x6f,
-  0x6e, 0x4d, 0x69, 0x6e, 0x2c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77,
-  0x69, 0x73, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f,
-  0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x44, 0x65, 0x6c,
-  0x65, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e,
-  0x49, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d,
-  0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x7a, 0x65,
-  0x2c, 0x20, 0x69, 0x66, 0x20, 0x30, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x20,
-  0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20,
-  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65,
-  0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x28, 0x32,
-  0x5e, 0x77, 0x69, 0x6e, 0x42, 0x69, 0x6e, 0x4e, 0x62, 0x69, 0x74, 0x73,
-  0x29, 0x2a, 0x77, 0x69, 0x6e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x44,
-  0x69, 0x73, 0x74, 0x4e, 0x62, 0x69, 0x6e, 0x73, 0x0a, 0x0a, 0x61, 0x6c,
-  0x69, 0x67, 0x6e, 0x4d, 0x61, 0x74, 0x65, 0x73, 0x47, 0x61, 0x70, 0x4d,
-  0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x69,
-  0x6d, 0x75, 0x6d, 0x20, 0x67, 0x61, 0x70, 0x20, 0x62, 0x65, 0x74, 0x77,
-  0x65, 0x65, 0x6e, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x65,
-  0x73, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x30, 0x2c, 0x20, 0x6d, 0x61, 0x78,
-  0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20, 0x67, 0x61, 0x70, 0x20,
-  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65,
-  0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x28, 0x32,
-  0x5e, 0x77, 0x69, 0x6e, 0x42, 0x69, 0x6e, 0x4e, 0x62, 0x69, 0x74, 0x73,
-  0x29, 0x2a, 0x77, 0x69, 0x6e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x44,
-  0x69, 0x73, 0x74, 0x4e, 0x62, 0x69, 0x6e, 0x73, 0x0a, 0x0a, 0x61, 0x6c,
-  0x69, 0x67, 0x6e, 0x53, 0x4a, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e,
-  0x67, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x35, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e,
-  0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6f,
-  0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x20, 0x28, 0x69, 0x2e, 0x65,
-  0x2e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x73, 0x69, 0x7a, 0x65,
-  0x29, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65,
-  0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
-  0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x4a, 0x73, 0x74, 0x69,
-  0x74, 0x63, 0x68, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4e,
-  0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x30, 0x20, 0x2d, 0x31, 0x20, 0x30,
-  0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x2a, 0x69, 0x6e, 0x74,
-  0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d,
-  0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6d,
-  0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x66, 0x6f,
-  0x72, 0x20, 0x73, 0x74, 0x69, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20,
-  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63,
-  0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
-  0x28, 0x2d, 0x31, 0x3a, 0x20, 0x6e, 0x6f, 0x20, 0x6c, 0x69, 0x6d, 0x69,
-  0x74, 0x29, 0x2e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x31, 0x29,
-  0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63,
-  0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x73, 0x2c, 0x20, 0x28,
-  0x32, 0x29, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64,
-  0x20, 0x43, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66,
-  0x2c, 0x20, 0x28, 0x33, 0x29, 0x20, 0x47, 0x43, 0x2f, 0x41, 0x47, 0x20,
-  0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x47, 0x43, 0x20, 0x6d, 0x6f,
-  0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x34, 0x29, 0x20, 0x41, 0x54, 0x2f,
-  0x41, 0x43, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x54,
-  0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2e, 0x0a, 0x0a, 0x61, 0x6c, 0x69,
-  0x67, 0x6e, 0x53, 0x4a, 0x44, 0x42, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x61,
-  0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30,
-  0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6f, 0x76,
-  0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e,
-  0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x29,
-  0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74,
-  0x65, 0x64, 0x20, 0x28, 0x73, 0x6a, 0x64, 0x62, 0x29, 0x20, 0x73, 0x70,
-  0x6c, 0x69, 0x63, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
-  0x65, 0x6e, 0x74, 0x73, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53,
-  0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x4d, 0x61, 0x74, 0x65, 0x4d, 0x61,
-  0x70, 0x4c, 0x6d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d,
-  0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65,
-  0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x66, 0x6f, 0x72,
-  0x20, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x61, 0x74, 0x65,
-  0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x6c,
-  0x69, 0x63, 0x65, 0x64, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53,
-  0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x4d, 0x61, 0x74, 0x65, 0x4d, 0x61,
-  0x70, 0x4c, 0x6d, 0x69, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x4c, 0x6d, 0x61,
-  0x74, 0x65, 0x20, 0x30, 0x2e, 0x36, 0x36, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x61, 0x6c, 0x69,
-  0x67, 0x6e, 0x53, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x4d, 0x61, 0x74,
-  0x65, 0x4d, 0x61, 0x70, 0x4c, 0x6d, 0x69, 0x6e, 0x20, 0x6e, 0x6f, 0x72,
-  0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d,
-  0x61, 0x74, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x0a, 0x20,
-  0x20, 0x20, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x57, 0x69, 0x6e, 0x64,
-  0x6f, 0x77, 0x73, 0x50, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x6d,
-  0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20,
-  0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f,
-  0x66, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x70, 0x65,
-  0x72, 0x20, 0x72, 0x65, 0x61, 0x64, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67,
-  0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73,
-  0x50, 0x65, 0x72, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4e, 0x6d, 0x61,
-  0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d,
-  0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66,
-  0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73,
-  0x20, 0x70, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x0a,
-  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72,
-  0x69, 0x70, 0x74, 0x73, 0x50, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4e,
-  0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d,
-  0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66,
-  0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x61,
-  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x70, 0x65,
-  0x72, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f,
-  0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67,
-  0x6e, 0x45, 0x6e, 0x64, 0x73, 0x54, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61,
-  0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
-  0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65,
-  0x61, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x67,
-  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e,
-  0x2e, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x6c,
-  0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65,
-  0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x73, 0x6f, 0x66, 0x74,
-  0x2d, 0x63, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c,
-  0x6c, 0x6f, 0x77, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, 0x6e, 0x64, 0x54, 0x6f, 0x45,
-  0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e,
-  0x2e, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x2d,
-  0x74, 0x6f, 0x2d, 0x65, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
-  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x64,
-  0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x2d, 0x63,
-  0x6c, 0x69, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x35, 0x70,
-  0x4f, 0x66, 0x52, 0x65, 0x61, 0x64, 0x31, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
-  0x66, 0x75, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64,
-  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x35, 0x70,
-  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64,
-  0x31, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72,
-  0x20, 0x65, 0x6e, 0x64, 0x73, 0x3a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
-  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x0a,
-  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x6f, 0x66, 0x74, 0x43, 0x6c, 0x69,
-  0x70, 0x41, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
-  0x45, 0x6e, 0x64, 0x73, 0x20, 0x59, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x61, 0x6c, 0x6c,
-  0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x2d,
-  0x63, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
-  0x74, 0x73, 0x20, 0x70, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20,
-  0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63,
-  0x68, 0x72, 0x6f, 0x6d, 0x6f, 0x73, 0x6f, 0x6d, 0x65, 0x73, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x59,
-  0x65, 0x73, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x4e, 0x6f, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x70, 0x72, 0x6f,
-  0x68, 0x69, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75,
-  0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74,
-  0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x77, 0x69, 0x74, 0x68,
-  0x20, 0x43, 0x75, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x0a, 0x0a,
-  0x23, 0x23, 0x23, 0x20, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x2c,
-  0x20, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x42, 0x69,
-  0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x41, 0x6e,
-  0x63, 0x68, 0x6f, 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70,
-  0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x35, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
-  0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d,
-  0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x63, 0x69, 0x20,
-  0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20,
-  0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d,
-  0x61, 0x70, 0x20, 0x74, 0x6f, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x42, 0x69,
-  0x6e, 0x4e, 0x62, 0x69, 0x74, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x31, 0x36, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
-  0x74, 0x3e, 0x30, 0x3a, 0x20, 0x3d, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x77,
-  0x69, 0x6e, 0x42, 0x69, 0x6e, 0x29, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72,
-  0x65, 0x20, 0x77, 0x69, 0x6e, 0x42, 0x69, 0x6e, 0x20, 0x69, 0x73, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x2f,
-  0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20,
-  0x65, 0x61, 0x63, 0x68, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20,
-  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x79, 0x20,
-  0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x6e,
-  0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e,
-  0x73, 0x2e, 0x20, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x41, 0x6e, 0x63, 0x68,
-  0x6f, 0x72, 0x44, 0x69, 0x73, 0x74, 0x4e, 0x62, 0x69, 0x6e, 0x73, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x39, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30,
-  0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
-  0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x73, 0x20, 0x62, 0x65, 0x74,
-  0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x61, 0x6e, 0x63,
-  0x68, 0x6f, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x6c,
-  0x6c, 0x6f, 0x77, 0x73, 0x20, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61,
-  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x63, 0x68,
-  0x6f, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x6f, 0x6e, 0x65,
-  0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x0a, 0x0a, 0x77, 0x69, 0x6e,
-  0x46, 0x6c, 0x61, 0x6e, 0x6b, 0x4e, 0x62, 0x69, 0x6e, 0x73, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x34, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30,
-  0x3a, 0x20, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x77, 0x69, 0x6e, 0x46, 0x6c,
-  0x61, 0x6e, 0x6b, 0x29, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20,
-  0x77, 0x69, 0x6e, 0x20, 0x46, 0x6c, 0x61, 0x6e, 0x6b, 0x20, 0x69, 0x73,
-  0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66,
-  0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x61, 0x6e,
-  0x64, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x6e,
-  0x6b, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73,
-  0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x77, 0x69,
-  0x6e, 0x64, 0x6f, 0x77, 0x0a, 0x0a, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20,
-  0x43, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x41, 0x6c, 0x69,
-  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x63, 0x68, 0x69, 0x6d,
-  0x4f, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x53, 0x41, 0x4d, 0x6f,
-  0x6c, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
-  0x67, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x63,
-  0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6f, 0x75, 0x74, 0x70,
-  0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x65, 0x70, 0x61, 0x72,
-  0x61, 0x74, 0x65, 0x53, 0x41, 0x4d, 0x6f, 0x6c, 0x64, 0x20, 0x20, 0x2e,
-  0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6f, 0x6c,
-  0x64, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x73,
-  0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x43, 0x68, 0x69, 0x6d,
-  0x65, 0x72, 0x69, 0x63, 0x2e, 0x6f, 0x75, 0x74, 0x2e, 0x73, 0x61, 0x6d,
-  0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x69,
-  0x74, 0x68, 0x69, 0x6e, 0x42, 0x41, 0x4d, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
-  0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x61,
-  0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x66,
-  0x69, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65,
-  0x64, 0x2e, 0x2a, 0x2e, 0x62, 0x61, 0x6d, 0x29, 0x0a, 0x0a, 0x63, 0x68,
-  0x69, 0x6d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e,
-  0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20,
-  0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68,
-  0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65,
-  0x6e, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x69,
-  0x66, 0x20, 0x3d, 0x3d, 0x30, 0x2c, 0x20, 0x6e, 0x6f, 0x20, 0x63, 0x68,
-  0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
-  0x74, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65,
+  0x20, 0x35, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e,
+  0x30, 0x3a, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x73, 0x74,
+  0x61, 0x72, 0x74, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x68,
+  0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
+  0x61, 0x64, 0x20, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x20, 0x69,
+  0x6e, 0x74, 0x6f, 0x20, 0x70, 0x69, 0x65, 0x63, 0x65, 0x73, 0x20, 0x6e,
+  0x6f, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61,
+  0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+  0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,
+  0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6d, 0x61, 0x78, 0x4f, 0x76, 0x65,
+  0x72, 0x4c, 0x72, 0x65, 0x61, 0x64, 0x20, 0x20, 0x20, 0x20, 0x31, 0x2e,
+  0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a,
+  0x20, 0x73, 0x65, 0x65, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53,
+  0x74, 0x61, 0x72, 0x74, 0x4c, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x6f, 0x72,
+  0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x28,
+  0x73, 0x75, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73,
+  0x27, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x2d, 0x65, 0x6e, 0x64,
+  0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x29, 0x0a, 0x0a, 0x73, 0x65, 0x65,
+  0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x6d, 0x61, 0x78, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x64, 0x65, 0x66, 0x69,
+  0x6e, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69,
+  0x6d, 0x75, 0x6d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x65, 0x64, 0x73, 0x2c,
+  0x20, 0x69, 0x66, 0x20, 0x3d, 0x30, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x73,
+  0x65, 0x65, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x69, 0x73,
+  0x20, 0x69, 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x0a, 0x0a, 0x73,
+  0x65, 0x65, 0x64, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x4e,
+  0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30,
+  0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30,
+  0x3a, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x70, 0x69, 0x65, 0x63, 0x65,
+  0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x66,
+  0x65, 0x77, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68,
+  0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x72, 0x65,
+  0x20, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x69, 0x6e,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x69, 0x74, 0x63, 0x68, 0x69,
+  0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65,
+  0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x50, 0x65, 0x72, 0x52, 0x65, 0x61,
+  0x64, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x31, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62,
+  0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x65, 0x64, 0x73, 0x20,
+  0x70, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, 0x64, 0x0a, 0x0a, 0x73, 0x65,
+  0x65, 0x64, 0x50, 0x65, 0x72, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4e,
+  0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x35, 0x30, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61,
+  0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20,
+  0x73, 0x65, 0x65, 0x64, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x77, 0x69,
+  0x6e, 0x64, 0x6f, 0x77, 0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x4e, 0x6f,
+  0x6e, 0x65, 0x4c, 0x6f, 0x63, 0x69, 0x50, 0x65, 0x72, 0x57, 0x69, 0x6e,
+  0x64, 0x6f, 0x77, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78,
+  0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6f,
+  0x6e, 0x65, 0x20, 0x73, 0x65, 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x69,
+  0x20, 0x70, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x0a,
+  0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x6e,
   0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20,
-  0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e,
-  0x69, 0x6d, 0x75, 0x6d, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x28,
-  0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x29, 0x20, 0x73, 0x63, 0x6f, 0x72,
-  0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x69,
-  0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e,
-  0x74, 0x73, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53, 0x63, 0x6f, 0x72,
-  0x65, 0x44, 0x72, 0x6f, 0x70, 0x4d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d,
-  0x61, 0x78, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x20, 0x28, 0x64, 0x69, 0x66,
-  0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x29, 0x20, 0x6f, 0x66, 0x20,
-  0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x63, 0x6f,
-  0x72, 0x65, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x6d, 0x20,
-  0x6f, 0x66, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x6f, 0x66,
-  0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69,
-  0x63, 0x20, 0x73, 0x65, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x29,
-  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65,
-  0x61, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x0a, 0x0a, 0x63,
-  0x68, 0x69, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x65, 0x70, 0x61,
-  0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x31, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
-  0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75,
-  0x6d, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
-  0x20, 0x28, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
-  0x29, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65,
-  0x72, 0x69, 0x63, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x6e,
-  0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x6f,
-  0x6e, 0x65, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53, 0x63, 0x6f, 0x72,
-  0x65, 0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f, 0x6e,
-  0x47, 0x54, 0x41, 0x47, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x31, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x70, 0x65, 0x6e, 0x61,
-  0x6c, 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6e, 0x6f,
-  0x6e, 0x2d, 0x47, 0x54, 0x2f, 0x41, 0x47, 0x20, 0x63, 0x68, 0x69, 0x6d,
-  0x65, 0x72, 0x69, 0x63, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
-  0x6e, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x4a, 0x75, 0x6e, 0x63, 0x74,
-  0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x4d,
-  0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x69, 0x6e, 0x74, 0x72,
+  0x6f, 0x6e, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x67, 0x65, 0x6e,
+  0x6f, 0x6d, 0x69, 0x63, 0x20, 0x67, 0x61, 0x70, 0x20, 0x69, 0x73, 0x20,
+  0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x69,
+  0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x73,
+  0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3e, 0x3d, 0x61, 0x6c, 0x69,
+  0x67, 0x6e, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x2c,
+  0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x69,
+  0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65,
+  0x72, 0x65, 0x64, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e,
+  0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x74, 0x72, 0x6f,
+  0x6e, 0x4d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x69, 0x6e, 0x74, 0x72,
+  0x6f, 0x6e, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x69, 0x66, 0x20,
+  0x30, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f,
+  0x6e, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
+  0x62, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65,
+  0x64, 0x20, 0x62, 0x79, 0x20, 0x28, 0x32, 0x5e, 0x77, 0x69, 0x6e, 0x42,
+  0x69, 0x6e, 0x4e, 0x62, 0x69, 0x74, 0x73, 0x29, 0x2a, 0x77, 0x69, 0x6e,
+  0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x74, 0x4e, 0x62,
+  0x69, 0x6e, 0x73, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x4d, 0x61,
+  0x74, 0x65, 0x73, 0x47, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x67,
+  0x61, 0x70, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74,
+  0x77, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x66,
+  0x20, 0x30, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x69, 0x6e, 0x74, 0x72,
+  0x6f, 0x6e, 0x20, 0x67, 0x61, 0x70, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
+  0x62, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65,
+  0x64, 0x20, 0x62, 0x79, 0x20, 0x28, 0x32, 0x5e, 0x77, 0x69, 0x6e, 0x42,
+  0x69, 0x6e, 0x4e, 0x62, 0x69, 0x74, 0x73, 0x29, 0x2a, 0x77, 0x69, 0x6e,
+  0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x74, 0x4e, 0x62,
+  0x69, 0x6e, 0x73, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x4a,
+  0x6f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x35, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x69,
   0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x61,
-  0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x68, 0x69,
-  0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69,
-  0x6f, 0x6e, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53, 0x65, 0x67, 0x6d,
-  0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x47, 0x61, 0x70, 0x4d, 0x61,
-  0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x61,
-  0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x67, 0x61, 0x70, 0x20, 0x69, 0x6e,
-  0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x73, 0x65,
-  0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65,
-  0x65, 0x6e, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20,
-  0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x0a, 0x63, 0x68,
-  0x69, 0x6d, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x62, 0x61, 0x6e, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63,
-  0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
-  0x28, 0x73, 0x29, 0x3a, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65,
-  0x6e, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x20, 0x66,
-  0x6f, 0x72, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20,
-  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x6e, 0x67, 0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x62, 0x6c, 0x6f,
+  0x63, 0x6b, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x69,
+  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x0a, 0x61, 0x6c, 0x69,
+  0x67, 0x6e, 0x53, 0x4a, 0x73, 0x74, 0x69, 0x74, 0x63, 0x68, 0x4d, 0x69,
+  0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20,
+  0x20, 0x30, 0x20, 0x2d, 0x31, 0x20, 0x30, 0x20, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x34, 0x2a, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20,
+  0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62,
+  0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74,
+  0x63, 0x68, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x69,
+  0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x6a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, 0x2d, 0x31, 0x3a, 0x20,
+  0x6e, 0x6f, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x29, 0x2e, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x28, 0x31, 0x29, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63,
+  0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x74,
+  0x69, 0x66, 0x73, 0x2c, 0x20, 0x28, 0x32, 0x29, 0x20, 0x47, 0x54, 0x2f,
+  0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x41, 0x43,
+  0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x33, 0x29, 0x20,
+  0x47, 0x43, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54,
+  0x2f, 0x47, 0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28,
+  0x34, 0x29, 0x20, 0x41, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x61, 0x6e, 0x64,
+  0x20, 0x47, 0x54, 0x2f, 0x41, 0x54, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66,
+  0x2e, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x4a, 0x44, 0x42,
+  0x6f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69,
+  0x6d, 0x75, 0x6d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67,
+  0x20, 0x28, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b,
+  0x20, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61,
+  0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x73, 0x6a,
+  0x64, 0x62, 0x29, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x0a,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64,
+  0x4d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x70, 0x4c, 0x6d, 0x69, 0x6e, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d,
+  0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67,
+  0x74, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+  0x69, 0x73, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x0a, 0x0a,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64,
+  0x4d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x70, 0x4c, 0x6d, 0x69, 0x6e, 0x4f,
+  0x76, 0x65, 0x72, 0x4c, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x30, 0x2e, 0x36,
+  0x36, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e,
+  0x30, 0x3a, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x70, 0x6c, 0x69,
+  0x63, 0x65, 0x64, 0x4d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x70, 0x4c, 0x6d,
+  0x69, 0x6e, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65,
+  0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x6c, 0x65,
+  0x6e, 0x67, 0x74, 0x68, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x57,
+  0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x50, 0x65, 0x72, 0x52, 0x65, 0x61,
+  0x64, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30,
+  0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e,
+  0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+  0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73,
+  0x20, 0x70, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, 0x64, 0x0a, 0x0a, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x73, 0x50, 0x65, 0x72, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77,
+  0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31,
+  0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30,
+  0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6e, 0x64,
+  0x6f, 0x77, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61,
+  0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x50, 0x65, 0x72, 0x52,
+  0x65, 0x61, 0x64, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30,
+  0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e,
+  0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+  0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65,
+  0x6e, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+  0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74,
+  0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x0a, 0x0a,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x64, 0x73, 0x54, 0x79, 0x70,
+  0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
+  0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
-  0x6e, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f,
+  0x63, 0x61, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x61, 0x6e,
+  0x64, 0x61, 0x72, 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x2d, 0x63, 0x6c, 0x69, 0x70, 0x70,
+  0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x45, 0x6e, 0x64, 0x54, 0x6f, 0x45, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x6f,
+  0x72, 0x63, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x2d, 0x74, 0x6f, 0x2d, 0x65,
+  0x6e, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f,
+  0x74, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x2d, 0x63, 0x6c, 0x69, 0x70, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x35, 0x70, 0x4f, 0x66, 0x52, 0x65,
+  0x61, 0x64, 0x31, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x75,
+  0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x20, 0x6f,
+  0x6e, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x35, 0x70, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x31, 0x2c,
+  0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65,
+  0x6e, 0x64, 0x73, 0x3a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, 0x78, 0x74,
+  0x65, 0x6e, 0x64, 0x35, 0x70, 0x4f, 0x66, 0x52, 0x65, 0x61, 0x64, 0x73,
+  0x31, 0x32, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x79,
+  0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x35, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x72, 0x65, 0x61, 0x64,
+  0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x32, 0x2c,
+  0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x65,
+  0x6e, 0x64, 0x73, 0x3a, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x0a, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x45, 0x6e, 0x64, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x72,
+  0x75, 0x64, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x20,
+  0x20, 0x20, 0x20, 0x43, 0x6f, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x61, 0x6e,
+  0x74, 0x50, 0x61, 0x69, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20,
+  0x70, 0x72, 0x6f, 0x74, 0x72, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
+  0x66, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+  0x65, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x73,
+  0x74, 0x61, 0x72, 0x74, 0x20, 0x28, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x6f,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2b, 0x73, 0x74, 0x72, 0x61, 0x6e,
+  0x64, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x64, 0x6f, 0x77, 0x6e, 0x73,
+  0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x28, 0x65, 0x6e, 0x64, 0x29,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x2d, 0x73, 0x74, 0x72,
+  0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x73, 0x74,
+  0x20, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20,
+  0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62,
+  0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x72, 0x75,
+  0x73, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x61,
+  0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x6e, 0x64, 0x20, 0x77,
+  0x6f, 0x72, 0x64, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x47, 0x65, 0x6e, 0x6f,
-  0x6d, 0x69, 0x63, 0x4e, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x4e, 0x73, 0x20,
-  0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f,
-  0x77, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67,
-  0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e,
-  0x63, 0x65, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6a,
-  0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x23, 0x23, 0x23,
-  0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
-  0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x6e, 0x6e, 0x6f, 0x74,
-  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x71, 0x75, 0x61, 0x6e, 0x74,
-  0x4d, 0x6f, 0x64, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28,
-  0x73, 0x29, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x6f, 0x66,
-  0x20, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
-  0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65,
-  0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
-  0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f,
+  0x6e, 0x63, 0x6f, 0x72, 0x64, 0x61, 0x6e, 0x74, 0x50, 0x61, 0x69, 0x72,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77,
+  0x69, 0x74, 0x68, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f,
+  0x20, 0x70, 0x72, 0x6f, 0x74, 0x72, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x20,
+  0x61, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x61, 0x6e,
+  0x74, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x72, 0x64, 0x61,
+  0x6e, 0x74, 0x50, 0x61, 0x69, 0x72, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x72,
+  0x65, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
+  0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6e, 0x6f,
+  0x6e, 0x2d, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x72,
+  0x75, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x64, 0x69, 0x73,
+  0x63, 0x6f, 0x72, 0x64, 0x61, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x69, 0x72,
+  0x73, 0x0a, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x6f, 0x66,
+  0x74, 0x43, 0x6c, 0x69, 0x70, 0x41, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72,
+  0x65, 0x6e, 0x63, 0x65, 0x45, 0x6e, 0x64, 0x73, 0x20, 0x59, 0x65, 0x73,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+  0x6f, 0x66, 0x74, 0x2d, 0x63, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x70, 0x61, 0x73, 0x74, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x6f, 0x73, 0x6f, 0x6d,
+  0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x59, 0x65, 0x73, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61,
+  0x6c, 0x6c, 0x6f, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x75,
+  0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f,
+  0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x20, 0x43, 0x75, 0x66, 0x66, 0x6c, 0x69, 0x6e,
+  0x6b, 0x73, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x57, 0x69, 0x6e, 0x64,
+  0x6f, 0x77, 0x73, 0x2c, 0x20, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73,
+  0x2c, 0x20, 0x42, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x0a, 0x77,
+  0x69, 0x6e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4d, 0x75, 0x6c, 0x74,
+  0x69, 0x6d, 0x61, 0x70, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x35, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78,
+  0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c,
+  0x6f, 0x63, 0x69, 0x20, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x20,
+  0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x74, 0x6f, 0x0a, 0x0a, 0x77,
+  0x69, 0x6e, 0x42, 0x69, 0x6e, 0x4e, 0x62, 0x69, 0x74, 0x73, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x36, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x3d, 0x6c, 0x6f,
+  0x67, 0x32, 0x28, 0x77, 0x69, 0x6e, 0x42, 0x69, 0x6e, 0x29, 0x2c, 0x20,
+  0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x42, 0x69, 0x6e,
+  0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x20,
+  0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64,
+  0x6f, 0x77, 0x73, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69,
+  0x6e, 0x67, 0x2c, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x77, 0x69, 0x6e,
+  0x64, 0x6f, 0x77, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x63, 0x63,
+  0x75, 0x70, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67,
+  0x65, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66,
+  0x20, 0x62, 0x69, 0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x41,
+  0x6e, 0x63, 0x68, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x74, 0x4e, 0x62, 0x69,
+  0x6e, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x39, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d,
+  0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x73, 0x20,
+  0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x77, 0x6f, 0x20,
+  0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74,
+  0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x61, 0x67, 0x67, 0x72,
+  0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61,
+  0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20,
+  0x6f, 0x6e, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x0a, 0x0a,
+  0x77, 0x69, 0x6e, 0x46, 0x6c, 0x61, 0x6e, 0x6b, 0x4e, 0x62, 0x69, 0x6e,
+  0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6c, 0x6f, 0x67,
+  0x32, 0x28, 0x77, 0x69, 0x6e, 0x46, 0x6c, 0x61, 0x6e, 0x6b, 0x29, 0x2c,
+  0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x20, 0x46,
+  0x6c, 0x61, 0x6e, 0x6b, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x6c, 0x65, 0x66, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x69, 0x67,
+  0x68, 0x74, 0x20, 0x66, 0x6c, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x20,
+  0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x65, 0x61, 0x63, 0x68, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x0a,
+  0x0a, 0x77, 0x69, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x76, 0x65,
+  0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65,
+  0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x35,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x3d,
+  0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x72,
+  0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x76, 0x65,
+  0x72, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63,
+  0x65, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x65,
+  0x64, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x77, 0x69, 0x6e, 0x64,
+  0x6f, 0x77, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x54, 0x41, 0x52,
+  0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74,
+  0x68, 0x6d, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x2e, 0x0a, 0x0a, 0x77, 0x69,
+  0x6e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67,
+  0x65, 0x42, 0x61, 0x73, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20,
+  0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61,
+  0x73, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x65, 0x64, 0x73,
+  0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
+  0x20, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x54, 0x41, 0x52, 0x6c,
+  0x6f, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68,
+  0x6d, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23,
+  0x20, 0x43, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x41, 0x6c,
+  0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x63, 0x68, 0x69,
+  0x6d, 0x4f, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x53, 0x41, 0x4d,
+  0x6f, 0x6c, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
+  0x6e, 0x67, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20,
+  0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6f, 0x75, 0x74,
+  0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x65, 0x70, 0x61,
+  0x72, 0x61, 0x74, 0x65, 0x53, 0x41, 0x4d, 0x6f, 0x6c, 0x64, 0x20, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6f,
+  0x6c, 0x64, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20,
+  0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x43, 0x68, 0x69,
+  0x6d, 0x65, 0x72, 0x69, 0x63, 0x2e, 0x6f, 0x75, 0x74, 0x2e, 0x73, 0x61,
+  0x6d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57,
+  0x69, 0x74, 0x68, 0x69, 0x6e, 0x42, 0x41, 0x4d, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
+  0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x42, 0x41, 0x4d, 0x20,
+  0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x41, 0x6c, 0x69, 0x67, 0x6e,
+  0x65, 0x64, 0x2e, 0x2a, 0x2e, 0x62, 0x61, 0x6d, 0x29, 0x0a, 0x0a, 0x63,
+  0x68, 0x69, 0x6d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69,
+  0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d,
+  0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x63,
+  0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x65, 0x67, 0x6d,
+  0x65, 0x6e, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20,
+  0x69, 0x66, 0x20, 0x3d, 0x3d, 0x30, 0x2c, 0x20, 0x6e, 0x6f, 0x20, 0x63,
+  0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53, 0x63, 0x6f, 0x72,
+  0x65, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69,
+  0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20,
+  0x28, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x29, 0x20, 0x73, 0x63, 0x6f,
+  0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68,
+  0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53, 0x63, 0x6f,
+  0x72, 0x65, 0x44, 0x72, 0x6f, 0x70, 0x4d, 0x61, 0x78, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20,
+  0x6d, 0x61, 0x78, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x20, 0x28, 0x64, 0x69,
+  0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x29, 0x20, 0x6f, 0x66,
+  0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x63,
+  0x6f, 0x72, 0x65, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x6d,
+  0x20, 0x6f, 0x66, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x6f,
+  0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72,
+  0x69, 0x63, 0x20, 0x73, 0x65, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+  0x29, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x0a, 0x0a,
+  0x63, 0x68, 0x69, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x65, 0x70,
+  0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d,
+  0x75, 0x6d, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+  0x65, 0x20, 0x28, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x29, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x63, 0x68, 0x69, 0x6d,
+  0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x61,
+  0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20,
+  0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53, 0x63, 0x6f,
+  0x72, 0x65, 0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f,
+  0x6e, 0x47, 0x54, 0x41, 0x47, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x31, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x70, 0x65, 0x6e,
+  0x61, 0x6c, 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x6e,
+  0x6f, 0x6e, 0x2d, 0x47, 0x54, 0x2f, 0x41, 0x47, 0x20, 0x63, 0x68, 0x69,
+  0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x4a, 0x75, 0x6e, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67,
+  0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x30, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d,
+  0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x68,
+  0x61, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x68,
+  0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53, 0x65, 0x67,
+  0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x47, 0x61, 0x70, 0x4d,
+  0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d,
+  0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x67, 0x61, 0x70, 0x20, 0x69,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x73,
+  0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77,
+  0x65, 0x65, 0x6e, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63,
+  0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x0a, 0x63,
+  0x68, 0x69, 0x6d, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x69,
+  0x63, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72,
+  0x65, 0x6e, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x20,
+  0x66, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63,
+  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x6e, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e,
+  0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x47, 0x65, 0x6e,
+  0x6f, 0x6d, 0x69, 0x63, 0x4e, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x4e, 0x73,
+  0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x6c, 0x6c,
+  0x6f, 0x77, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65,
+  0x6e, 0x63, 0x65, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20,
+  0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x23, 0x23,
+  0x23, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x6e, 0x6e, 0x6f,
+  0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x71, 0x75, 0x61, 0x6e,
+  0x74, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x6d,
-  0x65, 0x53, 0x41, 0x4d, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74,
-  0x70, 0x75, 0x74, 0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42, 0x41, 0x4d, 0x20,
-  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74,
-  0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
-  0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73,
-  0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65,
-  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+  0x28, 0x73, 0x29, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x6f,
+  0x66, 0x20, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+  0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x43, 0x6f, 0x75,
-  0x6e, 0x74, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e,
-  0x2e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64,
-  0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x0a, 0x0a,
-  0x71, 0x75, 0x61, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72,
-  0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x42, 0x41, 0x4d, 0x63, 0x6f, 0x6d,
-  0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x20, 0x20, 0x20,
-  0x31, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20,
-  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x2d, 0x31, 0x20, 0x74, 0x6f,
-  0x20, 0x31, 0x30, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72,
-  0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x63,
-  0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6c,
-  0x65, 0x76, 0x65, 0x6c, 0x2c, 0x20, 0x2d, 0x31, 0x3d, 0x64, 0x65, 0x66,
-  0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73,
-  0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x36, 0x3f, 0x29, 0x2c, 0x20, 0x30,
-  0x3d, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73,
-  0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x30, 0x3d, 0x6d, 0x61, 0x78, 0x69,
-  0x6d, 0x75, 0x6d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73,
-  0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x54, 0x72,
-  0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x42,
-  0x61, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e, 0x64,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f,
+  0x6d, 0x65, 0x53, 0x41, 0x4d, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75,
+  0x74, 0x70, 0x75, 0x74, 0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42, 0x41, 0x4d,
+  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20,
+  0x74, 0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70,
+  0x74, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20,
+  0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x69, 0x6c,
+  0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x43, 0x6f,
+  0x75, 0x6e, 0x74, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x0a,
+  0x0a, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x42, 0x41, 0x4d, 0x63, 0x6f,
+  0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x20, 0x20,
+  0x20, 0x31, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x2d, 0x31, 0x20, 0x74,
+  0x6f, 0x20, 0x31, 0x30, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x20, 0x42, 0x41, 0x4d, 0x20,
+  0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20,
+  0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2c, 0x20, 0x2d, 0x31, 0x3d, 0x64, 0x65,
+  0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65,
+  0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x36, 0x3f, 0x29, 0x2c, 0x20,
+  0x30, 0x3d, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73,
+  0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x30, 0x3d, 0x6d, 0x61, 0x78,
+  0x69, 0x6d, 0x75, 0x6d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73,
+  0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x54,
+  0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65,
+  0x42, 0x61, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e,
+  0x64, 0x65, 0x6c, 0x53, 0x6f, 0x66, 0x74, 0x63, 0x6c, 0x69, 0x70, 0x53,
+  0x69, 0x6e, 0x67, 0x6c, 0x65, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x72, 0x6f,
+  0x68, 0x69, 0x62, 0x69, 0x74, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75,
+  0x73, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+  0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e, 0x64,
   0x65, 0x6c, 0x53, 0x6f, 0x66, 0x74, 0x63, 0x6c, 0x69, 0x70, 0x53, 0x69,
-  0x6e, 0x67, 0x6c, 0x65, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x72, 0x6f, 0x68,
-  0x69, 0x62, 0x69, 0x74, 0x20, 0x76, 0x61, 0x72, 0x69, 0x6f, 0x75, 0x73,
-  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74,
-  0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e, 0x64, 0x65,
-  0x6c, 0x53, 0x6f, 0x66, 0x74, 0x63, 0x6c, 0x69, 0x70, 0x53, 0x69, 0x6e,
-  0x67, 0x6c, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
-  0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x64,
-  0x65, 0x6c, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x63, 0x6c,
-  0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73,
-  0x69, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x65, 0x6e, 0x64, 0x20, 0x61, 0x6c,
-  0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x2d, 0x20, 0x63,
-  0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69,
-  0x74, 0x68, 0x20, 0x52, 0x53, 0x45, 0x4d, 0x0a, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x2e, 0x2e, 0x2e, 0x20, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74,
-  0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x65, 0x6e, 0x64, 0x20,
-  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x0a,
-  0x23, 0x23, 0x23, 0x20, 0x32, 0x2d, 0x70, 0x61, 0x73, 0x73, 0x20, 0x4d,
-  0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x0a, 0x74, 0x77, 0x6f, 0x70, 0x61,
-  0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e,
-  0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
-  0x6e, 0x67, 0x3a, 0x20, 0x32, 0x2d, 0x70, 0x61, 0x73, 0x73, 0x20, 0x6d,
-  0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2e,
+  0x6e, 0x67, 0x6c, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, 0x20, 0x69, 0x6e,
+  0x64, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x63,
+  0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20,
+  0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x65, 0x6e, 0x64, 0x20, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x2d, 0x20,
+  0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x77,
+  0x69, 0x74, 0x68, 0x20, 0x52, 0x53, 0x45, 0x4d, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69,
+  0x74, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x65, 0x6e, 0x64,
+  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a,
+  0x0a, 0x23, 0x23, 0x23, 0x20, 0x32, 0x2d, 0x70, 0x61, 0x73, 0x73, 0x20,
+  0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x0a, 0x74, 0x77, 0x6f, 0x70,
+  0x61, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
+  0x69, 0x6e, 0x67, 0x3a, 0x20, 0x32, 0x2d, 0x70, 0x61, 0x73, 0x73, 0x20,
+  0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x65,
+  0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x31, 0x2d,
+  0x70, 0x61, 0x73, 0x73, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67,
   0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
   0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x31, 0x2d, 0x70,
-  0x61, 0x73, 0x73, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x0a,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x42, 0x61, 0x73, 0x69, 0x63, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x62, 0x61, 0x73, 0x69,
-  0x63, 0x20, 0x32, 0x2d, 0x70, 0x61, 0x73, 0x73, 0x20, 0x6d, 0x61, 0x70,
-  0x70, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61,
-  0x6c, 0x6c, 0x20, 0x31, 0x73, 0x74, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20,
-  0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e,
-  0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20,
-  0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69,
-  0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,
-  0x65, 0x20, 0x66, 0x6c, 0x79, 0x0a, 0x0a, 0x74, 0x77, 0x6f, 0x70, 0x61,
-  0x73, 0x73, 0x31, 0x72, 0x65, 0x61, 0x64, 0x73, 0x4e, 0x20, 0x20, 0x20,
-  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
-  0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6e,
-  0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61,
-  0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73,
-  0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x31, 0x73,
-  0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x20, 0x55, 0x73, 0x65, 0x20,
-  0x76, 0x65, 0x72, 0x79, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20, 0x6e,
-  0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x64, 0x65,
-  0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x74, 0x6f,
-  0x20, 0x6d, 0x61, 0x70, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61,
-  0x64, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69,
-  0x72, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x0a, 0x0a
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x61, 0x73, 0x69, 0x63, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x62, 0x61, 0x73,
+  0x69, 0x63, 0x20, 0x32, 0x2d, 0x70, 0x61, 0x73, 0x73, 0x20, 0x6d, 0x61,
+  0x70, 0x70, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+  0x61, 0x6c, 0x6c, 0x20, 0x31, 0x73, 0x74, 0x20, 0x70, 0x61, 0x73, 0x73,
+  0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69,
+  0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20,
+  0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x66, 0x6c, 0x79, 0x0a, 0x0a, 0x74, 0x77, 0x6f, 0x70,
+  0x61, 0x73, 0x73, 0x31, 0x72, 0x65, 0x61, 0x64, 0x73, 0x4e, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20,
+  0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65,
+  0x61, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65,
+  0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x31,
+  0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x20, 0x55, 0x73, 0x65,
+  0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x20,
+  0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x6f, 0x72, 0x20, 0x64,
+  0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x74,
+  0x6f, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65,
+  0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66,
+  0x69, 0x72, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x0a, 0x0a
 };
-unsigned int parametersDefault_len = 28391;
+unsigned int parametersDefault_len = 29724;
diff --git a/source/readLoad.cpp b/source/readLoad.cpp
index a86d4c1..40b92e1 100644
--- a/source/readLoad.cpp
+++ b/source/readLoad.cpp
@@ -4,11 +4,11 @@
 int readLoad(istream& readInStream, Parameters* P, uint iMate, uint& Lread, uint& LreadOriginal, char* readName, char* Seq, char* SeqNum, char* Qual, char* QualNum, uint &clip3pNtotal, uint &clip5pNtotal, uint &clip3pAdapterN, uint &iReadAll, uint &readFilesIndex, char &readFilter){
     //load one read from a stream
     int readFileType=0;
-    
+
 //     readInStream.getline(readName,DEF_readNameLengthMax); //extract name
 
     if (readInStream.peek()!='@' && readInStream.peek()!='>') return -1; //end of the stream
-    
+
     readName[0]=0;//clear char array
     readInStream >> readName; //TODO check that it does not overflow the array
     if (strlen(readName)>=DEF_readNameLengthMax-1) {
@@ -17,13 +17,13 @@ int readLoad(istream& readInStream, Parameters* P, uint iMate, uint& Lread, uint
         errOut << "Read Name="<<readName<<"\n";
         errOut << "DEF_readNameLengthMax="<<DEF_readNameLengthMax<<"\n";
         errOut << "SOLUTION: increase DEF_readNameLengthMax in IncludeDefine.h and re-compile STAR\n";
-        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);        
-    };    
-    
+        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
+    };
+
     readInStream >> iReadAll >> readFilter >> readFilesIndex; //extract read number
     readInStream.ignore(DEF_readNameSeqLengthMax,'\n');//ignore the resit of the line - just in case
-    
-    readInStream.getline(Seq,DEF_readSeqLengthMax+1); //extract sequence   
+
+    readInStream.getline(Seq,DEF_readSeqLengthMax+1); //extract sequence
 
     Lread=(uint) readInStream.gcount();
     if (Lread<=1) {
@@ -37,39 +37,39 @@ int readLoad(istream& readInStream, Parameters* P, uint iMate, uint& Lread, uint
     };
     --Lread;//do not count /n in the read length
     LreadOriginal=Lread;
-    
+
     if (Lread>DEF_readSeqLengthMax) {
         ostringstream errOut;
         errOut << "EXITING because of FATAL ERROR in reads input: Lread>=" << Lread << "   while DEF_readSeqLengthMax=" << DEF_readSeqLengthMax <<"\n";
         errOut << "Read Name="<<readName<<"\n";
         errOut << "SOLUTION: increase DEF_readSeqLengthMax in IncludeDefine.h and re-compile STAR\n";
-        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);         
-    };                        
+        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
+    };
 
 //     //was trying to read multi-line
 //     char nextChar='A';
 //     Lread=0;
 //     while (nextChar!='@' && nextChar!='>' && nextChar!='+' && nextChar!=' ' && nextChar!='\n' && !readInStream.eof()) {//read multi-line fasta
-//         readInStream.getline(Seq+Lread,DEF_readSeqLengthMax+1); //extract sequence   
-//         Lread+=(uint) readInStream.gcount() - 1;    //count chars in the sequence line, but do not read yet                          
-//         nextChar=readInStream.peek();        
+//         readInStream.getline(Seq+Lread,DEF_readSeqLengthMax+1); //extract sequence
+//         Lread+=(uint) readInStream.gcount() - 1;    //count chars in the sequence line, but do not read yet
+//         nextChar=readInStream.peek();
 //     };
 //     if (Lread>DEF_readSeqLengthMax) {
 //         ostringstream errOut;
 //         errOut << "EXITING because of FATAL ERROR in reads input: Lread>=" << Lread << "   while DEF_readSeqLengthMax=" << DEF_readSeqLengthMax <<"\n";
 //         errOut << "Read Name="<<readName<<"\n";
 //         errOut << "SOLUTION: increase DEF_readSeqLengthMax in IncludeDefine.h and re-compile STAR\n";
-//         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);        
-//     };     
-//     LreadOriginal=Lread;    
-    
+//         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
+//     };
+//     LreadOriginal=Lread;
+
     if ( Lread>(P->clip5pNbases[iMate]+P->clip3pNbases[iMate]) ) {
-        Lread=Lread-(P->clip5pNbases[iMate]+P->clip3pNbases[iMate]); 
+        Lread=Lread-(P->clip5pNbases[iMate]+P->clip3pNbases[iMate]);
     } else {
         Lread=0;
     };
     convertNucleotidesToNumbers(Seq+P->clip5pNbases[iMate],SeqNum,Lread);
-        
+
     //clip the adapter
     if (P->clip3pAdapterSeq.at(iMate).length()>0) {
         clip3pAdapterN = Lread-localSearch(SeqNum,Lread,P->clip3pAdapterSeqNum[iMate],P->clip3pAdapterSeq.at(iMate).length(),P->clip3pAdapterMMp[iMate]);
@@ -79,27 +79,27 @@ int readLoad(istream& readInStream, Parameters* P, uint iMate, uint& Lread, uint
     };
 
     //final read length, trim 3p after the adapter was clipped
-    if (Lread>P->clip3pAfterAdapterNbases[iMate]) {    
+    if (Lread>P->clip3pAfterAdapterNbases[iMate]) {
         Lread =Lread - P->clip3pAfterAdapterNbases[iMate];
     } else {
         Lread=0;
     };
-    
+
     clip3pNtotal=P->clip3pNbases[iMate] + clip3pAdapterN + P->clip3pAfterAdapterNbases[iMate];
     clip5pNtotal=P->clip5pNbases[iMate];
 
     if (readName[0]=='@') {//fastq format, read qualities
         readFileType=2;
-        readInStream.ignore(DEF_readNameLengthMax,'\n'); //extract header line   
+        readInStream.ignore(DEF_readNameLengthMax,'\n'); //extract header line
         readInStream.getline(Qual,DEF_readSeqLengthMax);//read qualities
         if ((uint) readInStream.gcount() != LreadOriginal+1) {//inconsistent read sequence and quality
-            ostringstream errOut;            
+            ostringstream errOut;
             errOut << "EXITING because of FATAL ERROR in reads input: quality string length is not equal to sequence length\n";
             errOut << readName<<"\n";
-            errOut << Seq <<"\n";            
+            errOut << Seq <<"\n";
             errOut << Qual <<"\n";
             errOut << "SOLUTION: fix your fastq file\n";
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P); 
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         };
         if (P->outQSconversionAdd!=0) {
             for (uint ii=0;ii<LreadOriginal;ii++) {
@@ -112,17 +112,17 @@ int readLoad(istream& readInStream, Parameters* P, uint iMate, uint& Lread, uint
                 Qual[ii]=qs;
             };
         };
-        
+
     } else if (readName[0]=='>') {//fasta format, assign Qtop to all qualities
         readFileType=1;
         for (uint ii=0;ii<LreadOriginal;ii++) Qual[ii]='A';
         Qual[LreadOriginal]=0;
-    } else {//header 
+    } else {//header
         ostringstream errOut;
         errOut <<"Unknown reads file format: header line does not start with @ or > : "<< readName<<"\n";
-        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P); 
+        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
     };
-    
+
     for (uint ii=0;ii<Lread;ii++) {//for now: qualities are all 1
         if (SeqNum[ii]<4) {
             QualNum[ii]=1;
@@ -130,22 +130,22 @@ int readLoad(istream& readInStream, Parameters* P, uint iMate, uint& Lread, uint
             QualNum[ii]=0;
         };
     };
-            
+
 //     for (uint ii=0;ii<Lread;ii++) {//simply cut too high Qs
 //         QualNum[ii]=(Qual[ii+P->clip5pNbases[iMate]] > P->QasciiSubtract) ? (Qual[ii+P->clip5pNbases[iMate]] - P->QasciiSubtract) : 0; //substract QasciiSubtract
 //         QualNum[ii]=P->QSconv[(int) QualNum[ii]];
 //         QualNum[ii]=min(QualNum[ii], P->Qtop);//cut QSs at the Qtop
 // //         if (QualNum[ii]==2) QualNum[ii]=P->Qtop;
 //         if (SeqNum[ii]>3) QualNum[ii]=0; //QS=0 for Ns
-//         Qual1[1][Lread-ii-1]=QualNum[ii]; //reverse     
+//         Qual1[1][Lread-ii-1]=QualNum[ii]; //reverse
 //     };
-    
+
 
     //trim read name
     for (uint ii=0; ii<P->readNameSeparatorChar.size(); ii++)
     {
         char* pSlash=strchr(readName,P->readNameSeparatorChar.at(ii)); //trim everything after ' '
-        if (pSlash!=NULL) *pSlash=0;                
+        if (pSlash!=NULL) *pSlash=0;
     };
     return readFileType;
 };
diff --git a/source/serviceFuns.cpp b/source/serviceFuns.cpp
index 6e83e89..756dcbc 100644
--- a/source/serviceFuns.cpp
+++ b/source/serviceFuns.cpp
@@ -17,12 +17,12 @@ inline int funCompareUint1 (const void *a, const void *b) {
     if (va>vb) {
 		return 1;
 	} else if (va==vb) {
-		return 0;        
+		return 0;
 	} else {
 		return -1;
 	};
 };
-    
+
 inline int funCompareUint2 (const void *a, const void *b) {
     uint va= *((uint*) a);
     uint vb= *((uint*) b);
@@ -34,7 +34,7 @@ inline int funCompareUint2 (const void *a, const void *b) {
 	} else if (va==vb && va1>vb1) {
 		return 1;
 	} else if (va==vb && va1==vb1) {
-		return 0;        
+		return 0;
 	} else {
 		return -1;
 	};
@@ -53,7 +53,7 @@ inline int funCompareArrays (const void *a, const void *b) {
         };
     };
 
-    return 0;        
+    return 0;
 
 };
 
@@ -62,7 +62,7 @@ inline uint32 binarySearch1(argType x, argType *X, uint32 N) {
     //binary search in the sorted list
     //check the boundaries first
     if (x>X[N-1] || x<X[0]) return -1;
-    
+
     uint32 i1=0, i2=N-1, i3=N/2;
     while (i2>i1+1) {//binary search
         i3=(i1+i2)/2;
@@ -72,7 +72,7 @@ inline uint32 binarySearch1(argType x, argType *X, uint32 N) {
             i1=i3;
         };
     };
-    
+
     while (i1<N-1 && x==X[i1+1]) ++i1; //go forward to check for equals
     return i1;
 };
@@ -81,13 +81,13 @@ template <class argType>
 inline int32 binarySearch1a(argType x, argType *X, int32 N) {
     //binary search in the sorted list
     //check the boundaries first
-    
+
     if (x>X[N-1]) {
         return N-1;
     } else if (x<X[0]) {
         return -1;
     };
-    
+
     int32 i1=0, i2=N-1, i3=N/2;
     while (i2>i1+1) {//binary search
         i3=(i1+i2)/2;
@@ -97,7 +97,7 @@ inline int32 binarySearch1a(argType x, argType *X, int32 N) {
             i1=i3;
         };
     };
-    
+
     while (i1<N-1 && x==X[i1+1]) ++i1; //go forward to check for equals
     return i1;
 };
diff --git a/source/signalFromBAM.cpp b/source/signalFromBAM.cpp
index 7f6b874..565787d 100644
--- a/source/signalFromBAM.cpp
+++ b/source/signalFromBAM.cpp
@@ -6,7 +6,7 @@ void signalFromBAM(const string bamFileName, const string sigFileName, Parameter
 
     bam1_t *bamA;
     bamA=bam_init1();
-    
+
     double nMult=0, nUniq=0;
 
     if (P.outWigFlags.norm==1) {//count reads in the BAM file
@@ -18,7 +18,7 @@ void signalFromBAM(const string bamFileName, const string sigFileName, Parameter
             if (bamA->core.tid<0) continue; //unmapped read
 //             if ( !std::regex_match(chrName.at(bamA->core.tid),std::regex(P.outWigReferencesPrefix))) continue; //reference does not mathc required references
             if ( P.outWigReferencesPrefix!="-" && (P.outWigReferencesPrefix.compare(0,P.outWigReferencesPrefix.size(),bamHeader->target_name[bamA->core.tid],P.outWigReferencesPrefix.size())!=0) ) continue; //reference does not match required references
-            
+
             uint8_t* aNHp=bam_aux_get(bamA,"NH");
             if (aNHp!=NULL) {
                 uint32_t aNH=bam_aux2i(aNHp);
@@ -30,17 +30,17 @@ void signalFromBAM(const string bamFileName, const string sigFileName, Parameter
             };
         };
         bgzf_close(bamIn);
-    };    
-    
+    };
+
     BGZF *bamIn=bgzf_open(bamFileName.c_str(),"r");
     bam_hdr_t *bamHeader=bam_hdr_read(bamIn);
 
     int sigN=P.outWigFlags.strand ? 4 : 2;
-    
+
     double *normFactor=new double[sigN];
-    
+
     ofstream **sigOutAll=new ofstream* [sigN];
-    
+
     string* sigOutFileName=new string[sigN];
     sigOutFileName[0]=sigFileName+".Unique.str1.out";
     sigOutFileName[1]=sigFileName+".UniqueMultiple.str1.out";
@@ -48,33 +48,33 @@ void signalFromBAM(const string bamFileName, const string sigFileName, Parameter
         sigOutFileName[2]=sigFileName+".Unique.str2.out";
         sigOutFileName[3]=sigFileName+".UniqueMultiple.str2.out";
     };
-    
+
     for (int ii=0; ii<sigN; ii++) {
         sigOutFileName[ii]+= (P.outWigFlags.format==0 ? ".bg" : ".wig");
         sigOutAll[ii]=new ofstream ( sigOutFileName[ii].c_str() );
     };
-    
+
     if (P.outWigFlags.norm==0) {//raw counts
         normFactor[0]=1;
-        normFactor[1]=1;    
+        normFactor[1]=1;
     } else if (P.outWigFlags.norm==1) {//normlaized
         normFactor[0]=1.0e6 / nUniq;
-        normFactor[1]=1.0e6 / (nUniq+nMult);   
+        normFactor[1]=1.0e6 / (nUniq+nMult);
         for (int is=0;is<sigN;is++) {//formatting double output
             *sigOutAll[is]<<setiosflags(ios::fixed) << setprecision(5);
-        };        
+        };
     };
     if (P.outWigFlags.strand) {
         normFactor[2]=normFactor[0];
         normFactor[3]=normFactor[1];
     };
 
-    
+
     int iChr=-999;
     double *sigAll=NULL;
-    uint32_t chrLen=0;    
+    uint32_t chrLen=0;
     while ( true ) {//until the end of file
-        int bamBytes1=bam_read1(bamIn, bamA);    
+        int bamBytes1=bam_read1(bamIn, bamA);
         if (bamA->core.tid!=iChr || bamBytes1<0) {
             //output to file
             if (iChr!=-999) {//iChr=-999 marks chromosomes that are not output, including unmapped reads
@@ -83,7 +83,7 @@ void signalFromBAM(const string bamFileName, const string sigFileName, Parameter
                         *sigOutAll[is] <<"variableStep chrom="<<bamHeader->target_name[iChr] <<"\n";
                     };
                     double prevSig=0;
-                    for (uint32_t ig=0;ig<chrLen;ig++) { 
+                    for (uint32_t ig=0;ig<chrLen;ig++) {
                         double newSig=sigAll[sigN*ig+is];
                         if (P.outWigFlags.format==0) {//bedGraph
                             if (newSig!=prevSig) {
@@ -106,23 +106,23 @@ void signalFromBAM(const string bamFileName, const string sigFileName, Parameter
             if (bamBytes1<0) {//no more reads
                 break;
             };
-            
+
             iChr=bamA->core.tid;
             if ( iChr==-1 || (P.outWigReferencesPrefix!="-" && (P.outWigReferencesPrefix.compare(0,P.outWigReferencesPrefix.size(),bamHeader->target_name[bamA->core.tid],P.outWigReferencesPrefix.size())!=0) ) ) {
                 iChr=-999;
                 continue; //reference does not match required references
             };
-            
-            chrLen=bamHeader->target_len[iChr]+1;//one extra base at the end which sohuld always be 0            
-            delete [] sigAll;        
+
+            chrLen=bamHeader->target_len[iChr]+1;//one extra base at the end which sohuld always be 0
+            delete [] sigAll;
             sigAll= new double[sigN*chrLen];
             memset(sigAll, 0, sizeof(*sigAll)*sigN*chrLen);
         };
-        
+
 //         uint32_t nCigar =(bamA->core.flag<<16)>>16;
 //         uint32_t mapFlag=bamA->core.flag>>16;
 //         uint32_t mapQ=(bamA->core.flag<<16)>>24;
-        
+
         #define BAM_CIGAR_OperationShift 4
         #define BAM_CIGAR_LengthBits 28
         #define BAM_CIGAR_M 0
@@ -137,7 +137,7 @@ void signalFromBAM(const string bamFileName, const string sigFileName, Parameter
 
         //by default, alignments marked as duplicate are not processed
         if ( (bamA->core.flag & 0x400) > 0 ) continue;
-        
+
         //NH attribute
         uint8_t* aNHp=bam_aux_get(bamA,"NH");
         if (aNHp==NULL) continue; //do not process lines without NH field
@@ -147,7 +147,7 @@ void signalFromBAM(const string bamFileName, const string sigFileName, Parameter
         uint32_t iStrand=0;
         if (P.outWigFlags.strand) {//strand for stranded data from SAM flag
             iStrand= ( (bamA->core.flag & 0x10) > 0 ) == ( (bamA->core.flag & 0x80) == 0 );//0/1 for +/-
-        };          
+        };
         if (P.outWigFlags.type==1) {//5' of the1st read signal only, RAMPAGE/CAGE
             if ( (bamA->core.flag & 0x80)>0) continue; //skip if this the second mate
             if (iStrand==0) {
@@ -158,9 +158,9 @@ void signalFromBAM(const string bamFileName, const string sigFileName, Parameter
                 continue; //record only the first position
             };
         };
-        
+
         uint32_t* cigar=(uint32_t*) (bamA->data+bamA->core.l_qname);
-       
+
         for (uint32_t ic=0; ic<bamA->core.n_cigar; ic++) {
             uint32_t cigOp=(cigar[ic]<<BAM_CIGAR_LengthBits)>>BAM_CIGAR_LengthBits;
             uint32_t cigL=cigar[ic]>>BAM_CIGAR_OperationShift;
@@ -195,7 +195,7 @@ void signalFromBAM(const string bamFileName, const string sigFileName, Parameter
             sigAll[aG*sigN+1+2*iStrand]+=1.0/aNH;//U+M, normalized by the number of multi-mapping loci
         };
     };
-    delete [] sigAll;        
+    delete [] sigAll;
 
     for (int is=0; is<sigN; is++) {// flush/close all signal files
         sigOutAll[is]->flush();
diff --git a/source/sjSplitAlign.cpp b/source/sjSplitAlign.cpp
index 48a4fe5..1351aae 100644
--- a/source/sjSplitAlign.cpp
+++ b/source/sjSplitAlign.cpp
@@ -1,4 +1,4 @@
-#include "IncludeDefine.h"                                                                                                                                                     
+#include "IncludeDefine.h"
 #include "Parameters.h"
 
 bool sjAlignSplit(uint a1,uint aLength,Parameters* P, uint &a1D, uint &aLengthD, uint &a1A, uint &aLengthA, uint &isj) {
diff --git a/source/sjdbBuildIndex.cpp b/source/sjdbBuildIndex.cpp
index c6c1266..8d4539b 100644
--- a/source/sjdbBuildIndex.cpp
+++ b/source/sjdbBuildIndex.cpp
@@ -14,21 +14,21 @@
 #include "funCompareUintAndSuffixes.h"
 
 void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedArray &SA, PackedArray &SA2, PackedArray &SAi) {
-    
+
     #define SPACER_CHAR GENOME_spacingChar
 
     if (P->sjdbN==0)
     {//no junctions to insert
         return;
     };
-    
+
     time_t rawtime;
     time ( &rawtime );
-    P->inOut->logMain   << timeMonthDayTime(rawtime) << " ..... Inserting junctions into the genome indices" <<endl;    
-    *P->inOut->logStdOut  << timeMonthDayTime(rawtime) << " ..... Inserting junctions into the genome indices" <<endl;
-    
+    P->inOut->logMain   << timeMonthDayTime(rawtime) << " ..... inserting junctions into the genome indices" <<endl;
+    *P->inOut->logStdOut  << timeMonthDayTime(rawtime) << " ..... inserting junctions into the genome indices" <<endl;
+
     uint nGsj=P->sjdbLength*P->sjdbN;
-    for (uint ii=1; ii<=P->sjdbN; ii++) 
+    for (uint ii=1; ii<=P->sjdbN; ii++)
     {
         Gsj[ii*P->sjdbLength-1]=SPACER_CHAR; //to make sure this is > than any genome char
     };
@@ -42,10 +42,10 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
     complementSeqNumbers(Gsj, G1c, nGsj*2+1);
 
     uint32* oldSJind=new uint32[P1->sjdbN];
-    
+
 //     uint nIndicesSJ1=P->sjdbOverhang;
     uint   nIndicesSJ1=P->sjdbLength;//keep all indices - this is pre-2.4.1 of generating the genome
-    
+
     uint64* indArray=new uint64[2*P->sjdbN*(nIndicesSJ1+1)*2];//8+4 bytes for SA index and index in the genome * nJunction * nIndices per junction * 2 for reverse compl
     uint64 sjNew=0;
     #pragma omp parallel num_threads(P->runThreadN)
@@ -55,26 +55,26 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
         char** seq1=new char*[2];
         seq1[0]=Gsj+isj*P->sjdbLength;
         seq1[1]=G1c+isj*P->sjdbLength;
-        
+
         uint isj1=isj<P->sjdbN ? isj : 2*P->sjdbN-1-isj;
         int sjdbInd = P1->sjdbN==0 ? -1 : binarySearch2(P->sjdbStart[isj1],P->sjdbEnd[isj1],P1->sjdbStart,P1->sjdbEnd,P1->sjdbN);
-        if (sjdbInd<0) 
+        if (sjdbInd<0)
         {//count new junctions
             ++sjNew;
-        } else 
+        } else
         {//record new index of the old junctions
             oldSJind[sjdbInd]=isj1;
         };
-        
+
         for (uint istart1=0; istart1<nIndicesSJ1;istart1++) {
-            
+
             uint istart=istart1;
 //             uint istart=isj<P->sjdbN ? istart1 : istart1+1; //for rev-compl junction, shift by one base to start with the 1st non-spacer base
             uint ind1=2*(isj*nIndicesSJ1+istart1);
-            if (sjdbInd>=0 || seq1[0][istart]>3) 
+            if (sjdbInd>=0 || seq1[0][istart]>3)
             {//no index for already included junctions, or suffices starting with N
                 indArray[ind1]=-1;
-            } else 
+            } else
             {
                 //indArray[ind1] =  suffixArraySearch(seq1, istart, P->sjdbLength-istart1, G, SA, true, 0, P->nSA-1, 0, P) ;
                 indArray[ind1] =  suffixArraySearch1(seq1, istart, 10000, G, -1LLU, SA, true, 0, P->nSA-1, 0, P) ;
@@ -85,10 +85,10 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
         };
     };
     sjNew = sjNew/2;//novel junctions were double counted on two strands
-    
+
     time ( &rawtime );
     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished SA search: number of new junctions=" << sjNew <<", old junctions="<<P->sjdbN-sjNew<<endl;
-    
+
     uint nInd=0;//true number of new indices
     for (uint ii=0; ii<2*P->sjdbN*nIndicesSJ1; ii++) {//remove entries that cannot be inserted, this cannot be done in the parallel cycle above
         if (indArray[ii*2]!= (uint) -1) {
@@ -98,33 +98,33 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
         };
     };
 
-    globalGenomeArray=Gsj;
+    g_funCompareUintAndSuffixes_G=Gsj;
     qsort((void*) indArray, nInd, 2*sizeof(uint64), funCompareUintAndSuffixes);
     time ( &rawtime );
     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished sorting SA indicesL nInd="<<nInd <<endl;
 
     indArray[2*nInd]=-999; //mark the last junction
     indArray[2*nInd+1]=-999; //mark the last junction
-    
-    P->nGenome=P->chrStart[P->nChrReal]+nGsj;    
+
+    P->nGenome=P->chrStart[P->nChrReal]+nGsj;
     P->nSA+=nInd;
-    
+
     uint GstrandBit1 = (uint) floor(log(P->nGenome)/log(2))+1;
     if (GstrandBit1<32) GstrandBit1=32; //TODO: use simple access function for SA
-    if ( GstrandBit1 != P->GstrandBit) 
+    if ( GstrandBit1 != P->GstrandBit)
     {//too many junctions were added - GstrandBit changed
         ostringstream errOut;
         errOut << "EXITING because of FATAL ERROR: cannot insert junctions on the fly because of strand GstrandBit problem\n";
         errOut << "SOLUTION: please contact STAR author at https://groups.google.com/forum/#!forum/rna-star\n";
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_FILES, *P);
     };
-    
+
     SA2.defineBits(P->GstrandBit+1,P->nSA);
     uint nGsjNew=sjNew*P->sjdbLength; //this is the actual number of bytes added to the genome, while nGsj is the total size of all junctions
-    
+
     uint N2bit= 1LLU << P->GstrandBit;
     uint strandMask=~N2bit;
-    
+
     /*testing
     PackedArray SAo;
     SAo.defineBits(P->GstrandBit+1,P->nSA);
@@ -133,9 +133,9 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
     oldSAin.read(SAo.charArray,SAo.lengthByte);
     oldSAin.close();
     */
-    
+
     uint isj=0, isa2=0;
-    for (uint isa=0;isa<P1->nSA;isa++) {   
+    for (uint isa=0;isa<P1->nSA;isa++) {
         while (isa==indArray[isj*2]) {//insert sj index before the existing index
             uint ind1=indArray[isj*2+1];
             if (ind1<nGsj) {
@@ -149,12 +149,12 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
                cout <<isa2 <<" "<< SA2[isa2]<<" "<<SAo[isa2]<<endl;
                //sleep(100);
             };
-            */                  
+            */
             ++isa2; ++isj;
         };
-        
-        uint ind1=SA[isa];       
-        if ( (ind1 & N2bit)>0 ) 
+
+        uint ind1=SA[isa];
+        if ( (ind1 & N2bit)>0 )
         {//- strand
             uint ind1s = P1->nGenome - (ind1 & strandMask);
             if (ind1s>P->chrStart[P->nChrReal])
@@ -174,17 +174,17 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
                 ind1 += (oldSJind[sj1]-sj1)*P->sjdbLength;
             };
         };
-        
+
         SA2.writePacked(isa2,ind1);
             /*testing
             if (SA2[isa2]!=SAo[isa2]) {
                cout <<isa2 <<" "<< SA2[isa2]<<" "<<SAo[isa2]<<endl;
                //sleep(100);
             };
-            */         
+            */
         ++isa2;
     };
-    
+
     for (;isj<nInd;isj++) {//insert last new indices after the last old index
         uint ind1=indArray[isj*2+1];
         if (ind1<nGsj) {
@@ -198,13 +198,13 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
                cout <<isa2 <<" "<< SA2[isa2]<<" "<<SAo[isa2]<<endl;
                //sleep(100);
             };
-            */          
+            */
         ++isa2;
-    };    
+    };
 
     time ( &rawtime );
     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished inserting junction indices" <<endl;
-    
+
     //SAi insertions
     for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {
         uint iSJ=0;
@@ -212,8 +212,8 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
         for (uint ii=P->genomeSAindexStart[iL];ii<P->genomeSAindexStart[iL+1]; ii++) {//scan through the longest index
             uint iSA1=SAi[ii];
             uint iSA2=iSA1 & P->SAiMarkNmask & P->SAiMarkAbsentMask;
-            
-            if ( iSJ<nInd && (iSA1 &  P->SAiMarkAbsentMaskC)>0 ) 
+
+            if ( iSJ<nInd && (iSA1 &  P->SAiMarkAbsentMaskC)>0 )
             {//index missing from the old genome
                 uint iSJ1=iSJ;
                 int64 ind1=funCalcSAi(Gsj+indArray[2*iSJ+1],iL);
@@ -231,21 +231,21 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
                 } else {
                     iSJ=iSJ1;
                 };
-            } else 
+            } else
             {//index was present in the old genome
                 while (iSJ<nInd && indArray[2*iSJ]-1+1<iSA2) {//for this index insert "smaller" junctions
                     ++iSJ;
                 };
-                
+
                 while (iSJ<nInd && indArray[2*iSJ]-1+1==iSA2) {//special case, the index falls right behind SAi
                     if (funCalcSAi(Gsj+indArray[2*iSJ+1],iL) >= (int64) (ii-P->genomeSAindexStart[iL]) ) {//this belongs to the next index
                         break;
                     };
                     ++iSJ;
-                };   
-                
+                };
+
                 SAi.writePacked(ii,iSA1+iSJ);
-                
+
                 for (uint ii0=ind0+1; ii0<ii; ii0++) {//fill all the absent indices with this value
                     SAi.writePacked(ii0,(iSA2+iSJ) | P->SAiMarkAbsentMaskC);
                 };
@@ -280,22 +280,22 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
     };
     time ( &rawtime );
     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished SAi" <<endl;
-    
+
     //change parameters, most parameters are already re-defined in sjdbPrepare.cpp
     SA.defineBits(P->GstrandBit+1,P->nSA);//same as SA2
     SA.pointArray(SA2.charArray);
     P->nSAbyte=SA.lengthByte;
     P->sjGstart=P->chrStart[P->nChrReal];
     memcpy(G+P->chrStart[P->nChrReal],Gsj, nGsj);
-    
+
     /* testing
     PackedArray SAio=SAi;
     SAio.allocateArray();
     ifstream oldSAiin("./DirTrue/SAindex");
     oldSAiin.read(SAio.charArray,8*(P->genomeSAindexNbases+2));//skip first bytes
     oldSAiin.read(SAio.charArray,SAio.lengthByte);
-    oldSAiin.close();  
-    
+    oldSAiin.close();
+
 
     for (uint ii=0;ii<P->nSA;ii++) {
         if (SA2[ii]!=SAo[ii]) {
@@ -310,20 +310,20 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
                     cout <<ii<<" "<<SAio[ii]<<" "<<SAi[ii]<<endl;
                 };
         };
-    };    
+    };
     */
-    
+
     /*
     ofstream genomeOut("/home/dobin/Genome");
     fstreamWriteBig(genomeOut,G,P->nGenome+nGsj,"777","777",P);
-    genomeOut.close(); 
+    genomeOut.close();
     genomeOut.open("/home/dobin/SA");
     fstreamWriteBig(genomeOut,SA2.charArray,SA2.lengthByte,"777","777",P);
     genomeOut.close();
     */
-    
+
     delete [] indArray;
     delete [] G1c;
-    delete [] oldSJind;       
-    
+    delete [] oldSJind;
+
 };
diff --git a/source/sjdbInsertJunctions.cpp b/source/sjdbInsertJunctions.cpp
index 8ef7dc8..3f68d14 100644
--- a/source/sjdbInsertJunctions.cpp
+++ b/source/sjdbInsertJunctions.cpp
@@ -8,7 +8,7 @@
 #include "streamFuns.h"
 #include "genomeParametersWrite.h"
 
-void sjdbInsertJunctions(Parameters * P, Parameters * P1, Genome & genome, SjdbClass & sjdbLoci) 
+void sjdbInsertJunctions(Parameters * P, Parameters * P1, Genome & genome, SjdbClass & sjdbLoci)
 {
     time_t rawtime;
 
@@ -19,12 +19,12 @@ void sjdbInsertJunctions(Parameters * P, Parameters * P1, Genome & genome, SjdbC
         sjdbLoci.priority.resize(sjdbLoci.chr.size(),30);
         time ( &rawtime );
         P->inOut->logMain << timeMonthDayTime(rawtime) << "   Loaded database junctions from the generated genome " << P->genomeDir+"/sjdbList.out.tab" <<": "<<sjdbLoci.chr.size()<<" total junctions\n\n";
-    };    
-    
+    };
+
     if (P->twoPass.pass2)
     {//load 1st pass new junctions
      //sjdbLoci already contains the junctions from before 1st pass
-        ifstream sjdbStreamIn ( P->twoPass.pass1sjFile.c_str() );   
+        ifstream sjdbStreamIn ( P->twoPass.pass1sjFile.c_str() );
         if (sjdbStreamIn.fail()) {
             ostringstream errOut;
             errOut << "FATAL INPUT error, could not open input file with junctions from the 1st pass=" << P->twoPass.pass1sjFile <<"\n";
@@ -34,16 +34,16 @@ void sjdbInsertJunctions(Parameters * P, Parameters * P1, Genome & genome, SjdbC
         sjdbLoci.priority.resize(sjdbLoci.chr.size(),0);
         time ( &rawtime );
         P->inOut->logMain << timeMonthDayTime(rawtime) << "   Loaded database junctions from the 1st pass file: " << P->twoPass.pass1sjFile <<": "<<sjdbLoci.chr.size()<<" total junctions\n\n";
-    } else 
+    } else
     {//loading junctions from GTF or tab or from the saved genome is only allowed at the 1st pass
      //at the 2nd pass these are already in the sjdbLoci
-        
+
         if (P->sjdbFileChrStartEnd.at(0)!="-")
         {//load from junction files
             sjdbLoadFromFiles(P,sjdbLoci);
             sjdbLoci.priority.resize(sjdbLoci.chr.size(),10);
-            time ( &rawtime );        
-            P->inOut->logMain << timeMonthDayTime(rawtime) << "   Loaded database junctions from the sjdbFileChrStartEnd file(s), " << sjdbLoci.chr.size()<<" total junctions\n\n";        
+            time ( &rawtime );
+            P->inOut->logMain << timeMonthDayTime(rawtime) << "   Loaded database junctions from the sjdbFileChrStartEnd file(s), " << sjdbLoci.chr.size()<<" total junctions\n\n";
         };
 
         if (P->sjdbGTFfile!="-")
@@ -54,7 +54,7 @@ void sjdbInsertJunctions(Parameters * P, Parameters * P1, Genome & genome, SjdbC
             P->inOut->logMain << timeMonthDayTime(rawtime) << "   Loaded database junctions from the GTF file: " << P->sjdbGTFfile<<": "<<sjdbLoci.chr.size()<<" total junctions\n\n";
         };
     };
-    
+
     char *Gsj=new char [2*P->sjdbLength*sjdbLoci.chr.size()+1];//array to store junction sequences, will be filled in sjdbPrepare
     sjdbPrepare (sjdbLoci, P, P->chrStart[P->nChrReal], P->sjdbInsert.outDir, genome.G, Gsj);//P->nGenome - change when replacing junctions
     time ( &rawtime );
@@ -70,8 +70,8 @@ void sjdbInsertJunctions(Parameters * P, Parameters * P1, Genome & genome, SjdbC
     //insert junctions into the genome and SA and SAi
     sjdbBuildIndex (P, P1, Gsj, genome.G, genome.SA, (P->twoPass.pass2 ? genome.SApass2 : genome.SApass1), genome.SAi);
     delete [] Gsj; //junction sequences have been added to G
-    time ( &rawtime ); 
-    P->inOut->logMain     << timeMonthDayTime(rawtime) << " ..... Finished inserting junctions into genome" <<endl;    
+    time ( &rawtime );
+    P->inOut->logMain     << timeMonthDayTime(rawtime) << " ..... finished inserting junctions into genome" <<endl;
 
     if (P->sjdbInsert.save=="All")
     {//save and copy all genome files into sjdbInsert.outDir, except those created above
@@ -82,9 +82,9 @@ void sjdbInsertJunctions(Parameters * P, Parameters * P1, Genome & genome, SjdbC
             copyFile(P->genomeDir+"/chrNameLength.txt", P->sjdbInsert.outDir+"/chrNameLength.txt");
             copyFile(P->genomeDir+"/chrLength.txt", P->sjdbInsert.outDir+"/chrLength.txt");
         };
-        
+
         genomeParametersWrite(P->sjdbInsert.outDir+("/genomeParameters.txt"), P, ERROR_OUT);
-        
+
         ofstream & genomeOut = ofstrOpen(P->sjdbInsert.outDir+"/Genome",ERROR_OUT, P);
         fstreamWriteBig(genomeOut,genome.G,P->nGenome,P->sjdbInsert.outDir+"/Genome",ERROR_OUT,P);
         genomeOut.close();
diff --git a/source/sjdbLoadFromFiles.cpp b/source/sjdbLoadFromFiles.cpp
index f588262..271d75a 100644
--- a/source/sjdbLoadFromFiles.cpp
+++ b/source/sjdbLoadFromFiles.cpp
@@ -3,10 +3,10 @@
 #include "ErrorWarning.h"
 
 void sjdbLoadFromFiles(Parameters *P, SjdbClass &sjdbLoci) {
-   
-    if (P->sjdbFileChrStartEnd.at(0)!="-") {       
+
+    if (P->sjdbFileChrStartEnd.at(0)!="-") {
         for (uint ifile=0;ifile<P->sjdbFileChrStartEnd.size(); ifile++) {
-            ifstream sjdbStreamIn ( P->sjdbFileChrStartEnd.at(ifile).c_str() );   
+            ifstream sjdbStreamIn ( P->sjdbFileChrStartEnd.at(ifile).c_str() );
             if (sjdbStreamIn.fail()) {
                 ostringstream errOut;
                 errOut << "FATAL INPUT error, could not open input file sjdbFileChrStartEnd=" << P->sjdbFileChrStartEnd.at(ifile) <<"\n";
diff --git a/source/sjdbLoadFromStream.cpp b/source/sjdbLoadFromStream.cpp
index 2290600..2421631 100644
--- a/source/sjdbLoadFromStream.cpp
+++ b/source/sjdbLoadFromStream.cpp
@@ -25,5 +25,5 @@ void sjdbLoadFromStream(ifstream &sjdbStreamIn, SjdbClass &sjdbLoci) {
             };
             sjdbLoci.str.push_back(str1);
         };
-    }; 
+    };
 };
\ No newline at end of file
diff --git a/source/sjdbPrepare.cpp b/source/sjdbPrepare.cpp
index 1661398..f0f75e4 100644
--- a/source/sjdbPrepare.cpp
+++ b/source/sjdbPrepare.cpp
@@ -8,7 +8,7 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
 
     uint8 *sjdbMotif=new uint8 [sjdbLoci.chr.size()];
     uint8 *sjdbShiftLeft=new uint8 [sjdbLoci.chr.size()];
-    uint8 *sjdbShiftRight=new uint8 [sjdbLoci.chr.size()];        
+    uint8 *sjdbShiftRight=new uint8 [sjdbLoci.chr.size()];
 
 
     string chrOld="";
@@ -19,7 +19,7 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
                 if (sjdbLoci.chr.at(ii)==P->chrName[iChr]) break;
             };
             if (iChr>=P->nChrReal) {
-                ostringstream errOut;                    
+                ostringstream errOut;
                 errOut << "EXITING because of FATAL error, the sjdb chromosome " << sjdbLoci.chr.at(ii) << " is not found among the genomic chromosomes\n";
                 errOut << "SOLUTION: fix your file(s) --sjdbFileChrStartEnd, offending junciton:" <<sjdbLoci.chr.at(ii)<<"\t"<<sjdbLoci.start.at(ii)<<"\t"<<sjdbLoci.end.at(ii)<<"\n";
                 exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
@@ -42,7 +42,7 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
         } else if ( G[sjdbS[ii]]==0 && G[sjdbS[ii]+1]==3 && G[sjdbE[ii]-1]==0 && G[sjdbE[ii]]==1 ) {//ATAC
             sjdbMotif[ii]=5;
         } else if ( G[sjdbS[ii]]==2 && G[sjdbS[ii]+1]==3 && G[sjdbE[ii]-1]==0 && G[sjdbE[ii]]==3 ) {//GTAT
-            sjdbMotif[ii]=6;             
+            sjdbMotif[ii]=6;
         } else {
             sjdbMotif[ii]=0;
         };
@@ -63,7 +63,7 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
             P->inOut->logMain << "WARNING: long repeat for junction # " << ii+1 <<" : " \
                     << sjdbLoci.chr.at(ii) <<" "<<sjdbS[ii] - P->chrStart[iChr] + 1 <<" "<< sjdbE[ii] - P->chrStart[iChr] + 1 \
                     << "; left shift = "<< (int) sjdbShiftLeft[ii] <<"; right shift = "<< (int) sjdbShiftRight[ii] <<"\n";
-        };            
+        };
 
         sjdbS[ii]-=sjdbShiftLeft[ii];
         sjdbE[ii]-=sjdbShiftLeft[ii];
@@ -93,15 +93,15 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
     uint *I=new uint [sjdbLoci.chr.size()];
     uint nsj=0;
     for (uint ii=0;ii<sjdbLoci.chr.size();ii++) {
-        uint isj=sjdbSort[ii*3+2];//index of the next sorted junction    
-        
+        uint isj=sjdbSort[ii*3+2];//index of the next sorted junction
+
         uint isj0;
         if (nsj>0)
         {
             isj0=I[nsj-1]; //index of the last recorded junctions
         };
 
-        if (nsj==0 || sjdbS[isj]!=sjdbS[isj0] || sjdbE[isj]!=sjdbE[isj0]) 
+        if (nsj==0 || sjdbS[isj]!=sjdbS[isj0] || sjdbE[isj]!=sjdbE[isj0])
         {//different intron coordinates
             I[nsj++]=isj;// add new junction
         } else if (sjdbLoci.priority.at(isj)<sjdbLoci.priority.at(isj0))
@@ -109,7 +109,7 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
             //do nothing, i.e. keep the old junction
         } else if (sjdbLoci.priority.at(isj)>sjdbLoci.priority.at(isj0))
         {//new junction has higher priority
-            I[nsj-1]=isj;//replace the old junction           
+            I[nsj-1]=isj;//replace the old junction
         } else if ( (sjdbMotif[isj]>0 && sjdbMotif[isj0]==0) \
               || ( ((sjdbMotif[isj]>0) == (sjdbMotif[isj0]>0)) && sjdbShiftLeft[isj]<sjdbShiftLeft[isj0]) ) {
             //new and old junctions have the same priority
@@ -120,7 +120,7 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
     };
 
     //sort again, after returning canonical junctions back to original loci:
-    for (uint ii=0;ii<nsj;ii++) {   
+    for (uint ii=0;ii<nsj;ii++) {
         sjdbSort[ii*3]  =sjdbS[I[ii]] + (sjdbMotif[I[ii]]==0 ? 0 : sjdbShiftLeft[I[ii]]);
         sjdbSort[ii*3+1]=sjdbE[I[ii]] + (sjdbMotif[I[ii]]==0 ? 0 : sjdbShiftLeft[I[ii]]);
         sjdbSort[ii*3+2]=I[ii];
@@ -132,9 +132,9 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
     P->sjdbEnd=new uint [nsj];
     P->sjdbMotif=new uint8 [nsj];
     P->sjdbShiftLeft=new uint8 [nsj];
-    P->sjdbShiftRight=new uint8 [nsj];    
-    P->sjdbStrand=new uint8 [nsj];  
-    
+    P->sjdbShiftRight=new uint8 [nsj];
+    P->sjdbStrand=new uint8 [nsj];
+
     uint nsj1=0;
     for (uint ii=0;ii<nsj;ii++) {
         uint isj=sjdbSort[ii*3+2];
@@ -144,17 +144,17 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
 
             if (sjdbLoci.priority.at(isj)<sjdbLoci.priority.at(isj0))
             {//new junction has lower priority
-                continue;//keep old junction, do not add new   
+                continue;//keep old junction, do not add new
             } else if (sjdbLoci.priority.at(isj)>sjdbLoci.priority.at(isj0))
             {//new junction has higher priority
                 nsj1--;//replace the old junction with the new one
-            } else if (P->sjdbStrand[nsj1-1]>0 && sjdbLoci.str.at(isj)=='.') 
+            } else if (P->sjdbStrand[nsj1-1]>0 && sjdbLoci.str.at(isj)=='.')
             {//new junction strand is not defined
                 continue;
-            } else if (P->sjdbStrand[nsj1-1]==0 && sjdbLoci.str.at(isj)!='.') 
+            } else if (P->sjdbStrand[nsj1-1]==0 && sjdbLoci.str.at(isj)!='.')
             {//old junction strand is not defined
                 nsj1--; //replace old with new
-            } else if (P->sjdbMotif[nsj1-1]==0 && sjdbMotif[isj]==0) 
+            } else if (P->sjdbMotif[nsj1-1]==0 && sjdbMotif[isj]==0)
             {//both are non-canonical (on opposite strand)
                 P->sjdbStrand[nsj1-1]=0;//do not record new junction, keep old with undefined strand
                 continue;
@@ -171,7 +171,7 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
         P->sjdbStart[nsj1]=sjdbSort[ii*3];
         P->sjdbEnd[nsj1]=sjdbSort[ii*3+1];
         P->sjdbMotif[nsj1]=sjdbMotif[isj];
-        P->sjdbShiftLeft[nsj1]=sjdbShiftLeft[isj];                    
+        P->sjdbShiftLeft[nsj1]=sjdbShiftLeft[isj];
         P->sjdbShiftRight[nsj1]=sjdbShiftRight[isj];
         if (sjdbLoci.str.at(isj)=='+') {
             P->sjdbStrand[nsj1]=1;
@@ -185,29 +185,29 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
             };
         };
         nsj1++;
-    };            
-    P->sjdbN=nsj1;       
+    };
+    P->sjdbN=nsj1;
     P->sjDstart = new uint [P->sjdbN];
     P->sjAstart = new uint [P->sjdbN];
 
     ofstream sjdbInfo((outDir+"/sjdbInfo.txt").c_str());
     ofstream sjdbList ((outDir+"/sjdbList.out.tab").c_str());
-    char strandChar[3]={'.','+','-'}; 
+    char strandChar[3]={'.','+','-'};
     //first line is some general useful information
     sjdbInfo << P->sjdbN <<"\t"<< P->sjdbOverhang <<"\n";
     uint sjGstart=0;
-    
-    for (uint ii=0;ii<P->sjdbN;ii++) 
-    {//add sjdb sequence to genome   
-        P->sjDstart[ii]   = P->sjdbStart[ii]  - P->sjdbOverhang; 
-        P->sjAstart[ii]   = P->sjdbEnd[ii] + 1;     
+
+    for (uint ii=0;ii<P->sjdbN;ii++)
+    {//add sjdb sequence to genome
+        P->sjDstart[ii]   = P->sjdbStart[ii]  - P->sjdbOverhang;
+        P->sjAstart[ii]   = P->sjdbEnd[ii] + 1;
         if (P->sjdbMotif[ii]==0) {//shift non-canonical junctions back to their true coordinates
             P->sjDstart[ii] += P->sjdbShiftLeft[ii];
             P->sjAstart[ii] += P->sjdbShiftLeft[ii];
-        };            
+        };
         memcpy(Gsj+sjGstart,G+P->sjDstart[ii],P->sjdbOverhang);//sjdbStart contains 1-based intron loci
         memcpy(Gsj+sjGstart+P->sjdbOverhang,G+P->sjAstart[ii],P->sjdbOverhang);//sjdbStart contains 1-based intron loci
-        sjGstart += P->sjdbLength;     
+        sjGstart += P->sjdbLength;
         Gsj[sjGstart-1]=GENOME_spacingChar;//spacing char between the sjdb seqs
         sjdbInfo << P->sjdbStart[ii] <<"\t"<< P->sjdbEnd[ii] <<"\t"<<(int) P->sjdbMotif[ii] <<"\t"<<(int) P->sjdbShiftLeft[ii] <<"\t"<<(int) P->sjdbShiftRight[ii]<<"\t"<<(int) P->sjdbStrand[ii] <<"\n";
         uint chr1=P->chrBin[ P->sjdbStart[ii] >> P->genomeChrBinNbits];
@@ -217,6 +217,6 @@ void sjdbPrepare (SjdbClass &sjdbLoci, Parameters *P, uint nGenomeReal, string o
     };
     sjdbInfo.close();
     sjdbList.close();
- 
+
 };
-    
+
diff --git a/source/sortSuffixesBucket.cpp b/source/sortSuffixesBucket.cpp
new file mode 100644
index 0000000..5136f1f
--- /dev/null
+++ b/source/sortSuffixesBucket.cpp
@@ -0,0 +1,100 @@
+#include "sortSuffixesBucket.h"
+#include <string.h> //for memset
+#include <iostream> //fro cout - debug
+
+#define GENOME_charN 6
+//max number of characters in the text (genome), presently 0-5
+
+void sortSuffixesBucket(char *G, void *ind, int indN, int indSkip)
+{
+    
+    //boundaries of unsorted intervals
+    int *uB1=new int[indN/2];
+    int *uB2=new int[indN/2];
+    int *uuB1=new int[indN/2];
+    int *uuB2=new int[indN/2];
+    
+    int uN;
+    
+    if (false) //TODO implement flag to switch this option
+    {//no initial bucketing
+        uB1[0]=0;
+        uB2[0]=indN;
+        uN=1;//number of unsorted intervals
+    } else
+    {//initial bucketing according to the ind
+        uN=0;
+        uint64_t iprev=*(uint64_t*)(ind+0*indSkip);
+        int un=1;
+        for (int id=1; id<indN; id++)
+        {
+            if (*(uint64_t*)(ind+id*indSkip)==iprev)
+            {
+                un++;
+            } else
+            {
+                if (un>1)
+                {
+                    uB1[uN]=id-un;
+                    uB2[uN]=id;
+                    uN++;
+                    un=1;
+                };
+                iprev=*(uint64_t*)(ind+id*indSkip);
+            };
+        };
+    };
+    
+    char *ind1=new char[indN*indSkip];//array to store sorted indices    
+    int charShift=0;//character position to be sorted
+    int charStart[GENOME_charN];
+    int charCount[GENOME_charN];
+    
+    while (uN>0)
+    {
+        int uuN=0;
+        for (int iu=0; iu<uN; iu++)
+        {//sort iu-th interval
+            memset( (void*) charCount, 0, sizeof(charCount));
+
+            for (int id=uB1[iu]; id<uB2[iu]; id++)
+            {//count the number of chars in each bucket
+                charCount[G[*(uint64_t*)(ind+id*indSkip+8) + charShift]]++;//TODO can template uint64_t
+            };
+
+            charStart[0]=uB1[iu];
+
+            bool needToSort=false;
+            
+            for (int ic=0;ic<GENOME_charN-1;ic++) //last char is the chromosome separator: 5=end of chromosome, if all chars are 5, no sorting required, since the indexes are presumed pre-sorted
+            {//set new unsort bounds and charStart
+                charStart[ic+1]=charStart[ic]+charCount[ic];
+                if (charCount[ic]>0 && charCount[ic]<(uB2[iu]-uB1[iu]) ) needToSort=true; //need to sort only if at least one char > 0 and more than one chars in this bucket
+                if (charCount[ic]>1)
+                {
+                    uuB1[uuN]=charStart[ic];
+                    uuB2[uuN]=charStart[ic+1];                  
+                    uuN++;
+                };
+            };
+
+            if (needToSort)
+            {//otherwise it's either all sorted or all unsorted, no need to move indexes in either case
+                for (int id=uB1[iu]; id<uB2[iu]; id++)
+                {//bucket-sort all indexes 
+                    char c=G[*(uint64_t*)(ind+id*indSkip+8) + charShift];
+                    memcpy(ind1+charStart[c]*indSkip, ind+id*indSkip, indSkip);
+                    charStart[c]++;
+                };
+                memcpy(ind+uB1[iu]*indSkip, ind1+uB1[iu]*indSkip, (uB2[iu]-uB1[iu])*indSkip);
+            };
+        };
+        //going to the next cycle
+        charShift++;
+        uN=uuN;
+        int *p;
+        p=uB1; uB1=uuB1; uuB1=p;
+        p=uB2; uB2=uuB2; uuB2=p;
+        std::cout << charShift <<"   " << uN <<"\n";
+    };
+};
\ No newline at end of file
diff --git a/source/sortSuffixesBucket.h b/source/sortSuffixesBucket.h
new file mode 100644
index 0000000..bfbc326
--- /dev/null
+++ b/source/sortSuffixesBucket.h
@@ -0,0 +1,3 @@
+#include <stdint.h>
+
+void sortSuffixesBucket(char *G, void *ind, int indN, int indSkip);
\ No newline at end of file
diff --git a/source/stitchAlignToTranscript.cpp b/source/stitchAlignToTranscript.cpp
index 05c7c1a..c54c9bf 100644
--- a/source/stitchAlignToTranscript.cpp
+++ b/source/stitchAlignToTranscript.cpp
@@ -11,9 +11,9 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
 
     int Score=0;
 //     int score2;
-            
+
     if (sjAB!=((uint) -1) && trA->exons[trA->nExons-1][EX_sjA]==sjAB \
-            && trA->exons[trA->nExons-1][EX_iFrag]==iFragB && rBstart==rAend+1 && gAend+1<gBstart ) {//simple stitching if junction belongs to a database 
+            && trA->exons[trA->nExons-1][EX_iFrag]==iFragB && rBstart==rAend+1 && gAend+1<gBstart ) {//simple stitching if junction belongs to a database
         if (P->sjdbMotif[sjAB]==0 && (L<=P->sjdbShiftRight[sjAB] || trA->exons[trA->nExons-1][EX_L]<=P->sjdbShiftLeft[sjAB]) ) {
             return -1000006; //too large repeats around non-canonical junction
         };
@@ -25,19 +25,19 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
         trA->shiftSJ[trA->nExons-1][1]=P->sjdbShiftRight[sjAB];
         trA->sjAnnot[trA->nExons-1]=1;
         trA->sjStr[trA->nExons-1]=P->sjdbStrand[sjAB];;
-        trA->nExons++;            
+        trA->nExons++;
         trA->nMatch+=L;
-        for (uint ii=rBstart;ii<rBstart+L;ii++) Score+=int(Q[ii]); //add QS for mapped portions    
+        for (uint ii=rBstart;ii<rBstart+L;ii++) Score+=int(Q[ii]); //add QS for mapped portions
         Score+=P->sjdbScore;
-    } else {//general stitching       
+    } else {//general stitching
         trA->sjAnnot[trA->nExons-1]=0;
         trA->sjStr[trA->nExons-1]=0;
-        
+
         if (trA->exons[trA->nExons-1][EX_iFrag]==iFragB) {//stitch aligns on the same fragment
             uint gBend=gBstart+L-1;
-            uint rBend=rBstart+L-1;    
+            uint rBend=rBstart+L-1;
 
-//             {//debug 
+//             {//debug
 //                 if (sjAB!=((uint) -1) && trA->exons[trA->nExons-1][EX_sjA]!=((uint) -1) && rBend<=rAend) {//
 //                     Score -= rAend-rBstart+1;
 //                     gAend -= rAend-rBstart+1;
@@ -45,21 +45,21 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
 //                     trA->exons[trA->nExons-1][EX_L] =rAend-trA->exons[trA->nExons-1][EX_R]+1;
 //                 };
 //             };
-            
+
             //check if r-overlapping fully and exit
-            if (rBend<=rAend) return -1000001; 
-            if (gBend<=gAend && trA->exons[trA->nExons-1][EX_iFrag]==iFragB) return -1000002; 
+            if (rBend<=rAend) return -1000001;
+            if (gBend<=gAend && trA->exons[trA->nExons-1][EX_iFrag]==iFragB) return -1000002;
 
             //shift the B 5' if overlaps A 3'
             if (rBstart<=rAend) {
-                gBstart+=rAend-rBstart+1;        
+                gBstart+=rAend-rBstart+1;
                 rBstart=rAend+1;
                 L=rBend-rBstart+1;
-            };  
+            };
 
-            for (uint ii=rBstart;ii<=rBend;ii++) Score+=int(Q[ii]); //add QS for mapped portions               
+            for (uint ii=rBstart;ii<=rBend;ii++) Score+=int(Q[ii]); //add QS for mapped portions
 
-            int gGap=gBstart-gAend-1; //could be < 0 for insertions      
+            int gGap=gBstart-gAend-1; //could be < 0 for insertions
             int rGap=rBstart-rAend-1;//>0 always since we removed overlap
 
             uint nMatch=L;
@@ -69,7 +69,7 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
             int jR=0; //junction location in R-space
             int jCan=999; //canonical junction type
             uint gBstart1=gBstart-rGap-1;//the last base of the intron if all read gap belongs to acceptor, i.e. jR=0
-            
+
 
             // check all the different combinations of gGap and rGap
             if ( gGap==0 && rGap==0 ) {//just joined the pieces, w/o stiching or gaps
@@ -79,30 +79,30 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
 
                 for (int ii=1;ii<=rGap;ii++) {
                     if (G[gAend+ii]<4 && R[rAend+ii]<4) {//only score genome bases that are not Ns
-                        if ( R[rAend+ii]==G[gAend+ii] ) {                    
+                        if ( R[rAend+ii]==G[gAend+ii] ) {
                             Score+=int(Q[rAend+ii]);
                             nMatch++;
     //                         if (Q[rAend+ii]>=P->Qgood) nMatchGood++;
                         } else {
                             Score-=int(Q[rAend+ii]);
-//                             trA->rMM[trA->nMM + nMM] = rAend+ii;                
+//                             trA->rMM[trA->nMM + nMM] = rAend+ii;
                             nMM++;
-    //                         if (Q[rAend+ii]>=P->Qgood) nMMgood++;                        
+    //                         if (Q[rAend+ii]>=P->Qgood) nMMgood++;
                         };
                     };
-                }; 
+                };
 
             } else if ( gGap>rGap ) {//genomic gap (Deletion)
 
                 nDel=1;
                 Del=gGap-rGap; //gGap>0 here
-                
+
                 if (Del>P->alignIntronMax && P->alignIntronMax>0) {
                     return -1000003; //large gaps not allowed
                 };
 
                 int Score1=0;
-                int jR1=1; //junction location in R-space        
+                int jR1=1; //junction location in R-space
                 do { // 1. move left, until the score for MM is less than canonical advantage
                     jR1--;
                     if ( R[rAend+jR1]!=G[gBstart1+jR1] && G[gBstart1+jR1]<4 && R[rAend+jR1]==G[gAend+jR1]) Score1 -= int(Q[rAend+jR1]);
@@ -113,7 +113,7 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                 int jPen=0;
                 do { // 2. scan to the right to find the best junction locus
                     // ?TODO? if genome base is N, how to score?
-                    if  ( R[rAend+jR1]==G[gAend+jR1] && R[rAend+jR1]!=G[gBstart1+jR1] )  Score1+=int(Q[rAend+jR1]);          
+                    if  ( R[rAend+jR1]==G[gAend+jR1] && R[rAend+jR1]!=G[gBstart1+jR1] )  Score1+=int(Q[rAend+jR1]);
                     if  ( R[rAend+jR1]!=G[gAend+jR1] && R[rAend+jR1]==G[gBstart1+jR1] )  Score1-=int(Q[rAend+jR1]);
 
                     int jCan1=-1; //this marks Deletion
@@ -134,9 +134,9 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                             jPen1=P->scoreGapGCAG;
                         } else if ( G[gAend+jR1+1]==0 && G[gAend+jR1+2]==3 && G[gBstart1+jR1-1]==0 && G[gBstart1+jR1]==1 ) {//ATAC
                             jCan1=5;
-                            jPen1=P->scoreGapATAC;                        
+                            jPen1=P->scoreGapATAC;
                         } else if ( G[gAend+jR1+1]==2 && G[gAend+jR1+2]==3 && G[gBstart1+jR1-1]==0 && G[gBstart1+jR1]==3 ) {//GTAT
-                            jCan1=6;             
+                            jCan1=6;
                             jPen1=P->scoreGapATAC;
                         } else {
                             jCan1=0;
@@ -151,7 +151,7 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                         jR=jR1; //this is the last base of donor
                         jCan=jCan1;
                         jPen=jPen1;
-                    };            
+                    };
                         jR1++;
                 } while ( jR1 < int(rBend) - int(rAend) );// - int(P->alignSJoverhangMin) );//TODO: do not need to search the full B-transcript, can stop as soon as Score goes down by more than
 
@@ -172,7 +172,7 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                     jjL=0;
                 };
 
-                //TODO check here if the internal exon length < minDa, if so exit w/o stitiching            
+                //TODO check here if the internal exon length < minDa, if so exit w/o stitiching
 
                 for (int ii=min(1,jR+1);ii<=max(rGap,jR);ii++) {//score donor and acceptor
                     uint g1=(ii<=jR) ? (gAend+ii):(gBstart1+ii);
@@ -183,16 +183,16 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                                 nMatch++;
                             };
                         } else {//add -score and MM for all bases
-                            Score-=int(Q[rAend+ii]); 
+                            Score-=int(Q[rAend+ii]);
                             nMM++;
                             if (ii<1 || ii>rGap) {//subtract previuosly presumed matches
-                                Score-=int(Q[rAend+ii]);                         
+                                Score-=int(Q[rAend+ii]);
                                 nMatch--;
 //                                 if (ii<=jR) nMM--;
                             };
                         };
                     };
-                };           
+                };
 
                 //score the gap
                 if (P->sjdbN>0) {//check if the junction is annotated
@@ -200,7 +200,7 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                         int sjdbInd=binarySearch2(jS,jE,P->sjdbStart,P->sjdbEnd,P->sjdbN);
                         if (sjdbInd<0) {
                             if (Del>=P->alignIntronMin) {
-                                Score += P->scoreGap + jPen; //genome gap penalty + non-canonical penalty  
+                                Score += P->scoreGap + jPen; //genome gap penalty + non-canonical penalty
                             } else {//deletion
                                 Score += Del*P->scoreDelBase + P->scoreDelOpen;
                                 jCan=-1;
@@ -209,7 +209,7 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
 //                                 jR-=jjL;
 //                                 jjL=0;
 //                                 trA->shiftSJ[trA->nExons-1][0]=0;
-//                                 trA->shiftSJ[trA->nExons-1][1]=jjR;                                  
+//                                 trA->shiftSJ[trA->nExons-1][1]=jjR;
                             };
                         } else {//annotated
                             jCan=P->sjdbMotif[sjdbInd];
@@ -223,21 +223,21 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                             };
                             trA->sjAnnot[trA->nExons-1]=1;
                             trA->sjStr[trA->nExons-1]=P->sjdbStrand[sjdbInd];
-                            Score += P->sjdbScore;                           
-                        };                        
+                            Score += P->sjdbScore;
+                        };
                 } else {//no annotation
                     if (Del>=P->alignIntronMin) {//junction, not short deletion
                         Score += P->scoreGap + jPen;
                     } else {
-                        Score += Del*P->scoreDelBase + P->scoreDelOpen;       
+                        Score += Del*P->scoreDelBase + P->scoreDelOpen;
                         jCan=-1;
                         trA->sjAnnot[trA->nExons-1]=0;
                     };
                 };
-                
+
                 trA->shiftSJ[trA->nExons-1][0]=jjL;
-                trA->shiftSJ[trA->nExons-1][1]=jjR;            
-                trA->canonSJ[trA->nExons-1]=jCan;                
+                trA->shiftSJ[trA->nExons-1][1]=jjR;
+                trA->canonSJ[trA->nExons-1]=jCan;
 
                 if (trA->sjAnnot[trA->nExons-1]==0) {//strand for unannotated junctions
                     if (jCan>0) {
@@ -246,19 +246,19 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                          trA->sjStr[trA->nExons-1]=0;
                     };
                 };
-                
-            } else if ( rGap>gGap ) {//insertion: if also gGap>0, need to stitch 
+
+            } else if ( rGap>gGap ) {//insertion: if also gGap>0, need to stitch
                 Ins=rGap-gGap;
                 nIns=1;
                 if (gGap==0) {//simple insertion, no need to stitch
-                    jR=0; 
+                    jR=0;
                 } else if (gGap<0) {//reduce the score
 
                     jR=0;
                     for (int ii=0; ii<-gGap; ii++) Score -= int(Q[rBstart+ii]);
 
-                } else {//stitch: define the exon boundary jR               
-                    int Score1=0; int maxScore1=0;                
+                } else {//stitch: define the exon boundary jR
+                    int Score1=0; int maxScore1=0;
                     for (int jR1=1;jR1<=gGap;jR1++) {//scan to the right to find the best score
 
                         if (G[gAend+jR1]<4) {//only penalize goog genome bases
@@ -269,7 +269,7 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                         if (Score1>maxScore1) {
                             maxScore1=Score1;
                             jR=jR1;
-                        };                 
+                        };
                     };
 
 
@@ -280,10 +280,10 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                                 Score+=int(Q[r1]);
                                 nMatch++;
                             } else {//add -score and MM for all bases
-                                Score-=int(Q[r1]); 
+                                Score-=int(Q[r1]);
                                 nMM++;
                             };
-                        };               
+                        };
                     };
                 };
 
@@ -291,15 +291,15 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                 jCan=-3;
             }; //different types of gaps selection
 
-            
-            
+
+
         #ifdef COMPILE_FOR_LONG_READS
             if ( (trA->nMM + nMM)<=outFilterMismatchNmaxTotal )
 //             if ( Score>0 && nMM<=200 )
-                
+
         #else
             if ( (trA->nMM + nMM)<=outFilterMismatchNmaxTotal  \
-                         && ( jCan<0 || (jCan<7 && nMM<= (uint) P->alignSJstitchMismatchNmax[(jCan+1)/2]) ) ) 
+                         && ( jCan<0 || (jCan<7 && nMM<= (uint) P->alignSJstitchMismatchNmax[(jCan+1)/2]) ) )
         #endif
             {//stitching worked only if there no mis-matches for non-GT/AG junctions
                 trA->nMM += nMM;
@@ -320,10 +320,10 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                     trA->exons[trA->nExons-1][EX_L] += jR; //correct the previous exon boundary
                     trA->exons[trA->nExons][EX_L] = rBend-rAend-jR; //new exon length
                     trA->exons[trA->nExons][EX_R] = rAend+jR+1; //new exon r-start
-                    trA->exons[trA->nExons][EX_G] = gBstart1+jR+1; //new exon g-start            
+                    trA->exons[trA->nExons][EX_G] = gBstart1+jR+1; //new exon g-start
                     trA->nExons++;
                 } else if (Ins>0) { //Ins>0;
-                    trA->nIns += nIns;        
+                    trA->nIns += nIns;
                     trA->lIns += Ins;
                     trA->exons[trA->nExons-1][EX_L] += jR; //correct the previous exon boundary
                     trA->exons[trA->nExons][EX_L] = rBend-rAend-jR-Ins; //new exon length
@@ -331,7 +331,7 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                     trA->exons[trA->nExons][EX_G] = gAend+1+jR; //new exon g-start
                     trA->canonSJ[trA->nExons-1]=-2; //mark insertion
                     trA->sjAnnot[trA->nExons-1]=0;
-                    trA->nExons++;            
+                    trA->nExons++;
                 };
             } else {//stitching was not accepted
                 return -1000007;
@@ -344,8 +344,8 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
             //extend the fragments inside
             //note, that this always works, i.e. Score>0
 
-            for (uint ii=rBstart;ii<rBstart+L;ii++) Score+=int(Q[ii]); //add QS for mapped portions                           
-            
+            for (uint ii=rBstart;ii<rBstart+L;ii++) Score+=int(Q[ii]); //add QS for mapped portions
+
             Transcript trExtend;
 
             //TODO: compare extensions to the left and right, pick the best one to be performed first
@@ -356,7 +356,7 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
             //>1
             //AATATTTGGAACACTTATGTGAAAAATGATTTGTTTTTCTGAAATTTACGTTTCTCTCTGAGTCCTGTAACTGTCC
 
-            
+
             trExtend.reset();
             if ( extendAlign(R, Q, G, rAend+1, gAend+1, 1, 1, DEF_readSeqLengthMax, trA->nMatch, trA->nMM, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
                              P->alignEndsType.ext[trA->exons[trA->nExons-1][EX_iFrag]][1], &trExtend) ) {
@@ -373,14 +373,14 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
             trA->nMatch += L;
 
             trExtend.reset();
-            //if ( extendAlign(R, Q, G, rBstart-1, gBstart-1, -1, -1, gBstart-trA->exons[0][EX_G]+trA->exons[0][EX_R], trA->nMatch, trA->nMM, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, 
+            //if ( extendAlign(R, Q, G, rBstart-1, gBstart-1, -1, -1, gBstart-trA->exons[0][EX_G]+trA->exons[0][EX_R], trA->nMatch, trA->nMM, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax,
             //if end extension needs to be forced, use large length. Otherwise, only extend until the beginning of the transcript
             uint extlen=P->alignEndsType.ext[iFragB][1] ? DEF_readSeqLengthMax : gBstart-trA->exons[0][EX_G]+trA->exons[0][EX_R];
             if ( extendAlign(R, Q, G, rBstart-1, gBstart-1, -1, -1, extlen, trA->nMatch, trA->nMM, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
                              P->alignEndsType.ext[iFragB][1], &trExtend) ) {
 
                 trA->add(&trExtend);
-                Score += trExtend.maxScore;               
+                Score += trExtend.maxScore;
 
                 trA->exons[trA->nExons][EX_R] -= trExtend.extendL;
                 trA->exons[trA->nExons][EX_G] -= trExtend.extendL;
@@ -390,14 +390,14 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
             trA->canonSJ[trA->nExons-1]=-3; //mark different fragments junction
             trA->sjAnnot[trA->nExons-1]=0;
 
-            trA->nExons++;        
+            trA->nExons++;
         } else {//no stitching possible
             return -1000008;
         };
     };
-    
+
     trA->exons[trA->nExons-1][EX_iFrag]=iFragB; //the new exon belongs to fragment iFragB
-    trA->exons[trA->nExons-1][EX_sjA]=sjAB;     
+    trA->exons[trA->nExons-1][EX_sjA]=sjAB;
 
-    return Score;         
+    return Score;
 };
diff --git a/source/stitchGapIndel.cpp b/source/stitchGapIndel.cpp
index 55aab06..ecfdf7e 100644
--- a/source/stitchGapIndel.cpp
+++ b/source/stitchGapIndel.cpp
@@ -1,48 +1,48 @@
-#include "IncludeDefine.h"                                                                                                                                                     
+#include "IncludeDefine.h"
 #include "Parameters.h"
 
 int stitchGapIndel (uint rAend, uint gAend, uint rBstart, uint gBstart, uint L, uint gapStart, uint gapEnd, char* R, char* G, Parameters* P,\
                     uint &iRbest, uint &nMM){//returns stitch score
-    
+
     uint gapLength = gapEnd-gapStart+1;
     sint inDel= (sint) (gBstart-gAend-1) - (sint) gapLength - (sint) (rBstart-rAend-1); //>0: deletion; <0: insertion
-  
+
     if (inDel==0) {//this should not happen, it should have been caught in the first stitching
         return -1;
     };
     int score2best;
     int score2;
-    
+
     if (inDel>0) {//
-        score2=0;     
-        score2best=-1;     
+        score2=0;
+        score2best=-1;
         iRbest=0;
         for (uint iR=1; iR<rBstart-rAend; iR++) {//scan to find the best position iR of the indel
             uint iG1=gAend+iR;
-            uint iG2=iG1+(uint) inDel;            
+            uint iG2=iG1+(uint) inDel;
             if (iG1>=gapStart) iG1 += gapLength;//exclude gap
             if (iG2>=gapStart) iG2 += gapLength;
-            
+
             if  ( R[rAend+iR]==G[iG1] && R[rAend+iR]!=G[iG2] ) {
                 score2++;
             } else if  ( R[rAend+iR]!=G[iG1] && R[rAend+iR]==G[iG2] ) {
                 score2--;
             };
-            
+
             if (score2>score2best) {
                 score2best=score2;
                 iRbest=iR;
             };
         };
-        
+
         //score the alignment with inDel at iRbest
         nMM=0;
         score2= L - inDel*P->scoreDelBase - P->scoreDelOpen; //score B and deletion
         for (uint iR=1; iR<rBstart-rAend; iR++) {//scan to find the best position iR of the indel
             uint iG=gAend+iR;
-            if (iR>iRbest) iG += (uint) inDel;            
+            if (iR>iRbest) iG += (uint) inDel;
             if (iG>=gapStart) iG += gapLength;//exclude gap
-            
+
             if  ( R[rAend+iR]==G[iG] ) {
                 score2++;
             } else if (R[rAend+iR]!=G[iG] && R[rAend+iR]<4 && G[iG]<4) {//only penalize mismatches for non-N bases
@@ -50,10 +50,10 @@ int stitchGapIndel (uint rAend, uint gAend, uint rBstart, uint gBstart, uint L,
                 nMM++;
             };
         };
-        
+
     } else {
         return -1;
     };
-    
+
     return score2;
 };
diff --git a/source/stitchWindowAligns.cpp b/source/stitchWindowAligns.cpp
index 8aa282e..f6768bd 100644
--- a/source/stitchWindowAligns.cpp
+++ b/source/stitchWindowAligns.cpp
@@ -9,12 +9,12 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
                         uint Lread, uiWA* WA, char* R, char* Q, char* G, char* sigG,\
                         Parameters* P, Transcript** wTr, uint* nWinTr, ReadAlign *RA) {
     //recursively stitch aligns for one gene
-    //*nWinTr - number of transcripts for the current window   
-    
+    //*nWinTr - number of transcripts for the current window
+
     if (iA>=nA && tR2==0) return; //no aligns in the transcript
 
     if (iA>=nA) {//no more aligns to add, finalize the transcript
-        
+
         //extend first
         Transcript trAstep1;
 
@@ -31,66 +31,68 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
         #else
             #error "EXTEND_ORDER value unrecognized"
         #endif
-        
+
         for (int iOrd=0;iOrd<2;iOrd++) {
-            
+
             switch (vOrder[iOrd]) {
-            
+
             case 0: //extend at start
 
-            if (trA.rStart>0) {// if transcript does not start at base, extend to the read start                
+            if (trA.rStart>0) {// if transcript does not start at base, extend to the read start
                 trAstep1.reset();
+                uint imate=trA.exons[0][EX_iFrag];
                 if ( extendAlign(R, Q, G, trA.rStart-1, trA.gStart-1, -1, -1, trA.rStart, tR2-trA.rStart+1, \
                                  trA.nMM, RA->outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
-                                 P->alignEndsType.ext[trA.exons[0][EX_iFrag]][trA.Str], &trAstep1) ) {//if could extend
-        
+                                 P->alignEndsType.ext[imate][(int)(trA.Str!=imate)], &trAstep1) ) {//if could extend
+
                     trA.add(&trAstep1);
                     Score += trAstep1.maxScore;
 
                     trA.exons[0][EX_R] = trA.rStart = trA.rStart - trAstep1.extendL;
                     trA.exons[0][EX_G] = trA.gStart = trA.gStart - trAstep1.extendL;
-                    trA.exons[0][EX_L] += trAstep1.extendL;                   
-                    
-                };                   
-            //TODO penalize the unmapped bases at the start 
-            };        
+                    trA.exons[0][EX_L] += trAstep1.extendL;
+
+                };
+            //TODO penalize the unmapped bases at the start
+            };
             break;
-            
+
             case 1: //extend at end
 
             if ( tR2<Lread ) {//extend alignment to the read end
-                trAstep1.reset();            
+                trAstep1.reset();
+                uint imate=trA.exons[trA.nExons-1][EX_iFrag];
                 if ( extendAlign(R, Q, G, tR2+1, tG2+1, +1, +1, Lread-tR2-1, tR2-trA.rStart+1, \
                                  trA.nMM, RA->outFilterMismatchNmaxTotal,  P->outFilterMismatchNoverLmax, \
-                                 P->alignEndsType.ext[trA.exons[trA.nExons-1][EX_iFrag]][1-trA.Str], &trAstep1) ) {//if could extend
-                    
+                                 P->alignEndsType.ext[imate][(int)(imate==trA.Str)], &trAstep1) ) {//if could extend
+
                     trA.add(&trAstep1);
                     Score += trAstep1.maxScore;
 
                     tR2 += trAstep1.extendL;
                     tG2 += trAstep1.extendL;
-                    
+
                     trA.exons[trA.nExons-1][EX_L] += trAstep1.extendL;//extend the length of the last exon
 
                 };
-            //TODO penalize unmapped bases at the end            
+            //TODO penalize unmapped bases at the end
             };
         };
         };
-        
+
         if (P->alignSoftClipAtReferenceEnds=="No" &&  \
                 ( (trA.exons[trA.nExons-1][EX_G] + Lread-trA.exons[trA.nExons-1][EX_R]) > (P->chrStart[trA.Chr]+P->chrLength[trA.Chr]) || \
                    trA.exons[0][EX_G]<(P->chrStart[trA.Chr]+trA.exons[0][EX_R]) ) ) {
             return; //no soft clipping past the ends of the chromosome
         };
-        
-        
+
+
         trA.rLength = 0;
         for (uint isj=0;isj<trA.nExons;isj++) {
             trA.rLength += trA.exons[isj][EX_L];
         };
         trA.gLength = tG2+1-trA.gStart;
-        
+
         //check exons lenghts including repeats, do not report a transcript with short exons
         for (uint isj=0;isj<trA.nExons-1;isj++) {//check exons for min length, if they are not annotated and precede a junction
             if ( trA.canonSJ[isj]>=0 ) {//junction
@@ -102,13 +104,13 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
                        || trA.exons[isj+1][EX_L] < P->alignSJoverhangMin + trA.shiftSJ[isj][1]   ) return;
                 };
             };
-        };        
+        };
         if (trA.nExons>1 && trA.sjAnnot[trA.nExons-2]==1 && trA.exons[trA.nExons-1][EX_L] < P->alignSJDBoverhangMin) return; //this exon was not checkedin the cycle above
-        
+
         trA.intronMotifs[0]=0;trA.intronMotifs[1]=0;trA.intronMotifs[2]=0;
         for (uint iex=0;iex<trA.nExons-1;iex++) {
             if (trA.canonSJ[iex]==0) {
-                ++trA.intronMotifs[0]; 
+                ++trA.intronMotifs[0];
             } else if (trA.canonSJ[iex]>0) {
                 ++trA.intronMotifs[2-trA.canonSJ[iex]%2];
             };
@@ -124,7 +126,7 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
                     trA.sjMotifStrand=trA.sjStr[iex];
                 } else if (trA.sjMotifStrand != trA.sjStr[iex]) {//inconsistent strand
                     return; //kill this transcript
-                };  
+                };
             };
         };
 
@@ -146,7 +148,7 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
             ostringstream errOut;
             errOut << "EXITING because of FATAL INPUT error: unrecognized value of --outFilterIntronMotifs=" <<P->outFilterIntronMotifs <<"\n";
             errOut << "SOLUTION: re-run STAR with --outFilterIntronMotifs = None -OR- RemoveNoncanonical -OR- RemoveNoncanonicalUnannotated\n";
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);        
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         };
 
         {//check mapped length for each mate
@@ -163,7 +165,7 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
                 };
             };
         };
-        
+
         if (P->outFilterBySJoutStage==2) {//junctions have to be present in the filtered set P->sjnovel
             for (uint iex=0;iex<trA.nExons-1;iex++) {
                 if (trA.canonSJ[iex]>=0 && trA.sjAnnot[iex]==0) {
@@ -172,22 +174,24 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
                     if ( binarySearch2(jS,jE,P->sjNovelStart,P->sjNovelEnd,P->sjNovelN) < 0 ) return;
                 };
             };
-        };        
-        
+        };
+
         if ( trA.exons[0][EX_iFrag]!=trA.exons[trA.nExons-1][EX_iFrag] ) {//check for correct overlap between mates
             if (trA.exons[trA.nExons-1][EX_G]+trA.exons[trA.nExons-1][EX_L] <= trA.exons[0][EX_G]) return; //to avoid negative insert size
             uint iexM2=trA.nExons;
             for (uint iex=0;iex<trA.nExons-1;iex++) {//find the first exon of the second mate
-                if (trA.canonSJ[iex]==-3) {//        
+                if (trA.canonSJ[iex]==-3) {//
                     iexM2=iex+1;
                     break;
                 };
             };
-            
+
             if ( trA.exons[iexM2-1][EX_G] + trA.exons[iexM2-1][EX_L] > trA.exons[iexM2][EX_G] ) {//mates overlap - check consistency of junctions
-                
-                if (trA.exons[0][EX_G] > trA.exons[iexM2][EX_G]+trA.exons[0][EX_R]) return; //LeftMateStart > RightMateStart
-                if (trA.exons[iexM2-1][EX_G]+trA.exons[iexM2-1][EX_L] > trA.exons[trA.nExons-1][EX_G]+Lread-trA.exons[trA.nExons-1][EX_R]) return; //LeftMateEnd   > RightMateEnd
+
+                if (trA.exons[0][EX_G] > \
+                    trA.exons[iexM2][EX_G]+trA.exons[0][EX_R]+P->alignEndsProtrude.nBasesMax) return; //LeftMateStart > RightMateStart + allowance
+                if (trA.exons[iexM2-1][EX_G]+trA.exons[iexM2-1][EX_L] > \
+                   trA.exons[trA.nExons-1][EX_G]+Lread-trA.exons[trA.nExons-1][EX_R]+P->alignEndsProtrude.nBasesMax) return; //LeftMateEnd   > RightMateEnd +allowance            
                 
                 //check for junctions consistency
                 uint iex1=1, iex2=iexM2+1; //last exons of the junction
@@ -203,27 +207,27 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
                         iex2++;
                         continue;
                     };
-                    
+
                     if ( ( trA.exons[iex1][EX_G]!=trA.exons[iex2][EX_G] ) || ( (trA.exons[iex1-1][EX_G]+trA.exons[iex1-1][EX_L]) != (trA.exons[iex2-1][EX_G]+trA.exons[iex2-1][EX_L]) ) ) {
                         return; //inconsistent junctions on overlapping mates
                     };
                     iex1++;
                     iex2++;
-                    
+
                 };//cycle through all overlapping exons
             };//mates overlap - check consistency of junctions
         };//check for correct overlap between mates
-        
+
         if (P->scoreGenomicLengthLog2scale!=0) {//add gap length score
             Score += int(ceil( log2( (double) ( trA.exons[trA.nExons-1][EX_G]+trA.exons[trA.nExons-1][EX_L] - trA.exons[0][EX_G]) ) \
                      * P->scoreGenomicLengthLog2scale - 0.5));
             Score = max(0,Score);
         };
-        
+
         //calculate some final values for the transcript
-        trA.roStart = (trA.roStr == 0) ? trA.rStart : Lread - trA.rStart - trA.rLength;     
+        trA.roStart = (trA.roStr == 0) ? trA.rStart : Lread - trA.rStart - trA.rLength;
         trA.maxScore=Score;
-        
+
         if (trA.exons[0][EX_iFrag]==trA.exons[trA.nExons-1][EX_iFrag]) {//mark single fragment transcripts
             trA.iFrag=trA.exons[0][EX_iFrag];
             RA->maxScoreMate[trA.iFrag] = max (RA->maxScoreMate[trA.iFrag] , Score);
@@ -237,42 +241,42 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
                 //only record the transcripts within the window that are in the Score range
                 //OR within the score range of each mate
                 //OR all transcript if chimeric detection is activated
-            
+
 //             if (P->alignEndsType.in=="EndToEnd") {//check that the alignment is end-to-end
 //                 uint rTotal=trA.rLength+trA.lIns;
 // //                 for (uint iex=1;iex<trA.nExons;iex++) {//find the inside exons
 // //                     rTotal+=trA.exons[iex][EX_R]-trA.exons[iex-1][EX_R];
-// //                 };                
+// //                 };
 //                 if ( (trA.iFrag<0 && rTotal<(RA->readLength[0]+RA->readLength[1])) || (trA.iFrag>=0 && rTotal<RA->readLength[trA.iFrag])) return;
 //             };
-            
+
             uint iTr=0; //transcript insertion/replacement place
-          
+
             trA.mappedLength=0;
             for (uint iex=0;iex<trA.nExons;iex++) {//caclulate total mapped length
                 trA.mappedLength += trA.exons[iex][EX_L];
             };
-            
+
             while (iTr < *nWinTr) {//scan through all recorded transcripts for this window - check for duplicates
 
                 //another way to calculate uOld, uNew: w/o gMap
                 uint nOverlap=blocksOverlap(trA,*wTr[iTr]);
                 uint uNew=trA.mappedLength-nOverlap;
                 uint uOld=wTr[iTr]->mappedLength-nOverlap;
-                
+
                 if (uNew==0 && Score < wTr[iTr]->maxScore) {//new transript is a subset of the old ones
                     break;
                 } else if (uOld==0) {//old transcript is a subset of the new one, remove old transcript
                     Transcript *pTr=wTr[iTr];
-                    for  (uint ii=iTr+1;ii<*nWinTr;ii++) wTr[ii-1]=wTr[ii]; //shift transcripts                    
+                    for  (uint ii=iTr+1;ii<*nWinTr;ii++) wTr[ii-1]=wTr[ii]; //shift transcripts
                     (*nWinTr)--;
                     wTr[*nWinTr]=pTr;
                 } else if (uOld>0 && (uNew>0 || Score >= wTr[iTr]->maxScore) ) {//check next transcript
                     iTr++;
                 };
-                
+
             };
-            
+
             if (iTr==*nWinTr) {//insert the new transcript
                 for (iTr=0;iTr<*nWinTr;iTr++) {//find inseriton location
                     if (Score>wTr[iTr]->maxScore || (Score==wTr[iTr]->maxScore && trA.gLength<wTr[iTr]->gLength) ) break;
@@ -288,11 +292,11 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
                     (*nWinTr)++; //increment number of transcripts per window;
                 } else {
                         //"WARNING: too many recorded transcripts per window: iRead="<<RA->iRead<< "\n";
-                };                
+                };
             };
         };
 
-                
+
         return;
     };
 
@@ -301,42 +305,42 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
     Transcript trAi=trA; //trA copy with this align included, to be used in the 1st recursive call of StitchAlign
     if (trA.nExons>0) {//stitch, a transcript has already been originated
 
-        dScore=stitchAlignToTranscript(tR2, tG2, WA[iA][WA_rStart], WA[iA][WA_gStart], WA[iA][WA_Length], WA[iA][WA_iFrag],  WA[iA][WA_sjA], P, R, Q, G, &trAi, RA->outFilterMismatchNmaxTotal);        
+        dScore=stitchAlignToTranscript(tR2, tG2, WA[iA][WA_rStart], WA[iA][WA_gStart], WA[iA][WA_Length], WA[iA][WA_iFrag],  WA[iA][WA_sjA], P, R, Q, G, &trAi, RA->outFilterMismatchNmaxTotal);
         //TODO check if the new stitching creates too many MM, quit this transcript if so
-        
+
     } else { //this is the first align in the transcript
             trAi.exons[0][EX_R]=trAi.rStart=WA[iA][WA_rStart]; //transcript start/end
             trAi.exons[0][EX_G]=trAi.gStart=WA[iA][WA_gStart];
             trAi.exons[0][EX_L]=WA[iA][WA_Length];
             trAi.exons[0][EX_iFrag]=WA[iA][WA_iFrag];
             trAi.exons[0][EX_sjA]=WA[iA][WA_sjA];
-            
+
             trAi.nExons=1; //recorded first exon
-            
-            for (uint ii=0;ii<WA[iA][WA_Length];ii++) dScore+=int(Q [ WA[iA][WA_rStart] + ii ]); //sum all the scores           
-       
+
+            for (uint ii=0;ii<WA[iA][WA_Length];ii++) dScore+=int(Q [ WA[iA][WA_rStart] + ii ]); //sum all the scores
+
             trAi.nMatch=WA[iA][WA_Length]; //# of matches
-            
+
             for (uint ii=0; ii<nA; ii++) WAincl[ii]=false;
 
-        
+
     };
-    
+
     if (dScore>-1000000) {//include this align
         WAincl[iA]=true;
 
         if ( WA[iA][WA_Nrep]==1 ) trAi.nUnique++; //unique piece
-        if ( WA[iA][WA_Anchor]>0 ) trAi.nAnchor++; //anchor piece piece     
-       
+        if ( WA[iA][WA_Anchor]>0 ) trAi.nAnchor++; //anchor piece piece
+
         stitchWindowAligns(iA+1, nA, Score+dScore, WAincl, WA[iA][WA_rStart]+WA[iA][WA_Length]-1, WA[iA][WA_gStart]+WA[iA][WA_Length]-1, trAi, Lread, WA, R, Q, G, sigG, P, wTr, nWinTr, RA);
     } else {
 
-    };   
-    
+    };
+
     //also run a transcript w/o including this align
     if (WA[iA][WA_Anchor]!=2 || trA.nAnchor>0) {//only allow exclusion if this is not the last anchor, or other anchors have been used
         WAincl[iA]=false;
-        stitchWindowAligns(iA+1, nA, Score, WAincl, tR2, tG2, trA, Lread, WA, R, Q, G, sigG, P, wTr, nWinTr, RA);       
+        stitchWindowAligns(iA+1, nA, Score, WAincl, tR2, tG2, trA, Lread, WA, R, Q, G, sigG, P, wTr, nWinTr, RA);
     };
     return;
 };
diff --git a/source/streamFuns.cpp b/source/streamFuns.cpp
index 0408971..f638f09 100644
--- a/source/streamFuns.cpp
+++ b/source/streamFuns.cpp
@@ -23,7 +23,7 @@ void fstreamWriteBig(std::ofstream &S, char* A, unsigned long long N, std::strin
     struct statvfs statvfsBuf;
     statvfs(fileName.c_str(), &statvfsBuf);
     P->inOut->logMain << "Writing " << N << " bytes into " <<fileName << " ; empty space on disk = " << statvfsBuf.f_bavail * statvfsBuf.f_bsize <<" bytes ..." <<flush;
-    
+
     unsigned long long C=0;
     unsigned long long iC;
     for (iC=0; iC<N/fstream_Chunk_Max; iC++) {
@@ -35,21 +35,21 @@ void fstreamWriteBig(std::ofstream &S, char* A, unsigned long long N, std::strin
 
         struct statvfs statvfsBuf;
         statvfs(fileName.c_str(), &statvfsBuf);
-    
+
 //         system(( "ls -lL "+ P->genomeDir + " > "+ P->genomeDir +"/error.info 2>&1").c_str());
 //         ifstream error_info((P->genomeDir +"/error.info").c_str());
 //         P->inOut->logMain <<error_info.rdbuf();
-        
+
         struct stat statBuf;
         stat(fileName.c_str(), &statBuf);
-        
+
         remove(fileName.c_str());
-        
+
         ostringstream errOut;
         errOut << errorID<<": exiting because of *OUTPUT FILE* error: could not write the output file "<< fileName <<"\n";
         errOut << "fail()=" <<S.fail() <<" ; bad()="<< S.bad()<<"\n";
         errOut << "Error while trying to write chunk # " << iC << "; "<< C << " bytes\n";
-        errOut << "File size full = "<< N <<" bytes\n";        
+        errOut << "File size full = "<< N <<" bytes\n";
         errOut << "File size on disk = " << statBuf.st_size<<" bytes\n";
         errOut << "Solution: check that you have enough space on the disk\n";
         errOut << "Empty space on disk = " << statvfsBuf.f_bavail * statvfsBuf.f_bsize <<" bytes\n";
@@ -67,7 +67,7 @@ std::ofstream & ofstrOpen (std::string fileName, std::string errorID, Parameters
         errOut << errorID<<": exiting because of *OUTPUT FILE* error: could not create output file "<< fileName <<"\n";
         errOut << "Solution: check that the path exists and you have write permission for this file\n";
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_FILE_OPEN, *P);
-    };    
+    };
     return ofStream;
 };
 
@@ -83,7 +83,7 @@ std::ifstream & ifstrOpen (std::string fileName, std::string errorID, std::strin
             errOut << "          "<< solutionString <<"\n";
         };
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_FILE_OPEN, *P);
-    };    
+    };
     return ifStream;
 };
 
diff --git a/source/sysRemoveDir.cpp b/source/sysRemoveDir.cpp
index c3de76c..2f8f553 100644
--- a/source/sysRemoveDir.cpp
+++ b/source/sysRemoveDir.cpp
@@ -17,6 +17,6 @@ int removeFileOrDir(const char *fpath,const struct stat *sb, int typeflag, struc
 
 
 void sysRemoveDir(std::string dirName) {//remove directory and all its contents
-    int nftwFlag=FTW_DEPTH; 
+    int nftwFlag=FTW_DEPTH;
     nftw(dirName.c_str(), removeFileOrDir, 100, nftwFlag);
 };

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/rna-star.git



More information about the debian-med-commit mailing list