1 Annotation version: 20200220

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.

## Found the following hits: Leishmania major strain Friedlin, Leishmania major strain LV39c5, Leishmania major strain SD 75.1, choosing the first.
## Using: Leishmania major strain Friedlin.
## Found the following hits: Leishmania panamensis MHOM/COL/81/L13, Leishmania panamensis strain MHOM/PA/94/PSC-1, choosing the first.
## Using: Leishmania panamensis MHOM/COL/81/L13.
## Found: Leishmania mexicana MHOM/GT/2001/U1103
## Found: Leishmania amazonensis MHOM/BR/71973/M2269
## Found the following hits: Leishmania braziliensis MHOM/BR/75/M2904, Leishmania braziliensis MHOM/BR/75/M2904 2019, choosing the first.
## Using: Leishmania braziliensis MHOM/BR/75/M2904.
## Found the following hits: Leishmania donovani BPK282A1, Leishmania donovani CL-SL, Leishmania donovani strain BHU 1220, Leishmania donovani strain LV9, choosing the first.
## Using: Leishmania donovani BPK282A1.
## Found: Crithidia fasciculata strain Cf-Cl
##  org.Lpanamensis.MHOMCOL81L13.v46.eg.db is already installed.
##  org.Lbraziliensis.MHOMBR75M2904.v46.eg.db is already installed.
##  org.Ldonovani.BPK282A1.v46.eg.db is already installed.
##  org.Lmexicana.MHOMGT2001U1103.v46.eg.db is already installed.
##  org.Lmajor.Friedlin.v46.eg.db is already installed.
##  org.Cfasciculata.Cf.Cl.v46.eg.db is already installed.

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

1.3 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"
## Starting 1: aDC
## Starting 2: Adipocytes
## Starting 3: Astrocytes
## Starting 4: B-cells
## Starting 5: Basophils
## Starting 6: CD4+ memory T-cells
## Starting 7: CD4+ naive T-cells
## Starting 8: CD4+ T-cells
## Starting 9: CD4+ Tcm
## Starting 10: CD4+ Tem
## Starting 11: CD8+ naive T-cells
## Starting 12: CD8+ T-cells
## Starting 13: CD8+ Tcm
## Starting 14: CD8+ Tem
## Starting 15: cDC
## Starting 16: Chondrocytes
## Starting 17: Class-switched memory B-cells
## Starting 18: CLP
## Starting 19: CMP
## Starting 20: DC
## Starting 21: Endothelial cells
## Starting 22: Eosinophils
## Starting 23: Epithelial cells
## Starting 24: Erythrocytes
## Starting 25: Fibroblasts
## Starting 26: GMP
## Starting 27: Hepatocytes
## Starting 28: HSC
## Starting 29: iDC
## Starting 30: Keratinocytes
## Starting 31: ly Endothelial cells
## Starting 32: Macrophages
## Starting 33: Macrophages M1
## Starting 34: Macrophages M2
## Starting 35: Mast cells
## Starting 36: Megakaryocytes
## Starting 37: Melanocytes
## Starting 38: Memory B-cells
## Starting 39: MEP
## Starting 40: Mesangial cells
## Starting 41: Monocytes
## Starting 42: MPP
## Starting 43: MSC
## Starting 44: mv Endothelial cells
## Starting 45: Myocytes
## Starting 46: naive B-cells
## Starting 47: Neurons
## Starting 48: Neutrophils
## Starting 49: NK cells
## Starting 50: NKT
## Starting 51: Osteoblast
## Starting 52: pDC
## Starting 53: Pericytes
## Starting 54: Plasma cells
## Starting 55: Platelets
## Starting 56: Preadipocytes
## Starting 57: pro B-cells
## Starting 58: Sebocytes
## Starting 59: Skeletal muscle
## Starting 60: Smooth muscle
## Starting 61: Tgd cells
## Starting 62: Th1 cells
## Starting 63: Th2 cells
## Starting 64: Tregs
##      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 Eosinophils
## A1CF                            NA  NA  NA NA                NA          NA
##      Epithelial cells Erythrocytes Fibroblasts GMP Hepatocytes HSC iDC
## A1CF               NA           NA          NA  NA        TRUE  NA  NA
##      Keratinocytes ly Endothelial cells Macrophages Macrophages M1
## A1CF            NA                   NA          NA             NA
##      Macrophages M2 Mast cells Megakaryocytes Melanocytes Memory B-cells MEP
## A1CF             NA         NA             NA          NA             NA  NA
##      Mesangial cells Monocytes MPP MSC mv Endothelial cells Myocytes
## A1CF              NA        NA  NA  NA                   NA       NA
##      naive B-cells Neurons Neutrophils NK cells NKT Osteoblast pDC Pericytes
## A1CF            NA      NA          NA       NA  NA         NA  NA        NA
##      Plasma cells Platelets Preadipocytes pro B-cells Sebocytes Skeletal muscle
## A1CF           NA        NA            NA          NA        NA              NA
##      Smooth muscle Tgd cells Th1 cells Th2 cells Tregs
## A1CF            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 pathogenstrain1 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 bcftable salmonreads hssalmonmapped hssalmonmaprate lpsalmonmapped lpsalmonmaprate tophatpairs hstophataligned hstophatpct hstophatmulti hstophatdiscordant hstophatconcordantpct lptophataligned lptophatpct lptophatmulti lptophatdiscordant lpconcordantpct variantpositions sampleid.1 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 undef 46628648 26156539 0.561 NA NA 46319335 40905961 0.8831 1374099 1430888 0.8522 NA NA NA NA NA NA HPGL0241 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 pathogenstrain1 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 bcftable salmonreads hssalmonmapped hssalmonmaprate lpsalmonmapped lpsalmonmaprate tophatpairs hstophataligned hstophatpct hstophatmulti hstophatdiscordant hstophatconcordantpct lptophataligned lptophatpct lptophatmulti lptophatdiscordant lpconcordantpct variantpositions sampleid.1 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 preprocessing/outputs/hpgl0242_parsed_count.txt 42742857 17945935 0.4199 8023463 0.1877 42612353 25394266 0.5959 869649 784620 0.5775 13117819 0.3078 350277 263923 0.3016 3930 HPGL0242 null
HPGL0243 HPGL0243 s2272 macrophage TM130-2272 Self-Healing sh a a white whitepink right s2272 sh_2272 d130 undef 30 3 self_heal Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 532 Y Wanderson Y 10 Infected human macrophages NA hpgl0243 preprocessing/hpgl0243/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0243/outputs/tophat_lpanamensis/accepted_paired.count.xz preprocessing/outputs/hpgl0243_parsed_count.txt 46796079 21046460 0.4497 6823750 0.1458 47344642 31160297 0.6582 1000248 924296 0.6386 11581460 0.2446 319338 245169 0.2394 NA HPGL0243 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 preprocessing/outputs/hpgl0244_parsed_count.txt 47150925 25281958 0.5362 3761371 0.0798 46925604 36379602 0.7753 1070964 991929 0.7541 5755998 0.1227 154830 116414 0.1202 85981 HPGL0244 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 2b76190adf865097c1c27606eeded8b57cef055d
## This is hpgltools commit: Fri Feb 14 11:21:34 2020 -0500: 2b76190adf865097c1c27606eeded8b57cef055d
## Saving to 01_annotation_20200220-v20200220.rda.xz
## The savefile is: /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20200220-v20200220.rda.xz
## The file does not yet exist.
## The save string is: con <- pipe(paste0('pxz > /mnt/sshfs/cbcbsub/fs/cbcb-lab/nelsayed/scratch/atb/rnaseq/lpanamensis_2016/savefiles/01_annotation_20200220-v20200220.rda.xz'), 'wb'); save(list=ls(all.names=TRUE, envir=globalenv()),
##      envir=globalenv(), file=con, compress=FALSE); close(con)

R version 3.6.1 (2019-07-05)

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

locale: LC_CTYPE=en_US.UTF-8, LC_NUMERIC=C, LC_TIME=en_US.UTF-8, LC_COLLATE=en_US.UTF-8, LC_MONETARY=en_US.UTF-8, LC_MESSAGES=en_US.UTF-8, LC_PAPER=en_US.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.UTF-8 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.10.0), GO.db(v.3.10.0), OrganismDbi(v.1.28.0), GenomicFeatures(v.1.38.2), GenomicRanges(v.1.38.0), GenomeInfoDb(v.1.22.0), GSEABase(v.1.48.0), graph(v.1.64.0), annotate(v.1.64.0), XML(v.3.99-0.3), xCell(v.1.1.0), org.Cfasciculata.Cf.Cl.v46.eg.db(v.2019.11), org.Lmexicana.MHOMGT2001U1103.v46.eg.db(v.2020.02), org.Ldonovani.BPK282A1.v46.eg.db(v.2019.11), org.Lbraziliensis.MHOMBR75M2904.v46.eg.db(v.2019.11), org.Lpanamensis.MHOMCOL81L13.v46.eg.db(v.2020.02), org.Lmajor.Friedlin.v46.eg.db(v.2020.02), AnnotationDbi(v.1.48.0), IRanges(v.2.20.2), S4Vectors(v.0.24.3), futile.logger(v.1.4.3), hpgltools(v.1.0), Biobase(v.2.46.0) and BiocGenerics(v.0.32.0)

loaded via a namespace (and not attached): rappdirs(v.0.3.1), rtracklayer(v.1.46.0), AnnotationForge(v.1.28.0), tidyr(v.1.0.2), ggplot2(v.3.2.1), bit64(v.0.9-7), knitr(v.1.28), DelayedArray(v.0.12.2), data.table(v.1.12.8), RCurl(v.1.98-1.1), doParallel(v.1.0.15), callr(v.3.4.2), cowplot(v.1.0.0), lambda.r(v.1.2.4), usethis(v.1.5.1), RSQLite(v.2.2.0), europepmc(v.0.3), rBiopaxParser(v.2.26.0), bit(v.1.1-15.2), enrichplot(v.1.6.1), xml2(v.1.2.2), httpuv(v.1.5.2), SummarizedExperiment(v.1.16.1), assertthat(v.0.2.1), viridis(v.0.5.1), xfun(v.0.12), hms(v.0.5.3), evaluate(v.0.14), promises(v.1.1.0), fansi(v.0.4.1), progress(v.1.2.2), caTools(v.1.18.0), dbplyr(v.1.4.2), igraph(v.1.2.4.2), DBI(v.1.1.0), geneplotter(v.1.64.0), purrr(v.0.3.3), ellipsis(v.0.3.0), dplyr(v.0.8.4), backports(v.1.1.5), biomaRt(v.2.42.0), vctrs(v.0.2.3), remotes(v.2.1.1), withr(v.2.1.2), ggforce(v.0.3.1), triebeard(v.0.3.0), AnnotationHubData(v.1.16.0), GenomicAlignments(v.1.22.1), prettyunits(v.1.1.1), DOSE(v.3.12.0), lazyeval(v.0.2.2), crayon(v.1.3.4), genefilter(v.1.68.0), pkgconfig(v.2.0.3), labeling(v.0.3), tweenr(v.1.0.1), nlme(v.3.1-144), pkgload(v.1.0.2), devtools(v.2.2.2), rlang(v.0.4.4), lifecycle(v.0.1.0), BiocFileCache(v.1.10.2), AnnotationHub(v.2.18.0), rprojroot(v.1.3-2), polyclip(v.1.10-0), GSVA(v.1.34.0), matrixStats(v.0.55.0), Matrix(v.1.2-18), urltools(v.1.7.3), boot(v.1.3-24), base64enc(v.0.1-3), ggridges(v.0.5.2), processx(v.3.4.2), viridisLite(v.0.3.0), bitops(v.1.0-6), KernSmooth(v.2.23-16), pander(v.0.6.3), Biostrings(v.2.54.0), blob(v.1.2.1), stringr(v.1.4.0), qvalue(v.2.18.0), gridGraphics(v.0.4-1), scales(v.1.1.0), memoise(v.1.1.0), magrittr(v.1.5), plyr(v.1.8.5), gplots(v.3.0.1.2), gdata(v.2.18.0), zlibbioc(v.1.32.0), compiler(v.3.6.1), RColorBrewer(v.1.1-2), lme4(v.1.1-21), Rsamtools(v.2.2.2), cli(v.2.0.1), XVector(v.0.26.0), ps(v.1.3.2), formatR(v.1.7), MASS(v.7.3-51.5), mgcv(v.1.8-31), tidyselect(v.1.0.0), stringi(v.1.4.6), EuPathDB(v.1.6.0), highr(v.0.8), yaml(v.2.2.1), GOSemSim(v.2.12.0), askpass(v.1.1), ggrepel(v.0.8.1), biocViews(v.1.54.0), grid(v.3.6.1), fastmatch(v.1.1-0), tools(v.3.6.1), rstudioapi(v.0.11), foreach(v.1.4.8), gridExtra(v.2.3), farver(v.2.0.3), ggraph(v.2.0.1), digest(v.0.6.24), rvcheck(v.0.1.7), BiocManager(v.1.30.10), shiny(v.1.4.0), pracma(v.2.2.9), Rcpp(v.1.0.3), BiocVersion(v.3.10.1), later(v.1.0.0), httr(v.1.4.1), colorspace(v.1.4-1), rvest(v.0.3.5), fs(v.1.3.1), splines(v.3.6.1), RBGL(v.1.62.1), graphlayouts(v.0.5.0), shinythemes(v.1.1.2), ggplotify(v.0.0.4), sessioninfo(v.1.1.1), xtable(v.1.8-4), jsonlite(v.1.6.1), nloptr(v.1.2.1), futile.options(v.1.0.1), tidygraph(v.1.1.2), testthat(v.2.3.1), R6(v.2.4.1), RUnit(v.0.4.32), pillar(v.1.4.3), htmltools(v.0.4.0), mime(v.0.9), glue(v.1.3.1), fastmap(v.1.0.1), minqa(v.1.2.4), clusterProfiler(v.3.14.3), BiocParallel(v.1.20.1), interactiveDisplayBase(v.1.24.0), codetools(v.0.2-16), fgsea(v.1.12.0), pkgbuild(v.1.0.6), lattice(v.0.20-40), tibble(v.2.1.3), sva(v.3.34.0), pbkrtest(v.0.4-7), curl(v.4.3), colorRamps(v.2.3), gtools(v.3.8.1), zip(v.2.0.4), openxlsx(v.4.1.4), openssl(v.1.4.1), survival(v.3.1-8), limma(v.3.42.2), rmarkdown(v.2.1), desc(v.1.2.0), munsell(v.0.5.0), DO.db(v.2.9), GenomeInfoDbData(v.1.2.2), iterators(v.1.0.12), variancePartition(v.1.16.1), reshape2(v.1.4.3) and gtable(v.0.3.0)

LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDE4MDgyMjogQW5ub3RhdGlvbiBkYXRhLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQod2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgbWF4LnByaW50PTEyMCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKdmVyIDwtICIyMDIwMDIyMCIKcHJldmlvdXNfZmlsZSA8LSAiaW5kZXguUm1kIgoKdG1wIDwtIHRyeShzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkpCnJtZF9maWxlIDwtICIwMV9hbm5vdGF0aW9uXzIwMjAwMjIwLlJtZCIKYGBgCgojIEFubm90YXRpb24gdmVyc2lvbjogYHIgdmVyYAoKIyMgR2Vub21lIGFubm90YXRpb24gaW5wdXQKClRoZXJlIGFyZSBhIGZldyBtZXRob2RzIG9mIGltcG9ydGluZyBhbm5vdGF0aW9uIGRhdGEgaW50byBSLiAgVGhlIGZvbGxvd2luZyBhcmUKdHdvIGF0dGVtcHRzLCB0aGUgc2Vjb25kIGlzIGN1cnJlbnRseSBiZWluZyB1c2VkIGluIHRoZXNlIGFuYWx5c2VzLgoKYGBge3IgbWFrZV9vcmdkYn0KbWV0YSA8LSBFdVBhdGhEQjo6ZG93bmxvYWRfZXVwYXRoX21ldGFkYXRhKHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCgpsbV9lbnRyeSA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9lbnRyeShzcGVjaWVzPSJMZWlzaG1hbmlhIG1ham9yIiwgbWV0YWRhdGE9bWV0YSkKbHBfZW50cnkgPC0gRXVQYXRoREI6OmdldF9ldXBhdGhfZW50cnkoc3BlY2llcz0iTGVpc2htYW5pYSBwYW5hbWVuc2lzIiwgbWV0YWRhdGE9bWV0YSkKbG1leF9lbnRyeSA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9lbnRyeShzcGVjaWVzPSJMZWlzaG1hbmlhIG1leGljYW5hIiwgbWV0YWRhdGE9bWV0YSkKbGFtYV9lbnRyeSA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9lbnRyeShzcGVjaWVzPSJMZWlzaG1hbmlhIGFtYXpvbmVuc2lzIiwgbWV0YWRhdGE9bWV0YSkKbGJfZW50cnkgPC0gRXVQYXRoREI6OmdldF9ldXBhdGhfZW50cnkoc3BlY2llcz0iMjkwNCIsIG1ldGFkYXRhPW1ldGEpCmxkX2VudHJ5IDwtIEV1UGF0aERCOjpnZXRfZXVwYXRoX2VudHJ5KHNwZWNpZXM9ImRvbm92YW5pIiwgbWV0YWRhdGE9bWV0YSkKY3JpdF9lbnRyeSA8LSBFdVBhdGhEQjo6Z2V0X2V1cGF0aF9lbnRyeShzcGVjaWVzPSJDcml0aCIsIG1ldGFkYXRhPW1ldGEpCgp0ZXN0aW5nX3BhbmFtZW5zaXMgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2RiKGVudHJ5PWxwX2VudHJ5KQp0ZXN0aW5nX2JyYXppbGllbnNpcyA8LSBFdVBhdGhEQjo6bWFrZV9ldXBhdGhfb3JnZGIoZW50cnk9bGJfZW50cnkpCnRlc3RpbmdfZG9ub3ZhbmkgPC0gRXVQYXRoREI6Om1ha2VfZXVwYXRoX29yZ2RiKGVudHJ5PWxkX2VudHJ5KQp0ZXN0aW5nX21leGljYW5hIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdkYihlbnRyeT1sbWV4X2VudHJ5KQp0ZXN0aW5nX21ham9yIDwtIEV1UGF0aERCOjptYWtlX2V1cGF0aF9vcmdkYihlbnRyeT1sbV9lbnRyeSkKdGVzdGluZ19jcml0aCA8LSBFdVBhdGhEQjo6bWFrZV9ldXBhdGhfb3JnZGIoZW50cnk9Y3JpdF9lbnRyeSkKYGBgCgpBc3N1bWluZyB0aGUgYWJvdmUgcGFja2FnZXMgZ290IGNyZWF0ZWQsIHdlIG1heSBsb2FkIHRoZW0gYW5kIGV4dHJhY3QgdGhlCmFubm90YXRpb24gZGF0YS4KCmBgYHtyIGxwYW5hbWVuc2lzX29yZ2RifQp3YW50ZWRfZmllbGRzIDwtIGMoImFubm90X2Nkc19sZW5ndGgiLCAiYW5ub3RfY2hyb21vc29tZSIsICJhbm5vdF9nZW5lX2VudHJlel9pZCIsCiAgICAgICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV9uYW1lIiwgImFubm90X3N0cmFuZCIsICJnaWQiLCAiZ29fZ29faWQiLAogICAgICAgICAgICAgICAgICAgImdvX2dvX3Rlcm1fbmFtZSIsICJnb19vbnRvbG9neSIsCiAgICAgICAgICAgICAgICAgICAiaW50ZXJwcm9fZGVzY3JpcHRpb24iICwiaW50ZXJwcm9fZV92YWx1ZSIsICJ0eXBlX2dlbmVfdHlwZSIpCgpsbV9vcmcgPC0gc20oRXVQYXRoREI6OmxvYWRfZXVwYXRoX2Fubm90YXRpb25zKGVudHJ5PWxtX2VudHJ5KSkKCmxwX29yZyA8LSBzbShFdVBhdGhEQjo6bG9hZF9ldXBhdGhfYW5ub3RhdGlvbnMoZW50cnk9bHBfZW50cnkpKQoKbGJfb3JnIDwtIHNtKEV1UGF0aERCOjpsb2FkX2V1cGF0aF9hbm5vdGF0aW9ucyhlbnRyeT1sYl9lbnRyeSkpCgpsZF9vcmcgPC0gc20oRXVQYXRoREI6OmxvYWRfZXVwYXRoX2Fubm90YXRpb25zKGVudHJ5PWxkX2VudHJ5KSkKCmxtZXhfb3JnIDwtIHNtKEV1UGF0aERCOjpsb2FkX2V1cGF0aF9hbm5vdGF0aW9ucyhlbnRyeT1sbWV4X2VudHJ5KSkKCmNmX29ydCA8LSBzbShFdVBhdGhEQjo6bG9hZF9ldXBhdGhfYW5ub3RhdGlvbnMoZW50cnk9Y3JpdF9lbnRyeSkpCmBgYAoKIyMgUmVhZCBhIGdmZiBmaWxlCgpJbiBjb250cmFzdCwgaXQgaXMgcG9zc2libGUgdG8gbG9hZCBtb3N0IGFubm90YXRpb25zIG9mIGludGVyZXN0IGRpcmVjdGx5IGZyb20KdGhlIGdmZiBmaWxlcyB1c2VkIGluIHRoZSBhbGlnbm1lbnRzLiAgTW9yZSBpbi1kZXB0aCBpbmZvcm1hdGlvbiBmb3IgdGhlIGh1bWFuCnRyYW5zY3JpcHRvbWUgbWF5IGJlIGV4dHJhY3RlZCBmcm9tIGJpb21hcnQuCgpgYGB7ciBnZW5vbWVfaW5wdXR9CiMjIFRoZSBvbGQgd2F5IG9mIGdldHRpbmcgZ2Vub21lL2Fubm90YXRpb24gZGF0YQpscF9nZmYgPC0gInJlZmVyZW5jZS9scGFuYW1lbnNpcy5nZmYiCmxiX2dmZiA8LSAicmVmZXJlbmNlL2xicmF6aWxpZW5zaXMuZ2ZmIgpoc19nZmYgPC0gInJlZmVyZW5jZS9oc2FwaWVucy5ndGYiCgpscF9mYXN0YSA8LSAicmVmZXJlbmNlL2xwYW5hbWVuc2lzLmZhc3RhLnh6IgpsYl9mYXN0YSA8LSAicmVmZXJlbmNlL2xicmF6aWxpZW5zaXMuZmFzdGEueHoiCmhzX2Zhc3RhIDwtICJyZWZlcmVuY2UvaHNhcGllbnMuZmFzdGEueHoiCgpscF9hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhscF9nZmYsIHR5cGU9ImdlbmUiKSkKcm93bmFtZXMobHBfYW5ub3RhdGlvbnMpIDwtIHBhc3RlMCgiZXhvbl8iLCBscF9hbm5vdGF0aW9ucyR3ZWJfaWQsICIuMSIpCgpsYl9hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhsYl9nZmYsIHR5cGU9ImdlbmUiKSkKaHNfZ2ZmX2Fubm90IDwtIHNtKGxvYWRfZ2ZmX2Fubm90YXRpb25zKGhzX2dmZiwgaWRfY29sPSJnZW5lX2lkIikpCgpoc19hbm5vdGF0aW9ucyA8LSBzbShsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoKSkkYW5ub3RhdGlvbgpoc19hbm5vdGF0aW9ucyRJRCA8LSBoc19hbm5vdGF0aW9ucyRnZW5lSUQKcm93bmFtZXMoaHNfYW5ub3RhdGlvbnMpIDwtIG1ha2UubmFtZXMoaHNfYW5ub3RhdGlvbnNbWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQpkaW0oaHNfYW5ub3RhdGlvbnMpCgpscF9zaXplX2Rpc3QgPC0gcGxvdF9oaXN0b2dyYW0obHBfYW5ub3RhdGlvbnNbWyJ3aWR0aCJdXSkKbHBfc2l6ZV9kaXN0CmhzX3NpemVfZGlzdCA8LSBwbG90X2hpc3RvZ3JhbShoc19hbm5vdGF0aW9uc1tbImNkc19sZW5ndGgiXV0pCmhzX3NpemVfZGlzdCArCiAgZ2dwbG90Mjo6c2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAsIDIwMDAwKSkKYGBgCgojIyBFeHRyYWN0aW5nIENlbGwgVHlwZXMKCk1hcmlhIEFkZWxhaWRhIHJlcXVlc3RlZCBhZGRpbmcgdGhlIHhDZWxsIGNlbGwgdHlwZXMgdG8gdGhlIGRhdGEuCgpgYGB7ciB4Q2VsbF9kYXRhfQpsaWJyYXJ5KHhDZWxsKQpkYXRhKCJ4Q2VsbC5kYXRhIiwgcGFja2FnZT0ieENlbGwiKQpzdW1tYXJ5KHhDZWxsLmRhdGEpCmxpYnJhcnkoR1NFQUJhc2UpCmRldGFpbHMoeENlbGwuZGF0YSRzaWduYXR1cmVzW1sxXV0pCgpzaWdzIDwtIHhDZWxsLmRhdGEkc2lnbmF0dXJlcwpoZWFkKG5hbWVzKHNpZ3MpLCBuPTEwKQojIyBIZXJlIHdlIHNlZSB0aGF0IHRoZSBzaWduYXR1cmVzIGFyZSBlbmNvZGVkIGFzIDMgZWxlbWVudCBsaXN0cywgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlCiMjIGNlbGwgdHlwZSwgZm9sbG93ZWQgYnkgc291cmNlLCBmb2xsb3dlZCBieSByZXBsaWNhdGUudHh0LgpjZWxsX3R5cGVzIDwtIHVubGlzdChsYXBwbHkoc3Ryc3BsaXQoeD1uYW1lcyhzaWdzKSwgc3BsaXQ9IiUiKSwgZnVuY3Rpb24oeCkgeyB4W1sxXV0gfSkpCmNlbGxfc291cmNlcyA8LSB1bmxpc3QobGFwcGx5KHN0cnNwbGl0KHg9bmFtZXMoc2lncyksIHNwbGl0PSIlIiksIGZ1bmN0aW9uKHgpIHsgeFtbMl1dIH0pKQp0eXBlX2ZhY3QgPC0gYXMuZmFjdG9yKGNlbGxfdHlwZXMpCnR5cGVzIDwtIGxldmVscyh0eXBlX2ZhY3QpCgpjZWxsdHlwZXNfdG9fZ2VuZXMgPC0gbGlzdCgpCmZvciAoYyBpbiAxOmxlbmd0aCh0eXBlcykpIHsKICB0eXBlIDwtIHR5cGVzW2NdCiAgaWR4IDwtIGNlbGxfdHlwZXMgPT0gdHlwZQogIHNldCA8LSBzaWdzW2lkeF0KICBnZW5lcyA8LSBzZXQgJT4lCiAgICBnZW5lSWRzKCkgJT4lCiAgICB1bmxpc3QoKQogIGNlbGx0eXBlc190b19nZW5lc1tbdHlwZV1dIDwtIGFzLmNoYXJhY3RlcihnZW5lcykKfQpnZW5lc190b19jZWxsdHlwZXMgPC0gQmlvYmFzZTo6cmV2ZXJzZVNwbGl0KGNlbGx0eXBlc190b19nZW5lcykKCmcyY19kZiA8LSBkYXRhLmZyYW1lKHJvdy5uYW1lcz11bmlxdWUobmFtZXMoZ2VuZXNfdG9fY2VsbHR5cGVzKSkpCmcyY19kZltbImZvdW5kIl1dIDwtIDAKZm9yIChjIGluIDE6bGVuZ3RoKGNlbGx0eXBlc190b19nZW5lcykpIHsKICBjZWxsdHlwZV9uYW1lIDwtIG5hbWVzKGNlbGx0eXBlc190b19nZW5lcylbW2NdXQogIG1lc3NhZ2UoIlN0YXJ0aW5nICIsIGMsICI6ICIsIGNlbGx0eXBlX25hbWUpCiAgY2VsbHR5cGVfY29sdW1uIDwtIGFzLmRhdGEuZnJhbWUoY2VsbHR5cGVzX3RvX2dlbmVzW1tjXV0pCiAgY29sbmFtZXMoY2VsbHR5cGVfY29sdW1uKSA8LSBjZWxsdHlwZV9uYW1lCiAgcm93bmFtZXMoY2VsbHR5cGVfY29sdW1uKSA8LSBtYWtlLm5hbWVzKGNlbGx0eXBlX2NvbHVtbltbMV1dLCB1bmlxdWU9VFJVRSkKICBjZWxsdHlwZV9jb2x1bW5bWzFdXSA8LSBUUlVFCiAgZzJjX2RmIDwtIG1lcmdlKGcyY19kZiwgY2VsbHR5cGVfY29sdW1uLCBieT0icm93Lm5hbWVzIiwgYWxsLng9VFJVRSkKICByb3duYW1lcyhnMmNfZGYpIDwtIGcyY19kZltbMV1dCiAgZzJjX2RmIDwtIGcyY19kZlssIC0xXQp9CmhlYWQoZzJjX2RmKQpuYV9pZHggPC0gaXMubmEoZzJjX2RmKQpnMmNfZGZbbmFfaWR4XSA8LSBGQUxTRQpgYGAKCiMjIEdldHRpbmcgb250b2xvZ3kgZGF0YQoKQW5ub3RhdGlvbiBmb3IgZ2VuZSBvbnRvbG9naWVzIG1heSBiZSBnYXRoZXJlZCBmcm9tIGEgc2ltaWxhcmx5IGxhcmdlIG51bWJlciBvZgpzb3VyY2VzLiBUaGUgZm9sbG93aW5nIGFyZSBhIGNvdXBsZS4KCmBgYHtyIG9udG9sb2d5fQojIyBUcnkgdXNpbmcgYmlvbWFydApoc19nb19iaW9tYXJ0IDwtIHNtKGxvYWRfYmlvbWFydF9nbygpKQojIyBvciB0aGUgb3JnLkhzLmVnLmRiIHNxbGl0ZSBkYXRhYmFzZQp0dCA8LSBzbShsaWJyYXJ5KCJIb21vLnNhcGllbnMiKSkKaHMgPC0gSG9tby5zYXBpZW5zCiMjaHNfZ29fZW5zZW1ibCA8LSBsb2FkX29yZ2RiX2dvKGhzLCBoc19hbm5vdGF0aW9ucyRnZW5lSUQpCiMjZGltKGhzX2dvX2Jpb21hcnQpCiMjZGltKGhzX2dvX2Vuc2VtYmwpCiMjaHNfZ29pZHMgPC0gaHNfZ29fYmlvbWFydAoKIyMgV2hpbGUgdGVzdGluZywgSSBjYWxsZWQgdGhpcyBkZXNjLCB0aGF0IHdpbGwgbmVlZCB0byBjaGFuZ2UuCiMjbHBfdG9vbHRpcHMgPC0gbWFrZV90b29sdGlwcyhscF9hbm5vdGF0aW9ucykKIyNsYl90b29sdGlwcyA8LSBtYWtlX3Rvb2x0aXBzKGxiX2Fubm90YXRpb25zKQoKbHBfbGVuZ3RocyA8LSBscF9hbm5vdGF0aW9uc1ssIGMoIklEIiwgIndpZHRoIildCmxiX2xlbmd0aHMgPC0gbGJfYW5ub3RhdGlvbnNbLCBjKCJJRCIsICJ3aWR0aCIpXQpoc19sZW5ndGhzIDwtIGhzX2Fubm90YXRpb25zWywgYygiZW5zZW1ibF9nZW5lX2lkIiwgImNkc19sZW5ndGgiKV0KY29sbmFtZXMoaHNfbGVuZ3RocykgPC0gYygiSUQiLCAid2lkdGgiKQoKbHBfZ29pZHMgPC0gcmVhZC5jc3YoZmlsZT0icmVmZXJlbmNlL2xwYW5fZ28udHh0Lnh6Iiwgc2VwPSJcdCIsIGhlYWRlcj1GQUxTRSkKbGJfZ29pZHMgPC0gcmVhZC5jc3YoZmlsZT0icmVmZXJlbmNlL2xicmF6X2dvLnR4dC54eiIsIHNlcD0iXHQiLCBoZWFkZXI9RkFMU0UpCmNvbG5hbWVzKGxwX2dvaWRzKSA8LSBjKCJJRCIsIkdPIiwib250IiwibmFtZSIsInNvdXJjZSIsInRhZyIpCmNvbG5hbWVzKGxiX2dvaWRzKSA8LSBjKCJJRCIsIkdPIiwib250IiwibmFtZSIsInNvdXJjZSIsInRhZyIpCmBgYAoKIyBQdXR0aW5nIHRoZSBwaWVjZXMgdG9nZXRoZXIKClRoZSBtYWNyb3BoYWdlIGV4cGVyaW1lbnQgaGFzIHNhbXBsZXMgYWNyb3NzIDIgY29udGV4dHMsIHRoZSBob3N0IGFuZCBwYXJhc2l0ZS4KVGhlIGZvbGxvd2luZyBibG9jayBzZXRzIHVwIG9uZSBleHBlcmltZW50IGZvciBlYWNoLiAgSWYgeW91IG9wZW4gdGhlCmFsbF9zYW1wbGVzLXNwZWNpZXMueGxzeCBmaWxlcywgeW91IHdpbGwgbm90ZSBpbW1lZGlhdGVseSB0aGF0IGEgZmV3IGRpZmZlcmVudAphdHRlbXB0cyB3ZXJlIG1hZGUgYXQgYXNjZXJ0YWluaW5nIHRoZSBtb3N0IGxpa2VseSBleHBlcmltZW50YWwgZmFjdG9ycyB0aGF0CmNvbnRyaWJ1dGVkIHRvIHRoZSByZWFkaWx5IGFwcGFyZW50IGJhdGNoIGVmZmVjdHMuCgojIyBUaGUgaHVtYW4gdHJhbnNjcmlwdG9tZSBtYXBwaW5ncwoKS2VlcCBpbiBtaW5kIHRoYXQgaWYgSSBjaGFuZ2UgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24gd2l0aCBuZXcgYW5ub3RhdGlvbnMsIEkKbXVzdCB0aGVyZWZvcmUgcmVnZW5lcmF0ZSB0aGUgZm9sbG93aW5nLgoKYGBge3IgaHNfZXhwdH0KaHNfZmluYWxfYW5ub3RhdGlvbnMgPC0gaHNfYW5ub3RhdGlvbnMKaHNfZmluYWxfYW5ub3RhdGlvbnMgPC0gaHNfZmluYWxfYW5ub3RhdGlvbnNbLCBjKCJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLCAiZW5zZW1ibF9nZW5lX2lkIiwgImNkc19sZW5ndGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhnbmNfc3ltYm9sIiwgImRlc2NyaXB0aW9uIiwgImdlbmVfYmlvdHlwZSIpXQpoc19maW5hbF9hbm5vdGF0aW9ucyRybiA8LSByb3duYW1lcyhoc19maW5hbF9hbm5vdGF0aW9ucykKbm90ZSA8LSAiTmV3IGV4cGVyaW1lbnRhbCBkZXNpZ24gZmFjdG9ycyBieSBzbnAgYWRkZWQgMjAxNi0wOS0yMCIKaHNfZmluYWxfYW5ub3RhdGlvbnMgPC0gbWVyZ2UoaHNfZmluYWxfYW5ub3RhdGlvbnMsIGcyY19kZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkueD0iaGduY19zeW1ib2wiLCBieS55PSJyb3cubmFtZXMiLCBhbGwueD1UUlVFKQpyb3duYW1lcyhoc19maW5hbF9hbm5vdGF0aW9ucykgPC0gaHNfZmluYWxfYW5ub3RhdGlvbnMkcm4KaHNfZmluYWxfYW5ub3RhdGlvbnMkcm4gPC0gTlVMTApuYV9pZHggPC0gaXMubmEoaHNfZmluYWxfYW5ub3RhdGlvbnMkeGNlbGxfdHlwZXMpCmhzX2ZpbmFsX2Fubm90YXRpb25zW25hX2lkeCwgInhjZWxsX3R5cGVzIl0gPC0gIiIKCmhzX2V4cHQgPC0gc20oY3JlYXRlX2V4cHQoInNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMtY29tYmluZWQueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWhzX2ZpbmFsX2Fubm90YXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJodW1hbmZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVzPW5vdGUpKQpoc19hbm5vdGF0aW9ucyA8LSBmRGF0YShoc19leHB0KQp1bmRlZl9pZHggPC0gaHNfYW5ub3RhdGlvbnMgPT0gInVuZGVmaW5lZCIKaHNfYW5ub3RhdGlvbnNbdW5kZWZfaWR4XSA8LSBGQUxTRQpmRGF0YShoc19leHB0W1siZXhwcmVzc2lvbnNldCJdXSkgPC0gaHNfYW5ub3RhdGlvbnMKCmtuaXRyOjprYWJsZShoZWFkKGhzX2V4cHQkZGVzaWduLCBuPTEpKQoKY2RzX2VudHJpZXMgPC0gZkRhdGEoaHNfZXhwdCkKY2RzX2VudHJpZXMgPC0gY2RzX2VudHJpZXNbWyJnZW5lX2Jpb3R5cGUiXV0gPT0gInByb3RlaW5fY29kaW5nIgpoc19jZHNfZXhwdCA8LSBoc19leHB0CmhzX2Nkc19leHB0JGV4cHJlc3Npb25zZXQgPC0gaHNfY2RzX2V4cHQkZXhwcmVzc2lvbnNldFtjZHNfZW50cmllcywgXQpuZXdfY2RzX2VudHJpZXMgPC0gZkRhdGEoaHNfY2RzX2V4cHQpCmBgYAoKIyMgVGhlIHBhcmFzaXRlIHRyYW5zY3JpcHRvbWUgbWFwcGluZ3MKCmBgYHtyIHBhcmFzaXRlX2V4cHR9CnBhcmFzaXRlX2V4cHQgPC0gc20oY3JlYXRlX2V4cHQoInNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMtY29tYmluZWQueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWxwX2Fubm90YXRpb25zLCBmaWxlX2NvbHVtbj0icGFyYXNpdGVmaWxlIikpCmtuaXRyOjprYWJsZShoZWFkKHBhcmFzaXRlX2V4cHQkZGVzaWduLCBuPTMpLAogICAgICAgICAgICAgY2FwdGlvbj0iVGhlIGZpcnN0IHRocmVlIHJvd3Mgb2YgdGhlIHBhcmFzaXRlIGV4cGVyaW1lbnRhbCBkZXNpZ24uIikKYGBgCgojIFN1cHBsZW1lbnRhbCBUYWJsZSAxCgpUYWJsZSBTMSBpcyBnb2luZyB0byBiZSBhIHN1bW1hcnkgb2YgdGhlIG1ldGFkYXRhIGluIGFsbF9zYW1wbGVzLWNvbWJpbmVkClRoaXMgbWF5IGFsc28gaW5jbHVkZSBzb21lIG9mIHRoZSBudW1iZXJzIHJlZ2FyZGluZyBtYXBwaW5nICUsIGV0Yy4KCldhbnRlZCBjb2x1bW5zOgoKKiBTYW1wbGUgSUQ6ICBIUEdMeHh4eAoqIERvbm9yIENvZGU6IFRNMTMwIG9yIFBHMXh4CiogQ2VsbCBUeXBlOiAgTWFjcm9waGFnZSBvciBQQk1DCiogSW5mZWN0aW9uIFN0YXR1czogIEluZmVjdGVkIG9yIFVuaW5mZWN0ZWQKKiBEaXNlYXNlIE91dGNvbWU6ICBDaHJvbmljIG9yIFNlbGYtSGVhbGluZyBvciBOQQoqIEJhdGNoOiBBIG9yIEIgKG1hY3JvcGhhZ2UpOyBOQSBmb3IgUEJNQwoqIE51bWJlciBvZiByZWFkcyB0aGF0IHBhc3NlZCBJbGx1bWluYSBmaWx0ZXIKKiBOdW1iZXIgb2YgcmVhZHMgYWZ0ZXIgdHJpbW1pbmcKKiBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIC0gaHVtYW4KKiAlIHJlYWRzIG1hcHBlZCAtIGh1bWFuCiogTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCAtIEwucGFuYW1lbnNpcwoqICUgcmVhZHMgbWFwcGVkIC0gTC5wYW5hbWVuc2lzCgpVc2UgdGhlIFRjcnV6aSBjb2xvcnMuCgoqIEExIGlzIGEgbGFyZ2UgdGl0bGU6ICJNYWNyb3BoYWdlIFNhbXBsZXMiCiogUm93IDIgaXMgdGhlIGJsdWUgY29sdW1uIGhlYWRpbmdzCiogMy1tIGNvbnRhaW5zIE1hY3JvcGhhZ2UgbWV0YWRhdGEKKiBtKzEgaXMgYmxhbmsKKiBtKzIgaXMgYSBsYXJnZSB0aXRsZTogIlBCTUMgU2FtcGxlcyIKKiBtKzMtbiBjb250YWlucyBQQk1DIG1ldGFkYXRhCgojIEVuZAoKQXQgdGhpcyBwb2ludCwgd2Ugc2hvdWxkIGhhdmUgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gcGVyZm9ybSB0aGUgdmFyaW91cwphbmFseXNlcyBvZiB0aGUgNCBzdWItZXhwZXJpbWVudHMuICBTbyBzYXZlIHRoZSBjdXJyZW50IGRhdGEgZm9yIHJldXNlCmVsc2V3aGVyZS4KClRoZSBleHBlcmltZW50YWwgZGVzaWduIGlzIGF2YWlsYWJsZQpbaGVyZV0oc2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy1jb21iaW5lZC54bHN4IikuCgpgYGB7ciBzYXZlbWV9Cm1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQp0aGlzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1ybWRfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKQptZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHRoaXNfc2F2ZSkpCnRtcCA8LSBzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQpgYGAK