1 Main libraries and configuration

library(dplyr)
library(ExperimentHub)
library(GenomicRanges)
library(coMethDMR)
library(ggplot2)
devtools::load_all("~/Dropbox (BBSR)/PanCancer/methTF/")
dir.result <- "meta_analysis_region_results/"
dir.result.meta.analysis <- file.path(dir.result, "step1_meta_analysis/")
dir.result.comp <- file.path(dir.result, "step3_comp/")
dir.result.lola <- file.path(dir.result, "step5_lola/")
dir.result.enrichment <- file.path(dir.result, "step6_enrichment/")
dir.result.pathway <- file.path(dir.result, "step7_pathway/")
for(p in grep("dir",ls(),value = T)) dir.create(get(p),recursive = TRUE,showWarnings = FALSE)

2 Enrichment analysis

2.1 For regions

2.1.1 Get results

### Call in datasets
meta_sig <- read.csv(dir(dir.result.comp,pattern = "no.*csv",full.names = TRUE))
meta_sig_pos_est <- meta_sig %>% dplyr::filter(estimate > 0)
meta_sig_neg_est <- meta_sig %>% dplyr::filter(estimate < 0)

meta_all <- read.csv(
  paste0(dir.result.meta.analysis, "meta_analysis_ALL_df.csv")
) #dim: 40010 41

2.1.2 Get probes from regions

probes.cluster.all <- coMethDMR::getPredefinedCluster(arrayType = "450k",
                                                      clusterType = "regions")

### get all cps in meta_sig input regions
idx <- gsub(
  "450k_Gene_3_200.|450k_InterGene_3_200.","",names(probes.cluster.all)
) %in% meta_sig_pos_est$inputRegion

meta_sig_probes_pos_est <- probes.cluster.all[idx] %>%
  unlist %>%
  as.character() %>%
  unique
length(meta_sig_probes_pos_est)
## [1] 565
idx <- gsub(
  "450k_Gene_3_200.|450k_InterGene_3_200.","",names(probes.cluster.all)
) %in% meta_sig_neg_est$inputRegion

meta_sig_neg_est <- probes.cluster.all[idx] %>%
  unlist %>%
  as.character() %>%
  unique
length(meta_sig_neg_est)
## [1] 177
### get all cps in meta_all input regions
idx <- gsub(
  "450k_Gene_3_200.|450k_InterGene_3_200.","",names(probes.cluster.all)
) %in% meta_all$inputRegion

meta_all_probes <- probes.cluster.all[idx] %>%
  unlist %>%
  as.character() %>%
  unique

length(meta_all_probes)
## [1] 203198

2.1.3 Annotation

all.plot.region <-
  cpGsGenomicFeatures(
    list("Evaluated probes (n = 203198)" = meta_all_probes,
         "Significant w/ Negative estimate (n = 177)" = meta_sig_neg_est,
         "Significant w/ Positive estimate (n = 565)" = meta_sig_probes_pos_est),
  )

plot.region.cpg <- all.plot.region$plot + ggtitle("Region meta-analysis probes") 
ggsave(plot = plot.region.cpg,width = 9,filename = "plots/meta_analysis_region_enrichment.pdf")
## Saving 9 x 10 in image
plot.region.cpg

2.1.4 ChroMHMM

file <- paste0("https://egg2.wustl.edu/roadmap/data/byFileType/chromhmmSegmentations",
               "/ChmmModels/coreMarks/jointModel/final/E073_15_coreMarks_segments.bed")
ChmmModels <- readr::read_tsv(file,col_names = FALSE, col_types = readr::cols())
colnames(ChmmModels) <- c("chr","start","end","state")
states <- readr::read_csv("../../DNAm_RNA/data/chromHMM_labels.csv",col_names = FALSE,, col_types = readr::cols())
states$X1 <- paste0("E",states$X1)
ChmmModels$state <- states$X3[match(ChmmModels$state,states$X1)]
ChmmModels.gr <- makeGRangesFromDataFrame(ChmmModels,keep.extra.columns = TRUE)
region.cpg.plot <-
  cpGsGenomicFeatures(
    list("Evaluated probes (n = 203198)" = meta_all_probes,
         "Significant w/ Negative estimate (n = 177)" = meta_sig_neg_est,
         "Significant w/ Positive estimate (n =  565)" = meta_sig_probes_pos_est),
    annotation.gr = ChmmModels.gr,
    plot.width = 12,
    plot.title = "Region meta-analysis probes\nChroMHMM: E073 - 15 coreMarks segments",
    enrichment.type = "customized",
    plot.filename = "plots/meta_analysis_region_chromHMM_states.pdf",
  )
region.cpg.plot$plot

tab.chrm <- cbind(
  data.frame(
    "Meta-Analysis" = c(
      rep("Region",nrow(plot.chrm.hyper$table) + nrow(plot.chrm.hypo$table))
    ),
    "Foreground probes" = c(
      rep("Significant probes w/ Positive estimate",nrow(plot.chrm.hyper$table)),
      rep("Significant probes w/ Negative estimate",nrow(plot.chrm.hypo$table))
    ),
    "Enrichment analysis" = c(
      rep("ChroMHMM: E073",nrow(plot.chrm.hyper$table) + nrow(plot.chrm.hypo$table))
    )
  ),
  rbind(plot.chrm.hyper$table[,c(1,6,7)],
        plot.chrm.hypo$table[,c(1,6,7)])
)
tab.chrm

2.2 For single cpgs

2.2.1 Get results

### Foreground
single.cpg.results <- readr::read_csv(
  "meta_analysis_single_cpg_results/meta_analysis_single_cpg_df.csv",
  col_types = readr::cols()
)
single.cpg.sig.results <- readr::read_csv(                                                        
  "meta_analysis_single_cpg_results/meta_analysis_single_cpg_sig_no_crossHyb_smoking_df.csv",
  col_types = readr::cols()
)                                                                                                 

foreground.probes <- single.cpg.sig.results %>% pull(cpg) %>% as.character
foreground.probes.neg.est <- single.cpg.sig.results %>% filter(estimate < 0) %>% pull(cpg) %>% as.character
foreground.probes.pos.est <- single.cpg.sig.results  %>% filter(estimate > 0) %>% pull(cpg) %>% as.character
length(foreground.probes)
## [1] 3751
### Background
background.probes <- single.cpg.results  %>% pull(cpg) %>% as.character 
length(background.probes)
## [1] 450793

2.2.2 Annotation

all.plot <-
  cpGsGenomicFeatures(
    list("Evaluated probes (n = 450793)" = background.probes,
         "Significant w/ Negative estimate (n = 1552)" = foreground.probes.neg.est,
         "Significant w/ Positive estimate (n = 2199)" = foreground.probes.pos.est),
  )
plot.single.cpg <- all.plot$plot + ggtitle("Single cpg meta-analysis probes") 
plot.single.cpg

ggsave(plot = plot.single.cpg,width = 9,filename = "plots/meta_analysis_single_cpg_enrichment.pdf")
## Saving 9 x 10 in image

2.2.3 ChroMHMM

file <- paste0("https://egg2.wustl.edu/roadmap/data/byFileType/chromhmmSegmentations",
               "/ChmmModels/coreMarks/jointModel/final/E073_15_coreMarks_segments.bed")
ChmmModels <- readr::read_tsv(
  file,
  col_names = FALSE,
  col_types = readr::cols()
)
colnames(ChmmModels) <- c("chr","start","end","state")
states <- readr::read_csv(
  "../../DNAm_RNA/data/chromHMM_labels.csv",
  col_names = FALSE,
  col_types = readr::cols()
)
states$X1 <- paste0("E",states$X1)
ChmmModels$state <- states$X3[match(ChmmModels$state,states$X1)]
ChmmModels.gr <- makeGRangesFromDataFrame(ChmmModels,keep.extra.columns = TRUE)
single.cpg.plot <- cpGsGenomicFeatures(
  list("Evaluated probes (n = 450793)" = background.probes,
       "Significant w/ Negative estimate (n = 1552)" = foreground.probes.neg.est,
       "Significant w/ Positive estimate (n =  2199)" = foreground.probes.pos.est),
  annotation.gr = ChmmModels.gr,
  plot.width = 12,
  plot.title = "Single cpg meta-analysis probes\nChroMHMM: E073 - 15 coreMarks segments",
  enrichment.type = "customized",
  plot.filename = "plots/meta_analysis_single_cpg_chromHMM_states.pdf",
)
single.cpg.plot$plot

tab.chrm <- cbind(
  data.frame(
    "Meta-Analysis" = c(
      rep("Single CpG",nrow(plot.chrm.hyper$table) + nrow(plot.chrm.hypo$table))
    ),
    "Foreground probes" = c(
      rep("Significant probes w/ Positive estimate",nrow(plot.chrm.hyper$table)),
      rep("Significant probes w/ Negative estimate",nrow(plot.chrm.hypo$table))
    ),
    "Enrichment analysis" = c(
      rep("ChroMHMM: E073",nrow(plot.chrm.hyper$table) + nrow(plot.chrm.hypo$table))
    )
  ),
  rbind(plot.chrm.hyper$table[,c(1,6,7)],
        plot.chrm.hypo$table[,c(1,6,7)])
)
tab.chrm

3 Pathway analysis

3.1 For regions + single cpgs

3.1.1 Get probes

3.1.2 Get probes from regions

### Call in datasets
meta_sig <- read.csv(dir(dir.result.comp,pattern = "no.*csv",full.names = TRUE))

meta_all <- read.csv(
  paste0(dir.result.meta.analysis, "meta_analysis_ALL_df.csv")
) #dim: 40010 41
probes.cluster.all <- coMethDMR::getPredefinedCluster(arrayType = "450k",
                                                      clusterType = "regions")

### get all cps in meta_sig input regions
idx <- gsub(
  "450k_Gene_3_200.|450k_InterGene_3_200.","",names(probes.cluster.all)
) %in% meta_sig$inputRegion

meta_sig_probes <- probes.cluster.all[idx] %>%
  unlist %>%
  as.character() %>%
  unique
length(meta_sig_probes)
## [1] 742
### get all cps in meta_all input regions
idx <- gsub(
  "450k_Gene_3_200.|450k_InterGene_3_200.","",names(probes.cluster.all)
) %in% meta_all$inputRegion

meta_all_probes <- probes.cluster.all[idx] %>%
  unlist %>%
  as.character() %>%
  unique

length(meta_all_probes)
## [1] 203198
all.foreground.probes <- c(meta_sig_probes, foreground.probes) %>% unique  
all.background.probes <- c(meta_all_probes, background.probes) %>% unique

3.1.3 Pathway analysis (gene ontology analysis)

library(missMethyl)
library(IlluminaHumanMethylation450kanno.ilmn12.hg19)
### collection = "GO"
all_go <- gometh(
  sig.cpg = all.foreground.probes,
  all.cpg = all.background.probes,
  collection = "GO",
  fract.counts = TRUE
)
# topGSA(all_go)

go <- missMethyl:::.getGO()
out <- getMappedEntrezIDs(sig.cpg = foreground.probes,
                          all.cpg = background.probes,
                          array.type = "450K")
sorted.eg.sig <-  out$sig.eg
gene.info <- TCGAbiolinks::get.GRCh.bioMart()
## Accessing grch37.ensembl.org to get gene information
## Downloading genome information (try:0) Using: Human genes (GRCh37.p13)
all_go$de_genes <- plyr::aaply(rownames(all_go),1,.fun = function(idx){
  gene.info$external_gene_name[gene.info$entrezgene_id %in% intersect(go$idList[[idx]],sorted.eg.sig)] %>%
    sort %>% unique %>% paste(collapse = ",")
})

all_go_ordered <- all_go[
  order(all_go$P.DE),
  ]

write.csv(
  all_go_ordered,
  paste0(dir.result.pathway, "pathway_regions_and_cpgs_GO_results_all.csv"),
  row.names = TRUE
)

all_go_ordered.bp <- all_go_ordered %>%
  tibble::rownames_to_column("GO") %>%  # keep row names
  dplyr::filter(ONTOLOGY == "BP") %>%
  tibble::column_to_rownames("GO")   # keep row names
all_go_ordered.bp$FDR <- p.adjust(all_go_ordered.bp$P.DE,"fdr")
write.csv(
  all_go_ordered.bp,
  paste0(dir.result.pathway, "pathway_regions_and_cpgs_GO_results_BP_N_range_5_200_fdr_recalc.csv"),
  row.names = TRUE
)
all_go_ordered.bp  %>% 
  dplyr::filter(FDR < 0.05) %>%
  DT::datatable(filter = 'top',
                style = "bootstrap",
                extensions = 'Buttons',
                options = list(scrollX = TRUE, 
                               dom = 'Bfrtip',
                               buttons = I('colvis'),
                               keys = TRUE, 
                               pageLength = 10), 
                rownames = FALSE,
                caption = "GO results BP (FDR < 0.05)")
### collection = "KEGG"
all_kegg <- gometh(
  sig.cpg = all.foreground.probes,
  all.cpg = all.background.probes,
  collection = "KEGG",
  fract.counts = TRUE
)
# topGSA(all_kegg)

kegg <- missMethyl:::.getKEGG()
out <- getMappedEntrezIDs(sig.cpg = foreground.probes,
                          all.cpg = background.probes,
                          array.type = "450K")
sorted.eg.sig <- out$sig.eg
gene.info <- TCGAbiolinks::get.GRCh.bioMart()
## Accessing grch37.ensembl.org to get gene information
## Downloading genome information (try:0) Using: Human genes (GRCh37.p13)
all_kegg$de_genes <- plyr::aaply(rownames(all_kegg),1,.fun = function(idx){
  gene.info$external_gene_name[gene.info$entrezgene_id %in% intersect(kegg$idList[[idx]],sorted.eg.sig)] %>%
    sort %>% unique %>% paste(collapse = ",")
})

all_kegg_ordered <- all_kegg[
  order(all_kegg$P.DE),
  ]

write.csv(
  all_kegg_ordered,
  paste0(dir.result.pathway, "pathway_regions_and_cpgs_KEGG_results_all.csv"),
  row.names = TRUE
)


all_kegg_ordered <- all_kegg_ordered %>%
  tibble::rownames_to_column("KEGG") %>%  # keep row names
  tibble::column_to_rownames("KEGG")      # keep row names
all_kegg_ordered$FDR <- p.adjust(all_kegg_ordered$P.DE,"fdr")
write.csv(
  all_kegg_ordered,
  paste0(dir.result.pathway, "pathway_regions_and_cpgs_KEGG_results_N_range_5_200_fdr_recalc.csv"),
  row.names = TRUE
)
all_kegg_ordered  %>% 
  dplyr::filter(P.DE < 0.05) %>%
  DT::datatable(filter = 'top',
                style = "bootstrap",
                extensions = 'Buttons',
                options = list(scrollX = TRUE, 
                               dom = 'Bfrtip',
                               buttons = I('colvis'),
                               keys = TRUE, 
                               pageLength = 10), 
                rownames = FALSE,
                caption = "kegg results (P.DE < 0.05)")                                   

4 LOLA: Locus overlap analysis for enrichment of genomic ranges

4.1 For single cpg

### Call in datasets
cpg_sig_noCrossHyb_noSmoke <- read.csv(
  "meta_analysis_single_cpg_results/meta_analysis_single_cpg_sig_no_crossHyb_smoking_df.csv"
) #dim: 3751 24

cpg_all <- read.csv(
  "meta_analysis_single_cpg_results/meta_analysis_single_cpg_df.csv"
) #dim: 450793 24

cpg_sig_hyper_noCrossHyb_noSmoke <- cpg_sig_noCrossHyb_noSmoke %>%
  filter(estimate > 0)
cpg_sig_hypo_noCrossHyb_noSmoke <- cpg_sig_noCrossHyb_noSmoke %>%
  filter(estimate < 0)

### Turn input regions into GRanges
library(GenomicRanges)
cpg_sig_noCrossHyb_noSmoke_gr <- makeGRangesFromDataFrame(
  cpg_sig_noCrossHyb_noSmoke
)
cpg_sig_hyper_noCrossHyb_noSmoke_gr <- makeGRangesFromDataFrame(
  cpg_sig_hyper_noCrossHyb_noSmoke
)
cpg_sig_hypo_noCrossHyb_noSmoke_gr <- makeGRangesFromDataFrame(
  cpg_sig_hypo_noCrossHyb_noSmoke
)
cpg_all_gr <- makeGRangesFromDataFrame(cpg_all)
library(LOLA)

regionDB_hg19 <- loadRegionDB("LOLACore/hg19")

### All sig. cpgs
locResults <- runLOLA(
  userSets = cpg_sig_noCrossHyb_noSmoke_gr,
  userUniverse = cpg_all_gr,
  regionDB = regionDB_hg19,
  cores = 1
)

locResults$pValue <- 10^(-locResults$pValueLog)

locResults_ordered <- locResults[,c(1:3, 24, 4:23)]

write.csv(
  locResults_ordered,
  paste0(dir.result.lola, "cpgs_all_LOLA_results.csv"),
  row.names = FALSE
)
locResults   %>%
  dplyr::filter(qValue < 0.05 & collection == "encode_tfbs") %>%
  DT::datatable(filter = 'top',
                style = "bootstrap",
                extensions = 'Buttons',
                options = list(scrollX = TRUE,
                               dom = 'Bfrtip',
                               buttons = I('colvis'),
                               keys = TRUE,
                               pageLength = 10),
                rownames = FALSE,
                caption = "single cpg all LOLA results")

5 Session information

devtools::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value                                             
##  version  R Under development (unstable) (2020-02-25 r77857)
##  os       macOS Catalina 10.15.3                            
##  system   x86_64, darwin15.6.0                              
##  ui       X11                                               
##  language (EN)                                              
##  collate  en_US.UTF-8                                       
##  ctype    en_US.UTF-8                                       
##  tz       America/New_York                                  
##  date     2020-04-26                                        
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  ! package                                       * version     date       lib
##    acepack                                         1.4.1       2016-10-29 [1]
##    annotate                                        1.65.1      2020-01-27 [1]
##    AnnotationDbi                                   1.49.1      2020-01-25 [1]
##    AnnotationFilter                                1.11.0      2019-11-06 [1]
##    AnnotationHub                                 * 2.19.11     2020-04-16 [1]
##    aroma.light                                     3.17.1      2019-12-09 [1]
##    askpass                                         1.1         2019-01-13 [1]
##    assertthat                                      0.2.1       2019-03-21 [1]
##    backports                                       1.1.6       2020-04-05 [1]
##    base64                                          2.0         2016-05-10 [1]
##    base64enc                                       0.1-3       2015-07-28 [1]
##    beanplot                                        1.2         2014-09-19 [1]
##    BiasedUrn                                       1.07        2015-12-28 [1]
##    Biobase                                       * 2.47.3      2020-03-16 [1]
##    BiocFileCache                                 * 1.11.6      2020-04-16 [1]
##    BiocGenerics                                  * 0.33.3      2020-03-23 [1]
##    BiocManager                                     1.30.10     2019-11-16 [1]
##    BiocParallel                                    1.21.2      2019-12-21 [1]
##    BiocVersion                                     3.11.1      2019-11-13 [1]
##    biomaRt                                         2.43.5      2020-04-02 [1]
##    Biostrings                                    * 2.55.7      2020-03-24 [1]
##    biovizBase                                      1.35.1      2019-12-03 [1]
##    bit                                             1.1-15.2    2020-02-10 [1]
##    bit64                                           0.9-7       2017-05-08 [1]
##    bitops                                          1.0-6       2013-08-17 [1]
##    blob                                            1.2.1       2020-01-20 [1]
##    boot                                            1.3-24      2019-12-20 [1]
##    broom                                           0.5.6       2020-04-20 [1]
##    BSgenome                                        1.55.4      2020-03-19 [1]
##    bumphunter                                    * 1.29.0      2019-11-07 [1]
##    callr                                           3.4.3       2020-03-28 [1]
##    checkmate                                       2.0.0       2020-02-06 [1]
##    circlize                                        0.4.8       2019-09-08 [1]
##    cli                                             2.0.2       2020-02-28 [1]
##    clue                                            0.3-57      2019-02-25 [1]
##    cluster                                         2.1.0       2019-06-19 [1]
##    codetools                                       0.2-16      2018-12-24 [1]
##    colorspace                                      1.4-1       2019-03-18 [1]
##    coMethDMR                                     * 0.0.0.9001  2020-03-24 [1]
##    ComplexHeatmap                                  2.3.4       2020-04-02 [1]
##    crayon                                          1.3.4       2017-09-16 [1]
##    crosstalk                                       1.1.0.1     2020-03-13 [1]
##    curl                                            4.3         2019-12-02 [1]
##    data.table                                      1.12.9      2020-02-26 [1]
##    DBI                                             1.1.0       2019-12-15 [1]
##    dbplyr                                        * 1.4.3       2020-04-19 [1]
##    DelayedArray                                  * 0.13.12     2020-04-10 [1]
##    DelayedMatrixStats                              1.9.1       2020-03-30 [1]
##    desc                                            1.2.0       2018-05-01 [1]
##    DESeq                                           1.39.0      2019-11-06 [1]
##    devtools                                        2.3.0       2020-04-10 [1]
##    dichromat                                       2.0-0       2013-01-24 [1]
##    digest                                          0.6.25      2020-02-23 [1]
##    doParallel                                      1.0.15      2019-08-02 [1]
##    doRNG                                           1.8.2       2020-01-27 [1]
##    downloader                                      0.4         2015-07-09 [1]
##    dplyr                                         * 0.8.99.9002 2020-04-02 [1]
##    DT                                              0.13        2020-03-23 [1]
##    EDASeq                                          2.21.2      2020-03-20 [1]
##    edgeR                                           3.29.1      2020-02-26 [1]
##    ellipsis                                        0.3.0       2019-09-20 [1]
##    ELMER                                           2.11.1      2020-04-20 [1]
##    ELMER.data                                      2.11.0      2019-10-31 [1]
##    ensembldb                                       2.11.4      2020-04-17 [1]
##    evaluate                                        0.14        2019-05-28 [1]
##    ExperimentHub                                 * 1.13.7      2020-04-16 [1]
##    fansi                                           0.4.1       2020-01-08 [1]
##    farver                                          2.0.3       2020-01-16 [1]
##    fastmap                                         1.0.1       2019-10-08 [1]
##    foreach                                       * 1.5.0       2020-03-30 [1]
##    foreign                                         0.8-78      2020-04-13 [1]
##    Formula                                         1.2-3       2018-05-03 [1]
##    fs                                              1.4.1       2020-04-04 [1]
##    genefilter                                      1.69.0      2019-11-06 [1]
##    geneplotter                                     1.65.0      2019-11-06 [1]
##    generics                                        0.0.2       2018-11-29 [1]
##    GenomeInfoDb                                  * 1.23.17     2020-04-13 [1]
##    GenomeInfoDbData                                1.2.3       2020-04-20 [1]
##    GenomicAlignments                               1.23.2      2020-03-24 [1]
##    GenomicFeatures                                 1.39.7      2020-03-19 [1]
##    GenomicRanges                                 * 1.39.3      2020-04-08 [1]
##    GEOquery                                        2.55.1      2019-11-18 [1]
##    GetoptLong                                      0.1.8       2020-01-08 [1]
##    ggplot2                                       * 3.3.0       2020-03-05 [1]
##    ggpubr                                          0.2.5       2020-02-13 [1]
##    ggrepel                                         0.8.2       2020-03-08 [1]
##    ggsignif                                        0.6.0       2019-08-08 [1]
##    ggthemes                                        4.2.0       2019-05-13 [1]
##    GlobalOptions                                   0.1.1       2019-09-30 [1]
##    glue                                            1.4.0       2020-04-03 [1]
##    GO.db                                           3.10.0      2020-03-30 [1]
##    gridExtra                                       2.3         2017-09-09 [1]
##    gtable                                          0.3.0       2019-03-25 [1]
##    Gviz                                            1.31.12     2020-03-05 [1]
##    HDF5Array                                       1.15.18     2020-04-10 [1]
##    Hmisc                                           4.4-0       2020-03-23 [1]
##    hms                                             0.5.3       2020-01-08 [1]
##    htmlTable                                       1.13.3      2019-12-04 [1]
##    htmltools                                       0.4.0       2019-10-04 [1]
##    htmlwidgets                                     1.5.1       2019-10-08 [1]
##    httpuv                                          1.5.2       2019-09-11 [1]
##    httr                                            1.4.1       2019-08-05 [1]
##    hwriter                                         1.3.2       2014-09-10 [1]
##    IlluminaHumanMethylation450kanno.ilmn12.hg19  * 0.6.0       2020-03-24 [1]
##    IlluminaHumanMethylationEPICanno.ilm10b2.hg19   0.6.0       2020-03-24 [1]
##    IlluminaHumanMethylationEPICanno.ilm10b4.hg19 * 0.6.0       2020-04-09 [1]
##    illuminaio                                      0.29.0      2019-11-06 [1]
##    interactiveDisplayBase                          1.25.0      2019-11-06 [1]
##    IRanges                                       * 2.21.8      2020-03-25 [1]
##    iterators                                     * 1.0.12      2019-07-26 [1]
##    jpeg                                            0.1-8.1     2019-10-24 [1]
##    jsonlite                                        1.6.1       2020-02-02 [1]
##    km.ci                                           0.5-2       2009-08-30 [1]
##    KMsurv                                          0.1-5       2012-12-03 [1]
##    knitr                                           1.28        2020-02-06 [1]
##    labeling                                        0.3         2014-08-23 [1]
##    later                                           1.0.0       2019-10-04 [1]
##    lattice                                         0.20-41     2020-04-02 [1]
##    latticeExtra                                    0.6-29      2019-12-19 [1]
##    lazyeval                                        0.2.2       2019-03-15 [1]
##    lifecycle                                       0.2.0       2020-03-06 [1]
##    limma                                           3.43.8      2020-04-14 [1]
##    lme4                                            1.1-23      2020-04-07 [1]
##    lmerTest                                        3.1-2       2020-04-08 [1]
##    locfit                                        * 1.5-9.4     2020-03-25 [1]
##    LOLA                                          * 1.17.0      2019-11-06 [1]
##    magrittr                                        1.5         2014-11-22 [1]
##    MASS                                            7.3-51.5    2019-12-20 [1]
##    Matrix                                          1.2-18      2019-11-27 [1]
##    matrixStats                                   * 0.56.0      2020-03-13 [1]
##    mclust                                          5.4.6       2020-04-11 [1]
##    memoise                                         1.1.0       2017-04-21 [1]
##  P methTF                                        * 0.1.0       2020-03-24 [?]
##    mgcv                                            1.8-31      2019-11-09 [1]
##    mime                                            0.9         2020-02-04 [1]
##    minfi                                         * 1.33.1      2020-03-05 [1]
##    minqa                                           1.2.4       2014-10-09 [1]
##    missMethyl                                    * 1.21.4      2020-01-28 [1]
##    MultiAssayExperiment                            1.13.21     2020-04-13 [1]
##    multtest                                        2.43.1      2020-03-12 [1]
##    munsell                                         0.5.0       2018-06-12 [1]
##    nlme                                            3.1-147     2020-04-13 [1]
##    nloptr                                          1.2.2.1     2020-03-11 [1]
##    nnet                                            7.3-13      2020-02-25 [1]
##    nor1mix                                         1.3-0       2019-06-13 [1]
##    numDeriv                                        2016.8-1.1  2019-06-06 [1]
##    openssl                                         1.4.1       2019-07-18 [1]
##    org.Hs.eg.db                                    3.10.0      2020-03-30 [1]
##    parsetools                                      0.1.3       2020-04-08 [1]
##    pillar                                          1.4.3       2019-12-20 [1]
##    pkgbuild                                        1.0.6       2019-10-09 [1]
##    pkgcond                                         0.1.0       2018-12-03 [1]
##    pkgconfig                                       2.0.3       2019-09-22 [1]
##    pkgload                                         1.0.2       2018-10-29 [1]
##    plotly                                          4.9.2.1     2020-04-04 [1]
##    plyr                                            1.8.6       2020-03-03 [1]
##    png                                             0.1-7       2013-12-03 [1]
##    postlogic                                       0.1.0.1     2019-12-18 [1]
##    preprocessCore                                  1.49.2      2020-02-01 [1]
##    prettyunits                                     1.1.1       2020-01-24 [1]
##    processx                                        3.4.2       2020-02-09 [1]
##    progress                                        1.2.2       2019-05-16 [1]
##    promises                                        1.1.0       2019-10-04 [1]
##    ProtGenerics                                    1.19.3      2019-12-25 [1]
##    ps                                              1.3.2       2020-02-13 [1]
##    purrr                                           0.3.4       2020-04-17 [1]
##    purrrogress                                     0.1.1       2019-07-22 [1]
##    quadprog                                        1.5-8       2019-11-20 [1]
##    qvalue                                          2.19.0      2019-11-06 [1]
##    R.methodsS3                                     1.8.0       2020-02-14 [1]
##    R.oo                                            1.23.0      2019-11-03 [1]
##    R.utils                                         2.9.2       2019-12-08 [1]
##    R6                                              2.4.1       2019-11-12 [1]
##    rappdirs                                        0.3.1       2016-03-28 [1]
##    RColorBrewer                                    1.1-2       2014-12-07 [1]
##    Rcpp                                            1.0.4.6     2020-04-09 [1]
##    RCurl                                           1.98-1.2    2020-04-18 [1]
##    readr                                           1.3.1       2018-12-21 [1]
##    remotes                                         2.1.1       2020-02-15 [1]
##    reshape                                         0.8.8       2018-10-23 [1]
##    reshape2                                        1.4.4       2020-04-09 [1]
##    rhdf5                                           2.31.10     2020-04-02 [1]
##    Rhdf5lib                                        1.9.3       2020-04-15 [1]
##    rjson                                           0.2.20      2018-06-08 [1]
##    rlang                                           0.4.5.9000  2020-03-20 [1]
##    rmarkdown                                       2.1         2020-01-20 [1]
##    rngtools                                        1.5         2020-01-23 [1]
##    rpart                                           4.1-15      2019-04-12 [1]
##    rprojroot                                       1.3-2       2018-01-03 [1]
##    Rsamtools                                       2.3.7       2020-03-18 [1]
##    RSQLite                                         2.2.0       2020-01-07 [1]
##    rstudioapi                                      0.11        2020-02-07 [1]
##    rtracklayer                                     1.47.0      2019-11-06 [1]
##    rvest                                           0.3.5       2019-11-08 [1]
##    S4Vectors                                     * 0.25.15     2020-04-04 [1]
##    scales                                          1.1.0       2019-11-18 [1]
##    scrime                                          1.3.5       2018-12-01 [1]
##    selectr                                         0.4-2       2019-11-20 [1]
##    sesameData                                      1.5.0       2019-10-31 [1]
##    sessioninfo                                     1.1.1       2018-11-05 [1]
##    shape                                           1.4.4       2018-02-07 [1]
##    shiny                                           1.4.0.2     2020-03-13 [1]
##    ShortRead                                       1.45.4      2020-03-18 [1]
##    siggenes                                        1.61.0      2019-11-06 [1]
##    simpleCache                                     0.4.1       2019-02-26 [1]
##    statmod                                         1.4.34      2020-02-17 [1]
##    stringi                                         1.4.6       2020-02-17 [1]
##    stringr                                         1.4.0       2019-02-10 [1]
##    SummarizedExperiment                          * 1.17.5      2020-03-27 [1]
##    survival                                        3.1-12      2020-04-10 [1]
##    survminer                                       0.4.6       2019-09-03 [1]
##    survMisc                                        0.5.5       2018-07-05 [1]
##    sva                                             3.35.2      2020-03-22 [1]
##    TCGAbiolinks                                    2.15.3      2019-12-17 [1]
##    testextra                                       0.1.0.1     2019-12-18 [1]
##    testthat                                      * 2.3.2       2020-03-02 [1]
##    tibble                                          3.0.1       2020-04-20 [1]
##    tidyr                                           1.0.2       2020-01-24 [1]
##    tidyselect                                      1.0.0       2020-01-27 [1]
##    usethis                                         1.6.0       2020-04-09 [1]
##    VariantAnnotation                               1.33.4      2020-04-09 [1]
##    vctrs                                           0.2.99.9010 2020-04-02 [1]
##    viridisLite                                     0.3.0       2018-02-01 [1]
##    withr                                           2.1.2       2018-03-15 [1]
##    xfun                                            0.13        2020-04-13 [1]
##    XML                                             3.99-0.3    2020-01-20 [1]
##    xml2                                            1.3.1       2020-04-09 [1]
##    xtable                                          1.8-4       2019-04-21 [1]
##    XVector                                       * 0.27.2      2020-03-24 [1]
##    yaml                                            2.2.1       2020-02-01 [1]
##    zlibbioc                                        1.33.1      2020-01-24 [1]
##    zoo                                             1.8-7       2020-01-10 [1]
##  source                                     
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  local                                      
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Github (tidyverse/dplyr@affb977)           
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  Github (Bioconductor/GenomicRanges@70e6e69)
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  local                                      
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  Github (r-lib/rlang@a90b04b)               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  Github (r-lib/vctrs@fd24927)               
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
##  Bioconductor                               
##  CRAN (R 4.0.0)                             
## 
## [1] /Library/Frameworks/R.framework/Versions/4.0/Resources/library
## 
##  P ── Loaded and on-disk path mismatch.
LS0tCnRpdGxlOiAiRW5yaWNobWVudCBhbmFseXNpcyIKYXV0aG9yOiAiIFRpYWdvIEMuIFNpbHZhLCBMYW55dSBaaGFuZywgTGlseSBXYW5nIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBybWFya2Rvd246Omh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogbHVtZW4KICAgIHRvYzogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKICAgIHRvY19kZXB0aDogMwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lICAgIAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSxmaWcud2lkdGggPSAxMCxmaWcuaGVpZ2h0ID0gMTApCmBgYAoKCiMgTWFpbiBsaWJyYXJpZXMgYW5kIGNvbmZpZ3VyYXRpb24KCmBgYHtSLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHMgPSAnaGlkZSd9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoRXhwZXJpbWVudEh1YikKbGlicmFyeShHZW5vbWljUmFuZ2VzKQpsaWJyYXJ5KGNvTWV0aERNUikKbGlicmFyeShnZ3Bsb3QyKQpkZXZ0b29sczo6bG9hZF9hbGwoIn4vRHJvcGJveCAoQkJTUikvUGFuQ2FuY2VyL21ldGhURi8iKQpgYGAKCmBgYHtSfQpkaXIucmVzdWx0IDwtICJtZXRhX2FuYWx5c2lzX3JlZ2lvbl9yZXN1bHRzLyIKZGlyLnJlc3VsdC5tZXRhLmFuYWx5c2lzIDwtIGZpbGUucGF0aChkaXIucmVzdWx0LCAic3RlcDFfbWV0YV9hbmFseXNpcy8iKQpkaXIucmVzdWx0LmNvbXAgPC0gZmlsZS5wYXRoKGRpci5yZXN1bHQsICJzdGVwM19jb21wLyIpCmRpci5yZXN1bHQubG9sYSA8LSBmaWxlLnBhdGgoZGlyLnJlc3VsdCwgInN0ZXA1X2xvbGEvIikKZGlyLnJlc3VsdC5lbnJpY2htZW50IDwtIGZpbGUucGF0aChkaXIucmVzdWx0LCAic3RlcDZfZW5yaWNobWVudC8iKQpkaXIucmVzdWx0LnBhdGh3YXkgPC0gZmlsZS5wYXRoKGRpci5yZXN1bHQsICJzdGVwN19wYXRod2F5LyIpCmZvcihwIGluIGdyZXAoImRpciIsbHMoKSx2YWx1ZSA9IFQpKSBkaXIuY3JlYXRlKGdldChwKSxyZWN1cnNpdmUgPSBUUlVFLHNob3dXYXJuaW5ncyA9IEZBTFNFKQpgYGAKCiMgRW5yaWNobWVudCBhbmFseXNpcwoKIyMgRm9yIHJlZ2lvbnMKCiMjIyAgR2V0IHJlc3VsdHMKCmBgYHtSfQojIyMgQ2FsbCBpbiBkYXRhc2V0cwptZXRhX3NpZyA8LSByZWFkLmNzdihkaXIoZGlyLnJlc3VsdC5jb21wLHBhdHRlcm4gPSAibm8uKmNzdiIsZnVsbC5uYW1lcyA9IFRSVUUpKQptZXRhX3NpZ19wb3NfZXN0IDwtIG1ldGFfc2lnICU+JSBkcGx5cjo6ZmlsdGVyKGVzdGltYXRlID4gMCkKbWV0YV9zaWdfbmVnX2VzdCA8LSBtZXRhX3NpZyAlPiUgZHBseXI6OmZpbHRlcihlc3RpbWF0ZSA8IDApCgptZXRhX2FsbCA8LSByZWFkLmNzdigKICBwYXN0ZTAoZGlyLnJlc3VsdC5tZXRhLmFuYWx5c2lzLCAibWV0YV9hbmFseXNpc19BTExfZGYuY3N2IikKKSAjZGltOiA0MDAxMCA0MQpgYGAKCgojIyMgR2V0IHByb2JlcyBmcm9tIHJlZ2lvbnMKYGBge1J9CnByb2Jlcy5jbHVzdGVyLmFsbCA8LSBjb01ldGhETVI6OmdldFByZWRlZmluZWRDbHVzdGVyKGFycmF5VHlwZSA9ICI0NTBrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlclR5cGUgPSAicmVnaW9ucyIpCgojIyMgZ2V0IGFsbCBjcHMgaW4gbWV0YV9zaWcgaW5wdXQgcmVnaW9ucwppZHggPC0gZ3N1YigKICAiNDUwa19HZW5lXzNfMjAwLnw0NTBrX0ludGVyR2VuZV8zXzIwMC4iLCIiLG5hbWVzKHByb2Jlcy5jbHVzdGVyLmFsbCkKKSAlaW4lIG1ldGFfc2lnX3Bvc19lc3QkaW5wdXRSZWdpb24KCm1ldGFfc2lnX3Byb2Jlc19wb3NfZXN0IDwtIHByb2Jlcy5jbHVzdGVyLmFsbFtpZHhdICU+JQogIHVubGlzdCAlPiUKICBhcy5jaGFyYWN0ZXIoKSAlPiUKICB1bmlxdWUKbGVuZ3RoKG1ldGFfc2lnX3Byb2Jlc19wb3NfZXN0KQoKCmlkeCA8LSBnc3ViKAogICI0NTBrX0dlbmVfM18yMDAufDQ1MGtfSW50ZXJHZW5lXzNfMjAwLiIsIiIsbmFtZXMocHJvYmVzLmNsdXN0ZXIuYWxsKQopICVpbiUgbWV0YV9zaWdfbmVnX2VzdCRpbnB1dFJlZ2lvbgoKbWV0YV9zaWdfbmVnX2VzdCA8LSBwcm9iZXMuY2x1c3Rlci5hbGxbaWR4XSAlPiUKICB1bmxpc3QgJT4lCiAgYXMuY2hhcmFjdGVyKCkgJT4lCiAgdW5pcXVlCmxlbmd0aChtZXRhX3NpZ19uZWdfZXN0KQojIyMgZ2V0IGFsbCBjcHMgaW4gbWV0YV9hbGwgaW5wdXQgcmVnaW9ucwppZHggPC0gZ3N1YigKICAiNDUwa19HZW5lXzNfMjAwLnw0NTBrX0ludGVyR2VuZV8zXzIwMC4iLCIiLG5hbWVzKHByb2Jlcy5jbHVzdGVyLmFsbCkKKSAlaW4lIG1ldGFfYWxsJGlucHV0UmVnaW9uCgptZXRhX2FsbF9wcm9iZXMgPC0gcHJvYmVzLmNsdXN0ZXIuYWxsW2lkeF0gJT4lCiAgdW5saXN0ICU+JQogIGFzLmNoYXJhY3RlcigpICU+JQogIHVuaXF1ZQoKbGVuZ3RoKG1ldGFfYWxsX3Byb2JlcykKYGBgCgojIyMgQW5ub3RhdGlvbgoKYGBge1J9CmFsbC5wbG90LnJlZ2lvbiA8LQogIGNwR3NHZW5vbWljRmVhdHVyZXMoCiAgICBsaXN0KCJFdmFsdWF0ZWQgcHJvYmVzIChuID0gMjAzMTk4KSIgPSBtZXRhX2FsbF9wcm9iZXMsCiAgICAgICAgICJTaWduaWZpY2FudCB3LyBOZWdhdGl2ZSBlc3RpbWF0ZSAobiA9IDE3NykiID0gbWV0YV9zaWdfbmVnX2VzdCwKICAgICAgICAgIlNpZ25pZmljYW50IHcvIFBvc2l0aXZlIGVzdGltYXRlIChuID0gNTY1KSIgPSBtZXRhX3NpZ19wcm9iZXNfcG9zX2VzdCksCiAgKQoKcGxvdC5yZWdpb24uY3BnIDwtIGFsbC5wbG90LnJlZ2lvbiRwbG90ICsgZ2d0aXRsZSgiUmVnaW9uIG1ldGEtYW5hbHlzaXMgcHJvYmVzIikgCmdnc2F2ZShwbG90ID0gcGxvdC5yZWdpb24uY3BnLHdpZHRoID0gOSxmaWxlbmFtZSA9ICJwbG90cy9tZXRhX2FuYWx5c2lzX3JlZ2lvbl9lbnJpY2htZW50LnBkZiIpCnBsb3QucmVnaW9uLmNwZwpgYGAKCmBgYHtSLCBtZXNzYWdlID0gRkFMU0UsIGVjaG8gPSBGQUxTRX0KCnBsb3QuY2hybS5oeXBvIDwtIGNwR3NFbnJpY2htZW50KAogIGZnLnByb2JlcyA9IG1ldGFfc2lnX25lZ19lc3QsCiAgYmcucHJvYmVzID0gbWV0YV9hbGxfcHJvYmVzLAogIGVucmljaG1lbnQudHlwZSA9ICJpc2xhbmQiLAogIGZnLmxhYmVsID0gcGFzdGUwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gTmVnYXRpdmUgZXN0aW1hdGUgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChtZXRhX3NpZ19uZWdfZXN0KSksCiAgYmcubGFiZWwgPSBwYXN0ZTAoIkV2YWx1YXRlZCBwcm9iZXMgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChtZXRhX2FsbF9wcm9iZXMpKSkKCnBsb3QuY2hybS5oeXBlciA8LSBjcEdzRW5yaWNobWVudCgKICBmZy5wcm9iZXMgPSBtZXRhX3NpZ19wcm9iZXNfcG9zX2VzdCwKICBiZy5wcm9iZXMgPSBtZXRhX2FsbF9wcm9iZXMsCiAgZW5yaWNobWVudC50eXBlID0gImlzbGFuZCIsCiAgZmcubGFiZWwgPSBwYXN0ZTAoIlNpZ25pZmljYW50IHByb2JlcyB3LyBQb3NpdGl2ZSBlc3RpbWF0ZSAobiA9ICIsCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKG1ldGFfc2lnX3Bvc19lc3QpKSwKICBiZy5sYWJlbCA9IHBhc3RlMCgiRXZhbHVhdGVkIHByb2JlcyAobiA9ICIsCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKG1ldGFfYWxsX3Byb2JlcykpKQoKdGFiLmlzbGFuZCA8LSBjYmluZCgKICAgZGF0YS5mcmFtZSgKICAgICJNZXRhLUFuYWx5c2lzIiA9IGMoCiAgICAgIHJlcCgiUmVnaW9uIixucm93KHBsb3QuY2hybS5oeXBlciR0YWJsZSkgKyBucm93KHBsb3QuY2hybS5oeXBvJHRhYmxlKSkKICAgICksCiAgICAiRm9yZWdyb3VuZCBwcm9iZXMiID0gYygKICAgICAgcmVwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gUG9zaXRpdmUgZXN0aW1hdGUiLG5yb3cocGxvdC5jaHJtLmh5cGVyJHRhYmxlKSksCiAgICAgIHJlcCgiU2lnbmlmaWNhbnQgcHJvYmVzIHcvIE5lZ2F0aXZlIGVzdGltYXRlIixucm93KHBsb3QuY2hybS5oeXBvJHRhYmxlKSkKICAgICksCiAgICAiRW5yaWNobWVudCBhbmFseXNpcyIgPSBjKAogICAgICByZXAoIlJlbGF0aW9uX3RvX0lzbGFuZCIsbnJvdyhwbG90LmNocm0uaHlwZXIkdGFibGUpICsgbnJvdyhwbG90LmNocm0uaHlwbyR0YWJsZSkpCiAgICApCiAgKSwKICByYmluZChwbG90LmNocm0uaHlwZXIkdGFibGVbLGMoMSw2LDcpXSwKICAgICAgICBwbG90LmNocm0uaHlwbyR0YWJsZVssYygxLDYsNyldKQopCnRhYi5pc2xhbmQKYGBgCgoKYGBge1IsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IEZBTFNFfQoKcGxvdC5jaHJtLmh5cG8gPC0gY3BHc0VucmljaG1lbnQoCiAgZmcucHJvYmVzID0gbWV0YV9zaWdfbmVnX2VzdCwKICBiZy5wcm9iZXMgPSBtZXRhX2FsbF9wcm9iZXMsCiAgZW5yaWNobWVudC50eXBlID0gImdlbmUiLAogIGZnLmxhYmVsID0gcGFzdGUwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gTmVnYXRpdmUgZXN0aW1hdGUgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChtZXRhX3NpZ19uZWdfZXN0KSksCiAgYmcubGFiZWwgPSBwYXN0ZTAoIkV2YWx1YXRlZCBwcm9iZXMgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChtZXRhX2FsbF9wcm9iZXMpKSkKCnBsb3QuY2hybS5oeXBlciA8LSBjcEdzRW5yaWNobWVudCgKICBmZy5wcm9iZXMgPSBtZXRhX3NpZ19wcm9iZXNfcG9zX2VzdCwKICBiZy5wcm9iZXMgPSBtZXRhX2FsbF9wcm9iZXMsCiAgZW5yaWNobWVudC50eXBlID0gImdlbmUiLAogIGZnLmxhYmVsID0gcGFzdGUwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gUG9zaXRpdmUgZXN0aW1hdGUgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChtZXRhX3NpZ19wb3NfZXN0KSksCiAgYmcubGFiZWwgPSBwYXN0ZTAoIkV2YWx1YXRlZCBwcm9iZXMgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChtZXRhX2FsbF9wcm9iZXMpKSkKCgoKdGFiLmdlbmUgPC0gY2JpbmQoCiBkYXRhLmZyYW1lKAogICAgIk1ldGEtQW5hbHlzaXMiID0gYygKICAgICAgcmVwKCJSZWdpb24iLG5yb3cocGxvdC5jaHJtLmh5cGVyJHRhYmxlKSArIG5yb3cocGxvdC5jaHJtLmh5cG8kdGFibGUpKQogICAgKSwKICAgICJGb3JlZ3JvdW5kIHByb2JlcyIgPSBjKAogICAgICByZXAoIlNpZ25pZmljYW50IHByb2JlcyB3LyBQb3NpdGl2ZSBlc3RpbWF0ZSIsbnJvdyhwbG90LmNocm0uaHlwZXIkdGFibGUpKSwKICAgICAgcmVwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gTmVnYXRpdmUgZXN0aW1hdGUiLG5yb3cocGxvdC5jaHJtLmh5cG8kdGFibGUpKQogICAgKSwKICAgICJFbnJpY2htZW50IGFuYWx5c2lzIiA9IGMoCiAgICAgIHJlcCgiVUNTQ19SZWZHZW5lX0dyb3VwX2hpZXJhcmNoeSIsbnJvdyhwbG90LmNocm0uaHlwZXIkdGFibGUpICsgbnJvdyhwbG90LmNocm0uaHlwbyR0YWJsZSkpCiAgICApCiAgKSwKICByYmluZChwbG90LmNocm0uaHlwZXIkdGFibGVbLGMoMSw2LDcpXSwKICAgICAgICBwbG90LmNocm0uaHlwbyR0YWJsZVssYygxLDYsNyldKQopCnRhYi5nZW5lCmBgYAoKIyMjIENocm9NSE1NCmBgYHtSfQpmaWxlIDwtIHBhc3RlMCgiaHR0cHM6Ly9lZ2cyLnd1c3RsLmVkdS9yb2FkbWFwL2RhdGEvYnlGaWxlVHlwZS9jaHJvbWhtbVNlZ21lbnRhdGlvbnMiLAogICAgICAgICAgICAgICAiL0NobW1Nb2RlbHMvY29yZU1hcmtzL2pvaW50TW9kZWwvZmluYWwvRTA3M18xNV9jb3JlTWFya3Nfc2VnbWVudHMuYmVkIikKQ2htbU1vZGVscyA8LSByZWFkcjo6cmVhZF90c3YoZmlsZSxjb2xfbmFtZXMgPSBGQUxTRSwgY29sX3R5cGVzID0gcmVhZHI6OmNvbHMoKSkKY29sbmFtZXMoQ2htbU1vZGVscykgPC0gYygiY2hyIiwic3RhcnQiLCJlbmQiLCJzdGF0ZSIpCnN0YXRlcyA8LSByZWFkcjo6cmVhZF9jc3YoIi4uLy4uL0ROQW1fUk5BL2RhdGEvY2hyb21ITU1fbGFiZWxzLmNzdiIsY29sX25hbWVzID0gRkFMU0UsLCBjb2xfdHlwZXMgPSByZWFkcjo6Y29scygpKQpzdGF0ZXMkWDEgPC0gcGFzdGUwKCJFIixzdGF0ZXMkWDEpCkNobW1Nb2RlbHMkc3RhdGUgPC0gc3RhdGVzJFgzW21hdGNoKENobW1Nb2RlbHMkc3RhdGUsc3RhdGVzJFgxKV0KQ2htbU1vZGVscy5nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoQ2htbU1vZGVscyxrZWVwLmV4dHJhLmNvbHVtbnMgPSBUUlVFKQpgYGAKCgpgYGB7UiwgaW5jbHVkZSA9IEZBTFNFfQpwbG90LmNocm0uaHlwbyA8LSBjcEdzRW5yaWNobWVudCgKICBmZy5wcm9iZXMgPSBtZXRhX3NpZ19uZWdfZXN0LAogIGJnLnByb2JlcyA9IG1ldGFfYWxsX3Byb2JlcywKICBhbm5vdGF0aW9uLmdyID0gQ2htbU1vZGVscy5nciwKICBmZy5sYWJlbCA9IHBhc3RlMCgiU2lnbmlmaWNhbnQgcHJvYmVzIHcvIE5lZ2F0aXZlIGVzdGltYXRlIChuID0gIiwKICAgICAgICAgICAgICAgICAgICBsZW5ndGgobWV0YV9zaWdfbmVnX2VzdCksIikiKSwKICBiZy5sYWJlbCA9IHBhc3RlMCgiRXZhbHVhdGVkIHByb2JlcyAobiA9ICIsCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKG1ldGFfYWxsX3Byb2JlcyksIikiKSwKICBlbnJpY2htZW50LnR5cGUgPSAiY3VzdG9taXplZCIsCiAgcGxvdC5maWxlbmFtZSA9ICJwbG90cy9tZXRhX2FuYWx5c2lzX3JlZ2lvbl9uZWdfZXN0aW1hdGVfY2hyb21ITU1fc3RhdGVzLnBuZyIKKQojcGxvdC5jaHJtLmh5cG8kcGxvdAoKcGxvdC5jaHJtLmh5cGVyIDwtIGNwR3NFbnJpY2htZW50KAogIGZnLnByb2JlcyA9IG1ldGFfc2lnX3Byb2Jlc19wb3NfZXN0LAogIGJnLnByb2JlcyA9IG1ldGFfYWxsX3Byb2JlcywKICBhbm5vdGF0aW9uLmdyID0gQ2htbU1vZGVscy5nciwKICBmZy5sYWJlbCA9IHBhc3RlMCgiU2lnbmlmaWNhbnQgcHJvYmVzIHcvIFBvc2l0aXZlIGVzdGltYXRlIChuID0gIiwKICAgICAgICAgICAgICAgICAgICBsZW5ndGgobWV0YV9zaWdfcHJvYmVzX3Bvc19lc3QpLCIpIiksCiAgYmcubGFiZWwgPSBwYXN0ZTAoIkV2YWx1YXRlZCBwcm9iZXMgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChtZXRhX2FsbF9wcm9iZXMpLCIpIiksCiAgZW5yaWNobWVudC50eXBlID0gImN1c3RvbWl6ZWQiLAogIHBsb3QuZmlsZW5hbWUgPSAicGxvdHMvbWV0YV9hbmFseXNpc19yZWdpb25fcG9zX2VzdF9jaHJvbUhNTV9zdGF0ZXMucG5nIgopCiNwbG90LmNocm0uaHlwZXIkcGxvdApgYGAKCmBgYHtSfQpyZWdpb24uY3BnLnBsb3QgPC0KICBjcEdzR2Vub21pY0ZlYXR1cmVzKAogICAgbGlzdCgiRXZhbHVhdGVkIHByb2JlcyAobiA9IDIwMzE5OCkiID0gbWV0YV9hbGxfcHJvYmVzLAogICAgICAgICAiU2lnbmlmaWNhbnQgdy8gTmVnYXRpdmUgZXN0aW1hdGUgKG4gPSAxNzcpIiA9IG1ldGFfc2lnX25lZ19lc3QsCiAgICAgICAgICJTaWduaWZpY2FudCB3LyBQb3NpdGl2ZSBlc3RpbWF0ZSAobiA9ICA1NjUpIiA9IG1ldGFfc2lnX3Byb2Jlc19wb3NfZXN0KSwKICAgIGFubm90YXRpb24uZ3IgPSBDaG1tTW9kZWxzLmdyLAogICAgcGxvdC53aWR0aCA9IDEyLAogICAgcGxvdC50aXRsZSA9ICJSZWdpb24gbWV0YS1hbmFseXNpcyBwcm9iZXNcbkNocm9NSE1NOiBFMDczIC0gMTUgY29yZU1hcmtzIHNlZ21lbnRzIiwKICAgIGVucmljaG1lbnQudHlwZSA9ICJjdXN0b21pemVkIiwKICAgIHBsb3QuZmlsZW5hbWUgPSAicGxvdHMvbWV0YV9hbmFseXNpc19yZWdpb25fY2hyb21ITU1fc3RhdGVzLnBkZiIsCiAgKQpyZWdpb24uY3BnLnBsb3QkcGxvdApgYGAKCmBgYHtSfQoKdGFiLmNocm0gPC0gY2JpbmQoCiAgZGF0YS5mcmFtZSgKICAgICJNZXRhLUFuYWx5c2lzIiA9IGMoCiAgICAgIHJlcCgiUmVnaW9uIixucm93KHBsb3QuY2hybS5oeXBlciR0YWJsZSkgKyBucm93KHBsb3QuY2hybS5oeXBvJHRhYmxlKSkKICAgICksCiAgICAiRm9yZWdyb3VuZCBwcm9iZXMiID0gYygKICAgICAgcmVwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gUG9zaXRpdmUgZXN0aW1hdGUiLG5yb3cocGxvdC5jaHJtLmh5cGVyJHRhYmxlKSksCiAgICAgIHJlcCgiU2lnbmlmaWNhbnQgcHJvYmVzIHcvIE5lZ2F0aXZlIGVzdGltYXRlIixucm93KHBsb3QuY2hybS5oeXBvJHRhYmxlKSkKICAgICksCiAgICAiRW5yaWNobWVudCBhbmFseXNpcyIgPSBjKAogICAgICByZXAoIkNocm9NSE1NOiBFMDczIixucm93KHBsb3QuY2hybS5oeXBlciR0YWJsZSkgKyBucm93KHBsb3QuY2hybS5oeXBvJHRhYmxlKSkKICAgICkKICApLAogIHJiaW5kKHBsb3QuY2hybS5oeXBlciR0YWJsZVssYygxLDYsNyldLAogICAgICAgIHBsb3QuY2hybS5oeXBvJHRhYmxlWyxjKDEsNiw3KV0pCikKdGFiLmNocm0KYGBgCgpgYGB7UiBpbmNsdWRlID0gRkFMU0V9CmNvbG5hbWVzKHRhYi5nZW5lKVs0XSA8LSBjb2xuYW1lcyh0YWIuY2hybSlbNF0gPC0gY29sbmFtZXModGFiLmlzbGFuZClbNF0gIDwtICJWYXJpYWJsZSIKdGFiLmFsbC5yZWdpb24gPC0gdGFiLmdlbmUgJT4lIHJiaW5kKHRhYi5pc2xhbmQpICU+JSByYmluZCh0YWIuY2hybSkKYGBgCgojIyBGb3Igc2luZ2xlIGNwZ3MKCiMjIyAgR2V0IHJlc3VsdHMKCmBgYHtSfQojIyMgRm9yZWdyb3VuZApzaW5nbGUuY3BnLnJlc3VsdHMgPC0gcmVhZHI6OnJlYWRfY3N2KAogICJtZXRhX2FuYWx5c2lzX3NpbmdsZV9jcGdfcmVzdWx0cy9tZXRhX2FuYWx5c2lzX3NpbmdsZV9jcGdfZGYuY3N2IiwKICBjb2xfdHlwZXMgPSByZWFkcjo6Y29scygpCikKc2luZ2xlLmNwZy5zaWcucmVzdWx0cyA8LSByZWFkcjo6cmVhZF9jc3YoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAibWV0YV9hbmFseXNpc19zaW5nbGVfY3BnX3Jlc3VsdHMvbWV0YV9hbmFseXNpc19zaW5nbGVfY3BnX3NpZ19ub19jcm9zc0h5Yl9zbW9raW5nX2RmLmNzdiIsCiAgY29sX3R5cGVzID0gcmVhZHI6OmNvbHMoKQopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKZm9yZWdyb3VuZC5wcm9iZXMgPC0gc2luZ2xlLmNwZy5zaWcucmVzdWx0cyAlPiUgcHVsbChjcGcpICU+JSBhcy5jaGFyYWN0ZXIKZm9yZWdyb3VuZC5wcm9iZXMubmVnLmVzdCA8LSBzaW5nbGUuY3BnLnNpZy5yZXN1bHRzICU+JSBmaWx0ZXIoZXN0aW1hdGUgPCAwKSAlPiUgcHVsbChjcGcpICU+JSBhcy5jaGFyYWN0ZXIKZm9yZWdyb3VuZC5wcm9iZXMucG9zLmVzdCA8LSBzaW5nbGUuY3BnLnNpZy5yZXN1bHRzICAlPiUgZmlsdGVyKGVzdGltYXRlID4gMCkgJT4lIHB1bGwoY3BnKSAlPiUgYXMuY2hhcmFjdGVyCmxlbmd0aChmb3JlZ3JvdW5kLnByb2JlcykKCiMjIyBCYWNrZ3JvdW5kCmJhY2tncm91bmQucHJvYmVzIDwtIHNpbmdsZS5jcGcucmVzdWx0cyAgJT4lIHB1bGwoY3BnKSAlPiUgYXMuY2hhcmFjdGVyIApsZW5ndGgoYmFja2dyb3VuZC5wcm9iZXMpCmBgYAoKCiMjIyBBbm5vdGF0aW9uCmBgYHtSfQphbGwucGxvdCA8LQogIGNwR3NHZW5vbWljRmVhdHVyZXMoCiAgICBsaXN0KCJFdmFsdWF0ZWQgcHJvYmVzIChuID0gNDUwNzkzKSIgPSBiYWNrZ3JvdW5kLnByb2JlcywKICAgICAgICAgIlNpZ25pZmljYW50IHcvIE5lZ2F0aXZlIGVzdGltYXRlIChuID0gMTU1MikiID0gZm9yZWdyb3VuZC5wcm9iZXMubmVnLmVzdCwKICAgICAgICAgIlNpZ25pZmljYW50IHcvIFBvc2l0aXZlIGVzdGltYXRlIChuID0gMjE5OSkiID0gZm9yZWdyb3VuZC5wcm9iZXMucG9zLmVzdCksCiAgKQpwbG90LnNpbmdsZS5jcGcgPC0gYWxsLnBsb3QkcGxvdCArIGdndGl0bGUoIlNpbmdsZSBjcGcgbWV0YS1hbmFseXNpcyBwcm9iZXMiKSAKcGxvdC5zaW5nbGUuY3BnCmdnc2F2ZShwbG90ID0gcGxvdC5zaW5nbGUuY3BnLHdpZHRoID0gOSxmaWxlbmFtZSA9ICJwbG90cy9tZXRhX2FuYWx5c2lzX3NpbmdsZV9jcGdfZW5yaWNobWVudC5wZGYiKQpgYGAKCgpgYGB7UiwgbWVzc2FnZSA9IEZBTFNFLCBlY2hvID0gRkFMU0V9CnBsb3QuY2hybS5oeXBvIDwtIGNwR3NFbnJpY2htZW50KAogIGZnLnByb2JlcyA9IGZvcmVncm91bmQucHJvYmVzLm5lZy5lc3QsCiAgYmcucHJvYmVzID0gYmFja2dyb3VuZC5wcm9iZXMsCiAgZW5yaWNobWVudC50eXBlID0gImlzbGFuZCIsCiAgZmcubGFiZWwgPSBwYXN0ZTAoIlNpZ25pZmljYW50IHByb2JlcyB3LyBOZWdhdGl2ZSBlc3RpbWF0ZSAobiA9ICIsCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKGZvcmVncm91bmQucHJvYmVzLm5lZy5lc3QpKSwKICBiZy5sYWJlbCA9IHBhc3RlMCgiRXZhbHVhdGVkIHByb2JlcyAobiA9ICIsCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKGJhY2tncm91bmQucHJvYmVzKSkKICApCgpwbG90LmNocm0uaHlwZXIgPC0gY3BHc0VucmljaG1lbnQoCiAgZmcucHJvYmVzID0gZm9yZWdyb3VuZC5wcm9iZXMucG9zLmVzdCwKICBiZy5wcm9iZXMgPSBiYWNrZ3JvdW5kLnByb2JlcywKICBlbnJpY2htZW50LnR5cGUgPSAiaXNsYW5kIiwKICBmZy5sYWJlbCA9IHBhc3RlMCgiU2lnbmlmaWNhbnQgcHJvYmVzIHcvIFBvc2l0aXZlIGVzdGltYXRlIChuID0gIiwKICAgICAgICAgICAgICAgICAgICBsZW5ndGgoZm9yZWdyb3VuZC5wcm9iZXMucG9zLmVzdCkpLAogIGJnLmxhYmVsID0gcGFzdGUwKCJFdmFsdWF0ZWQgcHJvYmVzIChuID0gIiwKICAgICAgICAgICAgICAgICAgICBsZW5ndGgoYmFja2dyb3VuZC5wcm9iZXMpKQogICkKCnRhYi5pc2xhbmQgPC0gY2JpbmQoCiAgIGRhdGEuZnJhbWUoCiAgICAiTWV0YS1BbmFseXNpcyIgPSBjKAogICAgICByZXAoIlNpbmdsZSBDcEciLG5yb3cocGxvdC5jaHJtLmh5cGVyJHRhYmxlKSArIG5yb3cocGxvdC5jaHJtLmh5cG8kdGFibGUpKQogICAgKSwKICAgICJGb3JlZ3JvdW5kIHByb2JlcyIgPSBjKAogICAgICByZXAoIlNpZ25pZmljYW50IHByb2JlcyB3LyBQb3NpdGl2ZSBlc3RpbWF0ZSIsbnJvdyhwbG90LmNocm0uaHlwZXIkdGFibGUpKSwKICAgICAgcmVwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gTmVnYXRpdmUgZXN0aW1hdGUiLG5yb3cocGxvdC5jaHJtLmh5cG8kdGFibGUpKQogICAgKSwKICAgICJFbnJpY2htZW50IGFuYWx5c2lzIiA9IGMoCiAgICAgIHJlcCgiUmVsYXRpb25fdG9fSXNsYW5kIixucm93KHBsb3QuY2hybS5oeXBlciR0YWJsZSkgKyBucm93KHBsb3QuY2hybS5oeXBvJHRhYmxlKSkKICAgICkKICApLAogIHJiaW5kKHBsb3QuY2hybS5oeXBlciR0YWJsZVssYygxLDYsNyldLAogICAgICAgIHBsb3QuY2hybS5oeXBvJHRhYmxlWyxjKDEsNiw3KV0pCikKdGFiLmlzbGFuZApgYGAKCgpgYGB7UiwgbWVzc2FnZSA9IEZBTFNFLCBlY2hvID0gRkFMU0V9CnBsb3QuY2hybS5oeXBvIDwtIGNwR3NFbnJpY2htZW50KAogIGZnLnByb2JlcyA9IGZvcmVncm91bmQucHJvYmVzLm5lZy5lc3QsCiAgYmcucHJvYmVzID0gYmFja2dyb3VuZC5wcm9iZXMsCiAgZW5yaWNobWVudC50eXBlID0gImdlbmUiLAogIGZnLmxhYmVsID0gcGFzdGUwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gTmVnYXRpdmUgZXN0aW1hdGUgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChmb3JlZ3JvdW5kLnByb2Jlcy5uZWcuZXN0KSksCiAgYmcubGFiZWwgPSBwYXN0ZTAoIkV2YWx1YXRlZCBwcm9iZXMgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChiYWNrZ3JvdW5kLnByb2JlcykpKQoKcGxvdC5jaHJtLmh5cGVyIDwtIGNwR3NFbnJpY2htZW50KAogIGZnLnByb2JlcyA9IGZvcmVncm91bmQucHJvYmVzLnBvcy5lc3QsCiAgYmcucHJvYmVzID0gYmFja2dyb3VuZC5wcm9iZXMsCiAgZW5yaWNobWVudC50eXBlID0gImdlbmUiLAogIGZnLmxhYmVsID0gcGFzdGUwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gUG9zaXRpdmUgZXN0aW1hdGUgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChmb3JlZ3JvdW5kLnByb2Jlcy5wb3MuZXN0KSksCiAgYmcubGFiZWwgPSBwYXN0ZTAoIkV2YWx1YXRlZCBwcm9iZXMgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChiYWNrZ3JvdW5kLnByb2JlcykpKQoKdGFiLmdlbmUgPC0gY2JpbmQoCiBkYXRhLmZyYW1lKAogICAgIk1ldGEtQW5hbHlzaXMiID0gYygKICAgICAgcmVwKCJTaW5nbGUgQ3BHIixucm93KHBsb3QuY2hybS5oeXBlciR0YWJsZSkgKyBucm93KHBsb3QuY2hybS5oeXBvJHRhYmxlKSkKICAgICksCiAgICAiRm9yZWdyb3VuZCBwcm9iZXMiID0gYygKICAgICAgcmVwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gUG9zaXRpdmUgZXN0aW1hdGUiLG5yb3cocGxvdC5jaHJtLmh5cGVyJHRhYmxlKSksCiAgICAgIHJlcCgiU2lnbmlmaWNhbnQgcHJvYmVzIHcvIE5lZ2F0aXZlIGVzdGltYXRlIixucm93KHBsb3QuY2hybS5oeXBvJHRhYmxlKSkKICAgICksCiAgICAiRW5yaWNobWVudCBhbmFseXNpcyIgPSBjKAogICAgICByZXAoIlVDU0NfUmVmR2VuZV9Hcm91cF9oaWVyYXJjaHkiLG5yb3cocGxvdC5jaHJtLmh5cGVyJHRhYmxlKSArIG5yb3cocGxvdC5jaHJtLmh5cG8kdGFibGUpKQogICAgKQogICksCiAgcmJpbmQocGxvdC5jaHJtLmh5cGVyJHRhYmxlWyxjKDEsNiw3KV0sCiAgICAgICAgcGxvdC5jaHJtLmh5cG8kdGFibGVbLGMoMSw2LDcpXSkKKQp0YWIuZ2VuZQpgYGAKCgojIyMgQ2hyb01ITU0KYGBge1J9CmZpbGUgPC0gcGFzdGUwKCJodHRwczovL2VnZzIud3VzdGwuZWR1L3JvYWRtYXAvZGF0YS9ieUZpbGVUeXBlL2Nocm9taG1tU2VnbWVudGF0aW9ucyIsCiAgICAgICAgICAgICAgICIvQ2htbU1vZGVscy9jb3JlTWFya3Mvam9pbnRNb2RlbC9maW5hbC9FMDczXzE1X2NvcmVNYXJrc19zZWdtZW50cy5iZWQiKQpDaG1tTW9kZWxzIDwtIHJlYWRyOjpyZWFkX3RzdigKICBmaWxlLAogIGNvbF9uYW1lcyA9IEZBTFNFLAogIGNvbF90eXBlcyA9IHJlYWRyOjpjb2xzKCkKKQpjb2xuYW1lcyhDaG1tTW9kZWxzKSA8LSBjKCJjaHIiLCJzdGFydCIsImVuZCIsInN0YXRlIikKc3RhdGVzIDwtIHJlYWRyOjpyZWFkX2NzdigKICAiLi4vLi4vRE5BbV9STkEvZGF0YS9jaHJvbUhNTV9sYWJlbHMuY3N2IiwKICBjb2xfbmFtZXMgPSBGQUxTRSwKICBjb2xfdHlwZXMgPSByZWFkcjo6Y29scygpCikKc3RhdGVzJFgxIDwtIHBhc3RlMCgiRSIsc3RhdGVzJFgxKQpDaG1tTW9kZWxzJHN0YXRlIDwtIHN0YXRlcyRYM1ttYXRjaChDaG1tTW9kZWxzJHN0YXRlLHN0YXRlcyRYMSldCkNobW1Nb2RlbHMuZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKENobW1Nb2RlbHMsa2VlcC5leHRyYS5jb2x1bW5zID0gVFJVRSkKYGBgCgpgYGB7UiwgaW5jbHVkZSA9IEZBTFNFfQpwbG90LmNocm0uaHlwbyA8LSBjcEdzRW5yaWNobWVudCgKICBmZy5wcm9iZXMgPSBmb3JlZ3JvdW5kLnByb2Jlcy5uZWcuZXN0LAogIGJnLnByb2JlcyA9IGJhY2tncm91bmQucHJvYmVzLAogIGFubm90YXRpb24uZ3IgPSBDaG1tTW9kZWxzLmdyLAogIGZnLmxhYmVsID0gcGFzdGUwKCJTaWduaWZpY2FudCBwcm9iZXMgdy8gTmVnYXRpdmUgZXN0aW1hdGUgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChmb3JlZ3JvdW5kLnByb2Jlcy5uZWcuZXN0KSwiKSIpLAogIGJnLmxhYmVsID0gcGFzdGUwKCJFdmFsdWF0ZWQgcHJvYmVzIChuID0gIiwKICAgICAgICAgICAgICAgICAgICBsZW5ndGgoYmFja2dyb3VuZC5wcm9iZXMpLCIpIiksCiAgZW5yaWNobWVudC50eXBlID0gImN1c3RvbWl6ZWQiLAogIHBsb3QuZmlsZW5hbWUgPSAicGxvdHMvbWV0YV9hbmFseXNpc19zaW5nbGVfY3BnX25lZ19lc3RpbWF0ZV9jaHJvbUhNTV9zdGF0ZXMucG5nIgopCgojcGxvdC5jaHJtLmh5cG8kcGxvdAoKcGxvdC5jaHJtLmh5cGVyIDwtIGNwR3NFbnJpY2htZW50KAogIGZnLnByb2JlcyA9IGZvcmVncm91bmQucHJvYmVzLnBvcy5lc3QsCiAgYmcucHJvYmVzID0gYmFja2dyb3VuZC5wcm9iZXMsCiAgYW5ub3RhdGlvbi5nciA9IENobW1Nb2RlbHMuZ3IsCiAgZmcubGFiZWwgPSBwYXN0ZTAoIlNpZ25pZmljYW50IHByb2JlcyB3LyBQb3NpdGl2ZSBlc3RpbWF0ZSAobiA9ICIsCiAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKGZvcmVncm91bmQucHJvYmVzLnBvcy5lc3QpLCIpIiksCiAgYmcubGFiZWwgPSBwYXN0ZTAoIkV2YWx1YXRlZCBwcm9iZXMgKG4gPSAiLAogICAgICAgICAgICAgICAgICAgIGxlbmd0aChiYWNrZ3JvdW5kLnByb2JlcyksIikiKSwKICBlbnJpY2htZW50LnR5cGUgPSAiY3VzdG9taXplZCIsCiAgcGxvdC5maWxlbmFtZSA9ICJwbG90cy9tZXRhX2FuYWx5c2lzX3NpbmdsZV9jcGdfcG9zX2VzdF9jaHJvbUhNTV9zdGF0ZXMucG5nIikKI3Bsb3QuY2hybS5oeXBlciRwbG90CmBgYAoKYGBge1J9CnNpbmdsZS5jcGcucGxvdCA8LSBjcEdzR2Vub21pY0ZlYXR1cmVzKAogIGxpc3QoIkV2YWx1YXRlZCBwcm9iZXMgKG4gPSA0NTA3OTMpIiA9IGJhY2tncm91bmQucHJvYmVzLAogICAgICAgIlNpZ25pZmljYW50IHcvIE5lZ2F0aXZlIGVzdGltYXRlIChuID0gMTU1MikiID0gZm9yZWdyb3VuZC5wcm9iZXMubmVnLmVzdCwKICAgICAgICJTaWduaWZpY2FudCB3LyBQb3NpdGl2ZSBlc3RpbWF0ZSAobiA9ICAyMTk5KSIgPSBmb3JlZ3JvdW5kLnByb2Jlcy5wb3MuZXN0KSwKICBhbm5vdGF0aW9uLmdyID0gQ2htbU1vZGVscy5nciwKICBwbG90LndpZHRoID0gMTIsCiAgcGxvdC50aXRsZSA9ICJTaW5nbGUgY3BnIG1ldGEtYW5hbHlzaXMgcHJvYmVzXG5DaHJvTUhNTTogRTA3MyAtIDE1IGNvcmVNYXJrcyBzZWdtZW50cyIsCiAgZW5yaWNobWVudC50eXBlID0gImN1c3RvbWl6ZWQiLAogIHBsb3QuZmlsZW5hbWUgPSAicGxvdHMvbWV0YV9hbmFseXNpc19zaW5nbGVfY3BnX2Nocm9tSE1NX3N0YXRlcy5wZGYiLAopCnNpbmdsZS5jcGcucGxvdCRwbG90CmBgYAoKCmBgYHtSfQoKdGFiLmNocm0gPC0gY2JpbmQoCiAgZGF0YS5mcmFtZSgKICAgICJNZXRhLUFuYWx5c2lzIiA9IGMoCiAgICAgIHJlcCgiU2luZ2xlIENwRyIsbnJvdyhwbG90LmNocm0uaHlwZXIkdGFibGUpICsgbnJvdyhwbG90LmNocm0uaHlwbyR0YWJsZSkpCiAgICApLAogICAgIkZvcmVncm91bmQgcHJvYmVzIiA9IGMoCiAgICAgIHJlcCgiU2lnbmlmaWNhbnQgcHJvYmVzIHcvIFBvc2l0aXZlIGVzdGltYXRlIixucm93KHBsb3QuY2hybS5oeXBlciR0YWJsZSkpLAogICAgICByZXAoIlNpZ25pZmljYW50IHByb2JlcyB3LyBOZWdhdGl2ZSBlc3RpbWF0ZSIsbnJvdyhwbG90LmNocm0uaHlwbyR0YWJsZSkpCiAgICApLAogICAgIkVucmljaG1lbnQgYW5hbHlzaXMiID0gYygKICAgICAgcmVwKCJDaHJvTUhNTTogRTA3MyIsbnJvdyhwbG90LmNocm0uaHlwZXIkdGFibGUpICsgbnJvdyhwbG90LmNocm0uaHlwbyR0YWJsZSkpCiAgICApCiAgKSwKICByYmluZChwbG90LmNocm0uaHlwZXIkdGFibGVbLGMoMSw2LDcpXSwKICAgICAgICBwbG90LmNocm0uaHlwbyR0YWJsZVssYygxLDYsNyldKQopCnRhYi5jaHJtCmBgYAoKCmBgYHtSIGluY2x1ZGUgPSBGQUxTRX0KY29sbmFtZXModGFiLmdlbmUpWzRdIDwtIGNvbG5hbWVzKHRhYi5jaHJtKVs0XSA8LSBjb2xuYW1lcyh0YWIuaXNsYW5kKVs0XSAgPC0gIlZhcmlhYmxlIgp0YWIuYWxsLmNwZyA8LSB0YWIuZ2VuZSAlPiUgcmJpbmQodGFiLmlzbGFuZCkgJT4lIHJiaW5kKHRhYi5jaHJtKQpjb2xuYW1lcyh0YWIuYWxsLmNwZylbNTo2XSA8LSBwYXN0ZTAoImNwZ18iLGNvbG5hbWVzKHRhYi5hbGwuY3BnKVs1OjZdKQpjb2xuYW1lcyh0YWIuYWxsLnJlZ2lvbilbNTo2XSA8LSBwYXN0ZTAoImRtcl8iLGNvbG5hbWVzKHRhYi5hbGwuY3BnKVs1OjZdKQp0YWIuYWxsIDwtIG1lcmdlKHRhYi5hbGwucmVnaW9uWywtMV0sdGFiLmFsbC5jcGdbLC0xXSkKcmVhZHI6OndyaXRlX2Nzdih0YWIuYWxsLHBhdGggPSAiRW5yaWNobWVudF9hbmFseXNpc19PUl9wdmFsdWUuY3N2IikKYGBgCgoKIyBQYXRod2F5IGFuYWx5c2lzIAoKIyMgRm9yIHJlZ2lvbnMgKyBzaW5nbGUgY3BncwoKIyMjIEdldCBwcm9iZXMKCiMjIyBHZXQgcHJvYmVzIGZyb20gcmVnaW9ucwpgYGB7Un0KIyMjIENhbGwgaW4gZGF0YXNldHMKbWV0YV9zaWcgPC0gcmVhZC5jc3YoZGlyKGRpci5yZXN1bHQuY29tcCxwYXR0ZXJuID0gIm5vLipjc3YiLGZ1bGwubmFtZXMgPSBUUlVFKSkKCm1ldGFfYWxsIDwtIHJlYWQuY3N2KAogIHBhc3RlMChkaXIucmVzdWx0Lm1ldGEuYW5hbHlzaXMsICJtZXRhX2FuYWx5c2lzX0FMTF9kZi5jc3YiKQopICNkaW06IDQwMDEwIDQxCmBgYAoKYGBge1J9CnByb2Jlcy5jbHVzdGVyLmFsbCA8LSBjb01ldGhETVI6OmdldFByZWRlZmluZWRDbHVzdGVyKGFycmF5VHlwZSA9ICI0NTBrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlclR5cGUgPSAicmVnaW9ucyIpCgojIyMgZ2V0IGFsbCBjcHMgaW4gbWV0YV9zaWcgaW5wdXQgcmVnaW9ucwppZHggPC0gZ3N1YigKICAiNDUwa19HZW5lXzNfMjAwLnw0NTBrX0ludGVyR2VuZV8zXzIwMC4iLCIiLG5hbWVzKHByb2Jlcy5jbHVzdGVyLmFsbCkKKSAlaW4lIG1ldGFfc2lnJGlucHV0UmVnaW9uCgptZXRhX3NpZ19wcm9iZXMgPC0gcHJvYmVzLmNsdXN0ZXIuYWxsW2lkeF0gJT4lCiAgdW5saXN0ICU+JQogIGFzLmNoYXJhY3RlcigpICU+JQogIHVuaXF1ZQpsZW5ndGgobWV0YV9zaWdfcHJvYmVzKQoKIyMjIGdldCBhbGwgY3BzIGluIG1ldGFfYWxsIGlucHV0IHJlZ2lvbnMKaWR4IDwtIGdzdWIoCiAgIjQ1MGtfR2VuZV8zXzIwMC58NDUwa19JbnRlckdlbmVfM18yMDAuIiwiIixuYW1lcyhwcm9iZXMuY2x1c3Rlci5hbGwpCikgJWluJSBtZXRhX2FsbCRpbnB1dFJlZ2lvbgoKbWV0YV9hbGxfcHJvYmVzIDwtIHByb2Jlcy5jbHVzdGVyLmFsbFtpZHhdICU+JQogIHVubGlzdCAlPiUKICBhcy5jaGFyYWN0ZXIoKSAlPiUKICB1bmlxdWUKCmxlbmd0aChtZXRhX2FsbF9wcm9iZXMpCmBgYAoKYGBge1J9CmFsbC5mb3JlZ3JvdW5kLnByb2JlcyA8LSBjKG1ldGFfc2lnX3Byb2JlcywgZm9yZWdyb3VuZC5wcm9iZXMpICU+JSB1bmlxdWUgIAphbGwuYmFja2dyb3VuZC5wcm9iZXMgPC0gYyhtZXRhX2FsbF9wcm9iZXMsIGJhY2tncm91bmQucHJvYmVzKSAlPiUgdW5pcXVlCmBgYAoKIyMjIFBhdGh3YXkgYW5hbHlzaXMgKGdlbmUgb250b2xvZ3kgYW5hbHlzaXMpCgpgYGB7UiBwYXRod2F5X2xpYnNfcmVnaW9uc19jcGdzLG1lc3NhZ2UgPSBGQUxTRSwgcmVzdWx0cyA9ICJoaWRlIn0KbGlicmFyeShtaXNzTWV0aHlsKQpsaWJyYXJ5KElsbHVtaW5hSHVtYW5NZXRoeWxhdGlvbjQ1MGthbm5vLmlsbW4xMi5oZzE5KQpgYGAKCmBgYHtSIHBhdGh3YXlfcmVnaW9uc19jcGdzfQojIyMgY29sbGVjdGlvbiA9ICJHTyIKYWxsX2dvIDwtIGdvbWV0aCgKICBzaWcuY3BnID0gYWxsLmZvcmVncm91bmQucHJvYmVzLAogIGFsbC5jcGcgPSBhbGwuYmFja2dyb3VuZC5wcm9iZXMsCiAgY29sbGVjdGlvbiA9ICJHTyIsCiAgZnJhY3QuY291bnRzID0gVFJVRQopCiMgdG9wR1NBKGFsbF9nbykKCmdvIDwtIG1pc3NNZXRoeWw6OjouZ2V0R08oKQpvdXQgPC0gZ2V0TWFwcGVkRW50cmV6SURzKHNpZy5jcGcgPSBmb3JlZ3JvdW5kLnByb2JlcywKICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuY3BnID0gYmFja2dyb3VuZC5wcm9iZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkudHlwZSA9ICI0NTBLIikKc29ydGVkLmVnLnNpZyA8LSAgb3V0JHNpZy5lZwpnZW5lLmluZm8gPC0gVENHQWJpb2xpbmtzOjpnZXQuR1JDaC5iaW9NYXJ0KCkKYWxsX2dvJGRlX2dlbmVzIDwtIHBseXI6OmFhcGx5KHJvd25hbWVzKGFsbF9nbyksMSwuZnVuID0gZnVuY3Rpb24oaWR4KXsKICBnZW5lLmluZm8kZXh0ZXJuYWxfZ2VuZV9uYW1lW2dlbmUuaW5mbyRlbnRyZXpnZW5lX2lkICVpbiUgaW50ZXJzZWN0KGdvJGlkTGlzdFtbaWR4XV0sc29ydGVkLmVnLnNpZyldICU+JQogICAgc29ydCAlPiUgdW5pcXVlICU+JSBwYXN0ZShjb2xsYXBzZSA9ICIsIikKfSkKCmFsbF9nb19vcmRlcmVkIDwtIGFsbF9nb1sKICBvcmRlcihhbGxfZ28kUC5ERSksCiAgXQoKd3JpdGUuY3N2KAogIGFsbF9nb19vcmRlcmVkLAogIHBhc3RlMChkaXIucmVzdWx0LnBhdGh3YXksICJwYXRod2F5X3JlZ2lvbnNfYW5kX2NwZ3NfR09fcmVzdWx0c19hbGwuY3N2IiksCiAgcm93Lm5hbWVzID0gVFJVRQopCgphbGxfZ29fb3JkZXJlZC5icCA8LSBhbGxfZ29fb3JkZXJlZCAlPiUKICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbigiR08iKSAlPiUgICMga2VlcCByb3cgbmFtZXMKICBkcGx5cjo6ZmlsdGVyKE9OVE9MT0dZID09ICJCUCIpICU+JQogIHRpYmJsZTo6Y29sdW1uX3RvX3Jvd25hbWVzKCJHTyIpICAgIyBrZWVwIHJvdyBuYW1lcwphbGxfZ29fb3JkZXJlZC5icCRGRFIgPC0gcC5hZGp1c3QoYWxsX2dvX29yZGVyZWQuYnAkUC5ERSwiZmRyIikKYGBgCgpgYGB7UixldmFsID0gRkFMU0V9CndyaXRlLmNzdigKICBhbGxfZ29fb3JkZXJlZC5icCwKICBwYXN0ZTAoZGlyLnJlc3VsdC5wYXRod2F5LCAicGF0aHdheV9yZWdpb25zX2FuZF9jcGdzX0dPX3Jlc3VsdHNfQlBfTl9yYW5nZV81XzIwMF9mZHJfcmVjYWxjLmNzdiIpLAogIHJvdy5uYW1lcyA9IFRSVUUKKQpgYGAKCmBgYHtSfQphbGxfZ29fb3JkZXJlZC5icCAgJT4lIAogIGRwbHlyOjpmaWx0ZXIoRkRSIDwgMC4wNSkgJT4lCiAgRFQ6OmRhdGF0YWJsZShmaWx0ZXIgPSAndG9wJywKICAgICAgICAgICAgICAgIHN0eWxlID0gImJvb3RzdHJhcCIsCiAgICAgICAgICAgICAgICBleHRlbnNpb25zID0gJ0J1dHRvbnMnLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tID0gJ0JmcnRpcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gSSgnY29sdmlzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTApLCAKICAgICAgICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICBjYXB0aW9uID0gIkdPIHJlc3VsdHMgQlAgKEZEUiA8IDAuMDUpIikKYGBgCgpgYGB7UiBrZWdnX3JlZ2lvbnNfY3Bnc30KIyMjIGNvbGxlY3Rpb24gPSAiS0VHRyIKYWxsX2tlZ2cgPC0gZ29tZXRoKAogIHNpZy5jcGcgPSBhbGwuZm9yZWdyb3VuZC5wcm9iZXMsCiAgYWxsLmNwZyA9IGFsbC5iYWNrZ3JvdW5kLnByb2JlcywKICBjb2xsZWN0aW9uID0gIktFR0ciLAogIGZyYWN0LmNvdW50cyA9IFRSVUUKKQojIHRvcEdTQShhbGxfa2VnZykKCmtlZ2cgPC0gbWlzc01ldGh5bDo6Oi5nZXRLRUdHKCkKb3V0IDwtIGdldE1hcHBlZEVudHJleklEcyhzaWcuY3BnID0gZm9yZWdyb3VuZC5wcm9iZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLmNwZyA9IGJhY2tncm91bmQucHJvYmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LnR5cGUgPSAiNDUwSyIpCnNvcnRlZC5lZy5zaWcgPC0gb3V0JHNpZy5lZwpnZW5lLmluZm8gPC0gVENHQWJpb2xpbmtzOjpnZXQuR1JDaC5iaW9NYXJ0KCkKYWxsX2tlZ2ckZGVfZ2VuZXMgPC0gcGx5cjo6YWFwbHkocm93bmFtZXMoYWxsX2tlZ2cpLDEsLmZ1biA9IGZ1bmN0aW9uKGlkeCl7CiAgZ2VuZS5pbmZvJGV4dGVybmFsX2dlbmVfbmFtZVtnZW5lLmluZm8kZW50cmV6Z2VuZV9pZCAlaW4lIGludGVyc2VjdChrZWdnJGlkTGlzdFtbaWR4XV0sc29ydGVkLmVnLnNpZyldICU+JQogICAgc29ydCAlPiUgdW5pcXVlICU+JSBwYXN0ZShjb2xsYXBzZSA9ICIsIikKfSkKCmFsbF9rZWdnX29yZGVyZWQgPC0gYWxsX2tlZ2dbCiAgb3JkZXIoYWxsX2tlZ2ckUC5ERSksCiAgXQoKd3JpdGUuY3N2KAogIGFsbF9rZWdnX29yZGVyZWQsCiAgcGFzdGUwKGRpci5yZXN1bHQucGF0aHdheSwgInBhdGh3YXlfcmVnaW9uc19hbmRfY3Bnc19LRUdHX3Jlc3VsdHNfYWxsLmNzdiIpLAogIHJvdy5uYW1lcyA9IFRSVUUKKQoKCmFsbF9rZWdnX29yZGVyZWQgPC0gYWxsX2tlZ2dfb3JkZXJlZCAlPiUKICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbigiS0VHRyIpICU+JSAgIyBrZWVwIHJvdyBuYW1lcwogIHRpYmJsZTo6Y29sdW1uX3RvX3Jvd25hbWVzKCJLRUdHIikgICAgICAjIGtlZXAgcm93IG5hbWVzCmFsbF9rZWdnX29yZGVyZWQkRkRSIDwtIHAuYWRqdXN0KGFsbF9rZWdnX29yZGVyZWQkUC5ERSwiZmRyIikKYGBgCgoKYGBge1IsIGV2YWwgPSBGQUxTRX0Kd3JpdGUuY3N2KAogIGFsbF9rZWdnX29yZGVyZWQsCiAgcGFzdGUwKGRpci5yZXN1bHQucGF0aHdheSwgInBhdGh3YXlfcmVnaW9uc19hbmRfY3Bnc19LRUdHX3Jlc3VsdHNfTl9yYW5nZV81XzIwMF9mZHJfcmVjYWxjLmNzdiIpLAogIHJvdy5uYW1lcyA9IFRSVUUKKQoKCmBgYAoKYGBge1J9CmFsbF9rZWdnX29yZGVyZWQgICU+JSAKICBkcGx5cjo6ZmlsdGVyKFAuREUgPCAwLjA1KSAlPiUKICBEVDo6ZGF0YXRhYmxlKGZpbHRlciA9ICd0b3AnLAogICAgICAgICAgICAgICAgc3R5bGUgPSAiYm9vdHN0cmFwIiwKICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChzY3JvbGxYID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSAnQmZydGlwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBJKCdjb2x2aXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMZW5ndGggPSAxMCksIAogICAgICAgICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgICAgIGNhcHRpb24gPSAia2VnZyByZXN1bHRzIChQLkRFIDwgMC4wNSkiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCgojIExPTEE6IExvY3VzIG92ZXJsYXAgYW5hbHlzaXMgZm9yIGVucmljaG1lbnQgb2YgZ2Vub21pYyByYW5nZXMKCiMjIEZvciBzaW5nbGUgY3BnIAoKYGBge1IgTE9MQV9zaW5nbGUsIHJlc3VsdHMgPSAiaGlkZSIsIG1lc3NhZ2UgPSBGQUxTRX0KIyMjIENhbGwgaW4gZGF0YXNldHMKY3BnX3NpZ19ub0Nyb3NzSHliX25vU21va2UgPC0gcmVhZC5jc3YoCiAgIm1ldGFfYW5hbHlzaXNfc2luZ2xlX2NwZ19yZXN1bHRzL21ldGFfYW5hbHlzaXNfc2luZ2xlX2NwZ19zaWdfbm9fY3Jvc3NIeWJfc21va2luZ19kZi5jc3YiCikgI2RpbTogMzc1MSAyNAoKY3BnX2FsbCA8LSByZWFkLmNzdigKICAibWV0YV9hbmFseXNpc19zaW5nbGVfY3BnX3Jlc3VsdHMvbWV0YV9hbmFseXNpc19zaW5nbGVfY3BnX2RmLmNzdiIKKSAjZGltOiA0NTA3OTMgMjQKCmNwZ19zaWdfaHlwZXJfbm9Dcm9zc0h5Yl9ub1Ntb2tlIDwtIGNwZ19zaWdfbm9Dcm9zc0h5Yl9ub1Ntb2tlICU+JQogIGZpbHRlcihlc3RpbWF0ZSA+IDApCmNwZ19zaWdfaHlwb19ub0Nyb3NzSHliX25vU21va2UgPC0gY3BnX3NpZ19ub0Nyb3NzSHliX25vU21va2UgJT4lCiAgZmlsdGVyKGVzdGltYXRlIDwgMCkKCiMjIyBUdXJuIGlucHV0IHJlZ2lvbnMgaW50byBHUmFuZ2VzCmxpYnJhcnkoR2Vub21pY1JhbmdlcykKY3BnX3NpZ19ub0Nyb3NzSHliX25vU21va2VfZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKAogIGNwZ19zaWdfbm9Dcm9zc0h5Yl9ub1Ntb2tlCikKY3BnX3NpZ19oeXBlcl9ub0Nyb3NzSHliX25vU21va2VfZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKAogIGNwZ19zaWdfaHlwZXJfbm9Dcm9zc0h5Yl9ub1Ntb2tlCikKY3BnX3NpZ19oeXBvX25vQ3Jvc3NIeWJfbm9TbW9rZV9nciA8LSBtYWtlR1Jhbmdlc0Zyb21EYXRhRnJhbWUoCiAgY3BnX3NpZ19oeXBvX25vQ3Jvc3NIeWJfbm9TbW9rZQopCmNwZ19hbGxfZ3IgPC0gbWFrZUdSYW5nZXNGcm9tRGF0YUZyYW1lKGNwZ19hbGwpCmBgYAoKYGBge1IgTE9MQV9zaW5nbGVfaW5pdCwgcmVzdWx0cyA9ICJoaWRlIiwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KExPTEEpCgpyZWdpb25EQl9oZzE5IDwtIGxvYWRSZWdpb25EQigiTE9MQUNvcmUvaGcxOSIpCgojIyMgQWxsIHNpZy4gY3Bncwpsb2NSZXN1bHRzIDwtIHJ1bkxPTEEoCiAgdXNlclNldHMgPSBjcGdfc2lnX25vQ3Jvc3NIeWJfbm9TbW9rZV9nciwKICB1c2VyVW5pdmVyc2UgPSBjcGdfYWxsX2dyLAogIHJlZ2lvbkRCID0gcmVnaW9uREJfaGcxOSwKICBjb3JlcyA9IDEKKQoKbG9jUmVzdWx0cyRwVmFsdWUgPC0gMTBeKC1sb2NSZXN1bHRzJHBWYWx1ZUxvZykKCmxvY1Jlc3VsdHNfb3JkZXJlZCA8LSBsb2NSZXN1bHRzWyxjKDE6MywgMjQsIDQ6MjMpXQoKd3JpdGUuY3N2KAogIGxvY1Jlc3VsdHNfb3JkZXJlZCwKICBwYXN0ZTAoZGlyLnJlc3VsdC5sb2xhLCAiY3Bnc19hbGxfTE9MQV9yZXN1bHRzLmNzdiIpLAogIHJvdy5uYW1lcyA9IEZBTFNFCikKYGBgCgpgYGB7Un0KbG9jUmVzdWx0cyAgICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgMC4wNSAmIGNvbGxlY3Rpb24gPT0gImVuY29kZV90ZmJzIikgJT4lCiAgRFQ6OmRhdGF0YWJsZShmaWx0ZXIgPSAndG9wJywKICAgICAgICAgICAgICAgIHN0eWxlID0gImJvb3RzdHJhcCIsCiAgICAgICAgICAgICAgICBleHRlbnNpb25zID0gJ0J1dHRvbnMnLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSAnQmZydGlwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBJKCdjb2x2aXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IDEwKSwKICAgICAgICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICBjYXB0aW9uID0gInNpbmdsZSBjcGcgYWxsIExPTEEgcmVzdWx0cyIpCmBgYAoKYGBge1IgTE9MQV9zaW5nbGVfcnVuLCByZXN1bHRzID0gImhpZGUiLCBtZXNzYWdlID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQoKIyMjIEFsbCBoeXBlciBjcGdzCmxvY1Jlc3VsdHMgPC0gcnVuTE9MQSgKICB1c2VyU2V0cyA9IGNwZ19zaWdfaHlwZXJfbm9Dcm9zc0h5Yl9ub1Ntb2tlX2dyLAogIHVzZXJVbml2ZXJzZSA9IGNwZ19hbGxfZ3IsCiAgcmVnaW9uREIgPSByZWdpb25EQl9oZzE5LAogIGNvcmVzID0gMQopCgpsb2NSZXN1bHRzJHBWYWx1ZSA8LSAxMF4oLWxvY1Jlc3VsdHMkcFZhbHVlTG9nKQoKbG9jUmVzdWx0c19vcmRlcmVkIDwtIGxvY1Jlc3VsdHNbLGMoMTozLCAyNCwgNDoyMyldCgp3cml0ZS5jc3YoCiAgbG9jUmVzdWx0c19vcmRlcmVkLAogIHBhc3RlMChkaXIucmVzdWx0LmxvbGEsICJjcGdzX2h5cGVyX0xPTEFfcmVzdWx0cy5jc3YiKSwKICByb3cubmFtZXMgPSBGQUxTRQopCmBgYAoKYGBge1IsIGluY2x1ZGUgPSBGQUxTRSwgZXZhbCA9IEZBTFNFfQpsb2NSZXN1bHRzICAgJT4lCiAgZHBseXI6OmZpbHRlcihxVmFsdWUgPCAwLjA1KSAlPiUKICBEVDo6ZGF0YXRhYmxlKGZpbHRlciA9ICd0b3AnLAogICAgICAgICAgICAgICAgc3R5bGUgPSAiYm9vdHN0cmFwIiwKICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsCiAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChzY3JvbGxYID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSA9ICdCZnJ0aXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IEkoJ2NvbHZpcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gMTApLAogICAgICAgICAgICAgICAgcm93bmFtZXMgPSBGQUxTRSwKICAgICAgICAgICAgICAgIGNhcHRpb24gPSAic2luZ2xlIGNwZyBoeXBlciBMT0xBIHJlc3VsdHMiKQpgYGAKCmBgYHtSIExPTEFfc2luZ2xlX3JlcywgcmVzdWx0cyA9ICJoaWRlIiwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KCiMjIyBBbGwgaHlwbyBjcGdzCmxvY1Jlc3VsdHMgPC0gcnVuTE9MQSgKICB1c2VyU2V0cyA9IGNwZ19zaWdfaHlwb19ub0Nyb3NzSHliX25vU21va2VfZ3IsCiAgdXNlclVuaXZlcnNlID0gY3BnX2FsbF9nciwKICByZWdpb25EQiA9IHJlZ2lvbkRCX2hnMTksCiAgY29yZXMgPSAxCikKCmxvY1Jlc3VsdHMkcFZhbHVlIDwtIDEwXigtbG9jUmVzdWx0cyRwVmFsdWVMb2cpCgpsb2NSZXN1bHRzX29yZGVyZWQgPC0gbG9jUmVzdWx0c1ssYygxOjMsIDI0LCA0OjIzKV0KCndyaXRlLmNzdigKICBsb2NSZXN1bHRzX29yZGVyZWQsCiAgcGFzdGUwKGRpci5yZXN1bHQubG9sYSwgImNwZ3NfaHlwb19MT0xBX3Jlc3VsdHMuY3N2IiksCiAgcm93Lm5hbWVzID0gRkFMU0UKKQpgYGAKCmBgYHtSLCBpbmNsdWRlID0gRkFMU0UsIGV2YWwgPSBGQUxTRX0KbG9jUmVzdWx0cyAgICU+JQogIGRwbHlyOjpmaWx0ZXIocVZhbHVlIDwgMC4wNSkgJT4lCiAgRFQ6OmRhdGF0YWJsZShmaWx0ZXIgPSAndG9wJywKICAgICAgICAgICAgICAgIHN0eWxlID0gImJvb3RzdHJhcCIsCiAgICAgICAgICAgICAgICBleHRlbnNpb25zID0gJ0J1dHRvbnMnLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gPSAnQmZydGlwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBJKCdjb2x2aXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IDEwKSwKICAgICAgICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICAgICAgICAgICAgICBjYXB0aW9uID0gInNpbmdsZSBjcGcgaHlwbyBMT0xBIHJlc3VsdHMiKQpgYGAKCgojIFNlc3Npb24gaW5mb3JtYXRpb24KYGBge1J9CmRldnRvb2xzOjpzZXNzaW9uX2luZm8oKQpgYGAKCgo=