Data, references and resources

Reference: Differential gene and transcript expression analysis of RNA-seq experiments with TopHat and Cufflinks. Nat Protoc. 7(3): 562-578.

Machine AWS m4.xlage

Downloads

~/tophat_spombe$ wget http://sourceforge.net/projects/trinityrnaseq/files/misc/TrinityNatureProtocolTutorial.tgz

………………………………

TrinityNatureProtocolTutorial.tgz 100%[==============================================================================================>] 452.06M 19.7MB/s in 24s

2019-04-01 01:52:20 (18.7 MB/s) - 2018TrinityNatureProtocolTutorial.tgz saved [474015394/474015394]

~/tophat_spombe$ wget ftp://ftp.pombase.org/pombe/genome_sequence_and_features/gff3/Schizosaccharomyces_pombe_all_chromosomes.gff3.gz

…………………………..

Schizosaccharomyces_pombe_all_chromosomes 100%[====================================================================================>] 458.59K 1.11MB/s in 0.4s

2019-04-01 01:29:09 (1.11 MB/s) - ‘Schizosaccharomyces_pombe_all_chromosomes.gff3.gz’ saved [469600]

~/tophat_spombe$ wget ftp://ftp.pombase.org/pombe/genome_sequence_and_features/genome_sequence/Schizosaccharomyces_pombe_all_chromosomes.fa.gz

……………………

Schizosaccharomyces_pombe_all_chromosomes.fa. 100%[==============================================================================================>] 3.60M 4.98MB/s in 0.7s

2019-04-01 01:29:55 (4.98 MB/s) - ‘Schizosaccharomyces_pombe_all_chromosomes.fa.gz’ saved [3773743]

~/tophat_spombe$ wget ftp://ftp.ensemblgenomes.org/pub/current/fungi/gtf/schizosaccharomyces_pombe/Schizosaccharomyces_pombe.ASM294v2.42.gtf.gz

…………………

Schizosaccharomyces_pombe.ASM294v2.42.gtf.gz 100%[==============================================================================================>] 785.85K 1.28MB/s in 0.6s

2019-04-01 01:38:59 (1.28 MB/s) - ‘Schizosaccharomyces_pombe.ASM294v2.42.gtf.gz’ saved [804707]

Directory contents

~/tophat_spombe$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 14544225 Apr 1 01:38 Schizosaccharomyces_pombe.ASM294v2.42.gtf

-rw-rw-r– 1 ubuntu ubuntu 12842130 Apr 1 01:29 Schizosaccharomyces_pombe_all_chromosomes.fa

-rw-rw-r– 1 ubuntu ubuntu 3445429 Apr 1 01:29 Schizosaccharomyces_pombe_all_chromosomes.gff3

-rw-rw-r– 1 ubuntu ubuntu 474015394 Feb 9 2013 TrinityNatureProtocolTutorial.tgz

~/tophat_spombe$ tar xvf TrinityNatureProtocolTutorial.tgz

TrinityNatureProtocolTutorial/ TrinityNatureProtocolTutorial/S_pombe_refTrans.fasta TrinityNatureProtocolTutorial/1M_READS_sample/ TrinityNatureProtocolTutorial/1M_READS_sample/Sp.hs.1M.left.fq TrinityNatureProtocolTutorial/1M_READS_sample/Sp.log.1M.right.fq TrinityNatureProtocolTutorial/1M_READS_sample/Sp.ds.1M.right.fq TrinityNatureProtocolTutorial/1M_READS_sample/Sp.ds.1M.left.fq TrinityNatureProtocolTutorial/1M_READS_sample/Sp.log.1M.left.fq TrinityNatureProtocolTutorial/1M_READS_sample/Sp.plat.1M.left.fq TrinityNatureProtocolTutorial/1M_READS_sample/Sp.plat.1M.right.fq TrinityNatureProtocolTutorial/1M_READS_sample/Sp.hs.1M.right.fq TrinityNatureProtocolTutorial/samples_n_reads_described.txt

~/tophat_spombe$ ls -l TrinityNatureProtocolTutorial

drwxrwxr-x 2 ubuntu ubuntu 4096 Feb 6 2013 1M_READS_sample

-rw-rw-r– 1 ubuntu ubuntu 7830629 Feb 6 2013 S_pombe_refTrans.fasta

-rw-rw-r– 1 ubuntu ubuntu 422 Feb 6 2013 samples_n_reads_described.txt

~/tophat_spombe$ ls -l TrinityNatureProtocolTutorial/1M_READS_sample/

-rw-rw-r– 1 ubuntu ubuntu 175846179 Feb 6 2013 Sp.ds.1M.left.fq

-rw-rw-r– 1 ubuntu ubuntu 175846179 Feb 6 2013 Sp.ds.1M.right.fq

-rw-rw-r– 1 ubuntu ubuntu 175736042 Feb 6 2013 Sp.hs.1M.left.fq

-rw-rw-r– 1 ubuntu ubuntu 175736042 Feb 6 2013 Sp.hs.1M.right.fq

-rw-rw-r– 1 ubuntu ubuntu 175741215 Feb 6 2013 Sp.log.1M.left.fq

-rw-rw-r– 1 ubuntu ubuntu 175741215 Feb 6 2013 Sp.log.1M.right.fq

-rw-rw-r– 1 ubuntu ubuntu 175899533 Feb 6 2013 Sp.plat.1M.left.fq

-rw-rw-r– 1 ubuntu ubuntu 175899533 Feb 6 2013 Sp.plat.1M.right.fq

Build a S. pombe genome index

~/tophat_spombe$ bowtie2-build genome_data/Schizosaccharomyces_pombe_all_chromosomes.fa genome

Settings: **Output files: "genome.*.bt2"** …………………..

Input files DNA, FASTA: genome_data/Schizosaccharomyces_pombe_all_chromosomes.fa

…………………………..

bmax according to bmaxDivN setting: 3157744 Using parameters –bmax 2368308 –dcv 1024 Doing ahead-of-time memory usage test Passed! Constructing with these parameters: –bmax 2368308 –dcv 1024

Constructing suffix-array element generator ………………….

Building DifferenceCoverSample ……………… Invoking Larsson-Sadakane on ranks time: 00:00:00

………………..

Calculating bucket sizes Binary sorting into buckets 10% 20% 30% 40% 50% 60% 70% 80% 90% 100% Binary sorting into buckets time: 00:00:00 Splitting and merging Splitting and merging time: 00:00:00 Split 1, merged 7; iterating…

…………………….

Avg bucket size: 1.57887e+06 (target: 2368307)

Converting suffix-array elements to index image

Allocating ftab, absorbFtab

Entering Ebwt loop

Getting block 1 of 8

………………..

……………… Constructing suffix-array element generator ……………

Exited Ebwt loop

fchr[A]: 0

fchr[C]: 4036348

fchr[G]: 6311338

fchr[T]: 8588523

fchr[$]: 12630977

Exiting Ebwt::buildToDisk()

Returning from initFromVector

Wrote 8405204 bytes to primary EBWT file: genome.rev.1.bt2

Wrote 3157752 bytes to secondary EBWT file: genome.rev.2.bt2

Re-opening _in1 and _in2 as input streams

Returning from Ebwt constructor

Headers:

len: 12630977
bwtLen: 12630978
sz: 3157745
bwtSz: 3157745
lineRate: 6
offRate: 4
offMask: 0xfffffff0
ftabChars: 10
eftabLen: 20
eftabSz: 80
ftabLen: 1048577
ftabSz: 4194308
offsLen: 789437
offsSz: 3157748
lineSz: 64
sideSz: 64
sideBwtSz: 48
sideBwtLen: 192
numSides: 65787
numLines: 65787
ebwtTotLen: 4210368
ebwtTotSz: 4210368
color: 0
reverse: 1

Total time for backward call to driver() for mirror index: 00:00:04

Additional directories and contents following the run

~/tophat_spombe$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 8405204 Apr 1 01:43 genome.1.bt2

-rw-rw-r– 1 ubuntu ubuntu 3157752 Apr 1 01:43 genome.2.bt2

-rw-rw-r– 1 ubuntu ubuntu 116 Apr 1 01:43 genome.3.bt2

-rw-rw-r– 1 ubuntu ubuntu 3157745 Apr 1 01:43 genome.4.bt2

-rw-rw-r– 1 ubuntu ubuntu 8405204 Apr 1 01:43 genome.rev.1.bt2

-rw-rw-r– 1 ubuntu ubuntu 3157752 Apr 1 01:43 genome.rev.2.bt2

drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 1 01:42 genome_data

Tophat: Map the reads for each sample to the reference genome

~/tophat_spombe$ tophat -I 1000 -i 20 –library-type fr-firststrand -o tophat.Sp_ds.dir genome TrinityNatureProtocolTutorial/1M_READS_sample/Sp.ds.1M.left.fq TrinityNatureProtocolTutorial/1M_READS_sample/Sp.ds.1M.right.fq

[2019-04-01 02:08:20] Beginning TopHat run (v2.1.1)

[2019-04-01 02:08:20] Checking for Bowtie Bowtie version: 2.2.5.0

[2019-04-01 02:08:20] Checking for Bowtie index files (genome)..

[2019-04-01 02:08:20] Checking for reference FASTA file

Warning: Could not find FASTA file genome.fa

[2019-04-01 02:08:20] Reconstituting reference FASTA file from Bowtie index Executing: /home/ubuntu/miniconda3/bin/bowtie2-inspect genome > tophat.Sp_ds.dir/tmp/genome.fa

[2019-04-01 02:08:20] Generating SAM header for genome

[2019-04-01 02:08:20] Preparing reads left reads: min. length=68, max. length=68, 997953 kept reads (2047 discarded)

right reads: min. length=68, max. length=68, 998472 kept reads (1528 discarded)

[2019-04-01 02:08:40] Mapping left_kept_reads to genome genome with Bowtie2

[2019-04-01 02:09:24] Mapping left_kept_reads_seg1 to genome genome with Bowtie2 (1/2)

[2019-04-01 02:09:26] Mapping left_kept_reads_seg2 to genome genome with Bowtie2 (2/2)

[2019-04-01 02:09:29] Mapping right_kept_reads to genome genome with Bowtie2

[2019-04-01 02:10:13] Mapping right_kept_reads_seg1 to genome genome with Bowtie2 (1/2)

[2019-04-01 02:10:15] Mapping right_kept_reads_seg2 to genome genome with Bowtie2 (2/2)

[2019-04-01 02:10:20] Searching for junctions via segment mapping Coverage-search algorithm is turned on, making this step very slow Please try running TopHat again with the option (–no-coverage-search) if this step takes too much time or memory.

[2019-04-01 02:10:34] Retrieving sequences for splices

[2019-04-01 02:10:35] Indexing splices

Building a SMALL index

[2019-04-01 02:10:35] Mapping left_kept_reads_seg1 to genome segment_juncs with Bowtie2 (1/2)

[2019-04-01 02:10:36] Mapping left_kept_reads_seg2 to genome segment_juncs with Bowtie2 (2/2)

[2019-04-01 02:10:37] Joining segment hits

[2019-04-01 02:10:40] Mapping right_kept_reads_seg1 to genome segment_juncs with Bowtie2 (1/2)

[2019-04-01 02:10:41] Mapping right_kept_reads_seg2 to genome segment_juncs with Bowtie2 (2/2)

[2019-04-01 02:10:43] Joining segment hits

[2019-04-01 02:10:46] Reporting output tracks

[2019-04-01 02:12:02] A summary of the alignment counts can be found in tophat.Sp_ds.dir/align_summary.txt

[2019-04-01 02:12:02] Run complete: 00:03:42 elapsed

Simlilar runs for other paired samples

Additional directories and contents following the run

~/tophat_spombe$ ls -l

drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 1 02:12 tophat.Sp_ds.dir

drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 1 02:17 tophat.Sp_hs.dir

drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 1 02:22 tophat.Sp_log.dir

drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 1 02:28 tophat.Sp_plat.dir

Cuffmerge: Run Cuffmerge on all assemblies to create a single merged transcriptome annotation

~/tophat_spombe$ cuffmerge -g Schizosaccharomyces_pombe.ASM294v2.42.gtf -s Schizosaccharomyces_pombe_all_chromosomes.fa -p 8 assembly.txt

[Tue Apr 9 17:44:48 2019] Beginning transcriptome assembly merge


[Tue Apr 9 17:44:48 2019] Preparing output location ./merged_asm/

[Tue Apr 9 17:44:49 2019] Converting GTF files to SAM

[17:44:49] Loading reference annotation.

[17:44:49] Loading reference annotation.

[17:44:49] Loading reference annotation.

[17:44:49] Loading reference annotation.

[Tue Apr 9 17:44:49 2019] Quantitating transcripts

Warning: Could not connect to update server to verify current version. Please check at the Cufflinks website (http://cufflinks.cbcb.umd.edu).

Command line:

cufflinks -o ./merged_asm/ -F 0.05 -g Schizosaccharomyces_pombe.ASM294v2.42.gtf -q –overhang-tolerance 200 –library-type=transfrags -A 0.0 –min-frags-per-transfrag 0 –no-5-extend -p 8 ./merged_asm/tmp/mergeSam_file56TGqQ

[bam_header_read] EOF marker is absent. The input is probably truncated.

[bam_header_read] invalid BAM binary header (this is not a BAM file).

File ./merged_asm/tmp/mergeSam_file56TGqQ doesn’t appear to be a valid BAM file, trying SAM…

[17:44:49] Loading reference annotation.

[17:44:49] Inspecting reads and determining fragment length distribution.

Processed 3400 loci.

Map Properties:

Normalized Map Mass: 18656.00

Raw Map Mass: 18656.00

Fragment Length Distribution: Truncated Gaussian (default)

Default Mean: 200

Default Std Dev: 80

[17:44:49] Assembling transcripts and estimating abundances.

Processed 3400 loci.

[Tue Apr 9 17:44:52 2019] Comparing against reference file Schizosaccharomyces_pombe.ASM294v2.42.gtf

Warning: Could not connect to update server to verify current version. Please check at the Cufflinks website (http://cufflinks.cbcb.umd.edu).

No fasta index found for Schizosaccharomyces_pombe_all_chromosomes.fa. Rebuilding, please wait..

Fasta index rebuilt.

Warning: couldn’t find fasta record for ‘AB325691’!

Warning: couldn’t find fasta record for ‘MT’!

Warning: couldn’t find fasta record for ‘MTR’!

………………..

Additional directories and contents following the run

~/tophat_spombe$ ls -lt

drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 9 17:44 merged_asm

-rw-rw-r– 1 ubuntu ubuntu 185 Apr 9 17:44 Schizosaccharomyces_pombe_all_chromosomes.fa.fai

-rw-rw-r– 1 ubuntu ubuntu 119 Apr 9 17:41 assembly.txt

Cuffdiff: Run Cuffdiff by using the merged transcriptome assembly along with the BAM files from TopHat for each replicate

~/tophat_spombe$ cuffdiff -o diff_out -b Schizosaccharomyces_pombe_all_chromosomes.fa -p 8 -L C1,C2 -u merged_asm/merged.gtf tophat.Sp_ds.dir/accepted_hits.bam,tophat.Sp_hs.dir/accepted_hits.bam tophat.Sp_log.dir/accepted_hits.bam,tophat.Sp_plat.dir/accepted_hits.bam

** Here assuming Sp_ds and Sp_hs are replicates. Similarly it is assumed that Sp-log and Sp_plat are replicates.**

Warning: Could not connect to update server to verify current version. Please check at the Cufflinks website (http://cufflinks.cbcb.umd.edu).

[17:53:51] Loading reference annotation and sequence.

Warning: couldn’t find fasta record for ‘AB325691’!

This contig will not be bias corrected.

Warning: couldn’t find fasta record for ‘MT’!

This contig will not be bias corrected.

Warning: couldn’t find fasta record for ‘MTR’!

This contig will not be bias corrected.

[17:53:52] Inspecting maps and determining fragment length distributions.

[17:54:07] Modeling fragment count overdispersion.

[17:54:58] Modeling fragment count overdispersion.

Map Properties: Normalized Map Mass: 933414.68 Raw Map Mass: 922901.69 Number of Multi-Reads: 35945 (with 148785 total hits) Fragment Length Distribution: Empirical (learned) Estimated Mean: 262.47 Estimated Std Dev: 61.71

Map Properties: Normalized Map Mass: 933414.68 Raw Map Mass: 923893.70 Number of Multi-Reads: 64738 (with 379511 total hits) Fragment Length Distribution: Empirical (learned) Estimated Mean: 276.70 Estimated Std Dev: 60.73

Map Properties: Normalized Map Mass: 933414.68 Raw Map Mass: 930065.32 Number of Multi-Reads: 40694 (with 116887 total hits) Fragment Length Distribution: Empirical (learned) Estimated Mean: 263.99 Estimated Std Dev: 60.37

Map Properties: Normalized Map Mass: 933414.68 Raw Map Mass: 927012.86 Number of Multi-Reads: 48144 (with 294370 total hits) Fragment Length Distribution: Empirical (learned) Estimated Mean: 264.10 Estimated Std Dev: 64.51

[17:55:50] Calculating preliminary abundance estimates

Processed 3744 loci. [*************************] 100%

[17:56:26] Learning bias parameters.

[17:56:41] Testing for differential expression and regulation in locus.

Processed 3744 loci. [*************************] 100%

Performed 5100 isoform-level transcription difference tests

Performed 4916 tss-level transcription difference tests

Performed 4431 gene-level transcription difference tests

Performed 4383 CDS-level transcription difference tests

Performed 0 splicing tests

Performed 0 promoter preference tests

Performing 0 relative CDS output tests

Writing isoform-level FPKM tracking

Writing TSS group-level FPKM tracking

Writing gene-level FPKM tracking

Writing CDS-level FPKM tracking

Writing isoform-level count tracking

Writing TSS group-level count tracking

Writing gene-level count tracking

Writing CDS-level count tracking

Writing isoform-level read group tracking

Writing TSS group-level read group tracking

Writing gene-level read group tracking

Writing CDS-level read group tracking

Writing read group info

Writing run info

cummeRbund: Data analysis

library(cummeRbund)

Create a CummeRbund database from the Cuffdiff output

cuff_data <- readCufflinks("diff_out/")
cuff_data
CuffSet instance with:
     2 samples
     6016 genes
     7690 isoforms
     6997 TSS
     5121 CDS
     6016 promoters
     6997 splicing
     4575 relCDS

Plot the distribution of expression levels for each sample

csDensity(genes(cuff_data))

Compare the expression of each gene in two conditions with a scatter plot

csScatter(genes(cuff_data), 'C1', 'C2')

Create a volcano plot to inspect differentially expressed genes

csVolcano(genes(cuff_data), 'C1', 'C2')

Genes and transcripts that are differentially expressed between two samples.

gene_diff_data <- diffData(genes(cuff_data))
head(gene_diff_data)
gene_diff_data <- diffData(genes(cuff_data))
sig_gene_data <- subset(gene_diff_data, (significant == 'yes'))
head(sig_gene_data)

Differentially expressed transcripts or differentially spliced and regulated genes

isoform_diff_data <- diffData(isoforms(cuff_data), 'C1', 'C2')
sig_isoform_data <- subset(isoform_diff_data, (significant == 'yes'))
nrow(sig_isoform_data)
[1] 0
tss_diff_data <- diffData(TSS(cuff_data), 'C1', 'C2')
sig_tss_data <- subset(tss_diff_data, (significant == 'yes'))
nrow(sig_tss_data)
[1] 0
cds_diff_data <- diffData(CDS(cuff_data), 'C1', 'C2')
sig_cds_data <- subset(cds_diff_data, (significant == 'yes'))
nrow(sig_cds_data)
[1] 0
promoter_diff_data <- distValues(promoters(cuff_data))
sig_promoter_data <- subset(promoter_diff_data, (significant == 'yes'))
nrow(sig_promoter_data)
[1] 0
splicing_diff_data <- distValues(splicing(cuff_data))
sig_splicing_data <- subset(splicing_diff_data, (significant == 'yes'))
nrow(sig_splicing_data)
[1] 0
relCDS_diff_data <- distValues(relCDS(cuff_data))
sig_relCDS_data <- subset(relCDS_diff_data, (significant == 'yes'))
nrow(sig_relCDS_data)
[1] 0
LS0tDQp0aXRsZTogIlR1eGVkbyB0b29scyBJIChUb3BoYXQgYW5kIEN1ZmZsaW5rcykgYW5hbHlzaXMgb2YgUy4gcG9tYmUgZGF0YSBmcm9tIFRyaW5pdHkgcHJvdG9jb2xzIg0KYXV0aG9yOiAiQmhhZ2lyYXRoaSBEYXNoIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMgRGF0YSwgcmVmZXJlbmNlcyBhbmQgcmVzb3VyY2VzDQoNCiMjIyMgUmVmZXJlbmNlOiBEaWZmZXJlbnRpYWwgZ2VuZSBhbmQgdHJhbnNjcmlwdCBleHByZXNzaW9uIGFuYWx5c2lzIG9mIFJOQS1zZXEgZXhwZXJpbWVudHMgd2l0aCBUb3BIYXQgYW5kIEN1ZmZsaW5rcy4gTmF0IFByb3RvYy4gNygzKTogNTYyLTU3OC4NCg0KIyMjIyBNYWNoaW5lIEFXUyBtNC54bGFnZQ0KDQoNCiMjIyBEb3dubG9hZHMNCg0KDQojIyMjICB+L3RvcGhhdF9zcG9tYmUkIHdnZXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90cmluaXR5cm5hc2VxL2ZpbGVzL21pc2MvVHJpbml0eU5hdHVyZVByb3RvY29sVHV0b3JpYWwudGd6DQoNCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNClRyaW5pdHlOYXR1cmVQcm90b2NvbFR1dG9yaWFsLnRneiAgICAgICAgICAgICAxMDAlWz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+XSA0NTIuMDZNICAxOS43TUIvcyAgICBpbiAyNHMgICAgIA0KDQoyMDE5LTA0LTAxIDAxOjUyOjIwICgxOC43IE1CL3MpIC0gMjAxOFRyaW5pdHlOYXR1cmVQcm90b2NvbFR1dG9yaWFsLnRneiBzYXZlZCBbNDc0MDE1Mzk0LzQ3NDAxNTM5NF0NCg0KDQoNCg0KDQoNCiMjIyMgfi90b3BoYXRfc3BvbWJlJCB3Z2V0IGZ0cDovL2Z0cC5wb21iYXNlLm9yZy9wb21iZS9nZW5vbWVfc2VxdWVuY2VfYW5kX2ZlYXR1cmVzL2dmZjMvU2NoaXpvc2FjY2hhcm9teWNlc19wb21iZV9hbGxfY2hyb21vc29tZXMuZ2ZmMy5neg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpTY2hpem9zYWNjaGFyb215Y2VzX3BvbWJlX2FsbF9jaHJvbW9zb21lcyAxMDAlWz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5dIDQ1OC41OUsgIDEuMTFNQi9zICAgIGluIDAuNHMgICAgDQoNCjIwMTktMDQtMDEgMDE6Mjk6MDkgKDEuMTEgTUIvcykgLSDigJhTY2hpem9zYWNjaGFyb215Y2VzX3BvbWJlX2FsbF9jaHJvbW9zb21lcy5nZmYzLmd64oCZIHNhdmVkIFs0Njk2MDBdDQoNCg0KDQoNCiMjIyMgfi90b3BoYXRfc3BvbWJlJCB3Z2V0IGZ0cDovL2Z0cC5wb21iYXNlLm9yZy9wb21iZS9nZW5vbWVfc2VxdWVuY2VfYW5kX2ZlYXR1cmVzL2dlbm9tZV9zZXF1ZW5jZS9TY2hpem9zYWNjaGFyb215Y2VzX3BvbWJlX2FsbF9jaHJvbW9zb21lcy5mYS5neg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KU2NoaXpvc2FjY2hhcm9teWNlc19wb21iZV9hbGxfY2hyb21vc29tZXMuZmEuIDEwMCVbPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT5dICAgMy42ME0gIDQuOThNQi9zICAgIGluIDAuN3MgICAgDQoNCjIwMTktMDQtMDEgMDE6Mjk6NTUgKDQuOTggTUIvcykgLSDigJhTY2hpem9zYWNjaGFyb215Y2VzX3BvbWJlX2FsbF9jaHJvbW9zb21lcy5mYS5neuKAmSBzYXZlZCBbMzc3Mzc0M10NCg0KDQoNCiMjIyMgfi90b3BoYXRfc3BvbWJlJCB3Z2V0IGZ0cDovL2Z0cC5lbnNlbWJsZ2Vub21lcy5vcmcvcHViL2N1cnJlbnQvZnVuZ2kvZ3RmL3NjaGl6b3NhY2NoYXJvbXljZXNfcG9tYmUvU2NoaXpvc2FjY2hhcm9teWNlc19wb21iZS5BU00yOTR2Mi40Mi5ndGYuZ3oNCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNClNjaGl6b3NhY2NoYXJvbXljZXNfcG9tYmUuQVNNMjk0djIuNDIuZ3RmLmd6ICAxMDAlWz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0+XSA3ODUuODVLICAxLjI4TUIvcyAgICBpbiAwLjZzICAgIA0KDQoyMDE5LTA0LTAxIDAxOjM4OjU5ICgxLjI4IE1CL3MpIC0g4oCYU2NoaXpvc2FjY2hhcm9teWNlc19wb21iZS5BU00yOTR2Mi40Mi5ndGYuZ3rigJkgc2F2ZWQgWzgwNDcwN10NCg0KDQojIyMgRGlyZWN0b3J5IGNvbnRlbnRzDQoNCiMjIyMgICB+L3RvcGhhdF9zcG9tYmUkIGxzIC1sDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAxNDU0NDIyNSBBcHIgIDEgMDE6MzggU2NoaXpvc2FjY2hhcm9teWNlc19wb21iZS5BU00yOTR2Mi40Mi5ndGYNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDEyODQyMTMwIEFwciAgMSAwMToyOSBTY2hpem9zYWNjaGFyb215Y2VzX3BvbWJlX2FsbF9jaHJvbW9zb21lcy5mYQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgIDM0NDU0MjkgQXByICAxIDAxOjI5IFNjaGl6b3NhY2NoYXJvbXljZXNfcG9tYmVfYWxsX2Nocm9tb3NvbWVzLmdmZjMNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgNDc0MDE1Mzk0IEZlYiAgOSAgMjAxMyBUcmluaXR5TmF0dXJlUHJvdG9jb2xUdXRvcmlhbC50Z3oNCg0KDQoNCiMjIyMgICAgfi90b3BoYXRfc3BvbWJlJCB0YXIgeHZmIFRyaW5pdHlOYXR1cmVQcm90b2NvbFR1dG9yaWFsLnRneiANCg0KVHJpbml0eU5hdHVyZVByb3RvY29sVHV0b3JpYWwvDQpUcmluaXR5TmF0dXJlUHJvdG9jb2xUdXRvcmlhbC9TX3BvbWJlX3JlZlRyYW5zLmZhc3RhDQpUcmluaXR5TmF0dXJlUHJvdG9jb2xUdXRvcmlhbC8xTV9SRUFEU19zYW1wbGUvDQpUcmluaXR5TmF0dXJlUHJvdG9jb2xUdXRvcmlhbC8xTV9SRUFEU19zYW1wbGUvU3AuaHMuMU0ubGVmdC5mcQ0KVHJpbml0eU5hdHVyZVByb3RvY29sVHV0b3JpYWwvMU1fUkVBRFNfc2FtcGxlL1NwLmxvZy4xTS5yaWdodC5mcQ0KVHJpbml0eU5hdHVyZVByb3RvY29sVHV0b3JpYWwvMU1fUkVBRFNfc2FtcGxlL1NwLmRzLjFNLnJpZ2h0LmZxDQpUcmluaXR5TmF0dXJlUHJvdG9jb2xUdXRvcmlhbC8xTV9SRUFEU19zYW1wbGUvU3AuZHMuMU0ubGVmdC5mcQ0KVHJpbml0eU5hdHVyZVByb3RvY29sVHV0b3JpYWwvMU1fUkVBRFNfc2FtcGxlL1NwLmxvZy4xTS5sZWZ0LmZxDQpUcmluaXR5TmF0dXJlUHJvdG9jb2xUdXRvcmlhbC8xTV9SRUFEU19zYW1wbGUvU3AucGxhdC4xTS5sZWZ0LmZxDQpUcmluaXR5TmF0dXJlUHJvdG9jb2xUdXRvcmlhbC8xTV9SRUFEU19zYW1wbGUvU3AucGxhdC4xTS5yaWdodC5mcQ0KVHJpbml0eU5hdHVyZVByb3RvY29sVHV0b3JpYWwvMU1fUkVBRFNfc2FtcGxlL1NwLmhzLjFNLnJpZ2h0LmZxDQpUcmluaXR5TmF0dXJlUHJvdG9jb2xUdXRvcmlhbC9zYW1wbGVzX25fcmVhZHNfZGVzY3JpYmVkLnR4dA0KDQoNCiMjIyMgICB+L3RvcGhhdF9zcG9tYmUkIGxzIC1sIFRyaW5pdHlOYXR1cmVQcm90b2NvbFR1dG9yaWFsDQoNCmRyd3hyd3hyLXggMiB1YnVudHUgdWJ1bnR1ICAgIDQwOTYgRmViICA2ICAyMDEzIDFNX1JFQURTX3NhbXBsZQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSA3ODMwNjI5IEZlYiAgNiAgMjAxMyBTX3BvbWJlX3JlZlRyYW5zLmZhc3RhDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICA0MjIgRmViICA2ICAyMDEzIHNhbXBsZXNfbl9yZWFkc19kZXNjcmliZWQudHh0DQoNCg0KIyMjIyAgICB+L3RvcGhhdF9zcG9tYmUkIGxzIC1sIFRyaW5pdHlOYXR1cmVQcm90b2NvbFR1dG9yaWFsLzFNX1JFQURTX3NhbXBsZS8NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTc1ODQ2MTc5IEZlYiAgNiAgMjAxMyBTcC5kcy4xTS5sZWZ0LmZxDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE3NTg0NjE3OSBGZWIgIDYgIDIwMTMgU3AuZHMuMU0ucmlnaHQuZnENCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTc1NzM2MDQyIEZlYiAgNiAgMjAxMyBTcC5ocy4xTS5sZWZ0LmZxDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE3NTczNjA0MiBGZWIgIDYgIDIwMTMgU3AuaHMuMU0ucmlnaHQuZnENCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTc1NzQxMjE1IEZlYiAgNiAgMjAxMyBTcC5sb2cuMU0ubGVmdC5mcQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxNzU3NDEyMTUgRmViICA2ICAyMDEzIFNwLmxvZy4xTS5yaWdodC5mcQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxNzU4OTk1MzMgRmViICA2ICAyMDEzIFNwLnBsYXQuMU0ubGVmdC5mcQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxNzU4OTk1MzMgRmViICA2ICAyMDEzIFNwLnBsYXQuMU0ucmlnaHQuZnENCg0KDQoNCiMjIEJ1aWxkIGEgUy4gcG9tYmUgZ2Vub21lIGluZGV4DQoNCiMjIyMgfi90b3BoYXRfc3BvbWJlJCBib3d0aWUyLWJ1aWxkIGdlbm9tZV9kYXRhL1NjaGl6b3NhY2NoYXJvbXljZXNfcG9tYmVfYWxsX2Nocm9tb3NvbWVzLmZhIGdlbm9tZQ0KDQpTZXR0aW5nczoNCiAgKipPdXRwdXQgZmlsZXM6ICJnZW5vbWUuKi5idDIiKioNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQogIA0KSW5wdXQgZmlsZXMgRE5BLCBGQVNUQToNCiAgZ2Vub21lX2RhdGEvU2NoaXpvc2FjY2hhcm9teWNlc19wb21iZV9hbGxfY2hyb21vc29tZXMuZmENCiAgDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KICANCmJtYXggYWNjb3JkaW5nIHRvIGJtYXhEaXZOIHNldHRpbmc6IDMxNTc3NDQNClVzaW5nIHBhcmFtZXRlcnMgLS1ibWF4IDIzNjgzMDggLS1kY3YgMTAyNA0KICBEb2luZyBhaGVhZC1vZi10aW1lIG1lbW9yeSB1c2FnZSB0ZXN0DQogIFBhc3NlZCEgIENvbnN0cnVjdGluZyB3aXRoIHRoZXNlIHBhcmFtZXRlcnM6IC0tYm1heCAyMzY4MzA4IC0tZGN2IDEwMjQNCiAgDQpDb25zdHJ1Y3Rpbmcgc3VmZml4LWFycmF5IGVsZW1lbnQgZ2VuZXJhdG9yDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCkJ1aWxkaW5nIERpZmZlcmVuY2VDb3ZlclNhbXBsZQ0KIC4uLi4uLi4uLi4uLi4uLi4uLg0KICBJbnZva2luZyBMYXJzc29uLVNhZGFrYW5lIG9uIHJhbmtzIHRpbWU6IDAwOjAwOjAwDQogIA0KLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KQ2FsY3VsYXRpbmcgYnVja2V0IHNpemVzDQogIEJpbmFyeSBzb3J0aW5nIGludG8gYnVja2V0cw0KICAxMCUNCiAgMjAlDQogIDMwJQ0KICA0MCUNCiAgNTAlDQogIDYwJQ0KICA3MCUNCiAgODAlDQogIDkwJQ0KICAxMDAlDQogIEJpbmFyeSBzb3J0aW5nIGludG8gYnVja2V0cyB0aW1lOiAwMDowMDowMA0KU3BsaXR0aW5nIGFuZCBtZXJnaW5nDQogIFNwbGl0dGluZyBhbmQgbWVyZ2luZyB0aW1lOiAwMDowMDowMA0KU3BsaXQgMSwgbWVyZ2VkIDc7IGl0ZXJhdGluZy4uLg0KDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KQXZnIGJ1Y2tldCBzaXplOiAxLjU3ODg3ZSswNiAodGFyZ2V0OiAyMzY4MzA3KQ0KDQpDb252ZXJ0aW5nIHN1ZmZpeC1hcnJheSBlbGVtZW50cyB0byBpbmRleCBpbWFnZQ0KDQpBbGxvY2F0aW5nIGZ0YWIsIGFic29yYkZ0YWINCg0KKipFbnRlcmluZyBFYnd0IGxvb3AqKg0KDQpHZXR0aW5nIGJsb2NrIDEgb2YgOA0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQouLi4uLi4uLi4uLi4uLi4uLi4NCkNvbnN0cnVjdGluZyBzdWZmaXgtYXJyYXkgZWxlbWVudCBnZW5lcmF0b3INCi4uLi4uLi4uLi4uLi4uLg0KDQoNCioqRXhpdGVkIEVid3QgbG9vcCoqDQoNCmZjaHJbQV06IDANCg0KZmNocltDXTogNDAzNjM0OA0KDQpmY2hyW0ddOiA2MzExMzM4DQoNCmZjaHJbVF06IDg1ODg1MjMNCg0KZmNoclskXTogMTI2MzA5NzcNCg0KRXhpdGluZyBFYnd0OjpidWlsZFRvRGlzaygpDQoNClJldHVybmluZyBmcm9tIGluaXRGcm9tVmVjdG9yDQoNCioqV3JvdGUgODQwNTIwNCBieXRlcyB0byBwcmltYXJ5IEVCV1QgZmlsZTogZ2Vub21lLnJldi4xLmJ0MioqDQoNCioqV3JvdGUgMzE1Nzc1MiBieXRlcyB0byBzZWNvbmRhcnkgRUJXVCBmaWxlOiBnZW5vbWUucmV2LjIuYnQyKioNCg0KUmUtb3BlbmluZyBfaW4xIGFuZCBfaW4yIGFzIGlucHV0IHN0cmVhbXMNCg0KUmV0dXJuaW5nIGZyb20gRWJ3dCBjb25zdHJ1Y3Rvcg0KDQpIZWFkZXJzOg0KDQogICAgbGVuOiAxMjYzMDk3Nw0KICAgIGJ3dExlbjogMTI2MzA5NzgNCiAgICBzejogMzE1Nzc0NQ0KICAgIGJ3dFN6OiAzMTU3NzQ1DQogICAgbGluZVJhdGU6IDYNCiAgICBvZmZSYXRlOiA0DQogICAgb2ZmTWFzazogMHhmZmZmZmZmMA0KICAgIGZ0YWJDaGFyczogMTANCiAgICBlZnRhYkxlbjogMjANCiAgICBlZnRhYlN6OiA4MA0KICAgIGZ0YWJMZW46IDEwNDg1NzcNCiAgICBmdGFiU3o6IDQxOTQzMDgNCiAgICBvZmZzTGVuOiA3ODk0MzcNCiAgICBvZmZzU3o6IDMxNTc3NDgNCiAgICBsaW5lU3o6IDY0DQogICAgc2lkZVN6OiA2NA0KICAgIHNpZGVCd3RTejogNDgNCiAgICBzaWRlQnd0TGVuOiAxOTINCiAgICBudW1TaWRlczogNjU3ODcNCiAgICBudW1MaW5lczogNjU3ODcNCiAgICBlYnd0VG90TGVuOiA0MjEwMzY4DQogICAgZWJ3dFRvdFN6OiA0MjEwMzY4DQogICAgY29sb3I6IDANCiAgICByZXZlcnNlOiAxDQogICAgDQpUb3RhbCB0aW1lIGZvciBiYWNrd2FyZCBjYWxsIHRvIGRyaXZlcigpIGZvciBtaXJyb3IgaW5kZXg6IDAwOjAwOjA0DQoNCg0KIyMjIyAgIEFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgYW5kIGNvbnRlbnRzIGZvbGxvd2luZyB0aGUgcnVuDQoNCn4vdG9waGF0X3Nwb21iZSQgbHMgLWwNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICA4NDA1MjA0IEFwciAgMSAwMTo0MyBnZW5vbWUuMS5idDINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAzMTU3NzUyIEFwciAgMSAwMTo0MyBnZW5vbWUuMi5idDINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMTE2IEFwciAgMSAwMTo0MyBnZW5vbWUuMy5idDINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAzMTU3NzQ1IEFwciAgMSAwMTo0MyBnZW5vbWUuNC5idDINCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICA4NDA1MjA0IEFwciAgMSAwMTo0MyBnZW5vbWUucmV2LjEuYnQyDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgMzE1Nzc1MiBBcHIgIDEgMDE6NDMgZ2Vub21lLnJldi4yLmJ0Mg0KDQpkcnd4cnd4ci14IDIgdWJ1bnR1IHVidW50dSAgICAgIDQwOTYgQXByICAxIDAxOjQyIGdlbm9tZV9kYXRhDQoNCg0KDQoNCiMjIFRvcGhhdDogTWFwIHRoZSByZWFkcyBmb3IgZWFjaCBzYW1wbGUgdG8gdGhlIHJlZmVyZW5jZSBnZW5vbWUNCg0KDQoNCiMjIyMgfi90b3BoYXRfc3BvbWJlJCB0b3BoYXQgLUkgMTAwMCAtaSAyMCAtLWxpYnJhcnktdHlwZSBmci1maXJzdHN0cmFuZCAtbyB0b3BoYXQuU3BfZHMuZGlyIGdlbm9tZSBUcmluaXR5TmF0dXJlUHJvdG9jb2xUdXRvcmlhbC8xTV9SRUFEU19zYW1wbGUvU3AuZHMuMU0ubGVmdC5mcSBUcmluaXR5TmF0dXJlUHJvdG9jb2xUdXRvcmlhbC8xTV9SRUFEU19zYW1wbGUvU3AuZHMuMU0ucmlnaHQuZnENCg0KWzIwMTktMDQtMDEgMDI6MDg6MjBdIEJlZ2lubmluZyBUb3BIYXQgcnVuICh2Mi4xLjEpDQoNClsyMDE5LTA0LTAxIDAyOjA4OjIwXSBDaGVja2luZyBmb3IgQm93dGllDQoJCSAgQm93dGllIHZlcnNpb246CSAyLjIuNS4wDQoJCSAgDQpbMjAxOS0wNC0wMSAwMjowODoyMF0gQ2hlY2tpbmcgZm9yIEJvd3RpZSBpbmRleCBmaWxlcyAoZ2Vub21lKS4uDQoNClsyMDE5LTA0LTAxIDAyOjA4OjIwXSBDaGVja2luZyBmb3IgcmVmZXJlbmNlIEZBU1RBIGZpbGUNCg0KCVdhcm5pbmc6IENvdWxkIG5vdCBmaW5kIEZBU1RBIGZpbGUgZ2Vub21lLmZhDQoJDQpbMjAxOS0wNC0wMSAwMjowODoyMF0gUmVjb25zdGl0dXRpbmcgcmVmZXJlbmNlIEZBU1RBIGZpbGUgZnJvbSBCb3d0aWUgaW5kZXgNCiAgRXhlY3V0aW5nOiAvaG9tZS91YnVudHUvbWluaWNvbmRhMy9iaW4vYm93dGllMi1pbnNwZWN0IGdlbm9tZSA+IHRvcGhhdC5TcF9kcy5kaXIvdG1wL2dlbm9tZS5mYQ0KICANClsyMDE5LTA0LTAxIDAyOjA4OjIwXSBHZW5lcmF0aW5nIFNBTSBoZWFkZXIgZm9yIGdlbm9tZQ0KDQpbMjAxOS0wNC0wMSAwMjowODoyMF0gUHJlcGFyaW5nIHJlYWRzDQoJIGxlZnQgcmVhZHM6IG1pbi4gbGVuZ3RoPTY4LCBtYXguIGxlbmd0aD02OCwgOTk3OTUzIGtlcHQgcmVhZHMgKDIwNDcgZGlzY2FyZGVkKQ0KCSANCglyaWdodCByZWFkczogbWluLiBsZW5ndGg9NjgsIG1heC4gbGVuZ3RoPTY4LCA5OTg0NzIga2VwdCByZWFkcyAoMTUyOCBkaXNjYXJkZWQpDQoJDQpbMjAxOS0wNC0wMSAwMjowODo0MF0gTWFwcGluZyBsZWZ0X2tlcHRfcmVhZHMgdG8gZ2Vub21lIGdlbm9tZSB3aXRoIEJvd3RpZTIgDQoNClsyMDE5LTA0LTAxIDAyOjA5OjI0XSBNYXBwaW5nIGxlZnRfa2VwdF9yZWFkc19zZWcxIHRvIGdlbm9tZSBnZW5vbWUgd2l0aCBCb3d0aWUyICgxLzIpDQoNClsyMDE5LTA0LTAxIDAyOjA5OjI2XSBNYXBwaW5nIGxlZnRfa2VwdF9yZWFkc19zZWcyIHRvIGdlbm9tZSBnZW5vbWUgd2l0aCBCb3d0aWUyICgyLzIpDQoNClsyMDE5LTA0LTAxIDAyOjA5OjI5XSBNYXBwaW5nIHJpZ2h0X2tlcHRfcmVhZHMgdG8gZ2Vub21lIGdlbm9tZSB3aXRoIEJvd3RpZTIgDQoNClsyMDE5LTA0LTAxIDAyOjEwOjEzXSBNYXBwaW5nIHJpZ2h0X2tlcHRfcmVhZHNfc2VnMSB0byBnZW5vbWUgZ2Vub21lIHdpdGggQm93dGllMiAoMS8yKQ0KDQpbMjAxOS0wNC0wMSAwMjoxMDoxNV0gTWFwcGluZyByaWdodF9rZXB0X3JlYWRzX3NlZzIgdG8gZ2Vub21lIGdlbm9tZSB3aXRoIEJvd3RpZTIgKDIvMikNCg0KWzIwMTktMDQtMDEgMDI6MTA6MjBdIFNlYXJjaGluZyBmb3IganVuY3Rpb25zIHZpYSBzZWdtZW50IG1hcHBpbmcNCglDb3ZlcmFnZS1zZWFyY2ggYWxnb3JpdGhtIGlzIHR1cm5lZCBvbiwgbWFraW5nIHRoaXMgc3RlcCB2ZXJ5IHNsb3cNCglQbGVhc2UgdHJ5IHJ1bm5pbmcgVG9wSGF0IGFnYWluIHdpdGggdGhlIG9wdGlvbiAoLS1uby1jb3ZlcmFnZS1zZWFyY2gpIGlmIHRoaXMgc3RlcCB0YWtlcyB0b28gbXVjaCB0aW1lIG9yIG1lbW9yeS4NCgkNClsyMDE5LTA0LTAxIDAyOjEwOjM0XSBSZXRyaWV2aW5nIHNlcXVlbmNlcyBmb3Igc3BsaWNlcw0KDQpbMjAxOS0wNC0wMSAwMjoxMDozNV0gSW5kZXhpbmcgc3BsaWNlcw0KDQpCdWlsZGluZyBhIFNNQUxMIGluZGV4DQoNClsyMDE5LTA0LTAxIDAyOjEwOjM1XSBNYXBwaW5nIGxlZnRfa2VwdF9yZWFkc19zZWcxIHRvIGdlbm9tZSBzZWdtZW50X2p1bmNzIHdpdGggQm93dGllMiAoMS8yKQ0KDQpbMjAxOS0wNC0wMSAwMjoxMDozNl0gTWFwcGluZyBsZWZ0X2tlcHRfcmVhZHNfc2VnMiB0byBnZW5vbWUgc2VnbWVudF9qdW5jcyB3aXRoIEJvd3RpZTIgKDIvMikNCg0KWzIwMTktMDQtMDEgMDI6MTA6MzddIEpvaW5pbmcgc2VnbWVudCBoaXRzDQoNClsyMDE5LTA0LTAxIDAyOjEwOjQwXSBNYXBwaW5nIHJpZ2h0X2tlcHRfcmVhZHNfc2VnMSB0byBnZW5vbWUgc2VnbWVudF9qdW5jcyB3aXRoIEJvd3RpZTIgKDEvMikNCg0KWzIwMTktMDQtMDEgMDI6MTA6NDFdIE1hcHBpbmcgcmlnaHRfa2VwdF9yZWFkc19zZWcyIHRvIGdlbm9tZSBzZWdtZW50X2p1bmNzIHdpdGggQm93dGllMiAoMi8yKQ0KDQpbMjAxOS0wNC0wMSAwMjoxMDo0M10gSm9pbmluZyBzZWdtZW50IGhpdHMNCg0KWzIwMTktMDQtMDEgMDI6MTA6NDZdIFJlcG9ydGluZyBvdXRwdXQgdHJhY2tzDQoNClsyMDE5LTA0LTAxIDAyOjEyOjAyXSBBIHN1bW1hcnkgb2YgdGhlIGFsaWdubWVudCBjb3VudHMgY2FuIGJlIGZvdW5kIGluIHRvcGhhdC5TcF9kcy5kaXIvYWxpZ25fc3VtbWFyeS50eHQNCg0KWzIwMTktMDQtMDEgMDI6MTI6MDJdIFJ1biBjb21wbGV0ZTogMDA6MDM6NDIgZWxhcHNlZA0KDQojIyMjIFNpbWxpbGFyIHJ1bnMgZm9yIG90aGVyIHBhaXJlZCBzYW1wbGVzDQoNCg0KDQojIyMjIEFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgYW5kIGNvbnRlbnRzIGZvbGxvd2luZyB0aGUgcnVuDQoNCg0Kfi90b3BoYXRfc3BvbWJlJCBscyAtbA0KDQpkcnd4cnd4ci14IDMgdWJ1bnR1IHVidW50dSAgICAgNDA5NiBBcHIgIDEgMDI6MTIgdG9waGF0LlNwX2RzLmRpcg0KDQpkcnd4cnd4ci14IDMgdWJ1bnR1IHVidW50dSAgICAgNDA5NiBBcHIgIDEgMDI6MTcgdG9waGF0LlNwX2hzLmRpcg0KDQpkcnd4cnd4ci14IDMgdWJ1bnR1IHVidW50dSAgICAgNDA5NiBBcHIgIDEgMDI6MjIgdG9waGF0LlNwX2xvZy5kaXINCg0KZHJ3eHJ3eHIteCAzIHVidW50dSB1YnVudHUgICAgIDQwOTYgQXByICAxIDAyOjI4IHRvcGhhdC5TcF9wbGF0LmRpcg0KDQoNCg0KIyMgQ3VmZmxpbmtzOiBBc3NlbWJsZSBleHByZXNzZWQgZ2VuZXMgYW5kIHRyYW5zY3JpcHRzDQoNCiMjIyMgfi90b3BoYXRfc3BvbWJlJCBjdWZmbGlua3MgLXAgOCAtbyBjbGlua3Muc3BfZHMgdG9waGF0LlNwX2RzLmRpci9hY2NlcHRlZF9oaXRzLmJhbQ0KDQpXYXJuaW5nOiBDb3VsZCBub3QgY29ubmVjdCB0byB1cGRhdGUgc2VydmVyIHRvIHZlcmlmeSBjdXJyZW50IHZlcnNpb24uIFBsZWFzZSBjaGVjayBhdCB0aGUgQ3VmZmxpbmtzIHdlYnNpdGUgKGh0dHA6Ly9jdWZmbGlua3MuY2JjYi51bWQuZWR1KS4NCg0KWzE3OjIxOjIzXSBJbnNwZWN0aW5nIHJlYWRzIGFuZCBkZXRlcm1pbmluZyBmcmFnbWVudCBsZW5ndGggZGlzdHJpYnV0aW9uLg0KDQo+IFByb2Nlc3NlZCA1Nzk4IGxvY2kuICAgICAgICAgICAgICAgICAgICAgICAgIFsqKioqKioqKioqKioqKioqKioqKioqKioqXSAxMDAlDQoNCj4gTWFwIFByb3BlcnRpZXM6DQoNCj4JTm9ybWFsaXplZCBNYXAgTWFzczogOTU4MzkzLjQ5DQoNCj4JUmF3IE1hcCBNYXNzOiA5NTgzOTMuNDkNCg0KPglGcmFnbWVudCBMZW5ndGggRGlzdHJpYnV0aW9uOiBFbXBpcmljYWwgKGxlYXJuZWQpDQoNCj4JRXN0aW1hdGVkIE1lYW46IDI2My45MQ0KDQo+CUVzdGltYXRlZCBTdGQgRGV2OiA2MC45Nw0KDQpbMTc6MjE6MjldIEFzc2VtYmxpbmcgdHJhbnNjcmlwdHMgYW5kIGVzdGltYXRpbmcgYWJ1bmRhbmNlcy4NCg0KPiBQcm9jZXNzZWQgNTc5OCBsb2NpLiAgICAgICAgICAgICAgICAgICAgICAgICBbKioqKioqKioqKioqKioqKioqKioqKioqKl0gMTAwJQ0KDQoNCiMjIyN+L3RvcGhhdF9zcG9tYmUkIGN1ZmZsaW5rcyAtcCA4IC1vIGNsaW5rcy5zcF9ocyB0b3BoYXQuU3BfaHMuZGlyL2FjY2VwdGVkX2hpdHMuYmFtDQouLi4uLi4uLi4uLi4uLi4uLg0KDQpbMTc6Mjk6NTldIEFzc2VtYmxpbmcgdHJhbnNjcmlwdHMgYW5kIGVzdGltYXRpbmcgYWJ1bmRhbmNlcy4NCg0KPiBQcm9jZXNzZWQgNjM4MSBsb2NpLiAgICAgICAgICAgICAgICAgICAgICAgICBbKioqKioqKioqKioqKioqKioqKioqKioqKl0gMTAwJQ0KDQoNCiMjIyMgICAgfi90b3BoYXRfc3BvbWJlJCBjdWZmbGlua3MgLXAgOCAtbyBjbGlua3Muc3BfbG9nIHRvcGhhdC5TcF9sb2cuZGlyL2FjY2VwdGVkX2hpdHMuYmFtDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpbMTc6MzE6MDFdIEFzc2VtYmxpbmcgdHJhbnNjcmlwdHMgYW5kIGVzdGltYXRpbmcgYWJ1bmRhbmNlcy4NCg0KPiBQcm9jZXNzZWQgNTg4OSBsb2NpLiAgICAgICAgICAgICAgICAgICAgICAgICBbKioqKioqKioqKioqKioqKioqKioqKioqKl0gMTAwJQ0KDQojIyMjICAgfi90b3BoYXRfc3BvbWJlJCBjdWZmbGlua3MgLXAgOCAtbyBjbGlua3Muc3BfcGxhdCB0b3BoYXQuU3BfcGxhdC5kaXIvYWNjZXB0ZWRfaGl0cy5iYW0NCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpbMTc6MzE6NTldIEFzc2VtYmxpbmcgdHJhbnNjcmlwdHMgYW5kIGVzdGltYXRpbmcgYWJ1bmRhbmNlcy4NCg0KPiBQcm9jZXNzZWQgNTY5OSBsb2NpLiAgICAgICAgICAgICAgICAgICAgICAgICBbKioqKioqKioqKioqKioqKioqKioqKioqKl0gMTAwJQ0KDQoNCiMjIyMgQWRkaXRpb25hbCBkaXJlY3RvcmllcyBhbmQgY29udGVudHMgZm9sbG93aW5nIHRoZSBydW4NCg0KYGBgDQp+L3RvcGhhdF9zcG9tYmUkIGxzIC1sDQpgYGANCg0KZHJ3eHJ3eHIteCAyIHVidW50dSB1YnVudHUgICAgIDQwOTYgQXByICA5IDE3OjIxIGNsaW5rcy5zcF9kcw0KDQpkcnd4cnd4ci14IDIgdWJ1bnR1IHVidW50dSAgICAgNDA5NiBBcHIgIDkgMTc6MjkgY2xpbmtzLnNwX2hzDQoNCmRyd3hyd3hyLXggMiB1YnVudHUgdWJ1bnR1ICAgICA0MDk2IEFwciAgOSAxNzozMSBjbGlua3Muc3BfbG9nDQoNCmRyd3hyd3hyLXggMiB1YnVudHUgdWJ1bnR1ICAgICA0MDk2IEFwciAgOSAxNzozMSBjbGlua3Muc3BfcGxhdA0KDQoNCg0KYGBgDQp+L3RvcGhhdF9zcG9tYmUkIGxzIC1sIGNsaW5rcy5zcF9kcy8NCg0KYGBgDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMzUxMTk5IEFwciAgOSAxNzoyMSBnZW5lcy5mcGttX3RyYWNraW5nDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA0MDc2NDkgQXByICA5IDE3OjIxIGlzb2Zvcm1zLmZwa21fdHJhY2tpbmcNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMCBBcHIgIDkgMTc6MjEgc2tpcHBlZC5ndGYNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMjQzMjgzNCBBcHIgIDkgMTc6MjEgdHJhbnNjcmlwdHMuZ3RmDQoNCg0KDQojIyMjICAgIH4vdG9waGF0X3Nwb21iZSQgbHMgY2xpbmtzLnNwX2RzL3RyYW5zY3JpcHRzLmd0ZiA+IGFzc2VtYmx5LnR4dA0KDQojIyMjICAgfi90b3BoYXRfc3BvbWJlJCBscyBjbGlua3Muc3BfaHMvdHJhbnNjcmlwdHMuZ3RmID4+IGFzc2VtYmx5LnR4dA0KICAgDQojIyMjICAgfi90b3BoYXRfc3BvbWJlJCBscyBjbGlua3Muc3BfbG9nL3RyYW5zY3JpcHRzLmd0ZiA+PiBhc3NlbWJseS50eHQNCiAgIA0KIyMjIyAgIH4vdG9waGF0X3Nwb21iZSQgbHMgY2xpbmtzLnNwX3BsYXQvdHJhbnNjcmlwdHMuZ3RmID4+IGFzc2VtYmx5LnR4dA0KICAgDQogICANCiAgIA0KIyMjIyB+L3RvcGhhdF9zcG9tYmUkIGNhdCBhc3NlbWJseS50eHQgDQogICANCmNsaW5rcy5zcF9kcy90cmFuc2NyaXB0cy5ndGYNCg0KY2xpbmtzLnNwX2hzL3RyYW5zY3JpcHRzLmd0Zg0KDQpjbGlua3Muc3BfbG9nL3RyYW5zY3JpcHRzLmd0Zg0KDQpjbGlua3Muc3BfcGxhdC90cmFuc2NyaXB0cy5ndGYNCg0KDQoNCiMjIEN1ZmZtZXJnZTogUnVuIEN1ZmZtZXJnZSBvbiBhbGwgYXNzZW1ibGllcyB0byBjcmVhdGUgYSBzaW5nbGUgbWVyZ2VkIHRyYW5zY3JpcHRvbWUgYW5ub3RhdGlvbg0KDQoNCiMjIyMgfi90b3BoYXRfc3BvbWJlJCBjdWZmbWVyZ2UgLWcgU2NoaXpvc2FjY2hhcm9teWNlc19wb21iZS5BU00yOTR2Mi40Mi5ndGYgLXMgU2NoaXpvc2FjY2hhcm9teWNlc19wb21iZV9hbGxfY2hyb21vc29tZXMuZmEgLXAgOCBhc3NlbWJseS50eHQgDQoNCltUdWUgQXByICA5IDE3OjQ0OjQ4IDIwMTldIEJlZ2lubmluZyB0cmFuc2NyaXB0b21lIGFzc2VtYmx5IG1lcmdlDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KW1R1ZSBBcHIgIDkgMTc6NDQ6NDggMjAxOV0gUHJlcGFyaW5nIG91dHB1dCBsb2NhdGlvbiAuL21lcmdlZF9hc20vDQoNCltUdWUgQXByICA5IDE3OjQ0OjQ5IDIwMTldIENvbnZlcnRpbmcgR1RGIGZpbGVzIHRvIFNBTQ0KDQpbMTc6NDQ6NDldIExvYWRpbmcgcmVmZXJlbmNlIGFubm90YXRpb24uDQoNClsxNzo0NDo0OV0gTG9hZGluZyByZWZlcmVuY2UgYW5ub3RhdGlvbi4NCg0KWzE3OjQ0OjQ5XSBMb2FkaW5nIHJlZmVyZW5jZSBhbm5vdGF0aW9uLg0KDQpbMTc6NDQ6NDldIExvYWRpbmcgcmVmZXJlbmNlIGFubm90YXRpb24uDQoNCltUdWUgQXByICA5IDE3OjQ0OjQ5IDIwMTldIFF1YW50aXRhdGluZyB0cmFuc2NyaXB0cw0KDQpXYXJuaW5nOiBDb3VsZCBub3QgY29ubmVjdCB0byB1cGRhdGUgc2VydmVyIHRvIHZlcmlmeSBjdXJyZW50IHZlcnNpb24uIFBsZWFzZSBjaGVjayBhdCB0aGUgQ3VmZmxpbmtzIHdlYnNpdGUgKGh0dHA6Ly9jdWZmbGlua3MuY2JjYi51bWQuZWR1KS4NCg0KQ29tbWFuZCBsaW5lOg0KDQpjdWZmbGlua3MgLW8gLi9tZXJnZWRfYXNtLyAtRiAwLjA1IC1nIFNjaGl6b3NhY2NoYXJvbXljZXNfcG9tYmUuQVNNMjk0djIuNDIuZ3RmIC1xIC0tb3ZlcmhhbmctdG9sZXJhbmNlIDIwMCAtLWxpYnJhcnktdHlwZT10cmFuc2ZyYWdzIC1BIDAuMCAtLW1pbi1mcmFncy1wZXItdHJhbnNmcmFnIDAgLS1uby01LWV4dGVuZCAtcCA4IC4vbWVyZ2VkX2FzbS90bXAvbWVyZ2VTYW1fZmlsZTU2VEdxUSANCg0KW2JhbV9oZWFkZXJfcmVhZF0gRU9GIG1hcmtlciBpcyBhYnNlbnQuIFRoZSBpbnB1dCBpcyBwcm9iYWJseSB0cnVuY2F0ZWQuDQoNCltiYW1faGVhZGVyX3JlYWRdIGludmFsaWQgQkFNIGJpbmFyeSBoZWFkZXIgKHRoaXMgaXMgbm90IGEgQkFNIGZpbGUpLg0KDQpGaWxlIC4vbWVyZ2VkX2FzbS90bXAvbWVyZ2VTYW1fZmlsZTU2VEdxUSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHZhbGlkIEJBTSBmaWxlLCB0cnlpbmcgU0FNLi4uDQoNClsxNzo0NDo0OV0gTG9hZGluZyByZWZlcmVuY2UgYW5ub3RhdGlvbi4NCg0KWzE3OjQ0OjQ5XSBJbnNwZWN0aW5nIHJlYWRzIGFuZCBkZXRlcm1pbmluZyBmcmFnbWVudCBsZW5ndGggZGlzdHJpYnV0aW9uLg0KDQpQcm9jZXNzZWQgMzQwMCBsb2NpLiAgICAgDQoNCj4gTWFwIFByb3BlcnRpZXM6DQoNCj4JTm9ybWFsaXplZCBNYXAgTWFzczogMTg2NTYuMDANCg0KPglSYXcgTWFwIE1hc3M6IDE4NjU2LjAwDQoNCj4JRnJhZ21lbnQgTGVuZ3RoIERpc3RyaWJ1dGlvbjogVHJ1bmNhdGVkIEdhdXNzaWFuIChkZWZhdWx0KQ0KDQo+CURlZmF1bHQgTWVhbjogMjAwDQoNCj4JRGVmYXVsdCBTdGQgRGV2OiA4MA0KDQpbMTc6NDQ6NDldIEFzc2VtYmxpbmcgdHJhbnNjcmlwdHMgYW5kIGVzdGltYXRpbmcgYWJ1bmRhbmNlcy4NCg0KUHJvY2Vzc2VkIDM0MDAgbG9jaS4gICAgIA0KDQoqKltUdWUgQXByICA5IDE3OjQ0OjUyIDIwMTldIENvbXBhcmluZyBhZ2FpbnN0IHJlZmVyZW5jZSBmaWxlIFNjaGl6b3NhY2NoYXJvbXljZXNfcG9tYmUuQVNNMjk0djIuNDIuZ3RmKioNCg0KV2FybmluZzogQ291bGQgbm90IGNvbm5lY3QgdG8gdXBkYXRlIHNlcnZlciB0byB2ZXJpZnkgY3VycmVudCB2ZXJzaW9uLiBQbGVhc2UgY2hlY2sgYXQgdGhlIEN1ZmZsaW5rcyB3ZWJzaXRlIChodHRwOi8vY3VmZmxpbmtzLmNiY2IudW1kLmVkdSkuDQoNCk5vIGZhc3RhIGluZGV4IGZvdW5kIGZvciBTY2hpem9zYWNjaGFyb215Y2VzX3BvbWJlX2FsbF9jaHJvbW9zb21lcy5mYS4gUmVidWlsZGluZywgcGxlYXNlIHdhaXQuLg0KDQoqKkZhc3RhIGluZGV4IHJlYnVpbHQuKioNCg0KV2FybmluZzogY291bGRuJ3QgZmluZCBmYXN0YSByZWNvcmQgZm9yICdBQjMyNTY5MSchDQoNCldhcm5pbmc6IGNvdWxkbid0IGZpbmQgZmFzdGEgcmVjb3JkIGZvciAnTVQnIQ0KDQpXYXJuaW5nOiBjb3VsZG4ndCBmaW5kIGZhc3RhIHJlY29yZCBmb3IgJ01UUichDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCg0KIyMjIyBBZGRpdGlvbmFsIGRpcmVjdG9yaWVzIGFuZCBjb250ZW50cyBmb2xsb3dpbmcgdGhlIHJ1bg0KDQp+L3RvcGhhdF9zcG9tYmUkIGxzIC1sdA0KDQpkcnd4cnd4ci14IDMgdWJ1bnR1IHVidW50dSAgICAgNDA5NiBBcHIgIDkgMTc6NDQgbWVyZ2VkX2FzbQ0KDQoqKi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMTg1IEFwciAgOSAxNzo0NCBTY2hpem9zYWNjaGFyb215Y2VzX3BvbWJlX2FsbF9jaHJvbW9zb21lcy5mYS5mYWkqKg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgIDExOSBBcHIgIDkgMTc6NDEgYXNzZW1ibHkudHh0DQoNCg0KIyMgQ3VmZmRpZmY6IFJ1biBDdWZmZGlmZiBieSB1c2luZyB0aGUgbWVyZ2VkIHRyYW5zY3JpcHRvbWUgYXNzZW1ibHkgYWxvbmcgd2l0aCB0aGUgQkFNIGZpbGVzIGZyb20gVG9wSGF0IGZvciBlYWNoIHJlcGxpY2F0ZQ0KDQoNCiMjIyMgfi90b3BoYXRfc3BvbWJlJCBjdWZmZGlmZiAtbyBkaWZmX291dCAtYiBTY2hpem9zYWNjaGFyb215Y2VzX3BvbWJlX2FsbF9jaHJvbW9zb21lcy5mYSAtcCA4IC1MIEMxLEMyIC11IG1lcmdlZF9hc20vbWVyZ2VkLmd0ZiB0b3BoYXQuU3BfZHMuZGlyL2FjY2VwdGVkX2hpdHMuYmFtLHRvcGhhdC5TcF9ocy5kaXIvYWNjZXB0ZWRfaGl0cy5iYW0gdG9waGF0LlNwX2xvZy5kaXIvYWNjZXB0ZWRfaGl0cy5iYW0sdG9waGF0LlNwX3BsYXQuZGlyL2FjY2VwdGVkX2hpdHMuYmFtIA0KDQoqKiBIZXJlIGFzc3VtaW5nIFNwX2RzIGFuZCBTcF9ocyBhcmUgcmVwbGljYXRlcy4gU2ltaWxhcmx5IGl0IGlzIGFzc3VtZWQgdGhhdCBTcC1sb2cgYW5kIFNwX3BsYXQgYXJlIHJlcGxpY2F0ZXMuKioNCg0KV2FybmluZzogQ291bGQgbm90IGNvbm5lY3QgdG8gdXBkYXRlIHNlcnZlciB0byB2ZXJpZnkgY3VycmVudCB2ZXJzaW9uLiBQbGVhc2UgY2hlY2sgYXQgdGhlIEN1ZmZsaW5rcyB3ZWJzaXRlIChodHRwOi8vY3VmZmxpbmtzLmNiY2IudW1kLmVkdSkuDQoNClsxNzo1Mzo1MV0gTG9hZGluZyByZWZlcmVuY2UgYW5ub3RhdGlvbiBhbmQgc2VxdWVuY2UuDQoNCldhcm5pbmc6IGNvdWxkbid0IGZpbmQgZmFzdGEgcmVjb3JkIGZvciAnQUIzMjU2OTEnIQ0KDQpUaGlzIGNvbnRpZyB3aWxsIG5vdCBiZSBiaWFzIGNvcnJlY3RlZC4NCg0KV2FybmluZzogY291bGRuJ3QgZmluZCBmYXN0YSByZWNvcmQgZm9yICdNVCchDQoNClRoaXMgY29udGlnIHdpbGwgbm90IGJlIGJpYXMgY29ycmVjdGVkLg0KDQpXYXJuaW5nOiBjb3VsZG4ndCBmaW5kIGZhc3RhIHJlY29yZCBmb3IgJ01UUichDQoNClRoaXMgY29udGlnIHdpbGwgbm90IGJlIGJpYXMgY29ycmVjdGVkLg0KDQpbMTc6NTM6NTJdIEluc3BlY3RpbmcgbWFwcyBhbmQgZGV0ZXJtaW5pbmcgZnJhZ21lbnQgbGVuZ3RoIGRpc3RyaWJ1dGlvbnMuDQoNClsxNzo1NDowN10gTW9kZWxpbmcgZnJhZ21lbnQgY291bnQgb3ZlcmRpc3BlcnNpb24uDQoNClsxNzo1NDo1OF0gTW9kZWxpbmcgZnJhZ21lbnQgY291bnQgb3ZlcmRpc3BlcnNpb24uDQoNCj4gTWFwIFByb3BlcnRpZXM6DQo+CU5vcm1hbGl6ZWQgTWFwIE1hc3M6IDkzMzQxNC42OA0KPglSYXcgTWFwIE1hc3M6IDkyMjkwMS42OQ0KPglOdW1iZXIgb2YgTXVsdGktUmVhZHM6IDM1OTQ1ICh3aXRoIDE0ODc4NSB0b3RhbCBoaXRzKQ0KPglGcmFnbWVudCBMZW5ndGggRGlzdHJpYnV0aW9uOiBFbXBpcmljYWwgKGxlYXJuZWQpDQo+CSAgICAgICAgICAgICAgRXN0aW1hdGVkIE1lYW46IDI2Mi40Nw0KPgkgICAgICAgICAgIEVzdGltYXRlZCBTdGQgRGV2OiA2MS43MQ0KDQo+IE1hcCBQcm9wZXJ0aWVzOg0KPglOb3JtYWxpemVkIE1hcCBNYXNzOiA5MzM0MTQuNjgNCj4JUmF3IE1hcCBNYXNzOiA5MjM4OTMuNzANCj4JTnVtYmVyIG9mIE11bHRpLVJlYWRzOiA2NDczOCAod2l0aCAzNzk1MTEgdG90YWwgaGl0cykNCj4JRnJhZ21lbnQgTGVuZ3RoIERpc3RyaWJ1dGlvbjogRW1waXJpY2FsIChsZWFybmVkKQ0KPgkgICAgICAgICAgICAgIEVzdGltYXRlZCBNZWFuOiAyNzYuNzANCj4JICAgICAgICAgICBFc3RpbWF0ZWQgU3RkIERldjogNjAuNzMNCg0KPiBNYXAgUHJvcGVydGllczoNCj4JTm9ybWFsaXplZCBNYXAgTWFzczogOTMzNDE0LjY4DQo+CVJhdyBNYXAgTWFzczogOTMwMDY1LjMyDQo+CU51bWJlciBvZiBNdWx0aS1SZWFkczogNDA2OTQgKHdpdGggMTE2ODg3IHRvdGFsIGhpdHMpDQo+CUZyYWdtZW50IExlbmd0aCBEaXN0cmlidXRpb246IEVtcGlyaWNhbCAobGVhcm5lZCkNCj4JICAgICAgICAgICAgICBFc3RpbWF0ZWQgTWVhbjogMjYzLjk5DQo+CSAgICAgICAgICAgRXN0aW1hdGVkIFN0ZCBEZXY6IDYwLjM3DQoNCj4gTWFwIFByb3BlcnRpZXM6DQo+CU5vcm1hbGl6ZWQgTWFwIE1hc3M6IDkzMzQxNC42OA0KPglSYXcgTWFwIE1hc3M6IDkyNzAxMi44Ng0KPglOdW1iZXIgb2YgTXVsdGktUmVhZHM6IDQ4MTQ0ICh3aXRoIDI5NDM3MCB0b3RhbCBoaXRzKQ0KPglGcmFnbWVudCBMZW5ndGggRGlzdHJpYnV0aW9uOiBFbXBpcmljYWwgKGxlYXJuZWQpDQo+CSAgICAgICAgICAgICAgRXN0aW1hdGVkIE1lYW46IDI2NC4xMA0KPgkgICAgICAgICAgIEVzdGltYXRlZCBTdGQgRGV2OiA2NC41MQ0KDQpbMTc6NTU6NTBdIENhbGN1bGF0aW5nIHByZWxpbWluYXJ5IGFidW5kYW5jZSBlc3RpbWF0ZXMNCg0KPiBQcm9jZXNzZWQgMzc0NCBsb2NpLiAgICAgICAgICAgICAgICAgICAgICAgICBbKioqKioqKioqKioqKioqKioqKioqKioqKl0gMTAwJQ0KDQpbMTc6NTY6MjZdIExlYXJuaW5nIGJpYXMgcGFyYW1ldGVycy4NCg0KWzE3OjU2OjQxXSBUZXN0aW5nIGZvciBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmQgcmVndWxhdGlvbiBpbiBsb2N1cy4NCg0KPiBQcm9jZXNzZWQgMzc0NCBsb2NpLiAgICAgICAgICAgICAgICAgICAgICAgICBbKioqKioqKioqKioqKioqKioqKioqKioqKl0gMTAwJQ0KDQpQZXJmb3JtZWQgNTEwMCBpc29mb3JtLWxldmVsIHRyYW5zY3JpcHRpb24gZGlmZmVyZW5jZSB0ZXN0cw0KDQpQZXJmb3JtZWQgNDkxNiB0c3MtbGV2ZWwgdHJhbnNjcmlwdGlvbiBkaWZmZXJlbmNlIHRlc3RzDQoNClBlcmZvcm1lZCA0NDMxIGdlbmUtbGV2ZWwgdHJhbnNjcmlwdGlvbiBkaWZmZXJlbmNlIHRlc3RzDQoNClBlcmZvcm1lZCA0MzgzIENEUy1sZXZlbCB0cmFuc2NyaXB0aW9uIGRpZmZlcmVuY2UgdGVzdHMNCg0KUGVyZm9ybWVkIDAgc3BsaWNpbmcgdGVzdHMNCg0KUGVyZm9ybWVkIDAgcHJvbW90ZXIgcHJlZmVyZW5jZSB0ZXN0cw0KDQpQZXJmb3JtaW5nIDAgcmVsYXRpdmUgQ0RTIG91dHB1dCB0ZXN0cw0KDQpXcml0aW5nIGlzb2Zvcm0tbGV2ZWwgRlBLTSB0cmFja2luZw0KDQpXcml0aW5nIFRTUyBncm91cC1sZXZlbCBGUEtNIHRyYWNraW5nDQoNCldyaXRpbmcgZ2VuZS1sZXZlbCBGUEtNIHRyYWNraW5nDQoNCldyaXRpbmcgQ0RTLWxldmVsIEZQS00gdHJhY2tpbmcNCg0KV3JpdGluZyBpc29mb3JtLWxldmVsIGNvdW50IHRyYWNraW5nDQoNCldyaXRpbmcgVFNTIGdyb3VwLWxldmVsIGNvdW50IHRyYWNraW5nDQoNCldyaXRpbmcgZ2VuZS1sZXZlbCBjb3VudCB0cmFja2luZw0KDQpXcml0aW5nIENEUy1sZXZlbCBjb3VudCB0cmFja2luZw0KDQpXcml0aW5nIGlzb2Zvcm0tbGV2ZWwgcmVhZCBncm91cCB0cmFja2luZw0KDQpXcml0aW5nIFRTUyBncm91cC1sZXZlbCByZWFkIGdyb3VwIHRyYWNraW5nDQoNCldyaXRpbmcgZ2VuZS1sZXZlbCByZWFkIGdyb3VwIHRyYWNraW5nDQoNCldyaXRpbmcgQ0RTLWxldmVsIHJlYWQgZ3JvdXAgdHJhY2tpbmcNCg0KV3JpdGluZyByZWFkIGdyb3VwIGluZm8NCg0KV3JpdGluZyBydW4gaW5mbw0KDQojIyBjdW1tZVJidW5kOiBEYXRhIGFuYWx5c2lzDQoNCmBgYHtyfQ0KbGlicmFyeShjdW1tZVJidW5kKQ0KYGBgDQoNCiMjIyBDcmVhdGUgYSBDdW1tZVJidW5kIGRhdGFiYXNlIGZyb20gdGhlIEN1ZmZkaWZmIG91dHB1dA0KDQpgYGB7cn0NCmN1ZmZfZGF0YSA8LSByZWFkQ3VmZmxpbmtzKCJkaWZmX291dC8iKQ0KY3VmZl9kYXRhDQpgYGANCg0KDQojIyMgUGxvdCB0aGUgZGlzdHJpYnV0aW9uIG9mIGV4cHJlc3Npb24gbGV2ZWxzIGZvciBlYWNoIHNhbXBsZQ0KDQoNCmBgYHtyfQ0KY3NEZW5zaXR5KGdlbmVzKGN1ZmZfZGF0YSkpDQpgYGANCg0KIyMjIENvbXBhcmUgdGhlIGV4cHJlc3Npb24gb2YgZWFjaCBnZW5lIGluIHR3byBjb25kaXRpb25zIHdpdGggYSBzY2F0dGVyIHBsb3QNCg0KYGBge3J9DQpjc1NjYXR0ZXIoZ2VuZXMoY3VmZl9kYXRhKSwgJ0MxJywgJ0MyJykNCmBgYA0KDQoNCiMjIyBDcmVhdGUgYSB2b2xjYW5vIHBsb3QgdG8gaW5zcGVjdCBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQgZ2VuZXMNCg0KYGBge3J9DQpjc1ZvbGNhbm8oZ2VuZXMoY3VmZl9kYXRhKSwgJ0MxJywgJ0MyJykNCmBgYA0KDQoNCg0KDQoNCiMjIyBHZW5lcyBhbmQgdHJhbnNjcmlwdHMgdGhhdCBhcmUgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGJldHdlZW4gdHdvIHNhbXBsZXMuDQoNCmBgYHtyfQ0KZ2VuZV9kaWZmX2RhdGEgPC0gZGlmZkRhdGEoZ2VuZXMoY3VmZl9kYXRhKSkNCmhlYWQoZ2VuZV9kaWZmX2RhdGEpDQpgYGANCg0KDQoNCmBgYHtyfQ0KZ2VuZV9kaWZmX2RhdGEgPC0gZGlmZkRhdGEoZ2VuZXMoY3VmZl9kYXRhKSkNCnNpZ19nZW5lX2RhdGEgPC0gc3Vic2V0KGdlbmVfZGlmZl9kYXRhLCAoc2lnbmlmaWNhbnQgPT0gJ3llcycpKQ0KaGVhZChzaWdfZ2VuZV9kYXRhKQ0KYGBgDQoNCg0KDQoNCiMjIyMgRGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIHRyYW5zY3JpcHRzIG9yIGRpZmZlcmVudGlhbGx5IHNwbGljZWQgYW5kIHJlZ3VsYXRlZCBnZW5lcw0KDQpgYGB7cn0NCmlzb2Zvcm1fZGlmZl9kYXRhIDwtIGRpZmZEYXRhKGlzb2Zvcm1zKGN1ZmZfZGF0YSksICdDMScsICdDMicpDQpzaWdfaXNvZm9ybV9kYXRhIDwtIHN1YnNldChpc29mb3JtX2RpZmZfZGF0YSwgKHNpZ25pZmljYW50ID09ICd5ZXMnKSkNCm5yb3coc2lnX2lzb2Zvcm1fZGF0YSkNCmBgYA0KDQoNCmBgYHtyfQ0KDQp0c3NfZGlmZl9kYXRhIDwtIGRpZmZEYXRhKFRTUyhjdWZmX2RhdGEpLCAnQzEnLCAnQzInKQ0Kc2lnX3Rzc19kYXRhIDwtIHN1YnNldCh0c3NfZGlmZl9kYXRhLCAoc2lnbmlmaWNhbnQgPT0gJ3llcycpKQ0KbnJvdyhzaWdfdHNzX2RhdGEpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQpjZHNfZGlmZl9kYXRhIDwtIGRpZmZEYXRhKENEUyhjdWZmX2RhdGEpLCAnQzEnLCAnQzInKQ0Kc2lnX2Nkc19kYXRhIDwtIHN1YnNldChjZHNfZGlmZl9kYXRhLCAoc2lnbmlmaWNhbnQgPT0gJ3llcycpKQ0KbnJvdyhzaWdfY2RzX2RhdGEpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KcHJvbW90ZXJfZGlmZl9kYXRhIDwtIGRpc3RWYWx1ZXMocHJvbW90ZXJzKGN1ZmZfZGF0YSkpDQpzaWdfcHJvbW90ZXJfZGF0YSA8LSBzdWJzZXQocHJvbW90ZXJfZGlmZl9kYXRhLCAoc2lnbmlmaWNhbnQgPT0gJ3llcycpKQ0KbnJvdyhzaWdfcHJvbW90ZXJfZGF0YSkNCg0KYGBgDQoNCg0KYGBge3J9DQpzcGxpY2luZ19kaWZmX2RhdGEgPC0gZGlzdFZhbHVlcyhzcGxpY2luZyhjdWZmX2RhdGEpKQ0Kc2lnX3NwbGljaW5nX2RhdGEgPC0gc3Vic2V0KHNwbGljaW5nX2RpZmZfZGF0YSwgKHNpZ25pZmljYW50ID09ICd5ZXMnKSkNCm5yb3coc2lnX3NwbGljaW5nX2RhdGEpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KcmVsQ0RTX2RpZmZfZGF0YSA8LSBkaXN0VmFsdWVzKHJlbENEUyhjdWZmX2RhdGEpKQ0Kc2lnX3JlbENEU19kYXRhIDwtIHN1YnNldChyZWxDRFNfZGlmZl9kYXRhLCAoc2lnbmlmaWNhbnQgPT0gJ3llcycpKQ0KbnJvdyhzaWdfcmVsQ0RTX2RhdGEpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==