1 Introduction

The set of analyses performed in tmrc3 sample estimation has become unorganized and difficult to follow. This is intended to start at the level of broad organization before stepping into the analyses.

As of 20220224, this document is attempting to synchronize with the google doc named ‘TMRC3_Aug18_2021’. I am hoping therefore to have blocks named according to the figures/etc in that document.

1.1 Goals

These samples are from patients who either successfully cleared a Leishmania panamensis infection following treatment, or did not. They include biopsies from each patient along with purifications for Monocytes, Neutrophils, and Eosinophils. When possible, this process was repeated over three visits; but some patients did not return for the second or third visit.

The over-arching goal is to look for attributes(most likely genes) which distinguish patients who do and do not cure the infection after treatment. If possible, these will be apparent on the first visit.

1.2 Relevant Metadata

The metadata factors (in no particular order) of the experiment are:

  1. Visit. 1, 2, or 3.
  2. Patient.
  3. Clinical outcome: cure or fail. This includes the population of patients who did not return and are labeled ‘lost’. This is, by definition, confounded with patient.
  4. Drug treatment. Most of the patients were treated with an antimonial, but a few were treated with miltefosine.
  5. Cell type or biopsy.

Metadata was also collected for the patients and there are many factors which have potential to affect the outcome. These analyses will generally remain agnostic for these factors, which include (among other things):

  1. sex
  2. ethnicity
  3. age
  4. ulcer/lesion attributes (by visit)
  5. amount of time spent with infection

1.3 Libraries, sequencing, mapping, quantification

The samples used in these analyses were all collected, purified, and libraries generated by the scientists/doctors at CIDEIM. The sequencing libraries were generated via the TruSeq non-stranded library kit and sequenced either at JHU or UMD; earlier samples were single-ended, but most were paired.

All samples were trimmed with trimomatic using the same set of parameters. All mapping was performed with hisat2 version 2.2.1. Quantifications were also performed with salmon version 1.2.0. The reference genome used was hg38 100 (released 202004). When samples were mapped against L.panamensis, the TriTrypDB version 36 reference was used. The set of annotations were therefore limited to ensembl’s 2020 release. The early samples were actually first mapped with hg38 91 and later redone.

1.4 Types of analyses included

This document will limit itself to a set of canonical RNAseq analyses. It must therefore create files containing the raw data to facilitate sharing the data. It will plot metrics of the data to demonstrate the sequencing quality and clustering of the samples under the various conditions examined and normalizations employed. It will perform differential expression analyses for the metadata factors of interest alongside likelihood ratio tests for factors like celltype and time. Given the sets of over/under expressed genes observed in the various DE methods, it will perform the likely gene set tests for over represented gene ontology groups, reactome, etc. Simultaneously, the raw data will be passed to gene set variance analyses to see if there are groups of genes overrepresented in other experiments.

1.5 Metadata collection

There are two metadata sources:

  1. The online sample sheet, which I periodically update and download into the ‘sample_sheets/’ directory.
  2. The crf metadata, describing the individual patients.
samplesheet <- "sample_sheets/tmrc3_samples_202205.xlsx"
crf_metadata <- "sample_sheets/20210825_EXP_ESPECIAL_TMRC3_VERSION_2.xlsx"

2 Annotation Collection

The primary annotation sources are:

  1. Ensembl’s biomart archive from 2020 for human annotations.
  2. The TriTrypDB release 36 for parasite annotations.

Both provide GO data. They also provide helpful links to other data sources. For the moment, we are focusing on the human annotations.

2.1 Gene annotations

These analyses have focused on gene-level abundances/differences. Thus, when htseq-count was invoked against the hisat2-based mappings, parameters were chosen to count genes rather than transcripts. Similarly, when salmon counts were used via tximport, a mapping of genes to transcripts was used to collapse the matrix to gene-level abundances. This decision may be revisited.

hs_annot <- load_biomart_annotations(year="2020", month="jan")
## The biomart annotations file already exists, loading from it.
hs_annot <- hs_annot[["annotation"]]
hs_annot[["transcript"]] <- paste0(rownames(hs_annot), ".", hs_annot[["version"]])
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique=TRUE)
tx_gene_map <- hs_annot[, c("transcript", "ensembl_gene_id")]
summary(hs_annot)
##  ensembl_transcript_id ensembl_gene_id       version     transcript_version
##  Length:227784         Length:227784      Min.   : 1.0   Min.   : 1.00     
##  Class :character      Class :character   1st Qu.: 6.0   1st Qu.: 1.00     
##  Mode  :character      Mode  :character   Median :12.0   Median : 1.00     
##                                           Mean   :10.7   Mean   : 3.08     
##                                           3rd Qu.:15.0   3rd Qu.: 5.00     
##                                           Max.   :28.0   Max.   :17.00     
##                                                                            
##  hgnc_symbol        description        gene_biotype         cds_length    
##  Length:227784      Length:227784      Length:227784      Min.   :     3  
##  Class :character   Class :character   Class :character   1st Qu.:   357  
##  Mode  :character   Mode  :character   Mode  :character   Median :   694  
##                                                           Mean   :  1140  
##                                                           3rd Qu.:  1446  
##                                                           Max.   :107976  
##                                                           NA's   :127222  
##  chromosome_name       strand          start_position      end_position     
##  Length:227784      Length:227784      Min.   :5.77e+02   Min.   :6.47e+02  
##  Class :character   Class :character   1st Qu.:3.11e+07   1st Qu.:3.12e+07  
##  Mode  :character   Mode  :character   Median :6.04e+07   Median :6.06e+07  
##                                        Mean   :7.41e+07   Mean   :7.42e+07  
##                                        3rd Qu.:1.09e+08   3rd Qu.:1.09e+08  
##                                        Max.   :2.49e+08   Max.   :2.49e+08  
##                                                                             
##   transcript       
##  Length:227784     
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
## 

2.2 Gene ontology data

The set of GO categories has not been limited to the 2020 data at the time of this writing.

hs_go <- load_biomart_go()[["go"]]
## The biomart annotations file already exists, loading from it.
hs_length <- hs_annot[, c("ensembl_gene_id", "cds_length")]
colnames(hs_length) <- c("ID", "length")

3 The full dataset

Before we do any of the following subsets/analyses of the data, we need to collect it all in one place. Let’s do that here and name it ‘hs_valid’ meaning it is the set of valid data for Homo sapiens.

sanitize_columns <- c("visitnumber", "clinicaloutcome", "donor",
                      "typeofcells", "clinicalpresentation", "drug",
                      "condition", "batch")
hs_expt <- create_expt(samplesheet,
                       file_column="hg38100hisatfile",
                       savefile=glue::glue("rda/hs_expt_all-v{ver}.rda"),
                       gene_info=hs_annot) %>%
  exclude_genes_expt(column="gene_biotype", method="keep",
                     pattern="protein_coding", meta_column="ncrna_lost") %>%
  sanitize_expt_metadata(columns=sanitize_columns) %>%
  set_expt_factors(columns=sanitize_columns, class="factor") %>%
  set_expt_conditions(fact="clinicaloutcome") %>%
  set_expt_batches(fact="visitnumber")
## Reading the sample metadata.
## Dropped 69 rows from the sample metadata because the sample ID is blank.
## The sample definitions comprises: 254 rows(samples) and 84 columns(metadata fields).
## Warning in create_expt(samplesheet, file_column = "hg38100hisatfile", savefile =
## glue::glue("rda/hs_expt_all-v{ver}.rda"), : Some samples were removed when cross
## referencing the samples against the count data.
## Matched 21447 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## The final expressionset has 21481 features and 246 samples.
## remove_genes_expt(), before removal, there were 21481 genes, now there are 19923.
## There are 8 samples which kept less than 90 percent counts.
## TMRC30015 TMRC30017 TMRC30019 TMRC30044 TMRC30045 TMRC30154 TMRC30269 TMRC30241 
##     79.19     85.66     89.69     80.29     73.28     83.16     89.18     89.37
## The following should make visit 1 the largest if one uses that column as a size factor when plotting.
meta <- pData(hs_expt) %>%
  mutate(visitnumber = fct_relevel(visitnumber, c("notapplicable", "3", "2", "1")))
pData(hs_expt) <- meta

The above block does the following:

  1. Creates an expressionset using the ‘hg38100hisatfile’ column from the most recently downloaded sample sheet (the column’s name has any puctuation/spaces/capitals/etc removed) and the set of human annotations downloaded above.
  2. This expressionset is passed to a filter which pulls out only the protein_coding genes and uses the information from that process to add a new metadata column called ‘ncrna_lost’. Thus it keeps a tally of the number of reads lost in the filter and adds it to the sample sheet.
  3. It is passed again to a function which sanitizes the metadata (there were a couple of entries which said ‘cure’ instead of ‘Cure’ or vice versa) and similarly removes problematic characters.
  4. Passed to a function which sets some columns explicitly to factors instead of characters.
  5. Sets the experimental ‘condition’ to the factor of cure vs. fail.
  6. Sets the experimental ‘batch’ to visit number.
  7. Resets the levels of the visit number so that the samples which were ‘notapplicable’ are logically before visit 1 which is before 2 before 3.

3.1 Add the CRF patient metadata

Let us also merge in the clinician’s metadata. I worry a little that this might not be allowed for dbGap data, but if it is a problem I suspect we can just remove the bad columns from it. Also note that I rarely use the join function, but it is somewhat required here because I do not want to risk shuffling the metadata when I add the new metadata, which comes from a spreadsheet sorted by patient, not sample. In doing this I therefore just created a new column ‘join’ which contains the shared information, e.g. the patient ID from the existing metadata and the same ID from the CRF file which has been coerced into lowercase.

hs_pd <- pData(hs_expt)
start <- rownames(hs_pd)
hs_crf <- openxlsx::read.xlsx(crf_metadata)
hs_crf[["join"]] <- tolower(hs_crf[["codigo_paciente"]])
hs_pd[["join"]] <- hs_pd[["tubelabelorigin"]]
test <- plyr::join(hs_pd, hs_crf, by="join")
test[["join"]] <- NULL
rownames(test) <- rownames(hs_pd)
na_idx <- is.na(test)
test[na_idx] <- "undefined"
pData(hs_expt) <- test

The above block does the following:

  1. Extracts the metadata and makes a character vector of the rownames (e.g. the sample IDs).
  2. Creates a table of the clinical metadata from the file I downloaded.
  3. Creates a ‘join’ column from both the existing metadata and the clinical metadata which is the patient code, using whatever the column names were in each sheet.
  4. Joins the two tables using this information. The join function is explicitly used in this context to make sure that the row-order of the entries does not change.
  5. Gets rid of any entries in the new table which are NA.
  6. Replaces the metadata of the expressionset with this new, larger table.

4 Sanity check, clinical outcome vs. CRF data

In our shared online sample sheet there is a clinical outcome column which should match the final CRF column ‘ef_lc_estado_final_estudio’ with the caveat that the CRF data is numeric:

0: curacion definitiva 1: fall terapeutica 2: perdida druante el seguimiento 3: excludio durante el estudio

two_columns <- pData(hs_expt)[, c("clinicaloutcome", "ef_lc_estado_final_estudio")]
undef_idx <- two_columns[[2]] == "undefined"
two_columns <- two_columns[!undef_idx, ]
two_columns[["rewritten"]] <- "undef"
cure_idx <- two_columns[[2]] == 0
two_columns[cure_idx, "rewritten"] <- "cure"
fail_idx <- two_columns[[2]] == 1
two_columns[fail_idx, "rewritten"] <- "failure"
lost_idx <- two_columns[[2]] == 2
two_columns[lost_idx, "rewritten"] <- "lost"
same_idx <- two_columns[["clinicaloutcome"]] == two_columns[["rewritten"]]
broken <- two_columns[!same_idx, ]
broken
##           clinicaloutcome ef_lc_estado_final_estudio rewritten
## TMRC30148            cure                          1   failure
## TMRC30149            cure                          1   failure
## TMRC30138            cure                          1   failure
## TMRC30150            cure                          1   failure
## TMRC30140            cure                          1   failure
## TMRC30151            cure                          1   failure
## TMRC30176            cure                          1   failure
## TMRC30153            cure                          1   failure
## TMRC30269            cure                          1   failure

4.1 Collect sample numbers before filtering

dim(pData(hs_expt))
## [1] 246 144
table(pData(hs_expt)$drug)
## 
##    antimony miltefosine        none 
##         216           8          22
table(pData(hs_expt)$clinic)
## 
##      Cali    Tumaco undefined 
##        75       143        28
table(pData(hs_expt)$typeofcells)
## 
##      biopsy eosinophils macrophages   monocytes neutrophils       pbmcs 
##          21          45          28          74          72           6
table(pData(hs_expt)$visit)
## 
## notapplicable             3             2             1 
##            28            54            56           108
summary(as.numeric(pData(hs_expt)$eb_lc_tiempo_evolucion))
## Warning in summary(as.numeric(pData(hs_expt)$eb_lc_tiempo_evolucion)): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    2.00    4.00    6.00    7.37    8.00   21.00      60
summary(as.numeric(pData(hs_expt)$eb_lc_tto_mcto_glucan_dosis))
## Warning in summary(as.numeric(pData(hs_expt)$eb_lc_tto_mcto_glucan_dosis)): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    13.0    14.0    19.0    59.5    20.0   999.0      60
summary(as.numeric(pData(hs_expt)$v3_lc_ejey_lesion_mm_1))
## Warning in summary(as.numeric(pData(hs_expt)$v3_lc_ejey_lesion_mm_1)): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0     7.2    32.4   300.0   999.0   999.0      60
summary(as.numeric(pData(hs_expt)$v3_lc_lesion_area_1))
## Warning in summary(as.numeric(pData(hs_expt)$v3_lc_lesion_area_1)): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##       0     223     999    2133    3016   11487      60
summary(as.numeric(pData(hs_expt)$v3_lc_ejex_ulcera_mm_1))
## Warning in summary(as.numeric(pData(hs_expt)$v3_lc_ejex_ulcera_mm_1)): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0     0.0    12.5   292.8   999.0   999.0      60
table(pData(hs_expt)$eb_lc_sexo)
## 
##         1         2 undefined 
##       155        31        60
table(pData(hs_expt)$eb_lc_etnia)
## 
##         1         2         3 undefined 
##        99        53        34        60
summary(as.numeric(pData(hs_expt)$edad))
## Warning in summary(as.numeric(pData(hs_expt)$edad)): NAs introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    18.0    24.0    28.0    29.9    36.0    51.0      60
table(pData(hs_expt)$eb_lc_peso)
## 
##     100.8      53.9      55.9      57.9      58.1      58.3      58.6        59 
##         2         9         2         2         7        10        11        14 
##      59.6        62        63        67      69.4      74.7      75.6      76.5 
##         1         8         6         6        10         3         3         3 
##        77        78      79.2        82      83.3      83.4      86.4        87 
##        18        10        10         9         4        10         9         3 
##        89      93.3 undefined 
##         9         7        60
table(pData(hs_expt)$eb_lc_estatura)
## 
##       145       152       154       158       159       160       162       163 
##         6         1        10        17         2         6        10         9 
##       164       165       166       167       172       173       174       175 
##        15        12        19         3        10         4        30         2 
##       176       177       182       183 undefined 
##         1        10         9        10        60
table(pData(hs_expt)$clinic)
## 
##      Cali    Tumaco undefined 
##        75       143        28
table(pData(hs_expt)$ef_lc_estado_final_estudio)
## 
##         0         1         2 undefined 
##        75        69        16        86
table(pData(hs_expt)$clinicaloutcome)
## 
##          cure       failure          lost notapplicable 
##           132            62            16            36

4.2 Define desired colors for the various subsets

There are lots of ways which we will categorize the data, here are some potential color choices for them.

cf_colors <- list(
    "cure" = "#998EC3",
    "failure" = "#F1A340")
type_visit_colors <- list(
    "monocytes_v1" = "#DD1C77",
    "monocytes_v2" = "#C994C7",
    "monocytes_v3" = "#E7E1EF",
    "eosinophils_v1" = "#31A354",
    "eosinophils_v2" = "#ADDD8E",
    "eosinophils_v3" = "#F7FCD9",
    "neutrophils_v1" = "#3182BD",
    "neutrophils_v2" = "#9ECAE1",
    "neutrophils_v3" = "#DEEBF7",
    "biopsy_v1" = "#D95F0E")
type_colors <- list(
    "monocytes" = "#DD1C77",
    "eosinophils" = "#31A354",
    "neutrophils" = "#3182BD",
    "biopsy" = "#D95F0E")
visit_colors <- list()
cf_type_colors <- list(
    cure_biopsy = "#D95F0E",
    failure_biopsy = "#FEC44F",
    cure_monocytes = "#DD1C77",
    failure_monocytes = "#C994C7",
    cure_eosinophils = "#31A354",
    failure_eosinophils = "#ADDD8E",
    cure_neutrophils = "#3182BD",
    failure_neutrophils = "#9ECAE1")

Note from Maria Adelaida: Some chemokines are suggestive of Eosinophil recruitment.

4.3 Define the starting data

The following block contains the primary dataset which is the parent of everything which follows.

4.3.1 Set our initial coverage goal

There exists a baseline coverage below which we do not wish to fall. One likely way to approach it heuristically is to assume we should observe some number of genes. With that in mind, I arbitrarily chose 11,000 non-zero genes as the minimum.

With this in mind, here is a non-zero plot before a cutoff of 11,000 genes.

all_nz <- plot_nonzero(hs_expt)
all_nz$plot
## Warning: ggrepel: 229 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

To my eyes, there are 3 or 4 samples which are likely candidates for removal.

hs_valid <- subset_expt(hs_expt, nonzero=11000) %>%
  subset_expt(subset="clinicaloutcome!='lost'") %>%
  subset_expt(subset="clinicaloutcome!='notapplicable'") %>%
  subset_expt(subset="clinicaloutcome!='null'") %>%
  set_expt_colors(cf_colors)
## The samples (and read coverage) removed when filtering 11000 non-zero genes are:
## TMRC30010 TMRC30050 TMRC30052 
##     52429    807571   3086349
## subset_expt(): There were 246, now there are 243 samples.
## subset_expt(): There were 243, now there are 228 samples.
## subset_expt(): There were 228, now there are 192 samples.
## subset_expt(): There were 192, now there are 192 samples.

4.3.2 After removal

Here is the distribution of samples after dropping the less than 11,000 gene-samples.

nz_post <- plot_nonzero(hs_valid)
nz_post$plot
## Warning: ggrepel: 171 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

4.4 Count up sample types

I recently convinced myself that there is a difference between the data when it does and does not include the miltefosine treated patients.

However, when I actually counted up the samples by a few criteria I immediately relized this is spurious.

table(pData(hs_valid)$drug)
## 
##    antimony miltefosine 
##         184           8
table(pData(hs_valid)$clinic)
## 
##   Cali Tumaco 
##     61    131
table(pData(hs_valid)$clinicaloutcome)
## 
##    cure failure 
##     132      60
table(pData(hs_valid)$typeofcells)
## 
##      biopsy eosinophils   monocytes neutrophils 
##          19          42          66          65
table(pData(hs_valid)$visit)
## 
##  3  2  1 
## 51 50 91
summary(as.numeric(pData(hs_valid)$eb_lc_tiempo_evolucion))
## Warning in summary(as.numeric(pData(hs_valid)$eb_lc_tiempo_evolucion)): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    2.00    4.00    6.00    7.14    8.00   21.00      24
summary(as.numeric(pData(hs_valid)$eb_lc_tto_mcto_glucan_dosis))
## Warning in summary(as.numeric(pData(hs_valid)$eb_lc_tto_mcto_glucan_dosis)): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    13.0    15.0    19.0    64.3    20.0   999.0      24
summary(as.numeric(pData(hs_valid)$v3_lc_ejey_lesion_mm_1))
## Warning in summary(as.numeric(pData(hs_valid)$v3_lc_ejey_lesion_mm_1)): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0     7.2    32.7   328.6   999.0   999.0      24
summary(as.numeric(pData(hs_valid)$v3_lc_lesion_area_1))
## Warning in summary(as.numeric(pData(hs_valid)$v3_lc_lesion_area_1)): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##       0     222     999    1975    2448   11487      24
summary(as.numeric(pData(hs_valid)$v3_lc_ejex_ulcera_mm_1))
## Warning in summary(as.numeric(pData(hs_valid)$v3_lc_ejex_ulcera_mm_1)): NAs
## introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##     0.0     0.0    16.9   324.2   999.0   999.0      24
table(pData(hs_valid)$eb_lc_sexo)
## 
##         1         2 undefined 
##       143        25        24
table(pData(hs_valid)$eb_lc_etnia)
## 
##         1         2         3 undefined 
##        97        37        34        24
summary(as.numeric(pData(hs_valid)$edad))
## Warning in summary(as.numeric(pData(hs_valid)$edad)): NAs introduced by coercion
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    18.0    24.0    28.0    29.6    35.0    51.0      24
table(pData(hs_valid)$eb_lc_peso)
## 
##     100.8      53.9      55.9      57.9      58.1      58.3      58.6        59 
##         2         9         2         2         7        10         1         8 
##      59.6        62        63        67      69.4      74.7      75.6      76.5 
##         1         6         6         6        10         3         3         3 
##        77        78      79.2        82      83.3      83.4      86.4        87 
##        18        10        10         9         4        10         9         3 
##        89      93.3 undefined 
##         9         7        24
table(pData(hs_valid)$eb_lc_estatura)
## 
##       152       154       158       159       160       163       164       165 
##         1        10        15         2         6         9        15        12 
##       166       167       172       173       174       175       176       177 
##        19         3        10         4        30         2         1        10 
##       182       183 undefined 
##         9        10        24
table(pData(hs_valid)$clinic)
## 
##   Cali Tumaco 
##     61    131

The above block does what it says on the tin, subsets the data to exclude any sample with less than 11,000 observed genes.

4.5 Set up initial data subsets of interest

One of the first global metrics I would like to provide is the set of library sizes. Unfortunately, we have too many samples to fit on a screen now. Therefore, I am going to do an early split of the data by cell type in the hopes that doing so will make it possible to visualize the library sizes/nonzero genes.

The initial factor for this is ‘typeofcells’.

table(pData(hs_valid)[["typeofcells"]])
## 
##      biopsy eosinophils   monocytes neutrophils 
##          19          42          66          65
biopsy_samples <- subset_expt(hs_valid, subset="typeofcells=='biopsy'")
## subset_expt(): There were 192, now there are 19 samples.
eosinophil_samples <- subset_expt(hs_valid, subset="typeofcells=='eosinophils'")
## subset_expt(): There were 192, now there are 42 samples.
monocyte_samples <- subset_expt(hs_valid, subset="typeofcells=='monocytes'")
## subset_expt(): There were 192, now there are 66 samples.
neutrophil_samples <- subset_expt(hs_valid, subset="typeofcells=='neutrophils'")
## subset_expt(): There were 192, now there are 65 samples.
## Currently, these are not used, but instead I pulled the samples from the hs_clinical
## which means the biopsies are not included.
v1_samples <- subset_expt(hs_valid, subset="visitnumber=='1'")
## subset_expt(): There were 192, now there are 91 samples.
v1_monocytes <- subset_expt(v1_samples, subset="typeofcells=='monocytes'")
## subset_expt(): There were 91, now there are 29 samples.
v1_neutrophils <- subset_expt(v1_samples, subset="typeofcells=='neutrophils'")
## subset_expt(): There were 91, now there are 28 samples.
v1_eosinophils <- subset_expt(v1_samples, subset="typeofcells=='eosinophils'")
## subset_expt(): There were 91, now there are 15 samples.
v2_samples <- subset_expt(hs_valid, subset="visitnumber=='2'")
## subset_expt(): There were 192, now there are 50 samples.
v2_monocytes <- subset_expt(v2_samples, subset="typeofcells=='monocytes'")
## subset_expt(): There were 50, now there are 18 samples.
v2_neutrophils <- subset_expt(v2_samples, subset="typeofcells=='neutrophils'")
## subset_expt(): There were 50, now there are 18 samples.
v2_eosinophils <- subset_expt(v2_samples, subset="typeofcells=='eosinophils'")
## subset_expt(): There were 50, now there are 14 samples.
v3_samples <- subset_expt(hs_valid, subset="visitnumber=='3'")
## subset_expt(): There were 192, now there are 51 samples.
v3_monocytes <- subset_expt(v3_samples, subset="typeofcells=='monocytes'")
## subset_expt(): There were 51, now there are 19 samples.
v3_neutrophils <- subset_expt(v3_samples, subset="typeofcells=='neutrophils'")
## subset_expt(): There were 51, now there are 19 samples.
v3_eosinophils <- subset_expt(v3_samples, subset="typeofcells=='eosinophils'")
## subset_expt(): There were 51, now there are 13 samples.

The above block does a lot of subset operations to create separate data structures on a per-celltype and per-visit basis. Ergo, our large data structure is now joined by ~21 new, smaller data structures.

5 Parasite reads

Let us see if we can make an expressionset of the parasite reads in the TMRC3 samples and distinguish between the faux and real reads. E.g: Are there samples which definitively contain parasites?

lp_expt <- create_expt(samplesheet,
                       file_column="lpanamensisv36hisatfile", gene_info = NULL) %>%
  subset_expt(coverage=1000) %>%
  set_expt_conditions(fact="typeofcells")
## Reading the sample metadata.
## Dropped 69 rows from the sample metadata because the sample ID is blank.
## The sample definitions comprises: 254 rows(samples) and 84 columns(metadata fields).
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30050/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30052/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30071/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30056/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30058/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30105/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30094/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30080/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30103/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30107/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30083/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30082/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30093/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30113/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30096/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30118/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30119/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30165/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30166/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30180/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30046/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30047/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30048/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30194/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30195/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30196/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30049/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30053/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30054/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30115/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30121/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30122/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30169/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30170/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30164/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30055/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30068/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30070/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30191/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30192/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30171/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30158/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30159/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30188/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30189/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30190/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30139/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30160/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30161/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30059/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30060/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30061/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30062/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30063/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30051/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30064/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30065/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30162/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30066/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30067/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30117/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30057/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30069/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30132/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30167/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30168/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30152/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30123/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30116/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30074/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30177/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30072/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30076/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30077/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30157/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30181/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30182/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30183/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30133/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30136/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30078/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30088/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30079/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30184/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30134/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30135/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30155/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30129/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30137/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30174/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30175/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30154/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30172/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30173/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30142/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30143/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30144/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30145/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30146/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30147/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30185/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30186/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30156/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30148/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30149/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30138/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30150/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30140/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30151/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30176/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30153/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30178/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30179/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30197/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30198/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30199/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30200/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30201/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30202/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30203/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30204/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30205/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30206/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30207/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30208/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30217/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30218/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30219/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30220/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30209/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30210/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30211/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30212/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30213/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30214/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30215/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30216/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30221/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30222/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30223/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30224/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30225/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30226/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30227/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30228/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30229/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30230/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30231/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30232/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30233/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30234/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30235/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30237/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30238/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30266/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30268/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30286/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30249/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30252/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30250/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30251/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30245/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30246/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30247/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30248/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30244/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30260/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30261/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30262/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30263/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30264/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30265/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30269/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30253/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30270/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30241/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30242/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30273/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30275/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30271/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30274/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30276/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30272/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30255/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30256/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30254/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30258/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30257/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30239/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30240/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30283/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30284/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30281/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30277/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30279/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30280/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30278/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30282/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in first_rownames != current_rownames: longer object length is not a
## multiple of shorter object length
## Warning in read_counts_expt(sample_ids, filenames, countdir = countdir, :
## The file: /mnt/cbcb/fs01_abelew/cbcb-lab/nelsayed/scratch/atb/rnaseq/
## lpanamensis_tmrc_2019/preprocessing/TMRC30285/outputs/03hisat2_lpanamensis_v36/
## sno_gene_gene_id.count.xz has mismatched rownames.
## Warning in create_expt(samplesheet, file_column = "lpanamensisv36hisatfile", :
## Some samples were removed when cross referencing the samples against the count
## data.
## Matched 8778 annotations and counts.
## Bringing together the count matrix and gene information.
## Warning in create_expt(samplesheet, file_column =
## "lpanamensisv36hisatfile", : The following samples have no counts!
## TMRC30010TMRC30144TMRC30145TMRC30146TMRC30185TMRC30207TMRC30217TMRC30219TMRC30220TMRC30209TMRC30210TMRC30211TMRC30212TMRC30213TMRC30214TMRC30216TMRC30221TMRC30222TMRC30223TMRC30225TMRC30226TMRC30227TMRC30228TMRC30229TMRC30230TMRC30231TMRC30233TMRC30234TMRC30235TMRC30274TMRC30272TMRC30279TMRC30278TMRC30285
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 8778 features and 244 samples.
## The samples removed (and read coverage) when filtering samples with less than 1000 reads are:
## TMRC30001 TMRC30002 TMRC30003 TMRC30004 TMRC30005 TMRC30006 TMRC30007 TMRC30008 
##        12         8         9        16        25        29         3        16 
## TMRC30009 TMRC30010 TMRC30011 TMRC30012 TMRC30013 TMRC30050 TMRC30018 TMRC30118 
##        16         0         5         9        13       345       110       747 
## TMRC30119 TMRC30014 TMRC30021 TMRC30038 TMRC30023 TMRC30025 TMRC30165 TMRC30166 
##       419         4        88       208       120       954       433       496 
## TMRC30030 TMRC30031 TMRC30032 TMRC30024 TMRC30040 TMRC30033 TMRC30194 TMRC30195 
##         3         8        22        49       896        36       198       458 
## TMRC30196 TMRC30164 TMRC30037 TMRC30027 TMRC30028 TMRC30034 TMRC30035 TMRC30036 
##       687       424         9       108        93        21       153        11 
## TMRC30192 TMRC30041 TMRC30042 TMRC30043 TMRC30045 TMRC30171 TMRC30158 TMRC30159 
##       384       264       545       571       334       370       284       405 
## TMRC30189 TMRC30190 TMRC30139 TMRC30160 TMRC30161 TMRC30152 TMRC30123 TMRC30181 
##       307       537       140       296       300       495       304       613 
## TMRC30182 TMRC30155 TMRC30129 TMRC30137 TMRC30174 TMRC30154 TMRC30172 TMRC30173 
##       468       508       353       389       644       398       383       898 
## TMRC30142 TMRC30143 TMRC30144 TMRC30145 TMRC30146 TMRC30147 TMRC30185 TMRC30186 
##         4         1         0         0         0         1         0       852 
## TMRC30148 TMRC30138 TMRC30150 TMRC30140 TMRC30151 TMRC30178 TMRC30179 TMRC30197 
##       706       156       470       153       480       420       515       202 
## TMRC30198 TMRC30200 TMRC30201 TMRC30202 TMRC30203 TMRC30205 TMRC30206 TMRC30207 
##       158        96       149       145       104       169       125         0 
## TMRC30208 TMRC30217 TMRC30218 TMRC30219 TMRC30220 TMRC30209 TMRC30210 TMRC30211 
##         1         0         2         0         0         0         0         0 
## TMRC30212 TMRC30213 TMRC30214 TMRC30215 TMRC30216 TMRC30221 TMRC30222 TMRC30223 
##         0         0         0         1         0         0         0         0 
## TMRC30224 TMRC30225 TMRC30226 TMRC30227 TMRC30228 TMRC30229 TMRC30230 TMRC30231 
##         2         0         0         0         0         0         0         0 
## TMRC30232 TMRC30233 TMRC30234 TMRC30235 TMRC30238 TMRC30266 TMRC30260 TMRC30261 
##         1         0         0         0       335       822       291       500 
## TMRC30262 TMRC30263 TMRC30264 TMRC30265 TMRC30269 TMRC30270 TMRC30273 TMRC30275 
##       905       431       309       596        58        21         2         2 
## TMRC30271 TMRC30274 TMRC30276 TMRC30272 TMRC30254 TMRC30257 TMRC30239 TMRC30240 
##         4         0         1         0       208       427       209       314 
## TMRC30283 TMRC30284 TMRC30281 TMRC30277 TMRC30279 TMRC30280 TMRC30278 TMRC30282 
##        18         4       548         6         0         3         0         1 
## TMRC30285 
##         0
## subset_expt(): There were 244, now there are 99 samples.
visit_fact <- pData(lp_expt)[["visitnumber"]]
batch_na <- is.na(visit_fact)
visit_fact[batch_na] <- "undefined"
lp_expt <- set_expt_batches(lp_expt, fact = visit_fact)

lp_norm <- normalize_expt(lp_expt, filter="simple", norm="quant",
                          convert="cpm", transform="log2")
## Removing 66 low-count genes (8712 remaining).
## transform_counts: Found 404 values equal to 0, adding 1 to the matrix.
plotted <- plot_pca(lp_norm, plot_labels=FALSE)
plotted$plot

plotted_3d <- plot_3d_pca(plotted)

The above block is similar in concept to the previous expressionset creation. It uses a different column and currently ignores the gene annotations. Given that many of the samples have essentially 0 reads, I set a cutoff of only 20 observed genes. Finally, I did a quick and dirty PCA plot of this peculiar data structure in the hopes of being able to ‘see’ the difference between what are assumed to be ‘real’ samples with a significant number of ‘real’ parasite reads vs. those samples which just have a couple of potentially spurious reads.

6 Distributions/Visualizations of interest

The sets of samples used to visualize the data will also comprise the sets used when later performing the various differential expression analyses.

6.1 Global metrics

Start out with some initial metrics of all samples. The most obvious are plots of the numbers of non-zero genes observed, heatmaps showing the relative relationships among the samples, the relative library sizes, and some PCA. It might be smart to split the library sizes up across subsets of the data, because they have expanded too far to see well on a computer screen.

The most likely factors to query when considering the entire dataset are cure/fail, visit, and cell type. This is the level at which we will choose samples to exclude from future analyses.

plot_legend(biopsy_samples)$plot

plot_libsize(biopsy_samples)$plot

plot_nonzero(biopsy_samples)$plot

biopsy_prepost <- plot_libsize_prepost(biopsy_samples)
biopsy_prepost$count_plot

biopsy_prepost$lowgene_plot
## Warning: Using alpha for a discrete variable is not advised.

## Minimum number of biopsy genes: ~ 14,000

plot_libsize(eosinophil_samples)$plot

plot_nonzero(eosinophil_samples)$plot
## Warning: ggrepel: 23 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

eosinophil_prepost <- plot_libsize_prepost(eosinophil_samples)
eosinophil_prepost$count_plot

eosinophil_prepost$lowgene_plot
## Warning: Using alpha for a discrete variable is not advised.

## Minimum number of eosinophil genes: ~ 13,500

plot_libsize(monocyte_samples)$plot

plot_nonzero(monocyte_samples)$plot
## Warning: ggrepel: 51 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

monocyte_prepost <- plot_libsize_prepost(monocyte_samples)
monocyte_prepost$count_plot

monocyte_prepost$lowgene_plot
## Warning: Using alpha for a discrete variable is not advised.

## Minimum number of monocyte genes: ~ 7,500 before setting the minimum.

plot_libsize(neutrophil_samples)$plot

plot_nonzero(neutrophil_samples)$plot
## Warning: ggrepel: 48 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

neutrophil_prepost <- plot_libsize_prepost(neutrophil_samples)
neutrophil_prepost$count_plot

neutrophil_prepost$lowgene_plot
## Warning: Using alpha for a discrete variable is not advised.

## Minimum number of neutrophil genes: ~ 10,000 before setting minimum coverage.

The above block just repeats the same two plots on a per-celltype basis: the number of reads observed / sample and a plot of observed genes with respect to coverage. I made some comments with my observations about the number of genes.

6.2 Global PCA

Now that those ‘global’ metrics are out of the way, lets look at some global metrics of the data following normalization; the most likely plots are of course PCA but also a couple of heatmaps.

6.2.1 Figure 1

In the google doc TMRC3_Aug18_2021, there is an example of an image for the first figure:

“Transcriptomic profiles of primary innate cells of CL patients show unique transcriptional signatures - Remove PBMCs and M0, maybe biopsies as well (but Remove WT samples)”

While we were talking in a meeting however, it sounded like there was some desire to keep all cell types. Therefore the following block will have one image with everything and one following the above.

type_valid <- set_expt_conditions(hs_valid, fact="typeofcells") %>%
  set_expt_batches(fact="clinicaloutcome") %>%
  set_expt_colors(type_colors)

all_norm <- sm(normalize_expt(type_valid, transform="log2", norm="quant",
                              convert="cpm", filter=TRUE))

all_pca <- plot_pca(all_norm, plot_labels=FALSE,
                    plot_title="PCA - Cell type", size_column="visitnumber")
dev <- pp(file=glue("images/tmrc3_pca_nolabels-v{ver}.png"))
all_pca$plot
closed <- dev.off()
all_pca$plot

all_pca_nosize <- plot_pca(all_norm, plot_labels=FALSE)
all_pca_nosize$plot

write.csv(all_pca$table, file="coords/hs_donor_pca_coords.csv")
all_cf_norm <- set_expt_batches(all_norm,
                                fact="visitnumber")
all_cf_corheat <- plot_corheat(all_cf_norm, plot_title="Heirarchical clustering:
         cell types")

dev <- pp(file=glue("images/tmrc3_corheat_cf-v{ver}.png"))
all_cf_corheat$plot
closed <- dev.off()
all_cf_corheat$plot

all_cf_disheat <- plot_disheat(all_cf_norm, plot_title="Heirarchical clustering:
         cell types")
dev <- pp(file=glue("images/tmrc3_disheat_cf-v{ver}.png"))
all_cf_disheat$plot
closed <- dev.off()
all_cf_disheat$plot

6.3 Figure 1B: Transcriptomic profiles of primary innate

The biggest caveat for this is to ensure that there are no Wellcome Trust samples.

A potential figure legend for the following images might include:

The observed counts per gene for all of the clinical samples were filtered, log transformed, cpm converted, and quantile normalized. The colors were defined by cell types and shapes by patient visit. When the first two principle components were plotted, clustering was observed by cell type. The biopsy samples were significantly different from the innate immune cell types.

fig1v2_norm <- normalize_expt(type_valid, transform="log2",
                              convert="cpm", norm="quant", filter=TRUE)
## Removing 5601 low-count genes (14322 remaining).
## transform_counts: Found 502 values equal to 0, adding 1 to the matrix.
fig1v2_pca <- plot_pca(fig1v2_norm, cis=FALSE)
## plot labels was not set and there are more than 100 samples, disabling it.
dev <- pp(file=glue("images/tmrc3_fig1v2.png"))
fig1v2_pca$plot
closed <- dev.off()
fig1v2_pca$plot

fig1v3_samples <- subset_expt(type_valid, subset="condition!='biopsy'")
## subset_expt(): There were 192, now there are 173 samples.
fig1v3_norm <- normalize_expt(fig1v3_samples, transform="log2",
                              convert="cpm", norm="quant", filter=TRUE)
## Removing 7749 low-count genes (12174 remaining).
## transform_counts: Found 124 values equal to 0, adding 1 to the matrix.
fig1v3_pca <- plot_pca(fig1v3_norm, cis=FALSE)
## plot labels was not set and there are more than 100 samples, disabling it.
dev <- pp(file="images/tmrc3_fig1v3.png")
fig1v3_pca$plot
closed <- dev.off()
fig1v3_pca$plot

Continue looking, but switch the conditions/colors so that the clinical outcome becomes the focus and get rid of a few samples which are not actually a part of the TMRC3 focus (e.g. the PBMC and macrophage samples, which are all from the Wellcome Trust).

6.3.1 Clinically relevant samples

Included in this group will be the samples from patients who were lost.

6.3.1.1 Remove the lost samples

In our 20220218 meeting, it was decided that we would focus explicitly on the cure and fail samples, ignoring lost/NA/null samples.

Thus I am adding explicit filters right at the top to exclude them.

6.3.1.2 Samples by clinic

hs_clinical <- hs_valid %>%
  set_expt_conditions(fact="clinicaloutcome") %>%
  set_expt_batches(fact="typeofcells") %>%
  set_expt_colors(cf_colors)

hs_clinical_nobiop <- subset_expt(hs_clinical, subset="typeofcells!='biopsy'")
## subset_expt(): There were 192, now there are 173 samples.

6.3.1.3 View biopsies

clinic_biopsy <- hs_valid %>%
  set_expt_conditions(fact="clinic") %>%
  set_expt_batches(fact="clinicaloutcome") %>%
  subset_expt(subset="typeofcells=='biopsy'")
## subset_expt(): There were 192, now there are 19 samples.
clinic_cf <- paste0(pData(clinic_biopsy)$condition, "_",
                    pData(clinic_biopsy)$batch)
table(clinic_cf)
## clinic_cf
##      Cali_cure    Tumaco_cure Tumaco_failure 
##              4             10              5
clinic_biopsy <- set_expt_conditions(clinic_biopsy, fact=clinic_cf) %>%
  set_expt_batches(fact="visitnumber")

clinic_biopsy_norm <- normalize_expt(clinic_biopsy, transform="log2",
                                     convert="cpm", norm="quant", filter=TRUE)
## Removing 6278 low-count genes (13645 remaining).
## transform_counts: Found 212 values equal to 0, adding 1 to the matrix.
clinic_biopsy_pca <- plot_pca(clinic_biopsy_norm, plot_labels=FALSE)
dev <- pp(file="images/biopsy_place.png")
clinic_biopsy_pca$plot
closed <- dev.off()
clinic_biopsy_pca$plot

clinic_biopsy_nb <- normalize_expt(clinic_biopsy, transform="log2",
                                   convert="cpm", batch="svaseq", filter=TRUE)
## Removing 6278 low-count genes (13645 remaining).
## Setting 320 low elements to zero.
## transform_counts: Found 320 values equal to 0, adding 1 to the matrix.
clinic_biopsy_nb_pca <- plot_pca(clinic_biopsy_nb, plot_labels=FALSE)
dev <- pp(file="images/biopsy_place_nb.png")
clinic_biopsy_nb_pca$plot
closed <- dev.off()
clinic_biopsy_nb_pca$plot

6.3.1.4 Clinic Eosinophils

clinic_eosinophil <- hs_clinical %>%
  set_expt_conditions(fact="clinic") %>%
  set_expt_batches(fact="clinicaloutcome") %>%
  subset_expt(subset="typeofcells=='eosinophils'")
## subset_expt(): There were 192, now there are 42 samples.
clinic_cf <- paste0(pData(clinic_eosinophil)$condition, "_",
                    pData(clinic_eosinophil)$batch)
table(clinic_cf)
## clinic_cf
##      Cali_cure    Tumaco_cure Tumaco_failure 
##             15             18              9
clinic_eosinophil <- set_expt_conditions(clinic_eosinophil, fact=clinic_cf) %>%
    set_expt_batches(fact="visitnumber")

clinic_eosinophil_norm <- normalize_expt(clinic_eosinophil, transform="log2",
                                         convert="cpm", norm="quant", filter=TRUE)
## Removing 9049 low-count genes (10874 remaining).
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
clinic_eosinophil_pca <- plot_pca(clinic_eosinophil_norm, plot_labels=FALSE)
dev <- pp(file="images/eosinophil_place.png")
clinic_eosinophil_pca$plot
closed <- dev.off()
clinic_eosinophil_pca$plot

clinic_eosinophil_nb <- normalize_expt(clinic_eosinophil, transform="log2",
                                       convert="cpm", batch="svaseq", filter=TRUE)
## Removing 9049 low-count genes (10874 remaining).
## Setting 1033 low elements to zero.
## transform_counts: Found 1033 values equal to 0, adding 1 to the matrix.
clinic_eosinophil_nb_pca <- plot_pca(clinic_eosinophil_nb, plot_labels=FALSE)
dev <- pp(file="images/eosinophil_place_nb.png")
clinic_eosinophil_nb_pca$plot
closed <- dev.off()
clinic_eosinophil_nb_pca$plot

6.3.1.5 Clinic Monocyte

clinic_monocyte <- hs_clinical %>%
  set_expt_conditions(fact="clinic") %>%
  set_expt_batches(fact="clinicaloutcome") %>%
  subset_expt(subset="typeofcells=='monocytes'")
## subset_expt(): There were 192, now there are 66 samples.
clinic_cf <- paste0(pData(clinic_monocyte)$condition, "_",
                    pData(clinic_monocyte)$batch)
table(clinic_cf)
## clinic_cf
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             25             20
clinic_monocyte <- set_expt_conditions(clinic_monocyte, fact=clinic_cf) %>%
    set_expt_batches(fact="visitnumber")

clinic_monocyte_norm <- normalize_expt(clinic_monocyte, transform="log2",
                                       convert="cpm", norm="quant", filter=TRUE)
## Removing 8797 low-count genes (11126 remaining).
## transform_counts: Found 12 values equal to 0, adding 1 to the matrix.
clinic_monocyte_pca <- plot_pca(clinic_monocyte_norm, plot_labels=FALSE)
dev <- pp(file="images/monocytes_place.png")
clinic_monocyte_pca$plot
closed <- dev.off()
clinic_monocyte_pca$plot

clinic_monocyte_nb <- normalize_expt(clinic_monocyte, transform="log2",
                                     convert="cpm", batch="svaseq", filter=TRUE)
## Removing 8797 low-count genes (11126 remaining).
## Setting 1626 low elements to zero.
## transform_counts: Found 1626 values equal to 0, adding 1 to the matrix.
clinic_monocyte_nb_pca <- plot_pca(clinic_monocyte_nb, plot_labels=FALSE)
dev <- pp(file="images/monocytes_place_nb.png")
clinic_monocyte_nb_pca$plot
closed <- dev.off()
clinic_monocyte_nb_pca$plot

6.4 Clinic Neutrophils

clinic_neutrophil <- hs_clinical %>%
  set_expt_conditions(fact="clinic") %>%
  set_expt_batches(fact="clinicaloutcome") %>%
  subset_expt(subset="typeofcells=='neutrophils'")
## subset_expt(): There were 192, now there are 65 samples.
clinic_cf <- paste0(pData(clinic_neutrophil)$condition, "_",
                    pData(clinic_neutrophil)$batch)
table(clinic_cf)
## clinic_cf
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             24             20
clinic_neutrophil <- set_expt_conditions(clinic_neutrophil, fact=clinic_cf) %>%
    set_expt_batches(fact="visitnumber")

clinic_neutrophil_norm <- normalize_expt(clinic_neutrophil, transform="log2",
                                         convert="cpm", norm="quant", filter=TRUE)
## Removing 10634 low-count genes (9289 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
clinic_neutrophil_pca <- plot_pca(clinic_neutrophil_norm, plot_labels=FALSE)
dev <- pp(file="images/neutrophil_place.png")
clinic_neutrophil_pca$plot
closed <- dev.off()
clinic_neutrophil_pca$plot

clinic_neutrophil_nb <- normalize_expt(clinic_neutrophil, transform="log2",
                                       convert="cpm", batch="svaseq", filter=TRUE)
## Removing 10634 low-count genes (9289 remaining).
## Setting 1462 low elements to zero.
## transform_counts: Found 1462 values equal to 0, adding 1 to the matrix.
clinic_neutrophil_nb_pca <- plot_pca(clinic_neutrophil_nb, plot_labels=FALSE)
dev <- pp(file="images/neutrophil_place_nb.png")
clinic_neutrophil_nb_pca$plot
closed <- dev.off()
clinic_neutrophil_nb_pca$plot

6.4.1 Only Tumaco samples

A majority of samples came from tumaco, let us see what happens if we limit the data to them.

Let us therefore consider a couple of different view of this portion of the data.

tumaco_clinical <- hs_clinical %>%
  subset_expt(subset="clinic=='Tumaco'")
## subset_expt(): There were 192, now there are 131 samples.
tumaco_monocyte <- tumaco_clinical %>%
  subset_expt(subset="typeofcells=='monocytes'") %>%
  set_expt_conditions(fact="clinicaloutcome") %>%
  set_expt_batches(fact="visitnumber") %>%
  set_expt_samplenames("tubelabelorigin")
## subset_expt(): There were 131, now there are 45 samples.
tumaco_monocyte_norm <- normalize_expt(tumaco_monocyte, transform="log2", convert="cpm",
                                       norm="quant", filter=TRUE)
## Removing 9025 low-count genes (10898 remaining).
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
tumaco_monocyte_pca <- plot_pca(tumaco_monocyte_norm, plot_labels=FALSE)
dev <- pp(file="images/monocytes_oneplace_norm.png")
tumaco_monocyte_pca$plot
closed <- dev.off()
tumaco_monocyte_pca$plot

tumaco_monocyte_nb <- normalize_expt(tumaco_monocyte, transform="log2", convert="cpm",
                                     batch="svaseq", filter=TRUE)
## Removing 9025 low-count genes (10898 remaining).
## Setting 799 low elements to zero.
## transform_counts: Found 799 values equal to 0, adding 1 to the matrix.
tumaco_monocyte_nb_pca <- plot_pca(tumaco_monocyte_nb, plot_labels=FALSE)
dev <- pp(file="images/monocytes_oneplace_norm_sva.png")
tumaco_monocyte_nb_pca$plot
closed <- dev.off()
tumaco_monocyte_nb_pca$plot

6.5 Compare clinics

Let us move a direct comparison of the two clinics right to the top.

hs_clinic <- hs_valid %>%
  set_expt_conditions(fact="clinic") %>%
  set_expt_batches(fact="typeofcells")

hs_clinic_norm <- normalize_expt(hs_clinic, transform="log2", convert="cpm",
                                 norm="quant", filter=TRUE)
## Removing 5601 low-count genes (14322 remaining).
## transform_counts: Found 502 values equal to 0, adding 1 to the matrix.
hs_clinic_pca <- plot_pca(hs_clinic_norm)
## plot labels was not set and there are more than 100 samples, disabling it.
hs_clinic_pca$plot

hs_clinic_nb <- normalize_expt(hs_clinic, transform="log2", convert="cpm",
                               batch="svaseq", filter=TRUE)
## Removing 5601 low-count genes (14322 remaining).
## Setting 33229 low elements to zero.
## transform_counts: Found 33229 values equal to 0, adding 1 to the matrix.
hs_clinic_nb_pca <- plot_pca(hs_clinic_nb)
## plot labels was not set and there are more than 100 samples, disabling it.
hs_clinic_nb_pca$plot

6.5.1 Compare clinics, all samples

clinic_contrasts <- list(
    "clinics" = c("Cali", "Tumaco"))
hs_clinic_de <- all_pairwise(hs_clinic, model_batch="svaseq", filter=TRUE)
## Removing 0 low-count genes (14322 remaining).
## Setting 33229 low elements to zero.
## transform_counts: Found 33229 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
hs_clinic_table <- combine_de_tables(
    hs_clinic_de, keepers=clinic_contrasts,
    excel=glue::glue("excel/hs_clinic_table-v{ver}.xlsx"))
hs_clinic_sig <- extract_significant_genes(
    hs_clinic_table,
    excel=glue::glue("excel/hs_clinic_sig-v{ver}.xlsx"))

6.5.2 Clinic biopsy comparison

clinic_biopsy_de <- all_pairwise(clinic_biopsy, model_batch="svaseq", filter=TRUE)
## Removing 0 low-count genes (13645 remaining).
## Setting 320 low elements to zero.
## transform_counts: Found 320 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

clinic_biopsy_table <- combine_de_tables(
    clinic_biopsy_de,
    excel=glue::glue("excel/clinic_biopsy_table-v{ver}.xlsx"))
## Deleting the file excel/clinic_biopsy_table-v202205.xlsx before writing the tables.
clinic_biopsy_sig <- extract_significant_genes(
    clinic_biopsy_table,
    excel=glue::glue("excel/clinic_biopsy_sig-v{ver}.xlsx"))
## Deleting the file excel/clinic_biopsy_sig-v202205.xlsx before writing the tables.

6.5.3 Clinic eosinophil comparison

clinic_eosinophil_de <- all_pairwise(clinic_eosinophil, model_batch=FALSE, filter=TRUE)
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

clinic_eosinophil_table <- combine_de_tables(
    clinic_eosinophil_de,
    excel=glue::glue("excel/clinic_eosinophil_table-v{ver}.xlsx"))
## Deleting the file excel/clinic_eosinophil_table-v202205.xlsx before writing the tables.
clinic_eosinophil_sig <- extract_significant_genes(
    clinic_eosinophil_table,
    excel=glue::glue("excel/clinic_eosinophil_sig-v{ver}.xlsx"))
## Deleting the file excel/clinic_eosinophil_sig-v202205.xlsx before writing the tables.

6.5.4 Clinic monocyte comparison

clinic_monocyte_de <- all_pairwise(clinic_monocyte, model_batch=FALSE, filter=TRUE)
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

clinic_monocyte_table <- combine_de_tables(
    clinic_monocyte_de,
    excel=glue::glue("excel/clinic_monocyte_table-v{ver}.xlsx"))
## Deleting the file excel/clinic_monocyte_table-v202205.xlsx before writing the tables.
clinic_monocyte_sig <- extract_significant_genes(
    clinic_monocyte_table,
    excel=glue::glue("excel/clinic_monocyte_sig-v{ver}.xlsx"))
## Deleting the file excel/clinic_monocyte_sig-v202205.xlsx before writing the tables.

6.5.5 Clinic neutrophil comparison

clinic_neutrophil_de <- all_pairwise(clinic_neutrophil, model_batch=FALSE, filter=TRUE)
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

clinic_neutrophil_table <- combine_de_tables(
    clinic_neutrophil_de,
    excel=glue::glue("excel/clinic_neutrophil_table-v{ver}.xlsx"))
## Deleting the file excel/clinic_neutrophil_table-v202205.xlsx before writing the tables.
clinic_neutrophil_sig <- extract_significant_genes(
    clinic_neutrophil_table,
    excel=glue::glue("excel/clinic_neutrophil_sig-v{ver}.xlsx"))
## Deleting the file excel/clinic_neutrophil_sig-v202205.xlsx before writing the tables.

6.5.6 Compare clinic genes

clinic_sigenes_up <- rownames(hs_clinic_sig[["deseq"]][["ups"]][[1]])
clinic_sigenes_down <- rownames(hs_clinic_sig[["deseq"]][["downs"]][[1]])
clinic_sigenes <- c(clinic_sigenes_up, clinic_sigenes_down)

contrast <- "Tumacocure_vs_Calicure"
clinic_biopsy_sigenes <- c(rownames(clinic_biopsy_sig[["deseq"]][["ups"]][[contrast]]),
                           rownames(clinic_biopsy_sig[["deseq"]][["downs"]][[contrast]]))
clinic_eosinophil_sigenes_up <- rownames(clinic_eosinophil_sig[["deseq"]][["ups"]][[contrast]])
clinic_eosinophil_sigenes_down <- rownames(clinic_eosinophil_sig[["deseq"]][["downs"]][[contrast]])
clinic_monocyte_sigenes_up <- rownames(clinic_monocyte_sig[["deseq"]][["ups"]][[contrast]])
clinic_monocyte_sigenes_down <- rownames(clinic_monocyte_sig[["deseq"]][["downs"]][[contrast]])
clinic_neutrophil_sigenes_up <- rownames(clinic_neutrophil_sig[["deseq"]][["ups"]][[contrast]])
clinic_neutrophil_sigenes_down <- rownames(clinic_neutrophil_sig[["deseq"]][["downs"]][[contrast]])

clinic_eosinophil_sigenes <- c(clinic_eosinophil_sigenes_up,
                               clinic_eosinophil_sigenes_down)
clinic_monocyte_sigenes <- c(clinic_monocyte_sigenes_up,
                             clinic_monocyte_sigenes_down)
clinic_neutrophil_sigenes <- c(clinic_neutrophil_sigenes_up,
                               clinic_neutrophil_sigenes_down)

6.5.7 Place gprofiler

clinic_gp <- simple_gprofiler(clinic_sigenes)
## Performing gProfiler GO search of 964 genes against hsapiens.
## GO search found 167 hits.
## Performing gProfiler KEGG search of 964 genes against hsapiens.
## KEGG search found 12 hits.
## Performing gProfiler REAC search of 964 genes against hsapiens.
## REAC search found 13 hits.
## Performing gProfiler MI search of 964 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 964 genes against hsapiens.
## TF search found 17 hits.
## Performing gProfiler CORUM search of 964 genes against hsapiens.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 964 genes against hsapiens.
## HP search found 17 hits.
clinic_gp$pvalue_plots$kegg_plot_over

clinic_gp$pvalue_plots$reactome_plot_over

clinic_gp <- simple_gprofiler(clinic_sigenes)
## Performing gProfiler GO search of 964 genes against hsapiens.
## GO search found 167 hits.
## Performing gProfiler KEGG search of 964 genes against hsapiens.
## KEGG search found 12 hits.
## Performing gProfiler REAC search of 964 genes against hsapiens.
## REAC search found 13 hits.
## Performing gProfiler MI search of 964 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 964 genes against hsapiens.
## TF search found 17 hits.
## Performing gProfiler CORUM search of 964 genes against hsapiens.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 964 genes against hsapiens.
## HP search found 17 hits.
clinic_gp$pvalue_plots$kegg_plot_over

clinic_gp$pvalue_plots$reactome_plot_over

clinic_gp <- simple_gprofiler(clinic_sigenes)
## Performing gProfiler GO search of 964 genes against hsapiens.
## GO search found 167 hits.
## Performing gProfiler KEGG search of 964 genes against hsapiens.
## KEGG search found 12 hits.
## Performing gProfiler REAC search of 964 genes against hsapiens.
## REAC search found 13 hits.
## Performing gProfiler MI search of 964 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 964 genes against hsapiens.
## TF search found 17 hits.
## Performing gProfiler CORUM search of 964 genes against hsapiens.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 964 genes against hsapiens.
## HP search found 17 hits.
clinic_gp$pvalue_plots$kegg_plot_over

clinic_gp$pvalue_plots$reactome_plot_over

clinic_eosinophil_gp <- simple_gprofiler(clinic_eosinophil_sigenes)
## Performing gProfiler GO search of 1397 genes against hsapiens.
## GO search found 329 hits.
## Performing gProfiler KEGG search of 1397 genes against hsapiens.
## KEGG search found 32 hits.
## Performing gProfiler REAC search of 1397 genes against hsapiens.
## REAC search found 17 hits.
## Performing gProfiler MI search of 1397 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 1397 genes against hsapiens.
## TF search found 371 hits.
## Performing gProfiler CORUM search of 1397 genes against hsapiens.
## CORUM search found 10 hits.
## Performing gProfiler HP search of 1397 genes against hsapiens.
## HP search found 2 hits.
clinic_eosinophil_gp$pvalue_plots$kegg_plot_over

clinic_eosinophil_gp$pvalue_plots$reactome_plot_over

clinic_eosinophil_up_gp <- simple_gprofiler(clinic_eosinophil_sigenes_up)
## Performing gProfiler GO search of 705 genes against hsapiens.
## GO search found 234 hits.
## Performing gProfiler KEGG search of 705 genes against hsapiens.
## KEGG search found 28 hits.
## Performing gProfiler REAC search of 705 genes against hsapiens.
## REAC search found 9 hits.
## Performing gProfiler MI search of 705 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 705 genes against hsapiens.
## TF search found 341 hits.
## Performing gProfiler CORUM search of 705 genes against hsapiens.
## CORUM search found 7 hits.
## Performing gProfiler HP search of 705 genes against hsapiens.
## HP search found 2 hits.
clinic_eosinophil_up_gp$pvalue_plots$kegg_plot_over

clinic_eosinophil_up_gp$pvalue_plots$reactome_plot_over

clinic_eosinophil_down_gp <- simple_gprofiler(clinic_eosinophil_sigenes_down)
## Performing gProfiler GO search of 692 genes against hsapiens.
## GO search found 184 hits.
## Performing gProfiler KEGG search of 692 genes against hsapiens.
## KEGG search found 4 hits.
## Performing gProfiler REAC search of 692 genes against hsapiens.
## REAC search found 11 hits.
## Performing gProfiler MI search of 692 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 692 genes against hsapiens.
## TF search found 39 hits.
## Performing gProfiler CORUM search of 692 genes against hsapiens.
## CORUM search found 3 hits.
## Performing gProfiler HP search of 692 genes against hsapiens.
## HP search found 1 hits.
clinic_eosinophil_down_gp$pvalue_plots$kegg_plot_over

clinic_eosinophil_down_gp$pvalue_plots$reactome_plot_over

clinic_monocyte_gp <- simple_gprofiler(clinic_monocyte_sigenes)
## Performing gProfiler GO search of 1244 genes against hsapiens.
## GO search found 417 hits.
## Performing gProfiler KEGG search of 1244 genes against hsapiens.
## KEGG search found 21 hits.
## Performing gProfiler REAC search of 1244 genes against hsapiens.
## REAC search found 13 hits.
## Performing gProfiler MI search of 1244 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 1244 genes against hsapiens.
## TF search found 403 hits.
## Performing gProfiler CORUM search of 1244 genes against hsapiens.
## CORUM search found 7 hits.
## Performing gProfiler HP search of 1244 genes against hsapiens.
## HP search found 22 hits.
clinic_monocyte_gp$pvalue_plots$kegg_plot_over

clinic_monocyte_gp$pvalue_plots$reactome_plot_over

clinic_monocyte_up_gp <- simple_gprofiler(clinic_monocyte_sigenes_up)
## Performing gProfiler GO search of 586 genes against hsapiens.
## GO search found 382 hits.
## Performing gProfiler KEGG search of 586 genes against hsapiens.
## KEGG search found 19 hits.
## Performing gProfiler REAC search of 586 genes against hsapiens.
## REAC search found 10 hits.
## Performing gProfiler MI search of 586 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 586 genes against hsapiens.
## TF search found 385 hits.
## Performing gProfiler CORUM search of 586 genes against hsapiens.
## CORUM search found 6 hits.
## Performing gProfiler HP search of 586 genes against hsapiens.
## HP search found 13 hits.
clinic_monocyte_up_gp$pvalue_plots$kegg_plot_over

clinic_monocyte_up_gp$pvalue_plots$reactome_plot_over

clinic_monocyte_down_gp <- simple_gprofiler(clinic_monocyte_sigenes_down)
## Performing gProfiler GO search of 658 genes against hsapiens.
## GO search found 60 hits.
## Performing gProfiler KEGG search of 658 genes against hsapiens.
## KEGG search found 3 hits.
## Performing gProfiler REAC search of 658 genes against hsapiens.
## REAC search found 4 hits.
## Performing gProfiler MI search of 658 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 658 genes against hsapiens.
## TF search found 241 hits.
## Performing gProfiler CORUM search of 658 genes against hsapiens.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 658 genes against hsapiens.
## HP search found 10 hits.
clinic_monocyte_down_gp$pvalue_plots$kegg_plot_over

clinic_monocyte_down_gp$pvalue_plots$reactome_plot_over

clinic_neutrophil_gp <- simple_gprofiler(clinic_neutrophil_sigenes)
## Performing gProfiler GO search of 1042 genes against hsapiens.
## GO search found 153 hits.
## Performing gProfiler KEGG search of 1042 genes against hsapiens.
## KEGG search found 10 hits.
## Performing gProfiler REAC search of 1042 genes against hsapiens.
## REAC search found 20 hits.
## Performing gProfiler MI search of 1042 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 1042 genes against hsapiens.
## TF search found 416 hits.
## Performing gProfiler CORUM search of 1042 genes against hsapiens.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 1042 genes against hsapiens.
## HP search found 1 hits.
clinic_neutrophil_gp$pvalue_plots$kegg_plot_over

clinic_neutrophil_gp$pvalue_plots$reactome_plot_over

clinic_neutrophil_up_gp <- simple_gprofiler(clinic_neutrophil_sigenes_up)
## Performing gProfiler GO search of 572 genes against hsapiens.
## GO search found 134 hits.
## Performing gProfiler KEGG search of 572 genes against hsapiens.
## KEGG search found 5 hits.
## Performing gProfiler REAC search of 572 genes against hsapiens.
## REAC search found 3 hits.
## Performing gProfiler MI search of 572 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 572 genes against hsapiens.
## TF search found 388 hits.
## Performing gProfiler CORUM search of 572 genes against hsapiens.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 572 genes against hsapiens.
## HP search found 0 hits.
clinic_neutrophil_up_gp$pvalue_plots$kegg_plot_over

clinic_neutrophil_up_gp$pvalue_plots$reactome_plot_over

clinic_neutrophil_down_gp <- simple_gprofiler(clinic_neutrophil_sigenes_down)
## Performing gProfiler GO search of 470 genes against hsapiens.
## GO search found 62 hits.
## Performing gProfiler KEGG search of 470 genes against hsapiens.
## KEGG search found 12 hits.
## Performing gProfiler REAC search of 470 genes against hsapiens.
## REAC search found 77 hits.
## Performing gProfiler MI search of 470 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 470 genes against hsapiens.
## TF search found 21 hits.
## Performing gProfiler CORUM search of 470 genes against hsapiens.
## CORUM search found 9 hits.
## Performing gProfiler HP search of 470 genes against hsapiens.
## HP search found 7 hits.
clinic_neutrophil_down_gp$pvalue_plots$kegg_plot_over

clinic_neutrophil_down_gp$pvalue_plots$reactome_plot_over

6.5.8 Plot the clinical samples

Let us recolor the same plot by cure/fail followed by a concatenation of the cell type and cure/fail. In the following block, the clinical samples are plotted once with the most common normalization (log,cpm,quant,filtered) method followed by a plot of the data using svaseq adjusted values and without quantile normalization.

Thus, the following block switches the colors of the groups to the clinical state (cure/fail) and shapes by cell type.

hs_clinical_norm <- sm(normalize_expt(hs_clinical, filter="simple", transform="log2",
                                      norm="quant", convert="cpm"))
clinical_pca <- plot_pca(hs_clinical_norm, plot_labels=FALSE,
                         cis=NULL,
                         plot_title="PCA - clinical samples")
dev <- pp(file=glue("images/all_clinical_nobatch_pca-v{ver}.png"), height=8, width=16)
clinical_pca$plot
closed <- dev.off()
clinical_pca$plot

hs_clinical_nb <- normalize_expt(hs_clinical, filter="simple", transform="log2",
                                 batch="svaseq", convert="cpm")
## Removing 1865 low-count genes (18058 remaining).
## Setting 158794 low elements to zero.
## transform_counts: Found 158794 values equal to 0, adding 1 to the matrix.
hs_clinical_nb_pca <- plot_pca(hs_clinical_nb)
## plot labels was not set and there are more than 100 samples, disabling it.
dev <- pp(file=glue("images/all_clinical_svaseqbatch_pca-v{ver}.png"), height=6, width=8)
hs_clinical_nb_pca$plot
closed <- dev.off()
hs_clinical_nb_pca$plot

clinical_pca_info <- pca_information(
    hs_clinical_norm, plot_pcas=TRUE, num_components = 30,
    expt_factors=c("visitnumber", "typeofcells", "clinicaloutcome",
                   "clinic"))
## plot labels was not set and there are more than 100 samples, disabling it.
dev <- pp(file="images/clinical_samples_neglogp_pcs.png")
clinical_pca_info$anova_neglogp_heatmap
closed <- dev.off()
clinical_pca_info$anova_neglogp_heatmap

clinical_pca_info$pca_plots$PC20_PC29
## Warning: ggrepel: 138 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

clinical_scores <- pca_highscores(hs_clinical_norm)
clinical_scores[["highest"]][,"Comp.20"]
##  [1] "14.03:ENSG00000266302" "9.344:ENSG00000163993" "6.935:ENSG00000129824"
##  [4] "6.362:ENSG00000067048" "5.933:ENSG00000171860" "5.535:ENSG00000196526"
##  [7] "5.304:ENSG00000198692" "5.088:ENSG00000099725" "4.65:ENSG00000185897" 
## [10] "4.499:ENSG00000106565" "4.471:ENSG00000144681" "4.422:ENSG00000012817"
## [13] "4.381:ENSG00000176834" "4.354:ENSG00000118432" "4.285:ENSG00000073464"
## [16] "4.145:ENSG00000129295" "4.134:ENSG00000178538" "3.972:ENSG00000198178"
## [19] "3.944:ENSG00000134460" "3.93:ENSG00000152766"
clinical_scores[["highest"]][,"Comp.27"]
##  [1] "13.72:ENSG00000244734" "11.84:ENSG00000188536" "9.716:ENSG00000206172"
##  [4] "5.305:ENSG00000266302" "4.884:ENSG00000183570" "4.333:ENSG00000277632"
##  [7] "3.539:ENSG00000130766" "3.435:ENSG00000198848" "3.419:ENSG00000158578"
## [10] "3.401:ENSG00000136732" "3.168:ENSG00000134824" "3.142:ENSG00000101220"
## [13] "3.069:ENSG00000237541" "3.023:ENSG00000122877" "2.958:ENSG00000120738"
## [16] "2.957:ENSG00000123358" "2.948:ENSG00000223609" "2.937:ENSG00000142583"
## [19] "2.919:ENSG00000133048" "2.913:ENSG00000153283"
first <- normalize_expt(hs_clinical, transform="log2", convert="cpm",
                        filter = TRUE, batch="svaseq", surrogates=1)
## Removing 5601 low-count genes (14322 remaining).
## Setting 206667 low elements to zero.
## transform_counts: Found 206667 values equal to 0, adding 1 to the matrix.
first_info <- pca_information(
    first, plot_pcas=TRUE, num_components = 30,
    expt_factors=c("visitnumber", "typeofcells", "clinicaloutcome",
                   "clinic"))
## plot labels was not set and there are more than 100 samples, disabling it.
first_info$anova_neglogp_heatmap

first_info$pca_plots[["PC1_PC2"]]
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning: ggrepel: 187 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

second <- normalize_expt(hs_clinical, transform="log2", convert="cpm",
                         filter = TRUE, batch="svaseq", surrogates=2) %>%
  set_expt_batches(fact="clinic")
## Removing 5601 low-count genes (14322 remaining).
## Setting 33691 low elements to zero.
## transform_counts: Found 33691 values equal to 0, adding 1 to the matrix.
second_info <- pca_information(
    second, plot_pcas=TRUE, num_components = 30,
    expt_factors=c("visitnumber", "typeofcells", "clinicaloutcome",
                   "clinic"))
## plot labels was not set and there are more than 100 samples, disabling it.
second_info$anova_neglogp_heatmap

third <- normalize_expt(hs_clinical, transform="log2", convert="cpm",
                        filter = TRUE, batch="svaseq", surrogates=3) %>%
  set_expt_batches(fact="clinic")
## Removing 5601 low-count genes (14322 remaining).
## Setting 28785 low elements to zero.
## transform_counts: Found 28785 values equal to 0, adding 1 to the matrix.
third_info <- pca_information(
    third, plot_pcas=TRUE, num_components = 30,
    expt_factors=c("visitnumber", "typeofcells", "clinicaloutcome",
                   "clinic"))
## plot labels was not set and there are more than 100 samples, disabling it.
third_info$anova_neglogp_heatmap

fourth <- normalize_expt(hs_clinical, transform="log2", convert="cpm",
                         filter = TRUE, batch="svaseq", surrogates=4) %>%
  set_expt_batches(fact="clinic")
## Removing 5601 low-count genes (14322 remaining).
## Setting 27785 low elements to zero.
## transform_counts: Found 27785 values equal to 0, adding 1 to the matrix.
fourth_info <- pca_information(
    fourth, plot_pcas=TRUE, num_components = 30,
    expt_factors=c("visitnumber", "typeofcells", "clinicaloutcome",
                   "clinic"))
## plot labels was not set and there are more than 100 samples, disabling it.
fourth_info$anova_neglogp_heatmap

fourth_info[["pca_plots"]][["PC1_PC2"]]
## Warning: ggrepel: 111 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

fifth <- normalize_expt(hs_clinical, transform="log2", convert="cpm",
                        filter = TRUE, batch="svaseq", surrogates=5) %>%
  set_expt_batches(fact="clinic")
## Removing 5601 low-count genes (14322 remaining).
## Setting 28885 low elements to zero.
## transform_counts: Found 28885 values equal to 0, adding 1 to the matrix.
fifth_info <- pca_information(
    fifth, plot_pcas=TRUE, num_components = 30,
    expt_factors=c("visitnumber", "typeofcells", "clinicaloutcome",
                   "clinic"))
## plot labels was not set and there are more than 100 samples, disabling it.
fifth_info$anova_neglogp_heatmap

fifth_info[["pca_plots"]][["PC1_PC12"]]
## Warning: ggrepel: 126 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

sixth <- normalize_expt(hs_clinical, transform="log2", convert="cpm",
                        filter = TRUE, batch="svaseq", surrogates=6) %>%
  set_expt_batches(fact="clinic")
## Removing 5601 low-count genes (14322 remaining).
## Setting 25457 low elements to zero.
## transform_counts: Found 25457 values equal to 0, adding 1 to the matrix.
sixth_info <- pca_information(
    sixth, plot_pcas=TRUE, num_components = 30,
    expt_factors=c("visitnumber", "typeofcells", "clinicaloutcome",
                   "clinic"))
## plot labels was not set and there are more than 100 samples, disabling it.
sixth_info$anova_neglogp_heatmap

seventh <- normalize_expt(hs_clinical, transform="log2", convert="cpm",
                          filter = TRUE, batch="svaseq", surrogates=7) %>%
  set_expt_batches(fact="clinic")
## Removing 5601 low-count genes (14322 remaining).
## Setting 25447 low elements to zero.
## transform_counts: Found 25447 values equal to 0, adding 1 to the matrix.
seventh_info <- pca_information(
    seventh, plot_pcas=TRUE, num_components = 30,
    expt_factors=c("visitnumber", "typeofcells", "clinicaloutcome",
                   "clinic"))
## plot labels was not set and there are more than 100 samples, disabling it.
seventh_info$anova_neglogp_heatmap

eighth <- normalize_expt(hs_clinical, transform="log2", convert="cpm",
                        filter = TRUE, batch="svaseq", surrogates=8)
## Removing 5601 low-count genes (14322 remaining).
## Setting 25130 low elements to zero.
## transform_counts: Found 25130 values equal to 0, adding 1 to the matrix.
eighth_info <- pca_information(
    eighth, plot_pcas=TRUE, num_components = 30,
    expt_factors=c("visitnumber", "typeofcells", "clinicaloutcome",
                   "clinic"))
## plot labels was not set and there are more than 100 samples, disabling it.
eighth_info$anova_neglogp_heatmap

6.5.9 Concatenate cure/fail and cell type

In the following block the experimental condition was reset to the concatenation of clinical outcome and type of cells. There are an insufficient number of biopsy samples for them to be useful in this visualization, so they are ignored.

desired_levels <- c("cure_biopsy", "failure_biopsy", "cure_eosinophils", "failure_eosinophils",
                    "cure_monocytes", "failure_monocytes", "cure_neutrophils", "failure_neutrophils")
new_fact <- factor(
    paste0(pData(hs_clinical)[["condition"]], "_",
           pData(hs_clinical)[["batch"]]),
    levels=desired_levels)

hs_clinical_concat <- set_expt_conditions(hs_clinical, fact = new_fact) %>%
  set_expt_batches(fact = "visitnumber") %>%
  set_expt_colors(cf_type_colors) %>%
  subset_expt(subset="typeofcells!='biopsy'")
## subset_expt(): There were 192, now there are 173 samples.
## Try to ensure that the levels stay in the order I want
meta <- pData(hs_clinical_concat) %>%
  mutate(condition = fct_relevel(condition, desired_levels))
## Warning: Unknown levels in `f`: cure_biopsy, failure_biopsy
pData(hs_expt) <- meta

clinical_concat_norm <- normalize_expt(hs_clinical_concat, transform = "log2", convert = "cpm",
                                       norm = "quant", filter = TRUE)
## Removing 7749 low-count genes (12174 remaining).
## transform_counts: Found 124 values equal to 0, adding 1 to the matrix.
clinical_concat_norm_pca <- plot_pca(clinical_concat_norm)
## plot labels was not set and there are more than 100 samples, disabling it.
dev <- pp(file=glue("images/clinical_concatenated_normalized_pca-v{ver}.png"), height=6, width=10)
clinical_concat_norm_pca$plot
closed <- dev.off()
clinical_concat_norm_pca$plot

clinical_concat_nb <- normalize_expt(hs_clinical_concat, transform = "log2", convert = "cpm",
                                     batch = "svaseq", filter = TRUE)
## Removing 7749 low-count genes (12174 remaining).
## Setting 37479 low elements to zero.
## transform_counts: Found 37479 values equal to 0, adding 1 to the matrix.
clinical_concat_nb_pca <- plot_pca(clinical_concat_nb)
## plot labels was not set and there are more than 100 samples, disabling it.
dev <- pp(file=glue("images/clinical_concatenated_svaseqbatch_pca-v{ver}.png"), height=6, width=12)
clinical_concat_nb_pca$plot
closed <- dev.off()
clinical_concat_nb_pca$plot

tumaco_concat <- subset_expt(hs_clinical_concat, subset="clinic=='Tumaco'")
## subset_expt(): There were 173, now there are 116 samples.
tumaco_concat_norm <- normalize_expt(tumaco_concat, transform = "log2", convert = "cpm",
                                       norm = "quant", filter = TRUE)
## Removing 7985 low-count genes (11938 remaining).
## transform_counts: Found 95 values equal to 0, adding 1 to the matrix.
tumaco_concat_norm_pca <- plot_pca(tumaco_concat_norm)
## plot labels was not set and there are more than 100 samples, disabling it.
dev <- pp(file=glue("images/tumaco_concatenated_normalized_pca-v{ver}.png"), height=6, width=10)
tumaco_concat_norm_pca$plot
closed <- dev.off()
tumaco_concat_norm_pca$plot

tumaco_concat_nb <- normalize_expt(tumaco_concat, transform = "log2", convert = "cpm",
                                     batch = "svaseq", filter = TRUE)
## Removing 7985 low-count genes (11938 remaining).
## Setting 32996 low elements to zero.
## transform_counts: Found 32996 values equal to 0, adding 1 to the matrix.
tumaco_concat_nb_pca <- plot_pca(tumaco_concat_nb)
## plot labels was not set and there are more than 100 samples, disabling it.
dev <- pp(file=glue("images/clinical_concatenated_svaseqbatch_pca-v{ver}.png"), height=6, width=12)
tumaco_concat_nb_pca$plot
closed <- dev.off()
tumaco_concat_nb_pca$plot

library(ggplot2)
wanted_legend_order <- c("cure_eosinophils","cure_monocytes","cure_neutrophils",
                         "failure_eosinophils","failure_monocytes","failure_neutrophils")
test <- plot_pca(clinical_concat_norm)
## plot labels was not set and there are more than 100 samples, disabling it.
test$plot

test$plot +
  scale_color_discrete(breaks=wanted_legend_order) +
  guides(color=guide_legend(ncol=2))
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.

test2 <- plot_legend(clinical_concat_norm)
## plot labels was not set and there are more than 100 samples, disabling it.

6.5.10 Samples separated by visit

Separate the samples by visit in order to more easily see what patterns emerge across cell type and clinical outcome.

The most likely data set for this is hs_clinical.

6.5.10.1 All visits together

Now let us shift the view slightly to focus on changes observed over time.

visit_expt <- set_expt_conditions(hs_clinical, fact = "visitnumber") %>%
  set_expt_batches(fact = "clinicaloutcome") %>%
  subset_expt(subset="typeofcells!='biopsy'")
## subset_expt(): There were 192, now there are 173 samples.
visit_norm <- normalize_expt(visit_expt, transform="log2", convert="cpm",
                             norm="quant", filter=TRUE)
## Removing 7749 low-count genes (12174 remaining).
## transform_counts: Found 124 values equal to 0, adding 1 to the matrix.
plot_pca(visit_norm)$plot
## plot labels was not set and there are more than 100 samples, disabling it.

visit_nb <- normalize_expt(visit_expt, transform = "log2", convert="cpm",
                           filter = TRUE, batch = "svaseq")
## Removing 7749 low-count genes (12174 remaining).
## Setting 18454 low elements to zero.
## transform_counts: Found 18454 values equal to 0, adding 1 to the matrix.
visit_nb_pca <- plot_pca(visit_nb)
## plot labels was not set and there are more than 100 samples, disabling it.
dev <- pp(file=glue("images/visit_svaseqbatch_pca-v{ver}.png"), height=7, width=9)
visit_nb_pca$plot
closed <- dev.off()
visit_nb_pca$plot

6.6 Top 1000 genes

repeat with only the most expressed genes from one cell type.

rpkm_values <- normalize_expt(type_valid, transform="log2", convert="rpkm",
                              filter=TRUE, column="cds_length")
## Removing 5601 low-count genes (14322 remaining).
## transform_counts: Found 226798 values equal to 0, adding 1 to the matrix.
rpkm_median <- median_by_factor(rpkm_values)
## The factor biopsy has 19 rows.
## The factor eosinophils has 42 rows.
## The factor monocytes has 66 rows.
## The factor neutrophils has 65 rows.
rpkm_tumaco_monocyte_idx <- order(rpkm_median[["medians"]][["monocytes"]], decreasing=TRUE)
rpkm_tumaco_monocyte <- rpkm_median[["medians"]][rpkm_tumaco_monocyte_idx, ]
tumaco_monocyte_gene <- head(rownames(rpkm_tumaco_monocyte), n=1000)

6.6.0.1 All visits, separated by cell type

Now separate the visits by cell type and whether or not the drug used was the antimonial.

visit_monocyte <- subset_expt(visit_expt, subset = "typeofcells=='monocytes'")
## subset_expt(): There were 173, now there are 66 samples.
visit_neutrophil <- subset_expt(visit_expt, subset = "typeofcells=='neutrophils'")
## subset_expt(): There were 173, now there are 65 samples.
visit_eosinophil <- subset_expt(visit_expt, subset = "typeofcells=='eosinophils'")
## subset_expt(): There were 173, now there are 42 samples.

6.6.0.2 Visit 1 alone

v1_clinical <- subset_expt(visit_expt, subset = "visitnumber=='1'") %>%
  set_expt_conditions(fact = "clinicaloutcome") %>%
  set_expt_batches(fact = "typeofcells")
## subset_expt(): There were 173, now there are 72 samples.
v1_norm <- normalize_expt(v1_clinical, transform="log2", convert="cpm", norm="quant", filter=TRUE)
## Removing 8111 low-count genes (11812 remaining).
## transform_counts: Found 18 values equal to 0, adding 1 to the matrix.
plot_pca(v1_norm)$plot
## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure

## Warning in MASS::cov.trob(data[, vars]): Probable convergence failure
## Warning: ggrepel: 71 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

v1_nb <- normalize_expt(v1_clinical, transform = "log2", convert = "cpm",
                        filter = TRUE, batch = "svaseq")
## Removing 8111 low-count genes (11812 remaining).
## Setting 5286 low elements to zero.
## transform_counts: Found 5286 values equal to 0, adding 1 to the matrix.
plot_pca(v1_nb, plot_labels = FALSE)$plot

So, given the data on hand, there is slight ability to discern cure and fail among the visit 1 samples.

6.6.0.3 Visit 2 alone

v2_clinical <- subset_expt(visit_expt, subset="visitnumber=='2'") %>%
  set_expt_conditions(fact = "clinicaloutcome") %>%
  set_expt_batches(fact = "typeofcells")
## subset_expt(): There were 173, now there are 50 samples.
v2_nb <- normalize_expt(v2_clinical, transform = "log2", convert = "cpm", norm = "quant",
                        filter = TRUE, batch = "svaseq")
## Warning in normalize_expt(v2_clinical, transform = "log2", convert = "cpm", :
## Quantile normalization and sva do not always play well together.
## Removing 8184 low-count genes (11739 remaining).
## Setting 2960 low elements to zero.
## transform_counts: Found 2960 values equal to 0, adding 1 to the matrix.
plot_pca(v2_nb, plot_labels = FALSE)$plot

There might be some variance among the visit 2 samples which are cure/fail-ish.

6.6.0.4 Visit 3 alone

v3_clinical <- subset_expt(visit_expt, subset="visitnumber=='3'") %>%
  set_expt_conditions(fact = "clinicaloutcome") %>%
  set_expt_batches(fact = "typeofcells")
## subset_expt(): There were 173, now there are 51 samples.
v3_nb <- normalize_expt(v3_clinical, transform = "log2", convert = "cpm", norm = "quant",
                        filter = TRUE, batch = "svaseq")
## Warning in normalize_expt(v3_clinical, transform = "log2", convert = "cpm", :
## Quantile normalization and sva do not always play well together.
## Removing 8259 low-count genes (11664 remaining).
## Setting 2584 low elements to zero.
## transform_counts: Found 2584 values equal to 0, adding 1 to the matrix.
plot_pca(v3_nb, plot_labels = FALSE)$plot

In a similar fashion, it seems that the visit 3 samples are not particularly informative.

6.6.1 Samples separated by cell type

Separate the samples by cell type in order to more easily observe patterns with respect to visit and clinical outcome.

6.6.1.1 Biopsies

biopsy_norm <- normalize_expt(biopsy_samples, norm = "quant", convert = "cpm",
                              transform = "log2", filter = TRUE)
## Removing 6278 low-count genes (13645 remaining).
## transform_counts: Found 212 values equal to 0, adding 1 to the matrix.
plot_pca(biopsy_norm, plot_labels = FALSE)$plot

biopsy_nb <- normalize_expt(biopsy_samples, convert = "cpm",
                            transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 6278 low-count genes (13645 remaining).
## Setting 243 low elements to zero.
## transform_counts: Found 243 values equal to 0, adding 1 to the matrix.
plot_pca(biopsy_nb, plot_labels = FALSE)$plot

6.6.1.2 Monocytes

monocyte_norm <- normalize_expt(monocyte_samples, norm = "quant", convert = "cpm",
                                transform = "log2", filter = TRUE)
## Removing 8797 low-count genes (11126 remaining).
## transform_counts: Found 12 values equal to 0, adding 1 to the matrix.
monocyte_pca <- plot_pca(monocyte_norm, plot_labels = FALSE)
dev <- pp(file="images/monocytes_cf_norm_pca.png")
monocyte_pca$plot
closed <- dev.off()
monocyte_pca$plot

monocyte_disheat <- plot_disheat(monocyte_norm)
dev <- pp(file="images/monocytes_cf_norm_disheat.png")
monocyte_disheat$plot
closed <- dev.off()
monocyte_disheat$plot

monocyte_nb <- normalize_expt(monocyte_samples, convert = "cpm",
                            transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 8797 low-count genes (11126 remaining).
## Setting 1403 low elements to zero.
## transform_counts: Found 1403 values equal to 0, adding 1 to the matrix.
monocyte_nb_pca <- plot_pca(monocyte_nb, plot_labels = FALSE)
dev <- pp(file="images/monocytes_cf_norm_sva_pca.png")
monocyte_nb_pca$plot
closed <- dev.off()
monocyte_nb_pca$plot

6.6.1.2.1 Monocytes, visit 1
monocyte_v1 <- subset_expt(monocyte_samples, subset = "visitnumber=='1'")
## subset_expt(): There were 66, now there are 29 samples.
monocyte_v1_norm <- normalize_expt(monocyte_v1, norm = "quant", convert = "cpm",
                                   transform = "log2", filter = TRUE)
## Removing 9053 low-count genes (10870 remaining).
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
monocyte_v1_pca <- plot_pca(monocyte_v1_norm, plot_labels = FALSE)
dev <- pp(file="images/monocytes_v1_cf_norm_pca.png")
monocyte_v1_pca$plot
closed <- dev.off()
monocyte_v1_pca$plot

monocyte_v1_nb <- normalize_expt(monocyte_v1, convert = "cpm",
                            transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 9053 low-count genes (10870 remaining).
## Setting 558 low elements to zero.
## transform_counts: Found 558 values equal to 0, adding 1 to the matrix.
monocyte_v1_nb_pca <- plot_pca(monocyte_v1_nb, plot_labels = FALSE)
dev <- pp(file="images/monocytes_v1_cf_norm_sva_pca.png")
monocyte_v1_nb_pca$plot
closed <- dev.off()
monocyte_v1_nb_pca$plot

The monocytes, on the other hand, appear to have some real information lurking in them.

6.6.1.3 Neutrophils

neutrophil_norm <- normalize_expt(neutrophil_samples, norm = "quant", convert = "cpm",
                                transform = "log2", filter = TRUE)
## Removing 10634 low-count genes (9289 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(neutrophil_norm, plot_labels = FALSE)$plot

neutrophil_nb <- normalize_expt(neutrophil_samples, convert = "cpm",
                            transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 10634 low-count genes (9289 remaining).
## Setting 1703 low elements to zero.
## transform_counts: Found 1703 values equal to 0, adding 1 to the matrix.
plot_pca(neutrophil_nb, plot_labels = FALSE)$plot

This appears also to be the case for the neutrophil samples.

6.6.1.4 Eosinophils

eosinophil_norm <- normalize_expt(eosinophil_samples, norm = "quant", convert = "cpm",
                                transform = "log2", filter = TRUE)
## Removing 9049 low-count genes (10874 remaining).
## transform_counts: Found 5 values equal to 0, adding 1 to the matrix.
plot_pca(eosinophil_norm, plot_labels = FALSE)$plot

eosinophil_nb <- normalize_expt(eosinophil_samples, convert = "cpm",
                            transform = "log2", filter = TRUE, batch = "svaseq")
## Removing 9049 low-count genes (10874 remaining).
## Setting 936 low elements to zero.
## transform_counts: Found 936 values equal to 0, adding 1 to the matrix.
plot_pca(eosinophil_nb, plot_labels = FALSE)$plot

We have fewer eosinophil samples currently, but they appear to have some real differences.

6.6.1.5 Monocytes, Neutrophils, and Eosinophils

7 Contrasts and colors of interest

This might be a bit early to consider the contrasts, but I think we should consider this question immediately. The main thing we will be comparing is of course cure vs. fail; but we may also look at the visits and compare cell types.

cf_contrasts <- list(
    "fail_vs_cure" = c("failure", "cure"))
visit_contrasts <- list(
    "v2v1" = c("c2", "c1"),
    "v3v1" = c("c3", "c1"),
    "v3v2" = c("c3", "c2"))
type_contrasts <- list(
    "mono_biopsy" = c("monocytes", "biopsy"),
    "eosinophil_biopsy" = c("eosinophils", "biopsy"),
    "neutrophil_biopsy" = c("neutrophils", "biopsy"))
visit_cf_contrasts <- list(
    "v1fail_vs_cure" = c("v1failure", "v1cure"),
    "v2fail_vs_cure" = c("v2failure", "v2cure"),
    "v3fail_vs_cure" = c("v3failure", "v3cure"))

Sample IDs starting with 1: Cali IDs starting with 2: Tumaco

8 Differential expression analyses

The primary goal is to learn about cure vs. fail.

8.1 Cure/Fail, all samples

Now let us start performing the various differential expression analyses, starting with the set of all/most clinical samples.

cf_clinical_de <- all_pairwise(hs_clinical, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (14322 remaining).
## Setting 25457 low elements to zero.
## transform_counts: Found 25457 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
cf_clinical_tables <- combine_de_tables(
    cf_clinical_de,
    keepers = cf_contrasts,
    excel = glue::glue("excel/cf_clinical_tables-v{ver}.xlsx"))
## Deleting the file excel/cf_clinical_tables-v202205.xlsx before writing the tables.
cf_clinical_sig <- extract_significant_genes(
    cf_clinical_tables,
    excel = glue::glue("excel/cf_clinical_sig-v{ver}.xlsx"))
## Deleting the file excel/cf_clinical_sig-v202205.xlsx before writing the tables.

8.1.1 By cell type

8.1.1.1 Cure/Fail, Biopsies

cf_biopsy_de <- all_pairwise(biopsy_samples, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (13645 remaining).
## Setting 243 low elements to zero.
## transform_counts: Found 243 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
cf_biopsy_tables <- combine_de_tables(
    cf_biopsy_de,
    keepers = cf_contrasts,
    excel = glue::glue("excel/cf_biopsy_tables-v{ver}.xlsx"))
## Deleting the file excel/cf_biopsy_tables-v202205.xlsx before writing the tables.
cf_biopsy_sig <- extract_significant_genes(
    cf_biopsy_tables,
    excel = glue::glue("excel/cf_biopsy_sig-v{ver}.xlsx"))
## Deleting the file excel/cf_biopsy_sig-v202205.xlsx before writing the tables.

8.1.1.2 Cure/Fail, Monocytes

cf_monocyte_sva_de <- all_pairwise(monocyte_samples, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (11126 remaining).
## Setting 1403 low elements to zero.
## transform_counts: Found 1403 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
cf_monocyte_sva_tables <- combine_de_tables(
    cf_monocyte_sva_de,
    keepers = cf_contrasts,
    excel = glue::glue("excel/cf_monocyte_sva_tables-v{ver}.xlsx"))
## Deleting the file excel/cf_monocyte_sva_tables-v202205.xlsx before writing the tables.
cf_monocyte_sva_sig <- extract_significant_genes(
    cf_monocyte_sva_tables,
    excel = glue::glue("excel/cf_monocyte_sva_sig-v{ver}.xlsx"))
## Deleting the file excel/cf_monocyte_sva_sig-v202205.xlsx before writing the tables.
cf_monocyte_batchvisit_de <- all_pairwise(monocyte_samples, model_batch = TRUE, filter = TRUE)
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
cf_monocyte_batchvisit_tables <- combine_de_tables(
    cf_monocyte_batchvisit_de,
    keepers = cf_contrasts,
    excel = glue::glue("excel/cf_monocyte_batchvisit_tables-v{ver}.xlsx"))
## Deleting the file excel/cf_monocyte_batchvisit_tables-v202205.xlsx before writing the tables.
cf_monocyte_batchvisit_sig <- extract_significant_genes(
    cf_monocyte_batchvisit_tables,
    excel = glue::glue("excel/cf_monocyte_batchvisit_sig-v{ver}.xlsx"))
## Deleting the file excel/cf_monocyte_batchvisit_sig-v202205.xlsx before writing the tables.

8.1.1.3 Cure/Fail, only the Tumaco samples

cf_tumaco_monocyte_sva_de <- all_pairwise(tumaco_monocyte, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (10898 remaining).
## Setting 799 low elements to zero.
## transform_counts: Found 799 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
cf_tumaco_monocyte_sva_tables <- combine_de_tables(
    cf_tumaco_monocyte_sva_de,
    keepers = cf_contrasts,
    excel = glue::glue("excel/cf_monocyte_tables_sva_tumaco-v{ver}.xlsx"))
## Deleting the file excel/cf_monocyte_tables_sva_tumaco-v202205.xlsx before writing the tables.
cf_tumaco_monocyte_sva_sig <- extract_significant_genes(
    cf_tumaco_monocyte_sva_tables,
    excel = glue::glue("excel/cf_monocyte_sva_tumaco_sig-v{ver}.xlsx"))
## Deleting the file excel/cf_monocyte_sva_tumaco_sig-v202205.xlsx before writing the tables.
cf_tumaco_monocyte_batchvisit_de <- all_pairwise(tumaco_monocyte, model_batch = TRUE, filter = TRUE)
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
cf_tumaco_monocyte_batchvisit_tables <- combine_de_tables(
    cf_tumaco_monocyte_batchvisit_de,
    keepers = cf_contrasts,
    excel = glue::glue("excel/cf_monocyte_tables_batchvisit_tumaco-v{ver}.xlsx"))
## Deleting the file excel/cf_monocyte_tables_batchvisit_tumaco-v202205.xlsx before writing the tables.
cf_tumaco_monocyte_batchvisit_sig <- extract_significant_genes(
    cf_tumaco_monocyte_batchvisit_tables,
    excel = glue::glue("excel/cf_monocyte_batchvisit_tumaco_sig-v{ver}.xlsx"))
## Deleting the file excel/cf_monocyte_batchvisit_tumaco_sig-v202205.xlsx before writing the tables.
tumaco_sva_aucc <- calculate_aucc(cf_tumaco_monocyte_sva_tables[["data"]][["fail_vs_cure"]],
                            tbl2=cf_monocyte_sva_tables[["data"]][["fail_vs_cure"]],
                            py="deseq_adjp", ly="deseq_logfc")
tumaco_sva_aucc
## $aucc
## [1] 0.4024
## 
## $plot

shared_ids <- rownames(cf_tumaco_monocyte_sva_tables[["data"]][["fail_vs_cure"]]) %in%
  rownames(cf_monocyte_sva_tables[["data"]][["fail_vs_cure"]])
first <- cf_monocyte_sva_tables[["data"]][["fail_vs_cure"]][shared_ids, ]
second <- cf_tumaco_monocyte_sva_tables[["data"]][["fail_vs_cure"]][rownames(first), ]
cor.test(first[["deseq_logfc"]], second[["deseq_logfc"]])
## 
##  Pearson's product-moment correlation
## 
## data:  first[["deseq_logfc"]] and second[["deseq_logfc"]]
## t = 161, df = 10896, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8338 0.8449
## sample estimates:
##    cor 
## 0.8394
tumaco_batch_aucc <- calculate_aucc(cf_tumaco_monocyte_batchvisit_tables[["data"]][["fail_vs_cure"]],
                            tbl2=cf_monocyte_batchvisit_tables[["data"]][["fail_vs_cure"]],
                            py="deseq_adjp", ly="deseq_logfc")
tumaco_batch_aucc
## $aucc
## [1] 0.4004
## 
## $plot

shared_ids <- rownames(cf_tumaco_monocyte_batchvisit_tables[["data"]][["fail_vs_cure"]]) %in%
  rownames(cf_monocyte_batchvisit_tables[["data"]][["fail_vs_cure"]])
first <- cf_monocyte_batchvisit_tables[["data"]][["fail_vs_cure"]][shared_ids, ]
second <- cf_tumaco_monocyte_batchvisit_tables[["data"]][["fail_vs_cure"]][rownames(first), ]
cor.test(first[["deseq_logfc"]], second[["deseq_logfc"]])
## 
##  Pearson's product-moment correlation
## 
## data:  first[["deseq_logfc"]] and second[["deseq_logfc"]]
## t = 144, df = 10896, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.8023 0.8153
## sample estimates:
##    cor 
## 0.8089
first_sig_names <- rownames(cf_monocyte_batchvisit_sig[["deseq"]][["ups"]][["fail_vs_cure"]])
second_sig_names <- rownames(cf_tumaco_monocyte_batchvisit_sig[["deseq"]][["ups"]][["fail_vs_cure"]])
batch_venn_lst <- list(all_batch = first_sig_names, tumaco_batch = second_sig_names)
batch_venn <- Vennerable::Venn(batch_venn_lst)
Vennerable::plot(batch_venn)

8.1.1.4 Cure/Fail, Neutrophils

cf_neutrophil_de <- all_pairwise(neutrophil_samples, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (9289 remaining).
## Setting 1703 low elements to zero.
## transform_counts: Found 1703 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
cf_neutrophil_tables <- combine_de_tables(
    cf_neutrophil_de,
    keepers = cf_contrasts,
    excel = glue::glue("excel/cf_neutrophil_tables-v{ver}.xlsx"))
## Deleting the file excel/cf_neutrophil_tables-v202205.xlsx before writing the tables.
cf_neutrophil_sig <- extract_significant_genes(
    cf_neutrophil_tables,
    excel = glue::glue("excel/cf_neutrophil_sig-v{ver}.xlsx"))
## Deleting the file excel/cf_neutrophil_sig-v202205.xlsx before writing the tables.

8.1.1.5 Cure/Fail, Eosinophils

cf_eosinophil_de <- all_pairwise(eosinophil_samples, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (10874 remaining).
## Setting 936 low elements to zero.
## transform_counts: Found 936 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
cf_eosinophil_tables <- combine_de_tables(
    cf_eosinophil_de,
    keepers = cf_contrasts,
    excel = glue::glue("excel/cf_eosinophil_tables-v{ver}.xlsx"))
## Deleting the file excel/cf_eosinophil_tables-v202205.xlsx before writing the tables.
cf_eosinophil_sig <- extract_significant_genes(
    cf_eosinophil_tables,
    excel = glue::glue("excel/cf_eosinophil_sig-v{ver}.xlsx"))
## Deleting the file excel/cf_eosinophil_sig-v202205.xlsx before writing the tables.

8.1.1.6 Cure/Fail clinical (Not biopsies)

cf_nobiopsy_de <- all_pairwise(hs_clinical_nobiop, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (12174 remaining).
## Setting 18546 low elements to zero.
## transform_counts: Found 18546 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
cf_nobiopsy_tables <- combine_de_tables(
    cf_nobiopsy_de,
    keepers = cf_contrasts,
    excel = glue::glue("excel/cf_nobiopsy_tables-v{ver}.xlsx"))
## Deleting the file excel/cf_nobiopsy_tables-v202205.xlsx before writing the tables.
cf_nobiopsy_sig <- extract_significant_genes(
    cf_nobiopsy_tables,
    excel = glue::glue("excel/cf_nobiopsy_sig-v{ver}.xlsx"))
## Deleting the file excel/cf_nobiopsy_sig-v202205.xlsx before writing the tables.

8.1.2 By visit

For these contrasts, we want to see fail_v1 vs. cure_v1, fail_v2 vs. cure_v2 etc. As a result, we will need to juggle the data slightly and add another set of contrasts.

8.1.3 Setting up

visit_cf_expt_factor <- paste0("v", pData(hs_clinical)[["visitnumber"]],
                               pData(hs_clinical)[["condition"]])
visit_cf_expt <- set_expt_conditions(hs_clinical, fact = visit_cf_expt_factor)

visit_cf_eosinophil <- subset_expt(visit_cf_expt, subset="typeofcells=='eosinophils'")
## subset_expt(): There were 192, now there are 42 samples.
visit_cf_tumaco_eosinophil <- subset_expt(visit_cf_eosinophil, subset="clinic=='Tumaco'")
## subset_expt(): There were 42, now there are 27 samples.
visit_cf_monocyte <- subset_expt(visit_cf_expt, subset="typeofcells=='monocytes'")
## subset_expt(): There were 192, now there are 66 samples.
visit_cf_tumaco_monocyte <- subset_expt(visit_cf_monocyte, subset="clinic=='Tumaco'")
## subset_expt(): There were 66, now there are 45 samples.
visit_cf_neutrophil <- subset_expt(visit_cf_expt, subset="typeofcells=='neutrophils'")
## subset_expt(): There were 192, now there are 65 samples.
visit_cf_tumaco_neutrophil <- subset_expt(visit_cf_neutrophil, subset="clinic=='Tumaco'")
## subset_expt(): There were 65, now there are 44 samples.

8.1.3.1 Cure/Fail by visits, all cell types

visit_cf_all_de <- all_pairwise(visit_cf_expt, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (14322 remaining).
## Setting 30450 low elements to zero.
## transform_counts: Found 30450 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

visit_cf_all_tables <- combine_de_tables(
    visit_cf_all_de,
    keepers = visit_cf_contrasts,
    excel = glue::glue("excel/visit_cf_all_tables-v{ver}.xlsx"))
## Deleting the file excel/visit_cf_all_tables-v202205.xlsx before writing the tables.
visit_cf_all_sig <- extract_significant_genes(
    visit_cf_all_tables,
    excel = glue::glue("excel/visit_cf_all_sig-v{ver}.xlsx"))
## Deleting the file excel/visit_cf_all_sig-v202205.xlsx before writing the tables.

8.1.3.2 Cure/Fail by visit, Monocytes

visit_cf_monocyte_de <- all_pairwise(visit_cf_monocyte, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (11126 remaining).
## Setting 1541 low elements to zero.
## transform_counts: Found 1541 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

visit_cf_monocyte_tables <- combine_de_tables(
    visit_cf_monocyte_de,
    keepers = visit_cf_contrasts,
    excel = glue::glue("excel/visit_cf_monocyte_tables-v{ver}.xlsx"))
## Deleting the file excel/visit_cf_monocyte_tables-v202205.xlsx before writing the tables.
visit_cf_monocyte_sig <- extract_significant_genes(
    visit_cf_monocyte_tables,
    excel = glue::glue("excel/visit_cf_monocyte_sig-v{ver}.xlsx"))
## Deleting the file excel/visit_cf_monocyte_sig-v202205.xlsx before writing the tables.
v1fc_deseq_ma <- visit_cf_monocyte_tables[["plots"]][["v1fail_vs_cure"]][["deseq_ma_plots"]][["plot"]]
dev <- pp(file="images/monocyte_cf_de_v1_maplot.png")
v1fc_deseq_ma
closed <- dev.off()
v1fc_deseq_ma

v2fc_deseq_ma <- visit_cf_monocyte_tables[["plots"]][["v2fail_vs_cure"]][["deseq_ma_plots"]][["plot"]]
dev <- pp(file="images/monocyte_cf_de_v2_maplot.png")
v2fc_deseq_ma
closed <- dev.off()
v2fc_deseq_ma

v3fc_deseq_ma <- visit_cf_monocyte_tables[["plots"]][["v3fail_vs_cure"]][["deseq_ma_plots"]][["plot"]]
dev <- pp(file="images/monocyte_cf_de_v3_maplot.png")
v3fc_deseq_ma
closed <- dev.off()
v3fc_deseq_ma

## Repeat for the tumaco subset
visit_cf_tumaco_monocyte_de <- all_pairwise(visit_cf_tumaco_monocyte,
                                          model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (10898 remaining).
## Setting 782 low elements to zero.
## transform_counts: Found 782 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

visit_cf_tumaco_monocyte_tables <- combine_de_tables(
    visit_cf_tumaco_monocyte_de,
    keepers = visit_cf_contrasts,
    excel = glue::glue("excel/visit_cf_tumaco_monocyte_tables-v{ver}.xlsx"))
## Deleting the file excel/visit_cf_tumaco_monocyte_tables-v202205.xlsx before writing the tables.
visit_cf_tumaco_monocyte_sig <- extract_significant_genes(
    visit_cf_tumaco_monocyte_tables,
    excel = glue::glue("excel/visit_cf_tumaco_monocyte_sig-v{ver}.xlsx"))
## Deleting the file excel/visit_cf_tumaco_monocyte_sig-v202205.xlsx before writing the tables.

One query from Alejandro is to look at the genes shared up/down across visits. I am not entirely certain we have enough samples for this to work, but let us find out.

I am thinking this is a good place to use the AUCC curves I learned about thanks to Julie Cridland.

Note that the following is all monocyte samples, this should therefore potentially be moved up and a version of this with only the Tumaco samples put here?

v1fc <- visit_cf_monocyte_tables[["data"]][["v1fail_vs_cure"]]
v2fc <- visit_cf_monocyte_tables[["data"]][["v2fail_vs_cure"]]
v3fc <- visit_cf_monocyte_tables[["data"]][["v3fail_vs_cure"]]

v1_sig <- c(
    rownames(visit_cf_monocyte_sig[["deseq"]][["ups"]][["v1fail_vs_cure"]]),
    rownames(visit_cf_monocyte_sig[["deseq"]][["downs"]][["v1fail_vs_cure"]]))
v2_sig <- c(
    rownames(visit_cf_monocyte_sig[["deseq"]][["ups"]][["v2fail_vs_cure"]]),
    rownames(visit_cf_monocyte_sig[["deseq"]][["downs"]][["v2fail_vs_cure"]]))
v3_sig <- c(
    rownames(visit_cf_monocyte_sig[["deseq"]][["ups"]][["v2fail_vs_cure"]]),
    rownames(visit_cf_monocyte_sig[["deseq"]][["downs"]][["v2fail_vs_cure"]]))

monocyte_visit_aucc_v2v1 <- calculate_aucc(v1fc, tbl2=v2fc, py="deseq_adjp", ly="deseq_logfc")
dev <- pp(file="images/monocyte_visit_v2v1_aucc.png")
monocyte_visit_aucc_v2v1[["plot"]]
closed <- dev.off()
monocyte_visit_aucc_v2v1[["plot"]]

monocyte_visit_aucc_v3v1 <- calculate_aucc(v1fc, tbl2=v3fc, py="deseq_adjp", ly="deseq_logfc")
dev <- pp(file="images/monocyte_visit_v3v1_aucc.png")
monocyte_visit_aucc_v3v1[["plot"]]
closed <- dev.off()
monocyte_visit_aucc_v3v1[["plot"]]

8.1.3.3 Repeat for only the Tumaco samples

v1fc_tumaco <- visit_cf_tumaco_monocyte_tables[["data"]][["v1fail_vs_cure"]]
v2fc_tumaco <- visit_cf_tumaco_monocyte_tables[["data"]][["v2fail_vs_cure"]]
v3fc_tumaco <- visit_cf_tumaco_monocyte_tables[["data"]][["v3fail_vs_cure"]]

v1_tumaco_sig <- c(
    rownames(visit_cf_tumaco_monocyte_sig[["deseq"]][["ups"]][["v1fail_vs_cure"]]),
    rownames(visit_cf_tumaco_monocyte_sig[["deseq"]][["downs"]][["v1fail_vs_cure"]]))
v2_tumaco_sig <- c(
    rownames(visit_cf_tumaco_monocyte_sig[["deseq"]][["ups"]][["v2fail_vs_cure"]]),
    rownames(visit_cf_tumaco_monocyte_sig[["deseq"]][["downs"]][["v2fail_vs_cure"]]))
v3_tumaco_sig <- c(
    rownames(visit_cf_tumaco_monocyte_sig[["deseq"]][["ups"]][["v2fail_vs_cure"]]),
    rownames(visit_cf_tumaco_monocyte_sig[["deseq"]][["downs"]][["v2fail_vs_cure"]]))

monocyte_tumaco_visit_aucc_v2v1 <- calculate_aucc(v1fc_tumaco, tbl2=v2fc_tumaco,
                                                  py="deseq_adjp", ly="deseq_logfc")
dev <- pp(file="images/monocyte_visit_tumaco_v2v1_aucc.png")
monocyte_tumaco_visit_aucc_v2v1[["plot"]]
closed <- dev.off()
monocyte_tumaco_visit_aucc_v2v1[["plot"]]

monocyte_tumaco_visit_aucc_v3v1 <- calculate_aucc(v1fc_tumaco, tbl2=v3fc_tumaco,
                                                  py="deseq_adjp", ly="deseq_logfc")
dev <- pp(file="images/monocyte_visit_tumaco_v3v1_aucc.png")
monocyte_tumaco_visit_aucc_v3v1[["plot"]]
closed <- dev.off()
monocyte_tumaco_visit_aucc_v3v1[["plot"]]

monocyte_tumaco_visit_aucc_v3v2 <- calculate_aucc(v3fc_tumaco, tbl2=v2fc_tumaco,
                                                  py="deseq_adjp", ly="deseq_logfc")
dev <- pp(file="images/monocyte_visit_tumaco_v3v2_aucc.png")
monocyte_tumaco_visit_aucc_v3v2[["plot"]]
closed <- dev.off()
monocyte_tumaco_visit_aucc_v3v2[["plot"]]

8.1.3.4 Cure/Fail by visit, Neutrophils

a

visit_cf_neutrophil_de <- all_pairwise(visit_cf_neutrophil, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (9289 remaining).
## Setting 1612 low elements to zero.
## transform_counts: Found 1612 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

visit_cf_neutrophil_tables <- combine_de_tables(
    visit_cf_neutrophil_de,
    keepers = visit_cf_contrasts,
    excel = glue::glue("excel/visit_cf_neutrophil_tables-v{ver}.xlsx"))
## Deleting the file excel/visit_cf_neutrophil_tables-v202205.xlsx before writing the tables.
visit_cf_neutrophil_sig <- extract_significant_genes(
    visit_cf_neutrophil_tables,
    excel = glue::glue("excel/visit_cf_neutrophil_sig-v{ver}.xlsx"))
## Deleting the file excel/visit_cf_neutrophil_sig-v202205.xlsx before writing the tables.

8.1.3.5 Cure/Fail by visit, Eosinophils

visit_cf_eosinophil_de <- all_pairwise(visit_cf_eosinophil, model_batch = "svaseq", filter = TRUE)
## Removing 0 low-count genes (10874 remaining).
## Setting 980 low elements to zero.
## transform_counts: Found 980 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

visit_cf_eosinophil_tables <- combine_de_tables(
    visit_cf_eosinophil_de,
    keepers = visit_cf_contrasts,
    excel = glue::glue("excel/visit_cf_eosinophil_tables-v{ver}.xlsx"))
## Deleting the file excel/visit_cf_eosinophil_tables-v202205.xlsx before writing the tables.
visit_cf_eosinophil_sig <- extract_significant_genes(
    visit_cf_eosinophil_tables,
    excel = glue::glue("excel/visit_cf_eosinophil_sig-v{ver}.xlsx"))
## Deleting the file excel/visit_cf_eosinophil_sig-v202205.xlsx before writing the tables.

8.2 Persistence in visit 3

Having put some SL read mapping information in the sample sheet, Maria Adelaida added a new column using it with the putative persistence state on a per-sample basis. One question which arised from that: what differences are observable between the persistent yes vs. no samples on a per-cell-type basis among the visit 3 samples.

8.2.1 Setting up

First things first, create the datasets.

persistence_expt <- subset_expt(hs_clinical, subset = "persistence=='Y'|persistence=='N'") %>%
  subset_expt(subset = 'visitnumber==3') %>%
  set_expt_conditions(fact = 'persistence')
## subset_expt(): There were 192, now there are 118 samples.
## subset_expt(): There were 118, now there are 40 samples.
## persistence_biopsy <- subset_expt(persistence_expt, subset = "typeofcells=='biopsy'")
persistence_monocyte <- subset_expt(persistence_expt, subset = "typeofcells=='monocytes'")
## subset_expt(): There were 40, now there are 16 samples.
persistence_neutrophil <- subset_expt(persistence_expt, subset = "typeofcells=='neutrophils'")
## subset_expt(): There were 40, now there are 14 samples.
persistence_eosinophil <- subset_expt(persistence_expt, subset = "typeofcells=='eosinophils'")
## subset_expt(): There were 40, now there are 10 samples.

8.2.2 Take a look

See if there are any patterns which look usable.

## All
persistence_norm <- normalize_expt(persistence_expt, transform = "log2", convert = "cpm",
                                   norm = "quant", filter = TRUE)
## Removing 8378 low-count genes (11545 remaining).
## transform_counts: Found 19 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_norm)$plot
## Warning: ggrepel: 29 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

persistence_nb <- normalize_expt(persistence_expt, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 8378 low-count genes (11545 remaining).
## Setting 2392 low elements to zero.
## transform_counts: Found 2392 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_nb)$plot

## Biopsies
##persistence_biopsy_norm <- normalize_expt(persistence_biopsy, transform = "log2", convert = "cpm",
##                                   norm = "quant", filter = TRUE)
##plot_pca(persistence_biopsy_norm)$plot
## Insufficient data

## Monocytes
persistence_monocyte_norm <- normalize_expt(persistence_monocyte, transform = "log2", convert = "cpm",
                                   norm = "quant", filter = TRUE)
## Removing 9391 low-count genes (10532 remaining).
## transform_counts: Found 17 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_monocyte_norm)$plot

persistence_monocyte_nb <- normalize_expt(persistence_monocyte, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 9391 low-count genes (10532 remaining).
## Setting 106 low elements to zero.
## transform_counts: Found 106 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_monocyte_nb)$plot

## Neutrophils
persistence_neutrophil_norm <- normalize_expt(persistence_neutrophil, transform = "log2", convert = "cpm",
                                   norm = "quant", filter = TRUE)
## Removing 11372 low-count genes (8551 remaining).
## transform_counts: Found 1 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_neutrophil_norm)$plot

persistence_neutrophil_nb <- normalize_expt(persistence_neutrophil, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 11372 low-count genes (8551 remaining).
## Setting 138 low elements to zero.
## transform_counts: Found 138 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_neutrophil_nb)$plot

## Eosinophils
persistence_eosinophil_norm <- normalize_expt(persistence_eosinophil, transform = "log2", convert = "cpm",
                                   norm = "quant", filter = TRUE)
## Removing 9757 low-count genes (10166 remaining).
## transform_counts: Found 7 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_eosinophil_norm)$plot

persistence_eosinophil_nb <- normalize_expt(persistence_eosinophil, transform = "log2", convert = "cpm",
                                 batch = "svaseq", filter = TRUE)
## Removing 9757 low-count genes (10166 remaining).
## Setting 60 low elements to zero.
## transform_counts: Found 60 values equal to 0, adding 1 to the matrix.
plot_pca(persistence_eosinophil_nb)$plot

8.2.3 persistence DE

persistence_de <- all_pairwise(persistence_expt, filter = TRUE, model_batch = "svaseq")
## Removing 0 low-count genes (11545 remaining).
## Setting 2392 low elements to zero.
## transform_counts: Found 2392 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_table <- combine_de_tables(
    persistence_de,
    excel = glue::glue("excel/persistence_all_de-v{ver}.xlsx"))
## Deleting the file excel/persistence_all_de-v202205.xlsx before writing the tables.
persistence_monocyte_de <- all_pairwise(persistence_monocyte, filter = TRUE, model_batch = "svaseq")
## Removing 0 low-count genes (10532 remaining).
## Setting 106 low elements to zero.
## transform_counts: Found 106 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_monocyte_table <- combine_de_tables(
    persistence_monocyte_de,
    excel = glue::glue("excel/persistence_monocyte_de-v{ver}.xlsx"))
## Deleting the file excel/persistence_monocyte_de-v202205.xlsx before writing the tables.
persistence_neutrophil_de <- all_pairwise(persistence_neutrophil, filter = TRUE, model_batch = "svaseq")
## Removing 0 low-count genes (8551 remaining).
## Setting 138 low elements to zero.
## transform_counts: Found 138 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_neutrophil_table <- combine_de_tables(
    persistence_neutrophil_de,
    excel = glue::glue("excel/persistence_neutrophil_de-v{ver}.xlsx"))
## Deleting the file excel/persistence_neutrophil_de-v202205.xlsx before writing the tables.
persistence_eosinophil_de <- all_pairwise(persistence_eosinophil, filter = TRUE, model_batch = "svaseq")
## Removing 0 low-count genes (10166 remaining).
## Setting 60 low elements to zero.
## transform_counts: Found 60 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
persistence_eosinophil_table <- combine_de_tables(
    persistence_eosinophil_de,
    excel = glue::glue("excel/persistence_eosinophil_de-v{ver}.xlsx"))
## Deleting the file excel/persistence_eosinophil_de-v202205.xlsx before writing the tables.

8.3 Comparing visits without regard to cure/fail

8.3.1 All cell types

visit_all_de <- all_pairwise(visit_expt, filter = TRUE, model_batch = "svaseq")
## Removing 0 low-count genes (12174 remaining).
## Setting 18454 low elements to zero.
## transform_counts: Found 18454 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

visit_all_table <- combine_de_tables(
    visit_all_de,
    keepers = visit_contrasts,
    excel = glue::glue("excel/visit_all_de-v{ver}.xlsx"))
## Deleting the file excel/visit_all_de-v202205.xlsx before writing the tables.
visit_all_sig <- extract_significant_genes(
    visit_all_table,
    excel = glue::glue("excel/visit_all_sig-v{ver}.xlsx"))
## Deleting the file excel/visit_all_sig-v202205.xlsx before writing the tables.
visit_all_saved <- save(list = "visit_all_table",
                        file = glue::glue("rda/visit_all_table-v{ver}.rda"))

8.3.2 Monocyte samples

visit_monocyte_de <- all_pairwise(visit_monocyte, filter = TRUE, model_batch = "svaseq")
## Removing 0 low-count genes (11126 remaining).
## Setting 1324 low elements to zero.
## transform_counts: Found 1324 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

visit_monocyte_table <- combine_de_tables(
    visit_monocyte_de,
    keepers = visit_contrasts,
    excel = glue::glue("excel/visit_monocyte_de-v{ver}.xlsx"))
## Deleting the file excel/visit_monocyte_de-v202205.xlsx before writing the tables.
visit_monocyte_sig <- extract_significant_genes(
    visit_monocyte_table,
    excel = glue::glue("excel/visit_monocyte_sig-v{ver}.xlsx"))
## Deleting the file excel/visit_monocyte_sig-v202205.xlsx before writing the tables.

8.3.3 Neutrophil samples

visit_neutrophil_de <- all_pairwise(visit_neutrophil, filter = TRUE, model_batch = "svaseq")
## Removing 0 low-count genes (9289 remaining).
## Setting 1544 low elements to zero.
## transform_counts: Found 1544 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

visit_neutrophil_table <- combine_de_tables(
    visit_neutrophil_de,
    keepers = visit_contrasts,
    excel = glue::glue("excel/visit_neutrophil_de-v{ver}.xlsx"))
## Deleting the file excel/visit_neutrophil_de-v202205.xlsx before writing the tables.
visit_neutrophil_sig <- extract_significant_genes(
    visit_neutrophil_table,
    excel = glue::glue("excel/visit_neutrophil_sig-v{ver}.xlsx"))
## Deleting the file excel/visit_neutrophil_sig-v202205.xlsx before writing the tables.
visit_neutrophil_saved <- save(list = "visit_neutrophil_table",
                               file = glue::glue("rda/visit_neutrophil_table-v{ver}.rda"))

8.3.4 Eosinophil samples

visit_eosinophil_de <- all_pairwise(visit_eosinophil, filter = TRUE, model_batch = "svaseq")
## Removing 0 low-count genes (10874 remaining).
## Setting 983 low elements to zero.
## transform_counts: Found 983 values equal to 0, adding 1 to the matrix.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

visit_eosinophil_table <- combine_de_tables(
    visit_eosinophil_de,
    keepers = visit_contrasts,
    excel = glue::glue("excel/visit_eosinophil_de-v{ver}.xlsx"))
## Deleting the file excel/visit_eosinophil_de-v202205.xlsx before writing the tables.
visit_eosinophil_sig <- extract_significant_genes(
    visit_eosinophil_table,
    excel = glue::glue("excel/visit_eosinophil_sig-v{ver}.xlsx"))
## Deleting the file excel/visit_eosinophil_sig-v202205.xlsx before writing the tables.
visit_eosinophil_saved <- save(list = "visit_eosinophil_table",
                               file = glue::glue("rda/visit_eosinophil_table-v{ver}.rda"))

9 Compare the two clinics directly

monocytes_by_place <- set_expt_conditions(monocyte_samples, fact="clinic")
eosinophils_by_place <- set_expt_conditions(eosinophil_samples, fact="clinic")
neutrophils_by_place <- set_expt_conditions(neutrophil_samples, fact="clinic")
biopsies_by_place <- set_expt_conditions(biopsy_samples, fact="clinic")

monocyte_place_de <- all_pairwise(monocytes_by_place, model_batch=TRUE)
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
monocyte_table <- combine_de_tables(
    monocyte_place_de,
    excel="excel/monocytes_by_place-table.xlsx")
## Deleting the file excel/monocytes_by_place-table.xlsx before writing the tables.
monocyte_sig <- extract_significant_genes(
    monocyte_table,
    excel="excel/monocytes_by_place-sig.xlsx")
## Deleting the file excel/monocytes_by_place-sig.xlsx before writing the tables.
eosinophil_place_de <- all_pairwise(eosinophils_by_place, model_batch=TRUE)
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
eosinophil_table <- combine_de_tables(
    eosinophil_place_de,
    excel="excel/eosinophils_by_place-table.xlsx")
## Deleting the file excel/eosinophils_by_place-table.xlsx before writing the tables.
eosinophil_sig <- extract_significant_genes(
    eosinophil_table,
    excel="excel/eosinophils_by_place-sig.xlsx")
## Deleting the file excel/eosinophils_by_place-sig.xlsx before writing the tables.
neutrophil_place_de <- all_pairwise(neutrophils_by_place, model_batch=TRUE)
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
neutrophil_table <- combine_de_tables(
    neutrophil_place_de,
    excel="excel/neutrophils_by_place-table.xlsx")
## Deleting the file excel/neutrophils_by_place-table.xlsx before writing the tables.
neutrophil_sig <- extract_significant_genes(
    neutrophil_table,
    excel="excel/neutrophils_by_place-sig.xlsx")
## Deleting the file excel/neutrophils_by_place-sig.xlsx before writing the tables.
biopsy_place_de <- all_pairwise(biopsies_by_place, model_batch=TRUE)
## Using limma's removeBatchEffect to visualize with(out) batch inclusion.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.
biopsy_table <- combine_de_tables(
    biopsy_place_de,
    excel="biopsies_by_place-table.xlsx")
## Deleting the file biopsies_by_place-table.xlsx before writing the tables.
biopsy_sig <- extract_significant_genes(
    biopsy_table,
    excel="biopsies_by_place-sig.xlsx")
## Deleting the file biopsies_by_place-sig.xlsx before writing the tables.

10 Likelihood Ratio Testing (LRT)

10.1 Shared patterns across visits

clinical_filt <- normalize_expt(hs_clinical, filter = TRUE)
## Removing 5601 low-count genes (14322 remaining).
lrt_visit <- deseq_lrt(clinical_filt, transform = "vst", interaction = FALSE,
                       interactor_column = "visitnumber",
                       interest_column = "clinicaloutcome")
## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 195 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## A large number of genes was given-- please, make sure this is not an error. Normally, only DE genes will be useful for this function.
## Working with 5979 genes.
## Working with 5979 genes after filtering: minc > 3
## Joining, by = "merge"
## Joining, by = "merge"
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.

summary(lrt_visit[["favorite_genes"]])
## Length  Class   Mode 
##      0   NULL   NULL
written <- write_xlsx(data=as.data.frame(lrt_visit[["deseq_table"]]),
                      excel=glue::glue("excel/lrt_clinical_visit-v{ver}.xlsx"))

lrt_monocyte_visit <- deseq_lrt(visit_monocyte, transform = "vst",
                                interaction = FALSE,
                                interactor_column = "visitnumber",
                                interest_column = "clinicaloutcome")
## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 132 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## Working with 42 genes.
## Working with 41 genes after filtering: minc > 3
## Joining, by = "merge"Joining, by = "merge"
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.

lrt_monocyte_visit$cluster_data$plot
## NULL
lrt_tumaco_monocyte_visit <- deseq_lrt(tumaco_monocyte, transform = "vst",
                                       interaction = FALSE, minc = 1,
                                       interactor_column = "visitnumber",
                                       interest_column = "clinicaloutcome")
## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 58 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## Working with 17 genes.
## Working with 17 genes after filtering: minc > 1
## Joining, by = "merge"Joining, by = "merge"
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.

10.2 Shared patterns across cell types

lrt_celltype_clinical_test <- deseq_lrt(hs_clinical, transform = "vst",
                                        interactor_column = "typeofcells",
                                        interest_column = "clinicaloutcome")
## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## -- replacing outliers and refitting for 21 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
## Working with 450 genes.
## Working with 446 genes after filtering: minc > 3
## Joining, by = "merge"
## Joining, by = "merge"
## Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.
## `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.

deseq_lrt_df <- merge(hs_annot, as.data.frame(lrt_celltype_clinical_test[["deseq_table"]]), all.y=TRUE,
                      by="row.names")
rownames(deseq_lrt_df) <- deseq_lrt_df[["Row.names"]]
deseq_lrt_df[["Row.names"]] <- NULL
written <- write_xlsx(data=deseq_lrt_df,
                      excel=glue::glue("excel/lrt_clinical_celltype-v{ver}.xlsx"))

11 Gene Set Analyses

The gene sets we are most likely to consider are the results of the various preceding differential expression analyses.

11.1 GSEA

11.1.1 Cure/Fail groups

In the context of cure vs. fail, we have mixed and matched the data in quite a few different ways.

11.1.1.1 Cure/Fail, all samples

For the moment, let us assume that the default definition of ‘significant’ is sufficient for these analyses, with the knowledge that is not likely to remain true.

The resulting data structures are organized as:

thing[[“deseq”]][[ups"]][[contrast]]

In addition, we have a few ontology-esque tools available, so let us mix and match and see what pops out.

cf_all_up <- cf_clinical_sig[["deseq"]][["ups"]][["fail_vs_cure"]]
dim(cf_all_up)
## [1] 122  58
cf_all_down <- cf_clinical_sig[["deseq"]][["downs"]][["fail_vs_cure"]]
dim(cf_all_down)
## [1] 50 58
cf_all_up_gp <- simple_gprofiler(cf_all_up)
## Performing gProfiler GO search of 122 genes against hsapiens.
## GO search found 80 hits.
## Performing gProfiler KEGG search of 122 genes against hsapiens.
## KEGG search found 24 hits.
## Performing gProfiler REAC search of 122 genes against hsapiens.
## REAC search found 7 hits.
## Performing gProfiler MI search of 122 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 122 genes against hsapiens.
## TF search found 8 hits.
## Performing gProfiler CORUM search of 122 genes against hsapiens.
## CORUM search found 6 hits.
## Performing gProfiler HP search of 122 genes against hsapiens.
## HP search found 0 hits.
cf_all_up_gp[["pvalue_plots"]][["reactome_plot_over"]]

cf_all_up_gp[["pvalue_plots"]][["kegg_plot_over"]]

cf_all_up_gp[["pvalue_plots"]][["mfp_plot_over"]]

cf_all_up_gp[["pvalue_plots"]][["bpp_plot_over"]]

cf_all_down_gp <- simple_gprofiler(cf_all_down)
## Performing gProfiler GO search of 50 genes against hsapiens.
## GO search found 3 hits.
## Performing gProfiler KEGG search of 50 genes against hsapiens.
## KEGG search found 2 hits.
## Performing gProfiler REAC search of 50 genes against hsapiens.
## REAC search found 5 hits.
## Performing gProfiler MI search of 50 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 50 genes against hsapiens.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 50 genes against hsapiens.
## CORUM search found 4 hits.
## Performing gProfiler HP search of 50 genes against hsapiens.
## HP search found 0 hits.
cf_all_down_gp[["pvalue_plots"]][["reactome_plot_over"]]
## NULL
cf_all_down_gp[["pvalue_plots"]][["kegg_plot_over"]]

cf_all_down_gp[["pvalue_plots"]][["mfp_plot_over"]]
## NULL
cf_all_down_gp[["pvalue_plots"]][["bpp_plot_over"]]

11.1.1.2 Cure/Fail, Biopsies

There are no genes deemed significant in the biopsy comparisons of cure/fail. Oddly, when I looked manually, I thought I saw one candidate gene. In addition, when I stepped through the function manually I got the same gene…

11.1.1.3 Cure/Fail, Monocytes

Try again with monocytes.

cf_monocyte_up <- cf_monocyte_sva_sig[["deseq"]][["ups"]][["fail_vs_cure"]]
dim(cf_monocyte_up)
## [1] 60 58
cf_monocyte_down <- cf_monocyte_sva_sig[["deseq"]][["downs"]][["fail_vs_cure"]]
dim(cf_monocyte_down)
## [1] 33 58
cf_monocyte_up_gp <- simple_gprofiler(cf_monocyte_up)
## Performing gProfiler GO search of 60 genes against hsapiens.
## GO search found 56 hits.
## Performing gProfiler KEGG search of 60 genes against hsapiens.
## KEGG search found 14 hits.
## Performing gProfiler REAC search of 60 genes against hsapiens.
## REAC search found 9 hits.
## Performing gProfiler MI search of 60 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 60 genes against hsapiens.
## TF search found 2 hits.
## Performing gProfiler CORUM search of 60 genes against hsapiens.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 60 genes against hsapiens.
## HP search found 35 hits.
cf_monocyte_up_gp[["pvalue_plots"]][["reactome_plot_over"]]

cf_monocyte_up_gp[["pvalue_plots"]][["kegg_plot_over"]]

cf_monocyte_up_gp[["pvalue_plots"]][["bpp_plot_over"]]

cf_monocyte_down_gp <- simple_gprofiler(cf_monocyte_down)
## Performing gProfiler GO search of 33 genes against hsapiens.
## GO search found 0 hits.
## Performing gProfiler KEGG search of 33 genes against hsapiens.
## KEGG search found 1 hits.
## Performing gProfiler REAC search of 33 genes against hsapiens.
## REAC search found 2 hits.
## Performing gProfiler MI search of 33 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 33 genes against hsapiens.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 33 genes against hsapiens.
## CORUM search found 2 hits.
## Performing gProfiler HP search of 33 genes against hsapiens.
## HP search found 0 hits.
cf_monocyte_down_gp[["pvalue_plots"]][["reactome_plot_over"]]

cf_monocyte_down_gp[["pvalue_plots"]][["kegg_plot_over"]]

11.1.1.4 Cure/Fail, Neutrophils

cf_neutrophil_up <- cf_neutrophil_sig[["deseq"]][["ups"]][["fail_vs_cure"]]
dim(cf_neutrophil_up)
## [1] 27 58
cf_neutrophil_down <- cf_neutrophil_sig[["deseq"]][["downs"]][["fail_vs_cure"]]
dim(cf_neutrophil_down)
## [1] 19 58
cf_neutrophil_up_gp <- simple_gprofiler(cf_neutrophil_up)
## Performing gProfiler GO search of 27 genes against hsapiens.
## GO search found 0 hits.
## Performing gProfiler KEGG search of 27 genes against hsapiens.
## KEGG search found 0 hits.
## Performing gProfiler REAC search of 27 genes against hsapiens.
## REAC search found 0 hits.
## Performing gProfiler MI search of 27 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 27 genes against hsapiens.
## TF search found 11 hits.
## Performing gProfiler CORUM search of 27 genes against hsapiens.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 27 genes against hsapiens.
## HP search found 0 hits.
cf_neutrophil_down_gp <- simple_gprofiler(cf_neutrophil_down)
## Performing gProfiler GO search of 19 genes against hsapiens.
## GO search found 0 hits.
## Performing gProfiler KEGG search of 19 genes against hsapiens.
## KEGG search found 1 hits.
## Performing gProfiler REAC search of 19 genes against hsapiens.
## REAC search found 0 hits.
## Performing gProfiler MI search of 19 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 19 genes against hsapiens.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 19 genes against hsapiens.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 19 genes against hsapiens.
## HP search found 0 hits.
cf_neutrophil_down_gp[["pvalue_plots"]][["kegg_plot_over"]]

11.1.1.5 Cure/Fail, Eosinophils

cf_eosinophil_up <- cf_eosinophil_sig[["deseq"]][["ups"]][["fail_vs_cure"]]
dim(cf_eosinophil_up)
## [1] 207  58
cf_eosinophil_down <- cf_eosinophil_sig[["deseq"]][["downs"]][["fail_vs_cure"]]
dim(cf_eosinophil_down)
## [1] 173  58
cf_eosinophil_up_gp <- simple_gprofiler(cf_eosinophil_up)
## Performing gProfiler GO search of 207 genes against hsapiens.
## GO search found 125 hits.
## Performing gProfiler KEGG search of 207 genes against hsapiens.
## KEGG search found 8 hits.
## Performing gProfiler REAC search of 207 genes against hsapiens.
## REAC search found 10 hits.
## Performing gProfiler MI search of 207 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 207 genes against hsapiens.
## TF search found 22 hits.
## Performing gProfiler CORUM search of 207 genes against hsapiens.
## CORUM search found 5 hits.
## Performing gProfiler HP search of 207 genes against hsapiens.
## HP search found 0 hits.
cf_eosinophil_up_gp[["pvalue_plots"]][["kegg_plot_over"]]

cf_eosinophil_up_gp[["pvalue_plots"]][["reactome_plot_over"]]

cf_eosinophil_up_gp[["pvalue_plots"]][["mfp_plot_over"]]

cf_eosinophil_up_gp[["pvalue_plots"]][["bpp_plot_over"]]

cf_eosinophil_down_gp <- simple_gprofiler(cf_eosinophil_down)
## Performing gProfiler GO search of 173 genes against hsapiens.
## GO search found 44 hits.
## Performing gProfiler KEGG search of 173 genes against hsapiens.
## KEGG search found 1 hits.
## Performing gProfiler REAC search of 173 genes against hsapiens.
## REAC search found 19 hits.
## Performing gProfiler MI search of 173 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 173 genes against hsapiens.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 173 genes against hsapiens.
## CORUM search found 2 hits.
## Performing gProfiler HP search of 173 genes against hsapiens.
## HP search found 1 hits.
cf_eosinophil_down_gp[["pvalue_plots"]][["reactome_plot_over"]]

cf_eosinophil_down_gp[["pvalue_plots"]][["mfp_plot_over"]]

cf_eosinophil_down_gp[["pvalue_plots"]][["bpp_plot_over"]]

11.1.1.6 Clinical samples

cf_nobiopsy_up <- cf_nobiopsy_sig[["deseq"]][["ups"]][["fail_vs_cure"]]
dim(cf_nobiopsy_up)
## [1] 181  58
cf_nobiopsy_down <- cf_nobiopsy_sig[["deseq"]][["downs"]][["fail_vs_cure"]]
dim(cf_nobiopsy_down)
## [1] 98 58
cf_nobiopsy_up_gp <- simple_gprofiler(cf_nobiopsy_up)
## Performing gProfiler GO search of 181 genes against hsapiens.
## GO search found 131 hits.
## Performing gProfiler KEGG search of 181 genes against hsapiens.
## KEGG search found 11 hits.
## Performing gProfiler REAC search of 181 genes against hsapiens.
## REAC search found 5 hits.
## Performing gProfiler MI search of 181 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 181 genes against hsapiens.
## TF search found 12 hits.
## Performing gProfiler CORUM search of 181 genes against hsapiens.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 181 genes against hsapiens.
## HP search found 0 hits.
cf_nobiopsy_up_gp[["pvalue_plots"]][["kegg_plot_over"]]

cf_nobiopsy_up_gp[["pvalue_plots"]][["reactome_plot_over"]]

cf_nobiopsy_up_gp[["pvalue_plots"]][["mfp_plot_over"]]

cf_nobiopsy_up_gp[["pvalue_plots"]][["bpp_plot_over"]]

cf_nobiopsy_down_gp <- simple_gprofiler(cf_nobiopsy_down)
## Performing gProfiler GO search of 98 genes against hsapiens.
## GO search found 5 hits.
## Performing gProfiler KEGG search of 98 genes against hsapiens.
## KEGG search found 6 hits.
## Performing gProfiler REAC search of 98 genes against hsapiens.
## REAC search found 2 hits.
## Performing gProfiler MI search of 98 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 98 genes against hsapiens.
## TF search found 0 hits.
## Performing gProfiler CORUM search of 98 genes against hsapiens.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 98 genes against hsapiens.
## HP search found 0 hits.
cf_nobiopsy_down_gp[["pvalue_plots"]][["reactome_plot_over"]]

cf_nobiopsy_down_gp[["pvalue_plots"]][["mfp_plot_over"]]
## NULL
cf_nobiopsy_down_gp[["pvalue_plots"]][["bpp_plot_over"]]

11.1.2 Cell type groups

11.1.3 Visit groups

11.2 GSVA

11.2.1 Clinical samples

hs_celltype_gsva_c2 <- simple_gsva(hs_valid)
## Converting the rownames() of the expressionset to ENTREZID.
## 588 ENSEMBL ID's didn't have a matching ENTEREZ ID. Dropping them now.
## Before conversion, the expressionset has 19923 entries.
## After conversion, the expressionset has 19495 entries.
hs_celltype_gsva_c2_sig <- get_sig_gsva_categories(
    hs_celltype_gsva_c2,
    excel="excel/individual_celltypes_gsva_c2.xlsx")
## Starting limma pairwise comparison.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$libsize.
## Limma step 1/6: choosing model.
## Choosing the non-intercept containing model.
## Assuming this data is similar to a micro array and not performign voom.
## Limma step 3/6: running lmFit with method: ls.
## Limma step 4/6: making and fitting contrasts with no intercept. (~ 0 + factors)
## Limma step 5/6: Running eBayes with robust = FALSE and trend = FALSE.
## Limma step 6/6: Writing limma outputs.
## Limma step 6/6: 1/1: Creating table: failure_vs_cure.  Adjust = BH
## Limma step 6/6: 1/2: Creating table: cure.  Adjust = BH
## Limma step 6/6: 2/2: Creating table: failure.  Adjust = BH
## The factor cure has 132 rows.
## The factor failure has 60 rows.
## plot labels was not set and there are more than 100 samples, disabling it.
## Testing each factor against the others.
## Scoring cure against everything else.
## Scoring failure against everything else.
## Deleting the file excel/individual_celltypes_gsva_c2.xlsx before writing the tables.
hs_celltype_gsva_c2_sig$subset_plot
hs_celltype_gsva_c2_sig$score_plot
broad_c7 <- load_gmt_signatures(signatures="reference/msigdb/c7.all.v7.2.entrez.gmt",
                                signature_category="c7")
hs_celltype_gsva_c7 <- simple_gsva(hs_valid,
                                   signatures="reference/msigdb/c7.all.v7.2.entrez.gmt",
                                   signature_category="c7",
                                   msig_xml="reference/msigdb_v7.2.xml",
                                   cores=10)
## Converting the rownames() of the expressionset to ENTREZID.
## 588 ENSEMBL ID's didn't have a matching ENTEREZ ID. Dropping them now.
## Before conversion, the expressionset has 19923 entries.
## After conversion, the expressionset has 19495 entries.
## Adding annotations from reference/msigdb_v7.2.xml.
hs_celltype_gsva_c7_sig <- get_sig_gsva_categories(
    hs_celltype_gsva_c7,
    excel="excel/individual_celltypes_gsva_c7.xlsx")
## Starting limma pairwise comparison.
## libsize was not specified, this parameter has profound effects on limma's result.
## Using the libsize from expt$libsize.
## Limma step 1/6: choosing model.
## Choosing the non-intercept containing model.
## Assuming this data is similar to a micro array and not performign voom.
## Limma step 3/6: running lmFit with method: ls.
## Limma step 4/6: making and fitting contrasts with no intercept. (~ 0 + factors)
## Limma step 5/6: Running eBayes with robust = FALSE and trend = FALSE.
## Limma step 6/6: Writing limma outputs.
## Limma step 6/6: 1/1: Creating table: failure_vs_cure.  Adjust = BH
## Limma step 6/6: 1/2: Creating table: cure.  Adjust = BH
## Limma step 6/6: 2/2: Creating table: failure.  Adjust = BH
## The factor cure has 132 rows.
## The factor failure has 60 rows.
## plot labels was not set and there are more than 100 samples, disabling it.
## Testing each factor against the others.
## Scoring cure against everything else.
## Scoring failure against everything else.
## Deleting the file excel/individual_celltypes_gsva_c7.xlsx before writing the tables.

12 Concordance

Let us compare various results to see how well they agreed

monocyte_cor_subset <- cf_monocyte_sva_tables[["data"]][["fail_vs_cure"]][, c("deseq_logfc", "deseq_adjp")]
neutrophil_cor_subset <- cf_neutrophil_tables[["data"]][["fail_vs_cure"]][, c("deseq_logfc", "deseq_adjp")]
eosinophil_cor_subset <- cf_eosinophil_tables[["data"]][["fail_vs_cure"]][, c("deseq_logfc", "deseq_adjp")]
mono_neut_cor <- merge(monocyte_cor_subset, neutrophil_cor_subset, by="row.names")
mono_eo_cor <- merge(monocyte_cor_subset, eosinophil_cor_subset, by="row.names")
neut_eo_cor <- merge(neutrophil_cor_subset, eosinophil_cor_subset, by="row.names")

cor.test(mono_neut_cor[["deseq_logfc.x"]], mono_neut_cor[["deseq_logfc.y"]])
## 
##  Pearson's product-moment correlation
## 
## data:  mono_neut_cor[["deseq_logfc.x"]] and mono_neut_cor[["deseq_logfc.y"]]
## t = 40, df = 8799, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3778 0.4130
## sample estimates:
##    cor 
## 0.3956
monocyte_neutrophil_aucc <- calculate_aucc(cf_monocyte_sva_tables[["data"]][["fail_vs_cure"]],
                                           cf_neutrophil_tables[["data"]][["fail_vs_cure"]],
                                           px="deseq_p", py="deseq_p", ly="deseq_logfc", lx="deseq_logfc")
monocyte_neutrophil_aucc$plot

cor.test(mono_eo_cor[["deseq_logfc.x"]], mono_eo_cor[["deseq_logfc.y"]])
## 
##  Pearson's product-moment correlation
## 
## data:  mono_eo_cor[["deseq_logfc.x"]] and mono_eo_cor[["deseq_logfc.y"]]
## t = 51, df = 10079, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4344 0.4655
## sample estimates:
##    cor 
## 0.4501
monocyte_eosinophil_aucc <- calculate_aucc(cf_monocyte_sva_tables[["data"]][["fail_vs_cure"]],
                                           cf_eosinophil_tables[["data"]][["fail_vs_cure"]],
                                           px="deseq_p", py="deseq_p", ly="deseq_logfc", lx="deseq_logfc")
monocyte_eosinophil_aucc$plot

cor.test(neut_eo_cor[["deseq_logfc.x"]], neut_eo_cor[["deseq_logfc.y"]])
## 
##  Pearson's product-moment correlation
## 
## data:  neut_eo_cor[["deseq_logfc.x"]] and neut_eo_cor[["deseq_logfc.y"]]
## t = 34, df = 8787, p-value <2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.3223 0.3593
## sample estimates:
##   cor 
## 0.341
neutrophil_eosinophil_aucc <- calculate_aucc(cf_neutrophil_tables[["data"]][["fail_vs_cure"]],
                                           cf_eosinophil_tables[["data"]][["fail_vs_cure"]],
                                           px="deseq_p", py="deseq_p", ly="deseq_logfc", lx="deseq_logfc")
neutrophil_eosinophil_aucc$plot

13 Classify me!

I wrote out all the z2.2 and z2.3 specific variants to a couple files, I want to see if I can classify a human sample as infected with 2.2 or 2.3.

z22 <- read.csv("csv/variants_22.csv")
z23 <- read.csv("csv/variants_23.csv")
cure <- read.csv("csv/cure_variants.txt")
fail <- read.csv("csv/fail_variants.txt")
z22_vec <- gsub(pattern="\\-", replacement="_", x=z22[["x"]])
z23_vec <- gsub(pattern="\\-", replacement="_", x=z23[["x"]])
cure_vec <- gsub(pattern="\\-", replacement="_", x=cure)
fail_vec <- gsub(pattern="\\-", replacement="_", x=fail)

classify_zymo <- function(sample) {
  arbitrary_tags <- sm(readr::read_tsv(sample))
  arbitrary_ids <- arbitrary_tags[["position"]]
  message("Length: ", length(arbitrary_ids), ", z22: ",
          sum(arbitrary_ids %in% z22_vec) / (length(z22_vec)), " z23: ",
          sum(arbitrary_ids %in% z23_vec) / (length(z23_vec)))
}

arbitrary_sample <- "preprocessing/TMRC30156/outputs/40freebayes_lpanamensis_v36/all_tags.txt.xz"
classify_zymo(arbitrary_sample)
if (!isTRUE(get0("skip_load"))) {
  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)
LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDIyMDU6IFJlb3JnYW5pemluZyBUTVJDMyBBbmFseXNlcyIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogaHRtbF9kb2N1bWVudDoKICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgY29kZV9mb2xkaW5nOiBzaG93CiAgZmlnX2NhcHRpb246IHRydWUKICBmaWdfaGVpZ2h0OiA3CiAgZmlnX3dpZHRoOiA3CiAgaGlnaGxpZ2h0OiBkZWZhdWx0CiAga2VlcF9tZDogZmFsc2UKICBtb2RlOiBzZWxmY29udGFpbmVkCiAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgc2VsZl9jb250YWluZWQ6IHRydWUKICB0aGVtZTogcmVhZGFibGUKICB0b2M6IHRydWUKICB0b2NfZmxvYXQ6CiAgIGNvbGxhcHNlZDogZmFsc2UKICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGU+CiAgYm9keSAubWFpbi1jb250YWluZXIgewogICAgbWF4LXdpZHRoOiAxNjAwcHg7CiAgfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShocGdsdG9vbHMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZm9yY2F0cykKdHQgPC0gc20oZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpKQprbml0cjo6b3B0c19rbml0JHNldChwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTkwLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0PTgsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMikpCnZlciA8LSAiMjAyMjA1IgpwcmV2aW91c19maWxlIDwtIHBhc3RlMCgiMDFfYW5ub3RhdGlvbl92IiwgdmVyLCAiLlJtZCIpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKCiMjdG1wIDwtIHRyeShzbShsb2FkbWUoZmlsZW5hbWU9Z3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSJcXC5yZGFcXC54eiIsIHg9cHJldmlvdXNfZmlsZSkpKSkKcm1kX2ZpbGUgPC0gInRtcmMzX3Jlb3JnYW5pemVkXzIwMjIwNS5SbWQiCnNhdmVmaWxlIDwtIGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iXFwucmRhXFwueHoiLCB4PXJtZF9maWxlKQpgYGAKCiMgSW50cm9kdWN0aW9uCgpUaGUgc2V0IG9mIGFuYWx5c2VzIHBlcmZvcm1lZCBpbiB0bXJjMyBzYW1wbGUgZXN0aW1hdGlvbiBoYXMgYmVjb21lCnVub3JnYW5pemVkIGFuZCBkaWZmaWN1bHQgdG8gZm9sbG93LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBzdGFydCBhdCB0aGUKbGV2ZWwgb2YgYnJvYWQgb3JnYW5pemF0aW9uIGJlZm9yZSBzdGVwcGluZyBpbnRvIHRoZSBhbmFseXNlcy4KCkFzIG9mIDIwMjIwMjI0LCB0aGlzIGRvY3VtZW50IGlzIGF0dGVtcHRpbmcgdG8gc3luY2hyb25pemUgd2l0aCB0aGUKZ29vZ2xlIGRvYyBuYW1lZCAnVE1SQzNfQXVnMThfMjAyMScuICBJIGFtIGhvcGluZyB0aGVyZWZvcmUgdG8gaGF2ZQpibG9ja3MgbmFtZWQgYWNjb3JkaW5nIHRvIHRoZSBmaWd1cmVzL2V0YyBpbiB0aGF0IGRvY3VtZW50LgoKIyMgR29hbHMKClRoZXNlIHNhbXBsZXMgYXJlIGZyb20gcGF0aWVudHMgd2hvIGVpdGhlciBzdWNjZXNzZnVsbHkgY2xlYXJlZCBhCkxlaXNobWFuaWEgcGFuYW1lbnNpcyBpbmZlY3Rpb24gZm9sbG93aW5nIHRyZWF0bWVudCwgb3IgZGlkIG5vdC4gIFRoZXkKaW5jbHVkZSBiaW9wc2llcyBmcm9tIGVhY2ggcGF0aWVudCBhbG9uZyB3aXRoIHB1cmlmaWNhdGlvbnMgZm9yCk1vbm9jeXRlcywgTmV1dHJvcGhpbHMsIGFuZCBFb3Npbm9waGlscy4gIFdoZW4gcG9zc2libGUsIHRoaXMgcHJvY2Vzcwp3YXMgcmVwZWF0ZWQgb3ZlciB0aHJlZSB2aXNpdHM7IGJ1dCBzb21lIHBhdGllbnRzIGRpZCBub3QgcmV0dXJuCmZvciB0aGUgc2Vjb25kIG9yIHRoaXJkIHZpc2l0LgoKVGhlIG92ZXItYXJjaGluZyBnb2FsIGlzIHRvIGxvb2sgZm9yIGF0dHJpYnV0ZXMobW9zdCBsaWtlbHkgZ2VuZXMpCndoaWNoIGRpc3Rpbmd1aXNoIHBhdGllbnRzIHdobyBkbyBhbmQgZG8gbm90IGN1cmUgdGhlIGluZmVjdGlvbiBhZnRlcgp0cmVhdG1lbnQuICBJZiBwb3NzaWJsZSwgdGhlc2Ugd2lsbCBiZSBhcHBhcmVudCBvbiB0aGUgZmlyc3QgdmlzaXQuCgojIyBSZWxldmFudCBNZXRhZGF0YQoKVGhlIG1ldGFkYXRhIGZhY3RvcnMgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpIG9mIHRoZSBleHBlcmltZW50IGFyZToKCjEuICBWaXNpdC4gIDEsIDIsIG9yIDMuCjIuICBQYXRpZW50LgozLiAgQ2xpbmljYWwgb3V0Y29tZTogY3VyZSBvciBmYWlsLiAgVGhpcyBpbmNsdWRlcyB0aGUgcG9wdWxhdGlvbiBvZgogICAgcGF0aWVudHMgd2hvIGRpZCBub3QgcmV0dXJuIGFuZCBhcmUgbGFiZWxlZCAnbG9zdCcuICBUaGlzIGlzLCBieQogICAgZGVmaW5pdGlvbiwgY29uZm91bmRlZCB3aXRoIHBhdGllbnQuCjQuICBEcnVnIHRyZWF0bWVudC4gIE1vc3Qgb2YgdGhlIHBhdGllbnRzIHdlcmUgdHJlYXRlZCB3aXRoIGFuCiAgICBhbnRpbW9uaWFsLCBidXQgYSBmZXcgd2VyZSB0cmVhdGVkIHdpdGggbWlsdGVmb3NpbmUuCjUuICBDZWxsIHR5cGUgb3IgYmlvcHN5LgoKTWV0YWRhdGEgd2FzIGFsc28gY29sbGVjdGVkIGZvciB0aGUgcGF0aWVudHMgYW5kIHRoZXJlIGFyZSBtYW55CmZhY3RvcnMgd2hpY2ggaGF2ZSBwb3RlbnRpYWwgdG8gYWZmZWN0IHRoZSBvdXRjb21lLiAgVGhlc2UgYW5hbHlzZXMKd2lsbCBnZW5lcmFsbHkgcmVtYWluIGFnbm9zdGljIGZvciB0aGVzZSBmYWN0b3JzLCB3aGljaCBpbmNsdWRlIChhbW9uZwpvdGhlciB0aGluZ3MpOgoKMS4gIHNleAoyLiAgZXRobmljaXR5CjQuICBhZ2UKNS4gIHVsY2VyL2xlc2lvbiBhdHRyaWJ1dGVzIChieSB2aXNpdCkKNi4gIGFtb3VudCBvZiB0aW1lIHNwZW50IHdpdGggaW5mZWN0aW9uCgojIyBMaWJyYXJpZXMsIHNlcXVlbmNpbmcsIG1hcHBpbmcsIHF1YW50aWZpY2F0aW9uCgpUaGUgc2FtcGxlcyB1c2VkIGluIHRoZXNlIGFuYWx5c2VzIHdlcmUgYWxsIGNvbGxlY3RlZCwgcHVyaWZpZWQsIGFuZApsaWJyYXJpZXMgZ2VuZXJhdGVkIGJ5IHRoZSBzY2llbnRpc3RzL2RvY3RvcnMgYXQgQ0lERUlNLiAgVGhlCnNlcXVlbmNpbmcgbGlicmFyaWVzIHdlcmUgZ2VuZXJhdGVkIHZpYSB0aGUgVHJ1U2VxIG5vbi1zdHJhbmRlZApsaWJyYXJ5IGtpdCBhbmQgc2VxdWVuY2VkIGVpdGhlciBhdCBKSFUgb3IgVU1EOyBlYXJsaWVyIHNhbXBsZXMgd2VyZQpzaW5nbGUtZW5kZWQsIGJ1dCBtb3N0IHdlcmUgcGFpcmVkLgoKQWxsIHNhbXBsZXMgd2VyZSB0cmltbWVkIHdpdGggdHJpbW9tYXRpYyB1c2luZyB0aGUgc2FtZSBzZXQgb2YKcGFyYW1ldGVycy4gIEFsbCBtYXBwaW5nIHdhcyBwZXJmb3JtZWQgd2l0aCBoaXNhdDIgdmVyc2lvbiAyLjIuMS4KUXVhbnRpZmljYXRpb25zIHdlcmUgYWxzbyBwZXJmb3JtZWQgd2l0aCBzYWxtb24gdmVyc2lvbiAxLjIuMC4gIFRoZQpyZWZlcmVuY2UgZ2Vub21lIHVzZWQgd2FzIGhnMzggMTAwIChyZWxlYXNlZCAyMDIwMDQpLiAgV2hlbiBzYW1wbGVzCndlcmUgbWFwcGVkIGFnYWluc3QgTC5wYW5hbWVuc2lzLCB0aGUgVHJpVHJ5cERCIHZlcnNpb24gMzYgcmVmZXJlbmNlCndhcyB1c2VkLiAgVGhlIHNldCBvZiBhbm5vdGF0aW9ucyB3ZXJlIHRoZXJlZm9yZSBsaW1pdGVkIHRvIGVuc2VtYmwncwoyMDIwIHJlbGVhc2UuICBUaGUgZWFybHkgc2FtcGxlcyB3ZXJlIGFjdHVhbGx5IGZpcnN0IG1hcHBlZCB3aXRoCmhnMzggOTEgYW5kIGxhdGVyIHJlZG9uZS4KCiMjIFR5cGVzIG9mIGFuYWx5c2VzIGluY2x1ZGVkCgpUaGlzIGRvY3VtZW50IHdpbGwgbGltaXQgaXRzZWxmIHRvIGEgc2V0IG9mIGNhbm9uaWNhbCBSTkFzZXEKYW5hbHlzZXMuICBJdCBtdXN0IHRoZXJlZm9yZSBjcmVhdGUgZmlsZXMgY29udGFpbmluZyB0aGUgcmF3IGRhdGEgdG8KZmFjaWxpdGF0ZSBzaGFyaW5nIHRoZSBkYXRhLiAgSXQgd2lsbCBwbG90IG1ldHJpY3Mgb2YgdGhlIGRhdGEgdG8KZGVtb25zdHJhdGUgdGhlIHNlcXVlbmNpbmcgcXVhbGl0eSBhbmQgY2x1c3RlcmluZyBvZiB0aGUgc2FtcGxlcyB1bmRlcgp0aGUgdmFyaW91cyBjb25kaXRpb25zIGV4YW1pbmVkIGFuZCBub3JtYWxpemF0aW9ucyBlbXBsb3llZC4gIEl0IHdpbGwKcGVyZm9ybSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNlcyBmb3IgdGhlIG1ldGFkYXRhIGZhY3RvcnMgb2YKaW50ZXJlc3QgYWxvbmdzaWRlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdHMgZm9yIGZhY3RvcnMgbGlrZSBjZWxsdHlwZQphbmQgdGltZS4gIEdpdmVuIHRoZSBzZXRzIG9mIG92ZXIvdW5kZXIgZXhwcmVzc2VkIGdlbmVzIG9ic2VydmVkIGluCnRoZSB2YXJpb3VzIERFIG1ldGhvZHMsIGl0IHdpbGwgcGVyZm9ybSB0aGUgbGlrZWx5IGdlbmUgc2V0IHRlc3RzIGZvcgpvdmVyIHJlcHJlc2VudGVkIGdlbmUgb250b2xvZ3kgZ3JvdXBzLCByZWFjdG9tZSwgZXRjLiAgU2ltdWx0YW5lb3VzbHksCnRoZSByYXcgZGF0YSB3aWxsIGJlIHBhc3NlZCB0byBnZW5lIHNldCB2YXJpYW5jZSBhbmFseXNlcyB0byBzZWUgaWYKdGhlcmUgYXJlIGdyb3VwcyBvZiBnZW5lcyBvdmVycmVwcmVzZW50ZWQgaW4gb3RoZXIgZXhwZXJpbWVudHMuCgojIyBNZXRhZGF0YSBjb2xsZWN0aW9uCgpUaGVyZSBhcmUgdHdvIG1ldGFkYXRhIHNvdXJjZXM6CgoxLiAgVGhlIG9ubGluZSBzYW1wbGUgc2hlZXQsIHdoaWNoIEkgcGVyaW9kaWNhbGx5IHVwZGF0ZSBhbmQgZG93bmxvYWQKICAgIGludG8gdGhlICdzYW1wbGVfc2hlZXRzLycgZGlyZWN0b3J5LgoyLiAgVGhlIGNyZiBtZXRhZGF0YSwgZGVzY3JpYmluZyB0aGUgaW5kaXZpZHVhbCBwYXRpZW50cy4KCmBgYHtyIG1ldGFkYXRhX3NvdXJjZXN9CnNhbXBsZXNoZWV0IDwtICJzYW1wbGVfc2hlZXRzL3RtcmMzX3NhbXBsZXNfMjAyMjA1Lnhsc3giCmNyZl9tZXRhZGF0YSA8LSAic2FtcGxlX3NoZWV0cy8yMDIxMDgyNV9FWFBfRVNQRUNJQUxfVE1SQzNfVkVSU0lPTl8yLnhsc3giCmBgYAoKIyBBbm5vdGF0aW9uIENvbGxlY3Rpb24KClRoZSBwcmltYXJ5IGFubm90YXRpb24gc291cmNlcyBhcmU6CgoxLiAgRW5zZW1ibCdzIGJpb21hcnQgYXJjaGl2ZSBmcm9tIDIwMjAgZm9yIGh1bWFuIGFubm90YXRpb25zLgoyLiAgVGhlIFRyaVRyeXBEQiByZWxlYXNlIDM2IGZvciBwYXJhc2l0ZSBhbm5vdGF0aW9ucy4KCkJvdGggcHJvdmlkZSBHTyBkYXRhLiAgVGhleSBhbHNvIHByb3ZpZGUgaGVscGZ1bCBsaW5rcyB0byBvdGhlciBkYXRhCnNvdXJjZXMuICBGb3IgdGhlIG1vbWVudCwgd2UgYXJlIGZvY3VzaW5nIG9uIHRoZSBodW1hbiBhbm5vdGF0aW9ucy4KCiMjIEdlbmUgYW5ub3RhdGlvbnMKClRoZXNlIGFuYWx5c2VzIGhhdmUgZm9jdXNlZCBvbiBnZW5lLWxldmVsIGFidW5kYW5jZXMvZGlmZmVyZW5jZXMuClRodXMsIHdoZW4gaHRzZXEtY291bnQgd2FzIGludm9rZWQgYWdhaW5zdCB0aGUgaGlzYXQyLWJhc2VkIG1hcHBpbmdzLApwYXJhbWV0ZXJzIHdlcmUgY2hvc2VuIHRvIGNvdW50IGdlbmVzIHJhdGhlciB0aGFuIHRyYW5zY3JpcHRzLgpTaW1pbGFybHksIHdoZW4gc2FsbW9uIGNvdW50cyB3ZXJlIHVzZWQgdmlhIHR4aW1wb3J0LCBhIG1hcHBpbmcgb2YKZ2VuZXMgdG8gdHJhbnNjcmlwdHMgd2FzIHVzZWQgdG8gY29sbGFwc2UgdGhlIG1hdHJpeCB0byBnZW5lLWxldmVsCmFidW5kYW5jZXMuICBUaGlzIGRlY2lzaW9uIG1heSBiZSByZXZpc2l0ZWQuCgpgYGB7ciBjb2xsZWN0X2Fubm90YXRpb25zfQpoc19hbm5vdCA8LSBsb2FkX2Jpb21hcnRfYW5ub3RhdGlvbnMoeWVhcj0iMjAyMCIsIG1vbnRoPSJqYW4iKQoKaHNfYW5ub3QgPC0gaHNfYW5ub3RbWyJhbm5vdGF0aW9uIl1dCmhzX2Fubm90W1sidHJhbnNjcmlwdCJdXSA8LSBwYXN0ZTAocm93bmFtZXMoaHNfYW5ub3QpLCAiLiIsIGhzX2Fubm90W1sidmVyc2lvbiJdXSkKcm93bmFtZXMoaHNfYW5ub3QpIDwtIG1ha2UubmFtZXMoaHNfYW5ub3RbWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQp0eF9nZW5lX21hcCA8LSBoc19hbm5vdFssIGMoInRyYW5zY3JpcHQiLCAiZW5zZW1ibF9nZW5lX2lkIildCnN1bW1hcnkoaHNfYW5ub3QpCmBgYAoKIyMgR2VuZSBvbnRvbG9neSBkYXRhCgpUaGUgc2V0IG9mIEdPIGNhdGVnb3JpZXMgaGFzIG5vdCBiZWVuIGxpbWl0ZWQgdG8gdGhlIDIwMjAgZGF0YSBhdCB0aGUKdGltZSBvZiB0aGlzIHdyaXRpbmcuCgpgYGB7ciBoc19nb30KaHNfZ28gPC0gbG9hZF9iaW9tYXJ0X2dvKClbWyJnbyJdXQpoc19sZW5ndGggPC0gaHNfYW5ub3RbLCBjKCJlbnNlbWJsX2dlbmVfaWQiLCAiY2RzX2xlbmd0aCIpXQpjb2xuYW1lcyhoc19sZW5ndGgpIDwtIGMoIklEIiwgImxlbmd0aCIpCmBgYAoKIyBUaGUgZnVsbCBkYXRhc2V0CgpCZWZvcmUgd2UgZG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgc3Vic2V0cy9hbmFseXNlcyBvZiB0aGUgZGF0YSwgd2UKbmVlZCB0byBjb2xsZWN0IGl0IGFsbCBpbiBvbmUgcGxhY2UuICBMZXQncyBkbyB0aGF0IGhlcmUgYW5kIG5hbWUgaXQKJ2hzX3ZhbGlkJyBtZWFuaW5nIGl0IGlzIHRoZSBzZXQgb2YgdmFsaWQgZGF0YSBmb3IgSG9tbyBzYXBpZW5zLgoKYGBge3IgYWxsX2RhdGF9CnNhbml0aXplX2NvbHVtbnMgPC0gYygidmlzaXRudW1iZXIiLCAiY2xpbmljYWxvdXRjb21lIiwgImRvbm9yIiwKICAgICAgICAgICAgICAgICAgICAgICJ0eXBlb2ZjZWxscyIsICJjbGluaWNhbHByZXNlbnRhdGlvbiIsICJkcnVnIiwKICAgICAgICAgICAgICAgICAgICAgICJjb25kaXRpb24iLCAiYmF0Y2giKQpoc19leHB0IDwtIGNyZWF0ZV9leHB0KHNhbXBsZXNoZWV0LAogICAgICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJoZzM4MTAwaGlzYXRmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICBzYXZlZmlsZT1nbHVlOjpnbHVlKCJyZGEvaHNfZXhwdF9hbGwtdnt2ZXJ9LnJkYSIpLAogICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1oc19hbm5vdCkgJT4lCiAgZXhjbHVkZV9nZW5lc19leHB0KGNvbHVtbj0iZ2VuZV9iaW90eXBlIiwgbWV0aG9kPSJrZWVwIiwKICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj0icHJvdGVpbl9jb2RpbmciLCBtZXRhX2NvbHVtbj0ibmNybmFfbG9zdCIpICU+JQogIHNhbml0aXplX2V4cHRfbWV0YWRhdGEoY29sdW1ucz1zYW5pdGl6ZV9jb2x1bW5zKSAlPiUKICBzZXRfZXhwdF9mYWN0b3JzKGNvbHVtbnM9c2FuaXRpemVfY29sdW1ucywgY2xhc3M9ImZhY3RvciIpICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdD0iY2xpbmljYWxvdXRjb21lIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJ2aXNpdG51bWJlciIpCgojIyBUaGUgZm9sbG93aW5nIHNob3VsZCBtYWtlIHZpc2l0IDEgdGhlIGxhcmdlc3QgaWYgb25lIHVzZXMgdGhhdCBjb2x1bW4gYXMgYSBzaXplIGZhY3RvciB3aGVuIHBsb3R0aW5nLgptZXRhIDwtIHBEYXRhKGhzX2V4cHQpICU+JQogIG11dGF0ZSh2aXNpdG51bWJlciA9IGZjdF9yZWxldmVsKHZpc2l0bnVtYmVyLCBjKCJub3RhcHBsaWNhYmxlIiwgIjMiLCAiMiIsICIxIikpKQpwRGF0YShoc19leHB0KSA8LSBtZXRhCmBgYAoKVGhlIGFib3ZlIGJsb2NrIGRvZXMgdGhlIGZvbGxvd2luZzoKCjEuICBDcmVhdGVzIGFuIGV4cHJlc3Npb25zZXQgdXNpbmcgdGhlICdoZzM4MTAwaGlzYXRmaWxlJyBjb2x1bW4gZnJvbQogICAgdGhlIG1vc3QgcmVjZW50bHkgZG93bmxvYWRlZCBzYW1wbGUgc2hlZXQgKHRoZSBjb2x1bW4ncyBuYW1lIGhhcwogICAgYW55IHB1Y3R1YXRpb24vc3BhY2VzL2NhcGl0YWxzL2V0YyByZW1vdmVkKSBhbmQgdGhlIHNldCBvZiBodW1hbgogICAgYW5ub3RhdGlvbnMgZG93bmxvYWRlZCBhYm92ZS4KMi4gIFRoaXMgZXhwcmVzc2lvbnNldCBpcyBwYXNzZWQgdG8gYSBmaWx0ZXIgd2hpY2ggcHVsbHMgb3V0IG9ubHkgdGhlCiAgICBwcm90ZWluX2NvZGluZyBnZW5lcyBhbmQgdXNlcyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGF0IHByb2Nlc3MgdG8KICAgIGFkZCBhIG5ldyBtZXRhZGF0YSBjb2x1bW4gY2FsbGVkICduY3JuYV9sb3N0Jy4gVGh1cyBpdCBrZWVwcyBhCiAgICB0YWxseSBvZiB0aGUgbnVtYmVyIG9mIHJlYWRzIGxvc3QgaW4gdGhlIGZpbHRlciBhbmQgYWRkcyBpdCB0byB0aGUKICAgIHNhbXBsZSBzaGVldC4KMy4gIEl0IGlzIHBhc3NlZCBhZ2FpbiB0byBhIGZ1bmN0aW9uIHdoaWNoIHNhbml0aXplcyB0aGUgbWV0YWRhdGEKICAgICh0aGVyZSB3ZXJlIGEgY291cGxlIG9mIGVudHJpZXMgd2hpY2ggc2FpZCAnY3VyZScgaW5zdGVhZCBvZgogICAgJ0N1cmUnIG9yIHZpY2UgdmVyc2EpIGFuZCBzaW1pbGFybHkgcmVtb3ZlcyBwcm9ibGVtYXRpYwogICAgY2hhcmFjdGVycy4KNC4gIFBhc3NlZCB0byBhIGZ1bmN0aW9uIHdoaWNoIHNldHMgc29tZSBjb2x1bW5zIGV4cGxpY2l0bHkgdG8gZmFjdG9ycwogICAgaW5zdGVhZCBvZiBjaGFyYWN0ZXJzLgo1LiAgU2V0cyB0aGUgZXhwZXJpbWVudGFsICdjb25kaXRpb24nIHRvIHRoZSBmYWN0b3Igb2YgY3VyZSB2cy4gZmFpbC4KNi4gIFNldHMgdGhlIGV4cGVyaW1lbnRhbCAnYmF0Y2gnIHRvIHZpc2l0IG51bWJlci4KNy4gIFJlc2V0cyB0aGUgbGV2ZWxzIG9mIHRoZSB2aXNpdCBudW1iZXIgc28gdGhhdCB0aGUgc2FtcGxlcyB3aGljaAogICAgd2VyZSAnbm90YXBwbGljYWJsZScgYXJlIGxvZ2ljYWxseSBiZWZvcmUgdmlzaXQgMSB3aGljaCBpcyBiZWZvcmUKICAgIDIgYmVmb3JlIDMuCgojIyBBZGQgdGhlIENSRiBwYXRpZW50IG1ldGFkYXRhCgpMZXQgdXMgYWxzbyBtZXJnZSBpbiB0aGUgY2xpbmljaWFuJ3MgbWV0YWRhdGEuICBJIHdvcnJ5IGEgbGl0dGxlIHRoYXQKdGhpcyBtaWdodCBub3QgYmUgYWxsb3dlZCBmb3IgZGJHYXAgZGF0YSwgYnV0IGlmIGl0IGlzIGEgcHJvYmxlbSBJCnN1c3BlY3Qgd2UgY2FuIGp1c3QgcmVtb3ZlIHRoZSBiYWQgY29sdW1ucyBmcm9tIGl0LiAgQWxzbyBub3RlIHRoYXQgSQpyYXJlbHkgdXNlIHRoZSBqb2luIGZ1bmN0aW9uLCBidXQgaXQgaXMgc29tZXdoYXQgcmVxdWlyZWQgaGVyZSBiZWNhdXNlCkkgZG8gbm90IHdhbnQgdG8gcmlzayBzaHVmZmxpbmcgdGhlIG1ldGFkYXRhIHdoZW4gSSBhZGQgdGhlIG5ldwptZXRhZGF0YSwgd2hpY2ggY29tZXMgZnJvbSBhIHNwcmVhZHNoZWV0IHNvcnRlZCBieSBwYXRpZW50LCBub3QKc2FtcGxlLiAgSW4gZG9pbmcgdGhpcyBJIHRoZXJlZm9yZSBqdXN0IGNyZWF0ZWQgYSBuZXcgY29sdW1uICdqb2luJwp3aGljaCBjb250YWlucyB0aGUgc2hhcmVkIGluZm9ybWF0aW9uLCBlLmcuIHRoZSBwYXRpZW50IElECmZyb20gdGhlIGV4aXN0aW5nIG1ldGFkYXRhIGFuZCB0aGUgc2FtZSBJRCBmcm9tIHRoZSBDUkYgZmlsZSB3aGljaCBoYXMKYmVlbiBjb2VyY2VkIGludG8gbG93ZXJjYXNlLgoKYGBge3IgbWVyZ2VfY3JmfQpoc19wZCA8LSBwRGF0YShoc19leHB0KQpzdGFydCA8LSByb3duYW1lcyhoc19wZCkKaHNfY3JmIDwtIG9wZW54bHN4OjpyZWFkLnhsc3goY3JmX21ldGFkYXRhKQpoc19jcmZbWyJqb2luIl1dIDwtIHRvbG93ZXIoaHNfY3JmW1siY29kaWdvX3BhY2llbnRlIl1dKQpoc19wZFtbImpvaW4iXV0gPC0gaHNfcGRbWyJ0dWJlbGFiZWxvcmlnaW4iXV0KdGVzdCA8LSBwbHlyOjpqb2luKGhzX3BkLCBoc19jcmYsIGJ5PSJqb2luIikKdGVzdFtbImpvaW4iXV0gPC0gTlVMTApyb3duYW1lcyh0ZXN0KSA8LSByb3duYW1lcyhoc19wZCkKbmFfaWR4IDwtIGlzLm5hKHRlc3QpCnRlc3RbbmFfaWR4XSA8LSAidW5kZWZpbmVkIgpwRGF0YShoc19leHB0KSA8LSB0ZXN0CmBgYAoKVGhlIGFib3ZlIGJsb2NrIGRvZXMgdGhlIGZvbGxvd2luZzoKCjEuICBFeHRyYWN0cyB0aGUgbWV0YWRhdGEgYW5kIG1ha2VzIGEgY2hhcmFjdGVyIHZlY3RvciBvZiB0aGUgcm93bmFtZXMKICAgIChlLmcuIHRoZSBzYW1wbGUgSURzKS4KMi4gIENyZWF0ZXMgYSB0YWJsZSBvZiB0aGUgY2xpbmljYWwgbWV0YWRhdGEgZnJvbSB0aGUgZmlsZSBJCiAgICBkb3dubG9hZGVkLgozLiAgQ3JlYXRlcyBhICdqb2luJyBjb2x1bW4gZnJvbSBib3RoIHRoZSBleGlzdGluZyBtZXRhZGF0YSBhbmQgdGhlIGNsaW5pY2FsCiAgICBtZXRhZGF0YSB3aGljaCBpcyB0aGUgcGF0aWVudCBjb2RlLCB1c2luZyB3aGF0ZXZlciB0aGUgY29sdW1uCiAgICBuYW1lcyB3ZXJlIGluIGVhY2ggc2hlZXQuCjQuICBKb2lucyB0aGUgdHdvIHRhYmxlcyB1c2luZyB0aGlzIGluZm9ybWF0aW9uLiAgVGhlIGpvaW4gZnVuY3Rpb24gaXMKICAgIGV4cGxpY2l0bHkgdXNlZCBpbiB0aGlzIGNvbnRleHQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHJvdy1vcmRlciBvZgogICAgdGhlIGVudHJpZXMgZG9lcyBub3QgY2hhbmdlLgo1LiAgR2V0cyByaWQgb2YgYW55IGVudHJpZXMgaW4gdGhlIG5ldyB0YWJsZSB3aGljaCBhcmUgTkEuCjYuICBSZXBsYWNlcyB0aGUgbWV0YWRhdGEgb2YgdGhlIGV4cHJlc3Npb25zZXQgd2l0aCB0aGlzIG5ldywgbGFyZ2VyIHRhYmxlLgoKIyBTYW5pdHkgY2hlY2ssIGNsaW5pY2FsIG91dGNvbWUgdnMuIENSRiBkYXRhCgpJbiBvdXIgc2hhcmVkIG9ubGluZSBzYW1wbGUgc2hlZXQgdGhlcmUgaXMgYSBjbGluaWNhbCBvdXRjb21lIGNvbHVtbgp3aGljaCBzaG91bGQgbWF0Y2ggdGhlIGZpbmFsIENSRiBjb2x1bW4gJ2VmX2xjX2VzdGFkb19maW5hbF9lc3R1ZGlvJwp3aXRoIHRoZSBjYXZlYXQgdGhhdCB0aGUgQ1JGIGRhdGEgaXMgbnVtZXJpYzoKCjA6IGN1cmFjaW9uIGRlZmluaXRpdmEKMTogZmFsbCB0ZXJhcGV1dGljYQoyOiBwZXJkaWRhIGRydWFudGUgZWwgc2VndWltaWVudG8KMzogZXhjbHVkaW8gZHVyYW50ZSBlbCBlc3R1ZGlvCgpgYGB7ciBjZl9zYW5pdHl9CnR3b19jb2x1bW5zIDwtIHBEYXRhKGhzX2V4cHQpWywgYygiY2xpbmljYWxvdXRjb21lIiwgImVmX2xjX2VzdGFkb19maW5hbF9lc3R1ZGlvIildCnVuZGVmX2lkeCA8LSB0d29fY29sdW1uc1tbMl1dID09ICJ1bmRlZmluZWQiCnR3b19jb2x1bW5zIDwtIHR3b19jb2x1bW5zWyF1bmRlZl9pZHgsIF0KdHdvX2NvbHVtbnNbWyJyZXdyaXR0ZW4iXV0gPC0gInVuZGVmIgpjdXJlX2lkeCA8LSB0d29fY29sdW1uc1tbMl1dID09IDAKdHdvX2NvbHVtbnNbY3VyZV9pZHgsICJyZXdyaXR0ZW4iXSA8LSAiY3VyZSIKZmFpbF9pZHggPC0gdHdvX2NvbHVtbnNbWzJdXSA9PSAxCnR3b19jb2x1bW5zW2ZhaWxfaWR4LCAicmV3cml0dGVuIl0gPC0gImZhaWx1cmUiCmxvc3RfaWR4IDwtIHR3b19jb2x1bW5zW1syXV0gPT0gMgp0d29fY29sdW1uc1tsb3N0X2lkeCwgInJld3JpdHRlbiJdIDwtICJsb3N0IgpzYW1lX2lkeCA8LSB0d29fY29sdW1uc1tbImNsaW5pY2Fsb3V0Y29tZSJdXSA9PSB0d29fY29sdW1uc1tbInJld3JpdHRlbiJdXQpicm9rZW4gPC0gdHdvX2NvbHVtbnNbIXNhbWVfaWR4LCBdCmJyb2tlbgpgYGAKCiMjIENvbGxlY3Qgc2FtcGxlIG51bWJlcnMgYmVmb3JlIGZpbHRlcmluZwoKYGBge3IgdGFibGVfdmFsaWRfcHJlfQpkaW0ocERhdGEoaHNfZXhwdCkpCnRhYmxlKHBEYXRhKGhzX2V4cHQpJGRydWcpCnRhYmxlKHBEYXRhKGhzX2V4cHQpJGNsaW5pYykKdGFibGUocERhdGEoaHNfZXhwdCkkdHlwZW9mY2VsbHMpCnRhYmxlKHBEYXRhKGhzX2V4cHQpJHZpc2l0KQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfZXhwdCkkZWJfbGNfdGllbXBvX2V2b2x1Y2lvbikpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShoc19leHB0KSRlYl9sY190dG9fbWN0b19nbHVjYW5fZG9zaXMpKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfZXhwdCkkdjNfbGNfZWpleV9sZXNpb25fbW1fMSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShoc19leHB0KSR2M19sY19sZXNpb25fYXJlYV8xKSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKGhzX2V4cHQpJHYzX2xjX2VqZXhfdWxjZXJhX21tXzEpKQp0YWJsZShwRGF0YShoc19leHB0KSRlYl9sY19zZXhvKQp0YWJsZShwRGF0YShoc19leHB0KSRlYl9sY19ldG5pYSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKGhzX2V4cHQpJGVkYWQpKQp0YWJsZShwRGF0YShoc19leHB0KSRlYl9sY19wZXNvKQp0YWJsZShwRGF0YShoc19leHB0KSRlYl9sY19lc3RhdHVyYSkKdGFibGUocERhdGEoaHNfZXhwdCkkY2xpbmljKQoKdGFibGUocERhdGEoaHNfZXhwdCkkZWZfbGNfZXN0YWRvX2ZpbmFsX2VzdHVkaW8pCnRhYmxlKHBEYXRhKGhzX2V4cHQpJGNsaW5pY2Fsb3V0Y29tZSkKYGBgCgojIyBEZWZpbmUgZGVzaXJlZCBjb2xvcnMgZm9yIHRoZSB2YXJpb3VzIHN1YnNldHMKClRoZXJlIGFyZSBsb3RzIG9mIHdheXMgd2hpY2ggd2Ugd2lsbCBjYXRlZ29yaXplIHRoZSBkYXRhLCBoZXJlIGFyZQpzb21lIHBvdGVudGlhbCBjb2xvciBjaG9pY2VzIGZvciB0aGVtLgoKYGBge3IgY29sb3JfY2hvaWNlc30KY2ZfY29sb3JzIDwtIGxpc3QoCiAgICAiY3VyZSIgPSAiIzk5OEVDMyIsCiAgICAiZmFpbHVyZSIgPSAiI0YxQTM0MCIpCnR5cGVfdmlzaXRfY29sb3JzIDwtIGxpc3QoCiAgICAibW9ub2N5dGVzX3YxIiA9ICIjREQxQzc3IiwKICAgICJtb25vY3l0ZXNfdjIiID0gIiNDOTk0QzciLAogICAgIm1vbm9jeXRlc192MyIgPSAiI0U3RTFFRiIsCiAgICAiZW9zaW5vcGhpbHNfdjEiID0gIiMzMUEzNTQiLAogICAgImVvc2lub3BoaWxzX3YyIiA9ICIjQURERDhFIiwKICAgICJlb3Npbm9waGlsc192MyIgPSAiI0Y3RkNEOSIsCiAgICAibmV1dHJvcGhpbHNfdjEiID0gIiMzMTgyQkQiLAogICAgIm5ldXRyb3BoaWxzX3YyIiA9ICIjOUVDQUUxIiwKICAgICJuZXV0cm9waGlsc192MyIgPSAiI0RFRUJGNyIsCiAgICAiYmlvcHN5X3YxIiA9ICIjRDk1RjBFIikKdHlwZV9jb2xvcnMgPC0gbGlzdCgKICAgICJtb25vY3l0ZXMiID0gIiNERDFDNzciLAogICAgImVvc2lub3BoaWxzIiA9ICIjMzFBMzU0IiwKICAgICJuZXV0cm9waGlscyIgPSAiIzMxODJCRCIsCiAgICAiYmlvcHN5IiA9ICIjRDk1RjBFIikKdmlzaXRfY29sb3JzIDwtIGxpc3QoKQpjZl90eXBlX2NvbG9ycyA8LSBsaXN0KAogICAgY3VyZV9iaW9wc3kgPSAiI0Q5NUYwRSIsCiAgICBmYWlsdXJlX2Jpb3BzeSA9ICIjRkVDNDRGIiwKICAgIGN1cmVfbW9ub2N5dGVzID0gIiNERDFDNzciLAogICAgZmFpbHVyZV9tb25vY3l0ZXMgPSAiI0M5OTRDNyIsCiAgICBjdXJlX2Vvc2lub3BoaWxzID0gIiMzMUEzNTQiLAogICAgZmFpbHVyZV9lb3Npbm9waGlscyA9ICIjQURERDhFIiwKICAgIGN1cmVfbmV1dHJvcGhpbHMgPSAiIzMxODJCRCIsCiAgICBmYWlsdXJlX25ldXRyb3BoaWxzID0gIiM5RUNBRTEiKQpgYGAKCk5vdGUgZnJvbSBNYXJpYSBBZGVsYWlkYTogU29tZSBjaGVtb2tpbmVzIGFyZSBzdWdnZXN0aXZlIG9mIEVvc2lub3BoaWwgcmVjcnVpdG1lbnQuCgojIyBEZWZpbmUgdGhlIHN0YXJ0aW5nIGRhdGEKClRoZSBmb2xsb3dpbmcgYmxvY2sgY29udGFpbnMgdGhlIHByaW1hcnkgZGF0YXNldCB3aGljaCBpcyB0aGUgcGFyZW50Cm9mIGV2ZXJ5dGhpbmcgd2hpY2ggZm9sbG93cy4KCiMjIyBTZXQgb3VyIGluaXRpYWwgY292ZXJhZ2UgZ29hbAoKVGhlcmUgZXhpc3RzIGEgYmFzZWxpbmUgY292ZXJhZ2UgYmVsb3cgd2hpY2ggd2UgZG8gbm90IHdpc2ggdG8gZmFsbC4KT25lIGxpa2VseSB3YXkgdG8gYXBwcm9hY2ggaXQgaGV1cmlzdGljYWxseSBpcyB0byBhc3N1bWUgd2Ugc2hvdWxkCm9ic2VydmUgc29tZSBudW1iZXIgb2YgZ2VuZXMuICBXaXRoIHRoYXQgaW4gbWluZCwgSSBhcmJpdHJhcmlseSBjaG9zZQoxMSwwMDAgbm9uLXplcm8gZ2VuZXMgYXMgdGhlIG1pbmltdW0uCgpXaXRoIHRoaXMgaW4gbWluZCwgaGVyZSBpcyBhIG5vbi16ZXJvIHBsb3QgYmVmb3JlIGEgY3V0b2ZmIG9mIDExLDAwMApnZW5lcy4KCmBgYHtyIGhzX3ByZV9uen0KYWxsX256IDwtIHBsb3Rfbm9uemVybyhoc19leHB0KQphbGxfbnokcGxvdApgYGAKClRvIG15IGV5ZXMsIHRoZXJlIGFyZSAzIG9yIDQgc2FtcGxlcyB3aGljaCBhcmUgbGlrZWx5IGNhbmRpZGF0ZXMgZm9yIHJlbW92YWwuCgpgYGB7ciBoc192YWxpZH0KaHNfdmFsaWQgPC0gc3Vic2V0X2V4cHQoaHNfZXhwdCwgbm9uemVybz0xMTAwMCkgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0PSJjbGluaWNhbG91dGNvbWUhPSdsb3N0JyIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldD0iY2xpbmljYWxvdXRjb21lIT0nbm90YXBwbGljYWJsZSciKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQ9ImNsaW5pY2Fsb3V0Y29tZSE9J251bGwnIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNmX2NvbG9ycykKYGBgCgojIyMgQWZ0ZXIgcmVtb3ZhbAoKSGVyZSBpcyB0aGUgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZXMgYWZ0ZXIgZHJvcHBpbmcgdGhlIGxlc3MgdGhhbgoxMSwwMDAgZ2VuZS1zYW1wbGVzLgoKYGBge3IgbnpfcG9zdH0KbnpfcG9zdCA8LSBwbG90X25vbnplcm8oaHNfdmFsaWQpCm56X3Bvc3QkcGxvdApgYGAKCiMjIENvdW50IHVwIHNhbXBsZSB0eXBlcwoKSSByZWNlbnRseSBjb252aW5jZWQgbXlzZWxmIHRoYXQgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCmRhdGEgd2hlbiBpdCBkb2VzIGFuZCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBtaWx0ZWZvc2luZSB0cmVhdGVkCnBhdGllbnRzLgoKSG93ZXZlciwgd2hlbiBJIGFjdHVhbGx5IGNvdW50ZWQgdXAgdGhlIHNhbXBsZXMgYnkgYSBmZXcgY3JpdGVyaWEgSQppbW1lZGlhdGVseSByZWxpemVkIHRoaXMgaXMgc3B1cmlvdXMuCgpgYGB7ciB0YWJsZV92YWxpZH0KdGFibGUocERhdGEoaHNfdmFsaWQpJGRydWcpCnRhYmxlKHBEYXRhKGhzX3ZhbGlkKSRjbGluaWMpCnRhYmxlKHBEYXRhKGhzX3ZhbGlkKSRjbGluaWNhbG91dGNvbWUpCnRhYmxlKHBEYXRhKGhzX3ZhbGlkKSR0eXBlb2ZjZWxscykKdGFibGUocERhdGEoaHNfdmFsaWQpJHZpc2l0KQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfdmFsaWQpJGViX2xjX3RpZW1wb19ldm9sdWNpb24pKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfdmFsaWQpJGViX2xjX3R0b19tY3RvX2dsdWNhbl9kb3NpcykpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShoc192YWxpZCkkdjNfbGNfZWpleV9sZXNpb25fbW1fMSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShoc192YWxpZCkkdjNfbGNfbGVzaW9uX2FyZWFfMSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShoc192YWxpZCkkdjNfbGNfZWpleF91bGNlcmFfbW1fMSkpCnRhYmxlKHBEYXRhKGhzX3ZhbGlkKSRlYl9sY19zZXhvKQp0YWJsZShwRGF0YShoc192YWxpZCkkZWJfbGNfZXRuaWEpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShoc192YWxpZCkkZWRhZCkpCnRhYmxlKHBEYXRhKGhzX3ZhbGlkKSRlYl9sY19wZXNvKQp0YWJsZShwRGF0YShoc192YWxpZCkkZWJfbGNfZXN0YXR1cmEpCnRhYmxlKHBEYXRhKGhzX3ZhbGlkKSRjbGluaWMpCmBgYAoKVGhlIGFib3ZlIGJsb2NrIGRvZXMgd2hhdCBpdCBzYXlzIG9uIHRoZSB0aW4sIHN1YnNldHMgdGhlIGRhdGEgdG8KZXhjbHVkZSBhbnkgc2FtcGxlIHdpdGggbGVzcyB0aGFuIDExLDAwMCBvYnNlcnZlZCBnZW5lcy4KCiMjIFNldCB1cCBpbml0aWFsIGRhdGEgc3Vic2V0cyBvZiBpbnRlcmVzdAoKT25lIG9mIHRoZSBmaXJzdCBnbG9iYWwgbWV0cmljcyBJIHdvdWxkIGxpa2UgdG8gcHJvdmlkZSBpcyB0aGUgc2V0IG9mCmxpYnJhcnkgc2l6ZXMuICBVbmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIHRvbyBtYW55IHNhbXBsZXMgdG8gZml0IG9uIGEKc2NyZWVuIG5vdy4gIFRoZXJlZm9yZSwgSSBhbSBnb2luZyB0byBkbyBhbiBlYXJseSBzcGxpdCBvZiB0aGUgZGF0YSBieQpjZWxsIHR5cGUgaW4gdGhlIGhvcGVzIHRoYXQgZG9pbmcgc28gd2lsbCBtYWtlIGl0IHBvc3NpYmxlIHRvCnZpc3VhbGl6ZSB0aGUgbGlicmFyeSBzaXplcy9ub256ZXJvIGdlbmVzLgoKVGhlIGluaXRpYWwgZmFjdG9yIGZvciB0aGlzIGlzICd0eXBlb2ZjZWxscycuCgpgYGB7ciBpbml0aWFsX3N1YnNldHN9CnRhYmxlKHBEYXRhKGhzX3ZhbGlkKVtbInR5cGVvZmNlbGxzIl1dKQpiaW9wc3lfc2FtcGxlcyA8LSBzdWJzZXRfZXhwdChoc192YWxpZCwgc3Vic2V0PSJ0eXBlb2ZjZWxscz09J2Jpb3BzeSciKQplb3Npbm9waGlsX3NhbXBsZXMgPC0gc3Vic2V0X2V4cHQoaHNfdmFsaWQsIHN1YnNldD0idHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQptb25vY3l0ZV9zYW1wbGVzIDwtIHN1YnNldF9leHB0KGhzX3ZhbGlkLCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCm5ldXRyb3BoaWxfc2FtcGxlcyA8LSBzdWJzZXRfZXhwdChoc192YWxpZCwgc3Vic2V0PSJ0eXBlb2ZjZWxscz09J25ldXRyb3BoaWxzJyIpCgojIyBDdXJyZW50bHksIHRoZXNlIGFyZSBub3QgdXNlZCwgYnV0IGluc3RlYWQgSSBwdWxsZWQgdGhlIHNhbXBsZXMgZnJvbSB0aGUgaHNfY2xpbmljYWwKIyMgd2hpY2ggbWVhbnMgdGhlIGJpb3BzaWVzIGFyZSBub3QgaW5jbHVkZWQuCnYxX3NhbXBsZXMgPC0gc3Vic2V0X2V4cHQoaHNfdmFsaWQsIHN1YnNldD0idmlzaXRudW1iZXI9PScxJyIpCnYxX21vbm9jeXRlcyA8LSBzdWJzZXRfZXhwdCh2MV9zYW1wbGVzLCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnYxX25ldXRyb3BoaWxzIDwtIHN1YnNldF9leHB0KHYxX3NhbXBsZXMsIHN1YnNldD0idHlwZW9mY2VsbHM9PSduZXV0cm9waGlscyciKQp2MV9lb3Npbm9waGlscyA8LSBzdWJzZXRfZXhwdCh2MV9zYW1wbGVzLCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nZW9zaW5vcGhpbHMnIikKCnYyX3NhbXBsZXMgPC0gc3Vic2V0X2V4cHQoaHNfdmFsaWQsIHN1YnNldD0idmlzaXRudW1iZXI9PScyJyIpCnYyX21vbm9jeXRlcyA8LSBzdWJzZXRfZXhwdCh2Ml9zYW1wbGVzLCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnYyX25ldXRyb3BoaWxzIDwtIHN1YnNldF9leHB0KHYyX3NhbXBsZXMsIHN1YnNldD0idHlwZW9mY2VsbHM9PSduZXV0cm9waGlscyciKQp2Ml9lb3Npbm9waGlscyA8LSBzdWJzZXRfZXhwdCh2Ml9zYW1wbGVzLCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nZW9zaW5vcGhpbHMnIikKCnYzX3NhbXBsZXMgPC0gc3Vic2V0X2V4cHQoaHNfdmFsaWQsIHN1YnNldD0idmlzaXRudW1iZXI9PSczJyIpCnYzX21vbm9jeXRlcyA8LSBzdWJzZXRfZXhwdCh2M19zYW1wbGVzLCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnYzX25ldXRyb3BoaWxzIDwtIHN1YnNldF9leHB0KHYzX3NhbXBsZXMsIHN1YnNldD0idHlwZW9mY2VsbHM9PSduZXV0cm9waGlscyciKQp2M19lb3Npbm9waGlscyA8LSBzdWJzZXRfZXhwdCh2M19zYW1wbGVzLCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nZW9zaW5vcGhpbHMnIikKYGBgCgpUaGUgYWJvdmUgYmxvY2sgZG9lcyBhIGxvdCBvZiBzdWJzZXQgb3BlcmF0aW9ucyB0byBjcmVhdGUgc2VwYXJhdGUKZGF0YSBzdHJ1Y3R1cmVzIG9uIGEgcGVyLWNlbGx0eXBlIGFuZCBwZXItdmlzaXQgYmFzaXMuICBFcmdvLCBvdXIKbGFyZ2UgZGF0YSBzdHJ1Y3R1cmUgaXMgbm93IGpvaW5lZCBieSB+MjEgbmV3LCBzbWFsbGVyIGRhdGEKc3RydWN0dXJlcy4KCiMgUGFyYXNpdGUgcmVhZHMKCkxldCB1cyBzZWUgaWYgd2UgY2FuIG1ha2UgYW4gZXhwcmVzc2lvbnNldCBvZiB0aGUgcGFyYXNpdGUgcmVhZHMgaW4KdGhlIFRNUkMzIHNhbXBsZXMgYW5kIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGZhdXggYW5kIHJlYWwgcmVhZHMuCkUuZzogQXJlIHRoZXJlIHNhbXBsZXMgd2hpY2ggZGVmaW5pdGl2ZWx5IGNvbnRhaW4gcGFyYXNpdGVzPwoKYGBge3IgcGFyYXNpdGVfZXhwdH0KbHBfZXhwdCA8LSBjcmVhdGVfZXhwdChzYW1wbGVzaGVldCwKICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2NvbHVtbj0ibHBhbmFtZW5zaXN2MzZoaXNhdGZpbGUiLCBnZW5lX2luZm8gPSBOVUxMKSAlPiUKICBzdWJzZXRfZXhwdChjb3ZlcmFnZT0xMDAwKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3Q9InR5cGVvZmNlbGxzIikKdmlzaXRfZmFjdCA8LSBwRGF0YShscF9leHB0KVtbInZpc2l0bnVtYmVyIl1dCmJhdGNoX25hIDwtIGlzLm5hKHZpc2l0X2ZhY3QpCnZpc2l0X2ZhY3RbYmF0Y2hfbmFdIDwtICJ1bmRlZmluZWQiCmxwX2V4cHQgPC0gc2V0X2V4cHRfYmF0Y2hlcyhscF9leHB0LCBmYWN0ID0gdmlzaXRfZmFjdCkKCmxwX25vcm0gPC0gbm9ybWFsaXplX2V4cHQobHBfZXhwdCwgZmlsdGVyPSJzaW1wbGUiLCBub3JtPSJxdWFudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgdHJhbnNmb3JtPSJsb2cyIikKcGxvdHRlZCA8LSBwbG90X3BjYShscF9ub3JtLCBwbG90X2xhYmVscz1GQUxTRSkKcGxvdHRlZCRwbG90CnBsb3R0ZWRfM2QgPC0gcGxvdF8zZF9wY2EocGxvdHRlZCkKYGBgCgpUaGUgYWJvdmUgYmxvY2sgaXMgc2ltaWxhciBpbiBjb25jZXB0IHRvIHRoZSBwcmV2aW91cyBleHByZXNzaW9uc2V0CmNyZWF0aW9uLiAgSXQgdXNlcyBhIGRpZmZlcmVudCBjb2x1bW4gYW5kIGN1cnJlbnRseSBpZ25vcmVzIHRoZSBnZW5lCmFubm90YXRpb25zLiAgR2l2ZW4gdGhhdCBtYW55IG9mIHRoZSBzYW1wbGVzIGhhdmUgZXNzZW50aWFsbHkgMCByZWFkcywKSSBzZXQgYSBjdXRvZmYgb2Ygb25seSAyMCBvYnNlcnZlZCBnZW5lcy4gIEZpbmFsbHksIEkgZGlkIGEgcXVpY2sgYW5kCmRpcnR5IFBDQSBwbG90IG9mIHRoaXMgcGVjdWxpYXIgZGF0YSBzdHJ1Y3R1cmUgaW4gdGhlIGhvcGVzIG9mIGJlaW5nCmFibGUgdG8gJ3NlZScgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3aGF0IGFyZSBhc3N1bWVkIHRvIGJlICdyZWFsJwpzYW1wbGVzIHdpdGggYSBzaWduaWZpY2FudCBudW1iZXIgb2YgJ3JlYWwnIHBhcmFzaXRlIHJlYWRzIHZzLiB0aG9zZQpzYW1wbGVzIHdoaWNoIGp1c3QgaGF2ZSBhIGNvdXBsZSBvZiBwb3RlbnRpYWxseSBzcHVyaW91cyByZWFkcy4KCiMgRGlzdHJpYnV0aW9ucy9WaXN1YWxpemF0aW9ucyBvZiBpbnRlcmVzdAoKVGhlIHNldHMgb2Ygc2FtcGxlcyB1c2VkIHRvIHZpc3VhbGl6ZSB0aGUgZGF0YSB3aWxsIGFsc28gY29tcHJpc2UgdGhlCnNldHMgdXNlZCB3aGVuIGxhdGVyIHBlcmZvcm1pbmcgdGhlIHZhcmlvdXMgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24KYW5hbHlzZXMuCgojIyBHbG9iYWwgbWV0cmljcwoKU3RhcnQgb3V0IHdpdGggc29tZSBpbml0aWFsIG1ldHJpY3Mgb2YgYWxsIHNhbXBsZXMuICBUaGUgbW9zdCBvYnZpb3VzCmFyZSBwbG90cyBvZiB0aGUgbnVtYmVycyBvZiBub24temVybyBnZW5lcyBvYnNlcnZlZCwgaGVhdG1hcHMgc2hvd2luZwp0aGUgcmVsYXRpdmUgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgc2FtcGxlcywgdGhlIHJlbGF0aXZlIGxpYnJhcnkKc2l6ZXMsIGFuZCBzb21lIFBDQS4gIEl0IG1pZ2h0IGJlIHNtYXJ0IHRvIHNwbGl0IHRoZSBsaWJyYXJ5IHNpemVzIHVwCmFjcm9zcyBzdWJzZXRzIG9mIHRoZSBkYXRhLCBiZWNhdXNlIHRoZXkgaGF2ZSBleHBhbmRlZCB0b28gZmFyIHRvIHNlZQp3ZWxsIG9uIGEgY29tcHV0ZXIgc2NyZWVuLgoKVGhlIG1vc3QgbGlrZWx5IGZhY3RvcnMgdG8gcXVlcnkgd2hlbiBjb25zaWRlcmluZyB0aGUgZW50aXJlIGRhdGFzZXQKYXJlIGN1cmUvZmFpbCwgdmlzaXQsIGFuZCBjZWxsIHR5cGUuICBUaGlzIGlzIHRoZSBsZXZlbCBhdCB3aGljaCB3ZQp3aWxsIGNob29zZSBzYW1wbGVzIHRvIGV4Y2x1ZGUgZnJvbSBmdXR1cmUgYW5hbHlzZXMuCgpgYGB7ciBnbG9iYWxfZGlzdHJpYnV0aW9uc30KcGxvdF9sZWdlbmQoYmlvcHN5X3NhbXBsZXMpJHBsb3QKcGxvdF9saWJzaXplKGJpb3BzeV9zYW1wbGVzKSRwbG90CnBsb3Rfbm9uemVybyhiaW9wc3lfc2FtcGxlcykkcGxvdApiaW9wc3lfcHJlcG9zdCA8LSBwbG90X2xpYnNpemVfcHJlcG9zdChiaW9wc3lfc2FtcGxlcykKYmlvcHN5X3ByZXBvc3QkY291bnRfcGxvdApiaW9wc3lfcHJlcG9zdCRsb3dnZW5lX3Bsb3QKIyMgTWluaW11bSBudW1iZXIgb2YgYmlvcHN5IGdlbmVzOiB+IDE0LDAwMAoKcGxvdF9saWJzaXplKGVvc2lub3BoaWxfc2FtcGxlcykkcGxvdApwbG90X25vbnplcm8oZW9zaW5vcGhpbF9zYW1wbGVzKSRwbG90CmVvc2lub3BoaWxfcHJlcG9zdCA8LSBwbG90X2xpYnNpemVfcHJlcG9zdChlb3Npbm9waGlsX3NhbXBsZXMpCmVvc2lub3BoaWxfcHJlcG9zdCRjb3VudF9wbG90CmVvc2lub3BoaWxfcHJlcG9zdCRsb3dnZW5lX3Bsb3QKIyMgTWluaW11bSBudW1iZXIgb2YgZW9zaW5vcGhpbCBnZW5lczogfiAxMyw1MDAKCnBsb3RfbGlic2l6ZShtb25vY3l0ZV9zYW1wbGVzKSRwbG90CnBsb3Rfbm9uemVybyhtb25vY3l0ZV9zYW1wbGVzKSRwbG90Cm1vbm9jeXRlX3ByZXBvc3QgPC0gcGxvdF9saWJzaXplX3ByZXBvc3QobW9ub2N5dGVfc2FtcGxlcykKbW9ub2N5dGVfcHJlcG9zdCRjb3VudF9wbG90Cm1vbm9jeXRlX3ByZXBvc3QkbG93Z2VuZV9wbG90CiMjIE1pbmltdW0gbnVtYmVyIG9mIG1vbm9jeXRlIGdlbmVzOiB+IDcsNTAwIGJlZm9yZSBzZXR0aW5nIHRoZSBtaW5pbXVtLgoKcGxvdF9saWJzaXplKG5ldXRyb3BoaWxfc2FtcGxlcykkcGxvdApwbG90X25vbnplcm8obmV1dHJvcGhpbF9zYW1wbGVzKSRwbG90Cm5ldXRyb3BoaWxfcHJlcG9zdCA8LSBwbG90X2xpYnNpemVfcHJlcG9zdChuZXV0cm9waGlsX3NhbXBsZXMpCm5ldXRyb3BoaWxfcHJlcG9zdCRjb3VudF9wbG90Cm5ldXRyb3BoaWxfcHJlcG9zdCRsb3dnZW5lX3Bsb3QKIyMgTWluaW11bSBudW1iZXIgb2YgbmV1dHJvcGhpbCBnZW5lczogfiAxMCwwMDAgYmVmb3JlIHNldHRpbmcgbWluaW11bSBjb3ZlcmFnZS4KYGBgCgpUaGUgYWJvdmUgYmxvY2sganVzdCByZXBlYXRzIHRoZSBzYW1lIHR3byBwbG90cyBvbiBhIHBlci1jZWxsdHlwZQpiYXNpczogdGhlIG51bWJlciBvZiByZWFkcyBvYnNlcnZlZCAvIHNhbXBsZSBhbmQgYSBwbG90IG9mIG9ic2VydmVkCmdlbmVzIHdpdGggcmVzcGVjdCB0byBjb3ZlcmFnZS4gIEkgbWFkZSBzb21lIGNvbW1lbnRzIHdpdGggbXkKb2JzZXJ2YXRpb25zIGFib3V0IHRoZSBudW1iZXIgb2YgZ2VuZXMuCgojIyBHbG9iYWwgUENBCgpOb3cgdGhhdCB0aG9zZSAnZ2xvYmFsJyBtZXRyaWNzIGFyZSBvdXQgb2YgdGhlIHdheSwgbGV0cyBsb29rIGF0IHNvbWUKZ2xvYmFsIG1ldHJpY3Mgb2YgdGhlIGRhdGEgZm9sbG93aW5nIG5vcm1hbGl6YXRpb247IHRoZSBtb3N0IGxpa2VseQpwbG90cyBhcmUgb2YgY291cnNlIFBDQSBidXQgYWxzbyBhIGNvdXBsZSBvZiBoZWF0bWFwcy4KCiMjIyBGaWd1cmUgMQoKSW4gdGhlIGdvb2dsZSBkb2MgVE1SQzNfQXVnMThfMjAyMSwgdGhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhbiBpbWFnZQpmb3IgdGhlIGZpcnN0IGZpZ3VyZToKCiJUcmFuc2NyaXB0b21pYyBwcm9maWxlcyBvZiBwcmltYXJ5IGlubmF0ZSBjZWxscyBvZiBDTCBwYXRpZW50cyBzaG93CnVuaXF1ZSB0cmFuc2NyaXB0aW9uYWwgc2lnbmF0dXJlcyAtIFJlbW92ZSBQQk1DcyBhbmQgTTAsIG1heWJlCmJpb3BzaWVzIGFzIHdlbGwgKGJ1dCBSZW1vdmUgV1Qgc2FtcGxlcykiCgpXaGlsZSB3ZSB3ZXJlIHRhbGtpbmcgaW4gYSBtZWV0aW5nIGhvd2V2ZXIsIGl0IHNvdW5kZWQgbGlrZSB0aGVyZSB3YXMKc29tZSBkZXNpcmUgdG8ga2VlcCBhbGwgY2VsbCB0eXBlcy4gIFRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIGJsb2NrCndpbGwgaGF2ZSBvbmUgaW1hZ2Ugd2l0aCBldmVyeXRoaW5nIGFuZCBvbmUgZm9sbG93aW5nIHRoZSBhYm92ZS4KCmBgYHtyIGdsb2JhbF9wY2F9CnR5cGVfdmFsaWQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhoc192YWxpZCwgZmFjdD0idHlwZW9mY2VsbHMiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9ImNsaW5pY2Fsb3V0Y29tZSIpICU+JQogIHNldF9leHB0X2NvbG9ycyh0eXBlX2NvbG9ycykKCmFsbF9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHR5cGVfdmFsaWQsIHRyYW5zZm9ybT0ibG9nMiIsIG5vcm09InF1YW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgZmlsdGVyPVRSVUUpKQoKYWxsX3BjYSA8LSBwbG90X3BjYShhbGxfbm9ybSwgcGxvdF9sYWJlbHM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgcGxvdF90aXRsZT0iUENBIC0gQ2VsbCB0eXBlIiwgc2l6ZV9jb2x1bW49InZpc2l0bnVtYmVyIikKZGV2IDwtIHBwKGZpbGU9Z2x1ZSgiaW1hZ2VzL3RtcmMzX3BjYV9ub2xhYmVscy12e3Zlcn0ucG5nIikpCmFsbF9wY2EkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCmFsbF9wY2EkcGxvdAoKYWxsX3BjYV9ub3NpemUgPC0gcGxvdF9wY2EoYWxsX25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFKQphbGxfcGNhX25vc2l6ZSRwbG90Cgp3cml0ZS5jc3YoYWxsX3BjYSR0YWJsZSwgZmlsZT0iY29vcmRzL2hzX2Rvbm9yX3BjYV9jb29yZHMuY3N2IikKYWxsX2NmX25vcm0gPC0gc2V0X2V4cHRfYmF0Y2hlcyhhbGxfbm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0PSJ2aXNpdG51bWJlciIpCmFsbF9jZl9jb3JoZWF0IDwtIHBsb3RfY29yaGVhdChhbGxfY2Zfbm9ybSwgcGxvdF90aXRsZT0iSGVpcmFyY2hpY2FsIGNsdXN0ZXJpbmc6CiAgICAgICAgIGNlbGwgdHlwZXMiKQoKZGV2IDwtIHBwKGZpbGU9Z2x1ZSgiaW1hZ2VzL3RtcmMzX2NvcmhlYXRfY2Ytdnt2ZXJ9LnBuZyIpKQphbGxfY2ZfY29yaGVhdCRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKYWxsX2NmX2NvcmhlYXQkcGxvdAoKYWxsX2NmX2Rpc2hlYXQgPC0gcGxvdF9kaXNoZWF0KGFsbF9jZl9ub3JtLCBwbG90X3RpdGxlPSJIZWlyYXJjaGljYWwgY2x1c3RlcmluZzoKICAgICAgICAgY2VsbCB0eXBlcyIpCmRldiA8LSBwcChmaWxlPWdsdWUoImltYWdlcy90bXJjM19kaXNoZWF0X2NmLXZ7dmVyfS5wbmciKSkKYWxsX2NmX2Rpc2hlYXQkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCmFsbF9jZl9kaXNoZWF0JHBsb3QKYGBgCgojIyBGaWd1cmUgMUI6IFRyYW5zY3JpcHRvbWljIHByb2ZpbGVzIG9mIHByaW1hcnkgaW5uYXRlCgpUaGUgYmlnZ2VzdCBjYXZlYXQgZm9yIHRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlIG5vIFdlbGxjb21lClRydXN0IHNhbXBsZXMuCgpBIHBvdGVudGlhbCBmaWd1cmUgbGVnZW5kIGZvciB0aGUgZm9sbG93aW5nIGltYWdlcyBtaWdodCBpbmNsdWRlOgoKVGhlIG9ic2VydmVkIGNvdW50cyBwZXIgZ2VuZSBmb3IgYWxsIG9mIHRoZSBjbGluaWNhbCBzYW1wbGVzIHdlcmUKZmlsdGVyZWQsIGxvZyB0cmFuc2Zvcm1lZCwgY3BtIGNvbnZlcnRlZCwgYW5kIHF1YW50aWxlIG5vcm1hbGl6ZWQuClRoZSBjb2xvcnMgd2VyZSBkZWZpbmVkIGJ5IGNlbGwgdHlwZXMgYW5kIHNoYXBlcyBieSBwYXRpZW50IHZpc2l0LgpXaGVuIHRoZSBmaXJzdCB0d28gcHJpbmNpcGxlIGNvbXBvbmVudHMgd2VyZSBwbG90dGVkLCBjbHVzdGVyaW5nIHdhcwpvYnNlcnZlZCBieSBjZWxsIHR5cGUuICBUaGUgYmlvcHN5IHNhbXBsZXMgd2VyZSBzaWduaWZpY2FudGx5CmRpZmZlcmVudCBmcm9tIHRoZSBpbm5hdGUgaW1tdW5lIGNlbGwgdHlwZXMuCgpgYGB7ciBmaWcxYl90cmFuc2NyaXB0b21pY19wcm9maWxlc30KZmlnMXYyX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodHlwZV92YWxpZCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkKZmlnMXYyX3BjYSA8LSBwbG90X3BjYShmaWcxdjJfbm9ybSwgY2lzPUZBTFNFKQpkZXYgPC0gcHAoZmlsZT1nbHVlKCJpbWFnZXMvdG1yYzNfZmlnMXYyLnBuZyIpKQpmaWcxdjJfcGNhJHBsb3QKY2xvc2VkIDwtIGRldi5vZmYoKQpmaWcxdjJfcGNhJHBsb3QKCmZpZzF2M19zYW1wbGVzIDwtIHN1YnNldF9leHB0KHR5cGVfdmFsaWQsIHN1YnNldD0iY29uZGl0aW9uIT0nYmlvcHN5JyIpCmZpZzF2M19ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGZpZzF2M19zYW1wbGVzLCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKQpmaWcxdjNfcGNhIDwtIHBsb3RfcGNhKGZpZzF2M19ub3JtLCBjaXM9RkFMU0UpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvdG1yYzNfZmlnMXYzLnBuZyIpCmZpZzF2M19wY2EkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCmZpZzF2M19wY2EkcGxvdApgYGAKCkNvbnRpbnVlIGxvb2tpbmcsIGJ1dCBzd2l0Y2ggdGhlIGNvbmRpdGlvbnMvY29sb3JzIHNvIHRoYXQgdGhlCmNsaW5pY2FsIG91dGNvbWUgYmVjb21lcyB0aGUgZm9jdXMgYW5kIGdldCByaWQgb2YgYSBmZXcgc2FtcGxlcyB3aGljaAphcmUgbm90IGFjdHVhbGx5IGEgcGFydCBvZiB0aGUgVE1SQzMgZm9jdXMgKGUuZy4gdGhlIFBCTUMgYW5kCm1hY3JvcGhhZ2Ugc2FtcGxlcywgd2hpY2ggYXJlIGFsbCBmcm9tIHRoZSBXZWxsY29tZSBUcnVzdCkuCgojIyMgQ2xpbmljYWxseSByZWxldmFudCBzYW1wbGVzCgpJbmNsdWRlZCBpbiB0aGlzIGdyb3VwIHdpbGwgYmUgdGhlIHNhbXBsZXMgZnJvbSBwYXRpZW50cyB3aG8gd2VyZSBsb3N0LgoKIyMjIyBSZW1vdmUgdGhlIGxvc3Qgc2FtcGxlcwoKSW4gb3VyIDIwMjIwMjE4IG1lZXRpbmcsIGl0IHdhcyBkZWNpZGVkIHRoYXQgd2Ugd291bGQgZm9jdXMgZXhwbGljaXRseQpvbiB0aGUgY3VyZSBhbmQgZmFpbCBzYW1wbGVzLCBpZ25vcmluZyBsb3N0L05BL251bGwgc2FtcGxlcy4KClRodXMgSSBhbSBhZGRpbmcgZXhwbGljaXQgZmlsdGVycyByaWdodCBhdCB0aGUgdG9wIHRvIGV4Y2x1ZGUgdGhlbS4KCiMjIyMgU2FtcGxlcyBieSBjbGluaWMKCmBgYHtyIGNsaW5pY2FsX2hzfQpoc19jbGluaWNhbCA8LSBoc192YWxpZCAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3Q9ImNsaW5pY2Fsb3V0Y29tZSIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdD0idHlwZW9mY2VsbHMiKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY2ZfY29sb3JzKQoKaHNfY2xpbmljYWxfbm9iaW9wIDwtIHN1YnNldF9leHB0KGhzX2NsaW5pY2FsLCBzdWJzZXQ9InR5cGVvZmNlbGxzIT0nYmlvcHN5JyIpCmBgYAoKIyMjIyBWaWV3IGJpb3BzaWVzCgpgYGB7ciBjbGluaWNfYmlvcHNpZXNfcGNhfQpjbGluaWNfYmlvcHN5IDwtIGhzX3ZhbGlkICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdD0iY2xpbmljIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJjbGluaWNhbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQ9InR5cGVvZmNlbGxzPT0nYmlvcHN5JyIpCmNsaW5pY19jZiA8LSBwYXN0ZTAocERhdGEoY2xpbmljX2Jpb3BzeSkkY29uZGl0aW9uLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgcERhdGEoY2xpbmljX2Jpb3BzeSkkYmF0Y2gpCnRhYmxlKGNsaW5pY19jZikKY2xpbmljX2Jpb3BzeSA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGNsaW5pY19iaW9wc3ksIGZhY3Q9Y2xpbmljX2NmKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9InZpc2l0bnVtYmVyIikKCmNsaW5pY19iaW9wc3lfbm9ybSA8LSBub3JtYWxpemVfZXhwdChjbGluaWNfYmlvcHN5LCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkKY2xpbmljX2Jpb3BzeV9wY2EgPC0gcGxvdF9wY2EoY2xpbmljX2Jpb3BzeV9ub3JtLCBwbG90X2xhYmVscz1GQUxTRSkKZGV2IDwtIHBwKGZpbGU9ImltYWdlcy9iaW9wc3lfcGxhY2UucG5nIikKY2xpbmljX2Jpb3BzeV9wY2EkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCmNsaW5pY19iaW9wc3lfcGNhJHBsb3QKCmNsaW5pY19iaW9wc3lfbmIgPC0gbm9ybWFsaXplX2V4cHQoY2xpbmljX2Jpb3BzeSwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBiYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpCmNsaW5pY19iaW9wc3lfbmJfcGNhIDwtIHBsb3RfcGNhKGNsaW5pY19iaW9wc3lfbmIsIHBsb3RfbGFiZWxzPUZBTFNFKQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL2Jpb3BzeV9wbGFjZV9uYi5wbmciKQpjbGluaWNfYmlvcHN5X25iX3BjYSRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKY2xpbmljX2Jpb3BzeV9uYl9wY2EkcGxvdApgYGAKCiMjIyMgQ2xpbmljIEVvc2lub3BoaWxzCgpgYGB7ciBjbGluaWNfZW9zaW5vcGhpbF9wY2F9CmNsaW5pY19lb3Npbm9waGlsIDwtIGhzX2NsaW5pY2FsICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdD0iY2xpbmljIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJjbGluaWNhbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQ9InR5cGVvZmNlbGxzPT0nZW9zaW5vcGhpbHMnIikKY2xpbmljX2NmIDwtIHBhc3RlMChwRGF0YShjbGluaWNfZW9zaW5vcGhpbCkkY29uZGl0aW9uLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgcERhdGEoY2xpbmljX2Vvc2lub3BoaWwpJGJhdGNoKQp0YWJsZShjbGluaWNfY2YpCmNsaW5pY19lb3Npbm9waGlsIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoY2xpbmljX2Vvc2lub3BoaWwsIGZhY3Q9Y2xpbmljX2NmKSAlPiUKICAgIHNldF9leHB0X2JhdGNoZXMoZmFjdD0idmlzaXRudW1iZXIiKQoKY2xpbmljX2Vvc2lub3BoaWxfbm9ybSA8LSBub3JtYWxpemVfZXhwdChjbGluaWNfZW9zaW5vcGhpbCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKQpjbGluaWNfZW9zaW5vcGhpbF9wY2EgPC0gcGxvdF9wY2EoY2xpbmljX2Vvc2lub3BoaWxfbm9ybSwgcGxvdF9sYWJlbHM9RkFMU0UpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvZW9zaW5vcGhpbF9wbGFjZS5wbmciKQpjbGluaWNfZW9zaW5vcGhpbF9wY2EkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCmNsaW5pY19lb3Npbm9waGlsX3BjYSRwbG90CgpjbGluaWNfZW9zaW5vcGhpbF9uYiA8LSBub3JtYWxpemVfZXhwdChjbGluaWNfZW9zaW5vcGhpbCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKQpjbGluaWNfZW9zaW5vcGhpbF9uYl9wY2EgPC0gcGxvdF9wY2EoY2xpbmljX2Vvc2lub3BoaWxfbmIsIHBsb3RfbGFiZWxzPUZBTFNFKQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL2Vvc2lub3BoaWxfcGxhY2VfbmIucG5nIikKY2xpbmljX2Vvc2lub3BoaWxfbmJfcGNhJHBsb3QKY2xvc2VkIDwtIGRldi5vZmYoKQpjbGluaWNfZW9zaW5vcGhpbF9uYl9wY2EkcGxvdApgYGAKCiMjIyMgQ2xpbmljIE1vbm9jeXRlCgpgYGB7ciBjbGluaWNfbW9ub2N5dGVfcGNhfQpjbGluaWNfbW9ub2N5dGUgPC0gaHNfY2xpbmljYWwgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0PSJjbGluaWMiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9ImNsaW5pY2Fsb3V0Y29tZSIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldD0idHlwZW9mY2VsbHM9PSdtb25vY3l0ZXMnIikKY2xpbmljX2NmIDwtIHBhc3RlMChwRGF0YShjbGluaWNfbW9ub2N5dGUpJGNvbmRpdGlvbiwgIl8iLAogICAgICAgICAgICAgICAgICAgIHBEYXRhKGNsaW5pY19tb25vY3l0ZSkkYmF0Y2gpCnRhYmxlKGNsaW5pY19jZikKY2xpbmljX21vbm9jeXRlIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoY2xpbmljX21vbm9jeXRlLCBmYWN0PWNsaW5pY19jZikgJT4lCiAgICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9InZpc2l0bnVtYmVyIikKCmNsaW5pY19tb25vY3l0ZV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGNsaW5pY19tb25vY3l0ZSwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkKY2xpbmljX21vbm9jeXRlX3BjYSA8LSBwbG90X3BjYShjbGluaWNfbW9ub2N5dGVfbm9ybSwgcGxvdF9sYWJlbHM9RkFMU0UpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbW9ub2N5dGVzX3BsYWNlLnBuZyIpCmNsaW5pY19tb25vY3l0ZV9wY2EkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCmNsaW5pY19tb25vY3l0ZV9wY2EkcGxvdAoKY2xpbmljX21vbm9jeXRlX25iIDwtIG5vcm1hbGl6ZV9leHB0KGNsaW5pY19tb25vY3l0ZSwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ9ImNwbSIsIGJhdGNoPSJzdmFzZXEiLCBmaWx0ZXI9VFJVRSkKY2xpbmljX21vbm9jeXRlX25iX3BjYSA8LSBwbG90X3BjYShjbGluaWNfbW9ub2N5dGVfbmIsIHBsb3RfbGFiZWxzPUZBTFNFKQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL21vbm9jeXRlc19wbGFjZV9uYi5wbmciKQpjbGluaWNfbW9ub2N5dGVfbmJfcGNhJHBsb3QKY2xvc2VkIDwtIGRldi5vZmYoKQpjbGluaWNfbW9ub2N5dGVfbmJfcGNhJHBsb3QKYGBgCgojIyBDbGluaWMgTmV1dHJvcGhpbHMKCmBgYHtyIGNsaW5pY19uZXV0cm9waGlsX3BjYX0KY2xpbmljX25ldXRyb3BoaWwgPC0gaHNfY2xpbmljYWwgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0PSJjbGluaWMiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9ImNsaW5pY2Fsb3V0Y29tZSIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldD0idHlwZW9mY2VsbHM9PSduZXV0cm9waGlscyciKQpjbGluaWNfY2YgPC0gcGFzdGUwKHBEYXRhKGNsaW5pY19uZXV0cm9waGlsKSRjb25kaXRpb24sICJfIiwKICAgICAgICAgICAgICAgICAgICBwRGF0YShjbGluaWNfbmV1dHJvcGhpbCkkYmF0Y2gpCnRhYmxlKGNsaW5pY19jZikKY2xpbmljX25ldXRyb3BoaWwgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhjbGluaWNfbmV1dHJvcGhpbCwgZmFjdD1jbGluaWNfY2YpICU+JQogICAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJ2aXNpdG51bWJlciIpCgpjbGluaWNfbmV1dHJvcGhpbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGNsaW5pY19uZXV0cm9waGlsLCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpCmNsaW5pY19uZXV0cm9waGlsX3BjYSA8LSBwbG90X3BjYShjbGluaWNfbmV1dHJvcGhpbF9ub3JtLCBwbG90X2xhYmVscz1GQUxTRSkKZGV2IDwtIHBwKGZpbGU9ImltYWdlcy9uZXV0cm9waGlsX3BsYWNlLnBuZyIpCmNsaW5pY19uZXV0cm9waGlsX3BjYSRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKY2xpbmljX25ldXRyb3BoaWxfcGNhJHBsb3QKCmNsaW5pY19uZXV0cm9waGlsX25iIDwtIG5vcm1hbGl6ZV9leHB0KGNsaW5pY19uZXV0cm9waGlsLCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBiYXRjaD0ic3Zhc2VxIiwgZmlsdGVyPVRSVUUpCmNsaW5pY19uZXV0cm9waGlsX25iX3BjYSA8LSBwbG90X3BjYShjbGluaWNfbmV1dHJvcGhpbF9uYiwgcGxvdF9sYWJlbHM9RkFMU0UpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbmV1dHJvcGhpbF9wbGFjZV9uYi5wbmciKQpjbGluaWNfbmV1dHJvcGhpbF9uYl9wY2EkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCmNsaW5pY19uZXV0cm9waGlsX25iX3BjYSRwbG90CmBgYAoKIyMjIE9ubHkgVHVtYWNvIHNhbXBsZXMKCkEgbWFqb3JpdHkgb2Ygc2FtcGxlcyBjYW1lIGZyb20gdHVtYWNvLCBsZXQgdXMgc2VlIHdoYXQgaGFwcGVucyBpZiB3ZSBsaW1pdCB0aGUgZGF0YSB0byB0aGVtLgoKTGV0IHVzIHRoZXJlZm9yZSBjb25zaWRlciBhIGNvdXBsZSBvZiBkaWZmZXJlbnQgdmlldyBvZiB0aGlzIHBvcnRpb24gb2YgdGhlIGRhdGEuCgpgYGB7ciB0dW1hY29fb25seX0KdHVtYWNvX2NsaW5pY2FsIDwtIGhzX2NsaW5pY2FsICU+JQogIHN1YnNldF9leHB0KHN1YnNldD0iY2xpbmljPT0nVHVtYWNvJyIpCgp0dW1hY29fbW9ub2N5dGUgPC0gdHVtYWNvX2NsaW5pY2FsICU+JQogIHN1YnNldF9leHB0KHN1YnNldD0idHlwZW9mY2VsbHM9PSdtb25vY3l0ZXMnIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0PSJjbGluaWNhbG91dGNvbWUiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9InZpc2l0bnVtYmVyIikgJT4lCiAgc2V0X2V4cHRfc2FtcGxlbmFtZXMoInR1YmVsYWJlbG9yaWdpbiIpCnR1bWFjb19tb25vY3l0ZV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHR1bWFjb19tb25vY3l0ZSwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkKCnR1bWFjb19tb25vY3l0ZV9wY2EgPC0gcGxvdF9wY2EodHVtYWNvX21vbm9jeXRlX25vcm0sIHBsb3RfbGFiZWxzPUZBTFNFKQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL21vbm9jeXRlc19vbmVwbGFjZV9ub3JtLnBuZyIpCnR1bWFjb19tb25vY3l0ZV9wY2EkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCnR1bWFjb19tb25vY3l0ZV9wY2EkcGxvdAoKdHVtYWNvX21vbm9jeXRlX25iIDwtIG5vcm1hbGl6ZV9leHB0KHR1bWFjb19tb25vY3l0ZSwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPSJzdmFzZXEiLCBmaWx0ZXI9VFJVRSkKdHVtYWNvX21vbm9jeXRlX25iX3BjYSA8LSBwbG90X3BjYSh0dW1hY29fbW9ub2N5dGVfbmIsIHBsb3RfbGFiZWxzPUZBTFNFKQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL21vbm9jeXRlc19vbmVwbGFjZV9ub3JtX3N2YS5wbmciKQp0dW1hY29fbW9ub2N5dGVfbmJfcGNhJHBsb3QKY2xvc2VkIDwtIGRldi5vZmYoKQp0dW1hY29fbW9ub2N5dGVfbmJfcGNhJHBsb3QKYGBgCgojIyBDb21wYXJlIGNsaW5pY3MKCkxldCB1cyBtb3ZlIGEgZGlyZWN0IGNvbXBhcmlzb24gb2YgdGhlIHR3byBjbGluaWNzIHJpZ2h0IHRvIHRoZSB0b3AuCgpgYGB7ciBjbGluaWNfY29tcGFyaXNvbjF9CmhzX2NsaW5pYyA8LSBoc192YWxpZCAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3Q9ImNsaW5pYyIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdD0idHlwZW9mY2VsbHMiKQoKaHNfY2xpbmljX25vcm0gPC0gbm9ybWFsaXplX2V4cHQoaHNfY2xpbmljLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKQpoc19jbGluaWNfcGNhIDwtIHBsb3RfcGNhKGhzX2NsaW5pY19ub3JtKQpoc19jbGluaWNfcGNhJHBsb3QKaHNfY2xpbmljX25iIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2NsaW5pYywgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPSJzdmFzZXEiLCBmaWx0ZXI9VFJVRSkKaHNfY2xpbmljX25iX3BjYSA8LSBwbG90X3BjYShoc19jbGluaWNfbmIpCmhzX2NsaW5pY19uYl9wY2EkcGxvdApgYGAKCiMjIyBDb21wYXJlIGNsaW5pY3MsIGFsbCBzYW1wbGVzCgpgYGB7ciBjbGluaWNfY29tcGFyaXNvbnNfYWxsfQpjbGluaWNfY29udHJhc3RzIDwtIGxpc3QoCiAgICAiY2xpbmljcyIgPSBjKCJDYWxpIiwgIlR1bWFjbyIpKQpoc19jbGluaWNfZGUgPC0gYWxsX3BhaXJ3aXNlKGhzX2NsaW5pYywgbW9kZWxfYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKQpoc19jbGluaWNfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBoc19jbGluaWNfZGUsIGtlZXBlcnM9Y2xpbmljX2NvbnRyYXN0cywKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2hzX2NsaW5pY190YWJsZS12e3Zlcn0ueGxzeCIpKQpoc19jbGluaWNfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICBoc19jbGluaWNfdGFibGUsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9oc19jbGluaWNfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIENsaW5pYyBiaW9wc3kgY29tcGFyaXNvbgoKYGBge3IgY2xpbmljX2Jpb3BzeV9kZX0KY2xpbmljX2Jpb3BzeV9kZSA8LSBhbGxfcGFpcndpc2UoY2xpbmljX2Jpb3BzeSwgbW9kZWxfYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKQpjbGluaWNfYmlvcHN5X3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgY2xpbmljX2Jpb3BzeV9kZSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2NsaW5pY19iaW9wc3lfdGFibGUtdnt2ZXJ9Lnhsc3giKSkKY2xpbmljX2Jpb3BzeV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGNsaW5pY19iaW9wc3lfdGFibGUsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9jbGluaWNfYmlvcHN5X3NpZy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBDbGluaWMgZW9zaW5vcGhpbCBjb21wYXJpc29uCgpgYGB7ciBjbGluaWNfZW9zaW5vcGhpbF9kZX0KY2xpbmljX2Vvc2lub3BoaWxfZGUgPC0gYWxsX3BhaXJ3aXNlKGNsaW5pY19lb3Npbm9waGlsLCBtb2RlbF9iYXRjaD1GQUxTRSwgZmlsdGVyPVRSVUUpCmNsaW5pY19lb3Npbm9waGlsX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgY2xpbmljX2Vvc2lub3BoaWxfZGUsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9jbGluaWNfZW9zaW5vcGhpbF90YWJsZS12e3Zlcn0ueGxzeCIpKQpjbGluaWNfZW9zaW5vcGhpbF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGNsaW5pY19lb3Npbm9waGlsX3RhYmxlLAogICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvY2xpbmljX2Vvc2lub3BoaWxfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIENsaW5pYyBtb25vY3l0ZSBjb21wYXJpc29uCgpgYGB7ciBjbGluaWNfbW9ub2N5dGVfZGV9CmNsaW5pY19tb25vY3l0ZV9kZSA8LSBhbGxfcGFpcndpc2UoY2xpbmljX21vbm9jeXRlLCBtb2RlbF9iYXRjaD1GQUxTRSwgZmlsdGVyPVRSVUUpCmNsaW5pY19tb25vY3l0ZV90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIGNsaW5pY19tb25vY3l0ZV9kZSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2NsaW5pY19tb25vY3l0ZV90YWJsZS12e3Zlcn0ueGxzeCIpKQpjbGluaWNfbW9ub2N5dGVfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICBjbGluaWNfbW9ub2N5dGVfdGFibGUsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9jbGluaWNfbW9ub2N5dGVfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIENsaW5pYyBuZXV0cm9waGlsIGNvbXBhcmlzb24KCmBgYHtyIGNsaW5pY19uZXV0cm9waGlsX2RlfQpjbGluaWNfbmV1dHJvcGhpbF9kZSA8LSBhbGxfcGFpcndpc2UoY2xpbmljX25ldXRyb3BoaWwsIG1vZGVsX2JhdGNoPUZBTFNFLCBmaWx0ZXI9VFJVRSkKY2xpbmljX25ldXRyb3BoaWxfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBjbGluaWNfbmV1dHJvcGhpbF9kZSwKICAgIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2NsaW5pY19uZXV0cm9waGlsX3RhYmxlLXZ7dmVyfS54bHN4IikpCmNsaW5pY19uZXV0cm9waGlsX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgY2xpbmljX25ldXRyb3BoaWxfdGFibGUsCiAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9jbGluaWNfbmV1dHJvcGhpbF9zaWctdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgQ29tcGFyZSBjbGluaWMgZ2VuZXMKCmBgYHtyIGNvbXBhcmVfY2xpbmljX2dlbmVzfQpjbGluaWNfc2lnZW5lc191cCA8LSByb3duYW1lcyhoc19jbGluaWNfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWzFdXSkKY2xpbmljX3NpZ2VuZXNfZG93biA8LSByb3duYW1lcyhoc19jbGluaWNfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbMV1dKQpjbGluaWNfc2lnZW5lcyA8LSBjKGNsaW5pY19zaWdlbmVzX3VwLCBjbGluaWNfc2lnZW5lc19kb3duKQoKY29udHJhc3QgPC0gIlR1bWFjb2N1cmVfdnNfQ2FsaWN1cmUiCmNsaW5pY19iaW9wc3lfc2lnZW5lcyA8LSBjKHJvd25hbWVzKGNsaW5pY19iaW9wc3lfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bW2NvbnRyYXN0XV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3duYW1lcyhjbGluaWNfYmlvcHN5X3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bW2NvbnRyYXN0XV0pKQpjbGluaWNfZW9zaW5vcGhpbF9zaWdlbmVzX3VwIDwtIHJvd25hbWVzKGNsaW5pY19lb3Npbm9waGlsX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1tjb250cmFzdF1dKQpjbGluaWNfZW9zaW5vcGhpbF9zaWdlbmVzX2Rvd24gPC0gcm93bmFtZXMoY2xpbmljX2Vvc2lub3BoaWxfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbY29udHJhc3RdXSkKY2xpbmljX21vbm9jeXRlX3NpZ2VuZXNfdXAgPC0gcm93bmFtZXMoY2xpbmljX21vbm9jeXRlX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1tjb250cmFzdF1dKQpjbGluaWNfbW9ub2N5dGVfc2lnZW5lc19kb3duIDwtIHJvd25hbWVzKGNsaW5pY19tb25vY3l0ZV9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1tjb250cmFzdF1dKQpjbGluaWNfbmV1dHJvcGhpbF9zaWdlbmVzX3VwIDwtIHJvd25hbWVzKGNsaW5pY19uZXV0cm9waGlsX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1tjb250cmFzdF1dKQpjbGluaWNfbmV1dHJvcGhpbF9zaWdlbmVzX2Rvd24gPC0gcm93bmFtZXMoY2xpbmljX25ldXRyb3BoaWxfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbY29udHJhc3RdXSkKCmNsaW5pY19lb3Npbm9waGlsX3NpZ2VuZXMgPC0gYyhjbGluaWNfZW9zaW5vcGhpbF9zaWdlbmVzX3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpbmljX2Vvc2lub3BoaWxfc2lnZW5lc19kb3duKQpjbGluaWNfbW9ub2N5dGVfc2lnZW5lcyA8LSBjKGNsaW5pY19tb25vY3l0ZV9zaWdlbmVzX3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaW5pY19tb25vY3l0ZV9zaWdlbmVzX2Rvd24pCmNsaW5pY19uZXV0cm9waGlsX3NpZ2VuZXMgPC0gYyhjbGluaWNfbmV1dHJvcGhpbF9zaWdlbmVzX3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpbmljX25ldXRyb3BoaWxfc2lnZW5lc19kb3duKQpgYGAKCiMjIyBQbGFjZSBncHJvZmlsZXIKCmBgYHtyIGNsaW5pY19ncHJvZmlsZXJ9CmNsaW5pY19ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNsaW5pY19zaWdlbmVzKQpjbGluaWNfZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCmNsaW5pY19ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmNsaW5pY19ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNsaW5pY19zaWdlbmVzKQpjbGluaWNfZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCmNsaW5pY19ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmNsaW5pY19ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNsaW5pY19zaWdlbmVzKQpjbGluaWNfZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCmNsaW5pY19ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCgoKY2xpbmljX2Vvc2lub3BoaWxfZ3AgPC0gc2ltcGxlX2dwcm9maWxlcihjbGluaWNfZW9zaW5vcGhpbF9zaWdlbmVzKQpjbGluaWNfZW9zaW5vcGhpbF9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKY2xpbmljX2Vvc2lub3BoaWxfZ3AkcHZhbHVlX3Bsb3RzJHJlYWN0b21lX3Bsb3Rfb3ZlcgoKY2xpbmljX2Vvc2lub3BoaWxfdXBfZ3AgPC0gc2ltcGxlX2dwcm9maWxlcihjbGluaWNfZW9zaW5vcGhpbF9zaWdlbmVzX3VwKQpjbGluaWNfZW9zaW5vcGhpbF91cF9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKY2xpbmljX2Vvc2lub3BoaWxfdXBfZ3AkcHZhbHVlX3Bsb3RzJHJlYWN0b21lX3Bsb3Rfb3ZlcgoKY2xpbmljX2Vvc2lub3BoaWxfZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNsaW5pY19lb3Npbm9waGlsX3NpZ2VuZXNfZG93bikKY2xpbmljX2Vvc2lub3BoaWxfZG93bl9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKY2xpbmljX2Vvc2lub3BoaWxfZG93bl9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCgoKY2xpbmljX21vbm9jeXRlX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIoY2xpbmljX21vbm9jeXRlX3NpZ2VuZXMpCmNsaW5pY19tb25vY3l0ZV9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKY2xpbmljX21vbm9jeXRlX2dwJHB2YWx1ZV9wbG90cyRyZWFjdG9tZV9wbG90X292ZXIKCmNsaW5pY19tb25vY3l0ZV91cF9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNsaW5pY19tb25vY3l0ZV9zaWdlbmVzX3VwKQpjbGluaWNfbW9ub2N5dGVfdXBfZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCmNsaW5pY19tb25vY3l0ZV91cF9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCgpjbGluaWNfbW9ub2N5dGVfZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNsaW5pY19tb25vY3l0ZV9zaWdlbmVzX2Rvd24pCmNsaW5pY19tb25vY3l0ZV9kb3duX2dwJHB2YWx1ZV9wbG90cyRrZWdnX3Bsb3Rfb3ZlcgpjbGluaWNfbW9ub2N5dGVfZG93bl9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCgoKY2xpbmljX25ldXRyb3BoaWxfZ3AgPC0gc2ltcGxlX2dwcm9maWxlcihjbGluaWNfbmV1dHJvcGhpbF9zaWdlbmVzKQpjbGluaWNfbmV1dHJvcGhpbF9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKY2xpbmljX25ldXRyb3BoaWxfZ3AkcHZhbHVlX3Bsb3RzJHJlYWN0b21lX3Bsb3Rfb3ZlcgoKY2xpbmljX25ldXRyb3BoaWxfdXBfZ3AgPC0gc2ltcGxlX2dwcm9maWxlcihjbGluaWNfbmV1dHJvcGhpbF9zaWdlbmVzX3VwKQpjbGluaWNfbmV1dHJvcGhpbF91cF9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKY2xpbmljX25ldXRyb3BoaWxfdXBfZ3AkcHZhbHVlX3Bsb3RzJHJlYWN0b21lX3Bsb3Rfb3ZlcgoKY2xpbmljX25ldXRyb3BoaWxfZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNsaW5pY19uZXV0cm9waGlsX3NpZ2VuZXNfZG93bikKY2xpbmljX25ldXRyb3BoaWxfZG93bl9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKY2xpbmljX25ldXRyb3BoaWxfZG93bl9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmBgYAoKIyMjIFBsb3QgdGhlIGNsaW5pY2FsIHNhbXBsZXMKCkxldCB1cyByZWNvbG9yIHRoZSBzYW1lIHBsb3QgYnkgY3VyZS9mYWlsIGZvbGxvd2VkIGJ5IGEgY29uY2F0ZW5hdGlvbgpvZiB0aGUgY2VsbCB0eXBlIGFuZCBjdXJlL2ZhaWwuICBJbiB0aGUgZm9sbG93aW5nIGJsb2NrLCB0aGUgY2xpbmljYWwKc2FtcGxlcyBhcmUgcGxvdHRlZCBvbmNlIHdpdGggdGhlIG1vc3QgY29tbW9uIG5vcm1hbGl6YXRpb24KKGxvZyxjcG0scXVhbnQsZmlsdGVyZWQpIG1ldGhvZCBmb2xsb3dlZCBieSBhIHBsb3Qgb2YgdGhlIGRhdGEgdXNpbmcKc3Zhc2VxIGFkanVzdGVkIHZhbHVlcyBhbmQgd2l0aG91dCBxdWFudGlsZSBub3JtYWxpemF0aW9uLgoKVGh1cywgdGhlIGZvbGxvd2luZyBibG9jayBzd2l0Y2hlcyB0aGUgY29sb3JzIG9mIHRoZSBncm91cHMgdG8gdGhlIGNsaW5pY2FsCnN0YXRlIChjdXJlL2ZhaWwpIGFuZCBzaGFwZXMgYnkgY2VsbCB0eXBlLgoKYGBge3IgaHNfY2xpbmljYWxfcGxvdH0KaHNfY2xpbmljYWxfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChoc19jbGluaWNhbCwgZmlsdGVyPSJzaW1wbGUiLCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IiwgY29udmVydD0iY3BtIikpCmNsaW5pY2FsX3BjYSA8LSBwbG90X3BjYShoc19jbGluaWNhbF9ub3JtLCBwbG90X2xhYmVscz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNpcz1OVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgcGxvdF90aXRsZT0iUENBIC0gY2xpbmljYWwgc2FtcGxlcyIpCmRldiA8LSBwcChmaWxlPWdsdWUoImltYWdlcy9hbGxfY2xpbmljYWxfbm9iYXRjaF9wY2Etdnt2ZXJ9LnBuZyIpLCBoZWlnaHQ9OCwgd2lkdGg9MTYpCmNsaW5pY2FsX3BjYSRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKY2xpbmljYWxfcGNhJHBsb3QKCmhzX2NsaW5pY2FsX25iIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2NsaW5pY2FsLCBmaWx0ZXI9InNpbXBsZSIsIHRyYW5zZm9ybT0ibG9nMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPSJzdmFzZXEiLCBjb252ZXJ0PSJjcG0iKQpoc19jbGluaWNhbF9uYl9wY2EgPC0gcGxvdF9wY2EoaHNfY2xpbmljYWxfbmIpCmRldiA8LSBwcChmaWxlPWdsdWUoImltYWdlcy9hbGxfY2xpbmljYWxfc3Zhc2VxYmF0Y2hfcGNhLXZ7dmVyfS5wbmciKSwgaGVpZ2h0PTYsIHdpZHRoPTgpCmhzX2NsaW5pY2FsX25iX3BjYSRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKaHNfY2xpbmljYWxfbmJfcGNhJHBsb3QKCmNsaW5pY2FsX3BjYV9pbmZvIDwtIHBjYV9pbmZvcm1hdGlvbigKICAgIGhzX2NsaW5pY2FsX25vcm0sIHBsb3RfcGNhcz1UUlVFLCBudW1fY29tcG9uZW50cyA9IDMwLAogICAgZXhwdF9mYWN0b3JzPWMoInZpc2l0bnVtYmVyIiwgInR5cGVvZmNlbGxzIiwgImNsaW5pY2Fsb3V0Y29tZSIsCiAgICAgICAgICAgICAgICAgICAiY2xpbmljIikpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvY2xpbmljYWxfc2FtcGxlc19uZWdsb2dwX3Bjcy5wbmciKQpjbGluaWNhbF9wY2FfaW5mbyRhbm92YV9uZWdsb2dwX2hlYXRtYXAKY2xvc2VkIDwtIGRldi5vZmYoKQpjbGluaWNhbF9wY2FfaW5mbyRhbm92YV9uZWdsb2dwX2hlYXRtYXAKY2xpbmljYWxfcGNhX2luZm8kcGNhX3Bsb3RzJFBDMjBfUEMyOQoKY2xpbmljYWxfc2NvcmVzIDwtIHBjYV9oaWdoc2NvcmVzKGhzX2NsaW5pY2FsX25vcm0pCmNsaW5pY2FsX3Njb3Jlc1tbImhpZ2hlc3QiXV1bLCJDb21wLjIwIl0KY2xpbmljYWxfc2NvcmVzW1siaGlnaGVzdCJdXVssIkNvbXAuMjciXQpgYGAKCmBgYHtyIGl0ZXJhdGl2ZV9zdl9yZW1vdmFsfQpmaXJzdCA8LSBub3JtYWxpemVfZXhwdChoc19jbGluaWNhbCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2g9InN2YXNlcSIsIHN1cnJvZ2F0ZXM9MSkKZmlyc3RfaW5mbyA8LSBwY2FfaW5mb3JtYXRpb24oCiAgICBmaXJzdCwgcGxvdF9wY2FzPVRSVUUsIG51bV9jb21wb25lbnRzID0gMzAsCiAgICBleHB0X2ZhY3RvcnM9YygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLCAiY2xpbmljYWxvdXRjb21lIiwKICAgICAgICAgICAgICAgICAgICJjbGluaWMiKSkKZmlyc3RfaW5mbyRhbm92YV9uZWdsb2dwX2hlYXRtYXAKZmlyc3RfaW5mbyRwY2FfcGxvdHNbWyJQQzFfUEMyIl1dCgpzZWNvbmQgPC0gbm9ybWFsaXplX2V4cHQoaHNfY2xpbmljYWwsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaD0ic3Zhc2VxIiwgc3Vycm9nYXRlcz0yKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9ImNsaW5pYyIpCnNlY29uZF9pbmZvIDwtIHBjYV9pbmZvcm1hdGlvbigKICAgIHNlY29uZCwgcGxvdF9wY2FzPVRSVUUsIG51bV9jb21wb25lbnRzID0gMzAsCiAgICBleHB0X2ZhY3RvcnM9YygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLCAiY2xpbmljYWxvdXRjb21lIiwKICAgICAgICAgICAgICAgICAgICJjbGluaWMiKSkKc2Vjb25kX2luZm8kYW5vdmFfbmVnbG9ncF9oZWF0bWFwCgp0aGlyZCA8LSBub3JtYWxpemVfZXhwdChoc19jbGluaWNhbCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2g9InN2YXNlcSIsIHN1cnJvZ2F0ZXM9MykgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJjbGluaWMiKQp0aGlyZF9pbmZvIDwtIHBjYV9pbmZvcm1hdGlvbigKICAgIHRoaXJkLCBwbG90X3BjYXM9VFJVRSwgbnVtX2NvbXBvbmVudHMgPSAzMCwKICAgIGV4cHRfZmFjdG9ycz1jKCJ2aXNpdG51bWJlciIsICJ0eXBlb2ZjZWxscyIsICJjbGluaWNhbG91dGNvbWUiLAogICAgICAgICAgICAgICAgICAgImNsaW5pYyIpKQp0aGlyZF9pbmZvJGFub3ZhX25lZ2xvZ3BfaGVhdG1hcAoKZm91cnRoIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2NsaW5pY2FsLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2g9InN2YXNlcSIsIHN1cnJvZ2F0ZXM9NCkgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJjbGluaWMiKQpmb3VydGhfaW5mbyA8LSBwY2FfaW5mb3JtYXRpb24oCiAgICBmb3VydGgsIHBsb3RfcGNhcz1UUlVFLCBudW1fY29tcG9uZW50cyA9IDMwLAogICAgZXhwdF9mYWN0b3JzPWMoInZpc2l0bnVtYmVyIiwgInR5cGVvZmNlbGxzIiwgImNsaW5pY2Fsb3V0Y29tZSIsCiAgICAgICAgICAgICAgICAgICAiY2xpbmljIikpCmZvdXJ0aF9pbmZvJGFub3ZhX25lZ2xvZ3BfaGVhdG1hcApmb3VydGhfaW5mb1tbInBjYV9wbG90cyJdXVtbIlBDMV9QQzIiXV0KCmZpZnRoIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2NsaW5pY2FsLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaD0ic3Zhc2VxIiwgc3Vycm9nYXRlcz01KSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3Q9ImNsaW5pYyIpCmZpZnRoX2luZm8gPC0gcGNhX2luZm9ybWF0aW9uKAogICAgZmlmdGgsIHBsb3RfcGNhcz1UUlVFLCBudW1fY29tcG9uZW50cyA9IDMwLAogICAgZXhwdF9mYWN0b3JzPWMoInZpc2l0bnVtYmVyIiwgInR5cGVvZmNlbGxzIiwgImNsaW5pY2Fsb3V0Y29tZSIsCiAgICAgICAgICAgICAgICAgICAiY2xpbmljIikpCmZpZnRoX2luZm8kYW5vdmFfbmVnbG9ncF9oZWF0bWFwCmZpZnRoX2luZm9bWyJwY2FfcGxvdHMiXV1bWyJQQzFfUEMxMiJdXQoKc2l4dGggPC0gbm9ybWFsaXplX2V4cHQoaHNfY2xpbmljYWwsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoPSJzdmFzZXEiLCBzdXJyb2dhdGVzPTYpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdD0iY2xpbmljIikKc2l4dGhfaW5mbyA8LSBwY2FfaW5mb3JtYXRpb24oCiAgICBzaXh0aCwgcGxvdF9wY2FzPVRSVUUsIG51bV9jb21wb25lbnRzID0gMzAsCiAgICBleHB0X2ZhY3RvcnM9YygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLCAiY2xpbmljYWxvdXRjb21lIiwKICAgICAgICAgICAgICAgICAgICJjbGluaWMiKSkKc2l4dGhfaW5mbyRhbm92YV9uZWdsb2dwX2hlYXRtYXAKCnNldmVudGggPC0gbm9ybWFsaXplX2V4cHQoaHNfY2xpbmljYWwsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2g9InN2YXNlcSIsIHN1cnJvZ2F0ZXM9NykgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0PSJjbGluaWMiKQpzZXZlbnRoX2luZm8gPC0gcGNhX2luZm9ybWF0aW9uKAogICAgc2V2ZW50aCwgcGxvdF9wY2FzPVRSVUUsIG51bV9jb21wb25lbnRzID0gMzAsCiAgICBleHB0X2ZhY3RvcnM9YygidmlzaXRudW1iZXIiLCAidHlwZW9mY2VsbHMiLCAiY2xpbmljYWxvdXRjb21lIiwKICAgICAgICAgICAgICAgICAgICJjbGluaWMiKSkKc2V2ZW50aF9pbmZvJGFub3ZhX25lZ2xvZ3BfaGVhdG1hcAoKZWlnaHRoIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2NsaW5pY2FsLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSBUUlVFLCBiYXRjaD0ic3Zhc2VxIiwgc3Vycm9nYXRlcz04KQplaWdodGhfaW5mbyA8LSBwY2FfaW5mb3JtYXRpb24oCiAgICBlaWdodGgsIHBsb3RfcGNhcz1UUlVFLCBudW1fY29tcG9uZW50cyA9IDMwLAogICAgZXhwdF9mYWN0b3JzPWMoInZpc2l0bnVtYmVyIiwgInR5cGVvZmNlbGxzIiwgImNsaW5pY2Fsb3V0Y29tZSIsCiAgICAgICAgICAgICAgICAgICAiY2xpbmljIikpCmVpZ2h0aF9pbmZvJGFub3ZhX25lZ2xvZ3BfaGVhdG1hcApgYGAKCiMjIyBDb25jYXRlbmF0ZSBjdXJlL2ZhaWwgYW5kIGNlbGwgdHlwZQoKSW4gdGhlIGZvbGxvd2luZyBibG9jayB0aGUgZXhwZXJpbWVudGFsIGNvbmRpdGlvbiB3YXMgcmVzZXQgdG8gdGhlCmNvbmNhdGVuYXRpb24gb2YgY2xpbmljYWwgb3V0Y29tZSBhbmQgdHlwZSBvZiBjZWxscy4gIFRoZXJlIGFyZSBhbgppbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGJpb3BzeSBzYW1wbGVzIGZvciB0aGVtIHRvIGJlIHVzZWZ1bCBpbiB0aGlzCnZpc3VhbGl6YXRpb24sIHNvIHRoZXkgYXJlIGlnbm9yZWQuCgpgYGB7ciBjZl9hbmRfdHlwZX0KZGVzaXJlZF9sZXZlbHMgPC0gYygiY3VyZV9iaW9wc3kiLCAiZmFpbHVyZV9iaW9wc3kiLCAiY3VyZV9lb3Npbm9waGlscyIsICJmYWlsdXJlX2Vvc2lub3BoaWxzIiwKICAgICAgICAgICAgICAgICAgICAiY3VyZV9tb25vY3l0ZXMiLCAiZmFpbHVyZV9tb25vY3l0ZXMiLCAiY3VyZV9uZXV0cm9waGlscyIsICJmYWlsdXJlX25ldXRyb3BoaWxzIikKbmV3X2ZhY3QgPC0gZmFjdG9yKAogICAgcGFzdGUwKHBEYXRhKGhzX2NsaW5pY2FsKVtbImNvbmRpdGlvbiJdXSwgIl8iLAogICAgICAgICAgIHBEYXRhKGhzX2NsaW5pY2FsKVtbImJhdGNoIl1dKSwKICAgIGxldmVscz1kZXNpcmVkX2xldmVscykKCmhzX2NsaW5pY2FsX2NvbmNhdCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGhzX2NsaW5pY2FsLCBmYWN0ID0gbmV3X2ZhY3QpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjZl90eXBlX2NvbG9ycykgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0PSJ0eXBlb2ZjZWxscyE9J2Jpb3BzeSciKQoKIyMgVHJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBsZXZlbHMgc3RheSBpbiB0aGUgb3JkZXIgSSB3YW50Cm1ldGEgPC0gcERhdGEoaHNfY2xpbmljYWxfY29uY2F0KSAlPiUKICBtdXRhdGUoY29uZGl0aW9uID0gZmN0X3JlbGV2ZWwoY29uZGl0aW9uLCBkZXNpcmVkX2xldmVscykpCnBEYXRhKGhzX2V4cHQpIDwtIG1ldGEKCmNsaW5pY2FsX2NvbmNhdF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2NsaW5pY2FsX2NvbmNhdCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpjbGluaWNhbF9jb25jYXRfbm9ybV9wY2EgPC0gcGxvdF9wY2EoY2xpbmljYWxfY29uY2F0X25vcm0pCmRldiA8LSBwcChmaWxlPWdsdWUoImltYWdlcy9jbGluaWNhbF9jb25jYXRlbmF0ZWRfbm9ybWFsaXplZF9wY2Etdnt2ZXJ9LnBuZyIpLCBoZWlnaHQ9Niwgd2lkdGg9MTApCmNsaW5pY2FsX2NvbmNhdF9ub3JtX3BjYSRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKY2xpbmljYWxfY29uY2F0X25vcm1fcGNhJHBsb3QKCmNsaW5pY2FsX2NvbmNhdF9uYiA8LSBub3JtYWxpemVfZXhwdChoc19jbGluaWNhbF9jb25jYXQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKY2xpbmljYWxfY29uY2F0X25iX3BjYSA8LSBwbG90X3BjYShjbGluaWNhbF9jb25jYXRfbmIpCmRldiA8LSBwcChmaWxlPWdsdWUoImltYWdlcy9jbGluaWNhbF9jb25jYXRlbmF0ZWRfc3Zhc2VxYmF0Y2hfcGNhLXZ7dmVyfS5wbmciKSwgaGVpZ2h0PTYsIHdpZHRoPTEyKQpjbGluaWNhbF9jb25jYXRfbmJfcGNhJHBsb3QKY2xvc2VkIDwtIGRldi5vZmYoKQpjbGluaWNhbF9jb25jYXRfbmJfcGNhJHBsb3QKCnR1bWFjb19jb25jYXQgPC0gc3Vic2V0X2V4cHQoaHNfY2xpbmljYWxfY29uY2F0LCBzdWJzZXQ9ImNsaW5pYz09J1R1bWFjbyciKQp0dW1hY29fY29uY2F0X25vcm0gPC0gbm9ybWFsaXplX2V4cHQodHVtYWNvX2NvbmNhdCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQp0dW1hY29fY29uY2F0X25vcm1fcGNhIDwtIHBsb3RfcGNhKHR1bWFjb19jb25jYXRfbm9ybSkKZGV2IDwtIHBwKGZpbGU9Z2x1ZSgiaW1hZ2VzL3R1bWFjb19jb25jYXRlbmF0ZWRfbm9ybWFsaXplZF9wY2Etdnt2ZXJ9LnBuZyIpLCBoZWlnaHQ9Niwgd2lkdGg9MTApCnR1bWFjb19jb25jYXRfbm9ybV9wY2EkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCnR1bWFjb19jb25jYXRfbm9ybV9wY2EkcGxvdAoKdHVtYWNvX2NvbmNhdF9uYiA8LSBub3JtYWxpemVfZXhwdCh0dW1hY29fY29uY2F0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnR1bWFjb19jb25jYXRfbmJfcGNhIDwtIHBsb3RfcGNhKHR1bWFjb19jb25jYXRfbmIpCmRldiA8LSBwcChmaWxlPWdsdWUoImltYWdlcy9jbGluaWNhbF9jb25jYXRlbmF0ZWRfc3Zhc2VxYmF0Y2hfcGNhLXZ7dmVyfS5wbmciKSwgaGVpZ2h0PTYsIHdpZHRoPTEyKQp0dW1hY29fY29uY2F0X25iX3BjYSRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKdHVtYWNvX2NvbmNhdF9uYl9wY2EkcGxvdApgYGAKCmBgYHtyIHRlc3RpbmdfbGVnZW5kc30KbGlicmFyeShnZ3Bsb3QyKQp3YW50ZWRfbGVnZW5kX29yZGVyIDwtIGMoImN1cmVfZW9zaW5vcGhpbHMiLCJjdXJlX21vbm9jeXRlcyIsImN1cmVfbmV1dHJvcGhpbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgImZhaWx1cmVfZW9zaW5vcGhpbHMiLCJmYWlsdXJlX21vbm9jeXRlcyIsImZhaWx1cmVfbmV1dHJvcGhpbHMiKQp0ZXN0IDwtIHBsb3RfcGNhKGNsaW5pY2FsX2NvbmNhdF9ub3JtKQp0ZXN0JHBsb3QKdGVzdCRwbG90ICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShicmVha3M9d2FudGVkX2xlZ2VuZF9vcmRlcikgKwogIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0yKSkKCnRlc3QyIDwtIHBsb3RfbGVnZW5kKGNsaW5pY2FsX2NvbmNhdF9ub3JtKQpgYGAKCiMjIyBTYW1wbGVzIHNlcGFyYXRlZCBieSB2aXNpdAoKU2VwYXJhdGUgdGhlIHNhbXBsZXMgYnkgdmlzaXQgaW4gb3JkZXIgdG8gbW9yZSBlYXNpbHkgc2VlIHdoYXQKcGF0dGVybnMgZW1lcmdlIGFjcm9zcyBjZWxsIHR5cGUgYW5kIGNsaW5pY2FsIG91dGNvbWUuCgpUaGUgbW9zdCBsaWtlbHkgZGF0YSBzZXQgZm9yIHRoaXMgaXMgaHNfY2xpbmljYWwuCgojIyMjIEFsbCB2aXNpdHMgdG9nZXRoZXIKCk5vdyBsZXQgdXMgc2hpZnQgdGhlIHZpZXcgc2xpZ2h0bHkgdG8gZm9jdXMgb24gY2hhbmdlcyBvYnNlcnZlZCBvdmVyIHRpbWUuCgpgYGB7ciBjb21wYXJlX2FsbF92aXNpdHN9CnZpc2l0X2V4cHQgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhoc19jbGluaWNhbCwgZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJjbGluaWNhbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQ9InR5cGVvZmNlbGxzIT0nYmlvcHN5JyIpCgp2aXNpdF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHZpc2l0X2V4cHQsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkKcGxvdF9wY2EodmlzaXRfbm9ybSkkcGxvdAp2aXNpdF9uYiA8LSBub3JtYWxpemVfZXhwdCh2aXNpdF9leHB0LCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCnZpc2l0X25iX3BjYSA8LSBwbG90X3BjYSh2aXNpdF9uYikKZGV2IDwtIHBwKGZpbGU9Z2x1ZSgiaW1hZ2VzL3Zpc2l0X3N2YXNlcWJhdGNoX3BjYS12e3Zlcn0ucG5nIiksIGhlaWdodD03LCB3aWR0aD05KQp2aXNpdF9uYl9wY2EkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCnZpc2l0X25iX3BjYSRwbG90CmBgYAoKIyMgVG9wIDEwMDAgZ2VuZXMKCnJlcGVhdCB3aXRoIG9ubHkgdGhlIG1vc3QgZXhwcmVzc2VkIGdlbmVzIGZyb20gb25lIGNlbGwgdHlwZS4KCmBgYHtyIHRvcDEwMDB9CnJwa21fdmFsdWVzIDwtIG5vcm1hbGl6ZV9leHB0KHR5cGVfdmFsaWQsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9InJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI9VFJVRSwgY29sdW1uPSJjZHNfbGVuZ3RoIikKcnBrbV9tZWRpYW4gPC0gbWVkaWFuX2J5X2ZhY3RvcihycGttX3ZhbHVlcykKcnBrbV90dW1hY29fbW9ub2N5dGVfaWR4IDwtIG9yZGVyKHJwa21fbWVkaWFuW1sibWVkaWFucyJdXVtbIm1vbm9jeXRlcyJdXSwgZGVjcmVhc2luZz1UUlVFKQpycGttX3R1bWFjb19tb25vY3l0ZSA8LSBycGttX21lZGlhbltbIm1lZGlhbnMiXV1bcnBrbV90dW1hY29fbW9ub2N5dGVfaWR4LCBdCnR1bWFjb19tb25vY3l0ZV9nZW5lIDwtIGhlYWQocm93bmFtZXMocnBrbV90dW1hY29fbW9ub2N5dGUpLCBuPTEwMDApCmBgYAoKIyMjIyBBbGwgdmlzaXRzLCBzZXBhcmF0ZWQgYnkgY2VsbCB0eXBlCgpOb3cgc2VwYXJhdGUgdGhlIHZpc2l0cyBieSBjZWxsIHR5cGUgYW5kIHdoZXRoZXIgb3Igbm90IHRoZSBkcnVnIHVzZWQKd2FzIHRoZSBhbnRpbW9uaWFsLgoKYGBge3IgY2VsbF90eXBlX3Zpc2l0c30KdmlzaXRfbW9ub2N5dGUgPC0gc3Vic2V0X2V4cHQodmlzaXRfZXhwdCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnZpc2l0X25ldXRyb3BoaWwgPC0gc3Vic2V0X2V4cHQodmlzaXRfZXhwdCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbmV1dHJvcGhpbHMnIikKdmlzaXRfZW9zaW5vcGhpbCA8LSBzdWJzZXRfZXhwdCh2aXNpdF9leHB0LCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQpgYGAKCiMjIyMgVmlzaXQgMSBhbG9uZQoKYGBge3IgdmlzaXQxX2RhdGF9CnYxX2NsaW5pY2FsIDwtIHN1YnNldF9leHB0KHZpc2l0X2V4cHQsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzEnIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImNsaW5pY2Fsb3V0Y29tZSIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJ0eXBlb2ZjZWxscyIpCnYxX25vcm0gPC0gbm9ybWFsaXplX2V4cHQodjFfY2xpbmljYWwsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpCgpwbG90X3BjYSh2MV9ub3JtKSRwbG90CnYxX25iIDwtIG5vcm1hbGl6ZV9leHB0KHYxX2NsaW5pY2FsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKcGxvdF9wY2EodjFfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpJHBsb3QKYGBgCgpTbywgZ2l2ZW4gdGhlIGRhdGEgb24gaGFuZCwgdGhlcmUgaXMgc2xpZ2h0IGFiaWxpdHkgdG8gZGlzY2VybgpjdXJlIGFuZCBmYWlsIGFtb25nIHRoZSB2aXNpdCAxIHNhbXBsZXMuCgojIyMjIFZpc2l0IDIgYWxvbmUKCmBgYHtyIHZpc2l0Ml9kYXRhfQp2Ml9jbGluaWNhbCA8LSBzdWJzZXRfZXhwdCh2aXNpdF9leHB0LCBzdWJzZXQ9InZpc2l0bnVtYmVyPT0nMiciKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiY2xpbmljYWxvdXRjb21lIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInR5cGVvZmNlbGxzIikKCnYyX25iIDwtIG5vcm1hbGl6ZV9leHB0KHYyX2NsaW5pY2FsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwgbm9ybSA9ICJxdWFudCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCnBsb3RfcGNhKHYyX25iLCBwbG90X2xhYmVscyA9IEZBTFNFKSRwbG90CmBgYAoKVGhlcmUgX21pZ2h0XyBiZSBzb21lIHZhcmlhbmNlIGFtb25nIHRoZSB2aXNpdCAyIHNhbXBsZXMgd2hpY2ggYXJlIGN1cmUvZmFpbC1pc2guCgojIyMjIFZpc2l0IDMgYWxvbmUKCmBgYHtyIHZpc2l0M19kYXRhfQp2M19jbGluaWNhbCA8LSBzdWJzZXRfZXhwdCh2aXNpdF9leHB0LCBzdWJzZXQ9InZpc2l0bnVtYmVyPT0nMyciKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiY2xpbmljYWxvdXRjb21lIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInR5cGVvZmNlbGxzIikKCnYzX25iIDwtIG5vcm1hbGl6ZV9leHB0KHYzX2NsaW5pY2FsLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwgbm9ybSA9ICJxdWFudCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCnBsb3RfcGNhKHYzX25iLCBwbG90X2xhYmVscyA9IEZBTFNFKSRwbG90CmBgYAoKSW4gYSBzaW1pbGFyIGZhc2hpb24sIGl0IHNlZW1zIHRoYXQgdGhlIHZpc2l0IDMgc2FtcGxlcyBhcmUgbm90CnBhcnRpY3VsYXJseSBpbmZvcm1hdGl2ZS4KCiMjIyBTYW1wbGVzIHNlcGFyYXRlZCBieSBjZWxsIHR5cGUKClNlcGFyYXRlIHRoZSBzYW1wbGVzIGJ5IGNlbGwgdHlwZSBpbiBvcmRlciB0byBtb3JlIGVhc2lseSBvYnNlcnZlCnBhdHRlcm5zIHdpdGggcmVzcGVjdCB0byB2aXNpdCBhbmQgY2xpbmljYWwgb3V0Y29tZS4KCiMjIyMgQmlvcHNpZXMKCmBgYHtyIGJpb3BzeV9zZXBhcmF0ZX0KYmlvcHN5X25vcm0gPC0gbm9ybWFsaXplX2V4cHQoYmlvcHN5X3NhbXBsZXMsIG5vcm0gPSAicXVhbnQiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSkKCnBsb3RfcGNhKGJpb3BzeV9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFKSRwbG90CmJpb3BzeV9uYiA8LSBub3JtYWxpemVfZXhwdChiaW9wc3lfc2FtcGxlcywgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gImxvZzIiLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQpwbG90X3BjYShiaW9wc3lfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpJHBsb3QKYGBgCgojIyMjIE1vbm9jeXRlcwoKYGBge3IgbW9ub2N5dGVfc2VwYXJhdGV9Cm1vbm9jeXRlX25vcm0gPC0gbm9ybWFsaXplX2V4cHQobW9ub2N5dGVfc2FtcGxlcywgbm9ybSA9ICJxdWFudCIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUpCm1vbm9jeXRlX3BjYSA8LSBwbG90X3BjYShtb25vY3l0ZV9ub3JtLCBwbG90X2xhYmVscyA9IEZBTFNFKQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL21vbm9jeXRlc19jZl9ub3JtX3BjYS5wbmciKQptb25vY3l0ZV9wY2EkcGxvdApjbG9zZWQgPC0gZGV2Lm9mZigpCm1vbm9jeXRlX3BjYSRwbG90Cgptb25vY3l0ZV9kaXNoZWF0IDwtIHBsb3RfZGlzaGVhdChtb25vY3l0ZV9ub3JtKQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL21vbm9jeXRlc19jZl9ub3JtX2Rpc2hlYXQucG5nIikKbW9ub2N5dGVfZGlzaGVhdCRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKbW9ub2N5dGVfZGlzaGVhdCRwbG90Cgptb25vY3l0ZV9uYiA8LSBub3JtYWxpemVfZXhwdChtb25vY3l0ZV9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCm1vbm9jeXRlX25iX3BjYSA8LSBwbG90X3BjYShtb25vY3l0ZV9uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKZGV2IDwtIHBwKGZpbGU9ImltYWdlcy9tb25vY3l0ZXNfY2Zfbm9ybV9zdmFfcGNhLnBuZyIpCm1vbm9jeXRlX25iX3BjYSRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKbW9ub2N5dGVfbmJfcGNhJHBsb3QKYGBgCgojIyMjIyBNb25vY3l0ZXMsIHZpc2l0IDEKCmBgYHtyIG1vbm9jeXRlc192MX0KbW9ub2N5dGVfdjEgPC0gc3Vic2V0X2V4cHQobW9ub2N5dGVfc2FtcGxlcywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMSciKQptb25vY3l0ZV92MV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KG1vbm9jeXRlX3YxLCBub3JtID0gInF1YW50IiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSkKbW9ub2N5dGVfdjFfcGNhIDwtIHBsb3RfcGNhKG1vbm9jeXRlX3YxX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbW9ub2N5dGVzX3YxX2NmX25vcm1fcGNhLnBuZyIpCm1vbm9jeXRlX3YxX3BjYSRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKbW9ub2N5dGVfdjFfcGNhJHBsb3QKCm1vbm9jeXRlX3YxX25iIDwtIG5vcm1hbGl6ZV9leHB0KG1vbm9jeXRlX3YxLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCm1vbm9jeXRlX3YxX25iX3BjYSA8LSBwbG90X3BjYShtb25vY3l0ZV92MV9uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkKZGV2IDwtIHBwKGZpbGU9ImltYWdlcy9tb25vY3l0ZXNfdjFfY2Zfbm9ybV9zdmFfcGNhLnBuZyIpCm1vbm9jeXRlX3YxX25iX3BjYSRwbG90CmNsb3NlZCA8LSBkZXYub2ZmKCkKbW9ub2N5dGVfdjFfbmJfcGNhJHBsb3QKYGBgCgoKVGhlIG1vbm9jeXRlcywgb24gdGhlIG90aGVyIGhhbmQsIGFwcGVhciB0byBoYXZlIHNvbWUgcmVhbCBpbmZvcm1hdGlvbgpsdXJraW5nIGluIHRoZW0uCgojIyMjIE5ldXRyb3BoaWxzCgpgYGB7ciBuZXV0cm9waGlsX3NlcGFyYXRlfQpuZXV0cm9waGlsX25vcm0gPC0gbm9ybWFsaXplX2V4cHQobmV1dHJvcGhpbF9zYW1wbGVzLCBub3JtID0gInF1YW50IiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSkKCnBsb3RfcGNhKG5ldXRyb3BoaWxfbm9ybSwgcGxvdF9sYWJlbHMgPSBGQUxTRSkkcGxvdAoKbmV1dHJvcGhpbF9uYiA8LSBub3JtYWxpemVfZXhwdChuZXV0cm9waGlsX3NhbXBsZXMsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9ICJsb2cyIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKcGxvdF9wY2EobmV1dHJvcGhpbF9uYiwgcGxvdF9sYWJlbHMgPSBGQUxTRSkkcGxvdApgYGAKClRoaXMgYXBwZWFycyBhbHNvIHRvIGJlIHRoZSBjYXNlIGZvciB0aGUgbmV1dHJvcGhpbCBzYW1wbGVzLgoKIyMjIyBFb3Npbm9waGlscwoKYGBge3IgZW9zaW5vcGhpbF9zZXBhcmF0ZX0KZW9zaW5vcGhpbF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGVvc2lub3BoaWxfc2FtcGxlcywgbm9ybSA9ICJxdWFudCIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUpCgpwbG90X3BjYShlb3Npbm9waGlsX25vcm0sIHBsb3RfbGFiZWxzID0gRkFMU0UpJHBsb3QKCmVvc2lub3BoaWxfbmIgPC0gbm9ybWFsaXplX2V4cHQoZW9zaW5vcGhpbF9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSAibG9nMiIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCnBsb3RfcGNhKGVvc2lub3BoaWxfbmIsIHBsb3RfbGFiZWxzID0gRkFMU0UpJHBsb3QKYGBgCgpXZSBoYXZlIGZld2VyIGVvc2lub3BoaWwgc2FtcGxlcyBjdXJyZW50bHksIGJ1dCB0aGV5IGFwcGVhciB0byBoYXZlCnNvbWUgcmVhbCBkaWZmZXJlbmNlcy4KCiMjIyMgTW9ub2N5dGVzLCBOZXV0cm9waGlscywgYW5kIEVvc2lub3BoaWxzCgojIENvbnRyYXN0cyBhbmQgY29sb3JzIG9mIGludGVyZXN0CgpUaGlzIG1pZ2h0IGJlIGEgYml0IGVhcmx5IHRvIGNvbnNpZGVyIHRoZSBjb250cmFzdHMsIGJ1dCBJIHRoaW5rIHdlCnNob3VsZCBjb25zaWRlciB0aGlzIHF1ZXN0aW9uIGltbWVkaWF0ZWx5LiAgVGhlIG1haW4gdGhpbmcgd2Ugd2lsbCBiZQpjb21wYXJpbmcgaXMgb2YgY291cnNlIGN1cmUgdnMuIGZhaWw7IGJ1dCB3ZSBtYXkgYWxzbyBsb29rIGF0IHRoZQp2aXNpdHMgYW5kIGNvbXBhcmUgY2VsbCB0eXBlcy4KCmBgYHtyIGRlZmluZV9jb250cmFzdHN9CmNmX2NvbnRyYXN0cyA8LSBsaXN0KAogICAgImZhaWxfdnNfY3VyZSIgPSBjKCJmYWlsdXJlIiwgImN1cmUiKSkKdmlzaXRfY29udHJhc3RzIDwtIGxpc3QoCiAgICAidjJ2MSIgPSBjKCJjMiIsICJjMSIpLAogICAgInYzdjEiID0gYygiYzMiLCAiYzEiKSwKICAgICJ2M3YyIiA9IGMoImMzIiwgImMyIikpCnR5cGVfY29udHJhc3RzIDwtIGxpc3QoCiAgICAibW9ub19iaW9wc3kiID0gYygibW9ub2N5dGVzIiwgImJpb3BzeSIpLAogICAgImVvc2lub3BoaWxfYmlvcHN5IiA9IGMoImVvc2lub3BoaWxzIiwgImJpb3BzeSIpLAogICAgIm5ldXRyb3BoaWxfYmlvcHN5IiA9IGMoIm5ldXRyb3BoaWxzIiwgImJpb3BzeSIpKQp2aXNpdF9jZl9jb250cmFzdHMgPC0gbGlzdCgKICAgICJ2MWZhaWxfdnNfY3VyZSIgPSBjKCJ2MWZhaWx1cmUiLCAidjFjdXJlIiksCiAgICAidjJmYWlsX3ZzX2N1cmUiID0gYygidjJmYWlsdXJlIiwgInYyY3VyZSIpLAogICAgInYzZmFpbF92c19jdXJlIiA9IGMoInYzZmFpbHVyZSIsICJ2M2N1cmUiKSkKYGBgCgpTYW1wbGUgSURzIHN0YXJ0aW5nIHdpdGggMTogQ2FsaQogICAgICAgSURzIHN0YXJ0aW5nIHdpdGggMjogVHVtYWNvCgojIERpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2VzCgpUaGUgcHJpbWFyeSBnb2FsIGlzIHRvIGxlYXJuIGFib3V0IGN1cmUgdnMuIGZhaWwuCgojIyBDdXJlL0ZhaWwsIGFsbCBzYW1wbGVzCgpOb3cgbGV0IHVzIHN0YXJ0IHBlcmZvcm1pbmcgdGhlIHZhcmlvdXMgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24KYW5hbHlzZXMsIHN0YXJ0aW5nIHdpdGggdGhlIHNldCBvZiBhbGwvbW9zdCBjbGluaWNhbCBzYW1wbGVzLgoKYGBge3IgY2ZfYWxsX2RlfQpjZl9jbGluaWNhbF9kZSA8LSBhbGxfcGFpcndpc2UoaHNfY2xpbmljYWwsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCmNmX2NsaW5pY2FsX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIGNmX2NsaW5pY2FsX2RlLAogICAga2VlcGVycyA9IGNmX2NvbnRyYXN0cywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvY2ZfY2xpbmljYWxfdGFibGVzLXZ7dmVyfS54bHN4IikpCmNmX2NsaW5pY2FsX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgY2ZfY2xpbmljYWxfdGFibGVzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9jZl9jbGluaWNhbF9zaWctdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgQnkgY2VsbCB0eXBlCgojIyMjIEN1cmUvRmFpbCwgQmlvcHNpZXMKCmBgYHtyIGNmX2Jpb3BzeV9kZX0KY2ZfYmlvcHN5X2RlIDwtIGFsbF9wYWlyd2lzZShiaW9wc3lfc2FtcGxlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKY2ZfYmlvcHN5X3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIGNmX2Jpb3BzeV9kZSwKICAgIGtlZXBlcnMgPSBjZl9jb250cmFzdHMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2NmX2Jpb3BzeV90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKY2ZfYmlvcHN5X3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgY2ZfYmlvcHN5X3RhYmxlcywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvY2ZfYmlvcHN5X3NpZy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyMgQ3VyZS9GYWlsLCBNb25vY3l0ZXMKCmBgYHtyIGNmX21vbm9jeXRlX2RlfQpjZl9tb25vY3l0ZV9zdmFfZGUgPC0gYWxsX3BhaXJ3aXNlKG1vbm9jeXRlX3NhbXBsZXMsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCmNmX21vbm9jeXRlX3N2YV90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBjZl9tb25vY3l0ZV9zdmFfZGUsCiAgICBrZWVwZXJzID0gY2ZfY29udHJhc3RzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9jZl9tb25vY3l0ZV9zdmFfdGFibGVzLXZ7dmVyfS54bHN4IikpCmNmX21vbm9jeXRlX3N2YV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGNmX21vbm9jeXRlX3N2YV90YWJsZXMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2NmX21vbm9jeXRlX3N2YV9zaWctdnt2ZXJ9Lnhsc3giKSkKCmNmX21vbm9jeXRlX2JhdGNodmlzaXRfZGUgPC0gYWxsX3BhaXJ3aXNlKG1vbm9jeXRlX3NhbXBsZXMsIG1vZGVsX2JhdGNoID0gVFJVRSwgZmlsdGVyID0gVFJVRSkKY2ZfbW9ub2N5dGVfYmF0Y2h2aXNpdF90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBjZl9tb25vY3l0ZV9iYXRjaHZpc2l0X2RlLAogICAga2VlcGVycyA9IGNmX2NvbnRyYXN0cywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvY2ZfbW9ub2N5dGVfYmF0Y2h2aXNpdF90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKY2ZfbW9ub2N5dGVfYmF0Y2h2aXNpdF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGNmX21vbm9jeXRlX2JhdGNodmlzaXRfdGFibGVzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9jZl9tb25vY3l0ZV9iYXRjaHZpc2l0X3NpZy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyMgQ3VyZS9GYWlsLCBvbmx5IHRoZSBUdW1hY28gc2FtcGxlcwoKYGBge3IgY2ZfdHVtYWNvX29ubHl9CmNmX3R1bWFjb19tb25vY3l0ZV9zdmFfZGUgPC0gYWxsX3BhaXJ3aXNlKHR1bWFjb19tb25vY3l0ZSwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKY2ZfdHVtYWNvX21vbm9jeXRlX3N2YV90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBjZl90dW1hY29fbW9ub2N5dGVfc3ZhX2RlLAogICAga2VlcGVycyA9IGNmX2NvbnRyYXN0cywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvY2ZfbW9ub2N5dGVfdGFibGVzX3N2YV90dW1hY28tdnt2ZXJ9Lnhsc3giKSkKY2ZfdHVtYWNvX21vbm9jeXRlX3N2YV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGNmX3R1bWFjb19tb25vY3l0ZV9zdmFfdGFibGVzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9jZl9tb25vY3l0ZV9zdmFfdHVtYWNvX3NpZy12e3Zlcn0ueGxzeCIpKQoKY2ZfdHVtYWNvX21vbm9jeXRlX2JhdGNodmlzaXRfZGUgPC0gYWxsX3BhaXJ3aXNlKHR1bWFjb19tb25vY3l0ZSwgbW9kZWxfYmF0Y2ggPSBUUlVFLCBmaWx0ZXIgPSBUUlVFKQpjZl90dW1hY29fbW9ub2N5dGVfYmF0Y2h2aXNpdF90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBjZl90dW1hY29fbW9ub2N5dGVfYmF0Y2h2aXNpdF9kZSwKICAgIGtlZXBlcnMgPSBjZl9jb250cmFzdHMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2NmX21vbm9jeXRlX3RhYmxlc19iYXRjaHZpc2l0X3R1bWFjby12e3Zlcn0ueGxzeCIpKQpjZl90dW1hY29fbW9ub2N5dGVfYmF0Y2h2aXNpdF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGNmX3R1bWFjb19tb25vY3l0ZV9iYXRjaHZpc2l0X3RhYmxlcywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvY2ZfbW9ub2N5dGVfYmF0Y2h2aXNpdF90dW1hY29fc2lnLXZ7dmVyfS54bHN4IikpCgp0dW1hY29fc3ZhX2F1Y2MgPC0gY2FsY3VsYXRlX2F1Y2MoY2ZfdHVtYWNvX21vbm9jeXRlX3N2YV90YWJsZXNbWyJkYXRhIl1dW1siZmFpbF92c19jdXJlIl1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJsMj1jZl9tb25vY3l0ZV9zdmFfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5PSJkZXNlcV9hZGpwIiwgbHk9ImRlc2VxX2xvZ2ZjIikKdHVtYWNvX3N2YV9hdWNjCgpzaGFyZWRfaWRzIDwtIHJvd25hbWVzKGNmX3R1bWFjb19tb25vY3l0ZV9zdmFfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSkgJWluJQogIHJvd25hbWVzKGNmX21vbm9jeXRlX3N2YV90YWJsZXNbWyJkYXRhIl1dW1siZmFpbF92c19jdXJlIl1dKQpmaXJzdCA8LSBjZl9tb25vY3l0ZV9zdmFfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXVtzaGFyZWRfaWRzLCBdCnNlY29uZCA8LSBjZl90dW1hY29fbW9ub2N5dGVfc3ZhX3RhYmxlc1tbImRhdGEiXV1bWyJmYWlsX3ZzX2N1cmUiXV1bcm93bmFtZXMoZmlyc3QpLCBdCmNvci50ZXN0KGZpcnN0W1siZGVzZXFfbG9nZmMiXV0sIHNlY29uZFtbImRlc2VxX2xvZ2ZjIl1dKQoKCnR1bWFjb19iYXRjaF9hdWNjIDwtIGNhbGN1bGF0ZV9hdWNjKGNmX3R1bWFjb19tb25vY3l0ZV9iYXRjaHZpc2l0X3RhYmxlc1tbImRhdGEiXV1bWyJmYWlsX3ZzX2N1cmUiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YmwyPWNmX21vbm9jeXRlX2JhdGNodmlzaXRfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5PSJkZXNlcV9hZGpwIiwgbHk9ImRlc2VxX2xvZ2ZjIikKdHVtYWNvX2JhdGNoX2F1Y2MKCnNoYXJlZF9pZHMgPC0gcm93bmFtZXMoY2ZfdHVtYWNvX21vbm9jeXRlX2JhdGNodmlzaXRfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSkgJWluJQogIHJvd25hbWVzKGNmX21vbm9jeXRlX2JhdGNodmlzaXRfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSkKZmlyc3QgPC0gY2ZfbW9ub2N5dGVfYmF0Y2h2aXNpdF90YWJsZXNbWyJkYXRhIl1dW1siZmFpbF92c19jdXJlIl1dW3NoYXJlZF9pZHMsIF0Kc2Vjb25kIDwtIGNmX3R1bWFjb19tb25vY3l0ZV9iYXRjaHZpc2l0X3RhYmxlc1tbImRhdGEiXV1bWyJmYWlsX3ZzX2N1cmUiXV1bcm93bmFtZXMoZmlyc3QpLCBdCmNvci50ZXN0KGZpcnN0W1siZGVzZXFfbG9nZmMiXV0sIHNlY29uZFtbImRlc2VxX2xvZ2ZjIl1dKQoKZmlyc3Rfc2lnX25hbWVzIDwtIHJvd25hbWVzKGNmX21vbm9jeXRlX2JhdGNodmlzaXRfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJmYWlsX3ZzX2N1cmUiXV0pCnNlY29uZF9zaWdfbmFtZXMgPC0gcm93bmFtZXMoY2ZfdHVtYWNvX21vbm9jeXRlX2JhdGNodmlzaXRfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJmYWlsX3ZzX2N1cmUiXV0pCmJhdGNoX3Zlbm5fbHN0IDwtIGxpc3QoYWxsX2JhdGNoID0gZmlyc3Rfc2lnX25hbWVzLCB0dW1hY29fYmF0Y2ggPSBzZWNvbmRfc2lnX25hbWVzKQpiYXRjaF92ZW5uIDwtIFZlbm5lcmFibGU6OlZlbm4oYmF0Y2hfdmVubl9sc3QpClZlbm5lcmFibGU6OnBsb3QoYmF0Y2hfdmVubikKYGBgCgojIyMjIEN1cmUvRmFpbCwgTmV1dHJvcGhpbHMKCmBgYHtyIGNmX25ldXRyb3BoaWxfZGV9CmNmX25ldXRyb3BoaWxfZGUgPC0gYWxsX3BhaXJ3aXNlKG5ldXRyb3BoaWxfc2FtcGxlcywgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKY2ZfbmV1dHJvcGhpbF90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBjZl9uZXV0cm9waGlsX2RlLAogICAga2VlcGVycyA9IGNmX2NvbnRyYXN0cywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvY2ZfbmV1dHJvcGhpbF90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKY2ZfbmV1dHJvcGhpbF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGNmX25ldXRyb3BoaWxfdGFibGVzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9jZl9uZXV0cm9waGlsX3NpZy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyMgQ3VyZS9GYWlsLCBFb3Npbm9waGlscwoKYGBge3IgY2ZfZW9zaW5vcGhpbF9kZX0KY2ZfZW9zaW5vcGhpbF9kZSA8LSBhbGxfcGFpcndpc2UoZW9zaW5vcGhpbF9zYW1wbGVzLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpjZl9lb3Npbm9waGlsX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIGNmX2Vvc2lub3BoaWxfZGUsCiAgICBrZWVwZXJzID0gY2ZfY29udHJhc3RzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9jZl9lb3Npbm9waGlsX3RhYmxlcy12e3Zlcn0ueGxzeCIpKQpjZl9lb3Npbm9waGlsX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgY2ZfZW9zaW5vcGhpbF90YWJsZXMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2NmX2Vvc2lub3BoaWxfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIyBDdXJlL0ZhaWwgY2xpbmljYWwgKE5vdCBiaW9wc2llcykKCmBgYHtyIGNmX25vYmlvcHN5X2RlfQpjZl9ub2Jpb3BzeV9kZSA8LSBhbGxfcGFpcndpc2UoaHNfY2xpbmljYWxfbm9iaW9wLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpjZl9ub2Jpb3BzeV90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBjZl9ub2Jpb3BzeV9kZSwKICAgIGtlZXBlcnMgPSBjZl9jb250cmFzdHMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL2NmX25vYmlvcHN5X3RhYmxlcy12e3Zlcn0ueGxzeCIpKQpjZl9ub2Jpb3BzeV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGNmX25vYmlvcHN5X3RhYmxlcywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvY2Zfbm9iaW9wc3lfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIEJ5IHZpc2l0CgpGb3IgdGhlc2UgY29udHJhc3RzLCB3ZSB3YW50IHRvIHNlZSBmYWlsX3YxIHZzLiBjdXJlX3YxLCBmYWlsX3YyCnZzLiBjdXJlX3YyIGV0Yy4gIEFzIGEgcmVzdWx0LCB3ZSB3aWxsIG5lZWQgdG8ganVnZ2xlIHRoZSBkYXRhCnNsaWdodGx5IGFuZCBhZGQgYW5vdGhlciBzZXQgb2YgY29udHJhc3RzLgoKIyMjIFNldHRpbmcgdXAKCmBgYHtyIHNldHVwX3Zpc2l0X2NmX2RhdGFfY29udHJhc3RzfQp2aXNpdF9jZl9leHB0X2ZhY3RvciA8LSBwYXN0ZTAoInYiLCBwRGF0YShoc19jbGluaWNhbClbWyJ2aXNpdG51bWJlciJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKGhzX2NsaW5pY2FsKVtbImNvbmRpdGlvbiJdXSkKdmlzaXRfY2ZfZXhwdCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGhzX2NsaW5pY2FsLCBmYWN0ID0gdmlzaXRfY2ZfZXhwdF9mYWN0b3IpCgp2aXNpdF9jZl9lb3Npbm9waGlsIDwtIHN1YnNldF9leHB0KHZpc2l0X2NmX2V4cHQsIHN1YnNldD0idHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQp2aXNpdF9jZl90dW1hY29fZW9zaW5vcGhpbCA8LSBzdWJzZXRfZXhwdCh2aXNpdF9jZl9lb3Npbm9waGlsLCBzdWJzZXQ9ImNsaW5pYz09J1R1bWFjbyciKQp2aXNpdF9jZl9tb25vY3l0ZSA8LSBzdWJzZXRfZXhwdCh2aXNpdF9jZl9leHB0LCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnZpc2l0X2NmX3R1bWFjb19tb25vY3l0ZSA8LSBzdWJzZXRfZXhwdCh2aXNpdF9jZl9tb25vY3l0ZSwgc3Vic2V0PSJjbGluaWM9PSdUdW1hY28nIikKdmlzaXRfY2ZfbmV1dHJvcGhpbCA8LSBzdWJzZXRfZXhwdCh2aXNpdF9jZl9leHB0LCBzdWJzZXQ9InR5cGVvZmNlbGxzPT0nbmV1dHJvcGhpbHMnIikKdmlzaXRfY2ZfdHVtYWNvX25ldXRyb3BoaWwgPC0gc3Vic2V0X2V4cHQodmlzaXRfY2ZfbmV1dHJvcGhpbCwgc3Vic2V0PSJjbGluaWM9PSdUdW1hY28nIikKYGBgCgojIyMjIEN1cmUvRmFpbCBieSB2aXNpdHMsIGFsbCBjZWxsIHR5cGVzCgpgYGB7ciB2aXNpdF9jZl9hbGxfZGV9CnZpc2l0X2NmX2FsbF9kZSA8LSBhbGxfcGFpcndpc2UodmlzaXRfY2ZfZXhwdCwgbW9kZWxfYmF0Y2ggPSAic3Zhc2VxIiwgZmlsdGVyID0gVFJVRSkKdmlzaXRfY2ZfYWxsX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHZpc2l0X2NmX2FsbF9kZSwKICAgIGtlZXBlcnMgPSB2aXNpdF9jZl9jb250cmFzdHMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3Zpc2l0X2NmX2FsbF90YWJsZXMtdnt2ZXJ9Lnhsc3giKSkKdmlzaXRfY2ZfYWxsX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdmlzaXRfY2ZfYWxsX3RhYmxlcywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvdmlzaXRfY2ZfYWxsX3NpZy12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyMgQ3VyZS9GYWlsIGJ5IHZpc2l0LCBNb25vY3l0ZXMKCmBgYHtyIHZpc2l0X2NmX21vbm9jeXRlX2RlfQp2aXNpdF9jZl9tb25vY3l0ZV9kZSA8LSBhbGxfcGFpcndpc2UodmlzaXRfY2ZfbW9ub2N5dGUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnZpc2l0X2NmX21vbm9jeXRlX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHZpc2l0X2NmX21vbm9jeXRlX2RlLAogICAga2VlcGVycyA9IHZpc2l0X2NmX2NvbnRyYXN0cywKICAgIGV4Y2VsID0gZ2x1ZTo6Z2x1ZSgiZXhjZWwvdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzLXZ7dmVyfS54bHN4IikpCnZpc2l0X2NmX21vbm9jeXRlX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC92aXNpdF9jZl9tb25vY3l0ZV9zaWctdnt2ZXJ9Lnhsc3giKSkKCnYxZmNfZGVzZXFfbWEgPC0gdmlzaXRfY2ZfbW9ub2N5dGVfdGFibGVzW1sicGxvdHMiXV1bWyJ2MWZhaWxfdnNfY3VyZSJdXVtbImRlc2VxX21hX3Bsb3RzIl1dW1sicGxvdCJdXQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL21vbm9jeXRlX2NmX2RlX3YxX21hcGxvdC5wbmciKQp2MWZjX2Rlc2VxX21hCmNsb3NlZCA8LSBkZXYub2ZmKCkKdjFmY19kZXNlcV9tYQoKdjJmY19kZXNlcV9tYSA8LSB2aXNpdF9jZl9tb25vY3l0ZV90YWJsZXNbWyJwbG90cyJdXVtbInYyZmFpbF92c19jdXJlIl1dW1siZGVzZXFfbWFfcGxvdHMiXV1bWyJwbG90Il1dCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbW9ub2N5dGVfY2ZfZGVfdjJfbWFwbG90LnBuZyIpCnYyZmNfZGVzZXFfbWEKY2xvc2VkIDwtIGRldi5vZmYoKQp2MmZjX2Rlc2VxX21hCgp2M2ZjX2Rlc2VxX21hIDwtIHZpc2l0X2NmX21vbm9jeXRlX3RhYmxlc1tbInBsb3RzIl1dW1sidjNmYWlsX3ZzX2N1cmUiXV1bWyJkZXNlcV9tYV9wbG90cyJdXVtbInBsb3QiXV0KZGV2IDwtIHBwKGZpbGU9ImltYWdlcy9tb25vY3l0ZV9jZl9kZV92M19tYXBsb3QucG5nIikKdjNmY19kZXNlcV9tYQpjbG9zZWQgPC0gZGV2Lm9mZigpCnYzZmNfZGVzZXFfbWEKCiMjIFJlcGVhdCBmb3IgdGhlIHR1bWFjbyBzdWJzZXQKdmlzaXRfY2ZfdHVtYWNvX21vbm9jeXRlX2RlIDwtIGFsbF9wYWlyd2lzZSh2aXNpdF9jZl90dW1hY29fbW9ub2N5dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2JhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnZpc2l0X2NmX3R1bWFjb19tb25vY3l0ZV90YWJsZXMgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICB2aXNpdF9jZl90dW1hY29fbW9ub2N5dGVfZGUsCiAgICBrZWVwZXJzID0gdmlzaXRfY2ZfY29udHJhc3RzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC92aXNpdF9jZl90dW1hY29fbW9ub2N5dGVfdGFibGVzLXZ7dmVyfS54bHN4IikpCnZpc2l0X2NmX3R1bWFjb19tb25vY3l0ZV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHZpc2l0X2NmX3R1bWFjb19tb25vY3l0ZV90YWJsZXMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3Zpc2l0X2NmX3R1bWFjb19tb25vY3l0ZV9zaWctdnt2ZXJ9Lnhsc3giKSkKYGBgCgpPbmUgcXVlcnkgZnJvbSBBbGVqYW5kcm8gaXMgdG8gbG9vayBhdCB0aGUgZ2VuZXMgc2hhcmVkIHVwL2Rvd24gYWNyb3NzCnZpc2l0cy4gIEkgYW0gbm90IGVudGlyZWx5IGNlcnRhaW4gd2UgaGF2ZSBlbm91Z2ggc2FtcGxlcyBmb3IgdGhpcyB0bwp3b3JrLCBidXQgbGV0IHVzIGZpbmQgb3V0LgoKSSBhbSB0aGlua2luZyB0aGlzIGlzIGEgZ29vZCBwbGFjZSB0byB1c2UgdGhlIEFVQ0MgY3VydmVzIEkgbGVhcm5lZAphYm91dCB0aGFua3MgdG8gSnVsaWUgQ3JpZGxhbmQuCgpOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpcyBhbGwgbW9ub2N5dGUgc2FtcGxlcywgdGhpcyBzaG91bGQgdGhlcmVmb3JlCnBvdGVudGlhbGx5IGJlIG1vdmVkIHVwIGFuZCBhIHZlcnNpb24gb2YgdGhpcyB3aXRoIG9ubHkgdGhlIFR1bWFjbwpzYW1wbGVzIHB1dCBoZXJlPwoKYGBge3IgbW9ub2N5dGVfc2hhcmVkX2RlX2dlbmVzfQp2MWZjIDwtIHZpc2l0X2NmX21vbm9jeXRlX3RhYmxlc1tbImRhdGEiXV1bWyJ2MWZhaWxfdnNfY3VyZSJdXQp2MmZjIDwtIHZpc2l0X2NmX21vbm9jeXRlX3RhYmxlc1tbImRhdGEiXV1bWyJ2MmZhaWxfdnNfY3VyZSJdXQp2M2ZjIDwtIHZpc2l0X2NmX21vbm9jeXRlX3RhYmxlc1tbImRhdGEiXV1bWyJ2M2ZhaWxfdnNfY3VyZSJdXQoKdjFfc2lnIDwtIGMoCiAgICByb3duYW1lcyh2aXNpdF9jZl9tb25vY3l0ZV9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbInYxZmFpbF92c19jdXJlIl1dKSwKICAgIHJvd25hbWVzKHZpc2l0X2NmX21vbm9jeXRlX3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWyJ2MWZhaWxfdnNfY3VyZSJdXSkpCnYyX3NpZyA8LSBjKAogICAgcm93bmFtZXModmlzaXRfY2ZfbW9ub2N5dGVfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJ2MmZhaWxfdnNfY3VyZSJdXSksCiAgICByb3duYW1lcyh2aXNpdF9jZl9tb25vY3l0ZV9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sidjJmYWlsX3ZzX2N1cmUiXV0pKQp2M19zaWcgPC0gYygKICAgIHJvd25hbWVzKHZpc2l0X2NmX21vbm9jeXRlX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1sidjJmYWlsX3ZzX2N1cmUiXV0pLAogICAgcm93bmFtZXModmlzaXRfY2ZfbW9ub2N5dGVfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbInYyZmFpbF92c19jdXJlIl1dKSkKCm1vbm9jeXRlX3Zpc2l0X2F1Y2NfdjJ2MSA8LSBjYWxjdWxhdGVfYXVjYyh2MWZjLCB0YmwyPXYyZmMsIHB5PSJkZXNlcV9hZGpwIiwgbHk9ImRlc2VxX2xvZ2ZjIikKZGV2IDwtIHBwKGZpbGU9ImltYWdlcy9tb25vY3l0ZV92aXNpdF92MnYxX2F1Y2MucG5nIikKbW9ub2N5dGVfdmlzaXRfYXVjY192MnYxW1sicGxvdCJdXQpjbG9zZWQgPC0gZGV2Lm9mZigpCm1vbm9jeXRlX3Zpc2l0X2F1Y2NfdjJ2MVtbInBsb3QiXV0KCm1vbm9jeXRlX3Zpc2l0X2F1Y2NfdjN2MSA8LSBjYWxjdWxhdGVfYXVjYyh2MWZjLCB0YmwyPXYzZmMsIHB5PSJkZXNlcV9hZGpwIiwgbHk9ImRlc2VxX2xvZ2ZjIikKZGV2IDwtIHBwKGZpbGU9ImltYWdlcy9tb25vY3l0ZV92aXNpdF92M3YxX2F1Y2MucG5nIikKbW9ub2N5dGVfdmlzaXRfYXVjY192M3YxW1sicGxvdCJdXQpjbG9zZWQgPC0gZGV2Lm9mZigpCm1vbm9jeXRlX3Zpc2l0X2F1Y2NfdjN2MVtbInBsb3QiXV0KYGBgCgojIyMjIFJlcGVhdCBmb3Igb25seSB0aGUgVHVtYWNvIHNhbXBsZXMKCmBgYHtyIGF1Y2NfdXBzZXRfdHVtYWNvfQp2MWZjX3R1bWFjbyA8LSB2aXNpdF9jZl90dW1hY29fbW9ub2N5dGVfdGFibGVzW1siZGF0YSJdXVtbInYxZmFpbF92c19jdXJlIl1dCnYyZmNfdHVtYWNvIDwtIHZpc2l0X2NmX3R1bWFjb19tb25vY3l0ZV90YWJsZXNbWyJkYXRhIl1dW1sidjJmYWlsX3ZzX2N1cmUiXV0KdjNmY190dW1hY28gPC0gdmlzaXRfY2ZfdHVtYWNvX21vbm9jeXRlX3RhYmxlc1tbImRhdGEiXV1bWyJ2M2ZhaWxfdnNfY3VyZSJdXQoKdjFfdHVtYWNvX3NpZyA8LSBjKAogICAgcm93bmFtZXModmlzaXRfY2ZfdHVtYWNvX21vbm9jeXRlX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1sidjFmYWlsX3ZzX2N1cmUiXV0pLAogICAgcm93bmFtZXModmlzaXRfY2ZfdHVtYWNvX21vbm9jeXRlX3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWyJ2MWZhaWxfdnNfY3VyZSJdXSkpCnYyX3R1bWFjb19zaWcgPC0gYygKICAgIHJvd25hbWVzKHZpc2l0X2NmX3R1bWFjb19tb25vY3l0ZV9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbInYyZmFpbF92c19jdXJlIl1dKSwKICAgIHJvd25hbWVzKHZpc2l0X2NmX3R1bWFjb19tb25vY3l0ZV9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sidjJmYWlsX3ZzX2N1cmUiXV0pKQp2M190dW1hY29fc2lnIDwtIGMoCiAgICByb3duYW1lcyh2aXNpdF9jZl90dW1hY29fbW9ub2N5dGVfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJ2MmZhaWxfdnNfY3VyZSJdXSksCiAgICByb3duYW1lcyh2aXNpdF9jZl90dW1hY29fbW9ub2N5dGVfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbInYyZmFpbF92c19jdXJlIl1dKSkKCm1vbm9jeXRlX3R1bWFjb192aXNpdF9hdWNjX3YydjEgPC0gY2FsY3VsYXRlX2F1Y2ModjFmY190dW1hY28sIHRibDI9djJmY190dW1hY28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHk9ImRlc2VxX2FkanAiLCBseT0iZGVzZXFfbG9nZmMiKQpkZXYgPC0gcHAoZmlsZT0iaW1hZ2VzL21vbm9jeXRlX3Zpc2l0X3R1bWFjb192MnYxX2F1Y2MucG5nIikKbW9ub2N5dGVfdHVtYWNvX3Zpc2l0X2F1Y2NfdjJ2MVtbInBsb3QiXV0KY2xvc2VkIDwtIGRldi5vZmYoKQptb25vY3l0ZV90dW1hY29fdmlzaXRfYXVjY192MnYxW1sicGxvdCJdXQoKbW9ub2N5dGVfdHVtYWNvX3Zpc2l0X2F1Y2NfdjN2MSA8LSBjYWxjdWxhdGVfYXVjYyh2MWZjX3R1bWFjbywgdGJsMj12M2ZjX3R1bWFjbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweT0iZGVzZXFfYWRqcCIsIGx5PSJkZXNlcV9sb2dmYyIpCmRldiA8LSBwcChmaWxlPSJpbWFnZXMvbW9ub2N5dGVfdmlzaXRfdHVtYWNvX3YzdjFfYXVjYy5wbmciKQptb25vY3l0ZV90dW1hY29fdmlzaXRfYXVjY192M3YxW1sicGxvdCJdXQpjbG9zZWQgPC0gZGV2Lm9mZigpCm1vbm9jeXRlX3R1bWFjb192aXNpdF9hdWNjX3YzdjFbWyJwbG90Il1dCgptb25vY3l0ZV90dW1hY29fdmlzaXRfYXVjY192M3YyIDwtIGNhbGN1bGF0ZV9hdWNjKHYzZmNfdHVtYWNvLCB0YmwyPXYyZmNfdHVtYWNvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5PSJkZXNlcV9hZGpwIiwgbHk9ImRlc2VxX2xvZ2ZjIikKZGV2IDwtIHBwKGZpbGU9ImltYWdlcy9tb25vY3l0ZV92aXNpdF90dW1hY29fdjN2Ml9hdWNjLnBuZyIpCm1vbm9jeXRlX3R1bWFjb192aXNpdF9hdWNjX3YzdjJbWyJwbG90Il1dCmNsb3NlZCA8LSBkZXYub2ZmKCkKbW9ub2N5dGVfdHVtYWNvX3Zpc2l0X2F1Y2NfdjN2MltbInBsb3QiXV0KYGBgCgojIyMjIEN1cmUvRmFpbCBieSB2aXNpdCwgTmV1dHJvcGhpbHMKYQpgYGB7ciB2aXNpdF9jZl9uZXV0cm9waGlsX2RlfQp2aXNpdF9jZl9uZXV0cm9waGlsX2RlIDwtIGFsbF9wYWlyd2lzZSh2aXNpdF9jZl9uZXV0cm9waGlsLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp2aXNpdF9jZl9uZXV0cm9waGlsX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHZpc2l0X2NmX25ldXRyb3BoaWxfZGUsCiAgICBrZWVwZXJzID0gdmlzaXRfY2ZfY29udHJhc3RzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC92aXNpdF9jZl9uZXV0cm9waGlsX3RhYmxlcy12e3Zlcn0ueGxzeCIpKQp2aXNpdF9jZl9uZXV0cm9waGlsX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdmlzaXRfY2ZfbmV1dHJvcGhpbF90YWJsZXMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3Zpc2l0X2NmX25ldXRyb3BoaWxfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIyBDdXJlL0ZhaWwgYnkgdmlzaXQsIEVvc2lub3BoaWxzCgpgYGB7ciB2aXNpdF9jZl9lb3Npbm9waGlsX2RlfQp2aXNpdF9jZl9lb3Npbm9waGlsX2RlIDwtIGFsbF9wYWlyd2lzZSh2aXNpdF9jZl9lb3Npbm9waGlsLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQp2aXNpdF9jZl9lb3Npbm9waGlsX3RhYmxlcyA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHZpc2l0X2NmX2Vvc2lub3BoaWxfZGUsCiAgICBrZWVwZXJzID0gdmlzaXRfY2ZfY29udHJhc3RzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC92aXNpdF9jZl9lb3Npbm9waGlsX3RhYmxlcy12e3Zlcn0ueGxzeCIpKQp2aXNpdF9jZl9lb3Npbm9waGlsX3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogICAgdmlzaXRfY2ZfZW9zaW5vcGhpbF90YWJsZXMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3Zpc2l0X2NmX2Vvc2lub3BoaWxfc2lnLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgUGVyc2lzdGVuY2UgaW4gdmlzaXQgMwoKSGF2aW5nIHB1dCBzb21lIFNMIHJlYWQgbWFwcGluZyBpbmZvcm1hdGlvbiBpbiB0aGUgc2FtcGxlIHNoZWV0LCBNYXJpYQpBZGVsYWlkYSBhZGRlZCBhIG5ldyBjb2x1bW4gdXNpbmcgaXQgd2l0aCB0aGUgcHV0YXRpdmUgcGVyc2lzdGVuY2UKc3RhdGUgb24gYSBwZXItc2FtcGxlIGJhc2lzLiAgT25lIHF1ZXN0aW9uIHdoaWNoIGFyaXNlZCBmcm9tIHRoYXQ6CndoYXQgZGlmZmVyZW5jZXMgYXJlIG9ic2VydmFibGUgYmV0d2VlbiB0aGUgcGVyc2lzdGVudCB5ZXMgdnMuIG5vCnNhbXBsZXMgb24gYSBwZXItY2VsbC10eXBlIGJhc2lzIGFtb25nIHRoZSB2aXNpdCAzIHNhbXBsZXMuCgojIyMgU2V0dGluZyB1cAoKRmlyc3QgdGhpbmdzIGZpcnN0LCBjcmVhdGUgdGhlIGRhdGFzZXRzLgoKYGBge3IgcGVyc2lzdGVuY2Vfc2V0dXB9CnBlcnNpc3RlbmNlX2V4cHQgPC0gc3Vic2V0X2V4cHQoaHNfY2xpbmljYWwsIHN1YnNldCA9ICJwZXJzaXN0ZW5jZT09J1knfHBlcnNpc3RlbmNlPT0nTiciKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAndmlzaXRudW1iZXI9PTMnKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAncGVyc2lzdGVuY2UnKQoKIyMgcGVyc2lzdGVuY2VfYmlvcHN5IDwtIHN1YnNldF9leHB0KHBlcnNpc3RlbmNlX2V4cHQsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J2Jpb3BzeSciKQpwZXJzaXN0ZW5jZV9tb25vY3l0ZSA8LSBzdWJzZXRfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdtb25vY3l0ZXMnIikKcGVyc2lzdGVuY2VfbmV1dHJvcGhpbCA8LSBzdWJzZXRfZXhwdChwZXJzaXN0ZW5jZV9leHB0LCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSduZXV0cm9waGlscyciKQpwZXJzaXN0ZW5jZV9lb3Npbm9waGlsIDwtIHN1YnNldF9leHB0KHBlcnNpc3RlbmNlX2V4cHQsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J2Vvc2lub3BoaWxzJyIpCmBgYAoKIyMjIFRha2UgYSBsb29rCgpTZWUgaWYgdGhlcmUgYXJlIGFueSBwYXR0ZXJucyB3aGljaCBsb29rIHVzYWJsZS4KCmBgYHtyIHBlcnNpc3RlbmNlX3Bsb3R9CiMjIEFsbApwZXJzaXN0ZW5jZV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSAicXVhbnQiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9ub3JtKSRwbG90CnBlcnNpc3RlbmNlX25iIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX2V4cHQsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9uYikkcGxvdAoKIyMgQmlvcHNpZXMKIyNwZXJzaXN0ZW5jZV9iaW9wc3lfbm9ybSA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9iaW9wc3ksIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCiMjcGxvdF9wY2EocGVyc2lzdGVuY2VfYmlvcHN5X25vcm0pJHBsb3QKIyMgSW5zdWZmaWNpZW50IGRhdGEKCiMjIE1vbm9jeXRlcwpwZXJzaXN0ZW5jZV9tb25vY3l0ZV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX21vbm9jeXRlLCB0cmFuc2Zvcm0gPSAibG9nMiIsIGNvbnZlcnQgPSAiY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gInF1YW50IiwgZmlsdGVyID0gVFJVRSkKcGxvdF9wY2EocGVyc2lzdGVuY2VfbW9ub2N5dGVfbm9ybSkkcGxvdApwZXJzaXN0ZW5jZV9tb25vY3l0ZV9uYiA8LSBub3JtYWxpemVfZXhwdChwZXJzaXN0ZW5jZV9tb25vY3l0ZSwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoID0gInN2YXNlcSIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX21vbm9jeXRlX25iKSRwbG90CgojIyBOZXV0cm9waGlscwpwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX25vcm0gPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfbmV1dHJvcGhpbCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX25ldXRyb3BoaWxfbm9ybSkkcGxvdApwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX25iIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX25ldXRyb3BoaWwsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX25iKSRwbG90CgojIyBFb3Npbm9waGlscwpwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX25vcm0gPC0gbm9ybWFsaXplX2V4cHQocGVyc2lzdGVuY2VfZW9zaW5vcGhpbCwgdHJhbnNmb3JtID0gImxvZzIiLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9ICJxdWFudCIsIGZpbHRlciA9IFRSVUUpCnBsb3RfcGNhKHBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfbm9ybSkkcGxvdApwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX25iIDwtIG5vcm1hbGl6ZV9leHB0KHBlcnNpc3RlbmNlX2Vvc2lub3BoaWwsIHRyYW5zZm9ybSA9ICJsb2cyIiwgY29udmVydCA9ICJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCA9ICJzdmFzZXEiLCBmaWx0ZXIgPSBUUlVFKQpwbG90X3BjYShwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX25iKSRwbG90CmBgYAoKIyMjIHBlcnNpc3RlbmNlIERFCgpgYGB7ciBwZXJzaXN0ZW5jZV9kZX0KcGVyc2lzdGVuY2VfZGUgPC0gYWxsX3BhaXJ3aXNlKHBlcnNpc3RlbmNlX2V4cHQsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCnBlcnNpc3RlbmNlX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgcGVyc2lzdGVuY2VfZGUsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3BlcnNpc3RlbmNlX2FsbF9kZS12e3Zlcn0ueGxzeCIpKQpwZXJzaXN0ZW5jZV9tb25vY3l0ZV9kZSA8LSBhbGxfcGFpcndpc2UocGVyc2lzdGVuY2VfbW9ub2N5dGUsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCnBlcnNpc3RlbmNlX21vbm9jeXRlX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgcGVyc2lzdGVuY2VfbW9ub2N5dGVfZGUsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3BlcnNpc3RlbmNlX21vbm9jeXRlX2RlLXZ7dmVyfS54bHN4IikpCnBlcnNpc3RlbmNlX25ldXRyb3BoaWxfZGUgPC0gYWxsX3BhaXJ3aXNlKHBlcnNpc3RlbmNlX25ldXRyb3BoaWwsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCnBlcnNpc3RlbmNlX25ldXRyb3BoaWxfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBwZXJzaXN0ZW5jZV9uZXV0cm9waGlsX2RlLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9wZXJzaXN0ZW5jZV9uZXV0cm9waGlsX2RlLXZ7dmVyfS54bHN4IikpCnBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfZGUgPC0gYWxsX3BhaXJ3aXNlKHBlcnNpc3RlbmNlX2Vvc2lub3BoaWwsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCnBlcnNpc3RlbmNlX2Vvc2lub3BoaWxfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoCiAgICBwZXJzaXN0ZW5jZV9lb3Npbm9waGlsX2RlLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC9wZXJzaXN0ZW5jZV9lb3Npbm9waGlsX2RlLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMgQ29tcGFyaW5nIHZpc2l0cyB3aXRob3V0IHJlZ2FyZCB0byBjdXJlL2ZhaWwKCiMjIyBBbGwgY2VsbCB0eXBlcwoKYGBge3IgZGVfY2ZfdmlzaXRfYWxsfQp2aXNpdF9hbGxfZGUgPC0gYWxsX3BhaXJ3aXNlKHZpc2l0X2V4cHQsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCnZpc2l0X2FsbF90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIHZpc2l0X2FsbF9kZSwKICAgIGtlZXBlcnMgPSB2aXNpdF9jb250cmFzdHMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3Zpc2l0X2FsbF9kZS12e3Zlcn0ueGxzeCIpKQp2aXNpdF9hbGxfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICB2aXNpdF9hbGxfdGFibGUsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3Zpc2l0X2FsbF9zaWctdnt2ZXJ9Lnhsc3giKSkKdmlzaXRfYWxsX3NhdmVkIDwtIHNhdmUobGlzdCA9ICJ2aXNpdF9hbGxfdGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gZ2x1ZTo6Z2x1ZSgicmRhL3Zpc2l0X2FsbF90YWJsZS12e3Zlcn0ucmRhIikpCmBgYAoKIyMjIE1vbm9jeXRlIHNhbXBsZXMKCmBgYHtyIGRlX2NmX3Zpc2l0X21vbm9jeXRlfQp2aXNpdF9tb25vY3l0ZV9kZSA8LSBhbGxfcGFpcndpc2UodmlzaXRfbW9ub2N5dGUsIGZpbHRlciA9IFRSVUUsIG1vZGVsX2JhdGNoID0gInN2YXNlcSIpCnZpc2l0X21vbm9jeXRlX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdmlzaXRfbW9ub2N5dGVfZGUsCiAgICBrZWVwZXJzID0gdmlzaXRfY29udHJhc3RzLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC92aXNpdF9tb25vY3l0ZV9kZS12e3Zlcn0ueGxzeCIpKQp2aXNpdF9tb25vY3l0ZV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHZpc2l0X21vbm9jeXRlX3RhYmxlLAogICAgZXhjZWwgPSBnbHVlOjpnbHVlKCJleGNlbC92aXNpdF9tb25vY3l0ZV9zaWctdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgTmV1dHJvcGhpbCBzYW1wbGVzCgpgYGB7ciBkZV9jZl92aXNpdF9uZXV0cm9waGlsfQp2aXNpdF9uZXV0cm9waGlsX2RlIDwtIGFsbF9wYWlyd2lzZSh2aXNpdF9uZXV0cm9waGlsLCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQp2aXNpdF9uZXV0cm9waGlsX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdmlzaXRfbmV1dHJvcGhpbF9kZSwKICAgIGtlZXBlcnMgPSB2aXNpdF9jb250cmFzdHMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3Zpc2l0X25ldXRyb3BoaWxfZGUtdnt2ZXJ9Lnhsc3giKSkKdmlzaXRfbmV1dHJvcGhpbF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHZpc2l0X25ldXRyb3BoaWxfdGFibGUsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3Zpc2l0X25ldXRyb3BoaWxfc2lnLXZ7dmVyfS54bHN4IikpCnZpc2l0X25ldXRyb3BoaWxfc2F2ZWQgPC0gc2F2ZShsaXN0ID0gInZpc2l0X25ldXRyb3BoaWxfdGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGdsdWU6OmdsdWUoInJkYS92aXNpdF9uZXV0cm9waGlsX3RhYmxlLXZ7dmVyfS5yZGEiKSkKYGBgCgojIyMgRW9zaW5vcGhpbCBzYW1wbGVzCgpgYGB7ciBkZV9jZl92aXNpdF9lb3Npbm9waGlsfQp2aXNpdF9lb3Npbm9waGlsX2RlIDwtIGFsbF9wYWlyd2lzZSh2aXNpdF9lb3Npbm9waGlsLCBmaWx0ZXIgPSBUUlVFLCBtb2RlbF9iYXRjaCA9ICJzdmFzZXEiKQp2aXNpdF9lb3Npbm9waGlsX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgdmlzaXRfZW9zaW5vcGhpbF9kZSwKICAgIGtlZXBlcnMgPSB2aXNpdF9jb250cmFzdHMsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3Zpc2l0X2Vvc2lub3BoaWxfZGUtdnt2ZXJ9Lnhsc3giKSkKdmlzaXRfZW9zaW5vcGhpbF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIHZpc2l0X2Vvc2lub3BoaWxfdGFibGUsCiAgICBleGNlbCA9IGdsdWU6OmdsdWUoImV4Y2VsL3Zpc2l0X2Vvc2lub3BoaWxfc2lnLXZ7dmVyfS54bHN4IikpCnZpc2l0X2Vvc2lub3BoaWxfc2F2ZWQgPC0gc2F2ZShsaXN0ID0gInZpc2l0X2Vvc2lub3BoaWxfdGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGdsdWU6OmdsdWUoInJkYS92aXNpdF9lb3Npbm9waGlsX3RhYmxlLXZ7dmVyfS5yZGEiKSkKYGBgCgojIENvbXBhcmUgdGhlIHR3byBjbGluaWNzIGRpcmVjdGx5CgpgYGB7ciBjbGluaWNfY29tcGFyaXNvbjJ9Cm1vbm9jeXRlc19ieV9wbGFjZSA8LSBzZXRfZXhwdF9jb25kaXRpb25zKG1vbm9jeXRlX3NhbXBsZXMsIGZhY3Q9ImNsaW5pYyIpCmVvc2lub3BoaWxzX2J5X3BsYWNlIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoZW9zaW5vcGhpbF9zYW1wbGVzLCBmYWN0PSJjbGluaWMiKQpuZXV0cm9waGlsc19ieV9wbGFjZSA8LSBzZXRfZXhwdF9jb25kaXRpb25zKG5ldXRyb3BoaWxfc2FtcGxlcywgZmFjdD0iY2xpbmljIikKYmlvcHNpZXNfYnlfcGxhY2UgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhiaW9wc3lfc2FtcGxlcywgZmFjdD0iY2xpbmljIikKCm1vbm9jeXRlX3BsYWNlX2RlIDwtIGFsbF9wYWlyd2lzZShtb25vY3l0ZXNfYnlfcGxhY2UsIG1vZGVsX2JhdGNoPVRSVUUpCm1vbm9jeXRlX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgbW9ub2N5dGVfcGxhY2VfZGUsCiAgICBleGNlbD0iZXhjZWwvbW9ub2N5dGVzX2J5X3BsYWNlLXRhYmxlLnhsc3giKQptb25vY3l0ZV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIG1vbm9jeXRlX3RhYmxlLAogICAgZXhjZWw9ImV4Y2VsL21vbm9jeXRlc19ieV9wbGFjZS1zaWcueGxzeCIpCmVvc2lub3BoaWxfcGxhY2VfZGUgPC0gYWxsX3BhaXJ3aXNlKGVvc2lub3BoaWxzX2J5X3BsYWNlLCBtb2RlbF9iYXRjaD1UUlVFKQplb3Npbm9waGlsX3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgZW9zaW5vcGhpbF9wbGFjZV9kZSwKICAgIGV4Y2VsPSJleGNlbC9lb3Npbm9waGlsc19ieV9wbGFjZS10YWJsZS54bHN4IikKZW9zaW5vcGhpbF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICAgIGVvc2lub3BoaWxfdGFibGUsCiAgICBleGNlbD0iZXhjZWwvZW9zaW5vcGhpbHNfYnlfcGxhY2Utc2lnLnhsc3giKQpuZXV0cm9waGlsX3BsYWNlX2RlIDwtIGFsbF9wYWlyd2lzZShuZXV0cm9waGlsc19ieV9wbGFjZSwgbW9kZWxfYmF0Y2g9VFJVRSkKbmV1dHJvcGhpbF90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcygKICAgIG5ldXRyb3BoaWxfcGxhY2VfZGUsCiAgICBleGNlbD0iZXhjZWwvbmV1dHJvcGhpbHNfYnlfcGxhY2UtdGFibGUueGxzeCIpCm5ldXRyb3BoaWxfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICBuZXV0cm9waGlsX3RhYmxlLAogICAgZXhjZWw9ImV4Y2VsL25ldXRyb3BoaWxzX2J5X3BsYWNlLXNpZy54bHN4IikKYmlvcHN5X3BsYWNlX2RlIDwtIGFsbF9wYWlyd2lzZShiaW9wc2llc19ieV9wbGFjZSwgbW9kZWxfYmF0Y2g9VFJVRSkKYmlvcHN5X3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKAogICAgYmlvcHN5X3BsYWNlX2RlLAogICAgZXhjZWw9ImJpb3BzaWVzX2J5X3BsYWNlLXRhYmxlLnhsc3giKQpiaW9wc3lfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgICBiaW9wc3lfdGFibGUsCiAgICBleGNlbD0iYmlvcHNpZXNfYnlfcGxhY2Utc2lnLnhsc3giKQpgYGAKCiMgTGlrZWxpaG9vZCBSYXRpbyBUZXN0aW5nIChMUlQpCgojIyBTaGFyZWQgcGF0dGVybnMgYWNyb3NzIHZpc2l0cwoKYGBge3IgbHJ0X3Zpc2l0fQpjbGluaWNhbF9maWx0IDwtIG5vcm1hbGl6ZV9leHB0KGhzX2NsaW5pY2FsLCBmaWx0ZXIgPSBUUlVFKQpscnRfdmlzaXQgPC0gZGVzZXFfbHJ0KGNsaW5pY2FsX2ZpbHQsIHRyYW5zZm9ybSA9ICJ2c3QiLCBpbnRlcmFjdGlvbiA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0b3JfY29sdW1uID0gInZpc2l0bnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdF9jb2x1bW4gPSAiY2xpbmljYWxvdXRjb21lIikKc3VtbWFyeShscnRfdmlzaXRbWyJmYXZvcml0ZV9nZW5lcyJdXSkKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9YXMuZGF0YS5mcmFtZShscnRfdmlzaXRbWyJkZXNlcV90YWJsZSJdXSksCiAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC9scnRfY2xpbmljYWxfdmlzaXQtdnt2ZXJ9Lnhsc3giKSkKCmxydF9tb25vY3l0ZV92aXNpdCA8LSBkZXNlcV9scnQodmlzaXRfbW9ub2N5dGUsIHRyYW5zZm9ybSA9ICJ2c3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rvcl9jb2x1bW4gPSAidmlzaXRudW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0X2NvbHVtbiA9ICJjbGluaWNhbG91dGNvbWUiKQpscnRfbW9ub2N5dGVfdmlzaXQkY2x1c3Rlcl9kYXRhJHBsb3QKCmxydF90dW1hY29fbW9ub2N5dGVfdmlzaXQgPC0gZGVzZXFfbHJ0KHR1bWFjb19tb25vY3l0ZSwgdHJhbnNmb3JtID0gInZzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uID0gRkFMU0UsIG1pbmMgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdG9yX2NvbHVtbiA9ICJ2aXNpdG51bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0X2NvbHVtbiA9ICJjbGluaWNhbG91dGNvbWUiKQpgYGAKCiMjIFNoYXJlZCBwYXR0ZXJucyBhY3Jvc3MgY2VsbCB0eXBlcwoKYGBge3IgbHJ0X2NlbGx0eXBlfQpscnRfY2VsbHR5cGVfY2xpbmljYWxfdGVzdCA8LSBkZXNlcV9scnQoaHNfY2xpbmljYWwsIHRyYW5zZm9ybSA9ICJ2c3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rvcl9jb2x1bW4gPSAidHlwZW9mY2VsbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RfY29sdW1uID0gImNsaW5pY2Fsb3V0Y29tZSIpCgpkZXNlcV9scnRfZGYgPC0gbWVyZ2UoaHNfYW5ub3QsIGFzLmRhdGEuZnJhbWUobHJ0X2NlbGx0eXBlX2NsaW5pY2FsX3Rlc3RbWyJkZXNlcV90YWJsZSJdXSksIGFsbC55PVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBieT0icm93Lm5hbWVzIikKcm93bmFtZXMoZGVzZXFfbHJ0X2RmKSA8LSBkZXNlcV9scnRfZGZbWyJSb3cubmFtZXMiXV0KZGVzZXFfbHJ0X2RmW1siUm93Lm5hbWVzIl1dIDwtIE5VTEwKd3JpdHRlbiA8LSB3cml0ZV94bHN4KGRhdGE9ZGVzZXFfbHJ0X2RmLAogICAgICAgICAgICAgICAgICAgICAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvbHJ0X2NsaW5pY2FsX2NlbGx0eXBlLXZ7dmVyfS54bHN4IikpCmBgYAoKIyBHZW5lIFNldCBBbmFseXNlcwoKVGhlIGdlbmUgc2V0cyB3ZSBhcmUgbW9zdCBsaWtlbHkgdG8gY29uc2lkZXIgYXJlIHRoZSByZXN1bHRzIG9mIHRoZQp2YXJpb3VzIHByZWNlZGluZyBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNlcy4KCiMjIEdTRUEKCiMjIyBDdXJlL0ZhaWwgZ3JvdXBzCgpJbiB0aGUgY29udGV4dCBvZiBjdXJlIHZzLiBmYWlsLCB3ZSBoYXZlIG1peGVkIGFuZCBtYXRjaGVkIHRoZSBkYXRhIGluCnF1aXRlIGEgZmV3IGRpZmZlcmVudCB3YXlzLgoKIyMjIyBDdXJlL0ZhaWwsIGFsbCBzYW1wbGVzCgpGb3IgdGhlIG1vbWVudCwgbGV0IHVzIGFzc3VtZSB0aGF0IHRoZSBkZWZhdWx0IGRlZmluaXRpb24gb2YKJ3NpZ25pZmljYW50JyBpcyBzdWZmaWNpZW50IGZvciB0aGVzZSBhbmFseXNlcywgd2l0aCB0aGUga25vd2xlZGdlCnRoYXQgaXMgbm90IGxpa2VseSB0byByZW1haW4gdHJ1ZS4KClRoZSByZXN1bHRpbmcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBvcmdhbml6ZWQgYXM6Cgp0aGluZ1tbImRlc2VxIl1dW1t1cHMiXV1bW2NvbnRyYXN0XV0KCkluIGFkZGl0aW9uLCB3ZSBoYXZlIGEgZmV3IG9udG9sb2d5LWVzcXVlIHRvb2xzIGF2YWlsYWJsZSwgc28gbGV0IHVzCm1peCBhbmQgbWF0Y2ggYW5kIHNlZSB3aGF0IHBvcHMgb3V0LgoKYGBge3IgZ3NlYV9jZl9hbGx9CmNmX2FsbF91cCA8LSBjZl9jbGluaWNhbF9zaWdbWyJkZXNlcSJdXVtbInVwcyJdXVtbImZhaWxfdnNfY3VyZSJdXQpkaW0oY2ZfYWxsX3VwKQpjZl9hbGxfZG93biA8LSBjZl9jbGluaWNhbF9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siZmFpbF92c19jdXJlIl1dCmRpbShjZl9hbGxfZG93bikKCmNmX2FsbF91cF9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNmX2FsbF91cCkKY2ZfYWxsX3VwX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sicmVhY3RvbWVfcGxvdF9vdmVyIl1dCmNmX2FsbF91cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbImtlZ2dfcGxvdF9vdmVyIl1dCmNmX2FsbF91cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbIm1mcF9wbG90X292ZXIiXV0KY2ZfYWxsX3VwX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1siYnBwX3Bsb3Rfb3ZlciJdXQoKY2ZfYWxsX2Rvd25fZ3AgPC0gc2ltcGxlX2dwcm9maWxlcihjZl9hbGxfZG93bikKY2ZfYWxsX2Rvd25fZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJyZWFjdG9tZV9wbG90X292ZXIiXV0KY2ZfYWxsX2Rvd25fZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJrZWdnX3Bsb3Rfb3ZlciJdXQpjZl9hbGxfZG93bl9ncFtbInB2YWx1ZV9wbG90cyJdXVtbIm1mcF9wbG90X292ZXIiXV0KY2ZfYWxsX2Rvd25fZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJicHBfcGxvdF9vdmVyIl1dCmBgYAoKIyMjIyBDdXJlL0ZhaWwsIEJpb3BzaWVzCgpUaGVyZSBhcmUgbm8gZ2VuZXMgZGVlbWVkIHNpZ25pZmljYW50IGluIHRoZSBiaW9wc3kgY29tcGFyaXNvbnMgb2YKY3VyZS9mYWlsLiAgT2RkbHksIHdoZW4gSSBsb29rZWQgbWFudWFsbHksIEkgdGhvdWdodCBJIHNhdyBvbmUKY2FuZGlkYXRlIGdlbmUuICBJbiBhZGRpdGlvbiwgd2hlbiBJIHN0ZXBwZWQgdGhyb3VnaCB0aGUgZnVuY3Rpb24KbWFudWFsbHkgSSBnb3QgdGhlIHNhbWUgZ2VuZS4uLgoKIyMjIyBDdXJlL0ZhaWwsIE1vbm9jeXRlcwoKVHJ5IGFnYWluIHdpdGggbW9ub2N5dGVzLgoKYGBge3IgZ3NlYV9jZl9tb25vY3l0ZX0KY2ZfbW9ub2N5dGVfdXAgPC0gY2ZfbW9ub2N5dGVfc3ZhX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1siZmFpbF92c19jdXJlIl1dCmRpbShjZl9tb25vY3l0ZV91cCkKY2ZfbW9ub2N5dGVfZG93biA8LSBjZl9tb25vY3l0ZV9zdmFfc2lnW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImZhaWxfdnNfY3VyZSJdXQpkaW0oY2ZfbW9ub2N5dGVfZG93bikKCmNmX21vbm9jeXRlX3VwX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIoY2ZfbW9ub2N5dGVfdXApCmNmX21vbm9jeXRlX3VwX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sicmVhY3RvbWVfcGxvdF9vdmVyIl1dCmNmX21vbm9jeXRlX3VwX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sia2VnZ19wbG90X292ZXIiXV0KY2ZfbW9ub2N5dGVfdXBfZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJicHBfcGxvdF9vdmVyIl1dCgpjZl9tb25vY3l0ZV9kb3duX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIoY2ZfbW9ub2N5dGVfZG93bikKY2ZfbW9ub2N5dGVfZG93bl9ncFtbInB2YWx1ZV9wbG90cyJdXVtbInJlYWN0b21lX3Bsb3Rfb3ZlciJdXQpjZl9tb25vY3l0ZV9kb3duX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sia2VnZ19wbG90X292ZXIiXV0KYGBgCgojIyMjIEN1cmUvRmFpbCwgTmV1dHJvcGhpbHMKCmBgYHtyIGdzZWFfY2ZfbmV1dHJvcGhpbH0KY2ZfbmV1dHJvcGhpbF91cCA8LSBjZl9uZXV0cm9waGlsX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1siZmFpbF92c19jdXJlIl1dCmRpbShjZl9uZXV0cm9waGlsX3VwKQpjZl9uZXV0cm9waGlsX2Rvd24gPC0gY2ZfbmV1dHJvcGhpbF9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siZmFpbF92c19jdXJlIl1dCmRpbShjZl9uZXV0cm9waGlsX2Rvd24pCgpjZl9uZXV0cm9waGlsX3VwX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIoY2ZfbmV1dHJvcGhpbF91cCkKCmNmX25ldXRyb3BoaWxfZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNmX25ldXRyb3BoaWxfZG93bikKY2ZfbmV1dHJvcGhpbF9kb3duX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sia2VnZ19wbG90X292ZXIiXV0KYGBgCgojIyMjIEN1cmUvRmFpbCwgRW9zaW5vcGhpbHMKCmBgYHtyIGdzZWFfY2ZfZW9zaW5vcGhpbH0KY2ZfZW9zaW5vcGhpbF91cCA8LSBjZl9lb3Npbm9waGlsX3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1siZmFpbF92c19jdXJlIl1dCmRpbShjZl9lb3Npbm9waGlsX3VwKQpjZl9lb3Npbm9waGlsX2Rvd24gPC0gY2ZfZW9zaW5vcGhpbF9zaWdbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siZmFpbF92c19jdXJlIl1dCmRpbShjZl9lb3Npbm9waGlsX2Rvd24pCgpjZl9lb3Npbm9waGlsX3VwX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIoY2ZfZW9zaW5vcGhpbF91cCkKY2ZfZW9zaW5vcGhpbF91cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbImtlZ2dfcGxvdF9vdmVyIl1dCmNmX2Vvc2lub3BoaWxfdXBfZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJyZWFjdG9tZV9wbG90X292ZXIiXV0KY2ZfZW9zaW5vcGhpbF91cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbIm1mcF9wbG90X292ZXIiXV0KY2ZfZW9zaW5vcGhpbF91cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbImJwcF9wbG90X292ZXIiXV0KCmNmX2Vvc2lub3BoaWxfZG93bl9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNmX2Vvc2lub3BoaWxfZG93bikKY2ZfZW9zaW5vcGhpbF9kb3duX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sicmVhY3RvbWVfcGxvdF9vdmVyIl1dCmNmX2Vvc2lub3BoaWxfZG93bl9ncFtbInB2YWx1ZV9wbG90cyJdXVtbIm1mcF9wbG90X292ZXIiXV0KY2ZfZW9zaW5vcGhpbF9kb3duX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1siYnBwX3Bsb3Rfb3ZlciJdXQpgYGAKCiMjIyMgQ2xpbmljYWwgc2FtcGxlcwoKYGBge3IgZ3NlYV9jZl9jbGluaWNhbH0KY2Zfbm9iaW9wc3lfdXAgPC0gY2Zfbm9iaW9wc3lfc2lnW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJmYWlsX3ZzX2N1cmUiXV0KZGltKGNmX25vYmlvcHN5X3VwKQpjZl9ub2Jpb3BzeV9kb3duIDwtIGNmX25vYmlvcHN5X3NpZ1tbImRlc2VxIl1dW1siZG93bnMiXV1bWyJmYWlsX3ZzX2N1cmUiXV0KZGltKGNmX25vYmlvcHN5X2Rvd24pCgpjZl9ub2Jpb3BzeV91cF9ncCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKGNmX25vYmlvcHN5X3VwKQpjZl9ub2Jpb3BzeV91cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbImtlZ2dfcGxvdF9vdmVyIl1dCmNmX25vYmlvcHN5X3VwX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sicmVhY3RvbWVfcGxvdF9vdmVyIl1dCmNmX25vYmlvcHN5X3VwX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sibWZwX3Bsb3Rfb3ZlciJdXQpjZl9ub2Jpb3BzeV91cF9ncFtbInB2YWx1ZV9wbG90cyJdXVtbImJwcF9wbG90X292ZXIiXV0KCmNmX25vYmlvcHN5X2Rvd25fZ3AgPC0gc2ltcGxlX2dwcm9maWxlcihjZl9ub2Jpb3BzeV9kb3duKQpjZl9ub2Jpb3BzeV9kb3duX2dwW1sicHZhbHVlX3Bsb3RzIl1dW1sicmVhY3RvbWVfcGxvdF9vdmVyIl1dCmNmX25vYmlvcHN5X2Rvd25fZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJtZnBfcGxvdF9vdmVyIl1dCmNmX25vYmlvcHN5X2Rvd25fZ3BbWyJwdmFsdWVfcGxvdHMiXV1bWyJicHBfcGxvdF9vdmVyIl1dCmBgYAoKIyMjIENlbGwgdHlwZSBncm91cHMKCiMjIyBWaXNpdCBncm91cHMKCiMjIEdTVkEKCiMjIyBDbGluaWNhbCBzYW1wbGVzCgpgYGB7ciBnc3ZhLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX2NlbGx0eXBlX2dzdmFfYzIgPC0gc2ltcGxlX2dzdmEoaHNfdmFsaWQpCmhzX2NlbGx0eXBlX2dzdmFfYzJfc2lnIDwtIGdldF9zaWdfZ3N2YV9jYXRlZ29yaWVzKAogICAgaHNfY2VsbHR5cGVfZ3N2YV9jMiwKICAgIGV4Y2VsPSJleGNlbC9pbmRpdmlkdWFsX2NlbGx0eXBlc19nc3ZhX2MyLnhsc3giKQpoc19jZWxsdHlwZV9nc3ZhX2MyX3NpZyRzdWJzZXRfcGxvdApoc19jZWxsdHlwZV9nc3ZhX2MyX3NpZyRzY29yZV9wbG90Cgpicm9hZF9jNyA8LSBsb2FkX2dtdF9zaWduYXR1cmVzKHNpZ25hdHVyZXM9InJlZmVyZW5jZS9tc2lnZGIvYzcuYWxsLnY3LjIuZW50cmV6LmdtdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlX2NhdGVnb3J5PSJjNyIpCmhzX2NlbGx0eXBlX2dzdmFfYzcgPC0gc2ltcGxlX2dzdmEoaHNfdmFsaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlcz0icmVmZXJlbmNlL21zaWdkYi9jNy5hbGwudjcuMi5lbnRyZXouZ210IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfY2F0ZWdvcnk9ImM3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2lnX3htbD0icmVmZXJlbmNlL21zaWdkYl92Ny4yLnhtbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZXM9MTApCmhzX2NlbGx0eXBlX2dzdmFfYzdfc2lnIDwtIGdldF9zaWdfZ3N2YV9jYXRlZ29yaWVzKAogICAgaHNfY2VsbHR5cGVfZ3N2YV9jNywKICAgIGV4Y2VsPSJleGNlbC9pbmRpdmlkdWFsX2NlbGx0eXBlc19nc3ZhX2M3Lnhsc3giKQpgYGAKCiMjIyBQcmludCBzb21lIHBsb3RzIG9mIHRoZSBHU1ZBIG91dHB1dHMKCmBgYHtyIGdzdmFfcGxvdHN9CiMjIFRoZSByYXcgaGVhdG1hcCBvZiB0aGUgQzIgdmFsdWVzCmhzX2NlbGx0eXBlX2dzdmFfYzJfc2lnW1sicmF3X3Bsb3QiXV0KIyMgVGhlICdzaWduaWZpY2FuY2UnIHNjb3JlcyBvZiB0aGUgQzIgdmFsdWVzCmhzX2NlbGx0eXBlX2dzdmFfYzJfc2lnW1sic2NvcmVfcGxvdCJdXQojIyBUaGUgc3Vic2V0IG9mIHNjb3JlcyBmb3IgY2F0ZWdvcmllcyBkZWVtZWQgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuCmhzX2NlbGx0eXBlX2dzdmFfYzJfc2lnW1sic3Vic2V0X3Bsb3QiXV0KCiMjIFRoZSByYXcgaGVhdG1hcCBvZiB0aGUgQzcgdmFsdWVzCmhzX2NlbGx0eXBlX2dzdmFfYzdfc2lnW1sicmF3X3Bsb3QiXV0KIyMgVGhlICdzaWduaWZpY2FuY2UnIHNjb3JlcyBvZiB0aGUgQzcgdmFsdWVzCmhzX2NlbGx0eXBlX2dzdmFfYzdfc2lnW1sic2NvcmVfcGxvdCJdXQojIyBUaGUgc3Vic2V0IG9mIHNjb3JlcyBmb3IgY2F0ZWdvcmllcyBkZWVtZWQgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuCmhzX2NlbGx0eXBlX2dzdmFfYzdfc2lnW1sic3Vic2V0X3Bsb3QiXV0KYGBgCgojIENvbmNvcmRhbmNlCgpMZXQgdXMgY29tcGFyZSB2YXJpb3VzIHJlc3VsdHMgdG8gc2VlIGhvdyB3ZWxsIHRoZXkgYWdyZWVkCgpgYGB7ciBjb25jb3JkYW5jZX0KbW9ub2N5dGVfY29yX3N1YnNldCA8LSBjZl9tb25vY3l0ZV9zdmFfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXVssIGMoImRlc2VxX2xvZ2ZjIiwgImRlc2VxX2FkanAiKV0KbmV1dHJvcGhpbF9jb3Jfc3Vic2V0IDwtIGNmX25ldXRyb3BoaWxfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXVssIGMoImRlc2VxX2xvZ2ZjIiwgImRlc2VxX2FkanAiKV0KZW9zaW5vcGhpbF9jb3Jfc3Vic2V0IDwtIGNmX2Vvc2lub3BoaWxfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXVssIGMoImRlc2VxX2xvZ2ZjIiwgImRlc2VxX2FkanAiKV0KbW9ub19uZXV0X2NvciA8LSBtZXJnZShtb25vY3l0ZV9jb3Jfc3Vic2V0LCBuZXV0cm9waGlsX2Nvcl9zdWJzZXQsIGJ5PSJyb3cubmFtZXMiKQptb25vX2VvX2NvciA8LSBtZXJnZShtb25vY3l0ZV9jb3Jfc3Vic2V0LCBlb3Npbm9waGlsX2Nvcl9zdWJzZXQsIGJ5PSJyb3cubmFtZXMiKQpuZXV0X2VvX2NvciA8LSBtZXJnZShuZXV0cm9waGlsX2Nvcl9zdWJzZXQsIGVvc2lub3BoaWxfY29yX3N1YnNldCwgYnk9InJvdy5uYW1lcyIpCgpjb3IudGVzdChtb25vX25ldXRfY29yW1siZGVzZXFfbG9nZmMueCJdXSwgbW9ub19uZXV0X2NvcltbImRlc2VxX2xvZ2ZjLnkiXV0pCm1vbm9jeXRlX25ldXRyb3BoaWxfYXVjYyA8LSBjYWxjdWxhdGVfYXVjYyhjZl9tb25vY3l0ZV9zdmFfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmX25ldXRyb3BoaWxfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB4PSJkZXNlcV9wIiwgcHk9ImRlc2VxX3AiLCBseT0iZGVzZXFfbG9nZmMiLCBseD0iZGVzZXFfbG9nZmMiKQptb25vY3l0ZV9uZXV0cm9waGlsX2F1Y2MkcGxvdAoKY29yLnRlc3QobW9ub19lb19jb3JbWyJkZXNlcV9sb2dmYy54Il1dLCBtb25vX2VvX2NvcltbImRlc2VxX2xvZ2ZjLnkiXV0pCm1vbm9jeXRlX2Vvc2lub3BoaWxfYXVjYyA8LSBjYWxjdWxhdGVfYXVjYyhjZl9tb25vY3l0ZV9zdmFfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmX2Vvc2lub3BoaWxfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB4PSJkZXNlcV9wIiwgcHk9ImRlc2VxX3AiLCBseT0iZGVzZXFfbG9nZmMiLCBseD0iZGVzZXFfbG9nZmMiKQptb25vY3l0ZV9lb3Npbm9waGlsX2F1Y2MkcGxvdAoKY29yLnRlc3QobmV1dF9lb19jb3JbWyJkZXNlcV9sb2dmYy54Il1dLCBuZXV0X2VvX2NvcltbImRlc2VxX2xvZ2ZjLnkiXV0pCm5ldXRyb3BoaWxfZW9zaW5vcGhpbF9hdWNjIDwtIGNhbGN1bGF0ZV9hdWNjKGNmX25ldXRyb3BoaWxfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmX2Vvc2lub3BoaWxfdGFibGVzW1siZGF0YSJdXVtbImZhaWxfdnNfY3VyZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB4PSJkZXNlcV9wIiwgcHk9ImRlc2VxX3AiLCBseT0iZGVzZXFfbG9nZmMiLCBseD0iZGVzZXFfbG9nZmMiKQpuZXV0cm9waGlsX2Vvc2lub3BoaWxfYXVjYyRwbG90CmBgYAoKIyBDbGFzc2lmeSBtZSEKCkkgd3JvdGUgb3V0IGFsbCB0aGUgejIuMiBhbmQgejIuMyBzcGVjaWZpYyB2YXJpYW50cyB0byBhIGNvdXBsZSBmaWxlcywKSSB3YW50IHRvIHNlZSBpZiBJIGNhbiBjbGFzc2lmeSBhIGh1bWFuIHNhbXBsZSBhcyBpbmZlY3RlZCB3aXRoIDIuMiBvcgoyLjMuCgpgYGB7ciBjbGFzc2lmeW1lLCBldmFsPUZBTFNFfQp6MjIgPC0gcmVhZC5jc3YoImNzdi92YXJpYW50c18yMi5jc3YiKQp6MjMgPC0gcmVhZC5jc3YoImNzdi92YXJpYW50c18yMy5jc3YiKQpjdXJlIDwtIHJlYWQuY3N2KCJjc3YvY3VyZV92YXJpYW50cy50eHQiKQpmYWlsIDwtIHJlYWQuY3N2KCJjc3YvZmFpbF92YXJpYW50cy50eHQiKQp6MjJfdmVjIDwtIGdzdWIocGF0dGVybj0iXFwtIiwgcmVwbGFjZW1lbnQ9Il8iLCB4PXoyMltbIngiXV0pCnoyM192ZWMgPC0gZ3N1YihwYXR0ZXJuPSJcXC0iLCByZXBsYWNlbWVudD0iXyIsIHg9ejIzW1sieCJdXSkKY3VyZV92ZWMgPC0gZ3N1YihwYXR0ZXJuPSJcXC0iLCByZXBsYWNlbWVudD0iXyIsIHg9Y3VyZSkKZmFpbF92ZWMgPC0gZ3N1YihwYXR0ZXJuPSJcXC0iLCByZXBsYWNlbWVudD0iXyIsIHg9ZmFpbCkKCmNsYXNzaWZ5X3p5bW8gPC0gZnVuY3Rpb24oc2FtcGxlKSB7CiAgYXJiaXRyYXJ5X3RhZ3MgPC0gc20ocmVhZHI6OnJlYWRfdHN2KHNhbXBsZSkpCiAgYXJiaXRyYXJ5X2lkcyA8LSBhcmJpdHJhcnlfdGFnc1tbInBvc2l0aW9uIl1dCiAgbWVzc2FnZSgiTGVuZ3RoOiAiLCBsZW5ndGgoYXJiaXRyYXJ5X2lkcyksICIsIHoyMjogIiwKICAgICAgICAgIHN1bShhcmJpdHJhcnlfaWRzICVpbiUgejIyX3ZlYykgLyAobGVuZ3RoKHoyMl92ZWMpKSwgIiB6MjM6ICIsCiAgICAgICAgICBzdW0oYXJiaXRyYXJ5X2lkcyAlaW4lIHoyM192ZWMpIC8gKGxlbmd0aCh6MjNfdmVjKSkpCn0KCmFyYml0cmFyeV9zYW1wbGUgPC0gInByZXByb2Nlc3NpbmcvVE1SQzMwMTU2L291dHB1dHMvNDBmcmVlYmF5ZXNfbHBhbmFtZW5zaXNfdjM2L2FsbF90YWdzLnR4dC54eiIKY2xhc3NpZnlfenltbyhhcmJpdHJhcnlfc2FtcGxlKQpgYGAKCmBgYHtyIHNhdmVtZSwgZXZhbD1GQUxTRX0KaWYgKCFpc1RSVUUoZ2V0MCgic2tpcF9sb2FkIikpKSB7CiAgcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKICBtZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKICBtZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHNhdmVmaWxlKSkKICB0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXNhdmVmaWxlKSkKfQpgYGAKCmBgYHtyIGxvYWRtZV9hZnRlciwgZXZhbD1GQUxTRX0KdG1wIDwtIGxvYWRtZShmaWxlbmFtZT1zYXZlZmlsZSkKYGBgCg==