1 Copy reads to the working tree

I prefer to concatenate the multiple sequence files into a single file for each the forward(R1) and reverse(R2) sequences. Interestingly, for this data I decided to handle all steps in one shot with a single script which is invoked with 1 argument for each sample. The text of that script ‘copy_process.sh’ follows:

cd preprocessing
for i in $(/bin/ls hpgl*); do
  ./copy_process.sh ${i}
done

## startdir=$(pwd)
## for i in "$@"; do
##   cd $startdir
##   cyoa --task rnaseq --method copyraw --raw_dir "/cbcb/lab/nelsayed/raw_data/fenselau" --hpgl ${i}
##   cd $i
##   inputs="${i}_forward.fastq.gz"
##   trimmed="${i}_forward-trimmed.fastq.gz"
##   cyoa --task rnaseq --method fastqc --input ${inputs}
##   cyoa --task rnaseq --method trimomatic --input ${inputs}
##   trim_id=$(cat last_job.txt)
##   cyoa --task rnaseq --method tophat --input ${trimmed} -s mmusculus --depends "${trim_id}"
##   lp_id=$(cat last_job.txt)
##   cyoa --task rnaseq --method bt_multi --input ${trimmed} -s mmusculus --depends "${trim_id}"
##   hs_id=$(cat last_job.txt)
##   rm last_job.txt
##   cd $startdir
## done

This process is therefore done in 6 steps: 1. Copy the raw data from Najib’s raw_data directory 2. Perform fastqc on the raw reads 3. Perform trimomatic 4. Align with tophat against the Mus musculus genome for the polyA samples. 5. Align with bowtie against the Mus musculus genome for the small-RNA samples.

2 Fastqc

The cyoa tool writes out a script which looks like the following:

## This FastQC run is against rnaseq data and is used for
## an initial estimation of the overall sequencing quality.
mkdir -p outputs/fastqc && \
  fastqc --extract -o outputs/fastqc hpgl0673_forward-trimmed.fastq hpgl0673_reverse-trimmed.fastq \
  2>outputs/fastqc.out 1>&2

A relevant plot from fastqc is (from sample hpgl0673):

qualities: quality for hpgl0673 nucleotide distribution for hpgl0673

3 Trimomatic

The trimomatic script looks like: It is worth noting that in some cases, the illumina adapter removal results in a java exception. If that happens, rather than lose the data I made my cyoa script re-invoke trimomatic without the illumina clipping. In addition, if things need to be redone, then the sequences may in fact have been moved into the sequences/ directory and compressed with xz -9e, thus the if [[]] at the beginning testing for those files.

## Trimomatic_Pairwise: In case a trimming needs to be redone...
if [[ ! -r "hpgl0673_forward.fastq.gz" ]]; then
  if [[ -r "sequences/hpgl0673_forward.fastq.xz" ]]; then
    mv sequences/hpgl0673_forward.fastq.xz . && pxz -d hpgl0673_forward.fastq.xz && pigz hpgl0673_forward.fastq
  else
    echo "Missing files. Did not find hpgl0673_forward.fastq.gz nor sequences/hpgl0673_forward.fastq.xz"
    exit 1
  fi
fi
trimomatic SE -threads 1 -phred33 hpgl0673_forward.fastq.gz hpgl0673_forward-trimmed_paired.fastq.gz \
  hpgl0673_forward-trimmed_unpaired.fastq.gz ILLUMINACLIP:/cbcbhomes/abelew/libraries/adapters.fa:2:20:4 \
  SLIDINGWINDOW:4:25 1>outputs/hpgl0673-trimomatic.out 2>&1
excepted=$(grep "Exception" outputs/hpgl0673-trimomatic.out)
## The following is in case the illumina clipping fails, which it does if this has already been run I think.
if [[ "${excepted}" != "" ]]; then
trimomatic SE -threads 1 -phred33 hpgl0673_forward.fastq.gz hpgl0673_forward-trimmed_paired.fastq.gz \
  hpgl0673_forward-trimmed_unpaired.fastq.gz SLIDINGWINDOW:4:25 1>>outputs/hpgl0673-trimomatic.out 2>&1
fi
sleep 10
mv hpgl0673_forward-trimmed_paired.fastq.gz hpgl0673_forward-trimmed.fastq.gz

The end result should be a set of files with trimmed, paired sequences separated from unpaired sequences.

4 Tophat

The tophat process is actually a couple of steps rolled into one, the trimmed/paired reads are fed to tophat, then the accepted_hits.bam is tested for properly paired reads and those reads are separated into accepted_paired.bam. These 2 bam files are sorted and indexed, and finally passed to htseq. Thus the tophat scripts look like:

These scripts however, do not include the additional processing step which split the accepted_hits.bam into accepted_paired.bam I am not sure why, but these scripts are missing the following step which was performed but not properly logged:

if [ -r "${tophat_dir}/accepted_hits.bam" ]; then
  samtools view -b -f 2 ${tophat_dir}/accepted_hits.bam > ${tophat_dir}/accepted_paired.bam && samtools index ${tophat_dir}/accepted_paired.bam
fi

I know this step was performed, because the files accepted_paired.bam exists for each directory, but the option -f 2 says that the ‘2’ flag must be set, which is the flag for an alignment which is paired.

## scripts/th_lbraziliensis-hpgl0673.sh
mkdir -p outputs/tophat_mmusculus && tophat  -g 1  \
  -G /cbcbhomes/abelew/libraries/genome/mmusculus.gff \
  --b2-very-sensitive -p 4 -o outputs/tophat_mmusculus \
/cbcbhomes/abelew/libraries/genome/indexes/mmusculus \
  hpgl0673_forward-trimmed.fastq.gz && \
  samtools sort -l 9 -n outputs/tophat_mmusculus/accepted_hits.bam outputs/tophat_mmusculus/accepted_sorted && \
  mv outputs/tophat_mmusculus/accepted_sorted.bam outputs/tophat_mmusculus/accepted_hits.bam && \
  samtools index outputs/tophat_mmusculus/accepted_hits.bam && \
  samtools sort -l 9 -n outputs/tophat_mmusculus/unmapped.bam outputs/tophat_mmusculus/unmapped_sorted && \
  mv outputs/tophat_mmusculus/unmapped_sorted.bam outputs/tophat_mmusculus/unmapped.bam && \
  samtools index outputs/tophat_mmusculus/unmapped.bam

5 Run htseq

The above scripts create sorted accepted_hits.bam files, I think that I manually made the accepted_paired.bam files and added those steps to the cyoa script post-facto, but the end result is the same and so I needed to run htseq on both:

## scripts/th_mmusculus-hpgl0673.sh
## Counting the number of hits in outputs/tophat_mmusculus/accepted_hits.bam for each feature found in /cbcbhomes/abelew/libraries/genome/mmusculus.gff
## Is this stranded? no.  The defaults of htseq are:
##  --order=name --idattr=gene_id --minaqual=10 --type=exon --stranded=yes --mode=union
htseq-count -q -f bam -s no  -i ID  \
  outputs/tophat_mmusculus/accepted_hits.bam /cbcbhomes/abelew/libraries/genome/mmusculus.gff \
  1>outputs/tophat_mmusculus/accepted_hits.count 2>outputs/tophat_mmusculus/accepted_hits.error && \
    xz -9e outputs/tophat_mmusculus/accepted_hits.count
## I am not going to belabor the point and print the htseq commands for all types.

6 Run Bowtie

Bowtie was used for the small RNA libraries and follows a similar path.

## This is a bowtie1 alignment of hpgl0673_forward-trimmed.fastq against
## /cbcbhomes/abelew/libraries/genome/indexes/mmusculus using arguments:  --best -v 0 -M 1 .
## This jobs depended on:
mkdir -p outputs/bowtie && sleep 10 && bowtie /cbcbhomes/abelew/libraries/genome/indexes/mmusculus  --best -v 0 -M 1  \
  -p 1 \
  -q hpgl0673_forward-trimmed.fastq \
  --un outputs/bowtie/hpgl0673_forward-trimmed-v0M1_unaligned_mmusculus.fastq \
  --al outputs/bowtie/hpgl0673_forward-trimmed-v0M1_aligned_mmusculus.fastq \
  -S outputs/bowtie/hpgl0673_forward-trimmed-v0M1.sam \
  2>outputs/bowtie/hpgl0673_forward-trimmed-v0M1.err \
  1>outputs/bowtie/hpgl0673_forward-trimmed-v0M1.out

## Counting the number of hits in outputs/bowtie/hpgl0673_forward-trimmed-v0M1.bam for each feature found in /cbcbhomes/abelew/libraries/genome/mmusculus_mi.gff
## Is this stranded? no.  The defaults of htseq are:
##  --order=name --idattr=gene_id --minaqual=10 --type=exon --stranded=yes --mode=union

htseq-count -q -f bam -s no  -i ID  -t exon \
  outputs/bowtie/hpgl0673_forward-trimmed-v0M1.bam /cbcbhomes/abelew/libraries/genome/mmusculus_mi.gff \
  1>outputs/bowtie/hpgl0673_forward-trimmed-v0M1_mi.count 2>outputs/bowtie/hpgl0673_forward-trimmed-v0M1.error && \
    xz -9e outputs/bowtie/hpgl0673_forward-trimmed-v0M1_mi.count

index.html

LS0tCnRpdGxlOiAiUHJlcHJvY2Vzc2luZyBNLm11c2N1bHVzIHNhbXBsZXMuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiBodG1sX2RvY3VtZW50OgogIGNvZGVfZG93bmxvYWQ6IHRydWUKICBjb2RlX2ZvbGRpbmc6IHNob3cKICBmaWdfY2FwdGlvbjogdHJ1ZQogIGZpZ19oZWlnaHQ6IDcKICBmaWdfd2lkdGg6IDcKICBoaWdobGlnaHQ6IGRlZmF1bHQKICBrZWVwX21kOiBmYWxzZQogIG1vZGU6IHNlbGZjb250YWluZWQKICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHRoZW1lOiByZWFkYWJsZQogIHRvYzogdHJ1ZQogIHRvY19mbG9hdDoKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIDwhLS0gRG9jdW1lbnQgcHJlbHVkZSByZXZpc2lvbiAyMDE3LTAyIC0tPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4Owp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQojIyBUaGVzZSBhcmUgdGhlIG9wdGlvbnMgSSB0ZW5kIHRvIGZhdm9yCmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIHNtKGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKSkKa25pdHI6Om9wdHNfa25pdCRzZXQoCiAgICBwcm9ncmVzcyA9IFRSVUUsCiAgICB2ZXJib3NlID0gVFJVRSwKICAgIHdpZHRoID0gOTAsCiAgICBlY2hvID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogICAgZXJyb3IgPSBUUlVFLAogICAgZmlnLndpZHRoID0gOCwKICAgIGZpZy5oZWlnaHQgPSA4LAogICAgZHBpID0gOTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoCiAgICBkaWdpdHMgPSA0LAogICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLAogICAga25pdHIuZHVwbGljYXRlLmxhYmVsID0gImFsbG93IikKc2V0LnNlZWQoMSkKcHJldmlvdXNfZmlsZSA8LSAiaW5kZXguUm1kIgpybWRfZmlsZSA8LSAicHJlcHJvY2Vzc2luZy5SbWQiCnZlciA8LSAiMjAxNzAyMjAiCnByZXZpb3VzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iLnJkYS54eiIsIHg9cHJldmlvdXNfZmlsZSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIucmRhLnh6IiwgeD1ybWRfZmlsZSkpCmBgYAoKYGBge3IgcmVuZGVyaW5nLCBpbmNsdWRlPUZBTFNFLCBldmFsPUZBTFNFfQojIyBUaGlzIGJsb2NrIGlzIHVzZWQgdG8gcmVuZGVyIGEgZG9jdW1lbnQgZnJvbSB3aXRoaW4gaXQuCnJtYXJrZG93bjo6cmVuZGVyKHJtZF9maWxlKQoKIyMgQW4gZXh0cmEgcmVuZGVyZXIgZm9yIHBkZiBvdXRwdXRyCm1hcmtkb3duOjpyZW5kZXIocm1kX2ZpbGUsIG91dHB1dF9mb3JtYXQ9InBkZl9kb2N1bWVudCIsIG91dHB1dF9vcHRpb25zPWMoInNraXBfaHRtbCIpKQojIyBPciB0byBzYXZlL2xvYWQgbGFyZ2UgUmRhdGEgZmlsZXMuCmhwZ2x0b29sczo6OnNhdmVtZSgpCmhwZ2x0b29sczo6OmxvYWRtZSgpCnJtKGxpc3Q9bHMoKSkKYGBgCgpgYGB7ciBsb2FkbWUsIGluY2x1ZGU9RkFMU0UsIGV2YWw9RkFMU0V9CnRtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9cHJldmlvdXNfc2F2ZSkpCmBgYAoKCiMgQ29weSByZWFkcyB0byB0aGUgd29ya2luZyB0cmVlCgpJIHByZWZlciB0byBjb25jYXRlbmF0ZSB0aGUgbXVsdGlwbGUgc2VxdWVuY2UgZmlsZXMgaW50byBhIHNpbmdsZSBmaWxlIGZvciBlYWNoIHRoZSBmb3J3YXJkKFIxKSBhbmQKcmV2ZXJzZShSMikgc2VxdWVuY2VzLiAgSW50ZXJlc3RpbmdseSwgZm9yIHRoaXMgZGF0YSBJIGRlY2lkZWQgdG8gaGFuZGxlIGFsbCBzdGVwcyBpbiBvbmUgc2hvdCB3aXRoCmEgc2luZ2xlIHNjcmlwdCB3aGljaCBpcyBpbnZva2VkIHdpdGggMSBhcmd1bWVudCBmb3IgZWFjaCBzYW1wbGUuICBUaGUgdGV4dCBvZiB0aGF0IHNjcmlwdAonY29weV9wcm9jZXNzLnNoJyBmb2xsb3dzOgoKYGBge3IgbWtkaXJzLCBlbmdpbmU9J2Jhc2gnLCBldmFsPUZBTFNFfQpjZCBwcmVwcm9jZXNzaW5nCmZvciBpIGluICQoL2Jpbi9scyBocGdsKik7IGRvCiAgLi9jb3B5X3Byb2Nlc3Muc2ggJHtpfQpkb25lCgojIyBzdGFydGRpcj0kKHB3ZCkKIyMgZm9yIGkgaW4gIiRAIjsgZG8KIyMgICBjZCAkc3RhcnRkaXIKIyMgICBjeW9hIC0tdGFzayBybmFzZXEgLS1tZXRob2QgY29weXJhdyAtLXJhd19kaXIgIi9jYmNiL2xhYi9uZWxzYXllZC9yYXdfZGF0YS9mZW5zZWxhdSIgLS1ocGdsICR7aX0KIyMgICBjZCAkaQojIyAgIGlucHV0cz0iJHtpfV9mb3J3YXJkLmZhc3RxLmd6IgojIyAgIHRyaW1tZWQ9IiR7aX1fZm9yd2FyZC10cmltbWVkLmZhc3RxLmd6IgojIyAgIGN5b2EgLS10YXNrIHJuYXNlcSAtLW1ldGhvZCBmYXN0cWMgLS1pbnB1dCAke2lucHV0c30KIyMgICBjeW9hIC0tdGFzayBybmFzZXEgLS1tZXRob2QgdHJpbW9tYXRpYyAtLWlucHV0ICR7aW5wdXRzfQojIyAgIHRyaW1faWQ9JChjYXQgbGFzdF9qb2IudHh0KQojIyAgIGN5b2EgLS10YXNrIHJuYXNlcSAtLW1ldGhvZCB0b3BoYXQgLS1pbnB1dCAke3RyaW1tZWR9IC1zIG1tdXNjdWx1cyAtLWRlcGVuZHMgIiR7dHJpbV9pZH0iCiMjICAgbHBfaWQ9JChjYXQgbGFzdF9qb2IudHh0KQojIyAgIGN5b2EgLS10YXNrIHJuYXNlcSAtLW1ldGhvZCBidF9tdWx0aSAtLWlucHV0ICR7dHJpbW1lZH0gLXMgbW11c2N1bHVzIC0tZGVwZW5kcyAiJHt0cmltX2lkfSIKIyMgICBoc19pZD0kKGNhdCBsYXN0X2pvYi50eHQpCiMjICAgcm0gbGFzdF9qb2IudHh0CiMjICAgY2QgJHN0YXJ0ZGlyCiMjIGRvbmUKYGBgCgpUaGlzIHByb2Nlc3MgaXMgdGhlcmVmb3JlIGRvbmUgaW4gNiBzdGVwczoKMS4gIENvcHkgdGhlIHJhdyBkYXRhIGZyb20gTmFqaWIncyByYXdfZGF0YSBkaXJlY3RvcnkKMi4gIFBlcmZvcm0gZmFzdHFjIG9uIHRoZSByYXcgcmVhZHMKMy4gIFBlcmZvcm0gdHJpbW9tYXRpYwo0LiAgQWxpZ24gd2l0aCB0b3BoYXQgYWdhaW5zdCB0aGUgTXVzIG11c2N1bHVzIGdlbm9tZSBmb3IgdGhlIHBvbHlBIHNhbXBsZXMuCjUuICBBbGlnbiB3aXRoIGJvd3RpZSBhZ2FpbnN0IHRoZSBNdXMgbXVzY3VsdXMgZ2Vub21lIGZvciB0aGUgc21hbGwtUk5BIHNhbXBsZXMuCgojIEZhc3RxYwoKVGhlIGN5b2EgdG9vbCB3cml0ZXMgb3V0IGEgc2NyaXB0IHdoaWNoIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZzoKCmBgYHtyIGZhc3RxY19zY3JpcHQsIGVuZ2luZT0nYmFzaCcsIGV2YWw9RkFMU0V9CiMjIFRoaXMgRmFzdFFDIHJ1biBpcyBhZ2FpbnN0IHJuYXNlcSBkYXRhIGFuZCBpcyB1c2VkIGZvcgojIyBhbiBpbml0aWFsIGVzdGltYXRpb24gb2YgdGhlIG92ZXJhbGwgc2VxdWVuY2luZyBxdWFsaXR5Lgpta2RpciAtcCBvdXRwdXRzL2Zhc3RxYyAmJiBcCiAgZmFzdHFjIC0tZXh0cmFjdCAtbyBvdXRwdXRzL2Zhc3RxYyBocGdsMDY3M19mb3J3YXJkLXRyaW1tZWQuZmFzdHEgaHBnbDA2NzNfcmV2ZXJzZS10cmltbWVkLmZhc3RxIFwKICAyPm91dHB1dHMvZmFzdHFjLm91dCAxPiYyCmBgYAoKQSByZWxldmFudCBwbG90IGZyb20gZmFzdHFjIGlzIChmcm9tIHNhbXBsZSBocGdsMDY3Myk6CgpxdWFsaXRpZXM6CiFbcXVhbGl0eSBmb3IgaHBnbDA2NzNdKHByZXByb2Nlc3Npbmcvc21hbGxfZXhvL2hwZ2wwNjczL291dHB1dHMvZmFzdHFjL2hwZ2wwNjczX2ZvcndhcmQtdHJpbW1lZF9mYXN0cWMvSW1hZ2VzL3Blcl9iYXNlX3F1YWxpdHkucG5nKQohW251Y2xlb3RpZGUgZGlzdHJpYnV0aW9uIGZvciBocGdsMDY3M10ocHJlcHJvY2Vzc2luZy9zbWFsbF9leG8vaHBnbDA2NzMvb3V0cHV0cy9iaW9waWVjZXMvaHBnbDA2NzNfZm9yd2FyZC10cmltbWVkX250ZGlzdC5zdmcpCgojIFRyaW1vbWF0aWMKClRoZSB0cmltb21hdGljIHNjcmlwdCBsb29rcyBsaWtlOgpJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBpbiBzb21lIGNhc2VzLCB0aGUgaWxsdW1pbmEgYWRhcHRlciByZW1vdmFsIHJlc3VsdHMgaW4gYSBqYXZhIGV4Y2VwdGlvbi4gIElmCnRoYXQgaGFwcGVucywgcmF0aGVyIHRoYW4gbG9zZSB0aGUgZGF0YSBJIG1hZGUgbXkgY3lvYSBzY3JpcHQgcmUtaW52b2tlIHRyaW1vbWF0aWMgd2l0aG91dCB0aGUKaWxsdW1pbmEgY2xpcHBpbmcuICBJbiBhZGRpdGlvbiwgaWYgdGhpbmdzIG5lZWQgdG8gYmUgcmVkb25lLCB0aGVuIHRoZSBzZXF1ZW5jZXMgbWF5IGluIGZhY3QgaGF2ZQpiZWVuIG1vdmVkIGludG8gdGhlIHNlcXVlbmNlcy8gZGlyZWN0b3J5IGFuZCBjb21wcmVzc2VkIHdpdGggeHogLTllLCB0aHVzIHRoZSBpZiBbW11dIGF0IHRoZQpiZWdpbm5pbmcgdGVzdGluZyBmb3IgdGhvc2UgZmlsZXMuCgpgYGB7ciB0cmltb21hdGljX3NjcmlwdCwgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgVHJpbW9tYXRpY19QYWlyd2lzZTogSW4gY2FzZSBhIHRyaW1taW5nIG5lZWRzIHRvIGJlIHJlZG9uZS4uLgppZiBbWyAhIC1yICJocGdsMDY3M19mb3J3YXJkLmZhc3RxLmd6IiBdXTsgdGhlbgogIGlmIFtbIC1yICJzZXF1ZW5jZXMvaHBnbDA2NzNfZm9yd2FyZC5mYXN0cS54eiIgXV07IHRoZW4KICAgIG12IHNlcXVlbmNlcy9ocGdsMDY3M19mb3J3YXJkLmZhc3RxLnh6IC4gJiYgcHh6IC1kIGhwZ2wwNjczX2ZvcndhcmQuZmFzdHEueHogJiYgcGlneiBocGdsMDY3M19mb3J3YXJkLmZhc3RxCiAgZWxzZQogICAgZWNobyAiTWlzc2luZyBmaWxlcy4gRGlkIG5vdCBmaW5kIGhwZ2wwNjczX2ZvcndhcmQuZmFzdHEuZ3ogbm9yIHNlcXVlbmNlcy9ocGdsMDY3M19mb3J3YXJkLmZhc3RxLnh6IgogICAgZXhpdCAxCiAgZmkKZmkKdHJpbW9tYXRpYyBTRSAtdGhyZWFkcyAxIC1waHJlZDMzIGhwZ2wwNjczX2ZvcndhcmQuZmFzdHEuZ3ogaHBnbDA2NzNfZm9yd2FyZC10cmltbWVkX3BhaXJlZC5mYXN0cS5neiBcCiAgaHBnbDA2NzNfZm9yd2FyZC10cmltbWVkX3VucGFpcmVkLmZhc3RxLmd6IElMTFVNSU5BQ0xJUDovY2JjYmhvbWVzL2FiZWxldy9saWJyYXJpZXMvYWRhcHRlcnMuZmE6MjoyMDo0IFwKICBTTElESU5HV0lORE9XOjQ6MjUgMT5vdXRwdXRzL2hwZ2wwNjczLXRyaW1vbWF0aWMub3V0IDI+JjEKZXhjZXB0ZWQ9JChncmVwICJFeGNlcHRpb24iIG91dHB1dHMvaHBnbDA2NzMtdHJpbW9tYXRpYy5vdXQpCiMjIFRoZSBmb2xsb3dpbmcgaXMgaW4gY2FzZSB0aGUgaWxsdW1pbmEgY2xpcHBpbmcgZmFpbHMsIHdoaWNoIGl0IGRvZXMgaWYgdGhpcyBoYXMgYWxyZWFkeSBiZWVuIHJ1biBJIHRoaW5rLgppZiBbWyAiJHtleGNlcHRlZH0iICE9ICIiIF1dOyB0aGVuCnRyaW1vbWF0aWMgU0UgLXRocmVhZHMgMSAtcGhyZWQzMyBocGdsMDY3M19mb3J3YXJkLmZhc3RxLmd6IGhwZ2wwNjczX2ZvcndhcmQtdHJpbW1lZF9wYWlyZWQuZmFzdHEuZ3ogXAogIGhwZ2wwNjczX2ZvcndhcmQtdHJpbW1lZF91bnBhaXJlZC5mYXN0cS5neiBTTElESU5HV0lORE9XOjQ6MjUgMT4+b3V0cHV0cy9ocGdsMDY3My10cmltb21hdGljLm91dCAyPiYxCmZpCnNsZWVwIDEwCm12IGhwZ2wwNjczX2ZvcndhcmQtdHJpbW1lZF9wYWlyZWQuZmFzdHEuZ3ogaHBnbDA2NzNfZm9yd2FyZC10cmltbWVkLmZhc3RxLmd6CmBgYAoKVGhlIGVuZCByZXN1bHQgc2hvdWxkIGJlIGEgc2V0IG9mIGZpbGVzIHdpdGggdHJpbW1lZCwgcGFpcmVkIHNlcXVlbmNlcyBzZXBhcmF0ZWQgZnJvbSB1bnBhaXJlZApzZXF1ZW5jZXMuCgojIFRvcGhhdAoKVGhlIHRvcGhhdCBwcm9jZXNzIGlzIGFjdHVhbGx5IGEgY291cGxlIG9mIHN0ZXBzIHJvbGxlZCBpbnRvIG9uZSwgdGhlIHRyaW1tZWQvcGFpcmVkIHJlYWRzIGFyZSBmZWQKdG8gdG9waGF0LCB0aGVuIHRoZSBhY2NlcHRlZF9oaXRzLmJhbSBpcyB0ZXN0ZWQgZm9yIHByb3Blcmx5IHBhaXJlZCByZWFkcyBhbmQgdGhvc2UgcmVhZHMgYXJlCnNlcGFyYXRlZCBpbnRvIGFjY2VwdGVkX3BhaXJlZC5iYW0uICBUaGVzZSAyIGJhbSBmaWxlcyBhcmUgc29ydGVkIGFuZCBpbmRleGVkLCBhbmQgZmluYWxseSBwYXNzZWQgdG8KaHRzZXEuICBUaHVzIHRoZSB0b3BoYXQgc2NyaXB0cyBsb29rIGxpa2U6CgpUaGVzZSBzY3JpcHRzIGhvd2V2ZXIsIGRvIG5vdCBpbmNsdWRlIHRoZSBhZGRpdGlvbmFsIHByb2Nlc3Npbmcgc3RlcCB3aGljaCBzcGxpdCB0aGUKYWNjZXB0ZWRfaGl0cy5iYW0gaW50byBhY2NlcHRlZF9wYWlyZWQuYmFtICBJIGFtIG5vdCBzdXJlIHdoeSwgYnV0IHRoZXNlIHNjcmlwdHMgYXJlIG1pc3NpbmcgdGhlCmZvbGxvd2luZyBzdGVwIHdoaWNoIHdhcyBwZXJmb3JtZWQgYnV0IG5vdCBwcm9wZXJseSBsb2dnZWQ6CgpgYGB7ciBwYWlyZWRfaGl0cywgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KaWYgWyAtciAiJHt0b3BoYXRfZGlyfS9hY2NlcHRlZF9oaXRzLmJhbSIgXTsgdGhlbgogIHNhbXRvb2xzIHZpZXcgLWIgLWYgMiAke3RvcGhhdF9kaXJ9L2FjY2VwdGVkX2hpdHMuYmFtID4gJHt0b3BoYXRfZGlyfS9hY2NlcHRlZF9wYWlyZWQuYmFtICYmIHNhbXRvb2xzIGluZGV4ICR7dG9waGF0X2Rpcn0vYWNjZXB0ZWRfcGFpcmVkLmJhbQpmaQpgYGAKCkkga25vdyB0aGlzIHN0ZXAgd2FzIHBlcmZvcm1lZCwgYmVjYXVzZSB0aGUgZmlsZXMgYWNjZXB0ZWRfcGFpcmVkLmJhbSBleGlzdHMgZm9yIGVhY2ggZGlyZWN0b3J5LCBidXQKdGhlIG9wdGlvbiAtZiAyIHNheXMgdGhhdCB0aGUgJzInIGZsYWcgbXVzdCBiZSBzZXQsIHdoaWNoIGlzIHRoZSBmbGFnIGZvciBhbiBhbGlnbm1lbnQgd2hpY2ggaXMKcGFpcmVkLgoKYGBge3IgdG9waGF0X3J1bnMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9RkFMU0V9CiMjIHNjcmlwdHMvdGhfbGJyYXppbGllbnNpcy1ocGdsMDY3My5zaApta2RpciAtcCBvdXRwdXRzL3RvcGhhdF9tbXVzY3VsdXMgJiYgdG9waGF0ICAtZyAxICBcCiAgLUcgL2NiY2Job21lcy9hYmVsZXcvbGlicmFyaWVzL2dlbm9tZS9tbXVzY3VsdXMuZ2ZmIFwKICAtLWIyLXZlcnktc2Vuc2l0aXZlIC1wIDQgLW8gb3V0cHV0cy90b3BoYXRfbW11c2N1bHVzIFwKL2NiY2Job21lcy9hYmVsZXcvbGlicmFyaWVzL2dlbm9tZS9pbmRleGVzL21tdXNjdWx1cyBcCiAgaHBnbDA2NzNfZm9yd2FyZC10cmltbWVkLmZhc3RxLmd6ICYmIFwKICBzYW10b29scyBzb3J0IC1sIDkgLW4gb3V0cHV0cy90b3BoYXRfbW11c2N1bHVzL2FjY2VwdGVkX2hpdHMuYmFtIG91dHB1dHMvdG9waGF0X21tdXNjdWx1cy9hY2NlcHRlZF9zb3J0ZWQgJiYgXAogIG12IG91dHB1dHMvdG9waGF0X21tdXNjdWx1cy9hY2NlcHRlZF9zb3J0ZWQuYmFtIG91dHB1dHMvdG9waGF0X21tdXNjdWx1cy9hY2NlcHRlZF9oaXRzLmJhbSAmJiBcCiAgc2FtdG9vbHMgaW5kZXggb3V0cHV0cy90b3BoYXRfbW11c2N1bHVzL2FjY2VwdGVkX2hpdHMuYmFtICYmIFwKICBzYW10b29scyBzb3J0IC1sIDkgLW4gb3V0cHV0cy90b3BoYXRfbW11c2N1bHVzL3VubWFwcGVkLmJhbSBvdXRwdXRzL3RvcGhhdF9tbXVzY3VsdXMvdW5tYXBwZWRfc29ydGVkICYmIFwKICBtdiBvdXRwdXRzL3RvcGhhdF9tbXVzY3VsdXMvdW5tYXBwZWRfc29ydGVkLmJhbSBvdXRwdXRzL3RvcGhhdF9tbXVzY3VsdXMvdW5tYXBwZWQuYmFtICYmIFwKICBzYW10b29scyBpbmRleCBvdXRwdXRzL3RvcGhhdF9tbXVzY3VsdXMvdW5tYXBwZWQuYmFtCmBgYAoKIyBSdW4gaHRzZXEKClRoZSBhYm92ZSBzY3JpcHRzIGNyZWF0ZSBzb3J0ZWQgYWNjZXB0ZWRfaGl0cy5iYW0gZmlsZXMsIEkgdGhpbmsgdGhhdCBJIG1hbnVhbGx5IG1hZGUgdGhlCmFjY2VwdGVkX3BhaXJlZC5iYW0gZmlsZXMgYW5kIGFkZGVkIHRob3NlIHN0ZXBzIHRvIHRoZSBjeW9hIHNjcmlwdCBwb3N0LWZhY3RvLCBidXQgdGhlIGVuZCByZXN1bHQgaXMKdGhlIHNhbWUgYW5kIHNvIEkgbmVlZGVkIHRvIHJ1biBodHNlcSBvbiBib3RoOgoKYGBge3IgaHRzZXFfaW52b2NhdGlvbnMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9RkFMU0V9CiMjIHNjcmlwdHMvdGhfbW11c2N1bHVzLWhwZ2wwNjczLnNoCiMjIENvdW50aW5nIHRoZSBudW1iZXIgb2YgaGl0cyBpbiBvdXRwdXRzL3RvcGhhdF9tbXVzY3VsdXMvYWNjZXB0ZWRfaGl0cy5iYW0gZm9yIGVhY2ggZmVhdHVyZSBmb3VuZCBpbiAvY2JjYmhvbWVzL2FiZWxldy9saWJyYXJpZXMvZ2Vub21lL21tdXNjdWx1cy5nZmYKIyMgSXMgdGhpcyBzdHJhbmRlZD8gbm8uICBUaGUgZGVmYXVsdHMgb2YgaHRzZXEgYXJlOgojIyAgLS1vcmRlcj1uYW1lIC0taWRhdHRyPWdlbmVfaWQgLS1taW5hcXVhbD0xMCAtLXR5cGU9ZXhvbiAtLXN0cmFuZGVkPXllcyAtLW1vZGU9dW5pb24KaHRzZXEtY291bnQgLXEgLWYgYmFtIC1zIG5vICAtaSBJRCAgXAogIG91dHB1dHMvdG9waGF0X21tdXNjdWx1cy9hY2NlcHRlZF9oaXRzLmJhbSAvY2JjYmhvbWVzL2FiZWxldy9saWJyYXJpZXMvZ2Vub21lL21tdXNjdWx1cy5nZmYgXAogIDE+b3V0cHV0cy90b3BoYXRfbW11c2N1bHVzL2FjY2VwdGVkX2hpdHMuY291bnQgMj5vdXRwdXRzL3RvcGhhdF9tbXVzY3VsdXMvYWNjZXB0ZWRfaGl0cy5lcnJvciAmJiBcCiAgICB4eiAtOWUgb3V0cHV0cy90b3BoYXRfbW11c2N1bHVzL2FjY2VwdGVkX2hpdHMuY291bnQKIyMgSSBhbSBub3QgZ29pbmcgdG8gYmVsYWJvciB0aGUgcG9pbnQgYW5kIHByaW50IHRoZSBodHNlcSBjb21tYW5kcyBmb3IgYWxsIHR5cGVzLgpgYGAKCiMgUnVuIEJvd3RpZQoKQm93dGllIHdhcyB1c2VkIGZvciB0aGUgc21hbGwgUk5BIGxpYnJhcmllcyBhbmQgZm9sbG93cyBhIHNpbWlsYXIgcGF0aC4KCmBgYHtyIGJvd3RpZV9pbnZvY2F0aW9uLCBlbmdpbmU9J2Jhc2gnLCBldmFsPUZBTFNFfQojIyBUaGlzIGlzIGEgYm93dGllMSBhbGlnbm1lbnQgb2YgaHBnbDA2NzNfZm9yd2FyZC10cmltbWVkLmZhc3RxIGFnYWluc3QKIyMgL2NiY2Job21lcy9hYmVsZXcvbGlicmFyaWVzL2dlbm9tZS9pbmRleGVzL21tdXNjdWx1cyB1c2luZyBhcmd1bWVudHM6ICAtLWJlc3QgLXYgMCAtTSAxIC4KIyMgVGhpcyBqb2JzIGRlcGVuZGVkIG9uOgpta2RpciAtcCBvdXRwdXRzL2Jvd3RpZSAmJiBzbGVlcCAxMCAmJiBib3d0aWUgL2NiY2Job21lcy9hYmVsZXcvbGlicmFyaWVzL2dlbm9tZS9pbmRleGVzL21tdXNjdWx1cyAgLS1iZXN0IC12IDAgLU0gMSAgXAogIC1wIDEgXAogIC1xIGhwZ2wwNjczX2ZvcndhcmQtdHJpbW1lZC5mYXN0cSBcCiAgLS11biBvdXRwdXRzL2Jvd3RpZS9ocGdsMDY3M19mb3J3YXJkLXRyaW1tZWQtdjBNMV91bmFsaWduZWRfbW11c2N1bHVzLmZhc3RxIFwKICAtLWFsIG91dHB1dHMvYm93dGllL2hwZ2wwNjczX2ZvcndhcmQtdHJpbW1lZC12ME0xX2FsaWduZWRfbW11c2N1bHVzLmZhc3RxIFwKICAtUyBvdXRwdXRzL2Jvd3RpZS9ocGdsMDY3M19mb3J3YXJkLXRyaW1tZWQtdjBNMS5zYW0gXAogIDI+b3V0cHV0cy9ib3d0aWUvaHBnbDA2NzNfZm9yd2FyZC10cmltbWVkLXYwTTEuZXJyIFwKICAxPm91dHB1dHMvYm93dGllL2hwZ2wwNjczX2ZvcndhcmQtdHJpbW1lZC12ME0xLm91dAoKIyMgQ291bnRpbmcgdGhlIG51bWJlciBvZiBoaXRzIGluIG91dHB1dHMvYm93dGllL2hwZ2wwNjczX2ZvcndhcmQtdHJpbW1lZC12ME0xLmJhbSBmb3IgZWFjaCBmZWF0dXJlIGZvdW5kIGluIC9jYmNiaG9tZXMvYWJlbGV3L2xpYnJhcmllcy9nZW5vbWUvbW11c2N1bHVzX21pLmdmZgojIyBJcyB0aGlzIHN0cmFuZGVkPyBuby4gIFRoZSBkZWZhdWx0cyBvZiBodHNlcSBhcmU6CiMjICAtLW9yZGVyPW5hbWUgLS1pZGF0dHI9Z2VuZV9pZCAtLW1pbmFxdWFsPTEwIC0tdHlwZT1leG9uIC0tc3RyYW5kZWQ9eWVzIC0tbW9kZT11bmlvbgoKaHRzZXEtY291bnQgLXEgLWYgYmFtIC1zIG5vICAtaSBJRCAgLXQgZXhvbiBcCiAgb3V0cHV0cy9ib3d0aWUvaHBnbDA2NzNfZm9yd2FyZC10cmltbWVkLXYwTTEuYmFtIC9jYmNiaG9tZXMvYWJlbGV3L2xpYnJhcmllcy9nZW5vbWUvbW11c2N1bHVzX21pLmdmZiBcCiAgMT5vdXRwdXRzL2Jvd3RpZS9ocGdsMDY3M19mb3J3YXJkLXRyaW1tZWQtdjBNMV9taS5jb3VudCAyPm91dHB1dHMvYm93dGllL2hwZ2wwNjczX2ZvcndhcmQtdHJpbW1lZC12ME0xLmVycm9yICYmIFwKICAgIHh6IC05ZSBvdXRwdXRzL2Jvd3RpZS9ocGdsMDY3M19mb3J3YXJkLXRyaW1tZWQtdjBNMV9taS5jb3VudApgYGAKCltpbmRleC5odG1sXShpbmRleC5odG1sKQo=