1 PBMC Infection Differential Expression, Infection: 20190107 Rundate: 20190108

This document turns to the infection of PBMC cells with L.panamensis. This data is particularly strangely affected by the different strains used to infect the cells, and as a result is both useful and troubling.

Given the observations above, we have some ideas of ways to pass the data for differential expression analyses which may or may not be ‘better’. Lets try some and see what happens.

1.1 Create data sets to compare differential expression analyses

Given the above ways to massage the data, lets use a few of them for limma/deseq/edger. The main caveat in this is that those tools really do expect specific distributions of data which we horribly violate if we use log2() data, which is why in the previous blocks I named them l2blahblah, thus we can do the same sets of normalization but without that and forcibly push the resulting data into limma/edger/deseq.

2 The negative control

Everything I did in 02_estimation_infection.html suggests that there are no significant differences visible if one looks just at chronic/self-healing in this data. Further testing has seemingly proven this statement, as a result most of the following analyses will look at chronic/uninfected and self-healing/uninfected followed by attempts to reconcile those results.

2.1 Filter the data

To save some time and annoyance with sva, lets filter the data now. In addition, write down a small function used to extract the sets of significant genes across different contrasts (notably self/uninfected vs. chronic/uninfected).

3 Initial analysis with no removals

3.2 sva

##        change_counts_up change_counts_down
## sh_nil              877                330
## ch_nil              899                327
## ch_sh                 0                  0

At this point, we should see that there are no significant differences between the chronic and self-healing samples when we look at all samples. The following will attempt to query why this is the case and decide on what to do about it.

4 P-value distributions on a per-donor basis

While sitting with Hector in 201812, we ended up focusing on the distribution of p-values observed when performing a chronic vs. self-healing comparison. This was eventually expanded to include that distribution for each of the three individual donors.

4.2 Donor 108

## There were 18, now there are 6 samples.
##           Length Class      Mode
## sh_vs_chr 46     data.frame list
##                 ensembltranscriptid   ensemblgeneid hgncsymbol
## ENSG00000119457     ENST00000374228 ENSG00000119457    SLC46A2
## ENSG00000162493     ENST00000294489 ENSG00000162493       PDPN
##                                                                           description
## ENSG00000119457 solute carrier family 46 member 2 [Source:HGNC Symbol;Acc:HGNC:16055]
## ENSG00000162493                        podoplanin [Source:HGNC Symbol;Acc:HGNC:29602]
##                    genebiotype deseq_logfc deseq_adjp edger_logfc
## ENSG00000119457 protein_coding       1.124     0.9999       1.110
## ENSG00000162493 protein_coding       1.054     0.9999       1.047
##                 edger_adjp limma_logfc limma_adjp basic_nummed
## ENSG00000119457          1      1.0310     0.9984       0.8026
## ENSG00000162493          1      0.9181     0.9984       1.5200
##                 basic_denmed basic_numvar basic_denvar basic_logfc basic_t
## ENSG00000119457     -0.09514    2.568e-01    6.194e-02      0.8977   3.281
## ENSG00000162493      0.80260    9.344e-01    5.950e-01      0.7173   1.414
##                   basic_p basic_adjp deseq_basemean deseq_lfcse deseq_stat
## ENSG00000119457 4.843e-02      1e+00          14.09      0.5510      2.039
## ENSG00000162493 2.335e-01      1e+00          22.92      0.5347      1.971
##                 deseq_p ebseq_fc ebseq_logfc ebseq_postfc ebseq_mean
## ENSG00000119457 0.04144    2.246       1.167        2.187      14.19
## ENSG00000162493 0.04873    2.177       1.122        2.143      23.12
##                 ebseq_ppee ebseq_ppde ebseq_adjp edger_logcpm edger_lr
## ENSG00000119457          1  2.896e-05          1       0.5923    6.374
## ENSG00000162493          1  4.423e-06          1       1.2200    4.785
##                 edger_p limma_ave limma_t limma_b limma_p limma_adjp_fdr
## ENSG00000119457 0.01158    0.2681   2.918  -4.453 0.01789      9.984e-01
## ENSG00000162493 0.02871    0.8417   1.655  -4.532 0.13370      9.984e-01
##                 deseq_adjp_fdr edger_adjp_fdr basic_adjp_fdr lfc_meta
## ENSG00000119457      1.000e+00      1.000e+00          1e+00    1.117
## ENSG00000162493      1.000e+00      1.000e+00          1e+00    1.017
##                   lfc_var lfc_varbymed    p_meta     p_var
## ENSG00000119457 0.000e+00    0.000e+00 2.364e-02 2.477e-04
## ENSG00000162493 3.373e-03    3.317e-03 7.038e-02 3.107e-03

4.3 Donor 110

## There were 18, now there are 6 samples.
##           Length Class      Mode
## sh_vs_chr 46     data.frame list
##                 ensembltranscriptid   ensemblgeneid hgncsymbol
## ENSG00000143333     ENST00000367558 ENSG00000143333      RGS16
## ENSG00000120436     ENST00000366834 ENSG00000120436      GPR31
## ENSG00000099985     ENST00000215781 ENSG00000099985        OSM
## ENSG00000137834     ENST00000288840 ENSG00000137834      SMAD6
## ENSG00000177807     ENST00000368089 ENSG00000177807     KCNJ10
## ENSG00000114115     ENST00000232219 ENSG00000114115       RBP1
##                                                                                              description
## ENSG00000143333                   regulator of G-protein signaling 16 [Source:HGNC Symbol;Acc:HGNC:9997]
## ENSG00000120436                         G protein-coupled receptor 31 [Source:HGNC Symbol;Acc:HGNC:4486]
## ENSG00000099985                                          oncostatin M [Source:HGNC Symbol;Acc:HGNC:8506]
## ENSG00000137834                                  SMAD family member 6 [Source:HGNC Symbol;Acc:HGNC:6772]
## ENSG00000177807 potassium voltage-gated channel subfamily J member 10 [Source:HGNC Symbol;Acc:HGNC:6256]
## ENSG00000114115                             retinol binding protein 1 [Source:HGNC Symbol;Acc:HGNC:9919]
##                    genebiotype deseq_logfc deseq_adjp edger_logfc
## ENSG00000143333 protein_coding       1.510  6.358e-05      1.4950
## ENSG00000120436 protein_coding       1.478  1.000e+00      1.4550
## ENSG00000099985 protein_coding       1.226  5.618e-06      1.2100
## ENSG00000137834 protein_coding       1.155  1.000e+00      1.1340
## ENSG00000177807 protein_coding       1.035  1.593e-01      1.0190
## ENSG00000114115 protein_coding       1.012  1.000e+00      0.9872
##                 edger_adjp limma_logfc limma_adjp basic_nummed
## ENSG00000143333  4.147e-06      1.5450     0.2282       2.7930
## ENSG00000120436  5.293e-02      1.4270     0.2438       1.1730
## ENSG00000099985  1.314e-06      1.2660     0.2282       5.6940
## ENSG00000137834  8.498e-02      1.1040     0.2282       0.7448
## ENSG00000177807  1.213e-01      0.9465     0.3169       3.0800
## ENSG00000114115  1.662e-01      1.1950     0.2322       1.0860
##                 basic_denmed basic_numvar basic_denvar basic_logfc basic_t
## ENSG00000143333      1.47500    1.042e-01    1.044e-01       1.319   5.790
## ENSG00000120436     -0.77380    8.287e-01    1.687e-01       1.946   2.391
## ENSG00000099985      4.19700    6.884e-02    1.701e-01       1.497   4.498
## ENSG00000137834     -0.53530    1.577e-01    9.161e-02       1.280   3.796
## ENSG00000177807      1.91800    9.209e-01    1.252e-01       1.162   1.501
## ENSG00000114115     -0.04987    1.772e-02    8.064e-01       1.136   2.286
##                   basic_p basic_adjp deseq_basemean deseq_lfcse deseq_stat
## ENSG00000143333 4.422e-03  4.809e-01          68.76      0.2758      5.477
## ENSG00000120436 1.034e-01  4.811e-01          16.89      0.5436      2.719
## ENSG00000099985 1.573e-02  4.809e-01         484.20      0.2032      6.031
## ENSG00000137834 2.169e-02  4.809e-01          15.79      0.4878      2.368
## ENSG00000177807 2.461e-01  5.601e-01          73.35      0.3745      2.765
## ENSG00000114115 1.442e-01  4.928e-01          21.96      0.4624      2.188
##                   deseq_p ebseq_fc ebseq_logfc ebseq_postfc ebseq_mean
## ENSG00000143333 4.315e-08    2.874       1.523        2.851      69.31
## ENSG00000120436 6.544e-03    2.807       1.489        2.719      16.93
## ENSG00000099985 1.634e-09    2.396       1.261        2.394     488.89
## ENSG00000137834 1.787e-02    2.256       1.174        2.201      15.95
## ENSG00000177807 5.700e-03    2.060       1.043        2.050      73.55
## ENSG00000114115 2.866e-02    2.073       1.051        2.040      22.14
##                 ebseq_ppee ebseq_ppde ebseq_adjp edger_logcpm edger_lr
## ENSG00000143333  4.467e-10  1.000e+00  4.467e-10       2.2710   36.250
## ENSG00000120436  2.182e-01  7.818e-01  2.182e-01       0.3850   11.210
## ENSG00000099985  1.874e-06  1.000e+00  1.874e-06       5.0590   39.490
## ENSG00000137834  1.000e+00  1.816e-12  1.000e+00       0.2622    9.693
## ENSG00000177807  7.014e-01  2.986e-01  7.014e-01       2.3790    8.339
## ENSG00000114115  2.122e-01  7.878e-01  2.122e-01       0.7058    6.987
##                   edger_p limma_ave limma_t limma_b   limma_p
## ENSG00000143333 1.736e-09   1.99000   6.492 -0.2393 0.0002045
## ENSG00000120436 8.155e-04  -0.09402   2.825 -3.3940 0.0227200
## ENSG00000099985 3.300e-10   4.85000   5.981  0.5318 0.0003530
## ENSG00000137834 1.850e-03  -0.02053   3.616 -2.8330 0.0070230
## ENSG00000177807 3.880e-03   2.09500   2.052 -3.9700 0.0748700
## ENSG00000114115 8.210e-03   0.38370   3.042 -3.1270 0.0163500
##                 limma_adjp_fdr deseq_adjp_fdr edger_adjp_fdr
## ENSG00000143333      2.282e-01      7.363e-05      4.147e-06
## ENSG00000120436      2.438e-01      1.888e-01      5.294e-02
## ENSG00000099985      2.282e-01      6.505e-06      1.314e-06
## ENSG00000137834      2.282e-01      2.751e-01      8.499e-02
## ENSG00000177807      3.169e-01      1.816e-01      1.213e-01
## ENSG00000114115      2.322e-01      3.192e-01      1.662e-01
##                 basic_adjp_fdr lfc_meta   lfc_var lfc_varbymed    p_meta
## ENSG00000143333      4.809e-01   1.5280 1.951e-03    1.277e-03 6.818e-05
## ENSG00000120436      4.811e-01   1.4780 4.320e-04    2.922e-04 1.003e-02
## ENSG00000099985      4.809e-01   1.3010 2.058e-02    1.582e-02 1.177e-04
## ENSG00000137834      4.809e-01   1.1050 4.602e-03    4.164e-03 8.914e-03
## ENSG00000177807      5.600e-01   0.9865 4.913e-03    4.980e-03 2.815e-02
## ENSG00000114115      4.928e-01   1.0720 1.590e-02    1.483e-02 1.774e-02
##                     p_var
## ENSG00000143333 1.394e-08
## ENSG00000120436 1.290e-04
## ENSG00000099985 4.154e-08
## ENSG00000137834 6.684e-05
## ENSG00000177807 1.638e-03
## ENSG00000114115 1.060e-04

The above plots suggest, along with the PCA plots of all samples, that one or more strains are either switched or at least very problematic. Specifically, samples from the strains annotated 2504 and 2272. Therefore, we next embarked on a series of comparisons of what happens when we remove each of them individually, and then both.

5 Remove samples from strain 2504 and/or 2272

This block will first remove strain 2504, then 2272. The resulting subsets will be used for another round of these differential expression analyses.

5.1 Create datasets

In this block we will perform the various removals, creating ‘remove_2504’, ‘remove_2272’, and ‘remove_both’. In addition, there are versions of this with and without the uninfected samples. We eventually decided to use the data with the uninfected samples for our final analyses; but we will have some pca etc. plots without them first because the uninfected make it harder to see the distributions because they are so very different than the infected.

## There were 18, now there are 15 samples.
## There were 18, now there are 15 samples.
## There were 15, now there are 12 samples.
## There were 21, now there are 18 samples.
## There were 21, now there are 18 samples.
## There were 18, now there are 15 samples.
## There were 15, now there are 5 samples.
## There were 15, now there are 5 samples.
## There were 15, now there are 5 samples.
## There were 15, now there are 5 samples.
## There were 15, now there are 5 samples.
## There were 15, now there are 5 samples.
## There were 12, now there are 4 samples.
## There were 12, now there are 4 samples.
## There were 12, now there are 4 samples.

6 Remove 2504 analyses

Strain 2504 was the first thing Hector focused upon, so let us perform a few metrics without it.

6.1 Remove 2504 initial plots

6.1.2 All donors, remove 2504 pairwise

Given the clustering of the samples after removing the 2504 strain samples, let us now perform the pairwise analysis and see how it looks.

Note that these are performed with the uninfected samples while the previous metrics were without them. This will include one round with batch in the model and one round using svaseq. In addition, we are relaxing the log fold-change and p-value constraints to 0.6 and 0.1 respectively.

6.1.2.1 DESeq MAplot, chronic vs self-healing all donors remove 2504

7 Remove 2272 analyses

This should be an exact repetition of the 2504 removal above, so I removed the commentary.

7.1 Remove 2272 initial plots

8 Remove both analyses

This should be an exact repetition of the 2504/2272 removals above, so I removed the commentary.

8.1 Remove both initial plots

8.1.2 All donors, remove both pairwise

##        change_counts_up change_counts_down
## sh_nil             1511               1012
## ch_nil             1568               1096
## ch_sh                43                 36
##        change_counts_up change_counts_down
## sh_nil              866                296
## ch_nil              953                401
## ch_sh                 4                 14

8.1.2.1 DESeq MAplot, chronic vs self-healing all donors remove both

9 Compare analyses

Now that we have performed a set of analyses looking at the various combinations of strains and donors, let us look at how similar are the distributions of logFC and rank orders.

9.1 Compare the donors to each other

## $sh_vs_chr
## $sh_vs_chr$logfc
## [1] 0.04986
## 
## $sh_vs_chr$p
## [1] -0.01345
## 
## $sh_vs_chr$adjp
## [1] 0.04919
## $sh_vs_chr
## $sh_vs_chr$logfc
## [1] 0.5236
## 
## $sh_vs_chr$p
## [1] 0.2382
## 
## $sh_vs_chr$adjp
## [1] 0.0238
## $sh_vs_chr
## $sh_vs_chr$logfc
## [1] -0.1194
## 
## $sh_vs_chr$p
## [1] 0.003014
## 
## $sh_vs_chr$adjp
## [1] 0.04387

Wow I had forgotten how ridiculously different the 3 donors are.

9.2 Compare remove one vs remove both

9.2.1 Batch in model

## Testing method: deseq.
## Adding method: deseq to the set.
## $sh_nil
## $sh_nil$logfc
## [1] 0.9999
## 
## $sh_nil$p
## [1] 0.9953
## 
## $sh_nil$adjp
## [1] 0.9953
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 0.9923
## 
## $ch_nil$p
## [1] 0.9739
## 
## $ch_nil$adjp
## [1] 0.9739
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 0.9257
## 
## $ch_sh$p
## [1] 0.796
## 
## $ch_sh$adjp
## [1] 0.7625
## Testing method: deseq.
## Adding method: deseq to the set.
## $sh_nil
## $sh_nil$logfc
## [1] 0.9917
## 
## $sh_nil$p
## [1] 0.9724
## 
## $sh_nil$adjp
## [1] 0.9724
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 0.9999
## 
## $ch_nil$p
## [1] 0.9974
## 
## $ch_nil$adjp
## [1] 0.9974
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 0.9508
## 
## $ch_sh$p
## [1] 0.8686
## 
## $ch_sh$adjp
## [1] 0.7791

9.2.2 sva

## Testing method: deseq.
## Adding method: deseq to the set.
## $sh_nil
## $sh_nil$logfc
## [1] 0.997
## 
## $sh_nil$p
## [1] 0.9878
## 
## $sh_nil$adjp
## [1] 0.9878
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 0.9889
## 
## $ch_nil$p
## [1] 0.9665
## 
## $ch_nil$adjp
## [1] 0.9665
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 0.9125
## 
## $ch_sh$p
## [1] 0.7655
## 
## $ch_sh$adjp
## [1] 0.7843
## Testing method: deseq.
## Adding method: deseq to the set.
## $sh_nil
## $sh_nil$logfc
## [1] 0.9893
## 
## $sh_nil$p
## [1] 0.9674
## 
## $sh_nil$adjp
## [1] 0.9674
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 0.9994
## 
## $ch_nil$p
## [1] 0.9965
## 
## $ch_nil$adjp
## [1] 0.9965
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 0.9553
## 
## $ch_sh$p
## [1] 0.8818
## 
## $ch_sh$adjp
## [1] 0.8223

9.3 Compare remove both against all samples

9.3.1 Batch in the model

## $sh_nil
## $sh_nil$logfc
## [1] 0.9917
## 
## $sh_nil$p
## [1] 0.9699
## 
## $sh_nil$adjp
## [1] 0.9699
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 0.9926
## 
## $ch_nil$p
## [1] 0.9728
## 
## $ch_nil$adjp
## [1] 0.9728
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 0.8154
## 
## $ch_sh$p
## [1] 0.5951
## 
## $ch_sh$adjp
## [1] 0.542

9.3.2 sva

## $sh_nil
## $sh_nil$logfc
## [1] 0.9903
## 
## $sh_nil$p
## [1] 0.9678
## 
## $sh_nil$adjp
## [1] 0.9678
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 0.9919
## 
## $ch_nil$p
## [1] 0.9717
## 
## $ch_nil$adjp
## [1] 0.9717
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 0.8215
## 
## $ch_sh$p
## [1] 0.5961
## 
## $ch_sh$adjp
## [1] 0.5484

10 Try again on the parasite data

10.1 Remember our data set

LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDE5MDEwNzogRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gb2YgaW5mZWN0ZWQgUEJNQ3MuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiBmb250LXNpemU6IDE2cHgKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0PTgsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAiMDJfZXN0aW1hdGlvbl9pbmZlY3Rpb25fMjAxODA4MjIuUm1kIgp2ZXIgPC0gIjIwMTgwODIyIgojIyBJIGFtIGxvYWRpbmcgZnJvbSBhIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIG1ldHJpY3MgZmlsZS4KCnRtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkKcm1kX2ZpbGUgPC0gIjAzX2V4cHJlc3Npb25faW5mZWN0aW9uXzIwMTkwMTA3LlJtZCIKdmVyIDwtICIyMDE5MDEwNyIKYGBgCgojIFBCTUMgSW5mZWN0aW9uIERpZmZlcmVudGlhbCBFeHByZXNzaW9uLCBJbmZlY3Rpb246IGByIHZlcmAgUnVuZGF0ZTogYHIgcnVuZGF0ZWAKClRoaXMgZG9jdW1lbnQgdHVybnMgdG8gdGhlIGluZmVjdGlvbiBvZiBQQk1DIGNlbGxzIHdpdGggTC5wYW5hbWVuc2lzLiAgVGhpcyBkYXRhCmlzIHBhcnRpY3VsYXJseSBzdHJhbmdlbHkgYWZmZWN0ZWQgYnkgdGhlIGRpZmZlcmVudCBzdHJhaW5zIHVzZWQgdG8gaW5mZWN0IHRoZQpjZWxscywgYW5kIGFzIGEgcmVzdWx0IGlzIGJvdGggdXNlZnVsIGFuZCB0cm91YmxpbmcuCgpHaXZlbiB0aGUgb2JzZXJ2YXRpb25zIGFib3ZlLCB3ZSBoYXZlIHNvbWUgaWRlYXMgb2Ygd2F5cyB0byBwYXNzIHRoZSBkYXRhIGZvcgpkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNlcyB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSAnYmV0dGVyJy4gIExldHMgdHJ5CnNvbWUgYW5kIHNlZSB3aGF0IGhhcHBlbnMuCgojIyBDcmVhdGUgZGF0YSBzZXRzIHRvIGNvbXBhcmUgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzZXMKCkdpdmVuIHRoZSBhYm92ZSB3YXlzIHRvIG1hc3NhZ2UgdGhlIGRhdGEsIGxldHMgdXNlIGEgZmV3IG9mIHRoZW0gZm9yCmxpbW1hL2Rlc2VxL2VkZ2VyLiBUaGUgbWFpbiBjYXZlYXQgaW4gdGhpcyBpcyB0aGF0IHRob3NlIHRvb2xzIHJlYWxseSBkbyBleHBlY3QKc3BlY2lmaWMgZGlzdHJpYnV0aW9ucyBvZiBkYXRhIHdoaWNoIHdlIGhvcnJpYmx5IHZpb2xhdGUgaWYgd2UgdXNlIGxvZzIoKSBkYXRhLAp3aGljaCBpcyB3aHkgaW4gdGhlIHByZXZpb3VzIGJsb2NrcyBJIG5hbWVkIHRoZW0gbDJibGFoYmxhaCwgdGh1cyB3ZSBjYW4gZG8gdGhlCnNhbWUgc2V0cyBvZiBub3JtYWxpemF0aW9uIGJ1dCB3aXRob3V0IHRoYXQgYW5kIGZvcmNpYmx5IHB1c2ggdGhlIHJlc3VsdGluZyBkYXRhCmludG8gbGltbWEvZWRnZXIvZGVzZXEuCgojIFRoZSBuZWdhdGl2ZSBjb250cm9sCgpFdmVyeXRoaW5nIEkgZGlkIGluIDAyX2VzdGltYXRpb25faW5mZWN0aW9uLmh0bWwgc3VnZ2VzdHMgdGhhdCB0aGVyZSBhcmUgbm8Kc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgdmlzaWJsZSBpZiBvbmUgbG9va3MganVzdCBhdCBjaHJvbmljL3NlbGYtaGVhbGluZyBpbgp0aGlzIGRhdGEuICBGdXJ0aGVyIHRlc3RpbmcgaGFzIHNlZW1pbmdseSBwcm92ZW4gdGhpcyBzdGF0ZW1lbnQsIGFzIGEgcmVzdWx0Cm1vc3Qgb2YgdGhlIGZvbGxvd2luZyBhbmFseXNlcyB3aWxsIGxvb2sgYXQgY2hyb25pYy91bmluZmVjdGVkIGFuZApzZWxmLWhlYWxpbmcvdW5pbmZlY3RlZCBmb2xsb3dlZCBieSBhdHRlbXB0cyB0byByZWNvbmNpbGUgdGhvc2UgcmVzdWx0cy4KCiMjIEZpbHRlciB0aGUgZGF0YQoKVG8gc2F2ZSBzb21lIHRpbWUgYW5kIGFubm95YW5jZSB3aXRoIHN2YSwgbGV0cyBmaWx0ZXIgdGhlIGRhdGEgbm93LiAgSW4KYWRkaXRpb24sIHdyaXRlIGRvd24gYSBzbWFsbCBmdW5jdGlvbiB1c2VkIHRvIGV4dHJhY3QgdGhlIHNldHMgb2Ygc2lnbmlmaWNhbnQKZ2VuZXMgYWNyb3NzIGRpZmZlcmVudCBjb250cmFzdHMgKG5vdGFibHkgc2VsZi91bmluZmVjdGVkIHZzLiBjaHJvbmljL3VuaW5mZWN0ZWQpLgoKYGBge3IgZmlsdGVyfQpoc19pbmZfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChoc19jZHNfaW5mLCBmaWx0ZXI9VFJVRSkpCmhzX3VuaW5mX2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQoaHNfY2RzX3VuaW5mLCBmaWx0ZXI9VFJVRSkpCmtlZXBlcnNfdW5pbmYgPC0gbGlzdCgic2hfbmlsIiA9IGMoInNoIiwgInVuaW5mIiksCiAgICAgICAgICAgICAgICAgICAgICAiY2hfbmlsIiA9IGMoImNociIsICJ1bmluZiIpLAogICAgICAgICAgICAgICAgICAgICAgImNoX3NoIiA9IGMoImNociIsICJzaCIpKQprZWVwZXJzX2luZiA8LSBsaXN0KCJjaF9zaCIgPSBjKCJjaHIiLCAic2giKSkKYGBgCgojIEluaXRpYWwgYW5hbHlzaXMgd2l0aCBubyByZW1vdmFscwoKIyMgQmF0Y2ggaW4gbW9kZWwKCmBgYHtyIHBhaXJ3aXNlX2JhdGNoLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX3BhaXJ3aXNlX2JhdGNoIDwtIHNtKGFsbF9wYWlyd2lzZShoc191bmluZl9maWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYmF0Y2g9VFJVRSwgZG9fZWJzZXE9RkFMU0UpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfcGF0YmF0Y2hfY29udHItdnt2ZXJ9Lnhsc3giKQpoc19jb21iaW5lZF9iYXRjaCA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBoc19wYWlyd2lzZV9iYXRjaCwKICBleGNlbD1leGNlbF9maWxlLAogIGtlZXBlcnM9a2VlcGVyc191bmluZikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9wYXRiYXRjaF9zaWctdnt2ZXJ9Lnhsc3giKQpoc19zaWdfYmF0Y2ggPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBoc19jb21iaW5lZF9iYXRjaCwKICBleGNlbD1leGNlbF9maWxlKSkKaHNfc2lnX2JhdGNoW1siZGVzZXEiXV1bWyJjb3VudHMiXV0KYGBgCgojIyMgU2hvdyBiYXRjaCBpbiBtb2RlbCBwbG90cwoKIyMjIyBERVNlcSBNQXBsb3QsIHNlbGYgaGVhbGluZyB2cyB1bmluZmVjdGVkCgpgYGB7ciBwYWlyd2lzZV9iYXRjaF9wbG90czAxfQpoc19jb21iaW5lZF9iYXRjaCRkZXNlcV9tYV9wbG90cyRzaF9uaWwkcGxvCmhzX2NvbWJpbmVkX2JhdGNoJHZlbm5zJHNoX25pbCR1cF9ub3dlaWdodApgYGAKCiMjIyMgREVTZXEgTUFwbG90LCBjaHJvbmljIHZzIHVuaW5mZWN0ZWQKCmBgYHtyIHBhaXJ3aXNlX2JhdGNoX3Bsb3RzMDJ9CmhzX2NvbWJpbmVkX2JhdGNoJGRlc2VxX21hX3Bsb3RzJGNoX25pbCRwbG90CmhzX2NvbWJpbmVkX2JhdGNoJHZlbm5zJGNoX25pbCR1cF9ub3dlaWdodApgYGAKCiMjIyMgREVTZXEgTUFwbG90LCBjaHJvbmljIHZzIHNlbGYtaGVhbGluZwoKYGBge3IgcGFpcndpc2VfYmF0Y2hfcGxvdHMwM30KaHNfY29tYmluZWRfYmF0Y2gkZGVzZXFfbWFfcGxvdHMkY2hfc2gkcGxvdApoc19jb21iaW5lZF9iYXRjaCR2ZW5ucyRjaF9zaCR1cF9ub3dlaWdodApgYGAKCiMjIHN2YQoKYGBge3IgcGFpcndpc2Vfc3ZhLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX3BhaXJ3aXNlX3N2YSA8LSBzbShhbGxfcGFpcndpc2UoaHNfdW5pbmZfZmlsdCwgbW9kZWxfYmF0Y2g9InN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fZWJzZXE9RkFMU0UpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3Rfc3ZhX2NvbnRyLXZ7dmVyfS54bHN4IikKaHNfY29tYmluZWRfc3ZhIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIGhzX3BhaXJ3aXNlX3N2YSwKICBleGNlbD1leGNlbF9maWxlLAogIGtlZXBlcnM9a2VlcGVyc191bmluZikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9zdmFfc2lnLXZ7dmVyfS54bHN4IikKaHNfc2lnX3N2YSA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGhzX2NvbWJpbmVkX3N2YSwKICBleGNlbD1leGNlbF9maWxlKSkKaHNfc2lnX3N2YSRkZXNlcSRjb3VudHMKYGBgCgpBdCB0aGlzIHBvaW50LCB3ZSBzaG91bGQgc2VlIHRoYXQgdGhlcmUgYXJlIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGJldHdlZW4KdGhlIGNocm9uaWMgYW5kIHNlbGYtaGVhbGluZyBzYW1wbGVzIHdoZW4gd2UgbG9vayBhdCBhbGwgc2FtcGxlcy4gIFRoZSBmb2xsb3dpbmcKd2lsbCBhdHRlbXB0IHRvIHF1ZXJ5IHdoeSB0aGlzIGlzIHRoZSBjYXNlIGFuZCBkZWNpZGUgb24gd2hhdCB0byBkbyBhYm91dCBpdC4KCiMgUC12YWx1ZSBkaXN0cmlidXRpb25zIG9uIGEgcGVyLWRvbm9yIGJhc2lzCgpXaGlsZSBzaXR0aW5nIHdpdGggSGVjdG9yIGluIDIwMTgxMiwgd2UgZW5kZWQgdXAgZm9jdXNpbmcgb24gdGhlIGRpc3RyaWJ1dGlvbiBvZgpwLXZhbHVlcyBvYnNlcnZlZCB3aGVuIHBlcmZvcm1pbmcgYSBjaHJvbmljIHZzLiBzZWxmLWhlYWxpbmcgY29tcGFyaXNvbi4gIFRoaXMKd2FzIGV2ZW50dWFsbHkgZXhwYW5kZWQgdG8gaW5jbHVkZSB0aGF0IGRpc3RyaWJ1dGlvbiBmb3IgZWFjaCBvZiB0aGUgdGhyZWUKaW5kaXZpZHVhbCBkb25vcnMuCgojIyBEb25vciAxMDcKCmBgYHtyIGVhY2hfaW5kaXZpZHVhbF8xMDd9CmQxMDcgPC0gc3Vic2V0X2V4cHQoaHNfaW5mX2ZpbHQsIHN1YnNldD0iZG9ub3I9PSdkMTA3JyIpCmQxMDdfcGFpcndpc2UgPC0gc20oYWxsX3BhaXJ3aXNlKGQxMDcsIG1vZGVsX2JhdGNoPUZBTFNFKSkKZDEwN190YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhkMTA3X3BhaXJ3aXNlKSkKc3VtbWFyeShkMTA3X3RhYmxlJGRhdGEpCmQxMDdfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoZDEwN190YWJsZSwgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBwX3R5cGU9InJhdyIpKQpkaW0oZDEwN19zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbMV1dKQpkMTA3X21hIDwtIGV4dHJhY3RfZGVfcGxvdHMoZDEwN19wYWlyd2lzZSwgbG9nZmM9MC42LCBwPTAuMSwgcF90eXBlPSJyYXciKQpkMTA3X21hJG1hJHBsb3QKcGxvdF9oaXN0b2dyYW0oZDEwN190YWJsZVtbImRhdGEiXV1bWyJzaF92c19jaHIiXV1bLCBjKCJkZXNlcV9wIildKQpwdmFsdWVzIDwtIHNtKHBsb3RfZGVfcHZhbHMoZDEwN190YWJsZVtbImRhdGEiXV1bWyJzaF92c19jaHIiXV0sIHR5cGU9ImRlc2VxIiwgcF90eXBlPSJyYXciKSkKcHZhbHVlcwpwbG90X3BjYShzbShub3JtYWxpemVfZXhwdChkMTA3LCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKSkpJHBsb3QKYGBgCgojIyBEb25vciAxMDgKCmBgYHtyIGVhY2hfaW5kaXZpZHVhbF8xMDh9CmQxMDggPC0gc3Vic2V0X2V4cHQoaHNfaW5mX2ZpbHQsIHN1YnNldD0iZG9ub3I9PSdkMTA4JyIpCmQxMDhfcGFpcndpc2UgPC0gc20oYWxsX3BhaXJ3aXNlKGQxMDgsIG1vZGVsX2JhdGNoPUZBTFNFKSkKZDEwOF90YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhkMTA4X3BhaXJ3aXNlKSkKc3VtbWFyeShkMTA4X3RhYmxlJGRhdGEpCmQxMDhfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoZDEwOF90YWJsZSwgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBwX3R5cGU9InJhdyIpKQpoZWFkKGQxMDhfc2lnJGRlc2VxJHVwc1tbMV1dKQpkMTA4X21hIDwtIGV4dHJhY3RfZGVfcGxvdHMoZDEwOF9wYWlyd2lzZSwgcD0wLjEsIHR5cGU9ImRlc2VxIiwgcF90eXBlPSJyYXciKSRtYSRwbG90CmQxMDhfbWEKcHZhbHVlcyA8LSBzbShwbG90X2RlX3B2YWxzKGQxMDhfdGFibGVbWyJkYXRhIl1dW1sic2hfdnNfY2hyIl1dLCB0eXBlPSJkZXNlcSIsIHBfdHlwZT0icmF3IikpCnB2YWx1ZXMKcGxvdF9wY2Eoc20obm9ybWFsaXplX2V4cHQoZDEwOCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpKSRwbG90CmBgYAoKIyMgRG9ub3IgMTEwCgpgYGB7ciBlYWNoX2luZGl2aWR1YWxfMTEwfQpkMTEwIDwtIHN1YnNldF9leHB0KGhzX2luZl9maWx0LCBzdWJzZXQ9ImRvbm9yPT0nZDExMCciKQpkMTEwX3BhaXJ3aXNlIDwtIHNtKGFsbF9wYWlyd2lzZShkMTEwLCBtb2RlbF9iYXRjaD1GQUxTRSkpCmQxMTBfdGFibGUgPC0gc20oY29tYmluZV9kZV90YWJsZXMoZDExMF9wYWlyd2lzZSkpCnN1bW1hcnkoZDExMF90YWJsZSRkYXRhKQpkMTEwX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGQxMTBfdGFibGUsIGFjY29yZGluZ190bz0iZGVzZXEiLCBwPTAuMSwgcF90eXBlPSJyYXciKSkKaGVhZChkMTEwX3NpZyRkZXNlcSR1cHNbWzFdXSkKZDExMF9tYSA8LSBleHRyYWN0X2RlX3Bsb3RzKGQxMTBfcGFpcndpc2UsIHA9MC4xLCBsb2dmYz0wLjYsIHBfdHlwZT0icmF3IikkbWEkcGxvdApkMTEwX21hCnB2YWx1ZXMgPC0gc20ocGxvdF9kZV9wdmFscyhkMTEwX3RhYmxlW1siZGF0YSJdXVtbInNoX3ZzX2NociJdXSwgdHlwZT0iZGVzZXEiLCBwX3R5cGU9InJhdyIpKQpwdmFsdWVzCnBsb3RfcGNhKHNtKG5vcm1hbGl6ZV9leHB0KGQxMTAsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpKSkkcGxvdAoKaHNfdG1wIDwtIHNldF9leHB0X2JhdGNoZXMoaHNfaW5mX2ZpbHQsIGZhY3Q9InBhdGhvZ2Vuc3RyYWluIikKaHNfdG1wMiA8LSBzbShub3JtYWxpemVfZXhwdChoc190bXAsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpKQpwbG90X3BjYShoc190bXAyKSRwbG90CmBgYAoKVGhlIGFib3ZlIHBsb3RzIHN1Z2dlc3QsIGFsb25nIHdpdGggdGhlIFBDQSBwbG90cyBvZiBhbGwgc2FtcGxlcywgdGhhdCBvbmUgb3IKbW9yZSBzdHJhaW5zIGFyZSBlaXRoZXIgc3dpdGNoZWQgb3IgYXQgbGVhc3QgdmVyeSBwcm9ibGVtYXRpYy4gIFNwZWNpZmljYWxseSwKc2FtcGxlcyBmcm9tIHRoZSBzdHJhaW5zIGFubm90YXRlZCAyNTA0IGFuZCAyMjcyLiAgVGhlcmVmb3JlLCB3ZSBuZXh0IGVtYmFya2VkCm9uIGEgc2VyaWVzIG9mIGNvbXBhcmlzb25zIG9mIHdoYXQgaGFwcGVucyB3aGVuIHdlIHJlbW92ZSBlYWNoIG9mIHRoZW0KaW5kaXZpZHVhbGx5LCBhbmQgdGhlbiBib3RoLgoKIyBSZW1vdmUgc2FtcGxlcyBmcm9tIHN0cmFpbiAyNTA0IGFuZC9vciAyMjcyCgpUaGlzIGJsb2NrIHdpbGwgZmlyc3QgcmVtb3ZlIHN0cmFpbiAyNTA0LCB0aGVuIDIyNzIuICBUaGUgcmVzdWx0aW5nIHN1YnNldHMgd2lsbApiZSB1c2VkIGZvciBhbm90aGVyIHJvdW5kIG9mIHRoZXNlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2VzLgoKIyMgQ3JlYXRlIGRhdGFzZXRzCgpJbiB0aGlzIGJsb2NrIHdlIHdpbGwgcGVyZm9ybSB0aGUgdmFyaW91cyByZW1vdmFscywgY3JlYXRpbmcgJ3JlbW92ZV8yNTA0JywKJ3JlbW92ZV8yMjcyJywgYW5kICdyZW1vdmVfYm90aCcuICBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIHZlcnNpb25zIG9mIHRoaXMgd2l0aAphbmQgd2l0aG91dCB0aGUgdW5pbmZlY3RlZCBzYW1wbGVzLiAgV2UgZXZlbnR1YWxseSBkZWNpZGVkIHRvIHVzZSB0aGUgZGF0YQpfd2l0aF8gdGhlIHVuaW5mZWN0ZWQgc2FtcGxlcyBmb3Igb3VyIGZpbmFsIGFuYWx5c2VzOyBidXQgd2Ugd2lsbCBoYXZlIHNvbWUgcGNhCmV0Yy4gcGxvdHMgd2l0aG91dCB0aGVtIGZpcnN0IGJlY2F1c2UgdGhlIHVuaW5mZWN0ZWQgbWFrZSBpdCBoYXJkZXIgdG8gc2VlIHRoZQpkaXN0cmlidXRpb25zIGJlY2F1c2UgdGhleSBhcmUgc28gdmVyeSBkaWZmZXJlbnQgdGhhbiB0aGUgaW5mZWN0ZWQuCgpgYGB7ciByZW1vdmVfc2FtcGxlc30KcmVtb3ZlXzI1MDRfaW5mIDwtIHN1YnNldF9leHB0KGhzX2luZl9maWx0LCBzdWJzZXQ9InBhdGhvZ2Vuc3RyYWluIT0nczI1MDQnIikKcmVtb3ZlXzI1MDRfaW5mX2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlXzI1MDRfaW5mLCBmaWx0ZXI9VFJVRSkpCnJlbW92ZV8yMjcyX2luZiA8LSBzdWJzZXRfZXhwdChoc19pbmZfZmlsdCwgc3Vic2V0PSJwYXRob2dlbnN0cmFpbiE9J3MyMjcyJyIpCnJlbW92ZV8yMjcyX2luZl9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV8yMjcyX2luZiwgZmlsdGVyPVRSVUUpKQpyZW1vdmVfYm90aF9pbmYgPC0gc3Vic2V0X2V4cHQocmVtb3ZlXzI1MDRfaW5mLCBzdWJzZXQ9InBhdGhvZ2Vuc3RyYWluIT0nczIyNzInIikKcmVtb3ZlX2JvdGhfaW5mX2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlX2JvdGhfaW5mLCBmaWx0ZXI9VFJVRSkpCgpyZW1vdmVfMjUwNF91bmluZiA8LSBzdWJzZXRfZXhwdChoc191bmluZl9maWx0LCBzdWJzZXQ9InBhdGhvZ2Vuc3RyYWluIT0nczI1MDQnIikKcmVtb3ZlXzI1MDRfdW5pbmZfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjUwNF91bmluZiwgZmlsdGVyPVRSVUUpKQpyZW1vdmVfMjI3Ml91bmluZiA8LSBzdWJzZXRfZXhwdChoc191bmluZl9maWx0LCBzdWJzZXQ9InBhdGhvZ2Vuc3RyYWluIT0nczIyNzInIikKcmVtb3ZlXzIyNzJfdW5pbmZfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjI3Ml91bmluZiwgZmlsdGVyPVRSVUUpKQpyZW1vdmVfYm90aF91bmluZiA8LSBzdWJzZXRfZXhwdChyZW1vdmVfMjUwNF91bmluZiwgc3Vic2V0PSJwYXRob2dlbnN0cmFpbiE9J3MyMjcyJyIpCnJlbW92ZV9ib3RoX3VuaW5mX2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlX2JvdGhfdW5pbmYsIGZpbHRlcj1UUlVFKSkKCnJlbW92ZV8yNTA0X2QxMDcgPC0gc3Vic2V0X2V4cHQocmVtb3ZlXzI1MDRfaW5mLCBzdWJzZXQ9ImRvbm9yPT0nZDEwNyciKQpyZW1vdmVfMjUwNF9kMTA4IDwtIHN1YnNldF9leHB0KHJlbW92ZV8yNTA0X2luZiwgc3Vic2V0PSJkb25vcj09J2QxMDgnIikKcmVtb3ZlXzI1MDRfZDExMCA8LSBzdWJzZXRfZXhwdChyZW1vdmVfMjUwNF9pbmYsIHN1YnNldD0iZG9ub3I9PSdkMTEwJyIpCgpyZW1vdmVfMjI3Ml9kMTA3IDwtIHN1YnNldF9leHB0KHJlbW92ZV8yMjcyX2luZiwgc3Vic2V0PSJkb25vcj09J2QxMDcnIikKcmVtb3ZlXzIyNzJfZDEwOCA8LSBzdWJzZXRfZXhwdChyZW1vdmVfMjI3Ml9pbmYsIHN1YnNldD0iZG9ub3I9PSdkMTA4JyIpCnJlbW92ZV8yMjcyX2QxMTAgPC0gc3Vic2V0X2V4cHQocmVtb3ZlXzIyNzJfaW5mLCBzdWJzZXQ9ImRvbm9yPT0nZDExMCciKQoKcmVtb3ZlX2JvdGhfZDEwNyA8LSBzdWJzZXRfZXhwdChyZW1vdmVfYm90aF9pbmYsIHN1YnNldD0iZG9ub3I9PSdkMTA3JyIpCnJlbW92ZV9ib3RoX2QxMDggPC0gc3Vic2V0X2V4cHQocmVtb3ZlX2JvdGhfaW5mLCBzdWJzZXQ9ImRvbm9yPT0nZDEwOCciKQpyZW1vdmVfYm90aF9kMTEwIDwtIHN1YnNldF9leHB0KHJlbW92ZV9ib3RoX2luZiwgc3Vic2V0PSJkb25vcj09J2QxMTAnIikKYGBgCgojIFJlbW92ZSAyNTA0IGFuYWx5c2VzCgpTdHJhaW4gMjUwNCB3YXMgdGhlIGZpcnN0IHRoaW5nIEhlY3RvciBmb2N1c2VkIHVwb24sIHNvIGxldCB1cyBwZXJmb3JtIGEgZmV3Cm1ldHJpY3Mgd2l0aG91dCBpdC4KCiMjIFJlbW92ZSAyNTA0IGluaXRpYWwgcGxvdHMKCmBgYHtyIHJlbW92ZTI1MDRfcGxvdHN9CnJlbW92ZV8yNTA0X2luZl9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV8yNTA0X2luZl9maWx0LCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIpKQpwbG90X3BjYShyZW1vdmVfMjUwNF9pbmZfbm9ybSkkcGxvdApyZW1vdmVfMjUwNF9pbmZfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjUwNF9pbmZfZmlsdCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IikpCnBsb3RfcGNhKHJlbW92ZV8yNTA0X2luZl9ub3JtKSRwbG90CnBsb3RfY29yaGVhdChyZW1vdmVfMjUwNF9pbmZfbm9ybSwgcmVtb3ZlX2VxdWFsPVRSVUUsIGN2X21pbj0wLjAxKSRwbG90CmBgYAoKIyMjIFJlbW92ZSAyNTA0IGluZGl2aWR1YWwgZG9ub3JzCgojIyMjIGQxMDcgd2l0aG91dCBzMjUwNAoKYGBge3IgcmVtb3ZlMjUwNF9pbmRpdmlkdWFsc19kMTA3fQpyZW1vdmVfMjUwNF9kMTA3X2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlXzI1MDRfZDEwNywgZmlsdGVyPVRSVUUpKQpyZW1vdmVfMjUwNF9kMTA3X2RlIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfMjUwNF9kMTA3X2ZpbHQsIG1vZGVsX2JhdGNoPSJzdmFzZXEiKSkKcmVtb3ZlXzI1MDRfZDEwN190YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfMjUwNF9kMTA3X2RlKSkKcHZhbHVlcyA8LSBwbG90X2RlX3B2YWxzKHJlbW92ZV8yNTA0X2QxMDdfdGFibGUkZGF0YVtbMV1dLCB0eXBlPSJkZXNlcSIsIHBfdHlwZT0icmF3IikKcHZhbHVlcwpgYGAKCiMjIyMgZDEwOCB3aXRob3V0IHMyNTA0CgpgYGB7ciByZW1vdmUyNTA0X2luZGl2aWR1YWxzX2QxMDh9CnJlbW92ZV8yNTA0X2QxMDhfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjUwNF9kMTA4LCBmaWx0ZXI9VFJVRSkpCnJlbW92ZV8yNTA0X2QxMDhfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV8yNTA0X2QxMDhfZmlsdCwgbW9kZWxfYmF0Y2g9InN2YXNlcSIpKQpyZW1vdmVfMjUwNF9kMTA4X3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV8yNTA0X2QxMDhfZGUpKQpwdmFsdWVzIDwtIHBsb3RfZGVfcHZhbHMocmVtb3ZlXzI1MDRfZDEwOF90YWJsZSRkYXRhW1sxXV0sIHR5cGU9ImRlc2VxIiwgcF90eXBlPSJyYXciKQpwdmFsdWVzCmBgYAoKIyMjIyBkMTEwIHdpdGhvdXQgczI1MDQKCmBgYHtyIHJlbW92ZTI1MDRfaW5kaXZpZHVhbHNfZDExMH0KcmVtb3ZlXzI1MDRfZDExMF9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV8yNTA0X2QxMTAsIGZpbHRlcj1UUlVFKSkKcmVtb3ZlXzI1MDRfZDExMF9kZSA8LSBzbShhbGxfcGFpcndpc2UocmVtb3ZlXzI1MDRfZDExMF9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCnJlbW92ZV8yNTA0X2QxMTBfdGFibGUgPC0gc20oY29tYmluZV9kZV90YWJsZXMocmVtb3ZlXzI1MDRfZDExMF9kZSkpCnB2YWx1ZXMgPC0gcGxvdF9kZV9wdmFscyhyZW1vdmVfMjUwNF9kMTEwX3RhYmxlJGRhdGFbWzFdXSwgdHlwZT0iZGVzZXEiLCBwX3R5cGU9InJhdyIpCnB2YWx1ZXMKYGBgCgpUaGUgYWJvdmUgc2hvdWxkIGdpdmUgdXMgYSBjbHVlIGFzIHRvIHdoZXRoZXIgcmVtb3Zpbmcgc2FtcGxlIDI1MDQgZGlkIGFueXRoaW5nCmhlbHBmdWwgdG8gdGhlIHJlc3VsdGluZyBkaXN0cmlidXRpb24gb2YgcC12YWx1ZXMuICBMZXQgdXMgbm93IGJyaW5nIHRoZSBkb25vcnMKYmFjayB0b2dldGhlciBhbmQgc2VlIGhvdyB0aGF0IGxvb2tzLgoKIyMjIEFsbCBkb25vcnMsIHJlbW92ZSAyNTA0IHBhaXJ3aXNlCgpHaXZlbiB0aGUgY2x1c3RlcmluZyBvZiB0aGUgc2FtcGxlcyBhZnRlciByZW1vdmluZyB0aGUgMjUwNCBzdHJhaW4gc2FtcGxlcywgbGV0CnVzIG5vdyBwZXJmb3JtIHRoZSBwYWlyd2lzZSBhbmFseXNpcyBhbmQgc2VlIGhvdyBpdCBsb29rcy4KCk5vdGUgdGhhdCB0aGVzZSBhcmUgcGVyZm9ybWVkIF93aXRoXyB0aGUgdW5pbmZlY3RlZCBzYW1wbGVzIHdoaWxlIHRoZSBwcmV2aW91cwptZXRyaWNzIHdlcmUgd2l0aG91dCB0aGVtLiAgVGhpcyB3aWxsIGluY2x1ZGUgb25lIHJvdW5kIHdpdGggYmF0Y2ggaW4gdGhlIG1vZGVsCmFuZCBvbmUgcm91bmQgdXNpbmcgc3Zhc2VxLiAgSW4gYWRkaXRpb24sIHdlIGFyZSByZWxheGluZyB0aGUgbG9nIGZvbGQtY2hhbmdlIGFuZApwLXZhbHVlIGNvbnN0cmFpbnRzIHRvIDAuNiBhbmQgMC4xIHJlc3BlY3RpdmVseS4KCmBgYHtyIHJlbW92ZTI1MDRfcGFpcndpc2UsIGZpZy5zaG93PSJoaWRlIn0KcmVtb3ZlXzI1MDRfdW5pbmZfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV8yNTA0X3VuaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPVRSVUUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfcmVtb3ZlMjUwNHVuaW5mX2JhdGNobW9kZWxfY29udHItdnt2ZXJ9Lnhsc3giKQpyZW1vdmVfMjUwNF91bmluZl90YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfMjUwNF91bmluZl9kZSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGVycz1rZWVwZXJzX3VuaW5mKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X3JlbW92ZTI1MDR1bmluZl9iYXRjaG1vZGVsX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV8yNTA0X3VuaW5mX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHJlbW92ZV8yNTA0X3VuaW5mX3RhYmxlLCBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIGxmYz0wLjYpKQoKcmVtb3ZlXzI1MDRfdW5pbmZfZGVfc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfMjUwNF91bmluZl9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmUyNTA0dW5pbmZfc3Zhc2VxX2NvbnRyLXZ7dmVyfS54bHN4IikKcmVtb3ZlXzI1MDRfdW5pbmZfdGFibGVfc3ZhIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV8yNTA0X3VuaW5mX2RlX3N2YSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnM9a2VlcGVyc191bmluZikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmUyNTA0dW5pbmZfc3Zhc2VxX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV8yNTA0X3VuaW5mX3NpZ19zdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhyZW1vdmVfMjUwNF91bmluZl90YWJsZV9zdmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBsZmM9MC42KSkKYGBgCgojIyMjIERFU2VxIE1BcGxvdCwgY2hyb25pYyB2cyBzZWxmLWhlYWxpbmcgYWxsIGRvbm9ycyByZW1vdmUgMjUwNAoKYGBge3IgcGFpcndpc2UyNTA0X2JhdGNoX3Bsb3RzfQpyZW1vdmVfMjUwNF91bmluZl90YWJsZV9zdmEkZGVzZXFfbWFfcGxvdHMkY2hfc2gkcGxvdApyZW1vdmVfMjUwNF91bmluZl90YWJsZV9zdmEkdmVubnMkY2hfc2gkdXBfbm93ZWlnaHQKYGBgCgojIFJlbW92ZSAyMjcyIGFuYWx5c2VzCgpUaGlzIHNob3VsZCBiZSBhbiBleGFjdCByZXBldGl0aW9uIG9mIHRoZSAyNTA0IHJlbW92YWwgYWJvdmUsIHNvIEkgcmVtb3ZlZCB0aGUgY29tbWVudGFyeS4KCiMjIFJlbW92ZSAyMjcyIGluaXRpYWwgcGxvdHMKCmBgYHtyIHJlbW92ZTIyNzJfcGxvdHN9CnJlbW92ZV8yMjcyX2luZl9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV8yMjcyX2luZl9maWx0LCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIpKQpwbG90X3BjYShyZW1vdmVfMjI3Ml9pbmZfbm9ybSkkcGxvdApyZW1vdmVfMjI3Ml9pbmZfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjI3Ml9pbmZfZmlsdCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IikpCnBsb3RfcGNhKHJlbW92ZV8yMjcyX2luZl9ub3JtKSRwbG90CnBsb3RfY29yaGVhdChyZW1vdmVfMjI3Ml9pbmZfbm9ybSwgcmVtb3ZlX2VxdWFsPVRSVUUsIGN2X21pbj0wLjAxKSRwbG90CmBgYAoKIyMjIFJlbW92ZSAyMjcyIGluZGl2aWR1YWwgZG9ub3JzCgojIyMjIGQxMDcgd2l0aG91dCBzMjI3MgoKYGBge3IgcmVtb3ZlMjI3Ml9pbmRpdmlkdWFsc19kMTA3fQpyZW1vdmVfMjI3Ml9kMTA3X2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlXzIyNzJfZDEwNywgZmlsdGVyPVRSVUUpKQpyZW1vdmVfMjI3Ml9kMTA3X2RlIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfMjI3Ml9kMTA3X2ZpbHQsIG1vZGVsX2JhdGNoPSJzdmFzZXEiKSkKcmVtb3ZlXzIyNzJfZDEwN190YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfMjI3Ml9kMTA3X2RlKSkKcHZhbHVlcyA8LSBwbG90X2RlX3B2YWxzKHJlbW92ZV8yMjcyX2QxMDdfdGFibGUkZGF0YVtbMV1dLCB0eXBlPSJkZXNlcSIsIHBfdHlwZT0icmF3IikKcHZhbHVlcwpgYGAKCiMjIyMgZDEwOCB3aXRob3V0IHMyMjcyCgpgYGB7ciByZW1vdmUyMjcyX2luZGl2aWR1YWxzX2QxMDh9CnJlbW92ZV8yMjcyX2QxMDhfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjI3Ml9kMTA4LCBmaWx0ZXI9VFJVRSkpCnJlbW92ZV8yMjcyX2QxMDhfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV8yMjcyX2QxMDhfZmlsdCwgbW9kZWxfYmF0Y2g9InN2YXNlcSIpKQpyZW1vdmVfMjI3Ml9kMTA4X3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV8yMjcyX2QxMDhfZGUpKQpwdmFsdWVzIDwtIHBsb3RfZGVfcHZhbHMocmVtb3ZlXzIyNzJfZDEwOF90YWJsZSRkYXRhW1sxXV0sIHR5cGU9ImRlc2VxIiwgcF90eXBlPSJyYXciKQpwdmFsdWVzCmBgYAoKIyMjIyBkMTEwIHdpdGhvdXQgczIyNzIKCmBgYHtyIHJlbW92ZTIyNzJfaW5kaXZpZHVhbHNfZDExMH0KcmVtb3ZlXzIyNzJfZDExMF9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV8yMjcyX2QxMTAsIGZpbHRlcj1UUlVFKSkKcmVtb3ZlXzIyNzJfZDExMF9kZSA8LSBzbShhbGxfcGFpcndpc2UocmVtb3ZlXzIyNzJfZDExMF9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCnJlbW92ZV8yMjcyX2QxMTBfdGFibGUgPC0gc20oY29tYmluZV9kZV90YWJsZXMocmVtb3ZlXzIyNzJfZDExMF9kZSkpCnB2YWx1ZXMgPC0gcGxvdF9kZV9wdmFscyhyZW1vdmVfMjI3Ml9kMTEwX3RhYmxlJGRhdGFbWzFdXSwgdHlwZT0iZGVzZXEiLCBwX3R5cGU9InJhdyIpCnB2YWx1ZXMKYGBgCgojIyMgQWxsIGRvbm9ycywgcmVtb3ZlIDIyNzIgcGFpcndpc2UKCmBgYHtyIHJlbW92ZTIyNzJfcGFpcndpc2UsIGZpZy5zaG93PSJoaWRlIn0KcmVtb3ZlXzIyNzJfdW5pbmZfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV8yMjcyX3VuaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPVRSVUUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfcmVtb3ZlMjI3MnVuaW5mX2JhdGNobW9kZWxfY29udHItdnt2ZXJ9Lnhsc3giKQpyZW1vdmVfMjI3Ml91bmluZl90YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfMjI3Ml91bmluZl9kZSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGVycz1rZWVwZXJzX3VuaW5mKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X3JlbW92ZTIyNzJ1bmluZl9iYXRjaG1vZGVsX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV8yMjcyX3VuaW5mX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHJlbW92ZV8yMjcyX3VuaW5mX3RhYmxlLCBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIGxmYz0wLjYpKQoKcmVtb3ZlXzIyNzJfdW5pbmZfZGVfc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfMjI3Ml91bmluZl9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmUyMjcydW5pbmZfc3Zhc2VxX2NvbnRyLXZ7dmVyfS54bHN4IikKcmVtb3ZlXzIyNzJfdW5pbmZfdGFibGVfc3ZhIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV8yMjcyX3VuaW5mX2RlX3N2YSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnM9a2VlcGVyc191bmluZikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmUyMjcydW5pbmZfc3Zhc2VxX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV8yMjcyX3VuaW5mX3NpZ19zdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhyZW1vdmVfMjI3Ml91bmluZl90YWJsZV9zdmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBsZmM9MC42KSkKYGBgCgojIyMjIERFU2VxIE1BcGxvdCwgY2hyb25pYyB2cyBzZWxmLWhlYWxpbmcgYWxsIGRvbm9ycyByZW1vdmUgMjI3MgoKYGBge3IgcGFpcndpc2UyMjcyX2JhdGNoX3Bsb3RzfQpyZW1vdmVfMjI3Ml91bmluZl90YWJsZV9zdmEkZGVzZXFfbWFfcGxvdHMkY2hfc2gkcGxvdApyZW1vdmVfMjI3Ml91bmluZl90YWJsZV9zdmEkdmVubnMkY2hfc2gkdXBfbm93ZWlnaHQKYGBgCgojIFJlbW92ZSBib3RoIGFuYWx5c2VzCgpUaGlzIHNob3VsZCBiZSBhbiBleGFjdCByZXBldGl0aW9uIG9mIHRoZSAyNTA0LzIyNzIgcmVtb3ZhbHMgYWJvdmUsIHNvIEkgcmVtb3ZlZCB0aGUgY29tbWVudGFyeS4KCiMjIFJlbW92ZSBib3RoIGluaXRpYWwgcGxvdHMKCmBgYHtyIHJlbW92ZWJvdGhfcGxvdHN9CnJlbW92ZV9ib3RoX2luZl9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV9ib3RoX2luZl9maWx0LCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIpKQpwbG90X3BjYShyZW1vdmVfYm90aF9pbmZfbm9ybSkkcGxvdApyZW1vdmVfYm90aF9pbmZfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfYm90aF9pbmZfZmlsdCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IikpCnBsb3RfcGNhKHJlbW92ZV9ib3RoX2luZl9ub3JtKSRwbG90CnBsb3RfY29yaGVhdChyZW1vdmVfYm90aF9pbmZfbm9ybSwgcmVtb3ZlX2VxdWFsPVRSVUUsIGN2X21pbj0wLjAxKSRwbG90CmBgYAoKIyMjIFJlbW92ZSBib3RoIGluZGl2aWR1YWwgZG9ub3JzCgojIyMjIGQxMDcgd2l0aG91dCBib3RoCgpgYGB7ciByZW1vdmVib3RoX2luZGl2aWR1YWxzX2QxMDd9CnJlbW92ZV9ib3RoX2QxMDdfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfYm90aF9kMTA3LCBmaWx0ZXI9VFJVRSkpCnJlbW92ZV9ib3RoX2QxMDdfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV9ib3RoX2QxMDdfZmlsdCwgbW9kZWxfYmF0Y2g9InN2YXNlcSIpKQpyZW1vdmVfYm90aF9kMTA3X3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV9ib3RoX2QxMDdfZGUpKQpwdmFsdWVzIDwtIHBsb3RfZGVfcHZhbHMocmVtb3ZlX2JvdGhfZDEwN190YWJsZSRkYXRhW1sxXV0sIHR5cGU9ImRlc2VxIiwgcF90eXBlPSJyYXciKQpwdmFsdWVzCmBgYAoKIyMjIyBkMTA4IHdpdGhvdXQgYm90aAoKYGBge3IgcmVtb3ZlYm90aF9pbmRpdmlkdWFsc19kMTA4fQpyZW1vdmVfYm90aF9kMTA4X2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlX2JvdGhfZDEwOCwgZmlsdGVyPVRSVUUpKQpyZW1vdmVfYm90aF9kMTA4X2RlIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfYm90aF9kMTA4X2ZpbHQsIG1vZGVsX2JhdGNoPSJzdmFzZXEiKSkKcmVtb3ZlX2JvdGhfZDEwOF90YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfYm90aF9kMTA4X2RlKSkKcHZhbHVlcyA8LSBwbG90X2RlX3B2YWxzKHJlbW92ZV9ib3RoX2QxMDhfdGFibGUkZGF0YVtbMV1dLCB0eXBlPSJkZXNlcSIsIHBfdHlwZT0icmF3IikKcHZhbHVlcwpgYGAKCiMjIyMgZDExMCB3aXRob3V0IGJvdGgKCmBgYHtyIHJlbW92ZWJvdGhfaW5kaXZpZHVhbHNfZDExMH0KcmVtb3ZlX2JvdGhfZDExMF9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV9ib3RoX2QxMTAsIGZpbHRlcj1UUlVFKSkKcmVtb3ZlX2JvdGhfZDExMF9kZSA8LSBzbShhbGxfcGFpcndpc2UocmVtb3ZlX2JvdGhfZDExMF9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCnJlbW92ZV9ib3RoX2QxMTBfdGFibGUgPC0gc20oY29tYmluZV9kZV90YWJsZXMocmVtb3ZlX2JvdGhfZDExMF9kZSkpCnB2YWx1ZXMgPC0gcGxvdF9kZV9wdmFscyhyZW1vdmVfYm90aF9kMTEwX3RhYmxlJGRhdGFbWzFdXSwgdHlwZT0iZGVzZXEiLCBwX3R5cGU9InJhdyIpCnB2YWx1ZXMKYGBgCgojIyMgQWxsIGRvbm9ycywgcmVtb3ZlIGJvdGggcGFpcndpc2UKCmBgYHtyIHJlbW92ZWJvdGhfcGFpcndpc2UsIGZpZy5zaG93PSJoaWRlIn0KcmVtb3ZlX2JvdGhfdW5pbmZfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV9ib3RoX3VuaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPVRSVUUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfcmVtb3ZlYm90aHVuaW5mX2JhdGNobW9kZWxfY29udHItdnt2ZXJ9Lnhsc3giKQpyZW1vdmVfYm90aF91bmluZl90YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfYm90aF91bmluZl9kZSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGVycz1rZWVwZXJzX3VuaW5mKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X3JlbW92ZWJvdGh1bmluZl9iYXRjaG1vZGVsX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV9ib3RoX3VuaW5mX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHJlbW92ZV9ib3RoX3VuaW5mX3RhYmxlLCBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIGxmYz0wLjYpKQoKcmVtb3ZlX2JvdGhfdW5pbmZfZGVfc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfYm90aF91bmluZl9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVib3RodW5pbmZfc3Zhc2VxX2NvbnRyLXZ7dmVyfS54bHN4IikKcmVtb3ZlX2JvdGhfdW5pbmZfdGFibGVfc3ZhIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV9ib3RoX3VuaW5mX2RlX3N2YSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnM9a2VlcGVyc191bmluZikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVib3RodW5pbmZfc3Zhc2VxX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV9ib3RoX3VuaW5mX3NpZ19zdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhyZW1vdmVfYm90aF91bmluZl90YWJsZV9zdmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBsZmM9MC42KSkKcmVtb3ZlX2JvdGhfdW5pbmZfc2lnX3N2YSRkZXNlcSRjb3VudHMKCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVib3RodW5pbmZfc3Zhc2VxX3NpZy12e3Zlcn1fbm9ybWFsLnhsc3giKQpyZW1vdmVfYm90aF91bmluZl9zaWdfc3ZhX25vcm1hbCA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHJlbW92ZV9ib3RoX3VuaW5mX3RhYmxlX3N2YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpyZW1vdmVfYm90aF91bmluZl9zaWdfc3ZhX25vcm1hbCRkZXNlcSRjb3VudHMKYGBgCgojIyMjIERFU2VxIE1BcGxvdCwgY2hyb25pYyB2cyBzZWxmLWhlYWxpbmcgYWxsIGRvbm9ycyByZW1vdmUgYm90aAoKYGBge3IgcGFpcndpc2Vib3RoX2JhdGNoX3Bsb3RzfQpyZW1vdmVfYm90aF91bmluZl90YWJsZV9zdmEkZGVzZXFfbWFfcGxvdHMkY2hfc2gkcGxvdApyZW1vdmVfYm90aF91bmluZl90YWJsZV9zdmEkdmVubnMkY2hfc2gkdXBfbm93ZWlnaHQKYGBgCgojIENvbXBhcmUgYW5hbHlzZXMKCk5vdyB0aGF0IHdlIGhhdmUgcGVyZm9ybWVkIGEgc2V0IG9mIGFuYWx5c2VzIGxvb2tpbmcgYXQgdGhlIHZhcmlvdXMgY29tYmluYXRpb25zCm9mIHN0cmFpbnMgYW5kIGRvbm9ycywgbGV0IHVzIGxvb2sgYXQgaG93IHNpbWlsYXIgYXJlIHRoZSBkaXN0cmlidXRpb25zIG9mIGxvZ0ZDIGFuZApyYW5rIG9yZGVycy4KCiMjIENvbXBhcmUgdGhlIGRvbm9ycyB0byBlYWNoIG90aGVyCgpgYGB7ciBjb21wYXJlX2Rvbm9yc30KY29tcGFyZSA8LSBzbShjb21wYXJlX2RlX3Jlc3VsdHMoZDEwN190YWJsZSwgZDEwOF90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX21ldGhvZD0ic3BlYXJtYW4iLCB0cnlfbWV0aG9kcz0iZGVzZXEiKSkKY29tcGFyZSRyZXN1bHQkZGVzZXEKIyMgSG9seSBjcmFwb2xhIQoKY29tcGFyZSA8LSBzbShjb21wYXJlX2RlX3Jlc3VsdHMoZDEwN190YWJsZSwgZDExMF90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX21ldGhvZD0ic3BlYXJtYW4iLCB0cnlfbWV0aG9kcz0iZGVzZXEiKSkKY29tcGFyZSRyZXN1bHQkZGVzZXEKCmNvbXBhcmUgPC0gc20oY29tcGFyZV9kZV9yZXN1bHRzKGQxMDhfdGFibGUsIGQxMTBfdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcl9tZXRob2Q9InNwZWFybWFuIiwgdHJ5X21ldGhvZHM9ImRlc2VxIikpCmNvbXBhcmUkcmVzdWx0JGRlc2VxCmBgYAoKV293IEkgaGFkIGZvcmdvdHRlbiBob3cgcmlkaWN1bG91c2x5IGRpZmZlcmVudCB0aGUgMyBkb25vcnMgYXJlLgoKIyMgQ29tcGFyZSByZW1vdmUgb25lIHZzIHJlbW92ZSBib3RoCgojIyMgQmF0Y2ggaW4gbW9kZWwKCmBgYHtyIGNvbXBhcmVfMjI3Ml8yNTA0X2JhdGNofQpjb21wYXJlIDwtIGNvbXBhcmVfZGVfcmVzdWx0cyhyZW1vdmVfMjI3Ml91bmluZl90YWJsZSwgcmVtb3ZlX2JvdGhfdW5pbmZfdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcl9tZXRob2Q9InNwZWFybWFuIiwgdHJ5X21ldGhvZHM9ImRlc2VxIikKY29tcGFyZSRyZXN1bHQkZGVzZXEKCmNvbXBhcmUgPC0gY29tcGFyZV9kZV9yZXN1bHRzKHJlbW92ZV8yNTA0X3VuaW5mX3RhYmxlLCByZW1vdmVfYm90aF91bmluZl90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX21ldGhvZD0ic3BlYXJtYW4iLCB0cnlfbWV0aG9kcz0iZGVzZXEiKQpjb21wYXJlJHJlc3VsdCRkZXNlcQpgYGAKCiMjIyBzdmEKCmBgYHtyIGNvbXBhcmVfMjI3Ml8yNTA0X3N2YX0KY29tcGFyZSA8LSBjb21wYXJlX2RlX3Jlc3VsdHMocmVtb3ZlXzIyNzJfdW5pbmZfdGFibGVfc3ZhLCByZW1vdmVfYm90aF91bmluZl90YWJsZV9zdmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcl9tZXRob2Q9InNwZWFybWFuIiwgdHJ5X21ldGhvZHM9ImRlc2VxIikKY29tcGFyZSRyZXN1bHQkZGVzZXEKCmNvbXBhcmUgPC0gY29tcGFyZV9kZV9yZXN1bHRzKHJlbW92ZV8yNTA0X3VuaW5mX3RhYmxlX3N2YSwgcmVtb3ZlX2JvdGhfdW5pbmZfdGFibGVfc3ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JfbWV0aG9kPSJzcGVhcm1hbiIsIHRyeV9tZXRob2RzPSJkZXNlcSIpCmNvbXBhcmUkcmVzdWx0JGRlc2VxCmBgYAoKIyMgQ29tcGFyZSByZW1vdmUgYm90aCBhZ2FpbnN0IGFsbCBzYW1wbGVzCgojIyMgQmF0Y2ggaW4gdGhlIG1vZGVsCgpgYGB7ciBjb21wYXJlX2JvdGhfYWxsX2JhdGNofQpjb21wYXJlIDwtIHNtKGNvbXBhcmVfZGVfcmVzdWx0cyhyZW1vdmVfYm90aF91bmluZl90YWJsZSwgaHNfY29tYmluZWRfYmF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcl9tZXRob2Q9InNwZWFybWFuIiwgdHJ5X21ldGhvZHM9ImRlc2VxIikpCmNvbXBhcmUkcmVzdWx0JGRlc2VxCmBgYAoKIyMjIHN2YQoKYGBge3IgY29tcGFyZV9ib3RoX2FsbF9zdmF9CmNvbXBhcmUgPC0gc20oY29tcGFyZV9kZV9yZXN1bHRzKHJlbW92ZV9ib3RoX3VuaW5mX3RhYmxlX3N2YSwgaHNfY29tYmluZWRfc3ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JfbWV0aG9kPSJzcGVhcm1hbiIsIHRyeV9tZXRob2RzPSJkZXNlcSIpKQpjb21wYXJlJHJlc3VsdCRkZXNlcQpgYGAKCiMgVHJ5IGFnYWluIG9uIHRoZSBwYXJhc2l0ZSBkYXRhCgojIyBSZW1lbWJlciBvdXIgZGF0YSBzZXQKCmBgYHtyIGxwX2V4cHJlc3Npb24wMX0KbHBfaW5mX2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQobHBfaW5mLCBmaWx0ZXI9VFJVRSkpCmBgYAoKYGBge3IgbHBfbm9iYXRjaCwgc2hvdy5maWc9ImhpZGUifQpscF9wYWlyd2lzZV9ub2JhdGNoIDwtIHNtKGFsbF9wYWlyd2lzZShscF9pbmZfZmlsdCwgbW9kZWxfYmF0Y2g9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2Vic2VxPUZBTFNFKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fbHBfaW5mZWN0X25vYmF0Y2hfY29udHItdnt2ZXJ9Lnhsc3giKQpscF9jb21iaW5lZF9ub2JhdGNoIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKGxwX3BhaXJ3aXNlX25vYmF0Y2gsIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9scF9pbmZlY3Rfbm9iYXRjaF9zaWctdnt2ZXJ9Lnhsc3giKQpscF9zaWdfbm9iYXRjaCA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGxwX2NvbWJpbmVkX25vYmF0Y2gsIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpgYGAKCmBgYHtyIGxwX2JhdGNoLCBzaG93LmZpZz0iaGlkZSJ9CmxwX3BhaXJ3aXNlX2JhdGNoIDwtIHNtKGFsbF9wYWlyd2lzZShscF9pbmZfZmlsdCwgbW9kZWxfYmF0Y2g9VFJVRSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2xwX2luZmVjdF9iYXRjaF9jb250ci12e3Zlcn0ueGxzeCIpCmxwX2NvbWJpbmVkX2JhdGNoIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKGxwX3BhaXJ3aXNlX2JhdGNoLCBleGNlbD1leGNlbF9maWxlKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fbHBfaW5mZWN0X2JhdGNoX3NpZy12e3Zlcn0ueGxzeCIpCmxwX3NpZ19iYXRjaCA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGxwX2NvbWJpbmVkX2JhdGNoLCBleGNlbD1leGNlbF9maWxlKSkKYGBgCgpgYGB7ciBscF9zc3ZhLCBzaG93LmZpZz0iaGlkZSJ9CmxwX3BhaXJ3aXNlX3NzdmEgPC0gc20oYWxsX3BhaXJ3aXNlKGxwX2luZl9maWx0LCBtb2RlbF9iYXRjaD0ic3N2YSIpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9scF9pbmZlY3Rfc3N2YV9jb250ci12e3Zlcn0ueGxzeCIpCmxwX2NvbWJpbmVkX3NzdmEgPC0gc20oY29tYmluZV9kZV90YWJsZXMobHBfcGFpcndpc2Vfc3N2YSwgZXhjZWw9ZXhjZWxfZmlsZSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2xwX2luZmVjdF9zc3ZhX3NpZy12e3Zlcn0ueGxzeCIpCmxwX3NpZ19zc3ZhIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMobHBfY29tYmluZWRfc3N2YSwgZXhjZWw9ZXhjZWxfZmlsZSkpCmBgYAoKYGBge3IgbHBfZnN2YSwgc2hvdy5maWc9ImhpZGUifQpscF9wYWlyd2lzZV9mc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShscF9pbmZfZmlsdCwgbW9kZWxfYmF0Y2g9ImZzdmEiKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fbHBfaW5mZWN0X2ZzdmFfY29udHItdnt2ZXJ9Lnhsc3giKQpscF9jb21iaW5lZF9mc3ZhIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKGxwX3BhaXJ3aXNlX2ZzdmEsIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9scF9pbmZlY3RfZnN2YV9zaWctdnt2ZXJ9Lnhsc3giKQpscF9zaWdfZnN2YSA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGxwX2NvbWJpbmVkX2ZzdmEsIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpgYGAKCmBgYHtyIHNhdmVtZSwgZXZhbD1GQUxTRX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpgYGAKCmBgYHtyIHJlbG9hZCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbG9hZG1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkKYGBgCg==