1 OpenSwathWorkflow against the Tuberculist transitions

The following invocations of OpenMS/pyprophet/tric are included in:

dia_invocation_20180913.sh

This script includes the process for generating a local, comet-based transition library from DDA samples generated locally as well as the steps used when processing the downloaded transition libraries.

2 Gathering parameters

In this first block, I will set a couple of variables and source a file containing the parameters for the rest of the script.

3 Plotting metrics of the raw data

The raw data files provide opportunities to make sure that the later invocations of openMS/etc will actually work; for example, if there are too few transitions observed here, one should not be surprised if pyprophet and tric fail later.

## Error in read.xlsx.default(sample_sheet): File does not exist.
## Error in grepl(pattern = "^#", x = metadata[["sampleid"]]): object 'metadata' not found
## Error in eval(expr, envir, enclos): object 'metadata' not found
## Error in knitr::kable(metadata): object 'metadata' not found
## Error in grep(pattern = "2018_0817", x = metadata[["sampleid"]]): object 'metadata' not found
## Error in eval(expr, envir, enclos): object 'metadata' not found
## Error in extract_msraw_data(metadata, parallel = FALSE, allow_window_overlap = FALSE, : object 'metadata' not found
## Error in plot_mzxml_boxplot(mzxml_data): object 'mzxml_data' not found
## Error in pp(file = paste0("images/20180913_dia_mzxml_intensities-v", ver, : object 'intensity_boxplot' not found
## Error in plot_mzxml_boxplot(mzxml_data, table = "scans", column = "peakscount"): object 'mzxml_data' not found
## Error in pp(file = paste0("images/20180913_dia_mzxml_retention-v", ver, : object 'retention_boxplot' not found
## Error in plot_mzxml_boxplot(mzxml_data, table = "scans", column = "basepeakmz"): object 'mzxml_data' not found
## Error in pp(file = paste0("images/20180913_dia_mzxml_mzbase-v", ver, ".png"), : object 'mz_boxplot' not found
## Error in plot_mzxml_boxplot(mzxml_data, table = "scans", column = "basepeakintensity"): object 'mzxml_data' not found
## Error in pp(file = paste0("images/20180913_dia_mzxml_scanintensity-v", : object 'scanintensity_boxplot' not found

4 Query time spent vs. peaks observed.

6 OpenSwathWorkflow invocation

block 16 contains the commands used to run openswathworkflow and pyprophet. Those are repeated here in order to test them interactively when needed.

echo "Invoking the OpenSwathWorkflow using the tuberculist transitions."
base_mzxmldir="preprocessing/01mzXML/dia/${VERSION}"
swath_inputs=$(/bin/ls "${base_mzxmldir}")
echo "Checking in, the inputs are: ${swath_inputs}"
mkdir -p "${TUBERCULIST_OUTDIR}"
pypdir="${PYPROPHET_OUTDIR}_tuberculist"
echo "Creating pyprophet output directory: ${pypdir}."
mkdir -p "${pypdir}"
for input in ${swath_inputs}
do
    in_mzxml="${base_mzxmldir}/${input}"
    name=$(basename "${input}" .mzXML)
    echo "Starting openswath run of ${name} using ${MZ_WINDOWS} windows at $(date)."
    tb_output_prefix="${TUBERCULIST_OUTDIR}/${name}_vs_${VERSION}_${TYPE}_${DDA_METHOD}_dia"
    pyprophet_output_prefix="${pypdir}/${name}_vs_${VERSION}_${TYPE}_${DDA_METHOD}_dia"
    echo "Deleting previous swath output file: ${tb_output_prefix}.osw"
    rm -f "${tb_output_prefix}.osw"
    OpenSwathWorkflow \
        -force \
        -ini "parameters/openms_${VERSION}.ini" \
        -in "${in_mzxml}" \
        -swath_windows_file "windows/openswath_${name}.txt" \
        -tr "${TUBERCULIST_PQP}" \
        -out_osw "${tb_output_prefix}.osw" \
        2>"${tb_output_prefix}_osw.log" 1>&2
    if [[ "$?" -ne "0" ]]; then
        echo "OpenSwathWorkflow for ${name} failed."
    fi

    rm -f "${tb_output_prefix}_scored.osw"
    echo "Scoring individual swath run: ${tb_output_prefix}"
    pyprophet \
        score \
        --in "${tb_output_prefix}.osw" \
        --out "${pyprophet_output_prefix}_scored.osw" \
    2>>"${pyprophet_output_prefix}_pyprophet_all.log" 1>&2
    rm -f "${pyprophet_output_prefix}_scored.tsv"
    echo "Exporting individual swath run: to ${pyprophet_output_prefix}_scored.tsv"
    pyprophet \
        export \
        --in "${pyprophet_output_prefix}_scored.osw" \
        --out "${pyprophet_output_prefix}_scored.tsv" \
        2>>"${pyprophet_output_prefix}_pyprophet_export.log" 1>&2
    ## ok something is fubar, the stupid tsv files are being written in the cwd as run_filename.tsv
    ## No matter what I do!
    mv "${input}.tsv" "${pyprophet_output_prefix}_scored.tsv"
    if [[ "$?" -ne "0" ]]; then
        echo "Exporting ${pyprophet_output_prefix}_scored.tsv failed."
    fi
done

7 Merging the Tuberculist-derived data with TRIC

Finally, block 17 of the invocation script provides the command used to make the final, feature-aligned data which is used by SWATH2stats and friends. In addition, it generates a matrix of intensities by sample and some metadata. Once again, it is copy/pasted here to allow interactive testing.

8 Index version: 20180913

9 TODO

## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 8ca465bb9928ffe95082f64aed9cf64799bbf8e6
## This is hpgltools commit: Wed Jul 31 16:40:59 2019 -0400: 8ca465bb9928ffe95082f64aed9cf64799bbf8e6
## Saving to 01_preprocessing_comet_20180806-v20180913.rda.xz

R version 3.6.0 (2019-04-26)

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

other attached packages: hpgltools(v.1.0), Biobase(v.2.44.0) and BiocGenerics(v.0.30.0)

loaded via a namespace (and not attached): backports(v.1.1.4), fastmatch(v.1.1-0), plyr(v.1.8.4), igraph(v.1.2.4.1), lazyeval(v.0.2.2), splines(v.3.6.0), BiocParallel(v.1.18.1), usethis(v.1.5.1), GenomeInfoDb(v.1.20.0), ggplot2(v.3.2.1), urltools(v.1.7.3), sva(v.3.32.1), digest(v.0.6.20), foreach(v.1.4.7), htmltools(v.0.3.6), GOSemSim(v.2.10.0), viridis(v.0.5.1), GO.db(v.3.8.2), gdata(v.2.18.0), magrittr(v.1.5), memoise(v.1.1.0), doParallel(v.1.0.15), openxlsx(v.4.1.0.1), limma(v.3.40.6), remotes(v.2.1.0), Biostrings(v.2.52.0), annotate(v.1.62.0), matrixStats(v.0.54.0), enrichplot(v.1.4.0), prettyunits(v.1.0.2), colorspace(v.1.4-1), blob(v.1.2.0), ggrepel(v.0.8.1), xfun(v.0.8), dplyr(v.0.8.3), callr(v.3.3.1), crayon(v.1.3.4), RCurl(v.1.95-4.12), jsonlite(v.1.6), genefilter(v.1.66.0), lme4(v.1.1-21), zeallot(v.0.1.0), survival(v.2.44-1.1), iterators(v.1.0.12), glue(v.1.3.1), polyclip(v.1.10-0), gtable(v.0.3.0), zlibbioc(v.1.30.0), XVector(v.0.24.0), UpSetR(v.1.4.0), DelayedArray(v.0.10.0), pkgbuild(v.1.0.4), scales(v.1.0.0), DOSE(v.3.10.2), DBI(v.1.0.0), Rcpp(v.1.0.2), viridisLite(v.0.3.0), xtable(v.1.8-4), progress(v.1.2.2), gridGraphics(v.0.4-1), bit(v.1.1-14), europepmc(v.0.3), stats4(v.3.6.0), httr(v.1.4.1), fgsea(v.1.10.0), gplots(v.3.0.1.1), RColorBrewer(v.1.1-2), pkgconfig(v.2.0.2), XML(v.3.98-1.20), farver(v.1.1.0), ggplotify(v.0.0.4), tidyselect(v.0.2.5), rlang(v.0.4.0), reshape2(v.1.4.3), AnnotationDbi(v.1.46.0), munsell(v.0.5.0), tools(v.3.6.0), cli(v.1.1.0), RSQLite(v.2.1.2), ggridges(v.0.5.1), devtools(v.2.1.0), evaluate(v.0.14), stringr(v.1.4.0), yaml(v.2.2.0), processx(v.3.4.1), knitr(v.1.24), bit64(v.0.9-7), fs(v.1.3.1), pander(v.0.6.3), zip(v.2.0.3), caTools(v.1.17.1.2), purrr(v.0.3.2), ggraph(v.1.0.2), nlme(v.3.1-141), xml2(v.1.2.2), DO.db(v.2.9), biomaRt(v.2.40.3), compiler(v.3.6.0), pbkrtest(v.0.4-7), rstudioapi(v.0.10), variancePartition(v.1.14.0), testthat(v.2.2.1), tibble(v.2.1.3), tweenr(v.1.0.1), stringi(v.1.4.3), ps(v.1.3.0), GenomicFeatures(v.1.36.4), desc(v.1.2.0), lattice(v.0.20-38), Matrix(v.1.2-17), nloptr(v.1.2.1), vctrs(v.0.2.0), pillar(v.1.4.2), triebeard(v.0.3.0), data.table(v.1.12.2), cowplot(v.1.0.0), bitops(v.1.0-6), rtracklayer(v.1.44.2), GenomicRanges(v.1.36.0), qvalue(v.2.16.0), colorRamps(v.2.3), R6(v.2.4.0), KernSmooth(v.2.23-15), gridExtra(v.2.3), IRanges(v.2.18.1), sessioninfo(v.1.1.1), codetools(v.0.2-16), boot(v.1.3-23), MASS(v.7.3-51.4), gtools(v.3.8.1), assertthat(v.0.2.1), pkgload(v.1.0.2), SummarizedExperiment(v.1.14.1), rprojroot(v.1.3-2), withr(v.2.1.2), GenomicAlignments(v.1.20.1), Rsamtools(v.2.0.0), S4Vectors(v.0.22.0), GenomeInfoDbData(v.1.2.1), mgcv(v.1.8-28), hms(v.0.5.0), clusterProfiler(v.3.12.0), grid(v.3.6.0), tidyr(v.0.8.3), minqa(v.1.2.4), rvcheck(v.0.1.3), rmarkdown(v.1.14), ggforce(v.0.3.0) and base64enc(v.0.1-3)

LS0tCnRpdGxlOiAiTS50dWJlcmN1bG9zaXMgMjAxODA5MTM6IFByZXByb2Nlc3NpbmcgRElBIGRhdGEgd2l0aCB0d28gbGlicmFyaWVzLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldCh3aWR0aD0xMjAsCiAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3I9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGRwaT05NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICBtYXgucHJpbnQ9MTIwLAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQp2ZXIgPC0gIjIwMTgwOTEzIgpwcmV2aW91c19maWxlIDwtICIwMV9hbm5vdGF0aW9uXzIwMTgwOTEzLlJtZCIKCnRtcCA8LSB0cnkoc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpKQpybWRfZmlsZSA8LSAiMDFfcHJlcHJvY2Vzc2luZ19jb21ldF8yMDE4MDgwNi5SbWQiCmBgYAoKIyBPcGVuU3dhdGhXb3JrZmxvdyBhZ2FpbnN0IHRoZSBUdWJlcmN1bGlzdCB0cmFuc2l0aW9ucwoKVGhlIGZvbGxvd2luZyBpbnZvY2F0aW9ucyBvZiBPcGVuTVMvcHlwcm9waGV0L3RyaWMgYXJlIGluY2x1ZGVkIGluOgoKW2RpYV9pbnZvY2F0aW9uXzIwMTgwOTEzLnNoXShkaWFfaW52b2NhdGlvbl8yMDE4MDkxMy5zaCkKClRoaXMgc2NyaXB0IGluY2x1ZGVzIHRoZSBwcm9jZXNzIGZvciBnZW5lcmF0aW5nIGEgbG9jYWwsIGNvbWV0LWJhc2VkIHRyYW5zaXRpb24KbGlicmFyeSBmcm9tIEREQSBzYW1wbGVzIGdlbmVyYXRlZCBsb2NhbGx5IGFzIHdlbGwgYXMgdGhlIHN0ZXBzIHVzZWQgd2hlbgpwcm9jZXNzaW5nIHRoZSBkb3dubG9hZGVkIHRyYW5zaXRpb24gbGlicmFyaWVzLgoKIyBHYXRoZXJpbmcgcGFyYW1ldGVycwoKSW4gdGhpcyBmaXJzdCBibG9jaywgSSB3aWxsIHNldCBhIGNvdXBsZSBvZiB2YXJpYWJsZXMgYW5kIHNvdXJjZSBhIGZpbGUKY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHNjcmlwdC4KCmBgYHtiYXNoIHBhcmFtZXRlcnMsIGV2YWw9RkFMU0V9CmV4cG9ydCBWRVJTSU9OPSIyMDE4MDkxMyIKc291cmNlIHBhcmFtZXRlcnMvMjAxODA5MTNfc2V0dGluZ3Muc2gKYGBgCgojIFBsb3R0aW5nIG1ldHJpY3Mgb2YgdGhlIHJhdyBkYXRhCgpUaGUgcmF3IGRhdGEgZmlsZXMgcHJvdmlkZSBvcHBvcnR1bml0aWVzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsYXRlciBpbnZvY2F0aW9ucwpvZiBvcGVuTVMvZXRjIHdpbGwgYWN0dWFsbHkgd29yazsgZm9yIGV4YW1wbGUsIGlmIHRoZXJlIGFyZSB0b28gZmV3IHRyYW5zaXRpb25zCm9ic2VydmVkIGhlcmUsIG9uZSBzaG91bGQgbm90IGJlIHN1cnByaXNlZCBpZiBweXByb3BoZXQgYW5kIHRyaWMgZmFpbCBsYXRlci4KCmBgYHtyIGRpYV9tZXRyaWNzfQpzYW1wbGVfc2hlZXQgPC0gZ2x1ZTo6Z2x1ZSgic2FtcGxlX3NoZWV0cy9NdGJfZGlhX3NhbXBsZXNfe3Zlcn0ueGxzeCIpCnNhdmVmaWxlIDwtICJtenhtbF9kaWFfZGF0YV8yMDE4MDkxMy5yZGEiCgptZXRhZGF0YSA8LSBvcGVueGxzeDo6cmVhZC54bHN4KHNhbXBsZV9zaGVldCkKa2VlcGVyX2lkeCA8LSAhZ3JlcGwocGF0dGVybj0iXiMiLCB4PW1ldGFkYXRhW1sic2FtcGxlaWQiXV0pCm1ldGFkYXRhIDwtIG1ldGFkYXRhW2tlZXBlcl9pZHgsIF0Ka25pdHI6OmthYmxlKG1ldGFkYXRhKQoKdG1waWR4IDwtIGdyZXAocGF0dGVybj0iMjAxOF8wODE3IiwgeD1tZXRhZGF0YVtbInNhbXBsZWlkIl1dKQptZXRhZGF0YSA8LSBtZXRhZGF0YVt0bXBpZHgsIF0KCmlmIChmaWxlLmV4aXN0cyhzYXZlZmlsZSkpIHsKICBsb2FkKHNhdmVmaWxlKQp9IGVsc2UgewogIG16eG1sX2RhdGEgPC0gZXh0cmFjdF9tc3Jhd19kYXRhKG1ldGFkYXRhLCBwYXJhbGxlbD1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd193aW5kb3dfb3ZlcmxhcD1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbj0iRmlsZW5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVmaWxlPXNhdmVmaWxlKQogIG16bWxfZGF0YSA8LSBleHRyYWN0X21zcmF3X2RhdGEobWV0YWRhdGEsIHBhcmFsbGVsPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0PSJtek1MIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3dpbmRvd19vdmVybGFwPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW49Im16bWxmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVmaWxlPSJ0ZXN0aW5nLnJkYSIpCn0KCmludGVuc2l0eV9ib3hwbG90IDwtIHBsb3RfbXp4bWxfYm94cGxvdChtenhtbF9kYXRhKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzLzIwMTgwOTEzX2RpYV9tenhtbF9pbnRlbnNpdGllcy12IiwgdmVyLCAiLnBuZyIpLCBpbWFnZT1pbnRlbnNpdHlfYm94cGxvdCkKCnJldGVudGlvbl9ib3hwbG90IDwtIHBsb3RfbXp4bWxfYm94cGxvdChtenhtbF9kYXRhLCB0YWJsZT0ic2NhbnMiLCBjb2x1bW49InBlYWtzY291bnQiKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzLzIwMTgwOTEzX2RpYV9tenhtbF9yZXRlbnRpb24tdiIsIHZlciwgIi5wbmciKSwgaW1hZ2U9cmV0ZW50aW9uX2JveHBsb3QpCgptel9ib3hwbG90IDwtIHBsb3RfbXp4bWxfYm94cGxvdChtenhtbF9kYXRhLCB0YWJsZT0ic2NhbnMiLCBjb2x1bW49ImJhc2VwZWFrbXoiKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzLzIwMTgwOTEzX2RpYV9tenhtbF9temJhc2UtdiIsIHZlciwgIi5wbmciKSwgaW1hZ2U9bXpfYm94cGxvdCkKCnNjYW5pbnRlbnNpdHlfYm94cGxvdCA8LSBwbG90X216eG1sX2JveHBsb3QobXp4bWxfZGF0YSwgdGFibGU9InNjYW5zIiwgY29sdW1uPSJiYXNlcGVha2ludGVuc2l0eSIpCnBwKGZpbGU9cGFzdGUwKCJpbWFnZXMvMjAxODA5MTNfZGlhX216eG1sX3NjYW5pbnRlbnNpdHktdiIsIHZlciwgIi5wbmciKSwgaW1hZ2U9c2NhbmludGVuc2l0eV9ib3hwbG90KQoKIyNpbnRlbnNpdHlfd3J0X216IDwtIHBsb3RfaW50ZW5zaXR5X216KG16eG1sX2RhdGEsIHhfc2NhbGU9ImxvZyIsIHlfc2NhbGU9ImxvZyIpCiMjcHAoZmlsZT1wYXN0ZTAoImltYWdlcy8yMDE4MDVfZGlhX2ludGVuc2l0eV93cnRfbXpfZGlhLXYiLCB2ZXIsICIucG5nIiksIGltYWdlPWludGVuc2l0eV93cnRfbXopCmBgYAoKIyBRdWVyeSB0aW1lIHNwZW50IHZzLiBwZWFrcyBvYnNlcnZlZC4KCmBgYHtyIHF1ZXJ5X3RpbWVfcGVha3N9CgpgYGAKCiMgQ29udmVydGluZyBkb3dubG9hZGVkIHRyYW5zaXRpb25zCgpJbiBibG9jayAxNSBvZiBkaWFfaW52b2NhdGlvbl8yMDE4MDkxMy5zaCB0aGUgY29tbWFuZCB1c2VkIGlzIHByZXN0ZWQgYW5kIGNvcGllZApoZXJlIGZvciBpbnRlcmFjdGl2ZSBydW5uaW5nLgoKYGBge2Jhc2ggdHViZXJjdWxpc3RfY29udmVyc2lvbiwgZXZhbD1GQUxTRX0KZWNobyAiQ29udmVydGluZyB0aGUgVHViZXJjdWxpc3QgbGlicmFyaWVzIHRvIHBxcC4iClRVQkVSQ1VMSVNUX1RSQU1MPSJwcmVwcm9jZXNzaW5nLzA1c3BlY3RyYWxfbGlicmFyaWVzL010Yl9UdWJlcmN1TGlzdC1SMjdfaVJUX1VQU19ub01veF9ub01DX3NhbGxfb3N3X2RlY295LlRyYU1MIgplY2hvICJUaGUgaW5wdXQgaXM6ICR7VFVCRVJDVUxJU1RfVFJBTUx9IgplY2hvICJUaGUgb3V0cHV0IGlzOiAke1RVQkVSQ1VMSVNUX1BRUH0iCm1rZGlyIC1wICQoZGlybmFtZSAke1RVQkVSQ1VMSVNUX1BRUH0pClRhcmdldGVkRmlsZUNvbnZlcnRlciBcCiAgICAtaW4gIiR7VFVCRVJDVUxJU1RfVFJBTUx9IiBcCiAgICAtaW5fdHlwZSBUcmFNTCBcCiAgICAtb3V0ICIke1RVQkVSQ1VMSVNUX1BRUH0iIFwKICAgIC1vdXRfdHlwZSBwcXAgXAogICAgMj4iJHtUVUJFUkNVTElTVF9QUVB9X2NvbnZlcnQubG9nIiAxPiYyCmBgYAoKIyBPcGVuU3dhdGhXb3JrZmxvdyBpbnZvY2F0aW9uCgpibG9jayAxNiBjb250YWlucyB0aGUgY29tbWFuZHMgdXNlZCB0byBydW4gb3BlbnN3YXRod29ya2Zsb3cgYW5kIHB5cHJvcGhldC4KVGhvc2UgYXJlIHJlcGVhdGVkIGhlcmUgaW4gb3JkZXIgdG8gdGVzdCB0aGVtIGludGVyYWN0aXZlbHkgd2hlbiBuZWVkZWQuCgpgYGB7YmFzaCBvcGVuc3dhdGhfdHViZXJjdWxpc3QsIGV2YWw9RkFMU0V9CmVjaG8gIkludm9raW5nIHRoZSBPcGVuU3dhdGhXb3JrZmxvdyB1c2luZyB0aGUgdHViZXJjdWxpc3QgdHJhbnNpdGlvbnMuIgpiYXNlX216eG1sZGlyPSJwcmVwcm9jZXNzaW5nLzAxbXpYTUwvZGlhLyR7VkVSU0lPTn0iCnN3YXRoX2lucHV0cz0kKC9iaW4vbHMgIiR7YmFzZV9tenhtbGRpcn0iKQplY2hvICJDaGVja2luZyBpbiwgdGhlIGlucHV0cyBhcmU6ICR7c3dhdGhfaW5wdXRzfSIKbWtkaXIgLXAgIiR7VFVCRVJDVUxJU1RfT1VURElSfSIKcHlwZGlyPSIke1BZUFJPUEhFVF9PVVRESVJ9X3R1YmVyY3VsaXN0IgplY2hvICJDcmVhdGluZyBweXByb3BoZXQgb3V0cHV0IGRpcmVjdG9yeTogJHtweXBkaXJ9LiIKbWtkaXIgLXAgIiR7cHlwZGlyfSIKZm9yIGlucHV0IGluICR7c3dhdGhfaW5wdXRzfQpkbwogICAgaW5fbXp4bWw9IiR7YmFzZV9tenhtbGRpcn0vJHtpbnB1dH0iCiAgICBuYW1lPSQoYmFzZW5hbWUgIiR7aW5wdXR9IiAubXpYTUwpCiAgICBlY2hvICJTdGFydGluZyBvcGVuc3dhdGggcnVuIG9mICR7bmFtZX0gdXNpbmcgJHtNWl9XSU5ET1dTfSB3aW5kb3dzIGF0ICQoZGF0ZSkuIgogICAgdGJfb3V0cHV0X3ByZWZpeD0iJHtUVUJFUkNVTElTVF9PVVRESVJ9LyR7bmFtZX1fdnNfJHtWRVJTSU9OfV8ke1RZUEV9XyR7RERBX01FVEhPRH1fZGlhIgogICAgcHlwcm9waGV0X291dHB1dF9wcmVmaXg9IiR7cHlwZGlyfS8ke25hbWV9X3ZzXyR7VkVSU0lPTn1fJHtUWVBFfV8ke0REQV9NRVRIT0R9X2RpYSIKICAgIGVjaG8gIkRlbGV0aW5nIHByZXZpb3VzIHN3YXRoIG91dHB1dCBmaWxlOiAke3RiX291dHB1dF9wcmVmaXh9Lm9zdyIKICAgIHJtIC1mICIke3RiX291dHB1dF9wcmVmaXh9Lm9zdyIKICAgIE9wZW5Td2F0aFdvcmtmbG93IFwKICAgICAgICAtZm9yY2UgXAogICAgICAgIC1pbmkgInBhcmFtZXRlcnMvb3Blbm1zXyR7VkVSU0lPTn0uaW5pIiBcCiAgICAgICAgLWluICIke2luX216eG1sfSIgXAogICAgICAgIC1zd2F0aF93aW5kb3dzX2ZpbGUgIndpbmRvd3Mvb3BlbnN3YXRoXyR7bmFtZX0udHh0IiBcCiAgICAgICAgLXRyICIke1RVQkVSQ1VMSVNUX1BRUH0iIFwKICAgICAgICAtb3V0X29zdyAiJHt0Yl9vdXRwdXRfcHJlZml4fS5vc3ciIFwKICAgICAgICAyPiIke3RiX291dHB1dF9wcmVmaXh9X29zdy5sb2ciIDE+JjIKICAgIGlmIFtbICIkPyIgLW5lICIwIiBdXTsgdGhlbgogICAgICAgIGVjaG8gIk9wZW5Td2F0aFdvcmtmbG93IGZvciAke25hbWV9IGZhaWxlZC4iCiAgICBmaQoKICAgIHJtIC1mICIke3RiX291dHB1dF9wcmVmaXh9X3Njb3JlZC5vc3ciCiAgICBlY2hvICJTY29yaW5nIGluZGl2aWR1YWwgc3dhdGggcnVuOiAke3RiX291dHB1dF9wcmVmaXh9IgogICAgcHlwcm9waGV0IFwKICAgICAgICBzY29yZSBcCiAgICAgICAgLS1pbiAiJHt0Yl9vdXRwdXRfcHJlZml4fS5vc3ciIFwKICAgICAgICAtLW91dCAiJHtweXByb3BoZXRfb3V0cHV0X3ByZWZpeH1fc2NvcmVkLm9zdyIgXAogICAgMj4+IiR7cHlwcm9waGV0X291dHB1dF9wcmVmaXh9X3B5cHJvcGhldF9hbGwubG9nIiAxPiYyCiAgICBybSAtZiAiJHtweXByb3BoZXRfb3V0cHV0X3ByZWZpeH1fc2NvcmVkLnRzdiIKICAgIGVjaG8gIkV4cG9ydGluZyBpbmRpdmlkdWFsIHN3YXRoIHJ1bjogdG8gJHtweXByb3BoZXRfb3V0cHV0X3ByZWZpeH1fc2NvcmVkLnRzdiIKICAgIHB5cHJvcGhldCBcCiAgICAgICAgZXhwb3J0IFwKICAgICAgICAtLWluICIke3B5cHJvcGhldF9vdXRwdXRfcHJlZml4fV9zY29yZWQub3N3IiBcCiAgICAgICAgLS1vdXQgIiR7cHlwcm9waGV0X291dHB1dF9wcmVmaXh9X3Njb3JlZC50c3YiIFwKICAgICAgICAyPj4iJHtweXByb3BoZXRfb3V0cHV0X3ByZWZpeH1fcHlwcm9waGV0X2V4cG9ydC5sb2ciIDE+JjIKICAgICMjIG9rIHNvbWV0aGluZyBpcyBmdWJhciwgdGhlIHN0dXBpZCB0c3YgZmlsZXMgYXJlIGJlaW5nIHdyaXR0ZW4gaW4gdGhlIGN3ZCBhcyBydW5fZmlsZW5hbWUudHN2CiAgICAjIyBObyBtYXR0ZXIgd2hhdCBJIGRvIQogICAgbXYgIiR7aW5wdXR9LnRzdiIgIiR7cHlwcm9waGV0X291dHB1dF9wcmVmaXh9X3Njb3JlZC50c3YiCiAgICBpZiBbWyAiJD8iIC1uZSAiMCIgXV07IHRoZW4KICAgICAgICBlY2hvICJFeHBvcnRpbmcgJHtweXByb3BoZXRfb3V0cHV0X3ByZWZpeH1fc2NvcmVkLnRzdiBmYWlsZWQuIgogICAgZmkKZG9uZQpgYGAKCiMgTWVyZ2luZyB0aGUgVHViZXJjdWxpc3QtZGVyaXZlZCBkYXRhIHdpdGggVFJJQwoKRmluYWxseSwgYmxvY2sgMTcgb2YgdGhlIGludm9jYXRpb24gc2NyaXB0IHByb3ZpZGVzIHRoZSBjb21tYW5kIHVzZWQgdG8gbWFrZSB0aGUKZmluYWwsIGZlYXR1cmUtYWxpZ25lZCBkYXRhIHdoaWNoIGlzIHVzZWQgYnkgU1dBVEgyc3RhdHMgYW5kIGZyaWVuZHMuICBJbgphZGRpdGlvbiwgaXQgZ2VuZXJhdGVzIGEgbWF0cml4IG9mIGludGVuc2l0aWVzIGJ5IHNhbXBsZSBhbmQgc29tZSBtZXRhZGF0YS4KT25jZSBhZ2FpbiwgaXQgaXMgY29weS9wYXN0ZWQgaGVyZSB0byBhbGxvdyBpbnRlcmFjdGl2ZSB0ZXN0aW5nLgoKYGBge2Jhc2ggdHViX3RyaWMsIGV2YWw9RkFMU0V9CnRyaWNfdGI9IiR7VFJJQ19PVVRESVJ9X3R1YmVyY3VsaXN0Igpta2RpciAtcCAiJHt0cmljX3RifSIKZmVhdHVyZV9hbGlnbm1lbnQucHkgXAogIC0tZm9yY2UgXAogIC0taW4gIi4vJHtweXBkaXJ9LyIqLnRzdiBcCiAgLS1vdXQgIiR7dHJpY190Yn0vJHtTRUFSQ0hfTUVUSE9EfV8ke0REQV9NRVRIT0R9LnRzdiIgXAogIC0tb3V0X21hdHJpeCAiJHt0cmljX3RifS8ke0REQV9NRVRIT0R9X291dG1hdHJpeC50c3YiIFwKICAtLW91dF9tZXRhICIke3RyaWNfdGJ9LyR7RERBX01FVEhPRH1fbWV0YS50c3YiIFwKICAyPiIke3RyaWNfdGJ9L2ZlYXR1cmVfYWxpZ25tZW50LmVyciIgXAogIDE+IiR7dHJpY190Yn0vZmVhdHVyZV9hbGlnbm1lbnQub3V0IgplY2hvICJXcm90ZSBmaW5hbCBvdXRwdXQgdG8gJHt0cmljX3RifS8ke1NFQVJDSF9NRVRIT0R9XyR7RERBX01FVEhPRH0udHN2IgpgYGAKCiMgSW5kZXggdmVyc2lvbjogYHIgdmVyYAoKIyBUT0RPCgpgYGB7ciBzYXZlbWV9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIG1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQogIHRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCiAgbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQogIHRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKSkKICBwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQp9CmBgYAo=