Steven wanted to start looking at the methylome of the geoduck, so the script below is for aggregating all samples percent methylation information into a single (large) file. Since Emu is currently being strangled by PECAN, I’m doing this on my laptop with files I either had from other projects, or grabbed from Owl.

First the Day 10 stuff. Set my working directory and grab all the file names.

setwd("~/Documents/RobertsLab/DMRGraphs")
list.files(path = ".")
 [1] "DiffMethRegions.bed"           "DMR-Box-Plots.pdf"             "EPI-103-percmeth.bedgraph.txt" "EPI-104-percmeth.bedgraph.txt"
 [5] "EPI-111-percmeth.bedgraph.txt" "EPI-113-percmeth.bedgraph.txt" "EPI-119-percmeth.bedgraph.txt" "EPI-120-percmeth.bedgraph.txt"
 [9] "EPI-127-percmeth.bedgraph.txt" "EPI-128-percmeth.bedgraph.txt" "EPI-135-percmeth.bedgraph.txt" "EPI-136-percmeth.bedgraph.txt"
[13] "EPI-143-percmeth.bedgraph.txt" "EPI-145-percmeth.bedgraph.txt" "graphs.nb.html"                "graphs.Rmd"                   
[17] "rsconnect"                    

Start my fence with the first file, read it in and save it to my methCounts data table.

EPI_103_percmeth_bedgraph <- read_delim("~/Documents/RobertsLab/DMRGraphs/EPI-103-percmeth.bedgraph.txt", 
    "\t", escape_double = FALSE, col_names = FALSE, 
    col_types = cols(X4 = col_double()), 
    trim_ws = TRUE)
EPI_103_percmeth_bedgraph <- as.data.table(EPI_103_percmeth_bedgraph)
head(EPI_103_percmeth_bedgraph)
print(EPI_103_percmeth_bedgraph[7,])

Now I iterate over all the other files in the Day10 directory, merging them with the previous version of methCounts. I do two different merges, one that includes all loci, and one that includes only loci shared between samples. Minimum coverage to be included is 5x.


methCounts.all <- methCounts
methCounts.short <- methCounts


for(i in 2:length(sample.files))   {
  
  temp <- read_delim(paste0("~/Documents/RobertsLab/DMRGraphs/", sample.files[i]), 
    "\t", escape_double = FALSE, col_names = FALSE, 
    col_types = cols(X4 = col_double()), 
    trim_ws = TRUE)
  
  temp2 <- as.data.table(paste0(temp$X1, "-", temp$X2))
  temp2$X2 <- temp$X4
  colnames(temp2)[1] <- "loc"
  colnames(temp2)[2] <- substr(sample.files[i], 1, 7)
  
  methCounts.all <- merge(methCounts.all, temp2, by = "loc", all = TRUE)
  methCounts.short <- merge(methCounts.short, temp2, by = "loc")
}

Next I make a column of row means, for average methylation across sample animals.

Next I write the files to disk.


write.table(methCounts.all, file = "Day10-methcounts-all.csv", quote = FALSE, sep = ",", col.names = TRUE, row.names = FALSE)

write.table(methCounts.short, file = "Day10-methcounts-short.csv", quote = FALSE, sep = ",", col.names = TRUE, row.names = FALSE)

I do the same as above, but with Day 135 files.

Then Day 145 files.

Then I merge all the files into a single file and write it to disk.

LS0tCnRpdGxlOiAiQWdncmVnYXRpbmcgbWV0aHlsYXRpb24gcmF0aW8gYnkgbG9jaSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKU3RldmVuIHdhbnRlZCB0byBzdGFydCBsb29raW5nIGF0IHRoZSBtZXRoeWxvbWUgb2YgdGhlIGdlb2R1Y2ssIHNvIHRoZSBzY3JpcHQgYmVsb3cgaXMgZm9yIGFnZ3JlZ2F0aW5nIGFsbCBzYW1wbGVzIHBlcmNlbnQgbWV0aHlsYXRpb24gaW5mb3JtYXRpb24gaW50byBhIHNpbmdsZSAobGFyZ2UpIGZpbGUuIFNpbmNlIEVtdSBpcyBjdXJyZW50bHkgYmVpbmcgc3RyYW5nbGVkIGJ5IFBFQ0FOLCBJJ20gZG9pbmcgdGhpcyBvbiBteSBsYXB0b3Agd2l0aCBmaWxlcyBJIGVpdGhlciBoYWQgZnJvbSBvdGhlciBwcm9qZWN0cywgb3IgZ3JhYmJlZCBmcm9tIE93bC4KCkZpcnN0IHRoZSBEYXkgMTAgc3R1ZmYuIFNldCBteSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ3JhYiBhbGwgdGhlIGZpbGUgbmFtZXMuCgpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKQoKc2V0d2QoIn4vRG9jdW1lbnRzL1JvYmVydHNMYWIvRE1SR3JhcGhzIikKCnNhbXBsZS5maWxlcyA8LSBsaXN0LmZpbGVzKHBhdGggPSAiLiIsIHBhdHRlcm4gPSAiYmVkZ3JhcGgudHh0IikKCgpgYGAKClN0YXJ0IG15IGZlbmNlIHdpdGggdGhlIGZpcnN0IGZpbGUsIHJlYWQgaXQgaW4gYW5kIHNhdmUgaXQgdG8gbXkgbWV0aENvdW50cyBkYXRhIHRhYmxlLgoKYGBge3J9CgpFUElfMTAzX3BlcmNtZXRoX2JlZGdyYXBoIDwtIHJlYWRfZGVsaW0oIn4vRG9jdW1lbnRzL1JvYmVydHNMYWIvRE1SR3JhcGhzL0VQSS0xMDMtcGVyY21ldGguYmVkZ3JhcGgudHh0IiwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGNvbF9uYW1lcyA9IEZBTFNFLCAKICAgIGNvbF90eXBlcyA9IGNvbHMoWDQgPSBjb2xfZG91YmxlKCkpLCAKICAgIHRyaW1fd3MgPSBUUlVFKQoKRVBJXzEwM19wZXJjbWV0aF9iZWRncmFwaCA8LSBhcy5kYXRhLnRhYmxlKEVQSV8xMDNfcGVyY21ldGhfYmVkZ3JhcGgpCgpoZWFkKEVQSV8xMDNfcGVyY21ldGhfYmVkZ3JhcGgpCgpwcmludChFUElfMTAzX3BlcmNtZXRoX2JlZGdyYXBoWzcsXSkKCgoKbWV0aENvdW50cyA8LSAgYXMuZGF0YS50YWJsZShwYXN0ZTAoRVBJXzEwM19wZXJjbWV0aF9iZWRncmFwaCRYMSwgIi0iLCBFUElfMTAzX3BlcmNtZXRoX2JlZGdyYXBoJFgyKSkKbWV0aENvdW50cyRFUElfMTAzIDwtIEVQSV8xMDNfcGVyY21ldGhfYmVkZ3JhcGgkWDQKY29sbmFtZXMobWV0aENvdW50cylbMV0gPC0gImxvYyIKCmBgYAoKCgpOb3cgSSBpdGVyYXRlIG92ZXIgYWxsIHRoZSBvdGhlciBmaWxlcyBpbiB0aGUgRGF5MTAgZGlyZWN0b3J5LCBtZXJnaW5nIHRoZW0gd2l0aCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiBtZXRoQ291bnRzLiBJIGRvIHR3byBkaWZmZXJlbnQgbWVyZ2VzLCBvbmUgdGhhdCBpbmNsdWRlcyBhbGwgbG9jaSwgYW5kIG9uZSB0aGF0IGluY2x1ZGVzIG9ubHkgbG9jaSBzaGFyZWQgYmV0d2VlbiBzYW1wbGVzLiBNaW5pbXVtIGNvdmVyYWdlIHRvIGJlIGluY2x1ZGVkIGlzIDV4LiAKCmBgYHtyfQoKbWV0aENvdW50cy5hbGwgPC0gbWV0aENvdW50cwptZXRoQ291bnRzLnNob3J0IDwtIG1ldGhDb3VudHMKCgpmb3IoaSBpbiAyOmxlbmd0aChzYW1wbGUuZmlsZXMpKSAgIHsKICAKICB0ZW1wIDwtIHJlYWRfZGVsaW0ocGFzdGUwKCJ+L0RvY3VtZW50cy9Sb2JlcnRzTGFiL0RNUkdyYXBocy8iLCBzYW1wbGUuZmlsZXNbaV0pLCAKICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgY29sX25hbWVzID0gRkFMU0UsIAogICAgY29sX3R5cGVzID0gY29scyhYNCA9IGNvbF9kb3VibGUoKSksIAogICAgdHJpbV93cyA9IFRSVUUpCiAgCiAgdGVtcDIgPC0gYXMuZGF0YS50YWJsZShwYXN0ZTAodGVtcCRYMSwgIi0iLCB0ZW1wJFgyKSkKICB0ZW1wMiRYMiA8LSB0ZW1wJFg0CiAgY29sbmFtZXModGVtcDIpWzFdIDwtICJsb2MiCiAgY29sbmFtZXModGVtcDIpWzJdIDwtIHN1YnN0cihzYW1wbGUuZmlsZXNbaV0sIDEsIDcpCiAgCiAgbWV0aENvdW50cy5hbGwgPC0gbWVyZ2UobWV0aENvdW50cy5hbGwsIHRlbXAyLCBieSA9ICJsb2MiLCBhbGwgPSBUUlVFKQogIG1ldGhDb3VudHMuc2hvcnQgPC0gbWVyZ2UobWV0aENvdW50cy5zaG9ydCwgdGVtcDIsIGJ5ID0gImxvYyIpCn0KCmBgYAoKYGBge3J9CgpoZWFkKG1ldGhDb3VudHMuYWxsKQpoZWFkKG1ldGhDb3VudHMuc2hvcnQpCgpgYGAKCk5leHQgSSBtYWtlIGEgY29sdW1uIG9mIHJvdyBtZWFucywgZm9yIGF2ZXJhZ2UgbWV0aHlsYXRpb24gYWNyb3NzIHNhbXBsZSBhbmltYWxzLgoKYGBge3J9CgptZXRoQ291bnRzLmFsbCRNZWFucyA8LSByb3dNZWFucyhtZXRoQ291bnRzLmFsbFssMjoxM10sIG5hLnJtID0gVFJVRSkKbWV0aENvdW50cy5zaG9ydCRNZWFucyA8LSByb3dNZWFucyhtZXRoQ291bnRzLnNob3J0WywyOjEzXSwgbmEucm0gPSBUUlVFKQpgYGAKCk5leHQgSSB3cml0ZSB0aGUgZmlsZXMgdG8gZGlzay4gCgpgYGB7cn0KCndyaXRlLnRhYmxlKG1ldGhDb3VudHMuYWxsLCBmaWxlID0gIkRheTEwLW1ldGhjb3VudHMtYWxsLmNzdiIsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICIsIiwgY29sLm5hbWVzID0gVFJVRSwgcm93Lm5hbWVzID0gRkFMU0UpCgp3cml0ZS50YWJsZShtZXRoQ291bnRzLnNob3J0LCBmaWxlID0gIkRheTEwLW1ldGhjb3VudHMtc2hvcnQuY3N2IiwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIiwiLCBjb2wubmFtZXMgPSBUUlVFLCByb3cubmFtZXMgPSBGQUxTRSkKCmBgYAoKCkkgZG8gdGhlIHNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIERheSAxMzUgZmlsZXMuCgpgYGB7cn0KCnNldHdkKCJ+L0RvY3VtZW50cy9Sb2JlcnRzTGFiL0RheTEzNSIpCgpzYW1wbGUuZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gIi4iLCBwYXR0ZXJuID0gImJlZGdyYXBoIikKCkVQSV8xNTFfcGVyY21ldGhfYmVkZ3JhcGggPC0gcmVhZF9kZWxpbSgifi9Eb2N1bWVudHMvUm9iZXJ0c0xhYi9EYXkxMzUvRVBJLTE1MS1wZXJjbWV0aC5iZWRncmFwaCIsIAogICAgIlx0IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCBjb2xfbmFtZXMgPSBGQUxTRSwgCiAgICBjb2xfdHlwZXMgPSBjb2xzKFg0ID0gY29sX2RvdWJsZSgpKSwgCiAgICB0cmltX3dzID0gVFJVRSkKCkVQSV8xNTFfcGVyY21ldGhfYmVkZ3JhcGggPC0gYXMuZGF0YS50YWJsZShFUElfMTUxX3BlcmNtZXRoX2JlZGdyYXBoKQoKaGVhZChFUElfMTUxX3BlcmNtZXRoX2JlZGdyYXBoKQoKCkRheTEzNS5tZXRoQ291bnRzIDwtICBhcy5kYXRhLnRhYmxlKHBhc3RlMChFUElfMTUxX3BlcmNtZXRoX2JlZGdyYXBoJFgxLCAiLSIsIEVQSV8xNTFfcGVyY21ldGhfYmVkZ3JhcGgkWDIpKQpEYXkxMzUubWV0aENvdW50cyRFUElfMTUxIDwtIEVQSV8xNTFfcGVyY21ldGhfYmVkZ3JhcGgkWDQKY29sbmFtZXMoRGF5MTM1Lm1ldGhDb3VudHMpWzFdIDwtICJsb2MiCgpEYXkxMzUubWV0aENvdW50cy5hbGwgPC0gRGF5MTM1Lm1ldGhDb3VudHMKRGF5MTM1Lm1ldGhDb3VudHMuc2hvcnQgPC0gRGF5MTM1Lm1ldGhDb3VudHMKCgpmb3IoaSBpbiAyOmxlbmd0aChzYW1wbGUuZmlsZXMpKSAgIHsKICAKICB0ZW1wIDwtIHJlYWRfZGVsaW0ocGFzdGUwKCJ+L0RvY3VtZW50cy9Sb2JlcnRzTGFiL0RheTEzNS8iLCBzYW1wbGUuZmlsZXNbaV0pLCAKICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgY29sX25hbWVzID0gRkFMU0UsIAogICAgY29sX3R5cGVzID0gY29scyhYNCA9IGNvbF9kb3VibGUoKSksIAogICAgdHJpbV93cyA9IFRSVUUpCiAgCiAgdGVtcDIgPC0gYXMuZGF0YS50YWJsZShwYXN0ZTAodGVtcCRYMSwgIi0iLCB0ZW1wJFgyKSkKICB0ZW1wMiRYMiA8LSB0ZW1wJFg0CiAgY29sbmFtZXModGVtcDIpWzFdIDwtICJsb2MiCiAgY29sbmFtZXModGVtcDIpWzJdIDwtIHN1YnN0cihzYW1wbGUuZmlsZXNbaV0sIDEsIDcpCiAgCiAgRGF5MTM1Lm1ldGhDb3VudHMuYWxsIDwtIG1lcmdlKERheTEzNS5tZXRoQ291bnRzLmFsbCwgdGVtcDIsIGJ5ID0gImxvYyIsIGFsbCA9IFRSVUUpCiAgRGF5MTM1Lm1ldGhDb3VudHMuc2hvcnQgPC0gbWVyZ2UoRGF5MTM1Lm1ldGhDb3VudHMuc2hvcnQsIHRlbXAyLCBieSA9ICJsb2MiKQp9CgpEYXkxMzUubWV0aENvdW50cy5hbGwkTWVhbnMgPC0gcm93TWVhbnMoRGF5MTM1Lm1ldGhDb3VudHMuYWxsWywyOjEzXSwgbmEucm0gPSBUUlVFKQpEYXkxMzUubWV0aENvdW50cy5zaG9ydCRNZWFucyA8LSByb3dNZWFucyhEYXkxMzUubWV0aENvdW50cy5zaG9ydFssMjoxM10sIG5hLnJtID0gVFJVRSkKCndyaXRlLnRhYmxlKERheTEzNS5tZXRoQ291bnRzLmFsbCwgZmlsZSA9ICJEYXkxMzUtbWV0aGNvdW50cy1hbGwuY3N2IiwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIiwiLCBjb2wubmFtZXMgPSBUUlVFLCByb3cubmFtZXMgPSBGQUxTRSkKCndyaXRlLnRhYmxlKERheTEzNS5tZXRoQ291bnRzLnNob3J0LCBmaWxlID0gIkRheTEzNS1tZXRoY291bnRzLXNob3J0LmNzdiIsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICIsIiwgY29sLm5hbWVzID0gVFJVRSwgcm93Lm5hbWVzID0gRkFMU0UpCgpgYGAKCgpUaGVuIERheSAxNDUgZmlsZXMuCgpgYGB7cn0KCnNldHdkKCJ+L0RvY3VtZW50cy9Sb2JlcnRzTGFiL01ldGh5bG9tZS9EYXkxNDUiKQoKc2FtcGxlLmZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9ICIuIiwgcGF0dGVybiA9ICJiZWRncmFwaCIpCgpFUElfMTc1X3BlcmNtZXRoX2JlZGdyYXBoIDwtIHJlYWRfZGVsaW0oIn4vRG9jdW1lbnRzL1JvYmVydHNMYWIvTWV0aHlsb21lL0RheTE0NS9FUEktMTc1X3BlcmNtZXRoLmJlZGdyYXBoIiwgCiAgICAiXHQiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGNvbF9uYW1lcyA9IEZBTFNFLCAKICAgIGNvbF90eXBlcyA9IGNvbHMoWDQgPSBjb2xfZG91YmxlKCkpLCAKICAgIHRyaW1fd3MgPSBUUlVFKQoKRVBJXzE3NV9wZXJjbWV0aF9iZWRncmFwaCA8LSBhcy5kYXRhLnRhYmxlKEVQSV8xNzVfcGVyY21ldGhfYmVkZ3JhcGgpCgpoZWFkKEVQSV8xNzVfcGVyY21ldGhfYmVkZ3JhcGgpCgoKRGF5MTQ1Lm1ldGhDb3VudHMgPC0gIGFzLmRhdGEudGFibGUocGFzdGUwKEVQSV8xNzVfcGVyY21ldGhfYmVkZ3JhcGgkWDEsICItIiwgRVBJXzE3NV9wZXJjbWV0aF9iZWRncmFwaCRYMikpCkRheTE0NS5tZXRoQ291bnRzJEVQSV8xNzUgPC0gRVBJXzE3NV9wZXJjbWV0aF9iZWRncmFwaCRYNApjb2xuYW1lcyhEYXkxNDUubWV0aENvdW50cylbMV0gPC0gImxvYyIKCkRheTE0NS5tZXRoQ291bnRzLmFsbCA8LSBEYXkxNDUubWV0aENvdW50cwpEYXkxNDUubWV0aENvdW50cy5zaG9ydCA8LSBEYXkxNDUubWV0aENvdW50cwoKCmZvcihpIGluIDI6bGVuZ3RoKHNhbXBsZS5maWxlcykpICAgewogIAogIHRlbXAgPC0gcmVhZF9kZWxpbShwYXN0ZTAoIn4vRG9jdW1lbnRzL1JvYmVydHNMYWIvTWV0aHlsb21lL0RheTE0NS8iLCBzYW1wbGUuZmlsZXNbaV0pLCAKICAgICJcdCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgY29sX25hbWVzID0gRkFMU0UsIAogICAgY29sX3R5cGVzID0gY29scyhYNCA9IGNvbF9kb3VibGUoKSksIAogICAgdHJpbV93cyA9IFRSVUUpCiAgCiAgdGVtcDIgPC0gYXMuZGF0YS50YWJsZShwYXN0ZTAodGVtcCRYMSwgIi0iLCB0ZW1wJFgyKSkKICB0ZW1wMiRYMiA8LSB0ZW1wJFg0CiAgY29sbmFtZXModGVtcDIpWzFdIDwtICJsb2MiCiAgY29sbmFtZXModGVtcDIpWzJdIDwtIHN1YnN0cihzYW1wbGUuZmlsZXNbaV0sIDEsIDcpCiAgCiAgRGF5MTQ1Lm1ldGhDb3VudHMuYWxsIDwtIG1lcmdlKERheTE0NS5tZXRoQ291bnRzLmFsbCwgdGVtcDIsIGJ5ID0gImxvYyIsIGFsbCA9IFRSVUUpCiAgRGF5MTQ1Lm1ldGhDb3VudHMuc2hvcnQgPC0gbWVyZ2UoRGF5MTQ1Lm1ldGhDb3VudHMuc2hvcnQsIHRlbXAyLCBieSA9ICJsb2MiKQp9CgpEYXkxNDUubWV0aENvdW50cy5hbGwkTWVhbnMgPC0gcm93TWVhbnMoRGF5MTQ1Lm1ldGhDb3VudHMuYWxsWywyOjEzXSwgbmEucm0gPSBUUlVFKQpEYXkxNDUubWV0aENvdW50cy5zaG9ydCRNZWFucyA8LSByb3dNZWFucyhEYXkxNDUubWV0aENvdW50cy5zaG9ydFssMjoxM10sIG5hLnJtID0gVFJVRSkKCndyaXRlLnRhYmxlKERheTE0NS5tZXRoQ291bnRzLmFsbCwgZmlsZSA9ICJEYXkxNDUtbWV0aGNvdW50cy1hbGwuY3N2IiwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIiwiLCBjb2wubmFtZXMgPSBUUlVFLCByb3cubmFtZXMgPSBGQUxTRSkKCndyaXRlLnRhYmxlKERheTE0NS5tZXRoQ291bnRzLnNob3J0LCBmaWxlID0gIkRheTE0NS1tZXRoY291bnRzLXNob3J0LmNzdiIsIHF1b3RlID0gRkFMU0UsIHNlcCA9ICIsIiwgY29sLm5hbWVzID0gVFJVRSwgcm93Lm5hbWVzID0gRkFMU0UpCgpgYGAKCgpUaGVuIEkgbWVyZ2UgYWxsIHRoZSBmaWxlcyBpbnRvIGEgc2luZ2xlIGZpbGUgYW5kIHdyaXRlIGl0IHRvIGRpc2suIAoKCmBgYHtyfQpzZXR3ZCgifi9Eb2N1bWVudHMvUm9iZXJ0c0xhYi9NZXRoeWxvbWUvIikKCkRheTEwIDwtIHJlYWRfZGVsaW0oIn4vRG9jdW1lbnRzL1JvYmVydHNMYWIvTWV0aHlsb21lL0RheTEwLW1ldGhjb3VudHMtYWxsLmNzdiIsIAogICAgIiwiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGNvbF9uYW1lcyA9IFRSVUUsIAogICAgY29sX3R5cGVzID0gY29scyhYNCA9IGNvbF9kb3VibGUoKSksIAogICAgdHJpbV93cyA9IFRSVUUpCgpEYXkxMzUgPC0gcmVhZF9kZWxpbSgifi9Eb2N1bWVudHMvUm9iZXJ0c0xhYi9NZXRoeWxvbWUvRGF5MTM1LW1ldGhjb3VudHMtYWxsLmNzdiIsIAogICAgIiwiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGNvbF9uYW1lcyA9IFRSVUUsIAogICAgdHJpbV93cyA9IFRSVUUpCgpEYXkxNDUgPC0gcmVhZF9kZWxpbSgifi9Eb2N1bWVudHMvUm9iZXJ0c0xhYi9NZXRoeWxvbWUvRGF5MTQ1LW1ldGhjb3VudHMtYWxsLmNzdiIsIAogICAgIiwiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIGNvbF9uYW1lcyA9IFRSVUUsIAogICAgdHJpbV93cyA9IFRSVUUpCgpEYXkxMCA8LSBEYXkxMFssMToxM10KRGF5MTM1IDwtIERheTEzNVssMToxM10KRGF5MTQ1IDwtIERheTE0NVssMToyNV0KCkRheTEwXzEzNSA8LSBtZXJnZShEYXkxMCwgRGF5MTM1LCBieSA9ICJsb2MiLCBhbGwgPSBUUlVFKQpEYXkxMF8xMzVfMTQ1IDwtIG1lcmdlKERheTEwXzEzNSwgRGF5MTQ1LCBieSA9ICJsb2MiLCBhbGwgPSBUUlVFKQoKRGF5MTBfMTM1XzE0NSRNZWFucyA8LSByb3dNZWFucyhEYXkxMF8xMzVfMTQ1WywyOjUwXSwgbmEucm0gPSBUUlVFKQoKd3JpdGUudGFibGUoRGF5MTBfMTM1XzE0NSwgZmlsZSA9ICJEYXkxMF8xMzVfMTQ1LXBlcmNlbnQtbWV0aHlsYXRpb24uY3N2IiwgcXVvdGUgPSBGQUxTRSwgc2VwID0gIiwiLCBjb2wubmFtZXMgPSBUUlVFLCByb3cubmFtZXMgPSBGQUxTRSkKCmBgYAoKCgoKYGBge3J9CgoKCmBgYAoK