06_Computing OEM


OEM were calculated as in Hennion et al, 2020 and this number will be used as proxy for the changes in net initiation activity at mapped active Ori (04_Actives Ori)

suppressMessages(library(GenomicRanges))
suppressMessages(library(tidyverse))
suppressMessages(library(rtracklayer))
`%+%`<-paste0
seqinfSY <- readRDS("Data/seqinfSY.rds")
rDNA_SY <- GRanges("CP029160.1",IRanges(3879940,3934000),strand="*",seqinfo=seqinfSY)
maskedTy_SY <- readRDS("Data/maskedTy_SY.rds")

Importing forks

forksBY <- readRDS("Data/forks_BYBYSY.rds") %>%
    select(chrom=chromSY,direc,X0=X0nSY,X1=X1nSY,exp) %>%
    mutate(Rep=map_chr(exp,function(x) x %>% str_remove("BY_"))) %>%
    mutate(strain="BY")
forks_BYSY.gr<- with(forksBY, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),seqinfo=seqinfSY))
fBY <- forksBY %>% 
    mutate(Ty_filter=!overlapsAny(forks_BYSY.gr,maskedTy_SY)) %>%
    filter(Ty_filter)

forksSY <- readRDS("Data/forks_SYSY.rds") %>%
    select(chrom,direc,X0,X1,exp) %>%
    mutate(Rep=map_chr(exp,function(x) x %>% str_remove("SY_"))) %>%
    mutate(strain="SY")
forks_SYSY.gr<- with(forksSY, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),seqinfo=seqinfSY))
fSY <- forksSY %>% 
    mutate(Ty_filter=!overlapsAny(forks_SYSY.gr,maskedTy_SY)) %>%
    filter(Ty_filter)

Rearrange forks and create GenomicRanges

### creating GRanges
forkBY1 <- fBY %>% filter(Rep=="rep1")
forkBY1$fid <- 1:nrow(forkBY1)
forkBY1_R <- forkBY1 %>% filter(direc=="R")
forkBY1_L <- forkBY1 %>% filter(direc=="L")
forkBY1_R.gr<- with(forkBY1_R, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))
forkBY1_L.gr<- with(forkBY1_L, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))

forkBY2 <- fBY %>% filter(Rep=="rep2")
forkBY2$fid <- 1:nrow(forkBY2)
forkBY2_R <- forkBY2 %>% filter(direc=="R")
forkBY2_L <- forkBY2 %>% filter(direc=="L")
forkBY2_R.gr<- with(forkBY2_R, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))
forkBY2_L.gr<- with(forkBY2_L, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))

forkSY1 <- fSY %>% filter(Rep=="rep1")
forkSY1$fid <- 1:nrow(forkSY1)
forkSY1_R <- forkSY1 %>% filter(direc=="R")
forkSY1_L <- forkSY1 %>% filter(direc=="L")
forkSY1_R.gr<- with(forkSY1_R, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))
forkSY1_L.gr<- with(forkSY1_L, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))

forkSY2 <- fSY %>% filter(Rep=="rep2")
forkSY2$fid <- 1:nrow(forkSY2)
forkSY2_R <- forkSY2 %>% filter(direc=="R")
forkSY2_L <- forkSY2 %>% filter(direc=="L")
forkSY2_R.gr<- with(forkSY2_R, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))
forkSY2_L.gr<- with(forkSY2_L, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))

forkBY3 <- fBY %>% filter(Rep=="rep3")
forkBY3$fid <- 1:nrow(forkBY3)
forkBY3_R <- forkBY3 %>% filter(direc=="R")
forkBY3_L <- forkBY3 %>% filter(direc=="L")
forkBY3_R.gr<- with(forkBY3_R, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))
forkBY3_L.gr<- with(forkBY3_L, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))

forkSY3 <- fSY %>% filter(Rep=="rep3")
forkSY3$fid <- 1:nrow(forkSY3)
forkSY3_R <- forkSY3 %>% filter(direc=="R")
forkSY3_L <- forkSY3 %>% filter(direc=="L")
forkSY3_R.gr<- with(forkSY3_R, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))
forkSY3_L.gr<- with(forkSY3_L, GRanges(seqnames=chrom,ranges=IRanges(pmin(X0,X1),pmax(X0,X1)),strand=case_when(direc=="R"~"+",T~"-"),fid=fid,seqinfo=seqinfSY))

Computing coverages and OEM

outdir <- "BigFiles/BigWig/"
cvL <- coverage(forkSY1_L.gr)
cvR <- coverage(forkSY1_R.gr)
cvT <- cvL+cvR

cvLn <- cvL/cvT
cvRn <- cvR/cvT
cvLn[is.na(cvLn)] <- 0
cvRn[is.na(cvRn)] <- 0
win=10000
cvLs2 <- endoapply(cvLn, function(x) Rle(caTools::runmean(x,win,align="left",endrule="NA")))
oem2 <- endoapply(cvLs2, function(cv) c(Rle(rep(NA,(win))),cv)-c(cv,Rle(rep(NA,(win)))))
export(oem2,con=paste0(outdir,"SY1_oem_",win/1000,"k.bw"))

cvL <- coverage(forkSY2_L.gr)
cvR <- coverage(forkSY2_R.gr)
cvT <- cvL+cvR

cvLn <- cvL/cvT
cvRn <- cvR/cvT
cvLn[is.na(cvLn)] <- 0
cvRn[is.na(cvRn)] <- 0
win=10000
cvLs2 <- endoapply(cvLn, function(x) Rle(caTools::runmean(x,win,align="left",endrule="NA")))
oem2 <- endoapply(cvLs2, function(cv) c(Rle(rep(NA,(win))),cv)-c(cv,Rle(rep(NA,(win)))))
export(oem2,con=paste0(outdir,"SY2_oem_",win/1000,"k.bw"))

cvL <- coverage(forkSY3_L.gr)
cvR <- coverage(forkSY3_R.gr)
cvT <- cvL+cvR

cvLn <- cvL/cvT
cvRn <- cvR/cvT
cvLn[is.na(cvLn)] <- 0
cvRn[is.na(cvRn)] <- 0
win=10000
cvLs2 <- endoapply(cvLn, function(x) Rle(caTools::runmean(x,win,align="left",endrule="NA")))
oem2 <- endoapply(cvLs2, function(cv) c(Rle(rep(NA,(win))),cv)-c(cv,Rle(rep(NA,(win)))))
export(oem2,con=paste0(outdir,"SY3_oem_",win/1000,"k.bw"))

cvL <- coverage(forkBY1_L.gr)
cvR <- coverage(forkBY1_R.gr)
cvT <- cvL+cvR

cvLn <- cvL/cvT
cvRn <- cvR/cvT
cvLn[is.na(cvLn)] <- 0
cvRn[is.na(cvRn)] <- 0
win=10000
cvLs2 <- endoapply(cvLn, function(x) Rle(caTools::runmean(x,win,align="left",endrule="NA")))
oem2 <- endoapply(cvLs2, function(cv) c(Rle(rep(NA,(win))),cv)-c(cv,Rle(rep(NA,(win)))))
export(oem2,con=paste0(outdir,"BY1_oem_",win/1000,"k.bw"))

cvL <- coverage(forkBY2_L.gr)
cvR <- coverage(forkBY2_R.gr)
cvT <- cvL+cvR

cvLn <- cvL/cvT
cvRn <- cvR/cvT
cvLn[is.na(cvLn)] <- 0
cvRn[is.na(cvRn)] <- 0
win=10000
cvLs2 <- endoapply(cvLn, function(x) Rle(caTools::runmean(x,win,align="left",endrule="NA")))
oem2 <- endoapply(cvLs2, function(cv) c(Rle(rep(NA,(win))),cv)-c(cv,Rle(rep(NA,(win)))))
export(oem2,con=paste0(outdir,"BY2_oem_",win/1000,"k.bw"))

cvL <- coverage(forkBY3_L.gr)
cvR <- coverage(forkBY3_R.gr)
cvT <- cvL+cvR

cvLn <- cvL/cvT
cvRn <- cvR/cvT
cvLn[is.na(cvLn)] <- 0
cvRn[is.na(cvRn)] <- 0
win=10000
cvLs2 <- endoapply(cvLn, function(x) Rle(caTools::runmean(x,win,align="left",endrule="NA")))
oem2 <- endoapply(cvLs2, function(cv) c(Rle(rep(NA,(win))),cv)-c(cv,Rle(rep(NA,(win)))))
export(oem2,con=paste0(outdir,"BY3_oem_",win/1000,"k.bw"))
LS0tCnRpdGxlOiAiQllTWSBwcm9qZWN0IE5vdGVib29rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tICAKIyAwNl9Db21wdXRpbmcgT0VNICAKCioqKiAgCgpPRU0gd2VyZSBjYWxjdWxhdGVkIGFzIGluIFtIZW5uaW9uIGV0IGFsLCAyMDIwXShodHRwczovL2RvaS5vcmcvMTAuMTE4Ni9zMTMwNTktMDIwLTAyMDEzLTMpIGFuZCB0aGlzIG51bWJlciB3aWxsIGJlIHVzZWQgYXMgcHJveHkgZm9yIHRoZSBjaGFuZ2VzIGluIG5ldCBpbml0aWF0aW9uIGFjdGl2aXR5IGF0IG1hcHBlZCBhY3RpdmUgT3JpICgwNF9BY3RpdmVzIE9yaSkKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShHZW5vbWljUmFuZ2VzKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KHRpZHl2ZXJzZSkpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShydHJhY2tsYXllcikpCmAlKyVgPC1wYXN0ZTAKc2VxaW5mU1kgPC0gcmVhZFJEUygiRGF0YS9zZXFpbmZTWS5yZHMiKQpyRE5BX1NZIDwtIEdSYW5nZXMoIkNQMDI5MTYwLjEiLElSYW5nZXMoMzg3OTk0MCwzOTM0MDAwKSxzdHJhbmQ9IioiLHNlcWluZm89c2VxaW5mU1kpCm1hc2tlZFR5X1NZIDwtIHJlYWRSRFMoIkRhdGEvbWFza2VkVHlfU1kucmRzIikKYGBgCiMjIyBJbXBvcnRpbmcgZm9ya3MKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZm9ya3NCWSA8LSByZWFkUkRTKCJEYXRhL2ZvcmtzX0JZQllTWS5yZHMiKSAlPiUKCXNlbGVjdChjaHJvbT1jaHJvbVNZLGRpcmVjLFgwPVgwblNZLFgxPVgxblNZLGV4cCkgJT4lCgltdXRhdGUoUmVwPW1hcF9jaHIoZXhwLGZ1bmN0aW9uKHgpIHggJT4lIHN0cl9yZW1vdmUoIkJZXyIpKSkgJT4lCgltdXRhdGUoc3RyYWluPSJCWSIpCmZvcmtzX0JZU1kuZ3I8LSB3aXRoKGZvcmtzQlksIEdSYW5nZXMoc2VxbmFtZXM9Y2hyb20scmFuZ2VzPUlSYW5nZXMocG1pbihYMCxYMSkscG1heChYMCxYMSkpLHN0cmFuZD1jYXNlX3doZW4oZGlyZWM9PSJSIn4iKyIsVH4iLSIpLHNlcWluZm89c2VxaW5mU1kpKQpmQlkgPC0gZm9ya3NCWSAlPiUgCgltdXRhdGUoVHlfZmlsdGVyPSFvdmVybGFwc0FueShmb3Jrc19CWVNZLmdyLG1hc2tlZFR5X1NZKSkgJT4lCglmaWx0ZXIoVHlfZmlsdGVyKQoKZm9ya3NTWSA8LSByZWFkUkRTKCJEYXRhL2ZvcmtzX1NZU1kucmRzIikgJT4lCglzZWxlY3QoY2hyb20sZGlyZWMsWDAsWDEsZXhwKSAlPiUKCW11dGF0ZShSZXA9bWFwX2NocihleHAsZnVuY3Rpb24oeCkgeCAlPiUgc3RyX3JlbW92ZSgiU1lfIikpKSAlPiUKCW11dGF0ZShzdHJhaW49IlNZIikKZm9ya3NfU1lTWS5ncjwtIHdpdGgoZm9ya3NTWSwgR1JhbmdlcyhzZXFuYW1lcz1jaHJvbSxyYW5nZXM9SVJhbmdlcyhwbWluKFgwLFgxKSxwbWF4KFgwLFgxKSksc3RyYW5kPWNhc2Vfd2hlbihkaXJlYz09IlIifiIrIixUfiItIiksc2VxaW5mbz1zZXFpbmZTWSkpCmZTWSA8LSBmb3Jrc1NZICU+JSAKCW11dGF0ZShUeV9maWx0ZXI9IW92ZXJsYXBzQW55KGZvcmtzX1NZU1kuZ3IsbWFza2VkVHlfU1kpKSAlPiUKCWZpbHRlcihUeV9maWx0ZXIpCmBgYAoKIyMjIFJlYXJyYW5nZSBmb3JrcyBhbmQgY3JlYXRlIEdlbm9taWNSYW5nZXMKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyMjIGNyZWF0aW5nIEdSYW5nZXMKZm9ya0JZMSA8LSBmQlkgJT4lIGZpbHRlcihSZXA9PSJyZXAxIikKZm9ya0JZMSRmaWQgPC0gMTpucm93KGZvcmtCWTEpCmZvcmtCWTFfUiA8LSBmb3JrQlkxICU+JSBmaWx0ZXIoZGlyZWM9PSJSIikKZm9ya0JZMV9MIDwtIGZvcmtCWTEgJT4lIGZpbHRlcihkaXJlYz09IkwiKQpmb3JrQlkxX1IuZ3I8LSB3aXRoKGZvcmtCWTFfUiwgR1JhbmdlcyhzZXFuYW1lcz1jaHJvbSxyYW5nZXM9SVJhbmdlcyhwbWluKFgwLFgxKSxwbWF4KFgwLFgxKSksc3RyYW5kPWNhc2Vfd2hlbihkaXJlYz09IlIifiIrIixUfiItIiksZmlkPWZpZCxzZXFpbmZvPXNlcWluZlNZKSkKZm9ya0JZMV9MLmdyPC0gd2l0aChmb3JrQlkxX0wsIEdSYW5nZXMoc2VxbmFtZXM9Y2hyb20scmFuZ2VzPUlSYW5nZXMocG1pbihYMCxYMSkscG1heChYMCxYMSkpLHN0cmFuZD1jYXNlX3doZW4oZGlyZWM9PSJSIn4iKyIsVH4iLSIpLGZpZD1maWQsc2VxaW5mbz1zZXFpbmZTWSkpCgpmb3JrQlkyIDwtIGZCWSAlPiUgZmlsdGVyKFJlcD09InJlcDIiKQpmb3JrQlkyJGZpZCA8LSAxOm5yb3coZm9ya0JZMikKZm9ya0JZMl9SIDwtIGZvcmtCWTIgJT4lIGZpbHRlcihkaXJlYz09IlIiKQpmb3JrQlkyX0wgPC0gZm9ya0JZMiAlPiUgZmlsdGVyKGRpcmVjPT0iTCIpCmZvcmtCWTJfUi5ncjwtIHdpdGgoZm9ya0JZMl9SLCBHUmFuZ2VzKHNlcW5hbWVzPWNocm9tLHJhbmdlcz1JUmFuZ2VzKHBtaW4oWDAsWDEpLHBtYXgoWDAsWDEpKSxzdHJhbmQ9Y2FzZV93aGVuKGRpcmVjPT0iUiJ+IisiLFR+Ii0iKSxmaWQ9ZmlkLHNlcWluZm89c2VxaW5mU1kpKQpmb3JrQlkyX0wuZ3I8LSB3aXRoKGZvcmtCWTJfTCwgR1JhbmdlcyhzZXFuYW1lcz1jaHJvbSxyYW5nZXM9SVJhbmdlcyhwbWluKFgwLFgxKSxwbWF4KFgwLFgxKSksc3RyYW5kPWNhc2Vfd2hlbihkaXJlYz09IlIifiIrIixUfiItIiksZmlkPWZpZCxzZXFpbmZvPXNlcWluZlNZKSkKCmZvcmtTWTEgPC0gZlNZICU+JSBmaWx0ZXIoUmVwPT0icmVwMSIpCmZvcmtTWTEkZmlkIDwtIDE6bnJvdyhmb3JrU1kxKQpmb3JrU1kxX1IgPC0gZm9ya1NZMSAlPiUgZmlsdGVyKGRpcmVjPT0iUiIpCmZvcmtTWTFfTCA8LSBmb3JrU1kxICU+JSBmaWx0ZXIoZGlyZWM9PSJMIikKZm9ya1NZMV9SLmdyPC0gd2l0aChmb3JrU1kxX1IsIEdSYW5nZXMoc2VxbmFtZXM9Y2hyb20scmFuZ2VzPUlSYW5nZXMocG1pbihYMCxYMSkscG1heChYMCxYMSkpLHN0cmFuZD1jYXNlX3doZW4oZGlyZWM9PSJSIn4iKyIsVH4iLSIpLGZpZD1maWQsc2VxaW5mbz1zZXFpbmZTWSkpCmZvcmtTWTFfTC5ncjwtIHdpdGgoZm9ya1NZMV9MLCBHUmFuZ2VzKHNlcW5hbWVzPWNocm9tLHJhbmdlcz1JUmFuZ2VzKHBtaW4oWDAsWDEpLHBtYXgoWDAsWDEpKSxzdHJhbmQ9Y2FzZV93aGVuKGRpcmVjPT0iUiJ+IisiLFR+Ii0iKSxmaWQ9ZmlkLHNlcWluZm89c2VxaW5mU1kpKQoKZm9ya1NZMiA8LSBmU1kgJT4lIGZpbHRlcihSZXA9PSJyZXAyIikKZm9ya1NZMiRmaWQgPC0gMTpucm93KGZvcmtTWTIpCmZvcmtTWTJfUiA8LSBmb3JrU1kyICU+JSBmaWx0ZXIoZGlyZWM9PSJSIikKZm9ya1NZMl9MIDwtIGZvcmtTWTIgJT4lIGZpbHRlcihkaXJlYz09IkwiKQpmb3JrU1kyX1IuZ3I8LSB3aXRoKGZvcmtTWTJfUiwgR1JhbmdlcyhzZXFuYW1lcz1jaHJvbSxyYW5nZXM9SVJhbmdlcyhwbWluKFgwLFgxKSxwbWF4KFgwLFgxKSksc3RyYW5kPWNhc2Vfd2hlbihkaXJlYz09IlIifiIrIixUfiItIiksZmlkPWZpZCxzZXFpbmZvPXNlcWluZlNZKSkKZm9ya1NZMl9MLmdyPC0gd2l0aChmb3JrU1kyX0wsIEdSYW5nZXMoc2VxbmFtZXM9Y2hyb20scmFuZ2VzPUlSYW5nZXMocG1pbihYMCxYMSkscG1heChYMCxYMSkpLHN0cmFuZD1jYXNlX3doZW4oZGlyZWM9PSJSIn4iKyIsVH4iLSIpLGZpZD1maWQsc2VxaW5mbz1zZXFpbmZTWSkpCgpmb3JrQlkzIDwtIGZCWSAlPiUgZmlsdGVyKFJlcD09InJlcDMiKQpmb3JrQlkzJGZpZCA8LSAxOm5yb3coZm9ya0JZMykKZm9ya0JZM19SIDwtIGZvcmtCWTMgJT4lIGZpbHRlcihkaXJlYz09IlIiKQpmb3JrQlkzX0wgPC0gZm9ya0JZMyAlPiUgZmlsdGVyKGRpcmVjPT0iTCIpCmZvcmtCWTNfUi5ncjwtIHdpdGgoZm9ya0JZM19SLCBHUmFuZ2VzKHNlcW5hbWVzPWNocm9tLHJhbmdlcz1JUmFuZ2VzKHBtaW4oWDAsWDEpLHBtYXgoWDAsWDEpKSxzdHJhbmQ9Y2FzZV93aGVuKGRpcmVjPT0iUiJ+IisiLFR+Ii0iKSxmaWQ9ZmlkLHNlcWluZm89c2VxaW5mU1kpKQpmb3JrQlkzX0wuZ3I8LSB3aXRoKGZvcmtCWTNfTCwgR1JhbmdlcyhzZXFuYW1lcz1jaHJvbSxyYW5nZXM9SVJhbmdlcyhwbWluKFgwLFgxKSxwbWF4KFgwLFgxKSksc3RyYW5kPWNhc2Vfd2hlbihkaXJlYz09IlIifiIrIixUfiItIiksZmlkPWZpZCxzZXFpbmZvPXNlcWluZlNZKSkKCmZvcmtTWTMgPC0gZlNZICU+JSBmaWx0ZXIoUmVwPT0icmVwMyIpCmZvcmtTWTMkZmlkIDwtIDE6bnJvdyhmb3JrU1kzKQpmb3JrU1kzX1IgPC0gZm9ya1NZMyAlPiUgZmlsdGVyKGRpcmVjPT0iUiIpCmZvcmtTWTNfTCA8LSBmb3JrU1kzICU+JSBmaWx0ZXIoZGlyZWM9PSJMIikKZm9ya1NZM19SLmdyPC0gd2l0aChmb3JrU1kzX1IsIEdSYW5nZXMoc2VxbmFtZXM9Y2hyb20scmFuZ2VzPUlSYW5nZXMocG1pbihYMCxYMSkscG1heChYMCxYMSkpLHN0cmFuZD1jYXNlX3doZW4oZGlyZWM9PSJSIn4iKyIsVH4iLSIpLGZpZD1maWQsc2VxaW5mbz1zZXFpbmZTWSkpCmZvcmtTWTNfTC5ncjwtIHdpdGgoZm9ya1NZM19MLCBHUmFuZ2VzKHNlcW5hbWVzPWNocm9tLHJhbmdlcz1JUmFuZ2VzKHBtaW4oWDAsWDEpLHBtYXgoWDAsWDEpKSxzdHJhbmQ9Y2FzZV93aGVuKGRpcmVjPT0iUiJ+IisiLFR+Ii0iKSxmaWQ9ZmlkLHNlcWluZm89c2VxaW5mU1kpKQpgYGAKCiMjIyBDb21wdXRpbmcgY292ZXJhZ2VzIGFuZCBPRU0KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm91dGRpciA8LSAiQmlnRmlsZXMvQmlnV2lnLyIKY3ZMIDwtIGNvdmVyYWdlKGZvcmtTWTFfTC5ncikKY3ZSIDwtIGNvdmVyYWdlKGZvcmtTWTFfUi5ncikKY3ZUIDwtIGN2TCtjdlIKCmN2TG4gPC0gY3ZML2N2VApjdlJuIDwtIGN2Ui9jdlQKY3ZMbltpcy5uYShjdkxuKV0gPC0gMApjdlJuW2lzLm5hKGN2Um4pXSA8LSAwCndpbj0xMDAwMApjdkxzMiA8LSBlbmRvYXBwbHkoY3ZMbiwgZnVuY3Rpb24oeCkgUmxlKGNhVG9vbHM6OnJ1bm1lYW4oeCx3aW4sYWxpZ249ImxlZnQiLGVuZHJ1bGU9Ik5BIikpKQpvZW0yIDwtIGVuZG9hcHBseShjdkxzMiwgZnVuY3Rpb24oY3YpIGMoUmxlKHJlcChOQSwod2luKSkpLGN2KS1jKGN2LFJsZShyZXAoTkEsKHdpbikpKSkpCmV4cG9ydChvZW0yLGNvbj1wYXN0ZTAob3V0ZGlyLCJTWTFfb2VtXyIsd2luLzEwMDAsImsuYnciKSkKCmN2TCA8LSBjb3ZlcmFnZShmb3JrU1kyX0wuZ3IpCmN2UiA8LSBjb3ZlcmFnZShmb3JrU1kyX1IuZ3IpCmN2VCA8LSBjdkwrY3ZSCgpjdkxuIDwtIGN2TC9jdlQKY3ZSbiA8LSBjdlIvY3ZUCmN2TG5baXMubmEoY3ZMbildIDwtIDAKY3ZSbltpcy5uYShjdlJuKV0gPC0gMAp3aW49MTAwMDAKY3ZMczIgPC0gZW5kb2FwcGx5KGN2TG4sIGZ1bmN0aW9uKHgpIFJsZShjYVRvb2xzOjpydW5tZWFuKHgsd2luLGFsaWduPSJsZWZ0IixlbmRydWxlPSJOQSIpKSkKb2VtMiA8LSBlbmRvYXBwbHkoY3ZMczIsIGZ1bmN0aW9uKGN2KSBjKFJsZShyZXAoTkEsKHdpbikpKSxjdiktYyhjdixSbGUocmVwKE5BLCh3aW4pKSkpKQpleHBvcnQob2VtMixjb249cGFzdGUwKG91dGRpciwiU1kyX29lbV8iLHdpbi8xMDAwLCJrLmJ3IikpCgpjdkwgPC0gY292ZXJhZ2UoZm9ya1NZM19MLmdyKQpjdlIgPC0gY292ZXJhZ2UoZm9ya1NZM19SLmdyKQpjdlQgPC0gY3ZMK2N2UgoKY3ZMbiA8LSBjdkwvY3ZUCmN2Um4gPC0gY3ZSL2N2VApjdkxuW2lzLm5hKGN2TG4pXSA8LSAwCmN2Um5baXMubmEoY3ZSbildIDwtIDAKd2luPTEwMDAwCmN2THMyIDwtIGVuZG9hcHBseShjdkxuLCBmdW5jdGlvbih4KSBSbGUoY2FUb29sczo6cnVubWVhbih4LHdpbixhbGlnbj0ibGVmdCIsZW5kcnVsZT0iTkEiKSkpCm9lbTIgPC0gZW5kb2FwcGx5KGN2THMyLCBmdW5jdGlvbihjdikgYyhSbGUocmVwKE5BLCh3aW4pKSksY3YpLWMoY3YsUmxlKHJlcChOQSwod2luKSkpKSkKZXhwb3J0KG9lbTIsY29uPXBhc3RlMChvdXRkaXIsIlNZM19vZW1fIix3aW4vMTAwMCwiay5idyIpKQoKY3ZMIDwtIGNvdmVyYWdlKGZvcmtCWTFfTC5ncikKY3ZSIDwtIGNvdmVyYWdlKGZvcmtCWTFfUi5ncikKY3ZUIDwtIGN2TCtjdlIKCmN2TG4gPC0gY3ZML2N2VApjdlJuIDwtIGN2Ui9jdlQKY3ZMbltpcy5uYShjdkxuKV0gPC0gMApjdlJuW2lzLm5hKGN2Um4pXSA8LSAwCndpbj0xMDAwMApjdkxzMiA8LSBlbmRvYXBwbHkoY3ZMbiwgZnVuY3Rpb24oeCkgUmxlKGNhVG9vbHM6OnJ1bm1lYW4oeCx3aW4sYWxpZ249ImxlZnQiLGVuZHJ1bGU9Ik5BIikpKQpvZW0yIDwtIGVuZG9hcHBseShjdkxzMiwgZnVuY3Rpb24oY3YpIGMoUmxlKHJlcChOQSwod2luKSkpLGN2KS1jKGN2LFJsZShyZXAoTkEsKHdpbikpKSkpCmV4cG9ydChvZW0yLGNvbj1wYXN0ZTAob3V0ZGlyLCJCWTFfb2VtXyIsd2luLzEwMDAsImsuYnciKSkKCmN2TCA8LSBjb3ZlcmFnZShmb3JrQlkyX0wuZ3IpCmN2UiA8LSBjb3ZlcmFnZShmb3JrQlkyX1IuZ3IpCmN2VCA8LSBjdkwrY3ZSCgpjdkxuIDwtIGN2TC9jdlQKY3ZSbiA8LSBjdlIvY3ZUCmN2TG5baXMubmEoY3ZMbildIDwtIDAKY3ZSbltpcy5uYShjdlJuKV0gPC0gMAp3aW49MTAwMDAKY3ZMczIgPC0gZW5kb2FwcGx5KGN2TG4sIGZ1bmN0aW9uKHgpIFJsZShjYVRvb2xzOjpydW5tZWFuKHgsd2luLGFsaWduPSJsZWZ0IixlbmRydWxlPSJOQSIpKSkKb2VtMiA8LSBlbmRvYXBwbHkoY3ZMczIsIGZ1bmN0aW9uKGN2KSBjKFJsZShyZXAoTkEsKHdpbikpKSxjdiktYyhjdixSbGUocmVwKE5BLCh3aW4pKSkpKQpleHBvcnQob2VtMixjb249cGFzdGUwKG91dGRpciwiQlkyX29lbV8iLHdpbi8xMDAwLCJrLmJ3IikpCgpjdkwgPC0gY292ZXJhZ2UoZm9ya0JZM19MLmdyKQpjdlIgPC0gY292ZXJhZ2UoZm9ya0JZM19SLmdyKQpjdlQgPC0gY3ZMK2N2UgoKY3ZMbiA8LSBjdkwvY3ZUCmN2Um4gPC0gY3ZSL2N2VApjdkxuW2lzLm5hKGN2TG4pXSA8LSAwCmN2Um5baXMubmEoY3ZSbildIDwtIDAKd2luPTEwMDAwCmN2THMyIDwtIGVuZG9hcHBseShjdkxuLCBmdW5jdGlvbih4KSBSbGUoY2FUb29sczo6cnVubWVhbih4LHdpbixhbGlnbj0ibGVmdCIsZW5kcnVsZT0iTkEiKSkpCm9lbTIgPC0gZW5kb2FwcGx5KGN2THMyLCBmdW5jdGlvbihjdikgYyhSbGUocmVwKE5BLCh3aW4pKSksY3YpLWMoY3YsUmxlKHJlcChOQSwod2luKSkpKSkKZXhwb3J0KG9lbTIsY29uPXBhc3RlMChvdXRkaXIsIkJZM19vZW1fIix3aW4vMTAwMCwiay5idyIpKQpgYGAK