1. load libraries

2. Load Seurat Object


 load("/home/bioinfo/0-imp_Robj/Harmony_integrated_All_samples_Merged_with_PBMC10x_with_harmony_clustering.Robj")
 

3. Initial Visualization

All_samples_Merged <- SetIdent(All_samples_Merged, value = "Harmony_snn_res.0.9")
  


DimPlot(All_samples_Merged,group.by = "cell_line", 
        reduction = "umap.harmony",
        label.size = 3,
        repel = T,
        label = T)


DimPlot(All_samples_Merged,
        group.by = "Harmony_snn_res.0.9", 
        reduction = "umap.harmony",
        label.size = 3,
        repel = T,
        label = T)



DimPlot(All_samples_Merged, group.by = "predicted.celltype.l2", 
        reduction = "umap.harmony",
        label.size = 3,
        repel = T,
        label = T)


 
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$SCT_snn_res.0.9)
                   
                       0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21
  ASDC                 0    0    0    0    0    0    0    0    0    0    0    3    0    0    0    0    0    0    0    0    0    0
  B intermediate       0    0    0    0    0    1    0    0    0    0    0    3  664    0    1   17    0    4    0    2    2    0
  B memory             1    5    1    0    0    2  218    7    0    0    0    3  260    1    0    2    1    5    0   13    1    0
  B naive              0    0    0    0    0    1    0    0    0    0    0    7 1170    0    1    0    0    6    0    0    1    6
  CD14 Mono            0    1    2    0    0    1   38    0    9    0   20 2522    0    1    0  812    0  218    6    0    0  183
  CD16 Mono            0    1    0    0    0    0    0    0    0    0    0  105    0    0    0   19    0    0    0    0    0    1
  CD4 CTL              0    0    0    0    0    0    0    0    0    0    0    0    0    0   16    0    0    0    0    0    0    1
  CD4 Naive         1953    0    0    0    0   35    0    0    0    0    0    0    7    0    0    0    0    6    0    0   40    1
  CD4 Proliferating    1 4409 4338 1901 3476    6 1977 2989 2946 3183  402    1    2 1846    1    0  825   28   48  498  133    0
  CD4 TCM           2606  805   19    8   69 3290 1458   52  331   15 2643   18   65  107   53   32    1  392  580   44  256   20
  CD4 TEM              6    0    0    0    0   69    0    0    0    0    1    0    0    0   15    0    0    3    0    0    0    0
  CD8 Naive         1315    0    0    0    0   15    0    0    0    0    0    0    2    0    1    1    0   18    1    0   17    2
  CD8 Proliferating    0    0    0    0    0    0    2    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  CD8 TCM            121    1    0    0    0  237    0    0    9    0    0    0    2    0   92    0    0    6    7    0    1    0
  CD8 TEM              5    0    0    1    0   40    7    0    5    0    0    1    1    0  324    0    0    0    0    0    7    0
  cDC1                 0    0    0    0    0    0    5    0    0    0    0   13    0    0    0    0    0    0    0    2    1    0
  cDC2                 0    0    0    0    1    0   47    0    1    0    0  122    0    0    0    0    0    0    0    3    0    2
  dnT                  7    0    0    0    0   24    7    0    0    0    1    0    2    0    0    3    0   17    0    0   20    0
  gdT                  9    0    0    0    0    6    0    0    0    0    0    0    0    0   77    0    0    0    0    0    1    0
  HSPC                 0    1   54    0  705    0   37  757    0  197    3    6    1    0    1    0    1    3    6   39    7    0
  ILC                  0    0    0    0    0    0    0    0    0    0    0    0    1    0    4    0    0    1    0    0    1    0
  MAIT                 0    0    0    0    0    8    0    0    0    0    0    0    0    0  228    0    0    1    0    0    3    2
  NK                   0    0    0    0    0    0    0    0    0    0    0    0    1    0  518    1    0    1    0    0    7    6
  NK Proliferating     0    0    9 2374    5    0    8    6  443  218    0    0    0   15    2    0   38    5    0   11   32    0
  NK_CD56bright        0    0    0    0    0    0    0    0    0    0    0    0    0    0   14    0    0    0    0    0    2    0
  pDC                  0    0    0    0    0    0    0    0    0    0    0   56    0    0    0    0    0    0    0    0    0    0
  Plasmablast          0    0    0    0    0    0    0    0    0    0    0    5   11    0    0    0    0    2    0    0    1    0
  Platelet             0    0    0    0    0    0    0    0    0    0    0    1    0    0    0    1    0    0    0    0    0    0
  Treg                90    0    0    0    0  166    9    0    1    0    0    0    5    0    0    0    0   41    0    0   39    1
                   
                      22   23   24
  ASDC                 0    0    0
  B intermediate       2    0    0
  B memory             2    1    0
  B naive              0    0    0
  CD14 Mono            7    3    0
  CD16 Mono            0    0    0
  CD4 CTL              0    0    0
  CD4 Naive            0    0    1
  CD4 Proliferating    1    0    0
  CD4 TCM              3    0   11
  CD4 TEM              0    0    0
  CD8 Naive            0    1    0
  CD8 Proliferating    0    0    0
  CD8 TCM              0    0    1
  CD8 TEM              0    0    0
  cDC1                21    0    0
  cDC2                53    0    0
  dnT                  0    0    1
  gdT                  0    0    0
  HSPC                 4    7    5
  ILC                  0    0    0
  MAIT                 0    0    0
  NK                   0    0    0
  NK Proliferating     0    1    0
  NK_CD56bright        0    0    0
  pDC                  0    0    0
  Plasmablast          0    0    0
  Platelet             0   30    0
  Treg                 1    0    0

4. Perform DE analysis


# Find markers using the FindMarkers between 1vs2 and 6vs16 


All_samples_Merged <- SetIdent(All_samples_Merged, value = "SCT_snn_res.0.9")

C1_vs_C2 <- FindMarkers(All_samples_Merged, 
                           ident.1 = 1,
                           ident.2 = 2
                           )

Perform DE analysis


# Find markers using the FindMarkers between 1vs2 and 6vs16 


All_samples_Merged <- SetIdent(All_samples_Merged, value = "SCT_snn_res.0.9")

C6_vs_C16 <- FindMarkers(All_samples_Merged, 
                           ident.1 = 6,
                           ident.2 = 16
                           )


# Convert to data frame and add gene names as a new column
 C6_vs_C16 <- as.data.frame(C6_vs_C16)
C6_vs_C16$gene <- rownames(C6_vs_C16)

# Rearranging the columns for better readability (optional)
C6_vs_C16 <- C6_vs_C16[, c("gene", "p_val", "avg_log2FC", "pct.1", "pct.2", "p_val_adj")]

write.csv(C6_vs_C16, "C6_vs_C16", row.names = FALSE)
  1. Volcano Plot-C1vsC2

EnhancedVolcano(C1_vs_C2 , 
                lab=rownames(C1_vs_C2),
                x ="avg_log2FC", 
                y ="p_val_adj",
                title = "C1_vs_C2",
                pCutoff = 0.05,
                FCcutoff = 1, 
                legendPosition = 'right', 
                labCol = 'black',
                labFace = 'bold',
                boxedLabels = TRUE,
                pointSize = 3.0,
                labSize = 5.0, 
                drawConnectors = TRUE,
                widthConnectors = 0.25)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

# EnhancedVolcano(Patient_cell_lines_vs_PBMC_Tcells , 
#                 lab=rownames(Patient_cell_lines_vs_PBMC_Tcells),
#                 x ="avg_log2FC", 
#                 y ="p_val_adj",
#                 selectLab = c('EPCAM','BCAT1','KIR3DL2',
#       'FOXM1','TWIST1','TNFSF9','CD80','CD7','IL1B', 'TRBV7.6','TRBV5.4','TRBV12.4'),
#                 title = "Sézary Cell Lines vs PBMC T cells",
#                  xlab = bquote(~Log[2]~ 'fold change'),
#                 pCutoff = 0.05,
#                 FCcutoff = 1, 
#                 legendPosition = 'right', 
#                 legendLabSize = 14,
#                 legendIconSize = 4.0,
#                 labCol = 'black',
#                 labFace = 'bold',
#                 boxedLabels = TRUE,
#                 pointSize = 3.0,
#                 labSize = 5.0, 
#                 drawConnectors = TRUE,
#                 widthConnectors = 0.75,
#                 colConnectors = 'black')


EnhancedVolcano(C1_vs_C2, 
                lab = ifelse(C1_vs_C2$avg_log2FC > 1 & C1_vs_C2$p_val_adj < 0.05, 
                             rownames(C1_vs_C2), 
                             ""),  # Label only significant genes
                x = "avg_log2FC", 
                y = "p_val_adj",
                title = "C1_vs_C2",
                pCutoff = 0.05,
                FCcutoff = 1, 
                legendPosition = 'right', 
                labCol = 'black',
                labFace = 'bold',
                boxedLabels = TRUE,
                pointSize = 3.0,
                labSize = 5.0, 
                drawConnectors = TRUE,
                widthConnectors = 0.25)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

EnhancedVolcano(C1_vs_C2, 
                lab = ifelse((C1_vs_C2$avg_log2FC > 1.5 | C1_vs_C2$avg_log2FC < -1.5) & 
                             C1_vs_C2$p_val_adj < 0.05, 
                             rownames(C1_vs_C2), 
                             ""),  # Label only significant genes
                x = "avg_log2FC", 
                y = "p_val_adj",
                title = "C1_vs_C2",
                pCutoff = 0.05,
                FCcutoff = 1, 
                legendPosition = 'right', 
                labCol = 'black',
                labFace = 'bold',
                boxedLabels = TRUE,
                pointSize = 3.0,
                labSize = 5.0, 
                drawConnectors = TRUE,
                widthConnectors = 0.25)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

# All_samples_Merged <- SetIdent(All_samples_Merged, value = "SCT_snn_res.0.9")
# 
# L2_Thesholds <- FindMarkers(All_samples_Merged, ident.1 = "4", ident.2 = "9", min.pct = 0.10, thresh.use = 0.25)
# 
# EnhancedVolcano(L2_Thesholds , 
#                 lab=rownames(L2_Thesholds),
#                 x ="avg_log2FC", 
#                 y ="p_val_adj",
#                 title = "4_vs_9",
#                 pCutoff = 0.05,
#                 FCcutoff = 1, 
#                 legendPosition = 'right', 
#                 labCol = 'black',
#                 labFace = 'bold',
#                 boxedLabels = TRUE,
#                 pointSize = 3.0,
#                 labSize = 3.0, 
#                 drawConnectors = FALSE,
#                 widthConnectors = 0.75)

C6vsC16


EnhancedVolcano(C6_vs_C16 , 
                lab=rownames(C6_vs_C16),
                x ="avg_log2FC", 
                y ="p_val_adj",
                title = "C6_vs_C16",
                pCutoff = 0.05,
                FCcutoff = 1, 
                legendPosition = 'right', 
                labCol = 'black',
                labFace = 'bold',
                boxedLabels = TRUE,
                pointSize = 3.0,
                labSize = 5.0, 
                drawConnectors = TRUE,
                widthConnectors = 0.25)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

# EnhancedVolcano(Patient_cell_lines_vs_PBMC_Tcells , 
#                 lab=rownames(Patient_cell_lines_vs_PBMC_Tcells),
#                 x ="avg_log2FC", 
#                 y ="p_val_adj",
#                 selectLab = c('EPCAM','BCAT1','KIR3DL2',
#       'FOXM1','TWIST1','TNFSF9','CD80','CD7','IL1B', 'TRBV7.6','TRBV5.4','TRBV12.4'),
#                 title = "Sézary Cell Lines vs PBMC T cells",
#                  xlab = bquote(~Log[2]~ 'fold change'),
#                 pCutoff = 0.05,
#                 FCcutoff = 1, 
#                 legendPosition = 'right', 
#                 legendLabSize = 14,
#                 legendIconSize = 4.0,
#                 labCol = 'black',
#                 labFace = 'bold',
#                 boxedLabels = TRUE,
#                 pointSize = 3.0,
#                 labSize = 5.0, 
#                 drawConnectors = TRUE,
#                 widthConnectors = 0.75,
#                 colConnectors = 'black')


EnhancedVolcano(C6_vs_C16, 
                lab = ifelse(C6_vs_C16$avg_log2FC > 1 & C6_vs_C16$p_val_adj < 0.05, 
                             rownames(C6_vs_C16), 
                             ""),  # Label only significant genes
                x = "avg_log2FC", 
                y = "p_val_adj",
                title = "C6_vs_C16",
                pCutoff = 0.05,
                FCcutoff = 1, 
                legendPosition = 'right', 
                labCol = 'black',
                labFace = 'bold',
                boxedLabels = TRUE,
                pointSize = 3.0,
                labSize = 5.0, 
                drawConnectors = TRUE,
                widthConnectors = 0.25)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

EnhancedVolcano(C6_vs_C16, 
                lab = ifelse((C6_vs_C16$avg_log2FC > 1.5 | C6_vs_C16$avg_log2FC < -1.5) & 
                             C6_vs_C16$p_val_adj < 0.05, 
                             rownames(C6_vs_C16), 
                             ""),  # Label only significant genes
                x = "avg_log2FC", 
                y = "p_val_adj",
                title = "C6_vs_C16",
                pCutoff = 0.05,
                FCcutoff = 1, 
                legendPosition = 'right', 
                labCol = 'black',
                labFace = 'bold',
                boxedLabels = TRUE,
                pointSize = 3.0,
                labSize = 5.0, 
                drawConnectors = TRUE,
                widthConnectors = 0.25)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

# All_samples_Merged <- SetIdent(All_samples_Merged, value = "SCT_snn_res.0.9")
# 
# L2_Thesholds <- FindMarkers(All_samples_Merged, ident.1 = "4", ident.2 = "9", min.pct = 0.10, thresh.use = 0.25)
# 
# EnhancedVolcano(L2_Thesholds , 
#                 lab=rownames(L2_Thesholds),
#                 x ="avg_log2FC", 
#                 y ="p_val_adj",
#                 title = "4_vs_9",
#                 pCutoff = 0.05,
#                 FCcutoff = 1, 
#                 legendPosition = 'right', 
#                 labCol = 'black',
#                 labFace = 'bold',
#                 boxedLabels = TRUE,
#                 pointSize = 3.0,
#                 labSize = 3.0, 
#                 drawConnectors = FALSE,
#                 widthConnectors = 0.75)
LS0tCnRpdGxlOiAiRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gQW5hbHlzaXMgb2YgMSB2cyAyIGluIEwzLUw0IgphdXRob3I6IE5hc2lyIE1haG1vb2QgQWJiYXNpCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogICNybWRmb3JtYXRzOjpyZWFkdGhlZG93bgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCiMgMS4gbG9hZCBsaWJyYXJpZXMKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KFNldXJhdE9iamVjdCkKbGlicmFyeShTZXVyYXREYXRhKQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeShoYXJtb255KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShyZXRpY3VsYXRlKQpsaWJyYXJ5KEF6aW11dGgpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoUnRzbmUpCmxpYnJhcnkoaGFybW9ueSkKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoRW5oYW5jZWRWb2xjYW5vKQpgYGAKCiMgMi4gTG9hZCBTZXVyYXQgT2JqZWN0IApgYGB7ciBsb2FkX3NldXJhdCwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CgogbG9hZCgiL2hvbWUvYmlvaW5mby8wLWltcF9Sb2JqL0hhcm1vbnlfaW50ZWdyYXRlZF9BbGxfc2FtcGxlc19NZXJnZWRfd2l0aF9QQk1DMTB4X3dpdGhfaGFybW9ueV9jbHVzdGVyaW5nLlJvYmoiKQogCgpgYGAKCiMgMy4gSW5pdGlhbCBWaXN1YWxpemF0aW9uCmBgYHtyIGRhdGExLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIFNldElkZW50KEFsbF9zYW1wbGVzX01lcmdlZCwgdmFsdWUgPSAiSGFybW9ueV9zbm5fcmVzLjAuOSIpCiAgCgoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwgCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULAogICAgICAgIGxhYmVsID0gVCkKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLAogICAgICAgIGdyb3VwLmJ5ID0gIkhhcm1vbnlfc25uX3Jlcy4wLjkiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBUKQoKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBncm91cC5ieSA9ICJwcmVkaWN0ZWQuY2VsbHR5cGUubDIiLCAKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsCiAgICAgICAgbGFiZWwgPSBUKQoKIAp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkU0NUX3Nubl9yZXMuMC45KQoKYGBgCgojIDQuIFBlcmZvcm0gREUgYW5hbHlzaXMgCmBgYHtyIGRhdGEyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCiMgRmluZCBtYXJrZXJzIHVzaW5nIHRoZSBGaW5kTWFya2VycyBiZXR3ZWVuIDF2czIgYW5kIDZ2czE2IAoKCkFsbF9zYW1wbGVzX01lcmdlZCA8LSBTZXRJZGVudChBbGxfc2FtcGxlc19NZXJnZWQsIHZhbHVlID0gIlNDVF9zbm5fcmVzLjAuOSIpCgpDMV92c19DMiA8LSBGaW5kTWFya2VycyhBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKCiMgQ29udmVydCB0byBkYXRhIGZyYW1lIGFuZCBhZGQgZ2VuZSBuYW1lcyBhcyBhIG5ldyBjb2x1bW4KIEMxX3ZzX0MyIDwtIGFzLmRhdGEuZnJhbWUoQzFfdnNfQzIpCkMxX3ZzX0MyJGdlbmUgPC0gcm93bmFtZXMoQzFfdnNfQzIpCgojIFJlYXJyYW5naW5nIHRoZSBjb2x1bW5zIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkgKG9wdGlvbmFsKQpDMV92c19DMiA8LSBDMV92c19DMlssIGMoImdlbmUiLCAicF92YWwiLCAiYXZnX2xvZzJGQyIsICJwY3QuMSIsICJwY3QuMiIsICJwX3ZhbF9hZGoiKV0KCndyaXRlLmNzdihDMV92c19DMiwgIkMxX3ZzX0MyIiwgcm93Lm5hbWVzID0gRkFMU0UpCgoKYGBgCgojIyAgUGVyZm9ybSBERSBhbmFseXNpcyAKYGBge3IgZGF0YTMsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQoKIyBGaW5kIG1hcmtlcnMgdXNpbmcgdGhlIEZpbmRNYXJrZXJzIGJldHdlZW4gMXZzMiBhbmQgNnZzMTYgCgoKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIFNldElkZW50KEFsbF9zYW1wbGVzX01lcmdlZCwgdmFsdWUgPSAiU0NUX3Nubl9yZXMuMC45IikKCkM2X3ZzX0MxNiA8LSBGaW5kTWFya2VycyhBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IDE2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCgojIENvbnZlcnQgdG8gZGF0YSBmcmFtZSBhbmQgYWRkIGdlbmUgbmFtZXMgYXMgYSBuZXcgY29sdW1uCiBDNl92c19DMTYgPC0gYXMuZGF0YS5mcmFtZShDNl92c19DMTYpCkM2X3ZzX0MxNiRnZW5lIDwtIHJvd25hbWVzKEM2X3ZzX0MxNikKCiMgUmVhcnJhbmdpbmcgdGhlIGNvbHVtbnMgZm9yIGJldHRlciByZWFkYWJpbGl0eSAob3B0aW9uYWwpCkM2X3ZzX0MxNiA8LSBDNl92c19DMTZbLCBjKCJnZW5lIiwgInBfdmFsIiwgImF2Z19sb2cyRkMiLCAicGN0LjEiLCAicGN0LjIiLCAicF92YWxfYWRqIildCgp3cml0ZS5jc3YoQzZfdnNfQzE2LCAiQzZfdnNfQzE2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCgoKYGBgCgo1LiBWb2xjYW5vIFBsb3QtQzF2c0MyCmBgYHtyIGVuaGFuY2VkViwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTJ9CgpFbmhhbmNlZFZvbGNhbm8oQzFfdnNfQzIgLCAKICAgICAgICAgICAgICAgIGxhYj1yb3duYW1lcyhDMV92c19DMiksCiAgICAgICAgICAgICAgICB4ID0iYXZnX2xvZzJGQyIsIAogICAgICAgICAgICAgICAgeSA9InBfdmFsX2FkaiIsCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJDMV92c19DMiIsCiAgICAgICAgICAgICAgICBwQ3V0b2ZmID0gMC4wNSwKICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMSwgCiAgICAgICAgICAgICAgICBsZWdlbmRQb3NpdGlvbiA9ICdyaWdodCcsIAogICAgICAgICAgICAgICAgbGFiQ29sID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgIGxhYkZhY2UgPSAnYm9sZCcsCiAgICAgICAgICAgICAgICBib3hlZExhYmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICBwb2ludFNpemUgPSAzLjAsCiAgICAgICAgICAgICAgICBsYWJTaXplID0gNS4wLCAKICAgICAgICAgICAgICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgICAgICAgICAgICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMjUpCgojIEVuaGFuY2VkVm9sY2FubyhQYXRpZW50X2NlbGxfbGluZXNfdnNfUEJNQ19UY2VsbHMgLCAKIyAgICAgICAgICAgICAgICAgbGFiPXJvd25hbWVzKFBhdGllbnRfY2VsbF9saW5lc192c19QQk1DX1RjZWxscyksCiMgICAgICAgICAgICAgICAgIHggPSJhdmdfbG9nMkZDIiwgCiMgICAgICAgICAgICAgICAgIHkgPSJwX3ZhbF9hZGoiLAojICAgICAgICAgICAgICAgICBzZWxlY3RMYWIgPSBjKCdFUENBTScsJ0JDQVQxJywnS0lSM0RMMicsCiMgICAgICAgJ0ZPWE0xJywnVFdJU1QxJywnVE5GU0Y5JywnQ0Q4MCcsJ0NENycsJ0lMMUInLCAnVFJCVjcuNicsJ1RSQlY1LjQnLCdUUkJWMTIuNCcpLAojICAgICAgICAgICAgICAgICB0aXRsZSA9ICJTw6l6YXJ5IENlbGwgTGluZXMgdnMgUEJNQyBUIGNlbGxzIiwKIyAgICAgICAgICAgICAgICAgIHhsYWIgPSBicXVvdGUofkxvZ1syXX4gJ2ZvbGQgY2hhbmdlJyksCiMgICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjA1LAojICAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEsIAojICAgICAgICAgICAgICAgICBsZWdlbmRQb3NpdGlvbiA9ICdyaWdodCcsIAojICAgICAgICAgICAgICAgICBsZWdlbmRMYWJTaXplID0gMTQsCiMgICAgICAgICAgICAgICAgIGxlZ2VuZEljb25TaXplID0gNC4wLAojICAgICAgICAgICAgICAgICBsYWJDb2wgPSAnYmxhY2snLAojICAgICAgICAgICAgICAgICBsYWJGYWNlID0gJ2JvbGQnLAojICAgICAgICAgICAgICAgICBib3hlZExhYmVscyA9IFRSVUUsCiMgICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwKIyAgICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDUuMCwgCiMgICAgICAgICAgICAgICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKIyAgICAgICAgICAgICAgICAgd2lkdGhDb25uZWN0b3JzID0gMC43NSwKIyAgICAgICAgICAgICAgICAgY29sQ29ubmVjdG9ycyA9ICdibGFjaycpCgoKRW5oYW5jZWRWb2xjYW5vKEMxX3ZzX0MyLCAKICAgICAgICAgICAgICAgIGxhYiA9IGlmZWxzZShDMV92c19DMiRhdmdfbG9nMkZDID4gMSAmIEMxX3ZzX0MyJHBfdmFsX2FkaiA8IDAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd25hbWVzKEMxX3ZzX0MyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpLCAgIyBMYWJlbCBvbmx5IHNpZ25pZmljYW50IGdlbmVzCiAgICAgICAgICAgICAgICB4ID0gImF2Z19sb2cyRkMiLCAKICAgICAgICAgICAgICAgIHkgPSAicF92YWxfYWRqIiwKICAgICAgICAgICAgICAgIHRpdGxlID0gIkMxX3ZzX0MyIiwKICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjA1LAogICAgICAgICAgICAgICAgRkNjdXRvZmYgPSAxLCAKICAgICAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uID0gJ3JpZ2h0JywgCiAgICAgICAgICAgICAgICBsYWJDb2wgPSAnYmxhY2snLAogICAgICAgICAgICAgICAgbGFiRmFjZSA9ICdib2xkJywKICAgICAgICAgICAgICAgIGJveGVkTGFiZWxzID0gVFJVRSwKICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwKICAgICAgICAgICAgICAgIGxhYlNpemUgPSA1LjAsIAogICAgICAgICAgICAgICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgICAgICAgICAgICAgd2lkdGhDb25uZWN0b3JzID0gMC4yNSkKCkVuaGFuY2VkVm9sY2FubyhDMV92c19DMiwgCiAgICAgICAgICAgICAgICBsYWIgPSBpZmVsc2UoKEMxX3ZzX0MyJGF2Z19sb2cyRkMgPiAxLjUgfCBDMV92c19DMiRhdmdfbG9nMkZDIDwgLTEuNSkgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMV92c19DMiRwX3ZhbF9hZGogPCAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhDMV92c19DMiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKSwgICMgTGFiZWwgb25seSBzaWduaWZpY2FudCBnZW5lcwogICAgICAgICAgICAgICAgeCA9ICJhdmdfbG9nMkZDIiwgCiAgICAgICAgICAgICAgICB5ID0gInBfdmFsX2FkaiIsCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJDMV92c19DMiIsCiAgICAgICAgICAgICAgICBwQ3V0b2ZmID0gMC4wNSwKICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMSwgCiAgICAgICAgICAgICAgICBsZWdlbmRQb3NpdGlvbiA9ICdyaWdodCcsIAogICAgICAgICAgICAgICAgbGFiQ29sID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgIGxhYkZhY2UgPSAnYm9sZCcsCiAgICAgICAgICAgICAgICBib3hlZExhYmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICBwb2ludFNpemUgPSAzLjAsCiAgICAgICAgICAgICAgICBsYWJTaXplID0gNS4wLCAKICAgICAgICAgICAgICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgICAgICAgICAgICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMjUpCgoKIyBBbGxfc2FtcGxlc19NZXJnZWQgPC0gU2V0SWRlbnQoQWxsX3NhbXBsZXNfTWVyZ2VkLCB2YWx1ZSA9ICJTQ1Rfc25uX3Jlcy4wLjkiKQojIAojIEwyX1RoZXNob2xkcyA8LSBGaW5kTWFya2VycyhBbGxfc2FtcGxlc19NZXJnZWQsIGlkZW50LjEgPSAiNCIsIGlkZW50LjIgPSAiOSIsIG1pbi5wY3QgPSAwLjEwLCB0aHJlc2gudXNlID0gMC4yNSkKIyAKIyBFbmhhbmNlZFZvbGNhbm8oTDJfVGhlc2hvbGRzICwgCiMgICAgICAgICAgICAgICAgIGxhYj1yb3duYW1lcyhMMl9UaGVzaG9sZHMpLAojICAgICAgICAgICAgICAgICB4ID0iYXZnX2xvZzJGQyIsIAojICAgICAgICAgICAgICAgICB5ID0icF92YWxfYWRqIiwKIyAgICAgICAgICAgICAgICAgdGl0bGUgPSAiNF92c185IiwKIyAgICAgICAgICAgICAgICAgcEN1dG9mZiA9IDAuMDUsCiMgICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMSwgCiMgICAgICAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uID0gJ3JpZ2h0JywgCiMgICAgICAgICAgICAgICAgIGxhYkNvbCA9ICdibGFjaycsCiMgICAgICAgICAgICAgICAgIGxhYkZhY2UgPSAnYm9sZCcsCiMgICAgICAgICAgICAgICAgIGJveGVkTGFiZWxzID0gVFJVRSwKIyAgICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMy4wLAojICAgICAgICAgICAgICAgICBsYWJTaXplID0gMy4wLCAKIyAgICAgICAgICAgICAgICAgZHJhd0Nvbm5lY3RvcnMgPSBGQUxTRSwKIyAgICAgICAgICAgICAgICAgd2lkdGhDb25uZWN0b3JzID0gMC43NSkKCgoKYGBgCgoKIyMgQzZ2c0MxNgpgYGB7ciBlbmhhbmNlZFYyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCkVuaGFuY2VkVm9sY2FubyhDNl92c19DMTYgLCAKICAgICAgICAgICAgICAgIGxhYj1yb3duYW1lcyhDNl92c19DMTYpLAogICAgICAgICAgICAgICAgeCA9ImF2Z19sb2cyRkMiLCAKICAgICAgICAgICAgICAgIHkgPSJwX3ZhbF9hZGoiLAogICAgICAgICAgICAgICAgdGl0bGUgPSAiQzZfdnNfQzE2IiwKICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjA1LAogICAgICAgICAgICAgICAgRkNjdXRvZmYgPSAxLCAKICAgICAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uID0gJ3JpZ2h0JywgCiAgICAgICAgICAgICAgICBsYWJDb2wgPSAnYmxhY2snLAogICAgICAgICAgICAgICAgbGFiRmFjZSA9ICdib2xkJywKICAgICAgICAgICAgICAgIGJveGVkTGFiZWxzID0gVFJVRSwKICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwKICAgICAgICAgICAgICAgIGxhYlNpemUgPSA1LjAsIAogICAgICAgICAgICAgICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgICAgICAgICAgICAgd2lkdGhDb25uZWN0b3JzID0gMC4yNSkKCiMgRW5oYW5jZWRWb2xjYW5vKFBhdGllbnRfY2VsbF9saW5lc192c19QQk1DX1RjZWxscyAsIAojICAgICAgICAgICAgICAgICBsYWI9cm93bmFtZXMoUGF0aWVudF9jZWxsX2xpbmVzX3ZzX1BCTUNfVGNlbGxzKSwKIyAgICAgICAgICAgICAgICAgeCA9ImF2Z19sb2cyRkMiLCAKIyAgICAgICAgICAgICAgICAgeSA9InBfdmFsX2FkaiIsCiMgICAgICAgICAgICAgICAgIHNlbGVjdExhYiA9IGMoJ0VQQ0FNJywnQkNBVDEnLCdLSVIzREwyJywKIyAgICAgICAnRk9YTTEnLCdUV0lTVDEnLCdUTkZTRjknLCdDRDgwJywnQ0Q3JywnSUwxQicsICdUUkJWNy42JywnVFJCVjUuNCcsJ1RSQlYxMi40JyksCiMgICAgICAgICAgICAgICAgIHRpdGxlID0gIlPDqXphcnkgQ2VsbCBMaW5lcyB2cyBQQk1DIFQgY2VsbHMiLAojICAgICAgICAgICAgICAgICAgeGxhYiA9IGJxdW90ZSh+TG9nWzJdfiAnZm9sZCBjaGFuZ2UnKSwKIyAgICAgICAgICAgICAgICAgcEN1dG9mZiA9IDAuMDUsCiMgICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMSwgCiMgICAgICAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uID0gJ3JpZ2h0JywgCiMgICAgICAgICAgICAgICAgIGxlZ2VuZExhYlNpemUgPSAxNCwKIyAgICAgICAgICAgICAgICAgbGVnZW5kSWNvblNpemUgPSA0LjAsCiMgICAgICAgICAgICAgICAgIGxhYkNvbCA9ICdibGFjaycsCiMgICAgICAgICAgICAgICAgIGxhYkZhY2UgPSAnYm9sZCcsCiMgICAgICAgICAgICAgICAgIGJveGVkTGFiZWxzID0gVFJVRSwKIyAgICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMy4wLAojICAgICAgICAgICAgICAgICBsYWJTaXplID0gNS4wLCAKIyAgICAgICAgICAgICAgICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAojICAgICAgICAgICAgICAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjc1LAojICAgICAgICAgICAgICAgICBjb2xDb25uZWN0b3JzID0gJ2JsYWNrJykKCgpFbmhhbmNlZFZvbGNhbm8oQzZfdnNfQzE2LCAKICAgICAgICAgICAgICAgIGxhYiA9IGlmZWxzZShDNl92c19DMTYkYXZnX2xvZzJGQyA+IDEgJiBDNl92c19DMTYkcF92YWxfYWRqIDwgMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93bmFtZXMoQzZfdnNfQzE2KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpLCAgIyBMYWJlbCBvbmx5IHNpZ25pZmljYW50IGdlbmVzCiAgICAgICAgICAgICAgICB4ID0gImF2Z19sb2cyRkMiLCAKICAgICAgICAgICAgICAgIHkgPSAicF92YWxfYWRqIiwKICAgICAgICAgICAgICAgIHRpdGxlID0gIkM2X3ZzX0MxNiIsCiAgICAgICAgICAgICAgICBwQ3V0b2ZmID0gMC4wNSwKICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMSwgCiAgICAgICAgICAgICAgICBsZWdlbmRQb3NpdGlvbiA9ICdyaWdodCcsIAogICAgICAgICAgICAgICAgbGFiQ29sID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgIGxhYkZhY2UgPSAnYm9sZCcsCiAgICAgICAgICAgICAgICBib3hlZExhYmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICBwb2ludFNpemUgPSAzLjAsCiAgICAgICAgICAgICAgICBsYWJTaXplID0gNS4wLCAKICAgICAgICAgICAgICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgICAgICAgICAgICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMjUpCgpFbmhhbmNlZFZvbGNhbm8oQzZfdnNfQzE2LCAKICAgICAgICAgICAgICAgIGxhYiA9IGlmZWxzZSgoQzZfdnNfQzE2JGF2Z19sb2cyRkMgPiAxLjUgfCBDNl92c19DMTYkYXZnX2xvZzJGQyA8IC0xLjUpICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzZfdnNfQzE2JHBfdmFsX2FkaiA8IDAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd25hbWVzKEM2X3ZzX0MxNiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKSwgICMgTGFiZWwgb25seSBzaWduaWZpY2FudCBnZW5lcwogICAgICAgICAgICAgICAgeCA9ICJhdmdfbG9nMkZDIiwgCiAgICAgICAgICAgICAgICB5ID0gInBfdmFsX2FkaiIsCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJDNl92c19DMTYiLAogICAgICAgICAgICAgICAgcEN1dG9mZiA9IDAuMDUsCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEsIAogICAgICAgICAgICAgICAgbGVnZW5kUG9zaXRpb24gPSAncmlnaHQnLCAKICAgICAgICAgICAgICAgIGxhYkNvbCA9ICdibGFjaycsCiAgICAgICAgICAgICAgICBsYWJGYWNlID0gJ2JvbGQnLAogICAgICAgICAgICAgICAgYm94ZWRMYWJlbHMgPSBUUlVFLAogICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMy4wLAogICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDUuMCwgCiAgICAgICAgICAgICAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICAgICAgICAgICAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjI1KQoKCiMgQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIFNldElkZW50KEFsbF9zYW1wbGVzX01lcmdlZCwgdmFsdWUgPSAiU0NUX3Nubl9yZXMuMC45IikKIyAKIyBMMl9UaGVzaG9sZHMgPC0gRmluZE1hcmtlcnMoQWxsX3NhbXBsZXNfTWVyZ2VkLCBpZGVudC4xID0gIjQiLCBpZGVudC4yID0gIjkiLCBtaW4ucGN0ID0gMC4xMCwgdGhyZXNoLnVzZSA9IDAuMjUpCiMgCiMgRW5oYW5jZWRWb2xjYW5vKEwyX1RoZXNob2xkcyAsIAojICAgICAgICAgICAgICAgICBsYWI9cm93bmFtZXMoTDJfVGhlc2hvbGRzKSwKIyAgICAgICAgICAgICAgICAgeCA9ImF2Z19sb2cyRkMiLCAKIyAgICAgICAgICAgICAgICAgeSA9InBfdmFsX2FkaiIsCiMgICAgICAgICAgICAgICAgIHRpdGxlID0gIjRfdnNfOSIsCiMgICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjA1LAojICAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEsIAojICAgICAgICAgICAgICAgICBsZWdlbmRQb3NpdGlvbiA9ICdyaWdodCcsIAojICAgICAgICAgICAgICAgICBsYWJDb2wgPSAnYmxhY2snLAojICAgICAgICAgICAgICAgICBsYWJGYWNlID0gJ2JvbGQnLAojICAgICAgICAgICAgICAgICBib3hlZExhYmVscyA9IFRSVUUsCiMgICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwKIyAgICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDMuMCwgCiMgICAgICAgICAgICAgICAgIGRyYXdDb25uZWN0b3JzID0gRkFMU0UsCiMgICAgICAgICAgICAgICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuNzUpCgoKCmBgYAoK