1 Annotation version: 20190205

1.1 Genome annotation input

There are a few methods of importing annotation data into R. The following are two attempts, the second is currently being used in these analyses.

1.2 OrganismDb

Since this document was originally written, I have made substantial changes to how I create, load, and manipulate the eupathdb annotation data. As a result, this needs to be significantly reworked.

AnnotationHub is the new and fancier version of what OrganismDb does. Keith already made these for the parasites though, lets try and use one of those.

Assuming the above packages got created, we may load them and extract the annotation data.

## Starting metadata download.
## Finished metadata download.
## Found the following hits: Leishmania major strain Friedlin, Leishmania major strain LV39c5, Leishmania major strain SD 75.1, choosing the first.
## org.Lmajor.Friedlin.v41.eg.db
## Starting metadata download.
## Finished metadata download.
## Found the following hits: Leishmania panamensis MHOM/COL/81/L13, Leishmania panamensis strain MHOM/PA/94/PSC-1, choosing the first.
## org.Lpanamensis.MHOMCOL81L13.v41.eg.db
## Starting metadata download.
## Finished metadata download.
## Found the following hits: Leishmania braziliensis MHOM/BR/75/M2903, Leishmania braziliensis MHOM/BR/75/M2904, choosing the first.
## org.Lbraziliensis.MHOMBR75M2903.v41.eg.db

1.4 Extracting Cell Types

Maria Adelaida requested adding the xCell cell types to the data.

##             Length Class             Mode     
## spill           3  -none-            list     
## spill.array     3  -none-            list     
## signatures    489  GeneSetCollection list     
## genes       10808  -none-            character
## Loading required package: annotate
## Loading required package: XML
## Loading required package: graph
## 
## Attaching package: 'graph'
## The following object is masked from 'package:XML':
## 
##     addNode
## setName: aDC%HPCA%1.txt 
## geneIds: C1QA, C1QB, ..., CCL22 (total: 8)
## geneIdType: Null
## collectionType: Null 
## setIdentifier: PEDS-092FVH8-LT:623:Tue Jun  6 14:36:33 2017:2
## description: 
## organism: 
## pubMedIds: 
## urls: 
## contributor: 
## setVersion: 0.0.1
## creationDate:
##  [1] "aDC%HPCA%1.txt"          "aDC%HPCA%2.txt"         
##  [3] "aDC%HPCA%3.txt"          "aDC%IRIS%1.txt"         
##  [5] "aDC%IRIS%2.txt"          "aDC%IRIS%3.txt"         
##  [7] "Adipocytes%ENCODE%1.txt" "Adipocytes%ENCODE%2.txt"
##  [9] "Adipocytes%ENCODE%3.txt" "Adipocytes%FANTOM%1.txt"
## [1] 5079    2
## [1] 5079    3
## [1] 5079    4
## [1] 5079    5
## [1] 5079    6
## [1] 5079    7
## [1] 5079    8
## [1] 5079    9
## [1] 5079   10
## [1] 5079   11
## [1] 5079   12
## [1] 5079   13
## [1] 5079   14
## [1] 5079   15
## [1] 5079   16
## [1] 5079   17
## [1] 5079   18
## [1] 5079   19
## [1] 5079   20
## [1] 5079   21
## [1] 5079   22
## [1] 5079   23
## [1] 5079   24
## [1] 5079   25
## [1] 5079   26
## [1] 5079   27
## [1] 5079   28
## [1] 5079   29
## [1] 5079   30
## [1] 5079   31
## [1] 5079   32
## [1] 5079   33
## [1] 5079   34
## [1] 5079   35
## [1] 5079   36
## [1] 5079   37
## [1] 5079   38
## [1] 5079   39
## [1] 5079   40
## [1] 5079   41
## [1] 5079   42
## [1] 5079   43
## [1] 5079   44
## [1] 5079   45
## [1] 5079   46
## [1] 5079   47
## [1] 5079   48
## [1] 5079   49
## [1] 5079   50
## [1] 5079   51
## [1] 5079   52
## [1] 5079   53
## [1] 5079   54
## [1] 5079   55
## [1] 5079   56
## [1] 5079   57
## [1] 5079   58
## [1] 5079   59
## [1] 5079   60
## [1] 5079   61
## [1] 5079   62
## [1] 5079   63
## [1] 5079   64
## [1] 5079   65
##      found aDC Adipocytes Astrocytes B-cells Basophils CD4+ memory T-cells
## A1CF     0  NA         NA         NA      NA        NA                  NA
##      CD4+ naive T-cells CD4+ T-cells CD4+ Tcm CD4+ Tem CD8+ naive T-cells
## A1CF                 NA           NA       NA       NA                 NA
##      CD8+ T-cells CD8+ Tcm CD8+ Tem cDC Chondrocytes
## A1CF           NA       NA       NA  NA           NA
##      Class-switched memory B-cells CLP CMP DC Endothelial cells
## A1CF                            NA  NA  NA NA                NA
##      Eosinophils Epithelial cells Erythrocytes Fibroblasts GMP Hepatocytes
## A1CF          NA               NA           NA          NA  NA        TRUE
##      HSC iDC Keratinocytes ly Endothelial cells Macrophages Macrophages M1
## A1CF  NA  NA            NA                   NA          NA             NA
##      Macrophages M2 Mast cells Megakaryocytes Melanocytes Memory B-cells
## A1CF             NA         NA             NA          NA             NA
##      MEP Mesangial cells Monocytes MPP MSC mv Endothelial cells Myocytes
## A1CF  NA              NA        NA  NA  NA                   NA       NA
##      naive B-cells Neurons Neutrophils NK cells NKT Osteoblast pDC
## A1CF            NA      NA          NA       NA  NA         NA  NA
##      Pericytes Plasma cells Platelets Preadipocytes pro B-cells Sebocytes
## A1CF        NA           NA        NA            NA          NA        NA
##      Skeletal muscle Smooth muscle Tgd cells Th1 cells Th2 cells Tregs
## A1CF              NA            NA        NA        NA        NA    NA
##  [ reached 'max' / getOption("max.print") -- omitted 5 rows ]

2 Putting the pieces together

The macrophage experiment has samples across 2 contexts, the host and parasite. The following block sets up one experiment for each. If you open the all_samples-species.xlsx files, you will note immediately that a few different attempts were made at ascertaining the most likely experimental factors that contributed to the readily apparent batch effects.

2.1 The human transcriptome mappings

Keep in mind that if I change the experimental design with new annotations, I must therefore regenerate the following.

sampleid pathogenstrain experimentname tubelabel alias condition batch anotherbatch snpclade snpcladev2 snpcladev3 pathogenstrain.1 label donor time pctmappedparasite pctcategory state sourcelab expperson pathogen host hostcelltype noofhostcells infectionperiodhpitimeofharvest moiexposure parasitespercell pctinf rnangul rnaqcpassed libraryconst libqcpassed index descriptonandremarks observation lowercaseid humanfile parasitefile file
HPGL0241 HPGL0241 none macrophage TM130-Nil (Blue label) Nil uninf a a undef undef undef none uninf_1 d130 undef undef 0 uninfected Ade Adriana none Human Human macs Max 2 mill 2h - 24h chase period NA unknown unknown 468 Y Wanderson Y 1 Uninfected human macrophages NA hpgl0241 preprocessing/hpgl0241/outputs/tophat_hsapiens/accepted_paired.count.xz undef null

2.2 The parasite transcriptome mappings

The first three rows of the parasite experimental design.
sampleid pathogenstrain experimentname tubelabel alias condition batch anotherbatch snpclade snpcladev2 snpcladev3 pathogenstrain.1 label donor time pctmappedparasite pctcategory state sourcelab expperson pathogen host hostcelltype noofhostcells infectionperiodhpitimeofharvest moiexposure parasitespercell pctinf rnangul rnaqcpassed libraryconst libqcpassed index descriptonandremarks observation lowercaseid humanfile parasitefile file
HPGL0242 HPGL0242 s2271 macrophage TM130-2271 Self-Healing sh a a white whitepink right s2271 sh_2271 d130 undef 30 3 self_heal Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 276 Y Wanderson Y 8 Infected human macrophages. NA hpgl0242 preprocessing/hpgl0242/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0242/outputs/tophat_lpanamensis/accepted_paired.count.xz null
HPGL0244 HPGL0244 s5433 macrophage TM130-5433 Chronic chr a a blue_self blue left s5433 chr_5433 d130 undef 15 1 chronic Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 261 Y Wanderson Y 27 Infected human macrophages NA hpgl0244 preprocessing/hpgl0244/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0244/outputs/tophat_lpanamensis/accepted_paired.count.xz null
HPGL0245 HPGL0245 s1320 macrophage TM130-1320 Chronic chr a a multicolor yellowbrownmulti right s1320 chr_1320 d130 undef 40 4 chronic Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 199 Y Wanderson Y 11 Infected human macrophages NA hpgl0245 preprocessing/hpgl0245/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0245/outputs/tophat_lpanamensis/accepted_paired.count.xz null

3 Supplemental Table 1

Table S1 is going to be a summary of the metadata in all_samples-combined This may also include some of the numbers regarding mapping %, etc.

Wanted columns:

  • Sample ID: HPGLxxxx
  • Donor Code: TM130 or PG1xx
  • Cell Type: Macrophage or PBMC
  • Infection Status: Infected or Uninfected
  • Disease Outcome: Chronic or Self-Healing or NA
  • Batch: A or B (macrophage); NA for PBMC
  • Number of reads that passed Illumina filter
  • Number of reads after trimming
  • Number of reads mapped - human
  • % reads mapped - human
  • Number of reads mapped - L.panamensis
  • % reads mapped - L.panamensis

Use the Tcruzi colors.

  • A1 is a large title: “Macrophage Samples”
  • Row 2 is the blue column headings
  • 3-m contains Macrophage metadata
  • m+1 is blank
  • m+2 is a large title: “PBMC Samples”
  • m+3-n contains PBMC metadata

4 End

At this point, we should have everything necessary to perform the various analyses of the 4 sub-experiments. So save the current data for reuse elsewhere.

The experimental design is available here.

## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 7ec7a093f7ee8293e7a5326cb8f77479341502a7
## This is hpgltools commit: Thu Feb 7 16:10:02 2019 -0500: 7ec7a093f7ee8293e7a5326cb8f77479341502a7
## Saving to 01_annotation_20190205-v20190205.rda.xz
## The savefile is: /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20190205-v20190205.rda.xz
## Renaming /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20190205-v20190205.rda.xz to /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20190205-v20190205.rda.xz.01.
## The save string is: con <- pipe(paste0('pxz -T6 > /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20190205-v20190205.rda.xz'), 'wb'); save(list=ls(all.names=TRUE, envir=globalenv()),
##      envir=globalenv(), file=con, compress=FALSE); close(con)

R version 3.5.2 (2018-12-20)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.utf8, LC_NUMERIC=C, LC_TIME=en_US.utf8, LC_COLLATE=en_US.utf8, LC_MONETARY=en_US.utf8, LC_MESSAGES=en_US.utf8, LC_PAPER=en_US.utf8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.utf8 and LC_IDENTIFICATION=C

attached base packages: stats4, parallel, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: Homo.sapiens(v.1.3.1), TxDb.Hsapiens.UCSC.hg19.knownGene(v.3.2.2), org.Hs.eg.db(v.3.7.0), GO.db(v.3.7.0), OrganismDbi(v.1.24.0), GenomicFeatures(v.1.34.1), GenomicRanges(v.1.34.0), GenomeInfoDb(v.1.18.1), GSEABase(v.1.44.0), graph(v.1.60.0), annotate(v.1.60.0), XML(v.3.98-1.16), xCell(v.1.1.0), org.Lbraziliensis.MHOMBR75M2903.v38.eg.db(v.2018.08), org.Lpanamensis.MHOMCOL81L13.v38.eg.db(v.2018.08), org.Lmajor.Friedlin.v38.eg.db(v.2018.08), AnnotationDbi(v.1.44.0), IRanges(v.2.16.0), S4Vectors(v.0.20.1), AnnotationHub(v.2.14.2), hpgltools(v.2018.11), Biobase(v.2.42.0) and BiocGenerics(v.0.28.0)

loaded via a namespace (and not attached): tidyselect(v.0.2.5), lme4(v.1.1-19), RSQLite(v.2.1.1), grid(v.3.5.2), BiocParallel(v.1.16.5), devtools(v.2.0.1), munsell(v.0.5.0), codetools(v.0.2-16), units(v.0.6-2), withr(v.2.1.2), colorspace(v.1.4-0), GOSemSim(v.2.8.0), highr(v.0.7), knitr(v.1.21), rstudioapi(v.0.9.0), DOSE(v.3.8.2), labeling(v.0.3), urltools(v.1.7.1), GenomeInfoDbData(v.1.2.0), bit64(v.0.9-7), farver(v.1.1.0), rprojroot(v.1.3-2), xfun(v.0.4), R6(v.2.3.0), doParallel(v.1.0.14), bitops(v.1.0-6), fgsea(v.1.8.0), gridGraphics(v.0.3-0), DelayedArray(v.0.8.0), assertthat(v.0.2.0), promises(v.1.0.1), scales(v.1.0.0), ggraph(v.1.0.2), enrichplot(v.1.2.0), gtable(v.0.2.0), sva(v.3.30.1), processx(v.3.2.1), rlang(v.0.3.1), genefilter(v.1.64.0), splines(v.3.5.2), rtracklayer(v.1.42.1), lazyeval(v.0.2.1), europepmc(v.0.3), BiocManager(v.1.30.4), yaml(v.2.2.0), reshape2(v.1.4.3), backports(v.1.1.3), httpuv(v.1.4.5.1), qvalue(v.2.14.1), RBGL(v.1.58.1), clusterProfiler(v.3.10.1), tools(v.3.5.2), usethis(v.1.4.0), ggplotify(v.0.0.3), ggplot2(v.3.1.0), gplots(v.3.0.1), RColorBrewer(v.1.1-2), sessioninfo(v.1.1.1), ggridges(v.0.5.1), Rcpp(v.1.0.0), plyr(v.1.8.4), base64enc(v.0.1-3), progress(v.1.2.0), zlibbioc(v.1.28.0), purrr(v.0.2.5), RCurl(v.1.95-4.11), ps(v.1.3.0), prettyunits(v.1.0.2), viridis(v.0.5.1), cowplot(v.0.9.4), SummarizedExperiment(v.1.12.0), ggrepel(v.0.8.0), colorRamps(v.2.3), fs(v.1.2.6), variancePartition(v.1.12.1), magrittr(v.1.5), data.table(v.1.12.0), openxlsx(v.4.1.0), DO.db(v.2.9), triebeard(v.0.3.0), packrat(v.0.5.0), matrixStats(v.0.54.0), pkgload(v.1.0.2), hms(v.0.4.2), mime(v.0.6), evaluate(v.0.12), GSVA(v.1.30.0), xtable(v.1.8-3), pbkrtest(v.0.4-7), gridExtra(v.2.3), testthat(v.2.0.1), compiler(v.3.5.2), biomaRt(v.2.38.0), tibble(v.2.0.1), KernSmooth(v.2.23-15), crayon(v.1.3.4), minqa(v.1.2.4), htmltools(v.0.3.6), mgcv(v.1.8-26), later(v.0.7.5.9000), tidyr(v.0.8.2), geneplotter(v.1.60.0), DBI(v.1.0.0), tweenr(v.1.0.1), MASS(v.7.3-51.1), Matrix(v.1.2-15), cli(v.1.0.1), gdata(v.2.18.0), bindr(v.0.1.1), igraph(v.1.2.2), pkgconfig(v.2.0.2), rvcheck(v.0.1.3), GenomicAlignments(v.1.18.1), xml2(v.1.2.0), foreach(v.1.4.4), XVector(v.0.22.0), rvest(v.0.3.2), stringr(v.1.3.1), callr(v.3.1.1), digest(v.0.6.18), pracma(v.2.2.2), Biostrings(v.2.50.2), EuPathDB(v.1.0.1), rmarkdown(v.1.11), fastmatch(v.1.1-0), curl(v.3.3), shiny(v.1.2.0), Rsamtools(v.1.34.0), gtools(v.3.8.1), nloptr(v.1.2.1), nlme(v.3.1-137), jsonlite(v.1.6), bindrcpp(v.0.2.2), desc(v.1.2.0), viridisLite(v.0.3.0), limma(v.3.38.3), pillar(v.1.3.1), lattice(v.0.20-38), httr(v.1.4.0), pkgbuild(v.1.0.2), survival(v.2.43-3), interactiveDisplayBase(v.1.20.0), glue(v.1.3.0), remotes(v.2.0.2), zip(v.1.0.0), UpSetR(v.1.3.3), shinythemes(v.1.1.2), iterators(v.1.0.10), pander(v.0.6.3), bit(v.1.1-14), ggforce(v.0.1.3), stringi(v.1.2.4), blob(v.1.1.1), caTools(v.1.17.1.1), memoise(v.1.1.0) and dplyr(v.0.7.8)

LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDE4MDgyMjogQW5ub3RhdGlvbiBkYXRhLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldCh3aWR0aD0xMjAsCiAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBtYXgucHJpbnQ9MTIwLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQp2ZXIgPC0gIjIwMTkwMjA1IgpwcmV2aW91c19maWxlIDwtICJpbmRleC5SbWQiCgp0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKSkKcm1kX2ZpbGUgPC0gIjAxX2Fubm90YXRpb25fMjAxOTAyMDUuUm1kIgpgYGAKCiMgQW5ub3RhdGlvbiB2ZXJzaW9uOiBgciB2ZXJgCgojIyBHZW5vbWUgYW5ub3RhdGlvbiBpbnB1dAoKVGhlcmUgYXJlIGEgZmV3IG1ldGhvZHMgb2YgaW1wb3J0aW5nIGFubm90YXRpb24gZGF0YSBpbnRvIFIuICBUaGUgZm9sbG93aW5nIGFyZQp0d28gYXR0ZW1wdHMsIHRoZSBzZWNvbmQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgaW4gdGhlc2UgYW5hbHlzZXMuCgojIyMgQW5ub3RhdGlvbkh1YgoKQW5ub3RhdGlvbkh1YiBpcyBhIG5ld2VyIHNlcnZpY2UgYW5kIGhhcyBwcm9taXNlIHRvIGJlIGFuIGV4Y2VsbGVudCB0b3AtbGV2ZWwKcmVzb3VyY2UgZm9yIGdhdGhlcmluZyBhbm5vdGF0aW9uIGRhdGEuCgpgYGB7ciBkYXRhX2lucHV0X2dlbm9tZX0KdHQgPC0gc20obGlicmFyeShBbm5vdGF0aW9uSHViKSkKYWggPC0gc20oQW5ub3RhdGlvbkh1YigpKQpvcmdkYnMgPC0gcXVlcnkoYWgsICJPcmdEQiIpCmFubm90X2xtIDwtIHF1ZXJ5KGFoLCBjKCJPcmdEQiIsICJGcmllZGxpbiIpKQpsbV9uYW1lIDwtIG5hbWVzKGFubm90X2xtKQphbm5vdF9sbSA8LSBzbShhbm5vdF9sbVtbbG1fbmFtZVtbMl1dXV0pCnR4dGRicyA8LSBxdWVyeShhaCwgIlR4RGIiKQoKIyMgQUg0ODQyOSBhcHBlYXJzIHRvIGJlIHBhbmFtZW5zaXMKIyNhbm5vdF9scCA8LSBhbm5vdF9scFtbIkFINDg0MjkiXV0KYW5ub3RfbHAgPC0gcXVlcnkoYWgsIGMoIk9yZ0RCIiwgInBhbmFtZW5zaXMiKSkKbHBfbmFtZSA8LSBuYW1lcyhhbm5vdF9scCkKYW5ub3RfbHAgPC0gc20oYW5ub3RfbHBbW2xwX25hbWVbWzJdXV1dKQpgYGAKCiMjIE9yZ2FuaXNtRGIKClNpbmNlIHRoaXMgZG9jdW1lbnQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiwgSSBoYXZlIG1hZGUgc3Vic3RhbnRpYWwgY2hhbmdlcyB0bwpob3cgSSBjcmVhdGUsIGxvYWQsIGFuZCBtYW5pcHVsYXRlIHRoZSBldXBhdGhkYiBhbm5vdGF0aW9uIGRhdGEuICBBcyBhIHJlc3VsdCwKdGhpcyBuZWVkcyB0byBiZSBzaWduaWZpY2FudGx5IHJld29ya2VkLgoKQW5ub3RhdGlvbkh1YiBpcyB0aGUgbmV3IGFuZCBmYW5jaWVyIHZlcnNpb24gb2Ygd2hhdCBPcmdhbmlzbURiIGRvZXMuICBLZWl0aAphbHJlYWR5IG1hZGUgdGhlc2UgZm9yIHRoZSBwYXJhc2l0ZXMgdGhvdWdoLCBsZXRzIHRyeSBhbmQgdXNlIG9uZSBvZiB0aG9zZS4KCmBgYHtyIG1ha2Vfb3JnZGIsIGV2YWw9RkFMU0V9CnRyaXRyeXBfbWV0YWRhdGEgPC0gRXVQYXRoREI6OmRvd25sb2FkX2V1cGF0aF9tZXRhZGF0YSh3ZWJzZXJ2aWNlPSJ0cml0cnlwZGIiKQp0ZXN0aW5nX3BhbmFtZW5zaXMgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2FuaXNtZGJpKCJwYW5hbWVuc2lzIikKdGVzdGluZ19icmF6aWxpZW5zaXMgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2FuaXNtZGJpKCJicmF6aWxpZW5zaXMiKQp0ZXN0aW5nX2Rvbm92YW5pIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgiZG9ub3ZhbmkiKQp0ZXN0aW5nX21leGljYW5hIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgibWV4aWNhbmEiKQp0ZXN0aW5nX21ham9yIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgibWFqb3IiKQp0ZXN0aW5nX2NyaXRoIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgiQ3JpdCIsIG1ldGFkYXRhPXRyaXRyeXBfbWV0YWRhdGEpCmBgYAoKQXNzdW1pbmcgdGhlIGFib3ZlIHBhY2thZ2VzIGdvdCBjcmVhdGVkLCB3ZSBtYXkgbG9hZCB0aGVtIGFuZCBleHRyYWN0IHRoZQphbm5vdGF0aW9uIGRhdGEuCgpgYGB7ciBscGFuYW1lbnNpc19vcmdkYn0KdHJpdHJ5cF9tZXRhZGF0YSA8LSBFdVBhdGhEQjo6ZG93bmxvYWRfZXVwYXRoX21ldGFkYXRhKHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCm1ham9yX25hbWVzIDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX3BrZ25hbWVzKCJtYWpvciIpCm1ham9yX25hbWVzJG9yZ2RiCgp3YW50ZWRfZmllbGRzIDwtIGMoImFubm90X2Nkc19sZW5ndGgiLCAiYW5ub3RfY2hyb21vc29tZSIsICJhbm5vdF9nZW5lX2VudHJlel9pZCIsCiAgICAgICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV9uYW1lIiwgImFubm90X3N0cmFuZCIsICJnaWQiLCAiZ29fZ29faWQiLAogICAgICAgICAgICAgICAgICAgImdvX2dvX3Rlcm1fbmFtZSIsICJnb19vbnRvbG9neSIsCiAgICAgICAgICAgICAgICAgICAiaW50ZXJwcm9fZGVzY3JpcHRpb24iICwiaW50ZXJwcm9fZV92YWx1ZSIsICJ0eXBlX2dlbmVfdHlwZSIpCgpvbGRfbmFtZSA8LSAib3JnLkxtYWpvci5GcmllZGxpbi52MzguZWcuZGIiCmxtX29yZyA8LSBzbShFdVBhdGhEQjo6bG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhvbGRfbmFtZSwga2V5dHlwZT0iZ2lkIiwgZmllbGRzPXdhbnRlZF9maWVsZHMpKQoKcGFuYW1lbnNpc19uYW1lcyA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9wa2duYW1lcygicGFuYW1lbnNpcyIpCnBhbmFtZW5zaXNfbmFtZXMkb3JnZGIKb2xkX25hbWUgPC0gIm9yZy5McGFuYW1lbnNpcy5NSE9NQ09MODFMMTMudjM4LmVnLmRiIgpscF9vcmcgPC0gc20oRXVQYXRoREI6OmxvYWRfb3JnZGJfYW5ub3RhdGlvbnMob2xkX25hbWUsIGtleXR5cGU9ImdpZCIsIGZpZWxkcz13YW50ZWRfZmllbGRzKSkKCmJyYXppbGllbnNpc19uYW1lcyA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9wa2duYW1lcygiYnJhemlsaWVuc2lzIikKYnJhemlsaWVuc2lzX25hbWVzJG9yZ2RiCm9sZF9uYW1lIDwtICJvcmcuTGJyYXppbGllbnNpcy5NSE9NQlI3NU0yOTAzLnYzOC5lZy5kYiIKbGJfb3JnIDwtIHNtKEV1UGF0aERCOjpsb2FkX29yZ2RiX2Fubm90YXRpb25zKG9sZF9uYW1lLCBrZXl0eXBlPSJnaWQiLCBmaWVsZHM9d2FudGVkX2ZpZWxkcykpCgojI2Rvbm92YW5pX25hbWVzIDwtIGdldF9ldXBhdGhfcGtnbmFtZXMoImRvbm92YW5pIikKIyNkb25vdmFuaV9uYW1lcyRvcmdkYgojI2xkX29yZyA8LSBsb2FkX29yZ2RiX2Fubm90YXRpb25zKGRvbm92YW5pX25hbWVzJG9yZ2RiLCBrZXl0eXBlPSJnaWQiLCBmaWVsZHM9d2FudGVkX2ZpZWxkcykKIyMKIyNtZXhpY2FuYV9uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKCJtZXhpY2FuYSIpCiMjbWV4aWNhbmFfbmFtZXMkb3JnZGIKIyNsbWV4X29yZyA8LSBsb2FkX29yZ2RiX2Fubm90YXRpb25zKG1leGljYW5hX25hbWVzJG9yZ2RiLCBrZXl0eXBlPSJnaWQiLCBmaWVsZHM9d2FudGVkX2ZpZWxkcykKIyMKIyNmYXNjaWN1bGF0YV9uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKCJyaXRoaWRpYSIsIG1ldGFkYXRhPXRyaXRyeXBfbWV0YWRhdGEpCiMjZmFzY2ljdWxhdGFfbmFtZXMkb3JnZGIKIyNjZl9vcmcgPC0gbG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhmYXNjaWN1bGF0YV9uYW1lcyRvcmdkYiwga2V5dHlwZT0iZ2lkIiwgZmllbGRzPXdhbnRlZF9maWVsZHMpCmBgYAoKIyMgUmVhZCBhIGdmZiBmaWxlCgpJbiBjb250cmFzdCwgaXQgaXMgcG9zc2libGUgdG8gbG9hZCBtb3N0IGFubm90YXRpb25zIG9mIGludGVyZXN0IGRpcmVjdGx5IGZyb20KdGhlIGdmZiBmaWxlcyB1c2VkIGluIHRoZSBhbGlnbm1lbnRzLiAgTW9yZSBpbi1kZXB0aCBpbmZvcm1hdGlvbiBmb3IgdGhlIGh1bWFuCnRyYW5zY3JpcHRvbWUgbWF5IGJlIGV4dHJhY3RlZCBmcm9tIGJpb21hcnQuCgpgYGB7ciBnZW5vbWVfaW5wdXR9CiMjIFRoZSBvbGQgd2F5IG9mIGdldHRpbmcgZ2Vub21lL2Fubm90YXRpb24gZGF0YQpscF9nZmYgPC0gInJlZmVyZW5jZS9scGFuYW1lbnNpcy5nZmYiCmxiX2dmZiA8LSAicmVmZXJlbmNlL2xicmF6aWxpZW5zaXMuZ2ZmIgpoc19nZmYgPC0gInJlZmVyZW5jZS9oc2FwaWVucy5ndGYiCgpscF9mYXN0YSA8LSAicmVmZXJlbmNlL2xwYW5hbWVuc2lzLmZhc3RhLnh6IgpsYl9mYXN0YSA8LSAicmVmZXJlbmNlL2xicmF6aWxpZW5zaXMuZmFzdGEueHoiCmhzX2Zhc3RhIDwtICJyZWZlcmVuY2UvaHNhcGllbnMuZmFzdGEueHoiCgpscF9hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhscF9nZmYsIHR5cGU9ImdlbmUiKSkKcm93bmFtZXMobHBfYW5ub3RhdGlvbnMpIDwtIHBhc3RlMCgiZXhvbl8iLCBscF9hbm5vdGF0aW9ucyR3ZWJfaWQsICIuMSIpCgpsYl9hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhsYl9nZmYsIHR5cGU9ImdlbmUiKSkKaHNfZ2ZmX2Fubm90IDwtIHNtKGxvYWRfZ2ZmX2Fubm90YXRpb25zKGhzX2dmZiwgaWRfY29sPSJnZW5lX2lkIikpCgpoc19hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoKSkkYW5ub3RhdGlvbgpoc19hbm5vdGF0aW9ucyRJRCA8LSBoc19hbm5vdGF0aW9ucyRnZW5lSUQKcm93bmFtZXMoaHNfYW5ub3RhdGlvbnMpIDwtIG1ha2UubmFtZXMoaHNfYW5ub3RhdGlvbnNbWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQpkaW0oaHNfYW5ub3RhdGlvbnMpCgpscF9zaXplX2Rpc3QgPC0gcGxvdF9oaXN0b2dyYW0obHBfYW5ub3RhdGlvbnNbWyJ3aWR0aCJdXSkKbHBfc2l6ZV9kaXN0CmhzX3NpemVfZGlzdCA8LSBwbG90X2hpc3RvZ3JhbShoc19hbm5vdGF0aW9uc1tbImNkc19sZW5ndGgiXV0pCmhzX3NpemVfZGlzdCArCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAsIDIwMDAwKSkKYGBgCgojIyBFeHRyYWN0aW5nIENlbGwgVHlwZXMKCk1hcmlhIEFkZWxhaWRhIHJlcXVlc3RlZCBhZGRpbmcgdGhlIHhDZWxsIGNlbGwgdHlwZXMgdG8gdGhlIGRhdGEuCgpgYGB7ciB4Q2VsbF9kYXRhfQpsaWJyYXJ5KHhDZWxsKQpkYXRhKCJ4Q2VsbC5kYXRhIiwgcGFja2FnZT0ieENlbGwiKQpzdW1tYXJ5KHhDZWxsLmRhdGEpCmxpYnJhcnkoR1NFQUJhc2UpCmRldGFpbHMoeENlbGwuZGF0YSRzaWduYXR1cmVzW1sxXV0pCgpzaWdzIDwtIHhDZWxsLmRhdGEkc2lnbmF0dXJlcwpoZWFkKG5hbWVzKHNpZ3MpLCBuPTEwKQojIyBIZXJlIHdlIHNlZSB0aGF0IHRoZSBzaWduYXR1cmVzIGFyZSBlbmNvZGVkIGFzIDMgZWxlbWVudCBsaXN0cywgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlCiMjIGNlbGwgdHlwZSwgZm9sbG93ZWQgYnkgc291cmNlLCBmb2xsb3dlZCBieSByZXBsaWNhdGUudHh0LgpjZWxsX3R5cGVzIDwtIHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoeD1uYW1lcyhzaWdzKSwgc3BsaXQ9IiUiKSwgZnVuY3Rpb24oeCkgeyB4W1sxXV0gfSkpCmNlbGxfc291cmNlcyA8LSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KHg9bmFtZXMoc2lncyksIHNwbGl0PSIlIiksIGZ1bmN0aW9uKHgpIHsgeFtbMl1dIH0pKQp0eXBlX2ZhY3QgPC0gYXMuZmFjdG9yKGNlbGxfdHlwZXMpCnR5cGVzIDwtIGxldmVscyh0eXBlX2ZhY3QpCgpjZWxsdHlwZXNfdG9fZ2VuZXMgPC0gbGlzdCgpCmZvciAoYyBpbiAxOmxlbmd0aCh0eXBlcykpIHsKICB0eXBlIDwtIHR5cGVzW2NdCiAgaWR4IDwtIGNlbGxfdHlwZXMgPT0gdHlwZQogIHNldCA8LSBzaWdzW2lkeF0KICBnZW5lcyA8LSBzZXQgJT4lCiAgICBnZW5lSWRzKCkgJT4lCiAgICB1bmxpc3QoKQogIGNlbGx0eXBlc190b19nZW5lc1tbdHlwZV1dIDwtIGFzLmNoYXJhY3RlcihnZW5lcykKfQpnZW5lc190b19jZWxsdHlwZXMgPC0gQmlvYmFzZTo6cmV2ZXJzZVNwbGl0KGNlbGx0eXBlc190b19nZW5lcykKCmcyY19kZiA8LSBkYXRhLmZyYW1lKHJvdy5uYW1lcz11bmlxdWUobmFtZXMoZ2VuZXNfdG9fY2VsbHR5cGVzKSkpCmcyY19kZltbImZvdW5kIl1dIDwtIDAKZm9yIChjIGluIDE6bGVuZ3RoKGNlbGx0eXBlc190b19nZW5lcykpIHsKICBjZWxsdHlwZV9uYW1lIDwtIG5hbWVzKGNlbGx0eXBlc190b19nZW5lcylbW2NdXQogIGNlbGx0eXBlX2NvbHVtbiA8LSBhcy5kYXRhLmZyYW1lKGNlbGx0eXBlc190b19nZW5lc1tbY11dKQogIGNvbG5hbWVzKGNlbGx0eXBlX2NvbHVtbikgPC0gY2VsbHR5cGVfbmFtZQogIHJvd25hbWVzKGNlbGx0eXBlX2NvbHVtbikgPC0gbWFrZS5uYW1lcyhjZWxsdHlwZV9jb2x1bW5bWzFdXSwgdW5pcXVlPVRSVUUpCiAgY2VsbHR5cGVfY29sdW1uW1sxXV0gPC0gVFJVRQogIGcyY19kZiA8LSBtZXJnZShnMmNfZGYsIGNlbGx0eXBlX2NvbHVtbiwgYnk9InJvdy5uYW1lcyIsIGFsbC54PVRSVUUpCiAgcm93bmFtZXMoZzJjX2RmKSA8LSBnMmNfZGZbWzFdXQogIGcyY19kZiA8LSBnMmNfZGZbLCAtMV0KICBwcmludChkaW0oZzJjX2RmKSkKfQpoZWFkKGcyY19kZikKbmFfaWR4IDwtIGlzLm5hKGcyY19kZikKZzJjX2RmW25hX2lkeF0gPC0gRkFMU0UKYGBgCgojIyBHZXR0aW5nIG9udG9sb2d5IGRhdGEKCkFubm90YXRpb24gZm9yIGdlbmUgb250b2xvZ2llcyBtYXkgYmUgZ2F0aGVyZWQgZnJvbSBhIHNpbWlsYXJseSBsYXJnZSBudW1iZXIgb2YKc291cmNlcy4gVGhlIGZvbGxvd2luZyBhcmUgYSBjb3VwbGUuCgpgYGB7ciBvbnRvbG9neX0KIyMgVHJ5IHVzaW5nIGJpb21hcnQKaHNfZ29fYmlvbWFydCA8LSBzbShsb2FkX2Jpb21hcnRfZ28oKSkKIyMgb3IgdGhlIG9yZy5Icy5lZy5kYiBzcWxpdGUgZGF0YWJhc2UKdHQgPC0gc20obGlicmFyeSgiSG9tby5zYXBpZW5zIikpCmhzIDwtIEhvbW8uc2FwaWVucwojI2hzX2dvX2Vuc2VtYmwgPC0gbG9hZF9vcmdkYl9nbyhocywgaHNfYW5ub3RhdGlvbnMkZ2VuZUlEKQojI2RpbShoc19nb19iaW9tYXJ0KQojI2RpbShoc19nb19lbnNlbWJsKQojI2hzX2dvaWRzIDwtIGhzX2dvX2Jpb21hcnQKCiMjIFdoaWxlIHRlc3RpbmcsIEkgY2FsbGVkIHRoaXMgZGVzYywgdGhhdCB3aWxsIG5lZWQgdG8gY2hhbmdlLgojI2xwX3Rvb2x0aXBzIDwtIG1ha2VfdG9vbHRpcHMobHBfYW5ub3RhdGlvbnMpCiMjbGJfdG9vbHRpcHMgPC0gbWFrZV90b29sdGlwcyhsYl9hbm5vdGF0aW9ucykKCmxwX2xlbmd0aHMgPC0gbHBfYW5ub3RhdGlvbnNbLCBjKCJJRCIsICJ3aWR0aCIpXQpsYl9sZW5ndGhzIDwtIGxiX2Fubm90YXRpb25zWywgYygiSUQiLCAid2lkdGgiKV0KaHNfbGVuZ3RocyA8LSBoc19hbm5vdGF0aW9uc1ssIGMoImVuc2VtYmxfZ2VuZV9pZCIsICJjZHNfbGVuZ3RoIildCmNvbG5hbWVzKGhzX2xlbmd0aHMpIDwtIGMoIklEIiwgIndpZHRoIikKCmxwX2dvaWRzIDwtIHJlYWQuY3N2KGZpbGU9InJlZmVyZW5jZS9scGFuX2dvLnR4dC54eiIsIHNlcD0iXHQiLCBoZWFkZXI9RkFMU0UpCmxiX2dvaWRzIDwtIHJlYWQuY3N2KGZpbGU9InJlZmVyZW5jZS9sYnJhel9nby50eHQueHoiLCBzZXA9Ilx0IiwgaGVhZGVyPUZBTFNFKQpjb2xuYW1lcyhscF9nb2lkcykgPC0gYygiSUQiLCJHTyIsIm9udCIsIm5hbWUiLCJzb3VyY2UiLCJ0YWciKQpjb2xuYW1lcyhsYl9nb2lkcykgPC0gYygiSUQiLCJHTyIsIm9udCIsIm5hbWUiLCJzb3VyY2UiLCJ0YWciKQpgYGAKCiMgUHV0dGluZyB0aGUgcGllY2VzIHRvZ2V0aGVyCgpUaGUgbWFjcm9waGFnZSBleHBlcmltZW50IGhhcyBzYW1wbGVzIGFjcm9zcyAyIGNvbnRleHRzLCB0aGUgaG9zdCBhbmQgcGFyYXNpdGUuClRoZSBmb2xsb3dpbmcgYmxvY2sgc2V0cyB1cCBvbmUgZXhwZXJpbWVudCBmb3IgZWFjaC4gIElmIHlvdSBvcGVuIHRoZQphbGxfc2FtcGxlcy1zcGVjaWVzLnhsc3ggZmlsZXMsIHlvdSB3aWxsIG5vdGUgaW1tZWRpYXRlbHkgdGhhdCBhIGZldyBkaWZmZXJlbnQKYXR0ZW1wdHMgd2VyZSBtYWRlIGF0IGFzY2VydGFpbmluZyB0aGUgbW9zdCBsaWtlbHkgZXhwZXJpbWVudGFsIGZhY3RvcnMgdGhhdApjb250cmlidXRlZCB0byB0aGUgcmVhZGlseSBhcHBhcmVudCBiYXRjaCBlZmZlY3RzLgoKIyMgVGhlIGh1bWFuIHRyYW5zY3JpcHRvbWUgbWFwcGluZ3MKCktlZXAgaW4gbWluZCB0aGF0IGlmIEkgY2hhbmdlIHRoZSBleHBlcmltZW50YWwgZGVzaWduIHdpdGggbmV3IGFubm90YXRpb25zLCBJCm11c3QgdGhlcmVmb3JlIHJlZ2VuZXJhdGUgdGhlIGZvbGxvd2luZy4KCmBgYHtyIGhzX2V4cHR9CmhzX2ZpbmFsX2Fubm90YXRpb25zIDwtIGhzX2Fubm90YXRpb25zCmhzX2ZpbmFsX2Fubm90YXRpb25zIDwtIGhzX2ZpbmFsX2Fubm90YXRpb25zWywgYygiZW5zZW1ibF90cmFuc2NyaXB0X2lkIiwgImVuc2VtYmxfZ2VuZV9pZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iLCAiZ2VuZV9iaW90eXBlIildCmhzX2ZpbmFsX2Fubm90YXRpb25zJHJuIDwtIHJvd25hbWVzKGhzX2ZpbmFsX2Fubm90YXRpb25zKQpub3RlIDwtICJOZXcgZXhwZXJpbWVudGFsIGRlc2lnbiBmYWN0b3JzIGJ5IHNucCBhZGRlZCAyMDE2LTA5LTIwIgpoc19maW5hbF9hbm5vdGF0aW9ucyA8LSBtZXJnZShoc19maW5hbF9hbm5vdGF0aW9ucywgZzJjX2RmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieS54PSJoZ25jX3N5bWJvbCIsIGJ5Lnk9InJvdy5uYW1lcyIsIGFsbC54PVRSVUUpCnJvd25hbWVzKGhzX2ZpbmFsX2Fubm90YXRpb25zKSA8LSBoc19maW5hbF9hbm5vdGF0aW9ucyRybgpoc19maW5hbF9hbm5vdGF0aW9ucyRybiA8LSBOVUxMCm5hX2lkeCA8LSBpcy5uYShoc19maW5hbF9hbm5vdGF0aW9ucyR4Y2VsbF90eXBlcykKaHNfZmluYWxfYW5ub3RhdGlvbnNbbmFfaWR4LCAieGNlbGxfdHlwZXMiXSA8LSAiIgoKaHNfZXhwdCA8LSBzbShjcmVhdGVfZXhwdCgic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy1jb21iaW5lZC54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89aHNfZmluYWxfYW5ub3RhdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW49Imh1bWFuZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZXM9bm90ZSkpCmhzX2Fubm90YXRpb25zIDwtIGZEYXRhKGhzX2V4cHQpCnVuZGVmX2lkeCA8LSBoc19hbm5vdGF0aW9ucyA9PSAidW5kZWZpbmVkIgpoc19hbm5vdGF0aW9uc1t1bmRlZl9pZHhdIDwtIEZBTFNFCmZEYXRhKGhzX2V4cHRbWyJleHByZXNzaW9uc2V0Il1dKSA8LSBoc19hbm5vdGF0aW9ucwoKa25pdHI6OmthYmxlKGhlYWQoaHNfZXhwdCRkZXNpZ24sIG49MSkpCgpjZHNfZW50cmllcyA8LSBmRGF0YShoc19leHB0KQpjZHNfZW50cmllcyA8LSBjZHNfZW50cmllc1tbImdlbmVfYmlvdHlwZSJdXSA9PSAicHJvdGVpbl9jb2RpbmciCmhzX2Nkc19leHB0IDwtIGhzX2V4cHQKaHNfY2RzX2V4cHQkZXhwcmVzc2lvbnNldCA8LSBoc19jZHNfZXhwdCRleHByZXNzaW9uc2V0W2Nkc19lbnRyaWVzLCBdCm5ld19jZHNfZW50cmllcyA8LSBmRGF0YShoc19jZHNfZXhwdCkKYGBgCgojIyBUaGUgcGFyYXNpdGUgdHJhbnNjcmlwdG9tZSBtYXBwaW5ncwoKYGBge3IgcGFyYXNpdGVfZXhwdH0KcGFyYXNpdGVfZXhwdCA8LSBzbShjcmVhdGVfZXhwdCgic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy1jb21iaW5lZC54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89bHBfYW5ub3RhdGlvbnMsIGZpbGVfY29sdW1uPSJwYXJhc2l0ZWZpbGUiKSkKa25pdHI6OmthYmxlKGhlYWQocGFyYXNpdGVfZXhwdCRkZXNpZ24sIG49MyksCiAgICAgICAgICAgICBjYXB0aW9uPSJUaGUgZmlyc3QgdGhyZWUgcm93cyBvZiB0aGUgcGFyYXNpdGUgZXhwZXJpbWVudGFsIGRlc2lnbi4iKQpgYGAKCiMgU3VwcGxlbWVudGFsIFRhYmxlIDEKClRhYmxlIFMxIGlzIGdvaW5nIHRvIGJlIGEgc3VtbWFyeSBvZiB0aGUgbWV0YWRhdGEgaW4gYWxsX3NhbXBsZXMtY29tYmluZWQKVGhpcyBtYXkgYWxzbyBpbmNsdWRlIHNvbWUgb2YgdGhlIG51bWJlcnMgcmVnYXJkaW5nIG1hcHBpbmcgJSwgZXRjLgoKV2FudGVkIGNvbHVtbnM6CgoqIFNhbXBsZSBJRDogIEhQR0x4eHh4CiogRG9ub3IgQ29kZTogVE0xMzAgb3IgUEcxeHgKKiBDZWxsIFR5cGU6ICBNYWNyb3BoYWdlIG9yIFBCTUMKKiBJbmZlY3Rpb24gU3RhdHVzOiAgSW5mZWN0ZWQgb3IgVW5pbmZlY3RlZAoqIERpc2Vhc2UgT3V0Y29tZTogIENocm9uaWMgb3IgU2VsZi1IZWFsaW5nIG9yIE5BCiogQmF0Y2g6IEEgb3IgQiAobWFjcm9waGFnZSk7IE5BIGZvciBQQk1DCiogTnVtYmVyIG9mIHJlYWRzIHRoYXQgcGFzc2VkIElsbHVtaW5hIGZpbHRlcgoqIE51bWJlciBvZiByZWFkcyBhZnRlciB0cmltbWluZwoqIE51bWJlciBvZiByZWFkcyBtYXBwZWQgLSBodW1hbgoqICUgcmVhZHMgbWFwcGVkIC0gaHVtYW4KKiBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIC0gTC5wYW5hbWVuc2lzCiogJSByZWFkcyBtYXBwZWQgLSBMLnBhbmFtZW5zaXMKClVzZSB0aGUgVGNydXppIGNvbG9ycy4KCiogQTEgaXMgYSBsYXJnZSB0aXRsZTogIk1hY3JvcGhhZ2UgU2FtcGxlcyIKKiBSb3cgMiBpcyB0aGUgYmx1ZSBjb2x1bW4gaGVhZGluZ3MKKiAzLW0gY29udGFpbnMgTWFjcm9waGFnZSBtZXRhZGF0YQoqIG0rMSBpcyBibGFuawoqIG0rMiBpcyBhIGxhcmdlIHRpdGxlOiAiUEJNQyBTYW1wbGVzIgoqIG0rMy1uIGNvbnRhaW5zIFBCTUMgbWV0YWRhdGEKCiMgRW5kCgpBdCB0aGlzIHBvaW50LCB3ZSBzaG91bGQgaGF2ZSBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHRoZSB2YXJpb3VzCmFuYWx5c2VzIG9mIHRoZSA0IHN1Yi1leHBlcmltZW50cy4gIFNvIHNhdmUgdGhlIGN1cnJlbnQgZGF0YSBmb3IgcmV1c2UKZWxzZXdoZXJlLgoKVGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24gaXMgYXZhaWxhYmxlCltoZXJlXShzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzLWNvbWJpbmVkLnhsc3giKS4KCmBgYHtyIHNhdmVtZX0KbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpCnBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCmBgYAo=