Pipeline for targeted functional metagenomic DNA capture probe design in R

Read in the database of sequences (in FASTA format) from dbCAN (http://csbl.bmb.uga.edu/dbCAN/download/CAZyDB.07202017.fa)

library(DECIPHER)
Loading required package: RSQLite
fas <- "http://csbl.bmb.uga.edu/dbCAN/download/CAZyDB.07202017.fa"
store_db <- "C:/Users/faysmith/OneDrive - University of Arkansas/R Code/New DB for probe/new"
seqs <- readAAStringSet(fas)
trying URL 'http://csbl.bmb.uga.edu/dbCAN/download/CAZyDB.07202017.fa'
Content type 'text/plain; charset=UTF-8' length 463121677 bytes (441.7 MB)
downloaded 441.7 MB
Seqs2DB("http://csbl.bmb.uga.edu/dbCAN/download/CAZyDB.07202017.fa", "FASTA", store_db, "CAZymes")

Reading FASTA file chunk 1
Reading FASTA file chunk 2
Reading FASTA file chunk 3
Reading FASTA file chunk 4
Reading FASTA file chunk 5
Reading FASTA file chunk 6
Reading FASTA file chunk 7
Reading FASTA file chunk 8
Reading FASTA file chunk 9
Reading FASTA file chunk 10
Reading FASTA file chunk 11
Reading FASTA file chunk 12
Reading FASTA file chunk 13
Reading FASTA file chunk 14
Reading FASTA file chunk 15
Reading FASTA file chunk 16
Reading FASTA file chunk 17
Reading FASTA file chunk 18
Reading FASTA file chunk 19
Reading FASTA file chunk 20
Reading FASTA file chunk 21
Reading FASTA file chunk 22
Reading FASTA file chunk 23
Reading FASTA file chunk 24
Reading FASTA file chunk 25
Reading FASTA file chunk 26
Reading FASTA file chunk 27
Reading FASTA file chunk 28
Reading FASTA file chunk 29
Reading FASTA file chunk 30
Reading FASTA file chunk 31
Reading FASTA file chunk 32
Reading FASTA file chunk 33
Reading FASTA file chunk 34
Reading FASTA file chunk 35
Reading FASTA file chunk 36
Reading FASTA file chunk 37
Reading FASTA file chunk 38
Reading FASTA file chunk 39
Reading FASTA file chunk 40
Reading FASTA file chunk 41
Reading FASTA file chunk 42
Reading FASTA file chunk 43
Reading FASTA file chunk 44
Reading FASTA file chunk 45
Reading FASTA file chunk 46
Reading FASTA file chunk 47

Added 921174 new sequences to table Seqs.
1842348 total sequences in table Seqs.
Time difference of 113.09 secs

Pull out the GenBank numbers and then pull out familiy names as a string

#fam_names <- stri_extract(fam_names, regex='[.[A-Z][0-9]|?]')
fam_names
   [1] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
   [9] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [17] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [25] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [33] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [41] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [49] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [57] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [65] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [73] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [81] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [89] "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"           "|AA0"          
  [97] "|AA0"           "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [105] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [113] "|AA10|3.2.1.78" "|AA10"          "|AA10"          "|AA10|1.-.-.-"  "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [121] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [129] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10|1.-.-.-"  "|AA10"          "|AA10"         
 [137] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [145] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [153] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [161] "|AA10"          "|AA10"          "|AA10|1.-.-.-"  "|AA10"          "|AA10"          "|AA10|1.-.-.-"  "|AA10"          "|AA10"         
 [169] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10|1.-.-.-" 
 [177] "|AA10|1.-.-.-"  "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10|1.-.-.-"  "|AA10"         
 [185] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [193] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [201] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [209] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [217] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [225] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [233] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [241] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [249] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [257] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [265] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10|1.-.-.-"  "|AA10|1.-.-.-"  "|AA10"         
 [273] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [281] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [289] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [297] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [305] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [313] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [321] "|AA10|1.-.-.-"  "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [329] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [337] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [345] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [353] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [361] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [369] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [377] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [385] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [393] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [401] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [409] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [417] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [425] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [433] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [441] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [449] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [457] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [465] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [473] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [481] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [489] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [497] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [505] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [513] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [521] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [529] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [537] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [545] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [553] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [561] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [569] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [577] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [585] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [593] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [601] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [609] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [617] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [625] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [633] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [641] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [649] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [657] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [665] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [673] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [681] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [689] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [697] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [705] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [713] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [721] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [729] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [737] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [745] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [753] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [761] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [769] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [777] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [785] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [793] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [801] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [809] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [817] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [825] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [833] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [841] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [849] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [857] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [865] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [873] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [881] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [889] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [897] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [905] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [913] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [921] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [929] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [937] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [945] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [953] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [961] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [969] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [977] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [985] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [993] "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"          "|AA10"         
 [ reached getOption("max.print") -- omitted 918938 entries ]

Seperating sequences by subfamily

AA <- SearchDB(AA0_db, type = "AAStringSet", nameBy = "row_names")
Search Expression:
select row_names, sequence from _Seqs where row_names in (select row_names from Seqs)

AAStringSet of length: 100
Time difference of 0.21 secs

**Note: Need to write in code to extract the subfamily names from the inital file, then use that list to automate this process

Add2DB(clus, AA0_db)
Expression:
update Seqs set cluster = :cluster where row_names = :row_names

Added to table Seqs:  "cluster".

Time difference of 0.21 secs
conSeqs <- IdConsensus(path_cazy_nuc, type = "AAStringSet", colName = "cluster", verbose = TRUE)
Couldn't set synchronous mode: file is not a database
Use `synchronous` = NULL to turn off this warning.Error in result_create(conn@ptr, statement) : file is not a database

Now for the array design and validation steps

probes <- DesignArray(conSeqs, maxPermutations=2, numProbes = 20,verbose = TRUE)
Error in DesignArray(conSeqs, maxPermutations = 2, numProbes = 20, verbose = TRUE) : 
  myDNAStringSet must be a DNAStringSet.

Try to use the GenBank numbers to call NCBI nucleotide sequences:

Seqs2DB(cazy_nuc, "DNAStringSet", "C:/Users/faysmith/OneDrive - University of Arkansas/R Code/New DB for probe/nuc_cazy", "Nuc_Cazymes")
Couldn't set synchronous mode: file is not a database
Use `synchronous` = NULL to turn off this warning.Error in result_create(conn@ptr, statement) : file is not a database
LS0tDQp0aXRsZTogIlByb2JlIERlc2lnbiBQaXBlbGluZSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClBpcGVsaW5lIGZvciB0YXJnZXRlZCBmdW5jdGlvbmFsIG1ldGFnZW5vbWljIEROQSBjYXB0dXJlIHByb2JlIGRlc2lnbiBpbiBSDQoNClJlYWQgaW4gdGhlIGRhdGFiYXNlIG9mIHNlcXVlbmNlcyAoaW4gRkFTVEEgZm9ybWF0KSBmcm9tIGRiQ0FOIChodHRwOi8vY3NibC5ibWIudWdhLmVkdS9kYkNBTi9kb3dubG9hZC9DQVp5REIuMDcyMDIwMTcuZmEpDQoNCmBgYHtyfQ0KbGlicmFyeShERUNJUEhFUikNCmZhcyA8LSAiaHR0cDovL2NzYmwuYm1iLnVnYS5lZHUvZGJDQU4vZG93bmxvYWQvQ0FaeURCLjA3MjAyMDE3LmZhIg0Kc3RvcmVfZGIgPC0gIkM6L1VzZXJzL2ZheXNtaXRoL09uZURyaXZlIC0gVW5pdmVyc2l0eSBvZiBBcmthbnNhcy9SIENvZGUvTmV3IERCIGZvciBwcm9iZS9uZXciDQpzZXFzIDwtIHJlYWRBQVN0cmluZ1NldChmYXMpDQoNClNlcXMyREIoImh0dHA6Ly9jc2JsLmJtYi51Z2EuZWR1L2RiQ0FOL2Rvd25sb2FkL0NBWnlEQi4wNzIwMjAxNy5mYSIsICJGQVNUQSIsIHN0b3JlX2RiLCAiQ0FaeW1lcyIpDQoNCg0KDQpgYGANCg0KDQpQdWxsIG91dCB0aGUgR2VuQmFuayBudW1iZXJzIGFuZCB0aGVuIHB1bGwgb3V0IGZhbWlsaXkgbmFtZXMgYXMgYSBzdHJpbmcNCmBgYHtyfQ0KDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHN0cmluZ3IpDQoNCmRiX25hbWVzIDwtIHVuaXF1ZShuYW1lcyhzZXFzKSkNCmRiX25hbWVzIDwtIHN0cmlfZXh0cmFjdChkYl9uYW1lcywgcmVnZXg9J1tefF0qJykNCmRiX25hbWVzDQpHZW5lQmFuayA8LSBkYXRhLmZyYW1lKGRiX25hbWVzKQ0KR2VuZUJhbmsNCg0KZmFtX25hbWVzIDwtIHVuaXF1ZShuYW1lcyhzZXFzKSkNCmZhbV9uYW1lcyA8LSBzdWIoIi4qXFx8IiwgIiIsIGZhbV9uYW1lcykNCiNmYW1fbmFtZXMgPC0gc3ViKCcuKicsICcnLCBmYW1fbmFtZXMpDQpmYW1fbmFtZXMgPC0gc3RyX3N1YnNldChmYW1fbmFtZXMsICJbOmFscGhhOl0iKQ0KI2ZhbV9uYW1lcyA8LSBzdWIoIl5bXnxdKiIsICIiLCBmYW1fbmFtZXMpDQojZmFtX25hbWVzIDwtIHN0cmlfZXh0cmFjdChmYW1fbmFtZXMsIHJlZ2V4PSdbLltBLVpdWzAtOV18P10nKQ0KZmFtX25hbWVzIDwtIHVuaXF1ZShmYW1fbmFtZXMpDQpmYW1fbmFtZXMNCkdlbmVCYW5rIDwtIGRhdGEuZnJhbWUoZmFtX25hbWVzKQ0KDQpgYGANCg0KDQpTZXBlcmF0aW5nIHNlcXVlbmNlcyBieSBzdWJmYW1pbHkNCg0KYGBge3J9DQoNCiNTbywgSSdtIGp1c3QgZ29pbmcgdG8gbWFudWFsbHkgZG8gdGhpcyBzaGl0IHRvIHNlcGVyYXRlIG91dCBqdXN0IHRoZSBBQTAgZmFtaWx5DQpBQTBfU2VxcyA8LSBzZXFzW2dyZXAoIkFBMCQiLCBuYW1lcyhzZXFzKSldDQpBQTBfZGIgPC0gIkM6L1VzZXJzL2ZheXNtaXRoL09uZURyaXZlIC0gVW5pdmVyc2l0eSBvZiBBcmthbnNhcy9SIENvZGUvTmV3IERCIGZvciBwcm9iZS9BQTAiDQpTZXFzMkRCKEFBMF9TZXFzLCAiWFN0cmluZ1NldCIsICJDOi9Vc2Vycy9mYXlzbWl0aC9PbmVEcml2ZSAtIFVuaXZlcnNpdHkgb2YgQXJrYW5zYXMvUiBDb2RlL05ldyBEQiBmb3IgcHJvYmUvQUEwIiwgIkFBMF9DQVp5bWVzIikNCkFBIDwtIFNlYXJjaERCKEFBMF9kYiwgdHlwZSA9ICJBQVN0cmluZ1NldCIsIG5hbWVCeSA9ICJyb3dfbmFtZXMiKQ0KDQpgYGANCg0KKipOb3RlOiBOZWVkIHRvIHdyaXRlIGluIGNvZGUgdG8gZXh0cmFjdCB0aGUgc3ViZmFtaWx5IG5hbWVzIGZyb20gdGhlIGluaXRhbCBmaWxlLCB0aGVuIHVzZSB0aGF0IGxpc3QgdG8gYXV0b21hdGUgdGhpcyBwcm9jZXNzDQoNCmBgYHtyfQ0KDQpkTWF0cml4IDwtIERpc3RhbmNlTWF0cml4KEFBMF9TZXFzLCB2ZXJib3NlID0gVFJVRSkNCmNsdXN0ZXJzIDwtIElkQ2x1c3RlcnMoZE1hdHJpeCwgY3V0b2ZmPTAuMTAsIG1ldGhvZD0iY29tcGxldGUiLCB2ZXJib3NlID0gVFJVRSkNCg0KY2x1c3RlcnMgPC0gZGF0YS5mcmFtZShjbHVzdGVycykNCnJvd25hbWVzKGNsdXMpIDwtIDE6MTAwDQpBZGQyREIoY2x1cywgQUEwX2RiKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KY29uU2VxcyA8LSBJZENvbnNlbnN1cyhBQTBfZGIsIHR5cGUgPSAiQUFTdHJpbmdTZXQiLCBjb2xOYW1lID0gImNsdXN0ZXIiLCB2ZXJib3NlID0gVFJVRSkNCiMgTkFNRSBUSEUgU0VRVUVOQ0VTIEJZIFRIRUlSIENMVVNURVIgTlVNQkVSDQpucyA8LSBsYXBwbHkoc3Ryc3BsaXQobmFtZXMoY29uU2VxcyksICJfIiwgZml4ZWQ9VFJVRSksICdbJywgMSkNCm5hbWVzKGNvblNlcXMpIDwtIGdzdWIoImNsdXN0ZXIiLCAiIiwgdW5saXN0KG5zKSwgZml4ZWQgPSBUUlVFKQ0KI29SREVSIFRIRSBTRVFVRU5DRVMgQlkgVEhFSVIgQ0xVU1RFUiBOVU1CRVINCm8gPC0gb3JkZXIoYXMubnVtZXJpYyhuYW1lcyhjb25TZXFzKSkpDQpjb25TZXFzIDwtIGNvblNlcXNbb10NCg0KYGBgDQoNCk5vdyBmb3IgdGhlIGFycmF5IGRlc2lnbiBhbmQgdmFsaWRhdGlvbiBzdGVwcw0KDQpgYGB7cn0NCg0KcHJvYmVzIDwtIERlc2lnbkFycmF5KGNvblNlcXMsIG1heFBlcm11dGF0aW9ucz0yLCBudW1Qcm9iZXMgPSAyMCx2ZXJib3NlID0gVFJVRSkNCg0KDQpgYGANCg0KDQpUcnkgdG8gdXNlIHRoZSBHZW5CYW5rIG51bWJlcnMgdG8gY2FsbCBOQ0JJIG51Y2xlb3RpZGUgc2VxdWVuY2VzOg0KDQpgYGB7cn0NCmxpYnJhcnkocmVudHJleikNCmxpYnJhcnkoc2VxaW5yKQ0KDQoNCmFwcF9nZW5lIDwtIGVudHJlel9zZWFyY2goZGI9InByb3RlaW4iLCB0ZXJtPSJBRlYyOTg1NS4xIikNCm51Y19saW5rcyA8LSBlbnRyZXpfbGluayhkYmZyb209InByb3RlaW4iLCBpZD1hcHBfZ2VuZSRpZHMsIGRiPSJudWNjb3JlIikNCm51Y19jYXp5IDwtIGVudHJlel9mZXRjaChkYj0ibnVjY29yZSIsIGlkPW51Y19saW5rcyRsaW5rcyRwcm90ZWluX251Y2NvcmUsIHJldHR5cGU9ImZhc3RhIikNCmNhdChzdHJ3cmFwKHN1YnN0cihudWNfY2F6eSwgMSwgMjAwKSksIHNlcD0iXG4iKQ0KDQp3cml0ZS5mYXN0YShudWNfY2F6eSwgbmFtZXMgPSAiQUZWMjk4NTUuMSIsIGZpbGUub3V0ID0gIkM6L1VzZXJzL2ZheXNtaXRoL09uZURyaXZlIC0gVW5pdmVyc2l0eSBvZiBBcmthbnNhcy9SIENvZGUvTmV3IERCIGZvciBwcm9iZS9udWNfY2F6eSIsDQogICAgICAgICAgICBvcGVuID0gImEiKQ0KDQoNCg0KZm9yKHggaW4gZGJfbmFtZXMpIA0KICB7DQogICAgZGJuYW1lIDwtIHBhc3RlKHgpDQogICAgDQogICAgICAgIGFwcF9nZW5lIDwtIGVudHJlel9zZWFyY2goZGI9InByb3RlaW4iLCB0ZXJtPWRibmFtZSwgdXNlX2hpc3Rvcnk9VFJVRSkNCiAgICAgICAgbnVjX2xpbmtzIDwtIGVudHJlel9saW5rKGRiZnJvbT0icHJvdGVpbiIsIGlkPWFwcF9nZW5lJGlkcywgZGI9Im51Y2NvcmUiLCBjbWQ9J25laWdoYm9yX2hpc3RvcnknKQ0KICAgICAgICBudWNfY2F6eSA8LSBlbnRyZXpfZmV0Y2goZGI9Im51Y2NvcmUiLCBpZD1udWNfbGlua3MkbGlua3MkcHJvdGVpbl9udWNjb3JlLCByZXR0eXBlPSJmYXN0YSIpDQogICAgICAgIGNhdChzdHJ3cmFwKHN1YnN0cihudWNfY2F6eSwgMSwgMjAwKSksIHNlcD0iXG4iKQ0KICAgICAgICANCiAgICB3cml0ZS5mYXN0YShudWNfY2F6eSwgbmFtZXMgPSBkYm5hbWUsIGZpbGUub3V0ID0gIkM6L1VzZXJzL2ZheXNtaXRoL09uZURyaXZlIC0gVW5pdmVyc2l0eSBvZiBBcmthbnNhcy9SIENvZGUvTmV3IERCIGZvciBwcm9iZS9udWNfY2F6eSIsIG9wZW4gPSAiYSIpDQogICAgDQogICAgU3lzLnNsZWVwKC41KQ0KICB9DQoNCnBhdGhfY2F6eV9udWMgPC0gIkM6L1VzZXJzL2ZheXNtaXRoL09uZURyaXZlIC0gVW5pdmVyc2l0eSBvZiBBcmthbnNhcy9SIENvZGUvTmV3IERCIGZvciBwcm9iZS9udWNfY2F6eSINCmNhenlfbnVjIDwtIHJlYWRBQVN0cmluZ1NldChwYXRoX2NhenlfbnVjKQ0KDQoNCg0KYGBgDQoNCg==