1 Set some parameters which will be used later

## LogFC cutoff when working on the inclusion sets.
lfc_cutoff <- 0.1
## Adjusted p-value cutoff when working on the inclusion sets.
adjp_cutoff <- 0.1
## Increase the maximum allowed group size when working with clusterProfiler
## This should bring out some of the more general groups like 'cellbody'
max_groupsize <- 2000
## Allow groups higher up in the tree for clusterProfiler results.
go_level <- 2
## Allow 10 GO categories to be displayed when plotting.
go_categories <- 14
## MA plot point outlines
outline <- FALSE
## Speed up clusterProfiler by choosing the correct keytypes
orgdb_from <- "ENSEMBL"
default_fstring <- "~ 0 + condition"

2 TODOs

  • Check this for correctness.
  • Reorganize it
  • GSVA (Hänzelmann, Castelo, and Guinney (2013))
  • Consider embedding some/many/all of the Excel outputs into the html output via xfun::embed_dir(‘excel/’)

3 Meeting with Theresa

Previous papers did not do an explicit subtraction, instead just compared to WT and kept the genes which are > in delta/het vs. wt. There are multiple ways to deal with this and that query has not yet been defined. Later, Theresa came to the conclusion that the subtraction method is not appropriate.

4 Introduction

In this document I hope to explore the freshly processed samples and perform some comparisons to see that we have the expected similarities and differences from the prior analysis performed by Theresa.

There is one way in which I expect any/all of these analyses to be explicitly different: this should include the changes produced by April’s renaming of some samples.

My intention is to produce a sample sheet which includes one column with non-umi-deduplicated results and one with deduplicated results. With the exception of the previous point, I hope that the first will be identical (or at least very close to identical) to Theresa’s result while the second I expect will be subtly different – but I am hoping subtly enough that it will not significantly change the interpretation but be a little more precise.

Lets see! I need therefore to make a change to my metadata gathering function to include the umi deduplicated result. I am thinking therefore to create a separate specification for umi-barcoded samples because looking through the logs for umi stuff when they are not used will be too much of a pain…

4.1 Small random reminder

I have a couple pictures of RPL22 to help me remember the experimental design:

  • The human ribosome with RPL22 in red: human_rpl22_red
  • The mouse ribosome with RPL22 in green at the center: mouse_rpl22

That second picture came from: (Li et al. (2022))

5 A note about implementation

I would like to improve this document by comparing/contrasting the methodologies performed by other groups and those performed by me in it. I never fully appreciated the suite of computational methods applied by previous groups when examining TRAP data; I instead simply followed Theresa’s notebook without considering other possibilities.

I therefore spent a little time stepping through her thesis and pulling out the relevant papers in the hopes of learning these various methods. I should therefore be able soon to compare/contrast the various methods employed by other labs in addition to copying Theresa’s logic.

5.1 The following block cannot work in the container

The following block assumes the full tree of preprocessed data with the logs from the trimmer, mapping, umi deduplication, counting, etc. As a result it cannot work in the container which has only the various count tables.

As a result, I am including a copy of this sheet after running the following block in my working tree. I suppose for the moment you will have to trust that it worked. (for right now, when testing out this container, I am just sending the R working directory to my tree for this block, then moving it back.

I will need to manually edit one column though, the symlink column from Theresa has a series of paths which do not work in the container.

umi_spec <- make_rnaseq_spec(umi = TRUE)
iprgc_2022_meta <- gather_preprocessing_metadata("sample_sheets/20240606_only_umd_sequenced.xlsx",
                                                 spec = umi_spec, species = "mm39_112", verbose = FALSE,
                                                 basedir = "preprocessing/umd_sequenced")
colnames(iprgc_2022_meta[["new_meta"]])
head(iprgc_2022_meta[["new_meta"]])
sample_sheet <- "sample_sheets/20240606_only_umd_sequenced_modified.xlsx"
msigdb <- "reference/msigdb_v2024.1.Mm.db"
msig_data <- NULL
make_transparent <- function() {
  ggplot2::theme(
    panel.background = element_rect(fill = 'transparent'),
    plot.background = element_rect(fill = 'transparent', color = NA),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    legend.background = element_rect(fill = 'transparent'),
    legend.box.background = element_rect(fill = 'transparent'))
}

I will figure out if I can leave mSigDB M2 in this image; if not, then any analyses depending on those gene sets will fail a priori.

m2_gsc <- try(load_gmt_signatures(signatures = msigdb,
                                  signature_category = "M2"), silent = TRUE)
## I do not think I have permission to load the msigdb in the container
## So, if this fails, just load it from GSVAData, oh wait no, GSVAdata is human.
if ("try-error" %in% class(m2_gsc)) {
  warning("Unable to load the M2 MsigDB data.")
}
## Warning: Unable to load the M2 MsigDB data.

From this point on, I am hoping/intending to pull liberally from Theresa’s notebook with a diversion to compare the three datasets:

  • Pre-April renaming: E.g. Theresa’s current dataset
  • Post renaming: Unless I am mistaken, this should be very similar to the above.
  • Post deduplication: Given what I saw from the extracted logs in the sample sheet, I expect this to be similar but not identical to the previous two.

Lets find out! But first, annotations!

6 Annotation data

I am pulling this from Theresa’s anxontrapR_pipeline.Rmd, primarily because it looks similar to the other documents, but was modified more recently. I will change it slightly, primarily because I grabbed a new mmusculus assembly and therefore I will pull the mmusculus annotations from a specific biomart (Smedley et al. (2009)) archive that should match it.

A note from the future: multiple ensembl archive servers have been taken offline since last I ran this. Let us see if Feb. 2023 still works.

6.1 An important note!

In the recent past, ensembl queries have become inconsistent, failing much more often than ever in the past. I do not think this is the fault of ensembl; but I think I need a fallback mechanism for collecting annotation information.

In the case of ensembl, it should be trivial (but less fun) to use a combination of the locally installed orgdb and txdb databases.

This does open a risk that the set of genes with annotations will be different depending on when the container is run due to differences between the orgdb/txdb instance and the Feb 2023 biomart. I am not sure there is much I can do about that except to bundle the set of annotations I downloaded in the container – since load_biomart_annotations() does save a rda copy of its download.

ok, I did both. If you, dear reader, wish to download your own annotations, and ensembl is having troubles, the following should work without a problem; in addition the rda annotations are in /data of the container and should get loaded.

tx_gene_map <- data.frame()
mm_annot <- try(load_biomart_annotations(species = "mmusculus", year = "2023", month = "02"))
## The biomart annotations file already exists, loading from it.
if ("try-error" %in% class(mm_annot)) {
  fields <- c("ACCNUM", "ENSEMBL", "ENSEMBLTRANS", "ENTEZID", "GENENAME", "SYMBOL")
  orgdb_annot <- load_orgdb_annotations("org.Mm.eg.db", fields = fields)
  gene_info <- orgdb_annot[["genes"]]
  ## Note, there are a bunch of variants of the txdb package one might use.
  ## I do not think it matters a lot for our purposes, but I suspect that if we used
  ## a mismatched BSgenome and tried to pull CDS sequences, that might end badly.
  pkg <- "TxDb.Mmusculus.UCSC.mm10.knownGene"
  tx_annot <- load_txdb_annotations(pkg)
  transcripts <- tx_annot[["TX"]]
  transcripts[["tx"]] <- gsub(x = transcripts[["TXNAME"]],
                              pattern = "\\.\\d+$", replacement = "")
  mm_annot <- merge(gene_info, transcripts, by.x = "ensembltrans", by.y = "tx")
  rownames(mm_annot) <- make.names(mm_annot[["ensembl"]], unique = TRUE)
} else {
  mm_annot <- mm_annot[["annotation"]]
  mm_annot[["txid"]] <- paste0(mm_annot[["ensembl_transcript_id"]], ".", mm_annot[["version"]])
  rownames(mm_annot) <- make.names(mm_annot[["ensembl_gene_id"]], unique=TRUE)
  tx_gene_map <- mm_annot[, c("txid", "ensembl_gene_id")]
}

7 Hisat2 summarizedExperiments

The primary difference between my block and Theresa’s are:

  1. I am pulling the metadata directly from the gather_preprocessing_metadata() above.
  2. I am using the column ‘symlink’ which is just a copy of the existing ‘file’ column with a small change so I can load it from my directory without having to copy everything.
  3. I am using the ensembl genome release 39, version 112 and so pulled a somewhat newer copy of the annotation data.
  4. The original is named ‘v1’, followed by ‘v2’ and ‘v3’ for the other two treatments I performed.

7.1 Color choices and reused parameters

Given that we are excluding a bunch of the older samples, the set of colors I expect to find is different; so I will make explicit here the various colors used to denote location/genotype/time/etc.

April turned me onto this website ‘paletton.com’ for this kind of stuff and I will try and pick out palettes which basically match what I am getting with the original colors.

color_choices <- list(
  "all" = list(
    "p08_het_dlgn" = "#E7298A",
    "p15_het_dlgn" = "#E7298A",
    "p08_het_retina" = "#238B45",
    "p15_het_retina" = "#238B45",
    "p08_het_scn" = "#4292C6",
    "p15_het_scn" = "#4292C6",
    "p08_ko_dlgn" = "#C994C7",
    "p15_ko_dlgn" = "#C994C7",
    "p08_ko_retina" = "#74c476",
    "p15_ko_retina" = "#74c476",
    "p08_ko_scn" = "#9BCAE1",
    "p15_ko_scn" = "#9BCAE1",
    "p08_wt_dlgn" = "#980043",
    "p15_wt_dlgn" = "#980043",
    "p08_wt_retina" = "#004008",
    "p15_wt_retina" = "#004008",
    "p08_wt_scn" = "#08519C",
    "p15_wt_scn" = "#08519C",
    "p60_wt_dlgn" = "#333333",
    "p60_wt_retina" = "#222222",
    "p60_wt_scn" = "#111111"),
  "geno_loc" = list(
    "het_dlgn" = "#E7298A",
    "het_retina" = "#238B45",
    "het_scn" = "#4292C6",
    "ko_dlgn" = "#C994C7",
    "ko_retina" = "#74c476",
    "ko_scn" = "#9BCAE1",
    "wt_dlgn" = "#980043",
    "wt_retina" = "#004008",
    "wt_scn" = "#08519C"),
  "location" = list(
    "retina" = "#004008",
    "dlgn" = "#980043",
    "scn" = "#08519C"),
  "genotype" = list(
    "wt" = "#74c476",
    "het" = "#238B45",
    "ko" = "#006D2C"),
  "time" = list(
    "p08" = "#5E104B",
    "p15" = "#4E9231"))
label_column <- "mgi_symbol" ## Set the column used to extract gene symbols rather than ENSG.....
colors <- color_choices[["geno_loc"]]
time_colors <- list(
  "p08_het_dlgn" = "#E7298A",
  "p15_het_dlgn" = "#8a1852",
  "p08_het_retina" = "#238B45",
  "p15_het_retina" = "#155329",
  "p08_het_scn" = "#4292C6",
  "p15_het_scn" = "#275776",
  "p08_ko_dlgn" = "#C994C7",
  "p15_ko_dlgn" = "#785877",
  "p08_ko_retina" = "#74C476",
  "p15_ko_retina" = "#457546",
  "p08_ko_scn" = "#9BCAE1",
  "p15_ko_scn" = "#5d7987")

There is one noteworthy sample: iprgc_103, it was effectively replaced when April renamed the samples and so exists in the v1 data, but not v2/v3; they instead have the newly named samples which I called iprgc_123 to iprgc_130. As a result, I copied the annotations for iprgc_123 to my column so that there is no discrepency in terms of genotype/location/time.

7.2 The original count tables

At the moment I have not included the original counts in this container because we made some changes to the mapping strategy and also found that a couple samples were mixed up in sequencing; as a result I documented all of the changes in the sample sheets and preprocessing documents and excluded the original files.

This is also why some columns in the sample sheet have suffixes like ‘adh’ and ‘atb’, those denote from whom the relevant metadata columns came from.

mm38_hisat_v1 <- create_se(sample_sheet,
                           gene_info = mm_annot,
                           file_column = "symlink") %>%
  set_conditions(fact = "geno_loc_atb") %>%
  set_batches(fact = "time_atb") %>%
  set_colors(color_choices[["geno_loc"]])
mm38_hisat_v1

7.3 Recounted tables and the deduplicated result

In the following I make two more versions of the data, one remapped with the changes to the sample identities, and one with deduplication applied.

mm38_hisat_v2 <- create_se(sample_sheet, gene_info = mm_annot,
                           file_column = "hisat_count_table") %>%
  set_conditions(fact = "geno_loc_atb") %>%
  set_batches(fact = "time_atb") %>%
  set_colors(color_choices[["geno_loc"]])
## Reading the sample metadata.
## Checking the state of the condition column.
## Checking the state of the batch column.
## Checking the condition factor.
## The sample definitions comprises: 69 rows(samples) and 76 columns(metadata fields).
## Warning in create_se(sample_sheet, gene_info = mm_annot, file_column =
## "hisat_count_table"): Some samples were removed when cross referencing the
## samples against the count data.
## Matched 25404 annotations and counts.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final summarized experiment has 25425 rows and 76 columns.
## The numbers of samples by condition are:
## 
##   het_dlgn het_retina    het_scn    ko_dlgn  ko_retina     ko_scn    wt_dlgn 
##          7          7          7          6          6          6         11 
##  wt_retina     wt_scn 
##         11          7
## The number of samples by batch are:
## 
## p08 p15 p60 
##  31  34   3
mm38_hisat_v2
## class: SummarizedExperiment 
## dim: 25425 68 
## metadata(7): notes title ... study researcher
## assays(1): ''
## rownames(25425): ENSMUSG00000000001 ENSMUSG00000000003 ...
##   ENSMUSG00001074846 ENSMUSG00002076083
## rowData names(15): ensembl_gene_id ensembl_transcript_id ...
##   uniprot_gn_symbol txid
## colnames(68): iprgc_62 iprgc_63 ... iprgc_129 iprgc_130
## colData names(76): rownames sampleid ... umi_dedup_mean_umi_per_pos
##   umi_dedup_max_umi_per_pos
mm38_hisat_v3 <- create_se(sample_sheet, gene_info = mm_annot,
                           file_column = "umi_dedup_output_count") %>%
  set_conditions(fact = "geno_loc_atb") %>%
  set_batches(fact = "time_atb") %>%
  set_colors(color_choices[["geno_loc"]])
## Reading the sample metadata.
## Checking the state of the condition column.
## Checking the state of the batch column.
## Checking the condition factor.
## The sample definitions comprises: 69 rows(samples) and 76 columns(metadata fields).
## Warning in create_se(sample_sheet, gene_info = mm_annot, file_column =
## "umi_dedup_output_count"): Some samples were removed when cross referencing the
## samples against the count data.
## Matched 25404 annotations and counts.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final summarized experiment has 25425 rows and 76 columns.
## The numbers of samples by condition are:
## 
##   het_dlgn het_retina    het_scn    ko_dlgn  ko_retina     ko_scn    wt_dlgn 
##          7          7          7          6          6          6         11 
##  wt_retina     wt_scn 
##         11          7
## The number of samples by batch are:
## 
## p08 p15 p60 
##  31  34   3
mm38_hisat_v3
## class: SummarizedExperiment 
## dim: 25425 68 
## metadata(7): notes title ... study researcher
## assays(1): ''
## rownames(25425): ENSMUSG00000000001 ENSMUSG00000000003 ...
##   ENSMUSG00001074846 ENSMUSG00002076083
## rowData names(15): ensembl_gene_id ensembl_transcript_id ...
##   uniprot_gn_symbol txid
## colnames(68): iprgc_62 iprgc_63 ... iprgc_129 iprgc_130
## colData names(76): rownames sampleid ... umi_dedup_mean_umi_per_pos
##   umi_dedup_max_umi_per_pos
all_fact <- paste0(colData(mm38_hisat_v3)[["time_atb"]], "_",
                   colData(mm38_hisat_v3)[["geno_loc_atb"]])
colData(mm38_hisat_v3)[["time_geno_loc"]] <- all_fact

Note the end of the previous block, I created a factor out of the combination of time, genotype, and location. In a future invocation of this notebook, I will change the pairwise comparisons to add each of these three factors to the statistical model instead of this. The code to do that is not quite ready yet.

8 Non-zero Counts per Sample

Let’s look at the number of non-zero genes for all samples versus the coverage.

As above, this does not get run because I did not copy the count tables.

v1_nonzero <- plot_nonzero(mm38_hisat_v1)
v1_nonzero

But these do!

plot_legend(mm38_hisat_v2)
## The colors used in the expressionset are: #004008, #08519C, #238B45, #4292C6, #74c476, #980043, #9BCAE1, #C994C7, #E7298A.

v2_nonzero  <- plot_nonzero(mm38_hisat_v2, y_intercept = 0.65)
## The following samples have less than 16526.25 genes.
##  [1] "iprgc_62"  "iprgc_63"  "iprgc_64"  "iprgc_66"  "iprgc_67"  "iprgc_68" 
##  [7] "iprgc_70"  "iprgc_71"  "iprgc_72"  "iprgc_73"  "iprgc_74"  "iprgc_75" 
## [13] "iprgc_77"  "iprgc_78"  "iprgc_80"  "iprgc_81"  "iprgc_82"  "iprgc_83" 
## [19] "iprgc_84"  "iprgc_85"  "iprgc_86"  "iprgc_87"  "iprgc_88"  "iprgc_89" 
## [25] "iprgc_90"  "iprgc_91"  "iprgc_92"  "iprgc_93"  "iprgc_94"  "iprgc_95" 
## [31] "iprgc_96"  "iprgc_97"  "iprgc_98"  "iprgc_100" "iprgc_102" "iprgc_104"
## [37] "iprgc_105" "iprgc_106" "iprgc_107" "iprgc_108" "iprgc_110" "iprgc_111"
## [43] "iprgc_112" "iprgc_113" "iprgc_114" "iprgc_115" "iprgc_117" "iprgc_118"
## [49] "iprgc_121" "iprgc_123" "iprgc_124" "iprgc_125" "iprgc_126" "iprgc_127"
## [55] "iprgc_128" "iprgc_129" "iprgc_130"
## 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.
## i Please use `linewidth` instead.
## i 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.
v2_nonzero
## A non-zero genes plot of 68 samples.
## These samples have an average 13.7 CPM coverage and 15744 genes observed, ranging from 13692 to
## 17083.

pp(file = "01diagnostic_images/nonzero_v2_unfiltered.pdf")
## Warning in pp(file = "01diagnostic_images/nonzero_v2_unfiltered.pdf"): The
## directory: 01diagnostic_images does not exist, will attempt to create it.
v2_nonzero[["plot"]]
plotted <- dev.off()

v3_nonzero  <- plot_nonzero(mm38_hisat_v3, y_intercept = 0.65)
## The following samples have less than 16526.25 genes.
##  [1] "iprgc_62"  "iprgc_63"  "iprgc_64"  "iprgc_66"  "iprgc_67"  "iprgc_68" 
##  [7] "iprgc_70"  "iprgc_71"  "iprgc_72"  "iprgc_73"  "iprgc_74"  "iprgc_75" 
## [13] "iprgc_77"  "iprgc_78"  "iprgc_80"  "iprgc_81"  "iprgc_82"  "iprgc_83" 
## [19] "iprgc_84"  "iprgc_85"  "iprgc_86"  "iprgc_87"  "iprgc_88"  "iprgc_89" 
## [25] "iprgc_90"  "iprgc_91"  "iprgc_92"  "iprgc_93"  "iprgc_94"  "iprgc_95" 
## [31] "iprgc_96"  "iprgc_97"  "iprgc_98"  "iprgc_100" "iprgc_102" "iprgc_104"
## [37] "iprgc_105" "iprgc_106" "iprgc_107" "iprgc_108" "iprgc_110" "iprgc_111"
## [43] "iprgc_112" "iprgc_113" "iprgc_114" "iprgc_115" "iprgc_117" "iprgc_118"
## [49] "iprgc_119" "iprgc_121" "iprgc_123" "iprgc_124" "iprgc_125" "iprgc_126"
## [55] "iprgc_127" "iprgc_128" "iprgc_129" "iprgc_130"
## 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.
v3_nonzero
## A non-zero genes plot of 68 samples.
## These samples have an average 4.803 CPM coverage and 15787 genes observed, ranging from 13868 to
## 17101.

pp(file = "01diagnostic_images/nonzero_v3_unfiltered.pdf")
v3_nonzero[["plot"]]
plotted <- dev.off()

Oh wow, I did not expect such a profound effect on the cpm values on the more saturated libraries. I guess in retrospect I should have?

Also note to self, we are not messing with p60.

8.1 Exclude p60

mm38_hisat_v2 <- subset_se(mm38_hisat_v2, subset = "time_atb!='p60'")
mm38_hisat_v3 <- subset_se(mm38_hisat_v3, subset = "time_atb!='p60'")

8.2 Replot the nonzero gene plots

v2_nonzero_filt <- plot_nonzero(mm38_hisat_v2, plot_labels = FALSE)
## The following samples have less than 16526.25 genes.
##  [1] "iprgc_62"  "iprgc_63"  "iprgc_64"  "iprgc_66"  "iprgc_67"  "iprgc_68" 
##  [7] "iprgc_70"  "iprgc_71"  "iprgc_72"  "iprgc_73"  "iprgc_74"  "iprgc_75" 
## [13] "iprgc_77"  "iprgc_81"  "iprgc_82"  "iprgc_83"  "iprgc_84"  "iprgc_85" 
## [19] "iprgc_86"  "iprgc_87"  "iprgc_88"  "iprgc_89"  "iprgc_90"  "iprgc_91" 
## [25] "iprgc_92"  "iprgc_93"  "iprgc_94"  "iprgc_95"  "iprgc_96"  "iprgc_97" 
## [31] "iprgc_98"  "iprgc_100" "iprgc_102" "iprgc_104" "iprgc_105" "iprgc_106"
## [37] "iprgc_107" "iprgc_108" "iprgc_110" "iprgc_111" "iprgc_112" "iprgc_113"
## [43] "iprgc_114" "iprgc_115" "iprgc_117" "iprgc_118" "iprgc_121" "iprgc_123"
## [49] "iprgc_124" "iprgc_125" "iprgc_126" "iprgc_127" "iprgc_128" "iprgc_129"
## [55] "iprgc_130"
## 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.
## Not putting labels on the plot.
pp(file = "01diagnostic_images/nonzero_v2_filt.pdf")
v2_nonzero_filt[["plot"]]
plotted <- dev.off()

v3_nonzero_filt <- plot_nonzero(mm38_hisat_v3, plot_labels = FALSE)
## The following samples have less than 16526.25 genes.
##  [1] "iprgc_62"  "iprgc_63"  "iprgc_64"  "iprgc_66"  "iprgc_67"  "iprgc_68" 
##  [7] "iprgc_70"  "iprgc_71"  "iprgc_72"  "iprgc_73"  "iprgc_74"  "iprgc_75" 
## [13] "iprgc_77"  "iprgc_81"  "iprgc_82"  "iprgc_83"  "iprgc_84"  "iprgc_85" 
## [19] "iprgc_86"  "iprgc_87"  "iprgc_88"  "iprgc_89"  "iprgc_90"  "iprgc_91" 
## [25] "iprgc_92"  "iprgc_93"  "iprgc_94"  "iprgc_95"  "iprgc_96"  "iprgc_97" 
## [31] "iprgc_98"  "iprgc_100" "iprgc_102" "iprgc_104" "iprgc_105" "iprgc_106"
## [37] "iprgc_107" "iprgc_108" "iprgc_110" "iprgc_111" "iprgc_112" "iprgc_113"
## [43] "iprgc_114" "iprgc_115" "iprgc_117" "iprgc_118" "iprgc_119" "iprgc_121"
## [49] "iprgc_123" "iprgc_124" "iprgc_125" "iprgc_126" "iprgc_127" "iprgc_128"
## [55] "iprgc_129" "iprgc_130"
## 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.
## Not putting labels on the plot.
pp(file = "01diagnostic_images/nonzero_v3_filt.pdf")
v3_nonzero_filt[["plot"]]
plotted <- dev.off()

Once again, I do not want to lose the previous code, so here is the v1 invocation

mm38_hisat_v1 <- subset_se(mm38_hisat_v1, subset = "time_atb!='p60'")

9 Quick PCA, then return to Theresa’s document

v2_norm <- normalize(mm38_hisat_v2, transform = "log2", convert = "cpm",
                     norm = "quant", filter = TRUE)
## Removing 10298 low-count genes (15127 remaining).
## transform_counts: Found 8465 values equal to 0, adding 1 to the matrix.
v2_norm_pca <- plot_pca(v2_norm)
v2_norm_pca
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by het_dlgn, het_retina, het_scn, ko_dlgn, ko_retina, ko_scn, wt_dlgn, wt_retina, wt_scn
## Shapes are defined by p08, p15.

pp(file = "01diagnostic_images/v2_norm_pca.pdf")
v2_norm_pca[["plot"]]
plotted <- dev.off()

v3_norm <- normalize(mm38_hisat_v3, transform = "log2", convert = "cpm",
                     norm = "quant", filter = TRUE)
## Removing 10156 low-count genes (15269 remaining).
## transform_counts: Found 9347 values equal to 0, adding 1 to the matrix.
v3_norm_pca <- plot_pca(v3_norm)
v3_norm_pca
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by het_dlgn, het_retina, het_scn, ko_dlgn, ko_retina, ko_scn, wt_dlgn, wt_retina, wt_scn
## Shapes are defined by p08, p15.

pp(file = "01diagnostic_images/v3_norm_pca.pdf")
v3_norm_pca[["plot"]]
plotted <- dev.off()

Ibid.

v1_norm <- normalize(mm38_hisat_v1, transform = "log2", convert = "cpm",
                     norm = "quant", filter = TRUE)
plot_pca(v1_norm)

To my eyes it looks like we just have 1 weirdo p15 sample? Deduplication had a minor but significant effect on the PCA.

With that in mind, let us look at Theresa’s WORKING document and see what we can recapitulate.

Theresa’s document: The TRAP protocol has some variability which is introduced at different stpdf including homogenization, antibody labeling, pulldown efficiency/specificity, sample handling during cleanup stpdf, and library prep/sequencing. We know from Rashmi’s QC that there is variability at the level of pulldown efficiency (amount of RNA isolated). She is doing a good job of keeping track of this for all her samples and we have validated her P8 results (attached supplementary figure 3D). We consistently see clear differences between control and cre samples for the retina, which makes sense because the cell bodies are in the retina. The target tissue differences are smaller, which also makes sense for axon-TRAP. We think that some of her P15 samples are not good based on low amounts of isolated RNA from cre(+) retina samples. We plan to drop these samples and not perform additional isolations at this time point. Based on this (and the general lack of large developmental effects), we were planning to focus on presenting the P8 data only in the paper. Interested to hear your thoughts in this…

My notes: Theresa’s first operations in this notebook were to:

  1. Set location as condition, genotype as batch.
  2. Perform PCA before/after sva.
v3_loc_geno <- set_conditions(mm38_hisat_v3, fact = "location_atb",
                              colors = color_choices[["location"]]) %>%
  set_batches(fact = "genotype_atb")
## The numbers of samples by condition are:
## 
##   dlgn retina    scn 
##     23     23     19
## The number of samples by batch are:
## 
## het  ko  wt 
##  21  18  26

9.1 The associated PCA

At different times, it appears to me that Theresa has preferred slightly different normalization methods, primarily a mix of TMM and quantile.

Thus I will use different suffix letters to denote various normalizations employed, and if they turn out the same I will pick one arbitrarily.

loc_geno_nq <- normalize(v3_loc_geno, transform = "log2", convert = "cpm",
                         filter = TRUE, norm = "quant")
## Removing 10156 low-count genes (15269 remaining).
## transform_counts: Found 9347 values equal to 0, adding 1 to the matrix.
location_genotype_pca <- plot_pca(loc_geno_nq)
pp(file = "01diagnostic_images/location_genotype_norm_pca.pdf")
location_genotype_pca[["plot"]]
plotted <- dev.off()
location_genotype_pca
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by dlgn, retina, scn
## Shapes are defined by het, ko, wt.

## ok, I have two weirdo samples which look very much like they are actually dlgn.
## These are sample IDs iprgc_66 and iprgc_130

loc_geno_nt <- normalize(v3_loc_geno, transform = "log2", convert = "cpm",
                         filter = TRUE, norm = "tmm")
## Removing 10156 low-count genes (15269 remaining).
## transform_counts: Found 42869 values equal to 0, adding 1 to the matrix.
location_genotype_tmm_pca <- plot_pca(loc_geno_nt)
pp(file = "01diagnostic_images/location_genotype_tmm_pca.pdf")
location_genotype_tmm_pca[["plot"]]
## Warning in MASS::cov.trob(data[, vars], wt = weight * nrow(data)): Probable
## convergence failure
## Warning in MASS::cov.trob(data[, vars], wt = weight * nrow(data)): Probable
## convergence failure
plotted <- dev.off()
location_genotype_tmm_pca
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by dlgn, retina, scn
## Shapes are defined by het, ko, wt.
## Warning in MASS::cov.trob(data[, vars], wt = weight * nrow(data)): Probable
## convergence failure
## Warning in MASS::cov.trob(data[, vars], wt = weight * nrow(data)): Probable
## convergence failure

A random thought about these PCA plots, it might be worth while to add a panel below the legend with the sample numbers per condition/batch.

Of course, the same information is provided in a more fun fashion via my silly sankey function:

sample_sankey <- plot_meta_sankey(v3_loc_geno, color_choices = color_choices,
                                  factors = c("genotype_atb", "location_atb", "time_atb"))
## Warning: attributes are not identical across measure variables; they will be
## dropped
## Warning: The `size` argument of `element_rect()` is deprecated as of ggplot2 3.4.0.
## i Please use the `linewidth` argument instead.
## i The deprecated feature was likely used in the ggsankey package.
##   Please report the issue at <https://github.com/davidsjoberg/ggsankey/issues>.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
pp(file = "01diagnostic_images/design_sankey.pdf")
sample_sankey[["ggplot"]]
plotted <- dev.off()
sample_sankey
## $design
##            rownames  sampleid genotype location time condition cellcompartment
## iprgc_62   iprgc_62  iprgc_62      het     dlgn  p15      dlgn            axon
## iprgc_63   iprgc_63  iprgc_63      het     dlgn  p15      dlgn            axon
## iprgc_64   iprgc_64  iprgc_64      het   retina  p15    retina            soma
## iprgc_65   iprgc_65  iprgc_65      het   retina  p15    retina            soma
## iprgc_66   iprgc_66  iprgc_66      het      scn  p15       scn            axon
## iprgc_67   iprgc_67  iprgc_67      het      scn  p15       scn            axon
## iprgc_68   iprgc_68  iprgc_68       ko     dlgn  p15      dlgn            axon
## iprgc_69   iprgc_69  iprgc_69       ko   retina  p15    retina            soma
## iprgc_70   iprgc_70  iprgc_70       ko      scn  p15       scn            axon
## iprgc_71   iprgc_71  iprgc_71       wt     dlgn  p15      dlgn            axon
## iprgc_72   iprgc_72  iprgc_72       wt     dlgn  p15      dlgn            axon
## iprgc_73   iprgc_73  iprgc_73       wt     dlgn  p15      dlgn            axon
## iprgc_74   iprgc_74  iprgc_74       wt   retina  p15    retina            soma
## iprgc_75   iprgc_75  iprgc_75       wt   retina  p15    retina            soma
## iprgc_76   iprgc_76  iprgc_76       wt   retina  p15    retina            soma
## iprgc_77   iprgc_77  iprgc_77       wt      scn  p15       scn            axon
## iprgc_81   iprgc_81  iprgc_81       wt     dlgn  p08      dlgn            axon
## iprgc_82   iprgc_82  iprgc_82       wt     dlgn  p08      dlgn            axon
## iprgc_83   iprgc_83  iprgc_83       wt   retina  p08    retina            soma
## iprgc_84   iprgc_84  iprgc_84       wt   retina  p08    retina            soma
## iprgc_85   iprgc_85  iprgc_85      het     dlgn  p15       scn            axon
## iprgc_86   iprgc_86  iprgc_86       ko     dlgn  p15    retina            soma
## iprgc_87   iprgc_87  iprgc_87      het   retina  p15      dlgn            axon
## iprgc_88   iprgc_88  iprgc_88       ko     dlgn  p08      dlgn            axon
## iprgc_89   iprgc_89  iprgc_89       ko   retina  p15       scn            axon
## iprgc_90   iprgc_90  iprgc_90       ko   retina  p08    retina            soma
## iprgc_91   iprgc_91  iprgc_91       wt   retina  p08    retina            soma
## iprgc_92   iprgc_92  iprgc_92       wt   retina  p15      dlgn            axon
## iprgc_93   iprgc_93  iprgc_93       wt     dlgn  p15       scn            axon
## iprgc_94   iprgc_94  iprgc_94       ko      scn  p15      dlgn            axon
## iprgc_95   iprgc_95  iprgc_95      het      scn  p15       scn            axon
## iprgc_96   iprgc_96  iprgc_96       ko      scn  p08    retina            soma
## iprgc_97   iprgc_97  iprgc_97      het      scn  p08       scn            axon
## iprgc_98   iprgc_98  iprgc_98      het     dlgn  p08      dlgn            axon
## iprgc_99   iprgc_99  iprgc_99      het   retina  p08    retina            soma
## iprgc_100 iprgc_100 iprgc_100       wt      scn  p08      dlgn            axon
## iprgc_101 iprgc_101 iprgc_101       wt     dlgn  p08    retina            soma
## iprgc_102 iprgc_102 iprgc_102       wt      scn  p15       scn            axon
## iprgc_104 iprgc_104 iprgc_104      het     dlgn  p08      dlgn            axon
## iprgc_105 iprgc_105 iprgc_105      het     dlgn  p08      dlgn            axon
## iprgc_106 iprgc_106 iprgc_106      het     dlgn  p15      dlgn            axon
## iprgc_107 iprgc_107 iprgc_107       ko     dlgn  p08      dlgn            axon
## iprgc_108 iprgc_108 iprgc_108       ko     dlgn  p15      dlgn            axon
## iprgc_109 iprgc_109 iprgc_109       wt   retina  p08    retina            soma
## iprgc_110 iprgc_110 iprgc_110      het      scn  p08       scn            axon
## iprgc_111 iprgc_111 iprgc_111      het      scn  p08       scn            axon
## iprgc_112 iprgc_112 iprgc_112      het      scn  p15       scn            axon
## iprgc_113 iprgc_113 iprgc_113       ko      scn  p08       scn            axon
## iprgc_114 iprgc_114 iprgc_114       ko      scn  p15       scn            axon
## iprgc_115 iprgc_115 iprgc_115       wt   retina  p08    retina            soma
## iprgc_116 iprgc_116 iprgc_116       wt   retina  p15    retina            soma
## iprgc_117 iprgc_117 iprgc_117      het   retina  p08    retina            soma
## iprgc_118 iprgc_118 iprgc_118      het   retina  p08    retina            soma
## iprgc_119 iprgc_119 iprgc_119      het   retina  p15    retina            soma
## iprgc_120 iprgc_120 iprgc_120       ko   retina  p08    retina            soma
## iprgc_121 iprgc_121 iprgc_121       ko   retina  p08    retina            soma
## iprgc_122 iprgc_122 iprgc_122       ko   retina  p15    retina            soma
## iprgc_123 iprgc_123 iprgc_123     <NA>     <NA> <NA>      dlgn            <NA>
## iprgc_124 iprgc_124 iprgc_124     <NA>     <NA> <NA>       scn            <NA>
## iprgc_125 iprgc_125 iprgc_125     <NA>     <NA> <NA>      dlgn            <NA>
## iprgc_126 iprgc_126 iprgc_126     <NA>     <NA> <NA>      dlgn            <NA>
## iprgc_127 iprgc_127 iprgc_127     <NA>     <NA> <NA>      dlgn            <NA>
## iprgc_128 iprgc_128 iprgc_128     <NA>     <NA> <NA>       scn            <NA>
## iprgc_129 iprgc_129 iprgc_129     <NA>     <NA> <NA>       scn            <NA>
## iprgc_130 iprgc_130 iprgc_130     <NA>     <NA> <NA>       scn            <NA>
##                                            raw_r1
## iprgc_62     P15_Het_dLGN_S1A_S16_R1_001.fastq.gz
## iprgc_63     P15_Het_dLGN_S2A_S17_R1_001.fastq.gz
## iprgc_64       P15_Het_Ret_S1A_S7_R1_001.fastq.gz
## iprgc_65       P15_Het_Ret_S2A_S8_R1_001.fastq.gz
## iprgc_66      P15_Het_SCN_S1A_S21_R1_001.fastq.gz
## iprgc_67      P15_Het_SCN_S2A_S22_R1_001.fastq.gz
## iprgc_68      P15_KO_dLGN_S1A_S18_R1_001.fastq.gz
## iprgc_69        P15_KO_Ret_S1A_S9_R1_001.fastq.gz
## iprgc_70       P15_KO_SCN_S1A_S23_R1_001.fastq.gz
## iprgc_71      P15_WT_dLGN_S1A_S12_R1_001.fastq.gz
## iprgc_72      P15_WT_dLGN_S2A_S13_R1_001.fastq.gz
## iprgc_73      P15_WT_dLGN_S3A_S14_R1_001.fastq.gz
## iprgc_74        P15_WT_Ret_S1A_S3_R1_001.fastq.gz
## iprgc_75        P15_WT_Ret_S2A_S4_R1_001.fastq.gz
## iprgc_76        P15_WT_Ret_S3A_S5_R1_001.fastq.gz
## iprgc_77       P15_WT_SCN_S3A_S19_R1_001.fastq.gz
## iprgc_81       P8_WT_dLGN_S1A_S10_R1_001.fastq.gz
## iprgc_82       P8_WT_dLGN_S2A_S11_R1_001.fastq.gz
## iprgc_83         P8_WT_Ret_S1A_S1_R1_001.fastq.gz
## iprgc_84         P8_WT_Ret_S2A_S2_R1_001.fastq.gz
## iprgc_85        P8_KO_SCN_S1A_S12_R1_001.fastq.gz
## iprgc_86        P8_KO_Ret_S1A_S10_R1_001.fastq.gz
## iprgc_87       P8_KO_dLGN_S1A_S11_R1_001.fastq.gz
## iprgc_88       P8_Het_dLGN_S1A_S8_R1_001.fastq.gz
## iprgc_89        P8_Het_SCN_S1A_S9_R1_001.fastq.gz
## iprgc_90        P8_Het_Ret_S1A_S7_R1_001.fastq.gz
## iprgc_91         P8_WT_Ret_S1A_S1_R2_001.fastq.gz
## iprgc_92        P8_WT_dLGN_S1A_S2_R1_001.fastq.gz
## iprgc_93         P8_WT_SCN_S1A_S3_R1_001.fastq.gz
## iprgc_94     P15_Het_dLGN_S1B_S17_R1_001.fastq.gz
## iprgc_95      P15_Het_SCN_S1B_S18_R1_001.fastq.gz
## iprgc_96      P15_Het_Ret_S1B_S16_R1_001.fastq.gz
## iprgc_97        P15_WT_SCN_S1A_S6_R1_001.fastq.gz
## iprgc_98       P15_WT_dLGN_S1A_S5_R1_001.fastq.gz
## iprgc_99        P15_WT_Ret_S1A_S4_R1_001.fastq.gz
## iprgc_100     P15_KO_dLGN_S1A_S14_R1_001.fastq.gz
## iprgc_101      P15_KO_Ret_S1A_S13_R1_001.fastq.gz
## iprgc_102      P15_KO_SCN_S1A_S15_R1_001.fastq.gz
## iprgc_104   13b_P8_Het_dLGN_S2_S6_R1_001.fastq.gz
## iprgc_105   14b_P8_Het_dLGN_S3_S7_R1_001.fastq.gz
## iprgc_106 15b_P15_Het_dLGN_S2_S8_R1_001.fastq.gz 
## iprgc_107     16_P8_KO_dLGN_S2_S9_R1_001.fastq.gz
## iprgc_108   18_P15_KO_dLGN_S2_S10_R1_001.fastq.gz
## iprgc_109     1b_P8_WT_Ret_S2_S16_R1_001.fastq.gz
## iprgc_110   22b_P8_Het_SCN_S2_S11_R1_001.fastq.gz
## iprgc_111   23b_P8_Het_SCN_S3_S12_R1_001.fastq.gz
## iprgc_112  24b_P15_Het_SCN_S2_S13_R1_001.fastq.gz
## iprgc_113     25_P8_KO_SCN_S2_S14_R1_001.fastq.gz
## iprgc_114    27_P15_KO_SCN_S2_S15_R1_001.fastq.gz
## iprgc_115     2b_P8_WT_Ret_S3_S17_R1_001.fastq.gz
## iprgc_116    3b_P15_WT_Ret_S3_S18_R1_001.fastq.gz
## iprgc_117     4b_P8_Het_Ret_S2_S1_R1_001.fastq.gz
## iprgc_118     5_P8_Het_Ret_S3_S2_R1_001.fastq.gz 
## iprgc_119    6b_P15_Het_Ret_S2_S3_R1_001.fastq.gz
## iprgc_120       7_P8_KO_Ret_S2_S4_R1_001.fastq.gz
## iprgc_121      8_P8_KO_Ret_S3_S19_R1_001.fastq.gz
## iprgc_122      9_P15_KO_Ret_S2_S5_R1_001.fastq.gz
## iprgc_123                                    <NA>
## iprgc_124                                    <NA>
## iprgc_125                                    <NA>
## iprgc_126                                    <NA>
## iprgc_127                                    <NA>
## iprgc_128                                    <NA>
## iprgc_129                                    <NA>
## iprgc_130                                    <NA>
##                                            raw_r2 batch date_received
## iprgc_62     P15_Het_dLGN_S1A_S16_R2_001.fastq.gz   het     b20220518
## iprgc_63     P15_Het_dLGN_S2A_S17_R2_001.fastq.gz   het     b20220518
## iprgc_64       P15_Het_Ret_S1A_S7_R2_001.fastq.gz   het     b20220518
## iprgc_65       P15_Het_Ret_S2A_S8_R2_001.fastq.gz   het     b20220518
## iprgc_66      P15_Het_SCN_S1A_S21_R2_001.fastq.gz   het     b20220518
## iprgc_67      P15_Het_SCN_S2A_S22_R2_001.fastq.gz   het     b20220518
## iprgc_68      P15_KO_dLGN_S1A_S18_R2_001.fastq.gz    ko     b20220518
## iprgc_69        P15_KO_Ret_S1A_S9_R2_001.fastq.gz    ko     b20220518
## iprgc_70       P15_KO_SCN_S1A_S23_R2_001.fastq.gz    ko     b20220518
## iprgc_71      P15_WT_dLGN_S1A_S12_R2_001.fastq.gz    wt     b20220518
## iprgc_72      P15_WT_dLGN_S2A_S13_R2_001.fastq.gz    wt     b20220518
## iprgc_73      P15_WT_dLGN_S3A_S14_R2_001.fastq.gz    wt     b20220518
## iprgc_74        P15_WT_Ret_S1A_S3_R2_001.fastq.gz    wt     b20220518
## iprgc_75        P15_WT_Ret_S2A_S4_R2_001.fastq.gz    wt     b20220518
## iprgc_76        P15_WT_Ret_S3A_S5_R2_001.fastq.gz    wt     b20220518
## iprgc_77       P15_WT_SCN_S3A_S19_R2_001.fastq.gz    wt     b20220518
## iprgc_81       P8_WT_dLGN_S1A_S10_R2_001.fastq.gz    wt     b20220518
## iprgc_82       P8_WT_dLGN_S2A_S11_R2_001.fastq.gz    wt     b20220518
## iprgc_83         P8_WT_Ret_S1A_S1_R2_001.fastq.gz    wt     b20220518
## iprgc_84         P8_WT_Ret_S2A_S2_R2_001.fastq.gz    wt     b20220518
## iprgc_85        P8_KO_SCN_S1A_S12_R2_001.fastq.gz    ko     b20230515
## iprgc_86        P8_KO_Ret_S1A_S10_R2_001.fastq.gz    ko     b20230515
## iprgc_87       P8_KO_dLGN_S1A_S11_R2_001.fastq.gz    ko     b20230515
## iprgc_88       P8_Het_dLGN_S1A_S8_R2_001.fastq.gz   het     b20230515
## iprgc_89        P8_Het_SCN_S1A_S9_R2_001.fastq.gz   het     b20230515
## iprgc_90        P8_Het_Ret_S1A_S7_R2_001.fastq.gz   het     b20230515
## iprgc_91         P8_WT_Ret_S1A_S1_R2_001.fastq.gz    wt     b20230515
## iprgc_92        P8_WT_dLGN_S1A_S2_R2_001.fastq.gz    wt     b20230515
## iprgc_93         P8_WT_SCN_S1A_S3_R2_001.fastq.gz    wt     b20230515
## iprgc_94     P15_Het_dLGN_S1B_S17_R2_001.fastq.gz   het     b20230515
## iprgc_95      P15_Het_SCN_S1B_S18_R2_001.fastq.gz   het     b20230516
## iprgc_96      P15_Het_Ret_S1B_S16_R2_001.fastq.gz   het     b20230517
## iprgc_97        P15_WT_SCN_S1A_S6_R2_001.fastq.gz    wt     b20230518
## iprgc_98       P15_WT_dLGN_S1A_S5_R2_001.fastq.gz    wt     b20230519
## iprgc_99        P15_WT_Ret_S1A_S4_R2_001.fastq.gz    wt     b20230520
## iprgc_100     P15_KO_dLGN_S1A_S14_R2_001.fastq.gz    ko     b20230521
## iprgc_101      P15_KO_Ret_S1A_S13_R2_001.fastq.gz    ko     b20230522
## iprgc_102      P15_KO_SCN_S1A_S15_R2_001.fastq.gz    ko     b20230523
## iprgc_104   13b_P8_Het_dLGN_S2_S6_R2_001.fastq.gz   het     b20231010
## iprgc_105   14b_P8_Het_dLGN_S3_S7_R2_001.fastq.gz   het     b20231010
## iprgc_106 15b_P15_Het_dLGN_S2_S8_R2_001.fastq.gz    het     b20231010
## iprgc_107     16_P8_KO_dLGN_S2_S9_R2_001.fastq.gz    ko     b20231010
## iprgc_108   18_P15_KO_dLGN_S2_S10_R2_001.fastq.gz    ko     b20231010
## iprgc_109     1b_P8_WT_Ret_S2_S16_R2_001.fastq.gz    wt     b20231010
## iprgc_110   22b_P8_Het_SCN_S2_S11_R2_001.fastq.gz   het     b20231010
## iprgc_111   23b_P8_Het_SCN_S3_S12_R2_001.fastq.gz   het     b20231010
## iprgc_112  24b_P15_Het_SCN_S2_S13_R2_001.fastq.gz   het     b20231010
## iprgc_113     25_P8_KO_SCN_S2_S14_R2_001.fastq.gz    ko     b20231010
## iprgc_114    27_P15_KO_SCN_S2_S15_R2_001.fastq.gz    ko     b20231010
## iprgc_115     2b_P8_WT_Ret_S3_S17_R2_001.fastq.gz    wt     b20231010
## iprgc_116    3b_P15_WT_Ret_S3_S18_R2_001.fastq.gz    wt     b20231010
## iprgc_117     4b_P8_Het_Ret_S2_S1_R2_001.fastq.gz   het     b20231010
## iprgc_118     5_P8_Het_Ret_S3_S2_R2_001.fastq.gz    het     b20231010
## iprgc_119    6b_P15_Het_Ret_S2_S3_R2_001.fastq.gz   het     b20231010
## iprgc_120       7_P8_KO_Ret_S2_S4_R2_001.fastq.gz    ko     b20231010
## iprgc_121      8_P8_KO_Ret_S3_S19_R2_001.fastq.gz    ko     b20231010
## iprgc_122      9_P15_KO_Ret_S2_S5_R2_001.fastq.gz    ko     b20231010
## iprgc_123                                    <NA>    ko          <NA>
## iprgc_124                                    <NA>    ko          <NA>
## iprgc_125                                    <NA>    wt          <NA>
## iprgc_126                                    <NA>    wt          <NA>
## iprgc_127                                    <NA>    wt          <NA>
## iprgc_128                                    <NA>    wt          <NA>
## iprgc_129                                    <NA>    wt          <NA>
## iprgc_130                                    <NA>    wt          <NA>
##                                                                                                                   file
## iprgc_62  preprocessing_new/iprgc_62/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_63  preprocessing_new/iprgc_63/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_64  preprocessing_new/iprgc_64/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_65  preprocessing_new/iprgc_65/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_66  preprocessing_new/iprgc_66/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_67  preprocessing_new/iprgc_67/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_68  preprocessing_new/iprgc_68/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_69  preprocessing_new/iprgc_69/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_70  preprocessing_new/iprgc_70/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_71  preprocessing_new/iprgc_71/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_72  preprocessing_new/iprgc_72/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_73  preprocessing_new/iprgc_73/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_74  preprocessing_new/iprgc_74/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_75  preprocessing_new/iprgc_75/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_76  preprocessing_new/iprgc_76/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_77  preprocessing_new/iprgc_77/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_81      preprocessing/iprgc_81/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_82      preprocessing/iprgc_82/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_83      preprocessing/iprgc_83/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_84      preprocessing/iprgc_84/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_85             preprocessing/iprgc_85/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_86             preprocessing/iprgc_86/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_87             preprocessing/iprgc_87/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_88             preprocessing/iprgc_88/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_89             preprocessing/iprgc_89/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_90             preprocessing/iprgc_90/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_91             preprocessing/iprgc_91/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_92             preprocessing/iprgc_92/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_93             preprocessing/iprgc_93/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_94             preprocessing/iprgc_94/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_95             preprocessing/iprgc_95/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_96             preprocessing/iprgc_96/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_97             preprocessing/iprgc_97/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_98             preprocessing/iprgc_98/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_99             preprocessing/iprgc_99/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_100           preprocessing/iprgc_100/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_101           preprocessing/iprgc_101/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_102           preprocessing/iprgc_102/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_104           preprocessing/iprgc_104/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_105           preprocessing/iprgc_105/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_106           preprocessing/iprgc_106/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_107           preprocessing/iprgc_107/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_108           preprocessing/iprgc_108/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_109           preprocessing/iprgc_109/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_110           preprocessing/iprgc_110/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_111           preprocessing/iprgc_111/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_112           preprocessing/iprgc_112/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_113           preprocessing/iprgc_113/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_114           preprocessing/iprgc_114/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_115           preprocessing/iprgc_115/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_116           preprocessing/iprgc_116/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_117           preprocessing/iprgc_117/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_118           preprocessing/iprgc_118/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_119           preprocessing/iprgc_119/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_120           preprocessing/iprgc_120/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_121           preprocessing/iprgc_121/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_122           preprocessing/iprgc_122/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_123                                                                                                         <NA>
## iprgc_124                                                                                                         <NA>
## iprgc_125                                                                                                         <NA>
## iprgc_126                                                                                                         <NA>
## iprgc_127                                                                                                         <NA>
## iprgc_128                                                                                                         <NA>
## iprgc_129                                                                                                         <NA>
## iprgc_130                                                                                                         <NA>
##                                                                                                                                  symlink
## iprgc_62  preprocessing/preprocessing_new_taa/iprgc_62/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_63  preprocessing/preprocessing_new_taa/iprgc_63/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_64  preprocessing/preprocessing_new_taa/iprgc_64/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_65  preprocessing/preprocessing_new_taa/iprgc_65/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_66  preprocessing/preprocessing_new_taa/iprgc_66/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_67  preprocessing/preprocessing_new_taa/iprgc_67/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_68  preprocessing/preprocessing_new_taa/iprgc_68/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_69  preprocessing/preprocessing_new_taa/iprgc_69/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_70  preprocessing/preprocessing_new_taa/iprgc_70/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_71  preprocessing/preprocessing_new_taa/iprgc_71/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_72  preprocessing/preprocessing_new_taa/iprgc_72/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_73  preprocessing/preprocessing_new_taa/iprgc_73/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_74  preprocessing/preprocessing_new_taa/iprgc_74/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_75  preprocessing/preprocessing_new_taa/iprgc_75/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_76  preprocessing/preprocessing_new_taa/iprgc_76/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_77  preprocessing/preprocessing_new_taa/iprgc_77/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_81      preprocessing/preprocessing_taa/iprgc_81/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_82      preprocessing/preprocessing_taa/iprgc_82/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_83      preprocessing/preprocessing_taa/iprgc_83/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_84      preprocessing/preprocessing_taa/iprgc_84/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_85                                                                                                                            <NA>
## iprgc_86             preprocessing/preprocessing_taa/iprgc_85/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_87             preprocessing/preprocessing_taa/iprgc_86/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_88             preprocessing/preprocessing_taa/iprgc_87/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_89             preprocessing/preprocessing_taa/iprgc_88/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_90             preprocessing/preprocessing_taa/iprgc_89/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_91             preprocessing/preprocessing_taa/iprgc_90/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_92             preprocessing/preprocessing_taa/iprgc_91/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_93             preprocessing/preprocessing_taa/iprgc_92/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_94             preprocessing/preprocessing_taa/iprgc_93/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_95             preprocessing/preprocessing_taa/iprgc_94/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_96             preprocessing/preprocessing_taa/iprgc_95/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_97             preprocessing/preprocessing_taa/iprgc_96/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_98             preprocessing/preprocessing_taa/iprgc_97/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_99             preprocessing/preprocessing_taa/iprgc_98/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_100            preprocessing/preprocessing_taa/iprgc_99/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_101           preprocessing/preprocessing_taa/iprgc_100/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_102           preprocessing/preprocessing_taa/iprgc_101/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_104                                                                                                                           <NA>
## iprgc_105           preprocessing/preprocessing_taa/iprgc_103/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_106           preprocessing/preprocessing_taa/iprgc_104/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_107           preprocessing/preprocessing_taa/iprgc_105/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_108           preprocessing/preprocessing_taa/iprgc_106/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_109           preprocessing/preprocessing_taa/iprgc_107/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_110           preprocessing/preprocessing_taa/iprgc_108/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_111           preprocessing/preprocessing_taa/iprgc_109/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_112           preprocessing/preprocessing_taa/iprgc_110/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_113           preprocessing/preprocessing_taa/iprgc_111/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_114           preprocessing/preprocessing_taa/iprgc_112/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_115           preprocessing/preprocessing_taa/iprgc_113/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_116           preprocessing/preprocessing_taa/iprgc_114/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_117           preprocessing/preprocessing_taa/iprgc_115/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_118           preprocessing/preprocessing_taa/iprgc_116/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_119           preprocessing/preprocessing_taa/iprgc_117/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_120           preprocessing/preprocessing_taa/iprgc_118/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_121           preprocessing/preprocessing_taa/iprgc_119/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_122           preprocessing/preprocessing_taa/iprgc_120/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_123           preprocessing/preprocessing_taa/iprgc_121/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_124           preprocessing/preprocessing_taa/iprgc_122/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_125                                                                                                                           <NA>
## iprgc_126                                                                                                                           <NA>
## iprgc_127                                                                                                                           <NA>
## iprgc_128                                                                                                                           <NA>
## iprgc_129                                                                                                                           <NA>
## iprgc_130                                                                                                                           <NA>
##           totalreads trim1_both_surviving trim1_suriving_pct trim1_forward
## iprgc_62    21454044              7307772             0.3406      10575438
## iprgc_63    15326358              5673117             0.3702       8006539
## iprgc_64    18003256              6665716             0.3703       9518432
## iprgc_65    20929623              7076283             0.3381      10013788
## iprgc_66    15724842              6013402             0.3824       8415519
## iprgc_67    15456881              5714266             0.3697       8184877
## iprgc_68    19666257              6900044             0.3509       9066997
## iprgc_69    16552894              6100310             0.3685       8839919
## iprgc_70    13740575              5066146             0.3687       7296079
## iprgc_71    15525499              6038811             0.3890       8406723
## iprgc_72    17094474              6541727             0.3827       9369448
## iprgc_73    15794837              6056416             0.3834       8661904
## iprgc_74    15775224              6094043             0.3863       8876775
## iprgc_75    16328183              6160227             0.3773       8655792
## iprgc_76    24180028              9053454             0.3744      13014766
## iprgc_77    17538867              5891680             0.3359       8619704
## iprgc_81    16532098              6408776             0.3877       8634609
## iprgc_82    15878311              5957695             0.3752       8664412
## iprgc_83    16082507              6370746             0.3961       8795845
## iprgc_84    15958920              6090563             0.3816       8659251
## iprgc_85          NA                   NA                 NA            NA
## iprgc_86          NA                   NA                 NA            NA
## iprgc_87          NA                   NA                 NA            NA
## iprgc_88          NA                   NA                 NA            NA
## iprgc_89          NA                   NA                 NA            NA
## iprgc_90          NA                   NA                 NA            NA
## iprgc_91          NA                   NA                 NA            NA
## iprgc_92          NA                   NA                 NA            NA
## iprgc_93          NA                   NA                 NA            NA
## iprgc_94          NA                   NA                 NA            NA
## iprgc_95          NA                   NA                 NA            NA
## iprgc_96          NA                   NA                 NA            NA
## iprgc_97          NA                   NA                 NA            NA
## iprgc_98          NA                   NA                 NA            NA
## iprgc_99          NA                   NA                 NA            NA
## iprgc_100         NA                   NA                 NA            NA
## iprgc_101         NA                   NA                 NA            NA
## iprgc_102         NA                   NA                 NA            NA
## iprgc_104         NA                   NA                 NA            NA
## iprgc_105         NA                   NA                 NA            NA
## iprgc_106         NA                   NA                 NA            NA
## iprgc_107         NA                   NA                 NA            NA
## iprgc_108         NA                   NA                 NA            NA
## iprgc_109         NA                   NA                 NA            NA
## iprgc_110         NA                   NA                 NA            NA
## iprgc_111         NA                   NA                 NA            NA
## iprgc_112         NA                   NA                 NA            NA
## iprgc_113         NA                   NA                 NA            NA
## iprgc_114         NA                   NA                 NA            NA
## iprgc_115         NA                   NA                 NA            NA
## iprgc_116         NA                   NA                 NA            NA
## iprgc_117         NA                   NA                 NA            NA
## iprgc_118         NA                   NA                 NA            NA
## iprgc_119         NA                   NA                 NA            NA
## iprgc_120         NA                   NA                 NA            NA
## iprgc_121         NA                   NA                 NA            NA
## iprgc_122         NA                   NA                 NA            NA
## iprgc_123         NA                   NA                 NA            NA
## iprgc_124         NA                   NA                 NA            NA
## iprgc_125         NA                   NA                 NA            NA
## iprgc_126         NA                   NA                 NA            NA
## iprgc_127         NA                   NA                 NA            NA
## iprgc_128         NA                   NA                 NA            NA
## iprgc_129         NA                   NA                 NA            NA
## iprgc_130         NA                   NA                 NA            NA
##           trim1_reverse trim1_dropped trim2_remaining trim2_surviving_pct
## iprgc_62         161944       3408890        19941862              0.9295
## iprgc_63         126447       1520255        14735531              0.9615
## iprgc_64         147975       1671133        17308611              0.9614
## iprgc_65         183633       3655919        19162876              0.9156
## iprgc_66         135052       1160869        15152058              0.9636
## iprgc_67         129987       1427751        14776608              0.9560
## iprgc_68         154410       3544806        18079308              0.9193
## iprgc_69         153735       1458930        15834102              0.9566
## iprgc_70         107844       1270506        13117568              0.9547
## iprgc_71         140419        939546        15001298              0.9662
## iprgc_72         148260       1035039        16587408              0.9703
## iprgc_73         139349        937168        15290737              0.9681
## iprgc_74         131880        672526        15327351              0.9716
## iprgc_75         155114       1357050        15648822              0.9584
## iprgc_76         212621       1899187        23269354              0.9623
## iprgc_77         126846       2900637        16006650              0.9126
## iprgc_81         160717       1327996        15768927              0.9538
## iprgc_82         137408       1118796        15308622              0.9641
## iprgc_83         137211        778705        15698279              0.9761
## iprgc_84         140920       1068186        15508709              0.9718
## iprgc_85             NA            NA              NA                  NA
## iprgc_86             NA            NA              NA                  NA
## iprgc_87             NA            NA              NA                  NA
## iprgc_88             NA            NA              NA                  NA
## iprgc_89             NA            NA              NA                  NA
## iprgc_90             NA            NA              NA                  NA
## iprgc_91             NA            NA              NA                  NA
## iprgc_92             NA            NA              NA                  NA
## iprgc_93             NA            NA              NA                  NA
## iprgc_94             NA            NA              NA                  NA
## iprgc_95             NA            NA              NA                  NA
## iprgc_96             NA            NA              NA                  NA
## iprgc_97             NA            NA              NA                  NA
## iprgc_98             NA            NA              NA                  NA
## iprgc_99             NA            NA              NA                  NA
## iprgc_100            NA            NA              NA                  NA
## iprgc_101            NA            NA              NA                  NA
## iprgc_102            NA            NA              NA                  NA
## iprgc_104            NA            NA              NA                  NA
## iprgc_105            NA            NA              NA                  NA
## iprgc_106            NA            NA              NA                  NA
## iprgc_107            NA            NA              NA                  NA
## iprgc_108            NA            NA              NA                  NA
## iprgc_109            NA            NA              NA                  NA
## iprgc_110            NA            NA              NA                  NA
## iprgc_111            NA            NA              NA                  NA
## iprgc_112            NA            NA              NA                  NA
## iprgc_113            NA            NA              NA                  NA
## iprgc_114            NA            NA              NA                  NA
## iprgc_115            NA            NA              NA                  NA
## iprgc_116            NA            NA              NA                  NA
## iprgc_117            NA            NA              NA                  NA
## iprgc_118            NA            NA              NA                  NA
## iprgc_119            NA            NA              NA                  NA
## iprgc_120            NA            NA              NA                  NA
## iprgc_121            NA            NA              NA                  NA
## iprgc_122            NA            NA              NA                  NA
## iprgc_123            NA            NA              NA                  NA
## iprgc_124            NA            NA              NA                  NA
## iprgc_125            NA            NA              NA                  NA
## iprgc_126            NA            NA              NA                  NA
## iprgc_127            NA            NA              NA                  NA
## iprgc_128            NA            NA              NA                  NA
## iprgc_129            NA            NA              NA                  NA
## iprgc_130            NA            NA              NA                  NA
##           hisat_aligned_cogent_single hisat_aligned_cogent_multi
## iprgc_62                      4403419                    1083744
## iprgc_63                      3913257                    1576743
## iprgc_64                      8017462                    1026624
## iprgc_65                      9046156                    1156208
## iprgc_66                      5991145                    1028730
## iprgc_67                      5936037                    1208092
## iprgc_68                      3617748                     990881
## iprgc_69                     10915725                    1053089
## iprgc_70                      4302666                     866074
## iprgc_71                      5866688                    1181784
## iprgc_72                      6332063                    1423466
## iprgc_73                      5980501                    1233428
## iprgc_74                      9320058                    1156166
## iprgc_75                      8782932                    1128430
## iprgc_76                     13923768                    2032992
## iprgc_77                      4119038                     884696
## iprgc_81                      6300618                    1191976
## iprgc_82                      6276247                    1097569
## iprgc_83                      9641795                    3309802
## iprgc_84                      9095113                    2231760
## iprgc_85                           NA                         NA
## iprgc_86                           NA                         NA
## iprgc_87                           NA                         NA
## iprgc_88                           NA                         NA
## iprgc_89                           NA                         NA
## iprgc_90                           NA                         NA
## iprgc_91                           NA                         NA
## iprgc_92                           NA                         NA
## iprgc_93                           NA                         NA
## iprgc_94                           NA                         NA
## iprgc_95                           NA                         NA
## iprgc_96                           NA                         NA
## iprgc_97                           NA                         NA
## iprgc_98                           NA                         NA
## iprgc_99                           NA                         NA
## iprgc_100                          NA                         NA
## iprgc_101                          NA                         NA
## iprgc_102                          NA                         NA
## iprgc_104                          NA                         NA
## iprgc_105                          NA                         NA
## iprgc_106                          NA                         NA
## iprgc_107                          NA                         NA
## iprgc_108                          NA                         NA
## iprgc_109                          NA                         NA
## iprgc_110                          NA                         NA
## iprgc_111                          NA                         NA
## iprgc_112                          NA                         NA
## iprgc_113                          NA                         NA
## iprgc_114                          NA                         NA
## iprgc_115                          NA                         NA
## iprgc_116                          NA                         NA
## iprgc_117                          NA                         NA
## iprgc_118                          NA                         NA
## iprgc_119                          NA                         NA
## iprgc_120                          NA                         NA
## iprgc_121                          NA                         NA
## iprgc_122                          NA                         NA
## iprgc_123                          NA                         NA
## iprgc_124                          NA                         NA
## iprgc_125                          NA                         NA
## iprgc_126                          NA                         NA
## iprgc_127                          NA                         NA
## iprgc_128                          NA                         NA
## iprgc_129                          NA                         NA
## iprgc_130                          NA                         NA
##           hisat_aligned_cogent_pct rrna_aligned_single rrna_aligned_single_pct
## iprgc_62                    0.2558             9981295                  0.5581
## iprgc_63                    0.3582             8456038                  0.6181
## iprgc_64                    0.5024             5806861                  0.3588
## iprgc_65                    0.4875             4654006                  0.2723
## iprgc_66                    0.4464             7223609                  0.5006
## iprgc_67                    0.4622             6686073                  0.4810
## iprgc_68                    0.2343             8880676                  0.5562
## iprgc_69                    0.7231             1156001                  0.0774
## iprgc_70                    0.3762             5198926                  0.4205
## iprgc_71                    0.4540             8388194                  0.5807
## iprgc_72                    0.4537             8912327                  0.5601
## iprgc_73                    0.4567             8572959                  0.5825
## iprgc_74                    0.6641             4950093                  0.3306
## iprgc_75                    0.6070             3564544                  0.2406
## iprgc_76                    0.6599             4499355                  0.2039
## iprgc_77                    0.2853             5596546                  0.3857
## iprgc_81                    0.4532             7013653                  0.4662
## iprgc_82                    0.4644             4686722                  0.3205
## iprgc_83                    0.8053             2613957                  0.1723
## iprgc_84                    0.7098             2753845                  0.1867
## iprgc_85                        NA                  NA                      NA
## iprgc_86                        NA                  NA                      NA
## iprgc_87                        NA                  NA                      NA
## iprgc_88                        NA                  NA                      NA
## iprgc_89                        NA                  NA                      NA
## iprgc_90                        NA                  NA                      NA
## iprgc_91                        NA                  NA                      NA
## iprgc_92                        NA                  NA                      NA
## iprgc_93                        NA                  NA                      NA
## iprgc_94                        NA                  NA                      NA
## iprgc_95                        NA                  NA                      NA
## iprgc_96                        NA                  NA                      NA
## iprgc_97                        NA                  NA                      NA
## iprgc_98                        NA                  NA                      NA
## iprgc_99                        NA                  NA                      NA
## iprgc_100                       NA                  NA                      NA
## iprgc_101                       NA                  NA                      NA
## iprgc_102                       NA                  NA                      NA
## iprgc_104                       NA                  NA                      NA
## iprgc_105                       NA                  NA                      NA
## iprgc_106                       NA                  NA                      NA
## iprgc_107                       NA                  NA                      NA
## iprgc_108                       NA                  NA                      NA
## iprgc_109                       NA                  NA                      NA
## iprgc_110                       NA                  NA                      NA
## iprgc_111                       NA                  NA                      NA
## iprgc_112                       NA                  NA                      NA
## iprgc_113                       NA                  NA                      NA
## iprgc_114                       NA                  NA                      NA
## iprgc_115                       NA                  NA                      NA
## iprgc_116                       NA                  NA                      NA
## iprgc_117                       NA                  NA                      NA
## iprgc_118                       NA                  NA                      NA
## iprgc_119                       NA                  NA                      NA
## iprgc_120                       NA                  NA                      NA
## iprgc_121                       NA                  NA                      NA
## iprgc_122                       NA                  NA                      NA
## iprgc_123                       NA                  NA                      NA
## iprgc_124                       NA                  NA                      NA
## iprgc_125                       NA                  NA                      NA
## iprgc_126                       NA                  NA                      NA
## iprgc_127                       NA                  NA                      NA
## iprgc_128                       NA                  NA                      NA
## iprgc_129                       NA                  NA                      NA
## iprgc_130                       NA                  NA                      NA
##           rrna_aligned_multi rrna_aligned_multi_pct rrna_not_aligned
## iprgc_62              552408                 0.0309          7349507
## iprgc_63              554987                 0.0406          4668631
## iprgc_64              211357                 0.0131         10165930
## iprgc_65              186314                 0.0109         12249751
## iprgc_66              505801                 0.0351          6699511
## iprgc_67              449142                 0.0323          6763928
## iprgc_68              464529                 0.0291          6621836
## iprgc_69               30867                 0.0021         13753361
## iprgc_70              301939                 0.0244          6861360
## iprgc_71              675994                 0.0468          5381346
## iprgc_72              784989                 0.0493          6213859
## iprgc_73              485581                 0.0330          5659780
## iprgc_74              506909                 0.0339          9513816
## iprgc_75              282107                 0.0190         10969368
## iprgc_76              444836                 0.0202         17124029
## iprgc_77              267421                 0.0184          8647417
## iprgc_81              334632                 0.0222          7695100
## iprgc_82              323766                 0.0221          9611619
## iprgc_83              139135                 0.0092         12413499
## iprgc_84              249586                 0.0169         11746383
## iprgc_85                  NA                     NA               NA
## iprgc_86                  NA                     NA               NA
## iprgc_87                  NA                     NA               NA
## iprgc_88                  NA                     NA               NA
## iprgc_89                  NA                     NA               NA
## iprgc_90                  NA                     NA               NA
## iprgc_91                  NA                     NA               NA
## iprgc_92                  NA                     NA               NA
## iprgc_93                  NA                     NA               NA
## iprgc_94                  NA                     NA               NA
## iprgc_95                  NA                     NA               NA
## iprgc_96                  NA                     NA               NA
## iprgc_97                  NA                     NA               NA
## iprgc_98                  NA                     NA               NA
## iprgc_99                  NA                     NA               NA
## iprgc_100                 NA                     NA               NA
## iprgc_101                 NA                     NA               NA
## iprgc_102                 NA                     NA               NA
## iprgc_104                 NA                     NA               NA
## iprgc_105                 NA                     NA               NA
## iprgc_106                 NA                     NA               NA
## iprgc_107                 NA                     NA               NA
## iprgc_108                 NA                     NA               NA
## iprgc_109                 NA                     NA               NA
## iprgc_110                 NA                     NA               NA
## iprgc_111                 NA                     NA               NA
## iprgc_112                 NA                     NA               NA
## iprgc_113                 NA                     NA               NA
## iprgc_114                 NA                     NA               NA
## iprgc_115                 NA                     NA               NA
## iprgc_116                 NA                     NA               NA
## iprgc_117                 NA                     NA               NA
## iprgc_118                 NA                     NA               NA
## iprgc_119                 NA                     NA               NA
## iprgc_120                 NA                     NA               NA
## iprgc_121                 NA                     NA               NA
## iprgc_122                 NA                     NA               NA
## iprgc_123                 NA                     NA               NA
## iprgc_124                 NA                     NA               NA
## iprgc_125                 NA                     NA               NA
## iprgc_126                 NA                     NA               NA
## iprgc_127                 NA                     NA               NA
## iprgc_128                 NA                     NA               NA
## iprgc_129                 NA                     NA               NA
## iprgc_130                 NA                     NA               NA
##              rrna_not_aligned_pct hisat_single hisat_multi hisat_map_pct
## iprgc_62                    0.411      1848699      820527        0.1339
## iprgc_63                   0.3413      1487847      590756        0.1411
## iprgc_64                   0.6281      3115788      634919        0.2167
## iprgc_65                   0.7168      3497108      645740        0.2162
## iprgc_66                   0.4643      2450261      594272        0.2009
## iprgc_67                   0.4866      2410898      657348        0.2076
## iprgc_68                   0.4147      1693648      716559        0.1333
## iprgc_69                   0.9206      4103748      467294        0.2887
## iprgc_70                    0.555      1768274      466076        0.1703
## iprgc_71                   0.3725      2429963      731130        0.2107
## iprgc_72                   0.3905      2575448      795986        0.2033
## iprgc_73                   0.3845      2460492      708855        0.2073
## iprgc_74                   0.6355      3522006      601166        0.2690
## iprgc_75                   0.7404      3382787      555319        0.2517
## iprgc_76                    0.776      5278142      931930        0.2669
## iprgc_77                   0.5959      1670154      491774        0.1351
## iprgc_81                   0.5115      2673009      654361        0.2110
## iprgc_82                   0.6573      2443165      556951        0.1960
## iprgc_83                   0.8185      3764124     1427725        0.3307
## iprgc_84                   0.7964      3457750      987993        0.2867
## iprgc_85  LIKELY PCT mRNA CONTENT           NA          NA            NA
## iprgc_86                     <NA>           NA          NA            NA
## iprgc_87                     <NA>           NA          NA            NA
## iprgc_88                     <NA>           NA          NA            NA
## iprgc_89                     <NA>           NA          NA            NA
## iprgc_90                     <NA>           NA          NA            NA
## iprgc_91                     <NA>           NA          NA            NA
## iprgc_92                     <NA>           NA          NA            NA
## iprgc_93                     <NA>           NA          NA            NA
## iprgc_94                     <NA>           NA          NA            NA
## iprgc_95                     <NA>           NA          NA            NA
## iprgc_96                     <NA>           NA          NA            NA
## iprgc_97                     <NA>           NA          NA            NA
## iprgc_98                     <NA>           NA          NA            NA
## iprgc_99                     <NA>           NA          NA            NA
## iprgc_100                    <NA>           NA          NA            NA
## iprgc_101                    <NA>           NA          NA            NA
## iprgc_102                    <NA>           NA          NA            NA
## iprgc_104                    <NA>           NA          NA            NA
## iprgc_105                    <NA>           NA          NA            NA
## iprgc_106                    <NA>           NA          NA            NA
## iprgc_107                    <NA>           NA          NA            NA
## iprgc_108                    <NA>           NA          NA            NA
## iprgc_109                    <NA>           NA          NA            NA
## iprgc_110                    <NA>           NA          NA            NA
## iprgc_111                    <NA>           NA          NA            NA
## iprgc_112                    <NA>           NA          NA            NA
## iprgc_113                    <NA>           NA          NA            NA
## iprgc_114                    <NA>           NA          NA            NA
## iprgc_115                    <NA>           NA          NA            NA
## iprgc_116                    <NA>           NA          NA            NA
## iprgc_117                    <NA>           NA          NA            NA
## iprgc_118                    <NA>           NA          NA            NA
## iprgc_119                    <NA>           NA          NA            NA
## iprgc_120                    <NA>           NA          NA            NA
## iprgc_121                    <NA>           NA          NA            NA
## iprgc_122                    <NA>           NA          NA            NA
## iprgc_123                    <NA>           NA          NA            NA
## iprgc_124                    <NA>           NA          NA            NA
## iprgc_125                    <NA>           NA          NA            NA
## iprgc_126                    <NA>           NA          NA            NA
## iprgc_127                    <NA>           NA          NA            NA
## iprgc_128                    <NA>           NA          NA            NA
## iprgc_129                    <NA>           NA          NA            NA
## iprgc_130                    <NA>           NA          NA            NA
##           hisat_mapped_total_reads projectah sampleah rashmissamplenameah
## iprgc_62                    0.1244     021_1       16    P15_Het_dLGN_S1A
## iprgc_63                    0.1356     021_1       17    P15_Het_dLGN_S2A
## iprgc_64                    0.2083     021_1        7     P15_Het_Ret_S1A
## iprgc_65                    0.1979     021_1        8     P15_Het_Ret_S2A
## iprgc_66                    0.1936     021_1       25     P15_Het_SCN_S1A
## iprgc_67                    0.1985     021_1       26     P15_Het_SCN_S2A
## iprgc_68                    0.1226     021_1       18     P15_KO_dLGN_S1A
## iprgc_69                    0.2761     021_1        9      P15_KO_Ret_S1A
## iprgc_70                    0.1626     021_1       27      P15_KO_SCN_S1A
## iprgc_71                    0.2036     021_1       12     P15_WT_dLGN_S1A
## iprgc_72                    0.1972     021_1       13     P15_WT_dLGN_S2A
## iprgc_73                    0.2007     021_1       14     P15_WT_dLGN_S3A
## iprgc_74                    0.2614     021_1        3      P15_WT_Ret_S1A
## iprgc_75                    0.2412     021_1        4      P15_WT_Ret_S2A
## iprgc_76                    0.2568     021_1        5      P15_WT_Ret_S3A
## iprgc_77                    0.1233     021_1       23      P15_WT_SCN_S3A
## iprgc_81                    0.2013     021_1       10      P8_WT_dLGN_S1A
## iprgc_82                    0.1889     021_1       11      P8_WT_dLGN_S2A
## iprgc_83                    0.3228     021_1        1       P8_WT_Ret_S1A
## iprgc_84                    0.2786     021_1        2       P8_WT_Ret_S2A
## iprgc_85                        NA     021_2       15       P8_KO_SCN_S1A
## iprgc_86                        NA     021_2       13       P8_KO_Ret_S1A
## iprgc_87                        NA     021_2       14      P8_KO_dLGN_S1A
## iprgc_88                        NA     021_2        8     P8_Het_dLGN_S1A
## iprgc_89                        NA     021_2        9      P8_Het_SCN_S1A
## iprgc_90                        NA     021_2        7      P8_Het_Ret_S1A
## iprgc_91                        NA     021_2        1       P8_WT_Ret_S1A
## iprgc_92                        NA     021_2        2      P8_WT_dLGN_S1A
## iprgc_93                        NA     021_2        3       P8_WT_SCN_S1A
## iprgc_94                        NA     021_2       20    P15_Het_dLGN_S1B
## iprgc_95                        NA     021_2       21     P15_Het_SCN_S1B
## iprgc_96                        NA     021_2       19     P15_Het_Ret_S1B
## iprgc_97                        NA     021_2        6      P15_WT_SCN_S1A
## iprgc_98                        NA     021_2        5     P15_WT_dLGN_S1A
## iprgc_99                        NA     021_2        4      P15_WT_Ret_S1A
## iprgc_100                       NA     021_2       17     P15_KO_dLGN_S1A
## iprgc_101                       NA     021_2       16      P15_KO_Ret_S1A
## iprgc_102                       NA     021_2       18      P15_KO_SCN_S1A
## iprgc_104                       NA     021_3      13b      P8_Het_dLGN_S2
## iprgc_105                       NA     021_3      14b      P8_Het_dLGN_S3
## iprgc_106                       NA     021_3      15b     P15_Het_dLGN_S2
## iprgc_107                       NA     021_3       16       P8_KO_dLGN_S2
## iprgc_108                       NA     021_3       18      P15_KO_dLGN_S2
## iprgc_109                       NA     021_3       1b        P8_WT_Ret_S2
## iprgc_110                       NA     021_3      22b       P8_Het_SCN_S2
## iprgc_111                       NA     021_3      23b       P8_Het_SCN_S3
## iprgc_112                       NA     021_3      24b      P15_Het_SCN_S2
## iprgc_113                       NA     021_3       25        P8_KO_SCN_S2
## iprgc_114                       NA     021_3       27       P15_KO_SCN_S2
## iprgc_115                       NA     021_3       2b        P8_WT_Ret_S3
## iprgc_116                       NA     021_3       3b       P15_WT_Ret_S3
## iprgc_117                       NA     021_3       4b       P8_Het_Ret_S2
## iprgc_118                       NA     021_3        5       P8_Het_Ret_S3
## iprgc_119                       NA     021_3       6b      P15_Het_Ret_S2
## iprgc_120                       NA     021_3        7        P8_KO_Ret_S2
## iprgc_121                       NA     021_3        8        P8_KO_Ret_S3
## iprgc_122                       NA     021_3        9       P15_KO_Ret_S2
## iprgc_123                       NA     021_3       17       P8_KO_dLGN_S3
## iprgc_124                       NA     021_3       26        P8_KO_SCN_S3
## iprgc_125                       NA     021_3      10c       P8_WT_dLGN_S2
## iprgc_126                       NA     021_3      11c       P8_WT_dLGN_S3
## iprgc_127                       NA     021_3      12b      P15_WT_dLGN_S3
## iprgc_128                       NA     021_3      19c        P8_WT_SCN_S2
## iprgc_129                       NA     021_3      20c        P8_WT_SCN_S3
## iprgc_130                       NA     021_3      21b       P15_WT_SCN_S3
##           libraryprepcleanupah                         sequencingrunah
## iprgc_62            successful             220517_VL00136_33_AAC23JWM5
## iprgc_63            successful             220517_VL00136_33_AAC23JWM5
## iprgc_64            successful             220517_VL00136_33_AAC23JWM5
## iprgc_65            successful             220517_VL00136_33_AAC23JWM5
## iprgc_66            successful             220517_VL00136_33_AAC23JWM5
## iprgc_67            successful             220517_VL00136_33_AAC23JWM5
## iprgc_68            successful             220517_VL00136_33_AAC23JWM5
## iprgc_69            successful             220517_VL00136_33_AAC23JWM5
## iprgc_70            successful             220517_VL00136_33_AAC23JWM5
## iprgc_71            successful             220517_VL00136_33_AAC23JWM5
## iprgc_72            successful             220517_VL00136_33_AAC23JWM5
## iprgc_73            successful             220517_VL00136_33_AAC23JWM5
## iprgc_74            successful             220517_VL00136_33_AAC23JWM5
## iprgc_75            successful             220517_VL00136_33_AAC23JWM5
## iprgc_76            successful             220517_VL00136_33_AAC23JWM5
## iprgc_77            successful             220517_VL00136_33_AAC23JWM5
## iprgc_81            successful             220517_VL00136_33_AAC23JWM5
## iprgc_82            successful             220517_VL00136_33_AAC23JWM5
## iprgc_83            successful             220517_VL00136_33_AAC23JWM5
## iprgc_84            successful             220517_VL00136_33_AAC23JWM5
## iprgc_85            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_86            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_87            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_88            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_89            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_90            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_91            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_92            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_93            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_94            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_95            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_96            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_97            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_98            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_99            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_100           successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_101           successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_102           successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_104           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_105           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_106           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_107           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_108           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_109           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_110           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_111           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_112           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_113           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_114           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_115           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_116           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_117           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_118           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_119           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_120           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_121           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_122           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_123           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
## iprgc_124           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_125           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_126           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
## iprgc_127           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
## iprgc_128           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
## iprgc_129           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
## iprgc_130           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
##                                             read1ah
## iprgc_62       P15_Het_dLGN_S1A_S16_R1_001.fastq.gz
## iprgc_63       P15_Het_dLGN_S2A_S17_R1_001.fastq.gz
## iprgc_64         P15_Het_Ret_S1A_S7_R1_001.fastq.gz
## iprgc_65         P15_Het_Ret_S2A_S8_R1_001.fastq.gz
## iprgc_66        P15_Het_SCN_S1A_S21_R1_001.fastq.gz
## iprgc_67        P15_Het_SCN_S2A_S22_R1_001.fastq.gz
## iprgc_68        P15_KO_dLGN_S1A_S18_R1_001.fastq.gz
## iprgc_69          P15_KO_Ret_S1A_S9_R1_001.fastq.gz
## iprgc_70         P15_KO_SCN_S1A_S23_R1_001.fastq.gz
## iprgc_71        P15_WT_dLGN_S1A_S12_R1_001.fastq.gz
## iprgc_72        P15_WT_dLGN_S2A_S13_R1_001.fastq.gz
## iprgc_73        P15_WT_dLGN_S3A_S14_R1_001.fastq.gz
## iprgc_74          P15_WT_Ret_S1A_S3_R1_001.fastq.gz
## iprgc_75          P15_WT_Ret_S2A_S4_R1_001.fastq.gz
## iprgc_76          P15_WT_Ret_S3A_S5_R1_001.fastq.gz
## iprgc_77         P15_WT_SCN_S3A_S19_R1_001.fastq.gz
## iprgc_81         P8_WT_dLGN_S1A_S10_R1_001.fastq.gz
## iprgc_82         P8_WT_dLGN_S2A_S11_R1_001.fastq.gz
## iprgc_83           P8_WT_Ret_S1A_S1_R1_001.fastq.gz
## iprgc_84           P8_WT_Ret_S2A_S2_R1_001.fastq.gz
## iprgc_85     P8_KO_SCN_S1A_S12_L001_R1_001.fastq.gz
## iprgc_86     P8_KO_Ret_S1A_S10_L001_R1_001.fastq.gz
## iprgc_87    P8_KO_dLGN_S1A_S11_L001_R1_001.fastq.gz
## iprgc_88    P8_Het_dLGN_S1A_S8_L001_R1_001.fastq.gz
## iprgc_89     P8_Het_SCN_S1A_S9_L001_R1_001.fastq.gz
## iprgc_90     P8_Het_Ret_S1A_S7_L001_R1_001.fastq.gz
## iprgc_91      P8_WT_Ret_S1A_S1_L001_R1_001.fastq.gz
## iprgc_92     P8_WT_dLGN_S1A_S2_L001_R1_001.fastq.gz
## iprgc_93      P8_WT_SCN_S1A_S3_L001_R1_001.fastq.gz
## iprgc_94  P15_Het_dLGN_S1B_S17_L001_R1_001.fastq.gz
## iprgc_95   P15_Het_SCN_S1B_S18_L001_R1_001.fastq.gz
## iprgc_96   P15_Het_Ret_S1B_S16_L001_R1_001.fastq.gz
## iprgc_97     P15_WT_SCN_S1A_S6_L001_R1_001.fastq.gz
## iprgc_98    P15_WT_dLGN_S1A_S5_L001_R1_001.fastq.gz
## iprgc_99     P15_WT_Ret_S1A_S4_L001_R1_001.fastq.gz
## iprgc_100  P15_KO_dLGN_S1A_S14_L001_R1_001.fastq.gz
## iprgc_101   P15_KO_Ret_S1A_S13_L001_R1_001.fastq.gz
## iprgc_102   P15_KO_SCN_S1A_S15_L001_R1_001.fastq.gz
## iprgc_104     13b_P8_Het_dLGN_S2_S6_R1_001.fastq.gz
## iprgc_105     14b_P8_Het_dLGN_S3_S7_R1_001.fastq.gz
## iprgc_106    15b_P15_Het_dLGN_S2_S8_R1_001.fastq.gz
## iprgc_107       16_P8_KO_dLGN_S2_S9_R1_001.fastq.gz
## iprgc_108     18_P15_KO_dLGN_S2_S10_R1_001.fastq.gz
## iprgc_109       1b_P8_WT_Ret_S2_S16_R1_001.fastq.gz
## iprgc_110     22b_P8_Het_SCN_S2_S11_R1_001.fastq.gz
## iprgc_111     23b_P8_Het_SCN_S3_S12_R1_001.fastq.gz
## iprgc_112    24b_P15_Het_SCN_S2_S13_R1_001.fastq.gz
## iprgc_113       25_P8_KO_SCN_S2_S14_R1_001.fastq.gz
## iprgc_114      27_P15_KO_SCN_S2_S15_R1_001.fastq.gz
## iprgc_115       2b_P8_WT_Ret_S3_S17_R1_001.fastq.gz
## iprgc_116      3b_P15_WT_Ret_S3_S18_R1_001.fastq.gz
## iprgc_117       4b_P8_Het_Ret_S2_S1_R1_001.fastq.gz
## iprgc_118        5_P8_Het_Ret_S3_S2_R1_001.fastq.gz
## iprgc_119      6b_P15_Het_Ret_S2_S3_R1_001.fastq.gz
## iprgc_120         7_P8_KO_Ret_S2_S4_R1_001.fastq.gz
## iprgc_121        8_P8_KO_Ret_S3_S19_R1_001.fastq.gz
## iprgc_122        9_P15_KO_Ret_S2_S5_R1_001.fastq.gz
## iprgc_123       17_P8_KO_dLGN_S3_S3_R1_001.fastq.gz
## iprgc_124        26_P8_KO_SCN_S3_S7_R1_001.fastq.gz
## iprgc_125     10c_P8_WT_dLGN_S2_S20_R1_001.fastq.gz
## iprgc_126      11c_P8_WT_dLGN_S3_S1_R1_001.fastq.gz
## iprgc_127     12b_P15_WT_dLGN_S3_S2_R1_001.fastq.gz
## iprgc_128       19c_P8_WT_SCN_S2_S4_R1_001.fastq.gz
## iprgc_129       20c_P8_WT_SCN_S3_S5_R1_001.fastq.gz
## iprgc_130      21b_P15_WT_SCN_S3_S6_R1_001.fastq.gz
##                                             read2ah       downloadmapagain
## iprgc_62       P15_Het_dLGN_S1A_S16_R2_001.fastq.gz                   <NA>
## iprgc_63       P15_Het_dLGN_S2A_S17_R2_001.fastq.gz                   <NA>
## iprgc_64         P15_Het_Ret_S1A_S7_R2_001.fastq.gz                   <NA>
## iprgc_65         P15_Het_Ret_S2A_S8_R2_001.fastq.gz                   <NA>
## iprgc_66        P15_Het_SCN_S1A_S21_R2_001.fastq.gz                   <NA>
## iprgc_67        P15_Het_SCN_S2A_S22_R2_001.fastq.gz                   <NA>
## iprgc_68        P15_KO_dLGN_S1A_S18_R2_001.fastq.gz                   <NA>
## iprgc_69          P15_KO_Ret_S1A_S9_R2_001.fastq.gz                   <NA>
## iprgc_70         P15_KO_SCN_S1A_S23_R2_001.fastq.gz                   <NA>
## iprgc_71        P15_WT_dLGN_S1A_S12_R2_001.fastq.gz                   <NA>
## iprgc_72        P15_WT_dLGN_S2A_S13_R2_001.fastq.gz                   <NA>
## iprgc_73        P15_WT_dLGN_S3A_S14_R2_001.fastq.gz                   <NA>
## iprgc_74          P15_WT_Ret_S1A_S3_R2_001.fastq.gz                   <NA>
## iprgc_75          P15_WT_Ret_S2A_S4_R2_001.fastq.gz                   <NA>
## iprgc_76          P15_WT_Ret_S3A_S5_R2_001.fastq.gz                   <NA>
## iprgc_77         P15_WT_SCN_S3A_S19_R2_001.fastq.gz                   <NA>
## iprgc_81         P8_WT_dLGN_S1A_S10_R2_001.fastq.gz                   <NA>
## iprgc_82         P8_WT_dLGN_S2A_S11_R2_001.fastq.gz                   <NA>
## iprgc_83           P8_WT_Ret_S1A_S1_R2_001.fastq.gz                   <NA>
## iprgc_84           P8_WT_Ret_S2A_S2_R2_001.fastq.gz                   <NA>
## iprgc_85     P8_KO_SCN_S1A_S12_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_86     P8_KO_Ret_S1A_S10_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_87    P8_KO_dLGN_S1A_S11_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_88    P8_Het_dLGN_S1A_S8_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_89     P8_Het_SCN_S1A_S9_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_90     P8_Het_Ret_S1A_S7_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_91      P8_WT_Ret_S1A_S1_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_92     P8_WT_dLGN_S1A_S2_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_93      P8_WT_SCN_S1A_S3_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_94  P15_Het_dLGN_S1B_S17_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_95   P15_Het_SCN_S1B_S18_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_96   P15_Het_Ret_S1B_S16_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_97     P15_WT_SCN_S1A_S6_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_98    P15_WT_dLGN_S1A_S5_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_99     P15_WT_Ret_S1A_S4_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_100  P15_KO_dLGN_S1A_S14_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_101   P15_KO_Ret_S1A_S13_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_102   P15_KO_SCN_S1A_S15_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_104     13b_P8_Het_dLGN_S2_S6_R2_001.fastq.gz                   <NA>
## iprgc_105     14b_P8_Het_dLGN_S3_S7_R2_001.fastq.gz                   <NA>
## iprgc_106    15b_P15_Het_dLGN_S2_S8_R2_001.fastq.gz                   <NA>
## iprgc_107       16_P8_KO_dLGN_S2_S9_R2_001.fastq.gz                   <NA>
## iprgc_108     18_P15_KO_dLGN_S2_S10_R2_001.fastq.gz                   <NA>
## iprgc_109       1b_P8_WT_Ret_S2_S16_R2_001.fastq.gz                   <NA>
## iprgc_110     22b_P8_Het_SCN_S2_S11_R2_001.fastq.gz                   <NA>
## iprgc_111     23b_P8_Het_SCN_S3_S12_R2_001.fastq.gz                   <NA>
## iprgc_112    24b_P15_Het_SCN_S2_S13_R2_001.fastq.gz                   <NA>
## iprgc_113       25_P8_KO_SCN_S2_S14_R2_001.fastq.gz                   <NA>
## iprgc_114      27_P15_KO_SCN_S2_S15_R2_001.fastq.gz                   <NA>
## iprgc_115       2b_P8_WT_Ret_S3_S17_R2_001.fastq.gz                   <NA>
## iprgc_116      3b_P15_WT_Ret_S3_S18_R2_001.fastq.gz                   <NA>
## iprgc_117       4b_P8_Het_Ret_S2_S1_R2_001.fastq.gz                   <NA>
## iprgc_118        5_P8_Het_Ret_S3_S2_R2_001.fastq.gz                   <NA>
## iprgc_119      6b_P15_Het_Ret_S2_S3_R2_001.fastq.gz                   <NA>
## iprgc_120         7_P8_KO_Ret_S2_S4_R2_001.fastq.gz                   <NA>
## iprgc_121        8_P8_KO_Ret_S3_S19_R2_001.fastq.gz                   <NA>
## iprgc_122        9_P15_KO_Ret_S2_S5_R2_001.fastq.gz                   <NA>
## iprgc_123       17_P8_KO_dLGN_S3_S3_R2_001.fastq.gz                   <NA>
## iprgc_124        26_P8_KO_SCN_S3_S7_R2_001.fastq.gz                   <NA>
## iprgc_125     10c_P8_WT_dLGN_S2_S20_R2_001.fastq.gz yes, same file renamed
## iprgc_126      11c_P8_WT_dLGN_S3_S1_R2_001.fastq.gz yes, same file renamed
## iprgc_127     12b_P15_WT_dLGN_S3_S2_R2_001.fastq.gz                   <NA>
## iprgc_128       19c_P8_WT_SCN_S2_S4_R2_001.fastq.gz yes, same file renamed
## iprgc_129       20c_P8_WT_SCN_S3_S5_R2_001.fastq.gz yes, same file renamed
## iprgc_130      21b_P15_WT_SCN_S3_S6_R2_001.fastq.gz yes, same file renamed
##           genotype_atb location_atb time_atb geno_loc_atb
## iprgc_62           het         dlgn      p15     het_dlgn
## iprgc_63           het         dlgn      p15     het_dlgn
## iprgc_64           het       retina      p15   het_retina
## iprgc_65           het       retina      p15   het_retina
## iprgc_66           het          scn      p15      het_scn
## iprgc_67           het          scn      p15      het_scn
## iprgc_68            ko         dlgn      p15      ko_dlgn
## iprgc_69            ko       retina      p15    ko_retina
## iprgc_70            ko          scn      p15       ko_scn
## iprgc_71            wt         dlgn      p15      wt_dlgn
## iprgc_72            wt         dlgn      p15      wt_dlgn
## iprgc_73            wt         dlgn      p15      wt_dlgn
## iprgc_74            wt       retina      p15    wt_retina
## iprgc_75            wt       retina      p15    wt_retina
## iprgc_76            wt       retina      p15    wt_retina
## iprgc_77            wt          scn      p15       wt_scn
## iprgc_81            wt         dlgn      p08      wt_dlgn
## iprgc_82            wt         dlgn      p08      wt_dlgn
## iprgc_83            wt       retina      p08    wt_retina
## iprgc_84            wt       retina      p08    wt_retina
## iprgc_85            ko          scn      p08       ko_scn
## iprgc_86            ko       retina      p08    ko_retina
## iprgc_87            ko         dlgn      p08      ko_dlgn
## iprgc_88           het         dlgn      p08     het_dlgn
## iprgc_89           het          scn      p08      het_scn
## iprgc_90           het       retina      p08   het_retina
## iprgc_91            wt       retina      p08    wt_retina
## iprgc_92            wt         dlgn      p08      wt_dlgn
## iprgc_93            wt          scn      p08       wt_scn
## iprgc_94           het         dlgn      p15     het_dlgn
## iprgc_95           het          scn      p15      het_scn
## iprgc_96           het       retina      p15   het_retina
## iprgc_97            wt          scn      p15       wt_scn
## iprgc_98            wt         dlgn      p15      wt_dlgn
## iprgc_99            wt       retina      p15    wt_retina
## iprgc_100           ko         dlgn      p15      ko_dlgn
## iprgc_101           ko       retina      p15    ko_retina
## iprgc_102           ko          scn      p15       ko_scn
## iprgc_104          het         dlgn      p08     het_dlgn
## iprgc_105          het         dlgn      p08     het_dlgn
## iprgc_106          het         dlgn      p15     het_dlgn
## iprgc_107           ko         dlgn      p08      ko_dlgn
## iprgc_108           ko         dlgn      p15      ko_dlgn
## iprgc_109           wt       retina      p08    wt_retina
## iprgc_110          het          scn      p08      het_scn
## iprgc_111          het          scn      p08      het_scn
## iprgc_112          het          scn      p15      het_scn
## iprgc_113           ko          scn      p08       ko_scn
## iprgc_114           ko          scn      p15       ko_scn
## iprgc_115           wt       retina      p08    wt_retina
## iprgc_116           wt       retina      p15    wt_retina
## iprgc_117          het       retina      p08   het_retina
## iprgc_118          het       retina      p08   het_retina
## iprgc_119          het       retina      p15   het_retina
## iprgc_120           ko       retina      p08    ko_retina
## iprgc_121           ko       retina      p08    ko_retina
## iprgc_122           ko       retina      p15    ko_retina
## iprgc_123           ko         dlgn      p08      ko_dlgn
## iprgc_124           ko          scn      p08       ko_scn
## iprgc_125           wt         dlgn      p08      wt_dlgn
## iprgc_126           wt         dlgn      p08      wt_dlgn
## iprgc_127           wt         dlgn      p15      wt_dlgn
## iprgc_128           wt          scn      p08       wt_scn
## iprgc_129           wt          scn      p08       wt_scn
## iprgc_130           wt          scn      p15       wt_scn
##           time_geno_location_source_atb rashmi_code atb_observed_location
## iprgc_62                    AH filename         S1A                  dlgn
## iprgc_63                    AH filename         S2A                  dlgn
## iprgc_64                    AH filename         S1A                retina
## iprgc_65                    AH filename         S2A                retina
## iprgc_66                    AH filename         S1A                  dlgn
## iprgc_67                    AH filename         S2A                   scn
## iprgc_68                    AH filename         S1A                  dlgn
## iprgc_69                    AH filename         S1A                retina
## iprgc_70                    AH filename         S1A                   scn
## iprgc_71                    AH filename         S1A                  dlgn
## iprgc_72                    AH filename         S2A                  dlgn
## iprgc_73                    AH filename         S3A                  dlgn
## iprgc_74                    AH filename         S1A                retina
## iprgc_75                    AH filename         S2A                retina
## iprgc_76                    AH filename         S3A                retina
## iprgc_77                    AH filename         S3A                   scn
## iprgc_81                    AH filename         S1A                  dlgn
## iprgc_82                    AH filename         S2A                  dlgn
## iprgc_83                    AH filename         S1A                retina
## iprgc_84                    AH filename         S2A                retina
## iprgc_85                    AH filename         S1A                   scn
## iprgc_86                    AH filename         S1A                retina
## iprgc_87                    AH filename         S1A                  dlgn
## iprgc_88                    AH filename         S1A                  dlgn
## iprgc_89                    AH filename         S1A                   scn
## iprgc_90                    AH filename         S1A                retina
## iprgc_91                    AH filename         S1A                retina
## iprgc_92                    AH filename         S1A                  dlgn
## iprgc_93                    AH filename         S1A                   scn
## iprgc_94                    AH filename         S1B                  dlgn
## iprgc_95                    AH filename         S1B                   scn
## iprgc_96                    AH filename         S1B                retina
## iprgc_97                    AH filename         S1A                   scn
## iprgc_98                    AH filename         S1A                  dlgn
## iprgc_99                    AH filename         S1A                retina
## iprgc_100                   AH filename         S1A                  dlgn
## iprgc_101                   AH filename         S1A                retina
## iprgc_102                   AH filename         S1A                   scn
## iprgc_104                   AH filename          S2                  dlgn
## iprgc_105                   AH filename          S3                  dlgn
## iprgc_106                   AH filename          S2                  dlgn
## iprgc_107                   AH filename          S2                  dlgn
## iprgc_108                   AH filename          S2                  dlgn
## iprgc_109                   AH filename          S2                retina
## iprgc_110                   AH filename          S2                   scn
## iprgc_111                   AH filename          S3                   scn
## iprgc_112                   AH filename          S2                   scn
## iprgc_113                   AH filename          S2                   scn
## iprgc_114                   AH filename          S2                   scn
## iprgc_115                   AH filename          S3                retina
## iprgc_116                   AH filename          S3                retina
## iprgc_117                   AH filename          S2                retina
## iprgc_118                   AH filename          S3                retina
## iprgc_119                   AH filename          S2                retina
## iprgc_120                   AH filename          S2                retina
## iprgc_121                   AH filename          S3                retina
## iprgc_122                   AH filename          S2                retina
## iprgc_123                   AH filename          S3                  dlgn
## iprgc_124                   AH filename          S3                   scn
## iprgc_125                   AH filename          S2                  dlgn
## iprgc_126                   AH filename          S3                  dlgn
## iprgc_127                   AH filename          S3                  dlgn
## iprgc_128                   AH filename          S2                   scn
## iprgc_129                   AH filename          S3                   scn
## iprgc_130                   AH filename          S3                  dlgn
##           hisat_rrna_input_reads hisat_rrna_single_concordant
## iprgc_62                21454044                      1494615
## iprgc_63                15326358                      1079397
## iprgc_64                18003256                       942929
## iprgc_65                20929623                      1195387
## iprgc_66                15724842                      1018281
## iprgc_67                15456881                      1000025
## iprgc_68                19666257                      1628156
## iprgc_69                16552894                       218644
## iprgc_70                13740575                       700257
## iprgc_71                15525499                      1082720
## iprgc_72                17094474                      1425296
## iprgc_73                15794837                      1285122
## iprgc_74                15775224                       790535
## iprgc_75                16328183                       877539
## iprgc_76                24180028                      1385985
## iprgc_77                17538867                      1050779
## iprgc_81                16532098                       940095
## iprgc_82                15878311                       796807
## iprgc_83                16082507                       868003
## iprgc_84                15958920                      1050174
## iprgc_85                23680086                      1148981
## iprgc_86                20389649                       361882
## iprgc_87                27526146                       540391
## iprgc_88                29895877                      1190844
## iprgc_89                23361256                       920771
## iprgc_90                31543306                       435071
## iprgc_91                15758794                       209248
## iprgc_92                22313362                      1157698
## iprgc_93                20934807                      1036076
## iprgc_94                28090789                       532208
## iprgc_95                23462476                      1217287
## iprgc_96                14804663                       466300
## iprgc_97                22863130                       904924
## iprgc_98                19915507                       557667
## iprgc_99                14724866                       175966
## iprgc_100               32782165                       542666
## iprgc_101               15390215                       203176
## iprgc_102               28578632                       857116
## iprgc_104               30192805                      1038732
## iprgc_105               24528770                       523240
## iprgc_106               30802656                       390802
## iprgc_107               42462593                       642551
## iprgc_108               28855525                       290520
## iprgc_109               21695810                       338445
## iprgc_110               22927463                      1066764
## iprgc_111               18467297                       412625
## iprgc_112               19036600                       728033
## iprgc_113               27601259                      1056238
## iprgc_114               18638104                       583967
## iprgc_115               17237384                       375309
## iprgc_116               17447459                       353770
## iprgc_117               17248353                       341716
## iprgc_118               21315056                       288212
## iprgc_119               14188002                       228078
## iprgc_120               31820880                       472691
## iprgc_121               27191863                       569880
## iprgc_122               19422096                       531934
## iprgc_123               40849547                      1075990
## iprgc_124               36378912                      1062383
## iprgc_125               16749234                       416587
## iprgc_126               22769305                       832691
## iprgc_127               23091824                      1023687
## iprgc_128               18824955                       582920
## iprgc_129               22427478                       844116
## iprgc_130               22042940                      1111589
##           hisat_rrna_multi_concordant hisat_rrna_percent_log
## iprgc_62                       170903                   9.87
## iprgc_63                       182361                  10.21
## iprgc_64                        72737                   7.10
## iprgc_65                        58167                   7.67
## iprgc_66                        87419                   8.54
## iprgc_67                       108729                   8.15
## iprgc_68                       207235                  12.00
## iprgc_69                         9877                   1.70
## iprgc_70                        63502                   7.06
## iprgc_71                       152436                   8.98
## iprgc_72                       246982                  11.13
## iprgc_73                       112863                  10.09
## iprgc_74                       165241                   6.98
## iprgc_75                        96091                   7.52
## iprgc_76                       199842                   7.78
## iprgc_77                        62228                   8.34
## iprgc_81                        77689                   7.16
## iprgc_82                       135429                   6.84
## iprgc_83                        80352                   6.40
## iprgc_84                       123392                   8.46
## iprgc_85                        28569                   5.28
## iprgc_86                        13164                   2.05
## iprgc_87                        18367                   2.34
## iprgc_88                        61380                   4.59
## iprgc_89                        54031                   4.54
## iprgc_90                        13601                   1.60
## iprgc_91                         7450                   1.52
## iprgc_92                        20834                   5.61
## iprgc_93                        29031                   5.39
## iprgc_94                        16914                   2.29
## iprgc_95                        22019                   5.58
## iprgc_96                         5493                   3.70
## iprgc_97                         8510                   4.24
## iprgc_98                        25539                   3.24
## iprgc_99                         6598                   1.34
## iprgc_100                       13043                   1.94
## iprgc_101                        3309                   1.47
## iprgc_102                       11792                   3.22
## iprgc_104                       64300                   3.96
## iprgc_105                       27174                   2.46
## iprgc_106                       12427                   1.45
## iprgc_107                       30617                   1.83
## iprgc_108                       16803                   1.22
## iprgc_109                       32087                   1.92
## iprgc_110                       20754                   5.02
## iprgc_111                        8062                   2.43
## iprgc_112                        7478                   4.01
## iprgc_113                       62800                   4.36
## iprgc_114                       11141                   3.34
## iprgc_115                       30362                   2.60
## iprgc_116                       17307                   2.28
## iprgc_117                       10292                   2.18
## iprgc_118                        7457                   1.51
## iprgc_119                        6462                   1.75
## iprgc_120                       25071                   1.74
## iprgc_121                       48212                   2.58
## iprgc_122                       17048                   2.97
## iprgc_123                       86504                   3.33
## iprgc_124                       41027                   3.35
## iprgc_125                       21674                   2.79
## iprgc_126                       50917                   4.12
## iprgc_127                       38479                   4.85
## iprgc_128                       15517                   3.37
## iprgc_129                       37915                   4.18
## iprgc_130                       12690                   5.26
##           hisat_genome_input_reads hisat_genome_single_concordant
## iprgc_62                  21454044                        6916109
## iprgc_63                  15326358                        4800437
## iprgc_64                  18003256                       10070534
## iprgc_65                  20929623                       11589175
## iprgc_66                  15724842                        7255738
## iprgc_67                  15456881                        6852704
## iprgc_68                  19666257                        6195592
## iprgc_69                  16552894                       12430776
## iprgc_70                  13740575                        4854312
## iprgc_71                  15525499                        6307451
## iprgc_72                  17094474                        7451652
## iprgc_73                  15794837                        6837350
## iprgc_74                  15775224                       10294290
## iprgc_75                  16328183                       10436993
## iprgc_76                  24180028                       16183985
## iprgc_77                  17538867                        5292791
## iprgc_81                  16532098                        7331009
## iprgc_82                  15878311                        7230838
## iprgc_83                  16082507                       10368657
## iprgc_84                  15958920                       10423523
## iprgc_85                  23680086                        7062000
## iprgc_86                  20389649                        9744114
## iprgc_87                  27526146                        6400394
## iprgc_88                  29895877                        7820843
## iprgc_89                  23361256                        9311252
## iprgc_90                  31543306                       15756309
## iprgc_91                  15758794                        9961930
## iprgc_92                  22313362                        8488862
## iprgc_93                  20934807                        7567968
## iprgc_94                  28090789                        7057050
## iprgc_95                  23462476                        7263554
## iprgc_96                  14804663                        7876687
## iprgc_97                  22863130                        9533254
## iprgc_98                  19915507                        9711144
## iprgc_99                  14724866                       11249606
## iprgc_100                 32782165                       10087273
## iprgc_101                 15390215                        9017104
## iprgc_102                 28578632                       13515552
## iprgc_104                 30192805                        9350995
## iprgc_105                 24528770                       10945760
## iprgc_106                 30802656                       11899403
## iprgc_107                 42462593                        8808064
## iprgc_108                 28855525                       11980044
## iprgc_109                 21695810                       14589076
## iprgc_110                 22927463                        9892455
## iprgc_111                 18467297                       12034265
## iprgc_112                 19036600                       13305746
## iprgc_113                 27601259                       10183581
## iprgc_114                 18638104                       12163422
## iprgc_115                 17237384                       11843723
## iprgc_116                 17447459                       13256126
## iprgc_117                 17248353                       11047279
## iprgc_118                 21315056                       12744260
## iprgc_119                 14188002                       10134357
## iprgc_120                 31820880                       15877669
## iprgc_121                 27191863                       13093932
## iprgc_122                 19422096                       14110700
## iprgc_123                 40849547                        8776567
## iprgc_124                 36378912                        9684862
## iprgc_125                 16749234                       11928896
## iprgc_126                 22769305                       12094389
## iprgc_127                 23091824                       13279963
## iprgc_128                 18824955                       11728805
## iprgc_129                 22427478                       12119656
## iprgc_130                 22042940                       14594293
##           hisat_genome_multi_concordant hisat_genome_single_all
## iprgc_62                        2449957                 2717057
## iprgc_63                        1878557                 1916047
## iprgc_64                        1696641                 1839841
## iprgc_65                        1959086                 1724647
## iprgc_66                        1845802                 1896292
## iprgc_67                        1833302                 1796579
## iprgc_68                        2199833                 2603068
## iprgc_69                        1371549                  740962
## iprgc_70                        1398244                 1487798
## iprgc_71                        2081493                 1848749
## iprgc_72                        2373441                 1919972
## iprgc_73                        2140999                 2007277
## iprgc_74                        1585605                 1563688
## iprgc_75                        1752174                 1352026
## iprgc_76                        2802437                 1652868
## iprgc_77                        1574651                 1485198
## iprgc_81                        1957318                 1652547
## iprgc_82                        1695064                 1278480
## iprgc_83                        3550991                  787207
## iprgc_84                        2716482                 1016602
## iprgc_85                        3070475                 4982006
## iprgc_86                        1584336                 3504856
## iprgc_87                        2702903                 6643829
## iprgc_88                        3571442                 6566202
## iprgc_89                        2670299                 4268199
## iprgc_90                        2185011                 5130035
## iprgc_91                        1031455                 1952703
## iprgc_92                        2227319                 4338434
## iprgc_93                        1902893                 4066044
## iprgc_94                        2253262                 6394602
## iprgc_95                        2462976                 4802887
## iprgc_96                        1124034                 2018582
## iprgc_97                        2106698                 4168566
## iprgc_98                        1646039                 2939674
## iprgc_99                         899864                 1039173
## iprgc_100                       2458941                 7583206
## iprgc_101                       1046189                 2151316
## iprgc_102                       2414831                 4844907
## iprgc_104                       3576922                 5498302
## iprgc_105                       2247030                 3714870
## iprgc_106                       1745274                 5678135
## iprgc_107                       3664704                10968566
## iprgc_108                       1538013                 5173396
## iprgc_109                       1554923                 2161895
## iprgc_110                       3310736                 3360928
## iprgc_111                       1363554                 1699645
## iprgc_112                       1364323                 1664098
## iprgc_113                       3780807                 4894243
## iprgc_114                       1218954                 2151331
## iprgc_115                       1353297                 1746660
## iprgc_116                       1179429                 1301001
## iprgc_117                       1171597                 2019548
## iprgc_118                       1398283                 2821889
## iprgc_119                        912577                 1254331
## iprgc_120                       2367026                 5029094
## iprgc_121                       2162058                 4353717
## iprgc_122                       1539523                 1540853
## iprgc_123                       4981110                 9526129
## iprgc_124                       4238972                 7831340
## iprgc_125                       1177569                 1438407
## iprgc_126                       2401918                 2989185
## iprgc_127                       2143572                 2771095
## iprgc_128                       1564536                 2333679
## iprgc_129                       2145404                 3144006
## iprgc_130                       1763157                 2278675
##           hisat_genome_multi_all hisat_unmapped hisat_genome_percent_log
## iprgc_62                 1394098       19607017                    54.30
## iprgc_63                  746537       14321178                    53.28
## iprgc_64                  757797        9447512                    73.76
## iprgc_65                  757000       11613547                    72.26
## iprgc_66                  509637       10520805                    66.55
## iprgc_67                  543814       10918707                    64.68
## iprgc_68                 1201766       18303482                    53.46
## iprgc_69                  185889        4062569                    87.73
## iprgc_70                  534908       12784616                    53.48
## iprgc_71                  483274       11748901                    62.16
## iprgc_72                  553598       11797040                    65.49
## iprgc_73                  407155       10978062                    65.25
## iprgc_74                  262180        5732790                    81.83
## iprgc_75                  377197        6140625                    81.20
## iprgc_76                  466627        7631325                    84.22
## iprgc_77                  738105       18898549                    46.12
## iprgc_81                  492616       12118069                    63.35
## iprgc_82                  289604       12077676                    61.97
## iprgc_83                  189640        3076315                    90.44
## iprgc_84                  303614        3896608                    87.79
## iprgc_85                 1452554       20424824                    56.87
## iprgc_86                 1495480       12892866                    68.38
## iprgc_87                 3090288       26937105                    51.07
## iprgc_88                 1484386       28707206                    51.99
## iprgc_89                 1227818       16934959                    63.75
## iprgc_90                 2221900       19522087                    69.06
## iprgc_91                  744446        6646337                    78.91
## iprgc_92                 1322029       17243053                    61.36
## iprgc_93                 1072098       17570892                    58.03
## iprgc_94                 3295727       27633663                    50.81
## iprgc_95                 1795153       20635750                    56.02
## iprgc_96                  819084        8565090                    71.07
## iprgc_97                 1328912       16588598                    63.72
## iprgc_98                 1353214       12425164                    68.81
## iprgc_99                  379443        3528780                    88.02
## iprgc_100                3726501       28740151                    56.16
## iprgc_101                 920696        7309862                    76.25
## iprgc_102                1526237       18438092                    67.74
## iprgc_104                1246712       27517898                    54.43
## iprgc_105                 841851       17902417                    63.51
## iprgc_106                2197041       26013024                    57.77
## iprgc_107                3760329       44980319                    47.04
## iprgc_108                2337996       22667018                    60.72
## iprgc_109                 610868        8110837                    81.31
## iprgc_110                 646097       15094237                    67.08
## iprgc_111                 450175        7798052                    78.89
## iprgc_112                 441038        6168522                    83.80
## iprgc_113                1460623       20575232                    62.73
## iprgc_114                 559164        7287021                    80.45
## iprgc_115                 388933        5750843                    83.32
## iprgc_116                 259374        4250563                    87.82
## iprgc_117                 665641        7098103                    79.42
## iprgc_118                1118876       10002775                    76.54
## iprgc_119                 366327        4418372                    84.43
## iprgc_120                2032125       19796333                    68.89
## iprgc_121                1619685       17615938                    67.61
## iprgc_122                 447710        5066253                    86.96
## iprgc_123                3579817       40815048                    50.04
## iprgc_124                2943013       33816629                    53.52
## iprgc_125                 302868        5337939                    84.07
## iprgc_126                 490034       12800087                    71.89
## iprgc_127                 564939       11635882                    74.81
## iprgc_128                 454792        8063807                    78.58
## iprgc_129                 632287       12279337                    72.62
## iprgc_130                 416083        8386154                    80.98
##           hisat_observed_genes hisat_sum_genes hisat_observed_mean_exprs
## iprgc_62                 14545         5642632                     718.8
## iprgc_63                 13695         3717242                     514.1
## iprgc_64                 16459        12978365                     899.0
## iprgc_65                 16884        14696641                    1024.8
## iprgc_66                 15391         8272382                     695.2
## iprgc_67                 15379         7908083                     670.4
## iprgc_68                 14033         4602849                     644.5
## iprgc_69                 17008        18774803                    1039.0
## iprgc_70                 14833         5477804                     481.6
## iprgc_71                 14953         6549329                     646.0
## iprgc_72                 15339         7357963                     751.0
## iprgc_73                 15216         7125338                     687.1
## iprgc_74                 16166        15075002                     914.5
## iprgc_75                 16452        14804383                     928.4
## iprgc_76                 17086        22571664                    1450.8
## iprgc_77                 15168         5038166                     524.6
## iprgc_81                 14728         8652212                     720.5
## iprgc_82                 15629         9606265                     685.1
## iprgc_83                 15724        13230777                    1084.3
## iprgc_84                 16486        13312390                    1003.4
## iprgc_85                 15332         6910252                     788.7
## iprgc_86                 16246        14273411                     880.6
## iprgc_87                 14025         5647414                     710.5
## iprgc_88                 15103         7865435                     887.4
## iprgc_89                 16121        11611851                     928.7
## iprgc_90                 16393        23919491                    1397.2
## iprgc_91                 16378        16016160                     849.8
## iprgc_92                 15400        10312147                     834.4
## iprgc_93                 15058         8088854                     736.8
## iprgc_94                 14136         7103946                     726.9
## iprgc_95                 15275         7471948                     757.4
## iprgc_96                 16383        11278102                     691.3
## iprgc_97                 15520        12312129                     908.0
## iprgc_98                 15863        14054244                     880.6
## iprgc_99                 16831        17661585                     933.6
## iprgc_100                15389        12256388                     980.6
## iprgc_101                16561        12622526                     767.6
## iprgc_102                15612        18809254                    1247.5
## iprgc_104                15400        11375862                    1009.0
## iprgc_105                15795        16846374                    1028.5
## iprgc_106                15558        17994083                    1067.9
## iprgc_107                14636         8231918                     974.0
## iprgc_108                15633        18552934                    1057.3
## iprgc_109                16728        24270138                    1253.8
## iprgc_110                15568        13509357                    1031.5
## iprgc_111                15706        19606417                    1047.3
## iprgc_112                16153        20911855                    1147.5
## iprgc_113                15965        12217700                    1087.8
## iprgc_114                16314        19402528                    1044.1
## iprgc_115                16441        19560965                    1022.9
## iprgc_116                16929        20964695                    1113.9
## iprgc_117                16262        18276778                     953.3
## iprgc_118                16503        20885024                    1105.3
## iprgc_119                16551        16774668                     856.7
## iprgc_120                16564        24538069                    1421.8
## iprgc_121                16368        19040231                    1186.2
## iprgc_122                16794        21808522                    1216.0
## iprgc_123                14501         7015938                    1074.6
## iprgc_124                15405         8986063                    1086.5
## iprgc_125                15940        19243970                    1013.9
## iprgc_126                15122        18681748                    1134.2
## iprgc_127                16250        20184962                    1204.1
## iprgc_128                15505        18172993                    1038.3
## iprgc_129                15339        17955093                    1117.1
## iprgc_130                16058        23057879                    1277.6
##           hisat_observed_median_exprs
## iprgc_62                            3
## iprgc_63                            1
## iprgc_64                           21
## iprgc_65                           25
## iprgc_66                            7
## iprgc_67                           13
## iprgc_68                            2
## iprgc_69                           35
## iprgc_70                            8
## iprgc_71                            6
## iprgc_72                            7
## iprgc_73                            7
## iprgc_74                           23
## iprgc_75                           24
## iprgc_76                           43
## iprgc_77                            8
## iprgc_81                            9
## iprgc_82                           15
## iprgc_83                           26
## iprgc_84                           22
## iprgc_85                           12
## iprgc_86                           24
## iprgc_87                            2
## iprgc_88                            8
## iprgc_89                           17
## iprgc_90                           33
## iprgc_91                           26
## iprgc_92                           14
## iprgc_93                           13
## iprgc_94                            2
## iprgc_95                           10
## iprgc_96                           21
## iprgc_97                           18
## iprgc_98                           14
## iprgc_99                           35
## iprgc_100                           8
## iprgc_101                          23
## iprgc_102                          28
## iprgc_104                          20
## iprgc_105                          28
## iprgc_106                          13
## iprgc_107                           4
## iprgc_108                          15
## iprgc_109                          41
## iprgc_110                          22
## iprgc_111                          38
## iprgc_112                          33
## iprgc_113                          24
## iprgc_114                          27
## iprgc_115                          34
## iprgc_116                          46
## iprgc_117                          30
## iprgc_118                          38
## iprgc_119                          31
## iprgc_120                          38
## iprgc_121                          29
## iprgc_122                          44
## iprgc_123                           4
## iprgc_124                          12
## iprgc_125                          31
## iprgc_126                          30
## iprgc_127                          34
## iprgc_128                          37
## iprgc_129                          39
## iprgc_130                          37
##                                                                                                         hisat_count_table
## iprgc_62   preprocessing/umd_sequenced/iprgc_62/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_63   preprocessing/umd_sequenced/iprgc_63/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_64   preprocessing/umd_sequenced/iprgc_64/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_65   preprocessing/umd_sequenced/iprgc_65/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_66   preprocessing/umd_sequenced/iprgc_66/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_67   preprocessing/umd_sequenced/iprgc_67/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_68   preprocessing/umd_sequenced/iprgc_68/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_69   preprocessing/umd_sequenced/iprgc_69/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_70   preprocessing/umd_sequenced/iprgc_70/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_71   preprocessing/umd_sequenced/iprgc_71/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_72   preprocessing/umd_sequenced/iprgc_72/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_73   preprocessing/umd_sequenced/iprgc_73/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_74   preprocessing/umd_sequenced/iprgc_74/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_75   preprocessing/umd_sequenced/iprgc_75/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_76   preprocessing/umd_sequenced/iprgc_76/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_77   preprocessing/umd_sequenced/iprgc_77/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_81   preprocessing/umd_sequenced/iprgc_81/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_82   preprocessing/umd_sequenced/iprgc_82/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_83   preprocessing/umd_sequenced/iprgc_83/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_84   preprocessing/umd_sequenced/iprgc_84/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_85   preprocessing/umd_sequenced/iprgc_85/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_86   preprocessing/umd_sequenced/iprgc_86/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_87   preprocessing/umd_sequenced/iprgc_87/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_88   preprocessing/umd_sequenced/iprgc_88/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_89   preprocessing/umd_sequenced/iprgc_89/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_90   preprocessing/umd_sequenced/iprgc_90/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_91   preprocessing/umd_sequenced/iprgc_91/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_92   preprocessing/umd_sequenced/iprgc_92/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_93   preprocessing/umd_sequenced/iprgc_93/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_94   preprocessing/umd_sequenced/iprgc_94/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_95   preprocessing/umd_sequenced/iprgc_95/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_96   preprocessing/umd_sequenced/iprgc_96/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_97   preprocessing/umd_sequenced/iprgc_97/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_98   preprocessing/umd_sequenced/iprgc_98/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_99   preprocessing/umd_sequenced/iprgc_99/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_100 preprocessing/umd_sequenced/iprgc_100/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_101 preprocessing/umd_sequenced/iprgc_101/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_102 preprocessing/umd_sequenced/iprgc_102/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_104 preprocessing/umd_sequenced/iprgc_104/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_105 preprocessing/umd_sequenced/iprgc_105/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_106 preprocessing/umd_sequenced/iprgc_106/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_107 preprocessing/umd_sequenced/iprgc_107/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_108 preprocessing/umd_sequenced/iprgc_108/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_109 preprocessing/umd_sequenced/iprgc_109/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_110 preprocessing/umd_sequenced/iprgc_110/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_111 preprocessing/umd_sequenced/iprgc_111/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_112 preprocessing/umd_sequenced/iprgc_112/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_113 preprocessing/umd_sequenced/iprgc_113/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_114 preprocessing/umd_sequenced/iprgc_114/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_115 preprocessing/umd_sequenced/iprgc_115/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_116 preprocessing/umd_sequenced/iprgc_116/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_117 preprocessing/umd_sequenced/iprgc_117/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_118 preprocessing/umd_sequenced/iprgc_118/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_119 preprocessing/umd_sequenced/iprgc_119/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_120 preprocessing/umd_sequenced/iprgc_120/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_121 preprocessing/umd_sequenced/iprgc_121/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_122 preprocessing/umd_sequenced/iprgc_122/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_123 preprocessing/umd_sequenced/iprgc_123/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_124 preprocessing/umd_sequenced/iprgc_124/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_125 preprocessing/umd_sequenced/iprgc_125/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_126 preprocessing/umd_sequenced/iprgc_126/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_127 preprocessing/umd_sequenced/iprgc_127/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_128 preprocessing/umd_sequenced/iprgc_128/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_129 preprocessing/umd_sequenced/iprgc_129/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_130 preprocessing/umd_sequenced/iprgc_130/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
##                                                                     umi_extract_r1_output
## iprgc_62   preprocessing/umd_sequenced/iprgc_62/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_63   preprocessing/umd_sequenced/iprgc_63/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_64   preprocessing/umd_sequenced/iprgc_64/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_65   preprocessing/umd_sequenced/iprgc_65/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_66   preprocessing/umd_sequenced/iprgc_66/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_67   preprocessing/umd_sequenced/iprgc_67/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_68   preprocessing/umd_sequenced/iprgc_68/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_69   preprocessing/umd_sequenced/iprgc_69/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_70   preprocessing/umd_sequenced/iprgc_70/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_71   preprocessing/umd_sequenced/iprgc_71/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_72   preprocessing/umd_sequenced/iprgc_72/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_73   preprocessing/umd_sequenced/iprgc_73/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_74   preprocessing/umd_sequenced/iprgc_74/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_75   preprocessing/umd_sequenced/iprgc_75/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_76   preprocessing/umd_sequenced/iprgc_76/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_77   preprocessing/umd_sequenced/iprgc_77/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_81   preprocessing/umd_sequenced/iprgc_81/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_82   preprocessing/umd_sequenced/iprgc_82/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_83   preprocessing/umd_sequenced/iprgc_83/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_84   preprocessing/umd_sequenced/iprgc_84/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_85   preprocessing/umd_sequenced/iprgc_85/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_86   preprocessing/umd_sequenced/iprgc_86/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_87   preprocessing/umd_sequenced/iprgc_87/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_88   preprocessing/umd_sequenced/iprgc_88/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_89   preprocessing/umd_sequenced/iprgc_89/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_90   preprocessing/umd_sequenced/iprgc_90/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_91   preprocessing/umd_sequenced/iprgc_91/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_92   preprocessing/umd_sequenced/iprgc_92/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_93   preprocessing/umd_sequenced/iprgc_93/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_94   preprocessing/umd_sequenced/iprgc_94/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_95   preprocessing/umd_sequenced/iprgc_95/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_96   preprocessing/umd_sequenced/iprgc_96/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_97   preprocessing/umd_sequenced/iprgc_97/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_98   preprocessing/umd_sequenced/iprgc_98/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_99   preprocessing/umd_sequenced/iprgc_99/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_100 preprocessing/umd_sequenced/iprgc_100/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_101 preprocessing/umd_sequenced/iprgc_101/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_102 preprocessing/umd_sequenced/iprgc_102/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_104 preprocessing/umd_sequenced/iprgc_104/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_105 preprocessing/umd_sequenced/iprgc_105/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_106 preprocessing/umd_sequenced/iprgc_106/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_107 preprocessing/umd_sequenced/iprgc_107/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_108 preprocessing/umd_sequenced/iprgc_108/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_109 preprocessing/umd_sequenced/iprgc_109/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_110 preprocessing/umd_sequenced/iprgc_110/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_111 preprocessing/umd_sequenced/iprgc_111/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_112 preprocessing/umd_sequenced/iprgc_112/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_113 preprocessing/umd_sequenced/iprgc_113/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_114 preprocessing/umd_sequenced/iprgc_114/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_115 preprocessing/umd_sequenced/iprgc_115/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_116 preprocessing/umd_sequenced/iprgc_116/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_117 preprocessing/umd_sequenced/iprgc_117/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_118 preprocessing/umd_sequenced/iprgc_118/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_119 preprocessing/umd_sequenced/iprgc_119/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_120 preprocessing/umd_sequenced/iprgc_120/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_121 preprocessing/umd_sequenced/iprgc_121/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_122 preprocessing/umd_sequenced/iprgc_122/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_123 preprocessing/umd_sequenced/iprgc_123/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_124 preprocessing/umd_sequenced/iprgc_124/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_125 preprocessing/umd_sequenced/iprgc_125/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_126 preprocessing/umd_sequenced/iprgc_126/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_127 preprocessing/umd_sequenced/iprgc_127/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_128 preprocessing/umd_sequenced/iprgc_128/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_129 preprocessing/umd_sequenced/iprgc_129/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_130 preprocessing/umd_sequenced/iprgc_130/outputs/01umi_tools/r1_extracted.fastq.gz
##           umi_extract_matches
## iprgc_62             21454044
## iprgc_63             15326358
## iprgc_64             18003256
## iprgc_65             20929623
## iprgc_66             15724842
## iprgc_67             15456881
## iprgc_68             19666257
## iprgc_69             16552894
## iprgc_70             13740575
## iprgc_71             15525499
## iprgc_72             17094474
## iprgc_73             15794837
## iprgc_74             15775224
## iprgc_75             16328183
## iprgc_76             24180028
## iprgc_77             17538867
## iprgc_81             16532098
## iprgc_82             15878311
## iprgc_83             16082507
## iprgc_84             15958920
## iprgc_85             23680086
## iprgc_86             20389649
## iprgc_87             27526146
## iprgc_88             29895877
## iprgc_89             23361256
## iprgc_90             31543306
## iprgc_91             15758794
## iprgc_92             22313362
## iprgc_93             20934807
## iprgc_94             28090789
## iprgc_95             23462476
## iprgc_96             14804663
## iprgc_97             22863130
## iprgc_98             19915507
## iprgc_99             14724866
## iprgc_100            32782165
## iprgc_101            15390215
## iprgc_102            28578632
## iprgc_104            30192805
## iprgc_105            24528770
## iprgc_106            30802656
## iprgc_107            42462593
## iprgc_108            28855525
## iprgc_109            21695810
## iprgc_110            22927463
## iprgc_111            18467297
## iprgc_112            19036600
## iprgc_113            27601259
## iprgc_114            18638104
## iprgc_115            17237384
## iprgc_116            17447459
## iprgc_117            17248353
## iprgc_118            21315056
## iprgc_119            14188002
## iprgc_120            31820880
## iprgc_121            27191863
## iprgc_122            19422096
## iprgc_123            40849547
## iprgc_124            36378912
## iprgc_125            16749234
## iprgc_126            22769305
## iprgc_127            23091824
## iprgc_128            18824955
## iprgc_129            22427478
## iprgc_130            22042940
##                                                                           umi_dedup_output_bam
## iprgc_62   preprocessing/umd_sequenced/iprgc_62/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_63   preprocessing/umd_sequenced/iprgc_63/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_64   preprocessing/umd_sequenced/iprgc_64/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_65   preprocessing/umd_sequenced/iprgc_65/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_66   preprocessing/umd_sequenced/iprgc_66/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_67   preprocessing/umd_sequenced/iprgc_67/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_68   preprocessing/umd_sequenced/iprgc_68/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_69   preprocessing/umd_sequenced/iprgc_69/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_70   preprocessing/umd_sequenced/iprgc_70/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_71   preprocessing/umd_sequenced/iprgc_71/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_72   preprocessing/umd_sequenced/iprgc_72/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_73   preprocessing/umd_sequenced/iprgc_73/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_74   preprocessing/umd_sequenced/iprgc_74/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_75   preprocessing/umd_sequenced/iprgc_75/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_76   preprocessing/umd_sequenced/iprgc_76/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_77   preprocessing/umd_sequenced/iprgc_77/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_81   preprocessing/umd_sequenced/iprgc_81/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_82   preprocessing/umd_sequenced/iprgc_82/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_83   preprocessing/umd_sequenced/iprgc_83/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_84   preprocessing/umd_sequenced/iprgc_84/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_85   preprocessing/umd_sequenced/iprgc_85/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_86   preprocessing/umd_sequenced/iprgc_86/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_87   preprocessing/umd_sequenced/iprgc_87/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_88   preprocessing/umd_sequenced/iprgc_88/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_89   preprocessing/umd_sequenced/iprgc_89/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_90   preprocessing/umd_sequenced/iprgc_90/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_91   preprocessing/umd_sequenced/iprgc_91/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_92   preprocessing/umd_sequenced/iprgc_92/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_93   preprocessing/umd_sequenced/iprgc_93/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_94   preprocessing/umd_sequenced/iprgc_94/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_95   preprocessing/umd_sequenced/iprgc_95/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_96   preprocessing/umd_sequenced/iprgc_96/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_97   preprocessing/umd_sequenced/iprgc_97/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_98   preprocessing/umd_sequenced/iprgc_98/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_99   preprocessing/umd_sequenced/iprgc_99/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_100 preprocessing/umd_sequenced/iprgc_100/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_101 preprocessing/umd_sequenced/iprgc_101/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_102 preprocessing/umd_sequenced/iprgc_102/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_104 preprocessing/umd_sequenced/iprgc_104/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_105 preprocessing/umd_sequenced/iprgc_105/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_106 preprocessing/umd_sequenced/iprgc_106/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_107 preprocessing/umd_sequenced/iprgc_107/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_108 preprocessing/umd_sequenced/iprgc_108/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_109 preprocessing/umd_sequenced/iprgc_109/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_110 preprocessing/umd_sequenced/iprgc_110/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_111 preprocessing/umd_sequenced/iprgc_111/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_112 preprocessing/umd_sequenced/iprgc_112/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_113 preprocessing/umd_sequenced/iprgc_113/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_114 preprocessing/umd_sequenced/iprgc_114/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_115 preprocessing/umd_sequenced/iprgc_115/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_116 preprocessing/umd_sequenced/iprgc_116/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_117 preprocessing/umd_sequenced/iprgc_117/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_118 preprocessing/umd_sequenced/iprgc_118/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_119 preprocessing/umd_sequenced/iprgc_119/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_120 preprocessing/umd_sequenced/iprgc_120/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_121 preprocessing/umd_sequenced/iprgc_121/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_122 preprocessing/umd_sequenced/iprgc_122/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_123 preprocessing/umd_sequenced/iprgc_123/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_124 preprocessing/umd_sequenced/iprgc_124/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_125 preprocessing/umd_sequenced/iprgc_125/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_126 preprocessing/umd_sequenced/iprgc_126/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_127 preprocessing/umd_sequenced/iprgc_127/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_128 preprocessing/umd_sequenced/iprgc_128/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_129 preprocessing/umd_sequenced/iprgc_129/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_130 preprocessing/umd_sequenced/iprgc_130/outputs/04umi_dedup/umi_tools_deduplicated.bam
##                                                                                               umi_dedup_output_count
## iprgc_62   preprocessing/umd_sequenced/iprgc_62/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_63   preprocessing/umd_sequenced/iprgc_63/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_64   preprocessing/umd_sequenced/iprgc_64/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_65   preprocessing/umd_sequenced/iprgc_65/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_66   preprocessing/umd_sequenced/iprgc_66/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_67   preprocessing/umd_sequenced/iprgc_67/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_68   preprocessing/umd_sequenced/iprgc_68/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_69   preprocessing/umd_sequenced/iprgc_69/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_70   preprocessing/umd_sequenced/iprgc_70/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_71   preprocessing/umd_sequenced/iprgc_71/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_72   preprocessing/umd_sequenced/iprgc_72/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_73   preprocessing/umd_sequenced/iprgc_73/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_74   preprocessing/umd_sequenced/iprgc_74/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_75   preprocessing/umd_sequenced/iprgc_75/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_76   preprocessing/umd_sequenced/iprgc_76/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_77   preprocessing/umd_sequenced/iprgc_77/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_81   preprocessing/umd_sequenced/iprgc_81/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_82   preprocessing/umd_sequenced/iprgc_82/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_83   preprocessing/umd_sequenced/iprgc_83/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_84   preprocessing/umd_sequenced/iprgc_84/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_85   preprocessing/umd_sequenced/iprgc_85/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_86   preprocessing/umd_sequenced/iprgc_86/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_87   preprocessing/umd_sequenced/iprgc_87/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_88   preprocessing/umd_sequenced/iprgc_88/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_89   preprocessing/umd_sequenced/iprgc_89/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_90   preprocessing/umd_sequenced/iprgc_90/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_91   preprocessing/umd_sequenced/iprgc_91/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_92   preprocessing/umd_sequenced/iprgc_92/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_93   preprocessing/umd_sequenced/iprgc_93/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_94   preprocessing/umd_sequenced/iprgc_94/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_95   preprocessing/umd_sequenced/iprgc_95/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_96   preprocessing/umd_sequenced/iprgc_96/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_97   preprocessing/umd_sequenced/iprgc_97/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_98   preprocessing/umd_sequenced/iprgc_98/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_99   preprocessing/umd_sequenced/iprgc_99/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_100 preprocessing/umd_sequenced/iprgc_100/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_101 preprocessing/umd_sequenced/iprgc_101/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_102 preprocessing/umd_sequenced/iprgc_102/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_104 preprocessing/umd_sequenced/iprgc_104/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_105 preprocessing/umd_sequenced/iprgc_105/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_106 preprocessing/umd_sequenced/iprgc_106/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_107 preprocessing/umd_sequenced/iprgc_107/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_108 preprocessing/umd_sequenced/iprgc_108/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_109 preprocessing/umd_sequenced/iprgc_109/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_110 preprocessing/umd_sequenced/iprgc_110/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_111 preprocessing/umd_sequenced/iprgc_111/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_112 preprocessing/umd_sequenced/iprgc_112/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_113 preprocessing/umd_sequenced/iprgc_113/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_114 preprocessing/umd_sequenced/iprgc_114/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_115 preprocessing/umd_sequenced/iprgc_115/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_116 preprocessing/umd_sequenced/iprgc_116/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_117 preprocessing/umd_sequenced/iprgc_117/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_118 preprocessing/umd_sequenced/iprgc_118/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_119 preprocessing/umd_sequenced/iprgc_119/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_120 preprocessing/umd_sequenced/iprgc_120/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_121 preprocessing/umd_sequenced/iprgc_121/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_122 preprocessing/umd_sequenced/iprgc_122/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_123 preprocessing/umd_sequenced/iprgc_123/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_124 preprocessing/umd_sequenced/iprgc_124/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_125 preprocessing/umd_sequenced/iprgc_125/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_126 preprocessing/umd_sequenced/iprgc_126/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_127 preprocessing/umd_sequenced/iprgc_127/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_128 preprocessing/umd_sequenced/iprgc_128/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_129 preprocessing/umd_sequenced/iprgc_129/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_130 preprocessing/umd_sequenced/iprgc_130/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
##           umi_dedup_chimeric umi_dedup_num_reads_in umi_dedup_num_reads_out
## iprgc_62             1452937               18614709                 8648625
## iprgc_63              709025               13297062                 6169628
## iprgc_64              867058               17895655                12438709
## iprgc_65              825134               20305778                14650070
## iprgc_66                   0               15209347                 7879075
## iprgc_67                   0               14911704                 6244396
## iprgc_68             1246928               16877415                 8001913
## iprgc_69              224846               18312482                13626331
## iprgc_70                   0               11291811                 4315031
## iprgc_71                   0               14899869                 6142703
## iprgc_72                   0               17508994                 8086389
## iprgc_73                   0               15705128                 7262328
## iprgc_74              444838               16982732                10297731
## iprgc_75              471376               17837101                11666895
## iprgc_76              548725               27435832                17919454
## iprgc_77                   0               12622691                 5641702
## iprgc_81                   0               15696204                 4325269
## iprgc_82                   0               14420683                 5989004
## iprgc_83              278840               20500536                 6520845
## iprgc_84              382725               19718919                11961194
## iprgc_85                   0               21919740                 6297631
## iprgc_86             1662182               19427925                11226412
## iprgc_87             3002303               24375432                 6943848
## iprgc_88                   0               25825973                 7683133
## iprgc_89             1288308               22230551                 9988741
## iprgc_90             2506186               29561758                16430666
## iprgc_91              805952               15730918                11449267
## iprgc_92                   0               20434181                 6517215
## iprgc_93                   0               18285032                 4763200
## iprgc_94             3231382               23478066                 7569580
## iprgc_95                   0               20934229                 6494203
## iprgc_96              716527               14087698                 9401463
## iprgc_97             1230958               20902762                 6972570
## iprgc_98             1347661               18716405                10937773
## iprgc_99              428519               15381926                12713186
## iprgc_100            3861642               29132038                10539058
## iprgc_101             946176               15478210                10762654
## iprgc_102            1500337               26398889                 7615304
## iprgc_104                  0               25659015                 5958853
## iprgc_105                  0               21634779                 7136486
## iprgc_106            2296611               24666207                11852081
## iprgc_107                  0               33732409                 8324107
## iprgc_108            2555016               23911870                12383587
## iprgc_109             662661               21753591                15616405
## iprgc_110                  0               22498630                 5560116
## iprgc_111                  0               17938608                 4975228
## iprgc_112                  0               19103684                 8418311
## iprgc_113                  0               26995038                 7519015
## iprgc_114             594219               18353136                11277987
## iprgc_115             490334               17708595                12360074
## iprgc_116             351840               18170428                13514017
## iprgc_117             657983               17093633                12218494
## iprgc_118            1192045               20812806                13909310
## iprgc_119             354617               14328357                10869600
## iprgc_120            2098677               29739491                15991456
## iprgc_121            1844894               25274997                14082779
## iprgc_122             470276               20455761                13355865
## iprgc_123            3524658               35613060                 8785532
## iprgc_124            3036013               31992425                 7611305
## iprgc_125             367910               17181632                 6236874
## iprgc_126                  0               22064620                 4360402
## iprgc_127                  0               22219789                10051459
## iprgc_128                  0               18785320                 4216887
## iprgc_129                  0               21729414                 3911603
## iprgc_130             579771               21788444                 9135783
##           umi_dedup_pct_reads umi_dedup_deduplicated_positions
## iprgc_62                0.465                          1753865
## iprgc_63                0.464                          1071878
## iprgc_64                0.695                          4373152
## iprgc_65                0.721                          5419451
## iprgc_66                0.518                          2388658
## iprgc_67                0.419                          1850476
## iprgc_68                0.474                          1436590
## iprgc_69                0.744                          6138409
## iprgc_70                0.382                          1254243
## iprgc_71                0.412                          1571654
## iprgc_72                0.462                          2176556
## iprgc_73                0.462                          1999845
## iprgc_74                0.606                          3551834
## iprgc_75                0.654                          4098587
## iprgc_76                0.653                          6129190
## iprgc_77                0.447                          1562142
## iprgc_81                0.276                          1260702
## iprgc_82                0.415                          2056722
## iprgc_83                0.318                          2151073
## iprgc_84                0.607                          3990543
## iprgc_85                0.287                          1633097
## iprgc_86                0.578                          4040213
## iprgc_87                0.285                           992104
## iprgc_88                0.297                          1747176
## iprgc_89                0.449                          3055929
## iprgc_90                0.556                          5517995
## iprgc_91                0.728                          4836261
## iprgc_92                0.319                          1974476
## iprgc_93                0.260                          1639813
## iprgc_94                0.322                          1407175
## iprgc_95                0.310                          1633630
## iprgc_96                0.667                          4043448
## iprgc_97                0.334                          2174736
## iprgc_98                0.584                          3780285
## iprgc_99                0.827                          5930421
## iprgc_100               0.362                          2736945
## iprgc_101               0.695                          5000352
## iprgc_102               0.288                          2468613
## iprgc_104               0.232                          1748672
## iprgc_105               0.330                          2684344
## iprgc_106               0.480                          3598525
## iprgc_107               0.247                          1445521
## iprgc_108               0.518                          3874112
## iprgc_109               0.718                          5888344
## iprgc_110               0.247                          1935173
## iprgc_111               0.277                          2273128
## iprgc_112               0.441                          3260409
## iprgc_113               0.279                          2452306
## iprgc_114               0.614                          4137689
## iprgc_115               0.698                          4863270
## iprgc_116               0.744                          6018124
## iprgc_117               0.715                          4461309
## iprgc_118               0.668                          4602072
## iprgc_119               0.759                          4348791
## iprgc_120               0.538                          5227916
## iprgc_121               0.557                          4731564
## iprgc_122               0.653                          5194944
## iprgc_123               0.247                          1224820
## iprgc_124               0.238                          1735561
## iprgc_125               0.363                          3711886
## iprgc_126               0.198                          1740851
## iprgc_127               0.452                          3552168
## iprgc_128               0.224                          2102741
## iprgc_129               0.180                          1607974
## iprgc_130               0.419                          3507514
##           umi_dedup_mean_umi_per_pos umi_dedup_max_umi_per_pos  time_geno_loc
## iprgc_62                        8.60                     38924   p15_het_dlgn
## iprgc_63                        9.86                     39440   p15_het_dlgn
## iprgc_64                        3.59                     27371 p15_het_retina
## iprgc_65                        3.34                     27862 p15_het_retina
## iprgc_66                        4.95                     37595    p15_het_scn
## iprgc_67                        4.54                     24406    p15_het_scn
## iprgc_68                        9.68                     45454    p15_ko_dlgn
## iprgc_69                        2.38                     15393  p15_ko_retina
## iprgc_70                        4.62                     20251     p15_ko_scn
## iprgc_71                        6.12                     36072    p15_wt_dlgn
## iprgc_72                        5.93                     37992    p15_wt_dlgn
## iprgc_73                        5.75                     40737    p15_wt_dlgn
## iprgc_74                        3.63                     25472  p15_wt_retina
## iprgc_75                        3.53                     28830  p15_wt_retina
## iprgc_76                        3.62                     38280  p15_wt_retina
## iprgc_77                        5.18                     23257     p15_wt_scn
## iprgc_81                        4.63                     22526    p08_wt_dlgn
## iprgc_82                        3.71                     21315    p08_wt_dlgn
## iprgc_83                        3.96                     53471  p08_wt_retina
## iprgc_84                        3.92                     57014  p08_wt_retina
## iprgc_85                        5.78                     45940     p08_ko_scn
## iprgc_86                        3.89                     46855  p08_ko_retina
## iprgc_87                       16.31                     56654    p08_ko_dlgn
## iprgc_88                        7.90                     55449   p08_het_dlgn
## iprgc_89                        4.95                     50112    p08_het_scn
## iprgc_90                        4.15                     55133 p08_het_retina
## iprgc_91                        2.83                     40894  p08_wt_retina
## iprgc_92                        4.63                     45886    p08_wt_dlgn
## iprgc_93                        3.80                     36240     p08_wt_scn
## iprgc_94                       11.52                     55625   p15_het_dlgn
## iprgc_95                        6.17                     47815    p15_het_scn
## iprgc_96                        2.94                     47871 p15_het_retina
## iprgc_97                        4.38                     43996     p15_wt_scn
## iprgc_98                        3.95                     49407    p15_wt_dlgn
## iprgc_99                        2.33                     24195  p15_wt_retina
## iprgc_100                       7.43                     58830    p15_ko_dlgn
## iprgc_101                       2.66                     37636  p15_ko_retina
## iprgc_102                       4.06                     48224     p15_ko_scn
## iprgc_104                       4.96                     44516   p08_het_dlgn
## iprgc_105                       3.51                     47370   p08_het_dlgn
## iprgc_106                       4.79                     54693   p15_het_dlgn
## iprgc_107                      12.65                     63093    p08_ko_dlgn
## iprgc_108                       4.54                     51083    p15_ko_dlgn
## iprgc_109                       3.08                     40990  p08_wt_retina
## iprgc_110                       3.68                     38373    p08_het_scn
## iprgc_111                       2.50                     29514    p08_het_scn
## iprgc_112                       2.93                     33820    p15_het_scn
## iprgc_113                       4.20                     48638     p08_ko_scn
## iprgc_114                       3.13                     40491     p15_ko_scn
## iprgc_115                       2.93                     37559  p08_wt_retina
## iprgc_116                       2.46                     30096  p15_wt_retina
## iprgc_117                       3.22                     44668 p08_het_retina
## iprgc_118                       3.69                     44346 p08_het_retina
## iprgc_119                       2.80                     32754 p15_het_retina
## iprgc_120                       4.14                     54664  p08_ko_retina
## iprgc_121                       4.11                     52455  p08_ko_retina
## iprgc_122                       2.92                     43252  p15_ko_retina
## iprgc_123                      16.25                     63117    p08_ko_dlgn
## iprgc_124                       7.01                     56208     p08_ko_scn
## iprgc_125                       1.85                     20841    p08_wt_dlgn
## iprgc_126                       3.13                     24582    p08_wt_dlgn
## iprgc_127                       3.52                     36871    p15_wt_dlgn
## iprgc_128                       2.35                     34708     p08_wt_scn
## iprgc_129                       2.91                     24561     p08_wt_scn
## iprgc_130                       3.07                     35515     p15_wt_scn
## 
## $factors
## [1] "genotype_atb" "location_atb" "time_atb"    
## 
## $observed_nodes
##  [1] "het"            "het dlgn"       "het dlgn p08"   "het dlgn p15"  
##  [5] "het retina"     "het retina p08" "het retina p15" "het scn"       
##  [9] "het scn p08"    "het scn p15"    "ko"             "ko dlgn"       
## [13] "ko dlgn p08"    "ko dlgn p15"    "ko retina"      "ko retina p08" 
## [17] "ko retina p15"  "ko scn"         "ko scn p08"     "ko scn p15"    
## [21] "wt"             "wt dlgn"        "wt dlgn p08"    "wt dlgn p15"   
## [25] "wt retina"      "wt retina p08"  "wt retina p15"  "wt scn"        
## [29] "wt scn p08"     "wt scn p15"    
## 
## $ggplot

## 
## attr(,"class")
## [1] "hpgltools::meta_sankey"

10 A Short conversation with Rashmi

Rashmi came by and we discussed the samples a little. She suggested that is likely that we will need to exclude the 202205 samples, these may be identified by a few ways, most easily I think via the ‘project_ah’ column, they are the 021_1 samples.

My sense was that she concurred with my interpretation of the umi deduplication, so I will continue using the deduplicated results exclusively, at least for now.

11 Melanopsin Sanity Check

One of Theresa’s first checks was wisely for melanopsin. Let us repeat a version of this:

An important note: Indrajeet Patil removed the groupedstats and its associated plotting library from CRAN/github/etc. I am not certain what happened, but that necessitates a change in how I plot this.

opn4_exprs <- data.frame(combined = colData(loc_geno_nt)[["geno_loc_atb"]],
                         location = colData(loc_geno_nt)[["location_atb"]],
                         genotype = colData(loc_geno_nt)[["genotype_atb"]],
                         opn = assay(loc_geno_nt)["ENSMUSG00000021799", ])

## groupedstats::grouped_summary(opn4_exprs, location, opn)
## opn4_location <- ggbetweenstats(data = opn4_exprs, x = location, y = opn)
## pp(file = "images/ggbetween_location.pdf")
## opn4_location
## plotted <- dev.off()
## opn4_location

## opn4_genotype <- ggbetweenstats(data = opn4_exprs, x = genotype, y = opn)
## pp(file = "images/ggbetween_location.pdf")
## opn4_genotype
## plotted <- dev.off()
## opn4_genotype

## opn4_combined <- ggbetweenstats(data = opn4_exprs, x = combined, y = opn)
## pp(file = "images/ggbetween_combined.pdf")
## opn4_combined
## plotted <- dev.off()
## opn4_combined

ok, so I plotted the question a bit differently, but got the same answer.

Here is the text of Theresa’s notebook following this analysis:

“Ugh oh, looks like there is at least one retina KO sample that has some melanopsin expression in it. Turns out ipRGC_07 is a bad egg which is supposed to be a KO but has melanopsin expression. It’s friends which were pooled from the same mice are iprgc_06 and iprgc_08, so we need to exclude all these samples.”

I am also seeing some knockout expression with some caveats: I do not have the affected samples in my dataset (iprgc_07) and the levels I am seeing are quite low – I will look in IGV to double check, but I strongly suspect that these are some piddly reads near the UTRs.

Onward!

12 PCA plots

12.1 PCA of all genes by location

Theresa’s first pca was of log2 cpm values. I might add quantile/tmm to this?

v3_location <- set_conditions(mm38_hisat_v3, fact = "location_atb") %>%
  set_batches(fact = "genotype_atb") %>%
  set_colors(color_choices[["location"]])
## The numbers of samples by condition are:
## 
##   dlgn retina    scn 
##     23     23     19
## The number of samples by batch are:
## 
## het  ko  wt 
##  21  18  26
v3_location_norm <- normalize(v3_location, filter = TRUE, norm = "quant",
                                   transform = "log2", convert = "cpm")
## Removing 10156 low-count genes (15269 remaining).
## transform_counts: Found 9347 values equal to 0, adding 1 to the matrix.
v3_location_pca <- plot_pca(v3_location_norm)
pp(file = "01diagnostic_images/v3_location_norm_pca.pdf")
v3_location_pca
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by dlgn, retina, scn
## Shapes are defined by het, ko, wt.
dev.off()
## png 
##   2
v3_location_pca
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by dlgn, retina, scn
## Shapes are defined by het, ko, wt.

Once again we see that samples iprgc_66 and iprgc_130 are likely actually DLGN and not SCN. I am therefore going to add a column to the sample sheet noting this, and remove them from the expressionset.

I will thus replot the data after removing those two. If we want to see what it looks like with the re-attributed locations, we can do so.

Theresa has a nice change to the PCA plotter in which she sets the alpha channel as an additional visual queue for a metadata factor…

mm38_hisat_v3 <- subset_se(mm38_hisat_v3, subset="sampleid!='iprgc_130'") %>%
  subset_se(subset="sampleid!='iprgc_66'")
v3_location <- set_conditions(mm38_hisat_v3, fact = "location_atb") %>%
  set_batches(fact = "genotype_atb") %>%
  set_colors(color_choices[["location"]])
## The numbers of samples by condition are:
## 
##   dlgn retina    scn 
##     23     23     17
## The number of samples by batch are:
## 
## het  ko  wt 
##  20  18  25
v3_location_norm <- normalize(v3_location, filter = TRUE, norm = "quant",
                                   transform = "log2", convert = "cpm")
## Removing 10162 low-count genes (15263 remaining).
## transform_counts: Found 8867 values equal to 0, adding 1 to the matrix.
filtered_location_pca <- plot_pca(v3_location_norm)
pp(file = "02filtered_images/filtered_location_pca.pdf")
## Warning in pp(file = "02filtered_images/filtered_location_pca.pdf"): The
## directory: 02filtered_images does not exist, will attempt to create it.
filtered_location_pca[["plot"]]
plotted <- dev.off()
filtered_location_pca
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by dlgn, retina, scn
## Shapes are defined by het, ko, wt.

removed_sankey <- plot_meta_sankey(v3_location, color_choices = color_choices,
                                   factors = c("genotype_atb", "location_atb", "time_atb"))
## Warning: attributes are not identical across measure variables; they will be
## dropped
pp(file = "02filtered_images/filtered_sankey.pdf")
removed_sankey[["ggplot"]]
plotted <- dev.off()
removed_sankey
## $design
##            rownames  sampleid genotype location time condition cellcompartment
## iprgc_62   iprgc_62  iprgc_62      het     dlgn  p15      dlgn            axon
## iprgc_63   iprgc_63  iprgc_63      het     dlgn  p15      dlgn            axon
## iprgc_64   iprgc_64  iprgc_64      het   retina  p15    retina            soma
## iprgc_65   iprgc_65  iprgc_65      het   retina  p15    retina            soma
## iprgc_67   iprgc_67  iprgc_67      het      scn  p15       scn            axon
## iprgc_68   iprgc_68  iprgc_68       ko     dlgn  p15      dlgn            axon
## iprgc_69   iprgc_69  iprgc_69       ko   retina  p15    retina            soma
## iprgc_70   iprgc_70  iprgc_70       ko      scn  p15       scn            axon
## iprgc_71   iprgc_71  iprgc_71       wt     dlgn  p15      dlgn            axon
## iprgc_72   iprgc_72  iprgc_72       wt     dlgn  p15      dlgn            axon
## iprgc_73   iprgc_73  iprgc_73       wt     dlgn  p15      dlgn            axon
## iprgc_74   iprgc_74  iprgc_74       wt   retina  p15    retina            soma
## iprgc_75   iprgc_75  iprgc_75       wt   retina  p15    retina            soma
## iprgc_76   iprgc_76  iprgc_76       wt   retina  p15    retina            soma
## iprgc_77   iprgc_77  iprgc_77       wt      scn  p15       scn            axon
## iprgc_81   iprgc_81  iprgc_81       wt     dlgn  p08      dlgn            axon
## iprgc_82   iprgc_82  iprgc_82       wt     dlgn  p08      dlgn            axon
## iprgc_83   iprgc_83  iprgc_83       wt   retina  p08    retina            soma
## iprgc_84   iprgc_84  iprgc_84       wt   retina  p08    retina            soma
## iprgc_85   iprgc_85  iprgc_85      het     dlgn  p15       scn            axon
## iprgc_86   iprgc_86  iprgc_86       ko     dlgn  p15    retina            soma
## iprgc_87   iprgc_87  iprgc_87      het   retina  p15      dlgn            axon
## iprgc_88   iprgc_88  iprgc_88       ko     dlgn  p08      dlgn            axon
## iprgc_89   iprgc_89  iprgc_89       ko   retina  p15       scn            axon
## iprgc_90   iprgc_90  iprgc_90       ko   retina  p08    retina            soma
## iprgc_91   iprgc_91  iprgc_91       wt   retina  p08    retina            soma
## iprgc_92   iprgc_92  iprgc_92       wt   retina  p15      dlgn            axon
## iprgc_93   iprgc_93  iprgc_93       wt     dlgn  p15       scn            axon
## iprgc_94   iprgc_94  iprgc_94       ko      scn  p15      dlgn            axon
## iprgc_95   iprgc_95  iprgc_95      het      scn  p15       scn            axon
## iprgc_96   iprgc_96  iprgc_96       ko      scn  p08    retina            soma
## iprgc_97   iprgc_97  iprgc_97      het      scn  p08       scn            axon
## iprgc_98   iprgc_98  iprgc_98      het     dlgn  p08      dlgn            axon
## iprgc_99   iprgc_99  iprgc_99      het   retina  p08    retina            soma
## iprgc_100 iprgc_100 iprgc_100       wt      scn  p08      dlgn            axon
## iprgc_101 iprgc_101 iprgc_101       wt     dlgn  p08    retina            soma
## iprgc_102 iprgc_102 iprgc_102       wt      scn  p15       scn            axon
## iprgc_104 iprgc_104 iprgc_104      het     dlgn  p08      dlgn            axon
## iprgc_105 iprgc_105 iprgc_105      het     dlgn  p08      dlgn            axon
## iprgc_106 iprgc_106 iprgc_106      het     dlgn  p15      dlgn            axon
## iprgc_107 iprgc_107 iprgc_107       ko     dlgn  p08      dlgn            axon
## iprgc_108 iprgc_108 iprgc_108       ko     dlgn  p15      dlgn            axon
## iprgc_109 iprgc_109 iprgc_109       wt   retina  p08    retina            soma
## iprgc_110 iprgc_110 iprgc_110      het      scn  p08       scn            axon
## iprgc_111 iprgc_111 iprgc_111      het      scn  p08       scn            axon
## iprgc_112 iprgc_112 iprgc_112      het      scn  p15       scn            axon
## iprgc_113 iprgc_113 iprgc_113       ko      scn  p08       scn            axon
## iprgc_114 iprgc_114 iprgc_114       ko      scn  p15       scn            axon
## iprgc_115 iprgc_115 iprgc_115       wt   retina  p08    retina            soma
## iprgc_116 iprgc_116 iprgc_116       wt   retina  p15    retina            soma
## iprgc_117 iprgc_117 iprgc_117      het   retina  p08    retina            soma
## iprgc_118 iprgc_118 iprgc_118      het   retina  p08    retina            soma
## iprgc_119 iprgc_119 iprgc_119      het   retina  p15    retina            soma
## iprgc_120 iprgc_120 iprgc_120       ko   retina  p08    retina            soma
## iprgc_121 iprgc_121 iprgc_121       ko   retina  p08    retina            soma
## iprgc_122 iprgc_122 iprgc_122       ko   retina  p15    retina            soma
## iprgc_123 iprgc_123 iprgc_123     <NA>     <NA> <NA>      dlgn            <NA>
## iprgc_124 iprgc_124 iprgc_124     <NA>     <NA> <NA>       scn            <NA>
## iprgc_125 iprgc_125 iprgc_125     <NA>     <NA> <NA>      dlgn            <NA>
## iprgc_126 iprgc_126 iprgc_126     <NA>     <NA> <NA>      dlgn            <NA>
## iprgc_127 iprgc_127 iprgc_127     <NA>     <NA> <NA>      dlgn            <NA>
## iprgc_128 iprgc_128 iprgc_128     <NA>     <NA> <NA>       scn            <NA>
## iprgc_129 iprgc_129 iprgc_129     <NA>     <NA> <NA>       scn            <NA>
##                                            raw_r1
## iprgc_62     P15_Het_dLGN_S1A_S16_R1_001.fastq.gz
## iprgc_63     P15_Het_dLGN_S2A_S17_R1_001.fastq.gz
## iprgc_64       P15_Het_Ret_S1A_S7_R1_001.fastq.gz
## iprgc_65       P15_Het_Ret_S2A_S8_R1_001.fastq.gz
## iprgc_67      P15_Het_SCN_S2A_S22_R1_001.fastq.gz
## iprgc_68      P15_KO_dLGN_S1A_S18_R1_001.fastq.gz
## iprgc_69        P15_KO_Ret_S1A_S9_R1_001.fastq.gz
## iprgc_70       P15_KO_SCN_S1A_S23_R1_001.fastq.gz
## iprgc_71      P15_WT_dLGN_S1A_S12_R1_001.fastq.gz
## iprgc_72      P15_WT_dLGN_S2A_S13_R1_001.fastq.gz
## iprgc_73      P15_WT_dLGN_S3A_S14_R1_001.fastq.gz
## iprgc_74        P15_WT_Ret_S1A_S3_R1_001.fastq.gz
## iprgc_75        P15_WT_Ret_S2A_S4_R1_001.fastq.gz
## iprgc_76        P15_WT_Ret_S3A_S5_R1_001.fastq.gz
## iprgc_77       P15_WT_SCN_S3A_S19_R1_001.fastq.gz
## iprgc_81       P8_WT_dLGN_S1A_S10_R1_001.fastq.gz
## iprgc_82       P8_WT_dLGN_S2A_S11_R1_001.fastq.gz
## iprgc_83         P8_WT_Ret_S1A_S1_R1_001.fastq.gz
## iprgc_84         P8_WT_Ret_S2A_S2_R1_001.fastq.gz
## iprgc_85        P8_KO_SCN_S1A_S12_R1_001.fastq.gz
## iprgc_86        P8_KO_Ret_S1A_S10_R1_001.fastq.gz
## iprgc_87       P8_KO_dLGN_S1A_S11_R1_001.fastq.gz
## iprgc_88       P8_Het_dLGN_S1A_S8_R1_001.fastq.gz
## iprgc_89        P8_Het_SCN_S1A_S9_R1_001.fastq.gz
## iprgc_90        P8_Het_Ret_S1A_S7_R1_001.fastq.gz
## iprgc_91         P8_WT_Ret_S1A_S1_R2_001.fastq.gz
## iprgc_92        P8_WT_dLGN_S1A_S2_R1_001.fastq.gz
## iprgc_93         P8_WT_SCN_S1A_S3_R1_001.fastq.gz
## iprgc_94     P15_Het_dLGN_S1B_S17_R1_001.fastq.gz
## iprgc_95      P15_Het_SCN_S1B_S18_R1_001.fastq.gz
## iprgc_96      P15_Het_Ret_S1B_S16_R1_001.fastq.gz
## iprgc_97        P15_WT_SCN_S1A_S6_R1_001.fastq.gz
## iprgc_98       P15_WT_dLGN_S1A_S5_R1_001.fastq.gz
## iprgc_99        P15_WT_Ret_S1A_S4_R1_001.fastq.gz
## iprgc_100     P15_KO_dLGN_S1A_S14_R1_001.fastq.gz
## iprgc_101      P15_KO_Ret_S1A_S13_R1_001.fastq.gz
## iprgc_102      P15_KO_SCN_S1A_S15_R1_001.fastq.gz
## iprgc_104   13b_P8_Het_dLGN_S2_S6_R1_001.fastq.gz
## iprgc_105   14b_P8_Het_dLGN_S3_S7_R1_001.fastq.gz
## iprgc_106 15b_P15_Het_dLGN_S2_S8_R1_001.fastq.gz 
## iprgc_107     16_P8_KO_dLGN_S2_S9_R1_001.fastq.gz
## iprgc_108   18_P15_KO_dLGN_S2_S10_R1_001.fastq.gz
## iprgc_109     1b_P8_WT_Ret_S2_S16_R1_001.fastq.gz
## iprgc_110   22b_P8_Het_SCN_S2_S11_R1_001.fastq.gz
## iprgc_111   23b_P8_Het_SCN_S3_S12_R1_001.fastq.gz
## iprgc_112  24b_P15_Het_SCN_S2_S13_R1_001.fastq.gz
## iprgc_113     25_P8_KO_SCN_S2_S14_R1_001.fastq.gz
## iprgc_114    27_P15_KO_SCN_S2_S15_R1_001.fastq.gz
## iprgc_115     2b_P8_WT_Ret_S3_S17_R1_001.fastq.gz
## iprgc_116    3b_P15_WT_Ret_S3_S18_R1_001.fastq.gz
## iprgc_117     4b_P8_Het_Ret_S2_S1_R1_001.fastq.gz
## iprgc_118     5_P8_Het_Ret_S3_S2_R1_001.fastq.gz 
## iprgc_119    6b_P15_Het_Ret_S2_S3_R1_001.fastq.gz
## iprgc_120       7_P8_KO_Ret_S2_S4_R1_001.fastq.gz
## iprgc_121      8_P8_KO_Ret_S3_S19_R1_001.fastq.gz
## iprgc_122      9_P15_KO_Ret_S2_S5_R1_001.fastq.gz
## iprgc_123                                    <NA>
## iprgc_124                                    <NA>
## iprgc_125                                    <NA>
## iprgc_126                                    <NA>
## iprgc_127                                    <NA>
## iprgc_128                                    <NA>
## iprgc_129                                    <NA>
##                                            raw_r2 batch date_received
## iprgc_62     P15_Het_dLGN_S1A_S16_R2_001.fastq.gz   het     b20220518
## iprgc_63     P15_Het_dLGN_S2A_S17_R2_001.fastq.gz   het     b20220518
## iprgc_64       P15_Het_Ret_S1A_S7_R2_001.fastq.gz   het     b20220518
## iprgc_65       P15_Het_Ret_S2A_S8_R2_001.fastq.gz   het     b20220518
## iprgc_67      P15_Het_SCN_S2A_S22_R2_001.fastq.gz   het     b20220518
## iprgc_68      P15_KO_dLGN_S1A_S18_R2_001.fastq.gz    ko     b20220518
## iprgc_69        P15_KO_Ret_S1A_S9_R2_001.fastq.gz    ko     b20220518
## iprgc_70       P15_KO_SCN_S1A_S23_R2_001.fastq.gz    ko     b20220518
## iprgc_71      P15_WT_dLGN_S1A_S12_R2_001.fastq.gz    wt     b20220518
## iprgc_72      P15_WT_dLGN_S2A_S13_R2_001.fastq.gz    wt     b20220518
## iprgc_73      P15_WT_dLGN_S3A_S14_R2_001.fastq.gz    wt     b20220518
## iprgc_74        P15_WT_Ret_S1A_S3_R2_001.fastq.gz    wt     b20220518
## iprgc_75        P15_WT_Ret_S2A_S4_R2_001.fastq.gz    wt     b20220518
## iprgc_76        P15_WT_Ret_S3A_S5_R2_001.fastq.gz    wt     b20220518
## iprgc_77       P15_WT_SCN_S3A_S19_R2_001.fastq.gz    wt     b20220518
## iprgc_81       P8_WT_dLGN_S1A_S10_R2_001.fastq.gz    wt     b20220518
## iprgc_82       P8_WT_dLGN_S2A_S11_R2_001.fastq.gz    wt     b20220518
## iprgc_83         P8_WT_Ret_S1A_S1_R2_001.fastq.gz    wt     b20220518
## iprgc_84         P8_WT_Ret_S2A_S2_R2_001.fastq.gz    wt     b20220518
## iprgc_85        P8_KO_SCN_S1A_S12_R2_001.fastq.gz    ko     b20230515
## iprgc_86        P8_KO_Ret_S1A_S10_R2_001.fastq.gz    ko     b20230515
## iprgc_87       P8_KO_dLGN_S1A_S11_R2_001.fastq.gz    ko     b20230515
## iprgc_88       P8_Het_dLGN_S1A_S8_R2_001.fastq.gz   het     b20230515
## iprgc_89        P8_Het_SCN_S1A_S9_R2_001.fastq.gz   het     b20230515
## iprgc_90        P8_Het_Ret_S1A_S7_R2_001.fastq.gz   het     b20230515
## iprgc_91         P8_WT_Ret_S1A_S1_R2_001.fastq.gz    wt     b20230515
## iprgc_92        P8_WT_dLGN_S1A_S2_R2_001.fastq.gz    wt     b20230515
## iprgc_93         P8_WT_SCN_S1A_S3_R2_001.fastq.gz    wt     b20230515
## iprgc_94     P15_Het_dLGN_S1B_S17_R2_001.fastq.gz   het     b20230515
## iprgc_95      P15_Het_SCN_S1B_S18_R2_001.fastq.gz   het     b20230516
## iprgc_96      P15_Het_Ret_S1B_S16_R2_001.fastq.gz   het     b20230517
## iprgc_97        P15_WT_SCN_S1A_S6_R2_001.fastq.gz    wt     b20230518
## iprgc_98       P15_WT_dLGN_S1A_S5_R2_001.fastq.gz    wt     b20230519
## iprgc_99        P15_WT_Ret_S1A_S4_R2_001.fastq.gz    wt     b20230520
## iprgc_100     P15_KO_dLGN_S1A_S14_R2_001.fastq.gz    ko     b20230521
## iprgc_101      P15_KO_Ret_S1A_S13_R2_001.fastq.gz    ko     b20230522
## iprgc_102      P15_KO_SCN_S1A_S15_R2_001.fastq.gz    ko     b20230523
## iprgc_104   13b_P8_Het_dLGN_S2_S6_R2_001.fastq.gz   het     b20231010
## iprgc_105   14b_P8_Het_dLGN_S3_S7_R2_001.fastq.gz   het     b20231010
## iprgc_106 15b_P15_Het_dLGN_S2_S8_R2_001.fastq.gz    het     b20231010
## iprgc_107     16_P8_KO_dLGN_S2_S9_R2_001.fastq.gz    ko     b20231010
## iprgc_108   18_P15_KO_dLGN_S2_S10_R2_001.fastq.gz    ko     b20231010
## iprgc_109     1b_P8_WT_Ret_S2_S16_R2_001.fastq.gz    wt     b20231010
## iprgc_110   22b_P8_Het_SCN_S2_S11_R2_001.fastq.gz   het     b20231010
## iprgc_111   23b_P8_Het_SCN_S3_S12_R2_001.fastq.gz   het     b20231010
## iprgc_112  24b_P15_Het_SCN_S2_S13_R2_001.fastq.gz   het     b20231010
## iprgc_113     25_P8_KO_SCN_S2_S14_R2_001.fastq.gz    ko     b20231010
## iprgc_114    27_P15_KO_SCN_S2_S15_R2_001.fastq.gz    ko     b20231010
## iprgc_115     2b_P8_WT_Ret_S3_S17_R2_001.fastq.gz    wt     b20231010
## iprgc_116    3b_P15_WT_Ret_S3_S18_R2_001.fastq.gz    wt     b20231010
## iprgc_117     4b_P8_Het_Ret_S2_S1_R2_001.fastq.gz   het     b20231010
## iprgc_118     5_P8_Het_Ret_S3_S2_R2_001.fastq.gz    het     b20231010
## iprgc_119    6b_P15_Het_Ret_S2_S3_R2_001.fastq.gz   het     b20231010
## iprgc_120       7_P8_KO_Ret_S2_S4_R2_001.fastq.gz    ko     b20231010
## iprgc_121      8_P8_KO_Ret_S3_S19_R2_001.fastq.gz    ko     b20231010
## iprgc_122      9_P15_KO_Ret_S2_S5_R2_001.fastq.gz    ko     b20231010
## iprgc_123                                    <NA>    ko          <NA>
## iprgc_124                                    <NA>    ko          <NA>
## iprgc_125                                    <NA>    wt          <NA>
## iprgc_126                                    <NA>    wt          <NA>
## iprgc_127                                    <NA>    wt          <NA>
## iprgc_128                                    <NA>    wt          <NA>
## iprgc_129                                    <NA>    wt          <NA>
##                                                                                                                   file
## iprgc_62  preprocessing_new/iprgc_62/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_63  preprocessing_new/iprgc_63/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_64  preprocessing_new/iprgc_64/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_65  preprocessing_new/iprgc_65/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_67  preprocessing_new/iprgc_67/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_68  preprocessing_new/iprgc_68/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_69  preprocessing_new/iprgc_69/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_70  preprocessing_new/iprgc_70/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_71  preprocessing_new/iprgc_71/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_72  preprocessing_new/iprgc_72/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_73  preprocessing_new/iprgc_73/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_74  preprocessing_new/iprgc_74/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_75  preprocessing_new/iprgc_75/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_76  preprocessing_new/iprgc_76/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_77  preprocessing_new/iprgc_77/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_81      preprocessing/iprgc_81/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_82      preprocessing/iprgc_82/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_83      preprocessing/iprgc_83/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_84      preprocessing/iprgc_84/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_85             preprocessing/iprgc_85/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_86             preprocessing/iprgc_86/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_87             preprocessing/iprgc_87/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_88             preprocessing/iprgc_88/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_89             preprocessing/iprgc_89/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_90             preprocessing/iprgc_90/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_91             preprocessing/iprgc_91/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_92             preprocessing/iprgc_92/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_93             preprocessing/iprgc_93/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_94             preprocessing/iprgc_94/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_95             preprocessing/iprgc_95/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_96             preprocessing/iprgc_96/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_97             preprocessing/iprgc_97/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_98             preprocessing/iprgc_98/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_99             preprocessing/iprgc_99/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_100           preprocessing/iprgc_100/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_101           preprocessing/iprgc_101/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_102           preprocessing/iprgc_102/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_104           preprocessing/iprgc_104/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_105           preprocessing/iprgc_105/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_106           preprocessing/iprgc_106/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_107           preprocessing/iprgc_107/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_108           preprocessing/iprgc_108/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_109           preprocessing/iprgc_109/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_110           preprocessing/iprgc_110/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_111           preprocessing/iprgc_111/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_112           preprocessing/iprgc_112/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_113           preprocessing/iprgc_113/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_114           preprocessing/iprgc_114/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_115           preprocessing/iprgc_115/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_116           preprocessing/iprgc_116/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_117           preprocessing/iprgc_117/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_118           preprocessing/iprgc_118/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_119           preprocessing/iprgc_119/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_120           preprocessing/iprgc_120/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_121           preprocessing/iprgc_121/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_122           preprocessing/iprgc_122/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_123                                                                                                         <NA>
## iprgc_124                                                                                                         <NA>
## iprgc_125                                                                                                         <NA>
## iprgc_126                                                                                                         <NA>
## iprgc_127                                                                                                         <NA>
## iprgc_128                                                                                                         <NA>
## iprgc_129                                                                                                         <NA>
##                                                                                                                                  symlink
## iprgc_62  preprocessing/preprocessing_new_taa/iprgc_62/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_63  preprocessing/preprocessing_new_taa/iprgc_63/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_64  preprocessing/preprocessing_new_taa/iprgc_64/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_65  preprocessing/preprocessing_new_taa/iprgc_65/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_67  preprocessing/preprocessing_new_taa/iprgc_67/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_68  preprocessing/preprocessing_new_taa/iprgc_68/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_69  preprocessing/preprocessing_new_taa/iprgc_69/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_70  preprocessing/preprocessing_new_taa/iprgc_70/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_71  preprocessing/preprocessing_new_taa/iprgc_71/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_72  preprocessing/preprocessing_new_taa/iprgc_72/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_73  preprocessing/preprocessing_new_taa/iprgc_73/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_74  preprocessing/preprocessing_new_taa/iprgc_74/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_75  preprocessing/preprocessing_new_taa/iprgc_75/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_76  preprocessing/preprocessing_new_taa/iprgc_76/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_77  preprocessing/preprocessing_new_taa/iprgc_77/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_81      preprocessing/preprocessing_taa/iprgc_81/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_82      preprocessing/preprocessing_taa/iprgc_82/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_83      preprocessing/preprocessing_taa/iprgc_83/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_84      preprocessing/preprocessing_taa/iprgc_84/Cogent/outputs/40hisat2_mm38_100/mm38_100_genome-paired_gene_sno_gene_ID.count.xz
## iprgc_85                                                                                                                            <NA>
## iprgc_86             preprocessing/preprocessing_taa/iprgc_85/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_87             preprocessing/preprocessing_taa/iprgc_86/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_88             preprocessing/preprocessing_taa/iprgc_87/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_89             preprocessing/preprocessing_taa/iprgc_88/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_90             preprocessing/preprocessing_taa/iprgc_89/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_91             preprocessing/preprocessing_taa/iprgc_90/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_92             preprocessing/preprocessing_taa/iprgc_91/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_93             preprocessing/preprocessing_taa/iprgc_92/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_94             preprocessing/preprocessing_taa/iprgc_93/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_95             preprocessing/preprocessing_taa/iprgc_94/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_96             preprocessing/preprocessing_taa/iprgc_95/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_97             preprocessing/preprocessing_taa/iprgc_96/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_98             preprocessing/preprocessing_taa/iprgc_97/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_99             preprocessing/preprocessing_taa/iprgc_98/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_100            preprocessing/preprocessing_taa/iprgc_99/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_101           preprocessing/preprocessing_taa/iprgc_100/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_102           preprocessing/preprocessing_taa/iprgc_101/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_104                                                                                                                           <NA>
## iprgc_105           preprocessing/preprocessing_taa/iprgc_103/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_106           preprocessing/preprocessing_taa/iprgc_104/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_107           preprocessing/preprocessing_taa/iprgc_105/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_108           preprocessing/preprocessing_taa/iprgc_106/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_109           preprocessing/preprocessing_taa/iprgc_107/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_110           preprocessing/preprocessing_taa/iprgc_108/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_111           preprocessing/preprocessing_taa/iprgc_109/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_112           preprocessing/preprocessing_taa/iprgc_110/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_113           preprocessing/preprocessing_taa/iprgc_111/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_114           preprocessing/preprocessing_taa/iprgc_112/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_115           preprocessing/preprocessing_taa/iprgc_113/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_116           preprocessing/preprocessing_taa/iprgc_114/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_117           preprocessing/preprocessing_taa/iprgc_115/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_118           preprocessing/preprocessing_taa/iprgc_116/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_119           preprocessing/preprocessing_taa/iprgc_117/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_120           preprocessing/preprocessing_taa/iprgc_118/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_121           preprocessing/preprocessing_taa/iprgc_119/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_122           preprocessing/preprocessing_taa/iprgc_120/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_123           preprocessing/preprocessing_taa/iprgc_121/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_124           preprocessing/preprocessing_taa/iprgc_122/outputs/40hisat2_mm38_100/mm38_100_genome-paired_sno_gene_gene_id.count.xz
## iprgc_125                                                                                                                           <NA>
## iprgc_126                                                                                                                           <NA>
## iprgc_127                                                                                                                           <NA>
## iprgc_128                                                                                                                           <NA>
## iprgc_129                                                                                                                           <NA>
##           totalreads trim1_both_surviving trim1_suriving_pct trim1_forward
## iprgc_62    21454044              7307772             0.3406      10575438
## iprgc_63    15326358              5673117             0.3702       8006539
## iprgc_64    18003256              6665716             0.3703       9518432
## iprgc_65    20929623              7076283             0.3381      10013788
## iprgc_67    15456881              5714266             0.3697       8184877
## iprgc_68    19666257              6900044             0.3509       9066997
## iprgc_69    16552894              6100310             0.3685       8839919
## iprgc_70    13740575              5066146             0.3687       7296079
## iprgc_71    15525499              6038811             0.3890       8406723
## iprgc_72    17094474              6541727             0.3827       9369448
## iprgc_73    15794837              6056416             0.3834       8661904
## iprgc_74    15775224              6094043             0.3863       8876775
## iprgc_75    16328183              6160227             0.3773       8655792
## iprgc_76    24180028              9053454             0.3744      13014766
## iprgc_77    17538867              5891680             0.3359       8619704
## iprgc_81    16532098              6408776             0.3877       8634609
## iprgc_82    15878311              5957695             0.3752       8664412
## iprgc_83    16082507              6370746             0.3961       8795845
## iprgc_84    15958920              6090563             0.3816       8659251
## iprgc_85          NA                   NA                 NA            NA
## iprgc_86          NA                   NA                 NA            NA
## iprgc_87          NA                   NA                 NA            NA
## iprgc_88          NA                   NA                 NA            NA
## iprgc_89          NA                   NA                 NA            NA
## iprgc_90          NA                   NA                 NA            NA
## iprgc_91          NA                   NA                 NA            NA
## iprgc_92          NA                   NA                 NA            NA
## iprgc_93          NA                   NA                 NA            NA
## iprgc_94          NA                   NA                 NA            NA
## iprgc_95          NA                   NA                 NA            NA
## iprgc_96          NA                   NA                 NA            NA
## iprgc_97          NA                   NA                 NA            NA
## iprgc_98          NA                   NA                 NA            NA
## iprgc_99          NA                   NA                 NA            NA
## iprgc_100         NA                   NA                 NA            NA
## iprgc_101         NA                   NA                 NA            NA
## iprgc_102         NA                   NA                 NA            NA
## iprgc_104         NA                   NA                 NA            NA
## iprgc_105         NA                   NA                 NA            NA
## iprgc_106         NA                   NA                 NA            NA
## iprgc_107         NA                   NA                 NA            NA
## iprgc_108         NA                   NA                 NA            NA
## iprgc_109         NA                   NA                 NA            NA
## iprgc_110         NA                   NA                 NA            NA
## iprgc_111         NA                   NA                 NA            NA
## iprgc_112         NA                   NA                 NA            NA
## iprgc_113         NA                   NA                 NA            NA
## iprgc_114         NA                   NA                 NA            NA
## iprgc_115         NA                   NA                 NA            NA
## iprgc_116         NA                   NA                 NA            NA
## iprgc_117         NA                   NA                 NA            NA
## iprgc_118         NA                   NA                 NA            NA
## iprgc_119         NA                   NA                 NA            NA
## iprgc_120         NA                   NA                 NA            NA
## iprgc_121         NA                   NA                 NA            NA
## iprgc_122         NA                   NA                 NA            NA
## iprgc_123         NA                   NA                 NA            NA
## iprgc_124         NA                   NA                 NA            NA
## iprgc_125         NA                   NA                 NA            NA
## iprgc_126         NA                   NA                 NA            NA
## iprgc_127         NA                   NA                 NA            NA
## iprgc_128         NA                   NA                 NA            NA
## iprgc_129         NA                   NA                 NA            NA
##           trim1_reverse trim1_dropped trim2_remaining trim2_surviving_pct
## iprgc_62         161944       3408890        19941862              0.9295
## iprgc_63         126447       1520255        14735531              0.9615
## iprgc_64         147975       1671133        17308611              0.9614
## iprgc_65         183633       3655919        19162876              0.9156
## iprgc_67         129987       1427751        14776608              0.9560
## iprgc_68         154410       3544806        18079308              0.9193
## iprgc_69         153735       1458930        15834102              0.9566
## iprgc_70         107844       1270506        13117568              0.9547
## iprgc_71         140419        939546        15001298              0.9662
## iprgc_72         148260       1035039        16587408              0.9703
## iprgc_73         139349        937168        15290737              0.9681
## iprgc_74         131880        672526        15327351              0.9716
## iprgc_75         155114       1357050        15648822              0.9584
## iprgc_76         212621       1899187        23269354              0.9623
## iprgc_77         126846       2900637        16006650              0.9126
## iprgc_81         160717       1327996        15768927              0.9538
## iprgc_82         137408       1118796        15308622              0.9641
## iprgc_83         137211        778705        15698279              0.9761
## iprgc_84         140920       1068186        15508709              0.9718
## iprgc_85             NA            NA              NA                  NA
## iprgc_86             NA            NA              NA                  NA
## iprgc_87             NA            NA              NA                  NA
## iprgc_88             NA            NA              NA                  NA
## iprgc_89             NA            NA              NA                  NA
## iprgc_90             NA            NA              NA                  NA
## iprgc_91             NA            NA              NA                  NA
## iprgc_92             NA            NA              NA                  NA
## iprgc_93             NA            NA              NA                  NA
## iprgc_94             NA            NA              NA                  NA
## iprgc_95             NA            NA              NA                  NA
## iprgc_96             NA            NA              NA                  NA
## iprgc_97             NA            NA              NA                  NA
## iprgc_98             NA            NA              NA                  NA
## iprgc_99             NA            NA              NA                  NA
## iprgc_100            NA            NA              NA                  NA
## iprgc_101            NA            NA              NA                  NA
## iprgc_102            NA            NA              NA                  NA
## iprgc_104            NA            NA              NA                  NA
## iprgc_105            NA            NA              NA                  NA
## iprgc_106            NA            NA              NA                  NA
## iprgc_107            NA            NA              NA                  NA
## iprgc_108            NA            NA              NA                  NA
## iprgc_109            NA            NA              NA                  NA
## iprgc_110            NA            NA              NA                  NA
## iprgc_111            NA            NA              NA                  NA
## iprgc_112            NA            NA              NA                  NA
## iprgc_113            NA            NA              NA                  NA
## iprgc_114            NA            NA              NA                  NA
## iprgc_115            NA            NA              NA                  NA
## iprgc_116            NA            NA              NA                  NA
## iprgc_117            NA            NA              NA                  NA
## iprgc_118            NA            NA              NA                  NA
## iprgc_119            NA            NA              NA                  NA
## iprgc_120            NA            NA              NA                  NA
## iprgc_121            NA            NA              NA                  NA
## iprgc_122            NA            NA              NA                  NA
## iprgc_123            NA            NA              NA                  NA
## iprgc_124            NA            NA              NA                  NA
## iprgc_125            NA            NA              NA                  NA
## iprgc_126            NA            NA              NA                  NA
## iprgc_127            NA            NA              NA                  NA
## iprgc_128            NA            NA              NA                  NA
## iprgc_129            NA            NA              NA                  NA
##           hisat_aligned_cogent_single hisat_aligned_cogent_multi
## iprgc_62                      4403419                    1083744
## iprgc_63                      3913257                    1576743
## iprgc_64                      8017462                    1026624
## iprgc_65                      9046156                    1156208
## iprgc_67                      5936037                    1208092
## iprgc_68                      3617748                     990881
## iprgc_69                     10915725                    1053089
## iprgc_70                      4302666                     866074
## iprgc_71                      5866688                    1181784
## iprgc_72                      6332063                    1423466
## iprgc_73                      5980501                    1233428
## iprgc_74                      9320058                    1156166
## iprgc_75                      8782932                    1128430
## iprgc_76                     13923768                    2032992
## iprgc_77                      4119038                     884696
## iprgc_81                      6300618                    1191976
## iprgc_82                      6276247                    1097569
## iprgc_83                      9641795                    3309802
## iprgc_84                      9095113                    2231760
## iprgc_85                           NA                         NA
## iprgc_86                           NA                         NA
## iprgc_87                           NA                         NA
## iprgc_88                           NA                         NA
## iprgc_89                           NA                         NA
## iprgc_90                           NA                         NA
## iprgc_91                           NA                         NA
## iprgc_92                           NA                         NA
## iprgc_93                           NA                         NA
## iprgc_94                           NA                         NA
## iprgc_95                           NA                         NA
## iprgc_96                           NA                         NA
## iprgc_97                           NA                         NA
## iprgc_98                           NA                         NA
## iprgc_99                           NA                         NA
## iprgc_100                          NA                         NA
## iprgc_101                          NA                         NA
## iprgc_102                          NA                         NA
## iprgc_104                          NA                         NA
## iprgc_105                          NA                         NA
## iprgc_106                          NA                         NA
## iprgc_107                          NA                         NA
## iprgc_108                          NA                         NA
## iprgc_109                          NA                         NA
## iprgc_110                          NA                         NA
## iprgc_111                          NA                         NA
## iprgc_112                          NA                         NA
## iprgc_113                          NA                         NA
## iprgc_114                          NA                         NA
## iprgc_115                          NA                         NA
## iprgc_116                          NA                         NA
## iprgc_117                          NA                         NA
## iprgc_118                          NA                         NA
## iprgc_119                          NA                         NA
## iprgc_120                          NA                         NA
## iprgc_121                          NA                         NA
## iprgc_122                          NA                         NA
## iprgc_123                          NA                         NA
## iprgc_124                          NA                         NA
## iprgc_125                          NA                         NA
## iprgc_126                          NA                         NA
## iprgc_127                          NA                         NA
## iprgc_128                          NA                         NA
## iprgc_129                          NA                         NA
##           hisat_aligned_cogent_pct rrna_aligned_single rrna_aligned_single_pct
## iprgc_62                    0.2558             9981295                  0.5581
## iprgc_63                    0.3582             8456038                  0.6181
## iprgc_64                    0.5024             5806861                  0.3588
## iprgc_65                    0.4875             4654006                  0.2723
## iprgc_67                    0.4622             6686073                  0.4810
## iprgc_68                    0.2343             8880676                  0.5562
## iprgc_69                    0.7231             1156001                  0.0774
## iprgc_70                    0.3762             5198926                  0.4205
## iprgc_71                    0.4540             8388194                  0.5807
## iprgc_72                    0.4537             8912327                  0.5601
## iprgc_73                    0.4567             8572959                  0.5825
## iprgc_74                    0.6641             4950093                  0.3306
## iprgc_75                    0.6070             3564544                  0.2406
## iprgc_76                    0.6599             4499355                  0.2039
## iprgc_77                    0.2853             5596546                  0.3857
## iprgc_81                    0.4532             7013653                  0.4662
## iprgc_82                    0.4644             4686722                  0.3205
## iprgc_83                    0.8053             2613957                  0.1723
## iprgc_84                    0.7098             2753845                  0.1867
## iprgc_85                        NA                  NA                      NA
## iprgc_86                        NA                  NA                      NA
## iprgc_87                        NA                  NA                      NA
## iprgc_88                        NA                  NA                      NA
## iprgc_89                        NA                  NA                      NA
## iprgc_90                        NA                  NA                      NA
## iprgc_91                        NA                  NA                      NA
## iprgc_92                        NA                  NA                      NA
## iprgc_93                        NA                  NA                      NA
## iprgc_94                        NA                  NA                      NA
## iprgc_95                        NA                  NA                      NA
## iprgc_96                        NA                  NA                      NA
## iprgc_97                        NA                  NA                      NA
## iprgc_98                        NA                  NA                      NA
## iprgc_99                        NA                  NA                      NA
## iprgc_100                       NA                  NA                      NA
## iprgc_101                       NA                  NA                      NA
## iprgc_102                       NA                  NA                      NA
## iprgc_104                       NA                  NA                      NA
## iprgc_105                       NA                  NA                      NA
## iprgc_106                       NA                  NA                      NA
## iprgc_107                       NA                  NA                      NA
## iprgc_108                       NA                  NA                      NA
## iprgc_109                       NA                  NA                      NA
## iprgc_110                       NA                  NA                      NA
## iprgc_111                       NA                  NA                      NA
## iprgc_112                       NA                  NA                      NA
## iprgc_113                       NA                  NA                      NA
## iprgc_114                       NA                  NA                      NA
## iprgc_115                       NA                  NA                      NA
## iprgc_116                       NA                  NA                      NA
## iprgc_117                       NA                  NA                      NA
## iprgc_118                       NA                  NA                      NA
## iprgc_119                       NA                  NA                      NA
## iprgc_120                       NA                  NA                      NA
## iprgc_121                       NA                  NA                      NA
## iprgc_122                       NA                  NA                      NA
## iprgc_123                       NA                  NA                      NA
## iprgc_124                       NA                  NA                      NA
## iprgc_125                       NA                  NA                      NA
## iprgc_126                       NA                  NA                      NA
## iprgc_127                       NA                  NA                      NA
## iprgc_128                       NA                  NA                      NA
## iprgc_129                       NA                  NA                      NA
##           rrna_aligned_multi rrna_aligned_multi_pct rrna_not_aligned
## iprgc_62              552408                 0.0309          7349507
## iprgc_63              554987                 0.0406          4668631
## iprgc_64              211357                 0.0131         10165930
## iprgc_65              186314                 0.0109         12249751
## iprgc_67              449142                 0.0323          6763928
## iprgc_68              464529                 0.0291          6621836
## iprgc_69               30867                 0.0021         13753361
## iprgc_70              301939                 0.0244          6861360
## iprgc_71              675994                 0.0468          5381346
## iprgc_72              784989                 0.0493          6213859
## iprgc_73              485581                 0.0330          5659780
## iprgc_74              506909                 0.0339          9513816
## iprgc_75              282107                 0.0190         10969368
## iprgc_76              444836                 0.0202         17124029
## iprgc_77              267421                 0.0184          8647417
## iprgc_81              334632                 0.0222          7695100
## iprgc_82              323766                 0.0221          9611619
## iprgc_83              139135                 0.0092         12413499
## iprgc_84              249586                 0.0169         11746383
## iprgc_85                  NA                     NA               NA
## iprgc_86                  NA                     NA               NA
## iprgc_87                  NA                     NA               NA
## iprgc_88                  NA                     NA               NA
## iprgc_89                  NA                     NA               NA
## iprgc_90                  NA                     NA               NA
## iprgc_91                  NA                     NA               NA
## iprgc_92                  NA                     NA               NA
## iprgc_93                  NA                     NA               NA
## iprgc_94                  NA                     NA               NA
## iprgc_95                  NA                     NA               NA
## iprgc_96                  NA                     NA               NA
## iprgc_97                  NA                     NA               NA
## iprgc_98                  NA                     NA               NA
## iprgc_99                  NA                     NA               NA
## iprgc_100                 NA                     NA               NA
## iprgc_101                 NA                     NA               NA
## iprgc_102                 NA                     NA               NA
## iprgc_104                 NA                     NA               NA
## iprgc_105                 NA                     NA               NA
## iprgc_106                 NA                     NA               NA
## iprgc_107                 NA                     NA               NA
## iprgc_108                 NA                     NA               NA
## iprgc_109                 NA                     NA               NA
## iprgc_110                 NA                     NA               NA
## iprgc_111                 NA                     NA               NA
## iprgc_112                 NA                     NA               NA
## iprgc_113                 NA                     NA               NA
## iprgc_114                 NA                     NA               NA
## iprgc_115                 NA                     NA               NA
## iprgc_116                 NA                     NA               NA
## iprgc_117                 NA                     NA               NA
## iprgc_118                 NA                     NA               NA
## iprgc_119                 NA                     NA               NA
## iprgc_120                 NA                     NA               NA
## iprgc_121                 NA                     NA               NA
## iprgc_122                 NA                     NA               NA
## iprgc_123                 NA                     NA               NA
## iprgc_124                 NA                     NA               NA
## iprgc_125                 NA                     NA               NA
## iprgc_126                 NA                     NA               NA
## iprgc_127                 NA                     NA               NA
## iprgc_128                 NA                     NA               NA
## iprgc_129                 NA                     NA               NA
##              rrna_not_aligned_pct hisat_single hisat_multi hisat_map_pct
## iprgc_62                    0.411      1848699      820527        0.1339
## iprgc_63                   0.3413      1487847      590756        0.1411
## iprgc_64                   0.6281      3115788      634919        0.2167
## iprgc_65                   0.7168      3497108      645740        0.2162
## iprgc_67                   0.4866      2410898      657348        0.2076
## iprgc_68                   0.4147      1693648      716559        0.1333
## iprgc_69                   0.9206      4103748      467294        0.2887
## iprgc_70                    0.555      1768274      466076        0.1703
## iprgc_71                   0.3725      2429963      731130        0.2107
## iprgc_72                   0.3905      2575448      795986        0.2033
## iprgc_73                   0.3845      2460492      708855        0.2073
## iprgc_74                   0.6355      3522006      601166        0.2690
## iprgc_75                   0.7404      3382787      555319        0.2517
## iprgc_76                    0.776      5278142      931930        0.2669
## iprgc_77                   0.5959      1670154      491774        0.1351
## iprgc_81                   0.5115      2673009      654361        0.2110
## iprgc_82                   0.6573      2443165      556951        0.1960
## iprgc_83                   0.8185      3764124     1427725        0.3307
## iprgc_84                   0.7964      3457750      987993        0.2867
## iprgc_85  LIKELY PCT mRNA CONTENT           NA          NA            NA
## iprgc_86                     <NA>           NA          NA            NA
## iprgc_87                     <NA>           NA          NA            NA
## iprgc_88                     <NA>           NA          NA            NA
## iprgc_89                     <NA>           NA          NA            NA
## iprgc_90                     <NA>           NA          NA            NA
## iprgc_91                     <NA>           NA          NA            NA
## iprgc_92                     <NA>           NA          NA            NA
## iprgc_93                     <NA>           NA          NA            NA
## iprgc_94                     <NA>           NA          NA            NA
## iprgc_95                     <NA>           NA          NA            NA
## iprgc_96                     <NA>           NA          NA            NA
## iprgc_97                     <NA>           NA          NA            NA
## iprgc_98                     <NA>           NA          NA            NA
## iprgc_99                     <NA>           NA          NA            NA
## iprgc_100                    <NA>           NA          NA            NA
## iprgc_101                    <NA>           NA          NA            NA
## iprgc_102                    <NA>           NA          NA            NA
## iprgc_104                    <NA>           NA          NA            NA
## iprgc_105                    <NA>           NA          NA            NA
## iprgc_106                    <NA>           NA          NA            NA
## iprgc_107                    <NA>           NA          NA            NA
## iprgc_108                    <NA>           NA          NA            NA
## iprgc_109                    <NA>           NA          NA            NA
## iprgc_110                    <NA>           NA          NA            NA
## iprgc_111                    <NA>           NA          NA            NA
## iprgc_112                    <NA>           NA          NA            NA
## iprgc_113                    <NA>           NA          NA            NA
## iprgc_114                    <NA>           NA          NA            NA
## iprgc_115                    <NA>           NA          NA            NA
## iprgc_116                    <NA>           NA          NA            NA
## iprgc_117                    <NA>           NA          NA            NA
## iprgc_118                    <NA>           NA          NA            NA
## iprgc_119                    <NA>           NA          NA            NA
## iprgc_120                    <NA>           NA          NA            NA
## iprgc_121                    <NA>           NA          NA            NA
## iprgc_122                    <NA>           NA          NA            NA
## iprgc_123                    <NA>           NA          NA            NA
## iprgc_124                    <NA>           NA          NA            NA
## iprgc_125                    <NA>           NA          NA            NA
## iprgc_126                    <NA>           NA          NA            NA
## iprgc_127                    <NA>           NA          NA            NA
## iprgc_128                    <NA>           NA          NA            NA
## iprgc_129                    <NA>           NA          NA            NA
##           hisat_mapped_total_reads projectah sampleah rashmissamplenameah
## iprgc_62                    0.1244     021_1       16    P15_Het_dLGN_S1A
## iprgc_63                    0.1356     021_1       17    P15_Het_dLGN_S2A
## iprgc_64                    0.2083     021_1        7     P15_Het_Ret_S1A
## iprgc_65                    0.1979     021_1        8     P15_Het_Ret_S2A
## iprgc_67                    0.1985     021_1       26     P15_Het_SCN_S2A
## iprgc_68                    0.1226     021_1       18     P15_KO_dLGN_S1A
## iprgc_69                    0.2761     021_1        9      P15_KO_Ret_S1A
## iprgc_70                    0.1626     021_1       27      P15_KO_SCN_S1A
## iprgc_71                    0.2036     021_1       12     P15_WT_dLGN_S1A
## iprgc_72                    0.1972     021_1       13     P15_WT_dLGN_S2A
## iprgc_73                    0.2007     021_1       14     P15_WT_dLGN_S3A
## iprgc_74                    0.2614     021_1        3      P15_WT_Ret_S1A
## iprgc_75                    0.2412     021_1        4      P15_WT_Ret_S2A
## iprgc_76                    0.2568     021_1        5      P15_WT_Ret_S3A
## iprgc_77                    0.1233     021_1       23      P15_WT_SCN_S3A
## iprgc_81                    0.2013     021_1       10      P8_WT_dLGN_S1A
## iprgc_82                    0.1889     021_1       11      P8_WT_dLGN_S2A
## iprgc_83                    0.3228     021_1        1       P8_WT_Ret_S1A
## iprgc_84                    0.2786     021_1        2       P8_WT_Ret_S2A
## iprgc_85                        NA     021_2       15       P8_KO_SCN_S1A
## iprgc_86                        NA     021_2       13       P8_KO_Ret_S1A
## iprgc_87                        NA     021_2       14      P8_KO_dLGN_S1A
## iprgc_88                        NA     021_2        8     P8_Het_dLGN_S1A
## iprgc_89                        NA     021_2        9      P8_Het_SCN_S1A
## iprgc_90                        NA     021_2        7      P8_Het_Ret_S1A
## iprgc_91                        NA     021_2        1       P8_WT_Ret_S1A
## iprgc_92                        NA     021_2        2      P8_WT_dLGN_S1A
## iprgc_93                        NA     021_2        3       P8_WT_SCN_S1A
## iprgc_94                        NA     021_2       20    P15_Het_dLGN_S1B
## iprgc_95                        NA     021_2       21     P15_Het_SCN_S1B
## iprgc_96                        NA     021_2       19     P15_Het_Ret_S1B
## iprgc_97                        NA     021_2        6      P15_WT_SCN_S1A
## iprgc_98                        NA     021_2        5     P15_WT_dLGN_S1A
## iprgc_99                        NA     021_2        4      P15_WT_Ret_S1A
## iprgc_100                       NA     021_2       17     P15_KO_dLGN_S1A
## iprgc_101                       NA     021_2       16      P15_KO_Ret_S1A
## iprgc_102                       NA     021_2       18      P15_KO_SCN_S1A
## iprgc_104                       NA     021_3      13b      P8_Het_dLGN_S2
## iprgc_105                       NA     021_3      14b      P8_Het_dLGN_S3
## iprgc_106                       NA     021_3      15b     P15_Het_dLGN_S2
## iprgc_107                       NA     021_3       16       P8_KO_dLGN_S2
## iprgc_108                       NA     021_3       18      P15_KO_dLGN_S2
## iprgc_109                       NA     021_3       1b        P8_WT_Ret_S2
## iprgc_110                       NA     021_3      22b       P8_Het_SCN_S2
## iprgc_111                       NA     021_3      23b       P8_Het_SCN_S3
## iprgc_112                       NA     021_3      24b      P15_Het_SCN_S2
## iprgc_113                       NA     021_3       25        P8_KO_SCN_S2
## iprgc_114                       NA     021_3       27       P15_KO_SCN_S2
## iprgc_115                       NA     021_3       2b        P8_WT_Ret_S3
## iprgc_116                       NA     021_3       3b       P15_WT_Ret_S3
## iprgc_117                       NA     021_3       4b       P8_Het_Ret_S2
## iprgc_118                       NA     021_3        5       P8_Het_Ret_S3
## iprgc_119                       NA     021_3       6b      P15_Het_Ret_S2
## iprgc_120                       NA     021_3        7        P8_KO_Ret_S2
## iprgc_121                       NA     021_3        8        P8_KO_Ret_S3
## iprgc_122                       NA     021_3        9       P15_KO_Ret_S2
## iprgc_123                       NA     021_3       17       P8_KO_dLGN_S3
## iprgc_124                       NA     021_3       26        P8_KO_SCN_S3
## iprgc_125                       NA     021_3      10c       P8_WT_dLGN_S2
## iprgc_126                       NA     021_3      11c       P8_WT_dLGN_S3
## iprgc_127                       NA     021_3      12b      P15_WT_dLGN_S3
## iprgc_128                       NA     021_3      19c        P8_WT_SCN_S2
## iprgc_129                       NA     021_3      20c        P8_WT_SCN_S3
##           libraryprepcleanupah                         sequencingrunah
## iprgc_62            successful             220517_VL00136_33_AAC23JWM5
## iprgc_63            successful             220517_VL00136_33_AAC23JWM5
## iprgc_64            successful             220517_VL00136_33_AAC23JWM5
## iprgc_65            successful             220517_VL00136_33_AAC23JWM5
## iprgc_67            successful             220517_VL00136_33_AAC23JWM5
## iprgc_68            successful             220517_VL00136_33_AAC23JWM5
## iprgc_69            successful             220517_VL00136_33_AAC23JWM5
## iprgc_70            successful             220517_VL00136_33_AAC23JWM5
## iprgc_71            successful             220517_VL00136_33_AAC23JWM5
## iprgc_72            successful             220517_VL00136_33_AAC23JWM5
## iprgc_73            successful             220517_VL00136_33_AAC23JWM5
## iprgc_74            successful             220517_VL00136_33_AAC23JWM5
## iprgc_75            successful             220517_VL00136_33_AAC23JWM5
## iprgc_76            successful             220517_VL00136_33_AAC23JWM5
## iprgc_77            successful             220517_VL00136_33_AAC23JWM5
## iprgc_81            successful             220517_VL00136_33_AAC23JWM5
## iprgc_82            successful             220517_VL00136_33_AAC23JWM5
## iprgc_83            successful             220517_VL00136_33_AAC23JWM5
## iprgc_84            successful             220517_VL00136_33_AAC23JWM5
## iprgc_85            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_86            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_87            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_88            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_89            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_90            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_91            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_92            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_93            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_94            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_95            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_96            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_97            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_98            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_99            successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_100           successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_101           successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_102           successful 230412_VL00136_54_AACLVMTM5/Analysis/2/
## iprgc_104           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_105           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_106           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_107           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_108           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_109           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_110           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_111           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_112           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_113           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_114           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_115           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_116           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_117           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_118           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_119           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_120           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_121           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_122           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_123           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
## iprgc_124           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_125           successful 231004_VL00136_73_AACWYG2M5/Analysis/1/
## iprgc_126           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
## iprgc_127           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
## iprgc_128           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
## iprgc_129           successful 231006_VL00136_74_AACY7TGM5/Analysis/1/
##                                             read1ah
## iprgc_62       P15_Het_dLGN_S1A_S16_R1_001.fastq.gz
## iprgc_63       P15_Het_dLGN_S2A_S17_R1_001.fastq.gz
## iprgc_64         P15_Het_Ret_S1A_S7_R1_001.fastq.gz
## iprgc_65         P15_Het_Ret_S2A_S8_R1_001.fastq.gz
## iprgc_67        P15_Het_SCN_S2A_S22_R1_001.fastq.gz
## iprgc_68        P15_KO_dLGN_S1A_S18_R1_001.fastq.gz
## iprgc_69          P15_KO_Ret_S1A_S9_R1_001.fastq.gz
## iprgc_70         P15_KO_SCN_S1A_S23_R1_001.fastq.gz
## iprgc_71        P15_WT_dLGN_S1A_S12_R1_001.fastq.gz
## iprgc_72        P15_WT_dLGN_S2A_S13_R1_001.fastq.gz
## iprgc_73        P15_WT_dLGN_S3A_S14_R1_001.fastq.gz
## iprgc_74          P15_WT_Ret_S1A_S3_R1_001.fastq.gz
## iprgc_75          P15_WT_Ret_S2A_S4_R1_001.fastq.gz
## iprgc_76          P15_WT_Ret_S3A_S5_R1_001.fastq.gz
## iprgc_77         P15_WT_SCN_S3A_S19_R1_001.fastq.gz
## iprgc_81         P8_WT_dLGN_S1A_S10_R1_001.fastq.gz
## iprgc_82         P8_WT_dLGN_S2A_S11_R1_001.fastq.gz
## iprgc_83           P8_WT_Ret_S1A_S1_R1_001.fastq.gz
## iprgc_84           P8_WT_Ret_S2A_S2_R1_001.fastq.gz
## iprgc_85     P8_KO_SCN_S1A_S12_L001_R1_001.fastq.gz
## iprgc_86     P8_KO_Ret_S1A_S10_L001_R1_001.fastq.gz
## iprgc_87    P8_KO_dLGN_S1A_S11_L001_R1_001.fastq.gz
## iprgc_88    P8_Het_dLGN_S1A_S8_L001_R1_001.fastq.gz
## iprgc_89     P8_Het_SCN_S1A_S9_L001_R1_001.fastq.gz
## iprgc_90     P8_Het_Ret_S1A_S7_L001_R1_001.fastq.gz
## iprgc_91      P8_WT_Ret_S1A_S1_L001_R1_001.fastq.gz
## iprgc_92     P8_WT_dLGN_S1A_S2_L001_R1_001.fastq.gz
## iprgc_93      P8_WT_SCN_S1A_S3_L001_R1_001.fastq.gz
## iprgc_94  P15_Het_dLGN_S1B_S17_L001_R1_001.fastq.gz
## iprgc_95   P15_Het_SCN_S1B_S18_L001_R1_001.fastq.gz
## iprgc_96   P15_Het_Ret_S1B_S16_L001_R1_001.fastq.gz
## iprgc_97     P15_WT_SCN_S1A_S6_L001_R1_001.fastq.gz
## iprgc_98    P15_WT_dLGN_S1A_S5_L001_R1_001.fastq.gz
## iprgc_99     P15_WT_Ret_S1A_S4_L001_R1_001.fastq.gz
## iprgc_100  P15_KO_dLGN_S1A_S14_L001_R1_001.fastq.gz
## iprgc_101   P15_KO_Ret_S1A_S13_L001_R1_001.fastq.gz
## iprgc_102   P15_KO_SCN_S1A_S15_L001_R1_001.fastq.gz
## iprgc_104     13b_P8_Het_dLGN_S2_S6_R1_001.fastq.gz
## iprgc_105     14b_P8_Het_dLGN_S3_S7_R1_001.fastq.gz
## iprgc_106    15b_P15_Het_dLGN_S2_S8_R1_001.fastq.gz
## iprgc_107       16_P8_KO_dLGN_S2_S9_R1_001.fastq.gz
## iprgc_108     18_P15_KO_dLGN_S2_S10_R1_001.fastq.gz
## iprgc_109       1b_P8_WT_Ret_S2_S16_R1_001.fastq.gz
## iprgc_110     22b_P8_Het_SCN_S2_S11_R1_001.fastq.gz
## iprgc_111     23b_P8_Het_SCN_S3_S12_R1_001.fastq.gz
## iprgc_112    24b_P15_Het_SCN_S2_S13_R1_001.fastq.gz
## iprgc_113       25_P8_KO_SCN_S2_S14_R1_001.fastq.gz
## iprgc_114      27_P15_KO_SCN_S2_S15_R1_001.fastq.gz
## iprgc_115       2b_P8_WT_Ret_S3_S17_R1_001.fastq.gz
## iprgc_116      3b_P15_WT_Ret_S3_S18_R1_001.fastq.gz
## iprgc_117       4b_P8_Het_Ret_S2_S1_R1_001.fastq.gz
## iprgc_118        5_P8_Het_Ret_S3_S2_R1_001.fastq.gz
## iprgc_119      6b_P15_Het_Ret_S2_S3_R1_001.fastq.gz
## iprgc_120         7_P8_KO_Ret_S2_S4_R1_001.fastq.gz
## iprgc_121        8_P8_KO_Ret_S3_S19_R1_001.fastq.gz
## iprgc_122        9_P15_KO_Ret_S2_S5_R1_001.fastq.gz
## iprgc_123       17_P8_KO_dLGN_S3_S3_R1_001.fastq.gz
## iprgc_124        26_P8_KO_SCN_S3_S7_R1_001.fastq.gz
## iprgc_125     10c_P8_WT_dLGN_S2_S20_R1_001.fastq.gz
## iprgc_126      11c_P8_WT_dLGN_S3_S1_R1_001.fastq.gz
## iprgc_127     12b_P15_WT_dLGN_S3_S2_R1_001.fastq.gz
## iprgc_128       19c_P8_WT_SCN_S2_S4_R1_001.fastq.gz
## iprgc_129       20c_P8_WT_SCN_S3_S5_R1_001.fastq.gz
##                                             read2ah       downloadmapagain
## iprgc_62       P15_Het_dLGN_S1A_S16_R2_001.fastq.gz                   <NA>
## iprgc_63       P15_Het_dLGN_S2A_S17_R2_001.fastq.gz                   <NA>
## iprgc_64         P15_Het_Ret_S1A_S7_R2_001.fastq.gz                   <NA>
## iprgc_65         P15_Het_Ret_S2A_S8_R2_001.fastq.gz                   <NA>
## iprgc_67        P15_Het_SCN_S2A_S22_R2_001.fastq.gz                   <NA>
## iprgc_68        P15_KO_dLGN_S1A_S18_R2_001.fastq.gz                   <NA>
## iprgc_69          P15_KO_Ret_S1A_S9_R2_001.fastq.gz                   <NA>
## iprgc_70         P15_KO_SCN_S1A_S23_R2_001.fastq.gz                   <NA>
## iprgc_71        P15_WT_dLGN_S1A_S12_R2_001.fastq.gz                   <NA>
## iprgc_72        P15_WT_dLGN_S2A_S13_R2_001.fastq.gz                   <NA>
## iprgc_73        P15_WT_dLGN_S3A_S14_R2_001.fastq.gz                   <NA>
## iprgc_74          P15_WT_Ret_S1A_S3_R2_001.fastq.gz                   <NA>
## iprgc_75          P15_WT_Ret_S2A_S4_R2_001.fastq.gz                   <NA>
## iprgc_76          P15_WT_Ret_S3A_S5_R2_001.fastq.gz                   <NA>
## iprgc_77         P15_WT_SCN_S3A_S19_R2_001.fastq.gz                   <NA>
## iprgc_81         P8_WT_dLGN_S1A_S10_R2_001.fastq.gz                   <NA>
## iprgc_82         P8_WT_dLGN_S2A_S11_R2_001.fastq.gz                   <NA>
## iprgc_83           P8_WT_Ret_S1A_S1_R2_001.fastq.gz                   <NA>
## iprgc_84           P8_WT_Ret_S2A_S2_R2_001.fastq.gz                   <NA>
## iprgc_85     P8_KO_SCN_S1A_S12_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_86     P8_KO_Ret_S1A_S10_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_87    P8_KO_dLGN_S1A_S11_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_88    P8_Het_dLGN_S1A_S8_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_89     P8_Het_SCN_S1A_S9_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_90     P8_Het_Ret_S1A_S7_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_91      P8_WT_Ret_S1A_S1_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_92     P8_WT_dLGN_S1A_S2_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_93      P8_WT_SCN_S1A_S3_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_94  P15_Het_dLGN_S1B_S17_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_95   P15_Het_SCN_S1B_S18_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_96   P15_Het_Ret_S1B_S16_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_97     P15_WT_SCN_S1A_S6_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_98    P15_WT_dLGN_S1A_S5_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_99     P15_WT_Ret_S1A_S4_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_100  P15_KO_dLGN_S1A_S14_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_101   P15_KO_Ret_S1A_S13_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_102   P15_KO_SCN_S1A_S15_L001_R2_001.fastq.gz    yes, repeated demux
## iprgc_104     13b_P8_Het_dLGN_S2_S6_R2_001.fastq.gz                   <NA>
## iprgc_105     14b_P8_Het_dLGN_S3_S7_R2_001.fastq.gz                   <NA>
## iprgc_106    15b_P15_Het_dLGN_S2_S8_R2_001.fastq.gz                   <NA>
## iprgc_107       16_P8_KO_dLGN_S2_S9_R2_001.fastq.gz                   <NA>
## iprgc_108     18_P15_KO_dLGN_S2_S10_R2_001.fastq.gz                   <NA>
## iprgc_109       1b_P8_WT_Ret_S2_S16_R2_001.fastq.gz                   <NA>
## iprgc_110     22b_P8_Het_SCN_S2_S11_R2_001.fastq.gz                   <NA>
## iprgc_111     23b_P8_Het_SCN_S3_S12_R2_001.fastq.gz                   <NA>
## iprgc_112    24b_P15_Het_SCN_S2_S13_R2_001.fastq.gz                   <NA>
## iprgc_113       25_P8_KO_SCN_S2_S14_R2_001.fastq.gz                   <NA>
## iprgc_114      27_P15_KO_SCN_S2_S15_R2_001.fastq.gz                   <NA>
## iprgc_115       2b_P8_WT_Ret_S3_S17_R2_001.fastq.gz                   <NA>
## iprgc_116      3b_P15_WT_Ret_S3_S18_R2_001.fastq.gz                   <NA>
## iprgc_117       4b_P8_Het_Ret_S2_S1_R2_001.fastq.gz                   <NA>
## iprgc_118        5_P8_Het_Ret_S3_S2_R2_001.fastq.gz                   <NA>
## iprgc_119      6b_P15_Het_Ret_S2_S3_R2_001.fastq.gz                   <NA>
## iprgc_120         7_P8_KO_Ret_S2_S4_R2_001.fastq.gz                   <NA>
## iprgc_121        8_P8_KO_Ret_S3_S19_R2_001.fastq.gz                   <NA>
## iprgc_122        9_P15_KO_Ret_S2_S5_R2_001.fastq.gz                   <NA>
## iprgc_123       17_P8_KO_dLGN_S3_S3_R2_001.fastq.gz                   <NA>
## iprgc_124        26_P8_KO_SCN_S3_S7_R2_001.fastq.gz                   <NA>
## iprgc_125     10c_P8_WT_dLGN_S2_S20_R2_001.fastq.gz yes, same file renamed
## iprgc_126      11c_P8_WT_dLGN_S3_S1_R2_001.fastq.gz yes, same file renamed
## iprgc_127     12b_P15_WT_dLGN_S3_S2_R2_001.fastq.gz                   <NA>
## iprgc_128       19c_P8_WT_SCN_S2_S4_R2_001.fastq.gz yes, same file renamed
## iprgc_129       20c_P8_WT_SCN_S3_S5_R2_001.fastq.gz yes, same file renamed
##           genotype_atb location_atb time_atb geno_loc_atb
## iprgc_62           het         dlgn      p15     het_dlgn
## iprgc_63           het         dlgn      p15     het_dlgn
## iprgc_64           het       retina      p15   het_retina
## iprgc_65           het       retina      p15   het_retina
## iprgc_67           het          scn      p15      het_scn
## iprgc_68            ko         dlgn      p15      ko_dlgn
## iprgc_69            ko       retina      p15    ko_retina
## iprgc_70            ko          scn      p15       ko_scn
## iprgc_71            wt         dlgn      p15      wt_dlgn
## iprgc_72            wt         dlgn      p15      wt_dlgn
## iprgc_73            wt         dlgn      p15      wt_dlgn
## iprgc_74            wt       retina      p15    wt_retina
## iprgc_75            wt       retina      p15    wt_retina
## iprgc_76            wt       retina      p15    wt_retina
## iprgc_77            wt          scn      p15       wt_scn
## iprgc_81            wt         dlgn      p08      wt_dlgn
## iprgc_82            wt         dlgn      p08      wt_dlgn
## iprgc_83            wt       retina      p08    wt_retina
## iprgc_84            wt       retina      p08    wt_retina
## iprgc_85            ko          scn      p08       ko_scn
## iprgc_86            ko       retina      p08    ko_retina
## iprgc_87            ko         dlgn      p08      ko_dlgn
## iprgc_88           het         dlgn      p08     het_dlgn
## iprgc_89           het          scn      p08      het_scn
## iprgc_90           het       retina      p08   het_retina
## iprgc_91            wt       retina      p08    wt_retina
## iprgc_92            wt         dlgn      p08      wt_dlgn
## iprgc_93            wt          scn      p08       wt_scn
## iprgc_94           het         dlgn      p15     het_dlgn
## iprgc_95           het          scn      p15      het_scn
## iprgc_96           het       retina      p15   het_retina
## iprgc_97            wt          scn      p15       wt_scn
## iprgc_98            wt         dlgn      p15      wt_dlgn
## iprgc_99            wt       retina      p15    wt_retina
## iprgc_100           ko         dlgn      p15      ko_dlgn
## iprgc_101           ko       retina      p15    ko_retina
## iprgc_102           ko          scn      p15       ko_scn
## iprgc_104          het         dlgn      p08     het_dlgn
## iprgc_105          het         dlgn      p08     het_dlgn
## iprgc_106          het         dlgn      p15     het_dlgn
## iprgc_107           ko         dlgn      p08      ko_dlgn
## iprgc_108           ko         dlgn      p15      ko_dlgn
## iprgc_109           wt       retina      p08    wt_retina
## iprgc_110          het          scn      p08      het_scn
## iprgc_111          het          scn      p08      het_scn
## iprgc_112          het          scn      p15      het_scn
## iprgc_113           ko          scn      p08       ko_scn
## iprgc_114           ko          scn      p15       ko_scn
## iprgc_115           wt       retina      p08    wt_retina
## iprgc_116           wt       retina      p15    wt_retina
## iprgc_117          het       retina      p08   het_retina
## iprgc_118          het       retina      p08   het_retina
## iprgc_119          het       retina      p15   het_retina
## iprgc_120           ko       retina      p08    ko_retina
## iprgc_121           ko       retina      p08    ko_retina
## iprgc_122           ko       retina      p15    ko_retina
## iprgc_123           ko         dlgn      p08      ko_dlgn
## iprgc_124           ko          scn      p08       ko_scn
## iprgc_125           wt         dlgn      p08      wt_dlgn
## iprgc_126           wt         dlgn      p08      wt_dlgn
## iprgc_127           wt         dlgn      p15      wt_dlgn
## iprgc_128           wt          scn      p08       wt_scn
## iprgc_129           wt          scn      p08       wt_scn
##           time_geno_location_source_atb rashmi_code atb_observed_location
## iprgc_62                    AH filename         S1A                  dlgn
## iprgc_63                    AH filename         S2A                  dlgn
## iprgc_64                    AH filename         S1A                retina
## iprgc_65                    AH filename         S2A                retina
## iprgc_67                    AH filename         S2A                   scn
## iprgc_68                    AH filename         S1A                  dlgn
## iprgc_69                    AH filename         S1A                retina
## iprgc_70                    AH filename         S1A                   scn
## iprgc_71                    AH filename         S1A                  dlgn
## iprgc_72                    AH filename         S2A                  dlgn
## iprgc_73                    AH filename         S3A                  dlgn
## iprgc_74                    AH filename         S1A                retina
## iprgc_75                    AH filename         S2A                retina
## iprgc_76                    AH filename         S3A                retina
## iprgc_77                    AH filename         S3A                   scn
## iprgc_81                    AH filename         S1A                  dlgn
## iprgc_82                    AH filename         S2A                  dlgn
## iprgc_83                    AH filename         S1A                retina
## iprgc_84                    AH filename         S2A                retina
## iprgc_85                    AH filename         S1A                   scn
## iprgc_86                    AH filename         S1A                retina
## iprgc_87                    AH filename         S1A                  dlgn
## iprgc_88                    AH filename         S1A                  dlgn
## iprgc_89                    AH filename         S1A                   scn
## iprgc_90                    AH filename         S1A                retina
## iprgc_91                    AH filename         S1A                retina
## iprgc_92                    AH filename         S1A                  dlgn
## iprgc_93                    AH filename         S1A                   scn
## iprgc_94                    AH filename         S1B                  dlgn
## iprgc_95                    AH filename         S1B                   scn
## iprgc_96                    AH filename         S1B                retina
## iprgc_97                    AH filename         S1A                   scn
## iprgc_98                    AH filename         S1A                  dlgn
## iprgc_99                    AH filename         S1A                retina
## iprgc_100                   AH filename         S1A                  dlgn
## iprgc_101                   AH filename         S1A                retina
## iprgc_102                   AH filename         S1A                   scn
## iprgc_104                   AH filename          S2                  dlgn
## iprgc_105                   AH filename          S3                  dlgn
## iprgc_106                   AH filename          S2                  dlgn
## iprgc_107                   AH filename          S2                  dlgn
## iprgc_108                   AH filename          S2                  dlgn
## iprgc_109                   AH filename          S2                retina
## iprgc_110                   AH filename          S2                   scn
## iprgc_111                   AH filename          S3                   scn
## iprgc_112                   AH filename          S2                   scn
## iprgc_113                   AH filename          S2                   scn
## iprgc_114                   AH filename          S2                   scn
## iprgc_115                   AH filename          S3                retina
## iprgc_116                   AH filename          S3                retina
## iprgc_117                   AH filename          S2                retina
## iprgc_118                   AH filename          S3                retina
## iprgc_119                   AH filename          S2                retina
## iprgc_120                   AH filename          S2                retina
## iprgc_121                   AH filename          S3                retina
## iprgc_122                   AH filename          S2                retina
## iprgc_123                   AH filename          S3                  dlgn
## iprgc_124                   AH filename          S3                   scn
## iprgc_125                   AH filename          S2                  dlgn
## iprgc_126                   AH filename          S3                  dlgn
## iprgc_127                   AH filename          S3                  dlgn
## iprgc_128                   AH filename          S2                   scn
## iprgc_129                   AH filename          S3                   scn
##           hisat_rrna_input_reads hisat_rrna_single_concordant
## iprgc_62                21454044                      1494615
## iprgc_63                15326358                      1079397
## iprgc_64                18003256                       942929
## iprgc_65                20929623                      1195387
## iprgc_67                15456881                      1000025
## iprgc_68                19666257                      1628156
## iprgc_69                16552894                       218644
## iprgc_70                13740575                       700257
## iprgc_71                15525499                      1082720
## iprgc_72                17094474                      1425296
## iprgc_73                15794837                      1285122
## iprgc_74                15775224                       790535
## iprgc_75                16328183                       877539
## iprgc_76                24180028                      1385985
## iprgc_77                17538867                      1050779
## iprgc_81                16532098                       940095
## iprgc_82                15878311                       796807
## iprgc_83                16082507                       868003
## iprgc_84                15958920                      1050174
## iprgc_85                23680086                      1148981
## iprgc_86                20389649                       361882
## iprgc_87                27526146                       540391
## iprgc_88                29895877                      1190844
## iprgc_89                23361256                       920771
## iprgc_90                31543306                       435071
## iprgc_91                15758794                       209248
## iprgc_92                22313362                      1157698
## iprgc_93                20934807                      1036076
## iprgc_94                28090789                       532208
## iprgc_95                23462476                      1217287
## iprgc_96                14804663                       466300
## iprgc_97                22863130                       904924
## iprgc_98                19915507                       557667
## iprgc_99                14724866                       175966
## iprgc_100               32782165                       542666
## iprgc_101               15390215                       203176
## iprgc_102               28578632                       857116
## iprgc_104               30192805                      1038732
## iprgc_105               24528770                       523240
## iprgc_106               30802656                       390802
## iprgc_107               42462593                       642551
## iprgc_108               28855525                       290520
## iprgc_109               21695810                       338445
## iprgc_110               22927463                      1066764
## iprgc_111               18467297                       412625
## iprgc_112               19036600                       728033
## iprgc_113               27601259                      1056238
## iprgc_114               18638104                       583967
## iprgc_115               17237384                       375309
## iprgc_116               17447459                       353770
## iprgc_117               17248353                       341716
## iprgc_118               21315056                       288212
## iprgc_119               14188002                       228078
## iprgc_120               31820880                       472691
## iprgc_121               27191863                       569880
## iprgc_122               19422096                       531934
## iprgc_123               40849547                      1075990
## iprgc_124               36378912                      1062383
## iprgc_125               16749234                       416587
## iprgc_126               22769305                       832691
## iprgc_127               23091824                      1023687
## iprgc_128               18824955                       582920
## iprgc_129               22427478                       844116
##           hisat_rrna_multi_concordant hisat_rrna_percent_log
## iprgc_62                       170903                   9.87
## iprgc_63                       182361                  10.21
## iprgc_64                        72737                   7.10
## iprgc_65                        58167                   7.67
## iprgc_67                       108729                   8.15
## iprgc_68                       207235                  12.00
## iprgc_69                         9877                   1.70
## iprgc_70                        63502                   7.06
## iprgc_71                       152436                   8.98
## iprgc_72                       246982                  11.13
## iprgc_73                       112863                  10.09
## iprgc_74                       165241                   6.98
## iprgc_75                        96091                   7.52
## iprgc_76                       199842                   7.78
## iprgc_77                        62228                   8.34
## iprgc_81                        77689                   7.16
## iprgc_82                       135429                   6.84
## iprgc_83                        80352                   6.40
## iprgc_84                       123392                   8.46
## iprgc_85                        28569                   5.28
## iprgc_86                        13164                   2.05
## iprgc_87                        18367                   2.34
## iprgc_88                        61380                   4.59
## iprgc_89                        54031                   4.54
## iprgc_90                        13601                   1.60
## iprgc_91                         7450                   1.52
## iprgc_92                        20834                   5.61
## iprgc_93                        29031                   5.39
## iprgc_94                        16914                   2.29
## iprgc_95                        22019                   5.58
## iprgc_96                         5493                   3.70
## iprgc_97                         8510                   4.24
## iprgc_98                        25539                   3.24
## iprgc_99                         6598                   1.34
## iprgc_100                       13043                   1.94
## iprgc_101                        3309                   1.47
## iprgc_102                       11792                   3.22
## iprgc_104                       64300                   3.96
## iprgc_105                       27174                   2.46
## iprgc_106                       12427                   1.45
## iprgc_107                       30617                   1.83
## iprgc_108                       16803                   1.22
## iprgc_109                       32087                   1.92
## iprgc_110                       20754                   5.02
## iprgc_111                        8062                   2.43
## iprgc_112                        7478                   4.01
## iprgc_113                       62800                   4.36
## iprgc_114                       11141                   3.34
## iprgc_115                       30362                   2.60
## iprgc_116                       17307                   2.28
## iprgc_117                       10292                   2.18
## iprgc_118                        7457                   1.51
## iprgc_119                        6462                   1.75
## iprgc_120                       25071                   1.74
## iprgc_121                       48212                   2.58
## iprgc_122                       17048                   2.97
## iprgc_123                       86504                   3.33
## iprgc_124                       41027                   3.35
## iprgc_125                       21674                   2.79
## iprgc_126                       50917                   4.12
## iprgc_127                       38479                   4.85
## iprgc_128                       15517                   3.37
## iprgc_129                       37915                   4.18
##           hisat_genome_input_reads hisat_genome_single_concordant
## iprgc_62                  21454044                        6916109
## iprgc_63                  15326358                        4800437
## iprgc_64                  18003256                       10070534
## iprgc_65                  20929623                       11589175
## iprgc_67                  15456881                        6852704
## iprgc_68                  19666257                        6195592
## iprgc_69                  16552894                       12430776
## iprgc_70                  13740575                        4854312
## iprgc_71                  15525499                        6307451
## iprgc_72                  17094474                        7451652
## iprgc_73                  15794837                        6837350
## iprgc_74                  15775224                       10294290
## iprgc_75                  16328183                       10436993
## iprgc_76                  24180028                       16183985
## iprgc_77                  17538867                        5292791
## iprgc_81                  16532098                        7331009
## iprgc_82                  15878311                        7230838
## iprgc_83                  16082507                       10368657
## iprgc_84                  15958920                       10423523
## iprgc_85                  23680086                        7062000
## iprgc_86                  20389649                        9744114
## iprgc_87                  27526146                        6400394
## iprgc_88                  29895877                        7820843
## iprgc_89                  23361256                        9311252
## iprgc_90                  31543306                       15756309
## iprgc_91                  15758794                        9961930
## iprgc_92                  22313362                        8488862
## iprgc_93                  20934807                        7567968
## iprgc_94                  28090789                        7057050
## iprgc_95                  23462476                        7263554
## iprgc_96                  14804663                        7876687
## iprgc_97                  22863130                        9533254
## iprgc_98                  19915507                        9711144
## iprgc_99                  14724866                       11249606
## iprgc_100                 32782165                       10087273
## iprgc_101                 15390215                        9017104
## iprgc_102                 28578632                       13515552
## iprgc_104                 30192805                        9350995
## iprgc_105                 24528770                       10945760
## iprgc_106                 30802656                       11899403
## iprgc_107                 42462593                        8808064
## iprgc_108                 28855525                       11980044
## iprgc_109                 21695810                       14589076
## iprgc_110                 22927463                        9892455
## iprgc_111                 18467297                       12034265
## iprgc_112                 19036600                       13305746
## iprgc_113                 27601259                       10183581
## iprgc_114                 18638104                       12163422
## iprgc_115                 17237384                       11843723
## iprgc_116                 17447459                       13256126
## iprgc_117                 17248353                       11047279
## iprgc_118                 21315056                       12744260
## iprgc_119                 14188002                       10134357
## iprgc_120                 31820880                       15877669
## iprgc_121                 27191863                       13093932
## iprgc_122                 19422096                       14110700
## iprgc_123                 40849547                        8776567
## iprgc_124                 36378912                        9684862
## iprgc_125                 16749234                       11928896
## iprgc_126                 22769305                       12094389
## iprgc_127                 23091824                       13279963
## iprgc_128                 18824955                       11728805
## iprgc_129                 22427478                       12119656
##           hisat_genome_multi_concordant hisat_genome_single_all
## iprgc_62                        2449957                 2717057
## iprgc_63                        1878557                 1916047
## iprgc_64                        1696641                 1839841
## iprgc_65                        1959086                 1724647
## iprgc_67                        1833302                 1796579
## iprgc_68                        2199833                 2603068
## iprgc_69                        1371549                  740962
## iprgc_70                        1398244                 1487798
## iprgc_71                        2081493                 1848749
## iprgc_72                        2373441                 1919972
## iprgc_73                        2140999                 2007277
## iprgc_74                        1585605                 1563688
## iprgc_75                        1752174                 1352026
## iprgc_76                        2802437                 1652868
## iprgc_77                        1574651                 1485198
## iprgc_81                        1957318                 1652547
## iprgc_82                        1695064                 1278480
## iprgc_83                        3550991                  787207
## iprgc_84                        2716482                 1016602
## iprgc_85                        3070475                 4982006
## iprgc_86                        1584336                 3504856
## iprgc_87                        2702903                 6643829
## iprgc_88                        3571442                 6566202
## iprgc_89                        2670299                 4268199
## iprgc_90                        2185011                 5130035
## iprgc_91                        1031455                 1952703
## iprgc_92                        2227319                 4338434
## iprgc_93                        1902893                 4066044
## iprgc_94                        2253262                 6394602
## iprgc_95                        2462976                 4802887
## iprgc_96                        1124034                 2018582
## iprgc_97                        2106698                 4168566
## iprgc_98                        1646039                 2939674
## iprgc_99                         899864                 1039173
## iprgc_100                       2458941                 7583206
## iprgc_101                       1046189                 2151316
## iprgc_102                       2414831                 4844907
## iprgc_104                       3576922                 5498302
## iprgc_105                       2247030                 3714870
## iprgc_106                       1745274                 5678135
## iprgc_107                       3664704                10968566
## iprgc_108                       1538013                 5173396
## iprgc_109                       1554923                 2161895
## iprgc_110                       3310736                 3360928
## iprgc_111                       1363554                 1699645
## iprgc_112                       1364323                 1664098
## iprgc_113                       3780807                 4894243
## iprgc_114                       1218954                 2151331
## iprgc_115                       1353297                 1746660
## iprgc_116                       1179429                 1301001
## iprgc_117                       1171597                 2019548
## iprgc_118                       1398283                 2821889
## iprgc_119                        912577                 1254331
## iprgc_120                       2367026                 5029094
## iprgc_121                       2162058                 4353717
## iprgc_122                       1539523                 1540853
## iprgc_123                       4981110                 9526129
## iprgc_124                       4238972                 7831340
## iprgc_125                       1177569                 1438407
## iprgc_126                       2401918                 2989185
## iprgc_127                       2143572                 2771095
## iprgc_128                       1564536                 2333679
## iprgc_129                       2145404                 3144006
##           hisat_genome_multi_all hisat_unmapped hisat_genome_percent_log
## iprgc_62                 1394098       19607017                    54.30
## iprgc_63                  746537       14321178                    53.28
## iprgc_64                  757797        9447512                    73.76
## iprgc_65                  757000       11613547                    72.26
## iprgc_67                  543814       10918707                    64.68
## iprgc_68                 1201766       18303482                    53.46
## iprgc_69                  185889        4062569                    87.73
## iprgc_70                  534908       12784616                    53.48
## iprgc_71                  483274       11748901                    62.16
## iprgc_72                  553598       11797040                    65.49
## iprgc_73                  407155       10978062                    65.25
## iprgc_74                  262180        5732790                    81.83
## iprgc_75                  377197        6140625                    81.20
## iprgc_76                  466627        7631325                    84.22
## iprgc_77                  738105       18898549                    46.12
## iprgc_81                  492616       12118069                    63.35
## iprgc_82                  289604       12077676                    61.97
## iprgc_83                  189640        3076315                    90.44
## iprgc_84                  303614        3896608                    87.79
## iprgc_85                 1452554       20424824                    56.87
## iprgc_86                 1495480       12892866                    68.38
## iprgc_87                 3090288       26937105                    51.07
## iprgc_88                 1484386       28707206                    51.99
## iprgc_89                 1227818       16934959                    63.75
## iprgc_90                 2221900       19522087                    69.06
## iprgc_91                  744446        6646337                    78.91
## iprgc_92                 1322029       17243053                    61.36
## iprgc_93                 1072098       17570892                    58.03
## iprgc_94                 3295727       27633663                    50.81
## iprgc_95                 1795153       20635750                    56.02
## iprgc_96                  819084        8565090                    71.07
## iprgc_97                 1328912       16588598                    63.72
## iprgc_98                 1353214       12425164                    68.81
## iprgc_99                  379443        3528780                    88.02
## iprgc_100                3726501       28740151                    56.16
## iprgc_101                 920696        7309862                    76.25
## iprgc_102                1526237       18438092                    67.74
## iprgc_104                1246712       27517898                    54.43
## iprgc_105                 841851       17902417                    63.51
## iprgc_106                2197041       26013024                    57.77
## iprgc_107                3760329       44980319                    47.04
## iprgc_108                2337996       22667018                    60.72
## iprgc_109                 610868        8110837                    81.31
## iprgc_110                 646097       15094237                    67.08
## iprgc_111                 450175        7798052                    78.89
## iprgc_112                 441038        6168522                    83.80
## iprgc_113                1460623       20575232                    62.73
## iprgc_114                 559164        7287021                    80.45
## iprgc_115                 388933        5750843                    83.32
## iprgc_116                 259374        4250563                    87.82
## iprgc_117                 665641        7098103                    79.42
## iprgc_118                1118876       10002775                    76.54
## iprgc_119                 366327        4418372                    84.43
## iprgc_120                2032125       19796333                    68.89
## iprgc_121                1619685       17615938                    67.61
## iprgc_122                 447710        5066253                    86.96
## iprgc_123                3579817       40815048                    50.04
## iprgc_124                2943013       33816629                    53.52
## iprgc_125                 302868        5337939                    84.07
## iprgc_126                 490034       12800087                    71.89
## iprgc_127                 564939       11635882                    74.81
## iprgc_128                 454792        8063807                    78.58
## iprgc_129                 632287       12279337                    72.62
##           hisat_observed_genes hisat_sum_genes hisat_observed_mean_exprs
## iprgc_62                 14545         5642632                     718.8
## iprgc_63                 13695         3717242                     514.1
## iprgc_64                 16459        12978365                     899.0
## iprgc_65                 16884        14696641                    1024.8
## iprgc_67                 15379         7908083                     670.4
## iprgc_68                 14033         4602849                     644.5
## iprgc_69                 17008        18774803                    1039.0
## iprgc_70                 14833         5477804                     481.6
## iprgc_71                 14953         6549329                     646.0
## iprgc_72                 15339         7357963                     751.0
## iprgc_73                 15216         7125338                     687.1
## iprgc_74                 16166        15075002                     914.5
## iprgc_75                 16452        14804383                     928.4
## iprgc_76                 17086        22571664                    1450.8
## iprgc_77                 15168         5038166                     524.6
## iprgc_81                 14728         8652212                     720.5
## iprgc_82                 15629         9606265                     685.1
## iprgc_83                 15724        13230777                    1084.3
## iprgc_84                 16486        13312390                    1003.4
## iprgc_85                 15332         6910252                     788.7
## iprgc_86                 16246        14273411                     880.6
## iprgc_87                 14025         5647414                     710.5
## iprgc_88                 15103         7865435                     887.4
## iprgc_89                 16121        11611851                     928.7
## iprgc_90                 16393        23919491                    1397.2
## iprgc_91                 16378        16016160                     849.8
## iprgc_92                 15400        10312147                     834.4
## iprgc_93                 15058         8088854                     736.8
## iprgc_94                 14136         7103946                     726.9
## iprgc_95                 15275         7471948                     757.4
## iprgc_96                 16383        11278102                     691.3
## iprgc_97                 15520        12312129                     908.0
## iprgc_98                 15863        14054244                     880.6
## iprgc_99                 16831        17661585                     933.6
## iprgc_100                15389        12256388                     980.6
## iprgc_101                16561        12622526                     767.6
## iprgc_102                15612        18809254                    1247.5
## iprgc_104                15400        11375862                    1009.0
## iprgc_105                15795        16846374                    1028.5
## iprgc_106                15558        17994083                    1067.9
## iprgc_107                14636         8231918                     974.0
## iprgc_108                15633        18552934                    1057.3
## iprgc_109                16728        24270138                    1253.8
## iprgc_110                15568        13509357                    1031.5
## iprgc_111                15706        19606417                    1047.3
## iprgc_112                16153        20911855                    1147.5
## iprgc_113                15965        12217700                    1087.8
## iprgc_114                16314        19402528                    1044.1
## iprgc_115                16441        19560965                    1022.9
## iprgc_116                16929        20964695                    1113.9
## iprgc_117                16262        18276778                     953.3
## iprgc_118                16503        20885024                    1105.3
## iprgc_119                16551        16774668                     856.7
## iprgc_120                16564        24538069                    1421.8
## iprgc_121                16368        19040231                    1186.2
## iprgc_122                16794        21808522                    1216.0
## iprgc_123                14501         7015938                    1074.6
## iprgc_124                15405         8986063                    1086.5
## iprgc_125                15940        19243970                    1013.9
## iprgc_126                15122        18681748                    1134.2
## iprgc_127                16250        20184962                    1204.1
## iprgc_128                15505        18172993                    1038.3
## iprgc_129                15339        17955093                    1117.1
##           hisat_observed_median_exprs
## iprgc_62                            3
## iprgc_63                            1
## iprgc_64                           21
## iprgc_65                           25
## iprgc_67                           13
## iprgc_68                            2
## iprgc_69                           35
## iprgc_70                            8
## iprgc_71                            6
## iprgc_72                            7
## iprgc_73                            7
## iprgc_74                           23
## iprgc_75                           24
## iprgc_76                           43
## iprgc_77                            8
## iprgc_81                            9
## iprgc_82                           15
## iprgc_83                           26
## iprgc_84                           22
## iprgc_85                           12
## iprgc_86                           24
## iprgc_87                            2
## iprgc_88                            8
## iprgc_89                           17
## iprgc_90                           33
## iprgc_91                           26
## iprgc_92                           14
## iprgc_93                           13
## iprgc_94                            2
## iprgc_95                           10
## iprgc_96                           21
## iprgc_97                           18
## iprgc_98                           14
## iprgc_99                           35
## iprgc_100                           8
## iprgc_101                          23
## iprgc_102                          28
## iprgc_104                          20
## iprgc_105                          28
## iprgc_106                          13
## iprgc_107                           4
## iprgc_108                          15
## iprgc_109                          41
## iprgc_110                          22
## iprgc_111                          38
## iprgc_112                          33
## iprgc_113                          24
## iprgc_114                          27
## iprgc_115                          34
## iprgc_116                          46
## iprgc_117                          30
## iprgc_118                          38
## iprgc_119                          31
## iprgc_120                          38
## iprgc_121                          29
## iprgc_122                          44
## iprgc_123                           4
## iprgc_124                          12
## iprgc_125                          31
## iprgc_126                          30
## iprgc_127                          34
## iprgc_128                          37
## iprgc_129                          39
##                                                                                                         hisat_count_table
## iprgc_62   preprocessing/umd_sequenced/iprgc_62/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_63   preprocessing/umd_sequenced/iprgc_63/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_64   preprocessing/umd_sequenced/iprgc_64/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_65   preprocessing/umd_sequenced/iprgc_65/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_67   preprocessing/umd_sequenced/iprgc_67/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_68   preprocessing/umd_sequenced/iprgc_68/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_69   preprocessing/umd_sequenced/iprgc_69/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_70   preprocessing/umd_sequenced/iprgc_70/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_71   preprocessing/umd_sequenced/iprgc_71/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_72   preprocessing/umd_sequenced/iprgc_72/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_73   preprocessing/umd_sequenced/iprgc_73/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_74   preprocessing/umd_sequenced/iprgc_74/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_75   preprocessing/umd_sequenced/iprgc_75/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_76   preprocessing/umd_sequenced/iprgc_76/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_77   preprocessing/umd_sequenced/iprgc_77/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_81   preprocessing/umd_sequenced/iprgc_81/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_82   preprocessing/umd_sequenced/iprgc_82/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_83   preprocessing/umd_sequenced/iprgc_83/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_84   preprocessing/umd_sequenced/iprgc_84/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_85   preprocessing/umd_sequenced/iprgc_85/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_86   preprocessing/umd_sequenced/iprgc_86/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_87   preprocessing/umd_sequenced/iprgc_87/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_88   preprocessing/umd_sequenced/iprgc_88/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_89   preprocessing/umd_sequenced/iprgc_89/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_90   preprocessing/umd_sequenced/iprgc_90/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_91   preprocessing/umd_sequenced/iprgc_91/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_92   preprocessing/umd_sequenced/iprgc_92/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_93   preprocessing/umd_sequenced/iprgc_93/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_94   preprocessing/umd_sequenced/iprgc_94/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_95   preprocessing/umd_sequenced/iprgc_95/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_96   preprocessing/umd_sequenced/iprgc_96/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_97   preprocessing/umd_sequenced/iprgc_97/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_98   preprocessing/umd_sequenced/iprgc_98/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_99   preprocessing/umd_sequenced/iprgc_99/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_100 preprocessing/umd_sequenced/iprgc_100/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_101 preprocessing/umd_sequenced/iprgc_101/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_102 preprocessing/umd_sequenced/iprgc_102/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_104 preprocessing/umd_sequenced/iprgc_104/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_105 preprocessing/umd_sequenced/iprgc_105/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_106 preprocessing/umd_sequenced/iprgc_106/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_107 preprocessing/umd_sequenced/iprgc_107/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_108 preprocessing/umd_sequenced/iprgc_108/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_109 preprocessing/umd_sequenced/iprgc_109/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_110 preprocessing/umd_sequenced/iprgc_110/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_111 preprocessing/umd_sequenced/iprgc_111/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_112 preprocessing/umd_sequenced/iprgc_112/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_113 preprocessing/umd_sequenced/iprgc_113/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_114 preprocessing/umd_sequenced/iprgc_114/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_115 preprocessing/umd_sequenced/iprgc_115/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_116 preprocessing/umd_sequenced/iprgc_116/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_117 preprocessing/umd_sequenced/iprgc_117/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_118 preprocessing/umd_sequenced/iprgc_118/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_119 preprocessing/umd_sequenced/iprgc_119/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_120 preprocessing/umd_sequenced/iprgc_120/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_121 preprocessing/umd_sequenced/iprgc_121/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_122 preprocessing/umd_sequenced/iprgc_122/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_123 preprocessing/umd_sequenced/iprgc_123/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_124 preprocessing/umd_sequenced/iprgc_124/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_125 preprocessing/umd_sequenced/iprgc_125/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_126 preprocessing/umd_sequenced/iprgc_126/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_127 preprocessing/umd_sequenced/iprgc_127/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_128 preprocessing/umd_sequenced/iprgc_128/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
## iprgc_129 preprocessing/umd_sequenced/iprgc_129/outputs/40hisat_mm39_112/mm39_112_genome-paired_sreverse_gene_ID.count.xz
##                                                                     umi_extract_r1_output
## iprgc_62   preprocessing/umd_sequenced/iprgc_62/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_63   preprocessing/umd_sequenced/iprgc_63/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_64   preprocessing/umd_sequenced/iprgc_64/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_65   preprocessing/umd_sequenced/iprgc_65/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_67   preprocessing/umd_sequenced/iprgc_67/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_68   preprocessing/umd_sequenced/iprgc_68/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_69   preprocessing/umd_sequenced/iprgc_69/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_70   preprocessing/umd_sequenced/iprgc_70/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_71   preprocessing/umd_sequenced/iprgc_71/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_72   preprocessing/umd_sequenced/iprgc_72/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_73   preprocessing/umd_sequenced/iprgc_73/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_74   preprocessing/umd_sequenced/iprgc_74/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_75   preprocessing/umd_sequenced/iprgc_75/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_76   preprocessing/umd_sequenced/iprgc_76/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_77   preprocessing/umd_sequenced/iprgc_77/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_81   preprocessing/umd_sequenced/iprgc_81/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_82   preprocessing/umd_sequenced/iprgc_82/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_83   preprocessing/umd_sequenced/iprgc_83/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_84   preprocessing/umd_sequenced/iprgc_84/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_85   preprocessing/umd_sequenced/iprgc_85/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_86   preprocessing/umd_sequenced/iprgc_86/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_87   preprocessing/umd_sequenced/iprgc_87/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_88   preprocessing/umd_sequenced/iprgc_88/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_89   preprocessing/umd_sequenced/iprgc_89/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_90   preprocessing/umd_sequenced/iprgc_90/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_91   preprocessing/umd_sequenced/iprgc_91/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_92   preprocessing/umd_sequenced/iprgc_92/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_93   preprocessing/umd_sequenced/iprgc_93/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_94   preprocessing/umd_sequenced/iprgc_94/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_95   preprocessing/umd_sequenced/iprgc_95/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_96   preprocessing/umd_sequenced/iprgc_96/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_97   preprocessing/umd_sequenced/iprgc_97/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_98   preprocessing/umd_sequenced/iprgc_98/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_99   preprocessing/umd_sequenced/iprgc_99/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_100 preprocessing/umd_sequenced/iprgc_100/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_101 preprocessing/umd_sequenced/iprgc_101/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_102 preprocessing/umd_sequenced/iprgc_102/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_104 preprocessing/umd_sequenced/iprgc_104/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_105 preprocessing/umd_sequenced/iprgc_105/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_106 preprocessing/umd_sequenced/iprgc_106/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_107 preprocessing/umd_sequenced/iprgc_107/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_108 preprocessing/umd_sequenced/iprgc_108/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_109 preprocessing/umd_sequenced/iprgc_109/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_110 preprocessing/umd_sequenced/iprgc_110/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_111 preprocessing/umd_sequenced/iprgc_111/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_112 preprocessing/umd_sequenced/iprgc_112/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_113 preprocessing/umd_sequenced/iprgc_113/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_114 preprocessing/umd_sequenced/iprgc_114/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_115 preprocessing/umd_sequenced/iprgc_115/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_116 preprocessing/umd_sequenced/iprgc_116/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_117 preprocessing/umd_sequenced/iprgc_117/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_118 preprocessing/umd_sequenced/iprgc_118/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_119 preprocessing/umd_sequenced/iprgc_119/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_120 preprocessing/umd_sequenced/iprgc_120/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_121 preprocessing/umd_sequenced/iprgc_121/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_122 preprocessing/umd_sequenced/iprgc_122/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_123 preprocessing/umd_sequenced/iprgc_123/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_124 preprocessing/umd_sequenced/iprgc_124/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_125 preprocessing/umd_sequenced/iprgc_125/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_126 preprocessing/umd_sequenced/iprgc_126/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_127 preprocessing/umd_sequenced/iprgc_127/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_128 preprocessing/umd_sequenced/iprgc_128/outputs/01umi_tools/r1_extracted.fastq.gz
## iprgc_129 preprocessing/umd_sequenced/iprgc_129/outputs/01umi_tools/r1_extracted.fastq.gz
##           umi_extract_matches
## iprgc_62             21454044
## iprgc_63             15326358
## iprgc_64             18003256
## iprgc_65             20929623
## iprgc_67             15456881
## iprgc_68             19666257
## iprgc_69             16552894
## iprgc_70             13740575
## iprgc_71             15525499
## iprgc_72             17094474
## iprgc_73             15794837
## iprgc_74             15775224
## iprgc_75             16328183
## iprgc_76             24180028
## iprgc_77             17538867
## iprgc_81             16532098
## iprgc_82             15878311
## iprgc_83             16082507
## iprgc_84             15958920
## iprgc_85             23680086
## iprgc_86             20389649
## iprgc_87             27526146
## iprgc_88             29895877
## iprgc_89             23361256
## iprgc_90             31543306
## iprgc_91             15758794
## iprgc_92             22313362
## iprgc_93             20934807
## iprgc_94             28090789
## iprgc_95             23462476
## iprgc_96             14804663
## iprgc_97             22863130
## iprgc_98             19915507
## iprgc_99             14724866
## iprgc_100            32782165
## iprgc_101            15390215
## iprgc_102            28578632
## iprgc_104            30192805
## iprgc_105            24528770
## iprgc_106            30802656
## iprgc_107            42462593
## iprgc_108            28855525
## iprgc_109            21695810
## iprgc_110            22927463
## iprgc_111            18467297
## iprgc_112            19036600
## iprgc_113            27601259
## iprgc_114            18638104
## iprgc_115            17237384
## iprgc_116            17447459
## iprgc_117            17248353
## iprgc_118            21315056
## iprgc_119            14188002
## iprgc_120            31820880
## iprgc_121            27191863
## iprgc_122            19422096
## iprgc_123            40849547
## iprgc_124            36378912
## iprgc_125            16749234
## iprgc_126            22769305
## iprgc_127            23091824
## iprgc_128            18824955
## iprgc_129            22427478
##                                                                           umi_dedup_output_bam
## iprgc_62   preprocessing/umd_sequenced/iprgc_62/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_63   preprocessing/umd_sequenced/iprgc_63/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_64   preprocessing/umd_sequenced/iprgc_64/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_65   preprocessing/umd_sequenced/iprgc_65/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_67   preprocessing/umd_sequenced/iprgc_67/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_68   preprocessing/umd_sequenced/iprgc_68/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_69   preprocessing/umd_sequenced/iprgc_69/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_70   preprocessing/umd_sequenced/iprgc_70/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_71   preprocessing/umd_sequenced/iprgc_71/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_72   preprocessing/umd_sequenced/iprgc_72/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_73   preprocessing/umd_sequenced/iprgc_73/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_74   preprocessing/umd_sequenced/iprgc_74/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_75   preprocessing/umd_sequenced/iprgc_75/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_76   preprocessing/umd_sequenced/iprgc_76/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_77   preprocessing/umd_sequenced/iprgc_77/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_81   preprocessing/umd_sequenced/iprgc_81/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_82   preprocessing/umd_sequenced/iprgc_82/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_83   preprocessing/umd_sequenced/iprgc_83/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_84   preprocessing/umd_sequenced/iprgc_84/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_85   preprocessing/umd_sequenced/iprgc_85/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_86   preprocessing/umd_sequenced/iprgc_86/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_87   preprocessing/umd_sequenced/iprgc_87/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_88   preprocessing/umd_sequenced/iprgc_88/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_89   preprocessing/umd_sequenced/iprgc_89/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_90   preprocessing/umd_sequenced/iprgc_90/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_91   preprocessing/umd_sequenced/iprgc_91/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_92   preprocessing/umd_sequenced/iprgc_92/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_93   preprocessing/umd_sequenced/iprgc_93/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_94   preprocessing/umd_sequenced/iprgc_94/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_95   preprocessing/umd_sequenced/iprgc_95/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_96   preprocessing/umd_sequenced/iprgc_96/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_97   preprocessing/umd_sequenced/iprgc_97/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_98   preprocessing/umd_sequenced/iprgc_98/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_99   preprocessing/umd_sequenced/iprgc_99/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_100 preprocessing/umd_sequenced/iprgc_100/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_101 preprocessing/umd_sequenced/iprgc_101/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_102 preprocessing/umd_sequenced/iprgc_102/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_104 preprocessing/umd_sequenced/iprgc_104/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_105 preprocessing/umd_sequenced/iprgc_105/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_106 preprocessing/umd_sequenced/iprgc_106/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_107 preprocessing/umd_sequenced/iprgc_107/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_108 preprocessing/umd_sequenced/iprgc_108/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_109 preprocessing/umd_sequenced/iprgc_109/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_110 preprocessing/umd_sequenced/iprgc_110/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_111 preprocessing/umd_sequenced/iprgc_111/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_112 preprocessing/umd_sequenced/iprgc_112/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_113 preprocessing/umd_sequenced/iprgc_113/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_114 preprocessing/umd_sequenced/iprgc_114/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_115 preprocessing/umd_sequenced/iprgc_115/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_116 preprocessing/umd_sequenced/iprgc_116/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_117 preprocessing/umd_sequenced/iprgc_117/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_118 preprocessing/umd_sequenced/iprgc_118/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_119 preprocessing/umd_sequenced/iprgc_119/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_120 preprocessing/umd_sequenced/iprgc_120/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_121 preprocessing/umd_sequenced/iprgc_121/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_122 preprocessing/umd_sequenced/iprgc_122/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_123 preprocessing/umd_sequenced/iprgc_123/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_124 preprocessing/umd_sequenced/iprgc_124/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_125 preprocessing/umd_sequenced/iprgc_125/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_126 preprocessing/umd_sequenced/iprgc_126/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_127 preprocessing/umd_sequenced/iprgc_127/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_128 preprocessing/umd_sequenced/iprgc_128/outputs/04umi_dedup/umi_tools_deduplicated.bam
## iprgc_129 preprocessing/umd_sequenced/iprgc_129/outputs/04umi_dedup/umi_tools_deduplicated.bam
##                                                                                               umi_dedup_output_count
## iprgc_62   preprocessing/umd_sequenced/iprgc_62/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_63   preprocessing/umd_sequenced/iprgc_63/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_64   preprocessing/umd_sequenced/iprgc_64/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_65   preprocessing/umd_sequenced/iprgc_65/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_67   preprocessing/umd_sequenced/iprgc_67/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_68   preprocessing/umd_sequenced/iprgc_68/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_69   preprocessing/umd_sequenced/iprgc_69/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_70   preprocessing/umd_sequenced/iprgc_70/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_71   preprocessing/umd_sequenced/iprgc_71/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_72   preprocessing/umd_sequenced/iprgc_72/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_73   preprocessing/umd_sequenced/iprgc_73/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_74   preprocessing/umd_sequenced/iprgc_74/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_75   preprocessing/umd_sequenced/iprgc_75/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_76   preprocessing/umd_sequenced/iprgc_76/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_77   preprocessing/umd_sequenced/iprgc_77/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_81   preprocessing/umd_sequenced/iprgc_81/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_82   preprocessing/umd_sequenced/iprgc_82/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_83   preprocessing/umd_sequenced/iprgc_83/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_84   preprocessing/umd_sequenced/iprgc_84/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_85   preprocessing/umd_sequenced/iprgc_85/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_86   preprocessing/umd_sequenced/iprgc_86/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_87   preprocessing/umd_sequenced/iprgc_87/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_88   preprocessing/umd_sequenced/iprgc_88/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_89   preprocessing/umd_sequenced/iprgc_89/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_90   preprocessing/umd_sequenced/iprgc_90/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_91   preprocessing/umd_sequenced/iprgc_91/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_92   preprocessing/umd_sequenced/iprgc_92/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_93   preprocessing/umd_sequenced/iprgc_93/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_94   preprocessing/umd_sequenced/iprgc_94/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_95   preprocessing/umd_sequenced/iprgc_95/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_96   preprocessing/umd_sequenced/iprgc_96/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_97   preprocessing/umd_sequenced/iprgc_97/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_98   preprocessing/umd_sequenced/iprgc_98/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_99   preprocessing/umd_sequenced/iprgc_99/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_100 preprocessing/umd_sequenced/iprgc_100/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_101 preprocessing/umd_sequenced/iprgc_101/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_102 preprocessing/umd_sequenced/iprgc_102/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_104 preprocessing/umd_sequenced/iprgc_104/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_105 preprocessing/umd_sequenced/iprgc_105/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_106 preprocessing/umd_sequenced/iprgc_106/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_107 preprocessing/umd_sequenced/iprgc_107/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_108 preprocessing/umd_sequenced/iprgc_108/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_109 preprocessing/umd_sequenced/iprgc_109/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_110 preprocessing/umd_sequenced/iprgc_110/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_111 preprocessing/umd_sequenced/iprgc_111/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_112 preprocessing/umd_sequenced/iprgc_112/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_113 preprocessing/umd_sequenced/iprgc_113/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_114 preprocessing/umd_sequenced/iprgc_114/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_115 preprocessing/umd_sequenced/iprgc_115/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_116 preprocessing/umd_sequenced/iprgc_116/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_117 preprocessing/umd_sequenced/iprgc_117/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_118 preprocessing/umd_sequenced/iprgc_118/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_119 preprocessing/umd_sequenced/iprgc_119/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_120 preprocessing/umd_sequenced/iprgc_120/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_121 preprocessing/umd_sequenced/iprgc_121/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_122 preprocessing/umd_sequenced/iprgc_122/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_123 preprocessing/umd_sequenced/iprgc_123/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_124 preprocessing/umd_sequenced/iprgc_124/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_125 preprocessing/umd_sequenced/iprgc_125/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_126 preprocessing/umd_sequenced/iprgc_126/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_127 preprocessing/umd_sequenced/iprgc_127/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_128 preprocessing/umd_sequenced/iprgc_128/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
## iprgc_129 preprocessing/umd_sequenced/iprgc_129/outputs/04umi_dedup/umi_tools_deduplicated_sreverse_gene_ID.count.xz
##           umi_dedup_chimeric umi_dedup_num_reads_in umi_dedup_num_reads_out
## iprgc_62             1452937               18614709                 8648625
## iprgc_63              709025               13297062                 6169628
## iprgc_64              867058               17895655                12438709
## iprgc_65              825134               20305778                14650070
## iprgc_67                   0               14911704                 6244396
## iprgc_68             1246928               16877415                 8001913
## iprgc_69              224846               18312482                13626331
## iprgc_70                   0               11291811                 4315031
## iprgc_71                   0               14899869                 6142703
## iprgc_72                   0               17508994                 8086389
## iprgc_73                   0               15705128                 7262328
## iprgc_74              444838               16982732                10297731
## iprgc_75              471376               17837101                11666895
## iprgc_76              548725               27435832                17919454
## iprgc_77                   0               12622691                 5641702
## iprgc_81                   0               15696204                 4325269
## iprgc_82                   0               14420683                 5989004
## iprgc_83              278840               20500536                 6520845
## iprgc_84              382725               19718919                11961194
## iprgc_85                   0               21919740                 6297631
## iprgc_86             1662182               19427925                11226412
## iprgc_87             3002303               24375432                 6943848
## iprgc_88                   0               25825973                 7683133
## iprgc_89             1288308               22230551                 9988741
## iprgc_90             2506186               29561758                16430666
## iprgc_91              805952               15730918                11449267
## iprgc_92                   0               20434181                 6517215
## iprgc_93                   0               18285032                 4763200
## iprgc_94             3231382               23478066                 7569580
## iprgc_95                   0               20934229                 6494203
## iprgc_96              716527               14087698                 9401463
## iprgc_97             1230958               20902762                 6972570
## iprgc_98             1347661               18716405                10937773
## iprgc_99              428519               15381926                12713186
## iprgc_100            3861642               29132038                10539058
## iprgc_101             946176               15478210                10762654
## iprgc_102            1500337               26398889                 7615304
## iprgc_104                  0               25659015                 5958853
## iprgc_105                  0               21634779                 7136486
## iprgc_106            2296611               24666207                11852081
## iprgc_107                  0               33732409                 8324107
## iprgc_108            2555016               23911870                12383587
## iprgc_109             662661               21753591                15616405
## iprgc_110                  0               22498630                 5560116
## iprgc_111                  0               17938608                 4975228
## iprgc_112                  0               19103684                 8418311
## iprgc_113                  0               26995038                 7519015
## iprgc_114             594219               18353136                11277987
## iprgc_115             490334               17708595                12360074
## iprgc_116             351840               18170428                13514017
## iprgc_117             657983               17093633                12218494
## iprgc_118            1192045               20812806                13909310
## iprgc_119             354617               14328357                10869600
## iprgc_120            2098677               29739491                15991456
## iprgc_121            1844894               25274997                14082779
## iprgc_122             470276               20455761                13355865
## iprgc_123            3524658               35613060                 8785532
## iprgc_124            3036013               31992425                 7611305
## iprgc_125             367910               17181632                 6236874
## iprgc_126                  0               22064620                 4360402
## iprgc_127                  0               22219789                10051459
## iprgc_128                  0               18785320                 4216887
## iprgc_129                  0               21729414                 3911603
##           umi_dedup_pct_reads umi_dedup_deduplicated_positions
## iprgc_62                0.465                          1753865
## iprgc_63                0.464                          1071878
## iprgc_64                0.695                          4373152
## iprgc_65                0.721                          5419451
## iprgc_67                0.419                          1850476
## iprgc_68                0.474                          1436590
## iprgc_69                0.744                          6138409
## iprgc_70                0.382                          1254243
## iprgc_71                0.412                          1571654
## iprgc_72                0.462                          2176556
## iprgc_73                0.462                          1999845
## iprgc_74                0.606                          3551834
## iprgc_75                0.654                          4098587
## iprgc_76                0.653                          6129190
## iprgc_77                0.447                          1562142
## iprgc_81                0.276                          1260702
## iprgc_82                0.415                          2056722
## iprgc_83                0.318                          2151073
## iprgc_84                0.607                          3990543
## iprgc_85                0.287                          1633097
## iprgc_86                0.578                          4040213
## iprgc_87                0.285                           992104
## iprgc_88                0.297                          1747176
## iprgc_89                0.449                          3055929
## iprgc_90                0.556                          5517995
## iprgc_91                0.728                          4836261
## iprgc_92                0.319                          1974476
## iprgc_93                0.260                          1639813
## iprgc_94                0.322                          1407175
## iprgc_95                0.310                          1633630
## iprgc_96                0.667                          4043448
## iprgc_97                0.334                          2174736
## iprgc_98                0.584                          3780285
## iprgc_99                0.827                          5930421
## iprgc_100               0.362                          2736945
## iprgc_101               0.695                          5000352
## iprgc_102               0.288                          2468613
## iprgc_104               0.232                          1748672
## iprgc_105               0.330                          2684344
## iprgc_106               0.480                          3598525
## iprgc_107               0.247                          1445521
## iprgc_108               0.518                          3874112
## iprgc_109               0.718                          5888344
## iprgc_110               0.247                          1935173
## iprgc_111               0.277                          2273128
## iprgc_112               0.441                          3260409
## iprgc_113               0.279                          2452306
## iprgc_114               0.614                          4137689
## iprgc_115               0.698                          4863270
## iprgc_116               0.744                          6018124
## iprgc_117               0.715                          4461309
## iprgc_118               0.668                          4602072
## iprgc_119               0.759                          4348791
## iprgc_120               0.538                          5227916
## iprgc_121               0.557                          4731564
## iprgc_122               0.653                          5194944
## iprgc_123               0.247                          1224820
## iprgc_124               0.238                          1735561
## iprgc_125               0.363                          3711886
## iprgc_126               0.198                          1740851
## iprgc_127               0.452                          3552168
## iprgc_128               0.224                          2102741
## iprgc_129               0.180                          1607974
##           umi_dedup_mean_umi_per_pos umi_dedup_max_umi_per_pos  time_geno_loc
## iprgc_62                        8.60                     38924   p15_het_dlgn
## iprgc_63                        9.86                     39440   p15_het_dlgn
## iprgc_64                        3.59                     27371 p15_het_retina
## iprgc_65                        3.34                     27862 p15_het_retina
## iprgc_67                        4.54                     24406    p15_het_scn
## iprgc_68                        9.68                     45454    p15_ko_dlgn
## iprgc_69                        2.38                     15393  p15_ko_retina
## iprgc_70                        4.62                     20251     p15_ko_scn
## iprgc_71                        6.12                     36072    p15_wt_dlgn
## iprgc_72                        5.93                     37992    p15_wt_dlgn
## iprgc_73                        5.75                     40737    p15_wt_dlgn
## iprgc_74                        3.63                     25472  p15_wt_retina
## iprgc_75                        3.53                     28830  p15_wt_retina
## iprgc_76                        3.62                     38280  p15_wt_retina
## iprgc_77                        5.18                     23257     p15_wt_scn
## iprgc_81                        4.63                     22526    p08_wt_dlgn
## iprgc_82                        3.71                     21315    p08_wt_dlgn
## iprgc_83                        3.96                     53471  p08_wt_retina
## iprgc_84                        3.92                     57014  p08_wt_retina
## iprgc_85                        5.78                     45940     p08_ko_scn
## iprgc_86                        3.89                     46855  p08_ko_retina
## iprgc_87                       16.31                     56654    p08_ko_dlgn
## iprgc_88                        7.90                     55449   p08_het_dlgn
## iprgc_89                        4.95                     50112    p08_het_scn
## iprgc_90                        4.15                     55133 p08_het_retina
## iprgc_91                        2.83                     40894  p08_wt_retina
## iprgc_92                        4.63                     45886    p08_wt_dlgn
## iprgc_93                        3.80                     36240     p08_wt_scn
## iprgc_94                       11.52                     55625   p15_het_dlgn
## iprgc_95                        6.17                     47815    p15_het_scn
## iprgc_96                        2.94                     47871 p15_het_retina
## iprgc_97                        4.38                     43996     p15_wt_scn
## iprgc_98                        3.95                     49407    p15_wt_dlgn
## iprgc_99                        2.33                     24195  p15_wt_retina
## iprgc_100                       7.43                     58830    p15_ko_dlgn
## iprgc_101                       2.66                     37636  p15_ko_retina
## iprgc_102                       4.06                     48224     p15_ko_scn
## iprgc_104                       4.96                     44516   p08_het_dlgn
## iprgc_105                       3.51                     47370   p08_het_dlgn
## iprgc_106                       4.79                     54693   p15_het_dlgn
## iprgc_107                      12.65                     63093    p08_ko_dlgn
## iprgc_108                       4.54                     51083    p15_ko_dlgn
## iprgc_109                       3.08                     40990  p08_wt_retina
## iprgc_110                       3.68                     38373    p08_het_scn
## iprgc_111                       2.50                     29514    p08_het_scn
## iprgc_112                       2.93                     33820    p15_het_scn
## iprgc_113                       4.20                     48638     p08_ko_scn
## iprgc_114                       3.13                     40491     p15_ko_scn
## iprgc_115                       2.93                     37559  p08_wt_retina
## iprgc_116                       2.46                     30096  p15_wt_retina
## iprgc_117                       3.22                     44668 p08_het_retina
## iprgc_118                       3.69                     44346 p08_het_retina
## iprgc_119                       2.80                     32754 p15_het_retina
## iprgc_120                       4.14                     54664  p08_ko_retina
## iprgc_121                       4.11                     52455  p08_ko_retina
## iprgc_122                       2.92                     43252  p15_ko_retina
## iprgc_123                      16.25                     63117    p08_ko_dlgn
## iprgc_124                       7.01                     56208     p08_ko_scn
## iprgc_125                       1.85                     20841    p08_wt_dlgn
## iprgc_126                       3.13                     24582    p08_wt_dlgn
## iprgc_127                       3.52                     36871    p15_wt_dlgn
## iprgc_128                       2.35                     34708     p08_wt_scn
## iprgc_129                       2.91                     24561     p08_wt_scn
## 
## $factors
## [1] "genotype_atb" "location_atb" "time_atb"    
## 
## $observed_nodes
##  [1] "het"            "het dlgn"       "het dlgn p08"   "het dlgn p15"  
##  [5] "het retina"     "het retina p08" "het retina p15" "het scn"       
##  [9] "het scn p08"    "het scn p15"    "ko"             "ko dlgn"       
## [13] "ko dlgn p08"    "ko dlgn p15"    "ko retina"      "ko retina p08" 
## [17] "ko retina p15"  "ko scn"         "ko scn p08"     "ko scn p15"    
## [21] "wt"             "wt dlgn"        "wt dlgn p08"    "wt dlgn p15"   
## [25] "wt retina"      "wt retina p08"  "wt retina p15"  "wt scn"        
## [29] "wt scn p08"     "wt scn p15"    
## 
## $ggplot

## 
## attr(,"class")
## [1] "hpgltools::meta_sankey"

Here is Theresa’s text, recall once again that I do not have some of these older samples (iprgc_62):

PC1 vs PC2 identifies retina vs axon is still the main component of variation. We do see though that in the PC2 direction, we see with the new samples added, we don’t see separation based on axonal targets (dLGN vs SCN). In the PC1 vs PC3 plot, we see that it’s PC3 where we start to see variation correlated with axonal compartment. Let’s look at PC1 vs PC2 colored by batch (when they were processed/sequenced) to see if that is what is contributing so much variation in PC2.

Side note: ipRGC 62 seems like an odd ball. This seems to me like it should have been a dLGN P08 sample. Is there any possibility this got mislabeled early on? I went back and double checked to see if all my processing is correct and it indeed was labeled an SCN P15 from the time I got the samples, and it is indeed.

13 DE

I now switched to Theresa’s document ‘WORKING_axonTRAP…’ and will start pulling sections from it. I am reasonably certain I have reasonably similar sample distributions, so I presume I can invoke similar/identical calls for DESeq and friends.

13.1 p8 retinas

In the block immediately before the DE analyses, Theresa created a subset expressionset of only p08 retinas. Thus this initial DE I assume will be used to subtract for the SCN/DLGN analyses that follow. (I guess I could read ahead and find out, but no! I want to be a blank slate)

Theresa’s primary workflow makes heavy use of DESeq2 (Love, Huber, and Anders (2014)) and sva (Leek et al. (2012)). In some(most?) of Theresa’s invocations of the all_pairwise() function, she excludes the other methods that it performs. In this workbook, I left those methods on, thus we can evaluate the relative performance DESeq2 vs. some (all? I may have disabled EBSeq/dream because they were taking too long) of the following:

  • limma: (Ritchie et al. (2015)) (among other references) originally written for microarrays.
  • EdgeR: (Robinson, McCarthy, and Smyth (2010)), which shares many assumptions with DESeq2.
  • EBSeq: (Leng et al. (2013)), because I have a soft spot for any Bayesian method.
  • Noiseq: (Tarazona et al. (2011)), which seeks to directly model variance in an RNASeq dataset and use that to improve the sensitivity of the result, much like:
  • Dream: (Gabriel E. Hoffman and Roussos (2020)), written by the same authors (and uses very similar logic) as one of my favorite tools, variancePartition(Gabriel E. Hoffman and Schadt (2016)).
mm38_p8_retina <- subset_se(mm38_hisat_v3, subset = "time_atb=='p08' & location_atb=='retina'")
mm_normal_p8_ret_de <- all_pairwise(mm38_p8_retina, model_svs = "svaseq",
                                    model_fstring = "~ 0 + condition", filter = TRUE)
## het_retina  ko_retina  wt_retina 
##          3          3          5
## Removing 12001 low-count genes (13424 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 2593 entries to zero.
## This received a matrix of SVs.
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## conditions
## het_retina  ko_retina  wt_retina 
##          3          3          5
## conditions
## het_retina  ko_retina  wt_retina 
##          3          3          5
## conditions
## het_retina  ko_retina  wt_retina 
##          3          3          5

mm_normal_p8_ret_de
## 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 3 comparisons.

There seems to be a discrepency with previous iterations of this. Let us simplify to just doing deseq and find what is causing it. In my previous iteration, I got 3632 genes in the unique(c()) or het+ko.

deseq_only <- deseq_pairwise(mm38_p8_retina, model_svs = "svaseq",
                             model_fstring = default_fstring, filter = TRUE)
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
deseq_hetkeeper_genes <- deseq_only$all_tables$wt_retina_vs_het_retina %>%
  filter(logFC <= -0.25 & adj.P.Val <= 0.05)
deseq_kokeeper_genes <- deseq_only$all_tables$wt_retina_vs_ko_retina %>%
  filter(logFC <= -0.25 & adj.P.Val <= 0.05)
deseq_keepergenes <- unique(c(rownames(deseq_hetkeeper_genes),
                        rownames(deseq_kokeeper_genes)))
length(deseq_keepergenes)
## [1] 3632
deseq_pair_hetkeeper_genes <- mm_normal_p8_ret_de$deseq$all_tables$wt_retina_vs_het_retina %>%
  filter(logFC <= -0.25 & adj.P.Val <= 0.05)
deseq_pair_kokeeper_genes <- mm_normal_p8_ret_de$deseq$all_tables$wt_retina_vs_ko_retina %>%
  filter(logFC <= -0.25 & adj.P.Val <= 0.05)
deseq_pair_keepergenes <- unique(c(rownames(deseq_pair_hetkeeper_genes),
                        rownames(deseq_pair_kokeeper_genes)))
length(deseq_pair_keepergenes)
## [1] 3632

The following invocation performed by Theresa filters the wt/het comparison for only those genes which increased by at least 0.25 logFC with a significant adjusted p-value. I assume that this is to use the wt samples as a translational control for the ket/ko comparisons; I am therefore thinking that for my purposes, I will therefore separate the contrasts from all_pairwise do this in a stepwise fashion…

The block of code immediately following Theresa’s all_pairwise() invocation is a little confusing for me and warrants some explanation by me to me in the hopes that I do not misunderstand what is happening and the goals therein.

I think I can safely assume that the goal here is to pull out the IDs which increased in het with respect to wild type; even if by a small margin, as long as it is statistically significant vis a vis the adjusted p-value.

I am going to perform what I think is the same thing in a slightly different fashion so that I can share a copy of the results with whomever is interested. I will also repeat Theresa’s invocation and prove to myself that I understood and got the same answer.

wt_het_keeper <- list("het_vs_wt" = c("het_retina", "wt_retina"))
het_wt_table <- combine_de_tables(
  mm_normal_p8_ret_de, keepers = wt_het_keeper, label_column = label_column,
  excel = "03theresa_comparison_excel/het_retina_control.xlsx")
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
wanted_sig <- extract_significant_genes(
  het_wt_table, lfc = 0.25, according_to = "deseq",
  excel = "03theresa_comparison_excel/het_retina_control-sig.xlsx")
wanted_het_increased <- wanted_sig[["deseq"]][["ups"]][["het_vs_wt"]]
increased_het_genes <- rownames(wanted_het_increased)

Here are Theresa’s next lines:

mm_de_normal_p8_ret <- mm_normal_p8_ret_de
hetkeeper_genes <- mm_de_normal_p8_ret$deseq$all_tables$wt_retina_vs_het_retina %>%
  filter(logFC <= -0.25 & adj.P.Val <= 0.05)
kokeeper_genes <- mm_de_normal_p8_ret$deseq$all_tables$wt_retina_vs_ko_retina %>%
  filter(logFC <= -0.25 & adj.P.Val <= 0.05)
keepergenes <- unique(c(rownames(hetkeeper_genes),
                        rownames(kokeeper_genes)))
## We know a priori that Opn4 is ENSMUSG00000021799
## I do not expect to see it in this set, it should be higher in wt
## retina vs ko retina by a significant margin.
"ENSMUSG00000021799" %in% keepergenes
## [1] TRUE
## Oooohhh but it _is_ higher in het vs. wt, as we saw in
## the violin plot earlier.

I think Rashmi made a compelling point which illustrates why we likely should expect the expression of Opn4 to significantly higher in the heterozygotes vs wild-type:

  1. Recall that the assay is using the immunopurification to extract the RNAs.
  2. The wt samples do not have the cre recombinase and therefore no HA and therefore everything we observe is due to non-specific binding.
  3. The set of genes observed due to non-specific binding is different than het/ko (presumably a larger number of relatively small values), therefore the divisor performed in the cpm is likely relativly large resulting in normalized values getting shifted down to some degree.
  4. On the other hand, the set of genes observed in het/ko are more likely to be only the specific binders and therefore smaller (I can test this) resulting in a smaller divisor and slight shifting up in the cpm values.

This makes me wonder if any normalization methods exist which do something like multiply the values by some value related to the proportion of observed genes; and/or if this is a good/bad/indifferent idea.

Also, just a note for me to remember: RPL22, not RPS22, for some reason I keep thinking the small subunit.

13.2 Prove I understood

hetkeeper_genes <- mm_normal_p8_ret_de$deseq$all_tables$wt_retina_vs_het_retina %>%
  filter(logFC <= -0.25 & adj.P.Val <= 0.05)
testthat::expect_true(nrow(hetkeeper_genes) == length(increased_het_genes))
taa_keepers <- sort(rownames(hetkeeper_genes))
atb_keepers <- sort(increased_het_genes)
testthat::expect_equal(taa_keepers, atb_keepers)

Yay! I can read! Now let us repeat for the KO vs wt

wt_ko_keeper <- list("ko_vs_wt" = c("ko_retina", "wt_retina"))
ko_wt_table <- combine_de_tables(
  mm_normal_p8_ret_de, keepers = wt_ko_keeper, label_column = label_column,
  excel = "03theresa_comparison_excel/ko_retina_control.xlsx")
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
wanted_sig <- extract_significant_genes(
  ko_wt_table, lfc = 0.25, according_to = "deseq",
  excel = "03theresa_comparison_excel/ko_retina_control-sig.xlsx")

wanted_ko_increased <- wanted_sig[["deseq"]][["ups"]][["ko_vs_wt"]]
increased_ko_genes <- rownames(wanted_ko_increased)

The next thing performed in Theresa’s document is a unique(concatenation of these two gene groups), thus sucking up every gene which was significantly higher in either the knockout or heterzyous samples with respect to wild-type.

This was followed by a couple of merge operations of a little bit of the annotation data; I am not sure I understand the goal yet…

Here is her code. I copied the annotation ‘mgi_symbol’ column to ‘external_gene_name’ so that I need not change any of her code. I am assuming this is the appropriate column of interest, I do not know this for certain, but it seems quite likely.

While I am at it, here is the set_sig_limma() function from Theresa’s helpers.R

set_sig_limma <- function(limma_tbl, factors = NULL) {
  if (is.null(factors)) {
    #set significance for plotting colors
    limma_tbl$Significance <- NA
    limma_tbl[abs(limma_tbl$logFC) < 1 | limma_tbl$adj.P.Val > .05, "Significance"] <- "Not \nEnriched"
    limma_tbl[limma_tbl$logFC >= 1  & limma_tbl$adj.P.Val <= .05, ][["Significance"]] <- "Disease \nUpregulated"
    limma_tbl[limma_tbl$logFC <= -1  & limma_tbl$adj.P.Val <= .05, ][["Significance"]] <- "Disease \nDownregulated"
    limma_tbl$Significance <- factor(limma_tbl$Significance, levels = c("Upregulated", "Downregulated",  "Not \nEnriched"))
  } else {
    limma_tbl$Significance <- NA
    limma_tbl[abs(limma_tbl$logFC) < 1 | limma_tbl$adj.P.Val > .05, "Significance"] <- "Not \nEnriched"
    if(nrow(limma_tbl[limma_tbl$logFC >= 1  & limma_tbl$adj.P.Val <= .05, ]) != 0) {
      limma_tbl[limma_tbl$logFC >= 1  & limma_tbl$adj.P.Val <= .05, ][["Significance"]] <- factors[1]
    }
    if (nrow(limma_tbl[limma_tbl$logFC <= -1  & limma_tbl$adj.P.Val <= .05, ]) != 0) {
      limma_tbl[limma_tbl$logFC <= -1  & limma_tbl$adj.P.Val <= .05, ][["Significance"]] <- factors[2]
    }
    limma_tbl$Significance <- factor(limma_tbl$Significance, levels = c(factors,  "Not \nEnriched"))
  }
  return(limma_tbl)
}

13.2.1 Combining het/wt and ko/wt

mm_annot[["external_gene_name"]] <- mm_annot[["mgi_symbol"]]
keepergenes <- unique(c(rownames(hetkeeper_genes), rownames(kokeeper_genes)))
length(keepergenes)
## [1] 3632
annots_to_merge <- mm_annot %>%
  select(ensembl_gene_id, external_gene_name) %>%
  filter(ensembl_gene_id %in%
           rownames(mm_de_normal_p8_ret$deseq$all_tables$ko_retina_vs_het_retina)) %>%
  distinct()
mm_de_normal_p8_ret$deseq$all_tables$ko_retina_vs_het_retina <- merge(
  mm_de_normal_p8_ret$deseq$all_tables$ko_retina_vs_het_retina, annots_to_merge,
  by.x = 0, by.y = "ensembl_gene_id", all.x = TRUE)
df <- mm_de_normal_p8_ret$deseq$all_tables$ko_retina_vs_het_retina %>%
  dplyr::mutate(logFC = -logFC) %>%
  set_sig_limma(factors = c("Het Enriched", "KO Enriched"))

My version of the above task makes use of the excludes option of combine_de_tabes. Given the set of unique gene IDs increased in the het/ko, I can ask to exlude anything not in that set. I could also have more parsimoniously directly excluded any gene ID increased in the wt samples. But, Theresa already provided the code to do the former, so it will be less typing/opportunity for silly mistakes to just do that.

both_increased_genes <- unique(c(increased_het_genes, increased_ko_genes))
## arbitrairly grab all genes from one of my data structures.
all_genes <- rownames(exprs(mm38_hisat_v3))
exclude_idx <- all_genes %in% both_increased_genes
summary(exclude_idx)
##    Mode   FALSE    TRUE 
## logical   21793    3632

My April 2025 version of this shows 21,793 and 3,632 genes in this set. Is that still true? (As of 20260311, it is!)

exclude_increased_genes <- all_genes[exclude_idx]
retina_keepers <- list(
  "het_vs_wt" = c("het_retina", "wt_retina"),
  "ko_vs_wt" = c("ko_retina", "wt_retina"),
  "ko_vs_het" = c("ko_retina", "het_retina"))
## A reminder to myself: there is also a parameter 'wanted_genes'
## which does effectively the same thing as excludes in this context;
## excludes was originally written to allow flexible, keyword-based
## exclusion.
p8_retina_tables <- combine_de_tables(
  mm_normal_p8_ret_de, keepers = retina_keepers,
  wanted_genes = both_increased_genes, label_column = label_column,
  excel = glue("03theresa_comparison_excel/p8_retina_kept_genes_increased_in_wt_tables-v{ver}.xlsx"))
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
p8_retina_sig <- extract_significant_genes(
  p8_retina_tables, according_to = "deseq",
  excel = glue("03theresa_comparison_excel/p8_retina_kept_genes_increased_in_wt_sig-v{ver}.xlsx"))

opposite_p8_retina_tables <- combine_de_tables(
  mm_normal_p8_ret_de, keepers = retina_keepers,
  excludes = both_increased_genes, label_column = label_column,
  excel = glue("03theresa_comparison_excel/p8_retina_removed_genes_increased_in_wt_tables-v{ver}.xlsx"))
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
opposite_p8_retina_sig <- extract_significant_genes(
  p8_retina_tables, according_to = "deseq",
  excel = glue("03theresa_comparison_excel/p8_retina_removed_genes_increased_in_wt_sig-v{ver}.xlsx"))

14 Filtering out non-specific genes and examining the results

The following is a copy/paste from Theresa containing the remaining tasks she performed and will provide the template for implementation of the final tasks.

This picks up with the lines from her notebook immediately following the invocation of ‘set_sig_limma(factors = c(“Het Enriched” …’.

For all of the remaining blocks I will copy in her code, turn off its evaluation, run the blocks manually, compare them to her notebook output, then enable each block as I ensure I understand it.

I will likely therefore introduce some small formatting changes and add some additional GSEA/enrichment tasks once the non-specific filtering is complete.

df <- df %>%
  filter(Row.names %in% keepergenes)
labels_ups <- df %>%
  filter(adj.P.Val <= 0.05 & abs(logFC) > 1) %>%
  arrange(logFC) %>%
  head(n = 9)
labels_downs <- df %>%
  filter(adj.P.Val <= 0.05 & abs(logFC) > 1) %>%
  arrange(-logFC) %>%
  head(n = 11)
labels <- rbind(labels_ups, labels_downs)
res_tbl <- df
DEplot <- ggplot(res_tbl, aes(x = logFC, y = -log10(adj.P.Val), label = external_gene_name)) +
  geom_point(aes(colour = Significance), size = 4) +
  geom_vline(xintercept = c(-1, 1)) +
  geom_hline(yintercept = -log10(0.05)) +
  theme_classic(base_size = 20) +
  xlab("log2(FC)") +
  ylab("-log10(p-value)") +
  theme(legend.position = "right") +
  scale_color_manual(values = c("#F8766D", "#00BFC4", "Grey")) +
  geom_label_repel(
    data = filter(df,
                  ## c('s5_het_dlgn', 's5_het_ret', 's5_het_scn')),
                  external_gene_name %in% labels$external_gene_name),
    ## nudge_x = -0.5,
    nudge_y = 3, max.overlaps = 15) +
  xlim(c(-3, 6))

pp(file = "03theresa_comparison_images/p08_retina_DE_1312024.pdf")
## Warning in pp(file = "03theresa_comparison_images/p08_retina_DE_1312024.pdf"):
## The directory: 03theresa_comparison_images does not exist, will attempt to
## create it.
DEplot
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_label_repel()`).
plotted <- dev.off()
DEplot
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).
## Removed 2 rows containing missing values or values outside the scale range
## (`geom_label_repel()`).

write_xlsx(df, excel = "excel/retinahet_vs_retinako_WTfiltered.xlsx")
## write_xlsx() wrote excel/retinahet_vs_retinako_WTfiltered.xlsx.
## The cursor is on sheet first, row: 3635 column: 13.

14.1 How many ups/downs

ko_enriched <- df %>%
  filter(Significance == "KO Enriched")
nrow(ko_enriched)
## [1] 21
het_enriched <-  df %>%
  filter(Significance == "Het Enriched")
nrow(het_enriched)
## [1] 69

14.2 category enrichment/GSEA

regulated_genes <- res_tbl %>%
  filter(adj.P.Val <= 0.05) %>%
  arrange(logFC) %>%
  select(Row.names, logFC, adj.P.Val, external_gene_name, Significance) %>%
  filter(abs(logFC) >= 1)
## gsea_result_ko <- gost(query = ko_genes$external_gene_name,
##                        organism = "mmusculus",
##                        evcodes = TRUE,
##                        ordered_query = TRUE)
gsea_result_het <- gost(query = het_enriched$external_gene_name,
                        organism = "mmusculus",
                        evcodes = TRUE,
                        ordered_query = TRUE)
##gsea_result_alldysregulated <- gost(query = alldysregulated_genes$external_gene_name,
##                                    organism = "mmusculus",
##                                    evcodes = TRUE,
##                                    ordered_query = TRUE)

I have a function in my package which seeks to make gProfiler queries a bit more complete and easy. Let us see how similar the result is…

rownames(alldysregulated_genes) <- alldysregulated_genes[["Row.names"]]
alldysregulated_genes[["Row.names"]] <- NULL

het_gp <- simple_gprofiler(rownames(alldysregulated_genes),
                           species = "mmusculus",
                           excel = glue("excel/het_gprofiler-v{ver}.xlsx"))
het_gp
enrichplot::dotplot(het_gp[["BP_enrich"]])
gp_pair <- enrichplot::pairwise_termsim(het_gp[["BP_enrich"]])
enrichplot::emapplot(gp_pair)
enrichplot::ssplot(gp_pair)
enrichplot::treeplot(gp_pair)
upsetplot(het_gp[["BP_enrich"]])

enrichplot::dotplot(het_gp[["REAC_enrich"]])
gp_pair <- enrichplot::pairwise_termsim(het_gp[["REAC_enrich"]])
enrichplot::emapplot(gp_pair)
enrichplot::ssplot(gp_pair)
enrichplot::treeplot(gp_pair)
upsetplot(het_gp[["REAC_enrich"]])

I make a somewhat arbitrary distinction between the concepts of over-enrichment analyses and GSEA: the former (as performed by gprofiler) (Raudvere et al. (2019)) seeks to find groups of genes overrepresented in GO/reactome/etc. These groups of genes are taken exclusively from the top-n/bottom-n genes with respect to fold-change between conditions of interest; in this case most different than wt in the p08 retina ko or het samples.

With that in mind, I can invoke a similar function using the full table of DE results to get what I call the GSEA result using clusterProfiler (Yu (n.d.)). In the following block I will use the ‘all_cprofiler’ function on the data structures named ‘p8_retina_tables’ and ‘opposite_p8_retina_tables’ in order to get these GSEA results for each contrast performed (het/wt, ko/wt, het/ko). I will follow that up with ‘all_gprofiler’ which does the same, but uses gProfiler’s enrichment analyses (it will therefore include what we just looked at).

p08_retina_all_cp <- all_cprofiler(
  p8_retina_sig, p8_retina_tables, orgdb = "org.Mm.eg.db", orgdb_from = orgdb_from,
  excel = "03theresa_comparison_excel/cprofiler_p08_retina.xlsx")
## Error : unable to find an inherited method for function 'metadata' for signature 'x = "NULL"'
## Error : unable to find an inherited method for function 'metadata' for signature 'x = "NULL"'
## Error in `simple_cl[["kegg_universe"]]`:
## ! subscript out of bounds
enrichplot::dotplot(p08_retina_all_cp[["ko_vs_het_up"]][["enrich_objects"]][["MF_all"]])
## Error in `h()`:
## ! error in evaluating the argument 'object' in selecting a method for function 'dotplot': object 'p08_retina_all_cp' not found
p08_topn_gsea <- plot_topn_gsea(p08_retina_all_cp)
## Error in `h()`:
## ! error in evaluating the argument 'gse' in selecting a method for function 'plot_topn_gsea': object 'p08_retina_all_cp' not found
pp(file = "03theresa_comparison_images/gsea_p08_retina_ko_vs_het_top_hit.pdf")
p08_topn_gsea[["GO_ko_vs_het_up"]][[1]]
## Error:
## ! object 'p08_topn_gsea' not found
plotted <- dev.off()

p08_topn_gsea[["GO_ko_vs_het_up"]][[1]]
## Error:
## ! object 'p08_topn_gsea' not found
p08_topn_gsea[["GO_ko_vs_het_up"]][[2]]
## Error:
## ! object 'p08_topn_gsea' not found
p08_topn_gsea[["GO_ko_vs_het_up"]][[3]]
## Error:
## ! object 'p08_topn_gsea' not found
p08_topn_gsea[["GO_ko_vs_het_up"]][[4]]
## Error:
## ! object 'p08_topn_gsea' not found
p08_topn_gsea[["GO_ko_vs_het_up"]][[5]]
## Error:
## ! object 'p08_topn_gsea' not found
pp(file = "03theresa_comparison_images/gsea_p08_retina_het_vs_wt_top_hit.pdf")
p08_topn_gsea[["GO_het_vs_wt_up"]][[1]]
## Error:
## ! object 'p08_topn_gsea' not found
plotted <- dev.off()
#gsea_ko <-  gsea_result_ko[["result"]] %>%
#    select(term_name, p_value, term_size, intersection_size, recall, source, intersection) %>%
#    arrange(desc(recall)) %>%
#    head(n = 10)
#  gsea_plots_ko <- ggplot(gsea_ko, aes(x = recall, y = reorder(term_name, recall), fill = p_value)) +
#  geom_bar(stat = "identity")+
#  scale_fill_continuous(low = "blue", high = "red") +
#  theme_bw()+
#  ylab("") +
#  xlab("GSEA Score")
gsea_het <-  gsea_result_het[["result"]] %>%
  select(term_name, p_value, term_size, intersection_size, recall, source, intersection) %>%
  arrange(desc(recall)) %>%
  head(n = 10)
gsea_plots_het <- ggplot(gsea_het, aes(x = recall, y = reorder(term_name, recall), fill = p_value)) +
  geom_bar(stat = "identity") +
  scale_fill_continuous(low = "blue", high = "red") +
  theme_bw() +
  ylab("") +
  xlab("Over Representation Score")
pp(file = "03theresa_comparison_images/GSEA_p08_axontrap_retinahet_upregulated_vs_retinako.pdf")
gsea_plots_het
plotted <- dev.off()
gsea_plots_het

gsea_all <-  gsea_result_alldysregulated[["result"]] %>%
  select(term_name, p_value, term_size, intersection_size, recall, source, intersection) %>%
  arrange(desc(recall)) %>%
  head(n = 10)
gsea_plots_all <- ggplot(gsea_all, aes(x = recall, y = reorder(term_name, recall), fill = p_value)) +
  geom_bar(stat = "identity") +
  scale_fill_continuous(low = "blue", high = "red") +
  theme_bw() +
  ylab("") +
  xlab("Over Representation Score")

pp(file = "images/GSEA_p08_retina_axontrap_alldysregulatedgenes.pdf")
gsea_plots_all
plotted <- dev.off()

15 SCN Het vs KO

It is only now that I realized we are splitting the data by location for each set of comparisons. I think that, left to my own devices, I would prefer to keep the input data structure intact, perform the somewhat larger number of contrasts, and then split up the results. Ideally this will slightly improve the fidelity of the results returned by DESeq2 and friends. But, I will run the state of Theresa’s notebook with as few changes as possible first, then add this.

15.1 PCA

I am going to skip this PCA plot for a couple of reasons: I already did a superset of it, and the subset Theresa performed is not valid given the set of samples included in my sample sheet, and figuring out the actually corresponding subset will take me forever… In addition, I want to use my mm38_hisat_v3 for everything…

mm38_subset <- subset_se(
  mm38_hisat,
  subset = "(batch == '4' | batch == '5' | batch == '6') & time == 'p08' & location == 'scn' | sampleid == 'iprgc_03'")
mm38_norm <- normalize(mm38_subset, filter = TRUE, convert = "cpm",
                            transform = "log2", batch = "svaseq")
mm38_norm <- set_batches(mm38_norm, fact = "location")
mm38_norm <- set_conditions(mm38_norm, fact = "genotype")
pca_norm <- plot_pca(mm38_norm, max_overlaps = 70)
pca_norm$plot

Instead I will simplify the subset and see what happens…

scn_samples <- subset_se(mm38_hisat_v3,
                           subset = "location_atb == 'scn'") %>%
  set_batches(fact = "location_atb") %>%
  set_conditions(fact = "genotype_atb", colors = color_choices[["genotype"]])
## The number of samples by batch are:
## 
## scn 
##  17
## The numbers of samples by condition are:
## 
## het  ko  wt 
##   6   6   5
scn_norm <- normalize(scn_samples, filter = TRUE, convert = "cpm",
                           transform = "log2", batch = "svaseq")
## Removing 11109 low-count genes (14316 remaining).
## transform_counts: Found 919 values less than 0.
## transform_counts: Found 919 values equal to 0, adding 1 to the matrix.
scn_norm_pca <- plot_pca(scn_norm)
scn_norm_pca
## The result of performing a fast_svd dimension reduction.
## The x-axis is PC1 and the y-axis is PC2
## Colors are defined by het, ko, wt
## Shapes are defined by scn.

16 Library sizes post-deduplication

Theresa’s next operation was to perform libsize/nonzero plots. I already did the pre/post deduplication nonzero, here is the analagous libsize.

v2 is pre-deduplication and v3 is post.

plot_libsize(mm38_hisat_v2)
## Library sizes of 65 samples, 
## ranging from 3,717,242 to 24,538,069.

post_filter_nonzero <- plot_libsize(mm38_hisat_v3, text = FALSE)
pp(file = "01diagnostic_images/post_all_filteres_nonzero.pdf")
post_filter_nonzero[["plot"]]
plotted <- dev.off()
post_filter_nonzero
## Library sizes of 63 samples, 
## ranging from 1,264,475 to 10,979,038.

I am a bit concerned about some of these library sizes post-deduplication.

Let us look at the relationship between reads and duplication, which I assume will be relatively linear.

test <- colData(mm38_hisat_v3)[, c("hisat_genome_single_all", "umi_dedup_pct_reads")]
test_plot <- plot_linear_scatter(test, loess = TRUE)
test_plot[["scatter"]]
## `geom_smooth()` using formula = 'y ~ x'
## Warning: The following aesthetics were dropped during statistical transformation: label.
## i This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## i Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

test_plot[["scatter"]]
## `geom_smooth()` using formula = 'y ~ x'
## Warning: The following aesthetics were dropped during statistical transformation: label.
## i This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## i Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

pp(file = "01diagnostic_images/deduplication_vs_hisat_scatter.pdf")
test_plot[["scatter"]]
## `geom_smooth()` using formula = 'y ~ x'
## Warning: The following aesthetics were dropped during statistical transformation: label.
## i This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## i Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?
dev.off()
## png 
##   2

Theresa also produced a density/sample plot, that might prove quite useful for these due to their significantly larger variance across samples (due to deduplication).

pp(file = "01diagnostic_images/sample_density.pdf")
mm38_density <- plot_density(loc_geno_nt)
mm38_density[["plot"]] +
  theme(legend.position = "none")
plot_boxplot(loc_geno_nt)
##          iprgc_62 iprgc_63 iprgc_64 iprgc_65 iprgc_66 iprgc_67 iprgc_68
## min         0.000    0.000    0.000    0.000    0.000    0.000    0.000
## q1          1.689    1.527    2.480    2.558    1.894    2.186    1.469
## median      3.713    3.521    4.413    4.445    3.909    4.021    3.539
## mean        3.711    3.556    4.250    4.279    3.916    3.995    3.573
## q3          5.460    5.314    5.914    5.904    5.705    5.638    5.333
## max        15.929   16.020   14.188   14.054   14.741   15.920   16.168
## iqr         3.771    3.788    3.434    3.345    3.811    3.452    3.864
## iqr_high   11.115   10.995   11.064   10.922   11.423   10.817   11.129
## iqr_low    -5.656   -5.681   -5.151   -5.018   -5.717   -5.178   -5.796
## sd          2.426    2.434    2.309    2.285    2.439    2.309    2.439
## var         5.885    5.926    5.330    5.219    5.948    5.333    5.948
## stdvar      1.586    1.667    1.254    1.220    1.519    1.335    1.665
##          iprgc_69 iprgc_70 iprgc_71 iprgc_72 iprgc_73 iprgc_74 iprgc_75
## min         0.000    0.000    0.000    0.000    0.000    0.000    0.000
## q1          2.543    2.182    1.968    1.990    1.996    2.404    2.419
## median      4.466    4.015    3.869    3.922    3.907    4.268    4.318
## mean        4.299    3.977    3.865    3.889    3.901    4.169    4.210
## q3          5.929    5.624    5.556    5.584    5.599    5.848    5.883
## max        12.381   15.767   16.057   15.939   15.386   13.760   13.110
## iqr         3.387    3.442    3.587    3.594    3.602    3.444    3.465
## iqr_high   11.009   10.786   10.937   10.975   11.002   11.014   11.080
## iqr_low    -5.080   -5.162   -5.381   -5.391   -5.403   -5.166   -5.197
## sd          2.304    2.325    2.377    2.377    2.384    2.334    2.328
## var         5.308    5.404    5.651    5.648    5.684    5.448    5.421
## stdvar      1.235    1.359    1.462    1.452    1.457    1.307    1.288
##          iprgc_76 iprgc_77 iprgc_81 iprgc_82 iprgc_83 iprgc_84 iprgc_85
## min         0.000    0.000    0.000    0.000    0.000    0.000    0.000
## q1          2.518    2.264    2.084    2.178    2.503    2.531    2.246
## median      4.379    4.066    3.814    3.984    4.354    4.457    3.959
## mean        4.264    4.025    3.848    3.996    4.221    4.288    3.938
## q3          5.908    5.654    5.476    5.617    5.852    5.961    5.531
## max        13.649   15.864   16.157   14.893   13.932   13.337   16.483
## iqr         3.389    3.390    3.392    3.439    3.349    3.430    3.285
## iqr_high   10.992   10.739   10.565   10.776   10.875   11.106   10.459
## iqr_low    -5.084   -5.085   -5.088   -5.159   -5.023   -5.145   -4.928
## sd          2.299    2.295    2.320    2.320    2.298    2.317    2.234
## var         5.287    5.266    5.382    5.384    5.283    5.368    4.989
## stdvar      1.240    1.308    1.399    1.348    1.252    1.252    1.267
##          iprgc_86 iprgc_87 iprgc_88 iprgc_89 iprgc_90 iprgc_91 iprgc_92
## min         0.000    0.000    0.000    0.000    0.000    0.000    0.000
## q1          2.470    1.526    1.858    2.199    2.303    2.420    2.044
## median      4.345    3.317    3.742    4.035    4.389    4.450    3.823
## mean        4.232    3.389    3.773    4.031    4.202    4.259    3.874
## q3          5.941    4.998    5.463    5.664    5.973    5.967    5.531
## max        14.490   16.910   16.308   15.157   14.315   13.393   15.881
## iqr         3.471    3.472    3.604    3.465    3.669    3.547    3.487
## iqr_high   11.148   10.206   10.869   10.862   11.477   11.288   10.761
## iqr_low    -5.207   -5.208   -5.406   -5.198   -5.504   -5.321   -5.230
## sd          2.339    2.276    2.347    2.320    2.403    2.360    2.325
## var         5.471    5.179    5.510    5.381    5.773    5.571    5.404
## stdvar      1.293    1.528    1.460    1.335    1.374    1.308    1.395
##          iprgc_93 iprgc_94 iprgc_95 iprgc_96 iprgc_97 iprgc_98 iprgc_99
## min         0.000    0.000    0.000    0.000    0.000    0.000    0.000
## q1          2.194    1.455    2.093    2.550    2.101    1.934    2.604
## median      3.971    3.413    3.819    4.423    3.892    3.878    4.541
## mean        3.924    3.486    3.853    4.270    3.934    3.908    4.335
## q3          5.516    5.208    5.455    5.926    5.576    5.660    5.976
## max        16.492   16.585   16.084   13.933   15.433   14.700   12.844
## iqr         3.322    3.753    3.362    3.377    3.475    3.726    3.371
## iqr_high   10.498   10.837   10.498   10.991   10.789   11.249   11.033
## iqr_low    -4.982   -5.629   -5.043   -5.065   -5.213   -5.589   -5.057
## sd          2.253    2.401    2.276    2.305    2.332    2.424    2.303
## var         5.075    5.766    5.181    5.314    5.440    5.876    5.302
## stdvar      1.293    1.654    1.344    1.245    1.383    1.504    1.223
##          iprgc_100 iprgc_101 iprgc_102 iprgc_104 iprgc_105 iprgc_106 iprgc_107
## min          0.000     0.000     0.000     0.000     0.000     0.000     0.000
## q1           1.824     2.562     2.159     2.260     2.261     1.787     1.599
## median       3.846     4.490     4.065     4.050     4.187     3.930     3.435
## mean         3.838     4.307     4.032     4.011     4.119     3.888     3.505
## q3           5.593     5.958     5.751     5.639     5.825     5.706     5.147
## max         15.708    13.878    14.894    15.914    14.621    15.187    17.169
## iqr          3.770     3.396     3.592     3.380     3.564     3.919     3.548
## iqr_high    11.248    11.053    11.138    10.709    11.171    11.585    10.469
## iqr_low     -5.654    -5.095    -5.388    -5.069    -5.346    -5.879    -5.322
## sd           2.419     2.294     2.368     2.270     2.351     2.479     2.303
## var          5.852     5.263     5.610     5.155     5.526     6.147     5.305
## stdvar       1.525     1.222     1.391     1.285     1.342     1.581     1.514
##          iprgc_108 iprgc_109 iprgc_110 iprgc_111 iprgc_112 iprgc_113 iprgc_114
## min          0.000     0.000     0.000     0.000     0.000     0.000     0.000
## q1           1.838     2.491     2.183     2.361     2.193     2.358     2.163
## median       4.026     4.483     3.966     4.274     4.066     4.150     4.078
## mean         3.945     4.302     4.002     4.184     4.080     4.108     4.065
## q3           5.784     6.029     5.657     5.855     5.808     5.711     5.801
## max         14.921    12.859    15.079    14.025    13.023    15.794    13.261
## iqr          3.946     3.538     3.473     3.493     3.614     3.353     3.638
## iqr_high    11.703    11.335    10.867    11.095    11.229    10.741    11.257
## iqr_low     -5.919    -5.306    -5.210    -5.240    -5.422    -5.030    -5.457
## sd           2.486     2.354     2.336     2.335     2.386     2.267     2.400
## var          6.179     5.543     5.457     5.450     5.695     5.139     5.760
## stdvar       1.566     1.289     1.364     1.303     1.396     1.251     1.417
##          iprgc_115 iprgc_116 iprgc_117 iprgc_118 iprgc_119 iprgc_120 iprgc_121
## min          0.000     0.000     0.000     0.000     0.000     0.000     0.000
## q1           2.511     2.620     2.396     2.491     2.525     2.346     2.352
## median       4.495     4.525     4.367     4.396     4.404     4.347     4.365
## mean         4.303     4.332     4.223     4.256     4.248     4.214     4.214
## q3           6.020     5.957     5.980     5.985     5.919     5.941     5.942
## max         12.739    12.644    13.541    13.650    13.796    14.752    14.560
## iqr          3.508     3.337     3.584     3.494     3.394     3.596     3.590
## iqr_high    11.282    10.963    11.356    11.225    11.010    11.335    11.327
## iqr_low     -5.262    -5.006    -5.376    -5.241    -5.091    -5.393    -5.385
## sd           2.354     2.289     2.377     2.347     2.310     2.368     2.366
## var          5.543     5.242     5.649     5.509     5.335     5.609     5.596
## stdvar       1.288     1.210     1.338     1.294     1.256     1.331     1.328
##          iprgc_122 iprgc_123 iprgc_124 iprgc_125 iprgc_126 iprgc_127 iprgc_128
## min          0.000     0.000     0.000     0.000     0.000     0.000     0.000
## q1           2.567     1.556     2.038     2.211     2.215     2.323     2.352
## median       4.453     3.322     3.745     4.085     4.082     4.172     4.198
## mean         4.282     3.409     3.761     4.045     4.037     4.138     4.128
## q3           5.915     5.004     5.325     5.709     5.733     5.838     5.782
## max         13.284    17.222    17.196    13.801    15.040    14.076    15.026
## iqr          3.348     3.447     3.287     3.498     3.518     3.515     3.430
## iqr_high    10.937    10.174    10.255    10.956    11.011    11.110    10.926
## iqr_low     -5.022    -5.171    -4.930    -5.247    -5.278    -5.272    -5.145
## sd           2.300     2.242     2.196     2.354     2.363     2.348     2.316
## var          5.291     5.026     4.821     5.543     5.583     5.511     5.364
## stdvar       1.236     1.474     1.282     1.370     1.383     1.332     1.300
##          iprgc_129 iprgc_130
## min          0.000     0.000
## q1           2.462     2.286
## median       4.266     4.221
## mean         4.175     4.132
## q3           5.817     5.836
## max         15.200    13.939
## iqr          3.354     3.550
## iqr_high    10.848    11.162
## iqr_low     -5.031    -5.325
## sd           2.293     2.373
## var          5.258     5.632
## stdvar       1.259     1.363
## Plot describing the gene distribution from a dataset.
dev.off()
## png 
##   2
mm38_density[["plot"]] +
  theme(legend.position = "none")

box <- plot_boxplot(loc_geno_nt)
##          iprgc_62 iprgc_63 iprgc_64 iprgc_65 iprgc_66 iprgc_67 iprgc_68
## min         0.000    0.000    0.000    0.000    0.000    0.000    0.000
## q1          1.689    1.527    2.480    2.558    1.894    2.186    1.469
## median      3.713    3.521    4.413    4.445    3.909    4.021    3.539
## mean        3.711    3.556    4.250    4.279    3.916    3.995    3.573
## q3          5.460    5.314    5.914    5.904    5.705    5.638    5.333
## max        15.929   16.020   14.188   14.054   14.741   15.920   16.168
## iqr         3.771    3.788    3.434    3.345    3.811    3.452    3.864
## iqr_high   11.115   10.995   11.064   10.922   11.423   10.817   11.129
## iqr_low    -5.656   -5.681   -5.151   -5.018   -5.717   -5.178   -5.796
## sd          2.426    2.434    2.309    2.285    2.439    2.309    2.439
## var         5.885    5.926    5.330    5.219    5.948    5.333    5.948
## stdvar      1.586    1.667    1.254    1.220    1.519    1.335    1.665
##          iprgc_69 iprgc_70 iprgc_71 iprgc_72 iprgc_73 iprgc_74 iprgc_75
## min         0.000    0.000    0.000    0.000    0.000    0.000    0.000
## q1          2.543    2.182    1.968    1.990    1.996    2.404    2.419
## median      4.466    4.015    3.869    3.922    3.907    4.268    4.318
## mean        4.299    3.977    3.865    3.889    3.901    4.169    4.210
## q3          5.929    5.624    5.556    5.584    5.599    5.848    5.883
## max        12.381   15.767   16.057   15.939   15.386   13.760   13.110
## iqr         3.387    3.442    3.587    3.594    3.602    3.444    3.465
## iqr_high   11.009   10.786   10.937   10.975   11.002   11.014   11.080
## iqr_low    -5.080   -5.162   -5.381   -5.391   -5.403   -5.166   -5.197
## sd          2.304    2.325    2.377    2.377    2.384    2.334    2.328
## var         5.308    5.404    5.651    5.648    5.684    5.448    5.421
## stdvar      1.235    1.359    1.462    1.452    1.457    1.307    1.288
##          iprgc_76 iprgc_77 iprgc_81 iprgc_82 iprgc_83 iprgc_84 iprgc_85
## min         0.000    0.000    0.000    0.000    0.000    0.000    0.000
## q1          2.518    2.264    2.084    2.178    2.503    2.531    2.246
## median      4.379    4.066    3.814    3.984    4.354    4.457    3.959
## mean        4.264    4.025    3.848    3.996    4.221    4.288    3.938
## q3          5.908    5.654    5.476    5.617    5.852    5.961    5.531
## max        13.649   15.864   16.157   14.893   13.932   13.337   16.483
## iqr         3.389    3.390    3.392    3.439    3.349    3.430    3.285
## iqr_high   10.992   10.739   10.565   10.776   10.875   11.106   10.459
## iqr_low    -5.084   -5.085   -5.088   -5.159   -5.023   -5.145   -4.928
## sd          2.299    2.295    2.320    2.320    2.298    2.317    2.234
## var         5.287    5.266    5.382    5.384    5.283    5.368    4.989
## stdvar      1.240    1.308    1.399    1.348    1.252    1.252    1.267
##          iprgc_86 iprgc_87 iprgc_88 iprgc_89 iprgc_90 iprgc_91 iprgc_92
## min         0.000    0.000    0.000    0.000    0.000    0.000    0.000
## q1          2.470    1.526    1.858    2.199    2.303    2.420    2.044
## median      4.345    3.317    3.742    4.035    4.389    4.450    3.823
## mean        4.232    3.389    3.773    4.031    4.202    4.259    3.874
## q3          5.941    4.998    5.463    5.664    5.973    5.967    5.531
## max        14.490   16.910   16.308   15.157   14.315   13.393   15.881
## iqr         3.471    3.472    3.604    3.465    3.669    3.547    3.487
## iqr_high   11.148   10.206   10.869   10.862   11.477   11.288   10.761
## iqr_low    -5.207   -5.208   -5.406   -5.198   -5.504   -5.321   -5.230
## sd          2.339    2.276    2.347    2.320    2.403    2.360    2.325
## var         5.471    5.179    5.510    5.381    5.773    5.571    5.404
## stdvar      1.293    1.528    1.460    1.335    1.374    1.308    1.395
##          iprgc_93 iprgc_94 iprgc_95 iprgc_96 iprgc_97 iprgc_98 iprgc_99
## min         0.000    0.000    0.000    0.000    0.000    0.000    0.000
## q1          2.194    1.455    2.093    2.550    2.101    1.934    2.604
## median      3.971    3.413    3.819    4.423    3.892    3.878    4.541
## mean        3.924    3.486    3.853    4.270    3.934    3.908    4.335
## q3          5.516    5.208    5.455    5.926    5.576    5.660    5.976
## max        16.492   16.585   16.084   13.933   15.433   14.700   12.844
## iqr         3.322    3.753    3.362    3.377    3.475    3.726    3.371
## iqr_high   10.498   10.837   10.498   10.991   10.789   11.249   11.033
## iqr_low    -4.982   -5.629   -5.043   -5.065   -5.213   -5.589   -5.057
## sd          2.253    2.401    2.276    2.305    2.332    2.424    2.303
## var         5.075    5.766    5.181    5.314    5.440    5.876    5.302
## stdvar      1.293    1.654    1.344    1.245    1.383    1.504    1.223
##          iprgc_100 iprgc_101 iprgc_102 iprgc_104 iprgc_105 iprgc_106 iprgc_107
## min          0.000     0.000     0.000     0.000     0.000     0.000     0.000
## q1           1.824     2.562     2.159     2.260     2.261     1.787     1.599
## median       3.846     4.490     4.065     4.050     4.187     3.930     3.435
## mean         3.838     4.307     4.032     4.011     4.119     3.888     3.505
## q3           5.593     5.958     5.751     5.639     5.825     5.706     5.147
## max         15.708    13.878    14.894    15.914    14.621    15.187    17.169
## iqr          3.770     3.396     3.592     3.380     3.564     3.919     3.548
## iqr_high    11.248    11.053    11.138    10.709    11.171    11.585    10.469
## iqr_low     -5.654    -5.095    -5.388    -5.069    -5.346    -5.879    -5.322
## sd           2.419     2.294     2.368     2.270     2.351     2.479     2.303
## var          5.852     5.263     5.610     5.155     5.526     6.147     5.305
## stdvar       1.525     1.222     1.391     1.285     1.342     1.581     1.514
##          iprgc_108 iprgc_109 iprgc_110 iprgc_111 iprgc_112 iprgc_113 iprgc_114
## min          0.000     0.000     0.000     0.000     0.000     0.000     0.000
## q1           1.838     2.491     2.183     2.361     2.193     2.358     2.163
## median       4.026     4.483     3.966     4.274     4.066     4.150     4.078
## mean         3.945     4.302     4.002     4.184     4.080     4.108     4.065
## q3           5.784     6.029     5.657     5.855     5.808     5.711     5.801
## max         14.921    12.859    15.079    14.025    13.023    15.794    13.261
## iqr          3.946     3.538     3.473     3.493     3.614     3.353     3.638
## iqr_high    11.703    11.335    10.867    11.095    11.229    10.741    11.257
## iqr_low     -5.919    -5.306    -5.210    -5.240    -5.422    -5.030    -5.457
## sd           2.486     2.354     2.336     2.335     2.386     2.267     2.400
## var          6.179     5.543     5.457     5.450     5.695     5.139     5.760
## stdvar       1.566     1.289     1.364     1.303     1.396     1.251     1.417
##          iprgc_115 iprgc_116 iprgc_117 iprgc_118 iprgc_119 iprgc_120 iprgc_121
## min          0.000     0.000     0.000     0.000     0.000     0.000     0.000
## q1           2.511     2.620     2.396     2.491     2.525     2.346     2.352
## median       4.495     4.525     4.367     4.396     4.404     4.347     4.365
## mean         4.303     4.332     4.223     4.256     4.248     4.214     4.214
## q3           6.020     5.957     5.980     5.985     5.919     5.941     5.942
## max         12.739    12.644    13.541    13.650    13.796    14.752    14.560
## iqr          3.508     3.337     3.584     3.494     3.394     3.596     3.590
## iqr_high    11.282    10.963    11.356    11.225    11.010    11.335    11.327
## iqr_low     -5.262    -5.006    -5.376    -5.241    -5.091    -5.393    -5.385
## sd           2.354     2.289     2.377     2.347     2.310     2.368     2.366
## var          5.543     5.242     5.649     5.509     5.335     5.609     5.596
## stdvar       1.288     1.210     1.338     1.294     1.256     1.331     1.328
##          iprgc_122 iprgc_123 iprgc_124 iprgc_125 iprgc_126 iprgc_127 iprgc_128
## min          0.000     0.000     0.000     0.000     0.000     0.000     0.000
## q1           2.567     1.556     2.038     2.211     2.215     2.323     2.352
## median       4.453     3.322     3.745     4.085     4.082     4.172     4.198
## mean         4.282     3.409     3.761     4.045     4.037     4.138     4.128
## q3           5.915     5.004     5.325     5.709     5.733     5.838     5.782
## max         13.284    17.222    17.196    13.801    15.040    14.076    15.026
## iqr          3.348     3.447     3.287     3.498     3.518     3.515     3.430
## iqr_high    10.937    10.174    10.255    10.956    11.011    11.110    10.926
## iqr_low     -5.022    -5.171    -4.930    -5.247    -5.278    -5.272    -5.145
## sd           2.300     2.242     2.196     2.354     2.363     2.348     2.316
## var          5.291     5.026     4.821     5.543     5.583     5.511     5.364
## stdvar       1.236     1.474     1.282     1.370     1.383     1.332     1.300
##          iprgc_129 iprgc_130
## min          0.000     0.000
## q1           2.462     2.286
## median       4.266     4.221
## mean         4.175     4.132
## q3           5.817     5.836
## max         15.200    13.939
## iqr          3.354     3.550
## iqr_high    10.848    11.162
## iqr_low     -5.031    -5.325
## sd           2.293     2.373
## var          5.258     5.632
## stdvar       1.259     1.363
pp(file = "01diagnostic_images/sample_boxplot.pdf")
box
## Plot describing the gene distribution from a dataset.
dev.off()
## png 
##   2
box
## Plot describing the gene distribution from a dataset.

There is some difference across sample densities, but it is not too crazytown.

17 Diverging a little

At this point in the document I read ahead a bit and came to the conclusion that it repeats the above logic of taking the union of wt comparisons to remove genes from the appropriate het/ko or p15/p08 or location comparisons. This seems quite reasonable to me, but I would prefer to not separate all the data, so I will attempt to duplicate and slightly streamline this logic on the full dataset. Thus I am going to skip down to the end and attempt to implement this.

17.1 DE

Note: The following few blocks are all copy/pasted directly from Theresa’s notebook and are not evaluated because they are performed almost identically later but with slightly different logic/orders.

mm_de_normal_p8_scn <- all_pairwise(mm38_subset, model_batch = "svaseq",
                                    parallel = FALSE, do_ebseq = FALSE, do_basic = FALSE,
                                    do_dream = FALSE, do_noiseq = FALSE, do_edger = FALSE,
                                    filter = TRUE)
annots_to_merge <- mm_annot %>%
  select(ensembl_gene_id, external_gene_name) %>%
  filter(ensembl_gene_id %in% rownames(mm_de_normal_p8_scn$deseq$all_tables$ko_scn_vs_het_scn)) %>%
  distinct()
mm_de_normal_p8_scn$deseq$all_tables$ko_scn_vs_het_scn <- merge(
  mm_de_normal_p8_scn$deseq$all_tables$ko_scn_vs_het_scn,
  annots_to_merge, by.x = 0, by.y = "ensembl_gene_id", all.x = TRUE)
hetkeeper_genes <- mm_de_normal_p8_scn$deseq$all_tables$wt_scn_vs_het_scn %>%
  filter(logFC <= -0.1 & adj.P.Val <= 0.05)
kokeeper_genes <- mm_de_normal_p8_scn$deseq$all_tables$wt_scn_vs_ko_scn %>%
  filter(logFC <= -0.1 & adj.P.Val <= 0.05)
keepergenes <- unique(c(rownames(hetkeeper_genes), rownames(kokeeper_genes)))
df <- mm_de_normal_p8_scn$deseq$all_tables$koscn_vs_hetscn %>%
  dplyr::mutate(logFC = -logFC) %>%
  set_sig_limma(factors = c("Het Enriched",
                            "KO Enriched"))
df <- df %>%
  filter(Row.names %in% keepergenes)
labels_ups <- df %>%
  filter(abs(logFC) > 1) %>%
  arrange(logFC) %>%
  head(n = 1)
labels_downs <- df %>%
  filter(abs(logFC) > 1) %>%
  arrange(-logFC) %>%
  head(n = 1)
labels <- rbind(labels_ups, labels_downs)
res_tbl <- df
DEplot <- ggplot(res_tbl, aes(x = logFC, y = -log10(adj.P.Val), label = external_gene_name)) +
  geom_point(aes(colour = Significance), size = 4) +
  geom_vline(xintercept = c(-1, 1)) +
  geom_hline(yintercept = -log10(0.05)) +
  theme_classic(base_size = 20) +
  xlab("log2(FC)") +
  ylab("-log10(p-value)") +
  ## ggtitle(title, subtitle = subtitle) +
  theme(legend.position="right") +
  scale_color_manual(values=c("Het Enriched" = "#F8766D",
                              "KO Enriched" = "#00BFC4",
                              "Not\n Enriched" = "Grey")) +
  geom_label_repel(data=filter(df,
                               ## c('s5_het_dlgn', 's5_het_ret', 's5_het_scn')),
                               external_gene_name %in% labels$external_gene_name),
                   ## nudge_x = -0.5,
                   nudge_y = 3, max.overlaps = 15) +
  ggtitle("SCN Het vs KO Translatome")

pp(file = "images/p08_scn_DE_1312024.pdf")
DEplot
plotted <- dev.off()

write_xlsx(df, excel = "excel/scnhet_vs_scnko_WTfiltered.xlsx")

17.2 How many ups/downs

ko_enriched <- df %>%
  filter(Significance == "KO Enriched")

het_enriched <- df %>%
  filter(Significance == "Het Enriched")

17.3 GSEA

ko_genes <- res_tbl %>%
  filter(adj.P.Val <= 0.05) %>%
  arrange(-abs(logFC)) %>%
  select(Row.names, logFC, adj.P.Val, external_gene_name, Significance) %>%
  filter(logFC <= -1)

het_genes <- res_tbl %>%
  filter(adj.P.Val <= 0.05) %>%
  arrange(-abs(logFC)) %>%
  select(Row.names, logFC, adj.P.Val, external_gene_name, Significance) %>%
  filter(logFC >= 1)

alldysregulated_genes <- res_tbl %>%
  filter(adj.P.Val <= 0.05) %>%
  arrange(logFC) %>%
  select(Row.names, logFC, adj.P.Val, external_gene_name, Significance) %>%
  filter(abs(logFC) >= 1)

gsea_result_ko <- gost(query = ko_genes$external_gene_name,
                       organism = "mmusculus",
                       evcodes = TRUE,
                       ordered_query = TRUE)

gsea_result_het <- gost(query = het_genes$external_gene_name,
                        organism = "mmusculus",
                        evcodes = TRUE,
                        ordered_query = TRUE)

gsea_result_alldysregulated <- gost(query = alldysregulated_genes$external_gene_name,
                                    organism = "mmusculus",
                                    evcodes = TRUE,
                                    ordered_query = TRUE)
gsea_ko <-  gsea_result_ko[["result"]] %>%
  select(term_name, p_value, term_size, intersection_size, recall, source, intersection) %>%
  arrange(desc(recall)) %>%
  head(n = 10)
gsea_plots_ko <- ggplot(gsea_ko, aes(x = recall, y = reorder(term_name, recall), fill = p_value)) +
  geom_bar(stat = "identity") +
  scale_fill_continuous(low = "blue", high = "red") +
  theme_bw() +
  ylab("") +
  xlab("Over enrichment Score")

gsea_het <-  gsea_result_het[["result"]] %>%
  select(term_name, p_value, term_size, intersection_size, recall, source, intersection) %>%
  arrange(desc(recall)) %>%
  head(n = 10)
gsea_plots_het <- ggplot(gsea_het, aes(x = recall, y = reorder(term_name, recall), fill = p_value)) +
  geom_bar(stat = "identity") +
  scale_fill_continuous(low = "blue", high = "red") +
  theme_bw() +
  ylab("") +
  xlab("Over enrichment Score")

gsea_all <-  gsea_result_alldysregulated[["result"]] %>%
  select(term_name, p_value, term_size, intersection_size, recall, source, intersection) %>%
  arrange(desc(recall)) %>%
  head(n = 10)
gsea_plots_all <- ggplot(gsea_all, aes(x = recall, y = reorder(term_name, recall), fill = p_value)) +
  geom_bar(stat = "identity") +
  scale_fill_continuous(low = "blue", high = "red") +
  theme_bw() +
  ylab("") +
  xlab("Over enrichment Score")

pp(file = "images/GSEA_p08_retina_axontrap_alldysregulatedgenes.pdf")
gsea_plots_all
plotted <- dev.off()

18 Het Retina vs Het SCN

mm38_subset2 <- subset_se(
  mm38_hisat,
  subset = "(batch == '4' | batch == '5' | batch == '6') & time == 'p08' & genotype != 'ko' & location != 'dlgn' | sampleid == 'iprgc_03'")

mm38_subset2 <- subset_se(mm38_subset2, subset = "sampleid != 'iprgc_89'")
mm38_subset2$design %>%
  select(genotype, location) %>%
  table()
mm38_norm2 <- normalize(mm38_subset2, filter=TRUE,
                             convert="cpm",
                             transform="log2", batch = "svaseq")

18.1 PCA

mm38_norm2 <- set_batches(mm38_norm2, fact = "location")
mm38_norm2 <- set_conditions(mm38_norm2, fact = "genotype")
pca_norm2 <- plot_pca(mm38_norm2, max_overlaps = 70)
pca_norm2$plot

18.2 DE

mm_de_subset2 <- all_pairwise(mm38_subset2,
                              model_batch="svaseq",
                              parallel=FALSE, do_ebseq=FALSE,
                              do_basic = FALSE, do_dream = FALSE,
                              do_noiseq = FALSE, do_edger = FALSE,
                              filter = TRUE)
retinakeeper_genes <- mm_de_subset2$deseq$all_tables$wt_retina_vs_het_retina %>%
  filter(logFC <= -0.1 & adj.P.Val <= 0.05)

scnkeeper_genes <- mm_de_subset2$deseq$all_tables$wt_scn_vs_het_scn %>%
  filter(logFC <= -0.1 & adj.P.Val <= 0.05)

keepergenes <- unique(c(rownames(retinakeeper_genes), rownames(scnkeeper_genes)))

annots_to_merge <- mm_annot %>%
  select(ensembl_gene_id, external_gene_name) %>%
  filter(ensembl_gene_id %in% rownames(mm_de_subset2$deseq$all_tables$het_scn_vs_het_retina)) %>%
  distinct()

mm_de_subset2$deseq$all_tables$het_scn_vs_het_retina <- merge(
  mm_de_subset2$deseq$all_tables$het_scn_vs_het_retina,
  annots_to_merge, by.x = 0,
  by.y = "ensembl_gene_id", all.x = TRUE)

df <- mm_de_subset2$deseq$all_tables$het_scn_vs_het_retina %>%
  mutate(Significance = case_when(logFC <= -1.0 ~ "Retina Enriched",
                                  logFC >= 1.0 ~ "SCN Enriched",
                                  logFC > -1.0 & logFC < 1.0 ~ "Not\n Enriched"))

df <- df %>%
  filter(Row.names %in% keepergenes)

scn_enriched <- df %>%
  filter(adj.P.Val <= 0.05 & logFC >= 1.0) %>%
  arrange(-logFC) %>%
  select(Row.names, external_gene_name, logFC, adj.P.Val) %>%
  mutate(Significance = "SCN Enriched") %>%
  filter(Row.names %in% rownames(scnkeeper_genes))

retina_enriched <- df %>%
  filter(adj.P.Val <= 0.05 & logFC <= -1.0) %>%
  arrange(logFC)  %>%
  select(Row.names, external_gene_name, logFC, adj.P.Val) %>%
  mutate(Significance = "Retina Enriched") %>%
  filter(Row.names %in% rownames(retinakeeper_genes))

notenriched <- df %>%
  select(Row.names, external_gene_name, logFC, adj.P.Val, Significance) %>%
  filter(Row.names %in% c(rownames(retinakeeper_genes),
                          rownames(scnkeeper_genes))[duplicated(c(rownames(retinakeeper_genes),
                                                                  rownames(scnkeeper_genes)))]) %>%
  filter(Significance == "Not\n Enriched")

df <- rbind(scn_enriched, retina_enriched, notenriched)
df <- df %>%
  distinct()

## writexl::write_xlsx(df, path = "axonTRAP_DE_results_20240202/retinahet_vs_scn_het_WTfiltered.xlsx")
labels_ups <- df %>%
  filter(adj.P.Val <= 0.05 & abs(logFC) > 1.0) %>%
  arrange(logFC) %>%
  head(n = 10)

labels_downs <- df %>%
  filter(adj.P.Val <= 0.05 & abs(logFC) > 1.0) %>%
  arrange(-logFC) %>%
  head(n = 10)

labels <- rbind(labels_ups, labels_downs)

labels_requested <- c("Cdh10","Cdh12","Cdh13","Cdh18",
                      "Cdh7","Cdh8","Cdh9","Cntn3",
                      "Cntn4","Cntn5","Cntn6","Kirrel3",
                      "Nrxn1","Nrxn3","Sema3c","Sema6d",
                      "Tenm1","Tenm2","Tenm4")
res_tbl <- df
DEplot <- ggplot(res_tbl, aes(x = logFC, y = -log10(adj.P.Val), label = external_gene_name)) +
  geom_point(aes(colour = Significance), size = 4) +
  geom_vline(xintercept = c(-1, 1)) +
  geom_hline(yintercept = -log10(0.05)) +
  theme_classic(base_size = 20) +
  xlab("log2(FC)") +
  ylab("-log10(p-value)") +
  ## ggtitle(title, subtitle = subtitle) +
  theme(legend.position="right") +
  scale_color_manual(values=c("Grey", "#F8766D", "#00BFC4")) +
  geom_label_repel(data=filter(df,
                               external_gene_name %in% labels_requested),
                   ## c(labels$external_gene_name, "Opn4")), #c('s5_het_dlgn', 's5_het_ret', 's5_het_scn')),
                   ## nudge_x = -0.5,
                   nudge_y = 15, max.overlaps = 25)

#pp(file = "axonTRAP_Volcanoplots_20240202/p08_retinavsscnhet_DE_requested_genelabels_02052024.pdf")
DEplot
#dev.off()

18.3 How many ups/downs

scn_enriched <- df %>%
  filter(adj.P.Val <= 0.05 & logFC >= 1.0) %>%
  arrange(-logFC) %>%
  select(Row.names, external_gene_name, logFC, adj.P.Val, Significance)

retina_enriched <- df %>%
  filter(adj.P.Val <= 0.05 & logFC <= -1.0) %>%
  arrange(logFC)  %>%
  select(Row.names, external_gene_name, logFC, adj.P.Val, Significance)

scn_enriched
retina_enriched

df %>%
  filter(Significance == "Not\n Enriched")

18.4 GSEA

gsea_result_scn <- gost(query = scn_enriched$external_gene_name,
                        organism = "mmusculus", evcodes = TRUE,
                        ordered_query = TRUE, source = c("GO"))

gsea_result_ret <- gost(query = retina_enriched$external_gene_name,
                        organism = "mmusculus", evcodes = TRUE,
                        ordered_query = TRUE, source = c("GO"))
gsea_scn <-  gsea_result_scn[["result"]] %>%
  select(term_name, p_value, term_size, intersection_size, recall, source, intersection) %>%
  arrange(desc(recall)) %>%
  head(n = 20)
gsea_plots_scn <- ggplot(gsea_scn, aes(x = recall, y = reorder(term_name, recall), fill = p_value)) +
  geom_bar(stat = "identity") +
  scale_fill_continuous(low = "blue", high = "red") +
  theme_bw() +
  ylab("") +
  xlab("Over enrichment Score")

pp(file = "images/GSEA_SCNhet_vs_retina_enriched_P08.pdf")
gsea_plots_scn
plotted <- dev.off()

gsea_ret <-  gsea_result_ret[["result"]] %>%
  select(term_name, p_value, term_size, intersection_size, recall, source, intersection) %>%
  arrange(desc(recall)) %>%
  head(n = 20)
gsea_plots_ret <- ggplot(gsea_ret, aes(x = recall, y = reorder(term_name, recall), fill = p_value)) +
  geom_bar(stat = "identity") +
  scale_fill_continuous(low = "blue", high = "red") +
  theme_bw() +
  ylab("") +
  xlab("Over enrichment Score")

pp(file = "images/GSEA_Retinahet_vs_SCN_enriched_P08.pdf")
gsea_plots_ret
plotted <- dev.off()

19 KO Retina vs KO SCN

mm38_subset3 <- subset_se(
  mm38_hisat,
  subset = "(batch == '4' | batch == '5' | batch == '6') & time == 'p08'  & genotype != 'het' & location != 'dlgn' | sampleid == 'iprgc_03'")

mm38_subset3 <- subset_se(mm38_subset3, subset = "sampleid != 'iprgc_86'")
mm38_subset3$design %>%
  select(genotype, location) %>%
  table()
mm38_norm3 <- normalize(mm38_subset3, filter=TRUE,
                             convert="cpm", transform="log2", batch = "svaseq")

19.1 PCA

mm38_norm3 <- set_batches(mm38_norm3, fact = "location")
mm38_norm3 <- set_conditions(mm38_norm3, fact = "genotype")
pca_norm3 <- plot_pca(mm38_norm3, max_overlaps = 70)
pca_norm3$plot

19.2 DE

mm_de_subset3 <- all_pairwise(mm38_subset3,
                              model_batch="svaseq",
                              parallel=FALSE, do_ebseq=FALSE,
                              do_basic = FALSE, do_dream = FALSE,
                              do_noiseq = FALSE, do_edger = FALSE,
                              filter = TRUE)

retinakeeper_genes <- mm_de_subset3$deseq$all_tables$wtretina_vs_koretina %>%
  filter(logFC <= -1.0 & adj.P.Val <= 0.05)

scnkeeper_genes <- mm_de_subset3$deseq$all_tables$wtscn_vs_koscn %>%
  filter(logFC <= -1.0 & adj.P.Val <= 0.05)

keepergenes <- unique(c(rownames(retinakeeper_genes), rownames(scnkeeper_genes)))

annots_to_merge <- mm_annot %>%
  select(ensembl_gene_id, external_gene_name) %>%
  filter(ensembl_gene_id %in% rownames(mm_de_subset3$deseq$all_tables$ko_scn_vs_ko_retina)) %>%
  distinct()

mm_de_subset3$deseq$all_tables$ko_scn_vs_ko_retina <- merge(
  mm_de_subset3$deseq$all_tables$ko_scn_vs_ko_retina,
  annots_to_merge, by.x = 0,
  by.y = "ensembl_gene_id", all.x = TRUE)

df <- mm_de_subset3$deseq$all_tables$ko_scn_vs_ko_retina %>%
  mutate(Significance = case_when(logFC <= -1 ~ "Retina Enriched",
                                  logFC >= 1 ~ "SCN Enriched",
                                  logFC > -1 & logFC < 1 ~ "Not\n Enriched"))

df <- df %>%
  filter(Row.names %in% keepergenes)

scn_enriched <- df %>%
  filter(adj.P.Val <= 0.05 & logFC >= 1) %>%
  arrange(-logFC) %>%
  select(Row.names, external_gene_name, logFC, adj.P.Val) %>%
  mutate(Significance = "SCN Enriched") %>%
  filter(Row.names %in% rownames(scnkeeper_genes))

df %>%
  filter(adj.P.Val <= 0.05 & logFC <= -1) %>%
  arrange(logFC)  %>%
  select(Row.names, external_gene_name, logFC, adj.P.Val) %>%
  mutate(Significance = "Retina Enriched") %>%
  filter(Row.names %in% rownames(retinakeeper_genes)) -> retina_enriched

notenriched <- df %>%
  select(Row.names, external_gene_name, logFC, adj.P.Val, Significance) %>%
  filter(Row.names %in% c(rownames(retinakeeper_genes),
                          rownames(scnkeeper_genes))[duplicated(c(rownames(retinakeeper_genes),
                                                                  rownames(scnkeeper_genes)))])

df <- rbind(scn_enriched, retina_enriched, notenriched)
labels_ups <- df %>%
  filter(adj.P.Val <= 0.05 & abs(logFC) > 1) %>%
  arrange(logFC) %>%
  head(n = 10)

labels_downs <- df %>%
  filter(adj.P.Val <= 0.05 & abs(logFC) > 1) %>%
  arrange(-logFC) %>%
  head(n = 10)

labels <- rbind(labels_ups, labels_downs)
## wanted_column <- "Significance"

res_tbl <- df
DEplot <- ggplot(res_tbl, aes(x = logFC, y = -log10(adj.P.Val), label = external_gene_name)) +
  geom_point(aes(colour = Significance), size = 4) +
  ## geom_point(aes(colour = !!sym(wanted_column)), size = 4) +
  geom_vline(xintercept = c(-1, 1)) +
  geom_hline(yintercept = -log10(0.05)) +
  theme_classic(base_size = 20) +
  xlab("log2(FC)") +
  ylab("-log10(p-value)") +
  ## ggtitle(title, subtitle = subtitle) +
  theme(legend.position = "right") +
  scale_color_manual(values = c("Grey", "#F8766D", "#00BFC4")) +
  geom_label_repel(data = filter(
    df, external_gene_name %in% c(labels$external_gene_name, "Opn4")),
    ## c('s5_het_dlgn', 's5_het_ret', 's5_het_scn')),
    ## nudge_x = -0.5,
    nudge_y = 10, max.overlaps = 25)

pp(file = "images/p08_retinavsscnko_DE_1312024.pdf")
DEplot
plotted <- dev.off()

19.3 How many ups/downs

scn_enriched
retina_enriched
notenriched %>%
  filter(Significance == "Not\n Enriched")

19.4 GSEA

gsea_result_scn <- gost(query = scn_enriched$external_gene_name,
                        organism = "mmusculus",
                        evcodes = TRUE,
                        ordered_query = TRUE,
                        source = c("GO"))

gsea_result_ret <- gost(query = retina_enriched$external_gene_name,
                        organism = "mmusculus",
                        evcodes = TRUE,
                        ordered_query = TRUE,
                        source = c("GO"))
gsea_scn <-  gsea_result_scn[["result"]] %>%
  select(term_name, p_value, term_size, intersection_size, recall, source, intersection) %>%
  arrange(desc(recall)) %>%
  head(n = 20)
gsea_plots_scn <- ggplot(gsea_scn, aes(x = recall, y = reorder(term_name, recall), fill = p_value)) +
  geom_bar(stat = "identity") +
  scale_fill_continuous(low = "blue", high = "red") +
  theme_bw() +
  ylab("") +
  xlab("GSEA Score")

pp(file = "images/GSEA_SCNko_enriched_vs_retina_P08.pdf")
gsea_plots_scn
plotted <- dev.off()

gsea_ret <-  gsea_result_ret[["result"]] %>%
  select(term_name, p_value, term_size, intersection_size, recall, source, intersection) %>%
  arrange(desc(recall)) %>%
  head(n = 20)
gsea_plots_ret <- ggplot(gsea_ret, aes(x = recall, y = reorder(term_name, recall), fill = p_value)) +
  geom_bar(stat = "identity") +
  scale_fill_continuous(low = "blue", high = "red") +
  theme_bw() +
  ylab("") +
  xlab("GSEA Score")

pp(file = "images/GSEA_Retinako_enriched_vs_SCN_P08.pdf")
gsea_plots_ret
plotted <- dev.off()

20 My version of the global analysis

I want to have an invocation of all_pairwise() which uses all samples, in the following block I will set that up using a set of ‘keepers’ which will be named by time, location, then 2 letters for the numerator/denominator: w for WT, h for het, d for delta; thus “p08_retina_hw” is comparing the het/wt for the p08 retina samples.

If they are of interest, I will have a separate set which follows the same convention with names like “p08_ko_sr” to compare p08 deltas with SCN as the numerator and retina as the denominator.

20.1 Set up the exclusion dataset

The most peculiar aspect of this analysis resides in the choices around choosing which genes to consider when comparing the genotypes/locations/times. The general idea is pretty clear: find the genes which are non-specifically being pulled down in the WT samples and either exclude or discount them. The various potential methods for performing this are confusing:

  1. Which set of comparisons of wt/ko wt/het do we use to exclude/discount genes?
    1. Should it be a combination of all samples wt vs. x?
    2. Should it be only the ‘relevant’ comparison, e.g. if we are comparing p08_dlgn_het vs. p08_scn_het; do we remove genes observed in (p08_dlgn_het/wt && p08_scn_het/wt)
  2. Do we instead attempt to use this x/wt information to normalize the expression values in the other conditions and keep those genes?

Theresa’s current worksheet implements a version of 1b in which she separated the various input gene sets to define the exclusion genes. I am going to repeat this, but leave the starting data structure intact.

In this first iteration, I will do that by creating a simplified model of the data which combines the time/genotype/location and using sva. In my next iteration I will use a full statistical model containing each of those factors (and probably also using sva).

Note: my color choices are kind of garbage.

In addition, the exclusion dataset is the same as the analysis dataset, it is really only the contrasts which will be different.

v3_pairwise_input <- set_conditions(mm38_hisat_v3, fact = "time_geno_loc",
                                    colors = color_choices[["all"]])
## The numbers of samples by condition are:
## 
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Warning in set_se_colors(new_se, colors = colors): Colors for the following
## categories are not being used: p60_wt_dlgn, p60_wt_retina, p60_wt_scn.

20.2 A heatmap of specific genes across all conditions

all_cond_gene_heatmap_start <- normalize(v3_pairwise_input, filter = "simple",
                                         length_column = "cds_length",
                                         convert = "rpkm", transform = "log2")
## Removing 5517 low-count genes (19908 remaining).
## There appear to be 6387 genes without a length.
## transform_counts: Found 592846 values equal to 0, adding 1 to the matrix.
all_cond_gene_heatmap_input <- median_by_factor(all_cond_gene_heatmap_start)
## The factor p08_het_dlgn has 3 rows.
## The factor p08_het_retina has 3 rows.
## The factor p08_het_scn has 3 rows.
## The factor p08_ko_dlgn has 3 rows.
## The factor p08_ko_retina has 3 rows.
## The factor p08_ko_scn has 3 rows.
## The factor p08_wt_dlgn has 5 rows.
## The factor p08_wt_retina has 5 rows.
## The factor p08_wt_scn has 3 rows.
## The factor p15_het_dlgn has 4 rows.
## The factor p15_het_retina has 4 rows.
## The factor p15_het_scn has 3 rows.
## The factor p15_ko_dlgn has 3 rows.
## The factor p15_ko_retina has 3 rows.
## The factor p15_ko_scn has 3 rows.
## The factor p15_wt_dlgn has 5 rows.
## The factor p15_wt_retina has 5 rows.
## The factor p15_wt_scn has 2 rows.
all_cond_mtrx <- all_cond_gene_heatmap_input[["medians"]]
color_order <- colnames(all_cond_mtrx)
na_idx <- is.na(all_cond_mtrx)
all_cond_mtrx[na_idx] <- 0
variances <- matrixStats::rowVars(as.matrix(all_cond_mtrx))
variant_genes <- variances > 6.2
input_mtrx <- all_cond_mtrx[variant_genes, ]
cond_colors <- get_colors_by_condition(v3_pairwise_input, levels = color_order)
dim(input_mtrx)
## [1] 104  18
pp(file = "04inclusion_comparisons/top_104_variant_rpkm_genes_heatmap.pdf")
## Warning in pp(file =
## "04inclusion_comparisons/top_104_variant_rpkm_genes_heatmap.pdf"): The
## directory: 04inclusion_comparisons does not exist, will attempt to create it.
gplots::heatmap.2(as.matrix(input_mtrx), scale = "none", trace = "none",
                  ColSideColors = cond_colors)
dev.off()
## png 
##   2

21 TODO: Change the above to subtract wt

Rashmi suggested we should do the above plot after subtracting the wt counts. This is a good idea, but it will have to wait until we finish the current set.

21.1 Set up the contrasts

In the following few blocks I will set up the various comparisons of interest. Starting with the set of genes to exclude because they were observed to bind non-specifically in the wt samples.

21.1.1 Inclusion contrasts

In each exclusion I will have the contrast first followed by the pair of contrasts which will be used to define the gene set to exclude.

  • p15_het_dlgn/p08_het_dlgn: p15_wt_dlgn/p15_het_dlgn, p08_wt_dlgn/p08_het_dlgn; remove the genes increased in wt.
  • p15_ko_scn/p08_ko_scn: p15_wt_scn/p15_ko_scn, p08_wt_scn/p15_ko_scn
  • p15_het_retina/p08_het_retina: I think you get it, wt/het for both p15 retinas and p08 retinas…

Put slightly differently, for every term of interest I will create a contrast with the wt as numerator and the desired term as denominator, then pull out the genes increased in wt.

inclusions <- list(
  ## I like alphabetizing things, start with dlgn
  "p15_het_dlgn" = c("p15_het_dlgn", "p15_wt_dlgn"),
  "p08_het_dlgn" = c("p08_het_dlgn", "p08_wt_dlgn"),
  "p15_ko_dlgn" = c("p15_ko_dlgn", "p15_wt_dlgn"),
  "p08_ko_dlgn" = c("p08_ko_dlgn", "p08_wt_dlgn"),
  ## Then retinas
  "p15_het_retina" = c("p15_het_retina", "p15_wt_retina"),
  "p08_het_retina" = c("p08_het_retina", "p08_wt_retina"),
  "p15_ko_retina" = c("p15_ko_retina", "p15_wt_retina"),
  "p08_ko_retina" = c("p08_ko_retina", "p08_wt_retina"),
  ## Then scn
  "p15_het_scn" = c("p15_het_scn", "p15_wt_scn"),
  "p08_het_scn" = c("p08_het_scn", "p08_wt_scn"),
  "p15_ko_scn" = c("p15_ko_scn", "p15_wt_scn"),
  "p08_ko_scn" = c("p08_ko_scn", "p08_wt_scn"))

21.1.2 Time contrasts

For each location/genotype of interest, let us compare p15/p08

time_keepers <- list(
  ## DLGN
  "t_het_dlgn" = c("p15_het_dlgn", "p08_het_dlgn"),
  "t_ko_dlgn" = c("p15_ko_dlgn", "p08_ko_dlgn"),
  ## Retina
  "t_het_retina" = c("p15_het_retina", "p08_het_retina"),
  "t_ko_retina" = c("p15_ko_retina", "p08_ko_retina"),
  ## SCN
  "t_het_scn" = c("p15_het_scn", "p08_het_scn"),
  "t_ko_scn" = c("p15_ko_scn", "p08_ko_scn"))

21.1.3 Location contrasts

Compare locations and keep time/genotype consistent. I will use the location initials to define numerator/denominator.

location_keepers <- list(
  ## dlgn/retina
  "dr_p08_het" = c("p08_het_dlgn", "p08_het_retina"),
  "dr_p15_het" = c("p15_het_dlgn", "p15_het_retina"),
  "dr_p08_ko" = c("p08_ko_dlgn", "p08_ko_retina"),
  "dr_p15_ko" = c("p15_ko_dlgn", "p15_ko_retina"),
  ## scn/retina
  "sr_p08_het" = c("p08_het_scn", "p08_het_retina"),
  "sr_p15_het" = c("p15_het_scn", "p15_het_retina"),
  "sr_p08_ko" = c("p08_ko_scn", "p08_ko_retina"),
  "sr_p15_ko" = c("p15_ko_scn", "p15_ko_retina"),
  ## dlgn/scn
  "ds_p08_het" = c("p08_het_dlgn", "p08_het_scn"),
  "ds_p15_het" = c("p15_het_dlgn", "p15_het_scn"),
  "ds_p08_ko" = c("p08_ko_dlgn", "p08_ko_scn"),
  "ds_p15_ko" = c("p15_ko_dlgn", "p15_ko_scn"))

21.1.4 Genotype contrasts

Compare ko/het while keeping time/location constant. Similarly, use the initials to denote numerator/denominator, which will always be kh.

genotype_keepers <- list(
  ## DLGN
  "kh_p08_dlgn" = c("p08_ko_dlgn", "p08_het_dlgn"),
  "kh_p15_dlgn" = c("p15_ko_dlgn", "p15_het_dlgn"),
  ## Retina
  "kh_p08_retina" = c("p08_ko_retina", "p08_het_retina"),
  "kh_p15_retina" = c("p15_ko_retina", "p15_het_retina"),
  ## SCN
  "kh_p08_scn" = c("p08_ko_scn", "p08_het_scn"),
  "kh_p15_scn" = c("p15_ko_scn", "p15_het_scn"))

21.2 Perform the exclusion comparison

My all_pairwise() function now has a parameter which allows me to choose which contrasts to perform instead of literally doing every possible comparison. That is well suited for these operations:

In a container, the following appears to fail with:

“error code 1 from Lapack routine ‘dgesdd’”

Running it manually outside the container results in it working without error. I assume therefore that the problem lies in the compilation flags of LAPACK in the container.

Note: This problem was fixed by removing some parallelization.

inclusion_de <- all_pairwise(
  v3_pairwise_input, filter = "simple", model_fstring = default_fstring,
  keepers = inclusions, model_svs = "svaseq")
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Removing 5517 low-count genes (19908 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 394442 entries to zero.
## This received a matrix of SVs.
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2

inclusion_de
## 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 12 comparisons.
inclusion_tables <- combine_de_tables(
  inclusion_de, keepers = inclusions, label_column = label_column,
  excel = glue("04inclusion_comparisons/inclusion_tables-v{ver}.xlsx"))
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
inclusion_tables
## A set of combined differential expression results.
##                              table deseq_sigup deseq_sigdown edger_sigup
## 1      p15_het_dlgn_vs_p15_wt_dlgn         536           971         668
## 2      p08_het_dlgn_vs_p08_wt_dlgn          15            79          57
## 3       p15_ko_dlgn_vs_p15_wt_dlgn         903          1333        1029
## 4       p08_ko_dlgn_vs_p08_wt_dlgn         117           282         133
## 5  p15_het_retina_vs_p15_wt_retina         151            58         193
## 6  p08_het_retina_vs_p08_wt_retina         432           110         464
## 7   p15_ko_retina_vs_p15_wt_retina         107            34         178
## 8   p08_ko_retina_vs_p08_wt_retina         533           155         551
## 9        p15_het_scn_vs_p15_wt_scn          11             8          39
## 10       p08_het_scn_vs_p08_wt_scn          48             8          57
## 11        p15_ko_scn_vs_p15_wt_scn           7             5          28
## 12        p08_ko_scn_vs_p08_wt_scn          31            26          83
##    edger_sigdown limma_sigup limma_sigdown
## 1           1013         582           833
## 2            107          40            46
## 3           1346         837          1045
## 4            297         186           356
## 5            114         119            57
## 6            162         315            88
## 7             62          39            25
## 8            224         404           144
## 9             28          19            34
## 10            45          42            20
## 11            30          39            39
## 12            54          65            55
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## i Please use tidy evaluation idioms with `aes()`.
## i See also `vignette("ggplot2-in-packages")` for more information.
## i 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.
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## i Please use the `linewidth` argument instead.
## i 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.

## 202603: I successfully recapitulated previous non-container result.

inclusion_sig <- extract_significant_genes(
  inclusion_tables, lfc = lfc_cutoff, p = adjp_cutoff, according_to = "deseq",
  excel = glue("04inclusion_comparisons/inclusion_sig-v{ver}.xlsx"))
inclusion_sig
## A set of genes deemed significant according to deseq.
## The parameters defining significant were:
## LFC cutoff: 0.1 adj P cutoff: 0.1
##                deseq_up deseq_down
## p15_het_dlgn       2067       2381
## p08_het_dlgn        180        349
## p15_ko_dlgn        2544       2633
## p08_ko_dlgn         397        572
## p15_het_retina      402        223
## p08_het_retina      976        380
## p15_ko_retina       347         93
## p08_ko_retina      1551        859
## p15_het_scn          15          9
## p08_het_scn         225         55
## p15_ko_scn            8          6
## p08_ko_scn          112        116

202505: A strange thing happened here in this iteration: the plot of the significant genes is the exact same as the previous iteration; but the table of numbers of genes looks different.

For example, the previous table showed: p15_het_dlgn with 2067 up and 2381 down. The plot shows exactly that; but the new table shows 607 up and 1229 down. Let us check the actual data structure and see what is up?

I think I get it: when we do the extract_significant_genes above, we explicitly set a non-standard p-value and logFC because we are explicitly attempting to use a very loose definition of the set of genes which are in greater abundance than their most similar wild-type. However, when I create the barplot of significant genes; those values are explicitly set to 0,1,2 logFCs and p-value 0.05. Therefore, what I need to do, in order to check consistency, is to repeat this call but with the default FC/p values and see what the numbers look like.

test_inclusion <- extract_significant_genes(
  inclusion_tables, according_to = "deseq", excel = "excel/default_inclusion_sig.xlsx")
test_inclusion
## A set of genes deemed significant according to deseq.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##                deseq_up deseq_down
## p15_het_dlgn        536        971
## p08_het_dlgn         15         79
## p15_ko_dlgn         903       1333
## p08_ko_dlgn         117        282
## p15_het_retina      151         58
## p08_het_retina      432        110
## p15_ko_retina       107         34
## p08_ko_retina       533        155
## p15_het_scn          11          8
## p08_het_scn          48          8
## p15_ko_scn            7          5
## p08_ko_scn           31         26

Yeah, I think this makes sense; what I need to do: change the significant bar plot so that it uses the lfc cutoff argument as the second of its 3 cutoffs. That should ensure that these numbers are consistent across analyses and parameters provided.

dim(inclusion_sig$deseq$ups$p15_het_dlgn)
## [1] 2067   75
test_all_up <- inclusion_tables$data$p15_het_dlgn[["deseq_logfc"]] > 0.1 &
  inclusion_tables$data$p15_het_dlgn[["deseq_adjp"]] <= 0.1
summary(test_all_up)
##    Mode   FALSE    TRUE 
## logical   17841    2067

Ohh, I get it, when I was testing this out manually, I set the logFC to 1.0 instead of the very minimal 0.1 we have been using for this!

22 MA/Volcano plots of x vs wt

Rashmi asked to see the comparisons against wt; I will name each file xw to show that it is x vs wt. for whatever other parameters are being examined. It is likely that some colors will be wrong because this is my first time creating these plots and we are doing them manually.

22.1 p15_het_dlgn

allc <- color_choices[["all"]]
table_name <- "p15_het_dlgn"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p15_het_dlgn"
denom <- "p15_wt_dlgn"
hw_p15_dlgn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)

pp(file = "05inclusion_volcano_ma/hw_p15_dlgn_volcano.pdf", width = 9, height = 9)
## Warning in pp(file = "05inclusion_volcano_ma/hw_p15_dlgn_volcano.pdf", width =
## 9, : The directory: 05inclusion_volcano_ma does not exist, will attempt to
## create it.
hw_p15_dlgn_volcano[["plot"]]
plotted <- dev.off()
hw_p15_dlgn_volcano[["plot"]]

hw_p15_dlgn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)

pp(file = "05inclusion_volcano_ma/hw_p15_dlgn_ma.pdf", width = 9, height = 9)
hw_p15_dlgn_ma[["plot"]]
plotted <- dev.off()
hw_p15_dlgn_ma[["plot"]]

22.2 p08_het_dlgn

table_name <- "p08_het_dlgn"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p08_het_dlgn"
denom <- "p08_wt_dlgn"
hw_p08_dlgn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/hw_p08_dlgn_volcano.pdf", width = 9, height = 9)
hw_p08_dlgn_volcano[["plot"]]
plotted <- dev.off()
hw_p08_dlgn_volcano[["plot"]]

hw_p08_dlgn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma/hw_p08_dlgn_ma.pdf", width = 9, height = 9)
hw_p08_dlgn_ma[["plot"]]
plotted <- dev.off()
hw_p08_dlgn_ma[["plot"]]

22.3 p15_ko_dlgn

table_name <- "p15_ko_dlgn"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p15_ko_dlgn"
denom <- "p15_wt_dlgn"
kw_p15_dlgn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/kw_p15_dlgn_volcano.pdf", width = 9, height = 9)
kw_p15_dlgn_volcano[["plot"]]
plotted <- dev.off()
kw_p15_dlgn_volcano[["plot"]]

kw_p15_dlgn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma/kw_p15_dlgn_ma.pdf", width = 9, height = 9)
kw_p15_dlgn_ma[["plot"]]
plotted <- dev.off()
kw_p15_dlgn_ma[["plot"]]

22.4 p08_ko_dlgn

table_name <- "p08_ko_dlgn"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p08_ko_dlgn"
denom <- "p08_wt_dlgn"
kw_p08_dlgn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/kw_p08_dlgn_volcano.pdf", width = 9, height = 9)
kw_p08_dlgn_volcano[["plot"]]
plotted <- dev.off()
kw_p08_dlgn_volcano[["plot"]]

kw_p08_dlgn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma/kw_p08_dlgn_ma.pdf", width = 9, height = 9)
kw_p08_dlgn_ma[["plot"]]
plotted <- dev.off()
kw_p08_dlgn_ma[["plot"]]

22.5 p15_het_retina

table_name <- "p15_het_retina"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p15_het_retina"
denom <- "p15_wt_retina"
hw_p15_retina_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/hw_p15_retina_volcano.pdf", width = 9, height = 9)
hw_p15_retina_volcano[["plot"]]
plotted <- dev.off()
hw_p15_retina_volcano[["plot"]]

hw_p15_retina_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma/hw_p15_retina_ma.pdf", width = 9, height = 9)
hw_p15_retina_ma[["plot"]]
plotted <- dev.off()
hw_p15_retina_ma[["plot"]]

22.6 p08_het_retina

table_name <- "p08_het_retina"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p08_het_retina"
denom <- "p08_wt_retina"
hw_p08_retina_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/hw_p08_retina_volcano.pdf", width = 9, height = 9)
hw_p08_retina_volcano[["plot"]]
plotted <- dev.off()
hw_p08_retina_volcano[["plot"]]

hw_p08_retina_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma/hw_p08_retina_ma.pdf", width = 9, height = 9)
hw_p08_retina_ma[["plot"]]
plotted <- dev.off()
hw_p08_retina_ma[["plot"]]

22.7 p15_ko_retina

table_name <- "p15_ko_retina"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p15_ko_retina"
denom <- "p15_wt_retina"
kw_p15_retina_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/kw_p15_retina_volcano.pdf", width = 9, height = 9)
kw_p15_retina_volcano[["plot"]]
plotted <- dev.off()
kw_p15_retina_volcano[["plot"]]

kw_p15_retina_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma/kw_p15_retina_ma.pdf", width = 9, height = 9)
kw_p15_retina_ma[["plot"]]
plotted <- dev.off()
kw_p15_retina_ma[["plot"]]

22.8 p08_ko_retina

table_name <- "p08_ko_retina"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p08_ko_retina"
denom <- "p08_wt_retina"
kw_p08_retina_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/kw_p08_retina_volcano.pdf", width = 9, height = 9)
kw_p08_retina_volcano[["plot"]]
plotted <- dev.off()
kw_p08_retina_volcano[["plot"]]

kw_p08_retina_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma_p08_retina_ma.pdf", width = 9, height = 9)
kw_p08_retina_ma[["plot"]]
plotted <- dev.off()
kw_p08_retina_ma[["plot"]]

22.9 p15_het_scn

table_name <- "p15_het_scn"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p15_het_scn"
denom <- "p15_wt_scn"
hw_p15_scn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/hw_p15_scn_volcano.pdf", width = 9, height = 9)
hw_p15_scn_volcano[["plot"]]
plotted <- dev.off()
hw_p15_scn_volcano[["plot"]]

hw_p15_scn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma/hw_p15_scn_ma.pdf", width = 9, height = 9)
hw_p15_scn_ma[["plot"]]
plotted <- dev.off()
hw_p15_scn_ma[["plot"]]

22.10 p08_het_scn

table_name <- "p08_het_scn"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p08_het_scn"
denom <- "p08_wt_scn"
hw_p08_scn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/hw_p08_scn_volcano.pdf", width = 9, height = 9)
hw_p08_scn_volcano[["plot"]]
plotted <- dev.off()
hw_p08_scn_volcano[["plot"]]

hw_p08_scn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma/hw_p08_scn_ma.pdf", width = 9, height = 9)
hw_p08_scn_ma[["plot"]]
plotted <- dev.off()
hw_p08_scn_ma[["plot"]]

22.11 p15_ko_scn

table_name <- "p15_ko_scn"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p15_ko_scn"
denom <- "p15_wt_scn"
kw_p15_scn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/kw_p15_scn_volcano.pdf", width = 9, height = 9)
kw_p15_scn_volcano[["plot"]]
plotted <- dev.off()
kw_p15_scn_volcano[["plot"]]

kw_p15_scn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma/kw_p15_scn_ma.pdf", width = 9, height = 9)
kw_p15_scn_ma[["plot"]]
plotted <- dev.off()
kw_p15_scn_ma[["plot"]]

22.12 p08_ko_scn

table_name <- "p08_ko_scn"
table <- inclusion_tables[["data"]][[table_name]]
num <- "p08_ko_scn"
denom <- "p08_wt_scn"
kw_p08_scn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = allc[[denom]], color_high = allc[[num]],
  label_column = "mgi_symbol", label = 10, alpha = 1.0,
  size = 4)
pp(file = "05inclusion_volcano_ma/kw_p08_scn_volcano.pdf", width = 9, height = 9)
kw_p08_scn_volcano[["plot"]]
plotted <- dev.off()
kw_p08_scn_volcano[["plot"]]

kw_p08_scn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = allc[[denom]], color_high = allc[[num]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", outline = outline,
  label = 10)
pp(file = "05inclusion_volcano_ma/kw_p08_scn_ma.pdf", width = 9, height = 9)
kw_p08_scn_ma[["plot"]]
plotted <- dev.off()
kw_p08_scn_ma[["plot"]]

See the shared/unique genes in these sets.

inclusion_upsets <- upsetr_sig(inclusion_sig)
inclusion_intersects <- write_upset_groups(
  inclusion_upsets, excel = "04inclusion_comparison/inclusion_gene_groups.xlsx")

22.12.1 Extract genes included for each set of contrasts

Now, using that function, pull out the gene IDs of genes we do not trust because they were too high in wt for every contrast we are likely to perform.

The following was a modified version of the inclusion function which is somewhat more restrictive.

extract_inclusions_strict <- function(inclusion_sig, inclusion_tables, inclusions, keepers,
                                      all_genes, according_to = "deseq", which = "ups") {
  retlist <- list()
  table_names <- names(inclusion_sig[[according_to]][[which]])
  for (c_num in seq_along(keepers)) {
    contrast <- names(keepers)[c_num]
    numerator_name <- keepers[[c_num]][1]
    denominator_name <- keepers[[c_num]][2]
    ## In my new branch I cleaned up the sanitizer function for contrasts so this is not needed.
    ## The following two lines are no longer needed because of the cleanups I performed.
    ##numerator_name <- gsub(x = numerator_name, pattern = "(het|ko|wt)", replacement = "_\\1_")
    ##denominator_name <- gsub(x = denominator_name, pattern = "(het|ko|wt)", replacement = "_\\1_")
    numerator_table <- inclusion_sig[[according_to]][[which]][[numerator_name]]
    numerator_genes <- rownames(numerator_table)
    denominator_table <- inclusion_sig[[according_to]][[which]][[denominator_name]]
    denominator_genes <- rownames(denominator_table)
    df_columns <- paste0("deseq_", c("logfc", "adjp", "den"))
    included_num <- inclusion_tables[["data"]][[numerator_name]][, df_columns]
    colnames(included_num) <- c("numerator_vs_wt_logfc", "numerator_vs_wt_adjp", "num_wt_mean_exprs")
    included_den <- inclusion_tables[["data"]][[denominator_name]][, df_columns]
    colnames(included_den) <- c("denominator_vs_wt_logfc", "denominator_vs_wt_adjp", "den_wt_mean_exprs")
    ## I think this is where things went wrong,
    ## compare this modified line to the original to prove it.
    included_df <- merge(included_num, included_den, by = "row.names")
    ## Previously, I did not specify the merge action, all = FALSE by default.
    ## This then will result in a difference in the rows observed
    ## included_df <- merge(included_num, included_den, by = "row.names", all = FALSE)
    rownames(included_df) <- included_df[["Row.names"]]
    included_df[["Row.names"]] <- NULL
    concatenated_genes <- c(numerator_genes, denominator_genes)
    both_gene_idx <- duplicated(concatenated_genes)
    genes_in_both <- concatenated_genes[both_gene_idx]
    message("The set of unique genes higher in ", numerator_name,
            " vs. wt is ", length(numerator_genes), ".")
    message("The set of unique genes higher in ", denominator_name,
            " vs. wt is ", length(denominator_genes), ".")
    message("The intersection of them is ", length(genes_in_both), " genes.")
    include_name <- paste0("inc_", contrast)
    include_idx <- all_genes %in% genes_in_both
    include_genes <- all_genes[include_idx]
    df_name <- paste0("df_", contrast)
    retlist[[df_name]] <- included_df
    written_inclusion <- write_xlsx(
      data = included_df,
      excel = glue("07included_strict_genes_excel/{include_name}-v{ver}.xlsx"))
    retlist[[include_name]] <- include_genes
    retlist[[contrast]] <- include_genes
  }
  return(retlist)
}

This is the pre-202505 version of this function.

extract_inclusions <- function(inclusion_sig, inclusion_tables, inclusions, keepers, all_genes,
                               according_to = "deseq", which = "ups") {
  retlist <- list()
  table_names <- names(inclusion_sig[[according_to]][[which]])
  for (c_num in seq_along(keepers)) {
    contrast <- names(keepers)[c_num]
    numerator_name <- keepers[[c_num]][1]
    denominator_name <- keepers[[c_num]][2]
    ## In my new branch I cleaned up the sanitizer function for contrasts so this is not needed.
    ## The following two lines are no longer needed because of the cleanups I performed.
    ##numerator_name <- gsub(x = numerator_name, pattern = "(het|ko|wt)", replacement = "_\\1_")
    ##denominator_name <- gsub(x = denominator_name, pattern = "(het|ko|wt)", replacement = "_\\1_")
    numerator_table <- inclusion_sig[[according_to]][[which]][[numerator_name]]
    numerator_genes <- rownames(numerator_table)
    denominator_table <- inclusion_sig[[according_to]][[which]][[denominator_name]]
    denominator_genes <- rownames(denominator_table)
    df_columns <- paste0("deseq_", c("logfc", "adjp", "den"))
    included_num <- inclusion_tables[["data"]][[numerator_name]][, df_columns]
    colnames(included_num) <- c("numerator_vs_wt_logfc", "numerator_vs_wt_adjp", "num_wt_mean_exprs")
    included_den <- inclusion_tables[["data"]][[denominator_name]][, df_columns]
    colnames(included_den) <- c("denominator_vs_wt_logfc", "denominator_vs_wt_adjp", "den_wt_mean_exprs")
    included_df <- merge(included_num, included_den, by = "row.names")
    rownames(included_df) <- included_df[["Row.names"]]
    included_df[["Row.names"]] <- NULL
    include_genes <- unique(c(numerator_genes, denominator_genes))
    message("The set of unique genes higher in ", numerator_name,
            " vs. wt is ", length(numerator_genes), ".")
    message("The set of unique genes higher in ", denominator_name,
            " vs. wt is ", length(denominator_genes), ".")
    message("The unique union of them is ", length(include_genes), " genes.")
    include_name <- paste0("inc_", contrast)
    include_idx <- all_genes %in% include_genes
    include_genes <- all_genes[include_idx]
    df_name <- paste0("df_", contrast)
    retlist[[df_name]] <- included_df
    written_inclusion <- write_xlsx(data = included_df,
                                    excel = glue("included_genes/{include_name}-v{ver}.xlsx"))
    retlist[[include_name]] <- include_genes
    retlist[[contrast]] <- include_genes
  }
  return(retlist)
}

23 ‘Normal’ Inclusion extraction

Here is the full set of gene IDs

all_genes <- rownames(assay(v3_pairwise_input))

In the following blocks I am including the union of genes observed higher than wt in either of the numerator or denominator for each contrast.

23.1 Time

time_inclusions <- extract_inclusions(inclusion_sig, inclusion_tables, inclusions,
                                      time_keepers, all_genes)
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The unique union of them is 2113 genes.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The unique union of them is 2716 genes.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The unique union of them is 1086 genes.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The unique union of them is 1664 genes.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The unique union of them is 238 genes.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The unique union of them is 120 genes.

23.2 Location

location_inclusions <- extract_inclusions(inclusion_sig, inclusion_tables, inclusions,
                                          location_keepers, all_genes)
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The unique union of them is 1134 genes.
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The unique union of them is 2361 genes.
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The unique union of them is 1883 genes.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The unique union of them is 2843 genes.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The unique union of them is 1188 genes.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The unique union of them is 417 genes.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The unique union of them is 1624 genes.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The unique union of them is 355 genes.
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The unique union of them is 402 genes.
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The unique union of them is 2080 genes.
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The unique union of them is 493 genes.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The unique union of them is 2550 genes.

23.3 Genotype

genotype_inclusions <- extract_inclusions(inclusion_sig, inclusion_tables, inclusions,
                                          genotype_keepers, all_genes)
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The unique union of them is 501 genes.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The unique union of them is 2773 genes.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The unique union of them is 1760 genes.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The unique union of them is 571 genes.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The unique union of them is 312 genes.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The unique union of them is 18 genes.

24 The strict ‘inclusion’ set

24.1 Time

time_inclusions_strict <- extract_inclusions_strict(inclusion_sig, inclusion_tables, inclusions,
                                                    time_keepers, all_genes)
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The intersection of them is 134 genes.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The intersection of them is 225 genes.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The intersection of them is 292 genes.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The intersection of them is 234 genes.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The intersection of them is 2 genes.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The intersection of them is 0 genes.

24.2 Location

location_inclusions_strict <- extract_inclusions_strict(inclusion_sig, inclusion_tables, inclusions,
                                                        location_keepers, all_genes)
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The intersection of them is 22 genes.
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The intersection of them is 108 genes.
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The intersection of them is 65 genes.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The intersection of them is 48 genes.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The intersection of them is 13 genes.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The intersection of them is 0 genes.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The intersection of them is 39 genes.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The intersection of them is 0 genes.
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The intersection of them is 3 genes.
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The intersection of them is 2 genes.
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The intersection of them is 16 genes.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The intersection of them is 2 genes.

24.3 Genotype

genotype_inclusions_strict <- extract_inclusions_strict(inclusion_sig, inclusion_tables, inclusions,
                                                        genotype_keepers, all_genes)
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The intersection of them is 76 genes.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The intersection of them is 1838 genes.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The intersection of them is 767 genes.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The intersection of them is 178 genes.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The intersection of them is 25 genes.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The intersection of them is 5 genes.

24.3.1 Check vs Theresa’s filter

Up above Theresa performed a 0.25 log2FC and 0.05 adjp filter which provided a set of 2,640 genes observed higher in the p08 het retinas vs. wt retinas. I should see that in this inclusion_sig data structure.

There is an important caveat though: in Theresa’s filter above, she did a DE of only the retina samples but I did all samples. I expected that this would result in basically the same result (I actually assumed I would get a few more genes), but instead it appears to have retrieved a significantly smaller number of genes (about 1/2, happily they pretty much all appear in the previous filter). As a result, I am going to try relaxing my constraints slightly to see if I can recapitulate her filter (which would match Theresa’s later filter, though I guess that in turn will lead to a smaller set of genes compared to her later, relaxed 0.1 filter).

comparison <- inclusion_sig[["deseq"]][["ups"]][["p08_het_retina"]]
comp <- list(
  "taa" = taa_keepers,
  "new" = rownames(comparison))
test_comparison <- Vennerable::Venn(comp)
Vennerable::plot(test_comparison)

I want to have a little function which, given a contrast of interest, will extract the gene sets which should be included/excluded given the above.

write_all_cp <- function(all_cp, prefix = "12", suffix = "") {
  all_written <- list()
  for (g in seq_len(length(all_cp))) {
    name <- names(all_cp)[g]
    datum <- all_cp[[name]]
    filename <- glue("{prefix}enrichment_excel/{name}_cprofiler{suffix}-v{ver}.xlsx")
    written <- sm(write_cp_data(datum, excel = filename))
    all_written[[g]] <- written
  }
  return(all_written)
}
write_all_gp <- function(all_gp, prefix = "13", suffix = "") {
  all_written <- list()
  for (g in seq_len(length(all_gp))) {
    name <- names(all_gp)[g]
    datum <- all_gp[[name]]
    filename <- glue("{prefix}enrichment_excel/{name}_gprofiler{suffix}-v{ver}.xlsx")
    written <- sm(write_gprofiler_data(datum, excel = filename))
    all_written[[g]] <- written
  }
  return(all_written)
}
write_all_en <- function(all_en, prefix = "14", suffix = "") {
  all_written <- list()
  for (e in seq_len(length(all_en))) {
    name <- names(all_en)[e]
    datum <- all_en[[name]]
    filename <- glue("{prefix}enrichment_excel/{name}_enricher{suffix}-v{ver}.xlsx")
    written <- sm(write_enricher_data(datum, excel = filename))
    all_written[[e]] <- written
  }
  return(all_written)
}

24.3.2 Extract genes included for each set of contrasts

Now, using that function, pull out the gene IDs of genes we do not trust because they were too high in wt for every contrast we are likely to perform.

all_genes <- rownames(assay(v3_pairwise_input))
time_inclusions <- extract_inclusions(inclusion_sig, inclusion_tables, inclusions,
                                      time_keepers, all_genes)
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The unique union of them is 2113 genes.
## Deleting the file included_genes/inc_t_het_dlgn-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The unique union of them is 2716 genes.
## Deleting the file included_genes/inc_t_ko_dlgn-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The unique union of them is 1086 genes.
## Deleting the file included_genes/inc_t_het_retina-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The unique union of them is 1664 genes.
## Deleting the file included_genes/inc_t_ko_retina-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The unique union of them is 238 genes.
## Deleting the file included_genes/inc_t_het_scn-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The unique union of them is 120 genes.
## Deleting the file included_genes/inc_t_ko_scn-v20260314.xlsx before writing the tables.
location_inclusions <- extract_inclusions(inclusion_sig, inclusion_tables, inclusions,
                                          location_keepers, all_genes)
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The unique union of them is 1134 genes.
## Deleting the file included_genes/inc_dr_p08_het-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The unique union of them is 2361 genes.
## Deleting the file included_genes/inc_dr_p15_het-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The unique union of them is 1883 genes.
## Deleting the file included_genes/inc_dr_p08_ko-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The unique union of them is 2843 genes.
## Deleting the file included_genes/inc_dr_p15_ko-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The unique union of them is 1188 genes.
## Deleting the file included_genes/inc_sr_p08_het-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The unique union of them is 417 genes.
## Deleting the file included_genes/inc_sr_p15_het-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The unique union of them is 1624 genes.
## Deleting the file included_genes/inc_sr_p08_ko-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The unique union of them is 355 genes.
## Deleting the file included_genes/inc_sr_p15_ko-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The unique union of them is 402 genes.
## Deleting the file included_genes/inc_ds_p08_het-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The unique union of them is 2080 genes.
## Deleting the file included_genes/inc_ds_p15_het-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The unique union of them is 493 genes.
## Deleting the file included_genes/inc_ds_p08_ko-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The unique union of them is 2550 genes.
## Deleting the file included_genes/inc_ds_p15_ko-v20260314.xlsx before writing the tables.
genotype_inclusions <- extract_inclusions(inclusion_sig, inclusion_tables, inclusions,
                                          genotype_keepers, all_genes)
## The set of unique genes higher in p08_ko_dlgn vs. wt is 397.
## The set of unique genes higher in p08_het_dlgn vs. wt is 180.
## The unique union of them is 501 genes.
## Deleting the file included_genes/inc_kh_p08_dlgn-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_ko_dlgn vs. wt is 2544.
## The set of unique genes higher in p15_het_dlgn vs. wt is 2067.
## The unique union of them is 2773 genes.
## Deleting the file included_genes/inc_kh_p15_dlgn-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p08_ko_retina vs. wt is 1551.
## The set of unique genes higher in p08_het_retina vs. wt is 976.
## The unique union of them is 1760 genes.
## Deleting the file included_genes/inc_kh_p08_retina-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_ko_retina vs. wt is 347.
## The set of unique genes higher in p15_het_retina vs. wt is 402.
## The unique union of them is 571 genes.
## Deleting the file included_genes/inc_kh_p15_retina-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p08_ko_scn vs. wt is 112.
## The set of unique genes higher in p08_het_scn vs. wt is 225.
## The unique union of them is 312 genes.
## Deleting the file included_genes/inc_kh_p08_scn-v20260314.xlsx before writing the tables.
## The set of unique genes higher in p15_ko_scn vs. wt is 8.
## The set of unique genes higher in p15_het_scn vs. wt is 15.
## The unique union of them is 18 genes.
## Deleting the file included_genes/inc_kh_p15_scn-v20260314.xlsx before writing the tables.

24.4 Perform the DE analyses and exclude the target genes

24.4.1 Genotype

genotype_de <- all_pairwise(v3_pairwise_input, filter = TRUE, model_fstring = default_fstring,
                            keepers = genotype_keepers, model_svs = "svaseq")
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Removing 10162 low-count genes (15263 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 109425 entries to zero.
## This received a matrix of SVs.
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2

genotype_de
## 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 6 comparisons.

24.4.2 Location

location_de <- all_pairwise(v3_pairwise_input, filter = TRUE, model_fstring = default_fstring,
                            keepers = location_keepers, model_svs = "svaseq")
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Removing 10162 low-count genes (15263 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 109425 entries to zero.
## This received a matrix of SVs.
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2

location_de
## 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 12 comparisons.

24.4.3 Time

time_de <- all_pairwise(v3_pairwise_input, filter = TRUE, model_fstring = default_fstring,
                        keepers = time_keepers, model_svs = "svaseq")
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Removing 10162 low-count genes (15263 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 109425 entries to zero.
## This received a matrix of SVs.
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2

time_de
## 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 6 comparisons.

It is near here when the computer sometimes fails with no more tempfiles. In another window I am messing with tempfile() in R to try to understand where it is going off the rails…

24.5 Extract the relevant tables and include genes lower in wt

24.5.1 Genotype contrasts

I will start with the tables and no inclusions so I can check my work.

In this first block I will explain a little more thoroughly what is going on:

  1. Dump the full table of the contrasts I defined above comparing the 3 genotypes across time/location.
  2. Iterate over each of those contrasts and do the following:
    1. Extract the name of the contrast, ‘kh_p08_dlgn’ for example
    2. Yank out that specific entry from the keeper list and its name
    3. Yank out the corresponding set of genes to include from the inclusions data structure.
    4. Create a filename given the name in (a) above and the logFC cutoff chosen for the inclusions (I am assuming we may change this)
    5. Given (b), (c), and (d), extract the corresponding table from the differential expression analysis and include the appropriate genes.
    FIXME: my gprofiler function just assumes human and so if passed mmusculus will incorrectly attempt to connect to non-existant databases. Let us fix that now.
genotype_tables_full <- combine_de_tables(
  genotype_de, keepers = genotype_keepers, label_column = label_column,
  fancy = TRUE,
  excel = glue("08full_contrasts_excel/genotype_full_tables-v{ver}.xlsx"))
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
genotype_tables_full
## A set of combined differential expression results.
##                             table deseq_sigup deseq_sigdown edger_sigup
## 1     p08_ko_dlgn_vs_p08_het_dlgn          24             2          42
## 2     p15_ko_dlgn_vs_p15_het_dlgn          50             2          81
## 3 p08_ko_retina_vs_p08_het_retina           6             2           9
## 4 p15_ko_retina_vs_p15_het_retina           9             5           6
## 5       p08_ko_scn_vs_p08_het_scn          54           135          80
## 6       p15_ko_scn_vs_p15_het_scn           0            16           3
##   edger_sigdown limma_sigup limma_sigdown
## 1             1          41             3
## 2             3           0             0
## 3             2           3             1
## 4             4           0             3
## 5           139          32            28
## 6            29           0             1
## Plot describing unique/shared genes in a differential expression table.

genotype_sig_full <- extract_significant_genes(
  genotype_tables_full, according_to = "deseq",
  excel = glue("08full_contrasts_excel/genotype_full_sig-v{ver}.xlsx"))
genotype_sig_full
## A set of genes deemed significant according to deseq.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##               deseq_up deseq_down
## kh_p08_dlgn         24          2
## kh_p15_dlgn         50          2
## kh_p08_retina        6          2
## kh_p15_retina        9          5
## kh_p08_scn          54        135
## kh_p15_scn           0         16

24.5.2 Search Enrichment of these sets

In this run, we will search the full set of genes, next we will only do the inclusions.

genotype_full_gp <- all_gprofiler(genotype_sig_full, species = "mmusculus",
                                  excel = "09full_contrasts_enrich/genotype_full_gprofiler.xlsx")
## Error : Request to g:Profiler failed (HTTP 400). Please check your input or organism argument.
## API message: No legal source provided. Saw ['MIRNA']
## If the issue persists, please contact biit.support@ut.ee with a reproducible example.
## Error : Request to g:Profiler failed (HTTP 400). Please check your input or organism argument.
## API message: No legal source provided. Saw ['MIRNA']
## If the issue persists, please contact biit.support@ut.ee with a reproducible example.
## Error : Request to g:Profiler failed (HTTP 400). Please check your input or organism argument.
## API message: No legal source provided. Saw ['MIRNA']
## If the issue persists, please contact biit.support@ut.ee with a reproducible example.
## Error : Request to g:Profiler failed (HTTP 400). Please check your input or organism argument.
## API message: No legal source provided. Saw ['MIRNA']
## If the issue persists, please contact biit.support@ut.ee with a reproducible example.
## Error : Request to g:Profiler failed (HTTP 400). Please check your input or organism argument.
## API message: No legal source provided. Saw ['MIRNA']
## If the issue persists, please contact biit.support@ut.ee with a reproducible example.
genotype_full_cp <- all_cprofiler(genotype_sig_full, genotype_tables_full,
                                  orgdb = "org.Mm.eg.db", go_level = go_level, organism = "mouse",
                                  orgdb_from = "ENSEMBL", max_groupsize = max_groupsize,
                                  excel = "09full_contrasts_enrich/genotype_full_cprofiler.xlsx")
## Error : unable to find an inherited method for function 'metadata' for signature 'x = "NULL"'
## Error : unable to find an inherited method for function 'metadata' for signature 'x = "NULL"'
## Error in `simple_cl[["kegg_universe"]]`:
## ! subscript out of bounds
genotype_full_upset <- upsetr_sig(genotype_sig_full)
genotype_full_intersects <- write_upset_groups(genotype_full_upset,
                                               excel = "09full_contrasts_intersections/genotype_full_gene_groups.xlsx")
genotype_tables <- list()
genotype_sig <- list()
genotype_gp <- list()
genotype_cp <- list()
for (k in seq_along(genotype_keepers)) {
  name <- names(genotype_keepers)[k]
  message("Examining ", name)
  keeper <- genotype_keepers[name]
  include_name <- paste0("inc_", name)
  include_df_name <- paste0("df_", name)
  include_df <- genotype_inclusions[[include_df_name]]
  includes <- genotype_inclusions[[include_name]]
  summary(rownames(genotype_sig_full[["deseq"]][["ups"]][[name]]) %in% includes)
  include_filename <- glue("genotype_contrasts/genotype_{name}_including_wt_{lfc_cutoff}_decreased_table-v{ver}.xlsx")
  include_sig_filename <- glue("genotype_contrasts/genotype_{name}_including_wt_{lfc_cutoff}_decreased_sig-v{ver}.xlsx")
  genotype_tables[[name]] <- combine_de_tables(
    genotype_de, extra_annot = include_df,
    keepers = keeper, label_column = label_column,
    excel = include_filename, wanted_genes = includes)
  print(genotype_tables[[name]])
  genotype_sig[[name]] <- extract_significant_genes(
    genotype_tables[[name]], according_to = "deseq",
    excel = include_sig_filename)
  print(genotype_sig[[name]])
  num_rows <- nrow(genotype_sig[[name]][["deseq"]][["ups"]][[name]]) +
    nrow(genotype_sig[[name]][["deseq"]][["downs"]][[name]])
  message("There are ", num_rows, " significant up and down genes.")
  if (num_rows >= 10) {
    message("Performing gprofiler/clusterProfiler.")
    genotype_gp[[name]] <- all_gprofiler(genotype_sig[[name]], species = "mmusculus")
    gp_written <- write_all_gp(genotype_gp[[name]])
    genotype_cp[[name]] <- all_cprofiler(genotype_sig[[name]], genotype_tables[[name]],
                                         orgdb = "org.Mm.eg.db", kegg_organism = "mmu")
    cp_written <- write_all_cp(genotype_cp[[name]])
  } else {
    warning("There are less than 10 genes up and down in the ", name, " comparison.")
    message("There are less than 10 genes up and down in the ", name, " comparison.")
  }
}
## Examining kh_p08_dlgn
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
## A set of combined differential expression results.
##                         table deseq_sigup deseq_sigdown edger_sigup
## 1 p08_ko_dlgn_vs_p08_het_dlgn          23             1          30
##   edger_sigdown limma_sigup limma_sigdown
## 1             0          26             0
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

## A set of genes deemed significant according to deseq.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##             deseq_up deseq_down
## kh_p08_dlgn       23          1

## There are 24 significant up and down genes.
## Performing gprofiler/clusterProfiler.
## Error : Request to g:Profiler failed (HTTP 400). Please check your input or organism argument.
## API message: No legal source provided. Saw ['MIRNA']
## If the issue persists, please contact biit.support@ut.ee with a reproducible example.
## Warning in simple_clusterprofiler(sig_genes = structure(list(ensembl_gene_id =
## c("ENSMUSG00000041144", : No genes were found between the significant genes and
## the universe.
## Error in testForValidKeytype(x, keytype) : 
##   'keytype' must be a a single string
## Error in `simple_cl[["kegg_universe"]]`:
## ! subscript out of bounds

A few specific plots of interest: Colenso asked to label a few genes for the knockout/het p08_retinas, p08_scn, and p08_dlgn: either the top-15 or all significant. I am pretty sure if I tell it 15 and there are not that many, it will just do the significant? Let us find out!

24.5.2.1 ko/het for p08 retinas

For some crazy reason, this plot is double-labelling!

table_name <- "kh_p08_retina"
table_input <- genotype_tables[[table_name]]
table <- table_input[["data"]][[table_name]]
interesting <- c("Opn4", "Gm9008", "Lrr1", "Cnbd1")
kh_p08_retina_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = colors[["ko_retina"]], color_high = colors[["het_retina"]],
  label_column = "mgi_symbol", label = interesting, alpha = 1.0,
  size = 4)
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/kh_p08_retina_volcano.pdf", width = 9, height = 9)
## Warning in pp(file = "images/kh_p08_retina_volcano.pdf", width = 9, height =
## 9): The directory: images does not exist, will attempt to create it.
kh_p08_retina_volcano[["plot"]]
## Error:
## ! object 'kh_p08_retina_volcano' not found
plotted <- dev.off()
kh_p08_retina_volcano[["plot"]]
## Error:
## ! object 'kh_p08_retina_volcano' not found
## why in the crap is it double-labelling!?

## My MA plotter isn't as smart as the volcano plotter, the genes are:
kh_p08_retina_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["ko_retina"]], color_high = colors[["het_retina"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = interesting)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/kh_p08_retina_ma.pdf", width = 9, height = 9)
kh_p08_retina_ma[["plot"]]
## Error:
## ! object 'kh_p08_retina_ma' not found
plotted <- dev.off()
kh_p08_retina_ma[["plot"]]
## Error:
## ! object 'kh_p08_retina_ma' not found

24.5.2.2 ko/het p08 SCN

Holy crappers, this plot did not double label; oooh I have a check in my plotter to see if there are too few/too many labels and I foolishly allowed it to concatenate the labels! What in the crap was I thinking?

I am going to make an executive decision for this plot, 15 is too many and makes it crazy cluttered.

24.5.3 Repeat this with two sets of genes

table_name <- "kh_p08_scn"
table_input <- genotype_tables[[table_name]]
table <- table_input[["data"]][[table_name]]
interesting_genes <- c("Fign", "Nrn1", "Dpysl2", "Actb", "Fgf9", "Otx2", "Sec23",
                       "Ncam1", "Map4", "Sec22b", "Nlgn3", "Marcks", "Cd47",
                       "Dpysl3", "Lin7c", "Cadm1", "Snx12", "Rhoa", "Inpp5f",
                       "Atg12", "Set", "Gsk3b", "Pdcd4", "Gabra2", "Tmco1", "Anapc16")
kh_p08_scn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp",
  label_column = "mgi_symbol", label = interesting_genes, size = 4, alpha = 1.0,
  color_low = colors[["ko_scn"]], color_high = colors[["het_scn"]])
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/kh_p08_scn_volcano.pdf", width = 9, height = 9)
kh_p08_scn_volcano[["plot"]]
## Error:
## ! object 'kh_p08_scn_volcano' not found
plotted <- dev.off()
kh_p08_scn_volcano[["plot"]]
## Error:
## ! object 'kh_p08_scn_volcano' not found
## why in the crap is it double-labelling!?
## My MA plotter isn't as smart as the volcano plotter, the genes are:
kh_p08_scn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["ko_scn"]], color_high = colors[["het_scn"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = interesting_genes)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/kh_p08_scn_ma.pdf", width = 9, height = 9)
kh_p08_scn_ma[["plot"]]
## Error:
## ! object 'kh_p08_scn_ma' not found
plotted <- dev.off()
kh_p08_scn_ma[["plot"]]
## Error:
## ! object 'kh_p08_scn_ma' not found

24.5.3.1 Same plot but a different set of labeled genes

table_name <- "kh_p08_scn"
table_input <- genotype_tables[[table_name]]
table <- table_input[["data"]][[table_name]]
interesting_genes <- c(
  "Anapc16", "Gabra2", "Tmco1", "Sod2", "Fgf9", "Pdcd4", "Rhoa", "Gsk3b", "Foxp1",
  "Ncam1", "Marcks", "Fign", "Dpysl3", "Inpp5f", "Cadm1", "Map4", "Ugcg", "Elovl4",
  "Elavl1", "Cfl2", "Tnnt1", "Gnb1", "Impact", "Nrn1", "Nlgn3", "Actb", "Cd47",
  "Sec22b", "Slc17a7", "Vglut1", "Actb", "B4galt5", "Foxp1", "Otx2", "Lin7c",
  "Snx12", "Atg12", "Set")
kh_p08_scn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp",
  color_low = colors[["ko_scn"]], color_high = colors[["het_scn"]],
  label_column = "mgi_symbol", label = interesting_genes, size = 4, alpha = 1.0)
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/kh_p08_scn_volcano_v2.pdf", width = 9, height = 9)
kh_p08_scn_volcano[["plot"]]
## Error:
## ! object 'kh_p08_scn_volcano' not found
plotted <- dev.off()
kh_p08_scn_volcano[["plot"]]
## Error:
## ! object 'kh_p08_scn_volcano' not found
## why in the crap is it double-labelling!?
## My MA plotter isn't as smart as the volcano plotter, the genes are:
kh_p08_scn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["ko_scn"]], color_high = colors[["het_scn"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = interesting_genes)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/kh_p08_scn_ma_v2.pdf", width = 9, height = 9)
kh_p08_scn_ma[["plot"]]
## Error:
## ! object 'kh_p08_scn_ma' not found
plotted <- dev.off()
kh_p08_scn_ma[["plot"]]
## Error:
## ! object 'kh_p08_scn_ma' not found

24.5.3.2 ko/het p08 dLGN

table_name <- "kh_p08_dlgn"
table_input <- genotype_tables[[table_name]]
table <- table_input[["data"]][[table_name]]
kh_p08_dlgn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp",
  color_low = colors[["ko_dlgn"]], color_high = colors[["het_dlgn"]],
  label_column = "mgi_symbol", label = 10, size = 4, alpha = 1.0)
pp(file = "images/kh_p08_dlgn_volcano.pdf", width = 9, height = 9)
kh_p08_dlgn_volcano[["plot"]]
plotted <- dev.off()
kh_p08_dlgn_volcano[["plot"]]

## My MA plotter isn't as smart as the volcano plotter, the genes are:
kh_p08_dlgn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["ko_dlgn"]], color_high = colors[["het_dlgn"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = 10)
pp(file = "images/kh_p08_dlgn_ma.pdf", width = 9, height = 9)
kh_p08_dlgn_ma[["plot"]]
plotted <- dev.off()
kh_p08_dlgn_ma[["plot"]]

24.5.3.3 ko/het for p15 retinas

For some crazy reason, this plot is double-labelling!

table_name <- "kh_p15_retina"
table_input <- genotype_tables[[table_name]]
table <- table_input[["data"]][[table_name]]
interesting <- c("Opn4", "Gm9008", "Lrr1", "Cnbd1")
kh_p15_retina_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp", fill = "black",
  color_low = colors[["ko_retina"]], color_high = colors[["het_retina"]],
  label_column = "mgi_symbol", label = interesting, alpha = 1.0,
  size = 4)
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/kh_p15_retina_volcano.pdf", width = 9, height = 9)
kh_p15_retina_volcano[["plot"]]
## Error:
## ! object 'kh_p15_retina_volcano' not found
plotted <- dev.off()
kh_p15_retina_volcano[["plot"]]
## Error:
## ! object 'kh_p15_retina_volcano' not found
## why in the crap is it double-labelling!?
## My MA plotter isn't as smart as the volcano plotter, the genes are:
kh_p15_retina_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["ko_retina"]], color_high = colors[["het_retina"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = interesting)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/kh_p15_retina_ma.pdf", width = 9, height = 9)
kh_p15_retina_ma[["plot"]]
## Error:
## ! object 'kh_p15_retina_ma' not found
plotted <- dev.off()
kh_p15_retina_ma[["plot"]]
## Error:
## ! object 'kh_p15_retina_ma' not found

24.5.3.4 ko/het p15 SCN

Holy crappers, this plot did not double label; oooh I have a check in my plotter to see if there are too few/too many labels and I foolishly allowed it to concatenate the labels! What in the crap was I thinking?

I am going to make an executive decision for this plot, 15 is too many and makes it crazy cluttered.

24.5.4 Repeat this with two sets of genes

table_name <- "kh_p15_scn"
table_input <- genotype_tables[[table_name]]
table <- table_input[["data"]][[table_name]]
interesting_genes <- c("Fign", "Nrn1", "Dpysl2", "Actb", "Fgf9", "Otx2", "Sec23",
                       "Ncam1", "Map4", "Sec22b", "Nlgn3", "Marcks", "Cd47",
                       "Dpysl3", "Lin7c", "Cadm1", "Snx12", "Rhoa", "Inpp5f",
                       "Atg12", "Set", "Gsk3b", "Pdcd4", "Gabra2", "Tmco1", "Anapc16")
kh_p15_scn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp",
  label_column = "mgi_symbol", size = 4, alpha = 1.0,
  color_low = colors[["ko_scn"]], color_high = colors[["het_scn"]])
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/kh_p15_scn_volcano.pdf", width = 9, height = 9)
kh_p15_scn_volcano[["plot"]]
## Error:
## ! object 'kh_p15_scn_volcano' not found
plotted <- dev.off()
kh_p15_scn_volcano[["plot"]]
## Error:
## ! object 'kh_p15_scn_volcano' not found
## why in the crap is it double-labelling!?
## My MA plotter isn't as smart as the volcano plotter, the genes are:
kh_p15_scn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["ko_scn"]], color_high = colors[["het_scn"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = interesting_genes)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/kh_p15_scn_ma.pdf", width = 9, height = 9)
kh_p15_scn_ma[["plot"]]
## Error:
## ! object 'kh_p15_scn_ma' not found
plotted <- dev.off()
kh_p15_scn_ma[["plot"]]
## Error:
## ! object 'kh_p15_scn_ma' not found
table_name <- "kh_p15_scn"
table_input <- genotype_tables[[table_name]]
table <- table_input[["data"]][[table_name]]
interesting_genes <- c(
  "Anapc16", "Gabra2", "Tmco1", "Sod2", "Fgf9", "Pdcd4", "Rhoa", "Gsk3b", "Foxp1",
  "Ncam1", "Marcks", "Fign", "Dpysl3", "Inpp5f", "Cadm1", "Map4", "Ugcg", "Elovl4",
  "Elavl1", "Cfl2", "Tnnt1", "Gnb1", "Impact", "Nrn1", "Nlgn3", "Actb", "Cd47",
  "Sec22b", "Slc17a7", "Vglut1", "Actb", "B4galt5", "Foxp1", "Otx2", "Lin7c",
  "Snx12", "Atg12", "Set")
kh_p15_scn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp",
  color_low = colors[["ko_scn"]], color_high = colors[["het_scn"]],
  label_column = "mgi_symbol", label = interesting_genes, size = 4, alpha = 1.0)
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/kh_p15_scn_volcano_v2.pdf", width = 9, height = 9)
kh_p15_scn_volcano[["plot"]]
## Error:
## ! object 'kh_p15_scn_volcano' not found
plotted <- dev.off()
kh_p15_scn_volcano[["plot"]]
## Error:
## ! object 'kh_p15_scn_volcano' not found
## why in the crap is it double-labelling!?
## My MA plotter isn't as smart as the volcano plotter, the genes are:
kh_p15_scn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["ko_scn"]], color_high = colors[["het_scn"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = interesting_genes)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/kh_p15_scn_ma_v2.pdf", width = 9, height = 9)
kh_p15_scn_ma[["plot"]]
## Error:
## ! object 'kh_p15_scn_ma' not found
plotted <- dev.off()
kh_p15_scn_ma[["plot"]]
## Error:
## ! object 'kh_p15_scn_ma' not found

24.5.4.1 ko/het p15 dLGN

table_name <- "kh_p15_dlgn"
table_input <- genotype_tables[[table_name]]
table <- table_input[["data"]][[table_name]]
kh_p15_dlgn_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp",
  color_low = colors[["ko_dlgn"]], color_high = colors[["het_dlgn"]],
  label_column = "mgi_symbol", label = 10, size = 4, alpha = 1.0)
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/kh_p15_dlgn_volcano.pdf", width = 9, height = 9)
kh_p15_dlgn_volcano[["plot"]]
## Error:
## ! object 'kh_p15_dlgn_volcano' not found
plotted <- dev.off()
kh_p15_dlgn_volcano[["plot"]]
## Error:
## ! object 'kh_p15_dlgn_volcano' not found
## My MA plotter isn't as smart as the volcano plotter, the genes are:
kh_p15_dlgn_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["ko_dlgn"]], color_high = colors[["het_dlgn"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = 10)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/kh_p15_dlgn_ma.pdf", width = 9, height = 9)
kh_p15_dlgn_ma[["plot"]]
## Error:
## ! object 'kh_p15_dlgn_ma' not found
plotted <- dev.off()
kh_p15_dlgn_ma[["plot"]]
## Error:
## ! object 'kh_p15_dlgn_ma' not found

24.5.5 Location contrasts with genes removed/kept

Repeat the same block with a find/replace of genotype/location.

location_tables_full <- combine_de_tables(
  location_de, keepers = location_keepers, label_column = label_column,
  excel = glue("full_contrasts/location_full_tables-v{ver}.xlsx"))
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
location_tables_full
## A set of combined differential expression results.
##                             table deseq_sigup deseq_sigdown edger_sigup
## 1  p08_het_dlgn_vs_p08_het_retina        2165          1562        2212
## 2  p15_het_dlgn_vs_p15_het_retina        2437          3369        2587
## 3    p08_ko_dlgn_vs_p08_ko_retina        2180          1868        2144
## 4    p15_ko_dlgn_vs_p15_ko_retina        2715          3942        2934
## 5   p08_het_scn_vs_p08_het_retina        2634          1707        2586
## 6   p15_het_scn_vs_p15_het_retina        2841          2395        2716
## 7     p08_ko_scn_vs_p08_ko_retina        2728          1705        2644
## 8     p15_ko_scn_vs_p15_ko_retina        2613          3005        2612
## 9     p08_het_dlgn_vs_p08_het_scn         648           788         751
## 10    p15_het_dlgn_vs_p15_het_scn        1708          2796        1984
## 11      p08_ko_dlgn_vs_p08_ko_scn        1002          1342        1115
## 12      p15_ko_dlgn_vs_p15_ko_scn        1829          2529        2158
##    edger_sigdown limma_sigup limma_sigdown
## 1           1632        1886          1660
## 2           3339        2748          2639
## 3           2077        2104          1963
## 4           3847        3236          2962
## 5           1882        2226          1889
## 6           2616        2730          2366
## 7           1922        2386          2160
## 8           3143        2812          2623
## 9            780         647           766
## 10          2623        1979          2034
## 11          1439        1169          1317
## 12          2396        1878          2000
## Plot describing unique/shared genes in a differential expression table.

location_sig_full <- extract_significant_genes(
  location_tables_full, according_to = "deseq",
  excel = glue("full_contrasts/location_full_sig-v{ver}.xlsx"))
location_sig_full
## A set of genes deemed significant according to deseq.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##            deseq_up deseq_down
## dr_p08_het     2165       1562
## dr_p15_het     2437       3369
## dr_p08_ko      2180       1868
## dr_p15_ko      2715       3942
## sr_p08_het     2634       1707
## sr_p15_het     2841       2395
## sr_p08_ko      2728       1705
## sr_p15_ko      2613       3005
## ds_p08_het      648        788
## ds_p15_het     1708       2796
## ds_p08_ko      1002       1342
## ds_p15_ko      1829       2529

location_full_upset <- upsetr_sig(location_sig_full)
##location_full_intersects <- write_upset_groups(
##  location_full_upset,
##  excel = "excel/location_full_gene_groups.xlsx")
location_tables <- list()
location_sig <- list()
location_gp <- list()
location_cp <- list()
for (k in seq_along(location_keepers)) {
  name <- names(location_keepers)[k]
  message("Examining ", name)
  keeper <- location_keepers[name]
  includes <- location_inclusions[[name]]
  include_name <- paste0("inc_", name)
  include_df_name <- paste0("df_", name)
  include_df <- location_inclusions[[include_df_name]]
  includes <- location_inclusions[[include_name]]
  summary(rownames(location_sig_full[["deseq"]][["ups"]][[name]]) %in% includes)
  include_filename <- glue("location_contrasts/location_{name}_including_wt_{lfc_cutoff}_decreased_table-v{ver}.xlsx")
  include_sig_filename <- glue("location_contrasts/location_{name}_including_wt_{lfc_cutoff}_decreased_sig-v{ver}.xlsx")
  location_tables[[name]] <- combine_de_tables(
    location_de, extra_annot = include_df,
    keepers = keeper, label_column = label_column,
    excel = include_filename, wanted_genes = includes)
  print(location_tables[[name]])
  location_sig[[name]] <- extract_significant_genes(
    location_tables[[name]], according_to = "deseq",
    excel = include_sig_filename)
  print(location_sig[[name]])
  num_rows <- nrow(location_sig[[name]][["deseq"]][["ups"]][[name]]) +
    nrow(location_sig[[name]][["deseq"]][["downs"]][[name]])
  message("There are ", num_rows, " significant up and down genes.")
  if (num_rows > 10) {
    location_gp[[name]] <- all_gprofiler(location_sig[[name]], species = "mmusculus")
    gp_written <- write_all_gp(genotype_gp[[name]])
    location_cp[[name]] <- all_cprofiler(location_sig[[name]], location_tables[[name]],
                                         orgdb = "org.Mm.eg.db", organism = "mouse")
    cp_written <- write_all_cp(genotype_cp[[name]])
  }
}
## Examining dr_p08_het
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
## A set of combined differential expression results.
##                            table deseq_sigup deseq_sigdown edger_sigup
## 1 p08_het_dlgn_vs_p08_het_retina         259            81         259
##   edger_sigdown limma_sigup limma_sigdown
## 1            85         240            81
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

## A set of genes deemed significant according to deseq.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##            deseq_up deseq_down
## dr_p08_het      259         81

## There are 340 significant up and down genes.
## Error : Request to g:Profiler failed (HTTP 400). Please check your input or organism argument.
## API message: No legal source provided. Saw ['MIRNA']
## If the issue persists, please contact biit.support@ut.ee with a reproducible example.
## Error : Request to g:Profiler failed (HTTP 400). Please check your input or organism argument.
## API message: No legal source provided. Saw ['MIRNA']
## If the issue persists, please contact biit.support@ut.ee with a reproducible example.
## Warning in simple_clusterprofiler(sig_genes = structure(list(ensembl_gene_id =
## c("ENSMUSG00000021685", : No genes were found between the significant genes and
## the universe.
## Error in testForValidKeytype(x, keytype) : 
##   'keytype' must be a a single string
## Error in `simple_cl[["kegg_universe"]]`:
## ! subscript out of bounds

Colenso sent a specific query of interest, comparing SCN vs. Retinas at p08 in the heterozygotes including a set of genes of particular interest. Perhaps I can use some of these as markers to quality control my work in the future?

Here are the genes:

Opn4, Eomes, Trpc7, Oprm1, Nr4a3, Tbx20, Irx6, AW551984, Pcdh19, Adcyap1, Baiap3, Chl1, Grin3a, Igf1, Gria1, Grin2d, Grin3a, Chrna6, Chrna3, Htr5a, Htr2a, Htr7, Irx4, PlxnC1, Sema6d, Sema4f, Sema4a, Sema6b, Lrrc4b, Lrrc58, Lrrc3b, Wnt4, Wnt9b, Ctxn3, Tenm1, Gna14, Rgs4, Rgs6, Rgs5

table_input <- location_tables[["sr_p08_het"]]
table_name <- "sr_p08_het"
table <- table_input[["data"]][[table_name]]
interesting_genes <- c("Opn4", "Eomes", "Trpc7", "Oprm1", "Nr4a3", "Tbx20",
                       "Irx6", "AW551984", "Pcdh19", "Adcyap1r1", "Baiap3",
                       "Chl1", "Grin3a", "Igf1", "Gria1", "Grin2d", "Grin3a",
                       "Chrna6", "Chrna3", "Htr5a", "Htr2a", "Htr7", "Irx4",
                       "PlxnC1", "Sema6d", "Sema4f", "Sema4a", "Sema6b", "Lrrc4b",
                       "Lrrc58", "Lrrc3b", "Wnt4", "Wnt9b", "Ctxn3", "Tenm1", "Gna14",
                       "Rgs4", "Rgs6", "Rgs5", "Pou4f2", "Chrnb3", "Bcan")
sr_p08_het_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp",
  color_low = colors[["het_scn"]], color_high = colors[["het_retina"]],
  label_column = "mgi_symbol", label = interesting_genes, alpha = 1.0,
  size = 4)
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/sr_p08_het_volcano.pdf", width = 9, height = 9)
sr_p08_het_volcano[["plot"]]
## Error:
## ! object 'sr_p08_het_volcano' not found
plotted <- dev.off()
sr_p08_het_volcano[["plot"]]
## Error:
## ! object 'sr_p08_het_volcano' not found
sr_p08_het_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["het_scn"]], color_high = colors[["het_retina"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = interesting_genes)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/sr_p08_het_ma.pdf", width = 9, height = 9)
sr_p08_het_ma[["plot"]]
## Error:
## ! object 'sr_p08_het_ma' not found
plotted <- dev.off()
sr_p08_het_ma[["plot"]]
## Error:
## ! object 'sr_p08_het_ma' not found

24.5.6 Also the ko

table_input <- location_tables[["sr_p08_ko"]]
table_name <- "sr_p08_ko"
table <- table_input[["data"]][[table_name]]
sr_p08_ko_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp",
  color_low = colors[["ko_scn"]], color_high = colors[["ko_retina"]],
  label_column = "mgi_symbol", label = interesting_genes, alpha = 1.0,
  size = 4)
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/sr_p08_ko_volcano.pdf", width = 9, height = 9)
sr_p08_ko_volcano[["plot"]]
## Error:
## ! object 'sr_p08_ko_volcano' not found
plotted <- dev.off()
sr_p08_ko_volcano[["plot"]]
## Error:
## ! object 'sr_p08_ko_volcano' not found
sr_p08_ko_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["ko_scn"]], color_high = colors[["ko_retina"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = interesting_genes)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/sr_p08_ko_ma.pdf", width = 9, height = 9)
sr_p08_ko_ma[["plot"]]
## Error:
## ! object 'sr_p08_ko_ma' not found
plotted <- dev.off()
sr_p08_ko_ma[["plot"]]
## Error:
## ! object 'sr_p08_ko_ma' not found
table_input <- location_tables[["sr_p15_het"]]
table_name <- "sr_p15_het"
table <- table_input[["data"]][[table_name]]
interesting_genes <- c("Opn4", "Eomes", "Trpc7", "Oprm1", "Nr4a3", "Tbx20",
                       "Irx6", "AW551984", "Pcdh19", "Adcyap1r1", "Baiap3",
                       "Chl1", "Grin3a", "Igf1", "Gria1", "Grin2d", "Grin3a",
                       "Chrna6", "Chrna3", "Htr5a", "Htr2a", "Htr7", "Irx4",
                       "PlxnC1", "Sema6d", "Sema4f", "Sema4a", "Sema6b", "Lrrc4b",
                       "Lrrc58", "Lrrc3b", "Wnt4", "Wnt9b", "Ctxn3", "Tenm1", "Gna14",
                       "Rgs4", "Rgs6", "Rgs5", "Pou4f2", "Chrnb3", "Bcan")
sr_p15_het_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp",
  color_low = colors[["het_scn"]], color_high = colors[["het_retina"]],
  label_column = "mgi_symbol", label = interesting_genes, alpha = 1.0,
  size = 4)
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/sr_p15_het_volcano.pdf", width = 9, height = 9)
sr_p15_het_volcano[["plot"]]
## Error:
## ! object 'sr_p15_het_volcano' not found
plotted <- dev.off()
sr_p15_het_volcano[["plot"]]
## Error:
## ! object 'sr_p15_het_volcano' not found
sr_p15_het_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["het_retina"]], color_high = colors[["het_scn"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = interesting_genes)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/sr_p15_het_ma.pdf", width = 9, height = 9)
sr_p15_het_ma[["plot"]]
## Error:
## ! object 'sr_p15_het_ma' not found
plotted <- dev.off()
sr_p15_het_ma[["plot"]]
## Error:
## ! object 'sr_p15_het_ma' not found

24.5.7 Also the ko

table_input <- location_tables[["sr_p15_ko"]]
table_name <- "sr_p15_ko"
table <- table_input[["data"]][[table_name]]
sr_p15_ko_volcano <- plot_volcano_condition_de(
  table, table_name, fc_col = "deseq_logfc", p_col = "deseq_adjp",
  color_low = colors[["ko_retina"]], color_high = colors[["ko_scn"]],
  label_column = "mgi_symbol", label = interesting_genes, alpha = 1.0,
  size = 4, min.segment.length = 0, point.padding = 0.2)
## Error in `plot_volcano_condition_de()`:
## ! Column: deseq_logfc is not in the table.
pp(file = "images/sr_p15_ko_volcano.pdf", width = 12, height = 12)
sr_p15_ko_volcano[["plot"]]
## Error:
## ! object 'sr_p15_ko_volcano' not found
plotted <- dev.off()
sr_p15_ko_volcano[["plot"]]
## Error:
## ! object 'sr_p15_ko_volcano' not found
sr_p15_ko_ma <- plot_ma_condition_de(
  table, table_name, expr_col = "deseq_basemean", fc_col = "deseq_logfc",
  color_low = colors[["ko_scn"]], color_high = colors[["ko_retina"]],
  p_col = "deseq_adjp", label_column = "mgi_symbol", label = interesting_genes)
## The column: mgi_symbol is not in the data, using rownames.
## Warning in max(newdf[["avg"]]): no non-missing arguments to max; returning -Inf
## Warning in plot_ma_condition_de(table, table_name, expr_col = "deseq_basemean",
## : NAs introduced by coercion
## Error in `[[<-.data.frame`:
## ! replacement has 1 row, data has 0
pp(file = "images/sr_p15_ko_ma.pdf", width = 9, height = 9)
sr_p15_ko_ma[["plot"]]
## Error:
## ! object 'sr_p15_ko_ma' not found
plotted <- dev.off()
sr_p15_ko_ma[["plot"]]
## Error:
## ! object 'sr_p15_ko_ma' not found

24.5.7.1 Test a specific location query for duplicated IDs

Let us see if any Ensembl gene IDs and/or MGI IDs are shared in the worksheet location_sr_p08_ko_including_wt_0.1_decreased_sig up/down.

test_table_up <- location_sig[["sr_p08_ko"]][["deseq"]][["ups"]][[1]]
test_table_down <- location_sig[["sr_p08_ko"]][["deseq"]][["downs"]][[1]]

query <- list("up" = rownames(test_table_up),
              "down" = rownames(test_table_down))
query_upset <- UpSetR::fromList(query)
UpSetR::upset(query_upset)
## Error in `start_col:end_col`:
## ! argument of length 0
query <- list("up" = test_table_up[["mgi_symbol"]],
              "down" = test_table_down[["mgi_symbol"]])
query_upset <- UpSetR::fromList(query)
UpSetR::upset(query_upset)
## Error in `start_col:end_col`:
## ! argument of length 0
## ok, good.

24.5.8 And time

time_tables_full <- combine_de_tables(
  time_de, keepers = time_keepers,
  label_column = label_column,
  excel = glue("full_contrasts/time_full_tables-v{ver}.xlsx"))
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
time_sig_full <- extract_significant_genes(
  time_tables_full, according_to = "deseq",
  excel = glue("full_contrasts/time_full_sig-v{ver}.xlsx"))
time_tables <- list()
time_sig <- list()
time_gp <- list()
time_cp <- list()
for (k in seq_along(time_keepers)) {
  name <- names(time_keepers)[k]
  message("Examining ", name)
  keeper <- time_keepers[name]
  includes <- time_inclusions[[name]]
  include_name <- paste0("inc_", name)
  include_df_name <- paste0("df_", name)
  include_df <- time_inclusions[[include_df_name]]
  includes <- time_inclusions[[include_name]]
  summary(rownames(time_sig_full[["deseq"]][["ups"]][[name]]) %in% includes)
  include_filename <- glue("time_contrasts/time_{name}_including_wt_{lfc_cutoff}_decreased_table-v{ver}.xlsx")
  include_sig_filename <- glue("time_contrasts/time_{name}_including_wt_{lfc_cutoff}_decreased_sig-v{ver}.xlsx")
  time_tables[[name]] <- combine_de_tables(
    time_de, extra_annot = include_df,
    keepers = keeper, label_column = label_column,
    excel = include_filename, wanted_genes = includes)
  print(time_tables[[name]])
  time_sig[[name]] <- extract_significant_genes(
    time_tables[[name]], according_to = "deseq",
    excel = include_filename)
  print(time_sig[[name]])
  num_rows <- nrow(time_sig[[name]][["deseq"]][["ups"]][[name]]) +
    nrow(time_sig[[name]][["deseq"]][["downs"]][[name]])
  message("There are ", num_rows, " significant up and down genes.")
  if (num_rows > 10) {
    time_gp[[name]] <- all_gprofiler(time_sig[[name]], species = "mmusculus")
    gp_written <- write_all_gp(time_gp[[name]])
    time_cp[[name]] <- all_cprofiler(time_sig[[name]], time_tables[[name]],
                                     orgdb = "org.Mm.eg.db")
    cp_written <- write_all_cp(time_cp[[name]])
  }
}
## Examining t_het_dlgn
## Looking for subscript invalid names, start of extract_keepers.
## Looking for subscript invalid names, end of extract_keepers.
## A set of combined differential expression results.
##                          table deseq_sigup deseq_sigdown edger_sigup
## 1 p15_het_dlgn_vs_p08_het_dlgn         397            14         431
##   edger_sigdown limma_sigup limma_sigdown
## 1            14         359            13
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## Plot describing unique/shared genes in a differential expression table.

## Deleting the file time_contrasts/time_t_het_dlgn_including_wt_0.1_decreased_table-v20260314.xlsx before writing the tables.
## A set of genes deemed significant according to deseq.
## The parameters defining significant were:
## LFC cutoff: 1 adj P cutoff: 0.05
##            deseq_up deseq_down
## t_het_dlgn      397         14

## There are 411 significant up and down genes.
## Error : Request to g:Profiler failed (HTTP 400). Please check your input or organism argument.
## API message: No legal source provided. Saw ['MIRNA']
## If the issue persists, please contact biit.support@ut.ee with a reproducible example.
## Error : Request to g:Profiler failed (HTTP 400). Please check your input or organism argument.
## API message: No legal source provided. Saw ['MIRNA']
## If the issue persists, please contact biit.support@ut.ee with a reproducible example.
## Warning in simple_clusterprofiler(sig_genes = structure(list(ensembl_gene_id =
## c("ENSMUSG00000021948", : No genes were found between the significant genes and
## the universe.
## Error in testForValidKeytype(x, keytype) : 
##   'keytype' must be a a single string
## Error in `simple_cl[["kegg_universe"]]`:
## ! subscript out of bounds

25 Translatome queries

In conversation with Colenso, he spoke about a series of contrasts which would be interesting to attempt in order to query the changes across both locations and genotypes and/or both locations and time, thus:

(p08_het_scn / p08_het_retina) / (p08_ko_scn / p08_ko_retina)

as an example. We can definitely do these, but they do not work for all methods employed (I think they work best with limma and edgeR).

Lets find out!

25.1 Two scn/retina comparisons

  • (p08_het_scn / p08_het_retina) / (p08_ko_scn / p08_ko_retina)
  • (p15_het_scn / p15_het_retina) / (p15_ko_scn / p15_ko_retina)
scn_extra <- glue("\\
  p08het = (conditionp08_het_scn - conditionp08_het_retina), \\
  p08ko = (conditionp08_ko_scn - conditionp08_ko_retina), \\
  p08het_vs_p08ko = (conditionp08_het_scn - conditionp08_het_retina) - (conditionp08_ko_scn - conditionp08_ko_retina), \\
  p15het = (conditionp15_het_scn - conditionp15_het_retina), \\
  p15ko = (conditionp15_ko_scn - conditionp15_ko_retina), \\
  p15het_vs_p15ko = (conditionp15_het_scn - conditionp15_het_retina) - (conditionp15_ko_scn - conditionp15_ko_retina)")
scn_translatome_de_keepers <- list(
  "p08het" = c("p08_het_scn", "p08_het_retina"),
  "p08ko" = c("p08_ko_scn", "p08_ko_retina"),
  "p15het" = c("p15_het_scn", "p15_het_retina"),
  "p15ko" = c("p15_ko_scn", "p15_ko_retina"))
scn_translatome_keepers <- list(
  "p08het" = c("p08_het_scn", "p08_het_retina"),
  "p08ko" = c("p08_ko_scn", "p08_ko_retina"),
  "p08_scn_translatome" = c("p08het", "p08ko"),
  "p15het" = c("p15_het_scn", "p15_het_retina"),
  "p15ko" = c("p15_ko_scn", "p15_ko_retina"),
  "p15_scn_translatome" = c("p15het", "p15ko"))
filt <- normalize(v3_pairwise_input, filter = TRUE)
## Removing 10162 low-count genes (15263 remaining).
limma_test <- limma_pairwise(filt,
                             keepers = scn_translatome_de_keepers,
                             model_fstring = "~ 0 + condition",
                             model_svs = FALSE, extra_contrastrs = scn_extra)
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
edger_test <- edger_pairwise(filt,
                             keepers = scn_translatome_de_keepers,
                             model_fstring = "~ 0 + condition",
                             model_svs = FALSE, extra_contrasts = scn_extra)
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
scn_translatome_de <- all_pairwise(v3_pairwise_input, filter = TRUE,
                                   keepers = scn_translatome_de_keepers,
                                   model_svs = FALSE,
                                   model_fstring = "~ 0 + condition",
                                   do_basic = FALSE, do_dream = FALSE,
                                   do_noiseq = FALSE, do_ebseq = FALSE,
                                   extra_contrasts = scn_extra)
## Warning in all_pairwise(v3_pairwise_input, filter = TRUE, keepers =
## scn_translatome_de_keepers, : This will likely fail because of how the keepers
## and extra contrasts are evaluated.
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Removing 10162 low-count genes (15263 remaining).
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## The contrast p08het is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast p08ko is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast p08het is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast p15het is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast p15ko is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast p15het is not in the results.
## If this is not an extra contrast, then this is an error.
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
scn_combined_test <- combine_de_tables(
  scn_translatome_de, keepers = scn_translatome_keepers,
  excel = glue("translatome/test_scn_translatome_unfiltered_nosva-v{ver}.xlsx"))
## Looking for subscript invalid names, start of extract_keepers.
## coefficient edger did not find conditionp08ko or conditionp08het.
## coefficient limma did not find p08ko or p08het.
## coefficient edger did not find conditionp15ko or conditionp15het.
## coefficient limma did not find p15ko or p15het.
## Looking for subscript invalid names, end of extract_keepers.
scn_translatome_de_sva <- all_pairwise(v3_pairwise_input, filter = TRUE,
                                       keepers = scn_translatome_de_keepers,
                                       model_svs = "svaseq",
                                       model_fstring = "~ 0 + condition",
                                       do_basic = FALSE, do_dream = FALSE,
                                       do_noiseq = FALSE, do_ebseq = FALSE,
                                       extra_contrasts = scn_extra)
## Warning in all_pairwise(v3_pairwise_input, filter = TRUE, keepers =
## scn_translatome_de_keepers, : This will likely fail because of how the keepers
## and extra contrasts are evaluated.
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Removing 10162 low-count genes (15263 remaining).
## Error in `adjuster_svs()`:
## ! unused arguments (do_basic = FALSE, do_dream = FALSE, do_noiseq = FALSE, do_ebseq = FALSE)
scn_combined_test_sva <- combine_de_tables(
  scn_translatome_de_sva, keepers = scn_translatome_keepers,
  excel = glue("translatome/test_scn_translatome_unfiltered_sva-v{ver}.xlsx"))
## Error:
## ! object 'scn_translatome_de_sva' not found

25.1.1 Subtracting DESeq2 results: p08 scn het vs ko

p08_scn_combined_deseq <- subtract_deseq_results(
  first_table = scn_combined_test[["data"]][["p08het"]],
  second_table = scn_combined_test[["data"]][["p08ko"]],
  first_lfc = "deseq_logfc", second_lfc = "deseq_logfc",
  first_p = "deseq_adjp", second_p = "deseq_adjp",
  first_name = "het", second_name = "ko",
  excel = glue("translatome/translatome_p08_scn_combined_deseq-v{ver}.xlsx"))
## Error in `subtract_deseq_results()`:
## ! could not find function "subtract_deseq_results"

25.1.2 Subtracting DESeq2 results: p15 scn het vs ko

p15_scn_combined_deseq <- subtract_deseq_results(
  first_table = scn_combined_test[["data"]][["p15het"]],
  second_table = scn_combined_test[["data"]][["p15ko"]],
  first_lfc = "deseq_logfc", second_lfc = "deseq_logfc",
  first_p = "deseq_adjp", second_p = "deseq_adjp",
  first_name = "het", second_name = "ko",
  excel = glue("translatome/translatome_p15_scn_combined_deseq-v{ver}.xlsx"))
## Error in `subtract_deseq_results()`:
## ! could not find function "subtract_deseq_results"

25.2 One dlgn/retina comparison

  • (p08_het_dlgn / p08_het_retina) / (p08_ko_dlgn / p08_ko_retina)
p08_dlgn_extra <- "p08het_vs_p08ko = (conditionp08_het_dlgn - conditionp08_het_retina) - (conditionp08_ko_dlgn - conditionp08_ko_retina)"
p08_dlgn_translatome_de_keepers <- list(
  "p08het" = c("p08_het_dlgn", "p08_het_retina"),
  "p08ko" = c("p08_ko_dlgn", "p08_ko_retina"))
p08_dlgn_translatome_keepers <- list(
  "p08_het_dlgn_vs_retina" = c("p08_het_dlgn", "p08_het_retina"),
  "p08_ko_dlgn_vs_retina" = c("p08_ko_dlgn", "p08_ko_retina"),
  "p08_dlgn_translatome" = c("p08het", "p08ko"))
p08_dlgn_translatome_de <- all_pairwise(v3_pairwise_input, filter = TRUE,
                                        keepers = p08_dlgn_translatome_de_keepers,
                                        model_svs = FALSE,
                                        model_fstring = "~ 0 + condition",
                                        do_basic = FALSE, do_dream = FALSE,
                                        do_noiseq = FALSE, do_ebseq = FALSE,
                                        extra_contrasts = p08_dlgn_extra)
## Warning in all_pairwise(v3_pairwise_input, filter = TRUE, keepers =
## p08_dlgn_translatome_de_keepers, : This will likely fail because of how the
## keepers and extra contrasts are evaluated.
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Removing 10162 low-count genes (15263 remaining).
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## The contrast p08het is not in the results.
## If this is not an extra contrast, then this is an error.
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
p08_dlgn_combined_test <- combine_de_tables(
  p08_dlgn_translatome_de, keepers = p08_dlgn_translatome_keepers,
  label_column = label_column,
  excel = glue("translatome/test_p08_dlgn_translatome_unfiltered_nosva-v{ver}.xlsx"))
## Looking for subscript invalid names, start of extract_keepers.
## coefficient edger did not find conditionp08ko or conditionp08het.
## coefficient limma did not find p08ko or p08het.
## Looking for subscript invalid names, end of extract_keepers.
p08_dlgn_translatome_de_sva <- all_pairwise(v3_pairwise_input, filter = TRUE,
                                            keepers = p08_dlgn_translatome_de_keepers,
                                            model_svs = "svaseq",
                                            model_fstring = "~ 0 + condition",
                                            do_basic = FALSE, do_dream = FALSE,
                                            do_noiseq = FALSE, do_ebseq = FALSE,
                                            extra_contrasts = p08_dlgn_extra)
## Warning in all_pairwise(v3_pairwise_input, filter = TRUE, keepers =
## p08_dlgn_translatome_de_keepers, : This will likely fail because of how the
## keepers and extra contrasts are evaluated.
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Removing 10162 low-count genes (15263 remaining).
## Error in `adjuster_svs()`:
## ! unused arguments (do_basic = FALSE, do_dream = FALSE, do_noiseq = FALSE, do_ebseq = FALSE)
p08_dlgn_combined_test_sva <- combine_de_tables(
  p08_dlgn_translatome_de_sva, keepers = p08_dlgn_translatome_keepers,
  label_column = label_column,
  excel = glue("translatome/test_p08_dlgn_translatome_unfiltered_sva-v{ver}.xlsx"))
## Error:
## ! object 'p08_dlgn_translatome_de_sva' not found

25.2.1 Subtracting the DESeq2 results

25.3 Two scn/retina comparisons (p15/p08 across het/ko)

  • (p15_het_scn / p15_het_retina) / (p08_het_scn / p08_het_retina)
  • (p15_ko_scn / p15_ko_retina) / (p08_ko_scn / p08_ko_retina)
time_scn_extra <- glue("\\
  p15het = (conditionp15_het_scn - conditionp15_het_retina), \\
  p08het = (conditionp08_het_scn - conditionp08_het_retina), \\
  p15het_vs_p08het = (conditionp15_het_scn - conditionp15_het_retina) - (conditionp08_het_scn - conditionp08_het_retina),
  p15ko = (conditionp15_ko_scn - conditionp15_ko_retina), \\
  p08ko = (conditionp08_ko_scn - conditionp08_ko_retina), \\
  p15ko_vs_p08ko = (conditionp15_ko_scn - conditionp15_ko_retina) - (conditionp08_ko_scn - conditionp08_ko_retina)")
time_scn_translatome_de_keepers <- list(
  "p15het" = c("p15_het_scn", "p15_het_retina"),
  "p08het" = c("p08_het_scn", "p08_het_retina"),
  "p15ko" = c("p15_ko_scn", "p15_ko_retina"),
  "p08ko" = c("p08_ko_scn", "p08_ko_retina"))
time_scn_translatome_keepers <- list(
  "p15het" = c("p15_het_scn", "p15_het_retina"),
  "p08het" = c("p08_het_scn", "p08_het_retina"),
  "p15ko" = c("p15_ko_scn", "p15_ko_retina"),
  "p08ko" = c("p08_ko_scn", "p08_ko_retina"),
  "p15_het_sc_vs_retina" = c("p15_het_scn", "p15_het_retina"),
  "p08_het_sc_vs_retina" = c("p08_het_scn", "p08_het_retina"),
  "scn_het_translatome" = c("p15het", "p08het"),
  "scn_ko_translatome" = c("p15ko", "p08ko"))
time_scn_translatome_de <- all_pairwise(v3_pairwise_input, filter = TRUE,
                                        keepers = time_scn_translatome_de_keepers,
                                        model_svs = FALSE,
                                        model_fstring = "~ 0 + condition",
                                        do_basic = FALSE, do_dream = FALSE,
                                        do_noiseq = FALSE, do_ebseq = FALSE,
                                        extra_contrasts = time_scn_extra)
## Warning in all_pairwise(v3_pairwise_input, filter = TRUE, keepers =
## time_scn_translatome_de_keepers, : This will likely fail because of how the
## keepers and extra contrasts are evaluated.
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Removing 10162 low-count genes (15263 remaining).
## converting counts to integer mode
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## The contrast p15het is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast p08het is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast p15het is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast p15ko is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast p08ko is not in the results.
## If this is not an extra contrast, then this is an error.
## The contrast p15ko is not in the results.
## If this is not an extra contrast, then this is an error.
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## conditions
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
time_scn_translatome_test <- combine_de_tables(
  time_scn_translatome_de,
  keepers = time_scn_translatome_keepers,
  label_column = label_column,
  excel = glue("translatome/test_time_scn_translatome_unfiltered_nosva-v{ver}.xlsx"))
## Looking for subscript invalid names, start of extract_keepers.
## coefficient edger did not find conditionp08het or conditionp15het.
## coefficient limma did not find p08het or p15het.
## coefficient edger did not find conditionp08ko or conditionp15ko.
## coefficient limma did not find p08ko or p15ko.
## Looking for subscript invalid names, end of extract_keepers.
time_scn_translatome_de_sva <- all_pairwise(v3_pairwise_input, filter = TRUE,
                                            keepers = time_scn_translatome_de_keepers,
                                            model_svs = "svaseq",
                                            model_fstring = "~ 0 + condition",
                                            do_basic = FALSE, do_dream = FALSE,
                                            do_noiseq = FALSE, do_ebseq = FALSE,
                                            extra_contrasts = time_scn_extra)
## Warning in all_pairwise(v3_pairwise_input, filter = TRUE, keepers =
## time_scn_translatome_de_keepers, : This will likely fail because of how the
## keepers and extra contrasts are evaluated.
##   p08_het_dlgn p08_het_retina    p08_het_scn    p08_ko_dlgn  p08_ko_retina 
##              3              3              3              3              3 
##     p08_ko_scn    p08_wt_dlgn  p08_wt_retina     p08_wt_scn   p15_het_dlgn 
##              3              5              5              3              4 
## p15_het_retina    p15_het_scn    p15_ko_dlgn  p15_ko_retina     p15_ko_scn 
##              4              3              3              3              3 
##    p15_wt_dlgn  p15_wt_retina     p15_wt_scn 
##              5              5              2
## Removing 10162 low-count genes (15263 remaining).
## Error in `adjuster_svs()`:
## ! unused arguments (do_basic = FALSE, do_dream = FALSE, do_noiseq = FALSE, do_ebseq = FALSE)
time_scn_translatome_test_sva <- combine_de_tables(
  time_scn_translatome_de_sva,
  keepers = time_scn_translatome_keepers,
  label_column = label_column,
  excel = glue("translatome/test_time_scn_translatome_unfiltered_sva-v{ver}.xlsx"))
## Error:
## ! object 'time_scn_translatome_de_sva' not found

Next step: Perform the retina filter; need to think about the proper union/intersection of the retina/x expression values

In the previous block, we are making 2 global comparisons, here is one of them:

(p15hetscn/p15hetret)/(p08hetscn/p08hetret)

I therefore want to extract the most logical set of genes higher in some/all of these conditions with respect to the corresponding wt conditions. Previously, in section ‘Extract genes included for each set of contrasts’, I attempted to perform this operation for 2 specific wt conditions. When this was performed, it took the unique(union) of the two sets. Thus it stands to reason that I want to take the unique(union) of all 4 in this instance? e.g.:

(p15hetscn > p15wtscn) | (p15hetret > p15wtret) | (p08hetscn > p08wtscn) | (p08hetret > p08wtret)

I kind of think it should be:

((p15hetscn > p15wtscn) | (p15hetret > p15wtret)) & ((p08hetscn > p08wtscn) | (p08hetret > p08wtret))

gross, perhaps I should just do this manually, given that there are only a few putative translatomes to query?

26 Quick and dirty DESeq2 contrast of contrasts

In a fashion similar to how Hector handled the effect of phagocytosis with Laura and Najib a long time ago, I propose to do a simple subtraction of the results of our two contrasts which comprise the translatome query (I was thinking about this last week, thus the inclusion of them in the de tables above). Similarly to the phagocytosis effect, I will simply take the worst posible adjusted p-value. I will repeat this with limma/EdgeR and see how similar the final results are to what those methods provide in the (a/b)/(c/d) comparisons. I am reasonably certain that DESeq2’s results() function has the ability to perform these odd contrasts, but I have never figured out how; perhaps I will use this as a chance to revisit that…

Let us test this idea with the p08 dlgn query, which seeks to compare:

(p08_het_dlgn / p08_het_retina) / (p08_ko_dlgn / p08_ko_retina)

These are maintained in the de_table with the names ‘p08_het_dlgn_vs_retina’ and ‘p08_ko_dlgn_vs_retina’

26.1 p08 dlgn het vs ko

p08_dlgn_combined_deseq <- subtract_deseq_results(
  first_table = p08_dlgn_combined_test[["data"]][["p08_het_dlgn_vs_retina"]],
  second_table = p08_dlgn_combined_test[["data"]][["p08_ko_dlgn_vs_retina"]],
  first_lfc = "deseq_logfc", second_lfc = "deseq_logfc",
  first_p = "deseq_adjp", second_p = "deseq_adjp",
  first_name = "het", second_name = "ko",
  excel = glue("translatome/translatome_p08_dlgn_combined_deseq-v{ver}.xlsx"))
## Error in `subtract_deseq_results()`:
## ! could not find function "subtract_deseq_results"

See how similar these results are to those obtained from limma/edger.

test_columns <- c("edger_logfc", "limma_logfc", "edger_adjp", "limma_adjp")
test_df <- p08_dlgn_combined_test[["data"]][["p08_dlgn_translatome"]][, test_columns]
test_df <- merge(test_df, p08_dlgn_combined_deseq, by = "row.names")
## Error in `h()`:
## ! error in evaluating the argument 'y' in selecting a method for function 'merge': object 'p08_dlgn_combined_deseq' not found
rownames(test_df) <- test_df[["Row.names"]]
test_df[["Row.names"]] <- NULL
cor.test(test_df[["limma_logfc"]], test_df[["het_vs_ko_logfc"]])
## Error in `cor.test.default()`:
## ! 'y' must be a numeric vector
cor.test(test_df[["edger_logfc"]], test_df[["het_vs_ko_logfc"]])
## Error in `cor.test.default()`:
## ! 'y' must be a numeric vector
tt <- plot_linear_scatter(test_df[, c("limma_logfc", "het_vs_ko_logfc")])
## Error in `h()`:
## ! error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': subscript contains invalid names
tt[["scatter"]]
## NULL
tt <- plot_linear_scatter(test_df[, c("edger_adjp", "het_vs_ko_p")])
## Error in `h()`:
## ! error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': subscript contains invalid names
tt[["scatter"]]
## NULL
## So, using the maximum p-value is a complete failure; but the extreme similarities
## between this and edgeR suggest to me that it is likely possible to use the results
## from edgeR without concern (or limma for that matter, it was also extremely similar)
## Or I can spend a little time and collect the numbers on each side of the division
## and calculate a t statistic myself.

27 Non-Specific filtering of the translatome data

I have on hand

  • p08het_vs_p08ko : (p08_het_scn - p08_het_retina) - (p08_ko_scn - p08_ko_retina)
  • p15het_vs_p15ko : (p15_het_scn - p15_het_retina) - (p15_ko_scn - p15_ko_retina)
  • p08het_vs_p08ko : (p08_het_dlgn - p08_het_retina) - (p08_ko_dlgn - p08_ko_retina)
  • p15het_vs_p08het : (p15_het_scn - p15_het_retina) - (p08_het_scn - p08_het_retina)
  • p15ko_vs_p08ko : (p15_ko_scn - p15_ko_retina) - (p08_ko_scn - p08_ko_retina)

I have gene sets up above which define the genes suitable for each of these pieces. There are only 5 comparisons, let us step through them.

27.1 SCN translatome het/ko at p08

The data for this contrast resides in scn_combined_test\(data\)p08_scn_translatome or the same slot of scn_combined_test_sva

  • p08_het_scn - p08_het_retina) - (p08_ko_scn - p08_ko_retina)

Thus, the inclusion_sig portions to extract are found in: inclusion_sig[[“deseq”]][[“ups”]], and are named exactly as written above!

p08_het_vs_ko_translatome_unfilt <- scn_combined_test[["data"]][["p08_scn_translatome"]]
num_union <- unique(c(rownames(inclusion_sig[["deseq"]][["ups"]][["p08_het_scn"]]),
                      rownames(inclusion_sig[["deseq"]][["ups"]][["p08_het_retina"]])))
length(num_union)
## [1] 1188
den_union <- unique(c(rownames(inclusion_sig[["deseq"]][["ups"]][["p08_ko_scn"]]),
                      rownames(inclusion_sig[["deseq"]][["ups"]][["p08_ko_retina"]])))
length(den_union)
## [1] 1624
both_union <- unique(c(num_union, den_union))
length(both_union)
## [1] 2005
both_inter_idx <- num_union %in% den_union
both_inter <- num_union[both_inter_idx]
length(both_inter)
## [1] 807
keeper <- list("p08_scn_translatome" = c("p08het", "p08ko"))
p08_scn_translatome_union_filtered <- combine_de_tables(
  scn_translatome_de, keepers = keeper,
  label_column = label_column,
  excel = glue("translatome/p08_scn_translatome_union_filtered_nosva-v{ver}.xlsx"),
  wanted_genes = both_union)
## Looking for subscript invalid names, start of extract_keepers.
## coefficient edger did not find conditionp08ko or conditionp08het.
## coefficient limma did not find p08ko or p08het.
## Looking for subscript invalid names, end of extract_keepers.
p08_scn_translatome_inter_filtered <- combine_de_tables(
  scn_translatome_de, keepers = keeper,
  label_column = label_column,
  excel = glue("translatome/p08_scn_translatome_intersect_filtered_nosva-v{ver}.xlsx"),
  wanted_genes = both_inter)
## Looking for subscript invalid names, start of extract_keepers.
## coefficient edger did not find conditionp08ko or conditionp08het.
## coefficient limma did not find p08ko or p08het.
## Looking for subscript invalid names, end of extract_keepers.
p08_scn_translatome_union_filtered_sva <- combine_de_tables(
  scn_translatome_de_sva, keepers = keeper,
  label_column = label_column,
  excel = glue("translatome/p08_scn_translatome_union_filtered_sva-v{ver}.xlsx"),
  wanted_genes = both_union)
## Error:
## ! object 'scn_translatome_de_sva' not found
p08_scn_translatome_union_filtered <- combine_de_tables(
  scn_translatome_de, keepers = keeper,
  label_column = label_column,
  excel = glue("translatome/p08_scn_translatome_intersect_filtered_sva-v{ver}.xlsx"),
  wanted_genes = both_inter)
## Looking for subscript invalid names, start of extract_keepers.
## coefficient edger did not find conditionp08ko or conditionp08het.
## coefficient limma did not find p08ko or p08het.
## Looking for subscript invalid names, end of extract_keepers.

28 Venn/UpSet of Retina, SCN, and dLGN DE Genes

Here is a snippet from Rashmi which expresses nicely the DE-result comparisons she is most interested:

Since, I want to know the number of DEG expressed in Retina, SCN and dLGN with respect to genotype, Location and time. I prepared the venn diagram for these comparison:

  • Genotype: P8 Ret Het vs KO, P15 Ret Het vs KO, P8 SCN Het vs KO, P15 SCN Het vs KO, P8 dLGN Het vs KO, P15 dLGN Het vs KO
  • Location: P8_het Ret vs SCN, P8_KO Ret vs SCN, P15_het Ret vs SCN, P15_KO Ret vs SCN, P8_het Ret vs dLGN, P8_KO Ret vs dLGN, P15_het Ret vs dLGN, P15_KO Ret vs dLGN, P8_het SCN vs dLGN, P8_KO SCN vs dLGN, P15_het SCN vs dLGN, P15_KO SCN vs dLGN.

Since I was interested in understanding the change in local translatome according to Location for different developmental time points for Het and KO. Hence, I tried to generate a venn diagram for Location (Ret and SCN) at developmental time points P8 and P15 for genotype het and KO. So the venn diagram / upset plot will be for location where some genes will be shared/unique for P8_Ret_het, P8_SCN_Het, P15_Ret_HET, P15_SCN_HET. We can prepare an upset plot for P8_Ret_KO, P8_SCN_KO, P15_Ret_KO and P15_SCN_KO also. Or can generate an upset plot by combining both P8_Ret_het, P8_SCN_Het, P15_Ret_HET and P15_SCN_HET and P8_Ret_KO, P8_SCN_KO, P15_Ret_KO and P15_SCN_KO.

Ok, let us see if I can implement this, starting with the genotype query

  • Genotype: P8 Ret Het vs KO, P15 Ret Het vs KO, P8 SCN Het vs KO, P15 SCN Het vs KO, P8 dLGN Het vs KO, P15 dLGN Het vs KO

28.1 ko vs het; all locations and times

## The appropriate data structure is 'genotype_tables',
## and the tables of interest are:
table_names <- c("kh_p08_retina", "kh_p15_retina", "kh_p08_scn",
                 "kh_p15_scn", "kh_p08_dlgn", "kh_p15_dlgn")
table_names %in% names(genotype_sig)
## [1] FALSE FALSE FALSE FALSE  TRUE FALSE
newsig <- genotype_sig[[1]]
for (sig in 2:length(table_names)) {
  name <- table_names[sig]
  newsig[["deseq"]][["ups"]][[name]] <- genotype_sig[[name]][["deseq"]][["ups"]][[name]]
  newsig[["deseq"]][["downs"]][[name]] <- genotype_sig[[name]][["deseq"]][["downs"]][[name]]
}
genotype_upsetr <- upsetr_sig(newsig)
## Error in `1:ncol(data)`:
## ! argument of length 0
genotype_upset_written <- write_upset_groups(genotype_upsetr, excel = "excel/genotype_upset_groups.xlsx")
## Error:
## ! object 'genotype_upsetr' not found
genotype_upsetr[["all_plot"]]
## Error:
## ! object 'genotype_upsetr' not found
pp(file = "images/test_genotype_upset.pdf")
print(genotype_upsetr[["all_plot"]])
## Error:
## ! object 'genotype_upsetr' not found
plotted <- dev.off()

Now let us try the location-specific comparisons

28.2 scn vs retina, p08

## The appropriate data structure is 'genotype_tables',
## and the tables of interest are:
table_names <- c("sr_p08_het", "sr_p08_ko")
table_names %in% names(location_sig)
## [1] FALSE FALSE
location_upset_input <- list()
first_table <- table_names[1]
newsig <- location_sig[[first_table]]
for (sig in 2:length(table_names)) {
  name <- table_names[sig]
  newsig[["deseq"]][["ups"]][[name]] <- location_sig[[name]][["deseq"]][["ups"]][[name]]
  newsig[["deseq"]][["downs"]][[name]] <- location_sig[[name]][["deseq"]][["downs"]][[name]]
}
location_upsetr <- upsetr_sig(newsig)
## Error in `xtfrm.data.frame()`:
## ! cannot xtfrm data frames
location_upset_written <- write_upset_groups(location_upsetr, excel = "excel/sr_p08_hetko_upset_groups.xlsx")
## Error:
## ! object 'location_upsetr' not found
location_upsetr[["all_plot"]]
## Error:
## ! object 'location_upsetr' not found
pp(file = "images/test_location_sr_p08_hetko_upset.pdf")
print(location_upsetr[["all_plot"]])
## Error:
## ! object 'location_upsetr' not found
plotted <- dev.off()

I am reasonably certain that Rashmi would like a table of the genes shared among increased scn ko and het in the above plot along with the increased retina (e.g. the 269 and 103 gene sets).

28.3 scn vs retina, p15

table_names <- c("sr_p15_het", "sr_p15_ko")
table_names %in% names(location_sig)
## [1] FALSE FALSE
location_upset_input <- list()
first_table <- table_names[1]
newsig <- location_sig[[first_table]]
for (sig in 2:length(table_names)) {
  name <- table_names[sig]
  newsig[["deseq"]][["ups"]][[name]] <- location_sig[[name]][["deseq"]][["ups"]][[name]]
  newsig[["deseq"]][["downs"]][[name]] <- location_sig[[name]][["deseq"]][["downs"]][[name]]
}
location_upsetr <- upsetr_sig(newsig)
## Error in `xtfrm.data.frame()`:
## ! cannot xtfrm data frames
location_upset_written <- write_upset_groups(location_upsetr, excel = "excel/sr_p15_hetko_upset_groups.xlsx")
## Error:
## ! object 'location_upsetr' not found
location_upsetr[["all_plot"]]
## Error:
## ! object 'location_upsetr' not found
print(scn_retina_p15_upset_result)
## Error:
## ! object 'scn_retina_p15_upset_result' not found
pp(file = "images/test_location_sr_p15_hetko_upset.pdf")
print(location_upsetr[["all_plot"]])
## Error:
## ! object 'location_upsetr' not found
plotted <- dev.off()

28.4 dlgn vs retina, p08

## The appropriate data structure is 'genotype_tables',
## and the tables of interest are:
table_names <- c("dr_p08_het", "dr_p08_ko")
location_upset_input <- list()
first_table <- table_names[1]
newsig <- location_sig[[first_table]]
for (sig in 2:length(table_names)) {
  name <- table_names[sig]
  newsig[["deseq"]][["ups"]][[name]] <- location_sig[[name]][["deseq"]][["ups"]][[name]]
  newsig[["deseq"]][["downs"]][[name]] <- location_sig[[name]][["deseq"]][["downs"]][[name]]
}
location_upsetr <- upsetr_sig(newsig)
## Error in `1:ncol(data)`:
## ! argument of length 0
location_upset_written <- write_upset_groups(location_upsetr, excel = "excel/dr_p08_hetko_upset_groups.xlsx")
## Error:
## ! object 'location_upsetr' not found
location_upsetr[["all_plot"]]
## Error:
## ! object 'location_upsetr' not found
pp(file = "images/test_location_dr_p08_hetko_upset.pdf")
print(location_upsetr[["all_plot"]])
## Error:
## ! object 'location_upsetr' not found
plotted <- dev.off()

28.5 dlgn vs retina, p15

## The appropriate data structure is 'genotype_tables',
## and the tables of interest are:
table_names <- c("dr_p15_het", "dr_p15_ko")
location_upset_input <- list()
first_table <- table_names[1]
newsig <- location_sig[[first_table]]
for (sig in 2:length(table_names)) {
  name <- table_names[sig]
  newsig[["deseq"]][["ups"]][[name]] <- location_sig[[name]][["deseq"]][["ups"]][[name]]
  newsig[["deseq"]][["downs"]][[name]] <- location_sig[[name]][["deseq"]][["downs"]][[name]]
}
location_upsetr <- upsetr_sig(newsig)
## Error in `xtfrm.data.frame()`:
## ! cannot xtfrm data frames
location_upset_written <- write_upset_groups(location_upsetr, excel = "excel/dr_p15_hetko_upset_groups.xlsx")
## Error:
## ! object 'location_upsetr' not found
location_upsetr[["all_plot"]]
## Error:
## ! object 'location_upsetr' not found
pp(file = "images/test_location_dr_p15_hetko_upset.pdf")
print(location_upsetr[["all_plot"]])
## Error:
## ! object 'location_upsetr' not found
plotted <- dev.off()

28.6 dlgn vs scn, p08

table_names <- c("ds_p08_het", "ds_p08_ko")
location_upset_input <- list()
first_table <- table_names[1]
newsig <- location_sig[[first_table]]
for (sig in 2:length(table_names)) {
  name <- table_names[sig]
  newsig[["deseq"]][["ups"]][[name]] <- location_sig[[name]][["deseq"]][["ups"]][[name]]
  newsig[["deseq"]][["downs"]][[name]] <- location_sig[[name]][["deseq"]][["downs"]][[name]]
}
location_upsetr <- upsetr_sig(newsig)
## Error in `xtfrm.data.frame()`:
## ! cannot xtfrm data frames
location_upset_written <- write_upset_groups(location_upsetr, excel = "excel/ds_p08_hetko_upset_groups.xlsx")
## Error:
## ! object 'location_upsetr' not found
location_upsetr[["all_plot"]]
## Error:
## ! object 'location_upsetr' not found
pp(file = "images/test_location_ds_p08_hetko_upset.pdf")
print(location_upsetr[["all_plot"]])
## Error:
## ! object 'location_upsetr' not found
plotted <- dev.off()

28.7 dlgn vs scn, p15

table_names <- c("ds_p15_het", "ds_p15_ko")
location_upset_input <- list()
first_table <- table_names[1]
newsig <- location_sig[[first_table]]
for (sig in 2:length(table_names)) {
  name <- table_names[sig]
  newsig[["deseq"]][["ups"]][[name]] <- location_sig[[name]][["deseq"]][["ups"]][[name]]
  newsig[["deseq"]][["downs"]][[name]] <- location_sig[[name]][["deseq"]][["downs"]][[name]]
}
location_upsetr <- upsetr_sig(newsig)
## Error in `xtfrm.data.frame()`:
## ! cannot xtfrm data frames
location_upset_written <- write_upset_groups(location_upsetr, excel = "excel/ds_p15_hetko_upset_groups.xlsx")
## Error:
## ! object 'location_upsetr' not found
location_upsetr[["all_plot"]]
## Error:
## ! object 'location_upsetr' not found
pp(file = "images/test_location_ds_p15_hetko_upset.pdf")
print(location_upsetr[["all_plot"]])
## Error:
## ! object 'location_upsetr' not found
plotted <- dev.off()

29 Shared and unique gene sets across x/wt

In this block I want to find the unique and shared genes between:

  1. scn p8 het/wt and retina p8 het/wt: hwp08scninc, hwp08retinc, hwp08scndec, hwp08retdec
  2. scn p15 het/wt and retina p15 het/wt: hwp15scninc, hwp15retinc, hwp15scndec, hwp15retdec
  3. #1 and #2 together: 8 catgories above
  4. scn p8 ko/wt and retina p8 ko/wt
  5. scn p15 ko/wt and retina p15 ko/wt
  6. #4 and #5 together

The comparisons of het/wt are found in the ‘inclusion_sig’ dataset; because they are providing our cutoffs for nonspecific binding.

29.1 Number 1 above: p08_het vs wt for scn and retina.

table_names <- c("p08_het_scn", "p08_het_retina")
inclusion_upsetr <- upsetr_sig(inclusion_sig, contrasts = table_names)
inclusion_upset_written <- write_upset_groups(inclusion_upsetr, excel = "excel/rs_p08_het_inclusion_upset_groups.xlsx")
inclusion_upsetr[["all_plot"]]

pp(file = "images/inclusion_sr_p08_upset.pdf")
print(inclusion_upsetr[["all_plot"]])
plotted <- dev.off()

29.2 Number 2 above: p15_het vs wt for scn and retina.

table_names <- c("p15_het_scn", "p15_het_retina")
inclusion_upsetr <- upsetr_sig(inclusion_sig, contrasts = table_names)
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
inclusion_upset_written <- write_upset_groups(inclusion_upsetr, excel = "excel/rs_p15_het_inclusion_upset_groups.xlsx")
inclusion_upsetr[["all_plot"]]

pp(file = "images/inclusion_sr_p15_upset.pdf")
print(inclusion_upsetr[["all_plot"]])
plotted <- dev.off()

29.3 Number 3 above: combination of #1 and #2

table_names <- c("p08_het_scn", "p08_het_retina", "p15_het_scn", "p15_het_retina")
inclusion_upsetr <- upsetr_sig(inclusion_sig, contrasts = table_names)
inclusion_upset_written <- write_upset_groups(inclusion_upsetr, excel = "excel/rs_p08p15_het_inclusion_upset_groups.xlsx")
inclusion_upsetr[["all_plot"]]

pp(file = "images/inclusion_sr_p08p15_upset.pdf")
print(inclusion_upsetr[["all_plot"]])
plotted <- dev.off()

29.4 Number 4 above p08_ko vs wt for scn and retina.

table_names <- c("p08_ko_scn", "p08_ko_retina")
inclusion_upsetr <- upsetr_sig(inclusion_sig, contrasts = table_names)
inclusion_upset_written <- write_upset_groups(inclusion_upsetr, excel = "excel/rs_p08_ko_inclusion_upset_groups.xlsx")
inclusion_upsetr[["all_plot"]]

pp(file = "images/inclusion_sr_p08_ko_upset.pdf")
print(inclusion_upsetr[["all_plot"]])
plotted <- dev.off()

29.5 Number 5 above p15_ko vs wt for scn and retina.

table_names <- c("p15_ko_scn", "p15_ko_retina")
inclusion_upsetr <- upsetr_sig(inclusion_sig, contrasts = table_names)
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
## `geom_line()`: Each group consists of only one observation.
## i Do you need to adjust the group aesthetic?
inclusion_upset_written <- write_upset_groups(inclusion_upsetr, excel = "excel/rs_p15_ko_inclusion_upset_groups.xlsx")
inclusion_upsetr[["all_plot"]]

pp(file = "images/inclusion_sr_p15_ko_upset.pdf")
print(inclusion_upsetr[["all_plot"]])
plotted <- dev.off()

29.6 Number 6 above: Combining #4 and #5

table_names <- c("p08_ko_scn", "p08_ko_retina", "p15_ko_scn", "p15_ko_retina")
inclusion_upsetr <- upsetr_sig(inclusion_sig, contrasts = table_names)
inclusion_upset_written <- write_upset_groups(inclusion_upsetr, excel = "excel/rs_p08p15_ko_inclusion_upset_groups.xlsx")
inclusion_upsetr[["all_plot"]]

pp(file = "images/inclusion_sr_p08p15_ko_upset.pdf")
print(inclusion_upsetr[["all_plot"]])
plotted <- dev.off()

30 GSVA

msigdb <- "reference/msigdb_v2024.1.Mm.db"
if (file.exists(msigdb)) {
  v3_h_gsva <- simple_gsva(v3_pairwise_input, orgdb = "org.Mm.eg.db", signature_category = "mh",
                           signatures = msigdb, id_source = "fdata",
                           required_id = "mgi_symbol")
  v3_h_gsva

  v3_h_gsva_sig <- get_sig_gsva_categories(
    v3_h_gsva, excel = "excel/gsva_sig_hallmark_categories.xlsx")
  v3_h_gsva_sig

  v3_m1_gsva <- simple_gsva(v3_pairwise_input, orgdb = "org.Mm.eg.db", signature_category = "m1",
                            signatures = msigdb, id_source = "fdata",
                            required_id = "mgi_symbol")
  v3_m1_gsva
  v3_m1_gsva_sig <- get_sig_gsva_categories(
    v3_m1_gsva, excel = "excel/gsva_sig_positional_categories.xlsx")
  v3_m1_gsva_sig

  v3_m2_gsva <- simple_gsva(v3_pairwise_input, orgdb = "org.Mm.eg.db", signature_category = "m2",
                            signatures = msigdb, id_source = "fdata",
                            required_id = "mgi_symbol")
  v3_m2_gsva
  v3_m2_gsva_sig <- get_sig_gsva_categories(
    v3_m2_gsva, excel = "excel/gsva_sig_curated_categories.xlsx")
  v3_m2_gsva_sig

  v3_m3_gsva <- simple_gsva(v3_pairwise_input, orgdb = "org.Mm.eg.db", signature_category = "m3",
                            signatures = msigdb, id_source = "fdata",
                            required_id = "mgi_symbol")
  v3_m3_gsva
  v3_m3_gsva_sig <- get_sig_gsva_categories(
    v3_m3_gsva, excel = "excel/gsva_sig_regulatory_categories.xlsx")
  v3_m3_gsva_sig

  v3_m5_gsva <- simple_gsva(v3_pairwise_input, orgdb = "org.Mm.eg.db", signature_category = "m5",
                            signatures = msigdb, id_source = "fdata",
                            required_id = "mgi_symbol")
  v3_m5_gsva
  v3_m5_gsva_sig <- get_sig_gsva_categories(
    v3_m5_gsva, excel = "excel/gsva_sig_ontology_categories.xlsx")
  v3_m5_gsva_sig

  v3_m8_gsva <- simple_gsva(v3_pairwise_input, orgdb = "org.Mm.eg.db", signature_category = "m8",
                            signatures = msigdb, id_source = "fdata",
                            required_id = "mgi_symbol")
  v3_m8_gsva
  v3_m8_gsva_sig <- get_sig_gsva_categories(
    v3_m8_gsva, excel = "excel/gsva_sig_celltype_categories.xlsx")
  v3_m8_gsva_sig
}
## Error:
## ! no such table: gene_set

31 GSEA images

Up above I created a fairly large set of enrichment/GSEA analyses. Let us pull some of the most interesting results here and look at them.

Here are the specific queries from Rashmi:

  • Genotype (het vs ko):
    • P8 het and ko for Ret
    • SCN (P8 het vs KO SCN
    • P8 het vs KO Ret)
    • P15 het and ko for Ret
  • Location (somal vs axonal):
    • SR_P08_KO
    • SR_P08_Het
    • SR_P15_KO
    • SR_P15_Het
  • Time(p8vs p15):
    • t_het_Ret_ po8-p15
    • t_KO_Ret_C po8-p15
    • t_het_SCN_po8-p15
    • t_KO_SCN_po8-p15

31.1 Genotype

Let us take a moment and see for which contrasts I acquired results:

I need to make a little summary for clusterprofiler too so that I can easily see how many hits there are for each contrast.

summary(genotype_full_gp)
##                 Length Class            Mode
## kh_p08_dlgn_up  21     gprofiler_result list
## kh_p15_dlgn_up  28     gprofiler_result list
## kh_p08_scn_up   21     gprofiler_result list
## kh_p08_scn_down 25     gprofiler_result list
## kh_p15_scn_down 26     gprofiler_result list
for (i in names(genotype_full_gp)) {
  print(i)
  print(genotype_full_gp[[i]][["num_hits"]])
}
## [1] "kh_p08_dlgn_up"
##    BP    CC CORUM    HP  KEGG MIRNA    MF  REAC    TF    WP 
##     0     0     0     0     0     0     0     0     0     0 
## [1] "kh_p15_dlgn_up"
##    BP    CC CORUM    HP  KEGG MIRNA    MF  REAC    TF    WP 
##    63    32     0   118     1     0    21     6     3     0 
## [1] "kh_p08_scn_up"
##    BP    CC CORUM    HP  KEGG MIRNA    MF  REAC    TF    WP 
##     0     0     0     0     0     0     0     0     0     0 
## [1] "kh_p08_scn_down"
##    BP    CC CORUM    HP  KEGG MIRNA    MF  REAC    TF    WP 
##    58    21     0     0     0     0     3     0   113     0 
## [1] "kh_p15_scn_down"
##    BP    CC CORUM    HP  KEGG MIRNA    MF  REAC    TF    WP 
##    49     9     0     0     1     0     4     0     1     0
summary(genotype_full_cp)
## Error:
## ! object 'genotype_full_cp' not found
for (i in names(genotype_full_cp)) {
  print(i)
  print(nrow(genotype_full_cp[[i]][["gse_go"]]))
}
## Error:
## ! object 'genotype_full_cp' not found

31.1.1 p8 het/ko for retina:

This contrast, even before filtering away the high-wt genes, only has 8 genes in the set of up and down genes combined. As a result, my function which performs gProfiler/clusterProfiler skips it, and also skips the p15 het/ko for retina samples.

31.1.2 p8 het/ko for scn:

This has a bunch more genes: 51 up and 128 down. Unfortunately, gProfiler sees no significant over-representation in the up category of genes. The down category has

The up/down sets from clusterProfiler have enrich_go, gse_go, and enrich_objects to look at.

genotype_full_gp$kh_p08_scn_up$num_hits
##    BP    CC CORUM    HP  KEGG MIRNA    MF  REAC    TF    WP 
##     0     0     0     0     0     0     0     0     0     0
genotype_full_gp$kh_p08_scn_down$num_hits
##    BP    CC CORUM    HP  KEGG MIRNA    MF  REAC    TF    WP 
##    58    21     0     0     0     0     3     0   113     0
plots <- plot_enrichresult(genotype_full_gp$kh_p08_scn_down[["BP_enrich"]])
## Warning in (function (model, data, ...) : Arguments in `...` must be used.
## x Problematic argument:
## * by = "Count"
## i Did you misspell an argument name?
plots[["dot"]]

plots[["tree"]]

Perhaps I should just ask the question: for which categories did I get results back?

summary(genotype_full_gp)
##                 Length Class            Mode
## kh_p08_dlgn_up  21     gprofiler_result list
## kh_p15_dlgn_up  28     gprofiler_result list
## kh_p08_scn_up   21     gprofiler_result list
## kh_p08_scn_down 25     gprofiler_result list
## kh_p15_scn_down 26     gprofiler_result list

kh_p08_dlgn_up: No significant gProfiler results. kh_p15_dlgn_up: Significant BP, HP, KEGG, MF, REAC, TF kh_p08_scn_up: No significant gProfiler results. kh_p08_scn_down: Significant BP, MiRNA, MF, TF kh_p15_scn_down: Significant BP, MF

plots <- plot_enrichresult(genotype_full_gp[["kh_p15_dlgn_up"]][["BP_enrich"]])
## Warning in (function (model, data, ...) : Arguments in `...` must be used.
## x Problematic argument:
## * by = "Count"
## i Did you misspell an argument name?
plots[["dot"]]

31.2 Location

31.2.1 Scn vs retina ko, p08

plots <- plot_enrichresult(location_gp[["sr_p08_ko"]][["sr_p08_ko_up"]][["BP_enrich"]])
plots[["dot"]]
## NULL
plots <- plot_enrichresult(location_gp[["sr_p08_ko"]][["sr_p08_ko_down"]][["BP_enrich"]])
plots[["dot"]]
## NULL

31.2.2 scn vs retina, het, p08

Enriched groups: BP, KEGG, MF, TF, CC

summary(location_gp[["sr_p08_het"]][["sr_p08_het_up"]])
## Length  Class   Mode 
##      0   NULL   NULL
plots <- plot_enrichresult(location_gp[["sr_p08_het"]][["sr_p08_het_up"]][["BP_enrich"]])
plots[["dot"]]
## NULL
plots <- plot_enrichresult(location_gp[["sr_p08_het"]][["sr_p08_het_up"]][["CC_enrich"]])
plots[["dot"]]
## NULL
plots <- plot_enrichresult(location_gp[["sr_p08_het"]][["sr_p08_het_down"]][["BP_enrich"]])
plots[["dot"]]
## NULL
sr_p08_het_topn_gsea <- plot_topn_gsea(location_cp[[""]])
## Error in `if (nrow(gse) < topn) ...`:
## ! argument is of length zero

31.2.3 Scn vs retina ko, p15

plots <- plot_enrichresult(location_gp[["sr_p15_ko"]][["sr_p15_ko_up"]][["BP_enrich"]])
plots[["dot"]]
## NULL
plots <- plot_enrichresult(location_gp[["sr_p15_ko"]][["sr_p15_ko_down"]][["BP_enrich"]])
plots[["dot"]]
## NULL

31.2.4 scn vs retina, het, p15

plots <- plot_enrichresult(location_gp[["sr_p15_het"]][["sr_p15_het_up"]][["BP_enrich"]])
plots[["dot"]]
## NULL
plots <- plot_enrichresult(location_gp[["sr_p15_het"]][["sr_p15_het_down"]][["BP_enrich"]])
plots[["dot"]]
## NULL

31.3 Time

31.3.1 het retina

Ups: significant results for BP, MF, TF Downs: BP, MF, REAC, TF, WP

plots <- plot_enrichresult(time_gp[["t_het_retina"]][["t_het_retina_up"]][["BP_enrich"]])
plots[["dot"]]
## NULL
plots <- plot_enrichresult(time_gp[["t_het_retina"]][["t_het_retina_down"]][["BP_enrich"]])
plots[["dot"]]
## NULL

31.3.2 ko retina

Up: BP, MiRNA, MF Down: BP, MF, REAC, TF

plots <- plot_enrichresult(time_gp[["t_ko_retina"]][["t_ko_retina_up"]][["BP_enrich"]])
plots[["dot"]]
## NULL
plots <- plot_enrichresult(time_gp[["t_ko_retina"]][["t_ko_retina_down"]][["BP_enrich"]])
plots[["dot"]]
## NULL

31.3.3 het scn

Neither of the SCN gProfiler queries provided any results.

32 Bibliography

pander::pander(sessionInfo())
message(paste0("This is hpgltools commit: ", get_git_commit()))
message(paste0("Saving to ", savefile))
tmp <- sm(saveme(filename = savefile))
tmp <- loadme(filename = savefile)
Hänzelmann, Sonja, Robert Castelo, and Justin Guinney. 2013. GSVA: Gene Set Variation Analysis for Microarray and RNA-Seq Data.” BMC Bioinformatics 14 (1): 7. https://doi.org/10.1186/1471-2105-14-7.
Hoffman, Gabriel E, and Panos Roussos. 2020. “Dream: Powerful Differential Expression Analysis for Repeated Measures Designs.” Bioinformatics 37 (2): 192–201. https://doi.org/10.1093/bioinformatics/btaa687.
Hoffman, Gabriel E., and Eric E. Schadt. 2016. variancePartition: Interpreting Drivers of Variation in Complex Gene Expression Studies.” BMC Bioinformatics 17 (1): 483. https://doi.org/10.1186/s12859-016-1323-z.
Leek, Jeffrey T., W. Evan Johnson, Hilary S. Parker, Andrew E. Jaffe, and John D. Storey. 2012. “The SVA Package for Removing Batch Effects and Other Unwanted Variation in High-Throughput Experiments.” Bioinformatics 28 (6): 882–83. https://doi.org/10.1093/bioinformatics/bts034.
Leng, Ning, John A. Dawson, James A. Thomson, Victor Ruotti, Anna I. Rissman, Bart M. G. Smits, Jill D. Haag, Michael N. Gould, Ron M. Stewart, and Christina Kendziorski. 2013. EBSeq: An Empirical Bayes Hierarchical Model for Inference in RNA-seq Experiments.” Bioinformatics 29 (8): 1035–43. https://doi.org/10.1093/bioinformatics/btt087.
Li, Huiling, Yangao Huo, Xi He, Liping Yao, Hao Zhang, Yiqiang Cui, Huijuan Xiao, et al. 2022. “A Male Germ-Cell-Specific Ribosome Controls Male Fertility.” Nature 612 (7941): 725–31. https://doi.org/10.1038/s41586-022-05508-0.
Love, Michael I., Wolfgang Huber, and Simon Anders. 2014. “Moderated Estimation of Fold Change and Dispersion for RNA-Seq Data with DESeq2.” bioRxiv. https://doi.org/10.1101/002832.
Raudvere, Uku, Liis Kolberg, Ivan Kuzmin, Tambet Arak, Priit Adler, Hedi Peterson, and Jaak Vilo. 2019. “G:Profiler: A Web Server for Functional Enrichment Analysis and Conversions of Gene Lists (2019 Update).” Nucleic Acids Research 47 (W1): W191–98. https://doi.org/10.1093/nar/gkz369.
Ritchie, Matthew E., Belinda Phipson, Di Wu, Yifang Hu, Charity W. Law, Wei Shi, and Gordon K. Smyth. 2015. “Limma Powers Differential Expression Analyses for RNA-sequencing and Microarray Studies.” Nucleic Acids Research 43 (7): e47. https://doi.org/10.1093/nar/gkv007.
Robinson, Mark D., Davis J. McCarthy, and Gordon K. Smyth. 2010. edgeR: A Bioconductor Package for Differential Expression Analysis of Digital Gene Expression Data.” Bioinformatics 26 (1): 139–40. https://doi.org/10.1093/bioinformatics/btp616.
Smedley, Damian, Syed Haider, Benoit Ballester, Richard Holland, Darin London, Gudmundur Thorisson, and Arek Kasprzyk. 2009. BioMart – Biological Queries Made Easy.” BMC Genomics 10 (1): 22. https://doi.org/10.1186/1471-2164-10-22.
Tarazona, Sonia, Fernando García, Alberto Ferrer, Joaquín Dopazo, and Ana Conesa. 2011. NOIseq: A RNA-seq Differential Expression Method Robust for Sequencing Depth Biases.” EMBnet.journal 17 (B): 18–19. https://doi.org/10.14806/ej.17.B.265.
Yu, Guangchuang. n.d. 📖 Introduction Biomedical Knowledge Mining Using GOSemSim and clusterProfiler. Accessed June 21, 2024. https://yulab-smu.top/biomedical-knowledge-mining-book/.
LS0tCnRpdGxlOiAiQW5hbHlzZXMgb2YgdGhlIElQUkdDIHJlLXByb2Nlc3NlZCBzYW1wbGVzLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKYmlibGlvZ3JhcGh5OiBhdGIuYmliCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgICAgIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgICAgICBkZl9wcmludDogcGFnZWQKICAgICAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgICAgIGZpZ19oZWlnaHQ6IDcKICAgICAgICBmaWdfd2lkdGg6IDcKICAgICAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgICAgICB3aWR0aDogMzAwCiAgICAgICAga2VlcF9tZDogZmFsc2UKICAgICAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICAgICAgdG9jX2Zsb2F0OiB0cnVlCiAgICAgICAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgICAgICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICAgICAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgICAgICAgZmlnX2hlaWdodDogNwogICAgICAgICAgZmlnX3dpZHRoOiA3CiAgICAgICAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgICAgICAgIGtlZXBfbWQ6IGZhbHNlCiAgICAgICAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICAgICAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CmZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CmZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewpmb250LXNpemU6IDE2cHgKfQpib2R5IC5tYWluLWNvbnRhaW5lciB7Cm1heC13aWR0aDogMTYwMHB4Owp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGhwZ2x0b29scykKbGlicmFyeShkcGx5cikKbGlicmFyeShlbnJpY2hwbG90KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dyZXBlbCkKbGlicmFyeShncHJvZmlsZXIyKQp0dCA8LSB0cnkoZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpKQprbml0cjo6b3B0c19rbml0JHNldCgKICBwcm9ncmVzcyA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFLCB3aWR0aCA9IDkwLCBlY2hvID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGVycm9yID0gVFJVRSwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDgsIGZpZy5yZXRpbmEgPSAyLAogIG91dC53aWR0aCA9ICIxMDAlIiwgZGV2ID0gInBuZyIsCiAgZGV2LmFyZ3MgPSBsaXN0KHBuZyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzID0gNCwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLCBrbml0ci5kdXBsaWNhdGUubGFiZWwgPSAiYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplID0gMTIpKQp2ZXIgPC0gIjIwMjQwOCIKcHJldmlvdXNfZmlsZSA8LSAiIgp2ZXIgPC0gZm9ybWF0KFN5cy5EYXRlKCksICIlWSVtJWQiKQoKIyN0bXAgPC0gc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpCnJtZF9maWxlIDwtICJpcHJnY19hbmFseXNlc18yMDI0MDguUm1kIgpzYXZlZmlsZSA8LSBnc3ViKHBhdHRlcm4gPSAiXFwuUm1kIiwgcmVwbGFjZSA9ICJcXC5yZGFcXC54eiIsIHggPSBybWRfZmlsZSkKIyMgTm8gb25lIHdpbGwgZXZlciByZWFkIHRoaXMgSSBzdXNwZWN0LCBidXQgdGhlcmUgd2lsbCBfbmV2ZXJfIGJlIGEgd29yZCBwcm9kdWNlZAojIyBieSBhbiBMTE0gaW4gYSBkb2N1bWVudCB3cml0dGVuIGJ5IG1lLgpgYGAKCiMgU2V0IHNvbWUgcGFyYW1ldGVycyB3aGljaCB3aWxsIGJlIHVzZWQgbGF0ZXIKCmBgYHtyfQojIyBMb2dGQyBjdXRvZmYgd2hlbiB3b3JraW5nIG9uIHRoZSBpbmNsdXNpb24gc2V0cy4KbGZjX2N1dG9mZiA8LSAwLjEKIyMgQWRqdXN0ZWQgcC12YWx1ZSBjdXRvZmYgd2hlbiB3b3JraW5nIG9uIHRoZSBpbmNsdXNpb24gc2V0cy4KYWRqcF9jdXRvZmYgPC0gMC4xCiMjIEluY3JlYXNlIHRoZSBtYXhpbXVtIGFsbG93ZWQgZ3JvdXAgc2l6ZSB3aGVuIHdvcmtpbmcgd2l0aCBjbHVzdGVyUHJvZmlsZXIKIyMgVGhpcyBzaG91bGQgYnJpbmcgb3V0IHNvbWUgb2YgdGhlIG1vcmUgZ2VuZXJhbCBncm91cHMgbGlrZSAnY2VsbGJvZHknCm1heF9ncm91cHNpemUgPC0gMjAwMAojIyBBbGxvdyBncm91cHMgaGlnaGVyIHVwIGluIHRoZSB0cmVlIGZvciBjbHVzdGVyUHJvZmlsZXIgcmVzdWx0cy4KZ29fbGV2ZWwgPC0gMgojIyBBbGxvdyAxMCBHTyBjYXRlZ29yaWVzIHRvIGJlIGRpc3BsYXllZCB3aGVuIHBsb3R0aW5nLgpnb19jYXRlZ29yaWVzIDwtIDE0CiMjIE1BIHBsb3QgcG9pbnQgb3V0bGluZXMKb3V0bGluZSA8LSBGQUxTRQojIyBTcGVlZCB1cCBjbHVzdGVyUHJvZmlsZXIgYnkgY2hvb3NpbmcgdGhlIGNvcnJlY3Qga2V5dHlwZXMKb3JnZGJfZnJvbSA8LSAiRU5TRU1CTCIKZGVmYXVsdF9mc3RyaW5nIDwtICJ+IDAgKyBjb25kaXRpb24iCmBgYAoKIyBUT0RPcwoKKiBDaGVjayB0aGlzIGZvciBjb3JyZWN0bmVzcy4KKiBSZW9yZ2FuaXplIGl0CiogR1NWQSAoQGhhbnplbG1hbm5HU1ZBR2VuZVNldDIwMTNhKQoqIENvbnNpZGVyIGVtYmVkZGluZyBzb21lL21hbnkvYWxsIG9mIHRoZSBFeGNlbCBvdXRwdXRzIGludG8gdGhlIGh0bWwKICBvdXRwdXQgdmlhIHhmdW46OmVtYmVkX2RpcignZXhjZWwvJykKCiMgTWVldGluZyB3aXRoIFRoZXJlc2EKClByZXZpb3VzIHBhcGVycyBkaWQgbm90IGRvIGFuIGV4cGxpY2l0IHN1YnRyYWN0aW9uLCBpbnN0ZWFkIGp1c3QKY29tcGFyZWQgdG8gV1QgYW5kIGtlcHQgdGhlIGdlbmVzIHdoaWNoIGFyZSA+IGluIGRlbHRhL2hldCB2cy4gd3QuClRoZXJlIGFyZSBtdWx0aXBsZSB3YXlzIHRvIGRlYWwgd2l0aCB0aGlzIGFuZCB0aGF0IHF1ZXJ5IGhhcyBub3QgeWV0CmJlZW4gZGVmaW5lZC4gIExhdGVyLCBUaGVyZXNhIGNhbWUgdG8gdGhlIGNvbmNsdXNpb24gdGhhdCB0aGUKc3VidHJhY3Rpb24gbWV0aG9kIGlzIG5vdCBhcHByb3ByaWF0ZS4KCiMgSW50cm9kdWN0aW9uCgpJbiB0aGlzIGRvY3VtZW50IEkgaG9wZSB0byBleHBsb3JlIHRoZSBmcmVzaGx5IHByb2Nlc3NlZCBzYW1wbGVzIGFuZApwZXJmb3JtIHNvbWUgY29tcGFyaXNvbnMgdG8gc2VlIHRoYXQgd2UgaGF2ZSB0aGUgZXhwZWN0ZWQgc2ltaWxhcml0aWVzCmFuZCBkaWZmZXJlbmNlcyBmcm9tIHRoZSBwcmlvciBhbmFseXNpcyBwZXJmb3JtZWQgYnkgVGhlcmVzYS4KClRoZXJlIGlzIG9uZSB3YXkgaW4gd2hpY2ggSSBleHBlY3QgYW55L2FsbCBvZiB0aGVzZSBhbmFseXNlcyB0byBiZQpleHBsaWNpdGx5IGRpZmZlcmVudDogdGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgY2hhbmdlcyBwcm9kdWNlZCBieQpBcHJpbCdzIHJlbmFtaW5nIG9mIHNvbWUgc2FtcGxlcy4KCk15IGludGVudGlvbiBpcyB0byBwcm9kdWNlIGEgc2FtcGxlIHNoZWV0IHdoaWNoIGluY2x1ZGVzIG9uZSBjb2x1bW4Kd2l0aCBub24tdW1pLWRlZHVwbGljYXRlZCByZXN1bHRzIGFuZCBvbmUgd2l0aCBkZWR1cGxpY2F0ZWQgcmVzdWx0cy4KV2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBwcmV2aW91cyBwb2ludCwgSSBob3BlIHRoYXQgdGhlIGZpcnN0IHdpbGwKYmUgaWRlbnRpY2FsIChvciBhdCBsZWFzdCB2ZXJ5IGNsb3NlIHRvIGlkZW50aWNhbCkgdG8gVGhlcmVzYSdzIHJlc3VsdAp3aGlsZSB0aGUgc2Vjb25kIEkgZXhwZWN0IHdpbGwgYmUgc3VidGx5IGRpZmZlcmVudCAtLSBidXQgSSBhbSBob3BpbmcKc3VidGx5IGVub3VnaCB0aGF0IGl0IHdpbGwgbm90IHNpZ25pZmljYW50bHkgY2hhbmdlIHRoZSBpbnRlcnByZXRhdGlvbgpidXQgYmUgYSBsaXR0bGUgbW9yZSBwcmVjaXNlLgoKTGV0cyBzZWUhICBJIG5lZWQgdGhlcmVmb3JlIHRvIG1ha2UgYSBjaGFuZ2UgdG8gbXkgbWV0YWRhdGEgZ2F0aGVyaW5nCmZ1bmN0aW9uIHRvIGluY2x1ZGUgdGhlIHVtaSBkZWR1cGxpY2F0ZWQgcmVzdWx0LiAgSSBhbSB0aGlua2luZwp0aGVyZWZvcmUgdG8gY3JlYXRlIGEgc2VwYXJhdGUgc3BlY2lmaWNhdGlvbiBmb3IgdW1pLWJhcmNvZGVkIHNhbXBsZXMKYmVjYXVzZSBsb29raW5nIHRocm91Z2ggdGhlIGxvZ3MgZm9yIHVtaSBzdHVmZiB3aGVuIHRoZXkgYXJlIG5vdCB1c2VkCndpbGwgYmUgdG9vIG11Y2ggb2YgYSBwYWluLi4uCgojIyBTbWFsbCByYW5kb20gcmVtaW5kZXIKCkkgaGF2ZSBhIGNvdXBsZSBwaWN0dXJlcyBvZiBSUEwyMiB0byBoZWxwIG1lIHJlbWVtYmVyIHRoZSBleHBlcmltZW50YWwKZGVzaWduOgoKKiBUaGUgaHVtYW4gcmlib3NvbWUgd2l0aCBSUEwyMiBpbiByZWQ6ICFbaHVtYW5fcnBsMjJfcmVkXShodW1hbl9yaWJvc29tZV9MMjJfcmVkLnBuZykKKiBUaGUgbW91c2Ugcmlib3NvbWUgd2l0aCBSUEwyMiBpbiBncmVlbiBhdCB0aGUgY2VudGVyOgohW21vdXNlX3JwbDIyXShtbXVzY3VsdXNfUlBMMjJfZ3JlZW5fY2VudGVyLnBuZykKClRoYXQgc2Vjb25kIHBpY3R1cmUgY2FtZSBmcm9tOiAoQGxpTWFsZUdlcm1jZWxsc3BlY2lmaWNSaWJvc29tZTIwMjIpCgojIEEgbm90ZSBhYm91dCBpbXBsZW1lbnRhdGlvbgoKSSB3b3VsZCBsaWtlIHRvIGltcHJvdmUgdGhpcyBkb2N1bWVudCBieSBjb21wYXJpbmcvY29udHJhc3RpbmcgdGhlCm1ldGhvZG9sb2dpZXMgcGVyZm9ybWVkIGJ5IG90aGVyIGdyb3VwcyBhbmQgdGhvc2UgcGVyZm9ybWVkIGJ5IG1lIGluCml0LiAgSSBuZXZlciBmdWxseSBhcHByZWNpYXRlZCB0aGUgc3VpdGUgb2YgY29tcHV0YXRpb25hbCBtZXRob2RzCmFwcGxpZWQgYnkgcHJldmlvdXMgZ3JvdXBzIHdoZW4gZXhhbWluaW5nIFRSQVAgZGF0YTsgSSBpbnN0ZWFkIHNpbXBseQpmb2xsb3dlZCBUaGVyZXNhJ3Mgbm90ZWJvb2sgd2l0aG91dCBjb25zaWRlcmluZyBvdGhlciBwb3NzaWJpbGl0aWVzLgoKSSB0aGVyZWZvcmUgc3BlbnQgYSBsaXR0bGUgdGltZSBzdGVwcGluZyB0aHJvdWdoIGhlciB0aGVzaXMgYW5kCnB1bGxpbmcgb3V0IHRoZSByZWxldmFudCBwYXBlcnMgaW4gdGhlIGhvcGVzIG9mIGxlYXJuaW5nIHRoZXNlIHZhcmlvdXMKbWV0aG9kcy4gIEkgc2hvdWxkIHRoZXJlZm9yZSBiZSBhYmxlIHNvb24gdG8gY29tcGFyZS9jb250cmFzdCB0aGUKdmFyaW91cyBtZXRob2RzIGVtcGxveWVkIGJ5IG90aGVyIGxhYnMgaW4gYWRkaXRpb24gdG8gY29weWluZwpUaGVyZXNhJ3MgbG9naWMuCgojIyBUaGUgZm9sbG93aW5nIGJsb2NrIGNhbm5vdCB3b3JrIGluIHRoZSBjb250YWluZXIKClRoZSBmb2xsb3dpbmcgYmxvY2sgYXNzdW1lcyB0aGUgZnVsbCB0cmVlIG9mIHByZXByb2Nlc3NlZCBkYXRhIHdpdGgKdGhlIGxvZ3MgZnJvbSB0aGUgdHJpbW1lciwgbWFwcGluZywgdW1pIGRlZHVwbGljYXRpb24sIGNvdW50aW5nLCBldGMuCkFzIGEgcmVzdWx0IGl0IGNhbm5vdCB3b3JrIGluIHRoZSBjb250YWluZXIgd2hpY2ggaGFzIG9ubHkgdGhlIHZhcmlvdXMKY291bnQgdGFibGVzLgoKQXMgYSByZXN1bHQsIEkgYW0gaW5jbHVkaW5nIGEgY29weSBvZiB0aGlzIHNoZWV0IGFmdGVyIHJ1bm5pbmcgdGhlCmZvbGxvd2luZyBibG9jayBpbiBteSB3b3JraW5nIHRyZWUuICBJIHN1cHBvc2UgZm9yIHRoZSBtb21lbnQgeW91IHdpbGwKaGF2ZSB0byB0cnVzdCB0aGF0IGl0IHdvcmtlZC4gIChmb3IgcmlnaHQgbm93LCB3aGVuIHRlc3Rpbmcgb3V0IHRoaXMKY29udGFpbmVyLCBJIGFtIGp1c3Qgc2VuZGluZyB0aGUgUiB3b3JraW5nIGRpcmVjdG9yeSB0byBteSB0cmVlIGZvcgp0aGlzIGJsb2NrLCB0aGVuIG1vdmluZyBpdCBiYWNrLgoKSSB3aWxsIG5lZWQgdG8gbWFudWFsbHkgZWRpdCBvbmUgY29sdW1uIHRob3VnaCwgdGhlIHN5bWxpbmsgY29sdW1uCmZyb20gVGhlcmVzYSBoYXMgYSBzZXJpZXMgb2YgcGF0aHMgd2hpY2ggZG8gbm90IHdvcmsgaW4gdGhlIGNvbnRhaW5lci4KCgpgYGB7ciwgZXZhbD1GQUxTRX0KdW1pX3NwZWMgPC0gbWFrZV9ybmFzZXFfc3BlYyh1bWkgPSBUUlVFKQppcHJnY18yMDIyX21ldGEgPC0gZ2F0aGVyX3ByZXByb2Nlc3NpbmdfbWV0YWRhdGEoInNhbXBsZV9zaGVldHMvMjAyNDA2MDZfb25seV91bWRfc2VxdWVuY2VkLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYyA9IHVtaV9zcGVjLCBzcGVjaWVzID0gIm1tMzlfMTEyIiwgdmVyYm9zZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpciA9ICJwcmVwcm9jZXNzaW5nL3VtZF9zZXF1ZW5jZWQiKQpjb2xuYW1lcyhpcHJnY18yMDIyX21ldGFbWyJuZXdfbWV0YSJdXSkKaGVhZChpcHJnY18yMDIyX21ldGFbWyJuZXdfbWV0YSJdXSkKYGBgCgpgYGB7cn0Kc2FtcGxlX3NoZWV0IDwtICJzYW1wbGVfc2hlZXRzLzIwMjQwNjA2X29ubHlfdW1kX3NlcXVlbmNlZF9tb2RpZmllZC54bHN4Igptc2lnZGIgPC0gInJlZmVyZW5jZS9tc2lnZGJfdjIwMjQuMS5NbS5kYiIKbXNpZ19kYXRhIDwtIE5VTEwKbWFrZV90cmFuc3BhcmVudCA8LSBmdW5jdGlvbigpIHsKICBnZ3Bsb3QyOjp0aGVtZSgKICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICd0cmFuc3BhcmVudCcpLAogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAndHJhbnNwYXJlbnQnLCBjb2xvciA9IE5BKSwKICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICd0cmFuc3BhcmVudCcpLAogICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAndHJhbnNwYXJlbnQnKSkKfQpgYGAKCkkgd2lsbCBmaWd1cmUgb3V0IGlmIEkgY2FuIGxlYXZlIG1TaWdEQiBNMiBpbiB0aGlzIGltYWdlOyBpZiBub3QsIHRoZW4KYW55IGFuYWx5c2VzIGRlcGVuZGluZyBvbiB0aG9zZSBnZW5lIHNldHMgd2lsbCBmYWlsIGEgcHJpb3JpLgoKYGBge3J9Cm0yX2dzYyA8LSB0cnkobG9hZF9nbXRfc2lnbmF0dXJlcyhzaWduYXR1cmVzID0gbXNpZ2RiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlX2NhdGVnb3J5ID0gIk0yIiksIHNpbGVudCA9IFRSVUUpCiMjIEkgZG8gbm90IHRoaW5rIEkgaGF2ZSBwZXJtaXNzaW9uIHRvIGxvYWQgdGhlIG1zaWdkYiBpbiB0aGUgY29udGFpbmVyCiMjIFNvLCBpZiB0aGlzIGZhaWxzLCBqdXN0IGxvYWQgaXQgZnJvbSBHU1ZBRGF0YSwgb2ggd2FpdCBubywgR1NWQWRhdGEgaXMgaHVtYW4uCmlmICgidHJ5LWVycm9yIiAlaW4lIGNsYXNzKG0yX2dzYykpIHsKICB3YXJuaW5nKCJVbmFibGUgdG8gbG9hZCB0aGUgTTIgTXNpZ0RCIGRhdGEuIikKfQpgYGAKCkZyb20gdGhpcyBwb2ludCBvbiwgSSBhbSBob3BpbmcvaW50ZW5kaW5nIHRvIHB1bGwgbGliZXJhbGx5IGZyb20KVGhlcmVzYSdzIG5vdGVib29rIHdpdGggYSBkaXZlcnNpb24gdG8gY29tcGFyZSB0aGUgdGhyZWUgZGF0YXNldHM6CgoqIFByZS1BcHJpbCByZW5hbWluZzogRS5nLiBUaGVyZXNhJ3MgY3VycmVudCBkYXRhc2V0CiogUG9zdCByZW5hbWluZzogVW5sZXNzIEkgYW0gbWlzdGFrZW4sIHRoaXMgc2hvdWxkIGJlIHZlcnkgc2ltaWxhciB0bwogIHRoZSBhYm92ZS4KKiBQb3N0IGRlZHVwbGljYXRpb246IEdpdmVuIHdoYXQgSSBzYXcgZnJvbSB0aGUgZXh0cmFjdGVkIGxvZ3MgaW4gdGhlCiAgc2FtcGxlIHNoZWV0LCBJIGV4cGVjdCB0aGlzIHRvIGJlIHNpbWlsYXIgYnV0IG5vdCBpZGVudGljYWwgdG8gdGhlCiAgcHJldmlvdXMgdHdvLgoKTGV0cyBmaW5kIG91dCEgICBCdXQgZmlyc3QsIGFubm90YXRpb25zIQoKIyBBbm5vdGF0aW9uIGRhdGEKCkkgYW0gcHVsbGluZyB0aGlzIGZyb20gVGhlcmVzYSdzIGFueG9udHJhcFJfcGlwZWxpbmUuUm1kLCBwcmltYXJpbHkKYmVjYXVzZSBpdCBsb29rcyBzaW1pbGFyIHRvIHRoZSBvdGhlciBkb2N1bWVudHMsIGJ1dCB3YXMgbW9kaWZpZWQgbW9yZQpyZWNlbnRseS4gIEkgd2lsbCBjaGFuZ2UgaXQgc2xpZ2h0bHksIHByaW1hcmlseSBiZWNhdXNlIEkgZ3JhYmJlZCBhCm5ldyBtbXVzY3VsdXMgYXNzZW1ibHkgYW5kIHRoZXJlZm9yZSBJIHdpbGwgcHVsbCB0aGUgbW11c2N1bHVzCmFubm90YXRpb25zIGZyb20gYSBzcGVjaWZpYyBiaW9tYXJ0CihAc21lZGxleUJpb01hcnRCaW9sb2dpY2FsUXVlcmllczIwMDkpIGFyY2hpdmUgdGhhdCBzaG91bGQgbWF0Y2ggaXQuCgpBIG5vdGUgZnJvbSB0aGUgZnV0dXJlOiBtdWx0aXBsZSBlbnNlbWJsIGFyY2hpdmUgc2VydmVycyBoYXZlIGJlZW4KdGFrZW4gb2ZmbGluZSBzaW5jZSBsYXN0IEkgcmFuIHRoaXMuICBMZXQgdXMgc2VlIGlmIEZlYi4gMjAyMyBzdGlsbAp3b3Jrcy4KCiMjIEFuIGltcG9ydGFudCBub3RlIQoKSW4gdGhlIHJlY2VudCBwYXN0LCBlbnNlbWJsIHF1ZXJpZXMgaGF2ZSBiZWNvbWUgaW5jb25zaXN0ZW50LCBmYWlsaW5nCm11Y2ggbW9yZSBvZnRlbiB0aGFuIGV2ZXIgaW4gdGhlIHBhc3QuICBJIGRvIG5vdCB0aGluayB0aGlzIGlzIHRoZQpmYXVsdCBvZiBlbnNlbWJsOyBidXQgSSB0aGluayBJIG5lZWQgYSBmYWxsYmFjayBtZWNoYW5pc20gZm9yCmNvbGxlY3RpbmcgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbi4KCkluIHRoZSBjYXNlIG9mIGVuc2VtYmwsIGl0IHNob3VsZCBiZSB0cml2aWFsIChidXQgbGVzcyBmdW4pIHRvIHVzZSBhCmNvbWJpbmF0aW9uIG9mIHRoZSBsb2NhbGx5IGluc3RhbGxlZCBvcmdkYiBhbmQgdHhkYiBkYXRhYmFzZXMuCgpUaGlzIGRvZXMgb3BlbiBhIHJpc2sgdGhhdCB0aGUgc2V0IG9mIGdlbmVzIHdpdGggYW5ub3RhdGlvbnMgd2lsbCBiZQpkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZW4gdGhlIGNvbnRhaW5lciBpcyBydW4gZHVlIHRvIGRpZmZlcmVuY2VzCmJldHdlZW4gdGhlIG9yZ2RiL3R4ZGIgaW5zdGFuY2UgYW5kIHRoZSBGZWIgMjAyMyBiaW9tYXJ0LiAgSSBhbSBub3QKc3VyZSB0aGVyZSBpcyBtdWNoIEkgY2FuIGRvIGFib3V0IHRoYXQgZXhjZXB0IHRvIGJ1bmRsZSB0aGUgc2V0IG9mCmFubm90YXRpb25zIEkgZG93bmxvYWRlZCBpbiB0aGUgY29udGFpbmVyIC0tIHNpbmNlCmxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucygpIGRvZXMgc2F2ZSBhIHJkYSBjb3B5IG9mIGl0cyBkb3dubG9hZC4KCm9rLCBJIGRpZCBib3RoLiAgSWYgeW91LCBkZWFyIHJlYWRlciwgd2lzaCB0byBkb3dubG9hZCB5b3VyIG93bgphbm5vdGF0aW9ucywgYW5kIGVuc2VtYmwgaXMgaGF2aW5nIHRyb3VibGVzLCB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrCndpdGhvdXQgYSBwcm9ibGVtOyBpbiBhZGRpdGlvbiB0aGUgcmRhIGFubm90YXRpb25zIGFyZSBpbiAvZGF0YSBvZiB0aGUKY29udGFpbmVyIGFuZCBzaG91bGQgZ2V0IGxvYWRlZC4KCmBgYHtyfQp0eF9nZW5lX21hcCA8LSBkYXRhLmZyYW1lKCkKbW1fYW5ub3QgPC0gdHJ5KGxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucyhzcGVjaWVzID0gIm1tdXNjdWx1cyIsIHllYXIgPSAiMjAyMyIsIG1vbnRoID0gIjAyIikpCmlmICgidHJ5LWVycm9yIiAlaW4lIGNsYXNzKG1tX2Fubm90KSkgewogIGZpZWxkcyA8LSBjKCJBQ0NOVU0iLCAiRU5TRU1CTCIsICJFTlNFTUJMVFJBTlMiLCAiRU5URVpJRCIsICJHRU5FTkFNRSIsICJTWU1CT0wiKQogIG9yZ2RiX2Fubm90IDwtIGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMoIm9yZy5NbS5lZy5kYiIsIGZpZWxkcyA9IGZpZWxkcykKICBnZW5lX2luZm8gPC0gb3JnZGJfYW5ub3RbWyJnZW5lcyJdXQogICMjIE5vdGUsIHRoZXJlIGFyZSBhIGJ1bmNoIG9mIHZhcmlhbnRzIG9mIHRoZSB0eGRiIHBhY2thZ2Ugb25lIG1pZ2h0IHVzZS4KICAjIyBJIGRvIG5vdCB0aGluayBpdCBtYXR0ZXJzIGEgbG90IGZvciBvdXIgcHVycG9zZXMsIGJ1dCBJIHN1c3BlY3QgdGhhdCBpZiB3ZSB1c2VkCiAgIyMgYSBtaXNtYXRjaGVkIEJTZ2Vub21lIGFuZCB0cmllZCB0byBwdWxsIENEUyBzZXF1ZW5jZXMsIHRoYXQgbWlnaHQgZW5kIGJhZGx5LgogIHBrZyA8LSAiVHhEYi5NbXVzY3VsdXMuVUNTQy5tbTEwLmtub3duR2VuZSIKICB0eF9hbm5vdCA8LSBsb2FkX3R4ZGJfYW5ub3RhdGlvbnMocGtnKQogIHRyYW5zY3JpcHRzIDwtIHR4X2Fubm90W1siVFgiXV0KICB0cmFuc2NyaXB0c1tbInR4Il1dIDwtIGdzdWIoeCA9IHRyYW5zY3JpcHRzW1siVFhOQU1FIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIlxcLlxcZCskIiwgcmVwbGFjZW1lbnQgPSAiIikKICBtbV9hbm5vdCA8LSBtZXJnZShnZW5lX2luZm8sIHRyYW5zY3JpcHRzLCBieS54ID0gImVuc2VtYmx0cmFucyIsIGJ5LnkgPSAidHgiKQogIHJvd25hbWVzKG1tX2Fubm90KSA8LSBtYWtlLm5hbWVzKG1tX2Fubm90W1siZW5zZW1ibCJdXSwgdW5pcXVlID0gVFJVRSkKfSBlbHNlIHsKICBtbV9hbm5vdCA8LSBtbV9hbm5vdFtbImFubm90YXRpb24iXV0KICBtbV9hbm5vdFtbInR4aWQiXV0gPC0gcGFzdGUwKG1tX2Fubm90W1siZW5zZW1ibF90cmFuc2NyaXB0X2lkIl1dLCAiLiIsIG1tX2Fubm90W1sidmVyc2lvbiJdXSkKICByb3duYW1lcyhtbV9hbm5vdCkgPC0gbWFrZS5uYW1lcyhtbV9hbm5vdFtbImVuc2VtYmxfZ2VuZV9pZCJdXSwgdW5pcXVlPVRSVUUpCiAgdHhfZ2VuZV9tYXAgPC0gbW1fYW5ub3RbLCBjKCJ0eGlkIiwgImVuc2VtYmxfZ2VuZV9pZCIpXQp9CmBgYAoKIyBIaXNhdDIgc3VtbWFyaXplZEV4cGVyaW1lbnRzCgpUaGUgcHJpbWFyeSBkaWZmZXJlbmNlIGJldHdlZW4gbXkgYmxvY2sgYW5kIFRoZXJlc2EncyBhcmU6CgoxLiAgSSBhbSBwdWxsaW5nIHRoZSBtZXRhZGF0YSBkaXJlY3RseSBmcm9tIHRoZQogICAgZ2F0aGVyX3ByZXByb2Nlc3NpbmdfbWV0YWRhdGEoKSBhYm92ZS4KMi4gIEkgYW0gdXNpbmcgdGhlIGNvbHVtbiAnc3ltbGluaycgd2hpY2ggaXMganVzdCBhIGNvcHkgb2YgdGhlCiAgICBleGlzdGluZyAnZmlsZScgY29sdW1uIHdpdGggYSBzbWFsbCBjaGFuZ2Ugc28gSSBjYW4gbG9hZCBpdCBmcm9tCiAgICBteSBkaXJlY3Rvcnkgd2l0aG91dCBoYXZpbmcgdG8gY29weSBldmVyeXRoaW5nLgozLiAgSSBhbSB1c2luZyB0aGUgZW5zZW1ibCBnZW5vbWUgcmVsZWFzZSAzOSwgdmVyc2lvbiAxMTIgYW5kIHNvCiAgICBwdWxsZWQgYSBzb21ld2hhdCBuZXdlciBjb3B5IG9mIHRoZSBhbm5vdGF0aW9uIGRhdGEuCjQuICBUaGUgb3JpZ2luYWwgaXMgbmFtZWQgJ3YxJywgZm9sbG93ZWQgYnkgJ3YyJyBhbmQgJ3YzJyBmb3IgdGhlCiAgICBvdGhlciB0d28gdHJlYXRtZW50cyBJIHBlcmZvcm1lZC4KCiMjIENvbG9yIGNob2ljZXMgYW5kIHJldXNlZCBwYXJhbWV0ZXJzCgpHaXZlbiB0aGF0IHdlIGFyZSBleGNsdWRpbmcgYSBidW5jaCBvZiB0aGUgb2xkZXIgc2FtcGxlcywgdGhlIHNldCBvZgpjb2xvcnMgSSBleHBlY3QgdG8gZmluZCBpcyBkaWZmZXJlbnQ7IHNvIEkgd2lsbCBtYWtlIGV4cGxpY2l0IGhlcmUgdGhlCnZhcmlvdXMgY29sb3JzIHVzZWQgdG8gZGVub3RlIGxvY2F0aW9uL2dlbm90eXBlL3RpbWUvZXRjLgoKQXByaWwgdHVybmVkIG1lIG9udG8gdGhpcyB3ZWJzaXRlICdwYWxldHRvbi5jb20nIGZvciB0aGlzIGtpbmQgb2YKc3R1ZmYgYW5kIEkgd2lsbCB0cnkgYW5kIHBpY2sgb3V0IHBhbGV0dGVzIHdoaWNoIGJhc2ljYWxseSBtYXRjaCB3aGF0CkkgYW0gZ2V0dGluZyB3aXRoIHRoZSBvcmlnaW5hbCBjb2xvcnMuCgpgYGB7cn0KY29sb3JfY2hvaWNlcyA8LSBsaXN0KAogICJhbGwiID0gbGlzdCgKICAgICJwMDhfaGV0X2RsZ24iID0gIiNFNzI5OEEiLAogICAgInAxNV9oZXRfZGxnbiIgPSAiI0U3Mjk4QSIsCiAgICAicDA4X2hldF9yZXRpbmEiID0gIiMyMzhCNDUiLAogICAgInAxNV9oZXRfcmV0aW5hIiA9ICIjMjM4QjQ1IiwKICAgICJwMDhfaGV0X3NjbiIgPSAiIzQyOTJDNiIsCiAgICAicDE1X2hldF9zY24iID0gIiM0MjkyQzYiLAogICAgInAwOF9rb19kbGduIiA9ICIjQzk5NEM3IiwKICAgICJwMTVfa29fZGxnbiIgPSAiI0M5OTRDNyIsCiAgICAicDA4X2tvX3JldGluYSIgPSAiIzc0YzQ3NiIsCiAgICAicDE1X2tvX3JldGluYSIgPSAiIzc0YzQ3NiIsCiAgICAicDA4X2tvX3NjbiIgPSAiIzlCQ0FFMSIsCiAgICAicDE1X2tvX3NjbiIgPSAiIzlCQ0FFMSIsCiAgICAicDA4X3d0X2RsZ24iID0gIiM5ODAwNDMiLAogICAgInAxNV93dF9kbGduIiA9ICIjOTgwMDQzIiwKICAgICJwMDhfd3RfcmV0aW5hIiA9ICIjMDA0MDA4IiwKICAgICJwMTVfd3RfcmV0aW5hIiA9ICIjMDA0MDA4IiwKICAgICJwMDhfd3Rfc2NuIiA9ICIjMDg1MTlDIiwKICAgICJwMTVfd3Rfc2NuIiA9ICIjMDg1MTlDIiwKICAgICJwNjBfd3RfZGxnbiIgPSAiIzMzMzMzMyIsCiAgICAicDYwX3d0X3JldGluYSIgPSAiIzIyMjIyMiIsCiAgICAicDYwX3d0X3NjbiIgPSAiIzExMTExMSIpLAogICJnZW5vX2xvYyIgPSBsaXN0KAogICAgImhldF9kbGduIiA9ICIjRTcyOThBIiwKICAgICJoZXRfcmV0aW5hIiA9ICIjMjM4QjQ1IiwKICAgICJoZXRfc2NuIiA9ICIjNDI5MkM2IiwKICAgICJrb19kbGduIiA9ICIjQzk5NEM3IiwKICAgICJrb19yZXRpbmEiID0gIiM3NGM0NzYiLAogICAgImtvX3NjbiIgPSAiIzlCQ0FFMSIsCiAgICAid3RfZGxnbiIgPSAiIzk4MDA0MyIsCiAgICAid3RfcmV0aW5hIiA9ICIjMDA0MDA4IiwKICAgICJ3dF9zY24iID0gIiMwODUxOUMiKSwKICAibG9jYXRpb24iID0gbGlzdCgKICAgICJyZXRpbmEiID0gIiMwMDQwMDgiLAogICAgImRsZ24iID0gIiM5ODAwNDMiLAogICAgInNjbiIgPSAiIzA4NTE5QyIpLAogICJnZW5vdHlwZSIgPSBsaXN0KAogICAgInd0IiA9ICIjNzRjNDc2IiwKICAgICJoZXQiID0gIiMyMzhCNDUiLAogICAgImtvIiA9ICIjMDA2RDJDIiksCiAgInRpbWUiID0gbGlzdCgKICAgICJwMDgiID0gIiM1RTEwNEIiLAogICAgInAxNSIgPSAiIzRFOTIzMSIpKQpsYWJlbF9jb2x1bW4gPC0gIm1naV9zeW1ib2wiICMjIFNldCB0aGUgY29sdW1uIHVzZWQgdG8gZXh0cmFjdCBnZW5lIHN5bWJvbHMgcmF0aGVyIHRoYW4gRU5TRy4uLi4uCmNvbG9ycyA8LSBjb2xvcl9jaG9pY2VzW1siZ2Vub19sb2MiXV0KdGltZV9jb2xvcnMgPC0gbGlzdCgKICAicDA4X2hldF9kbGduIiA9ICIjRTcyOThBIiwKICAicDE1X2hldF9kbGduIiA9ICIjOGExODUyIiwKICAicDA4X2hldF9yZXRpbmEiID0gIiMyMzhCNDUiLAogICJwMTVfaGV0X3JldGluYSIgPSAiIzE1NTMyOSIsCiAgInAwOF9oZXRfc2NuIiA9ICIjNDI5MkM2IiwKICAicDE1X2hldF9zY24iID0gIiMyNzU3NzYiLAogICJwMDhfa29fZGxnbiIgPSAiI0M5OTRDNyIsCiAgInAxNV9rb19kbGduIiA9ICIjNzg1ODc3IiwKICAicDA4X2tvX3JldGluYSIgPSAiIzc0QzQ3NiIsCiAgInAxNV9rb19yZXRpbmEiID0gIiM0NTc1NDYiLAogICJwMDhfa29fc2NuIiA9ICIjOUJDQUUxIiwKICAicDE1X2tvX3NjbiIgPSAiIzVkNzk4NyIpCmBgYAoKVGhlcmUgaXMgb25lIG5vdGV3b3J0aHkgc2FtcGxlOiBpcHJnY18xMDMsIGl0IHdhcyBlZmZlY3RpdmVseSByZXBsYWNlZAp3aGVuIEFwcmlsIHJlbmFtZWQgdGhlIHNhbXBsZXMgYW5kIHNvIGV4aXN0cyBpbiB0aGUgdjEgZGF0YSwgYnV0IG5vdAp2Mi92MzsgdGhleSBpbnN0ZWFkIGhhdmUgdGhlIG5ld2x5IG5hbWVkIHNhbXBsZXMgd2hpY2ggSSBjYWxsZWQKaXByZ2NfMTIzIHRvIGlwcmdjXzEzMC4gIEFzIGEgcmVzdWx0LCBJIGNvcGllZCB0aGUgYW5ub3RhdGlvbnMgZm9yCmlwcmdjXzEyMyB0byBteSBjb2x1bW4gc28gdGhhdCB0aGVyZSBpcyBubyBkaXNjcmVwZW5jeSBpbiB0ZXJtcyBvZgpnZW5vdHlwZS9sb2NhdGlvbi90aW1lLgoKIyMgVGhlIG9yaWdpbmFsIGNvdW50IHRhYmxlcwoKQXQgdGhlIG1vbWVudCBJIGhhdmUgbm90IGluY2x1ZGVkIHRoZSBvcmlnaW5hbCBjb3VudHMgaW4gdGhpcwpjb250YWluZXIgYmVjYXVzZSB3ZSBtYWRlIHNvbWUgY2hhbmdlcyB0byB0aGUgbWFwcGluZyBzdHJhdGVneSBhbmQKYWxzbyBmb3VuZCB0aGF0IGEgY291cGxlIHNhbXBsZXMgd2VyZSBtaXhlZCB1cCBpbiBzZXF1ZW5jaW5nOyBhcyBhCnJlc3VsdCBJIGRvY3VtZW50ZWQgYWxsIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSBzYW1wbGUgc2hlZXRzIGFuZApwcmVwcm9jZXNzaW5nIGRvY3VtZW50cyBhbmQgZXhjbHVkZWQgdGhlIG9yaWdpbmFsIGZpbGVzLgoKVGhpcyBpcyBhbHNvIHdoeSBzb21lIGNvbHVtbnMgaW4gdGhlIHNhbXBsZSBzaGVldCBoYXZlIHN1ZmZpeGVzIGxpa2UKJ2FkaCcgYW5kICdhdGInLCB0aG9zZSBkZW5vdGUgZnJvbSB3aG9tIHRoZSByZWxldmFudCBtZXRhZGF0YSBjb2x1bW5zCmNhbWUgZnJvbS4KCmBgYHtyLCBldmFsPUZBTFNFfQptbTM4X2hpc2F0X3YxIDwtIGNyZWF0ZV9zZShzYW1wbGVfc2hlZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbyA9IG1tX2Fubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbiA9ICJzeW1saW5rIikgJT4lCiAgc2V0X2NvbmRpdGlvbnMoZmFjdCA9ICJnZW5vX2xvY19hdGIiKSAlPiUKICBzZXRfYmF0Y2hlcyhmYWN0ID0gInRpbWVfYXRiIikgJT4lCiAgc2V0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1siZ2Vub19sb2MiXV0pCm1tMzhfaGlzYXRfdjEKYGBgCgojIyBSZWNvdW50ZWQgdGFibGVzIGFuZCB0aGUgZGVkdXBsaWNhdGVkIHJlc3VsdAoKSW4gdGhlIGZvbGxvd2luZyBJIG1ha2UgdHdvIG1vcmUgdmVyc2lvbnMgb2YgdGhlIGRhdGEsIG9uZSByZW1hcHBlZAp3aXRoIHRoZSBjaGFuZ2VzIHRvIHRoZSBzYW1wbGUgaWRlbnRpdGllcywgYW5kIG9uZSB3aXRoIGRlZHVwbGljYXRpb24KYXBwbGllZC4KCmBgYHtyfQptbTM4X2hpc2F0X3YyIDwtIGNyZWF0ZV9zZShzYW1wbGVfc2hlZXQsIGdlbmVfaW5mbyA9IG1tX2Fubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbiA9ICJoaXNhdF9jb3VudF90YWJsZSIpICU+JQogIHNldF9jb25kaXRpb25zKGZhY3QgPSAiZ2Vub19sb2NfYXRiIikgJT4lCiAgc2V0X2JhdGNoZXMoZmFjdCA9ICJ0aW1lX2F0YiIpICU+JQogIHNldF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbImdlbm9fbG9jIl1dKQptbTM4X2hpc2F0X3YyCm1tMzhfaGlzYXRfdjMgPC0gY3JlYXRlX3NlKHNhbXBsZV9zaGVldCwgZ2VuZV9pbmZvID0gbW1fYW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uID0gInVtaV9kZWR1cF9vdXRwdXRfY291bnQiKSAlPiUKICBzZXRfY29uZGl0aW9ucyhmYWN0ID0gImdlbm9fbG9jX2F0YiIpICU+JQogIHNldF9iYXRjaGVzKGZhY3QgPSAidGltZV9hdGIiKSAlPiUKICBzZXRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJnZW5vX2xvYyJdXSkKbW0zOF9oaXNhdF92MwoKYWxsX2ZhY3QgPC0gcGFzdGUwKGNvbERhdGEobW0zOF9oaXNhdF92MylbWyJ0aW1lX2F0YiJdXSwgIl8iLAogICAgICAgICAgICAgICAgICAgY29sRGF0YShtbTM4X2hpc2F0X3YzKVtbImdlbm9fbG9jX2F0YiJdXSkKY29sRGF0YShtbTM4X2hpc2F0X3YzKVtbInRpbWVfZ2Vub19sb2MiXV0gPC0gYWxsX2ZhY3QKYGBgCgpOb3RlIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIGJsb2NrLCBJIGNyZWF0ZWQgYSBmYWN0b3Igb3V0IG9mIHRoZQpjb21iaW5hdGlvbiBvZiB0aW1lLCBnZW5vdHlwZSwgYW5kIGxvY2F0aW9uLiAgSW4gYSBmdXR1cmUgaW52b2NhdGlvbgpvZiB0aGlzIG5vdGVib29rLCBJIHdpbGwgY2hhbmdlIHRoZSBwYWlyd2lzZSBjb21wYXJpc29ucyB0byBhZGQgZWFjaApvZiB0aGVzZSB0aHJlZSBmYWN0b3JzIHRvIHRoZSBzdGF0aXN0aWNhbCBtb2RlbCBpbnN0ZWFkIG9mIHRoaXMuICBUaGUKY29kZSB0byBkbyB0aGF0IGlzIG5vdCBfcXVpdGVfIHJlYWR5IHlldC4KCiMgTm9uLXplcm8gQ291bnRzIHBlciBTYW1wbGUKCkxldCdzIGxvb2sgYXQgdGhlIG51bWJlciBvZiBub24temVybyBnZW5lcyBmb3IgYWxsIHNhbXBsZXMgdmVyc3VzIHRoZQpjb3ZlcmFnZS4KCkFzIGFib3ZlLCB0aGlzIGRvZXMgbm90IGdldCBydW4gYmVjYXVzZSBJIGRpZCBub3QgY29weSB0aGUgY291bnQgdGFibGVzLgoKYGBge3IgZXZhbD1GQUxTRX0KdjFfbm9uemVybyA8LSBwbG90X25vbnplcm8obW0zOF9oaXNhdF92MSkKdjFfbm9uemVybwpgYGAKCkJ1dCB0aGVzZSBkbyEKCmBgYHtyfQpwbG90X2xlZ2VuZChtbTM4X2hpc2F0X3YyKQp2Ml9ub256ZXJvICA8LSBwbG90X25vbnplcm8obW0zOF9oaXNhdF92MiwgeV9pbnRlcmNlcHQgPSAwLjY1KQp2Ml9ub256ZXJvCnBwKGZpbGUgPSAiMDFkaWFnbm9zdGljX2ltYWdlcy9ub256ZXJvX3YyX3VuZmlsdGVyZWQucGRmIikKdjJfbm9uemVyb1tbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKCnYzX25vbnplcm8gIDwtIHBsb3Rfbm9uemVybyhtbTM4X2hpc2F0X3YzLCB5X2ludGVyY2VwdCA9IDAuNjUpCnYzX25vbnplcm8KcHAoZmlsZSA9ICIwMWRpYWdub3N0aWNfaW1hZ2VzL25vbnplcm9fdjNfdW5maWx0ZXJlZC5wZGYiKQp2M19ub256ZXJvW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpgYGAKCk9oIHdvdywgSSBkaWQgbm90IGV4cGVjdCBzdWNoIGEgcHJvZm91bmQgZWZmZWN0IG9uIHRoZSBjcG0gdmFsdWVzIG9uCnRoZSBtb3JlIHNhdHVyYXRlZCBsaWJyYXJpZXMuICBJIGd1ZXNzIGluIHJldHJvc3BlY3QgSSBzaG91bGQgaGF2ZT8KCkFsc28gbm90ZSB0byBzZWxmLCB3ZSBhcmUgbm90IG1lc3Npbmcgd2l0aCBwNjAuCgojIyBFeGNsdWRlIHA2MAoKYGBge3J9Cm1tMzhfaGlzYXRfdjIgPC0gc3Vic2V0X3NlKG1tMzhfaGlzYXRfdjIsIHN1YnNldCA9ICJ0aW1lX2F0YiE9J3A2MCciKQptbTM4X2hpc2F0X3YzIDwtIHN1YnNldF9zZShtbTM4X2hpc2F0X3YzLCBzdWJzZXQgPSAidGltZV9hdGIhPSdwNjAnIikKYGBgCgojIyBSZXBsb3QgdGhlIG5vbnplcm8gZ2VuZSBwbG90cwoKYGBge3J9CnYyX25vbnplcm9fZmlsdCA8LSBwbG90X25vbnplcm8obW0zOF9oaXNhdF92MiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKcHAoZmlsZSA9ICIwMWRpYWdub3N0aWNfaW1hZ2VzL25vbnplcm9fdjJfZmlsdC5wZGYiKQp2Ml9ub256ZXJvX2ZpbHRbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCgp2M19ub256ZXJvX2ZpbHQgPC0gcGxvdF9ub256ZXJvKG1tMzhfaGlzYXRfdjMsIHBsb3RfbGFiZWxzID0gRkFMU0UpCnBwKGZpbGUgPSAiMDFkaWFnbm9zdGljX2ltYWdlcy9ub256ZXJvX3YzX2ZpbHQucGRmIikKdjNfbm9uemVyb19maWx0W1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpgYGAKCk9uY2UgYWdhaW4sIEkgZG8gbm90IHdhbnQgdG8gbG9zZSB0aGUgcHJldmlvdXMgY29kZSwgc28gaGVyZSBpcyB0aGUgdjEgaW52b2NhdGlvbgoKYGBge3IsIGV2YWw9RkFMU0V9Cm1tMzhfaGlzYXRfdjEgPC0gc3Vic2V0X3NlKG1tMzhfaGlzYXRfdjEsIHN1YnNldCA9ICJ0aW1lX2F0YiE9J3A2MCciKQpgYGAKCiMgUXVpY2sgUENBLCB0aGVuIHJldHVybiB0byBUaGVyZXNhJ3MgZG9jdW1lbnQKCmBgYHtyfQp2Ml9ub3JtIDwtIG5vcm1hbGl6ZShtbTM4X2hpc2F0X3YyLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnYyX25vcm1fcGNhIDwtIHBsb3RfcGNhKHYyX25vcm0pCnYyX25vcm1fcGNhCnBwKGZpbGUgPSAiMDFkaWFnbm9zdGljX2ltYWdlcy92Ml9ub3JtX3BjYS5wZGYiKQp2Ml9ub3JtX3BjYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKCnYzX25vcm0gPC0gbm9ybWFsaXplKG1tMzhfaGlzYXRfdjMsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKdjNfbm9ybV9wY2EgPC0gcGxvdF9wY2EodjNfbm9ybSkKdjNfbm9ybV9wY2EKcHAoZmlsZSA9ICIwMWRpYWdub3N0aWNfaW1hZ2VzL3YzX25vcm1fcGNhLnBkZiIpCnYzX25vcm1fcGNhW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpgYGAKCkliaWQuCgpgYGB7ciwgZXZhbD1GQUxTRX0KdjFfbm9ybSA8LSBub3JtYWxpemUobW0zOF9oaXNhdF92MSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYSh2MV9ub3JtKQpgYGAKClRvIG15IGV5ZXMgaXQgbG9va3MgbGlrZSB3ZSBqdXN0IGhhdmUgMSB3ZWlyZG8gcDE1IHNhbXBsZT8KRGVkdXBsaWNhdGlvbiBoYWQgYSBtaW5vciBidXQgc2lnbmlmaWNhbnQgZWZmZWN0IG9uIHRoZSBQQ0EuCgpXaXRoIHRoYXQgaW4gbWluZCwgbGV0IHVzIGxvb2sgYXQgVGhlcmVzYSdzIFdPUktJTkcgZG9jdW1lbnQgYW5kIHNlZQp3aGF0IHdlIGNhbiByZWNhcGl0dWxhdGUuCgpUaGVyZXNhJ3MgZG9jdW1lbnQ6IFRoZSBUUkFQIHByb3RvY29sIGhhcyBzb21lIHZhcmlhYmlsaXR5IHdoaWNoIGlzCmludHJvZHVjZWQgYXQgZGlmZmVyZW50IHN0cGRmIGluY2x1ZGluZyBob21vZ2VuaXphdGlvbiwgYW50aWJvZHkKbGFiZWxpbmcsIHB1bGxkb3duIGVmZmljaWVuY3kvc3BlY2lmaWNpdHksIHNhbXBsZSBoYW5kbGluZyBkdXJpbmcKY2xlYW51cCBzdHBkZiwgYW5kIGxpYnJhcnkgcHJlcC9zZXF1ZW5jaW5nLiBXZSBrbm93IGZyb20gUmFzaG1pJ3MgUUMKdGhhdCB0aGVyZSBpcyB2YXJpYWJpbGl0eSBhdCB0aGUgbGV2ZWwgb2YgcHVsbGRvd24gZWZmaWNpZW5jeSAoYW1vdW50Cm9mIFJOQSBpc29sYXRlZCkuIFNoZSBpcyBkb2luZyBhIGdvb2Qgam9iIG9mIGtlZXBpbmcgdHJhY2sgb2YgdGhpcyBmb3IKYWxsIGhlciBzYW1wbGVzIGFuZCB3ZSBoYXZlIHZhbGlkYXRlZCBoZXIgUDggcmVzdWx0cyAoYXR0YWNoZWQKc3VwcGxlbWVudGFyeSBmaWd1cmUgM0QpLiBXZSBjb25zaXN0ZW50bHkgc2VlIGNsZWFyIGRpZmZlcmVuY2VzCmJldHdlZW4gY29udHJvbCBhbmQgY3JlIHNhbXBsZXMgZm9yIHRoZSByZXRpbmEsIHdoaWNoIG1ha2VzIHNlbnNlCmJlY2F1c2UgdGhlIGNlbGwgYm9kaWVzIGFyZSBpbiB0aGUgcmV0aW5hLiBUaGUgdGFyZ2V0IHRpc3N1ZQpkaWZmZXJlbmNlcyBhcmUgc21hbGxlciwgd2hpY2ggYWxzbyBtYWtlcyBzZW5zZSBmb3IgYXhvbi1UUkFQLiBXZQp0aGluayB0aGF0IHNvbWUgb2YgaGVyIFAxNSBzYW1wbGVzIGFyZSBub3QgZ29vZCBiYXNlZCBvbiBsb3cgYW1vdW50cwpvZiBpc29sYXRlZCBSTkEgZnJvbSBjcmUoKykgcmV0aW5hIHNhbXBsZXMuIFdlIHBsYW4gdG8gZHJvcCB0aGVzZQpzYW1wbGVzIGFuZCBub3QgcGVyZm9ybSBhZGRpdGlvbmFsIGlzb2xhdGlvbnMgYXQgdGhpcyB0aW1lCnBvaW50LiBCYXNlZCBvbiB0aGlzIChhbmQgdGhlIGdlbmVyYWwgbGFjayBvZiBsYXJnZSBkZXZlbG9wbWVudGFsCmVmZmVjdHMpLCB3ZSB3ZXJlIHBsYW5uaW5nIHRvIGZvY3VzIG9uIHByZXNlbnRpbmcgdGhlIFA4IGRhdGEgb25seSBpbgp0aGUgcGFwZXIuIEludGVyZXN0ZWQgdG8gaGVhciB5b3VyIHRob3VnaHRzIGluIHRoaXMuLi4KCk15IG5vdGVzOiBUaGVyZXNhJ3MgZmlyc3Qgb3BlcmF0aW9ucyBpbiB0aGlzIG5vdGVib29rIHdlcmUgdG86CgoxLiAgU2V0IGxvY2F0aW9uIGFzIGNvbmRpdGlvbiwgZ2Vub3R5cGUgYXMgYmF0Y2guCjIuICBQZXJmb3JtIFBDQSBiZWZvcmUvYWZ0ZXIgc3ZhLgoKYGBge3J9CnYzX2xvY19nZW5vIDwtIHNldF9jb25kaXRpb25zKG1tMzhfaGlzYXRfdjMsIGZhY3QgPSAibG9jYXRpb25fYXRiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzID0gY29sb3JfY2hvaWNlc1tbImxvY2F0aW9uIl1dKSAlPiUKICBzZXRfYmF0Y2hlcyhmYWN0ID0gImdlbm90eXBlX2F0YiIpCmBgYAoKIyMgVGhlIGFzc29jaWF0ZWQgUENBCgpBdCBkaWZmZXJlbnQgdGltZXMsIGl0IGFwcGVhcnMgdG8gbWUgdGhhdCBUaGVyZXNhIGhhcyBwcmVmZXJyZWQKc2xpZ2h0bHkgZGlmZmVyZW50IG5vcm1hbGl6YXRpb24gbWV0aG9kcywgcHJpbWFyaWx5IGEgbWl4IG9mIFRNTSBhbmQKcXVhbnRpbGUuCgpUaHVzIEkgd2lsbCB1c2UgZGlmZmVyZW50IHN1ZmZpeCBsZXR0ZXJzIHRvIGRlbm90ZSB2YXJpb3VzCm5vcm1hbGl6YXRpb25zIGVtcGxveWVkLCBhbmQgaWYgdGhleSB0dXJuIG91dCB0aGUgc2FtZSBJIHdpbGwgcGljayBvbmUgYXJiaXRyYXJpbHkuCgpgYGB7cn0KbG9jX2dlbm9fbnEgPC0gbm9ybWFsaXplKHYzX2xvY19nZW5vLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIG5vcm0gPSAicXVhbnQiKQpsb2NhdGlvbl9nZW5vdHlwZV9wY2EgPC0gcGxvdF9wY2EobG9jX2dlbm9fbnEpCnBwKGZpbGUgPSAiMDFkaWFnbm9zdGljX2ltYWdlcy9sb2NhdGlvbl9nZW5vdHlwZV9ub3JtX3BjYS5wZGYiKQpsb2NhdGlvbl9nZW5vdHlwZV9wY2FbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmxvY2F0aW9uX2dlbm90eXBlX3BjYQojIyBvaywgSSBoYXZlIHR3byB3ZWlyZG8gc2FtcGxlcyB3aGljaCBsb29rIHZlcnkgbXVjaCBsaWtlIHRoZXkgYXJlIGFjdHVhbGx5IGRsZ24uCiMjIFRoZXNlIGFyZSBzYW1wbGUgSURzIGlwcmdjXzY2IGFuZCBpcHJnY18xMzAKCmxvY19nZW5vX250IDwtIG5vcm1hbGl6ZSh2M19sb2NfZ2VubywgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInRtbSIpCmxvY2F0aW9uX2dlbm90eXBlX3RtbV9wY2EgPC0gcGxvdF9wY2EobG9jX2dlbm9fbnQpCnBwKGZpbGUgPSAiMDFkaWFnbm9zdGljX2ltYWdlcy9sb2NhdGlvbl9nZW5vdHlwZV90bW1fcGNhLnBkZiIpCmxvY2F0aW9uX2dlbm90eXBlX3RtbV9wY2FbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmxvY2F0aW9uX2dlbm90eXBlX3RtbV9wY2EKYGBgCgpBIHJhbmRvbSB0aG91Z2h0IGFib3V0IHRoZXNlIFBDQSBwbG90cywgaXQgbWlnaHQgYmUgd29ydGggd2hpbGUgdG8gYWRkCmEgcGFuZWwgYmVsb3cgdGhlIGxlZ2VuZCB3aXRoIHRoZSBzYW1wbGUgbnVtYmVycyBwZXIgY29uZGl0aW9uL2JhdGNoLgoKT2YgY291cnNlLCB0aGUgc2FtZSBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBpbiBhIG1vcmUgZnVuIGZhc2hpb24gdmlhCm15IHNpbGx5IHNhbmtleSBmdW5jdGlvbjoKCmBgYHtyfQpzYW1wbGVfc2Fua2V5IDwtIHBsb3RfbWV0YV9zYW5rZXkodjNfbG9jX2dlbm8sIGNvbG9yX2Nob2ljZXMgPSBjb2xvcl9jaG9pY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9ycyA9IGMoImdlbm90eXBlX2F0YiIsICJsb2NhdGlvbl9hdGIiLCAidGltZV9hdGIiKSkKcHAoZmlsZSA9ICIwMWRpYWdub3N0aWNfaW1hZ2VzL2Rlc2lnbl9zYW5rZXkucGRmIikKc2FtcGxlX3NhbmtleVtbImdncGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpzYW1wbGVfc2Fua2V5CmBgYAoKIyBBIFNob3J0IGNvbnZlcnNhdGlvbiB3aXRoIFJhc2htaQoKUmFzaG1pIGNhbWUgYnkgYW5kIHdlIGRpc2N1c3NlZCB0aGUgc2FtcGxlcyBhIGxpdHRsZS4gIFNoZSBzdWdnZXN0ZWQKdGhhdCBpcyBsaWtlbHkgdGhhdCB3ZSB3aWxsIG5lZWQgdG8gZXhjbHVkZSB0aGUgMjAyMjA1IHNhbXBsZXMsIHRoZXNlCm1heSBiZSBpZGVudGlmaWVkIGJ5IGEgZmV3IHdheXMsIG1vc3QgZWFzaWx5IEkgdGhpbmsgdmlhIHRoZQoncHJvamVjdF9haCcgY29sdW1uLCB0aGV5IGFyZSB0aGUgMDIxXzEgc2FtcGxlcy4KCk15IHNlbnNlIHdhcyB0aGF0IHNoZSBjb25jdXJyZWQgd2l0aCBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgdW1pCmRlZHVwbGljYXRpb24sIHNvIEkgd2lsbCBjb250aW51ZSB1c2luZyB0aGUgZGVkdXBsaWNhdGVkIHJlc3VsdHMKZXhjbHVzaXZlbHksIGF0IGxlYXN0IGZvciBub3cuCgojIE1lbGFub3BzaW4gU2FuaXR5IENoZWNrCgpPbmUgb2YgVGhlcmVzYSdzIGZpcnN0IGNoZWNrcyB3YXMgd2lzZWx5IGZvciBtZWxhbm9wc2luLiAgTGV0IHVzCnJlcGVhdCBhIHZlcnNpb24gb2YgdGhpczoKCkFuIGltcG9ydGFudCBub3RlOiBJbmRyYWplZXQgUGF0aWwgcmVtb3ZlZCB0aGUgZ3JvdXBlZHN0YXRzIGFuZCBpdHMKYXNzb2NpYXRlZCBwbG90dGluZyBsaWJyYXJ5IGZyb20gQ1JBTi9naXRodWIvZXRjLiAgSSBhbSBub3QgY2VydGFpbgp3aGF0IGhhcHBlbmVkLCBidXQgdGhhdCBuZWNlc3NpdGF0ZXMgYSBjaGFuZ2UgaW4gaG93IEkgcGxvdCB0aGlzLgoKYGBge3J9Cm9wbjRfZXhwcnMgPC0gZGF0YS5mcmFtZShjb21iaW5lZCA9IGNvbERhdGEobG9jX2dlbm9fbnQpW1siZ2Vub19sb2NfYXRiIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBjb2xEYXRhKGxvY19nZW5vX250KVtbImxvY2F0aW9uX2F0YiJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGdlbm90eXBlID0gY29sRGF0YShsb2NfZ2Vub19udClbWyJnZW5vdHlwZV9hdGIiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBvcG4gPSBhc3NheShsb2NfZ2Vub19udClbIkVOU01VU0cwMDAwMDAyMTc5OSIsIF0pCgojIyBncm91cGVkc3RhdHM6Omdyb3VwZWRfc3VtbWFyeShvcG40X2V4cHJzLCBsb2NhdGlvbiwgb3BuKQojIyBvcG40X2xvY2F0aW9uIDwtIGdnYmV0d2VlbnN0YXRzKGRhdGEgPSBvcG40X2V4cHJzLCB4ID0gbG9jYXRpb24sIHkgPSBvcG4pCiMjIHBwKGZpbGUgPSAiaW1hZ2VzL2dnYmV0d2Vlbl9sb2NhdGlvbi5wZGYiKQojIyBvcG40X2xvY2F0aW9uCiMjIHBsb3R0ZWQgPC0gZGV2Lm9mZigpCiMjIG9wbjRfbG9jYXRpb24KCiMjIG9wbjRfZ2Vub3R5cGUgPC0gZ2diZXR3ZWVuc3RhdHMoZGF0YSA9IG9wbjRfZXhwcnMsIHggPSBnZW5vdHlwZSwgeSA9IG9wbikKIyMgcHAoZmlsZSA9ICJpbWFnZXMvZ2diZXR3ZWVuX2xvY2F0aW9uLnBkZiIpCiMjIG9wbjRfZ2Vub3R5cGUKIyMgcGxvdHRlZCA8LSBkZXYub2ZmKCkKIyMgb3BuNF9nZW5vdHlwZQoKIyMgb3BuNF9jb21iaW5lZCA8LSBnZ2JldHdlZW5zdGF0cyhkYXRhID0gb3BuNF9leHBycywgeCA9IGNvbWJpbmVkLCB5ID0gb3BuKQojIyBwcChmaWxlID0gImltYWdlcy9nZ2JldHdlZW5fY29tYmluZWQucGRmIikKIyMgb3BuNF9jb21iaW5lZAojIyBwbG90dGVkIDwtIGRldi5vZmYoKQojIyBvcG40X2NvbWJpbmVkCmBgYAoKb2ssIHNvIEkgcGxvdHRlZCB0aGUgcXVlc3Rpb24gYSBiaXQgZGlmZmVyZW50bHksIGJ1dCBnb3QgdGhlIHNhbWUKYW5zd2VyLgoKSGVyZSBpcyB0aGUgdGV4dCBvZiBUaGVyZXNhJ3Mgbm90ZWJvb2sgZm9sbG93aW5nIHRoaXMgYW5hbHlzaXM6CgoiVWdoIG9oLCBsb29rcyBsaWtlIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSByZXRpbmEgS08gc2FtcGxlIHRoYXQgaGFzCnNvbWUgbWVsYW5vcHNpbiBleHByZXNzaW9uIGluIGl0LiBUdXJucyBvdXQgaXBSR0NfMDcgaXMgYSBiYWQgZWdnCndoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIGEgS08gYnV0IGhhcyBtZWxhbm9wc2luIGV4cHJlc3Npb24uIEl04oCZcwpmcmllbmRzIHdoaWNoIHdlcmUgcG9vbGVkIGZyb20gdGhlIHNhbWUgbWljZSBhcmUgaXByZ2NfMDYgYW5kCmlwcmdjXzA4LCBzbyB3ZSBuZWVkIHRvIGV4Y2x1ZGUgYWxsIHRoZXNlIHNhbXBsZXMuIgoKSSBhbSBhbHNvIHNlZWluZyBzb21lIGtub2Nrb3V0IGV4cHJlc3Npb24gd2l0aCBzb21lIGNhdmVhdHM6IEkgZG8gbm90CmhhdmUgdGhlIGFmZmVjdGVkIHNhbXBsZXMgaW4gbXkgZGF0YXNldCAoaXByZ2NfMDcpIGFuZCB0aGUgbGV2ZWxzIEkgYW0Kc2VlaW5nIGFyZSBxdWl0ZSBsb3cgLS0gSSB3aWxsIGxvb2sgaW4gSUdWIHRvIGRvdWJsZSBjaGVjaywgYnV0IEkKc3Ryb25nbHkgc3VzcGVjdCB0aGF0IHRoZXNlIGFyZSBzb21lIHBpZGRseSByZWFkcyBuZWFyIHRoZSBVVFJzLgoKT253YXJkIQoKIyBQQ0EgcGxvdHMKCiMjIFBDQSBvZiBhbGwgZ2VuZXMgYnkgbG9jYXRpb24KClRoZXJlc2EncyBmaXJzdCBwY2Egd2FzIG9mIGxvZzIgY3BtIHZhbHVlcy4gIEkgbWlnaHQgYWRkIHF1YW50aWxlL3RtbQp0byB0aGlzPwoKYGBge3J9CnYzX2xvY2F0aW9uIDwtIHNldF9jb25kaXRpb25zKG1tMzhfaGlzYXRfdjMsIGZhY3QgPSAibG9jYXRpb25fYXRiIikgJT4lCiAgc2V0X2JhdGNoZXMoZmFjdCA9ICJnZW5vdHlwZV9hdGIiKSAlPiUKICBzZXRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJsb2NhdGlvbiJdXSkKdjNfbG9jYXRpb25fbm9ybSA8LSBub3JtYWxpemUodjNfbG9jYXRpb24sIGZpbHRlciA9IFRSVUUsIG5vcm0gPSAicXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iKQp2M19sb2NhdGlvbl9wY2EgPC0gcGxvdF9wY2EodjNfbG9jYXRpb25fbm9ybSkKcHAoZmlsZSA9ICIwMWRpYWdub3N0aWNfaW1hZ2VzL3YzX2xvY2F0aW9uX25vcm1fcGNhLnBkZiIpCnYzX2xvY2F0aW9uX3BjYQpkZXYub2ZmKCkKdjNfbG9jYXRpb25fcGNhCmBgYAoKT25jZSBhZ2FpbiB3ZSBzZWUgdGhhdCBzYW1wbGVzIGlwcmdjXzY2IGFuZCBpcHJnY18xMzAgYXJlIGxpa2VseQphY3R1YWxseSBETEdOIGFuZCBub3QgU0NOLiAgSSBhbSB0aGVyZWZvcmUgZ29pbmcgdG8gYWRkIGEgY29sdW1uIHRvCnRoZSBzYW1wbGUgc2hlZXQgbm90aW5nIHRoaXMsIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBleHByZXNzaW9uc2V0LgoKSSB3aWxsIHRodXMgcmVwbG90IHRoZSBkYXRhIGFmdGVyIHJlbW92aW5nIHRob3NlIHR3by4gIElmIHdlIHdhbnQgdG8Kc2VlIHdoYXQgaXQgbG9va3MgbGlrZSB3aXRoIHRoZSByZS1hdHRyaWJ1dGVkIGxvY2F0aW9ucywgd2UgY2FuIGRvIHNvLgoKVGhlcmVzYSBoYXMgYSBuaWNlIGNoYW5nZSB0byB0aGUgUENBIHBsb3R0ZXIgaW4gd2hpY2ggc2hlIHNldHMgdGhlCmFscGhhIGNoYW5uZWwgYXMgYW4gYWRkaXRpb25hbCB2aXN1YWwgcXVldWUgZm9yIGEgbWV0YWRhdGEgZmFjdG9yLi4uCgpgYGB7cn0KbW0zOF9oaXNhdF92MyA8LSBzdWJzZXRfc2UobW0zOF9oaXNhdF92Mywgc3Vic2V0PSJzYW1wbGVpZCE9J2lwcmdjXzEzMCciKSAlPiUKICBzdWJzZXRfc2Uoc3Vic2V0PSJzYW1wbGVpZCE9J2lwcmdjXzY2JyIpCnYzX2xvY2F0aW9uIDwtIHNldF9jb25kaXRpb25zKG1tMzhfaGlzYXRfdjMsIGZhY3QgPSAibG9jYXRpb25fYXRiIikgJT4lCiAgc2V0X2JhdGNoZXMoZmFjdCA9ICJnZW5vdHlwZV9hdGIiKSAlPiUKICBzZXRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJsb2NhdGlvbiJdXSkKCnYzX2xvY2F0aW9uX25vcm0gPC0gbm9ybWFsaXplKHYzX2xvY2F0aW9uLCBmaWx0ZXIgPSBUUlVFLCBub3JtID0gInF1YW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIikKZmlsdGVyZWRfbG9jYXRpb25fcGNhIDwtIHBsb3RfcGNhKHYzX2xvY2F0aW9uX25vcm0pCnBwKGZpbGUgPSAiMDJmaWx0ZXJlZF9pbWFnZXMvZmlsdGVyZWRfbG9jYXRpb25fcGNhLnBkZiIpCmZpbHRlcmVkX2xvY2F0aW9uX3BjYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKZmlsdGVyZWRfbG9jYXRpb25fcGNhCgpyZW1vdmVkX3NhbmtleSA8LSBwbG90X21ldGFfc2Fua2V5KHYzX2xvY2F0aW9uLCBjb2xvcl9jaG9pY2VzID0gY29sb3JfY2hvaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JzID0gYygiZ2Vub3R5cGVfYXRiIiwgImxvY2F0aW9uX2F0YiIsICJ0aW1lX2F0YiIpKQpwcChmaWxlID0gIjAyZmlsdGVyZWRfaW1hZ2VzL2ZpbHRlcmVkX3NhbmtleS5wZGYiKQpyZW1vdmVkX3NhbmtleVtbImdncGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpyZW1vdmVkX3NhbmtleQpgYGAKCkhlcmUgaXMgVGhlcmVzYSdzIHRleHQsIHJlY2FsbCBvbmNlIGFnYWluIHRoYXQgSSBkbyBub3QgaGF2ZSBzb21lIG9mCnRoZXNlIG9sZGVyIHNhbXBsZXMgKGlwcmdjXzYyKToKClBDMSB2cyBQQzIgaWRlbnRpZmllcyByZXRpbmEgdnMgYXhvbiBpcyBzdGlsbCB0aGUgbWFpbiBjb21wb25lbnQgb2YKdmFyaWF0aW9uLiBXZSBkbyBzZWUgdGhvdWdoIHRoYXQgaW4gdGhlIFBDMiBkaXJlY3Rpb24sIHdlIHNlZSB3aXRoIHRoZQpuZXcgc2FtcGxlcyBhZGRlZCwgd2UgZG9u4oCZdCBzZWUgc2VwYXJhdGlvbiBiYXNlZCBvbiBheG9uYWwgdGFyZ2V0cwooZExHTiB2cyBTQ04pLiBJbiB0aGUgUEMxIHZzIFBDMyBwbG90LCB3ZSBzZWUgdGhhdCBpdOKAmXMgUEMzIHdoZXJlIHdlCnN0YXJ0IHRvIHNlZSB2YXJpYXRpb24gY29ycmVsYXRlZCB3aXRoIGF4b25hbCBjb21wYXJ0bWVudC4gTGV04oCZcyBsb29rCmF0IFBDMSB2cyBQQzIgY29sb3JlZCBieSBiYXRjaCAod2hlbiB0aGV5IHdlcmUgcHJvY2Vzc2VkL3NlcXVlbmNlZCkgdG8Kc2VlIGlmIHRoYXQgaXMgd2hhdCBpcyBjb250cmlidXRpbmcgc28gbXVjaCB2YXJpYXRpb24gaW4gUEMyLgoKU2lkZSBub3RlOiBpcFJHQyA2MiBzZWVtcyBsaWtlIGFuIG9kZCBiYWxsLiBUaGlzIHNlZW1zIHRvIG1lIGxpa2UgaXQKc2hvdWxkIGhhdmUgYmVlbiBhIGRMR04gUDA4IHNhbXBsZS4gSXMgdGhlcmUgYW55IHBvc3NpYmlsaXR5IHRoaXMgZ290Cm1pc2xhYmVsZWQgZWFybHkgb24/IEkgd2VudCBiYWNrIGFuZCBkb3VibGUgY2hlY2tlZCB0byBzZWUgaWYgYWxsIG15CnByb2Nlc3NpbmcgaXMgY29ycmVjdCBhbmQgaXQgaW5kZWVkIHdhcyBsYWJlbGVkIGFuIFNDTiBQMTUgZnJvbSB0aGUKdGltZSBJIGdvdCB0aGUgc2FtcGxlcywgYW5kIGl0IGlzIGluZGVlZC4KCiMgREUKCkkgbm93IHN3aXRjaGVkIHRvIFRoZXJlc2EncyBkb2N1bWVudCAnV09SS0lOR19heG9uVFJBUC4uLicgYW5kIHdpbGwKc3RhcnQgcHVsbGluZyBzZWN0aW9ucyBmcm9tIGl0LiAgSSBhbSByZWFzb25hYmx5IGNlcnRhaW4gSSBoYXZlCnJlYXNvbmFibHkgc2ltaWxhciBzYW1wbGUgZGlzdHJpYnV0aW9ucywgc28gSSBwcmVzdW1lIEkgY2FuIGludm9rZQpzaW1pbGFyL2lkZW50aWNhbCBjYWxscyBmb3IgREVTZXEgYW5kIGZyaWVuZHMuCgojIyBwOCByZXRpbmFzCgpJbiB0aGUgYmxvY2sgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBERSBhbmFseXNlcywgVGhlcmVzYSBjcmVhdGVkIGEKc3Vic2V0IGV4cHJlc3Npb25zZXQgb2Ygb25seSBwMDggcmV0aW5hcy4gIFRodXMgdGhpcyBpbml0aWFsIERFIEkKYXNzdW1lIHdpbGwgYmUgdXNlZCB0byBzdWJ0cmFjdCBmb3IgdGhlIFNDTi9ETEdOIGFuYWx5c2VzIHRoYXQgZm9sbG93LgooSSBndWVzcyBJIGNvdWxkIHJlYWQgYWhlYWQgYW5kIGZpbmQgb3V0LCBidXQgbm8hIEkgd2FudCB0byBiZSBhCmJsYW5rIHNsYXRlKQoKVGhlcmVzYSdzIHByaW1hcnkgd29ya2Zsb3cgbWFrZXMgaGVhdnkgdXNlIG9mIERFU2VxMgooQGxvdmVNb2RlcmF0ZWRFc3RpbWF0aW9uRm9sZDIwMTQpIGFuZCBzdmEKKEBsZWVrU1ZBUGFja2FnZVJlbW92aW5nMjAxMikuICBJbiBzb21lKG1vc3Q/KSBvZiBUaGVyZXNhJ3MKaW52b2NhdGlvbnMgb2YgdGhlIGFsbF9wYWlyd2lzZSgpIGZ1bmN0aW9uLCBzaGUgZXhjbHVkZXMgdGhlIG90aGVyCm1ldGhvZHMgdGhhdCBpdCBwZXJmb3Jtcy4gIEluIHRoaXMgd29ya2Jvb2ssIEkgbGVmdCB0aG9zZSBtZXRob2RzIG9uLAp0aHVzIHdlIGNhbiBldmFsdWF0ZSB0aGUgcmVsYXRpdmUgcGVyZm9ybWFuY2UgREVTZXEyIHZzLiBzb21lIChhbGw/IEkKbWF5IGhhdmUgZGlzYWJsZWQgRUJTZXEvZHJlYW0gYmVjYXVzZSB0aGV5IHdlcmUgdGFraW5nIHRvbyBsb25nKQpvZiB0aGUgZm9sbG93aW5nOgoKKiBsaW1tYTogKEByaXRjaGllTGltbWFQb3dlcnNEaWZmZXJlbnRpYWwyMDE1KSAoYW1vbmcgb3RoZXIKICByZWZlcmVuY2VzKSBvcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIG1pY3JvYXJyYXlzLgoqIEVkZ2VSOiAoQHJvYmluc29uRWRnZVJCaW9jb25kdWN0b3JQYWNrYWdlMjAxMCksIHdoaWNoIHNoYXJlcyBtYW55CiAgYXNzdW1wdGlvbnMgd2l0aCBERVNlcTIuCiogRUJTZXE6IChAbGVuZ0VCU2VxRW1waXJpY2FsQmF5ZXMyMDEzKSwgYmVjYXVzZSBJIGhhdmUgYSBzb2Z0IHNwb3QKICBmb3IgYW55IEJheWVzaWFuIG1ldGhvZC4KKiBOb2lzZXE6IChAdGFyYXpvbmFOT0lzZXFSTkFzZXFEaWZmZXJlbnRpYWwyMDExKSwgd2hpY2ggc2Vla3MgdG8KICBkaXJlY3RseSBtb2RlbCB2YXJpYW5jZSBpbiBhbiBSTkFTZXEgZGF0YXNldCBhbmQgdXNlIHRoYXQgdG8gaW1wcm92ZQogIHRoZSBzZW5zaXRpdml0eSBvZiB0aGUgcmVzdWx0LCBtdWNoIGxpa2U6CiogRHJlYW06IChAaG9mZm1hbkRyZWFtUG93ZXJmdWxEaWZmZXJlbnRpYWwyMDIwKSwgd3JpdHRlbiBieSB0aGUgc2FtZQogIGF1dGhvcnMgKGFuZCB1c2VzIHZlcnkgc2ltaWxhciBsb2dpYykgYXMgb25lIG9mIG15IGZhdm9yaXRlIHRvb2xzLAogIHZhcmlhbmNlUGFydGl0aW9uKEBob2ZmbWFuVmFyaWFuY2VQYXJ0aXRpb25JbnRlcnByZXRpbmdEcml2ZXJzMjAxNikuCgpgYGB7cn0KbW0zOF9wOF9yZXRpbmEgPC0gc3Vic2V0X3NlKG1tMzhfaGlzYXRfdjMsIHN1YnNldCA9ICJ0aW1lX2F0Yj09J3AwOCcgJiBsb2NhdGlvbl9hdGI9PSdyZXRpbmEnIikKbW1fbm9ybWFsX3A4X3JldF9kZSA8LSBhbGxfcGFpcndpc2UobW0zOF9wOF9yZXRpbmEsIG1vZGVsX3N2cyA9ICJzdmFzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mc3RyaW5nID0gIn4gMCArIGNvbmRpdGlvbiIsIGZpbHRlciA9IFRSVUUpCm1tX25vcm1hbF9wOF9yZXRfZGUKYGBgCgpUaGVyZSBzZWVtcyB0byBiZSBhIGRpc2NyZXBlbmN5IHdpdGggcHJldmlvdXMgaXRlcmF0aW9ucyBvZiB0aGlzLgpMZXQgdXMgc2ltcGxpZnkgdG8ganVzdCBkb2luZyBkZXNlcSBhbmQgZmluZCB3aGF0IGlzIGNhdXNpbmcgaXQuCkluIG15IHByZXZpb3VzIGl0ZXJhdGlvbiwgSSBnb3QgMzYzMiBnZW5lcyBpbiB0aGUgdW5pcXVlKGMoKSkgb3IgaGV0K2tvLgoKYGBge3J9CmRlc2VxX29ubHkgPC0gZGVzZXFfcGFpcndpc2UobW0zOF9wOF9yZXRpbmEsIG1vZGVsX3N2cyA9ICJzdmFzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZzdHJpbmcgPSBkZWZhdWx0X2ZzdHJpbmcsIGZpbHRlciA9IFRSVUUpCmRlc2VxX2hldGtlZXBlcl9nZW5lcyA8LSBkZXNlcV9vbmx5JGFsbF90YWJsZXMkd3RfcmV0aW5hX3ZzX2hldF9yZXRpbmEgJT4lCiAgZmlsdGVyKGxvZ0ZDIDw9IC0wLjI1ICYgYWRqLlAuVmFsIDw9IDAuMDUpCmRlc2VxX2tva2VlcGVyX2dlbmVzIDwtIGRlc2VxX29ubHkkYWxsX3RhYmxlcyR3dF9yZXRpbmFfdnNfa29fcmV0aW5hICU+JQogIGZpbHRlcihsb2dGQyA8PSAtMC4yNSAmIGFkai5QLlZhbCA8PSAwLjA1KQpkZXNlcV9rZWVwZXJnZW5lcyA8LSB1bmlxdWUoYyhyb3duYW1lcyhkZXNlcV9oZXRrZWVwZXJfZ2VuZXMpLAogICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhkZXNlcV9rb2tlZXBlcl9nZW5lcykpKQpsZW5ndGgoZGVzZXFfa2VlcGVyZ2VuZXMpCgpkZXNlcV9wYWlyX2hldGtlZXBlcl9nZW5lcyA8LSBtbV9ub3JtYWxfcDhfcmV0X2RlJGRlc2VxJGFsbF90YWJsZXMkd3RfcmV0aW5hX3ZzX2hldF9yZXRpbmEgJT4lCiAgZmlsdGVyKGxvZ0ZDIDw9IC0wLjI1ICYgYWRqLlAuVmFsIDw9IDAuMDUpCmRlc2VxX3BhaXJfa29rZWVwZXJfZ2VuZXMgPC0gbW1fbm9ybWFsX3A4X3JldF9kZSRkZXNlcSRhbGxfdGFibGVzJHd0X3JldGluYV92c19rb19yZXRpbmEgJT4lCiAgZmlsdGVyKGxvZ0ZDIDw9IC0wLjI1ICYgYWRqLlAuVmFsIDw9IDAuMDUpCmRlc2VxX3BhaXJfa2VlcGVyZ2VuZXMgPC0gdW5pcXVlKGMocm93bmFtZXMoZGVzZXFfcGFpcl9oZXRrZWVwZXJfZ2VuZXMpLAogICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhkZXNlcV9wYWlyX2tva2VlcGVyX2dlbmVzKSkpCmxlbmd0aChkZXNlcV9wYWlyX2tlZXBlcmdlbmVzKQpgYGAKClRoZSBmb2xsb3dpbmcgaW52b2NhdGlvbiBwZXJmb3JtZWQgYnkgVGhlcmVzYSBmaWx0ZXJzIHRoZSB3dC9oZXQKY29tcGFyaXNvbiBmb3Igb25seSB0aG9zZSBnZW5lcyB3aGljaCBpbmNyZWFzZWQgYnkgYXQgbGVhc3QgMC4yNSBsb2dGQwp3aXRoIGEgc2lnbmlmaWNhbnQgYWRqdXN0ZWQgcC12YWx1ZS4gIEkgYXNzdW1lIHRoYXQgdGhpcyBpcyB0byB1c2UgdGhlCnd0IHNhbXBsZXMgYXMgYSB0cmFuc2xhdGlvbmFsIGNvbnRyb2wgZm9yIHRoZSBrZXQva28gY29tcGFyaXNvbnM7IEkgYW0KdGhlcmVmb3JlIHRoaW5raW5nIHRoYXQgZm9yIG15IHB1cnBvc2VzLCBJIHdpbGwgdGhlcmVmb3JlIHNlcGFyYXRlIHRoZQpjb250cmFzdHMgZnJvbSBhbGxfcGFpcndpc2UgZG8gdGhpcyBpbiBhIHN0ZXB3aXNlIGZhc2hpb24uLi4KClRoZSBibG9jayBvZiBjb2RlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBUaGVyZXNhJ3MgYWxsX3BhaXJ3aXNlKCkKaW52b2NhdGlvbiBpcyBhIGxpdHRsZSBjb25mdXNpbmcgZm9yIG1lIGFuZCB3YXJyYW50cyBzb21lIGV4cGxhbmF0aW9uCmJ5IG1lIHRvIG1lIGluIHRoZSBob3BlcyB0aGF0IEkgZG8gbm90IG1pc3VuZGVyc3RhbmQgd2hhdCBpcyBoYXBwZW5pbmcKYW5kIHRoZSBnb2FscyB0aGVyZWluLgoKSSB0aGluayBJIGNhbiBzYWZlbHkgYXNzdW1lIHRoYXQgdGhlIGdvYWwgaGVyZSBpcyB0byBwdWxsIG91dCB0aGUgSURzCndoaWNoIGluY3JlYXNlZCBpbiBoZXQgd2l0aCByZXNwZWN0IHRvIHdpbGQgdHlwZTsgZXZlbiBpZiBieSBhIHNtYWxsCm1hcmdpbiwgYXMgbG9uZyBhcyBpdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHZpcyBhIHZpcyB0aGUKYWRqdXN0ZWQgcC12YWx1ZS4KCkkgYW0gZ29pbmcgdG8gcGVyZm9ybSB3aGF0IEkgdGhpbmsgaXMgdGhlIHNhbWUgdGhpbmcgaW4gYSBzbGlnaHRseQpkaWZmZXJlbnQgZmFzaGlvbiBzbyB0aGF0IEkgY2FuIHNoYXJlIGEgY29weSBvZiB0aGUgcmVzdWx0cyB3aXRoCndob21ldmVyIGlzIGludGVyZXN0ZWQuICBJIHdpbGwgYWxzbyByZXBlYXQgVGhlcmVzYSdzIGludm9jYXRpb24gYW5kCnByb3ZlIHRvIG15c2VsZiB0aGF0IEkgdW5kZXJzdG9vZCBhbmQgZ290IHRoZSBzYW1lIGFuc3dlci4KCmBgYHtyfQp3dF9oZXRfa2VlcGVyIDwtIGxpc3QoImhldF92c193dCIgPSBjKCJoZXRfcmV0aW5hIiwgInd0X3JldGluYSIpKQpoZXRfd3RfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgbW1fbm9ybWFsX3A4X3JldF9kZSwga2VlcGVycyA9IHd0X2hldF9rZWVwZXIsIGxhYmVsX2NvbHVtbiA9IGxhYmVsX2NvbHVtbiwKICBleGNlbCA9ICIwM3RoZXJlc2FfY29tcGFyaXNvbl9leGNlbC9oZXRfcmV0aW5hX2NvbnRyb2wueGxzeCIpCndhbnRlZF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBoZXRfd3RfdGFibGUsIGxmYyA9IDAuMjUsIGFjY29yZGluZ190byA9ICJkZXNlcSIsCiAgZXhjZWwgPSAiMDN0aGVyZXNhX2NvbXBhcmlzb25fZXhjZWwvaGV0X3JldGluYV9jb250cm9sLXNpZy54bHN4IikKd2FudGVkX2hldF9pbmNyZWFzZWQgPC0gd2FudGVkX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1siaGV0X3ZzX3d0Il1dCmluY3JlYXNlZF9oZXRfZ2VuZXMgPC0gcm93bmFtZXMod2FudGVkX2hldF9pbmNyZWFzZWQpCmBgYAoKSGVyZSBhcmUgVGhlcmVzYSdzIG5leHQgbGluZXM6CgpgYGB7cn0KbW1fZGVfbm9ybWFsX3A4X3JldCA8LSBtbV9ub3JtYWxfcDhfcmV0X2RlCmhldGtlZXBlcl9nZW5lcyA8LSBtbV9kZV9ub3JtYWxfcDhfcmV0JGRlc2VxJGFsbF90YWJsZXMkd3RfcmV0aW5hX3ZzX2hldF9yZXRpbmEgJT4lCiAgZmlsdGVyKGxvZ0ZDIDw9IC0wLjI1ICYgYWRqLlAuVmFsIDw9IDAuMDUpCmtva2VlcGVyX2dlbmVzIDwtIG1tX2RlX25vcm1hbF9wOF9yZXQkZGVzZXEkYWxsX3RhYmxlcyR3dF9yZXRpbmFfdnNfa29fcmV0aW5hICU+JQogIGZpbHRlcihsb2dGQyA8PSAtMC4yNSAmIGFkai5QLlZhbCA8PSAwLjA1KQprZWVwZXJnZW5lcyA8LSB1bmlxdWUoYyhyb3duYW1lcyhoZXRrZWVwZXJfZ2VuZXMpLAogICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhrb2tlZXBlcl9nZW5lcykpKQojIyBXZSBrbm93IGEgcHJpb3JpIHRoYXQgT3BuNCBpcyBFTlNNVVNHMDAwMDAwMjE3OTkKIyMgSSBkbyBub3QgZXhwZWN0IHRvIHNlZSBpdCBpbiB0aGlzIHNldCwgaXQgc2hvdWxkIGJlIGhpZ2hlciBpbiB3dAojIyByZXRpbmEgdnMga28gcmV0aW5hIGJ5IGEgc2lnbmlmaWNhbnQgbWFyZ2luLgoiRU5TTVVTRzAwMDAwMDIxNzk5IiAlaW4lIGtlZXBlcmdlbmVzCiMjIE9vb29oaGggYnV0IGl0IF9pc18gaGlnaGVyIGluIGhldCB2cy4gd3QsIGFzIHdlIHNhdyBpbgojIyB0aGUgdmlvbGluIHBsb3QgZWFybGllci4KYGBgCgpJIHRoaW5rIFJhc2htaSBtYWRlIGEgY29tcGVsbGluZyBwb2ludCB3aGljaCBpbGx1c3RyYXRlcyB3aHkgd2UgbGlrZWx5CnNob3VsZCBleHBlY3QgdGhlIGV4cHJlc3Npb24gb2YgT3BuNCB0byBzaWduaWZpY2FudGx5IGhpZ2hlciBpbiB0aGUKaGV0ZXJvenlnb3RlcyB2cyB3aWxkLXR5cGU6CgoxLiAgUmVjYWxsIHRoYXQgdGhlIGFzc2F5IGlzIHVzaW5nIHRoZSBpbW11bm9wdXJpZmljYXRpb24gdG8gZXh0cmFjdAogICAgdGhlIFJOQXMuCjIuICBUaGUgd3Qgc2FtcGxlcyBkbyBub3QgaGF2ZSB0aGUgY3JlIHJlY29tYmluYXNlIGFuZCB0aGVyZWZvcmUgbm8gSEEKICAgIGFuZCB0aGVyZWZvcmUgZXZlcnl0aGluZyB3ZSBvYnNlcnZlIGlzIGR1ZSB0byBub24tc3BlY2lmaWMKICAgIGJpbmRpbmcuCjMuICBUaGUgc2V0IG9mIGdlbmVzIG9ic2VydmVkIGR1ZSB0byBub24tc3BlY2lmaWMgYmluZGluZyBpcyBkaWZmZXJlbnQKICAgIHRoYW4gaGV0L2tvIChwcmVzdW1hYmx5IGEgbGFyZ2VyIG51bWJlciBvZiByZWxhdGl2ZWx5IHNtYWxsCiAgICB2YWx1ZXMpLCB0aGVyZWZvcmUgdGhlIGRpdmlzb3IgcGVyZm9ybWVkIGluIHRoZSBjcG0gaXMgbGlrZWx5CiAgICByZWxhdGl2bHkgbGFyZ2UgcmVzdWx0aW5nIGluIG5vcm1hbGl6ZWQgdmFsdWVzIGdldHRpbmcgc2hpZnRlZAogICAgZG93biB0byBzb21lIGRlZ3JlZS4KNC4gIE9uIHRoZSBvdGhlciBoYW5kLCB0aGUgc2V0IG9mIGdlbmVzIG9ic2VydmVkIGluIGhldC9rbyBhcmUgbW9yZQogICAgbGlrZWx5IHRvIGJlIG9ubHkgdGhlIHNwZWNpZmljIGJpbmRlcnMgYW5kIHRoZXJlZm9yZSBzbWFsbGVyIChJCiAgICBjYW4gdGVzdCB0aGlzKSByZXN1bHRpbmcgaW4gYSBzbWFsbGVyIGRpdmlzb3IgYW5kIHNsaWdodCBzaGlmdGluZwogICAgdXAgaW4gdGhlIGNwbSB2YWx1ZXMuCgpUaGlzIG1ha2VzIG1lIHdvbmRlciBpZiBhbnkgbm9ybWFsaXphdGlvbiBtZXRob2RzIGV4aXN0IHdoaWNoIGRvCnNvbWV0aGluZyBsaWtlIG11bHRpcGx5IHRoZSB2YWx1ZXMgYnkgc29tZSB2YWx1ZSByZWxhdGVkIHRvIHRoZQpwcm9wb3J0aW9uIG9mIG9ic2VydmVkIGdlbmVzOyBhbmQvb3IgaWYgdGhpcyBpcyBhIGdvb2QvYmFkL2luZGlmZmVyZW50CmlkZWEuCgpBbHNvLCBqdXN0IGEgbm90ZSBmb3IgbWUgdG8gcmVtZW1iZXI6IFJQTDIyLCBub3QgUlBTMjIsIGZvciBzb21lCnJlYXNvbiBJIGtlZXAgdGhpbmtpbmcgdGhlIHNtYWxsIHN1YnVuaXQuCgojIyBQcm92ZSBJIHVuZGVyc3Rvb2QKCmBgYHtyfQpoZXRrZWVwZXJfZ2VuZXMgPC0gbW1fbm9ybWFsX3A4X3JldF9kZSRkZXNlcSRhbGxfdGFibGVzJHd0X3JldGluYV92c19oZXRfcmV0aW5hICU+JQogIGZpbHRlcihsb2dGQyA8PSAtMC4yNSAmIGFkai5QLlZhbCA8PSAwLjA1KQp0ZXN0dGhhdDo6ZXhwZWN0X3RydWUobnJvdyhoZXRrZWVwZXJfZ2VuZXMpID09IGxlbmd0aChpbmNyZWFzZWRfaGV0X2dlbmVzKSkKdGFhX2tlZXBlcnMgPC0gc29ydChyb3duYW1lcyhoZXRrZWVwZXJfZ2VuZXMpKQphdGJfa2VlcGVycyA8LSBzb3J0KGluY3JlYXNlZF9oZXRfZ2VuZXMpCnRlc3R0aGF0OjpleHBlY3RfZXF1YWwodGFhX2tlZXBlcnMsIGF0Yl9rZWVwZXJzKQpgYGAKCllheSEgSSBjYW4gcmVhZCEgIE5vdyBsZXQgdXMgcmVwZWF0IGZvciB0aGUgS08gdnMgd3QKCmBgYHtyfQp3dF9rb19rZWVwZXIgPC0gbGlzdCgia29fdnNfd3QiID0gYygia29fcmV0aW5hIiwgInd0X3JldGluYSIpKQprb193dF90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICBtbV9ub3JtYWxfcDhfcmV0X2RlLCBrZWVwZXJzID0gd3Rfa29fa2VlcGVyLCBsYWJlbF9jb2x1bW4gPSBsYWJlbF9jb2x1bW4sCiAgZXhjZWwgPSAiMDN0aGVyZXNhX2NvbXBhcmlzb25fZXhjZWwva29fcmV0aW5hX2NvbnRyb2wueGxzeCIpCndhbnRlZF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBrb193dF90YWJsZSwgbGZjID0gMC4yNSwgYWNjb3JkaW5nX3RvID0gImRlc2VxIiwKICBleGNlbCA9ICIwM3RoZXJlc2FfY29tcGFyaXNvbl9leGNlbC9rb19yZXRpbmFfY29udHJvbC1zaWcueGxzeCIpCgp3YW50ZWRfa29faW5jcmVhc2VkIDwtIHdhbnRlZF9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbImtvX3ZzX3d0Il1dCmluY3JlYXNlZF9rb19nZW5lcyA8LSByb3duYW1lcyh3YW50ZWRfa29faW5jcmVhc2VkKQpgYGAKClRoZSBuZXh0IHRoaW5nIHBlcmZvcm1lZCBpbiBUaGVyZXNhJ3MgZG9jdW1lbnQgaXMgYSB1bmlxdWUoY29uY2F0ZW5hdGlvbiBvZgp0aGVzZSB0d28gZ2VuZSBncm91cHMpLCB0aHVzIHN1Y2tpbmcgdXAgZXZlcnkgZ2VuZSB3aGljaCB3YXMKc2lnbmlmaWNhbnRseSBoaWdoZXIgaW4gZWl0aGVyIHRoZSBrbm9ja291dCBfb3JfIGhldGVyenlvdXMgc2FtcGxlcwp3aXRoIHJlc3BlY3QgdG8gd2lsZC10eXBlLgoKVGhpcyB3YXMgZm9sbG93ZWQgYnkgYSBjb3VwbGUgb2YgbWVyZ2Ugb3BlcmF0aW9ucyBvZiBhIGxpdHRsZSBiaXQgb2YKdGhlIGFubm90YXRpb24gZGF0YTsgSSBhbSBub3Qgc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGdvYWwgeWV0Li4uCgpIZXJlIGlzIGhlciBjb2RlLiBJIGNvcGllZCB0aGUgYW5ub3RhdGlvbiAnbWdpX3N5bWJvbCcgY29sdW1uIHRvCidleHRlcm5hbF9nZW5lX25hbWUnIHNvIHRoYXQgSSBuZWVkIG5vdCBjaGFuZ2UgYW55IG9mIGhlciBjb2RlLiAgSSBhbQphc3N1bWluZyB0aGlzIGlzIHRoZSBhcHByb3ByaWF0ZSBjb2x1bW4gb2YgaW50ZXJlc3QsIEkgZG8gbm90IGtub3cKdGhpcyBmb3IgY2VydGFpbiwgYnV0IGl0IHNlZW1zIHF1aXRlIGxpa2VseS4KCldoaWxlIEkgYW0gYXQgaXQsIGhlcmUgaXMgdGhlIHNldF9zaWdfbGltbWEoKSBmdW5jdGlvbiBmcm9tIFRoZXJlc2EncyBoZWxwZXJzLlIKCmBgYHtyfQpzZXRfc2lnX2xpbW1hIDwtIGZ1bmN0aW9uKGxpbW1hX3RibCwgZmFjdG9ycyA9IE5VTEwpIHsKICBpZiAoaXMubnVsbChmYWN0b3JzKSkgewogICAgI3NldCBzaWduaWZpY2FuY2UgZm9yIHBsb3R0aW5nIGNvbG9ycwogICAgbGltbWFfdGJsJFNpZ25pZmljYW5jZSA8LSBOQQogICAgbGltbWFfdGJsW2FicyhsaW1tYV90YmwkbG9nRkMpIDwgMSB8IGxpbW1hX3RibCRhZGouUC5WYWwgPiAuMDUsICJTaWduaWZpY2FuY2UiXSA8LSAiTm90IFxuRW5yaWNoZWQiCiAgICBsaW1tYV90YmxbbGltbWFfdGJsJGxvZ0ZDID49IDEgICYgbGltbWFfdGJsJGFkai5QLlZhbCA8PSAuMDUsIF1bWyJTaWduaWZpY2FuY2UiXV0gPC0gIkRpc2Vhc2UgXG5VcHJlZ3VsYXRlZCIKICAgIGxpbW1hX3RibFtsaW1tYV90YmwkbG9nRkMgPD0gLTEgICYgbGltbWFfdGJsJGFkai5QLlZhbCA8PSAuMDUsIF1bWyJTaWduaWZpY2FuY2UiXV0gPC0gIkRpc2Vhc2UgXG5Eb3ducmVndWxhdGVkIgogICAgbGltbWFfdGJsJFNpZ25pZmljYW5jZSA8LSBmYWN0b3IobGltbWFfdGJsJFNpZ25pZmljYW5jZSwgbGV2ZWxzID0gYygiVXByZWd1bGF0ZWQiLCAiRG93bnJlZ3VsYXRlZCIsICAiTm90IFxuRW5yaWNoZWQiKSkKICB9IGVsc2UgewogICAgbGltbWFfdGJsJFNpZ25pZmljYW5jZSA8LSBOQQogICAgbGltbWFfdGJsW2FicyhsaW1tYV90YmwkbG9nRkMpIDwgMSB8IGxpbW1hX3RibCRhZGouUC5WYWwgPiAuMDUsICJTaWduaWZpY2FuY2UiXSA8LSAiTm90IFxuRW5yaWNoZWQiCiAgICBpZihucm93KGxpbW1hX3RibFtsaW1tYV90YmwkbG9nRkMgPj0gMSAgJiBsaW1tYV90YmwkYWRqLlAuVmFsIDw9IC4wNSwgXSkgIT0gMCkgewogICAgICBsaW1tYV90YmxbbGltbWFfdGJsJGxvZ0ZDID49IDEgICYgbGltbWFfdGJsJGFkai5QLlZhbCA8PSAuMDUsIF1bWyJTaWduaWZpY2FuY2UiXV0gPC0gZmFjdG9yc1sxXQogICAgfQogICAgaWYgKG5yb3cobGltbWFfdGJsW2xpbW1hX3RibCRsb2dGQyA8PSAtMSAgJiBsaW1tYV90YmwkYWRqLlAuVmFsIDw9IC4wNSwgXSkgIT0gMCkgewogICAgICBsaW1tYV90YmxbbGltbWFfdGJsJGxvZ0ZDIDw9IC0xICAmIGxpbW1hX3RibCRhZGouUC5WYWwgPD0gLjA1LCBdW1siU2lnbmlmaWNhbmNlIl1dIDwtIGZhY3RvcnNbMl0KICAgIH0KICAgIGxpbW1hX3RibCRTaWduaWZpY2FuY2UgPC0gZmFjdG9yKGxpbW1hX3RibCRTaWduaWZpY2FuY2UsIGxldmVscyA9IGMoZmFjdG9ycywgICJOb3QgXG5FbnJpY2hlZCIpKQogIH0KICByZXR1cm4obGltbWFfdGJsKQp9CmBgYAoKIyMjIENvbWJpbmluZyBoZXQvd3QgYW5kIGtvL3d0CgpgYGB7cn0KbW1fYW5ub3RbWyJleHRlcm5hbF9nZW5lX25hbWUiXV0gPC0gbW1fYW5ub3RbWyJtZ2lfc3ltYm9sIl1dCmtlZXBlcmdlbmVzIDwtIHVuaXF1ZShjKHJvd25hbWVzKGhldGtlZXBlcl9nZW5lcyksIHJvd25hbWVzKGtva2VlcGVyX2dlbmVzKSkpCmxlbmd0aChrZWVwZXJnZW5lcykKYW5ub3RzX3RvX21lcmdlIDwtIG1tX2Fubm90ICU+JQogIHNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGV4dGVybmFsX2dlbmVfbmFtZSkgJT4lCiAgZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lCiAgICAgICAgICAgcm93bmFtZXMobW1fZGVfbm9ybWFsX3A4X3JldCRkZXNlcSRhbGxfdGFibGVzJGtvX3JldGluYV92c19oZXRfcmV0aW5hKSkgJT4lCiAgZGlzdGluY3QoKQptbV9kZV9ub3JtYWxfcDhfcmV0JGRlc2VxJGFsbF90YWJsZXMka29fcmV0aW5hX3ZzX2hldF9yZXRpbmEgPC0gbWVyZ2UoCiAgbW1fZGVfbm9ybWFsX3A4X3JldCRkZXNlcSRhbGxfdGFibGVzJGtvX3JldGluYV92c19oZXRfcmV0aW5hLCBhbm5vdHNfdG9fbWVyZ2UsCiAgYnkueCA9IDAsIGJ5LnkgPSAiZW5zZW1ibF9nZW5lX2lkIiwgYWxsLnggPSBUUlVFKQpkZiA8LSBtbV9kZV9ub3JtYWxfcDhfcmV0JGRlc2VxJGFsbF90YWJsZXMka29fcmV0aW5hX3ZzX2hldF9yZXRpbmEgJT4lCiAgZHBseXI6Om11dGF0ZShsb2dGQyA9IC1sb2dGQykgJT4lCiAgc2V0X3NpZ19saW1tYShmYWN0b3JzID0gYygiSGV0IEVucmljaGVkIiwgIktPIEVucmljaGVkIikpCmBgYAoKTXkgdmVyc2lvbiBvZiB0aGUgYWJvdmUgdGFzayBtYWtlcyB1c2Ugb2YgdGhlIGV4Y2x1ZGVzIG9wdGlvbiBvZgpjb21iaW5lX2RlX3RhYmVzLiAgR2l2ZW4gdGhlIHNldCBvZiB1bmlxdWUgZ2VuZSBJRHMgaW5jcmVhc2VkIGluIHRoZQpoZXQva28sIEkgY2FuIGFzayB0byBleGx1ZGUgYW55dGhpbmcgbm90IGluIHRoYXQgc2V0LiAgSSBjb3VsZCBhbHNvCmhhdmUgbW9yZSBwYXJzaW1vbmlvdXNseSBkaXJlY3RseSBleGNsdWRlZCBhbnkgZ2VuZSBJRCBpbmNyZWFzZWQgaW4KdGhlIHd0IHNhbXBsZXMuICBCdXQsIFRoZXJlc2EgYWxyZWFkeSBwcm92aWRlZCB0aGUgY29kZSB0byBkbyB0aGUKZm9ybWVyLCBzbyBpdCB3aWxsIGJlIGxlc3MgdHlwaW5nL29wcG9ydHVuaXR5IGZvciBzaWxseSBtaXN0YWtlcyB0bwpqdXN0IGRvIHRoYXQuCgpgYGB7cn0KYm90aF9pbmNyZWFzZWRfZ2VuZXMgPC0gdW5pcXVlKGMoaW5jcmVhc2VkX2hldF9nZW5lcywgaW5jcmVhc2VkX2tvX2dlbmVzKSkKIyMgYXJiaXRyYWlybHkgZ3JhYiBhbGwgZ2VuZXMgZnJvbSBvbmUgb2YgbXkgZGF0YSBzdHJ1Y3R1cmVzLgphbGxfZ2VuZXMgPC0gcm93bmFtZXMoZXhwcnMobW0zOF9oaXNhdF92MykpCmV4Y2x1ZGVfaWR4IDwtIGFsbF9nZW5lcyAlaW4lIGJvdGhfaW5jcmVhc2VkX2dlbmVzCnN1bW1hcnkoZXhjbHVkZV9pZHgpCmBgYAoKTXkgQXByaWwgMjAyNSB2ZXJzaW9uIG9mIHRoaXMgc2hvd3MgMjEsNzkzIGFuZCAzLDYzMiBnZW5lcyBpbiB0aGlzCnNldC4gIElzIHRoYXQgc3RpbGwgdHJ1ZT8gIChBcyBvZiAyMDI2MDMxMSwgaXQgaXMhKQoKYGBge3J9CmV4Y2x1ZGVfaW5jcmVhc2VkX2dlbmVzIDwtIGFsbF9nZW5lc1tleGNsdWRlX2lkeF0KcmV0aW5hX2tlZXBlcnMgPC0gbGlzdCgKICAiaGV0X3ZzX3d0IiA9IGMoImhldF9yZXRpbmEiLCAid3RfcmV0aW5hIiksCiAgImtvX3ZzX3d0IiA9IGMoImtvX3JldGluYSIsICJ3dF9yZXRpbmEiKSwKICAia29fdnNfaGV0IiA9IGMoImtvX3JldGluYSIsICJoZXRfcmV0aW5hIikpCiMjIEEgcmVtaW5kZXIgdG8gbXlzZWxmOiB0aGVyZSBpcyBhbHNvIGEgcGFyYW1ldGVyICd3YW50ZWRfZ2VuZXMnCiMjIHdoaWNoIGRvZXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgdGhpbmcgYXMgZXhjbHVkZXMgaW4gdGhpcyBjb250ZXh0OwojIyBleGNsdWRlcyB3YXMgb3JpZ2luYWxseSB3cml0dGVuIHRvIGFsbG93IGZsZXhpYmxlLCBrZXl3b3JkLWJhc2VkCiMjIGV4Y2x1c2lvbi4KcDhfcmV0aW5hX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICBtbV9ub3JtYWxfcDhfcmV0X2RlLCBrZWVwZXJzID0gcmV0aW5hX2tlZXBlcnMsCiAgd2FudGVkX2dlbmVzID0gYm90aF9pbmNyZWFzZWRfZ2VuZXMsIGxhYmVsX2NvbHVtbiA9IGxhYmVsX2NvbHVtbiwKICBleGNlbCA9IGdsdWUoIjAzdGhlcmVzYV9jb21wYXJpc29uX2V4Y2VsL3A4X3JldGluYV9rZXB0X2dlbmVzX2luY3JlYXNlZF9pbl93dF90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKCnA4X3JldGluYV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBwOF9yZXRpbmFfdGFibGVzLCBhY2NvcmRpbmdfdG8gPSAiZGVzZXEiLAogIGV4Y2VsID0gZ2x1ZSgiMDN0aGVyZXNhX2NvbXBhcmlzb25fZXhjZWwvcDhfcmV0aW5hX2tlcHRfZ2VuZXNfaW5jcmVhc2VkX2luX3d0X3NpZy12e3Zlcn0ueGxzeCIpKQoKb3Bwb3NpdGVfcDhfcmV0aW5hX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICBtbV9ub3JtYWxfcDhfcmV0X2RlLCBrZWVwZXJzID0gcmV0aW5hX2tlZXBlcnMsCiAgZXhjbHVkZXMgPSBib3RoX2luY3JlYXNlZF9nZW5lcywgbGFiZWxfY29sdW1uID0gbGFiZWxfY29sdW1uLAogIGV4Y2VsID0gZ2x1ZSgiMDN0aGVyZXNhX2NvbXBhcmlzb25fZXhjZWwvcDhfcmV0aW5hX3JlbW92ZWRfZ2VuZXNfaW5jcmVhc2VkX2luX3d0X3RhYmxlcy12e3Zlcn0ueGxzeCIpKQoKb3Bwb3NpdGVfcDhfcmV0aW5hX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHA4X3JldGluYV90YWJsZXMsIGFjY29yZGluZ190byA9ICJkZXNlcSIsCiAgZXhjZWwgPSBnbHVlKCIwM3RoZXJlc2FfY29tcGFyaXNvbl9leGNlbC9wOF9yZXRpbmFfcmVtb3ZlZF9nZW5lc19pbmNyZWFzZWRfaW5fd3Rfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyBGaWx0ZXJpbmcgb3V0IG5vbi1zcGVjaWZpYyBnZW5lcyBhbmQgZXhhbWluaW5nIHRoZSByZXN1bHRzCgpUaGUgZm9sbG93aW5nIGlzIGEgY29weS9wYXN0ZSBmcm9tIFRoZXJlc2EgY29udGFpbmluZyB0aGUgcmVtYWluaW5nCnRhc2tzIHNoZSBwZXJmb3JtZWQgYW5kIHdpbGwgcHJvdmlkZSB0aGUgdGVtcGxhdGUgZm9yIGltcGxlbWVudGF0aW9uCm9mIHRoZSBmaW5hbCB0YXNrcy4KClRoaXMgcGlja3MgdXAgd2l0aCB0aGUgbGluZXMgZnJvbSBoZXIgbm90ZWJvb2sgaW1tZWRpYXRlbHkgZm9sbG93aW5nCnRoZSBpbnZvY2F0aW9uIG9mICdzZXRfc2lnX2xpbW1hKGZhY3RvcnMgPSBjKCJIZXQgRW5yaWNoZWQiIC4uLicuCgpGb3IgYWxsIG9mIHRoZSByZW1haW5pbmcgYmxvY2tzIEkgd2lsbCBjb3B5IGluIGhlciBjb2RlLCB0dXJuIG9mZiBpdHMKZXZhbHVhdGlvbiwgcnVuIHRoZSBibG9ja3MgbWFudWFsbHksIGNvbXBhcmUgdGhlbSB0byBoZXIgbm90ZWJvb2sKb3V0cHV0LCB0aGVuIGVuYWJsZSBlYWNoIGJsb2NrIGFzIEkgZW5zdXJlIEkgdW5kZXJzdGFuZCBpdC4KCkkgd2lsbCBsaWtlbHkgdGhlcmVmb3JlIGludHJvZHVjZSBzb21lIHNtYWxsIGZvcm1hdHRpbmcgY2hhbmdlcyBhbmQKYWRkIHNvbWUgYWRkaXRpb25hbCBHU0VBL2VucmljaG1lbnQgdGFza3Mgb25jZSB0aGUgbm9uLXNwZWNpZmljCmZpbHRlcmluZyBpcyBjb21wbGV0ZS4KCmBgYHtyfQpkZiA8LSBkZiAlPiUKICBmaWx0ZXIoUm93Lm5hbWVzICVpbiUga2VlcGVyZ2VuZXMpCmxhYmVsc191cHMgPC0gZGYgJT4lCiAgZmlsdGVyKGFkai5QLlZhbCA8PSAwLjA1ICYgYWJzKGxvZ0ZDKSA+IDEpICU+JQogIGFycmFuZ2UobG9nRkMpICU+JQogIGhlYWQobiA9IDkpCmxhYmVsc19kb3ducyA8LSBkZiAlPiUKICBmaWx0ZXIoYWRqLlAuVmFsIDw9IDAuMDUgJiBhYnMobG9nRkMpID4gMSkgJT4lCiAgYXJyYW5nZSgtbG9nRkMpICU+JQogIGhlYWQobiA9IDExKQpsYWJlbHMgPC0gcmJpbmQobGFiZWxzX3VwcywgbGFiZWxzX2Rvd25zKQpyZXNfdGJsIDwtIGRmCkRFcGxvdCA8LSBnZ3Bsb3QocmVzX3RibCwgYWVzKHggPSBsb2dGQywgeSA9IC1sb2cxMChhZGouUC5WYWwpLCBsYWJlbCA9IGV4dGVybmFsX2dlbmVfbmFtZSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBTaWduaWZpY2FuY2UpLCBzaXplID0gNCkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTEsIDEpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLWxvZzEwKDAuMDUpKSArCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemUgPSAyMCkgKwogIHhsYWIoImxvZzIoRkMpIikgKwogIHlsYWIoIi1sb2cxMChwLXZhbHVlKSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNGODc2NkQiLCAiIzAwQkZDNCIsICJHcmV5IikpICsKICBnZW9tX2xhYmVsX3JlcGVsKAogICAgZGF0YSA9IGZpbHRlcihkZiwKICAgICAgICAgICAgICAgICAgIyMgYygnczVfaGV0X2RsZ24nLCAnczVfaGV0X3JldCcsICdzNV9oZXRfc2NuJykpLAogICAgICAgICAgICAgICAgICBleHRlcm5hbF9nZW5lX25hbWUgJWluJSBsYWJlbHMkZXh0ZXJuYWxfZ2VuZV9uYW1lKSwKICAgICMjIG51ZGdlX3ggPSAtMC41LAogICAgbnVkZ2VfeSA9IDMsIG1heC5vdmVybGFwcyA9IDE1KSArCiAgeGxpbShjKC0zLCA2KSkKCnBwKGZpbGUgPSAiMDN0aGVyZXNhX2NvbXBhcmlzb25faW1hZ2VzL3AwOF9yZXRpbmFfREVfMTMxMjAyNC5wZGYiKQpERXBsb3QKcGxvdHRlZCA8LSBkZXYub2ZmKCkKREVwbG90CndyaXRlX3hsc3goZGYsIGV4Y2VsID0gImV4Y2VsL3JldGluYWhldF92c19yZXRpbmFrb19XVGZpbHRlcmVkLnhsc3giKQpgYGAKCiMjIEhvdyBtYW55IHVwcy9kb3ducwoKYGBge3J9CmtvX2VucmljaGVkIDwtIGRmICU+JQogIGZpbHRlcihTaWduaWZpY2FuY2UgPT0gIktPIEVucmljaGVkIikKbnJvdyhrb19lbnJpY2hlZCkKaGV0X2VucmljaGVkIDwtICBkZiAlPiUKICBmaWx0ZXIoU2lnbmlmaWNhbmNlID09ICJIZXQgRW5yaWNoZWQiKQpucm93KGhldF9lbnJpY2hlZCkKYGBgCgojIyBjYXRlZ29yeSBlbnJpY2htZW50L0dTRUEKCmBgYHtyfQpyZWd1bGF0ZWRfZ2VuZXMgPC0gcmVzX3RibCAlPiUKICBmaWx0ZXIoYWRqLlAuVmFsIDw9IDAuMDUpICU+JQogIGFycmFuZ2UobG9nRkMpICU+JQogIHNlbGVjdChSb3cubmFtZXMsIGxvZ0ZDLCBhZGouUC5WYWwsIGV4dGVybmFsX2dlbmVfbmFtZSwgU2lnbmlmaWNhbmNlKSAlPiUKICBmaWx0ZXIoYWJzKGxvZ0ZDKSA+PSAxKQojIyBnc2VhX3Jlc3VsdF9rbyA8LSBnb3N0KHF1ZXJ5ID0ga29fZ2VuZXMkZXh0ZXJuYWxfZ2VuZV9uYW1lLAojIyAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2FuaXNtID0gIm1tdXNjdWx1cyIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgZXZjb2RlcyA9IFRSVUUsCiMjICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZF9xdWVyeSA9IFRSVUUpCmdzZWFfcmVzdWx0X2hldCA8LSBnb3N0KHF1ZXJ5ID0gaGV0X2VucmljaGVkJGV4dGVybmFsX2dlbmVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgb3JnYW5pc20gPSAibW11c2N1bHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgZXZjb2RlcyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWRfcXVlcnkgPSBUUlVFKQojI2dzZWFfcmVzdWx0X2FsbGR5c3JlZ3VsYXRlZCA8LSBnb3N0KHF1ZXJ5ID0gYWxsZHlzcmVndWxhdGVkX2dlbmVzJGV4dGVybmFsX2dlbmVfbmFtZSwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzbSA9ICJtbXVzY3VsdXMiLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2Y29kZXMgPSBUUlVFLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWRfcXVlcnkgPSBUUlVFKQpgYGAKCkkgaGF2ZSBhIGZ1bmN0aW9uIGluIG15IHBhY2thZ2Ugd2hpY2ggc2Vla3MgdG8gbWFrZSBnUHJvZmlsZXIgcXVlcmllcwphIGJpdCBtb3JlIGNvbXBsZXRlIGFuZCBlYXN5LiAgTGV0IHVzIHNlZSBob3cgc2ltaWxhciB0aGUgcmVzdWx0IGlzLi4uCgpgYGB7ciwgZXZhbD1GQUxTRX0Kcm93bmFtZXMoYWxsZHlzcmVndWxhdGVkX2dlbmVzKSA8LSBhbGxkeXNyZWd1bGF0ZWRfZ2VuZXNbWyJSb3cubmFtZXMiXV0KYWxsZHlzcmVndWxhdGVkX2dlbmVzW1siUm93Lm5hbWVzIl1dIDwtIE5VTEwKCmhldF9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHJvd25hbWVzKGFsbGR5c3JlZ3VsYXRlZF9nZW5lcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXMgPSAibW11c2N1bHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWwgPSBnbHVlKCJleGNlbC9oZXRfZ3Byb2ZpbGVyLXZ7dmVyfS54bHN4IikpCmhldF9ncAplbnJpY2hwbG90Ojpkb3RwbG90KGhldF9ncFtbIkJQX2VucmljaCJdXSkKZ3BfcGFpciA8LSBlbnJpY2hwbG90OjpwYWlyd2lzZV90ZXJtc2ltKGhldF9ncFtbIkJQX2VucmljaCJdXSkKZW5yaWNocGxvdDo6ZW1hcHBsb3QoZ3BfcGFpcikKZW5yaWNocGxvdDo6c3NwbG90KGdwX3BhaXIpCmVucmljaHBsb3Q6OnRyZWVwbG90KGdwX3BhaXIpCnVwc2V0cGxvdChoZXRfZ3BbWyJCUF9lbnJpY2giXV0pCgplbnJpY2hwbG90Ojpkb3RwbG90KGhldF9ncFtbIlJFQUNfZW5yaWNoIl1dKQpncF9wYWlyIDwtIGVucmljaHBsb3Q6OnBhaXJ3aXNlX3Rlcm1zaW0oaGV0X2dwW1siUkVBQ19lbnJpY2giXV0pCmVucmljaHBsb3Q6OmVtYXBwbG90KGdwX3BhaXIpCmVucmljaHBsb3Q6OnNzcGxvdChncF9wYWlyKQplbnJpY2hwbG90Ojp0cmVlcGxvdChncF9wYWlyKQp1cHNldHBsb3QoaGV0X2dwW1siUkVBQ19lbnJpY2giXV0pCmBgYAoKSSBtYWtlIGEgc29tZXdoYXQgYXJiaXRyYXJ5IGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlIGNvbmNlcHRzIG9mCm92ZXItZW5yaWNobWVudCBhbmFseXNlcyBhbmQgR1NFQTogdGhlIGZvcm1lciAoYXMgcGVyZm9ybWVkIGJ5Cmdwcm9maWxlcikgKEByYXVkdmVyZVByb2ZpbGVyV2ViU2VydmVyMjAxOSkgc2Vla3MgdG8gZmluZCBncm91cHMgb2YKZ2VuZXMgb3ZlcnJlcHJlc2VudGVkIGluIEdPL3JlYWN0b21lL2V0Yy4gIFRoZXNlIGdyb3VwcyBvZiBnZW5lcyBhcmUKdGFrZW4gZXhjbHVzaXZlbHkgZnJvbSB0aGUgdG9wLW4vYm90dG9tLW4gZ2VuZXMgd2l0aCByZXNwZWN0IHRvCmZvbGQtY2hhbmdlIGJldHdlZW4gY29uZGl0aW9ucyBvZiBpbnRlcmVzdDsgaW4gdGhpcyBjYXNlIG1vc3QKZGlmZmVyZW50IHRoYW4gd3QgaW4gdGhlIHAwOCByZXRpbmEga28gb3IgaGV0IHNhbXBsZXMuCgpXaXRoIHRoYXQgaW4gbWluZCwgSSBjYW4gaW52b2tlIGEgc2ltaWxhciBmdW5jdGlvbiB1c2luZyB0aGUgZnVsbAp0YWJsZSBvZiBERSByZXN1bHRzIHRvIGdldCB3aGF0IEkgY2FsbCB0aGUgR1NFQSByZXN1bHQgdXNpbmcKY2x1c3RlclByb2ZpbGVyIChAeXVJbnRyb2R1Y3Rpb25CaW9tZWRpY2FsS25vd2xlZGdlKS4gIEluIHRoZQpmb2xsb3dpbmcgYmxvY2sgSSB3aWxsIHVzZSB0aGUgJ2FsbF9jcHJvZmlsZXInIGZ1bmN0aW9uIG9uIHRoZSBkYXRhCnN0cnVjdHVyZXMgbmFtZWQgJ3A4X3JldGluYV90YWJsZXMnIGFuZCAnb3Bwb3NpdGVfcDhfcmV0aW5hX3RhYmxlcycgaW4Kb3JkZXIgdG8gZ2V0IHRoZXNlIEdTRUEgcmVzdWx0cyBmb3IgZWFjaCBjb250cmFzdCBwZXJmb3JtZWQgKGhldC93dCwKa28vd3QsIGhldC9rbykuICBJIHdpbGwgZm9sbG93IHRoYXQgdXAgd2l0aCAnYWxsX2dwcm9maWxlcicgd2hpY2ggZG9lcwp0aGUgc2FtZSwgYnV0IHVzZXMgZ1Byb2ZpbGVyJ3MgZW5yaWNobWVudCBhbmFseXNlcyAoaXQgd2lsbCB0aGVyZWZvcmUKaW5jbHVkZSB3aGF0IHdlIGp1c3QgbG9va2VkIGF0KS4KCmBgYHtyfQpwMDhfcmV0aW5hX2FsbF9jcCA8LSBhbGxfY3Byb2ZpbGVyKAogIHA4X3JldGluYV9zaWcsIHA4X3JldGluYV90YWJsZXMsIG9yZ2RiID0gIm9yZy5NbS5lZy5kYiIsIG9yZ2RiX2Zyb20gPSBvcmdkYl9mcm9tLAogIGV4Y2VsID0gIjAzdGhlcmVzYV9jb21wYXJpc29uX2V4Y2VsL2Nwcm9maWxlcl9wMDhfcmV0aW5hLnhsc3giKQoKZW5yaWNocGxvdDo6ZG90cGxvdChwMDhfcmV0aW5hX2FsbF9jcFtbImtvX3ZzX2hldF91cCJdXVtbImVucmljaF9vYmplY3RzIl1dW1siTUZfYWxsIl1dKQpwMDhfdG9wbl9nc2VhIDwtIHBsb3RfdG9wbl9nc2VhKHAwOF9yZXRpbmFfYWxsX2NwKQoKcHAoZmlsZSA9ICIwM3RoZXJlc2FfY29tcGFyaXNvbl9pbWFnZXMvZ3NlYV9wMDhfcmV0aW5hX2tvX3ZzX2hldF90b3BfaGl0LnBkZiIpCnAwOF90b3BuX2dzZWFbWyJHT19rb192c19oZXRfdXAiXV1bWzFdXQpwbG90dGVkIDwtIGRldi5vZmYoKQoKcDA4X3RvcG5fZ3NlYVtbIkdPX2tvX3ZzX2hldF91cCJdXVtbMV1dCnAwOF90b3BuX2dzZWFbWyJHT19rb192c19oZXRfdXAiXV1bWzJdXQpwMDhfdG9wbl9nc2VhW1siR09fa29fdnNfaGV0X3VwIl1dW1szXV0KcDA4X3RvcG5fZ3NlYVtbIkdPX2tvX3ZzX2hldF91cCJdXVtbNF1dCnAwOF90b3BuX2dzZWFbWyJHT19rb192c19oZXRfdXAiXV1bWzVdXQoKcHAoZmlsZSA9ICIwM3RoZXJlc2FfY29tcGFyaXNvbl9pbWFnZXMvZ3NlYV9wMDhfcmV0aW5hX2hldF92c193dF90b3BfaGl0LnBkZiIpCnAwOF90b3BuX2dzZWFbWyJHT19oZXRfdnNfd3RfdXAiXV1bWzFdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpgYGAKCmBgYHtyfQojZ3NlYV9rbyA8LSAgZ3NlYV9yZXN1bHRfa29bWyJyZXN1bHQiXV0gJT4lCiMgICAgc2VsZWN0KHRlcm1fbmFtZSwgcF92YWx1ZSwgdGVybV9zaXplLCBpbnRlcnNlY3Rpb25fc2l6ZSwgcmVjYWxsLCBzb3VyY2UsIGludGVyc2VjdGlvbikgJT4lCiMgICAgYXJyYW5nZShkZXNjKHJlY2FsbCkpICU+JQojICAgIGhlYWQobiA9IDEwKQojICBnc2VhX3Bsb3RzX2tvIDwtIGdncGxvdChnc2VhX2tvLCBhZXMoeCA9IHJlY2FsbCwgeSA9IHJlb3JkZXIodGVybV9uYW1lLCByZWNhbGwpLCBmaWxsID0gcF92YWx1ZSkpICsKIyAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpKwojICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsKIyAgdGhlbWVfYncoKSsKIyAgeWxhYigiIikgKwojICB4bGFiKCJHU0VBIFNjb3JlIikKZ3NlYV9oZXQgPC0gIGdzZWFfcmVzdWx0X2hldFtbInJlc3VsdCJdXSAlPiUKICBzZWxlY3QodGVybV9uYW1lLCBwX3ZhbHVlLCB0ZXJtX3NpemUsIGludGVyc2VjdGlvbl9zaXplLCByZWNhbGwsIHNvdXJjZSwgaW50ZXJzZWN0aW9uKSAlPiUKICBhcnJhbmdlKGRlc2MocmVjYWxsKSkgJT4lCiAgaGVhZChuID0gMTApCmdzZWFfcGxvdHNfaGV0IDwtIGdncGxvdChnc2VhX2hldCwgYWVzKHggPSByZWNhbGwsIHkgPSByZW9yZGVyKHRlcm1fbmFtZSwgcmVjYWxsKSwgZmlsbCA9IHBfdmFsdWUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsKICB0aGVtZV9idygpICsKICB5bGFiKCIiKSArCiAgeGxhYigiT3ZlciBSZXByZXNlbnRhdGlvbiBTY29yZSIpCnBwKGZpbGUgPSAiMDN0aGVyZXNhX2NvbXBhcmlzb25faW1hZ2VzL0dTRUFfcDA4X2F4b250cmFwX3JldGluYWhldF91cHJlZ3VsYXRlZF92c19yZXRpbmFrby5wZGYiKQpnc2VhX3Bsb3RzX2hldApwbG90dGVkIDwtIGRldi5vZmYoKQpnc2VhX3Bsb3RzX2hldApgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQpnc2VhX2FsbCA8LSAgZ3NlYV9yZXN1bHRfYWxsZHlzcmVndWxhdGVkW1sicmVzdWx0Il1dICU+JQogIHNlbGVjdCh0ZXJtX25hbWUsIHBfdmFsdWUsIHRlcm1fc2l6ZSwgaW50ZXJzZWN0aW9uX3NpemUsIHJlY2FsbCwgc291cmNlLCBpbnRlcnNlY3Rpb24pICU+JQogIGFycmFuZ2UoZGVzYyhyZWNhbGwpKSAlPiUKICBoZWFkKG4gPSAxMCkKZ3NlYV9wbG90c19hbGwgPC0gZ2dwbG90KGdzZWFfYWxsLCBhZXMoeCA9IHJlY2FsbCwgeSA9IHJlb3JkZXIodGVybV9uYW1lLCByZWNhbGwpLCBmaWxsID0gcF92YWx1ZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfY29udGludW91cyhsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKwogIHlsYWIoIiIpICsKICB4bGFiKCJPdmVyIFJlcHJlc2VudGF0aW9uIFNjb3JlIikKCnBwKGZpbGUgPSAiaW1hZ2VzL0dTRUFfcDA4X3JldGluYV9heG9udHJhcF9hbGxkeXNyZWd1bGF0ZWRnZW5lcy5wZGYiKQpnc2VhX3Bsb3RzX2FsbApwbG90dGVkIDwtIGRldi5vZmYoKQpgYGAKCiMgU0NOIEhldCB2cyBLTwoKSXQgaXMgb25seSBub3cgdGhhdCBJIHJlYWxpemVkIHdlIGFyZSBzcGxpdHRpbmcgdGhlIGRhdGEgYnkgbG9jYXRpb24KZm9yIGVhY2ggc2V0IG9mIGNvbXBhcmlzb25zLiAgSSB0aGluayB0aGF0LCBsZWZ0IHRvIG15IG93biBkZXZpY2VzLCBJCndvdWxkIHByZWZlciB0byBrZWVwIHRoZSBpbnB1dCBkYXRhIHN0cnVjdHVyZSBpbnRhY3QsIHBlcmZvcm0gdGhlCnNvbWV3aGF0IGxhcmdlciBudW1iZXIgb2YgY29udHJhc3RzLCBhbmQgdGhlbiBzcGxpdCB1cCB0aGUgcmVzdWx0cy4KSWRlYWxseSB0aGlzIHdpbGwgc2xpZ2h0bHkgaW1wcm92ZSB0aGUgZmlkZWxpdHkgb2YgdGhlIHJlc3VsdHMKcmV0dXJuZWQgYnkgREVTZXEyIGFuZCBmcmllbmRzLiAgQnV0LCBJIHdpbGwgcnVuIHRoZSBzdGF0ZSBvZgpUaGVyZXNhJ3Mgbm90ZWJvb2sgd2l0aCBhcyBmZXcgY2hhbmdlcyBhcyBwb3NzaWJsZSBmaXJzdCwgdGhlbiBhZGQKdGhpcy4KCiMjIFBDQQoKSSBhbSBnb2luZyB0byBza2lwIHRoaXMgUENBIHBsb3QgZm9yIGEgY291cGxlIG9mIHJlYXNvbnM6IEkgYWxyZWFkeQpkaWQgYSBzdXBlcnNldCBvZiBpdCwgYW5kIHRoZSBzdWJzZXQgVGhlcmVzYSBwZXJmb3JtZWQgaXMgbm90IHZhbGlkCmdpdmVuIHRoZSBzZXQgb2Ygc2FtcGxlcyBpbmNsdWRlZCBpbiBteSBzYW1wbGUgc2hlZXQsIGFuZCBmaWd1cmluZyBvdXQKdGhlIGFjdHVhbGx5IGNvcnJlc3BvbmRpbmcgc3Vic2V0IHdpbGwgdGFrZSBtZSBmb3JldmVyLi4uICBJbgphZGRpdGlvbiwgSSB3YW50IHRvIHVzZSBteSBtbTM4X2hpc2F0X3YzIGZvciBldmVyeXRoaW5nLi4uCgpgYGB7ciwgZXZhbD1GQUxTRX0KbW0zOF9zdWJzZXQgPC0gc3Vic2V0X3NlKAogIG1tMzhfaGlzYXQsCiAgc3Vic2V0ID0gIihiYXRjaCA9PSAnNCcgfCBiYXRjaCA9PSAnNScgfCBiYXRjaCA9PSAnNicpICYgdGltZSA9PSAncDA4JyAmIGxvY2F0aW9uID09ICdzY24nIHwgc2FtcGxlaWQgPT0gJ2lwcmdjXzAzJyIpCm1tMzhfbm9ybSA8LSBub3JtYWxpemUobW0zOF9zdWJzZXQsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgYmF0Y2ggPSAic3Zhc2VxIikKbW0zOF9ub3JtIDwtIHNldF9iYXRjaGVzKG1tMzhfbm9ybSwgZmFjdCA9ICJsb2NhdGlvbiIpCm1tMzhfbm9ybSA8LSBzZXRfY29uZGl0aW9ucyhtbTM4X25vcm0sIGZhY3QgPSAiZ2Vub3R5cGUiKQpwY2Ffbm9ybSA8LSBwbG90X3BjYShtbTM4X25vcm0sIG1heF9vdmVybGFwcyA9IDcwKQpwY2Ffbm9ybSRwbG90CmBgYAoKSW5zdGVhZCBJIHdpbGwgc2ltcGxpZnkgdGhlIHN1YnNldCBhbmQgc2VlIHdoYXQgaGFwcGVucy4uLgoKYGBge3J9CnNjbl9zYW1wbGVzIDwtIHN1YnNldF9zZShtbTM4X2hpc2F0X3YzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXQgPSAibG9jYXRpb25fYXRiID09ICdzY24nIikgJT4lCiAgc2V0X2JhdGNoZXMoZmFjdCA9ICJsb2NhdGlvbl9hdGIiKSAlPiUKICBzZXRfY29uZGl0aW9ucyhmYWN0ID0gImdlbm90eXBlX2F0YiIsIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJnZW5vdHlwZSJdXSkKc2NuX25vcm0gPC0gbm9ybWFsaXplKHNjbl9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgYmF0Y2ggPSAic3Zhc2VxIikKc2NuX25vcm1fcGNhIDwtIHBsb3RfcGNhKHNjbl9ub3JtKQpzY25fbm9ybV9wY2EKYGBgCgojIExpYnJhcnkgc2l6ZXMgcG9zdC1kZWR1cGxpY2F0aW9uCgpUaGVyZXNhJ3MgbmV4dCBvcGVyYXRpb24gd2FzIHRvIHBlcmZvcm0gbGlic2l6ZS9ub256ZXJvIHBsb3RzLiAgSQphbHJlYWR5IGRpZCB0aGUgcHJlL3Bvc3QgZGVkdXBsaWNhdGlvbiBub256ZXJvLCBoZXJlIGlzIHRoZSBhbmFsYWdvdXMKbGlic2l6ZS4KCnYyIGlzIHByZS1kZWR1cGxpY2F0aW9uIGFuZCB2MyBpcyBwb3N0LgoKYGBge3J9CnBsb3RfbGlic2l6ZShtbTM4X2hpc2F0X3YyKQpwb3N0X2ZpbHRlcl9ub256ZXJvIDwtIHBsb3RfbGlic2l6ZShtbTM4X2hpc2F0X3YzLCB0ZXh0ID0gRkFMU0UpCnBwKGZpbGUgPSAiMDFkaWFnbm9zdGljX2ltYWdlcy9wb3N0X2FsbF9maWx0ZXJlc19ub256ZXJvLnBkZiIpCnBvc3RfZmlsdGVyX25vbnplcm9bWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCnBvc3RfZmlsdGVyX25vbnplcm8KYGBgCgpJIGFtIGEgYml0IGNvbmNlcm5lZCBhYm91dCBzb21lIG9mIHRoZXNlIGxpYnJhcnkgc2l6ZXMKcG9zdC1kZWR1cGxpY2F0aW9uLgoKTGV0IHVzIGxvb2sgYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHJlYWRzIGFuZCBkdXBsaWNhdGlvbiwgd2hpY2ggSQphc3N1bWUgd2lsbCBiZSByZWxhdGl2ZWx5IGxpbmVhci4KCmBgYHtyfQp0ZXN0IDwtIGNvbERhdGEobW0zOF9oaXNhdF92MylbLCBjKCJoaXNhdF9nZW5vbWVfc2luZ2xlX2FsbCIsICJ1bWlfZGVkdXBfcGN0X3JlYWRzIildCnRlc3RfcGxvdCA8LSBwbG90X2xpbmVhcl9zY2F0dGVyKHRlc3QsIGxvZXNzID0gVFJVRSkKdGVzdF9wbG90W1sic2NhdHRlciJdXQp0ZXN0X3Bsb3RbWyJzY2F0dGVyIl1dCnBwKGZpbGUgPSAiMDFkaWFnbm9zdGljX2ltYWdlcy9kZWR1cGxpY2F0aW9uX3ZzX2hpc2F0X3NjYXR0ZXIucGRmIikKdGVzdF9wbG90W1sic2NhdHRlciJdXQpkZXYub2ZmKCkKYGBgCgpUaGVyZXNhIGFsc28gcHJvZHVjZWQgYSBkZW5zaXR5L3NhbXBsZSBwbG90LCB0aGF0IG1pZ2h0IHByb3ZlIHF1aXRlCnVzZWZ1bCBmb3IgdGhlc2UgZHVlIHRvIHRoZWlyIHNpZ25pZmljYW50bHkgbGFyZ2VyIHZhcmlhbmNlIGFjcm9zcwpzYW1wbGVzIChkdWUgdG8gZGVkdXBsaWNhdGlvbikuCgpgYGB7cn0KcHAoZmlsZSA9ICIwMWRpYWdub3N0aWNfaW1hZ2VzL3NhbXBsZV9kZW5zaXR5LnBkZiIpCm1tMzhfZGVuc2l0eSA8LSBwbG90X2RlbnNpdHkobG9jX2dlbm9fbnQpCm1tMzhfZGVuc2l0eVtbInBsb3QiXV0gKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKcGxvdF9ib3hwbG90KGxvY19nZW5vX250KQpkZXYub2ZmKCkKbW0zOF9kZW5zaXR5W1sicGxvdCJdXSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpib3ggPC0gcGxvdF9ib3hwbG90KGxvY19nZW5vX250KQpwcChmaWxlID0gIjAxZGlhZ25vc3RpY19pbWFnZXMvc2FtcGxlX2JveHBsb3QucGRmIikKYm94CmRldi5vZmYoKQpib3gKYGBgCgpUaGVyZSBpcyBzb21lIGRpZmZlcmVuY2UgYWNyb3NzIHNhbXBsZSBkZW5zaXRpZXMsIGJ1dCBpdCBpcyBub3QgdG9vCmNyYXp5dG93bi4KCiMgRGl2ZXJnaW5nIGEgbGl0dGxlCgpBdCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCBJIHJlYWQgYWhlYWQgYSBiaXQgYW5kIGNhbWUgdG8gdGhlCmNvbmNsdXNpb24gdGhhdCBpdCByZXBlYXRzIHRoZSBhYm92ZSBsb2dpYyBvZiB0YWtpbmcgdGhlIHVuaW9uIG9mIHd0CmNvbXBhcmlzb25zIHRvIHJlbW92ZSBnZW5lcyBmcm9tIHRoZSBhcHByb3ByaWF0ZSBoZXQva28gb3IgcDE1L3AwOCBvcgpsb2NhdGlvbiBjb21wYXJpc29ucy4gIFRoaXMgc2VlbXMgcXVpdGUgcmVhc29uYWJsZSB0byBtZSwgYnV0IEkgd291bGQKcHJlZmVyIHRvIG5vdCBzZXBhcmF0ZSBhbGwgdGhlIGRhdGEsIHNvIEkgd2lsbCBhdHRlbXB0IHRvIGR1cGxpY2F0ZQphbmQgc2xpZ2h0bHkgc3RyZWFtbGluZSB0aGlzIGxvZ2ljIG9uIHRoZSBmdWxsIGRhdGFzZXQuICBUaHVzIEkgYW0KZ29pbmcgdG8gc2tpcCBkb3duIHRvIHRoZSBlbmQgYW5kIGF0dGVtcHQgdG8gaW1wbGVtZW50IHRoaXMuCgojIyBERQoKTm90ZTogVGhlIGZvbGxvd2luZyBmZXcgYmxvY2tzIGFyZSBhbGwgY29weS9wYXN0ZWQgZGlyZWN0bHkgZnJvbQpUaGVyZXNhJ3Mgbm90ZWJvb2sgYW5kIGFyZSBub3QgZXZhbHVhdGVkIGJlY2F1c2UgdGhleSBhcmUgcGVyZm9ybWVkCmFsbW9zdCBpZGVudGljYWxseSBsYXRlciBidXQgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgbG9naWMvb3JkZXJzLgoKYGBge3IsIGV2YWw9RkFMU0V9Cm1tX2RlX25vcm1hbF9wOF9zY24gPC0gYWxsX3BhaXJ3aXNlKG1tMzhfc3Vic2V0LCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbGxlbCA9IEZBTFNFLCBkb19lYnNlcSA9IEZBTFNFLCBkb19iYXNpYyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19kcmVhbSA9IEZBTFNFLCBkb19ub2lzZXEgPSBGQUxTRSwgZG9fZWRnZXIgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSkKYW5ub3RzX3RvX21lcmdlIDwtIG1tX2Fubm90ICU+JQogIHNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGV4dGVybmFsX2dlbmVfbmFtZSkgJT4lCiAgZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIHJvd25hbWVzKG1tX2RlX25vcm1hbF9wOF9zY24kZGVzZXEkYWxsX3RhYmxlcyRrb19zY25fdnNfaGV0X3NjbikpICU+JQogIGRpc3RpbmN0KCkKbW1fZGVfbm9ybWFsX3A4X3NjbiRkZXNlcSRhbGxfdGFibGVzJGtvX3Njbl92c19oZXRfc2NuIDwtIG1lcmdlKAogIG1tX2RlX25vcm1hbF9wOF9zY24kZGVzZXEkYWxsX3RhYmxlcyRrb19zY25fdnNfaGV0X3NjbiwKICBhbm5vdHNfdG9fbWVyZ2UsIGJ5LnggPSAwLCBieS55ID0gImVuc2VtYmxfZ2VuZV9pZCIsIGFsbC54ID0gVFJVRSkKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0KaGV0a2VlcGVyX2dlbmVzIDwtIG1tX2RlX25vcm1hbF9wOF9zY24kZGVzZXEkYWxsX3RhYmxlcyR3dF9zY25fdnNfaGV0X3NjbiAlPiUKICBmaWx0ZXIobG9nRkMgPD0gLTAuMSAmIGFkai5QLlZhbCA8PSAwLjA1KQprb2tlZXBlcl9nZW5lcyA8LSBtbV9kZV9ub3JtYWxfcDhfc2NuJGRlc2VxJGFsbF90YWJsZXMkd3Rfc2NuX3ZzX2tvX3NjbiAlPiUKICBmaWx0ZXIobG9nRkMgPD0gLTAuMSAmIGFkai5QLlZhbCA8PSAwLjA1KQprZWVwZXJnZW5lcyA8LSB1bmlxdWUoYyhyb3duYW1lcyhoZXRrZWVwZXJfZ2VuZXMpLCByb3duYW1lcyhrb2tlZXBlcl9nZW5lcykpKQpkZiA8LSBtbV9kZV9ub3JtYWxfcDhfc2NuJGRlc2VxJGFsbF90YWJsZXMka29zY25fdnNfaGV0c2NuICU+JQogIGRwbHlyOjptdXRhdGUobG9nRkMgPSAtbG9nRkMpICU+JQogIHNldF9zaWdfbGltbWEoZmFjdG9ycyA9IGMoIkhldCBFbnJpY2hlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS08gRW5yaWNoZWQiKSkKZGYgPC0gZGYgJT4lCiAgZmlsdGVyKFJvdy5uYW1lcyAlaW4lIGtlZXBlcmdlbmVzKQpsYWJlbHNfdXBzIDwtIGRmICU+JQogIGZpbHRlcihhYnMobG9nRkMpID4gMSkgJT4lCiAgYXJyYW5nZShsb2dGQykgJT4lCiAgaGVhZChuID0gMSkKbGFiZWxzX2Rvd25zIDwtIGRmICU+JQogIGZpbHRlcihhYnMobG9nRkMpID4gMSkgJT4lCiAgYXJyYW5nZSgtbG9nRkMpICU+JQogIGhlYWQobiA9IDEpCmxhYmVscyA8LSByYmluZChsYWJlbHNfdXBzLCBsYWJlbHNfZG93bnMpCnJlc190YmwgPC0gZGYKREVwbG90IDwtIGdncGxvdChyZXNfdGJsLCBhZXMoeCA9IGxvZ0ZDLCB5ID0gLWxvZzEwKGFkai5QLlZhbCksIGxhYmVsID0gZXh0ZXJuYWxfZ2VuZV9uYW1lKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IFNpZ25pZmljYW5jZSksIHNpemUgPSA0KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtMSwgMSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtbG9nMTAoMC4wNSkpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDIwKSArCiAgeGxhYigibG9nMihGQykiKSArCiAgeWxhYigiLWxvZzEwKHAtdmFsdWUpIikgKwogICMjIGdndGl0bGUodGl0bGUsIHN1YnRpdGxlID0gc3VidGl0bGUpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiSGV0IEVucmljaGVkIiA9ICIjRjg3NjZEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktPIEVucmljaGVkIiA9ICIjMDBCRkM0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdFxuIEVucmljaGVkIiA9ICJHcmV5IikpICsKICBnZW9tX2xhYmVsX3JlcGVsKGRhdGE9ZmlsdGVyKGRmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgYygnczVfaGV0X2RsZ24nLCAnczVfaGV0X3JldCcsICdzNV9oZXRfc2NuJykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxfZ2VuZV9uYW1lICVpbiUgbGFiZWxzJGV4dGVybmFsX2dlbmVfbmFtZSksCiAgICAgICAgICAgICAgICAgICAjIyBudWRnZV94ID0gLTAuNSwKICAgICAgICAgICAgICAgICAgIG51ZGdlX3kgPSAzLCBtYXgub3ZlcmxhcHMgPSAxNSkgKwogIGdndGl0bGUoIlNDTiBIZXQgdnMgS08gVHJhbnNsYXRvbWUiKQoKcHAoZmlsZSA9ICJpbWFnZXMvcDA4X3Njbl9ERV8xMzEyMDI0LnBkZiIpCkRFcGxvdApwbG90dGVkIDwtIGRldi5vZmYoKQoKd3JpdGVfeGxzeChkZiwgZXhjZWwgPSAiZXhjZWwvc2NuaGV0X3ZzX3NjbmtvX1dUZmlsdGVyZWQueGxzeCIpCmBgYAoKIyMgSG93IG1hbnkgdXBzL2Rvd25zCgpgYGB7ciwgZXZhbD1GQUxTRX0Ka29fZW5yaWNoZWQgPC0gZGYgJT4lCiAgZmlsdGVyKFNpZ25pZmljYW5jZSA9PSAiS08gRW5yaWNoZWQiKQoKaGV0X2VucmljaGVkIDwtIGRmICU+JQogIGZpbHRlcihTaWduaWZpY2FuY2UgPT0gIkhldCBFbnJpY2hlZCIpCmBgYAoKIyMgR1NFQQoKYGBge3IsIGV2YWw9RkFMU0V9CmtvX2dlbmVzIDwtIHJlc190YmwgJT4lCiAgZmlsdGVyKGFkai5QLlZhbCA8PSAwLjA1KSAlPiUKICBhcnJhbmdlKC1hYnMobG9nRkMpKSAlPiUKICBzZWxlY3QoUm93Lm5hbWVzLCBsb2dGQywgYWRqLlAuVmFsLCBleHRlcm5hbF9nZW5lX25hbWUsIFNpZ25pZmljYW5jZSkgJT4lCiAgZmlsdGVyKGxvZ0ZDIDw9IC0xKQoKaGV0X2dlbmVzIDwtIHJlc190YmwgJT4lCiAgZmlsdGVyKGFkai5QLlZhbCA8PSAwLjA1KSAlPiUKICBhcnJhbmdlKC1hYnMobG9nRkMpKSAlPiUKICBzZWxlY3QoUm93Lm5hbWVzLCBsb2dGQywgYWRqLlAuVmFsLCBleHRlcm5hbF9nZW5lX25hbWUsIFNpZ25pZmljYW5jZSkgJT4lCiAgZmlsdGVyKGxvZ0ZDID49IDEpCgphbGxkeXNyZWd1bGF0ZWRfZ2VuZXMgPC0gcmVzX3RibCAlPiUKICBmaWx0ZXIoYWRqLlAuVmFsIDw9IDAuMDUpICU+JQogIGFycmFuZ2UobG9nRkMpICU+JQogIHNlbGVjdChSb3cubmFtZXMsIGxvZ0ZDLCBhZGouUC5WYWwsIGV4dGVybmFsX2dlbmVfbmFtZSwgU2lnbmlmaWNhbmNlKSAlPiUKICBmaWx0ZXIoYWJzKGxvZ0ZDKSA+PSAxKQoKZ3NlYV9yZXN1bHRfa28gPC0gZ29zdChxdWVyeSA9IGtvX2dlbmVzJGV4dGVybmFsX2dlbmVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzbSA9ICJtbXVzY3VsdXMiLAogICAgICAgICAgICAgICAgICAgICAgIGV2Y29kZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWRfcXVlcnkgPSBUUlVFKQoKZ3NlYV9yZXN1bHRfaGV0IDwtIGdvc3QocXVlcnkgPSBoZXRfZ2VuZXMkZXh0ZXJuYWxfZ2VuZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzbSA9ICJtbXVzY3VsdXMiLAogICAgICAgICAgICAgICAgICAgICAgICBldmNvZGVzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZF9xdWVyeSA9IFRSVUUpCgpnc2VhX3Jlc3VsdF9hbGxkeXNyZWd1bGF0ZWQgPC0gZ29zdChxdWVyeSA9IGFsbGR5c3JlZ3VsYXRlZF9nZW5lcyRleHRlcm5hbF9nZW5lX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2FuaXNtID0gIm1tdXNjdWx1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2Y29kZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkX3F1ZXJ5ID0gVFJVRSkKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0KZ3NlYV9rbyA8LSAgZ3NlYV9yZXN1bHRfa29bWyJyZXN1bHQiXV0gJT4lCiAgc2VsZWN0KHRlcm1fbmFtZSwgcF92YWx1ZSwgdGVybV9zaXplLCBpbnRlcnNlY3Rpb25fc2l6ZSwgcmVjYWxsLCBzb3VyY2UsIGludGVyc2VjdGlvbikgJT4lCiAgYXJyYW5nZShkZXNjKHJlY2FsbCkpICU+JQogIGhlYWQobiA9IDEwKQpnc2VhX3Bsb3RzX2tvIDwtIGdncGxvdChnc2VhX2tvLCBhZXMoeCA9IHJlY2FsbCwgeSA9IHJlb3JkZXIodGVybV9uYW1lLCByZWNhbGwpLCBmaWxsID0gcF92YWx1ZSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfY29udGludW91cyhsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKwogIHlsYWIoIiIpICsKICB4bGFiKCJPdmVyIGVucmljaG1lbnQgU2NvcmUiKQoKZ3NlYV9oZXQgPC0gIGdzZWFfcmVzdWx0X2hldFtbInJlc3VsdCJdXSAlPiUKICBzZWxlY3QodGVybV9uYW1lLCBwX3ZhbHVlLCB0ZXJtX3NpemUsIGludGVyc2VjdGlvbl9zaXplLCByZWNhbGwsIHNvdXJjZSwgaW50ZXJzZWN0aW9uKSAlPiUKICBhcnJhbmdlKGRlc2MocmVjYWxsKSkgJT4lCiAgaGVhZChuID0gMTApCmdzZWFfcGxvdHNfaGV0IDwtIGdncGxvdChnc2VhX2hldCwgYWVzKHggPSByZWNhbGwsIHkgPSByZW9yZGVyKHRlcm1fbmFtZSwgcmVjYWxsKSwgZmlsbCA9IHBfdmFsdWUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsKICB0aGVtZV9idygpICsKICB5bGFiKCIiKSArCiAgeGxhYigiT3ZlciBlbnJpY2htZW50IFNjb3JlIikKCmdzZWFfYWxsIDwtICBnc2VhX3Jlc3VsdF9hbGxkeXNyZWd1bGF0ZWRbWyJyZXN1bHQiXV0gJT4lCiAgc2VsZWN0KHRlcm1fbmFtZSwgcF92YWx1ZSwgdGVybV9zaXplLCBpbnRlcnNlY3Rpb25fc2l6ZSwgcmVjYWxsLCBzb3VyY2UsIGludGVyc2VjdGlvbikgJT4lCiAgYXJyYW5nZShkZXNjKHJlY2FsbCkpICU+JQogIGhlYWQobiA9IDEwKQpnc2VhX3Bsb3RzX2FsbCA8LSBnZ3Bsb3QoZ3NlYV9hbGwsIGFlcyh4ID0gcmVjYWxsLCB5ID0gcmVvcmRlcih0ZXJtX25hbWUsIHJlY2FsbCksIGZpbGwgPSBwX3ZhbHVlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgeWxhYigiIikgKwogIHhsYWIoIk92ZXIgZW5yaWNobWVudCBTY29yZSIpCgpwcChmaWxlID0gImltYWdlcy9HU0VBX3AwOF9yZXRpbmFfYXhvbnRyYXBfYWxsZHlzcmVndWxhdGVkZ2VuZXMucGRmIikKZ3NlYV9wbG90c19hbGwKcGxvdHRlZCA8LSBkZXYub2ZmKCkKYGBgCgojIEhldCBSZXRpbmEgdnMgSGV0IFNDTgoKYGBge3IsIGV2YWw9RkFMU0V9Cm1tMzhfc3Vic2V0MiA8LSBzdWJzZXRfc2UoCiAgbW0zOF9oaXNhdCwKICBzdWJzZXQgPSAiKGJhdGNoID09ICc0JyB8IGJhdGNoID09ICc1JyB8IGJhdGNoID09ICc2JykgJiB0aW1lID09ICdwMDgnICYgZ2Vub3R5cGUgIT0gJ2tvJyAmIGxvY2F0aW9uICE9ICdkbGduJyB8IHNhbXBsZWlkID09ICdpcHJnY18wMyciKQoKbW0zOF9zdWJzZXQyIDwtIHN1YnNldF9zZShtbTM4X3N1YnNldDIsIHN1YnNldCA9ICJzYW1wbGVpZCAhPSAnaXByZ2NfODknIikKbW0zOF9zdWJzZXQyJGRlc2lnbiAlPiUKICBzZWxlY3QoZ2Vub3R5cGUsIGxvY2F0aW9uKSAlPiUKICB0YWJsZSgpCm1tMzhfbm9ybTIgPC0gbm9ybWFsaXplKG1tMzhfc3Vic2V0MiwgZmlsdGVyPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBiYXRjaCA9ICJzdmFzZXEiKQpgYGAKCiMjIFBDQQoKYGBge3IsIGV2YWw9RkFMU0V9Cm1tMzhfbm9ybTIgPC0gc2V0X2JhdGNoZXMobW0zOF9ub3JtMiwgZmFjdCA9ICJsb2NhdGlvbiIpCm1tMzhfbm9ybTIgPC0gc2V0X2NvbmRpdGlvbnMobW0zOF9ub3JtMiwgZmFjdCA9ICJnZW5vdHlwZSIpCnBjYV9ub3JtMiA8LSBwbG90X3BjYShtbTM4X25vcm0yLCBtYXhfb3ZlcmxhcHMgPSA3MCkKcGNhX25vcm0yJHBsb3QKYGBgCgojIyBERQoKYGBge3IsIGV2YWw9RkFMU0V9Cm1tX2RlX3N1YnNldDIgPC0gYWxsX3BhaXJ3aXNlKG1tMzhfc3Vic2V0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYmF0Y2g9InN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsPUZBTFNFLCBkb19lYnNlcT1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fYmFzaWMgPSBGQUxTRSwgZG9fZHJlYW0gPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fbm9pc2VxID0gRkFMU0UsIGRvX2VkZ2VyID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CnJldGluYWtlZXBlcl9nZW5lcyA8LSBtbV9kZV9zdWJzZXQyJGRlc2VxJGFsbF90YWJsZXMkd3RfcmV0aW5hX3ZzX2hldF9yZXRpbmEgJT4lCiAgZmlsdGVyKGxvZ0ZDIDw9IC0wLjEgJiBhZGouUC5WYWwgPD0gMC4wNSkKCnNjbmtlZXBlcl9nZW5lcyA8LSBtbV9kZV9zdWJzZXQyJGRlc2VxJGFsbF90YWJsZXMkd3Rfc2NuX3ZzX2hldF9zY24gJT4lCiAgZmlsdGVyKGxvZ0ZDIDw9IC0wLjEgJiBhZGouUC5WYWwgPD0gMC4wNSkKCmtlZXBlcmdlbmVzIDwtIHVuaXF1ZShjKHJvd25hbWVzKHJldGluYWtlZXBlcl9nZW5lcyksIHJvd25hbWVzKHNjbmtlZXBlcl9nZW5lcykpKQoKYW5ub3RzX3RvX21lcmdlIDwtIG1tX2Fubm90ICU+JQogIHNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGV4dGVybmFsX2dlbmVfbmFtZSkgJT4lCiAgZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIHJvd25hbWVzKG1tX2RlX3N1YnNldDIkZGVzZXEkYWxsX3RhYmxlcyRoZXRfc2NuX3ZzX2hldF9yZXRpbmEpKSAlPiUKICBkaXN0aW5jdCgpCgptbV9kZV9zdWJzZXQyJGRlc2VxJGFsbF90YWJsZXMkaGV0X3Njbl92c19oZXRfcmV0aW5hIDwtIG1lcmdlKAogIG1tX2RlX3N1YnNldDIkZGVzZXEkYWxsX3RhYmxlcyRoZXRfc2NuX3ZzX2hldF9yZXRpbmEsCiAgYW5ub3RzX3RvX21lcmdlLCBieS54ID0gMCwKICBieS55ID0gImVuc2VtYmxfZ2VuZV9pZCIsIGFsbC54ID0gVFJVRSkKCmRmIDwtIG1tX2RlX3N1YnNldDIkZGVzZXEkYWxsX3RhYmxlcyRoZXRfc2NuX3ZzX2hldF9yZXRpbmEgJT4lCiAgbXV0YXRlKFNpZ25pZmljYW5jZSA9IGNhc2Vfd2hlbihsb2dGQyA8PSAtMS4wIH4gIlJldGluYSBFbnJpY2hlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dGQyA+PSAxLjAgfiAiU0NOIEVucmljaGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0ZDID4gLTEuMCAmIGxvZ0ZDIDwgMS4wIH4gIk5vdFxuIEVucmljaGVkIikpCgpkZiA8LSBkZiAlPiUKICBmaWx0ZXIoUm93Lm5hbWVzICVpbiUga2VlcGVyZ2VuZXMpCgpzY25fZW5yaWNoZWQgPC0gZGYgJT4lCiAgZmlsdGVyKGFkai5QLlZhbCA8PSAwLjA1ICYgbG9nRkMgPj0gMS4wKSAlPiUKICBhcnJhbmdlKC1sb2dGQykgJT4lCiAgc2VsZWN0KFJvdy5uYW1lcywgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBsb2dGQywgYWRqLlAuVmFsKSAlPiUKICBtdXRhdGUoU2lnbmlmaWNhbmNlID0gIlNDTiBFbnJpY2hlZCIpICU+JQogIGZpbHRlcihSb3cubmFtZXMgJWluJSByb3duYW1lcyhzY25rZWVwZXJfZ2VuZXMpKQoKcmV0aW5hX2VucmljaGVkIDwtIGRmICU+JQogIGZpbHRlcihhZGouUC5WYWwgPD0gMC4wNSAmIGxvZ0ZDIDw9IC0xLjApICU+JQogIGFycmFuZ2UobG9nRkMpICAlPiUKICBzZWxlY3QoUm93Lm5hbWVzLCBleHRlcm5hbF9nZW5lX25hbWUsIGxvZ0ZDLCBhZGouUC5WYWwpICU+JQogIG11dGF0ZShTaWduaWZpY2FuY2UgPSAiUmV0aW5hIEVucmljaGVkIikgJT4lCiAgZmlsdGVyKFJvdy5uYW1lcyAlaW4lIHJvd25hbWVzKHJldGluYWtlZXBlcl9nZW5lcykpCgpub3RlbnJpY2hlZCA8LSBkZiAlPiUKICBzZWxlY3QoUm93Lm5hbWVzLCBleHRlcm5hbF9nZW5lX25hbWUsIGxvZ0ZDLCBhZGouUC5WYWwsIFNpZ25pZmljYW5jZSkgJT4lCiAgZmlsdGVyKFJvdy5uYW1lcyAlaW4lIGMocm93bmFtZXMocmV0aW5ha2VlcGVyX2dlbmVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhzY25rZWVwZXJfZ2VuZXMpKVtkdXBsaWNhdGVkKGMocm93bmFtZXMocmV0aW5ha2VlcGVyX2dlbmVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93bmFtZXMoc2Nua2VlcGVyX2dlbmVzKSkpXSkgJT4lCiAgZmlsdGVyKFNpZ25pZmljYW5jZSA9PSAiTm90XG4gRW5yaWNoZWQiKQoKZGYgPC0gcmJpbmQoc2NuX2VucmljaGVkLCByZXRpbmFfZW5yaWNoZWQsIG5vdGVucmljaGVkKQpkZiA8LSBkZiAlPiUKICBkaXN0aW5jdCgpCgojIyB3cml0ZXhsOjp3cml0ZV94bHN4KGRmLCBwYXRoID0gImF4b25UUkFQX0RFX3Jlc3VsdHNfMjAyNDAyMDIvcmV0aW5haGV0X3ZzX3Njbl9oZXRfV1RmaWx0ZXJlZC54bHN4IikKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0KbGFiZWxzX3VwcyA8LSBkZiAlPiUKICBmaWx0ZXIoYWRqLlAuVmFsIDw9IDAuMDUgJiBhYnMobG9nRkMpID4gMS4wKSAlPiUKICBhcnJhbmdlKGxvZ0ZDKSAlPiUKICBoZWFkKG4gPSAxMCkKCmxhYmVsc19kb3ducyA8LSBkZiAlPiUKICBmaWx0ZXIoYWRqLlAuVmFsIDw9IDAuMDUgJiBhYnMobG9nRkMpID4gMS4wKSAlPiUKICBhcnJhbmdlKC1sb2dGQykgJT4lCiAgaGVhZChuID0gMTApCgpsYWJlbHMgPC0gcmJpbmQobGFiZWxzX3VwcywgbGFiZWxzX2Rvd25zKQoKbGFiZWxzX3JlcXVlc3RlZCA8LSBjKCJDZGgxMCIsIkNkaDEyIiwiQ2RoMTMiLCJDZGgxOCIsCiAgICAgICAgICAgICAgICAgICAgICAiQ2RoNyIsIkNkaDgiLCJDZGg5IiwiQ250bjMiLAogICAgICAgICAgICAgICAgICAgICAgIkNudG40IiwiQ250bjUiLCJDbnRuNiIsIktpcnJlbDMiLAogICAgICAgICAgICAgICAgICAgICAgIk5yeG4xIiwiTnJ4bjMiLCJTZW1hM2MiLCJTZW1hNmQiLAogICAgICAgICAgICAgICAgICAgICAgIlRlbm0xIiwiVGVubTIiLCJUZW5tNCIpCnJlc190YmwgPC0gZGYKREVwbG90IDwtIGdncGxvdChyZXNfdGJsLCBhZXMoeCA9IGxvZ0ZDLCB5ID0gLWxvZzEwKGFkai5QLlZhbCksIGxhYmVsID0gZXh0ZXJuYWxfZ2VuZV9uYW1lKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IFNpZ25pZmljYW5jZSksIHNpemUgPSA0KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtMSwgMSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtbG9nMTAoMC4wNSkpICsKICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDIwKSArCiAgeGxhYigibG9nMihGQykiKSArCiAgeWxhYigiLWxvZzEwKHAtdmFsdWUpIikgKwogICMjIGdndGl0bGUodGl0bGUsIHN1YnRpdGxlID0gc3VidGl0bGUpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiR3JleSIsICIjRjg3NjZEIiwgIiMwMEJGQzQiKSkgKwogIGdlb21fbGFiZWxfcmVwZWwoZGF0YT1maWx0ZXIoZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbF9nZW5lX25hbWUgJWluJSBsYWJlbHNfcmVxdWVzdGVkKSwKICAgICAgICAgICAgICAgICAgICMjIGMobGFiZWxzJGV4dGVybmFsX2dlbmVfbmFtZSwgIk9wbjQiKSksICNjKCdzNV9oZXRfZGxnbicsICdzNV9oZXRfcmV0JywgJ3M1X2hldF9zY24nKSksCiAgICAgICAgICAgICAgICAgICAjIyBudWRnZV94ID0gLTAuNSwKICAgICAgICAgICAgICAgICAgIG51ZGdlX3kgPSAxNSwgbWF4Lm92ZXJsYXBzID0gMjUpCgojcHAoZmlsZSA9ICJheG9uVFJBUF9Wb2xjYW5vcGxvdHNfMjAyNDAyMDIvcDA4X3JldGluYXZzc2NuaGV0X0RFX3JlcXVlc3RlZF9nZW5lbGFiZWxzXzAyMDUyMDI0LnBkZiIpCkRFcGxvdAojZGV2Lm9mZigpCmBgYAoKIyMgSG93IG1hbnkgdXBzL2Rvd25zCgpgYGB7ciwgZXZhbD1GQUxTRX0Kc2NuX2VucmljaGVkIDwtIGRmICU+JQogIGZpbHRlcihhZGouUC5WYWwgPD0gMC4wNSAmIGxvZ0ZDID49IDEuMCkgJT4lCiAgYXJyYW5nZSgtbG9nRkMpICU+JQogIHNlbGVjdChSb3cubmFtZXMsIGV4dGVybmFsX2dlbmVfbmFtZSwgbG9nRkMsIGFkai5QLlZhbCwgU2lnbmlmaWNhbmNlKQoKcmV0aW5hX2VucmljaGVkIDwtIGRmICU+JQogIGZpbHRlcihhZGouUC5WYWwgPD0gMC4wNSAmIGxvZ0ZDIDw9IC0xLjApICU+JQogIGFycmFuZ2UobG9nRkMpICAlPiUKICBzZWxlY3QoUm93Lm5hbWVzLCBleHRlcm5hbF9nZW5lX25hbWUsIGxvZ0ZDLCBhZGouUC5WYWwsIFNpZ25pZmljYW5jZSkKCnNjbl9lbnJpY2hlZApyZXRpbmFfZW5yaWNoZWQKCmRmICU+JQogIGZpbHRlcihTaWduaWZpY2FuY2UgPT0gIk5vdFxuIEVucmljaGVkIikKYGBgCgojIyBHU0VBCgpgYGB7ciwgZXZhbD1GQUxTRX0KZ3NlYV9yZXN1bHRfc2NuIDwtIGdvc3QocXVlcnkgPSBzY25fZW5yaWNoZWQkZXh0ZXJuYWxfZ2VuZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzbSA9ICJtbXVzY3VsdXMiLCBldmNvZGVzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZF9xdWVyeSA9IFRSVUUsIHNvdXJjZSA9IGMoIkdPIikpCgpnc2VhX3Jlc3VsdF9yZXQgPC0gZ29zdChxdWVyeSA9IHJldGluYV9lbnJpY2hlZCRleHRlcm5hbF9nZW5lX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2FuaXNtID0gIm1tdXNjdWx1cyIsIGV2Y29kZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkX3F1ZXJ5ID0gVFJVRSwgc291cmNlID0gYygiR08iKSkKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0KZ3NlYV9zY24gPC0gIGdzZWFfcmVzdWx0X3NjbltbInJlc3VsdCJdXSAlPiUKICBzZWxlY3QodGVybV9uYW1lLCBwX3ZhbHVlLCB0ZXJtX3NpemUsIGludGVyc2VjdGlvbl9zaXplLCByZWNhbGwsIHNvdXJjZSwgaW50ZXJzZWN0aW9uKSAlPiUKICBhcnJhbmdlKGRlc2MocmVjYWxsKSkgJT4lCiAgaGVhZChuID0gMjApCmdzZWFfcGxvdHNfc2NuIDwtIGdncGxvdChnc2VhX3NjbiwgYWVzKHggPSByZWNhbGwsIHkgPSByZW9yZGVyKHRlcm1fbmFtZSwgcmVjYWxsKSwgZmlsbCA9IHBfdmFsdWUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsKICB0aGVtZV9idygpICsKICB5bGFiKCIiKSArCiAgeGxhYigiT3ZlciBlbnJpY2htZW50IFNjb3JlIikKCnBwKGZpbGUgPSAiaW1hZ2VzL0dTRUFfU0NOaGV0X3ZzX3JldGluYV9lbnJpY2hlZF9QMDgucGRmIikKZ3NlYV9wbG90c19zY24KcGxvdHRlZCA8LSBkZXYub2ZmKCkKCmdzZWFfcmV0IDwtICBnc2VhX3Jlc3VsdF9yZXRbWyJyZXN1bHQiXV0gJT4lCiAgc2VsZWN0KHRlcm1fbmFtZSwgcF92YWx1ZSwgdGVybV9zaXplLCBpbnRlcnNlY3Rpb25fc2l6ZSwgcmVjYWxsLCBzb3VyY2UsIGludGVyc2VjdGlvbikgJT4lCiAgYXJyYW5nZShkZXNjKHJlY2FsbCkpICU+JQogIGhlYWQobiA9IDIwKQpnc2VhX3Bsb3RzX3JldCA8LSBnZ3Bsb3QoZ3NlYV9yZXQsIGFlcyh4ID0gcmVjYWxsLCB5ID0gcmVvcmRlcih0ZXJtX25hbWUsIHJlY2FsbCksIGZpbGwgPSBwX3ZhbHVlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgeWxhYigiIikgKwogIHhsYWIoIk92ZXIgZW5yaWNobWVudCBTY29yZSIpCgpwcChmaWxlID0gImltYWdlcy9HU0VBX1JldGluYWhldF92c19TQ05fZW5yaWNoZWRfUDA4LnBkZiIpCmdzZWFfcGxvdHNfcmV0CnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmBgYAoKIyBLTyBSZXRpbmEgdnMgS08gU0NOCgpgYGB7ciwgZXZhbD1GQUxTRX0KbW0zOF9zdWJzZXQzIDwtIHN1YnNldF9zZSgKICBtbTM4X2hpc2F0LAogIHN1YnNldCA9ICIoYmF0Y2ggPT0gJzQnIHwgYmF0Y2ggPT0gJzUnIHwgYmF0Y2ggPT0gJzYnKSAmIHRpbWUgPT0gJ3AwOCcgICYgZ2Vub3R5cGUgIT0gJ2hldCcgJiBsb2NhdGlvbiAhPSAnZGxnbicgfCBzYW1wbGVpZCA9PSAnaXByZ2NfMDMnIikKCm1tMzhfc3Vic2V0MyA8LSBzdWJzZXRfc2UobW0zOF9zdWJzZXQzLCBzdWJzZXQgPSAic2FtcGxlaWQgIT0gJ2lwcmdjXzg2JyIpCm1tMzhfc3Vic2V0MyRkZXNpZ24gJT4lCiAgc2VsZWN0KGdlbm90eXBlLCBsb2NhdGlvbikgJT4lCiAgdGFibGUoKQptbTM4X25vcm0zIDwtIG5vcm1hbGl6ZShtbTM4X3N1YnNldDMsIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ9ImNwbSIsIHRyYW5zZm9ybT0ibG9nMiIsIGJhdGNoID0gInN2YXNlcSIpCmBgYAoKIyMgUENBCgpgYGB7ciwgZXZhbD1GQUxTRX0KbW0zOF9ub3JtMyA8LSBzZXRfYmF0Y2hlcyhtbTM4X25vcm0zLCBmYWN0ID0gImxvY2F0aW9uIikKbW0zOF9ub3JtMyA8LSBzZXRfY29uZGl0aW9ucyhtbTM4X25vcm0zLCBmYWN0ID0gImdlbm90eXBlIikKcGNhX25vcm0zIDwtIHBsb3RfcGNhKG1tMzhfbm9ybTMsIG1heF9vdmVybGFwcyA9IDcwKQpwY2Ffbm9ybTMkcGxvdApgYGAKCiMjIERFCgpgYGB7ciwgZXZhbD1GQUxTRX0KbW1fZGVfc3Vic2V0MyA8LSBhbGxfcGFpcndpc2UobW0zOF9zdWJzZXQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWxsZWw9RkFMU0UsIGRvX2Vic2VxPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19iYXNpYyA9IEZBTFNFLCBkb19kcmVhbSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19ub2lzZXEgPSBGQUxTRSwgZG9fZWRnZXIgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSkKCnJldGluYWtlZXBlcl9nZW5lcyA8LSBtbV9kZV9zdWJzZXQzJGRlc2VxJGFsbF90YWJsZXMkd3RyZXRpbmFfdnNfa29yZXRpbmEgJT4lCiAgZmlsdGVyKGxvZ0ZDIDw9IC0xLjAgJiBhZGouUC5WYWwgPD0gMC4wNSkKCnNjbmtlZXBlcl9nZW5lcyA8LSBtbV9kZV9zdWJzZXQzJGRlc2VxJGFsbF90YWJsZXMkd3RzY25fdnNfa29zY24gJT4lCiAgZmlsdGVyKGxvZ0ZDIDw9IC0xLjAgJiBhZGouUC5WYWwgPD0gMC4wNSkKCmtlZXBlcmdlbmVzIDwtIHVuaXF1ZShjKHJvd25hbWVzKHJldGluYWtlZXBlcl9nZW5lcyksIHJvd25hbWVzKHNjbmtlZXBlcl9nZW5lcykpKQoKYW5ub3RzX3RvX21lcmdlIDwtIG1tX2Fubm90ICU+JQogIHNlbGVjdChlbnNlbWJsX2dlbmVfaWQsIGV4dGVybmFsX2dlbmVfbmFtZSkgJT4lCiAgZmlsdGVyKGVuc2VtYmxfZ2VuZV9pZCAlaW4lIHJvd25hbWVzKG1tX2RlX3N1YnNldDMkZGVzZXEkYWxsX3RhYmxlcyRrb19zY25fdnNfa29fcmV0aW5hKSkgJT4lCiAgZGlzdGluY3QoKQoKbW1fZGVfc3Vic2V0MyRkZXNlcSRhbGxfdGFibGVzJGtvX3Njbl92c19rb19yZXRpbmEgPC0gbWVyZ2UoCiAgbW1fZGVfc3Vic2V0MyRkZXNlcSRhbGxfdGFibGVzJGtvX3Njbl92c19rb19yZXRpbmEsCiAgYW5ub3RzX3RvX21lcmdlLCBieS54ID0gMCwKICBieS55ID0gImVuc2VtYmxfZ2VuZV9pZCIsIGFsbC54ID0gVFJVRSkKCmRmIDwtIG1tX2RlX3N1YnNldDMkZGVzZXEkYWxsX3RhYmxlcyRrb19zY25fdnNfa29fcmV0aW5hICU+JQogIG11dGF0ZShTaWduaWZpY2FuY2UgPSBjYXNlX3doZW4obG9nRkMgPD0gLTEgfiAiUmV0aW5hIEVucmljaGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0ZDID49IDEgfiAiU0NOIEVucmljaGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0ZDID4gLTEgJiBsb2dGQyA8IDEgfiAiTm90XG4gRW5yaWNoZWQiKSkKCmRmIDwtIGRmICU+JQogIGZpbHRlcihSb3cubmFtZXMgJWluJSBrZWVwZXJnZW5lcykKCnNjbl9lbnJpY2hlZCA8LSBkZiAlPiUKICBmaWx0ZXIoYWRqLlAuVmFsIDw9IDAuMDUgJiBsb2dGQyA+PSAxKSAlPiUKICBhcnJhbmdlKC1sb2dGQykgJT4lCiAgc2VsZWN0KFJvdy5uYW1lcywgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBsb2dGQywgYWRqLlAuVmFsKSAlPiUKICBtdXRhdGUoU2lnbmlmaWNhbmNlID0gIlNDTiBFbnJpY2hlZCIpICU+JQogIGZpbHRlcihSb3cubmFtZXMgJWluJSByb3duYW1lcyhzY25rZWVwZXJfZ2VuZXMpKQoKZGYgJT4lCiAgZmlsdGVyKGFkai5QLlZhbCA8PSAwLjA1ICYgbG9nRkMgPD0gLTEpICU+JQogIGFycmFuZ2UobG9nRkMpICAlPiUKICBzZWxlY3QoUm93Lm5hbWVzLCBleHRlcm5hbF9nZW5lX25hbWUsIGxvZ0ZDLCBhZGouUC5WYWwpICU+JQogIG11dGF0ZShTaWduaWZpY2FuY2UgPSAiUmV0aW5hIEVucmljaGVkIikgJT4lCiAgZmlsdGVyKFJvdy5uYW1lcyAlaW4lIHJvd25hbWVzKHJldGluYWtlZXBlcl9nZW5lcykpIC0+IHJldGluYV9lbnJpY2hlZAoKbm90ZW5yaWNoZWQgPC0gZGYgJT4lCiAgc2VsZWN0KFJvdy5uYW1lcywgZXh0ZXJuYWxfZ2VuZV9uYW1lLCBsb2dGQywgYWRqLlAuVmFsLCBTaWduaWZpY2FuY2UpICU+JQogIGZpbHRlcihSb3cubmFtZXMgJWluJSBjKHJvd25hbWVzKHJldGluYWtlZXBlcl9nZW5lcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93bmFtZXMoc2Nua2VlcGVyX2dlbmVzKSlbZHVwbGljYXRlZChjKHJvd25hbWVzKHJldGluYWtlZXBlcl9nZW5lcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd25hbWVzKHNjbmtlZXBlcl9nZW5lcykpKV0pCgpkZiA8LSByYmluZChzY25fZW5yaWNoZWQsIHJldGluYV9lbnJpY2hlZCwgbm90ZW5yaWNoZWQpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CmxhYmVsc191cHMgPC0gZGYgJT4lCiAgZmlsdGVyKGFkai5QLlZhbCA8PSAwLjA1ICYgYWJzKGxvZ0ZDKSA+IDEpICU+JQogIGFycmFuZ2UobG9nRkMpICU+JQogIGhlYWQobiA9IDEwKQoKbGFiZWxzX2Rvd25zIDwtIGRmICU+JQogIGZpbHRlcihhZGouUC5WYWwgPD0gMC4wNSAmIGFicyhsb2dGQykgPiAxKSAlPiUKICBhcnJhbmdlKC1sb2dGQykgJT4lCiAgaGVhZChuID0gMTApCgpsYWJlbHMgPC0gcmJpbmQobGFiZWxzX3VwcywgbGFiZWxzX2Rvd25zKQojIyB3YW50ZWRfY29sdW1uIDwtICJTaWduaWZpY2FuY2UiCgpyZXNfdGJsIDwtIGRmCkRFcGxvdCA8LSBnZ3Bsb3QocmVzX3RibCwgYWVzKHggPSBsb2dGQywgeSA9IC1sb2cxMChhZGouUC5WYWwpLCBsYWJlbCA9IGV4dGVybmFsX2dlbmVfbmFtZSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBTaWduaWZpY2FuY2UpLCBzaXplID0gNCkgKwogICMjIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9ICEhc3ltKHdhbnRlZF9jb2x1bW4pKSwgc2l6ZSA9IDQpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC0xLCAxKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC1sb2cxMCgwLjA1KSkgKwogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMjApICsKICB4bGFiKCJsb2cyKEZDKSIpICsKICB5bGFiKCItbG9nMTAocC12YWx1ZSkiKSArCiAgIyMgZ2d0aXRsZSh0aXRsZSwgc3VidGl0bGUgPSBzdWJ0aXRsZSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiR3JleSIsICIjRjg3NjZEIiwgIiMwMEJGQzQiKSkgKwogIGdlb21fbGFiZWxfcmVwZWwoZGF0YSA9IGZpbHRlcigKICAgIGRmLCBleHRlcm5hbF9nZW5lX25hbWUgJWluJSBjKGxhYmVscyRleHRlcm5hbF9nZW5lX25hbWUsICJPcG40IikpLAogICAgIyMgYygnczVfaGV0X2RsZ24nLCAnczVfaGV0X3JldCcsICdzNV9oZXRfc2NuJykpLAogICAgIyMgbnVkZ2VfeCA9IC0wLjUsCiAgICBudWRnZV95ID0gMTAsIG1heC5vdmVybGFwcyA9IDI1KQoKcHAoZmlsZSA9ICJpbWFnZXMvcDA4X3JldGluYXZzc2Nua29fREVfMTMxMjAyNC5wZGYiKQpERXBsb3QKcGxvdHRlZCA8LSBkZXYub2ZmKCkKYGBgCgojIyBIb3cgbWFueSB1cHMvZG93bnMKCmBgYHtyLCBldmFsPUZBTFNFfQpzY25fZW5yaWNoZWQKcmV0aW5hX2VucmljaGVkCm5vdGVucmljaGVkICU+JQogIGZpbHRlcihTaWduaWZpY2FuY2UgPT0gIk5vdFxuIEVucmljaGVkIikKYGBgCgojIyBHU0VBCgpgYGB7ciwgZXZhbD1GQUxTRX0KZ3NlYV9yZXN1bHRfc2NuIDwtIGdvc3QocXVlcnkgPSBzY25fZW5yaWNoZWQkZXh0ZXJuYWxfZ2VuZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzbSA9ICJtbXVzY3VsdXMiLAogICAgICAgICAgICAgICAgICAgICAgICBldmNvZGVzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZF9xdWVyeSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IGMoIkdPIikpCgpnc2VhX3Jlc3VsdF9yZXQgPC0gZ29zdChxdWVyeSA9IHJldGluYV9lbnJpY2hlZCRleHRlcm5hbF9nZW5lX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2FuaXNtID0gIm1tdXNjdWx1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGV2Y29kZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkX3F1ZXJ5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gYygiR08iKSkKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0KZ3NlYV9zY24gPC0gIGdzZWFfcmVzdWx0X3NjbltbInJlc3VsdCJdXSAlPiUKICBzZWxlY3QodGVybV9uYW1lLCBwX3ZhbHVlLCB0ZXJtX3NpemUsIGludGVyc2VjdGlvbl9zaXplLCByZWNhbGwsIHNvdXJjZSwgaW50ZXJzZWN0aW9uKSAlPiUKICBhcnJhbmdlKGRlc2MocmVjYWxsKSkgJT4lCiAgaGVhZChuID0gMjApCmdzZWFfcGxvdHNfc2NuIDwtIGdncGxvdChnc2VhX3NjbiwgYWVzKHggPSByZWNhbGwsIHkgPSByZW9yZGVyKHRlcm1fbmFtZSwgcmVjYWxsKSwgZmlsbCA9IHBfdmFsdWUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobG93ID0gImJsdWUiLCBoaWdoID0gInJlZCIpICsKICB0aGVtZV9idygpICsKICB5bGFiKCIiKSArCiAgeGxhYigiR1NFQSBTY29yZSIpCgpwcChmaWxlID0gImltYWdlcy9HU0VBX1NDTmtvX2VucmljaGVkX3ZzX3JldGluYV9QMDgucGRmIikKZ3NlYV9wbG90c19zY24KcGxvdHRlZCA8LSBkZXYub2ZmKCkKCmdzZWFfcmV0IDwtICBnc2VhX3Jlc3VsdF9yZXRbWyJyZXN1bHQiXV0gJT4lCiAgc2VsZWN0KHRlcm1fbmFtZSwgcF92YWx1ZSwgdGVybV9zaXplLCBpbnRlcnNlY3Rpb25fc2l6ZSwgcmVjYWxsLCBzb3VyY2UsIGludGVyc2VjdGlvbikgJT4lCiAgYXJyYW5nZShkZXNjKHJlY2FsbCkpICU+JQogIGhlYWQobiA9IDIwKQpnc2VhX3Bsb3RzX3JldCA8LSBnZ3Bsb3QoZ3NlYV9yZXQsIGFlcyh4ID0gcmVjYWxsLCB5ID0gcmVvcmRlcih0ZXJtX25hbWUsIHJlY2FsbCksIGZpbGwgPSBwX3ZhbHVlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxvdyA9ICJibHVlIiwgaGlnaCA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArCiAgeWxhYigiIikgKwogIHhsYWIoIkdTRUEgU2NvcmUiKQoKcHAoZmlsZSA9ICJpbWFnZXMvR1NFQV9SZXRpbmFrb19lbnJpY2hlZF92c19TQ05fUDA4LnBkZiIpCmdzZWFfcGxvdHNfcmV0CnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmBgYAoKIyBNeSB2ZXJzaW9uIG9mIHRoZSBnbG9iYWwgYW5hbHlzaXMKCkkgd2FudCB0byBoYXZlIGFuIGludm9jYXRpb24gb2YgYWxsX3BhaXJ3aXNlKCkgd2hpY2ggdXNlcyBhbGwgc2FtcGxlcywKaW4gdGhlIGZvbGxvd2luZyBibG9jayBJIHdpbGwgc2V0IHRoYXQgdXAgdXNpbmcgYSBzZXQgb2YgJ2tlZXBlcnMnCndoaWNoIHdpbGwgYmUgbmFtZWQgYnkgdGltZSwgbG9jYXRpb24sIHRoZW4gMiBsZXR0ZXJzIGZvciB0aGUKbnVtZXJhdG9yL2Rlbm9taW5hdG9yOiB3IGZvciBXVCwgaCBmb3IgaGV0LCBkIGZvciBkZWx0YTsgdGh1cwoicDA4X3JldGluYV9odyIgaXMgY29tcGFyaW5nIHRoZSBoZXQvd3QgZm9yIHRoZSBwMDggcmV0aW5hIHNhbXBsZXMuCgpJZiB0aGV5IGFyZSBvZiBpbnRlcmVzdCwgSSB3aWxsIGhhdmUgYSBzZXBhcmF0ZSBzZXQgd2hpY2ggZm9sbG93cyB0aGUKc2FtZSBjb252ZW50aW9uIHdpdGggbmFtZXMgbGlrZSAicDA4X2tvX3NyIiB0byBjb21wYXJlIHAwOCBkZWx0YXMgd2l0aApTQ04gYXMgdGhlIG51bWVyYXRvciBhbmQgcmV0aW5hIGFzIHRoZSBkZW5vbWluYXRvci4KCiMjIFNldCB1cCB0aGUgZXhjbHVzaW9uIGRhdGFzZXQKClRoZSBtb3N0IHBlY3VsaWFyIGFzcGVjdCBvZiB0aGlzIGFuYWx5c2lzIHJlc2lkZXMgaW4gdGhlIGNob2ljZXMKYXJvdW5kIGNob29zaW5nIHdoaWNoIGdlbmVzIHRvIGNvbnNpZGVyIHdoZW4gY29tcGFyaW5nIHRoZQpnZW5vdHlwZXMvbG9jYXRpb25zL3RpbWVzLiAgVGhlIGdlbmVyYWwgaWRlYSBpcyBwcmV0dHkgY2xlYXI6IGZpbmQgdGhlCmdlbmVzIHdoaWNoIGFyZSBub24tc3BlY2lmaWNhbGx5IGJlaW5nIHB1bGxlZCBkb3duIGluIHRoZSBXVCBzYW1wbGVzCmFuZCBlaXRoZXIgZXhjbHVkZSBvciBkaXNjb3VudCB0aGVtLiAgVGhlIHZhcmlvdXMgcG90ZW50aWFsIG1ldGhvZHMKZm9yIHBlcmZvcm1pbmcgdGhpcyBhcmUgY29uZnVzaW5nOgoKMS4gIFdoaWNoIHNldCBvZiBjb21wYXJpc29ucyBvZiB3dC9rbyB3dC9oZXQgZG8gd2UgdXNlIHRvCiAgICBleGNsdWRlL2Rpc2NvdW50IGdlbmVzPwogICAgYS4gIFNob3VsZCBpdCBiZSBhIGNvbWJpbmF0aW9uIG9mIGFsbCBzYW1wbGVzIHd0IHZzLiB4PwogICAgYi4gIFNob3VsZCBpdCBiZSBvbmx5IHRoZSAncmVsZXZhbnQnIGNvbXBhcmlzb24sIGUuZy4gaWYgd2UgYXJlCiAgICBjb21wYXJpbmcgcDA4X2RsZ25faGV0IHZzLiBwMDhfc2NuX2hldDsgZG8gd2UgcmVtb3ZlIGdlbmVzCiAgICBvYnNlcnZlZCBpbiAocDA4X2RsZ25faGV0L3d0ICYmIHAwOF9zY25faGV0L3d0KQoyLiAgRG8gd2UgaW5zdGVhZCBhdHRlbXB0IHRvIHVzZSB0aGlzIHgvd3QgaW5mb3JtYXRpb24gdG8gbm9ybWFsaXplCiAgICB0aGUgZXhwcmVzc2lvbiB2YWx1ZXMgaW4gdGhlIG90aGVyIGNvbmRpdGlvbnMgYW5kIGtlZXAgdGhvc2UKICAgIGdlbmVzPwoKVGhlcmVzYSdzIGN1cnJlbnQgd29ya3NoZWV0IGltcGxlbWVudHMgYSB2ZXJzaW9uIG9mIDFiIGluIHdoaWNoIHNoZQpzZXBhcmF0ZWQgdGhlIHZhcmlvdXMgaW5wdXQgZ2VuZSBzZXRzIHRvIGRlZmluZSB0aGUgZXhjbHVzaW9uIGdlbmVzLgpJIGFtIGdvaW5nIHRvIHJlcGVhdCB0aGlzLCBidXQgbGVhdmUgdGhlIHN0YXJ0aW5nIGRhdGEgc3RydWN0dXJlCmludGFjdC4KCkluIHRoaXMgZmlyc3QgaXRlcmF0aW9uLCBJIHdpbGwgZG8gdGhhdCBieSBjcmVhdGluZyBhIHNpbXBsaWZpZWQgbW9kZWwKb2YgdGhlIGRhdGEgd2hpY2ggY29tYmluZXMgdGhlIHRpbWUvZ2Vub3R5cGUvbG9jYXRpb24gYW5kIHVzaW5nIHN2YS4KSW4gbXkgbmV4dCBpdGVyYXRpb24gSSB3aWxsIHVzZSBhIGZ1bGwgc3RhdGlzdGljYWwgbW9kZWwgY29udGFpbmluZwplYWNoIG9mIHRob3NlIGZhY3RvcnMgKGFuZCBwcm9iYWJseSBhbHNvIHVzaW5nIHN2YSkuCgpOb3RlOiBteSBjb2xvciBjaG9pY2VzIGFyZSBraW5kIG9mIGdhcmJhZ2UuCgpJbiBhZGRpdGlvbiwgdGhlIGV4Y2x1c2lvbiBkYXRhc2V0IGlzIHRoZSBzYW1lIGFzIHRoZSBhbmFseXNpcwpkYXRhc2V0LCBpdCBpcyByZWFsbHkgb25seSB0aGUgY29udHJhc3RzIHdoaWNoIHdpbGwgYmUgZGlmZmVyZW50LgoKYGBge3J9CnYzX3BhaXJ3aXNlX2lucHV0IDwtIHNldF9jb25kaXRpb25zKG1tMzhfaGlzYXRfdjMsIGZhY3QgPSAidGltZV9nZW5vX2xvYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IGNvbG9yX2Nob2ljZXNbWyJhbGwiXV0pCmBgYAoKIyMgQSBoZWF0bWFwIG9mIHNwZWNpZmljIGdlbmVzIGFjcm9zcyBhbGwgY29uZGl0aW9ucwoKYGBge3J9CmFsbF9jb25kX2dlbmVfaGVhdG1hcF9zdGFydCA8LSBub3JtYWxpemUodjNfcGFpcndpc2VfaW5wdXQsIGZpbHRlciA9ICJzaW1wbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF9jb2x1bW4gPSAiY2RzX2xlbmd0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydCA9ICJycGttIiwgdHJhbnNmb3JtID0gImxvZzIiKQphbGxfY29uZF9nZW5lX2hlYXRtYXBfaW5wdXQgPC0gbWVkaWFuX2J5X2ZhY3RvcihhbGxfY29uZF9nZW5lX2hlYXRtYXBfc3RhcnQpCmFsbF9jb25kX210cnggPC0gYWxsX2NvbmRfZ2VuZV9oZWF0bWFwX2lucHV0W1sibWVkaWFucyJdXQpjb2xvcl9vcmRlciA8LSBjb2xuYW1lcyhhbGxfY29uZF9tdHJ4KQpuYV9pZHggPC0gaXMubmEoYWxsX2NvbmRfbXRyeCkKYWxsX2NvbmRfbXRyeFtuYV9pZHhdIDwtIDAKdmFyaWFuY2VzIDwtIG1hdHJpeFN0YXRzOjpyb3dWYXJzKGFzLm1hdHJpeChhbGxfY29uZF9tdHJ4KSkKdmFyaWFudF9nZW5lcyA8LSB2YXJpYW5jZXMgPiA2LjIKaW5wdXRfbXRyeCA8LSBhbGxfY29uZF9tdHJ4W3ZhcmlhbnRfZ2VuZXMsIF0KY29uZF9jb2xvcnMgPC0gZ2V0X2NvbG9yc19ieV9jb25kaXRpb24odjNfcGFpcndpc2VfaW5wdXQsIGxldmVscyA9IGNvbG9yX29yZGVyKQpkaW0oaW5wdXRfbXRyeCkKcHAoZmlsZSA9ICIwNGluY2x1c2lvbl9jb21wYXJpc29ucy90b3BfMTA0X3ZhcmlhbnRfcnBrbV9nZW5lc19oZWF0bWFwLnBkZiIpCmdwbG90czo6aGVhdG1hcC4yKGFzLm1hdHJpeChpbnB1dF9tdHJ4KSwgc2NhbGUgPSAibm9uZSIsIHRyYWNlID0gIm5vbmUiLAogICAgICAgICAgICAgICAgICBDb2xTaWRlQ29sb3JzID0gY29uZF9jb2xvcnMpCmRldi5vZmYoKQpgYGAKCiMgVE9ETzogQ2hhbmdlIHRoZSBhYm92ZSB0byBzdWJ0cmFjdCB3dAoKUmFzaG1pIHN1Z2dlc3RlZCB3ZSBzaG91bGQgZG8gdGhlIGFib3ZlIHBsb3QgYWZ0ZXIgc3VidHJhY3RpbmcgdGhlIHd0CmNvdW50cy4gIFRoaXMgaXMgYSBnb29kIGlkZWEsIGJ1dCBpdCB3aWxsIGhhdmUgdG8gd2FpdCB1bnRpbCB3ZSBmaW5pc2gKdGhlIGN1cnJlbnQgc2V0LgoKIyMgU2V0IHVwIHRoZSBjb250cmFzdHMKCkluIHRoZSBmb2xsb3dpbmcgZmV3IGJsb2NrcyBJIHdpbGwgc2V0IHVwIHRoZSB2YXJpb3VzIGNvbXBhcmlzb25zIG9mCmludGVyZXN0LiAgU3RhcnRpbmcgd2l0aCB0aGUgc2V0IG9mIGdlbmVzIHRvIGV4Y2x1ZGUgYmVjYXVzZSB0aGV5IHdlcmUKb2JzZXJ2ZWQgdG8gYmluZCBub24tc3BlY2lmaWNhbGx5IGluIHRoZSB3dCBzYW1wbGVzLgoKIyMjIEluY2x1c2lvbiBjb250cmFzdHMKCkluIGVhY2ggZXhjbHVzaW9uIEkgd2lsbCBoYXZlIHRoZSBjb250cmFzdCBmaXJzdCBmb2xsb3dlZCBieSB0aGUgcGFpcgpvZiBjb250cmFzdHMgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGRlZmluZSB0aGUgZ2VuZSBzZXQgdG8gZXhjbHVkZS4KCiogcDE1X2hldF9kbGduL3AwOF9oZXRfZGxnbjogcDE1X3d0X2RsZ24vcDE1X2hldF9kbGduLAogIHAwOF93dF9kbGduL3AwOF9oZXRfZGxnbjsgcmVtb3ZlIHRoZSBnZW5lcyBpbmNyZWFzZWQgaW4gd3QuCiogcDE1X2tvX3Njbi9wMDhfa29fc2NuOiBwMTVfd3Rfc2NuL3AxNV9rb19zY24sIHAwOF93dF9zY24vcDE1X2tvX3NjbgoqIHAxNV9oZXRfcmV0aW5hL3AwOF9oZXRfcmV0aW5hOiBJIHRoaW5rIHlvdSBnZXQgaXQsIHd0L2hldCBmb3IgYm90aAogIHAxNSByZXRpbmFzIGFuZCBwMDggcmV0aW5hcy4uLgoKUHV0IHNsaWdodGx5IGRpZmZlcmVudGx5LCBmb3IgZXZlcnkgdGVybSBvZiBpbnRlcmVzdCBJIHdpbGwgY3JlYXRlIGEKY29udHJhc3Qgd2l0aCB0aGUgd3QgYXMgbnVtZXJhdG9yIGFuZCB0aGUgZGVzaXJlZCB0ZXJtIGFzIGRlbm9taW5hdG9yLAp0aGVuIHB1bGwgb3V0IHRoZSBnZW5lcyBpbmNyZWFzZWQgaW4gd3QuCgpgYGB7cn0KaW5jbHVzaW9ucyA8LSBsaXN0KAogICMjIEkgbGlrZSBhbHBoYWJldGl6aW5nIHRoaW5ncywgc3RhcnQgd2l0aCBkbGduCiAgInAxNV9oZXRfZGxnbiIgPSBjKCJwMTVfaGV0X2RsZ24iLCAicDE1X3d0X2RsZ24iKSwKICAicDA4X2hldF9kbGduIiA9IGMoInAwOF9oZXRfZGxnbiIsICJwMDhfd3RfZGxnbiIpLAogICJwMTVfa29fZGxnbiIgPSBjKCJwMTVfa29fZGxnbiIsICJwMTVfd3RfZGxnbiIpLAogICJwMDhfa29fZGxnbiIgPSBjKCJwMDhfa29fZGxnbiIsICJwMDhfd3RfZGxnbiIpLAogICMjIFRoZW4gcmV0aW5hcwogICJwMTVfaGV0X3JldGluYSIgPSBjKCJwMTVfaGV0X3JldGluYSIsICJwMTVfd3RfcmV0aW5hIiksCiAgInAwOF9oZXRfcmV0aW5hIiA9IGMoInAwOF9oZXRfcmV0aW5hIiwgInAwOF93dF9yZXRpbmEiKSwKICAicDE1X2tvX3JldGluYSIgPSBjKCJwMTVfa29fcmV0aW5hIiwgInAxNV93dF9yZXRpbmEiKSwKICAicDA4X2tvX3JldGluYSIgPSBjKCJwMDhfa29fcmV0aW5hIiwgInAwOF93dF9yZXRpbmEiKSwKICAjIyBUaGVuIHNjbgogICJwMTVfaGV0X3NjbiIgPSBjKCJwMTVfaGV0X3NjbiIsICJwMTVfd3Rfc2NuIiksCiAgInAwOF9oZXRfc2NuIiA9IGMoInAwOF9oZXRfc2NuIiwgInAwOF93dF9zY24iKSwKICAicDE1X2tvX3NjbiIgPSBjKCJwMTVfa29fc2NuIiwgInAxNV93dF9zY24iKSwKICAicDA4X2tvX3NjbiIgPSBjKCJwMDhfa29fc2NuIiwgInAwOF93dF9zY24iKSkKYGBgCgojIyMgVGltZSBjb250cmFzdHMKCkZvciBlYWNoIGxvY2F0aW9uL2dlbm90eXBlIG9mIGludGVyZXN0LCBsZXQgdXMgY29tcGFyZSBwMTUvcDA4CgpgYGB7cn0KdGltZV9rZWVwZXJzIDwtIGxpc3QoCiAgIyMgRExHTgogICJ0X2hldF9kbGduIiA9IGMoInAxNV9oZXRfZGxnbiIsICJwMDhfaGV0X2RsZ24iKSwKICAidF9rb19kbGduIiA9IGMoInAxNV9rb19kbGduIiwgInAwOF9rb19kbGduIiksCiAgIyMgUmV0aW5hCiAgInRfaGV0X3JldGluYSIgPSBjKCJwMTVfaGV0X3JldGluYSIsICJwMDhfaGV0X3JldGluYSIpLAogICJ0X2tvX3JldGluYSIgPSBjKCJwMTVfa29fcmV0aW5hIiwgInAwOF9rb19yZXRpbmEiKSwKICAjIyBTQ04KICAidF9oZXRfc2NuIiA9IGMoInAxNV9oZXRfc2NuIiwgInAwOF9oZXRfc2NuIiksCiAgInRfa29fc2NuIiA9IGMoInAxNV9rb19zY24iLCAicDA4X2tvX3NjbiIpKQpgYGAKCiMjIyBMb2NhdGlvbiBjb250cmFzdHMKCkNvbXBhcmUgbG9jYXRpb25zIGFuZCBrZWVwIHRpbWUvZ2Vub3R5cGUgY29uc2lzdGVudC4gIEkgd2lsbCB1c2UgdGhlCmxvY2F0aW9uIGluaXRpYWxzIHRvIGRlZmluZSBudW1lcmF0b3IvZGVub21pbmF0b3IuCgpgYGB7cn0KbG9jYXRpb25fa2VlcGVycyA8LSBsaXN0KAogICMjIGRsZ24vcmV0aW5hCiAgImRyX3AwOF9oZXQiID0gYygicDA4X2hldF9kbGduIiwgInAwOF9oZXRfcmV0aW5hIiksCiAgImRyX3AxNV9oZXQiID0gYygicDE1X2hldF9kbGduIiwgInAxNV9oZXRfcmV0aW5hIiksCiAgImRyX3AwOF9rbyIgPSBjKCJwMDhfa29fZGxnbiIsICJwMDhfa29fcmV0aW5hIiksCiAgImRyX3AxNV9rbyIgPSBjKCJwMTVfa29fZGxnbiIsICJwMTVfa29fcmV0aW5hIiksCiAgIyMgc2NuL3JldGluYQogICJzcl9wMDhfaGV0IiA9IGMoInAwOF9oZXRfc2NuIiwgInAwOF9oZXRfcmV0aW5hIiksCiAgInNyX3AxNV9oZXQiID0gYygicDE1X2hldF9zY24iLCAicDE1X2hldF9yZXRpbmEiKSwKICAic3JfcDA4X2tvIiA9IGMoInAwOF9rb19zY24iLCAicDA4X2tvX3JldGluYSIpLAogICJzcl9wMTVfa28iID0gYygicDE1X2tvX3NjbiIsICJwMTVfa29fcmV0aW5hIiksCiAgIyMgZGxnbi9zY24KICAiZHNfcDA4X2hldCIgPSBjKCJwMDhfaGV0X2RsZ24iLCAicDA4X2hldF9zY24iKSwKICAiZHNfcDE1X2hldCIgPSBjKCJwMTVfaGV0X2RsZ24iLCAicDE1X2hldF9zY24iKSwKICAiZHNfcDA4X2tvIiA9IGMoInAwOF9rb19kbGduIiwgInAwOF9rb19zY24iKSwKICAiZHNfcDE1X2tvIiA9IGMoInAxNV9rb19kbGduIiwgInAxNV9rb19zY24iKSkKYGBgCgojIyMgR2Vub3R5cGUgY29udHJhc3RzCgpDb21wYXJlIGtvL2hldCB3aGlsZSBrZWVwaW5nIHRpbWUvbG9jYXRpb24gY29uc3RhbnQuICBTaW1pbGFybHksIHVzZQp0aGUgaW5pdGlhbHMgdG8gZGVub3RlIG51bWVyYXRvci9kZW5vbWluYXRvciwgd2hpY2ggd2lsbCBhbHdheXMgYmUga2guCgpgYGB7cn0KZ2Vub3R5cGVfa2VlcGVycyA8LSBsaXN0KAogICMjIERMR04KICAia2hfcDA4X2RsZ24iID0gYygicDA4X2tvX2RsZ24iLCAicDA4X2hldF9kbGduIiksCiAgImtoX3AxNV9kbGduIiA9IGMoInAxNV9rb19kbGduIiwgInAxNV9oZXRfZGxnbiIpLAogICMjIFJldGluYQogICJraF9wMDhfcmV0aW5hIiA9IGMoInAwOF9rb19yZXRpbmEiLCAicDA4X2hldF9yZXRpbmEiKSwKICAia2hfcDE1X3JldGluYSIgPSBjKCJwMTVfa29fcmV0aW5hIiwgInAxNV9oZXRfcmV0aW5hIiksCiAgIyMgU0NOCiAgImtoX3AwOF9zY24iID0gYygicDA4X2tvX3NjbiIsICJwMDhfaGV0X3NjbiIpLAogICJraF9wMTVfc2NuIiA9IGMoInAxNV9rb19zY24iLCAicDE1X2hldF9zY24iKSkKYGBgCgojIyBQZXJmb3JtIHRoZSBleGNsdXNpb24gY29tcGFyaXNvbgoKTXkgYWxsX3BhaXJ3aXNlKCkgZnVuY3Rpb24gbm93IGhhcyBhIHBhcmFtZXRlciB3aGljaCBhbGxvd3MgbWUgdG8KY2hvb3NlIHdoaWNoIGNvbnRyYXN0cyB0byBwZXJmb3JtIGluc3RlYWQgb2YgbGl0ZXJhbGx5IGRvaW5nIGV2ZXJ5CnBvc3NpYmxlIGNvbXBhcmlzb24uICBUaGF0IGlzIHdlbGwgc3VpdGVkIGZvciB0aGVzZSBvcGVyYXRpb25zOgoKSW4gYSBjb250YWluZXIsIHRoZSBmb2xsb3dpbmcgYXBwZWFycyB0byBmYWlsIHdpdGg6CgoiZXJyb3IgY29kZSAxIGZyb20gTGFwYWNrIHJvdXRpbmUgJ2RnZXNkZCciCgpSdW5uaW5nIGl0IG1hbnVhbGx5IG91dHNpZGUgdGhlIGNvbnRhaW5lciByZXN1bHRzIGluIGl0IHdvcmtpbmcKd2l0aG91dCBlcnJvci4gIEkgYXNzdW1lIHRoZXJlZm9yZSB0aGF0IHRoZSBwcm9ibGVtIGxpZXMgaW4gdGhlCmNvbXBpbGF0aW9uIGZsYWdzIG9mIExBUEFDSyBpbiB0aGUgY29udGFpbmVyLgoKTm90ZTogVGhpcyBwcm9ibGVtIHdhcyBmaXhlZCBieSByZW1vdmluZyBzb21lIHBhcmFsbGVsaXphdGlvbi4KCmBgYHtyfQppbmNsdXNpb25fZGUgPC0gYWxsX3BhaXJ3aXNlKAogIHYzX3BhaXJ3aXNlX2lucHV0LCBmaWx0ZXIgPSAic2ltcGxlIiwgbW9kZWxfZnN0cmluZyA9IGRlZmF1bHRfZnN0cmluZywKICBrZWVwZXJzID0gaW5jbHVzaW9ucywgbW9kZWxfc3ZzID0gInN2YXNlcSIpCmluY2x1c2lvbl9kZQoKaW5jbHVzaW9uX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICBpbmNsdXNpb25fZGUsIGtlZXBlcnMgPSBpbmNsdXNpb25zLCBsYWJlbF9jb2x1bW4gPSBsYWJlbF9jb2x1bW4sCiAgZXhjZWwgPSBnbHVlKCIwNGluY2x1c2lvbl9jb21wYXJpc29ucy9pbmNsdXNpb25fdGFibGVzLXZ7dmVyfS54bHN4IikpCmluY2x1c2lvbl90YWJsZXMKIyMgMjAyNjAzOiBJIHN1Y2Nlc3NmdWxseSByZWNhcGl0dWxhdGVkIHByZXZpb3VzIG5vbi1jb250YWluZXIgcmVzdWx0LgoKaW5jbHVzaW9uX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGluY2x1c2lvbl90YWJsZXMsIGxmYyA9IGxmY19jdXRvZmYsIHAgPSBhZGpwX2N1dG9mZiwgYWNjb3JkaW5nX3RvID0gImRlc2VxIiwKICBleGNlbCA9IGdsdWUoIjA0aW5jbHVzaW9uX2NvbXBhcmlzb25zL2luY2x1c2lvbl9zaWctdnt2ZXJ9Lnhsc3giKSkKaW5jbHVzaW9uX3NpZwpgYGAKCjIwMjUwNTogQSBzdHJhbmdlIHRoaW5nIGhhcHBlbmVkIGhlcmUgaW4gdGhpcyBpdGVyYXRpb246IHRoZSBwbG90IG9mCnRoZSBzaWduaWZpY2FudCBnZW5lcyBpcyB0aGUgZXhhY3Qgc2FtZSBhcyB0aGUgcHJldmlvdXMgaXRlcmF0aW9uOyBidXQKdGhlIHRhYmxlIG9mIG51bWJlcnMgb2YgZ2VuZXMgbG9va3MgZGlmZmVyZW50LgoKRm9yIGV4YW1wbGUsIHRoZSBwcmV2aW91cyB0YWJsZSBzaG93ZWQ6IHAxNV9oZXRfZGxnbiB3aXRoIDIwNjcgdXAgYW5kCjIzODEgZG93bi4gIFRoZSBwbG90IHNob3dzIGV4YWN0bHkgdGhhdDsgYnV0IHRoZSBuZXcgdGFibGUgc2hvd3MgNjA3CnVwIGFuZCAxMjI5IGRvd24uICBMZXQgdXMgY2hlY2sgdGhlIGFjdHVhbCBkYXRhIHN0cnVjdHVyZSBhbmQgc2VlIHdoYXQKaXMgdXA/CgpJIHRoaW5rIEkgZ2V0IGl0OiB3aGVuIHdlIGRvIHRoZSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzIGFib3ZlLCB3ZQpleHBsaWNpdGx5IHNldCBhIG5vbi1zdGFuZGFyZCBwLXZhbHVlIGFuZCBsb2dGQyBiZWNhdXNlIHdlIGFyZQpleHBsaWNpdGx5IGF0dGVtcHRpbmcgdG8gdXNlIGEgdmVyeSBsb29zZSBkZWZpbml0aW9uIG9mIHRoZSBzZXQgb2YKZ2VuZXMgd2hpY2ggYXJlIGluIGdyZWF0ZXIgYWJ1bmRhbmNlIHRoYW4gdGhlaXIgbW9zdCBzaW1pbGFyCndpbGQtdHlwZS4gSG93ZXZlciwgd2hlbiBJIGNyZWF0ZSB0aGUgYmFycGxvdCBvZiBzaWduaWZpY2FudCBnZW5lczsKdGhvc2UgdmFsdWVzIGFyZSBleHBsaWNpdGx5IHNldCB0byAwLDEsMiBsb2dGQ3MgYW5kIHAtdmFsdWUgMC4wNS4KVGhlcmVmb3JlLCB3aGF0IEkgbmVlZCB0byBkbywgaW4gb3JkZXIgdG8gY2hlY2sgY29uc2lzdGVuY3ksIGlzIHRvCnJlcGVhdCB0aGlzIGNhbGwgYnV0IHdpdGggdGhlIGRlZmF1bHQgRkMvcCB2YWx1ZXMgYW5kIHNlZSB3aGF0IHRoZQpudW1iZXJzIGxvb2sgbGlrZS4KCmBgYHtyfQp0ZXN0X2luY2x1c2lvbiA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGluY2x1c2lvbl90YWJsZXMsIGFjY29yZGluZ190byA9ICJkZXNlcSIsIGV4Y2VsID0gImV4Y2VsL2RlZmF1bHRfaW5jbHVzaW9uX3NpZy54bHN4IikKdGVzdF9pbmNsdXNpb24KYGBgCgpZZWFoLCBJIHRoaW5rIHRoaXMgbWFrZXMgc2Vuc2U7IHdoYXQgSSBuZWVkIHRvIGRvOiBjaGFuZ2UgdGhlCnNpZ25pZmljYW50IGJhciBwbG90IHNvIHRoYXQgaXQgdXNlcyB0aGUgbGZjIGN1dG9mZiBhcmd1bWVudCBhcyB0aGUKc2Vjb25kIG9mIGl0cyAzIGN1dG9mZnMuICBUaGF0IHNob3VsZCBlbnN1cmUgdGhhdCB0aGVzZSBudW1iZXJzIGFyZQpjb25zaXN0ZW50IGFjcm9zcyBhbmFseXNlcyBhbmQgcGFyYW1ldGVycyBwcm92aWRlZC4KCmBgYHtyfQpkaW0oaW5jbHVzaW9uX3NpZyRkZXNlcSR1cHMkcDE1X2hldF9kbGduKQp0ZXN0X2FsbF91cCA8LSBpbmNsdXNpb25fdGFibGVzJGRhdGEkcDE1X2hldF9kbGduW1siZGVzZXFfbG9nZmMiXV0gPiAwLjEgJgogIGluY2x1c2lvbl90YWJsZXMkZGF0YSRwMTVfaGV0X2RsZ25bWyJkZXNlcV9hZGpwIl1dIDw9IDAuMQpzdW1tYXJ5KHRlc3RfYWxsX3VwKQpgYGAKCk9oaCwgSSBnZXQgaXQsIHdoZW4gSSB3YXMgdGVzdGluZyB0aGlzIG91dCBtYW51YWxseSwgSSBzZXQgdGhlIGxvZ0ZDCnRvIDEuMCBpbnN0ZWFkIG9mIHRoZSB2ZXJ5IG1pbmltYWwgMC4xIHdlIGhhdmUgYmVlbiB1c2luZyBmb3IgdGhpcyEKCiMgTUEvVm9sY2FubyBwbG90cyBvZiB4IHZzIHd0CgpSYXNobWkgYXNrZWQgdG8gc2VlIHRoZSBjb21wYXJpc29ucyBhZ2FpbnN0IHd0OyBJIHdpbGwgbmFtZSBlYWNoIGZpbGUKeHcgdG8gc2hvdyB0aGF0IGl0IGlzIHggdnMgd3QuIGZvciB3aGF0ZXZlciBvdGhlciBwYXJhbWV0ZXJzIGFyZSBiZWluZwpleGFtaW5lZC4gIEl0IGlzIGxpa2VseSB0aGF0IHNvbWUgY29sb3JzIHdpbGwgYmUgd3JvbmcgYmVjYXVzZSB0aGlzIGlzCm15IGZpcnN0IHRpbWUgY3JlYXRpbmcgdGhlc2UgcGxvdHMgYW5kIHdlIGFyZSBkb2luZyB0aGVtIG1hbnVhbGx5LgoKIyMgcDE1X2hldF9kbGduCgpgYGB7cn0KYWxsYyA8LSBjb2xvcl9jaG9pY2VzW1siYWxsIl1dCnRhYmxlX25hbWUgPC0gInAxNV9oZXRfZGxnbiIKdGFibGUgPC0gaW5jbHVzaW9uX3RhYmxlc1tbImRhdGEiXV1bW3RhYmxlX25hbWVdXQpudW0gPC0gInAxNV9oZXRfZGxnbiIKZGVub20gPC0gInAxNV93dF9kbGduIgpod19wMTVfZGxnbl92b2xjYW5vIDwtIHBsb3Rfdm9sY2Fub19jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsIHBfY29sID0gImRlc2VxX2FkanAiLCBmaWxsID0gImJsYWNrIiwKICBjb2xvcl9sb3cgPSBhbGxjW1tkZW5vbV1dLCBjb2xvcl9oaWdoID0gYWxsY1tbbnVtXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IDEwLCBhbHBoYSA9IDEuMCwKICBzaXplID0gNCkKCnBwKGZpbGUgPSAiMDVpbmNsdXNpb25fdm9sY2Fub19tYS9od19wMTVfZGxnbl92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKaHdfcDE1X2RsZ25fdm9sY2Fub1tbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKaHdfcDE1X2RsZ25fdm9sY2Fub1tbInBsb3QiXV0KCmh3X3AxNV9kbGduX21hIDwtIHBsb3RfbWFfY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBleHByX2NvbCA9ICJkZXNlcV9iYXNlbWVhbiIsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsCiAgY29sb3JfbG93ID0gYWxsY1tbZGVub21dXSwgY29sb3JfaGlnaCA9IGFsbGNbW251bV1dLAogIHBfY29sID0gImRlc2VxX2FkanAiLCBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIG91dGxpbmUgPSBvdXRsaW5lLAogIGxhYmVsID0gMTApCgpwcChmaWxlID0gIjA1aW5jbHVzaW9uX3ZvbGNhbm9fbWEvaHdfcDE1X2RsZ25fbWEucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQpod19wMTVfZGxnbl9tYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKaHdfcDE1X2RsZ25fbWFbWyJwbG90Il1dCmBgYAoKIyMgcDA4X2hldF9kbGduCgpgYGB7cn0KdGFibGVfbmFtZSA8LSAicDA4X2hldF9kbGduIgp0YWJsZSA8LSBpbmNsdXNpb25fdGFibGVzW1siZGF0YSJdXVtbdGFibGVfbmFtZV1dCm51bSA8LSAicDA4X2hldF9kbGduIgpkZW5vbSA8LSAicDA4X3d0X2RsZ24iCmh3X3AwOF9kbGduX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGZpbGwgPSAiYmxhY2siLAogIGNvbG9yX2xvdyA9IGFsbGNbW2Rlbm9tXV0sIGNvbG9yX2hpZ2ggPSBhbGxjW1tudW1dXSwKICBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIGxhYmVsID0gMTAsIGFscGhhID0gMS4wLAogIHNpemUgPSA0KQpwcChmaWxlID0gIjA1aW5jbHVzaW9uX3ZvbGNhbm9fbWEvaHdfcDA4X2RsZ25fdm9sY2Fuby5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmh3X3AwOF9kbGduX3ZvbGNhbm9bWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmh3X3AwOF9kbGduX3ZvbGNhbm9bWyJwbG90Il1dCmh3X3AwOF9kbGduX21hIDwtIHBsb3RfbWFfY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBleHByX2NvbCA9ICJkZXNlcV9iYXNlbWVhbiIsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsCiAgY29sb3JfbG93ID0gYWxsY1tbZGVub21dXSwgY29sb3JfaGlnaCA9IGFsbGNbW251bV1dLAogIHBfY29sID0gImRlc2VxX2FkanAiLCBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIG91dGxpbmUgPSBvdXRsaW5lLAogIGxhYmVsID0gMTApCnBwKGZpbGUgPSAiMDVpbmNsdXNpb25fdm9sY2Fub19tYS9od19wMDhfZGxnbl9tYS5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmh3X3AwOF9kbGduX21hW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpod19wMDhfZGxnbl9tYVtbInBsb3QiXV0KYGBgCgojIyBwMTVfa29fZGxnbgoKYGBge3J9CnRhYmxlX25hbWUgPC0gInAxNV9rb19kbGduIgp0YWJsZSA8LSBpbmNsdXNpb25fdGFibGVzW1siZGF0YSJdXVtbdGFibGVfbmFtZV1dCm51bSA8LSAicDE1X2tvX2RsZ24iCmRlbm9tIDwtICJwMTVfd3RfZGxnbiIKa3dfcDE1X2RsZ25fdm9sY2FubyA8LSBwbG90X3ZvbGNhbm9fY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLCBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgZmlsbCA9ICJibGFjayIsCiAgY29sb3JfbG93ID0gYWxsY1tbZGVub21dXSwgY29sb3JfaGlnaCA9IGFsbGNbW251bV1dLAogIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgbGFiZWwgPSAxMCwgYWxwaGEgPSAxLjAsCiAgc2l6ZSA9IDQpCnBwKGZpbGUgPSAiMDVpbmNsdXNpb25fdm9sY2Fub19tYS9rd19wMTVfZGxnbl92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa3dfcDE1X2RsZ25fdm9sY2Fub1tbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa3dfcDE1X2RsZ25fdm9sY2Fub1tbInBsb3QiXV0Ka3dfcDE1X2RsZ25fbWEgPC0gcGxvdF9tYV9jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGV4cHJfY29sID0gImRlc2VxX2Jhc2VtZWFuIiwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwKICBjb2xvcl9sb3cgPSBhbGxjW1tkZW5vbV1dLCBjb2xvcl9oaWdoID0gYWxsY1tbbnVtXV0sCiAgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgb3V0bGluZSA9IG91dGxpbmUsCiAgbGFiZWwgPSAxMCkKcHAoZmlsZSA9ICIwNWluY2x1c2lvbl92b2xjYW5vX21hL2t3X3AxNV9kbGduX21hLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa3dfcDE1X2RsZ25fbWFbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmt3X3AxNV9kbGduX21hW1sicGxvdCJdXQpgYGAKCiMjIHAwOF9rb19kbGduCgpgYGB7cn0KdGFibGVfbmFtZSA8LSAicDA4X2tvX2RsZ24iCnRhYmxlIDwtIGluY2x1c2lvbl90YWJsZXNbWyJkYXRhIl1dW1t0YWJsZV9uYW1lXV0KbnVtIDwtICJwMDhfa29fZGxnbiIKZGVub20gPC0gInAwOF93dF9kbGduIgprd19wMDhfZGxnbl92b2xjYW5vIDwtIHBsb3Rfdm9sY2Fub19jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsIHBfY29sID0gImRlc2VxX2FkanAiLCBmaWxsID0gImJsYWNrIiwKICBjb2xvcl9sb3cgPSBhbGxjW1tkZW5vbV1dLCBjb2xvcl9oaWdoID0gYWxsY1tbbnVtXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IDEwLCBhbHBoYSA9IDEuMCwKICBzaXplID0gNCkKcHAoZmlsZSA9ICIwNWluY2x1c2lvbl92b2xjYW5vX21hL2t3X3AwOF9kbGduX3ZvbGNhbm8ucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQprd19wMDhfZGxnbl92b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQprd19wMDhfZGxnbl92b2xjYW5vW1sicGxvdCJdXQprd19wMDhfZGxnbl9tYSA8LSBwbG90X21hX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZXhwcl9jb2wgPSAiZGVzZXFfYmFzZW1lYW4iLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLAogIGNvbG9yX2xvdyA9IGFsbGNbW2Rlbm9tXV0sIGNvbG9yX2hpZ2ggPSBhbGxjW1tudW1dXSwKICBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBvdXRsaW5lID0gb3V0bGluZSwKICBsYWJlbCA9IDEwKQpwcChmaWxlID0gIjA1aW5jbHVzaW9uX3ZvbGNhbm9fbWEva3dfcDA4X2RsZ25fbWEucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQprd19wMDhfZGxnbl9tYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa3dfcDA4X2RsZ25fbWFbWyJwbG90Il1dCmBgYAoKIyMgcDE1X2hldF9yZXRpbmEKCmBgYHtyfQp0YWJsZV9uYW1lIDwtICJwMTVfaGV0X3JldGluYSIKdGFibGUgPC0gaW5jbHVzaW9uX3RhYmxlc1tbImRhdGEiXV1bW3RhYmxlX25hbWVdXQpudW0gPC0gInAxNV9oZXRfcmV0aW5hIgpkZW5vbSA8LSAicDE1X3d0X3JldGluYSIKaHdfcDE1X3JldGluYV92b2xjYW5vIDwtIHBsb3Rfdm9sY2Fub19jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsIHBfY29sID0gImRlc2VxX2FkanAiLCBmaWxsID0gImJsYWNrIiwKICBjb2xvcl9sb3cgPSBhbGxjW1tkZW5vbV1dLCBjb2xvcl9oaWdoID0gYWxsY1tbbnVtXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IDEwLCBhbHBoYSA9IDEuMCwKICBzaXplID0gNCkKcHAoZmlsZSA9ICIwNWluY2x1c2lvbl92b2xjYW5vX21hL2h3X3AxNV9yZXRpbmFfdm9sY2Fuby5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmh3X3AxNV9yZXRpbmFfdm9sY2Fub1tbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKaHdfcDE1X3JldGluYV92b2xjYW5vW1sicGxvdCJdXQpod19wMTVfcmV0aW5hX21hIDwtIHBsb3RfbWFfY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBleHByX2NvbCA9ICJkZXNlcV9iYXNlbWVhbiIsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsCiAgY29sb3JfbG93ID0gYWxsY1tbZGVub21dXSwgY29sb3JfaGlnaCA9IGFsbGNbW251bV1dLAogIHBfY29sID0gImRlc2VxX2FkanAiLCBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIG91dGxpbmUgPSBvdXRsaW5lLAogIGxhYmVsID0gMTApCnBwKGZpbGUgPSAiMDVpbmNsdXNpb25fdm9sY2Fub19tYS9od19wMTVfcmV0aW5hX21hLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKaHdfcDE1X3JldGluYV9tYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKaHdfcDE1X3JldGluYV9tYVtbInBsb3QiXV0KYGBgCgojIyBwMDhfaGV0X3JldGluYQoKYGBge3J9CnRhYmxlX25hbWUgPC0gInAwOF9oZXRfcmV0aW5hIgp0YWJsZSA8LSBpbmNsdXNpb25fdGFibGVzW1siZGF0YSJdXVtbdGFibGVfbmFtZV1dCm51bSA8LSAicDA4X2hldF9yZXRpbmEiCmRlbm9tIDwtICJwMDhfd3RfcmV0aW5hIgpod19wMDhfcmV0aW5hX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGZpbGwgPSAiYmxhY2siLAogIGNvbG9yX2xvdyA9IGFsbGNbW2Rlbm9tXV0sIGNvbG9yX2hpZ2ggPSBhbGxjW1tudW1dXSwKICBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIGxhYmVsID0gMTAsIGFscGhhID0gMS4wLAogIHNpemUgPSA0KQpwcChmaWxlID0gIjA1aW5jbHVzaW9uX3ZvbGNhbm9fbWEvaHdfcDA4X3JldGluYV92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKaHdfcDA4X3JldGluYV92b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpod19wMDhfcmV0aW5hX3ZvbGNhbm9bWyJwbG90Il1dCmh3X3AwOF9yZXRpbmFfbWEgPC0gcGxvdF9tYV9jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGV4cHJfY29sID0gImRlc2VxX2Jhc2VtZWFuIiwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwKICBjb2xvcl9sb3cgPSBhbGxjW1tkZW5vbV1dLCBjb2xvcl9oaWdoID0gYWxsY1tbbnVtXV0sCiAgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgb3V0bGluZSA9IG91dGxpbmUsCiAgbGFiZWwgPSAxMCkKcHAoZmlsZSA9ICIwNWluY2x1c2lvbl92b2xjYW5vX21hL2h3X3AwOF9yZXRpbmFfbWEucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQpod19wMDhfcmV0aW5hX21hW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpod19wMDhfcmV0aW5hX21hW1sicGxvdCJdXQpgYGAKCiMjIHAxNV9rb19yZXRpbmEKCmBgYHtyfQp0YWJsZV9uYW1lIDwtICJwMTVfa29fcmV0aW5hIgp0YWJsZSA8LSBpbmNsdXNpb25fdGFibGVzW1siZGF0YSJdXVtbdGFibGVfbmFtZV1dCm51bSA8LSAicDE1X2tvX3JldGluYSIKZGVub20gPC0gInAxNV93dF9yZXRpbmEiCmt3X3AxNV9yZXRpbmFfdm9sY2FubyA8LSBwbG90X3ZvbGNhbm9fY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLCBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgZmlsbCA9ICJibGFjayIsCiAgY29sb3JfbG93ID0gYWxsY1tbZGVub21dXSwgY29sb3JfaGlnaCA9IGFsbGNbW251bV1dLAogIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgbGFiZWwgPSAxMCwgYWxwaGEgPSAxLjAsCiAgc2l6ZSA9IDQpCnBwKGZpbGUgPSAiMDVpbmNsdXNpb25fdm9sY2Fub19tYS9rd19wMTVfcmV0aW5hX3ZvbGNhbm8ucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQprd19wMTVfcmV0aW5hX3ZvbGNhbm9bWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmt3X3AxNV9yZXRpbmFfdm9sY2Fub1tbInBsb3QiXV0Ka3dfcDE1X3JldGluYV9tYSA8LSBwbG90X21hX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZXhwcl9jb2wgPSAiZGVzZXFfYmFzZW1lYW4iLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLAogIGNvbG9yX2xvdyA9IGFsbGNbW2Rlbm9tXV0sIGNvbG9yX2hpZ2ggPSBhbGxjW1tudW1dXSwKICBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBvdXRsaW5lID0gb3V0bGluZSwKICBsYWJlbCA9IDEwKQpwcChmaWxlID0gIjA1aW5jbHVzaW9uX3ZvbGNhbm9fbWEva3dfcDE1X3JldGluYV9tYS5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmt3X3AxNV9yZXRpbmFfbWFbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmt3X3AxNV9yZXRpbmFfbWFbWyJwbG90Il1dCmBgYAoKIyMgcDA4X2tvX3JldGluYQoKYGBge3J9CnRhYmxlX25hbWUgPC0gInAwOF9rb19yZXRpbmEiCnRhYmxlIDwtIGluY2x1c2lvbl90YWJsZXNbWyJkYXRhIl1dW1t0YWJsZV9uYW1lXV0KbnVtIDwtICJwMDhfa29fcmV0aW5hIgpkZW5vbSA8LSAicDA4X3d0X3JldGluYSIKa3dfcDA4X3JldGluYV92b2xjYW5vIDwtIHBsb3Rfdm9sY2Fub19jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsIHBfY29sID0gImRlc2VxX2FkanAiLCBmaWxsID0gImJsYWNrIiwKICBjb2xvcl9sb3cgPSBhbGxjW1tkZW5vbV1dLCBjb2xvcl9oaWdoID0gYWxsY1tbbnVtXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IDEwLCBhbHBoYSA9IDEuMCwKICBzaXplID0gNCkKcHAoZmlsZSA9ICIwNWluY2x1c2lvbl92b2xjYW5vX21hL2t3X3AwOF9yZXRpbmFfdm9sY2Fuby5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmt3X3AwOF9yZXRpbmFfdm9sY2Fub1tbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa3dfcDA4X3JldGluYV92b2xjYW5vW1sicGxvdCJdXQprd19wMDhfcmV0aW5hX21hIDwtIHBsb3RfbWFfY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBleHByX2NvbCA9ICJkZXNlcV9iYXNlbWVhbiIsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsCiAgY29sb3JfbG93ID0gYWxsY1tbZGVub21dXSwgY29sb3JfaGlnaCA9IGFsbGNbW251bV1dLAogIHBfY29sID0gImRlc2VxX2FkanAiLCBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIG91dGxpbmUgPSBvdXRsaW5lLAogIGxhYmVsID0gMTApCnBwKGZpbGUgPSAiMDVpbmNsdXNpb25fdm9sY2Fub19tYV9wMDhfcmV0aW5hX21hLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa3dfcDA4X3JldGluYV9tYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa3dfcDA4X3JldGluYV9tYVtbInBsb3QiXV0KYGBgCgojIyBwMTVfaGV0X3NjbgoKYGBge3J9CnRhYmxlX25hbWUgPC0gInAxNV9oZXRfc2NuIgp0YWJsZSA8LSBpbmNsdXNpb25fdGFibGVzW1siZGF0YSJdXVtbdGFibGVfbmFtZV1dCm51bSA8LSAicDE1X2hldF9zY24iCmRlbm9tIDwtICJwMTVfd3Rfc2NuIgpod19wMTVfc2NuX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGZpbGwgPSAiYmxhY2siLAogIGNvbG9yX2xvdyA9IGFsbGNbW2Rlbm9tXV0sIGNvbG9yX2hpZ2ggPSBhbGxjW1tudW1dXSwKICBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIGxhYmVsID0gMTAsIGFscGhhID0gMS4wLAogIHNpemUgPSA0KQpwcChmaWxlID0gIjA1aW5jbHVzaW9uX3ZvbGNhbm9fbWEvaHdfcDE1X3Njbl92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKaHdfcDE1X3Njbl92b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpod19wMTVfc2NuX3ZvbGNhbm9bWyJwbG90Il1dCmh3X3AxNV9zY25fbWEgPC0gcGxvdF9tYV9jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGV4cHJfY29sID0gImRlc2VxX2Jhc2VtZWFuIiwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwKICBjb2xvcl9sb3cgPSBhbGxjW1tkZW5vbV1dLCBjb2xvcl9oaWdoID0gYWxsY1tbbnVtXV0sCiAgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgb3V0bGluZSA9IG91dGxpbmUsCiAgbGFiZWwgPSAxMCkKcHAoZmlsZSA9ICIwNWluY2x1c2lvbl92b2xjYW5vX21hL2h3X3AxNV9zY25fbWEucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQpod19wMTVfc2NuX21hW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpod19wMTVfc2NuX21hW1sicGxvdCJdXQpgYGAKCiMjIHAwOF9oZXRfc2NuCgpgYGB7cn0KdGFibGVfbmFtZSA8LSAicDA4X2hldF9zY24iCnRhYmxlIDwtIGluY2x1c2lvbl90YWJsZXNbWyJkYXRhIl1dW1t0YWJsZV9uYW1lXV0KbnVtIDwtICJwMDhfaGV0X3NjbiIKZGVub20gPC0gInAwOF93dF9zY24iCmh3X3AwOF9zY25fdm9sY2FubyA8LSBwbG90X3ZvbGNhbm9fY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLCBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgZmlsbCA9ICJibGFjayIsCiAgY29sb3JfbG93ID0gYWxsY1tbZGVub21dXSwgY29sb3JfaGlnaCA9IGFsbGNbW251bV1dLAogIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgbGFiZWwgPSAxMCwgYWxwaGEgPSAxLjAsCiAgc2l6ZSA9IDQpCnBwKGZpbGUgPSAiMDVpbmNsdXNpb25fdm9sY2Fub19tYS9od19wMDhfc2NuX3ZvbGNhbm8ucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQpod19wMDhfc2NuX3ZvbGNhbm9bWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmh3X3AwOF9zY25fdm9sY2Fub1tbInBsb3QiXV0KaHdfcDA4X3Njbl9tYSA8LSBwbG90X21hX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZXhwcl9jb2wgPSAiZGVzZXFfYmFzZW1lYW4iLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLAogIGNvbG9yX2xvdyA9IGFsbGNbW2Rlbm9tXV0sIGNvbG9yX2hpZ2ggPSBhbGxjW1tudW1dXSwKICBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBvdXRsaW5lID0gb3V0bGluZSwKICBsYWJlbCA9IDEwKQpwcChmaWxlID0gIjA1aW5jbHVzaW9uX3ZvbGNhbm9fbWEvaHdfcDA4X3Njbl9tYS5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmh3X3AwOF9zY25fbWFbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmh3X3AwOF9zY25fbWFbWyJwbG90Il1dCmBgYAoKIyMgcDE1X2tvX3NjbgoKYGBge3J9CnRhYmxlX25hbWUgPC0gInAxNV9rb19zY24iCnRhYmxlIDwtIGluY2x1c2lvbl90YWJsZXNbWyJkYXRhIl1dW1t0YWJsZV9uYW1lXV0KbnVtIDwtICJwMTVfa29fc2NuIgpkZW5vbSA8LSAicDE1X3d0X3NjbiIKa3dfcDE1X3Njbl92b2xjYW5vIDwtIHBsb3Rfdm9sY2Fub19jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsIHBfY29sID0gImRlc2VxX2FkanAiLCBmaWxsID0gImJsYWNrIiwKICBjb2xvcl9sb3cgPSBhbGxjW1tkZW5vbV1dLCBjb2xvcl9oaWdoID0gYWxsY1tbbnVtXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IDEwLCBhbHBoYSA9IDEuMCwKICBzaXplID0gNCkKcHAoZmlsZSA9ICIwNWluY2x1c2lvbl92b2xjYW5vX21hL2t3X3AxNV9zY25fdm9sY2Fuby5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmt3X3AxNV9zY25fdm9sY2Fub1tbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa3dfcDE1X3Njbl92b2xjYW5vW1sicGxvdCJdXQprd19wMTVfc2NuX21hIDwtIHBsb3RfbWFfY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBleHByX2NvbCA9ICJkZXNlcV9iYXNlbWVhbiIsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsCiAgY29sb3JfbG93ID0gYWxsY1tbZGVub21dXSwgY29sb3JfaGlnaCA9IGFsbGNbW251bV1dLAogIHBfY29sID0gImRlc2VxX2FkanAiLCBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIG91dGxpbmUgPSBvdXRsaW5lLAogIGxhYmVsID0gMTApCnBwKGZpbGUgPSAiMDVpbmNsdXNpb25fdm9sY2Fub19tYS9rd19wMTVfc2NuX21hLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa3dfcDE1X3Njbl9tYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa3dfcDE1X3Njbl9tYVtbInBsb3QiXV0KYGBgCgojIyBwMDhfa29fc2NuCgpgYGB7cn0KdGFibGVfbmFtZSA8LSAicDA4X2tvX3NjbiIKdGFibGUgPC0gaW5jbHVzaW9uX3RhYmxlc1tbImRhdGEiXV1bW3RhYmxlX25hbWVdXQpudW0gPC0gInAwOF9rb19zY24iCmRlbm9tIDwtICJwMDhfd3Rfc2NuIgprd19wMDhfc2NuX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGZpbGwgPSAiYmxhY2siLAogIGNvbG9yX2xvdyA9IGFsbGNbW2Rlbm9tXV0sIGNvbG9yX2hpZ2ggPSBhbGxjW1tudW1dXSwKICBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIGxhYmVsID0gMTAsIGFscGhhID0gMS4wLAogIHNpemUgPSA0KQpwcChmaWxlID0gIjA1aW5jbHVzaW9uX3ZvbGNhbm9fbWEva3dfcDA4X3Njbl92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa3dfcDA4X3Njbl92b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQprd19wMDhfc2NuX3ZvbGNhbm9bWyJwbG90Il1dCmt3X3AwOF9zY25fbWEgPC0gcGxvdF9tYV9jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGV4cHJfY29sID0gImRlc2VxX2Jhc2VtZWFuIiwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwKICBjb2xvcl9sb3cgPSBhbGxjW1tkZW5vbV1dLCBjb2xvcl9oaWdoID0gYWxsY1tbbnVtXV0sCiAgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgb3V0bGluZSA9IG91dGxpbmUsCiAgbGFiZWwgPSAxMCkKcHAoZmlsZSA9ICIwNWluY2x1c2lvbl92b2xjYW5vX21hL2t3X3AwOF9zY25fbWEucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQprd19wMDhfc2NuX21hW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQprd19wMDhfc2NuX21hW1sicGxvdCJdXQpgYGAKClNlZSB0aGUgc2hhcmVkL3VuaXF1ZSBnZW5lcyBpbiB0aGVzZSBzZXRzLgoKYGBge3J9CmluY2x1c2lvbl91cHNldHMgPC0gdXBzZXRyX3NpZyhpbmNsdXNpb25fc2lnKQppbmNsdXNpb25faW50ZXJzZWN0cyA8LSB3cml0ZV91cHNldF9ncm91cHMoCiAgaW5jbHVzaW9uX3Vwc2V0cywgZXhjZWwgPSAiMDRpbmNsdXNpb25fY29tcGFyaXNvbi9pbmNsdXNpb25fZ2VuZV9ncm91cHMueGxzeCIpCmBgYAoKIyMjIEV4dHJhY3QgZ2VuZXMgaW5jbHVkZWQgZm9yIGVhY2ggc2V0IG9mIGNvbnRyYXN0cwoKTm93LCB1c2luZyB0aGF0IGZ1bmN0aW9uLCBwdWxsIG91dCB0aGUgZ2VuZSBJRHMgb2YgZ2VuZXMgd2UgZG8gbm90CnRydXN0IGJlY2F1c2UgdGhleSB3ZXJlIHRvbyBoaWdoIGluIHd0IGZvciBldmVyeSBjb250cmFzdCB3ZSBhcmUKbGlrZWx5IHRvIHBlcmZvcm0uCgpUaGUgZm9sbG93aW5nIHdhcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGluY2x1c2lvbiBmdW5jdGlvbiB3aGljaCBpcyBzb21ld2hhdCBtb3JlIHJlc3RyaWN0aXZlLgoKYGBge3J9CmV4dHJhY3RfaW5jbHVzaW9uc19zdHJpY3QgPC0gZnVuY3Rpb24oaW5jbHVzaW9uX3NpZywgaW5jbHVzaW9uX3RhYmxlcywgaW5jbHVzaW9ucywga2VlcGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfZ2VuZXMsIGFjY29yZGluZ190byA9ICJkZXNlcSIsIHdoaWNoID0gInVwcyIpIHsKICByZXRsaXN0IDwtIGxpc3QoKQogIHRhYmxlX25hbWVzIDwtIG5hbWVzKGluY2x1c2lvbl9zaWdbW2FjY29yZGluZ190b11dW1t3aGljaF1dKQogIGZvciAoY19udW0gaW4gc2VxX2Fsb25nKGtlZXBlcnMpKSB7CiAgICBjb250cmFzdCA8LSBuYW1lcyhrZWVwZXJzKVtjX251bV0KICAgIG51bWVyYXRvcl9uYW1lIDwtIGtlZXBlcnNbW2NfbnVtXV1bMV0KICAgIGRlbm9taW5hdG9yX25hbWUgPC0ga2VlcGVyc1tbY19udW1dXVsyXQogICAgIyMgSW4gbXkgbmV3IGJyYW5jaCBJIGNsZWFuZWQgdXAgdGhlIHNhbml0aXplciBmdW5jdGlvbiBmb3IgY29udHJhc3RzIHNvIHRoaXMgaXMgbm90IG5lZWRlZC4KICAgICMjIFRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGFyZSBubyBsb25nZXIgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIGNsZWFudXBzIEkgcGVyZm9ybWVkLgogICAgIyNudW1lcmF0b3JfbmFtZSA8LSBnc3ViKHggPSBudW1lcmF0b3JfbmFtZSwgcGF0dGVybiA9ICIoaGV0fGtvfHd0KSIsIHJlcGxhY2VtZW50ID0gIl9cXDFfIikKICAgICMjZGVub21pbmF0b3JfbmFtZSA8LSBnc3ViKHggPSBkZW5vbWluYXRvcl9uYW1lLCBwYXR0ZXJuID0gIihoZXR8a298d3QpIiwgcmVwbGFjZW1lbnQgPSAiX1xcMV8iKQogICAgbnVtZXJhdG9yX3RhYmxlIDwtIGluY2x1c2lvbl9zaWdbW2FjY29yZGluZ190b11dW1t3aGljaF1dW1tudW1lcmF0b3JfbmFtZV1dCiAgICBudW1lcmF0b3JfZ2VuZXMgPC0gcm93bmFtZXMobnVtZXJhdG9yX3RhYmxlKQogICAgZGVub21pbmF0b3JfdGFibGUgPC0gaW5jbHVzaW9uX3NpZ1tbYWNjb3JkaW5nX3RvXV1bW3doaWNoXV1bW2Rlbm9taW5hdG9yX25hbWVdXQogICAgZGVub21pbmF0b3JfZ2VuZXMgPC0gcm93bmFtZXMoZGVub21pbmF0b3JfdGFibGUpCiAgICBkZl9jb2x1bW5zIDwtIHBhc3RlMCgiZGVzZXFfIiwgYygibG9nZmMiLCAiYWRqcCIsICJkZW4iKSkKICAgIGluY2x1ZGVkX251bSA8LSBpbmNsdXNpb25fdGFibGVzW1siZGF0YSJdXVtbbnVtZXJhdG9yX25hbWVdXVssIGRmX2NvbHVtbnNdCiAgICBjb2xuYW1lcyhpbmNsdWRlZF9udW0pIDwtIGMoIm51bWVyYXRvcl92c193dF9sb2dmYyIsICJudW1lcmF0b3JfdnNfd3RfYWRqcCIsICJudW1fd3RfbWVhbl9leHBycyIpCiAgICBpbmNsdWRlZF9kZW4gPC0gaW5jbHVzaW9uX3RhYmxlc1tbImRhdGEiXV1bW2Rlbm9taW5hdG9yX25hbWVdXVssIGRmX2NvbHVtbnNdCiAgICBjb2xuYW1lcyhpbmNsdWRlZF9kZW4pIDwtIGMoImRlbm9taW5hdG9yX3ZzX3d0X2xvZ2ZjIiwgImRlbm9taW5hdG9yX3ZzX3d0X2FkanAiLCAiZGVuX3d0X21lYW5fZXhwcnMiKQogICAgIyMgSSB0aGluayB0aGlzIGlzIHdoZXJlIHRoaW5ncyB3ZW50IHdyb25nLAogICAgIyMgY29tcGFyZSB0aGlzIG1vZGlmaWVkIGxpbmUgdG8gdGhlIG9yaWdpbmFsIHRvIHByb3ZlIGl0LgogICAgaW5jbHVkZWRfZGYgPC0gbWVyZ2UoaW5jbHVkZWRfbnVtLCBpbmNsdWRlZF9kZW4sIGJ5ID0gInJvdy5uYW1lcyIpCiAgICAjIyBQcmV2aW91c2x5LCBJIGRpZCBub3Qgc3BlY2lmeSB0aGUgbWVyZ2UgYWN0aW9uLCBhbGwgPSBGQUxTRSBieSBkZWZhdWx0LgogICAgIyMgVGhpcyB0aGVuIHdpbGwgcmVzdWx0IGluIGEgZGlmZmVyZW5jZSBpbiB0aGUgcm93cyBvYnNlcnZlZAogICAgIyMgaW5jbHVkZWRfZGYgPC0gbWVyZ2UoaW5jbHVkZWRfbnVtLCBpbmNsdWRlZF9kZW4sIGJ5ID0gInJvdy5uYW1lcyIsIGFsbCA9IEZBTFNFKQogICAgcm93bmFtZXMoaW5jbHVkZWRfZGYpIDwtIGluY2x1ZGVkX2RmW1siUm93Lm5hbWVzIl1dCiAgICBpbmNsdWRlZF9kZltbIlJvdy5uYW1lcyJdXSA8LSBOVUxMCiAgICBjb25jYXRlbmF0ZWRfZ2VuZXMgPC0gYyhudW1lcmF0b3JfZ2VuZXMsIGRlbm9taW5hdG9yX2dlbmVzKQogICAgYm90aF9nZW5lX2lkeCA8LSBkdXBsaWNhdGVkKGNvbmNhdGVuYXRlZF9nZW5lcykKICAgIGdlbmVzX2luX2JvdGggPC0gY29uY2F0ZW5hdGVkX2dlbmVzW2JvdGhfZ2VuZV9pZHhdCiAgICBtZXNzYWdlKCJUaGUgc2V0IG9mIHVuaXF1ZSBnZW5lcyBoaWdoZXIgaW4gIiwgbnVtZXJhdG9yX25hbWUsCiAgICAgICAgICAgICIgdnMuIHd0IGlzICIsIGxlbmd0aChudW1lcmF0b3JfZ2VuZXMpLCAiLiIpCiAgICBtZXNzYWdlKCJUaGUgc2V0IG9mIHVuaXF1ZSBnZW5lcyBoaWdoZXIgaW4gIiwgZGVub21pbmF0b3JfbmFtZSwKICAgICAgICAgICAgIiB2cy4gd3QgaXMgIiwgbGVuZ3RoKGRlbm9taW5hdG9yX2dlbmVzKSwgIi4iKQogICAgbWVzc2FnZSgiVGhlIGludGVyc2VjdGlvbiBvZiB0aGVtIGlzICIsIGxlbmd0aChnZW5lc19pbl9ib3RoKSwgIiBnZW5lcy4iKQogICAgaW5jbHVkZV9uYW1lIDwtIHBhc3RlMCgiaW5jXyIsIGNvbnRyYXN0KQogICAgaW5jbHVkZV9pZHggPC0gYWxsX2dlbmVzICVpbiUgZ2VuZXNfaW5fYm90aAogICAgaW5jbHVkZV9nZW5lcyA8LSBhbGxfZ2VuZXNbaW5jbHVkZV9pZHhdCiAgICBkZl9uYW1lIDwtIHBhc3RlMCgiZGZfIiwgY29udHJhc3QpCiAgICByZXRsaXN0W1tkZl9uYW1lXV0gPC0gaW5jbHVkZWRfZGYKICAgIHdyaXR0ZW5faW5jbHVzaW9uIDwtIHdyaXRlX3hsc3goCiAgICAgIGRhdGEgPSBpbmNsdWRlZF9kZiwKICAgICAgZXhjZWwgPSBnbHVlKCIwN2luY2x1ZGVkX3N0cmljdF9nZW5lc19leGNlbC97aW5jbHVkZV9uYW1lfS12e3Zlcn0ueGxzeCIpKQogICAgcmV0bGlzdFtbaW5jbHVkZV9uYW1lXV0gPC0gaW5jbHVkZV9nZW5lcwogICAgcmV0bGlzdFtbY29udHJhc3RdXSA8LSBpbmNsdWRlX2dlbmVzCiAgfQogIHJldHVybihyZXRsaXN0KQp9CmBgYAoKVGhpcyBpcyB0aGUgcHJlLTIwMjUwNSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24uCgpgYGB7cn0KZXh0cmFjdF9pbmNsdXNpb25zIDwtIGZ1bmN0aW9uKGluY2x1c2lvbl9zaWcsIGluY2x1c2lvbl90YWJsZXMsIGluY2x1c2lvbnMsIGtlZXBlcnMsIGFsbF9nZW5lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZ190byA9ICJkZXNlcSIsIHdoaWNoID0gInVwcyIpIHsKICByZXRsaXN0IDwtIGxpc3QoKQogIHRhYmxlX25hbWVzIDwtIG5hbWVzKGluY2x1c2lvbl9zaWdbW2FjY29yZGluZ190b11dW1t3aGljaF1dKQogIGZvciAoY19udW0gaW4gc2VxX2Fsb25nKGtlZXBlcnMpKSB7CiAgICBjb250cmFzdCA8LSBuYW1lcyhrZWVwZXJzKVtjX251bV0KICAgIG51bWVyYXRvcl9uYW1lIDwtIGtlZXBlcnNbW2NfbnVtXV1bMV0KICAgIGRlbm9taW5hdG9yX25hbWUgPC0ga2VlcGVyc1tbY19udW1dXVsyXQogICAgIyMgSW4gbXkgbmV3IGJyYW5jaCBJIGNsZWFuZWQgdXAgdGhlIHNhbml0aXplciBmdW5jdGlvbiBmb3IgY29udHJhc3RzIHNvIHRoaXMgaXMgbm90IG5lZWRlZC4KICAgICMjIFRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGFyZSBubyBsb25nZXIgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIGNsZWFudXBzIEkgcGVyZm9ybWVkLgogICAgIyNudW1lcmF0b3JfbmFtZSA8LSBnc3ViKHggPSBudW1lcmF0b3JfbmFtZSwgcGF0dGVybiA9ICIoaGV0fGtvfHd0KSIsIHJlcGxhY2VtZW50ID0gIl9cXDFfIikKICAgICMjZGVub21pbmF0b3JfbmFtZSA8LSBnc3ViKHggPSBkZW5vbWluYXRvcl9uYW1lLCBwYXR0ZXJuID0gIihoZXR8a298d3QpIiwgcmVwbGFjZW1lbnQgPSAiX1xcMV8iKQogICAgbnVtZXJhdG9yX3RhYmxlIDwtIGluY2x1c2lvbl9zaWdbW2FjY29yZGluZ190b11dW1t3aGljaF1dW1tudW1lcmF0b3JfbmFtZV1dCiAgICBudW1lcmF0b3JfZ2VuZXMgPC0gcm93bmFtZXMobnVtZXJhdG9yX3RhYmxlKQogICAgZGVub21pbmF0b3JfdGFibGUgPC0gaW5jbHVzaW9uX3NpZ1tbYWNjb3JkaW5nX3RvXV1bW3doaWNoXV1bW2Rlbm9taW5hdG9yX25hbWVdXQogICAgZGVub21pbmF0b3JfZ2VuZXMgPC0gcm93bmFtZXMoZGVub21pbmF0b3JfdGFibGUpCiAgICBkZl9jb2x1bW5zIDwtIHBhc3RlMCgiZGVzZXFfIiwgYygibG9nZmMiLCAiYWRqcCIsICJkZW4iKSkKICAgIGluY2x1ZGVkX251bSA8LSBpbmNsdXNpb25fdGFibGVzW1siZGF0YSJdXVtbbnVtZXJhdG9yX25hbWVdXVssIGRmX2NvbHVtbnNdCiAgICBjb2xuYW1lcyhpbmNsdWRlZF9udW0pIDwtIGMoIm51bWVyYXRvcl92c193dF9sb2dmYyIsICJudW1lcmF0b3JfdnNfd3RfYWRqcCIsICJudW1fd3RfbWVhbl9leHBycyIpCiAgICBpbmNsdWRlZF9kZW4gPC0gaW5jbHVzaW9uX3RhYmxlc1tbImRhdGEiXV1bW2Rlbm9taW5hdG9yX25hbWVdXVssIGRmX2NvbHVtbnNdCiAgICBjb2xuYW1lcyhpbmNsdWRlZF9kZW4pIDwtIGMoImRlbm9taW5hdG9yX3ZzX3d0X2xvZ2ZjIiwgImRlbm9taW5hdG9yX3ZzX3d0X2FkanAiLCAiZGVuX3d0X21lYW5fZXhwcnMiKQogICAgaW5jbHVkZWRfZGYgPC0gbWVyZ2UoaW5jbHVkZWRfbnVtLCBpbmNsdWRlZF9kZW4sIGJ5ID0gInJvdy5uYW1lcyIpCiAgICByb3duYW1lcyhpbmNsdWRlZF9kZikgPC0gaW5jbHVkZWRfZGZbWyJSb3cubmFtZXMiXV0KICAgIGluY2x1ZGVkX2RmW1siUm93Lm5hbWVzIl1dIDwtIE5VTEwKICAgIGluY2x1ZGVfZ2VuZXMgPC0gdW5pcXVlKGMobnVtZXJhdG9yX2dlbmVzLCBkZW5vbWluYXRvcl9nZW5lcykpCiAgICBtZXNzYWdlKCJUaGUgc2V0IG9mIHVuaXF1ZSBnZW5lcyBoaWdoZXIgaW4gIiwgbnVtZXJhdG9yX25hbWUsCiAgICAgICAgICAgICIgdnMuIHd0IGlzICIsIGxlbmd0aChudW1lcmF0b3JfZ2VuZXMpLCAiLiIpCiAgICBtZXNzYWdlKCJUaGUgc2V0IG9mIHVuaXF1ZSBnZW5lcyBoaWdoZXIgaW4gIiwgZGVub21pbmF0b3JfbmFtZSwKICAgICAgICAgICAgIiB2cy4gd3QgaXMgIiwgbGVuZ3RoKGRlbm9taW5hdG9yX2dlbmVzKSwgIi4iKQogICAgbWVzc2FnZSgiVGhlIHVuaXF1ZSB1bmlvbiBvZiB0aGVtIGlzICIsIGxlbmd0aChpbmNsdWRlX2dlbmVzKSwgIiBnZW5lcy4iKQogICAgaW5jbHVkZV9uYW1lIDwtIHBhc3RlMCgiaW5jXyIsIGNvbnRyYXN0KQogICAgaW5jbHVkZV9pZHggPC0gYWxsX2dlbmVzICVpbiUgaW5jbHVkZV9nZW5lcwogICAgaW5jbHVkZV9nZW5lcyA8LSBhbGxfZ2VuZXNbaW5jbHVkZV9pZHhdCiAgICBkZl9uYW1lIDwtIHBhc3RlMCgiZGZfIiwgY29udHJhc3QpCiAgICByZXRsaXN0W1tkZl9uYW1lXV0gPC0gaW5jbHVkZWRfZGYKICAgIHdyaXR0ZW5faW5jbHVzaW9uIDwtIHdyaXRlX3hsc3goZGF0YSA9IGluY2x1ZGVkX2RmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9IGdsdWUoImluY2x1ZGVkX2dlbmVzL3tpbmNsdWRlX25hbWV9LXZ7dmVyfS54bHN4IikpCiAgICByZXRsaXN0W1tpbmNsdWRlX25hbWVdXSA8LSBpbmNsdWRlX2dlbmVzCiAgICByZXRsaXN0W1tjb250cmFzdF1dIDwtIGluY2x1ZGVfZ2VuZXMKICB9CiAgcmV0dXJuKHJldGxpc3QpCn0KYGBgCgojICdOb3JtYWwnIEluY2x1c2lvbiBleHRyYWN0aW9uCgpIZXJlIGlzIHRoZSBmdWxsIHNldCBvZiBnZW5lIElEcwoKYGBge3J9CmFsbF9nZW5lcyA8LSByb3duYW1lcyhhc3NheSh2M19wYWlyd2lzZV9pbnB1dCkpCmBgYAoKSW4gdGhlIGZvbGxvd2luZyBibG9ja3MgSSBhbSBpbmNsdWRpbmcgdGhlIHVuaW9uIG9mIGdlbmVzIG9ic2VydmVkCmhpZ2hlciB0aGFuIHd0IGluIGVpdGhlciBvZiB0aGUgbnVtZXJhdG9yIG9yIGRlbm9taW5hdG9yIGZvciBlYWNoCmNvbnRyYXN0LgoKIyMgVGltZQoKYGBge3J9CnRpbWVfaW5jbHVzaW9ucyA8LSBleHRyYWN0X2luY2x1c2lvbnMoaW5jbHVzaW9uX3NpZywgaW5jbHVzaW9uX3RhYmxlcywgaW5jbHVzaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2tlZXBlcnMsIGFsbF9nZW5lcykKYGBgCgojIyBMb2NhdGlvbgoKYGBge3J9CmxvY2F0aW9uX2luY2x1c2lvbnMgPC0gZXh0cmFjdF9pbmNsdXNpb25zKGluY2x1c2lvbl9zaWcsIGluY2x1c2lvbl90YWJsZXMsIGluY2x1c2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2tlZXBlcnMsIGFsbF9nZW5lcykKYGBgCgojIyBHZW5vdHlwZQoKYGBge3J9Cmdlbm90eXBlX2luY2x1c2lvbnMgPC0gZXh0cmFjdF9pbmNsdXNpb25zKGluY2x1c2lvbl9zaWcsIGluY2x1c2lvbl90YWJsZXMsIGluY2x1c2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbm90eXBlX2tlZXBlcnMsIGFsbF9nZW5lcykKYGBgCgojIFRoZSBzdHJpY3QgJ2luY2x1c2lvbicgc2V0CgojIyBUaW1lCgpgYGB7cn0KdGltZV9pbmNsdXNpb25zX3N0cmljdCA8LSBleHRyYWN0X2luY2x1c2lvbnNfc3RyaWN0KGluY2x1c2lvbl9zaWcsIGluY2x1c2lvbl90YWJsZXMsIGluY2x1c2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX2tlZXBlcnMsIGFsbF9nZW5lcykKYGBgCgojIyBMb2NhdGlvbgoKYGBge3J9CmxvY2F0aW9uX2luY2x1c2lvbnNfc3RyaWN0IDwtIGV4dHJhY3RfaW5jbHVzaW9uc19zdHJpY3QoaW5jbHVzaW9uX3NpZywgaW5jbHVzaW9uX3RhYmxlcywgaW5jbHVzaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9rZWVwZXJzLCBhbGxfZ2VuZXMpCmBgYAoKIyMgR2Vub3R5cGUKCmBgYHtyfQpnZW5vdHlwZV9pbmNsdXNpb25zX3N0cmljdCA8LSBleHRyYWN0X2luY2x1c2lvbnNfc3RyaWN0KGluY2x1c2lvbl9zaWcsIGluY2x1c2lvbl90YWJsZXMsIGluY2x1c2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2Vub3R5cGVfa2VlcGVycywgYWxsX2dlbmVzKQpgYGAKCiMjIyBDaGVjayB2cyBUaGVyZXNhJ3MgZmlsdGVyCgpVcCBhYm92ZSBUaGVyZXNhIHBlcmZvcm1lZCBhIDAuMjUgbG9nMkZDIGFuZCAwLjA1IGFkanAgZmlsdGVyIHdoaWNoCnByb3ZpZGVkIGEgc2V0IG9mIDIsNjQwIGdlbmVzIG9ic2VydmVkIGhpZ2hlciBpbiB0aGUgcDA4IGhldCByZXRpbmFzCnZzLiB3dCByZXRpbmFzLiAgSSBzaG91bGQgc2VlIHRoYXQgaW4gdGhpcyBpbmNsdXNpb25fc2lnIGRhdGEgc3RydWN0dXJlLgoKVGhlcmUgaXMgYW4gaW1wb3J0YW50IGNhdmVhdCB0aG91Z2g6IGluIFRoZXJlc2EncyBmaWx0ZXIgYWJvdmUsIHNoZQpkaWQgYSBERSBvZiBfb25seV8gdGhlIHJldGluYSBzYW1wbGVzIGJ1dCBJIGRpZCBhbGwgc2FtcGxlcy4gIEkKZXhwZWN0ZWQgdGhhdCB0aGlzIHdvdWxkIHJlc3VsdCBpbiBiYXNpY2FsbHkgdGhlIHNhbWUgcmVzdWx0IChJCmFjdHVhbGx5IGFzc3VtZWQgSSB3b3VsZCBnZXQgYSBmZXcgbW9yZSBnZW5lcyksIGJ1dCBpbnN0ZWFkIGl0IGFwcGVhcnMKdG8gaGF2ZSByZXRyaWV2ZWQgYSBzaWduaWZpY2FudGx5IHNtYWxsZXIgbnVtYmVyIG9mIGdlbmVzIChhYm91dCAxLzIsCmhhcHBpbHkgdGhleSBwcmV0dHkgbXVjaCBhbGwgYXBwZWFyIGluIHRoZSBwcmV2aW91cyBmaWx0ZXIpLiAgQXMgYQpyZXN1bHQsIEkgYW0gZ29pbmcgdG8gdHJ5IHJlbGF4aW5nIG15IGNvbnN0cmFpbnRzIHNsaWdodGx5IHRvIHNlZSBpZiBJCmNhbiByZWNhcGl0dWxhdGUgaGVyIGZpbHRlciAod2hpY2ggd291bGQgbWF0Y2ggVGhlcmVzYSdzIGxhdGVyIGZpbHRlciwKdGhvdWdoIEkgZ3Vlc3MgdGhhdCBpbiB0dXJuIHdpbGwgbGVhZCB0byBhIHNtYWxsZXIgc2V0IG9mIGdlbmVzCmNvbXBhcmVkIHRvIGhlciBsYXRlciwgcmVsYXhlZCAwLjEgZmlsdGVyKS4KCmBgYHtyfQpjb21wYXJpc29uIDwtIGluY2x1c2lvbl9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbInAwOF9oZXRfcmV0aW5hIl1dCmNvbXAgPC0gbGlzdCgKICAidGFhIiA9IHRhYV9rZWVwZXJzLAogICJuZXciID0gcm93bmFtZXMoY29tcGFyaXNvbikpCnRlc3RfY29tcGFyaXNvbiA8LSBWZW5uZXJhYmxlOjpWZW5uKGNvbXApClZlbm5lcmFibGU6OnBsb3QodGVzdF9jb21wYXJpc29uKQpgYGAKCkkgd2FudCB0byBoYXZlIGEgbGl0dGxlIGZ1bmN0aW9uIHdoaWNoLCBnaXZlbiBhIGNvbnRyYXN0IG9mIGludGVyZXN0LAp3aWxsIGV4dHJhY3QgdGhlIGdlbmUgc2V0cyB3aGljaCBzaG91bGQgYmUgaW5jbHVkZWQvZXhjbHVkZWQgZ2l2ZW4gdGhlCmFib3ZlLgoKYGBge3J9CndyaXRlX2FsbF9jcCA8LSBmdW5jdGlvbihhbGxfY3AsIHByZWZpeCA9ICIxMiIsIHN1ZmZpeCA9ICIiKSB7CiAgYWxsX3dyaXR0ZW4gPC0gbGlzdCgpCiAgZm9yIChnIGluIHNlcV9sZW4obGVuZ3RoKGFsbF9jcCkpKSB7CiAgICBuYW1lIDwtIG5hbWVzKGFsbF9jcClbZ10KICAgIGRhdHVtIDwtIGFsbF9jcFtbbmFtZV1dCiAgICBmaWxlbmFtZSA8LSBnbHVlKCJ7cHJlZml4fWVucmljaG1lbnRfZXhjZWwve25hbWV9X2Nwcm9maWxlcntzdWZmaXh9LXZ7dmVyfS54bHN4IikKICAgIHdyaXR0ZW4gPC0gc20od3JpdGVfY3BfZGF0YShkYXR1bSwgZXhjZWwgPSBmaWxlbmFtZSkpCiAgICBhbGxfd3JpdHRlbltbZ11dIDwtIHdyaXR0ZW4KICB9CiAgcmV0dXJuKGFsbF93cml0dGVuKQp9CndyaXRlX2FsbF9ncCA8LSBmdW5jdGlvbihhbGxfZ3AsIHByZWZpeCA9ICIxMyIsIHN1ZmZpeCA9ICIiKSB7CiAgYWxsX3dyaXR0ZW4gPC0gbGlzdCgpCiAgZm9yIChnIGluIHNlcV9sZW4obGVuZ3RoKGFsbF9ncCkpKSB7CiAgICBuYW1lIDwtIG5hbWVzKGFsbF9ncClbZ10KICAgIGRhdHVtIDwtIGFsbF9ncFtbbmFtZV1dCiAgICBmaWxlbmFtZSA8LSBnbHVlKCJ7cHJlZml4fWVucmljaG1lbnRfZXhjZWwve25hbWV9X2dwcm9maWxlcntzdWZmaXh9LXZ7dmVyfS54bHN4IikKICAgIHdyaXR0ZW4gPC0gc20od3JpdGVfZ3Byb2ZpbGVyX2RhdGEoZGF0dW0sIGV4Y2VsID0gZmlsZW5hbWUpKQogICAgYWxsX3dyaXR0ZW5bW2ddXSA8LSB3cml0dGVuCiAgfQogIHJldHVybihhbGxfd3JpdHRlbikKfQp3cml0ZV9hbGxfZW4gPC0gZnVuY3Rpb24oYWxsX2VuLCBwcmVmaXggPSAiMTQiLCBzdWZmaXggPSAiIikgewogIGFsbF93cml0dGVuIDwtIGxpc3QoKQogIGZvciAoZSBpbiBzZXFfbGVuKGxlbmd0aChhbGxfZW4pKSkgewogICAgbmFtZSA8LSBuYW1lcyhhbGxfZW4pW2VdCiAgICBkYXR1bSA8LSBhbGxfZW5bW25hbWVdXQogICAgZmlsZW5hbWUgPC0gZ2x1ZSgie3ByZWZpeH1lbnJpY2htZW50X2V4Y2VsL3tuYW1lfV9lbnJpY2hlcntzdWZmaXh9LXZ7dmVyfS54bHN4IikKICAgIHdyaXR0ZW4gPC0gc20od3JpdGVfZW5yaWNoZXJfZGF0YShkYXR1bSwgZXhjZWwgPSBmaWxlbmFtZSkpCiAgICBhbGxfd3JpdHRlbltbZV1dIDwtIHdyaXR0ZW4KICB9CiAgcmV0dXJuKGFsbF93cml0dGVuKQp9CmBgYAoKIyMjIEV4dHJhY3QgZ2VuZXMgaW5jbHVkZWQgZm9yIGVhY2ggc2V0IG9mIGNvbnRyYXN0cwoKTm93LCB1c2luZyB0aGF0IGZ1bmN0aW9uLCBwdWxsIG91dCB0aGUgZ2VuZSBJRHMgb2YgZ2VuZXMgd2UgZG8gbm90CnRydXN0IGJlY2F1c2UgdGhleSB3ZXJlIHRvbyBoaWdoIGluIHd0IGZvciBldmVyeSBjb250cmFzdCB3ZSBhcmUKbGlrZWx5IHRvIHBlcmZvcm0uCgpgYGB7cn0KYWxsX2dlbmVzIDwtIHJvd25hbWVzKGFzc2F5KHYzX3BhaXJ3aXNlX2lucHV0KSkKdGltZV9pbmNsdXNpb25zIDwtIGV4dHJhY3RfaW5jbHVzaW9ucyhpbmNsdXNpb25fc2lnLCBpbmNsdXNpb25fdGFibGVzLCBpbmNsdXNpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfa2VlcGVycywgYWxsX2dlbmVzKQpsb2NhdGlvbl9pbmNsdXNpb25zIDwtIGV4dHJhY3RfaW5jbHVzaW9ucyhpbmNsdXNpb25fc2lnLCBpbmNsdXNpb25fdGFibGVzLCBpbmNsdXNpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9rZWVwZXJzLCBhbGxfZ2VuZXMpCmdlbm90eXBlX2luY2x1c2lvbnMgPC0gZXh0cmFjdF9pbmNsdXNpb25zKGluY2x1c2lvbl9zaWcsIGluY2x1c2lvbl90YWJsZXMsIGluY2x1c2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbm90eXBlX2tlZXBlcnMsIGFsbF9nZW5lcykKYGBgCgojIyBQZXJmb3JtIHRoZSBERSBhbmFseXNlcyBhbmQgZXhjbHVkZSB0aGUgdGFyZ2V0IGdlbmVzCgoKIyMjIEdlbm90eXBlCgpgYGB7cn0KZ2Vub3R5cGVfZGUgPC0gYWxsX3BhaXJ3aXNlKHYzX3BhaXJ3aXNlX2lucHV0LCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9mc3RyaW5nID0gZGVmYXVsdF9mc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGVycyA9IGdlbm90eXBlX2tlZXBlcnMsIG1vZGVsX3N2cyA9ICJzdmFzZXEiKQpnZW5vdHlwZV9kZQpgYGAKCiMjIyBMb2NhdGlvbgoKYGBge3J9CmxvY2F0aW9uX2RlIDwtIGFsbF9wYWlyd2lzZSh2M19wYWlyd2lzZV9pbnB1dCwgZmlsdGVyID0gVFJVRSwgbW9kZWxfZnN0cmluZyA9IGRlZmF1bHRfZnN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnMgPSBsb2NhdGlvbl9rZWVwZXJzLCBtb2RlbF9zdnMgPSAic3Zhc2VxIikKbG9jYXRpb25fZGUKYGBgCgojIyMgVGltZQoKYGBge3J9CnRpbWVfZGUgPC0gYWxsX3BhaXJ3aXNlKHYzX3BhaXJ3aXNlX2lucHV0LCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9mc3RyaW5nID0gZGVmYXVsdF9mc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICBrZWVwZXJzID0gdGltZV9rZWVwZXJzLCBtb2RlbF9zdnMgPSAic3Zhc2VxIikKdGltZV9kZQpgYGAKCkl0IGlzIG5lYXIgaGVyZSB3aGVuIHRoZSBjb21wdXRlciBzb21ldGltZXMgZmFpbHMgd2l0aCBubyBtb3JlCnRlbXBmaWxlcy4gIEluIGFub3RoZXIgd2luZG93IEkgYW0gbWVzc2luZyB3aXRoIHRlbXBmaWxlKCkgaW4gUiB0byB0cnkKdG8gdW5kZXJzdGFuZCB3aGVyZSBpdCBpcyBnb2luZyBvZmYgdGhlIHJhaWxzLi4uCgojIyBFeHRyYWN0IHRoZSByZWxldmFudCB0YWJsZXMgYW5kIGluY2x1ZGUgZ2VuZXMgbG93ZXIgaW4gd3QKCiMjIyBHZW5vdHlwZSBjb250cmFzdHMKCkkgd2lsbCBzdGFydCB3aXRoIHRoZSB0YWJsZXMgYW5kIG5vIGluY2x1c2lvbnMgc28gSSBjYW4gY2hlY2sgbXkgd29yay4KCkluIHRoaXMgZmlyc3QgYmxvY2sgSSB3aWxsIGV4cGxhaW4gYSBsaXR0bGUgbW9yZSB0aG9yb3VnaGx5IHdoYXQgaXMKZ29pbmcgb246CgoxLiAgRHVtcCB0aGUgZnVsbCB0YWJsZSBvZiB0aGUgY29udHJhc3RzIEkgZGVmaW5lZCBhYm92ZSBjb21wYXJpbmcgdGhlCiAgICAzIGdlbm90eXBlcyBhY3Jvc3MgdGltZS9sb2NhdGlvbi4KMi4gIEl0ZXJhdGUgb3ZlciBlYWNoIG9mIHRob3NlIGNvbnRyYXN0cyBhbmQgZG8gdGhlIGZvbGxvd2luZzoKICAgIGEuICBFeHRyYWN0IHRoZSBuYW1lIG9mIHRoZSBjb250cmFzdCwgJ2toX3AwOF9kbGduJyBmb3IgZXhhbXBsZQogICAgYi4gIFlhbmsgb3V0IHRoYXQgc3BlY2lmaWMgZW50cnkgZnJvbSB0aGUga2VlcGVyIGxpc3QgYW5kIGl0cyBuYW1lCiAgICBjLiAgWWFuayBvdXQgdGhlIGNvcnJlc3BvbmRpbmcgc2V0IG9mIGdlbmVzIHRvIGluY2x1ZGUgZnJvbSB0aGUKICAgICAgICBpbmNsdXNpb25zIGRhdGEgc3RydWN0dXJlLgogICAgZC4gIENyZWF0ZSBhIGZpbGVuYW1lIGdpdmVuIHRoZSBuYW1lIGluIChhKSBhYm92ZSBhbmQgdGhlIGxvZ0ZDCiAgICAgICAgY3V0b2ZmIGNob3NlbiBmb3IgdGhlIGluY2x1c2lvbnMgKEkgYW0gYXNzdW1pbmcgd2UgbWF5IGNoYW5nZQogICAgICAgIHRoaXMpCiAgICBlLiAgR2l2ZW4gKGIpLCAoYyksIGFuZCAoZCksIGV4dHJhY3QgdGhlIGNvcnJlc3BvbmRpbmcgdGFibGUgZnJvbQogICAgICAgIHRoZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcyBhbmQgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKICAgICAgICBnZW5lcy4KCiAgICBGSVhNRTogbXkgZ3Byb2ZpbGVyIGZ1bmN0aW9uIGp1c3QgYXNzdW1lcyBodW1hbiBhbmQgc28gaWYgcGFzc2VkIG1tdXNjdWx1cyB3aWxsIGluY29ycmVjdGx5CiAgICBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gbm9uLWV4aXN0YW50IGRhdGFiYXNlcy4gIExldCB1cyBmaXggdGhhdCBub3cuCgpgYGB7cn0KZ2Vub3R5cGVfdGFibGVzX2Z1bGwgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgZ2Vub3R5cGVfZGUsIGtlZXBlcnMgPSBnZW5vdHlwZV9rZWVwZXJzLCBsYWJlbF9jb2x1bW4gPSBsYWJlbF9jb2x1bW4sCiAgZmFuY3kgPSBUUlVFLAogIGV4Y2VsID0gZ2x1ZSgiMDhmdWxsX2NvbnRyYXN0c19leGNlbC9nZW5vdHlwZV9mdWxsX3RhYmxlcy12e3Zlcn0ueGxzeCIpKQpnZW5vdHlwZV90YWJsZXNfZnVsbApnZW5vdHlwZV9zaWdfZnVsbCA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGdlbm90eXBlX3RhYmxlc19mdWxsLCBhY2NvcmRpbmdfdG8gPSAiZGVzZXEiLAogIGV4Y2VsID0gZ2x1ZSgiMDhmdWxsX2NvbnRyYXN0c19leGNlbC9nZW5vdHlwZV9mdWxsX3NpZy12e3Zlcn0ueGxzeCIpKQpnZW5vdHlwZV9zaWdfZnVsbApgYGAKCiMjIyBTZWFyY2ggRW5yaWNobWVudCBvZiB0aGVzZSBzZXRzCgpJbiB0aGlzIHJ1biwgd2Ugd2lsbCBzZWFyY2ggdGhlIGZ1bGwgc2V0IG9mIGdlbmVzLCBuZXh0IHdlIHdpbGwgb25seQpkbyB0aGUgaW5jbHVzaW9ucy4KCmBgYHtyfQpnZW5vdHlwZV9mdWxsX2dwIDwtIGFsbF9ncHJvZmlsZXIoZ2Vub3R5cGVfc2lnX2Z1bGwsIHNwZWNpZXMgPSAibW11c2N1bHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsID0gIjA5ZnVsbF9jb250cmFzdHNfZW5yaWNoL2dlbm90eXBlX2Z1bGxfZ3Byb2ZpbGVyLnhsc3giKQpnZW5vdHlwZV9mdWxsX2NwIDwtIGFsbF9jcHJvZmlsZXIoZ2Vub3R5cGVfc2lnX2Z1bGwsIGdlbm90eXBlX3RhYmxlc19mdWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnZGIgPSAib3JnLk1tLmVnLmRiIiwgZ29fbGV2ZWwgPSBnb19sZXZlbCwgb3JnYW5pc20gPSAibW91c2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnZGJfZnJvbSA9ICJFTlNFTUJMIiwgbWF4X2dyb3Vwc2l6ZSA9IG1heF9ncm91cHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbCA9ICIwOWZ1bGxfY29udHJhc3RzX2VucmljaC9nZW5vdHlwZV9mdWxsX2Nwcm9maWxlci54bHN4IikKZ2Vub3R5cGVfZnVsbF91cHNldCA8LSB1cHNldHJfc2lnKGdlbm90eXBlX3NpZ19mdWxsKQpnZW5vdHlwZV9mdWxsX2ludGVyc2VjdHMgPC0gd3JpdGVfdXBzZXRfZ3JvdXBzKGdlbm90eXBlX2Z1bGxfdXBzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWwgPSAiMDlmdWxsX2NvbnRyYXN0c19pbnRlcnNlY3Rpb25zL2dlbm90eXBlX2Z1bGxfZ2VuZV9ncm91cHMueGxzeCIpCmBgYAoKCgoKCgpgYGB7cn0KZ2Vub3R5cGVfdGFibGVzIDwtIGxpc3QoKQpnZW5vdHlwZV9zaWcgPC0gbGlzdCgpCmdlbm90eXBlX2dwIDwtIGxpc3QoKQpnZW5vdHlwZV9jcCA8LSBsaXN0KCkKZm9yIChrIGluIHNlcV9hbG9uZyhnZW5vdHlwZV9rZWVwZXJzKSkgewogIG5hbWUgPC0gbmFtZXMoZ2Vub3R5cGVfa2VlcGVycylba10KICBtZXNzYWdlKCJFeGFtaW5pbmcgIiwgbmFtZSkKICBrZWVwZXIgPC0gZ2Vub3R5cGVfa2VlcGVyc1tuYW1lXQogIGluY2x1ZGVfbmFtZSA8LSBwYXN0ZTAoImluY18iLCBuYW1lKQogIGluY2x1ZGVfZGZfbmFtZSA8LSBwYXN0ZTAoImRmXyIsIG5hbWUpCiAgaW5jbHVkZV9kZiA8LSBnZW5vdHlwZV9pbmNsdXNpb25zW1tpbmNsdWRlX2RmX25hbWVdXQogIGluY2x1ZGVzIDwtIGdlbm90eXBlX2luY2x1c2lvbnNbW2luY2x1ZGVfbmFtZV1dCiAgc3VtbWFyeShyb3duYW1lcyhnZW5vdHlwZV9zaWdfZnVsbFtbImRlc2VxIl1dW1sidXBzIl1dW1tuYW1lXV0pICVpbiUgaW5jbHVkZXMpCiAgaW5jbHVkZV9maWxlbmFtZSA8LSBnbHVlKCJnZW5vdHlwZV9jb250cmFzdHMvZ2Vub3R5cGVfe25hbWV9X2luY2x1ZGluZ193dF97bGZjX2N1dG9mZn1fZGVjcmVhc2VkX3RhYmxlLXZ7dmVyfS54bHN4IikKICBpbmNsdWRlX3NpZ19maWxlbmFtZSA8LSBnbHVlKCJnZW5vdHlwZV9jb250cmFzdHMvZ2Vub3R5cGVfe25hbWV9X2luY2x1ZGluZ193dF97bGZjX2N1dG9mZn1fZGVjcmVhc2VkX3NpZy12e3Zlcn0ueGxzeCIpCiAgZ2Vub3R5cGVfdGFibGVzW1tuYW1lXV0gPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBnZW5vdHlwZV9kZSwgZXh0cmFfYW5ub3QgPSBpbmNsdWRlX2RmLAogICAga2VlcGVycyA9IGtlZXBlciwgbGFiZWxfY29sdW1uID0gbGFiZWxfY29sdW1uLAogICAgZXhjZWwgPSBpbmNsdWRlX2ZpbGVuYW1lLCB3YW50ZWRfZ2VuZXMgPSBpbmNsdWRlcykKICBwcmludChnZW5vdHlwZV90YWJsZXNbW25hbWVdXSkKICBnZW5vdHlwZV9zaWdbW25hbWVdXSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgZ2Vub3R5cGVfdGFibGVzW1tuYW1lXV0sIGFjY29yZGluZ190byA9ICJkZXNlcSIsCiAgICBleGNlbCA9IGluY2x1ZGVfc2lnX2ZpbGVuYW1lKQogIHByaW50KGdlbm90eXBlX3NpZ1tbbmFtZV1dKQogIG51bV9yb3dzIDwtIG5yb3coZ2Vub3R5cGVfc2lnW1tuYW1lXV1bWyJkZXNlcSJdXVtbInVwcyJdXVtbbmFtZV1dKSArCiAgICBucm93KGdlbm90eXBlX3NpZ1tbbmFtZV1dW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbbmFtZV1dKQogIG1lc3NhZ2UoIlRoZXJlIGFyZSAiLCBudW1fcm93cywgIiBzaWduaWZpY2FudCB1cCBhbmQgZG93biBnZW5lcy4iKQogIGlmIChudW1fcm93cyA+PSAxMCkgewogICAgbWVzc2FnZSgiUGVyZm9ybWluZyBncHJvZmlsZXIvY2x1c3RlclByb2ZpbGVyLiIpCiAgICBnZW5vdHlwZV9ncFtbbmFtZV1dIDwtIGFsbF9ncHJvZmlsZXIoZ2Vub3R5cGVfc2lnW1tuYW1lXV0sIHNwZWNpZXMgPSAibW11c2N1bHVzIikKICAgIGdwX3dyaXR0ZW4gPC0gd3JpdGVfYWxsX2dwKGdlbm90eXBlX2dwW1tuYW1lXV0pCiAgICBnZW5vdHlwZV9jcFtbbmFtZV1dIDwtIGFsbF9jcHJvZmlsZXIoZ2Vub3R5cGVfc2lnW1tuYW1lXV0sIGdlbm90eXBlX3RhYmxlc1tbbmFtZV1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2RiID0gIm9yZy5NbS5lZy5kYiIsIGtlZ2dfb3JnYW5pc20gPSAibW11IikKICAgIGNwX3dyaXR0ZW4gPC0gd3JpdGVfYWxsX2NwKGdlbm90eXBlX2NwW1tuYW1lXV0pCiAgfSBlbHNlIHsKICAgIHdhcm5pbmcoIlRoZXJlIGFyZSBsZXNzIHRoYW4gMTAgZ2VuZXMgdXAgYW5kIGRvd24gaW4gdGhlICIsIG5hbWUsICIgY29tcGFyaXNvbi4iKQogICAgbWVzc2FnZSgiVGhlcmUgYXJlIGxlc3MgdGhhbiAxMCBnZW5lcyB1cCBhbmQgZG93biBpbiB0aGUgIiwgbmFtZSwgIiBjb21wYXJpc29uLiIpCiAgfQp9CmBgYAoKQSBmZXcgc3BlY2lmaWMgcGxvdHMgb2YgaW50ZXJlc3Q6IENvbGVuc28gYXNrZWQgdG8gbGFiZWwgYSBmZXcgZ2VuZXMKZm9yIHRoZSBrbm9ja291dC9oZXQgcDA4X3JldGluYXMsIHAwOF9zY24sIGFuZCBwMDhfZGxnbjogZWl0aGVyIHRoZQp0b3AtMTUgb3IgYWxsIHNpZ25pZmljYW50LiAgSSBhbSBwcmV0dHkgc3VyZSBpZiBJIHRlbGwgaXQgMTUgYW5kIHRoZXJlCmFyZSBub3QgdGhhdCBtYW55LCBpdCB3aWxsIGp1c3QgZG8gdGhlIHNpZ25pZmljYW50PyAgTGV0IHVzIGZpbmQgb3V0IQoKIyMjIyBrby9oZXQgZm9yIHAwOCByZXRpbmFzCgpGb3Igc29tZSBjcmF6eSByZWFzb24sIHRoaXMgcGxvdCBpcyBkb3VibGUtbGFiZWxsaW5nIQoKYGBge3J9CnRhYmxlX25hbWUgPC0gImtoX3AwOF9yZXRpbmEiCnRhYmxlX2lucHV0IDwtIGdlbm90eXBlX3RhYmxlc1tbdGFibGVfbmFtZV1dCnRhYmxlIDwtIHRhYmxlX2lucHV0W1siZGF0YSJdXVtbdGFibGVfbmFtZV1dCmludGVyZXN0aW5nIDwtIGMoIk9wbjQiLCAiR205MDA4IiwgIkxycjEiLCAiQ25iZDEiKQpraF9wMDhfcmV0aW5hX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGZpbGwgPSAiYmxhY2siLAogIGNvbG9yX2xvdyA9IGNvbG9yc1tbImtvX3JldGluYSJdXSwgY29sb3JfaGlnaCA9IGNvbG9yc1tbImhldF9yZXRpbmEiXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nLCBhbHBoYSA9IDEuMCwKICBzaXplID0gNCkKcHAoZmlsZSA9ICJpbWFnZXMva2hfcDA4X3JldGluYV92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa2hfcDA4X3JldGluYV92b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpraF9wMDhfcmV0aW5hX3ZvbGNhbm9bWyJwbG90Il1dCiMjIHdoeSBpbiB0aGUgY3JhcCBpcyBpdCBkb3VibGUtbGFiZWxsaW5nIT8KCiMjIE15IE1BIHBsb3R0ZXIgaXNuJ3QgYXMgc21hcnQgYXMgdGhlIHZvbGNhbm8gcGxvdHRlciwgdGhlIGdlbmVzIGFyZToKa2hfcDA4X3JldGluYV9tYSA8LSBwbG90X21hX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZXhwcl9jb2wgPSAiZGVzZXFfYmFzZW1lYW4iLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLAogIGNvbG9yX2xvdyA9IGNvbG9yc1tbImtvX3JldGluYSJdXSwgY29sb3JfaGlnaCA9IGNvbG9yc1tbImhldF9yZXRpbmEiXV0sCiAgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgbGFiZWwgPSBpbnRlcmVzdGluZykKcHAoZmlsZSA9ICJpbWFnZXMva2hfcDA4X3JldGluYV9tYS5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmtoX3AwOF9yZXRpbmFfbWFbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmtoX3AwOF9yZXRpbmFfbWFbWyJwbG90Il1dCmBgYAoKIyMjIyBrby9oZXQgcDA4IFNDTgoKSG9seSBjcmFwcGVycywgdGhpcyBwbG90IGRpZCBfbm90XyBkb3VibGUgbGFiZWw7IG9vb2ggSSBoYXZlIGEgY2hlY2sKaW4gbXkgcGxvdHRlciB0byBzZWUgaWYgdGhlcmUgYXJlIHRvbyBmZXcvdG9vIG1hbnkgbGFiZWxzIGFuZCBJCmZvb2xpc2hseSBhbGxvd2VkIGl0IHRvIGNvbmNhdGVuYXRlIHRoZSBsYWJlbHMhICBXaGF0IGluIHRoZSBjcmFwIHdhcwpJIHRoaW5raW5nPwoKSSBhbSBnb2luZyB0byBtYWtlIGFuIGV4ZWN1dGl2ZSBkZWNpc2lvbiBmb3IgdGhpcyBwbG90LCAxNSBpcyB0b28gbWFueQphbmQgbWFrZXMgaXQgY3JhenkgY2x1dHRlcmVkLgoKIyMjIFJlcGVhdCB0aGlzIHdpdGggdHdvIHNldHMgb2YgZ2VuZXMKCmBgYHtyfQp0YWJsZV9uYW1lIDwtICJraF9wMDhfc2NuIgp0YWJsZV9pbnB1dCA8LSBnZW5vdHlwZV90YWJsZXNbW3RhYmxlX25hbWVdXQp0YWJsZSA8LSB0YWJsZV9pbnB1dFtbImRhdGEiXV1bW3RhYmxlX25hbWVdXQppbnRlcmVzdGluZ19nZW5lcyA8LSBjKCJGaWduIiwgIk5ybjEiLCAiRHB5c2wyIiwgIkFjdGIiLCAiRmdmOSIsICJPdHgyIiwgIlNlYzIzIiwKICAgICAgICAgICAgICAgICAgICAgICAiTmNhbTEiLCAiTWFwNCIsICJTZWMyMmIiLCAiTmxnbjMiLCAiTWFyY2tzIiwgIkNkNDciLAogICAgICAgICAgICAgICAgICAgICAgICJEcHlzbDMiLCAiTGluN2MiLCAiQ2FkbTEiLCAiU254MTIiLCAiUmhvYSIsICJJbnBwNWYiLAogICAgICAgICAgICAgICAgICAgICAgICJBdGcxMiIsICJTZXQiLCAiR3NrM2IiLCAiUGRjZDQiLCAiR2FicmEyIiwgIlRtY28xIiwgIkFuYXBjMTYiKQpraF9wMDhfc2NuX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzLCBzaXplID0gNCwgYWxwaGEgPSAxLjAsCiAgY29sb3JfbG93ID0gY29sb3JzW1sia29fc2NuIl1dLCBjb2xvcl9oaWdoID0gY29sb3JzW1siaGV0X3NjbiJdXSkKcHAoZmlsZSA9ICJpbWFnZXMva2hfcDA4X3Njbl92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa2hfcDA4X3Njbl92b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpraF9wMDhfc2NuX3ZvbGNhbm9bWyJwbG90Il1dCiMjIHdoeSBpbiB0aGUgY3JhcCBpcyBpdCBkb3VibGUtbGFiZWxsaW5nIT8KIyMgTXkgTUEgcGxvdHRlciBpc24ndCBhcyBzbWFydCBhcyB0aGUgdm9sY2FubyBwbG90dGVyLCB0aGUgZ2VuZXMgYXJlOgpraF9wMDhfc2NuX21hIDwtIHBsb3RfbWFfY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBleHByX2NvbCA9ICJkZXNlcV9iYXNlbWVhbiIsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsCiAgY29sb3JfbG93ID0gY29sb3JzW1sia29fc2NuIl1dLCBjb2xvcl9oaWdoID0gY29sb3JzW1siaGV0X3NjbiJdXSwKICBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzKQpwcChmaWxlID0gImltYWdlcy9raF9wMDhfc2NuX21hLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa2hfcDA4X3Njbl9tYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa2hfcDA4X3Njbl9tYVtbInBsb3QiXV0KYGBgCgojIyMjIFNhbWUgcGxvdCBidXQgYSBkaWZmZXJlbnQgc2V0IG9mIGxhYmVsZWQgZ2VuZXMKCmBgYHtyfQp0YWJsZV9uYW1lIDwtICJraF9wMDhfc2NuIgp0YWJsZV9pbnB1dCA8LSBnZW5vdHlwZV90YWJsZXNbW3RhYmxlX25hbWVdXQp0YWJsZSA8LSB0YWJsZV9pbnB1dFtbImRhdGEiXV1bW3RhYmxlX25hbWVdXQppbnRlcmVzdGluZ19nZW5lcyA8LSBjKAogICJBbmFwYzE2IiwgIkdhYnJhMiIsICJUbWNvMSIsICJTb2QyIiwgIkZnZjkiLCAiUGRjZDQiLCAiUmhvYSIsICJHc2szYiIsICJGb3hwMSIsCiAgIk5jYW0xIiwgIk1hcmNrcyIsICJGaWduIiwgIkRweXNsMyIsICJJbnBwNWYiLCAiQ2FkbTEiLCAiTWFwNCIsICJVZ2NnIiwgIkVsb3ZsNCIsCiAgIkVsYXZsMSIsICJDZmwyIiwgIlRubnQxIiwgIkduYjEiLCAiSW1wYWN0IiwgIk5ybjEiLCAiTmxnbjMiLCAiQWN0YiIsICJDZDQ3IiwKICAiU2VjMjJiIiwgIlNsYzE3YTciLCAiVmdsdXQxIiwgIkFjdGIiLCAiQjRnYWx0NSIsICJGb3hwMSIsICJPdHgyIiwgIkxpbjdjIiwKICAiU254MTIiLCAiQXRnMTIiLCAiU2V0IikKa2hfcDA4X3Njbl92b2xjYW5vIDwtIHBsb3Rfdm9sY2Fub19jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsIHBfY29sID0gImRlc2VxX2FkanAiLAogIGNvbG9yX2xvdyA9IGNvbG9yc1tbImtvX3NjbiJdXSwgY29sb3JfaGlnaCA9IGNvbG9yc1tbImhldF9zY24iXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzLCBzaXplID0gNCwgYWxwaGEgPSAxLjApCnBwKGZpbGUgPSAiaW1hZ2VzL2toX3AwOF9zY25fdm9sY2Fub192Mi5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmtoX3AwOF9zY25fdm9sY2Fub1tbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa2hfcDA4X3Njbl92b2xjYW5vW1sicGxvdCJdXQojIyB3aHkgaW4gdGhlIGNyYXAgaXMgaXQgZG91YmxlLWxhYmVsbGluZyE/CiMjIE15IE1BIHBsb3R0ZXIgaXNuJ3QgYXMgc21hcnQgYXMgdGhlIHZvbGNhbm8gcGxvdHRlciwgdGhlIGdlbmVzIGFyZToKa2hfcDA4X3Njbl9tYSA8LSBwbG90X21hX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZXhwcl9jb2wgPSAiZGVzZXFfYmFzZW1lYW4iLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLAogIGNvbG9yX2xvdyA9IGNvbG9yc1tbImtvX3NjbiJdXSwgY29sb3JfaGlnaCA9IGNvbG9yc1tbImhldF9zY24iXV0sCiAgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgbGFiZWwgPSBpbnRlcmVzdGluZ19nZW5lcykKcHAoZmlsZSA9ICJpbWFnZXMva2hfcDA4X3Njbl9tYV92Mi5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmtoX3AwOF9zY25fbWFbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmtoX3AwOF9zY25fbWFbWyJwbG90Il1dCmBgYAoKIyMjIyBrby9oZXQgcDA4IGRMR04KCmBgYHtyfQp0YWJsZV9uYW1lIDwtICJraF9wMDhfZGxnbiIKdGFibGVfaW5wdXQgPC0gZ2Vub3R5cGVfdGFibGVzW1t0YWJsZV9uYW1lXV0KdGFibGUgPC0gdGFibGVfaW5wdXRbWyJkYXRhIl1dW1t0YWJsZV9uYW1lXV0Ka2hfcDA4X2RsZ25fdm9sY2FubyA8LSBwbG90X3ZvbGNhbm9fY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLCBwX2NvbCA9ICJkZXNlcV9hZGpwIiwKICBjb2xvcl9sb3cgPSBjb2xvcnNbWyJrb19kbGduIl1dLCBjb2xvcl9oaWdoID0gY29sb3JzW1siaGV0X2RsZ24iXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IDEwLCBzaXplID0gNCwgYWxwaGEgPSAxLjApCnBwKGZpbGUgPSAiaW1hZ2VzL2toX3AwOF9kbGduX3ZvbGNhbm8ucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQpraF9wMDhfZGxnbl92b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpraF9wMDhfZGxnbl92b2xjYW5vW1sicGxvdCJdXQojIyBNeSBNQSBwbG90dGVyIGlzbid0IGFzIHNtYXJ0IGFzIHRoZSB2b2xjYW5vIHBsb3R0ZXIsIHRoZSBnZW5lcyBhcmU6CmtoX3AwOF9kbGduX21hIDwtIHBsb3RfbWFfY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBleHByX2NvbCA9ICJkZXNlcV9iYXNlbWVhbiIsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsCiAgY29sb3JfbG93ID0gY29sb3JzW1sia29fZGxnbiJdXSwgY29sb3JfaGlnaCA9IGNvbG9yc1tbImhldF9kbGduIl1dLAogIHBfY29sID0gImRlc2VxX2FkanAiLCBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIGxhYmVsID0gMTApCnBwKGZpbGUgPSAiaW1hZ2VzL2toX3AwOF9kbGduX21hLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa2hfcDA4X2RsZ25fbWFbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmtoX3AwOF9kbGduX21hW1sicGxvdCJdXQpgYGAKCiMjIyMga28vaGV0IGZvciBwMTUgcmV0aW5hcwoKRm9yIHNvbWUgY3JhenkgcmVhc29uLCB0aGlzIHBsb3QgaXMgZG91YmxlLWxhYmVsbGluZyEKCmBgYHtyfQp0YWJsZV9uYW1lIDwtICJraF9wMTVfcmV0aW5hIgp0YWJsZV9pbnB1dCA8LSBnZW5vdHlwZV90YWJsZXNbW3RhYmxlX25hbWVdXQp0YWJsZSA8LSB0YWJsZV9pbnB1dFtbImRhdGEiXV1bW3RhYmxlX25hbWVdXQppbnRlcmVzdGluZyA8LSBjKCJPcG40IiwgIkdtOTAwOCIsICJMcnIxIiwgIkNuYmQxIikKa2hfcDE1X3JldGluYV92b2xjYW5vIDwtIHBsb3Rfdm9sY2Fub19jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsIHBfY29sID0gImRlc2VxX2FkanAiLCBmaWxsID0gImJsYWNrIiwKICBjb2xvcl9sb3cgPSBjb2xvcnNbWyJrb19yZXRpbmEiXV0sIGNvbG9yX2hpZ2ggPSBjb2xvcnNbWyJoZXRfcmV0aW5hIl1dLAogIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgbGFiZWwgPSBpbnRlcmVzdGluZywgYWxwaGEgPSAxLjAsCiAgc2l6ZSA9IDQpCnBwKGZpbGUgPSAiaW1hZ2VzL2toX3AxNV9yZXRpbmFfdm9sY2Fuby5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmtoX3AxNV9yZXRpbmFfdm9sY2Fub1tbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa2hfcDE1X3JldGluYV92b2xjYW5vW1sicGxvdCJdXQojIyB3aHkgaW4gdGhlIGNyYXAgaXMgaXQgZG91YmxlLWxhYmVsbGluZyE/CiMjIE15IE1BIHBsb3R0ZXIgaXNuJ3QgYXMgc21hcnQgYXMgdGhlIHZvbGNhbm8gcGxvdHRlciwgdGhlIGdlbmVzIGFyZToKa2hfcDE1X3JldGluYV9tYSA8LSBwbG90X21hX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZXhwcl9jb2wgPSAiZGVzZXFfYmFzZW1lYW4iLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLAogIGNvbG9yX2xvdyA9IGNvbG9yc1tbImtvX3JldGluYSJdXSwgY29sb3JfaGlnaCA9IGNvbG9yc1tbImhldF9yZXRpbmEiXV0sCiAgcF9jb2wgPSAiZGVzZXFfYWRqcCIsIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgbGFiZWwgPSBpbnRlcmVzdGluZykKcHAoZmlsZSA9ICJpbWFnZXMva2hfcDE1X3JldGluYV9tYS5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmtoX3AxNV9yZXRpbmFfbWFbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmtoX3AxNV9yZXRpbmFfbWFbWyJwbG90Il1dCmBgYAoKIyMjIyBrby9oZXQgcDE1IFNDTgoKSG9seSBjcmFwcGVycywgdGhpcyBwbG90IGRpZCBfbm90XyBkb3VibGUgbGFiZWw7IG9vb2ggSSBoYXZlIGEgY2hlY2sKaW4gbXkgcGxvdHRlciB0byBzZWUgaWYgdGhlcmUgYXJlIHRvbyBmZXcvdG9vIG1hbnkgbGFiZWxzIGFuZCBJCmZvb2xpc2hseSBhbGxvd2VkIGl0IHRvIGNvbmNhdGVuYXRlIHRoZSBsYWJlbHMhICBXaGF0IGluIHRoZSBjcmFwIHdhcwpJIHRoaW5raW5nPwoKSSBhbSBnb2luZyB0byBtYWtlIGFuIGV4ZWN1dGl2ZSBkZWNpc2lvbiBmb3IgdGhpcyBwbG90LCAxNSBpcyB0b28gbWFueQphbmQgbWFrZXMgaXQgY3JhenkgY2x1dHRlcmVkLgoKIyMjIFJlcGVhdCB0aGlzIHdpdGggdHdvIHNldHMgb2YgZ2VuZXMKCmBgYHtyfQp0YWJsZV9uYW1lIDwtICJraF9wMTVfc2NuIgp0YWJsZV9pbnB1dCA8LSBnZW5vdHlwZV90YWJsZXNbW3RhYmxlX25hbWVdXQp0YWJsZSA8LSB0YWJsZV9pbnB1dFtbImRhdGEiXV1bW3RhYmxlX25hbWVdXQppbnRlcmVzdGluZ19nZW5lcyA8LSBjKCJGaWduIiwgIk5ybjEiLCAiRHB5c2wyIiwgIkFjdGIiLCAiRmdmOSIsICJPdHgyIiwgIlNlYzIzIiwKICAgICAgICAgICAgICAgICAgICAgICAiTmNhbTEiLCAiTWFwNCIsICJTZWMyMmIiLCAiTmxnbjMiLCAiTWFyY2tzIiwgIkNkNDciLAogICAgICAgICAgICAgICAgICAgICAgICJEcHlzbDMiLCAiTGluN2MiLCAiQ2FkbTEiLCAiU254MTIiLCAiUmhvYSIsICJJbnBwNWYiLAogICAgICAgICAgICAgICAgICAgICAgICJBdGcxMiIsICJTZXQiLCAiR3NrM2IiLCAiUGRjZDQiLCAiR2FicmEyIiwgIlRtY28xIiwgIkFuYXBjMTYiKQpraF9wMTVfc2NuX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBzaXplID0gNCwgYWxwaGEgPSAxLjAsCiAgY29sb3JfbG93ID0gY29sb3JzW1sia29fc2NuIl1dLCBjb2xvcl9oaWdoID0gY29sb3JzW1siaGV0X3NjbiJdXSkKcHAoZmlsZSA9ICJpbWFnZXMva2hfcDE1X3Njbl92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa2hfcDE1X3Njbl92b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpraF9wMTVfc2NuX3ZvbGNhbm9bWyJwbG90Il1dCiMjIHdoeSBpbiB0aGUgY3JhcCBpcyBpdCBkb3VibGUtbGFiZWxsaW5nIT8KIyMgTXkgTUEgcGxvdHRlciBpc24ndCBhcyBzbWFydCBhcyB0aGUgdm9sY2FubyBwbG90dGVyLCB0aGUgZ2VuZXMgYXJlOgpraF9wMTVfc2NuX21hIDwtIHBsb3RfbWFfY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBleHByX2NvbCA9ICJkZXNlcV9iYXNlbWVhbiIsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsCiAgY29sb3JfbG93ID0gY29sb3JzW1sia29fc2NuIl1dLCBjb2xvcl9oaWdoID0gY29sb3JzW1siaGV0X3NjbiJdXSwKICBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzKQpwcChmaWxlID0gImltYWdlcy9raF9wMTVfc2NuX21hLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa2hfcDE1X3Njbl9tYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa2hfcDE1X3Njbl9tYVtbInBsb3QiXV0KYGBgCgpgYGB7cn0KdGFibGVfbmFtZSA8LSAia2hfcDE1X3NjbiIKdGFibGVfaW5wdXQgPC0gZ2Vub3R5cGVfdGFibGVzW1t0YWJsZV9uYW1lXV0KdGFibGUgPC0gdGFibGVfaW5wdXRbWyJkYXRhIl1dW1t0YWJsZV9uYW1lXV0KaW50ZXJlc3RpbmdfZ2VuZXMgPC0gYygKICAiQW5hcGMxNiIsICJHYWJyYTIiLCAiVG1jbzEiLCAiU29kMiIsICJGZ2Y5IiwgIlBkY2Q0IiwgIlJob2EiLCAiR3NrM2IiLCAiRm94cDEiLAogICJOY2FtMSIsICJNYXJja3MiLCAiRmlnbiIsICJEcHlzbDMiLCAiSW5wcDVmIiwgIkNhZG0xIiwgIk1hcDQiLCAiVWdjZyIsICJFbG92bDQiLAogICJFbGF2bDEiLCAiQ2ZsMiIsICJUbm50MSIsICJHbmIxIiwgIkltcGFjdCIsICJOcm4xIiwgIk5sZ24zIiwgIkFjdGIiLCAiQ2Q0NyIsCiAgIlNlYzIyYiIsICJTbGMxN2E3IiwgIlZnbHV0MSIsICJBY3RiIiwgIkI0Z2FsdDUiLCAiRm94cDEiLCAiT3R4MiIsICJMaW43YyIsCiAgIlNueDEyIiwgIkF0ZzEyIiwgIlNldCIpCmtoX3AxNV9zY25fdm9sY2FubyA8LSBwbG90X3ZvbGNhbm9fY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLCBwX2NvbCA9ICJkZXNlcV9hZGpwIiwKICBjb2xvcl9sb3cgPSBjb2xvcnNbWyJrb19zY24iXV0sIGNvbG9yX2hpZ2ggPSBjb2xvcnNbWyJoZXRfc2NuIl1dLAogIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgbGFiZWwgPSBpbnRlcmVzdGluZ19nZW5lcywgc2l6ZSA9IDQsIGFscGhhID0gMS4wKQpwcChmaWxlID0gImltYWdlcy9raF9wMTVfc2NuX3ZvbGNhbm9fdjIucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQpraF9wMTVfc2NuX3ZvbGNhbm9bWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmtoX3AxNV9zY25fdm9sY2Fub1tbInBsb3QiXV0KIyMgd2h5IGluIHRoZSBjcmFwIGlzIGl0IGRvdWJsZS1sYWJlbGxpbmchPwojIyBNeSBNQSBwbG90dGVyIGlzbid0IGFzIHNtYXJ0IGFzIHRoZSB2b2xjYW5vIHBsb3R0ZXIsIHRoZSBnZW5lcyBhcmU6CmtoX3AxNV9zY25fbWEgPC0gcGxvdF9tYV9jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGV4cHJfY29sID0gImRlc2VxX2Jhc2VtZWFuIiwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwKICBjb2xvcl9sb3cgPSBjb2xvcnNbWyJrb19zY24iXV0sIGNvbG9yX2hpZ2ggPSBjb2xvcnNbWyJoZXRfc2NuIl1dLAogIHBfY29sID0gImRlc2VxX2FkanAiLCBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIGxhYmVsID0gaW50ZXJlc3RpbmdfZ2VuZXMpCnBwKGZpbGUgPSAiaW1hZ2VzL2toX3AxNV9zY25fbWFfdjIucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQpraF9wMTVfc2NuX21hW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpraF9wMTVfc2NuX21hW1sicGxvdCJdXQpgYGAKCiMjIyMga28vaGV0IHAxNSBkTEdOCgpgYGB7cn0KdGFibGVfbmFtZSA8LSAia2hfcDE1X2RsZ24iCnRhYmxlX2lucHV0IDwtIGdlbm90eXBlX3RhYmxlc1tbdGFibGVfbmFtZV1dCnRhYmxlIDwtIHRhYmxlX2lucHV0W1siZGF0YSJdXVtbdGFibGVfbmFtZV1dCmtoX3AxNV9kbGduX3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsCiAgY29sb3JfbG93ID0gY29sb3JzW1sia29fZGxnbiJdXSwgY29sb3JfaGlnaCA9IGNvbG9yc1tbImhldF9kbGduIl1dLAogIGxhYmVsX2NvbHVtbiA9ICJtZ2lfc3ltYm9sIiwgbGFiZWwgPSAxMCwgc2l6ZSA9IDQsIGFscGhhID0gMS4wKQpwcChmaWxlID0gImltYWdlcy9raF9wMTVfZGxnbl92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKa2hfcDE1X2RsZ25fdm9sY2Fub1tbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKa2hfcDE1X2RsZ25fdm9sY2Fub1tbInBsb3QiXV0KIyMgTXkgTUEgcGxvdHRlciBpc24ndCBhcyBzbWFydCBhcyB0aGUgdm9sY2FubyBwbG90dGVyLCB0aGUgZ2VuZXMgYXJlOgpraF9wMTVfZGxnbl9tYSA8LSBwbG90X21hX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZXhwcl9jb2wgPSAiZGVzZXFfYmFzZW1lYW4iLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLAogIGNvbG9yX2xvdyA9IGNvbG9yc1tbImtvX2RsZ24iXV0sIGNvbG9yX2hpZ2ggPSBjb2xvcnNbWyJoZXRfZGxnbiJdXSwKICBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IDEwKQpwcChmaWxlID0gImltYWdlcy9raF9wMTVfZGxnbl9tYS5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCmtoX3AxNV9kbGduX21hW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpraF9wMTVfZGxnbl9tYVtbInBsb3QiXV0KYGBgCgojIyMgTG9jYXRpb24gY29udHJhc3RzIHdpdGggZ2VuZXMgcmVtb3ZlZC9rZXB0CgpSZXBlYXQgdGhlIHNhbWUgYmxvY2sgd2l0aCBhIGZpbmQvcmVwbGFjZSBvZiBnZW5vdHlwZS9sb2NhdGlvbi4KCmBgYHtyfQpsb2NhdGlvbl90YWJsZXNfZnVsbCA8LSBjb21iaW5lX2RlX3RhYmxlcygKICBsb2NhdGlvbl9kZSwga2VlcGVycyA9IGxvY2F0aW9uX2tlZXBlcnMsIGxhYmVsX2NvbHVtbiA9IGxhYmVsX2NvbHVtbiwKICBleGNlbCA9IGdsdWUoImZ1bGxfY29udHJhc3RzL2xvY2F0aW9uX2Z1bGxfdGFibGVzLXZ7dmVyfS54bHN4IikpCmxvY2F0aW9uX3RhYmxlc19mdWxsCmxvY2F0aW9uX3NpZ19mdWxsIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgbG9jYXRpb25fdGFibGVzX2Z1bGwsIGFjY29yZGluZ190byA9ICJkZXNlcSIsCiAgZXhjZWwgPSBnbHVlKCJmdWxsX2NvbnRyYXN0cy9sb2NhdGlvbl9mdWxsX3NpZy12e3Zlcn0ueGxzeCIpKQpsb2NhdGlvbl9zaWdfZnVsbApsb2NhdGlvbl9mdWxsX3Vwc2V0IDwtIHVwc2V0cl9zaWcobG9jYXRpb25fc2lnX2Z1bGwpCiMjbG9jYXRpb25fZnVsbF9pbnRlcnNlY3RzIDwtIHdyaXRlX3Vwc2V0X2dyb3VwcygKIyMgIGxvY2F0aW9uX2Z1bGxfdXBzZXQsCiMjICBleGNlbCA9ICJleGNlbC9sb2NhdGlvbl9mdWxsX2dlbmVfZ3JvdXBzLnhsc3giKQpsb2NhdGlvbl90YWJsZXMgPC0gbGlzdCgpCmxvY2F0aW9uX3NpZyA8LSBsaXN0KCkKbG9jYXRpb25fZ3AgPC0gbGlzdCgpCmxvY2F0aW9uX2NwIDwtIGxpc3QoKQpmb3IgKGsgaW4gc2VxX2Fsb25nKGxvY2F0aW9uX2tlZXBlcnMpKSB7CiAgbmFtZSA8LSBuYW1lcyhsb2NhdGlvbl9rZWVwZXJzKVtrXQogIG1lc3NhZ2UoIkV4YW1pbmluZyAiLCBuYW1lKQogIGtlZXBlciA8LSBsb2NhdGlvbl9rZWVwZXJzW25hbWVdCiAgaW5jbHVkZXMgPC0gbG9jYXRpb25faW5jbHVzaW9uc1tbbmFtZV1dCiAgaW5jbHVkZV9uYW1lIDwtIHBhc3RlMCgiaW5jXyIsIG5hbWUpCiAgaW5jbHVkZV9kZl9uYW1lIDwtIHBhc3RlMCgiZGZfIiwgbmFtZSkKICBpbmNsdWRlX2RmIDwtIGxvY2F0aW9uX2luY2x1c2lvbnNbW2luY2x1ZGVfZGZfbmFtZV1dCiAgaW5jbHVkZXMgPC0gbG9jYXRpb25faW5jbHVzaW9uc1tbaW5jbHVkZV9uYW1lXV0KICBzdW1tYXJ5KHJvd25hbWVzKGxvY2F0aW9uX3NpZ19mdWxsW1siZGVzZXEiXV1bWyJ1cHMiXV1bW25hbWVdXSkgJWluJSBpbmNsdWRlcykKICBpbmNsdWRlX2ZpbGVuYW1lIDwtIGdsdWUoImxvY2F0aW9uX2NvbnRyYXN0cy9sb2NhdGlvbl97bmFtZX1faW5jbHVkaW5nX3d0X3tsZmNfY3V0b2ZmfV9kZWNyZWFzZWRfdGFibGUtdnt2ZXJ9Lnhsc3giKQogIGluY2x1ZGVfc2lnX2ZpbGVuYW1lIDwtIGdsdWUoImxvY2F0aW9uX2NvbnRyYXN0cy9sb2NhdGlvbl97bmFtZX1faW5jbHVkaW5nX3d0X3tsZmNfY3V0b2ZmfV9kZWNyZWFzZWRfc2lnLXZ7dmVyfS54bHN4IikKICBsb2NhdGlvbl90YWJsZXNbW25hbWVdXSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIGxvY2F0aW9uX2RlLCBleHRyYV9hbm5vdCA9IGluY2x1ZGVfZGYsCiAgICBrZWVwZXJzID0ga2VlcGVyLCBsYWJlbF9jb2x1bW4gPSBsYWJlbF9jb2x1bW4sCiAgICBleGNlbCA9IGluY2x1ZGVfZmlsZW5hbWUsIHdhbnRlZF9nZW5lcyA9IGluY2x1ZGVzKQogIHByaW50KGxvY2F0aW9uX3RhYmxlc1tbbmFtZV1dKQogIGxvY2F0aW9uX3NpZ1tbbmFtZV1dIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICBsb2NhdGlvbl90YWJsZXNbW25hbWVdXSwgYWNjb3JkaW5nX3RvID0gImRlc2VxIiwKICAgIGV4Y2VsID0gaW5jbHVkZV9zaWdfZmlsZW5hbWUpCiAgcHJpbnQobG9jYXRpb25fc2lnW1tuYW1lXV0pCiAgbnVtX3Jvd3MgPC0gbnJvdyhsb2NhdGlvbl9zaWdbW25hbWVdXVtbImRlc2VxIl1dW1sidXBzIl1dW1tuYW1lXV0pICsKICAgIG5yb3cobG9jYXRpb25fc2lnW1tuYW1lXV1bWyJkZXNlcSJdXVtbImRvd25zIl1dW1tuYW1lXV0pCiAgbWVzc2FnZSgiVGhlcmUgYXJlICIsIG51bV9yb3dzLCAiIHNpZ25pZmljYW50IHVwIGFuZCBkb3duIGdlbmVzLiIpCiAgaWYgKG51bV9yb3dzID4gMTApIHsKICAgIGxvY2F0aW9uX2dwW1tuYW1lXV0gPC0gYWxsX2dwcm9maWxlcihsb2NhdGlvbl9zaWdbW25hbWVdXSwgc3BlY2llcyA9ICJtbXVzY3VsdXMiKQogICAgZ3Bfd3JpdHRlbiA8LSB3cml0ZV9hbGxfZ3AoZ2Vub3R5cGVfZ3BbW25hbWVdXSkKICAgIGxvY2F0aW9uX2NwW1tuYW1lXV0gPC0gYWxsX2Nwcm9maWxlcihsb2NhdGlvbl9zaWdbW25hbWVdXSwgbG9jYXRpb25fdGFibGVzW1tuYW1lXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnZGIgPSAib3JnLk1tLmVnLmRiIiwgb3JnYW5pc20gPSAibW91c2UiKQogICAgY3Bfd3JpdHRlbiA8LSB3cml0ZV9hbGxfY3AoZ2Vub3R5cGVfY3BbW25hbWVdXSkKICB9Cn0KYGBgCgpDb2xlbnNvIHNlbnQgYSBzcGVjaWZpYyBxdWVyeSBvZiBpbnRlcmVzdCwgY29tcGFyaW5nIFNDTiB2cy4gUmV0aW5hcwphdCBwMDggaW4gdGhlIGhldGVyb3p5Z290ZXMgaW5jbHVkaW5nIGEgc2V0IG9mIGdlbmVzIG9mIHBhcnRpY3VsYXIKaW50ZXJlc3QuICBQZXJoYXBzIEkgY2FuIHVzZSBzb21lIG9mIHRoZXNlIGFzIG1hcmtlcnMgdG8gcXVhbGl0eQpjb250cm9sIG15IHdvcmsgaW4gdGhlIGZ1dHVyZT8KCkhlcmUgYXJlIHRoZSBnZW5lczoKCk9wbjQsIEVvbWVzLCBUcnBjNywgT3BybTEsIE5yNGEzLCBUYngyMCwgSXJ4NiwgQVc1NTE5ODQsIFBjZGgxOSwKQWRjeWFwMSwgQmFpYXAzLCBDaGwxLCBHcmluM2EsIElnZjEsIEdyaWExLCBHcmluMmQsIEdyaW4zYSwgQ2hybmE2LApDaHJuYTMsIEh0cjVhLCBIdHIyYSwgSHRyNywgSXJ4NCwgUGx4bkMxLCBTZW1hNmQsIFNlbWE0ZiwgU2VtYTRhLApTZW1hNmIsIExycmM0YiwgTHJyYzU4LCBMcnJjM2IsIFdudDQsIFdudDliLCBDdHhuMywgVGVubTEsIEduYTE0LApSZ3M0LCBSZ3M2LCBSZ3M1CgpgYGB7cn0KdGFibGVfaW5wdXQgPC0gbG9jYXRpb25fdGFibGVzW1sic3JfcDA4X2hldCJdXQp0YWJsZV9uYW1lIDwtICJzcl9wMDhfaGV0Igp0YWJsZSA8LSB0YWJsZV9pbnB1dFtbImRhdGEiXV1bW3RhYmxlX25hbWVdXQppbnRlcmVzdGluZ19nZW5lcyA8LSBjKCJPcG40IiwgIkVvbWVzIiwgIlRycGM3IiwgIk9wcm0xIiwgIk5yNGEzIiwgIlRieDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAiSXJ4NiIsICJBVzU1MTk4NCIsICJQY2RoMTkiLCAiQWRjeWFwMXIxIiwgIkJhaWFwMyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkNobDEiLCAiR3JpbjNhIiwgIklnZjEiLCAiR3JpYTEiLCAiR3JpbjJkIiwgIkdyaW4zYSIsCiAgICAgICAgICAgICAgICAgICAgICAgIkNocm5hNiIsICJDaHJuYTMiLCAiSHRyNWEiLCAiSHRyMmEiLCAiSHRyNyIsICJJcng0IiwKICAgICAgICAgICAgICAgICAgICAgICAiUGx4bkMxIiwgIlNlbWE2ZCIsICJTZW1hNGYiLCAiU2VtYTRhIiwgIlNlbWE2YiIsICJMcnJjNGIiLAogICAgICAgICAgICAgICAgICAgICAgICJMcnJjNTgiLCAiTHJyYzNiIiwgIldudDQiLCAiV250OWIiLCAiQ3R4bjMiLCAiVGVubTEiLCAiR25hMTQiLAogICAgICAgICAgICAgICAgICAgICAgICJSZ3M0IiwgIlJnczYiLCAiUmdzNSIsICJQb3U0ZjIiLCAiQ2hybmIzIiwgIkJjYW4iKQpzcl9wMDhfaGV0X3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsCiAgY29sb3JfbG93ID0gY29sb3JzW1siaGV0X3NjbiJdXSwgY29sb3JfaGlnaCA9IGNvbG9yc1tbImhldF9yZXRpbmEiXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzLCBhbHBoYSA9IDEuMCwKICBzaXplID0gNCkKcHAoZmlsZSA9ICJpbWFnZXMvc3JfcDA4X2hldF92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKc3JfcDA4X2hldF92b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpzcl9wMDhfaGV0X3ZvbGNhbm9bWyJwbG90Il1dCnNyX3AwOF9oZXRfbWEgPC0gcGxvdF9tYV9jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGV4cHJfY29sID0gImRlc2VxX2Jhc2VtZWFuIiwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwKICBjb2xvcl9sb3cgPSBjb2xvcnNbWyJoZXRfc2NuIl1dLCBjb2xvcl9oaWdoID0gY29sb3JzW1siaGV0X3JldGluYSJdXSwKICBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzKQpwcChmaWxlID0gImltYWdlcy9zcl9wMDhfaGV0X21hLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKc3JfcDA4X2hldF9tYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKc3JfcDA4X2hldF9tYVtbInBsb3QiXV0KYGBgCgojIyMgQWxzbyB0aGUga28KCmBgYHtyfQp0YWJsZV9pbnB1dCA8LSBsb2NhdGlvbl90YWJsZXNbWyJzcl9wMDhfa28iXV0KdGFibGVfbmFtZSA8LSAic3JfcDA4X2tvIgp0YWJsZSA8LSB0YWJsZV9pbnB1dFtbImRhdGEiXV1bW3RhYmxlX25hbWVdXQpzcl9wMDhfa29fdm9sY2FubyA8LSBwbG90X3ZvbGNhbm9fY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLCBwX2NvbCA9ICJkZXNlcV9hZGpwIiwKICBjb2xvcl9sb3cgPSBjb2xvcnNbWyJrb19zY24iXV0sIGNvbG9yX2hpZ2ggPSBjb2xvcnNbWyJrb19yZXRpbmEiXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzLCBhbHBoYSA9IDEuMCwKICBzaXplID0gNCkKcHAoZmlsZSA9ICJpbWFnZXMvc3JfcDA4X2tvX3ZvbGNhbm8ucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQpzcl9wMDhfa29fdm9sY2Fub1tbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKc3JfcDA4X2tvX3ZvbGNhbm9bWyJwbG90Il1dCnNyX3AwOF9rb19tYSA8LSBwbG90X21hX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZXhwcl9jb2wgPSAiZGVzZXFfYmFzZW1lYW4iLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLAogIGNvbG9yX2xvdyA9IGNvbG9yc1tbImtvX3NjbiJdXSwgY29sb3JfaGlnaCA9IGNvbG9yc1tbImtvX3JldGluYSJdXSwKICBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzKQpwcChmaWxlID0gImltYWdlcy9zcl9wMDhfa29fbWEucGRmIiwgd2lkdGggPSA5LCBoZWlnaHQgPSA5KQpzcl9wMDhfa29fbWFbWyJwbG90Il1dCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCnNyX3AwOF9rb19tYVtbInBsb3QiXV0KYGBgCgpgYGB7cn0KdGFibGVfaW5wdXQgPC0gbG9jYXRpb25fdGFibGVzW1sic3JfcDE1X2hldCJdXQp0YWJsZV9uYW1lIDwtICJzcl9wMTVfaGV0Igp0YWJsZSA8LSB0YWJsZV9pbnB1dFtbImRhdGEiXV1bW3RhYmxlX25hbWVdXQppbnRlcmVzdGluZ19nZW5lcyA8LSBjKCJPcG40IiwgIkVvbWVzIiwgIlRycGM3IiwgIk9wcm0xIiwgIk5yNGEzIiwgIlRieDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAiSXJ4NiIsICJBVzU1MTk4NCIsICJQY2RoMTkiLCAiQWRjeWFwMXIxIiwgIkJhaWFwMyIsCiAgICAgICAgICAgICAgICAgICAgICAgIkNobDEiLCAiR3JpbjNhIiwgIklnZjEiLCAiR3JpYTEiLCAiR3JpbjJkIiwgIkdyaW4zYSIsCiAgICAgICAgICAgICAgICAgICAgICAgIkNocm5hNiIsICJDaHJuYTMiLCAiSHRyNWEiLCAiSHRyMmEiLCAiSHRyNyIsICJJcng0IiwKICAgICAgICAgICAgICAgICAgICAgICAiUGx4bkMxIiwgIlNlbWE2ZCIsICJTZW1hNGYiLCAiU2VtYTRhIiwgIlNlbWE2YiIsICJMcnJjNGIiLAogICAgICAgICAgICAgICAgICAgICAgICJMcnJjNTgiLCAiTHJyYzNiIiwgIldudDQiLCAiV250OWIiLCAiQ3R4bjMiLCAiVGVubTEiLCAiR25hMTQiLAogICAgICAgICAgICAgICAgICAgICAgICJSZ3M0IiwgIlJnczYiLCAiUmdzNSIsICJQb3U0ZjIiLCAiQ2hybmIzIiwgIkJjYW4iKQpzcl9wMTVfaGV0X3ZvbGNhbm8gPC0gcGxvdF92b2xjYW5vX2NvbmRpdGlvbl9kZSgKICB0YWJsZSwgdGFibGVfbmFtZSwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwgcF9jb2wgPSAiZGVzZXFfYWRqcCIsCiAgY29sb3JfbG93ID0gY29sb3JzW1siaGV0X3NjbiJdXSwgY29sb3JfaGlnaCA9IGNvbG9yc1tbImhldF9yZXRpbmEiXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzLCBhbHBoYSA9IDEuMCwKICBzaXplID0gNCkKcHAoZmlsZSA9ICJpbWFnZXMvc3JfcDE1X2hldF92b2xjYW5vLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKc3JfcDE1X2hldF92b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpzcl9wMTVfaGV0X3ZvbGNhbm9bWyJwbG90Il1dCnNyX3AxNV9oZXRfbWEgPC0gcGxvdF9tYV9jb25kaXRpb25fZGUoCiAgdGFibGUsIHRhYmxlX25hbWUsIGV4cHJfY29sID0gImRlc2VxX2Jhc2VtZWFuIiwgZmNfY29sID0gImRlc2VxX2xvZ2ZjIiwKICBjb2xvcl9sb3cgPSBjb2xvcnNbWyJoZXRfcmV0aW5hIl1dLCBjb2xvcl9oaWdoID0gY29sb3JzW1siaGV0X3NjbiJdXSwKICBwX2NvbCA9ICJkZXNlcV9hZGpwIiwgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzKQpwcChmaWxlID0gImltYWdlcy9zcl9wMTVfaGV0X21hLnBkZiIsIHdpZHRoID0gOSwgaGVpZ2h0ID0gOSkKc3JfcDE1X2hldF9tYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKc3JfcDE1X2hldF9tYVtbInBsb3QiXV0KYGBgCgojIyMgQWxzbyB0aGUga28KCmBgYHtyfQp0YWJsZV9pbnB1dCA8LSBsb2NhdGlvbl90YWJsZXNbWyJzcl9wMTVfa28iXV0KdGFibGVfbmFtZSA8LSAic3JfcDE1X2tvIgp0YWJsZSA8LSB0YWJsZV9pbnB1dFtbImRhdGEiXV1bW3RhYmxlX25hbWVdXQpzcl9wMTVfa29fdm9sY2FubyA8LSBwbG90X3ZvbGNhbm9fY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBmY19jb2wgPSAiZGVzZXFfbG9nZmMiLCBwX2NvbCA9ICJkZXNlcV9hZGpwIiwKICBjb2xvcl9sb3cgPSBjb2xvcnNbWyJrb19yZXRpbmEiXV0sIGNvbG9yX2hpZ2ggPSBjb2xvcnNbWyJrb19zY24iXV0sCiAgbGFiZWxfY29sdW1uID0gIm1naV9zeW1ib2wiLCBsYWJlbCA9IGludGVyZXN0aW5nX2dlbmVzLCBhbHBoYSA9IDEuMCwKICBzaXplID0gNCwgbWluLnNlZ21lbnQubGVuZ3RoID0gMCwgcG9pbnQucGFkZGluZyA9IDAuMikKcHAoZmlsZSA9ICJpbWFnZXMvc3JfcDE1X2tvX3ZvbGNhbm8ucGRmIiwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTIpCnNyX3AxNV9rb192b2xjYW5vW1sicGxvdCJdXQpwbG90dGVkIDwtIGRldi5vZmYoKQpzcl9wMTVfa29fdm9sY2Fub1tbInBsb3QiXV0Kc3JfcDE1X2tvX21hIDwtIHBsb3RfbWFfY29uZGl0aW9uX2RlKAogIHRhYmxlLCB0YWJsZV9uYW1lLCBleHByX2NvbCA9ICJkZXNlcV9iYXNlbWVhbiIsIGZjX2NvbCA9ICJkZXNlcV9sb2dmYyIsCiAgY29sb3JfbG93ID0gY29sb3JzW1sia29fc2NuIl1dLCBjb2xvcl9oaWdoID0gY29sb3JzW1sia29fcmV0aW5hIl1dLAogIHBfY29sID0gImRlc2VxX2FkanAiLCBsYWJlbF9jb2x1bW4gPSAibWdpX3N5bWJvbCIsIGxhYmVsID0gaW50ZXJlc3RpbmdfZ2VuZXMpCnBwKGZpbGUgPSAiaW1hZ2VzL3NyX3AxNV9rb19tYS5wZGYiLCB3aWR0aCA9IDksIGhlaWdodCA9IDkpCnNyX3AxNV9rb19tYVtbInBsb3QiXV0KcGxvdHRlZCA8LSBkZXYub2ZmKCkKc3JfcDE1X2tvX21hW1sicGxvdCJdXQpgYGAKCiMjIyMgVGVzdCBhIHNwZWNpZmljIGxvY2F0aW9uIHF1ZXJ5IGZvciBkdXBsaWNhdGVkIElEcwoKTGV0IHVzIHNlZSBpZiBhbnkgRW5zZW1ibCBnZW5lIElEcyBhbmQvb3IgTUdJIElEcyBhcmUgc2hhcmVkIGluIHRoZQp3b3Jrc2hlZXQgbG9jYXRpb25fc3JfcDA4X2tvX2luY2x1ZGluZ193dF8wLjFfZGVjcmVhc2VkX3NpZyB1cC9kb3duLgoKYGBge3J9CnRlc3RfdGFibGVfdXAgPC0gbG9jYXRpb25fc2lnW1sic3JfcDA4X2tvIl1dW1siZGVzZXEiXV1bWyJ1cHMiXV1bWzFdXQp0ZXN0X3RhYmxlX2Rvd24gPC0gbG9jYXRpb25fc2lnW1sic3JfcDA4X2tvIl1dW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbMV1dCgpxdWVyeSA8LSBsaXN0KCJ1cCIgPSByb3duYW1lcyh0ZXN0X3RhYmxlX3VwKSwKICAgICAgICAgICAgICAiZG93biIgPSByb3duYW1lcyh0ZXN0X3RhYmxlX2Rvd24pKQpxdWVyeV91cHNldCA8LSBVcFNldFI6OmZyb21MaXN0KHF1ZXJ5KQpVcFNldFI6OnVwc2V0KHF1ZXJ5X3Vwc2V0KQoKcXVlcnkgPC0gbGlzdCgidXAiID0gdGVzdF90YWJsZV91cFtbIm1naV9zeW1ib2wiXV0sCiAgICAgICAgICAgICAgImRvd24iID0gdGVzdF90YWJsZV9kb3duW1sibWdpX3N5bWJvbCJdXSkKcXVlcnlfdXBzZXQgPC0gVXBTZXRSOjpmcm9tTGlzdChxdWVyeSkKVXBTZXRSOjp1cHNldChxdWVyeV91cHNldCkKIyMgb2ssIGdvb2QuCmBgYAoKIyMjIEFuZCB0aW1lCgpgYGB7cn0KdGltZV90YWJsZXNfZnVsbCA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0aW1lX2RlLCBrZWVwZXJzID0gdGltZV9rZWVwZXJzLAogIGxhYmVsX2NvbHVtbiA9IGxhYmVsX2NvbHVtbiwKICBleGNlbCA9IGdsdWUoImZ1bGxfY29udHJhc3RzL3RpbWVfZnVsbF90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKdGltZV9zaWdfZnVsbCA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIHRpbWVfdGFibGVzX2Z1bGwsIGFjY29yZGluZ190byA9ICJkZXNlcSIsCiAgZXhjZWwgPSBnbHVlKCJmdWxsX2NvbnRyYXN0cy90aW1lX2Z1bGxfc2lnLXZ7dmVyfS54bHN4IikpCnRpbWVfdGFibGVzIDwtIGxpc3QoKQp0aW1lX3NpZyA8LSBsaXN0KCkKdGltZV9ncCA8LSBsaXN0KCkKdGltZV9jcCA8LSBsaXN0KCkKZm9yIChrIGluIHNlcV9hbG9uZyh0aW1lX2tlZXBlcnMpKSB7CiAgbmFtZSA8LSBuYW1lcyh0aW1lX2tlZXBlcnMpW2tdCiAgbWVzc2FnZSgiRXhhbWluaW5nICIsIG5hbWUpCiAga2VlcGVyIDwtIHRpbWVfa2VlcGVyc1tuYW1lXQogIGluY2x1ZGVzIDwtIHRpbWVfaW5jbHVzaW9uc1tbbmFtZV1dCiAgaW5jbHVkZV9uYW1lIDwtIHBhc3RlMCgiaW5jXyIsIG5hbWUpCiAgaW5jbHVkZV9kZl9uYW1lIDwtIHBhc3RlMCgiZGZfIiwgbmFtZSkKICBpbmNsdWRlX2RmIDwtIHRpbWVfaW5jbHVzaW9uc1tbaW5jbHVkZV9kZl9uYW1lXV0KICBpbmNsdWRlcyA8LSB0aW1lX2luY2x1c2lvbnNbW2luY2x1ZGVfbmFtZV1dCiAgc3VtbWFyeShyb3duYW1lcyh0aW1lX3NpZ19mdWxsW1siZGVzZXEiXV1bWyJ1cHMiXV1bW25hbWVdXSkgJWluJSBpbmNsdWRlcykKICBpbmNsdWRlX2ZpbGVuYW1lIDwtIGdsdWUoInRpbWVfY29udHJhc3RzL3RpbWVfe25hbWV9X2luY2x1ZGluZ193dF97bGZjX2N1dG9mZn1fZGVjcmVhc2VkX3RhYmxlLXZ7dmVyfS54bHN4IikKICBpbmNsdWRlX3NpZ19maWxlbmFtZSA8LSBnbHVlKCJ0aW1lX2NvbnRyYXN0cy90aW1lX3tuYW1lfV9pbmNsdWRpbmdfd3Rfe2xmY19jdXRvZmZ9X2RlY3JlYXNlZF9zaWctdnt2ZXJ9Lnhsc3giKQogIHRpbWVfdGFibGVzW1tuYW1lXV0gPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB0aW1lX2RlLCBleHRyYV9hbm5vdCA9IGluY2x1ZGVfZGYsCiAgICBrZWVwZXJzID0ga2VlcGVyLCBsYWJlbF9jb2x1bW4gPSBsYWJlbF9jb2x1bW4sCiAgICBleGNlbCA9IGluY2x1ZGVfZmlsZW5hbWUsIHdhbnRlZF9nZW5lcyA9IGluY2x1ZGVzKQogIHByaW50KHRpbWVfdGFibGVzW1tuYW1lXV0pCiAgdGltZV9zaWdbW25hbWVdXSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdGltZV90YWJsZXNbW25hbWVdXSwgYWNjb3JkaW5nX3RvID0gImRlc2VxIiwKICAgIGV4Y2VsID0gaW5jbHVkZV9maWxlbmFtZSkKICBwcmludCh0aW1lX3NpZ1tbbmFtZV1dKQogIG51bV9yb3dzIDwtIG5yb3codGltZV9zaWdbW25hbWVdXVtbImRlc2VxIl1dW1sidXBzIl1dW1tuYW1lXV0pICsKICAgIG5yb3codGltZV9zaWdbW25hbWVdXVtbImRlc2VxIl1dW1siZG93bnMiXV1bW25hbWVdXSkKICBtZXNzYWdlKCJUaGVyZSBhcmUgIiwgbnVtX3Jvd3MsICIgc2lnbmlmaWNhbnQgdXAgYW5kIGRvd24gZ2VuZXMuIikKICBpZiAobnVtX3Jvd3MgPiAxMCkgewogICAgdGltZV9ncFtbbmFtZV1dIDwtIGFsbF9ncHJvZmlsZXIodGltZV9zaWdbW25hbWVdXSwgc3BlY2llcyA9ICJtbXVzY3VsdXMiKQogICAgZ3Bfd3JpdHRlbiA8LSB3cml0ZV9hbGxfZ3AodGltZV9ncFtbbmFtZV1dKQogICAgdGltZV9jcFtbbmFtZV1dIDwtIGFsbF9jcHJvZmlsZXIodGltZV9zaWdbW25hbWVdXSwgdGltZV90YWJsZXNbW25hbWVdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2RiID0gIm9yZy5NbS5lZy5kYiIpCiAgICBjcF93cml0dGVuIDwtIHdyaXRlX2FsbF9jcCh0aW1lX2NwW1tuYW1lXV0pCiAgfQp9CmBgYAoKIyBUcmFuc2xhdG9tZSBxdWVyaWVzCgpJbiBjb252ZXJzYXRpb24gd2l0aCBDb2xlbnNvLCBoZSBzcG9rZSBhYm91dCBhIHNlcmllcyBvZiBjb250cmFzdHMKd2hpY2ggd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gYXR0ZW1wdCBpbiBvcmRlciB0byBxdWVyeSB0aGUgY2hhbmdlcwphY3Jvc3MgYm90aCBsb2NhdGlvbnMgYW5kIGdlbm90eXBlcyBhbmQvb3IgYm90aCBsb2NhdGlvbnMgYW5kIHRpbWUsCnRodXM6CgoocDA4X2hldF9zY24gLyBwMDhfaGV0X3JldGluYSkgLyAocDA4X2tvX3NjbiAvIHAwOF9rb19yZXRpbmEpCgphcyBhbiBleGFtcGxlLiAgV2UgY2FuIGRlZmluaXRlbHkgZG8gdGhlc2UsIGJ1dCB0aGV5IGRvIG5vdCB3b3JrIGZvcgphbGwgbWV0aG9kcyBlbXBsb3llZCAoSSB0aGluayB0aGV5IHdvcmsgYmVzdCB3aXRoIGxpbW1hIGFuZCBlZGdlUikuCgpMZXRzIGZpbmQgb3V0IQoKIyMgVHdvIHNjbi9yZXRpbmEgY29tcGFyaXNvbnMKCiogKHAwOF9oZXRfc2NuIC8gcDA4X2hldF9yZXRpbmEpIC8gKHAwOF9rb19zY24gLyBwMDhfa29fcmV0aW5hKQoqIChwMTVfaGV0X3NjbiAvIHAxNV9oZXRfcmV0aW5hKSAvIChwMTVfa29fc2NuIC8gcDE1X2tvX3JldGluYSkKCmBgYHtyfQpzY25fZXh0cmEgPC0gZ2x1ZSgiXFwKICBwMDhoZXQgPSAoY29uZGl0aW9ucDA4X2hldF9zY24gLSBjb25kaXRpb25wMDhfaGV0X3JldGluYSksIFxcCiAgcDA4a28gPSAoY29uZGl0aW9ucDA4X2tvX3NjbiAtIGNvbmRpdGlvbnAwOF9rb19yZXRpbmEpLCBcXAogIHAwOGhldF92c19wMDhrbyA9IChjb25kaXRpb25wMDhfaGV0X3NjbiAtIGNvbmRpdGlvbnAwOF9oZXRfcmV0aW5hKSAtIChjb25kaXRpb25wMDhfa29fc2NuIC0gY29uZGl0aW9ucDA4X2tvX3JldGluYSksIFxcCiAgcDE1aGV0ID0gKGNvbmRpdGlvbnAxNV9oZXRfc2NuIC0gY29uZGl0aW9ucDE1X2hldF9yZXRpbmEpLCBcXAogIHAxNWtvID0gKGNvbmRpdGlvbnAxNV9rb19zY24gLSBjb25kaXRpb25wMTVfa29fcmV0aW5hKSwgXFwKICBwMTVoZXRfdnNfcDE1a28gPSAoY29uZGl0aW9ucDE1X2hldF9zY24gLSBjb25kaXRpb25wMTVfaGV0X3JldGluYSkgLSAoY29uZGl0aW9ucDE1X2tvX3NjbiAtIGNvbmRpdGlvbnAxNV9rb19yZXRpbmEpIikKc2NuX3RyYW5zbGF0b21lX2RlX2tlZXBlcnMgPC0gbGlzdCgKICAicDA4aGV0IiA9IGMoInAwOF9oZXRfc2NuIiwgInAwOF9oZXRfcmV0aW5hIiksCiAgInAwOGtvIiA9IGMoInAwOF9rb19zY24iLCAicDA4X2tvX3JldGluYSIpLAogICJwMTVoZXQiID0gYygicDE1X2hldF9zY24iLCAicDE1X2hldF9yZXRpbmEiKSwKICAicDE1a28iID0gYygicDE1X2tvX3NjbiIsICJwMTVfa29fcmV0aW5hIikpCnNjbl90cmFuc2xhdG9tZV9rZWVwZXJzIDwtIGxpc3QoCiAgInAwOGhldCIgPSBjKCJwMDhfaGV0X3NjbiIsICJwMDhfaGV0X3JldGluYSIpLAogICJwMDhrbyIgPSBjKCJwMDhfa29fc2NuIiwgInAwOF9rb19yZXRpbmEiKSwKICAicDA4X3Njbl90cmFuc2xhdG9tZSIgPSBjKCJwMDhoZXQiLCAicDA4a28iKSwKICAicDE1aGV0IiA9IGMoInAxNV9oZXRfc2NuIiwgInAxNV9oZXRfcmV0aW5hIiksCiAgInAxNWtvIiA9IGMoInAxNV9rb19zY24iLCAicDE1X2tvX3JldGluYSIpLAogICJwMTVfc2NuX3RyYW5zbGF0b21lIiA9IGMoInAxNWhldCIsICJwMTVrbyIpKQpmaWx0IDwtIG5vcm1hbGl6ZSh2M19wYWlyd2lzZV9pbnB1dCwgZmlsdGVyID0gVFJVRSkKbGltbWFfdGVzdCA8LSBsaW1tYV9wYWlyd2lzZShmaWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnMgPSBzY25fdHJhbnNsYXRvbWVfZGVfa2VlcGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mc3RyaW5nID0gIn4gMCArIGNvbmRpdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfc3ZzID0gRkFMU0UsIGV4dHJhX2NvbnRyYXN0cnMgPSBzY25fZXh0cmEpCmVkZ2VyX3Rlc3QgPC0gZWRnZXJfcGFpcndpc2UoZmlsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwZXJzID0gc2NuX3RyYW5zbGF0b21lX2RlX2tlZXBlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZnN0cmluZyA9ICJ+IDAgKyBjb25kaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3N2cyA9IEZBTFNFLCBleHRyYV9jb250cmFzdHMgPSBzY25fZXh0cmEpCnNjbl90cmFuc2xhdG9tZV9kZSA8LSBhbGxfcGFpcndpc2UodjNfcGFpcndpc2VfaW5wdXQsIGZpbHRlciA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGVycyA9IHNjbl90cmFuc2xhdG9tZV9kZV9rZWVwZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3N2cyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZzdHJpbmcgPSAifiAwICsgY29uZGl0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19iYXNpYyA9IEZBTFNFLCBkb19kcmVhbSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX25vaXNlcSA9IEZBTFNFLCBkb19lYnNlcSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2NvbnRyYXN0cyA9IHNjbl9leHRyYSkKc2NuX2NvbWJpbmVkX3Rlc3QgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgc2NuX3RyYW5zbGF0b21lX2RlLCBrZWVwZXJzID0gc2NuX3RyYW5zbGF0b21lX2tlZXBlcnMsCiAgZXhjZWwgPSBnbHVlKCJ0cmFuc2xhdG9tZS90ZXN0X3Njbl90cmFuc2xhdG9tZV91bmZpbHRlcmVkX25vc3ZhLXZ7dmVyfS54bHN4IikpCnNjbl90cmFuc2xhdG9tZV9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHYzX3BhaXJ3aXNlX2lucHV0LCBmaWx0ZXIgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwZXJzID0gc2NuX3RyYW5zbGF0b21lX2RlX2tlZXBlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3N2cyA9ICJzdmFzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9mc3RyaW5nID0gIn4gMCArIGNvbmRpdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2Jhc2ljID0gRkFMU0UsIGRvX2RyZWFtID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX25vaXNlcSA9IEZBTFNFLCBkb19lYnNlcSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9jb250cmFzdHMgPSBzY25fZXh0cmEpCnNjbl9jb21iaW5lZF90ZXN0X3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICBzY25fdHJhbnNsYXRvbWVfZGVfc3ZhLCBrZWVwZXJzID0gc2NuX3RyYW5zbGF0b21lX2tlZXBlcnMsCiAgZXhjZWwgPSBnbHVlKCJ0cmFuc2xhdG9tZS90ZXN0X3Njbl90cmFuc2xhdG9tZV91bmZpbHRlcmVkX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBTdWJ0cmFjdGluZyBERVNlcTIgcmVzdWx0czogcDA4IHNjbiBoZXQgdnMga28KCmBgYHtyfQpwMDhfc2NuX2NvbWJpbmVkX2Rlc2VxIDwtIHN1YnRyYWN0X2Rlc2VxX3Jlc3VsdHMoCiAgZmlyc3RfdGFibGUgPSBzY25fY29tYmluZWRfdGVzdFtbImRhdGEiXV1bWyJwMDhoZXQiXV0sCiAgc2Vjb25kX3RhYmxlID0gc2NuX2NvbWJpbmVkX3Rlc3RbWyJkYXRhIl1dW1sicDA4a28iXV0sCiAgZmlyc3RfbGZjID0gImRlc2VxX2xvZ2ZjIiwgc2Vjb25kX2xmYyA9ICJkZXNlcV9sb2dmYyIsCiAgZmlyc3RfcCA9ICJkZXNlcV9hZGpwIiwgc2Vjb25kX3AgPSAiZGVzZXFfYWRqcCIsCiAgZmlyc3RfbmFtZSA9ICJoZXQiLCBzZWNvbmRfbmFtZSA9ICJrbyIsCiAgZXhjZWwgPSBnbHVlKCJ0cmFuc2xhdG9tZS90cmFuc2xhdG9tZV9wMDhfc2NuX2NvbWJpbmVkX2Rlc2VxLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIFN1YnRyYWN0aW5nIERFU2VxMiByZXN1bHRzOiBwMTUgc2NuIGhldCB2cyBrbwoKYGBge3J9CnAxNV9zY25fY29tYmluZWRfZGVzZXEgPC0gc3VidHJhY3RfZGVzZXFfcmVzdWx0cygKICBmaXJzdF90YWJsZSA9IHNjbl9jb21iaW5lZF90ZXN0W1siZGF0YSJdXVtbInAxNWhldCJdXSwKICBzZWNvbmRfdGFibGUgPSBzY25fY29tYmluZWRfdGVzdFtbImRhdGEiXV1bWyJwMTVrbyJdXSwKICBmaXJzdF9sZmMgPSAiZGVzZXFfbG9nZmMiLCBzZWNvbmRfbGZjID0gImRlc2VxX2xvZ2ZjIiwKICBmaXJzdF9wID0gImRlc2VxX2FkanAiLCBzZWNvbmRfcCA9ICJkZXNlcV9hZGpwIiwKICBmaXJzdF9uYW1lID0gImhldCIsIHNlY29uZF9uYW1lID0gImtvIiwKICBleGNlbCA9IGdsdWUoInRyYW5zbGF0b21lL3RyYW5zbGF0b21lX3AxNV9zY25fY29tYmluZWRfZGVzZXEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBPbmUgZGxnbi9yZXRpbmEgY29tcGFyaXNvbgoKKiAocDA4X2hldF9kbGduIC8gcDA4X2hldF9yZXRpbmEpIC8gKHAwOF9rb19kbGduIC8gcDA4X2tvX3JldGluYSkKCmBgYHtyfQpwMDhfZGxnbl9leHRyYSA8LSAicDA4aGV0X3ZzX3AwOGtvID0gKGNvbmRpdGlvbnAwOF9oZXRfZGxnbiAtIGNvbmRpdGlvbnAwOF9oZXRfcmV0aW5hKSAtIChjb25kaXRpb25wMDhfa29fZGxnbiAtIGNvbmRpdGlvbnAwOF9rb19yZXRpbmEpIgpwMDhfZGxnbl90cmFuc2xhdG9tZV9kZV9rZWVwZXJzIDwtIGxpc3QoCiAgInAwOGhldCIgPSBjKCJwMDhfaGV0X2RsZ24iLCAicDA4X2hldF9yZXRpbmEiKSwKICAicDA4a28iID0gYygicDA4X2tvX2RsZ24iLCAicDA4X2tvX3JldGluYSIpKQpwMDhfZGxnbl90cmFuc2xhdG9tZV9rZWVwZXJzIDwtIGxpc3QoCiAgInAwOF9oZXRfZGxnbl92c19yZXRpbmEiID0gYygicDA4X2hldF9kbGduIiwgInAwOF9oZXRfcmV0aW5hIiksCiAgInAwOF9rb19kbGduX3ZzX3JldGluYSIgPSBjKCJwMDhfa29fZGxnbiIsICJwMDhfa29fcmV0aW5hIiksCiAgInAwOF9kbGduX3RyYW5zbGF0b21lIiA9IGMoInAwOGhldCIsICJwMDhrbyIpKQpwMDhfZGxnbl90cmFuc2xhdG9tZV9kZSA8LSBhbGxfcGFpcndpc2UodjNfcGFpcndpc2VfaW5wdXQsIGZpbHRlciA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwZXJzID0gcDA4X2RsZ25fdHJhbnNsYXRvbWVfZGVfa2VlcGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3N2cyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZnN0cmluZyA9ICJ+IDAgKyBjb25kaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fYmFzaWMgPSBGQUxTRSwgZG9fZHJlYW0gPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX25vaXNlcSA9IEZBTFNFLCBkb19lYnNlcSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfY29udHJhc3RzID0gcDA4X2RsZ25fZXh0cmEpCnAwOF9kbGduX2NvbWJpbmVkX3Rlc3QgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgcDA4X2RsZ25fdHJhbnNsYXRvbWVfZGUsIGtlZXBlcnMgPSBwMDhfZGxnbl90cmFuc2xhdG9tZV9rZWVwZXJzLAogIGxhYmVsX2NvbHVtbiA9IGxhYmVsX2NvbHVtbiwKICBleGNlbCA9IGdsdWUoInRyYW5zbGF0b21lL3Rlc3RfcDA4X2RsZ25fdHJhbnNsYXRvbWVfdW5maWx0ZXJlZF9ub3N2YS12e3Zlcn0ueGxzeCIpKQpwMDhfZGxnbl90cmFuc2xhdG9tZV9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHYzX3BhaXJ3aXNlX2lucHV0LCBmaWx0ZXIgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnMgPSBwMDhfZGxnbl90cmFuc2xhdG9tZV9kZV9rZWVwZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3N2cyA9ICJzdmFzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZzdHJpbmcgPSAifiAwICsgY29uZGl0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19iYXNpYyA9IEZBTFNFLCBkb19kcmVhbSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX25vaXNlcSA9IEZBTFNFLCBkb19lYnNlcSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2NvbnRyYXN0cyA9IHAwOF9kbGduX2V4dHJhKQpwMDhfZGxnbl9jb21iaW5lZF90ZXN0X3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICBwMDhfZGxnbl90cmFuc2xhdG9tZV9kZV9zdmEsIGtlZXBlcnMgPSBwMDhfZGxnbl90cmFuc2xhdG9tZV9rZWVwZXJzLAogIGxhYmVsX2NvbHVtbiA9IGxhYmVsX2NvbHVtbiwKICBleGNlbCA9IGdsdWUoInRyYW5zbGF0b21lL3Rlc3RfcDA4X2RsZ25fdHJhbnNsYXRvbWVfdW5maWx0ZXJlZF9zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgU3VidHJhY3RpbmcgdGhlIERFU2VxMiByZXN1bHRzCgojIyBUd28gc2NuL3JldGluYSBjb21wYXJpc29ucyAocDE1L3AwOCBhY3Jvc3MgaGV0L2tvKQoKKiAocDE1X2hldF9zY24gLyBwMTVfaGV0X3JldGluYSkgLyAocDA4X2hldF9zY24gLyBwMDhfaGV0X3JldGluYSkKKiAocDE1X2tvX3NjbiAvIHAxNV9rb19yZXRpbmEpIC8gKHAwOF9rb19zY24gLyBwMDhfa29fcmV0aW5hKQoKYGBge3J9CnRpbWVfc2NuX2V4dHJhIDwtIGdsdWUoIlxcCiAgcDE1aGV0ID0gKGNvbmRpdGlvbnAxNV9oZXRfc2NuIC0gY29uZGl0aW9ucDE1X2hldF9yZXRpbmEpLCBcXAogIHAwOGhldCA9IChjb25kaXRpb25wMDhfaGV0X3NjbiAtIGNvbmRpdGlvbnAwOF9oZXRfcmV0aW5hKSwgXFwKICBwMTVoZXRfdnNfcDA4aGV0ID0gKGNvbmRpdGlvbnAxNV9oZXRfc2NuIC0gY29uZGl0aW9ucDE1X2hldF9yZXRpbmEpIC0gKGNvbmRpdGlvbnAwOF9oZXRfc2NuIC0gY29uZGl0aW9ucDA4X2hldF9yZXRpbmEpLAogIHAxNWtvID0gKGNvbmRpdGlvbnAxNV9rb19zY24gLSBjb25kaXRpb25wMTVfa29fcmV0aW5hKSwgXFwKICBwMDhrbyA9IChjb25kaXRpb25wMDhfa29fc2NuIC0gY29uZGl0aW9ucDA4X2tvX3JldGluYSksIFxcCiAgcDE1a29fdnNfcDA4a28gPSAoY29uZGl0aW9ucDE1X2tvX3NjbiAtIGNvbmRpdGlvbnAxNV9rb19yZXRpbmEpIC0gKGNvbmRpdGlvbnAwOF9rb19zY24gLSBjb25kaXRpb25wMDhfa29fcmV0aW5hKSIpCnRpbWVfc2NuX3RyYW5zbGF0b21lX2RlX2tlZXBlcnMgPC0gbGlzdCgKICAicDE1aGV0IiA9IGMoInAxNV9oZXRfc2NuIiwgInAxNV9oZXRfcmV0aW5hIiksCiAgInAwOGhldCIgPSBjKCJwMDhfaGV0X3NjbiIsICJwMDhfaGV0X3JldGluYSIpLAogICJwMTVrbyIgPSBjKCJwMTVfa29fc2NuIiwgInAxNV9rb19yZXRpbmEiKSwKICAicDA4a28iID0gYygicDA4X2tvX3NjbiIsICJwMDhfa29fcmV0aW5hIikpCnRpbWVfc2NuX3RyYW5zbGF0b21lX2tlZXBlcnMgPC0gbGlzdCgKICAicDE1aGV0IiA9IGMoInAxNV9oZXRfc2NuIiwgInAxNV9oZXRfcmV0aW5hIiksCiAgInAwOGhldCIgPSBjKCJwMDhfaGV0X3NjbiIsICJwMDhfaGV0X3JldGluYSIpLAogICJwMTVrbyIgPSBjKCJwMTVfa29fc2NuIiwgInAxNV9rb19yZXRpbmEiKSwKICAicDA4a28iID0gYygicDA4X2tvX3NjbiIsICJwMDhfa29fcmV0aW5hIiksCiAgInAxNV9oZXRfc2NfdnNfcmV0aW5hIiA9IGMoInAxNV9oZXRfc2NuIiwgInAxNV9oZXRfcmV0aW5hIiksCiAgInAwOF9oZXRfc2NfdnNfcmV0aW5hIiA9IGMoInAwOF9oZXRfc2NuIiwgInAwOF9oZXRfcmV0aW5hIiksCiAgInNjbl9oZXRfdHJhbnNsYXRvbWUiID0gYygicDE1aGV0IiwgInAwOGhldCIpLAogICJzY25fa29fdHJhbnNsYXRvbWUiID0gYygicDE1a28iLCAicDA4a28iKSkKdGltZV9zY25fdHJhbnNsYXRvbWVfZGUgPC0gYWxsX3BhaXJ3aXNlKHYzX3BhaXJ3aXNlX2lucHV0LCBmaWx0ZXIgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGVycyA9IHRpbWVfc2NuX3RyYW5zbGF0b21lX2RlX2tlZXBlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9zdnMgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZzdHJpbmcgPSAifiAwICsgY29uZGl0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2Jhc2ljID0gRkFMU0UsIGRvX2RyZWFtID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19ub2lzZXEgPSBGQUxTRSwgZG9fZWJzZXEgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2NvbnRyYXN0cyA9IHRpbWVfc2NuX2V4dHJhKQp0aW1lX3Njbl90cmFuc2xhdG9tZV90ZXN0IDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHRpbWVfc2NuX3RyYW5zbGF0b21lX2RlLAogIGtlZXBlcnMgPSB0aW1lX3Njbl90cmFuc2xhdG9tZV9rZWVwZXJzLAogIGxhYmVsX2NvbHVtbiA9IGxhYmVsX2NvbHVtbiwKICBleGNlbCA9IGdsdWUoInRyYW5zbGF0b21lL3Rlc3RfdGltZV9zY25fdHJhbnNsYXRvbWVfdW5maWx0ZXJlZF9ub3N2YS12e3Zlcn0ueGxzeCIpKQp0aW1lX3Njbl90cmFuc2xhdG9tZV9kZV9zdmEgPC0gYWxsX3BhaXJ3aXNlKHYzX3BhaXJ3aXNlX2lucHV0LCBmaWx0ZXIgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnMgPSB0aW1lX3Njbl90cmFuc2xhdG9tZV9kZV9rZWVwZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3N2cyA9ICJzdmFzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2ZzdHJpbmcgPSAifiAwICsgY29uZGl0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19iYXNpYyA9IEZBTFNFLCBkb19kcmVhbSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX25vaXNlcSA9IEZBTFNFLCBkb19lYnNlcSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2NvbnRyYXN0cyA9IHRpbWVfc2NuX2V4dHJhKQp0aW1lX3Njbl90cmFuc2xhdG9tZV90ZXN0X3N2YSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICB0aW1lX3Njbl90cmFuc2xhdG9tZV9kZV9zdmEsCiAga2VlcGVycyA9IHRpbWVfc2NuX3RyYW5zbGF0b21lX2tlZXBlcnMsCiAgbGFiZWxfY29sdW1uID0gbGFiZWxfY29sdW1uLAogIGV4Y2VsID0gZ2x1ZSgidHJhbnNsYXRvbWUvdGVzdF90aW1lX3Njbl90cmFuc2xhdG9tZV91bmZpbHRlcmVkX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCk5leHQgc3RlcDogUGVyZm9ybSB0aGUgcmV0aW5hIGZpbHRlcjsgbmVlZCB0byB0aGluayBhYm91dCB0aGUgcHJvcGVyCnVuaW9uL2ludGVyc2VjdGlvbiBvZiB0aGUgcmV0aW5hL3ggZXhwcmVzc2lvbiB2YWx1ZXMKCkluIHRoZSBwcmV2aW91cyBibG9jaywgd2UgYXJlIG1ha2luZyAyIGdsb2JhbCBjb21wYXJpc29ucywgaGVyZSBpcyBvbmUKb2YgdGhlbToKCihwMTVoZXRzY24vcDE1aGV0cmV0KS8ocDA4aGV0c2NuL3AwOGhldHJldCkKCkkgdGhlcmVmb3JlIHdhbnQgdG8gZXh0cmFjdCB0aGUgbW9zdCBsb2dpY2FsIHNldCBvZiBnZW5lcyBoaWdoZXIgaW4Kc29tZS9hbGwgb2YgdGhlc2UgY29uZGl0aW9ucyB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgd3QKY29uZGl0aW9ucy4gIFByZXZpb3VzbHksIGluIHNlY3Rpb24gJ0V4dHJhY3QgZ2VuZXMgaW5jbHVkZWQgZm9yIGVhY2gKc2V0IG9mIGNvbnRyYXN0cycsIEkgYXR0ZW1wdGVkIHRvIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIDIKc3BlY2lmaWMgd3QgY29uZGl0aW9ucy4gIFdoZW4gdGhpcyB3YXMgcGVyZm9ybWVkLCBpdCB0b29rIHRoZQp1bmlxdWUodW5pb24pIG9mIHRoZSB0d28gc2V0cy4gIFRodXMgaXQgc3RhbmRzIHRvIHJlYXNvbiB0aGF0IEkgd2FudAp0byB0YWtlIHRoZSB1bmlxdWUodW5pb24pIG9mIGFsbCA0IGluIHRoaXMgaW5zdGFuY2U/ICBlLmcuOgoKKHAxNWhldHNjbiA+IHAxNXd0c2NuKSB8IChwMTVoZXRyZXQgPiBwMTV3dHJldCkgfAogIChwMDhoZXRzY24gPiBwMDh3dHNjbikgfCAocDA4aGV0cmV0ID4gcDA4d3RyZXQpCgpJIGtpbmQgb2YgdGhpbmsgaXQgc2hvdWxkIGJlOgoKKChwMTVoZXRzY24gPiBwMTV3dHNjbikgfCAocDE1aGV0cmV0ID4gcDE1d3RyZXQpKSAmCiAgKChwMDhoZXRzY24gPiBwMDh3dHNjbikgfCAocDA4aGV0cmV0ID4gcDA4d3RyZXQpKQoKZ3Jvc3MsIHBlcmhhcHMgSSBzaG91bGQganVzdCBkbyB0aGlzIG1hbnVhbGx5LCBnaXZlbiB0aGF0IHRoZXJlIGFyZQpvbmx5IGEgZmV3IHB1dGF0aXZlIHRyYW5zbGF0b21lcyB0byBxdWVyeT8KCiMgUXVpY2sgYW5kIGRpcnR5IERFU2VxMiBjb250cmFzdCBvZiBjb250cmFzdHMKCkluIGEgZmFzaGlvbiBzaW1pbGFyIHRvIGhvdyBIZWN0b3IgaGFuZGxlZCB0aGUgZWZmZWN0IG9mIHBoYWdvY3l0b3Npcwp3aXRoIExhdXJhIGFuZCBOYWppYiBhIGxvbmcgdGltZSBhZ28sIEkgcHJvcG9zZSB0byBkbyBhIHNpbXBsZQpzdWJ0cmFjdGlvbiBvZiB0aGUgcmVzdWx0cyBvZiBvdXIgdHdvIGNvbnRyYXN0cyB3aGljaCBjb21wcmlzZSB0aGUKdHJhbnNsYXRvbWUgcXVlcnkgKEkgd2FzIHRoaW5raW5nIGFib3V0IHRoaXMgbGFzdCB3ZWVrLCB0aHVzIHRoZQppbmNsdXNpb24gb2YgdGhlbSBpbiB0aGUgZGUgdGFibGVzIGFib3ZlKS4gIFNpbWlsYXJseSB0byB0aGUKcGhhZ29jeXRvc2lzIGVmZmVjdCwgSSB3aWxsIHNpbXBseSB0YWtlIHRoZSB3b3JzdCBwb3NpYmxlIGFkanVzdGVkCnAtdmFsdWUuICBJIHdpbGwgcmVwZWF0IHRoaXMgd2l0aCBsaW1tYS9FZGdlUiBhbmQgc2VlIGhvdyBzaW1pbGFyIHRoZQpmaW5hbCByZXN1bHRzIGFyZSB0byB3aGF0IHRob3NlIG1ldGhvZHMgcHJvdmlkZSBpbiB0aGUgKGEvYikvKGMvZCkKY29tcGFyaXNvbnMuICBJIGFtIHJlYXNvbmFibHkgY2VydGFpbiB0aGF0IERFU2VxMidzIHJlc3VsdHMoKSBmdW5jdGlvbgpoYXMgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSB0aGVzZSBvZGQgY29udHJhc3RzLCBidXQgSSBoYXZlIG5ldmVyCmZpZ3VyZWQgb3V0IGhvdzsgcGVyaGFwcyBJIHdpbGwgdXNlIHRoaXMgYXMgYSBjaGFuY2UgdG8gcmV2aXNpdCB0aGF0Li4uCgpMZXQgdXMgdGVzdCB0aGlzIGlkZWEgd2l0aCB0aGUgcDA4IGRsZ24gcXVlcnksIHdoaWNoIHNlZWtzIHRvIGNvbXBhcmU6CgoocDA4X2hldF9kbGduIC8gcDA4X2hldF9yZXRpbmEpIC8gKHAwOF9rb19kbGduIC8gcDA4X2tvX3JldGluYSkKClRoZXNlIGFyZSBtYWludGFpbmVkIGluIHRoZSBkZV90YWJsZSB3aXRoIHRoZSBuYW1lcwoncDA4X2hldF9kbGduX3ZzX3JldGluYScgYW5kICdwMDhfa29fZGxnbl92c19yZXRpbmEnCgojIyBwMDggZGxnbiBoZXQgdnMga28KCmBgYHtyfQpwMDhfZGxnbl9jb21iaW5lZF9kZXNlcSA8LSBzdWJ0cmFjdF9kZXNlcV9yZXN1bHRzKAogIGZpcnN0X3RhYmxlID0gcDA4X2RsZ25fY29tYmluZWRfdGVzdFtbImRhdGEiXV1bWyJwMDhfaGV0X2RsZ25fdnNfcmV0aW5hIl1dLAogIHNlY29uZF90YWJsZSA9IHAwOF9kbGduX2NvbWJpbmVkX3Rlc3RbWyJkYXRhIl1dW1sicDA4X2tvX2RsZ25fdnNfcmV0aW5hIl1dLAogIGZpcnN0X2xmYyA9ICJkZXNlcV9sb2dmYyIsIHNlY29uZF9sZmMgPSAiZGVzZXFfbG9nZmMiLAogIGZpcnN0X3AgPSAiZGVzZXFfYWRqcCIsIHNlY29uZF9wID0gImRlc2VxX2FkanAiLAogIGZpcnN0X25hbWUgPSAiaGV0Iiwgc2Vjb25kX25hbWUgPSAia28iLAogIGV4Y2VsID0gZ2x1ZSgidHJhbnNsYXRvbWUvdHJhbnNsYXRvbWVfcDA4X2RsZ25fY29tYmluZWRfZGVzZXEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgpTZWUgaG93IHNpbWlsYXIgdGhlc2UgcmVzdWx0cyBhcmUgdG8gdGhvc2Ugb2J0YWluZWQgZnJvbSBsaW1tYS9lZGdlci4KCmBgYHtyfQp0ZXN0X2NvbHVtbnMgPC0gYygiZWRnZXJfbG9nZmMiLCAibGltbWFfbG9nZmMiLCAiZWRnZXJfYWRqcCIsICJsaW1tYV9hZGpwIikKdGVzdF9kZiA8LSBwMDhfZGxnbl9jb21iaW5lZF90ZXN0W1siZGF0YSJdXVtbInAwOF9kbGduX3RyYW5zbGF0b21lIl1dWywgdGVzdF9jb2x1bW5zXQp0ZXN0X2RmIDwtIG1lcmdlKHRlc3RfZGYsIHAwOF9kbGduX2NvbWJpbmVkX2Rlc2VxLCBieSA9ICJyb3cubmFtZXMiKQpyb3duYW1lcyh0ZXN0X2RmKSA8LSB0ZXN0X2RmW1siUm93Lm5hbWVzIl1dCnRlc3RfZGZbWyJSb3cubmFtZXMiXV0gPC0gTlVMTApjb3IudGVzdCh0ZXN0X2RmW1sibGltbWFfbG9nZmMiXV0sIHRlc3RfZGZbWyJoZXRfdnNfa29fbG9nZmMiXV0pCmNvci50ZXN0KHRlc3RfZGZbWyJlZGdlcl9sb2dmYyJdXSwgdGVzdF9kZltbImhldF92c19rb19sb2dmYyJdXSkKdHQgPC0gcGxvdF9saW5lYXJfc2NhdHRlcih0ZXN0X2RmWywgYygibGltbWFfbG9nZmMiLCAiaGV0X3ZzX2tvX2xvZ2ZjIildKQp0dFtbInNjYXR0ZXIiXV0KdHQgPC0gcGxvdF9saW5lYXJfc2NhdHRlcih0ZXN0X2RmWywgYygiZWRnZXJfYWRqcCIsICJoZXRfdnNfa29fcCIpXSkKdHRbWyJzY2F0dGVyIl1dCiMjIFNvLCB1c2luZyB0aGUgbWF4aW11bSBwLXZhbHVlIGlzIGEgY29tcGxldGUgZmFpbHVyZTsgYnV0IHRoZSBleHRyZW1lIHNpbWlsYXJpdGllcwojIyBiZXR3ZWVuIHRoaXMgYW5kIGVkZ2VSIHN1Z2dlc3QgdG8gbWUgdGhhdCBpdCBpcyBsaWtlbHkgcG9zc2libGUgdG8gdXNlIHRoZSByZXN1bHRzCiMjIGZyb20gZWRnZVIgd2l0aG91dCBjb25jZXJuIChvciBsaW1tYSBmb3IgdGhhdCBtYXR0ZXIsIGl0IHdhcyBhbHNvIGV4dHJlbWVseSBzaW1pbGFyKQojIyBPciBJIGNhbiBzcGVuZCBhIGxpdHRsZSB0aW1lIGFuZCBjb2xsZWN0IHRoZSBudW1iZXJzIG9uIGVhY2ggc2lkZSBvZiB0aGUgZGl2aXNpb24KIyMgYW5kIGNhbGN1bGF0ZSBhIHQgc3RhdGlzdGljIG15c2VsZi4KYGBgCgojIE5vbi1TcGVjaWZpYyBmaWx0ZXJpbmcgb2YgdGhlIHRyYW5zbGF0b21lIGRhdGEKCkkgaGF2ZSBvbiBoYW5kCgoqIHAwOGhldF92c19wMDhrbyA6IChwMDhfaGV0X3NjbiAtIHAwOF9oZXRfcmV0aW5hKSAtIChwMDhfa29fc2NuIC0gcDA4X2tvX3JldGluYSkKKiBwMTVoZXRfdnNfcDE1a28gOiAocDE1X2hldF9zY24gLSBwMTVfaGV0X3JldGluYSkgLSAocDE1X2tvX3NjbiAtIHAxNV9rb19yZXRpbmEpCiogcDA4aGV0X3ZzX3AwOGtvIDogKHAwOF9oZXRfZGxnbiAtIHAwOF9oZXRfcmV0aW5hKSAtIChwMDhfa29fZGxnbiAtIHAwOF9rb19yZXRpbmEpCiogcDE1aGV0X3ZzX3AwOGhldCA6IChwMTVfaGV0X3NjbiAtIHAxNV9oZXRfcmV0aW5hKSAtIChwMDhfaGV0X3NjbiAtIHAwOF9oZXRfcmV0aW5hKQoqIHAxNWtvX3ZzX3AwOGtvIDogKHAxNV9rb19zY24gLSBwMTVfa29fcmV0aW5hKSAtIChwMDhfa29fc2NuIC0gcDA4X2tvX3JldGluYSkKCkkgaGF2ZSBnZW5lIHNldHMgdXAgYWJvdmUgd2hpY2ggZGVmaW5lIHRoZSBnZW5lcyBzdWl0YWJsZSBmb3IgZWFjaCBvZgp0aGVzZSBwaWVjZXMuICBUaGVyZSBhcmUgb25seSA1IGNvbXBhcmlzb25zLCBsZXQgdXMgc3RlcCB0aHJvdWdoIHRoZW0uCgojIyBTQ04gdHJhbnNsYXRvbWUgaGV0L2tvIGF0IHAwOAoKVGhlIGRhdGEgZm9yIHRoaXMgY29udHJhc3QgcmVzaWRlcyBpbgpzY25fY29tYmluZWRfdGVzdCRkYXRhJHAwOF9zY25fdHJhbnNsYXRvbWUgb3IgdGhlIHNhbWUgc2xvdCBvZgpzY25fY29tYmluZWRfdGVzdF9zdmEKCiogcDA4X2hldF9zY24gLSBwMDhfaGV0X3JldGluYSkgLSAocDA4X2tvX3NjbiAtIHAwOF9rb19yZXRpbmEpCgpUaHVzLCB0aGUgaW5jbHVzaW9uX3NpZyBwb3J0aW9ucyB0byBleHRyYWN0IGFyZSBmb3VuZCBpbjoKaW5jbHVzaW9uX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dLCBhbmQgYXJlIG5hbWVkIGV4YWN0bHkgYXMgd3JpdHRlbiBhYm92ZSEKCmBgYHtyfQpwMDhfaGV0X3ZzX2tvX3RyYW5zbGF0b21lX3VuZmlsdCA8LSBzY25fY29tYmluZWRfdGVzdFtbImRhdGEiXV1bWyJwMDhfc2NuX3RyYW5zbGF0b21lIl1dCm51bV91bmlvbiA8LSB1bmlxdWUoYyhyb3duYW1lcyhpbmNsdXNpb25fc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJwMDhfaGV0X3NjbiJdXSksCiAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhpbmNsdXNpb25fc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJwMDhfaGV0X3JldGluYSJdXSkpKQpsZW5ndGgobnVtX3VuaW9uKQpkZW5fdW5pb24gPC0gdW5pcXVlKGMocm93bmFtZXMoaW5jbHVzaW9uX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1sicDA4X2tvX3NjbiJdXSksCiAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhpbmNsdXNpb25fc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJwMDhfa29fcmV0aW5hIl1dKSkpCmxlbmd0aChkZW5fdW5pb24pCmJvdGhfdW5pb24gPC0gdW5pcXVlKGMobnVtX3VuaW9uLCBkZW5fdW5pb24pKQpsZW5ndGgoYm90aF91bmlvbikKYm90aF9pbnRlcl9pZHggPC0gbnVtX3VuaW9uICVpbiUgZGVuX3VuaW9uCmJvdGhfaW50ZXIgPC0gbnVtX3VuaW9uW2JvdGhfaW50ZXJfaWR4XQpsZW5ndGgoYm90aF9pbnRlcikKa2VlcGVyIDwtIGxpc3QoInAwOF9zY25fdHJhbnNsYXRvbWUiID0gYygicDA4aGV0IiwgInAwOGtvIikpCnAwOF9zY25fdHJhbnNsYXRvbWVfdW5pb25fZmlsdGVyZWQgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgc2NuX3RyYW5zbGF0b21lX2RlLCBrZWVwZXJzID0ga2VlcGVyLAogIGxhYmVsX2NvbHVtbiA9IGxhYmVsX2NvbHVtbiwKICBleGNlbCA9IGdsdWUoInRyYW5zbGF0b21lL3AwOF9zY25fdHJhbnNsYXRvbWVfdW5pb25fZmlsdGVyZWRfbm9zdmEtdnt2ZXJ9Lnhsc3giKSwKICB3YW50ZWRfZ2VuZXMgPSBib3RoX3VuaW9uKQpwMDhfc2NuX3RyYW5zbGF0b21lX2ludGVyX2ZpbHRlcmVkIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHNjbl90cmFuc2xhdG9tZV9kZSwga2VlcGVycyA9IGtlZXBlciwKICBsYWJlbF9jb2x1bW4gPSBsYWJlbF9jb2x1bW4sCiAgZXhjZWwgPSBnbHVlKCJ0cmFuc2xhdG9tZS9wMDhfc2NuX3RyYW5zbGF0b21lX2ludGVyc2VjdF9maWx0ZXJlZF9ub3N2YS12e3Zlcn0ueGxzeCIpLAogIHdhbnRlZF9nZW5lcyA9IGJvdGhfaW50ZXIpCnAwOF9zY25fdHJhbnNsYXRvbWVfdW5pb25fZmlsdGVyZWRfc3ZhIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHNjbl90cmFuc2xhdG9tZV9kZV9zdmEsIGtlZXBlcnMgPSBrZWVwZXIsCiAgbGFiZWxfY29sdW1uID0gbGFiZWxfY29sdW1uLAogIGV4Y2VsID0gZ2x1ZSgidHJhbnNsYXRvbWUvcDA4X3Njbl90cmFuc2xhdG9tZV91bmlvbl9maWx0ZXJlZF9zdmEtdnt2ZXJ9Lnhsc3giKSwKICB3YW50ZWRfZ2VuZXMgPSBib3RoX3VuaW9uKQpwMDhfc2NuX3RyYW5zbGF0b21lX3VuaW9uX2ZpbHRlcmVkIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogIHNjbl90cmFuc2xhdG9tZV9kZSwga2VlcGVycyA9IGtlZXBlciwKICBsYWJlbF9jb2x1bW4gPSBsYWJlbF9jb2x1bW4sCiAgZXhjZWwgPSBnbHVlKCJ0cmFuc2xhdG9tZS9wMDhfc2NuX3RyYW5zbGF0b21lX2ludGVyc2VjdF9maWx0ZXJlZF9zdmEtdnt2ZXJ9Lnhsc3giKSwKICB3YW50ZWRfZ2VuZXMgPSBib3RoX2ludGVyKQpgYGAKCiMgVmVubi9VcFNldCBvZiBSZXRpbmEsIFNDTiwgYW5kIGRMR04gREUgR2VuZXMKCkhlcmUgaXMgYSBzbmlwcGV0IGZyb20gUmFzaG1pIHdoaWNoIGV4cHJlc3NlcyBuaWNlbHkgdGhlIERFLXJlc3VsdApjb21wYXJpc29ucyBzaGUgaXMgbW9zdCBpbnRlcmVzdGVkOgoKU2luY2UsIEkgd2FudCB0byBrbm93IHRoZSBudW1iZXIgb2YgREVHIGV4cHJlc3NlZCBpbiBSZXRpbmEsIFNDTiBhbmQKZExHTiB3aXRoIHJlc3BlY3QgdG8gZ2Vub3R5cGUsIExvY2F0aW9uIGFuZCB0aW1lLiBJIHByZXBhcmVkIHRoZSB2ZW5uCmRpYWdyYW0gZm9yIHRoZXNlIGNvbXBhcmlzb246CgoqIEdlbm90eXBlOiBQOCBSZXQgSGV0IHZzIEtPLCBQMTUgUmV0IEhldCB2cyBLTywgUDggU0NOIEhldCB2cyBLTywKICAgICAgICAgICAgUDE1IFNDTiBIZXQgdnMgS08sIFA4IGRMR04gSGV0IHZzIEtPLCBQMTUgZExHTiBIZXQgdnMgS08KKiBMb2NhdGlvbjogUDhfaGV0IFJldCB2cyBTQ04sIFA4X0tPIFJldCB2cyBTQ04sIFAxNV9oZXQgUmV0IHZzIFNDTiwKICAgICAgICAgICAgUDE1X0tPIFJldCB2cyBTQ04sIFA4X2hldCBSZXQgdnMgZExHTiwgUDhfS08gUmV0IHZzIGRMR04sCiAgICAgICAgICAgIFAxNV9oZXQgUmV0IHZzIGRMR04sIFAxNV9LTyBSZXQgdnMgZExHTiwgUDhfaGV0IFNDTiB2cyBkTEdOLAogICAgICAgICAgICBQOF9LTyBTQ04gdnMgZExHTiwgUDE1X2hldCBTQ04gdnMgZExHTiwgUDE1X0tPIFNDTiB2cyBkTEdOLgoKU2luY2UgSSB3YXMgaW50ZXJlc3RlZCBpbiB1bmRlcnN0YW5kaW5nIHRoZSBjaGFuZ2UgaW4gbG9jYWwgdHJhbnNsYXRvbWUKYWNjb3JkaW5nIHRvIExvY2F0aW9uIGZvciBkaWZmZXJlbnQgZGV2ZWxvcG1lbnRhbCB0aW1lIHBvaW50cyBmb3IgSGV0CmFuZCBLTy4gSGVuY2UsIEkgdHJpZWQgdG8gZ2VuZXJhdGUgYSB2ZW5uIGRpYWdyYW0gZm9yIExvY2F0aW9uIChSZXQKYW5kIFNDTikgYXQgZGV2ZWxvcG1lbnRhbCB0aW1lIHBvaW50cyBQOCBhbmQgUDE1IGZvciBnZW5vdHlwZSBoZXQgYW5kCktPLiAgU28gdGhlIHZlbm4gZGlhZ3JhbSAvIHVwc2V0IHBsb3Qgd2lsbCBiZSBmb3IgbG9jYXRpb24gd2hlcmUgc29tZQpnZW5lcyB3aWxsIGJlIHNoYXJlZC91bmlxdWUgZm9yIFA4X1JldF9oZXQsIFA4X1NDTl9IZXQsIFAxNV9SZXRfSEVULApQMTVfU0NOX0hFVC4gIFdlIGNhbiBwcmVwYXJlIGFuIHVwc2V0IHBsb3QgZm9yIFA4X1JldF9LTywKUDhfU0NOX0tPLCBQMTVfUmV0X0tPIGFuZCBQMTVfU0NOX0tPIGFsc28uIE9yIGNhbiBnZW5lcmF0ZSBhbiB1cHNldApwbG90IGJ5IGNvbWJpbmluZyBib3RoIFA4X1JldF9oZXQsIFA4X1NDTl9IZXQsIFAxNV9SZXRfSEVUIGFuZApQMTVfU0NOX0hFVCBhbmQgUDhfUmV0X0tPLCBQOF9TQ05fS08sIFAxNV9SZXRfS08gYW5kIFAxNV9TQ05fS08uCgpPaywgbGV0IHVzIHNlZSBpZiBJIGNhbiBpbXBsZW1lbnQgdGhpcywgc3RhcnRpbmcgd2l0aCB0aGUgZ2Vub3R5cGUgcXVlcnkKCiogR2Vub3R5cGU6IFA4IFJldCBIZXQgdnMgS08sIFAxNSBSZXQgSGV0IHZzIEtPLCBQOCBTQ04gSGV0IHZzIEtPLAogICAgICAgICAgICBQMTUgU0NOIEhldCB2cyBLTywgUDggZExHTiBIZXQgdnMgS08sIFAxNSBkTEdOIEhldCB2cyBLTwoKIyMga28gdnMgaGV0OyBhbGwgbG9jYXRpb25zIGFuZCB0aW1lcwoKYGBge3J9CiMjIFRoZSBhcHByb3ByaWF0ZSBkYXRhIHN0cnVjdHVyZSBpcyAnZ2Vub3R5cGVfdGFibGVzJywKIyMgYW5kIHRoZSB0YWJsZXMgb2YgaW50ZXJlc3QgYXJlOgp0YWJsZV9uYW1lcyA8LSBjKCJraF9wMDhfcmV0aW5hIiwgImtoX3AxNV9yZXRpbmEiLCAia2hfcDA4X3NjbiIsCiAgICAgICAgICAgICAgICAgImtoX3AxNV9zY24iLCAia2hfcDA4X2RsZ24iLCAia2hfcDE1X2RsZ24iKQp0YWJsZV9uYW1lcyAlaW4lIG5hbWVzKGdlbm90eXBlX3NpZykKbmV3c2lnIDwtIGdlbm90eXBlX3NpZ1tbMV1dCmZvciAoc2lnIGluIDI6bGVuZ3RoKHRhYmxlX25hbWVzKSkgewogIG5hbWUgPC0gdGFibGVfbmFtZXNbc2lnXQogIG5ld3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1tuYW1lXV0gPC0gZ2Vub3R5cGVfc2lnW1tuYW1lXV1bWyJkZXNlcSJdXVtbInVwcyJdXVtbbmFtZV1dCiAgbmV3c2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbbmFtZV1dIDwtIGdlbm90eXBlX3NpZ1tbbmFtZV1dW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbbmFtZV1dCn0KZ2Vub3R5cGVfdXBzZXRyIDwtIHVwc2V0cl9zaWcobmV3c2lnKQpnZW5vdHlwZV91cHNldF93cml0dGVuIDwtIHdyaXRlX3Vwc2V0X2dyb3VwcyhnZW5vdHlwZV91cHNldHIsIGV4Y2VsID0gImV4Y2VsL2dlbm90eXBlX3Vwc2V0X2dyb3Vwcy54bHN4IikKZ2Vub3R5cGVfdXBzZXRyW1siYWxsX3Bsb3QiXV0KcHAoZmlsZSA9ICJpbWFnZXMvdGVzdF9nZW5vdHlwZV91cHNldC5wZGYiKQpwcmludChnZW5vdHlwZV91cHNldHJbWyJhbGxfcGxvdCJdXSkKcGxvdHRlZCA8LSBkZXYub2ZmKCkKYGBgCgpOb3cgbGV0IHVzIHRyeSB0aGUgbG9jYXRpb24tc3BlY2lmaWMgY29tcGFyaXNvbnMKCiMjIHNjbiB2cyByZXRpbmEsIHAwOAoKYGBge3J9CiMjIFRoZSBhcHByb3ByaWF0ZSBkYXRhIHN0cnVjdHVyZSBpcyAnZ2Vub3R5cGVfdGFibGVzJywKIyMgYW5kIHRoZSB0YWJsZXMgb2YgaW50ZXJlc3QgYXJlOgp0YWJsZV9uYW1lcyA8LSBjKCJzcl9wMDhfaGV0IiwgInNyX3AwOF9rbyIpCnRhYmxlX25hbWVzICVpbiUgbmFtZXMobG9jYXRpb25fc2lnKQpsb2NhdGlvbl91cHNldF9pbnB1dCA8LSBsaXN0KCkKZmlyc3RfdGFibGUgPC0gdGFibGVfbmFtZXNbMV0KbmV3c2lnIDwtIGxvY2F0aW9uX3NpZ1tbZmlyc3RfdGFibGVdXQpmb3IgKHNpZyBpbiAyOmxlbmd0aCh0YWJsZV9uYW1lcykpIHsKICBuYW1lIDwtIHRhYmxlX25hbWVzW3NpZ10KICBuZXdzaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbbmFtZV1dIDwtIGxvY2F0aW9uX3NpZ1tbbmFtZV1dW1siZGVzZXEiXV1bWyJ1cHMiXV1bW25hbWVdXQogIG5ld3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bW25hbWVdXSA8LSBsb2NhdGlvbl9zaWdbW25hbWVdXVtbImRlc2VxIl1dW1siZG93bnMiXV1bW25hbWVdXQp9CmxvY2F0aW9uX3Vwc2V0ciA8LSB1cHNldHJfc2lnKG5ld3NpZykKbG9jYXRpb25fdXBzZXRfd3JpdHRlbiA8LSB3cml0ZV91cHNldF9ncm91cHMobG9jYXRpb25fdXBzZXRyLCBleGNlbCA9ICJleGNlbC9zcl9wMDhfaGV0a29fdXBzZXRfZ3JvdXBzLnhsc3giKQpsb2NhdGlvbl91cHNldHJbWyJhbGxfcGxvdCJdXQpwcChmaWxlID0gImltYWdlcy90ZXN0X2xvY2F0aW9uX3NyX3AwOF9oZXRrb191cHNldC5wZGYiKQpwcmludChsb2NhdGlvbl91cHNldHJbWyJhbGxfcGxvdCJdXSkKcGxvdHRlZCA8LSBkZXYub2ZmKCkKYGBgCgpJIGFtIHJlYXNvbmFibHkgY2VydGFpbiB0aGF0IFJhc2htaSB3b3VsZCBsaWtlIGEgdGFibGUgb2YgdGhlIGdlbmVzCnNoYXJlZCBhbW9uZyBpbmNyZWFzZWQgc2NuIGtvIGFuZCBoZXQgaW4gdGhlIGFib3ZlIHBsb3QgYWxvbmcgd2l0aCB0aGUKaW5jcmVhc2VkIHJldGluYSAoZS5nLiB0aGUgMjY5IGFuZCAxMDMgZ2VuZSBzZXRzKS4KCiMjIHNjbiB2cyByZXRpbmEsIHAxNQoKYGBge3J9CnRhYmxlX25hbWVzIDwtIGMoInNyX3AxNV9oZXQiLCAic3JfcDE1X2tvIikKdGFibGVfbmFtZXMgJWluJSBuYW1lcyhsb2NhdGlvbl9zaWcpCmxvY2F0aW9uX3Vwc2V0X2lucHV0IDwtIGxpc3QoKQpmaXJzdF90YWJsZSA8LSB0YWJsZV9uYW1lc1sxXQpuZXdzaWcgPC0gbG9jYXRpb25fc2lnW1tmaXJzdF90YWJsZV1dCmZvciAoc2lnIGluIDI6bGVuZ3RoKHRhYmxlX25hbWVzKSkgewogIG5hbWUgPC0gdGFibGVfbmFtZXNbc2lnXQogIG5ld3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1tuYW1lXV0gPC0gbG9jYXRpb25fc2lnW1tuYW1lXV1bWyJkZXNlcSJdXVtbInVwcyJdXVtbbmFtZV1dCiAgbmV3c2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbbmFtZV1dIDwtIGxvY2F0aW9uX3NpZ1tbbmFtZV1dW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbbmFtZV1dCn0KbG9jYXRpb25fdXBzZXRyIDwtIHVwc2V0cl9zaWcobmV3c2lnKQpsb2NhdGlvbl91cHNldF93cml0dGVuIDwtIHdyaXRlX3Vwc2V0X2dyb3Vwcyhsb2NhdGlvbl91cHNldHIsIGV4Y2VsID0gImV4Y2VsL3NyX3AxNV9oZXRrb191cHNldF9ncm91cHMueGxzeCIpCmxvY2F0aW9uX3Vwc2V0cltbImFsbF9wbG90Il1dCnByaW50KHNjbl9yZXRpbmFfcDE1X3Vwc2V0X3Jlc3VsdCkKcHAoZmlsZSA9ICJpbWFnZXMvdGVzdF9sb2NhdGlvbl9zcl9wMTVfaGV0a29fdXBzZXQucGRmIikKcHJpbnQobG9jYXRpb25fdXBzZXRyW1siYWxsX3Bsb3QiXV0pCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmBgYAoKIyMgZGxnbiB2cyByZXRpbmEsIHAwOAoKYGBge3J9CiMjIFRoZSBhcHByb3ByaWF0ZSBkYXRhIHN0cnVjdHVyZSBpcyAnZ2Vub3R5cGVfdGFibGVzJywKIyMgYW5kIHRoZSB0YWJsZXMgb2YgaW50ZXJlc3QgYXJlOgp0YWJsZV9uYW1lcyA8LSBjKCJkcl9wMDhfaGV0IiwgImRyX3AwOF9rbyIpCmxvY2F0aW9uX3Vwc2V0X2lucHV0IDwtIGxpc3QoKQpmaXJzdF90YWJsZSA8LSB0YWJsZV9uYW1lc1sxXQpuZXdzaWcgPC0gbG9jYXRpb25fc2lnW1tmaXJzdF90YWJsZV1dCmZvciAoc2lnIGluIDI6bGVuZ3RoKHRhYmxlX25hbWVzKSkgewogIG5hbWUgPC0gdGFibGVfbmFtZXNbc2lnXQogIG5ld3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1tuYW1lXV0gPC0gbG9jYXRpb25fc2lnW1tuYW1lXV1bWyJkZXNlcSJdXVtbInVwcyJdXVtbbmFtZV1dCiAgbmV3c2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbbmFtZV1dIDwtIGxvY2F0aW9uX3NpZ1tbbmFtZV1dW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbbmFtZV1dCn0KbG9jYXRpb25fdXBzZXRyIDwtIHVwc2V0cl9zaWcobmV3c2lnKQpsb2NhdGlvbl91cHNldF93cml0dGVuIDwtIHdyaXRlX3Vwc2V0X2dyb3Vwcyhsb2NhdGlvbl91cHNldHIsIGV4Y2VsID0gImV4Y2VsL2RyX3AwOF9oZXRrb191cHNldF9ncm91cHMueGxzeCIpCmxvY2F0aW9uX3Vwc2V0cltbImFsbF9wbG90Il1dCnBwKGZpbGUgPSAiaW1hZ2VzL3Rlc3RfbG9jYXRpb25fZHJfcDA4X2hldGtvX3Vwc2V0LnBkZiIpCnByaW50KGxvY2F0aW9uX3Vwc2V0cltbImFsbF9wbG90Il1dKQpwbG90dGVkIDwtIGRldi5vZmYoKQpgYGAKCiMjIGRsZ24gdnMgcmV0aW5hLCBwMTUKCmBgYHtyfQojIyBUaGUgYXBwcm9wcmlhdGUgZGF0YSBzdHJ1Y3R1cmUgaXMgJ2dlbm90eXBlX3RhYmxlcycsCiMjIGFuZCB0aGUgdGFibGVzIG9mIGludGVyZXN0IGFyZToKdGFibGVfbmFtZXMgPC0gYygiZHJfcDE1X2hldCIsICJkcl9wMTVfa28iKQpsb2NhdGlvbl91cHNldF9pbnB1dCA8LSBsaXN0KCkKZmlyc3RfdGFibGUgPC0gdGFibGVfbmFtZXNbMV0KbmV3c2lnIDwtIGxvY2F0aW9uX3NpZ1tbZmlyc3RfdGFibGVdXQpmb3IgKHNpZyBpbiAyOmxlbmd0aCh0YWJsZV9uYW1lcykpIHsKICBuYW1lIDwtIHRhYmxlX25hbWVzW3NpZ10KICBuZXdzaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbbmFtZV1dIDwtIGxvY2F0aW9uX3NpZ1tbbmFtZV1dW1siZGVzZXEiXV1bWyJ1cHMiXV1bW25hbWVdXQogIG5ld3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bW25hbWVdXSA8LSBsb2NhdGlvbl9zaWdbW25hbWVdXVtbImRlc2VxIl1dW1siZG93bnMiXV1bW25hbWVdXQp9CmxvY2F0aW9uX3Vwc2V0ciA8LSB1cHNldHJfc2lnKG5ld3NpZykKbG9jYXRpb25fdXBzZXRfd3JpdHRlbiA8LSB3cml0ZV91cHNldF9ncm91cHMobG9jYXRpb25fdXBzZXRyLCBleGNlbCA9ICJleGNlbC9kcl9wMTVfaGV0a29fdXBzZXRfZ3JvdXBzLnhsc3giKQpsb2NhdGlvbl91cHNldHJbWyJhbGxfcGxvdCJdXQpwcChmaWxlID0gImltYWdlcy90ZXN0X2xvY2F0aW9uX2RyX3AxNV9oZXRrb191cHNldC5wZGYiKQpwcmludChsb2NhdGlvbl91cHNldHJbWyJhbGxfcGxvdCJdXSkKcGxvdHRlZCA8LSBkZXYub2ZmKCkKYGBgCgojIyBkbGduIHZzIHNjbiwgcDA4CgpgYGB7cn0KdGFibGVfbmFtZXMgPC0gYygiZHNfcDA4X2hldCIsICJkc19wMDhfa28iKQpsb2NhdGlvbl91cHNldF9pbnB1dCA8LSBsaXN0KCkKZmlyc3RfdGFibGUgPC0gdGFibGVfbmFtZXNbMV0KbmV3c2lnIDwtIGxvY2F0aW9uX3NpZ1tbZmlyc3RfdGFibGVdXQpmb3IgKHNpZyBpbiAyOmxlbmd0aCh0YWJsZV9uYW1lcykpIHsKICBuYW1lIDwtIHRhYmxlX25hbWVzW3NpZ10KICBuZXdzaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbbmFtZV1dIDwtIGxvY2F0aW9uX3NpZ1tbbmFtZV1dW1siZGVzZXEiXV1bWyJ1cHMiXV1bW25hbWVdXQogIG5ld3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bW25hbWVdXSA8LSBsb2NhdGlvbl9zaWdbW25hbWVdXVtbImRlc2VxIl1dW1siZG93bnMiXV1bW25hbWVdXQp9CmxvY2F0aW9uX3Vwc2V0ciA8LSB1cHNldHJfc2lnKG5ld3NpZykKbG9jYXRpb25fdXBzZXRfd3JpdHRlbiA8LSB3cml0ZV91cHNldF9ncm91cHMobG9jYXRpb25fdXBzZXRyLCBleGNlbCA9ICJleGNlbC9kc19wMDhfaGV0a29fdXBzZXRfZ3JvdXBzLnhsc3giKQpsb2NhdGlvbl91cHNldHJbWyJhbGxfcGxvdCJdXQpwcChmaWxlID0gImltYWdlcy90ZXN0X2xvY2F0aW9uX2RzX3AwOF9oZXRrb191cHNldC5wZGYiKQpwcmludChsb2NhdGlvbl91cHNldHJbWyJhbGxfcGxvdCJdXSkKcGxvdHRlZCA8LSBkZXYub2ZmKCkKYGBgCgojIyBkbGduIHZzIHNjbiwgcDE1CgpgYGB7cn0KdGFibGVfbmFtZXMgPC0gYygiZHNfcDE1X2hldCIsICJkc19wMTVfa28iKQpsb2NhdGlvbl91cHNldF9pbnB1dCA8LSBsaXN0KCkKZmlyc3RfdGFibGUgPC0gdGFibGVfbmFtZXNbMV0KbmV3c2lnIDwtIGxvY2F0aW9uX3NpZ1tbZmlyc3RfdGFibGVdXQpmb3IgKHNpZyBpbiAyOmxlbmd0aCh0YWJsZV9uYW1lcykpIHsKICBuYW1lIDwtIHRhYmxlX25hbWVzW3NpZ10KICBuZXdzaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbbmFtZV1dIDwtIGxvY2F0aW9uX3NpZ1tbbmFtZV1dW1siZGVzZXEiXV1bWyJ1cHMiXV1bW25hbWVdXQogIG5ld3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bW25hbWVdXSA8LSBsb2NhdGlvbl9zaWdbW25hbWVdXVtbImRlc2VxIl1dW1siZG93bnMiXV1bW25hbWVdXQp9CmxvY2F0aW9uX3Vwc2V0ciA8LSB1cHNldHJfc2lnKG5ld3NpZykKbG9jYXRpb25fdXBzZXRfd3JpdHRlbiA8LSB3cml0ZV91cHNldF9ncm91cHMobG9jYXRpb25fdXBzZXRyLCBleGNlbCA9ICJleGNlbC9kc19wMTVfaGV0a29fdXBzZXRfZ3JvdXBzLnhsc3giKQpsb2NhdGlvbl91cHNldHJbWyJhbGxfcGxvdCJdXQpwcChmaWxlID0gImltYWdlcy90ZXN0X2xvY2F0aW9uX2RzX3AxNV9oZXRrb191cHNldC5wZGYiKQpwcmludChsb2NhdGlvbl91cHNldHJbWyJhbGxfcGxvdCJdXSkKcGxvdHRlZCA8LSBkZXYub2ZmKCkKYGBgCgojIFNoYXJlZCBhbmQgdW5pcXVlIGdlbmUgc2V0cyBhY3Jvc3MgeC93dAoKSW4gdGhpcyBibG9jayBJIHdhbnQgdG8gZmluZCB0aGUgdW5pcXVlIGFuZCBzaGFyZWQgZ2VuZXMgYmV0d2VlbjoKCjEuICBzY24gcDggaGV0L3d0IGFuZCByZXRpbmEgcDggaGV0L3d0OiBod3AwOHNjbmluYywgaHdwMDhyZXRpbmMsIGh3cDA4c2NuZGVjLCBod3AwOHJldGRlYwoyLiAgc2NuIHAxNSBoZXQvd3QgYW5kIHJldGluYSBwMTUgaGV0L3d0OiBod3AxNXNjbmluYywgaHdwMTVyZXRpbmMsIGh3cDE1c2NuZGVjLCBod3AxNXJldGRlYwozLiAgIzEgYW5kICMyIHRvZ2V0aGVyOiAgOCBjYXRnb3JpZXMgYWJvdmUKNC4gIHNjbiBwOCBrby93dCBhbmQgcmV0aW5hIHA4IGtvL3d0CjUuICBzY24gcDE1IGtvL3d0IGFuZCByZXRpbmEgcDE1IGtvL3d0CjYuICAjNCBhbmQgIzUgdG9nZXRoZXIKClRoZSBjb21wYXJpc29ucyBvZiBoZXQvd3QgYXJlIGZvdW5kIGluIHRoZSAnaW5jbHVzaW9uX3NpZycgZGF0YXNldDsKYmVjYXVzZSB0aGV5IGFyZSBwcm92aWRpbmcgb3VyIGN1dG9mZnMgZm9yIG5vbnNwZWNpZmljIGJpbmRpbmcuCgojIyBOdW1iZXIgMSBhYm92ZTogcDA4X2hldCB2cyB3dCBmb3Igc2NuIGFuZCByZXRpbmEuCgpgYGB7cn0KdGFibGVfbmFtZXMgPC0gYygicDA4X2hldF9zY24iLCAicDA4X2hldF9yZXRpbmEiKQppbmNsdXNpb25fdXBzZXRyIDwtIHVwc2V0cl9zaWcoaW5jbHVzaW9uX3NpZywgY29udHJhc3RzID0gdGFibGVfbmFtZXMpCmluY2x1c2lvbl91cHNldF93cml0dGVuIDwtIHdyaXRlX3Vwc2V0X2dyb3VwcyhpbmNsdXNpb25fdXBzZXRyLCBleGNlbCA9ICJleGNlbC9yc19wMDhfaGV0X2luY2x1c2lvbl91cHNldF9ncm91cHMueGxzeCIpCmluY2x1c2lvbl91cHNldHJbWyJhbGxfcGxvdCJdXQpwcChmaWxlID0gImltYWdlcy9pbmNsdXNpb25fc3JfcDA4X3Vwc2V0LnBkZiIpCnByaW50KGluY2x1c2lvbl91cHNldHJbWyJhbGxfcGxvdCJdXSkKcGxvdHRlZCA8LSBkZXYub2ZmKCkKYGBgCgojIyBOdW1iZXIgMiBhYm92ZTogcDE1X2hldCB2cyB3dCBmb3Igc2NuIGFuZCByZXRpbmEuCgpgYGB7cn0KdGFibGVfbmFtZXMgPC0gYygicDE1X2hldF9zY24iLCAicDE1X2hldF9yZXRpbmEiKQppbmNsdXNpb25fdXBzZXRyIDwtIHVwc2V0cl9zaWcoaW5jbHVzaW9uX3NpZywgY29udHJhc3RzID0gdGFibGVfbmFtZXMpCmluY2x1c2lvbl91cHNldF93cml0dGVuIDwtIHdyaXRlX3Vwc2V0X2dyb3VwcyhpbmNsdXNpb25fdXBzZXRyLCBleGNlbCA9ICJleGNlbC9yc19wMTVfaGV0X2luY2x1c2lvbl91cHNldF9ncm91cHMueGxzeCIpCmluY2x1c2lvbl91cHNldHJbWyJhbGxfcGxvdCJdXQpwcChmaWxlID0gImltYWdlcy9pbmNsdXNpb25fc3JfcDE1X3Vwc2V0LnBkZiIpCnByaW50KGluY2x1c2lvbl91cHNldHJbWyJhbGxfcGxvdCJdXSkKcGxvdHRlZCA8LSBkZXYub2ZmKCkKYGBgCgojIyBOdW1iZXIgMyBhYm92ZTogY29tYmluYXRpb24gb2YgIzEgYW5kICMyCgpgYGB7cn0KdGFibGVfbmFtZXMgPC0gYygicDA4X2hldF9zY24iLCAicDA4X2hldF9yZXRpbmEiLCAicDE1X2hldF9zY24iLCAicDE1X2hldF9yZXRpbmEiKQppbmNsdXNpb25fdXBzZXRyIDwtIHVwc2V0cl9zaWcoaW5jbHVzaW9uX3NpZywgY29udHJhc3RzID0gdGFibGVfbmFtZXMpCmluY2x1c2lvbl91cHNldF93cml0dGVuIDwtIHdyaXRlX3Vwc2V0X2dyb3VwcyhpbmNsdXNpb25fdXBzZXRyLCBleGNlbCA9ICJleGNlbC9yc19wMDhwMTVfaGV0X2luY2x1c2lvbl91cHNldF9ncm91cHMueGxzeCIpCmluY2x1c2lvbl91cHNldHJbWyJhbGxfcGxvdCJdXQpwcChmaWxlID0gImltYWdlcy9pbmNsdXNpb25fc3JfcDA4cDE1X3Vwc2V0LnBkZiIpCnByaW50KGluY2x1c2lvbl91cHNldHJbWyJhbGxfcGxvdCJdXSkKcGxvdHRlZCA8LSBkZXYub2ZmKCkKYGBgCgojIyBOdW1iZXIgNCBhYm92ZSBwMDhfa28gdnMgd3QgZm9yIHNjbiBhbmQgcmV0aW5hLgoKYGBge3J9CnRhYmxlX25hbWVzIDwtIGMoInAwOF9rb19zY24iLCAicDA4X2tvX3JldGluYSIpCmluY2x1c2lvbl91cHNldHIgPC0gdXBzZXRyX3NpZyhpbmNsdXNpb25fc2lnLCBjb250cmFzdHMgPSB0YWJsZV9uYW1lcykKaW5jbHVzaW9uX3Vwc2V0X3dyaXR0ZW4gPC0gd3JpdGVfdXBzZXRfZ3JvdXBzKGluY2x1c2lvbl91cHNldHIsIGV4Y2VsID0gImV4Y2VsL3JzX3AwOF9rb19pbmNsdXNpb25fdXBzZXRfZ3JvdXBzLnhsc3giKQppbmNsdXNpb25fdXBzZXRyW1siYWxsX3Bsb3QiXV0KcHAoZmlsZSA9ICJpbWFnZXMvaW5jbHVzaW9uX3NyX3AwOF9rb191cHNldC5wZGYiKQpwcmludChpbmNsdXNpb25fdXBzZXRyW1siYWxsX3Bsb3QiXV0pCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmBgYAoKIyMgTnVtYmVyIDUgYWJvdmUgcDE1X2tvIHZzIHd0IGZvciBzY24gYW5kIHJldGluYS4KCmBgYHtyfQp0YWJsZV9uYW1lcyA8LSBjKCJwMTVfa29fc2NuIiwgInAxNV9rb19yZXRpbmEiKQppbmNsdXNpb25fdXBzZXRyIDwtIHVwc2V0cl9zaWcoaW5jbHVzaW9uX3NpZywgY29udHJhc3RzID0gdGFibGVfbmFtZXMpCmluY2x1c2lvbl91cHNldF93cml0dGVuIDwtIHdyaXRlX3Vwc2V0X2dyb3VwcyhpbmNsdXNpb25fdXBzZXRyLCBleGNlbCA9ICJleGNlbC9yc19wMTVfa29faW5jbHVzaW9uX3Vwc2V0X2dyb3Vwcy54bHN4IikKaW5jbHVzaW9uX3Vwc2V0cltbImFsbF9wbG90Il1dCnBwKGZpbGUgPSAiaW1hZ2VzL2luY2x1c2lvbl9zcl9wMTVfa29fdXBzZXQucGRmIikKcHJpbnQoaW5jbHVzaW9uX3Vwc2V0cltbImFsbF9wbG90Il1dKQpwbG90dGVkIDwtIGRldi5vZmYoKQpgYGAKCiMjIE51bWJlciA2IGFib3ZlOiBDb21iaW5pbmcgIzQgYW5kICM1CgpgYGB7cn0KdGFibGVfbmFtZXMgPC0gYygicDA4X2tvX3NjbiIsICJwMDhfa29fcmV0aW5hIiwgInAxNV9rb19zY24iLCAicDE1X2tvX3JldGluYSIpCmluY2x1c2lvbl91cHNldHIgPC0gdXBzZXRyX3NpZyhpbmNsdXNpb25fc2lnLCBjb250cmFzdHMgPSB0YWJsZV9uYW1lcykKaW5jbHVzaW9uX3Vwc2V0X3dyaXR0ZW4gPC0gd3JpdGVfdXBzZXRfZ3JvdXBzKGluY2x1c2lvbl91cHNldHIsIGV4Y2VsID0gImV4Y2VsL3JzX3AwOHAxNV9rb19pbmNsdXNpb25fdXBzZXRfZ3JvdXBzLnhsc3giKQppbmNsdXNpb25fdXBzZXRyW1siYWxsX3Bsb3QiXV0KcHAoZmlsZSA9ICJpbWFnZXMvaW5jbHVzaW9uX3NyX3AwOHAxNV9rb191cHNldC5wZGYiKQpwcmludChpbmNsdXNpb25fdXBzZXRyW1siYWxsX3Bsb3QiXV0pCnBsb3R0ZWQgPC0gZGV2Lm9mZigpCmBgYAoKIyBHU1ZBCgpgYGB7cn0KbXNpZ2RiIDwtICJyZWZlcmVuY2UvbXNpZ2RiX3YyMDI0LjEuTW0uZGIiCmlmIChmaWxlLmV4aXN0cyhtc2lnZGIpKSB7CiAgdjNfaF9nc3ZhIDwtIHNpbXBsZV9nc3ZhKHYzX3BhaXJ3aXNlX2lucHV0LCBvcmdkYiA9ICJvcmcuTW0uZWcuZGIiLCBzaWduYXR1cmVfY2F0ZWdvcnkgPSAibWgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzID0gbXNpZ2RiLCBpZF9zb3VyY2UgPSAiZmRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9pZCA9ICJtZ2lfc3ltYm9sIikKICB2M19oX2dzdmEKCiAgdjNfaF9nc3ZhX3NpZyA8LSBnZXRfc2lnX2dzdmFfY2F0ZWdvcmllcygKICAgIHYzX2hfZ3N2YSwgZXhjZWwgPSAiZXhjZWwvZ3N2YV9zaWdfaGFsbG1hcmtfY2F0ZWdvcmllcy54bHN4IikKICB2M19oX2dzdmFfc2lnCgogIHYzX20xX2dzdmEgPC0gc2ltcGxlX2dzdmEodjNfcGFpcndpc2VfaW5wdXQsIG9yZ2RiID0gIm9yZy5NbS5lZy5kYiIsIHNpZ25hdHVyZV9jYXRlZ29yeSA9ICJtMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzID0gbXNpZ2RiLCBpZF9zb3VyY2UgPSAiZmRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfaWQgPSAibWdpX3N5bWJvbCIpCiAgdjNfbTFfZ3N2YQogIHYzX20xX2dzdmFfc2lnIDwtIGdldF9zaWdfZ3N2YV9jYXRlZ29yaWVzKAogICAgdjNfbTFfZ3N2YSwgZXhjZWwgPSAiZXhjZWwvZ3N2YV9zaWdfcG9zaXRpb25hbF9jYXRlZ29yaWVzLnhsc3giKQogIHYzX20xX2dzdmFfc2lnCgogIHYzX20yX2dzdmEgPC0gc2ltcGxlX2dzdmEodjNfcGFpcndpc2VfaW5wdXQsIG9yZ2RiID0gIm9yZy5NbS5lZy5kYiIsIHNpZ25hdHVyZV9jYXRlZ29yeSA9ICJtMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzID0gbXNpZ2RiLCBpZF9zb3VyY2UgPSAiZmRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfaWQgPSAibWdpX3N5bWJvbCIpCiAgdjNfbTJfZ3N2YQogIHYzX20yX2dzdmFfc2lnIDwtIGdldF9zaWdfZ3N2YV9jYXRlZ29yaWVzKAogICAgdjNfbTJfZ3N2YSwgZXhjZWwgPSAiZXhjZWwvZ3N2YV9zaWdfY3VyYXRlZF9jYXRlZ29yaWVzLnhsc3giKQogIHYzX20yX2dzdmFfc2lnCgogIHYzX20zX2dzdmEgPC0gc2ltcGxlX2dzdmEodjNfcGFpcndpc2VfaW5wdXQsIG9yZ2RiID0gIm9yZy5NbS5lZy5kYiIsIHNpZ25hdHVyZV9jYXRlZ29yeSA9ICJtMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzID0gbXNpZ2RiLCBpZF9zb3VyY2UgPSAiZmRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfaWQgPSAibWdpX3N5bWJvbCIpCiAgdjNfbTNfZ3N2YQogIHYzX20zX2dzdmFfc2lnIDwtIGdldF9zaWdfZ3N2YV9jYXRlZ29yaWVzKAogICAgdjNfbTNfZ3N2YSwgZXhjZWwgPSAiZXhjZWwvZ3N2YV9zaWdfcmVndWxhdG9yeV9jYXRlZ29yaWVzLnhsc3giKQogIHYzX20zX2dzdmFfc2lnCgogIHYzX201X2dzdmEgPC0gc2ltcGxlX2dzdmEodjNfcGFpcndpc2VfaW5wdXQsIG9yZ2RiID0gIm9yZy5NbS5lZy5kYiIsIHNpZ25hdHVyZV9jYXRlZ29yeSA9ICJtNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzID0gbXNpZ2RiLCBpZF9zb3VyY2UgPSAiZmRhdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRfaWQgPSAibWdpX3N5bWJvbCIpCiAgdjNfbTVfZ3N2YQogIHYzX201X2dzdmFfc2lnIDwtIGdldF9zaWdfZ3N2YV9jYXRlZ29yaWVzKAogICAgdjNfbTVfZ3N2YSwgZXhjZWwgPSAiZXhjZWwvZ3N2YV9zaWdfb250b2xvZ3lfY2F0ZWdvcmllcy54bHN4IikKICB2M19tNV9nc3ZhX3NpZwoKICB2M19tOF9nc3ZhIDwtIHNpbXBsZV9nc3ZhKHYzX3BhaXJ3aXNlX2lucHV0LCBvcmdkYiA9ICJvcmcuTW0uZWcuZGIiLCBzaWduYXR1cmVfY2F0ZWdvcnkgPSAibTgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlcyA9IG1zaWdkYiwgaWRfc291cmNlID0gImZkYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkX2lkID0gIm1naV9zeW1ib2wiKQogIHYzX204X2dzdmEKICB2M19tOF9nc3ZhX3NpZyA8LSBnZXRfc2lnX2dzdmFfY2F0ZWdvcmllcygKICAgIHYzX204X2dzdmEsIGV4Y2VsID0gImV4Y2VsL2dzdmFfc2lnX2NlbGx0eXBlX2NhdGVnb3JpZXMueGxzeCIpCiAgdjNfbThfZ3N2YV9zaWcKfQpgYGAKCiMgR1NFQSBpbWFnZXMKClVwIGFib3ZlIEkgY3JlYXRlZCBhIGZhaXJseSBsYXJnZSBzZXQgb2YgZW5yaWNobWVudC9HU0VBIGFuYWx5c2VzLgpMZXQgdXMgcHVsbCBzb21lIG9mIHRoZSBtb3N0IGludGVyZXN0aW5nIHJlc3VsdHMgaGVyZSBhbmQgbG9vayBhdAp0aGVtLgoKSGVyZSBhcmUgdGhlIHNwZWNpZmljIHF1ZXJpZXMgZnJvbSBSYXNobWk6CgoqIEdlbm90eXBlIChoZXQgdnMga28pOgogICogUDggaGV0IGFuZCBrbyBmb3IgUmV0CiAgKiBTQ04gKFA4IGhldCB2cyBLTyBTQ04KICAqIFA4IGhldCB2cyBLTyBSZXQpCiAgKiBQMTUgaGV0IGFuZCBrbyBmb3IgUmV0CiogTG9jYXRpb24gKHNvbWFsIHZzIGF4b25hbCk6CiAgKiBTUl9QMDhfS08KICAqIFNSX1AwOF9IZXQKICAqIFNSX1AxNV9LTwogICogU1JfUDE1X0hldAoqIFRpbWUocDh2cyBwMTUpOgogICogdF9oZXRfUmV0XyBwbzgtcDE1CiAgKiB0X0tPX1JldF9DIHBvOC1wMTUKICAqIHRfaGV0X1NDTl9wbzgtcDE1CiAgKiB0X0tPX1NDTl9wbzgtcDE1CgojIyBHZW5vdHlwZQoKTGV0IHVzIHRha2UgYSBtb21lbnQgYW5kIHNlZSBmb3Igd2hpY2ggY29udHJhc3RzIEkgYWNxdWlyZWQgcmVzdWx0czoKCkkgbmVlZCB0byBtYWtlIGEgbGl0dGxlIHN1bW1hcnkgZm9yIGNsdXN0ZXJwcm9maWxlciB0b28gc28gdGhhdCBJIGNhbiBlYXNpbHkgc2VlIGhvdyBtYW55IGhpdHMgdGhlcmUKYXJlIGZvciBlYWNoIGNvbnRyYXN0LgoKYGBge3J9CnN1bW1hcnkoZ2Vub3R5cGVfZnVsbF9ncCkKZm9yIChpIGluIG5hbWVzKGdlbm90eXBlX2Z1bGxfZ3ApKSB7CiAgcHJpbnQoaSkKICBwcmludChnZW5vdHlwZV9mdWxsX2dwW1tpXV1bWyJudW1faGl0cyJdXSkKfQpzdW1tYXJ5KGdlbm90eXBlX2Z1bGxfY3ApCmZvciAoaSBpbiBuYW1lcyhnZW5vdHlwZV9mdWxsX2NwKSkgewogIHByaW50KGkpCiAgcHJpbnQobnJvdyhnZW5vdHlwZV9mdWxsX2NwW1tpXV1bWyJnc2VfZ28iXV0pKQp9CmBgYAoKIyMjIHA4IGhldC9rbyBmb3IgcmV0aW5hOgoKVGhpcyBjb250cmFzdCwgZXZlbiBiZWZvcmUgZmlsdGVyaW5nIGF3YXkgdGhlIGhpZ2gtd3QgZ2VuZXMsIG9ubHkgaGFzIDggZ2VuZXMgaW4gdGhlIHNldCBvZiB1cCBhbmQKZG93biBnZW5lcyBjb21iaW5lZC4gIEFzIGEgcmVzdWx0LCBteSBmdW5jdGlvbiB3aGljaCBwZXJmb3JtcyBnUHJvZmlsZXIvY2x1c3RlclByb2ZpbGVyIHNraXBzIGl0LAphbmQgYWxzbyBza2lwcyB0aGUgcDE1IGhldC9rbyBmb3IgcmV0aW5hIHNhbXBsZXMuCgojIyMgcDggaGV0L2tvIGZvciBzY246CgpUaGlzIGhhcyBhIGJ1bmNoIG1vcmUgZ2VuZXM6IDUxIHVwIGFuZCAxMjggZG93bi4KVW5mb3J0dW5hdGVseSwgZ1Byb2ZpbGVyIHNlZXMgbm8gc2lnbmlmaWNhbnQgb3Zlci1yZXByZXNlbnRhdGlvbiBpbiB0aGUgdXAgY2F0ZWdvcnkgb2YgZ2VuZXMuClRoZSBkb3duIGNhdGVnb3J5IGhhcwoKVGhlIHVwL2Rvd24gc2V0cyBmcm9tIGNsdXN0ZXJQcm9maWxlciBoYXZlIGVucmljaF9nbywgZ3NlX2dvLCBhbmQgZW5yaWNoX29iamVjdHMgdG8gbG9vayBhdC4KCmBgYHtyfQpnZW5vdHlwZV9mdWxsX2dwJGtoX3AwOF9zY25fdXAkbnVtX2hpdHMKZ2Vub3R5cGVfZnVsbF9ncCRraF9wMDhfc2NuX2Rvd24kbnVtX2hpdHMKCnBsb3RzIDwtIHBsb3RfZW5yaWNocmVzdWx0KGdlbm90eXBlX2Z1bGxfZ3Aka2hfcDA4X3Njbl9kb3duW1siQlBfZW5yaWNoIl1dKQpwbG90c1tbImRvdCJdXQpwbG90c1tbInRyZWUiXV0KYGBgCgpQZXJoYXBzIEkgc2hvdWxkIGp1c3QgYXNrIHRoZSBxdWVzdGlvbjogZm9yIHdoaWNoIGNhdGVnb3JpZXMgZGlkIEkgZ2V0IHJlc3VsdHMgYmFjaz8KCmBgYHtyfQpzdW1tYXJ5KGdlbm90eXBlX2Z1bGxfZ3ApCmBgYAoKa2hfcDA4X2RsZ25fdXA6IE5vIHNpZ25pZmljYW50IGdQcm9maWxlciByZXN1bHRzLgpraF9wMTVfZGxnbl91cDogU2lnbmlmaWNhbnQgQlAsIEhQLCBLRUdHLCBNRiwgUkVBQywgVEYKa2hfcDA4X3Njbl91cDogTm8gc2lnbmlmaWNhbnQgZ1Byb2ZpbGVyIHJlc3VsdHMuCmtoX3AwOF9zY25fZG93bjogU2lnbmlmaWNhbnQgQlAsIE1pUk5BLCBNRiwgVEYKa2hfcDE1X3Njbl9kb3duOiBTaWduaWZpY2FudCBCUCwgTUYKCgpgYGB7cn0KcGxvdHMgPC0gcGxvdF9lbnJpY2hyZXN1bHQoZ2Vub3R5cGVfZnVsbF9ncFtbImtoX3AxNV9kbGduX3VwIl1dW1siQlBfZW5yaWNoIl1dKQpwbG90c1tbImRvdCJdXQpgYGAKCiMjIExvY2F0aW9uCgojIyMgU2NuIHZzIHJldGluYSBrbywgcDA4CgpgYGB7cn0KCnBsb3RzIDwtIHBsb3RfZW5yaWNocmVzdWx0KGxvY2F0aW9uX2dwW1sic3JfcDA4X2tvIl1dW1sic3JfcDA4X2tvX3VwIl1dW1siQlBfZW5yaWNoIl1dKQpwbG90c1tbImRvdCJdXQoKcGxvdHMgPC0gcGxvdF9lbnJpY2hyZXN1bHQobG9jYXRpb25fZ3BbWyJzcl9wMDhfa28iXV1bWyJzcl9wMDhfa29fZG93biJdXVtbIkJQX2VucmljaCJdXSkKcGxvdHNbWyJkb3QiXV0KYGBgCgojIyMgc2NuIHZzIHJldGluYSwgaGV0LCBwMDgKCkVucmljaGVkIGdyb3VwczogQlAsIEtFR0csIE1GLCBURiwgQ0MKCmBgYHtyfQpzdW1tYXJ5KGxvY2F0aW9uX2dwW1sic3JfcDA4X2hldCJdXVtbInNyX3AwOF9oZXRfdXAiXV0pCnBsb3RzIDwtIHBsb3RfZW5yaWNocmVzdWx0KGxvY2F0aW9uX2dwW1sic3JfcDA4X2hldCJdXVtbInNyX3AwOF9oZXRfdXAiXV1bWyJCUF9lbnJpY2giXV0pCnBsb3RzW1siZG90Il1dCgpwbG90cyA8LSBwbG90X2VucmljaHJlc3VsdChsb2NhdGlvbl9ncFtbInNyX3AwOF9oZXQiXV1bWyJzcl9wMDhfaGV0X3VwIl1dW1siQ0NfZW5yaWNoIl1dKQpwbG90c1tbImRvdCJdXQoKcGxvdHMgPC0gcGxvdF9lbnJpY2hyZXN1bHQobG9jYXRpb25fZ3BbWyJzcl9wMDhfaGV0Il1dW1sic3JfcDA4X2hldF9kb3duIl1dW1siQlBfZW5yaWNoIl1dKQpwbG90c1tbImRvdCJdXQoKc3JfcDA4X2hldF90b3BuX2dzZWEgPC0gcGxvdF90b3BuX2dzZWEobG9jYXRpb25fY3BbWyIiXV0pCgpgYGAKCiMjIyBTY24gdnMgcmV0aW5hIGtvLCBwMTUKCmBgYHtyfQpwbG90cyA8LSBwbG90X2VucmljaHJlc3VsdChsb2NhdGlvbl9ncFtbInNyX3AxNV9rbyJdXVtbInNyX3AxNV9rb191cCJdXVtbIkJQX2VucmljaCJdXSkKcGxvdHNbWyJkb3QiXV0KCnBsb3RzIDwtIHBsb3RfZW5yaWNocmVzdWx0KGxvY2F0aW9uX2dwW1sic3JfcDE1X2tvIl1dW1sic3JfcDE1X2tvX2Rvd24iXV1bWyJCUF9lbnJpY2giXV0pCnBsb3RzW1siZG90Il1dCmBgYAoKIyMjIHNjbiB2cyByZXRpbmEsIGhldCwgcDE1CgpgYGB7cn0KcGxvdHMgPC0gcGxvdF9lbnJpY2hyZXN1bHQobG9jYXRpb25fZ3BbWyJzcl9wMTVfaGV0Il1dW1sic3JfcDE1X2hldF91cCJdXVtbIkJQX2VucmljaCJdXSkKcGxvdHNbWyJkb3QiXV0KCnBsb3RzIDwtIHBsb3RfZW5yaWNocmVzdWx0KGxvY2F0aW9uX2dwW1sic3JfcDE1X2hldCJdXVtbInNyX3AxNV9oZXRfZG93biJdXVtbIkJQX2VucmljaCJdXSkKcGxvdHNbWyJkb3QiXV0KYGBgCgojIyBUaW1lCgojIyMgaGV0IHJldGluYQoKVXBzOiBzaWduaWZpY2FudCByZXN1bHRzIGZvciBCUCwgTUYsIFRGCkRvd25zOiBCUCwgTUYsIFJFQUMsIFRGLCBXUAoKYGBge3J9CnBsb3RzIDwtIHBsb3RfZW5yaWNocmVzdWx0KHRpbWVfZ3BbWyJ0X2hldF9yZXRpbmEiXV1bWyJ0X2hldF9yZXRpbmFfdXAiXV1bWyJCUF9lbnJpY2giXV0pCnBsb3RzW1siZG90Il1dCgpwbG90cyA8LSBwbG90X2VucmljaHJlc3VsdCh0aW1lX2dwW1sidF9oZXRfcmV0aW5hIl1dW1sidF9oZXRfcmV0aW5hX2Rvd24iXV1bWyJCUF9lbnJpY2giXV0pCnBsb3RzW1siZG90Il1dCmBgYAoKIyMjIGtvIHJldGluYQoKVXA6IEJQLCBNaVJOQSwgTUYKRG93bjogQlAsIE1GLCBSRUFDLCBURgoKYGBge3J9CnBsb3RzIDwtIHBsb3RfZW5yaWNocmVzdWx0KHRpbWVfZ3BbWyJ0X2tvX3JldGluYSJdXVtbInRfa29fcmV0aW5hX3VwIl1dW1siQlBfZW5yaWNoIl1dKQpwbG90c1tbImRvdCJdXQoKcGxvdHMgPC0gcGxvdF9lbnJpY2hyZXN1bHQodGltZV9ncFtbInRfa29fcmV0aW5hIl1dW1sidF9rb19yZXRpbmFfZG93biJdXVtbIkJQX2VucmljaCJdXSkKcGxvdHNbWyJkb3QiXV0KYGBgCgojIyMgaGV0IHNjbgoKTmVpdGhlciBvZiB0aGUgU0NOIGdQcm9maWxlciBxdWVyaWVzIHByb3ZpZGVkIGFueSByZXN1bHRzLgoKIyBCaWJsaW9ncmFwaHkKCmBgYHtyIHNhdmVtZSwgZXZhbD1GQUxTRX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgc2F2ZWZpbGUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lID0gc2F2ZWZpbGUpKQpgYGAKCmBgYHtyIGxvYWRtZV9hZnRlciwgZXZhbD1GQUxTRX0KdG1wIDwtIGxvYWRtZShmaWxlbmFtZSA9IHNhdmVmaWxlKQpgYGAK