So methpipe has finally finished the Day 10 samples and I figured I’d run them through the RADMeth model to see if anything interesting happens. RADMeth is different than MACAU as it uses a beta-bionmial GLM as opposed to the mixed-effects model of MACAU.

Beta-binomial still lives in proportion space, as opposed to count space like the MACAU model, so we lose some information there, but it’ll be interesting to see what the differences are.

The RADMeth documentation suggests that RADMeth be run on a computing cluster with “a few hundred” available nodes then offers that it can also be run on a personal workstation but the analysis will take “sigificantly” longer. Since I’m fresh out of computing clusters, personal laptop it is!

I’ll probably upload this prior to starting the actual RADMeth step, in case it either explodes mid-process or I get tired of waiting forever for it to finish. This avoids the problem that I’m having with the previous steps, the notebook’s been running off and on for a week and a half now, but hasn’t been uploaded because it’s not finished.

I’ll recap what’s happened in that notebook here. It’s all from the methpipe manual if you’re interested in the logic behind why.

  1. Copied the .bam files produced by the Bismark aligner.
  2. Converted them to .mr files (unique format for MethPipe) using the to-mr command.
  3. Sorted them using GNUSort
  4. Used duplicate-remover to remove PCR duplicated reads
  5. Used methcounts to get methylation counts by loci. This step takes 8-10 hours per sample.

That brings us to here!

library(readr)
setwd("~/Documents/RobertsLab/methpipe/Day10")
list.files(pattern = "*.meth")
 [1] "EPI-103.meth" "EPI-104.meth" "EPI-111.meth" "EPI-113.meth" "EPI-119.meth" "EPI-120.meth"
 [7] "EPI-127.meth" "EPI-128.meth" "EPI-135.meth" "EPI-136.meth" "EPI-143.meth" "EPI-145.meth"
system("head EPI-103.meth")
scaffold100 1   +   CXG 0   0
scaffold100 3   -   CXG 0   0
scaffold100 5   +   CHH 0   0
scaffold100 7   +   CpG 0   0
scaffold100 8   -   CpG 0   0
scaffold100 10  -   CHH 0   0
scaffold100 14  -   CHH 0   0
scaffold100 15  -   CHH 0   0
scaffold100 18  +   CXG 0   0
scaffold100 20  -   CXG 0   0

Well, that looks like some methylation count data with scaffold location, strand orientation, context, and what I assume are methylated and total coverage counts. Frustrating that I technically already had this data via the methylextract stuff I did previously, but methpipe wants it contorted it’s on specific way, so I get to re-do all the work.

The documentation says that RADMeth needs two input files, a proportion table with location and count files by sample. Something like the table below.

EPI-103 EPI-104 EPI-111 EPI-113
scaffold100:13 3 5 1 6 1 4 4 9
scaffold100:17 4 7 4 8 5 11 7 16
scaffold100:101 0 3 3 10 13 17 15 23

The second file it wants is a design matrix which specifies which samples belong to which treatment groups similar to the table below.

base trt
EPI-103 1 2
EPI-104 1 2
EPI-111 1 1
EPI-113 1 1

Lets start by making the proportion table. Thankfully methpipe gives us a comand to do this automatically from the .meth files via merge-methcounts. I’m going to take this opportunity to construct my proportion table such that it goes Ambient -> Low -> Super Low treatments in order, just for readability.

system("merge-methcounts EPI-119.meth EPI-120.meth EPI-135.meth EPI-136.meth EPI-103.meth EPI-104.meth EPI-127.meth EPI-128.meth EPI-111.meth EPI-113.meth EPI-143.meth EPI-145.meth -o Day10-merged.meth")

Thats done, lets see what it looks like.

system("head Day10-merged.meth")
scaffold100 1   +   CXG 0   0
scaffold100 3   -   CXG 0   6
scaffold100 5   +   CHH 0   0
scaffold100 7   +   CpG 0   1
scaffold100 8   -   CpG 0   6
scaffold100 10  -   CHH 0   6
scaffold100 14  -   CHH 0   6
scaffold100 15  -   CHH 0   6
scaffold100 18  +   CXG 0   1
scaffold100 20  -   CXG 0   6

Well… thats not right. Ah. Apparently that code is for the technical replicate combination. So it assumed that the different EPI-XXX files were re-runs of the same sample. Oops. Have to use a -t flag to say make the proportion table

Once more, this time with feeling!

system("merge-methcounts -t EPI-119.meth EPI-120.meth EPI-135.meth EPI-136.meth EPI-103.meth EPI-104.meth EPI-127.meth EPI-128.meth EPI-111.meth EPI-113.meth EPI-143.meth EPI-145.meth > Day10-merged.meth")

Lets see what this one looks like.

system("head Day10-merged.meth")
EPI-119 EPI-120 EPI-135 EPI-136 EPI-103 EPI-104 EPI-127 EPI-128 EPI-111 EPI-113 EPI-143 EPI-145 
scaffold100:1:+:CXG 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
scaffold100:3:-:CXG 1   0   1   0   0   0   1   0   0   0   0   0   1   0   0   0   0   0   2   0   0   0   0   0   
scaffold100:5:+:CHH 0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   
scaffold100:7:+:CpG 0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   
scaffold100:8:-:CpG 1   0   1   0   0   0   1   0   0   0   0   0   1   0   0   0   0   0   2   0   0   0   0   0   
scaffold100:10:-:CHH    1   0   1   0   0   0   1   0   0   0   0   0   1   0   0   0   0   0   2   0   0   0   0   0   
scaffold100:14:-:CHH    1   0   1   0   0   0   1   0   0   0   0   0   1   0   0   0   0   0   2   0   0   0   0   0   
scaffold100:15:-:CHH    1   0   1   0   0   0   1   0   0   0   0   0   1   0   0   0   0   0   2   0   0   0   0   0   
scaffold100:18:+:CXG    0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   

Much better!

I made the Design Matrix in excel real quick and saved it as a .csv file.

system("cat designmatrix.csv")
,base,trt
EPI-119,1,0
EPI-120,1,0
EPI-135,1,0
EPI-136,1,0
EPI-103,1,1
EPI-104,1,1
EPI-127,1,1
EPI-128,1,1
EPI-111,1,2
EPI-113,1,2
EPI-143,1,2
EPI-145,1,2

Hm, for some reason R doesn’t want to display the cat correctly, so you’re stuck with trusting me that it’s correct.

Now we get to start with the actual RADMeth part.

There are three main parts to a RADMeth run apparently. First, we do the regression, then we adjust p-values based on neighboring p-values, and finally we combine neighbors to form DMRs. I’m not 100% sure how this will work with our data, as we technically only have differentially methylated loci, but we’ll see.

First, the regression. RADMeth needs to be told what factor it’s looking at, in our case it’s called trt.

system("radmeth regression -factor trt designmatrix.csv Day10-merged.meth > cpgs.bed")
Error: trt is not a part of the design specification.

Hm. Maybe it doesn’t like the commas in the design matrix? I’ll change it over to a tab delimited file.

system("radmeth regression -factor trt designmatrix.txt Day10-merged.meth > cpgs.bed")
EPI-119 EPI-120 EPI-135 EPI-136 EPI-103 EPI-104 EPI-127 EPI-128 EPI-111 EPI-113 EPI-143 EPI-145  does not match factor names or their order in the design matrix. Please verify that the design matrix and the proportion table are correctly formatted.

Hmm. It looks like merge-methcounts forgot to make the first column name blank, so all of my column names are shifted by one and the final column has no name. Guess I’ll have to fix that.

After some googling and some help from Sam, I found that ( printf ‘’; cat Day10-merged.meth ) > Day10-merged2.meth

works to add that tab. Lets try it again.


system("radmeth regression -factor trt designmatrix.txt Day10-merged2.meth > cpgs.bed")

Well, that didn’t work either, so next i tried changing the delimiting character from tab (/t) to just whitespace using tr. The command was:

cat Day10-merged.meth | tr “\t” " " > Day10-merged2.meth

system("head Day10-merged2.meth")
EPI-119 EPI-120 EPI-135 EPI-136 EPI-103 EPI-104 EPI-127 EPI-128 EPI-111 EPI-113 EPI-143 EPI-145 
scaffold100:1:+:CXG 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
scaffold100:3:-:CXG 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 
scaffold100:5:+:CHH 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
scaffold100:7:+:CpG 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
scaffold100:8:-:CpG 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 
scaffold100:10:-:CHH 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 
scaffold100:14:-:CHH 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 
scaffold100:15:-:CHH 1 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 
scaffold100:18:+:CXG 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 

That looks better? Maybe? Once more unto the breach.


system("radmeth regression -factor trt designmatrix2.txt Day10-merged2.meth > cpgs.bed")
LS0tCnRpdGxlOiAiRGF5IDEwIFJBRE1ldGgiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClNvIG1ldGhwaXBlIGhhcyBmaW5hbGx5IGZpbmlzaGVkIHRoZSBEYXkgMTAgc2FtcGxlcyBhbmQgSSBmaWd1cmVkIEknZCBydW4gdGhlbSB0aHJvdWdoIHRoZSBSQURNZXRoIG1vZGVsIHRvIHNlZSBpZiBhbnl0aGluZyBpbnRlcmVzdGluZyBoYXBwZW5zLiBSQURNZXRoIGlzIGRpZmZlcmVudCB0aGFuIE1BQ0FVIGFzIGl0IHVzZXMgYSBiZXRhLWJpb25taWFsIEdMTSBhcyBvcHBvc2VkIHRvIHRoZSBtaXhlZC1lZmZlY3RzIG1vZGVsIG9mIE1BQ0FVLiAKCkJldGEtYmlub21pYWwgc3RpbGwgbGl2ZXMgaW4gcHJvcG9ydGlvbiBzcGFjZSwgYXMgb3Bwb3NlZCB0byBjb3VudCBzcGFjZSBsaWtlIHRoZSBNQUNBVSBtb2RlbCwgc28gd2UgbG9zZSBzb21lIGluZm9ybWF0aW9uIHRoZXJlLCBidXQgaXQnbGwgYmUgaW50ZXJlc3RpbmcgdG8gc2VlIHdoYXQgdGhlIGRpZmZlcmVuY2VzIGFyZS4gCgpUaGUgUkFETWV0aCBkb2N1bWVudGF0aW9uIHN1Z2dlc3RzIHRoYXQgUkFETWV0aCBiZSBydW4gb24gYSBjb21wdXRpbmcgY2x1c3RlciB3aXRoICJhIGZldyBodW5kcmVkIiBhdmFpbGFibGUgbm9kZXMgdGhlbiBvZmZlcnMgdGhhdCBpdCBjYW4gYWxzbyBiZSBydW4gb24gYSBwZXJzb25hbCB3b3Jrc3RhdGlvbiBidXQgdGhlIGFuYWx5c2lzIHdpbGwgdGFrZSAic2lnaWZpY2FudGx5IiBsb25nZXIuIFNpbmNlIEknbSBmcmVzaCBvdXQgb2YgY29tcHV0aW5nIGNsdXN0ZXJzLCBwZXJzb25hbCBsYXB0b3AgaXQgaXMhCgpJJ2xsIHByb2JhYmx5IHVwbG9hZCB0aGlzIHByaW9yIHRvIHN0YXJ0aW5nIHRoZSBhY3R1YWwgUkFETWV0aCBzdGVwLCBpbiBjYXNlIGl0IGVpdGhlciBleHBsb2RlcyBtaWQtcHJvY2VzcyBvciBJIGdldCB0aXJlZCBvZiB3YWl0aW5nIGZvcmV2ZXIgZm9yIGl0IHRvIGZpbmlzaC4gVGhpcyBhdm9pZHMgdGhlIHByb2JsZW0gdGhhdCBJJ20gaGF2aW5nIHdpdGggdGhlIHByZXZpb3VzIHN0ZXBzLCB0aGUgbm90ZWJvb2sncyBiZWVuIHJ1bm5pbmcgb2ZmIGFuZCBvbiBmb3IgYSB3ZWVrIGFuZCBhIGhhbGYgbm93LCBidXQgaGFzbid0IGJlZW4gdXBsb2FkZWQgYmVjYXVzZSBpdCdzIG5vdCBmaW5pc2hlZC4KCkknbGwgcmVjYXAgd2hhdCdzIGhhcHBlbmVkIGluIHRoYXQgbm90ZWJvb2sgaGVyZS4gSXQncyBhbGwgZnJvbSB0aGUgbWV0aHBpcGUgbWFudWFsIGlmIHlvdSdyZSBpbnRlcmVzdGVkIGluIHRoZSBsb2dpYyBiZWhpbmQgd2h5LiAKCjEuIENvcGllZCB0aGUgLmJhbSBmaWxlcyBwcm9kdWNlZCBieSB0aGUgQmlzbWFyayBhbGlnbmVyLiAgIAoyLiBDb252ZXJ0ZWQgdGhlbSB0byAubXIgZmlsZXMgKHVuaXF1ZSBmb3JtYXQgZm9yIE1ldGhQaXBlKSB1c2luZyB0aGUgdG8tbXIgY29tbWFuZC4gIAozLiBTb3J0ZWQgdGhlbSB1c2luZyBHTlVTb3J0CjQuIFVzZWQgZHVwbGljYXRlLXJlbW92ZXIgdG8gcmVtb3ZlIFBDUiBkdXBsaWNhdGVkIHJlYWRzCjUuIFVzZWQgbWV0aGNvdW50cyB0byBnZXQgbWV0aHlsYXRpb24gY291bnRzIGJ5IGxvY2kuIFRoaXMgc3RlcCB0YWtlcyA4LTEwIGhvdXJzIHBlciBzYW1wbGUuIAoKVGhhdCBicmluZ3MgdXMgdG8gaGVyZSEgCgoKCmBgYHtyfQoKbGlicmFyeShyZWFkcikKc2V0d2QoIn4vRG9jdW1lbnRzL1JvYmVydHNMYWIvbWV0aHBpcGUvRGF5MTAiKQoKbGlzdC5maWxlcyhwYXR0ZXJuID0gIioubWV0aCIpCgpgYGAKCgpgYGB7cn0KCnN5c3RlbSgiaGVhZCBFUEktMTAzLm1ldGgiKQoKYGBgCgpXZWxsLCB0aGF0IGxvb2tzIGxpa2Ugc29tZSBtZXRoeWxhdGlvbiBjb3VudCBkYXRhIHdpdGggc2NhZmZvbGQgbG9jYXRpb24sIHN0cmFuZCBvcmllbnRhdGlvbiwgY29udGV4dCwgYW5kIHdoYXQgSSBhc3N1bWUgYXJlIG1ldGh5bGF0ZWQgYW5kIHRvdGFsIGNvdmVyYWdlIGNvdW50cy4gRnJ1c3RyYXRpbmcgdGhhdCBJIHRlY2huaWNhbGx5IGFscmVhZHkgaGFkIHRoaXMgZGF0YSB2aWEgdGhlIG1ldGh5bGV4dHJhY3Qgc3R1ZmYgSSBkaWQgcHJldmlvdXNseSwgYnV0IG1ldGhwaXBlIHdhbnRzIGl0IGNvbnRvcnRlZCBpdCdzIG9uIHNwZWNpZmljIHdheSwgc28gSSBnZXQgdG8gcmUtZG8gYWxsIHRoZSB3b3JrLiAKClRoZSBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCBSQURNZXRoIG5lZWRzIHR3byBpbnB1dCBmaWxlcywgYSBwcm9wb3J0aW9uIHRhYmxlIHdpdGggbG9jYXRpb24gYW5kIGNvdW50IGZpbGVzIGJ5IHNhbXBsZS4gU29tZXRoaW5nIGxpa2UgdGhlIHRhYmxlIGJlbG93LiAKCgp8ICAgICAgICAgICAgICAgICB8IEVQSS0xMDMgfCAgIHwgRVBJLTEwNCB8ICAgIHwgRVBJLTExMSB8ICAgIHwgRVBJLTExMyB8ICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tOnwtLTp8LS0tLS0tLS06fC0tLTp8LS0tLS0tLS06fC0tLTp8LS0tLS0tLS06fC0tLTp8Cnwgc2NhZmZvbGQxMDA6MTMgIHwgICAgICAgMyB8IDUgfCAgICAgICAxIHwgNiAgfCAgICAgICAxIHwgNCAgfCAgICAgICA0IHwgOSAgfAp8IHNjYWZmb2xkMTAwOjE3ICB8ICAgICAgIDQgfCA3IHwgICAgICAgNCB8IDggIHwgICAgICAgNSB8IDExIHwgICAgICAgNyB8IDE2IHwKfCBzY2FmZm9sZDEwMDoxMDEgfCAgICAgICAwIHwgMyB8ICAgICAgIDMgfCAxMCB8ICAgICAgMTMgfCAxNyB8ICAgICAgMTUgfCAyMyB8CgpUaGUgc2Vjb25kIGZpbGUgaXQgd2FudHMgaXMgYSBkZXNpZ24gbWF0cml4IHdoaWNoIHNwZWNpZmllcyB3aGljaCBzYW1wbGVzIGJlbG9uZyB0byB3aGljaCB0cmVhdG1lbnQgZ3JvdXBzIHNpbWlsYXIgdG8gdGhlIHRhYmxlIGJlbG93LgoKfCAgICAgICAgIHwgYmFzZSB8IHRydCB8CnwtLS0tLS0tLS18LS0tLS06fC0tLS06fAp8IEVQSS0xMDMgfCAgICAxIHwgICAyIHwKfCBFUEktMTA0IHwgICAgMSB8ICAgMiB8CnwgRVBJLTExMSB8ICAgIDEgfCAgIDEgfAp8IEVQSS0xMTMgfCAgICAxIHwgICAxIHwKCgpMZXRzIHN0YXJ0IGJ5IG1ha2luZyB0aGUgcHJvcG9ydGlvbiB0YWJsZS4gVGhhbmtmdWxseSBtZXRocGlwZSBnaXZlcyB1cyBhIGNvbWFuZCB0byBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgLm1ldGggZmlsZXMgdmlhIG1lcmdlLW1ldGhjb3VudHMuIEknbSBnb2luZyB0byB0YWtlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gY29uc3RydWN0IG15IHByb3BvcnRpb24gdGFibGUgc3VjaCB0aGF0IGl0IGdvZXMgQW1iaWVudCAtPiBMb3cgLT4gU3VwZXIgTG93IHRyZWF0bWVudHMgaW4gb3JkZXIsIGp1c3QgZm9yIHJlYWRhYmlsaXR5LgoKYGBge3J9CgpzeXN0ZW0oIm1lcmdlLW1ldGhjb3VudHMgRVBJLTExOS5tZXRoIEVQSS0xMjAubWV0aCBFUEktMTM1Lm1ldGggRVBJLTEzNi5tZXRoIEVQSS0xMDMubWV0aCBFUEktMTA0Lm1ldGggRVBJLTEyNy5tZXRoIEVQSS0xMjgubWV0aCBFUEktMTExLm1ldGggRVBJLTExMy5tZXRoIEVQSS0xNDMubWV0aCBFUEktMTQ1Lm1ldGggLW8gRGF5MTAtbWVyZ2VkLm1ldGgiKQoKYGBgCgpUaGF0cyBkb25lLCBsZXRzIHNlZSB3aGF0IGl0IGxvb2tzIGxpa2UuCgpgYGB7cn0KCnN5c3RlbSgiaGVhZCBEYXkxMC1tZXJnZWQubWV0aCIpCgpgYGAKCldlbGwuLi4gdGhhdHMgbm90IHJpZ2h0LiBBaC4gQXBwYXJlbnRseSB0aGF0IGNvZGUgaXMgZm9yIHRoZSB0ZWNobmljYWwgcmVwbGljYXRlIGNvbWJpbmF0aW9uLiBTbyBpdCBhc3N1bWVkIHRoYXQgdGhlIGRpZmZlcmVudCBFUEktWFhYIGZpbGVzIHdlcmUgcmUtcnVucyBvZiB0aGUgc2FtZSBzYW1wbGUuIE9vcHMuIEhhdmUgdG8gdXNlIGEgLXQgZmxhZyB0byBzYXkgbWFrZSB0aGUgcHJvcG9ydGlvbiB0YWJsZQoKT25jZSBtb3JlLCB0aGlzIHRpbWUgd2l0aCBmZWVsaW5nIQoKYGBge3J9CgpzeXN0ZW0oIm1lcmdlLW1ldGhjb3VudHMgLXQgRVBJLTExOS5tZXRoIEVQSS0xMjAubWV0aCBFUEktMTM1Lm1ldGggRVBJLTEzNi5tZXRoIEVQSS0xMDMubWV0aCBFUEktMTA0Lm1ldGggRVBJLTEyNy5tZXRoIEVQSS0xMjgubWV0aCBFUEktMTExLm1ldGggRVBJLTExMy5tZXRoIEVQSS0xNDMubWV0aCBFUEktMTQ1Lm1ldGggPiBEYXkxMC1tZXJnZWQubWV0aCIpCgpgYGAKCkxldHMgc2VlIHdoYXQgdGhpcyBvbmUgbG9va3MgbGlrZS4KCmBgYHtyfQoKc3lzdGVtKCJoZWFkIERheTEwLW1lcmdlZC5tZXRoIikKCmBgYAoKTXVjaCBiZXR0ZXIhCgpJIG1hZGUgdGhlIERlc2lnbiBNYXRyaXggaW4gZXhjZWwgcmVhbCBxdWljayBhbmQgc2F2ZWQgaXQgYXMgYSAuY3N2IGZpbGUuIAoKYGBge3J9CgpzeXN0ZW0oImNhdCBkZXNpZ25tYXRyaXguY3N2IikKCmBgYAoKSG0sIGZvciBzb21lIHJlYXNvbiBSIGRvZXNuJ3Qgd2FudCB0byBkaXNwbGF5IHRoZSBjYXQgY29ycmVjdGx5LCBzbyB5b3UncmUgc3R1Y2sgd2l0aCB0cnVzdGluZyBtZSB0aGF0IGl0J3MgY29ycmVjdC4KCk5vdyB3ZSBnZXQgdG8gc3RhcnQgd2l0aCB0aGUgYWN0dWFsIFJBRE1ldGggcGFydC4KClRoZXJlIGFyZSB0aHJlZSBtYWluIHBhcnRzIHRvIGEgUkFETWV0aCBydW4gYXBwYXJlbnRseS4gRmlyc3QsIHdlIGRvIHRoZSByZWdyZXNzaW9uLCB0aGVuIHdlIGFkanVzdCBwLXZhbHVlcyBiYXNlZCBvbiBuZWlnaGJvcmluZyBwLXZhbHVlcywgYW5kIGZpbmFsbHkgd2UgY29tYmluZSBuZWlnaGJvcnMgdG8gZm9ybSBETVJzLiBJJ20gbm90IDEwMCUgc3VyZSBob3cgdGhpcyB3aWxsIHdvcmsgd2l0aCBvdXIgZGF0YSwgYXMgd2UgdGVjaG5pY2FsbHkgb25seSBoYXZlIGRpZmZlcmVudGlhbGx5IG1ldGh5bGF0ZWQgbG9jaSwgYnV0IHdlJ2xsIHNlZS4KCkZpcnN0LCB0aGUgcmVncmVzc2lvbi4gUkFETWV0aCBuZWVkcyB0byBiZSB0b2xkIHdoYXQgZmFjdG9yIGl0J3MgbG9va2luZyBhdCwgaW4gb3VyIGNhc2UgaXQncyBjYWxsZWQgdHJ0LiAKCgpgYGB7cn0KCnN5c3RlbSgicmFkbWV0aCByZWdyZXNzaW9uIC1mYWN0b3IgdHJ0IGRlc2lnbm1hdHJpeC5jc3YgRGF5MTAtbWVyZ2VkLm1ldGggPiBjcGdzLmJlZCIpCgpgYGAKCkhtLiBNYXliZSBpdCBkb2Vzbid0IGxpa2UgdGhlIGNvbW1hcyBpbiB0aGUgZGVzaWduIG1hdHJpeD8gSSdsbCBjaGFuZ2UgaXQgb3ZlciB0byBhIHRhYiBkZWxpbWl0ZWQgZmlsZS4gCgpgYGB7cn0KCnN5c3RlbSgicmFkbWV0aCByZWdyZXNzaW9uIC1mYWN0b3IgdHJ0IGRlc2lnbm1hdHJpeC50eHQgRGF5MTAtbWVyZ2VkLm1ldGggPiBjcGdzLmJlZCIpCgpgYGAKCgpIbW0uIEl0IGxvb2tzIGxpa2UgbWVyZ2UtbWV0aGNvdW50cyBmb3Jnb3QgdG8gbWFrZSB0aGUgZmlyc3QgY29sdW1uIG5hbWUgYmxhbmssIHNvIGFsbCBvZiBteSBjb2x1bW4gbmFtZXMgYXJlIHNoaWZ0ZWQgYnkgb25lIGFuZCB0aGUgZmluYWwgY29sdW1uIGhhcyBubyBuYW1lLiBHdWVzcyBJJ2xsIGhhdmUgdG8gZml4IHRoYXQuCgpBZnRlciBzb21lIGdvb2dsaW5nIGFuZCBzb21lIGhlbHAgZnJvbSBTYW0sIEkgZm91bmQgdGhhdCAKKCBwcmludGYgJ1x0JzsgY2F0IERheTEwLW1lcmdlZC5tZXRoICkgPiBEYXkxMC1tZXJnZWQyLm1ldGggCgp3b3JrcyB0byBhZGQgdGhhdCB0YWIuIExldHMgdHJ5IGl0IGFnYWluLgoKCmBgYHtyfQoKc3lzdGVtKCJyYWRtZXRoIHJlZ3Jlc3Npb24gLWZhY3RvciB0cnQgZGVzaWdubWF0cml4LnR4dCBEYXkxMC1tZXJnZWQyLm1ldGggPiBjcGdzLmJlZCIpCgpgYGAKCldlbGwsIHRoYXQgZGlkbid0IHdvcmsgZWl0aGVyLCBzbyBuZXh0IGkgdHJpZWQgY2hhbmdpbmcgdGhlIGRlbGltaXRpbmcgY2hhcmFjdGVyIGZyb20gdGFiICgvdCkgdG8ganVzdCB3aGl0ZXNwYWNlIHVzaW5nIHRyLiBUaGUgY29tbWFuZCB3YXM6CgpjYXQgRGF5MTAtbWVyZ2VkLm1ldGggfCB0ciAiXFx0IiAiICIgPiBEYXkxMC1tZXJnZWQyLm1ldGgKCmBgYHtyfQoKc3lzdGVtKCJoZWFkIERheTEwLW1lcmdlZDIubWV0aCIpCgpgYGAKCgpUaGF0IGxvb2tzIGJldHRlcj8gTWF5YmU/IE9uY2UgbW9yZSB1bnRvIHRoZSBicmVhY2guCgpgYGB7cn0KCnN5c3RlbSgicmFkbWV0aCByZWdyZXNzaW9uIC1mYWN0b3IgdHJ0IGRlc2lnbm1hdHJpeDIudHh0IERheTEwLW1lcmdlZDIubWV0aCA+IGNwZ3MuYmVkIikKCmBgYA==