1 Introduction

I spent some time playing with cellranger and its various options for treating gex/atac and their combined datatypes. I think it is unlikely that more than ~ 100 cells are likely to be detected in any combination of options. I therefore thought it would be interesting to attempt treating the samples as separate expression/atac datasets and see if I can learn about the state of the experiment from them.

2 Annotation data

It might prove the case that downloading annotations from biomart does not work, I have been getting a large number of timeouts and failures recently.

rn_biomart <- load_biomart_annotations(species = "rnorvegicus", year = 2022, month = "oct",
                                       symbol_columns = "external_gene_name", overwrite = TRUE)
## Using mart: ENSEMBL_MART_ENSEMBL from host: oct2022.archive.ensembl.org.
## Successfully connected to the rnorvegicus_gene_ensembl database.
## Finished downloading ensembl gene annotations.
## Finished downloading ensembl structure annotations.
## Including symbols, there are 30560 vs the 54991 gene annotations.
## Not dropping haplotype chromosome annotations, set drop_haplotypes = TRUE if this is bad.
## Saving annotations to rnorvegicus_biomart_annotations.rda.
## Finished save().
rn_gff <- load_gff_annotations("~/libraries/genome/gff/rnorvegicus_7.2_107.gff")
## Returning a df with 26 columns and 1426516 rows.
rn_annot <- rn_biomart[["gene_annotations"]]

#rn_example <- get_biomart_example_gene(species = "rnorvegicus",
#                                       host = "useast.ensembl.org", archive = FALSE)

3 Metadata

My annotation collection tool is unaware of atac data. I think therefore I will try runing it and just see what happens.

sample_sheet <- "sample_sheets/all_samples.xlsx"
rn_meta <- gather_preprocessing_metadata(sample_sheet,
                                         species = "rnorvegicus_7.2_107")
## Did not find the condition column in the sample sheet.
## Filling it in as undefined.
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## Checking the state of the condition column.
## Checking the state of the batch column.
## Checking the condition factor.
## Writing new metadata to: sample_sheets/all_samples_modified.xlsx
## Deleting the file sample_sheets/all_samples_modified.xlsx before writing the tables.

It fails utterly.

4 Create gex summarized Experiment

rn_se <- create_se(sample_sheet, gene_info = rn_annot, file_column = "gex_count_table") %>%
  set_conditions(fact = "treatment") %>%
  set_batches(fact = "replicate")
## Reading the sample metadata.
## Did not find the condition column in the sample sheet.
## Filling it in as undefined.
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## Checking the state of the condition column.
## Checking the state of the batch column.
## Checking the condition factor.
## The sample definitions comprises: 8 rows(samples) and 8 columns(metadata fields).
## Warning in create_se(sample_sheet, gene_info = rn_annot, file_column = "gex_count_table"): Some samples
## were removed when cross referencing the samples against the count data.
## Matched 23139 annotations and counts.
## The final summarized experiment has 23139 rows and 8 columns.
## The numbers of samples by condition are:
## 
## oxycodone    saline 
##         2         2
## The number of samples by batch are:
## 
## r1 r2 
##  2  2

5 Check it out

rn_libsize <- plot_libsize(rn_se)
pp(file = "images/rn_libsize.png")
rn_libsize[["plot"]]
dev.off()
## png 
##   2
rn_libsize
## Library sizes of 4 samples, 
## ranging from 31,404,515 to 59,790,154.

rn_nz <- plot_nonzero(rn_se, y_intercept = 0.75)
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## ℹ The deprecated feature was likely used in the hpgltools package.
##   Please report the issue to the authors.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
pp(file = "images/rn_nz.png")
rn_nz[["plot"]]
dev.off()
## png 
##   2
rn_nz
## A non-zero genes plot of 4 samples.
## These samples have an average 43.89 CPM coverage and 16993 genes observed, ranging from 16121 to
## 17693.

5.1 Normalize

rn_norm <- normalize(rn_se, transform = "log2", convert = "cpm", filter = TRUE)
## Removing 11208 low-count genes (11931 remaining).
## transform_counts: Found 277 values equal to 0, adding 1 to the matrix.
rn_disheat <- plot_disheat(rn_norm)
pp(file = "images/rn_disheat.png")
rn_disheat[["plot"]]
dev.off()
## png 
##   2
rn_disheat
## A heatmap of pairwise sample distances ranging from: 
## 86.762864144945 to 187.411008453202.

rn_corheat <- plot_corheat(rn_norm)
pp(file = "images/rn_corheat.png")
rn_corheat[["plot"]]
dev.off()
## png 
##   2
rn_corheat
## A heatmap of pairwise sample correlations ranging from: 
## 0.728550215536099 to 0.92793236561988.

rn_npca <- plot_pca(rn_norm)
pp(file = "images/rn_npca.png")
rn_npca[["plot"]]
dev.off()
## png 
##   2
rn_npca
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by oxycodone, saline
## Shapes are defined by r1, r2.

rn_nb <- normalize(rn_se, transform = "log2", convert = "cpm", filter = TRUE, batch = "pca")
## Removing 11208 low-count genes (11931 remaining).
## transform_counts: Found 318 values less than 0.
## transform_counts: Found 318 values equal to 0, adding 1 to the matrix.
rn_nbpca <- plot_pca(rn_nb)
pp(file = "images/rn_nbpca.png")
rn_nbpca[["plot"]]
dev.off()
## png 
##   2
rn_nbpca
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by oxycodone, saline
## Shapes are defined by r1, r2.

6 Compare the two conditions

pairs <- all_pairwise(rn_se, model_svs = "svaseq", force = TRUE,
                      model_fstring = "~ 0 + condition", filter = TRUE)
## oxycodone    saline 
##         2         2
## Removing 11208 low-count genes (11931 remaining).
## Basic step 0/3: Normalizing data.
## Basic step 0/3: Converting data.
## I think this is failing? SummarizedExperiment
## Basic step 0/3: Transforming data.
## Setting 1552 entries to zero.
## Warning in choose_binom_dataset(input, force = force): This data was inappropriately forced into
## integers.
## This received a matrix of SVs.
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## Warning in choose_binom_dataset(input, force = force): This data was inappropriately forced into
## integers.
## Warning in choose_binom_dataset(input, force = force): This data was inappropriately forced into
## integers.
## conditions
## oxycodone    saline 
##         2         2
## conditions
## oxycodone    saline 
##         2         2
## Warning in choose_binom_dataset(input, force = force): This data was inappropriately forced into
## integers.
## conditions
## oxycodone    saline 
##         2         2
pairs
## A pairwise differential expression with results from: basic, deseq, ebseq, edger, limma, noiseq.
## This used a surrogate/batch estimate from: svaseq.
## The primary analysis performed 1 comparisons.
## The logFC agreement among the methods follows:
##                 sln_vs_xyc
## basic_vs_deseq      0.6590
## basic_vs_dream      0.7010
## basic_vs_ebseq      0.8425
## basic_vs_edger      0.6577
## basic_vs_noiseq     0.8905
## deseq_vs_dream      0.9106
## deseq_vs_ebseq      0.6616
## deseq_vs_edger      0.9996
## deseq_vs_noiseq     0.6794
## dream_vs_ebseq      0.6339
## dream_vs_edger      0.9091
## dream_vs_noiseq     0.7200
## ebseq_vs_edger      0.6615
## ebseq_vs_noiseq     0.8728
## edger_vs_noiseq     0.6788
table <- combine_de_tables(pairs, label_column = "external_gene_name",
                           excel = "excel/pairs.xlsx")
## Deleting the file excel/pairs.xlsx before writing the tables.
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
table
## A set of combined differential expression results.
##                 table deseq_sigup deseq_sigdown edger_sigup edger_sigdown limma_sigup limma_sigdown
## 1 saline_vs_oxycodone         117             7          41             3          21             1
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## ℹ The deprecated feature was likely used in the UpSetR package.
##   Please report the issue to the authors.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## ℹ The deprecated feature was likely used in the UpSetR package.
##   Please report the issue to the authors.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
## Plot describing unique/shared genes in a differential expression table.

sig <- extract_significant_genes(table, excel = "excel/sig.xlsx", according_to = "limma")
## Deleting the file excel/sig.xlsx before writing the tables.
sig
## A set of genes deemed significant according to limma.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##                     limma_up limma_down
## saline_vs_oxycodone       21          1
## Warning in min(x): no non-missing arguments to min; returning Inf
## Warning in max(x): no non-missing arguments to max; returning -Inf
## Warning in min(x): no non-missing arguments to min; returning Inf
## Warning in max(x): no non-missing arguments to max; returning -Inf

## Error in `plot.window()`:
## ! need finite 'xlim' values

Limma volcano plot

In theory, the column ‘external_gene_name’ should provide reasonable genenames, but I am having some troubles extracting it from ensembl.

pp(file = "images/gex_volcano.png")
table[["plots"]][["saline_vs_oxycodone"]][["limma_vol_plots"]]
dev.off()
## png 
##   2
table[["plots"]][["saline_vs_oxycodone"]][["limma_vol_plots"]]

ups <- sig[["limma"]][["ups"]][["saline_vs_oxycodone"]]
dim(ups)
## [1] 21 72
downs <- sig[["limma"]][["downs"]][["saline_vs_oxycodone"]]
dim(downs)
## [1]  1 72
gp_up <- simple_gprofiler(ups, species = "rnorvegicus")

tt <- plot_enrichresult(gp_up[["REAC_enrich"]])
## Warning in (function (model, data, ...) : Arguments in `...` must be used.
## ✖ Problematic argument:
## • by = "Count"
## ℹ Did you misspell an argument name?

7 Examine the ATAC results

Given my lack of experience with ATAC data, I am currently using

https://nbis-workshop-epigenomics.readthedocs.io/en/latest/content/tutorials/data-preproc/data-qc-atac.html

as a guide.

library(ATACseqQC)
## Loading required package: BiocGenerics
## Loading required package: generics
## 
## Attaching package: 'generics'
## The following objects are masked from 'package:base':
## 
##     as.difftime, as.factor, as.ordered, intersect, is.element, setdiff, setequal, union
## 
## Attaching package: 'BiocGenerics'
## The following objects are masked from 'package:hpgltools':
## 
##     annotation<-, conditions, conditions<-, IQR, mad, sd, var, xtabs
## The following objects are masked from 'package:stats':
## 
##     IQR, mad, sd, var, xtabs
## The following objects are masked from 'package:base':
## 
##     anyDuplicated, aperm, append, as.data.frame, basename, cbind, colnames, dirname, do.call,
##     duplicated, eval, evalq, Filter, Find, get, grep, grepl, is.unsorted, lapply, Map, mapply,
##     match, mget, order, paste, pmax, pmax.int, pmin, pmin.int, Position, rank, rbind, Reduce,
##     rownames, sapply, saveRDS, table, tapply, unique, unsplit, which.max, which.min
## Loading required package: S4Vectors
## Loading required package: stats4
## 
## Attaching package: 'S4Vectors'
## The following object is masked from 'package:utils':
## 
##     findMatches
## The following objects are masked from 'package:base':
## 
##     expand.grid, I, unname
library(BSgenome.Rnorvegicus.UCSC.rn7)
## Loading required package: BSgenome
## Loading required package: IRanges
## 
## Attaching package: 'IRanges'
## The following object is masked from 'package:hpgltools':
## 
##     trim
## Loading required package: Seqinfo
## Loading required package: GenomicRanges
## Loading required package: Biostrings
## Loading required package: XVector
## 
## Attaching package: 'Biostrings'
## The following object is masked from 'package:base':
## 
##     strsplit
## Loading required package: BiocIO
## 
## Attaching package: 'BiocIO'
## The following object is masked from 'package:reticulate':
## 
##     import
## Loading required package: rtracklayer
library(TxDb.Rnorvegicus.UCSC.rn7.refGene)
## Loading required package: GenomicFeatures
## Loading required package: AnnotationDbi
## Loading required package: Biobase
## Welcome to Bioconductor
## 
##     Vignettes contain introductory material; view with 'browseVignettes()'. To cite
##     Bioconductor, see 'citation("Biobase")', and for packages 'citation("pkgname")'.
## 
## Attaching package: 'Biobase'
## The following object is masked from 'package:hpgltools':
## 
##     notes
library(ChIPpeakAnno)
library(Rsamtools)

bam_outputs <- c(
  "preprocessing/1_saline_atac/outputs/40hisat_rnorvegicus_norway_grcr8/rnorvegicus_norway_grcr8_genome-paired.bam",
  "preprocessing/2_oxycodone_atac/outputs/40hisat_rnorvegicus_norway_grcr8/rnorvegicus_norway_grcr8_genome-paired.bam",
  "preprocessing/3_saline_atac/outputs/40hisat_rnorvegicus_norway_grcr8/rnorvegicus_norway_grcr8_genome-paired.bam",
  "preprocessing/4_oxycodone_atac/outputs/40hisat_rnorvegicus_norway_grcr8/rnorvegicus_norway_grcr8_genome-paired.bam")

bam_qc <- bamQC(bam_outputs[1], outPath = NULL)

possibleTag <- combn(LETTERS, 2)
possibleTag <- c(paste0(possibleTag[1, ], possibleTag[2, ]),
                 paste0(possibleTag[2, ], possibleTag[1, ]))
## This seems a bit stupid?  I already know what the primary sam tags are, should I not just
## have a list with their names and meanings?
bamTop100 <- scanBam(BamFile(bam_outputs[1], yieldSize = 100),
                    param = ScanBamParam(tag = possibleTag))[[1]]$tag
tags <- names(bamTop100)[lengths(bamTop100)>0]
tags
##  [1] "AS" "MD" "XG" "NH" "NM" "XM" "XN" "XO" "YS" "ZS" "YT"
gal = readBamFile(bam_outputs[1], tag = tags, asMates = TRUE, bigFile = TRUE)
out_dir <- "preprocessing/1_saline_atac/outputs/99atac_qc"
dir.create(out_dir, recursive = TRUE)
## Warning in dir.create(out_dir, recursive = TRUE): 'preprocessing/1_saline_atac/outputs/99atac_qc' already
## exists
shifted_bam <- file.path(out_dir, "shifted.bam")
gal1 = shiftGAlignmentsList(gal, outbam = shifted_bam)
##   |                                                                                                        |                                                                                                |   0%  |                                                                                                        |=                                                                                               |   1%  |                                                                                                        |==                                                                                              |   2%  |                                                                                                        |===                                                                                             |   3%  |                                                                                                        |====                                                                                            |   4%  |                                                                                                        |=====                                                                                           |   5%  |                                                                                                        |======                                                                                          |   6%  |                                                                                                        |======                                                                                          |   7%  |                                                                                                        |=======                                                                                         |   7%  |                                                                                                        |========                                                                                        |   8%  |                                                                                                        |=========                                                                                       |   9%  |                                                                                                        |=========                                                                                       |  10%  |                                                                                                        |==========                                                                                      |  11%  |                                                                                                        |===========                                                                                     |  11%  |                                                                                                        |============                                                                                    |  12%  |                                                                                                        |=============                                                                                   |  13%  |                                                                                                        |=============                                                                                   |  14%  |                                                                                                        |==============                                                                                  |  15%  |                                                                                                        |===============                                                                                 |  16%  |                                                                                                        |================                                                                                |  16%  |                                                                                                        |=================                                                                               |  17%  |                                                                                                        |=================                                                                               |  18%  |                                                                                                        |==================                                                                              |  19%  |                                                                                                        |===================                                                                             |  20%  |                                                                                                        |====================                                                                            |  20%  |                                                                                                        |====================                                                                            |  21%  |                                                                                                        |=====================                                                                           |  22%  |                                                                                                        |======================                                                                          |  23%  |                                                                                                        |=======================                                                                         |  24%  |                                                                                                        |========================                                                                        |  25%  |                                                                                                        |=========================                                                                       |  26%  |                                                                                                        |==========================                                                                      |  27%  |                                                                                                        |===========================                                                                     |  28%  |                                                                                                        |============================                                                                    |  29%  |                                                                                                        |============================                                                                    |  30%  |                                                                                                        |=============================                                                                   |  30%  |                                                                                                        |==============================                                                                  |  31%  |                                                                                                        |===============================                                                                 |  32%  |                                                                                                        |===============================                                                                 |  33%  |                                                                                                        |================================                                                                |  34%  |                                                                                                        |=================================                                                               |  34%  |                                                                                                        |==================================                                                              |  35%  |                                                                                                        |===================================                                                             |  36%  |                                                                                                        |===================================                                                             |  37%  |                                                                                                        |====================================                                                            |  38%  |                                                                                                        |=====================================                                                           |  39%  |                                                                                                        |======================================                                                          |  39%  |                                                                                                        |=======================================                                                         |  40%  |                                                                                                        |=======================================                                                         |  41%  |                                                                                                        |========================================                                                        |  42%  |                                                                                                        |=========================================                                                       |  43%  |                                                                                                        |==========================================                                                      |  43%  |                                                                                                        |==========================================                                                      |  44%  |                                                                                                        |===========================================                                                     |  45%  |                                                                                                        |============================================                                                    |  46%  |                                                                                                        |=============================================                                                   |  47%  |                                                                                                        |==============================================                                                  |  48%  |                                                                                                        |===============================================                                                 |  49%  |                                                                                                        |================================================                                                |  50%  |                                                                                                        |=================================================                                               |  51%  |                                                                                                        |==================================================                                              |  52%  |                                                                                                        |===================================================                                             |  53%  |                                                                                                        |====================================================                                            |  54%  |                                                                                                        |=====================================================                                           |  55%  |                                                                                                        |======================================================                                          |  56%  |                                                                                                        |======================================================                                          |  57%  |                                                                                                        |=======================================================                                         |  57%  |                                                                                                        |========================================================                                        |  58%  |                                                                                                        |=========================================================                                       |  59%  |                                                                                                        |=========================================================                                       |  60%  |                                                                                                        |==========================================================                                      |  61%  |                                                                                                        |===========================================================                                     |  61%  |                                                                                                        |============================================================                                    |  62%  |                                                                                                        |=============================================================                                   |  63%  |                                                                                                        |=============================================================                                   |  64%  |                                                                                                        |==============================================================                                  |  65%  |                                                                                                        |===============================================================                                 |  66%  |                                                                                                        |================================================================                                |  66%  |                                                                                                        |=================================================================                               |  67%  |                                                                                                        |=================================================================                               |  68%  |                                                                                                        |==================================================================                              |  69%  |                                                                                                        |===================================================================                             |  70%  |                                                                                                        |====================================================================                            |  70%  |                                                                                                        |====================================================================                            |  71%  |                                                                                                        |=====================================================================                           |  72%  |                                                                                                        |======================================================================                          |  73%  |                                                                                                        |=======================================================================                         |  74%  |                                                                                                        |========================================================================                        |  75%  |                                                                                                        |=========================================================================                       |  76%  |                                                                                                        |==========================================================================                      |  77%  |                                                                                                        |===========================================================================                     |  78%  |                                                                                                        |============================================================================                    |  79%  |                                                                                                        |============================================================================                    |  80%  |                                                                                                        |=============================================================================                   |  80%  |                                                                                                        |==============================================================================                  |  81%  |                                                                                                        |===============================================================================                 |  82%  |                                                                                                        |===============================================================================                 |  83%  |                                                                                                        |================================================================================                |  84%  |                                                                                                        |=================================================================================               |  84%  |                                                                                                        |==================================================================================              |  85%  |                                                                                                        |===================================================================================             |  86%  |                                                                                                        |===================================================================================             |  87%  |                                                                                                        |====================================================================================            |  88%  |                                                                                                        |=====================================================================================           |  89%  |                                                                                                        |======================================================================================          |  89%  |                                                                                                        |=======================================================================================         |  90%  |                                                                                                        |=======================================================================================         |  91%  |                                                                                                        |========================================================================================        |  92%  |                                                                                                        |=========================================================================================       |  93%  |                                                                                                        |==========================================================================================      |  93%  |                                                                                                        |==========================================================================================      |  94%  |                                                                                                        |===========================================================================================     |  95%  |                                                                                                        |============================================================================================    |  96%  |                                                                                                        |=============================================================================================   |  97%  |                                                                                                        |==============================================================================================  |  98%  |                                                                                                        |=============================================================================================== |  99%  |                                                                                                        |================================================================================================| 100%
pander::pander(sessionInfo())

R version 4.5.1 (2025-06-13)

Platform: x86_64-pc-linux-gnu

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

other attached packages: Rsamtools(v.2.26.0), ChIPpeakAnno(v.3.44.0), TxDb.Rnorvegicus.UCSC.rn7.refGene(v.3.15.0), GenomicFeatures(v.1.62.0), AnnotationDbi(v.1.72.0), Biobase(v.2.70.0), BSgenome.Rnorvegicus.UCSC.rn7(v.1.4.3), BSgenome(v.1.78.0), rtracklayer(v.1.70.1), BiocIO(v.1.20.0), Biostrings(v.2.78.0), XVector(v.0.50.0), GenomicRanges(v.1.62.1), Seqinfo(v.1.0.0), IRanges(v.2.44.0), ATACseqQC(v.1.34.0), S4Vectors(v.0.48.1), BiocGenerics(v.0.56.0), generics(v.0.1.4), edgeR(v.4.8.2), ruv(v.0.9.7.1), hpgltools(v.2026.03), testthat(v.3.3.2) and reticulate(v.1.45.0)

loaded via a namespace (and not attached): R.methodsS3(v.1.8.2), dichromat(v.2.0-0.1), GSEABase(v.1.72.0), progress(v.1.2.3), PROPER(v.1.42.0), HDF5Array(v.1.38.0), restez(v.2.1.5), vctrs(v.0.7.2), ggtangle(v.0.1.1), digest(v.0.6.39), png(v.0.1-9), corpcor(v.1.6.10), ggrepel(v.0.9.8), MASS(v.7.3-65), fontLiberation(v.0.1.0), reshape2(v.1.4.5), httpuv(v.1.6.17), foreach(v.1.5.2), qvalue(v.2.42.0), withr(v.3.0.2), xfun(v.0.57), ggfun(v.0.2.0), ellipsis(v.0.3.3), survival(v.3.8-6), memoise(v.2.0.1), clusterProfiler(v.4.18.4), gson(v.0.1.0), systemfonts(v.1.3.2), tidytree(v.0.4.7), gtools(v.3.9.5), R.oo(v.1.27.1), DEoptimR(v.1.1-4), prettyunits(v.1.2.0), KEGGREST(v.1.50.0), promises(v.1.5.0), otel(v.0.2.0), httr(v.1.4.8), restfulr(v.0.0.16), rhdf5filters(v.1.22.0), rhdf5(v.2.55.13), rstudioapi(v.0.18.0), UCSC.utils(v.1.6.1), DOSE(v.4.4.0), curl(v.7.0.0), h5mread(v.1.2.1), randomForest(v.4.7-1.2), polyclip(v.1.10-7), SparseArray(v.1.10.10), RBGL(v.1.86.0), RcppEigen(v.0.3.4.0.2), ade4(v.1.7-24), xtable(v.1.8-8), stringr(v.1.6.0), desc(v.1.4.3), evaluate(v.1.0.5), S4Arrays(v.1.10.1), BiocFileCache(v.3.0.0), preprocessCore(v.1.72.0), hms(v.1.1.4), filelock(v.1.0.3), polynom(v.1.4-1), VennDiagram(v.1.8.2), magrittr(v.2.0.5), later(v.1.4.8), ggtree(v.4.0.5), lattice(v.0.22-9), genefilter(v.1.92.0), robustbase(v.0.99-7), XML(v.3.99-0.23), cowplot(v.1.2.0), matrixStats(v.1.5.0), ggupset(v.0.4.1), pillar(v.1.11.1), nlme(v.3.1-169), pwalign(v.1.6.0), iterators(v.1.0.14), caTools(v.1.18.3), compiler(v.4.5.1), stringi(v.1.8.7), minqa(v.1.2.8), SummarizedExperiment(v.1.40.0), devtools(v.2.5.0), GenomicAlignments(v.1.46.0), plyr(v.1.8.9), crayon(v.1.5.3), abind(v.1.4-8), gridGraphics(v.0.5-1), locfit(v.1.5-9.12), bit(v.4.6.0), UpSetR(v.1.4.0), dplyr(v.1.2.1), fastmatch(v.1.1-8), fastcluster(v.1.3.0), codetools(v.0.2-20), crosstalk(v.1.2.2), bslib(v.0.10.0), plotly(v.4.12.0), multtest(v.2.66.0), remaCor(v.0.0.20), mime(v.0.13), splines(v.4.5.1), Rcpp(v.1.1.1), tidydr(v.0.0.6), dbplyr(v.2.5.2), knitr(v.1.51), blob(v.1.3.0), seqLogo(v.1.76.0), BiocVersion(v.3.22.0), AnnotationFilter(v.1.34.0), lme4(v.2.0-1), fs(v.2.0.1), Rdpack(v.2.6.6), EBSeq(v.2.8.0), pkgbuild(v.1.4.8), openxlsx(v.4.2.8.1), ggplotify(v.0.1.3), tibble(v.3.3.1), Matrix(v.1.7-5), statmod(v.1.5.1), fANCOVA(v.0.6-1), tweenr(v.2.0.3), pkgconfig(v.2.0.3), tools(v.4.5.1), cachem(v.1.1.0), RhpcBLASctl(v.0.23-42), rbibutils(v.2.4.1), cigarillo(v.1.0.0), RSQLite(v.2.4.6), viridisLite(v.0.4.3), DBI(v.1.3.0), numDeriv(v.2016.8-1.1), fastmap(v.1.2.0), rmarkdown(v.2.31), scales(v.1.4.0), grid(v.4.5.1), usethis(v.3.2.1), gprofiler2(v.0.2.4), AnnotationHub(v.4.0.0), broom(v.1.0.12), sass(v.0.4.10), patchwork(v.1.3.2), BiocManager(v.1.30.27), graph(v.1.88.1), varhandle(v.2.0.6), farver(v.2.1.2), reformulas(v.0.4.4), aod(v.1.3.3), scatterpie(v.0.2.6), mgcv(v.1.9-4), yaml(v.2.3.12), MatrixGenerics(v.1.22.0), cli(v.3.6.5), purrr(v.1.2.1), lifecycle(v.1.0.5), mvtnorm(v.1.3-6), lambda.r(v.1.2.4), sessioninfo(v.1.2.3), backports(v.1.5.1), Vennerable(v.3.1.0.9000), BiocParallel(v.1.44.0), annotate(v.1.88.0), gtable(v.0.3.6), rjson(v.0.2.23), parallel(v.4.5.1), ape(v.5.8-1), limma(v.3.66.0), jsonlite(v.2.0.0), TFBSTools(v.1.48.0), bitops(v.1.0-9), ggplot2(v.4.0.2), NOISeq(v.2.54.0), bit64(v.4.6.0-1), brio(v.1.1.5), yulab.utils(v.0.2.4), zip(v.2.3.3), futile.options(v.1.0.1), jquerylib(v.0.1.4), GOSemSim(v.2.36.0), R.utils(v.2.13.0), pbkrtest(v.0.5.5), lazyeval(v.0.2.3), pander(v.0.6.6), shiny(v.1.13.0), htmltools(v.0.5.9), enrichplot(v.1.30.5), GO.db(v.3.22.0), formatR(v.1.14), rappdirs(v.0.3.4), blockmodeling(v.1.1.8), ensembldb(v.2.34.0), glue(v.1.8.0), TFMPvalue(v.1.0.0), GenomicScores(v.2.22.0), httr2(v.1.2.2), gdtools(v.0.5.0), RCurl(v.1.98-1.18), InteractionSet(v.1.38.0), rprojroot(v.2.1.1), treeio(v.1.34.0), motifStack(v.1.54.0), futile.logger(v.1.4.9), gridExtra(v.2.3), EnvStats(v.3.1.0), boot(v.1.3-32), preseqR(v.4.0.0), universalmotif(v.1.28.0), igraph(v.2.2.3), variancePartition(v.1.40.2), R6(v.2.6.1), sva(v.3.58.0), tidyr(v.1.3.2), DESeq2(v.1.50.2), ggiraph(v.0.9.6), gplots(v.3.3.0), labeling(v.0.4.3), cluster(v.2.1.8.2), Rhdf5lib(v.1.32.0), regioneR(v.1.42.0), pkgload(v.1.5.1), aplot(v.0.2.9), GenomeInfoDb(v.1.46.2), DirichletMultinomial(v.1.52.0), nloptr(v.2.2.1), ProtGenerics(v.1.42.0), DelayedArray(v.0.36.1), tidyselect(v.1.2.1), ggforce(v.0.5.0), xml2(v.1.5.2), fontBitstreamVera(v.0.1.1), KernSmooth(v.2.23-26), S7(v.0.2.1), fontquiver(v.0.2.1), data.table(v.1.18.2.1), htmlwidgets(v.1.6.4), fgsea(v.1.36.2), RColorBrewer(v.1.1-3), biomaRt(v.2.66.2), rlang(v.1.2.0), lmerTest(v.3.2-1) and ggnewscale(v.0.5.2)

message(paste0("This is hpgltools commit: ", get_git_commit()))
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 03a4e43defdc53e7038116087cb006b05404d424
## This is hpgltools commit: Tue Apr 7 15:44:04 2026 -0400: 03a4e43defdc53e7038116087cb006b05404d424
this_save <- paste0(gsub(pattern = "\\.Rmd", replace = "", x = rmd_file), "-v", ver, ".rda.xz")
message("Saving to ", this_save)
## Saving to index-v20260408.rda.xz
tmp <- sm(saveme(filename = this_save))
LS0tCnRpdGxlOiAiVHJlYXRpbmcgc2NSTkEgYW5kIEFUQUMgYXMgYnVsay4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCmxpYnJhcnkoInJldGljdWxhdGUiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIn4vaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQoCiAgd2lkdGggPSAxMjAsIHByb2dyZXNzID0gVFJVRSwgdmVyYm9zZSA9IFRSVUUsIGVjaG8gPSBUUlVFKQprbml0cjo6b3B0c19jaHVuayRzZXQoZXJyb3IgPSBUUlVFLCBkcGkgPSA5NikKbHVhX2ZpbHRlcnMgPC0gcm1hcmtkb3duOjpwYW5kb2NfbHVhX2ZpbHRlcl9hcmdzKCJwYW5kb2Mtem90eHQubHVhIikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucygKICBkaWdpdHMgPSA0LCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbCA9ICJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemUgPSAxMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdCA9ICIlWSVtJWQiKQpwcmV2aW91c19maWxlIDwtICIiCnZlciA8LSBmb3JtYXQoU3lzLkRhdGUoKSwgIiVZJW0lZCIpCgojI3RtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkKcm1kX2ZpbGUgPC0gImluZGV4LlJtZCIKYGBgCgojIEludHJvZHVjdGlvbgoKSSBzcGVudCBzb21lIHRpbWUgcGxheWluZyB3aXRoIGNlbGxyYW5nZXIgYW5kIGl0cyB2YXJpb3VzIG9wdGlvbnMgZm9yCnRyZWF0aW5nIGdleC9hdGFjIGFuZCB0aGVpciBjb21iaW5lZCBkYXRhdHlwZXMuICBJIHRoaW5rIGl0IGlzCnVubGlrZWx5IHRoYXQgbW9yZSB0aGFuIH4gMTAwIGNlbGxzIGFyZSBsaWtlbHkgdG8gYmUgZGV0ZWN0ZWQgaW4gYW55CmNvbWJpbmF0aW9uIG9mIG9wdGlvbnMuICBJIHRoZXJlZm9yZSB0aG91Z2h0IGl0IHdvdWxkIGJlIGludGVyZXN0aW5nCnRvIGF0dGVtcHQgdHJlYXRpbmcgdGhlIHNhbXBsZXMgYXMgc2VwYXJhdGUgZXhwcmVzc2lvbi9hdGFjIGRhdGFzZXRzCmFuZCBzZWUgaWYgSSBjYW4gbGVhcm4gYWJvdXQgdGhlIHN0YXRlIG9mIHRoZSBleHBlcmltZW50IGZyb20gdGhlbS4KCiMgQW5ub3RhdGlvbiBkYXRhCgpJdCBtaWdodCBwcm92ZSB0aGUgY2FzZSB0aGF0IGRvd25sb2FkaW5nIGFubm90YXRpb25zIGZyb20gYmlvbWFydCBkb2VzCm5vdCB3b3JrLCBJIGhhdmUgYmVlbiBnZXR0aW5nIGEgbGFyZ2UgbnVtYmVyIG9mIHRpbWVvdXRzIGFuZCBmYWlsdXJlcwpyZWNlbnRseS4KCmBgYHtyfQpybl9iaW9tYXJ0IDwtIGxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucyhzcGVjaWVzID0gInJub3J2ZWdpY3VzIiwgeWVhciA9IDIwMjIsIG1vbnRoID0gIm9jdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9jb2x1bW5zID0gImV4dGVybmFsX2dlbmVfbmFtZSIsIG92ZXJ3cml0ZSA9IFRSVUUpCnJuX2dmZiA8LSBsb2FkX2dmZl9hbm5vdGF0aW9ucygifi9saWJyYXJpZXMvZ2Vub21lL2dmZi9ybm9ydmVnaWN1c183LjJfMTA3LmdmZiIpCgpybl9hbm5vdCA8LSBybl9iaW9tYXJ0W1siZ2VuZV9hbm5vdGF0aW9ucyJdXQoKI3JuX2V4YW1wbGUgPC0gZ2V0X2Jpb21hcnRfZXhhbXBsZV9nZW5lKHNwZWNpZXMgPSAicm5vcnZlZ2ljdXMiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA9ICJ1c2Vhc3QuZW5zZW1ibC5vcmciLCBhcmNoaXZlID0gRkFMU0UpCmBgYAoKIyBNZXRhZGF0YQoKTXkgYW5ub3RhdGlvbiBjb2xsZWN0aW9uIHRvb2wgaXMgdW5hd2FyZSBvZiBhdGFjIGRhdGEuICBJIHRoaW5rCnRoZXJlZm9yZSBJIHdpbGwgdHJ5IHJ1bmluZyBpdCBhbmQganVzdCBzZWUgd2hhdCBoYXBwZW5zLgoKYGBge3J9CnNhbXBsZV9zaGVldCA8LSAic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy54bHN4Igpybl9tZXRhIDwtIGdhdGhlcl9wcmVwcm9jZXNzaW5nX21ldGFkYXRhKHNhbXBsZV9zaGVldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWVzID0gInJub3J2ZWdpY3VzXzcuMl8xMDciKQpgYGAKCkl0IGZhaWxzIHV0dGVybHkuCgojIENyZWF0ZSBnZXggc3VtbWFyaXplZCBFeHBlcmltZW50CgpgYGB7cn0Kcm5fc2UgPC0gY3JlYXRlX3NlKHNhbXBsZV9zaGVldCwgZ2VuZV9pbmZvID0gcm5fYW5ub3QsIGZpbGVfY29sdW1uID0gImdleF9jb3VudF90YWJsZSIpICU+JQogIHNldF9jb25kaXRpb25zKGZhY3QgPSAidHJlYXRtZW50IikgJT4lCiAgc2V0X2JhdGNoZXMoZmFjdCA9ICJyZXBsaWNhdGUiKQpgYGAKCiMgQ2hlY2sgaXQgb3V0CgpgYGB7cn0Kcm5fbGlic2l6ZSA8LSBwbG90X2xpYnNpemUocm5fc2UpCnBwKGZpbGUgPSAiaW1hZ2VzL3JuX2xpYnNpemUucG5nIikKcm5fbGlic2l6ZVtbInBsb3QiXV0KZGV2Lm9mZigpCnJuX2xpYnNpemUKcm5fbnogPC0gcGxvdF9ub256ZXJvKHJuX3NlLCB5X2ludGVyY2VwdCA9IDAuNzUpCnBwKGZpbGUgPSAiaW1hZ2VzL3JuX256LnBuZyIpCnJuX256W1sicGxvdCJdXQpkZXYub2ZmKCkKcm5fbnoKYGBgCgojIyBOb3JtYWxpemUKCmBgYHtyfQpybl9ub3JtIDwtIG5vcm1hbGl6ZShybl9zZSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUpCnJuX2Rpc2hlYXQgPC0gcGxvdF9kaXNoZWF0KHJuX25vcm0pCnBwKGZpbGUgPSAiaW1hZ2VzL3JuX2Rpc2hlYXQucG5nIikKcm5fZGlzaGVhdFtbInBsb3QiXV0KZGV2Lm9mZigpCnJuX2Rpc2hlYXQKCnJuX2NvcmhlYXQgPC0gcGxvdF9jb3JoZWF0KHJuX25vcm0pCnBwKGZpbGUgPSAiaW1hZ2VzL3JuX2NvcmhlYXQucG5nIikKcm5fY29yaGVhdFtbInBsb3QiXV0KZGV2Lm9mZigpCnJuX2NvcmhlYXQKCnJuX25wY2EgPC0gcGxvdF9wY2Eocm5fbm9ybSkKcHAoZmlsZSA9ICJpbWFnZXMvcm5fbnBjYS5wbmciKQpybl9ucGNhW1sicGxvdCJdXQpkZXYub2ZmKCkKcm5fbnBjYQoKcm5fbmIgPC0gbm9ybWFsaXplKHJuX3NlLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAicGNhIikKcm5fbmJwY2EgPC0gcGxvdF9wY2Eocm5fbmIpCnBwKGZpbGUgPSAiaW1hZ2VzL3JuX25icGNhLnBuZyIpCnJuX25icGNhW1sicGxvdCJdXQpkZXYub2ZmKCkKcm5fbmJwY2EKYGBgCgojIENvbXBhcmUgdGhlIHR3byBjb25kaXRpb25zCgpgYGB7cn0KcGFpcnMgPC0gYWxsX3BhaXJ3aXNlKHJuX3NlLCBtb2RlbF9zdnMgPSAic3Zhc2VxIiwgZm9yY2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZnN0cmluZyA9ICJ+IDAgKyBjb25kaXRpb24iLCBmaWx0ZXIgPSBUUlVFKQpwYWlycwp0YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcyhwYWlycywgbGFiZWxfY29sdW1uID0gImV4dGVybmFsX2dlbmVfbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gImV4Y2VsL3BhaXJzLnhsc3giKQp0YWJsZQpzaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyh0YWJsZSwgZXhjZWwgPSAiZXhjZWwvc2lnLnhsc3giLCBhY2NvcmRpbmdfdG8gPSAibGltbWEiKQpzaWcKYGBgCgpMaW1tYSB2b2xjYW5vIHBsb3QKCkluIHRoZW9yeSwgdGhlIGNvbHVtbiAnZXh0ZXJuYWxfZ2VuZV9uYW1lJyBzaG91bGQgcHJvdmlkZSByZWFzb25hYmxlCmdlbmVuYW1lcywgYnV0IEkgYW0gaGF2aW5nIHNvbWUgdHJvdWJsZXMgZXh0cmFjdGluZyBpdCBmcm9tIGVuc2VtYmwuCgpgYGB7cn0KcHAoZmlsZSA9ICJpbWFnZXMvZ2V4X3ZvbGNhbm8ucG5nIikKdGFibGVbWyJwbG90cyJdXVtbInNhbGluZV92c19veHljb2RvbmUiXV1bWyJsaW1tYV92b2xfcGxvdHMiXV0KZGV2Lm9mZigpCnRhYmxlW1sicGxvdHMiXV1bWyJzYWxpbmVfdnNfb3h5Y29kb25lIl1dW1sibGltbWFfdm9sX3Bsb3RzIl1dCmBgYAoKYGBge3J9CnVwcyA8LSBzaWdbWyJsaW1tYSJdXVtbInVwcyJdXVtbInNhbGluZV92c19veHljb2RvbmUiXV0KZGltKHVwcykKZG93bnMgPC0gc2lnW1sibGltbWEiXV1bWyJkb3ducyJdXVtbInNhbGluZV92c19veHljb2RvbmUiXV0KZGltKGRvd25zKQpncF91cCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHVwcywgc3BlY2llcyA9ICJybm9ydmVnaWN1cyIpCgp0dCA8LSBwbG90X2VucmljaHJlc3VsdChncF91cFtbIlJFQUNfZW5yaWNoIl1dKQpgYGAKCiMgRXhhbWluZSB0aGUgQVRBQyByZXN1bHRzCgpHaXZlbiBteSBsYWNrIG9mIGV4cGVyaWVuY2Ugd2l0aCBBVEFDIGRhdGEsIEkgYW0gY3VycmVudGx5IHVzaW5nCgpodHRwczovL25iaXMtd29ya3Nob3AtZXBpZ2Vub21pY3MucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2NvbnRlbnQvdHV0b3JpYWxzL2RhdGEtcHJlcHJvYy9kYXRhLXFjLWF0YWMuaHRtbAoKYXMgYSBndWlkZS4KCmBgYHtyfQpsaWJyYXJ5KEFUQUNzZXFRQykKbGlicmFyeShCU2dlbm9tZS5Sbm9ydmVnaWN1cy5VQ1NDLnJuNykKbGlicmFyeShUeERiLlJub3J2ZWdpY3VzLlVDU0Mucm43LnJlZkdlbmUpCmxpYnJhcnkoQ2hJUHBlYWtBbm5vKQpsaWJyYXJ5KFJzYW10b29scykKCmJhbV9vdXRwdXRzIDwtIGMoCiAgInByZXByb2Nlc3NpbmcvMV9zYWxpbmVfYXRhYy9vdXRwdXRzLzQwaGlzYXRfcm5vcnZlZ2ljdXNfbm9yd2F5X2dyY3I4L3Jub3J2ZWdpY3VzX25vcndheV9ncmNyOF9nZW5vbWUtcGFpcmVkLmJhbSIsCiAgInByZXByb2Nlc3NpbmcvMl9veHljb2RvbmVfYXRhYy9vdXRwdXRzLzQwaGlzYXRfcm5vcnZlZ2ljdXNfbm9yd2F5X2dyY3I4L3Jub3J2ZWdpY3VzX25vcndheV9ncmNyOF9nZW5vbWUtcGFpcmVkLmJhbSIsCiAgInByZXByb2Nlc3NpbmcvM19zYWxpbmVfYXRhYy9vdXRwdXRzLzQwaGlzYXRfcm5vcnZlZ2ljdXNfbm9yd2F5X2dyY3I4L3Jub3J2ZWdpY3VzX25vcndheV9ncmNyOF9nZW5vbWUtcGFpcmVkLmJhbSIsCiAgInByZXByb2Nlc3NpbmcvNF9veHljb2RvbmVfYXRhYy9vdXRwdXRzLzQwaGlzYXRfcm5vcnZlZ2ljdXNfbm9yd2F5X2dyY3I4L3Jub3J2ZWdpY3VzX25vcndheV9ncmNyOF9nZW5vbWUtcGFpcmVkLmJhbSIpCgpiYW1fcWMgPC0gYmFtUUMoYmFtX291dHB1dHNbMV0sIG91dFBhdGggPSBOVUxMKQoKcG9zc2libGVUYWcgPC0gY29tYm4oTEVUVEVSUywgMikKcG9zc2libGVUYWcgPC0gYyhwYXN0ZTAocG9zc2libGVUYWdbMSwgXSwgcG9zc2libGVUYWdbMiwgXSksCiAgICAgICAgICAgICAgICAgcGFzdGUwKHBvc3NpYmxlVGFnWzIsIF0sIHBvc3NpYmxlVGFnWzEsIF0pKQojIyBUaGlzIHNlZW1zIGEgYml0IHN0dXBpZD8gIEkgYWxyZWFkeSBrbm93IHdoYXQgdGhlIHByaW1hcnkgc2FtIHRhZ3MgYXJlLCBzaG91bGQgSSBub3QganVzdAojIyBoYXZlIGEgbGlzdCB3aXRoIHRoZWlyIG5hbWVzIGFuZCBtZWFuaW5ncz8KYmFtVG9wMTAwIDwtIHNjYW5CYW0oQmFtRmlsZShiYW1fb3V0cHV0c1sxXSwgeWllbGRTaXplID0gMTAwKSwKICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IFNjYW5CYW1QYXJhbSh0YWcgPSBwb3NzaWJsZVRhZykpW1sxXV0kdGFnCnRhZ3MgPC0gbmFtZXMoYmFtVG9wMTAwKVtsZW5ndGhzKGJhbVRvcDEwMCk+MF0KdGFncwpgYGAKCmBgYHtyfQpnYWwgPSByZWFkQmFtRmlsZShiYW1fb3V0cHV0c1sxXSwgdGFnID0gdGFncywgYXNNYXRlcyA9IFRSVUUsIGJpZ0ZpbGUgPSBUUlVFKQpvdXRfZGlyIDwtICJwcmVwcm9jZXNzaW5nLzFfc2FsaW5lX2F0YWMvb3V0cHV0cy85OWF0YWNfcWMiCmRpci5jcmVhdGUob3V0X2RpciwgcmVjdXJzaXZlID0gVFJVRSkKc2hpZnRlZF9iYW0gPC0gZmlsZS5wYXRoKG91dF9kaXIsICJzaGlmdGVkLmJhbSIpCmdhbDEgPSBzaGlmdEdBbGlnbm1lbnRzTGlzdChnYWwsIG91dGJhbSA9IHNoaWZ0ZWRfYmFtKQpgYGAKCgpgYGB7ciBzYXZlbWV9CnBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCm1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQp0aGlzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybiA9ICJcXC5SbWQiLCByZXBsYWNlID0gIiIsIHggPSBybWRfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKQptZXNzYWdlKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lID0gdGhpc19zYXZlKSkKYGBgCg==