1. References and resources

Reference

PLoS One. 2013;8(3):e59582. doi: 10.1371/journal.pone.0059582.

Machine

AWS r5.2xlarge and CentOS linux 7 on a Virtual Machine

2. Obtain and/process analysis datsets

Make directories

~/data/rnaseq/Rn/PLoS-One-8-e59582$ ls -l

drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 10 02:48 f344_pfc_nicotine

drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 10 03:28 f344_pfc_saline

Convert sra files to fastq files

f344_pfc_nicotine$ fastq-dump –split-3 SRR869032.sra –gzip

f344_pfc_nicotine$ fastq-dump –split-3 SRR869033.sra –gzip

f344_pfc_nicotine$ fastq-dump –split-3 SRR869034.sra –gzip

PLoS-One-8-e59582$ ls -l f344_pfc_nicotine/

-rw-rw-r– 1 ubuntu ubuntu 1918376826 Apr 7 13:08 SRR869032.sra

-rw-rw-r– 1 ubuntu ubuntu 1512702873 Apr 10 03:07 SRR869032_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 1565027421 Apr 10 03:07 SRR869032_2.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 1989086241 Apr 7 13:09 SRR869033.sra

-rw-rw-r– 1 ubuntu ubuntu 1559510818 Apr 10 03:11 SRR869033_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 1612258618 Apr 10 03:11 SRR869033_2.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 1978327667 Apr 7 13:10 SRR869034.sra

-rw-rw-r– 1 ubuntu ubuntu 1568979784 Apr 10 03:12 SRR869034_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 1615385331 Apr 10 03:12 SRR869034_2.fastq.gz

Download sra files (control/saline exposed rat PFC) to f344_pfc_saline directory

f344_pfc_saline$ fastq-dump –split-3 SRR869044.sra –gzip

f344_pfc_saline$ fastq-dump –split-3 SRR869045.sra –gzip

f344_pfc_saline$ fastq-dump –split-3 SRR869046.sra –gzip

PLoS-One-8-e59582$ ls -l f344_pfc_saline/

-rw-rw-r– 1 ubuntu ubuntu 2681330074 Apr 7 12:59 SRR869044.sra

-rw-rw-r– 1 ubuntu ubuntu 2119745955 Apr 10 03:10 SRR869044_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 2202580482 Apr 10 03:10 SRR869044_2.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 2709383194 Apr 7 13:01 SRR869045.sra

-rw-rw-r– 1 ubuntu ubuntu 2103892097 Apr 10 03:12 SRR869045_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 2198363062 Apr 10 03:12 SRR869045_2.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 2614023328 Apr 7 13:02 SRR869046.sra

-rw-rw-r– 1 ubuntu ubuntu 2054942375 Apr 10 03:13 SRR869046_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 2138446269 Apr 10 03:13 SRR869046_2.fastq.gz

3. Obtain, process and/or build genome, reference and index datasets

Download the genome file and index it

samtools faidx rn6.fa

rn6$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 2927607333 Apr 9 19:26 rn6.fa

-rw-rw-r– 1 ubuntu ubuntu 40654 Apr 9 19:26 rn6.fa.fai

Download the refGene file and convert it to a GTF file

gunzip refGene.txt.gz

cut -f 2- refGene.txt > refGene.input

genePredToGtf file refGene.input refGene.gtf

genome_rat$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 61891341 Apr 9 19:27 refGene.gtf

-rw-rw-r– 1 ubuntu ubuntu 5143380 Apr 9 19:27 refGene.input

-rw-rw-r– 1 ubuntu ubuntu 5226507 Apr 9 19:27 refGene.txt

4. Build a STAR index for the rat geneome

$ STAR --runThreadN 16 --runMode genomeGenerate --genomeDir StarIndexRat/ --genomeFastaFiles rn6/rn6.fa

Apr 09 18:39:04 ….. started STAR run

Apr 09 18:39:04 … starting to generate Genome files

Apr 09 18:40:18 … starting to sort Suffix Array. This may take a long time…

Apr 09 18:40:32 … sorting Suffix Array chunks and saving them to disk…

Apr 09 19:05:33 … loading chunks from disk, packing SA…

Apr 09 19:06:42 … finished generating suffix array

Apr 09 19:06:42 … generating Suffix Array index

Apr 09 19:10:57 … completed Suffix Array index

Apr 09 19:10:57 … writing Genome to disk …

Apr 09 19:10:59 … writing Suffix Array to disk …

Apr 09 19:12:19 … writing SAindex to disk

Apr 09 19:12:27 ….. finished successfully

StarIndexRat$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 3095134208 Apr 9 19:10 Genome

-rw-rw-r– 1 ubuntu ubuntu 22521351645 Apr 9 19:12 SA

-rw-rw-r– 1 ubuntu ubuntu 1565873619 Apr 9 19:12 SAindex

-rw-rw-r– 1 ubuntu ubuntu 5213 Apr 9 18:40 chrLength.txt

-rw-rw-r– 1 ubuntu ubuntu 19347 Apr 9 18:40 chrName.txt

-rw-rw-r– 1 ubuntu ubuntu 24560 Apr 9 18:40 chrNameLength.txt

-rw-rw-r– 1 ubuntu ubuntu 10387 Apr 9 18:40 chrStart.txt

-rw-rw-r– 1 ubuntu ubuntu 479 Apr 9 19:10 genomeParameters.txt

5. Align the fastq.gz files to obtain BAM files

 ~/results/rnaseq/Rn/star_rat$ STAR 
 
 --runThreadN 12 
 
 --genomeDir StarIndexRat/ 
 
 --sjdbGTFfile ~/genome_rat/refGene.gtf 
 
 --sjdbOverhang 100 
 
 --readFilesIn ~/PLoS-One-8-e59582/f344_pfc_saline/SRR869044_1.fastq.gz
 
 ~/PLoS-One-8-e59582/f344_pfc_saline/SRR869044_2.fastq.gz 
 
 --readFilesCommand zcat 
 
 --quantMode TranscriptomeSAM 
 
 --outFileNamePrefix 1align/
 

Apr 10 03:30:30 ….. started STAR run

Apr 10 03:30:30 ….. loading genome

Apr 10 03:32:39 ….. processing annotations GTF

Apr 10 03:32:43 ….. inserting junctions into the genome indices

Apr 10 03:37:23 ….. started mapping

Apr 10 03:42:29 ….. finished successfully

$ ls -l 1align/

-rw-rw-r– 1 ubuntu ubuntu 15933444986 Apr 10 03:42 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 2358643579 Apr 10 03:42 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1862 Apr 10 03:42 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 272935 Apr 10 03:42 Log.out

-rw-rw-r– 1 ubuntu ubuntu 836 Apr 10 03:42 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 7368886 Apr 10 03:42 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 10 03:32 _STARgenome

$ cat 1align/Log.final.out

                                 Started job on |   Apr 10 03:30:30
                             Started mapping on |   Apr 10 03:37:23
                                    Finished on |   Apr 10 03:42:29
       Mapping speed, Million of reads per hour |   489.23

                          Number of input reads |   41584891
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   34796331
                        Uniquely mapped reads % |   83.68%
                          Average mapped length |   99.37
                       Number of splices: Total |   7910199
            Number of splices: Annotated (sjdb) |   7194940
                       Number of splices: GT/AG |   7764677
                       Number of splices: GC/AG |   62004
                       Number of splices: AT/AC |   7634
               Number of splices: Non-canonical |   75884
                      Mismatch rate per base, % |   0.37%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.61
                        Insertion rate per base |   0.00%
                       Insertion average length |   1.35
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   2553852
             % of reads mapped to multiple loci |   6.14%
        Number of reads mapped to too many loci |   57308
             % of reads mapped to too many loci |   0.14%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   9.92%
                     % of reads unmapped: other |   0.13%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%
~/results/rnaseq/Rn/star_rat/transcriptomeOut$ STAR --runThreadN 12 --genomeDir ~/genomeAndIndices/Rn/star/ --sjdbGTFfile ~/genomeAndIndices/Rn/rn6.refGene.gtf --sjdbOverhang 100 --readFilesIn ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_saline/SRR869045_1.fastq.gz ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_saline/SRR869045_2.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 2align/

Apr 11 15:08:19 ….. started STAR run

Apr 11 15:08:20 ….. loading genome

Apr 11 15:12:01 ….. processing annotations GTF

Apr 11 15:12:25 ….. inserting junctions into the genome indices

Apr 11 15:37:46 ….. started mapping

Apr 11 15:58:54 ….. finished successfully

$ ls -l 2align/

-rw-rw-r– 1 ubuntu ubuntu 14869436644 Apr 11 15:58 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 2216166668 Apr 11 15:58 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1863 Apr 11 15:58 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 290971 Apr 11 15:58 Log.out

-rw-rw-r– 1 ubuntu ubuntu 2488 Apr 11 15:58 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 7278953 Apr 11 15:58 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 11 15:12 _STARgenome

$ cat 2align/Log.final.out

                                 Started job on |   Apr 11 15:08:19
                             Started mapping on |   Apr 11 15:37:46
                                    Finished on |   Apr 11 15:58:54
       Mapping speed, Million of reads per hour |   116.02

                          Number of input reads |   40866035
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   32594115
                        Uniquely mapped reads % |   79.76%
                          Average mapped length |   99.35
                       Number of splices: Total |   7372181
            Number of splices: Annotated (sjdb) |   6695155
                       Number of splices: GT/AG |   7235135
                       Number of splices: GC/AG |   58523
                       Number of splices: AT/AC |   6995
               Number of splices: Non-canonical |   71528
                      Mismatch rate per base, % |   0.38%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.61
                        Insertion rate per base |   0.01%
                       Insertion average length |   1.35
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   2353903
             % of reads mapped to multiple loci |   5.76%
        Number of reads mapped to too many loci |   52876
             % of reads mapped to too many loci |   0.13%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   14.23%
                     % of reads unmapped: other |   0.12%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%

~/results/rnaseq/Rn/star_rat/transcriptomeOut$ STAR --runThreadN 12 --genomeDir ~/genomeAndIndices/Rn/star/ --sjdbGTFfile ~/genomeAndIndices/Rn/rn6.refGene.gtf --sjdbOverhang 100 --readFilesIn ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_saline/SRR869046_1.fastq.gz ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_saline/SRR869046_2.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 3align/

Apr 11 16:00:52 ….. started STAR run

Apr 11 16:00:52 ….. loading genome

Apr 11 16:02:35 ….. processing annotations GTF

Apr 11 16:02:37 ….. inserting junctions into the genome indices

Apr 11 16:05:23 ….. started mapping

Apr 11 16:11:29 ….. finished successfully

$ ls -l 3align/

-rw-rw-r– 1 ubuntu ubuntu 14998319245 Apr 11 16:11 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 2183814631 Apr 11 16:11 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1863 Apr 11 16:11 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 290970 Apr 11 16:11 Log.out

-rw-rw-r– 1 ubuntu ubuntu 954 Apr 11 16:11 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 7220923 Apr 11 16:11 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 11 16:02 _STARgenome

$ cat 3align/Log.final.out

                                 Started job on |   Apr 11 16:00:52
                             Started mapping on |   Apr 11 16:05:23
                                    Finished on |   Apr 11 16:11:29
       Mapping speed, Million of reads per hour |   387.26

                          Number of input reads |   39370935
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   32717958
                        Uniquely mapped reads % |   83.10%
                          Average mapped length |   99.35
                       Number of splices: Total |   7102328
            Number of splices: Annotated (sjdb) |   6458206
                       Number of splices: GT/AG |   6971391
                       Number of splices: GC/AG |   55634
                       Number of splices: AT/AC |   6999
               Number of splices: Non-canonical |   68304
                      Mismatch rate per base, % |   0.40%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.61
                        Insertion rate per base |   0.01%
                       Insertion average length |   1.35
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   2462309
             % of reads mapped to multiple loci |   6.25%
        Number of reads mapped to too many loci |   51917
             % of reads mapped to too many loci |   0.13%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   10.38%
                     % of reads unmapped: other |   0.13%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%
~/results/rnaseq/Rn/star_rat/transcriptomeOut$ STAR --runThreadN 12 --genomeDir ~/genomeAndIndices/Rn/star/ --sjdbGTFfile ~/genomeAndIndices/Rn/rn6.refGene.gtf --sjdbOverhang 100 --readFilesIn ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869032_1.fastq.gz ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869032_2.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 4align/

Apr 11 16:21:26 ….. started STAR run

Apr 11 16:21:26 ….. loading genome

Apr 11 16:23:09 ….. processing annotations GTF

Apr 11 16:23:10 ….. inserting junctions into the genome indices

Apr 11 16:25:24 ….. started mapping

Apr 11 16:28:58 ….. finished successfully

$ ls -l 4align/

-rw-rw-r– 1 ubuntu ubuntu 10933116395 Apr 11 16:28 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 1617775311 Apr 11 16:28 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1863 Apr 11 16:28 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 291006 Apr 11 16:28 Log.out

-rw-rw-r– 1 ubuntu ubuntu 600 Apr 11 16:28 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 6778075 Apr 11 16:28 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 11 16:23 _STARgenome

$ cat 4align/Log.final.out

                                 Started job on |   Apr 11 16:21:26
                             Started mapping on |   Apr 11 16:25:24
                                    Finished on |   Apr 11 16:28:58
       Mapping speed, Million of reads per hour |   486.66

                          Number of input reads |   28929485
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   23884850
                        Uniquely mapped reads % |   82.56%
                          Average mapped length |   99.37
                       Number of splices: Total |   5337591
            Number of splices: Annotated (sjdb) |   4843698
                       Number of splices: GT/AG |   5237284
                       Number of splices: GC/AG |   42360
                       Number of splices: AT/AC |   5126
               Number of splices: Non-canonical |   52821
                      Mismatch rate per base, % |   0.38%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.61
                        Insertion rate per base |   0.01%
                       Insertion average length |   1.35
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   1745210
             % of reads mapped to multiple loci |   6.03%
        Number of reads mapped to too many loci |   41759
             % of reads mapped to too many loci |   0.14%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   11.13%
                     % of reads unmapped: other |   0.14%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%
~/results/rnaseq/Rn/star_rat/transcriptomeOut$ STAR --runThreadN 12 --genomeDir ~/genomeAndIndices/Rn/star/ --sjdbGTFfile ~/genomeAndIndices/Rn/rn6.refGene.gtf --sjdbOverhang 100 --readFilesIn ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869033_1.fastq.gz ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869033_2.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 5align/

Apr 11 16:32:44 ….. started STAR run

Apr 11 16:32:44 ….. loading genome

Apr 11 16:34:26 ….. processing annotations GTF

Apr 11 16:34:28 ….. inserting junctions into the genome indices

Apr 11 16:36:40 ….. started mapping

Apr 11 16:40:24 ….. finished successfully

$ ls -l 5align/

-rw-rw-r– 1 ubuntu ubuntu 11152871716 Apr 11 16:40 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 1650315098 Apr 11 16:40 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1863 Apr 11 16:40 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 291006 Apr 11 16:40 Log.out

-rw-rw-r– 1 ubuntu ubuntu 600 Apr 11 16:40 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 6943028 Apr 11 16:40 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 11 16:34 _STARgenome

$ cat 5align/Log.final.out

                                 Started job on |   Apr 11 16:32:44
                             Started mapping on |   Apr 11 16:36:40
                                    Finished on |   Apr 11 16:40:24
       Mapping speed, Million of reads per hour |   483.07

                          Number of input reads |   30057458
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   24242026
                        Uniquely mapped reads % |   80.65%
                          Average mapped length |   99.39
                       Number of splices: Total |   5464310
            Number of splices: Annotated (sjdb) |   4969845
                       Number of splices: GT/AG |   5365023
                       Number of splices: GC/AG |   42481
                       Number of splices: AT/AC |   5178
               Number of splices: Non-canonical |   51628
                      Mismatch rate per base, % |   0.37%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.60
                        Insertion rate per base |   0.00%
                       Insertion average length |   1.36
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   1816245
             % of reads mapped to multiple loci |   6.04%
        Number of reads mapped to too many loci |   44886
             % of reads mapped to too many loci |   0.15%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   13.03%
                     % of reads unmapped: other |   0.13%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%

~/results/rnaseq/Rn/star_rat/transcriptomeOut$ STAR --runThreadN 12 --genomeDir ~/genomeAndIndices/Rn/star/ --sjdbGTFfile ~/genomeAndIndices/Rn/rn6.refGene.gtf --sjdbOverhang 100 --readFilesIn ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869034_1.fastq.gz ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869034_2.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 6align/

Apr 11 16:41:46 ….. started STAR run

Apr 11 16:41:46 ….. loading genome

Apr 11 16:42:54 ….. processing annotations GTF

Apr 11 16:42:55 ….. inserting junctions into the genome indices

Apr 11 16:45:08 ….. started mapping

Apr 11 16:48:49 ….. finished successfully

$ ls -l 6align/

-rw-rw-r– 1 ubuntu ubuntu 11451915825 Apr 11 16:48 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 1719135420 Apr 11 16:48 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1862 Apr 11 16:48 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 291006 Apr 11 16:48 Log.out

-rw-rw-r– 1 ubuntu ubuntu 600 Apr 11 16:48 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 6840437 Apr 11 16:48 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 11 16:42 _STARgenome

$ cat 6align/Log.final.out

                                 Started job on |   Apr 11 16:41:46
                             Started mapping on |   Apr 11 16:45:08
                                    Finished on |   Apr 11 16:48:49
       Mapping speed, Million of reads per hour |   485.67

                          Number of input reads |   29814687
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   25029582
                        Uniquely mapped reads % |   83.95%
                          Average mapped length |   99.40
                       Number of splices: Total |   5664801
            Number of splices: Annotated (sjdb) |   5152217
                       Number of splices: GT/AG |   5560246
                       Number of splices: GC/AG |   44589
                       Number of splices: AT/AC |   5504
               Number of splices: Non-canonical |   54462
                      Mismatch rate per base, % |   0.38%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.61
                        Insertion rate per base |   0.00%
                       Insertion average length |   1.36
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   1834753
             % of reads mapped to multiple loci |   6.15%
        Number of reads mapped to too many loci |   40924
             % of reads mapped to too many loci |   0.14%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   9.63%
                     % of reads unmapped: other |   0.13%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%

6. RSEM analysis

Download the data

BAM files were imported to CentOS as directories (1s, 2s, 3s, 4s, 5s and 6s) for RSEM analysis. The genome and GTF files are were also imported (& also renamed).

$ ls -l

drwxr-xr-x. 2 bdash bdash 45 Apr 11 20:17 1s

drwxr-xr-x. 2 bdash bdash 45 Apr 11 18:21 2s

drwxr-xr-x. 2 bdash bdash 45 Apr 11 20:20 3s

drwxr-xr-x. 2 bdash bdash 45 Apr 11 20:21 4s

drwxr-xr-x. 2 bdash bdash 45 Apr 11 20:27 5s

drwxr-xr-x. 2 bdash bdash 45 Apr 11 20:27 6s

-rw-rw-r–. 1 bdash bdash 2927607333 Apr 9 15:26 rn6.fa

-rw-rw-r–. 1 bdash bdash 40654 Apr 9 15:26 rn6.fa.fai

-rw-rw-r–. 1 bdash bdash 61891341 Apr 9 15:27 rn6.refGene.gtf

Prepare RSEM reference (will use both the fa and gtf file)

mkdir rsem_ref

cd rsem_ref

rsem_ref$ rsem-prepare-reference –gtf rn6.refGene.gtf rn6.fa ./rsemRef


rsem-extract-reference-transcripts ./rsemRef 0 rn6.refGene.gtf None 0 rn6.fa

Parsed 200000 lines

Parsing gtf File is done!

rn6.fa is processed!

18939 transcripts are extracted and 0 transcripts are omitted.

Extracting sequences is done!

Group File is generated!

Transcript Information File is generated!

Chromosome List File is generated!

Extracted Sequences File is generated!

rsem-preref ./rsemRef.transcripts.fa 1 ./rsemRef

Refs.makeRefs finished!

Refs.saveRefs finished!

./rsemRef.idx.fa is generated!

./rsemRef.n2g.idx.fa is generated!

star-transcriptomeout$ ls -l rsem_ref/

-rw-rw-r–. 1 bdash bdash 1293 Apr 11 21:06 rsemRef.chrlist

-rw-rw-r–. 1 bdash bdash 93718 Apr 11 21:06 rsemRef.grp

-rw-rw-r–. 1 bdash bdash 43007289 Apr 11 21:06 rsemRef.idx.fa

-rw-rw-r–. 1 bdash bdash 43007289 Apr 11 21:06 rsemRef.n2g.idx.fa

-rw-rw-r–. 1 bdash bdash 45858412 Apr 11 21:06 rsemRef.seq

-rw-rw-r–. 1 bdash bdash 6041108 Apr 11 21:06 rsemRef.ti

-rw-rw-r–. 1 bdash bdash 43007289 Apr 11 21:06 rsemRef.transcripts.fa

RSEM-calculate-expression

star-transcriptomeout$ rsem-calculate-expression –bam –no-bam-output -p 12 –paired-end –forward-prob 0 1s/Aligned.toTranscriptome.out.bam rsem_ref/rsemRef 1out/ >& rsem1.log

Repeat it for the rest of the bam files

star-transcriptomeout$ ls -l

drwxrwxr-x. 3 bdash bdash 66 Apr 11 22:41 1out

drwxrwxr-x. 3 bdash bdash 66 Apr 11 23:56 2out

drwxrwxr-x. 3 bdash bdash 66 Apr 12 03:48 3out

drwxrwxr-x. 3 bdash bdash 66 Apr 12 03:13 4out

drwxrwxr-x. 3 bdash bdash 66 Apr 12 02:48 5out

drwxrwxr-x. 3 bdash bdash 66 Apr 12 01:54 6out

-rw-rw-r–. 1 bdash bdash 309141 Apr 11 22:41 rsem1.log

-rw-rw-r–. 1 bdash bdash 353855 Apr 11 23:56 rsem2.log

-rw-rw-r–. 1 bdash bdash 255588 Apr 12 03:48 rsem3.log

-rw-rw-r–. 1 bdash bdash 326662 Apr 12 03:13 rsem4.log

-rw-rw-r–. 1 bdash bdash 366472 Apr 12 02:48 rsem5.log

-rw-rw-r–. 1 bdash bdash 294402 Apr 12 01:54 rsem6.log

drwxrwxr-x. 2 bdash bdash 163 Apr 11 21:20 rsem_ref

7. Analyze isoform results

Some file/directory contents

data = read.table("1out/.isoforms.results", header=T, stringsAsFactors=F)
head(data)
data = read.table("1out/.isoforms.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "transcript_id" ,"expected_count", "TPM", "IsoPct")]
data = read.table("2out/.isoforms.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "transcript_id", "expected_count", "TPM", "IsoPct")]
data = read.table("3out/.isoforms.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "transcript_id", "expected_count", "TPM", "IsoPct")]
data = read.table("4out/.isoforms.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "transcript_id", "expected_count", "TPM", "IsoPct")]
data = read.table("5out/.isoforms.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "transcript_id", "expected_count", "TPM", "IsoPct")]
data = read.table("6out/.isoforms.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "transcript_id", "expected_count", "TPM", "IsoPct")]

Generate a data matrix of isoforms for EBSeq analysis

star-transcriptomeout$ rsem-generate-data-matrix 1out/.isoforms.results 2out/.isoforms.results 3out/.isoforms.results 4out/.isoforms.results 5out/.isoforms.results 6out/.isoforms.results > isoMat.txt

star-transcriptomeout$ head isoMat.txt

    "1out/.isoforms.results"    "2out/.isoforms.results"    "3out/.isoforms.results"
    
    "4out/.isoforms.results"    "5out/.isoforms.results"    "6out/.isoforms.results"
    
"NM_022258" 0.00    1.00    0.00    0.00    1.00    0.00

"NM_133400" 0.00    0.00    0.00    0.00    0.00    0.00

"NM_012488" 33.00   51.50   14.00   34.50   137.00  23.50

"NM_012488_2"   33.00   51.50   14.00   34.50   137.00  23.50

"NM_138524" 13.00   8.00    19.00   9.00    19.00   20.00

"NM_022240" 0.00    0.00    0.00    0.00    5.00    1.00

"NR_002156" 3.00    1.00    0.00    1.00    1.00    0.00

"NM_001106795"  166.00  171.00  141.00  110.00  108.00  112.00

"NM_023104" 854.00  580.00  647.00  491.00  474.00  547.00

8. EBSeq analysis of isoforms

library(EBSeq)
Loading required package: blockmodeling
To cite package 'blockmodeling' in publications please use package citation and (at least) one of
the articles:

  㠼㹥iberna, Ale㤼㹡 (2007). Generalized blockmodeling of valued networks. Social Networks 29(1),
  105-126.

  㠼㹥iberna, Ale㤼㹡 (2008). Direct and indirect approaches to blockmodeling of valued networks in terms
  of regular equivalence. Journal of Mathematical Sociology 32(1), 57㤼㸶84.

  Ziberna, Ales (2018).  Generalized and Classical Blockmodeling of Valued Networks, R package
  version 0.3.4.

To see these entries in BibTeX format, use 'print(<citation>, bibtex=TRUE)', 'toBibtex(.)', or set
'options(citation.bibtex.max=999)'.
Loading required package: gplots

Attaching package: 㤼㸱gplots㤼㸲

The following object is masked from 㤼㸱package:stats㤼㸲:

    lowess

Loading required package: testthat
IsoMat <- data.matrix(read.table(file="isoMat.txt"))
str(IsoMat)
 num [1:18939, 1:6] 0 0 33 33 13 0 3 166 854 0 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:18939] "NM_022258" "NM_133400" "NM_012488" "NM_012488_2" ...
  ..$ : chr [1:6] "X1out..isoforms.results" "X2out..isoforms.results" "X3out..isoforms.results" "X4out..isoforms.results" ...
Sizes=MedianNorm(IsoMat)
head(Sizes)
X1out..isoforms.results X2out..isoforms.results X3out..isoforms.results X4out..isoforms.results 
              1.2368789               1.1461308               1.1211385               0.8246803 
X5out..isoforms.results X6out..isoforms.results 
              0.8683307               0.8872458 
EBOut=EBTest(Data=IsoMat, Conditions=as.factor(rep(c("C1","C2"),each=3)),sizeFactors=Sizes, maxround=5)
Removing transcripts with 100 th quantile < = 0 
15529 transcripts will be tested
iteration 1 done 

time 5.74 

iteration 2 done 

time 2.9 

iteration 3 done 

time 3.72 

iteration 4 done 

time 3.61 

iteration 5 done 

time 2.94 
names(EBOut)
 [1] "Alpha"          "Beta"           "P"              "PFromZ"         "Z"              "PoissonZ"      
 [7] "RList"          "MeanList"       "VarList"        "QList1"         "QList2"         "C1Mean"        
[13] "C2Mean"         "C1EstVar"       "C2EstVar"       "PoolVar"        "DataList"       "PPDE"          
[19] "f0"             "f1"             "AllZeroIndex"   "PPMat"          "PPMatWith0"     "ConditionOrder"
[25] "Conditions"     "DataNorm"      
EBDERes=GetDEResults(EBOut, FDR=0.05)
str(EBDERes)
List of 3
 $ DEfound: chr "NM_001013054"
 $ PPMat  : num [1:18939, 1:2] 1 NA 0.999 0.999 0.996 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:18939] "NM_022258" "NM_133400" "NM_012488" "NM_012488_2" ...
  .. ..$ : chr [1:2] "PPEE" "PPDE"
 $ Status : Named chr [1:18939] "EE" "Filtered: Low Expression" "EE" "EE" ...
  ..- attr(*, "names")= chr [1:18939] "NM_022258" "NM_133400" "NM_012488" "NM_012488_2" ...
EBDERes$DEfound
[1] "NM_001013054"
head(EBDERes$PPMat)
                 PPEE         PPDE
NM_022258   1.0000000 4.682651e-14
NM_133400          NA           NA
NM_012488   0.9985787 1.421285e-03
NM_012488_2 0.9985787 1.421285e-03
NM_138524   0.9959625 4.037536e-03
NM_022240   1.0000000 8.863191e-13
table(EBDERes$Status)

                         DE                          EE Filtered: Fold Change Ratio    Filtered: Low Expression 
                          1                       15506                          22                        3410 

8. Analyze genes results

Some file contents

data = read.table("1out/.genes.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "expected_count", "TPM")]
data = read.table("2out/.genes.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "expected_count", "TPM")]
data = read.table("3out/.genes.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "expected_count", "TPM")]
data = read.table("4out/.genes.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "expected_count", "TPM")]
data = read.table("5out/.genes.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "expected_count", "TPM")]
data = read.table("6out/.genes.results", header=T, stringsAsFactors=F)
idx = order(data[,"TPM"], decreasing=T)
data[idx[1:10], c("gene_id", "expected_count", "TPM")]

Generate a data matrix for genes results for EBSeq analysis

star-transcriptomeout$ rsem-generate-data-matrix 1out/.genes.results 2out/.genes.results 3out/.genes.results 4out/.genes.results 5out/.genes.results 6out/.genes.results > geneMat.txt

star-transcriptomeout]$ head geneMat.txt


"1out/.genes.results"   "2out/.genes.results"   "3out/.genes.results"   "4out/.genes.results"   "5out/.genes.results"   "6out/.genes.results"
    
    
"A1bg"  0.00    1.00    0.00    0.00    1.00    0.00

"A1cf"  0.00    0.00    0.00    0.00    0.00    0.00

"A2m"   66.00   103.00  28.00   69.00   274.00  47.00

"A3galt2"   13.00   8.00    19.00   9.00    19.00   20.00

"A4galt"    0.00    0.00    0.00    0.00    5.00    1.00

"AA926063"  3.00    1.00    0.00    1.00    1.00    0.00

"Aaas"  166.00  171.00  141.00  110.00  108.00  112.00

"Aacs"  854.00  580.00  647.00  491.00  474.00  547.00

"Aadac" 0.00    0.00    0.00    0.00    0.00    0.00

9. EBSeq analysis for genes

library(EBSeq)
GeneMat <- data.matrix(read.table(file="geneMat.txt"))
str(GeneMat)
 num [1:17322, 1:6] 0 0 66 13 0 3 166 854 0 0 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:17322] "A1bg" "A1cf" "A2m" "A3galt2" ...
  ..$ : chr [1:6] "X1out..genes.results" "X2out..genes.results" "X3out..genes.results" "X4out..genes.results" ...
Sizes=MedianNorm(GeneMat)
head(Sizes)
X1out..genes.results X2out..genes.results X3out..genes.results X4out..genes.results X5out..genes.results 
           1.2366119            1.1459937            1.1202284            0.8244768            0.8681165 
X6out..genes.results 
           0.8868599 
EBOut=EBTest(Data=GeneMat, Conditions=as.factor(rep(c("C1","C2"),each=3)),sizeFactors=Sizes, maxround=5)
Removing transcripts with 100 th quantile < = 0 
14396 transcripts will be tested
iteration 1 done 

time 4.92 

iteration 2 done 

time 3.55 

iteration 3 done 

time 3.15 

iteration 4 done 

time 2.74 

iteration 5 done 

time 2.95 
names(EBOut)
 [1] "Alpha"          "Beta"           "P"              "PFromZ"         "Z"              "PoissonZ"      
 [7] "RList"          "MeanList"       "VarList"        "QList1"         "QList2"         "C1Mean"        
[13] "C2Mean"         "C1EstVar"       "C2EstVar"       "PoolVar"        "DataList"       "PPDE"          
[19] "f0"             "f1"             "AllZeroIndex"   "PPMat"          "PPMatWith0"     "ConditionOrder"
[25] "Conditions"     "DataNorm"      
EBDERes=GetDEResults(EBOut, FDR=0.05)
str(EBDERes)
List of 3
 $ DEfound: chr "Adprhl1"
 $ PPMat  : num [1:17322, 1:2] 1 NA 1 0.998 1 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:17322] "A1bg" "A1cf" "A2m" "A3galt2" ...
  .. ..$ : chr [1:2] "PPEE" "PPDE"
 $ Status : Named chr [1:17322] "EE" "Filtered: Low Expression" "EE" "EE" ...
  ..- attr(*, "names")= chr [1:17322] "A1bg" "A1cf" "A2m" "A3galt2" ...
EBDERes$DEfound
[1] "Adprhl1"
head(EBDERes$PPMat)
              PPEE         PPDE
A1bg     1.0000000 2.739067e-14
A1cf            NA           NA
A2m      0.9997427 2.573493e-04
A3galt2  0.9981938 1.806185e-03
A4galt   1.0000000 5.372723e-13
AA926063 1.0000000 1.520845e-14
table(EBDERes$Status)

                         DE                          EE Filtered: Fold Change Ratio    Filtered: Low Expression 
                          1                       14392                           3                        2926 
LS0tDQp0aXRsZTogIkFuYWx5c2lzIG9mIGdlbmUgYW5kIGlzb2Zvcm0gZXhwcmVzc2lvbiBpbiBwcmVmcm9udGFsIGNvcnRleCAoUEZDKSBvZiByYXRzIGV4cG9zZWQgdG8gbmljb3RpbmU6IFN0YXItUlNFTS1FQnNlcSBwaXBlbGluZSINCmF1dGhvcjogIkJoYWdpcmF0aGkgRGFzaCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIDEuIFJlZmVyZW5jZXMgYW5kIHJlc291cmNlcw0KDQojIyMjIFJlZmVyZW5jZQ0KDQpQTG9TIE9uZS4gMjAxMzs4KDMpOmU1OTU4Mi4gZG9pOiAxMC4xMzcxL2pvdXJuYWwucG9uZS4wMDU5NTgyLg0KDQojIyMjIE1hY2hpbmUNCg0KQVdTIHI1LjJ4bGFyZ2UgYW5kIENlbnRPUyBsaW51eCA3IG9uIGEgVmlydHVhbCBNYWNoaW5lDQoNCiMjIyMgU29mdHdhcmUNCg0Kd2dldCBodHRwOi8vaGdkb3dubG9hZC5zb2UudWNzYy5lZHUvYWRtaW4vZXhlL2xpbnV4Lng4Nl82NC9nZW5lUHJlZFRvR3RmDQoNCg0KDQojIyAyLiBPYnRhaW4gYW5kL3Byb2Nlc3MgYW5hbHlzaXMgZGF0c2V0cw0KDQojIyMgTWFrZSBkaXJlY3RvcmllcyANCg0KIyMjIyB+L2RhdGEvcm5hc2VxL1JuL1BMb1MtT25lLTgtZTU5NTgyJCBscyAtbA0KDQpkcnd4cnd4ci14IDIgdWJ1bnR1IHVidW50dSA0MDk2IEFwciAxMCAwMjo0OCBmMzQ0X3BmY19uaWNvdGluZQ0KDQpkcnd4cnd4ci14IDIgdWJ1bnR1IHVidW50dSA0MDk2IEFwciAxMCAwMzoyOCBmMzQ0X3BmY19zYWxpbmUNCg0KDQojIyMgRG93bmxvYWQgc3JhIGZpbGVzIChuaWNvdGluZSBleHBvc2VkIHJhdCBQRkMpIHRvIGYzNDRfcGZjX25pY290aW5lIGRpcmVjdG9yeQ0KDQoNCiMjIyMgZjM0NF9wZmNfbmljb3RpbmUkIHdnZXQgZnRwOi8vZnRwLXRyYWNlLm5jYmkubmloLmdvdi9zcmEvc3JhLWluc3RhbnQvcmVhZHMvQnlSdW4vc3JhL1NSUi9TUlI4NjkvU1JSODY5MDMyL1NSUjg2OTAzMi5zcmENCg0KIyMjIyBmMzQ0X3BmY19uaWNvdGluZSQgd2dldCBmdHA6Ly9mdHAtdHJhY2UubmNiaS5uaWguZ292L3NyYS9zcmEtaW5zdGFudC9yZWFkcy9CeVJ1bi9zcmEvU1JSL1NSUjg2OS9TUlI4NjkwMzMvU1JSODY5MDMzLnNyYQ0KDQojIyMjIGYzNDRfcGZjX25pY290aW5lJCB3Z2V0IGZ0cDovL2Z0cC10cmFjZS5uY2JpLm5paC5nb3Yvc3JhL3NyYS1pbnN0YW50L3JlYWRzL0J5UnVuL3NyYS9TUlIvU1JSODY5L1NSUjg2OTAzNC9TUlI4NjkwMzQuc3JhDQoNCg0KDQoNCiMjIyBDb252ZXJ0IHNyYSBmaWxlcyB0byBmYXN0cSBmaWxlcw0KDQojIyMjIGYzNDRfcGZjX25pY290aW5lJCBmYXN0cS1kdW1wIC0tc3BsaXQtMyBTUlI4NjkwMzIuc3JhIC0tZ3ppcA0KDQojIyMjIGYzNDRfcGZjX25pY290aW5lJCBmYXN0cS1kdW1wIC0tc3BsaXQtMyBTUlI4NjkwMzMuc3JhIC0tZ3ppcA0KDQojIyMjIGYzNDRfcGZjX25pY290aW5lJCBmYXN0cS1kdW1wIC0tc3BsaXQtMyBTUlI4NjkwMzQuc3JhIC0tZ3ppcA0KDQoNCg0KIyMjIyBQTG9TLU9uZS04LWU1OTU4MiQgbHMgLWwgZjM0NF9wZmNfbmljb3RpbmUvDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE5MTgzNzY4MjYgQXByICA3IDEzOjA4IFNSUjg2OTAzMi5zcmENCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTUxMjcwMjg3MyBBcHIgMTAgMDM6MDcgU1JSODY5MDMyXzEuZmFzdHEuZ3oNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTU2NTAyNzQyMSBBcHIgMTAgMDM6MDcgU1JSODY5MDMyXzIuZmFzdHEuZ3oNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTk4OTA4NjI0MSBBcHIgIDcgMTM6MDkgU1JSODY5MDMzLnNyYQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxNTU5NTEwODE4IEFwciAxMCAwMzoxMSBTUlI4NjkwMzNfMS5mYXN0cS5neg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxNjEyMjU4NjE4IEFwciAxMCAwMzoxMSBTUlI4NjkwMzNfMi5mYXN0cS5neg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxOTc4MzI3NjY3IEFwciAgNyAxMzoxMCBTUlI4NjkwMzQuc3JhDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE1Njg5Nzk3ODQgQXByIDEwIDAzOjEyIFNSUjg2OTAzNF8xLmZhc3RxLmd6DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE2MTUzODUzMzEgQXByIDEwIDAzOjEyIFNSUjg2OTAzNF8yLmZhc3RxLmd6DQoNCg0KIyMjIERvd25sb2FkIHNyYSBmaWxlcyAoY29udHJvbC9zYWxpbmUgZXhwb3NlZCByYXQgUEZDKSB0byBmMzQ0X3BmY19zYWxpbmUgZGlyZWN0b3J5DQoNCg0KIyMjIyBmMzQ0X3BmY19zYWxpbmUkIHdnZXQgZnRwOi8vZnRwLXRyYWNlLm5jYmkubmloLmdvdi9zcmEvc3JhLWluc3RhbnQvcmVhZHMvQnlSdW4vc3JhL1NSUi9TUlI4NjkvU1JSODY5MDQ0L1NSUjg2OTA0NC5zcmENCg0KIyMjIyBmMzQ0X3BmY19zYWxpbmUkIHdnZXQgZnRwOi8vZnRwLXRyYWNlLm5jYmkubmloLmdvdi9zcmEvc3JhLWluc3RhbnQvcmVhZHMvQnlSdW4vc3JhL1NSUi9TUlI4NjkvU1JSODY5MDQ1L1NSUjg2OTA0NS5zcmENCg0KIyMjIyBmMzQ0X3BmY19zYWxpbmUkIHdnZXQgZnRwOi8vZnRwLXRyYWNlLm5jYmkubmloLmdvdi9zcmEvc3JhLWluc3RhbnQvcmVhZHMvQnlSdW4vc3JhL1NSUi9TUlI4NjkvU1JSODY5MDQ2L1NSUjg2OTA0Ni5zcmENCg0KDQoNCg0KIyMjIyBmMzQ0X3BmY19zYWxpbmUkIGZhc3RxLWR1bXAgLS1zcGxpdC0zIFNSUjg2OTA0NC5zcmEgLS1nemlwDQoNCiMjIyMgZjM0NF9wZmNfc2FsaW5lJCBmYXN0cS1kdW1wIC0tc3BsaXQtMyBTUlI4NjkwNDUuc3JhIC0tZ3ppcA0KDQojIyMjIGYzNDRfcGZjX3NhbGluZSQgZmFzdHEtZHVtcCAtLXNwbGl0LTMgU1JSODY5MDQ2LnNyYSAtLWd6aXANCg0KDQoNCiMjIyMgUExvUy1PbmUtOC1lNTk1ODIkIGxzIC1sIGYzNDRfcGZjX3NhbGluZS8NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMjY4MTMzMDA3NCBBcHIgIDcgMTI6NTkgU1JSODY5MDQ0LnNyYQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAyMTE5NzQ1OTU1IEFwciAxMCAwMzoxMCBTUlI4NjkwNDRfMS5mYXN0cS5neg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAyMjAyNTgwNDgyIEFwciAxMCAwMzoxMCBTUlI4NjkwNDRfMi5mYXN0cS5neg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAyNzA5MzgzMTk0IEFwciAgNyAxMzowMSBTUlI4NjkwNDUuc3JhDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDIxMDM4OTIwOTcgQXByIDEwIDAzOjEyIFNSUjg2OTA0NV8xLmZhc3RxLmd6DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDIxOTgzNjMwNjIgQXByIDEwIDAzOjEyIFNSUjg2OTA0NV8yLmZhc3RxLmd6DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDI2MTQwMjMzMjggQXByICA3IDEzOjAyIFNSUjg2OTA0Ni5zcmENCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMjA1NDk0MjM3NSBBcHIgMTAgMDM6MTMgU1JSODY5MDQ2XzEuZmFzdHEuZ3oNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMjEzODQ0NjI2OSBBcHIgMTAgMDM6MTMgU1JSODY5MDQ2XzIuZmFzdHEuZ3oNCg0KDQoNCiMjIDMuIE9idGFpbiwgcHJvY2VzcyBhbmQvb3IgYnVpbGQgZ2Vub21lLCByZWZlcmVuY2UgYW5kIGluZGV4IGRhdGFzZXRzDQoNCg0KIyMjIERvd25sb2FkIHRoZSBnZW5vbWUgZmlsZSBhbmQgaW5kZXggaXQNCg0KDQojIyMjIHdnZXQgaHR0cDovL2hnZG93bmxvYWQuc29lLnVjc2MuZWR1L2dvbGRlblBhdGgvcm42L2JpZ1ppcHMvcm42LmZhLmd6DQoNCg0KIyMjIyBzYW10b29scyBmYWlkeCBybjYuZmENCg0KDQojIyMjIHJuNiQgbHMgLWwNCg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAyOTI3NjA3MzMzIEFwciAgOSAxOToyNiBybjYuZmENCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA0MDY1NCBBcHIgIDkgMTk6MjYgcm42LmZhLmZhaQ0KDQoNCg0KDQojIyMgRG93bmxvYWQgdGhlIHJlZkdlbmUgZmlsZSBhbmQgY29udmVydCBpdCB0byBhIEdURiBmaWxlDQoNCg0KIyMjIyB3Z2V0IGh0dHA6Ly9oZ2Rvd25sb2FkLnNvZS51Y3NjLmVkdS9nb2xkZW5QYXRoL3JuNi9kYXRhYmFzZS9yZWZHZW5lLnR4dC5neg0KDQojIyMjIGd1bnppcCByZWZHZW5lLnR4dC5neiANCiANCiMjIyMgY3V0IC1mIDItIHJlZkdlbmUudHh0ID4gcmVmR2VuZS5pbnB1dA0KDQojIyMjIGdlbmVQcmVkVG9HdGYgZmlsZSByZWZHZW5lLmlucHV0IHJlZkdlbmUuZ3RmDQogDQoNCiMjIyMgZ2Vub21lX3JhdCQgbHMgLWwgIA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgIDYxODkxMzQxIEFwciAgOSAxOToyNyByZWZHZW5lLmd0Zg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICA1MTQzMzgwIEFwciAgOSAxOToyNyByZWZHZW5lLmlucHV0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDUyMjY1MDcgQXByICA5IDE5OjI3IHJlZkdlbmUudHh0DQoNCg0KDQoNCg0KDQoNCiMjIyA0LiBCdWlsZCBhIFNUQVIgaW5kZXggZm9yIHRoZSByYXQgZ2VuZW9tZQ0KDQoNCmBgYA0KJCBTVEFSIC0tcnVuVGhyZWFkTiAxNiAtLXJ1bk1vZGUgZ2Vub21lR2VuZXJhdGUgLS1nZW5vbWVEaXIgU3RhckluZGV4UmF0LyAtLWdlbm9tZUZhc3RhRmlsZXMgcm42L3JuNi5mYQ0KDQpgYGANCg0KDQpBcHIgMDkgMTg6Mzk6MDQgLi4uLi4gc3RhcnRlZCBTVEFSIHJ1bg0KDQpBcHIgMDkgMTg6Mzk6MDQgLi4uIHN0YXJ0aW5nIHRvIGdlbmVyYXRlIEdlbm9tZSBmaWxlcw0KDQpBcHIgMDkgMTg6NDA6MTggLi4uIHN0YXJ0aW5nIHRvIHNvcnQgU3VmZml4IEFycmF5LiBUaGlzIG1heSB0YWtlIGEgbG9uZyB0aW1lLi4uDQoNCkFwciAwOSAxODo0MDozMiAuLi4gc29ydGluZyBTdWZmaXggQXJyYXkgY2h1bmtzIGFuZCBzYXZpbmcgdGhlbSB0byBkaXNrLi4uDQoNCkFwciAwOSAxOTowNTozMyAuLi4gbG9hZGluZyBjaHVua3MgZnJvbSBkaXNrLCBwYWNraW5nIFNBLi4uDQoNCkFwciAwOSAxOTowNjo0MiAuLi4gZmluaXNoZWQgZ2VuZXJhdGluZyBzdWZmaXggYXJyYXkNCg0KQXByIDA5IDE5OjA2OjQyIC4uLiBnZW5lcmF0aW5nIFN1ZmZpeCBBcnJheSBpbmRleA0KDQpBcHIgMDkgMTk6MTA6NTcgLi4uIGNvbXBsZXRlZCBTdWZmaXggQXJyYXkgaW5kZXgNCg0KQXByIDA5IDE5OjEwOjU3IC4uLiB3cml0aW5nIEdlbm9tZSB0byBkaXNrIC4uLg0KDQpBcHIgMDkgMTk6MTA6NTkgLi4uIHdyaXRpbmcgU3VmZml4IEFycmF5IHRvIGRpc2sgLi4uDQoNCkFwciAwOSAxOToxMjoxOSAuLi4gd3JpdGluZyBTQWluZGV4IHRvIGRpc2sNCg0KQXByIDA5IDE5OjEyOjI3IC4uLi4uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQ0KDQoNCiMjIyMgU3RhckluZGV4UmF0JCBscyAtbA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMzA5NTEzNDIwOCBBcHIgIDkgMTk6MTAgR2Vub21lDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDIyNTIxMzUxNjQ1IEFwciAgOSAxOToxMiBTQQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMTU2NTg3MzYxOSBBcHIgIDkgMTk6MTIgU0FpbmRleA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgNTIxMyBBcHIgIDkgMTg6NDAgY2hyTGVuZ3RoLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxOTM0NyBBcHIgIDkgMTg6NDAgY2hyTmFtZS50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMjQ1NjAgQXByICA5IDE4OjQwIGNock5hbWVMZW5ndGgudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEwMzg3IEFwciAgOSAxODo0MCBjaHJTdGFydC50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA0NzkgQXByICA5IDE5OjEwIGdlbm9tZVBhcmFtZXRlcnMudHh0DQoNCg0KDQoNCg0KDQoNCiMjIDUuIEFsaWduIHRoZSBmYXN0cS5neiBmaWxlcyB0byBvYnRhaW4gQkFNIGZpbGVzDQoNCg0KYGBgDQogfi9yZXN1bHRzL3JuYXNlcS9Sbi9zdGFyX3JhdCQgU1RBUiANCiANCiAtLXJ1blRocmVhZE4gMTIgDQogDQogLS1nZW5vbWVEaXIgU3RhckluZGV4UmF0LyANCiANCiAtLXNqZGJHVEZmaWxlIH4vZ2Vub21lX3JhdC9yZWZHZW5lLmd0ZiANCiANCiAtLXNqZGJPdmVyaGFuZyAxMDAgDQogDQogLS1yZWFkRmlsZXNJbiB+L1BMb1MtT25lLTgtZTU5NTgyL2YzNDRfcGZjX3NhbGluZS9TUlI4NjkwNDRfMS5mYXN0cS5neg0KIA0KIH4vUExvUy1PbmUtOC1lNTk1ODIvZjM0NF9wZmNfc2FsaW5lL1NSUjg2OTA0NF8yLmZhc3RxLmd6IA0KIA0KIC0tcmVhZEZpbGVzQ29tbWFuZCB6Y2F0IA0KIA0KIC0tcXVhbnRNb2RlIFRyYW5zY3JpcHRvbWVTQU0gDQogDQogLS1vdXRGaWxlTmFtZVByZWZpeCAxYWxpZ24vDQogDQogYGBgDQoNCkFwciAxMCAwMzozMDozMCAuLi4uLiBzdGFydGVkIFNUQVIgcnVuDQoNCkFwciAxMCAwMzozMDozMCAuLi4uLiBsb2FkaW5nIGdlbm9tZQ0KDQpBcHIgMTAgMDM6MzI6MzkgLi4uLi4gcHJvY2Vzc2luZyBhbm5vdGF0aW9ucyBHVEYNCg0KQXByIDEwIDAzOjMyOjQzIC4uLi4uIGluc2VydGluZyBqdW5jdGlvbnMgaW50byB0aGUgZ2Vub21lIGluZGljZXMNCg0KQXByIDEwIDAzOjM3OjIzIC4uLi4uIHN0YXJ0ZWQgbWFwcGluZw0KDQpBcHIgMTAgMDM6NDI6MjkgLi4uLi4gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5DQoNCg0KDQojIyMjICQgbHMgLWwgMWFsaWduLw0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE1OTMzNDQ0OTg2IEFwciAxMCAwMzo0MiBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDIzNTg2NDM1NzkgQXByIDEwIDAzOjQyIEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NjIgQXByIDEwIDAzOjQyIExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyNzI5MzUgQXByIDEwIDAzOjQyIExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA4MzYgQXByIDEwIDAzOjQyIExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDczNjg4ODYgQXByIDEwIDAzOjQyIFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByIDEwIDAzOjMyIF9TVEFSZ2Vub21lDQoNCg0KDQojIyMjICQgY2F0IDFhbGlnbi9Mb2cuZmluYWwub3V0IA0KDQoNCmBgYA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBqb2Igb24gfAlBcHIgMTAgMDM6MzA6MzANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBtYXBwaW5nIG9uIHwJQXByIDEwIDAzOjM3OjIzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5pc2hlZCBvbiB8CUFwciAxMCAwMzo0MjoyOQ0KICAgICAgIE1hcHBpbmcgc3BlZWQsIE1pbGxpb24gb2YgcmVhZHMgcGVyIGhvdXIgfAk0ODkuMjMNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgaW5wdXQgcmVhZHMgfAk0MTU4NDg5MQ0KICAgICAgICAgICAgICAgICAgICAgIEF2ZXJhZ2UgaW5wdXQgcmVhZCBsZW5ndGggfAkxMDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSVFVRSBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICBVbmlxdWVseSBtYXBwZWQgcmVhZHMgbnVtYmVyIHwJMzQ3OTYzMzENCiAgICAgICAgICAgICAgICAgICAgICAgIFVuaXF1ZWx5IG1hcHBlZCByZWFkcyAlIHwJODMuNjglDQogICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZXJhZ2UgbWFwcGVkIGxlbmd0aCB8CTk5LjM3DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBUb3RhbCB8CTc5MTAxOTkNCiAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBbm5vdGF0ZWQgKHNqZGIpIHwJNzE5NDk0MA0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogR1QvQUcgfAk3NzY0Njc3DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBHQy9BRyB8CTYyMDA0DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBVC9BQyB8CTc2MzQNCiAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBOb24tY2Fub25pY2FsIHwJNzU4ODQNCiAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaCByYXRlIHBlciBiYXNlLCAlIHwJMC4zNyUNCiAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbiByYXRlIHBlciBiYXNlIHwJMC4wMSUNCiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIGF2ZXJhZ2UgbGVuZ3RoIHwJMS42MQ0KICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAwJQ0KICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjM1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VTFRJLU1BUFBJTkcgUkVBRFM6DQogICAgICAgIE51bWJlciBvZiByZWFkcyBtYXBwZWQgdG8gbXVsdGlwbGUgbG9jaSB8CTI1NTM4NTINCiAgICAgICAgICAgICAlIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJNi4xNCUNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byB0b28gbWFueSBsb2NpIHwJNTczMDgNCiAgICAgICAgICAgICAlIG9mIHJlYWRzIG1hcHBlZCB0byB0b28gbWFueSBsb2NpIHwJMC4xNCUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTk1BUFBFRCBSRUFEUzoNCiAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gbWFueSBtaXNtYXRjaGVzIHwJMC4wMCUNCiAgICAgICAgICAgICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogdG9vIHNob3J0IHwJOS45MiUNCiAgICAgICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IG90aGVyIHwJMC4xMyUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElNRVJJQyBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoaW1lcmljIHJlYWRzIHwJMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgb2YgY2hpbWVyaWMgcmVhZHMgfAkwLjAwJQ0KDQpgYGANCg0KDQoNCg0KYGBgDQp+L3Jlc3VsdHMvcm5hc2VxL1JuL3N0YXJfcmF0L3RyYW5zY3JpcHRvbWVPdXQkIFNUQVIgLS1ydW5UaHJlYWROIDEyIC0tZ2Vub21lRGlyIH4vZ2Vub21lQW5kSW5kaWNlcy9Sbi9zdGFyLyAtLXNqZGJHVEZmaWxlIH4vZ2Vub21lQW5kSW5kaWNlcy9Sbi9ybjYucmVmR2VuZS5ndGYgLS1zamRiT3ZlcmhhbmcgMTAwIC0tcmVhZEZpbGVzSW4gfi9kYXRhL3JuYXNlcS9Sbi9QTG9TLU9uZS04LWU1OTU4Mi9mMzQ0X3BmY19zYWxpbmUvU1JSODY5MDQ1XzEuZmFzdHEuZ3ogfi9kYXRhL3JuYXNlcS9Sbi9QTG9TLU9uZS04LWU1OTU4Mi9mMzQ0X3BmY19zYWxpbmUvU1JSODY5MDQ1XzIuZmFzdHEuZ3ogLS1yZWFkRmlsZXNDb21tYW5kIHpjYXQgLS1xdWFudE1vZGUgVHJhbnNjcmlwdG9tZVNBTSAtLW91dEZpbGVOYW1lUHJlZml4IDJhbGlnbi8NCg0KYGBgDQoNCg0KQXByIDExIDE1OjA4OjE5IC4uLi4uIHN0YXJ0ZWQgU1RBUiBydW4NCg0KQXByIDExIDE1OjA4OjIwIC4uLi4uIGxvYWRpbmcgZ2Vub21lDQoNCkFwciAxMSAxNToxMjowMSAuLi4uLiBwcm9jZXNzaW5nIGFubm90YXRpb25zIEdURg0KDQpBcHIgMTEgMTU6MTI6MjUgLi4uLi4gaW5zZXJ0aW5nIGp1bmN0aW9ucyBpbnRvIHRoZSBnZW5vbWUgaW5kaWNlcw0KDQpBcHIgMTEgMTU6Mzc6NDYgLi4uLi4gc3RhcnRlZCBtYXBwaW5nDQoNCkFwciAxMSAxNTo1ODo1NCAuLi4uLiBmaW5pc2hlZCBzdWNjZXNzZnVsbHkNCg0KDQojIyMjICQgbHMgLWwgMmFsaWduLw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxNDg2OTQzNjY0NCBBcHIgMTEgMTU6NTggQWxpZ25lZC5vdXQuc2FtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAyMjE2MTY2NjY4IEFwciAxMSAxNTo1OCBBbGlnbmVkLnRvVHJhbnNjcmlwdG9tZS5vdXQuYmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAxODYzIEFwciAxMSAxNTo1OCBMb2cuZmluYWwub3V0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMjkwOTcxIEFwciAxMSAxNTo1OCBMb2cub3V0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAyNDg4IEFwciAxMSAxNTo1OCBMb2cucHJvZ3Jlc3Mub3V0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICA3Mjc4OTUzIEFwciAxMSAxNTo1OCBTSi5vdXQudGFiDQoNCmRyd3gtLS0tLS0gMiB1YnVudHUgdWJ1bnR1ICAgICAgICA0MDk2IEFwciAxMSAxNToxMiBfU1RBUmdlbm9tZQ0KDQoNCg0KDQojIyMjICQgY2F0IDJhbGlnbi9Mb2cuZmluYWwub3V0IA0KDQoNCg0KYGBgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydGVkIGpvYiBvbiB8CUFwciAxMSAxNTowODoxOQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydGVkIG1hcHBpbmcgb24gfAlBcHIgMTEgMTU6Mzc6NDYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmlzaGVkIG9uIHwJQXByIDExIDE1OjU4OjU0DQogICAgICAgTWFwcGluZyBzcGVlZCwgTWlsbGlvbiBvZiByZWFkcyBwZXIgaG91ciB8CTExNi4wMg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBpbnB1dCByZWFkcyB8CTQwODY2MDM1DQogICAgICAgICAgICAgICAgICAgICAgQXZlcmFnZSBpbnB1dCByZWFkIGxlbmd0aCB8CTEwMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JUVVFIFJFQURTOg0KICAgICAgICAgICAgICAgICAgIFVuaXF1ZWx5IG1hcHBlZCByZWFkcyBudW1iZXIgfAkzMjU5NDExNQ0KICAgICAgICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzICUgfAk3OS43NiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgQXZlcmFnZSBtYXBwZWQgbGVuZ3RoIHwJOTkuMzUNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IFRvdGFsIHwJNzM3MjE4MQ0KICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEFubm90YXRlZCAoc2pkYikgfAk2Njk1MTU1DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBHVC9BRyB8CTcyMzUxMzUNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdDL0FHIHwJNTg1MjMNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEFUL0FDIHwJNjk5NQ0KICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IE5vbi1jYW5vbmljYWwgfAk3MTUyOA0KICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoIHJhdGUgcGVyIGJhc2UsICUgfAkwLjM4JQ0KICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAxJQ0KICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjYxDQogICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gcmF0ZSBwZXIgYmFzZSB8CTAuMDElDQogICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvbiBhdmVyYWdlIGxlbmd0aCB8CTEuMzUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMVEktTUFQUElORyBSRUFEUzoNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJMjM1MzkwMw0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIG11bHRpcGxlIGxvY2kgfAk1Ljc2JQ0KICAgICAgICBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAk1Mjg3Ng0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAkwLjEzJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOTUFQUEVEIFJFQURTOg0KICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IHRvbyBtYW55IG1pc21hdGNoZXMgfAkwLjAwJQ0KICAgICAgICAgICAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gc2hvcnQgfAkxNC4yMyUNCiAgICAgICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IG90aGVyIHwJMC4xMiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElNRVJJQyBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoaW1lcmljIHJlYWRzIHwJMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgb2YgY2hpbWVyaWMgcmVhZHMgfAkwLjAwJQ0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCmBgYA0Kfi9yZXN1bHRzL3JuYXNlcS9Sbi9zdGFyX3JhdC90cmFuc2NyaXB0b21lT3V0JCBTVEFSIC0tcnVuVGhyZWFkTiAxMiAtLWdlbm9tZURpciB+L2dlbm9tZUFuZEluZGljZXMvUm4vc3Rhci8gLS1zamRiR1RGZmlsZSB+L2dlbm9tZUFuZEluZGljZXMvUm4vcm42LnJlZkdlbmUuZ3RmIC0tc2pkYk92ZXJoYW5nIDEwMCAtLXJlYWRGaWxlc0luIH4vZGF0YS9ybmFzZXEvUm4vUExvUy1PbmUtOC1lNTk1ODIvZjM0NF9wZmNfc2FsaW5lL1NSUjg2OTA0Nl8xLmZhc3RxLmd6IH4vZGF0YS9ybmFzZXEvUm4vUExvUy1PbmUtOC1lNTk1ODIvZjM0NF9wZmNfc2FsaW5lL1NSUjg2OTA0Nl8yLmZhc3RxLmd6IC0tcmVhZEZpbGVzQ29tbWFuZCB6Y2F0IC0tcXVhbnRNb2RlIFRyYW5zY3JpcHRvbWVTQU0gLS1vdXRGaWxlTmFtZVByZWZpeCAzYWxpZ24vDQoNCmBgYA0KDQpBcHIgMTEgMTY6MDA6NTIgLi4uLi4gc3RhcnRlZCBTVEFSIHJ1bg0KDQpBcHIgMTEgMTY6MDA6NTIgLi4uLi4gbG9hZGluZyBnZW5vbWUNCg0KQXByIDExIDE2OjAyOjM1IC4uLi4uIHByb2Nlc3NpbmcgYW5ub3RhdGlvbnMgR1RGDQoNCkFwciAxMSAxNjowMjozNyAuLi4uLiBpbnNlcnRpbmcganVuY3Rpb25zIGludG8gdGhlIGdlbm9tZSBpbmRpY2VzDQoNCkFwciAxMSAxNjowNToyMyAuLi4uLiBzdGFydGVkIG1hcHBpbmcNCg0KQXByIDExIDE2OjExOjI5IC4uLi4uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQ0KDQoNCiMjIyMgJCBscyAtbCAzYWxpZ24vDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE0OTk4MzE5MjQ1IEFwciAxMSAxNjoxMSBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDIxODM4MTQ2MzEgQXByIDExIDE2OjExIEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NjMgQXByIDExIDE2OjExIExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyOTA5NzAgQXByIDExIDE2OjExIExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA5NTQgQXByIDExIDE2OjExIExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDcyMjA5MjMgQXByIDExIDE2OjExIFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByIDExIDE2OjAyIF9TVEFSZ2Vub21lDQoNCg0KDQojIyMjICQgY2F0IDNhbGlnbi9Mb2cuZmluYWwub3V0IA0KDQpgYGANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWQgam9iIG9uIHwJQXByIDExIDE2OjAwOjUyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWQgbWFwcGluZyBvbiB8CUFwciAxMSAxNjowNToyMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluaXNoZWQgb24gfAlBcHIgMTEgMTY6MTE6MjkNCiAgICAgICBNYXBwaW5nIHNwZWVkLCBNaWxsaW9uIG9mIHJlYWRzIHBlciBob3VyIHwJMzg3LjI2DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGlucHV0IHJlYWRzIHwJMzkzNzA5MzUNCiAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIGlucHV0IHJlYWQgbGVuZ3RoIHwJMTAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklRVUUgUkVBRFM6DQogICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzIG51bWJlciB8CTMyNzE3OTU4DQogICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWVseSBtYXBwZWQgcmVhZHMgJSB8CTgzLjEwJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIG1hcHBlZCBsZW5ndGggfAk5OS4zNQ0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogVG90YWwgfAk3MTAyMzI4DQogICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogQW5ub3RhdGVkIChzamRiKSB8CTY0NTgyMDYNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdUL0FHIHwJNjk3MTM5MQ0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogR0MvQUcgfAk1NTYzNA0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogQVQvQUMgfAk2OTk5DQogICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogTm9uLWNhbm9uaWNhbCB8CTY4MzA0DQogICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2ggcmF0ZSBwZXIgYmFzZSwgJSB8CTAuNDAlDQogICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb24gcmF0ZSBwZXIgYmFzZSB8CTAuMDElDQogICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbiBhdmVyYWdlIGxlbmd0aCB8CTEuNjENCiAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvbiByYXRlIHBlciBiYXNlIHwJMC4wMSUNCiAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0aW9uIGF2ZXJhZ2UgbGVuZ3RoIHwJMS4zNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVUxUSS1NQVBQSU5HIFJFQURTOg0KICAgICAgICBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIHRvIG11bHRpcGxlIGxvY2kgfAkyNDYyMzA5DQogICAgICAgICAgICAgJSBvZiByZWFkcyBtYXBwZWQgdG8gbXVsdGlwbGUgbG9jaSB8CTYuMjUlDQogICAgICAgIE51bWJlciBvZiByZWFkcyBtYXBwZWQgdG8gdG9vIG1hbnkgbG9jaSB8CTUxOTE3DQogICAgICAgICAgICAgJSBvZiByZWFkcyBtYXBwZWQgdG8gdG9vIG1hbnkgbG9jaSB8CTAuMTMlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5NQVBQRUQgUkVBRFM6DQogICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogdG9vIG1hbnkgbWlzbWF0Y2hlcyB8CTAuMDAlDQogICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IHRvbyBzaG9ydCB8CTEwLjM4JQ0KICAgICAgICAgICAgICAgICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogb3RoZXIgfAkwLjEzJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISU1FUklDIFJFQURTOg0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgY2hpbWVyaWMgcmVhZHMgfAkwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBvZiBjaGltZXJpYyByZWFkcyB8CTAuMDAlDQoNCmBgYA0KDQoNCg0KYGBgDQp+L3Jlc3VsdHMvcm5hc2VxL1JuL3N0YXJfcmF0L3RyYW5zY3JpcHRvbWVPdXQkIFNUQVIgLS1ydW5UaHJlYWROIDEyIC0tZ2Vub21lRGlyIH4vZ2Vub21lQW5kSW5kaWNlcy9Sbi9zdGFyLyAtLXNqZGJHVEZmaWxlIH4vZ2Vub21lQW5kSW5kaWNlcy9Sbi9ybjYucmVmR2VuZS5ndGYgLS1zamRiT3ZlcmhhbmcgMTAwIC0tcmVhZEZpbGVzSW4gfi9kYXRhL3JuYXNlcS9Sbi9QTG9TLU9uZS04LWU1OTU4Mi9mMzQ0X3BmY19uaWNvdGluZS9TUlI4NjkwMzJfMS5mYXN0cS5neiB+L2RhdGEvcm5hc2VxL1JuL1BMb1MtT25lLTgtZTU5NTgyL2YzNDRfcGZjX25pY290aW5lL1NSUjg2OTAzMl8yLmZhc3RxLmd6IC0tcmVhZEZpbGVzQ29tbWFuZCB6Y2F0IC0tcXVhbnRNb2RlIFRyYW5zY3JpcHRvbWVTQU0gLS1vdXRGaWxlTmFtZVByZWZpeCA0YWxpZ24vDQoNCmBgYA0KDQpBcHIgMTEgMTY6MjE6MjYgLi4uLi4gc3RhcnRlZCBTVEFSIHJ1bg0KDQpBcHIgMTEgMTY6MjE6MjYgLi4uLi4gbG9hZGluZyBnZW5vbWUNCg0KQXByIDExIDE2OjIzOjA5IC4uLi4uIHByb2Nlc3NpbmcgYW5ub3RhdGlvbnMgR1RGDQoNCkFwciAxMSAxNjoyMzoxMCAuLi4uLiBpbnNlcnRpbmcganVuY3Rpb25zIGludG8gdGhlIGdlbm9tZSBpbmRpY2VzDQoNCkFwciAxMSAxNjoyNToyNCAuLi4uLiBzdGFydGVkIG1hcHBpbmcNCg0KQXByIDExIDE2OjI4OjU4IC4uLi4uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQ0KDQoNCg0KDQojIyMjICQgbHMgLWwgNGFsaWduLw0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDEwOTMzMTE2Mzk1IEFwciAxMSAxNjoyOCBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDE2MTc3NzUzMTEgQXByIDExIDE2OjI4IEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NjMgQXByIDExIDE2OjI4IExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyOTEwMDYgQXByIDExIDE2OjI4IExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA2MDAgQXByIDExIDE2OjI4IExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDY3NzgwNzUgQXByIDExIDE2OjI4IFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByIDExIDE2OjIzIF9TVEFSZ2Vub21lDQoNCg0KDQojIyMjICQgY2F0IDRhbGlnbi9Mb2cuZmluYWwub3V0IA0KDQoNCmBgYA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBqb2Igb24gfAlBcHIgMTEgMTY6MjE6MjYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBtYXBwaW5nIG9uIHwJQXByIDExIDE2OjI1OjI0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5pc2hlZCBvbiB8CUFwciAxMSAxNjoyODo1OA0KICAgICAgIE1hcHBpbmcgc3BlZWQsIE1pbGxpb24gb2YgcmVhZHMgcGVyIGhvdXIgfAk0ODYuNjYNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgaW5wdXQgcmVhZHMgfAkyODkyOTQ4NQ0KICAgICAgICAgICAgICAgICAgICAgIEF2ZXJhZ2UgaW5wdXQgcmVhZCBsZW5ndGggfAkxMDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSVFVRSBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICBVbmlxdWVseSBtYXBwZWQgcmVhZHMgbnVtYmVyIHwJMjM4ODQ4NTANCiAgICAgICAgICAgICAgICAgICAgICAgIFVuaXF1ZWx5IG1hcHBlZCByZWFkcyAlIHwJODIuNTYlDQogICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZXJhZ2UgbWFwcGVkIGxlbmd0aCB8CTk5LjM3DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBUb3RhbCB8CTUzMzc1OTENCiAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBbm5vdGF0ZWQgKHNqZGIpIHwJNDg0MzY5OA0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogR1QvQUcgfAk1MjM3Mjg0DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBHQy9BRyB8CTQyMzYwDQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBVC9BQyB8CTUxMjYNCiAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBOb24tY2Fub25pY2FsIHwJNTI4MjENCiAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaCByYXRlIHBlciBiYXNlLCAlIHwJMC4zOCUNCiAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbiByYXRlIHBlciBiYXNlIHwJMC4wMSUNCiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIGF2ZXJhZ2UgbGVuZ3RoIHwJMS42MQ0KICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAxJQ0KICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjM1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VTFRJLU1BUFBJTkcgUkVBRFM6DQogICAgICAgIE51bWJlciBvZiByZWFkcyBtYXBwZWQgdG8gbXVsdGlwbGUgbG9jaSB8CTE3NDUyMTANCiAgICAgICAgICAgICAlIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJNi4wMyUNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byB0b28gbWFueSBsb2NpIHwJNDE3NTkNCiAgICAgICAgICAgICAlIG9mIHJlYWRzIG1hcHBlZCB0byB0b28gbWFueSBsb2NpIHwJMC4xNCUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTk1BUFBFRCBSRUFEUzoNCiAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gbWFueSBtaXNtYXRjaGVzIHwJMC4wMCUNCiAgICAgICAgICAgICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogdG9vIHNob3J0IHwJMTEuMTMlDQogICAgICAgICAgICAgICAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiBvdGhlciB8CTAuMTQlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJTUVSSUMgUkVBRFM6DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBjaGltZXJpYyByZWFkcyB8CTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIG9mIGNoaW1lcmljIHJlYWRzIHwJMC4wMCUNCg0KYGBgDQoNCg0KDQoNCmBgYA0Kfi9yZXN1bHRzL3JuYXNlcS9Sbi9zdGFyX3JhdC90cmFuc2NyaXB0b21lT3V0JCBTVEFSIC0tcnVuVGhyZWFkTiAxMiAtLWdlbm9tZURpciB+L2dlbm9tZUFuZEluZGljZXMvUm4vc3Rhci8gLS1zamRiR1RGZmlsZSB+L2dlbm9tZUFuZEluZGljZXMvUm4vcm42LnJlZkdlbmUuZ3RmIC0tc2pkYk92ZXJoYW5nIDEwMCAtLXJlYWRGaWxlc0luIH4vZGF0YS9ybmFzZXEvUm4vUExvUy1PbmUtOC1lNTk1ODIvZjM0NF9wZmNfbmljb3RpbmUvU1JSODY5MDMzXzEuZmFzdHEuZ3ogfi9kYXRhL3JuYXNlcS9Sbi9QTG9TLU9uZS04LWU1OTU4Mi9mMzQ0X3BmY19uaWNvdGluZS9TUlI4NjkwMzNfMi5mYXN0cS5neiAtLXJlYWRGaWxlc0NvbW1hbmQgemNhdCAtLXF1YW50TW9kZSBUcmFuc2NyaXB0b21lU0FNIC0tb3V0RmlsZU5hbWVQcmVmaXggNWFsaWduLw0KDQpgYGANCg0KQXByIDExIDE2OjMyOjQ0IC4uLi4uIHN0YXJ0ZWQgU1RBUiBydW4NCg0KQXByIDExIDE2OjMyOjQ0IC4uLi4uIGxvYWRpbmcgZ2Vub21lDQoNCkFwciAxMSAxNjozNDoyNiAuLi4uLiBwcm9jZXNzaW5nIGFubm90YXRpb25zIEdURg0KDQpBcHIgMTEgMTY6MzQ6MjggLi4uLi4gaW5zZXJ0aW5nIGp1bmN0aW9ucyBpbnRvIHRoZSBnZW5vbWUgaW5kaWNlcw0KDQpBcHIgMTEgMTY6MzY6NDAgLi4uLi4gc3RhcnRlZCBtYXBwaW5nDQoNCkFwciAxMSAxNjo0MDoyNCAuLi4uLiBmaW5pc2hlZCBzdWNjZXNzZnVsbHkNCg0KDQojIyMjICQgbHMgLWwgNWFsaWduLw0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDExMTUyODcxNzE2IEFwciAxMSAxNjo0MCBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDE2NTAzMTUwOTggQXByIDExIDE2OjQwIEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NjMgQXByIDExIDE2OjQwIExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyOTEwMDYgQXByIDExIDE2OjQwIExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA2MDAgQXByIDExIDE2OjQwIExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDY5NDMwMjggQXByIDExIDE2OjQwIFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByIDExIDE2OjM0IF9TVEFSZ2Vub21lDQoNCg0KDQoNCg0KIyMjIyAkIGNhdCA1YWxpZ24vTG9nLmZpbmFsLm91dCANCg0KYGBgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydGVkIGpvYiBvbiB8CUFwciAxMSAxNjozMjo0NA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydGVkIG1hcHBpbmcgb24gfAlBcHIgMTEgMTY6MzY6NDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmlzaGVkIG9uIHwJQXByIDExIDE2OjQwOjI0DQogICAgICAgTWFwcGluZyBzcGVlZCwgTWlsbGlvbiBvZiByZWFkcyBwZXIgaG91ciB8CTQ4My4wNw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBpbnB1dCByZWFkcyB8CTMwMDU3NDU4DQogICAgICAgICAgICAgICAgICAgICAgQXZlcmFnZSBpbnB1dCByZWFkIGxlbmd0aCB8CTEwMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JUVVFIFJFQURTOg0KICAgICAgICAgICAgICAgICAgIFVuaXF1ZWx5IG1hcHBlZCByZWFkcyBudW1iZXIgfAkyNDI0MjAyNg0KICAgICAgICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzICUgfAk4MC42NSUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgQXZlcmFnZSBtYXBwZWQgbGVuZ3RoIHwJOTkuMzkNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IFRvdGFsIHwJNTQ2NDMxMA0KICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEFubm90YXRlZCAoc2pkYikgfAk0OTY5ODQ1DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBHVC9BRyB8CTUzNjUwMjMNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdDL0FHIHwJNDI0ODENCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEFUL0FDIHwJNTE3OA0KICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IE5vbi1jYW5vbmljYWwgfAk1MTYyOA0KICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoIHJhdGUgcGVyIGJhc2UsICUgfAkwLjM3JQ0KICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAxJQ0KICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjYwDQogICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gcmF0ZSBwZXIgYmFzZSB8CTAuMDAlDQogICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvbiBhdmVyYWdlIGxlbmd0aCB8CTEuMzYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMVEktTUFQUElORyBSRUFEUzoNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJMTgxNjI0NQ0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIG11bHRpcGxlIGxvY2kgfAk2LjA0JQ0KICAgICAgICBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAk0NDg4Ng0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAkwLjE1JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOTUFQUEVEIFJFQURTOg0KICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IHRvbyBtYW55IG1pc21hdGNoZXMgfAkwLjAwJQ0KICAgICAgICAgICAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gc2hvcnQgfAkxMy4wMyUNCiAgICAgICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IG90aGVyIHwJMC4xMyUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElNRVJJQyBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoaW1lcmljIHJlYWRzIHwJMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgb2YgY2hpbWVyaWMgcmVhZHMgfAkwLjAwJQ0KDQoNCmBgYA0KDQoNCg0KDQoNCmBgYA0Kfi9yZXN1bHRzL3JuYXNlcS9Sbi9zdGFyX3JhdC90cmFuc2NyaXB0b21lT3V0JCBTVEFSIC0tcnVuVGhyZWFkTiAxMiAtLWdlbm9tZURpciB+L2dlbm9tZUFuZEluZGljZXMvUm4vc3Rhci8gLS1zamRiR1RGZmlsZSB+L2dlbm9tZUFuZEluZGljZXMvUm4vcm42LnJlZkdlbmUuZ3RmIC0tc2pkYk92ZXJoYW5nIDEwMCAtLXJlYWRGaWxlc0luIH4vZGF0YS9ybmFzZXEvUm4vUExvUy1PbmUtOC1lNTk1ODIvZjM0NF9wZmNfbmljb3RpbmUvU1JSODY5MDM0XzEuZmFzdHEuZ3ogfi9kYXRhL3JuYXNlcS9Sbi9QTG9TLU9uZS04LWU1OTU4Mi9mMzQ0X3BmY19uaWNvdGluZS9TUlI4NjkwMzRfMi5mYXN0cS5neiAtLXJlYWRGaWxlc0NvbW1hbmQgemNhdCAtLXF1YW50TW9kZSBUcmFuc2NyaXB0b21lU0FNIC0tb3V0RmlsZU5hbWVQcmVmaXggNmFsaWduLw0KDQpgYGANCg0KDQpBcHIgMTEgMTY6NDE6NDYgLi4uLi4gc3RhcnRlZCBTVEFSIHJ1bg0KDQpBcHIgMTEgMTY6NDE6NDYgLi4uLi4gbG9hZGluZyBnZW5vbWUNCg0KQXByIDExIDE2OjQyOjU0IC4uLi4uIHByb2Nlc3NpbmcgYW5ub3RhdGlvbnMgR1RGDQoNCkFwciAxMSAxNjo0Mjo1NSAuLi4uLiBpbnNlcnRpbmcganVuY3Rpb25zIGludG8gdGhlIGdlbm9tZSBpbmRpY2VzDQoNCkFwciAxMSAxNjo0NTowOCAuLi4uLiBzdGFydGVkIG1hcHBpbmcNCg0KQXByIDExIDE2OjQ4OjQ5IC4uLi4uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQ0KDQoNCg0KDQoNCiMjIyMgJCBscyAtbCA2YWxpZ24vDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDExNDUxOTE1ODI1IEFwciAxMSAxNjo0OCBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDE3MTkxMzU0MjAgQXByIDExIDE2OjQ4IEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NjIgQXByIDExIDE2OjQ4IExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyOTEwMDYgQXByIDExIDE2OjQ4IExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA2MDAgQXByIDExIDE2OjQ4IExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDY4NDA0MzcgQXByIDExIDE2OjQ4IFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByIDExIDE2OjQyIF9TVEFSZ2Vub21lDQoNCg0KDQoNCiMjIyMgJCBjYXQgNmFsaWduL0xvZy5maW5hbC5vdXQgDQoNCg0KDQpgYGANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWQgam9iIG9uIHwJQXByIDExIDE2OjQxOjQ2DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWQgbWFwcGluZyBvbiB8CUFwciAxMSAxNjo0NTowOA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluaXNoZWQgb24gfAlBcHIgMTEgMTY6NDg6NDkNCiAgICAgICBNYXBwaW5nIHNwZWVkLCBNaWxsaW9uIG9mIHJlYWRzIHBlciBob3VyIHwJNDg1LjY3DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGlucHV0IHJlYWRzIHwJMjk4MTQ2ODcNCiAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIGlucHV0IHJlYWQgbGVuZ3RoIHwJMTAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklRVUUgUkVBRFM6DQogICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzIG51bWJlciB8CTI1MDI5NTgyDQogICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWVseSBtYXBwZWQgcmVhZHMgJSB8CTgzLjk1JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIG1hcHBlZCBsZW5ndGggfAk5OS40MA0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogVG90YWwgfAk1NjY0ODAxDQogICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogQW5ub3RhdGVkIChzamRiKSB8CTUxNTIyMTcNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdUL0FHIHwJNTU2MDI0Ng0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogR0MvQUcgfAk0NDU4OQ0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogQVQvQUMgfAk1NTA0DQogICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogTm9uLWNhbm9uaWNhbCB8CTU0NDYyDQogICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2ggcmF0ZSBwZXIgYmFzZSwgJSB8CTAuMzglDQogICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb24gcmF0ZSBwZXIgYmFzZSB8CTAuMDElDQogICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbiBhdmVyYWdlIGxlbmd0aCB8CTEuNjENCiAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvbiByYXRlIHBlciBiYXNlIHwJMC4wMCUNCiAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0aW9uIGF2ZXJhZ2UgbGVuZ3RoIHwJMS4zNg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVUxUSS1NQVBQSU5HIFJFQURTOg0KICAgICAgICBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIHRvIG11bHRpcGxlIGxvY2kgfAkxODM0NzUzDQogICAgICAgICAgICAgJSBvZiByZWFkcyBtYXBwZWQgdG8gbXVsdGlwbGUgbG9jaSB8CTYuMTUlDQogICAgICAgIE51bWJlciBvZiByZWFkcyBtYXBwZWQgdG8gdG9vIG1hbnkgbG9jaSB8CTQwOTI0DQogICAgICAgICAgICAgJSBvZiByZWFkcyBtYXBwZWQgdG8gdG9vIG1hbnkgbG9jaSB8CTAuMTQlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5NQVBQRUQgUkVBRFM6DQogICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogdG9vIG1hbnkgbWlzbWF0Y2hlcyB8CTAuMDAlDQogICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IHRvbyBzaG9ydCB8CTkuNjMlDQogICAgICAgICAgICAgICAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiBvdGhlciB8CTAuMTMlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJTUVSSUMgUkVBRFM6DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBjaGltZXJpYyByZWFkcyB8CTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIG9mIGNoaW1lcmljIHJlYWRzIHwJMC4wMCUNCg0KYGBgDQoNCg0KDQoNCg0KDQojIyA2LiBSU0VNIGFuYWx5c2lzDQoNCg0KIyMjIERvd25sb2FkIHRoZSBkYXRhDQoNCkJBTSBmaWxlcyB3ZXJlIGltcG9ydGVkIHRvIENlbnRPUyBhcyBkaXJlY3RvcmllcyAoMXMsIDJzLCAzcywgNHMsIDVzIGFuZCA2cykgZm9yIFJTRU0gYW5hbHlzaXMuIFRoZSBnZW5vbWUgYW5kIEdURiBmaWxlcyBhcmUgd2VyZSBhbHNvIGltcG9ydGVkICgmIGFsc28gcmVuYW1lZCkuDQoNCg0KIyMjIyAgJCBscyAtbA0KDQoNCmRyd3hyLXhyLXguIDIgYmRhc2ggYmRhc2ggICAgICAgICA0NSBBcHIgMTEgMjA6MTcgMXMNCg0KZHJ3eHIteHIteC4gMiBiZGFzaCBiZGFzaCAgICAgICAgIDQ1IEFwciAxMSAxODoyMSAycw0KDQpkcnd4ci14ci14LiAyIGJkYXNoIGJkYXNoICAgICAgICAgNDUgQXByIDExIDIwOjIwIDNzDQoNCmRyd3hyLXhyLXguIDIgYmRhc2ggYmRhc2ggICAgICAgICA0NSBBcHIgMTEgMjA6MjEgNHMNCg0KZHJ3eHIteHIteC4gMiBiZGFzaCBiZGFzaCAgICAgICAgIDQ1IEFwciAxMSAyMDoyNyA1cw0KDQpkcnd4ci14ci14LiAyIGJkYXNoIGJkYXNoICAgICAgICAgNDUgQXByIDExIDIwOjI3IDZzDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggMjkyNzYwNzMzMyBBcHIgIDkgMTU6MjYgcm42LmZhDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgICA0MDY1NCBBcHIgIDkgMTU6MjYgcm42LmZhLmZhaQ0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgNjE4OTEzNDEgQXByICA5IDE1OjI3IHJuNi5yZWZHZW5lLmd0Zg0KDQoNCg0KIyMjIFByZXBhcmUgUlNFTSByZWZlcmVuY2UgKHdpbGwgdXNlIGJvdGggdGhlIGZhIGFuZCBndGYgZmlsZSkNCg0KDQojIyMjIG1rZGlyIHJzZW1fcmVmDQoNCiMjIyMgY2QgcnNlbV9yZWYNCg0KIyMjIyByc2VtX3JlZiQgcnNlbS1wcmVwYXJlLXJlZmVyZW5jZSAtLWd0ZiBybjYucmVmR2VuZS5ndGYgcm42LmZhIC4vcnNlbVJlZg0KDQoNCmBgYA0KDQpyc2VtLWV4dHJhY3QtcmVmZXJlbmNlLXRyYW5zY3JpcHRzIC4vcnNlbVJlZiAwIHJuNi5yZWZHZW5lLmd0ZiBOb25lIDAgcm42LmZhDQoNClBhcnNlZCAyMDAwMDAgbGluZXMNCg0KUGFyc2luZyBndGYgRmlsZSBpcyBkb25lIQ0KDQpybjYuZmEgaXMgcHJvY2Vzc2VkIQ0KDQoxODkzOSB0cmFuc2NyaXB0cyBhcmUgZXh0cmFjdGVkIGFuZCAwIHRyYW5zY3JpcHRzIGFyZSBvbWl0dGVkLg0KDQpFeHRyYWN0aW5nIHNlcXVlbmNlcyBpcyBkb25lIQ0KDQpHcm91cCBGaWxlIGlzIGdlbmVyYXRlZCENCg0KVHJhbnNjcmlwdCBJbmZvcm1hdGlvbiBGaWxlIGlzIGdlbmVyYXRlZCENCg0KQ2hyb21vc29tZSBMaXN0IEZpbGUgaXMgZ2VuZXJhdGVkIQ0KDQpFeHRyYWN0ZWQgU2VxdWVuY2VzIEZpbGUgaXMgZ2VuZXJhdGVkIQ0KDQpyc2VtLXByZXJlZiAuL3JzZW1SZWYudHJhbnNjcmlwdHMuZmEgMSAuL3JzZW1SZWYNCg0KUmVmcy5tYWtlUmVmcyBmaW5pc2hlZCENCg0KUmVmcy5zYXZlUmVmcyBmaW5pc2hlZCENCg0KLi9yc2VtUmVmLmlkeC5mYSBpcyBnZW5lcmF0ZWQhDQoNCi4vcnNlbVJlZi5uMmcuaWR4LmZhIGlzIGdlbmVyYXRlZCENCg0KYGBgDQoNCg0KIyMjIyBzdGFyLXRyYW5zY3JpcHRvbWVvdXQkIGxzIC1sIHJzZW1fcmVmLw0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgICAxMjkzIEFwciAxMSAyMTowNiByc2VtUmVmLmNocmxpc3QNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA5MzcxOCBBcHIgMTEgMjE6MDYgcnNlbVJlZi5ncnANCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA0MzAwNzI4OSBBcHIgMTEgMjE6MDYgcnNlbVJlZi5pZHguZmENCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA0MzAwNzI4OSBBcHIgMTEgMjE6MDYgcnNlbVJlZi5uMmcuaWR4LmZhDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggNDU4NTg0MTIgQXByIDExIDIxOjA2IHJzZW1SZWYuc2VxDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggIDYwNDExMDggQXByIDExIDIxOjA2IHJzZW1SZWYudGkNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA0MzAwNzI4OSBBcHIgMTEgMjE6MDYgcnNlbVJlZi50cmFuc2NyaXB0cy5mYQ0KDQoNCg0KIyMjIFJTRU0tY2FsY3VsYXRlLWV4cHJlc3Npb24NCg0KDQojIyMjIHN0YXItdHJhbnNjcmlwdG9tZW91dCQgcnNlbS1jYWxjdWxhdGUtZXhwcmVzc2lvbiAtLWJhbSAtLW5vLWJhbS1vdXRwdXQgLXAgMTIgLS1wYWlyZWQtZW5kIC0tZm9yd2FyZC1wcm9iIDAgMXMvQWxpZ25lZC50b1RyYW5zY3JpcHRvbWUub3V0LmJhbSByc2VtX3JlZi9yc2VtUmVmIDFvdXQvID4mIHJzZW0xLmxvZw0KDQoNCiMjIyMgUmVwZWF0IGl0IGZvciB0aGUgcmVzdCBvZiB0aGUgYmFtIGZpbGVzDQoNCg0KDQoNCg0KIyMjIyAgIHN0YXItdHJhbnNjcmlwdG9tZW91dCQgbHMgLWwNCg0KZHJ3eHJ3eHIteC4gMyBiZGFzaCBiZGFzaCAgICAgICAgIDY2IEFwciAxMSAyMjo0MSAxb3V0DQoNCmRyd3hyd3hyLXguIDMgYmRhc2ggYmRhc2ggICAgICAgICA2NiBBcHIgMTEgMjM6NTYgMm91dA0KDQpkcnd4cnd4ci14LiAzIGJkYXNoIGJkYXNoICAgICAgICAgNjYgQXByIDEyIDAzOjQ4IDNvdXQNCg0KZHJ3eHJ3eHIteC4gMyBiZGFzaCBiZGFzaCAgICAgICAgIDY2IEFwciAxMiAwMzoxMyA0b3V0DQoNCmRyd3hyd3hyLXguIDMgYmRhc2ggYmRhc2ggICAgICAgICA2NiBBcHIgMTIgMDI6NDggNW91dA0KDQpkcnd4cnd4ci14LiAzIGJkYXNoIGJkYXNoICAgICAgICAgNjYgQXByIDEyIDAxOjU0IDZvdXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMzA5MTQxIEFwciAxMSAyMjo0MSByc2VtMS5sb2cNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMzUzODU1IEFwciAxMSAyMzo1NiByc2VtMi5sb2cNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMjU1NTg4IEFwciAxMiAwMzo0OCByc2VtMy5sb2cNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMzI2NjYyIEFwciAxMiAwMzoxMyByc2VtNC5sb2cNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMzY2NDcyIEFwciAxMiAwMjo0OCByc2VtNS5sb2cNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMjk0NDAyIEFwciAxMiAwMTo1NCByc2VtNi5sb2cNCg0KZHJ3eHJ3eHIteC4gMiBiZGFzaCBiZGFzaCAgICAgICAgMTYzIEFwciAxMSAyMToyMCByc2VtX3JlZg0KDQoNCg0KDQoNCiMjIDcuIEFuYWx5emUgaXNvZm9ybSByZXN1bHRzDQoNCg0KIyMjIFNvbWUgZmlsZS9kaXJlY3RvcnkgIGNvbnRlbnRzIA0KDQoNCg0KYGBge3J9DQpkYXRhID0gcmVhZC50YWJsZSgiMW91dC8uaXNvZm9ybXMucmVzdWx0cyIsIGhlYWRlcj1ULCBzdHJpbmdzQXNGYWN0b3JzPUYpDQpoZWFkKGRhdGEpDQpgYGANCg0KDQoNCg0KYGBge3J9DQpkYXRhID0gcmVhZC50YWJsZSgiMW91dC8uaXNvZm9ybXMucmVzdWx0cyIsIGhlYWRlcj1ULCBzdHJpbmdzQXNGYWN0b3JzPUYpDQppZHggPSBvcmRlcihkYXRhWywiVFBNIl0sIGRlY3JlYXNpbmc9VCkNCmRhdGFbaWR4WzE6MTBdLCBjKCJnZW5lX2lkIiwgInRyYW5zY3JpcHRfaWQiICwiZXhwZWN0ZWRfY291bnQiLCAiVFBNIiwgIklzb1BjdCIpXQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmRhdGEgPSByZWFkLnRhYmxlKCIyb3V0Ly5pc29mb3Jtcy5yZXN1bHRzIiwgaGVhZGVyPVQsIHN0cmluZ3NBc0ZhY3RvcnM9RikNCmlkeCA9IG9yZGVyKGRhdGFbLCJUUE0iXSwgZGVjcmVhc2luZz1UKQ0KZGF0YVtpZHhbMToxMF0sIGMoImdlbmVfaWQiLCAidHJhbnNjcmlwdF9pZCIsICJleHBlY3RlZF9jb3VudCIsICJUUE0iLCAiSXNvUGN0IildDQpgYGANCg0KDQpgYGB7cn0NCmRhdGEgPSByZWFkLnRhYmxlKCIzb3V0Ly5pc29mb3Jtcy5yZXN1bHRzIiwgaGVhZGVyPVQsIHN0cmluZ3NBc0ZhY3RvcnM9RikNCmlkeCA9IG9yZGVyKGRhdGFbLCJUUE0iXSwgZGVjcmVhc2luZz1UKQ0KZGF0YVtpZHhbMToxMF0sIGMoImdlbmVfaWQiLCAidHJhbnNjcmlwdF9pZCIsICJleHBlY3RlZF9jb3VudCIsICJUUE0iLCAiSXNvUGN0IildDQpgYGANCg0KDQpgYGB7cn0NCmRhdGEgPSByZWFkLnRhYmxlKCI0b3V0Ly5pc29mb3Jtcy5yZXN1bHRzIiwgaGVhZGVyPVQsIHN0cmluZ3NBc0ZhY3RvcnM9RikNCmlkeCA9IG9yZGVyKGRhdGFbLCJUUE0iXSwgZGVjcmVhc2luZz1UKQ0KZGF0YVtpZHhbMToxMF0sIGMoImdlbmVfaWQiLCAidHJhbnNjcmlwdF9pZCIsICJleHBlY3RlZF9jb3VudCIsICJUUE0iLCAiSXNvUGN0IildDQpgYGANCg0KDQpgYGB7cn0NCmRhdGEgPSByZWFkLnRhYmxlKCI1b3V0Ly5pc29mb3Jtcy5yZXN1bHRzIiwgaGVhZGVyPVQsIHN0cmluZ3NBc0ZhY3RvcnM9RikNCmlkeCA9IG9yZGVyKGRhdGFbLCJUUE0iXSwgZGVjcmVhc2luZz1UKQ0KZGF0YVtpZHhbMToxMF0sIGMoImdlbmVfaWQiLCAidHJhbnNjcmlwdF9pZCIsICJleHBlY3RlZF9jb3VudCIsICJUUE0iLCAiSXNvUGN0IildDQpgYGANCg0KDQpgYGB7cn0NCmRhdGEgPSByZWFkLnRhYmxlKCI2b3V0Ly5pc29mb3Jtcy5yZXN1bHRzIiwgaGVhZGVyPVQsIHN0cmluZ3NBc0ZhY3RvcnM9RikNCmlkeCA9IG9yZGVyKGRhdGFbLCJUUE0iXSwgZGVjcmVhc2luZz1UKQ0KZGF0YVtpZHhbMToxMF0sIGMoImdlbmVfaWQiLCAidHJhbnNjcmlwdF9pZCIsICJleHBlY3RlZF9jb3VudCIsICJUUE0iLCAiSXNvUGN0IildDQpgYGANCg0KDQoNCg0KDQojIyMgR2VuZXJhdGUgYSBkYXRhIG1hdHJpeCBvZiBpc29mb3JtcyBmb3IgRUJTZXEgYW5hbHlzaXMNCg0KIyMjIyAgIHN0YXItdHJhbnNjcmlwdG9tZW91dCQgcnNlbS1nZW5lcmF0ZS1kYXRhLW1hdHJpeCAxb3V0Ly5pc29mb3Jtcy5yZXN1bHRzIDJvdXQvLmlzb2Zvcm1zLnJlc3VsdHMgM291dC8uaXNvZm9ybXMucmVzdWx0cyA0b3V0Ly5pc29mb3Jtcy5yZXN1bHRzIDVvdXQvLmlzb2Zvcm1zLnJlc3VsdHMgNm91dC8uaXNvZm9ybXMucmVzdWx0cyA+IGlzb01hdC50eHQNCg0KDQojIyMjICAgc3Rhci10cmFuc2NyaXB0b21lb3V0JCBoZWFkIGlzb01hdC50eHQgDQoNCg0KYGBgDQoJIjFvdXQvLmlzb2Zvcm1zLnJlc3VsdHMiCSIyb3V0Ly5pc29mb3Jtcy5yZXN1bHRzIgkiM291dC8uaXNvZm9ybXMucmVzdWx0cyINCgkNCgkiNG91dC8uaXNvZm9ybXMucmVzdWx0cyIJIjVvdXQvLmlzb2Zvcm1zLnJlc3VsdHMiCSI2b3V0Ly5pc29mb3Jtcy5yZXN1bHRzIg0KCQ0KIk5NXzAyMjI1OCIJMC4wMAkxLjAwCTAuMDAJMC4wMAkxLjAwCTAuMDANCg0KIk5NXzEzMzQwMCIJMC4wMAkwLjAwCTAuMDAJMC4wMAkwLjAwCTAuMDANCg0KIk5NXzAxMjQ4OCIJMzMuMDAJNTEuNTAJMTQuMDAJMzQuNTAJMTM3LjAwCTIzLjUwDQoNCiJOTV8wMTI0ODhfMiIJMzMuMDAJNTEuNTAJMTQuMDAJMzQuNTAJMTM3LjAwCTIzLjUwDQoNCiJOTV8xMzg1MjQiCTEzLjAwCTguMDAJMTkuMDAJOS4wMAkxOS4wMAkyMC4wMA0KDQoiTk1fMDIyMjQwIgkwLjAwCTAuMDAJMC4wMAkwLjAwCTUuMDAJMS4wMA0KDQoiTlJfMDAyMTU2IgkzLjAwCTEuMDAJMC4wMAkxLjAwCTEuMDAJMC4wMA0KDQoiTk1fMDAxMTA2Nzk1IgkxNjYuMDAJMTcxLjAwCTE0MS4wMAkxMTAuMDAJMTA4LjAwCTExMi4wMA0KDQoiTk1fMDIzMTA0Igk4NTQuMDAJNTgwLjAwCTY0Ny4wMAk0OTEuMDAJNDc0LjAwCTU0Ny4wMA0KDQpgYGANCg0KIyMgOC4gRUJTZXEgYW5hbHlzaXMgb2YgaXNvZm9ybXMNCg0KDQpgYGB7cn0NCmxpYnJhcnkoRUJTZXEpDQoNCmBgYA0KDQoNCg0KYGBge3J9DQpJc29NYXQgPC0gZGF0YS5tYXRyaXgocmVhZC50YWJsZShmaWxlPSJpc29NYXQudHh0IikpDQpzdHIoSXNvTWF0KQ0KYGBgDQoNCg0KDQpgYGB7cn0NClNpemVzPU1lZGlhbk5vcm0oSXNvTWF0KQ0KaGVhZChTaXplcykNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCkVCT3V0PUVCVGVzdChEYXRhPUlzb01hdCwgQ29uZGl0aW9ucz1hcy5mYWN0b3IocmVwKGMoIkMxIiwiQzIiKSxlYWNoPTMpKSxzaXplRmFjdG9ycz1TaXplcywgbWF4cm91bmQ9NSkNCg0KYGBgDQoNCmBgYHtyfQ0KbmFtZXMoRUJPdXQpDQpgYGANCg0KDQpgYGB7cn0NCkVCREVSZXM9R2V0REVSZXN1bHRzKEVCT3V0LCBGRFI9MC4wNSkNCnN0cihFQkRFUmVzKQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KRUJERVJlcyRERWZvdW5kDQpgYGANCg0KDQpgYGB7cn0NCmhlYWQoRUJERVJlcyRQUE1hdCkNCmBgYA0KDQoNCg0KYGBge3J9DQp0YWJsZShFQkRFUmVzJFN0YXR1cykNCmBgYA0KDQoNCg0KDQojIyA4LiBBbmFseXplIGdlbmVzIHJlc3VsdHMNCg0KIyMjIFNvbWUgZmlsZSBjb250ZW50cw0KDQoNCmBgYHtyfQ0KZGF0YSA9IHJlYWQudGFibGUoIjFvdXQvLmdlbmVzLnJlc3VsdHMiLCBoZWFkZXI9VCwgc3RyaW5nc0FzRmFjdG9ycz1GKQ0KaWR4ID0gb3JkZXIoZGF0YVssIlRQTSJdLCBkZWNyZWFzaW5nPVQpDQpkYXRhW2lkeFsxOjEwXSwgYygiZ2VuZV9pZCIsICJleHBlY3RlZF9jb3VudCIsICJUUE0iKV0NCmBgYA0KDQoNCg0KDQpgYGB7cn0NCmRhdGEgPSByZWFkLnRhYmxlKCIyb3V0Ly5nZW5lcy5yZXN1bHRzIiwgaGVhZGVyPVQsIHN0cmluZ3NBc0ZhY3RvcnM9RikNCmlkeCA9IG9yZGVyKGRhdGFbLCJUUE0iXSwgZGVjcmVhc2luZz1UKQ0KZGF0YVtpZHhbMToxMF0sIGMoImdlbmVfaWQiLCAiZXhwZWN0ZWRfY291bnQiLCAiVFBNIildDQpgYGANCg0KDQpgYGB7cn0NCmRhdGEgPSByZWFkLnRhYmxlKCIzb3V0Ly5nZW5lcy5yZXN1bHRzIiwgaGVhZGVyPVQsIHN0cmluZ3NBc0ZhY3RvcnM9RikNCmlkeCA9IG9yZGVyKGRhdGFbLCJUUE0iXSwgZGVjcmVhc2luZz1UKQ0KZGF0YVtpZHhbMToxMF0sIGMoImdlbmVfaWQiLCAiZXhwZWN0ZWRfY291bnQiLCAiVFBNIildDQpgYGANCg0KDQpgYGB7cn0NCmRhdGEgPSByZWFkLnRhYmxlKCI0b3V0Ly5nZW5lcy5yZXN1bHRzIiwgaGVhZGVyPVQsIHN0cmluZ3NBc0ZhY3RvcnM9RikNCmlkeCA9IG9yZGVyKGRhdGFbLCJUUE0iXSwgZGVjcmVhc2luZz1UKQ0KZGF0YVtpZHhbMToxMF0sIGMoImdlbmVfaWQiLCAiZXhwZWN0ZWRfY291bnQiLCAiVFBNIildDQpgYGANCg0KDQoNCg0KYGBge3J9DQpkYXRhID0gcmVhZC50YWJsZSgiNW91dC8uZ2VuZXMucmVzdWx0cyIsIGhlYWRlcj1ULCBzdHJpbmdzQXNGYWN0b3JzPUYpDQppZHggPSBvcmRlcihkYXRhWywiVFBNIl0sIGRlY3JlYXNpbmc9VCkNCmRhdGFbaWR4WzE6MTBdLCBjKCJnZW5lX2lkIiwgImV4cGVjdGVkX2NvdW50IiwgIlRQTSIpXQ0KYGBgDQoNCg0KYGBge3J9DQpkYXRhID0gcmVhZC50YWJsZSgiNm91dC8uZ2VuZXMucmVzdWx0cyIsIGhlYWRlcj1ULCBzdHJpbmdzQXNGYWN0b3JzPUYpDQppZHggPSBvcmRlcihkYXRhWywiVFBNIl0sIGRlY3JlYXNpbmc9VCkNCmRhdGFbaWR4WzE6MTBdLCBjKCJnZW5lX2lkIiwgImV4cGVjdGVkX2NvdW50IiwgIlRQTSIpXQ0KYGBgDQoNCg0KDQojIyMgR2VuZXJhdGUgYSBkYXRhIG1hdHJpeCBmb3IgZ2VuZXMgcmVzdWx0cyBmb3IgRUJTZXEgYW5hbHlzaXMNCg0KDQoNCiMjIyMgc3Rhci10cmFuc2NyaXB0b21lb3V0JCByc2VtLWdlbmVyYXRlLWRhdGEtbWF0cml4IDFvdXQvLmdlbmVzLnJlc3VsdHMgMm91dC8uZ2VuZXMucmVzdWx0cyAzb3V0Ly5nZW5lcy5yZXN1bHRzIDRvdXQvLmdlbmVzLnJlc3VsdHMgNW91dC8uZ2VuZXMucmVzdWx0cyA2b3V0Ly5nZW5lcy5yZXN1bHRzID4gZ2VuZU1hdC50eHQNCg0KDQoNCg0KIyMjIyBzdGFyLXRyYW5zY3JpcHRvbWVvdXRdJCBoZWFkIGdlbmVNYXQudHh0IA0KDQoNCmBgYA0KDQoiMW91dC8uZ2VuZXMucmVzdWx0cyIJIjJvdXQvLmdlbmVzLnJlc3VsdHMiCSIzb3V0Ly5nZW5lcy5yZXN1bHRzIgkiNG91dC8uZ2VuZXMucmVzdWx0cyIJIjVvdXQvLmdlbmVzLnJlc3VsdHMiCSI2b3V0Ly5nZW5lcy5yZXN1bHRzIg0KCQ0KCQ0KIkExYmciCTAuMDAJMS4wMAkwLjAwCTAuMDAJMS4wMAkwLjAwDQoNCiJBMWNmIgkwLjAwCTAuMDAJMC4wMAkwLjAwCTAuMDAJMC4wMA0KDQoiQTJtIgk2Ni4wMAkxMDMuMDAJMjguMDAJNjkuMDAJMjc0LjAwCTQ3LjAwDQoNCiJBM2dhbHQyIgkxMy4wMAk4LjAwCTE5LjAwCTkuMDAJMTkuMDAJMjAuMDANCg0KIkE0Z2FsdCIJMC4wMAkwLjAwCTAuMDAJMC4wMAk1LjAwCTEuMDANCg0KIkFBOTI2MDYzIgkzLjAwCTEuMDAJMC4wMAkxLjAwCTEuMDAJMC4wMA0KDQoiQWFhcyIJMTY2LjAwCTE3MS4wMAkxNDEuMDAJMTEwLjAwCTEwOC4wMAkxMTIuMDANCg0KIkFhY3MiCTg1NC4wMAk1ODAuMDAJNjQ3LjAwCTQ5MS4wMAk0NzQuMDAJNTQ3LjAwDQoNCiJBYWRhYyIJMC4wMAkwLjAwCTAuMDAJMC4wMAkwLjAwCTAuMDANCg0KYGBgDQoNCg0KIyMgOS4gRUJTZXEgYW5hbHlzaXMgZm9yIGdlbmVzDQoNCg0KYGBge3J9DQoNCmxpYnJhcnkoRUJTZXEpDQoNCmBgYA0KDQpgYGB7cn0NCg0KR2VuZU1hdCA8LSBkYXRhLm1hdHJpeChyZWFkLnRhYmxlKGZpbGU9ImdlbmVNYXQudHh0IikpDQoNCnN0cihHZW5lTWF0KQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KU2l6ZXM9TWVkaWFuTm9ybShHZW5lTWF0KQ0KaGVhZChTaXplcykNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCg0KRUJPdXQ9RUJUZXN0KERhdGE9R2VuZU1hdCwgQ29uZGl0aW9ucz1hcy5mYWN0b3IocmVwKGMoIkMxIiwiQzIiKSxlYWNoPTMpKSxzaXplRmFjdG9ycz1TaXplcywgbWF4cm91bmQ9NSkNCg0KYGBgDQoNCg0KYGBge3J9DQpuYW1lcyhFQk91dCkNCmBgYA0KDQoNCmBgYHtyfQ0KRUJERVJlcz1HZXRERVJlc3VsdHMoRUJPdXQsIEZEUj0wLjA1KQ0Kc3RyKEVCREVSZXMpDQpgYGANCg0KYGBge3J9DQpFQkRFUmVzJERFZm91bmQNCg0KYGBgDQoNCmBgYHtyfQ0KaGVhZChFQkRFUmVzJFBQTWF0KQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnRhYmxlKEVCREVSZXMkU3RhdHVzKQ0KYGBgDQo=