library(TCGAbiolinks)
library(biomaRt)
prepare_datasets <- function(project_name, filter = list(sample_type = c("Primary Tumor"))) {
  library(data.table)

  # from https://github.com/BioinformaticsFMRP/TCGAbiolinks/issues/493#issuecomment-1083311661
  # Defines the query to the GDC
  query <- GDCquery(project = project_name,
                    data.category = "Transcriptome Profiling",
                    data.type = "Gene Expression Quantification",
                    experimental.strategy = "RNA-Seq",
                    workflow.type = "STAR - Counts")
  
  # Get metadata matrix
  metadata <- query[[1]][[1]]
  
  # Download data using api
  GDCdownload(query, method = "api")
  
  # Get main directory where data is stored
  main_dir <- file.path("GDCdata", project_name)
  # Get file list of downloaded files
  file_list <- file.path("GDCdata", project_name,list.files(main_dir,recursive = TRUE)) 
  
  # Read first downloaded to get gene names
  test_tab <- read.table(file = file_list[1], sep = '\t', header = TRUE)
  # Delete header lines that don't contain usefull information
  test_tab <- test_tab[-c(1:4),]
  # STAR counts and tpm datasets
  tpm_data_frame <- data.frame(test_tab[,2])
  count_data_frame <- data.frame(test_tab[,2])
  
  # Append cycle to get the complete matrix
  for (i in c(1:length(file_list))) {
    # Read table
    test_tab <- fread(file = file_list[i],sep = "\t",header = T,data.table = F)
    # Delete not useful lines
    test_tab <- test_tab[-c(1:4),]
    # Column bind of tpm and counts data
    tpm_data_frame <- cbind(tpm_data_frame, test_tab[,9])
    sample_id = strsplit(file_list[i],split = "/")[[1]][6]
    sample_name = metadata[metadata$id == sample_id ,"cases.submitter_id"]
    colnames(tpm_data_frame)[i+1] = sample_name # col 1 is gene
    # count_data_frame <- cbind(count_data_frame, test_tab[,4])
    # Print progres from 0 to 1
    print(i/length(file_list))
  }
  # update col names
  colnames(tpm_data_frame)[1] = "Gene"
  genes = tpm_data_frame$Gene
  tpm_data_frame$Gene <- NULL
  
  
  
  # remove all 0 genes
  not_all_zero <-apply(tpm_data_frame, 1, function(row) any(row != 0))
  tpm_data_frame = tpm_data_frame[not_all_zero,]
  genes = genes[not_all_zero]
  
  
  # remove all rows that are not gene symbols
  ensembl = useMart(biomart="ensembl", dataset="hsapiens_gene_ensembl")
  results <- getBM(attributes=c("ensembl_gene_id","hgnc_symbol","transcript_biotype"), mart=ensembl)
  not_symbol = !genes %in% results$hgnc_symbol
  genes = genes[!not_symbol]
  tpm_data_frame = tpm_data_frame[!not_symbol,]
  rownames(tpm_data_frame) = make.unique(genes) 
  
  for (i in 1:length(filter)) {
    col = names(filter)[i]
    values = filter[[i]]
    primary_samples = metadata[metadata[[col]] %in% values,"cases.submitter_id"]
    tpm_data_frame = tpm_data_frame[,primary_samples]
  }
  return(tpm_data_frame)
}

set_clinical_data <- function(clin_data, genes, tpm_data_frame) {
  if (length(genes) == 1) {
    type = genes
  } else {
    type = "score"
  }
  
  gene_data = tpm_data_frame[rownames(tpm_data_frame) %in% genes, ]
  genes_average = as.data.frame(rowMeans(as.data.frame(t(gene_data))))
  colnames(genes_average) = "mean_score"
  gene_status = genes_average %>% mutate (
    gene_status = case_when(
      mean_score > quantile(mean_score)[4] ~ paste("High", type),
      mean_score < quantile(mean_score)[2] ~  paste("Low", type),
      TRUE ~ "same"
    )
  )
  rownames(gene_status) = gsub(x = rownames(gene_status),
                               pattern = "\\.",
                               replacement = "-")
  gene_status = gene_status[gene_status$gene_status != "same",]
  return(gene_status)
}

1 CECS

project_name = "TCGA-CESC"
# debugonce(prepare_datasets)
cesc_tpm = prepare_datasets(project_name = "TCGA-CESC")
clinical_data <- GDCquery_clinic(project_name, "clinical")
CESC_tissues = c("Basaloid squamous cell carcinoma",
"Papillary squamous cell carcinoma",
"Squamous cell carcinoma, keratinizing, NOS",
"Squamous cell carcinoma, large cell, nonkeratinizing, NOS",
"Squamous cell carcinoma, NOS")
clinical_data = clinical_data[clinical_data$primary_diagnosis %in% CESC_tissues,]

1.1 MYB

gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = cesc_tpm)
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
)
p[[1]]/p[[2]]

1.2 HPV+ HMSC signature

genes = "ANLN
TUBB6
AXL
IFT122
GFM1
SEPT2
PBRM1
INSIG1
ANXA2
CAPG"
genes = strsplit(x =genes,split = "\n")[[1]]
gene_status = set_clinical_data(clin_data = clinical_data,genes = genes,tpm_data_frame = cesc_tpm)
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
)

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

2 OPSCC

project_name = "TCGA-HNSC"
HNSC_tpm = prepare_datasets(project_name = project_name,filter = list(sample_type = c("Primary Tumor")))
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,]

2.1 MYB

gene_status = set_clinical_data(clin_data = clinical_data,genes = "MYB",tpm_data_frame = HNSC_tpm)
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
)

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

2.2 HPV+ HMSC signature

genes = "ANLN
TUBB6
AXL
IFT122
GFM1
SEPT2
PBRM1
INSIG1
ANXA2
CAPG"
genes = strsplit(x =genes,split = "\n")[[1]]
gene_status = set_clinical_data(clin_data = clinical_data,genes = genes,tpm_data_frame = HNSC_tpm)
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
)
p[[1]]/p[[2]]

LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMudGltZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCi0tLQoKCgoKYGBge3J9CmxpYnJhcnkoVENHQWJpb2xpbmtzKQpsaWJyYXJ5KGJpb21hUnQpCmBgYAoKYGBge3J9CnByZXBhcmVfZGF0YXNldHMgPC0gZnVuY3Rpb24ocHJvamVjdF9uYW1lLCBmaWx0ZXIgPSBsaXN0KHNhbXBsZV90eXBlID0gYygiUHJpbWFyeSBUdW1vciIpKSkgewogIGxpYnJhcnkoZGF0YS50YWJsZSkKCiAgIyBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9CaW9pbmZvcm1hdGljc0ZNUlAvVENHQWJpb2xpbmtzL2lzc3Vlcy80OTMjaXNzdWVjb21tZW50LTEwODMzMTE2NjEKICAjIERlZmluZXMgdGhlIHF1ZXJ5IHRvIHRoZSBHREMKICBxdWVyeSA8LSBHRENxdWVyeShwcm9qZWN0ID0gcHJvamVjdF9uYW1lLAogICAgICAgICAgICAgICAgICAgIGRhdGEuY2F0ZWdvcnkgPSAiVHJhbnNjcmlwdG9tZSBQcm9maWxpbmciLAogICAgICAgICAgICAgICAgICAgIGRhdGEudHlwZSA9ICJHZW5lIEV4cHJlc3Npb24gUXVhbnRpZmljYXRpb24iLAogICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbC5zdHJhdGVneSA9ICJSTkEtU2VxIiwKICAgICAgICAgICAgICAgICAgICB3b3JrZmxvdy50eXBlID0gIlNUQVIgLSBDb3VudHMiKQogIAogICMgR2V0IG1ldGFkYXRhIG1hdHJpeAogIG1ldGFkYXRhIDwtIHF1ZXJ5W1sxXV1bWzFdXQogIAogICMgRG93bmxvYWQgZGF0YSB1c2luZyBhcGkKICBHRENkb3dubG9hZChxdWVyeSwgbWV0aG9kID0gImFwaSIpCiAgCiAgIyBHZXQgbWFpbiBkaXJlY3Rvcnkgd2hlcmUgZGF0YSBpcyBzdG9yZWQKICBtYWluX2RpciA8LSBmaWxlLnBhdGgoIkdEQ2RhdGEiLCBwcm9qZWN0X25hbWUpCiAgIyBHZXQgZmlsZSBsaXN0IG9mIGRvd25sb2FkZWQgZmlsZXMKICBmaWxlX2xpc3QgPC0gZmlsZS5wYXRoKCJHRENkYXRhIiwgcHJvamVjdF9uYW1lLGxpc3QuZmlsZXMobWFpbl9kaXIscmVjdXJzaXZlID0gVFJVRSkpIAogIAogICMgUmVhZCBmaXJzdCBkb3dubG9hZGVkIHRvIGdldCBnZW5lIG5hbWVzCiAgdGVzdF90YWIgPC0gcmVhZC50YWJsZShmaWxlID0gZmlsZV9saXN0WzFdLCBzZXAgPSAnXHQnLCBoZWFkZXIgPSBUUlVFKQogICMgRGVsZXRlIGhlYWRlciBsaW5lcyB0aGF0IGRvbid0IGNvbnRhaW4gdXNlZnVsbCBpbmZvcm1hdGlvbgogIHRlc3RfdGFiIDwtIHRlc3RfdGFiWy1jKDE6NCksXQogICMgU1RBUiBjb3VudHMgYW5kIHRwbSBkYXRhc2V0cwogIHRwbV9kYXRhX2ZyYW1lIDwtIGRhdGEuZnJhbWUodGVzdF90YWJbLDJdKQogIGNvdW50X2RhdGFfZnJhbWUgPC0gZGF0YS5mcmFtZSh0ZXN0X3RhYlssMl0pCiAgCiAgIyBBcHBlbmQgY3ljbGUgdG8gZ2V0IHRoZSBjb21wbGV0ZSBtYXRyaXgKICBmb3IgKGkgaW4gYygxOmxlbmd0aChmaWxlX2xpc3QpKSkgewogICAgIyBSZWFkIHRhYmxlCiAgICB0ZXN0X3RhYiA8LSBmcmVhZChmaWxlID0gZmlsZV9saXN0W2ldLHNlcCA9ICJcdCIsaGVhZGVyID0gVCxkYXRhLnRhYmxlID0gRikKICAgICMgRGVsZXRlIG5vdCB1c2VmdWwgbGluZXMKICAgIHRlc3RfdGFiIDwtIHRlc3RfdGFiWy1jKDE6NCksXQogICAgIyBDb2x1bW4gYmluZCBvZiB0cG0gYW5kIGNvdW50cyBkYXRhCiAgICB0cG1fZGF0YV9mcmFtZSA8LSBjYmluZCh0cG1fZGF0YV9mcmFtZSwgdGVzdF90YWJbLDldKQogICAgc2FtcGxlX2lkID0gc3Ryc3BsaXQoZmlsZV9saXN0W2ldLHNwbGl0ID0gIi8iKVtbMV1dWzZdCiAgICBzYW1wbGVfbmFtZSA9IG1ldGFkYXRhW21ldGFkYXRhJGlkID09IHNhbXBsZV9pZCAsImNhc2VzLnN1Ym1pdHRlcl9pZCJdCiAgICBjb2xuYW1lcyh0cG1fZGF0YV9mcmFtZSlbaSsxXSA9IHNhbXBsZV9uYW1lICMgY29sIDEgaXMgZ2VuZQogICAgIyBjb3VudF9kYXRhX2ZyYW1lIDwtIGNiaW5kKGNvdW50X2RhdGFfZnJhbWUsIHRlc3RfdGFiWyw0XSkKICAgICMgUHJpbnQgcHJvZ3JlcyBmcm9tIDAgdG8gMQogICAgcHJpbnQoaS9sZW5ndGgoZmlsZV9saXN0KSkKICB9CiAgIyB1cGRhdGUgY29sIG5hbWVzCiAgY29sbmFtZXModHBtX2RhdGFfZnJhbWUpWzFdID0gIkdlbmUiCiAgZ2VuZXMgPSB0cG1fZGF0YV9mcmFtZSRHZW5lCiAgdHBtX2RhdGFfZnJhbWUkR2VuZSA8LSBOVUxMCiAgCiAgCiAgCiAgIyByZW1vdmUgYWxsIDAgZ2VuZXMKICBub3RfYWxsX3plcm8gPC1hcHBseSh0cG1fZGF0YV9mcmFtZSwgMSwgZnVuY3Rpb24ocm93KSBhbnkocm93ICE9IDApKQogIHRwbV9kYXRhX2ZyYW1lID0gdHBtX2RhdGFfZnJhbWVbbm90X2FsbF96ZXJvLF0KICBnZW5lcyA9IGdlbmVzW25vdF9hbGxfemVyb10KICAKICAKICAjIHJlbW92ZSBhbGwgcm93cyB0aGF0IGFyZSBub3QgZ2VuZSBzeW1ib2xzCiAgZW5zZW1ibCA9IHVzZU1hcnQoYmlvbWFydD0iZW5zZW1ibCIsIGRhdGFzZXQ9ImhzYXBpZW5zX2dlbmVfZW5zZW1ibCIpCiAgcmVzdWx0cyA8LSBnZXRCTShhdHRyaWJ1dGVzPWMoImVuc2VtYmxfZ2VuZV9pZCIsImhnbmNfc3ltYm9sIiwidHJhbnNjcmlwdF9iaW90eXBlIiksIG1hcnQ9ZW5zZW1ibCkKICBub3Rfc3ltYm9sID0gIWdlbmVzICVpbiUgcmVzdWx0cyRoZ25jX3N5bWJvbAogIGdlbmVzID0gZ2VuZXNbIW5vdF9zeW1ib2xdCiAgdHBtX2RhdGFfZnJhbWUgPSB0cG1fZGF0YV9mcmFtZVshbm90X3N5bWJvbCxdCiAgcm93bmFtZXModHBtX2RhdGFfZnJhbWUpID0gbWFrZS51bmlxdWUoZ2VuZXMpIAogIAogIGZvciAoaSBpbiAxOmxlbmd0aChmaWx0ZXIpKSB7CiAgICBjb2wgPSBuYW1lcyhmaWx0ZXIpW2ldCiAgICB2YWx1ZXMgPSBmaWx0ZXJbW2ldXQogICAgcHJpbWFyeV9zYW1wbGVzID0gbWV0YWRhdGFbbWV0YWRhdGFbW2NvbF1dICVpbiUgdmFsdWVzLCJjYXNlcy5zdWJtaXR0ZXJfaWQiXQogICAgdHBtX2RhdGFfZnJhbWUgPSB0cG1fZGF0YV9mcmFtZVsscHJpbWFyeV9zYW1wbGVzXQogIH0KICByZXR1cm4odHBtX2RhdGFfZnJhbWUpCn0KCnNldF9jbGluaWNhbF9kYXRhIDwtIGZ1bmN0aW9uKGNsaW5fZGF0YSwgZ2VuZXMsIHRwbV9kYXRhX2ZyYW1lKSB7CiAgaWYgKGxlbmd0aChnZW5lcykgPT0gMSkgewogICAgdHlwZSA9IGdlbmVzCiAgfSBlbHNlIHsKICAgIHR5cGUgPSAic2NvcmUiCiAgfQogIAogIGdlbmVfZGF0YSA9IHRwbV9kYXRhX2ZyYW1lW3Jvd25hbWVzKHRwbV9kYXRhX2ZyYW1lKSAlaW4lIGdlbmVzLCBdCiAgZ2VuZXNfYXZlcmFnZSA9IGFzLmRhdGEuZnJhbWUocm93TWVhbnMoYXMuZGF0YS5mcmFtZSh0KGdlbmVfZGF0YSkpKSkKICBjb2xuYW1lcyhnZW5lc19hdmVyYWdlKSA9ICJtZWFuX3Njb3JlIgogIGdlbmVfc3RhdHVzID0gZ2VuZXNfYXZlcmFnZSAlPiUgbXV0YXRlICgKICAgIGdlbmVfc3RhdHVzID0gY2FzZV93aGVuKAogICAgICBtZWFuX3Njb3JlID4gcXVhbnRpbGUobWVhbl9zY29yZSlbNF0gfiBwYXN0ZSgiSGlnaCIsIHR5cGUpLAogICAgICBtZWFuX3Njb3JlIDwgcXVhbnRpbGUobWVhbl9zY29yZSlbMl0gfiAgcGFzdGUoIkxvdyIsIHR5cGUpLAogICAgICBUUlVFIH4gInNhbWUiCiAgICApCiAgKQogIHJvd25hbWVzKGdlbmVfc3RhdHVzKSA9IGdzdWIoeCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXFwuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gIi0iKQogIGdlbmVfc3RhdHVzID0gZ2VuZV9zdGF0dXNbZ2VuZV9zdGF0dXMkZ2VuZV9zdGF0dXMgIT0gInNhbWUiLF0KICByZXR1cm4oZ2VuZV9zdGF0dXMpCn0KCmBgYAoKIyBDRUNTCmBgYHtyfQpwcm9qZWN0X25hbWUgPSAiVENHQS1DRVNDIgpgYGAKCmBgYHtyfQojIGRlYnVnb25jZShwcmVwYXJlX2RhdGFzZXRzKQpjZXNjX3RwbSA9IHByZXBhcmVfZGF0YXNldHMocHJvamVjdF9uYW1lID0gIlRDR0EtQ0VTQyIpCmBgYAoKCmBgYHtyfQpjbGluaWNhbF9kYXRhIDwtIEdEQ3F1ZXJ5X2NsaW5pYyhwcm9qZWN0X25hbWUsICJjbGluaWNhbCIpCkNFU0NfdGlzc3VlcyA9IGMoIkJhc2Fsb2lkIHNxdWFtb3VzIGNlbGwgY2FyY2lub21hIiwKIlBhcGlsbGFyeSBzcXVhbW91cyBjZWxsIGNhcmNpbm9tYSIsCiJTcXVhbW91cyBjZWxsIGNhcmNpbm9tYSwga2VyYXRpbml6aW5nLCBOT1MiLAoiU3F1YW1vdXMgY2VsbCBjYXJjaW5vbWEsIGxhcmdlIGNlbGwsIG5vbmtlcmF0aW5pemluZywgTk9TIiwKIlNxdWFtb3VzIGNlbGwgY2FyY2lub21hLCBOT1MiKQpjbGluaWNhbF9kYXRhID0gY2xpbmljYWxfZGF0YVtjbGluaWNhbF9kYXRhJHByaW1hcnlfZGlhZ25vc2lzICVpbiUgQ0VTQ190aXNzdWVzLF0KYGBgCgojIyBNWUIKYGBge3J9CmdlbmVfc3RhdHVzID0gc2V0X2NsaW5pY2FsX2RhdGEoY2xpbl9kYXRhID0gY2xpbmljYWxfZGF0YSxnZW5lcyA9ICJNWUIiLHRwbV9kYXRhX2ZyYW1lID0gY2VzY190cG0pCmdlbmVfc3RhdHVzCmBgYAoKCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gY2xpbmljYWxfZGF0YVtjbGluaWNhbF9kYXRhJHN1Ym1pdHRlcl9pZCAlaW4lIHJvd25hbWVzKGdlbmVfc3RhdHVzKSxdCmdlbmVfc3RhdHVzJHBhdGllbnQgPSByb3duYW1lcyhnZW5lX3N0YXR1cykKY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGxlZnRfam9pbih4ID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3Jlcyx5ID0gZ2VuZV9zdGF0dXMsIGJ5ID0gYygic3VibWl0dGVyX2lkIj0icGF0aWVudCIpKQoKcCA9IFRDR0FhbmFseXplX3N1cnZpdmFsKAogICAgZGF0YSA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMsCiAgICBjbHVzdGVyQ29sID0gImdlbmVfc3RhdHVzIiwKICAgIG1haW4gPSAiVENHQSBTZXRcbiBHQk0iLAogICAgaGVpZ2h0ID0gMTAsCiAgICB3aWR0aD0xMCxmaWxlbmFtZSA9IE5VTEwKKQpwW1sxXV0vcFtbMl1dCmBgYAoKCiMjIEhQVisgSE1TQyBzaWduYXR1cmUKYGBge3J9CmdlbmVzID0gIkFOTE4KVFVCQjYKQVhMCklGVDEyMgpHRk0xClNFUFQyClBCUk0xCklOU0lHMQpBTlhBMgpDQVBHIgpnZW5lcyA9IHN0cnNwbGl0KHggPWdlbmVzLHNwbGl0ID0gIlxuIilbWzFdXQoKYGBgCgpgYGB7cn0KZ2VuZV9zdGF0dXMgPSBzZXRfY2xpbmljYWxfZGF0YShjbGluX2RhdGEgPSBjbGluaWNhbF9kYXRhLGdlbmVzID0gZ2VuZXMsdHBtX2RhdGFfZnJhbWUgPSBjZXNjX3RwbSkKZ2VuZV9zdGF0dXMKYGBgCgoKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTh9CmNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMgPSBjbGluaWNhbF9kYXRhW2NsaW5pY2FsX2RhdGEkc3VibWl0dGVyX2lkICVpbiUgcm93bmFtZXMoZ2VuZV9zdGF0dXMpLF0KZ2VuZV9zdGF0dXMkcGF0aWVudCA9IHJvd25hbWVzKGdlbmVfc3RhdHVzKQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gbGVmdF9qb2luKHggPSBjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzLHkgPSBnZW5lX3N0YXR1cywgYnkgPSBjKCJzdWJtaXR0ZXJfaWQiPSJwYXRpZW50IikpCgpwID0gVENHQWFuYWx5emVfc3Vydml2YWwoCiAgICBkYXRhID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcywKICAgIGNsdXN0ZXJDb2wgPSAiZ2VuZV9zdGF0dXMiLAogICAgbWFpbiA9ICJUQ0dBIFNldFxuIEdCTSIsCiAgICBoZWlnaHQgPSAxMCwKICAgIHdpZHRoPTEwLGZpbGVuYW1lID0gTlVMTAopCgpwW1sxXV0vcFtbMl1dCmBgYAoKCiMgT1BTQ0MKCmBgYHtyfQpwcm9qZWN0X25hbWUgPSAiVENHQS1ITlNDIgpgYGAKCmBgYHtyfQpITlNDX3RwbSA9IHByZXBhcmVfZGF0YXNldHMocHJvamVjdF9uYW1lID0gcHJvamVjdF9uYW1lLGZpbHRlciA9IGxpc3Qoc2FtcGxlX3R5cGUgPSBjKCJQcmltYXJ5IFR1bW9yIikpKQpgYGAKCmBgYHtyfQpjbGluaWNhbF9kYXRhIDwtIEdEQ3F1ZXJ5X2NsaW5pYyhwcm9qZWN0X25hbWUsICJjbGluaWNhbCIpCk9QU0NDX3Rpc3N1ZXMgPSBjKCJCYXNlIG9mIHRvbmd1ZSwgTk9TIiwKIk9yb3BoYXJ5bngsIE5PUyIsCiJQb3N0ZXJpb3Igd2FsbCBvZiBvcm9waGFyeW54IiwKIlRvbnNpbCwgTk9TIikKY2xpbmljYWxfZGF0YSA9IGNsaW5pY2FsX2RhdGFbY2xpbmljYWxfZGF0YSR0aXNzdWVfb3Jfb3JnYW5fb2Zfb3JpZ2luICVpbiUgT1BTQ0NfdGlzc3VlcyxdCmBgYAoKIyMgTVlCCmBgYHtyfQpnZW5lX3N0YXR1cyA9IHNldF9jbGluaWNhbF9kYXRhKGNsaW5fZGF0YSA9IGNsaW5pY2FsX2RhdGEsZ2VuZXMgPSAiTVlCIix0cG1fZGF0YV9mcmFtZSA9IEhOU0NfdHBtKQpnZW5lX3N0YXR1cwpgYGAKCgoKCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gY2xpbmljYWxfZGF0YVtjbGluaWNhbF9kYXRhJHN1Ym1pdHRlcl9pZCAlaW4lIHJvd25hbWVzKGdlbmVfc3RhdHVzKSxdCmdlbmVfc3RhdHVzJHBhdGllbnQgPSByb3duYW1lcyhnZW5lX3N0YXR1cykKY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGxlZnRfam9pbih4ID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3Jlcyx5ID0gZ2VuZV9zdGF0dXMsIGJ5ID0gYygic3VibWl0dGVyX2lkIj0icGF0aWVudCIpKQoKcCA9IFRDR0FhbmFseXplX3N1cnZpdmFsKAogICAgZGF0YSA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMsCiAgICBjbHVzdGVyQ29sID0gImdlbmVfc3RhdHVzIiwKICAgIG1haW4gPSAiVENHQSBTZXRcbiBHQk0iLAogICAgaGVpZ2h0ID0gMTAsCiAgICB3aWR0aD0xMCxmaWxlbmFtZSA9IE5VTEwKKQoKcFtbMV1dL3BbWzJdXQpgYGAKCgojIyBIUFYrIEhNU0Mgc2lnbmF0dXJlCmBgYHtyfQpnZW5lcyA9ICJBTkxOClRVQkI2CkFYTApJRlQxMjIKR0ZNMQpTRVBUMgpQQlJNMQpJTlNJRzEKQU5YQTIKQ0FQRyIKZ2VuZXMgPSBzdHJzcGxpdCh4ID1nZW5lcyxzcGxpdCA9ICJcbiIpW1sxXV0KCmBgYAoKYGBge3J9CmdlbmVfc3RhdHVzID0gc2V0X2NsaW5pY2FsX2RhdGEoY2xpbl9kYXRhID0gY2xpbmljYWxfZGF0YSxnZW5lcyA9IGdlbmVzLHRwbV9kYXRhX2ZyYW1lID0gSE5TQ190cG0pCmdlbmVfc3RhdHVzCmBgYAoKCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQpjbGluaWNhbF9kYXRhX3dpdGhfc2NvcmVzID0gY2xpbmljYWxfZGF0YVtjbGluaWNhbF9kYXRhJHN1Ym1pdHRlcl9pZCAlaW4lIHJvd25hbWVzKGdlbmVfc3RhdHVzKSxdCmdlbmVfc3RhdHVzJHBhdGllbnQgPSByb3duYW1lcyhnZW5lX3N0YXR1cykKY2xpbmljYWxfZGF0YV93aXRoX3Njb3JlcyA9IGxlZnRfam9pbih4ID0gY2xpbmljYWxfZGF0YV93aXRoX3Njb3Jlcyx5ID0gZ2VuZV9zdGF0dXMsIGJ5ID0gYygic3VibWl0dGVyX2lkIj0icGF0aWVudCIpKQoKcCA9IFRDR0FhbmFseXplX3N1cnZpdmFsKAogICAgZGF0YSA9IGNsaW5pY2FsX2RhdGFfd2l0aF9zY29yZXMsCiAgICBjbHVzdGVyQ29sID0gImdlbmVfc3RhdHVzIiwKICAgIG1haW4gPSAiVENHQSBTZXRcbiBHQk0iLAogICAgaGVpZ2h0ID0gMTAsCiAgICB3aWR0aD0xMCxmaWxlbmFtZSA9IE5VTEwKKQpwW1sxXV0vcFtbMl1dCgpgYGAKCg==