1 Sample Estimation, Macrophages: 20190205

This document is concerned with analyzing RNAseq data of human and parasite during the infection of human macrophages. A few different strains of L. panamensis were used; the experiment is therefore segregated into groups named ‘self-healing’, ‘chronic’, and ‘uninfected’. Two separate sets of libraries were generated, one earlier set with greater coverage, and a later set including only 1 uninfected sample, and 2-3 chronic samples.

2 Figure S1

Figure S1 should include nice versions of the sample metrics. The normalization chosen is batch-in-model.

First, however, we will make some plots of the raw data.

Sample names are going to be ‘infectionstate_strainnumber’ : chr_7721

  • Panel A: Library sizes.
  • Panel B: Heatmap distance raw.
  • Panel C: PCA
  • Panel D: TSNE

First look for clustering patterns in the raw data, in all data followed by only the CDS regions.

2.1 Write S1 images

Once the experiment has been written with the various normalizations in place, we can use that to print and view some representative plots.

## Writing the image to: images/figure_s1a_cds.pdf and calling dev.off().

## Writing the image to: images/figure_s1b_cds.pdf and calling dev.off().

## Writing the image to: images/figure_s1c_cds.pdf and calling dev.off().

## Writing the image to: images/figure_s1d_cds.pdf and calling dev.off().

3 Figure 1

  • Figure 1a distance heatmap of the normalized data.
  • Figure 1b is a PCA of the normalized data.

In a similar fashion to what is above, I am printing the figure 1 images.

## Writing the image to: images/figure_1a_cds.pdf and calling dev.off().

## Writing the image to: images/figure_1b_cds.pdf and calling dev.off().

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8
uninf_1 HPGL0241 uninf a 1 #009900 HPGL0241 -0.5952 0.3607 -0.5952 0.3607 -0.1009 -0.2387 0.2915 -0.3302 -0.1950 0.3246
sh_2271 HPGL0242 sh a 1 #000099 HPGL0242 -0.3238 -0.0209 -0.3238 -0.0209 0.0803 -0.0416 -0.4957 0.6115 0.2547 0.3017
chr_5433 HPGL0244 chr a 1 #990000 HPGL0244 0.4501 -0.2176 0.4501 -0.2176 -0.3954 -0.4586 0.3924 0.2719 0.0319 0.2083
chr_1320 HPGL0245 chr a 1 #990000 HPGL0245 0.2480 0.0228 0.2480 0.0228 0.1995 0.4028 -0.0250 0.1583 -0.7538 0.1760
chr_5430 HPGL0247 chr a 1 #990000 HPGL0247 0.2095 0.1749 0.2095 0.1749 0.2866 0.4835 0.3558 -0.1139 0.5660 0.1966
chr_5397 HPGL0248 chr a 1 #990000 HPGL0248 0.1995 -0.3503 0.1995 -0.3503 -0.0287 -0.1001 -0.5192 -0.6358 0.0699 0.1919
uninf HPGL0637 uninf b 2 #009900 HPGL0637 0.1589 0.5572 0.1589 0.5572 -0.4927 0.1206 -0.2616 -0.0035 0.0477 -0.4745
sh_2189 HPGL0638 sh b 2 #000099 HPGL0638 0.0584 0.0675 0.0584 0.0675 0.6498 -0.4689 0.0419 0.0171 -0.0212 -0.4862
sh_1022 HPGL0639 sh b 2 #000099 HPGL0639 -0.4055 -0.5943 -0.4055 -0.5943 -0.1985 0.3010 0.2199 0.0246 -0.0002 -0.4385

4 Sample metrics

The following is mostly used to compare different methodologies and is therefore not likely to be useful for most.

The various metrics used to describe and examine the data come once before, and once after normalization.

Some other analyses performed suggest a possible switch between two samples. We can artifically see what the data would look like if that is true by switching those two samples in a separate experimental design.

5 TODO 201611 #4

PBMC: variance partition human, “Are there any genes with variance we can ascribe to condition?” That set of genes is the most interesting. – use the variance parition table and pull the top 200. Report back the % variance by condition for all of these genes.

6 Variance Partition

In the following, I will attempt to find the variance associated with different experimental factors in the macrophage data with mappings against the human transcriptome.

## There were 25, now there are 7 samples.
## The new colors are a character, changing according to condition.

Now lets try removing some of the surrogates, the two primary candidates are the strains which I proxy with 3 columns: snpclade, snpcladev2, and snpcladev3; and the batch. In this data set batch is either a or b.

In theory, sva should pick up both of those in one invocation.

6.1 Start with a pca from sva

## NULL

6.2 Try limma’s removebatcheffect

Another method might be to try using limmaresid to explicitly pull both columns.

Another method might be to try pca on two separate invocations.

6.2.1 Show the plots from above.

## NULL
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 45b7ec8bad3682886965df63000dc4e98bcbf69f
## This is hpgltools commit: Wed Feb 6 16:38:23 2019 -0500: 45b7ec8bad3682886965df63000dc4e98bcbf69f
## Saving to 02_estimation_macrophage_20190205-v20190205.rda.xz

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: parallel, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: variancePartition(v.1.12.1), ruv(v.0.9.7), bindrcpp(v.0.2.2), hpgltools(v.2018.11), Biobase(v.2.42.0) and BiocGenerics(v.0.28.0)

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

LS0tCnRpdGxlOiAiTC5wYW5hbWVuc2lzIDIwMTgwODIyOiBTYW1wbGUgZXN0aW1hdGlvbiBvZiBIdW1hbiBtYWNyb3BoYWdlcy4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIn4vaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICB3aWR0aD0xMTAsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGg9OCwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQ9OCwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpwcmV2aW91c19maWxlIDwtICIwMV9hbm5vdGF0aW9uXzIwMTkwMjA1LlJtZCIKdmVyIDwtICIyMDE5MDIwNSIKCnRtcCA8LSBsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKQpybWRfZmlsZSA8LSAiMDJfZXN0aW1hdGlvbl9tYWNyb3BoYWdlXzIwMTkwMjA1LlJtZCIKYGBgCgojIFNhbXBsZSBFc3RpbWF0aW9uLCBNYWNyb3BoYWdlczogYHIgdmVyYAoKVGhpcyBkb2N1bWVudCBpcyBjb25jZXJuZWQgd2l0aCBhbmFseXppbmcgUk5Bc2VxIGRhdGEgb2YgaHVtYW4gYW5kIHBhcmFzaXRlIGR1cmluZyB0aGUgaW5mZWN0aW9uIG9mCmh1bWFuIG1hY3JvcGhhZ2VzLiAgQSBmZXcgZGlmZmVyZW50IHN0cmFpbnMgb2YgTC4gcGFuYW1lbnNpcyB3ZXJlIHVzZWQ7IHRoZSBleHBlcmltZW50IGlzIHRoZXJlZm9yZQpzZWdyZWdhdGVkIGludG8gZ3JvdXBzIG5hbWVkICdzZWxmLWhlYWxpbmcnLCAnY2hyb25pYycsIGFuZCAndW5pbmZlY3RlZCcuICBUd28gc2VwYXJhdGUgc2V0cyBvZgpsaWJyYXJpZXMgd2VyZSBnZW5lcmF0ZWQsIG9uZSBlYXJsaWVyIHNldCB3aXRoIGdyZWF0ZXIgY292ZXJhZ2UsIGFuZCBhIGxhdGVyIHNldCBpbmNsdWRpbmcgb25seSAxCnVuaW5mZWN0ZWQgc2FtcGxlLCBhbmQgMi0zIGNocm9uaWMgc2FtcGxlcy4KCiMjIEV4dHJhY3QgdGhlIG1hY3JvcGhhZ2UgZXhwZXJpbWVudAoKVGhlIGZvbGxvd2luZyBzdWJzZXQgb3BlcmF0aW9uIGV4dHJhY3QgdGhlIHNhbXBsZXMgdXNlZCBmb3IgdGhlIG1hY3JvcGhhZ2UgZXhwZXJpbWVudC4gVGhlIG5leHQKdGhyZWUgbGluZXMgdGhlbiBjaGFuZ2UgdGhlIGNvbG9ycyBmcm9tIHRoZSBkZWZhdWx0cy4KCmBgYHtyIG1hY3JvcGhhZ2VzfQojIyBUaGlzIHdhcyBtYWRlIGluIDAxX2Fubm90YXRpb25fMjAxODA4MjIuUm1kCiMjaHNfZXhwdCA8LSBzbShjcmVhdGVfZXhwdChtZXRhZGF0YT0ic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy1jb21iaW5lZC54bHN4IiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1oc19hbm5vdGF0aW9ucywKIyMgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJodW1hbmZpbGUiKSkKCmhzX21hY3IgPC0gc3Vic2V0X2V4cHQoaHNfZXhwdCwgc3Vic2V0PSJleHBlcmltZW50bmFtZT09J21hY3JvcGhhZ2UnIikKbmV3X2NvbG9ycyA8LSBjKCIjMDA5OTAwIiwgIiM5OTAwMDAiLCAiIzAwMDA5OSIpCm5hbWVzKG5ld19jb2xvcnMpIDwtIGMoInVuaW5mIiwgImNociIsICJzaCIpCgpoc19tYWNyIDwtIHNldF9leHB0X2NvbG9ycyhoc19tYWNyLCBjb2xvcnM9bmV3X2NvbG9ycykKbGFiZWxzIDwtIGFzLmNoYXJhY3RlcihwRGF0YShoc19tYWNyKVtbImxhYmVsIl1dKQpoc19tYWNyIDwtIHNldF9leHB0X3NhbXBsZW5hbWVzKGhzX21hY3IsIGxhYmVscykKCmhzX2Nkc19leHB0IDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChoc19leHB0LCBjb2x1bW49J1R5cGUnLCBwYXR0ZXJucz0icHJvdGVpbl9jb2RpbmciLCBtZXRob2Q9ImtlZXAiKQpoc19jZHNfbWFjciA8LSBzdWJzZXRfZXhwdChoc19jZHNfZXhwdCwgc3Vic2V0PSJleHBlcmltZW50bmFtZT09J21hY3JvcGhhZ2UnIikKaHNfY2RzX21hY3IgPC0gc2V0X2V4cHRfY29sb3JzKGhzX2Nkc19tYWNyLCBjb2xvcnM9bmV3X2NvbG9ycykKaHNfY2RzX21hY3IgPC0gc2V0X2V4cHRfc2FtcGxlbmFtZXMoaHNfY2RzX21hY3IsIGxhYmVscykKYGBgCgojIEZpZ3VyZSBTMQoKRmlndXJlIFMxIHNob3VsZCBpbmNsdWRlIG5pY2UgdmVyc2lvbnMgb2YgdGhlIHNhbXBsZSBtZXRyaWNzLgpUaGUgbm9ybWFsaXphdGlvbiBjaG9zZW4gaXMgYmF0Y2gtaW4tbW9kZWwuCgpGaXJzdCwgaG93ZXZlciwgd2Ugd2lsbCBtYWtlIHNvbWUgcGxvdHMgb2YgdGhlIHJhdyBkYXRhLgoKU2FtcGxlIG5hbWVzIGFyZSBnb2luZyB0byBiZSAnaW5mZWN0aW9uc3RhdGVfc3RyYWlubnVtYmVyJyA6IGNocl83NzIxCgoqIFBhbmVsIEE6IExpYnJhcnkgc2l6ZXMuCiogUGFuZWwgQjogSGVhdG1hcCBkaXN0YW5jZSByYXcuCiogUGFuZWwgQzogUENBCiogUGFuZWwgRDogVFNORQoKYGBge3IgZmlnX3MxX3dyaXRlLCBmaWcuc2hvdz0iaGlkZSJ9CiMjIFdlIGFyZSBvbmx5IGRlYWxpbmcgd2l0aCB0aGUgQ0RTIGRhdGEgZnJvbSBub3cgb24uCiMjIGZpZ19zMSA8LSBzbSh3cml0ZV9leHB0KAojIyAgaHNfbWFjciwgbm9ybT0icXVhbnQiLCB2aW9saW49RkFMU0UsIGNvbnZlcnQ9ImNwbSIsCiMjICB0cmFuc2Zvcm09ImxvZzIiLCBiYXRjaD0icGNhIiwgZmlsdGVyPVRSVUUsCiMjICBleGNlbD1wYXN0ZTAoImV4Y2VsL2ZpZ3VyZV9zMV9zYW1wbGVfZXN0aW1hdGlvbi12IiwgdmVyLCAiLnhsc3giKSkpCmZpZ19zMV9jZHMgPC0gc20od3JpdGVfZXhwdCgKICBoc19jZHNfbWFjciwgbm9ybT0icXVhbnQiLCB2aW9saW49RkFMU0UsIGNvbnZlcnQ9ImNwbSIsCiAgdHJhbnNmb3JtPSJsb2cyIiwgYmF0Y2g9InBjYSIsIGZpbHRlcj1UUlVFLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvZmlndXJlX3MxX3NhbXBsZV9lc3RpbWF0aW9uX2Nkc19vbmx5LXYiLCB2ZXIsICIueGxzeCIpKSkKYGBgCgpGaXJzdCBsb29rIGZvciBjbHVzdGVyaW5nIHBhdHRlcm5zIGluIHRoZSByYXcgZGF0YSwgaW4gYWxsIGRhdGEgZm9sbG93ZWQgYnkgb25seSB0aGUgQ0RTIHJlZ2lvbnMuCgpgYGB7ciBmaWd1cmVfczF9CiMjIHBsb3RfdHNuZShoc19tYWNyKSRwbG90CnBsb3RfdHNuZShoc19jZHNfbWFjcikkcGxvdApgYGAKCiMjIFdyaXRlIFMxIGltYWdlcwoKT25jZSB0aGUgZXhwZXJpbWVudCBoYXMgYmVlbiB3cml0dGVuIHdpdGggdGhlIHZhcmlvdXMgbm9ybWFsaXphdGlvbnMgaW4gcGxhY2UsCndlIGNhbiB1c2UgdGhhdCB0byBwcmludCBhbmQgdmlldyBzb21lIHJlcHJlc2VudGF0aXZlIHBsb3RzLgoKYGBge3Igdmlld19maWdfczF9CnBwKGZpbGU9ImltYWdlcy9maWd1cmVfczFhX2Nkcy5wZGYiLCBpbWFnZT1maWdfczFfY2RzJHJhd19saWJzaXplKQojIyBTaG93IHRoZSBsaWJyYXJ5IHNpemVzIG9mIGNkcyBmZWF0dXJlcy4KCnBwKGZpbGU9ImltYWdlcy9maWd1cmVfczFiX2Nkcy5wZGYiLCBpbWFnZT1maWdfczFfY2RzJHJhd19kaXNoZWF0KQojIyBTaG93IHRoZSBjbHVzdGVyaW5nIGJ5IGV1Y2xpZGVhbiBkaXN0YW5jZSBvZiB0aGUgcmF3IGRhdGEgY2RzIGZlYXR1cmVzLgoKcHAoZmlsZT0iaW1hZ2VzL2ZpZ3VyZV9zMWNfY2RzLnBkZiIsIGltYWdlPWZpZ19zMV9jZHMkcmF3X3NjYWxlZF9wY2EpCiMjIERvIGEgUENBIHBsb3Qgb2YgdGhlIGxvZzIobm9ybWFsaXplZChkYXRhKSkgd2l0aG91dCBhbnkgYmF0Y2gtaW4tbW9kZWwgKGNkcyBmZWF0dXJlcykKCnBwKGZpbGU9ImltYWdlcy9maWd1cmVfczFkX2Nkcy5wZGYiLCBpbWFnZT1maWdfczFfY2RzJG5vcm1fY29yaGVhdCkKIyMgRG8gYSBub3JtYWxpemVkIGNvcnJlbGF0aW9uIGhlYXRtYXAKYGBgCgojIEZpZ3VyZSAxCgogKiBGaWd1cmUgMWEgZGlzdGFuY2UgaGVhdG1hcCBvZiB0aGUgbm9ybWFsaXplZCBkYXRhLgogKiBGaWd1cmUgMWIgaXMgYSBQQ0Egb2YgdGhlIG5vcm1hbGl6ZWQgZGF0YS4KCkluIGEgc2ltaWxhciBmYXNoaW9uIHRvIHdoYXQgaXMgYWJvdmUsIEkgYW0gcHJpbnRpbmcgdGhlIGZpZ3VyZSAxIGltYWdlcy4KCmBgYHtyIGZpZ3VyZV8xfQojIyBwcChmaWxlPSJpbWFnZXMvZmlndXJlXzFhLnBkZiIsIGZpZ19zMV9jZHMkbm9ybV9kaXNoZWF0KQojIyBTaG93IHRoZSBjaGFuZ2VzIGluIGNsdXN0ZXJpbmcgYWZ0ZXIgYWRkaW5nIGJhdGNoIHRvIHRoZSBtb2RlbCBhbmQgbm9ybWFsaXppbmcuCgpwcChmaWxlPSJpbWFnZXMvZmlndXJlXzFhX2Nkcy5wZGYiLCBpbWFnZT1maWdfczFfY2RzJG5vcm1fZGlzaGVhdCkKIyMgT2JzZXJ2ZSB0aGF0IHRoZSBjbHVzdGVyaW5nIGlzIG5lYXJseSBpZGVudGljYWwgd2hlbiBvbmx5IGxvb2tpbmcgYXQgdGhlIENEUyBmZWF0dXJlcy4KCiMjIHBwKGZpbGU9ImltYWdlcy9maWd1cmVfMWJfY2RzLnBkZiIsIGltYWdlPWZpZ19zMV9jZHMkbm9ybV9wY2EpCiMjIFZpc3VhbGl6ZSB0aGUgY2x1c3RlcmluZyBhZnRlciBub3JtYWxpemF0aW9uIHZpYSBQQ0EuCiMjIGtuaXRyOjprYWJsZShmaWdfczFfY2RzJG5vcm1fcGNhX3RhYmxlKQojIyB3cml0ZS5jc3YoZmlnX3MxX2NkcyRub3JtX3BjYV90YWJsZSwgZmlsZT0iaW1hZ2VzL2ZpZ18xYi5jc3YiKQoKcHAoZmlsZT0iaW1hZ2VzL2ZpZ3VyZV8xYl9jZHMucGRmIiwgaW1hZ2U9ZmlnX3MxX2NkcyRub3JtX3BjYSkKIyMgT25jZSBhZ2Fpbiwgc2VlIHRoYXQgaXQgaXMgbW9zdGx5IHVuY2hhbmdlZCB3aGVuIHVzaW5nIG9ubHkgQ0RTIGZlYXR1cmVzLgprbml0cjo6a2FibGUoZmlnX3MxX2NkcyRub3JtX3BjYV90YWJsZSkKd3JpdGUuY3N2KGZpZ19zMV9jZHMkbm9ybV9wY2FfdGFibGUsIGZpbGU9ImltYWdlcy9maWdfMWFfY2RzLmNzdiIpCmBgYAoKIyBTYW1wbGUgbWV0cmljcwoKVGhlIGZvbGxvd2luZyBpcyBtb3N0bHkgdXNlZCB0byBjb21wYXJlIGRpZmZlcmVudCBtZXRob2RvbG9naWVzIGFuZCBpcyB0aGVyZWZvcmUKbm90IGxpa2VseSB0byBiZSB1c2VmdWwgZm9yIG1vc3QuCgpUaGUgdmFyaW91cyBtZXRyaWNzIHVzZWQgdG8gZGVzY3JpYmUgYW5kIGV4YW1pbmUgdGhlIGRhdGEgY29tZSBvbmNlIGJlZm9yZSwgYW5kIG9uY2UgYWZ0ZXIgbm9ybWFsaXphdGlvbi4KClNvbWUgb3RoZXIgYW5hbHlzZXMgcGVyZm9ybWVkIHN1Z2dlc3QgYSBwb3NzaWJsZSBzd2l0Y2ggYmV0d2VlbiB0d28gc2FtcGxlcy4gIFdlIGNhbiBhcnRpZmljYWxseSBzZWUKd2hhdCB0aGUgZGF0YSB3b3VsZCBsb29rIGxpa2UgaWYgdGhhdCBpcyB0cnVlIGJ5IHN3aXRjaGluZyB0aG9zZSB0d28gc2FtcGxlcyBpbiBhIHNlcGFyYXRlCmV4cGVyaW1lbnRhbCBkZXNpZ24uCgojIFRPRE8gMjAxNjExICM0CgpQQk1DOiB2YXJpYW5jZSBwYXJ0aXRpb24gaHVtYW4sICJBcmUgdGhlcmUgYW55IGdlbmVzIHdpdGggdmFyaWFuY2Ugd2UgY2FuIGFzY3JpYmUgdG8gY29uZGl0aW9uPyIKVGhhdCBzZXQgb2YgZ2VuZXMgaXMgdGhlIG1vc3QgaW50ZXJlc3RpbmcuIC0tIHVzZSB0aGUgdmFyaWFuY2UgcGFyaXRpb24gdGFibGUgYW5kIHB1bGwgdGhlIHRvcCAyMDAuClJlcG9ydCBiYWNrIHRoZSAlIHZhcmlhbmNlIGJ5IGNvbmRpdGlvbiBmb3IgYWxsIG9mIHRoZXNlIGdlbmVzLgoKIyBWYXJpYW5jZSBQYXJ0aXRpb24KCkluIHRoZSBmb2xsb3dpbmcsIEkgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIHZhcmlhbmNlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGZhY3RvcnMKaW4gdGhlIG1hY3JvcGhhZ2UgZGF0YSB3aXRoIG1hcHBpbmdzIGFnYWluc3QgdGhlIGh1bWFuIHRyYW5zY3JpcHRvbWUuCgpgYGB7ciBwYXJhc2l0ZV9lc3RpbWF0ZXNfbm9ybWFsLCBmaWcuc2hvdz0iaGlkZSJ9CnBhcmFzaXRlX2V4cHQgPC0gc20oY3JlYXRlX2V4cHQoCiAgbWV0YWRhdGE9InNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMtY29tYmluZWQueGxzeCIsCiAgZ2VuZV9pbmZvPWxwX2Fubm90YXRpb25zLAogIGZpbGVfY29sdW1uPSJwYXJhc2l0ZWZpbGUiKSkKCmxwX21hY3IgPC0gc3Vic2V0X2V4cHQocGFyYXNpdGVfZXhwdCwgc3Vic2V0PSJleHBlcmltZW50bmFtZT09J21hY3JvcGhhZ2UnIikKY2hvc2VuX2NvbG9ycyA8LSBjKCIjOTkwMDAwIiwgIiMwMDAwOTkiKQpuYW1lcyhjaG9zZW5fY29sb3JzKSA8LSBjKCJjaHIiLCAic2giKQpscF9tYWNyIDwtIHNldF9leHB0X2NvbG9ycyhscF9tYWNyLCBjb2xvcnM9Y2hvc2VuX2NvbG9ycykKbHBfdGVzdGluZyA8LSBzbSh3cml0ZV9leHB0KAogIGxwX21hY3IsIHZpb2xpbj1UUlVFLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvbWFjcm9waGFnZV9wYXJhc2l0ZV9kYXRhLXYiLCB2ZXIsICIueGxzeCIpKSkKYGBgCgpgYGB7ciB2cF9zaG93fQpscF90ZXN0aW5nJG5vcm1fcGNhCmxwX3Rlc3Rpbmckbm9ybV92aW9saW4KYGBgCgpOb3cgbGV0cyB0cnkgcmVtb3Zpbmcgc29tZSBvZiB0aGUgc3Vycm9nYXRlcywgdGhlIHR3byBwcmltYXJ5IGNhbmRpZGF0ZXMgYXJlIHRoZSBzdHJhaW5zCndoaWNoIEkgcHJveHkgd2l0aCAzIGNvbHVtbnM6IHNucGNsYWRlLCBzbnBjbGFkZXYyLCBhbmQgc25wY2xhZGV2MzsgYW5kIHRoZSBiYXRjaC4gIEluIHRoaXMKZGF0YSBzZXQgYmF0Y2ggaXMgZWl0aGVyIGEgb3IgYi4KCkluIHRoZW9yeSwgc3ZhIHNob3VsZCBwaWNrIHVwIGJvdGggb2YgdGhvc2UgaW4gb25lIGludm9jYXRpb24uCgpgYGB7ciBnZW5lcmF0ZV9ncmFwaHMsIGZpZy5zaG93PSJoaWRlIn0KIyMgUGVyZm9ybSBhICdub3JtYWwnIHN2YQpscF9tYWNyX3N2YSA8LSBzbShub3JtYWxpemVfZXhwdChscF9tYWNyLCBiYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpKQojIyBQbGF5IHdpdGggdGhlIG5vcm1hbGl6YXRpb24gb2YgaXQKbHBfbWFjcl9zdmFfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChscF9tYWNyX3N2YSwgZmlsdGVyPVRSVUUsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCB0cmFuc2Zvcm09ImxvZzIiKSkKbHBfbWFjcl9zdmFfbm9ybV9tZXRyIDwtIHNtKGdyYXBoX21ldHJpY3MobHBfbWFjcl9zdmFfbm9ybSkpCiMjIFRyeSBsaW1tYSdzIG1ldGhvZApscF9tYWNyX2xpbW1hX2ZjcWxyIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGxwX21hY3IsIGJhdGNoPSJsaW1tYSIsIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2gyPSJzbnBjbGFkZXYzIiwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiKSkKYGBgCgojIyBTdGFydCB3aXRoIGEgcGNhIGZyb20gc3ZhCgpgYGB7ciBzdmFfYXR0ZW1wdH0KbHBfbWFjcl9zdmFfbm9ybV9tZXRyJHBjYXBsb3QKYGBgCgojIyBUcnkgbGltbWEncyByZW1vdmViYXRjaGVmZmVjdAoKQW5vdGhlciBtZXRob2QgbWlnaHQgYmUgdG8gdHJ5IHVzaW5nIGxpbW1hcmVzaWQgdG8gZXhwbGljaXRseSBwdWxsIGJvdGggY29sdW1ucy4KCmBgYHtyIHJlc2lkX2F0dGVtcHR9CnBsb3RfcGNhKGxwX21hY3JfbGltbWFfZmNxbHIpJHBsb3QKYGBgCgpBbm90aGVyIG1ldGhvZCBtaWdodCBiZSB0byB0cnkgcGNhIG9uIHR3byBzZXBhcmF0ZSBpbnZvY2F0aW9ucy4KCmBgYHtyIHBlcmZvcm1fcmVzaWR1YWxzLCBmaWcuc2hvdz0iaGlkZSJ9CiMjIGZycnByIHJwcnJmCiMjIHJhdyhwY2EocmF3KHJhdyhmaWx0ZXIoZGF0YSkpKSkpCiMjIHRodXMgZmNxc2wgd291bGQgYmUgbG9nMihzdmEocXVhbnQoY3BtKGZpbHRlcihkYXRhKSkpKSkKbHBfbWFjcl9ycHJyZiA8LSBzbShub3JtYWxpemVfZXhwdChscF9tYWNyLCBiYXRjaD0icGNhIiwgZmlsdGVyPVRSVUUpKQpscF9tYWNyX3JwcnJmIDwtIHNldF9leHB0X2JhdGNoZXMoZXhwdD1scF9tYWNyX3JwcnJmLCBmYWN0PSJzbnBjbGFkZXYzIikKbHBfbWFjcl9ycHJyZiA8LSBzbShub3JtYWxpemVfZXhwdChscF9tYWNyX3JwcnJmLCBiYXRjaD0icGNhIikpCmxwX21hY3JfbHBxY2YgPC0gc20obm9ybWFsaXplX2V4cHQobHBfbWFjcl9ycHJyZiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtPSJxdWFudCIsIHRyYW5zZm9ybT0ibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyPVRSVUUpKQpscF9tYWNyX2xwcWNmX21ldHIgPC0gc20oZ3JhcGhfbWV0cmljcyhscF9tYWNyX2xwcWNmKSkKYGBgCgojIyMgU2hvdyB0aGUgcGxvdHMgZnJvbSBhYm92ZS4KCmBgYHtyIHBjYV9hdHRlbXB0fQpscF9tYWNyX2xwcWNmX21ldHIkcGNhcGxvdApgYGAKCmBgYHtyIHNhdmVtZX0KbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQpgYGAK