# print params
paged_table(as.data.frame(unlist(params)))

1 Data

getwd()
[1] "/sci/labs/yotamd/lab_share/avishai.wizel/R_projects/HMSC/Notebooks/TCGA"
library(TCGAbiolinks)
library(biomaRt)
library(kableExtra)
library(rmarkdown)
#source("./Notebooks/TCGA/TCGA_functions.R")
getwd()
[1] "/sci/labs/yotamd/lab_share/avishai.wizel/R_projects/HMSC/Notebooks/TCGA"
avg_diff_cutoff = 0.4
fdr_cutoff = 0.1
signature = opscc_deg %>% filter(avg_diff > avg_diff_cutoff &
                                  fdr < fdr_cutoff) %>% rownames()
signature
 [1] "HPV16-E5" "HPV16-E1" "H2AFZ"    "STMN1"    "CKS1B"    "TUBA1B"   "PTN"      "FBL"      "ALDH3A1"  "KRT5"    
[11] "RPL37"    "HMGB2"    "PTTG1"    "DST"      "IGFBP2"   "KRT15"    "RPS16"    "ATP1B3"   "PDLIM1"   "HSPA1A"  
[21] "S100A2"   "IGKC"     "HSPB1"   
project_name = "TCGA-HNSC"
HNSC_tpm = readRDS("./Data_out/TCGA_survival_analysis/TCGA_HNSC_TPM.RDS")
Warning in gzfile(file, "rb") :
  cannot open compressed file './Data_out/TCGA_survival_analysis/TCGA_HNSC_TPM.RDS', probable reason 'No such file or directory'
Error in gzfile(file, "rb") : cannot open the connection
clinical_data <- GDCquery_clinic(project_name, "clinical")
OPSCC_tissues = c("Base of tongue, NOS",
"Oropharynx, NOS",
"Posterior wall of oropharynx",
"Tonsil, NOS")
clinical_data = clinical_data[clinical_data$tissue_or_organ_of_origin %in% OPSCC_tissues,]
cbp_data = read_tsv(file = "./Input_data/TCGA/cbioportal_hnsc_tcga_pan_can_atlas_2018_clinical_data.tsv")
Error: './Input_data/TCGA/cbioportal_hnsc_tcga_pan_can_atlas_2018_clinical_data.tsv' does not exist in current working directory ('/sci/labs/yotamd/lab_share/avishai.wizel/R_projects/HMSC/Notebooks/TCGA').
# load data 
library("readxl")
library(stringr)
library(ggpubr)
TCGA_HPV_data <- read_excel("./Input_data/TCGA/PMC3806554_ncomms3513-s2.xlsx",skip = 3)
TCGA_HPV_data  %<>% filter(`Tumor type` == "Primary solid")
TCGA_HPV_data$submitter_id = TCGA_HPV_data$`Sample barcode` %>% str_sub( start = 1, end = 12) 
TCGA_HPV_data = TCGA_HPV_data %>%
    filter(Cancer == "HNSC") %>%
    mutate (hpv_status = 
            if_else(
              condition = ppm == "N/A",
              true = "HPV-",
              false =  "HPV+"))

clinical_data = inner_join(x = clinical_data,y = TCGA_HPV_data[,c("submitter_id","hpv_status")],by = c("submitter_id"="submitter_id"))

2 MYB

gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = params$stratify)
paged_table(gene_status)
clinical_data_with_scores = clinical_data[clinical_data$submitter_id %in% rownames(gene_status),]
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = left_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    main = "TCGA Set\n GBM",
    height = 10,
    width=10,filename = NULL,pval.method    =T
)

p[[1]]/p[[2]]
Warning in grSoftVersion() :
  unable to load shared object '/usr/local/lib/R/modules//R_X11.so':
  libXt.so.6: cannot open shared object file: No such file or directory

3 HPV+ signature


p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "hpv_status",
    filename = NULL,pval.method = T
)

p[[1]]/p[[2]]

4 MYB - HPV correlation

# load data 
library("readxl")
library(stringr)
library(ggpubr)
TCGA_HPV_data <- read_excel("./Input_data/TCGA/PMC3806554_ncomms3513-s5.xlsx",skip = 2)
TCGA_HPV_data$submitter_id = TCGA_HPV_data$`Sample Barcode` %>% str_sub( start = 1, end = 12) 
rownames(TCGA_HPV_data) = TCGA_HPV_data$submitter_id
TCGA_HPV_data = TCGA_HPV_data %>% filter(Cancer == "CESC")

gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = params$stratify)
gene_status = gene_status[TCGA_HPV_data$submitter_id,] %>%  cbind(HPV_PPM = TCGA_HPV_data$ppm) %>% na.omit()

paged_table(gene_status)


sp <- ggscatter(gene_status, x = "MYB", y = "HPV_PPM",
   add = "reg.line",  # Add regressin line
   add.params = list(color = "blue", fill = "lightgray"), # Customize reg. line
   conf.int = TRUE # Add confidence interval
   )
# Add correlation coefficient
sp + stat_cor(method = "pearson")

5 HPV signature - HPV correlation

# with HPV signature
gene_status = set_clinical_data(clin_data = clinical_data,genes = signature,tpm_data_frame = HNSC_tpm,stratify = params$stratify,signature_name = "HPV+ signature")
gene_status = gene_status[TCGA_HPV_data$submitter_id,] %>% cbind(HPV_PPM = TCGA_HPV_data$ppm) %>% na.omit()
paged_table(gene_status)

sp <- ggscatter(gene_status, x = "HPV+ signature", y = "HPV_PPM",
   add = "reg.line",  # Add regressin line
   add.params = list(color = "blue", fill = "lightgray"), # Customize reg. line
   conf.int = TRUE # Add confidence interval
   )
# Add correlation coefficient
sp + stat_cor(method = "pearson")

6 MYB- HPV T test


gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = params$stratify)
gene_status$patient = rownames(gene_status)
gene_status = inner_join(x = gene_status,y = clinical_data[,c("submitter_id","hpv_status")],by = c("patient"="submitter_id"))

paged_table(gene_status)
library(ggpubr)
library(rstatix)
stat.test <- gene_status %>%
  t_test(MYB ~ hpv_status) %>%
  add_significance()
stat.test



bxp <- ggboxplot(gene_status, x = "hpv_status", y = "MYB", fill = "#00AFBB")+
  geom_jitter()
stat.test <- stat.test %>% add_xy_position(x = "hpv_status")
bxp + 
  stat_pvalue_manual(stat.test,  label = "T-test, p = {p}") 

7 MYB and HPV survival plot

7.1 HPV + tumors

clinical_data_with_scores = clinical_data  %>% filter(hpv_status == "HPV+")

gene_status = set_clinical_data(clin_data = clinical_data_with_scores,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = "M")
paged_table(gene_status)
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = inner_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))
# debugonce(TCGAanalyze_survival)

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    filename = NULL,pval.method = T
)
p[[1]]/p[[2]]

7.2 HPV - tumors

clinical_data_with_scores = clinical_data  %>% filter(hpv_status == "HPV-")

gene_status = set_clinical_data(clin_data = clinical_data_with_scores,genes = "MYB",tpm_data_frame = HNSC_tpm,stratify = params$stratify)
paged_table(gene_status)
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = inner_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    filename = NULL,pval.method = T
)
p[[1]]/p[[2]]

8 shared signature

shared_signature = readRDS(file = "./Data_out/temp/shared_signature.RDS")
gene_status = set_clinical_data(clin_data = clinical_data,genes = shared_signature,tpm_data_frame = HNSC_tpm,stratify = params$stratify,signature_name = "HPV+ signature")
paged_table(gene_status)
clinical_data_with_scores = clinical_data[clinical_data$submitter_id %in% rownames(gene_status),]
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = left_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    main = "TCGA Set\n GBM",
    height = 10,
    width=10,filename = NULL,pval.method = T
)

p[[1]]/p[[2]]

9 HMSC signature

# load
hmsc_deg = read.table(file = "./Data_out/HPV_analysis/hpv_deg_df.csv",row.names = 1)
  avg_diff_cutoff = 1
  fdr_cutoff = 0.1
  signature = hmsc_deg %>% filter(avg_diff>avg_diff_cutoff & fdr<fdr_cutoff) %>% rownames()
  signature
gene_status = set_clinical_data(clin_data = clinical_data,genes = signature,tpm_data_frame = HNSC_tpm,stratify = params$stratify,signature_name = "HPV+ signature")
paged_table(gene_status)
clinical_data_with_scores = clinical_data[clinical_data$submitter_id %in% rownames(gene_status),]
gene_status$patient = rownames(gene_status)
clinical_data_with_scores = left_join(x = clinical_data_with_scores,y = gene_status, by = c("submitter_id"="patient"))

p = TCGAanalyze_survival(
    data = clinical_data_with_scores,
    clusterCol = "gene_status",
    main = "TCGA Set\n GBM",
    height = 10,
    width=10,filename = NULL,pval.method = T
)

p[[1]]/p[[2]]
LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMudGltZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICAKICBodG1sX2RvY3VtZW50OiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICBkZi1wcmludDogcGFnZWQKCnBhcmFtczoKICBzdHJhdGlmeTogIk0iCiAgbG9nX3RwbTogVFJVRQogIGRhdGFfb3V0X2RpcjogTlVMTAogIGZpZ3Nfb3V0X2RpcjogTlVMTAotLS0KCgpgYGB7cn0KIyBwcmludCBwYXJhbXMKcGFnZWRfdGFibGUoYXMuZGF0YS5mcmFtZSh1bmxpc3QocGFyYW1zKSkpCmBgYAoKIyBEYXRhCgpgYGB7cn0KCmxpYnJhcnkoVENHQWJpb2xpbmtzKQpsaWJyYXJ5KGJpb21hUnQpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShybWFya2Rvd24pCnNvdXJjZSgiLi9Ob3RlYm9va3MvVENHQS9UQ0dBX2Z1bmN0aW9ucy5SIikKYGBgCgoKCmBgYHtyfQojIGZpbmQgaHB2IHNpZ25hdHVyZSBnZW5lcwpvcHNjY19kZWcgPSByZWFkUkRTKGZpbGUgPSAiLi9EYXRhX291dC9vcHNjY19kZWcucmRzIikKCmF2Z19kaWZmX2N1dG9mZiA9IDAuNApmZHJfY3V0b2ZmID0gMC4xCnNpZ25hdHVyZSA9IG9wc2NjX2RlZyAlPiUgZmlsdGVyKGF2Z19kaWZmID4gYXZnX2RpZmZfY3V0b2ZmICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkciA8IGZkcl9jdXRvZmYpICU+JSByb3duYW1lcygpCnNpZ25hdHVyZQogIApgYGAKCmBgYHtyfQpwcm9qZWN0X25hbWUgPSAiVENHQS1ITlNDIgpgYGAKCmBgYHtyfQpITlNDX3RwbSA9IHJlYWRSRFMoIi4vRGF0YV9vdXQvVENHQV9zdXJ2aXZhbF9hbmFseXNpcy9UQ0dBX0hOU0NfVFBNLlJEUyIpCgppZiAocGFyYW1zJGxvZ190cG0pIHsKICBITlNDX3RwbSA9IGxvZzIoSE5TQ190cG0rMSkKICAKfQpgYGAKCmBgYHtyfQpjbGluaWNhbF9kYXRhIDwtIEdEQ3F1ZXJ5X2NsaW5pYyhwcm9qZWN0X25hbWUsICJjbGluaWNhbCIpCk9QU0NDX3Rpc3N1ZXMgPSBjKCJCYXNlIG9mIHRvbmd1ZSwgTk9TIiwKIk9yb3BoYXJ5bngsIE5PUyIsCiJQb3N0ZXJpb3Igd2FsbCBvZiBvcm9waGFyeW54IiwKIlRvbnNpbCwgTk9TIikKY2xpbmljYWxfZGF0YSA9IGNsaW5pY2FsX2RhdGFbY2xpbmljYWxfZGF0YSR0aXNzdWVfb3Jfb3JnYW5fb2Zfb3JpZ2luICVpbiUgT1BTQ0NfdGlzc3VlcyxdCmBgYAoKYGBge3J9CiMgYWRkIEhQViBkYXRhIGJ5IGNsaW5pY2FsIGRhdGEKY2JwX2RhdGEgPSByZWFkX3RzdihmaWxlID0gIi4vSW5wdXRfZGF0YS9UQ0dBL2NiaW9wb3J0YWxfaG5zY190Y2dhX3Bhbl9jYW5fYXRsYXNfMjAxOF9jbGluaWNhbF9kYXRhLnRzdiIpCmNicF9kYXRhID0gY2JwX2RhdGFbLGMoIlBhdGllbnQgSUQiLCAiU3VidHlwZSIpXSAlPiUgZHBseXI6OnJlbmFtZShocHZfc3RhdHVzID0gU3VidHlwZSkgJT4lIAogIG11dGF0ZShocHZfc3RhdHVzID0gZ3N1YigseCA9IGhwdl9zdGF0dXMscGF0dGVybiA9ICJITlNDX0hQViIscmVwbGFjZW1lbnQgPSAiSFBWIikpCmNsaW5pY2FsX2RhdGEgPSBpbm5lcl9qb2luKHggPSBjbGluaWNhbF9kYXRhLHkgPSBjYnBfZGF0YSxieSA9IGMoInN1Ym1pdHRlcl9pZCI9IlBhdGllbnQgSUQiKSkKY2xpbmljYWxfZGF0YSAgPSBjbGluaWNhbF9kYXRhWyAhaXMubmEoY2xpbmljYWxfZGF0YSRocHZfc3RhdHVzKSwgXQpgYGAKCmBgYHtyfQojIGxvYWQgZGF0YSAKbGlicmFyeSgicmVhZHhsIikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGdncHVicikKVENHQV9IUFZfZGF0YSA8LSByZWFkX2V4Y2VsKCIuL0lucHV0X2RhdGEvVENHQS9QTUMzODA2NTU0X25jb21tczM1MTMtczIueGxzeCIsc2tpcCA9IDMpClRDR0FfSFBWX2RhdGEgICU8PiUgZmlsdGVyKGBUdW1vciB0eXBlYCA9PSAiUHJpbWFyeSBzb2xpZCIpClRDR0FfSFBWX2RhdGEkc3VibWl0dGVyX2lkID0gVENHQV9IUFZfZGF0YSRgU2FtcGxlIGJhcmNvZGVgICU+JSBzdHJfc3ViKCBzdGFydCA9IDEsIGVuZCA9IDEyKSAKVENHQV9IUFZfZGF0YSA9IFRDR0FfSFBWX2RhdGEgJT4lCiAgICBmaWx0ZXIoQ2FuY2VyID09ICJITlNDIikgJT4lCiAgICBtdXRhdGUgKGhwdl9zdGF0dXMgPSAKICAgICAgICAgICAgaWZfZWxzZSgKICAgICAgICAgICAgICBjb25kaXRpb24gPSBwcG0gPT0gIk4vQSIsCiAgICAgICAgICAgICAgdHJ1ZSA9ICJIUFYtIiwKICAgICAgICAgICAgICBmYWxzZSA9ICAiSFBWKyIpKQoKY2xpbmljYWxfZGF0YSA9IGlubmVyX2pvaW4oeCA9IGNsaW5pY2FsX2RhdGEseSA9IFRDR0FfSFBWX2RhdGFbLGMoInN1Ym1pdHRlcl9pZCIsImhwdl9zdGF0dXMiKV0sYnkgPSBjKCJzdWJtaXR0ZXJfaWQiPSJzdWJtaXR0ZXJfaWQiKSkKCmBgYAoKCiMgTVlCCmBgYHtyfQpnZW5lX3N0YXR1cyA9IHNldF9jbGluaWNhbF9kYXRhKGNsaW5fZGF0YSA9IGNsaW5pY2FsX2RhdGEsZ2VuZXMgPSAiTVlCIix0cG1fZGF0YV9mcmFtZSA9IEhOU0NfdHBtLHN0cmF0aWZ5ID0gcGFyYW1zJHN0cmF0aWZ5KQpwYWdlZF90YWJsZShnZW5lX3N0YXR1cykKYGBgCgoKCgoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGNsaW5pY2FsX2RhdGFbY2xpbmljYWxfZGF0YSRzdWJtaXR0ZXJfaWQgJWluJSByb3duYW1lcyhnZW5lX3N0YXR1cyksXQpnZW5lX3N0YXR1cyRwYXRpZW50ID0gcm93bmFtZXMoZ2VuZV9zdGF0dXMpCmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBsZWZ0X2pvaW4oeCA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMseSA9IGdlbmVfc3RhdHVzLCBieSA9IGMoInN1Ym1pdHRlcl9pZCI9InBhdGllbnQiKSkKCnAgPSBUQ0dBYW5hbHl6ZV9zdXJ2aXZhbCgKICAgIGRhdGEgPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLAogICAgY2x1c3RlckNvbCA9ICJnZW5lX3N0YXR1cyIsCiAgICBtYWluID0gIlRDR0EgU2V0XG4gR0JNIiwKICAgIGhlaWdodCA9IDEwLAogICAgd2lkdGg9MTAsZmlsZW5hbWUgPSBOVUxMLHB2YWwubWV0aG9kCT1UCikKCnBbWzFdXS9wW1syXV0KYGBgCgojIEhQVisgc2lnbmF0dXJlCgoKCgoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KCnAgPSBUQ0dBYW5hbHl6ZV9zdXJ2aXZhbCgKICAgIGRhdGEgPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLAogICAgY2x1c3RlckNvbCA9ICJocHZfc3RhdHVzIiwKICAgIGZpbGVuYW1lID0gTlVMTCxwdmFsLm1ldGhvZCA9IFQKKQoKcFtbMV1dL3BbWzJdXQpgYGAKCgoKIyBNWUIgLSBIUFYgY29ycmVsYXRpb24KCmBgYHtyfQojIGxvYWQgZGF0YSAKbGlicmFyeSgicmVhZHhsIikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGdncHVicikKVENHQV9IUFZfZGF0YSA8LSByZWFkX2V4Y2VsKCIuL0lucHV0X2RhdGEvVENHQS9QTUMzODA2NTU0X25jb21tczM1MTMtczUueGxzeCIsc2tpcCA9IDIpClRDR0FfSFBWX2RhdGEkc3VibWl0dGVyX2lkID0gVENHQV9IUFZfZGF0YSRgU2FtcGxlIEJhcmNvZGVgICU+JSBzdHJfc3ViKCBzdGFydCA9IDEsIGVuZCA9IDEyKSAKcm93bmFtZXMoVENHQV9IUFZfZGF0YSkgPSBUQ0dBX0hQVl9kYXRhJHN1Ym1pdHRlcl9pZApUQ0dBX0hQVl9kYXRhID0gVENHQV9IUFZfZGF0YSAlPiUgZmlsdGVyKENhbmNlciA9PSAiQ0VTQyIpCmBgYAoKYGBge3J9CgpnZW5lX3N0YXR1cyA9IHNldF9jbGluaWNhbF9kYXRhKGNsaW5fZGF0YSA9IGNsaW5pY2FsX2RhdGEsZ2VuZXMgPSAiTVlCIix0cG1fZGF0YV9mcmFtZSA9IEhOU0NfdHBtLHN0cmF0aWZ5ID0gcGFyYW1zJHN0cmF0aWZ5KQpnZW5lX3N0YXR1cyA9IGdlbmVfc3RhdHVzW1RDR0FfSFBWX2RhdGEkc3VibWl0dGVyX2lkLF0gJT4lICBjYmluZChIUFZfUFBNID0gVENHQV9IUFZfZGF0YSRwcG0pICU+JSBuYS5vbWl0KCkKCnBhZ2VkX3RhYmxlKGdlbmVfc3RhdHVzKQoKCnNwIDwtIGdnc2NhdHRlcihnZW5lX3N0YXR1cywgeCA9ICJNWUIiLCB5ID0gIkhQVl9QUE0iLAogICBhZGQgPSAicmVnLmxpbmUiLCAgIyBBZGQgcmVncmVzc2luIGxpbmUKICAgYWRkLnBhcmFtcyA9IGxpc3QoY29sb3IgPSAiYmx1ZSIsIGZpbGwgPSAibGlnaHRncmF5IiksICMgQ3VzdG9taXplIHJlZy4gbGluZQogICBjb25mLmludCA9IFRSVUUgIyBBZGQgY29uZmlkZW5jZSBpbnRlcnZhbAogICApCiMgQWRkIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50CnNwICsgc3RhdF9jb3IobWV0aG9kID0gInBlYXJzb24iKQoKYGBgCgojIEhQViBzaWduYXR1cmUgLSBIUFYgY29ycmVsYXRpb24KCmBgYHtyfQojIHdpdGggSFBWIHNpZ25hdHVyZQpnZW5lX3N0YXR1cyA9IHNldF9jbGluaWNhbF9kYXRhKGNsaW5fZGF0YSA9IGNsaW5pY2FsX2RhdGEsZ2VuZXMgPSBzaWduYXR1cmUsdHBtX2RhdGFfZnJhbWUgPSBITlNDX3RwbSxzdHJhdGlmeSA9IHBhcmFtcyRzdHJhdGlmeSxzaWduYXR1cmVfbmFtZSA9ICJIUFYrIHNpZ25hdHVyZSIpCmdlbmVfc3RhdHVzID0gZ2VuZV9zdGF0dXNbVENHQV9IUFZfZGF0YSRzdWJtaXR0ZXJfaWQsXSAlPiUgY2JpbmQoSFBWX1BQTSA9IFRDR0FfSFBWX2RhdGEkcHBtKSAlPiUgbmEub21pdCgpCnBhZ2VkX3RhYmxlKGdlbmVfc3RhdHVzKQoKc3AgPC0gZ2dzY2F0dGVyKGdlbmVfc3RhdHVzLCB4ID0gIkhQVisgc2lnbmF0dXJlIiwgeSA9ICJIUFZfUFBNIiwKICAgYWRkID0gInJlZy5saW5lIiwgICMgQWRkIHJlZ3Jlc3NpbiBsaW5lCiAgIGFkZC5wYXJhbXMgPSBsaXN0KGNvbG9yID0gImJsdWUiLCBmaWxsID0gImxpZ2h0Z3JheSIpLCAjIEN1c3RvbWl6ZSByZWcuIGxpbmUKICAgY29uZi5pbnQgPSBUUlVFICMgQWRkIGNvbmZpZGVuY2UgaW50ZXJ2YWwKICAgKQojIEFkZCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudApzcCArIHN0YXRfY29yKG1ldGhvZCA9ICJwZWFyc29uIikKCgpgYGAKCiMgTVlCLSBIUFYgVCB0ZXN0CgpgYGB7cn0KIyBjcmVhdGUgZGF0YQoKZ2VuZV9zdGF0dXMgPSBzZXRfY2xpbmljYWxfZGF0YShjbGluX2RhdGEgPSBjbGluaWNhbF9kYXRhLGdlbmVzID0gIk1ZQiIsdHBtX2RhdGFfZnJhbWUgPSBITlNDX3RwbSxzdHJhdGlmeSA9IHBhcmFtcyRzdHJhdGlmeSkKZ2VuZV9zdGF0dXMkcGF0aWVudCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKQpnZW5lX3N0YXR1cyA9IGlubmVyX2pvaW4oeCA9IGdlbmVfc3RhdHVzLHkgPSBjbGluaWNhbF9kYXRhWyxjKCJzdWJtaXR0ZXJfaWQiLCJocHZfc3RhdHVzIildLGJ5ID0gYygicGF0aWVudCI9InN1Ym1pdHRlcl9pZCIpKQoKcGFnZWRfdGFibGUoZ2VuZV9zdGF0dXMpCgoKCmBgYAoKYGBge3J9CiMgcGxvdApsaWJyYXJ5KGdncHVicikKbGlicmFyeShyc3RhdGl4KQpzdGF0LnRlc3QgPC0gZ2VuZV9zdGF0dXMgJT4lCiAgdF90ZXN0KE1ZQiB+IGhwdl9zdGF0dXMpICU+JQogIGFkZF9zaWduaWZpY2FuY2UoKQpzdGF0LnRlc3QKCgpieHAgPC0gZ2dib3hwbG90KGdlbmVfc3RhdHVzLCB4ID0gImhwdl9zdGF0dXMiLCB5ID0gIk1ZQiIsIGZpbGwgPSAiIzAwQUZCQiIpKwogIGdlb21faml0dGVyKCkKc3RhdC50ZXN0IDwtIHN0YXQudGVzdCAlPiUgYWRkX3h5X3Bvc2l0aW9uKHggPSAiaHB2X3N0YXR1cyIpCmJ4cCArIAogIHN0YXRfcHZhbHVlX21hbnVhbChzdGF0LnRlc3QsICBsYWJlbCA9ICJULXRlc3QsIHAgPSB7cH0iKSAKCmBgYAoKIyBNWUIgYW5kIEhQViBzdXJ2aXZhbCBwbG90CiMjIEhQViArIHR1bW9ycwpgYGB7cn0KY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGNsaW5pY2FsX2RhdGEgICU+JSBmaWx0ZXIoaHB2X3N0YXR1cyA9PSAiSFBWKyIpCgpnZW5lX3N0YXR1cyA9IHNldF9jbGluaWNhbF9kYXRhKGNsaW5fZGF0YSA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMsZ2VuZXMgPSAiTVlCIix0cG1fZGF0YV9mcmFtZSA9IEhOU0NfdHBtLHN0cmF0aWZ5ID0gIk0iKQpwYWdlZF90YWJsZShnZW5lX3N0YXR1cykKYGBgCgoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KZ2VuZV9zdGF0dXMkcGF0aWVudCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gaW5uZXJfam9pbih4ID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3Jlcyx5ID0gZ2VuZV9zdGF0dXMsIGJ5ID0gYygic3VibWl0dGVyX2lkIj0icGF0aWVudCIpKQojIGRlYnVnb25jZShUQ0dBYW5hbHl6ZV9zdXJ2aXZhbCkKCnAgPSBUQ0dBYW5hbHl6ZV9zdXJ2aXZhbCgKICAgIGRhdGEgPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLAogICAgY2x1c3RlckNvbCA9ICJnZW5lX3N0YXR1cyIsCiAgICBmaWxlbmFtZSA9IE5VTEwscHZhbC5tZXRob2QgPSBUCikKcFtbMV1dL3BbWzJdXQpgYGAKCiMjIEhQViAtIHR1bW9ycwpgYGB7cn0KY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGNsaW5pY2FsX2RhdGEgICU+JSBmaWx0ZXIoaHB2X3N0YXR1cyA9PSAiSFBWLSIpCgpnZW5lX3N0YXR1cyA9IHNldF9jbGluaWNhbF9kYXRhKGNsaW5fZGF0YSA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMsZ2VuZXMgPSAiTVlCIix0cG1fZGF0YV9mcmFtZSA9IEhOU0NfdHBtLHN0cmF0aWZ5ID0gcGFyYW1zJHN0cmF0aWZ5KQpwYWdlZF90YWJsZShnZW5lX3N0YXR1cykKYGBgCgoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KZ2VuZV9zdGF0dXMkcGF0aWVudCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gaW5uZXJfam9pbih4ID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3Jlcyx5ID0gZ2VuZV9zdGF0dXMsIGJ5ID0gYygic3VibWl0dGVyX2lkIj0icGF0aWVudCIpKQoKcCA9IFRDR0FhbmFseXplX3N1cnZpdmFsKAogICAgZGF0YSA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMsCiAgICBjbHVzdGVyQ29sID0gImdlbmVfc3RhdHVzIiwKICAgIGZpbGVuYW1lID0gTlVMTCxwdmFsLm1ldGhvZCA9IFQKKQpwW1sxXV0vcFtbMl1dCmBgYAojIHNoYXJlZCBzaWduYXR1cmUKYGBge3J9CnNoYXJlZF9zaWduYXR1cmUgPSByZWFkUkRTKGZpbGUgPSAiLi9EYXRhX291dC90ZW1wL3NoYXJlZF9zaWduYXR1cmUuUkRTIikKYGBgCgpgYGB7cn0KZ2VuZV9zdGF0dXMgPSBzZXRfY2xpbmljYWxfZGF0YShjbGluX2RhdGEgPSBjbGluaWNhbF9kYXRhLGdlbmVzID0gc2hhcmVkX3NpZ25hdHVyZSx0cG1fZGF0YV9mcmFtZSA9IEhOU0NfdHBtLHN0cmF0aWZ5ID0gcGFyYW1zJHN0cmF0aWZ5LHNpZ25hdHVyZV9uYW1lID0gIkhQVisgc2lnbmF0dXJlIikKcGFnZWRfdGFibGUoZ2VuZV9zdGF0dXMpCmBgYAoKCgoKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9CmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBjbGluaWNhbF9kYXRhW2NsaW5pY2FsX2RhdGEkc3VibWl0dGVyX2lkICVpbiUgcm93bmFtZXMoZ2VuZV9zdGF0dXMpLF0KZ2VuZV9zdGF0dXMkcGF0aWVudCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gbGVmdF9qb2luKHggPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLHkgPSBnZW5lX3N0YXR1cywgYnkgPSBjKCJzdWJtaXR0ZXJfaWQiPSJwYXRpZW50IikpCgpwID0gVENHQWFuYWx5emVfc3Vydml2YWwoCiAgICBkYXRhID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcywKICAgIGNsdXN0ZXJDb2wgPSAiZ2VuZV9zdGF0dXMiLAogICAgbWFpbiA9ICJUQ0dBIFNldFxuIEdCTSIsCiAgICBoZWlnaHQgPSAxMCwKICAgIHdpZHRoPTEwLGZpbGVuYW1lID0gTlVMTCxwdmFsLm1ldGhvZCA9IFQKKQoKcFtbMV1dL3BbWzJdXQpgYGAKCiMgSE1TQyBzaWduYXR1cmUKCmBgYHtyfQojIGxvYWQKaG1zY19kZWcgPSByZWFkLnRhYmxlKGZpbGUgPSAiLi9EYXRhX291dC9IUFZfYW5hbHlzaXMvaHB2X2RlZ19kZi5jc3YiLHJvdy5uYW1lcyA9IDEpCiAgYXZnX2RpZmZfY3V0b2ZmID0gMQogIGZkcl9jdXRvZmYgPSAwLjEKICBzaWduYXR1cmUgPSBobXNjX2RlZyAlPiUgZmlsdGVyKGF2Z19kaWZmPmF2Z19kaWZmX2N1dG9mZiAmIGZkcjxmZHJfY3V0b2ZmKSAlPiUgcm93bmFtZXMoKQogIHNpZ25hdHVyZQoKYGBgCgpgYGB7cn0KZ2VuZV9zdGF0dXMgPSBzZXRfY2xpbmljYWxfZGF0YShjbGluX2RhdGEgPSBjbGluaWNhbF9kYXRhLGdlbmVzID0gc2lnbmF0dXJlLHRwbV9kYXRhX2ZyYW1lID0gSE5TQ190cG0sc3RyYXRpZnkgPSBwYXJhbXMkc3RyYXRpZnksc2lnbmF0dXJlX25hbWUgPSAiSFBWKyBzaWduYXR1cmUiKQpwYWdlZF90YWJsZShnZW5lX3N0YXR1cykKYGBgCgoKCgoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGNsaW5pY2FsX2RhdGFbY2xpbmljYWxfZGF0YSRzdWJtaXR0ZXJfaWQgJWluJSByb3duYW1lcyhnZW5lX3N0YXR1cyksXQpnZW5lX3N0YXR1cyRwYXRpZW50ID0gcm93bmFtZXMoZ2VuZV9zdGF0dXMpCmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBsZWZ0X2pvaW4oeCA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMseSA9IGdlbmVfc3RhdHVzLCBieSA9IGMoInN1Ym1pdHRlcl9pZCI9InBhdGllbnQiKSkKCnAgPSBUQ0dBYW5hbHl6ZV9zdXJ2aXZhbCgKICAgIGRhdGEgPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLAogICAgY2x1c3RlckNvbCA9ICJnZW5lX3N0YXR1cyIsCiAgICBtYWluID0gIlRDR0EgU2V0XG4gR0JNIiwKICAgIGhlaWdodCA9IDEwLAogICAgd2lkdGg9MTAsZmlsZW5hbWUgPSBOVUxMLHB2YWwubWV0aG9kID0gVAopCgpwW1sxXV0vcFtbMl1dCmBgYA==