#calling the libraries

library(DESeq2)
library(ggplot2)
#calling in the count matrix
counts_D1 <- read.delim("counts_D1", header = TRUE, row.names = 1)
#understanding the distribution of counts in the data set

total_counts_per_gene_D1 <- rowSums(counts_D1)

hist(total_counts_per_gene_D1, 
     breaks=100, 
     main="Distribution of Total Counts per Gene", 
     xlab="Total counts across all samples",
     ylab="Number of genes")

summary(total_counts_per_gene_D1)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      0       0       6    3657     191 3392661 
#ignoring low expressed gene to remove noise & get better results

counts_D1 <- counts_D1[which(rowSums(counts_D1) > 50), ]
#calling in the metadata
metadata_D1 <- read.csv("metadata_D1.csv", header = TRUE)
#rounding of the decimals, DeSeq2 cannot handle them -> creating the DeSeq2 object

counts_D1 <- round(counts_D1)
dds_D1 <- DESeqDataSetFromMatrix(countData = counts_D1,
                             colData = metadata_D1,        
                             design = ~Treatment)

dds_D1
class: DESeqDataSet 
dim: 25946 115 
metadata(1): version
assays(1): counts
rownames(25946): ENSG00000142611 ENSG00000157911 ... ENSG00000307722
  ENSG00000302039
rowData names(0):
colnames(115): SRR26115245 SRR26115246 ... SRR26115358 SRR26115359
colData names(2): Run Treatment
colData(dds_D1)
DataFrame with 115 rows and 2 columns
                    Run      Treatment
            <character>       <factor>
SRR26115245 SRR26115245 Osimertinib 6w
SRR26115246 SRR26115246 Osimertinib 6w
SRR26115247 SRR26115247 Osimertinib 6w
SRR26115248 SRR26115248 Osimertinib 6w
SRR26115249 SRR26115249 Osimertinib 6w
...                 ...            ...
SRR26115355 SRR26115355      Untreated
SRR26115356 SRR26115356      Untreated
SRR26115357 SRR26115357      Untreated
SRR26115358 SRR26115358      Untreated
SRR26115359 SRR26115359      Untreated
#THIS IS THE CORE ANALYSIS
dds_D1 <- DESeq(dds_D1) 

#Variance stabilizing transformation for visualization
vsdata_D1 <- vst(dds_D1, blind = TRUE) 

#plotting the PCA, got good results
plotPCA(vsdata_D1, intgroup = "Treatment") 


#results name
resultsNames(dds_D1) 
[1] "Intercept"                             "Treatment_Untreated_vs_Osimertinib.6w"
#Extracts the final DE genes
res_D1 <- results(dds_D1) 

#Summarizes results
summary(res_D1) 

out of 25946 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up)       : 6600, 25%
LFC < 0 (down)     : 8491, 33%
outliers [1]       : 0, 0%
low counts [2]     : 0, 0%
(mean count < 0)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results
#plotting the dispersion plot
plotDispEsts(dds_D1)

What the dispersion plot means for your analysis:

#getting the results name & making contrast
resultsNames(dds_D1)
[1] "Intercept"                             "Treatment_Untreated_vs_Osimertinib.6w"
res_D1 <- results(dds_D1, contrast = c("Treatment", "Osimertinib 6w", "Untreated"))
res_D1
log2 fold change (MLE): Treatment Osimertinib 6w vs Untreated 
Wald test p-value: Treatment Osimertinib 6w vs Untreated 
DataFrame with 25946 rows and 6 columns
                 baseMean log2FoldChange     lfcSE      stat      pvalue        padj
                <numeric>      <numeric> <numeric> <numeric>   <numeric>   <numeric>
ENSG00000142611  13.36936     -3.0607931 0.3574999 -8.561662 1.11252e-17 1.41082e-16
ENSG00000157911  30.48609      0.0808536 0.0623283  1.297222 1.94555e-01 2.78015e-01
ENSG00000142655  34.30945     -0.1170707 0.0508446 -2.302521 2.13058e-02 4.18186e-02
ENSG00000149527   9.25249     -0.3146144 0.3724180 -0.844788 3.98229e-01 4.97757e-01
ENSG00000171621  30.82709     -0.4951862 0.0967244 -5.119556 3.06255e-07 1.42993e-06
...                   ...            ...       ...       ...         ...         ...
ENSG00000298139  3.005739       1.161385  0.192194   6.04277 1.51488e-09 9.30636e-09
ENSG00000298153  0.418607       1.764653  0.399907   4.41266 1.02107e-05 3.85419e-05
ENSG00000298169 14.029668       0.606413  0.125423   4.83495 1.33176e-06 5.67202e-06
ENSG00000307722  0.623014      -1.751171  0.320955  -5.45613 4.86630e-08 2.50468e-07
ENSG00000302039  3.781707       0.249161  0.168233   1.48105 1.38594e-01 2.09750e-01
summary(res_D1)

out of 25946 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up)       : 8491, 33%
LFC < 0 (down)     : 6600, 25%
outliers [1]       : 0, 0%
low counts [2]     : 0, 0%
(mean count < 0)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results
library(apeglm)

#applying LFC shrinkage
res_shrunk_D1 <- lfcShrink(dds_D1, coef=2, type="apeglm")  # coef=2 is treatment effect

#significant genes from SHRUNKEN results
sig_overall_D1 <- res_shrunk_D1[which(res_shrunk_D1$padj < 0.05 & abs(res_shrunk_D1$log2FoldChange) > 1), ]

#the top & down regulated gene lists
top_up_D1 <- head(sig_overall_D1[sig_overall_D1$log2FoldChange > 1,][order(sig_overall_D1[sig_overall_D1$log2FoldChange > 1,]$padj),], 10)
top_down_D1 <- head(sig_overall_D1[sig_overall_D1$log2FoldChange < -1,][order(sig_overall_D1[sig_overall_D1$log2FoldChange < -1,]$padj),], 10)

#Export the results
write.csv(as.data.frame(res_shrunk_D1), "D1_full_results.csv")
write.csv(sig_overall_D1, "significant_genes_D1.csv")
write.csv(counts(dds_D1, normalized=TRUE), "normalized_counts_D1.csv")
write.csv(assay(vsdata_D1), "vst_data_D1.csv")

Visualization Plots

Pathway Analysis

# Gene Ontology Analysis
BiocManager::install("clusterProfiler")
Update all/some/none? [a/s/n]: 
a
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/cli_3.6.5.zip'
Content type 'application/zip' length 1402276 bytes (1.3 MB)
downloaded 1.3 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/jsonlite_2.0.0.zip'
Content type 'application/zip' length 1109640 bytes (1.1 MB)
downloaded 1.1 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/rlang_1.1.6.zip'
Content type 'application/zip' length 1629108 bytes (1.6 MB)
downloaded 1.6 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/xfun_0.52.zip'
Content type 'application/zip' length 607535 bytes (593 KB)
downloaded 593 KB
package ‘cli’ successfully unpacked and MD5 sums checked
package ‘jsonlite’ successfully unpacked and MD5 sums checked
package ‘rlang’ successfully unpacked and MD5 sums checked
package ‘xfun’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\aasth\AppData\Local\Temp\Rtmpm6j6Xe\downloaded_packages
library(clusterProfiler)
BiocManager::install("org.Hs.eg.db")
Update all/some/none? [a/s/n]: 
a
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/cli_3.6.5.zip'
Content type 'application/zip' length 1402276 bytes (1.3 MB)
downloaded 1.3 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/jsonlite_2.0.0.zip'
Content type 'application/zip' length 1109640 bytes (1.1 MB)
downloaded 1.1 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/rlang_1.1.6.zip'
Content type 'application/zip' length 1629108 bytes (1.6 MB)
downloaded 1.6 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/xfun_0.52.zip'
Content type 'application/zip' length 607535 bytes (593 KB)
downloaded 593 KB
package ‘cli’ successfully unpacked and MD5 sums checked
package ‘jsonlite’ successfully unpacked and MD5 sums checked
package ‘rlang’ successfully unpacked and MD5 sums checked
package ‘xfun’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\aasth\AppData\Local\Temp\Rtmpm6j6Xe\downloaded_packages
library(org.Hs.eg.db)

# Get significant upregulated genes (potential resistance mechanisms)
up_genes_D1 <- rownames(res_shrunk_D1[res_shrunk_D1$log2FoldChange > 1 & 
                               res_shrunk_D1$padj < 0.05 & 
                               !is.na(res_shrunk_D1$padj), ])

# Get significant downregulated genes (potential targets)
down_genes_D1 <- rownames(res_shrunk_D1[res_shrunk_D1$log2FoldChange < -1 & 
                                 res_shrunk_D1$padj < 0.05 & 
                                 !is.na(res_shrunk_D1$padj), ])

# GO enrichment for upregulated genes
go_up_D1 <- enrichGO(gene = up_genes_D1,
                 OrgDb = org.Hs.eg.db,
                 keyType = "ENSEMBL",
                 ont = "BP",
                 pAdjustMethod = "BH",
                 pvalueCutoff = 0.05)

dotplot(go_up_D1, showCategory = 15, title = "Upregulated Pathways")


# GO enrichment for downregulated genes  
go_down_D1 <- enrichGO(gene = down_genes_D1,
                   OrgDb = org.Hs.eg.db,
                   keyType = "ENSEMBL", 
                   ont = "BP",
                   pAdjustMethod = "BH",
                   pvalueCutoff = 0.05)

dotplot(go_down_D1, showCategory = 15, title = "Downregulated Pathways")

GSEA Analysis (Gene Set Enrichment Analysis)

# Prepare ranked gene list for GSEA
BiocManager::install("fgsea")
Update all/some/none? [a/s/n]: 
a
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/cli_3.6.5.zip'
Content type 'application/zip' length 1402276 bytes (1.3 MB)
downloaded 1.3 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/jsonlite_2.0.0.zip'
Content type 'application/zip' length 1109640 bytes (1.1 MB)
downloaded 1.1 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/rlang_1.1.6.zip'
Content type 'application/zip' length 1629108 bytes (1.6 MB)
downloaded 1.6 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/xfun_0.52.zip'
Content type 'application/zip' length 607535 bytes (593 KB)
downloaded 593 KB
package ‘cli’ successfully unpacked and MD5 sums checked
package ‘jsonlite’ successfully unpacked and MD5 sums checked
package ‘rlang’ successfully unpacked and MD5 sums checked
package ‘xfun’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\aasth\AppData\Local\Temp\Rtmpm6j6Xe\downloaded_packages
BiocManager::install("msigdbr")
Update all/some/none? [a/s/n]: 
a
trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/cli_3.6.5.zip'
Content type 'application/zip' length 1402276 bytes (1.3 MB)
downloaded 1.3 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/jsonlite_2.0.0.zip'
Content type 'application/zip' length 1109640 bytes (1.1 MB)
downloaded 1.1 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/rlang_1.1.6.zip'
Content type 'application/zip' length 1629108 bytes (1.6 MB)
downloaded 1.6 MB

trying URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/xfun_0.52.zip'
Content type 'application/zip' length 607535 bytes (593 KB)
downloaded 593 KB
package ‘cli’ successfully unpacked and MD5 sums checked
package ‘jsonlite’ successfully unpacked and MD5 sums checked
package ‘rlang’ successfully unpacked and MD5 sums checked
package ‘xfun’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\aasth\AppData\Local\Temp\Rtmpm6j6Xe\downloaded_packages
library(fgsea)
library(msigdbr)

# Create ranked gene list (all genes, ranked by stat)
gene_ranks_D1 <- res_shrunk_D1$log2FoldChange
names(gene_ranks_D1) <- rownames(res_shrunk_D1)
gene_ranks_D1 <- gene_ranks_D1[!is.na(gene_ranks_D1)]
gene_ranks_D1 <- sort(gene_ranks_D1, decreasing = TRUE)

# Get Hallmark pathways
hallmark_sets_D1 <- msigdbr(species = "Homo sapiens", category = "H")
hallmark_list_D1 <- split(hallmark_sets_D1$ensembl_gene, hallmark_sets_D1$gs_name)

# Run GSEA
fgsea_results_D1 <- fgsea(pathways = hallmark_list_D1,
                      stats = gene_ranks_D1,
                      minSize = 15,
                      maxSize = 500,
                      nperm = 1000)

# View results
head(fgsea_results_D1[order(pval), ], 15)

# Plot top pathways
plotEnrichment(hallmark_list_D1[["HALLMARK_APOPTOSIS"]], gene_ranks_D1) + 
  labs(title = "Apoptosis Pathway")

LS0tDQp0aXRsZTogIkRFU2VxMiBBbmFseXNpcyAtIERhdGFzZXQgMSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQpgYGB7cn0NCiNjYWxsaW5nIHRoZSBsaWJyYXJpZXMNCg0KbGlicmFyeShERVNlcTIpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KYGBge3J9DQojY2FsbGluZyBpbiB0aGUgY291bnQgbWF0cml4DQpjb3VudHNfRDEgPC0gcmVhZC5kZWxpbSgiY291bnRzX0QxIiwgaGVhZGVyID0gVFJVRSwgcm93Lm5hbWVzID0gMSkNCg0KYGBgDQoNCmBgYHtyfQ0KI3VuZGVyc3RhbmRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBvZiBjb3VudHMgaW4gdGhlIGRhdGEgc2V0DQoNCnRvdGFsX2NvdW50c19wZXJfZ2VuZV9EMSA8LSByb3dTdW1zKGNvdW50c19EMSkNCg0KaGlzdCh0b3RhbF9jb3VudHNfcGVyX2dlbmVfRDEsIA0KICAgICBicmVha3M9MTAwLCANCiAgICAgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFRvdGFsIENvdW50cyBwZXIgR2VuZSIsIA0KICAgICB4bGFiPSJUb3RhbCBjb3VudHMgYWNyb3NzIGFsbCBzYW1wbGVzIiwNCiAgICAgeWxhYj0iTnVtYmVyIG9mIGdlbmVzIikNCnN1bW1hcnkodG90YWxfY291bnRzX3Blcl9nZW5lX0QxKQ0KYGBgDQoNCmBgYHtyfQ0KI2lnbm9yaW5nIGxvdyBleHByZXNzZWQgZ2VuZSB0byByZW1vdmUgbm9pc2UgJiBnZXQgYmV0dGVyIHJlc3VsdHMNCg0KY291bnRzX0QxIDwtIGNvdW50c19EMVt3aGljaChyb3dTdW1zKGNvdW50c19EMSkgPiA1MCksIF0NCmBgYA0KDQpgYGB7cn0NCiNjYWxsaW5nIGluIHRoZSBtZXRhZGF0YQ0KbWV0YWRhdGFfRDEgPC0gcmVhZC5jc3YoIm1ldGFkYXRhX0QxLmNzdiIsIGhlYWRlciA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQojcm91bmRpbmcgb2YgdGhlIGRlY2ltYWxzLCBEZVNlcTIgY2Fubm90IGhhbmRsZSB0aGVtIC0+IGNyZWF0aW5nIHRoZSBEZVNlcTIgb2JqZWN0DQoNCmNvdW50c19EMSA8LSByb3VuZChjb3VudHNfRDEpDQpkZHNfRDEgPC0gREVTZXFEYXRhU2V0RnJvbU1hdHJpeChjb3VudERhdGEgPSBjb3VudHNfRDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEgPSBtZXRhZGF0YV9EMSwgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ24gPSB+VHJlYXRtZW50KQ0KDQpkZHNfRDENCmNvbERhdGEoZGRzX0QxKQ0KDQojVEhJUyBJUyBUSEUgQ09SRSBBTkFMWVNJUw0KZGRzX0QxIDwtIERFU2VxKGRkc19EMSkgDQoNCiNWYXJpYW5jZSBzdGFiaWxpemluZyB0cmFuc2Zvcm1hdGlvbiBmb3IgdmlzdWFsaXphdGlvbg0KdnNkYXRhX0QxIDwtIHZzdChkZHNfRDEsIGJsaW5kID0gVFJVRSkgDQoNCiNwbG90dGluZyB0aGUgUENBLCBnb3QgZ29vZCByZXN1bHRzDQpwbG90UENBKHZzZGF0YV9EMSwgaW50Z3JvdXAgPSAiVHJlYXRtZW50IikgDQoNCiNyZXN1bHRzIG5hbWUNCnJlc3VsdHNOYW1lcyhkZHNfRDEpIA0KDQojRXh0cmFjdHMgdGhlIGZpbmFsIERFIGdlbmVzDQpyZXNfRDEgPC0gcmVzdWx0cyhkZHNfRDEpIA0KDQojU3VtbWFyaXplcyByZXN1bHRzDQpzdW1tYXJ5KHJlc19EMSkgDQpgYGANCg0KYGBge3J9DQojcGxvdHRpbmcgdGhlIGRpc3BlcnNpb24gcGxvdA0KcGxvdERpc3BFc3RzKGRkc19EMSkNCmBgYA0KDQpXaGF0IHRoZSBkaXNwZXJzaW9uIHBsb3QgbWVhbnMgZm9yIHlvdXIgYW5hbHlzaXM6DQoNCi0gICBERVNlcTIncyBzdGF0aXN0aWNhbCBtb2RlbCBmaXRzIHlvdXIgZGF0YSB3ZWxsDQotICAgWW91ciBwLXZhbHVlcyBhbmQgZm9sZCBjaGFuZ2VzIGFyZSByZWxpYWJsZQ0KLSAgIE5vIG1ham9yIHRlY2huaWNhbCBpc3N1ZXMgb3IgYmF0Y2ggZWZmZWN0cw0KLSAgIEdvb2QgcXVhbGl0eSBSTkEtc2VxIGRhdGENCg0KYGBge3J9DQojZ2V0dGluZyB0aGUgcmVzdWx0cyBuYW1lICYgbWFraW5nIGNvbnRyYXN0DQpyZXN1bHRzTmFtZXMoZGRzX0QxKQ0KcmVzX0QxIDwtIHJlc3VsdHMoZGRzX0QxLCBjb250cmFzdCA9IGMoIlRyZWF0bWVudCIsICJPc2ltZXJ0aW5pYiA2dyIsICJVbnRyZWF0ZWQiKSkNCnJlc19EMQ0Kc3VtbWFyeShyZXNfRDEpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGFwZWdsbSkNCg0KI2FwcGx5aW5nIExGQyBzaHJpbmthZ2UNCnJlc19zaHJ1bmtfRDEgPC0gbGZjU2hyaW5rKGRkc19EMSwgY29lZj0yLCB0eXBlPSJhcGVnbG0iKSAgIyBjb2VmPTIgaXMgdHJlYXRtZW50IGVmZmVjdA0KDQojc2lnbmlmaWNhbnQgZ2VuZXMgZnJvbSBTSFJVTktFTiByZXN1bHRzDQpzaWdfb3ZlcmFsbF9EMSA8LSByZXNfc2hydW5rX0QxW3doaWNoKHJlc19zaHJ1bmtfRDEkcGFkaiA8IDAuMDUgJiBhYnMocmVzX3NocnVua19EMSRsb2cyRm9sZENoYW5nZSkgPiAxKSwgXQ0KDQojdGhlIHRvcCAmIGRvd24gcmVndWxhdGVkIGdlbmUgbGlzdHMNCnRvcF91cF9EMSA8LSBoZWFkKHNpZ19vdmVyYWxsX0QxW3NpZ19vdmVyYWxsX0QxJGxvZzJGb2xkQ2hhbmdlID4gMSxdW29yZGVyKHNpZ19vdmVyYWxsX0QxW3NpZ19vdmVyYWxsX0QxJGxvZzJGb2xkQ2hhbmdlID4gMSxdJHBhZGopLF0sIDEwKQ0KdG9wX2Rvd25fRDEgPC0gaGVhZChzaWdfb3ZlcmFsbF9EMVtzaWdfb3ZlcmFsbF9EMSRsb2cyRm9sZENoYW5nZSA8IC0xLF1bb3JkZXIoc2lnX292ZXJhbGxfRDFbc2lnX292ZXJhbGxfRDEkbG9nMkZvbGRDaGFuZ2UgPCAtMSxdJHBhZGopLF0sIDEwKQ0KDQojRXhwb3J0IHRoZSByZXN1bHRzDQp3cml0ZS5jc3YoYXMuZGF0YS5mcmFtZShyZXNfc2hydW5rX0QxKSwgIkQxX2Z1bGxfcmVzdWx0cy5jc3YiKQ0Kd3JpdGUuY3N2KHNpZ19vdmVyYWxsX0QxLCAic2lnbmlmaWNhbnRfZ2VuZXNfRDEuY3N2IikNCndyaXRlLmNzdihjb3VudHMoZGRzX0QxLCBub3JtYWxpemVkPVRSVUUpLCAibm9ybWFsaXplZF9jb3VudHNfRDEuY3N2IikNCndyaXRlLmNzdihhc3NheSh2c2RhdGFfRDEpLCAidnN0X2RhdGFfRDEuY3N2IikNCg0KYGBgDQoNClZpc3VhbGl6YXRpb24gUGxvdHMNCmBgYHtyfQ0KI01BIFBsb3QNCnBsb3RNQShyZXNfc2hydW5rX0QxLCB5bGltPWMoLTUsNSksIG1haW49Ik9zaW1lcnRpbmliIHZzIFVudHJlYXRlZCIpDQoNCiNWb2xjYW5vIFBsb3QNCkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJFbmhhbmNlZFZvbGNhbm8iKQ0KbGlicmFyeShFbmhhbmNlZFZvbGNhbm8pDQpFbmhhbmNlZFZvbGNhbm8ocmVzX3NocnVua19EMSwgbGFiID0gcm93bmFtZXMocmVzX3NocnVua19EMSksIA0KICAgICAgICAgICAgICAgIHggPSAnbG9nMkZvbGRDaGFuZ2UnLCB5ID0gJ3BhZGonLA0KICAgICAgICAgICAgICAgIHRpdGxlID0gJ09zaW1lcnRpbmliIDZ3IHZzIFVudHJlYXRlZCcpDQoNCiNIZWF0bWFwIG9mIHRvcCBnZW5lcw0KQmlvY01hbmFnZXI6Omluc3RhbGwoInBoZWF0bWFwIikNCmxpYnJhcnkocGhlYXRtYXApDQp0b3BfZ2VuZXNfRDEgPC0gaGVhZChvcmRlcihyZXNfc2hydW5rX0QxJHBhZGopLCA1MCkNCnBoZWF0bWFwKGFzc2F5KHZzZGF0YV9EMSlbdG9wX2dlbmVzX0QxLF0sIA0KICAgICAgICAgYW5ub3RhdGlvbl9jb2wgPSBhcy5kYXRhLmZyYW1lKGNvbERhdGEoZGRzX0QxKVssIlRyZWF0bWVudCIsIGRyb3A9RkFMU0VdKSwgDQogICAgICAgICBzY2FsZSA9ICJyb3ciLCANCiAgICAgICAgIHNob3dfcm93bmFtZXMgPSBGQUxTRSkNCmBgYA0KUGF0aHdheSBBbmFseXNpcw0KYGBge3J9DQojIEdlbmUgT250b2xvZ3kgQW5hbHlzaXMNCkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJjbHVzdGVyUHJvZmlsZXIiKQ0KbGlicmFyeShjbHVzdGVyUHJvZmlsZXIpDQpCaW9jTWFuYWdlcjo6aW5zdGFsbCgib3JnLkhzLmVnLmRiIikNCmxpYnJhcnkob3JnLkhzLmVnLmRiKQ0KDQojIEdldCBzaWduaWZpY2FudCB1cHJlZ3VsYXRlZCBnZW5lcyAocG90ZW50aWFsIHJlc2lzdGFuY2UgbWVjaGFuaXNtcykNCnVwX2dlbmVzX0QxIDwtIHJvd25hbWVzKHJlc19zaHJ1bmtfRDFbcmVzX3NocnVua19EMSRsb2cyRm9sZENoYW5nZSA+IDEgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfc2hydW5rX0QxJHBhZGogPCAwLjA1ICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKHJlc19zaHJ1bmtfRDEkcGFkaiksIF0pDQoNCiMgR2V0IHNpZ25pZmljYW50IGRvd25yZWd1bGF0ZWQgZ2VuZXMgKHBvdGVudGlhbCB0YXJnZXRzKQ0KZG93bl9nZW5lc19EMSA8LSByb3duYW1lcyhyZXNfc2hydW5rX0QxW3Jlc19zaHJ1bmtfRDEkbG9nMkZvbGRDaGFuZ2UgPCAtMSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3NocnVua19EMSRwYWRqIDwgMC4wNSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKHJlc19zaHJ1bmtfRDEkcGFkaiksIF0pDQoNCiMgR08gZW5yaWNobWVudCBmb3IgdXByZWd1bGF0ZWQgZ2VuZXMNCmdvX3VwX0QxIDwtIGVucmljaEdPKGdlbmUgPSB1cF9nZW5lc19EMSwNCiAgICAgICAgICAgICAgICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsDQogICAgICAgICAgICAgICAgIGtleVR5cGUgPSAiRU5TRU1CTCIsDQogICAgICAgICAgICAgICAgIG9udCA9ICJCUCIsDQogICAgICAgICAgICAgICAgIHBBZGp1c3RNZXRob2QgPSAiQkgiLA0KICAgICAgICAgICAgICAgICBwdmFsdWVDdXRvZmYgPSAwLjA1KQ0KDQpkb3RwbG90KGdvX3VwX0QxLCBzaG93Q2F0ZWdvcnkgPSAxNSwgdGl0bGUgPSAiVXByZWd1bGF0ZWQgUGF0aHdheXMiKQ0KDQojIEdPIGVucmljaG1lbnQgZm9yIGRvd25yZWd1bGF0ZWQgZ2VuZXMgIA0KZ29fZG93bl9EMSA8LSBlbnJpY2hHTyhnZW5lID0gZG93bl9nZW5lc19EMSwNCiAgICAgICAgICAgICAgICAgICBPcmdEYiA9IG9yZy5Icy5lZy5kYiwNCiAgICAgICAgICAgICAgICAgICBrZXlUeXBlID0gIkVOU0VNQkwiLCANCiAgICAgICAgICAgICAgICAgICBvbnQgPSAiQlAiLA0KICAgICAgICAgICAgICAgICAgIHBBZGp1c3RNZXRob2QgPSAiQkgiLA0KICAgICAgICAgICAgICAgICAgIHB2YWx1ZUN1dG9mZiA9IDAuMDUpDQoNCmRvdHBsb3QoZ29fZG93bl9EMSwgc2hvd0NhdGVnb3J5ID0gMTUsIHRpdGxlID0gIkRvd25yZWd1bGF0ZWQgUGF0aHdheXMiKQ0KYGBgDQoNCkdTRUEgQW5hbHlzaXMgKEdlbmUgU2V0IEVucmljaG1lbnQgQW5hbHlzaXMpDQpgYGB7cn0NCiMgUHJlcGFyZSByYW5rZWQgZ2VuZSBsaXN0IGZvciBHU0VBDQpCaW9jTWFuYWdlcjo6aW5zdGFsbCgiZmdzZWEiKQ0KQmlvY01hbmFnZXI6Omluc3RhbGwoIm1zaWdkYnIiKQ0KbGlicmFyeShmZ3NlYSkNCmxpYnJhcnkobXNpZ2RicikNCg0KIyBDcmVhdGUgcmFua2VkIGdlbmUgbGlzdCAoYWxsIGdlbmVzLCByYW5rZWQgYnkgc3RhdCkNCmdlbmVfcmFua3NfRDEgPC0gcmVzX3NocnVua19EMSRsb2cyRm9sZENoYW5nZQ0KbmFtZXMoZ2VuZV9yYW5rc19EMSkgPC0gcm93bmFtZXMocmVzX3NocnVua19EMSkNCmdlbmVfcmFua3NfRDEgPC0gZ2VuZV9yYW5rc19EMVshaXMubmEoZ2VuZV9yYW5rc19EMSldDQpnZW5lX3JhbmtzX0QxIDwtIHNvcnQoZ2VuZV9yYW5rc19EMSwgZGVjcmVhc2luZyA9IFRSVUUpDQoNCiMgR2V0IEhhbGxtYXJrIHBhdGh3YXlzDQpoYWxsbWFya19zZXRzX0QxIDwtIG1zaWdkYnIoc3BlY2llcyA9ICJIb21vIHNhcGllbnMiLCBjYXRlZ29yeSA9ICJIIikNCmhhbGxtYXJrX2xpc3RfRDEgPC0gc3BsaXQoaGFsbG1hcmtfc2V0c19EMSRlbnNlbWJsX2dlbmUsIGhhbGxtYXJrX3NldHNfRDEkZ3NfbmFtZSkNCg0KIyBSdW4gR1NFQQ0KZmdzZWFfcmVzdWx0c19EMSA8LSBmZ3NlYShwYXRod2F5cyA9IGhhbGxtYXJrX2xpc3RfRDEsDQogICAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBnZW5lX3JhbmtzX0QxLA0KICAgICAgICAgICAgICAgICAgICAgIG1pblNpemUgPSAxNSwNCiAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplID0gNTAwLA0KICAgICAgICAgICAgICAgICAgICAgIG5wZXJtID0gMTAwMCkNCg0KIyBWaWV3IHJlc3VsdHMNCmhlYWQoZmdzZWFfcmVzdWx0c19EMVtvcmRlcihwdmFsKSwgXSwgMTUpDQoNCiMgUGxvdCB0b3AgcGF0aHdheXMNCnBsb3RFbnJpY2htZW50KGhhbGxtYXJrX2xpc3RfRDFbWyJIQUxMTUFSS19BUE9QVE9TSVMiXV0sIGdlbmVfcmFua3NfRDEpICsgDQogIGxhYnModGl0bGUgPSAiQXBvcHRvc2lzIFBhdGh3YXkiKQ0KYGBgDQoNCg==