1 Annotation version: 20180822

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.v39.eg.db
## Starting metadata download.
## Finished metadata download.
## Found the following hits: Leishmania panamensis MHOM/COL/81/L13, choosing the first.
## org.Lpanamensis.MHOMCOL81L13.v39.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.v39.eg.db

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 experimentname tubelabel alias condition batch anotherbatch snpclade snpcladev2 snpcladev3 pathogenstrain 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 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 experimentname tubelabel alias condition batch anotherbatch snpclade snpcladev2 snpcladev3 pathogenstrain 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 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
HPGL0243 HPGL0243 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 null
HPGL0638 HPGL0638 macrophage TM130-2189 Self-Healing sh b b pink whitepink right s2189 sh_2189 d130 undef 55 5 self_heal Ade Adriana Lp Human Human macs Max 2 mill 2h - 24h chase period 0.0486111111111111 unknown unknown 37 Y Adelaida Y 4 Infected human macrophages /RNA QC 2013-03-26 sample TM130.8 Library constructed with 342 ng total RNA. hpgl0638 preprocessing/hpgl0638/outputs/tophat_hsapiens/accepted_paired.count.xz preprocessing/hpgl0638/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 7c4477bb4fa3639cc6cf7940216e4c4b8cbee7ce
## This is hpgltools commit: Fri Oct 26 17:27:11 2018 -0400: 7c4477bb4fa3639cc6cf7940216e4c4b8cbee7ce
## Saving to 01_annotation_20180822-v20180822.rda.xz

R version 3.5.1 (2018-07-02)

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.6.0), GO.db(v.3.6.0), OrganismDbi(v.1.22.0), GenomicFeatures(v.1.32.3), GenomicRanges(v.1.32.7), GenomeInfoDb(v.1.16.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.42.1), IRanges(v.2.14.12), S4Vectors(v.0.18.3), Biobase(v.2.40.0), AnnotationHub(v.2.12.1), BiocGenerics(v.0.26.0) and hpgltools(v.2018.03)

loaded via a namespace (and not attached): bitops(v.1.0-6), matrixStats(v.0.54.0), devtools(v.1.13.6), bit64(v.0.9-7), RColorBrewer(v.1.1-2), progress(v.1.2.0), httr(v.1.3.1), rprojroot(v.1.3-2), tools(v.3.5.1), backports(v.1.1.2), R6(v.2.3.0), DBI(v.1.0.0), lazyeval(v.0.2.1), colorspace(v.1.3-2), withr(v.2.1.2), tidyselect(v.0.2.5), prettyunits(v.1.0.2), bit(v.1.1-14), curl(v.3.2), compiler(v.3.5.1), graph(v.1.58.2), xml2(v.1.2.0), DelayedArray(v.0.6.6), rtracklayer(v.1.40.6), labeling(v.0.3), scales(v.1.0.0), RBGL(v.1.56.0), commonmark(v.1.6), stringr(v.1.3.1), digest(v.0.6.18), Rsamtools(v.1.32.3), rmarkdown(v.1.10), XVector(v.0.20.0), base64enc(v.0.1-3), pkgconfig(v.2.0.2), htmltools(v.0.3.6), highr(v.0.7), rlang(v.0.3.0), RSQLite(v.2.1.1), BiocInstaller(v.1.30.0), shiny(v.1.1.0), bindr(v.0.1.1), BiocParallel(v.1.14.2), zip(v.1.0.0), dplyr(v.0.7.7), RCurl(v.1.95-4.11), magrittr(v.1.5), GenomeInfoDbData(v.1.1.0), Matrix(v.1.2-14), Rcpp(v.0.12.19), munsell(v.0.5.0), stringi(v.1.2.4), yaml(v.2.2.0), SummarizedExperiment(v.1.10.1), zlibbioc(v.1.26.0), plyr(v.1.8.4), grid(v.3.5.1), blob(v.1.1.1), promises(v.1.0.1), crayon(v.1.3.4), lattice(v.0.20-35), Biostrings(v.2.48.0), pander(v.0.6.2), hms(v.0.4.2), knitr(v.1.20), pillar(v.1.3.0), codetools(v.0.2-15), biomaRt(v.2.36.1), XML(v.3.98-1.16), glue(v.1.3.0), evaluate(v.0.12), data.table(v.1.11.8), httpuv(v.1.4.5), foreach(v.1.4.4), gtable(v.0.2.0), purrr(v.0.2.5), assertthat(v.0.2.0), ggplot2(v.3.0.0), openxlsx(v.4.1.0), mime(v.0.6), xtable(v.1.8-3), roxygen2(v.6.1.0), later(v.0.7.5), tibble(v.1.4.2), iterators(v.1.0.10), GenomicAlignments(v.1.16.0), memoise(v.1.1.0), bindrcpp(v.0.2.2) and interactiveDisplayBase(v.1.18.0)

LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDE4MDgyMjogQW5ub3RhdGlvbiBkYXRhLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldCh3aWR0aD0xMjAsCiAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBtYXgucHJpbnQ9MTIwLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQp2ZXIgPC0gIjIwMTgwODIyIgpwcmV2aW91c19maWxlIDwtICJpbmRleC5SbWQiCgp0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKSkKcm1kX2ZpbGUgPC0gIjAxX2Fubm90YXRpb25fMjAxODA4MjIuUm1kIgpgYGAKCiMgQW5ub3RhdGlvbiB2ZXJzaW9uOiBgciB2ZXJgCgojIyBHZW5vbWUgYW5ub3RhdGlvbiBpbnB1dAoKVGhlcmUgYXJlIGEgZmV3IG1ldGhvZHMgb2YgaW1wb3J0aW5nIGFubm90YXRpb24gZGF0YSBpbnRvIFIuICBUaGUgZm9sbG93aW5nIGFyZQp0d28gYXR0ZW1wdHMsIHRoZSBzZWNvbmQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgaW4gdGhlc2UgYW5hbHlzZXMuCgojIyMgQW5ub3RhdGlvbkh1YgoKQW5ub3RhdGlvbkh1YiBpcyBhIG5ld2VyIHNlcnZpY2UgYW5kIGhhcyBwcm9taXNlIHRvIGJlIGFuIGV4Y2VsbGVudCB0b3AtbGV2ZWwKcmVzb3VyY2UgZm9yIGdhdGhlcmluZyBhbm5vdGF0aW9uIGRhdGEuCgpgYGB7ciBkYXRhX2lucHV0X2dlbm9tZX0KdHQgPC0gc20obGlicmFyeShBbm5vdGF0aW9uSHViKSkKYWggPC0gc20oQW5ub3RhdGlvbkh1YigpKQpvcmdkYnMgPC0gcXVlcnkoYWgsICJPcmdEQiIpCmFubm90X2xtIDwtIHF1ZXJ5KGFoLCBjKCJPcmdEQiIsICJGcmllZGxpbiIpKQpsbV9uYW1lIDwtIG5hbWVzKGFubm90X2xtKQphbm5vdF9sbSA8LSBzbShhbm5vdF9sbVtbbG1fbmFtZVtbMl1dXV0pCnR4dGRicyA8LSBxdWVyeShhaCwgIlR4RGIiKQoKIyMgQUg0ODQyOSBhcHBlYXJzIHRvIGJlIHBhbmFtZW5zaXMKIyNhbm5vdF9scCA8LSBhbm5vdF9scFtbIkFINDg0MjkiXV0KYW5ub3RfbHAgPC0gcXVlcnkoYWgsIGMoIk9yZ0RCIiwgInBhbmFtZW5zaXMiKSkKbHBfbmFtZSA8LSBuYW1lcyhhbm5vdF9scCkKYW5ub3RfbHAgPC0gc20oYW5ub3RfbHBbW2xwX25hbWVbWzJdXV1dKQpgYGAKCiMjIE9yZ2FuaXNtRGIKClNpbmNlIHRoaXMgZG9jdW1lbnQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiwgSSBoYXZlIG1hZGUgc3Vic3RhbnRpYWwgY2hhbmdlcyB0bwpob3cgSSBjcmVhdGUsIGxvYWQsIGFuZCBtYW5pcHVsYXRlIHRoZSBldXBhdGhkYiBhbm5vdGF0aW9uIGRhdGEuICBBcyBhIHJlc3VsdCwKdGhpcyBuZWVkcyB0byBiZSBzaWduaWZpY2FudGx5IHJld29ya2VkLgoKQW5ub3RhdGlvbkh1YiBpcyB0aGUgbmV3IGFuZCBmYW5jaWVyIHZlcnNpb24gb2Ygd2hhdCBPcmdhbmlzbURiIGRvZXMuICBLZWl0aAphbHJlYWR5IG1hZGUgdGhlc2UgZm9yIHRoZSBwYXJhc2l0ZXMgdGhvdWdoLCBsZXRzIHRyeSBhbmQgdXNlIG9uZSBvZiB0aG9zZS4KCmBgYHtyIG1ha2Vfb3JnZGIsIGV2YWw9RkFMU0V9CnRyaXRyeXBfbWV0YWRhdGEgPC0gZG93bmxvYWRfZXVwYXRoX21ldGFkYXRhKHdlYnNlcnZpY2U9InRyaXRyeXBkYiIpCnRlc3RpbmdfcGFuYW1lbnNpcyA8LSBtYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgicGFuYW1lbnNpcyIpCnRlc3RpbmdfYnJhemlsaWVuc2lzIDwtIG1ha2VfZXVwYXRoX29yZ2FuaXNtZGJpKCJicmF6aWxpZW5zaXMiKQp0ZXN0aW5nX2Rvbm92YW5pIDwtIG1ha2VfZXVwYXRoX29yZ2FuaXNtZGJpKCJkb25vdmFuaSIpCnRlc3RpbmdfbWV4aWNhbmEgPC0gbWFrZV9ldXBhdGhfb3JnYW5pc21kYmkoIm1leGljYW5hIikKdGVzdGluZ19tYWpvciA8LSBtYWtlX2V1cGF0aF9vcmdhbmlzbWRiaSgibWFqb3IiKQp0ZXN0aW5nX2NyaXRoIDwtIG1ha2VfZXVwYXRoX29yZ2FuaXNtZGJpKCJDcml0IiwgbWV0YWRhdGE9dHJpdHJ5cF9tZXRhZGF0YSkKYGBgCgpBc3N1bWluZyB0aGUgYWJvdmUgcGFja2FnZXMgZ290IGNyZWF0ZWQsIHdlIG1heSBsb2FkIHRoZW0gYW5kIGV4dHJhY3QgdGhlCmFubm90YXRpb24gZGF0YS4KCmBgYHtyIGxwYW5hbWVuc2lzX29yZ2RifQp0cml0cnlwX21ldGFkYXRhIDwtIGRvd25sb2FkX2V1cGF0aF9tZXRhZGF0YSh3ZWJzZXJ2aWNlPSJ0cml0cnlwZGIiKQptYWpvcl9uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKCJtYWpvciIpCm1ham9yX25hbWVzJG9yZ2RiCgp3YW50ZWRfZmllbGRzIDwtIGMoImFubm90X2Nkc19sZW5ndGgiLCAiYW5ub3RfY2hyb21vc29tZSIsICJhbm5vdF9nZW5lX2VudHJlel9pZCIsCiAgICAgICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV9uYW1lIiwgImFubm90X3N0cmFuZCIsICJnaWQiLCAiZ29fZ29faWQiLAogICAgICAgICAgICAgICAgICAgImdvX2dvX3Rlcm1fbmFtZSIsICJnb19vbnRvbG9neSIsCiAgICAgICAgICAgICAgICAgICAiaW50ZXJwcm9fZGVzY3JpcHRpb24iICwiaW50ZXJwcm9fZV92YWx1ZSIsICJ0eXBlX2dlbmVfdHlwZSIpCgpvbGRfbmFtZSA8LSAib3JnLkxtYWpvci5GcmllZGxpbi52MzguZWcuZGIiCmxtX29yZyA8LSBzbShsb2FkX29yZ2RiX2Fubm90YXRpb25zKG9sZF9uYW1lLCBrZXl0eXBlPSJnaWQiLCBmaWVsZHM9d2FudGVkX2ZpZWxkcykpCgpwYW5hbWVuc2lzX25hbWVzIDwtIGdldF9ldXBhdGhfcGtnbmFtZXMoInBhbmFtZW5zaXMiKQpwYW5hbWVuc2lzX25hbWVzJG9yZ2RiCm9sZF9uYW1lIDwtICJvcmcuTHBhbmFtZW5zaXMuTUhPTUNPTDgxTDEzLnYzOC5lZy5kYiIKbHBfb3JnIDwtIHNtKGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMob2xkX25hbWUsIGtleXR5cGU9ImdpZCIsIGZpZWxkcz13YW50ZWRfZmllbGRzKSkKCmJyYXppbGllbnNpc19uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKCJicmF6aWxpZW5zaXMiKQpicmF6aWxpZW5zaXNfbmFtZXMkb3JnZGIKb2xkX25hbWUgPC0gIm9yZy5MYnJhemlsaWVuc2lzLk1IT01CUjc1TTI5MDMudjM4LmVnLmRiIgpsYl9vcmcgPC0gc20obG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhvbGRfbmFtZSwga2V5dHlwZT0iZ2lkIiwgZmllbGRzPXdhbnRlZF9maWVsZHMpKQoKIyNkb25vdmFuaV9uYW1lcyA8LSBnZXRfZXVwYXRoX3BrZ25hbWVzKCJkb25vdmFuaSIpCiMjZG9ub3ZhbmlfbmFtZXMkb3JnZGIKIyNsZF9vcmcgPC0gbG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhkb25vdmFuaV9uYW1lcyRvcmdkYiwga2V5dHlwZT0iZ2lkIiwgZmllbGRzPXdhbnRlZF9maWVsZHMpCiMjCiMjbWV4aWNhbmFfbmFtZXMgPC0gZ2V0X2V1cGF0aF9wa2duYW1lcygibWV4aWNhbmEiKQojI21leGljYW5hX25hbWVzJG9yZ2RiCiMjbG1leF9vcmcgPC0gbG9hZF9vcmdkYl9hbm5vdGF0aW9ucyhtZXhpY2FuYV9uYW1lcyRvcmdkYiwga2V5dHlwZT0iZ2lkIiwgZmllbGRzPXdhbnRlZF9maWVsZHMpCiMjCiMjZmFzY2ljdWxhdGFfbmFtZXMgPC0gZ2V0X2V1cGF0aF9wa2duYW1lcygicml0aGlkaWEiLCBtZXRhZGF0YT10cml0cnlwX21ldGFkYXRhKQojI2Zhc2NpY3VsYXRhX25hbWVzJG9yZ2RiCiMjY2Zfb3JnIDwtIGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMoZmFzY2ljdWxhdGFfbmFtZXMkb3JnZGIsIGtleXR5cGU9ImdpZCIsIGZpZWxkcz13YW50ZWRfZmllbGRzKQpgYGAKCiMjIFJlYWQgYSBnZmYgZmlsZQoKSW4gY29udHJhc3QsIGl0IGlzIHBvc3NpYmxlIHRvIGxvYWQgbW9zdCBhbm5vdGF0aW9ucyBvZiBpbnRlcmVzdCBkaXJlY3RseSBmcm9tCnRoZSBnZmYgZmlsZXMgdXNlZCBpbiB0aGUgYWxpZ25tZW50cy4gIE1vcmUgaW4tZGVwdGggaW5mb3JtYXRpb24gZm9yIHRoZSBodW1hbgp0cmFuc2NyaXB0b21lIG1heSBiZSBleHRyYWN0ZWQgZnJvbSBiaW9tYXJ0LgoKYGBge3IgZ2Vub21lX2lucHV0fQojIyBUaGUgb2xkIHdheSBvZiBnZXR0aW5nIGdlbm9tZS9hbm5vdGF0aW9uIGRhdGEKbHBfZ2ZmIDwtICJyZWZlcmVuY2UvbHBhbmFtZW5zaXMuZ2ZmIgpsYl9nZmYgPC0gInJlZmVyZW5jZS9sYnJhemlsaWVuc2lzLmdmZiIKaHNfZ2ZmIDwtICJyZWZlcmVuY2UvaHNhcGllbnMuZ3RmIgoKbHBfZmFzdGEgPC0gInJlZmVyZW5jZS9scGFuYW1lbnNpcy5mYXN0YS54eiIKbGJfZmFzdGEgPC0gInJlZmVyZW5jZS9sYnJhemlsaWVuc2lzLmZhc3RhLnh6Igpoc19mYXN0YSA8LSAicmVmZXJlbmNlL2hzYXBpZW5zLmZhc3RhLnh6IgoKbHBfYW5ub3RhdGlvbnMgPC0gc20obG9hZF9nZmZfYW5ub3RhdGlvbnMobHBfZ2ZmLCB0eXBlPSJnZW5lIikpCnJvd25hbWVzKGxwX2Fubm90YXRpb25zKSA8LSBwYXN0ZTAoImV4b25fIiwgbHBfYW5ub3RhdGlvbnMkd2ViX2lkLCAiLjEiKQoKbGJfYW5ub3RhdGlvbnMgPC0gc20obG9hZF9nZmZfYW5ub3RhdGlvbnMobGJfZ2ZmLCB0eXBlPSJnZW5lIikpCmhzX2dmZl9hbm5vdCA8LSBzbShsb2FkX2dmZl9hbm5vdGF0aW9ucyhoc19nZmYsIGlkX2NvbD0iZ2VuZV9pZCIpKQoKaHNfYW5ub3RhdGlvbnMgPC0gc20obG9hZF9iaW9tYXJ0X2Fubm90YXRpb25zKCkpJGFubm90YXRpb24KaHNfYW5ub3RhdGlvbnMkSUQgPC0gaHNfYW5ub3RhdGlvbnMkZ2VuZUlECnJvd25hbWVzKGhzX2Fubm90YXRpb25zKSA8LSBtYWtlLm5hbWVzKGhzX2Fubm90YXRpb25zW1siZW5zZW1ibF9nZW5lX2lkIl1dLCB1bmlxdWU9VFJVRSkKCmxwX3NpemVfZGlzdCA8LSBwbG90X2hpc3RvZ3JhbShscF9hbm5vdGF0aW9uc1tbIndpZHRoIl1dKQpscF9zaXplX2Rpc3QKaHNfc2l6ZV9kaXN0IDwtIHBsb3RfaGlzdG9ncmFtKGhzX2Fubm90YXRpb25zW1siY2RzX2xlbmd0aCJdXSkKaHNfc2l6ZV9kaXN0ICsKICBnZ3Bsb3QyOjpzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMCwgMjAwMDApKQpgYGAKCiMjIEdldHRpbmcgb250b2xvZ3kgZGF0YQoKQW5ub3RhdGlvbiBmb3IgZ2VuZSBvbnRvbG9naWVzIG1heSBiZSBnYXRoZXJlZCBmcm9tIGEgc2ltaWxhcmx5IGxhcmdlIG51bWJlciBvZgpzb3VyY2VzLiBUaGUgZm9sbG93aW5nIGFyZSBhIGNvdXBsZS4KCmBgYHtyIG9udG9sb2d5fQojIyBUcnkgdXNpbmcgYmlvbWFydApoc19nb19iaW9tYXJ0IDwtIHNtKGxvYWRfYmlvbWFydF9nbygpKQojIyBvciB0aGUgb3JnLkhzLmVnLmRiIHNxbGl0ZSBkYXRhYmFzZQp0dCA8LSBzbShsaWJyYXJ5KCJIb21vLnNhcGllbnMiKSkKaHMgPC0gSG9tby5zYXBpZW5zCiMjaHNfZ29fZW5zZW1ibCA8LSBsb2FkX29yZ2RiX2dvKGhzLCBoc19hbm5vdGF0aW9ucyRnZW5lSUQpCiMjZGltKGhzX2dvX2Jpb21hcnQpCiMjZGltKGhzX2dvX2Vuc2VtYmwpCiMjaHNfZ29pZHMgPC0gaHNfZ29fYmlvbWFydAoKIyMgV2hpbGUgdGVzdGluZywgSSBjYWxsZWQgdGhpcyBkZXNjLCB0aGF0IHdpbGwgbmVlZCB0byBjaGFuZ2UuCiMjbHBfdG9vbHRpcHMgPC0gbWFrZV90b29sdGlwcyhscF9hbm5vdGF0aW9ucykKIyNsYl90b29sdGlwcyA8LSBtYWtlX3Rvb2x0aXBzKGxiX2Fubm90YXRpb25zKQoKbHBfbGVuZ3RocyA8LSBscF9hbm5vdGF0aW9uc1ssIGMoIklEIiwgIndpZHRoIildCmxiX2xlbmd0aHMgPC0gbGJfYW5ub3RhdGlvbnNbLCBjKCJJRCIsICJ3aWR0aCIpXQpoc19sZW5ndGhzIDwtIGhzX2Fubm90YXRpb25zWywgYygiZW5zZW1ibF9nZW5lX2lkIiwgImNkc19sZW5ndGgiKV0KY29sbmFtZXMoaHNfbGVuZ3RocykgPC0gYygiSUQiLCAid2lkdGgiKQoKbHBfZ29pZHMgPC0gcmVhZC5jc3YoZmlsZT0icmVmZXJlbmNlL2xwYW5fZ28udHh0Lnh6Iiwgc2VwPSJcdCIsIGhlYWRlcj1GQUxTRSkKbGJfZ29pZHMgPC0gcmVhZC5jc3YoZmlsZT0icmVmZXJlbmNlL2xicmF6X2dvLnR4dC54eiIsIHNlcD0iXHQiLCBoZWFkZXI9RkFMU0UpCmNvbG5hbWVzKGxwX2dvaWRzKSA8LSBjKCJJRCIsIkdPIiwib250IiwibmFtZSIsInNvdXJjZSIsInRhZyIpCmNvbG5hbWVzKGxiX2dvaWRzKSA8LSBjKCJJRCIsIkdPIiwib250IiwibmFtZSIsInNvdXJjZSIsInRhZyIpCmBgYAoKIyBQdXR0aW5nIHRoZSBwaWVjZXMgdG9nZXRoZXIKClRoZSBtYWNyb3BoYWdlIGV4cGVyaW1lbnQgaGFzIHNhbXBsZXMgYWNyb3NzIDIgY29udGV4dHMsIHRoZSBob3N0IGFuZCBwYXJhc2l0ZS4KVGhlIGZvbGxvd2luZyBibG9jayBzZXRzIHVwIG9uZSBleHBlcmltZW50IGZvciBlYWNoLiAgSWYgeW91IG9wZW4gdGhlCmFsbF9zYW1wbGVzLXNwZWNpZXMueGxzeCBmaWxlcywgeW91IHdpbGwgbm90ZSBpbW1lZGlhdGVseSB0aGF0IGEgZmV3IGRpZmZlcmVudAphdHRlbXB0cyB3ZXJlIG1hZGUgYXQgYXNjZXJ0YWluaW5nIHRoZSBtb3N0IGxpa2VseSBleHBlcmltZW50YWwgZmFjdG9ycyB0aGF0CmNvbnRyaWJ1dGVkIHRvIHRoZSByZWFkaWx5IGFwcGFyZW50IGJhdGNoIGVmZmVjdHMuCgojIyBUaGUgaHVtYW4gdHJhbnNjcmlwdG9tZSBtYXBwaW5ncwoKS2VlcCBpbiBtaW5kIHRoYXQgaWYgSSBjaGFuZ2UgdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24gd2l0aCBuZXcgYW5ub3RhdGlvbnMsIEkKbXVzdCB0aGVyZWZvcmUgcmVnZW5lcmF0ZSB0aGUgZm9sbG93aW5nLgoKYGBge3IgaHNfZXhwdH0KaHNfZmluYWxfYW5ub3RhdGlvbnMgPC0gaHNfYW5ub3RhdGlvbnMKaHNfZmluYWxfYW5ub3RhdGlvbnMgPC0gaHNfZmluYWxfYW5ub3RhdGlvbnNbLCBjKCJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLCAiZW5zZW1ibF9nZW5lX2lkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZ25jX3N5bWJvbCIsICJkZXNjcmlwdGlvbiIsICJnZW5lX2Jpb3R5cGUiKV0Kbm90ZSA8LSAiTmV3IGV4cGVyaW1lbnRhbCBkZXNpZ24gZmFjdG9ycyBieSBzbnAgYWRkZWQgMjAxNi0wOS0yMCIKCmhzX2V4cHQgPC0gc20oY3JlYXRlX2V4cHQoInNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMtY29tYmluZWQueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPWhzX2ZpbmFsX2Fubm90YXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJodW1hbmZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGVzPW5vdGUpKQprbml0cjo6a2FibGUoaGVhZChoc19leHB0JGRlc2lnbiwgbj0xKSkKCmNkc19lbnRyaWVzIDwtIGZEYXRhKGhzX2V4cHQpCmNkc19lbnRyaWVzIDwtIGNkc19lbnRyaWVzW1siZ2VuZV9iaW90eXBlIl1dID09ICJwcm90ZWluX2NvZGluZyIKaHNfY2RzX2V4cHQgPC0gaHNfZXhwdApoc19jZHNfZXhwdCRleHByZXNzaW9uc2V0IDwtIGhzX2Nkc19leHB0JGV4cHJlc3Npb25zZXRbY2RzX2VudHJpZXMsIF0KbmV3X2Nkc19lbnRyaWVzIDwtIGZEYXRhKGhzX2Nkc19leHB0KQpgYGAKCiMjIFRoZSBwYXJhc2l0ZSB0cmFuc2NyaXB0b21lIG1hcHBpbmdzCgpgYGB7ciBwYXJhc2l0ZV9leHB0fQpwYXJhc2l0ZV9leHB0IDwtIHNtKGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzLWNvbWJpbmVkLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1scF9hbm5vdGF0aW9ucywgZmlsZV9jb2x1bW49InBhcmFzaXRlZmlsZSIpKQprbml0cjo6a2FibGUoaGVhZChwYXJhc2l0ZV9leHB0JGRlc2lnbiwgbj0zKSwKICAgICAgICAgICAgIGNhcHRpb249IlRoZSBmaXJzdCB0aHJlZSByb3dzIG9mIHRoZSBwYXJhc2l0ZSBleHBlcmltZW50YWwgZGVzaWduLiIpCmBgYAoKIyBTdXBwbGVtZW50YWwgVGFibGUgMQoKVGFibGUgUzEgaXMgZ29pbmcgdG8gYmUgYSBzdW1tYXJ5IG9mIHRoZSBtZXRhZGF0YSBpbiBhbGxfc2FtcGxlcy1jb21iaW5lZApUaGlzIG1heSBhbHNvIGluY2x1ZGUgc29tZSBvZiB0aGUgbnVtYmVycyByZWdhcmRpbmcgbWFwcGluZyAlLCBldGMuCgpXYW50ZWQgY29sdW1uczoKCiogU2FtcGxlIElEOiAgSFBHTHh4eHgKKiBEb25vciBDb2RlOiBUTTEzMCBvciBQRzF4eAoqIENlbGwgVHlwZTogIE1hY3JvcGhhZ2Ugb3IgUEJNQwoqIEluZmVjdGlvbiBTdGF0dXM6ICBJbmZlY3RlZCBvciBVbmluZmVjdGVkCiogRGlzZWFzZSBPdXRjb21lOiAgQ2hyb25pYyBvciBTZWxmLUhlYWxpbmcgb3IgTkEKKiBCYXRjaDogQSBvciBCIChtYWNyb3BoYWdlKTsgTkEgZm9yIFBCTUMKKiBOdW1iZXIgb2YgcmVhZHMgdGhhdCBwYXNzZWQgSWxsdW1pbmEgZmlsdGVyCiogTnVtYmVyIG9mIHJlYWRzIGFmdGVyIHRyaW1taW5nCiogTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCAtIGh1bWFuCiogJSByZWFkcyBtYXBwZWQgLSBodW1hbgoqIE51bWJlciBvZiByZWFkcyBtYXBwZWQgLSBMLnBhbmFtZW5zaXMKKiAlIHJlYWRzIG1hcHBlZCAtIEwucGFuYW1lbnNpcwoKVXNlIHRoZSBUY3J1emkgY29sb3JzLgoKKiBBMSBpcyBhIGxhcmdlIHRpdGxlOiAiTWFjcm9waGFnZSBTYW1wbGVzIgoqIFJvdyAyIGlzIHRoZSBibHVlIGNvbHVtbiBoZWFkaW5ncwoqIDMtbSBjb250YWlucyBNYWNyb3BoYWdlIG1ldGFkYXRhCiogbSsxIGlzIGJsYW5rCiogbSsyIGlzIGEgbGFyZ2UgdGl0bGU6ICJQQk1DIFNhbXBsZXMiCiogbSszLW4gY29udGFpbnMgUEJNQyBtZXRhZGF0YQoKIyBFbmQKCkF0IHRoaXMgcG9pbnQsIHdlIHNob3VsZCBoYXZlIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gdGhlIHZhcmlvdXMKYW5hbHlzZXMgb2YgdGhlIDQgc3ViLWV4cGVyaW1lbnRzLiAgU28gc2F2ZSB0aGUgY3VycmVudCBkYXRhIGZvciByZXVzZQplbHNld2hlcmUuCgpUaGUgZXhwZXJpbWVudGFsIGRlc2lnbiBpcyBhdmFpbGFibGUKW2hlcmVdKHNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMtY29tYmluZWQueGxzeCIpLgoKYGBge3Igc2F2ZW1lfQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQojI3RtcCA8LSBzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQpgYGAK