1 Functions

2 Data

acc_immune = LoadH5Seurat(file = "./Data/acc_immune.h5seurat")

3 Immune markers

FeaturePlot(acc_immune, features = c("CD8A","MS4A1", "SELL", "CD3E",  "S100A4","CD14","GNLY","MS4A1"))

4 assign cell type

acc_immune <- RenameIdents(object = acc_immune, 
                               "0" = "Naive CD4+ T",
                               "1" = "Memory CD4+",
                               "2" = "CD14+ Mono",
                               "3" = "Memory CD4+",
                               "4" = "CD8+ T",
                               "5" = "B",
                               "6" = "Naive CD4+ T",
                               "7" = "Memory CD4+",
                               "8" = "Memory CD4+")
acc_immune$cell_identity = acc_immune@active.ident
DimPlot(object = acc_immune,label = T)

5 Antigen presenting machinery

apm_genes = c("HLA-A","HLA-B","HLA-C","B2M","TAP1","TAP2", "TAPBP")
apm_score = FetchData(acc_immune,vars = apm_genes,slot = "data") %>% rowMeans()
acc_immune = AddMetaData(object = acc_immune,metadata = apm_score,col.name = "APM_score")
print_tab(plt = FeaturePlot(acc_immune,features = apm_genes),title = "genes")

genes

print_tab(plt = FeaturePlot(acc_immune,features = "APM_score"),title = "score")

score

NA

6 Exhaustion markers

exhausted_genes = c("PDCD1","CD244","CD160","CTLA4","HAVCR2")
FeaturePlot(acc_immune,features = exhausted_genes)

7 Immune receptors

receptors = c("CCR3", "CCR4", "CCR10","CXCR2", "CXCR3", "CXCR4", "IL17A")
FeaturePlot(acc_immune,features = receptors)

8 CellphoneDB

acc_cancer_cells = readRDS("/sci/labs/yotamd/lab_share/avishai.wizel/R_projects/ACC_microenv/Data/acc_cancer_no146_primaryonly15k_cancercells.rds")
# merge cancer and immune
common_genes = intersect(rownames(acc_cancer_cells),rownames(acc_immune))
acc_cancer_and_cd45 = merge(acc_cancer_cells[common_genes,],acc_immune[common_genes,])
  #write metadata

#create lum or myo
lum_over_myo = FetchData(object = acc_cancer_cells,vars = "luminal_over_myo")
lum_over_myo$lum_or_myo = "Unknown"
lum_over_myo$lum_or_myo [lum_over_myo$luminal_over_myo>1]  = "Luminal"
lum_over_myo$lum_or_myo [lum_over_myo$luminal_over_myo<(-1)]  = "Myo"
lum_or_myo = lum_over_myo[,"lum_or_myo",drop = F]
names(lum_or_myo)[1] = "cell_identity"

# combine
immune_identity =FetchData(object = acc_immune,vars = "cell_identity")
all_identity= rbind(lum_or_myo,immune_identity )

#rename and sort columns
all_identity$barcode_sample = rownames(all_identity)
all_identity = all_identity %>% rename(cell_type = cell_identity)
all_identity = all_identity[,c(2,1)]


write.table(x = all_identity,file = "./Data/CellphoneDB/metadata.tsv",row.names =F,sep = "\t")
#write normalized counts
count_matrix = as.data.frame(acc_cancer_and_cd45@assays[["RNA"]]@data)
fwrite(count_matrix, file = "./Data/CellphoneDB/counts.txt",sep = "\t",row.names = T)
library(ktplots)
acc_cancer_and_cd45$cell_type = all_identity[,2,drop = F] # add cells identities to seurat

#read data:
pvals =  read.delim(file = "./Data/CellphoneDB/output/statistical_analysis_pvalues_07_19_2023_12:16:16.txt", check.names = FALSE)
means = read.delim(file = "./Data/CellphoneDB/output/statistical_analysis_means_07_19_2023_12:16:16.txt", check.names = FALSE)

9 significant interactions heatmap

plot_cpdb_heatmap(scdata = acc_cancer_and_cd45, idents = 'cell_type',pvals =  pvals,main = "Number of significant interactions",alpha = 0.05)

10 Costimulatory interactions


print_tab(plt = 
            plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Luminal', scdata = acc_cancer_and_cd45,
                      idents = 'cell_type', means = means, pvals = pvals,
                      gene.family = 'costimulatory',return_table = F,max_size = 3,p.adjust.method = "fdr",keep_significant_only = T,cluster_rows = F)+
            ggtitle("costimulatory Luminal")
  ,title = "Luminal")

Luminal

print_tab(plt = 
            plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Myo', scdata = acc_cancer_and_cd45,
                      idents = 'cell_type', means = means, pvals = pvals,
                      gene.family = 'costimulatory',return_table = F,max_size = 3,p.adjust.method = "fdr",keep_significant_only = T,cluster_rows = F)+
            ggtitle("costimulatory Myo")
  ,title = "Myo")

Myo

NA

11 Coinhibitory interactions


print_tab(plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Luminal', scdata = acc_cancer_and_cd45,
          idents = 'cell_type', means = means, pvals = pvals,
          gene.family = 'coinhibitory',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
  ggtitle("coinhibitory Luminal"),title = "Luminal")

Luminal

print_tab(plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Myo', scdata = acc_cancer_and_cd45,
          idents = 'cell_type', means = means, pvals = pvals,
          gene.family = 'coinhibitory',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
  ggtitle("coinhibitory Myo"),title = "Myo")

Myo

NA

12 Chemokines interactions

print_tab(
  plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Luminal', scdata = acc_cancer_and_cd45,
          idents = 'cell_type', means = means, pvals = pvals,
          gene.family = 'chemokines',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
  ggtitle("chemokines Luminal"),title = "Luminal")

Luminal

print_tab(
  plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Myo', scdata = acc_cancer_and_cd45,
          idents = 'cell_type', means = means, pvals = pvals,
          gene.family = 'chemokines',return_table = F,max_size = 4,p.adjust.method = "fdr",keep_significant_only = F,cluster_rows = F)+
  ggtitle("chemokines Myo"),title = "Myo")

Myo

NA

13 Chemokine ligands

print_tab(plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Myo', scdata = acc_cancer_and_cd45,
    idents = 'cell_type', means = means, pvals = pvals,
 genes = c("CXCL1\\D", "CXCL2\\D","CXCL3\\D","CXCL17","C3","CXCL14"),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F) 
 ,title = "Myo")

Myo

print_tab(plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Luminal', scdata = acc_cancer_and_cd45,
    idents = 'cell_type', means = means, pvals = pvals,
  genes = c("CXCL1\\D", "CXCL2\\D","CXCL3\\D","CXCL17","C3","CXCL14"),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F) 
,title = "Luminal")

Luminal

NA

14 CCL22 and CCL28

print_tab(plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Myo', scdata = acc_cancer_and_cd45,
    idents = 'cell_type', means = means, pvals = pvals,
 genes = c("CCL22", "CCL28" ),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F),title = "Myo")

Myo

print_tab(plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Luminal', scdata = acc_cancer_and_cd45,
    idents = 'cell_type', means = means, pvals = pvals,
  genes = c("CCL22", "CCL28" ),return_table = F,max_size = 6,p.adjust.method = "fdr" ,keep_significant_only = F),title = "Luminal")

Luminal

NA

plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Myo', scdata = acc_cancer_and_cd45,
    idents = 'cell_type', means = means, pvals = pvals,
 genes = c("JAG", "MYB" ),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F) 


plot_cpdb(cell_type1 = 'CD', cell_type2 = 'Luminal', scdata = acc_cancer_and_cd45,
    idents = 'cell_type', means = means, pvals = pvals,
  genes = c("JAG", "MYB" , "NOTCH","HES1","HEY"),return_table = F,max_size = 4,p.adjust.method = "fdr" ,keep_significant_only = F) 

NA
NA
LS0tCnRpdGxlOiAnYHIgcnN0dWRpb2FwaTo6Z2V0U291cmNlRWRpdG9yQ29udGV4dCgpJHBhdGggJT4lIGJhc2VuYW1lKCkgJT4lIGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLHJlcGxhY2VtZW50ID0gIiIpYCcgCmF1dGhvcjogIkF2aXNoYWkgV2l6ZWwiCmRhdGU6ICdgciBTeXMudGltZSgpYCcKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZTogeWVzCiAgICB0b2NfZmxvYXQ6IAogICAgICBjb2xsYXBzZWQ6IEZBTFNFCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHRvY19kZXB0aDogMQotLS0KCgoKIyBGdW5jdGlvbnMKCmBgYHtyIHdhcm5pbmc9RkFMU0V9CmBgYAoKIyBEYXRhCgpgYGB7cn0KYWNjX2ltbXVuZSA9IExvYWRINVNldXJhdChmaWxlID0gIi4vRGF0YS9hY2NfaW1tdW5lLmg1c2V1cmF0IikKYGBgCgojIEltbXVuZSBtYXJrZXJzCmBgYHtyIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQpGZWF0dXJlUGxvdChhY2NfaW1tdW5lLCBmZWF0dXJlcyA9IGMoIkNEOEEiLCJNUzRBMSIsICJTRUxMIiwgIkNEM0UiLCAgIlMxMDBBNCIsIkNEMTQiLCJHTkxZIiwiTVM0QTEiKSkKYGBgCiMgYXNzaWduIGNlbGwgdHlwZQpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQphY2NfaW1tdW5lIDwtIFJlbmFtZUlkZW50cyhvYmplY3QgPSBhY2NfaW1tdW5lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwIiA9ICJOYWl2ZSBDRDQrIFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiID0gIk1lbW9yeSBDRDQrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyIiA9ICJDRDE0KyBNb25vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIiA9ICJNZW1vcnkgQ0Q0KyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCIgPSAiQ0Q4KyBUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IiA9ICJCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2IiA9ICJOYWl2ZSBDRDQrIFQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjciID0gIk1lbW9yeSBDRDQrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4IiA9ICJNZW1vcnkgQ0Q0KyIpCmFjY19pbW11bmUkY2VsbF9pZGVudGl0eSA9IGFjY19pbW11bmVAYWN0aXZlLmlkZW50CkRpbVBsb3Qob2JqZWN0ID0gYWNjX2ltbXVuZSxsYWJlbCA9IFQpCmBgYAoKIyBBbnRpZ2VuIHByZXNlbnRpbmcgbWFjaGluZXJ5IHsudGFic2V0fQpgYGB7cn0KYXBtX2dlbmVzID0gYygiSExBLUEiLCJITEEtQiIsIkhMQS1DIiwiQjJNIiwiVEFQMSIsIlRBUDIiLCAiVEFQQlAiKQphcG1fc2NvcmUgPSBGZXRjaERhdGEoYWNjX2ltbXVuZSx2YXJzID0gYXBtX2dlbmVzLHNsb3QgPSAiZGF0YSIpICU+JSByb3dNZWFucygpCmFjY19pbW11bmUgPSBBZGRNZXRhRGF0YShvYmplY3QgPSBhY2NfaW1tdW5lLG1ldGFkYXRhID0gYXBtX3Njb3JlLGNvbC5uYW1lID0gIkFQTV9zY29yZSIpCmBgYAoKYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTAsIHJlc3VsdHM9J2FzaXMnfQpwcmludF90YWIocGx0ID0gRmVhdHVyZVBsb3QoYWNjX2ltbXVuZSxmZWF0dXJlcyA9IGFwbV9nZW5lcyksdGl0bGUgPSAiZ2VuZXMiKQpwcmludF90YWIocGx0ID0gRmVhdHVyZVBsb3QoYWNjX2ltbXVuZSxmZWF0dXJlcyA9ICJBUE1fc2NvcmUiKSx0aXRsZSA9ICJzY29yZSIpCmBgYAoKIyBFeGhhdXN0aW9uIG1hcmtlcnMKYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTB9CmV4aGF1c3RlZF9nZW5lcyA9IGMoIlBEQ0QxIiwiQ0QyNDQiLCJDRDE2MCIsIkNUTEE0IiwiSEFWQ1IyIikKRmVhdHVyZVBsb3QoYWNjX2ltbXVuZSxmZWF0dXJlcyA9IGV4aGF1c3RlZF9nZW5lcykKYGBgCiMgSW1tdW5lIHJlY2VwdG9ycwpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KcmVjZXB0b3JzID0gYygiQ0NSMyIsICJDQ1I0IiwgIkNDUjEwIiwiQ1hDUjIiLCAiQ1hDUjMiLCAiQ1hDUjQiLCAiSUwxN0EiKQpGZWF0dXJlUGxvdChhY2NfaW1tdW5lLGZlYXR1cmVzID0gcmVjZXB0b3JzKQoKYGBgCiMgQ2VsbHBob25lREIKYGBge3J9CmFjY19jYW5jZXJfY2VsbHMgPSByZWFkUkRTKCIvc2NpL2xhYnMveW90YW1kL2xhYl9zaGFyZS9hdmlzaGFpLndpemVsL1JfcHJvamVjdHMvQUNDX21pY3JvZW52L0RhdGEvYWNjX2NhbmNlcl9ubzE0Nl9wcmltYXJ5b25seTE1a19jYW5jZXJjZWxscy5yZHMiKQpgYGAKCgoKYGBge3J9CiMgbWVyZ2UgY2FuY2VyIGFuZCBpbW11bmUKY29tbW9uX2dlbmVzID0gaW50ZXJzZWN0KHJvd25hbWVzKGFjY19jYW5jZXJfY2VsbHMpLHJvd25hbWVzKGFjY19pbW11bmUpKQphY2NfY2FuY2VyX2FuZF9jZDQ1ID0gbWVyZ2UoYWNjX2NhbmNlcl9jZWxsc1tjb21tb25fZ2VuZXMsXSxhY2NfaW1tdW5lW2NvbW1vbl9nZW5lcyxdKQpgYGAKCmBgYHtyfQogICN3cml0ZSBtZXRhZGF0YQoKI2NyZWF0ZSBsdW0gb3IgbXlvCmx1bV9vdmVyX215byA9IEZldGNoRGF0YShvYmplY3QgPSBhY2NfY2FuY2VyX2NlbGxzLHZhcnMgPSAibHVtaW5hbF9vdmVyX215byIpCmx1bV9vdmVyX215byRsdW1fb3JfbXlvID0gIlVua25vd24iCmx1bV9vdmVyX215byRsdW1fb3JfbXlvIFtsdW1fb3Zlcl9teW8kbHVtaW5hbF9vdmVyX215bz4xXSAgPSAiTHVtaW5hbCIKbHVtX292ZXJfbXlvJGx1bV9vcl9teW8gW2x1bV9vdmVyX215byRsdW1pbmFsX292ZXJfbXlvPCgtMSldICA9ICJNeW8iCmx1bV9vcl9teW8gPSBsdW1fb3Zlcl9teW9bLCJsdW1fb3JfbXlvIixkcm9wID0gRl0KbmFtZXMobHVtX29yX215bylbMV0gPSAiY2VsbF9pZGVudGl0eSIKCiMgY29tYmluZQppbW11bmVfaWRlbnRpdHkgPUZldGNoRGF0YShvYmplY3QgPSBhY2NfaW1tdW5lLHZhcnMgPSAiY2VsbF9pZGVudGl0eSIpCmFsbF9pZGVudGl0eT0gcmJpbmQobHVtX29yX215byxpbW11bmVfaWRlbnRpdHkgKQoKI3JlbmFtZSBhbmQgc29ydCBjb2x1bW5zCmFsbF9pZGVudGl0eSRiYXJjb2RlX3NhbXBsZSA9IHJvd25hbWVzKGFsbF9pZGVudGl0eSkKYWxsX2lkZW50aXR5ID0gYWxsX2lkZW50aXR5ICU+JSByZW5hbWUoY2VsbF90eXBlID0gY2VsbF9pZGVudGl0eSkKYWxsX2lkZW50aXR5ID0gYWxsX2lkZW50aXR5WyxjKDIsMSldCgoKd3JpdGUudGFibGUoeCA9IGFsbF9pZGVudGl0eSxmaWxlID0gIi4vRGF0YS9DZWxscGhvbmVEQi9tZXRhZGF0YS50c3YiLHJvdy5uYW1lcyA9RixzZXAgPSAiXHQiKQpgYGAKCmBgYHtyfQojd3JpdGUgbm9ybWFsaXplZCBjb3VudHMKY291bnRfbWF0cml4ID0gYXMuZGF0YS5mcmFtZShhY2NfY2FuY2VyX2FuZF9jZDQ1QGFzc2F5c1tbIlJOQSJdXUBkYXRhKQpmd3JpdGUoY291bnRfbWF0cml4LCBmaWxlID0gIi4vRGF0YS9DZWxscGhvbmVEQi9jb3VudHMudHh0IixzZXAgPSAiXHQiLHJvdy5uYW1lcyA9IFQpCmBgYAoKCmBgYHtweXRob24gaW5jbHVkZT1GQUxTRX0KI2Rvd25sb2FkIGRhdGFiYXNlCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IGdsb2IKaW1wb3J0IG9zCiMgLS0gVmVyc2lvbiBvZiB0aGUgZGF0YWJzZQpjcGRiX3ZlcnNpb24gPSAndjQuMS4wJwoKIyAtLSBQYXRoIHdoZXJlIHRoZSBpbnB1dCBmaWxlcyB0byBnZW5lcmF0ZSB0aGUgZGF0YWJhc2UgYXJlIGxvY2F0ZWQKY3BkYl90YXJnZXRfZGlyID0gb3MucGF0aC5qb2luKCcuL0RhdGEvQ2VsbHBob25lREIvJywgY3BkYl92ZXJzaW9uKQoKIyBEb3dubG9hZCBkYXRhYmFzZQpmcm9tIGNlbGxwaG9uZWRiLnV0aWxzIGltcG9ydCBkYl91dGlscwpkYl91dGlscy5kb3dubG9hZF9kYXRhYmFzZShjcGRiX3RhcmdldF9kaXIsIGNwZGJfdmVyc2lvbikKYGBgCgpgYGB7cHl0aG9uIGluY2x1ZGU9RkFMU0V9CmZyb20gY2VsbHBob25lZGIuc3JjLmNvcmUubWV0aG9kcyBpbXBvcnQgY3BkYl9zdGF0aXN0aWNhbF9hbmFseXNpc19tZXRob2QKCmRlY29udm9sdXRlZCwgbWVhbnMsIHB2YWx1ZXMsIHNpZ25pZmljYW50X21lYW5zID0gY3BkYl9zdGF0aXN0aWNhbF9hbmFseXNpc19tZXRob2QuY2FsbCgKICAgIGNwZGJfZmlsZV9wYXRoID0gIi4vRGF0YS9DZWxscGhvbmVEQi92NC4xLjAvY2VsbHBob25lZGIuemlwIiwgICAgICAgICAgICAgICAgICMgbWFuZGF0b3J5OiBDZWxsUGhvbmVEQiBkYXRhYmFzZSB6aXAgZmlsZS4KICAgIG1ldGFfZmlsZV9wYXRoID0gIi4vRGF0YS9DZWxscGhvbmVEQi9tZXRhZGF0YS50c3YiLCAgICAgICAgICAgICAgICAgIyBtYW5kYXRvcnk6IHRzdiBmaWxlIGRlZmluaW5nIGJhcmNvZGVzIHRvIGNlbGwgbGFiZWwuCiAgICBjb3VudHNfZmlsZV9wYXRoID0gIi4vRGF0YS9DZWxscGhvbmVEQi9jb3VudHMudHh0IiwgICAgICAgICAgICAgIyBtYW5kYXRvcnk6IG5vcm1hbGl6ZWQgY291bnQgbWF0cml4LgogICAgY291bnRzX2RhdGEgPSAnaGduY19zeW1ib2wnLCAgICAgICAgICAgICAgICAgICAgICMgZGVmaW5lcyB0aGUgZ2VuZSBhbm5vdGF0aW9uIGluIGNvdW50cyBtYXRyaXguCiAgICBvdXRwdXRfcGF0aCA9ICIuL0RhdGEvQ2VsbHBob25lREIvb3V0cHV0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICMgUGF0aCB0byBzYXZlIHJlc3VsdHMuCikKYGBgCgoKYGBge3J9CmxpYnJhcnkoa3RwbG90cykKYWNjX2NhbmNlcl9hbmRfY2Q0NSRjZWxsX3R5cGUgPSBhbGxfaWRlbnRpdHlbLDIsZHJvcCA9IEZdICMgYWRkIGNlbGxzIGlkZW50aXRpZXMgdG8gc2V1cmF0CgojcmVhZCBkYXRhOgpwdmFscyA9ICByZWFkLmRlbGltKGZpbGUgPSAiLi9EYXRhL0NlbGxwaG9uZURCL291dHB1dC9zdGF0aXN0aWNhbF9hbmFseXNpc19wdmFsdWVzXzA3XzE5XzIwMjNfMTI6MTY6MTYudHh0IiwgY2hlY2submFtZXMgPSBGQUxTRSkKbWVhbnMgPSByZWFkLmRlbGltKGZpbGUgPSAiLi9EYXRhL0NlbGxwaG9uZURCL291dHB1dC9zdGF0aXN0aWNhbF9hbmFseXNpc19tZWFuc18wN18xOV8yMDIzXzEyOjE2OjE2LnR4dCIsIGNoZWNrLm5hbWVzID0gRkFMU0UpCgpgYGAKCiMgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIGhlYXRtYXAKYGBge3J9CnBsb3RfY3BkYl9oZWF0bWFwKHNjZGF0YSA9IGFjY19jYW5jZXJfYW5kX2NkNDUsIGlkZW50cyA9ICdjZWxsX3R5cGUnLHB2YWxzID0gIHB2YWxzLG1haW4gPSAiTnVtYmVyIG9mIHNpZ25pZmljYW50IGludGVyYWN0aW9ucyIsYWxwaGEgPSAwLjA1KQpgYGAKCiMgQ29zdGltdWxhdG9yeSBpbnRlcmFjdGlvbnMgey50YWJzZXR9CmBgYHtyIGZpZy5oZWlnaHQ9OCwgcmVzdWx0cz0nYXNpcyd9CgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsJywgc2NkYXRhID0gYWNjX2NhbmNlcl9hbmRfY2Q0NSwKICAgICAgICAgICAgICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgICAgICAgICAgICAgZ2VuZS5mYW1pbHkgPSAnY29zdGltdWxhdG9yeScscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDMscC5hZGp1c3QubWV0aG9kID0gImZkciIsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gVCxjbHVzdGVyX3Jvd3MgPSBGKSsKICAgICAgICAgICAgZ2d0aXRsZSgiY29zdGltdWxhdG9yeSBMdW1pbmFsIikKICAsdGl0bGUgPSAiTHVtaW5hbCIpCgpwcmludF90YWIocGx0ID0gCiAgICAgICAgICAgIHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEJywgY2VsbF90eXBlMiA9ICdNeW8nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2FuZF9jZDQ1LAogICAgICAgICAgICAgICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICAgICAgICAgICAgICBnZW5lLmZhbWlseSA9ICdjb3N0aW11bGF0b3J5JyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gMyxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBULGNsdXN0ZXJfcm93cyA9IEYpKwogICAgICAgICAgICBnZ3RpdGxlKCJjb3N0aW11bGF0b3J5IE15byIpCiAgLHRpdGxlID0gIk15byIpCmBgYAoKIyBDb2luaGliaXRvcnkgaW50ZXJhY3Rpb25zIHsudGFic2V0fQoKYGBge3IgZmlnLmhlaWdodD01LHJlc3VsdHM9J2FzaXMnfQoKcHJpbnRfdGFiKHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEJywgY2VsbF90eXBlMiA9ICdMdW1pbmFsJywgc2NkYXRhID0gYWNjX2NhbmNlcl9hbmRfY2Q0NSwKICAgICAgICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogICAgICAgICAgZ2VuZS5mYW1pbHkgPSAnY29pbmhpYml0b3J5JyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGLGNsdXN0ZXJfcm93cyA9IEYpKwogIGdndGl0bGUoImNvaW5oaWJpdG9yeSBMdW1pbmFsIiksdGl0bGUgPSAiTHVtaW5hbCIpCgpwcmludF90YWIocGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0QnLCBjZWxsX3R5cGUyID0gJ015bycsIHNjZGF0YSA9IGFjY19jYW5jZXJfYW5kX2NkNDUsCiAgICAgICAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICAgICAgICAgIGdlbmUuZmFtaWx5ID0gJ2NvaW5oaWJpdG9yeScscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRixjbHVzdGVyX3Jvd3MgPSBGKSsKICBnZ3RpdGxlKCJjb2luaGliaXRvcnkgTXlvIiksdGl0bGUgPSAiTXlvIikKYGBgCgojIENoZW1va2luZXMgaW50ZXJhY3Rpb25zIHsudGFic2V0fQpgYGB7ciBmaWcuaGVpZ2h0PTYsIHJlc3VsdHM9J2FzaXMnfQpwcmludF90YWIoCiAgcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0QnLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwnLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2FuZF9jZDQ1LAogICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICBnZW5lLmZhbWlseSA9ICdjaGVtb2tpbmVzJyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGLGNsdXN0ZXJfcm93cyA9IEYpKwogIGdndGl0bGUoImNoZW1va2luZXMgTHVtaW5hbCIpLHRpdGxlID0gIkx1bWluYWwiKQoKcHJpbnRfdGFiKAogIHBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEJywgY2VsbF90eXBlMiA9ICdNeW8nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2FuZF9jZDQ1LAogICAgICAgICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgICAgICAgICBnZW5lLmZhbWlseSA9ICdjaGVtb2tpbmVzJyxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIixrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGLGNsdXN0ZXJfcm93cyA9IEYpKwogIGdndGl0bGUoImNoZW1va2luZXMgTXlvIiksdGl0bGUgPSAiTXlvIikKYGBgCiMgQ2hlbW9raW5lIGxpZ2FuZHMgey50YWJzZXR9CmBgYHtyIHJlc3VsdHM9J2FzaXMnfQpwcmludF90YWIocGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0QnLCBjZWxsX3R5cGUyID0gJ015bycsIHNjZGF0YSA9IGFjY19jYW5jZXJfYW5kX2NkNDUsCiAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKIGdlbmVzID0gYygiQ1hDTDFcXEQiLCAiQ1hDTDJcXEQiLCJDWENMM1xcRCIsIkNYQ0wxNyIsIkMzIiwiQ1hDTDE0IikscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIgLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYpIAogLHRpdGxlID0gIk15byIpCgpwcmludF90YWIocGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0QnLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwnLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2FuZF9jZDQ1LAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgZ2VuZXMgPSBjKCJDWENMMVxcRCIsICJDWENMMlxcRCIsIkNYQ0wzXFxEIiwiQ1hDTDE3IiwiQzMiLCJDWENMMTQiKSxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIiAsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRikgCix0aXRsZSA9ICJMdW1pbmFsIikKCmBgYAojIENDTDIyIGFuZCBDQ0wyOCB7LnRhYnNldH0KYGBge3IgcmVzdWx0cz0nYXNpcyd9CnByaW50X3RhYihwbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRCcsIGNlbGxfdHlwZTIgPSAnTXlvJywgc2NkYXRhID0gYWNjX2NhbmNlcl9hbmRfY2Q0NSwKICAgIGlkZW50cyA9ICdjZWxsX3R5cGUnLCBtZWFucyA9IG1lYW5zLCBwdmFscyA9IHB2YWxzLAogZ2VuZXMgPSBjKCJDQ0wyMiIsICJDQ0wyOCIgKSxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIiAsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRiksdGl0bGUgPSAiTXlvIikKCnByaW50X3RhYihwbG90X2NwZGIoY2VsbF90eXBlMSA9ICdDRCcsIGNlbGxfdHlwZTIgPSAnTHVtaW5hbCcsIHNjZGF0YSA9IGFjY19jYW5jZXJfYW5kX2NkNDUsCiAgICBpZGVudHMgPSAnY2VsbF90eXBlJywgbWVhbnMgPSBtZWFucywgcHZhbHMgPSBwdmFscywKICBnZW5lcyA9IGMoIkNDTDIyIiwgIkNDTDI4IiApLHJldHVybl90YWJsZSA9IEYsbWF4X3NpemUgPSA2LHAuYWRqdXN0Lm1ldGhvZCA9ICJmZHIiICxrZWVwX3NpZ25pZmljYW50X29ubHkgPSBGKSx0aXRsZSA9ICJMdW1pbmFsIikKCgoKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTZ9CnBsb3RfY3BkYihjZWxsX3R5cGUxID0gJ0NEJywgY2VsbF90eXBlMiA9ICdNeW8nLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2FuZF9jZDQ1LAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiBnZW5lcyA9IGMoIkpBRyIsICJNWUIiICkscmV0dXJuX3RhYmxlID0gRixtYXhfc2l6ZSA9IDQscC5hZGp1c3QubWV0aG9kID0gImZkciIgLGtlZXBfc2lnbmlmaWNhbnRfb25seSA9IEYpIAoKcGxvdF9jcGRiKGNlbGxfdHlwZTEgPSAnQ0QnLCBjZWxsX3R5cGUyID0gJ0x1bWluYWwnLCBzY2RhdGEgPSBhY2NfY2FuY2VyX2FuZF9jZDQ1LAogICAgaWRlbnRzID0gJ2NlbGxfdHlwZScsIG1lYW5zID0gbWVhbnMsIHB2YWxzID0gcHZhbHMsCiAgZ2VuZXMgPSBjKCJKQUciLCAiTVlCIiAsICJOT1RDSCIsIkhFUzEiLCJIRVkiKSxyZXR1cm5fdGFibGUgPSBGLG1heF9zaXplID0gNCxwLmFkanVzdC5tZXRob2QgPSAiZmRyIiAsa2VlcF9zaWduaWZpY2FudF9vbmx5ID0gRikgCgoKYGBgCjxzY3JpcHQgc3JjPSJodHRwczovL2h5cG90aGVzLmlzL2VtYmVkLmpzIiBhc3luYz48L3NjcmlwdD4KCg==