3. Summarize Results
3.1 Summary Function
summarize_markers <- function(markers) {
num_pval0 <- sum(markers$p_val_adj == 0)
num_pval1 <- sum(markers$p_val_adj == 1)
num_significant <- sum(markers$p_val_adj < 0.05)
num_upregulated <- sum(markers$avg_log2FC > 1)
num_downregulated <- sum(markers$avg_log2FC < -1)
cat("Number of genes with p_val_adj = 0:", num_pval0, "\n")
cat("Number of genes with p_val_adj = 1:", num_pval1, "\n")
cat("Number of significant genes (p_val_adj < 0.05):", num_significant, "\n")
cat("Number of upregulated genes (avg_log2FC > 1):", num_upregulated, "\n")
cat("Number of downregulated genes (avg_log2FC < -1):", num_downregulated, "\n")
}
3.2 Summarize Markers1 (MAST with SCT Assay)
cat("Markers1 Summary (MAST with Batch Correction):\n")
Markers1 Summary (MAST with Batch Correction):
summarize_markers(markers_mast_SCT)
Number of genes with p_val_adj = 0: 74
Number of genes with p_val_adj = 1: 19337
Number of significant genes (p_val_adj < 0.05): 5615
Number of upregulated genes (avg_log2FC > 1): 15048
Number of downregulated genes (avg_log2FC < -1): 2281
3.3 Summary for Markers3 (MAST with RNA Assay)
cat("Markers3 Summary (MAST without Batch Correction):\n")
Markers3 Summary (MAST without Batch Correction):
summarize_markers(markers_mast_RNA)
Number of genes with p_val_adj = 0: 83
Number of genes with p_val_adj = 1: 26400
Number of significant genes (p_val_adj < 0.05): 9221
Number of upregulated genes (avg_log2FC > 1): 7334
Number of downregulated genes (avg_log2FC < -1): 15426
4. Volcano Plots for All Genes
4.1 Volcano Plot for MAST with SCT Assay
EnhancedVolcano(markers_mast_SCT,
lab = markers_mast_SCT$gene,
x = "avg_log2FC",
y = "p_val_adj",
title = "MAST with SCT assay (All Genes)",
pCutoff = 0.05,
FCcutoff = 1)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

4.2 Volcano Plot for MAST with SCT Assay
EnhancedVolcano(markers_mast_SCT,
lab = markers_mast_SCT$gene,
x = "avg_log2FC",
y = "p_val_adj",
selectLab = c('KIR3DL2', 'TOX', 'TWIST1', 'CD52', 'CCR4', 'IL2RA', 'CD7', 'DPP4', 'CCR7', 'GATA3', 'FOXP3', 'DNM3', 'NCR1', 'CD70', 'AIRE', 'PDCD1 (PD-1)', 'CD274 (PD-L1)'),
title = "Sézary CD4 T cells vs Normal CD4 T cells",
xlab = bquote(~Log[2]~ 'fold change'),
pCutoff = 0.0001,
FCcutoff = 1,
pointSize = 3.0,
labSize = 3.0,
boxedLabels = TRUE,
colAlpha = 0.5,
legendPosition = 'right',
legendLabSize = 10,
legendIconSize = 4.0,
drawConnectors = TRUE,
widthConnectors = 0.5,
colConnectors = 'black',
arrowheads = FALSE,
max.overlaps = 30)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

4.3 Volcano Plot for MAST with RNA Assay
EnhancedVolcano(markers_mast_RNA,
lab = markers_mast_RNA$gene,
x = "avg_log2FC",
y = "p_val_adj",
title = "MAST with RNA Assay (All Genes)",
pCutoff = 0.05,
FCcutoff = 1.0)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

4.4 Volcano Plot for MAST with RNA Assay
EnhancedVolcano(markers_mast_RNA,
lab = markers_mast_RNA$gene,
x = "avg_log2FC",
y = "p_val_adj",
selectLab = c('KIR3DL2', 'TOX', 'TWIST1', 'CD52', 'CCR4', 'IL2RA', 'CD7', 'DPP4', 'CCR7', 'GATA3', 'FOXP3', 'DNM3', 'NCR1', 'CD70', 'AIRE', 'PDCD1 (PD-1)', 'CD274 (PD-L1)'),
title = "Sézary CD4 T cells vs Normal CD4 T cells",
xlab = bquote(~Log[2]~ 'fold change'),
pCutoff = 0.0001,
FCcutoff = 1,
pointSize = 3.0,
labSize = 3.0,
boxedLabels = TRUE,
colAlpha = 0.5,
legendPosition = 'right',
legendLabSize = 10,
legendIconSize = 4.0,
drawConnectors = TRUE,
widthConnectors = 0.5,
colConnectors = 'black',
arrowheads = FALSE,
max.overlaps = 30)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

5. Filter and Summarize Results
5.1 Apply Expression Filter First
# Apply the expression filter first
markers_mast_SCT <- markers_mast_SCT %>%
filter(!(mean_expr_group1 < 0.2 & mean_expr_group2 < 0.2))
markers_mast_RNA <- markers_mast_RNA %>%
filter(!(mean_expr_group1 < 0.2 & mean_expr_group2 < 0.2))
5.1.1 Apply Additional Filters for Statistical Significance and Fold
Change
# Define filtering criteria
p_val_threshold <- 0.05
logfc_threshold <- 1
# Apply additional filters for markers_mast_batch
filtered_markers_mast_SCT <- markers_mast_SCT %>%
filter(p_val_adj < p_val_threshold & abs(avg_log2FC) > logfc_threshold)
# Apply additional filters for markers_mast_no_batch
filtered_markers_mast_RNA <- markers_mast_RNA %>%
filter(p_val_adj < p_val_threshold & abs(avg_log2FC) > logfc_threshold)
# Save filtered results
# write.csv(filtered_markers_mast_batch, file = "0-imp_Robj/1-MAST_with_batch_as_Covariate_filtered.csv", row.names = TRUE)
# write.csv(filtered_markers_wilcox, file = "0-imp_Robj/2-Wilcox_min.pct_logfcT-Default_filtered.csv", row.names = TRUE)
# write.csv(filtered_markers_mast_no_batch, file = "0-imp_Robj/3-MAST_without_batch_as_Covariate_filtered.csv", row.names = TRUE)
5.2 Summary Function
summarize_markers <- function(markers) {
num_pval0 <- sum(markers$p_val_adj == 0)
num_pval1 <- sum(markers$p_val_adj == 1)
num_significant <- sum(markers$p_val_adj < 0.05)
num_upregulated <- sum(markers$avg_log2FC > 1)
num_downregulated <- sum(markers$avg_log2FC < -1)
cat("Number of genes with p_val_adj = 0:", num_pval0, "\n")
cat("Number of genes with p_val_adj = 1:", num_pval1, "\n")
cat("Number of significant genes (p_val_adj < 0.05):", num_significant, "\n")
cat("Number of upregulated genes (avg_log2FC > 1):", num_upregulated, "\n")
cat("Number of downregulated genes (avg_log2FC < -1):", num_downregulated, "\n")
}
5.3 Summarize Markers1 (MAST with Batch Correction)
cat("Markers1 Summary (markers_mast_SCT):\n")
Markers1 Summary (markers_mast_SCT):
summarize_markers(filtered_markers_mast_SCT)
Number of genes with p_val_adj = 0: 35
Number of genes with p_val_adj = 1: 0
Number of significant genes (p_val_adj < 0.05): 2077
Number of upregulated genes (avg_log2FC > 1): 1956
Number of downregulated genes (avg_log2FC < -1): 121
5.4 Summarize Markers2 (markers_mast_RNA)
cat("Markers2 Summary (markers_mast_RNA):\n")
Markers2 Summary (markers_mast_RNA):
summarize_markers(filtered_markers_mast_RNA)
Number of genes with p_val_adj = 0: 16
Number of genes with p_val_adj = 1: 0
Number of significant genes (p_val_adj < 0.05): 1488
Number of upregulated genes (avg_log2FC > 1): 791
Number of downregulated genes (avg_log2FC < -1): 697
6. Visualization of Filtered Results
6.1 Volcano Plot for markers_mast_SCT
EnhancedVolcano(filtered_markers_mast_SCT,
lab = filtered_markers_mast_SCT$gene,
x = "avg_log2FC",
y = "p_val_adj",
title = "MAST with SCT assay (All Genes)",
pCutoff = 0.05,
FCcutoff = 1)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

6.2 Volcano Plot for MAST with SCT Assay
EnhancedVolcano(filtered_markers_mast_SCT,
lab = filtered_markers_mast_SCT$gene,
x = "avg_log2FC",
y = "p_val_adj",
selectLab = c('KIR3DL2', 'TOX', 'TWIST1', 'CD52', 'CCR4', 'IL2RA', 'CD7', 'DPP4', 'CCR7', 'GATA3', 'FOXP3', 'DNM3', 'NCR1', 'CD70', 'AIRE', 'PDCD1 (PD-1)', 'CD274 (PD-L1)'),
title = "Sézary CD4 T cells vs Normal CD4 T cells",
xlab = bquote(~Log[2]~ 'fold change'),
pCutoff = 0.0001,
FCcutoff = 1,
pointSize = 3.0,
labSize = 3.0,
boxedLabels = TRUE,
colAlpha = 0.5,
legendPosition = 'right',
legendLabSize = 10,
legendIconSize = 4.0,
drawConnectors = TRUE,
widthConnectors = 0.5,
colConnectors = 'black',
arrowheads = FALSE,
max.overlaps = 30)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

6.3 Volcano Plot for MAST with RNA Assay
EnhancedVolcano(filtered_markers_mast_RNA,
lab = filtered_markers_mast_RNA$gene,
x = "avg_log2FC",
y = "p_val_adj",
title = "MAST with RNA Assay (All Genes)",
pCutoff = 0.05,
FCcutoff = 1.0)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

6.4 Volcano Plot for MAST with RNA Assay
EnhancedVolcano(filtered_markers_mast_RNA,
lab = filtered_markers_mast_RNA$gene,
x = "avg_log2FC",
y = "p_val_adj",
selectLab = c('KIR3DL2', 'TOX', 'TWIST1', 'CD52', 'CCR4', 'IL2RA', 'CD7', 'DPP4', 'CCR7', 'GATA3', 'FOXP3', 'DNM3', 'NCR1', 'CD70', 'AIRE', 'PDCD1 (PD-1)', 'CD274 (PD-L1)'),
title = "Sézary CD4 T cells vs Normal CD4 T cells",
xlab = bquote(~Log[2]~ 'fold change'),
pCutoff = 0.0001,
FCcutoff = 1,
pointSize = 3.0,
labSize = 3.0,
boxedLabels = TRUE,
colAlpha = 0.5,
legendPosition = 'right',
legendLabSize = 10,
legendIconSize = 4.0,
drawConnectors = TRUE,
widthConnectors = 0.5,
colConnectors = 'black',
arrowheads = FALSE,
max.overlaps = 30)
Avis : One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...

LS0tCnRpdGxlOiAiRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gQW5hbHlzaXMgLSBGaWx0ZXJpbmcgYW5kIFZpc3VhbGl6YXRpb24oTUFTVCBvbiBTQ1QgYW5kIFJOQSIKYXV0aG9yOiBOYXNpciBNYWhtb29kIEFiYmFzaQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKLS0tCgojIDEuIExvYWQgTGlicmFyaWVzCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoRW5oYW5jZWRWb2xjYW5vKQpsaWJyYXJ5KHBoZWF0bWFwKQpsaWJyYXJ5KHRpYmJsZSkKYGBgCgojIDIuIExvYWQgRGF0YQojIyAyLjEgTG9hZCBDU1YgRmlsZXMgd2l0aCBNZWFuIEV4cHJlc3Npb24KYGBge3J9CgojIExvYWQgdGhlIENTViBmaWxlcyB3aXRoIG1lYW4gZXhwcmVzc2lvbiBkYXRhCm1hcmtlcnNfbWFzdF9TQ1QgPC0gcmVhZC5jc3YoIi4uLzAtcm9iai8xLU1BU1Rfd2l0aF9TQ1RfYmF0Y2hfcGF0aWVudF9jZWxsbGluZV9hc19Db3ZhcmlhdGVfd2l0aF9tZWFuRXhwcmVzc2lvbi5jc3YiLCByb3cubmFtZXMgPSAxKQoKbWFya2Vyc19tYXN0X1JOQSA8LSByZWFkLmNzdigiLi4vMC1yb2JqLzItTUFTVF93aXRoX1JOQV9iYXRjaF9wYXRpZW50X2NlbGxsaW5lX2FzX0NvdmFyaWF0ZV93aXRoX21lYW5FeHByZXNzaW9uLmNzdiIsIHJvdy5uYW1lcyA9IDEpCgpgYGAKCiMgMy4gU3VtbWFyaXplIFJlc3VsdHMKIyMgMy4xIFN1bW1hcnkgRnVuY3Rpb24KYGBge3J9CnN1bW1hcml6ZV9tYXJrZXJzIDwtIGZ1bmN0aW9uKG1hcmtlcnMpIHsKICBudW1fcHZhbDAgPC0gc3VtKG1hcmtlcnMkcF92YWxfYWRqID09IDApCiAgbnVtX3B2YWwxIDwtIHN1bShtYXJrZXJzJHBfdmFsX2FkaiA9PSAxKQogIG51bV9zaWduaWZpY2FudCA8LSBzdW0obWFya2VycyRwX3ZhbF9hZGogPCAwLjA1KQogIG51bV91cHJlZ3VsYXRlZCA8LSBzdW0obWFya2VycyRhdmdfbG9nMkZDID4gMSkKICBudW1fZG93bnJlZ3VsYXRlZCA8LSBzdW0obWFya2VycyRhdmdfbG9nMkZDIDwgLTEpCiAgCiAgY2F0KCJOdW1iZXIgb2YgZ2VuZXMgd2l0aCBwX3ZhbF9hZGogPSAwOiIsIG51bV9wdmFsMCwgIlxuIikKICBjYXQoIk51bWJlciBvZiBnZW5lcyB3aXRoIHBfdmFsX2FkaiA9IDE6IiwgbnVtX3B2YWwxLCAiXG4iKQogIGNhdCgiTnVtYmVyIG9mIHNpZ25pZmljYW50IGdlbmVzIChwX3ZhbF9hZGogPCAwLjA1KToiLCBudW1fc2lnbmlmaWNhbnQsICJcbiIpCiAgY2F0KCJOdW1iZXIgb2YgdXByZWd1bGF0ZWQgZ2VuZXMgKGF2Z19sb2cyRkMgPiAxKToiLCBudW1fdXByZWd1bGF0ZWQsICJcbiIpCiAgY2F0KCJOdW1iZXIgb2YgZG93bnJlZ3VsYXRlZCBnZW5lcyAoYXZnX2xvZzJGQyA8IC0xKToiLCBudW1fZG93bnJlZ3VsYXRlZCwgIlxuIikKfQoKYGBgCgojIyAzLjIgU3VtbWFyaXplIE1hcmtlcnMxIChNQVNUIHdpdGggU0NUIEFzc2F5KQpgYGB7cn0KY2F0KCJNYXJrZXJzMSBTdW1tYXJ5IChNQVNUIHdpdGggQmF0Y2ggQ29ycmVjdGlvbik6XG4iKQpzdW1tYXJpemVfbWFya2VycyhtYXJrZXJzX21hc3RfU0NUKQoKYGBgCgoKCiMjIDMuMyBTdW1tYXJ5IGZvciBNYXJrZXJzMyAoTUFTVCB3aXRoIFJOQSBBc3NheSkKYGBge3J9CmNhdCgiTWFya2VyczMgU3VtbWFyeSAoTUFTVCB3aXRob3V0IEJhdGNoIENvcnJlY3Rpb24pOlxuIikKc3VtbWFyaXplX21hcmtlcnMobWFya2Vyc19tYXN0X1JOQSkKYGBgCgoKCiMgNC4gVm9sY2FubyBQbG90cyBmb3IgQWxsIEdlbmVzCiMjIDQuMSBWb2xjYW5vIFBsb3QgZm9yIE1BU1Qgd2l0aCBTQ1QgQXNzYXkKYGBge3IsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMn0KRW5oYW5jZWRWb2xjYW5vKG1hcmtlcnNfbWFzdF9TQ1QsCiAgICAgICAgICAgICAgICBsYWIgPSBtYXJrZXJzX21hc3RfU0NUJGdlbmUsCiAgICAgICAgICAgICAgICB4ID0gImF2Z19sb2cyRkMiLAogICAgICAgICAgICAgICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgICAgICAgICAgICAgdGl0bGUgPSAiTUFTVCB3aXRoIFNDVCBhc3NheSAoQWxsIEdlbmVzKSIsCiAgICAgICAgICAgICAgICBwQ3V0b2ZmID0gMC4wNSwKICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMSkKYGBgCgojIyA0LjIgVm9sY2FubyBQbG90IGZvciBNQVNUIHdpdGggU0NUIEFzc2F5CmBgYHtyLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTJ9CkVuaGFuY2VkVm9sY2FubyhtYXJrZXJzX21hc3RfU0NULCAKICAgICAgICAgICAgICAgIGxhYiA9IG1hcmtlcnNfbWFzdF9TQ1QkZ2VuZSwKICAgICAgICAgICAgICAgIHggPSAiYXZnX2xvZzJGQyIsIAogICAgICAgICAgICAgICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgICAgICAgICAgICAgc2VsZWN0TGFiID0gYygnS0lSM0RMMicsICdUT1gnLCAnVFdJU1QxJywgJ0NENTInLCAnQ0NSNCcsICdJTDJSQScsICdDRDcnLCAnRFBQNCcsICdDQ1I3JywgJ0dBVEEzJywgJ0ZPWFAzJywgJ0ROTTMnLCAnTkNSMScsICdDRDcwJywgJ0FJUkUnLCAnUERDRDEgKFBELTEpJywgJ0NEMjc0IChQRC1MMSknKSwKICAgICAgICAgICAgICAgIHRpdGxlID0gIlPDqXphcnkgQ0Q0IFQgY2VsbHMgdnMgTm9ybWFsIENENCBUIGNlbGxzIiwKICAgICAgICAgICAgICAgIHhsYWIgPSBicXVvdGUofkxvZ1syXX4gJ2ZvbGQgY2hhbmdlJyksCiAgICAgICAgICAgICAgICBwQ3V0b2ZmID0gMC4wMDAxLAogICAgICAgICAgICAgICAgRkNjdXRvZmYgPSAxLCAKICAgICAgICAgICAgICAgIHBvaW50U2l6ZSA9IDMuMCwKICAgICAgICAgICAgICAgIGxhYlNpemUgPSAzLjAsCiAgICAgICAgICAgICAgICBib3hlZExhYmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICBjb2xBbHBoYSA9IDAuNSwKICAgICAgICAgICAgICAgIGxlZ2VuZFBvc2l0aW9uID0gJ3JpZ2h0JywKICAgICAgICAgICAgICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgICAgICAgICAgICAgIGxlZ2VuZEljb25TaXplID0gNC4wLAogICAgICAgICAgICAgICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgICAgICAgICAgICAgd2lkdGhDb25uZWN0b3JzID0gMC41LAogICAgICAgICAgICAgICAgY29sQ29ubmVjdG9ycyA9ICdibGFjaycsCiAgICAgICAgICAgICAgICBhcnJvd2hlYWRzID0gRkFMU0UsCiAgICAgICAgICAgICAgICBtYXgub3ZlcmxhcHMgPSAzMCkKCmBgYAoKIyMgNC4zIFZvbGNhbm8gUGxvdCBmb3IgTUFTVCB3aXRoIFJOQSBBc3NheQpgYGB7ciwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTEyfQpFbmhhbmNlZFZvbGNhbm8obWFya2Vyc19tYXN0X1JOQSwKICAgICAgICAgICAgICAgIGxhYiA9IG1hcmtlcnNfbWFzdF9STkEkZ2VuZSwKICAgICAgICAgICAgICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICAgICAgICAgICAgICB5ID0gInBfdmFsX2FkaiIsCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJNQVNUIHdpdGggUk5BIEFzc2F5IChBbGwgR2VuZXMpIiwKICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjA1LAogICAgICAgICAgICAgICAgRkNjdXRvZmYgPSAxLjApCmBgYAoKCiMjIDQuNCBWb2xjYW5vIFBsb3QgZm9yIE1BU1Qgd2l0aCBSTkEgQXNzYXkKYGBge3IsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMn0KRW5oYW5jZWRWb2xjYW5vKG1hcmtlcnNfbWFzdF9STkEsIAogICAgICAgICAgICAgICAgbGFiID0gbWFya2Vyc19tYXN0X1JOQSRnZW5lLAogICAgICAgICAgICAgICAgeCA9ICJhdmdfbG9nMkZDIiwgCiAgICAgICAgICAgICAgICB5ID0gInBfdmFsX2FkaiIsCiAgICAgICAgICAgICAgICBzZWxlY3RMYWIgPSBjKCdLSVIzREwyJywgJ1RPWCcsICdUV0lTVDEnLCAnQ0Q1MicsICdDQ1I0JywgJ0lMMlJBJywgJ0NENycsICdEUFA0JywgJ0NDUjcnLCAnR0FUQTMnLCAnRk9YUDMnLCAnRE5NMycsICdOQ1IxJywgJ0NENzAnLCAnQUlSRScsICdQRENEMSAoUEQtMSknLCAnQ0QyNzQgKFBELUwxKScpLAogICAgICAgICAgICAgICAgdGl0bGUgPSAiU8OpemFyeSBDRDQgVCBjZWxscyB2cyBOb3JtYWwgQ0Q0IFQgY2VsbHMiLAogICAgICAgICAgICAgICAgeGxhYiA9IGJxdW90ZSh+TG9nWzJdfiAnZm9sZCBjaGFuZ2UnKSwKICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjAwMDEsCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEsIAogICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMy4wLAogICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDMuMCwKICAgICAgICAgICAgICAgIGJveGVkTGFiZWxzID0gVFJVRSwKICAgICAgICAgICAgICAgIGNvbEFscGhhID0gMC41LAogICAgICAgICAgICAgICAgbGVnZW5kUG9zaXRpb24gPSAncmlnaHQnLAogICAgICAgICAgICAgICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgICAgICAgICAgICAgbGVnZW5kSWNvblNpemUgPSA0LjAsCiAgICAgICAgICAgICAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICAgICAgICAgICAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjUsCiAgICAgICAgICAgICAgICBjb2xDb25uZWN0b3JzID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgIGFycm93aGVhZHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcyA9IDMwKQoKYGBgCgojIDUuIEZpbHRlciBhbmQgU3VtbWFyaXplIFJlc3VsdHMKIyMgNS4xIEFwcGx5IEV4cHJlc3Npb24gRmlsdGVyIEZpcnN0CmBgYHtyfQojIEFwcGx5IHRoZSBleHByZXNzaW9uIGZpbHRlciBmaXJzdAptYXJrZXJzX21hc3RfU0NUIDwtIG1hcmtlcnNfbWFzdF9TQ1QgJT4lCiAgZmlsdGVyKCEobWVhbl9leHByX2dyb3VwMSA8IDAuMiAmIG1lYW5fZXhwcl9ncm91cDIgPCAwLjIpKQoKCm1hcmtlcnNfbWFzdF9STkEgPC0gbWFya2Vyc19tYXN0X1JOQSAlPiUKICBmaWx0ZXIoIShtZWFuX2V4cHJfZ3JvdXAxIDwgMC4yICYgbWVhbl9leHByX2dyb3VwMiA8IDAuMikpCgpgYGAKCiMjIDUuMS4xIEFwcGx5IEFkZGl0aW9uYWwgRmlsdGVycyBmb3IgU3RhdGlzdGljYWwgU2lnbmlmaWNhbmNlIGFuZCBGb2xkIENoYW5nZQpgYGB7cn0KIyBEZWZpbmUgZmlsdGVyaW5nIGNyaXRlcmlhCnBfdmFsX3RocmVzaG9sZCA8LSAwLjA1CmxvZ2ZjX3RocmVzaG9sZCA8LSAxCgojIEFwcGx5IGFkZGl0aW9uYWwgZmlsdGVycyBmb3IgbWFya2Vyc19tYXN0X2JhdGNoCmZpbHRlcmVkX21hcmtlcnNfbWFzdF9TQ1QgPC0gbWFya2Vyc19tYXN0X1NDVCAlPiUKICBmaWx0ZXIocF92YWxfYWRqIDwgcF92YWxfdGhyZXNob2xkICYgYWJzKGF2Z19sb2cyRkMpID4gbG9nZmNfdGhyZXNob2xkKQoKCgojIEFwcGx5IGFkZGl0aW9uYWwgZmlsdGVycyBmb3IgbWFya2Vyc19tYXN0X25vX2JhdGNoCmZpbHRlcmVkX21hcmtlcnNfbWFzdF9STkEgPC0gbWFya2Vyc19tYXN0X1JOQSAlPiUKICBmaWx0ZXIocF92YWxfYWRqIDwgcF92YWxfdGhyZXNob2xkICYgYWJzKGF2Z19sb2cyRkMpID4gbG9nZmNfdGhyZXNob2xkKQoKIyBTYXZlIGZpbHRlcmVkIHJlc3VsdHMKd3JpdGUuY3N2KGZpbHRlcmVkX21hcmtlcnNfbWFzdF9TQ1QsIGZpbGUgPSAiLi4vMC1yb2JqLzEtTUFTVF93aXRoX1NDVF9iYXRjaF9wYXRpZW50X2NlbGxsaW5lX2FzX0NvdmFyaWF0ZV9maWx0ZXJlZC5jc3YiLCByb3cubmFtZXMgPSBUUlVFKQp3cml0ZS5jc3YoZmlsdGVyZWRfbWFya2Vyc19tYXN0X1JOQSwgZmlsZSA9ICIuLi8wLXJvYmovMi1NQVNUX3dpdGhfUk5BX2JhdGNoX3BhdGllbnRfY2VsbGxpbmVfYXNfQ292YXJpYXRlX2ZpbHRlcmVkLmNzdiIsIHJvdy5uYW1lcyA9IFRSVUUpCmBgYAoKIyMgNS4yIFN1bW1hcnkgRnVuY3Rpb24KYGBge3J9CnN1bW1hcml6ZV9tYXJrZXJzIDwtIGZ1bmN0aW9uKG1hcmtlcnMpIHsKICBudW1fcHZhbDAgPC0gc3VtKG1hcmtlcnMkcF92YWxfYWRqID09IDApCiAgbnVtX3B2YWwxIDwtIHN1bShtYXJrZXJzJHBfdmFsX2FkaiA9PSAxKQogIG51bV9zaWduaWZpY2FudCA8LSBzdW0obWFya2VycyRwX3ZhbF9hZGogPCAwLjA1KQogIG51bV91cHJlZ3VsYXRlZCA8LSBzdW0obWFya2VycyRhdmdfbG9nMkZDID4gMSkKICBudW1fZG93bnJlZ3VsYXRlZCA8LSBzdW0obWFya2VycyRhdmdfbG9nMkZDIDwgLTEpCiAgCiAgY2F0KCJOdW1iZXIgb2YgZ2VuZXMgd2l0aCBwX3ZhbF9hZGogPSAwOiIsIG51bV9wdmFsMCwgIlxuIikKICBjYXQoIk51bWJlciBvZiBnZW5lcyB3aXRoIHBfdmFsX2FkaiA9IDE6IiwgbnVtX3B2YWwxLCAiXG4iKQogIGNhdCgiTnVtYmVyIG9mIHNpZ25pZmljYW50IGdlbmVzIChwX3ZhbF9hZGogPCAwLjA1KToiLCBudW1fc2lnbmlmaWNhbnQsICJcbiIpCiAgY2F0KCJOdW1iZXIgb2YgdXByZWd1bGF0ZWQgZ2VuZXMgKGF2Z19sb2cyRkMgPiAxKToiLCBudW1fdXByZWd1bGF0ZWQsICJcbiIpCiAgY2F0KCJOdW1iZXIgb2YgZG93bnJlZ3VsYXRlZCBnZW5lcyAoYXZnX2xvZzJGQyA8IC0xKToiLCBudW1fZG93bnJlZ3VsYXRlZCwgIlxuIikKfQpgYGAKCiMjIDUuMyBTdW1tYXJpemUgTWFya2VyczEgKE1BU1Qgd2l0aCBCYXRjaCBDb3JyZWN0aW9uKQpgYGB7cn0KY2F0KCJNYXJrZXJzMSBTdW1tYXJ5IChtYXJrZXJzX21hc3RfU0NUKTpcbiIpCnN1bW1hcml6ZV9tYXJrZXJzKGZpbHRlcmVkX21hcmtlcnNfbWFzdF9TQ1QpCmBgYAoKIyMgNS40IFN1bW1hcml6ZSBNYXJrZXJzMiAobWFya2Vyc19tYXN0X1JOQSkKYGBge3J9CmNhdCgiTWFya2VyczIgU3VtbWFyeSAobWFya2Vyc19tYXN0X1JOQSk6XG4iKQpzdW1tYXJpemVfbWFya2VycyhmaWx0ZXJlZF9tYXJrZXJzX21hc3RfUk5BKQpgYGAKCgojIDYuIFZpc3VhbGl6YXRpb24gb2YgRmlsdGVyZWQgUmVzdWx0cwojIyA2LjEgVm9sY2FubyBQbG90IGZvciBtYXJrZXJzX21hc3RfU0NUCmBgYHtyLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTJ9CkVuaGFuY2VkVm9sY2FubyhmaWx0ZXJlZF9tYXJrZXJzX21hc3RfU0NULAogICAgICAgICAgICAgICAgbGFiID0gZmlsdGVyZWRfbWFya2Vyc19tYXN0X1NDVCRnZW5lLAogICAgICAgICAgICAgICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgICAgICAgICAgICAgIHkgPSAicF92YWxfYWRqIiwKICAgICAgICAgICAgICAgIHRpdGxlID0gIk1BU1Qgd2l0aCBTQ1QgYXNzYXkgKEFsbCBHZW5lcykiLAogICAgICAgICAgICAgICAgcEN1dG9mZiA9IDAuMDUsCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEpCmBgYAoKCiMjIDYuMiBWb2xjYW5vIFBsb3QgZm9yIE1BU1Qgd2l0aCBTQ1QgQXNzYXkKYGBge3IsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMn0KRW5oYW5jZWRWb2xjYW5vKGZpbHRlcmVkX21hcmtlcnNfbWFzdF9TQ1QsIAogICAgICAgICAgICAgICAgbGFiID0gZmlsdGVyZWRfbWFya2Vyc19tYXN0X1NDVCRnZW5lLAogICAgICAgICAgICAgICAgeCA9ICJhdmdfbG9nMkZDIiwgCiAgICAgICAgICAgICAgICB5ID0gInBfdmFsX2FkaiIsCiAgICAgICAgICAgICAgICBzZWxlY3RMYWIgPSBjKCdLSVIzREwyJywgJ1RPWCcsICdUV0lTVDEnLCAnQ0Q1MicsICdDQ1I0JywgJ0lMMlJBJywgJ0NENycsICdEUFA0JywgJ0NDUjcnLCAnR0FUQTMnLCAnRk9YUDMnLCAnRE5NMycsICdOQ1IxJywgJ0NENzAnLCAnQUlSRScsICdQRENEMSAoUEQtMSknLCAnQ0QyNzQgKFBELUwxKScpLAogICAgICAgICAgICAgICAgdGl0bGUgPSAiU8OpemFyeSBDRDQgVCBjZWxscyB2cyBOb3JtYWwgQ0Q0IFQgY2VsbHMiLAogICAgICAgICAgICAgICAgeGxhYiA9IGJxdW90ZSh+TG9nWzJdfiAnZm9sZCBjaGFuZ2UnKSwKICAgICAgICAgICAgICAgIHBDdXRvZmYgPSAwLjAwMDEsCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEsIAogICAgICAgICAgICAgICAgcG9pbnRTaXplID0gMy4wLAogICAgICAgICAgICAgICAgbGFiU2l6ZSA9IDMuMCwKICAgICAgICAgICAgICAgIGJveGVkTGFiZWxzID0gVFJVRSwKICAgICAgICAgICAgICAgIGNvbEFscGhhID0gMC41LAogICAgICAgICAgICAgICAgbGVnZW5kUG9zaXRpb24gPSAncmlnaHQnLAogICAgICAgICAgICAgICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgICAgICAgICAgICAgbGVnZW5kSWNvblNpemUgPSA0LjAsCiAgICAgICAgICAgICAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICAgICAgICAgICAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjUsCiAgICAgICAgICAgICAgICBjb2xDb25uZWN0b3JzID0gJ2JsYWNrJywKICAgICAgICAgICAgICAgIGFycm93aGVhZHMgPSBGQUxTRSwKICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcyA9IDMwKQoKYGBgCgojIyA2LjMgVm9sY2FubyBQbG90IGZvciBNQVNUIHdpdGggUk5BIEFzc2F5CmBgYHtyLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTJ9CkVuaGFuY2VkVm9sY2FubyhmaWx0ZXJlZF9tYXJrZXJzX21hc3RfUk5BLAogICAgICAgICAgICAgICAgbGFiID0gZmlsdGVyZWRfbWFya2Vyc19tYXN0X1JOQSRnZW5lLAogICAgICAgICAgICAgICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgICAgICAgICAgICAgIHkgPSAicF92YWxfYWRqIiwKICAgICAgICAgICAgICAgIHRpdGxlID0gIk1BU1Qgd2l0aCBSTkEgQXNzYXkgKEFsbCBHZW5lcykiLAogICAgICAgICAgICAgICAgcEN1dG9mZiA9IDAuMDUsCiAgICAgICAgICAgICAgICBGQ2N1dG9mZiA9IDEuMCkKYGBgCgoKIyMgNi40IFZvbGNhbm8gUGxvdCBmb3IgTUFTVCB3aXRoIFJOQSBBc3NheQpgYGB7ciwgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTEyfQpFbmhhbmNlZFZvbGNhbm8oZmlsdGVyZWRfbWFya2Vyc19tYXN0X1JOQSwgCiAgICAgICAgICAgICAgICBsYWIgPSBmaWx0ZXJlZF9tYXJrZXJzX21hc3RfUk5BJGdlbmUsCiAgICAgICAgICAgICAgICB4ID0gImF2Z19sb2cyRkMiLCAKICAgICAgICAgICAgICAgIHkgPSAicF92YWxfYWRqIiwKICAgICAgICAgICAgICAgIHNlbGVjdExhYiA9IGMoJ0tJUjNETDInLCAnVE9YJywgJ1RXSVNUMScsICdDRDUyJywgJ0NDUjQnLCAnSUwyUkEnLCAnQ0Q3JywgJ0RQUDQnLCAnQ0NSNycsICdHQVRBMycsICdGT1hQMycsICdETk0zJywgJ05DUjEnLCAnQ0Q3MCcsICdBSVJFJywgJ1BEQ0QxIChQRC0xKScsICdDRDI3NCAoUEQtTDEpJyksCiAgICAgICAgICAgICAgICB0aXRsZSA9ICJTw6l6YXJ5IENENCBUIGNlbGxzIHZzIE5vcm1hbCBDRDQgVCBjZWxscyIsCiAgICAgICAgICAgICAgICB4bGFiID0gYnF1b3RlKH5Mb2dbMl1+ICdmb2xkIGNoYW5nZScpLAogICAgICAgICAgICAgICAgcEN1dG9mZiA9IDAuMDAwMSwKICAgICAgICAgICAgICAgIEZDY3V0b2ZmID0gMSwgCiAgICAgICAgICAgICAgICBwb2ludFNpemUgPSAzLjAsCiAgICAgICAgICAgICAgICBsYWJTaXplID0gMy4wLAogICAgICAgICAgICAgICAgYm94ZWRMYWJlbHMgPSBUUlVFLAogICAgICAgICAgICAgICAgY29sQWxwaGEgPSAwLjUsCiAgICAgICAgICAgICAgICBsZWdlbmRQb3NpdGlvbiA9ICdyaWdodCcsCiAgICAgICAgICAgICAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICAgICAgICAgICAgICBsZWdlbmRJY29uU2l6ZSA9IDQuMCwKICAgICAgICAgICAgICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgICAgICAgICAgICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuNSwKICAgICAgICAgICAgICAgIGNvbENvbm5lY3RvcnMgPSAnYmxhY2snLAogICAgICAgICAgICAgICAgYXJyb3doZWFkcyA9IEZBTFNFLAogICAgICAgICAgICAgICAgbWF4Lm92ZXJsYXBzID0gMzApCgpgYGAKCg==