1 TODO 20181210

  1. Show samples in current state.
  1. Show current p-value distributions by donor and together to illustrate the concerns.
  1. Show PCAs and loading analyses.
  2. Reperform default analyses after removing one and two samples.
  3. Perform quick GO of de tables after removing one and two.

2 PBMC Infection Differential Expression, Infection: 20180822 Rundate: 20181211

This document turns to the infection of PBMC cells with L.panamensis. This data is particularly strangely affected by the different strains used to infect the cells, and as a result is both useful and troubling.

Given the observations above, we have some ideas of ways to pass the data for differential expression analyses which may or may not be ‘better’. Lets try some and see what happens.

2.1 Create data sets to compare differential expression analyses

Given the above ways to massage the data, lets use a few of them for limma/deseq/edger. The main caveat in this is that those tools really do expect specific distributions of data which we horribly violate if we use log2() data, which is why in the previous blocks I named them l2blahblah, thus we can do the same sets of normalization but without that and forcibly push the resulting data into limma/edger/deseq.

3 The negative control

Everything I did in 02_estimation_infection.html suggests that there are no significant differences visible if one looks just at chronic/self-healing in this data. Further testing has seemingly proven this statement, as a result most of the following analyses will look at chronic/uninfected and self-healing/uninfected followed by attempts to reconcile those results.

3.1 Filter the data

To save some time and annoyance with sva, lets filter the data now. In addition, write down a small function used to extract the sets of significant genes across different contrasts (notably self/uninfected vs. chronic/uninfected).

4 Queries from 20181205

4.1 Each individual, chr vs sh.

## There were 18, now there are 6 samples.
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(d107_pairwise): object 'd107_pairwise' not found
## Error in summary(d107_table$data): object 'd107_table' not found
## Error in extract_significant_genes(d107_table, according_to = "deseq", : object 'd107_table' not found
## Error in head(d107_sig$deseq$ups[[1]]): object 'd107_sig' not found
## Error in extract_de_plots(d107_pairwise, p = 0.1, p_type = "raw"): object 'd107_pairwise' not found
## Error in eval(expr, envir, enclos): object 'd107_ma' not found
## Error in plot_histogram(d107_table[["data"]][["sh_vs_chr"]][, c("deseq_p")]): object 'd107_table' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## There were 18, now there are 6 samples.
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(d108_pairwise): object 'd108_pairwise' not found
## Error in summary(d108_table$data): object 'd108_table' not found
## Error in extract_significant_genes(d108_table, according_to = "deseq", : object 'd108_table' not found
## Error in head(d108_sig$deseq$ups[[1]]): object 'd108_sig' not found
## Error in extract_de_plots(d108_pairwise, p = 0.1, p_type = "raw"): object 'd108_pairwise' not found
## Error in eval(expr, envir, enclos): object 'd108_ma' not found
## Error in plot_histogram(d108_table[["data"]][["sh_vs_chr"]][, c("deseq_p")]): object 'd108_table' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## There were 18, now there are 6 samples.
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(d110_pairwise): object 'd110_pairwise' not found
## Error in summary(d110_table$data): object 'd110_table' not found
## Error in extract_significant_genes(d110_table, according_to = "deseq", : object 'd110_table' not found
## Error in head(d110_sig$deseq$ups[[1]]): object 'd110_sig' not found
## Error in extract_de_plots(d110_pairwise, p = 0.1, p_type = "raw"): object 'd110_pairwise' not found
## Error in eval(expr, envir, enclos): object 'd110_ma' not found
## Error in plot_histogram(d110_table[["data"]][["sh_vs_chr"]][, c("deseq_p")]): object 'd110_table' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(hpgl(data))))
## It backs up the current data into a slot named:
##  expt$backup_expressionset. It will also save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep the libsizes in mind
##  when invoking limma.  The appropriate libsize is the non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: hpgl
## Removing 0 low-count genes (11944 remaining).
## Step 2: normalizing the data with quant.
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in plot_pca(hs_tmp2): object 'hs_tmp2' not found

4.2 Change only sample s2504 to self-healing

## There were 18, now there are 6 samples.
## Error in set_expt_conditions(d107, fact = "sh", ids = ): The provided factor is not in the design matrix.
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(d107_pairwise): object 'd107_pairwise' not found
## Error in summary(d107_table$data): object 'd107_table' not found
## Error in extract_significant_genes(d107_table, according_to = "deseq", : object 'd107_table' not found
## Error in head(d107_sig$deseq$ups[[1]]): object 'd107_sig' not found
## Error in extract_de_plots(d107_pairwise, p = 0.1, p_type = "raw"): object 'd107_pairwise' not found
## Error in eval(expr, envir, enclos): object 'd107_ma' not found
## Error in plot_histogram(d107_table[["data"]][["sh_vs_chr"]][, c("deseq_p")]): object 'd107_table' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## There were 18, now there are 6 samples.
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(d108_pairwise): object 'd108_pairwise' not found
## Error in summary(d108_table$data): object 'd108_table' not found
## Error in extract_significant_genes(d108_table, according_to = "deseq", : object 'd108_table' not found
## Error in head(d108_sig$deseq$ups[[1]]): object 'd108_sig' not found
## Error in extract_de_plots(d108_pairwise, p = 0.1, p_type = "raw"): object 'd108_pairwise' not found
## Error in eval(expr, envir, enclos): object 'd108_ma' not found
## Error in plot_histogram(d108_table[["data"]][["sh_vs_chr"]][, c("deseq_p")]): object 'd108_table' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## There were 18, now there are 6 samples.
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(d110_pairwise): object 'd110_pairwise' not found
## Error in summary(d110_table$data): object 'd110_table' not found
## Error in extract_significant_genes(d110_table, according_to = "deseq", : object 'd110_table' not found
## Error in head(d110_sig$deseq$ups[[1]]): object 'd110_sig' not found
## Error in extract_de_plots(d110_pairwise, p = 0.1, p_type = "raw"): object 'd110_pairwise' not found
## Error in eval(expr, envir, enclos): object 'd110_ma' not found
## Error in plot_histogram(d110_table[["data"]][["sh_vs_chr"]][, c("deseq_p")]): object 'd110_table' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22

4.3 Remove samples from strain 2504 and/or 2272

## There were 18, now there are 15 samples.
## This function will replace the expt$expressionset slot with:
## hpgl(data)
## It backs up the current data into a slot named:
##  expt$backup_expressionset. It will also save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep the libsizes in mind
##  when invoking limma.  The appropriate libsize is the non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: hpgl
## Removing 38 low-count genes (11906 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## Step 4: not transforming the data.
## Step 5: not doing batch correction.
## There were 18, now there are 15 samples.
## This function will replace the expt$expressionset slot with:
## hpgl(data)
## It backs up the current data into a slot named:
##  expt$backup_expressionset. It will also save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep the libsizes in mind
##  when invoking limma.  The appropriate libsize is the non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: hpgl
## Removing 51 low-count genes (11893 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## Step 4: not transforming the data.
## Step 5: not doing batch correction.

4.3.1 Remove one analyses

Once using batch in model, once with svaseq.

## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(remove_one_de, excel = excel_file, keepers = keepers_inf): object 'remove_one_de' not found
## Error in extract_significant_genes(remove_one_table, excel = excel_file, : object 'remove_one_table' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(remove_one_de_sva, excel = excel_file, keepers = keepers_inf): object 'remove_one_de_sva' not found
## Error in extract_significant_genes(remove_one_table_sva, excel = excel_file, : object 'remove_one_table_sva' not found

4.3.2 Remove two analyses

Repeat as above, removing both weirdo samples.

## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(remove_two_de, excel = excel_file, keepers = keepers_inf): object 'remove_two_de' not found
## Error in extract_significant_genes(remove_two_table, excel = excel_file, : object 'remove_two_table' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(remove_two_de_sva, excel = excel_file, keepers = keepers_inf): object 'remove_two_de_sva' not found
## Error in extract_significant_genes(remove_two_table_sva, excel = excel_file, : object 'remove_two_table_sva' not found

4.4 Interaction model(s)

Try building a donor*state interaction model.

I think I realized my confusion in this: the only interaction models I have used before were a experimental factor*experimental floating-point observation. If it is the case, that the following models are all x vs. factor_reference, then I guess it makes sense; but if not, then I have no clue what is going on in these.

4.4.1 Model matrices

First make sure that self-healing is the reference.

Then make some designs of potential interest.

##               conditionsh conditionchr
## chr_5430_d108           0            1
## chr_5397_d108           0            1
## chr_2504_d108           0            1
## sh_2272_d108            1            0
## sh_1022_d108            1            0
## sh_2189_d108            1            0
##               donord107 donord108 donord110
## chr_5430_d108         0         1         0
## chr_5397_d108         0         1         0
## chr_2504_d108         0         1         0
## sh_2272_d108          0         1         0
## sh_1022_d108          0         1         0
## sh_2189_d108          0         1         0
##               conditionsh conditionchr donord108 donord110
## chr_5430_d108           0            1         1         0
## chr_5397_d108           0            1         1         0
## chr_2504_d108           0            1         1         0
## sh_2272_d108            1            0         1         0
## sh_1022_d108            1            0         1         0
## sh_2189_d108            1            0         1         0
##               conditionchr:donord108 conditionchr:donord110
## chr_5430_d108                      1                      0
## chr_5397_d108                      1                      0
## chr_2504_d108                      1                      0
## sh_2272_d108                       0                      0
## sh_1022_d108                       0                      0
## sh_2189_d108                       0                      0
##               conditionsh conditionchr donord108 donord110
## chr_5430_d108           0            1         1         0
## chr_5397_d108           0            1         1         0
## chr_2504_d108           0            1         1         0
## sh_2272_d108            1            0         1         0
## sh_1022_d108            1            0         1         0
## sh_2189_d108            1            0         1         0
##               conditionchr:donord108 conditionchr:donord110
## chr_5430_d108                      1                      0
## chr_5397_d108                      1                      0
## chr_2504_d108                      1                      0
## sh_2272_d108                       0                      0
## sh_1022_d108                       0                      0
## sh_2189_d108                       0                      0
##               (Intercept) donord108 donord110 conditionchr
## chr_5430_d108           1         1         0            1
## chr_5397_d108           1         1         0            1
## chr_2504_d108           1         1         0            1
## sh_2272_d108            1         1         0            0
## sh_1022_d108            1         1         0            0
## sh_2189_d108            1         1         0            0
##               donord108:conditionchr donord110:conditionchr
## chr_5430_d108                      1                      0
## chr_5397_d108                      1                      0
## chr_2504_d108                      1                      0
## sh_2272_d108                       0                      0
## sh_1022_d108                       0                      0
## sh_2189_d108                       0                      0

4.4.3 edgeR implementation

##      logFC           logCPM           F             PValue        
##  Min.   :-14.9   Min.   :5.04   Min.   :21787   Min.   :2.58e-28  
##  1st Qu.:-14.3   1st Qu.:5.70   1st Qu.:22428   1st Qu.:7.45e-28  
##  Median :-13.6   Median :6.35   Median :23358   Median :1.01e-27  
##  Mean   :-13.8   Mean   :6.12   Mean   :23693   Mean   :1.05e-27  
##  3rd Qu.:-13.4   3rd Qu.:6.51   3rd Qu.:24216   3rd Qu.:1.42e-27  
##  Max.   :-13.1   Max.   :6.87   Max.   :27493   Max.   :1.80e-27  
##       FDR          
##  Min.   :8.93e-25  
##  1st Qu.:8.93e-25  
##  Median :8.93e-25  
##  Mean   :8.93e-25  
##  3rd Qu.:8.93e-25  
##  Max.   :8.93e-25
## [1] "conditionchr:donord108"
##      logFC            logCPM            F            PValue        
##  Min.   :-1.305   Min.   :0.762   Min.   :10.6   Min.   :0.000729  
##  1st Qu.:-0.659   1st Qu.:2.330   1st Qu.:10.9   1st Qu.:0.001731  
##  Median :-0.484   Median :3.884   Median :12.9   Median :0.002407  
##  Mean   :-0.393   Mean   :3.428   Mean   :13.0   Mean   :0.002769  
##  3rd Qu.:-0.395   3rd Qu.:4.252   3rd Qu.:13.9   3rd Qu.:0.004282  
##  Max.   : 1.133   Max.   :5.837   Max.   :17.0   Max.   :0.004813  
##       FDR   
##  Min.   :1  
##  1st Qu.:1  
##  Median :1  
##  Mean   :1  
##  3rd Qu.:1  
##  Max.   :1

4.4.4 DESeq2 implementation

## converting counts to integer mode
## estimating size factors
## estimating dispersions
## gene-wise dispersion estimates
## mean-dispersion relationship
## final dispersion estimates
## fitting model and testing
## [1] "Intercept"              "condition_chr_vs_sh"   
## [3] "donor_d108_vs_d107"     "donor_d110_vs_d107"    
## [5] "conditionchr.donord108" "conditionchr.donord110"
##       Length        Class         Mode 
##            6 DESeqResults           S4
## log2 fold change (MLE): condition chr vs sh 
## Wald test p-value: condition chr vs sh 
## DataFrame with 6 rows and 6 columns
##                         baseMean      log2FoldChange             lfcSE
##                        <numeric>           <numeric>         <numeric>
## ENSG00000000419 214.886619915588 -0.0934303786250254  0.12300393077645
## ENSG00000000457 318.115512380986  -0.068815027486115 0.120178565849457
## ENSG00000000460 102.031345099905   0.197578912145072 0.203833151567596
## ENSG00000000938 5676.81912456484  0.0269256146826752 0.197204584725487
## ENSG00000000971 53.5624271330181   0.344010769796456 0.293375111918845
## ENSG00000001036 460.076692835547  0.0156360632261453 0.148896600722685
##                               stat            pvalue              padj
##                          <numeric>         <numeric>         <numeric>
## ENSG00000000419 -0.759572300131027 0.447510281800118 0.997804083570582
## ENSG00000000457 -0.572606496006257 0.566911160357569 0.997804083570582
## ENSG00000000460  0.969316868358142 0.332387115533936 0.997804083570582
## ENSG00000000938  0.136536453856568 0.891397208363037 0.997804083570582
## ENSG00000000971   1.17259697847723 0.240957461669005 0.997804083570582
## ENSG00000001036  0.105012895863667 0.916365575881328 0.997804083570582
##       Length        Class         Mode 
##            6 DESeqResults           S4
## log2 fold change (MLE): conditionchr.donord110 
## Wald test p-value: conditionchr.donord110 
## DataFrame with 6 rows and 6 columns
##                         baseMean     log2FoldChange             lfcSE
##                        <numeric>          <numeric>         <numeric>
## ENSG00000000419 214.886619915588  0.295162897632013 0.172516639204641
## ENSG00000000457 318.115512380986  0.108194027119009 0.172637547612825
## ENSG00000000460 102.031345099905  0.376710409795487 0.293516835681214
## ENSG00000000938 5676.81912456484 0.0530822519196353 0.278697424287239
## ENSG00000000971 53.5624271330181 -0.388785003193931 0.436191950074646
## ENSG00000001036 460.076692835547   0.10657602357023 0.206872518783626
##                               stat             pvalue              padj
##                          <numeric>          <numeric>         <numeric>
## ENSG00000000419   1.71092422732562 0.0870951015388544 0.999936246663048
## ENSG00000000457  0.626712025368067  0.530848019781775 0.999936246663048
## ENSG00000000460    1.2834371456792  0.199338967059447 0.999936246663048
## ENSG00000000938   0.19046552746367  0.848944353796083 0.999936246663048
## ENSG00000000971 -0.891316318715644  0.372759496477825 0.999936246663048
## ENSG00000001036  0.515177289844383  0.606429137146659 0.999936246663048
##       Length        Class         Mode 
##            6 DESeqResults           S4
## log2 fold change (MLE): conditionchr.donord110 
## Wald test p-value: conditionchr.donord110 
## DataFrame with 6 rows and 6 columns
##                         baseMean     log2FoldChange             lfcSE
##                        <numeric>          <numeric>         <numeric>
## ENSG00000000419 214.886619915588  0.295162897632013 0.172516639204641
## ENSG00000000457 318.115512380986  0.108194027119009 0.172637547612825
## ENSG00000000460 102.031345099905  0.376710409795487 0.293516835681214
## ENSG00000000938 5676.81912456484 0.0530822519196353 0.278697424287239
## ENSG00000000971 53.5624271330181 -0.388785003193931 0.436191950074646
## ENSG00000001036 460.076692835547   0.10657602357023 0.206872518783626
##                               stat             pvalue              padj
##                          <numeric>          <numeric>         <numeric>
## ENSG00000000419   1.71092422732562 0.0870951015388544 0.999936246663048
## ENSG00000000457  0.626712025368067  0.530848019781775 0.999936246663048
## ENSG00000000460    1.2834371456792  0.199338967059447 0.999936246663048
## ENSG00000000938   0.19046552746367  0.848944353796083 0.999936246663048
## ENSG00000000971 -0.891316318715644  0.372759496477825 0.999936246663048
## ENSG00000001036  0.515177289844383  0.606429137146659 0.999936246663048
##       Length        Class         Mode 
##            6 DESeqResults           S4
## log2 fold change (MLE): donor d110 vs d107 
## Wald test p-value: donor d110 vs d107 
## DataFrame with 6 rows and 6 columns
##                         baseMean     log2FoldChange             lfcSE
##                        <numeric>          <numeric>         <numeric>
## ENSG00000000419 214.886619915588 -0.113766010123853 0.120483955620923
## ENSG00000000457 318.115512380986 -0.456556848180769 0.121122399221616
## ENSG00000000460 102.031345099905   -0.5010401182924 0.210579406027488
## ENSG00000000938 5676.81912456484  0.505694298463597 0.197026331645792
## ENSG00000000971 53.5624271330181 -0.842424805273729 0.308759375189539
## ENSG00000001036 460.076692835547  0.568390991546202 0.145482651751354
##                               stat               pvalue
##                          <numeric>            <numeric>
## ENSG00000000419 -0.944241990873823    0.345046001807488
## ENSG00000000457  -3.76938411982257 0.000163650866259048
## ENSG00000000460   -2.3793405430491   0.0173436449623682
## ENSG00000000938   2.56663307000365   0.0102691214578726
## ENSG00000000971  -2.72841854520721  0.00636388048892608
## ENSG00000001036   3.90693312710334  9.3475010176665e-05
##                                 padj
##                            <numeric>
## ENSG00000000419    0.476062375176819
## ENSG00000000457 0.000739090391073861
## ENSG00000000460   0.0422654009174772
## ENSG00000000938   0.0271711897470546
## ENSG00000000971   0.0181060512075926
## ENSG00000001036 0.000448806683671478

4.5 PC loadings

##       Comp.1                  Comp.2                 
##  [1,] "31.7:ENSG00000129824"  "22.16:ENSG00000100079"
##  [2,] "30.31:ENSG00000012817" "16.86:ENSG00000128283"
##  [3,] "30:ENSG00000185736"    "15.92:ENSG00000170439"
##  [4,] "29.65:ENSG00000067048" "13.44:ENSG00000156113"
##  [5,] "27.68:ENSG00000114374" "13.39:ENSG00000007350"
##  [6,] "25.19:ENSG00000183878" "13.25:ENSG00000123219"
##  [7,] "21.54:ENSG00000198692" "13.11:ENSG00000205809"
##  [8,] "20.86:ENSG00000067646" "13.01:ENSG00000165810"
##  [9,] "18.84:ENSG00000074410" "12.6:ENSG00000150687" 
## [10,] "16.59:ENSG00000179344" "12.6:ENSG00000167880" 
## [11,] "15.01:ENSG00000134184" "12.36:ENSG00000150510"
## [12,] "14.9:ENSG00000196735"  "12.1:ENSG00000167094" 
## [13,] "14.46:ENSG00000122641" "12.09:ENSG00000146918"
## [14,] "14.37:ENSG00000121380" "11.77:ENSG00000173372"
## [15,] "14.37:ENSG00000161055" "11.67:ENSG00000214944"
## [16,] "13.88:ENSG00000154620" "11.34:ENSG00000174945"
## [17,] "13.76:ENSG00000166923" "11.01:ENSG00000240247"
## [18,] "13.5:ENSG00000123453"  "10.99:ENSG00000205810"
## [19,] "13.06:ENSG00000123454" "10.95:ENSG00000149635"
## [20,] "13.02:ENSG00000108688" "10.72:ENSG00000102837"
## [21,] "12.49:ENSG00000131435" "10.69:ENSG00000109956"
## [22,] "12.47:ENSG00000136449" "10.68:ENSG00000061337"
## [23,] "12.22:ENSG00000110092" "10.6:ENSG00000206047" 
## [24,] "12.05:ENSG00000120645" "10.51:ENSG00000205846"
## [25,] "11.83:ENSG00000205057" "10.5:ENSG00000183542" 
## [26,] "11.54:ENSG00000123689" "10.04:ENSG00000113721"
## [27,] "11.34:ENSG00000170160" "9.932:ENSG00000101188"
## [28,] "11.32:ENSG00000113302" "9.836:ENSG00000113657"
## [29,] "11.2:ENSG00000102970"  "9.783:ENSG00000196421"
## [30,] "11.08:ENSG00000198203" "9.572:ENSG00000145708"
## [31,] "11.08:ENSG00000184371" "9.241:ENSG00000133962"
## [32,] "11.07:ENSG00000149635" "9.213:ENSG00000148488"
## [33,] "10.94:ENSG00000204644" "8.953:ENSG00000125780"
## [34,] "10.83:ENSG00000050165" "8.802:ENSG00000243772"
## [35,] "10.66:ENSG00000150510" "8.796:ENSG00000170160"
## [36,] "10.47:ENSG00000182871" "8.76:ENSG00000162383" 
## [37,] "10.42:ENSG00000134668" "8.719:ENSG00000108370"
## [38,] "10.23:ENSG00000164530" "8.705:ENSG00000054793"
## [39,] "10.22:ENSG00000178860" "8.564:ENSG00000168329"
## [40,] "10.19:ENSG00000109471" "8.503:ENSG00000184349"
## [41,] "10.17:ENSG00000197121" "8.377:ENSG00000100450"
## [42,] "10.15:ENSG00000164400" "8.224:ENSG00000173239"
## [43,] "9.967:ENSG00000180616" "8.088:ENSG00000086548"
## [44,] "9.874:ENSG00000069482" "8.001:ENSG00000111199"
## [45,] "9.8:ENSG00000133687"   "7.934:ENSG00000239839"
## [46,] "9.786:ENSG00000134716" "7.928:ENSG00000139567"
## [47,] "9.778:ENSG00000115009" "7.858:ENSG00000188820"
## [48,] "9.737:ENSG00000197822" "7.744:ENSG00000101425"
## [49,] "9.705:ENSG00000172724" "7.624:ENSG00000176083"
## [50,] "9.686:ENSG00000181634" "7.616:ENSG00000169908"
## Before removal, there were 11944 entries.
## Now there are 50 entries.
## Percent kept: 0.140, 0.119, 0.075, 0.131, 0.083, 0.119, 0.017, 0.016, 0.009, 0.019, 0.010, 0.012, 0.210, 0.213, 0.183, 0.252, 0.162, 0.221
## Percent removed: 99.860, 99.881, 99.925, 99.869, 99.917, 99.881, 99.983, 99.984, 99.991, 99.981, 99.990, 99.988, 99.790, 99.787, 99.817, 99.748, 99.838, 99.779
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
ensembl_gene_id description
ENSG00000129824 ENSG00000129824 ribosomal protein S4, Y-linked 1 [Source:HGNC Symbol;Acc:HGNC:10425]
ENSG00000012817 ENSG00000012817 lysine demethylase 5D [Source:HGNC Symbol;Acc:HGNC:11115]
ENSG00000185736 ENSG00000185736 adenosine deaminase, RNA specific B2 (inactive) [Source:HGNC Symbol;Acc:HGNC:227]
ENSG00000067048 ENSG00000067048 DEAD-box helicase 3, Y-linked [Source:HGNC Symbol;Acc:HGNC:2699]
ENSG00000114374 ENSG00000114374 ubiquitin specific peptidase 9, Y-linked [Source:HGNC Symbol;Acc:HGNC:12633]
ENSG00000183878 ENSG00000183878 ubiquitously transcribed tetratricopeptide repeat containing, Y-linked [Source:HGNC Symbol;Acc:HGNC:12638]
ENSG00000198692 ENSG00000198692 eukaryotic translation initiation factor 1A, Y-linked [Source:HGNC Symbol;Acc:HGNC:3252]
ENSG00000067646 ENSG00000067646 zinc finger protein, Y-linked [Source:HGNC Symbol;Acc:HGNC:12870]
ENSG00000074410 ENSG00000074410 carbonic anhydrase 12 [Source:HGNC Symbol;Acc:HGNC:1371]
ENSG00000179344 ENSG00000179344 major histocompatibility complex, class II, DQ beta 1 [Source:HGNC Symbol;Acc:HGNC:4944]
ENSG00000134184 ENSG00000134184 glutathione S-transferase mu 1 [Source:HGNC Symbol;Acc:HGNC:4632]
ENSG00000196735 ENSG00000196735 major histocompatibility complex, class II, DQ alpha 1 [Source:HGNC Symbol;Acc:HGNC:4942]
ENSG00000122641 ENSG00000122641 inhibin beta A subunit [Source:HGNC Symbol;Acc:HGNC:6066]
ENSG00000121380 ENSG00000121380 BCL2 like 14 [Source:HGNC Symbol;Acc:HGNC:16657]
ENSG00000161055 ENSG00000161055 secretoglobin family 3A member 1 [Source:HGNC Symbol;Acc:HGNC:18384]
ENSG00000154620 ENSG00000154620 thymosin beta 4, Y-linked [Source:HGNC Symbol;Acc:HGNC:11882]
ENSG00000166923 ENSG00000166923 gremlin 1, DAN family BMP antagonist [Source:HGNC Symbol;Acc:HGNC:2001]
ENSG00000123453 ENSG00000123453 sarcosine dehydrogenase [Source:HGNC Symbol;Acc:HGNC:10536]
ENSG00000123454 ENSG00000123454 dopamine beta-hydroxylase [Source:HGNC Symbol;Acc:HGNC:2689]
ENSG00000108688 ENSG00000108688 C-C motif chemokine ligand 7 [Source:HGNC Symbol;Acc:HGNC:10634]
ENSG00000131435 ENSG00000131435 PDZ and LIM domain 4 [Source:HGNC Symbol;Acc:HGNC:16501]
ENSG00000136449 ENSG00000136449 MYCBP associated protein [Source:HGNC Symbol;Acc:HGNC:19677]
ENSG00000110092 ENSG00000110092 cyclin D1 [Source:HGNC Symbol;Acc:HGNC:1582]
ENSG00000120645 ENSG00000120645 IQ motif and Sec7 domain 3 [Source:HGNC Symbol;Acc:HGNC:29193]
ENSG00000205057 ENSG00000205057 chronic lymphocytic leukemia up-regulated 1 opposite strand [Source:HGNC Symbol;Acc:HGNC:24070]
ENSG00000123689 ENSG00000123689 G0/G1 switch 2 [Source:HGNC Symbol;Acc:HGNC:30229]
ENSG00000170160 ENSG00000170160 coiled-coil domain containing 144A [Source:HGNC Symbol;Acc:HGNC:29072]
ENSG00000113302 ENSG00000113302 interleukin 12B [Source:HGNC Symbol;Acc:HGNC:5970]
ENSG00000102970 ENSG00000102970 C-C motif chemokine ligand 17 [Source:HGNC Symbol;Acc:HGNC:10615]
ENSG00000198203 ENSG00000198203 sulfotransferase family 1C member 2 [Source:HGNC Symbol;Acc:HGNC:11456]
ENSG00000184371 ENSG00000184371 colony stimulating factor 1 [Source:HGNC Symbol;Acc:HGNC:2432]
ENSG00000149635 ENSG00000149635 osteoclast stimulatory transmembrane protein [Source:HGNC Symbol;Acc:HGNC:16116]
ENSG00000204644 ENSG00000204644 ZFP57 zinc finger protein [Source:HGNC Symbol;Acc:HGNC:18791]
ENSG00000050165 ENSG00000050165 dickkopf WNT signaling pathway inhibitor 3 [Source:HGNC Symbol;Acc:HGNC:2893]
ENSG00000150510 ENSG00000150510 family with sequence similarity 124 member A [Source:HGNC Symbol;Acc:HGNC:26413]
ENSG00000182871 ENSG00000182871 collagen type XVIII alpha 1 chain [Source:HGNC Symbol;Acc:HGNC:2195]
ENSG00000134668 ENSG00000134668 SPOC domain containing 1 [Source:HGNC Symbol;Acc:HGNC:26338]
ENSG00000164530 ENSG00000164530 peptidase inhibitor 16 [Source:HGNC Symbol;Acc:HGNC:21245]
ENSG00000178860 ENSG00000178860 musculin [Source:HGNC Symbol;Acc:HGNC:7321]
ENSG00000109471 ENSG00000109471 interleukin 2 [Source:HGNC Symbol;Acc:HGNC:6001]
ENSG00000197121 ENSG00000197121 post-GPI attachment to proteins 1 [Source:HGNC Symbol;Acc:HGNC:25712]
ENSG00000164400 ENSG00000164400 colony stimulating factor 2 [Source:HGNC Symbol;Acc:HGNC:2434]
ENSG00000180616 ENSG00000180616 somatostatin receptor 2 [Source:HGNC Symbol;Acc:HGNC:11331]
ENSG00000069482 ENSG00000069482 galanin and GMAP prepropeptide [Source:HGNC Symbol;Acc:HGNC:4114]
ENSG00000133687 ENSG00000133687 transmembrane and tetratricopeptide repeat containing 1 [Source:HGNC Symbol;Acc:HGNC:24099]
ENSG00000134716 ENSG00000134716 cytochrome P450 family 2 subfamily J member 2 [Source:HGNC Symbol;Acc:HGNC:2634]
ENSG00000115009 ENSG00000115009 C-C motif chemokine ligand 20 [Source:HGNC Symbol;Acc:HGNC:10619]
ENSG00000197822 ENSG00000197822 occludin [Source:HGNC Symbol;Acc:HGNC:8104]
ENSG00000172724 ENSG00000172724 C-C motif chemokine ligand 19 [Source:HGNC Symbol;Acc:HGNC:10617]
ENSG00000181634 ENSG00000181634 tumor necrosis factor superfamily member 15 [Source:HGNC Symbol;Acc:HGNC:11931]
## Before removal, there were 11944 entries.
## Now there are 50 entries.
## Percent kept: 0.097, 0.087, 0.077, 0.094, 0.077, 0.088, 0.053, 0.050, 0.059, 0.055, 0.063, 0.057, 0.024, 0.017, 0.015, 0.021, 0.017, 0.017
## Percent removed: 99.903, 99.913, 99.923, 99.906, 99.923, 99.912, 99.947, 99.950, 99.941, 99.945, 99.937, 99.943, 99.976, 99.983, 99.985, 99.979, 99.983, 99.983
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
ensembl_gene_id description
ENSG00000100079 ENSG00000100079 galectin 2 [Source:HGNC Symbol;Acc:HGNC:6562]
ENSG00000128283 ENSG00000128283 CDC42 effector protein 1 [Source:HGNC Symbol;Acc:HGNC:17014]
ENSG00000170439 ENSG00000170439 methyltransferase like 7B [Source:HGNC Symbol;Acc:HGNC:28276]
ENSG00000156113 ENSG00000156113 potassium calcium-activated channel subfamily M alpha 1 [Source:HGNC Symbol;Acc:HGNC:6284]
ENSG00000007350 ENSG00000007350 transketolase like 1 [Source:HGNC Symbol;Acc:HGNC:11835]
ENSG00000123219 ENSG00000123219 centromere protein K [Source:HGNC Symbol;Acc:HGNC:29479]
ENSG00000205809 ENSG00000205809 killer cell lectin like receptor C2 [Source:HGNC Symbol;Acc:HGNC:6375]
ENSG00000165810 ENSG00000165810 butyrophilin like 9 [Source:HGNC Symbol;Acc:HGNC:24176]
ENSG00000150687 ENSG00000150687 protease, serine 23 [Source:HGNC Symbol;Acc:HGNC:14370]
ENSG00000167880 ENSG00000167880 envoplakin [Source:HGNC Symbol;Acc:HGNC:3503]
ENSG00000150510 ENSG00000150510 family with sequence similarity 124 member A [Source:HGNC Symbol;Acc:HGNC:26413]
ENSG00000167094 ENSG00000167094 tetratricopeptide repeat domain 16 [Source:HGNC Symbol;Acc:HGNC:26536]
ENSG00000146918 ENSG00000146918 non-SMC condensin II complex subunit G2 [Source:HGNC Symbol;Acc:HGNC:21904]
ENSG00000173372 ENSG00000173372 complement C1q A chain [Source:HGNC Symbol;Acc:HGNC:1241]
ENSG00000214944 ENSG00000214944 Rho guanine nucleotide exchange factor 28 [Source:HGNC Symbol;Acc:HGNC:30322]
ENSG00000174945 ENSG00000174945 archaelysin family metallopeptidase 1 [Source:HGNC Symbol;Acc:HGNC:22231]
ENSG00000240247 ENSG00000240247 defensin alpha 1B [Source:HGNC Symbol;Acc:HGNC:33596]
ENSG00000205810 ENSG00000205810 killer cell lectin like receptor C3 [Source:HGNC Symbol;Acc:HGNC:6376]
ENSG00000149635 ENSG00000149635 osteoclast stimulatory transmembrane protein [Source:HGNC Symbol;Acc:HGNC:16116]
ENSG00000102837 ENSG00000102837 olfactomedin 4 [Source:HGNC Symbol;Acc:HGNC:17190]
ENSG00000109956 ENSG00000109956 beta-1,3-glucuronyltransferase 1 [Source:HGNC Symbol;Acc:HGNC:921]
ENSG00000061337 ENSG00000061337 leucine zipper tumor suppressor 1 [Source:HGNC Symbol;Acc:HGNC:13861]
ENSG00000206047 ENSG00000206047 defensin alpha 1 [Source:HGNC Symbol;Acc:HGNC:2761]
ENSG00000205846 ENSG00000205846 C-type lectin domain family 6 member A [Source:HGNC Symbol;Acc:HGNC:14556]
ENSG00000183542 ENSG00000183542 killer cell lectin like receptor C4 [Source:HGNC Symbol;Acc:HGNC:6377]
ENSG00000113721 ENSG00000113721 platelet derived growth factor receptor beta [Source:HGNC Symbol;Acc:HGNC:8804]
ENSG00000101188 ENSG00000101188 neurotensin receptor 1 [Source:HGNC Symbol;Acc:HGNC:8039]
ENSG00000113657 ENSG00000113657 dihydropyrimidinase like 3 [Source:HGNC Symbol;Acc:HGNC:3015]
ENSG00000196421 ENSG00000196421 long intergenic non-protein coding RNA 176 [Source:HGNC Symbol;Acc:HGNC:27655]
ENSG00000145708 ENSG00000145708 corticotropin releasing hormone binding protein [Source:HGNC Symbol;Acc:HGNC:2356]
ENSG00000133962 ENSG00000133962 cation channel sperm associated auxiliary subunit beta [Source:HGNC Symbol;Acc:HGNC:20500]
ENSG00000148488 ENSG00000148488 ST8 alpha-N-acetyl-neuraminide alpha-2,8-sialyltransferase 6 [Source:HGNC Symbol;Acc:HGNC:23317]
ENSG00000125780 ENSG00000125780 transglutaminase 3 [Source:HGNC Symbol;Acc:HGNC:11779]
ENSG00000243772 ENSG00000243772 killer cell immunoglobulin like receptor, two Ig domains and long cytoplasmic tail 3 [Source:HGNC Symbol;Acc:HGNC:6331]
ENSG00000170160 ENSG00000170160 coiled-coil domain containing 144A [Source:HGNC Symbol;Acc:HGNC:29072]
ENSG00000162383 ENSG00000162383 solute carrier family 1 member 7 [Source:HGNC Symbol;Acc:HGNC:10945]
ENSG00000108370 ENSG00000108370 regulator of G-protein signaling 9 [Source:HGNC Symbol;Acc:HGNC:10004]
ENSG00000054793 ENSG00000054793 ATPase phospholipid transporting 9A (putative) [Source:HGNC Symbol;Acc:HGNC:13540]
ENSG00000168329 ENSG00000168329 C-X3-C motif chemokine receptor 1 [Source:HGNC Symbol;Acc:HGNC:2558]
ENSG00000184349 ENSG00000184349 ephrin A5 [Source:HGNC Symbol;Acc:HGNC:3225]
ENSG00000100450 ENSG00000100450 granzyme H [Source:HGNC Symbol;Acc:HGNC:4710]
ENSG00000173239 ENSG00000173239 lipase family member M [Source:HGNC Symbol;Acc:HGNC:23455]
ENSG00000086548 ENSG00000086548 carcinoembryonic antigen related cell adhesion molecule 6 [Source:HGNC Symbol;Acc:HGNC:1818]
ENSG00000111199 ENSG00000111199 transient receptor potential cation channel subfamily V member 4 [Source:HGNC Symbol;Acc:HGNC:18083]
ENSG00000239839 ENSG00000239839 defensin alpha 3 [Source:HGNC Symbol;Acc:HGNC:2762]
ENSG00000139567 ENSG00000139567 activin A receptor like type 1 [Source:HGNC Symbol;Acc:HGNC:175]
ENSG00000188820 ENSG00000188820 family with sequence similarity 26 member F [Source:HGNC Symbol;Acc:HGNC:33391]
ENSG00000101425 ENSG00000101425 bactericidal/permeability-increasing protein [Source:HGNC Symbol;Acc:HGNC:1095]
ENSG00000176083 ENSG00000176083 zinc finger protein 683 [Source:HGNC Symbol;Acc:HGNC:28495]
ENSG00000169908 ENSG00000169908 transmembrane 4 L six family member 1 [Source:HGNC Symbol;Acc:HGNC:11853]
## Before removal, there were 11944 entries.
## Now there are 50 entries.
## Percent kept: 0.401, 0.316, 0.140, 0.384, 0.155, 0.370, 0.275, 0.242, 0.094, 0.218, 0.125, 0.158, 0.486, 0.395, 0.215, 0.493, 0.271, 0.316
## Percent removed: 99.599, 99.684, 99.860, 99.616, 99.845, 99.630, 99.725, 99.758, 99.906, 99.782, 99.875, 99.842, 99.514, 99.605, 99.785, 99.507, 99.729, 99.684
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
ensembl_gene_id description
ENSG00000137673 ENSG00000137673 matrix metallopeptidase 7 [Source:HGNC Symbol;Acc:HGNC:7174]
ENSG00000113302 ENSG00000113302 interleukin 12B [Source:HGNC Symbol;Acc:HGNC:5970]
ENSG00000169908 ENSG00000169908 transmembrane 4 L six family member 1 [Source:HGNC Symbol;Acc:HGNC:11853]
ENSG00000074410 ENSG00000074410 carbonic anhydrase 12 [Source:HGNC Symbol;Acc:HGNC:1371]
ENSG00000122641 ENSG00000122641 inhibin beta A subunit [Source:HGNC Symbol;Acc:HGNC:6066]
ENSG00000166923 ENSG00000166923 gremlin 1, DAN family BMP antagonist [Source:HGNC Symbol;Acc:HGNC:2001]
ENSG00000106178 ENSG00000106178 C-C motif chemokine ligand 24 [Source:HGNC Symbol;Acc:HGNC:10623]
ENSG00000125144 ENSG00000125144 metallothionein 1G [Source:HGNC Symbol;Acc:HGNC:7399]
ENSG00000197506 ENSG00000197506 solute carrier family 28 member 3 [Source:HGNC Symbol;Acc:HGNC:16484]
ENSG00000136695 ENSG00000136695 interleukin 36 receptor antagonist [Source:HGNC Symbol;Acc:HGNC:15561]
ENSG00000205362 ENSG00000205362 metallothionein 1A [Source:HGNC Symbol;Acc:HGNC:7393]
ENSG00000187848 ENSG00000187848 purinergic receptor P2X 2 [Source:HGNC Symbol;Acc:HGNC:15459]
ENSG00000111052 ENSG00000111052 lin-7 homolog A, crumbs cell polarity complex component [Source:HGNC Symbol;Acc:HGNC:17787]
ENSG00000069482 ENSG00000069482 galanin and GMAP prepropeptide [Source:HGNC Symbol;Acc:HGNC:4114]
ENSG00000113657 ENSG00000113657 dihydropyrimidinase like 3 [Source:HGNC Symbol;Acc:HGNC:3015]
ENSG00000186081 ENSG00000186081 keratin 5 [Source:HGNC Symbol;Acc:HGNC:6442]
ENSG00000148677 ENSG00000148677 ankyrin repeat domain 1 [Source:HGNC Symbol;Acc:HGNC:15819]
ENSG00000187134 ENSG00000187134 aldo-keto reductase family 1 member C1 [Source:HGNC Symbol;Acc:HGNC:384]
ENSG00000105976 ENSG00000105976 MET proto-oncogene, receptor tyrosine kinase [Source:HGNC Symbol;Acc:HGNC:7029]
ENSG00000105855 ENSG00000105855 integrin subunit beta 8 [Source:HGNC Symbol;Acc:HGNC:6163]
ENSG00000172724 ENSG00000172724 C-C motif chemokine ligand 19 [Source:HGNC Symbol;Acc:HGNC:10617]
ENSG00000133048 ENSG00000133048 chitinase 3 like 1 [Source:HGNC Symbol;Acc:HGNC:1932]
ENSG00000100234 ENSG00000100234 TIMP metallopeptidase inhibitor 3 [Source:HGNC Symbol;Acc:HGNC:11822]
ENSG00000138772 ENSG00000138772 annexin A3 [Source:HGNC Symbol;Acc:HGNC:541]
ENSG00000108688 ENSG00000108688 C-C motif chemokine ligand 7 [Source:HGNC Symbol;Acc:HGNC:10634]
ENSG00000151012 ENSG00000151012 solute carrier family 7 member 11 [Source:HGNC Symbol;Acc:HGNC:11059]
ENSG00000117594 ENSG00000117594 hydroxysteroid 11-beta dehydrogenase 1 [Source:HGNC Symbol;Acc:HGNC:5208]
ENSG00000039560 ENSG00000039560 retinoic acid induced 14 [Source:HGNC Symbol;Acc:HGNC:14873]
ENSG00000118785 ENSG00000118785 secreted phosphoprotein 1 [Source:HGNC Symbol;Acc:HGNC:11255]
ENSG00000154856 ENSG00000154856 APC down-regulated 1 [Source:HGNC Symbol;Acc:HGNC:15718]
ENSG00000110436 ENSG00000110436 solute carrier family 1 member 2 [Source:HGNC Symbol;Acc:HGNC:10940]
ENSG00000050730 ENSG00000050730 TNFAIP3 interacting protein 3 [Source:HGNC Symbol;Acc:HGNC:19315]
ENSG00000176076 ENSG00000176076 potassium voltage-gated channel subfamily E regulatory subunit 5 [Source:HGNC Symbol;Acc:HGNC:6241]
ENSG00000205358 ENSG00000205358 metallothionein 1H [Source:HGNC Symbol;Acc:HGNC:7400]
ENSG00000053747 ENSG00000053747 laminin subunit alpha 3 [Source:HGNC Symbol;Acc:HGNC:6483]
ENSG00000136689 ENSG00000136689 interleukin 1 receptor antagonist [Source:HGNC Symbol;Acc:HGNC:6000]
ENSG00000166165 ENSG00000166165 creatine kinase B [Source:HGNC Symbol;Acc:HGNC:1991]
ENSG00000102837 ENSG00000102837 olfactomedin 4 [Source:HGNC Symbol;Acc:HGNC:17190]
ENSG00000112139 ENSG00000112139 MAM domain containing glycosylphosphatidylinositol anchor 1 [Source:HGNC Symbol;Acc:HGNC:19267]
ENSG00000163687 ENSG00000163687 deoxyribonuclease 1 like 3 [Source:HGNC Symbol;Acc:HGNC:2959]
ENSG00000205364 ENSG00000205364 metallothionein 1M [Source:HGNC Symbol;Acc:HGNC:14296]
ENSG00000169429 ENSG00000169429 C-X-C motif chemokine ligand 8 [Source:HGNC Symbol;Acc:HGNC:6025]
ENSG00000255398 ENSG00000255398 hydroxycarboxylic acid receptor 3 [Source:HGNC Symbol;Acc:HGNC:16824]
ENSG00000178726 ENSG00000178726 thrombomodulin [Source:HGNC Symbol;Acc:HGNC:11784]
ENSG00000066056 ENSG00000066056 tyrosine kinase with immunoglobulin like and EGF like domains 1 [Source:HGNC Symbol;Acc:HGNC:11809]
ENSG00000136052 ENSG00000136052 solute carrier family 41 member 2 [Source:HGNC Symbol;Acc:HGNC:31045]
ENSG00000125780 ENSG00000125780 transglutaminase 3 [Source:HGNC Symbol;Acc:HGNC:11779]
ENSG00000178860 ENSG00000178860 musculin [Source:HGNC Symbol;Acc:HGNC:7321]
ENSG00000197632 ENSG00000197632 serpin family B member 2 [Source:HGNC Symbol;Acc:HGNC:8584]
ENSG00000162433 ENSG00000162433 adenylate kinase 4 [Source:HGNC Symbol;Acc:HGNC:363]

4.5.1 Shenanigans

## Reading the sample metadata.
## The sample definitions comprises: 21 rows(samples) and 33 columns(metadata fields).
## Reading count tables.
## Reading count tables with read.table().
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0630/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0631/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0632/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0633/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0634/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0635/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0636/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0650/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0651/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0652/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0653/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0654/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0655/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0656/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0657/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0658/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0659/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0660/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0661/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0662/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## /cbcb/nelsayed-scratch/atb/rnaseq/lpanamensis_2016/preprocessing/hpgl0663/outputs/tophat_hsapiens/accepted_paired.count.xz contains 51046 rows and merges to 51046 rows.
## Finished reading count tables.
## Matched 51041 annotations and counts.
## Bringing together the count matrix and gene information.
## There were 21, now there are 18 samples.
## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(hpgl(data))))
## It backs up the current data into a slot named:
##  expt$backup_expressionset. It will also save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep the libsizes in mind
##  when invoking limma.  The appropriate libsize is the non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: hpgl
## Removing 37484 low-count genes (13557 remaining).
## Step 2: normalizing the data with quant.
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in plot_pca(test_norm): object 'test_norm' not found
## This function will replace the expt$expressionset slot with:
## log2(ruvg(cpm(quant(hpgl(data)))))
## It backs up the current data into a slot named:
##  expt$backup_expressionset. It will also save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep the libsizes in mind
##  when invoking limma.  The appropriate libsize is the non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Step 1: performing count filter with option: hpgl
## Removing 37484 low-count genes (13557 remaining).
## Step 2: normalizing the data with quant.
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in plot_pca(test_batch): object 'test_batch' not found
## Error in pca_highscores(test_batch, n = 50): object 'test_batch' not found

##       Comp.1                  Comp.2                 
##  [1,] "31.7:ENSG00000129824"  "22.16:ENSG00000100079"
##  [2,] "30.31:ENSG00000012817" "16.86:ENSG00000128283"
##  [3,] "30:ENSG00000185736"    "15.92:ENSG00000170439"
##  [4,] "29.65:ENSG00000067048" "13.44:ENSG00000156113"
##  [5,] "27.68:ENSG00000114374" "13.39:ENSG00000007350"
##  [6,] "25.19:ENSG00000183878" "13.25:ENSG00000123219"
##  [7,] "21.54:ENSG00000198692" "13.11:ENSG00000205809"
##  [8,] "20.86:ENSG00000067646" "13.01:ENSG00000165810"
##  [9,] "18.84:ENSG00000074410" "12.6:ENSG00000150687" 
## [10,] "16.59:ENSG00000179344" "12.6:ENSG00000167880" 
## [11,] "15.01:ENSG00000134184" "12.36:ENSG00000150510"
## [12,] "14.9:ENSG00000196735"  "12.1:ENSG00000167094" 
## [13,] "14.46:ENSG00000122641" "12.09:ENSG00000146918"
## [14,] "14.37:ENSG00000121380" "11.77:ENSG00000173372"
## [15,] "14.37:ENSG00000161055" "11.67:ENSG00000214944"
## [16,] "13.88:ENSG00000154620" "11.34:ENSG00000174945"
## [17,] "13.76:ENSG00000166923" "11.01:ENSG00000240247"
## [18,] "13.5:ENSG00000123453"  "10.99:ENSG00000205810"
## [19,] "13.06:ENSG00000123454" "10.95:ENSG00000149635"
## [20,] "13.02:ENSG00000108688" "10.72:ENSG00000102837"
## [21,] "12.49:ENSG00000131435" "10.69:ENSG00000109956"
## [22,] "12.47:ENSG00000136449" "10.68:ENSG00000061337"
## [23,] "12.22:ENSG00000110092" "10.6:ENSG00000206047" 
## [24,] "12.05:ENSG00000120645" "10.51:ENSG00000205846"
## [25,] "11.83:ENSG00000205057" "10.5:ENSG00000183542" 
## [26,] "11.54:ENSG00000123689" "10.04:ENSG00000113721"
## [27,] "11.34:ENSG00000170160" "9.932:ENSG00000101188"
## [28,] "11.32:ENSG00000113302" "9.836:ENSG00000113657"
## [29,] "11.2:ENSG00000102970"  "9.783:ENSG00000196421"
## [30,] "11.08:ENSG00000198203" "9.572:ENSG00000145708"
## [31,] "11.08:ENSG00000184371" "9.241:ENSG00000133962"
## [32,] "11.07:ENSG00000149635" "9.213:ENSG00000148488"
## [33,] "10.94:ENSG00000204644" "8.953:ENSG00000125780"
## [34,] "10.83:ENSG00000050165" "8.802:ENSG00000243772"
## [35,] "10.66:ENSG00000150510" "8.796:ENSG00000170160"
## [36,] "10.47:ENSG00000182871" "8.76:ENSG00000162383" 
## [37,] "10.42:ENSG00000134668" "8.719:ENSG00000108370"
## [38,] "10.23:ENSG00000164530" "8.705:ENSG00000054793"
## [39,] "10.22:ENSG00000178860" "8.564:ENSG00000168329"
## [40,] "10.19:ENSG00000109471" "8.503:ENSG00000184349"
## [41,] "10.17:ENSG00000197121" "8.377:ENSG00000100450"
## [42,] "10.15:ENSG00000164400" "8.224:ENSG00000173239"
## [43,] "9.967:ENSG00000180616" "8.088:ENSG00000086548"
## [44,] "9.874:ENSG00000069482" "8.001:ENSG00000111199"
## [45,] "9.8:ENSG00000133687"   "7.934:ENSG00000239839"
## [46,] "9.786:ENSG00000134716" "7.928:ENSG00000139567"
## [47,] "9.778:ENSG00000115009" "7.858:ENSG00000188820"
## [48,] "9.737:ENSG00000197822" "7.744:ENSG00000101425"
## [49,] "9.705:ENSG00000172724" "7.624:ENSG00000176083"
## [50,] "9.686:ENSG00000181634" "7.616:ENSG00000169908"
## Error in exclude_genes_expt(test_batch, ids = comp1_genes, method = "keep"): object 'test_batch' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
ensembl_gene_id description
ENSG00000129824 ENSG00000129824 ribosomal protein S4, Y-linked 1 [Source:HGNC Symbol;Acc:HGNC:10425]
ENSG00000012817 ENSG00000012817 lysine demethylase 5D [Source:HGNC Symbol;Acc:HGNC:11115]
ENSG00000185736 ENSG00000185736 adenosine deaminase, RNA specific B2 (inactive) [Source:HGNC Symbol;Acc:HGNC:227]
ENSG00000067048 ENSG00000067048 DEAD-box helicase 3, Y-linked [Source:HGNC Symbol;Acc:HGNC:2699]
ENSG00000114374 ENSG00000114374 ubiquitin specific peptidase 9, Y-linked [Source:HGNC Symbol;Acc:HGNC:12633]
ENSG00000183878 ENSG00000183878 ubiquitously transcribed tetratricopeptide repeat containing, Y-linked [Source:HGNC Symbol;Acc:HGNC:12638]
ENSG00000198692 ENSG00000198692 eukaryotic translation initiation factor 1A, Y-linked [Source:HGNC Symbol;Acc:HGNC:3252]
ENSG00000067646 ENSG00000067646 zinc finger protein, Y-linked [Source:HGNC Symbol;Acc:HGNC:12870]
ENSG00000074410 ENSG00000074410 carbonic anhydrase 12 [Source:HGNC Symbol;Acc:HGNC:1371]
ENSG00000179344 ENSG00000179344 major histocompatibility complex, class II, DQ beta 1 [Source:HGNC Symbol;Acc:HGNC:4944]
ENSG00000134184 ENSG00000134184 glutathione S-transferase mu 1 [Source:HGNC Symbol;Acc:HGNC:4632]
ENSG00000196735 ENSG00000196735 major histocompatibility complex, class II, DQ alpha 1 [Source:HGNC Symbol;Acc:HGNC:4942]
ENSG00000122641 ENSG00000122641 inhibin beta A subunit [Source:HGNC Symbol;Acc:HGNC:6066]
ENSG00000121380 ENSG00000121380 BCL2 like 14 [Source:HGNC Symbol;Acc:HGNC:16657]
ENSG00000161055 ENSG00000161055 secretoglobin family 3A member 1 [Source:HGNC Symbol;Acc:HGNC:18384]
ENSG00000154620 ENSG00000154620 thymosin beta 4, Y-linked [Source:HGNC Symbol;Acc:HGNC:11882]
ENSG00000166923 ENSG00000166923 gremlin 1, DAN family BMP antagonist [Source:HGNC Symbol;Acc:HGNC:2001]
ENSG00000123453 ENSG00000123453 sarcosine dehydrogenase [Source:HGNC Symbol;Acc:HGNC:10536]
ENSG00000123454 ENSG00000123454 dopamine beta-hydroxylase [Source:HGNC Symbol;Acc:HGNC:2689]
ENSG00000108688 ENSG00000108688 C-C motif chemokine ligand 7 [Source:HGNC Symbol;Acc:HGNC:10634]
ENSG00000131435 ENSG00000131435 PDZ and LIM domain 4 [Source:HGNC Symbol;Acc:HGNC:16501]
ENSG00000136449 ENSG00000136449 MYCBP associated protein [Source:HGNC Symbol;Acc:HGNC:19677]
ENSG00000110092 ENSG00000110092 cyclin D1 [Source:HGNC Symbol;Acc:HGNC:1582]
ENSG00000120645 ENSG00000120645 IQ motif and Sec7 domain 3 [Source:HGNC Symbol;Acc:HGNC:29193]
ENSG00000205057 ENSG00000205057 chronic lymphocytic leukemia up-regulated 1 opposite strand [Source:HGNC Symbol;Acc:HGNC:24070]
ENSG00000123689 ENSG00000123689 G0/G1 switch 2 [Source:HGNC Symbol;Acc:HGNC:30229]
ENSG00000170160 ENSG00000170160 coiled-coil domain containing 144A [Source:HGNC Symbol;Acc:HGNC:29072]
ENSG00000113302 ENSG00000113302 interleukin 12B [Source:HGNC Symbol;Acc:HGNC:5970]
ENSG00000102970 ENSG00000102970 C-C motif chemokine ligand 17 [Source:HGNC Symbol;Acc:HGNC:10615]
ENSG00000198203 ENSG00000198203 sulfotransferase family 1C member 2 [Source:HGNC Symbol;Acc:HGNC:11456]
ENSG00000184371 ENSG00000184371 colony stimulating factor 1 [Source:HGNC Symbol;Acc:HGNC:2432]
ENSG00000149635 ENSG00000149635 osteoclast stimulatory transmembrane protein [Source:HGNC Symbol;Acc:HGNC:16116]
ENSG00000204644 ENSG00000204644 ZFP57 zinc finger protein [Source:HGNC Symbol;Acc:HGNC:18791]
ENSG00000050165 ENSG00000050165 dickkopf WNT signaling pathway inhibitor 3 [Source:HGNC Symbol;Acc:HGNC:2893]
ENSG00000150510 ENSG00000150510 family with sequence similarity 124 member A [Source:HGNC Symbol;Acc:HGNC:26413]
ENSG00000182871 ENSG00000182871 collagen type XVIII alpha 1 chain [Source:HGNC Symbol;Acc:HGNC:2195]
ENSG00000134668 ENSG00000134668 SPOC domain containing 1 [Source:HGNC Symbol;Acc:HGNC:26338]
ENSG00000164530 ENSG00000164530 peptidase inhibitor 16 [Source:HGNC Symbol;Acc:HGNC:21245]
ENSG00000178860 ENSG00000178860 musculin [Source:HGNC Symbol;Acc:HGNC:7321]
ENSG00000109471 ENSG00000109471 interleukin 2 [Source:HGNC Symbol;Acc:HGNC:6001]
ENSG00000197121 ENSG00000197121 post-GPI attachment to proteins 1 [Source:HGNC Symbol;Acc:HGNC:25712]
ENSG00000164400 ENSG00000164400 colony stimulating factor 2 [Source:HGNC Symbol;Acc:HGNC:2434]
ENSG00000180616 ENSG00000180616 somatostatin receptor 2 [Source:HGNC Symbol;Acc:HGNC:11331]
ENSG00000069482 ENSG00000069482 galanin and GMAP prepropeptide [Source:HGNC Symbol;Acc:HGNC:4114]
ENSG00000133687 ENSG00000133687 transmembrane and tetratricopeptide repeat containing 1 [Source:HGNC Symbol;Acc:HGNC:24099]
ENSG00000134716 ENSG00000134716 cytochrome P450 family 2 subfamily J member 2 [Source:HGNC Symbol;Acc:HGNC:2634]
ENSG00000115009 ENSG00000115009 C-C motif chemokine ligand 20 [Source:HGNC Symbol;Acc:HGNC:10619]
ENSG00000197822 ENSG00000197822 occludin [Source:HGNC Symbol;Acc:HGNC:8104]
ENSG00000172724 ENSG00000172724 C-C motif chemokine ligand 19 [Source:HGNC Symbol;Acc:HGNC:10617]
ENSG00000181634 ENSG00000181634 tumor necrosis factor superfamily member 15 [Source:HGNC Symbol;Acc:HGNC:11931]
## This function will replace the expt$expressionset slot with:
## hpgl(data)
## It backs up the current data into a slot named:
##  expt$backup_expressionset. It will also save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep the libsizes in mind
##  when invoking limma.  The appropriate libsize is the non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: hpgl
## Removing 37484 low-count genes (13557 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## Step 4: not transforming the data.
## Step 5: not doing batch correction.
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in extract_de_plots(test_de): object 'test_de' not found
## Error in combine_de_tables(test_de, excel = excel_file): object 'test_de' not found
## Error in extract_significant_genes(test_table, according_to = "deseq", : object 'test_table' not found
## Error in head(test_sig$deseq$ups[[1]]): object 'test_sig' not found
## Error in extract_de_plots(test_de, p = 0.1): object 'test_de' not found
## Error in eval(expr, envir, enclos): object 'test_ma' not found
## Error in plot_histogram(test_table[["data"]][["sh_vs_chr"]][, c("deseq_p")]): object 'test_table' not found
## Error in eval(expr, envir, enclos): object 'test_table' not found

4.6 No-batch data

In the following block, I will take the comparisons performed without any batch in the model/adjustment and use them to search for shared/unique genes among the self-healing vs. uninfected and the chronic vs. uninfected.

4.6.1 Review nobatch pca

## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(hs_pairwise_nobatch, excel = excel_file, keepers = keepers): object 'hs_pairwise_nobatch' not found
## Error in extract_significant_genes(hs_combined_nobatch, excel = excel_file): object 'hs_combined_nobatch' not found
## Error in eval(expr, envir, enclos): object 'hs_sig_nobatch' not found
## Error in rank_order_scatter(hs_pairwise_nobatch, first_type = "limma", : object 'hs_pairwise_nobatch' not found
## Error in eval(expr, envir, enclos): object 'limma_deseq_order' not found
## Error in rownames(hs_sig_nobatch[["deseq"]][["ups"]][["sh_nil"]]): object 'hs_sig_nobatch' not found
## Error in Vennerable::Venn(Sets = up_lst): object 'up_lst' not found
## Error in Vennerable::plot(nobatch_up_venn, doWeights = FALSE): object 'nobatch_up_venn' not found
## Error in eval(expr, envir, enclos): object 'nobatch_up_venn' not found
## Error in eval(expr, envir, enclos): object 'nobatch_up_venn' not found
## Error in rownames(hs_sig_nobatch[["deseq"]][["downs"]][["sh_nil"]]): object 'hs_sig_nobatch' not found
## Error in Vennerable::Venn(Sets = down_lst): object 'down_lst' not found
## Error in Vennerable::plot(nobatch_down_venn, doWeights = FALSE): object 'nobatch_down_venn' not found

4.7 Add patient to the model

Repeat the previous set of analyses with d107/108/110 in the model.

4.7.1 Review pca

## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(hs_pairwise_batch, excel = excel_file, keepers = keepers): object 'hs_pairwise_batch' not found
## Error in extract_significant_genes(hs_combined_batch, excel = excel_file): object 'hs_combined_batch' not found
## Error in eval(expr, envir, enclos): object 'hs_sig_batch' not found
## Error in rownames(hs_sig_batch[["deseq"]][["ups"]][["sh_nil"]]): object 'hs_sig_batch' not found
## Error in Vennerable::Venn(Sets = up_lst): object 'up_lst' not found
## Error in summary(batch_up_venn@IntersectionSets): object 'batch_up_venn' not found
## Error in Vennerable::plot(batch_up_venn, doWeights = FALSE): object 'batch_up_venn' not found
## Error in rownames(hs_sig_batch[["deseq"]][["downs"]][["sh_nil"]]): object 'hs_sig_batch' not found
## Error in Vennerable::Venn(Sets = down_lst): object 'down_lst' not found
## Error in Vennerable::plot(batch_down_venn, doWeights = FALSE): object 'batch_down_venn' not found
## Error in summary(batch_down_venn@IntersectionSets): object 'batch_down_venn' not found
## Testing method: limma.
## Error in compare_de_results(hs_combined_nobatch, hs_combined_batch, cor_method = "spearman"): object 'hs_combined_nobatch' not found
## Error in eval(expr, envir, enclos): object 'similar' not found

4.8 Write an excel workbook using the batch data.

The following block writes out the unique/shared genes observed among the contrasts which included donor in the model.

## Error in eval(expr, envir, enclos): object 'hs_sig_batch' not found
## Error in eval(expr, envir, enclos): object 'batch_up_venn' not found
## Error in eval(expr, envir, enclos): object 'batch_up_venn' not found
## Error in eval(expr, envir, enclos): object 'batch_up_venn' not found
## Error in eval(expr, envir, enclos): object 'batch_down_venn' not found
## Error in eval(expr, envir, enclos): object 'batch_down_venn' not found
## Error in eval(expr, envir, enclos): object 'batch_down_venn' not found
## Error in write_xls(data = start_data[["ups"]][["sh_nil"]][sh_up_solo_genes, : object 'start_data' not found
## Error in write_xls(data = start_data[["ups"]][["ch_nil"]][ch_up_solo_genes, : object 'start_data' not found
## Error in write_xls(data = start_data[["ups"]][["ch_nil"]][shch_up_shared_genes, : object 'start_data' not found
## Error in write_xls(data = start_data[["downs"]][["sh_nil"]][sh_down_solo_genes, : object 'start_data' not found
## Error in write_xls(data = start_data[["downs"]][["ch_nil"]][ch_down_solo_genes, : object 'start_data' not found
## Error in write_xls(data = start_data[["downs"]][["ch_nil"]][shch_down_shared_genes, : object 'start_data' not found

4.9 Add ssva into the mix

Repeat, this time attmepting to tamp down the variance by person.

4.9.1 Review ssva

## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in eval(expr, envir, enclos): object 'hs_pairwise_ssva_pca' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(hs_pairwise_ssva, excel = excel_file, keepers = keepers): object 'hs_pairwise_ssva' not found
## Error in extract_significant_genes(hs_combined_ssva, excel = excel_file): object 'hs_combined_ssva' not found
## Error in eval(expr, envir, enclos): object 'hs_sig_ssva' not found
## Error in rownames(hs_sig_ssva[["deseq"]][["ups"]][["sh_nil"]]): object 'hs_sig_ssva' not found
## Error in Vennerable::Venn(Sets = up_lst): object 'up_lst' not found
## Error in summary(ssva_up_venn@IntersectionSets): object 'ssva_up_venn' not found
## Error in Vennerable::plot(ssva_up_venn, doWeights = FALSE): object 'ssva_up_venn' not found
## Error in rownames(hs_sig_ssva[["deseq"]][["downs"]][["sh_nil"]]): object 'hs_sig_ssva' not found
## Error in Vennerable::Venn(Sets = down_lst): object 'down_lst' not found
## Error in Vennerable::plot(ssva_down_venn, doWeights = FALSE): object 'ssva_down_venn' not found
## Error in summary(ssva_down_venn@IntersectionSets): object 'ssva_down_venn' not found
## Error in compare_de_results(hs_combined_nobatch, hs_combined_ssva, cor_method = "spearman"): object 'hs_combined_nobatch' not found
## Error in eval(expr, envir, enclos): object 'similar' not found
## Error in compare_de_results(hs_combined_batch, hs_combined_ssva, cor_method = "spearman"): object 'hs_combined_batch' not found
## Error in eval(expr, envir, enclos): object 'similar' not found

4.10 fsva

Repeat again using fsva.

4.10.1 Review fsva

## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in eval(expr, envir, enclos): object 'hs_pairwise_fsva_pca' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(hs_pairwise_fsva, excel = excel_file, keepers = keepers): object 'hs_pairwise_fsva' not found
## Error in extract_significant_genes(hs_combined_fsva, excel = excel_file): object 'hs_combined_fsva' not found
## Error in rownames(hs_sig_fsva[["deseq"]][["ups"]][["sh_nil"]]): object 'hs_sig_fsva' not found
## Error in Vennerable::Venn(Sets = up_lst): object 'up_lst' not found
## Error in summary(fsva_up_venn@IntersectionSets): object 'fsva_up_venn' not found
## Error in Vennerable::plot(fsva_up_venn, doWeights = FALSE): object 'fsva_up_venn' not found
## Error in rownames(hs_sig_fsva[["deseq"]][["downs"]][["sh_nil"]]): object 'hs_sig_fsva' not found
## Error in Vennerable::Venn(Sets = down_lst): object 'down_lst' not found
## Error in Vennerable::plot(fsva_down_venn, doWeights = FALSE): object 'fsva_down_venn' not found
## Error in summary(fsva_down_venn@IntersectionSets): object 'fsva_down_venn' not found
## Error in compare_de_results(hs_combined_nobatch, hs_combined_fsva, cor_method = "spearman"): object 'hs_combined_nobatch' not found
## Error in eval(expr, envir, enclos): object 'similar' not found
## Error in compare_de_results(hs_combined_ssva, hs_combined_fsva, cor_method = "spearman"): object 'hs_combined_ssva' not found
## Error in eval(expr, envir, enclos): object 'similar' not found

4.11 Try with the combat modified data

Repeat once again, this time using combat to try to limit the contribution of the strain to the data. I do not think we will ever use this set of contrasts, so I will deactivate it but leave it here if it is required later.

## This function will replace the expt$expressionset slot with:
## combat_scale(hpgl(data))
## It backs up the current data into a slot named:
##  expt$backup_expressionset. It will also save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep the libsizes in mind
##  when invoking limma.  The appropriate libsize is the non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unconverted.  It is often advisable to cpm/rpkm
##  the data to normalize for sampling differences, keep in mind though that rpkm
##  has some annoying biases, and voom() by default does a cpm (though hpgl_voom()
##  will try to detect this).
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## Step 1: performing count filter with option: hpgl
## Removing 0 low-count genes (12086 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## Step 4: not transforming the data.
## Step 5: doing batch correction with combat_scale.
## Note to self:  If you get an error like 'x contains missing values' The data has too many 0's and needs a stronger low-count filter applied.
## batch_counts: Before batch correction, 320 entries are >= 0.
## Passing off to all_adjusters.
## batch_counts: Before batch/surrogate estimation, 320 entries are x<=0.
## The be method chose 2 surrogate variable(s).
## batch_counts: Using combat with a prior and with scaling.
## The number of elements which are < 0 after batch correction is: 6972
## The variable low_to_zero sets whether to change <0 values to 0 and is: FALSE
## The new colors are a character, changing according to condition.

4.11.1 Review combat

## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(hs_pairwise_combatpath, excel = excel_file, : object 'hs_pairwise_combatpath' not found
## Error in extract_significant_genes(hs_combined_combatpath, excel = excel_file): object 'hs_combined_combatpath' not found
## Error in eval(expr, envir, enclos): object 'hs_sig_combatpath' not found
## Error in rownames(hs_sig_combatpath[["deseq"]][["ups"]][["sh_nil"]]): object 'hs_sig_combatpath' not found
## Error in Vennerable::Venn(Sets = up_lst): object 'up_lst' not found
## Error in summary(combatpath_up_venn@IntersectionSets): object 'combatpath_up_venn' not found
## Error in Vennerable::plot(combatpath_up_venn, doWeights = FALSE): object 'combatpath_up_venn' not found
## Error in rownames(hs_sig_combatpath[["deseq"]][["downs"]][["sh_nil"]]): object 'hs_sig_combatpath' not found
## Error in Vennerable::Venn(Sets = down_lst): object 'down_lst' not found
## Error in Vennerable::plot(combatpath_down_venn, doWeights = FALSE): object 'combatpath_down_venn' not found
## Error in summary(combatpath_down_venn@IntersectionSets): object 'combatpath_down_venn' not found
## Error in compare_de_results(hs_combined_nobatch, hs_combined_combatpath, : object 'hs_combined_nobatch' not found
## Error in eval(expr, envir, enclos): object 'similar' not found
## Error in compare_de_results(hs_combined_fsva, hs_combined_combatpath, : object 'hs_combined_fsva' not found
## Error in eval(expr, envir, enclos): object 'similar' not found

4.12 Compare DE results

For each of the following, perform a simple DE and see what happens:

  1. no uninfected strain as batch, try to compare each of the 3 patients chronic/self
  2. no uninfected strain as batch, try to compare chronic/self for all
  3. Repeat #1 above with uninfected
  4. Repeat #2 with uninfected

4.12.1 DE: include uninfected, use strain as batch

The data used in the following is the quantile(cpm(filter())) where the condition was set to a concatenation of patient and healing state, combat was also performed, so we no longer want batch in the experimental model and also we need to pass ‘force=TRUE’ because deseq/edger will need to be coerced into accepting these modified data.

## chr_5430_d108 chr_5397_d108 chr_2504_d108  sh_2272_d108  sh_1022_d108 
##           chr           chr           chr            sh            sh 
##  sh_2189_d108 chr_5430_d110 chr_5397_d110 chr_2504_d110  sh_2272_d110 
##            sh           chr           chr           chr            sh 
##  sh_1022_d110  sh_2189_d110 chr_5430_d107 chr_5397_d107 chr_2504_d107 
##            sh            sh           chr           chr           chr 
##  sh_2272_d107  sh_1022_d107  sh_2189_d107 
##            sh            sh            sh 
## Levels: sh chr
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(hs_uninf_filtv2_pairwise, keepers = uninf_patient_keepers, : object 'hs_uninf_filtv2_pairwise' not found
## Error in extract_significant_genes(hs_uninf_filtv2_combined, according_to = "deseq", : object 'hs_uninf_filtv2_combined' not found

4.13 Make some Venns

Now we want to look at intersections from the perspective of contrasts performed comparing the self-healing/chronic vs. uninfected for the three donors separately.

4.13.1 Perform venns of self-healing vs. uninfected

This time for each of the three donors: self-healing up vs. uninfected.

## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_sig' not found
## Error in rownames(up_sig[["d107_shun"]]): object 'up_sig' not found
## Error in Vennerable::Venn(Sets = comp_lst): object 'comp_lst' not found
## Error in Vennerable::plot(comp_shun_up, doWeights = FALSE): object 'comp_shun_up' not found
## Error in eval(expr, envir, enclos): object 'comp_shun_up' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in merge(de_table_shared_up_sh_first[, c("description", "deseq_logfc", : object 'de_table_shared_up_sh_first' not found
## Error in merge(de_table_shared_up_sh_all, de_table_shared_up_sh_third[, : object 'de_table_shared_up_sh_all' not found
## Error in eval(expr, envir, enclos): object 'de_table_shared_up_sh_all' not found
## Error in eval(expr, envir, enclos): object 'de_table_shared_up_sh_all' not found
## Error in colnames(de_table_shared_up_sh_all) <- c("description", "logfc_107", : object 'de_table_shared_up_sh_all' not found
## Error in is.data.frame(x): object 'de_table_shared_up_sh_all' not found

4.13.2 Perform venns of chronic vs. uninfected

This time for each of the three donors: chronic up vs. uninfected.

## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_sig' not found
## Error in rownames(up_sig[["d107_chun"]]): object 'up_sig' not found
## Error in Vennerable::Venn(Sets = comp_lst): object 'comp_lst' not found
## Error in Vennerable::plot(comp_chun_up, doWeights = FALSE): object 'comp_chun_up' not found
## Error in eval(expr, envir, enclos): object 'comp_chun_up' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in merge(de_table_shared_up_ch_first[, c("description", "deseq_logfc", : object 'de_table_shared_up_ch_first' not found
## Error in merge(de_table_shared_up_ch_all, de_table_shared_up_ch_third[, : object 'de_table_shared_up_ch_all' not found
## Error in eval(expr, envir, enclos): object 'de_table_shared_up_ch_all' not found
## Error in eval(expr, envir, enclos): object 'de_table_shared_up_ch_all' not found
## Error in colnames(de_table_shared_up_ch_all) <- c("description", "logfc_107", : object 'de_table_shared_up_ch_all' not found
## Error in is.data.frame(x): object 'de_table_shared_up_ch_all' not found

4.13.3 Perform venns of self-healing vs. uninfected

This time for each of the three donors: self-healing down vs. uninfected.

## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_sig' not found
## Error in rownames(down_sig[["d107_shun"]]): object 'down_sig' not found
## Error in Vennerable::Venn(Sets = comp_lst): object 'comp_lst' not found
## Error in Vennerable::plot(comp_shun_down, doWeights = FALSE): object 'comp_shun_down' not found
## Error in eval(expr, envir, enclos): object 'comp_shun_down' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in merge(de_table_shared_down_sh_first[, c("description", "deseq_logfc", : object 'de_table_shared_down_sh_first' not found
## Error in merge(de_table_shared_down_sh_all, de_table_shared_down_sh_third[, : object 'de_table_shared_down_sh_all' not found
## Error in eval(expr, envir, enclos): object 'de_table_shared_down_sh_all' not found
## Error in eval(expr, envir, enclos): object 'de_table_shared_down_sh_all' not found
## Error in colnames(de_table_shared_down_sh_all) <- c("description", "logfc_107", : object 'de_table_shared_down_sh_all' not found
## Error in is.data.frame(x): object 'de_table_shared_down_sh_all' not found

4.13.4 Perform venns of self-healing vs. uninfected

This time for each of the three donors: chronic down vs. uninfected.

## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_sig' not found
## Error in rownames(down_sig[["d107_chun"]]): object 'down_sig' not found
## Error in Vennerable::Venn(Sets = comp_lst): object 'comp_lst' not found
## Error in Vennerable::plot(comp_chun_down, doWeights = FALSE): object 'comp_chun_down' not found
## Error in eval(expr, envir, enclos): object 'comp_chun_down' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in eval(expr, envir, enclos): object 'hs_uninf_filtv2_combined' not found
## Error in merge(de_table_shared_down_ch_first[, c("description", "deseq_logfc", : object 'de_table_shared_down_ch_first' not found
## Error in merge(de_table_shared_down_ch_all, de_table_shared_down_ch_third[, : object 'de_table_shared_down_ch_all' not found
## Error in eval(expr, envir, enclos): object 'de_table_shared_down_ch_all' not found
## Error in eval(expr, envir, enclos): object 'de_table_shared_down_ch_all' not found
## Error in colnames(de_table_shared_down_ch_all) <- c("description", "logfc_107", : object 'de_table_shared_down_ch_all' not found
## Error in is.data.frame(x): object 'de_table_shared_down_ch_all' not found

At this point, we should have a set of genes which are up/down in the self/uninfected and chronic/uninfected, kept in variables with names like: ‘shared_shun_down’ and ‘shared_chun_down’

4.14 Get Meta! Intersect the above comparisons.

Now we want a sense of what genes are shared/unique among the self-healing vs. uninfected and the chronic vs. uninfected comparisons performed above. One would assume that the most interesting genes in these sets will prove to be the the ones which are not shared.

## Error in eval(expr, envir, enclos): object 'shared_shun_up' not found
## Error in Vennerable::Venn(Sets = shch_up_lst): object 'shch_up_lst' not found
## Error in Vennerable::plot(shared_up, doWeights = FALSE): object 'shared_up' not found
## Error in eval(expr, envir, enclos): object 'shared_shun_down' not found
## Error in Vennerable::Venn(Sets = shch_down_lst): object 'shch_down_lst' not found
## Error in Vennerable::plot(shared_down, doWeights = FALSE): object 'shared_down' not found
## Error in eval(expr, envir, enclos): object 'shared_up' not found
## Error in eval(expr, envir, enclos): object 'shared_up' not found
## Error in eval(expr, envir, enclos): object 'shared_up' not found
## Error in eval(expr, envir, enclos): object 'shared_down' not found
## Error in eval(expr, envir, enclos): object 'shared_down' not found
## Error in eval(expr, envir, enclos): object 'shared_down' not found
## Error in write_xls(data = up_sig[["d107_shun"]][upup_genes, kept_columns], : object 'up_sig' not found
## Error in write_xls(data = up_sig[["d107_shun"]][upsh_notch, kept_columns], : object 'up_sig' not found
## Error in write_xls(data = up_sig[["d107_chun"]][upch_notsh, kept_columns], : object 'up_sig' not found
## Error in write_xls(data = down_sig[["d107_shun"]][downdown_genes, kept_columns], : object 'down_sig' not found
## Error in write_xls(data = down_sig[["d107_shun"]][downsh_notch, kept_columns], : object 'down_sig' not found
## Error in write_xls(data = down_sig[["d107_chun"]][downch_notsh, kept_columns], : object 'down_sig' not found

4.14.1 Genes shared among the donors.

One further query: what genes are shared among the contrasts of self-healing/chronic vs. uninfected for the three donors? When doing this, we have once again to consider whether to use the nobatch/batch-in-model/sva/etc methods against our donors… Since they all agree pretty well until combat, I will arbitrarily choose fsva.

One idea suggested by Maria Adelaida was to compare the set of genes shared among d107/d108/d110 in this last comparison (which was each of the three donors separately) against the set of genes in the all-data analysis above.

4.14.1.1 Attempt to answer by the unique individual sets

In this block, I will attempt to answer the above query by intersecting the sets of genes shared among the individuals but unique to sh/chr vs. uninfected against the set of genes observed in the original sva-mediated DE analysis.

## Error in eval(expr, envir, enclos): object 'shared_up' not found
## Error in rownames(hs_sig_fsva[["deseq"]][["ups"]][["sh_nil"]]): object 'hs_sig_fsva' not found
## Error in Vennerable::Venn(Sets = avg_vs_ind_shun_up): object 'avg_vs_ind_shun_up' not found
## Error in Vennerable::plot(avg_ind_shup_venn, doWeights = FALSE): object 'avg_ind_shup_venn' not found
## Error in eval(expr, envir, enclos): object 'shared_up' not found
## Error in rownames(hs_sig_fsva[["deseq"]][["ups"]][["ch_nil"]]): object 'hs_sig_fsva' not found
## Error in Vennerable::Venn(Sets = avg_vs_ind_chun_up): object 'avg_vs_ind_chun_up' not found
## Error in Vennerable::plot(avg_ind_chup_venn, doWeights = FALSE): object 'avg_ind_chup_venn' not found
## Error in eval(expr, envir, enclos): object 'shared_down' not found
## Error in rownames(hs_sig_fsva[["deseq"]][["downs"]][["sh_nil"]]): object 'hs_sig_fsva' not found
## Error in Vennerable::Venn(Sets = avg_vs_ind_shun_down): object 'avg_vs_ind_shun_down' not found
## Error in Vennerable::plot(avg_ind_shdown_venn, doWeights = FALSE): object 'avg_ind_shdown_venn' not found
## Error in eval(expr, envir, enclos): object 'shared_down' not found
## Error in rownames(hs_sig_fsva[["deseq"]][["downs"]][["ch_nil"]]): object 'hs_sig_fsva' not found
## Error in Vennerable::Venn(Sets = avg_vs_ind_chun_down): object 'avg_vs_ind_chun_down' not found
## Error in Vennerable::plot(avg_ind_chdown_venn, doWeights = FALSE): object 'avg_ind_chdown_venn' not found

4.14.1.2 Answer by looking at the shared genes in both sets

## Error in rownames(hs_sig_batch[["deseq"]][["ups"]][["sh_nil"]]): object 'hs_sig_batch' not found
## Error in rownames(hs_sig_batch[["deseq"]][["ups"]][["ch_nil"]]): object 'hs_sig_batch' not found
## Error in rownames(hs_sig_batch[["deseq"]][["downs"]][["sh_nil"]]): object 'hs_sig_batch' not found
## Error in rownames(hs_sig_batch[["deseq"]][["downs"]][["ch_nil"]]): object 'hs_sig_batch' not found
## Error in eval(expr, envir, enclos): object 'comp_shun_up' not found
## Error in eval(expr, envir, enclos): object 'comp_chun_up' not found
## Error in eval(expr, envir, enclos): object 'comp_shun_down' not found
## Error in eval(expr, envir, enclos): object 'comp_chun_down' not found
## Error in eval(expr, envir, enclos): object 'shun_up_avg_genes' not found
## Error in Vennerable::Venn(Sets = last_shun_up_lst): object 'last_shun_up_lst' not found
## Error in Vennerable::plot(last_shun_up_venn, doWeights = FALSE): object 'last_shun_up_venn' not found
## Error in eval(expr, envir, enclos): object 'chun_up_avg_genes' not found
## Error in Vennerable::Venn(Sets = last_chun_up_lst): object 'last_chun_up_lst' not found
## Error in Vennerable::plot(last_chun_up_venn, doWeights = FALSE): object 'last_chun_up_venn' not found
## Error in eval(expr, envir, enclos): object 'shun_down_avg_genes' not found
## Error in Vennerable::Venn(Sets = last_shun_down_lst): object 'last_shun_down_lst' not found
## Error in Vennerable::plot(last_shun_down_venn, doWeights = FALSE): object 'last_shun_down_venn' not found
## Error in eval(expr, envir, enclos): object 'chun_down_avg_genes' not found
## Error in Vennerable::Venn(Sets = last_chun_down_lst): object 'last_chun_down_lst' not found
## Error in Vennerable::plot(last_chun_down_venn, doWeights = FALSE): object 'last_chun_down_venn' not found

5 Figure 5

Generate DE lists of each donor for all contrasts for PBMCs.

  1. Venn sh/uninf vs chr/uninf 2 venn diagram up. (donor in model)
  2. Venn sh/uninf vs chr/uninf 2 venn diagram down.
  3. Venn Sh/uninf up genes 3 venn diagram.
  4. Venn Sh/uninf down genes 3 venn.
  5. Venn Chr/uninf up genes 3 venn.
  6. Venn Chr/uninf down genes 3 venn.
  7. 2 way venn of (common up in 3 venn sh/uninf) vs. (common up in 3 venn chr/uninf)
  8. 2 way venn of (common down in 3 venn sh/uninf) vs. (common down in 3 venn chr/uninf)

I renamed these plots and am now hopelessly confused as to which is which. I think I will not run this for now but instead generate the worksheet without them and then return to this in the hopes that I can do a better job.

6 Try again on the parasite data

6.1 Remember our data set

## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(lp_pairwise_nobatch, excel = excel_file): object 'lp_pairwise_nobatch' not found
## Error in extract_significant_genes(lp_combined_nobatch, excel = excel_file): object 'lp_combined_nobatch' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(lp_pairwise_batch, excel = excel_file): object 'lp_pairwise_batch' not found
## Error in extract_significant_genes(lp_combined_batch, excel = excel_file): object 'lp_combined_batch' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(lp_pairwise_ssva, excel = excel_file): object 'lp_pairwise_ssva' not found
## Error in extract_significant_genes(lp_combined_ssva, excel = excel_file): object 'lp_combined_ssva' not found
## Error in preprocessCore::normalize.quantiles(as.matrix(count_table), copy = TRUE): ERROR; return code from pthread_create() is 22
## Error in combine_de_tables(lp_pairwise_fsva, excel = excel_file): object 'lp_pairwise_fsva' not found
## Error in extract_significant_genes(lp_combined_fsva, excel = excel_file): object 'lp_combined_fsva' not found

R version 3.5.1 (2018-07-02)

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

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

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

other attached packages: bindrcpp(v.0.2.2), ruv(v.0.9.7), variancePartition(v.1.12.0), scales(v.1.0.0), foreach(v.1.4.4), limma(v.3.38.3), ggplot2(v.3.1.0), hpgltools(v.2018.11), Biobase(v.2.42.0) and BiocGenerics(v.0.28.0)

loaded via a namespace (and not attached): tidyselect(v.0.2.5), lme4(v.1.1-19), RSQLite(v.2.1.1), AnnotationDbi(v.1.44.0), htmlwidgets(v.1.3), grid(v.3.5.1), BiocParallel(v.1.16.2), devtools(v.2.0.1), munsell(v.0.5.0), codetools(v.0.2-15), preprocessCore(v.1.44.0), units(v.0.6-2), withr(v.2.1.2), colorspace(v.1.3-2), GOSemSim(v.2.8.0), OrganismDbi(v.1.24.0), highr(v.0.7), knitr(v.1.20), rstudioapi(v.0.8), stats4(v.3.5.1), Vennerable(v.3.1.0.9000), DOSE(v.3.8.0), labeling(v.0.3), urltools(v.1.7.1), GenomeInfoDbData(v.1.2.0), bit64(v.0.9-7), farver(v.1.1.0), rprojroot(v.1.3-2), R6(v.2.3.0), doParallel(v.1.0.14), GenomeInfoDb(v.1.18.1), locfit(v.1.5-9.1), bitops(v.1.0-6), fgsea(v.1.8.0), gridGraphics(v.0.3-0), DelayedArray(v.0.8.0), assertthat(v.0.2.0), ggraph(v.1.0.2), nnet(v.7.3-12), enrichplot(v.1.2.0), gtable(v.0.2.0), sva(v.3.30.0), processx(v.3.2.1), rlang(v.0.3.0.1), genefilter(v.1.64.0), splines(v.3.5.1), rtracklayer(v.1.42.1), lazyeval(v.0.2.1), acepack(v.1.4.1), checkmate(v.1.8.5), europepmc(v.0.3), BiocManager(v.1.30.4), yaml(v.2.2.0), reshape2(v.1.4.3), GenomicFeatures(v.1.34.1), backports(v.1.1.2), qvalue(v.2.14.0), Hmisc(v.4.1-1), clusterProfiler(v.3.10.0), RBGL(v.1.58.1), tools(v.3.5.1), usethis(v.1.4.0), ggplotify(v.0.0.3), gplots(v.3.0.1), RColorBrewer(v.1.1-2), sessioninfo(v.1.1.1), ggridges(v.0.5.1), Rcpp(v.1.0.0), plyr(v.1.8.4), base64enc(v.0.1-3), progress(v.1.2.0), zlibbioc(v.1.28.0), purrr(v.0.2.5), RCurl(v.1.95-4.11), ps(v.1.2.1), prettyunits(v.1.0.2), rpart(v.4.1-13), viridis(v.0.5.1), cowplot(v.0.9.3), S4Vectors(v.0.20.1), SummarizedExperiment(v.1.12.0), ggrepel(v.0.8.0), cluster(v.2.0.7-1), colorRamps(v.2.3), fs(v.1.2.6), magrittr(v.1.5), data.table(v.1.11.8), openxlsx(v.4.1.0), DO.db(v.2.9), triebeard(v.0.3.0), packrat(v.0.5.0), matrixStats(v.0.54.0), pkgload(v.1.0.2), hms(v.0.4.2), evaluate(v.0.12), xtable(v.1.8-3), pbkrtest(v.0.4-7), XML(v.3.98-1.16), IRanges(v.2.16.0), gridExtra(v.2.3), testthat(v.2.0.1), compiler(v.3.5.1), biomaRt(v.2.38.0), tibble(v.1.4.2), KernSmooth(v.2.23-15), crayon(v.1.3.4), minqa(v.1.2.4), htmltools(v.0.3.6), corpcor(v.1.6.9), mgcv(v.1.8-26), Formula(v.1.2-3), geneplotter(v.1.60.0), tidyr(v.0.8.2), DBI(v.1.0.0), tweenr(v.1.0.0), MASS(v.7.3-51.1), Matrix(v.1.2-15), cli(v.1.0.1), quadprog(v.1.5-5), gdata(v.2.18.0), bindr(v.0.1.1), igraph(v.1.2.2), GenomicRanges(v.1.34.0), pkgconfig(v.2.0.2), rvcheck(v.0.1.3), GenomicAlignments(v.1.18.0), foreign(v.0.8-71), plotly(v.4.8.0), xml2(v.1.2.0), annotate(v.1.60.0), XVector(v.0.22.0), stringr(v.1.3.1), callr(v.3.0.0), digest(v.0.6.18), graph(v.1.60.0), Biostrings(v.2.50.1), rmarkdown(v.1.10), fastmatch(v.1.1-0), htmlTable(v.1.12), edgeR(v.3.24.1), directlabels(v.2018.05.22), Rsamtools(v.1.34.0), gtools(v.3.8.1), nloptr(v.1.2.1), nlme(v.3.1-137), jsonlite(v.1.6), desc(v.1.2.0), viridisLite(v.0.3.0), pillar(v.1.3.0), lattice(v.0.20-38), httr(v.1.3.1), pkgbuild(v.1.0.2), survival(v.2.43-3), GO.db(v.3.7.0), glue(v.1.3.0), remotes(v.2.0.2), zip(v.1.0.0), UpSetR(v.1.3.3), iterators(v.1.0.10), pander(v.0.6.3), bit(v.1.1-14), ggforce(v.0.1.3), stringi(v.1.2.4), blob(v.1.1.1), DESeq2(v.1.22.1), latticeExtra(v.0.6-28), caTools(v.1.17.1.1), memoise(v.1.1.0) and dplyr(v.0.7.8)

## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 242609d9ad73083ea13099760f8f0678a4befbf8
## This is hpgltools commit: Wed Dec 5 15:02:17 2018 -0500: 242609d9ad73083ea13099760f8f0678a4befbf8
## Saving to 03_expression_infection_20180822-v20180822.rda.xz

7 State saved to this_save

LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDE4MDgyMjogRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gb2YgaW5mZWN0ZWQgUEJNQ3MuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiBmb250LXNpemU6IDE2cHgKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0PTgsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAiMDJfZXN0aW1hdGlvbl9pbmZlY3Rpb25fMjAxODA4MjIuUm1kIgp2ZXIgPC0gIjIwMTgwODIyIgoKdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKQpybWRfZmlsZSA8LSAiMDNfZXhwcmVzc2lvbl9pbmZlY3Rpb25fMjAxODA4MjIuUm1kIgpgYGAKCiMgVE9ETyAyMDE4MTIxMAoKMS4gIFNob3cgc2FtcGxlcyBpbiBjdXJyZW50IHN0YXRlLgogIGEuICBTaG93IGN1cnJlbnQgcC12YWx1ZSBkaXN0cmlidXRpb25zIGJ5IGRvbm9yIGFuZCB0b2dldGhlciB0byBpbGx1c3RyYXRlIHRoZSBjb25jZXJucy4KMi4gIFNob3cgUENBcyBhbmQgbG9hZGluZyBhbmFseXNlcy4KMy4gIFJlcGVyZm9ybSBkZWZhdWx0IGFuYWx5c2VzIGFmdGVyIHJlbW92aW5nIG9uZSBhbmQgdHdvIHNhbXBsZXMuCjQuICBQZXJmb3JtIHF1aWNrIEdPIG9mIGRlIHRhYmxlcyBhZnRlciByZW1vdmluZyBvbmUgYW5kIHR3by4KCiMgUEJNQyBJbmZlY3Rpb24gRGlmZmVyZW50aWFsIEV4cHJlc3Npb24sIEluZmVjdGlvbjogYHIgdmVyYCBSdW5kYXRlOiBgciBydW5kYXRlYAoKVGhpcyBkb2N1bWVudCB0dXJucyB0byB0aGUgaW5mZWN0aW9uIG9mIFBCTUMgY2VsbHMgd2l0aCBMLnBhbmFtZW5zaXMuICBUaGlzIGRhdGEKaXMgcGFydGljdWxhcmx5IHN0cmFuZ2VseSBhZmZlY3RlZCBieSB0aGUgZGlmZmVyZW50IHN0cmFpbnMgdXNlZCB0byBpbmZlY3QgdGhlCmNlbGxzLCBhbmQgYXMgYSByZXN1bHQgaXMgYm90aCB1c2VmdWwgYW5kIHRyb3VibGluZy4KCkdpdmVuIHRoZSBvYnNlcnZhdGlvbnMgYWJvdmUsIHdlIGhhdmUgc29tZSBpZGVhcyBvZiB3YXlzIHRvIHBhc3MgdGhlIGRhdGEgZm9yCmRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2VzIHdoaWNoIG1heSBvciBtYXkgbm90IGJlICdiZXR0ZXInLiAgTGV0cyB0cnkKc29tZSBhbmQgc2VlIHdoYXQgaGFwcGVucy4KCiMjIENyZWF0ZSBkYXRhIHNldHMgdG8gY29tcGFyZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNlcwoKR2l2ZW4gdGhlIGFib3ZlIHdheXMgdG8gbWFzc2FnZSB0aGUgZGF0YSwgbGV0cyB1c2UgYSBmZXcgb2YgdGhlbSBmb3IKbGltbWEvZGVzZXEvZWRnZXIuIFRoZSBtYWluIGNhdmVhdCBpbiB0aGlzIGlzIHRoYXQgdGhvc2UgdG9vbHMgcmVhbGx5IGRvIGV4cGVjdApzcGVjaWZpYyBkaXN0cmlidXRpb25zIG9mIGRhdGEgd2hpY2ggd2UgaG9ycmlibHkgdmlvbGF0ZSBpZiB3ZSB1c2UgbG9nMigpIGRhdGEsCndoaWNoIGlzIHdoeSBpbiB0aGUgcHJldmlvdXMgYmxvY2tzIEkgbmFtZWQgdGhlbSBsMmJsYWhibGFoLCB0aHVzIHdlIGNhbiBkbyB0aGUKc2FtZSBzZXRzIG9mIG5vcm1hbGl6YXRpb24gYnV0IHdpdGhvdXQgdGhhdCBhbmQgZm9yY2libHkgcHVzaCB0aGUgcmVzdWx0aW5nIGRhdGEKaW50byBsaW1tYS9lZGdlci9kZXNlcS4KCiMgVGhlIG5lZ2F0aXZlIGNvbnRyb2wKCkV2ZXJ5dGhpbmcgSSBkaWQgaW4gMDJfZXN0aW1hdGlvbl9pbmZlY3Rpb24uaHRtbCBzdWdnZXN0cyB0aGF0IHRoZXJlIGFyZSBubwpzaWduaWZpY2FudCBkaWZmZXJlbmNlcyB2aXNpYmxlIGlmIG9uZSBsb29rcyBqdXN0IGF0IGNocm9uaWMvc2VsZi1oZWFsaW5nIGluCnRoaXMgZGF0YS4gIEZ1cnRoZXIgdGVzdGluZyBoYXMgc2VlbWluZ2x5IHByb3ZlbiB0aGlzIHN0YXRlbWVudCwgYXMgYSByZXN1bHQKbW9zdCBvZiB0aGUgZm9sbG93aW5nIGFuYWx5c2VzIHdpbGwgbG9vayBhdCBjaHJvbmljL3VuaW5mZWN0ZWQgYW5kCnNlbGYtaGVhbGluZy91bmluZmVjdGVkIGZvbGxvd2VkIGJ5IGF0dGVtcHRzIHRvIHJlY29uY2lsZSB0aG9zZSByZXN1bHRzLgoKIyMgRmlsdGVyIHRoZSBkYXRhCgpUbyBzYXZlIHNvbWUgdGltZSBhbmQgYW5ub3lhbmNlIHdpdGggc3ZhLCBsZXRzIGZpbHRlciB0aGUgZGF0YSBub3cuICBJbgphZGRpdGlvbiwgd3JpdGUgZG93biBhIHNtYWxsIGZ1bmN0aW9uIHVzZWQgdG8gZXh0cmFjdCB0aGUgc2V0cyBvZiBzaWduaWZpY2FudApnZW5lcyBhY3Jvc3MgZGlmZmVyZW50IGNvbnRyYXN0cyAobm90YWJseSBzZWxmL3VuaW5mZWN0ZWQgdnMuIGNocm9uaWMvdW5pbmZlY3RlZCkuCgpgYGB7ciBmaWx0ZXJ9CmhzX2luZl9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzX2Nkc19pbmYsIGZpbHRlcj1UUlVFKSkKaHNfdW5pbmZfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChoc19jZHNfdW5pbmYsIGZpbHRlcj1UUlVFKSkKa2VlcGVycyA8LSBsaXN0KCJzaF9uaWwiID0gYygic2giLCAidW5pbmYiKSwKICAgICAgICAgICAgICAgICJjaF9uaWwiID0gYygiY2hyIiwgInVuaW5mIiksCiAgICAgICAgICAgICAgICAiY2hfc2giID0gYygiY2hyIiwgInNoIikpCmtlZXBlcnNfaW5mIDwtIGxpc3QoImNoX3NoIiA9IGMoImNociIsICJzaCIpKQoKYGBgCgojIFF1ZXJpZXMgZnJvbSAyMDE4MTIwNQoKIyMgRWFjaCBpbmRpdmlkdWFsLCBjaHIgdnMgc2guCgpgYGB7ciBlYWNoX2luZGl2aWR1YWx9CmQxMDcgPC0gc3Vic2V0X2V4cHQoaHNfaW5mX2ZpbHQsIHN1YnNldD0iZG9ub3I9PSdkMTA3JyIpCmQxMDdfcGFpcndpc2UgPC0gYWxsX3BhaXJ3aXNlKGQxMDcsIG1vZGVsX2JhdGNoPUZBTFNFKQpkMTA3X3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKGQxMDdfcGFpcndpc2UpCnN1bW1hcnkoZDEwN190YWJsZSRkYXRhKQpkMTA3X3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGQxMDdfdGFibGUsIGFjY29yZGluZ190bz0iZGVzZXEiLCBwPTAuMSwgcF90eXBlPSJyYXciKQpoZWFkKGQxMDdfc2lnJGRlc2VxJHVwc1tbMV1dKQpkMTA3X21hIDwtIGV4dHJhY3RfZGVfcGxvdHMoZDEwN19wYWlyd2lzZSwgcD0wLjEsIHBfdHlwZT0icmF3IikkbWEkcGxvdApkMTA3X21hCnBsb3RfaGlzdG9ncmFtKGQxMDdfdGFibGVbWyJkYXRhIl1dW1sic2hfdnNfY2hyIl1dWywgYygiZGVzZXFfcCIpXSkKcGxvdF9wY2Eoc20obm9ybWFsaXplX2V4cHQoZDEwNywgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpKSRwbG90CgpkMTA4IDwtIHN1YnNldF9leHB0KGhzX2luZl9maWx0LCBzdWJzZXQ9ImRvbm9yPT0nZDEwOCciKQpkMTA4X3BhaXJ3aXNlIDwtIGFsbF9wYWlyd2lzZShkMTA4LCBtb2RlbF9iYXRjaD1GQUxTRSkKZDEwOF90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcyhkMTA4X3BhaXJ3aXNlKQpzdW1tYXJ5KGQxMDhfdGFibGUkZGF0YSkKZDEwOF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhkMTA4X3RhYmxlLCBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIHBfdHlwZT0icmF3IikKaGVhZChkMTA4X3NpZyRkZXNlcSR1cHNbWzFdXSkKZDEwOF9tYSA8LSBleHRyYWN0X2RlX3Bsb3RzKGQxMDhfcGFpcndpc2UsIHA9MC4xLCBwX3R5cGU9InJhdyIpJG1hJHBsb3QKZDEwOF9tYQpwbG90X2hpc3RvZ3JhbShkMTA4X3RhYmxlW1siZGF0YSJdXVtbInNoX3ZzX2NociJdXVssIGMoImRlc2VxX3AiKV0pCnBsb3RfcGNhKHNtKG5vcm1hbGl6ZV9leHB0KGQxMDgsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpKSkkcGxvdAoKZDExMCA8LSBzdWJzZXRfZXhwdChoc19pbmZfZmlsdCwgc3Vic2V0PSJkb25vcj09J2QxMTAnIikKZDExMF9wYWlyd2lzZSA8LSBhbGxfcGFpcndpc2UoZDExMCwgbW9kZWxfYmF0Y2g9RkFMU0UpCmQxMTBfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoZDExMF9wYWlyd2lzZSkKc3VtbWFyeShkMTEwX3RhYmxlJGRhdGEpCmQxMTBfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoZDExMF90YWJsZSwgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBwX3R5cGU9InJhdyIpCmhlYWQoZDExMF9zaWckZGVzZXEkdXBzW1sxXV0pCmQxMTBfbWEgPC0gZXh0cmFjdF9kZV9wbG90cyhkMTEwX3BhaXJ3aXNlLCBwPTAuMSwgcF90eXBlPSJyYXciKSRtYSRwbG90CmQxMTBfbWEKcGxvdF9oaXN0b2dyYW0oZDExMF90YWJsZVtbImRhdGEiXV1bWyJzaF92c19jaHIiXV1bLCBjKCJkZXNlcV9wIildKQpwbG90X3BjYShzbShub3JtYWxpemVfZXhwdChkMTEwLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKSkpJHBsb3QKCmhzX3RtcCA8LSBzZXRfZXhwdF9iYXRjaGVzKGhzX2luZl9maWx0LCBmYWN0PSJwYXRob2dlbnN0cmFpbiIpCmhzX3RtcDIgPC0gbm9ybWFsaXplX2V4cHQoaHNfdG1wLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKQpwbG90X3BjYShoc190bXAyKSRwbG90CmBgYAoKIyMgQ2hhbmdlIG9ubHkgc2FtcGxlIHMyNTA0IHRvIHNlbGYtaGVhbGluZwoKYGBge3Igc2luZ2xlX3N3aXRjaH0KZDEwNyA8LSBzdWJzZXRfZXhwdChoc19pbmZfZmlsdCwgc3Vic2V0PSJkb25vcj09J2QxMDcnIikKZDEwNyA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGQxMDcsIGZhY3Q9InNoIiwgaWRzPSkKCmQxMDdfcGFpcndpc2UgPC0gYWxsX3BhaXJ3aXNlKGQxMDcsIG1vZGVsX2JhdGNoPUZBTFNFKQpkMTA3X3RhYmxlIDwtIGNvbWJpbmVfZGVfdGFibGVzKGQxMDdfcGFpcndpc2UpCnN1bW1hcnkoZDEwN190YWJsZSRkYXRhKQpkMTA3X3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGQxMDdfdGFibGUsIGFjY29yZGluZ190bz0iZGVzZXEiLCBwPTAuMSwgcF90eXBlPSJyYXciKQpoZWFkKGQxMDdfc2lnJGRlc2VxJHVwc1tbMV1dKQpkMTA3X21hIDwtIGV4dHJhY3RfZGVfcGxvdHMoZDEwN19wYWlyd2lzZSwgcD0wLjEsIHBfdHlwZT0icmF3IikkbWEkcGxvdApkMTA3X21hCnBsb3RfaGlzdG9ncmFtKGQxMDdfdGFibGVbWyJkYXRhIl1dW1sic2hfdnNfY2hyIl1dWywgYygiZGVzZXFfcCIpXSkKcGxvdF9wY2Eoc20obm9ybWFsaXplX2V4cHQoZDEwNywgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpKSRwbG90CgpkMTA4IDwtIHN1YnNldF9leHB0KGhzX2luZl9maWx0LCBzdWJzZXQ9ImRvbm9yPT0nZDEwOCciKQpkMTA4X3BhaXJ3aXNlIDwtIGFsbF9wYWlyd2lzZShkMTA4LCBtb2RlbF9iYXRjaD1GQUxTRSkKZDEwOF90YWJsZSA8LSBjb21iaW5lX2RlX3RhYmxlcyhkMTA4X3BhaXJ3aXNlKQpzdW1tYXJ5KGQxMDhfdGFibGUkZGF0YSkKZDEwOF9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhkMTA4X3RhYmxlLCBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIHBfdHlwZT0icmF3IikKaGVhZChkMTA4X3NpZyRkZXNlcSR1cHNbWzFdXSkKZDEwOF9tYSA8LSBleHRyYWN0X2RlX3Bsb3RzKGQxMDhfcGFpcndpc2UsIHA9MC4xLCBwX3R5cGU9InJhdyIpJG1hJHBsb3QKZDEwOF9tYQpwbG90X2hpc3RvZ3JhbShkMTA4X3RhYmxlW1siZGF0YSJdXVtbInNoX3ZzX2NociJdXVssIGMoImRlc2VxX3AiKV0pCnBsb3RfcGNhKHNtKG5vcm1hbGl6ZV9leHB0KGQxMDgsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpKSkkcGxvdAoKZDExMCA8LSBzdWJzZXRfZXhwdChoc19pbmZfZmlsdCwgc3Vic2V0PSJkb25vcj09J2QxMTAnIikKZDExMF9wYWlyd2lzZSA8LSBhbGxfcGFpcndpc2UoZDExMCwgbW9kZWxfYmF0Y2g9RkFMU0UpCmQxMTBfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMoZDExMF9wYWlyd2lzZSkKc3VtbWFyeShkMTEwX3RhYmxlJGRhdGEpCmQxMTBfc2lnIDwtIGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoZDExMF90YWJsZSwgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBwX3R5cGU9InJhdyIpCmhlYWQoZDExMF9zaWckZGVzZXEkdXBzW1sxXV0pCmQxMTBfbWEgPC0gZXh0cmFjdF9kZV9wbG90cyhkMTEwX3BhaXJ3aXNlLCBwPTAuMSwgcF90eXBlPSJyYXciKSRtYSRwbG90CmQxMTBfbWEKcGxvdF9oaXN0b2dyYW0oZDExMF90YWJsZVtbImRhdGEiXV1bWyJzaF92c19jaHIiXV1bLCBjKCJkZXNlcV9wIildKQpwbG90X3BjYShzbShub3JtYWxpemVfZXhwdChkMTEwLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKSkpJHBsb3QKYGBgCgojIyBSZW1vdmUgc2FtcGxlcyBmcm9tIHN0cmFpbiAyNTA0IGFuZC9vciAyMjcyCgpgYGB7ciByZW1vdmVfc2FtcGxlc30KcmVtb3ZlX29uZSA8LSBzdWJzZXRfZXhwdChoc19pbmZfZmlsdCwgc3Vic2V0PSJwYXRob2dlbnN0cmFpbiE9J3MyNTA0JyIpCnJlbW92ZV9vbmVfZmlsdCA8LSBub3JtYWxpemVfZXhwdChyZW1vdmVfb25lLCBmaWx0ZXI9VFJVRSkKcmVtb3ZlX3R3byA8LSBzdWJzZXRfZXhwdChoc19pbmZfZmlsdCwgc3Vic2V0PSJwYXRob2dlbnN0cmFpbiE9J3MyMjcyJyIpCnJlbW92ZV90d29fZmlsdCA8LSBub3JtYWxpemVfZXhwdChyZW1vdmVfdHdvLCBmaWx0ZXI9VFJVRSkKYGBgCgojIyMgUmVtb3ZlIG9uZSBhbmFseXNlcwoKT25jZSB1c2luZyBiYXRjaCBpbiBtb2RlbCwgb25jZSB3aXRoIHN2YXNlcS4KCmBgYHtyIHJlbW92ZW9uZX0KcmVtb3ZlX29uZV9kZSA8LSBzbShhbGxfcGFpcndpc2UocmVtb3ZlX29uZV9maWx0LCBtb2RlbF9iYXRjaD1UUlVFLCBwYXJhbGxlbD1GQUxTRSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVvbmVfYmF0Y2htb2RlbF9jb250ci12e3Zlcn0ueGxzeCIpCnJlbW92ZV9vbmVfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMocmVtb3ZlX29uZV9kZSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwZXJzPWtlZXBlcnNfaW5mKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfcmVtb3Zlb25lX2JhdGNobW9kZWxfc2lnLXZ7dmVyfS54bHN4IikKcmVtb3ZlX29uZV9zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhyZW1vdmVfb25lX3RhYmxlLCBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZ190bz0iZGVzZXEiLCBwPTAuMSwgbGZjPTAuNikKCnJlbW92ZV9vbmVfZGVfc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfb25lX2ZpbHQsIG1vZGVsX2JhdGNoPSJzdmFzZXEiLCBwYXJhbGxlbD1GQUxTRSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVvbmVfc3Zhc2VxX2NvbnRyLXZ7dmVyfS54bHN4IikKcmVtb3ZlX29uZV90YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMocmVtb3ZlX29uZV9kZV9zdmEsIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnM9a2VlcGVyc19pbmYpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVvbmVfc3Zhc2VxX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV9vbmVfc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHJlbW92ZV9vbmVfdGFibGVfc3ZhLCBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIGxmYz0wLjYpCmBgYAoKIyMjIFJlbW92ZSB0d28gYW5hbHlzZXMKClJlcGVhdCBhcyBhYm92ZSwgcmVtb3ZpbmcgYm90aCB3ZWlyZG8gc2FtcGxlcy4KCmBgYHtyIHJlbW92ZXR3b30KcmVtb3ZlX3R3b19kZSA8LSBzbShhbGxfcGFpcndpc2UocmVtb3ZlX3R3b19maWx0LCBtb2RlbF9iYXRjaD1UUlVFLCBwYXJhbGxlbD1GQUxTRSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVvbmVfYmF0Y2htb2RlbF9jb250ci12e3Zlcn0ueGxzeCIpCnJlbW92ZV90d29fdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXMocmVtb3ZlX3R3b19kZSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwZXJzPWtlZXBlcnNfaW5mKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfcmVtb3Zlb25lX2JhdGNobW9kZWxfc2lnLXZ7dmVyfS54bHN4IikKcmVtb3ZlX3R3b19zaWcgPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhyZW1vdmVfdHdvX3RhYmxlLCBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZ190bz0iZGVzZXEiLCBwPTAuMSwgbGZjPTAuNikKCnJlbW92ZV90d29fZGVfc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfdHdvX2ZpbHQsIG1vZGVsX2JhdGNoPSJzdmFzZXEiLCBwYXJhbGxlbD1GQUxTRSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVvbmVfc3Zhc2VxX2NvbnRyLXZ7dmVyfS54bHN4IikKcmVtb3ZlX3R3b190YWJsZV9zdmEgPC0gY29tYmluZV9kZV90YWJsZXMocmVtb3ZlX3R3b19kZV9zdmEsIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnM9a2VlcGVyc19pbmYpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVvbmVfc3Zhc2VxX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV90d29fc2lnX3N2YSA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHJlbW92ZV90d29fdGFibGVfc3ZhLCBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIGxmYz0wLjYpCmBgYAoKIyMgSW50ZXJhY3Rpb24gbW9kZWwocykKClRyeSBidWlsZGluZyBhIGRvbm9yKnN0YXRlIGludGVyYWN0aW9uIG1vZGVsLgoKSSB0aGluayBJIHJlYWxpemVkIG15IGNvbmZ1c2lvbiBpbiB0aGlzOiB0aGUgb25seSBpbnRlcmFjdGlvbiBtb2RlbHMgSSBoYXZlIHVzZWQgYmVmb3JlIHdlcmUgYQpleHBlcmltZW50YWwgZmFjdG9yKmV4cGVyaW1lbnRhbCBmbG9hdGluZy1wb2ludCBvYnNlcnZhdGlvbi4gIElmIGl0IGlzIHRoZSBjYXNlLCB0aGF0IHRoZSBmb2xsb3dpbmcKbW9kZWxzIGFyZSBhbGwgeCB2cy4gZmFjdG9yX3JlZmVyZW5jZSwgdGhlbiBJIGd1ZXNzIGl0IG1ha2VzIHNlbnNlOyBidXQgaWYgbm90LCB0aGVuIEkgaGF2ZSBubwpjbHVlIHdoYXQgaXMgZ29pbmcgb24gaW4gdGhlc2UuCgojIyMgTW9kZWwgbWF0cmljZXMKCkZpcnN0IG1ha2Ugc3VyZSB0aGF0IHNlbGYtaGVhbGluZyBpcyB0aGUgcmVmZXJlbmNlLgoKVGhlbiBtYWtlIHNvbWUgZGVzaWducyBvZiBwb3RlbnRpYWwgaW50ZXJlc3QuCgpgYGB7ciBtYWtlX21vZGVsc30KZGF0YSA8LSBlZGdlUjo6REdFTGlzdChleHBycyhoc19pbmZfZmlsdCkpCmRhdGEgPC0gZWRnZVI6OmNhbGNOb3JtRmFjdG9ycyhkYXRhKQpkZXNpZ24gPC0gcERhdGEoaHNfaW5mX2ZpbHQpCgpkZXNpZ25bWyJjb25kaXRpb24iXV0gPC0gcmVsZXZlbChkZXNpZ25bWyJjb25kaXRpb24iXV0sIHJlZj0ic2giKQpkZXNpZ25bWyJkb25vciJdXSA8LSBhcy5mYWN0b3IoZGVzaWduW1siZG9ub3IiXV0pCmRlc2lnbltbImRvbm9yIl1dIDwtIHJlbGV2ZWwoZGVzaWduW1siZG9ub3IiXV0sIHJlZj0iZDEwNyIpCgpjaHNoIDwtIG1vZGVsLm1hdHJpeChvYmplY3Q9fjArY29uZGl0aW9uLCBkYXRhPWRlc2lnbikKaGVhZChjaHNoKSAjIyBMb29rcyBnb29kIHRvIG1lLgpkb25vcnMgPC0gbW9kZWwubWF0cml4KG9iamVjdD1+MCtkb25vciwgZGF0YT1kZXNpZ24pCmhlYWQoZG9ub3JzKQoKY29uZF9kb25vcl9pbnRlciA8LSBtb2RlbC5tYXRyaXgob2JqZWN0PX4wK2NvbmRpdGlvbitkb25vcitjb25kaXRpb246ZG9ub3IsIGRhdGE9ZGVzaWduKQpoZWFkKGNvbmRfZG9ub3JfaW50ZXIpCiMjIFdoeSBhcmUgdGhlcmUgbm8gY29uZGl0aW9uY2hyOmRvbm9yMTA3IGNvbmRpdGlvbnNoOmRvbm9yMTA3IGNvbHVtbnM/CiMjIEkga25vdyB0aGF0IGlmIEkgcmVsZXZlbCB0aGUgZG9ub3IgZmFjdG9yIHRvIHNldCB0aGUgcmVmZXJlbmNlIHRvIGFub3RoZXIgZG9ub3IsIHRoYXQgY2hhbmdlcwojIyBidXQgdGhpcyBzdGlsbCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIG1lLgoKIyMgSSB0aGluayB0aGUgYWJvdmUgbW9kZWwgc2hvdWxkIGJlIHRoZSBzYW1lIGFzOgpjb25kX2Rvbm9yX2ludGVydjIgPC0gbW9kZWwubWF0cml4KG9iamVjdD1+MCtjb25kaXRpb24qZG9ub3IsIGRhdGE9ZGVzaWduKQpoZWFkKGNvbmRfZG9ub3JfaW50ZXJ2MikKdGVzdHRoYXQ6OmV4cGVjdF9lcXVhbChjb25kX2Rvbm9yX2ludGVyLCBjb25kX2Rvbm9yX2ludGVydjIpCgojIyBTbyBhcyBJIHVuZGVyc3RhbmQgaXQsIGlmIEkgZG8gYSB0ZXN0IG9mIGNvZWY9J2NvbmRpdGlvbmNocicsIHRoaXMgaXMgbG9va2luZyBhdAojIyBjaHIgdnMuIHNoCiMjIElmIEkgZG8gY29lZj0nY29uZGl0aW9uY2hyOmRvbm9yMTEwJyB0aGlzIGlzIHRoZSBkb25vciBlZmZlY3QgZm9yIGNoci9zaCBmb3IgZG9ub3IxMTA/CiMjIElmIHRoaXMgaXMgdHJ1ZSwgdGhlbiBob3cgZG8gSSBnZXQgdGhpcyBmb3IgZG9ub3IxMDc/CiMjIFBlcmhhcHMgbXkgdW5kZXJzdGFuZGluZyBpcyBiYWNrd2FyZHM/Cgpkb25vcl9jb25kX2ludGVyIDwtIG1vZGVsLm1hdHJpeChvYmplY3Q9fmRvbm9yK2NvbmRpdGlvbitkb25vcjpjb25kaXRpb24sIGRhdGE9ZGVzaWduKQpkb25vcl9jb25kX2ludGVydjIgPC0gbW9kZWwubWF0cml4KG9iamVjdD1+ZG9ub3IqY29uZGl0aW9uLCBkYXRhPWRlc2lnbikKdGVzdHRoYXQ6OmV4cGVjdF9lcXVhbChkb25vcl9jb25kX2ludGVyLCBkb25vcl9jb25kX2ludGVydjIpCmhlYWQoZG9ub3JfY29uZF9pbnRlcikKYGBgCgojIyMgTGltbWEgaW1wbGVtZW50YXRpb24KCmBgYHtyIGludGVyYWN0aW9uX3Rlc3R9CnZvb20gPC0gbGltbWE6OnZvb20oY291bnRzPWRhdGEsIGRlc2lnbj1jb25kX2Rvbm9yX2ludGVyLAogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZS5tZXRob2Q9InF1YW50IiwgcGxvdD1UUlVFKQpmaXR0ZWQgPC0gbGltbWE6OmxtRml0KG9iamVjdD12b29tLCBkZXNpZ249Y29uZF9kb25vcl9pbnRlcikKYmF5ZXMgPC0gbGltbWE6OmVCYXllcyhmaXR0ZWQpCnJlc3VsdCA8LSB0b3BUYWJsZShiYXllcykKYGBgCgojIyMgZWRnZVIgaW1wbGVtZW50YXRpb24KCmBgYHtyIGludGVyYWN0aW9uX2VkZ2VyfQpkaXNwIDwtIGVkZ2VSOjplc3RpbWF0ZURpc3AoZGF0YSwgZGVzaWduPWNvbmRfZG9ub3JfaW50ZXIpCmZpdCA8LSBlZGdlUjo6Z2xtUUxGaXQoZGlzcCwgY29uZF9kb25vcl9pbnRlcikKCiMjIEkgdGhpbmsgdGhpcyBpcyBteSBnbG9iYWwgY2hyL3NoCmNocl9zaF9xbGYgPC0gZWRnZVI6OmdsbVFMRlRlc3QoZml0LCBjb2VmPSJjb25kaXRpb25jaHIiKQpjaHJfc2hfcmVzdWx0IDwtIGVkZ2VSOjp0b3BUYWdzKGNocl9zaF9xbGYpCnN1bW1hcnkoY2hyX3NoX3Jlc3VsdCR0YWJsZSkKCiMjIFRoaXMgc2hvdWxkIGJlIHRoZSBpbnRlcmFjdGlvbiBmb3IgY2hyL3NoIGFuZCBkb25vcjExMC4KY29sbmFtZXMoY29uZF9kb25vcl9pbnRlcilbNV0KZDExMF9jaF9xbGYgPC0gZWRnZVI6OmdsbVFMRlRlc3QoZml0LCBjb2VmPSJjb25kaXRpb25jaHI6ZG9ub3JkMTEwIikKZDExMF9jaF9yZXN1bHQgPC0gZWRnZVI6OnRvcFRhZ3MoZDExMF9jaF9xbGYpCnN1bW1hcnkoZDExMF9jaF9yZXN1bHQkdGFibGUpCmBgYAoKIyMjIERFU2VxMiBpbXBsZW1lbnRhdGlvbgoKYGBge3IgaW50ZXJhY3Rpb25fZGVzZXF9CnN1bW1hcml6ZWQgPC0gREVTZXEyOjpERVNlcURhdGFTZXRGcm9tTWF0cml4KGNvdW50RGF0YT1leHBycyhoc19pbmZfZmlsdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGE9ZGVzaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ249fmNvbmRpdGlvbipkb25vcikKZGF0YXNldCA8LSBERVNlcTI6OkRFU2VxRGF0YVNldChzZT1zdW1tYXJpemVkLCBkZXNpZ249fmNvbmRpdGlvbipkb25vcikKcnVuIDwtIERFU2VxMjo6REVTZXEoZGF0YXNldCkKREVTZXEyOjpyZXN1bHRzTmFtZXMocnVuKQpyZXNfY2hyX3NoIDwtIERFU2VxMjo6cmVzdWx0cyhydW4sIG5hbWU9ImNvbmRpdGlvbl9jaHJfdnNfc2giKQpzdW1tYXJ5KHJlc19jaHJfc2gpCmhlYWQocmVzX2Nocl9zaCkKCiMjIE1heWJlIG15IHRoaW5raW5nIGlzIGp1c3QgYSBsaXR0bGUgd3Jvbmc6IGlzIHRoaXMgdGhlIGludGVyYWN0aW9uIG9mIGNoci9zaCB3aXRoIGQxMTAvZDEwNz8KIyMgVGhhdCB3b3VsZCBtYWtlIG1vcmUgc2Vuc2UgSSB0aGluay4KcmVzX2Rvbm9yMTEwX2NocnNoIDwtIERFU2VxMjo6cmVzdWx0cyhydW4sIG5hbWU9ImNvbmRpdGlvbmNoci5kb25vcmQxMTAiKQpzdW1tYXJ5KHJlc19kb25vcjExMF9jaHJzaCkKaGVhZChyZXNfZG9ub3IxMTBfY2hyc2gpCgpyZXNfZG9ub3IxMDhfY2hyc2ggPC0gREVTZXEyOjpyZXN1bHRzKHJ1biwgbmFtZT0iY29uZGl0aW9uY2hyLmRvbm9yZDEwOCIpCnN1bW1hcnkocmVzX2Rvbm9yMTEwX2NocnNoKQpoZWFkKHJlc19kb25vcjExMF9jaHJzaCkKCnJlc19kb25vcjExMF92c18xMDcgPC0gREVTZXEyOjpyZXN1bHRzKHJ1biwgbmFtZT0iZG9ub3JfZDExMF92c19kMTA3IikKc3VtbWFyeShyZXNfZG9ub3IxMTBfdnNfMTA3KQpoZWFkKHJlc19kb25vcjExMF92c18xMDcpCmBgYAoKIyMgUEMgbG9hZGluZ3MKCmBgYHtyIHBjX2xvYWRpbmd9CnNjb3JlcyA8LSBwY2FfaGlnaHNjb3Jlcyhoc19pbmZfZmlsdCwgbj01MCkKc2NvcmVzJHBjYV9oaXN0CnNjb3JlcyRoaWdoZXN0WywgMToyXQphbm5vdCA8LSBmRGF0YShoc19pbmZfZmlsdCkKCmNvbXAxX2dlbmVzIDwtIHVubGlzdChzdHJzcGxpdCh4PWFzLmNoYXJhY3RlcihzY29yZXMkaGlnaGVzdFssIDFdKSwgc3BsaXQ9IjoiKSkKaWR4IDwtIGdyZXAocGF0dGVybj0iXkVOU0ciLCB4PWNvbXAxX2dlbmVzKQpjb21wMV9nZW5lcyA8LSBjb21wMV9nZW5lc1tpZHhdCmNvbXAxX2hpZ2hfc2NvcmVzIDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChoc19pbmZfZmlsdCwgaWRzPWNvbXAxX2dlbmVzLCBtZXRob2Q9ImtlZXAiKQpwbG90X3NhbXBsZV9oZWF0bWFwKAogIGRhdGE9c20obm9ybWFsaXplX2V4cHQoY29tcDFfaGlnaF9zY29yZXMsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IikpLAogIHJvd19sYWJlbD1OVUxMKQprbml0cjo6a2FibGUoYW5ub3RbY29tcDFfZ2VuZXMsIGMoImVuc2VtYmxfZ2VuZV9pZCIsICJkZXNjcmlwdGlvbiIpXSkKCmNvbXAyX2dlbmVzIDwtIHVubGlzdChzdHJzcGxpdCh4PWFzLmNoYXJhY3RlcihzY29yZXMkaGlnaGVzdFssIDJdKSwgc3BsaXQ9IjoiKSkKaWR4IDwtIGdyZXAocGF0dGVybj0iXkVOU0ciLCB4PWNvbXAyX2dlbmVzKQpjb21wMl9nZW5lcyA8LSBjb21wMl9nZW5lc1tpZHhdCmNvbXAyX2hpZ2hfc2NvcmVzIDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChoc19pbmZfZmlsdCwgaWRzPWNvbXAyX2dlbmVzLCBtZXRob2Q9ImtlZXAiKQpwbG90X3NhbXBsZV9oZWF0bWFwKAogIGRhdGE9c20obm9ybWFsaXplX2V4cHQoY29tcDJfaGlnaF9zY29yZXMsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IikpLAogIHJvd19sYWJlbD1OVUxMKQprbml0cjo6a2FibGUoYW5ub3RbY29tcDJfZ2VuZXMsIGMoImVuc2VtYmxfZ2VuZV9pZCIsICJkZXNjcmlwdGlvbiIpXSkKCmNvbXAzX2dlbmVzIDwtIHVubGlzdChzdHJzcGxpdCh4PWFzLmNoYXJhY3RlcihzY29yZXMkaGlnaGVzdFssIDNdKSwgc3BsaXQ9IjoiKSkKaWR4IDwtIGdyZXAocGF0dGVybj0iXkVOU0ciLCB4PWNvbXAzX2dlbmVzKQpjb21wM19nZW5lcyA8LSBjb21wM19nZW5lc1tpZHhdCmNvbXAzX2hpZ2hfc2NvcmVzIDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChoc19pbmZfZmlsdCwgaWRzPWNvbXAzX2dlbmVzLCBtZXRob2Q9ImtlZXAiKQpwbG90X3NhbXBsZV9oZWF0bWFwKAogIGRhdGE9c20obm9ybWFsaXplX2V4cHQoY29tcDNfaGlnaF9zY29yZXMsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IikpLAogIHJvd19sYWJlbD1OVUxMKQprbml0cjo6a2FibGUoYW5ub3RbY29tcDNfZ2VuZXMsIGMoImVuc2VtYmxfZ2VuZV9pZCIsICJkZXNjcmlwdGlvbiIpXSkKYGBgCgojIyMgU2hlbmFuaWdhbnMKCmBgYHtyIGhzX3NoZW5hbmlnYW5zfQp0ZXN0IDwtIGNyZWF0ZV9leHB0KG1ldGFkYXRhPSJzYW1wbGVfc2hlZXRzL3BibWNfc2FtcGxlcy1tYW51YWxfc3dpdGNoLnhsc3giLAogICAgICAgICAgICAgICAgICAgIGZpbGVfY29sdW1uPSJodW1hbmZpbGUiKQp0ZXN0IDwtIHN1YnNldF9leHB0KHRlc3QsIHN1YnNldD0iY29uZGl0aW9uIT0ndW5pbmYnIikKdGVzdF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KHRlc3QsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFLCBub3JtPSJxdWFudCIpCnBsb3RfcGNhKHRlc3Rfbm9ybSkkcGxvdAoKdGVzdF9iYXRjaCA8LSBub3JtYWxpemVfZXhwdCh0ZXN0LCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtPSJxdWFudCIsIGJhdGNoPSJydXZnIikKcGxvdF9wY2EodGVzdF9iYXRjaCkkcGxvdAoKc2NvcmVzIDwtIHBjYV9oaWdoc2NvcmVzKHRlc3RfYmF0Y2gsIG49NTApCnNjb3JlcyRwY2FfaGlzdApzY29yZXMkaGlnaGVzdFssIDE6Ml0KYW5ub3QgPC0gZkRhdGEoaHNfaW5mX2ZpbHQpCmNvbXAxX2dlbmVzIDwtIHVubGlzdChzdHJzcGxpdCh4PWFzLmNoYXJhY3RlcihzY29yZXMkaGlnaGVzdFssIDFdKSwgc3BsaXQ9IjoiKSkKaWR4IDwtIGdyZXAocGF0dGVybj0iXkVOU0ciLCB4PWNvbXAxX2dlbmVzKQpjb21wMV9nZW5lcyA8LSBjb21wMV9nZW5lc1tpZHhdCmNvbXAxX2hpZ2hfc2NvcmVzIDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdCh0ZXN0X2JhdGNoLCBpZHM9Y29tcDFfZ2VuZXMsIG1ldGhvZD0ia2VlcCIpCnBsb3Rfc2FtcGxlX2hlYXRtYXAoCiAgZGF0YT1zbShub3JtYWxpemVfZXhwdChjb21wMV9oaWdoX3Njb3JlcywgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiKSksCiAgcm93X2xhYmVsPU5VTEwpCmtuaXRyOjprYWJsZShhbm5vdFtjb21wMV9nZW5lcywgYygiZW5zZW1ibF9nZW5lX2lkIiwgImRlc2NyaXB0aW9uIildKQoKdGVzdF9maWx0IDwtIG5vcm1hbGl6ZV9leHB0KHRlc3QsIGZpbHRlcj1UUlVFKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3Rfc3dpdGNob25lX2NvbnRyLXZ7dmVyfS54bHN4IikKdGVzdF9kZSA8LSBhbGxfcGFpcndpc2UodGVzdF9maWx0LCBtb2RlbF9iYXRjaD1UUlVFLCBwYXJhbGxlbD1GQUxTRSkKdGVzdF9wbG90cyA8LSBleHRyYWN0X2RlX3Bsb3RzKHRlc3RfZGUpCnRlc3RfdGFibGUgPC0gY29tYmluZV9kZV90YWJsZXModGVzdF9kZSwgZXhjZWw9ZXhjZWxfZmlsZSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X3N3aXRjaG9uZV9zaWctdnt2ZXJ9Lnhsc3giKQp0ZXN0X3NpZyA8LSBleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHRlc3RfdGFibGUsIGFjY29yZGluZ190bz0iZGVzZXEiLCBwPTAuMDUsIGV4Y2VsPWV4Y2VsX2ZpbGUpCmhlYWQodGVzdF9zaWckZGVzZXEkdXBzW1sxXV0pCnRlc3RfbWEgPC0gZXh0cmFjdF9kZV9wbG90cyh0ZXN0X2RlLCBwPTAuMSkkbWEkcGxvdAp0ZXN0X21hCnBsb3RfaGlzdG9ncmFtKHRlc3RfdGFibGVbWyJkYXRhIl1dW1sic2hfdnNfY2hyIl1dWywgYygiZGVzZXFfcCIpXSkKCnF1ZXJ5IDwtIHRlc3RfdGFibGUkZGF0YVtbMV1dWywgImRlc2VxX3AiXQpgYGAKCiMjIE5vLWJhdGNoIGRhdGEKCkluIHRoZSBmb2xsb3dpbmcgYmxvY2ssIEkgd2lsbCB0YWtlIHRoZSBjb21wYXJpc29ucyBwZXJmb3JtZWQgd2l0aG91dCBhbnkgYmF0Y2gKaW4gdGhlIG1vZGVsL2FkanVzdG1lbnQgYW5kIHVzZSB0aGVtIHRvIHNlYXJjaCBmb3Igc2hhcmVkL3VuaXF1ZSBnZW5lcyBhbW9uZyB0aGUKc2VsZi1oZWFsaW5nIHZzLiB1bmluZmVjdGVkIGFuZCB0aGUgY2hyb25pYyB2cy4gdW5pbmZlY3RlZC4KCiMjIyBSZXZpZXcgbm9iYXRjaCBwY2EKCmBgYHtyIHJldmlld19ub2JhdGNofQpoc19wYWlyd2lzZV9ub2JhdGNoX3BjYSA8LSBzbShwbG90X3BjYShoc19pbmZfZmlsdCwgY29udmVydD0iY3BtIiwgdHJhbnNmb3JtPSJsb2cyIikpCmhzX3BhaXJ3aXNlX25vYmF0Y2hfcGNhJHBsb3QKYGBgCgpgYGB7ciB0ZXN0X2Nocl9zaDAxLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX3BhaXJ3aXNlX25vYmF0Y2ggPC0gc20oYWxsX3BhaXJ3aXNlKGhzX3VuaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPUZBTFNFLCBwYXJhbGxlbD1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fZWJzZXE9RkFMU0UpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3Rfbm9iYXRjaF9jb250ci12e3Zlcn0ueGxzeCIpCmhzX2NvbWJpbmVkX25vYmF0Y2ggPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgaHNfcGFpcndpc2Vfbm9iYXRjaCwKICBleGNlbD1leGNlbF9maWxlLAogIGtlZXBlcnM9a2VlcGVycykpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9ub2JhdGNoX3NpZy12e3Zlcn0ueGxzeCIpCmhzX3NpZ19ub2JhdGNoIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgaHNfY29tYmluZWRfbm9iYXRjaCwKICBleGNlbD1leGNlbF9maWxlKSkKaHNfc2lnX25vYmF0Y2gkZGVzZXEkY291bnRzCmBgYAoKYGBge3IgcGxvdF90ZXN0X2Nocl9zaDAxfQpsaW1tYV9kZXNlcV9vcmRlciA8LSByYW5rX29yZGVyX3NjYXR0ZXIoCiAgaHNfcGFpcndpc2Vfbm9iYXRjaCwKICBmaXJzdF90eXBlPSJsaW1tYSIsIHNlY29uZF90eXBlPSJkZXNlcSIsCiAgZmlyc3RfdGFibGU9MSwgc2Vjb25kX3RhYmxlPTEpCmxpbW1hX2Rlc2VxX29yZGVyJHBsb3QKdXBfbHN0IDwtIGxpc3QoCiAgInNoX3VwIiA9IHJvd25hbWVzKGhzX3NpZ19ub2JhdGNoW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJzaF9uaWwiXV0pLAogICJjaF91cCIgPSByb3duYW1lcyhoc19zaWdfbm9iYXRjaFtbImRlc2VxIl1dW1sidXBzIl1dW1siY2hfbmlsIl1dKSkKbm9iYXRjaF91cF92ZW5uIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz11cF9sc3QpClZlbm5lcmFibGU6OnBsb3Qobm9iYXRjaF91cF92ZW5uLCBkb1dlaWdodHM9RkFMU0UpCgojIyBNYXJpYS1BZGVsYWlkYSBhbmQgTmFqaWIgYXNrZWQgYWJvdXQgY29tcGFyaW5nIHRoZSBmb2xsb3dpbmcgcGFpciBvZiBkYXRhIGFnYWluc3QKIyMgVGhlIGludGVyc2VjdGlvbiBvZiBhIGJ1bmNoIG9mIHN0dWZmIGxhdGVyLi4uICBTbyBkb24ndCBmb3JnZXQgdGhpcyEKIyMgVGhpcyBnaXZlcyBtZSB0aGUgZ2VuZXMgb25seSB1cCBpbiBzZWxmIHZzLiBuaWwKbm9iYXRjaF91cF9zaF9zb2xvIDwtIG5vYmF0Y2hfdXBfdmVubkBJbnRlcnNlY3Rpb25TZXRzW1siMTAiXV0KIyMgYW5kIGNoIHZzIG5pbApub2JhdGNoX3VwX2NoX3NvbG8gPC0gbm9iYXRjaF91cF92ZW5uQEludGVyc2VjdGlvblNldHNbWyIwMSJdXQoKZG93bl9sc3QgPC0gbGlzdCgKICAic2hfZG93biIgPSByb3duYW1lcyhoc19zaWdfbm9iYXRjaFtbImRlc2VxIl1dW1siZG93bnMiXV1bWyJzaF9uaWwiXV0pLAogICJjaF9kb3duIiA9IHJvd25hbWVzKGhzX3NpZ19ub2JhdGNoW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImNoX25pbCJdXSkpCm5vYmF0Y2hfZG93bl92ZW5uIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz1kb3duX2xzdCkKVmVubmVyYWJsZTo6cGxvdChub2JhdGNoX2Rvd25fdmVubiwgZG9XZWlnaHRzPUZBTFNFKQpgYGAKCiMjIEFkZCBwYXRpZW50IHRvIHRoZSBtb2RlbAoKUmVwZWF0IHRoZSBwcmV2aW91cyBzZXQgb2YgYW5hbHlzZXMgd2l0aCBkMTA3LzEwOC8xMTAgaW4gdGhlIG1vZGVsLgoKIyMjIFJldmlldyBwY2EKCmBgYHtyIHJldmlld19iYXRjaH0KaHNfcGFpcndpc2VfYmF0Y2hfcGNhIDwtIHNtKHBsb3RfcGNhKGhzX2luZl9maWx0LCBiYXRjaD0ibGltbWEiLCBjb252ZXJ0PSJjcG0iLCB0cmFuc2Zvcm09ImxvZzIiKSkKaHNfcGFpcndpc2VfYmF0Y2hfcGNhJHBsb3QKYGBgCgpgYGB7ciB0ZXN0X2Nocl9zaDAyLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX3BhaXJ3aXNlX2JhdGNoIDwtIHNtKGFsbF9wYWlyd2lzZShoc191bmluZl9maWx0LCBwYXJhbGxlbD1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2JhdGNoPVRSVUUsIGRvX2Vic2VxPUZBTFNFKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X3BhdGJhdGNoX2NvbnRyLXZ7dmVyfS54bHN4IikKaHNfY29tYmluZWRfYmF0Y2ggPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgaHNfcGFpcndpc2VfYmF0Y2gsCiAgZXhjZWw9ZXhjZWxfZmlsZSwKICBrZWVwZXJzPWtlZXBlcnMpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfcGF0YmF0Y2hfc2lnLXZ7dmVyfS54bHN4IikKaHNfc2lnX2JhdGNoIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgaHNfY29tYmluZWRfYmF0Y2gsCiAgZXhjZWw9ZXhjZWxfZmlsZSkpCmhzX3NpZ19iYXRjaFtbImRlc2VxIl1dW1siY291bnRzIl1dCmBgYAoKYGBge3IgcGxvdF90ZXN0X2NoYXJfc2gwMn0KdXBfbHN0IDwtIGxpc3QoCiAgInNoX3VwIiA9IHJvd25hbWVzKGhzX3NpZ19iYXRjaFtbImRlc2VxIl1dW1sidXBzIl1dW1sic2hfbmlsIl1dKSwKICAiY2hfdXAiID0gcm93bmFtZXMoaHNfc2lnX2JhdGNoW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJjaF9uaWwiXV0pKQpiYXRjaF91cF92ZW5uIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz11cF9sc3QpCnN1bW1hcnkoYmF0Y2hfdXBfdmVubkBJbnRlcnNlY3Rpb25TZXRzKQpWZW5uZXJhYmxlOjpwbG90KGJhdGNoX3VwX3Zlbm4sIGRvV2VpZ2h0cz1GQUxTRSkKZG93bl9sc3QgPC0gbGlzdCgKICAic2hfZG93biIgPSByb3duYW1lcyhoc19zaWdfYmF0Y2hbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sic2hfbmlsIl1dKSwKICAiY2hfZG93biIgPSByb3duYW1lcyhoc19zaWdfYmF0Y2hbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siY2hfbmlsIl1dKSkKYmF0Y2hfZG93bl92ZW5uIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz1kb3duX2xzdCkKVmVubmVyYWJsZTo6cGxvdChiYXRjaF9kb3duX3Zlbm4sIGRvV2VpZ2h0cz1GQUxTRSkKc3VtbWFyeShiYXRjaF9kb3duX3Zlbm5ASW50ZXJzZWN0aW9uU2V0cykKCnNpbWlsYXIgPC0gY29tcGFyZV9kZV9yZXN1bHRzKGhzX2NvbWJpbmVkX25vYmF0Y2gsIGhzX2NvbWJpbmVkX2JhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JfbWV0aG9kPSJzcGVhcm1hbiIpCnNpbWlsYXJbWyJyZXN1bHQiXV1bWyJkZXNlcSJdXQpgYGAKCiMjIFdyaXRlIGFuIGV4Y2VsIHdvcmtib29rIHVzaW5nIHRoZSBiYXRjaCBkYXRhLgoKVGhlIGZvbGxvd2luZyBibG9jayB3cml0ZXMgb3V0IHRoZSB1bmlxdWUvc2hhcmVkIGdlbmVzIG9ic2VydmVkIGFtb25nIHRoZQpjb250cmFzdHMgd2hpY2ggaW5jbHVkZWQgZG9ub3IgaW4gdGhlIG1vZGVsLgoKYGBge3IgY2hzaF92ZW5uMDJ9CmtlcHRfY29sdW1ucyA8LSBjKCJlbnNlbWJsdHJhbnNjcmlwdGlkIiwgImVuc2VtYmxnZW5laWQiLCAiZGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAiZGVzZXFfbG9nZmMiLCAiZGVzZXFfYWRqcCIpCnN0YXJ0X2RhdGEgPC0gaHNfc2lnX2JhdGNoW1siZGVzZXEiXV0Kc2hfdXBfc29sb19nZW5lcyA8LSBiYXRjaF91cF92ZW5uQEludGVyc2VjdGlvblNldHNbWyIxMCJdXQpjaF91cF9zb2xvX2dlbmVzIDwtIGJhdGNoX3VwX3Zlbm5ASW50ZXJzZWN0aW9uU2V0c1tbIjAxIl1dCnNoY2hfdXBfc2hhcmVkX2dlbmVzIDwtIGJhdGNoX3VwX3Zlbm5ASW50ZXJzZWN0aW9uU2V0c1tbIjExIl1dCnNoX2Rvd25fc29sb19nZW5lcyA8LSBiYXRjaF9kb3duX3Zlbm5ASW50ZXJzZWN0aW9uU2V0c1tbIjEwIl1dCmNoX2Rvd25fc29sb19nZW5lcyA8LSBiYXRjaF9kb3duX3Zlbm5ASW50ZXJzZWN0aW9uU2V0c1tbIjAxIl1dCnNoY2hfZG93bl9zaGFyZWRfZ2VuZXMgPC0gYmF0Y2hfZG93bl92ZW5uQEludGVyc2VjdGlvblNldHNbWyIxMSJdXQoKeGxzX3Jlc3VsdCA8LSB3cml0ZV94bHMoCiAgZGF0YT1zdGFydF9kYXRhW1sidXBzIl1dW1sic2hfbmlsIl1dW3NoX3VwX3NvbG9fZ2VuZXMsIGtlcHRfY29sdW1uc10sCiAgc2hlZXQ9InNoX3VwX3NvbG8iKQp4bHNfcmVzdWx0IDwtIHdyaXRlX3hscygKICBkYXRhPXN0YXJ0X2RhdGFbWyJ1cHMiXV1bWyJjaF9uaWwiXV1bY2hfdXBfc29sb19nZW5lcywga2VwdF9jb2x1bW5zXSwKICBzaGVldD0iY2hfdXBfc29sbyIsIHdiPXhsc19yZXN1bHRbWyJ3b3JrYm9vayJdXSkKeGxzX3Jlc3VsdCA8LSB3cml0ZV94bHMoCiAgZGF0YT1zdGFydF9kYXRhW1sidXBzIl1dW1siY2hfbmlsIl1dW3NoY2hfdXBfc2hhcmVkX2dlbmVzLCBrZXB0X2NvbHVtbnNdLAogIHNoZWV0PSJzaGNoX3VwX3NoYXJlZCIsIHdiPXhsc19yZXN1bHRbWyJ3b3JrYm9vayJdXSkKeGxzX3Jlc3VsdCA8LSB3cml0ZV94bHMoCiAgZGF0YT1zdGFydF9kYXRhW1siZG93bnMiXV1bWyJzaF9uaWwiXV1bc2hfZG93bl9zb2xvX2dlbmVzLCBrZXB0X2NvbHVtbnNdLAogIHNoZWV0PSJzaF9kb3duX3NvbG8iKQp4bHNfcmVzdWx0IDwtIHdyaXRlX3hscygKICBkYXRhPXN0YXJ0X2RhdGFbWyJkb3ducyJdXVtbImNoX25pbCJdXVtjaF9kb3duX3NvbG9fZ2VuZXMsIGtlcHRfY29sdW1uc10sCiAgc2hlZXQ9ImNoX2Rvd25fc29sbyIsIHdiPXhsc19yZXN1bHRbWyJ3b3JrYm9vayJdXSkKeGxzX3Jlc3VsdCA8LSB3cml0ZV94bHMoCiAgZGF0YT1zdGFydF9kYXRhW1siZG93bnMiXV1bWyJjaF9uaWwiXV1bc2hjaF9kb3duX3NoYXJlZF9nZW5lcywga2VwdF9jb2x1bW5zXSwKICBzaGVldD0ic2hjaF9kb3duX3NoYXJlZCIsIHdiPXhsc19yZXN1bHRbWyJ3b3JrYm9vayJdXSwKICBleGNlbD1wYXN0ZTAoImV4Y2VsL2ZpZ3VyZV81YV9zdHVmZi12IiwgdmVyLCAiLnhsc3giKSkKYGBgCgojIyBBZGQgc3N2YSBpbnRvIHRoZSBtaXgKClJlcGVhdCwgdGhpcyB0aW1lIGF0dG1lcHRpbmcgdG8gdGFtcCBkb3duIHRoZSB2YXJpYW5jZSBieSBwZXJzb24uCgojIyMgUmV2aWV3IHNzdmEKCmBgYHtyIHJldmlld19zc3ZhfQpoc19wYWlyd2lzZV9zc3ZhX3BjYSA8LSBzbShwbG90X3BjYShoc19pbmZfZmlsdCwgYmF0Y2g9InNzdmEiLCBub3JtPSJxdWFudCIsIHRyYW5zZm9ybT0ibG9nMiIpKQpoc19wYWlyd2lzZV9zc3ZhX3BjYSRwbG90CmBgYAoKYGBge3IgdGVzdF9jaHJfc2gwNSwgZmlnLnNob3c9ImhpZGUifQpoc19wYWlyd2lzZV9zc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShoc191bmluZl9maWx0LCBtb2RlbF9iYXRjaD0ic3N2YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsPUZBTFNFLCBkb19lYnNlcT1GQUxTRSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9mc3ZhX2NvbnRyLXZ7dmVyfS54bHN4IikKaHNfY29tYmluZWRfc3N2YSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBoc19wYWlyd2lzZV9zc3ZhLAogIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAga2VlcGVycz1rZWVwZXJzKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X2ZzdmFfc2lnLXZ7dmVyfS54bHN4IikKaHNfc2lnX3NzdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBoc19jb21iaW5lZF9zc3ZhLAogIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpoc19zaWdfc3N2YSRkZXNlcSRjb3VudHMKYGBgCgpgYGB7ciBwbG90X3Rlc3RfY2hyX3NoMDV9CnVwX2xzdCA8LSBsaXN0KAogICJzaF91cCIgPSByb3duYW1lcyhoc19zaWdfc3N2YVtbImRlc2VxIl1dW1sidXBzIl1dW1sic2hfbmlsIl1dKSwKICAiY2hfdXAiID0gcm93bmFtZXMoaHNfc2lnX3NzdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbImNoX25pbCJdXSkpCnNzdmFfdXBfdmVubiA8LSBWZW5uZXJhYmxlOjpWZW5uKFNldHM9dXBfbHN0KQpzdW1tYXJ5KHNzdmFfdXBfdmVubkBJbnRlcnNlY3Rpb25TZXRzKQpWZW5uZXJhYmxlOjpwbG90KHNzdmFfdXBfdmVubiwgZG9XZWlnaHRzPUZBTFNFKQpkb3duX2xzdCA8LSBsaXN0KAogICJzaF9kb3duIiA9IHJvd25hbWVzKGhzX3NpZ19zc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbInNoX25pbCJdXSksCiAgImNoX2Rvd24iID0gcm93bmFtZXMoaHNfc2lnX3NzdmFbWyJkZXNlcSJdXVtbImRvd25zIl1dW1siY2hfbmlsIl1dKSkKc3N2YV9kb3duX3Zlbm4gPC0gVmVubmVyYWJsZTo6VmVubihTZXRzPWRvd25fbHN0KQpWZW5uZXJhYmxlOjpwbG90KHNzdmFfZG93bl92ZW5uLCBkb1dlaWdodHM9RkFMU0UpCnN1bW1hcnkoc3N2YV9kb3duX3Zlbm5ASW50ZXJzZWN0aW9uU2V0cykKCnNpbWlsYXIgPC0gc20oY29tcGFyZV9kZV9yZXN1bHRzKGhzX2NvbWJpbmVkX25vYmF0Y2gsIGhzX2NvbWJpbmVkX3NzdmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcl9tZXRob2Q9InNwZWFybWFuIikpCnNpbWlsYXIkcmVzdWx0JGRlc2VxCnNpbWlsYXIgPC0gc20oY29tcGFyZV9kZV9yZXN1bHRzKGhzX2NvbWJpbmVkX2JhdGNoLCBoc19jb21iaW5lZF9zc3ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JfbWV0aG9kPSJzcGVhcm1hbiIpKQpzaW1pbGFyJHJlc3VsdCRkZXNlcQpgYGAKCiMjIGZzdmEKClJlcGVhdCBhZ2FpbiB1c2luZyBmc3ZhLgoKIyMjIFJldmlldyBmc3ZhCgpgYGB7ciByZXZpZXdfZnN2YX0KaHNfcGFpcndpc2VfZnN2YV9wY2EgPC0gc20ocGxvdF9wY2EoaHNfaW5mX2ZpbHQsIGJhdGNoPSJmc3ZhIiwgbm9ybT0icXVhbnQiLCB0cmFuc2Zvcm09ImxvZzIiKSkKaHNfcGFpcndpc2VfZnN2YV9wY2EkcGxvdApgYGAKCmBgYHtyIHRlc3RfY2hyX3NoMDNfZnN2YSwgZmlnLnNob3c9ImhpZGUifQpoc19wYWlyd2lzZV9mc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShoc191bmluZl9maWx0LCBtb2RlbF9iYXRjaD0iZnN2YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFsbGVsPUZBTFNFLCBkb19lYnNlcT1GQUxTRSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9mc3ZhX2NvbnRyLXZ7dmVyfS54bHN4IikKaHNfY29tYmluZWRfZnN2YSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBoc19wYWlyd2lzZV9mc3ZhLAogIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAga2VlcGVycz1rZWVwZXJzKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X2ZzdmFfc2lnLXZ7dmVyfS54bHN4IikKaHNfc2lnX2ZzdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICBoc19jb21iaW5lZF9mc3ZhLAogIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpgYGAKCmBgYHtyIHBsb3RfdGVzdF9jaHJfc2gwM19mc3ZhfQp1cF9sc3QgPC0gbGlzdCgKICAic2hfdXAiID0gcm93bmFtZXMoaHNfc2lnX2ZzdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbInNoX25pbCJdXSksCiAgImNoX3VwIiA9IHJvd25hbWVzKGhzX3NpZ19mc3ZhW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJjaF9uaWwiXV0pKQpmc3ZhX3VwX3Zlbm4gPC0gVmVubmVyYWJsZTo6VmVubihTZXRzPXVwX2xzdCkKc3VtbWFyeShmc3ZhX3VwX3Zlbm5ASW50ZXJzZWN0aW9uU2V0cykKVmVubmVyYWJsZTo6cGxvdChmc3ZhX3VwX3Zlbm4sIGRvV2VpZ2h0cz1GQUxTRSkKZG93bl9sc3QgPC0gbGlzdCgKICAic2hfZG93biIgPSByb3duYW1lcyhoc19zaWdfZnN2YVtbImRlc2VxIl1dW1siZG93bnMiXV1bWyJzaF9uaWwiXV0pLAogICJjaF9kb3duIiA9IHJvd25hbWVzKGhzX3NpZ19mc3ZhW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImNoX25pbCJdXSkpCmZzdmFfZG93bl92ZW5uIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz1kb3duX2xzdCkKVmVubmVyYWJsZTo6cGxvdChmc3ZhX2Rvd25fdmVubiwgZG9XZWlnaHRzPUZBTFNFKQpzdW1tYXJ5KGZzdmFfZG93bl92ZW5uQEludGVyc2VjdGlvblNldHMpCgojI2hzX3NpZ19mc3ZhJGRlc2VxJGNvdW50cyRjb21tb25fc29sb3NfZnN2YSA8LSBzbShzdWJzZXRfc2lnbmlmaWNhbnRzKGhzX3NpZ19mc3ZhKSkKc2ltaWxhciA8LSBzbShjb21wYXJlX2RlX3Jlc3VsdHMoaHNfY29tYmluZWRfbm9iYXRjaCwgaHNfY29tYmluZWRfZnN2YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX21ldGhvZD0ic3BlYXJtYW4iKSkKc2ltaWxhciRyZXN1bHQkZGVzZXEKc2ltaWxhciA8LSBzbShjb21wYXJlX2RlX3Jlc3VsdHMoaHNfY29tYmluZWRfc3N2YSwgaHNfY29tYmluZWRfZnN2YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX21ldGhvZD0ic3BlYXJtYW4iKSkKc2ltaWxhciRyZXN1bHQkZGVzZXEKYGBgCgojIyBUcnkgd2l0aCB0aGUgY29tYmF0IG1vZGlmaWVkIGRhdGEKClJlcGVhdCBvbmNlIGFnYWluLCB0aGlzIHRpbWUgdXNpbmcgY29tYmF0IHRvIHRyeSB0byBsaW1pdCB0aGUgY29udHJpYnV0aW9uIG9mCnRoZSBzdHJhaW4gdG8gdGhlIGRhdGEuICBJIGRvIG5vdCB0aGluayB3ZSB3aWxsIGV2ZXIgdXNlIHRoaXMgc2V0IG9mIGNvbnRyYXN0cywKc28gSSB3aWxsIGRlYWN0aXZhdGUgaXQgYnV0IGxlYXZlIGl0IGhlcmUgaWYgaXQgaXMgcmVxdWlyZWQgbGF0ZXIuCgpgYGB7ciB0ZXN0X2Nocl9zaDA0LCBmaWcuc2hvdz0iaGlkZSJ9Cm9sZF9jb25kaXRpb24gPC0gaHNfdW5pbmYkZGVzaWduJGNvbmRpdGlvbgpuYW1lcyhvbGRfY29uZGl0aW9uKSA8LSBoc191bmluZiRkZXNpZ24kc2FtcGxlaWQKbmV3X2NvbmRpdGlvbiA8LSBwYXN0ZTAoaHNfdW5pbmYkZGVzaWduJHN0YXRlLCAnXycsIGhzX3VuaW5mJGRlc2lnbiRkb25vcikKaHNfdW5pbmZfcmVjb25kIDwtIHNldF9leHB0X2ZhY3RvcnMoaHNfdW5pbmZfZmlsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InBhdGhvZ2Vuc3RyYWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uPW5ld19jb25kaXRpb24pCmNvbWJhdF9pbnB1dCA8LSBub3JtYWxpemVfZXhwdChoc191bmluZl9yZWNvbmQsIGJhdGNoPSJjb21iYXRfc2NhbGUiLCBmaWx0ZXI9VFJVRSkKY29tYmF0X2lucHV0IDwtIHNldF9leHB0X2NvbmRpdGlvbnMoY29tYmF0X2lucHV0LCBmYWN0PW9sZF9jb25kaXRpb24pCmNvbWJhdF9pbnB1dCA8LSBzZXRfZXhwdF9jb2xvcnMoY29tYmF0X2lucHV0LCBjb2xvcnM9YygiZ3JlZW4iLCJibHVlIiwicmVkIikpCmBgYAoKIyMjIFJldmlldyBjb21iYXQKCmBgYHtyIHJldmlld19jb21iYXR9CmhzX3BhaXJ3aXNlX2NvbWJhdF9wY2EgPC0gcGxvdF9wY2EoY29tYmF0X2lucHV0KQpoc19wYWlyd2lzZV9jb21iYXRfcGNhJHBsb3QKYGBgCgpgYGB7ciBwZXJmb3JtX2NvbWJhdH0KaHNfcGFpcndpc2VfY29tYmF0cGF0aCA8LSBzbShhbGxfcGFpcndpc2UoY29tYmF0X2lucHV0LCBtb2RlbF9iYXRjaD1GQUxTRSwgcGFyYWxsZWw9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPVRSVUUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfY29tYmF0cGF0aF9jb250ci12e3Zlcn0ueGxzeCIpCmhzX2NvbWJpbmVkX2NvbWJhdHBhdGggPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgaHNfcGFpcndpc2VfY29tYmF0cGF0aCwKICBleGNlbD1leGNlbF9maWxlLAogIGtlZXBlcnM9a2VlcGVycykpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9jb21iYXRwYXRoX3NpZy12e3Zlcn0ueGxzeCIpCmhzX3NpZ19jb21iYXRwYXRoIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgaHNfY29tYmluZWRfY29tYmF0cGF0aCwKICBleGNlbD1leGNlbF9maWxlKSkKaHNfc2lnX2NvbWJhdHBhdGgkZGVzZXEkY291bnRzCmBgYAoKYGBge3IgcGxvdF90ZXN0X2Nocl9zaDA0X2NvbWJhdH0KdXBfbHN0IDwtIGxpc3QoCiAgInNoX3VwIiA9IHJvd25hbWVzKGhzX3NpZ19jb21iYXRwYXRoW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJzaF9uaWwiXV0pLAogICJjaF91cCIgPSByb3duYW1lcyhoc19zaWdfY29tYmF0cGF0aFtbImRlc2VxIl1dW1sidXBzIl1dW1siY2hfbmlsIl1dKSkKY29tYmF0cGF0aF91cF92ZW5uIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz11cF9sc3QpCnN1bW1hcnkoY29tYmF0cGF0aF91cF92ZW5uQEludGVyc2VjdGlvblNldHMpClZlbm5lcmFibGU6OnBsb3QoY29tYmF0cGF0aF91cF92ZW5uLCBkb1dlaWdodHM9RkFMU0UpCmRvd25fbHN0IDwtIGxpc3QoCiAgInNoX2Rvd24iID0gcm93bmFtZXMoaHNfc2lnX2NvbWJhdHBhdGhbWyJkZXNlcSJdXVtbImRvd25zIl1dW1sic2hfbmlsIl1dKSwKICAiY2hfZG93biIgPSByb3duYW1lcyhoc19zaWdfY29tYmF0cGF0aFtbImRlc2VxIl1dW1siZG93bnMiXV1bWyJjaF9uaWwiXV0pKQpjb21iYXRwYXRoX2Rvd25fdmVubiA8LSBWZW5uZXJhYmxlOjpWZW5uKFNldHM9ZG93bl9sc3QpClZlbm5lcmFibGU6OnBsb3QoY29tYmF0cGF0aF9kb3duX3Zlbm4sIGRvV2VpZ2h0cz1GQUxTRSkKc3VtbWFyeShjb21iYXRwYXRoX2Rvd25fdmVubkBJbnRlcnNlY3Rpb25TZXRzKQoKc2ltaWxhciA8LSBzbShjb21wYXJlX2RlX3Jlc3VsdHMoaHNfY29tYmluZWRfbm9iYXRjaCwgaHNfY29tYmluZWRfY29tYmF0cGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX21ldGhvZD0ic3BlYXJtYW4iKSkKc2ltaWxhciRyZXN1bHQkZGVzZXEKc2ltaWxhciA8LSBzbShjb21wYXJlX2RlX3Jlc3VsdHMoaHNfY29tYmluZWRfZnN2YSwgaHNfY29tYmluZWRfY29tYmF0cGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX21ldGhvZD0ic3BlYXJtYW4iKSkKc2ltaWxhciRyZXN1bHQkZGVzZXEKIyMgT1VDSCEKYGBgCgojIyBDb21wYXJlIERFIHJlc3VsdHMKCkZvciBlYWNoIG9mIHRoZSBmb2xsb3dpbmcsIHBlcmZvcm0gYSBzaW1wbGUgREUgYW5kIHNlZSB3aGF0IGhhcHBlbnM6CgoxLiAgbm8gdW5pbmZlY3RlZCBzdHJhaW4gYXMgYmF0Y2gsIHRyeSB0byBjb21wYXJlIGVhY2ggb2YgdGhlIDMgcGF0aWVudHMgY2hyb25pYy9zZWxmCjIuICBubyB1bmluZmVjdGVkIHN0cmFpbiBhcyBiYXRjaCwgdHJ5IHRvIGNvbXBhcmUgY2hyb25pYy9zZWxmIGZvciBhbGwKMy4gIFJlcGVhdCAjMSBhYm92ZSB3aXRoIHVuaW5mZWN0ZWQKNC4gIFJlcGVhdCAjMiB3aXRoIHVuaW5mZWN0ZWQKCiMjIyBERTogaW5jbHVkZSB1bmluZmVjdGVkLCB1c2Ugc3RyYWluIGFzIGJhdGNoCgpUaGUgZGF0YSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgaXMgdGhlIHF1YW50aWxlKGNwbShmaWx0ZXIoKSkpIHdoZXJlIHRoZQpjb25kaXRpb24gd2FzIHNldCB0byBhIGNvbmNhdGVuYXRpb24gb2YgcGF0aWVudCBhbmQgaGVhbGluZyBzdGF0ZSwgY29tYmF0IHdhcwphbHNvIHBlcmZvcm1lZCwgc28gd2Ugbm8gbG9uZ2VyIHdhbnQgYmF0Y2ggaW4gdGhlIGV4cGVyaW1lbnRhbCBtb2RlbCBhbmQgYWxzbyB3ZQpuZWVkIHRvIHBhc3MgJ2ZvcmNlPVRSVUUnIGJlY2F1c2UgZGVzZXEvZWRnZXIgd2lsbCBuZWVkIHRvIGJlIGNvZXJjZWQgaW50bwphY2NlcHRpbmcgdGhlc2UgbW9kaWZpZWQgZGF0YS4KCmBgYHtyIGRlX2NvbXBhcmlzb25zLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX2luZiRjb25kaXRpb24KIyMgU3RhcnQgYnkgbGVhdmluZyB0aGUgZGF0YSByZWxhdGl2ZWx5IGFsb25lLCBlc3BlY2lhbGx5IG5vdGluZyB0aGF0IHdlIGRvIG5vdAojIyBoYXZlIGEgdXNhYmxlIGJhdGNoIGJ5IGRlZmF1bHQuCmhzX3VuaW5mX2ZpbHR2MiA8LSBoc191bmluZl9maWx0CmRvbm9yX3N0YXRlIDwtIHBhc3RlMChoc191bmluZl9maWx0djIkZGVzaWduJHN0YXRlLCAiXyIsIGhzX3VuaW5mX2ZpbHR2MiRkZXNpZ24kZG9ub3IpCmhzX3VuaW5mX2ZpbHR2MiA8LSBzZXRfZXhwdF9mYWN0b3JzKGhzX3VuaW5mX2ZpbHR2MiwgY29uZGl0aW9uPWRvbm9yX3N0YXRlKQoKdW5pbmZfcGF0aWVudF9rZWVwZXJzIDwtIGxpc3QoCiAgICAiZDEwN19jaHVuIiA9IGMoImNocm9uaWNfZDEwNyIsICJ1bmluZmVjdGVkX2QxMDciKSwKICAgICJkMTA3X3NodW4iID0gYygic2VsZl9oZWFsX2QxMDciLCAidW5pbmZlY3RlZF9kMTA3IiksCiAgICAiZDEwN19jaHNoIiA9IGMoImNocm9uaWNfZDEwNyIsICJzZWxmX2hlYWxfZDEwNyIpLAogICAgImQxMDhfY2h1biIgPSBjKCJjaHJvbmljX2QxMDgiLCAidW5pbmZlY3RlZF9kMTA4IiksCiAgICAiZDEwOF9zaHVuIiA9IGMoInNlbGZfaGVhbF9kMTA4IiwgInVuaW5mZWN0ZWRfZDEwOCIpLAogICAgImQxMDhfY2hzaCIgPSBjKCJjaHJvbmljX2QxMDgiLCAic2VsZl9oZWFsX2QxMDgiKSwKICAgICJkMTEwX2NodW4iID0gYygiY2hyb25pY19kMTEwIiwgInVuaW5mZWN0ZWRfZDExMCIpLAogICAgImQxMTBfc2h1biIgPSBjKCJzZWxmX2hlYWxfZDExMCIsICJ1bmluZmVjdGVkX2QxMTAiKSwKICAgICJkMTEwX2Noc2giID0gYygiY2hyb25pY19kMTEwIiwgInNlbGZfaGVhbF9kMTEwIikpCgpoc191bmluZl9maWx0djJfcGFpcndpc2UgPC0gc20oYWxsX3BhaXJ3aXNlKGhzX3VuaW5mX2ZpbHR2MiwgcGFyYWxsZWw9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYmF0Y2g9RkFMU0UsIGRvX2Vic2VxPUZBTFNFKSkKaHNfdW5pbmZfZmlsdHYyX2NvbWJpbmVkIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIGhzX3VuaW5mX2ZpbHR2Ml9wYWlyd2lzZSwKICBrZWVwZXJzPXVuaW5mX3BhdGllbnRfa2VlcGVycywKICBleGNlbD1wYXN0ZTAoImV4Y2VsL2hzX2luZmVjdF9wYXRpZW50X25vYmF0Y2gtdiIsIHZlciwgIi54bHN4IikpKQpoc191bmluZl9maWx0djJfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgaHNfdW5pbmZfZmlsdHYyX2NvbWJpbmVkLCBhY2NvcmRpbmdfdG89ImRlc2VxIiwKICBleGNlbD1wYXN0ZTAoImV4Y2VsLyIsIHJ1bmRhdGUsICJoc19pbmZlY3RfcGF0aWVudF9ub2JhdGNoX3NpZy12IiwgdmVyLCAiLnhsc3giKSkpCgojI2hzX3VuaW5mX2ZpbHR2M19wYWlyd2lzZSA8LSBhbGxfcGFpcndpc2UoaHNfdW5pbmZfZmlsdHYyLCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwgc3Vycm9nYXRlcz0xKQojI2hzX3VuaW5mX2ZpbHR2M19jb21iaW5lZCA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhoc191bmluZl9maWx0djNfcGFpcndpc2UsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnM9dW5pbmZfcGF0aWVudF9rZWVwZXJzLAojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1wYXN0ZTAoImV4Y2VsL2hzX2luZmVjdF9wYXRpZW50X2ZzdmEtdiIsIHZlciwgIi54bHN4IikpKQojI2hzX3VuaW5mX2ZpbHR2M19zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhoc191bmluZl9maWx0djNfY29tYmluZWQsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPXBhc3RlMCgiZXhjZWwvaHNfaW5mZWN0X3BhdGllbnRfZnN2YV9zaWctdiIsIHZlciwgIi54bHN4IikpKQpgYGAKCiMjIE1ha2Ugc29tZSBWZW5ucwoKTm93IHdlIHdhbnQgdG8gbG9vayBhdCBpbnRlcnNlY3Rpb25zIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIGNvbnRyYXN0cyBwZXJmb3JtZWQKY29tcGFyaW5nIHRoZSBzZWxmLWhlYWxpbmcvY2hyb25pYyB2cy4gdW5pbmZlY3RlZCBmb3IgdGhlIHRocmVlIGRvbm9ycyBzZXBhcmF0ZWx5LgoKIyMjIFBlcmZvcm0gdmVubnMgb2Ygc2VsZi1oZWFsaW5nIHZzLiB1bmluZmVjdGVkCgpUaGlzIHRpbWUgZm9yIGVhY2ggb2YgdGhlIHRocmVlIGRvbm9yczogc2VsZi1oZWFsaW5nIHVwIHZzLiB1bmluZmVjdGVkLgoKYGBge3IgdmVubl91cF9kZXNlcV9zaH0KdXBfc2lnIDwtIGhzX3VuaW5mX2ZpbHR2Ml9zaWckZGVzZXEkdXBzCgojIyBEbyB0aGlzIGluIGEgd2F5IHdoaWNoIGlzIG5vdCBzdHVwaWQuLi4KY29tcF9sc3QgPC0gbGlzdCgKICAiZG9ub3JfMTA3IiA9IHJvd25hbWVzKHVwX3NpZ1tbImQxMDdfc2h1biJdXSksCiAgImRvbm9yXzEwOCIgPSByb3duYW1lcyh1cF9zaWdbWyJkMTA4X3NodW4iXV0pLAogICJkb25vcl8xMTAiID0gcm93bmFtZXModXBfc2lnW1siZDExMF9zaHVuIl1dKSkKY29tcF9zaHVuX3VwIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz1jb21wX2xzdCkKdXBfcmVzIDwtIFZlbm5lcmFibGU6OnBsb3QoY29tcF9zaHVuX3VwLCBkb1dlaWdodHM9RkFMU0UpCgpzaGFyZWRfc2h1bl91cCA8LSBjb21wX3NodW5fdXBASW50ZXJzZWN0aW9uU2V0c1tbIjExMSJdXQpkZV90YWJsZV9zaGFyZWRfdXBfc2hfZmlyc3QgPC0gaHNfdW5pbmZfZmlsdHYyX2NvbWJpbmVkW1siZGF0YSJdXVtbImQxMDdfc2h1biJdXVtzaGFyZWRfc2h1bl91cCwgXQpkZV90YWJsZV9zaGFyZWRfdXBfc2hfc2Vjb25kIDwtIGhzX3VuaW5mX2ZpbHR2Ml9jb21iaW5lZFtbImRhdGEiXV1bWyJkMTA4X3NodW4iXV1bc2hhcmVkX3NodW5fdXAsIF0KZGVfdGFibGVfc2hhcmVkX3VwX3NoX3RoaXJkIDwtIGhzX3VuaW5mX2ZpbHR2Ml9jb21iaW5lZFtbImRhdGEiXV1bWyJkMTEwX3NodW4iXV1bc2hhcmVkX3NodW5fdXAsIF0KZGVfdGFibGVfc2hhcmVkX3VwX3NoX2FsbCA8LSBtZXJnZSgKICBkZV90YWJsZV9zaGFyZWRfdXBfc2hfZmlyc3RbLCBjKCJkZXNjcmlwdGlvbiIsICJkZXNlcV9sb2dmYyIsICJkZXNlcV9hZGpwIildLAogIGRlX3RhYmxlX3NoYXJlZF91cF9zaF9zZWNvbmRbLCBjKCJkZXNlcV9sb2dmYyIsICJkZXNlcV9hZGpwIildLAogIGJ5PSJyb3cubmFtZXMiKQpkZV90YWJsZV9zaGFyZWRfdXBfc2hfYWxsIDwtIG1lcmdlKAogIGRlX3RhYmxlX3NoYXJlZF91cF9zaF9hbGwsCiAgZGVfdGFibGVfc2hhcmVkX3VwX3NoX3RoaXJkWywgYygiZGVzZXFfbG9nZmMiLCAiZGVzZXFfYWRqcCIpXSwKICBieS54PSJSb3cubmFtZXMiLCBieS55PSJyb3cubmFtZXMiKQpyb3duYW1lcyhkZV90YWJsZV9zaGFyZWRfdXBfc2hfYWxsKSA8LSBkZV90YWJsZV9zaGFyZWRfdXBfc2hfYWxsW1siUm93Lm5hbWVzIl1dCmRlX3RhYmxlX3NoYXJlZF91cF9zaF9hbGwgPC0gZGVfdGFibGVfc2hhcmVkX3VwX3NoX2FsbFssIC0xXQpjb2xuYW1lcyhkZV90YWJsZV9zaGFyZWRfdXBfc2hfYWxsKSA8LSBjKCJkZXNjcmlwdGlvbiIsICJsb2dmY18xMDciLCAiYWRqcF8xMDciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2dmY18xMDgiLCAiYWRqcF8xMDgiLCAibG9nZmNfMTEwIiwgImFkanBfMTEwIikKd3JpdGUuY3N2KGRlX3RhYmxlX3NoYXJlZF91cF9zaF9hbGwsCiAgICAgICAgICBmaWxlPXBhc3RlMCgiaW1hZ2VzLyIsIHJ1bmRhdGUsICJfZGVfdGFibGVfc2hhcmVkX3VwX3NoX2FsbC5jc3YiKSkKYGBgCgojIyMgUGVyZm9ybSB2ZW5ucyBvZiBjaHJvbmljIHZzLiB1bmluZmVjdGVkCgpUaGlzIHRpbWUgZm9yIGVhY2ggb2YgdGhlIHRocmVlIGRvbm9yczogY2hyb25pYyB1cCB2cy4gdW5pbmZlY3RlZC4KCmBgYHtyIHZlbm5fdXBfZGVzZXFfY2hyfQp1cF9zaWcgPC0gaHNfdW5pbmZfZmlsdHYyX3NpZyRkZXNlcSR1cHMKY29tcF9sc3QgPC0gbGlzdCgKICAiZG9ub3JfMTA3IiA9IHJvd25hbWVzKHVwX3NpZ1tbImQxMDdfY2h1biJdXSksCiAgImRvbm9yXzEwOCIgPSByb3duYW1lcyh1cF9zaWdbWyJkMTA4X2NodW4iXV0pLAogICJkb25vcl8xMTAiID0gcm93bmFtZXModXBfc2lnW1siZDExMF9jaHVuIl1dKSkKY29tcF9jaHVuX3VwIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz1jb21wX2xzdCkKdXBfcmVzIDwtIFZlbm5lcmFibGU6OnBsb3QoY29tcF9jaHVuX3VwLCBkb1dlaWdodHM9RkFMU0UpCgpzaGFyZWRfY2h1bl91cCA8LSBjb21wX2NodW5fdXBASW50ZXJzZWN0aW9uU2V0c1tbIjExMSJdXQpkZV90YWJsZV9zaGFyZWRfdXBfY2hfZmlyc3QgPC0gaHNfdW5pbmZfZmlsdHYyX2NvbWJpbmVkW1siZGF0YSJdXVtbImQxMDdfY2h1biJdXVtzaGFyZWRfY2h1bl91cCwgXQpkZV90YWJsZV9zaGFyZWRfdXBfY2hfc2Vjb25kIDwtIGhzX3VuaW5mX2ZpbHR2Ml9jb21iaW5lZFtbImRhdGEiXV1bWyJkMTA4X2NodW4iXV1bc2hhcmVkX2NodW5fdXAsIF0KZGVfdGFibGVfc2hhcmVkX3VwX2NoX3RoaXJkIDwtIGhzX3VuaW5mX2ZpbHR2Ml9jb21iaW5lZFtbImRhdGEiXV1bWyJkMTEwX2NodW4iXV1bc2hhcmVkX2NodW5fdXAsIF0KZGVfdGFibGVfc2hhcmVkX3VwX2NoX2FsbCA8LSBtZXJnZSgKICBkZV90YWJsZV9zaGFyZWRfdXBfY2hfZmlyc3RbLCBjKCJkZXNjcmlwdGlvbiIsICJkZXNlcV9sb2dmYyIsICJkZXNlcV9hZGpwIildLAogIGRlX3RhYmxlX3NoYXJlZF91cF9jaF9zZWNvbmRbLCBjKCJkZXNlcV9sb2dmYyIsICJkZXNlcV9hZGpwIildLAogIGJ5PSJyb3cubmFtZXMiKQpkZV90YWJsZV9zaGFyZWRfdXBfY2hfYWxsIDwtIG1lcmdlKAogIGRlX3RhYmxlX3NoYXJlZF91cF9jaF9hbGwsCiAgZGVfdGFibGVfc2hhcmVkX3VwX2NoX3RoaXJkWywgYygiZGVzZXFfbG9nZmMiLCAiZGVzZXFfYWRqcCIpXSwKICBieS54PSJSb3cubmFtZXMiLCBieS55PSJyb3cubmFtZXMiKQpyb3duYW1lcyhkZV90YWJsZV9zaGFyZWRfdXBfY2hfYWxsKSA8LSBkZV90YWJsZV9zaGFyZWRfdXBfY2hfYWxsW1siUm93Lm5hbWVzIl1dCmRlX3RhYmxlX3NoYXJlZF91cF9jaF9hbGwgPC0gZGVfdGFibGVfc2hhcmVkX3VwX2NoX2FsbFssIC0xXQpjb2xuYW1lcyhkZV90YWJsZV9zaGFyZWRfdXBfY2hfYWxsKSA8LSBjKCJkZXNjcmlwdGlvbiIsICJsb2dmY18xMDciLCAiYWRqcF8xMDciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2dmY18xMDgiLCAiYWRqcF8xMDgiLCAibG9nZmNfMTEwIiwgImFkanBfMTEwIikKd3JpdGUuY3N2KGRlX3RhYmxlX3NoYXJlZF91cF9jaF9hbGwsCiAgICAgICAgICBmaWxlPXBhc3RlMCgiaW1hZ2VzLyIsIHJ1bmRhdGUsICJfZGVfdGFibGVfc2hhcmVkX3VwX2NoX2FsbC5jc3YiKSkKYGBgCgojIyMgUGVyZm9ybSB2ZW5ucyBvZiBzZWxmLWhlYWxpbmcgdnMuIHVuaW5mZWN0ZWQKClRoaXMgdGltZSBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgZG9ub3JzOiBzZWxmLWhlYWxpbmcgZG93biB2cy4gdW5pbmZlY3RlZC4KCmBgYHtyIHZlbm5fZG93bl9kZXNlcV9zaH0KZG93bl9zaWcgPC0gaHNfdW5pbmZfZmlsdHYyX3NpZyRkZXNlcSRkb3ducwpjb21wX2xzdCA8LSBsaXN0KAogICJkb25vcl8xMDciID0gcm93bmFtZXMoZG93bl9zaWdbWyJkMTA3X3NodW4iXV0pLAogICJkb25vcl8xMDgiID0gcm93bmFtZXMoZG93bl9zaWdbWyJkMTA4X3NodW4iXV0pLAogICJkb25vcl8xMTAiID0gcm93bmFtZXMoZG93bl9zaWdbWyJkMTEwX3NodW4iXV0pKQpjb21wX3NodW5fZG93biA8LSBWZW5uZXJhYmxlOjpWZW5uKFNldHM9Y29tcF9sc3QpCmRvd25fcmVzIDwtIFZlbm5lcmFibGU6OnBsb3QoY29tcF9zaHVuX2Rvd24sIGRvV2VpZ2h0cz1GQUxTRSkKCnNoYXJlZF9zaHVuX2Rvd24gPC0gY29tcF9zaHVuX2Rvd25ASW50ZXJzZWN0aW9uU2V0c1tbIjExMSJdXQpkZV90YWJsZV9zaGFyZWRfZG93bl9zaF9maXJzdCA8LSBoc191bmluZl9maWx0djJfY29tYmluZWRbWyJkYXRhIl1dW1siZDEwN19zaHVuIl1dW3NoYXJlZF9zaHVuX2Rvd24sIF0KZGVfdGFibGVfc2hhcmVkX2Rvd25fc2hfc2Vjb25kIDwtIGhzX3VuaW5mX2ZpbHR2Ml9jb21iaW5lZFtbImRhdGEiXV1bWyJkMTA4X3NodW4iXV1bc2hhcmVkX3NodW5fZG93biwgXQpkZV90YWJsZV9zaGFyZWRfZG93bl9zaF90aGlyZCA8LSBoc191bmluZl9maWx0djJfY29tYmluZWRbWyJkYXRhIl1dW1siZDExMF9zaHVuIl1dW3NoYXJlZF9zaHVuX2Rvd24sIF0KZGVfdGFibGVfc2hhcmVkX2Rvd25fc2hfYWxsIDwtIG1lcmdlKAogIGRlX3RhYmxlX3NoYXJlZF9kb3duX3NoX2ZpcnN0WywgYygiZGVzY3JpcHRpb24iLCAiZGVzZXFfbG9nZmMiLCAiZGVzZXFfYWRqcCIpXSwKICBkZV90YWJsZV9zaGFyZWRfZG93bl9zaF9zZWNvbmRbLCBjKCJkZXNlcV9sb2dmYyIsICJkZXNlcV9hZGpwIildLAogIGJ5PSJyb3cubmFtZXMiKQpkZV90YWJsZV9zaGFyZWRfZG93bl9zaF9hbGwgPC0gbWVyZ2UoCiAgZGVfdGFibGVfc2hhcmVkX2Rvd25fc2hfYWxsLAogIGRlX3RhYmxlX3NoYXJlZF9kb3duX3NoX3RoaXJkWywgYygiZGVzZXFfbG9nZmMiLCAiZGVzZXFfYWRqcCIpXSwKICBieS54PSJSb3cubmFtZXMiLCBieS55PSJyb3cubmFtZXMiKQpyb3duYW1lcyhkZV90YWJsZV9zaGFyZWRfZG93bl9zaF9hbGwpIDwtIGRlX3RhYmxlX3NoYXJlZF9kb3duX3NoX2FsbFtbIlJvdy5uYW1lcyJdXQpkZV90YWJsZV9zaGFyZWRfZG93bl9zaF9hbGwgPC0gZGVfdGFibGVfc2hhcmVkX2Rvd25fc2hfYWxsWywgLTFdCmNvbG5hbWVzKGRlX3RhYmxlX3NoYXJlZF9kb3duX3NoX2FsbCkgPC0gYygiZGVzY3JpcHRpb24iLCAibG9nZmNfMTA3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGpwXzEwNyIsICJsb2dmY18xMDgiLCAiYWRqcF8xMDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ2ZjXzExMCIsICJhZGpwXzExMCIpCndyaXRlLmNzdihkZV90YWJsZV9zaGFyZWRfZG93bl9zaF9hbGwsCiAgICAgICAgICBmaWxlPXBhc3RlMCgiaW1hZ2VzLyIsIHJ1bmRhdGUsICJfZGVfdGFibGVfc2hhcmVkX2Rvd25fc2hfYWxsLmNzdiIpKQpgYGAKCiMjIyBQZXJmb3JtIHZlbm5zIG9mIHNlbGYtaGVhbGluZyB2cy4gdW5pbmZlY3RlZAoKVGhpcyB0aW1lIGZvciBlYWNoIG9mIHRoZSB0aHJlZSBkb25vcnM6IGNocm9uaWMgZG93biB2cy4gdW5pbmZlY3RlZC4KCmBgYHtyIHZlbm5fZG93bl9kZXNlcV9jaHJ9CmRvd25fc2lnIDwtIGhzX3VuaW5mX2ZpbHR2Ml9zaWckZGVzZXEkZG93bnMKY29tcF9sc3QgPC0gbGlzdCgKICAiZG9ub3JfMTA3IiA9IHJvd25hbWVzKGRvd25fc2lnW1siZDEwN19jaHVuIl1dKSwKICAiZG9ub3JfMTA4IiA9IHJvd25hbWVzKGRvd25fc2lnW1siZDEwOF9jaHVuIl1dKSwKICAiZG9ub3JfMTEwIiA9IHJvd25hbWVzKGRvd25fc2lnW1siZDExMF9jaHVuIl1dKSkKY29tcF9jaHVuX2Rvd24gPC0gVmVubmVyYWJsZTo6VmVubihTZXRzPWNvbXBfbHN0KQpkb3duX3JlcyA8LSBWZW5uZXJhYmxlOjpwbG90KGNvbXBfY2h1bl9kb3duLCBkb1dlaWdodHM9RkFMU0UpCgpzaGFyZWRfY2h1bl9kb3duIDwtIGNvbXBfY2h1bl9kb3duQEludGVyc2VjdGlvblNldHNbWyIxMTEiXV0KZGVfdGFibGVfc2hhcmVkX2Rvd25fY2hfZmlyc3QgPC0gaHNfdW5pbmZfZmlsdHYyX2NvbWJpbmVkW1siZGF0YSJdXVtbImQxMDdfY2h1biJdXVtzaGFyZWRfY2h1bl9kb3duLCBdCmRlX3RhYmxlX3NoYXJlZF9kb3duX2NoX3NlY29uZCA8LSBoc191bmluZl9maWx0djJfY29tYmluZWRbWyJkYXRhIl1dW1siZDEwOF9jaHVuIl1dW3NoYXJlZF9jaHVuX2Rvd24sIF0KZGVfdGFibGVfc2hhcmVkX2Rvd25fY2hfdGhpcmQgPC0gaHNfdW5pbmZfZmlsdHYyX2NvbWJpbmVkW1siZGF0YSJdXVtbImQxMTBfY2h1biJdXVtzaGFyZWRfY2h1bl9kb3duLCBdCmRlX3RhYmxlX3NoYXJlZF9kb3duX2NoX2FsbCA8LSBtZXJnZSgKICBkZV90YWJsZV9zaGFyZWRfZG93bl9jaF9maXJzdFssIGMoImRlc2NyaXB0aW9uIiwgImRlc2VxX2xvZ2ZjIiwgImRlc2VxX2FkanAiKV0sCiAgZGVfdGFibGVfc2hhcmVkX2Rvd25fY2hfc2Vjb25kWywgYygiZGVzZXFfbG9nZmMiLCAiZGVzZXFfYWRqcCIpXSwKICBieT0icm93Lm5hbWVzIikKZGVfdGFibGVfc2hhcmVkX2Rvd25fY2hfYWxsIDwtIG1lcmdlKAogIGRlX3RhYmxlX3NoYXJlZF9kb3duX2NoX2FsbCwKICBkZV90YWJsZV9zaGFyZWRfZG93bl9jaF90aGlyZFssIGMoImRlc2VxX2xvZ2ZjIiwgImRlc2VxX2FkanAiKV0sCiAgYnkueD0iUm93Lm5hbWVzIiwgYnkueT0icm93Lm5hbWVzIikKcm93bmFtZXMoZGVfdGFibGVfc2hhcmVkX2Rvd25fY2hfYWxsKSA8LSBkZV90YWJsZV9zaGFyZWRfZG93bl9jaF9hbGxbWyJSb3cubmFtZXMiXV0KZGVfdGFibGVfc2hhcmVkX2Rvd25fY2hfYWxsIDwtIGRlX3RhYmxlX3NoYXJlZF9kb3duX2NoX2FsbFssIC0xXQpjb2xuYW1lcyhkZV90YWJsZV9zaGFyZWRfZG93bl9jaF9hbGwpIDwtIGMoImRlc2NyaXB0aW9uIiwgImxvZ2ZjXzEwNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRqcF8xMDciLCAibG9nZmNfMTA4IiwgImFkanBfMTA4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2dmY18xMTAiLCAiYWRqcF8xMTAiKQp3cml0ZS5jc3YoZGVfdGFibGVfc2hhcmVkX2Rvd25fY2hfYWxsLAogICAgICAgICAgZmlsZT1wYXN0ZTAoImltYWdlcy8iLCBydW5kYXRlLCAiX2RlX3RhYmxlX3NoYXJlZF9kb3duX2NoX2FsbC5jc3YiKSkKYGBgCgpBdCB0aGlzIHBvaW50LCB3ZSBzaG91bGQgaGF2ZSBhIHNldCBvZiBnZW5lcyB3aGljaCBhcmUgdXAvZG93biBpbiB0aGUKc2VsZi91bmluZmVjdGVkIGFuZCBjaHJvbmljL3VuaW5mZWN0ZWQsIGtlcHQgaW4gdmFyaWFibGVzIHdpdGggbmFtZXMgbGlrZToKJ3NoYXJlZF9zaHVuX2Rvd24nIGFuZCAnc2hhcmVkX2NodW5fZG93bicKCiMjIEdldCBNZXRhISAgSW50ZXJzZWN0IHRoZSBhYm92ZSBjb21wYXJpc29ucy4KCk5vdyB3ZSB3YW50IGEgc2Vuc2Ugb2Ygd2hhdCBnZW5lcyBhcmUgc2hhcmVkL3VuaXF1ZSBhbW9uZyB0aGUgc2VsZi1oZWFsaW5nCnZzLiB1bmluZmVjdGVkIGFuZCB0aGUgY2hyb25pYyB2cy4gdW5pbmZlY3RlZCBjb21wYXJpc29ucyBwZXJmb3JtZWQgYWJvdmUuICBPbmUKd291bGQgYXNzdW1lIHRoYXQgdGhlIG1vc3QgaW50ZXJlc3RpbmcgZ2VuZXMgaW4gdGhlc2Ugc2V0cyB3aWxsIHByb3ZlIHRvIGJlIHRoZQp0aGUgb25lcyB3aGljaCBhcmUgX25vdF8gc2hhcmVkLgoKYGBge3Igc2hhcmVkX2ludGVyc2VjdGlvbnN9CnNoY2hfdXBfbHN0IDwtIGxpc3QoCiAgInVwX3NoIiA9IHNoYXJlZF9zaHVuX3VwLAogICJ1cF9jaCIgPSBzaGFyZWRfY2h1bl91cCkKc2hhcmVkX3VwIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz1zaGNoX3VwX2xzdCkKVmVubmVyYWJsZTo6cGxvdChzaGFyZWRfdXAsIGRvV2VpZ2h0cz1GQUxTRSkKCnNoY2hfZG93bl9sc3QgPC0gbGlzdCgKICAidXBfc2giID0gc2hhcmVkX3NodW5fZG93biwKICAidXBfY2giID0gc2hhcmVkX2NodW5fZG93bikKc2hhcmVkX2Rvd24gPC0gVmVubmVyYWJsZTo6VmVubihTZXRzPXNoY2hfZG93bl9sc3QpClZlbm5lcmFibGU6OnBsb3Qoc2hhcmVkX2Rvd24sIGRvV2VpZ2h0cz1GQUxTRSkKCnVwdXBfZ2VuZXMgPC0gc2hhcmVkX3VwQEludGVyc2VjdGlvblNldHNbWyIxMSJdXQp1cHNoX25vdGNoIDwtIHNoYXJlZF91cEBJbnRlcnNlY3Rpb25TZXRzW1siMTAiXV0KdXBjaF9ub3RzaCA8LSBzaGFyZWRfdXBASW50ZXJzZWN0aW9uU2V0c1tbIjAxIl1dCmRvd25kb3duX2dlbmVzIDwtIHNoYXJlZF9kb3duQEludGVyc2VjdGlvblNldHNbWyIxMSJdXQpkb3duc2hfbm90Y2ggPC0gc2hhcmVkX2Rvd25ASW50ZXJzZWN0aW9uU2V0c1tbIjEwIl1dCmRvd25jaF9ub3RzaCA8LSBzaGFyZWRfZG93bkBJbnRlcnNlY3Rpb25TZXRzW1siMDEiXV0KCmtlcHRfY29sdW1ucyA8LSBjKCJlbnNlbWJsdHJhbnNjcmlwdGlkIiwgImVuc2VtYmxnZW5laWQiLCAiZGVzY3JpcHRpb24iLAogICAgICAgICAgICAgICAgICAiZGVzZXFfbG9nZmMiLCAiZGVzZXFfYWRqcCIpCiMjIEdldCB0aGUgc2hhcmVkIHRoaW5ncyBpbiB1cF9zaCBhbmQgdXBfY2gsIGVyZ28gY2FuIHVzZSBlaXRoZXIgc2hlZXQKeGxzX3Jlc3VsdCA8LSB3cml0ZV94bHMoZGF0YT11cF9zaWdbWyJkMTA3X3NodW4iXV1bdXB1cF9nZW5lcywga2VwdF9jb2x1bW5zXSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQ9InVwc2hfdXBjaCIpCiMjIEdldCB0aGUgb25seS11cF9zaAp4bHNfcmVzdWx0IDwtIHdyaXRlX3hscyhkYXRhPXVwX3NpZ1tbImQxMDdfc2h1biJdXVt1cHNoX25vdGNoLCBrZXB0X2NvbHVtbnNdLAogICAgICAgICAgICAgICAgICAgICAgICBzaGVldD0idXBzaF9ub2NoIiwKICAgICAgICAgICAgICAgICAgICAgICAgd2I9eGxzX3Jlc3VsdFtbIndvcmtib29rIl1dKQojIyBHZXQgdGhlIG9ubHktdXBfY2gKeGxzX3Jlc3VsdCA8LSB3cml0ZV94bHMoZGF0YT11cF9zaWdbWyJkMTA3X2NodW4iXV1bdXBjaF9ub3RzaCwga2VwdF9jb2x1bW5zXSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQ9InVwY2hfbm9zaCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHdiPXhsc19yZXN1bHRbWyJ3b3JrYm9vayJdXSkKIyMgTm93IHJlcGVhdCBmb3IgdGhlIGRvd246IGRvd24tc2hhcmVkCiMjIEdldCBzaGFyZWQgZG93biBkb3duX3NoIGRvd25fY2gKeGxzX3Jlc3VsdCA8LSB3cml0ZV94bHMoZGF0YT1kb3duX3NpZ1tbImQxMDdfc2h1biJdXVtkb3duZG93bl9nZW5lcywga2VwdF9jb2x1bW5zXSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQ9ImRvd25zaF9kb3duY2giLAogICAgICAgICAgICAgICAgICAgICAgICB3Yj14bHNfcmVzdWx0W1sid29ya2Jvb2siXV0pCiMjIFRoZSBkb3duX3NoIG9ubHkKeGxzX3Jlc3VsdCA8LSB3cml0ZV94bHMoZGF0YT1kb3duX3NpZ1tbImQxMDdfc2h1biJdXVtkb3duc2hfbm90Y2gsIGtlcHRfY29sdW1uc10sCiAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0PSJkb3duc2hfbm9jaCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHdiPXhsc19yZXN1bHRbWyJ3b3JrYm9vayJdXSkKIyMgVGhlIGRvd25fY2gKeGxzX3Jlc3VsdCA8LSB3cml0ZV94bHMoZGF0YT1kb3duX3NpZ1tbImQxMDdfY2h1biJdXVtkb3duY2hfbm90c2gsIGtlcHRfY29sdW1uc10sCiAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0PSJkb3duY2hfbm9zaCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHdiPXhsc19yZXN1bHRbWyJ3b3JrYm9vayJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWw9cGFzdGUwKCJleGNlbC8iLCBydW5kYXRlLCAiX2ZpZ3VyZV81Y19zdHVmZi12IiwgdmVyLCAiLnhsc3giKSkKYGBgCgojIyMgR2VuZXMgc2hhcmVkIGFtb25nIHRoZSBkb25vcnMuCgpPbmUgZnVydGhlciBxdWVyeTogd2hhdCBnZW5lcyBhcmUgc2hhcmVkIGFtb25nIHRoZSBjb250cmFzdHMgb2YKc2VsZi1oZWFsaW5nL2Nocm9uaWMgdnMuIHVuaW5mZWN0ZWQgZm9yIHRoZSB0aHJlZSBkb25vcnM/CldoZW4gZG9pbmcgdGhpcywgd2UgaGF2ZSBvbmNlIGFnYWluIHRvIGNvbnNpZGVyIHdoZXRoZXIgdG8gdXNlIHRoZQpub2JhdGNoL2JhdGNoLWluLW1vZGVsL3N2YS9ldGMgbWV0aG9kcyBhZ2FpbnN0IG91ciBkb25vcnMuLi4gIFNpbmNlIHRoZXkgYWxsCmFncmVlIHByZXR0eSB3ZWxsIHVudGlsIGNvbWJhdCwgSSB3aWxsIGFyYml0cmFyaWx5IGNob29zZSBmc3ZhLgoKT25lIGlkZWEgc3VnZ2VzdGVkIGJ5IE1hcmlhIEFkZWxhaWRhIHdhcyB0byBjb21wYXJlIHRoZSBzZXQgb2YgZ2VuZXMgc2hhcmVkCmFtb25nIGQxMDcvZDEwOC9kMTEwIGluIHRoaXMgbGFzdCBjb21wYXJpc29uICh3aGljaCB3YXMgZWFjaCBvZiB0aGUgdGhyZWUgZG9ub3JzCnNlcGFyYXRlbHkpIGFnYWluc3QgdGhlIHNldCBvZiBnZW5lcyBpbiB0aGUgYWxsLWRhdGEgYW5hbHlzaXMgYWJvdmUuCgojIyMjIEF0dGVtcHQgdG8gYW5zd2VyIGJ5IHRoZSB1bmlxdWUgaW5kaXZpZHVhbCBzZXRzCgpJbiB0aGlzIGJsb2NrLCBJIHdpbGwgYXR0ZW1wdCB0byBhbnN3ZXIgdGhlIGFib3ZlIHF1ZXJ5IGJ5IGludGVyc2VjdGluZyB0aGUgc2V0cwpvZiBnZW5lcyBzaGFyZWQgYW1vbmcgdGhlIGluZGl2aWR1YWxzIGJ1dCB1bmlxdWUgdG8gc2gvY2hyIHZzLiB1bmluZmVjdGVkCmFnYWluc3QgdGhlIHNldCBvZiBnZW5lcyBvYnNlcnZlZCBpbiB0aGUgb3JpZ2luYWwgc3ZhLW1lZGlhdGVkIERFIGFuYWx5c2lzLgoKYGBge3Igb3RoZXJfc3R1ZmZ9CmluZGl2X3NodXBfdW5pcXVlIDwtIHNoYXJlZF91cEBJbnRlcnNlY3Rpb25TZXRzW1siMTAiXV0KYXZnX3ZzX2luZF9zaHVuX3VwIDwtIGxpc3QoCiAgImZzdmFfYXZnIiA9IHJvd25hbWVzKGhzX3NpZ19mc3ZhW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJzaF9uaWwiXV0pLAogICJpbmRpdiIgPSBpbmRpdl9zaHVwX3VuaXF1ZSkKYXZnX2luZF9zaHVwX3Zlbm4gPC0gVmVubmVyYWJsZTo6VmVubihTZXRzPWF2Z192c19pbmRfc2h1bl91cCkKVmVubmVyYWJsZTo6cGxvdChhdmdfaW5kX3NodXBfdmVubiwgZG9XZWlnaHRzPUZBTFNFKQoKaW5kaXZfY2h1cF91bmlxdWUgPC0gc2hhcmVkX3VwQEludGVyc2VjdGlvblNldHNbWyIwMSJdXQphdmdfdnNfaW5kX2NodW5fdXAgPC0gbGlzdCgKICAiZnN2YV9hdmciID0gcm93bmFtZXMoaHNfc2lnX2ZzdmFbWyJkZXNlcSJdXVtbInVwcyJdXVtbImNoX25pbCJdXSksCiAgImluZGl2IiA9IGluZGl2X3NodXBfdW5pcXVlKQphdmdfaW5kX2NodXBfdmVubiA8LSBWZW5uZXJhYmxlOjpWZW5uKFNldHM9YXZnX3ZzX2luZF9jaHVuX3VwKQpWZW5uZXJhYmxlOjpwbG90KGF2Z19pbmRfY2h1cF92ZW5uLCBkb1dlaWdodHM9RkFMU0UpCgppbmRpdl9zaGRvd25fdW5pcXVlIDwtIHNoYXJlZF9kb3duQEludGVyc2VjdGlvblNldHNbWyIxMCJdXQphdmdfdnNfaW5kX3NodW5fZG93biA8LSBsaXN0KAogICJmc3ZhX2F2ZyIgPSByb3duYW1lcyhoc19zaWdfZnN2YVtbImRlc2VxIl1dW1siZG93bnMiXV1bWyJzaF9uaWwiXV0pLAogICJpbmRpdiIgPSBpbmRpdl9zaGRvd25fdW5pcXVlKQphdmdfaW5kX3NoZG93bl92ZW5uIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz1hdmdfdnNfaW5kX3NodW5fZG93bikKVmVubmVyYWJsZTo6cGxvdChhdmdfaW5kX3NoZG93bl92ZW5uLCBkb1dlaWdodHM9RkFMU0UpCgppbmRpdl9jaGRvd25fdW5pcXVlIDwtIHNoYXJlZF9kb3duQEludGVyc2VjdGlvblNldHNbWyIwMSJdXQphdmdfdnNfaW5kX2NodW5fZG93biA8LSBsaXN0KAogICJmc3ZhX2F2ZyIgPSByb3duYW1lcyhoc19zaWdfZnN2YVtbImRlc2VxIl1dW1siZG93bnMiXV1bWyJjaF9uaWwiXV0pLAogICJpbmRpdiIgPSBpbmRpdl9zaGRvd25fdW5pcXVlKQphdmdfaW5kX2NoZG93bl92ZW5uIDwtIFZlbm5lcmFibGU6OlZlbm4oU2V0cz1hdmdfdnNfaW5kX2NodW5fZG93bikKVmVubmVyYWJsZTo6cGxvdChhdmdfaW5kX2NoZG93bl92ZW5uLCBkb1dlaWdodHM9RkFMU0UpCmBgYAoKIyMjIyBBbnN3ZXIgYnkgbG9va2luZyBhdCB0aGUgc2hhcmVkIGdlbmVzIGluIGJvdGggc2V0cwoKYGBge3IgY29tcGFyZV9hdmdfZG9ub3JfaW5kaXZpZHVhbF9kb25vcn0Kc2h1bl91cF9hdmdfZ2VuZXMgPC0gcm93bmFtZXMoaHNfc2lnX2JhdGNoW1siZGVzZXEiXV1bWyJ1cHMiXV1bWyJzaF9uaWwiXV0pCmNodW5fdXBfYXZnX2dlbmVzIDwtIHJvd25hbWVzKGhzX3NpZ19iYXRjaFtbImRlc2VxIl1dW1sidXBzIl1dW1siY2hfbmlsIl1dKQpzaHVuX2Rvd25fYXZnX2dlbmVzIDwtIHJvd25hbWVzKGhzX3NpZ19iYXRjaFtbImRlc2VxIl1dW1siZG93bnMiXV1bWyJzaF9uaWwiXV0pCmNodW5fZG93bl9hdmdfZ2VuZXMgPC0gcm93bmFtZXMoaHNfc2lnX2JhdGNoW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImNoX25pbCJdXSkKCnNodW5fdXBfaW5kaXZpZHVhbF9nZW5lcyA8LSBjb21wX3NodW5fdXBASW50ZXJzZWN0aW9uU2V0c1tbIjExMSJdXQpjaHVuX3VwX2luZGl2aWR1YWxfZ2VuZXMgPC0gY29tcF9jaHVuX3VwQEludGVyc2VjdGlvblNldHNbWyIxMTEiXV0Kc2h1bl9kb3duX2luZGl2aWR1YWxfZ2VuZXMgPC0gY29tcF9zaHVuX2Rvd25ASW50ZXJzZWN0aW9uU2V0c1tbIjExMSJdXQpjaHVuX2Rvd25faW5kaXZpZHVhbF9nZW5lcyA8LSBjb21wX2NodW5fZG93bkBJbnRlcnNlY3Rpb25TZXRzW1siMTExIl1dCgpsYXN0X3NodW5fdXBfbHN0IDwtIGxpc3QoCiAgImF2Z19nZW5lcyIgPSBzaHVuX3VwX2F2Z19nZW5lcywKICAiaW5kX2dlbmVzIiA9IHNodW5fdXBfaW5kaXZpZHVhbF9nZW5lcykKbGFzdF9zaHVuX3VwX3Zlbm4gPC0gVmVubmVyYWJsZTo6VmVubihTZXRzPWxhc3Rfc2h1bl91cF9sc3QpClZlbm5lcmFibGU6OnBsb3QobGFzdF9zaHVuX3VwX3Zlbm4sIGRvV2VpZ2h0cz1GQUxTRSkKCmxhc3RfY2h1bl91cF9sc3QgPC0gbGlzdCgKICAiYXZnX2dlbmVzIiA9IGNodW5fdXBfYXZnX2dlbmVzLAogICJpbmRfZ2VuZXMiID0gY2h1bl91cF9pbmRpdmlkdWFsX2dlbmVzKQpsYXN0X2NodW5fdXBfdmVubiA8LSBWZW5uZXJhYmxlOjpWZW5uKFNldHM9bGFzdF9jaHVuX3VwX2xzdCkKVmVubmVyYWJsZTo6cGxvdChsYXN0X2NodW5fdXBfdmVubiwgZG9XZWlnaHRzPUZBTFNFKQoKbGFzdF9zaHVuX2Rvd25fbHN0IDwtIGxpc3QoCiAgImF2Z19nZW5lcyIgPSBzaHVuX2Rvd25fYXZnX2dlbmVzLAogICJpbmRfZ2VuZXMiID0gc2h1bl9kb3duX2luZGl2aWR1YWxfZ2VuZXMpCmxhc3Rfc2h1bl9kb3duX3Zlbm4gPC0gVmVubmVyYWJsZTo6VmVubihTZXRzPWxhc3Rfc2h1bl9kb3duX2xzdCkKVmVubmVyYWJsZTo6cGxvdChsYXN0X3NodW5fZG93bl92ZW5uLCBkb1dlaWdodHM9RkFMU0UpCgpsYXN0X2NodW5fZG93bl9sc3QgPC0gbGlzdCgKICAiYXZnX2dlbmVzIiA9IGNodW5fZG93bl9hdmdfZ2VuZXMsCiAgImluZF9nZW5lcyIgPSBjaHVuX2Rvd25faW5kaXZpZHVhbF9nZW5lcykKbGFzdF9jaHVuX2Rvd25fdmVubiA8LSBWZW5uZXJhYmxlOjpWZW5uKFNldHM9bGFzdF9jaHVuX2Rvd25fbHN0KQpWZW5uZXJhYmxlOjpwbG90KGxhc3RfY2h1bl9kb3duX3Zlbm4sIGRvV2VpZ2h0cz1GQUxTRSkKYGBgCgojIyMgREU6IGluY2x1ZGUgdW5pbmZlY3RlZCwgcmVwZWF0IHdpdGggY29uZGl0aW9uIHNpbXBsaWZpZWQgdG8gY2hyb25pYy9zZWxmCgpEbyBJIHRoaW5rIHRoZSBleGFjdCBzYW1lIHRoaW5nIGFzIGluIHRoZSBwcmV2aW91cyBjb21wYXJpc29uLCBidXQgbm93IHNpbXBsaWZ5IHRoZSAnY29uZGl0aW9uJwpmYWN0b3IgdG8ganVzdCBzZWxmLWhlYWxpbmcgdnMuIGNocm9uaWMgYW5kIHNlZSB3aGF0IGhhcHBlbnMuCgpgYGB7ciBkZV9jaHJvbmljc2hfc3RyYWluYmF0Y2gsIGV2YWw9RkFMU0V9CnVuaW5mX3N0cmFpbmJhdGNoX3FjZiA8LSBzZXRfZXhwdF9iYXRjaGVzKGV4cHQ9aHNfY2RzX3VuaW5mLCBmYWN0PSJwYXRob2dlbnN0cmFpbiIpCnVuaW5mX3N0cmFpbmJhdGNoX3FjZiA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGV4cHQ9dW5pbmZfc3RyYWluYmF0Y2hfcWNmLCBmYWN0PSJzdGF0ZSIpCndpdGh1bmluZl9zdHJhaW5iYXRjaF9wYWlyc19jaHNoIDwtIGFsbF9wYWlyd2lzZSgKICBwYXJhbGxlbD1GQUxTRSwgdW5pbmZfc3RyYWluYmF0Y2hfcWNmLAogIG1vZGVsX2JhdGNoPUZBTFNFLCBmb3JjZT1UUlVFLCBkb19lYnNlcT1GQUxTRSkKY2hzaF9rZWVwZXJzIDwtIGxpc3QoCiAgICAiY2hfc2giID0gYygiY2hyb25pYyIsICJzZWxmX2hlYWwiKSwKICAgICJjaF9uaWwiID0gYygiY2hyb25pYyIsICJ1bmluZmVjdGVkIiksCiAgICAic2hfbmlsIiA9IGMoInNlbGZfaGVhbCIsICJ1bmluZmVjdGVkIikpCndpdGh1bmluZl9zdHJhaW5iYXRjaF90YWJsZXNfY2hzaCA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICB3aXRodW5pbmZfc3RyYWluYmF0Y2hfcGFpcnNfY2hzaCwKICBrZWVwZXJzPWNoc2hfa2VlcGVycywKICBleGNlbD1wYXN0ZTAoImV4Y2VsLyIsIHJ1bmRhdGUsICJfd2l0aHVuaW5mX3N0cmFpbmJhdGNoX2Noc2hfcGFpcndpc2UtdiIsIHZlciwgIi54bHN4IikpKQp3aXRodW5pbmZfc3RyYWluYmF0Y2hfc2lnX2Noc2ggPC0gZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcygKICB3aXRodW5pbmZfc3RyYWluYmF0Y2hfdGFibGVzX2Noc2gsCiAgZXhjZWw9cGFzdGUwKCJleGNlbC8iLCBydW5kYXRlLCAiX3dpdGh1bmluZl9zdHJhaW5iYXRjaF9jaHNoX3NpZy12IiwgdmVyLCAiLnhsc3giKSkKIyN3aXRodW5pbmZfc3RyYWluYmF0Y2hfdGFibGVzX2Noc2gkbGltbWFfcGxvdHMKIyN3aXRodW5pbmZfc3RyYWluYmF0Y2hfdGFibGVzX2Noc2gkZWRnZXJfcGxvdHMKIyN3aXRodW5pbmZfc3RyYWluYmF0Y2hfdGFibGVzX2Noc2gkZGVzZXFfcGxvdHMKYGBgCgojIEZpZ3VyZSA1CgpHZW5lcmF0ZSBERSBsaXN0cyBvZiBlYWNoIGRvbm9yIGZvciBhbGwgY29udHJhc3RzIGZvciBQQk1Dcy4KCiAgYS4gIFZlbm4gc2gvdW5pbmYgdnMgY2hyL3VuaW5mIDIgdmVubiBkaWFncmFtIHVwLiAoZG9ub3IgaW4gbW9kZWwpCiAgYi4gIFZlbm4gc2gvdW5pbmYgdnMgY2hyL3VuaW5mIDIgdmVubiBkaWFncmFtIGRvd24uCiAgYy4gIFZlbm4gU2gvdW5pbmYgdXAgZ2VuZXMgMyB2ZW5uIGRpYWdyYW0uCiAgZC4gIFZlbm4gU2gvdW5pbmYgZG93biBnZW5lcyAzIHZlbm4uCiAgZS4gIFZlbm4gQ2hyL3VuaW5mIHVwIGdlbmVzIDMgdmVubi4KICBmLiAgVmVubiBDaHIvdW5pbmYgZG93biBnZW5lcyAzIHZlbm4uCiAgZy4gIDIgd2F5IHZlbm4gb2YgKGNvbW1vbiB1cCBpbiAzIHZlbm4gc2gvdW5pbmYpIHZzLiAoY29tbW9uIHVwIGluIDMgdmVubiBjaHIvdW5pbmYpCiAgaC4gIDIgd2F5IHZlbm4gb2YgKGNvbW1vbiBkb3duIGluIDMgdmVubiBzaC91bmluZikgdnMuIChjb21tb24gZG93biBpbiAzIHZlbm4gY2hyL3VuaW5mKQoKSSByZW5hbWVkIHRoZXNlIHBsb3RzIGFuZCBhbSBub3cgaG9wZWxlc3NseSBjb25mdXNlZCBhcyB0byB3aGljaCBpcyB3aGljaC4gIEkKdGhpbmsgSSB3aWxsIG5vdCBydW4gdGhpcyBmb3Igbm93IGJ1dCBpbnN0ZWFkIGdlbmVyYXRlIHRoZSB3b3Jrc2hlZXQgd2l0aG91dAp0aGVtIGFuZCB0aGVuIHJldHVybiB0byB0aGlzIGluIHRoZSBob3BlcyB0aGF0IEkgY2FuIGRvIGEgYmV0dGVyIGpvYi4KCmBgYHtyIGZpZ3VyZV81LCBldmFsPUZBTFNFfQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzLyIsIHJ1bmRhdGUsICJfZmlnXzA1YS1zaF91bmluZl92c19jaHJfdW5pbmZfdXAucGRmIikpClZlbm5lcmFibGU6OnBsb3QoY29tbW9uX3NvbG9zX2JhdGNoJHVwX3Zlbm4sIGRvV2VpZ2h0cz1GQUxTRSkKZGV2Lm9mZigpCnBwKGZpbGU9cGFzdGUwKCJpbWFnZXMvIiwgcnVuZGF0ZSwgIl9maWdfMDViLXNoX3VuaW5mX3ZzX2Nocl91bmluZl9kb3duLnBkZiIpKQpWZW5uZXJhYmxlOjpwbG90KGNvbW1vbl9zb2xvc19iYXRjaCRkb3duX3Zlbm4sIGRvV2VpZ2h0cz1GQUxTRSkKZGV2Lm9mZigpCnBwKGZpbGU9cGFzdGUwKCJpbWFnZXMvIiwgcnVuZGF0ZSwgIl9maWdfMDVjLXNoX3VuaW5mX2Rvbm9yc191cC5wZGYiKSkKVmVubmVyYWJsZTo6cGxvdChzaF91cF92ZW5uLCBkb1dlaWdodHM9RkFMU0UpCmRldi5vZmYoKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzLyIsIHJ1bmRhdGUsICJfZmlnXzA1ZC1zaF91bmluZl9kb25vcnNfZG93bi5wZGYiKSkKVmVubmVyYWJsZTo6cGxvdChzaF9kb3duX3Zlbm4sIGRvV2VpZ2h0cz1GQUxTRSkKZGV2Lm9mZigpCnBwKGZpbGU9cGFzdGUwKCJpbWFnZXMvIiwgcnVuZGF0ZSwgIl9maWdfMDVlLWNocl91bmluZl9kb25vcnNfdXAucGRmIikpClZlbm5lcmFibGU6OnBsb3QoY2hyX3VwX3Zlbm4sIGRvV2VpZ2h0cz1GQUxTRSkKZGV2Lm9mZigpCnBwKGZpbGU9cGFzdGUwKCJpbWFnZXMvIiwgcnVuZGF0ZSwgIl9maWdfMDVmLWNocl91bmluZl9kb25vcnNfZG93bi5wZGYiKSkKVmVubmVyYWJsZTo6cGxvdChjaHJfZG93bl92ZW5uLCBkb1dlaWdodHM9RkFMU0UpCmRldi5vZmYoKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzLyIsIHJ1bmRhdGUsICJfZmlnXzA1Zy11cF9jb21tb24ucGRmIikpClZlbm5lcmFibGU6OnBsb3Qoc2hhcmVkX3VwLCBkb1dlaWdodHM9RkFMU0UpCmRldi5vZmYoKQpwcChmaWxlPXBhc3RlMCgiaW1hZ2VzLyIsIHJ1bmRhdGUsICJfZmlnXzA1aC1kb3duX2NvbW1vbi5wZGYiKSkKVmVubmVyYWJsZTo6cGxvdChzaGFyZWRfZG93biwgZG9XZWlnaHRzPUZBTFNFKQpkZXYub2ZmKCkKYGBgCgojIFRyeSBhZ2FpbiBvbiB0aGUgcGFyYXNpdGUgZGF0YQoKIyMgUmVtZW1iZXIgb3VyIGRhdGEgc2V0CgpgYGB7ciBscF9leHByZXNzaW9uMDF9CmxwX2luZl9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KGxwX2luZiwgZmlsdGVyPVRSVUUpKQpgYGAKCmBgYHtyIGxwX25vYmF0Y2gsIHNob3cuZmlnPSJoaWRlIn0KbHBfcGFpcndpc2Vfbm9iYXRjaCA8LSBzbShhbGxfcGFpcndpc2UobHBfaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbGxlbD1GQUxTRSwgZG9fZWJzZXE9RkFMU0UpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9scF9pbmZlY3Rfbm9iYXRjaF9jb250ci12e3Zlcn0ueGxzeCIpCmxwX2NvbWJpbmVkX25vYmF0Y2ggPC0gc20oY29tYmluZV9kZV90YWJsZXMobHBfcGFpcndpc2Vfbm9iYXRjaCwgZXhjZWw9ZXhjZWxfZmlsZSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2xwX2luZmVjdF9ub2JhdGNoX3NpZy12e3Zlcn0ueGxzeCIpCmxwX3NpZ19ub2JhdGNoIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMobHBfY29tYmluZWRfbm9iYXRjaCwgZXhjZWw9ZXhjZWxfZmlsZSkpCmBgYAoKYGBge3IgbHBfYmF0Y2gsIHNob3cuZmlnPSJoaWRlIn0KbHBfcGFpcndpc2VfYmF0Y2ggPC0gc20oYWxsX3BhaXJ3aXNlKGxwX2luZl9maWx0LCBtb2RlbF9iYXRjaD1UUlVFKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fbHBfaW5mZWN0X2JhdGNoX2NvbnRyLXZ7dmVyfS54bHN4IikKbHBfY29tYmluZWRfYmF0Y2ggPC0gc20oY29tYmluZV9kZV90YWJsZXMobHBfcGFpcndpc2VfYmF0Y2gsIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9scF9pbmZlY3RfYmF0Y2hfc2lnLXZ7dmVyfS54bHN4IikKbHBfc2lnX2JhdGNoIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMobHBfY29tYmluZWRfYmF0Y2gsIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpgYGAKCmBgYHtyIGxwX3NzdmEsIHNob3cuZmlnPSJoaWRlIn0KbHBfcGFpcndpc2Vfc3N2YSA8LSBzbShhbGxfcGFpcndpc2UobHBfaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPSJzc3ZhIikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2xwX2luZmVjdF9zc3ZhX2NvbnRyLXZ7dmVyfS54bHN4IikKbHBfY29tYmluZWRfc3N2YSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhscF9wYWlyd2lzZV9zc3ZhLCBleGNlbD1leGNlbF9maWxlKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fbHBfaW5mZWN0X3NzdmFfc2lnLXZ7dmVyfS54bHN4IikKbHBfc2lnX3NzdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhscF9jb21iaW5lZF9zc3ZhLCBleGNlbD1leGNlbF9maWxlKSkKYGBgCgpgYGB7ciBscF9mc3ZhLCBzaG93LmZpZz0iaGlkZSJ9CmxwX3BhaXJ3aXNlX2ZzdmEgPC0gc20oYWxsX3BhaXJ3aXNlKGxwX2luZl9maWx0LCBtb2RlbF9iYXRjaD0iZnN2YSIpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9scF9pbmZlY3RfZnN2YV9jb250ci12e3Zlcn0ueGxzeCIpCmxwX2NvbWJpbmVkX2ZzdmEgPC0gc20oY29tYmluZV9kZV90YWJsZXMobHBfcGFpcndpc2VfZnN2YSwgZXhjZWw9ZXhjZWxfZmlsZSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2xwX2luZmVjdF9mc3ZhX3NpZy12e3Zlcn0ueGxzeCIpCmxwX3NpZ19mc3ZhIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMobHBfY29tYmluZWRfZnN2YSwgZXhjZWw9ZXhjZWxfZmlsZSkpCmBgYAoKYGBge3Igc2F2ZW1lfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCmBgYAoKIyBTdGF0ZSBzYXZlZCB0byBgdGhpc19zYXZlYAoKCmBgYHtyIHJlbG9hZCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbG9hZG1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkKYGBgCg==