Parameters:

suffix = "top_25"
threshold = 25
data_to_read = "acc1_cancer_cells_15KnCount_V3.RDS"

functions

source("./.Rprofile")
Welcome to HMSC project.
source_from_github(repositoy = "DEG_functions",version = "0.2.1")
ℹ SHA-1 hash of file is 4aae7e1f13306aa81aa2d8e76dec76035a4dac8f
top_correlated <- function(genes, threshold) {
  markers_expression = FetchData(object = acc1_cancer_cells,vars = genes,slot = "data")
  markers_average = rowMeans(markers_expression) %>% as.data.frame() %>% rename("average" = 1)
  cor_mat = cor(expression %>% t(), markers_average)%>% as.data.frame() 
  cor_mat = cor_mat[complete.cases(cor_mat),,drop=F]  %>% as.data.frame %>%  rename("corr" = 1) #remove rows with NA in at least one col
  if (threshold<1){
    top_genes =   cor_mat %>% as.data.frame %>% select(1) %>% dplyr::filter(.> threshold) %>% rownames()
  }else{
    top_genes =   cor_mat %>%  top_n(threshold,corr) %>% rownames()
  }
  return(top_genes)
}

top_genes_cor_heatmap <- function(top_genes) {
  top_expression = expression %>% dplyr::filter(rownames(expression) %in% top_genes)
colors <- c(seq(-1,1,by=0.01))
my_palette <- c("blue",colorRampPalette(colors = c("blue", "white", "red"))
                                                   (n = length(colors)-3), "red")
pht = pheatmap(mat = cor(top_expression %>% t(), top_expression %>% t()),color = my_palette, breaks = colors)
return(pht)
}

 
enriched_score_umap <- function(enrich_res, genes,col) {
  rownames(enrich_res) = enrich_res$pathway_name
  enriched_genes = enrich_res[col,"geneID"] %>% strsplit(split = "/") %>% .[[1]] %>% c(.,genes) #add original markers
  enriched_genes_score=apply(acc1_cancer_cells@assays$RNA@data[enriched_genes,],2,mean)
  acc1_cancer_cells=AddMetaData(acc1_cancer_cells,enriched_genes_score,"enriched_genes_score")
  print(
    FeaturePlot(object = acc1_cancer_cells,features = "enriched_genes_score")
  )
    return(enriched_genes_score)
}

Data

acc1_cancer_cells = readRDS("./Data/" %>% paste0(data_to_read))
expression = GetAssayData(object = acc1_cancer_cells,assay = "RNA",slot = "data") %>% as.data.frame()

luminal_pathways = c("CHARAFE_BREAST_CANCER_LUMINAL_VS_BASAL_DN","CHARAFE_BREAST_CANCER_LUMINAL_VS_BASAL_UP","CHARAFE_BREAST_CANCER_LUMINAL_VS_MESENCHYMAL_DN","CHARAFE_BREAST_CANCER_LUMINAL_VS_MESENCHYMAL_UP","HUPER_BREAST_BASAL_VS_LUMINAL_DN","LIM_MAMMARY_LUMINAL_PROGENITOR_UP","SMID_BREAST_CANCER_LUMINAL_B_UP" )

# add luminal pathways
msigdb_gene_set = msigdbr(species = "Homo sapiens") 
msigdb_gene_set = msigdb_gene_set %>%as.data.frame() 
luminal_gs = msigdb_gene_set %>%  dplyr::filter(gs_name %in% luminal_pathways)
luminal_gs = luminal_gs %>% dplyr::distinct(gs_name, gene_symbol) %>% as.data.frame()

1.Myo markers

1.a) expression

myo_protein_markers = c("CNN1", "IL12B", "TP63","ACTA2")
FeaturePlot(object = acc1_cancer_cells,features = myo_protein_markers,min.cutoff = 0)
Warning in FeaturePlot(object = acc1_cancer_cells, features = myo_protein_markers,  :
  All cells have the same value (0) of IL12B.

IL12B is 0 in all cells

myo_protein_markers = c("CNN1", "TP63","ACTA2")

1.b) top 30 correlated genes with TP63+ACTA2+CNN1

top_myo  = top_correlated(genes = myo_protein_markers,threshold = 25)
Warning in cor(expression %>% t(), markers_average) :
  the standard deviation is zero

Top correlated genes

print("#genes = " %>% paste(length(top_myo)))
[1] "#genes =  25"
top_myo %>% head(30)
 [1] "COL16A1"     "RP1-39G22.4" "CHI3L1"      "ACTG2"       "CD200"       "MYLK"        "TP63"        "IGFBP7"      "KCNMB1"     
[10] "ADAMTS2"     "CALD1"       "LOXL2"       "TPM2"        "CORO2A"      "CLIC3"       "SNCG"        "ACTA2"       "TAGLN"      
[19] "A2M"         "NGFR"        "MIR7974"     "CNN1"        "PPP1R14A"    "MYL9"        "POM121L9P"  

Correlation

top_genes_cor_heatmap(top_genes = top_myo)

Enrichment analysis

enrich_res = genes_vec_enrichment(genes = top_myo,background = rownames(acc1_cancer_cells),homer = T,title = "myo top enrichment")

enrich_res

UMAP score of enriched genes

lst = enriched_score_umap(enrich_res = enrich_res,genes = myo_protein_markers,col = 1)

myo_score = lst[["score"]]
enriched_genes = lst[["genes"]]

genes in score:

lst[["genes"]]
 [1] "COL16A1" "MYLK"    "CALD1"   "LOXL2"   "TPM2"    "ACTA2"   "TAGLN"   "MYL9"    "CNN1"    "TP63"    "ACTA2"  

CALD1 Lysyl oxidase gene (LOXL2) expression in the stromal reaction to in situ and invasive ductal breast carcinoma TPM2 = tropomyosin ## {.unnumbered}

2. Luminal markers

2.a) expression

lum_protein_markers = c("KIT")
FeaturePlot(object = acc1_cancer_cells,features = lum_protein_markers,min.cutoff = 0)

2 top correlated genes with KIT

top_kit = top_correlated(genes = lum_protein_markers,threshold = 25)
Warning in cor(expression %>% t(), markers_average) :
  the standard deviation is zero

Top correlated genes

print("#genes = " %>% paste(length(top_kit)))
[1] "#genes =  25"
top_kit
 [1] "FBXO44"        "USP48"         "MPC2"          "SLC19A2"       "ATL2"          "B3GNT2"        "AC093162.5"    "MAP2"         
 [9] "GK5"           "KIT"           "GLRB"          "EFNA5"         "PCDHGB7"       "SLC29A1"       "SASH1"         "ALDH3B2"      
[17] "CCND1"         "RP11-254B13.1" "VSIG10"        "NDFIP2"        "SUSD6"         "SPPL2A"        "DYNC1LI2"      "DSC2"         
[25] "INSR"         

Correlation

top_genes_cor_heatmap(top_genes = top_kit)

Enrichment analysis

enrich_res = genes_vec_enrichment(genes = top_kit,background = rownames(expression),homer = T,title = "lum top enrichment",custom_pathways = luminal_gs)

enrich_res

UMAP score of enriched genes

lst = enriched_score_umap(enrich_res = enrich_res,genes = lum_protein_markers,col = 1)

lum_score = lst[["score"]]
enriched_genes = lst[["genes"]]

genes in score:

lst[["genes"]]
[1] "SLC19A2" "GLRB"    "CCND1"   "KIT"    

CCND1 Copy Number Variation in Circulating Tumor DNA from Luminal B Breast Cancer Patients

Correlation between luminal and myo scores

cor(luminal_score,myo_score)
[1] -0.1540176
# res = FindAllMarkers(object = acc1_cancer_cells)
# markers_cluster3 = res[res$cluster == 3 & res$p_val<0.00001,"gene"]
# genes_vec_enrichment(genes = markers_cluster3,background = rownames(acc1_cancer_cells),homer = T,title = "myo top enrichment",custom_pathways = luminal_gs)
LS0tCnRpdGxlOiAiTXlvX2x1bV9zY29yZSIKYXV0aG9yOiAiQXZpc2hhaSBXaXplbCIKZGF0ZTogNy4xMi4yMgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgY29kZV9mb2xkaW5nOiBoaWRlCi0tLQoKIyMgUGFyYW1ldGVyczoKCmBgYHtyfQpzdWZmaXggPSAidG9wXzI1Igp0aHJlc2hvbGQgPSAyNQpkYXRhX3RvX3JlYWQgPSAiYWNjMV9jYW5jZXJfY2VsbHNfMTVLbkNvdW50X1YzLlJEUyIKYGBgCgotICAgc3VmZml4ID0gYHIgc3VmZml4YAotICAgZGF0YV90b19yZWFkID0gYHIgZGF0YV90b19yZWFkYAotICAgdGhyZXNob2xkID0gYHIgdGhyZXNob2xkYAoKIyMgZnVuY3Rpb25zCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpzb3VyY2UoIi4vLlJwcm9maWxlIikKc291cmNlX2Zyb21fZ2l0aHViKHJlcG9zaXRveSA9ICJERUdfZnVuY3Rpb25zIix2ZXJzaW9uID0gIjAuMi4xIikKCnRvcF9jb3JyZWxhdGVkIDwtIGZ1bmN0aW9uKGdlbmVzLCB0aHJlc2hvbGQpIHsKICBtYXJrZXJzX2V4cHJlc3Npb24gPSBGZXRjaERhdGEob2JqZWN0ID0gYWNjMV9jYW5jZXJfY2VsbHMsdmFycyA9IGdlbmVzLHNsb3QgPSAiZGF0YSIpCiAgbWFya2Vyc19hdmVyYWdlID0gcm93TWVhbnMobWFya2Vyc19leHByZXNzaW9uKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByZW5hbWUoImF2ZXJhZ2UiID0gMSkKICBjb3JfbWF0ID0gY29yKGV4cHJlc3Npb24gJT4lIHQoKSwgbWFya2Vyc19hdmVyYWdlKSU+JSBhcy5kYXRhLmZyYW1lKCkgCiAgY29yX21hdCA9IGNvcl9tYXRbY29tcGxldGUuY2FzZXMoY29yX21hdCksLGRyb3A9Rl0gICU+JSBhcy5kYXRhLmZyYW1lICU+JSAgcmVuYW1lKCJjb3JyIiA9IDEpICNyZW1vdmUgcm93cyB3aXRoIE5BIGluIGF0IGxlYXN0IG9uZSBjb2wKICBpZiAodGhyZXNob2xkPDEpewogICAgdG9wX2dlbmVzID0gICBjb3JfbWF0ICU+JSBhcy5kYXRhLmZyYW1lICU+JSBzZWxlY3QoMSkgJT4lIGRwbHlyOjpmaWx0ZXIoLj4gdGhyZXNob2xkKSAlPiUgcm93bmFtZXMoKQogIH1lbHNlewogICAgdG9wX2dlbmVzID0gICBjb3JfbWF0ICU+JSAgdG9wX24odGhyZXNob2xkLGNvcnIpICU+JSByb3duYW1lcygpCiAgfQogIHJldHVybih0b3BfZ2VuZXMpCn0KCnRvcF9nZW5lc19jb3JfaGVhdG1hcCA8LSBmdW5jdGlvbih0b3BfZ2VuZXMpIHsKICB0b3BfZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24gJT4lIGRwbHlyOjpmaWx0ZXIocm93bmFtZXMoZXhwcmVzc2lvbikgJWluJSB0b3BfZ2VuZXMpCmNvbG9ycyA8LSBjKHNlcSgtMSwxLGJ5PTAuMDEpKQpteV9wYWxldHRlIDwtIGMoImJsdWUiLGNvbG9yUmFtcFBhbGV0dGUoY29sb3JzID0gYygiYmx1ZSIsICJ3aGl0ZSIsICJyZWQiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG4gPSBsZW5ndGgoY29sb3JzKS0zKSwgInJlZCIpCnBodCA9IHBoZWF0bWFwKG1hdCA9IGNvcih0b3BfZXhwcmVzc2lvbiAlPiUgdCgpLCB0b3BfZXhwcmVzc2lvbiAlPiUgdCgpKSxjb2xvciA9IG15X3BhbGV0dGUsIGJyZWFrcyA9IGNvbG9ycykKcmV0dXJuKHBodCkKfQoKIAplbnJpY2hlZF9zY29yZV91bWFwIDwtIGZ1bmN0aW9uKGVucmljaF9yZXMsIGdlbmVzLGNvbCkgewogIHJvd25hbWVzKGVucmljaF9yZXMpID0gZW5yaWNoX3JlcyRwYXRod2F5X25hbWUKICBlbnJpY2hlZF9nZW5lcyA9IGVucmljaF9yZXNbY29sLCJnZW5lSUQiXSAlPiUgc3Ryc3BsaXQoc3BsaXQgPSAiLyIpICU+JSAuW1sxXV0gJT4lIGMoLixnZW5lcykgI2FkZCBvcmlnaW5hbCBtYXJrZXJzCiAgZW5yaWNoZWRfZ2VuZXNfc2NvcmU9YXBwbHkoYWNjMV9jYW5jZXJfY2VsbHNAYXNzYXlzJFJOQUBkYXRhW2VucmljaGVkX2dlbmVzLF0sMixtZWFuKQogIGFjYzFfY2FuY2VyX2NlbGxzPUFkZE1ldGFEYXRhKGFjYzFfY2FuY2VyX2NlbGxzLGVucmljaGVkX2dlbmVzX3Njb3JlLCJlbnJpY2hlZF9nZW5lc19zY29yZSIpCiAgcHJpbnQoCiAgICBGZWF0dXJlUGxvdChvYmplY3QgPSBhY2MxX2NhbmNlcl9jZWxscyxmZWF0dXJlcyA9ICJlbnJpY2hlZF9nZW5lc19zY29yZSIpCiAgKQogICAgcmV0dXJuKGxpc3QoIHNjb3JlID0gZW5yaWNoZWRfZ2VuZXNfc2NvcmUsZ2VuZXMgPSBlbnJpY2hlZF9nZW5lcykpCn0KCmBgYAoKIyMgRGF0YQoKYGBge3J9CmFjYzFfY2FuY2VyX2NlbGxzID0gcmVhZFJEUygiLi9EYXRhLyIgJT4lIHBhc3RlMChkYXRhX3RvX3JlYWQpKQpleHByZXNzaW9uID0gR2V0QXNzYXlEYXRhKG9iamVjdCA9IGFjYzFfY2FuY2VyX2NlbGxzLGFzc2F5ID0gIlJOQSIsc2xvdCA9ICJkYXRhIikgJT4lIGFzLmRhdGEuZnJhbWUoKQoKbHVtaW5hbF9wYXRod2F5cyA9IGMoIkNIQVJBRkVfQlJFQVNUX0NBTkNFUl9MVU1JTkFMX1ZTX0JBU0FMX0ROIiwiQ0hBUkFGRV9CUkVBU1RfQ0FOQ0VSX0xVTUlOQUxfVlNfQkFTQUxfVVAiLCJDSEFSQUZFX0JSRUFTVF9DQU5DRVJfTFVNSU5BTF9WU19NRVNFTkNIWU1BTF9ETiIsIkNIQVJBRkVfQlJFQVNUX0NBTkNFUl9MVU1JTkFMX1ZTX01FU0VOQ0hZTUFMX1VQIiwiSFVQRVJfQlJFQVNUX0JBU0FMX1ZTX0xVTUlOQUxfRE4iLCJMSU1fTUFNTUFSWV9MVU1JTkFMX1BST0dFTklUT1JfVVAiLCJTTUlEX0JSRUFTVF9DQU5DRVJfTFVNSU5BTF9CX1VQIiApCgojIGFkZCBsdW1pbmFsIHBhdGh3YXlzCm1zaWdkYl9nZW5lX3NldCA9IG1zaWdkYnIoc3BlY2llcyA9ICJIb21vIHNhcGllbnMiKSAKbXNpZ2RiX2dlbmVfc2V0ID0gbXNpZ2RiX2dlbmVfc2V0ICU+JWFzLmRhdGEuZnJhbWUoKSAKbHVtaW5hbF9ncyA9IG1zaWdkYl9nZW5lX3NldCAlPiUgIGRwbHlyOjpmaWx0ZXIoZ3NfbmFtZSAlaW4lIGx1bWluYWxfcGF0aHdheXMpCmx1bWluYWxfZ3MgPSBsdW1pbmFsX2dzICU+JSBkcGx5cjo6ZGlzdGluY3QoZ3NfbmFtZSwgZ2VuZV9zeW1ib2wpICU+JSBhcy5kYXRhLmZyYW1lKCkKYGBgCgoKIyAqKjEuTXlvIG1hcmtlcnMqKgoKIyMgMS5hKSBleHByZXNzaW9uCgpgYGB7cn0KbXlvX3Byb3RlaW5fbWFya2VycyA9IGMoIkNOTjEiLCAiSUwxMkIiLCAiVFA2MyIsIkFDVEEyIikKRmVhdHVyZVBsb3Qob2JqZWN0ID0gYWNjMV9jYW5jZXJfY2VsbHMsZmVhdHVyZXMgPSBteW9fcHJvdGVpbl9tYXJrZXJzLG1pbi5jdXRvZmYgPSAwKQpgYGAKCklMMTJCIGlzIDAgaW4gYWxsIGNlbGxzCmBgYHtyfQpteW9fcHJvdGVpbl9tYXJrZXJzID0gYygiQ05OMSIsICJUUDYzIiwiQUNUQTIiKQpgYGAKCiMjIDEuYikgdG9wIDMwIGNvcnJlbGF0ZWQgZ2VuZXMgd2l0aCBUUDYzK0FDVEEyK0NOTjEgey50YWJzZXR9CgpgYGB7cn0KdG9wX215byAgPSB0b3BfY29ycmVsYXRlZChnZW5lcyA9IG15b19wcm90ZWluX21hcmtlcnMsdGhyZXNob2xkID0gMjUpCmBgYAoKIyMjIFRvcCBjb3JyZWxhdGVkIGdlbmVzCgpgYGB7cn0KcHJpbnQoIiNnZW5lcyA9ICIgJT4lIHBhc3RlKGxlbmd0aCh0b3BfbXlvKSkpCnRvcF9teW8gJT4lIGhlYWQoMzApCmBgYAoKIyMjIENvcnJlbGF0aW9uCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQp0b3BfZ2VuZXNfY29yX2hlYXRtYXAodG9wX2dlbmVzID0gdG9wX215bykKYGBgCgojIyMgRW5yaWNobWVudCBhbmFseXNpcwoKYGBge3IgcmVzdWx0cz0naGlkZSd9CmVucmljaF9yZXMgPSBnZW5lc192ZWNfZW5yaWNobWVudChnZW5lcyA9IHRvcF9teW8sYmFja2dyb3VuZCA9IHJvd25hbWVzKGFjYzFfY2FuY2VyX2NlbGxzKSxob21lciA9IFQsdGl0bGUgPSAibXlvIHRvcCBlbnJpY2htZW50IikKZW5yaWNoX3JlcwpgYGAKCiMjIyBVTUFQIHNjb3JlIG9mIGVucmljaGVkIGdlbmVzCgpgYGB7cn0KbHN0ID0gZW5yaWNoZWRfc2NvcmVfdW1hcChlbnJpY2hfcmVzID0gZW5yaWNoX3JlcyxnZW5lcyA9IG15b19wcm90ZWluX21hcmtlcnMsY29sID0gMSkKbXlvX3Njb3JlID0gbHN0W1sic2NvcmUiXV0KZW5yaWNoZWRfZ2VuZXMgPSBsc3RbWyJnZW5lcyJdXQpgYGAKZ2VuZXMgaW4gc2NvcmU6CmBgYHtyfQpsc3RbWyJnZW5lcyJdXQpgYGAKW0NBTEQxXShodHRwczovL2pvdXJuYWxzLnNhZ2VwdWIuY29tL2RvaS9lcGRmLzEwLjExNzcvMTA2Njg5NjkwNTAxMzAwMTA4KQpbTHlzeWwgb3hpZGFzZSBnZW5lIChMT1hMMikgZXhwcmVzc2lvbiBpbiB0aGUgc3Ryb21hbCByZWFjdGlvbiB0byBpbiBzaXR1IGFuZCBpbnZhc2l2ZSBkdWN0YWwgYnJlYXN0IGNhcmNpbm9tYV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wbWMvYXJ0aWNsZXMvUE1DMTg1ODI2OC8pClRQTTIgPSB0cm9wb215b3NpbiAKIyMgIHsudW5udW1iZXJlZH0KCgojICoqMi4gTHVtaW5hbCBtYXJrZXJzKioKCiMjIDIuYSkgZXhwcmVzc2lvbgoKYGBge3J9Cmx1bV9wcm90ZWluX21hcmtlcnMgPSBjKCJLSVQiKQpGZWF0dXJlUGxvdChvYmplY3QgPSBhY2MxX2NhbmNlcl9jZWxscyxmZWF0dXJlcyA9IGx1bV9wcm90ZWluX21hcmtlcnMsbWluLmN1dG9mZiA9IDApCmBgYAoKIyMgMiB0b3AgIGNvcnJlbGF0ZWQgZ2VuZXMgd2l0aCBLSVQgey50YWJzZXR9CgpgYGB7cn0KdG9wX2tpdCA9IHRvcF9jb3JyZWxhdGVkKGdlbmVzID0gbHVtX3Byb3RlaW5fbWFya2Vycyx0aHJlc2hvbGQgPSAyNSkKYGBgCgojIyMgVG9wIGNvcnJlbGF0ZWQgZ2VuZXMKCmBgYHtyfQpwcmludCgiI2dlbmVzID0gIiAlPiUgcGFzdGUobGVuZ3RoKHRvcF9raXQpKSkKdG9wX2tpdApgYGAKCiMjIyBDb3JyZWxhdGlvbgoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KdG9wX2dlbmVzX2Nvcl9oZWF0bWFwKHRvcF9nZW5lcyA9IHRvcF9raXQpCmBgYAoKIyMjIEVucmljaG1lbnQgYW5hbHlzaXMKCmBgYHtyIHJlc3VsdHM9J2hpZGUnfQplbnJpY2hfcmVzID0gZ2VuZXNfdmVjX2VucmljaG1lbnQoZ2VuZXMgPSB0b3Bfa2l0LGJhY2tncm91bmQgPSByb3duYW1lcyhleHByZXNzaW9uKSxob21lciA9IFQsdGl0bGUgPSAibHVtIHRvcCBlbnJpY2htZW50IixjdXN0b21fcGF0aHdheXMgPSBsdW1pbmFsX2dzKQplbnJpY2hfcmVzCmBgYAoKIyMjIFVNQVAgc2NvcmUgb2YgZW5yaWNoZWQgZ2VuZXMKCmBgYHtyfQpsc3QgPSBlbnJpY2hlZF9zY29yZV91bWFwKGVucmljaF9yZXMgPSBlbnJpY2hfcmVzLGdlbmVzID0gbHVtX3Byb3RlaW5fbWFya2Vycyxjb2wgPSAxKQpsdW1fc2NvcmUgPSBsc3RbWyJzY29yZSJdXQplbnJpY2hlZF9nZW5lcyA9IGxzdFtbImdlbmVzIl1dCmBgYAoKZ2VuZXMgaW4gc2NvcmU6CmBgYHtyfQpsc3RbWyJnZW5lcyJdXQpgYGAKW0NDTkQxIENvcHkgTnVtYmVyIFZhcmlhdGlvbiBpbiBDaXJjdWxhdGluZyBUdW1vciBETkEgZnJvbSBMdW1pbmFsIEIgQnJlYXN0IENhbmNlciBQYXRpZW50c10oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8zNTg5NjI1MS8pCgojIyAgey51bm51bWJlcmVkfQoKIyMgQ29ycmVsYXRpb24gYmV0d2VlbiBsdW1pbmFsIGFuZCBteW8gc2NvcmVzCmBgYHtyfQpjb3IobHVtaW5hbF9zY29yZSxteW9fc2NvcmUpCmBgYApgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojc2F2ZSBub3RlYm9vazoKcnN0dWRpb2FwaTo6ZG9jdW1lbnRTYXZlKCkgI3NhdmUgZG9jCnRoaXNfbm90ZWJvb2tlX3BhdGggPSByc3R1ZGlvYXBpOjpnZXRTb3VyY2VFZGl0b3JDb250ZXh0KCkkcGF0aApwcmV2aWV3ZWRfbm90ZWJvb2sgPSBnc3ViKHBhdHRlcm4gPSAiLlJtZCIscmVwbGFjZW1lbnQgPSAiLm5iLmh0bWwiLHggPSB0aGlzX25vdGVib29rZV9wYXRoKQpmaW5hbF9ub3RlYm9vayAgPSBiYXNlbmFtZSh0aGlzX25vdGVib29rZV9wYXRoKSAlPiUgZ3N1YihwYXR0ZXJuID0gIi5SbWQiLHJlcGxhY2VtZW50ID0gIiIpCm5ld19ub3RlYm9va19wYXRoID0gZGlybmFtZSh0aGlzX25vdGVib29rZV9wYXRoKSAlPiUgcGFzdGUoZmluYWxfbm90ZWJvb2ssc2VwID0gIi8iKSAlPiUgcGFzdGUoc3VmZml4LHNlcCA9ICJfIikgJT4lIHBhc3RlMCgiLmh0bWwiKQpvdmVyd3JpdGUgPSBGCmlmKGZpbGUuZXhpc3RzKG5ld19ub3RlYm9va19wYXRoKSl7CiAgY2F0ICgiRmlsZSBleGlzdHMsIG92ZXJyaWRlPyIgKQogIGNob3NlbiA8LSByZWFkbGluZShwcm9tcHQ9IiAxIHllcyBcbiAyIG5vXG4iKQogICAgaWYoY2hvc2VuID09IDEpe292ZXJ3cml0ZSA9IFR9ZWxzZXtvdmVyd3JpdGUgPSBGfQogIH0KZmlsZS5jb3B5KGZyb20gPSBwcmV2aWV3ZWRfbm90ZWJvb2ssIHRvID0gZGlybmFtZSh0aGlzX25vdGVib29rZV9wYXRoKSAlPiUgcGFzdGUoZmluYWxfbm90ZWJvb2ssc2VwID0gIi8iKSAlPiUgcGFzdGUoc3VmZml4LHNlcCA9ICJfIikgJT4lIHBhc3RlMCgiLmh0bWwiKSxvdmVyd3JpdGUgPSBvdmVyd3JpdGUpCmBgYAoKYGBge3J9CiMgcmVzID0gRmluZEFsbE1hcmtlcnMob2JqZWN0ID0gYWNjMV9jYW5jZXJfY2VsbHMpCmBgYAoKYGBge3J9CiMgbWFya2Vyc19jbHVzdGVyMyA9IHJlc1tyZXMkY2x1c3RlciA9PSAzICYgcmVzJHBfdmFsPDAuMDAwMDEsImdlbmUiXQpgYGAKCmBgYHtyIHJlc3VsdHM9J2hpZGUnfQojIGdlbmVzX3ZlY19lbnJpY2htZW50KGdlbmVzID0gbWFya2Vyc19jbHVzdGVyMyxiYWNrZ3JvdW5kID0gcm93bmFtZXMoYWNjMV9jYW5jZXJfY2VsbHMpLGhvbWVyID0gVCx0aXRsZSA9ICJteW8gdG9wIGVucmljaG1lbnQiLGN1c3RvbV9wYXRod2F5cyA9IGx1bWluYWxfZ3MpCmBgYAo=