1 Notes:

1.1 Querying Dr. Mosser 20230123

  • Question from Najib: Connection between 5’ libraries and VDJ, tags are in fact shared from VDJ/surface to the ‘parent’ GEM. April: Do GEM generation, then split the resulting cDNA at cleanup step to the protein barcode set (at bead cleanup), then go into regular 5’ expression library, from which a set of specific primers are used to enrich the VDJ portion. Thus all three have the same parental cell tag.
  • Question from April: Do we need to change the inputs; from how many cells did we recover reads? He wants 10,000 cells / animal. April pooled according to 10x recommendations: 1:4 VDJ:expression library. Surface protein libraries have not yet been run, these have separate indexes and are much shorter; in contrast the VDJ/expression libraries are relatively similar (550 vs 630 nt).
  • From Najib: why 5’ vs 3’ capture? Not entirely certain, but 5’ kit is used for immunology usually, apparently.
  • Questions about the cell preparations: what was the status of the cells at GEM generation? Can we learn if that affected the number of cells observed, reads/cell? Can April tweak the sequencing library inputs to help even out the differences across samples for future runs (given that there are 3(I think) coming up)? Conversely, should I reprocess the samples so that all samples are perceived as having the least number of cells observed?
  • Quick primer of recombination and V(D)J: each receptor is heterodimer, heavy chain has the constant, V, D, and J. Conversely the light chain has the constant and the VJ. In T-cells, allelic exclusion results in a single resulting expresison event. In B-cells there may be many. In-toto there is a near-infinite random set of possibilities; these are all randomly generated during development. B-cells are constantly making new combinations during the lifespan – T-cells are long-lived and constant (Dave explained an experiment where someone transferred T-cells from mouse to mouse over the course of many years). (orientation 5’->3’? constant->D->J?)
  • Every cell that was sequenced is in theory a T-cell (“lung infected T-cells from mice), so should all have VDJ sequences. A small set of immune cells (NK) do not have these.

1.2 Checkin meeting with Dr. Park 20230124

  • April describing observations, cell #s etc.
  • Definitely not FACS, performed negative enrichment which in theory gets >= 90% pure samples.
  • Najib query: limit to VDJ cells only? Unlikely.
  • It sounds to me that the likely tasks I perform are not needed by Dr. Park.

2 TODO:

  • Check expression of the samples for levels of CD3.
  • Print out filtered amounts on a per-sample basis.
  • Query mSigDB categories of interest (currently I grabbed the ~98 influenza categories arbitrarily): e.g. figure out which ones are actually relevant.

3 Changelog

4 Preprocessing with cellranger

I downloaded a new version of cellranger along with the various reference files provided by 10x for the VD(J) references etc. I got a bit distracted by the pipeline language implemented by 10x called ‘martian’. I have the feeling that it might prove a good thing to play with.

Here are the commands I ran to separate the samples and perform the alignments. There are 4 sample names and each was done with one run of the ‘normal’ GEX scRNASeq method and one of the (new to me) V(D)J library.

5 Rerun the pipeline with multi

April kindly sent some information from 10x which shows that I should have used the multi pipline when preprocessing the data.

Intra-Muscular vs. Nasal

I wrote 4 separate configuration csv files using the templates I downloaded and following a little reading. It seemed to me that I should be able to process them all as a single csv file, but when I attempted that, cellranger did not react well. It also took a few tries before I got the various reference/library options correct.

Note that once cellranger successfully ran for the samples I moved them to the multi/ directory so that I can compare the outputs to when I simply did the ‘count’ operation.

The following invocations of cellranger all appear to work without any problems. Ideally I would like them to be done in a single run, though.

5.0.1 Shenanigans for combined VDJ samples

My attempts so far to use the csv configuration to concatenate multiple vdj libraries have not worked, so I chose to do it the stupid way, which is what I should have just done to begin with. Caveat, it works fine for the gex libraries to do it the way the documentation suggests.

cd preprocessing
for i in R1 R2; do
    for j in Control Mock_Mex09 IM_Mex09 IN_Mex09; do
        A_file=$(/bin/ls A_${j}_VDJ*_${i}_001.fastq.gz)
        B_file=$(/bin/ls B_${j}_VDJ*_${i}_001.fastq.gz)
        out_file="Concat_${j}_VDJ_${i}.fastq.gz"
        cp_cmd="cp ${A_file} ${out_file}"
        echo "Running: ${cp_cmd}."
        eval $cp_cmd
        cat_cmd="cat ${B_file} >> ${out_file}"
        echo "Running: ${cat_cmd}."
        eval $cat_cmd
    done
done
module add cellranger
cellranger multi --id control --csv sample_sheets/multi_config_try05_control.csv
cellranger multi --id mock --csv sample_sheets/multi_config_try05_mock.csv
cellranger multi --id m --csv sample_sheets/multi_config_try05_m.csv
cellranger multi --id n --csv sample_sheets/multi_config_try05_n.csv

mv control mock m n 01multi_combined/

6 Annotations

I wonder if I can put the gene annotations into the misc slot of the seurat data structure? And perhaps overload fData() to use it?

annotations <- load_biomart_annotations()$annotation
## The biomart annotations file already exists, loading from it.
brief <- unique(annotations[, c("hgnc_symbol", "description")])

7 Set prefix of the data

#prefix <- "multi"
prefix <- "01multi_combined"

8 Load the data into Seurat and poke at it

The following block is mostly a cut/paste of itself where I set the (over)simplified name of each sample. This then becomes the template for the path and parameters used to read the data, create a seurat object, and add the clonotype data from the vdj run.

For the moment I want to be able to play with the individual samples as well as the aggregate so that I can better understand the data. So I guess it works out that I didn’t figure out how to run all the samples at the same time via ‘cellranger multi’.

I am pretty sure Seurat’s merge() overload allows one to just do ‘merge(a,b,c,d,e…)’ but I am not using that.

I wrote a little function to make loading the Seurat data from a sample sheet easier. My intention is to have some of this code write back to that sample sheet.

all <- create_seurat("sample_sheets/all_samples.csv", vdj_t_column = "vdjtcells")
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## Warning in CheckDuplicateCellNames(object.list = objects): Some cell names are
## duplicated across objects provided. Renaming to enforce unique cell names.

## Warning in CheckDuplicateCellNames(object.list = objects): Some cell names are
## duplicated across objects provided. Renaming to enforce unique cell names.
control_cell_idx <- all[["orig.ident"]] == "control"
control_cells <- all[, control_cell_idx]
mock_cell_idx <- all[["orig.ident"]] == "mock"
mock_cells <- all[, mock_cell_idx]
muscular_cell_idx <- all[["orig.ident"]] == "m"
muscular_cells <- all[, muscular_cell_idx]
nasal_cell_idx <- all[["orig.ident"]] == "n"
nasal_cells <- all[, nasal_cell_idx]

9 Query for clonotypes in the individual samples and the full dataset.

control_clono <- !is.na(control_cells[["raw_clonotype_id"]])
summary(control_clono)
##  raw_clonotype_id
##  Mode :logical   
##  FALSE:13209     
##  TRUE :1971
mock_clono <- !is.na(mock_cells[["raw_clonotype_id"]])
summary(mock_clono)
##  raw_clonotype_id
##  Mode :logical   
##  FALSE:10835     
##  TRUE :3090
m_clono <- !is.na(muscular_cells[["raw_clonotype_id"]])
summary(m_clono)
##  raw_clonotype_id
##  Mode :logical   
##  FALSE:9664      
##  TRUE :4217
n_clono <- !is.na(nasal_cells[["raw_clonotype_id"]])
summary(n_clono)
##  raw_clonotype_id
##  Mode :logical   
##  FALSE:5545      
##  TRUE :3063

10 Initial Clusters

I want to take a couple minutes to add some annotations to the seurat object, notably I want to state the identity relationships with some sort of name.

Thus I will make a vector of the the sample IDs and for each one make a category of self/not-self. Note that Seurat comes with a function ‘FindConservedMarkers()’ or something like that which compares each self to all other samples, so this may be redundant; but it is kind of nice to be able to see the categories as a set of binary indexes.

cluster_letters <- as.factor(LETTERS[Idents(object=all)])
names(cluster_letters) <- colnames(x=all)
sample_ids <- as.character(cluster_letters)

Now that I have 4 identical vectors, fill them with my chosen names for the samples and whether they do(nt) have that identity.

control_idx <- sample_ids == "A"
all[["control_state"]] <- "Stimulated"
all@meta.data[control_idx, "control_state"] <- "Control"

mock_idx <- sample_ids  == "B"
all[["mock_state"]] <- "Not Mock"
all@meta.data[mock_idx, "control_state"] <- "Mock"

mock_idx <- sample_ids  == "C"
all[["muscular_state"]] <- "Not Muscular"
all@meta.data[mock_idx, "muscular_state"] <- "Muscular"

mock_idx <- sample_ids  == "D"
all[["nasal_state"]] <- "Not Nasal"
all@meta.data[mock_idx, "nasal_state"] <- "Nasal"

Now add these categories to the sample metadata. I think this is a good place to consdier having a sample sheet from Dr. Park with whatever other random information might prove interesting about the samples.

11 Filters and QC

Let us start filtering the data, leading off with a definition of the minimum number of RNAs, minimum amount of rRNA, and maximum mitochondrial. In addition, let us print how much of each are observed before filtering. Before we can print/filter these attributes, we must use the PercentageFeatureSet() to get the numbers…

min_num_rna <- 200
min_pct_ribo <- 5
max_pct_mito <- 20

all <- record_seurat_samples(all, type="num_cells")

all[["percent_mt"]] <- PercentageFeatureSet(all, pattern="^mt-")
all[["percent_ribo"]] <- PercentageFeatureSet(all, pattern="^Rp[sl]")

Show the state before filtering on a per-cell basis across all samples. Start with the number of cells

sample_summaries <- as_tibble(data.frame(
    "id" = c("control", "mock", "muscular", "nasal"),
    "start_cells" = c(
        sum(all@meta.data[["orig.ident"]] == "control"),
        sum(all@meta.data[["orig.ident"]] == "mock"),
        sum(all@meta.data[["orig.ident"]] == "m"),
        sum(all@meta.data[["orig.ident"]] == "n"))))
skim(all[["percent_mt"]])
Data summary
Name all[[“percent_mt”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
percent_mt 0 1 2.26 3.32 0 1.28 1.88 2.69 98.86 ▇▁▁▁▁
skim(all[["percent_ribo"]])
Data summary
Name all[[“percent_ribo”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
percent_ribo 0 1 11.26 9.15 0 5.19 7.46 13.84 51.42 ▇▂▁▁▁
skim(all[["nFeature_RNA"]])
Data summary
Name all[[“nFeature_RNA”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
nFeature_RNA 0 1 2078 1242 18 1124 1702 2798 8128 ▇▆▂▁▁
skim(all[["nCount_RNA"]])
Data summary
Name all[[“nCount_RNA”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
nCount_RNA 0 1 5623 5052 500 2141 3659 7659 53836 ▇▁▁▁▁
## Length and reads are for only those cells with clonotypes.
skim(all[["reads"]])
Data summary
Name all[[“reads”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
reads 39253 0.24 4425 4534 24 1639 3089 5505 53188 ▇▁▁▁▁
skim(all[["length"]])
Data summary
Name all[[“length”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
length 39253 0.24 557.5 58.07 402 519 540 570 1004 ▅▇▁▁▁
## How many cells have specific chains associated with them
sum(!is.na(all$chain))
## [1] 12341

And on a per-sample basis with (new to me) skimr, which provides a pretty summary of the category of interest. The way I wrote the following stanzas should also append new columns to my sample_summaries table comprised of the mean values for these elements.

all <- record_seurat_samples(all, type="num_cells") %>%
  record_seurat_samples(type="nFeature_RNA") %>%
  record_seurat_samples(type="nCount_RNA") %>%
  record_seurat_samples(type="reads", column_name="clonotype_reads") %>%
  record_seurat_samples(type="pct_mito", pattern="^mt-") %>%
  record_seurat_samples(type="pct_ribo", pattern="^Rp[sl]")
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             51594     
## Number of columns          45        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd p0   p25   p50
## 1 nFeature_RNA  control            0             1 1999. 1113. 20 1158  1700.
## 2 nFeature_RNA  m                  0             1 2066. 1275. 22 1101  1651 
## 3 nFeature_RNA  mock               0             1 2086. 1218. 18 1149  1734 
## 4 nFeature_RNA  n                  0             1 2224. 1416. 27 1063. 1734.
##     p75 p100 hist 
## 1 2637. 7532 ▇▇▃▁▁
## 2 2778  7590 ▇▆▂▁▁
## 3 2785  7442 ▇▇▃▁▁
## 4 3228  8128 ▇▅▃▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             51594     
## Number of columns          45        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd  p0   p25  p50
## 1 nCount_RNA    control            0             1 5115. 4137. 500 2149  3618
## 2 nCount_RNA    m                  0             1 5729. 5383. 500 2155  3601
## 3 nCount_RNA    mock               0             1 5539. 4862. 500 2144  3665
## 4 nCount_RNA    n                  0             1 6488. 6052. 500 2094. 3912
##     p75  p100 hist 
## 1 7057. 40853 ▇▂▁▁▁
## 2 7642  53707 ▇▁▁▁▁
## 3 7518  44494 ▇▂▁▁▁
## 4 9417. 53836 ▇▂▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             51594     
## Number of columns          45        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd p0   p25  p50
## 1 reads         control        13209         0.130 7066. 6037. 41 3114. 5365
## 2 reads         m               9664         0.304 3685. 4114. 24 1403  2565
## 3 reads         mock           10835         0.222 4709. 4085. 42 1998. 3618
## 4 reads         n               5545         0.356 3460. 3604. 25 1377  2475
##     p75  p100 hist 
## 1 9344. 53188 ▇▂▁▁▁
## 2 4469  48039 ▇▁▁▁▁
## 3 6198. 40634 ▇▁▁▁▁
## 4 4232. 36105 ▇▁▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             51594     
## Number of columns          46        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate mean   sd p0  p25  p50  p75
## 1 pct_mito      control            0             1 2.47 3.79  0 1.35 1.99 2.92
## 2 pct_mito      m                  0             1 2.32 3.42  0 1.35 1.97 2.75
## 3 pct_mito      mock               0             1 2.10 2.53  0 1.19 1.77 2.55
## 4 pct_mito      n                  0             1 2.06 3.36  0 1.21 1.76 2.45
##   p100 hist 
## 1 98.7 ▇▁▁▁▁
## 2 98.4 ▇▁▁▁▁
## 3 98.9 ▇▁▁▁▁
## 4 97.3 ▇▁▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             51594     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd p0  p25  p50  p75
## 1 pct_ribo      control            0             1 10.0   7.39  0 5.48 7.69 10.9
## 2 pct_ribo      m                  0             1 13.3  10.7   0 5.54 8.34 18.9
## 3 pct_ribo      mock               0             1  9.08  7.41  0 4.44 6.10 10.6
## 4 pct_ribo      n                  0             1 13.7  10.5   0 5.82 8.31 20.8
##   p100 hist 
## 1 51.4 ▇▂▁▁▁
## 2 50.1 ▇▂▂▂▁
## 3 45.0 ▇▂▁▁▁
## 4 48.8 ▇▂▂▂▁
## The recorded information is here, but not printing it for now:
all@misc[["sample_metadata"]]
##         sampleid condition                  gexfile vdjtcells gexcells
## control  control   control 01multi_combined/control       100      100
## mock        mock      mock    01multi_combined/mock       100      100
## m              m  muscular       01multi_combined/m       100      100
## n              n     nasal       01multi_combined/n       100      100
##             batch num_cells mean_nFeature_RNA mean_nCount_RNA
## control undefined     15180              1999            5115
## mock    undefined     13925              2066            5729
## m       undefined     13881              2086            5539
## n       undefined      8608              2224            6488
##         mean_clonotype_reads mean_pct_mito mean_pct_ribo
## control                 7066         2.473        10.001
## mock                    3685         2.322        13.305
## m                       4709         2.096         9.083
## n                       3460         2.065        13.675

Ok, that was fun; lets look at this information as a series of plots:

VlnPlot(all, features="nFeature_RNA", pt.size=0)

VlnPlot(all, features="pct_mito", pt.size=0)

VlnPlot(all, features="pct_ribo", pt.size=0)

VlnPlot(all, features="nCount_RNA", pt.size=0)

VlnPlot(all, features="reads", pt.size=0)
## Warning: Removed 39253 rows containing non-finite values (`stat_ydensity()`).

## I am curious about the length of the clonotype sequences.
VlnPlot(all, features="length", pt.size=0)
## Warning: Removed 39253 rows containing non-finite values (`stat_ydensity()`).

FeatureScatter(all, "pct_ribo", "pct_mito")

FeatureScatter(all, "nCount_RNA", "nFeature_RNA")

FeatureScatter(all, "nCount_RNA", "pct_ribo")

FeatureScatter(all, "nCount_RNA", "pct_mito")

12 Filter samples using our guesstimates

Start with a minimum number of RNAs filter.

sufficient_rna_observed <- WhichCells(all, expression=nFeature_RNA >= min_num_rna)
filt <- subset(all, cells=sufficient_rna_observed)

Second I will check that the number of reads/rna across cells is sufficient, that filter does nothing currently, which I think is good.

## I think this filter does nothing in its current form.
sufficiently_observed_idx <- rowSums(filt) > 3
summary(sufficiently_observed_idx)
##    Mode   FALSE    TRUE 
## logical   11112   21173
dim(filt)
## [1] 32285 51536
filt <- subset(filt, features=rownames(filt)[sufficiently_observed_idx])
dim(filt)
## [1] 21173 51536
## Keep cells with at least some ribosomal reads
## Note the Percent function above actually puts in a floating point
## number from 0-100, not (as I assumed from 0-1).
high_ribosomal <- WhichCells(filt, expression=percent_ribo >= min_pct_ribo)
filt <- subset(filt, cells=high_ribosomal)

Exclude cells with too much mitochondrial RNA

12.1 Now drop mitochondrial genes

low_mitochondrial <- WhichCells(filt, expression=percent_mt <= max_pct_mito)
filt <- subset(filt, cells=low_mitochondrial)

13 Record post-filtered stats

filt <- record_seurat_samples(filt, type="num_cells") %>%
  record_seurat_samples(type="nFeature_RNA") %>%
  record_seurat_samples(type="nCount_RNA") %>%
  record_seurat_samples(type="reads", column_name="clonotype_reads") %>%
  record_seurat_samples(type="pct_mito", pattern="^mt-") %>%
  record_seurat_samples(type="pct_ribo", pattern="^Rp[sl]")
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             40008     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd  p0  p25  p50
## 1 nFeature_RNA  control            0             1 2065. 1147. 240 1177 1774
## 2 nFeature_RNA  m                  0             1 2107. 1320. 221 1096 1648
## 3 nFeature_RNA  mock               0             1 2044. 1237. 248 1089 1665
## 4 nFeature_RNA  n                  0             1 2249. 1440. 303 1057 1744
##     p75 p100 hist 
## 1 2757  7530 ▇▆▂▁▁
## 2 2891  7588 ▇▅▂▁▁
## 3 2775. 7442 ▇▅▂▁▁
## 4 3292  8128 ▇▃▃▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             40008     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd  p0  p25   p50
## 1 nCount_RNA    control            0             1 5431. 4322. 500 2227 3898.
## 2 nCount_RNA    m                  0             1 6048. 5681. 500 2214 3689 
## 3 nCount_RNA    mock               0             1 5608. 5043. 502 2053 3587 
## 4 nCount_RNA    n                  0             1 6715. 6246. 500 2131 4047 
##    p75  p100 hist 
## 1 7649 40851 ▇▂▁▁▁
## 2 8338 53707 ▇▁▁▁▁
## 3 7821 44492 ▇▂▁▁▁
## 4 9926 53836 ▇▂▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             40008     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd p0   p25   p50
## 1 reads         control        10368         0.159 7089. 6045. 41 3116. 5402 
## 2 reads         m               7045         0.373 3694. 4120. 24 1408  2576.
## 3 reads         mock            6107         0.333 4732. 4098. 42 2018  3647 
## 4 reads         n               4236         0.418 3473. 3612. 43 1388  2486 
##     p75  p100 hist 
## 1 9356. 53188 ▇▂▁▁▁
## 2 4474. 48039 ▇▁▁▁▁
## 3 6223  40634 ▇▁▁▁▁
## 4 4252  36105 ▇▁▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             40008     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate mean   sd p0  p25  p50  p75
## 1 pct_mito      control            0             1 2.49 1.45  0 1.56 2.20 3.10
## 2 pct_mito      m                  0             1 2.37 1.29  0 1.59 2.18 2.88
## 3 pct_mito      mock               0             1 2.35 1.35  0 1.54 2.12 2.88
## 4 pct_mito      n                  0             1 2.03 1.05  0 1.36 1.90 2.54
##   p100 hist 
## 1 19.4 ▇▁▁▁▁
## 2 19.4 ▇▁▁▁▁
## 3 19.5 ▇▁▁▁▁
## 4 16.8 ▇▁▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             40008     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate mean    sd p0  p25   p50  p75
## 1 pct_ribo      control            0             1 11.4  7.54  5 6.69  8.59 12.5
## 2 pct_ribo      m                  0             1 15.5 10.7   5 6.96 10.4  22.6
## 3 pct_ribo      mock               0             1 11.8  7.84  5 6.15  8.24 15.0
## 4 pct_ribo      n                  0             1 15.5 10.4   5 6.75 10.5  23.3
##   p100 hist 
## 1 51.4 ▇▁▁▁▁
## 2 50.1 ▇▂▂▂▁
## 3 45.0 ▇▂▁▁▁
## 4 48.8 ▇▂▂▂▁

Add the new filtered mean values onto the original set.

all@misc$sample_metadata <- cbind(all@misc$sample_metadata, filt@misc$sample_metadata)

14 Distribution

14.1 Before filtering

all_norm <- NormalizeData(object=all) %>%
  FindVariableFeatures() %>%
  ScaleData() %>%
  FindNeighbors() %>%
  FindClusters() %>%
  RunPCA() %>%
  RunTSNE() %>%
  RunUMAP(reduction = "pca", dims = 1:10)
## Centering and scaling data matrix
## Error: Cannot find 'pca' in this Seurat object
DimPlot(object=all_norm, reduction="tsne")
## Error in is.data.frame(x): object 'all_norm' not found
plotted <- DimPlot(all_norm, reduction="umap", group.by="orig.ident", label=TRUE)
## Error in is.data.frame(x): object 'all_norm' not found
plotted
## Error in eval(expr, envir, enclos): object 'plotted' not found

14.2 After filtering

filt_norm <- NormalizeData(object=filt) %>%
  FindVariableFeatures() %>%
  ScaleData() %>%
  FindNeighbors() %>%
  FindClusters() %>%
  RunPCA() %>%
  RunTSNE() %>%
  RunUMAP(reduction="pca", dims=1:10)
## Centering and scaling data matrix
## Error: Cannot find 'pca' in this Seurat object
DimPlot(object=filt_norm, reduction="tsne")
## Error in is.data.frame(x): object 'filt_norm' not found
plotted <- DimPlot(filt_norm, reduction="umap", group.by="orig.ident", label=TRUE)
## Error in is.data.frame(x): object 'filt_norm' not found
plotted
## Error in eval(expr, envir, enclos): object 'plotted' not found
filt_norm <- JackStraw(filt_norm, num.replicate=10)
## Error in DefaultAssay(object = object): object 'filt_norm' not found
filt_norm <- ScoreJackStraw(filt_norm)
## Error in ScoreJackStraw(filt_norm): object 'filt_norm' not found
JackStrawPlot(filt_norm)
## Error in JS(object = object[[reduction]], slot = "empirical"): object 'filt_norm' not found
ElbowPlot(filt_norm)
## Error in Stdev(object = object, reduction = reduction): object 'filt_norm' not found
## So I am thinking maybe 4-10?
wanted_dims <- 6

filt_norm <- FindNeighbors(filt_norm, dims=1:wanted_dims) %>%
  FindClusters(resolution=0.5) %>%
  StashIdent(save.name="res0p5_clusters")
## Error in FindNeighbors(filt_norm, dims = 1:wanted_dims): object 'filt_norm' not found
RunUMAP(filt_norm, dims=1:9)
## Error in RunUMAP(filt_norm, dims = 1:9): object 'filt_norm' not found
DimPlot(filt_norm, label=TRUE)
## Error in is(x, "classRepresentation"): object 'filt_norm' not found
filt_norm <- FindClusters(filt_norm, resolution=0.1) %>%
  FindNeighbors(k.param=6) %>%
  StashIdent(save.name="res0p1_clusters")
## Error in FindClusters(filt_norm, resolution = 0.1): object 'filt_norm' not found
RunUMAP(filt_norm, dims=1:9)
## Error in RunUMAP(filt_norm, dims = 1:9): object 'filt_norm' not found
DimPlot(filt_norm, label=TRUE)
## Error in is(x, "classRepresentation"): object 'filt_norm' not found

Add into the metadata a concatenation of the sample ID and the cluster ID

identity_vector <- filt_norm[["orig.ident"]][["orig.ident"]]
## Error in eval(expr, envir, enclos): object 'filt_norm' not found
class(identity_vector)
## Error in eval(expr, envir, enclos): object 'identity_vector' not found
cluster_vector <- as.character(filt_norm[["res0p1_clusters"]][["res0p1_clusters"]])
## Error in eval(expr, envir, enclos): object 'filt_norm' not found
concatenated_vector <- paste0(identity_vector, "_", cluster_vector)
## Error in paste0(identity_vector, "_", cluster_vector): object 'identity_vector' not found
filt_norm[["cluster_sample"]] <- concatenated_vector
## Error in eval(expr, envir, enclos): object 'concatenated_vector' not found

15 Add these new clusters to our non-normalized data

I am not yet certain of how Seurat handles (non)normalized data for the various FindMarkers functions. Thus, I am adding the clusters from the dimension reductions to the non-normalized data here.

filt[["res0p1_clusters"]] <- filt_norm[["res0p1_clusters"]]
## Error in eval(expr, envir, enclos): object 'filt_norm' not found
filt[["cluster_sample"]] <- filt_norm[["cluster_sample"]]
## Error in eval(expr, envir, enclos): object 'filt_norm' not found

16 Variable features

var <- FindVariableFeatures(filt_norm)
## Error in FindVariableFeatures(filt_norm): object 'filt_norm' not found
most_var <- head(VariableFeatures(var), 30)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'head': no applicable method for 'VariableFeatures' applied to an object of class "function"
variable_plot <- VariableFeaturePlot(var)
## Error in UseMethod(generic = "HVFInfo", object = object): no applicable method for 'HVFInfo' applied to an object of class "function"
variable_plot <- LabelPoints(plot=variable_plot, points=most_var, repel=TRUE)
## Error in lapply(X = X, FUN = FUN, ...): object 'variable_plot' not found
variable_plot
## Error in eval(expr, envir, enclos): object 'variable_plot' not found

17 Various marker searches

17.1 All Markers

17.1.1 By sample

Question: Is it smart enough to use the raw data if I give FindAllMarkers the normalized data? For the moment I do not think I will risk it.

combined_markers <- FindAllMarkers(filt, only.pos=TRUE, logfc.threshold=0.5)
## Calculating cluster control
## Calculating cluster m
## Calculating cluster mock
## Calculating cluster n
head(combined_markers)
##              p_val avg_log2FC pct.1 pct.2  p_val_adj cluster    gene
## Tmem252  0.000e+00     1.0024 0.491 0.311  0.000e+00 control Tmem252
## Plvap    0.000e+00     0.8014 0.599 0.410  0.000e+00 control   Plvap
## Eng      0.000e+00     0.5932 0.625 0.446  0.000e+00 control     Eng
## Ctla2a  2.069e-303     0.6391 0.672 0.518 4.382e-299 control  Ctla2a
## Lyve1   3.612e-291     0.5805 0.411 0.240 7.647e-287 control   Lyve1
## Atf3    1.289e-266     0.5544 0.721 0.543 2.730e-262 control    Atf3
combined <- as.data.frame(combined_markers)
rownames(combined) <- toupper(rownames(combined))
annotated_markers <- merge(combined, brief, by.x="row.names", by.y="hgnc_symbol",
                           all.x=TRUE)

17.1.2 By sample

combined_markers <- FindAllMarkers(filt, only.pos=TRUE, logfc.threshold=0.5)
## Calculating cluster control
## Calculating cluster m
## Calculating cluster mock
## Calculating cluster n
combined <- as.data.frame(combined_markers)
rownames(combined) <- toupper(rownames(combined))
annotated_markers <- merge(combined, brief, by.x="row.names", by.y="hgnc_symbol",
                           all.x=TRUE)
head(annotated_markers)
##   Row.names      p_val avg_log2FC pct.1 pct.2  p_val_adj cluster gene
## 1      AGER  6.586e-14     0.5312 0.442 0.422  1.394e-09       n Ager
## 2      APOD  0.000e+00     1.5162 0.236 0.062  0.000e+00       n Apod
## 3      ATF3 1.289e-266     0.5544 0.721 0.543 2.730e-262 control Atf3
## 4       B2M 2.881e-294     0.7894 0.990 0.961 6.099e-290       n  B2m
## 5      BST2  0.000e+00     0.8906 0.844 0.659  0.000e+00    mock Bst2
## 6     BST21 2.627e-245     1.0587 0.786 0.683 5.562e-241       n Bst2
##                                                                              description
## 1 advanced glycosylation end-product specific receptor [Source:HGNC Symbol;Acc:HGNC:320]
## 2                                     apolipoprotein D [Source:HGNC Symbol;Acc:HGNC:612]
## 3                    activating transcription factor 3 [Source:HGNC Symbol;Acc:HGNC:785]
## 4                                 beta-2-microglobulin [Source:HGNC Symbol;Acc:HGNC:914]
## 5                  bone marrow stromal cell antigen 2 [Source:HGNC Symbol;Acc:HGNC:1119]
## 6                                                                                   <NA>

17.1.3 By Cluster

Since I am not using the filt_norm data structure, I will need to pull the cluster information from the normalized copy…

clusters <- filt
Idents(clusters) <- clusters[["res0p1_clusters"]]
## Error: Cannot find 'res0p1_clusters' in this Seurat object
cluster_markers <- FindAllMarkers(clusters, only.pos=TRUE, logfc.threshold=0.5)
## Calculating cluster control
## Calculating cluster m
## Calculating cluster mock
## Calculating cluster n
cluster_genes <- as.data.frame(cluster_markers)
rownames(cluster_genes) <- toupper(rownames(cluster_genes))
annotated_clusters <- merge(cluster_genes, brief, by.x="row.names", by.y="hgnc_symbol",
                           all.x=TRUE)
head(annotated_clusters)
##   Row.names      p_val avg_log2FC pct.1 pct.2  p_val_adj cluster gene
## 1      AGER  6.586e-14     0.5312 0.442 0.422  1.394e-09       n Ager
## 2      APOD  0.000e+00     1.5162 0.236 0.062  0.000e+00       n Apod
## 3      ATF3 1.289e-266     0.5544 0.721 0.543 2.730e-262 control Atf3
## 4       B2M 2.881e-294     0.7894 0.990 0.961 6.099e-290       n  B2m
## 5      BST2  0.000e+00     0.8906 0.844 0.659  0.000e+00    mock Bst2
## 6     BST21 2.627e-245     1.0587 0.786 0.683 5.562e-241       n Bst2
##                                                                              description
## 1 advanced glycosylation end-product specific receptor [Source:HGNC Symbol;Acc:HGNC:320]
## 2                                     apolipoprotein D [Source:HGNC Symbol;Acc:HGNC:612]
## 3                    activating transcription factor 3 [Source:HGNC Symbol;Acc:HGNC:785]
## 4                                 beta-2-microglobulin [Source:HGNC Symbol;Acc:HGNC:914]
## 5                  bone marrow stromal cell antigen 2 [Source:HGNC Symbol;Acc:HGNC:1119]
## 6                                                                                   <NA>
annotated_clusters %>%
  group_by(cluster) %>%
  dplyr::top_n(n=10, wt=avg_log2FC) %>%
  as.data.frame()
##    Row.names      p_val avg_log2FC pct.1 pct.2  p_val_adj cluster     gene
## 1       APOD  0.000e+00     1.5162 0.236 0.062  0.000e+00       n     Apod
## 2       ATF3 1.289e-266     0.5544 0.721 0.543 2.730e-262 control     Atf3
## 3       BST2  0.000e+00     0.8906 0.844 0.659  0.000e+00    mock     Bst2
## 4      BST21 2.627e-245     1.0587 0.786 0.683 5.562e-241       n     Bst2
## 5         C3 1.558e-150     1.1778 0.347 0.220 3.299e-146       n       C3
## 6       CCL5  5.247e-69     0.6441 0.157 0.093  1.111e-64    mock     Ccl5
## 7        CFB 1.204e-241     0.8818 0.194 0.071 2.549e-237       n      Cfb
## 8     CTLA2A 2.069e-303     0.6391 0.672 0.518 4.382e-299 control   Ctla2a
## 9     CXCL10 3.844e-179     0.9916 0.238 0.121 8.139e-175    mock   Cxcl10
## 10       ENG  0.000e+00     0.5932 0.625 0.446  0.000e+00 control      Eng
## 11      GBP4 3.434e-184     0.5354 0.541 0.414 7.270e-180       m     Gbp4
## 12   GPIHBP1 9.080e-262     0.5257 0.601 0.424 1.922e-257 control  Gpihbp1
## 13  IFI27L2A  0.000e+00     1.3184 0.778 0.442  0.000e+00       n Ifi27l2a
## 14     IFIT1  0.000e+00     0.8667 0.542 0.234  0.000e+00    mock    Ifit1
## 15     IFIT3  0.000e+00     0.8589 0.505 0.218  0.000e+00    mock    Ifit3
## 16      INMT  1.396e-75     0.5051 0.438 0.348  2.956e-71 control     Inmt
## 17      IRF7  0.000e+00     0.8388 0.730 0.407  0.000e+00    mock     Irf7
## 18     IRF71  0.000e+00     1.2384 0.713 0.430  0.000e+00       n     Irf7
## 19     ISG15  0.000e+00     1.0845 0.809 0.479  0.000e+00    mock    Isg15
## 20    ISG151  0.000e+00     1.0299 0.732 0.516  0.000e+00       n    Isg15
## 21      LCN2  7.538e-40     1.0603 0.278 0.218  1.596e-35    mock     Lcn2
## 22     LCN21 2.069e-218     1.6999 0.359 0.204 4.381e-214       n     Lcn2
## 23    LGALS1  2.710e-23     0.5359 0.486 0.450  5.737e-19       m   Lgals1
## 24      LY6E 2.574e-270     0.8441 0.804 0.696 5.450e-266    mock     Ly6e
## 25     LYVE1 3.612e-291     0.5805 0.411 0.240 7.647e-287 control    Lyve1
## 26       MGP  1.052e-10     0.9769 0.318 0.294  2.228e-06       n      Mgp
## 27     PLVAP  0.000e+00     0.8014 0.599 0.410  0.000e+00 control    Plvap
## 28    RETNLA 6.190e-222     2.0144 0.100 0.025 1.311e-217       m   Retnla
## 29      SAA3 1.090e-191     1.2510 0.164 0.065 2.308e-187    mock     Saa3
## 30     SAA31  0.000e+00     1.8139 0.222 0.058  0.000e+00       n     Saa3
## 31     SOCS3 2.601e-136     0.5480 0.689 0.636 5.506e-132 control    Socs3
## 32   TMEM252  0.000e+00     1.0024 0.491 0.311  0.000e+00 control  Tmem252
## 33    TSPAN7 2.750e-252     0.5211 0.638 0.463 5.822e-248 control   Tspan7
##                                                                                                             description
## 1                                                                    apolipoprotein D [Source:HGNC Symbol;Acc:HGNC:612]
## 2                                                   activating transcription factor 3 [Source:HGNC Symbol;Acc:HGNC:785]
## 3                                                 bone marrow stromal cell antigen 2 [Source:HGNC Symbol;Acc:HGNC:1119]
## 4                                                                                                                  <NA>
## 5                                                                      complement C3 [Source:HGNC Symbol;Acc:HGNC:1318]
## 6                                                      C-C motif chemokine ligand 5 [Source:HGNC Symbol;Acc:HGNC:10632]
## 7                                                                complement factor B [Source:HGNC Symbol;Acc:HGNC:1037]
## 8                                                                                                                  <NA>
## 9                                                   C-X-C motif chemokine ligand 10 [Source:HGNC Symbol;Acc:HGNC:10637]
## 10                                                                          endoglin [Source:HGNC Symbol;Acc:HGNC:3349]
## 11                                                      guanylate binding protein 4 [Source:HGNC Symbol;Acc:HGNC:20480]
## 12 glycosylphosphatidylinositol anchored high density lipoprotein binding protein 1 [Source:HGNC Symbol;Acc:HGNC:24945]
## 13                                                                                                                 <NA>
## 14                       interferon induced protein with tetratricopeptide repeats 1 [Source:HGNC Symbol;Acc:HGNC:5407]
## 15                       interferon induced protein with tetratricopeptide repeats 3 [Source:HGNC Symbol;Acc:HGNC:5411]
## 16                                               indolethylamine N-methyltransferase [Source:HGNC Symbol;Acc:HGNC:6069]
## 17                                                    interferon regulatory factor 7 [Source:HGNC Symbol;Acc:HGNC:6122]
## 18                                                                                                                 <NA>
## 19                                                     ISG15 ubiquitin like modifier [Source:HGNC Symbol;Acc:HGNC:4053]
## 20                                                                                                                 <NA>
## 21                                                                       lipocalin 2 [Source:HGNC Symbol;Acc:HGNC:6526]
## 22                                                                                                                 <NA>
## 23                                                                        galectin 1 [Source:HGNC Symbol;Acc:HGNC:6561]
## 24                                              lymphocyte antigen 6 family member E [Source:HGNC Symbol;Acc:HGNC:6727]
## 25                               lymphatic vessel endothelial hyaluronan receptor 1 [Source:HGNC Symbol;Acc:HGNC:14687]
## 26                                                                matrix Gla protein [Source:HGNC Symbol;Acc:HGNC:7060]
## 27                                           plasmalemma vesicle associated protein [Source:HGNC Symbol;Acc:HGNC:13635]
## 28                                                                                                                 <NA>
## 29                                                                                                                 <NA>
## 30                                                                                                                 <NA>
## 31                                               suppressor of cytokine signaling 3 [Source:HGNC Symbol;Acc:HGNC:19391]
## 32                                                        transmembrane protein 252 [Source:HGNC Symbol;Acc:HGNC:28537]
## 33                                                                    tetraspanin 7 [Source:HGNC Symbol;Acc:HGNC:11854]
sum(clusters[["res0p1_clusters"]] == "0")
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "0" &
    !is.na(clusters[["raw_clonotype_id"]]))
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "1")
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "1" &
    !is.na(clusters[["raw_clonotype_id"]]))
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "2")
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "2" &
    !is.na(clusters[["raw_clonotype_id"]]))
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "3")
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "3" &
    !is.na(clusters[["raw_clonotype_id"]]))
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "4")
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "4" &
    !is.na(clusters[["raw_clonotype_id"]]))
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "5")
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "5" &
    !is.na(clusters[["raw_clonotype_id"]]))
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "6")
## Error: Cannot find 'res0p1_clusters' in this Seurat object
sum(clusters[["res0p1_clusters"]] == "6" &
    !is.na(clusters[["raw_clonotype_id"]]))
## Error: Cannot find 'res0p1_clusters' in this Seurat object

Clusters 0 and 5 have a great majority of the clonotypes. 0 has something like 90%, 5 has ~ 30%, the others ~ 10%

17.2 Compare specific clusters

17.2.1 Look at cluster 0, Nasal vs. Control

test_group <- clusters[["cluster_sample"]] == "control_0"
## Error: Cannot find 'cluster_sample' in this Seurat object
sum(test_group)
## Error in eval(expr, envir, enclos): object 'test_group' not found
test_group <- clusters[["cluster_sample"]] == "n_0"
## Error: Cannot find 'cluster_sample' in this Seurat object
sum(test_group)
## Error in eval(expr, envir, enclos): object 'test_group' not found
controln_0 <- FindMarkers(
    clusters, group.by="cluster_sample",
    ident.1="control_0", ident.2="n_0")
## Error in WhichCells.Seurat(object = object, idents = ident.1): Cannot find the following identities in the object: control_0
controln_0 <- as.data.frame(controln_0)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': object 'controln_0' not found
rownames(controln_0) <- toupper(rownames(controln_0))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'toupper': error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'controln_0' not found
controln_0 <- merge(controln_0, brief, by="row.names", by.y="hgnc_symbol",
                    all.x=TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'merge': object 'controln_0' not found
annotated_clusters %>%
  group_by(cluster) %>%
  dplyr::top_n(n=10, wt=avg_log2FC) %>%
  as.data.frame()
##    Row.names      p_val avg_log2FC pct.1 pct.2  p_val_adj cluster     gene
## 1       APOD  0.000e+00     1.5162 0.236 0.062  0.000e+00       n     Apod
## 2       ATF3 1.289e-266     0.5544 0.721 0.543 2.730e-262 control     Atf3
## 3       BST2  0.000e+00     0.8906 0.844 0.659  0.000e+00    mock     Bst2
## 4      BST21 2.627e-245     1.0587 0.786 0.683 5.562e-241       n     Bst2
## 5         C3 1.558e-150     1.1778 0.347 0.220 3.299e-146       n       C3
## 6       CCL5  5.247e-69     0.6441 0.157 0.093  1.111e-64    mock     Ccl5
## 7        CFB 1.204e-241     0.8818 0.194 0.071 2.549e-237       n      Cfb
## 8     CTLA2A 2.069e-303     0.6391 0.672 0.518 4.382e-299 control   Ctla2a
## 9     CXCL10 3.844e-179     0.9916 0.238 0.121 8.139e-175    mock   Cxcl10
## 10       ENG  0.000e+00     0.5932 0.625 0.446  0.000e+00 control      Eng
## 11      GBP4 3.434e-184     0.5354 0.541 0.414 7.270e-180       m     Gbp4
## 12   GPIHBP1 9.080e-262     0.5257 0.601 0.424 1.922e-257 control  Gpihbp1
## 13  IFI27L2A  0.000e+00     1.3184 0.778 0.442  0.000e+00       n Ifi27l2a
## 14     IFIT1  0.000e+00     0.8667 0.542 0.234  0.000e+00    mock    Ifit1
## 15     IFIT3  0.000e+00     0.8589 0.505 0.218  0.000e+00    mock    Ifit3
## 16      INMT  1.396e-75     0.5051 0.438 0.348  2.956e-71 control     Inmt
## 17      IRF7  0.000e+00     0.8388 0.730 0.407  0.000e+00    mock     Irf7
## 18     IRF71  0.000e+00     1.2384 0.713 0.430  0.000e+00       n     Irf7
## 19     ISG15  0.000e+00     1.0845 0.809 0.479  0.000e+00    mock    Isg15
## 20    ISG151  0.000e+00     1.0299 0.732 0.516  0.000e+00       n    Isg15
## 21      LCN2  7.538e-40     1.0603 0.278 0.218  1.596e-35    mock     Lcn2
## 22     LCN21 2.069e-218     1.6999 0.359 0.204 4.381e-214       n     Lcn2
## 23    LGALS1  2.710e-23     0.5359 0.486 0.450  5.737e-19       m   Lgals1
## 24      LY6E 2.574e-270     0.8441 0.804 0.696 5.450e-266    mock     Ly6e
## 25     LYVE1 3.612e-291     0.5805 0.411 0.240 7.647e-287 control    Lyve1
## 26       MGP  1.052e-10     0.9769 0.318 0.294  2.228e-06       n      Mgp
## 27     PLVAP  0.000e+00     0.8014 0.599 0.410  0.000e+00 control    Plvap
## 28    RETNLA 6.190e-222     2.0144 0.100 0.025 1.311e-217       m   Retnla
## 29      SAA3 1.090e-191     1.2510 0.164 0.065 2.308e-187    mock     Saa3
## 30     SAA31  0.000e+00     1.8139 0.222 0.058  0.000e+00       n     Saa3
## 31     SOCS3 2.601e-136     0.5480 0.689 0.636 5.506e-132 control    Socs3
## 32   TMEM252  0.000e+00     1.0024 0.491 0.311  0.000e+00 control  Tmem252
## 33    TSPAN7 2.750e-252     0.5211 0.638 0.463 5.822e-248 control   Tspan7
##                                                                                                             description
## 1                                                                    apolipoprotein D [Source:HGNC Symbol;Acc:HGNC:612]
## 2                                                   activating transcription factor 3 [Source:HGNC Symbol;Acc:HGNC:785]
## 3                                                 bone marrow stromal cell antigen 2 [Source:HGNC Symbol;Acc:HGNC:1119]
## 4                                                                                                                  <NA>
## 5                                                                      complement C3 [Source:HGNC Symbol;Acc:HGNC:1318]
## 6                                                      C-C motif chemokine ligand 5 [Source:HGNC Symbol;Acc:HGNC:10632]
## 7                                                                complement factor B [Source:HGNC Symbol;Acc:HGNC:1037]
## 8                                                                                                                  <NA>
## 9                                                   C-X-C motif chemokine ligand 10 [Source:HGNC Symbol;Acc:HGNC:10637]
## 10                                                                          endoglin [Source:HGNC Symbol;Acc:HGNC:3349]
## 11                                                      guanylate binding protein 4 [Source:HGNC Symbol;Acc:HGNC:20480]
## 12 glycosylphosphatidylinositol anchored high density lipoprotein binding protein 1 [Source:HGNC Symbol;Acc:HGNC:24945]
## 13                                                                                                                 <NA>
## 14                       interferon induced protein with tetratricopeptide repeats 1 [Source:HGNC Symbol;Acc:HGNC:5407]
## 15                       interferon induced protein with tetratricopeptide repeats 3 [Source:HGNC Symbol;Acc:HGNC:5411]
## 16                                               indolethylamine N-methyltransferase [Source:HGNC Symbol;Acc:HGNC:6069]
## 17                                                    interferon regulatory factor 7 [Source:HGNC Symbol;Acc:HGNC:6122]
## 18                                                                                                                 <NA>
## 19                                                     ISG15 ubiquitin like modifier [Source:HGNC Symbol;Acc:HGNC:4053]
## 20                                                                                                                 <NA>
## 21                                                                       lipocalin 2 [Source:HGNC Symbol;Acc:HGNC:6526]
## 22                                                                                                                 <NA>
## 23                                                                        galectin 1 [Source:HGNC Symbol;Acc:HGNC:6561]
## 24                                              lymphocyte antigen 6 family member E [Source:HGNC Symbol;Acc:HGNC:6727]
## 25                               lymphatic vessel endothelial hyaluronan receptor 1 [Source:HGNC Symbol;Acc:HGNC:14687]
## 26                                                                matrix Gla protein [Source:HGNC Symbol;Acc:HGNC:7060]
## 27                                           plasmalemma vesicle associated protein [Source:HGNC Symbol;Acc:HGNC:13635]
## 28                                                                                                                 <NA>
## 29                                                                                                                 <NA>
## 30                                                                                                                 <NA>
## 31                                               suppressor of cytokine signaling 3 [Source:HGNC Symbol;Acc:HGNC:19391]
## 32                                                        transmembrane protein 252 [Source:HGNC Symbol;Acc:HGNC:28537]
## 33                                                                    tetraspanin 7 [Source:HGNC Symbol;Acc:HGNC:11854]

17.2.2 Cluster 0 Nasal vs. Mock

mockvsn_0 <- FindMarkers(
    clusters, group.by="cluster_sample",
    ident.1="n_0", ident.2="mock_0") %>%
  as.data.frame()
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': Cannot find the following identities in the object: n_0
head(mockvsn_0)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'head': object 'mockvsn_0' not found
rownames(mockvsn_0) <- toupper(rownames(mockvsn_0))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'toupper': error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'mockvsn_0' not found
mockvsn_0 <- merge(mockvsn_0, brief, by="row.names", by.y="hgnc_symbol",
                   all.x=TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'merge': object 'mockvsn_0' not found
mockvsm_0 <- FindMarkers(
    clusters, group.by="cluster_sample",
    ident.1="m_0", ident.2="mock_0") %>%
  as.data.frame()
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': Cannot find the following identities in the object: m_0
head(mockvsm_0)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'head': object 'mockvsm_0' not found
rownames(mockvsm_0) <- toupper(rownames(mockvsm_0))
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'toupper': error in evaluating the argument 'x' in selecting a method for function 'rownames': object 'mockvsm_0' not found
mockvsm_0 <- merge(mockvsm_0, brief, by="row.names", by.y="hgnc_symbol",
                   all.x=TRUE)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'merge': object 'mockvsm_0' not found
head(mockvsm_0, n=30)
## Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'head': object 'mockvsm_0' not found

17.3 Find Conserved Markers

This function makes no sense.

DefaultAssay(clusters) <- "RNA"
conserved_markers <- FindConservedMarkers(
    clusters, ident.1=c(0, 1), ident.2=c(2,3,4),
    grouping.var="sample", only.pos=TRUE,
    verbose=TRUE)
mock_vs_control <- FindMarkers(clusters, group.by="orig.ident",
                               ident.1="mock",
                               ident.2="control")
head(mock_vs_control)
muscular_vs_mock <- FindMarkers(clusters, group.by="orig.ident",
                                ident.1="m",
                                ident.2="mock")
summary(muscular_vs_mock)
nasal_vs_mock <- FindMarkers(clusters, group.by="orig.ident",
                             min.pct=0.25, ident.1="n",
                             ident.2="mock")
summary(nasal_vs_mock)

FeaturePlot(clusters, features=c("Rgcc"),
            split.by="orig.ident", max.cutoff=3,
            cols=c("darkgreen", "darkred"))

18 Scan for likely cell cycle genes

This is a neat idea, I think we can repurpose it to immunology gene sets.

filt <- CellCycleScoring(
    object=clusters,
    g2m.features=cc.genes$g2m.genes,
    s.features=cc.genes$s.genes)
## Warning: The following features are not present in the object: MCM5, PCNA, TYMS,
## FEN1, MCM2, MCM4, RRM1, UNG, GINS2, MCM6, CDCA7, DTL, PRIM1, UHRF1, MLF1IP,
## HELLS, RFC2, RPA2, NASP, RAD51AP1, GMNN, WDR76, SLBP, CCNE2, UBR7, POLD3, MSH2,
## ATAD2, RAD51, RRM2, CDC45, CDC6, EXO1, TIPIN, DSCC1, BLM, CASP8AP2, USP1, CLSPN,
## POLA1, CHAF1B, BRIP1, E2F8, not searching for symbol synonyms
## Warning: The following features are not present in the object: HMGB2, CDK1,
## NUSAP1, UBE2C, BIRC5, TPX2, TOP2A, NDC80, CKS2, NUF2, CKS1B, MKI67, TMPO, CENPF,
## TACC3, FAM64A, SMC4, CCNB2, CKAP2L, CKAP2, AURKB, BUB1, KIF11, ANP32E, TUBB4B,
## GTSE1, KIF20B, HJURP, CDCA3, HN1, CDC20, TTK, CDC25C, KIF2C, RANGAP1, NCAPD2,
## DLGAP5, CDCA2, CDCA8, ECT2, KIF23, HMMR, AURKA, PSRC1, ANLN, LBR, CKAP5, CENPE,
## CTCF, NEK2, G2E3, GAS2L3, CBX5, CENPA, not searching for symbol synonyms
## Warning in AddModuleScore(object = object, features = features, name = name, :
## Could not find enough features in the object from the following feature lists:
## S.Score Attempting to match case...Could not find enough features in the object
## from the following feature lists: G2M.Score Attempting to match case...
VlnPlot(clusters, features=c("S.Score", "G2M.Score"),
        group.by="orig.ident",
        ncol=4, pt.size=0)
## Error in FetchData.Seurat(object = object, vars = features, slot = slot): None of the requested variables were found: S.Score, G2M.Score

Having written the following I realized I used an older version of my mSigDB reference… FIXME: Redo it with the 7.5+ data.

broad_types <- load_gmt_signatures(signatures="reference/m8.all.v2022.1.Mm.symbols.gmt")
broad_list <- list()
for (i in names(broad_types)) {
  broad_list[[i]] <- geneIds(broad_types[[i]])
}
wtf <- AddModuleScore(object=clusters, features=broad_list,
                      name="m8")
## Warning: The following features are not present in the object: Gm29346, Pdyn,
## Iqcj, Iqschfp, Gm15578, Gm12724, A930005G22Rik, Gm38839, Adgra1, 5530401A14Rik,
## Gm16246, Adamts16, Crhbp, Lrtm1, Gm1604b, Galr1, Slit1, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Ifi203-ps,
## 9630010A21Rik, Gm26236, Niban2, Pcsk2os2, 4930573H18Rik, Gm12426, 8030487O14Rik,
## E030026E10Rik, Gm36503, Gm36816, Garre1, 9530078K11Rik, Gm22060, Scn4b,
## 4632418H02Rik, Gm25410, Snord104, not searching for symbol synonyms
## Warning: The following features are not present in the object: Spp2, Golt1a,
## F13b, Mtarc1, Mtarc2, Hnf4aos, Hnf4a, Hnf4g, Sertm1, Tm4sf4, Gm40055,
## 1700007F19Rik, Aadac, A330069K06Rik, Fgb, Gm16958, Acnat1, Ambp, Kif12, Gm12602,
## C8b, C8a, Gm19666, Gm42614, Klb, Ugt2b34, Ugt2b35, Ugt2b36, Ugt2b5, Afm,
## Hnf1a, Hnf1aos1, 1810017P11Rik, Mmd2, Gm20635, Gm3289, Akr1d1, 9930120I10Rik,
## Gm20426, Chst13, Uroc1, A2m, Gys2, Sult2a8, Prodh2, Slc7a9, Anks4b, Rps23rg1,
## Aadat, Hsd17b2, Gm27216, Smlr1, Gm29571, Mfsd4b3-ps, Creb3l3, Pah, Inhbc,
## Slc39a5, Igfbp1, Timd2, Shbg, 4930405D11Rik, Gm24233, Serpina6, Serpina1c,
## Mir337, DQ267102, Gm25357, Slc17a3, Cdhr2, Slc25a48, Lect2, Bhmt, Bhmt2, Dmgdh,
## Cpb2, 4930517O19Rik, Agxt2, Cyp2d26, Kng1, Spink1, Slc22a8, Keg1, A1cf, Pde6c,
## Cyp2c67, Cyp2c68, Cyp2c70, Abcc2, Pnliprp2, Rtl4, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Gm29260, Gm13584,
## Gm37004, Tfap2c, AI849053, Gm15577, Gm35040, Gm25630, A330033J07Rik, Drd3,
## Gm23887, Emx2os, Emx2, Gm14664, not searching for symbol synonyms
## Warning: The following features are not present in the object: Oprk1, Dusp27,
## 2900092N22Rik, A530058N18Rik, C130080G10Rik, Ctcflos, BC002189, C630028M04Rik,
## Gm12514, Gm12866, Trim63, Trim54, Myl2, Bmp10, Gm18066, 4930512H18Rik, Gm27211,
## Unc13c, Myl3, Gm10118, Hand1, 4932435O22Rik, Irx4, Thbs4, Gm3002, Gm8281,
## Mov10l1, Gm4335, Nkx2-5, Hdac1-ps, Mir133a-1hg, Gata6os, Tlx1, 6030498E09Rik,
## Gm14769, not searching for symbol synonyms
## Warning: The following features are not present in the object: Vwc2l,
## Gm29514, Olah, Dbh, Pla2g4e, Gm9831, Gm12371, D130004A15Rik, A230006K03Rik,
## 4930567K12Rik, Hs3st4, 4930551E15Rik, 3110080E11Rik, Gm39244, Hcrtr2, Gm28905,
## Car10, Rab9b, not searching for symbol synonyms
## Warning: The following features are not present in the object: Vxn, Gm13630,
## Prdm13, Tmprss11a, Srrm4os, Gm20501, Neurod4, Gm12224, Gm38534, Neurog1, Gm6999,
## Dcc, Drr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Prdx2-ps1,
## 9630028B13Rik, Gm2061, Slc30a10, Epb42, Gm14049, Hsd3b6, 9830132P13Rik,
## 4933401H06Rik, 1700015C17Rik, Asb17os, Asb17, Gm22247, Lexm, Rnf212, Kel,
## Gm3793, Hbb-bh1, Hbb-bh0, Aqp8, Rusf1, Gypa, H2ax, Gm28530, Gm37249, Inhca,
## Ankrd36, Hba-x, Slc4a1, H2ac11, H2bc11, H1f4, Gm23127, Gm16867, Gm10110,
## 1810053B23Rik, Pdxk-ps, Marchf2, Gm20541, Rhag, Gm20517, Marchf3, Marchf5,
## Dennd10, Fmr1nb, not searching for symbol synonyms
## Warning: The following features are not present in the object: A130048G24Rik,
## A630081D01Rik, A130071D04Rik, Gm5834, Cd5l, Gm15644, Clec7a, 4933406J09Rik,
## Gvin-ps6, Gvin-ps7, Gvin3, Gm15542, 6430710M23Rik, 2310008N11Rik, Gm23677,
## Hmgb1-ps8, C920009B18Rik, Nlrp1c-ps, 1700030C10Rik, Gm17160, Cyrib, Mx1, Pgap6,
## Ncr3-ps, Olfr111, Ms4a14, Tasl, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm20172,
## Cracdl, Lmx1a, Ush2a, Gm13266, Dync2i2, Dcdc5, Gm4540, Gm15689, Dnai3, Dnai1,
## Ube2u, Dynlt5, Dnai4, Gm12930, Tex47, Smkr-ps, Gm44196, E330012B07Rik, Odad1,
## 3100003L05Rik, Katnip, Spef1l, Ins2, Gm36879, Poteg, Gm30504, Olfr370, Vat1l,
## 4933408N05Rik, Odad3, Dpy19l2, Gm1110, Hoatz, Gm20276, Odad4, Marchf10, Dnai2,
## 1700086L19Rik, Gm10735, Trhr, D930007P13Rik, Cfap91, Odad2, Gm16090, Ttr, Wnt8b,
## Frmpd4, not searching for symbol synonyms
## Warning: The following features are not present in the object: Abca12,
## 4933417C20Rik, Mir205hg, Gm13219, Macrod2os1, Gpr87, Fhip1a, Gm12446, Ugt2a2,
## Gm33050, Vwde, Pyurf, Rfx6, Nepn, Fam174c, Tac2, B4galnt2, BC006965, Gm10406,
## Oc90, Gm15538, not searching for symbol synonyms
## Warning: The following features are not present in the object: Lincmd1, Col19a1,
## Mstn, Chrnd, Chrng, Myog, Chrna1, 7530428D23Rik, Gm30735, Casq2, 4632404M16Rik,
## Frmpd1os, Pax7, Gm8091, Gm42875, Vgll2, Mybpc1, Myh8, Septin4, 4930544I03Rik,
## Cspg4b, 1520401A03Rik, Mymx, Pitx3, Tex16, Tceal7, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Gm6209, Gm12829,
## Gm20485, Gm42397, Gm32531, Zic1, Gm12098, Zic2, Atp13a5, Htr1f, Mro, Slc22a6,
## Mageb18, not searching for symbol synonyms
## Warning: The following features are not present in the object: Col9a1,
## 1700019A02Rik, Olfr1219, 9130410C08Rik, Gm12830, Gm10578, Epyc, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Gm29455,
## 3110062G12Rik, Rapgef4os1, 2600014E21Rik, Neurod6, Gm26604, Kash5,
## C230057M02Rik, Camkv, 2900079G21Rik, Neurod2, Lrfn5, Gm20687, Mpped1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Tfap2d, Gm16582,
## A930036I15Rik, Barhl2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm13629, Neurod1,
## Gm13791, Xkr7, 4930419G24Rik, Gm19445, 2610028E06Rik, Hmx1, Grxcr1, Exoc1l, Hrk,
## Gm16036, Ppp1r17, Tlx2, Hs3st2, Htr3a, Htr3b, Trhde, 4930473D10Rik, Gm15723,
## Tlx3, D130052B06Rik, Nrsn1, Prrxl1, Rxfp3, Gm2824, Olfr15, Ppef1, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Dmbx1, Gm15637,
## Trh, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm13377, Pax8,
## Gm13415, Lamp5, Gm27199, Lhx5, Slc6a5, Gm16010, Sox14, Lhx1, Lhx1os, Otp, Skor2,
## Pax2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm22786,
## 9430037O13Rik, Rrh, Kif19b, B130021K23Rik, C430039J01Rik, 4930413G21Rik,
## Septin1, Gm7972, Gm30238, Gpr137b-ps, H2bc22, Gm22208, Hoxc11, Dynlt2b, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ibsp, Mir6240,
## Susd5, not searching for symbol synonyms
## Warning: The following features are not present in the object: 6720464F23Rik,
## E430021H15Rik, 2310040G07Rik, Gm38825, Olfr959, 9430081H08Rik, Septin8, Btnl10,
## H2ac22, Slc66a2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm28175,
## 5930409G06Rik, Gsx1, Qrfprl, Gm18716, Cckbr, Sox1, Gm6607, Mcf2, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Gm29865, Cyp2j8,
## Gm12688, Apc-ps1, Pramel47, Gjc3, Gm10046, 4930505M18Rik, Gm29507, Gm19514,
## Atp10b, AA914427, Gm16168, Slitrk2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Serpinb10,
## Gm33100, Olfr643, Irag1, 4933432K03Rik, Gm35657, H2bc4, H1f2, Pla2g10, Gm1720,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Marchf4, Ecel1,
## Lhx4, Gm10530, Crp, Lhx3, Mnx1, Phox2b, G630064G18Rik, Gm31592, Grip1os2,
## Chat, Slc18a3, Gm2990, Cdh12, Marchf11, Hoxc8, Uts2b, Kcnh8, Slc5a7, Gm14696,
## A730046J19Rik, not searching for symbol synonyms
## Warning: The following features are not present in the object: Sall4, Gm23445,
## Foxb1, A730062M13Rik, Gm30698, Sp8, not searching for symbol synonyms
## Warning: The following features are not present in the object: D030025E07Rik,
## Gm10400, Hdnr, Olfr1372-ps1, Barx1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Cryge, Cryga,
## Cryba2, Olfr1062, Gm33206, Gm37359, Gja8, Tmprss11d, Gm31816, Gm20757, Mip,
## Gja3, not searching for symbol synonyms
## Warning: The following features are not present in the object: Pth2r, Pax3,
## Gm30731, Slc6a11, Msx3, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm19335, Myo3a,
## Nxph2, Dlx1as, Dlx2, Gm38505, Gm20515, Trpc4, Vmn2r1, Lhx8, Calb1, Dlx6os1,
## Dlx6os2, Dlx5, Slc6a1, C230062I16Rik, B020031H02Rik, Gm12068, 4933430M04Rik,
## Gm11346, Cntnap3, Smim45, Nol4, Arx, not searching for symbol synonyms
## Warning: The following features are not present in the object: Tacr3, Tyrp1,
## Olfr1338, 2900064K03Rik, Oca2, Gabra5, Tyr, Gm15483, Clec18a, Slc38a8,
## 7630403G23Rik, Opn4, Slc45a2, AW822252, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm13652, Gm31243,
## Gm5860, Gm15997, Alx1, Smc1b, Srd5a2, Dsc3, Mir6984, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Otor, Vmn2r3,
## Gm14335, Kera, Gm22205, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm17893,
## 4930509J09Rik, Gm23054, Rph3a, Iqsec3, A230077H06Rik, Cacng3, Esrrb, Pou6f2,
## Slc35f4, Cdh9, 1700123O21Rik, Gm15808, Akain1, Htr4, Gm15155, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Fcnb, Gm16035,
## Prap1, Ngp, Slc13a5, Stfa1, Stfa3, not searching for symbol synonyms
## Warning: The following features are not present in the object: Lmx1b,
## 9430024E24Rik, BB557941, Hoxd13, Hoxd12, Hoxd11, Gm14055, Gm10258, Hoxa10,
## Hoxa11, Hoxa11os, Hoxa13, Hottip, Sox5os4, A530021J07Rik, Gm31727, Hand2,
## Gm9143, not searching for symbol synonyms
## Warning: The following features are not present in the object: 3110099E03Rik,
## Gm24492, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Slc2a5, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Gpr137b-ps, Fam3d, Cela2a, Smim30, Iqsec3, Irag1, Phxr4, Frmd7, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Ins2, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H1f2, Get1,
## Mir24-2, Exosc6, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Tamalin,
## Ddx39a, Mir24-2, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ube2d-ps,
## Ubb-ps, H1f2, Zfp935, Cep20, Cldn25, Sting1, Slc66a2, Emx2, Atp5pb, Adprs,
## Smim30, Chaserr, Mir24-2, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ins2, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9, Slc66a2,
## H2az1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Niban1, Dnaaf10,
## H2bc4, Plac9, Sting1, Slc66a2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Clec7a, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, H2aj,
## Mir9-3hg, Psme3ip1, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Ubb-ps,
## H2bc4, Zic2, Atp5pb, Rpl34-ps1, Mir24-2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## Ubb-ps, Zic2, Rpl34-ps1, H2az1, Fam110d, Smim30, Mir24-2, Mobp, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Zic2,
## Neurod1, Cbln1, Calb2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Amer3, Zbed6,
## Clvs2, Diras1, Ano4, H2az2, Fem1al, Neurod2, Efcab15, Mideas, Tunar, Dync2i1,
## H2ac13, H2bc4, AW495222, Fam3d, Mir124a-1hg, Cacng2, Gm15760, Kcnj6, Lhfpl5,
## St6gal2, 2410021H03Rik, Niban2, Zfp804a, Pla2g4e, Rbm12, Gm20754, Fam110d,
## Srrm3, Particl, Ttc9b, Gm5113, 1500012K07Rik, Mir9-3hg, Hs3st4, Ins2, Ncan,
## Brme1, Get3, Exosc6, Gm6981, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## H2bu2, Ubb-ps, H2bc4, Tamalin, Cep20, Cerox1, Antkmt, Iftap, Nkx2-2, Dusp15,
## Hapln2, Atp5pb, H2az1, Smim30, Chaserr, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2bu2,
## Ubb-ps, Antkmt, Nkx2-2, Smim30, Pnma8b, H2ax, Sox3, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Ubb-ps, Ngp, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Ubb-ps,
## Rpl34-ps1, Mir24-2, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Ubb-ps,
## Rpl34-ps1, Slc2a5, Mir24-2, Gm6981, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Mars1,
## Ubb-ps, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## Ubb-ps, Pyy, H2bc4, Antkmt, Polr1h, Slc66a2, Bambi-ps1, 5830417I10Rik, Atp5pb,
## Cibar1, Spring1, Smim30, Particl, Chaserr, 4930413G21Rik, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Tnfsfm13, Macroh2a1, Particl, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, H1f2, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Abca12, Nkx2-5,
## Ambp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Fam110d, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Slc2a5,
## Cd209f, Vsig4, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps,
## Zfp862-ps, not searching for symbol synonyms
## Warning: The following features are not present in the object: Trim63, Trim54,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm5069,
## Rps15a-ps6, Rpl31-ps12, Morf4l1-ps1, Myoz2, Mir703, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Rpl31-ps12, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Gm7609, H2bc4,
## Rpl31-ps12, Fam110d, Gm15421, Klra9, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## H2bc4, Plac9, Tmem254, Rpl31-ps12, Eef1a2, Gm15421, Mir703, H2aj, G530011O06Rik,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Lilrb4b,
## Rps15a-ps6, Plac9, Cd209f, Cd209g, Vsig4, not searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9,
## Rpl31-ps12, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rdh16f2, H1f2,
## Tmem254, Cyp2d9, Miox, Hao2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rdh16f2,
## Rps15a-ps6, Akr1c21, H2bc4, H1f2, Bhmt, Tmem254, Cyp2d12, Rpl31-ps12, Spink1,
## Slc22a8, Defb29, Cyp24a1, Hsd3b4, Hao2, H2az1, Cyp4a14, Guca2b, Mir703, Hpd,
## Slc13a1, Slc51b, Gsta5, not searching for symbol synonyms
## Warning: The following features are not present in the object: Spink1, Fam110d,
## Kap, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## Rpl31-ps12, not searching for symbol synonyms
## Warning: The following features are not present in the object: Spink1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Foxi1, Tmem254,
## Entpd4, Miox, Rpl31-ps12, Spink1, Thoc2l, 6820431F20Rik, Erdr1, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Plac9, Kap, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Tmem254, Kap, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Spink1, Kap, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Kcnj16, Tmem254,
## Entpd4, Miox, Rpl31-ps12, Cldn16, Spink1, Bbln, Clcnkb, Tmem52b, Kap, H2aj,
## Umod, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9, Kap, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: G6pc, H2bc4,
## H1f2, Tmem254, Cyp2d12, Defb29, Cyp24a1, Rps15a-ps4, Slc13a1, Clec2h, Kap,
## Slco1a6, not searching for symbol synonyms
## Warning: The following features are not present in the object: Miox, Rpl31-ps12,
## Spink1, H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: 1700016C15Rik,
## Pah, Akr1c21, Tmem174, Tmem254, Miox, Mep1a, Spink1, Glyat, Keg1, Defb29,
## Hsd3b4, Hao2, Cyp2j5, Guca2b, Kap, H2aj, Acsm2, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Ubb-ps, Gfus, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Golt1a, Mptx1,
## Mtarc2, Slc39a5, Rps15a-ps6, H2az2, Ubb-ps, Macroh2a1, Fam3d, Gsdmc2, Gfus,
## Cyp2d26, Pla2g10, Rpl31-ps12, Antkmt, Dpcd, Bbln, Hao2, Atp5pb, Fabp2, H2az1,
## Hyi, Guca2b, Rps15a-ps4, Sult1b1, Cdx2, Pals2, H2aj, Prap1, Defb37, Hsd17b2,
## Slc51b, Pigbos1, Gsta1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## H2ac23, H1f2, Fam3d, Tmem254, Gfus, Rpl31-ps12, Antkmt, Gm6402, Gm9320, H2az1,
## Cdx2, Smim30, Aqp8, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mptx1, H2az2,
## Ubb-ps, Hoxb13, H1f2, Fam3d, Gfus, Pla2g10, Cldn14, Tpsg1, Antkmt, Gm6402,
## Ttr, Cyp2c55, Bbln, Atp5pb, Fabp2, Guca2b, Pla2g2a, Smim30, H2aj, Scgb2b7, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Tlcd3a,
## Cldn25, Cldn14, Aldh3b2, Cdx2, Hoxa11os, Ush1c, Ddx39a, Get3, H2ax, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H2az1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9, Tmem254,
## Cldn25, H2az1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## Cyrib, Rpl31-ps12, H2az1, Rps15a-ps4, Gm15421, not searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9,
## G530011O06Rik, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Plac9,
## Rpl31-ps12, not searching for symbol synonyms
## Warning: The following features are not present in the object: Dnaaf10, Plac9,
## Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rpl32l,
## Rps15a-ps6, Ubb-ps, H2ac23, Bhmt, Tmem254, Gm12191, Rpl31-ps12, Morf4l1-ps1,
## Ndufs5-ps, Gm6402, Gm9320, Rpl34-ps1, Ptma-ps2, Rps15a-ps4, Gm15421, Mir703,
## Npm3-ps1, Gm6654, H2ax, Gm6222, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm7609, Rpl32l,
## Rps15a-ps6, H2az2, Ubb-ps, Rpl31-ps12, Morf4l1-ps1, Ndufs5-ps, Gm6402, Gm9320,
## Norad, Rpl34-ps1, Rps15a-ps4, Gm15421, Mir703, Gm6654, Gm6222, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Agxt, Rdh16f2,
## Bhmt, Tmem254, Ugt3a1, A1bg, Rpl31-ps12, Mup2, Mup20, Ambp, Rps15a-ps4, Hpd,
## Cyp3a44, Sult2a2, Sult2a1, Sult2a7, Prodh2, Hamp2, Aqp8, Apoa5, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: H2bc4, Ins2, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Tmem254, Cldn25,
## H2az1, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H1f4, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Gm4956, Atp5pb,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: H2bc4, H1f2,
## H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: Fam110d, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, H2ac23,
## H1f4, Macroh2a1, Antkmt, Bbln, H2az1, H2aj, H2ax, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Ins1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Gm4956, Mtarc2,
## H2bc4, H1f2, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, H1f4,
## Bbln, H2az1, H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: Niban2, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Tamalin, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## H1f2, Macroh2a1, Bbln, H2ac18, not searching for symbol synonyms
## Warning: The following features are not present in the object: H1f2, Macroh2a1,
## Antkmt, H2az1, H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Tenm2,
## Plac9, Tmem254, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## H2bc4, H2ac18, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Btn1a1,
## Tmem254, Slc66a2, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Wfdc18, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## Plac9, Tmem254, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Atp10d,
## Chaserr, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, H1f2,
## H3c1, Antkmt, Polr1h, Bbln, Smim30, H2aj, Exosc6, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: H1f5, H1f3,
## H2ac8, H1f4, Cldn13, Ngp, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mrgpra2b, Ngp,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Exosc6,
## H2ax, Gm6981, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2ac23, Fcnb,
## Gypa, H2ax, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Tmem254, Ngp, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Atp5pb, Smim30, Ddx39a, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2ac6, H2az1,
## Cldn13, Mrgpra2b, Gypa, Ddx39a, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2bc4, Bbln,
## H2ac18, H2aj, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ddx39a, Ngp, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Skp1, Ubb-ps,
## Polr1h, H2aj, 2610005L07Rik, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mrgpra2b, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ngp, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Tmem254,
## Antkmt, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mrgpra2b, Ngp,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Macroh2a1,
## Tmem254, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Fcnb, H2az1,
## Mrgpra2b, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ngp, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Tamalin,
## Tff2, Cela2a, 2610005L07Rik, not searching for symbol synonyms
## Warning: The following features are not present in the object: Cela2a, Try4,
## Reg1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Pyy,
## Dbpht2, H1f2, Scgn, Pnlip, Cela2a, Try4, Reg1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Syndig1l,
## Ucn3, H1f2, Isl1, Ins1, Gm13498, Neurod1, Nkx2-2, Sertm1, Kif12, Cela2a, Try4,
## Ins2, H2ap, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Dbpht2,
## Cela2a, Try4, Ush1c, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Cela2a,
## Try4, not searching for symbol synonyms
## Warning: The following features are not present in the object: 1810007D17Rik,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Pnliprp2,
## Ambp, Get3, Mmp7, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Antkmt,
## Mir24-2, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Ubb-ps,
## Norad, not searching for symbol synonyms
## Warning: The following features are not present in the object: Zbed6,
## Rps15a-ps6, B4galnt2, Slc4a1, Gm12191, Cyrib, Morf4l1-ps1, Ndufs5-ps,
## Tmem181c-ps, Mep1a, Cyp2c55, Niban2, Pck1, Fabp2, Sult1b1, Gm6654, Aqp8, Prap1,
## Gypa, Ces2a, Hsd17b2, Gcnt3, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Tamalin,
## Norad, Mrgprg, Mir24-2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2,
## Rps15a-ps6, H2az2, Ubb-ps, Calm5, Rpl31-ps12, Antkmt, Gm9320, Gm94, Bbln,
## 2310050C09Rik, Hyi, Cela2a, Oas1f, Smim30, BC064078, H2aj, Krtdap, Mt4, Exosc6,
## Apoc3, not searching for symbol synonyms
## Warning: The following features are not present in the object: Tfap2b, Mtarc2,
## H2az2, Tenm2, Ubb-ps, Krt24, Krt4, Hoxc8, Rpl34-ps1, Smim30, BC064078, H2aj,
## Irag2, Mir24-2, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## Ubb-ps, Calm5, Gfus, Krt4, Rpl31-ps12, Acer1, Gm9320, Hyi, Dlx5, BC064078,
## Exosc6, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps4, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, H2az1,
## not searching for symbol synonyms

## Warning: The following features are not present in the object: Ubb-ps, H2az1,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm4956,
## Rps15a-ps6, Gm9320, Rps15a-ps4, not searching for symbol synonyms
## Warning: The following features are not present in the object: Tmem254, Cldn25,
## H2az1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Macir, Cyrib,
## Rpl31-ps12, H2az1, Mrgpra2b, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2bc4, H2aj, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## Rpl31-ps12, H2az1, Rps15a-ps4, H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: Slc4a1,
## Rpl31-ps12, Epb42, Gm6654, Gypa, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Polr1f,
## H2ac23, H2bc4, H1f2, Macroh2a1, Tmem254, Rpl31-ps12, Antkmt, Polr1h, Gm9320,
## Atp5pb, H2az1, Gm15421, Mir703, Smim30, H2ax, Pigbos1, Erdr1, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Antkmt, Gm6402,
## H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: Erdr1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Ubb-ps,
## H2ac23, H2ac11, H2ac8, Macroh2a1, Antkmt, H2-T10, Atp5pb, H2az1, H2aj, Ddx39a,
## Exosc6, H2ax, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Serpinb3a, Krt36,
## H2ac23, Plac9, Gm94, Sprr1b, H2az1, Krtdap, Ddx39a, H2ax, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Krtap3-3, Krt36,
## Plac9, Tmem254, Krt84, Sprr1b, Krtdap, Defb4, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Mideas,
## H2ac13, H3c1, Obi1, Ins1, Adprs, Cela2a, Ins2, 6820431F20Rik, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Tmem181c-ps, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H2aw, H2bc4,
## Gm9320, Atp5pb, H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## Ubb-ps, Rpl31-ps12, Gm6402, Gm9320, not searching for symbol synonyms
## Warning: The following features are not present in the object: Garre1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Dcpp3, Gm6402,
## Npm3-ps1, not searching for symbol synonyms
chosen <- c(3, 9, 11, 36, 43, 42, 14)
names(broad_types)[chosen]
## [1] "DESCARTES_ORGANOGENESIS_HEPATOCYTES"                  
## [2] "DESCARTES_ORGANOGENESIS_WHITE_BLOOD_CELLS"            
## [3] "DESCARTES_ORGANOGENESIS_EPITHELIAL_CELLS"             
## [4] "DESCARTES_ORGANOGENESIS_NUETROPHILS"                  
## [5] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_T_CELL_AGEING"
## [6] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_B_CELL_AGEING"
## [7] "DESCARTES_ORGANOGENESIS_JAW_AND_TOOTH_PROGENITORS"
columns <- paste0("m8", chosen)
VlnPlot(wtf, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Error: Cannot find 'res0p1_clusters' in this Seurat object
chosen <- c(50, 51, 60, 61, 62, 65, 66)
names(broad_types)[chosen]
## [1] "TABULA_MURIS_SENIS_BLADDER_LEUKOCYTE_AGEING"            
## [2] "TABULA_MURIS_SENIS_BRAIN_MYELOID_MACROPHAGE_AGEING"     
## [3] "TABULA_MURIS_SENIS_DIAPHRAGM_B_CELL_AGEING"             
## [4] "TABULA_MURIS_SENIS_DIAPHRAGM_ENDOTHELIAL_CELL_AGEING"   
## [5] "TABULA_MURIS_SENIS_DIAPHRAGM_MACROPHAGE_AGEING"         
## [6] "TABULA_MURIS_SENIS_GONADAL_ADIPOSE_TISSUE_B_CELL_AGEING"
## [7] "TABULA_MURIS_SENIS_GONADAL_ADIPOSE_TISSUE_T_CELL_AGEING"
columns <- paste0("m8", chosen)
VlnPlot(wtf, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Error: Cannot find 'res0p1_clusters' in this Seurat object
chosen <- c(115, 118, 119, 120, 121, 125, 128)
names(broad_types)[chosen]
## [1] "TABULA_MURIS_SENIS_LIVER_MATURE_NK_T_CELL_AGEING"             
## [2] "TABULA_MURIS_SENIS_LUNG_CD4_POSITIVE_ALPHA_BETA_T_CELL_AGEING"
## [3] "TABULA_MURIS_SENIS_LUNG_CD8_POSITIVE_ALPHA_BETA_T_CELL_AGEING"
## [4] "TABULA_MURIS_SENIS_LUNG_NK_CELL_AGEING"                       
## [5] "TABULA_MURIS_SENIS_LUNG_T_CELL_AGEING"                        
## [6] "TABULA_MURIS_SENIS_LUNG_CLASSICAL_MONOCYTE_AGEING"            
## [7] "TABULA_MURIS_SENIS_LUNG_INTERMEDIATE_MONOCYTE_AGEING"
columns <- paste0("m8", chosen)
VlnPlot(wtf, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Error: Cannot find 'res0p1_clusters' in this Seurat object
chosen <- c(212, 211, 210, 209)
names(broad_types)[chosen]
## [1] "TABULA_MURIS_SENIS_TRACHEA_GRANULOCYTE_AGEING"                                   
## [2] "TABULA_MURIS_SENIS_TRACHEA_FIBROBLAST_AGEING"                                    
## [3] "TABULA_MURIS_SENIS_TRACHEA_ENDOTHELIAL_CELL_AGEING"                              
## [4] "TABULA_MURIS_SENIS_TRACHEA_BASAL_EPITHELIAL_CELL_OF_TRACHEOBRONCHIAL_TREE_AGEING"
columns <- paste0("m8", chosen)
VlnPlot(wtf, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Error: Cannot find 'res0p1_clusters' in this Seurat object
chosen <- c(176:182)
names(broad_types)[chosen]
## [1] "TABULA_MURIS_SENIS_PANCREAS_PANCREATIC_DELTA_CELL_AGEING"              
## [2] "TABULA_MURIS_SENIS_PANCREAS_PANCREATIC_POLYPEPTIDE_CELL_AGEING"        
## [3] "TABULA_MURIS_SENIS_PANCREAS_PANCREATIC_ACINAR_CELL_AGEING"             
## [4] "TABULA_MURIS_SENIS_PANCREAS_PANCREATIC_DUCTAL_CELL_AGEING"             
## [5] "TABULA_MURIS_SENIS_PANCREAS_PANCREATIC_STELLATE_CELL_AGEING"           
## [6] "TABULA_MURIS_SENIS_SUBCUTANEOUS_ADIPOSE_TISSUE_B_CELL_AGEING"          
## [7] "TABULA_MURIS_SENIS_SUBCUTANEOUS_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"
columns <- paste0("m8", chosen)
VlnPlot(wtf, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Error: Cannot find 'res0p1_clusters' in this Seurat object
chosen <- c(42:47)
names(broad_types)[chosen]
## [1] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_B_CELL_AGEING"                          
## [2] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_T_CELL_AGEING"                          
## [3] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"                
## [4] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_MESENCHYMAL_STEM_CELL_OF_ADIPOSE_AGEING"
## [5] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_MYELOID_CELL_AGEING"                    
## [6] "TABULA_MURIS_SENIS_BLADDER_BLADDER_CELL_AGEING"
columns <- paste0("m8", chosen)
VlnPlot(wtf, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Error: Cannot find 'res0p1_clusters' in this Seurat object
t_groups_idx <- grepl(pattern="_T_CELL", x=names(broad_types))
t_groups <- names(broad_types)[t_groups_idx]
t_nums <- which(t_groups_idx, broad_types)
columns <- paste0("m8", t_nums)
VlnPlot(wtf, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Error: Cannot find 'res0p1_clusters' in this Seurat object
t_groups
##  [1] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_T_CELL_AGEING"                             
##  [2] "TABULA_MURIS_SENIS_GONADAL_ADIPOSE_TISSUE_T_CELL_AGEING"                           
##  [3] "TABULA_MURIS_SENIS_HEART_T_CELL_AGEING"                                            
##  [4] "TABULA_MURIS_SENIS_KIDNEY_T_CELL_AGEING"                                           
##  [5] "TABULA_MURIS_SENIS_LIMB_MUSCLE_T_CELL_AGEING"                                      
##  [6] "TABULA_MURIS_SENIS_LIVER_MATURE_NK_T_CELL_AGEING"                                  
##  [7] "TABULA_MURIS_SENIS_LUNG_CD4_POSITIVE_ALPHA_BETA_T_CELL_AGEING"                     
##  [8] "TABULA_MURIS_SENIS_LUNG_CD8_POSITIVE_ALPHA_BETA_T_CELL_AGEING"                     
##  [9] "TABULA_MURIS_SENIS_LUNG_T_CELL_AGEING"                                             
## [10] "TABULA_MURIS_SENIS_LUNG_MATURE_NK_T_CELL_AGEING"                                   
## [11] "TABULA_MURIS_SENIS_MESENTERIC_ADIPOSE_TISSUE_CD4_POSITIVE_ALPHA_BETA_T_CELL_AGEING"
## [12] "TABULA_MURIS_SENIS_MESENTERIC_ADIPOSE_TISSUE_CD8_POSITIVE_ALPHA_BETA_T_CELL_AGEING"
## [13] "TABULA_MURIS_SENIS_MAMMARY_GLAND_T_CELL_AGEING"                                    
## [14] "TABULA_MURIS_SENIS_MARROW_CD4_POSITIVE_ALPHA_BETA_T_CELL_AGEING"                   
## [15] "TABULA_MURIS_SENIS_MARROW_MATURE_ALPHA_BETA_T_CELL_AGEING"                         
## [16] "TABULA_MURIS_SENIS_MARROW_NAIVE_T_CELL_AGEING"                                     
## [17] "TABULA_MURIS_SENIS_SPLEEN_CD4_POSITIVE_ALPHA_BETA_T_CELL_AGEING"                   
## [18] "TABULA_MURIS_SENIS_SPLEEN_CD8_POSITIVE_ALPHA_BETA_T_CELL_AGEING"                   
## [19] "TABULA_MURIS_SENIS_SPLEEN_T_CELL_AGEING"                                           
## [20] "TABULA_MURIS_SENIS_SPLEEN_MATURE_NK_T_CELL_AGEING"                                 
## [21] "TABULA_MURIS_SENIS_THYMUS_IMMATURE_T_CELL_AGEING"                                  
## [22] "TABULA_MURIS_SENIS_TRACHEA_T_CELL_AGEING"
t_groups_idx <- grepl(pattern="_EPITHELIAL_", x=names(broad_types))
t_groups <- names(broad_types)[t_groups_idx]
t_nums <- which(t_groups_idx, broad_types)
columns <- paste0("m8", t_nums)
VlnPlot(wtf, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Error: Cannot find 'res0p1_clusters' in this Seurat object
t_groups
##  [1] "DESCARTES_ORGANOGENESIS_EPITHELIAL_CELLS"                                                  
##  [2] "TABULA_MURIS_SENIS_KIDNEY_EPITHELIAL_CELL_OF_PROXIMAL_TUBULE_AGEING"                       
##  [3] "TABULA_MURIS_SENIS_KIDNEY_KIDNEY_COLLECTING_DUCT_EPITHELIAL_CELL_AGEING"                   
##  [4] "TABULA_MURIS_SENIS_KIDNEY_KIDNEY_DISTAL_CONVOLUTED_TUBULE_EPITHELIAL_CELL_AGEING"          
##  [5] "TABULA_MURIS_SENIS_KIDNEY_KIDNEY_LOOP_OF_HENLE_ASCENDING_LIMB_EPITHELIAL_CELL_AGEING"      
##  [6] "TABULA_MURIS_SENIS_KIDNEY_KIDNEY_LOOP_OF_HENLE_THICK_ASCENDING_LIMB_EPITHELIAL_CELL_AGEING"
##  [7] "TABULA_MURIS_SENIS_KIDNEY_KIDNEY_PROXIMAL_CONVOLUTED_TUBULE_EPITHELIAL_CELL_AGEING"        
##  [8] "TABULA_MURIS_SENIS_MAMMARY_GLAND_LUMINAL_EPITHELIAL_CELL_OF_MAMMARY_GLAND_AGEING"          
##  [9] "TABULA_MURIS_SENIS_SUBCUTANEOUS_ADIPOSE_TISSUE_EPITHELIAL_CELL_AGEING"                     
## [10] "TABULA_MURIS_SENIS_TRACHEA_BASAL_EPITHELIAL_CELL_OF_TRACHEOBRONCHIAL_TREE_AGEING"
t_groups_idx <- grepl(pattern="_ENDOTHELIAL_", x=names(broad_types))
t_groups <- names(broad_types)[t_groups_idx]
t_nums <- which(t_groups_idx, broad_types)
columns <- paste0("m8", t_nums)
VlnPlot(wtf, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Error: Cannot find 'res0p1_clusters' in this Seurat object
t_groups
##  [1] "DESCARTES_ORGANOGENESIS_ENDOTHELIAL_CELLS"                                    
##  [2] "TABULA_MURIS_SENIS_AORTA_AORTIC_ENDOTHELIAL_CELL_AGEING"                      
##  [3] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"              
##  [4] "TABULA_MURIS_SENIS_BLADDER_ENDOTHELIAL_CELL_AGEING"                           
##  [5] "TABULA_MURIS_SENIS_BRAIN_NON_MYELOID_ENDOTHELIAL_CELL_AGEING"                 
##  [6] "TABULA_MURIS_SENIS_DIAPHRAGM_ENDOTHELIAL_CELL_AGEING"                         
##  [7] "TABULA_MURIS_SENIS_GONADAL_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"            
##  [8] "TABULA_MURIS_SENIS_HEART_ENDOTHELIAL_CELL_OF_CORONARY_ARTERY_AGEING"          
##  [9] "TABULA_MURIS_SENIS_HEART_AND_AORTA_ENDOTHELIAL_CELL_OF_CORONARY_ARTERY_AGEING"
## [10] "TABULA_MURIS_SENIS_LIMB_MUSCLE_ENDOTHELIAL_CELL_AGEING"                       
## [11] "TABULA_MURIS_SENIS_LIVER_ENDOTHELIAL_CELL_OF_HEPATIC_SINUSOID_AGEING"         
## [12] "TABULA_MURIS_SENIS_LUNG_ENDOTHELIAL_CELL_OF_LYMPHATIC_VESSEL_AGEING"          
## [13] "TABULA_MURIS_SENIS_LUNG_VEIN_ENDOTHELIAL_CELL_AGEING"                         
## [14] "TABULA_MURIS_SENIS_MESENTERIC_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"         
## [15] "TABULA_MURIS_SENIS_MAMMARY_GLAND_ENDOTHELIAL_CELL_AGEING"                     
## [16] "TABULA_MURIS_SENIS_PANCREAS_ENDOTHELIAL_CELL_AGEING"                          
## [17] "TABULA_MURIS_SENIS_SUBCUTANEOUS_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"       
## [18] "TABULA_MURIS_SENIS_TRACHEA_ENDOTHELIAL_CELL_AGEING"
pander::pander(sessionInfo())

R version 4.2.0 (2022-04-22)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.UTF-8, LC_NUMERIC=C, LC_TIME=en_US.UTF-8, LC_COLLATE=en_US.UTF-8, LC_MONETARY=en_US.UTF-8, LC_MESSAGES=en_US.UTF-8, LC_PAPER=en_US.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.UTF-8 and LC_IDENTIFICATION=C

attached base packages: stats4, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: tibble(v.3.1.8), GSEABase(v.1.60.0), graph(v.1.76.0), annotate(v.1.76.0), XML(v.3.99-0.13), AnnotationDbi(v.1.60.0), skimr(v.2.1.5), purrr(v.1.0.0), ggplot2(v.3.4.0), SeuratObject(v.4.1.3), Seurat(v.4.3.0), hpgltools(v.1.0), testthat(v.3.1.6), reticulate(v.1.26), SummarizedExperiment(v.1.28.0), GenomicRanges(v.1.50.2), GenomeInfoDb(v.1.34.6), IRanges(v.2.32.0), S4Vectors(v.0.36.1), MatrixGenerics(v.1.10.0), matrixStats(v.0.63.0), Biobase(v.2.58.0) and BiocGenerics(v.0.44.0)

loaded via a namespace (and not attached): ica(v.1.0-3), ps(v.1.7.2), Rsamtools(v.2.14.0), foreach(v.1.5.2), lmtest(v.0.9-40), rprojroot(v.2.0.3), crayon(v.1.5.2), rbibutils(v.2.2.11), MASS(v.7.3-58.1), nlme(v.3.1-161), backports(v.1.4.1), sva(v.3.46.0), GOSemSim(v.2.24.0), rlang(v.1.0.6), XVector(v.0.38.0), HDO.db(v.0.99.1), ROCR(v.1.0-11), irlba(v.2.3.5.1), nloptr(v.2.0.3), callr(v.3.7.3), limma(v.3.54.0), filelock(v.1.0.2), BiocParallel(v.1.32.5), rjson(v.0.2.21), bit64(v.4.0.5), glue(v.1.6.2), sctransform(v.0.3.5), vipor(v.0.4.5), pbkrtest(v.0.5.1), parallel(v.4.2.0), processx(v.3.8.0), spatstat.sparse(v.3.0-0), DOSE(v.3.24.2), spatstat.geom(v.3.0-3), tidyselect(v.1.2.0), usethis(v.2.1.6), fitdistrplus(v.1.1-8), variancePartition(v.1.28.0), tidyr(v.1.2.1), zoo(v.1.8-11), GenomicAlignments(v.1.34.0), xtable(v.1.8-4), magrittr(v.2.0.3), evaluate(v.0.19), Rdpack(v.2.4), cli(v.3.5.0), zlibbioc(v.1.44.0), rstudioapi(v.0.14), miniUI(v.0.1.1.1), sp(v.1.5-1), bslib(v.0.4.2), fastmatch(v.1.1-3), aod(v.1.3.2), treeio(v.1.22.0), shiny(v.1.7.4), xfun(v.0.36), pkgbuild(v.1.4.0), gson(v.0.0.9), cluster(v.2.1.4), caTools(v.1.18.2), tidygraph(v.1.2.2), KEGGREST(v.1.38.0), ggrepel(v.0.9.2), ape(v.5.6-2), listenv(v.0.9.0), Biostrings(v.2.66.0), png(v.0.1-8), future(v.1.30.0), withr(v.2.5.0), bitops(v.1.0-7), ggforce(v.0.4.1), plyr(v.1.8.8), pillar(v.1.8.1), gplots(v.3.1.3), cachem(v.1.0.6), GenomicFeatures(v.1.50.3), fs(v.1.5.2), clusterProfiler(v.4.6.0), vctrs(v.0.5.1), ellipsis(v.0.3.2), generics(v.0.1.3), devtools(v.2.4.5), tools(v.4.2.0), beeswarm(v.0.4.0), munsell(v.0.5.0), tweenr(v.2.0.2), fgsea(v.1.24.0), DelayedArray(v.0.24.0), fastmap(v.1.1.0), compiler(v.4.2.0), pkgload(v.1.3.2), abind(v.1.4-5), httpuv(v.1.6.7), rtracklayer(v.1.58.0), sessioninfo(v.1.2.2), plotly(v.4.10.1), GenomeInfoDbData(v.1.2.9), gridExtra(v.2.3), edgeR(v.3.40.1), lattice(v.0.20-45), deldir(v.1.0-6), utf8(v.1.2.2), later(v.1.3.0), dplyr(v.1.0.10), BiocFileCache(v.2.6.0), jsonlite(v.1.8.4), scales(v.1.2.1), tidytree(v.0.4.2), pbapply(v.1.6-0), genefilter(v.1.80.2), lazyeval(v.0.2.2), promises(v.1.2.0.1), doParallel(v.1.0.17), R.utils(v.2.12.2), goftest(v.1.2-3), spatstat.utils(v.3.0-1), rmarkdown(v.2.19), cowplot(v.1.1.1), Rtsne(v.0.16), pander(v.0.6.5), downloader(v.0.4), uwot(v.0.1.14), igraph(v.1.3.5), survival(v.3.4-0), yaml(v.2.3.6), htmltools(v.0.5.4), memoise(v.2.0.1), profvis(v.0.3.7), BiocIO(v.1.8.0), locfit(v.1.5-9.7), graphlayouts(v.0.8.4), viridisLite(v.0.4.1), digest(v.0.6.31), assertthat(v.0.2.1), RhpcBLASctl(v.0.21-247.1), mime(v.0.12), rappdirs(v.0.3.3), repr(v.1.1.4), RSQLite(v.2.2.20), yulab.utils(v.0.0.6), future.apply(v.1.10.0), remotes(v.2.4.2), data.table(v.1.14.6), urlchecker(v.1.0.1), blob(v.1.2.3), R.oo(v.1.25.0), labeling(v.0.4.2), splines(v.4.2.0), RCurl(v.1.98-1.9), broom(v.1.0.2), hms(v.1.1.2), colorspace(v.2.0-3), base64enc(v.0.1-3), ggbeeswarm(v.0.7.1), aplot(v.0.1.9), ggrastr(v.1.0.1), sass(v.0.4.4), Rcpp(v.1.0.9), RANN(v.2.6.1), enrichplot(v.1.18.3), fansi(v.1.0.3), tzdb(v.0.3.0), brio(v.1.1.3), parallelly(v.1.33.0), R6(v.2.5.1), grid(v.4.2.0), ggridges(v.0.5.4), lifecycle(v.1.0.3), curl(v.4.3.3), minqa(v.1.2.5), leiden(v.0.4.3), jquerylib(v.0.1.4), PROPER(v.1.30.0), Matrix(v.1.5-3), qvalue(v.2.30.0), desc(v.1.4.2), RcppAnnoy(v.0.0.20), RColorBrewer(v.1.1-3), iterators(v.1.0.14), spatstat.explore(v.3.0-5), stringr(v.1.5.0), htmlwidgets(v.1.6.0), polyclip(v.1.10-4), biomaRt(v.2.54.0), shadowtext(v.0.1.2), gridGraphics(v.0.5-1), mgcv(v.1.8-41), globals(v.0.16.2), patchwork(v.1.1.2), spatstat.random(v.3.0-1), progressr(v.0.12.0), codetools(v.0.2-18), GO.db(v.3.16.0), gtools(v.3.9.4), prettyunits(v.1.1.1), dbplyr(v.2.2.1), R.methodsS3(v.1.8.2), gtable(v.0.3.1), DBI(v.1.1.3), ggfun(v.0.0.9), tensor(v.1.5), httr(v.1.4.4), highr(v.0.10), KernSmooth(v.2.23-20), stringi(v.1.7.8), vroom(v.1.6.0), progress(v.1.2.2), reshape2(v.1.4.4), farver(v.2.1.1), viridis(v.0.6.2), ggtree(v.3.6.2), xml2(v.1.3.3), boot(v.1.3-28.1), lme4(v.1.1-31), restfulr(v.0.0.15), readr(v.2.1.3), ggplotify(v.0.1.0), scattermore(v.0.8), bit(v.4.0.5), scatterpie(v.0.1.8), spatstat.data(v.3.0-0), ggraph(v.2.1.0), pkgconfig(v.2.0.3) and knitr(v.1.41)

message(paste0("This is hpgltools commit: ", get_git_commit()))
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 911e7d4beebdc73267ec4be631a305574289efd3
## This is hpgltools commit: Tue Jan 17 10:36:44 2023 -0500: 911e7d4beebdc73267ec4be631a305574289efd3
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
##message(paste0("Saving to ", this_save))
##tmp <- sm(saveme(filename=this_save))
LS0tCnRpdGxlOiAiUGxheWluZyB3aXRoIHNvbWUgbmV3IHNjUk5BU2VxIGRhdGE6IEErQiAyMDIzMDEuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQpsaWJyYXJ5KCJyZXRpY3VsYXRlIikKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpsdWFfZmlsdGVycyA8LSBybWFya2Rvd246OnBhbmRvY19sdWFfZmlsdGVyX2FyZ3MoInBhbmRvYy16b3R4dC5sdWEiKQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnByZXZpb3VzX2ZpbGUgPC0gIiIKdmVyIDwtICIyMDIzMDEiCgojI3RtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkKcm1kX2ZpbGUgPC0gImluZGV4X0FCLlJtZCIKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwdXJycikKbGlicmFyeShza2ltcikKbGlicmFyeShHU0VBQmFzZSkKbGlicmFyeSh0aWJibGUpCmBgYAoKIyBOb3RlczoKCiMjIFF1ZXJ5aW5nIERyLiBNb3NzZXIgMjAyMzAxMjMKCiogUXVlc3Rpb24gZnJvbSBOYWppYjogQ29ubmVjdGlvbiBiZXR3ZWVuIDUnIGxpYnJhcmllcyBhbmQgVkRKLCB0YWdzCiAgYXJlIGluIGZhY3Qgc2hhcmVkIGZyb20gVkRKL3N1cmZhY2UgdG8gdGhlICdwYXJlbnQnIEdFTS4gIEFwcmlsOiBEbwogIEdFTSBnZW5lcmF0aW9uLCB0aGVuIHNwbGl0IHRoZSByZXN1bHRpbmcgY0ROQSBhdCBjbGVhbnVwIHN0ZXAgdG8gdGhlCiAgcHJvdGVpbiBiYXJjb2RlIHNldCAoYXQgYmVhZCBjbGVhbnVwKSwgdGhlbiBnbyBpbnRvIHJlZ3VsYXIgNScKICBleHByZXNzaW9uIGxpYnJhcnksIGZyb20gd2hpY2ggYSBzZXQgb2Ygc3BlY2lmaWMgcHJpbWVycyBhcmUgdXNlZCB0bwogIGVucmljaCB0aGUgVkRKIHBvcnRpb24uICBUaHVzIGFsbCB0aHJlZSBoYXZlIHRoZSBzYW1lIHBhcmVudGFsIGNlbGwKICB0YWcuCiogUXVlc3Rpb24gZnJvbSBBcHJpbDogRG8gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGlucHV0czsgZnJvbSBob3cgbWFueSBjZWxscwogIGRpZCB3ZSByZWNvdmVyIHJlYWRzPyAgSGUgd2FudHMgMTAsMDAwIGNlbGxzIC8gYW5pbWFsLiAgQXByaWwgcG9vbGVkCiAgYWNjb3JkaW5nIHRvIDEweCByZWNvbW1lbmRhdGlvbnM6IDE6NCBWREo6ZXhwcmVzc2lvbiBsaWJyYXJ5LgogIFN1cmZhY2UgcHJvdGVpbiBsaWJyYXJpZXMgaGF2ZSBub3QgeWV0IGJlZW4gcnVuLCB0aGVzZSBoYXZlIHNlcGFyYXRlCiAgaW5kZXhlcyBhbmQgYXJlIG11Y2ggc2hvcnRlcjsgaW4gY29udHJhc3QgdGhlIFZESi9leHByZXNzaW9uCiAgbGlicmFyaWVzIGFyZSByZWxhdGl2ZWx5IHNpbWlsYXIgKDU1MCB2cyA2MzAgbnQpLgoqIEZyb20gTmFqaWI6IHdoeSA1JyB2cyAzJyBjYXB0dXJlPyAgTm90IGVudGlyZWx5IGNlcnRhaW4sIGJ1dCA1JyBraXQKICBpcyB1c2VkIGZvciBpbW11bm9sb2d5IHVzdWFsbHksIGFwcGFyZW50bHkuCiogUXVlc3Rpb25zIGFib3V0IHRoZSBjZWxsIHByZXBhcmF0aW9uczogd2hhdCB3YXMgdGhlIHN0YXR1cyBvZiB0aGUKICBjZWxscyBhdCBHRU0gZ2VuZXJhdGlvbj8gIENhbiB3ZSBsZWFybiBpZiB0aGF0IGFmZmVjdGVkIHRoZSBudW1iZXIKICBvZiBjZWxscyBvYnNlcnZlZCwgcmVhZHMvY2VsbD8gIENhbiBBcHJpbCB0d2VhayB0aGUgc2VxdWVuY2luZwogIGxpYnJhcnkgaW5wdXRzIHRvIGhlbHAgZXZlbiBvdXQgdGhlIGRpZmZlcmVuY2VzIGFjcm9zcyBzYW1wbGVzIGZvcgogIGZ1dHVyZSBydW5zIChnaXZlbiB0aGF0IHRoZXJlIGFyZSAzKEkgdGhpbmspIGNvbWluZyB1cCk/CiAgQ29udmVyc2VseSwgc2hvdWxkIEkgcmVwcm9jZXNzIHRoZSBzYW1wbGVzIHNvIHRoYXQgYWxsIHNhbXBsZXMgYXJlCiAgcGVyY2VpdmVkIGFzIGhhdmluZyB0aGUgbGVhc3QgbnVtYmVyIG9mIGNlbGxzIG9ic2VydmVkPwoqIFF1aWNrIHByaW1lciBvZiByZWNvbWJpbmF0aW9uIGFuZCBWKEQpSjogZWFjaCByZWNlcHRvciBpcwogIGhldGVyb2RpbWVyLCBoZWF2eSBjaGFpbiBoYXMgdGhlIGNvbnN0YW50LCBWLCBELCBhbmQgSi4gIENvbnZlcnNlbHkgdGhlCiAgbGlnaHQgY2hhaW4gaGFzIHRoZSBjb25zdGFudCBhbmQgdGhlIFZKLiAgSW4gVC1jZWxscywgYWxsZWxpYwogIGV4Y2x1c2lvbiByZXN1bHRzIGluIGEgc2luZ2xlIHJlc3VsdGluZyBleHByZXNpc29uIGV2ZW50LiAgSW4KICBCLWNlbGxzIHRoZXJlIG1heSBiZSBtYW55LiAgSW4tdG90byB0aGVyZSBpcyBhIG5lYXItaW5maW5pdGUgcmFuZG9tCiAgc2V0IG9mIHBvc3NpYmlsaXRpZXM7IHRoZXNlIGFyZSBhbGwgcmFuZG9tbHkgZ2VuZXJhdGVkIGR1cmluZwogIGRldmVsb3BtZW50LiAgQi1jZWxscyBhcmUgY29uc3RhbnRseSBtYWtpbmcgbmV3IGNvbWJpbmF0aW9ucyBkdXJpbmcKICB0aGUgbGlmZXNwYW4gLS0gVC1jZWxscyBhcmUgbG9uZy1saXZlZCBhbmQgY29uc3RhbnQgKERhdmUgZXhwbGFpbmVkCiAgYW4gZXhwZXJpbWVudCB3aGVyZSBzb21lb25lIHRyYW5zZmVycmVkIFQtY2VsbHMgZnJvbSBtb3VzZSB0byBtb3VzZQogIG92ZXIgdGhlIGNvdXJzZSBvZiBtYW55IHllYXJzKS4gIChvcmllbnRhdGlvbiA1Jy0+Myc/ICBjb25zdGFudC0+RC0+Sj8pCiogRXZlcnkgY2VsbCB0aGF0IHdhcyBzZXF1ZW5jZWQgaXMgaW4gdGhlb3J5IGEgVC1jZWxsICgibHVuZyBpbmZlY3RlZAogIFQtY2VsbHMgZnJvbSBtaWNlKSwgc28gc2hvdWxkIGFsbCBoYXZlIFZESiBzZXF1ZW5jZXMuICBBIHNtYWxsIHNldAogIG9mIGltbXVuZSBjZWxscyAoTkspIGRvIG5vdCBoYXZlIHRoZXNlLgoKIyMgQ2hlY2tpbiBtZWV0aW5nIHdpdGggRHIuIFBhcmsgMjAyMzAxMjQKCiogQXByaWwgZGVzY3JpYmluZyBvYnNlcnZhdGlvbnMsIGNlbGwgI3MgZXRjLgoqIERlZmluaXRlbHkgbm90IEZBQ1MsIHBlcmZvcm1lZCBuZWdhdGl2ZSBlbnJpY2htZW50IHdoaWNoIGluIHRoZW9yeSBnZXRzID49IDkwJSBwdXJlIHNhbXBsZXMuCiogTmFqaWIgcXVlcnk6IGxpbWl0IHRvIFZESiBjZWxscyBvbmx5PyAgVW5saWtlbHkuCiogSXQgc291bmRzIHRvIG1lIHRoYXQgdGhlIGxpa2VseSB0YXNrcyBJIHBlcmZvcm0gYXJlIG5vdCBuZWVkZWQgYnkgRHIuIFBhcmsuCgojIFRPRE86CgoqIENoZWNrIGV4cHJlc3Npb24gb2YgdGhlIHNhbXBsZXMgZm9yIGxldmVscyBvZiBDRDMuCiogUHJpbnQgb3V0IGZpbHRlcmVkIGFtb3VudHMgb24gYSBwZXItc2FtcGxlIGJhc2lzLgoqIFF1ZXJ5IG1TaWdEQiBjYXRlZ29yaWVzIG9mIGludGVyZXN0IChjdXJyZW50bHkgSSBncmFiYmVkIHRoZSB+OTgKICBpbmZsdWVuemEgY2F0ZWdvcmllcyBhcmJpdHJhcmlseSk6IGUuZy4gZmlndXJlIG91dCB3aGljaCBvbmVzIGFyZQogIGFjdHVhbGx5IHJlbGV2YW50LgoKIyBDaGFuZ2Vsb2cKCiMgUHJlcHJvY2Vzc2luZyB3aXRoIGNlbGxyYW5nZXIKCkkgZG93bmxvYWRlZCBhIG5ldyB2ZXJzaW9uIG9mIGNlbGxyYW5nZXIgYWxvbmcgd2l0aCB0aGUgdmFyaW91cwpyZWZlcmVuY2UgZmlsZXMgcHJvdmlkZWQgYnkgMTB4IGZvciB0aGUgVkQoSikgcmVmZXJlbmNlcyBldGMuICBJIGdvdCBhCmJpdCBkaXN0cmFjdGVkIGJ5IHRoZSBwaXBlbGluZSBsYW5ndWFnZSBpbXBsZW1lbnRlZCBieSAxMHggY2FsbGVkCidtYXJ0aWFuJy4gICBJIGhhdmUgdGhlIGZlZWxpbmcgdGhhdCBpdCBtaWdodCBwcm92ZSBhIGdvb2QgdGhpbmcgdG8KcGxheSB3aXRoLgoKSGVyZSBhcmUgdGhlIGNvbW1hbmRzIEkgcmFuIHRvIHNlcGFyYXRlIHRoZSBzYW1wbGVzIGFuZCBwZXJmb3JtIHRoZQphbGlnbm1lbnRzLiAgVGhlcmUgYXJlIDQgc2FtcGxlIG5hbWVzIGFuZCBlYWNoIHdhcyBkb25lIHdpdGggb25lIHJ1bgpvZiB0aGUgJ25vcm1hbCcgR0VYIHNjUk5BU2VxIG1ldGhvZCBhbmQgb25lIG9mIHRoZSAobmV3IHRvIG1lKSBWKEQpSgpsaWJyYXJ5LgoKIyBSZXJ1biB0aGUgcGlwZWxpbmUgd2l0aCBtdWx0aQoKQXByaWwga2luZGx5IHNlbnQgc29tZSBpbmZvcm1hdGlvbiBmcm9tIDEweCB3aGljaCBzaG93cyB0aGF0IEkgc2hvdWxkCmhhdmUgdXNlZCB0aGUgbXVsdGkgcGlwbGluZSB3aGVuIHByZXByb2Nlc3NpbmcgdGhlIGRhdGEuCgpJbnRyYS1NdXNjdWxhciB2cy4gTmFzYWwKCkkgd3JvdGUgNCBzZXBhcmF0ZSBjb25maWd1cmF0aW9uIGNzdiBmaWxlcyB1c2luZyB0aGUgdGVtcGxhdGVzIEkKZG93bmxvYWRlZCBhbmQgZm9sbG93aW5nIGEgbGl0dGxlIHJlYWRpbmcuICBJdCBzZWVtZWQgdG8gbWUgdGhhdCBJCnNob3VsZCBiZSBhYmxlIHRvIHByb2Nlc3MgdGhlbSBhbGwgYXMgYSBzaW5nbGUgY3N2IGZpbGUsIGJ1dCB3aGVuIEkKYXR0ZW1wdGVkIHRoYXQsIGNlbGxyYW5nZXIgZGlkIG5vdCByZWFjdCB3ZWxsLiAgSXQgYWxzbyB0b29rIGEgZmV3CnRyaWVzIGJlZm9yZSBJIGdvdCB0aGUgdmFyaW91cyByZWZlcmVuY2UvbGlicmFyeSBvcHRpb25zIGNvcnJlY3QuCgpOb3RlIHRoYXQgb25jZSBjZWxscmFuZ2VyIHN1Y2Nlc3NmdWxseSByYW4gZm9yIHRoZSBzYW1wbGVzIEkgbW92ZWQKdGhlbSB0byB0aGUgbXVsdGkvIGRpcmVjdG9yeSBzbyB0aGF0IEkgY2FuIGNvbXBhcmUgdGhlIG91dHB1dHMgdG8gd2hlbgpJIHNpbXBseSBkaWQgdGhlICdjb3VudCcgb3BlcmF0aW9uLgoKVGhlIGZvbGxvd2luZyBpbnZvY2F0aW9ucyBvZiBjZWxscmFuZ2VyIGFsbCBhcHBlYXIgdG8gd29yayB3aXRob3V0IGFueQpwcm9ibGVtcy4gIElkZWFsbHkgSSB3b3VsZCBsaWtlIHRoZW0gdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBydW4sIHRob3VnaC4KCiMjIyBTaGVuYW5pZ2FucyBmb3IgY29tYmluZWQgVkRKIHNhbXBsZXMKCk15IGF0dGVtcHRzIHNvIGZhciB0byB1c2UgdGhlIGNzdiBjb25maWd1cmF0aW9uIHRvIGNvbmNhdGVuYXRlCm11bHRpcGxlIHZkaiBsaWJyYXJpZXMgaGF2ZSBub3Qgd29ya2VkLCBzbyBJIGNob3NlIHRvIGRvIGl0IHRoZSBzdHVwaWQKd2F5LCB3aGljaCBpcyB3aGF0IEkgc2hvdWxkIGhhdmUganVzdCBkb25lIHRvIGJlZ2luIHdpdGguICBDYXZlYXQsIGl0CndvcmtzIGZpbmUgZm9yIHRoZSBnZXggbGlicmFyaWVzIHRvIGRvIGl0IHRoZSB3YXkgdGhlIGRvY3VtZW50YXRpb24Kc3VnZ2VzdHMuCgpgYGB7YmFzaCBzaGVuYW5pZ2FucywgZXZhbD1GQUxTRX0KY2QgcHJlcHJvY2Vzc2luZwpmb3IgaSBpbiBSMSBSMjsgZG8KICAgIGZvciBqIGluIENvbnRyb2wgTW9ja19NZXgwOSBJTV9NZXgwOSBJTl9NZXgwOTsgZG8KICAgICAgICBBX2ZpbGU9JCgvYmluL2xzIEFfJHtqfV9WREoqXyR7aX1fMDAxLmZhc3RxLmd6KQogICAgICAgIEJfZmlsZT0kKC9iaW4vbHMgQl8ke2p9X1ZESipfJHtpfV8wMDEuZmFzdHEuZ3opCiAgICAgICAgb3V0X2ZpbGU9IkNvbmNhdF8ke2p9X1ZESl8ke2l9LmZhc3RxLmd6IgogICAgICAgIGNwX2NtZD0iY3AgJHtBX2ZpbGV9ICR7b3V0X2ZpbGV9IgogICAgICAgIGVjaG8gIlJ1bm5pbmc6ICR7Y3BfY21kfS4iCiAgICAgICAgZXZhbCAkY3BfY21kCiAgICAgICAgY2F0X2NtZD0iY2F0ICR7Ql9maWxlfSA+PiAke291dF9maWxlfSIKICAgICAgICBlY2hvICJSdW5uaW5nOiAke2NhdF9jbWR9LiIKICAgICAgICBldmFsICRjYXRfY21kCiAgICBkb25lCmRvbmUKYGBgCgpgYGB7YmFzaCBjZWxscmFuZ2VydjIsIGV2YWw9RkFMU0V9Cm1vZHVsZSBhZGQgY2VsbHJhbmdlcgpjZWxscmFuZ2VyIG11bHRpIC0taWQgY29udHJvbCAtLWNzdiBzYW1wbGVfc2hlZXRzL211bHRpX2NvbmZpZ190cnkwNV9jb250cm9sLmNzdgpjZWxscmFuZ2VyIG11bHRpIC0taWQgbW9jayAtLWNzdiBzYW1wbGVfc2hlZXRzL211bHRpX2NvbmZpZ190cnkwNV9tb2NrLmNzdgpjZWxscmFuZ2VyIG11bHRpIC0taWQgbSAtLWNzdiBzYW1wbGVfc2hlZXRzL211bHRpX2NvbmZpZ190cnkwNV9tLmNzdgpjZWxscmFuZ2VyIG11bHRpIC0taWQgbiAtLWNzdiBzYW1wbGVfc2hlZXRzL211bHRpX2NvbmZpZ190cnkwNV9uLmNzdgoKbXYgY29udHJvbCBtb2NrIG0gbiAwMW11bHRpX2NvbWJpbmVkLwpgYGAKCiMgQW5ub3RhdGlvbnMKCkkgd29uZGVyIGlmIEkgY2FuIHB1dCB0aGUgZ2VuZSBhbm5vdGF0aW9ucyBpbnRvIHRoZSBtaXNjIHNsb3Qgb2YgdGhlCnNldXJhdCBkYXRhIHN0cnVjdHVyZT8gIEFuZCBwZXJoYXBzIG92ZXJsb2FkIGZEYXRhKCkgdG8gdXNlIGl0PwoKYGBge3IgaGczOF9mdW59CmFubm90YXRpb25zIDwtIGxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucygpJGFubm90YXRpb24KYnJpZWYgPC0gdW5pcXVlKGFubm90YXRpb25zWywgYygiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iKV0pCmBgYAoKIyBTZXQgcHJlZml4IG9mIHRoZSBkYXRhCgpgYGB7ciBwcmVmaXh9CiNwcmVmaXggPC0gIm11bHRpIgpwcmVmaXggPC0gIjAxbXVsdGlfY29tYmluZWQiCmBgYAoKIyBMb2FkIHRoZSBkYXRhIGludG8gU2V1cmF0IGFuZCBwb2tlIGF0IGl0CgpUaGUgZm9sbG93aW5nIGJsb2NrIGlzIG1vc3RseSBhIGN1dC9wYXN0ZSBvZiBpdHNlbGYgd2hlcmUgSSBzZXQgdGhlCihvdmVyKXNpbXBsaWZpZWQgbmFtZSBvZiBlYWNoIHNhbXBsZS4gIFRoaXMgdGhlbiBiZWNvbWVzIHRoZSB0ZW1wbGF0ZQpmb3IgdGhlIHBhdGggYW5kIHBhcmFtZXRlcnMgdXNlZCB0byByZWFkIHRoZSBkYXRhLCBjcmVhdGUgYSBzZXVyYXQKb2JqZWN0LCBhbmQgYWRkIHRoZSBjbG9ub3R5cGUgZGF0YSBmcm9tIHRoZSB2ZGogcnVuLgoKRm9yIHRoZSBtb21lbnQgSSB3YW50IHRvIGJlIGFibGUgdG8gcGxheSB3aXRoIHRoZSBpbmRpdmlkdWFsCnNhbXBsZXMgYXMgd2VsbCBhcyB0aGUgYWdncmVnYXRlIHNvIHRoYXQgSSBjYW4gYmV0dGVyIHVuZGVyc3RhbmQgdGhlCmRhdGEuICBTbyBJIGd1ZXNzIGl0IHdvcmtzIG91dCB0aGF0IEkgZGlkbid0IGZpZ3VyZSBvdXQgaG93IHRvIHJ1biBhbGwKdGhlIHNhbXBsZXMgYXQgdGhlIHNhbWUgdGltZSB2aWEgJ2NlbGxyYW5nZXIgbXVsdGknLgoKSSBhbSBwcmV0dHkgc3VyZSBTZXVyYXQncyBtZXJnZSgpIG92ZXJsb2FkIGFsbG93cyBvbmUgdG8ganVzdCBkbwonbWVyZ2UoYSxiLGMsZCxlLi4uKScgYnV0IEkgYW0gbm90IHVzaW5nIHRoYXQuCgpJIHdyb3RlIGEgbGl0dGxlIGZ1bmN0aW9uIHRvIG1ha2UgbG9hZGluZyB0aGUgU2V1cmF0IGRhdGEgZnJvbSBhCnNhbXBsZSBzaGVldCBlYXNpZXIuICBNeSBpbnRlbnRpb24gaXMgdG8gaGF2ZSBzb21lIG9mIHRoaXMgY29kZSB3cml0ZQpiYWNrIHRvIHRoYXQgc2FtcGxlIHNoZWV0LgoKYGBge3Igc2V1cmF0X2xvYWRpbmd9CmFsbCA8LSBjcmVhdGVfc2V1cmF0KCJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzLmNzdiIsIHZkal90X2NvbHVtbiA9ICJ2ZGp0Y2VsbHMiKQoKY29udHJvbF9jZWxsX2lkeCA8LSBhbGxbWyJvcmlnLmlkZW50Il1dID09ICJjb250cm9sIgpjb250cm9sX2NlbGxzIDwtIGFsbFssIGNvbnRyb2xfY2VsbF9pZHhdCm1vY2tfY2VsbF9pZHggPC0gYWxsW1sib3JpZy5pZGVudCJdXSA9PSAibW9jayIKbW9ja19jZWxscyA8LSBhbGxbLCBtb2NrX2NlbGxfaWR4XQptdXNjdWxhcl9jZWxsX2lkeCA8LSBhbGxbWyJvcmlnLmlkZW50Il1dID09ICJtIgptdXNjdWxhcl9jZWxscyA8LSBhbGxbLCBtdXNjdWxhcl9jZWxsX2lkeF0KbmFzYWxfY2VsbF9pZHggPC0gYWxsW1sib3JpZy5pZGVudCJdXSA9PSAibiIKbmFzYWxfY2VsbHMgPC0gYWxsWywgbmFzYWxfY2VsbF9pZHhdCmBgYAoKIyBRdWVyeSBmb3IgY2xvbm90eXBlcyBpbiB0aGUgaW5kaXZpZHVhbCBzYW1wbGVzIGFuZCB0aGUgZnVsbCBkYXRhc2V0LgoKYGBge3IgcXVlcnlfY2xvbm90eXBlc30KY29udHJvbF9jbG9ubyA8LSAhaXMubmEoY29udHJvbF9jZWxsc1tbInJhd19jbG9ub3R5cGVfaWQiXV0pCnN1bW1hcnkoY29udHJvbF9jbG9ubykKCm1vY2tfY2xvbm8gPC0gIWlzLm5hKG1vY2tfY2VsbHNbWyJyYXdfY2xvbm90eXBlX2lkIl1dKQpzdW1tYXJ5KG1vY2tfY2xvbm8pCgptX2Nsb25vIDwtICFpcy5uYShtdXNjdWxhcl9jZWxsc1tbInJhd19jbG9ub3R5cGVfaWQiXV0pCnN1bW1hcnkobV9jbG9ubykKCm5fY2xvbm8gPC0gIWlzLm5hKG5hc2FsX2NlbGxzW1sicmF3X2Nsb25vdHlwZV9pZCJdXSkKc3VtbWFyeShuX2Nsb25vKQpgYGAKCiMgSW5pdGlhbCBDbHVzdGVycwoKSSB3YW50IHRvIHRha2UgYSBjb3VwbGUgbWludXRlcyB0byBhZGQgc29tZSBhbm5vdGF0aW9ucyB0byB0aGUgc2V1cmF0Cm9iamVjdCwgbm90YWJseSBJIHdhbnQgdG8gc3RhdGUgdGhlIGlkZW50aXR5IHJlbGF0aW9uc2hpcHMgd2l0aCBzb21lCnNvcnQgb2YgbmFtZS4KClRodXMgSSB3aWxsIG1ha2UgYSB2ZWN0b3Igb2YgdGhlIHRoZSBzYW1wbGUgSURzIGFuZCBmb3IgZWFjaCBvbmUgbWFrZQphIGNhdGVnb3J5IG9mIHNlbGYvbm90LXNlbGYuICBOb3RlIHRoYXQgU2V1cmF0IGNvbWVzIHdpdGggYSBmdW5jdGlvbgonRmluZENvbnNlcnZlZE1hcmtlcnMoKScgb3Igc29tZXRoaW5nIGxpa2UgdGhhdCB3aGljaCBjb21wYXJlcyBlYWNoCnNlbGYgdG8gYWxsIG90aGVyIHNhbXBsZXMsIHNvIHRoaXMgbWF5IGJlIHJlZHVuZGFudDsgYnV0IGl0IGlzIGtpbmQgb2YKbmljZSB0byBiZSBhYmxlIHRvIHNlZSB0aGUgY2F0ZWdvcmllcyBhcyBhIHNldCBvZiBiaW5hcnkgaW5kZXhlcy4KCmBgYHtyIGluaXRpYWxfY2x1c3RlcnN9CmNsdXN0ZXJfbGV0dGVycyA8LSBhcy5mYWN0b3IoTEVUVEVSU1tJZGVudHMob2JqZWN0PWFsbCldKQpuYW1lcyhjbHVzdGVyX2xldHRlcnMpIDwtIGNvbG5hbWVzKHg9YWxsKQpzYW1wbGVfaWRzIDwtIGFzLmNoYXJhY3RlcihjbHVzdGVyX2xldHRlcnMpCmBgYAoKTm93IHRoYXQgSSBoYXZlIDQgaWRlbnRpY2FsIHZlY3RvcnMsIGZpbGwgdGhlbSB3aXRoIG15IGNob3NlbiBuYW1lcwpmb3IgdGhlIHNhbXBsZXMgYW5kIHdoZXRoZXIgdGhleSBkbyhudCkgaGF2ZSB0aGF0IGlkZW50aXR5LgoKYGBge3Igc2VsZl9ub3RzZWxmfQpjb250cm9sX2lkeCA8LSBzYW1wbGVfaWRzID09ICJBIgphbGxbWyJjb250cm9sX3N0YXRlIl1dIDwtICJTdGltdWxhdGVkIgphbGxAbWV0YS5kYXRhW2NvbnRyb2xfaWR4LCAiY29udHJvbF9zdGF0ZSJdIDwtICJDb250cm9sIgoKbW9ja19pZHggPC0gc2FtcGxlX2lkcyAgPT0gIkIiCmFsbFtbIm1vY2tfc3RhdGUiXV0gPC0gIk5vdCBNb2NrIgphbGxAbWV0YS5kYXRhW21vY2tfaWR4LCAiY29udHJvbF9zdGF0ZSJdIDwtICJNb2NrIgoKbW9ja19pZHggPC0gc2FtcGxlX2lkcyAgPT0gIkMiCmFsbFtbIm11c2N1bGFyX3N0YXRlIl1dIDwtICJOb3QgTXVzY3VsYXIiCmFsbEBtZXRhLmRhdGFbbW9ja19pZHgsICJtdXNjdWxhcl9zdGF0ZSJdIDwtICJNdXNjdWxhciIKCm1vY2tfaWR4IDwtIHNhbXBsZV9pZHMgID09ICJEIgphbGxbWyJuYXNhbF9zdGF0ZSJdXSA8LSAiTm90IE5hc2FsIgphbGxAbWV0YS5kYXRhW21vY2tfaWR4LCAibmFzYWxfc3RhdGUiXSA8LSAiTmFzYWwiCmBgYAoKTm93IGFkZCB0aGVzZSBjYXRlZ29yaWVzIHRvIHRoZSBzYW1wbGUgbWV0YWRhdGEuICBJIHRoaW5rIHRoaXMgaXMgYQpnb29kIHBsYWNlIHRvIGNvbnNkaWVyIGhhdmluZyBhIHNhbXBsZSBzaGVldCBmcm9tIERyLiBQYXJrIHdpdGgKd2hhdGV2ZXIgb3RoZXIgcmFuZG9tIGluZm9ybWF0aW9uIG1pZ2h0IHByb3ZlIGludGVyZXN0aW5nIGFib3V0IHRoZQpzYW1wbGVzLgoKIyBGaWx0ZXJzIGFuZCBRQwoKTGV0IHVzIHN0YXJ0IGZpbHRlcmluZyB0aGUgZGF0YSwgbGVhZGluZyBvZmYgd2l0aCBhIGRlZmluaXRpb24gb2YgdGhlCm1pbmltdW0gbnVtYmVyIG9mIFJOQXMsIG1pbmltdW0gYW1vdW50IG9mIHJSTkEsIGFuZCBtYXhpbXVtCm1pdG9jaG9uZHJpYWwuICBJbiBhZGRpdGlvbiwgbGV0IHVzIHByaW50IGhvdyBtdWNoIG9mIGVhY2ggYXJlCm9ic2VydmVkIGJlZm9yZSBmaWx0ZXJpbmcuICBCZWZvcmUgd2UgY2FuIHByaW50L2ZpbHRlciB0aGVzZQphdHRyaWJ1dGVzLCB3ZSBtdXN0IHVzZSB0aGUgUGVyY2VudGFnZUZlYXR1cmVTZXQoKSB0byBnZXQgdGhlCm51bWJlcnMuLi4KCmBgYHtyIGZpbHRlcl90aHJlc2hvbGRzfQptaW5fbnVtX3JuYSA8LSAyMDAKbWluX3BjdF9yaWJvIDwtIDUKbWF4X3BjdF9taXRvIDwtIDIwCgphbGwgPC0gcmVjb3JkX3NldXJhdF9zYW1wbGVzKGFsbCwgdHlwZT0ibnVtX2NlbGxzIikKCmFsbFtbInBlcmNlbnRfbXQiXV0gPC0gUGVyY2VudGFnZUZlYXR1cmVTZXQoYWxsLCBwYXR0ZXJuPSJebXQtIikKYWxsW1sicGVyY2VudF9yaWJvIl1dIDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KGFsbCwgcGF0dGVybj0iXlJwW3NsXSIpCmBgYAoKU2hvdyB0aGUgc3RhdGUgYmVmb3JlIGZpbHRlcmluZyBvbiBhIHBlci1jZWxsIGJhc2lzIGFjcm9zcyBhbGwKc2FtcGxlcy4gU3RhcnQgd2l0aCB0aGUgbnVtYmVyIG9mIGNlbGxzCgoKYGBge3Igc2hvd19udW1fY2VsbHN9CnNhbXBsZV9zdW1tYXJpZXMgPC0gYXNfdGliYmxlKGRhdGEuZnJhbWUoCiAgICAiaWQiID0gYygiY29udHJvbCIsICJtb2NrIiwgIm11c2N1bGFyIiwgIm5hc2FsIiksCiAgICAic3RhcnRfY2VsbHMiID0gYygKICAgICAgICBzdW0oYWxsQG1ldGEuZGF0YVtbIm9yaWcuaWRlbnQiXV0gPT0gImNvbnRyb2wiKSwKICAgICAgICBzdW0oYWxsQG1ldGEuZGF0YVtbIm9yaWcuaWRlbnQiXV0gPT0gIm1vY2siKSwKICAgICAgICBzdW0oYWxsQG1ldGEuZGF0YVtbIm9yaWcuaWRlbnQiXV0gPT0gIm0iKSwKICAgICAgICBzdW0oYWxsQG1ldGEuZGF0YVtbIm9yaWcuaWRlbnQiXV0gPT0gIm4iKSkpKQpgYGAKCmBgYHtyIHNob3dfYWxsX3N1bW1hcmllc30Kc2tpbShhbGxbWyJwZXJjZW50X210Il1dKQpza2ltKGFsbFtbInBlcmNlbnRfcmlibyJdXSkKc2tpbShhbGxbWyJuRmVhdHVyZV9STkEiXV0pCnNraW0oYWxsW1sibkNvdW50X1JOQSJdXSkKIyMgTGVuZ3RoIGFuZCByZWFkcyBhcmUgZm9yIG9ubHkgdGhvc2UgY2VsbHMgd2l0aCBjbG9ub3R5cGVzLgpza2ltKGFsbFtbInJlYWRzIl1dKQpza2ltKGFsbFtbImxlbmd0aCJdXSkKCiMjIEhvdyBtYW55IGNlbGxzIGhhdmUgc3BlY2lmaWMgY2hhaW5zIGFzc29jaWF0ZWQgd2l0aCB0aGVtCnN1bSghaXMubmEoYWxsJGNoYWluKSkKYGBgCgpBbmQgb24gYSBwZXItc2FtcGxlIGJhc2lzIHdpdGggKG5ldyB0byBtZSkgc2tpbXIsIHdoaWNoIHByb3ZpZGVzIGEKcHJldHR5IHN1bW1hcnkgb2YgdGhlIGNhdGVnb3J5IG9mIGludGVyZXN0LiAgVGhlIHdheSBJIHdyb3RlIHRoZQpmb2xsb3dpbmcgc3RhbnphcyBzaG91bGQgYWxzbyBhcHBlbmQgbmV3IGNvbHVtbnMgdG8gbXkKc2FtcGxlX3N1bW1hcmllcyB0YWJsZSBjb21wcmlzZWQgb2YgdGhlIG1lYW4gdmFsdWVzIGZvciB0aGVzZQplbGVtZW50cy4KCmBgYHtyIHNob3dfc3RhdGVfc2FtcGxlc30KYWxsIDwtIHJlY29yZF9zZXVyYXRfc2FtcGxlcyhhbGwsIHR5cGU9Im51bV9jZWxscyIpICU+JQogIHJlY29yZF9zZXVyYXRfc2FtcGxlcyh0eXBlPSJuRmVhdHVyZV9STkEiKSAlPiUKICByZWNvcmRfc2V1cmF0X3NhbXBsZXModHlwZT0ibkNvdW50X1JOQSIpICU+JQogIHJlY29yZF9zZXVyYXRfc2FtcGxlcyh0eXBlPSJyZWFkcyIsIGNvbHVtbl9uYW1lPSJjbG9ub3R5cGVfcmVhZHMiKSAlPiUKICByZWNvcmRfc2V1cmF0X3NhbXBsZXModHlwZT0icGN0X21pdG8iLCBwYXR0ZXJuPSJebXQtIikgJT4lCiAgcmVjb3JkX3NldXJhdF9zYW1wbGVzKHR5cGU9InBjdF9yaWJvIiwgcGF0dGVybj0iXlJwW3NsXSIpCmBgYAoKYGBge3IgcHJpbnRfbWV0YX0KIyMgVGhlIHJlY29yZGVkIGluZm9ybWF0aW9uIGlzIGhlcmUsIGJ1dCBub3QgcHJpbnRpbmcgaXQgZm9yIG5vdzoKYWxsQG1pc2NbWyJzYW1wbGVfbWV0YWRhdGEiXV0KYGBgCgpPaywgdGhhdCB3YXMgZnVuOyBsZXRzIGxvb2sgYXQgdGhpcyBpbmZvcm1hdGlvbiBhcyBhIHNlcmllcyBvZiBwbG90czoKCmBgYHtyIGZpbHRlcnNfcWN9ClZsblBsb3QoYWxsLCBmZWF0dXJlcz0ibkZlYXR1cmVfUk5BIiwgcHQuc2l6ZT0wKQpWbG5QbG90KGFsbCwgZmVhdHVyZXM9InBjdF9taXRvIiwgcHQuc2l6ZT0wKQpWbG5QbG90KGFsbCwgZmVhdHVyZXM9InBjdF9yaWJvIiwgcHQuc2l6ZT0wKQpWbG5QbG90KGFsbCwgZmVhdHVyZXM9Im5Db3VudF9STkEiLCBwdC5zaXplPTApClZsblBsb3QoYWxsLCBmZWF0dXJlcz0icmVhZHMiLCBwdC5zaXplPTApCiMjIEkgYW0gY3VyaW91cyBhYm91dCB0aGUgbGVuZ3RoIG9mIHRoZSBjbG9ub3R5cGUgc2VxdWVuY2VzLgpWbG5QbG90KGFsbCwgZmVhdHVyZXM9Imxlbmd0aCIsIHB0LnNpemU9MCkKCkZlYXR1cmVTY2F0dGVyKGFsbCwgInBjdF9yaWJvIiwgInBjdF9taXRvIikKRmVhdHVyZVNjYXR0ZXIoYWxsLCAibkNvdW50X1JOQSIsICJuRmVhdHVyZV9STkEiKQpGZWF0dXJlU2NhdHRlcihhbGwsICJuQ291bnRfUk5BIiwgInBjdF9yaWJvIikKRmVhdHVyZVNjYXR0ZXIoYWxsLCAibkNvdW50X1JOQSIsICJwY3RfbWl0byIpCmBgYAoKIyBGaWx0ZXIgc2FtcGxlcyB1c2luZyBvdXIgZ3Vlc3N0aW1hdGVzCgpTdGFydCB3aXRoIGEgbWluaW11bSBudW1iZXIgb2YgUk5BcyBmaWx0ZXIuCgpgYGB7ciBmaWx0ZXJfbWluX3JuYXN9CnN1ZmZpY2llbnRfcm5hX29ic2VydmVkIDwtIFdoaWNoQ2VsbHMoYWxsLCBleHByZXNzaW9uPW5GZWF0dXJlX1JOQSA+PSBtaW5fbnVtX3JuYSkKZmlsdCA8LSBzdWJzZXQoYWxsLCBjZWxscz1zdWZmaWNpZW50X3JuYV9vYnNlcnZlZCkKYGBgCgpTZWNvbmQgSSB3aWxsIGNoZWNrIHRoYXQgdGhlIG51bWJlciBvZiByZWFkcy9ybmEgYWNyb3NzIGNlbGxzIGlzCnN1ZmZpY2llbnQsIHRoYXQgZmlsdGVyIGRvZXMgbm90aGluZyBjdXJyZW50bHksIHdoaWNoIEkgdGhpbmsgaXMgZ29vZC4KCmBgYHtyIGZpbHRlcl9yaWJvc29tYWx9CiMjIEkgdGhpbmsgdGhpcyBmaWx0ZXIgZG9lcyBub3RoaW5nIGluIGl0cyBjdXJyZW50IGZvcm0uCnN1ZmZpY2llbnRseV9vYnNlcnZlZF9pZHggPC0gcm93U3VtcyhmaWx0KSA+IDMKc3VtbWFyeShzdWZmaWNpZW50bHlfb2JzZXJ2ZWRfaWR4KQpkaW0oZmlsdCkKZmlsdCA8LSBzdWJzZXQoZmlsdCwgZmVhdHVyZXM9cm93bmFtZXMoZmlsdClbc3VmZmljaWVudGx5X29ic2VydmVkX2lkeF0pCmRpbShmaWx0KQoKIyMgS2VlcCBjZWxscyB3aXRoIGF0IGxlYXN0IHNvbWUgcmlib3NvbWFsIHJlYWRzCiMjIE5vdGUgdGhlIFBlcmNlbnQgZnVuY3Rpb24gYWJvdmUgYWN0dWFsbHkgcHV0cyBpbiBhIGZsb2F0aW5nIHBvaW50CiMjIG51bWJlciBmcm9tIDAtMTAwLCBub3QgKGFzIEkgYXNzdW1lZCBmcm9tIDAtMSkuCmhpZ2hfcmlib3NvbWFsIDwtIFdoaWNoQ2VsbHMoZmlsdCwgZXhwcmVzc2lvbj1wZXJjZW50X3JpYm8gPj0gbWluX3BjdF9yaWJvKQpmaWx0IDwtIHN1YnNldChmaWx0LCBjZWxscz1oaWdoX3JpYm9zb21hbCkKYGBgCgpFeGNsdWRlIGNlbGxzIHdpdGggdG9vIG11Y2ggbWl0b2Nob25kcmlhbCBSTkEKCiMjIE5vdyBkcm9wIG1pdG9jaG9uZHJpYWwgZ2VuZXMKCmBgYHtyIGZpbHRlcl9taXRvfQpsb3dfbWl0b2Nob25kcmlhbCA8LSBXaGljaENlbGxzKGZpbHQsIGV4cHJlc3Npb249cGVyY2VudF9tdCA8PSBtYXhfcGN0X21pdG8pCmZpbHQgPC0gc3Vic2V0KGZpbHQsIGNlbGxzPWxvd19taXRvY2hvbmRyaWFsKQpgYGAKCiMgUmVjb3JkIHBvc3QtZmlsdGVyZWQgc3RhdHMKCmBgYHtyIHBvc3RfZmlsdF9zdGF0c30KZmlsdCA8LSByZWNvcmRfc2V1cmF0X3NhbXBsZXMoZmlsdCwgdHlwZT0ibnVtX2NlbGxzIikgJT4lCiAgcmVjb3JkX3NldXJhdF9zYW1wbGVzKHR5cGU9Im5GZWF0dXJlX1JOQSIpICU+JQogIHJlY29yZF9zZXVyYXRfc2FtcGxlcyh0eXBlPSJuQ291bnRfUk5BIikgJT4lCiAgcmVjb3JkX3NldXJhdF9zYW1wbGVzKHR5cGU9InJlYWRzIiwgY29sdW1uX25hbWU9ImNsb25vdHlwZV9yZWFkcyIpICU+JQogIHJlY29yZF9zZXVyYXRfc2FtcGxlcyh0eXBlPSJwY3RfbWl0byIsIHBhdHRlcm49Il5tdC0iKSAlPiUKICByZWNvcmRfc2V1cmF0X3NhbXBsZXModHlwZT0icGN0X3JpYm8iLCBwYXR0ZXJuPSJeUnBbc2xdIikKYGBgCgpBZGQgdGhlIG5ldyBmaWx0ZXJlZCBtZWFuIHZhbHVlcyBvbnRvIHRoZSBvcmlnaW5hbCBzZXQuCgpgYGB7ciBjYmluZF9tZXRhfQphbGxAbWlzYyRzYW1wbGVfbWV0YWRhdGEgPC0gY2JpbmQoYWxsQG1pc2Mkc2FtcGxlX21ldGFkYXRhLCBmaWx0QG1pc2Mkc2FtcGxlX21ldGFkYXRhKQpgYGAKCiMgRGlzdHJpYnV0aW9uCgojIyBCZWZvcmUgZmlsdGVyaW5nCgpgYGB7ciBkaXN0cmlidXRpb259CmFsbF9ub3JtIDwtIE5vcm1hbGl6ZURhdGEob2JqZWN0PWFsbCkgJT4lCiAgRmluZFZhcmlhYmxlRmVhdHVyZXMoKSAlPiUKICBTY2FsZURhdGEoKSAlPiUKICBGaW5kTmVpZ2hib3JzKCkgJT4lCiAgRmluZENsdXN0ZXJzKCkgJT4lCiAgUnVuUENBKCkgJT4lCiAgUnVuVFNORSgpICU+JQogIFJ1blVNQVAocmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjEwKQoKRGltUGxvdChvYmplY3Q9YWxsX25vcm0sIHJlZHVjdGlvbj0idHNuZSIpCnBsb3R0ZWQgPC0gRGltUGxvdChhbGxfbm9ybSwgcmVkdWN0aW9uPSJ1bWFwIiwgZ3JvdXAuYnk9Im9yaWcuaWRlbnQiLCBsYWJlbD1UUlVFKQpwbG90dGVkCmBgYAoKIyMgQWZ0ZXIgZmlsdGVyaW5nCgpgYGB7ciBkaXN0cmlidXRpb25fcG9zdH0KZmlsdF9ub3JtIDwtIE5vcm1hbGl6ZURhdGEob2JqZWN0PWZpbHQpICU+JQogIEZpbmRWYXJpYWJsZUZlYXR1cmVzKCkgJT4lCiAgU2NhbGVEYXRhKCkgJT4lCiAgRmluZE5laWdoYm9ycygpICU+JQogIEZpbmRDbHVzdGVycygpICU+JQogIFJ1blBDQSgpICU+JQogIFJ1blRTTkUoKSAlPiUKICBSdW5VTUFQKHJlZHVjdGlvbj0icGNhIiwgZGltcz0xOjEwKQoKRGltUGxvdChvYmplY3Q9ZmlsdF9ub3JtLCByZWR1Y3Rpb249InRzbmUiKQpwbG90dGVkIDwtIERpbVBsb3QoZmlsdF9ub3JtLCByZWR1Y3Rpb249InVtYXAiLCBncm91cC5ieT0ib3JpZy5pZGVudCIsIGxhYmVsPVRSVUUpCnBsb3R0ZWQKYGBgCgpgYGB7ciBjaG9vc2VfZGltc30KZmlsdF9ub3JtIDwtIEphY2tTdHJhdyhmaWx0X25vcm0sIG51bS5yZXBsaWNhdGU9MTApCmZpbHRfbm9ybSA8LSBTY29yZUphY2tTdHJhdyhmaWx0X25vcm0pCkphY2tTdHJhd1Bsb3QoZmlsdF9ub3JtKQpFbGJvd1Bsb3QoZmlsdF9ub3JtKQojIyBTbyBJIGFtIHRoaW5raW5nIG1heWJlIDQtMTA/CndhbnRlZF9kaW1zIDwtIDYKCmZpbHRfbm9ybSA8LSBGaW5kTmVpZ2hib3JzKGZpbHRfbm9ybSwgZGltcz0xOndhbnRlZF9kaW1zKSAlPiUKICBGaW5kQ2x1c3RlcnMocmVzb2x1dGlvbj0wLjUpICU+JQogIFN0YXNoSWRlbnQoc2F2ZS5uYW1lPSJyZXMwcDVfY2x1c3RlcnMiKQpSdW5VTUFQKGZpbHRfbm9ybSwgZGltcz0xOjkpCkRpbVBsb3QoZmlsdF9ub3JtLCBsYWJlbD1UUlVFKQoKZmlsdF9ub3JtIDwtIEZpbmRDbHVzdGVycyhmaWx0X25vcm0sIHJlc29sdXRpb249MC4xKSAlPiUKICBGaW5kTmVpZ2hib3JzKGsucGFyYW09NikgJT4lCiAgU3Rhc2hJZGVudChzYXZlLm5hbWU9InJlczBwMV9jbHVzdGVycyIpClJ1blVNQVAoZmlsdF9ub3JtLCBkaW1zPTE6OSkKRGltUGxvdChmaWx0X25vcm0sIGxhYmVsPVRSVUUpCmBgYAoKQWRkIGludG8gdGhlIG1ldGFkYXRhIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc2FtcGxlIElEIGFuZCB0aGUgY2x1c3RlciBJRAoKYGBge3IgY29tcGFyZV9jbHVzdGVyc30KaWRlbnRpdHlfdmVjdG9yIDwtIGZpbHRfbm9ybVtbIm9yaWcuaWRlbnQiXV1bWyJvcmlnLmlkZW50Il1dCmNsYXNzKGlkZW50aXR5X3ZlY3RvcikKY2x1c3Rlcl92ZWN0b3IgPC0gYXMuY2hhcmFjdGVyKGZpbHRfbm9ybVtbInJlczBwMV9jbHVzdGVycyJdXVtbInJlczBwMV9jbHVzdGVycyJdXSkKY29uY2F0ZW5hdGVkX3ZlY3RvciA8LSBwYXN0ZTAoaWRlbnRpdHlfdmVjdG9yLCAiXyIsIGNsdXN0ZXJfdmVjdG9yKQpmaWx0X25vcm1bWyJjbHVzdGVyX3NhbXBsZSJdXSA8LSBjb25jYXRlbmF0ZWRfdmVjdG9yCmBgYAoKIyBBZGQgdGhlc2UgbmV3IGNsdXN0ZXJzIHRvIG91ciBub24tbm9ybWFsaXplZCBkYXRhCgpJIGFtIG5vdCB5ZXQgY2VydGFpbiBvZiBob3cgU2V1cmF0IGhhbmRsZXMgKG5vbilub3JtYWxpemVkIGRhdGEgZm9yCnRoZSB2YXJpb3VzIEZpbmRNYXJrZXJzIGZ1bmN0aW9ucy4gIFRodXMsIEkgYW0gYWRkaW5nIHRoZSBjbHVzdGVycwpmcm9tIHRoZSBkaW1lbnNpb24gcmVkdWN0aW9ucyB0byB0aGUgbm9uLW5vcm1hbGl6ZWQgZGF0YSBoZXJlLgoKYGBge3IgYWRkX2NsdXN0ZXJzX3RvX2ZpbHR9CmZpbHRbWyJyZXMwcDFfY2x1c3RlcnMiXV0gPC0gZmlsdF9ub3JtW1sicmVzMHAxX2NsdXN0ZXJzIl1dCmZpbHRbWyJjbHVzdGVyX3NhbXBsZSJdXSA8LSBmaWx0X25vcm1bWyJjbHVzdGVyX3NhbXBsZSJdXQpgYGAKCiMgVmFyaWFibGUgZmVhdHVyZXMKCmBgYHtyIHZhcmlhYmxlX2ZlYXR1cmVzfQp2YXIgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoZmlsdF9ub3JtKQptb3N0X3ZhciA8LSBoZWFkKFZhcmlhYmxlRmVhdHVyZXModmFyKSwgMzApCnZhcmlhYmxlX3Bsb3QgPC0gVmFyaWFibGVGZWF0dXJlUGxvdCh2YXIpCnZhcmlhYmxlX3Bsb3QgPC0gTGFiZWxQb2ludHMocGxvdD12YXJpYWJsZV9wbG90LCBwb2ludHM9bW9zdF92YXIsIHJlcGVsPVRSVUUpCnZhcmlhYmxlX3Bsb3QKYGBgCgojIFZhcmlvdXMgbWFya2VyIHNlYXJjaGVzCgojIyBBbGwgTWFya2VycwoKIyMjIEJ5IHNhbXBsZQoKUXVlc3Rpb246IElzIGl0IHNtYXJ0IGVub3VnaCB0byB1c2UgdGhlIHJhdyBkYXRhIGlmIEkgZ2l2ZQpGaW5kQWxsTWFya2VycyB0aGUgbm9ybWFsaXplZCBkYXRhPyAgRm9yIHRoZSBtb21lbnQgSSBkbyBub3QgdGhpbmsgSQp3aWxsIHJpc2sgaXQuCgpgYGB7ciBmaW5kYWxsbWFya2VyczAxfQpjb21iaW5lZF9tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGZpbHQsIG9ubHkucG9zPVRSVUUsIGxvZ2ZjLnRocmVzaG9sZD0wLjUpCmhlYWQoY29tYmluZWRfbWFya2VycykKCmNvbWJpbmVkIDwtIGFzLmRhdGEuZnJhbWUoY29tYmluZWRfbWFya2VycykKcm93bmFtZXMoY29tYmluZWQpIDwtIHRvdXBwZXIocm93bmFtZXMoY29tYmluZWQpKQphbm5vdGF0ZWRfbWFya2VycyA8LSBtZXJnZShjb21iaW5lZCwgYnJpZWYsIGJ5Lng9InJvdy5uYW1lcyIsIGJ5Lnk9ImhnbmNfc3ltYm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLng9VFJVRSkKYGBgCgojIyMgQnkgc2FtcGxlCgpgYGB7ciBmaW5kYWxsbWFya2VyczAyfQpjb21iaW5lZF9tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGZpbHQsIG9ubHkucG9zPVRSVUUsIGxvZ2ZjLnRocmVzaG9sZD0wLjUpCgpjb21iaW5lZCA8LSBhcy5kYXRhLmZyYW1lKGNvbWJpbmVkX21hcmtlcnMpCnJvd25hbWVzKGNvbWJpbmVkKSA8LSB0b3VwcGVyKHJvd25hbWVzKGNvbWJpbmVkKSkKYW5ub3RhdGVkX21hcmtlcnMgPC0gbWVyZ2UoY29tYmluZWQsIGJyaWVmLCBieS54PSJyb3cubmFtZXMiLCBieS55PSJoZ25jX3N5bWJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbC54PVRSVUUpCmhlYWQoYW5ub3RhdGVkX21hcmtlcnMpCmBgYAoKIyMjIEJ5IENsdXN0ZXIKClNpbmNlIEkgYW0gbm90IHVzaW5nIHRoZSBmaWx0X25vcm0gZGF0YSBzdHJ1Y3R1cmUsIEkgd2lsbCBuZWVkIHRvIHB1bGwKdGhlIGNsdXN0ZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgbm9ybWFsaXplZCBjb3B5Li4uCgpgYGB7ciBtYXJrZXJzX2J5X2NsdXN0ZXJ9CmNsdXN0ZXJzIDwtIGZpbHQKSWRlbnRzKGNsdXN0ZXJzKSA8LSBjbHVzdGVyc1tbInJlczBwMV9jbHVzdGVycyJdXQpjbHVzdGVyX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoY2x1c3RlcnMsIG9ubHkucG9zPVRSVUUsIGxvZ2ZjLnRocmVzaG9sZD0wLjUpCgpjbHVzdGVyX2dlbmVzIDwtIGFzLmRhdGEuZnJhbWUoY2x1c3Rlcl9tYXJrZXJzKQpyb3duYW1lcyhjbHVzdGVyX2dlbmVzKSA8LSB0b3VwcGVyKHJvd25hbWVzKGNsdXN0ZXJfZ2VuZXMpKQphbm5vdGF0ZWRfY2x1c3RlcnMgPC0gbWVyZ2UoY2x1c3Rlcl9nZW5lcywgYnJpZWYsIGJ5Lng9InJvdy5uYW1lcyIsIGJ5Lnk9ImhnbmNfc3ltYm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLng9VFJVRSkKaGVhZChhbm5vdGF0ZWRfY2x1c3RlcnMpCgphbm5vdGF0ZWRfY2x1c3RlcnMgJT4lCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lCiAgZHBseXI6OnRvcF9uKG49MTAsIHd0PWF2Z19sb2cyRkMpICU+JQogIGFzLmRhdGEuZnJhbWUoKQpgYGAKCmBgYHtyIGNvdW50X2NsdXN0ZXJfY2xvbm99CnN1bShjbHVzdGVyc1tbInJlczBwMV9jbHVzdGVycyJdXSA9PSAiMCIpCnN1bShjbHVzdGVyc1tbInJlczBwMV9jbHVzdGVycyJdXSA9PSAiMCIgJgogICAgIWlzLm5hKGNsdXN0ZXJzW1sicmF3X2Nsb25vdHlwZV9pZCJdXSkpCgpzdW0oY2x1c3RlcnNbWyJyZXMwcDFfY2x1c3RlcnMiXV0gPT0gIjEiKQpzdW0oY2x1c3RlcnNbWyJyZXMwcDFfY2x1c3RlcnMiXV0gPT0gIjEiICYKICAgICFpcy5uYShjbHVzdGVyc1tbInJhd19jbG9ub3R5cGVfaWQiXV0pKQoKc3VtKGNsdXN0ZXJzW1sicmVzMHAxX2NsdXN0ZXJzIl1dID09ICIyIikKc3VtKGNsdXN0ZXJzW1sicmVzMHAxX2NsdXN0ZXJzIl1dID09ICIyIiAmCiAgICAhaXMubmEoY2x1c3RlcnNbWyJyYXdfY2xvbm90eXBlX2lkIl1dKSkKCnN1bShjbHVzdGVyc1tbInJlczBwMV9jbHVzdGVycyJdXSA9PSAiMyIpCnN1bShjbHVzdGVyc1tbInJlczBwMV9jbHVzdGVycyJdXSA9PSAiMyIgJgogICAgIWlzLm5hKGNsdXN0ZXJzW1sicmF3X2Nsb25vdHlwZV9pZCJdXSkpCgpzdW0oY2x1c3RlcnNbWyJyZXMwcDFfY2x1c3RlcnMiXV0gPT0gIjQiKQpzdW0oY2x1c3RlcnNbWyJyZXMwcDFfY2x1c3RlcnMiXV0gPT0gIjQiICYKICAgICFpcy5uYShjbHVzdGVyc1tbInJhd19jbG9ub3R5cGVfaWQiXV0pKQoKc3VtKGNsdXN0ZXJzW1sicmVzMHAxX2NsdXN0ZXJzIl1dID09ICI1IikKc3VtKGNsdXN0ZXJzW1sicmVzMHAxX2NsdXN0ZXJzIl1dID09ICI1IiAmCiAgICAhaXMubmEoY2x1c3RlcnNbWyJyYXdfY2xvbm90eXBlX2lkIl1dKSkKCnN1bShjbHVzdGVyc1tbInJlczBwMV9jbHVzdGVycyJdXSA9PSAiNiIpCnN1bShjbHVzdGVyc1tbInJlczBwMV9jbHVzdGVycyJdXSA9PSAiNiIgJgogICAgIWlzLm5hKGNsdXN0ZXJzW1sicmF3X2Nsb25vdHlwZV9pZCJdXSkpCmBgYAoKQ2x1c3RlcnMgMCBhbmQgNSBoYXZlIGEgZ3JlYXQgbWFqb3JpdHkgb2YgdGhlIGNsb25vdHlwZXMuCjAgaGFzIHNvbWV0aGluZyBsaWtlIDkwJSwgNSBoYXMgfiAzMCUsIHRoZSBvdGhlcnMgfiAxMCUKCiMjIENvbXBhcmUgc3BlY2lmaWMgY2x1c3RlcnMKCiMjIyBMb29rIGF0IGNsdXN0ZXIgMCwgTmFzYWwgdnMuIENvbnRyb2wKCmBgYHtyIHNwZWNpZmljX2NsdXN0ZXJfbWFya2Vyc30KdGVzdF9ncm91cCA8LSBjbHVzdGVyc1tbImNsdXN0ZXJfc2FtcGxlIl1dID09ICJjb250cm9sXzAiCnN1bSh0ZXN0X2dyb3VwKQp0ZXN0X2dyb3VwIDwtIGNsdXN0ZXJzW1siY2x1c3Rlcl9zYW1wbGUiXV0gPT0gIm5fMCIKc3VtKHRlc3RfZ3JvdXApCgpjb250cm9sbl8wIDwtIEZpbmRNYXJrZXJzKAogICAgY2x1c3RlcnMsIGdyb3VwLmJ5PSJjbHVzdGVyX3NhbXBsZSIsCiAgICBpZGVudC4xPSJjb250cm9sXzAiLCBpZGVudC4yPSJuXzAiKQpjb250cm9sbl8wIDwtIGFzLmRhdGEuZnJhbWUoY29udHJvbG5fMCkKcm93bmFtZXMoY29udHJvbG5fMCkgPC0gdG91cHBlcihyb3duYW1lcyhjb250cm9sbl8wKSkKY29udHJvbG5fMCA8LSBtZXJnZShjb250cm9sbl8wLCBicmllZiwgYnk9InJvdy5uYW1lcyIsIGJ5Lnk9ImhnbmNfc3ltYm9sIiwKICAgICAgICAgICAgICAgICAgICBhbGwueD1UUlVFKQoKYW5ub3RhdGVkX2NsdXN0ZXJzICU+JQogIGdyb3VwX2J5KGNsdXN0ZXIpICU+JQogIGRwbHlyOjp0b3BfbihuPTEwLCB3dD1hdmdfbG9nMkZDKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkKYGBgCgojIyMgQ2x1c3RlciAwIE5hc2FsIHZzLiBNb2NrCgpgYGB7ciBzcGVjaWZpY18wX25tb2NrfQptb2NrdnNuXzAgPC0gRmluZE1hcmtlcnMoCiAgICBjbHVzdGVycywgZ3JvdXAuYnk9ImNsdXN0ZXJfc2FtcGxlIiwKICAgIGlkZW50LjE9Im5fMCIsIGlkZW50LjI9Im1vY2tfMCIpICU+JQogIGFzLmRhdGEuZnJhbWUoKQpoZWFkKG1vY2t2c25fMCkKcm93bmFtZXMobW9ja3Zzbl8wKSA8LSB0b3VwcGVyKHJvd25hbWVzKG1vY2t2c25fMCkpCm1vY2t2c25fMCA8LSBtZXJnZShtb2NrdnNuXzAsIGJyaWVmLCBieT0icm93Lm5hbWVzIiwgYnkueT0iaGduY19zeW1ib2wiLAogICAgICAgICAgICAgICAgICAgYWxsLng9VFJVRSkKCm1vY2t2c21fMCA8LSBGaW5kTWFya2VycygKICAgIGNsdXN0ZXJzLCBncm91cC5ieT0iY2x1c3Rlcl9zYW1wbGUiLAogICAgaWRlbnQuMT0ibV8wIiwgaWRlbnQuMj0ibW9ja18wIikgJT4lCiAgYXMuZGF0YS5mcmFtZSgpCmhlYWQobW9ja3ZzbV8wKQpyb3duYW1lcyhtb2NrdnNtXzApIDwtIHRvdXBwZXIocm93bmFtZXMobW9ja3ZzbV8wKSkKbW9ja3ZzbV8wIDwtIG1lcmdlKG1vY2t2c21fMCwgYnJpZWYsIGJ5PSJyb3cubmFtZXMiLCBieS55PSJoZ25jX3N5bWJvbCIsCiAgICAgICAgICAgICAgICAgICBhbGwueD1UUlVFKQpoZWFkKG1vY2t2c21fMCwgbj0zMCkKYGBgCgojIyBGaW5kIENvbnNlcnZlZCBNYXJrZXJzCgpUaGlzIGZ1bmN0aW9uIG1ha2VzIG5vIHNlbnNlLgoKYGBge3IgZmluZF9jb25zZXJ2ZWRfbWFya2VycywgZXZhbD1GQUxTRX0KRGVmYXVsdEFzc2F5KGNsdXN0ZXJzKSA8LSAiUk5BIgpjb25zZXJ2ZWRfbWFya2VycyA8LSBGaW5kQ29uc2VydmVkTWFya2VycygKICAgIGNsdXN0ZXJzLCBpZGVudC4xPWMoMCwgMSksIGlkZW50LjI9YygyLDMsNCksCiAgICBncm91cGluZy52YXI9InNhbXBsZSIsIG9ubHkucG9zPVRSVUUsCiAgICB2ZXJib3NlPVRSVUUpCmBgYAoKYGBge3IgY29tcGFyZV9vdGhlcl9ncm91cHMsIGV2YWw9RkFMU0V9Cm1vY2tfdnNfY29udHJvbCA8LSBGaW5kTWFya2VycyhjbHVzdGVycywgZ3JvdXAuYnk9Im9yaWcuaWRlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMT0ibW9jayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yPSJjb250cm9sIikKaGVhZChtb2NrX3ZzX2NvbnRyb2wpCm11c2N1bGFyX3ZzX21vY2sgPC0gRmluZE1hcmtlcnMoY2x1c3RlcnMsIGdyb3VwLmJ5PSJvcmlnLmlkZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xPSJtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yPSJtb2NrIikKc3VtbWFyeShtdXNjdWxhcl92c19tb2NrKQpuYXNhbF92c19tb2NrIDwtIEZpbmRNYXJrZXJzKGNsdXN0ZXJzLCBncm91cC5ieT0ib3JpZy5pZGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLnBjdD0wLjI1LCBpZGVudC4xPSJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yPSJtb2NrIikKc3VtbWFyeShuYXNhbF92c19tb2NrKQoKRmVhdHVyZVBsb3QoY2x1c3RlcnMsIGZlYXR1cmVzPWMoIlJnY2MiKSwKICAgICAgICAgICAgc3BsaXQuYnk9Im9yaWcuaWRlbnQiLCBtYXguY3V0b2ZmPTMsCiAgICAgICAgICAgIGNvbHM9YygiZGFya2dyZWVuIiwgImRhcmtyZWQiKSkKYGBgCgojIFNjYW4gZm9yIGxpa2VseSBjZWxsIGN5Y2xlIGdlbmVzCgpUaGlzIGlzIGEgbmVhdCBpZGVhLCBJIHRoaW5rIHdlIGNhbiByZXB1cnBvc2UgaXQgdG8gaW1tdW5vbG9neSBnZW5lIHNldHMuCgpgYGB7ciBjZWxsX2N5Y2xlfQpmaWx0IDwtIENlbGxDeWNsZVNjb3JpbmcoCiAgICBvYmplY3Q9Y2x1c3RlcnMsCiAgICBnMm0uZmVhdHVyZXM9Y2MuZ2VuZXMkZzJtLmdlbmVzLAogICAgcy5mZWF0dXJlcz1jYy5nZW5lcyRzLmdlbmVzKQpWbG5QbG90KGNsdXN0ZXJzLCBmZWF0dXJlcz1jKCJTLlNjb3JlIiwgIkcyTS5TY29yZSIpLAogICAgICAgIGdyb3VwLmJ5PSJvcmlnLmlkZW50IiwKICAgICAgICBuY29sPTQsIHB0LnNpemU9MCkKYGBgCgpIYXZpbmcgd3JpdHRlbiB0aGUgZm9sbG93aW5nIEkgcmVhbGl6ZWQgSSB1c2VkIGFuIG9sZGVyIHZlcnNpb24gb2YgbXkKbVNpZ0RCIHJlZmVyZW5jZS4uLiAgRklYTUU6IFJlZG8gaXQgd2l0aCB0aGUgNy41KyBkYXRhLgoKYGBge3IgbXNpZ2RifQpicm9hZF90eXBlcyA8LSBsb2FkX2dtdF9zaWduYXR1cmVzKHNpZ25hdHVyZXM9InJlZmVyZW5jZS9tOC5hbGwudjIwMjIuMS5NbS5zeW1ib2xzLmdtdCIpCmJyb2FkX2xpc3QgPC0gbGlzdCgpCmZvciAoaSBpbiBuYW1lcyhicm9hZF90eXBlcykpIHsKICBicm9hZF9saXN0W1tpXV0gPC0gZ2VuZUlkcyhicm9hZF90eXBlc1tbaV1dKQp9Cnd0ZiA8LSBBZGRNb2R1bGVTY29yZShvYmplY3Q9Y2x1c3RlcnMsIGZlYXR1cmVzPWJyb2FkX2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJtOCIpCgpjaG9zZW4gPC0gYygzLCA5LCAxMSwgMzYsIDQzLCA0MiwgMTQpCm5hbWVzKGJyb2FkX3R5cGVzKVtjaG9zZW5dCmNvbHVtbnMgPC0gcGFzdGUwKCJtOCIsIGNob3NlbikKVmxuUGxvdCh3dGYsIGZlYXR1cmVzPWNvbHVtbnMsCiAgICAgICAgZ3JvdXAuYnk9InJlczBwMV9jbHVzdGVycyIsIHNhbWUueS5saW1zPVRSVUUsCiAgICAgICAgbmNvbD00LCBwdC5zaXplPTApCgoKY2hvc2VuIDwtIGMoNTAsIDUxLCA2MCwgNjEsIDYyLCA2NSwgNjYpCm5hbWVzKGJyb2FkX3R5cGVzKVtjaG9zZW5dCmNvbHVtbnMgPC0gcGFzdGUwKCJtOCIsIGNob3NlbikKVmxuUGxvdCh3dGYsIGZlYXR1cmVzPWNvbHVtbnMsCiAgICAgICAgZ3JvdXAuYnk9InJlczBwMV9jbHVzdGVycyIsIHNhbWUueS5saW1zPVRSVUUsCiAgICAgICAgbmNvbD00LCBwdC5zaXplPTApCgpjaG9zZW4gPC0gYygxMTUsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTI1LCAxMjgpCm5hbWVzKGJyb2FkX3R5cGVzKVtjaG9zZW5dCmNvbHVtbnMgPC0gcGFzdGUwKCJtOCIsIGNob3NlbikKVmxuUGxvdCh3dGYsIGZlYXR1cmVzPWNvbHVtbnMsCiAgICAgICAgZ3JvdXAuYnk9InJlczBwMV9jbHVzdGVycyIsIHNhbWUueS5saW1zPVRSVUUsCiAgICAgICAgbmNvbD00LCBwdC5zaXplPTApCgpjaG9zZW4gPC0gYygyMTIsIDIxMSwgMjEwLCAyMDkpCm5hbWVzKGJyb2FkX3R5cGVzKVtjaG9zZW5dCmNvbHVtbnMgPC0gcGFzdGUwKCJtOCIsIGNob3NlbikKVmxuUGxvdCh3dGYsIGZlYXR1cmVzPWNvbHVtbnMsCiAgICAgICAgZ3JvdXAuYnk9InJlczBwMV9jbHVzdGVycyIsIHNhbWUueS5saW1zPVRSVUUsCiAgICAgICAgbmNvbD00LCBwdC5zaXplPTApCgpjaG9zZW4gPC0gYygxNzY6MTgyKQpuYW1lcyhicm9hZF90eXBlcylbY2hvc2VuXQpjb2x1bW5zIDwtIHBhc3RlMCgibTgiLCBjaG9zZW4pClZsblBsb3Qod3RmLCBmZWF0dXJlcz1jb2x1bW5zLAogICAgICAgIGdyb3VwLmJ5PSJyZXMwcDFfY2x1c3RlcnMiLCBzYW1lLnkubGltcz1UUlVFLAogICAgICAgIG5jb2w9NCwgcHQuc2l6ZT0wKQoKY2hvc2VuIDwtIGMoNDI6NDcpCm5hbWVzKGJyb2FkX3R5cGVzKVtjaG9zZW5dCmNvbHVtbnMgPC0gcGFzdGUwKCJtOCIsIGNob3NlbikKVmxuUGxvdCh3dGYsIGZlYXR1cmVzPWNvbHVtbnMsCiAgICAgICAgZ3JvdXAuYnk9InJlczBwMV9jbHVzdGVycyIsIHNhbWUueS5saW1zPVRSVUUsCiAgICAgICAgbmNvbD00LCBwdC5zaXplPTApCgp0X2dyb3Vwc19pZHggPC0gZ3JlcGwocGF0dGVybj0iX1RfQ0VMTCIsIHg9bmFtZXMoYnJvYWRfdHlwZXMpKQp0X2dyb3VwcyA8LSBuYW1lcyhicm9hZF90eXBlcylbdF9ncm91cHNfaWR4XQp0X251bXMgPC0gd2hpY2godF9ncm91cHNfaWR4LCBicm9hZF90eXBlcykKY29sdW1ucyA8LSBwYXN0ZTAoIm04IiwgdF9udW1zKQpWbG5QbG90KHd0ZiwgZmVhdHVyZXM9Y29sdW1ucywKICAgICAgICBncm91cC5ieT0icmVzMHAxX2NsdXN0ZXJzIiwgc2FtZS55LmxpbXM9VFJVRSwKICAgICAgICBuY29sPTQsIHB0LnNpemU9MCkKdF9ncm91cHMKCnRfZ3JvdXBzX2lkeCA8LSBncmVwbChwYXR0ZXJuPSJfRVBJVEhFTElBTF8iLCB4PW5hbWVzKGJyb2FkX3R5cGVzKSkKdF9ncm91cHMgPC0gbmFtZXMoYnJvYWRfdHlwZXMpW3RfZ3JvdXBzX2lkeF0KdF9udW1zIDwtIHdoaWNoKHRfZ3JvdXBzX2lkeCwgYnJvYWRfdHlwZXMpCmNvbHVtbnMgPC0gcGFzdGUwKCJtOCIsIHRfbnVtcykKVmxuUGxvdCh3dGYsIGZlYXR1cmVzPWNvbHVtbnMsCiAgICAgICAgZ3JvdXAuYnk9InJlczBwMV9jbHVzdGVycyIsIHNhbWUueS5saW1zPVRSVUUsCiAgICAgICAgbmNvbD00LCBwdC5zaXplPTApCnRfZ3JvdXBzCgp0X2dyb3Vwc19pZHggPC0gZ3JlcGwocGF0dGVybj0iX0VORE9USEVMSUFMXyIsIHg9bmFtZXMoYnJvYWRfdHlwZXMpKQp0X2dyb3VwcyA8LSBuYW1lcyhicm9hZF90eXBlcylbdF9ncm91cHNfaWR4XQp0X251bXMgPC0gd2hpY2godF9ncm91cHNfaWR4LCBicm9hZF90eXBlcykKY29sdW1ucyA8LSBwYXN0ZTAoIm04IiwgdF9udW1zKQpWbG5QbG90KHd0ZiwgZmVhdHVyZXM9Y29sdW1ucywKICAgICAgICBncm91cC5ieT0icmVzMHAxX2NsdXN0ZXJzIiwgc2FtZS55LmxpbXM9VFJVRSwKICAgICAgICBuY29sPTQsIHB0LnNpemU9MCkKdF9ncm91cHMKYGBgCgpgYGB7ciBzYXZlbWV9CnBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCm1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQp0aGlzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1ybWRfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKQojI21lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKIyN0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCmBgYAo=