1 Introduction

The various differential expression analyses of the data generated in tmrc3_datasets will occur in this document.

1.1 Naming conventions

I am going to try to standardize how I name the various data structures created in this document. Most of the large data created are either sets of differential expression analyses, their combined results, or the set of results deemed ‘significant’.

Hopefully by now they all follow these guidelines:

{clinic(s)}sample-subset}{primary-question(s)}{datatype}{batch-method}

  • {clinic}: This is either tc or t for Tumaco and Cali, or just Tumaco.
  • {sample-subset}: Things like ‘all’ or ‘monocytes’.
  • {primary-question}: Shorthand name for the primary contrasts performed, thus ‘clinics’ would suggest a comparison of Tumaco vs. Cali. ‘visits’ would compare v2/v1, etc.
  • {datatype}: de, table, sig
  • {batch-type}: nobatch, batch{factor}, sva. {factor} in this instance should be a column from the metadata.

With this in mind, ‘tc_biopsies_clinic_de_sva’ should be the Tumaco+Cali biopsy data after performing the differential expression analyses comparing the clinics using sva.

I suspect there remain some exceptions and/or errors.

1.2 Define contrasts for DE analyses

clinic_contrasts <- list(
    "clinics" = c("Cali", "Tumaco"))
## In some cases we have no Cali failure samples, so there remain only 2
## contrasts that are likely of interest
tc_cf_contrasts <- list(
    "tumaco" = c("Tumacofailure", "Tumacocure"),
    "cure" = c("Tumacocure", "Calicure"))
## In other cases, we have cure/fail for both places.
clinic_cf_contrasts <- list(
    "cali" = c("Califailure", "Calicure"),
    "tumaco" = c("Tumacofailure", "Tumacocure"),
    "cure" = c("Tumacocure", "Calicure"),
    "fail" = c("Tumacofailure", "Califailure"))
cf_contrast <- list(
    "outcome" = c("Tumacofailure", "Tumacocure"))
t_cf_contrast <- list(
    "outcome" = c("failure", "cure"))
visitcf_contrasts <- list(
    "v1cf" = c("v1failure", "v1cure"),
    "v2cf" = c("v2failure", "v2cure"),
    "v3cf" = c("v3failure", "v3cure"))
visit_contrasts <- list(
    "v2v1" = c("c2", "c1"),
    "v3v1" = c("c3", "c1"),
    "v3v2" = c("c3", "c2"))

2 Compare samples by clinic

2.1 DE: Compare clinics, all samples

Perform a svaseq-guided comparison of the two clinics. Ideally this will give some clue about just how strong the clinic-based batch effect really is and what its causes are.

tc_clinic_type <- tc_valid %>%
  set_expt_conditions(fact="clinic") %>%
  set_expt_batches(fact="typeofcells")

table(pData(tc_clinic_type)[["condition"]])
## 
##   Cali Tumaco 
##     61    123
tc_all_clinic_de_sva <- all_pairwise(tc_clinic_type, model_batch="svaseq", filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##   Cali Tumaco 
##     61    123
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (14290 remaining).
## Setting 31271 low elements to zero.
## transform_counts: Found 31271 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
tc_all_clinic_de_sva[["deseq"]][["contrasts_performed"]]
## [1] "Tumaco_vs_Cali"
tc_all_clinic_table_sva <- combine_de_tables(
    tc_all_clinic_de_sva, keepers=clinic_contrasts,
    excel=glue::glue("analyses/3_cali_and_tumaco/compare_clinics/tc_all_clinic_table_sva-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/compare_clinics/tc_all_clinic_table_sva-v202207.xlsx before writing the tables.
tc_all_clinic_sig_sva <- extract_significant_genes(
    tc_all_clinic_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/compare_clinics/tc_clinic_type_sig_sva-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/compare_clinics/tc_clinic_type_sig_sva-v202207.xlsx before writing the tables.
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.

2.2 DE: Compare clinics, biopsy samples

Interestingly to me, the biopsy samples appear to have the least location-based variance. But we can perform an explicit DE and see how well that hypothesis holds up.

Note that these data include cure and fail samples for

table(pData(tc_biopsies)[["condition"]])
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##              4              9              5
tc_biopsies_clinic_de_sva <- all_pairwise(tc_biopsies, model_batch="svaseq", filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##              4              9              5
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (13608 remaining).
## Setting 290 low elements to zero.
## transform_counts: Found 290 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_biopsies_clinic_de_sva[["deseq"]][["contrasts_performed"]]
## [1] "Tumacofailure_vs_Tumacocure" "Tumacofailure_vs_Calicure"  
## [3] "Tumacocure_vs_Calicure"
tc_biopsies_clinic_table_sva <- combine_de_tables(
    tc_biopsies_clinic_de_sva, keepers=tc_cf_contrasts,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Biopsies/tc_biopsies_clinic_table_sva-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/clinic_cf/Biopsies/tc_biopsies_clinic_table_sva-v202207.xlsx before writing the tables.
tc_biopsies_clinic_sig_sva <- extract_significant_genes(
    tc_biopsies_clinic_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Biopsies/tc_biopsies_clinic_sig_sva-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/clinic_cf/Biopsies/tc_biopsies_clinic_sig_sva-v202207.xlsx before writing the tables.
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.

2.3 DE: Compare clinics, eosinophil samples

The remaining cell types all have pretty strong clinic-based variance; but I am not certain if it is consistent across cell types.

table(pData(tc_eosinophils)[["condition"]])
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##             15             17              9
tc_eosinophils_clinic_de <- all_pairwise(tc_eosinophils, model_batch=FALSE, filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##             15             17              9
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_eosinophils_clinic_de_nobatch[["deseq"]][["contrasts_performed"]]
## Error in eval(expr, envir, enclos): object 'tc_eosinophils_clinic_de_nobatch' not found
tc_eosinophils_clinic_table_nobatch <- combine_de_tables(
    tc_eosinophils_clinic_de_nobatch, keepers=tc_cf_contrasts,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Eosinophils/tc_eosinophils_clinic_table_nobatch-v{ver}.xlsx"))
## Error in combine_de_tables(tc_eosinophils_clinic_de_nobatch, keepers = tc_cf_contrasts, : object 'tc_eosinophils_clinic_de_nobatch' not found
tc_eosinophils_clinic_sig_nobatch <- extract_significant_genes(
    tc_eosinophils_clinic_table_nobatch,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Eosinophils/tc_eosinophils_clinic_sig_nobatch-v{ver}.xlsx"))
## Error in extract_significant_genes(tc_eosinophils_clinic_table_nobatch, : object 'tc_eosinophils_clinic_table_nobatch' not found

2.4 DE: Compare clinics, monocyte samples

At least for the moment, I am only looking at the differences between no-batch vs. sva across clinics for the monocyte samples. This was chosen mostly arbitrarily.

2.4.1 DE: Compare clinics, monocytes without batch estimation

Our baseline is the comparison of the monocytes samples without batch in the model or surrogate estimation. In theory at least, this should correspond to the PCA plot above when no batch estimation was performed.

tc_monocytes_de_nobatch <- all_pairwise(tc_monocytes, model_batch=FALSE, filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             21             21
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_monocytes_table_nobatch <- combine_de_tables(
    tc_monocytes_de_nobatch, keepers=clinic_cf_contrasts,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_table_nobatch-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_table_nobatch-v202207.xlsx before writing the tables.
tc_monocytes_sig_nobatch <- extract_significant_genes(
    tc_monocytes_table_nobatch,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_sig_nobatch-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_sig_nobatch-v202207.xlsx before writing the tables.
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.

2.4.2 DE: Compare clinics, monocytes with svaseq

In contrast, the following comparison should give a view of the data corresponding to the svaseq PCA plot above. In the best case scenario, we should therefore be able to see some significane differences between the Tumaco cure and fail samples.

tc_monocytes_de_sva <- all_pairwise(tc_monocytes, model_batch="svaseq", filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             21             21
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11104 remaining).
## Setting 1447 low elements to zero.
## transform_counts: Found 1447 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_monocytes_table_sva <- combine_de_tables(
    tc_monocytes_de_sva, keepers=clinic_cf_contrasts,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_table_sva-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_table_sva-v202207.xlsx before writing the tables.
tc_monocytes_sig_sva <- extract_significant_genes(
    tc_monocytes_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_sig_sva-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/clinic_cf/Monocytes/tc_monocytes_clinic_sig_sva-v202207.xlsx before writing the tables.
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.

2.4.3 DE Compare: How similar are the no-batch vs. SVA results?

The following block shows that these two results are exceedingly different, sugesting that the Cali cure/fail and Tumaco cure/fail cannot easily be considered in the same analysis. I did some playing around with my calculate_aucc function in this block and found that it is in some important way broken, at least if one expands the top-n genes to more than 20% of the number of genes in the data.

cali_table <- tc_monocytes_table_nobatch[["data"]][["cali"]]
table <- tc_monocytes_table_nobatch[["data"]][["tumaco"]]

cali_merged <- merge(cali_table, table, by="row.names")
cor.test(cali_merged[, "deseq_logfc.x"], cali_merged[, "deseq_logfc.y"])
## 
##  Pearson's product-moment correlation
## 
## data:  cali_merged[, "deseq_logfc.x"] and cali_merged[, "deseq_logfc.y"]
## t = 0.92, df = 11102, p-value = 0.4
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.009917  0.027280
## sample estimates:
##      cor 
## 0.008685
cali_aucc <- calculate_aucc(cali_table, table, px="deseq_adjp", py="deseq_adjp",
                            lx="deseq_logfc", ly="deseq_logfc")
cali_aucc$plot

cali_table_sva <- tc_monocytes_table_sva[["data"]][["cali"]]
tumaco_table_sva <- tc_monocytes_table_sva[["data"]][["tumaco"]]

cali_merged_sva <- merge(cali_table_sva, tumaco_table_sva, by="row.names")
cor.test(cali_merged_sva[, "deseq_logfc.x"], cali_sva_merged[, "deseq_logfc.y"])
## Error in cor.test.default(cali_merged_sva[, "deseq_logfc.x"], cali_sva_merged[, : object 'cali_sva_merged' not found
cali_aucc_sva <- calculate_aucc(cali_table_sva, tumaco_table_sva, px="deseq_adjp", py="deseq_adjp",
                                lx="deseq_logfc", ly="deseq_logfc")
cali_aucc_sva$plot

2.5 DE: Compare clinics, neutrophil samples

tc_neutrophils_de_nobatch <- all_pairwise(tc_neutrophils, model_batch=FALSE, filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             20             21
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_neutrophils_table_nobatch <- combine_de_tables(
    tc_neutrophils_de_nobatch, keepers=clinic_cf_contrasts,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_table_nobatch-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_table_nobatch-v202207.xlsx before writing the tables.
tc_neutrophils_sig_nobatch <- extract_significant_genes(
    tc_neutrophils_table_nobatch,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_sig_nobatch-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_sig_nobatch-v202207.xlsx before writing the tables.
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
tc_neutrophils_de_sva <- all_pairwise(tc_neutrophils, model_batch="svaseq", filter=TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             20             21
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9242 remaining).
## Setting 1541 low elements to zero.
## transform_counts: Found 1541 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

tc_neutrophils_table_sva <- combine_de_tables(
    tc_neutrophils_de_sva, keepers=clinic_cf_contrasts,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_table_sva-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_table_sva-v202207.xlsx before writing the tables.
tc_neutrophils_sig_sva <- extract_significant_genes(
    tc_neutrophils_table_sva,
    excel=glue::glue("analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_sig_sva-v{ver}.xlsx"))
## Deleting the file analyses/3_cali_and_tumaco/clinic_cf/Neutrophils/tc_neutrophils_sig_sva-v202207.xlsx before writing the tables.
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.

3 Compare DE: How similar are Tumaco C/F vs. Cali C/F

The following expands the cross-clinic query above to also test the neutrophils. Once again, I think it will pretty strongly support the hypothesis that the two clinics are not compatible.

We are concerned that the clinic-based batch effect may make our results essentially useless. One way to test this concern is to compare the set of genes observed different between the Cali Cure/Fail vs. the Tumaco Cure/Fail.

cali_table_nobatch <- tc_neutrophils_table_nobatch[["data"]][["cali"]]
tumaco_table_nobatch <- tc_neutrophils_table_nobatch[["data"]][["tumaco"]]

cali_merged_nobatch <- merge(cali_table_nobatch, tumaco_table_nobatch, by="row.names")
cor.test(cali_merged_nobatch[, "deseq_logfc.x"], cali_merged_nobatch[, "deseq_logfc.y"])
## 
##  Pearson's product-moment correlation
## 
## data:  cali_merged_nobatch[, "deseq_logfc.x"] and cali_merged_nobatch[, "deseq_logfc.y"]
## t = -16, df = 9240, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.1800 -0.1403
## sample estimates:
##     cor 
## -0.1602
cali_aucc_nobatch <- calculate_aucc(cali_table_nobatch, tumaco_table_nobatch, px="deseq_adjp",
                                    py="deseq_adjp", lx="deseq_logfc", ly="deseq_logfc")
cali_aucc_nobatch$plot

3.1 GSEA: Extract clinic-specific genes

Given the above comparisons, we can extract some gene sets which resulted from those DE analyses and eventually perform some ontology/KEGG/reactome/etc searches. This reminds me, I want to make my extract_significant_ functions to return gene-set data structures and my various ontology searches to take them as inputs. This should help avoid potential errors when extracting up/down genes.

clinic_sigenes_up <- rownames(tc_clinic_type_sig_sva[["deseq"]][["ups"]][["clinics"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'tc_clinic_type_sig_sva' not found
clinic_sigenes_down <- rownames(tc_clinic_type_sig_sva[["deseq"]][["downs"]][["clinics"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'tc_clinic_type_sig_sva' not found
clinic_sigenes <- c(clinic_sigenes_up, clinic_sigenes_down)
## Error in eval(expr, envir, enclos): object 'clinic_sigenes_up' not found
tc_eosinophils_sigenes_up <- rownames(tc_eosinophils_clinic_sig_sva[["deseq"]][["ups"]][["cure"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'tc_eosinophils_clinic_sig_sva' not found
tc_eosinophils_sigenes_down <- rownames(tc_eosinophils_clinic_sig_sva[["deseq"]][["downs"]][["cure"]])
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'tc_eosinophils_clinic_sig_sva' not found
tc_monocytes_sigenes_up <- rownames(tc_monocytes_sig_sva[["deseq"]][["ups"]][["cure"]])
tc_monocytes_sigenes_down <- rownames(tc_monocytes_sig_sva[["deseq"]][["downs"]][["cure"]])
tc_neutrophils_sigenes_up <- rownames(tc_neutrophils_sig_sva[["deseq"]][["ups"]][["cure"]])
tc_neutrophils_sigenes_down <- rownames(tc_neutrophils_sig_sva[["deseq"]][["downs"]][["cure"]])

tc_eosinophils_sigenes <- c(tc_eosinophils_sigenes_up,
                            tc_eosinophils_sigenes_down)
## Error in eval(expr, envir, enclos): object 'tc_eosinophils_sigenes_up' not found
tc_monocytes_sigenes <- c(tc_monocytes_sigenes_up,
                          tc_monocytes_sigenes_down)
tc_neutrophils_sigenes <- c(tc_neutrophils_sigenes_up,
                            tc_neutrophils_sigenes_down)

3.2 GSEA: gProfiler of genes deemed up/down when comparing Cali and Tumaco

I was curious to try to understand why the two clinics appear to be so different vis a vis their PCA/DE; so I thought that gProfiler might help boil those results down to something more digestible.

3.2.1 GSEA: Compare clinics, all samples

clinic_gp <- simple_gprofiler(clinic_sigenes)
## Error in simple_gprofiler(clinic_sigenes): object 'clinic_sigenes' not found
clinic_gp$pvalue_plots$kegg_plot_over
## Error in eval(expr, envir, enclos): object 'clinic_gp' not found
clinic_gp$pvalue_plots$reactome_plot_over
## Error in eval(expr, envir, enclos): object 'clinic_gp' not found
clinic_gp <- simple_gprofiler(clinic_sigenes)
## Error in simple_gprofiler(clinic_sigenes): object 'clinic_sigenes' not found
clinic_gp$pvalue_plots$kegg_plot_over
## Error in eval(expr, envir, enclos): object 'clinic_gp' not found
clinic_gp$pvalue_plots$reactome_plot_over
## Error in eval(expr, envir, enclos): object 'clinic_gp' not found
clinic_gp <- simple_gprofiler(clinic_sigenes)
## Error in simple_gprofiler(clinic_sigenes): object 'clinic_sigenes' not found
clinic_gp$pvalue_plots$kegg_plot_over
## Error in eval(expr, envir, enclos): object 'clinic_gp' not found
clinic_gp$pvalue_plots$reactome_plot_over
## Error in eval(expr, envir, enclos): object 'clinic_gp' not found

3.2.2 GSEA: Compare clinics, Eosinophil samples

tc_eosinophils_gp <- simple_gprofiler(tc_eosinophils_sigenes)
## Error in simple_gprofiler(tc_eosinophils_sigenes): object 'tc_eosinophils_sigenes' not found
tc_eosinophils_gp$pvalue_plots$kegg_plot_over
## Error in eval(expr, envir, enclos): object 'tc_eosinophils_gp' not found
tc_eosinophils_gp$pvalue_plots$reactome_plot_over
## Error in eval(expr, envir, enclos): object 'tc_eosinophils_gp' not found
tc_eosinophils_up_gp <- simple_gprofiler(tc_eosinophils_sigenes_up)
## Error in simple_gprofiler(tc_eosinophils_sigenes_up): object 'tc_eosinophils_sigenes_up' not found
tc_eosinophils_up_gp$pvalue_plots$kegg_plot_over
## Error in eval(expr, envir, enclos): object 'tc_eosinophils_up_gp' not found
tc_eosinophils_up_gp$pvalue_plots$reactome_plot_over
## Error in eval(expr, envir, enclos): object 'tc_eosinophils_up_gp' not found
tc_eosinophils_down_gp <- simple_gprofiler(tc_eosinophils_sigenes_down)
## Error in simple_gprofiler(tc_eosinophils_sigenes_down): object 'tc_eosinophils_sigenes_down' not found
tc_eosinophils_down_gp$pvalue_plots$kegg_plot_over
## Error in eval(expr, envir, enclos): object 'tc_eosinophils_down_gp' not found
tc_eosinophils_down_gp$pvalue_plots$reactome_plot_over
## Error in eval(expr, envir, enclos): object 'tc_eosinophils_down_gp' not found

3.2.3 GSEA: Compare clinics, Monocyte samples

tc_monocytes_gp <- simple_gprofiler(tc_monocytes_sigenes)
## Performing gProfiler GO search of 1491 genes against hsapiens.
## GO search found 539 hits.
## Performing gProfiler KEGG search of 1491 genes against hsapiens.
## KEGG search found 30 hits.
## Performing gProfiler REAC search of 1491 genes against hsapiens.
## REAC search found 14 hits.
## Performing gProfiler MI search of 1491 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 1491 genes against hsapiens.
## TF search found 396 hits.
## Performing gProfiler CORUM search of 1491 genes against hsapiens.
## CORUM search found 7 hits.
## Performing gProfiler HP search of 1491 genes against hsapiens.
## HP search found 26 hits.
tc_monocytes_gp$pvalue_plots$kegg_plot_over

tc_monocytes_gp$pvalue_plots$reactome_plot_over

tc_monocytes_up_gp <- simple_gprofiler(tc_monocytes_sigenes_up)
## Performing gProfiler GO search of 761 genes against hsapiens.
## GO search found 473 hits.
## Performing gProfiler KEGG search of 761 genes against hsapiens.
## KEGG search found 28 hits.
## Performing gProfiler REAC search of 761 genes against hsapiens.
## REAC search found 11 hits.
## Performing gProfiler MI search of 761 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 761 genes against hsapiens.
## TF search found 393 hits.
## Performing gProfiler CORUM search of 761 genes against hsapiens.
## CORUM search found 5 hits.
## Performing gProfiler HP search of 761 genes against hsapiens.
## HP search found 22 hits.
tc_monocytes_up_gp$pvalue_plots$kegg_plot_over

tc_monocytes_up_gp$pvalue_plots$reactome_plot_over

tc_monocytes_down_gp <- simple_gprofiler(tc_monocytes_sigenes_down)
## Performing gProfiler GO search of 730 genes against hsapiens.
## GO search found 65 hits.
## Performing gProfiler KEGG search of 730 genes against hsapiens.
## KEGG search found 3 hits.
## Performing gProfiler REAC search of 730 genes against hsapiens.
## REAC search found 6 hits.
## Performing gProfiler MI search of 730 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 730 genes against hsapiens.
## TF search found 280 hits.
## Performing gProfiler CORUM search of 730 genes against hsapiens.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 730 genes against hsapiens.
## HP search found 10 hits.
tc_monocytes_down_gp$pvalue_plots$kegg_plot_over

tc_monocytes_down_gp$pvalue_plots$reactome_plot_over

3.2.4 GSEA: Compare clinics, Neutrophil samples

tc_neutrophils_gp <- simple_gprofiler(tc_neutrophils_sigenes)
## Performing gProfiler GO search of 1221 genes against hsapiens.
## GO search found 150 hits.
## Performing gProfiler KEGG search of 1221 genes against hsapiens.
## KEGG search found 15 hits.
## Performing gProfiler REAC search of 1221 genes against hsapiens.
## REAC search found 11 hits.
## Performing gProfiler MI search of 1221 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 1221 genes against hsapiens.
## TF search found 398 hits.
## Performing gProfiler CORUM search of 1221 genes against hsapiens.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 1221 genes against hsapiens.
## HP search found 2 hits.
tc_neutrophils_gp$pvalue_plots$kegg_plot_over

tc_neutrophils_gp$pvalue_plots$reactome_plot_over

tc_neutrophils_up_gp <- simple_gprofiler(tc_neutrophils_sigenes_up)
## Performing gProfiler GO search of 843 genes against hsapiens.
## GO search found 97 hits.
## Performing gProfiler KEGG search of 843 genes against hsapiens.
## KEGG search found 14 hits.
## Performing gProfiler REAC search of 843 genes against hsapiens.
## REAC search found 6 hits.
## Performing gProfiler MI search of 843 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 843 genes against hsapiens.
## TF search found 385 hits.
## Performing gProfiler CORUM search of 843 genes against hsapiens.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 843 genes against hsapiens.
## HP search found 2 hits.
tc_neutrophils_up_gp$pvalue_plots$kegg_plot_over

tc_neutrophils_up_gp$pvalue_plots$reactome_plot_over

tc_neutrophils_down_gp <- simple_gprofiler(tc_neutrophils_sigenes_down)
## Performing gProfiler GO search of 378 genes against hsapiens.
## GO search found 63 hits.
## Performing gProfiler KEGG search of 378 genes against hsapiens.
## KEGG search found 13 hits.
## Performing gProfiler REAC search of 378 genes against hsapiens.
## REAC search found 69 hits.
## Performing gProfiler MI search of 378 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 378 genes against hsapiens.
## TF search found 13 hits.
## Performing gProfiler CORUM search of 378 genes against hsapiens.
## CORUM search found 3 hits.
## Performing gProfiler HP search of 378 genes against hsapiens.
## HP search found 13 hits.
tc_neutrophils_down_gp$pvalue_plots$kegg_plot_over

tc_neutrophils_down_gp$pvalue_plots$reactome_plot_over

4 Only Tumaco samples

4.1 Set the xlsx output prefix

xlsx_prefix <- "analyses/4_tumaco/DE_Cure_vs_Fail"

4.2 All samples

t_cf_clinical_de_sva <- all_pairwise(t_clinical, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      67      56
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (14149 remaining).
## Setting 17282 low elements to zero.
## transform_counts: Found 17282 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_clinical_table_sva <- combine_de_tables(
    t_cf_clinical_de_sva,
    keepers = t_cf_contrast,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_cf_clinical_tables_sva-v{ver}.xlsx"))
## Deleting the file analyses/4_tumaco/DE_Cure_vs_Fail/All_Samples/t_cf_clinical_tables_sva-v202207.xlsx before writing the tables.
t_cf_clinical_sig_sva <- extract_significant_genes(
    t_cf_clinical_table_sva,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_cf_clinical_sig_sva-v{ver}.xlsx"))
## Deleting the file analyses/4_tumaco/DE_Cure_vs_Fail/All_Samples/t_cf_clinical_sig_sva-v202207.xlsx before writing the tables.
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_clinical_sig$deseq$ups[[1]])
## Error in eval(expr, envir, enclos): object 't_cf_clinical_sig' not found
dim(t_cf_clinical_sig$deseq$downs[[1]])
## Error in eval(expr, envir, enclos): object 't_cf_clinical_sig' not found

4.2.1 All visits, each time point

t_cf_clinical_v1_de_sva <- all_pairwise(tv1_samples, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      30      24
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (14016 remaining).
## Setting 7615 low elements to zero.
## transform_counts: Found 7615 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_clinical_v1_table_sva <- combine_de_tables(
    t_cf_clinical_v1_de_sva,
    keepers = t_cf_contrast,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_cf_clinical_v1_tables_sva-v{ver}.xlsx"))
t_cf_clinical_v1_sig_sva <- extract_significant_genes(
    t_cf_clinical_v1_table_sva,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_cf_clinical_v1_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_clinical_v1_sig$deseq$ups[[1]])
## Error in eval(expr, envir, enclos): object 't_cf_clinical_v1_sig' not found
dim(t_cf_clinical_v1_sig$deseq$downs[[1]])
## Error in eval(expr, envir, enclos): object 't_cf_clinical_v1_sig' not found
t_cf_clinical_v2_de_sva <- all_pairwise(tv2_samples, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      20      15
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11559 remaining).
## Setting 2848 low elements to zero.
## transform_counts: Found 2848 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_clinical_v2_table_sva <- combine_de_tables(
    t_cf_clinical_v2_de_sva,
    keepers = t_cf_contrast,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_cf_clinical_v2_tables_sva-v{ver}.xlsx"))
t_cf_clinical_v2_sig_sva <- extract_significant_genes(
    t_cf_clinical_v2_table_sva,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_cf_clinical_v2_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_clinical_v2_sig_sva$deseq$ups[[1]])
## [1] 51 58
dim(t_cf_clinical_v2_sig_sva$deseq$downs[[1]])
## [1] 15 58
t_cf_clinical_v3_de_sva <- all_pairwise(tv3_samples, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      17      17
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11449 remaining).
## Setting 1878 low elements to zero.
## transform_counts: Found 1878 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_clinical_v3_table_sva <- combine_de_tables(
    t_cf_clinical_v3_de_sva,
    keepers = t_cf_contrast,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_cf_clinical_v3_tables_sva-v{ver}.xlsx"))
t_cf_clinical_v3_sig_sva <- extract_significant_genes(
    t_cf_clinical_v3_table_sva,
    excel = glue::glue("{xlsx_prefix}/All_Samples/t_cf_clinical_v3_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_clinical_v3_sig_sva$deseq$ups[[1]])
## [1] 120  58
dim(t_cf_clinical_v3_sig_sva$deseq$downs[[1]])
## [1] 62 58

4.2.2 Repeat no biopsies

t_cf_clinical_nobiop_de_sva <- all_pairwise(t_clinical_nobiop,
                                            model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    cure failure 
##      58      51
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11907 remaining).
## Setting 9578 low elements to zero.
## transform_counts: Found 9578 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_clinical_nobiop_table_sva <- combine_de_tables(
    t_cf_clinical_nobiop_de_sva,
    keepers = t_cf_contrast,
    excel = glue::glue("{xlsx_prefix}/No_Biopsies/t_cf_clinical_nobiop_tables_sva-v{ver}.xlsx"))
t_cf_clinical_nobiop_sig_sva <- extract_significant_genes(
    t_cf_clinical_nobiop_table_sva,
    excel = glue::glue("{xlsx_prefix}/No_Biopsies/t_cf_clinical_nobiop_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_clinical_nobiop_sig_sva$deseq$ups[[1]])
## [1] 137  58
dim(t_cf_clinical_nobiop_sig_sva$deseq$downs[[1]])
## [1] 73 58

4.2.3 By cell type

4.2.3.1 Cure/Fail, Biopsies

t_cf_biopsy_de_sva <- all_pairwise(t_biopsies, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              9              5
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (13506 remaining).
## Setting 145 low elements to zero.
## transform_counts: Found 145 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_biopsy_table_sva <- combine_de_tables(
    t_cf_biopsy_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Biopsies/t_cf_biopsy_tables_sva-v{ver}.xlsx"))
t_cf_biopsy_sig_sva <- extract_significant_genes(
    t_cf_biopsy_table_sva,
    excel = glue::glue("{xlsx_prefix}/Biopsies/t_cf_biopsy_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_biopsy_sig_sva$deseq$ups[[1]])
## [1] 17 58
dim(t_cf_biopsy_sig_sva$deseq$downs[[1]])
## [1] 11 58

4.2.3.2 Cure/Fail, Monocytes

t_cf_monocyte_de_sva <- all_pairwise(t_monocytes, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             21             21
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10859 remaining).
## Setting 730 low elements to zero.
## transform_counts: Found 730 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_monocyte_tables_sva <- combine_de_tables(
    t_cf_monocyte_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_cf_monocyte_tables_sva-v{ver}.xlsx"))
t_cf_monocyte_sig_sva <- extract_significant_genes(
    t_cf_monocyte_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_cf_monocyte_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_monocyte_sig_sva$deseq$ups[[1]])
## [1] 60 58
dim(t_cf_monocyte_sig_sva$deseq$downs[[1]])
## [1] 53 58
t_cf_monocyte_de_batchvisit <- all_pairwise(t_monocytes, model_batch = TRUE, filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             21             21
## This analysis will include a batch factor in the model comprised of:
## 
##  3  2  1 
## 13 13 16
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_monocyte_tables_batchvisit <- combine_de_tables(
    t_cf_monocyte_de_batchvisit,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_cf_monocyte_tables_batchvisit-v{ver}.xlsx"))
t_cf_monocyte_sig_batchvisit <- extract_significant_genes(
    t_cf_monocyte_tables_batchvisit,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_cf_monocyte_sig_batchvisit-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_monocyte_sig_batchvisit$deseq$ups[[1]])
## [1] 43 58
dim(t_cf_monocyte_sig_batchvisit$deseq$downs[[1]])
## [1] 93 58

4.2.4 All visits, Monocytes

t_cf_monocyte_v1_de_sva <- all_pairwise(tv1_monocytes, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              8              8
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10479 remaining).
## Setting 187 low elements to zero.
## transform_counts: Found 187 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_monocyte_v1_tables_sva <- combine_de_tables(
    t_cf_monocyte_v1_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_cf_monocyte_v1_tables_sva-v{ver}.xlsx"))
t_cf_monocyte_v1_sig_sva <- extract_significant_genes(
    t_cf_monocyte_v1_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_cf_monocyte_v1_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_monocyte_v1_sig_sva$deseq$ups[[1]])
## [1] 14 58
dim(t_cf_monocyte_v1_sig_sva$deseq$downs[[1]])
## [1] 52 58
t_cf_monocyte_v2_de_sva <- all_pairwise(tv2_monocytes, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              7              6
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10520 remaining).
## Setting 115 low elements to zero.
## transform_counts: Found 115 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_monocyte_v2_tables_sva <- combine_de_tables(
    t_cf_monocyte_v2_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_cf_monocyte_v2_tables_sva-v{ver}.xlsx"))
t_cf_monocyte_v2_sig_sva <- extract_significant_genes(
    t_cf_monocyte_v2_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_cf_monocyte_v2_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_monocyte_v2_sig_sva$deseq$ups[[1]])
## [1]  0 58
dim(t_cf_monocyte_v2_sig_sva$deseq$downs[[1]])
## [1]  1 58
t_cf_monocyte_v3_de_sva <- all_pairwise(tv3_monocytes, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              6              7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10374 remaining).
## Setting 55 low elements to zero.
## transform_counts: Found 55 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_monocyte_v3_tables_sva <- combine_de_tables(
    t_cf_monocyte_v3_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_cf_monocyte_v3_tables_sva-v{ver}.xlsx"))
t_cf_monocyte_v3_sig_sva <- extract_significant_genes(
    t_cf_monocyte_v3_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_cf_monocyte_v3_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_monocyte_v3_sig_sva$deseq$ups[[1]])
## [1]  0 58
dim(t_cf_monocyte_v3_sig_sva$deseq$downs[[1]])
## [1]  4 58

4.2.4.1 Monocytes: Compare sva to batch-in-model

sva_aucc <- calculate_aucc(t_cf_monocyte_tables_sva[["data"]][[1]],
                           tbl2=t_cf_monocyte_tables_batchvisit[["data"]][[1]],
                           py="deseq_adjp", ly="deseq_logfc")
sva_aucc
## $aucc
## [1] 0.6943
## 
## $cor
## 
##  Pearson's product-moment correlation
## 
## data:  tbl3[[lx]] and tbl3[[ly]]
## t = 180, df = 10857, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8611 0.8705
## sample estimates:
##    cor 
## 0.8659 
## 
## 
## $plot

shared_ids <- rownames(t_cf_monocyte_tables_sva[["data"]][[1]]) %in%
  rownames(t_cf_monocyte_tables_batchvisit[["data"]][[1]])
first <- t_cf_monocyte_tables_sva[["data"]][[1]][shared_ids, ]
second <- t_cf_monocyte_tables_batchvisit[["data"]][[1]][rownames(first), ]
cor.test(first[["deseq_logfc"]], second[["deseq_logfc"]])
## 
##  Pearson's product-moment correlation
## 
## data:  first[["deseq_logfc"]] and second[["deseq_logfc"]]
## t = 180, df = 10857, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8611 0.8705
## sample estimates:
##    cor 
## 0.8659

4.2.4.2 Neutrophil samples

t_cf_neutrophil_de_sva <- all_pairwise(t_neutrophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             20             21
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9099 remaining).
## Setting 750 low elements to zero.
## transform_counts: Found 750 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_neutrophil_tables_sva <- combine_de_tables(
    t_cf_neutrophil_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_tables_sva-v{ver}.xlsx"))
t_cf_neutrophil_sig_sva <- extract_significant_genes(
    t_cf_neutrophil_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_neutrophil_sig_sva$deseq$ups[[1]])
## [1] 84 58
dim(t_cf_neutrophil_sig_sva$deseq$downs[[1]])
## [1] 29 58
t_cf_neutrophil_de_batchvisit <- all_pairwise(t_neutrophils, model_batch = TRUE, filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             20             21
## This analysis will include a batch factor in the model comprised of:
## 
##  3  2  1 
## 12 13 16
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_neutrophil_tables_batchvisit <- combine_de_tables(
    t_cf_neutrophil_de_batchvisit,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_tables_batchvisit-v{ver}.xlsx"))
t_cf_neutrophil_sig_batchvisit <- extract_significant_genes(
    t_cf_neutrophil_tables_batchvisit,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_sig_batchvisit-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_neutrophil_sig_batchvisit$deseq$ups[[1]])
## [1] 92 58
dim(t_cf_neutrophil_sig_batchvisit$deseq$downs[[1]])
## [1] 47 58

4.2.5 Neutrophils by time

visitcf_factor <- paste0("v", pData(t_neutrophils)[["visitnumber"]],
                         pData(t_neutrophils)[["finaloutcome"]])
t_neutrophil_visitcf <- set_expt_conditions(t_neutrophils, fact=visitcf_factor)
t_cf_neutrophil_visits_de_sva <- all_pairwise(t_neutrophil_visitcf, model_batch = "svaseq",
                                              filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##         8         8         7         6         5         7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9099 remaining).
## Setting 686 low elements to zero.
## transform_counts: Found 686 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_cf_neutrophil_visits_tables_sva <- combine_de_tables(
    t_cf_neutrophil_visits_de_sva,
    keepers = visitcf_contrasts,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_visitcf_tables_sva-v{ver}.xlsx"))
t_cf_neutrophil_visits_sig_sva <- extract_significant_genes(
    t_cf_neutrophil_visits_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_visitcf_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_neutrophil_visits_sig_sva$deseq$ups[[1]])
## [1] 12 47
dim(t_cf_neutrophil_visits_sig_sva$deseq$downs[[1]])
## [1]  6 47
t_cf_neutrophil_v1_de_sva <- all_pairwise(tv1_neutrophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              8              8
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (8715 remaining).
## Setting 145 low elements to zero.
## transform_counts: Found 145 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_neutrophil_v1_tables_sva <- combine_de_tables(
    t_cf_neutrophil_v1_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_v1_tables_sva-v{ver}.xlsx"))
t_cf_neutrophil_v1_sig_sva <- extract_significant_genes(
    t_cf_neutrophil_v1_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_v1_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_neutrophil_v1_sig_sva$deseq$ups[[1]])
## [1]  5 58
dim(t_cf_neutrophil_v1_sig_sva$deseq$downs[[1]])
## [1]  8 58
t_cf_neutrophil_v2_de_sva <- all_pairwise(tv2_neutrophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              7              6
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (8450 remaining).
## Setting 78 low elements to zero.
## transform_counts: Found 78 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_neutrophil_v2_tables_sva <- combine_de_tables(
    t_cf_neutrophil_v2_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_v2_tables_sva-v{ver}.xlsx"))
t_cf_neutrophil_v2_sig_sva <- extract_significant_genes(
    t_cf_neutrophil_v2_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_v2_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_neutrophil_v2_sig_sva$deseq$ups[[1]])
## [1]  9 58
dim(t_cf_neutrophil_v2_sig_sva$deseq$downs[[1]])
## [1]  3 58
t_cf_neutrophil_v3_de_sva <- all_pairwise(tv3_neutrophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              5              7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (8503 remaining).
## Setting 83 low elements to zero.
## transform_counts: Found 83 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_neutrophil_v3_tables_sva <- combine_de_tables(
    t_cf_neutrophil_v3_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_v3_tables_sva-v{ver}.xlsx"))
t_cf_neutrophil_v3_sig_sva <- extract_significant_genes(
    t_cf_neutrophil_v3_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_cf_neutrophil_v3_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_neutrophil_v3_sig_sva$deseq$ups[[1]])
## [1]  5 58
dim(t_cf_monocyte_v3_sig_sva$deseq$downs[[1]])
## [1]  4 58

4.2.5.1 Neutrophils: Compare sva to batch-in-model

sva_aucc <- calculate_aucc(t_cf_neutrophil_tables_sva[["data"]][[1]],
                           tbl2=t_cf_neutrophil_tables_batchvisit[["data"]][[1]],
                           py="deseq_adjp", ly="deseq_logfc")
sva_aucc
## $aucc
## [1] 0.611
## 
## $cor
## 
##  Pearson's product-moment correlation
## 
## data:  tbl3[[lx]] and tbl3[[ly]]
## t = 192, df = 9097, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8915 0.8996
## sample estimates:
##    cor 
## 0.8956 
## 
## 
## $plot

shared_ids <- rownames(t_cf_neutrophil_tables_sva[["data"]][[1]]) %in%
  rownames(t_cf_neutrophil_tables_batchvisit[["data"]][[1]])
first <- t_cf_neutrophil_tables_sva[["data"]][[1]][shared_ids, ]
second <- t_cf_neutrophil_tables_batchvisit[["data"]][[1]][rownames(first), ]
cor.test(first[["deseq_logfc"]], second[["deseq_logfc"]])
## 
##  Pearson's product-moment correlation
## 
## data:  first[["deseq_logfc"]] and second[["deseq_logfc"]]
## t = 192, df = 9097, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8915 0.8996
## sample estimates:
##    cor 
## 0.8956

4.2.5.2 Eosinophils

t_cf_eosinophil_de_sva <- all_pairwise(t_eosinophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             17              9
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10530 remaining).
## Setting 325 low elements to zero.
## transform_counts: Found 325 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_eosinophil_tables_sva <- combine_de_tables(
    t_cf_eosinophil_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_tables_sva-v{ver}.xlsx"))
t_cf_eosinophil_sig_sva <- extract_significant_genes(
    t_cf_eosinophil_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_eosinophil_sig_sva$deseq$ups[[1]])
## [1] 116  58
dim(t_cf_eosinophil_sig_sva$deseq$downs[[1]])
## [1] 74 58
t_cf_eosinophil_de_batchvisit <- all_pairwise(t_eosinophils, model_batch = TRUE, filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##             17              9
## This analysis will include a batch factor in the model comprised of:
## 
## 3 2 1 
## 9 9 8
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_eosinophil_tables_batchvisit <- combine_de_tables(
    t_cf_eosinophil_de_batchvisit,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_tables_batchvisit-v{ver}.xlsx"))
t_cf_eosinophil_sig_batchvisit <- extract_significant_genes(
    t_cf_eosinophil_tables_batchvisit,
    excel = glue::glue("excel/t_cf_eosinophil_sig_batchvisit-v{ver}.xlsx"))
## Deleting the file excel/t_cf_eosinophil_sig_batchvisit-v202207.xlsx before writing the tables.
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_eosinophil_sig_batchvisit$deseq$ups[[1]])
## [1] 99 58
dim(t_cf_eosinophil_sig_batchvisit$deseq$downs[[1]])
## [1] 35 58
visitcf_factor <- paste0("v", pData(t_eosinophils)[["visitnumber"]],
                         pData(t_eosinophils)[["finaloutcome"]])
t_eosinophil_visitcf <- set_expt_conditions(t_eosinophils, fact=visitcf_factor)
t_cf_eosinophil_visits_de_sva <- all_pairwise(t_eosinophil_visitcf, model_batch = "svaseq",
                                              filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##         5         3         6         3         6         3
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10530 remaining).
## Setting 374 low elements to zero.
## transform_counts: Found 374 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_cf_eosinophil_visits_tables_sva <- combine_de_tables(
    t_cf_eosinophil_visits_de_sva,
    keepers = visitcf_contrasts,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_visitcf_tables_sva-v{ver}.xlsx"))
t_cf_eosinophil_visits_sig_sva <- extract_significant_genes(
    t_cf_eosinophil_visits_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_visitcf_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_eosinophil_visits_sig_sva$deseq$ups[[1]])
## [1]  9 47
dim(t_cf_eosinophil_visits_sig_sva$deseq$downs[[1]])
## [1] 11 47

4.2.6 Eosinophil time comparisons

t_cf_eosinophil_v1_de_sva <- all_pairwise(tv1_eosinophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              5              3
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9977 remaining).
## Setting 57 low elements to zero.
## transform_counts: Found 57 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_eosinophil_v1_tables_sva <- combine_de_tables(
    t_cf_eosinophil_v1_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_v1_tables_sva-v{ver}.xlsx"))
t_cf_eosinophil_v1_sig_sva <- extract_significant_genes(
    t_cf_eosinophil_v1_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_v1_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_eosinophil_v1_sig_sva$deseq$ups[[1]])
## [1] 13 58
dim(t_cf_eosinophil_v1_sig_sva$deseq$downs[[1]])
## [1] 19 58
t_cf_eosinophil_v2_de_sva <- all_pairwise(tv2_eosinophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              6              3
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10115 remaining).
## Setting 90 low elements to zero.
## transform_counts: Found 90 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_eosinophil_v2_tables_sva <- combine_de_tables(
    t_cf_eosinophil_v2_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_v2_tables_sva-v{ver}.xlsx"))
t_cf_eosinophil_v2_sig_sva <- extract_significant_genes(
    t_cf_eosinophil_v2_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_v2_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_eosinophil_v2_sig_sva$deseq$ups[[1]])
## [1]  9 58
dim(t_cf_eosinophil_v2_sig_sva$deseq$downs[[1]])
## [1]  4 58
t_cf_eosinophil_v3_de_sva <- all_pairwise(tv3_eosinophils, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    Tumaco_cure Tumaco_failure 
##              6              3
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10078 remaining).
## Setting 48 low elements to zero.
## transform_counts: Found 48 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
t_cf_eosinophil_v3_tables_sva <- combine_de_tables(
    t_cf_eosinophil_v3_de_sva,
    keepers = cf_contrast,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_v3_tables_sva-v{ver}.xlsx"))
t_cf_eosinophil_v3_sig_sva <- extract_significant_genes(
    t_cf_eosinophil_v3_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_cf_eosinophil_v3_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
dim(t_cf_eosinophil_v3_sig_sva$deseq$ups[[1]])
## [1] 68 58
dim(t_cf_eosinophil_v3_sig_sva$deseq$downs[[1]])
## [1] 29 58

4.2.6.1 Eosinophils: Compare sva to batch-in-visit

sva_aucc <- calculate_aucc(t_cf_eosinophil_tables_sva[["data"]][[1]],
                           tbl2=t_cf_eosinophil_tables_batchvisit[["data"]][[1]],
                           py="deseq_adjp", ly="deseq_logfc")
sva_aucc
## $aucc
## [1] 0.5764
## 
## $cor
## 
##  Pearson's product-moment correlation
## 
## data:  tbl3[[lx]] and tbl3[[ly]]
## t = 152, df = 10528, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8232 0.8352
## sample estimates:
##    cor 
## 0.8293 
## 
## 
## $plot

shared_ids <- rownames(t_cf_eosinophil_tables_sva[["data"]][[1]]) %in%
  rownames(t_cf_eosinophil_tables_batchvisit[["data"]][[1]])
first <- t_cf_eosinophil_tables_sva[["data"]][[1]][shared_ids, ]
second <- t_cf_eosinophil_tables_batchbisit[["data"]][[1]][rownames(first), ]
## Error in eval(expr, envir, enclos): object 't_cf_eosinophil_tables_batchbisit' not found
cor.test(first[["deseq_logfc"]], second[["deseq_logfc"]])
## Error in cor.test.default(first[["deseq_logfc"]], second[["deseq_logfc"]]): 'x' and 'y' must have the same length

4.2.6.2 Compare monocyte CF, neutrophil CF, eosinophil CF

t_mono_neut_sva_aucc <- calculate_aucc(t_cf_monocyte_tables_sva[["data"]][[1]],
                                       tbl2=t_cf_neutrophil_tables_sva[["data"]][[1]],
                                       py="deseq_adjp", ly="deseq_logfc")
t_mono_neut_sva_aucc
## $aucc
## [1] 0.2058
## 
## $cor
## 
##  Pearson's product-moment correlation
## 
## data:  tbl3[[lx]] and tbl3[[ly]]
## t = 43, df = 8575, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4033 0.4381
## sample estimates:
##    cor 
## 0.4209 
## 
## 
## $plot

t_mono_eo_sva_aucc <- calculate_aucc(t_cf_monocyte_tables_sva[["data"]][["fail_vs_cure"]],
                                     tbl2=t_cf_eosinophil_tables_sva[["data"]][["fail_vs_cure"]],
                                     py="deseq_adjp", ly="deseq_logfc")
## Error in cor.test(tbl3[[lx]], tbl3[[ly]]): object 'tbl3' not found
t_mono_eo_sva_aucc
## Error in eval(expr, envir, enclos): object 't_mono_eo_sva_aucc' not found
t_neut_eo_sva_aucc <- calculate_aucc(t_cf_neutrophil_tables_sva[["data"]][["fail_vs_cure"]],
                                     tbl2=t_cf_eosinophil_tables_sva[["data"]][["fail_vs_cure"]],
                                     py="deseq_adjp", ly="deseq_logfc")
## Error in cor.test(tbl3[[lx]], tbl3[[ly]]): object 'tbl3' not found
t_neut_eo_sva_aucc
## Error in eval(expr, envir, enclos): object 't_neut_eo_sva_aucc' not found

4.2.7 By visit

For these contrasts, we want to see fail_v1 vs. cure_v1, fail_v2 vs. cure_v2 etc. As a result, we will need to juggle the data slightly and add another set of contrasts.

4.2.7.1 Cure/Fail by visits, all cell types

t_visit_cf_all_de_sva <- all_pairwise(t_visitcf, model_batch = "svaseq", filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##        30        24        20        15        17        17
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (14149 remaining).
## Setting 17117 low elements to zero.
## transform_counts: Found 17117 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_cf_all_tables_sva <- combine_de_tables(
    t_visit_cf_all_de_sva,
    keepers = visitcf_contrasts,
    excel = glue::glue("analyses/4_tumaco/DE_Cure_vs_Fail/t_visit_cf_all_tables_sva-v{ver}.xlsx"))
t_visit_cf_all_sig_sva <- extract_significant_genes(
    t_visit_cf_all_tables_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Cure_vs_Fail/t_visit_cf_all_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: basic_adjp.

4.2.7.2 Cure/Fail by visit, Monocytes

visitcf_factor <- paste0("v", pData(t_monocytes)[["visitnumber"]], "_",
                         pData(t_monocytes)[["finaloutcome"]])
t_monocytes_visitcf <- set_expt_conditions(t_monocytes, fact=visitcf_factor)

t_visit_cf_monocyte_de_sva <- all_pairwise(t_monocytes_visitcf, model_batch = "svaseq",
                                           filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          8          8          7          6          6          7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10859 remaining).
## Setting 688 low elements to zero.
## transform_counts: Found 688 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_cf_monocyte_tables_sva <- combine_de_tables(
    t_visit_cf_monocyte_de_sva,
    keepers = visitcf_contrasts,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_visit_cf_monocyte_tables_sva-v{ver}.xlsx"))
t_visit_cf_monocyte_sig_sva <- extract_significant_genes(
    t_visit_cf_monocyte_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Monocytes/t_visit_cf_monocyte_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: basic_adjp.
t_v1fc_deseq_ma <- t_visit_cf_monocyte_tables_sva[["plots"]][["v1cf"]][["deseq_ma_plots"]][["plot"]]
dev <- pp(file="images/monocyte_cf_de_v1_maplot.png")
t_v1fc_deseq_ma
closed <- dev.off()
t_v1fc_deseq_ma

t_v2fc_deseq_ma <- t_visit_cf_monocyte_tables_sva[["plots"]][["v2cf"]][["deseq_ma_plots"]][["plot"]]
dev <- pp(file="images/monocyte_cf_de_v2_maplot.png")
t_v2fc_deseq_ma
closed <- dev.off()
t_v2fc_deseq_ma

t_v3fc_deseq_ma <- t_visit_cf_monocyte_tables_sva[["plots"]][["v3cf"]][["deseq_ma_plots"]][["plot"]]
dev <- pp(file="images/monocyte_cf_de_v3_maplot.png")
t_v3fc_deseq_ma
closed <- dev.off()
t_v3fc_deseq_ma

One query from Alejandro is to look at the genes shared up/down across visits. I am not entirely certain we have enough samples for this to work, but let us find out.

I am thinking this is a good place to use the AUCC curves I learned about thanks to Julie Cridland.

Note that the following is all monocyte samples, this should therefore potentially be moved up and a version of this with only the Tumaco samples put here?

v1cf <- t_visit_cf_monocyte_tables_sva[["data"]][["v1cf"]]
v2cf <- t_visit_cf_monocyte_tables_sva[["data"]][["v2cf"]]
v3cf <- t_visit_cf_monocyte_tables_sva[["data"]][["v3cf"]]

v1_sig <- c(
    rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["ups"]][["v1cf"]]),
    rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["downs"]][["v1cf"]]))
length(v1_sig)
## [1] 25
v2_sig <- c(
    rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["ups"]][["v2cf"]]),
    rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["downs"]][["v2cf"]]))
length(v2_sig)
## [1] 0
v3_sig <- c(
    rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["ups"]][["v2cf"]]),
    rownames(t_visit_cf_monocyte_sig_sva[["deseq"]][["downs"]][["v2cf"]]))
length(v3_sig)
## [1] 0
t_monocyte_visit_aucc_v2v1 <- calculate_aucc(v1cf, tbl2=v2cf, py="deseq_adjp", ly="deseq_logfc")
dev <- pp(file="images/monocyte_visit_v2v1_aucc.png")
t_monocyte_visit_aucc_v2v1[["plot"]]
closed <- dev.off()
t_monocyte_visit_aucc_v2v1[["plot"]]

t_monocyte_visit_aucc_v3v1 <- calculate_aucc(v1cf, tbl2=v3cf, py="deseq_adjp", ly="deseq_logfc")
dev <- pp(file="images/monocyte_visit_v3v1_aucc.png")
t_monocyte_visit_aucc_v3v1[["plot"]]
closed <- dev.off()
t_monocyte_visit_aucc_v3v1[["plot"]]

4.2.7.3 Cure/Fail by visit, Neutrophils

visitcf_factor <- paste0("v", pData(t_neutrophils)[["visitnumber"]], "_",
                         pData(t_neutrophils)[["finaloutcome"]])
t_neutrophil_visitcf <- set_expt_conditions(t_neutrophils, fact=visitcf_factor)
t_visit_cf_neutrophil_de_sva <- all_pairwise(t_neutrophil_visitcf, model_batch = "svaseq",
                                             filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          8          8          7          6          5          7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9099 remaining).
## Setting 686 low elements to zero.
## transform_counts: Found 686 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_cf_neutrophil_tables_sva <- combine_de_tables(
    t_visit_cf_neutrophil_de_sva,
    keepers = visitcf_contrasts,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_visit_cf_neutrophil_tables_sva-v{ver}.xlsx"))
t_visit_cf_neutrophil_sig_sva <- extract_significant_genes(
    t_visit_cf_neutrophil_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Neutrophils/t_visit_cf_neutrophil_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: basic_adjp.

4.2.7.4 Cure/Fail by visit, Eosinophils

visitcf_factor <- paste0("v", pData(t_eosinophils)[["visitnumber"]], "_",
                         pData(t_eosinophils)[["finaloutcome"]])
t_eosinophil_visitcf <- set_expt_conditions(t_eosinophils, fact=visitcf_factor)
t_visit_cf_eosinophil_de_sva <- all_pairwise(t_eosinophil_visitcf, model_batch = "svaseq",
                                             filter = TRUE)
## This DE analysis will perform all pairwise comparisons among:
## 
##    v1_cure v1_failure    v2_cure v2_failure    v3_cure v3_failure 
##          5          3          6          3          6          3
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10530 remaining).
## Setting 374 low elements to zero.
## transform_counts: Found 374 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_cf_eosinophil_tables_sva <- combine_de_tables(
    t_visit_cf_eosinophil_de_sva,
    keepers = visitcf_contrasts,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_visit_cf_eosinophil_tables_sva-v{ver}.xlsx"))
t_visit_cf_eosinophil_sig_sva <- extract_significant_genes(
    t_visit_cf_eosinophil_tables_sva,
    excel = glue::glue("{xlsx_prefix}/Eosinophils/t_visit_cf_eosinophil_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: basic_adjp.

4.3 Persistence in visit 3

Having put some SL read mapping information in the sample sheet, Maria Adelaida added a new column using it with the putative persistence state on a per-sample basis. One question which arised from that: what differences are observable between the persistent yes vs. no samples on a per-cell-type basis among the visit 3 samples.

4.3.1 Setting up

First things first, create the datasets.

persistence_expt <- subset_expt(t_clinical, subset = "persistence=='Y'|persistence=='N'") %>%
  subset_expt(subset = 'visitnumber==3') %>%
  set_expt_conditions(fact = 'persistence')
## subset_expt(): There were 123, now there are 97 samples.
## subset_expt(): There were 97, now there are 30 samples.
## persistence_biopsy <- subset_expt(persistence_expt, subset = "typeofcells=='biopsy'")
persistence_monocyte <- subset_expt(persistence_expt, subset = "typeofcells=='monocytes'")
## subset_expt(): There were 30, now there are 12 samples.
persistence_neutrophil <- subset_expt(persistence_expt, subset = "typeofcells=='neutrophils'")
## subset_expt(): There were 30, now there are 10 samples.
persistence_eosinophil <- subset_expt(persistence_expt, subset = "typeofcells=='eosinophils'")
## subset_expt(): There were 30, now there are 8 samples.

4.3.2 Take a look

See if there are any patterns which look usable.

## All
persistence_norm <- normalize_expt(persistence_expt, transform = "log2", convert = "cpm",
                                   norm = "quant", filter = TRUE)
## Removing 8537 low-count genes (11386 remaining).
## transform_counts: Found 15 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_norm)$plot
## Warning: ggrepel: 6 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

persistence_nb <- normalize_expt(persistence_expt, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 8537 low-count genes (11386 remaining).
## Setting 1538 low elements to zero.
## transform_counts: Found 1538 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_nb)$plot

## Biopsies
##persistence_biopsy_norm <- normalize_expt(persistence_biopsy, transform = "log2", convert = "cpm",
##                                   norm = "quant", filter = TRUE)
##plot_pca(persistence_biopsy_norm)$plot
## Insufficient data

## Monocytes
persistence_monocyte_norm <- normalize_expt(persistence_monocyte, transform = "log2", convert = "cpm",
                                            norm = "quant", filter = TRUE)
## Removing 9597 low-count genes (10326 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_monocyte_norm)$plot

persistence_monocyte_nb <- normalize_expt(persistence_monocyte, transform = "log2", convert = "cpm",
                                          batch = "svaseq", filter = TRUE)
## Removing 9597 low-count genes (10326 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_monocyte_nb)$plot

## Neutrophils
persistence_neutrophil_norm <- normalize_expt(persistence_neutrophil, transform = "log2", convert = "cpm",
                                              norm = "quant", filter = TRUE)
## Removing 11531 low-count genes (8392 remaining).
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_neutrophil_norm)$plot

persistence_neutrophil_nb <- normalize_expt(persistence_neutrophil, transform = "log2", convert = "cpm",
                                            batch = "svaseq", filter = TRUE)
## Removing 11531 low-count genes (8392 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_neutrophil_nb)$plot

## Eosinophils
persistence_eosinophil_norm <- normalize_expt(persistence_eosinophil, transform = "log2", convert = "cpm",
                                              norm = "quant", filter = TRUE)
## Removing 9895 low-count genes (10028 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_eosinophil_norm)$plot

persistence_eosinophil_nb <- normalize_expt(persistence_eosinophil, transform = "log2", convert = "cpm",
                                            batch = "svaseq", filter = TRUE)
## Removing 9895 low-count genes (10028 remaining).
## Setting 25 low elements to zero.
## transform_counts: Found 25 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_eosinophil_nb)$plot

4.3.3 persistence DE

persistence_de_sva <- all_pairwise(persistence_expt, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##  N  Y 
##  6 24
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11386 remaining).
## Setting 1538 low elements to zero.
## transform_counts: Found 1538 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_table_sva <- combine_de_tables(
    persistence_de_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Persistence/persistence_all_de_sva-v{ver}.xlsx"))

persistence_monocyte_de_sva <- all_pairwise(persistence_monocyte, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##  N  Y 
##  2 10
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10326 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_monocyte_table_sva <- combine_de_tables(
    persistence_monocyte_de_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Persistence/persistence_monocyte_de_sva-v{ver}.xlsx"))

persistence_neutrophil_de_sva <- all_pairwise(persistence_neutrophil, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
## N Y 
## 3 7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (8392 remaining).
## Setting 46 low elements to zero.
## transform_counts: Found 46 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_neutrophil_table_sva <- combine_de_tables(
    persistence_neutrophil_de_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Persistence/persistence_neutrophil_de_sva-v{ver}.xlsx"))

persistence_eosinophil_de_sva <- all_pairwise(persistence_eosinophil, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
## N Y 
## 1 7
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10028 remaining).
## Setting 25 low elements to zero.
## transform_counts: Found 25 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_eosinophil_table_sva <- combine_de_tables(
    persistence_eosinophil_de_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Persistence/persistence_eosinophil_de_sva-v{ver}.xlsx"))

4.4 Comparing visits without regard to cure/fail

4.4.1 All cell types

t_visit_all_de_sva <- all_pairwise(t_visit, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##  3  2  1 
## 34 35 40
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (11907 remaining).
## Setting 9614 low elements to zero.
## transform_counts: Found 9614 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_all_table_sva <- combine_de_tables(
    t_visit_all_de_sva,
    keepers = visit_contrasts,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/t_visit_all_tables_sva-v{ver}.xlsx"))
t_visit_all_sig_sva <- extract_significant_genes(
    t_visit_all_table_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/t_visit_all_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
t_visit_all_saved <- save(list = "t_visit_all_table_sva",
                          file = glue::glue("rda/visit_all_table-v{ver}.rda"))

4.4.2 Monocyte samples

t_visit_monocytes <- set_expt_conditions(t_monocytes, fact="visitnumber")
t_visit_monocyte_de_sva <- all_pairwise(t_visit_monocytes, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##  3  2  1 
## 13 13 16
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10859 remaining).
## Setting 648 low elements to zero.
## transform_counts: Found 648 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_monocyte_table_sva <- combine_de_tables(
    t_visit_monocyte_de_sva,
    keepers = visit_contrasts,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Monocytes/t_visit_monocyte_tables_sva-v{ver}.xlsx"))
t_visit_monocyte_sig_sva <- extract_significant_genes(
    t_visit_monocyte_table_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Monocytes/t_visit_monocyte_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.

4.4.3 Neutrophil samples

t_visit_neutrophils <- set_expt_conditions(t_neutrophils, fact="visitnumber")
t_visit_neutrophil_de_sva <- all_pairwise(t_visit_neutrophils, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
##  3  2  1 
## 12 13 16
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (9099 remaining).
## Setting 589 low elements to zero.
## transform_counts: Found 589 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_neutrophil_table_sva <- combine_de_tables(
    t_visit_neutrophil_de_sva,
    keepers = visit_contrasts,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Neutrophils/t_visit_neutrophil_table_sva-v{ver}.xlsx"))
t_visit_neutrophil_sig_sva <- extract_significant_genes(
    t_visit_neutrophil_table_sva,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Neutrophils/t_visit_neutrophil_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
visit_neutrophil_saved <- save(list = "t_visit_neutrophil_table_sva",
                               file = glue::glue("rda/visit_neutrophil_table_sva-v{ver}.rda"))

4.4.4 Eosinophil samples

t_visit_eosinophils <- set_expt_conditions(t_eosinophils, fact="visitnumber")
t_visit_eosinophil_de <- all_pairwise(t_visit_eosinophils, filter = TRUE, model_batch = "svaseq")
## This DE analysis will perform all pairwise comparisons among:
## 
## 3 2 1 
## 9 9 8
## This analysis will include surrogate estimates from: svaseq.
## This will pre-filter the input data using normalize_expt's: TRUE argument.
## Removing 0 low-count genes (10530 remaining).
## Setting 272 low elements to zero.
## transform_counts: Found 272 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

t_visit_eosinophil_table <- combine_de_tables(
    t_visit_eosinophil_de,
    keepers = visit_contrasts,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Eosinophils/t_visit_eosinophil_table_sva-v{ver}.xlsx"))
t_visit_eosinophil_sig <- extract_significant_genes(
    t_visit_eosinophil_table,
    excel = glue::glue("analyses/4_tumaco/DE_Visits/Eosinophils/t_visit_eosinophil_sig_sva-v{ver}.xlsx"))
## Using p column: limma_adjp.
## Using p column: edger_adjp.
## Using p column: deseq_adjp.
## Using p column: ebseq_adjp.
## Using p column: basic_adjp.
visit_eosinophil_saved <- save(list = "t_visit_eosinophil_table",
                               file = glue::glue("rda/visit_eosinophil_table-v{ver}.rda"))
if (!isTRUE(get0("skip_load"))) {
  pander::pander(sessionInfo())
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  message(paste0("Saving to ", savefile))
  tmp <- sm(saveme(filename=savefile))
}
tmp <- loadme(filename=savefile)
LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDIyMDc6IERpZmZlcmVudGlhbCBFeHByZXNzaW9uIGFuYWx5c2VzIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiBkZWZhdWx0CiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZT4KYm9keSAubWFpbi1jb250YWluZXIgewptYXgtd2lkdGg6IDE2MDBweDsKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShocGdsdG9vbHMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZm9yY2F0cykKdHQgPC0gc20oZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpKQprbml0cjo6b3B0c19rbml0JHNldChwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTkwLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0PTgsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMikpCnZlciA8LSAiMjAyMjA3IgpwcmV2aW91c19maWxlIDwtICIiCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKCiMjdG1wIDwtIHRyeShzbShsb2FkbWUoZmlsZW5hbWU9Z3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSJcXC5yZGFcXC54eiIsIHg9cHJldmlvdXNfZmlsZSkpKSkKcm1kX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgidG1yYzNfZGlmZmVyZW50aWFsX2V4cHJlc3Npb25fe3Zlcn0uUm1kIikKc2F2ZWZpbGUgPC0gZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSJcXC5yZGFcXC54eiIsIHg9cm1kX2ZpbGUpCmxvYWRlZCA8LSBsb2FkKGZpbGU9Z2x1ZTo6Z2x1ZSgicmRhL3RtcmMzX2RhdGFfc3RydWN0dXJlcy12e3Zlcn0ucmRhIikpCmBgYAoKIyBJbnRyb2R1Y3Rpb24KClRoZSB2YXJpb3VzIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2VzIG9mIHRoZSBkYXRhIGdlbmVyYXRlZCBpbiB0bXJjM19kYXRhc2V0cwp3aWxsIG9jY3VyIGluIHRoaXMgZG9jdW1lbnQuCgojIyBOYW1pbmcgY29udmVudGlvbnMKCkkgYW0gZ29pbmcgdG8gdHJ5IHRvIHN0YW5kYXJkaXplIGhvdyBJIG5hbWUgdGhlIHZhcmlvdXMgZGF0YQpzdHJ1Y3R1cmVzIGNyZWF0ZWQgaW4gdGhpcyBkb2N1bWVudC4gIE1vc3Qgb2YgdGhlIGxhcmdlIGRhdGEgY3JlYXRlZAphcmUgZWl0aGVyIHNldHMgb2YgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5hbHlzZXMsIHRoZWlyIGNvbWJpbmVkCnJlc3VsdHMsIG9yIHRoZSBzZXQgb2YgcmVzdWx0cyBkZWVtZWQgJ3NpZ25pZmljYW50Jy4KCkhvcGVmdWxseSBieSBub3cgdGhleSBhbGwgZm9sbG93IHRoZXNlIGd1aWRlbGluZXM6Cgp7Y2xpbmljKHMpfV9zYW1wbGUtc3Vic2V0fV97cHJpbWFyeS1xdWVzdGlvbihzKX1fe2RhdGF0eXBlfV97YmF0Y2gtbWV0aG9kfQoKKiB7Y2xpbmljfTogVGhpcyBpcyBlaXRoZXIgdGMgb3IgdCBmb3IgVHVtYWNvIGFuZCBDYWxpLCBvciBqdXN0CiAgVHVtYWNvLgoqIHtzYW1wbGUtc3Vic2V0fTogVGhpbmdzIGxpa2UgJ2FsbCcgb3IgJ21vbm9jeXRlcycuCioge3ByaW1hcnktcXVlc3Rpb259OiBTaG9ydGhhbmQgbmFtZSBmb3IgdGhlIHByaW1hcnkgY29udHJhc3RzCiAgcGVyZm9ybWVkLCB0aHVzICdjbGluaWNzJyB3b3VsZCBzdWdnZXN0IGEgY29tcGFyaXNvbiBvZiBUdW1hY28KICB2cy4gQ2FsaS4gICd2aXNpdHMnIHdvdWxkIGNvbXBhcmUgdjIvdjEsIGV0Yy4KKiB7ZGF0YXR5cGV9OiBkZSwgdGFibGUsIHNpZwoqIHtiYXRjaC10eXBlfTogbm9iYXRjaCwgYmF0Y2h7ZmFjdG9yfSwgc3ZhLiAge2ZhY3Rvcn0gaW4gdGhpcwogIGluc3RhbmNlIHNob3VsZCBiZSBhIGNvbHVtbiBmcm9tIHRoZSBtZXRhZGF0YS4KCldpdGggdGhpcyBpbiBtaW5kLCAndGNfYmlvcHNpZXNfY2xpbmljX2RlX3N2YScgc2hvdWxkIGJlIHRoZSBUdW1hY28rQ2FsaQpiaW9wc3kgZGF0YSBhZnRlciBwZXJmb3JtaW5nIHRoZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNlcwpjb21wYXJpbmcgdGhlIGNsaW5pY3MgdXNpbmcgc3ZhLgoKSSBzdXNwZWN0IHRoZXJlIHJlbWFpbiBzb21lIGV4Y2VwdGlvbnMgYW5kL29yIGVycm9ycy4KCiMjIERlZmluZSBjb250cmFzdHMgZm9yIERFIGFuYWx5c2VzCgpgYGB7ciBzZXR1cF9jb250cmFzdHN9CmNsaW5pY19jb250cmFzdHMgPC0gbGlzdCgKICAgICJjbGluaWNzIiA9IGMoIkNhbGkiLCAiVHVtYWNvIikpCiMjIEluIHNvbWUgY2FzZXMgd2UgaGF2ZSBubyBDYWxpIGZhaWx1cmUgc2FtcGxlcywgc28gdGhlcmUgcmVtYWluIG9ubHkgMgojIyBjb250cmFzdHMgdGhhdCBhcmUgbGlrZWx5IG9mIGludGVyZXN0CnRjX2NmX2NvbnRyYXN0cyA8LSBsaXN0KAogICAgInR1bWFjbyIgPSBjKCJUdW1hY29mYWlsdXJlIiwgIlR1bWFjb2N1cmUiKSwKICAgICJjdXJlIiA9IGMoIlR1bWFjb2N1cmUiLCAiQ2FsaWN1cmUiKSkKIyMgSW4gb3RoZXIgY2FzZXMsIHdlIGhhdmUgY3VyZS9mYWlsIGZvciBib3RoIHBsYWNlcy4KY2xpbmljX2NmX2NvbnRyYXN0cyA8LSBsaXN0KAogICAgImNhbGkiID0gYygiQ2FsaWZhaWx1cmUiLCAiQ2FsaWN1cmUiKSwKICAgICJ0dW1hY28iID0gYygiVHVtYWNvZmFpbHVyZSIsICJUdW1hY29jdXJlIiksCiAgICAiY3VyZSIgPSBjKCJUdW1hY29jdXJlIiwgIkNhbGljdXJlIiksCiAgICAiZmFpbCIgPSBjKCJUdW1hY29mYWlsdXJlIiwgIkNhbGlmYWlsdXJlIikpCmNmX2NvbnRyYXN0IDwtIGxpc3QoCiAgICAib3V0Y29tZSIgPSBjKCJUdW1hY29mYWlsdXJlIiwgIlR1bWFjb2N1cmUiKSkKdF9jZl9jb250cmFzdCA8LSBsaXN0KAogICAgIm91dGNvbWUiID0gYygiZmFpbHVyZSIsICJjdXJlIikpCnZpc2l0Y2ZfY29udHJhc3RzIDwtIGxpc3QoCiAgICAidjFjZiIgPSBjKCJ2MWZhaWx1cmUiLCAidjFjdXJlIiksCiAgICAidjJjZiIgPSBjKCJ2MmZhaWx1cmUiLCAidjJjdXJlIiksCiAgICAidjNjZiIgPSBjKCJ2M2ZhaWx1cmUiLCAidjNjdXJlIikpCnZpc2l0X2NvbnRyYXN0cyA8LSBsaXN0KAogICAgInYydjEiID0gYygiYzIiLCAiYzEiKSwKICAgICJ2M3YxIiA9IGMoImMzIiwgImMxIiksCiAgICAidjN2MiIgPSBjKCJjMyIsICJjMiIpKQpgYGAKCiMgQ29tcGFyZSBzYW1wbGVzIGJ5IGNsaW5pYwoKIyMgREU6IENvbXBhcmUgY2xpbmljcywgYWxsIHNhbXBsZXMKClBlcmZvcm0gYSBzdmFzZXEtZ3VpZGVkIGNvbXBhcmlzb24gb2YgdGhlIHR3byBjbGluaWNzLiAgSWRlYWxseSB0aGlzCndpbGwgZ2l2ZSBzb21lIGNsdWUgYWJvdXQganVzdCBob3cgc3Ryb25nIHRoZSBjbGluaWMtYmFzZWQgYmF0Y2gKZWZmZWN0IHJlYWxseSBpcyBhbmQgd2hhdCBpdHMgY2F1c2VzIGFyZS4KCmBgYHtyIGNsaW5pY19jb21wYXJpc29uc19hbGx9CnRjX2NsaW5pY190eXBlIDwtIHRjX3ZhbGlkICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdD0iY2xpbmljIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJ0eXBlb2ZjZWxscyIpCgp0YWJsZShwRGF0YSh0Y19jbGluaWNfdHlwZSlbWyJjb25kaXRpb24iXV0pCnRjX2FsbF9jbGluaWNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0Y19jbGluaWNfdHlwZSwgbW9kZWxfYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKQp0Y19hbGxfY2xpbmljX2RlX3N2YVtbImRlc2VxIl1dW1siY29udHJhc3RzX3BlcmZvcm1lZCJdXQoKdGNfYWxsX2NsaW5pY190YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19hbGxfY2xpbmljX2RlX3N2YSwga2VlcGVycz1jbGluaWNfY29udHJhc3RzLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY29tcGFyZV9jbGluaWNzL3RjX2FsbF9jbGluaWNfdGFibGVfc3ZhLXZ7dmVyfS54bHN4IikpCnRjX2FsbF9jbGluaWNfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdGNfYWxsX2NsaW5pY190YWJsZV9zdmEsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jb21wYXJlX2NsaW5pY3MvdGNfY2xpbmljX3R5cGVfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIERFOiBDb21wYXJlIGNsaW5pY3MsIGJpb3BzeSBzYW1wbGVzCgpJbnRlcmVzdGluZ2x5IHRvIG1lLCB0aGUgYmlvcHN5IHNhbXBsZXMgYXBwZWFyIHRvIGhhdmUgdGhlIGxlYXN0CmxvY2F0aW9uLWJhc2VkIHZhcmlhbmNlLiAgQnV0IHdlIGNhbiBwZXJmb3JtIGFuIGV4cGxpY2l0IERFIGFuZCBzZWUKaG93IHdlbGwgdGhhdCBoeXBvdGhlc2lzIGhvbGRzIHVwLgoKTm90ZSB0aGF0IHRoZXNlIGRhdGEgaW5jbHVkZSBjdXJlIGFuZCBmYWlsIHNhbXBsZXMgZm9yCgpgYGB7ciB0Y19iaW9wc2llc19kZX0KdGFibGUocERhdGEodGNfYmlvcHNpZXMpW1siY29uZGl0aW9uIl1dKQp0Y19iaW9wc2llc19jbGluaWNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0Y19iaW9wc2llcywgbW9kZWxfYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKQp0Y19iaW9wc2llc19jbGluaWNfZGVfc3ZhW1siZGVzZXEiXV1bWyJjb250cmFzdHNfcGVyZm9ybWVkIl1dCgp0Y19iaW9wc2llc19jbGluaWNfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdGNfYmlvcHNpZXNfY2xpbmljX2RlX3N2YSwga2VlcGVycz10Y19jZl9jb250cmFzdHMsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jbGluaWNfY2YvQmlvcHNpZXMvdGNfYmlvcHNpZXNfY2xpbmljX3RhYmxlX3N2YS12e3Zlcn0ueGxzeCIpKQp0Y19iaW9wc2llc19jbGluaWNfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdGNfYmlvcHNpZXNfY2xpbmljX3RhYmxlX3N2YSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NsaW5pY19jZi9CaW9wc2llcy90Y19iaW9wc2llc19jbGluaWNfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIERFOiBDb21wYXJlIGNsaW5pY3MsIGVvc2lub3BoaWwgc2FtcGxlcwoKVGhlIHJlbWFpbmluZyBjZWxsIHR5cGVzIGFsbCBoYXZlIHByZXR0eSBzdHJvbmcgY2xpbmljLWJhc2VkIHZhcmlhbmNlOwpidXQgSSBhbSBub3QgY2VydGFpbiBpZiBpdCBpcyBjb25zaXN0ZW50IGFjcm9zcyBjZWxsIHR5cGVzLgoKYGBge3IgdGNfZW9zaW5vcGhpbHNfZGV9CnRhYmxlKHBEYXRhKHRjX2Vvc2lub3BoaWxzKVtbImNvbmRpdGlvbiJdXSkKdGNfZW9zaW5vcGhpbHNfY2xpbmljX2RlIDwtIGFsbF9wYWlyd2lzZSh0Y19lb3Npbm9waGlscywgbW9kZWxfYmF0Y2g9RkFMU0UsIGZpbHRlcj1UUlVFKQp0Y19lb3Npbm9waGlsc19jbGluaWNfZGVfbm9iYXRjaFtbImRlc2VxIl1dW1siY29udHJhc3RzX3BlcmZvcm1lZCJdXQoKdGNfZW9zaW5vcGhpbHNfY2xpbmljX3RhYmxlX25vYmF0Y2ggPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19lb3Npbm9waGlsc19jbGluaWNfZGVfbm9iYXRjaCwga2VlcGVycz10Y19jZl9jb250cmFzdHMsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jbGluaWNfY2YvRW9zaW5vcGhpbHMvdGNfZW9zaW5vcGhpbHNfY2xpbmljX3RhYmxlX25vYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKdGNfZW9zaW5vcGhpbHNfY2xpbmljX3NpZ19ub2JhdGNoIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19lb3Npbm9waGlsc19jbGluaWNfdGFibGVfbm9iYXRjaCwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NsaW5pY19jZi9Fb3Npbm9waGlscy90Y19lb3Npbm9waGlsc19jbGluaWNfc2lnX25vYmF0Y2gtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBERTogQ29tcGFyZSBjbGluaWNzLCBtb25vY3l0ZSBzYW1wbGVzCgpBdCBsZWFzdCBmb3IgdGhlIG1vbWVudCwgSSBhbSBvbmx5IGxvb2tpbmcgYXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4Kbm8tYmF0Y2ggdnMuIHN2YSBhY3Jvc3MgY2xpbmljcyBmb3IgdGhlIG1vbm9jeXRlIHNhbXBsZXMuICBUaGlzCndhcyBjaG9zZW4gbW9zdGx5IGFyYml0cmFyaWx5LgoKIyMjIERFOiBDb21wYXJlIGNsaW5pY3MsIG1vbm9jeXRlcyB3aXRob3V0IGJhdGNoIGVzdGltYXRpb24KCk91ciBiYXNlbGluZSBpcyB0aGUgY29tcGFyaXNvbiBvZiB0aGUgbW9ub2N5dGVzIHNhbXBsZXMgd2l0aG91dCBiYXRjaAppbiB0aGUgbW9kZWwgb3Igc3Vycm9nYXRlIGVzdGltYXRpb24uICBJbiB0aGVvcnkgYXQgbGVhc3QsIHRoaXMgc2hvdWxkCmNvcnJlc3BvbmQgdG8gdGhlIFBDQSBwbG90IGFib3ZlIHdoZW4gbm8gYmF0Y2ggZXN0aW1hdGlvbiB3YXMgcGVyZm9ybWVkLgoKYGBge3IgdGNfbW9ub2N5dGVzX2RlfQp0Y19tb25vY3l0ZXNfZGVfbm9iYXRjaCA8LSBhbGxfcGFpcndpc2UodGNfbW9ub2N5dGVzLCBtb2RlbF9iYXRjaD1GQUxTRSwgZmlsdGVyPVRSVUUpCgp0Y19tb25vY3l0ZXNfdGFibGVfbm9iYXRjaCA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRjX21vbm9jeXRlc19kZV9ub2JhdGNoLCBrZWVwZXJzPWNsaW5pY19jZl9jb250cmFzdHMsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jbGluaWNfY2YvTW9ub2N5dGVzL3RjX21vbm9jeXRlc19jbGluaWNfdGFibGVfbm9iYXRjaC12e3Zlcn0ueGxzeCIpKQp0Y19tb25vY3l0ZXNfc2lnX25vYmF0Y2ggPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRjX21vbm9jeXRlc190YWJsZV9ub2JhdGNoLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2xpbmljX2NmL01vbm9jeXRlcy90Y19tb25vY3l0ZXNfY2xpbmljX3NpZ19ub2JhdGNoLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIERFOiBDb21wYXJlIGNsaW5pY3MsIG1vbm9jeXRlcyB3aXRoIHN2YXNlcQoKSW4gY29udHJhc3QsIHRoZSBmb2xsb3dpbmcgY29tcGFyaXNvbiBzaG91bGQgZ2l2ZSBhIHZpZXcgb2YgdGhlIGRhdGEKY29ycmVzcG9uZGluZyB0byB0aGUgc3Zhc2VxIFBDQSBwbG90IGFib3ZlLiAgSW4gdGhlIGJlc3QgY2FzZQpzY2VuYXJpbywgd2Ugc2hvdWxkIHRoZXJlZm9yZSBiZSBhYmxlIHRvIHNlZSBzb21lIHNpZ25pZmljYW5lCmRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIFR1bWFjbyBjdXJlIGFuZCBmYWlsIHNhbXBsZXMuCgpgYGB7ciB0Y19tb25vY3l0ZXNfZGVfc3ZhfQp0Y19tb25vY3l0ZXNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0Y19tb25vY3l0ZXMsIG1vZGVsX2JhdGNoPSJzdmFzZXEiLCBmaWx0ZXI9VFJVRSkKCnRjX21vbm9jeXRlc190YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19tb25vY3l0ZXNfZGVfc3ZhLCBrZWVwZXJzPWNsaW5pY19jZl9jb250cmFzdHMsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJhbmFseXNlcy8zX2NhbGlfYW5kX3R1bWFjby9jbGluaWNfY2YvTW9ub2N5dGVzL3RjX21vbm9jeXRlc19jbGluaWNfdGFibGVfc3ZhLXZ7dmVyfS54bHN4IikpCnRjX21vbm9jeXRlc19zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19tb25vY3l0ZXNfdGFibGVfc3ZhLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2xpbmljX2NmL01vbm9jeXRlcy90Y19tb25vY3l0ZXNfY2xpbmljX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgREUgQ29tcGFyZTogSG93IHNpbWlsYXIgYXJlIHRoZSBuby1iYXRjaCB2cy4gU1ZBIHJlc3VsdHM/CgpUaGUgZm9sbG93aW5nIGJsb2NrIHNob3dzIHRoYXQgdGhlc2UgdHdvIHJlc3VsdHMgYXJlIGV4Y2VlZGluZ2x5CmRpZmZlcmVudCwgc3VnZXN0aW5nIHRoYXQgdGhlIENhbGkgY3VyZS9mYWlsIGFuZCBUdW1hY28gY3VyZS9mYWlsCmNhbm5vdCBlYXNpbHkgYmUgY29uc2lkZXJlZCBpbiB0aGUgc2FtZSBhbmFseXNpcy4gIEkgZGlkIHNvbWUgcGxheWluZwphcm91bmQgd2l0aCBteSBjYWxjdWxhdGVfYXVjYyBmdW5jdGlvbiBpbiB0aGlzIGJsb2NrIGFuZCBmb3VuZCB0aGF0IGl0CmlzIGluIHNvbWUgaW1wb3J0YW50IHdheSBicm9rZW4sIGF0IGxlYXN0IGlmIG9uZSBleHBhbmRzIHRoZSB0b3AtbgpnZW5lcyB0byBtb3JlIHRoYW4gMjAlIG9mIHRoZSBudW1iZXIgb2YgZ2VuZXMgaW4gdGhlIGRhdGEuCgpgYGB7ciB2c19jYWxpX21vbm9jeXRlfQpjYWxpX3RhYmxlIDwtIHRjX21vbm9jeXRlc190YWJsZV9ub2JhdGNoW1siZGF0YSJdXVtbImNhbGkiXV0KdGFibGUgPC0gdGNfbW9ub2N5dGVzX3RhYmxlX25vYmF0Y2hbWyJkYXRhIl1dW1sidHVtYWNvIl1dCgpjYWxpX21lcmdlZCA8LSBtZXJnZShjYWxpX3RhYmxlLCB0YWJsZSwgYnk9InJvdy5uYW1lcyIpCmNvci50ZXN0KGNhbGlfbWVyZ2VkWywgImRlc2VxX2xvZ2ZjLngiXSwgY2FsaV9tZXJnZWRbLCAiZGVzZXFfbG9nZmMueSJdKQpjYWxpX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2MoY2FsaV90YWJsZSwgdGFibGUsIHB4PSJkZXNlcV9hZGpwIiwgcHk9ImRlc2VxX2FkanAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHg9ImRlc2VxX2xvZ2ZjIiwgbHk9ImRlc2VxX2xvZ2ZjIikKY2FsaV9hdWNjJHBsb3QKCmNhbGlfdGFibGVfc3ZhIDwtIHRjX21vbm9jeXRlc190YWJsZV9zdmFbWyJkYXRhIl1dW1siY2FsaSJdXQp0dW1hY29fdGFibGVfc3ZhIDwtIHRjX21vbm9jeXRlc190YWJsZV9zdmFbWyJkYXRhIl1dW1sidHVtYWNvIl1dCgpjYWxpX21lcmdlZF9zdmEgPC0gbWVyZ2UoY2FsaV90YWJsZV9zdmEsIHR1bWFjb190YWJsZV9zdmEsIGJ5PSJyb3cubmFtZXMiKQpjb3IudGVzdChjYWxpX21lcmdlZF9zdmFbLCAiZGVzZXFfbG9nZmMueCJdLCBjYWxpX3N2YV9tZXJnZWRbLCAiZGVzZXFfbG9nZmMueSJdKQpjYWxpX2F1Y2Nfc3ZhIDwtIGNhbGN1bGF0ZV9hdWNjKGNhbGlfdGFibGVfc3ZhLCB0dW1hY29fdGFibGVfc3ZhLCBweD0iZGVzZXFfYWRqcCIsIHB5PSJkZXNlcV9hZGpwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBseD0iZGVzZXFfbG9nZmMiLCBseT0iZGVzZXFfbG9nZmMiKQpjYWxpX2F1Y2Nfc3ZhJHBsb3QKYGBgCgojIyBERTogQ29tcGFyZSBjbGluaWNzLCBuZXV0cm9waGlsIHNhbXBsZXMKCmBgYHtyIHRjX25ldXRyb3BoaWxzX2RlfQp0Y19uZXV0cm9waGlsc19kZV9ub2JhdGNoIDwtIGFsbF9wYWlyd2lzZSh0Y19uZXV0cm9waGlscywgbW9kZWxfYmF0Y2g9RkFMU0UsIGZpbHRlcj1UUlVFKQoKdGNfbmV1dHJvcGhpbHNfdGFibGVfbm9iYXRjaCA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRjX25ldXRyb3BoaWxzX2RlX25vYmF0Y2gsIGtlZXBlcnM9Y2xpbmljX2NmX2NvbnRyYXN0cywKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NsaW5pY19jZi9OZXV0cm9waGlscy90Y19uZXV0cm9waGlsc190YWJsZV9ub2JhdGNoLXZ7dmVyfS54bHN4IikpCnRjX25ldXRyb3BoaWxzX3NpZ19ub2JhdGNoIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0Y19uZXV0cm9waGlsc190YWJsZV9ub2JhdGNoLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2xpbmljX2NmL05ldXRyb3BoaWxzL3RjX25ldXRyb3BoaWxzX3NpZ19ub2JhdGNoLXZ7dmVyfS54bHN4IikpCgp0Y19uZXV0cm9waGlsc19kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRjX25ldXRyb3BoaWxzLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpCgp0Y19uZXV0cm9waGlsc190YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0Y19uZXV0cm9waGlsc19kZV9zdmEsIGtlZXBlcnM9Y2xpbmljX2NmX2NvbnRyYXN0cywKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImFuYWx5c2VzLzNfY2FsaV9hbmRfdHVtYWNvL2NsaW5pY19jZi9OZXV0cm9waGlscy90Y19uZXV0cm9waGlsc190YWJsZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKdGNfbmV1dHJvcGhpbHNfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdGNfbmV1dHJvcGhpbHNfdGFibGVfc3ZhLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvM19jYWxpX2FuZF90dW1hY28vY2xpbmljX2NmL05ldXRyb3BoaWxzL3RjX25ldXRyb3BoaWxzX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIENvbXBhcmUgREU6IEhvdyBzaW1pbGFyIGFyZSBUdW1hY28gQy9GIHZzLiBDYWxpIEMvRgoKVGhlIGZvbGxvd2luZyBleHBhbmRzIHRoZSBjcm9zcy1jbGluaWMgcXVlcnkgYWJvdmUgdG8gYWxzbyB0ZXN0IHRoZQpuZXV0cm9waGlscy4gIE9uY2UgYWdhaW4sIEkgdGhpbmsgaXQgd2lsbCBwcmV0dHkgc3Ryb25nbHkgc3VwcG9ydCB0aGUKaHlwb3RoZXNpcyB0aGF0IHRoZSB0d28gY2xpbmljcyBhcmUgbm90IGNvbXBhdGlibGUuCgpXZSBhcmUgY29uY2VybmVkIHRoYXQgdGhlIGNsaW5pYy1iYXNlZCBiYXRjaCBlZmZlY3QgbWF5IG1ha2Ugb3VyCnJlc3VsdHMgZXNzZW50aWFsbHkgdXNlbGVzcy4gIE9uZSB3YXkgdG8gdGVzdCB0aGlzIGNvbmNlcm4gaXMgdG8KY29tcGFyZSB0aGUgc2V0IG9mIGdlbmVzIG9ic2VydmVkIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBDYWxpIEN1cmUvRmFpbAp2cy4gdGhlIFR1bWFjbyBDdXJlL0ZhaWwuCgpgYGB7ciB2c19jYWxpX25ldXRyb3BoaWxzfQpjYWxpX3RhYmxlX25vYmF0Y2ggPC0gdGNfbmV1dHJvcGhpbHNfdGFibGVfbm9iYXRjaFtbImRhdGEiXV1bWyJjYWxpIl1dCnR1bWFjb190YWJsZV9ub2JhdGNoIDwtIHRjX25ldXRyb3BoaWxzX3RhYmxlX25vYmF0Y2hbWyJkYXRhIl1dW1sidHVtYWNvIl1dCgpjYWxpX21lcmdlZF9ub2JhdGNoIDwtIG1lcmdlKGNhbGlfdGFibGVfbm9iYXRjaCwgdHVtYWNvX3RhYmxlX25vYmF0Y2gsIGJ5PSJyb3cubmFtZXMiKQpjb3IudGVzdChjYWxpX21lcmdlZF9ub2JhdGNoWywgImRlc2VxX2xvZ2ZjLngiXSwgY2FsaV9tZXJnZWRfbm9iYXRjaFssICJkZXNlcV9sb2dmYy55Il0pCmNhbGlfYXVjY19ub2JhdGNoIDwtIGNhbGN1bGF0ZV9hdWNjKGNhbGlfdGFibGVfbm9iYXRjaCwgdHVtYWNvX3RhYmxlX25vYmF0Y2gsIHB4PSJkZXNlcV9hZGpwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHk9ImRlc2VxX2FkanAiLCBseD0iZGVzZXFfbG9nZmMiLCBseT0iZGVzZXFfbG9nZmMiKQpjYWxpX2F1Y2Nfbm9iYXRjaCRwbG90CmBgYAoKIyMgR1NFQTogRXh0cmFjdCBjbGluaWMtc3BlY2lmaWMgZ2VuZXMKCkdpdmVuIHRoZSBhYm92ZSBjb21wYXJpc29ucywgd2UgY2FuIGV4dHJhY3Qgc29tZSBnZW5lIHNldHMgd2hpY2gKcmVzdWx0ZWQgZnJvbSB0aG9zZSBERSBhbmFseXNlcyBhbmQgZXZlbnR1YWxseSBwZXJmb3JtIHNvbWUKb250b2xvZ3kvS0VHRy9yZWFjdG9tZS9ldGMgc2VhcmNoZXMuICBUaGlzIHJlbWluZHMgbWUsIEkgd2FudCB0byBtYWtlCm15IGV4dHJhY3Rfc2lnbmlmaWNhbnRfIGZ1bmN0aW9ucyB0byByZXR1cm4gZ2VuZS1zZXQgZGF0YSBzdHJ1Y3R1cmVzCmFuZCBteSB2YXJpb3VzIG9udG9sb2d5IHNlYXJjaGVzIHRvIHRha2UgdGhlbSBhcyBpbnB1dHMuICBUaGlzIHNob3VsZApoZWxwIGF2b2lkIHBvdGVudGlhbCBlcnJvcnMgd2hlbiBleHRyYWN0aW5nIHVwL2Rvd24gZ2VuZXMuCgpgYGB7ciBjb21wYXJlX2NsaW5pY19nZW5lc30KY2xpbmljX3NpZ2VuZXNfdXAgPC0gcm93bmFtZXModGNfY2xpbmljX3R5cGVfc2lnX3N2YVtbImRlc2VxIl1dW1sidXBzIl1dW1siY2xpbmljcyJdXSkKY2xpbmljX3NpZ2VuZXNfZG93biA8LSByb3duYW1lcyh0Y19jbGluaWNfdHlwZV9zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImNsaW5pY3MiXV0pCmNsaW5pY19zaWdlbmVzIDwtIGMoY2xpbmljX3NpZ2VuZXNfdXAsIGNsaW5pY19zaWdlbmVzX2Rvd24pCgp0Y19lb3Npbm9waGlsc19zaWdlbmVzX3VwIDwtIHJvd25hbWVzKHRjX2Vvc2lub3BoaWxzX2NsaW5pY19zaWdfc3ZhW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJjdXJlIl1dKQp0Y19lb3Npbm9waGlsc19zaWdlbmVzX2Rvd24gPC0gcm93bmFtZXModGNfZW9zaW5vcGhpbHNfY2xpbmljX3NpZ19zdmFbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siY3VyZSJdXSkKdGNfbW9ub2N5dGVzX3NpZ2VuZXNfdXAgPC0gcm93bmFtZXModGNfbW9ub2N5dGVzX3NpZ19zdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbImN1cmUiXV0pCnRjX21vbm9jeXRlc19zaWdlbmVzX2Rvd24gPC0gcm93bmFtZXModGNfbW9ub2N5dGVzX3NpZ19zdmFbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siY3VyZSJdXSkKdGNfbmV1dHJvcGhpbHNfc2lnZW5lc191cCA8LSByb3duYW1lcyh0Y19uZXV0cm9waGlsc19zaWdfc3ZhW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJjdXJlIl1dKQp0Y19uZXV0cm9waGlsc19zaWdlbmVzX2Rvd24gPC0gcm93bmFtZXModGNfbmV1dHJvcGhpbHNfc2lnX3N2YVtbImRlc2VxIl1dW1siZG93bnMiXV1bWyJjdXJlIl1dKQoKdGNfZW9zaW5vcGhpbHNfc2lnZW5lcyA8LSBjKHRjX2Vvc2lub3BoaWxzX3NpZ2VuZXNfdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y19lb3Npbm9waGlsc19zaWdlbmVzX2Rvd24pCnRjX21vbm9jeXRlc19zaWdlbmVzIDwtIGModGNfbW9ub2N5dGVzX3NpZ2VuZXNfdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGNfbW9ub2N5dGVzX3NpZ2VuZXNfZG93bikKdGNfbmV1dHJvcGhpbHNfc2lnZW5lcyA8LSBjKHRjX25ldXRyb3BoaWxzX3NpZ2VuZXNfdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y19uZXV0cm9waGlsc19zaWdlbmVzX2Rvd24pCmBgYAoKIyMgR1NFQTogZ1Byb2ZpbGVyIG9mIGdlbmVzIGRlZW1lZCB1cC9kb3duIHdoZW4gY29tcGFyaW5nIENhbGkgYW5kIFR1bWFjbwoKSSB3YXMgY3VyaW91cyB0byB0cnkgdG8gdW5kZXJzdGFuZCB3aHkgdGhlIHR3byBjbGluaWNzIGFwcGVhciB0byBiZSBzbwpkaWZmZXJlbnQgdmlzIGEgdmlzIHRoZWlyIFBDQS9ERTsgc28gSSB0aG91Z2h0IHRoYXQgZ1Byb2ZpbGVyIG1pZ2h0CmhlbHAgYm9pbCB0aG9zZSByZXN1bHRzIGRvd24gdG8gc29tZXRoaW5nIG1vcmUgZGlnZXN0aWJsZS4KCiMjIyBHU0VBOiBDb21wYXJlIGNsaW5pY3MsIGFsbCBzYW1wbGVzCgpgYGB7ciBnc2VhX2NsaW5pY19ncHJvZmlsZXJ9CmNsaW5pY19ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNsaW5pY19zaWdlbmVzKQpjbGluaWNfZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCmNsaW5pY19ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmNsaW5pY19ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNsaW5pY19zaWdlbmVzKQpjbGluaWNfZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCmNsaW5pY19ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmNsaW5pY19ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNsaW5pY19zaWdlbmVzKQpjbGluaWNfZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCmNsaW5pY19ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmBgYAoKIyMjIEdTRUE6IENvbXBhcmUgY2xpbmljcywgRW9zaW5vcGhpbCBzYW1wbGVzCgpgYGB7ciBnc2VhX2NsaW5pY19lb30KdGNfZW9zaW5vcGhpbHNfZ3AgPC0gc2ltcGxlX2dwcm9maWxlcih0Y19lb3Npbm9waGlsc19zaWdlbmVzKQp0Y19lb3Npbm9waGlsc19ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKdGNfZW9zaW5vcGhpbHNfZ3AkcHZhbHVlX3Bsb3RzJHJlYWN0b21lX3Bsb3Rfb3ZlcgoKdGNfZW9zaW5vcGhpbHNfdXBfZ3AgPC0gc2ltcGxlX2dwcm9maWxlcih0Y19lb3Npbm9waGlsc19zaWdlbmVzX3VwKQp0Y19lb3Npbm9waGlsc191cF9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKdGNfZW9zaW5vcGhpbHNfdXBfZ3AkcHZhbHVlX3Bsb3RzJHJlYWN0b21lX3Bsb3Rfb3ZlcgoKdGNfZW9zaW5vcGhpbHNfZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHRjX2Vvc2lub3BoaWxzX3NpZ2VuZXNfZG93bikKdGNfZW9zaW5vcGhpbHNfZG93bl9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKdGNfZW9zaW5vcGhpbHNfZG93bl9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmBgYAoKIyMjIEdTRUE6IENvbXBhcmUgY2xpbmljcywgTW9ub2N5dGUgc2FtcGxlcwoKYGBge3IgZ3NlYV9jbGluaWNfbW5vY3l0ZX0KdGNfbW9ub2N5dGVzX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIodGNfbW9ub2N5dGVzX3NpZ2VuZXMpCnRjX21vbm9jeXRlc19ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKdGNfbW9ub2N5dGVzX2dwJHB2YWx1ZV9wbG90cyRyZWFjdG9tZV9wbG90X292ZXIKCnRjX21vbm9jeXRlc191cF9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHRjX21vbm9jeXRlc19zaWdlbmVzX3VwKQp0Y19tb25vY3l0ZXNfdXBfZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCnRjX21vbm9jeXRlc191cF9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCgp0Y19tb25vY3l0ZXNfZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHRjX21vbm9jeXRlc19zaWdlbmVzX2Rvd24pCnRjX21vbm9jeXRlc19kb3duX2dwJHB2YWx1ZV9wbG90cyRrZWdnX3Bsb3Rfb3Zlcgp0Y19tb25vY3l0ZXNfZG93bl9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmBgYAoKIyMjIEdTRUE6IENvbXBhcmUgY2xpbmljcywgTmV1dHJvcGhpbCBzYW1wbGVzCgpgYGB7ciBnc2VhX2NsaW5pY19uZXV0cm9waGlsc30KdGNfbmV1dHJvcGhpbHNfZ3AgPC0gc2ltcGxlX2dwcm9maWxlcih0Y19uZXV0cm9waGlsc19zaWdlbmVzKQp0Y19uZXV0cm9waGlsc19ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKdGNfbmV1dHJvcGhpbHNfZ3AkcHZhbHVlX3Bsb3RzJHJlYWN0b21lX3Bsb3Rfb3ZlcgoKdGNfbmV1dHJvcGhpbHNfdXBfZ3AgPC0gc2ltcGxlX2dwcm9maWxlcih0Y19uZXV0cm9waGlsc19zaWdlbmVzX3VwKQp0Y19uZXV0cm9waGlsc191cF9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKdGNfbmV1dHJvcGhpbHNfdXBfZ3AkcHZhbHVlX3Bsb3RzJHJlYWN0b21lX3Bsb3Rfb3ZlcgoKdGNfbmV1dHJvcGhpbHNfZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHRjX25ldXRyb3BoaWxzX3NpZ2VuZXNfZG93bikKdGNfbmV1dHJvcGhpbHNfZG93bl9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKdGNfbmV1dHJvcGhpbHNfZG93bl9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmBgYAoKIyBPbmx5IFR1bWFjbyBzYW1wbGVzCgojIyBTZXQgdGhlIHhsc3ggb3V0cHV0IHByZWZpeAoKYGBge3IgeGxzeF9wcmVmaXh9Cnhsc3hfcHJlZml4IDwtICJhbmFseXNlcy80X3R1bWFjby9ERV9DdXJlX3ZzX0ZhaWwiCmBgYAoKIyMgQWxsIHNhbXBsZXMKCmBgYHtyIGNmX2FsbF9kZX0KdF9jZl9jbGluaWNhbF9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRfY2xpbmljYWwsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfY2xpbmljYWxfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9jbGluaWNhbF9kZV9zdmEsCiAgICBrZWVwZXJzID0gdF9jZl9jb250cmFzdCwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9BbGxfU2FtcGxlcy90X2NmX2NsaW5pY2FsX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9jbGluaWNhbF9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX2NsaW5pY2FsX3RhYmxlX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9BbGxfU2FtcGxlcy90X2NmX2NsaW5pY2FsX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKCmRpbSh0X2NmX2NsaW5pY2FsX3NpZyRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfY2xpbmljYWxfc2lnJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIEFsbCB2aXNpdHMsIGVhY2ggdGltZSBwb2ludAoKYGBge3IgYWxsX3RpbWVwb2ludHN9CnRfY2ZfY2xpbmljYWxfdjFfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djFfc2FtcGxlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9jbGluaWNhbF92MV90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX2NsaW5pY2FsX3YxX2RlX3N2YSwKICAgIGtlZXBlcnMgPSB0X2NmX2NvbnRyYXN0LAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2ZfY2xpbmljYWxfdjFfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX3YxX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfY2xpbmljYWxfdjFfdGFibGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2ZfY2xpbmljYWxfdjFfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9jbGluaWNhbF92MV9zaWckZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2NsaW5pY2FsX3YxX3NpZyRkZXNlcSRkb3duc1tbMV1dKQoKdF9jZl9jbGluaWNhbF92Ml9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2Ml9zYW1wbGVzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2NsaW5pY2FsX3YyX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfY2xpbmljYWxfdjJfZGVfc3ZhLAogICAga2VlcGVycyA9IHRfY2ZfY29udHJhc3QsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vQWxsX1NhbXBsZXMvdF9jZl9jbGluaWNhbF92Ml90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfY2xpbmljYWxfdjJfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9jbGluaWNhbF92Ml90YWJsZV9zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vQWxsX1NhbXBsZXMvdF9jZl9jbGluaWNhbF92Ml9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmRpbSh0X2NmX2NsaW5pY2FsX3YyX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2NsaW5pY2FsX3YyX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfY2xpbmljYWxfdjNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djNfc2FtcGxlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9jbGluaWNhbF92M190YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX2NsaW5pY2FsX3YzX2RlX3N2YSwKICAgIGtlZXBlcnMgPSB0X2NmX2NvbnRyYXN0LAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2ZfY2xpbmljYWxfdjNfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2NsaW5pY2FsX3YzX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfY2xpbmljYWxfdjNfdGFibGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0FsbF9TYW1wbGVzL3RfY2ZfY2xpbmljYWxfdjNfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9jbGluaWNhbF92M19zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9jbGluaWNhbF92M19zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIFJlcGVhdCBubyBiaW9wc2llcwoKYGBge3IgY2ZfYWxsX2RlX25vYmlvcH0KdF9jZl9jbGluaWNhbF9ub2Jpb3BfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X2NsaW5pY2FsX25vYmlvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2NsaW5pY2FsX25vYmlvcF90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX2NsaW5pY2FsX25vYmlvcF9kZV9zdmEsCiAgICBrZWVwZXJzID0gdF9jZl9jb250cmFzdCwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Ob19CaW9wc2llcy90X2NmX2NsaW5pY2FsX25vYmlvcF90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfY2xpbmljYWxfbm9iaW9wX3RhYmxlX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Ob19CaW9wc2llcy90X2NmX2NsaW5pY2FsX25vYmlvcF9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCgpkaW0odF9jZl9jbGluaWNhbF9ub2Jpb3Bfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfY2xpbmljYWxfbm9iaW9wX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMgQnkgY2VsbCB0eXBlCgojIyMjIEN1cmUvRmFpbCwgQmlvcHNpZXMKCmBgYHtyIGNmX2Jpb3BzeV9kZX0KdF9jZl9iaW9wc3lfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X2Jpb3BzaWVzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2Jpb3BzeV90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX2Jpb3BzeV9kZV9zdmEsCiAgICBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vQmlvcHNpZXMvdF9jZl9iaW9wc3lfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2Jpb3BzeV9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX2Jpb3BzeV90YWJsZV9zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vQmlvcHNpZXMvdF9jZl9iaW9wc3lfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQoKZGltKHRfY2ZfYmlvcHN5X3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2Jpb3BzeV9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyBDdXJlL0ZhaWwsIE1vbm9jeXRlcwoKYGBge3IgY2ZfbW9ub2N5dGVfZGV9CnRfY2ZfbW9ub2N5dGVfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X21vbm9jeXRlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKCnRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfbW9ub2N5dGVfZGVfc3ZhLAogICAga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L01vbm9jeXRlcy90X2NmX21vbm9jeXRlX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9tb25vY3l0ZV9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX21vbm9jeXRlX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTW9ub2N5dGVzL3RfY2ZfbW9ub2N5dGVfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQoKZGltKHRfY2ZfbW9ub2N5dGVfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbW9ub2N5dGVfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQoKdF9jZl9tb25vY3l0ZV9kZV9iYXRjaHZpc2l0IDwtIGFsbF9wYWlyd2lzZSh0X21vbm9jeXRlcywgbW9kZWxfYmF0Y2ggPSBUUlVFLCBmaWx0ZXIgPSBUUlVFKQoKdF9jZl9tb25vY3l0ZV90YWJsZXNfYmF0Y2h2aXNpdCA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfbW9ub2N5dGVfZGVfYmF0Y2h2aXNpdCwKICAgIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Nb25vY3l0ZXMvdF9jZl9tb25vY3l0ZV90YWJsZXNfYmF0Y2h2aXNpdC12e3Zlcn0ueGxzeCIpKQp0X2NmX21vbm9jeXRlX3NpZ19iYXRjaHZpc2l0IDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX21vbm9jeXRlX3RhYmxlc19iYXRjaHZpc2l0LAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L01vbm9jeXRlcy90X2NmX21vbm9jeXRlX3NpZ19iYXRjaHZpc2l0LXZ7dmVyfS54bHN4IikpCgpkaW0odF9jZl9tb25vY3l0ZV9zaWdfYmF0Y2h2aXNpdCRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbW9ub2N5dGVfc2lnX2JhdGNodmlzaXQkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMgQWxsIHZpc2l0cywgTW9ub2N5dGVzCgpgYGB7ciBjZl9tb25vY3l0ZV9kZV92aXNpdHN9CnRfY2ZfbW9ub2N5dGVfdjFfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djFfbW9ub2N5dGVzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX21vbm9jeXRlX3YxX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX21vbm9jeXRlX3YxX2RlX3N2YSwKICAgIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Nb25vY3l0ZXMvdF9jZl9tb25vY3l0ZV92MV90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbW9ub2N5dGVfdjFfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9tb25vY3l0ZV92MV90YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L01vbm9jeXRlcy90X2NmX21vbm9jeXRlX3YxX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKZGltKHRfY2ZfbW9ub2N5dGVfdjFfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbW9ub2N5dGVfdjFfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQoKdF9jZl9tb25vY3l0ZV92Ml9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2Ml9tb25vY3l0ZXMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfbW9ub2N5dGVfdjJfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfbW9ub2N5dGVfdjJfZGVfc3ZhLAogICAga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L01vbm9jeXRlcy90X2NmX21vbm9jeXRlX3YyX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9tb25vY3l0ZV92Ml9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX21vbm9jeXRlX3YyX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTW9ub2N5dGVzL3RfY2ZfbW9ub2N5dGVfdjJfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9tb25vY3l0ZV92Ml9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9tb25vY3l0ZV92Ml9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX21vbm9jeXRlX3YzX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodHYzX21vbm9jeXRlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9tb25vY3l0ZV92M190YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9tb25vY3l0ZV92M19kZV9zdmEsCiAgICBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTW9ub2N5dGVzL3RfY2ZfbW9ub2N5dGVfdjNfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX21vbm9jeXRlX3YzX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfbW9ub2N5dGVfdjNfdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Nb25vY3l0ZXMvdF9jZl9tb25vY3l0ZV92M19zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmRpbSh0X2NmX21vbm9jeXRlX3YzX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX21vbm9jeXRlX3YzX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKYGBgCgojIyMjIE1vbm9jeXRlczogQ29tcGFyZSBzdmEgdG8gYmF0Y2gtaW4tbW9kZWwKCmBgYHtyIGF1Y2NfbW9ub2N5dGV9CnN2YV9hdWNjIDwtIGNhbGN1bGF0ZV9hdWNjKHRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsMj10X2NmX21vbm9jeXRlX3RhYmxlc19iYXRjaHZpc2l0W1siZGF0YSJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCnN2YV9hdWNjCgpzaGFyZWRfaWRzIDwtIHJvd25hbWVzKHRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXSkgJWluJQogIHJvd25hbWVzKHRfY2ZfbW9ub2N5dGVfdGFibGVzX2JhdGNodmlzaXRbWyJkYXRhIl1dW1sxXV0pCmZpcnN0IDwtIHRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXVtzaGFyZWRfaWRzLCBdCnNlY29uZCA8LSB0X2NmX21vbm9jeXRlX3RhYmxlc19iYXRjaHZpc2l0W1siZGF0YSJdXVtbMV1dW3Jvd25hbWVzKGZpcnN0KSwgXQpjb3IudGVzdChmaXJzdFtbImRlc2VxX2xvZ2ZjIl1dLCBzZWNvbmRbWyJkZXNlcV9sb2dmYyJdXSkKYGBgCgojIyMjIE5ldXRyb3BoaWwgc2FtcGxlcwoKYGBge3IgbmV1dHJvcGhpbF9vbmx5fQp0X2NmX25ldXRyb3BoaWxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X25ldXRyb3BoaWxzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQoKdF9jZl9uZXV0cm9waGlsX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfZGVfc3ZhLAogICAga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L05ldXRyb3BoaWxzL3RfY2ZfbmV1dHJvcGhpbF90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X2NmX25ldXRyb3BoaWxfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQoKZGltKHRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9uZXV0cm9waGlsX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfbmV1dHJvcGhpbF9kZV9iYXRjaHZpc2l0IDwtIGFsbF9wYWlyd2lzZSh0X25ldXRyb3BoaWxzLCBtb2RlbF9iYXRjaCA9IFRSVUUsIGZpbHRlciA9IFRSVUUpCgp0X2NmX25ldXRyb3BoaWxfdGFibGVzX2JhdGNodmlzaXQgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfZGVfYmF0Y2h2aXNpdCwKICAgIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X2NmX25ldXRyb3BoaWxfdGFibGVzX2JhdGNodmlzaXQtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9uZXV0cm9waGlsX3NpZ19iYXRjaHZpc2l0IDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfdGFibGVzX2JhdGNodmlzaXQsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9jZl9uZXV0cm9waGlsX3NpZ19iYXRjaHZpc2l0LXZ7dmVyfS54bHN4IikpCgpkaW0odF9jZl9uZXV0cm9waGlsX3NpZ19iYXRjaHZpc2l0JGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9uZXV0cm9waGlsX3NpZ19iYXRjaHZpc2l0JGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIE5ldXRyb3BoaWxzIGJ5IHRpbWUKCmBgYHtyIG5ldXRyb3BoaWxfdmlzaXRzfQp2aXNpdGNmX2ZhY3RvciA8LSBwYXN0ZTAoInYiLCBwRGF0YSh0X25ldXRyb3BoaWxzKVtbInZpc2l0bnVtYmVyIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0pCnRfbmV1dHJvcGhpbF92aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9uZXV0cm9waGlscywgZmFjdD12aXNpdGNmX2ZhY3RvcikKdF9jZl9uZXV0cm9waGlsX3Zpc2l0c19kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRfbmV1dHJvcGhpbF92aXNpdGNmLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSkKCnRfY2ZfbmV1dHJvcGhpbF92aXNpdHNfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfbmV1dHJvcGhpbF92aXNpdHNfZGVfc3ZhLAogICAga2VlcGVycyA9IHZpc2l0Y2ZfY29udHJhc3RzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L05ldXRyb3BoaWxzL3RfY2ZfbmV1dHJvcGhpbF92aXNpdGNmX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9uZXV0cm9waGlsX3Zpc2l0c19zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfdmlzaXRzX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9jZl9uZXV0cm9waGlsX3Zpc2l0Y2Zfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9uZXV0cm9waGlsX3Zpc2l0c19zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9uZXV0cm9waGlsX3Zpc2l0c19zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX25ldXRyb3BoaWxfdjFfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djFfbmV1dHJvcGhpbHMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfbmV1dHJvcGhpbF92MV90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9uZXV0cm9waGlsX3YxX2RlX3N2YSwKICAgIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X2NmX25ldXRyb3BoaWxfdjFfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX25ldXRyb3BoaWxfdjFfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9uZXV0cm9waGlsX3YxX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9jZl9uZXV0cm9waGlsX3YxX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKZGltKHRfY2ZfbmV1dHJvcGhpbF92MV9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9uZXV0cm9waGlsX3YxX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfbmV1dHJvcGhpbF92Ml9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2Ml9uZXV0cm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9uZXV0cm9waGlsX3YyX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfdjJfZGVfc3ZhLAogICAga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L05ldXRyb3BoaWxzL3RfY2ZfbmV1dHJvcGhpbF92Ml90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfbmV1dHJvcGhpbF92Ml9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX25ldXRyb3BoaWxfdjJfdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9OZXV0cm9waGlscy90X2NmX25ldXRyb3BoaWxfdjJfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9uZXV0cm9waGlsX3YyX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX25ldXRyb3BoaWxfdjJfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQoKdF9jZl9uZXV0cm9waGlsX3YzX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodHYzX25ldXRyb3BoaWxzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX25ldXRyb3BoaWxfdjNfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfbmV1dHJvcGhpbF92M19kZV9zdmEsCiAgICBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTmV1dHJvcGhpbHMvdF9jZl9uZXV0cm9waGlsX3YzX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9uZXV0cm9waGlsX3YzX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfbmV1dHJvcGhpbF92M190YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L05ldXRyb3BoaWxzL3RfY2ZfbmV1dHJvcGhpbF92M19zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmRpbSh0X2NmX25ldXRyb3BoaWxfdjNfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfbW9ub2N5dGVfdjNfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIyMgTmV1dHJvcGhpbHM6IENvbXBhcmUgc3ZhIHRvIGJhdGNoLWluLW1vZGVsCgpgYGB7ciBjb21wYXJlX25ldXRyb3BoaWxfYXVjY30Kc3ZhX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2ModF9jZl9uZXV0cm9waGlsX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRibDI9dF9jZl9uZXV0cm9waGlsX3RhYmxlc19iYXRjaHZpc2l0W1siZGF0YSJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCnN2YV9hdWNjCgpzaGFyZWRfaWRzIDwtIHJvd25hbWVzKHRfY2ZfbmV1dHJvcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dKSAlaW4lCiAgcm93bmFtZXModF9jZl9uZXV0cm9waGlsX3RhYmxlc19iYXRjaHZpc2l0W1siZGF0YSJdXVtbMV1dKQpmaXJzdCA8LSB0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXVtzaGFyZWRfaWRzLCBdCnNlY29uZCA8LSB0X2NmX25ldXRyb3BoaWxfdGFibGVzX2JhdGNodmlzaXRbWyJkYXRhIl1dW1sxXV1bcm93bmFtZXMoZmlyc3QpLCBdCmNvci50ZXN0KGZpcnN0W1siZGVzZXFfbG9nZmMiXV0sIHNlY29uZFtbImRlc2VxX2xvZ2ZjIl1dKQpgYGAKCiMjIyMgRW9zaW5vcGhpbHMKCmBgYHtyIGVvc2lub3BoaWxfb25seX0KdF9jZl9lb3Npbm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9lb3Npbm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKCnRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9lb3Npbm9waGlsX2RlX3N2YSwKICAgIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Fb3Npbm9waGlscy90X2NmX2Vvc2lub3BoaWxfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9lb3Npbm9waGlsX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vRW9zaW5vcGhpbHMvdF9jZl9lb3Npbm9waGlsX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKCmRpbSh0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfZW9zaW5vcGhpbF9zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCgp0X2NmX2Vvc2lub3BoaWxfZGVfYmF0Y2h2aXNpdCA8LSBhbGxfcGFpcndpc2UodF9lb3Npbm9waGlscywgbW9kZWxfYmF0Y2ggPSBUUlVFLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2Vvc2lub3BoaWxfdGFibGVzX2JhdGNodmlzaXQgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX2Vvc2lub3BoaWxfZGVfYmF0Y2h2aXNpdCwKICAgIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Fb3Npbm9waGlscy90X2NmX2Vvc2lub3BoaWxfdGFibGVzX2JhdGNodmlzaXQtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9lb3Npbm9waGlsX3NpZ19iYXRjaHZpc2l0IDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX2Vvc2lub3BoaWxfdGFibGVzX2JhdGNodmlzaXQsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3RfY2ZfZW9zaW5vcGhpbF9zaWdfYmF0Y2h2aXNpdC12e3Zlcn0ueGxzeCIpKQoKZGltKHRfY2ZfZW9zaW5vcGhpbF9zaWdfYmF0Y2h2aXNpdCRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfZW9zaW5vcGhpbF9zaWdfYmF0Y2h2aXNpdCRkZXNlcSRkb3duc1tbMV1dKQoKdmlzaXRjZl9mYWN0b3IgPC0gcGFzdGUwKCJ2IiwgcERhdGEodF9lb3Npbm9waGlscylbWyJ2aXNpdG51bWJlciJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKHRfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dKQp0X2Vvc2lub3BoaWxfdmlzaXRjZiA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfZW9zaW5vcGhpbHMsIGZhY3Q9dmlzaXRjZl9mYWN0b3IpCnRfY2ZfZW9zaW5vcGhpbF92aXNpdHNfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X2Vvc2lub3BoaWxfdmlzaXRjZiwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUpCgp0X2NmX2Vvc2lub3BoaWxfdmlzaXRzX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX2Vvc2lub3BoaWxfdmlzaXRzX2RlX3N2YSwKICAgIGtlZXBlcnMgPSB2aXNpdGNmX2NvbnRyYXN0cywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Fb3Npbm9waGlscy90X2NmX2Vvc2lub3BoaWxfdmlzaXRjZl90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF92aXNpdHNfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9lb3Npbm9waGlsX3Zpc2l0c190YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfY2ZfZW9zaW5vcGhpbF92aXNpdGNmX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKZGltKHRfY2ZfZW9zaW5vcGhpbF92aXNpdHNfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfZW9zaW5vcGhpbF92aXNpdHNfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQpgYGAKCiMjIyBFb3Npbm9waGlsIHRpbWUgY29tcGFyaXNvbnMKCmBgYHtyIGVvc2lub3BoaWxfdmlzaXRzfQp0X2NmX2Vvc2lub3BoaWxfdjFfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0djFfZW9zaW5vcGhpbHMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnRfY2ZfZW9zaW5vcGhpbF92MV90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF9jZl9lb3Npbm9waGlsX3YxX2RlX3N2YSwKICAgIGtlZXBlcnMgPSBjZl9jb250cmFzdCwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Fb3Npbm9waGlscy90X2NmX2Vvc2lub3BoaWxfdjFfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X2NmX2Vvc2lub3BoaWxfdjFfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF9jZl9lb3Npbm9waGlsX3YxX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vRW9zaW5vcGhpbHMvdF9jZl9lb3Npbm9waGlsX3YxX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKZGltKHRfY2ZfZW9zaW5vcGhpbF92MV9zaWdfc3ZhJGRlc2VxJHVwc1tbMV1dKQpkaW0odF9jZl9lb3Npbm9waGlsX3YxX3NpZ19zdmEkZGVzZXEkZG93bnNbWzFdXSkKCnRfY2ZfZW9zaW5vcGhpbF92Ml9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHR2Ml9lb3Npbm9waGlscywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdF9jZl9lb3Npbm9waGlsX3YyX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X2NmX2Vvc2lub3BoaWxfdjJfZGVfc3ZhLAogICAga2VlcGVycyA9IGNmX2NvbnRyYXN0LAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfY2ZfZW9zaW5vcGhpbF92Ml90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfY2ZfZW9zaW5vcGhpbF92Ml9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X2NmX2Vvc2lub3BoaWxfdjJfdGFibGVzX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Fb3Npbm9waGlscy90X2NmX2Vvc2lub3BoaWxfdjJfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpkaW0odF9jZl9lb3Npbm9waGlsX3YyX3NpZ19zdmEkZGVzZXEkdXBzW1sxXV0pCmRpbSh0X2NmX2Vvc2lub3BoaWxfdjJfc2lnX3N2YSRkZXNlcSRkb3duc1tbMV1dKQoKdF9jZl9lb3Npbm9waGlsX3YzX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodHYzX2Vvc2lub3BoaWxzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp0X2NmX2Vvc2lub3BoaWxfdjNfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfY2ZfZW9zaW5vcGhpbF92M19kZV9zdmEsCiAgICBrZWVwZXJzID0gY2ZfY29udHJhc3QsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vRW9zaW5vcGhpbHMvdF9jZl9lb3Npbm9waGlsX3YzX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF9jZl9lb3Npbm9waGlsX3YzX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfY2ZfZW9zaW5vcGhpbF92M190YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L0Vvc2lub3BoaWxzL3RfY2ZfZW9zaW5vcGhpbF92M19zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmRpbSh0X2NmX2Vvc2lub3BoaWxfdjNfc2lnX3N2YSRkZXNlcSR1cHNbWzFdXSkKZGltKHRfY2ZfZW9zaW5vcGhpbF92M19zaWdfc3ZhJGRlc2VxJGRvd25zW1sxXV0pCmBgYAoKIyMjIyBFb3Npbm9waGlsczogQ29tcGFyZSBzdmEgdG8gYmF0Y2gtaW4tdmlzaXQKCmBgYHtyIGVvc2lub3BoaWxfYXVjY30Kc3ZhX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2ModF9jZl9lb3Npbm9waGlsX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sxXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRibDI9dF9jZl9lb3Npbm9waGlsX3RhYmxlc19iYXRjaHZpc2l0W1siZGF0YSJdXVtbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCnN2YV9hdWNjCgpzaGFyZWRfaWRzIDwtIHJvd25hbWVzKHRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbMV1dKSAlaW4lCiAgcm93bmFtZXModF9jZl9lb3Npbm9waGlsX3RhYmxlc19iYXRjaHZpc2l0W1siZGF0YSJdXVtbMV1dKQpmaXJzdCA8LSB0X2NmX2Vvc2lub3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXVtzaGFyZWRfaWRzLCBdCnNlY29uZCA8LSB0X2NmX2Vvc2lub3BoaWxfdGFibGVzX2JhdGNoYmlzaXRbWyJkYXRhIl1dW1sxXV1bcm93bmFtZXMoZmlyc3QpLCBdCmNvci50ZXN0KGZpcnN0W1siZGVzZXFfbG9nZmMiXV0sIHNlY29uZFtbImRlc2VxX2xvZ2ZjIl1dKQpgYGAKCiMjIyMgQ29tcGFyZSBtb25vY3l0ZSBDRiwgbmV1dHJvcGhpbCBDRiwgZW9zaW5vcGhpbCBDRgoKYGBge3IgY29tcGFyZV9tb25vX25ldXRfZW99CnRfbW9ub19uZXV0X3N2YV9hdWNjIDwtIGNhbGN1bGF0ZV9hdWNjKHRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsMj10X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWzFdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHk9ImRlc2VxX2FkanAiLCBseT0iZGVzZXFfbG9nZmMiKQp0X21vbm9fbmV1dF9zdmFfYXVjYwoKdF9tb25vX2VvX3N2YV9hdWNjIDwtIGNhbGN1bGF0ZV9hdWNjKHRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbImRhdGEiXV1bWyJmYWlsX3ZzX2N1cmUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YmwyPXRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5PSJkZXNlcV9hZGpwIiwgbHk9ImRlc2VxX2xvZ2ZjIikKdF9tb25vX2VvX3N2YV9hdWNjCgp0X25ldXRfZW9fc3ZhX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2ModF9jZl9uZXV0cm9waGlsX3RhYmxlc19zdmFbWyJkYXRhIl1dW1siZmFpbF92c19jdXJlIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsMj10X2NmX2Vvc2lub3BoaWxfdGFibGVzX3N2YVtbImRhdGEiXV1bWyJmYWlsX3ZzX2N1cmUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCnRfbmV1dF9lb19zdmFfYXVjYwpgYGAKCiMjIyBCeSB2aXNpdAoKRm9yIHRoZXNlIGNvbnRyYXN0cywgd2Ugd2FudCB0byBzZWUgZmFpbF92MSB2cy4gY3VyZV92MSwgZmFpbF92Mgp2cy4gY3VyZV92MiBldGMuICBBcyBhIHJlc3VsdCwgd2Ugd2lsbCBuZWVkIHRvIGp1Z2dsZSB0aGUgZGF0YQpzbGlnaHRseSBhbmQgYWRkIGFub3RoZXIgc2V0IG9mIGNvbnRyYXN0cy4KCiMjIyMgQ3VyZS9GYWlsIGJ5IHZpc2l0cywgYWxsIGNlbGwgdHlwZXMKCmBgYHtyIHZpc2l0X2NmX2FsbF9kZX0KdF92aXNpdF9jZl9hbGxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X3Zpc2l0Y2YsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCgp0X3Zpc2l0X2NmX2FsbF90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF92aXNpdF9jZl9hbGxfZGVfc3ZhLAogICAga2VlcGVycyA9IHZpc2l0Y2ZfY29udHJhc3RzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9DdXJlX3ZzX0ZhaWwvdF92aXNpdF9jZl9hbGxfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2NmX2FsbF9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X3Zpc2l0X2NmX2FsbF90YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9DdXJlX3ZzX0ZhaWwvdF92aXNpdF9jZl9hbGxfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyMgQ3VyZS9GYWlsIGJ5IHZpc2l0LCBNb25vY3l0ZXMKCmBgYHtyIHZpc2l0X2NmX21vbm9jeXRlX2RlfQp2aXNpdGNmX2ZhY3RvciA8LSBwYXN0ZTAoInYiLCBwRGF0YSh0X21vbm9jeXRlcylbWyJ2aXNpdG51bWJlciJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEodF9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dKQp0X21vbm9jeXRlc192aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9tb25vY3l0ZXMsIGZhY3Q9dmlzaXRjZl9mYWN0b3IpCgp0X3Zpc2l0X2NmX21vbm9jeXRlX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9tb25vY3l0ZXNfdmlzaXRjZiwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUpCgp0X3Zpc2l0X2NmX21vbm9jeXRlX3RhYmxlc19zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X3Zpc2l0X2NmX21vbm9jeXRlX2RlX3N2YSwKICAgIGtlZXBlcnMgPSB2aXNpdGNmX2NvbnRyYXN0cywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Nb25vY3l0ZXMvdF92aXNpdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhLXZ7dmVyfS54bHN4IikpCnRfdmlzaXRfY2ZfbW9ub2N5dGVfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF92aXNpdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L01vbm9jeXRlcy90X3Zpc2l0X2NmX21vbm9jeXRlX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKCnRfdjFmY19kZXNlcV9tYSA8LSB0X3Zpc2l0X2NmX21vbm9jeXRlX3RhYmxlc19zdmFbWyJwbG90cyJdXVtbInYxY2YiXV1bWyJkZXNlcV9tYV9wbG90cyJdXVtbInBsb3QiXV0KZGV2IDwtIHBwKGZpbGU9ImltYWdlcy9tb25vY3l0ZV9jZl9kZV92MV9tYXBsb3QucG5nIikKdF92MWZjX2Rlc2VxX21hCmNsb3NlZCA8LSBkZXYub2ZmKCkKdF92MWZjX2Rlc2VxX21hCgp0X3YyZmNfZGVzZXFfbWEgPC0gdF92aXNpdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1sicGxvdHMiXV1bWyJ2MmNmIl1dW1siZGVzZXFfbWFfcGxvdHMiXV1bWyJwbG90Il1dCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbW9ub2N5dGVfY2ZfZGVfdjJfbWFwbG90LnBuZyIpCnRfdjJmY19kZXNlcV9tYQpjbG9zZWQgPC0gZGV2Lm9mZigpCnRfdjJmY19kZXNlcV9tYQoKdF92M2ZjX2Rlc2VxX21hIDwtIHRfdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbInBsb3RzIl1dW1sidjNjZiJdXVtbImRlc2VxX21hX3Bsb3RzIl1dW1sicGxvdCJdXQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL21vbm9jeXRlX2NmX2RlX3YzX21hcGxvdC5wbmciKQp0X3YzZmNfZGVzZXFfbWEKY2xvc2VkIDwtIGRldi5vZmYoKQp0X3YzZmNfZGVzZXFfbWEKYGBgCgpPbmUgcXVlcnkgZnJvbSBBbGVqYW5kcm8gaXMgdG8gbG9vayBhdCB0aGUgZ2VuZXMgc2hhcmVkIHVwL2Rvd24gYWNyb3NzCnZpc2l0cy4gIEkgYW0gbm90IGVudGlyZWx5IGNlcnRhaW4gd2UgaGF2ZSBlbm91Z2ggc2FtcGxlcyBmb3IgdGhpcyB0bwp3b3JrLCBidXQgbGV0IHVzIGZpbmQgb3V0LgoKSSBhbSB0aGlua2luZyB0aGlzIGlzIGEgZ29vZCBwbGFjZSB0byB1c2UgdGhlIEFVQ0MgY3VydmVzIEkgbGVhcm5lZAphYm91dCB0aGFua3MgdG8gSnVsaWUgQ3JpZGxhbmQuCgpOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpcyBhbGwgbW9ub2N5dGUgc2FtcGxlcywgdGhpcyBzaG91bGQgdGhlcmVmb3JlCnBvdGVudGlhbGx5IGJlIG1vdmVkIHVwIGFuZCBhIHZlcnNpb24gb2YgdGhpcyB3aXRoIG9ubHkgdGhlIFR1bWFjbwpzYW1wbGVzIHB1dCBoZXJlPwoKYGBge3IgbW9ub2N5dGVfc2hhcmVkX2RlX2dlbmVzfQp2MWNmIDwtIHRfdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzX3N2YVtbImRhdGEiXV1bWyJ2MWNmIl1dCnYyY2YgPC0gdF92aXNpdF9jZl9tb25vY3l0ZV90YWJsZXNfc3ZhW1siZGF0YSJdXVtbInYyY2YiXV0KdjNjZiA8LSB0X3Zpc2l0X2NmX21vbm9jeXRlX3RhYmxlc19zdmFbWyJkYXRhIl1dW1sidjNjZiJdXQoKdjFfc2lnIDwtIGMoCiAgICByb3duYW1lcyh0X3Zpc2l0X2NmX21vbm9jeXRlX3NpZ19zdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbInYxY2YiXV0pLAogICAgcm93bmFtZXModF92aXNpdF9jZl9tb25vY3l0ZV9zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbInYxY2YiXV0pKQpsZW5ndGgodjFfc2lnKQoKdjJfc2lnIDwtIGMoCiAgICByb3duYW1lcyh0X3Zpc2l0X2NmX21vbm9jeXRlX3NpZ19zdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbInYyY2YiXV0pLAogICAgcm93bmFtZXModF92aXNpdF9jZl9tb25vY3l0ZV9zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbInYyY2YiXV0pKQpsZW5ndGgodjJfc2lnKQoKdjNfc2lnIDwtIGMoCiAgICByb3duYW1lcyh0X3Zpc2l0X2NmX21vbm9jeXRlX3NpZ19zdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbInYyY2YiXV0pLAogICAgcm93bmFtZXModF92aXNpdF9jZl9tb25vY3l0ZV9zaWdfc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbInYyY2YiXV0pKQpsZW5ndGgodjNfc2lnKQoKdF9tb25vY3l0ZV92aXNpdF9hdWNjX3YydjEgPC0gY2FsY3VsYXRlX2F1Y2ModjFjZiwgdGJsMj12MmNmLCBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbW9ub2N5dGVfdmlzaXRfdjJ2MV9hdWNjLnBuZyIpCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192MnYxW1sicGxvdCJdXQpjbG9zZWQgPC0gZGV2Lm9mZigpCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192MnYxW1sicGxvdCJdXQoKdF9tb25vY3l0ZV92aXNpdF9hdWNjX3YzdjEgPC0gY2FsY3VsYXRlX2F1Y2ModjFjZiwgdGJsMj12M2NmLCBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbW9ub2N5dGVfdmlzaXRfdjN2MV9hdWNjLnBuZyIpCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192M3YxW1sicGxvdCJdXQpjbG9zZWQgPC0gZGV2Lm9mZigpCnRfbW9ub2N5dGVfdmlzaXRfYXVjY192M3YxW1sicGxvdCJdXQpgYGAKCiMjIyMgQ3VyZS9GYWlsIGJ5IHZpc2l0LCBOZXV0cm9waGlscwoKYGBge3IgdmlzaXRfY2ZfbmV1dHJvcGhpbF9kZX0KdmlzaXRjZl9mYWN0b3IgPC0gcGFzdGUwKCJ2IiwgcERhdGEodF9uZXV0cm9waGlscylbWyJ2aXNpdG51bWJlciJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0pCnRfbmV1dHJvcGhpbF92aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9uZXV0cm9waGlscywgZmFjdD12aXNpdGNmX2ZhY3RvcikKdF92aXNpdF9jZl9uZXV0cm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UodF9uZXV0cm9waGlsX3Zpc2l0Y2YsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUpCgp0X3Zpc2l0X2NmX25ldXRyb3BoaWxfdGFibGVzX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHRfdmlzaXRfY2ZfbmV1dHJvcGhpbF9kZV9zdmEsCiAgICBrZWVwZXJzID0gdmlzaXRjZl9jb250cmFzdHMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vTmV1dHJvcGhpbHMvdF92aXNpdF9jZl9uZXV0cm9waGlsX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF92aXNpdF9jZl9uZXV0cm9waGlsX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfdmlzaXRfY2ZfbmV1dHJvcGhpbF90YWJsZXNfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJ7eGxzeF9wcmVmaXh9L05ldXRyb3BoaWxzL3RfdmlzaXRfY2ZfbmV1dHJvcGhpbF9zaWdfc3ZhLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIyBDdXJlL0ZhaWwgYnkgdmlzaXQsIEVvc2lub3BoaWxzCgpgYGB7ciB2aXNpdF9jZl9lb3Npbm9waGlsX2RlfQp2aXNpdGNmX2ZhY3RvciA8LSBwYXN0ZTAoInYiLCBwRGF0YSh0X2Vvc2lub3BoaWxzKVtbInZpc2l0bnVtYmVyIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSh0X2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSkKdF9lb3Npbm9waGlsX3Zpc2l0Y2YgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0X2Vvc2lub3BoaWxzLCBmYWN0PXZpc2l0Y2ZfZmFjdG9yKQp0X3Zpc2l0X2NmX2Vvc2lub3BoaWxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X2Vvc2lub3BoaWxfdmlzaXRjZiwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSkKCnRfdmlzaXRfY2ZfZW9zaW5vcGhpbF90YWJsZXNfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF92aXNpdF9jZl9lb3Npbm9waGlsX2RlX3N2YSwKICAgIGtlZXBlcnMgPSB2aXNpdGNmX2NvbnRyYXN0cywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgie3hsc3hfcHJlZml4fS9Fb3Npbm9waGlscy90X3Zpc2l0X2NmX2Vvc2lub3BoaWxfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2NmX2Vvc2lub3BoaWxfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF92aXNpdF9jZl9lb3Npbm9waGlsX3RhYmxlc19zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoInt4bHN4X3ByZWZpeH0vRW9zaW5vcGhpbHMvdF92aXNpdF9jZl9lb3Npbm9waGlsX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBQZXJzaXN0ZW5jZSBpbiB2aXNpdCAzCgpIYXZpbmcgcHV0IHNvbWUgU0wgcmVhZCBtYXBwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBzYW1wbGUgc2hlZXQsIE1hcmlhCkFkZWxhaWRhIGFkZGVkIGEgbmV3IGNvbHVtbiB1c2luZyBpdCB3aXRoIHRoZSBwdXRhdGl2ZSBwZXJzaXN0ZW5jZQpzdGF0ZSBvbiBhIHBlci1zYW1wbGUgYmFzaXMuICBPbmUgcXVlc3Rpb24gd2hpY2ggYXJpc2VkIGZyb20gdGhhdDoKd2hhdCBkaWZmZXJlbmNlcyBhcmUgb2JzZXJ2YWJsZSBiZXR3ZWVuIHRoZSBwZXJzaXN0ZW50IHllcyB2cy4gbm8Kc2FtcGxlcyBvbiBhIHBlci1jZWxsLXR5cGUgYmFzaXMgYW1vbmcgdGhlIHZpc2l0IDMgc2FtcGxlcy4KCiMjIyBTZXR0aW5nIHVwCgpGaXJzdCB0aGluZ3MgZmlyc3QsIGNyZWF0ZSB0aGUgZGF0YXNldHMuCgpgYGB7ciBwZXJzaXN0ZW5jZV9zZXR1cH0KcGVyc2lzdGVuY2VfZXhwdCA8LSBzdWJzZXRfZXhwdCh0X2NsaW5pY2FsLCBzdWJzZXQgPSAicGVyc2lzdGVuY2U9PSdZJ3xwZXJzaXN0ZW5jZT09J04nIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gJ3Zpc2l0bnVtYmVyPT0zJykgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gJ3BlcnNpc3RlbmNlJykKCiMjIHBlcnNpc3RlbmNlX2Jpb3BzeSA8LSBzdWJzZXRfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdiaW9wc3knIikKcGVyc2lzdGVuY2VfbW9ub2N5dGUgPC0gc3Vic2V0X2V4cHQocGVyc2lzdGVuY2VfZXhwdCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnBlcnNpc3RlbmNlX25ldXRyb3BoaWwgPC0gc3Vic2V0X2V4cHQocGVyc2lzdGVuY2VfZXhwdCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbmV1dHJvcGhpbHMnIikKcGVyc2lzdGVuY2VfZW9zaW5vcGhpbCA8LSBzdWJzZXRfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQpgYGAKCiMjIyBUYWtlIGEgbG9vawoKU2VlIGlmIHRoZXJlIGFyZSBhbnkgcGF0dGVybnMgd2hpY2ggbG9vayB1c2FibGUuCgpgYGB7ciBwZXJzaXN0ZW5jZV9wbG90fQojIyBBbGwKcGVyc2lzdGVuY2Vfbm9ybSA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EocGVyc2lzdGVuY2Vfbm9ybSkkcGxvdApwZXJzaXN0ZW5jZV9uYiA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EocGVyc2lzdGVuY2VfbmIpJHBsb3QKCiMjIEJpb3BzaWVzCiMjcGVyc2lzdGVuY2VfYmlvcHN5X25vcm0gPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfYmlvcHN5LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQojI3Bsb3RfcGNhKHBlcnNpc3RlbmNlX2Jpb3BzeV9ub3JtKSRwbG90CiMjIEluc3VmZmljaWVudCBkYXRhCgojIyBNb25vY3l0ZXMKcGVyc2lzdGVuY2VfbW9ub2N5dGVfbm9ybSA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9tb25vY3l0ZSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX21vbm9jeXRlX25vcm0pJHBsb3QKcGVyc2lzdGVuY2VfbW9ub2N5dGVfbmIgPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfbW9ub2N5dGUsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9tb25vY3l0ZV9uYikkcGxvdAoKIyMgTmV1dHJvcGhpbHMKcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX25ldXRyb3BoaWwsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX25ldXRyb3BoaWxfbm9ybSkkcGxvdApwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX25iIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX25ldXRyb3BoaWwsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX25ldXRyb3BoaWxfbmIpJHBsb3QKCiMjIEVvc2lub3BoaWxzCnBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfbm9ybSA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9lb3Npbm9waGlsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX25vcm0pJHBsb3QKcGVyc2lzdGVuY2VfZW9zaW5vcGhpbF9uYiA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9lb3Npbm9waGlsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX25iKSRwbG90CmBgYAoKIyMjIHBlcnNpc3RlbmNlIERFCgpgYGB7ciBwZXJzaXN0ZW5jZV9kZX0KcGVyc2lzdGVuY2VfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZShwZXJzaXN0ZW5jZV9leHB0LCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQpwZXJzaXN0ZW5jZV90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBwZXJzaXN0ZW5jZV9kZV9zdmEsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImFuYWx5c2VzLzRfdHVtYWNvL0RFX1BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlX2FsbF9kZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKCnBlcnNpc3RlbmNlX21vbm9jeXRlX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UocGVyc2lzdGVuY2VfbW9ub2N5dGUsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCnBlcnNpc3RlbmNlX21vbm9jeXRlX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHBlcnNpc3RlbmNlX21vbm9jeXRlX2RlX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvNF90dW1hY28vREVfUGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfbW9ub2N5dGVfZGVfc3ZhLXZ7dmVyfS54bHN4IikpCgpwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX2RlX3N2YSA8LSBhbGxfcGFpcndpc2UocGVyc2lzdGVuY2VfbmV1dHJvcGhpbCwgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX2RlX3N2YSwKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvNF90dW1hY28vREVfUGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfbmV1dHJvcGhpbF9kZV9zdmEtdnt2ZXJ9Lnhsc3giKSkKCnBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZShwZXJzaXN0ZW5jZV9lb3Npbm9waGlsLCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQpwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX3RhYmxlX3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfZGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9QZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV9lb3Npbm9waGlsX2RlX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIENvbXBhcmluZyB2aXNpdHMgd2l0aG91dCByZWdhcmQgdG8gY3VyZS9mYWlsCgojIyMgQWxsIGNlbGwgdHlwZXMKCmBgYHtyIGRlX2NmX3Zpc2l0X2FsbH0KdF92aXNpdF9hbGxfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X3Zpc2l0LCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQoKdF92aXNpdF9hbGxfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF92aXNpdF9hbGxfZGVfc3ZhLAogICAga2VlcGVycyA9IHZpc2l0X2NvbnRyYXN0cywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiYW5hbHlzZXMvNF90dW1hY28vREVfVmlzaXRzL3RfdmlzaXRfYWxsX3RhYmxlc19zdmEtdnt2ZXJ9Lnhsc3giKSkKdF92aXNpdF9hbGxfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdF92aXNpdF9hbGxfdGFibGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9WaXNpdHMvdF92aXNpdF9hbGxfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2FsbF9zYXZlZCA8LSBzYXZlKGxpc3QgPSAidF92aXNpdF9hbGxfdGFibGVfc3ZhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gZ2x1ZTo6Z2x1ZSgicmRhL3Zpc2l0X2FsbF90YWJsZS12e3Zlcn0ucmRhIikpCmBgYAoKIyMjIE1vbm9jeXRlIHNhbXBsZXMKCmBgYHtyIGRlX2NmX3Zpc2l0X21vbm9jeXRlfQp0X3Zpc2l0X21vbm9jeXRlcyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKHRfbW9ub2N5dGVzLCBmYWN0PSJ2aXNpdG51bWJlciIpCnRfdmlzaXRfbW9ub2N5dGVfZGVfc3ZhIDwtIGFsbF9wYWlyd2lzZSh0X3Zpc2l0X21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIikKCnRfdmlzaXRfbW9ub2N5dGVfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF92aXNpdF9tb25vY3l0ZV9kZV9zdmEsCiAgICBrZWVwZXJzID0gdmlzaXRfY29udHJhc3RzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9WaXNpdHMvTW9ub2N5dGVzL3RfdmlzaXRfbW9ub2N5dGVfdGFibGVzX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X21vbm9jeXRlX3NpZ19zdmEgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHRfdmlzaXRfbW9ub2N5dGVfdGFibGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9WaXNpdHMvTW9ub2N5dGVzL3RfdmlzaXRfbW9ub2N5dGVfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBOZXV0cm9waGlsIHNhbXBsZXMKCmBgYHtyIGRlX2NmX3Zpc2l0X25ldXRyb3BoaWx9CnRfdmlzaXRfbmV1dHJvcGhpbHMgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0X25ldXRyb3BoaWxzLCBmYWN0PSJ2aXNpdG51bWJlciIpCnRfdmlzaXRfbmV1dHJvcGhpbF9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHRfdmlzaXRfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCgp0X3Zpc2l0X25ldXRyb3BoaWxfdGFibGVfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdF92aXNpdF9uZXV0cm9waGlsX2RlX3N2YSwKICAgIGtlZXBlcnMgPSB2aXNpdF9jb250cmFzdHMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImFuYWx5c2VzLzRfdHVtYWNvL0RFX1Zpc2l0cy9OZXV0cm9waGlscy90X3Zpc2l0X25ldXRyb3BoaWxfdGFibGVfc3ZhLXZ7dmVyfS54bHN4IikpCnRfdmlzaXRfbmV1dHJvcGhpbF9zaWdfc3ZhIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X3Zpc2l0X25ldXRyb3BoaWxfdGFibGVfc3ZhLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9WaXNpdHMvTmV1dHJvcGhpbHMvdF92aXNpdF9uZXV0cm9waGlsX3NpZ19zdmEtdnt2ZXJ9Lnhsc3giKSkKdmlzaXRfbmV1dHJvcGhpbF9zYXZlZCA8LSBzYXZlKGxpc3QgPSAidF92aXNpdF9uZXV0cm9waGlsX3RhYmxlX3N2YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gZ2x1ZTo6Z2x1ZSgicmRhL3Zpc2l0X25ldXRyb3BoaWxfdGFibGVfc3ZhLXZ7dmVyfS5yZGEiKSkKYGBgCgojIyMgRW9zaW5vcGhpbCBzYW1wbGVzCgpgYGB7ciBkZV9jZl92aXNpdF9lb3Npbm9waGlsfQp0X3Zpc2l0X2Vvc2lub3BoaWxzIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9lb3Npbm9waGlscywgZmFjdD0idmlzaXRudW1iZXIiKQp0X3Zpc2l0X2Vvc2lub3BoaWxfZGUgPC0gYWxsX3BhaXJ3aXNlKHRfdmlzaXRfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCgp0X3Zpc2l0X2Vvc2lub3BoaWxfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0X3Zpc2l0X2Vvc2lub3BoaWxfZGUsCiAgICBrZWVwZXJzID0gdmlzaXRfY29udHJhc3RzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJhbmFseXNlcy80X3R1bWFjby9ERV9WaXNpdHMvRW9zaW5vcGhpbHMvdF92aXNpdF9lb3Npbm9waGlsX3RhYmxlX3N2YS12e3Zlcn0ueGxzeCIpKQp0X3Zpc2l0X2Vvc2lub3BoaWxfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB0X3Zpc2l0X2Vvc2lub3BoaWxfdGFibGUsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImFuYWx5c2VzLzRfdHVtYWNvL0RFX1Zpc2l0cy9Fb3Npbm9waGlscy90X3Zpc2l0X2Vvc2lub3BoaWxfc2lnX3N2YS12e3Zlcn0ueGxzeCIpKQp2aXNpdF9lb3Npbm9waGlsX3NhdmVkIDwtIHNhdmUobGlzdCA9ICJ0X3Zpc2l0X2Vvc2lub3BoaWxfdGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGdsdWU6OmdsdWUoInJkYS92aXNpdF9lb3Npbm9waGlsX3RhYmxlLXZ7dmVyfS5yZGEiKSkKYGBgCgoKYGBge3Igc2F2ZW1lLCBldmFsPUZBTFNFfQppZiAoIWlzVFJVRShnZXQwKCJza2lwX2xvYWQiKSkpIHsKICBwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQogIG1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQogIG1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgc2F2ZWZpbGUpKQogIHRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9c2F2ZWZpbGUpKQp9CmBgYAoKYGBge3IgbG9hZG1lX2FmdGVyLCBldmFsPUZBTFNFfQp0bXAgPC0gbG9hZG1lKGZpbGVuYW1lPXNhdmVmaWxlKQpgYGAK