3/28/20

  1. Download metaT file

Example with xml link:

curl 'https://genome.jgi.doe.gov/portal/ext-api/downloads/get_tape_file?blocking=true&url=/IncBWC4MmetaG/download/_JAMO/59a93bde7ded5e41edd8f2b0/11860.3.224398.ATTGAGC-GGCTCAA.fastq.gz' -b cookies > Inc_BW-C-4-M_metag.fastq.qz
  1. run FastQC *found out adapter is Illumina universal adapter
  2. run trimmomatic with the following command on a screen on genobacter
java -jar /usr/share/java/trimmomatic-0.39.jar SE -threads 4 MetaT/Native-BW-C-4-M_metat.fastq.gz MetaT/trimmed/Native-BW-C-4-M_metat.trim.fastq.gz ILLUMINACLIP:TruSeq2-SE.fa:2:40:15  SLIDINGWINDOW:4:20

note: unsure if unpaired, but only 1 file

used TruSeq2-SE for time being

followed steps from workshop
  1. BWA

potentially useful: https://github.com/McMahonLab/geodes/blob/c4e056ff1e34d29c8fbd9e2a72b1701faf82a8c8/bioinformatics_workflow/lab_notebooks/labnotebook_02mapping.Rmd another scripting option: https://pyjip.readthedocs.io/en/latest/examples/bwa.html

First, index genomes (can be fa or fasta file)

bwa index

RUN IN THE FOLLOWING IN FOLDER WITH INDEXED GENOMES

bwa mem -t 10 3300020651.fa.6.fa MetaT/trimmed/Native-BW-C-4-M_metat.trim.fastq.gz > Results/sam/Native-BW-C-4-M_metat_330002065.aligned.sam

Here’s what the same output should look like: I can’t seem to figure out how to specify differenct cutoffs-it seems that many people edit the sam output using grep to get the quality scores they want.

4/6/20

Scripting the process for Native-BW-C-4-M_metat alignment to all genomes:

*this doesn't work, use below*
for file in `dir -d *fa` ; do
    echo "working with file $file" 
    bwa index $file
    sam=../Results/sam/Native-BW-C-4-M_metat_$file.aligned.sam
    bam=../Results/bam/Native-BW-C-4-M_metat_$file.aligned.bam
    sorted_bam=../Results/sorted_bam/Native-BW-C-4-M_metat_$file.aligned.sorted.bam
    bwa mem -t 20 $file ../MetaT/trimmed/Native-BW-C-4-M_metat.trim.fastq.gz > $sam
    samtools view -S -b $sam > $bam 
    samtools sort -o $sorted_bam $bam
    samtools index $sorted_bam
done

Ran the script, mostly worked except none of the bam files were sorted and therefore couldn’t be indexed.

Error message:

[E::hts_open] fail to open file '../Results/sorted_bam/Native-BW-C-4-M_metat_3300020916.fa.5.fa.aligned.sorted.bam'
[bam_sort_core] fail to open file ../Results/sorted_bam/Native-BW-C-4-M_metat_3300020916.fa.5.fa.aligned.sorted.bam
[E::hts_open] fail to open file '../Results/sorted_bam/Native-BW-C-4-M_metat_3300020916.fa.5.fa.aligned.sorted.bam'

I also got an error with one of the genomes, but this was the only one:

working with file 3300020916.fa.5.fa
[M::bwa_idx_load_from_disk] read 0 ALT contigs
[M::process] read 1405888 sequences (200000023 bp)...
[E::bns_fetch_seq] begin=7100674, mid=7100745, end=6522026, len=578648, seq=0x7fd56fb09010, rid=466, far_beg=6519512, far_end=6522026
bwa: bntseq.c:450: bns_fetch_seq: Assertion `seq && *end - *beg == len' failed.
Aborted (core dumped)

4/7/20: Today I’d like to 1) figure out what caused this genome to fail 2) fix what’s wrong with the sorted bam script

Moving forward, I want to * write a script to download the remaining MetaT files OR use SRA toolkit

  1. Looking online, it seems to be an indexing error. I reran the index and ran bwa mem again, and it seems to be working. Make sure to convert to bam.

  2. Turns out the code from DataCarpentry was for a different version of samtools I think - the syntax was wrong. Now samtools should run as samtools sort -o INPUT OUTPUT. Unsure why this works but it did.

NEW SCRIPT, should work:

for file in `dir -d *fa` ; do
    echo "working with file $file" 
    bwa index $file
    sam=../Results/sam/Inc_BW-C-4-M_metag_$file.aligned.sam
    sorted_bam=../Results/sorted_bam/Inc_BW-C-4-M_metag_$file.aligned.sorted.bam
    bwa mem -t 40 $file ../MetaG/trimmed/Inc_BW-C-4-M_metag.trim.fastq.qz > $sam
    echo "now converting sam to sorted bam $file"
    samtools sort -O bam -T tmp -@ 40 $sam > $sorted_bam 
    echo "now indexing sorted bam $file"
    samtools index $sorted_bam
done

For now, sort all bams.

In bam directory:

for file in `dir -d *bam` ; do
    sorted_bam=`echo "$file" | sed 's/.bam/.sorted.bam/'`;   
    echo "working with $file"
    samtools sort -O bam -T tmp $file > ../sorted_bam/$sorted_bam;     
done

Then index in sorted_bam directory:

for file in `dir -d *bam` ; do
    echo "working with $file"
    samtools index $file     
done

4/13/20 Indexing worked, so we’re through that part of the workflow.

Still don’t know what the max mapq score is (37 vs 42), but have figured out that for BWA the calculation is -10 log(Pr) (https://sequencing.qcfail.com/articles/mapq-values-are-really-useful-but-their-implementation-is-a-mess/). Therfore, a score of 20 has a 1% probability of being mismatched.

There’s a program called BAMQC which plots the quality scores, which may be useful so I can see what kind of scores I’m getting. It’s not on genobacter or MGHPCC so I could download if I really need it.

Looking at the sam files I got so far, there seem to be few matches, so a lot of mapq scores of 0. I also figured out what the most common flags were:

flag 4: unmapped flag 0: fwd strand flag 16: reverse strand

I found a list of samtools commands which are useful: https://gist.github.com/davfre/8596159

Most useful: Number of reads:

samtools view -c file.bam

Stats:

samtools flagstat filename.bam

Example output: 137136530 + 0 in total (QC-passed reads + QC-failed reads) 0 + 0 secondary 1898 + 0 supplementary 0 + 0 duplicates 603518 + 0 mapped (0.44%:-nan%) 0 + 0 paired in sequencing 0 + 0 read1 0 + 0 read2 0 + 0 properly paired (-nan%:-nan%) 0 + 0 with itself and mate mapped 0 + 0 singletons (-nan%:-nan%) 0 + 0 with mate mapped to a different chr 0 + 0 with mate mapped to a different chr (mapQ>=5)

Supplementary means chimeric/non-linear alignment

Output only mapped reads:

samtools view -F 0x04 -b in.bam > out.aligned.bam

Minimum alignment quality (in this example, mapq>=30 so probability .1%?)

samtools view -q 30 -b in.bam > aligned_reads.q30.bam
samtools view -q 30 -c in.bam #to count alignments with score >30

Different mapq levels to try: 99.9% or mapq of 30 99% or mapq of 20 97% or mapq of 15 95% or mapq of 13

4/16/20:

All genomes and reads summary:

parallel --tag samtools view -c  ::: *.bam > reads.csv

Tomorrow: do the whole pipeline with the metaG file

can i adjust samtool threads?

4/18/20: Adjust sam tools threads with @

Ran out of space, trying to convert all sams to sorted bams (deleting all bams to secure space)

for file in `dir -d *sam` ; do
    echo "working with file $file" 
    sorted_bam=../sorted_bam/$file.sorted.bam
    samtools sort -O bam -T tmp -@ 40 $file > $sorted_bam 
    echo "now indexing sorted bam $sorted_bam"
    samtools index $sorted_bam
done

4/28/20

For some reason the bams are empty. I think I’m just going to rerun everything:

for file in `dir -d *fa` ; do
    echo "working with file $file" 
    sorted_bam=../Results/sorted_bam/Native-BW-C-4-M_metat/Native-BW-C-4-M_metat_$file.sorted.bam
    bwa mem -t 60 $file ../MetaT/trimmed/Native-BW-C-4-M_metat.trim.fastq.gz | samtools sort -O bam -T tmp -@ 60 > $sorted_bam
    echo "now indexing sorted bam $file"
    samtools index $sorted_bam
done

Get 3 quality files for all bams:

CHECK BEFORE USING
for file in `dir -d *.sorted.bam` ; do
  echo "working with file $file"
  q30=`echo "$file" | sed 's/.sorted.bam/.q30.sorted.bam/'`
  q20=`echo "$file" | sed 's/.sorted.bam/.q20.sorted.bam/'`
  q15=`echo "$file" | sed 's/.sorted.bam/.q15.sorted.bam/'`
  samtools view -q 30 -b $file > $q30
  samtools view -q 20 -b $file > $q20
  samtools view -q 15 -b $file > $q15
done

Get all reads Repeat for all other files?

5/3/20 Downloaded all files, now trim them all:

for file in `dir -d *.fastq.gz` ; do
  echo "working with file $file"
  trim=`echo "$file" | sed 's/.fastq.gz/.trim.fastq.gz/'`
java -jar /usr/share/java/trimmomatic-0.39.jar SE -threads 40 $file ./Trim/$trim ILLUMINACLIP:../TruSeq2-SE.fa:2:40:15  SLIDINGWINDOW:4:20
done

Then map and sort

for genome in `dir -d *fa` ; do
  for meta in ../MetaT/*.trim.fastq.gz ; do
    echo "working with genome $genome and metat $meta" 
    file=`echo "$meta" | sed 's/.fastq.gz//' | sed 's/..\/MetaT\///'`
    echo "$file"
    sorted_bam=../../../BHD1/Arianna/Results/$file.$genome.sorted.bam
    echo "$sorted_bam"
    bwa mem -t 60 $genome $meta | samtools sort -O bam -T tmp -@ 60 > $sorted_bam
    echo "now indexing sorted bam $sorted_bam"
    samtools index $sorted_bam
  done
done
LS0tCnRpdGxlOiAiUmVhZCBNYXBwaW5nIFRyaWFscyIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQozLzI4LzIwCgoxKSBEb3dubG9hZCBtZXRhVCBmaWxlCgpFeGFtcGxlIHdpdGggeG1sIGxpbms6CmBgYApjdXJsICdodHRwczovL2dlbm9tZS5qZ2kuZG9lLmdvdi9wb3J0YWwvZXh0LWFwaS9kb3dubG9hZHMvZ2V0X3RhcGVfZmlsZT9ibG9ja2luZz10cnVlJnVybD0vSW5jQldDNE1tZXRhRy9kb3dubG9hZC9fSkFNTy81OWE5M2JkZTdkZWQ1ZTQxZWRkOGYyYjAvMTE4NjAuMy4yMjQzOTguQVRUR0FHQy1HR0NUQ0FBLmZhc3RxLmd6JyAtYiBjb29raWVzID4gSW5jX0JXLUMtNC1NX21ldGFnLmZhc3RxLnF6CmBgYAoyKSBydW4gRmFzdFFDCipmb3VuZCBvdXQgYWRhcHRlciBpcyBJbGx1bWluYSB1bml2ZXJzYWwgYWRhcHRlcgozKSBydW4gdHJpbW1vbWF0aWMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgb24gYSBzY3JlZW4gb24gZ2Vub2JhY3RlcgoKYGBgCmphdmEgLWphciAvdXNyL3NoYXJlL2phdmEvdHJpbW1vbWF0aWMtMC4zOS5qYXIgU0UgLXRocmVhZHMgNCBNZXRhVC9OYXRpdmUtQlctQy00LU1fbWV0YXQuZmFzdHEuZ3ogTWV0YVQvdHJpbW1lZC9OYXRpdmUtQlctQy00LU1fbWV0YXQudHJpbS5mYXN0cS5neiBJTExVTUlOQUNMSVA6VHJ1U2VxMi1TRS5mYToyOjQwOjE1ICBTTElESU5HV0lORE9XOjQ6MjAKYGBgCgpub3RlOiB1bnN1cmUgaWYgdW5wYWlyZWQsIGJ1dCBvbmx5IDEgZmlsZQoKICAgIHVzZWQgVHJ1U2VxMi1TRSBmb3IgdGltZSBiZWluZwogICAgCiAgICBmb2xsb3dlZCBzdGVwcyBmcm9tIHdvcmtzaG9wCgo0KSBCV0EKCnBvdGVudGlhbGx5IHVzZWZ1bDogaHR0cHM6Ly9naXRodWIuY29tL01jTWFob25MYWIvZ2VvZGVzL2Jsb2IvYzRlMDU2ZmYxZTM0ZDI5YzhmYmQ5ZTJhNzJiMTcwMWZhZjgyYThjOC9iaW9pbmZvcm1hdGljc193b3JrZmxvdy9sYWJfbm90ZWJvb2tzL2xhYm5vdGVib29rXzAybWFwcGluZy5SbWQKYW5vdGhlciBzY3JpcHRpbmcgb3B0aW9uOiBodHRwczovL3B5amlwLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9leGFtcGxlcy9id2EuaHRtbAoKRmlyc3QsIGluZGV4IGdlbm9tZXMgKGNhbiBiZSBmYSBvciBmYXN0YSBmaWxlKQoKYGBgCmJ3YSBpbmRleApgYGAKClJVTiBJTiBUSEUgRk9MTE9XSU5HIElOIEZPTERFUiBXSVRIIElOREVYRUQgR0VOT01FUwoKYGBgCmJ3YSBtZW0gLXQgMTAgMzMwMDAyMDY1MS5mYS42LmZhIE1ldGFUL3RyaW1tZWQvTmF0aXZlLUJXLUMtNC1NX21ldGF0LnRyaW0uZmFzdHEuZ3ogPiBSZXN1bHRzL3NhbS9OYXRpdmUtQlctQy00LU1fbWV0YXRfMzMwMDAyMDY1LmFsaWduZWQuc2FtCmBgYApIZXJlJ3Mgd2hhdCB0aGUgc2FtZSBvdXRwdXQgc2hvdWxkIGxvb2sgbGlrZToKIVtdKGV4cGxhbmF0aW9uLnBuZykKSSBjYW4ndCBzZWVtIHRvIGZpZ3VyZSBvdXQgaG93IHRvIHNwZWNpZnkgZGlmZmVyZW5jdCBjdXRvZmZzLWl0IHNlZW1zIHRoYXQgbWFueSBwZW9wbGUgZWRpdCB0aGUgc2FtIG91dHB1dCB1c2luZyBncmVwIHRvIGdldCB0aGUgcXVhbGl0eSBzY29yZXMgdGhleSB3YW50LgoKNC82LzIwCgpTY3JpcHRpbmcgdGhlIHByb2Nlc3MgZm9yIE5hdGl2ZS1CVy1DLTQtTV9tZXRhdCBhbGlnbm1lbnQgdG8gYWxsIGdlbm9tZXM6CmBgYAoqdGhpcyBkb2Vzbid0IHdvcmssIHVzZSBiZWxvdyoKZm9yIGZpbGUgaW4gYGRpciAtZCAqZmFgIDsgZG8KICAgIGVjaG8gIndvcmtpbmcgd2l0aCBmaWxlICRmaWxlIiAKICAgIGJ3YSBpbmRleCAkZmlsZQogICAgc2FtPS4uL1Jlc3VsdHMvc2FtL05hdGl2ZS1CVy1DLTQtTV9tZXRhdF8kZmlsZS5hbGlnbmVkLnNhbQogICAgYmFtPS4uL1Jlc3VsdHMvYmFtL05hdGl2ZS1CVy1DLTQtTV9tZXRhdF8kZmlsZS5hbGlnbmVkLmJhbQogICAgc29ydGVkX2JhbT0uLi9SZXN1bHRzL3NvcnRlZF9iYW0vTmF0aXZlLUJXLUMtNC1NX21ldGF0XyRmaWxlLmFsaWduZWQuc29ydGVkLmJhbQogICAgYndhIG1lbSAtdCAyMCAkZmlsZSAuLi9NZXRhVC90cmltbWVkL05hdGl2ZS1CVy1DLTQtTV9tZXRhdC50cmltLmZhc3RxLmd6ID4gJHNhbQogICAgc2FtdG9vbHMgdmlldyAtUyAtYiAkc2FtID4gJGJhbSAKICAgIHNhbXRvb2xzIHNvcnQgLW8gJHNvcnRlZF9iYW0gJGJhbQogICAgc2FtdG9vbHMgaW5kZXggJHNvcnRlZF9iYW0KZG9uZQpgYGAgCgpSYW4gdGhlIHNjcmlwdCwgbW9zdGx5IHdvcmtlZCBleGNlcHQgbm9uZSBvZiB0aGUgYmFtIGZpbGVzIHdlcmUgc29ydGVkIGFuZCB0aGVyZWZvcmUgY291bGRuJ3QgYmUgaW5kZXhlZC4KCkVycm9yIG1lc3NhZ2U6CmBgYApbRTo6aHRzX29wZW5dIGZhaWwgdG8gb3BlbiBmaWxlICcuLi9SZXN1bHRzL3NvcnRlZF9iYW0vTmF0aXZlLUJXLUMtNC1NX21ldGF0XzMzMDAwMjA5MTYuZmEuNS5mYS5hbGlnbmVkLnNvcnRlZC5iYW0nCltiYW1fc29ydF9jb3JlXSBmYWlsIHRvIG9wZW4gZmlsZSAuLi9SZXN1bHRzL3NvcnRlZF9iYW0vTmF0aXZlLUJXLUMtNC1NX21ldGF0XzMzMDAwMjA5MTYuZmEuNS5mYS5hbGlnbmVkLnNvcnRlZC5iYW0KW0U6Omh0c19vcGVuXSBmYWlsIHRvIG9wZW4gZmlsZSAnLi4vUmVzdWx0cy9zb3J0ZWRfYmFtL05hdGl2ZS1CVy1DLTQtTV9tZXRhdF8zMzAwMDIwOTE2LmZhLjUuZmEuYWxpZ25lZC5zb3J0ZWQuYmFtJwpgYGAKCkkgYWxzbyBnb3QgYW4gZXJyb3Igd2l0aCBvbmUgb2YgdGhlIGdlbm9tZXMsIGJ1dCB0aGlzIHdhcyB0aGUgb25seSBvbmU6CgpgYGAKd29ya2luZyB3aXRoIGZpbGUgMzMwMDAyMDkxNi5mYS41LmZhCltNOjpid2FfaWR4X2xvYWRfZnJvbV9kaXNrXSByZWFkIDAgQUxUIGNvbnRpZ3MKW006OnByb2Nlc3NdIHJlYWQgMTQwNTg4OCBzZXF1ZW5jZXMgKDIwMDAwMDAyMyBicCkuLi4KW0U6OmJuc19mZXRjaF9zZXFdIGJlZ2luPTcxMDA2NzQsIG1pZD03MTAwNzQ1LCBlbmQ9NjUyMjAyNiwgbGVuPTU3ODY0OCwgc2VxPTB4N2ZkNTZmYjA5MDEwLCByaWQ9NDY2LCBmYXJfYmVnPTY1MTk1MTIsIGZhcl9lbmQ9NjUyMjAyNgpid2E6IGJudHNlcS5jOjQ1MDogYm5zX2ZldGNoX3NlcTogQXNzZXJ0aW9uIGBzZXEgJiYgKmVuZCAtICpiZWcgPT0gbGVuJyBmYWlsZWQuCkFib3J0ZWQgKGNvcmUgZHVtcGVkKQpgYGAgCgo0LzcvMjA6ClRvZGF5IEknZCBsaWtlIHRvCjEpIGZpZ3VyZSBvdXQgd2hhdCBjYXVzZWQgdGhpcyBnZW5vbWUgdG8gZmFpbAoyKSBmaXggd2hhdCdzIHdyb25nIHdpdGggdGhlIHNvcnRlZCBiYW0gc2NyaXB0CgpNb3ZpbmcgZm9yd2FyZCwgSSB3YW50IHRvCiogd3JpdGUgYSBzY3JpcHQgdG8gZG93bmxvYWQgdGhlIHJlbWFpbmluZyBNZXRhVCBmaWxlcyBPUiB1c2UgU1JBIHRvb2xraXQKCjEpIExvb2tpbmcgb25saW5lLCBpdCBzZWVtcyB0byBiZSBhbiBpbmRleGluZyBlcnJvci4gSSByZXJhbiB0aGUgaW5kZXggYW5kIHJhbiBid2EgbWVtIGFnYWluLCBhbmQgaXQgc2VlbXMgdG8gYmUgd29ya2luZy4gTWFrZSBzdXJlIHRvIGNvbnZlcnQgdG8gYmFtLgoKMikgVHVybnMgb3V0IHRoZSBjb2RlIGZyb20gRGF0YUNhcnBlbnRyeSB3YXMgZm9yIGEgZGlmZmVyZW50IHZlcnNpb24gb2Ygc2FtdG9vbHMgSSB0aGluayAtIHRoZSBzeW50YXggd2FzIHdyb25nLiBOb3cgc2FtdG9vbHMgc2hvdWxkIHJ1biBhcyBzYW10b29scyBzb3J0IC1vIElOUFVUIE9VVFBVVC4gVW5zdXJlIHdoeSB0aGlzIHdvcmtzIGJ1dCBpdCBkaWQuCgpORVcgU0NSSVBULCBzaG91bGQgd29yazoKYGBgCmZvciBmaWxlIGluIGBkaXIgLWQgKmZhYCA7IGRvCiAgICBlY2hvICJ3b3JraW5nIHdpdGggZmlsZSAkZmlsZSIgCiAgICBid2EgaW5kZXggJGZpbGUKICAgIHNhbT0uLi9SZXN1bHRzL3NhbS9JbmNfQlctQy00LU1fbWV0YWdfJGZpbGUuYWxpZ25lZC5zYW0KICAgIHNvcnRlZF9iYW09Li4vUmVzdWx0cy9zb3J0ZWRfYmFtL0luY19CVy1DLTQtTV9tZXRhZ18kZmlsZS5hbGlnbmVkLnNvcnRlZC5iYW0KICAgIGJ3YSBtZW0gLXQgNDAgJGZpbGUgLi4vTWV0YUcvdHJpbW1lZC9JbmNfQlctQy00LU1fbWV0YWcudHJpbS5mYXN0cS5xeiA+ICRzYW0KICAgIGVjaG8gIm5vdyBjb252ZXJ0aW5nIHNhbSB0byBzb3J0ZWQgYmFtICRmaWxlIgogICAgc2FtdG9vbHMgc29ydCAtTyBiYW0gLVQgdG1wIC1AIDQwICRzYW0gPiAkc29ydGVkX2JhbSAKICAgIGVjaG8gIm5vdyBpbmRleGluZyBzb3J0ZWQgYmFtICRmaWxlIgogICAgc2FtdG9vbHMgaW5kZXggJHNvcnRlZF9iYW0KZG9uZQpgYGAgCgpGb3Igbm93LCBzb3J0IGFsbCBiYW1zLgoKSW4gYmFtIGRpcmVjdG9yeToKYGBgCmZvciBmaWxlIGluIGBkaXIgLWQgKmJhbWAgOyBkbwogICAgc29ydGVkX2JhbT1gZWNobyAiJGZpbGUiIHwgc2VkICdzLy5iYW0vLnNvcnRlZC5iYW0vJ2A7ICAgCiAgICBlY2hvICJ3b3JraW5nIHdpdGggJGZpbGUiCiAgICBzYW10b29scyBzb3J0IC1PIGJhbSAtVCB0bXAgJGZpbGUgPiAuLi9zb3J0ZWRfYmFtLyRzb3J0ZWRfYmFtOyAgICAgCmRvbmUKYGBgClRoZW4gaW5kZXggaW4gc29ydGVkX2JhbSBkaXJlY3Rvcnk6CmBgYApmb3IgZmlsZSBpbiBgZGlyIC1kICpiYW1gIDsgZG8KICAgIGVjaG8gIndvcmtpbmcgd2l0aCAkZmlsZSIKICAgIHNhbXRvb2xzIGluZGV4ICRmaWxlICAgICAKZG9uZQpgYGAKNC8xMy8yMApJbmRleGluZyB3b3JrZWQsIHNvIHdlJ3JlIHRocm91Z2ggdGhhdCBwYXJ0IG9mIHRoZSB3b3JrZmxvdy4KClN0aWxsIGRvbid0IGtub3cgd2hhdCB0aGUgbWF4IG1hcHEgc2NvcmUgaXMgKDM3IHZzIDQyKSwgYnV0IGhhdmUgZmlndXJlZCBvdXQgdGhhdCBmb3IgQldBIHRoZSBjYWxjdWxhdGlvbiBpcyAtMTAgbG9nKFByKSAoaHR0cHM6Ly9zZXF1ZW5jaW5nLnFjZmFpbC5jb20vYXJ0aWNsZXMvbWFwcS12YWx1ZXMtYXJlLXJlYWxseS11c2VmdWwtYnV0LXRoZWlyLWltcGxlbWVudGF0aW9uLWlzLWEtbWVzcy8pLgpUaGVyZm9yZSwgYSBzY29yZSBvZiAyMCBoYXMgYSAxJSBwcm9iYWJpbGl0eSBvZiBiZWluZyBtaXNtYXRjaGVkLgoKVGhlcmUncyBhIHByb2dyYW0gY2FsbGVkIEJBTVFDIHdoaWNoIHBsb3RzIHRoZSBxdWFsaXR5IHNjb3Jlcywgd2hpY2ggbWF5IGJlIHVzZWZ1bCBzbyBJIGNhbiBzZWUgd2hhdCBraW5kIG9mIHNjb3JlcyBJJ20gZ2V0dGluZy4gSXQncyBub3Qgb24gZ2Vub2JhY3RlciBvciBNR0hQQ0Mgc28gSSBjb3VsZCBkb3dubG9hZCBpZiBJIHJlYWxseSBuZWVkIGl0LgoKTG9va2luZyBhdCB0aGUgc2FtIGZpbGVzIEkgZ290IHNvIGZhciwgdGhlcmUgc2VlbSB0byBiZSBmZXcgbWF0Y2hlcywgc28gYSBsb3Qgb2YgbWFwcSBzY29yZXMgb2YgMC4KSSBhbHNvIGZpZ3VyZWQgb3V0IHdoYXQgdGhlIG1vc3QgY29tbW9uIGZsYWdzIHdlcmU6CgpmbGFnIDQ6IHVubWFwcGVkCmZsYWcgMDogZndkIHN0cmFuZApmbGFnIDE2OiByZXZlcnNlIHN0cmFuZAoKSSBmb3VuZCBhIGxpc3Qgb2Ygc2FtdG9vbHMgY29tbWFuZHMgd2hpY2ggYXJlIHVzZWZ1bDoKaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vZGF2ZnJlLzg1OTYxNTkKCk1vc3QgdXNlZnVsOgpOdW1iZXIgb2YgcmVhZHM6CmBgYApzYW10b29scyB2aWV3IC1jIGZpbGUuYmFtCmBgYAoKU3RhdHM6CmBgYApzYW10b29scyBmbGFnc3RhdCBmaWxlbmFtZS5iYW0KYGBgCkV4YW1wbGUgb3V0cHV0OgoxMzcxMzY1MzAgKyAwIGluIHRvdGFsIChRQy1wYXNzZWQgcmVhZHMgKyBRQy1mYWlsZWQgcmVhZHMpCjAgKyAwIHNlY29uZGFyeQoxODk4ICsgMCBzdXBwbGVtZW50YXJ5CjAgKyAwIGR1cGxpY2F0ZXMKNjAzNTE4ICsgMCBtYXBwZWQgKDAuNDQlOi1uYW4lKQowICsgMCBwYWlyZWQgaW4gc2VxdWVuY2luZwowICsgMCByZWFkMQowICsgMCByZWFkMgowICsgMCBwcm9wZXJseSBwYWlyZWQgKC1uYW4lOi1uYW4lKQowICsgMCB3aXRoIGl0c2VsZiBhbmQgbWF0ZSBtYXBwZWQKMCArIDAgc2luZ2xldG9ucyAoLW5hbiU6LW5hbiUpCjAgKyAwIHdpdGggbWF0ZSBtYXBwZWQgdG8gYSBkaWZmZXJlbnQgY2hyCjAgKyAwIHdpdGggbWF0ZSBtYXBwZWQgdG8gYSBkaWZmZXJlbnQgY2hyIChtYXBRPj01KQoKU3VwcGxlbWVudGFyeSBtZWFucyBjaGltZXJpYy9ub24tbGluZWFyIGFsaWdubWVudAoKT3V0cHV0IG9ubHkgbWFwcGVkIHJlYWRzOgpgYGAKc2FtdG9vbHMgdmlldyAtRiAweDA0IC1iIGluLmJhbSA+IG91dC5hbGlnbmVkLmJhbQpgYGAKCk1pbmltdW0gYWxpZ25tZW50IHF1YWxpdHkgKGluIHRoaXMgZXhhbXBsZSwgbWFwcT49MzAgc28gcHJvYmFiaWxpdHkgLjElPykKYGBgCnNhbXRvb2xzIHZpZXcgLXEgMzAgLWIgaW4uYmFtID4gYWxpZ25lZF9yZWFkcy5xMzAuYmFtCnNhbXRvb2xzIHZpZXcgLXEgMzAgLWMgaW4uYmFtICN0byBjb3VudCBhbGlnbm1lbnRzIHdpdGggc2NvcmUgPjMwCmBgYAoKRGlmZmVyZW50IG1hcHEgbGV2ZWxzIHRvIHRyeToKOTkuOSUgb3IgbWFwcSBvZiAzMAo5OSUgb3IgbWFwcSBvZiAyMAo5NyUgb3IgbWFwcSBvZiAxNQo5NSUgb3IgbWFwcSBvZiAxMwoKNC8xNi8yMDoKCkFsbCBnZW5vbWVzIGFuZCByZWFkcyBzdW1tYXJ5OgoKYGBgCnBhcmFsbGVsIC0tdGFnIHNhbXRvb2xzIHZpZXcgLWMgIDo6OiAqLmJhbSA+IHJlYWRzLmNzdgpgYGAKClRvbW9ycm93OgpkbyB0aGUgd2hvbGUgcGlwZWxpbmUgd2l0aCB0aGUgbWV0YUcgZmlsZQoKY2FuIGkgYWRqdXN0IHNhbXRvb2wgdGhyZWFkcz8KCjQvMTgvMjA6CkFkanVzdCBzYW0gdG9vbHMgdGhyZWFkcyB3aXRoIEAKClJhbiBvdXQgb2Ygc3BhY2UsIHRyeWluZyB0byBjb252ZXJ0IGFsbCBzYW1zIHRvIHNvcnRlZCBiYW1zIChkZWxldGluZyBhbGwgYmFtcyB0byBzZWN1cmUgc3BhY2UpCmBgYApmb3IgZmlsZSBpbiBgZGlyIC1kICpzYW1gIDsgZG8KICAgIGVjaG8gIndvcmtpbmcgd2l0aCBmaWxlICRmaWxlIiAKICAgIHNvcnRlZF9iYW09Li4vc29ydGVkX2JhbS8kZmlsZS5zb3J0ZWQuYmFtCiAgICBzYW10b29scyBzb3J0IC1PIGJhbSAtVCB0bXAgLUAgNDAgJGZpbGUgPiAkc29ydGVkX2JhbSAKICAgIGVjaG8gIm5vdyBpbmRleGluZyBzb3J0ZWQgYmFtICRzb3J0ZWRfYmFtIgogICAgc2FtdG9vbHMgaW5kZXggJHNvcnRlZF9iYW0KZG9uZQpgYGAKCjQvMjgvMjAKCkZvciBzb21lIHJlYXNvbiB0aGUgYmFtcyBhcmUgZW1wdHkuIEkgdGhpbmsgSSdtIGp1c3QgZ29pbmcgdG8gcmVydW4gZXZlcnl0aGluZzoKYGBgCmZvciBmaWxlIGluIGBkaXIgLWQgKmZhYCA7IGRvCiAgICBlY2hvICJ3b3JraW5nIHdpdGggZmlsZSAkZmlsZSIgCiAgICBzb3J0ZWRfYmFtPS4uL1Jlc3VsdHMvc29ydGVkX2JhbS9OYXRpdmUtQlctQy00LU1fbWV0YXQvTmF0aXZlLUJXLUMtNC1NX21ldGF0XyRmaWxlLnNvcnRlZC5iYW0KICAgIGJ3YSBtZW0gLXQgNjAgJGZpbGUgLi4vTWV0YVQvdHJpbW1lZC9OYXRpdmUtQlctQy00LU1fbWV0YXQudHJpbS5mYXN0cS5neiB8IHNhbXRvb2xzIHNvcnQgLU8gYmFtIC1UIHRtcCAtQCA2MCA+ICRzb3J0ZWRfYmFtCiAgICBlY2hvICJub3cgaW5kZXhpbmcgc29ydGVkIGJhbSAkZmlsZSIKICAgIHNhbXRvb2xzIGluZGV4ICRzb3J0ZWRfYmFtCmRvbmUKYGBgCgpHZXQgMyBxdWFsaXR5IGZpbGVzIGZvciBhbGwgYmFtczoKCmBgYApDSEVDSyBCRUZPUkUgVVNJTkcKZm9yIGZpbGUgaW4gYGRpciAtZCAqLnNvcnRlZC5iYW1gIDsgZG8KICBlY2hvICJ3b3JraW5nIHdpdGggZmlsZSAkZmlsZSIKICBxMzA9YGVjaG8gIiRmaWxlIiB8IHNlZCAncy8uc29ydGVkLmJhbS8ucTMwLnNvcnRlZC5iYW0vJ2AKICBxMjA9YGVjaG8gIiRmaWxlIiB8IHNlZCAncy8uc29ydGVkLmJhbS8ucTIwLnNvcnRlZC5iYW0vJ2AKICBxMTU9YGVjaG8gIiRmaWxlIiB8IHNlZCAncy8uc29ydGVkLmJhbS8ucTE1LnNvcnRlZC5iYW0vJ2AKICBzYW10b29scyB2aWV3IC1xIDMwIC1iICRmaWxlID4gJHEzMAogIHNhbXRvb2xzIHZpZXcgLXEgMjAgLWIgJGZpbGUgPiAkcTIwCiAgc2FtdG9vbHMgdmlldyAtcSAxNSAtYiAkZmlsZSA+ICRxMTUKZG9uZQpgYGAKCkdldCBhbGwgcmVhZHMKUmVwZWF0IGZvciBhbGwgb3RoZXIgZmlsZXM/Cgo1LzMvMjAKRG93bmxvYWRlZCBhbGwgZmlsZXMsIG5vdyB0cmltIHRoZW0gYWxsOgoKYGBgCmZvciBmaWxlIGluIGBkaXIgLWQgKi5mYXN0cS5nemAgOyBkbwogIGVjaG8gIndvcmtpbmcgd2l0aCBmaWxlICRmaWxlIgogIHRyaW09YGVjaG8gIiRmaWxlIiB8IHNlZCAncy8uZmFzdHEuZ3ovLnRyaW0uZmFzdHEuZ3ovJ2AKamF2YSAtamFyIC91c3Ivc2hhcmUvamF2YS90cmltbW9tYXRpYy0wLjM5LmphciBTRSAtdGhyZWFkcyA0MCAkZmlsZSAuL1RyaW0vJHRyaW0gSUxMVU1JTkFDTElQOi4uL1RydVNlcTItU0UuZmE6Mjo0MDoxNSAgU0xJRElOR1dJTkRPVzo0OjIwCmRvbmUKYGBgCgpUaGVuIG1hcCBhbmQgc29ydAoKYGBgCmZvciBnZW5vbWUgaW4gYGRpciAtZCAqZmFgIDsgZG8KICBmb3IgbWV0YSBpbiAuLi9NZXRhVC8qLnRyaW0uZmFzdHEuZ3ogOyBkbwogICAgZWNobyAid29ya2luZyB3aXRoIGdlbm9tZSAkZ2Vub21lIGFuZCBtZXRhdCAkbWV0YSIgCiAgICBmaWxlPWBlY2hvICIkbWV0YSIgfCBzZWQgJ3MvLmZhc3RxLmd6Ly8nIHwgc2VkICdzLy4uXC9NZXRhVFwvLy8nYAogICAgZWNobyAiJGZpbGUiCiAgICBzb3J0ZWRfYmFtPS4uLy4uLy4uL0JIRDEvQXJpYW5uYS9SZXN1bHRzLyRmaWxlLiRnZW5vbWUuc29ydGVkLmJhbQogICAgZWNobyAiJHNvcnRlZF9iYW0iCiAgICBid2EgbWVtIC10IDYwICRnZW5vbWUgJG1ldGEgfCBzYW10b29scyBzb3J0IC1PIGJhbSAtVCB0bXAgLUAgNjAgPiAkc29ydGVkX2JhbQogICAgZWNobyAibm93IGluZGV4aW5nIHNvcnRlZCBiYW0gJHNvcnRlZF9iYW0iCiAgICBzYW10b29scyBpbmRleCAkc29ydGVkX2JhbQogIGRvbmUKZG9uZQpgYGAKCgo=