Summary of Findings:

As far as the TMB comparisons go, it doesn’t matter if we use Variant_Classification filters or not. They are highly correlated no matter what and the same general TCGA to PBTA differences seem to persist.

Usage

On AWS, if both run_caller_consensus_analysis-tcga.sh and run_caller_consensus_analysis-pbta.sh have been run, you can run this to get this analysis ran.

# bash run_explorations.sh

Table of Contents generated with DocToc - Setup - Read in the TMB files - Read in PBTA data - Read in TCGA data - Does the filter change a participant’s TMB? - Plot PBTA data - Plot TCGA data - Are some histologies affected more than others? - Does the filter affect the TCGA-PBTA comparison change? - Plot the TMB plot with no filter data - Session Info

Setup

# Magrittr pipe
`%>%` <- dplyr::`%>%`
source(file.path("..", "..", "tmb-compare-tcga", "util", "cdf-plot-function.R"))
dir.create("plots", showWarnings = FALSE)

Read in the TMB files

Read in PBTA data

tmb_pbta_no_filter <- data.table::fread(file.path(
  "..",
  "results",
  "no_filter",
  "pbta-snv-mutation-tmb-coding.tsv"
)) %>%
  # This variable is weird when binding but we don't need it for the plot so we'll just remove it.
  dplyr::select(-region_size) %>%
  dplyr::filter(experimental_strategy != "Panel") %>%
  dplyr::mutate(filter = "no filter")
tmb_pbta_with_filter <- data.table::fread(file.path(
  "..",
  "results",
  "consensus",
  "pbta-snv-mutation-tmb-coding.tsv"
)) %>%
  # This variable is weird when binding but we don't need it for the plot so we'll just remove it.
  dplyr::select(-region_size) %>%
  dplyr::filter(experimental_strategy != "Panel") %>%
  dplyr::mutate(filter = "filter")
tmb_pbta <- dplyr::inner_join(tmb_pbta_no_filter,
  dplyr::select(tmb_pbta_with_filter, Tumor_Sample_Barcode, tmb),
  by = "Tumor_Sample_Barcode",
  suffix = c("_no_filter", "_filter")
)

Read in TCGA data

tmb_tcga_no_filter <- data.table::fread(file.path(
  "..",
  "results",
  "no_filter",
  "tcga-snv-mutation-tmb-coding.tsv"
)) %>%
  dplyr::select(-region_size) %>%
  dplyr::mutate(filter = "no filter")
tmb_tcga_with_filter <- data.table::fread(file.path(
  "..",
  "results",
  "consensus",
  "tcga-snv-mutation-tmb-coding.tsv"
)) %>%
  dplyr::select(-region_size) %>%
  dplyr::mutate(filter = "filter")

Join these together.

tmb_tcga <- dplyr::inner_join(tmb_tcga_no_filter,
  dplyr::select(tmb_tcga_with_filter, Tumor_Sample_Barcode, tmb),
  by = "Tumor_Sample_Barcode",
  suffix = c("_no_filter", "_filter")
)

Does the filter change a participant’s TMB?

Plot PBTA data

cor.test(tmb_tcga$tmb_filter, tmb_tcga$tmb_no_filter)

    Pearson's product-moment correlation

data:  tmb_tcga$tmb_filter and tmb_tcga$tmb_no_filter
t = 4296.2, df = 316, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.9999893 0.9999931
sample estimates:
      cor 
0.9999914 
tcga_cor_plot <- ggplot2::ggplot(
  tmb_tcga,
  ggplot2::aes(x = tmb_no_filter, y = tmb_filter, color = short_histology)
) +
  ggplot2::geom_point() +
  ggplot2::xlim(0, 5) +
  ggplot2::ylim(0, 5) +
  ggplot2::theme_classic() +
  ggplot2::theme(legend.position = "none")

tcga_cor_plot

Plot TCGA data

cor.test(tmb_tcga$tmb_filter, tmb_tcga$tmb_no_filter)

    Pearson's product-moment correlation

data:  tmb_tcga$tmb_filter and tmb_tcga$tmb_no_filter
t = 4296.2, df = 316, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.9999893 0.9999931
sample estimates:
      cor 
0.9999914 
all_data <- dplyr::bind_rows(list(tcga = tmb_tcga, pbta = tmb_pbta), .id = "dataset") %>%
  dplyr::select(tmb_filter, tmb_no_filter, dataset, Tumor_Sample_Barcode, short_histology) %>%
  tidyr::gather("filter", "tmb", -Tumor_Sample_Barcode, -dataset, -short_histology)

Are some histologies affected more than others?

pbta_cor_plot + 
  ggplot2::facet_wrap(~short_histology)

tcga_cor_plot + 
  ggplot2::facet_wrap(~short_histology)

Does the filter affect the TCGA-PBTA comparison change?

all_data <- dplyr::bind_rows(list(tcga = tmb_tcga, pbta = tmb_pbta), .id = "dataset") %>%
  dplyr::select(tmb_filter, tmb_no_filter, dataset, Tumor_Sample_Barcode, short_histology) %>%
  tidyr::gather("filter", "tmb", -Tumor_Sample_Barcode, -dataset, -short_histology)
ggplot2::ggplot(all_data, ggplot2::aes(x = dataset, y = tmb)) +
  ggforce::geom_sina() +
  ggplot2::theme_classic() +
  ggplot2::ylim(0, 10) +
  ggplot2::theme(legend.position = "none") +
  ggplot2::facet_wrap("filter")

Plot the TMB plot with no filter data

This code is directly copied from tmb-compare-tcga/tmb-compare-tcga.Rmd.

pbta_plot <- cdf_plot(
  df = tmb_pbta_no_filter,
  plot_title = "PBTA",
  num_col = "tmb",
  group_col = "short_histology",
  color = "#3BC8A2",
  n_group = 5,
  x_lim = c(-1.2, 1.2),
  y_lim = c(0, 400),
  x_lab = "",
  y_lab = "Coding Mutations per Mb", 
  breaks = c(0, 3, 10, 30, 100, 300)
) +
  ggplot2::theme(
    strip.text.x = ggplot2::element_text(size = 12), 
    plot.margin = grid::unit(c(0.5, 0, 0.6, 0.5), "cm")
  )
the condition has length > 1 and only the first element will be used
tcga_plot <- cdf_plot(
  df = tmb_tcga_no_filter,
  plot_title = "TCGA (Adult)",
  num_col = "tmb",
  group_col = "short_histology",
  color = "#630882",
  n_group = 5,
  x_lim = c(-1.2, 1.2),
  y_lim = c(0, 400),
  x_lab = "",
  y_lab = "Coding Mutations per Mb",
  breaks = c()
) +
  ggplot2::theme(
    axis.title.y = ggplot2::element_blank(),
    axis.text.y = ggplot2::element_blank(),
    axis.ticks.y = ggplot2::element_blank(),
    strip.text.x = ggplot2::element_text(size = 9), 
    plot.margin = grid::unit(c(0.5, 1, 0.1, 0), "cm")
  )
the condition has length > 1 and only the first element will be used
# Put the plots together
tmb_plot <- cowplot::plot_grid(pbta_plot, tcga_plot,
  align = "v",
  axis = "left",
  rel_widths = c(2.5, 1),
  label_size = 12
)
Removed 3 rows containing missing values (geom_point).Removed 1 rows containing missing values (geom_point).
# Save the plot to a png
cowplot::save_plot(file.path("plots", "no_filter_tmb-cdf-pbta-tcga.png"),
  plot = tmb_plot, base_width = 35, base_height = 20, unit = "cm"
)

Print from png

No filter TMB Plot

With filter TMB Plot

## Session Info

sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)

Matrix products: default
BLAS/LAPACK: /usr/lib/libopenblasp-r0.2.19.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8       
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8    LC_MESSAGES=C             
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.1        pillar_1.4.2      compiler_3.6.0    base64enc_0.1-3   tools_3.6.0      
 [6] digest_0.6.20     jsonlite_1.6      evaluate_0.14     tibble_2.1.3      gtable_0.3.0     
[11] pkgconfig_2.0.2   rlang_0.4.0       cli_1.1.0         rstudioapi_0.10   yaml_2.2.0       
[16] xfun_0.8          withr_2.1.2       styler_1.1.1      stringr_1.4.0     dplyr_0.8.3      
[21] knitr_1.23        cowplot_0.9.4     grid_3.6.0        tidyselect_0.2.5  glue_1.3.1       
[26] data.table_1.12.2 R6_2.4.0          rmarkdown_1.13    polyclip_1.10-0   rematch2_2.0.1   
[31] ggplot2_3.2.0     purrr_0.3.2       tidyr_0.8.3       tweenr_1.0.1      farver_1.1.0     
[36] magrittr_1.5      backports_1.1.4   scales_1.0.0      htmltools_0.3.6   MASS_7.3-51.4    
[41] assertthat_0.2.1  ggforce_0.2.2     colorspace_1.4-1  labeling_0.3      stringi_1.4.3    
[46] lazyeval_0.2.2    munsell_0.5.0     crayon_1.3.4     
LS0tCnRpdGxlOiAiRXhwbG9yZSBpbXBhY3Qgb2YgTm9uIFN5bm9ueW1vdXMgRmlsdGVycyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKYXV0aG9yOiBDLiBTYXZvbmVuIGZvciBBTFNGIENDREwKZGF0ZTogMjAyMAotLS0KCiMjIyBTdW1tYXJ5IG9mIEZpbmRpbmdzOgoKQXMgZmFyIGFzIHRoZSBUTUIgY29tcGFyaXNvbnMgZ28sIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHdlIHVzZSBgVmFyaWFudF9DbGFzc2lmaWNhdGlvbmAgZmlsdGVycyBvciBub3QuIApUaGV5IGFyZSBoaWdobHkgY29ycmVsYXRlZCBubyBtYXR0ZXIgd2hhdCBhbmQgdGhlIHNhbWUgZ2VuZXJhbCBUQ0dBIHRvIFBCVEEgZGlmZmVyZW5jZXMgc2VlbSB0byBwZXJzaXN0LiAKCiMjIyBVc2FnZQoKT24gQVdTLCBpZiBib3RoIGBydW5fY2FsbGVyX2NvbnNlbnN1c19hbmFseXNpcy10Y2dhLnNoYCBhbmQgYHJ1bl9jYWxsZXJfY29uc2Vuc3VzX2FuYWx5c2lzLXBidGEuc2hgIGhhdmUgYmVlbiBydW4sIHlvdSBjYW4gcnVuIHRoaXMgdG8gZ2V0IHRoaXMgYW5hbHlzaXMgcmFuLgoKYGBgCiMgYmFzaCBydW5fZXhwbG9yYXRpb25zLnNoCmBgYAoKPCEtLSBTVEFSVCBkb2N0b2MgZ2VuZXJhdGVkIFRPQyBwbGVhc2Uga2VlcCBjb21tZW50IGhlcmUgdG8gYWxsb3cgYXV0byB1cGRhdGUgLS0+CjwhLS0gRE9OJ1QgRURJVCBUSElTIFNFQ1RJT04sIElOU1RFQUQgUkUtUlVOIGRvY3RvYyBUTyBVUERBVEUgLS0+CioqVGFibGUgb2YgQ29udGVudHMqKiAgKmdlbmVyYXRlZCB3aXRoIFtEb2NUb2NdKGh0dHBzOi8vZ2l0aHViLmNvbS90aGxvcmVuei9kb2N0b2MpKgotIFtTZXR1cF0oI3NldHVwKQotIFtSZWFkIGluIHRoZSBUTUIgZmlsZXNdKCNyZWFkLWluLXRoZS10bWItZmlsZXMpCiAgLSBbUmVhZCBpbiBQQlRBIGRhdGFdKCNyZWFkLWluLXBidGEtZGF0YSkKICAtIFtSZWFkIGluIFRDR0EgZGF0YV0oI3JlYWQtaW4tdGNnYS1kYXRhKQotIFtEb2VzIHRoZSBmaWx0ZXIgY2hhbmdlIGEgcGFydGljaXBhbnQncyBUTUI/XSgjZG9lcy10aGUtZmlsdGVyLWNoYW5nZS1hLXBhcnRpY2lwYW50cy10bWIpCiAgLSBbUGxvdCBQQlRBIGRhdGFdKCNwbG90LXBidGEtZGF0YSkKICAtIFtQbG90IFRDR0EgZGF0YV0oI3Bsb3QtdGNnYS1kYXRhKQotIFtBcmUgc29tZSBoaXN0b2xvZ2llcyBhZmZlY3RlZCBtb3JlIHRoYW4gb3RoZXJzP10oI2FyZS1zb21lLWhpc3RvbG9naWVzLWFmZmVjdGVkLW1vcmUtdGhhbi1vdGhlcnMpCi0gW0RvZXMgdGhlIGZpbHRlciBhZmZlY3QgdGhlIFRDR0EtUEJUQSBjb21wYXJpc29uIGNoYW5nZT9dKCNkb2VzLXRoZS1maWx0ZXItYWZmZWN0LXRoZS10Y2dhLXBidGEtY29tcGFyaXNvbi1jaGFuZ2UpCi0gW1Bsb3QgdGhlIFRNQiBwbG90IHdpdGggbm8gZmlsdGVyIGRhdGFdKCNwbG90LXRoZS10bWItcGxvdC13aXRoLW5vLWZpbHRlci1kYXRhKQotIFtTZXNzaW9uIEluZm9dKCNzZXNzaW9uLWluZm8pCgo8IS0tIEVORCBkb2N0b2MgZ2VuZXJhdGVkIFRPQyBwbGVhc2Uga2VlcCBjb21tZW50IGhlcmUgdG8gYWxsb3cgYXV0byB1cGRhdGUgLS0+CgojIyBTZXR1cAoKYGBge3J9CiMgTWFncml0dHIgcGlwZQpgJT4lYCA8LSBkcGx5cjo6YCU+JWAKYGBgCgpgYGB7cn0Kc291cmNlKGZpbGUucGF0aCgiLi4iLCAiLi4iLCAidG1iLWNvbXBhcmUtdGNnYSIsICJ1dGlsIiwgImNkZi1wbG90LWZ1bmN0aW9uLlIiKSkKYGBgCgpgYGB7cn0KZGlyLmNyZWF0ZSgicGxvdHMiLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKYGBgCgojIyBSZWFkIGluIHRoZSBUTUIgZmlsZXMKCiMjIyBSZWFkIGluIFBCVEEgZGF0YQoKYGBge3J9CnRtYl9wYnRhX25vX2ZpbHRlciA8LSBkYXRhLnRhYmxlOjpmcmVhZChmaWxlLnBhdGgoCiAgIi4uIiwKICAicmVzdWx0cyIsCiAgIm5vX2ZpbHRlciIsCiAgInBidGEtc252LW11dGF0aW9uLXRtYi1jb2RpbmcudHN2IgopKSAlPiUKICAjIFRoaXMgdmFyaWFibGUgaXMgd2VpcmQgd2hlbiBiaW5kaW5nIGJ1dCB3ZSBkb24ndCBuZWVkIGl0IGZvciB0aGUgcGxvdCBzbyB3ZSdsbCBqdXN0IHJlbW92ZSBpdC4KICBkcGx5cjo6c2VsZWN0KC1yZWdpb25fc2l6ZSkgJT4lCiAgZHBseXI6OmZpbHRlcihleHBlcmltZW50YWxfc3RyYXRlZ3kgIT0gIlBhbmVsIikgJT4lCiAgZHBseXI6Om11dGF0ZShmaWx0ZXIgPSAibm8gZmlsdGVyIikKYGBgCgpgYGB7cn0KdG1iX3BidGFfd2l0aF9maWx0ZXIgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZmlsZS5wYXRoKAogICIuLiIsCiAgInJlc3VsdHMiLAogICJjb25zZW5zdXMiLAogICJwYnRhLXNudi1tdXRhdGlvbi10bWItY29kaW5nLnRzdiIKKSkgJT4lCiAgIyBUaGlzIHZhcmlhYmxlIGlzIHdlaXJkIHdoZW4gYmluZGluZyBidXQgd2UgZG9uJ3QgbmVlZCBpdCBmb3IgdGhlIHBsb3Qgc28gd2UnbGwganVzdCByZW1vdmUgaXQuCiAgZHBseXI6OnNlbGVjdCgtcmVnaW9uX3NpemUpICU+JQogIGRwbHlyOjpmaWx0ZXIoZXhwZXJpbWVudGFsX3N0cmF0ZWd5ICE9ICJQYW5lbCIpICU+JQogIGRwbHlyOjptdXRhdGUoZmlsdGVyID0gImZpbHRlciIpCmBgYAoKYGBge3J9CnRtYl9wYnRhIDwtIGRwbHlyOjppbm5lcl9qb2luKHRtYl9wYnRhX25vX2ZpbHRlciwKICBkcGx5cjo6c2VsZWN0KHRtYl9wYnRhX3dpdGhfZmlsdGVyLCBUdW1vcl9TYW1wbGVfQmFyY29kZSwgdG1iKSwKICBieSA9ICJUdW1vcl9TYW1wbGVfQmFyY29kZSIsCiAgc3VmZml4ID0gYygiX25vX2ZpbHRlciIsICJfZmlsdGVyIikKKQpgYGAKCiMjIyBSZWFkIGluIFRDR0EgZGF0YQoKYGBge3J9CnRtYl90Y2dhX25vX2ZpbHRlciA8LSBkYXRhLnRhYmxlOjpmcmVhZChmaWxlLnBhdGgoCiAgIi4uIiwKICAicmVzdWx0cyIsCiAgIm5vX2ZpbHRlciIsCiAgInRjZ2Etc252LW11dGF0aW9uLXRtYi1jb2RpbmcudHN2IgopKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1yZWdpb25fc2l6ZSkgJT4lCiAgZHBseXI6Om11dGF0ZShmaWx0ZXIgPSAibm8gZmlsdGVyIikKYGBgCgpgYGB7cn0KdG1iX3RjZ2Ffd2l0aF9maWx0ZXIgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZmlsZS5wYXRoKAogICIuLiIsCiAgInJlc3VsdHMiLAogICJjb25zZW5zdXMiLAogICJ0Y2dhLXNudi1tdXRhdGlvbi10bWItY29kaW5nLnRzdiIKKSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtcmVnaW9uX3NpemUpICU+JQogIGRwbHlyOjptdXRhdGUoZmlsdGVyID0gImZpbHRlciIpCmBgYAoKSm9pbiB0aGVzZSB0b2dldGhlci4gCgpgYGB7cn0KdG1iX3RjZ2EgPC0gZHBseXI6OmlubmVyX2pvaW4odG1iX3RjZ2Ffbm9fZmlsdGVyLAogIGRwbHlyOjpzZWxlY3QodG1iX3RjZ2Ffd2l0aF9maWx0ZXIsIFR1bW9yX1NhbXBsZV9CYXJjb2RlLCB0bWIpLAogIGJ5ID0gIlR1bW9yX1NhbXBsZV9CYXJjb2RlIiwKICBzdWZmaXggPSBjKCJfbm9fZmlsdGVyIiwgIl9maWx0ZXIiKQopCmBgYAoKIyMgRG9lcyB0aGUgZmlsdGVyIGNoYW5nZSBhIHBhcnRpY2lwYW50J3MgVE1CPwoKIyMjIFBsb3QgUEJUQSBkYXRhCgpgYGB7cn0KY29yLnRlc3QodG1iX3BidGEkdG1iX2ZpbHRlciwgdG1iX3BidGEkdG1iX25vX2ZpbHRlcikKYGBgCgpgYGB7cn0KcGJ0YV9jb3JfcGxvdCA8LSBnZ3Bsb3QyOjpnZ3Bsb3QoCiAgdG1iX3BidGEsCiAgZ2dwbG90Mjo6YWVzKHggPSB0bWJfbm9fZmlsdGVyLCB5ID0gdG1iX2ZpbHRlciwgY29sb3IgPSBzaG9ydF9oaXN0b2xvZ3kpCikgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6eGxpbSgwLCA1KSArCiAgZ2dwbG90Mjo6eWxpbSgwLCA1KSArCiAgZ2dwbG90Mjo6dGhlbWVfY2xhc3NpYygpICsKICBnZ3Bsb3QyOjp0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgpwYnRhX2Nvcl9wbG90CmBgYAoKIyMjIFBsb3QgVENHQSBkYXRhCgpgYGB7cn0KY29yLnRlc3QodG1iX3RjZ2EkdG1iX2ZpbHRlciwgdG1iX3RjZ2EkdG1iX25vX2ZpbHRlcikKYGBgCgpgYGB7cn0KdGNnYV9jb3JfcGxvdCA8LSBnZ3Bsb3QyOjpnZ3Bsb3QoCiAgdG1iX3RjZ2EsCiAgZ2dwbG90Mjo6YWVzKHggPSB0bWJfbm9fZmlsdGVyLCB5ID0gdG1iX2ZpbHRlciwgY29sb3IgPSBzaG9ydF9oaXN0b2xvZ3kpCikgKwogIGdncGxvdDI6Omdlb21fcG9pbnQoKSArCiAgZ2dwbG90Mjo6eGxpbSgwLCA1KSArCiAgZ2dwbG90Mjo6eWxpbSgwLCA1KSArCiAgZ2dwbG90Mjo6dGhlbWVfY2xhc3NpYygpICsKICBnZ3Bsb3QyOjp0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgp0Y2dhX2Nvcl9wbG90CmBgYAoKIyMgQXJlIHNvbWUgaGlzdG9sb2dpZXMgYWZmZWN0ZWQgbW9yZSB0aGFuIG90aGVycz8gCgpgYGB7cn0KcGJ0YV9jb3JfcGxvdCArIAogIGdncGxvdDI6OmZhY2V0X3dyYXAofnNob3J0X2hpc3RvbG9neSkKYGBgCgpgYGB7cn0KdGNnYV9jb3JfcGxvdCArIAogIGdncGxvdDI6OmZhY2V0X3dyYXAofnNob3J0X2hpc3RvbG9neSkKYGBgCgojIyBEb2VzIHRoZSBmaWx0ZXIgYWZmZWN0IHRoZSBUQ0dBLVBCVEEgY29tcGFyaXNvbiBjaGFuZ2U/CgpgYGB7cn0KYWxsX2RhdGEgPC0gZHBseXI6OmJpbmRfcm93cyhsaXN0KHRjZ2EgPSB0bWJfdGNnYSwgcGJ0YSA9IHRtYl9wYnRhKSwgLmlkID0gImRhdGFzZXQiKSAlPiUKICBkcGx5cjo6c2VsZWN0KHRtYl9maWx0ZXIsIHRtYl9ub19maWx0ZXIsIGRhdGFzZXQsIFR1bW9yX1NhbXBsZV9CYXJjb2RlLCBzaG9ydF9oaXN0b2xvZ3kpICU+JQogIHRpZHlyOjpnYXRoZXIoImZpbHRlciIsICJ0bWIiLCAtVHVtb3JfU2FtcGxlX0JhcmNvZGUsIC1kYXRhc2V0LCAtc2hvcnRfaGlzdG9sb2d5KQpgYGAKCmBgYHtyfQpnZ3Bsb3QyOjpnZ3Bsb3QoYWxsX2RhdGEsIGdncGxvdDI6OmFlcyh4ID0gZGF0YXNldCwgeSA9IHRtYikpICsKICBnZ2ZvcmNlOjpnZW9tX3NpbmEoKSArCiAgZ2dwbG90Mjo6dGhlbWVfY2xhc3NpYygpICsKICBnZ3Bsb3QyOjp5bGltKDAsIDEwKSArCiAgZ2dwbG90Mjo6dGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZ2dwbG90Mjo6ZmFjZXRfd3JhcCgiZmlsdGVyIikKYGBgCgojIyBQbG90IHRoZSBUTUIgcGxvdCB3aXRoIG5vIGZpbHRlciBkYXRhCgpUaGlzIGNvZGUgaXMgZGlyZWN0bHkgY29waWVkIGZyb20gYHRtYi1jb21wYXJlLXRjZ2EvdG1iLWNvbXBhcmUtdGNnYS5SbWRgLgoKYGBge3J9CnBidGFfcGxvdCA8LSBjZGZfcGxvdCgKICBkZiA9IHRtYl9wYnRhX25vX2ZpbHRlciwKICBwbG90X3RpdGxlID0gIlBCVEEiLAogIG51bV9jb2wgPSAidG1iIiwKICBncm91cF9jb2wgPSAic2hvcnRfaGlzdG9sb2d5IiwKICBjb2xvciA9ICIjM0JDOEEyIiwKICBuX2dyb3VwID0gNSwKICB4X2xpbSA9IGMoLTEuMiwgMS4yKSwKICB5X2xpbSA9IGMoMCwgNDAwKSwKICB4X2xhYiA9ICIiLAogIHlfbGFiID0gIkNvZGluZyBNdXRhdGlvbnMgcGVyIE1iIiwgCiAgYnJlYWtzID0gYygwLCAzLCAxMCwgMzAsIDEwMCwgMzAwKQopICsKICBnZ3Bsb3QyOjp0aGVtZSgKICAgIHN0cmlwLnRleHQueCA9IGdncGxvdDI6OmVsZW1lbnRfdGV4dChzaXplID0gMTIpLCAKICAgIHBsb3QubWFyZ2luID0gZ3JpZDo6dW5pdChjKDAuNSwgMCwgMC42LCAwLjUpLCAiY20iKQogICkKYGBgCgpgYGB7cn0KdGNnYV9wbG90IDwtIGNkZl9wbG90KAogIGRmID0gdG1iX3RjZ2Ffbm9fZmlsdGVyLAogIHBsb3RfdGl0bGUgPSAiVENHQSAoQWR1bHQpIiwKICBudW1fY29sID0gInRtYiIsCiAgZ3JvdXBfY29sID0gInNob3J0X2hpc3RvbG9neSIsCiAgY29sb3IgPSAiIzYzMDg4MiIsCiAgbl9ncm91cCA9IDUsCiAgeF9saW0gPSBjKC0xLjIsIDEuMiksCiAgeV9saW0gPSBjKDAsIDQwMCksCiAgeF9sYWIgPSAiIiwKICB5X2xhYiA9ICJDb2RpbmcgTXV0YXRpb25zIHBlciBNYiIsCiAgYnJlYWtzID0gYygpCikgKwogIGdncGxvdDI6OnRoZW1lKAogICAgYXhpcy50aXRsZS55ID0gZ2dwbG90Mjo6ZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0LnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRpY2tzLnkgPSBnZ3Bsb3QyOjplbGVtZW50X2JsYW5rKCksCiAgICBzdHJpcC50ZXh0LnggPSBnZ3Bsb3QyOjplbGVtZW50X3RleHQoc2l6ZSA9IDkpLCAKICAgIHBsb3QubWFyZ2luID0gZ3JpZDo6dW5pdChjKDAuNSwgMSwgMC4xLCAwKSwgImNtIikKICApCmBgYAoKYGBge3J9CiMgUHV0IHRoZSBwbG90cyB0b2dldGhlcgp0bWJfcGxvdCA8LSBjb3dwbG90OjpwbG90X2dyaWQocGJ0YV9wbG90LCB0Y2dhX3Bsb3QsCiAgYWxpZ24gPSAidiIsCiAgYXhpcyA9ICJsZWZ0IiwKICByZWxfd2lkdGhzID0gYygyLjUsIDEpLAogIGxhYmVsX3NpemUgPSAxMgopCmBgYAoKYGBge3J9CiMgU2F2ZSB0aGUgcGxvdCB0byBhIHBuZwpjb3dwbG90OjpzYXZlX3Bsb3QoZmlsZS5wYXRoKCJwbG90cyIsICJub19maWx0ZXJfdG1iLWNkZi1wYnRhLXRjZ2EucG5nIiksCiAgcGxvdCA9IHRtYl9wbG90LCBiYXNlX3dpZHRoID0gMzUsIGJhc2VfaGVpZ2h0ID0gMjAsIHVuaXQgPSAiY20iCikKYGBgCgpQcmludCBmcm9tIHBuZwoKIyMjIE5vIGZpbHRlciBUTUIgUGxvdAohW10oLi9wbG90cy9ub19maWx0ZXJfdG1iLWNkZi1wYnRhLXRjZ2EucG5nKQoKIyMjIFdpdGggZmlsdGVyIFRNQiBQbG90CiFbXSguLi8uLi90bWItY29tcGFyZS10Y2dhL3Bsb3RzL3RtYi1jZGYtcGJ0YS10Y2dhLnBuZykKIyMgU2Vzc2lvbiBJbmZvCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAK