1 Changelog

  • 202304: Added a series of stanzas printing out the Cali-only data.
  • Updated input metadata sheets

2 Notes:

  • Interferon score for severity. A few different sets are available, may need to choose a specific paper, then modify it?

3 Introduction

We are splitting the creation of the various data structures and their analysis into separate documents.

3.1 Metadata Sources

Currently we use the sample metadata and the CRF data from the clinic.

## samplesheet <- "sample_sheets/tmrc3_samples_20220615.xlsx"
## Redundant sample sheet entries so we can test if something changed in June
samplesheet <- "sample_sheets/tmrc3_samples_20221208.xlsx"
crf_metadata <- "sample_sheets/20220509_EXP_ESPECIAL_TMRC3_V2.xlsx"
hslp_samplesheet <- "sample_sheets/tmrc3_samples_20230301_pruned.xlsx"

4 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.

4.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. In this context, a gene refers to the non-redundant union of the transcripts’ exons. 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"]]
## The next two lines make a bridge between the gff file used by hisat2
## and the gene IDs.
hs_annot[["transcript"]] <- paste0(rownames(hs_annot), ".", hs_annot[["version"]])
hs_annot <- group_mean_cds_length(hs_annot)
hs_tx_annot <- hs_annot ## Make a copy so I don't lose transcript IDs for salmon
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique = TRUE)
not_unique_idx <- grepl(x = rownames(hs_annot), pattern = "\\.\\d+$")
hs_annot <- hs_annot[!not_unique_idx, ]

4.1.1 Also collect parasite annotations

Given that I recently included the parasite transcripts to the data, I should also spend a moment and figure out how to include the annotations.

As a starting point, I will just grab the EuPathDB panamensis annotations. I think I will need to limit them to just the shared columns and drop the rest.

orgdb <- "org.Lpanamensis.MHOMCOL81L13.v46.eg.db"
tt <- sm(library(orgdb, character.only = TRUE))
pan_db <- org.Lpanamensis.MHOMCOL81L13.v46.eg.db
all_fields <- columns(pan_db)
all_lp_annot <- load_orgdb_annotations(
    pan_db,
    keytype = "gid",
    fields = c("annot_gene_entrez_id", "annot_gene_name",
               "annot_strand", "annot_gene_location_text", "annot_chromosome",
               "annot_cds_length",
               "annot_gene_product"))$genes
## Unable to find CDSNAME, setting it to ANNOT_GENE_NAME.
## Unable to find CDSCHROM in the db, removing it.
## Unable to find CDSSTRAND in the db, removing it.
## Unable to find CDSSTART in the db, removing it.
## Unable to find CDSEND in the db, removing it.
## Extracted all gene ids.
## Attempting to select: ANNOT_GENE_NAME, GENE_TYPE, ANNOT_GENE_ENTREZ_ID, ANNOT_GENE_NAME, ANNOT_STRAND, ANNOT_GENE_LOCATION_TEXT, ANNOT_CHROMOSOME, ANNOT_CDS_LENGTH, ANNOT_GENE_PRODUCT
## 'select()' returned 1:1 mapping between keys and columns
all_lp_annot[["end"]] <- ""
all_lp_annot[["mean_cds_len"]] <- all_lp_annot[["annot_cds_length"]]
all_lp_annot[["version"]] <- 1
all_lp_annot[["transcript_version"]] <- 1
all_lp_annot[["hgnc_symbol"]] <- ""
all_lp_annot[["transcript"]] <- all_lp_annot[["gid"]]
all_lp_annot[["ensembl_transcript_id"]] <- all_lp_annot[["gid"]]

wanted_columns <- c("gid", "ensembl_transcript_id", "version",
                    "transcript_version", "hgnc_symbol", "annot_gene_product",
                    "gene_type", "annot_cds_length", "annot_chromosome", "annot_strand",
                    "annot_gene_location_text", "end", "transcript", "mean_cds_len")
all_lp_annot <- all_lp_annot[, wanted_columns]
colnames(all_lp_annot) <- colnames(hs_tx_annot)

hslp_annot <- rbind(hs_tx_annot, all_lp_annot)

4.1.2 Set up gene->transcript mappings

## The tx_gene_map is used for tximport and salmon quantifications.
hs_annot[["transcript"]] <- paste0(rownames(hs_annot), ".",
                                   hs_annot[["transcript_version"]])
rownames(hs_annot) <- make.names(hs_annot[["ensembl_gene_id"]], unique = TRUE)
hs_tx_gene_map <- hs_annot[, c("transcript", "ensembl_gene_id")]

4.2 Gene ontology data

The set of GO categories has not been limited to the 2020 data at the time of this writing. The GO categories is collected along with lengths for goseq. The other methods either have built-in databases of human data (gProfiler) or support orgDB data (org.Hs.eg.db) (clusterProfiler/topGO/gostats).

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")
data_structures <- c(data_structures, "hs_length", "hs_go", "hs_annot")

5 Dataset: Create the parent data structure of all samples

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_expt’, it will comprise the full set of human data. When we cull some samples it will be renamed to ‘hs_valid’.

The variable ‘data_structures’ will contain the names of every variable I create in this document which I wish to save to disk.

Similarly, the character vector ‘sanitize_columns’ is the list of metadata columns over which I will iterate and sanitize the data, removing any spurious spaces, capitalization, etc.

sanitize_columns <- c("visitnumber", "finaloutcome", "donor",
                      "typeofcells", "clinicalpresentation", "drug",
                      "condition", "batch")
hs_expt <- create_expt(samplesheet,
                       file_column = "hg38100hisatfile",
                       savefile = glue("rda/tmrc3_hs_expt_all_raw-v{ver}.rda"),
                       gene_info = hs_annot) %>%
  subset_genes(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 = "finaloutcome") %>%
  set_expt_batches(fact = "visitnumber") %>%
  subset_expt(subset = "typeofcells!='pbmcs'") %>%
  subset_expt(subset = "typeofcells!='macrophages'") %>%
  subset_expt(subset = "clinicalpresentation!='h'")
## Reading the sample metadata.
## Dropped 69 rows from the sample metadata because the sample ID is blank.
## The sample definitions comprises: 296 rows(samples) and 88 columns(metadata fields).
## Warning in create_expt(samplesheet, file_column = "hg38100hisatfile", savefile = glue("rda/tmrc3_hs_expt_all_raw-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 TMRC30269 TMRC30017 TMRC30019 TMRC30044 TMRC30045 TMRC30154 TMRC30241 
##     79.19     89.18     85.66     89.69     80.29     73.28     83.16     89.37 
## 
##          cure       failure          lost notapplicable 
##           130            64            16            36 
## 
##             1             2             3 notapplicable 
##           108            56            54            28
## subset_expt(): There were 246, now there are 240 samples.
## subset_expt(): There were 240, now there are 212 samples.
## subset_expt(): There were 212, now there are 210 samples.
data_structures <- c(data_structures, "hs_expt")

## 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("3", "2", "1")))
pData(hs_expt) <- meta
save(list = "hs_expt", file = glue("rda/tmrc3_hs_expt_all_sanitized-v{ver}.rda"))

6 Repeat, but with combined host and parasite data

I recently re-quantified the data using salmon and a transcript database comprised of both human and parasite sequences. I would like to look at this and see if it can aid us in understanding some classification questions.

Note that without some changes to the annotations I cannot exclude the features which are not of type ‘protein_coding’ because that would remove all the panamensis annotations – though I could just change them above.

Given that making the correct gene->tx map is confusing, and made even more so by the addition of a second species, I am going to first create a tx-based expressionset and use the IDs from it to create the gene version.

rownames(hslp_annot) <- hslp_annot[["transcript"]]
hslp_tx_expt <- create_expt(
  hslp_samplesheet, file_column = "hg38lpfile", gene_info = hslp_annot,
  savefile = glue("rda/tmrc3_hslp_tx_expt_all_raw-v{ver}.rda"))
## Reading the sample metadata.
## Did not find the condition column in the sample sheet.
## Filling it in as undefined.
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## The sample definitions comprises: 212 rows(samples) and 50 columns(metadata fields).
## Matched 2783 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 99005 features and 212 samples.
## This has 99,005 transcripts.  If we set up the tx->gene map correctly, this should drop to ~ 30,000.
tx_map <- data.frame(tx = rownames(exprs(hslp_tx_expt)))
tx_map[["shortened_tx_id"]] <- gsub(x = tx_map[["tx"]],
                                    pattern = "\\.\\d+", replacement = "")

tx_map_merged <- merge(tx_map, hslp_annot, by.x = "shortened_tx_id",
                       by.y = "ensembl_transcript_id")
tx_map_merged <- tx_map_merged[, c("tx", "ensembl_gene_id")]

hslp_gene_expt <- create_expt(
  hslp_samplesheet, file_column = "hg38lpfile", tx_gene_map = tx_map_merged,
  savefile = glue("rda/tmrc3_hslp_gene_expt_all_raw-v{ver}.rda"), gene_info = hslp_annot) %>%
  sanitize_expt_metadata(columns = sanitize_columns) %>%
  set_expt_factors(columns = sanitize_columns, class = "factor") %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  set_expt_batches(fact = "visitnumber") %>%
  subset_expt(subset = "typeofcells!='pbmcs'") %>%
  subset_expt(subset = "typeofcells!='macrophages'") %>%
  subset_expt(subset = "clinicalpresentation!='h'")
## Reading the sample metadata.
## Did not find the condition column in the sample sheet.
## Filling it in as undefined.
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## The sample definitions comprises: 212 rows(samples) and 50 columns(metadata fields).
## In some cases, (notably salmon) the format of the IDs used by this can be tricky.
## It is likely to require the transcript ID followed by a '.' and the ensembl column:
## 'transcript_version', which is explicitly different than the gene version column.
## If this is not correctly performed, very few genes will be observed
## Matched 8632 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 28567 features and 212 samples.
## 
##          cure       failure          lost notapplicable 
##           130            64            16             2 
## 
##   1   2   3 
## 102  56  54
## subset_expt(): There were 212, now there are 212 samples.
## subset_expt(): There were 212, now there are 212 samples.
## subset_expt(): There were 212, now there are 210 samples.
pData(hslp_gene_expt)[["visitnumber"]] <- paste0("v", pData(hslp_gene_expt)[["visitnumber"]])
data_structures <- c(data_structures, "hslp_gene_expt")

## The following should make visit 1 the largest if one uses that column as a size factor when plotting.
meta <- pData(hslp_gene_expt) %>%
  mutate(visitnumber = fct_relevel(visitnumber, c("v3", "v2", "v1")))
pData(hslp_gene_expt) <- meta
save(list = "hslp_gene_expt", file = glue("rda/tmrc3_gene_hslp_expt_all_sanitized-v{ver}.rda"))

6.1 Add the CRF patient metadata

There are some parameters provided by the clinicians which may prove to be of interest. I therefore am adding the CRF metadata here. I will also run some simple checks to try to make sure that the clinician’s metadata agrees with the sample metadata.

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

## Now add in the ethnicity and sex
## Add a combination of the ethnicity and clinic
## While I am at it, do sex+clinic
table(pData(hs_expt)$eb_lc_sexo)
## 
##   1   2 
## 173  37
table(pData(hs_expt)$eb_lc_etnia)
## 
##   1   2   3 
## 101  62  47
table(pData(hs_expt)$clinic)
## 
##   Cali Tumaco 
##     67    143
etnia_names <- pData(hs_expt)[["eb_lc_etnia"]]
etnia_idx <- etnia_names == 1
etnia_names[etnia_idx] <- "afrocol"
etnia_idx <- etnia_names == 2
etnia_names[etnia_idx] <- "indigena"
etnia_idx <- etnia_names == 3
etnia_names[etnia_idx] <- "mestiza"
pData(hs_expt)[["etnia"]] <- as.factor(etnia_names)
table(pData(hs_expt)[["etnia"]])
## 
##  afrocol indigena  mestiza 
##      101       62       47
etnia_factor <- paste0(pData(hs_expt)[["clinic"]], "_",
                       etnia_names)
pData(hs_expt)[["clinic_etnia"]] <- as.factor(etnia_factor)
table(pData(hs_expt)[["clinic_etnia"]])
## 
##    Cali_afrocol   Cali_indigena    Cali_mestiza  Tumaco_afrocol Tumaco_indigena  Tumaco_mestiza 
##              15              33              19              86              29              28
pData(hs_expt)[["sex"]] <- "female"
male_idx <- pData(hs_expt)[["eb_lc_sexo"]] == 1
pData(hs_expt)[male_idx, "sex"] <- "male"
sex_factor <- paste0(pData(hs_expt)[["clinic"]], "_",
                     pData(hs_expt)[["sex"]])
pData(hs_expt)[["clinic_sex"]] <- as.factor(sex_factor)
table(pData(hs_expt)[["clinic_sex"]])
## 
##   Cali_female     Cali_male Tumaco_female   Tumaco_male 
##            12            55            25           118
pData(hs_expt)[["etnia_sex"]] <- paste0(pData(hs_expt)[["etnia"]], "_",
                                        pData(hs_expt)[["sex"]])
pData(hs_expt)[["etnia_sex"]] <- as.factor(pData(hs_expt)[["etnia_sex"]])
table(pData(hs_expt)[["etnia_sex"]])
## 
##  afrocol_female    afrocol_male indigena_female   indigena_male  mestiza_female    mestiza_male 
##              22              79               6              56               9              38
save(list = "hs_expt", file = glue("rda/tmrc3_hs_expt_all_sanitized_crf-v{ver}.rda"))

6.2 Sanity check, clinical outcome vs. CRF data

Check to make sure the CRF agrees with the metadata.

two_columns <- pData(hs_expt)[, c("finaloutcome", "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[["finaloutcome"]] == two_columns[["rewritten"]]
broken <- two_columns[!same_idx, ]
broken
## [1] finaloutcome               ef_lc_estado_final_estudio rewritten                 
## <0 rows> (or 0-length row.names)

6.3 Summarize: Collect sample numbers before filtering

There are some metadata factors for which I think it will be nice to see the numbers before and after our filters. The following shows how many samples we have of the primary types before filtering.

dim(pData(hs_expt))
## [1] 210 153
table(pData(hs_expt)$drug)
## 
##    antimony miltefosine 
##         202           8
table(pData(hs_expt)$clinic)
## 
##   Cali Tumaco 
##     67    143
table(pData(hs_expt)$finaloutcome)
## 
##    cure failure    lost 
##     130      64      16
table(pData(hs_expt)$typeofcells)
## 
##      biopsy eosinophils   monocytes neutrophils 
##          21          45          73          71
table(pData(hs_expt)$visit)
## 
##   3   2   1 
##  54  56 100
summary(as.numeric(pData(hs_expt)$eb_lc_tiempo_evolucion))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    4.00    6.00    8.25   12.00   21.00
summary(as.numeric(pData(hs_expt)$eb_lc_tto_mcto_glucan_dosis))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    13.0    14.0    19.0    54.6    20.0   999.0
summary(as.numeric(pData(hs_expt)$v3_lc_ejey_lesion_mm_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0     7.4    32.0   269.5   771.8   999.0
summary(as.numeric(pData(hs_expt)$v3_lc_lesion_area_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0     226     999    2412    3016   16965
summary(as.numeric(pData(hs_expt)$v3_lc_ejex_ulcera_mm_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0     0.0     9.1   259.6   761.7   999.0
table(pData(hs_expt)$eb_lc_sexo)
## 
##   1   2 
## 173  37
table(pData(hs_expt)$eb_lc_etnia)
## 
##   1   2   3 
## 101  62  47
summary(as.numeric(pData(hs_expt)$edad))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    25.0    28.5    30.7    36.0    51.0
table(pData(hs_expt)$eb_lc_peso)
## 
##  53.9  55.9  57.9    58  58.1  58.3  58.6    59  59.6    62    63    67  69.4    72  74.7    75  75.6  76.5    77    78  79.2    82  83.3  83.4  86.4    87 
##     9     2     2     6     7    10    13    14     1     8     6     6    10     9     3     2     3     3    18    10    10     9     4    10     9     3 
##    89  93.3   100 100.8 
##     9     7     5     2
table(pData(hs_expt)$eb_lc_estatura)
## 
## 145 152 154 155 156 158 159 160 162 163 164 165 166 167 169 172 173 174 175 176 177 182 183 
##   6   1  10   9   6  17   2   6  10   9  15  12  19   3   2  10   9  32   2   1  10   9  10
table(pData(hs_expt)$ef_lc_estado_final_estudio)
## 
##   0   1   2 
## 130  64  16
table(pData(hs_expt)$finaloutcome)
## 
##    cure failure    lost 
##     130      64      16
unique(pData(hs_expt)$codigo_paciente)
##  [1] "SU1034" "SU1154" "SU1167" "SU1168" "SU1174" "SU1176" "SU1175" "SU2050" "SU2052" "SU2065" "SU1195" "SU1196" "SU1197" "SU2066" "SU1198" "SU2068" "SU2071"
## [18] "SU2072" "SU2073" "SU2159" "SU2162" "SU2161" "SU2164" "SU2167" "SU2168" "SU2172" "SU2173" "SU2183" "SU2184" "SU2195" "SU2188" "SU2190" "SU2194" "SU2201"
length(unique(pData(hs_expt)$codigo_paciente))
## [1] 34

Get the sex of the unique patients.

unique_people <- unique(pData(hs_expt)[["codigo_paciente"]])
unique_people
##  [1] "SU1034" "SU1154" "SU1167" "SU1168" "SU1174" "SU1176" "SU1175" "SU2050" "SU2052" "SU2065" "SU1195" "SU1196" "SU1197" "SU2066" "SU1198" "SU2068" "SU2071"
## [18] "SU2072" "SU2073" "SU2159" "SU2162" "SU2161" "SU2164" "SU2167" "SU2168" "SU2172" "SU2173" "SU2183" "SU2184" "SU2195" "SU2188" "SU2190" "SU2194" "SU2201"
length(unique_people)
## [1] 34
df <- pData(hs_expt)
people <- df[["codigo_paciente"]]
first_indices <- order(people)[!duplicated(sort(people))]
table(df[first_indices, "eb_lc_sexo"])
## 
##  1  2 
## 27  7
table(df[first_indices, "finaloutcome"])
## 
##    cure failure    lost 
##      22      10       2

6.4 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.

color_choices <- list(
    "cf" = list(
      "cure" = "#998EC3",
      "failure" = "#F1A340"),
    "type_visit" = 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" = list(
      "monocytes" = "#DD1C77",
      "eosinophils" = "#31A354",
      "neutrophils" = "#3182BD",
      "biopsy" = "#D95F0E"),
    "visit" = list(
      "v1" = "#EEEEEE",
      "v2" = "#888888",
      "v3" = "#111111"),
    "clinic_cf" = list(
      "Tumaco_cure" = "#7670B3",
      "Tumaco_failure" = "#E7298A",
      "Cali_cure" = "#1B9E77",
      "Cali_failure" = "#D95F02"),
    "ethnicity" = list(
      "afrocol" = "#4293CE",
      "indigena" = "#BDBDBD",
      "mestiza" = "#FEB24C"),
    "clinic_etnia" = list(
      "Cali_afrocol" = "#3182BD",
      "Cali_indigena" = "#636363",
      "Cali_mestiza" = "#F03B20",
      "Tumaco_afrocol" = "#9ECAE1",
      "Tumaco_indigena" = "#BDBDBD",
      "Tumaco_mestiza" = "#FEB24C"),
    "sex" = list(
      "female" = "#3182BD",
      "male" = "#C994C7"),
    "clinic_sex" = list(
      "Cali_female" = "#0000CC",
      "Tumaco_female" = "#3182BD",
      "Cali_male" = "#E7298A",
      "Tumaco_male" = "#C994C7"),
    "cf_type" = 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"))
data_structures <- c(data_structures, "color_choices")

7 Define the starting data

Given the starting point above, we will start extracting groups of samples of interest and giving them hopefully useful names.

7.1 Set our initial coverage goal

The first set of samples removed from the data are those with too many missing genes.

7.2 Figure XX: Non-zero genes before sample filtering

all_nz <- plot_nonzero(hs_expt)
## The following samples have less than 12949.95 genes.
##  [1] "TMRC30010" "TMRC30140" "TMRC30280" "TMRC30284" "TMRC30050" "TMRC30056" "TMRC30052" "TMRC30058" "TMRC30031" "TMRC30038" "TMRC30265"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Not putting labels on the plot.
all_nz$plot

7.2.1 Save CPM, all samples

xlsx_prefix <- "analyses"
cpm_data <- normalize_expt(hs_expt, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/3_cali_and_tumaco/all_samples-v{ver}.xlsx"))
## Deleting the file data/cpm/3_cali_and_tumaco/all_samples-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(hs_expt, filter = TRUE, convert = "rpkm",
                            column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5149 low-count genes (14774 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/hs_expt_rpkm-v{ver}.csv"))

7.3 Subset: Filter out problematic samples

To my eyes, there are 3 or 4 samples which are likely candidates for removal. In addition, we will remove samples which were lost during the treatment and/or ones which were used in other experiments but included in the TMRC3 sample sheet (thus the ‘notapplicable’ or ‘null’).

NOTE: I changed the prefix of the data structures to reflect the clinic(s) from which they were acquired. This will likely be a problem until I carefully step through the file; but will make sure I do not accidently upload data with the Cali samples.

tc_valid <- subset_expt(hs_expt, nonzero = 11000) %>%
  subset_expt(subset = "finaloutcome!='lost'") %>%
  subset_expt(subset = "drug=='antimony'") %>%
  set_expt_colors(color_choices[["cf"]])
## The samples (and read coverage) removed when filtering 11000 non-zero genes are:
## subset_expt(): There were 210, now there are 207 samples.
## subset_expt(): There were 207, now there are 192 samples.
## subset_expt(): There were 192, now there are 184 samples.
save(list = "tc_valid", file = glue("rda/tmrc3_tc_valid-v{ver}.rda"))
data_structures <- c(data_structures, "tc_valid")

7.4 Figure XX + 1: Non-zero genes after sample filtering

The following plot is essentially identical to the previous with two exceptions:

  1. The samples with too few genes (11,000 currently) are gone.
  2. The samples are colored by cure(purple)/fail(yellow)
nz_post <- plot_nonzero(tc_valid)
## The following samples have less than 12949.95 genes.
## [1] "TMRC30140" "TMRC30280" "TMRC30284" "TMRC30056" "TMRC30058" "TMRC30031" "TMRC30265"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Not putting labels on the plot.
nz_post[["plot"]]

7.5 Summarize: Tally samples after filtering

We need to keep track of how many of each sample type is lost when we do our various filters. Thus I am repeating the same set of tallies. This will likely happen one more time, following the removal of samples which came from Cali.

table(pData(tc_valid)[["drug"]])
## 
## antimony 
##      184
table(pData(tc_valid)[["clinic"]])
## 
##   Cali Tumaco 
##     61    123
table(pData(tc_valid)[["finaloutcome"]])
## 
##    cure failure 
##     122      62
table(pData(tc_valid)[["typeofcells"]])
## 
##      biopsy eosinophils   monocytes neutrophils 
##          18          41          63          62
table(pData(tc_valid)[["visit"]])
## < table of extent 0 >
summary(as.numeric(pData(tc_valid)[["eb_lc_tiempo_evolucion"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    4.00    6.00    8.19   12.00   21.00
summary(as.numeric(pData(tc_valid)[["eb_lc_tto_mcto_glucan_dosis"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    13.0    14.8    19.0    17.5    20.0    20.0
summary(as.numeric(pData(tc_valid)[["v3_lc_ejey_lesion_mm_1"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0     7.2    32.0   303.4   999.0   999.0
summary(as.numeric(pData(tc_valid)[["v3_lc_lesion_area_1"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0     226     999    2328    2448   16965
summary(as.numeric(pData(tc_valid)[["v3_lc_ejex_ulcera_mm_1"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0     0.0    12.5   295.9   999.0   999.0
table(pData(tc_valid)[["eb_lc_sexo"]])
## 
##   1   2 
## 156  28
table(pData(tc_valid)[["eb_lc_etnia"]])
## 
##  1  2  3 
## 91 46 47
summary(as.numeric(pData(tc_valid)[["edad"]]))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    25.0    28.5    30.7    36.0    51.0
table(pData(tc_valid)[["eb_lc_peso"]])
## 
##  53.9  57.9    58  58.1  58.3  58.6    59  59.6    62    63    67  69.4    72    75  76.5    77    78  79.2    82  83.3  83.4  86.4    87    89  93.3   100 
##     9     2     6     7    10     3     8     1     6     6     6    10     9     2     3    18    10    10     9     4    10     9     3     9     7     5 
## 100.8 
##     2
table(pData(tc_valid)[["eb_lc_estatura"]])
## 
## 152 154 155 156 158 159 160 163 164 165 166 167 169 172 173 174 176 177 182 183 
##   1  10   9   6  15   2   3   9  15  12  19   3   2  10   9  32   1   7   9  10
length(unique(pData(tc_valid)[["codigo_paciente"]]))
## [1] 29

7.6 Split the data by cure/fail for some counting

tc_cure <- subset_expt(tc_valid, subset = "finaloutcome=='cure'")
## subset_expt(): There were 184, now there are 122 samples.
data_structures <- c(data_structures, "tc_cure")

table(pData(tc_cure)[["visitnumber"]])
## 
##  3  2  1 
## 32 33 57
tc_fail <- subset_expt(tc_valid, subset = "finaloutcome=='failure'")
## subset_expt(): There were 184, now there are 62 samples.
data_structures <- c(data_structures, "tc_fail")

table(pData(tc_fail)[["visitnumber"]])
## 
##  3  2  1 
## 19 17 26

8 Subset samples by cell type and visit

all_types <- table(pData(tc_valid)[["typeofcells"]])
all_types
## 
##      biopsy eosinophils   monocytes neutrophils 
##          18          41          63          62
all_times <- table(pData(tc_valid)[["visitnumber"]])
all_times
## 
##  3  2  1 
## 51 50 83

8.0.1 Write valid samples

cpm_data <- normalize_expt(tc_valid, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/3_cali_and_tumaco/all_valid_samples-v{ver}.xlsx"))
## Deleting the file data/cpm/3_cali_and_tumaco/all_valid_samples-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tc_valid, filter = TRUE, convert = "rpkm",
                            column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5633 low-count genes (14290 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tc_all_valid_samples-v{ver}.csv"))

8.1 Extract cell types

## Note, I will save these data structures in a little bit when I
## decide how I want to set the conditions, batches, and colors.
tc_eosinophils <- subset_expt(tc_valid, subset = "typeofcells=='eosinophils'")
## subset_expt(): There were 184, now there are 41 samples.
tc_monocytes <- subset_expt(tc_valid, subset = "typeofcells=='monocytes'")
## subset_expt(): There were 184, now there are 63 samples.
tc_neutrophils <- subset_expt(tc_valid, subset = "typeofcells=='neutrophils'")
## subset_expt(): There were 184, now there are 62 samples.

8.1.1 Write cell type cpm

cpm_data <- normalize_expt(tc_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/3_cali_and_tumaco/tc_eosinophils-v{ver}.xlsx"))
## Deleting the file data/cpm/3_cali_and_tumaco/tc_eosinophils-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tc_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9059 low-count genes (10864 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tc_eosinophils-v{ver}.csv"))

cpm_data <- normalize_expt(tc_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/3_cali_and_tumaco/tc_monocytes-v{ver}.xlsx"))
## Deleting the file data/cpm/3_cali_and_tumaco/tc_monocytes-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tc_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8819 low-count genes (11104 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tc_monocytes-v{ver}.csv"))

cpm_data <- normalize_expt(tc_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/3_cali_and_tumaco/tc_neutrophils-v{ver}.xlsx"))
## Deleting the file data/cpm/3_cali_and_tumaco/tc_neutrophils-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tc_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 10681 low-count genes (9242 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tc_neutrophils-v{ver}.csv"))

8.2 Tumaco and Cali samples by visit

## Currently, these are not used, but instead I pulled the samples
## from the hs_clinical which means the biopsies are not included.
tcv1_samples <- subset_expt(tc_valid, subset = "visitnumber=='1'")
## subset_expt(): There were 184, now there are 83 samples.
save(list = "tcv1_samples", file = glue("rda/tmrc3_tcv1_samples-v{ver}.rda"))
data_structures <- c(data_structures, "tcv1_samples")

tcv2_samples <- subset_expt(tc_valid, subset = "visitnumber=='2'")
## subset_expt(): There were 184, now there are 50 samples.
save(list = "tcv2_samples", file = glue("rda/tmrc3_tcv2_samples-v{ver}.rda"))
data_structures <- c(data_structures, "tcv2_samples")

tcv3_samples <- subset_expt(tc_valid, subset = "visitnumber=='3'")
## subset_expt(): There were 184, now there are 51 samples.
save(list = "tcv3_samples", file = glue("rda/tmrc3_tcv3_samples-v{ver}.rda"))
data_structures <- c(data_structures, "tcv3_samples")

8.2.1 Cali and Tumaco by visit, write cpm

cpm_data <- normalize_expt(tcv1_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/3_cali_and_tumaco/tcv1_samples-v{ver}.xlsx"))
## Deleting the file data/cpm/3_cali_and_tumaco/tcv1_samples-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tcv1_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 5772 low-count genes (14151 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tcv1_samples-v{ver}.csv"))

cpm_data <- normalize_expt(tcv2_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/3_cali_and_tumaco/tcv2_samples-v{ver}.xlsx"))
## Deleting the file data/cpm/3_cali_and_tumaco/tcv2_samples-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tcv2_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8184 low-count genes (11739 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tcv2_samples-v{ver}.csv"))

cpm_data <- normalize_expt(tcv3_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/3_cali_and_tumaco/tcv3_samples-v{ver}.xlsx"))
## Deleting the file data/cpm/3_cali_and_tumaco/tcv3_samples-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tcv3_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8259 low-count genes (11664 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tcv3_samples-v{ver}.csv"))

9 Tumaco and Cali data structures

All data structures which start with the prefix ‘tc’ are Tumaco and Cali. Those with ‘t’ are only Tumaco.

tc_clinical <- tc_valid %>%
  set_expt_conditions(fact = "finaloutcome") %>%
  set_expt_batches(fact = "typeofcells") %>%
  set_expt_colors(color_choices[["cf"]])
## 
##    cure failure 
##     122      62 
## 
##      biopsy eosinophils   monocytes neutrophils 
##          18          41          63          62
save(list = "tc_clinical", file = glue("rda/tmrc3_tc_clinical-v{ver}.rda"))
data_structures <- c(data_structures, "tc_clinical")

9.1 Subset: Monocytes by clinic

Note: I usually do this kind of thing in alphabetic order, but in this instance I want to do monocytes (or neutrophils) first because they have samples in all 4 of the clinic/cf categories. The Eosinophils do not have any Cali fails and this messes up the color scheme. Though, now that I have written this down, it would make much more sense to just define these colors up above and use them across each set…

clinic_cf <- paste0(pData(tc_monocytes)[["clinic"]], "_",
                    pData(tc_monocytes)[["finaloutcome"]])
table(clinic_cf)
## clinic_cf
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             21             21
tc_monocytes <- set_expt_conditions(tc_monocytes, fact = clinic_cf) %>%
  set_expt_batches(fact = "visitnumber") %>%
  set_expt_colors(color_choices[["clinic_cf"]])
## 
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             21             21 
## 
##  3  2  1 
## 19 18 26
save(list = "tc_monocytes", file = glue("rda/tmrc3_tc_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tc_monocytes")

tcv1_monocytes <- subset_expt(tc_monocytes, subset = "visitnumber=='1'")
## subset_expt(): There were 63, now there are 26 samples.
save(list = "tcv1_monocytes", file = glue("rda/tmrc3_tcv1_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tcv1_monocytes")
tcv2_monocytes <- subset_expt(tc_monocytes, subset = "visitnumber=='2'")
## subset_expt(): There were 63, now there are 18 samples.
save(list = "tcv2_monocytes", file = glue("rda/tmrc3_tcv2_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tcv2_monocytes")
tcv3_monocytes <- subset_expt(tc_monocytes, subset = "visitnumber=='3'")
## subset_expt(): There were 63, now there are 19 samples.
save(list = "tcv3_monocytes", file = glue("rda/tmrc3_tcv3_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tcv3_monocytes")

9.2 Subset: Monocytes by clinic

tc_clinical_nobiop <- subset_expt(tc_clinical, subset = "typeofcells!='biopsy'") %>%
  set_expt_colors(color_choices[["cf"]])
## subset_expt(): There were 184, now there are 166 samples.
save(list = "tc_clinical_nobiop", file = glue("rda/tmrc3_tc_clinical_nobiop-v{ver}.rda"))
data_structures <- c(data_structures, "tc_clinical_nobiop")

tc_biopsies <- tc_valid %>%
  set_expt_conditions(fact = "clinic") %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells=='biopsy'")
## 
##   Cali Tumaco 
##     61    123 
## 
##    cure failure 
##     122      62
## subset_expt(): There were 184, now there are 18 samples.
tc_cf <- paste0(pData(tc_biopsies)[["clinic"]], "_",
                pData(tc_biopsies)[["finaloutcome"]])
table(tc_cf)
## tc_cf
##      Cali_cure    Tumaco_cure Tumaco_failure 
##              4              9              5
tc_biopsies <- set_expt_conditions(tc_biopsies, fact = tc_cf) %>%
  set_expt_batches(fact = "visitnumber") %>%
  set_expt_colors(color_choices[["clinic_cf"]])
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##              4              9              5 
## 
##  1 
## 18
## Warning in set_expt_colors(., color_choices[["clinic_cf"]]): Colors for the following categories are not being used: Cali_failure.
save(list = "tc_biopsies", file = glue("rda/tmrc3_tc_biopsies-v{ver}.rda"))
data_structures <- c(data_structures, "tc_biopsies")

9.3 Subset: Eosinophils by clinic

clinic_cf <- paste0(pData(tc_eosinophils)[["clinic"]], "_",
                    pData(tc_eosinophils)[["finaloutcome"]])
table(clinic_cf)
## clinic_cf
##      Cali_cure    Tumaco_cure Tumaco_failure 
##             15             17              9
tc_eosinophils <- set_expt_conditions(tc_eosinophils, fact = clinic_cf) %>%
  set_expt_batches(fact = "visitnumber") %>%
  set_expt_colors(color_choices[["clinic_cf"]])
## 
##      Cali_cure    Tumaco_cure Tumaco_failure 
##             15             17              9 
## 
##  3  2  1 
## 13 14 14
## Warning in set_expt_colors(., color_choices[["clinic_cf"]]): Colors for the following categories are not being used: Cali_failure.
save(list = "tc_eosinophils", file = glue("rda/tmrc3_tc_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tc_eosinophils")

tcv1_eosinophils <- subset_expt(tc_eosinophils, subset = "visitnumber=='1'")
## subset_expt(): There were 41, now there are 14 samples.
save(list = "tcv1_eosinophils", file = glue("rda/tmrc3_tcv1_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv1_eosinophils")
tcv2_eosinophils <- subset_expt(tc_eosinophils, subset = "visitnumber=='2'")
## subset_expt(): There were 41, now there are 14 samples.
save(list = "tcv2_eosinophils", file = glue("rda/tmrc3_tcv2_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv2_eosinophils")
tcv3_eosinophils <- subset_expt(tc_eosinophils, subset = "visitnumber=='3'")
## subset_expt(): There were 41, now there are 13 samples.
save(list = "tcv3_eosinophils", file = glue("rda/tmrc3_tcv3_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv3_eosinophils")

9.4 Subset: Neutrophils by clinic

clinic_cf <- paste0(pData(tc_neutrophils)[["clinic"]], "_",
                    pData(tc_neutrophils)[["finaloutcome"]])
table(clinic_cf)
## clinic_cf
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             20             21
tc_neutrophils <- set_expt_conditions(tc_neutrophils, fact = clinic_cf) %>%
  set_expt_batches(fact = "visitnumber") %>%
  set_expt_colors(color_choices[["clinic_cf"]])
## 
##      Cali_cure   Cali_failure    Tumaco_cure Tumaco_failure 
##             18              3             20             21 
## 
##  3  2  1 
## 19 18 25
save(list = "tc_neutrophils", file = glue("rda/tmrc3_tc_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tc_neutrophils")

tcv1_neutrophils <- subset_expt(tc_neutrophils, subset = "visitnumber=='1'")
## subset_expt(): There were 62, now there are 25 samples.
save(list = "tcv1_neutrophils", file = glue("rda/tmrc3_tcv1_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv1_neutrophils")
tcv2_neutrophils <- subset_expt(tc_neutrophils, subset = "visitnumber=='2'")
## subset_expt(): There were 62, now there are 18 samples.
save(list = "tcv2_neutrophils", file = glue("rda/tmrc3_tcv2_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv2_neutrophils")
tcv3_neutrophils <- subset_expt(tc_neutrophils, subset = "visitnumber=='3'")
## subset_expt(): There were 62, now there are 19 samples.
save(list = "tcv3_neutrophils", file = glue("rda/tmrc3_tcv3_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tcv3_neutrophils")

10 Summarize: Tabulate sample numbers

Here is an outline of the samples in their current state:

  • By type: 184, Cure: 122, Fail: 62
    • Biopsy: 18, Cure: 13, Fail: 5
      • All biopsy samples are visit 1.
    • Eosinophils: 41, Cure: 32, Fail: 9
      • V1 Eosinophils: 14, Cure: 11, Fail: 3
      • V2 Eosinophils: 14, Cure: 11, Fail: 3
      • V3 Eosinophils: 13, Cure: 10, Fail: 3
    • Monocytes: 63, Cure: 39, Fail: 24
      • V1 Monocytes: 26, Cure: 17, Fail: 9
      • V2 Monocytes: 18, Cure: 11, Fail: 7
      • V3 Monocytes: 19, Cure: 11, Fail: 8
    • Neutrophils: 62, Cure: 38, Fail: 24
      • V1 Neutrophils: 25, Cure: 16, Fail: 9
      • V2 Neutrophils: 18, Cure: 11, Fail: 7
      • V3 Neutrophils: 19, Cure: 11, Fail: 8

11 Dataset: Only Tumaco samples

Our recent discussions have settled one big question regarding which samples to use: We will limit our analyses to only those samples from Tumaco.

The following block will therefore set that group as our default for future analyses.

t_clinical <- tc_clinical %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 184, now there are 123 samples.
save(list = "t_clinical", file = glue("rda/tmrc3_t_clinical-v{ver}.rda"))
data_structures <- c(data_structures, "t_clinical")

cpm_data <- normalize_expt(t_clinical, convert = "cpm")
t_clinical_cpm_variance <- variance_expt(cpm_data)
## Add variance by gene for all samples excluding biopsies (I assume also excluding Cali).
## This is intended to address a query from Maria Adelaida on 20230111

written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_clinical_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_clinical_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(t_clinical, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 5774 low-count genes (14149 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("data/rpkm/t_clinical-v{ver}.csv"))
cpm_data <- normalize_expt(t_clinical, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 5774 low-count genes (14149 remaining).
## Setting 17282 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_clinical_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_clinical_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(t_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5774 low-count genes (14149 remaining).
## Setting 9132 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/t_clinical_sva-v{ver}.csv"))
written_expt <- write_expt(
    t_clinical,
    excel = glue("data/xlsx/t_clinical-v{ver}.xlsx"))
## Deleting the file data/xlsx/t_clinical-v202304.xlsx before writing the tables.
## Writing the first sheet, containing a legend and some summary data.
## The following samples have less than 12949.95 genes.
## [1] "TMRC30056" "TMRC30058" "TMRC30031" "TMRC30265"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Not putting labels on the plot.
## 
## 644296 entries are 0.  We are on a log scale, adding 1 to the data.
## 
## Changed 644296 zero count features.
## 
## Naively calculating coefficient of variation/dispersion with respect to condition.
## 
## Finished calculating dispersion estimates.
## 
## `geom_smooth()` using formula = 'y ~ x'
## Loading required package: Matrix
## 
## 
## Attaching package: 'Matrix'
## 
## 
## The following object is masked from 'package:S4Vectors':
## 
##     expand
## 
## 
## 
## Total:116 s
## 
## `geom_smooth()` using formula = 'y ~ x'
## 
## Total:91 s
t_clinical_nobiop <- subset_expt(t_clinical, subset = "typeofcells!='biopsy'")
## subset_expt(): There were 123, now there are 109 samples.
save(list = "t_clinical_nobiop", file = glue("rda/tmrc3_t_clinical_nobiop-v{ver}.rda"))
data_structures <- c(data_structures, "t_clinical_nobiop")
cpm_data <- normalize_expt(t_clinical_nobiop, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_clinical_nobiop_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_clinical_nobiop_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(t_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5774 low-count genes (14149 remaining).
## Setting 9132 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/t_clinical_sva-v{ver}.csv"))

cpm_data <- normalize_expt(t_clinical_nobiop, convert = "cpm",
                           filter = TRUE, batch = "svaseq")
## Removing 8016 low-count genes (11907 remaining).
## Setting 9578 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_clinical_nobiop_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_clinical_nobiop_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(t_clinical_nobiop, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8016 low-count genes (11907 remaining).
## Setting 1834 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/t_clinical_nobiop_sva-v{ver}.csv"))

11.0.1 Pull out the top-n most variant genes

I added a few columns to the clinical gene annotations reflecting the variance/stdev/mean expression of each gene. This really highlights the extraordinary degree to which genes are changing in the data…

top_expt <- normalize_expt(t_clinical_cpm_variance, filter = TRUE) %>%
  variance_expt()
## Removing 5454 low-count genes (14469 remaining).
top_fd <- fData(top_expt)
top_ex <- exprs(top_expt)
idx <- order(top_fd[["exprs_gene_stdev"]], decreasing = TRUE)
top_df <- top_fd[idx, ]
written <- write_xlsx(
    data = head(top_fd, n = 100),
    excel = glue("excel/t_clinical_cpm_stdev_top100-v{ver}.xlsx"))
## Deleting the file excel/t_clinical_cpm_stdev_top100-v202304.xlsx before writing the tables.
bottom_expt <- normalize_expt(t_clinical_cpm_variance, filter = "simple", threshold = 500) %>%
  variance_expt()
## This function generally expects the threshold argument to be used with 'thresh'.
## Removing 9987 low-count genes (9936 remaining).
bottom_fd <- fData(bottom_expt)
bottom_ex <- exprs(bottom_expt)
idx <- order(bottom_fd[["exprs_gene_stdev"]])
bottom <- bottom_fd[idx, ]
written <- write_xlsx(
    data = head(bottom_fd, n = 100),
    excel = glue("excel/t_clinical_cpm_stdev_bottom100-v{ver}.xlsx"))
## Deleting the file excel/t_clinical_cpm_stdev_bottom100-v202304.xlsx before writing the tables.

11.1 Summarize: Collect Tumaco sample numbers.

At least in theory, everything which follows will be using the above ‘clinical’ data structure. Thus, let us count it up and get a sense of what we will work with.

table(pData(t_clinical)$drug)
## 
## antimony 
##      123
table(pData(t_clinical)$clinic)
## 
## Tumaco 
##    123
table(pData(t_clinical)$finaloutcome)
## 
##    cure failure 
##      67      56
table(pData(t_clinical)$typeofcells)
## 
##      biopsy eosinophils   monocytes neutrophils 
##          14          26          42          41
table(pData(t_clinical)$visit)
## 
##  3  2  1 
## 34 35 54
summary(as.numeric(pData(t_clinical)$eb_lc_tiempo_evolucion))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00    4.00    4.00    7.03    8.00   21.00
summary(as.numeric(pData(t_clinical)$eb_lc_tto_mcto_glucan_dosis))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      13      14      17      17      20      20
summary(as.numeric(pData(t_clinical)$v3_lc_ejey_lesion_mm_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     3.0     7.2    31.3   389.6   999.0   999.0
summary(as.numeric(pData(t_clinical)$v3_lc_lesion_area_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      46     222     999    1089     999    5055
summary(as.numeric(pData(t_clinical)$v3_lc_ejex_ulcera_mm_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0       0       0     383     999     999
table(pData(t_clinical)$eb_lc_sexo)
## 
##   1   2 
## 101  22
table(pData(t_clinical)$eb_lc_etnia)
## 
##  1  2  3 
## 76 19 28
summary(as.numeric(pData(t_clinical)$edad))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    18.0    23.0    25.0    28.5    34.0    51.0
table(pData(t_clinical)$eb_lc_peso)
## 
##  53.9  57.9  58.1  58.3  58.6    59  59.6    62    63  69.4    77    78  79.2  83.3  83.4  86.4  93.3 100.8 
##     9     2     7    10     3     8     1     6     6    10     9    10    10     4    10     9     7     2
table(pData(t_clinical)$eb_lc_estatura)
## 
## 152 154 158 159 163 164 165 166 172 173 174 176 177 182 183 
##   1  10  15   2   9  15  12  10  10   4   8   1   7   9  10
length(unique(pData(t_clinical)[["codigo_paciente"]]))
## [1] 19
only_cure <- pData(t_clinical)[["finaloutcome"]] == "cure"
c_meta <- pData(t_clinical)[only_cure, ]
length(unique(c_meta[["codigo_paciente"]]))
## [1] 10
only_fail <- pData(t_clinical)[["finaloutcome"]] == "failure"
f_meta <- pData(t_clinical)[only_fail, ]
length(unique(f_meta[["codigo_paciente"]]))
## [1] 9

11.2 Split the data by cure/fail for some counting

t_cure <- subset_expt(t_clinical, subset = "finaloutcome=='cure'")
## subset_expt(): There were 123, now there are 67 samples.
table(pData(t_cure)$visitnumber)
## 
##  3  2  1 
## 17 20 30
t_fail <- subset_expt(t_clinical, subset = "finaloutcome=='failure'")
## subset_expt(): There were 123, now there are 56 samples.
table(pData(t_fail)$visitnumber)
## 
##  3  2  1 
## 17 15 24

11.3 Subset: Create Tumaco-specific versions of the various structures

I previously made a bunch of data subsets by visit, cell type, etc. So let us overwrite them all with versions which contain only the Tumaco samples.

There is no going back to the Cali samples after this block unless we regenerate the data from the original expressionsets.

11.3.1 Tumaco biopsies

t_biopsies <- tc_biopsies %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 18, now there are 14 samples.
save(list = "t_biopsies", file = glue("rda/tmrc3_t_biopsies-v{ver}.rda"))
data_structures <- c(data_structures, "t_biopsies")
cpm_data <- normalize_expt(t_biopsies, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_biopsies_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_biopsies_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(t_biopsies, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 6417 low-count genes (13506 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/t_biopsies-v{ver}.csv"))

cpm_data <- normalize_expt(t_biopsies, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 6417 low-count genes (13506 remaining).
## Setting 145 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_biopsies_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_biopsies_cpm_sva-v202304.xlsx before writing the tables.

11.3.2 Tumaco Eosinophils

t_eosinophils <- tc_eosinophils %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 41, now there are 26 samples.
save(list = "t_eosinophils", file = glue("rda/tmrc3_t_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "t_eosinophils")
cpm_data <- normalize_expt(t_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_eosinophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_eosinophils_cpm-v202304.xlsx before writing the tables.
cpm_data <- normalize_expt(t_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9393 low-count genes (10530 remaining).
## Setting 325 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_eosinophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_eosinophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(t_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9393 low-count genes (10530 remaining).
## Setting 106 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/t_eosinophils_sva-v{ver}.csv"))

11.3.3 Tumaco subsets monocytes

t_monocytes <- tc_monocytes %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 63, now there are 42 samples.
save(list = "t_monocytes", file = glue("rda/tmrc3_t_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "t_monocytes")
cpm_data <- normalize_expt(t_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_monocytes_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_monocytes_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(t_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9064 low-count genes (10859 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/t_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(t_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9064 low-count genes (10859 remaining).
## Setting 730 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_monocytes_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_monocytes_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(t_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9064 low-count genes (10859 remaining).
## Setting 296 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/t_monocytes_sva-v{ver}.csv"))

11.3.4 Tumaco subsets neutrophils

t_neutrophils <- tc_neutrophils %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 62, now there are 41 samples.
save(list = "t_neutrophils", file = glue("rda/tmrc3_t_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "t_neutrophils")
cpm_data <- normalize_expt(t_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_neutrophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_neutrophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(t_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 10824 low-count genes (9099 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("data/rpkm/t_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(t_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 10824 low-count genes (9099 remaining).
## Setting 750 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_neutrophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_neutrophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(t_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 10824 low-count genes (9099 remaining).
## Setting 162 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/t_neutrophils_sva-v{ver}.csv"))

11.3.5 Tumaco Visit 1 samples

tv1_samples <- tcv1_samples %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 83, now there are 54 samples.
save(list = "tv1_samples", file = glue("rda/tmrc3_tv1_samples-v{ver}.rda"))
data_structures <- c(data_structures, "tv1_samples")
cpm_data <- normalize_expt(tv1_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv1_samples_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv1_samples_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv1_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 5907 low-count genes (14016 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv1_samples-v{ver}.csv"))
cpm_data <- normalize_expt(tv1_samples, convert="cpm", filter=TRUE, batch="svaseq")
## Removing 5907 low-count genes (14016 remaining).
## Setting 7615 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv1_samples_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv1_samples_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv1_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5907 low-count genes (14016 remaining).
## Setting 2539 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv1_samples_sva-v{ver}.csv"))

11.3.6 Tumaco Visit 2 samples

tv2_samples <- tcv2_samples %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 50, now there are 35 samples.
save(list = "tv2_samples", file = glue("rda/tmrc3_tv2_samples-v{ver}.rda"))
data_structures <- c(data_structures, "tv2_samples")
cpm_data <- normalize_expt(tv2_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv2_samples_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv2_samples_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv2_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8364 low-count genes (11559 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv2_samples-v{ver}.csv"))
cpm_data <- normalize_expt(tv2_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8364 low-count genes (11559 remaining).
## Setting 2848 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv2_samples_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv2_samples_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv2_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8364 low-count genes (11559 remaining).
## Setting 410 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv2_samples_sva-v{ver}.csv"))

11.3.7 Tumaco visit 3 samples

tv3_samples <- tcv3_samples %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 51, now there are 34 samples.
save(list = "tv3_samples", file = glue("rda/tmrc3_tv3_samples-v{ver}.rda"))
data_structures <- c(data_structures, "tv3_samples")
cpm_data <- normalize_expt(tv3_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv3_samples_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv3_samples_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv3_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8474 low-count genes (11449 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv3_samples-v{ver}.csv"))
cpm_data <- normalize_expt(tv3_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8474 low-count genes (11449 remaining).
## Setting 1878 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv3_samples_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv3_samples_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv3_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8474 low-count genes (11449 remaining).
## Setting 248 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv3_samples_sva-v{ver}.csv"))

11.3.8 Tumaco visit1 Eosinophils

tv1_eosinophils <- tcv1_eosinophils %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 14, now there are 8 samples.
save(list = "tv1_eosinophils", file = glue("rda/tmrc3_tv1_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv1_eosinophils")
cpm_data <- normalize_expt(tv1_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv1_eosinophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv1_eosinophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv1_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9946 low-count genes (9977 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv1_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv1_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9946 low-count genes (9977 remaining).
## Setting 57 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv1_eosinophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv1_eosinophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv1_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9946 low-count genes (9977 remaining).
## Setting 20 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv1_eosinophils_sva-v{ver}.csv"))

11.3.9 Tumaco visit 2 samples

tv2_eosinophils <- tcv2_eosinophils %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 14, now there are 9 samples.
save(list = "tv2_eosinophils", file = glue("rda/tmrc3_tv2_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv2_eosinophils")
cpm_data <- normalize_expt(tv2_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv2_eosinophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv2_eosinophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv2_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9808 low-count genes (10115 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv2_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv2_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9808 low-count genes (10115 remaining).
## Setting 90 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv2_eosinophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv2_eosinophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv2_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9808 low-count genes (10115 remaining).
## Setting 39 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv2_eosinophils_sva-v{ver}.csv"))

11.3.10 Tumaco visit 3 eosinophil

tv3_eosinophils <- tcv3_eosinophils %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 13, now there are 9 samples.
save(list = "tv3_eosinophils", file = glue("rda/tmrc3_tv3_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv3_eosinophils")
cpm_data <- normalize_expt(tv3_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv3_eosinophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv3_eosinophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv3_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9845 low-count genes (10078 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv3_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv3_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9845 low-count genes (10078 remaining).
## Setting 48 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv3_eosinophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv3_eosinophils_cpm_sva-v202304.xlsx before writing the tables.
## Note, the cbcb filter left behind a sufficient number of zeros that it confused cpm.
rpkm_data <- normalize_expt(tv3_eosinophils, filter = "simple", batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 3335 low-count genes (16588 remaining).
## Setting 5428 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv3_eosinophils_sva-v{ver}.csv"))

11.3.11 Tumaco visit 1 monocytes

tv1_monocytes <- tcv1_monocytes %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 26, now there are 16 samples.
save(list = "tv1_monocytes", file = glue("rda/tmrc3_tv1_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tv1_monocytes")
cpm_data <- normalize_expt(tv1_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv1_monocytes_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv1_monocytes_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv1_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9444 low-count genes (10479 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv1_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(tv1_monocytes, convert="cpm", filter=TRUE, batch="svaseq")
## Removing 9444 low-count genes (10479 remaining).
## Setting 187 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv1_monocytes_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv1_monocytes_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv1_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9444 low-count genes (10479 remaining).
## Setting 80 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv1_monocytes_sva-v{ver}.csv"))

11.3.12 Tumaco visit 2 monocytes

tv2_monocytes <- tcv2_monocytes %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 18, now there are 13 samples.
save(list = "tv2_monocytes", file = glue("rda/tmrc3_tv2_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tv2_monocytes")
cpm_data <- normalize_expt(tv2_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv2_monocytes_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv2_monocytes_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv2_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9403 low-count genes (10520 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv2_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(tv2_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9403 low-count genes (10520 remaining).
## Setting 115 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv2_monocytes_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv2_monocytes_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv2_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9403 low-count genes (10520 remaining).
## Setting 39 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv2_monocytes_sva-v{ver}.csv"))

11.3.13 Tumaco visit 3 monocytes

tv3_monocytes <- tcv3_monocytes %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 19, now there are 13 samples.
save(list = "tv3_monocytes", file = glue("rda/tmrc3_tv3_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "tv3_monocytes")
cpm_data <- normalize_expt(tv3_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv3_monocytes_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv3_monocytes_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv3_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9549 low-count genes (10374 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv3_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(tv3_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9549 low-count genes (10374 remaining).
## Setting 55 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv3_monocytes_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv3_monocytes_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv3_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9549 low-count genes (10374 remaining).
## Setting 28 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv3_monocytes_sva-v{ver}.csv"))

11.3.14 Tumaco visit1 neutrophils

tv1_neutrophils <- tcv1_neutrophils %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 25, now there are 16 samples.
save(list = "tv1_neutrophils", file = glue("rda/tmrc3_tv1_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv1_neutrophils")
cpm_data <- normalize_expt(tv1_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv1_neutrophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv1_neutrophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv1_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11208 low-count genes (8715 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv1_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv1_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11208 low-count genes (8715 remaining).
## Setting 145 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv1_neutrophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv1_neutrophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv1_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11208 low-count genes (8715 remaining).
## Setting 41 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv1_neutrophils_sva-v{ver}.csv"))

11.3.15 Tumaco visit 2 neutrophils

tv2_neutrophils <- tcv2_neutrophils %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 18, now there are 13 samples.
save(list = "tv2_neutrophils", file = glue("rda/tmrc3_tv2_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv2_neutrophils")
cpm_data <- normalize_expt(tv2_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv2_neutrophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv2_neutrophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv2_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11473 low-count genes (8450 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv2_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv2_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11473 low-count genes (8450 remaining).
## Setting 78 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv2_neutrophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv2_neutrophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv2_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11473 low-count genes (8450 remaining).
## Setting 41 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv2_neutrophils_sva-v{ver}.csv"))

11.3.16 Tumaco visit 3 neutrophils

tv3_neutrophils <- tcv3_neutrophils %>%
  subset_expt(subset = "clinic=='Tumaco'")
## subset_expt(): There were 19, now there are 12 samples.
save(list = "tv3_neutrophils", file = glue("rda/tmrc3_tv3_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "tv3_neutrophils")
cpm_data <- normalize_expt(tv3_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv3_neutrophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv3_neutrophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv3_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11420 low-count genes (8503 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv3_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(tv3_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11420 low-count genes (8503 remaining).
## Setting 83 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/tv3_neutrophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/tv3_neutrophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(tv3_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11420 low-count genes (8503 remaining).
## Setting 18 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/tv3_neutrophils_sva-v{ver}.csv"))

12 Dataset: Only Cali samples

Our recent discussions have settled one big question regarding which samples to use: We will limit our analyses to only those samples from Cali.

The following block will therefore set that group as our default for future analyses.

c_clinical <- tc_clinical %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 184, now there are 61 samples.
save(list = "c_clinical", file = glue("rda/tmrc3_c_clinical-v{ver}.rda"))
data_structures <- c(data_structures, "c_clinical")

cpm_data <- normalize_expt(c_clinical, convert = "cpm")
c_clinical_cpm_variance <- variance_expt(cpm_data)
## Add variance by gene for all samples excluding biopsies (I assume also excluding Cali).
## This is intended to address a query from Maria Adelaida on 20230111

written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_clinical_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_clinical_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(c_clinical, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 6530 low-count genes (13393 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("data/rpkm/t_clinical-v{ver}.csv"))
cpm_data <- normalize_expt(c_clinical, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 6530 low-count genes (13393 remaining).
## Setting 5013 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_clinical_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_clinical_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(c_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 6530 low-count genes (13393 remaining).
## Setting 3264 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/c_clinical_sva-v{ver}.csv"))
written_expt <- write_expt(
    c_clinical,
    excel = glue("data/xlsx/c_clinical-v{ver}.xlsx"))
## Deleting the file data/xlsx/c_clinical-v202304.xlsx before writing the tables.
## Writing the first sheet, containing a legend and some summary data.
## The following samples have less than 12949.95 genes.
## [1] "TMRC30140" "TMRC30280" "TMRC30284"
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.
## Scale for fill is already present.
## Adding another scale for fill, which will replace the existing scale.
## Not putting labels on the plot.
## 
## 361087 entries are 0.  We are on a log scale, adding 1 to the data.
## 
## Changed 361087 zero count features.
## 
## Naively calculating coefficient of variation/dispersion with respect to condition.
## 
## Finished calculating dispersion estimates.
## 
## `geom_smooth()` using formula = 'y ~ x'
## 
## Total:125 s
## 
## `geom_smooth()` using formula = 'y ~ x'
## 
## Total:84 s
c_clinical_nobiop <- subset_expt(c_clinical, subset = "typeofcells!='biopsy'")
## subset_expt(): There were 61, now there are 57 samples.
save(list = "c_clinical_nobiop", file = glue("rda/tmrc3_c_clinical_nobiop-v{ver}.rda"))
data_structures <- c(data_structures, "c_clinical_nobiop")
cpm_data <- normalize_expt(c_clinical_nobiop, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_clinical_nobiop_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_clinical_nobiop_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(c_clinical, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 6530 low-count genes (13393 remaining).
## Setting 3264 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/c_clinical_sva-v{ver}.csv"))

cpm_data <- normalize_expt(c_clinical_nobiop, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8330 low-count genes (11593 remaining).
## Setting 3387 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_clinical_nobiop_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_clinical_nobiop_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(c_clinical_nobiop, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8330 low-count genes (11593 remaining).
## Setting 633 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/c_clinical_nobiop_sva-v{ver}.csv"))

12.0.1 Pull out the top-n most variant genes

I added a few columns to the clinical gene annotations reflecting the variance/stdev/mean expression of each gene. This really highlights the extraordinary degree to which genes are changing in the data…

top_expt <- normalize_expt(c_clinical_cpm_variance, filter = TRUE) %>%
  variance_expt()
## Removing 6201 low-count genes (13722 remaining).
top_fd <- fData(top_expt)
top_ex <- exprs(top_expt)
idx <- order(top_fd[["exprs_gene_stdev"]], decreasing = TRUE)
top_df <- top_fd[idx, ]
written <- write_xlsx(
    data = head(top_fd, n = 100),
    excel = glue("excel/c_clinical_cpm_stdev_top100-v{ver}.xlsx"))
## Deleting the file excel/c_clinical_cpm_stdev_top100-v202304.xlsx before writing the tables.
bottom_expt <- normalize_expt(c_clinical_cpm_variance, filter = "simple", threshold = 500) %>%
  variance_expt()
## This function generally expects the threshold argument to be used with 'thresh'.
## Removing 11594 low-count genes (8329 remaining).
bottom_fd <- fData(bottom_expt)
bottom_ex <- exprs(bottom_expt)
idx <- order(bottom_fd[["exprs_gene_stdev"]])
bottom <- bottom_fd[idx, ]
written <- write_xlsx(
    data = head(bottom_fd, n = 100),
    excel = glue("excel/c_clinical_cpm_stdev_bottom100-v{ver}.xlsx"))
## Deleting the file excel/c_clinical_cpm_stdev_bottom100-v202304.xlsx before writing the tables.

12.1 Summarize: Collect Cali sample numbers.

At least in theory, everything which follows will be using the above ‘clinical’ data structure. Thus, let us count it up and get a sense of what we will work with.

table(pData(c_clinical)$drug)
## 
## antimony 
##       61
table(pData(c_clinical)$clinic)
## 
## Cali 
##   61
table(pData(c_clinical)$finaloutcome)
## 
##    cure failure 
##      55       6
table(pData(c_clinical)$typeofcells)
## 
##      biopsy eosinophils   monocytes neutrophils 
##           4          15          21          21
table(pData(c_clinical)$visit)
## 
##  3  2  1 
## 17 15 29
summary(as.numeric(pData(c_clinical)$eb_lc_tiempo_evolucion))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     3.0     6.0     8.0    10.5    15.0    20.0
summary(as.numeric(pData(c_clinical)$eb_lc_tto_mcto_glucan_dosis))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    14.0    18.0    19.0    18.5    20.0    20.0
summary(as.numeric(pData(c_clinical)$v3_lc_ejey_lesion_mm_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0    11.0    37.0   129.6    63.7   999.0
summary(as.numeric(pData(c_clinical)$v3_lc_lesion_area_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0     440    2375    4828    8348   16965
summary(as.numeric(pData(c_clinical)$v3_lc_ejex_ulcera_mm_1))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0     0.0    35.0   119.6    49.1   999.0
table(pData(c_clinical)$eb_lc_sexo)
## 
##  1  2 
## 55  6
table(pData(c_clinical)$eb_lc_etnia)
## 
##  1  2  3 
## 15 27 19
summary(as.numeric(pData(c_clinical)$edad))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    28.0    33.0    36.0    35.2    37.0    44.0
table(pData(c_clinical)$eb_lc_peso)
## 
##   58   67   72   75 76.5   77   82   87   89  100 
##    6    6    9    2    3    9    9    3    9    5
table(pData(c_clinical)$eb_lc_estatura)
## 
## 155 156 160 166 167 169 173 174 
##   9   6   3   9   3   2   5  24
length(unique(pData(c_clinical)[["codigo_paciente"]]))
## [1] 10
only_cure <- pData(c_clinical)[["finaloutcome"]] == "cure"
c_meta <- pData(c_clinical)[only_cure, ]
length(unique(c_meta[["codigo_paciente"]]))
## [1] 9
only_fail <- pData(c_clinical)[["finaloutcome"]] == "failure"
f_meta <- pData(c_clinical)[only_fail, ]
length(unique(f_meta[["codigo_paciente"]]))
## [1] 1

12.2 Split the data by cure/fail for some counting

cali_cure <- subset_expt(c_clinical, subset = "finaloutcome=='cure'")
## subset_expt(): There were 61, now there are 55 samples.
table(pData(cali_cure)$visitnumber)
## 
##  3  2  1 
## 15 13 27
cali_fail <- subset_expt(c_clinical, subset = "finaloutcome=='failure'")
## subset_expt(): There were 61, now there are 6 samples.
table(pData(cali_fail)$visitnumber)
## 
## 3 2 1 
## 2 2 2

12.3 Subset: Create Cali-specific versions of the various structures

I previously made a bunch of data subsets by visit, cell type, etc. So let us overwrite them all with versions which contain only the Cali samples.

There is no going back to the Cali samples after this block unless we regenerate the data from the original expressionsets.

12.3.1 Cali biopsies

c_biopsies <- tc_biopsies %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 18, now there are 4 samples.
save(list = "c_biopsies", file = glue("rda/tmrc3_c_biopsies-v{ver}.rda"))
data_structures <- c(data_structures, "c_biopsies")
cpm_data <- normalize_expt(c_biopsies, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_calic/c_biopsies_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_calic/c_biopsies_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(c_biopsies, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 7356 low-count genes (12567 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/c_biopsies-v{ver}.csv"))

cpm_data <- normalize_expt(c_biopsies, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 7356 low-count genes (12567 remaining).
## Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
##   contrasts can be applied only to factors with 2 or more levels
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, : The batch_counts call failed.  Returning non-batch reduced data.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_biopsies_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_biopsies_cpm_sva-v202304.xlsx before writing the tables.

12.3.2 Cali Eosinophils

c_eosinophils <- tc_eosinophils %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 41, now there are 15 samples.
save(list = "c_eosinophils", file = glue("rda/tmrc3_c_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "c_eosinophils")
cpm_data <- normalize_expt(c_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_eosinophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_eosinophils_cpm-v202304.xlsx before writing the tables.
cpm_data <- normalize_expt(c_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9576 low-count genes (10347 remaining).
## Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
##   contrasts can be applied only to factors with 2 or more levels
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, : The batch_counts call failed.  Returning non-batch reduced data.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_eosinophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_eosinophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(c_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9576 low-count genes (10347 remaining).
## Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
##   contrasts can be applied only to factors with 2 or more levels
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, : The batch_counts call failed.  Returning non-batch reduced data.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/c_eosinophils_sva-v{ver}.csv"))

12.3.3 Cali subsets monocytes

c_monocytes <- tc_monocytes %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 63, now there are 21 samples.
save(list = "c_monocytes", file = glue("rda/tmrc3_c_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "c_monocytes")
cpm_data <- normalize_expt(c_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_monocytes_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_monocytes_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(c_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9355 low-count genes (10568 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/c_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(c_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9355 low-count genes (10568 remaining).
## Setting 92 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_monocytes_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_monocytes_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(c_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9355 low-count genes (10568 remaining).
## Setting 18 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/c_monocytes_sva-v{ver}.csv"))

12.3.4 Cali subsets neutrophils

c_neutrophils <- tc_neutrophils %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 62, now there are 21 samples.
save(list = "c_neutrophils", file = glue("rda/tmrc3_c_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "c_neutrophils")
cpm_data <- normalize_expt(c_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_neutrophil_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_neutrophil_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(c_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11494 low-count genes (8429 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
                 file = glue("data/rpkm/c_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(c_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11494 low-count genes (8429 remaining).
## Setting 117 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/c_neutrophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/c_neutrophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(c_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11494 low-count genes (8429 remaining).
## Setting 30 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/c_neutrophils_sva-v{ver}.csv"))

12.3.5 Cali Visit 1 samples

cv1_samples <- tcv1_samples %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 83, now there are 29 samples.
save(list = "cv1_samples", file = glue("rda/tmrc3_cv1_samples-v{ver}.rda"))
data_structures <- c(data_structures, "cv1_samples")
cpm_data <- normalize_expt(cv1_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv1_samples_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv1_samples_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv1_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 6666 low-count genes (13257 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv1_samples-v{ver}.csv"))
cpm_data <- normalize_expt(cv1_samples, convert =  "cpm", filter = TRUE, batch = "svaseq")
## Removing 6666 low-count genes (13257 remaining).
## Setting 1975 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv1_samples_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv1_samples_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv1_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 6666 low-count genes (13257 remaining).
## Setting 661 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv1_samples_sva-v{ver}.csv"))

12.3.6 Cali Visit 2 samples

cv2_samples <- tcv2_samples %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 50, now there are 15 samples.
save(list = "cv2_samples", file = glue("rda/tmrc3_cv2_samples-v{ver}.rda"))
data_structures <- c(data_structures, "cv2_samples")
cpm_data <- normalize_expt(cv2_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv2_samples_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv2_samples_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv2_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8864 low-count genes (11059 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv2_samples-v{ver}.csv"))
cpm_data <- normalize_expt(cv2_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8864 low-count genes (11059 remaining).
## Setting 342 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv2_samples_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv2_samples_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv2_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8864 low-count genes (11059 remaining).
## Setting 61 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv2_samples_sva-v{ver}.csv"))

12.3.7 Cali visit 3 samples

cv3_samples <- tcv3_samples %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 51, now there are 17 samples.
save(list = "cv3_samples", file = glue("rda/tmrc3_cv3_samples-v{ver}.rda"))
data_structures <- c(data_structures, "cv3_samples")
cpm_data <- normalize_expt(cv3_samples, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv3_samples_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv3_samples_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv3_samples, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 8836 low-count genes (11087 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv3_samples-v{ver}.csv"))
cpm_data <- normalize_expt(cv3_samples, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8836 low-count genes (11087 remaining).
## Setting 505 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv3_samples_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv3_samples_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv3_samples, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 8836 low-count genes (11087 remaining).
## Setting 78 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv3_samples_sva-v{ver}.csv"))

12.3.8 Cali visit1 Eosinophils

cv1_eosinophils <- tcv1_eosinophils %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 14, now there are 6 samples.
save(list = "cv1_eosinophils", file = glue("rda/tmrc3_cv1_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv1_eosinophils")
cpm_data <- normalize_expt(cv1_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv1_eosinophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv1_eosinophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv1_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 10086 low-count genes (9837 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv1_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv1_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 10086 low-count genes (9837 remaining).
## Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
##   contrasts can be applied only to factors with 2 or more levels
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, : The batch_counts call failed.  Returning non-batch reduced data.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv1_eosinophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv1_eosinophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv1_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 10086 low-count genes (9837 remaining).
## Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
##   contrasts can be applied only to factors with 2 or more levels
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, : The batch_counts call failed.  Returning non-batch reduced data.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv1_eosinophils_sva-v{ver}.csv"))

12.3.9 Cali visit 2 samples

cv2_eosinophils <- tcv2_eosinophils %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 14, now there are 5 samples.
save(list = "cv2_eosinophils", file = glue("rda/tmrc3_cv2_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv2_eosinophils")
cpm_data <- normalize_expt(cv2_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv2_eosinophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv2_eosinophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv2_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 10105 low-count genes (9818 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv2_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv2_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 10105 low-count genes (9818 remaining).
## Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
##   contrasts can be applied only to factors with 2 or more levels
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, : The batch_counts call failed.  Returning non-batch reduced data.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv2_eosinophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv2_eosinophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv2_eosinophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 10105 low-count genes (9818 remaining).
## Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
##   contrasts can be applied only to factors with 2 or more levels
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, : The batch_counts call failed.  Returning non-batch reduced data.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv2_eosinophils_sva-v{ver}.csv"))

12.3.10 Cali visit 3 eosinophil

cv3_eosinophils <- tcv3_eosinophils %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 13, now there are 4 samples.
save(list = "cv3_eosinophils", file = glue("rda/tmrc3_cv3_eosinophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv3_eosinophils")
cpm_data <- normalize_expt(cv3_eosinophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv3_eosinophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv3_eosinophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv3_eosinophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 10231 low-count genes (9692 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv3_eosinophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv3_eosinophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 10231 low-count genes (9692 remaining).
## Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
##   contrasts can be applied only to factors with 2 or more levels
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, : The batch_counts call failed.  Returning non-batch reduced data.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv3_eosinophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv3_eosinophils_cpm_sva-v202304.xlsx before writing the tables.
## Note, the cbcb filter left behind a sufficient number of zeros that it confused cpm.
rpkm_data <- normalize_expt(cv3_eosinophils, filter = "simple", batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 5271 low-count genes (14652 remaining).
## Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
##   contrasts can be applied only to factors with 2 or more levels
## Warning in do_batch(count_table, method = batch, expt_design = expt_design, : The batch_counts call failed.  Returning non-batch reduced data.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv3_eosinophils_sva-v{ver}.csv"))

12.3.11 Cali visit 1 monocytes

cv1_monocytes <- tcv1_monocytes %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 26, now there are 10 samples.
save(list = "cv1_monocytes", file = glue("rda/tmrc3_cv1_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "cv1_monocytes")
cpm_data <- normalize_expt(cv1_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv1_monocytes_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv1_monocytes_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv1_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9549 low-count genes (10374 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv1_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(cv1_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9549 low-count genes (10374 remaining).
## Setting 45 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv1_monocytes_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv1_monocytes_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv1_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9549 low-count genes (10374 remaining).
## Setting 9 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv1_monocytes_sva-v{ver}.csv"))

12.3.12 Cali visit 2 monocytes

cv2_monocytes <- tcv2_monocytes %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 18, now there are 5 samples.
save(list = "cv2_monocytes", file = glue("rda/tmrc3_cv2_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "cv2_monocytes")
cpm_data <- normalize_expt(cv2_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv2_monocytes_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv2_monocytes_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv2_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9791 low-count genes (10132 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv2_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(cv2_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9791 low-count genes (10132 remaining).
## Setting 5 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv2_monocytes_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv2_monocytes_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv2_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9791 low-count genes (10132 remaining).
## Setting 2 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv2_monocytes_sva-v{ver}.csv"))

12.3.13 Cali visit 3 monocytes

cv3_monocytes <- tcv3_monocytes %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 19, now there are 6 samples.
save(list = "cv3_monocytes", file = glue("rda/tmrc3_cv3_monocytes-v{ver}.rda"))
data_structures <- c(data_structures, "cv3_monocytes")
cpm_data <- normalize_expt(cv3_monocytes, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv3_monocytes_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv3_monocytes_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv3_monocytes, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 9754 low-count genes (10169 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv3_monocytes-v{ver}.csv"))
cpm_data <- normalize_expt(cv3_monocytes, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 9754 low-count genes (10169 remaining).
## Setting 15 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv3_monocytes_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv3_monocytes_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv3_monocytes, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 9754 low-count genes (10169 remaining).
## Setting 5 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv3_monocytes_sva-v{ver}.csv"))

12.3.14 Cali visit1 neutrophils

cv1_neutrophils <- tcv1_neutrophils %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 25, now there are 9 samples.
save(list = "cv1_neutrophils", file = glue("rda/tmrc3_cv1_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv1_neutrophils")
cpm_data <- normalize_expt(cv1_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv1_neutrophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv1_neutrophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv1_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11802 low-count genes (8121 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv1_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv1_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11802 low-count genes (8121 remaining).
## Setting 33 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv1_neutrophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv1_neutrophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv1_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11802 low-count genes (8121 remaining).
## Setting 9 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv1_neutrophils_sva-v{ver}.csv"))

12.3.15 Cali visit 2 neutrophils

cv2_neutrophils <- tcv2_neutrophils %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 18, now there are 5 samples.
save(list = "cv2_neutrophils", file = glue("rda/tmrc3_cv2_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv2_neutrophils")
cpm_data <- normalize_expt(cv2_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv2_neutrophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv2_neutrophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv2_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 12265 low-count genes (7658 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv2_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv2_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 12265 low-count genes (7658 remaining).
## Setting 10 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv2_neutrophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv2_neutrophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv2_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 12265 low-count genes (7658 remaining).
## Setting 1 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv2_neutrophils_sva-v{ver}.csv"))

12.3.16 Cali visit 3 neutrophils

cv3_neutrophils <- tcv3_neutrophils %>%
  subset_expt(subset = "clinic=='Cali'")
## subset_expt(): There were 19, now there are 7 samples.
save(list = "cv3_neutrophils", file = glue("rda/tmrc3_cv3_neutrophils-v{ver}.rda"))
data_structures <- c(data_structures, "cv3_neutrophils")
cpm_data <- normalize_expt(cv3_neutrophils, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv3_neutrophils_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv3_neutrophils_cpm-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv3_neutrophils, filter = TRUE, convert = "rpkm",
                            na_to_zero = TRUE, column = "mean_cds_len")
## Removing 11935 low-count genes (7988 remaining).
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv3_neutrophils-v{ver}.csv"))
cpm_data <- normalize_expt(cv3_neutrophils, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 11935 low-count genes (7988 remaining).
## Setting 28 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_cali/cv3_neutrophils_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_cali/cv3_neutrophils_cpm_sva-v202304.xlsx before writing the tables.
rpkm_data <- normalize_expt(cv3_neutrophils, filter = TRUE, batch = "svaseq") %>%
  normalize_expt(convert = "rpkm", column = "mean_cds_len", na_to_zero = TRUE)
## Removing 11935 low-count genes (7988 remaining).
## Setting 7 low elements to zero.
write.csv(x = as.data.frame(exprs(rpkm_data)),
          file = glue("data/rpkm/cv3_neutrophils_sva-v{ver}.csv"))

12.3.17 Tumaco compare visits

Is this redundant?

t_visit <- set_expt_conditions(t_clinical, fact = "visitnumber") %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells!='biopsy'")
## 
##  3  2  1 
## 34 35 54 
## 
##    cure failure 
##      67      56
## subset_expt(): There were 123, now there are 109 samples.
save(list = "t_visit", file = glue("rda/tmrc3_t_visit-v{ver}.rda"))
data_structures <- c(data_structures, "t_visit")
cpm_data <- normalize_expt(t_visit, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_visit_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_visit_cpm-v202304.xlsx before writing the tables.
cpm_data <- normalize_expt(t_visit, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8016 low-count genes (11907 remaining).
## Setting 9614 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/t_visit_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/t_visit_cpm_sva-v202304.xlsx before writing the tables.

12.3.18 Visit cure/fail contrasts

visit_cf_expt_factor <- paste0("v", pData(t_clinical)[["visitnumber"]],
                               pData(t_clinical)[["finaloutcome"]])
t_visitcf <- set_expt_conditions(t_clinical, fact = visit_cf_expt_factor)
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##        30        24        20        15        17        17
save(list = "t_visitcf", file = glue("rda/tmrc3_t_visitcf-v{ver}.rda"))
data_structures <- c(data_structures, "t_visitcf")

t_visitcf_eosinophil <- subset_expt(t_visitcf, subset = "typeofcells=='eosinophils'")
## subset_expt(): There were 123, now there are 26 samples.
save(list = "t_visitcf_eosinophil", file = glue("rda/tmrc3_t_visitcf_eosinophil-v{ver}.rda"))
data_structures <- c(data_structures, "t_visitcf_eosinophil")

t_visitcf_monocyte <- subset_expt(t_visitcf, subset = "typeofcells=='monocytes'")
## subset_expt(): There were 123, now there are 42 samples.
save(list = "t_visitcf_monocyte", file = glue("rda/tmrc3_t_visitcf_monocyte-v{ver}.rda"))
data_structures <- c(data_structures, "t_visitcf_monocyte")

t_visitcf_neutrophil <- subset_expt(t_visitcf, subset = "typeofcells=='neutrophils'")
## subset_expt(): There were 123, now there are 41 samples.
save(list = "t_visitcf_neutrophil", file = glue("rda/tmrc3_t_visitcf_neutrophil-v{ver}.rda"))
data_structures <- c(data_structures, "t_visitcf_neutrophil")

12.3.19 Cali compare visits

Is this redundant?

c_visit <- set_expt_conditions(c_clinical, fact = "visitnumber") %>%
  set_expt_batches(fact = "finaloutcome") %>%
  subset_expt(subset = "typeofcells!='biopsy'")
## 
##  3  2  1 
## 17 15 29 
## 
##    cure failure 
##      55       6
## subset_expt(): There were 61, now there are 57 samples.
save(list = "c_visit", file = glue("rda/tmrc3_c_visit-v{ver}.rda"))
data_structures <- c(data_structures, "c_visit")
cpm_data <- normalize_expt(c_visit, convert = "cpm")
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/c_visit_cpm-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/c_visit_cpm-v202304.xlsx before writing the tables.
cpm_data <- normalize_expt(c_visit, convert = "cpm", filter = TRUE, batch = "svaseq")
## Removing 8330 low-count genes (11593 remaining).
## Setting 3385 low elements to zero.
written <- write_xlsx(
    exprs(cpm_data),
    excel = glue("data/cpm/4_tumaco/c_visit_cpm_sva-v{ver}.xlsx"))
## Deleting the file data/cpm/4_tumaco/c_visit_cpm_sva-v202304.xlsx before writing the tables.

12.3.20 Visit cure/fail contrasts

visit_cf_expt_factor <- paste0("v", pData(c_clinical)[["visitnumber"]],
                               pData(c_clinical)[["finaloutcome"]])
c_visitcf <- set_expt_conditions(c_clinical, fact = visit_cf_expt_factor)
## 
##    v1cure v1failure    v2cure v2failure    v3cure v3failure 
##        27         2        13         2        15         2
save(list = "c_visitcf", file = glue("rda/tmrc3_c_visitcf-v{ver}.rda"))
data_structures <- c(data_structures, "c_visitcf")

c_visitcf_eosinophil <- subset_expt(c_visitcf, subset = "typeofcells=='eosinophils'")
## subset_expt(): There were 61, now there are 15 samples.
save(list = "c_visitcf_eosinophil", file = glue("rda/tmrc3_c_visitcf_eosinophil-v{ver}.rda"))
data_structures <- c(data_structures, "c_visitcf_eosinophil")

c_visitcf_monocyte <- subset_expt(c_visitcf, subset = "typeofcells=='monocytes'")
## subset_expt(): There were 61, now there are 21 samples.
save(list = "c_visitcf_monocyte", file = glue("rda/tmrc3_c_visitcf_monocyte-v{ver}.rda"))
data_structures <- c(data_structures, "c_visitcf_monocyte")

c_visitcf_neutrophil <- subset_expt(c_visitcf, subset = "typeofcells=='neutrophils'")
## subset_expt(): There were 61, now there are 21 samples.
save(list = "c_visitcf_neutrophil", file = glue("rda/tmrc3_c_visitcf_neutrophil-v{ver}.rda"))
data_structures <- c(data_structures, "c_visitcf_neutrophil")

13 Persistence

t_persistence <- subset_expt(t_clinical, subset = "persistence=='Y'|persistence=='N'") %>%
  subset_expt(subset = 'visitnumber==3') %>%
  set_expt_conditions(fact = 'persistence')
## subset_expt(): There were 123, now there are 97 samples.
## subset_expt(): There were 97, now there are 30 samples.
## 
##  N  Y 
##  6 24
save(list = "t_persistence", file = glue("rda/tmrc3_t_persistence-v{ver}.rda"))
data_structures <- c(data_structures, "t_persistence")

t_persistence_monocyte <- subset_expt(t_persistence, subset = "typeofcells=='monocytes'")
## subset_expt(): There were 30, now there are 12 samples.
save(list = "t_persistence_monocyte", file = glue("rda/tmrc3_t_persistence_monocyte-v{ver}.rda"))
data_structures <- c(data_structures, "t_persistence_monocyte")

t_persistence_neutrophil <- subset_expt(t_persistence, subset = "typeofcells=='neutrophils'")
## subset_expt(): There were 30, now there are 10 samples.
save(list = "t_persistence_neutrophil", file = glue("rda/tmrc3_t_persistence_neutrophil-v{ver}.rda"))
data_structures <- c(data_structures, "t_persistence_neutrophil")

t_persistence_eosinophil <- subset_expt(t_persistence, subset = "typeofcells=='eosinophils'")
## subset_expt(): There were 30, now there are 8 samples.
save(list = "t_persistence_eosinophil", file = glue("rda/tmrc3_t_persistence_eosinophil-v{ver}.rda"))
data_structures <- c(data_structures, "t_persistence_eosinophil")

14 Save all data structures into one big pile

save(list = data_structures, file = glue("rda/tmrc3_data_structures-v{ver}.rda"))

15 Summarize: Tabulate sample numbers

Here is an outline of the samples in their current state:

  • By type: 123, Cure: 67, Fail: 56
    • Biopsy: 18, Cure: 9, Fail: 5
      • All biopsy samples are visit 1.
    • Eosinophils: 41, Cure: 17, Fail: 9
      • V1 Eosinophils: 8, Cure: 5, Fail: 3
      • V2 Eosinophils: 9, Cure: 6, Fail: 3
      • V3 Eosinophils: 9, Cure: 6, Fail: 3
    • Monocytes: 63, Cure: 21, Fail: 21
      • V1 Monocytes: 16, Cure: 8, Fail: 8
      • V2 Monocytes: 13, Cure: 7, Fail: 6
      • V3 Monocytes: 13, Cure: 6, Fail: 7
    • Neutrophils: 62, Cure: 20, Fail: 21
      • V1 Neutrophils: 16, Cure: 8, Fail: 8
      • V2 Neutrophils: 13, Cure: 7, Fail: 6
      • V3 Neutrophils: 12, Cure: 5, Fail: 7
ncol(exprs(t_clinical))
## [1] 123
sum(pData(t_clinical)[["finaloutcome"]] == "cure")
## [1] 67
sum(pData(t_clinical)[["finaloutcome"]] == "failure")
## [1] 56
all_types[["biopsy"]]
## [1] 18
sum(pData(t_biopsies)[["finaloutcome"]] == "cure")
## [1] 9
sum(pData(t_biopsies)[["finaloutcome"]] == "failure")
## [1] 5
all_types[["eosinophils"]]
## [1] 41
sum(pData(t_eosinophils)[["finaloutcome"]] == "cure")
## [1] 17
sum(pData(t_eosinophils)[["finaloutcome"]] == "failure")
## [1] 9
nrow(pData(tv1_eosinophils))
## [1] 8
sum(pData(tv1_eosinophils)[["finaloutcome"]] == "cure")
## [1] 5
sum(pData(tv1_eosinophils)[["finaloutcome"]] == "failure")
## [1] 3
nrow(pData(tv2_eosinophils))
## [1] 9
sum(pData(tv2_eosinophils)[["finaloutcome"]] == "cure")
## [1] 6
sum(pData(tv2_eosinophils)[["finaloutcome"]] == "failure")
## [1] 3
nrow(pData(tv3_eosinophils))
## [1] 9
sum(pData(tv3_eosinophils)[["finaloutcome"]] == "cure")
## [1] 6
sum(pData(tv3_eosinophils)[["finaloutcome"]] == "failure")
## [1] 3
all_types[["monocytes"]]
## [1] 63
sum(pData(t_monocytes)[["finaloutcome"]] == "cure")
## [1] 21
sum(pData(t_monocytes)[["finaloutcome"]] == "failure")
## [1] 21
nrow(pData(tv1_monocytes))
## [1] 16
sum(pData(tv1_monocytes)[["finaloutcome"]] == "cure")
## [1] 8
sum(pData(tv1_monocytes)[["finaloutcome"]] == "failure")
## [1] 8
nrow(pData(tv2_monocytes))
## [1] 13
sum(pData(tv2_monocytes)[["finaloutcome"]] == "cure")
## [1] 7
sum(pData(tv2_monocytes)[["finaloutcome"]] == "failure")
## [1] 6
nrow(pData(tv3_monocytes))
## [1] 13
sum(pData(tv3_monocytes)[["finaloutcome"]] == "cure")
## [1] 6
sum(pData(tv3_monocytes)[["finaloutcome"]] == "failure")
## [1] 7
all_types[["neutrophils"]]
## [1] 62
sum(pData(t_neutrophils)[["finaloutcome"]] == "cure")
## [1] 20
sum(pData(t_neutrophils)[["finaloutcome"]] == "failure")
## [1] 21
nrow(pData(tv1_neutrophils))
## [1] 16
sum(pData(tv1_neutrophils)[["finaloutcome"]] == "cure")
## [1] 8
sum(pData(tv1_neutrophils)[["finaloutcome"]] == "failure")
## [1] 8
nrow(pData(tv2_monocytes))
## [1] 13
sum(pData(tv2_neutrophils)[["finaloutcome"]] == "cure")
## [1] 7
sum(pData(tv2_neutrophils)[["finaloutcome"]] == "failure")
## [1] 6
nrow(pData(tv3_neutrophils))
## [1] 12
sum(pData(tv3_neutrophils)[["finaloutcome"]] == "cure")
## [1] 5
sum(pData(tv3_neutrophils)[["finaloutcome"]] == "failure")
## [1] 7
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))
}

16 Dataset: Parasite reads

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?

Later, I manually went through the mappings of samples with a significant number of parasite reads in IGV with some TMRC2 known zymodeme samples. In many cases it is possible to state definitively the classification of the parasite which infected an individual.

tmrc3_lp_expt <- sm(create_expt(
  samplesheet,
  file_column = "lpanamensisv36hisatfile", gene_info = NULL)) %>%
  subset_expt(coverage = 1000) %>%
  set_expt_conditions(fact = "typeofcells")
## The samples removed (and read coverage) when filtering samples with less than 1000 reads are:
## TMRC30001 TMRC30002 TMRC30003 TMRC30004 TMRC30005 TMRC30006 TMRC30007 TMRC30008 TMRC30009 TMRC30010 TMRC30011 TMRC30012 TMRC30013 TMRC30185 TMRC30186 
##        12         8         9        16        25        29         3        16        16         0         5         9        13         0       852 
## TMRC30178 TMRC30179 TMRC30221 TMRC30222 TMRC30223 TMRC30224 TMRC30269 TMRC30148 TMRC30150 TMRC30140 TMRC30138 TMRC30151 TMRC30234 TMRC30235 TMRC30270 
##       420       515         0         0         0         2        58       706       470       153       156       480         0         0        21 
## TMRC30225 TMRC30226 TMRC30227 TMRC30228 TMRC30229 TMRC30230 TMRC30231 TMRC30232 TMRC30233 TMRC30018 TMRC30209 TMRC30210 TMRC30211 TMRC30212 TMRC30213 
##         0         0         0         0         0         0         0         1         0       110         0         0         0         0         0 
## TMRC30216 TMRC30214 TMRC30215 TMRC30271 TMRC30273 TMRC30275 TMRC30272 TMRC30274 TMRC30276 TMRC30254 TMRC30277 TMRC30239 TMRC30240 TMRC30278 TMRC30279 
##         0         0         1         4         2         2         0         0         1       208         6       209       314         0         0 
## TMRC30280 TMRC30257 TMRC30281 TMRC30283 TMRC30284 TMRC30282 TMRC30050 TMRC30285 TMRC30164 TMRC30119 TMRC30025 TMRC30032 TMRC30028 TMRC30118 TMRC30014 
##         3       427       548        18         4         1       345         0       424       419       954        22        93       747         4 
## TMRC30196 TMRC30030 TMRC30021 TMRC30023 TMRC30037 TMRC30031 TMRC30165 TMRC30027 TMRC30194 TMRC30033 TMRC30038 TMRC30166 TMRC30036 TMRC30024 TMRC30195 
##       687         3        88       120         9         8       433       108       198        36       208       496        11        49       458 
## TMRC30034 TMRC30045 TMRC30040 TMRC30035 TMRC30041 TMRC30171 TMRC30192 TMRC30139 TMRC30042 TMRC30158 TMRC30160 TMRC30189 TMRC30123 TMRC30181 TMRC30043 
##        21       334       896       153       264       370       384       140       545       284       296       307       304       613       571 
## TMRC30159 TMRC30129 TMRC30172 TMRC30174 TMRC30137 TMRC30161 TMRC30142 TMRC30190 TMRC30145 TMRC30143 TMRC30197 TMRC30146 TMRC30182 TMRC30198 TMRC30266 
##       405       353       383       644       389       300         4       537         0         1       202         0       468       158       822 
## TMRC30201 TMRC30200 TMRC30203 TMRC30202 TMRC30205 TMRC30152 TMRC30155 TMRC30154 TMRC30206 TMRC30207 TMRC30238 TMRC30217 TMRC30208 TMRC30219 TMRC30218 
##       149        96       104       145       169       495       508       398       125         0       335         0         1         0         2 
## TMRC30260 TMRC30220 TMRC30262 TMRC30261 TMRC30173 TMRC30264 TMRC30263 TMRC30144 TMRC30147 TMRC30265 
##       291         0       905       500       898       309       431         0         1       596
## subset_expt(): There were 244, now there are 99 samples.
## 
##      Biopsy Eosinophils Macrophages   Monocytes Neutrophils 
##          13          14          25          24          23
visit_fact <- pData(tmrc3_lp_expt)[["visitnumber"]]
batch_na <- is.na(visit_fact)
visit_fact[batch_na] <- "undefined"
lp_expt <- set_expt_batches(tmrc3_lp_expt, fact = visit_fact)
## 
##         1         2         3 undefined 
##        40        14        20        25
save(list = "tmrc3_lp_expt", file = glue("rda/tmrc3_lp_expt_all_sanitized-v{ver}.rda"))
data_structures <- c(data_structures, "tmrc3_lp_expt")

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.

17 An external dataset

new_sample_sheet <- gather_preprocessing_metadata("sample_sheets/scott_sra_samples.xlsx")
## Did not find the condition column in the sample sheet.
## Filling it in as undefined.
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## Starting assembly_fasta_nt.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/unicycler_assembly.fasta.
## Example filename: preprocessing/SRR8668755/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668755/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668756/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668757/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668758/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668759/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668760/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668761/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668762/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668763/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668764/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668765/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668766/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668767/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668768/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668769/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668770/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668771/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668772/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668773/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668774/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668775/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668776/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668777/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668778/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668779/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668780/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668781/unicycler_assembly.fasta.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for: preprocessing/SRR8668782/unicycler_assembly.fasta.
## Starting assembly_genbank_annotated.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*mergeannot/{meta[['sampleid']]}.gbk.
## Example filename: preprocessing/SRR8668755/outputs/*mergeannot/SRR8668755.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668755/outputs/*mergeannot/SRR8668755.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668756/outputs/*mergeannot/SRR8668756.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668757/outputs/*mergeannot/SRR8668757.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668758/outputs/*mergeannot/SRR8668758.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668759/outputs/*mergeannot/SRR8668759.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668760/outputs/*mergeannot/SRR8668760.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668761/outputs/*mergeannot/SRR8668761.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668762/outputs/*mergeannot/SRR8668762.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668763/outputs/*mergeannot/SRR8668763.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668764/outputs/*mergeannot/SRR8668764.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668765/outputs/*mergeannot/SRR8668765.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668766/outputs/*mergeannot/SRR8668766.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668767/outputs/*mergeannot/SRR8668767.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668768/outputs/*mergeannot/SRR8668768.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668769/outputs/*mergeannot/SRR8668769.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668770/outputs/*mergeannot/SRR8668770.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668771/outputs/*mergeannot/SRR8668771.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668772/outputs/*mergeannot/SRR8668772.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668773/outputs/*mergeannot/SRR8668773.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668774/outputs/*mergeannot/SRR8668774.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668775/outputs/*mergeannot/SRR8668775.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668776/outputs/*mergeannot/SRR8668776.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668777/outputs/*mergeannot/SRR8668777.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668778/outputs/*mergeannot/SRR8668778.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668779/outputs/*mergeannot/SRR8668779.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668780/outputs/*mergeannot/SRR8668780.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668781/outputs/*mergeannot/SRR8668781.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668782/outputs/*mergeannot/SRR8668782.gbk.
## Starting assembly_genbank_stripped.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*mergeannot/{meta[['sampleid']]}_stripped.gbk.
## Example filename: preprocessing/SRR8668755/outputs/*mergeannot/SRR8668755_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668755/outputs/*mergeannot/SRR8668755_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668756/outputs/*mergeannot/SRR8668756_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668757/outputs/*mergeannot/SRR8668757_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668758/outputs/*mergeannot/SRR8668758_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668759/outputs/*mergeannot/SRR8668759_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668760/outputs/*mergeannot/SRR8668760_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668761/outputs/*mergeannot/SRR8668761_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668762/outputs/*mergeannot/SRR8668762_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668763/outputs/*mergeannot/SRR8668763_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668764/outputs/*mergeannot/SRR8668764_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668765/outputs/*mergeannot/SRR8668765_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668766/outputs/*mergeannot/SRR8668766_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668767/outputs/*mergeannot/SRR8668767_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668768/outputs/*mergeannot/SRR8668768_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668769/outputs/*mergeannot/SRR8668769_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668770/outputs/*mergeannot/SRR8668770_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668771/outputs/*mergeannot/SRR8668771_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668772/outputs/*mergeannot/SRR8668772_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668773/outputs/*mergeannot/SRR8668773_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668774/outputs/*mergeannot/SRR8668774_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668775/outputs/*mergeannot/SRR8668775_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668776/outputs/*mergeannot/SRR8668776_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668777/outputs/*mergeannot/SRR8668777_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668778/outputs/*mergeannot/SRR8668778_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668779/outputs/*mergeannot/SRR8668779_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668780/outputs/*mergeannot/SRR8668780_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668781/outputs/*mergeannot/SRR8668781_stripped.gbk.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668782/outputs/*mergeannot/SRR8668782_stripped.gbk.
## Starting assembly_cds_amino_acids.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*merge_cds_predictions/{meta[['sampleid']]}.faa.
## Example filename: preprocessing/SRR8668755/outputs/*merge_cds_predictions/SRR8668755.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668755/outputs/*merge_cds_predictions/SRR8668755.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668756/outputs/*merge_cds_predictions/SRR8668756.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668757/outputs/*merge_cds_predictions/SRR8668757.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668758/outputs/*merge_cds_predictions/SRR8668758.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668759/outputs/*merge_cds_predictions/SRR8668759.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668760/outputs/*merge_cds_predictions/SRR8668760.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668761/outputs/*merge_cds_predictions/SRR8668761.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668762/outputs/*merge_cds_predictions/SRR8668762.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668763/outputs/*merge_cds_predictions/SRR8668763.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668764/outputs/*merge_cds_predictions/SRR8668764.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668765/outputs/*merge_cds_predictions/SRR8668765.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668766/outputs/*merge_cds_predictions/SRR8668766.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668767/outputs/*merge_cds_predictions/SRR8668767.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668768/outputs/*merge_cds_predictions/SRR8668768.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668769/outputs/*merge_cds_predictions/SRR8668769.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668770/outputs/*merge_cds_predictions/SRR8668770.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668771/outputs/*merge_cds_predictions/SRR8668771.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668772/outputs/*merge_cds_predictions/SRR8668772.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668773/outputs/*merge_cds_predictions/SRR8668773.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668774/outputs/*merge_cds_predictions/SRR8668774.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668775/outputs/*merge_cds_predictions/SRR8668775.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668776/outputs/*merge_cds_predictions/SRR8668776.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668777/outputs/*merge_cds_predictions/SRR8668777.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668778/outputs/*merge_cds_predictions/SRR8668778.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668779/outputs/*merge_cds_predictions/SRR8668779.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668780/outputs/*merge_cds_predictions/SRR8668780.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668781/outputs/*merge_cds_predictions/SRR8668781.faa.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668782/outputs/*merge_cds_predictions/SRR8668782.faa.
## Starting assembly_cds_nucleotides.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*merge_cds_predictions/{meta[['sampleid']]}.ffn.
## Example filename: preprocessing/SRR8668755/outputs/*merge_cds_predictions/SRR8668755.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668755/outputs/*merge_cds_predictions/SRR8668755.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668756/outputs/*merge_cds_predictions/SRR8668756.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668757/outputs/*merge_cds_predictions/SRR8668757.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668758/outputs/*merge_cds_predictions/SRR8668758.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668759/outputs/*merge_cds_predictions/SRR8668759.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668760/outputs/*merge_cds_predictions/SRR8668760.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668761/outputs/*merge_cds_predictions/SRR8668761.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668762/outputs/*merge_cds_predictions/SRR8668762.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668763/outputs/*merge_cds_predictions/SRR8668763.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668764/outputs/*merge_cds_predictions/SRR8668764.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668765/outputs/*merge_cds_predictions/SRR8668765.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668766/outputs/*merge_cds_predictions/SRR8668766.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668767/outputs/*merge_cds_predictions/SRR8668767.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668768/outputs/*merge_cds_predictions/SRR8668768.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668769/outputs/*merge_cds_predictions/SRR8668769.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668770/outputs/*merge_cds_predictions/SRR8668770.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668771/outputs/*merge_cds_predictions/SRR8668771.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668772/outputs/*merge_cds_predictions/SRR8668772.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668773/outputs/*merge_cds_predictions/SRR8668773.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668774/outputs/*merge_cds_predictions/SRR8668774.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668775/outputs/*merge_cds_predictions/SRR8668775.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668776/outputs/*merge_cds_predictions/SRR8668776.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668777/outputs/*merge_cds_predictions/SRR8668777.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668778/outputs/*merge_cds_predictions/SRR8668778.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668779/outputs/*merge_cds_predictions/SRR8668779.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668780/outputs/*merge_cds_predictions/SRR8668780.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668781/outputs/*merge_cds_predictions/SRR8668781.ffn.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668782/outputs/*merge_cds_predictions/SRR8668782.ffn.
## Starting assembly_gff.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*merge_cds_predictions/{meta[['sampleid']]}.gff.
## Example filename: preprocessing/SRR8668755/outputs/*merge_cds_predictions/SRR8668755.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668755/outputs/*merge_cds_predictions/SRR8668755.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668756/outputs/*merge_cds_predictions/SRR8668756.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668757/outputs/*merge_cds_predictions/SRR8668757.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668758/outputs/*merge_cds_predictions/SRR8668758.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668759/outputs/*merge_cds_predictions/SRR8668759.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668760/outputs/*merge_cds_predictions/SRR8668760.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668761/outputs/*merge_cds_predictions/SRR8668761.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668762/outputs/*merge_cds_predictions/SRR8668762.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668763/outputs/*merge_cds_predictions/SRR8668763.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668764/outputs/*merge_cds_predictions/SRR8668764.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668765/outputs/*merge_cds_predictions/SRR8668765.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668766/outputs/*merge_cds_predictions/SRR8668766.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668767/outputs/*merge_cds_predictions/SRR8668767.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668768/outputs/*merge_cds_predictions/SRR8668768.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668769/outputs/*merge_cds_predictions/SRR8668769.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668770/outputs/*merge_cds_predictions/SRR8668770.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668771/outputs/*merge_cds_predictions/SRR8668771.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668772/outputs/*merge_cds_predictions/SRR8668772.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668773/outputs/*merge_cds_predictions/SRR8668773.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668774/outputs/*merge_cds_predictions/SRR8668774.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668775/outputs/*merge_cds_predictions/SRR8668775.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668776/outputs/*merge_cds_predictions/SRR8668776.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668777/outputs/*merge_cds_predictions/SRR8668777.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668778/outputs/*merge_cds_predictions/SRR8668778.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668779/outputs/*merge_cds_predictions/SRR8668779.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668780/outputs/*merge_cds_predictions/SRR8668780.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668781/outputs/*merge_cds_predictions/SRR8668781.gff.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668782/outputs/*merge_cds_predictions/SRR8668782.gff.
## Starting assembly_tsv.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*merge_cds_predictions/{meta[['sampleid']]}.tsv.
## Example filename: preprocessing/SRR8668755/outputs/*merge_cds_predictions/SRR8668755.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668755/outputs/*merge_cds_predictions/SRR8668755.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668756/outputs/*merge_cds_predictions/SRR8668756.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668757/outputs/*merge_cds_predictions/SRR8668757.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668758/outputs/*merge_cds_predictions/SRR8668758.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668759/outputs/*merge_cds_predictions/SRR8668759.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668760/outputs/*merge_cds_predictions/SRR8668760.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668761/outputs/*merge_cds_predictions/SRR8668761.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668762/outputs/*merge_cds_predictions/SRR8668762.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668763/outputs/*merge_cds_predictions/SRR8668763.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668764/outputs/*merge_cds_predictions/SRR8668764.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668765/outputs/*merge_cds_predictions/SRR8668765.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668766/outputs/*merge_cds_predictions/SRR8668766.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668767/outputs/*merge_cds_predictions/SRR8668767.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668768/outputs/*merge_cds_predictions/SRR8668768.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668769/outputs/*merge_cds_predictions/SRR8668769.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668770/outputs/*merge_cds_predictions/SRR8668770.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668771/outputs/*merge_cds_predictions/SRR8668771.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668772/outputs/*merge_cds_predictions/SRR8668772.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668773/outputs/*merge_cds_predictions/SRR8668773.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668774/outputs/*merge_cds_predictions/SRR8668774.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668775/outputs/*merge_cds_predictions/SRR8668775.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668776/outputs/*merge_cds_predictions/SRR8668776.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668777/outputs/*merge_cds_predictions/SRR8668777.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668778/outputs/*merge_cds_predictions/SRR8668778.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668779/outputs/*merge_cds_predictions/SRR8668779.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668780/outputs/*merge_cds_predictions/SRR8668780.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668781/outputs/*merge_cds_predictions/SRR8668781.tsv.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668782/outputs/*merge_cds_predictions/SRR8668782.tsv.
## Starting assembly_xls.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*mergeannot/{meta[['sampleid']]}.xlsx.
## Example filename: preprocessing/SRR8668755/outputs/*mergeannot/SRR8668755.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668755/outputs/*mergeannot/SRR8668755.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668756/outputs/*mergeannot/SRR8668756.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668757/outputs/*mergeannot/SRR8668757.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668758/outputs/*mergeannot/SRR8668758.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668759/outputs/*mergeannot/SRR8668759.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668760/outputs/*mergeannot/SRR8668760.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668761/outputs/*mergeannot/SRR8668761.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668762/outputs/*mergeannot/SRR8668762.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668763/outputs/*mergeannot/SRR8668763.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668764/outputs/*mergeannot/SRR8668764.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668765/outputs/*mergeannot/SRR8668765.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668766/outputs/*mergeannot/SRR8668766.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668767/outputs/*mergeannot/SRR8668767.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668768/outputs/*mergeannot/SRR8668768.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668769/outputs/*mergeannot/SRR8668769.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668770/outputs/*mergeannot/SRR8668770.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668771/outputs/*mergeannot/SRR8668771.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668772/outputs/*mergeannot/SRR8668772.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668773/outputs/*mergeannot/SRR8668773.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668774/outputs/*mergeannot/SRR8668774.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668775/outputs/*mergeannot/SRR8668775.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668776/outputs/*mergeannot/SRR8668776.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668777/outputs/*mergeannot/SRR8668777.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668778/outputs/*mergeannot/SRR8668778.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668779/outputs/*mergeannot/SRR8668779.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668780/outputs/*mergeannot/SRR8668780.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668781/outputs/*mergeannot/SRR8668781.xlsx.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668782/outputs/*mergeannot/SRR8668782.xlsx.
## Starting input_r1.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/scripts/*trim_*.sh.
## Example filename: preprocessing/SRR8668755/scripts/*trim_*.sh.
## Starting input_r2.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/scripts/*trim_*.sh.
## Example filename: preprocessing/SRR8668755/scripts/*trim_*.sh.
## Starting trimomatic_input.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*trimomatic/*-trimomatic.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*trimomatic/*-trimomatic.stderr.
## Starting trimomatic_output.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*trimomatic/*-trimomatic.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*trimomatic/*-trimomatic.stderr.
## Starting trimomatic_ratio.
## Checking input_file_spec: .
## The numerator column is: trimomatic_output.
## The denominator column is: trimomatic_input.
## Starting host_filter_species.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/host_species.txt.
## Example filename: preprocessing/SRR8668755/host_species.txt.
## Starting hisat_genome_single_concordant.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*/hisat2_*.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*/hisat2_*.stderr.
## Starting hisat_genome_multi_concordant.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*/hisat2_*.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*/hisat2_*.stderr.
## Starting hisat_genome_single_all.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*/hisat2_*.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*/hisat2_*.stderr.
## Starting hisat_genome_multi_all.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*/hisat2_*.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*/hisat2_*.stderr.
## Starting hisat_count_table.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*hisat2_{species}/{species}_{type}*.count.xz.
## Example filename: preprocessing/SRR8668755/outputs/*hisat2_*/*_genome*.count.xz.
## Starting jellyfish_count_table.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*jellyfish_*/*_matrix.csv.xz.
## Example filename: preprocessing/SRR8668755/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668755/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668756/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668757/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668758/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668759/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668760/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668761/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668762/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668763/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668764/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668765/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668766/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668767/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668768/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668769/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668770/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668771/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668772/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668773/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668774/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668775/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668776/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668777/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668778/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668779/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668780/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668781/outputs/*jellyfish_*/*_matrix.csv.xz.
## Warning in dispatch_filename_search(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668782/outputs/*jellyfish_*/*_matrix.csv.xz.
## Starting jellyfish_observed.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*jellyfish_*/*_matrix.csv.xz.
## Example filename: preprocessing/SRR8668755/outputs/*jellyfish_*/*_matrix.csv.xz.
## Starting kraken_viral_classified.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*kraken_viral*/kraken.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*kraken_viral*/kraken.stderr.
## Starting kraken_viral_unclassified.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*kraken_viral*/kraken.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*kraken_viral*/kraken.stderr.
## Starting kraken_first_viral_species.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*kraken_viral*/kraken_report.txt.
## Example filename: preprocessing/SRR8668755/outputs/*kraken_viral*/kraken_report.txt.
## Starting kraken_first_viral_species_reads.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*kraken_viral*/kraken_report.txt.
## Example filename: preprocessing/SRR8668755/outputs/*kraken_viral*/kraken_report.txt.
## Starting kraken_standard_classified.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*kraken_standard*/kraken.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*kraken_standard*/kraken.stderr.
## Starting kraken_standard_unclassified.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*kraken_standard*/kraken.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*kraken_standard*/kraken.stderr.
## Starting kraken_first_standard_species.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*kraken_standard*/kraken_report.txt.
## Example filename: preprocessing/SRR8668755/outputs/*kraken_standard*/kraken_report.txt.
## Starting kraken_first_standard_species_reads.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*kraken_standard*/kraken_report.txt.
## Example filename: preprocessing/SRR8668755/outputs/*kraken_standard*/kraken_report.txt.
## Starting possible_host_species.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*filter_kraken_host/*.log.
## Example filename: preprocessing/SRR8668755/outputs/*filter_kraken_host/*.log.
## Starting pernt_mean_coverage.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/??assembly_coverage_*/base_coverage.tsv.
## Starting pernt_median_coverage.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/??assembly_coverage_*/base_coverage.tsv.
## Starting pernt_min_coverage.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/??assembly_coverage_*/base_coverage.tsv.
## Starting pernt_max_coverage.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/??assembly_coverage_*/base_coverage.tsv.
## Starting salmon_mapped.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*salmon_*/salmon.stderr.
## Example filename: preprocessing/SRR8668755/outputs/*salmon_*/salmon.stderr.
## Starting shovill_contigs.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*shovill_*/shovill.log.
## Example filename: preprocessing/SRR8668755/outputs/*shovill_*/shovill.log.
## Starting shovill_length.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*shovill_*/shovill.log.
## Example filename: preprocessing/SRR8668755/outputs/*shovill_*/shovill.log.
## Starting shovill_estlength.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*shovill_*/shovill.log.
## Example filename: preprocessing/SRR8668755/outputs/*shovill_*/shovill.log.
## Starting shovill_minlength.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*shovill_*/shovill.log.
## Example filename: preprocessing/SRR8668755/outputs/*shovill_*/shovill.log.
## Starting unicycler_lengths.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*unicycler/*final_assembly.fasta.
## Example filename: preprocessing/SRR8668755/outputs/*unicycler/*final_assembly.fasta.
## Starting unicycler_relative_coverage.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*unicycler/*final_assembly.fasta.
## Example filename: preprocessing/SRR8668755/outputs/*unicycler/*final_assembly.fasta.
## Starting filtered_relative_coverage.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/??filter_depth/final_assembly.fasta.
## Example filename: preprocessing/SRR8668755/outputs/??filter_depth/final_assembly.fasta.
## Starting phastaf_num_hits.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*phastaf_*/phage.bed.
## Example filename: preprocessing/SRR8668755/outputs/*phastaf_*/phage.bed.
## Starting phageterm_dtr_length.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Example filename: preprocessing/SRR8668755/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668755/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668756/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668757/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668758/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668759/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668760/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668761/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668762/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668763/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668764/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668765/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668766/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668767/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668768/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668769/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668770/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668771/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668772/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668773/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668774/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668775/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668776/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668777/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668778/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668779/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668780/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668781/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Warning in dispatch_fasta_lengths(meta, input_file_spec, verbose = verbose, : The input file is NA for:
## preprocessing/SRR8668782/outputs/*phageterm_*/phageterm_final_dtr.fasta.
## Starting prodigal_positive_strand.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*prodigal_*/predicted_cds.gff.
## Example filename: preprocessing/SRR8668755/outputs/*prodigal_*/predicted_cds.gff.
## Starting prodigal_negative_strand.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*prodigal_*/predicted_cds.gff.
## Example filename: preprocessing/SRR8668755/outputs/*prodigal_*/predicted_cds.gff.
## Starting glimmer_positive_strand.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*glimmer/glimmer3.predict.
## Example filename: preprocessing/SRR8668755/outputs/*glimmer/glimmer3.predict.
## Starting glimmer_negative_strand.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*glimmer/glimmer3.predict.
## Example filename: preprocessing/SRR8668755/outputs/*glimmer/glimmer3.predict.
## Starting phanotate_positive_strand.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*phanotate/*_phanotate.tsv.xz.
## Example filename: preprocessing/SRR8668755/outputs/*phanotate/*_phanotate.tsv.xz.
## Starting phanotate_negative_strand.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*phanotate/*_phanotate.tsv.xz.
## Example filename: preprocessing/SRR8668755/outputs/*phanotate/*_phanotate.tsv.xz.
## Starting final_gc_content.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*prokka/{meta[['sampleid']]}.fna.
## Example filename: preprocessing/SRR8668755/outputs/*prokka/SRR8668755.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668755/outputs/*prokka/SRR8668755.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668756/outputs/*prokka/SRR8668756.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668757/outputs/*prokka/SRR8668757.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668758/outputs/*prokka/SRR8668758.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668759/outputs/*prokka/SRR8668759.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668760/outputs/*prokka/SRR8668760.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668761/outputs/*prokka/SRR8668761.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668762/outputs/*prokka/SRR8668762.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668763/outputs/*prokka/SRR8668763.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668764/outputs/*prokka/SRR8668764.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668765/outputs/*prokka/SRR8668765.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668766/outputs/*prokka/SRR8668766.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668767/outputs/*prokka/SRR8668767.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668768/outputs/*prokka/SRR8668768.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668769/outputs/*prokka/SRR8668769.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668770/outputs/*prokka/SRR8668770.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668771/outputs/*prokka/SRR8668771.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668772/outputs/*prokka/SRR8668772.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668773/outputs/*prokka/SRR8668773.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668774/outputs/*prokka/SRR8668774.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668775/outputs/*prokka/SRR8668775.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668776/outputs/*prokka/SRR8668776.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668777/outputs/*prokka/SRR8668777.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668778/outputs/*prokka/SRR8668778.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668779/outputs/*prokka/SRR8668779.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668780/outputs/*prokka/SRR8668780.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668781/outputs/*prokka/SRR8668781.fna.
## Warning in dispatch_gc(meta, input_file_spec, basedir = basedir, verbose = verbose): The input file is NA for:
## preprocessing/SRR8668782/outputs/*prokka/SRR8668782.fna.
## Starting interpro_signalp_hits.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*interproscan_*/{meta[['sampleid']]}.faa.tsv.
## Example filename: preprocessing/SRR8668755/outputs/*interproscan_*/SRR8668755.faa.tsv.
## Starting interpro_phobius_hits.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*interproscan_*/{meta[['sampleid']]}.faa.tsv.
## Example filename: preprocessing/SRR8668755/outputs/*interproscan_*/SRR8668755.faa.tsv.
## Starting interpro_pfam_hits.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*interproscan_*/{meta[['sampleid']]}.faa.tsv.
## Example filename: preprocessing/SRR8668755/outputs/*interproscan_*/SRR8668755.faa.tsv.
## Starting interpro_tmhmm_hits.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*interproscan_*/{meta[['sampleid']]}.faa.tsv.
## Example filename: preprocessing/SRR8668755/outputs/*interproscan_*/SRR8668755.faa.tsv.
## Starting interpro_cdd_hits.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*interproscan_*/{meta[['sampleid']]}.faa.tsv.
## Example filename: preprocessing/SRR8668755/outputs/*interproscan_*/SRR8668755.faa.tsv.
## Starting interpro_smart_hits.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*interproscan_*/{meta[['sampleid']]}.faa.tsv.
## Example filename: preprocessing/SRR8668755/outputs/*interproscan_*/SRR8668755.faa.tsv.
## Starting interpro_gene3d_hits.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*interproscan_*/{meta[['sampleid']]}.faa.tsv.
## Example filename: preprocessing/SRR8668755/outputs/*interproscan_*/SRR8668755.faa.tsv.
## Starting interpro_superfamily_hits.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*interproscan_*/{meta[['sampleid']]}.faa.tsv.
## Example filename: preprocessing/SRR8668755/outputs/*interproscan_*/SRR8668755.faa.tsv.
## Starting tRNA_hits.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*prokka_*/{meta[['sampleid']]}.log.
## Example filename: preprocessing/SRR8668755/outputs/*prokka_*/SRR8668755.log.
## Starting aragorn_tRNAs.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*aragorn/aragorn.txt.
## Example filename: preprocessing/SRR8668755/outputs/*aragorn/aragorn.txt.
## Starting ictv_taxonomy.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*classify_*/*_filtered.tsv.
## Starting ictv_accession.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*classify_*/*_filtered.tsv.
## Starting ictv_genus.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/outputs/*classify_*/*_filtered.tsv.
## Starting notes.
## Checking input_file_spec: {basedir}/{meta[['sampleid']]}/notes.txt.
## Example filename: preprocessing/SRR8668755/notes.txt.
## Writing new metadata to: sample_sheets/scott_sra_samples_modified.xlsx
## Deleting the file sample_sheets/scott_sra_samples_modified.xlsx before writing the tables.
tmrc3_external_cf <- create_expt("sample_sheets/scott_sra_samples_modified.xlsx",
                           gene_info = hs_annot, file_column = "hisatcounttable") %>%
  set_expt_conditions(fact = "treatmentoutcome") %>%
  set_expt_batches(fact = "sex")
## Reading the sample metadata.
## Did not find the condition column in the sample sheet.
## Filling it in as undefined.
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## The sample definitions comprises: 28 rows(samples) and 93 columns(metadata fields).
## Matched 21447 annotations and counts.
## Bringing together the count matrix and gene information.
## Some annotations were lost in merging, setting them to 'undefined'.
## Saving the expressionset to 'expt.rda'.
## The final expressionset has 21481 features and 28 samples.
## 
##    cure failure      na 
##      14       7       7 
## 
## female   male     na 
##      4     17      7
save(list = "tmrc3_external_cf", file = glue("rda/tmrc3_external_cf-v{ver}.rda"))
data_structures <- c(data_structures, "tmrc3_external_cf")
tmp <- loadme(filename = savefile)
LS0tCnRpdGxlOiAiVE1SQzMgMjAyMzA0OiBDcmVhdGluZyBEYXRhIFN0cnVjdHVyZXMiCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKIGh0bWxfZG9jdW1lbnQ6CiAgY29kZV9kb3dubG9hZDogdHJ1ZQogIGNvZGVfZm9sZGluZzogc2hvdwogIGZpZ19jYXB0aW9uOiB0cnVlCiAgZmlnX2hlaWdodDogNwogIGZpZ193aWR0aDogNwogIGhpZ2hsaWdodDogZGVmYXVsdAogIGtlZXBfbWQ6IGZhbHNlCiAgbW9kZTogc2VsZmNvbnRhaW5lZAogIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgdGhlbWU6IHJlYWRhYmxlCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OgogICBjb2xsYXBzZWQ6IGZhbHNlCiAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4OwogIH0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoaHBnbHRvb2xzKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkoZ2x1ZSkKbGlicmFyeShFdVBhdGhEQikKCnR0IDwtIHNtKGRldnRvb2xzOjpsb2FkX2FsbCgifi9ocGdsdG9vbHMiKSkKa25pdHI6Om9wdHNfa25pdCRzZXQoCiAgcHJvZ3Jlc3MgPSBUUlVFLCB2ZXJib3NlID0gVFJVRSwgd2lkdGggPSA5MCwgZWNobyA9IFRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlcnJvciA9IFRSVUUsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA4LCBkcGkgPSA5NikKb2xkX29wdGlvbnMgPC0gb3B0aW9ucygKICBkaWdpdHMgPSA0LCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbCA9ICJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemUgPSAxMikpCnZlciA8LSAiMjAyMzA0IgpwcmV2aW91c19maWxlIDwtICIiCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdCA9ICIlWSVtJWQiKQoKIyN0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1nc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IlxcLnJkYVxcLnh6IiwgeD1wcmV2aW91c19maWxlKSkpKQpybWRfZmlsZSA8LSBnbHVlKCJ0bXJjM19kYXRhc2V0c197dmVyfS5SbWQiKQpzYXZlZmlsZSA8LSBnc3ViKHBhdHRlcm4gPSAiXFwuUm1kIiwgcmVwbGFjZSA9ICJcXC5yZGFcXC54eiIsIHggPSBybWRfZmlsZSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoKQpgYGAKCiMgQ2hhbmdlbG9nCgoqIDIwMjMwNDogQWRkZWQgYSBzZXJpZXMgb2Ygc3RhbnphcyBwcmludGluZyBvdXQgdGhlIENhbGktb25seSBkYXRhLgoqIFVwZGF0ZWQgaW5wdXQgbWV0YWRhdGEgc2hlZXRzCgojIE5vdGVzOgoKKiBJbnRlcmZlcm9uIHNjb3JlIGZvciBzZXZlcml0eS4gIEEgZmV3IGRpZmZlcmVudCBzZXRzIGFyZSBhdmFpbGFibGUsCiAgbWF5IG5lZWQgdG8gY2hvb3NlIGEgc3BlY2lmaWMgcGFwZXIsIHRoZW4gbW9kaWZ5IGl0PwoKIyBJbnRyb2R1Y3Rpb24KCldlIGFyZSBzcGxpdHRpbmcgdGhlIGNyZWF0aW9uIG9mIHRoZSB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcyBhbmQgdGhlaXIKYW5hbHlzaXMgaW50byBzZXBhcmF0ZSBkb2N1bWVudHMuCgojIyBNZXRhZGF0YSBTb3VyY2VzCgpDdXJyZW50bHkgd2UgdXNlIHRoZSBzYW1wbGUgbWV0YWRhdGEgYW5kIHRoZSBDUkYgZGF0YSBmcm9tIHRoZSBjbGluaWMuCgpgYGB7ciBtZXRhZGF0YV9zb3VyY2VzfQojIyBzYW1wbGVzaGVldCA8LSAic2FtcGxlX3NoZWV0cy90bXJjM19zYW1wbGVzXzIwMjIwNjE1Lnhsc3giCiMjIFJlZHVuZGFudCBzYW1wbGUgc2hlZXQgZW50cmllcyBzbyB3ZSBjYW4gdGVzdCBpZiBzb21ldGhpbmcgY2hhbmdlZCBpbiBKdW5lCnNhbXBsZXNoZWV0IDwtICJzYW1wbGVfc2hlZXRzL3RtcmMzX3NhbXBsZXNfMjAyMjEyMDgueGxzeCIKY3JmX21ldGFkYXRhIDwtICJzYW1wbGVfc2hlZXRzLzIwMjIwNTA5X0VYUF9FU1BFQ0lBTF9UTVJDM19WMi54bHN4Igpoc2xwX3NhbXBsZXNoZWV0IDwtICJzYW1wbGVfc2hlZXRzL3RtcmMzX3NhbXBsZXNfMjAyMzAzMDFfcHJ1bmVkLnhsc3giCmBgYAoKIyBBbm5vdGF0aW9uIENvbGxlY3Rpb24KClRoZSBwcmltYXJ5IGFubm90YXRpb24gc291cmNlcyBhcmU6CgoxLiAgRW5zZW1ibCdzIGJpb21hcnQgYXJjaGl2ZSBmcm9tIDIwMjAgZm9yIGh1bWFuIGFubm90YXRpb25zLgoyLiAgVGhlIFRyaVRyeXBEQiByZWxlYXNlIDM2IGZvciBwYXJhc2l0ZSBhbm5vdGF0aW9ucy4KCkJvdGggcHJvdmlkZSBHTyBkYXRhLiAgVGhleSBhbHNvIHByb3ZpZGUgaGVscGZ1bCBsaW5rcyB0byBvdGhlciBkYXRhCnNvdXJjZXMuICBGb3IgdGhlIG1vbWVudCwgd2UgYXJlIGZvY3VzaW5nIG9uIHRoZSBodW1hbiBhbm5vdGF0aW9ucy4KCiMjIEdlbmUgYW5ub3RhdGlvbnMKClRoZXNlIGFuYWx5c2VzIGhhdmUgZm9jdXNlZCBvbiBnZW5lLWxldmVsIGFidW5kYW5jZXMvZGlmZmVyZW5jZXMuClRodXMsIHdoZW4gaHRzZXEtY291bnQgd2FzIGludm9rZWQgYWdhaW5zdCB0aGUgaGlzYXQyLWJhc2VkIG1hcHBpbmdzLApwYXJhbWV0ZXJzIHdlcmUgY2hvc2VuIHRvIGNvdW50IGdlbmVzIHJhdGhlciB0aGFuIHRyYW5zY3JpcHRzLiAgSW4gdGhpcwpjb250ZXh0LCBhIGdlbmUgcmVmZXJzIHRvIHRoZSBub24tcmVkdW5kYW50IHVuaW9uIG9mIHRoZSB0cmFuc2NyaXB0cycgZXhvbnMuClNpbWlsYXJseSwgd2hlbiBzYWxtb24gY291bnRzIHdlcmUgdXNlZCB2aWEgdHhpbXBvcnQsIGEgbWFwcGluZyBvZgpnZW5lcyB0byB0cmFuc2NyaXB0cyB3YXMgdXNlZCB0byBjb2xsYXBzZSB0aGUgbWF0cml4IHRvIGdlbmUtbGV2ZWwKYWJ1bmRhbmNlcy4gIFRoaXMgZGVjaXNpb24gbWF5IGJlIHJldmlzaXRlZC4KCmBgYHtyIGNvbGxlY3RfYW5ub3RhdGlvbnN9CmhzX2Fubm90IDwtIGxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucyh5ZWFyID0gIjIwMjAiLCBtb250aCA9ICJqYW4iKQpoc19hbm5vdCA8LSBoc19hbm5vdFtbImFubm90YXRpb24iXV0KIyMgVGhlIG5leHQgdHdvIGxpbmVzIG1ha2UgYSBicmlkZ2UgYmV0d2VlbiB0aGUgZ2ZmIGZpbGUgdXNlZCBieSBoaXNhdDIKIyMgYW5kIHRoZSBnZW5lIElEcy4KaHNfYW5ub3RbWyJ0cmFuc2NyaXB0Il1dIDwtIHBhc3RlMChyb3duYW1lcyhoc19hbm5vdCksICIuIiwgaHNfYW5ub3RbWyJ2ZXJzaW9uIl1dKQpoc19hbm5vdCA8LSBncm91cF9tZWFuX2Nkc19sZW5ndGgoaHNfYW5ub3QpCmhzX3R4X2Fubm90IDwtIGhzX2Fubm90ICMjIE1ha2UgYSBjb3B5IHNvIEkgZG9uJ3QgbG9zZSB0cmFuc2NyaXB0IElEcyBmb3Igc2FsbW9uCnJvd25hbWVzKGhzX2Fubm90KSA8LSBtYWtlLm5hbWVzKGhzX2Fubm90W1siZW5zZW1ibF9nZW5lX2lkIl1dLCB1bmlxdWUgPSBUUlVFKQpub3RfdW5pcXVlX2lkeCA8LSBncmVwbCh4ID0gcm93bmFtZXMoaHNfYW5ub3QpLCBwYXR0ZXJuID0gIlxcLlxcZCskIikKaHNfYW5ub3QgPC0gaHNfYW5ub3RbIW5vdF91bmlxdWVfaWR4LCBdCmBgYAoKIyMjIEFsc28gY29sbGVjdCBwYXJhc2l0ZSBhbm5vdGF0aW9ucwoKR2l2ZW4gdGhhdCBJIHJlY2VudGx5IGluY2x1ZGVkIHRoZSBwYXJhc2l0ZSB0cmFuc2NyaXB0cyB0byB0aGUgZGF0YSwgSQpzaG91bGQgYWxzbyBzcGVuZCBhIG1vbWVudCBhbmQgZmlndXJlIG91dCBob3cgdG8gaW5jbHVkZSB0aGUKYW5ub3RhdGlvbnMuCgpBcyBhIHN0YXJ0aW5nIHBvaW50LCBJIHdpbGwganVzdCBncmFiIHRoZSBFdVBhdGhEQiBwYW5hbWVuc2lzCmFubm90YXRpb25zLiAgSSB0aGluayBJIHdpbGwgbmVlZCB0byBsaW1pdCB0aGVtIHRvIGp1c3QgdGhlIHNoYXJlZApjb2x1bW5zIGFuZCBkcm9wIHRoZSByZXN0LgoKYGBge3IgaHNscF9hbm5vdH0Kb3JnZGIgPC0gIm9yZy5McGFuYW1lbnNpcy5NSE9NQ09MODFMMTMudjQ2LmVnLmRiIgp0dCA8LSBzbShsaWJyYXJ5KG9yZ2RiLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpKQpwYW5fZGIgPC0gb3JnLkxwYW5hbWVuc2lzLk1IT01DT0w4MUwxMy52NDYuZWcuZGIKYWxsX2ZpZWxkcyA8LSBjb2x1bW5zKHBhbl9kYikKYWxsX2xwX2Fubm90IDwtIGxvYWRfb3JnZGJfYW5ub3RhdGlvbnMoCiAgICBwYW5fZGIsCiAgICBrZXl0eXBlID0gImdpZCIsCiAgICBmaWVsZHMgPSBjKCJhbm5vdF9nZW5lX2VudHJlel9pZCIsICJhbm5vdF9nZW5lX25hbWUiLAogICAgICAgICAgICAgICAiYW5ub3Rfc3RyYW5kIiwgImFubm90X2dlbmVfbG9jYXRpb25fdGV4dCIsICJhbm5vdF9jaHJvbW9zb21lIiwKICAgICAgICAgICAgICAgImFubm90X2Nkc19sZW5ndGgiLAogICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV9wcm9kdWN0IikpJGdlbmVzCmFsbF9scF9hbm5vdFtbImVuZCJdXSA8LSAiIgphbGxfbHBfYW5ub3RbWyJtZWFuX2Nkc19sZW4iXV0gPC0gYWxsX2xwX2Fubm90W1siYW5ub3RfY2RzX2xlbmd0aCJdXQphbGxfbHBfYW5ub3RbWyJ2ZXJzaW9uIl1dIDwtIDEKYWxsX2xwX2Fubm90W1sidHJhbnNjcmlwdF92ZXJzaW9uIl1dIDwtIDEKYWxsX2xwX2Fubm90W1siaGduY19zeW1ib2wiXV0gPC0gIiIKYWxsX2xwX2Fubm90W1sidHJhbnNjcmlwdCJdXSA8LSBhbGxfbHBfYW5ub3RbWyJnaWQiXV0KYWxsX2xwX2Fubm90W1siZW5zZW1ibF90cmFuc2NyaXB0X2lkIl1dIDwtIGFsbF9scF9hbm5vdFtbImdpZCJdXQoKd2FudGVkX2NvbHVtbnMgPC0gYygiZ2lkIiwgImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsICJ2ZXJzaW9uIiwKICAgICAgICAgICAgICAgICAgICAidHJhbnNjcmlwdF92ZXJzaW9uIiwgImhnbmNfc3ltYm9sIiwgImFubm90X2dlbmVfcHJvZHVjdCIsCiAgICAgICAgICAgICAgICAgICAgImdlbmVfdHlwZSIsICJhbm5vdF9jZHNfbGVuZ3RoIiwgImFubm90X2Nocm9tb3NvbWUiLCAiYW5ub3Rfc3RyYW5kIiwKICAgICAgICAgICAgICAgICAgICAiYW5ub3RfZ2VuZV9sb2NhdGlvbl90ZXh0IiwgImVuZCIsICJ0cmFuc2NyaXB0IiwgIm1lYW5fY2RzX2xlbiIpCmFsbF9scF9hbm5vdCA8LSBhbGxfbHBfYW5ub3RbLCB3YW50ZWRfY29sdW1uc10KY29sbmFtZXMoYWxsX2xwX2Fubm90KSA8LSBjb2xuYW1lcyhoc190eF9hbm5vdCkKCmhzbHBfYW5ub3QgPC0gcmJpbmQoaHNfdHhfYW5ub3QsIGFsbF9scF9hbm5vdCkKYGBgCgojIyMgU2V0IHVwIGdlbmUtPnRyYW5zY3JpcHQgbWFwcGluZ3MKCmBgYHtyIGdlbmVfdHhfbWFwcGluZ30KIyMgVGhlIHR4X2dlbmVfbWFwIGlzIHVzZWQgZm9yIHR4aW1wb3J0IGFuZCBzYWxtb24gcXVhbnRpZmljYXRpb25zLgpoc19hbm5vdFtbInRyYW5zY3JpcHQiXV0gPC0gcGFzdGUwKHJvd25hbWVzKGhzX2Fubm90KSwgIi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzX2Fubm90W1sidHJhbnNjcmlwdF92ZXJzaW9uIl1dKQpyb3duYW1lcyhoc19hbm5vdCkgPC0gbWFrZS5uYW1lcyhoc19hbm5vdFtbImVuc2VtYmxfZ2VuZV9pZCJdXSwgdW5pcXVlID0gVFJVRSkKaHNfdHhfZ2VuZV9tYXAgPC0gaHNfYW5ub3RbLCBjKCJ0cmFuc2NyaXB0IiwgImVuc2VtYmxfZ2VuZV9pZCIpXQpgYGAKCiMjIEdlbmUgb250b2xvZ3kgZGF0YQoKVGhlIHNldCBvZiBHTyBjYXRlZ29yaWVzIGhhcyBub3QgYmVlbiBsaW1pdGVkIHRvIHRoZSAyMDIwIGRhdGEgYXQgdGhlCnRpbWUgb2YgdGhpcyB3cml0aW5nLiAgVGhlIEdPIGNhdGVnb3JpZXMgaXMgY29sbGVjdGVkIGFsb25nIHdpdGgKbGVuZ3RocyBmb3IgZ29zZXEuICBUaGUgb3RoZXIgbWV0aG9kcyBlaXRoZXIgaGF2ZSBidWlsdC1pbiBkYXRhYmFzZXMKb2YgaHVtYW4gZGF0YSAoZ1Byb2ZpbGVyKSBvciBzdXBwb3J0IG9yZ0RCIGRhdGEgKG9yZy5Icy5lZy5kYikKKGNsdXN0ZXJQcm9maWxlci90b3BHTy9nb3N0YXRzKS4KCmBgYHtyIGhzX2dvfQpoc19nbyA8LSBsb2FkX2Jpb21hcnRfZ28oKVtbImdvIl1dCmhzX2xlbmd0aCA8LSBoc19hbm5vdFssIGMoImVuc2VtYmxfZ2VuZV9pZCIsICJjZHNfbGVuZ3RoIildCmNvbG5hbWVzKGhzX2xlbmd0aCkgPC0gYygiSUQiLCAibGVuZ3RoIikKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiaHNfbGVuZ3RoIiwgImhzX2dvIiwgImhzX2Fubm90IikKYGBgCgojIERhdGFzZXQ6IENyZWF0ZSB0aGUgcGFyZW50IGRhdGEgc3RydWN0dXJlIG9mIGFsbCBzYW1wbGVzCgpCZWZvcmUgd2UgZG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgc3Vic2V0cy9hbmFseXNlcyBvZiB0aGUgZGF0YSwgd2UKbmVlZCB0byBjb2xsZWN0IGl0IGFsbCBpbiBvbmUgcGxhY2UuICBMZXQncyBkbyB0aGF0IGhlcmUgYW5kIG5hbWUgaXQKJ2hzX2V4cHQnLCBpdCB3aWxsIGNvbXByaXNlIHRoZSBmdWxsIHNldCBvZiBodW1hbiBkYXRhLiAgV2hlbiB3ZSBjdWxsCnNvbWUgc2FtcGxlcyBpdCB3aWxsIGJlIHJlbmFtZWQgdG8gJ2hzX3ZhbGlkJy4KClRoZSB2YXJpYWJsZSAnZGF0YV9zdHJ1Y3R1cmVzJyB3aWxsIGNvbnRhaW4gdGhlIG5hbWVzIG9mIGV2ZXJ5CnZhcmlhYmxlIEkgY3JlYXRlIGluIHRoaXMgZG9jdW1lbnQgd2hpY2ggSSB3aXNoIHRvIHNhdmUgdG8gZGlzay4KClNpbWlsYXJseSwgdGhlIGNoYXJhY3RlciB2ZWN0b3IgJ3Nhbml0aXplX2NvbHVtbnMnIGlzIHRoZSBsaXN0IG9mCm1ldGFkYXRhIGNvbHVtbnMgb3ZlciB3aGljaCBJIHdpbGwgaXRlcmF0ZSBhbmQgc2FuaXRpemUgdGhlIGRhdGEsCnJlbW92aW5nIGFueSBzcHVyaW91cyBzcGFjZXMsIGNhcGl0YWxpemF0aW9uLCBldGMuCgpgYGB7ciBhbGxfZGF0YX0Kc2FuaXRpemVfY29sdW1ucyA8LSBjKCJ2aXNpdG51bWJlciIsICJmaW5hbG91dGNvbWUiLCAiZG9ub3IiLAogICAgICAgICAgICAgICAgICAgICAgInR5cGVvZmNlbGxzIiwgImNsaW5pY2FscHJlc2VudGF0aW9uIiwgImRydWciLAogICAgICAgICAgICAgICAgICAgICAgImNvbmRpdGlvbiIsICJiYXRjaCIpCmhzX2V4cHQgPC0gY3JlYXRlX2V4cHQoc2FtcGxlc2hlZXQsCiAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9jb2x1bW4gPSAiaGczODEwMGhpc2F0ZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfaHNfZXhwdF9hbGxfcmF3LXZ7dmVyfS5yZGEiKSwKICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm8gPSBoc19hbm5vdCkgJT4lCiAgc3Vic2V0X2dlbmVzKGNvbHVtbiA9ICJnZW5lX2Jpb3R5cGUiLCBtZXRob2QgPSAia2VlcCIsCiAgICAgICAgICAgICAgIHBhdHRlcm4gPSAicHJvdGVpbl9jb2RpbmciLCBtZXRhX2NvbHVtbiA9ICJuY3JuYV9sb3N0IikgJT4lCiAgc2FuaXRpemVfZXhwdF9tZXRhZGF0YShjb2x1bW5zID0gc2FuaXRpemVfY29sdW1ucykgJT4lCiAgc2V0X2V4cHRfZmFjdG9ycyhjb2x1bW5zID0gc2FuaXRpemVfY29sdW1ucywgY2xhc3MgPSAiZmFjdG9yIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ0eXBlb2ZjZWxscyE9J3BibWNzJyIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJ0eXBlb2ZjZWxscyE9J21hY3JvcGhhZ2VzJyIpICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWNhbHByZXNlbnRhdGlvbiE9J2gnIikKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiaHNfZXhwdCIpCgojIyBUaGUgZm9sbG93aW5nIHNob3VsZCBtYWtlIHZpc2l0IDEgdGhlIGxhcmdlc3QgaWYgb25lIHVzZXMgdGhhdCBjb2x1bW4gYXMgYSBzaXplIGZhY3RvciB3aGVuIHBsb3R0aW5nLgptZXRhIDwtIHBEYXRhKGhzX2V4cHQpICU+JQogIG11dGF0ZSh2aXNpdG51bWJlciA9IGZjdF9yZWxldmVsKHZpc2l0bnVtYmVyLCBjKCIzIiwgIjIiLCAiMSIpKSkKcERhdGEoaHNfZXhwdCkgPC0gbWV0YQpzYXZlKGxpc3QgPSAiaHNfZXhwdCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfaHNfZXhwdF9hbGxfc2FuaXRpemVkLXZ7dmVyfS5yZGEiKSkKYGBgCgojIFJlcGVhdCwgYnV0IHdpdGggY29tYmluZWQgaG9zdCBhbmQgcGFyYXNpdGUgZGF0YQoKSSByZWNlbnRseSByZS1xdWFudGlmaWVkIHRoZSBkYXRhIHVzaW5nIHNhbG1vbiBhbmQgYSB0cmFuc2NyaXB0CmRhdGFiYXNlIGNvbXByaXNlZCBvZiBib3RoIGh1bWFuIGFuZCBwYXJhc2l0ZSBzZXF1ZW5jZXMuICBJIHdvdWxkIGxpa2UKdG8gbG9vayBhdCB0aGlzIGFuZCBzZWUgaWYgaXQgY2FuIGFpZCB1cyBpbiB1bmRlcnN0YW5kaW5nIHNvbWUKY2xhc3NpZmljYXRpb24gcXVlc3Rpb25zLgoKTm90ZSB0aGF0IHdpdGhvdXQgc29tZSBjaGFuZ2VzIHRvIHRoZSBhbm5vdGF0aW9ucyBJIGNhbm5vdCBleGNsdWRlIHRoZQpmZWF0dXJlcyB3aGljaCBhcmUgbm90IG9mIHR5cGUgJ3Byb3RlaW5fY29kaW5nJyBiZWNhdXNlIHRoYXQgd291bGQKcmVtb3ZlIGFsbCB0aGUgcGFuYW1lbnNpcyBhbm5vdGF0aW9ucyAtLSB0aG91Z2ggSSBjb3VsZCBqdXN0IGNoYW5nZQp0aGVtIGFib3ZlLgoKR2l2ZW4gdGhhdCBtYWtpbmcgdGhlIGNvcnJlY3QgZ2VuZS0+dHggbWFwIGlzIGNvbmZ1c2luZywgYW5kIG1hZGUgZXZlbgptb3JlIHNvIGJ5IHRoZSBhZGRpdGlvbiBvZiBhIHNlY29uZCBzcGVjaWVzLCBJIGFtIGdvaW5nIHRvIGZpcnN0CmNyZWF0ZSBhIHR4LWJhc2VkIGV4cHJlc3Npb25zZXQgYW5kIHVzZSB0aGUgSURzIGZyb20gaXQgdG8gY3JlYXRlIHRoZQpnZW5lIHZlcnNpb24uCgpgYGB7ciBhbGxfZGF0YV9oc2xwfQpyb3duYW1lcyhoc2xwX2Fubm90KSA8LSBoc2xwX2Fubm90W1sidHJhbnNjcmlwdCJdXQpoc2xwX3R4X2V4cHQgPC0gY3JlYXRlX2V4cHQoCiAgaHNscF9zYW1wbGVzaGVldCwgZmlsZV9jb2x1bW4gPSAiaGczOGxwZmlsZSIsIGdlbmVfaW5mbyA9IGhzbHBfYW5ub3QsCiAgc2F2ZWZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfaHNscF90eF9leHB0X2FsbF9yYXctdnt2ZXJ9LnJkYSIpKQoKIyMgVGhpcyBoYXMgOTksMDA1IHRyYW5zY3JpcHRzLiAgSWYgd2Ugc2V0IHVwIHRoZSB0eC0+Z2VuZSBtYXAgY29ycmVjdGx5LCB0aGlzIHNob3VsZCBkcm9wIHRvIH4gMzAsMDAwLgp0eF9tYXAgPC0gZGF0YS5mcmFtZSh0eCA9IHJvd25hbWVzKGV4cHJzKGhzbHBfdHhfZXhwdCkpKQp0eF9tYXBbWyJzaG9ydGVuZWRfdHhfaWQiXV0gPC0gZ3N1Yih4ID0gdHhfbWFwW1sidHgiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiXFwuXFxkKyIsIHJlcGxhY2VtZW50ID0gIiIpCgp0eF9tYXBfbWVyZ2VkIDwtIG1lcmdlKHR4X21hcCwgaHNscF9hbm5vdCwgYnkueCA9ICJzaG9ydGVuZWRfdHhfaWQiLAogICAgICAgICAgICAgICAgICAgICAgIGJ5LnkgPSAiZW5zZW1ibF90cmFuc2NyaXB0X2lkIikKdHhfbWFwX21lcmdlZCA8LSB0eF9tYXBfbWVyZ2VkWywgYygidHgiLCAiZW5zZW1ibF9nZW5lX2lkIildCgpoc2xwX2dlbmVfZXhwdCA8LSBjcmVhdGVfZXhwdCgKICBoc2xwX3NhbXBsZXNoZWV0LCBmaWxlX2NvbHVtbiA9ICJoZzM4bHBmaWxlIiwgdHhfZ2VuZV9tYXAgPSB0eF9tYXBfbWVyZ2VkLAogIHNhdmVmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2hzbHBfZ2VuZV9leHB0X2FsbF9yYXctdnt2ZXJ9LnJkYSIpLCBnZW5lX2luZm8gPSBoc2xwX2Fubm90KSAlPiUKICBzYW5pdGl6ZV9leHB0X21ldGFkYXRhKGNvbHVtbnMgPSBzYW5pdGl6ZV9jb2x1bW5zKSAlPiUKICBzZXRfZXhwdF9mYWN0b3JzKGNvbHVtbnMgPSBzYW5pdGl6ZV9jb2x1bW5zLCBjbGFzcyA9ICJmYWN0b3IiKSAlPiUKICBzZXRfZXhwdF9jb25kaXRpb25zKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInZpc2l0bnVtYmVyIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gInR5cGVvZmNlbGxzIT0ncGJtY3MnIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gInR5cGVvZmNlbGxzIT0nbWFjcm9waGFnZXMnIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pY2FscHJlc2VudGF0aW9uIT0naCciKQpwRGF0YShoc2xwX2dlbmVfZXhwdClbWyJ2aXNpdG51bWJlciJdXSA8LSBwYXN0ZTAoInYiLCBwRGF0YShoc2xwX2dlbmVfZXhwdClbWyJ2aXNpdG51bWJlciJdXSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiaHNscF9nZW5lX2V4cHQiKQoKIyMgVGhlIGZvbGxvd2luZyBzaG91bGQgbWFrZSB2aXNpdCAxIHRoZSBsYXJnZXN0IGlmIG9uZSB1c2VzIHRoYXQgY29sdW1uIGFzIGEgc2l6ZSBmYWN0b3Igd2hlbiBwbG90dGluZy4KbWV0YSA8LSBwRGF0YShoc2xwX2dlbmVfZXhwdCkgJT4lCiAgbXV0YXRlKHZpc2l0bnVtYmVyID0gZmN0X3JlbGV2ZWwodmlzaXRudW1iZXIsIGMoInYzIiwgInYyIiwgInYxIikpKQpwRGF0YShoc2xwX2dlbmVfZXhwdCkgPC0gbWV0YQpzYXZlKGxpc3QgPSAiaHNscF9nZW5lX2V4cHQiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2dlbmVfaHNscF9leHB0X2FsbF9zYW5pdGl6ZWQtdnt2ZXJ9LnJkYSIpKQpgYGAKCiMjIEFkZCB0aGUgQ1JGIHBhdGllbnQgbWV0YWRhdGEKClRoZXJlIGFyZSBzb21lIHBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdGhlIGNsaW5pY2lhbnMgd2hpY2ggbWF5IHByb3ZlCnRvIGJlIG9mIGludGVyZXN0LiAgSSB0aGVyZWZvcmUgYW0gYWRkaW5nIHRoZSBDUkYgbWV0YWRhdGEgaGVyZS4gIEkKd2lsbCBhbHNvIHJ1biBzb21lIHNpbXBsZSBjaGVja3MgdG8gdHJ5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQpjbGluaWNpYW4ncyBtZXRhZGF0YSBhZ3JlZXMgd2l0aCB0aGUgc2FtcGxlIG1ldGFkYXRhLgoKYGBge3IgbWVyZ2VfY3JmfQpoc19wZCA8LSBwRGF0YShoc19leHB0KQpzdGFydCA8LSByb3duYW1lcyhoc19wZCkKaHNfY3JmIDwtIG9wZW54bHN4OjpyZWFkLnhsc3goY3JmX21ldGFkYXRhKQpoc19jcmZbWyJqb2luIl1dIDwtIHRvbG93ZXIoaHNfY3JmW1siY29kaWdvX3BhY2llbnRlIl1dKQpoc19wZFtbImpvaW4iXV0gPC0gaHNfcGRbWyJ0dWJlbGFiZWxvcmlnaW4iXV0KdGVzdCA8LSBwbHlyOjpqb2luKGhzX3BkLCBoc19jcmYsIGJ5ID0gImpvaW4iKQp0ZXN0W1siam9pbiJdXSA8LSBOVUxMCnJvd25hbWVzKHRlc3QpIDwtIHJvd25hbWVzKGhzX3BkKQpuYV9pZHggPC0gaXMubmEodGVzdCkKdGVzdFtuYV9pZHhdIDwtICJ1bmRlZmluZWQiCnBEYXRhKGhzX2V4cHQpIDwtIHRlc3QKCiMjIE5vdyBhZGQgaW4gdGhlIGV0aG5pY2l0eSBhbmQgc2V4CiMjIEFkZCBhIGNvbWJpbmF0aW9uIG9mIHRoZSBldGhuaWNpdHkgYW5kIGNsaW5pYwojIyBXaGlsZSBJIGFtIGF0IGl0LCBkbyBzZXgrY2xpbmljCnRhYmxlKHBEYXRhKGhzX2V4cHQpJGViX2xjX3NleG8pCnRhYmxlKHBEYXRhKGhzX2V4cHQpJGViX2xjX2V0bmlhKQp0YWJsZShwRGF0YShoc19leHB0KSRjbGluaWMpCmV0bmlhX25hbWVzIDwtIHBEYXRhKGhzX2V4cHQpW1siZWJfbGNfZXRuaWEiXV0KZXRuaWFfaWR4IDwtIGV0bmlhX25hbWVzID09IDEKZXRuaWFfbmFtZXNbZXRuaWFfaWR4XSA8LSAiYWZyb2NvbCIKZXRuaWFfaWR4IDwtIGV0bmlhX25hbWVzID09IDIKZXRuaWFfbmFtZXNbZXRuaWFfaWR4XSA8LSAiaW5kaWdlbmEiCmV0bmlhX2lkeCA8LSBldG5pYV9uYW1lcyA9PSAzCmV0bmlhX25hbWVzW2V0bmlhX2lkeF0gPC0gIm1lc3RpemEiCnBEYXRhKGhzX2V4cHQpW1siZXRuaWEiXV0gPC0gYXMuZmFjdG9yKGV0bmlhX25hbWVzKQp0YWJsZShwRGF0YShoc19leHB0KVtbImV0bmlhIl1dKQpldG5pYV9mYWN0b3IgPC0gcGFzdGUwKHBEYXRhKGhzX2V4cHQpW1siY2xpbmljIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgICAgZXRuaWFfbmFtZXMpCnBEYXRhKGhzX2V4cHQpW1siY2xpbmljX2V0bmlhIl1dIDwtIGFzLmZhY3RvcihldG5pYV9mYWN0b3IpCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siY2xpbmljX2V0bmlhIl1dKQoKcERhdGEoaHNfZXhwdClbWyJzZXgiXV0gPC0gImZlbWFsZSIKbWFsZV9pZHggPC0gcERhdGEoaHNfZXhwdClbWyJlYl9sY19zZXhvIl1dID09IDEKcERhdGEoaHNfZXhwdClbbWFsZV9pZHgsICJzZXgiXSA8LSAibWFsZSIKc2V4X2ZhY3RvciA8LSBwYXN0ZTAocERhdGEoaHNfZXhwdClbWyJjbGluaWMiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgcERhdGEoaHNfZXhwdClbWyJzZXgiXV0pCnBEYXRhKGhzX2V4cHQpW1siY2xpbmljX3NleCJdXSA8LSBhcy5mYWN0b3Ioc2V4X2ZhY3RvcikKdGFibGUocERhdGEoaHNfZXhwdClbWyJjbGluaWNfc2V4Il1dKQoKcERhdGEoaHNfZXhwdClbWyJldG5pYV9zZXgiXV0gPC0gcGFzdGUwKHBEYXRhKGhzX2V4cHQpW1siZXRuaWEiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKGhzX2V4cHQpW1sic2V4Il1dKQpwRGF0YShoc19leHB0KVtbImV0bmlhX3NleCJdXSA8LSBhcy5mYWN0b3IocERhdGEoaHNfZXhwdClbWyJldG5pYV9zZXgiXV0pCnRhYmxlKHBEYXRhKGhzX2V4cHQpW1siZXRuaWFfc2V4Il1dKQoKc2F2ZShsaXN0ID0gImhzX2V4cHQiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2hzX2V4cHRfYWxsX3Nhbml0aXplZF9jcmYtdnt2ZXJ9LnJkYSIpKQpgYGAKCiMjIFNhbml0eSBjaGVjaywgY2xpbmljYWwgb3V0Y29tZSB2cy4gQ1JGIGRhdGEKCkNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgQ1JGIGFncmVlcyB3aXRoIHRoZSBtZXRhZGF0YS4KCmBgYHtyIGNmX3Nhbml0eX0KdHdvX2NvbHVtbnMgPC0gcERhdGEoaHNfZXhwdClbLCBjKCJmaW5hbG91dGNvbWUiLCAiZWZfbGNfZXN0YWRvX2ZpbmFsX2VzdHVkaW8iKV0KdW5kZWZfaWR4IDwtIHR3b19jb2x1bW5zW1syXV0gPT0gInVuZGVmaW5lZCIKdHdvX2NvbHVtbnMgPC0gdHdvX2NvbHVtbnNbIXVuZGVmX2lkeCwgXQp0d29fY29sdW1uc1tbInJld3JpdHRlbiJdXSA8LSAidW5kZWYiCmN1cmVfaWR4IDwtIHR3b19jb2x1bW5zW1syXV0gPT0gMAp0d29fY29sdW1uc1tjdXJlX2lkeCwgInJld3JpdHRlbiJdIDwtICJjdXJlIgpmYWlsX2lkeCA8LSB0d29fY29sdW1uc1tbMl1dID09IDEKdHdvX2NvbHVtbnNbZmFpbF9pZHgsICJyZXdyaXR0ZW4iXSA8LSAiZmFpbHVyZSIKbG9zdF9pZHggPC0gdHdvX2NvbHVtbnNbWzJdXSA9PSAyCnR3b19jb2x1bW5zW2xvc3RfaWR4LCAicmV3cml0dGVuIl0gPC0gImxvc3QiCnNhbWVfaWR4IDwtIHR3b19jb2x1bW5zW1siZmluYWxvdXRjb21lIl1dID09IHR3b19jb2x1bW5zW1sicmV3cml0dGVuIl1dCmJyb2tlbiA8LSB0d29fY29sdW1uc1shc2FtZV9pZHgsIF0KYnJva2VuCmBgYAoKIyMgU3VtbWFyaXplOiBDb2xsZWN0IHNhbXBsZSBudW1iZXJzIGJlZm9yZSBmaWx0ZXJpbmcKClRoZXJlIGFyZSBzb21lIG1ldGFkYXRhIGZhY3RvcnMgZm9yIHdoaWNoIEkgdGhpbmsgaXQgd2lsbCBiZSBuaWNlIHRvCnNlZSB0aGUgbnVtYmVycyBiZWZvcmUgYW5kIGFmdGVyIG91ciBmaWx0ZXJzLiAgVGhlIGZvbGxvd2luZyBzaG93cyBob3cKbWFueSBzYW1wbGVzIHdlIGhhdmUgb2YgdGhlIHByaW1hcnkgdHlwZXMgYmVmb3JlIGZpbHRlcmluZy4KCmBgYHtyIHRhYmxlX3ZhbGlkX3ByZX0KZGltKHBEYXRhKGhzX2V4cHQpKQp0YWJsZShwRGF0YShoc19leHB0KSRkcnVnKQp0YWJsZShwRGF0YShoc19leHB0KSRjbGluaWMpCnRhYmxlKHBEYXRhKGhzX2V4cHQpJGZpbmFsb3V0Y29tZSkKdGFibGUocERhdGEoaHNfZXhwdCkkdHlwZW9mY2VsbHMpCnRhYmxlKHBEYXRhKGhzX2V4cHQpJHZpc2l0KQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfZXhwdCkkZWJfbGNfdGllbXBvX2V2b2x1Y2lvbikpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShoc19leHB0KSRlYl9sY190dG9fbWN0b19nbHVjYW5fZG9zaXMpKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoaHNfZXhwdCkkdjNfbGNfZWpleV9sZXNpb25fbW1fMSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShoc19leHB0KSR2M19sY19sZXNpb25fYXJlYV8xKSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKGhzX2V4cHQpJHYzX2xjX2VqZXhfdWxjZXJhX21tXzEpKQp0YWJsZShwRGF0YShoc19leHB0KSRlYl9sY19zZXhvKQp0YWJsZShwRGF0YShoc19leHB0KSRlYl9sY19ldG5pYSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKGhzX2V4cHQpJGVkYWQpKQp0YWJsZShwRGF0YShoc19leHB0KSRlYl9sY19wZXNvKQp0YWJsZShwRGF0YShoc19leHB0KSRlYl9sY19lc3RhdHVyYSkKdGFibGUocERhdGEoaHNfZXhwdCkkZWZfbGNfZXN0YWRvX2ZpbmFsX2VzdHVkaW8pCnRhYmxlKHBEYXRhKGhzX2V4cHQpJGZpbmFsb3V0Y29tZSkKCnVuaXF1ZShwRGF0YShoc19leHB0KSRjb2RpZ29fcGFjaWVudGUpCmxlbmd0aCh1bmlxdWUocERhdGEoaHNfZXhwdCkkY29kaWdvX3BhY2llbnRlKSkKYGBgCgpHZXQgdGhlIHNleCBvZiB0aGUgdW5pcXVlIHBhdGllbnRzLgoKYGBge3IgdW5pcXVlX3NleH0KdW5pcXVlX3Blb3BsZSA8LSB1bmlxdWUocERhdGEoaHNfZXhwdClbWyJjb2RpZ29fcGFjaWVudGUiXV0pCnVuaXF1ZV9wZW9wbGUKbGVuZ3RoKHVuaXF1ZV9wZW9wbGUpCgpkZiA8LSBwRGF0YShoc19leHB0KQpwZW9wbGUgPC0gZGZbWyJjb2RpZ29fcGFjaWVudGUiXV0KZmlyc3RfaW5kaWNlcyA8LSBvcmRlcihwZW9wbGUpWyFkdXBsaWNhdGVkKHNvcnQocGVvcGxlKSldCnRhYmxlKGRmW2ZpcnN0X2luZGljZXMsICJlYl9sY19zZXhvIl0pCnRhYmxlKGRmW2ZpcnN0X2luZGljZXMsICJmaW5hbG91dGNvbWUiXSkKYGBgCgojIyBEZWZpbmUgZGVzaXJlZCBjb2xvcnMgZm9yIHRoZSB2YXJpb3VzIHN1YnNldHMKClRoZXJlIGFyZSBsb3RzIG9mIHdheXMgd2hpY2ggd2Ugd2lsbCBjYXRlZ29yaXplIHRoZSBkYXRhLCBoZXJlIGFyZQpzb21lIHBvdGVudGlhbCBjb2xvciBjaG9pY2VzIGZvciB0aGVtLgoKYGBge3IgY29sb3JfY2hvaWNlc30KY29sb3JfY2hvaWNlcyA8LSBsaXN0KAogICAgImNmIiA9IGxpc3QoCiAgICAgICJjdXJlIiA9ICIjOTk4RUMzIiwKICAgICAgImZhaWx1cmUiID0gIiNGMUEzNDAiKSwKICAgICJ0eXBlX3Zpc2l0IiA9IGxpc3QoCiAgICAgICJtb25vY3l0ZXNfdjEiID0gIiNERDFDNzciLAogICAgICAibW9ub2N5dGVzX3YyIiA9ICIjQzk5NEM3IiwKICAgICAgIm1vbm9jeXRlc192MyIgPSAiI0U3RTFFRiIsCiAgICAgICJlb3Npbm9waGlsc192MSIgPSAiIzMxQTM1NCIsCiAgICAgICJlb3Npbm9waGlsc192MiIgPSAiI0FEREQ4RSIsCiAgICAgICJlb3Npbm9waGlsc192MyIgPSAiI0Y3RkNEOSIsCiAgICAgICJuZXV0cm9waGlsc192MSIgPSAiIzMxODJCRCIsCiAgICAgICJuZXV0cm9waGlsc192MiIgPSAiIzlFQ0FFMSIsCiAgICAgICJuZXV0cm9waGlsc192MyIgPSAiI0RFRUJGNyIsCiAgICAgICJiaW9wc3lfdjEiID0gIiNEOTVGMEUiKSwKICAgICJ0eXBlIiA9IGxpc3QoCiAgICAgICJtb25vY3l0ZXMiID0gIiNERDFDNzciLAogICAgICAiZW9zaW5vcGhpbHMiID0gIiMzMUEzNTQiLAogICAgICAibmV1dHJvcGhpbHMiID0gIiMzMTgyQkQiLAogICAgICAiYmlvcHN5IiA9ICIjRDk1RjBFIiksCiAgICAidmlzaXQiID0gbGlzdCgKICAgICAgInYxIiA9ICIjRUVFRUVFIiwKICAgICAgInYyIiA9ICIjODg4ODg4IiwKICAgICAgInYzIiA9ICIjMTExMTExIiksCiAgICAiY2xpbmljX2NmIiA9IGxpc3QoCiAgICAgICJUdW1hY29fY3VyZSIgPSAiIzc2NzBCMyIsCiAgICAgICJUdW1hY29fZmFpbHVyZSIgPSAiI0U3Mjk4QSIsCiAgICAgICJDYWxpX2N1cmUiID0gIiMxQjlFNzciLAogICAgICAiQ2FsaV9mYWlsdXJlIiA9ICIjRDk1RjAyIiksCiAgICAiZXRobmljaXR5IiA9IGxpc3QoCiAgICAgICJhZnJvY29sIiA9ICIjNDI5M0NFIiwKICAgICAgImluZGlnZW5hIiA9ICIjQkRCREJEIiwKICAgICAgIm1lc3RpemEiID0gIiNGRUIyNEMiKSwKICAgICJjbGluaWNfZXRuaWEiID0gbGlzdCgKICAgICAgIkNhbGlfYWZyb2NvbCIgPSAiIzMxODJCRCIsCiAgICAgICJDYWxpX2luZGlnZW5hIiA9ICIjNjM2MzYzIiwKICAgICAgIkNhbGlfbWVzdGl6YSIgPSAiI0YwM0IyMCIsCiAgICAgICJUdW1hY29fYWZyb2NvbCIgPSAiIzlFQ0FFMSIsCiAgICAgICJUdW1hY29faW5kaWdlbmEiID0gIiNCREJEQkQiLAogICAgICAiVHVtYWNvX21lc3RpemEiID0gIiNGRUIyNEMiKSwKICAgICJzZXgiID0gbGlzdCgKICAgICAgImZlbWFsZSIgPSAiIzMxODJCRCIsCiAgICAgICJtYWxlIiA9ICIjQzk5NEM3IiksCiAgICAiY2xpbmljX3NleCIgPSBsaXN0KAogICAgICAiQ2FsaV9mZW1hbGUiID0gIiMwMDAwQ0MiLAogICAgICAiVHVtYWNvX2ZlbWFsZSIgPSAiIzMxODJCRCIsCiAgICAgICJDYWxpX21hbGUiID0gIiNFNzI5OEEiLAogICAgICAiVHVtYWNvX21hbGUiID0gIiNDOTk0QzciKSwKICAgICJjZl90eXBlIiA9IGxpc3QoCiAgICAgICJjdXJlX2Jpb3BzeSIgPSAiI0Q5NUYwRSIsCiAgICAgICJmYWlsdXJlX2Jpb3BzeSIgPSAiI0ZFQzQ0RiIsCiAgICAgICJjdXJlX21vbm9jeXRlcyIgPSAiI0REMUM3NyIsCiAgICAgICJmYWlsdXJlX21vbm9jeXRlcyIgPSAiI0M5OTRDNyIsCiAgICAgICJjdXJlX2Vvc2lub3BoaWxzIiA9ICIjMzFBMzU0IiwKICAgICAgImZhaWx1cmVfZW9zaW5vcGhpbHMiID0gIiNBREREOEUiLAogICAgICAiY3VyZV9uZXV0cm9waGlscyIgPSAiIzMxODJCRCIsCiAgICAgICJmYWlsdXJlX25ldXRyb3BoaWxzIiA9ICIjOUVDQUUxIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNvbG9yX2Nob2ljZXMiKQpgYGAKCiMgRGVmaW5lIHRoZSBzdGFydGluZyBkYXRhCgpHaXZlbiB0aGUgc3RhcnRpbmcgcG9pbnQgYWJvdmUsIHdlIHdpbGwgc3RhcnQgZXh0cmFjdGluZyBncm91cHMgb2YKc2FtcGxlcyBvZiBpbnRlcmVzdCBhbmQgZ2l2aW5nIHRoZW0gaG9wZWZ1bGx5IHVzZWZ1bCBuYW1lcy4KCiMjIFNldCBvdXIgaW5pdGlhbCBjb3ZlcmFnZSBnb2FsCgpUaGUgZmlyc3Qgc2V0IG9mIHNhbXBsZXMgcmVtb3ZlZCBmcm9tIHRoZSBkYXRhIGFyZSB0aG9zZSB3aXRoIHRvbyBtYW55Cm1pc3NpbmcgZ2VuZXMuCgojIyBGaWd1cmUgWFg6IE5vbi16ZXJvIGdlbmVzIGJlZm9yZSBzYW1wbGUgZmlsdGVyaW5nCgpgYGB7ciBoc19wcmVfbnp9CmFsbF9ueiA8LSBwbG90X25vbnplcm8oaHNfZXhwdCkKYWxsX256JHBsb3QKYGBgCgojIyMgU2F2ZSBDUE0sIGFsbCBzYW1wbGVzCgpgYGB7ciBjcG1fYWxsfQp4bHN4X3ByZWZpeCA8LSAiYW5hbHlzZXMiCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2V4cHQsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS8zX2NhbGlfYW5kX3R1bWFjby9hbGxfc2FtcGxlcy12e3Zlcn0ueGxzeCIpKQoKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2V4cHQsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vaHNfZXhwdF9ycGttLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyBTdWJzZXQ6IEZpbHRlciBvdXQgcHJvYmxlbWF0aWMgc2FtcGxlcwoKVG8gbXkgZXllcywgdGhlcmUgYXJlIDMgb3IgNCBzYW1wbGVzIHdoaWNoIGFyZSBsaWtlbHkgY2FuZGlkYXRlcyBmb3IKcmVtb3ZhbC4gIEluIGFkZGl0aW9uLCB3ZSB3aWxsIHJlbW92ZSBzYW1wbGVzIHdoaWNoIHdlcmUgbG9zdCBkdXJpbmcKdGhlIHRyZWF0bWVudCBhbmQvb3Igb25lcyB3aGljaCB3ZXJlIHVzZWQgaW4gb3RoZXIgZXhwZXJpbWVudHMgYnV0CmluY2x1ZGVkIGluIHRoZSBUTVJDMyBzYW1wbGUgc2hlZXQgKHRodXMgdGhlICdub3RhcHBsaWNhYmxlJyBvcgonbnVsbCcpLgoKTk9URTogSSBjaGFuZ2VkIHRoZSBwcmVmaXggb2YgdGhlIGRhdGEgc3RydWN0dXJlcyB0byByZWZsZWN0IHRoZQpjbGluaWMocykgZnJvbSB3aGljaCB0aGV5IHdlcmUgYWNxdWlyZWQuIFRoaXMgd2lsbCBsaWtlbHkgYmUgYSBwcm9ibGVtCnVudGlsIEkgY2FyZWZ1bGx5IHN0ZXAgdGhyb3VnaCB0aGUgZmlsZTsgYnV0IHdpbGwgbWFrZSBzdXJlIEkgZG8gbm90CmFjY2lkZW50bHkgdXBsb2FkIGRhdGEgd2l0aCB0aGUgQ2FsaSBzYW1wbGVzLgoKYGBge3IgdGNfdmFsaWR9CnRjX3ZhbGlkIDwtIHN1YnNldF9leHB0KGhzX2V4cHQsIG5vbnplcm8gPSAxMTAwMCkgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImZpbmFsb3V0Y29tZSE9J2xvc3QnIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImRydWc9PSdhbnRpbW9ueSciKSAlPiUKICBzZXRfZXhwdF9jb2xvcnMoY29sb3JfY2hvaWNlc1tbImNmIl1dKQoKc2F2ZShsaXN0ID0gInRjX3ZhbGlkIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y192YWxpZC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX3ZhbGlkIikKYGBgCgojIyBGaWd1cmUgWFggKyAxOiBOb24temVybyBnZW5lcyBhZnRlciBzYW1wbGUgZmlsdGVyaW5nCgpUaGUgZm9sbG93aW5nIHBsb3QgaXMgZXNzZW50aWFsbHkgaWRlbnRpY2FsIHRvIHRoZSBwcmV2aW91cyB3aXRoIHR3bwpleGNlcHRpb25zOgoKMS4gIFRoZSBzYW1wbGVzIHdpdGggdG9vIGZldyBnZW5lcyAoMTEsMDAwIGN1cnJlbnRseSkgYXJlIGdvbmUuCjIuICBUaGUgc2FtcGxlcyBhcmUgY29sb3JlZCBieSBjdXJlKHB1cnBsZSkvZmFpbCh5ZWxsb3cpCgpgYGB7ciBuel9wb3N0fQpuel9wb3N0IDwtIHBsb3Rfbm9uemVybyh0Y192YWxpZCkKbnpfcG9zdFtbInBsb3QiXV0KYGBgCgojIyBTdW1tYXJpemU6IFRhbGx5IHNhbXBsZXMgYWZ0ZXIgZmlsdGVyaW5nCgpXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgb2YgZWFjaCBzYW1wbGUgdHlwZSBpcyBsb3N0IHdoZW4gd2UKZG8gb3VyIHZhcmlvdXMgZmlsdGVycy4gIFRodXMgSSBhbSByZXBlYXRpbmcgdGhlIHNhbWUgc2V0IG9mIHRhbGxpZXMuClRoaXMgd2lsbCBsaWtlbHkgaGFwcGVuIG9uZSBtb3JlIHRpbWUsIGZvbGxvd2luZyB0aGUgcmVtb3ZhbCBvZgpzYW1wbGVzIHdoaWNoIGNhbWUgZnJvbSBDYWxpLgoKYGBge3IgdGFibGVfdmFsaWR9CnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImRydWciXV0pCnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImNsaW5pYyJdXSkKdGFibGUocERhdGEodGNfdmFsaWQpW1siZmluYWxvdXRjb21lIl1dKQp0YWJsZShwRGF0YSh0Y192YWxpZClbWyJ0eXBlb2ZjZWxscyJdXSkKdGFibGUocERhdGEodGNfdmFsaWQpW1sidmlzaXQiXV0pCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJlYl9sY190aWVtcG9fZXZvbHVjaW9uIl1dKSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKHRjX3ZhbGlkKVtbImViX2xjX3R0b19tY3RvX2dsdWNhbl9kb3NpcyJdXSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0Y192YWxpZClbWyJ2M19sY19lamV5X2xlc2lvbl9tbV8xIl1dKSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKHRjX3ZhbGlkKVtbInYzX2xjX2xlc2lvbl9hcmVhXzEiXV0pKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodGNfdmFsaWQpW1sidjNfbGNfZWpleF91bGNlcmFfbW1fMSJdXSkpCnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImViX2xjX3NleG8iXV0pCnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImViX2xjX2V0bmlhIl1dKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodGNfdmFsaWQpW1siZWRhZCJdXSkpCnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImViX2xjX3Blc28iXV0pCnRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbImViX2xjX2VzdGF0dXJhIl1dKQoKbGVuZ3RoKHVuaXF1ZShwRGF0YSh0Y192YWxpZClbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpgYGAKCiMjIFNwbGl0IHRoZSBkYXRhIGJ5IGN1cmUvZmFpbCBmb3Igc29tZSBjb3VudGluZwoKYGBge3IgdGNfY3VyZV9mYWlsdjF9CnRjX2N1cmUgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJmaW5hbG91dGNvbWU9PSdjdXJlJyIpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2N1cmUiKQoKdGFibGUocERhdGEodGNfY3VyZSlbWyJ2aXNpdG51bWJlciJdXSkKCnRjX2ZhaWwgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJmaW5hbG91dGNvbWU9PSdmYWlsdXJlJyIpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjX2ZhaWwiKQoKdGFibGUocERhdGEodGNfZmFpbClbWyJ2aXNpdG51bWJlciJdXSkKYGBgCgojIFN1YnNldCBzYW1wbGVzIGJ5IGNlbGwgdHlwZSBhbmQgdmlzaXQKCmBgYHtyIGluaXRpYWxfc3Vic2V0c30KYWxsX3R5cGVzIDwtIHRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbInR5cGVvZmNlbGxzIl1dKQphbGxfdHlwZXMKYWxsX3RpbWVzIDwtIHRhYmxlKHBEYXRhKHRjX3ZhbGlkKVtbInZpc2l0bnVtYmVyIl1dKQphbGxfdGltZXMKYGBgCgojIyMgV3JpdGUgdmFsaWQgc2FtcGxlcwoKYGBge3IgY3BtX3ZhbGlkfQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y192YWxpZCwgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzNfY2FsaV9hbmRfdHVtYWNvL2FsbF92YWxpZF9zYW1wbGVzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y192YWxpZCwgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90Y19hbGxfdmFsaWRfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmBgYAoKIyMgRXh0cmFjdCBjZWxsIHR5cGVzCgpgYGB7ciBzdWJzZXRfdmFsaWR9CiMjIE5vdGUsIEkgd2lsbCBzYXZlIHRoZXNlIGRhdGEgc3RydWN0dXJlcyBpbiBhIGxpdHRsZSBiaXQgd2hlbiBJCiMjIGRlY2lkZSBob3cgSSB3YW50IHRvIHNldCB0aGUgY29uZGl0aW9ucywgYmF0Y2hlcywgYW5kIGNvbG9ycy4KdGNfZW9zaW5vcGhpbHMgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J2Vvc2lub3BoaWxzJyIpCnRjX21vbm9jeXRlcyA8LSBzdWJzZXRfZXhwdCh0Y192YWxpZCwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnRjX25ldXRyb3BoaWxzIDwtIHN1YnNldF9leHB0KHRjX3ZhbGlkLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSduZXV0cm9waGlscyciKQpgYGAKCiMjIyBXcml0ZSBjZWxsIHR5cGUgY3BtCgpgYGB7ciBzdWJzZXRfdmFsaWRfY3BtfQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y19lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzNfY2FsaV9hbmRfdHVtYWNvL3RjX2Vvc2lub3BoaWxzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y19lb3Npbm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90Y19lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y19tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS8zX2NhbGlfYW5kX3R1bWFjby90Y19tb25vY3l0ZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjX21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90Y19tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGNfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS8zX2NhbGlfYW5kX3R1bWFjby90Y19uZXV0cm9waGlscy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGNfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vdGNfbmV1dHJvcGhpbHMtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIFR1bWFjbyBhbmQgQ2FsaSBzYW1wbGVzIGJ5IHZpc2l0CgpgYGB7ciB2aXNpdF9zYW1wbGVzX3Rjdnh9CiMjIEN1cnJlbnRseSwgdGhlc2UgYXJlIG5vdCB1c2VkLCBidXQgaW5zdGVhZCBJIHB1bGxlZCB0aGUgc2FtcGxlcwojIyBmcm9tIHRoZSBoc19jbGluaWNhbCB3aGljaCBtZWFucyB0aGUgYmlvcHNpZXMgYXJlIG5vdCBpbmNsdWRlZC4KdGN2MV9zYW1wbGVzIDwtIHN1YnNldF9leHB0KHRjX3ZhbGlkLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScxJyIpCnNhdmUobGlzdCA9ICJ0Y3YxX3NhbXBsZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjFfc2FtcGxlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjFfc2FtcGxlcyIpCgp0Y3YyX3NhbXBsZXMgPC0gc3Vic2V0X2V4cHQodGNfdmFsaWQsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzInIikKc2F2ZShsaXN0ID0gInRjdjJfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2Ml9zYW1wbGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2Ml9zYW1wbGVzIikKCnRjdjNfc2FtcGxlcyA8LSBzdWJzZXRfZXhwdCh0Y192YWxpZCwgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMyciKQpzYXZlKGxpc3QgPSAidGN2M19zYW1wbGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YzX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YzX3NhbXBsZXMiKQpgYGAKCiMjIyBDYWxpIGFuZCBUdW1hY28gYnkgdmlzaXQsIHdyaXRlIGNwbQoKYGBge3IgY2FsaV90dW1hY29fdmlzaXRfY3BtfQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y3YxX3NhbXBsZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS8zX2NhbGlfYW5kX3R1bWFjby90Y3YxX3NhbXBsZXMtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjFfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90Y3YxX3NhbXBsZXMtdnt2ZXJ9LmNzdiIpKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGN2Ml9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vM19jYWxpX2FuZF90dW1hY28vdGN2Ml9zYW1wbGVzLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0Y3YyX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vdGN2Ml9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRjdjNfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzNfY2FsaV9hbmRfdHVtYWNvL3RjdjNfc2FtcGxlcy12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodGN2M19zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL3RjdjNfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmBgYAoKIyBUdW1hY28gYW5kIENhbGkgZGF0YSBzdHJ1Y3R1cmVzCgpBbGwgZGF0YSBzdHJ1Y3R1cmVzIHdoaWNoIHN0YXJ0IHdpdGggdGhlIHByZWZpeCAndGMnIGFyZSBUdW1hY28gYW5kCkNhbGkuICBUaG9zZSB3aXRoICd0JyBhcmUgb25seSBUdW1hY28uCgpgYGB7ciBjbGluaWNhbF9oc30KdGNfY2xpbmljYWwgPC0gdGNfdmFsaWQgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gImZpbmFsb3V0Y29tZSIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJ0eXBlb2ZjZWxscyIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1siY2YiXV0pCnNhdmUobGlzdCA9ICJ0Y19jbGluaWNhbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGNfY2xpbmljYWwtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y19jbGluaWNhbCIpCmBgYAoKIyMgU3Vic2V0OiBNb25vY3l0ZXMgYnkgY2xpbmljCgpOb3RlOiBJIHVzdWFsbHkgZG8gdGhpcyBraW5kIG9mIHRoaW5nIGluIGFscGhhYmV0aWMgb3JkZXIsIGJ1dCBpbiB0aGlzCmluc3RhbmNlIEkgd2FudCB0byBkbyBtb25vY3l0ZXMgKG9yIG5ldXRyb3BoaWxzKSBmaXJzdCBiZWNhdXNlIHRoZXkKaGF2ZSBzYW1wbGVzIGluIGFsbCA0IG9mIHRoZSBjbGluaWMvY2YgY2F0ZWdvcmllcy4gIFRoZSBFb3Npbm9waGlscyBkbwpub3QgaGF2ZSBhbnkgQ2FsaSBmYWlscyBhbmQgdGhpcyBtZXNzZXMgdXAgdGhlIGNvbG9yIHNjaGVtZS4gIFRob3VnaCwKbm93IHRoYXQgSSBoYXZlIHdyaXR0ZW4gdGhpcyBkb3duLCBpdCB3b3VsZCBtYWtlIG11Y2ggbW9yZSBzZW5zZSB0bwpqdXN0IGRlZmluZSB0aGVzZSBjb2xvcnMgdXAgYWJvdmUgYW5kIHVzZSB0aGVtIGFjcm9zcyBlYWNoIHNldC4uLgoKYGBge3IgY2xpbmljX21vbm9jeXRlX3BjYX0KY2xpbmljX2NmIDwtIHBhc3RlMChwRGF0YSh0Y19tb25vY3l0ZXMpW1siY2xpbmljIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgcERhdGEodGNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSkKdGFibGUoY2xpbmljX2NmKQp0Y19tb25vY3l0ZXMgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y19tb25vY3l0ZXMsIGZhY3QgPSBjbGluaWNfY2YpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1siY2xpbmljX2NmIl1dKQpzYXZlKGxpc3QgPSAidGNfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y19tb25vY3l0ZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y19tb25vY3l0ZXMiKQoKdGN2MV9tb25vY3l0ZXMgPC0gc3Vic2V0X2V4cHQodGNfbW9ub2N5dGVzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScxJyIpCnNhdmUobGlzdCA9ICJ0Y3YxX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2MV9tb25vY3l0ZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YxX21vbm9jeXRlcyIpCnRjdjJfbW9ub2N5dGVzIDwtIHN1YnNldF9leHB0KHRjX21vbm9jeXRlcywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMiciKQpzYXZlKGxpc3QgPSAidGN2Ml9tb25vY3l0ZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjJfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2Ml9tb25vY3l0ZXMiKQp0Y3YzX21vbm9jeXRlcyA8LSBzdWJzZXRfZXhwdCh0Y19tb25vY3l0ZXMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzMnIikKc2F2ZShsaXN0ID0gInRjdjNfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YzX21vbm9jeXRlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjNfbW9ub2N5dGVzIikKYGBgCgojIyBTdWJzZXQ6IE1vbm9jeXRlcyBieSBjbGluaWMKCmBgYHtyIGJpb3BzaWVzX2J5X2NsaW5pY30KdGNfY2xpbmljYWxfbm9iaW9wIDwtIHN1YnNldF9leHB0KHRjX2NsaW5pY2FsLCBzdWJzZXQgPSAidHlwZW9mY2VsbHMhPSdiaW9wc3knIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJjZiJdXSkKc2F2ZShsaXN0ID0gInRjX2NsaW5pY2FsX25vYmlvcCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGNfY2xpbmljYWxfbm9iaW9wLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfY2xpbmljYWxfbm9iaW9wIikKCnRjX2Jpb3BzaWVzIDwtIHRjX3ZhbGlkICU+JQogIHNldF9leHB0X2NvbmRpdGlvbnMoZmFjdCA9ICJjbGluaWMiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAiZmluYWxvdXRjb21lIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nYmlvcHN5JyIpCnRjX2NmIDwtIHBhc3RlMChwRGF0YSh0Y19iaW9wc2llcylbWyJjbGluaWMiXV0sICJfIiwKICAgICAgICAgICAgICAgIHBEYXRhKHRjX2Jpb3BzaWVzKVtbImZpbmFsb3V0Y29tZSJdXSkKdGFibGUodGNfY2YpCnRjX2Jpb3BzaWVzIDwtIHNldF9leHB0X2NvbmRpdGlvbnModGNfYmlvcHNpZXMsIGZhY3QgPSB0Y19jZikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInZpc2l0bnVtYmVyIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJjbGluaWNfY2YiXV0pCnNhdmUobGlzdCA9ICJ0Y19iaW9wc2llcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGNfYmlvcHNpZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y19iaW9wc2llcyIpCmBgYAoKIyMgU3Vic2V0OiBFb3Npbm9waGlscyBieSBjbGluaWMKCmBgYHtyIGNsaW5pY19lb3Npbm9waGlsX3BjYX0KY2xpbmljX2NmIDwtIHBhc3RlMChwRGF0YSh0Y19lb3Npbm9waGlscylbWyJjbGluaWMiXV0sICJfIiwKICAgICAgICAgICAgICAgICAgICBwRGF0YSh0Y19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0pCnRhYmxlKGNsaW5pY19jZikKdGNfZW9zaW5vcGhpbHMgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyh0Y19lb3Npbm9waGlscywgZmFjdCA9IGNsaW5pY19jZikgJT4lCiAgc2V0X2V4cHRfYmF0Y2hlcyhmYWN0ID0gInZpc2l0bnVtYmVyIikgJT4lCiAgc2V0X2V4cHRfY29sb3JzKGNvbG9yX2Nob2ljZXNbWyJjbGluaWNfY2YiXV0pCnNhdmUobGlzdCA9ICJ0Y19lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGNfZW9zaW5vcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y19lb3Npbm9waGlscyIpCgp0Y3YxX2Vvc2lub3BoaWxzIDwtIHN1YnNldF9leHB0KHRjX2Vvc2lub3BoaWxzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScxJyIpCnNhdmUobGlzdCA9ICJ0Y3YxX2Vvc2lub3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YxX2Vvc2lub3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2MV9lb3Npbm9waGlscyIpCnRjdjJfZW9zaW5vcGhpbHMgPC0gc3Vic2V0X2V4cHQodGNfZW9zaW5vcGhpbHMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzInIikKc2F2ZShsaXN0ID0gInRjdjJfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjJfZW9zaW5vcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YyX2Vvc2lub3BoaWxzIikKdGN2M19lb3Npbm9waGlscyA8LSBzdWJzZXRfZXhwdCh0Y19lb3Npbm9waGlscywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMyciKQpzYXZlKGxpc3QgPSAidGN2M19lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2M19lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjNfZW9zaW5vcGhpbHMiKQpgYGAKCiMjIFN1YnNldDogTmV1dHJvcGhpbHMgYnkgY2xpbmljCgpgYGB7ciBjbGluaWNfbmV1dHJvcGhpbF9wY2F9CmNsaW5pY19jZiA8LSBwYXN0ZTAocERhdGEodGNfbmV1dHJvcGhpbHMpW1siY2xpbmljIl1dLCAiXyIsCiAgICAgICAgICAgICAgICAgICAgcERhdGEodGNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dKQp0YWJsZShjbGluaWNfY2YpCnRjX25ldXRyb3BoaWxzIDwtIHNldF9leHB0X2NvbmRpdGlvbnModGNfbmV1dHJvcGhpbHMsIGZhY3QgPSBjbGluaWNfY2YpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHNldF9leHB0X2NvbG9ycyhjb2xvcl9jaG9pY2VzW1siY2xpbmljX2NmIl1dKQpzYXZlKGxpc3QgPSAidGNfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGNfbmV1dHJvcGhpbHMiKQoKdGN2MV9uZXV0cm9waGlscyA8LSBzdWJzZXRfZXhwdCh0Y19uZXV0cm9waGlscywgc3Vic2V0ID0gInZpc2l0bnVtYmVyPT0nMSciKQpzYXZlKGxpc3QgPSAidGN2MV9uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdGN2MV9uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRjdjFfbmV1dHJvcGhpbHMiKQp0Y3YyX25ldXRyb3BoaWxzIDwtIHN1YnNldF9leHB0KHRjX25ldXRyb3BoaWxzLCBzdWJzZXQgPSAidmlzaXRudW1iZXI9PScyJyIpCnNhdmUobGlzdCA9ICJ0Y3YyX25ldXRyb3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190Y3YyX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidGN2Ml9uZXV0cm9waGlscyIpCnRjdjNfbmV1dHJvcGhpbHMgPC0gc3Vic2V0X2V4cHQodGNfbmV1dHJvcGhpbHMsIHN1YnNldCA9ICJ2aXNpdG51bWJlcj09JzMnIikKc2F2ZShsaXN0ID0gInRjdjNfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RjdjNfbmV1dHJvcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0Y3YzX25ldXRyb3BoaWxzIikKYGBgCgojIFN1bW1hcml6ZTogVGFidWxhdGUgc2FtcGxlIG51bWJlcnMKCkhlcmUgaXMgYW4gb3V0bGluZSBvZiB0aGUgc2FtcGxlcyBpbiB0aGVpciBjdXJyZW50IHN0YXRlOgoKKiBCeSB0eXBlOiBgciBuY29sKGV4cHJzKHRjX3ZhbGlkKSlgLCBDdXJlOiBgciBzdW0ocERhdGEodGNfdmFsaWQpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIilgLCBGYWlsOiBgciBzdW0ocERhdGEodGNfdmFsaWQpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAqICBCaW9wc3k6IGByIGFsbF90eXBlc1tbImJpb3BzeSJdXWAsIEN1cmU6IGByIHN1bShwRGF0YSh0Y19iaW9wc2llcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0Y19iaW9wc2llcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKWAKICAgICAgICAqIEFsbCBiaW9wc3kgc2FtcGxlcyBhcmUgdmlzaXQgMS4KICAgICogIEVvc2lub3BoaWxzOiBgciBhbGxfdHlwZXNbWyJlb3Npbm9waGlscyJdXWAsIEN1cmU6IGByIHN1bShwRGF0YSh0Y19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0Y19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKWAKICAgICAgICAqIFYxIEVvc2lub3BoaWxzOiBgciBucm93KHBEYXRhKHRjdjFfZW9zaW5vcGhpbHMpKWAsIEN1cmU6IGByIHN1bShwRGF0YSh0Y3YxX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpYCwgRmFpbDogYHIgc3VtKHBEYXRhKHRjdjFfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAgICAgKiBWMiBFb3Npbm9waGlsczogYHIgbnJvdyhwRGF0YSh0Y3YyX2Vvc2lub3BoaWxzKSlgLCBDdXJlOiBgciBzdW0ocERhdGEodGN2Ml9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0Y3YyX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpYAogICAgICAgICogVjMgRW9zaW5vcGhpbHM6IGByIG5yb3cocERhdGEodGN2M19lb3Npbm9waGlscykpYCwgQ3VyZTogYHIgc3VtKHBEYXRhKHRjdjNfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIilgLCBGYWlsOiBgciBzdW0ocERhdGEodGN2M19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKWAKICAgICogIE1vbm9jeXRlczogYHIgYWxsX3R5cGVzW1sibW9ub2N5dGVzIl1dYCwgQ3VyZTogYHIgc3VtKHBEYXRhKHRjX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0Y19tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAgICAgKiBWMSBNb25vY3l0ZXM6IGByIG5yb3cocERhdGEodGN2MV9tb25vY3l0ZXMpKWAsIEN1cmU6IGByIHN1bShwRGF0YSh0Y3YxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0Y3YxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKWAKICAgICAgICAqIFYyIE1vbm9jeXRlczogYHIgbnJvdyhwRGF0YSh0Y3YyX21vbm9jeXRlcykpYCwgQ3VyZTogYHIgc3VtKHBEYXRhKHRjdjJfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpYCwgRmFpbDogYHIgc3VtKHBEYXRhKHRjdjJfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpYAogICAgICAgICogVjMgTW9ub2N5dGVzOiBgciBucm93KHBEYXRhKHRjdjNfbW9ub2N5dGVzKSlgLCBDdXJlOiBgciBzdW0ocERhdGEodGN2M19tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIilgLCBGYWlsOiBgciBzdW0ocERhdGEodGN2M19tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAqICBOZXV0cm9waGlsczogYHIgYWxsX3R5cGVzW1sibmV1dHJvcGhpbHMiXV1gLCBDdXJlOiBgciBzdW0ocERhdGEodGNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIilgLCBGYWlsOiBgciBzdW0ocERhdGEodGNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAgICAgKiBWMSBOZXV0cm9waGlsczogYHIgbnJvdyhwRGF0YSh0Y3YxX25ldXRyb3BoaWxzKSlgLCBDdXJlOiBgciBzdW0ocERhdGEodGN2MV9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0Y3YxX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpYAogICAgICAgICogVjIgTmV1dHJvcGhpbHM6IGByIG5yb3cocERhdGEodGN2Ml9uZXV0cm9waGlscykpYCwgQ3VyZTogYHIgc3VtKHBEYXRhKHRjdjJfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIilgLCBGYWlsOiBgciBzdW0ocERhdGEodGN2Ml9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKWAKICAgICAgICAqIFYzIE5ldXRyb3BoaWxzOiBgciBucm93KHBEYXRhKHRjdjNfbmV1dHJvcGhpbHMpKWAsIEN1cmU6IGByIHN1bShwRGF0YSh0Y3YzX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpYCwgRmFpbDogYHIgc3VtKHBEYXRhKHRjdjNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCgojIERhdGFzZXQ6IE9ubHkgVHVtYWNvIHNhbXBsZXMKCk91ciByZWNlbnQgZGlzY3Vzc2lvbnMgaGF2ZSBzZXR0bGVkIG9uZSBiaWcgcXVlc3Rpb24gcmVnYXJkaW5nIHdoaWNoCnNhbXBsZXMgdG8gdXNlOiAgV2Ugd2lsbCBsaW1pdCBvdXIgYW5hbHlzZXMgdG8gb25seSB0aG9zZSBzYW1wbGVzIGZyb20KVHVtYWNvLgoKVGhlIGZvbGxvd2luZyBibG9jayB3aWxsIHRoZXJlZm9yZSBzZXQgdGhhdCBncm91cCBhcyBvdXIgZGVmYXVsdCBmb3IKZnV0dXJlIGFuYWx5c2VzLgoKYGBge3IgdHVtYWNvX29ubHl9CnRfY2xpbmljYWwgPC0gdGNfY2xpbmljYWwgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J1R1bWFjbyciKQpzYXZlKGxpc3QgPSAidF9jbGluaWNhbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF9jbGluaWNhbC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfY2xpbmljYWwiKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9jbGluaWNhbCwgY29udmVydCA9ICJjcG0iKQp0X2NsaW5pY2FsX2NwbV92YXJpYW5jZSA8LSB2YXJpYW5jZV9leHB0KGNwbV9kYXRhKQojIyBBZGQgdmFyaWFuY2UgYnkgZ2VuZSBmb3IgYWxsIHNhbXBsZXMgZXhjbHVkaW5nIGJpb3BzaWVzIChJIGFzc3VtZSBhbHNvIGV4Y2x1ZGluZyBDYWxpKS4KIyMgVGhpcyBpcyBpbnRlbmRlZCB0byBhZGRyZXNzIGEgcXVlcnkgZnJvbSBNYXJpYSBBZGVsYWlkYSBvbiAyMDIzMDExMQoKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X3R1bWFjby90X2NsaW5pY2FsX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9jbGluaWNhbCwgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vdF9jbGluaWNhbC12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWwsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X3R1bWFjby90X2NsaW5pY2FsX2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWwsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90X2NsaW5pY2FsX3N2YS12e3Zlcn0uY3N2IikpCndyaXR0ZW5fZXhwdCA8LSB3cml0ZV9leHB0KAogICAgdF9jbGluaWNhbCwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS94bHN4L3RfY2xpbmljYWwtdnt2ZXJ9Lnhsc3giKSkKCnRfY2xpbmljYWxfbm9iaW9wIDwtIHN1YnNldF9leHB0KHRfY2xpbmljYWwsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscyE9J2Jpb3BzeSciKQpzYXZlKGxpc3QgPSAidF9jbGluaWNhbF9ub2Jpb3AiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfY2xpbmljYWxfbm9iaW9wLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF9jbGluaWNhbF9ub2Jpb3AiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsX25vYmlvcCwgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL3RfY2xpbmljYWxfbm9iaW9wX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9jbGluaWNhbCwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL3RfY2xpbmljYWxfc3ZhLXZ7dmVyfS5jc3YiKSkKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfY2xpbmljYWxfbm9iaW9wLCBjb252ZXJ0ID0gImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdF9jbGluaWNhbF9ub2Jpb3BfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9jbGluaWNhbF9ub2Jpb3AsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90X2NsaW5pY2FsX25vYmlvcF9zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBQdWxsIG91dCB0aGUgdG9wLW4gbW9zdCB2YXJpYW50IGdlbmVzCgpJIGFkZGVkIGEgZmV3IGNvbHVtbnMgdG8gdGhlIGNsaW5pY2FsIGdlbmUgYW5ub3RhdGlvbnMgcmVmbGVjdGluZyB0aGUKdmFyaWFuY2Uvc3RkZXYvbWVhbiBleHByZXNzaW9uIG9mIGVhY2ggZ2VuZS4gIFRoaXMgcmVhbGx5IGhpZ2hsaWdodHMKdGhlIGV4dHJhb3JkaW5hcnkgZGVncmVlIHRvIHdoaWNoIGdlbmVzIGFyZSBjaGFuZ2luZyBpbiB0aGUgZGF0YS4uLgoKYGBge3IgZ2V0X2hpZ2hfdmFyfQp0b3BfZXhwdCA8LSBub3JtYWxpemVfZXhwdCh0X2NsaW5pY2FsX2NwbV92YXJpYW5jZSwgZmlsdGVyID0gVFJVRSkgJT4lCiAgdmFyaWFuY2VfZXhwdCgpCnRvcF9mZCA8LSBmRGF0YSh0b3BfZXhwdCkKdG9wX2V4IDwtIGV4cHJzKHRvcF9leHB0KQppZHggPC0gb3JkZXIodG9wX2ZkW1siZXhwcnNfZ2VuZV9zdGRldiJdXSwgZGVjcmVhc2luZyA9IFRSVUUpCnRvcF9kZiA8LSB0b3BfZmRbaWR4LCBdCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGRhdGEgPSBoZWFkKHRvcF9mZCwgbiA9IDEwMCksCiAgICBleGNlbCA9IGdsdWUoImV4Y2VsL3RfY2xpbmljYWxfY3BtX3N0ZGV2X3RvcDEwMC12e3Zlcn0ueGxzeCIpKQoKYm90dG9tX2V4cHQgPC0gbm9ybWFsaXplX2V4cHQodF9jbGluaWNhbF9jcG1fdmFyaWFuY2UsIGZpbHRlciA9ICJzaW1wbGUiLCB0aHJlc2hvbGQgPSA1MDApICU+JQogIHZhcmlhbmNlX2V4cHQoKQpib3R0b21fZmQgPC0gZkRhdGEoYm90dG9tX2V4cHQpCmJvdHRvbV9leCA8LSBleHBycyhib3R0b21fZXhwdCkKaWR4IDwtIG9yZGVyKGJvdHRvbV9mZFtbImV4cHJzX2dlbmVfc3RkZXYiXV0pCmJvdHRvbSA8LSBib3R0b21fZmRbaWR4LCBdCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGRhdGEgPSBoZWFkKGJvdHRvbV9mZCwgbiA9IDEwMCksCiAgICBleGNlbCA9IGdsdWUoImV4Y2VsL3RfY2xpbmljYWxfY3BtX3N0ZGV2X2JvdHRvbTEwMC12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIFN1bW1hcml6ZTogQ29sbGVjdCBUdW1hY28gc2FtcGxlIG51bWJlcnMuCgpBdCBsZWFzdCBpbiB0aGVvcnksIGV2ZXJ5dGhpbmcgd2hpY2ggZm9sbG93cyB3aWxsIGJlIHVzaW5nIHRoZSBhYm92ZQonY2xpbmljYWwnIGRhdGEgc3RydWN0dXJlLiAgVGh1cywgbGV0IHVzIGNvdW50IGl0IHVwIGFuZCBnZXQgYSBzZW5zZQpvZiB3aGF0IHdlIHdpbGwgd29yayB3aXRoLgoKYGBge3IgY291bnRfdHVtYWNvfQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRkcnVnKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRjbGluaWMpCnRhYmxlKHBEYXRhKHRfY2xpbmljYWwpJGZpbmFsb3V0Y29tZSkKdGFibGUocERhdGEodF9jbGluaWNhbCkkdHlwZW9mY2VsbHMpCnRhYmxlKHBEYXRhKHRfY2xpbmljYWwpJHZpc2l0KQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodF9jbGluaWNhbCkkZWJfbGNfdGllbXBvX2V2b2x1Y2lvbikpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0X2NsaW5pY2FsKSRlYl9sY190dG9fbWN0b19nbHVjYW5fZG9zaXMpKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEodF9jbGluaWNhbCkkdjNfbGNfZWpleV9sZXNpb25fbW1fMSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YSh0X2NsaW5pY2FsKSR2M19sY19sZXNpb25fYXJlYV8xKSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKHRfY2xpbmljYWwpJHYzX2xjX2VqZXhfdWxjZXJhX21tXzEpKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRlYl9sY19zZXhvKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRlYl9sY19ldG5pYSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKHRfY2xpbmljYWwpJGVkYWQpKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRlYl9sY19wZXNvKQp0YWJsZShwRGF0YSh0X2NsaW5pY2FsKSRlYl9sY19lc3RhdHVyYSkKCmxlbmd0aCh1bmlxdWUocERhdGEodF9jbGluaWNhbClbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpvbmx5X2N1cmUgPC0gcERhdGEodF9jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiCmNfbWV0YSA8LSBwRGF0YSh0X2NsaW5pY2FsKVtvbmx5X2N1cmUsIF0KbGVuZ3RoKHVuaXF1ZShjX21ldGFbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpvbmx5X2ZhaWwgPC0gcERhdGEodF9jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiCmZfbWV0YSA8LSBwRGF0YSh0X2NsaW5pY2FsKVtvbmx5X2ZhaWwsIF0KbGVuZ3RoKHVuaXF1ZShmX21ldGFbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpgYGAKCiMjIFNwbGl0IHRoZSBkYXRhIGJ5IGN1cmUvZmFpbCBmb3Igc29tZSBjb3VudGluZwoKYGBge3IgdGNfY3VyZV9mYWlsdjJ9CnRfY3VyZSA8LSBzdWJzZXRfZXhwdCh0X2NsaW5pY2FsLCBzdWJzZXQgPSAiZmluYWxvdXRjb21lPT0nY3VyZSciKQp0YWJsZShwRGF0YSh0X2N1cmUpJHZpc2l0bnVtYmVyKQoKdF9mYWlsIDwtIHN1YnNldF9leHB0KHRfY2xpbmljYWwsIHN1YnNldCA9ICJmaW5hbG91dGNvbWU9PSdmYWlsdXJlJyIpCnRhYmxlKHBEYXRhKHRfZmFpbCkkdmlzaXRudW1iZXIpCmBgYAoKIyMgU3Vic2V0OiBDcmVhdGUgVHVtYWNvLXNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSB2YXJpb3VzIHN0cnVjdHVyZXMKCkkgcHJldmlvdXNseSBtYWRlIGEgYnVuY2ggb2YgZGF0YSBzdWJzZXRzIGJ5IHZpc2l0LCBjZWxsIHR5cGUsIGV0Yy4KU28gbGV0IHVzIG92ZXJ3cml0ZSB0aGVtIGFsbCB3aXRoIHZlcnNpb25zIHdoaWNoIGNvbnRhaW4gb25seSB0aGUKVHVtYWNvIHNhbXBsZXMuCgpUaGVyZSBpcyBubyBnb2luZyBiYWNrIHRvIHRoZSBDYWxpIHNhbXBsZXMgYWZ0ZXIgdGhpcyBibG9jayB1bmxlc3Mgd2UKcmVnZW5lcmF0ZSB0aGUgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBleHByZXNzaW9uc2V0cy4KCiMjIyBUdW1hY28gYmlvcHNpZXMKCmBgYHtyIHR1bWFjb19zdWJzZXRzfQp0X2Jpb3BzaWVzIDwtIHRjX2Jpb3BzaWVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdUdW1hY28nIikKc2F2ZShsaXN0ID0gInRfYmlvcHNpZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfYmlvcHNpZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X2Jpb3BzaWVzIikKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9iaW9wc2llcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL3RfYmlvcHNpZXNfY3BtLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2Jpb3BzaWVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL3RfYmlvcHNpZXMtdnt2ZXJ9LmNzdiIpKQoKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9iaW9wc2llcywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL3RfYmlvcHNpZXNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpgYGAKCiMjIyBUdW1hY28gRW9zaW5vcGhpbHMKCmBgYHtyIHR1bWFjb19zdWJzZXRfZW9zaW5vcGhpbHN9CnRfZW9zaW5vcGhpbHMgPC0gdGNfZW9zaW5vcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J1R1bWFjbyciKQpzYXZlKGxpc3QgPSAidF9lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfZW9zaW5vcGhpbHMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdF9lb3Npbm9waGlsc19jcG0tdnt2ZXJ9Lnhsc3giKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL3RfZW9zaW5vcGhpbHNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9lb3Npbm9waGlscywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL3RfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHN1YnNldHMgbW9ub2N5dGVzCgpgYGB7ciB0dW1hY29fc3Vic2V0c19tb25vY3l0ZXN9CnRfbW9ub2N5dGVzIDwtIHRjX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nVHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0X21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF9tb25vY3l0ZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X21vbm9jeXRlcyIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdF9tb25vY3l0ZXNfY3BtLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90X21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdF9tb25vY3l0ZXNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90X21vbm9jeXRlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gc3Vic2V0cyBuZXV0cm9waGlscwoKYGBge3IgdHVtYWNvX3N1YnNldHNfbmV1dHJvcGhpbHN9CnRfbmV1dHJvcGhpbHMgPC0gdGNfbmV1dHJvcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J1R1bWFjbyciKQpzYXZlKGxpc3QgPSAidF9uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF9uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfbmV1dHJvcGhpbHMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdF9uZXV0cm9waGlsc19jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL3RfbmV1dHJvcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdF9uZXV0cm9waGlsc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0X25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vdF9uZXV0cm9waGlsc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gVmlzaXQgMSBzYW1wbGVzCgpgYGB7ciB0dW1hY29fdmlzaXQxX3NhbXBsZXN9CnR2MV9zYW1wbGVzIDwtIHRjdjFfc2FtcGxlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nVHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djFfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYxX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0djFfc2FtcGxlcyIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYxX3NhbXBsZXNfY3BtLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djFfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9zYW1wbGVzLCBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9VFJVRSwgYmF0Y2g9InN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYxX3NhbXBsZXNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYxX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djFfc2FtcGxlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gVmlzaXQgMiBzYW1wbGVzCgpgYGB7ciB0dW1hY29fdmlzaXQyX3NhbXBsZXN9CnR2Ml9zYW1wbGVzIDwtIHRjdjJfc2FtcGxlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nVHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djJfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYyX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0djJfc2FtcGxlcyIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYyX3NhbXBsZXNfY3BtLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djJfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYyX3NhbXBsZXNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djJfc2FtcGxlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gdmlzaXQgMyBzYW1wbGVzCgpgYGB7ciB0dW1hY29fdmlzaXQzX3NhbXBsZXN9CnR2M19zYW1wbGVzIDwtIHRjdjNfc2FtcGxlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nVHVtYWNvJyIpCnNhdmUobGlzdCA9ICJ0djNfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYzX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0djNfc2FtcGxlcyIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYzX3NhbXBsZXNfY3BtLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djNfc2FtcGxlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYzX3NhbXBsZXNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djNfc2FtcGxlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gdmlzaXQxIEVvc2lub3BoaWxzCgpgYGB7ciB0dW1hY29fdmlzaXQxX2Vvc2lucGhpbHN9CnR2MV9lb3Npbm9waGlscyA8LSB0Y3YxX2Vvc2lub3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdUdW1hY28nIikKc2F2ZShsaXN0ID0gInR2MV9lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYxX2Vvc2lub3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYxX2Vvc2lub3BoaWxzIikKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYxX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYxX2Vvc2lub3BoaWxzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYxX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL3R2MV9lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL3R2MV9lb3Npbm9waGlsc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djFfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDIgc2FtcGxlcwoKYGBge3IgdHVtYWNvX3Zpc2l0Ml9lb3Npbm9waGlsX3NhbXBsZXN9CnR2Ml9lb3Npbm9waGlscyA8LSB0Y3YyX2Vvc2lub3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdUdW1hY28nIikKc2F2ZShsaXN0ID0gInR2Ml9lb3Npbm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYyX2Vvc2lub3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYyX2Vvc2lub3BoaWxzIikKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYyX2Vvc2lub3BoaWxzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL3R2Ml9lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL3R2Ml9lb3Npbm9waGlsc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djJfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDMgZW9zaW5vcGhpbAoKYGBge3IgdHVtYWNvX3Zpc2l0M19lb3Npbm9waGlsc30KdHYzX2Vvc2lub3BoaWxzIDwtIHRjdjNfZW9zaW5vcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J1R1bWFjbyciKQpzYXZlKGxpc3QgPSAidHYzX2Vvc2lub3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190djNfZW9zaW5vcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0djNfZW9zaW5vcGhpbHMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X3R1bWFjby90djNfZW9zaW5vcGhpbHNfY3BtLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vdHYzX2Vvc2lub3BoaWxzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYzX2Vvc2lub3BoaWxzX2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKIyMgTm90ZSwgdGhlIGNiY2IgZmlsdGVyIGxlZnQgYmVoaW5kIGEgc3VmZmljaWVudCBudW1iZXIgb2YgemVyb3MgdGhhdCBpdCBjb25mdXNlZCBjcG0uCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfZW9zaW5vcGhpbHMsIGZpbHRlciA9ICJzaW1wbGUiLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vdHYzX2Vvc2lub3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAxIG1vbm9jeXRlcwoKYGBge3IgdHVtYWNvX3Zpc2l0MV9tb25vY3l0ZXN9CnR2MV9tb25vY3l0ZXMgPC0gdGN2MV9tb25vY3l0ZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J1R1bWFjbyciKQpzYXZlKGxpc3QgPSAidHYxX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYxX21vbm9jeXRlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2MV9tb25vY3l0ZXMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYxX21vbm9jeXRlc19jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vdHYxX21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9tb25vY3l0ZXMsIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFLCBiYXRjaD0ic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X3R1bWFjby90djFfbW9ub2N5dGVzX2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djFfbW9ub2N5dGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAyIG1vbm9jeXRlcwoKYGBge3IgdHVtYWNvX3Zpc2l0Ml9tb25vY3l0ZXN9CnR2Ml9tb25vY3l0ZXMgPC0gdGN2Ml9tb25vY3l0ZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J1R1bWFjbyciKQpzYXZlKGxpc3QgPSAidHYyX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYyX21vbm9jeXRlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2Ml9tb25vY3l0ZXMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYyX21vbm9jeXRlc19jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vdHYyX21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X3R1bWFjby90djJfbW9ub2N5dGVzX2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djJfbW9ub2N5dGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdCAzIG1vbm9jeXRlcwoKYGBge3IgdHVtYWNvX3Zpc2l0M19tb25vY3l0ZXN9CnR2M19tb25vY3l0ZXMgPC0gdGN2M19tb25vY3l0ZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J1R1bWFjbyciKQpzYXZlKGxpc3QgPSAidHYzX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYzX21vbm9jeXRlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInR2M19tb25vY3l0ZXMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYzX21vbm9jeXRlc19jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vdHYzX21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X3R1bWFjby90djNfbW9ub2N5dGVzX2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djNfbW9ub2N5dGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFR1bWFjbyB2aXNpdDEgbmV1dHJvcGhpbHMKCmBgYHtyIHR1bWFjb192aXNpdDFfbmV1dHJvcGhpbHN9CnR2MV9uZXV0cm9waGlscyA8LSB0Y3YxX25ldXRyb3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdUdW1hY28nIikKc2F2ZShsaXN0ID0gInR2MV9uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYxX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYxX25ldXRyb3BoaWxzIikKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYxX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYxX25ldXRyb3BoaWxzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYxX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL3R2MV9uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2MV9uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL3R2MV9uZXV0cm9waGlsc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djFfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djFfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDIgbmV1dHJvcGhpbHMKCmBgYHtyIHR1bWFjb192aXNpdDJfbmV1dHJvcGhpbHN9CnR2Ml9uZXV0cm9waGlscyA8LSB0Y3YyX25ldXRyb3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdUdW1hY28nIikKc2F2ZShsaXN0ID0gInR2Ml9uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYyX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYyX25ldXRyb3BoaWxzIikKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYyX25ldXRyb3BoaWxzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYyX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL3R2Ml9uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2Ml9uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL3R2Ml9uZXV0cm9waGlsc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djJfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djJfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgVHVtYWNvIHZpc2l0IDMgbmV1dHJvcGhpbHMKCmBgYHtyIHR1bWFjb192aXNpdDNfbmV1dHJvcGhpbHN9CnR2M19uZXV0cm9waGlscyA8LSB0Y3YzX25ldXRyb3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdUdW1hY28nIikKc2F2ZShsaXN0ID0gInR2M19uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdHYzX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidHYzX25ldXRyb3BoaWxzIikKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF90dW1hY28vdHYzX25ldXRyb3BoaWxzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodHYzX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL3R2M19uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHR2M19uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL3R2M19uZXV0cm9waGlsc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdCh0djNfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90djNfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIERhdGFzZXQ6IE9ubHkgQ2FsaSBzYW1wbGVzCgpPdXIgcmVjZW50IGRpc2N1c3Npb25zIGhhdmUgc2V0dGxlZCBvbmUgYmlnIHF1ZXN0aW9uIHJlZ2FyZGluZyB3aGljaApzYW1wbGVzIHRvIHVzZTogIFdlIHdpbGwgbGltaXQgb3VyIGFuYWx5c2VzIHRvIG9ubHkgdGhvc2Ugc2FtcGxlcyBmcm9tCkNhbGkuCgpUaGUgZm9sbG93aW5nIGJsb2NrIHdpbGwgdGhlcmVmb3JlIHNldCB0aGF0IGdyb3VwIGFzIG91ciBkZWZhdWx0IGZvcgpmdXR1cmUgYW5hbHlzZXMuCgpgYGB7ciBjYWxpX29ubHl9CmNfY2xpbmljYWwgPC0gdGNfY2xpbmljYWwgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J0NhbGknIikKc2F2ZShsaXN0ID0gImNfY2xpbmljYWwiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfY2xpbmljYWwtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX2NsaW5pY2FsIikKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWwsIGNvbnZlcnQgPSAiY3BtIikKY19jbGluaWNhbF9jcG1fdmFyaWFuY2UgPC0gdmFyaWFuY2VfZXhwdChjcG1fZGF0YSkKIyMgQWRkIHZhcmlhbmNlIGJ5IGdlbmUgZm9yIGFsbCBzYW1wbGVzIGV4Y2x1ZGluZyBiaW9wc2llcyAoSSBhc3N1bWUgYWxzbyBleGNsdWRpbmcgQ2FsaSkuCiMjIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWRkcmVzcyBhIHF1ZXJ5IGZyb20gTWFyaWEgQWRlbGFpZGEgb24gMjAyMzAxMTEKCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpL2NfY2xpbmljYWxfY3BtLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2NsaW5pY2FsLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS90X2NsaW5pY2FsLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19jbGluaWNhbCwgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jX2NsaW5pY2FsX2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWwsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jX2NsaW5pY2FsX3N2YS12e3Zlcn0uY3N2IikpCndyaXR0ZW5fZXhwdCA8LSB3cml0ZV9leHB0KAogICAgY19jbGluaWNhbCwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS94bHN4L2NfY2xpbmljYWwtdnt2ZXJ9Lnhsc3giKSkKCmNfY2xpbmljYWxfbm9iaW9wIDwtIHN1YnNldF9leHB0KGNfY2xpbmljYWwsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscyE9J2Jpb3BzeSciKQpzYXZlKGxpc3QgPSAiY19jbGluaWNhbF9ub2Jpb3AiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfY2xpbmljYWxfbm9iaW9wLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY19jbGluaWNhbF9ub2Jpb3AiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2NsaW5pY2FsX25vYmlvcCwgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jX2NsaW5pY2FsX25vYmlvcF9jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWwsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jX2NsaW5pY2FsX3N2YS12e3Zlcn0uY3N2IikpCgpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2NsaW5pY2FsX25vYmlvcCwgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jX2NsaW5pY2FsX25vYmlvcF9jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2NsaW5pY2FsX25vYmlvcCwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2NfY2xpbmljYWxfbm9iaW9wX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIFB1bGwgb3V0IHRoZSB0b3AtbiBtb3N0IHZhcmlhbnQgZ2VuZXMKCkkgYWRkZWQgYSBmZXcgY29sdW1ucyB0byB0aGUgY2xpbmljYWwgZ2VuZSBhbm5vdGF0aW9ucyByZWZsZWN0aW5nIHRoZQp2YXJpYW5jZS9zdGRldi9tZWFuIGV4cHJlc3Npb24gb2YgZWFjaCBnZW5lLiAgVGhpcyByZWFsbHkgaGlnaGxpZ2h0cwp0aGUgZXh0cmFvcmRpbmFyeSBkZWdyZWUgdG8gd2hpY2ggZ2VuZXMgYXJlIGNoYW5naW5nIGluIHRoZSBkYXRhLi4uCgpgYGB7ciBjYWxpX2dldF9oaWdoX3Zhcn0KdG9wX2V4cHQgPC0gbm9ybWFsaXplX2V4cHQoY19jbGluaWNhbF9jcG1fdmFyaWFuY2UsIGZpbHRlciA9IFRSVUUpICU+JQogIHZhcmlhbmNlX2V4cHQoKQp0b3BfZmQgPC0gZkRhdGEodG9wX2V4cHQpCnRvcF9leCA8LSBleHBycyh0b3BfZXhwdCkKaWR4IDwtIG9yZGVyKHRvcF9mZFtbImV4cHJzX2dlbmVfc3RkZXYiXV0sIGRlY3JlYXNpbmcgPSBUUlVFKQp0b3BfZGYgPC0gdG9wX2ZkW2lkeCwgXQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBkYXRhID0gaGVhZCh0b3BfZmQsIG4gPSAxMDApLAogICAgZXhjZWwgPSBnbHVlKCJleGNlbC9jX2NsaW5pY2FsX2NwbV9zdGRldl90b3AxMDAtdnt2ZXJ9Lnhsc3giKSkKCmJvdHRvbV9leHB0IDwtIG5vcm1hbGl6ZV9leHB0KGNfY2xpbmljYWxfY3BtX3ZhcmlhbmNlLCBmaWx0ZXIgPSAic2ltcGxlIiwgdGhyZXNob2xkID0gNTAwKSAlPiUKICB2YXJpYW5jZV9leHB0KCkKYm90dG9tX2ZkIDwtIGZEYXRhKGJvdHRvbV9leHB0KQpib3R0b21fZXggPC0gZXhwcnMoYm90dG9tX2V4cHQpCmlkeCA8LSBvcmRlcihib3R0b21fZmRbWyJleHByc19nZW5lX3N0ZGV2Il1dKQpib3R0b20gPC0gYm90dG9tX2ZkW2lkeCwgXQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBkYXRhID0gaGVhZChib3R0b21fZmQsIG4gPSAxMDApLAogICAgZXhjZWwgPSBnbHVlKCJleGNlbC9jX2NsaW5pY2FsX2NwbV9zdGRldl9ib3R0b20xMDAtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyBTdW1tYXJpemU6IENvbGxlY3QgQ2FsaSBzYW1wbGUgbnVtYmVycy4KCkF0IGxlYXN0IGluIHRoZW9yeSwgZXZlcnl0aGluZyB3aGljaCBmb2xsb3dzIHdpbGwgYmUgdXNpbmcgdGhlIGFib3ZlCidjbGluaWNhbCcgZGF0YSBzdHJ1Y3R1cmUuICBUaHVzLCBsZXQgdXMgY291bnQgaXQgdXAgYW5kIGdldCBhIHNlbnNlCm9mIHdoYXQgd2Ugd2lsbCB3b3JrIHdpdGguCgpgYGB7ciBjb3VudF9jYWxpfQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKSRkcnVnKQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKSRjbGluaWMpCnRhYmxlKHBEYXRhKGNfY2xpbmljYWwpJGZpbmFsb3V0Y29tZSkKdGFibGUocERhdGEoY19jbGluaWNhbCkkdHlwZW9mY2VsbHMpCnRhYmxlKHBEYXRhKGNfY2xpbmljYWwpJHZpc2l0KQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoY19jbGluaWNhbCkkZWJfbGNfdGllbXBvX2V2b2x1Y2lvbikpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShjX2NsaW5pY2FsKSRlYl9sY190dG9fbWN0b19nbHVjYW5fZG9zaXMpKQpzdW1tYXJ5KGFzLm51bWVyaWMocERhdGEoY19jbGluaWNhbCkkdjNfbGNfZWpleV9sZXNpb25fbW1fMSkpCnN1bW1hcnkoYXMubnVtZXJpYyhwRGF0YShjX2NsaW5pY2FsKSR2M19sY19sZXNpb25fYXJlYV8xKSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKGNfY2xpbmljYWwpJHYzX2xjX2VqZXhfdWxjZXJhX21tXzEpKQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKSRlYl9sY19zZXhvKQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKSRlYl9sY19ldG5pYSkKc3VtbWFyeShhcy5udW1lcmljKHBEYXRhKGNfY2xpbmljYWwpJGVkYWQpKQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKSRlYl9sY19wZXNvKQp0YWJsZShwRGF0YShjX2NsaW5pY2FsKSRlYl9sY19lc3RhdHVyYSkKCmxlbmd0aCh1bmlxdWUocERhdGEoY19jbGluaWNhbClbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpvbmx5X2N1cmUgPC0gcERhdGEoY19jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiCmNfbWV0YSA8LSBwRGF0YShjX2NsaW5pY2FsKVtvbmx5X2N1cmUsIF0KbGVuZ3RoKHVuaXF1ZShjX21ldGFbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpvbmx5X2ZhaWwgPC0gcERhdGEoY19jbGluaWNhbClbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiCmZfbWV0YSA8LSBwRGF0YShjX2NsaW5pY2FsKVtvbmx5X2ZhaWwsIF0KbGVuZ3RoKHVuaXF1ZShmX21ldGFbWyJjb2RpZ29fcGFjaWVudGUiXV0pKQpgYGAKCiMjIFNwbGl0IHRoZSBkYXRhIGJ5IGN1cmUvZmFpbCBmb3Igc29tZSBjb3VudGluZwoKYGBge3IgdGNfY3VyZV9mYWlsdjJ9CmNhbGlfY3VyZSA8LSBzdWJzZXRfZXhwdChjX2NsaW5pY2FsLCBzdWJzZXQgPSAiZmluYWxvdXRjb21lPT0nY3VyZSciKQp0YWJsZShwRGF0YShjYWxpX2N1cmUpJHZpc2l0bnVtYmVyKQoKY2FsaV9mYWlsIDwtIHN1YnNldF9leHB0KGNfY2xpbmljYWwsIHN1YnNldCA9ICJmaW5hbG91dGNvbWU9PSdmYWlsdXJlJyIpCnRhYmxlKHBEYXRhKGNhbGlfZmFpbCkkdmlzaXRudW1iZXIpCmBgYAoKIyMgU3Vic2V0OiBDcmVhdGUgQ2FsaS1zcGVjaWZpYyB2ZXJzaW9ucyBvZiB0aGUgdmFyaW91cyBzdHJ1Y3R1cmVzCgpJIHByZXZpb3VzbHkgbWFkZSBhIGJ1bmNoIG9mIGRhdGEgc3Vic2V0cyBieSB2aXNpdCwgY2VsbCB0eXBlLCBldGMuClNvIGxldCB1cyBvdmVyd3JpdGUgdGhlbSBhbGwgd2l0aCB2ZXJzaW9ucyB3aGljaCBjb250YWluIG9ubHkgdGhlCkNhbGkgc2FtcGxlcy4KClRoZXJlIGlzIG5vIGdvaW5nIGJhY2sgdG8gdGhlIENhbGkgc2FtcGxlcyBhZnRlciB0aGlzIGJsb2NrIHVubGVzcyB3ZQpyZWdlbmVyYXRlIHRoZSBkYXRhIGZyb20gdGhlIG9yaWdpbmFsIGV4cHJlc3Npb25zZXRzLgoKIyMjIENhbGkgYmlvcHNpZXMKCmBgYHtyIGNhbGlfc3Vic2V0c30KY19iaW9wc2llcyA8LSB0Y19iaW9wc2llcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nQ2FsaSciKQpzYXZlKGxpc3QgPSAiY19iaW9wc2llcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY19iaW9wc2llcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfYmlvcHNpZXMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX2Jpb3BzaWVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpYy9jX2Jpb3BzaWVzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19iaW9wc2llcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jX2Jpb3BzaWVzLXZ7dmVyfS5jc3YiKSkKCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfYmlvcHNpZXMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X2NhbGkvY19iaW9wc2llc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCmBgYAoKIyMjIENhbGkgRW9zaW5vcGhpbHMKCmBgYHtyIGNhbGlfc3Vic2V0X2Vvc2lub3BoaWxzfQpjX2Vvc2lub3BoaWxzIDwtIHRjX2Vvc2lub3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdDYWxpJyIpCnNhdmUobGlzdCA9ICJjX2Vvc2lub3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jX2Vvc2lub3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY19lb3Npbm9waGlscyIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X2NhbGkvY19lb3Npbm9waGlsc19jcG0tdnt2ZXJ9Lnhsc3giKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jX2Vvc2lub3BoaWxzX2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jX2Vvc2lub3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgc3Vic2V0cyBtb25vY3l0ZXMKCmBgYHtyIGNhbGlfc3Vic2V0c19tb25vY3l0ZXN9CmNfbW9ub2N5dGVzIDwtIHRjX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nQ2FsaSciKQpzYXZlKGxpc3QgPSAiY19tb25vY3l0ZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY19tb25vY3l0ZXMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX21vbm9jeXRlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jX21vbm9jeXRlc19jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2NfbW9ub2N5dGVzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X2NhbGkvY19tb25vY3l0ZXNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jX21vbm9jeXRlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBDYWxpIHN1YnNldHMgbmV1dHJvcGhpbHMKCmBgYHtyIGNhbGlfc3Vic2V0c19uZXV0cm9waGlsc30KY19uZXV0cm9waGlscyA8LSB0Y19uZXV0cm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nQ2FsaSciKQpzYXZlKGxpc3QgPSAiY19uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY19uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfbmV1dHJvcGhpbHMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpL2NfbmV1dHJvcGhpbF9jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2NfbmV1dHJvcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpL2NfbmV1dHJvcGhpbHNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY19uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2NfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSBWaXNpdCAxIHNhbXBsZXMKCmBgYHtyIGNhbGlfdmlzaXQxX3NhbXBsZXN9CmN2MV9zYW1wbGVzIDwtIHRjdjFfc2FtcGxlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nQ2FsaSciKQpzYXZlKGxpc3QgPSAiY3YxX3NhbXBsZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2MV9zYW1wbGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY3YxX3NhbXBsZXMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jdjFfc2FtcGxlc19jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2N2MV9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX3NhbXBsZXMsIGNvbnZlcnQgPSAgImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpL2N2MV9zYW1wbGVzX2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vY3YxX3NhbXBsZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSBWaXNpdCAyIHNhbXBsZXMKCmBgYHtyIGNhbGlfdmlzaXQyX3NhbXBsZXN9CmN2Ml9zYW1wbGVzIDwtIHRjdjJfc2FtcGxlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nQ2FsaSciKQpzYXZlKGxpc3QgPSAiY3YyX3NhbXBsZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2Ml9zYW1wbGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY3YyX3NhbXBsZXMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfc2FtcGxlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jdjJfc2FtcGxlc19jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9zYW1wbGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2N2Ml9zYW1wbGVzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX3NhbXBsZXMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X2NhbGkvY3YyX3NhbXBsZXNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jdjJfc2FtcGxlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBDYWxpIHZpc2l0IDMgc2FtcGxlcwoKYGBge3IgY2FsaV92aXNpdDNfc2FtcGxlc30KY3YzX3NhbXBsZXMgPC0gdGN2M19zYW1wbGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdDYWxpJyIpCnNhdmUobGlzdCA9ICJjdjNfc2FtcGxlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YzX3NhbXBsZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjNfc2FtcGxlcyIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19zYW1wbGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpL2N2M19zYW1wbGVzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX3NhbXBsZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vY3YzX3NhbXBsZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfc2FtcGxlcywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jdjNfc2FtcGxlc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfc2FtcGxlcywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2N2M19zYW1wbGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQxIEVvc2lub3BoaWxzCgpgYGB7ciBjYWxpX3Zpc2l0MV9lb3NpbnBoaWxzfQpjdjFfZW9zaW5vcGhpbHMgPC0gdGN2MV9lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nQ2FsaSciKQpzYXZlKGxpc3QgPSAiY3YxX2Vvc2lub3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjFfZW9zaW5vcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjFfZW9zaW5vcGhpbHMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X2NhbGkvY3YxX2Vvc2lub3BoaWxzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2N2MV9lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jdjFfZW9zaW5vcGhpbHNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vY3YxX2Vvc2lub3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMiBzYW1wbGVzCgpgYGB7ciBjYWxpX3Zpc2l0Ml9lb3Npbm9waGlsX3NhbXBsZXN9CmN2Ml9lb3Npbm9waGlscyA8LSB0Y3YyX2Vvc2lub3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdDYWxpJyIpCnNhdmUobGlzdCA9ICJjdjJfZW9zaW5vcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2Ml9lb3Npbm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2Ml9lb3Npbm9waGlscyIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jdjJfZW9zaW5vcGhpbHNfY3BtLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vY3YyX2Vvc2lub3BoaWxzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX2Vvc2lub3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpL2N2Ml9lb3Npbm9waGlsc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfZW9zaW5vcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jdjJfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSB2aXNpdCAzIGVvc2lub3BoaWwKCmBgYHtyIGNhbGlfdmlzaXQzX2Vvc2lub3BoaWxzfQpjdjNfZW9zaW5vcGhpbHMgPC0gdGN2M19lb3Npbm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nQ2FsaSciKQpzYXZlKGxpc3QgPSAiY3YzX2Vvc2lub3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjNfZW9zaW5vcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjNfZW9zaW5vcGhpbHMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfZW9zaW5vcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X2NhbGkvY3YzX2Vvc2lub3BoaWxzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX2Vvc2lub3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2N2M19lb3Npbm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19lb3Npbm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jdjNfZW9zaW5vcGhpbHNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQojIyBOb3RlLCB0aGUgY2JjYiBmaWx0ZXIgbGVmdCBiZWhpbmQgYSBzdWZmaWNpZW50IG51bWJlciBvZiB6ZXJvcyB0aGF0IGl0IGNvbmZ1c2VkIGNwbS4KcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19lb3Npbm9waGlscywgZmlsdGVyID0gInNpbXBsZSIsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jdjNfZW9zaW5vcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSB2aXNpdCAxIG1vbm9jeXRlcwoKYGBge3IgY2FsaV92aXNpdDFfbW9ub2N5dGVzfQpjdjFfbW9ub2N5dGVzIDwtIHRjdjFfbW9ub2N5dGVzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdDYWxpJyIpCnNhdmUobGlzdCA9ICJjdjFfbW9ub2N5dGVzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjFfbW9ub2N5dGVzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY3YxX21vbm9jeXRlcyIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X2NhbGkvY3YxX21vbm9jeXRlc19jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vY3YxX21vbm9jeXRlcy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9tb25vY3l0ZXMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X2NhbGkvY3YxX21vbm9jeXRlc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vY3YxX21vbm9jeXRlc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBDYWxpIHZpc2l0IDIgbW9ub2N5dGVzCgpgYGB7ciBjYWxpX3Zpc2l0Ml9tb25vY3l0ZXN9CmN2Ml9tb25vY3l0ZXMgPC0gdGN2Ml9tb25vY3l0ZXMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J0NhbGknIikKc2F2ZShsaXN0ID0gImN2Ml9tb25vY3l0ZXMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2Ml9tb25vY3l0ZXMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjJfbW9ub2N5dGVzIikKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX21vbm9jeXRlcywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jdjJfbW9ub2N5dGVzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jdjJfbW9ub2N5dGVzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX21vbm9jeXRlcywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jdjJfbW9ub2N5dGVzX2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9tb25vY3l0ZXMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jdjJfbW9ub2N5dGVzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMyBtb25vY3l0ZXMKCmBgYHtyIGNhbGlfdmlzaXQzX21vbm9jeXRlc30KY3YzX21vbm9jeXRlcyA8LSB0Y3YzX21vbm9jeXRlcyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nQ2FsaSciKQpzYXZlKGxpc3QgPSAiY3YzX21vbm9jeXRlcyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YzX21vbm9jeXRlcy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2M19tb25vY3l0ZXMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpL2N2M19tb25vY3l0ZXNfY3BtLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfbW9ub2N5dGVzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2N2M19tb25vY3l0ZXMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfbW9ub2N5dGVzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpL2N2M19tb25vY3l0ZXNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX21vbm9jeXRlcywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2N2M19tb25vY3l0ZXNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSB2aXNpdDEgbmV1dHJvcGhpbHMKCmBgYHtyIGNhbGlfdmlzaXQxX25ldXRyb3BoaWxzfQpjdjFfbmV1dHJvcGhpbHMgPC0gdGN2MV9uZXV0cm9waGlscyAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAiY2xpbmljPT0nQ2FsaSciKQpzYXZlKGxpc3QgPSAiY3YxX25ldXRyb3BoaWxzIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jdjFfbmV1dHJvcGhpbHMtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjdjFfbmV1dHJvcGhpbHMiKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjFfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X2NhbGkvY3YxX25ldXRyb3BoaWxzX2NwbS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBjb252ZXJ0ID0gInJwa20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFfdG9femVybyA9IFRSVUUsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2N2MV9uZXV0cm9waGlscy12e3Zlcn0uY3N2IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2MV9uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jdjFfbmV1dHJvcGhpbHNfY3BtX3N2YS12e3Zlcn0ueGxzeCIpKQpycGttX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YxX25ldXRyb3BoaWxzLCBmaWx0ZXIgPSBUUlVFLCBiYXRjaCA9ICJzdmFzZXEiKSAlPiUKICBub3JtYWxpemVfZXhwdChjb252ZXJ0ID0gInJwa20iLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIiwgbmFfdG9femVybyA9IFRSVUUpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vY3YxX25ldXRyb3BoaWxzX3N2YS12e3Zlcn0uY3N2IikpCmBgYAoKIyMjIENhbGkgdmlzaXQgMiBuZXV0cm9waGlscwoKYGBge3IgY2FsaV92aXNpdDJfbmV1dHJvcGhpbHN9CmN2Ml9uZXV0cm9waGlscyA8LSB0Y3YyX25ldXRyb3BoaWxzICU+JQogIHN1YnNldF9leHB0KHN1YnNldCA9ICJjbGluaWM9PSdDYWxpJyIpCnNhdmUobGlzdCA9ICJjdjJfbmV1dHJvcGhpbHMiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2N2Ml9uZXV0cm9waGlscy12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImN2Ml9uZXV0cm9waGlscyIpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2Ml9uZXV0cm9waGlscywgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfY2FsaS9jdjJfbmV1dHJvcGhpbHNfY3BtLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGNvbnZlcnQgPSAicnBrbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYV90b196ZXJvID0gVFJVRSwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIpCndyaXRlLmNzdih4ID0gYXMuZGF0YS5mcmFtZShleHBycyhycGttX2RhdGEpKSwKICAgICAgICAgIGZpbGUgPSBnbHVlKCJkYXRhL3Jwa20vY3YyX25ldXRyb3BoaWxzLXZ7dmVyfS5jc3YiKSkKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YyX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpL2N2Ml9uZXV0cm9waGlsc19jcG1fc3ZhLXZ7dmVyfS54bHN4IikpCnJwa21fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjJfbmV1dHJvcGhpbHMsIGZpbHRlciA9IFRSVUUsIGJhdGNoID0gInN2YXNlcSIpICU+JQogIG5vcm1hbGl6ZV9leHB0KGNvbnZlcnQgPSAicnBrbSIsIGNvbHVtbiA9ICJtZWFuX2Nkc19sZW4iLCBuYV90b196ZXJvID0gVFJVRSkKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jdjJfbmV1dHJvcGhpbHNfc3ZhLXZ7dmVyfS5jc3YiKSkKYGBgCgojIyMgQ2FsaSB2aXNpdCAzIG5ldXRyb3BoaWxzCgpgYGB7ciBjYWxpX3Zpc2l0M19uZXV0cm9waGlsc30KY3YzX25ldXRyb3BoaWxzIDwtIHRjdjNfbmV1dHJvcGhpbHMgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gImNsaW5pYz09J0NhbGknIikKc2F2ZShsaXN0ID0gImN2M19uZXV0cm9waGlscyIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY3YzX25ldXRyb3BoaWxzLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY3YzX25ldXRyb3BoaWxzIikKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY3YzX25ldXRyb3BoaWxzLCBjb252ZXJ0ID0gImNwbSIpCndyaXR0ZW4gPC0gd3JpdGVfeGxzeCgKICAgIGV4cHJzKGNwbV9kYXRhKSwKICAgIGV4Y2VsID0gZ2x1ZSgiZGF0YS9jcG0vNF9jYWxpL2N2M19uZXV0cm9waGlsc19jcG0tdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgY29udmVydCA9ICJycGttIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hX3RvX3plcm8gPSBUUlVFLCBjb2x1bW4gPSAibWVhbl9jZHNfbGVuIikKd3JpdGUuY3N2KHggPSBhcy5kYXRhLmZyYW1lKGV4cHJzKHJwa21fZGF0YSkpLAogICAgICAgICAgZmlsZSA9IGdsdWUoImRhdGEvcnBrbS9jdjNfbmV1dHJvcGhpbHMtdnt2ZXJ9LmNzdiIpKQpjcG1fZGF0YSA8LSBub3JtYWxpemVfZXhwdChjdjNfbmV1dHJvcGhpbHMsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X2NhbGkvY3YzX25ldXRyb3BoaWxzX2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKcnBrbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGN2M19uZXV0cm9waGlscywgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikgJT4lCiAgbm9ybWFsaXplX2V4cHQoY29udmVydCA9ICJycGttIiwgY29sdW1uID0gIm1lYW5fY2RzX2xlbiIsIG5hX3RvX3plcm8gPSBUUlVFKQp3cml0ZS5jc3YoeCA9IGFzLmRhdGEuZnJhbWUoZXhwcnMocnBrbV9kYXRhKSksCiAgICAgICAgICBmaWxlID0gZ2x1ZSgiZGF0YS9ycGttL2N2M19uZXV0cm9waGlsc19zdmEtdnt2ZXJ9LmNzdiIpKQpgYGAKCiMjIyBUdW1hY28gY29tcGFyZSB2aXNpdHMKCklzIHRoaXMgcmVkdW5kYW50PwoKYGBge3IgY29tcGFyZV9hbGxfdmlzaXRzfQp0X3Zpc2l0IDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9jbGluaWNhbCwgZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAidHlwZW9mY2VsbHMhPSdiaW9wc3knIikKc2F2ZShsaXN0ID0gInRfdmlzaXQiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfdmlzaXQtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X3Zpc2l0IikKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQodF92aXNpdCwgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL3RfdmlzaXRfY3BtLXZ7dmVyfS54bHN4IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KHRfdmlzaXQsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X3R1bWFjby90X3Zpc2l0X2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgVmlzaXQgY3VyZS9mYWlsIGNvbnRyYXN0cwoKYGBge3Igc2V0dXBfdmlzaXRfY2ZfZGF0YV9jb250cmFzdHN9CnZpc2l0X2NmX2V4cHRfZmFjdG9yIDwtIHBhc3RlMCgidiIsIHBEYXRhKHRfY2xpbmljYWwpW1sidmlzaXRudW1iZXIiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YSh0X2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSkKdF92aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnModF9jbGluaWNhbCwgZmFjdCA9IHZpc2l0X2NmX2V4cHRfZmFjdG9yKQpzYXZlKGxpc3QgPSAidF92aXNpdGNmIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190X3Zpc2l0Y2Ytdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X3Zpc2l0Y2YiKQoKdF92aXNpdGNmX2Vvc2lub3BoaWwgPC0gc3Vic2V0X2V4cHQodF92aXNpdGNmLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQpzYXZlKGxpc3QgPSAidF92aXNpdGNmX2Vvc2lub3BoaWwiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfdmlzaXRjZl9lb3Npbm9waGlsLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF92aXNpdGNmX2Vvc2lub3BoaWwiKQoKdF92aXNpdGNmX21vbm9jeXRlIDwtIHN1YnNldF9leHB0KHRfdmlzaXRjZiwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnNhdmUobGlzdCA9ICJ0X3Zpc2l0Y2ZfbW9ub2N5dGUiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfdmlzaXRjZl9tb25vY3l0ZS12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRfdmlzaXRjZl9tb25vY3l0ZSIpCgp0X3Zpc2l0Y2ZfbmV1dHJvcGhpbCA8LSBzdWJzZXRfZXhwdCh0X3Zpc2l0Y2YsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J25ldXRyb3BoaWxzJyIpCnNhdmUobGlzdCA9ICJ0X3Zpc2l0Y2ZfbmV1dHJvcGhpbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF92aXNpdGNmX25ldXRyb3BoaWwtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X3Zpc2l0Y2ZfbmV1dHJvcGhpbCIpCmBgYAoKCiMjIyBDYWxpIGNvbXBhcmUgdmlzaXRzCgpJcyB0aGlzIHJlZHVuZGFudD8KCmBgYHtyIGNhbGlfY29tcGFyZV9hbGxfdmlzaXRzfQpjX3Zpc2l0IDwtIHNldF9leHB0X2NvbmRpdGlvbnMoY19jbGluaWNhbCwgZmFjdCA9ICJ2aXNpdG51bWJlciIpICU+JQogIHNldF9leHB0X2JhdGNoZXMoZmFjdCA9ICJmaW5hbG91dGNvbWUiKSAlPiUKICBzdWJzZXRfZXhwdChzdWJzZXQgPSAidHlwZW9mY2VsbHMhPSdiaW9wc3knIikKc2F2ZShsaXN0ID0gImNfdmlzaXQiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfdmlzaXQtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX3Zpc2l0IikKY3BtX2RhdGEgPC0gbm9ybWFsaXplX2V4cHQoY192aXNpdCwgY29udmVydCA9ICJjcG0iKQp3cml0dGVuIDwtIHdyaXRlX3hsc3goCiAgICBleHBycyhjcG1fZGF0YSksCiAgICBleGNlbCA9IGdsdWUoImRhdGEvY3BtLzRfdHVtYWNvL2NfdmlzaXRfY3BtLXZ7dmVyfS54bHN4IikpCmNwbV9kYXRhIDwtIG5vcm1hbGl6ZV9leHB0KGNfdmlzaXQsIGNvbnZlcnQgPSAiY3BtIiwgZmlsdGVyID0gVFJVRSwgYmF0Y2ggPSAic3Zhc2VxIikKd3JpdHRlbiA8LSB3cml0ZV94bHN4KAogICAgZXhwcnMoY3BtX2RhdGEpLAogICAgZXhjZWwgPSBnbHVlKCJkYXRhL2NwbS80X3R1bWFjby9jX3Zpc2l0X2NwbV9zdmEtdnt2ZXJ9Lnhsc3giKSkKYGBgCgojIyMgVmlzaXQgY3VyZS9mYWlsIGNvbnRyYXN0cwoKYGBge3Igc2V0dXBfdmlzaXRfY2ZfZGF0YV9jb250cmFzdHN9CnZpc2l0X2NmX2V4cHRfZmFjdG9yIDwtIHBhc3RlMCgidiIsIHBEYXRhKGNfY2xpbmljYWwpW1sidmlzaXRudW1iZXIiXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YShjX2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSkKY192aXNpdGNmIDwtIHNldF9leHB0X2NvbmRpdGlvbnMoY19jbGluaWNhbCwgZmFjdCA9IHZpc2l0X2NmX2V4cHRfZmFjdG9yKQpzYXZlKGxpc3QgPSAiY192aXNpdGNmIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM19jX3Zpc2l0Y2Ytdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX3Zpc2l0Y2YiKQoKY192aXNpdGNmX2Vvc2lub3BoaWwgPC0gc3Vic2V0X2V4cHQoY192aXNpdGNmLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQpzYXZlKGxpc3QgPSAiY192aXNpdGNmX2Vvc2lub3BoaWwiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfdmlzaXRjZl9lb3Npbm9waGlsLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAiY192aXNpdGNmX2Vvc2lub3BoaWwiKQoKY192aXNpdGNmX21vbm9jeXRlIDwtIHN1YnNldF9leHB0KGNfdmlzaXRjZiwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnNhdmUobGlzdCA9ICJjX3Zpc2l0Y2ZfbW9ub2N5dGUiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2NfdmlzaXRjZl9tb25vY3l0ZS12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgImNfdmlzaXRjZl9tb25vY3l0ZSIpCgpjX3Zpc2l0Y2ZfbmV1dHJvcGhpbCA8LSBzdWJzZXRfZXhwdChjX3Zpc2l0Y2YsIHN1YnNldCA9ICJ0eXBlb2ZjZWxscz09J25ldXRyb3BoaWxzJyIpCnNhdmUobGlzdCA9ICJjX3Zpc2l0Y2ZfbmV1dHJvcGhpbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfY192aXNpdGNmX25ldXRyb3BoaWwtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJjX3Zpc2l0Y2ZfbmV1dHJvcGhpbCIpCmBgYAoKIyBQZXJzaXN0ZW5jZQoKYGBge3IgcGVyc2lzdGVuY2VfZXhwdH0KdF9wZXJzaXN0ZW5jZSA8LSBzdWJzZXRfZXhwdCh0X2NsaW5pY2FsLCBzdWJzZXQgPSAicGVyc2lzdGVuY2U9PSdZJ3xwZXJzaXN0ZW5jZT09J04nIikgJT4lCiAgc3Vic2V0X2V4cHQoc3Vic2V0ID0gJ3Zpc2l0bnVtYmVyPT0zJykgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gJ3BlcnNpc3RlbmNlJykKc2F2ZShsaXN0ID0gInRfcGVyc2lzdGVuY2UiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX3RfcGVyc2lzdGVuY2Utdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X3BlcnNpc3RlbmNlIikKCnRfcGVyc2lzdGVuY2VfbW9ub2N5dGUgPC0gc3Vic2V0X2V4cHQodF9wZXJzaXN0ZW5jZSwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbW9ub2N5dGVzJyIpCnNhdmUobGlzdCA9ICJ0X3BlcnNpc3RlbmNlX21vbm9jeXRlIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190X3BlcnNpc3RlbmNlX21vbm9jeXRlLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF9wZXJzaXN0ZW5jZV9tb25vY3l0ZSIpCgp0X3BlcnNpc3RlbmNlX25ldXRyb3BoaWwgPC0gc3Vic2V0X2V4cHQodF9wZXJzaXN0ZW5jZSwgc3Vic2V0ID0gInR5cGVvZmNlbGxzPT0nbmV1dHJvcGhpbHMnIikKc2F2ZShsaXN0ID0gInRfcGVyc2lzdGVuY2VfbmV1dHJvcGhpbCIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfdF9wZXJzaXN0ZW5jZV9uZXV0cm9waGlsLXZ7dmVyfS5yZGEiKSkKZGF0YV9zdHJ1Y3R1cmVzIDwtIGMoZGF0YV9zdHJ1Y3R1cmVzLCAidF9wZXJzaXN0ZW5jZV9uZXV0cm9waGlsIikKCnRfcGVyc2lzdGVuY2VfZW9zaW5vcGhpbCA8LSBzdWJzZXRfZXhwdCh0X3BlcnNpc3RlbmNlLCBzdWJzZXQgPSAidHlwZW9mY2VsbHM9PSdlb3Npbm9waGlscyciKQpzYXZlKGxpc3QgPSAidF9wZXJzaXN0ZW5jZV9lb3Npbm9waGlsIiwgZmlsZSA9IGdsdWUoInJkYS90bXJjM190X3BlcnNpc3RlbmNlX2Vvc2lub3BoaWwtdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0X3BlcnNpc3RlbmNlX2Vvc2lub3BoaWwiKQpgYGAKCiMgU2F2ZSBhbGwgZGF0YSBzdHJ1Y3R1cmVzIGludG8gb25lIGJpZyBwaWxlCgpgYGB7ciBzYXZlX2FsbF9kYXRhfQpzYXZlKGxpc3QgPSBkYXRhX3N0cnVjdHVyZXMsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfZGF0YV9zdHJ1Y3R1cmVzLXZ7dmVyfS5yZGEiKSkKYGBgCgojIFN1bW1hcml6ZTogVGFidWxhdGUgc2FtcGxlIG51bWJlcnMKCkhlcmUgaXMgYW4gb3V0bGluZSBvZiB0aGUgc2FtcGxlcyBpbiB0aGVpciBjdXJyZW50IHN0YXRlOgoKKiBCeSB0eXBlOiBgciBuY29sKGV4cHJzKHRfY2xpbmljYWwpKWAsIEN1cmU6IGByIHN1bShwRGF0YSh0X2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpYCwgRmFpbDogYHIgc3VtKHBEYXRhKHRfY2xpbmljYWwpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAqICBCaW9wc3k6IGByIGFsbF90eXBlc1tbImJpb3BzeSJdXWAsIEN1cmU6IGByIHN1bShwRGF0YSh0X2Jpb3BzaWVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpYCwgRmFpbDogYHIgc3VtKHBEYXRhKHRfYmlvcHNpZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAgICAgKiBBbGwgYmlvcHN5IHNhbXBsZXMgYXJlIHZpc2l0IDEuCiAgICAqICBFb3Npbm9waGlsczogYHIgYWxsX3R5cGVzW1siZW9zaW5vcGhpbHMiXV1gLCBDdXJlOiBgciBzdW0ocERhdGEodF9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0X2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpYAogICAgICAgICogVjEgRW9zaW5vcGhpbHM6IGByIG5yb3cocERhdGEodHYxX2Vvc2lub3BoaWxzKSlgLCBDdXJlOiBgciBzdW0ocERhdGEodHYxX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpYCwgRmFpbDogYHIgc3VtKHBEYXRhKHR2MV9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKWAKICAgICAgICAqIFYyIEVvc2lub3BoaWxzOiBgciBucm93KHBEYXRhKHR2Ml9lb3Npbm9waGlscykpYCwgQ3VyZTogYHIgc3VtKHBEYXRhKHR2Ml9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0djJfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAgICAgKiBWMyBFb3Npbm9waGlsczogYHIgbnJvdyhwRGF0YSh0djNfZW9zaW5vcGhpbHMpKWAsIEN1cmU6IGByIHN1bShwRGF0YSh0djNfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIilgLCBGYWlsOiBgciBzdW0ocERhdGEodHYzX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpYAogICAgKiAgTW9ub2N5dGVzOiBgciBhbGxfdHlwZXNbWyJtb25vY3l0ZXMiXV1gLCBDdXJlOiBgciBzdW0ocERhdGEodF9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIilgLCBGYWlsOiBgciBzdW0ocERhdGEodF9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAgICAgKiBWMSBNb25vY3l0ZXM6IGByIG5yb3cocERhdGEodHYxX21vbm9jeXRlcykpYCwgQ3VyZTogYHIgc3VtKHBEYXRhKHR2MV9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIilgLCBGYWlsOiBgciBzdW0ocERhdGEodHYxX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKWAKICAgICAgICAqIFYyIE1vbm9jeXRlczogYHIgbnJvdyhwRGF0YSh0djJfbW9ub2N5dGVzKSlgLCBDdXJlOiBgciBzdW0ocERhdGEodHYyX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0djJfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpYAogICAgICAgICogVjMgTW9ub2N5dGVzOiBgciBucm93KHBEYXRhKHR2M19tb25vY3l0ZXMpKWAsIEN1cmU6IGByIHN1bShwRGF0YSh0djNfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpYCwgRmFpbDogYHIgc3VtKHBEYXRhKHR2M19tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAqICBOZXV0cm9waGlsczogYHIgYWxsX3R5cGVzW1sibmV1dHJvcGhpbHMiXV1gLCBDdXJlOiBgciBzdW0ocERhdGEodF9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0X25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpYAogICAgICAgICogVjEgTmV1dHJvcGhpbHM6IGByIG5yb3cocERhdGEodHYxX25ldXRyb3BoaWxzKSlgLCBDdXJlOiBgciBzdW0ocERhdGEodHYxX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpYCwgRmFpbDogYHIgc3VtKHBEYXRhKHR2MV9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKWAKICAgICAgICAqIFYyIE5ldXRyb3BoaWxzOiBgciBucm93KHBEYXRhKHR2Ml9uZXV0cm9waGlscykpYCwgQ3VyZTogYHIgc3VtKHBEYXRhKHR2Ml9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKWAsIEZhaWw6IGByIHN1bShwRGF0YSh0djJfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIilgCiAgICAgICAgKiBWMyBOZXV0cm9waGlsczogYHIgbnJvdyhwRGF0YSh0djNfbmV1dHJvcGhpbHMpKWAsIEN1cmU6IGByIHN1bShwRGF0YSh0djNfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIilgLCBGYWlsOiBgciBzdW0ocERhdGEodHYzX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpYAoKYGBge3IgdG1wX251bWJlcnN9Cm5jb2woZXhwcnModF9jbGluaWNhbCkpCnN1bShwRGF0YSh0X2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0X2NsaW5pY2FsKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgphbGxfdHlwZXNbWyJiaW9wc3kiXV0Kc3VtKHBEYXRhKHRfYmlvcHNpZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRfYmlvcHNpZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCmFsbF90eXBlc1tbImVvc2lub3BoaWxzIl1dCnN1bShwRGF0YSh0X2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0X2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHR2MV9lb3Npbm9waGlscykpCnN1bShwRGF0YSh0djFfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHR2MV9lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0djJfZW9zaW5vcGhpbHMpKQpzdW0ocERhdGEodHYyX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djJfZW9zaW5vcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodHYzX2Vvc2lub3BoaWxzKSkKc3VtKHBEYXRhKHR2M19lb3Npbm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodHYzX2Vvc2lub3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgphbGxfdHlwZXNbWyJtb25vY3l0ZXMiXV0Kc3VtKHBEYXRhKHRfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0X21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKbnJvdyhwRGF0YSh0djFfbW9ub2N5dGVzKSkKc3VtKHBEYXRhKHR2MV9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHR2MV9tb25vY3l0ZXMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodHYyX21vbm9jeXRlcykpCnN1bShwRGF0YSh0djJfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djJfbW9ub2N5dGVzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHR2M19tb25vY3l0ZXMpKQpzdW0ocERhdGEodHYzX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodHYzX21vbm9jeXRlcylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImZhaWx1cmUiKQoKYWxsX3R5cGVzW1sibmV1dHJvcGhpbHMiXV0Kc3VtKHBEYXRhKHRfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJjdXJlIikKc3VtKHBEYXRhKHRfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodHYxX25ldXRyb3BoaWxzKSkKc3VtKHBEYXRhKHR2MV9uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodHYxX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCgpucm93KHBEYXRhKHR2Ml9tb25vY3l0ZXMpKQpzdW0ocERhdGEodHYyX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiY3VyZSIpCnN1bShwRGF0YSh0djJfbmV1dHJvcGhpbHMpW1siZmluYWxvdXRjb21lIl1dID09ICJmYWlsdXJlIikKCm5yb3cocERhdGEodHYzX25ldXRyb3BoaWxzKSkKc3VtKHBEYXRhKHR2M19uZXV0cm9waGlscylbWyJmaW5hbG91dGNvbWUiXV0gPT0gImN1cmUiKQpzdW0ocERhdGEodHYzX25ldXRyb3BoaWxzKVtbImZpbmFsb3V0Y29tZSJdXSA9PSAiZmFpbHVyZSIpCmBgYAoKYGBge3Igc2F2ZW1lLCBldmFsPUZBTFNFfQppZiAoIWlzVFJVRShnZXQwKCJza2lwX2xvYWQiKSkpIHsKICBwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQogIG1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQogIG1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgc2F2ZWZpbGUpKQogIHRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9c2F2ZWZpbGUpKQp9CmBgYAoKIyBEYXRhc2V0OiBQYXJhc2l0ZSByZWFkcwoKTWFrZSBhbiBleHByZXNzaW9uc2V0IG9mIHRoZSBwYXJhc2l0ZSByZWFkcyBpbiB0aGUgVE1SQzMgc2FtcGxlcyBhbmQKZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgZmF1eCBhbmQgcmVhbCByZWFkcy4KRS5nOiBBcmUgdGhlcmUgc2FtcGxlcyB3aGljaCBkZWZpbml0aXZlbHkgY29udGFpbiBwYXJhc2l0ZXM/CgpMYXRlciwgSSBtYW51YWxseSB3ZW50IHRocm91Z2ggdGhlIG1hcHBpbmdzIG9mIHNhbXBsZXMgd2l0aCBhCnNpZ25pZmljYW50IG51bWJlciBvZiBwYXJhc2l0ZSByZWFkcyBpbiBJR1Ygd2l0aCBzb21lIFRNUkMyIGtub3duCnp5bW9kZW1lIHNhbXBsZXMuICBJbiBtYW55IGNhc2VzIGl0IGlzIHBvc3NpYmxlIHRvIHN0YXRlIGRlZmluaXRpdmVseQp0aGUgY2xhc3NpZmljYXRpb24gb2YgdGhlIHBhcmFzaXRlIHdoaWNoIGluZmVjdGVkIGFuIGluZGl2aWR1YWwuCgpgYGB7ciBwYXJhc2l0ZV9leHB0fQp0bXJjM19scF9leHB0IDwtIHNtKGNyZWF0ZV9leHB0KAogIHNhbXBsZXNoZWV0LAogIGZpbGVfY29sdW1uID0gImxwYW5hbWVuc2lzdjM2aGlzYXRmaWxlIiwgZ2VuZV9pbmZvID0gTlVMTCkpICU+JQogIHN1YnNldF9leHB0KGNvdmVyYWdlID0gMTAwMCkgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gInR5cGVvZmNlbGxzIikKdmlzaXRfZmFjdCA8LSBwRGF0YSh0bXJjM19scF9leHB0KVtbInZpc2l0bnVtYmVyIl1dCmJhdGNoX25hIDwtIGlzLm5hKHZpc2l0X2ZhY3QpCnZpc2l0X2ZhY3RbYmF0Y2hfbmFdIDwtICJ1bmRlZmluZWQiCmxwX2V4cHQgPC0gc2V0X2V4cHRfYmF0Y2hlcyh0bXJjM19scF9leHB0LCBmYWN0ID0gdmlzaXRfZmFjdCkKc2F2ZShsaXN0ID0gInRtcmMzX2xwX2V4cHQiLCBmaWxlID0gZ2x1ZSgicmRhL3RtcmMzX2xwX2V4cHRfYWxsX3Nhbml0aXplZC12e3Zlcn0ucmRhIikpCmRhdGFfc3RydWN0dXJlcyA8LSBjKGRhdGFfc3RydWN0dXJlcywgInRtcmMzX2xwX2V4cHQiKQpgYGAKClRoZSBhYm92ZSBibG9jayBpcyBzaW1pbGFyIGluIGNvbmNlcHQgdG8gdGhlIHByZXZpb3VzIGV4cHJlc3Npb25zZXQKY3JlYXRpb24uICBJdCB1c2VzIGEgZGlmZmVyZW50IGNvbHVtbiBhbmQgY3VycmVudGx5IGlnbm9yZXMgdGhlIGdlbmUKYW5ub3RhdGlvbnMuICBHaXZlbiB0aGF0IG1hbnkgb2YgdGhlIHNhbXBsZXMgaGF2ZSBlc3NlbnRpYWxseSAwIHJlYWRzLApJIHNldCBhIGN1dG9mZiBvZiBvbmx5IDIwIG9ic2VydmVkIGdlbmVzLiAgRmluYWxseSwgSSBkaWQgYSBxdWljayBhbmQKZGlydHkgUENBIHBsb3Qgb2YgdGhpcyBwZWN1bGlhciBkYXRhIHN0cnVjdHVyZSBpbiB0aGUgaG9wZXMgb2YgYmVpbmcKYWJsZSB0byAnc2VlJyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHdoYXQgYXJlIGFzc3VtZWQgdG8gYmUgJ3JlYWwnCnNhbXBsZXMgd2l0aCBhIHNpZ25pZmljYW50IG51bWJlciBvZiAncmVhbCcgcGFyYXNpdGUgcmVhZHMgdnMuIHRob3NlCnNhbXBsZXMgd2hpY2gganVzdCBoYXZlIGEgY291cGxlIG9mIHBvdGVudGlhbGx5IHNwdXJpb3VzIHJlYWRzLgoKIyBBbiBleHRlcm5hbCBkYXRhc2V0CgpgYGB7ciBzY290dF9leHRlcm5hbH0KbmV3X3NhbXBsZV9zaGVldCA8LSBnYXRoZXJfcHJlcHJvY2Vzc2luZ19tZXRhZGF0YSgic2FtcGxlX3NoZWV0cy9zY290dF9zcmFfc2FtcGxlcy54bHN4IikKCnRtcmMzX2V4dGVybmFsX2NmIDwtIGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL3Njb3R0X3NyYV9zYW1wbGVzX21vZGlmaWVkLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm8gPSBoc19hbm5vdCwgZmlsZV9jb2x1bW4gPSAiaGlzYXRjb3VudHRhYmxlIikgJT4lCiAgc2V0X2V4cHRfY29uZGl0aW9ucyhmYWN0ID0gInRyZWF0bWVudG91dGNvbWUiKSAlPiUKICBzZXRfZXhwdF9iYXRjaGVzKGZhY3QgPSAic2V4IikKCnNhdmUobGlzdCA9ICJ0bXJjM19leHRlcm5hbF9jZiIsIGZpbGUgPSBnbHVlKCJyZGEvdG1yYzNfZXh0ZXJuYWxfY2Ytdnt2ZXJ9LnJkYSIpKQpkYXRhX3N0cnVjdHVyZXMgPC0gYyhkYXRhX3N0cnVjdHVyZXMsICJ0bXJjM19leHRlcm5hbF9jZiIpCmBgYAoKYGBge3IgbG9hZG1lX2FmdGVyLCBldmFsPUZBTFNFfQp0bXAgPC0gbG9hZG1lKGZpbGVuYW1lID0gc2F2ZWZpbGUpCmBgYAo=