1 Introduction

In my previous installment (preprocessing.Rmd), I spun up some jobs on the cluster to examine these samples. In this document I will spend some time looking at them.

2 Annotations

Half of the samples are GAS 5448 and half are NZ131. I have only so far mapped all samples against 5448, I will do NZ131 today.

gas5448_gff <- load_gff_annotations("reference/spyogenes_5448_v1.gff")
## Returning a df with 14 columns and 1821 rows.
rownames(gas5448_gff) <- make.names(gas5448_gff[["locus_tag"]], unique = TRUE)

nz131_microbes <- load_microbesonline_annotations(species = "Streptococcus pyogenes NZ131")
## Found 1 entry.
## Streptococcus pyogenes NZ131Firmicutesyes2009-04-21yes101791471876
## The species being downloaded is: Streptococcus pyogenes NZ131
## Downloading: http://www.microbesonline.org/cgi-bin/genomeInfo.cgi?tId=471876;export=tab

3 Collect Preprocessing metadata

The various mapping etc tools finished last night, let us collect the numbers from them here. The defaults should work well for pretty much everything, so I think I need fill in only the starting sample sheet.

sample_sheet <- gather_preprocessing_metadata("sample_sheets/all_samples.xlsx")
## Did not find the condition column in the sample sheet.
## Filling it in as undefined.
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## Warning in dispatch_regex_search(meta, search, replace, input_file_spec, : NAs introduced by coercion

## Warning in dispatch_regex_search(meta, search, replace, input_file_spec, : NAs introduced by coercion
## Writing new metadata to: sample_sheets/all_samples_modified.xlsx
## Deleting the file sample_sheets/all_samples_modified.xlsx before writing the tables.

4 Create an expressionset

all_expt <- create_expt(sample_sheet[["new_meta"]], file_column = "hisat_count_table",
                        gene_info = gas5448_gff) %>%
  subset_expt(subset="read1fastqfile!='Undetermined_S0_R1_001.fastq.gz'")
## Reading the sample metadata.
## The sample definitions comprises: 81 rows(samples) and 32 columns(metadata fields).
## Warning in create_expt(sample_sheet[["new_meta"]], file_column = "hisat_count_table", : Even after changing the rownames in gene info, they do not
## match the count table.
## Even after changing the rownames in gene info, they do not match the count table.
## Here are the first few rownames from the count tables:
## Spy49_0001, Spy49_0002, Spy49_0003, Spy49_0004, Spy49_0005, Spy49_0006
## Here are the first few rownames from the gene information table:
## SP5448_RS00005, SP5448_RS00010, SP5448_RS00015, SP5448_RS00020, SP5448_RS00025, SP5448_RS00030
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 1788 features and 81 samples.
## The samples excluded are: KMSL81.
## subset_expt(): There were 81, now there are 80 samples.
all_combined_factor <- paste0(pData(all_expt)[["strain"]], "_",
                              pData(all_expt)[["media"]], "_",
                              pData(all_expt)[["supplement"]], "_",
                              pData(all_expt)[["time"]])
pData(all_expt)[["combined"]] <- all_combined_factor
all_expt <- set_expt_conditions(all_expt, all_combined_factor) %>%
  set_expt_batches("replicate")
## The numbers of samples by condition are:
## 
##    nz131_C_DMSO_t120m     nz131_C_DMSO_t90m    nz131_C_Heme_t120m     nz131_C_Heme_t90m nz131_RPMI_DMSO_t120m  nz131_RPMI_DMSO_t90m 
##                     4                     4                     4                     4                     4                     4 
## nz131_RPMI_Heme_t120m  nz131_RPMI_Heme_t90m    s5448_C_DMSO_t120m     s5448_C_DMSO_t90m    s5448_C_Heme_t120m     s5448_C_Heme_t90m 
##                     4                     4                     4                     4                     4                     4 
## s5448_RPMI_DMSO_t120m  s5448_RPMI_DMSO_t90m s5448_RPMI_Heme_t120m  s5448_RPMI_Heme_t90m  s5448AP_C_DMSO_t120m   s5448AP_C_DMSO_t90m 
##                     4                     4                     4                     4                     4                     4 
##  s5448AP_C_Heme_t120m   s5448AP_C_Heme_t90m 
##                     4                     4
## The number of samples by batch are:
## 
## r1 r2 r3 r4 
## 20 20 20 20
combined_strain_supplement_media <- paste0(pData(all_expt)[["strain"]], "_",
                                           pData(all_expt)[["media"]], "_",
                                           pData(all_expt)[["supplement"]])
pData(all_expt)[["str_sup_med"]] <- combined_strain_supplement_media

combined_strain_supplement <- paste0(pData(all_expt)[["strain"]], "_",
                                     pData(all_expt)[["supplement"]])
pData(all_expt)[["str_sup"]] <- combined_strain_supplement

combined_media_supplement <- paste0(pData(all_expt)[["media"]], "_",
                                     pData(all_expt)[["supplement"]])
pData(all_expt)[["med_sup"]] <- combined_media_supplement

combined_strain_media <- paste0(pData(all_expt)[["strain"]], "_",
                                pData(all_expt)[["media"]])
pData(all_expt)[["str_med"]] <- combined_strain_media

notime_factor <- paste0(pData(all_expt)[["strain"]], "_",
                        pData(all_expt)[["media"]], "_",
                        pData(all_expt)[["supplement"]])
pData(all_expt)[["notime"]] <- notime_factor
all_expt <- set_expt_conditions(all_expt, notime_factor) %>%
  set_expt_batches("strain")
## The numbers of samples by condition are:
## 
##    nz131_C_DMSO    nz131_C_Heme nz131_RPMI_DMSO nz131_RPMI_Heme    s5448_C_DMSO    s5448_C_Heme s5448_RPMI_DMSO s5448_RPMI_Heme  s5448AP_C_DMSO 
##               8               8               8               8               8               8               8               8               8 
##  s5448AP_C_Heme 
##               8
## The number of samples by batch are:
## 
##   nz131   s5448 s5448AP 
##      32      32      16
fun <- plot_meta_sankey(all_expt, factors = c("strain", "media", "supplement", "time"))
fun
## A sankey plot describing the metadata of 80 samples,
## including 38 out of 0 nodes and traversing metadata factors:
## .

reads <- plot_metadata_factors(all_expt, "hisatgenomesingleconcordant")
reads

5 Examine reads/gene distribution etc

plot_legend(all_expt)
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## The colors used in the expressionset are: #97722D, #666666, #D8367D, #749829, #BBA90B, #C9930D, #1B9E77, #AE6D1C, #A16864, #9B58A5.

plot_libsize(all_expt)
## Library sizes of 80 samples, 
## ranging from 5,545,743 to 13,822,520.

plot_nonzero(all_expt)
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## A non-zero genes plot of 80 samples.
## These samples have an average 9.375 CPM coverage and 1671 genes observed, ranging from 1621 to
## 1749.
## Warning: ggrepel: 43 unlabeled data points (too many overlaps). Consider increasing max.overlaps

6 Normalize and look more closely

all_norm <- normalize_expt(all_expt, transform = "log2", convert = "cpm",
                           norm = "quant", filter = TRUE)
## Removing 64 low-count genes (1724 remaining).
## transform_counts: Found 17 values equal to 0, adding 1 to the matrix.
plot_sm(all_norm)
## When the standard median metric was plotted, the values observed range
## from 0.642873338569537 to 1 with quartiles at 0.853537697220439 and 0.885246354323851.

plot_disheat(all_norm)
## A heatmap of pairwise sample distances ranging from: 
## 7.85911795064251 to 107.939087446247.

plot_corheat(all_norm)
## A heatmap of pairwise sample correlations ranging from: 
## 0.642873338569537 to 0.998106456004526.

plot_pca(all_norm, plot_labels = "repel", max.overlaps = 100)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by nz131_C_DMSO, nz131_C_Heme, nz131_RPMI_DMSO, nz131_RPMI_Heme, s5448_C_DMSO, s5448_C_Heme, s5448_RPMI_DMSO, s5448_RPMI_Heme, s5448AP_C_DMSO, s5448AP_C_Heme
## Shapes are defined by nz131, s5448, s5448AP.
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning: ggrepel: 62 unlabeled data points (too many overlaps). Consider increasing max.overlaps

I think some samples may warrant removal: KMSL60, KMSL67, KMSL18

exclude_ids <- c("KMSL60", "KMSL67", "KMSL18")
exclude_idx <- ! sampleNames(all_norm) %in% exclude_ids
exclude_samples <- sampleNames(all_norm)[exclude_idx]

exc_expt <- subset_expt(all_expt, ids = exclude_samples)
## The samples excluded are: KMSL18, KMSL60, KMSL67.
## subset_expt(): There were 80, now there are 77 samples.

Strange, I am going to assume the nz131/5448 split is the problem?

nz131_idx <- pData(all_expt)[["strain"]] == "nz131"
nz131_expt <- all_expt[, nz131_idx]
## Subsetting on samples.
## The samples excluded are: KMSL01, KMSL02, KMSL03, KMSL04, KMSL05, KMSL06, KMSL07, KMSL08, KMSL09, KMSL10, KMSL11, KMSL12, KMSL13, KMSL14, KMSL15, KMSL16, KMSL17, KMSL18, KMSL19, KMSL20, KMSL21, KMSL22, KMSL23, KMSL24, KMSL25, KMSL26, KMSL27, KMSL28, KMSL29, KMSL30, KMSL31, KMSL32, KMSL33, KMSL34, KMSL35, KMSL36, KMSL37, KMSL38, KMSL39, KMSL40, KMSL41, KMSL42, KMSL43, KMSL44, KMSL45, KMSL46, KMSL47, KMSL48.
## subset_expt(): There were 80, now there are 32 samples.
s5448_idx <- pData(all_expt)[["strain"]] == "s5448"
s5448_expt <- all_expt[, s5448_idx]
## Subsetting on samples.
## The samples excluded are: KMSL01, KMSL02, KMSL03, KMSL04, KMSL05, KMSL06, KMSL07, KMSL08, KMSL09, KMSL10, KMSL11, KMSL12, KMSL13, KMSL14, KMSL15, KMSL16, KMSL49, KMSL50, KMSL51, KMSL52, KMSL53, KMSL54, KMSL55, KMSL56, KMSL57, KMSL58, KMSL59, KMSL60, KMSL61, KMSL62, KMSL63, KMSL64, KMSL65, KMSL66, KMSL67, KMSL68, KMSL69, KMSL70, KMSL71, KMSL72, KMSL73, KMSL74, KMSL75, KMSL76, KMSL77, KMSL78, KMSL79, KMSL80.
## subset_expt(): There were 80, now there are 32 samples.
nz131_norm <- normalize_expt(nz131_expt, transform = "log2", convert = "cpm",
                             norm = "quant", filter = TRUE)
## Removing 79 low-count genes (1709 remaining).
## transform_counts: Found 8 values equal to 0, adding 1 to the matrix.
plot_pca(nz131_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by nz131_C_DMSO, nz131_C_Heme, nz131_RPMI_DMSO, nz131_RPMI_Heme
## Shapes are defined by nz131.
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

s5448_norm <- normalize_expt(s5448_expt, transform = "log2", convert = "cpm",
                             norm = "quant", filter = TRUE)
## Removing 187 low-count genes (1601 remaining).
plot_pca(s5448_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by s5448_C_DMSO, s5448_C_Heme, s5448_RPMI_DMSO, s5448_RPMI_Heme
## Shapes are defined by s5448.
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

7 Use variance partition to guess which factor is most important

Note, variance partition requires a somewhat more strict filter than I use for many other tasks. Given the peculiarity of what I am seeing, I might choose to use this stricter dataset.

vp <- simple_varpart(all_expt, factors = c("strain", "time", "supplement", "media", "replicate"))
## Subsetting on features.
## remove_genes_expt(), before removal, there were 1775 genes, now there are 1637.
vp
## The result of using variancePartition with the model:
## ~ strain + time + supplement + media + replicate

filt_expt <- vp[["modified_expt"]]

exc_vp <- simple_varpart(exc_expt, factors = c("strain", "time", "supplement", "media"))
## Subsetting on features.
## remove_genes_expt(), before removal, there were 1775 genes, now there are 1637.
filt_exc <- exc_vp[["modified_expt"]]

8 Split the factors up and look individually

Variance partition says that media is the winner, let us look at that first. I am guessing that the other factors will not provide interesting plots unless we go nuts and use sva.

8.1 Media

media_expt <- set_expt_conditions(filt_expt, fact = "media")
## The numbers of samples by condition are:
## 
##    C RPMI 
##   48   32
media_norm <- normalize_expt(media_expt, filter = TRUE, convert = "cpm",
                             norm = "quant", transform = "log2")
## Removing 64 low-count genes (1724 remaining).
## transform_counts: Found 17 values equal to 0, adding 1 to the matrix.
plot_pca(media_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by C, RPMI
## Shapes are defined by nz131, s5448, s5448AP.

media_nb <- normalize_expt(media_expt, filter = TRUE, convert = "cpm",
                           batch = "svaseq", transform = "log2")
## Removing 64 low-count genes (1724 remaining).
## Setting 608 low elements to zero.
## transform_counts: Found 608 values equal to 0, adding 1 to the matrix.
plot_pca(media_nb)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by C, RPMI
## Shapes are defined by nz131, s5448, s5448AP.

8.2 Supplement

supplement_expt <- set_expt_conditions(filt_expt, fact = "supplement")
## The numbers of samples by condition are:
## 
## DMSO Heme 
##   40   40
supplement_norm <- normalize_expt(supplement_expt, filter = TRUE, convert = "cpm",
                                  norm = "quant", transform = "log2")
## Removing 64 low-count genes (1724 remaining).
## transform_counts: Found 17 values equal to 0, adding 1 to the matrix.
plot_pca(supplement_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by DMSO, Heme
## Shapes are defined by nz131, s5448, s5448AP.

supplement_nb <- normalize_expt(supplement_expt, filter = TRUE, convert = "cpm",
                             batch = "svaseq", transform = "log2")
## Removing 64 low-count genes (1724 remaining).
## Setting 233 low elements to zero.
## transform_counts: Found 233 values equal to 0, adding 1 to the matrix.
plot_pca(supplement_nb)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by DMSO, Heme
## Shapes are defined by nz131, s5448, s5448AP.

8.3 Time

Time is the big loser in this.

time_expt <- set_expt_conditions(filt_expt, fact = "time")
## The numbers of samples by condition are:
## 
## t120m  t90m 
##    40    40
time_norm <- normalize_expt(time_expt, filter = TRUE, convert = "cpm",
                            norm = "quant", transform = "log2")
## Removing 64 low-count genes (1724 remaining).
## transform_counts: Found 17 values equal to 0, adding 1 to the matrix.
plot_pca(time_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by t120m, t90m
## Shapes are defined by nz131, s5448, s5448AP.

time_nb <- normalize_expt(time_expt, filter = TRUE, convert = "cpm",
                          batch = "svaseq", transform = "log2")
## Removing 64 low-count genes (1724 remaining).
## Setting 209 low elements to zero.
## transform_counts: Found 209 values equal to 0, adding 1 to the matrix.
plot_pca(time_nb)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by t120m, t90m
## Shapes are defined by nz131, s5448, s5448AP.

8.4 Media and supplement

med_sup_expt <- set_expt_conditions(filt_expt, fact = "med_sup") %>%
  set_expt_batches(fact = "strain")
## The numbers of samples by condition are:
## 
##    C_DMSO    C_Heme RPMI_DMSO RPMI_Heme 
##        24        24        16        16
## The number of samples by batch are:
## 
##   nz131   s5448 s5448AP 
##      32      32      16
med_sup_norm <- normalize_expt(med_sup_expt, filter = TRUE, convert = "cpm",
                            norm = "quant", transform = "log2")
## Removing 64 low-count genes (1724 remaining).
## transform_counts: Found 17 values equal to 0, adding 1 to the matrix.
plot_pca(med_sup_norm)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by C_DMSO, C_Heme, RPMI_DMSO, RPMI_Heme
## Shapes are defined by nz131, s5448, s5448AP.

med_sup_nb <- normalize_expt(med_sup_expt, filter = TRUE, convert = "cpm",
                          batch = "svaseq", transform = "log2")
## Removing 64 low-count genes (1724 remaining).
## Setting 639 low elements to zero.
## transform_counts: Found 639 values equal to 0, adding 1 to the matrix.
plot_pca(med_sup_nb)
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by C_DMSO, C_Heme, RPMI_DMSO, RPMI_Heme
## Shapes are defined by nz131, s5448, s5448AP.

9 Quick DE

Thinking… let us first just lump all samples together and see what happens?

all_supplement_keepers <- list(
  "heme_vs_dmso" = c("Heme", "DMSO"))

## This adds replicate to the model because model_batch defaults to TRUE
all_supplement_de <- all_pairwise(supplement_expt, model_batch = TRUE)
## 
## DMSO Heme 
##   40   40 
## 
##   nz131   s5448 s5448AP 
##      32      32      16
all_supplement_table <- combine_de_tables(
  all_supplement_de,
  keepers = all_supplement_keepers,
  excel = glue("excel/heme_vs_dmso_all_conditions_batch_table-v{ver}.xlsx"))
all_supplement_sig <- extract_significant_genes(
  all_supplement_table,
  excel = glue("excel/heme_vs_dmso_all_conditions_batch_sig-v{ver}.xlsx"))

all_supplement_sva_de <- all_pairwise(supplement_expt, model_batch = "svaseq")
## 
## DMSO Heme 
##   40   40 
## Error in density.default(x, adjust = adj) : 'x' contains missing values
## Warning in all_adjusters(input, estimate_type = model_batch, surrogates = surrogates): It is highly likely that the underlying reason for this
## error is too many 0's in the dataset, please try doing a filtering of the data and retry.
## Error in density.default(x, adjust = adj): 'x' contains missing values
all_supplement_sva_table <- combine_de_tables(
  all_supplement_sva_de,
  keepers = all_supplement_keepers,
  excel = glue("excel/heme_vs_dmso_all_conditions_sva_table-v{ver}.xlsx"))
## Error in eval(expr, envir, enclos): object 'all_supplement_sva_de' not found
all_supplement_sva_sig <- extract_significant_genes(
  all_supplement_sva_table,
  excel = glue("excel/heme_vs_dmso_all_conditions_sva_sig-v{ver}.xlsx"))
## Error in eval(expr, envir, enclos): object 'all_supplement_sva_table' not found

9.1 Lots of contrasts

strain_supplement_keepers <- list(
  "AP_C_HD" = c("s5448APCHeme", "s5448APCDMSO"),
  "NZ_C_HD" = c("nz131CHeme", "nz131CDMSO"),
  "G5448_C_HD" = c("s5448CHeme", "s5448CDMSO"),
  "NZ_R_HD" = c("nz131RPMIHeme", "nz131RPMIDMSO"),
  "G5448_R_HD" = c("s5448RPMIHeme", "s5448RPMIDMSO"))

exc_expt <- set_expt_batches(exc_expt, fact = "replicate")
## The number of samples by batch are:
## 
## r1 r2 r3 r4 
## 20 19 19 19
exc_de <- all_pairwise(exc_expt, model_batch = TRUE)
## 
##    nz131_C_DMSO    nz131_C_Heme nz131_RPMI_DMSO nz131_RPMI_Heme    s5448_C_DMSO    s5448_C_Heme s5448_RPMI_DMSO s5448_RPMI_Heme  s5448AP_C_DMSO 
##               8               7               7               8               7               8               8               8               8 
##  s5448AP_C_Heme 
##               8 
## 
## r1 r2 r3 r4 
## 20 19 19 19
exc_de
## A pairwise differential expression with results from: basic, deseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: batch in model/limma.
## The primary analysis performed 10 comparisons.
exc_table <- combine_de_tables(
  exc_de, keepers = strain_supplement_keepers,
  excel = glue("excel/gas_heme_vs_dmso_batch-v{ver}.xlsx"))
exc_table
## A set of combined differential expression results.
##                            table deseq_sigup deseq_sigdown edger_sigup edger_sigdown limma_sigup limma_sigdown
## 1   s5448APCHeme_vs_s5448APCDMSO         161           361         164           369         310           284
## 2       nz131CHeme_vs_nz131CDMSO         191           126         172           142         140           143
## 3       s5448CHeme_vs_s5448CDMSO         301           295         313           287         277           344
## 4 nz131RPMIHeme_vs_nz131RPMIDMSO           5            45           5            41          20            19
## 5 s5448RPMIHeme_vs_s5448RPMIDMSO          19            41          19            43          21            28
## Plot describing unique/shared genes in a differential expression table.

exc_sig <- extract_significant_genes(
  exc_table,
  excel = glue("excel/gas_heme_vs_dmso_batch_sig-v{ver}.xlsx"))
exc_sig
## A set of genes deemed significant according to limma, edger, deseq, basic.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##            limma_up limma_down edger_up edger_down deseq_up deseq_down basic_up basic_down
## AP_C_HD         310        284      164        369      161        361      199        236
## NZ_C_HD         140        143      172        142      191        126      136        143
## G5448_C_HD      277        344      313        287      301        295      268        336
## NZ_R_HD          20         19        5         41        5         45       14         17
## G5448_R_HD       21         28       19         43       19         41       20         20

10 Circos

LS0tCnRpdGxlOiAiRXhhbWluaW5nIHR3byBzdHJlcHRvY29jY2FsIHN0cmFpbnMsIHR3byBtZWRpYSwgb25lIHN1cHBsZW1lbnQsIGFuZCB0d28gdGltZXBvaW50cy4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB6ZW5idXJuCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKICBmb250LXNpemU6IDE2cHgKfQpib2R5IC5tYWluLWNvbnRhaW5lciB7CiAgbWF4LXdpZHRoOiAxNjAwcHg7Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoaHBnbHRvb2xzKQpsaWJyYXJ5KHJldGljdWxhdGUpCmxpYnJhcnkoZ2dwbG90MikKdHQgPC0gdHJ5KGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKSkKa25pdHI6Om9wdHNfa25pdCRzZXQoCiAgcHJvZ3Jlc3MgPSBUUlVFLCB2ZXJib3NlID0gVFJVRSwgd2lkdGggPSA5MCwgZWNobyA9IFRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlcnJvciA9IFRSVUUsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA4LCBmaWcucmV0aW5hID0gMiwKICBvdXQud2lkdGggPSAiMTAwJSIsIGRldiA9ICJwbmciLAogIGRldi5hcmdzID0gbGlzdChwbmcgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpKQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cyA9IDQsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSwga25pdHIuZHVwbGljYXRlLmxhYmVsID0gImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyKSkKdmVyIDwtICIyMDI0MDYiCnByZXZpb3VzX2ZpbGUgPC0gIiIKdmVyIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCAiJVklbSVkIikKCiMjdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKQpybWRfZmlsZSA8LSAiaW5kZXguUm1kIgpgYGAKCiMgSW50cm9kdWN0aW9uCgpJbiBteSBwcmV2aW91cyBpbnN0YWxsbWVudCAocHJlcHJvY2Vzc2luZy5SbWQpLCBJIHNwdW4gdXAgc29tZSBqb2JzIG9uCnRoZSBjbHVzdGVyIHRvIGV4YW1pbmUgdGhlc2Ugc2FtcGxlcy4gIEluIHRoaXMgZG9jdW1lbnQgSSB3aWxsIHNwZW5kCnNvbWUgdGltZSBsb29raW5nIGF0IHRoZW0uCgojIEFubm90YXRpb25zCgpIYWxmIG9mIHRoZSBzYW1wbGVzIGFyZSBHQVMgNTQ0OCBhbmQgaGFsZiBhcmUgTloxMzEuICBJIGhhdmUgb25seSBzbwpmYXIgbWFwcGVkIGFsbCBzYW1wbGVzIGFnYWluc3QgNTQ0OCwgSSB3aWxsIGRvIE5aMTMxIHRvZGF5LgoKYGBge3J9CmdhczU0NDhfZ2ZmIDwtIGxvYWRfZ2ZmX2Fubm90YXRpb25zKCJyZWZlcmVuY2Uvc3B5b2dlbmVzXzU0NDhfdjEuZ2ZmIikKcm93bmFtZXMoZ2FzNTQ0OF9nZmYpIDwtIG1ha2UubmFtZXMoZ2FzNTQ0OF9nZmZbWyJsb2N1c190YWciXV0sIHVuaXF1ZSA9IFRSVUUpCgpuejEzMV9taWNyb2JlcyA8LSBsb2FkX21pY3JvYmVzb25saW5lX2Fubm90YXRpb25zKHNwZWNpZXMgPSAiU3RyZXB0b2NvY2N1cyBweW9nZW5lcyBOWjEzMSIpCmBgYAoKIyBDb2xsZWN0IFByZXByb2Nlc3NpbmcgbWV0YWRhdGEKClRoZSB2YXJpb3VzIG1hcHBpbmcgZXRjIHRvb2xzIGZpbmlzaGVkIGxhc3QgbmlnaHQsIGxldCB1cyBjb2xsZWN0IHRoZQpudW1iZXJzIGZyb20gdGhlbSBoZXJlLiAgVGhlIGRlZmF1bHRzIHNob3VsZCB3b3JrIHdlbGwgZm9yIHByZXR0eSBtdWNoCmV2ZXJ5dGhpbmcsIHNvIEkgdGhpbmsgSSBuZWVkIGZpbGwgaW4gb25seSB0aGUgc3RhcnRpbmcgc2FtcGxlIHNoZWV0LgoKYGBge3J9CnNhbXBsZV9zaGVldCA8LSBnYXRoZXJfcHJlcHJvY2Vzc2luZ19tZXRhZGF0YSgic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy54bHN4IikKYGBgCgojIENyZWF0ZSBhbiBleHByZXNzaW9uc2V0CgpgYGB7cn0KYWxsX2V4cHQgPC0gY3JlYXRlX2V4cHQoc2FtcGxlX3NoZWV0W1sibmV3X21ldGEiXV0sIGZpbGVfY29sdW1uID0gImhpc2F0X2NvdW50X3RhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvID0gZ2FzNTQ0OF9nZmYpICU+JQogIHN1YnNldF9leHB0KHN1YnNldD0icmVhZDFmYXN0cWZpbGUhPSdVbmRldGVybWluZWRfUzBfUjFfMDAxLmZhc3RxLmd6JyIpCgphbGxfY29tYmluZWRfZmFjdG9yIDwtIHBhc3RlMChwRGF0YShhbGxfZXhwdClbWyJzdHJhaW4iXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEoYWxsX2V4cHQpW1sibWVkaWEiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEoYWxsX2V4cHQpW1sic3VwcGxlbWVudCJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YShhbGxfZXhwdClbWyJ0aW1lIl1dKQpwRGF0YShhbGxfZXhwdClbWyJjb21iaW5lZCJdXSA8LSBhbGxfY29tYmluZWRfZmFjdG9yCmFsbF9leHB0IDwtIHNldF9leHB0X2NvbmRpdGlvbnMoYWxsX2V4cHQsIGFsbF9jb21iaW5lZF9mYWN0b3IpICU+JQogIHNldF9leHB0X2JhdGNoZXMoInJlcGxpY2F0ZSIpCgpjb21iaW5lZF9zdHJhaW5fc3VwcGxlbWVudF9tZWRpYSA8LSBwYXN0ZTAocERhdGEoYWxsX2V4cHQpW1sic3RyYWluIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YShhbGxfZXhwdClbWyJtZWRpYSJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEoYWxsX2V4cHQpW1sic3VwcGxlbWVudCJdXSkKcERhdGEoYWxsX2V4cHQpW1sic3RyX3N1cF9tZWQiXV0gPC0gY29tYmluZWRfc3RyYWluX3N1cHBsZW1lbnRfbWVkaWEKCmNvbWJpbmVkX3N0cmFpbl9zdXBwbGVtZW50IDwtIHBhc3RlMChwRGF0YShhbGxfZXhwdClbWyJzdHJhaW4iXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKGFsbF9leHB0KVtbInN1cHBsZW1lbnQiXV0pCnBEYXRhKGFsbF9leHB0KVtbInN0cl9zdXAiXV0gPC0gY29tYmluZWRfc3RyYWluX3N1cHBsZW1lbnQKCmNvbWJpbmVkX21lZGlhX3N1cHBsZW1lbnQgPC0gcGFzdGUwKHBEYXRhKGFsbF9leHB0KVtbIm1lZGlhIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YShhbGxfZXhwdClbWyJzdXBwbGVtZW50Il1dKQpwRGF0YShhbGxfZXhwdClbWyJtZWRfc3VwIl1dIDwtIGNvbWJpbmVkX21lZGlhX3N1cHBsZW1lbnQKCmNvbWJpbmVkX3N0cmFpbl9tZWRpYSA8LSBwYXN0ZTAocERhdGEoYWxsX2V4cHQpW1sic3RyYWluIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEoYWxsX2V4cHQpW1sibWVkaWEiXV0pCnBEYXRhKGFsbF9leHB0KVtbInN0cl9tZWQiXV0gPC0gY29tYmluZWRfc3RyYWluX21lZGlhCgpub3RpbWVfZmFjdG9yIDwtIHBhc3RlMChwRGF0YShhbGxfZXhwdClbWyJzdHJhaW4iXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEoYWxsX2V4cHQpW1sibWVkaWEiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEoYWxsX2V4cHQpW1sic3VwcGxlbWVudCJdXSkKcERhdGEoYWxsX2V4cHQpW1sibm90aW1lIl1dIDwtIG5vdGltZV9mYWN0b3IKYWxsX2V4cHQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhhbGxfZXhwdCwgbm90aW1lX2ZhY3RvcikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcygic3RyYWluIikKCmZ1biA8LSBwbG90X21ldGFfc2Fua2V5KGFsbF9leHB0LCBmYWN0b3JzID0gYygic3RyYWluIiwgIm1lZGlhIiwgInN1cHBsZW1lbnQiLCAidGltZSIpKQpmdW4KCnJlYWRzIDwtIHBsb3RfbWV0YWRhdGFfZmFjdG9ycyhhbGxfZXhwdCwgImhpc2F0Z2Vub21lc2luZ2xlY29uY29yZGFudCIpCnJlYWRzCmBgYAoKIyBFeGFtaW5lIHJlYWRzL2dlbmUgZGlzdHJpYnV0aW9uIGV0YwoKCmBgYHtyfQpwbG90X2xlZ2VuZChhbGxfZXhwdCkKcGxvdF9saWJzaXplKGFsbF9leHB0KQpwbG90X25vbnplcm8oYWxsX2V4cHQpCmBgYAoKIyBOb3JtYWxpemUgYW5kIGxvb2sgbW9yZSBjbG9zZWx5CgpgYGB7cn0KYWxsX25vcm0gPC0gbm9ybWFsaXplX2V4cHQoYWxsX2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKcGxvdF9zbShhbGxfbm9ybSkKcGxvdF9kaXNoZWF0KGFsbF9ub3JtKQpwbG90X2NvcmhlYXQoYWxsX25vcm0pCnBsb3RfcGNhKGFsbF9ub3JtLCBwbG90X2xhYmVscyA9ICJyZXBlbCIsIG1heC5vdmVybGFwcyA9IDEwMCkKYGBgCgpJIHRoaW5rIHNvbWUgc2FtcGxlcyBtYXkgd2FycmFudCByZW1vdmFsOiBLTVNMNjAsIEtNU0w2NywgS01TTDE4CgpgYGB7cn0KZXhjbHVkZV9pZHMgPC0gYygiS01TTDYwIiwgIktNU0w2NyIsICJLTVNMMTgiKQpleGNsdWRlX2lkeCA8LSAhIHNhbXBsZU5hbWVzKGFsbF9ub3JtKSAlaW4lIGV4Y2x1ZGVfaWRzCmV4Y2x1ZGVfc2FtcGxlcyA8LSBzYW1wbGVOYW1lcyhhbGxfbm9ybSlbZXhjbHVkZV9pZHhdCgpleGNfZXhwdCA8LSBzdWJzZXRfZXhwdChhbGxfZXhwdCwgaWRzID0gZXhjbHVkZV9zYW1wbGVzKQpgYGAKClN0cmFuZ2UsIEkgYW0gZ29pbmcgdG8gYXNzdW1lIHRoZSBuejEzMS81NDQ4IHNwbGl0IGlzIHRoZSBwcm9ibGVtPwoKYGBge3J9Cm56MTMxX2lkeCA8LSBwRGF0YShhbGxfZXhwdClbWyJzdHJhaW4iXV0gPT0gIm56MTMxIgpuejEzMV9leHB0IDwtIGFsbF9leHB0WywgbnoxMzFfaWR4XQoKczU0NDhfaWR4IDwtIHBEYXRhKGFsbF9leHB0KVtbInN0cmFpbiJdXSA9PSAiczU0NDgiCnM1NDQ4X2V4cHQgPC0gYWxsX2V4cHRbLCBzNTQ0OF9pZHhdCgpuejEzMV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KG56MTMxX2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShuejEzMV9ub3JtKQoKczU0NDhfbm9ybSA8LSBub3JtYWxpemVfZXhwdChzNTQ0OF9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EoczU0NDhfbm9ybSkKYGBgCgojIFVzZSB2YXJpYW5jZSBwYXJ0aXRpb24gdG8gZ3Vlc3Mgd2hpY2ggZmFjdG9yIGlzIG1vc3QgaW1wb3J0YW50CgpOb3RlLCB2YXJpYW5jZSBwYXJ0aXRpb24gcmVxdWlyZXMgYSBzb21ld2hhdCBtb3JlIHN0cmljdCBmaWx0ZXIgdGhhbiBJCnVzZSBmb3IgbWFueSBvdGhlciB0YXNrcy4gIEdpdmVuIHRoZSBwZWN1bGlhcml0eSBvZiB3aGF0IEkgYW0gc2VlaW5nLApJIG1pZ2h0IGNob29zZSB0byB1c2UgdGhpcyBzdHJpY3RlciBkYXRhc2V0LgoKYGBge3J9CnZwIDwtIHNpbXBsZV92YXJwYXJ0KGFsbF9leHB0LCBmYWN0b3JzID0gYygic3RyYWluIiwgInRpbWUiLCAic3VwcGxlbWVudCIsICJtZWRpYSIsICJyZXBsaWNhdGUiKSkKdnAKZmlsdF9leHB0IDwtIHZwW1sibW9kaWZpZWRfZXhwdCJdXQoKZXhjX3ZwIDwtIHNpbXBsZV92YXJwYXJ0KGV4Y19leHB0LCBmYWN0b3JzID0gYygic3RyYWluIiwgInRpbWUiLCAic3VwcGxlbWVudCIsICJtZWRpYSIpKQpmaWx0X2V4YyA8LSBleGNfdnBbWyJtb2RpZmllZF9leHB0Il1dCmBgYAoKIyBTcGxpdCB0aGUgZmFjdG9ycyB1cCBhbmQgbG9vayBpbmRpdmlkdWFsbHkKClZhcmlhbmNlIHBhcnRpdGlvbiBzYXlzIHRoYXQgbWVkaWEgaXMgdGhlIHdpbm5lciwgbGV0IHVzIGxvb2sgYXQgdGhhdApmaXJzdC4KSSBhbSBndWVzc2luZyB0aGF0IHRoZSBvdGhlciBmYWN0b3JzIHdpbGwgbm90IHByb3ZpZGUgaW50ZXJlc3RpbmcKcGxvdHMgdW5sZXNzIHdlIGdvIG51dHMgYW5kIHVzZSBzdmEuCgojIyBNZWRpYQoKYGBge3J9Cm1lZGlhX2V4cHQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhmaWx0X2V4cHQsIGZhY3QgPSAibWVkaWEiKQptZWRpYV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KG1lZGlhX2V4cHQsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgdHJhbnNmb3JtID0gImxvZzIiKQpwbG90X3BjYShtZWRpYV9ub3JtKQoKbWVkaWFfbmIgPC0gbm9ybWFsaXplX2V4cHQobWVkaWFfZXhwdCwgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCB0cmFuc2Zvcm0gPSAibG9nMiIpCnBsb3RfcGNhKG1lZGlhX25iKQpgYGAKCiMjIFN1cHBsZW1lbnQKCmBgYHtyfQpzdXBwbGVtZW50X2V4cHQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhmaWx0X2V4cHQsIGZhY3QgPSAic3VwcGxlbWVudCIpCgpzdXBwbGVtZW50X25vcm0gPC0gbm9ybWFsaXplX2V4cHQoc3VwcGxlbWVudF9leHB0LCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgdHJhbnNmb3JtID0gImxvZzIiKQpwbG90X3BjYShzdXBwbGVtZW50X25vcm0pCgpzdXBwbGVtZW50X25iIDwtIG5vcm1hbGl6ZV9leHB0KHN1cHBsZW1lbnRfZXhwdCwgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoID0gInN2YXNlcSIsIHRyYW5zZm9ybSA9ICJsb2cyIikKcGxvdF9wY2Eoc3VwcGxlbWVudF9uYikKYGBgCgojIyBUaW1lCgpUaW1lIGlzIHRoZSBiaWcgbG9zZXIgaW4gdGhpcy4KCmBgYHtyfQp0aW1lX2V4cHQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhmaWx0X2V4cHQsIGZhY3QgPSAidGltZSIpCgp0aW1lX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodGltZV9leHB0LCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgdHJhbnNmb3JtID0gImxvZzIiKQpwbG90X3BjYSh0aW1lX25vcm0pCgp0aW1lX25iIDwtIG5vcm1hbGl6ZV9leHB0KHRpbWVfZXhwdCwgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoID0gInN2YXNlcSIsIHRyYW5zZm9ybSA9ICJsb2cyIikKcGxvdF9wY2EodGltZV9uYikKYGBgCgojIyBNZWRpYSBhbmQgc3VwcGxlbWVudAoKYGBge3J9Cm1lZF9zdXBfZXhwdCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGZpbHRfZXhwdCwgZmFjdCA9ICJtZWRfc3VwIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInN0cmFpbiIpCgptZWRfc3VwX25vcm0gPC0gbm9ybWFsaXplX2V4cHQobWVkX3N1cF9leHB0LCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgdHJhbnNmb3JtID0gImxvZzIiKQpwbG90X3BjYShtZWRfc3VwX25vcm0pCgptZWRfc3VwX25iIDwtIG5vcm1hbGl6ZV9leHB0KG1lZF9zdXBfZXhwdCwgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoID0gInN2YXNlcSIsIHRyYW5zZm9ybSA9ICJsb2cyIikKcGxvdF9wY2EobWVkX3N1cF9uYikKYGBgCgojIFF1aWNrIERFCgpUaGlua2luZy4uLiBsZXQgdXMgZmlyc3QganVzdCBsdW1wIGFsbCBzYW1wbGVzIHRvZ2V0aGVyIGFuZCBzZWUgd2hhdCBoYXBwZW5zPwoKYGBge3J9CmFsbF9zdXBwbGVtZW50X2tlZXBlcnMgPC0gbGlzdCgKICAiaGVtZV92c19kbXNvIiA9IGMoIkhlbWUiLCAiRE1TTyIpKQoKIyMgVGhpcyBhZGRzIHJlcGxpY2F0ZSB0byB0aGUgbW9kZWwgYmVjYXVzZSBtb2RlbF9iYXRjaCBkZWZhdWx0cyB0byBUUlVFCmFsbF9zdXBwbGVtZW50X2RlIDwtIGFsbF9wYWlyd2lzZShzdXBwbGVtZW50X2V4cHQsIG1vZGVsX2JhdGNoID0gVFJVRSkKYWxsX3N1cHBsZW1lbnRfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgYWxsX3N1cHBsZW1lbnRfZGUsCiAga2VlcGVycyA9IGFsbF9zdXBwbGVtZW50X2tlZXBlcnMsCiAgZXhjZWwgPSBnbHVlKCJleGNlbC9oZW1lX3ZzX2Rtc29fYWxsX2NvbmRpdGlvbnNfYmF0Y2hfdGFibGUtdnt2ZXJ9Lnhsc3giKSkKYWxsX3N1cHBsZW1lbnRfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgYWxsX3N1cHBsZW1lbnRfdGFibGUsCiAgZXhjZWwgPSBnbHVlKCJleGNlbC9oZW1lX3ZzX2Rtc29fYWxsX2NvbmRpdGlvbnNfYmF0Y2hfc2lnLXZ7dmVyfS54bHN4IikpCgphbGxfc3VwcGxlbWVudF9zdmFfZGUgPC0gYWxsX3BhaXJ3aXNlKHN1cHBsZW1lbnRfZXhwdCwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKYWxsX3N1cHBsZW1lbnRfc3ZhX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIGFsbF9zdXBwbGVtZW50X3N2YV9kZSwKICBrZWVwZXJzID0gYWxsX3N1cHBsZW1lbnRfa2VlcGVycywKICBleGNlbCA9IGdsdWUoImV4Y2VsL2hlbWVfdnNfZG1zb19hbGxfY29uZGl0aW9uc19zdmFfdGFibGUtdnt2ZXJ9Lnhsc3giKSkKYWxsX3N1cHBsZW1lbnRfc3ZhX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGFsbF9zdXBwbGVtZW50X3N2YV90YWJsZSwKICBleGNlbCA9IGdsdWUoImV4Y2VsL2hlbWVfdnNfZG1zb19hbGxfY29uZGl0aW9uc19zdmFfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgTG90cyBvZiBjb250cmFzdHMKCmBgYHtyfQpzdHJhaW5fc3VwcGxlbWVudF9rZWVwZXJzIDwtIGxpc3QoCiAgIkFQX0NfSEQiID0gYygiczU0NDhBUENIZW1lIiwgInM1NDQ4QVBDRE1TTyIpLAogICJOWl9DX0hEIiA9IGMoIm56MTMxQ0hlbWUiLCAibnoxMzFDRE1TTyIpLAogICJHNTQ0OF9DX0hEIiA9IGMoInM1NDQ4Q0hlbWUiLCAiczU0NDhDRE1TTyIpLAogICJOWl9SX0hEIiA9IGMoIm56MTMxUlBNSUhlbWUiLCAibnoxMzFSUE1JRE1TTyIpLAogICJHNTQ0OF9SX0hEIiA9IGMoInM1NDQ4UlBNSUhlbWUiLCAiczU0NDhSUE1JRE1TTyIpKQoKZXhjX2V4cHQgPC0gc2V0X2V4cHRfYmF0Y2hlcyhleGNfZXhwdCwgZmFjdCA9ICJyZXBsaWNhdGUiKQpleGNfZGUgPC0gYWxsX3BhaXJ3aXNlKGV4Y19leHB0LCBtb2RlbF9iYXRjaCA9IFRSVUUpCmV4Y19kZQoKZXhjX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIGV4Y19kZSwga2VlcGVycyA9IHN0cmFpbl9zdXBwbGVtZW50X2tlZXBlcnMsCiAgZXhjZWwgPSBnbHVlKCJleGNlbC9nYXNfaGVtZV92c19kbXNvX2JhdGNoLXZ7dmVyfS54bHN4IikpCmV4Y190YWJsZQoKZXhjX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGV4Y190YWJsZSwKICBleGNlbCA9IGdsdWUoImV4Y2VsL2dhc19oZW1lX3ZzX2Rtc29fYmF0Y2hfc2lnLXZ7dmVyfS54bHN4IikpCmV4Y19zaWcKYGBgCgojIENpcmNvcwoKYGBge3J9CgpgYGAK