1 RNA sequencing of L. panamensis: Antimonial responses.

This document seeks to explore the differences in samples which did and did-not respond to drug treatment during infection.

3 Normalize antimonial host samples

Perform an initial sample normalization and see how they look.

## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is 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: cbcb
## Removing 6998 low-count genes (11849 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 2 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Graphing number of non-zero genes with respect to CPM by library.
## Graphing library sizes.
## Graphing a boxplot.
## Graphing a correlation heatmap.
## Graphing a standard median correlation.
## Performing correlation.
## Graphing a distance heatmap.
## Graphing a standard median distance.
## Performing distance.
## Graphing a PCA plot.
## Graphing a T-SNE plot.
## Plotting a density plot.
## Plotting a CV plot.
## Naively calculating coefficient of variation/dispersion with respect to condition.
## Finished calculating dispersion estimates.
## Plotting the representation of the top-n genes.
## Plotting the expression of the top-n PC loaded genes.
## Printing a color to condition legend.

Do these samples segregate in ways which make sense?

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11
hpgl0315 HPGL0315 respond_nil d202 1 #8068AE HPGL0315 -0.0338 -0.6025 -0.0338 -0.6025 0.1303 -0.2138 0.1463 -0.2340 0.1992 -0.2157 0.2115 -0.5258 0.0791
hpgl0316 HPGL0316 respond_inf d202 1 #D03792 HPGL0316 0.0290 -0.3744 0.0290 -0.3744 -0.4013 -0.0489 0.2854 -0.3512 -0.0279 0.2744 -0.2251 0.5296 0.0106
hpgl0317 HPGL0317 respond_nil d209 2 #8068AE HPGL0317 0.1650 -0.0435 0.1650 -0.0435 0.3056 0.3768 -0.3640 -0.2161 -0.3055 0.1443 0.1904 0.1009 0.5589
hpgl0318 HPGL0318 respond_inf d209 2 #D03792 HPGL0318 0.2562 0.1285 0.2562 0.1285 -0.1629 0.3698 -0.4091 -0.3222 0.3184 -0.2234 -0.1481 -0.0842 -0.4687
hpgl0319 HPGL0319 fail_nil d218 3 #A66753 HPGL0319 0.0351 -0.3389 0.0351 -0.3389 0.1651 0.2846 0.1072 0.5343 -0.3611 -0.1955 0.1263 0.1934 -0.4164
hpgl0320 HPGL0320 fail_inf d218 3 #7FA718 HPGL0320 0.1647 -0.0126 0.1647 -0.0126 -0.3753 0.1494 -0.0171 0.5871 0.3742 0.2216 -0.1444 -0.2110 0.3561
hpgl0321 HPGL0321 fail_nil d119 4 #A66753 HPGL0321 0.3916 0.1902 0.3916 0.1902 0.3407 -0.3311 0.0911 -0.0069 -0.1481 0.5585 -0.1577 -0.2289 -0.2863
hpgl0322 HPGL0322 fail_inf d119 4 #7FA718 HPGL0322 0.4296 0.3207 0.4296 0.3207 0.0206 -0.3733 0.1964 0.0381 0.0453 -0.5583 0.1086 0.2799 0.2135
hpgl0640 HPGL0640 fail_nil d1025 5 #A66753 HPGL0640 -0.4513 -0.0217 -0.4513 -0.0217 0.2727 -0.3649 -0.4382 0.1494 0.3733 0.1025 0.0788 0.3615 -0.0628
hpgl0641 HPGL0641 fail_inf d1025 5 #7FA718 HPGL0641 -0.2927 0.1332 -0.2927 0.1332 -0.4542 -0.2947 -0.3076 0.0027 -0.5700 -0.1275 -0.1183 -0.2653 0.0050
hpgl0642 HPGL0642 respond_nil d1018 6 #8068AE HPGL0642 -0.4142 0.2290 -0.4142 0.2290 0.3286 0.2494 0.3634 -0.0673 0.0287 -0.1770 -0.5732 -0.0942 0.1276
hpgl0643 HPGL0643 respond_inf d1018 6 #D03792 HPGL0643 -0.2793 0.3920 -0.2793 0.3920 -0.1698 0.1966 0.3462 -0.1138 0.0735 0.1960 0.6513 -0.0560 -0.1165

3.1 Batch normalize antimonial host samples

The batch effect is pretty severe, what happens if we try combat on it?

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11
hpgl0315 HPGL0315 respond_nil d202 1 #8068AE HPGL0315 -0.3774 0.2881 -0.3774 0.2881 -0.1487 0.4487 0.3389 -0.0322 -0.0374 -0.1513 -0.3670 -0.3888 -0.2044
hpgl0316 HPGL0316 respond_inf d202 1 #D03792 HPGL0316 -0.1377 -0.2621 -0.1377 -0.2621 0.1236 -0.4758 -0.3688 0.0316 0.4082 -0.0960 -0.3680 -0.3221 -0.1882
hpgl0317 HPGL0317 respond_nil d209 2 #8068AE HPGL0317 -0.4103 -0.4970 -0.4103 -0.4970 0.3046 0.0760 0.2029 0.1918 -0.1735 0.3255 0.3140 0.1158 -0.2769
hpgl0318 HPGL0318 respond_inf d209 2 #D03792 HPGL0318 -0.1065 0.4579 -0.1065 0.4579 -0.3220 -0.1205 -0.1105 -0.2202 0.3602 0.4080 0.3574 0.1664 -0.2552
hpgl0319 HPGL0319 fail_nil d218 3 #A66753 HPGL0319 0.1198 0.2314 0.1198 0.2314 0.3218 0.2202 -0.5008 -0.0235 -0.3830 0.3835 -0.3525 0.1397 0.0888
hpgl0320 HPGL0320 fail_inf d218 3 #7FA718 HPGL0320 0.3896 -0.2161 0.3896 -0.2161 -0.2836 -0.1892 0.5043 0.0106 0.0254 0.3283 -0.4241 0.2195 0.1054
hpgl0321 HPGL0321 fail_nil d119 4 #A66753 HPGL0321 0.1396 -0.3143 0.1396 -0.3143 -0.4978 0.0592 -0.2508 -0.1714 -0.3503 0.0126 0.2930 -0.4535 0.2013
hpgl0322 HPGL0322 fail_inf d119 4 #7FA718 HPGL0322 0.3777 0.2525 0.3777 0.2525 0.4887 -0.0526 0.2697 0.1485 0.1602 0.0462 0.3115 -0.4407 0.2343
hpgl0640 HPGL0640 fail_nil d1025 5 #A66753 HPGL0640 0.1264 0.1341 0.1264 0.1341 0.1541 -0.3528 0.1303 -0.3912 -0.4254 -0.4681 0.0757 0.2027 -0.3429
hpgl0641 HPGL0641 fail_inf d1025 5 #7FA718 HPGL0641 0.3960 -0.0986 0.3960 -0.0986 -0.1283 0.3975 -0.1947 0.4460 0.2125 -0.3522 0.0916 0.2524 -0.3124
hpgl0642 HPGL0642 respond_nil d1018 6 #8068AE HPGL0642 -0.3682 0.2365 -0.3682 0.2365 -0.1727 -0.3045 -0.0131 0.5093 -0.1530 -0.2157 0.0411 0.2196 0.4725
hpgl0643 HPGL0643 respond_inf d1018 6 #D03792 HPGL0643 -0.1489 -0.2125 -0.1489 -0.2125 0.1601 0.2939 -0.0074 -0.4994 0.3562 -0.2207 0.0274 0.2890 0.4776

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11
hpgl0315 HPGL0315 respond_nil d202 1 #8068AE HPGL0315 -0.1724 -0.1313 -0.1724 -0.1313 0.0850 0.3823 0.2579 0.1408 0.1885 0.3931 0.3326 -0.1472 0.5546
hpgl0316 HPGL0316 respond_inf d202 1 #D03792 HPGL0316 0.1530 -0.4233 0.1530 -0.4233 0.1281 -0.0442 -0.3911 -0.2939 -0.3162 -0.2511 -0.2465 -0.0906 0.4737
hpgl0317 HPGL0317 respond_nil d209 2 #8068AE HPGL0317 -0.3327 0.3810 -0.3327 0.3810 0.4853 -0.3070 -0.4018 -0.1349 0.1432 0.0344 0.2918 0.2111 0.0027
hpgl0318 HPGL0318 respond_inf d209 2 #D03792 HPGL0318 0.4605 0.3580 0.4605 0.3580 0.4121 0.1045 0.4365 -0.1383 0.0418 0.0189 -0.3998 0.1530 0.0273
hpgl0319 HPGL0319 fail_nil d218 3 #A66753 HPGL0319 -0.1350 0.4275 -0.1350 0.4275 -0.4226 0.1166 -0.2395 0.4566 0.1241 -0.2387 -0.3552 0.0406 0.2396
hpgl0320 HPGL0320 fail_inf d218 3 #7FA718 HPGL0320 0.3112 0.1516 0.3112 0.1516 -0.3119 -0.3970 0.1437 0.1468 -0.5456 0.1669 0.3898 0.1324 0.0684
hpgl0321 HPGL0321 fail_nil d119 4 #A66753 HPGL0321 -0.4615 -0.4070 -0.4615 -0.4070 0.0722 -0.0268 0.2408 0.2140 -0.2039 0.0634 -0.2710 0.5076 -0.2274
hpgl0322 HPGL0322 fail_inf d119 4 #7FA718 HPGL0322 0.2039 -0.1102 0.2039 -0.1102 -0.4058 0.2749 -0.0911 -0.4357 0.3578 -0.1094 0.2424 0.4482 -0.1577
hpgl0640 HPGL0640 fail_nil d1025 5 #A66753 HPGL0640 -0.3903 0.1696 -0.3903 0.1696 -0.2955 -0.1252 0.1962 -0.5260 -0.0806 0.1818 -0.2153 -0.4568 -0.1512
hpgl0641 HPGL0641 fail_inf d1025 5 #7FA718 HPGL0641 0.1354 -0.3103 0.1354 -0.3103 0.0088 -0.5378 0.2112 0.2144 0.5261 -0.2638 0.0486 -0.2650 -0.0562
hpgl0642 HPGL0642 respond_nil d1018 6 #8068AE HPGL0642 -0.0559 0.0370 -0.0559 0.0370 0.1855 0.4169 0.0788 0.1290 -0.2734 -0.5351 0.3236 -0.3073 -0.3475
hpgl0643 HPGL0643 respond_inf d1018 6 #D03792 HPGL0643 0.2839 -0.1427 0.2839 -0.1427 0.0588 0.1429 -0.4415 0.2272 0.0382 0.5395 -0.1410 -0.2260 -0.4264
## Graphing number of non-zero genes with respect to CPM by library.
## Graphing library sizes.
## Graphing a boxplot.
## This data will benefit from being displayed on the log scale.
## If this is not desired, set scale='raw'
## Some data are negative.  We are on log scale, setting them to 0.
## Changed 1929 negative features.
## Some entries are 0.  We are on log scale, adding 1 to the data.
## Changed 1929 zero count features.
## Graphing a correlation heatmap.
## Graphing a standard median correlation.
## Performing correlation.
## Graphing a distance heatmap.
## Graphing a standard median distance.
## Performing distance.
## Graphing a PCA plot.
## Graphing a T-SNE plot.
## Plotting a density plot.
## This data will benefit from being displayed on the log scale.
## If this is not desired, set scale='raw'
## Some data are negative.  We are on log scale, setting them to 0.5.
## Changed 1929 negative features.
## Plotting a CV plot.
## Naively calculating coefficient of variation/dispersion with respect to condition.
## Finished calculating dispersion estimates.
## Plotting the representation of the top-n genes.
## Plotting the expression of the top-n PC loaded genes.
## Printing a color to condition legend.

The PCA plot of the combat adjusted data suggests that it might actually work out ok. Let us look at the other metrics.

4 Differential Expression of antimonial host samples

## Testing method: limma.
## Adding method: limma to the set.
## Testing method: deseq.
## Adding method: deseq to the set.
## Testing method: edger.
## Adding method: edger to the set.
## Testing method: ebseq.
## Adding method: ebseq to the set.
## Testing method: basic.
## Adding method: basic to the set.
## Warning in cor(x = fs[["x"]], y = fs[["y"]], method = cor_method): the
## standard deviation is zero

## Warning in cor(x = fs[["x"]], y = fs[["y"]], method = cor_method): the
## standard deviation is zero
## fail_respond_inf fail_respond_nil             fail          respond 
##           0.2371           0.1971           0.6620           0.6337

5 Try ontology searches with the host data.

## Performing gProfiler GO search of 622 genes against hsapiens.
## GO search found 187 hits.
## Performing gProfiler KEGG search of 622 genes against hsapiens.
## KEGG search found 7 hits.
## Performing gProfiler REAC search of 622 genes against hsapiens.
## REAC search found 31 hits.
## Performing gProfiler MI search of 622 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 622 genes against hsapiens.
## TF search found 84 hits.
## Performing gProfiler CORUM search of 622 genes against hsapiens.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 622 genes against hsapiens.
## HP search found 1 hits.

## Performing gProfiler GO search of 1329 genes against hsapiens.
## GO search found 213 hits.
## Performing gProfiler KEGG search of 1329 genes against hsapiens.
## KEGG search found 8 hits.
## Performing gProfiler REAC search of 1329 genes against hsapiens.
## REAC search found 12 hits.
## Performing gProfiler MI search of 1329 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 1329 genes against hsapiens.
## TF search found 409 hits.
## Performing gProfiler CORUM search of 1329 genes against hsapiens.
## CORUM search found 1 hits.
## Performing gProfiler HP search of 1329 genes against hsapiens.
## HP search found 18 hits.

## Performing gProfiler GO search of 1033 genes against hsapiens.
## GO search found 366 hits.
## Performing gProfiler KEGG search of 1033 genes against hsapiens.
## KEGG search found 15 hits.
## Performing gProfiler REAC search of 1033 genes against hsapiens.
## REAC search found 44 hits.
## Performing gProfiler MI search of 1033 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 1033 genes against hsapiens.
## TF search found 135 hits.
## Performing gProfiler CORUM search of 1033 genes against hsapiens.
## CORUM search found 3 hits.
## Performing gProfiler HP search of 1033 genes against hsapiens.
## HP search found 2 hits.

## Performing gProfiler GO search of 658 genes against hsapiens.
## GO search found 136 hits.
## Performing gProfiler KEGG search of 658 genes against hsapiens.
## KEGG search found 5 hits.
## Performing gProfiler REAC search of 658 genes against hsapiens.
## REAC search found 7 hits.
## Performing gProfiler MI search of 658 genes against hsapiens.
## MI search found 0 hits.
## Performing gProfiler TF search of 658 genes against hsapiens.
## TF search found 151 hits.
## Performing gProfiler CORUM search of 658 genes against hsapiens.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 658 genes against hsapiens.
## HP search found 0 hits.

6 Try a search for cell types and GSEA

## This function will replace the expt$expressionset slot with:
## cbcb(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is 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: cbcb
## Removing 6998 low-count genes (11849 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.
## Converting the rownames() of the expressionset to ENTREZID.
## Converting the rownames() of the expressionset to ENTREZID.
## Before conversion, the expressionset has 11849 entries.
## After conversion, the expressionset has 11900 entries.
## Mapping identifiers between gene sets and feature names
## Estimating GSVA scores for 2990 gene sets.
## Computing observed enrichment scores
## Estimating ECDFs with Poisson kernels
## Allocating cluster
## Estimating enrichment scores in parallel
## Taking diff of max KS.
## Cleaning up
## Before removal, there were 2990 entries.
## Now there are 428 entries.
## Percent kept: 21.055, -38.837, 6.811, 19.056, 2.511, 5.844, 15.271, 12.715, -11.998, -24.376, -22.480, 18.239
## Percent removed: 78.945, 138.837, 93.189, 80.944, 97.489, 94.156, 84.729, 87.285, 111.998, 124.376, 122.480, 81.761

## The biomart annotations file already exists, loading from it.
## xCell strongly perfers rpkm values, re-normalizing now.
## This function will replace the expt$expressionset slot with:
## rpkm(data)
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is 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
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## 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 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: not doing count filtering.
## Step 2: not normalizing the data.
## Step 3: converting the data with rpkm.
## Step 4: not transforming the data.
## Step 5: not doing batch correction.
## Loading required namespace: xCell

7 Repeat using the parasite data

## Using a subset expression.
## There were 33, now there are 6 samples.

## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is 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: cbcb
## Removing 0 low-count genes (8841 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 93 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.

## This function will replace the expt$expressionset slot with:
## log2(svaseq(simple(data)))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is 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 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: simple
## Removing 114 low-count genes (8727 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## Step 4: transforming the data with log2.
## transform_counts: Found 7670 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with svaseq.
## 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.
## Passing off to all_adjusters.
## batch_counts: Before batch/surrogate estimation, 40937 entries are x>1: 78.2%.
## batch_counts: Before batch/surrogate estimation, 7670 entries are x==0: 14.6%.
## The be method chose 1 surrogate variable(s).
## Attempting svaseq estimation with 1 surrogates.
## There are 15939 (30.4%) elements which are < 0 after batch correction.

7.0.1 Also try antimonials

human_expt <- create_expt(file="all_samples-hsapiens.xlsx")
antimonial_expt <- expt_subset(human_expt, subset="condition=='respond_nil'|condition=='respond_inf'|condition=='fail_nil'|condition=='fail_inf'")
antimonial_expt$colors <- c("blue","blue","red","red","black","black","green","green","red","green","blue","black")
antimonial_metrics <- graph_metrics(antimonial_expt)
antimonial_metrics$libsize
antimonial_norm <- normalize_expt(antimonial_expt, transform="log2", convert="cpm", filter_low=TRUE, norm="quant")
antimonialnorm_metrics <- graph_metrics(antimonial_norm)
antimonialnorm_metrics$pcaplot
antimonialnorm_metrics$corheat
antimonialnorm_metrics$disheat
antimonial_nb <- normalize_expt(antimonial_expt, transform="log2", convert="cpm", filter_low=TRUE, norm="quant", batch="combat")
antimonialnb_metrics <- graph_metrics(antimonial_nb)
antimonialnb_metrics$pcaplot
pp("images/antimonial_batch_corheat.png")
antimonialnb_metrics$corheat
dev.off()

## Reread the parasite sample sheet to play with other covariants
## Wow, from the parasite perspective, it seems they cluster much more tightly by strain
parasite_expt <- create_expt(file="all_samples-lpanamensis_patientbatch.xlsx")
antipara_expt <-  expt_subset(parasite_expt, subset="condition=='ant_good'|condition=='ant_bad'")
antipara_metrics <- graph_metrics(antipara_expt)
antipara_metrics$pcaplot
antipara_norm <- normalize_expt(antipara_expt, transform="log2", convert="cpm", filter_low=TRUE, norm="quant", batch="combat")
antiparanorm_metrics <- graph_metrics(antipara_norm)
antiparanorm_metrics$pcaplot
antiparanorm_metrics$corheat

8 Something silly

## Warning in strsplit(x = numbers, split = ""): input string 1914 is invalid
## UTF-8
## Warning in strsplit(x = numbers, split = ""): input string 1915 is invalid
## UTF-8
## Warning in strsplit(x = numbers, split = ""): input string 1916 is invalid
## UTF-8
## Warning in strsplit(x = numbers, split = ""): input string 1917 is invalid
## UTF-8

9 Save the results.

## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset c2881f6d97e1ec981fd1481cf46d6bc875fac423
## This is hpgltools commit: Tue Oct 22 10:22:30 2019 -0400: c2881f6d97e1ec981fd1481cf46d6bc875fac423
## Saving to 02_antimonial_estimation_20190914-v20190914.rda.xz

R version 3.6.1 (2019-07-05)

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

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

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

other attached packages: Heatplus(v.2.31.0), GSVAdata(v.1.21.0), org.Hs.eg.db(v.3.8.2), foreach(v.1.4.7), ruv(v.0.9.7.1), hpgltools(v.1.0), Biobase(v.2.45.1) and BiocGenerics(v.0.31.6)

loaded via a namespace (and not attached): snow(v.0.4-3), backports(v.1.1.5), Hmisc(v.4.2-0), BiocFileCache(v.1.9.1), plyr(v.1.8.4), lazyeval(v.0.2.2), GSEABase(v.1.47.0), splines(v.3.6.1), BiocParallel(v.1.19.4), GenomeInfoDb(v.1.21.2), ggplot2(v.3.2.1), sva(v.3.33.1), digest(v.0.6.22), htmltools(v.0.4.0), gdata(v.2.18.0), magrittr(v.1.5), checkmate(v.1.9.4), memoise(v.1.1.0), cluster(v.2.1.0), doParallel(v.1.0.15), openxlsx(v.4.1.0.1), limma(v.3.41.18), fastcluster(v.1.1.25), Biostrings(v.2.53.2), annotate(v.1.63.0), matrixStats(v.0.55.0), askpass(v.1.1), prettyunits(v.1.0.2), colorspace(v.1.4-1), blob(v.1.2.0), rappdirs(v.0.3.1), ggrepel(v.0.8.1), xfun(v.0.10), dplyr(v.0.8.3), crayon(v.1.3.4), RCurl(v.1.95-4.12), graph(v.1.63.0), genefilter(v.1.67.1), zeallot(v.0.1.0), survival(v.2.44-1.1), iterators(v.1.0.12), glue(v.1.3.1), gtable(v.0.3.0), zlibbioc(v.1.31.0), XVector(v.0.25.0), DelayedArray(v.0.11.8), DEoptimR(v.1.0-8), scales(v.1.0.0), DBI(v.1.0.0), edgeR(v.3.27.13), Rcpp(v.1.0.2), xtable(v.1.8-4), progress(v.1.2.2), htmlTable(v.1.13.2), xCell(v.1.1.0), foreign(v.0.8-72), bit(v.1.1-14), OrganismDbi(v.1.27.1), preprocessCore(v.1.47.1), Formula(v.1.2-3), stats4(v.3.6.1), GSVA(v.1.33.4), htmlwidgets(v.1.5.1), httr(v.1.4.1), gplots(v.3.0.1.1), RColorBrewer(v.1.1-2), acepack(v.1.4.1), pkgconfig(v.2.0.3), XML(v.3.98-1.20), nnet(v.7.3-12), dbplyr(v.1.4.2), locfit(v.1.5-9.1), tidyselect(v.0.2.5), labeling(v.0.3), rlang(v.0.4.1), reshape2(v.1.4.3), later(v.1.0.0), AnnotationDbi(v.1.47.1), munsell(v.0.5.0), tools(v.3.6.1), RSQLite(v.2.1.2), evaluate(v.0.14), stringr(v.1.4.0), fastmap(v.1.0.1), yaml(v.2.2.0), knitr(v.1.25), bit64(v.0.9-7), pander(v.0.6.3), zip(v.2.0.4), robustbase(v.0.93-5), caTools(v.1.17.1.2), Vennerable(v.3.1.0.9000), purrr(v.0.3.3), RBGL(v.1.61.0), nlme(v.3.1-141), mime(v.0.7), pracma(v.2.2.5), biomaRt(v.2.41.9), shinythemes(v.1.1.2), compiler(v.3.6.1), rstudioapi(v.0.10), curl(v.4.2), tibble(v.2.1.3), geneplotter(v.1.63.0), stringi(v.1.4.3), highr(v.0.8), GenomicFeatures(v.1.37.4), lattice(v.0.20-38), Matrix(v.1.2-17), vctrs(v.0.2.0), pillar(v.1.4.2), BiocManager(v.1.30.8), data.table(v.1.12.6), bitops(v.1.0-6), corpcor(v.1.6.9), httpuv(v.1.5.2), rtracklayer(v.1.45.6), GenomicRanges(v.1.37.17), R6(v.2.4.0), latticeExtra(v.0.6-28), directlabels(v.2018.05.22), promises(v.1.1.0), KernSmooth(v.2.23-16), gridExtra(v.2.3), IRanges(v.2.19.17), codetools(v.0.2-16), MASS(v.7.3-51.4), gtools(v.3.8.1), assertthat(v.0.2.1), SummarizedExperiment(v.1.15.9), gProfileR(v.0.6.8), openssl(v.1.4.1), DESeq2(v.1.25.17), GenomicAlignments(v.1.21.7), Rsamtools(v.2.1.7), S4Vectors(v.0.23.25), GenomeInfoDbData(v.1.2.1), mgcv(v.1.8-29), hms(v.0.5.1), doSNOW(v.1.0.18), quadprog(v.1.5-7), grid(v.3.6.1), rpart(v.4.1-15), rmarkdown(v.1.16), Rtsne(v.0.15), shiny(v.1.4.0) and base64enc(v.0.1-3)

LS0tCnRpdGxlOiAiTC5wYW5hbWVuc2lzIDIwMTkwOTogQW50aW1vbmlhbCBSZXNwb25zZSBTYW1wbGUgRXN0aW1hdGlvbi4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQprbml0cjo6b3B0c19rbml0JHNldChwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTkwLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy53aWR0aD04LAogICAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodD04LAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpzZXQuc2VlZCgxKQp2ZXIgPC0gIjIwMTkwOTE0IgpwcmV2aW91c19maWxlIDwtICIwMV9hbm5vdGF0aW9uXzIwMTkwOTE0LlJtZCIKCnRtcCA8LSB0cnkoc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpKQpybWRfZmlsZSA8LSAiMDJfYW50aW1vbmlhbF9lc3RpbWF0aW9uXzIwMTkwOTE0LlJtZCIKYGBgCgpSTkEgc2VxdWVuY2luZyBvZiBMLiBwYW5hbWVuc2lzOiBBbnRpbW9uaWFsIHJlc3BvbnNlcy4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIGRvY3VtZW50IHNlZWtzIHRvIGV4cGxvcmUgdGhlIGRpZmZlcmVuY2VzIGluIHNhbXBsZXMgd2hpY2ggZGlkIGFuZCBkaWQtbm90IHJlc3BvbmQgdG8gZHJ1Zwp0cmVhdG1lbnQgZHVyaW5nIGluZmVjdGlvbi4KCiMgQW50aW1vbmlhbCBob3N0IHJlc3BvbnNlcwoKRXh0cmFjdCB0aGUgYW50aW1vbmlhbCBzYW1wbGVzIGZyb20gdGhlIGV4cGVyaW1lbnQuCgpgYGB7ciBleHBfc3Vic2V0fQphbnQgPC0gc3Vic2V0X2V4cHQoaHNfY2RzX2V4cHQsIHN1YnNldD0iY29uZGl0aW9uPT0ncmVzcG9uZF9uaWwnfGNvbmRpdGlvbj09J3Jlc3BvbmRfaW5mJ3xjb25kaXRpb249PSdmYWlsX25pbCd8Y29uZGl0aW9uPT0nZmFpbF9pbmYnIikKYW50JGNvbG9ycyA8LSBnc3ViKHBhdHRlcm49IkNEOTYwQyIsIHJlcGxhY2VtZW50PSIwMDU1MDAiLCB4PWFudCRjb2xvcnMpCmFudCRjb2xvcnMgPC0gZ3N1YihwYXR0ZXJuPSJBQTdBMUEiLCByZXBsYWNlbWVudD0iODgwMDAwIiwgeD1hbnQkY29sb3JzKQphbnQkY29sb3JzIDwtIGdzdWIocGF0dGVybj0iODg2RTNFIiwgcmVwbGFjZW1lbnQ9IjAwMDBFRSIsIHg9YW50JGNvbG9ycykKYW50JGNvbG9ycyA8LSBnc3ViKHBhdHRlcm49IjY2NjY2NiIsIHJlcGxhY2VtZW50PSI3Nzc3NzciLCB4PWFudCRjb2xvcnMpCmBgYAoKIyMgR3JhcGggYW50aW1vbmlhbCBob3N0IG1ldHJpY3MKCmBgYHtyIGFudGltb25pYWxfbWV0cmljcywgZmlnLnNob3c9ImhpZGUifQphbnRfbWV0IDwtIHN1cHByZXNzTWVzc2FnZXMoZ3JhcGhfbWV0cmljcyhhbnQpKQpgYGAKCkxldHMgdGFrZSBhIGxvb2sgYXQgdGhlIGRhdGEgYmVmb3JlIG5vcm1hbGl6YXRpb24uCgpgYGB7ciB2aXN1YWxpemVfcHJlfQphbnRfbWV0JGxpYnNpemUKYW50X21ldCRub256ZXJvCmBgYAoKIyBOb3JtYWxpemUgYW50aW1vbmlhbCBob3N0IHNhbXBsZXMKClBlcmZvcm0gYW4gaW5pdGlhbCBzYW1wbGUgbm9ybWFsaXphdGlvbiBhbmQgc2VlIGhvdyB0aGV5IGxvb2suCgpgYGB7ciBub3JtYWxpemV9CmFub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGFudCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwgZmlsdGVyPVRSVUUsIG5vcm09InF1YW50IikKYGBgCgpgYGB7ciBncmFwaF9ub3JtYWxpemVkLCBmaWcuc2hvdz0iaGlkZSJ9CmFub3JtX21ldCA8LSBncmFwaF9tZXRyaWNzKGFub3JtKQpgYGAKCkRvIHRoZXNlIHNhbXBsZXMgc2VncmVnYXRlIGluIHdheXMgd2hpY2ggbWFrZSBzZW5zZT8KCmBgYHtyIHZpc3VhbGl6ZV9ub3JtYWxpemVkfQpub3JtX3BjYSA8LSBwbG90X3BjYShhbm9ybSkKbm9ybV9wY2EkcGxvdAprbml0cjo6a2FibGUobm9ybV9wY2EkdGFibGUpCndyaXRlLmNzdihmaWxlPWdsdWU6OmdsdWUoImV4Y2VsL2FudGltb25pYWxfcGNhX25vcm1fdGFibGUtdnt2ZXJ9LmNzdiIpLAogICAgICAgICAgbm9ybV9wY2EkdGFibGUpCgphbm9ybV9tZXQkY29yaGVhdApgYGAKCiMjIEJhdGNoIG5vcm1hbGl6ZSBhbnRpbW9uaWFsIGhvc3Qgc2FtcGxlcwoKVGhlIGJhdGNoIGVmZmVjdCBpcyBwcmV0dHkgc2V2ZXJlLCB3aGF0IGhhcHBlbnMgaWYgd2UgdHJ5IGNvbWJhdCBvbiBpdD8KCmBgYHtyIGJhdGNoX2NvcnJlY3R9CmFiYXRjaF9jb21iYXQgPC0gc20obm9ybWFsaXplX2V4cHQoYW50LCBmaWx0ZXI9VFJVRSwgbm9ybT0icXVhbnQiLCBiYXRjaD0iY29tYmF0IikpCmFiYXRjaF9zY2FsZSA8LSBzbShub3JtYWxpemVfZXhwdChhbnQsIGZpbHRlcj1UUlVFLCBub3JtPSJxdWFudCIsIGJhdGNoPSJjb21iYXRfc2NhbGUiKSkKYWJhdGNoX3N2YSA8LSBzbShub3JtYWxpemVfZXhwdChhbnQsIGZpbHRlcj1UUlVFLCBub3JtPSJxdWFudCIsIGJhdGNoPSJzdmFzZXEiLCBjb252ZXJ0PSJjcG0iKSkKYWJhdGNoX3BjYSA8LSBwbG90X3BjYShhYmF0Y2hfc2NhbGUpCmFiYXRjaF9wY2EkcGxvdAprbml0cjo6a2FibGUoYWJhdGNoX3BjYSR0YWJsZSkKd3JpdGUuY3N2KGZpbGU9Z2x1ZTo6Z2x1ZSgiZXhjZWwvYW50aW1vbmlhbF9wY2FfYmF0Y2hfdGFibGUtdnt2ZXJ9LmNzdiIpLAogICAgICAgICAgYWJhdGNoX3BjYSR0YWJsZSkKCmFzdmFfcGNhIDwtIHBsb3RfcGNhKGFiYXRjaF9zdmEpCmFzdmFfcGNhJHBsb3QKa25pdHI6OmthYmxlKGFzdmFfcGNhJHRhYmxlKQp3cml0ZS5jc3YoZmlsZT1nbHVlOjpnbHVlKCJleGNlbC9hbnRpbW9uaWFsX3BjYV9zdmFfdGFibGUtdnt2ZXJ9LmNzdiIpLAogICAgICAgICAgYXN2YV9wY2EkdGFibGUpCmBgYAoKYGBge3IgZ3JhcGhfYmF0Y2hlZCwgZmlnLnNob3c9ImhpZGUifQphYmF0Y2hfbWV0IDwtIGdyYXBoX21ldHJpY3MoYWJhdGNoX3NjYWxlKQpgYGAKClRoZSBQQ0EgcGxvdCBvZiB0aGUgY29tYmF0IGFkanVzdGVkIGRhdGEgc3VnZ2VzdHMgdGhhdCBpdCBtaWdodCBhY3R1YWxseSB3b3JrIG91dCBvay4KTGV0IHVzIGxvb2sgYXQgdGhlIG90aGVyIG1ldHJpY3MuCgpgYGB7ciB2aXNfYmF0Y2h9CmFiYXRjaF9tZXQkZGVuc2l0eQojIyBUaGUgcXVhbnRpbGUgbm9ybWFsaXphdGlvbiBzbWFzaGVkIHRoZSBkaWZmZXJlbmNlcyBpbiBkaXN0cmlidXRpb24KYWJhdGNoX21ldCRjb3JoZWF0CmFiYXRjaF9tZXQkc21jCmBgYAoKIyBEaWZmZXJlbnRpYWwgRXhwcmVzc2lvbiBvZiBhbnRpbW9uaWFsIGhvc3Qgc2FtcGxlcwoKYGBge3IgYW50aW1vbmlhbGhvc3RfZGV9CmFudGlfaG9zdF9jb21iYXRfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKGFiYXRjaF9zY2FsZSwgZm9yY2U9VFJVRSwgbW9kZWxfYmF0Y2g9RkFMU0UpKQphbnRpX2hvc3RfY29tYmF0X2RlJGNvbXBhcmlzb24kaGVhdApsaW1tYV90YWJsZSA8LSBhbnRpX2hvc3RfY29tYmF0X2RlJGxpbW1hJGFsbF90YWJsZXMkcmVzcG9uZF9pbmZfdnNfZmFpbF9pbmYKZGVfcGxvdHMgPC0gZXh0cmFjdF9kZV9wbG90cyhhbnRpX2hvc3RfY29tYmF0X2RlLCB0YWJsZT0icmVzcG9uZF9pbmZfdnNfZmFpbF9pbmYiKQpkZV9wbG90cyRtYSRwbG90CmBgYAoKYGBge3IgYW50aW1vbnlfaG9zdHNfdGFibGVzLCBmaWcuc2hvdz0iaGlkZSJ9CmFudGltb255X2NvbnRyYXN0cyA8LSBsaXN0KAogICAgImZhaWxfcmVzcG9uZF9pbmYiID0gYygiZmFpbF9pbmYiLCAicmVzcG9uZF9pbmYiKSwKICAgICJmYWlsX3Jlc3BvbmRfbmlsIiA9IGMoImZhaWxfbmlsIiwgInJlc3BvbmRfbmlsIiksCiAgICAiZmFpbCIgPSBjKCJmYWlsX2luZiIsICJmYWlsX25pbCIpLAogICAgInJlc3BvbmQiID0gYygicmVzcG9uZF9pbmYiLCAicmVzcG9uZF9uaWwiKSkKYW50aW1vbnlfdGFibGVzIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIGFudGlfaG9zdF9jb21iYXRfZGUsCiAgZXhjZWw9Z2x1ZTo6Z2x1ZSgiZXhjZWwvYW50aW1vbnlfY29tYmF0X3RhYmxlcy12e3Zlcn0ueGxzeCIpLAogIGtlZXBlcnM9YW50aW1vbnlfY29udHJhc3RzLCBhbm5vdF9kZj1oc19hbm5vdGF0aW9ucykpCiMjYW50aW1vbnlfdGFibGVzJHBsb3RzW1siZmFpbCJdXQphbnRpbW9ueV9zaWdfdGFibGVzIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgYW50aW1vbnlfdGFibGVzLAogIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2FudGltb255X3NpZ25pZmljYW50X2dlbmVzLXZ7dmVyfS54bHN4IiksCiAgYWNjb3JkaW5nX3RvPSJhbGwiKSkKCmFudGlfaG9zdF9zdmEgPC0gc20oYWxsX3BhaXJ3aXNlKGFudCwgbW9kZWxfYmF0Y2g9InN2YXNlcSIsIGZpbHRlcj1UUlVFKSkKYW50aV9ob3N0X3RhYmxlcyA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBhbnRpX2hvc3Rfc3ZhLAogIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL2FudGltb255X3N2YV90YWJsZXMtdnt2ZXJ9Lnhsc3giKSwKICBrZWVwZXJzPWFudGltb255X2NvbnRyYXN0cykpCmFudGlfaG9zdF9wbG90cyA8LSBleHRyYWN0X2RlX3Bsb3RzKGFudGlfaG9zdF90YWJsZXMsIHRhYmxlPSJmYWlsIiwgdHlwZT0iZGVzZXEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD01KQphbnRpX2hvc3RfcGxvdHMkdm9sY2FubyRwbG90CgphbnRpX2NvbXBhcmlzb24gPC0gY29tcGFyZV9kZV9yZXN1bHRzKGFudGltb255X3RhYmxlcywgYW50aV9ob3N0X3RhYmxlcykKYW50aV9jb21wYXJpc29uJGxvZ2ZjCmBgYAoKIyBUcnkgb250b2xvZ3kgc2VhcmNoZXMgd2l0aCB0aGUgaG9zdCBkYXRhLgoKYGBge3IgaG9zdF9vbnRvbG9neX0KdXBnZW5lc19mYWlsX3Jlc3BvbmRfaW5mZWN0ZWQgPC0gYW50aW1vbnlfc2lnX3RhYmxlc1tbImRlc2VxIl1dW1sidXBzIl1dW1siZmFpbF9yZXNwb25kX2luZiJdXQpmYWlsX3Jlc3BvbmRfaW5mX3VwX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIodXBnZW5lc19mYWlsX3Jlc3BvbmRfaW5mZWN0ZWQsIGZpcnN0X2NvbD0iZGVzZXFfbG9nZmMiKQpmYWlsX3Jlc3BvbmRfaW5mX3VwX2dwJHB2YWx1ZV9wbG90cyRtZnBfcGxvdF9vdmVyCmZhaWxfcmVzcG9uZF9pbmZfdXBfZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCmZhaWxfcmVzcG9uZF9pbmZfdXBfZ3AkcHZhbHVlX3Bsb3RzJHRmX3Bsb3Rfb3ZlcgpmYWlsX3Jlc3BvbmRfaW5mX3VwX2dwJHB2YWx1ZV9wbG90cyRyZWFjdG9tZV9wbG90X292ZXIKZmFpbF9yZXNwb25kX2luZl91cF9ncCRwdmFsdWVfcGxvdHMkYnBwX3Bsb3Rfb3ZlcgoKZG5nZW5lc19mYWlsX3Jlc3BvbmRfaW5mZWN0ZWQgPC0gYW50aW1vbnlfc2lnX3RhYmxlc1tbImRlc2VxIl1dW1siZG93bnMiXV1bWyJmYWlsX3Jlc3BvbmRfaW5mIl1dCmZhaWxfcmVzcG9uZF9pbmZfZG5fZ3AgPC0gc2ltcGxlX2dwcm9maWxlcihkbmdlbmVzX2ZhaWxfcmVzcG9uZF9pbmZlY3RlZCwgZmlyc3RfY29sPSJkZXNlcV9sb2dmYyIpCmZhaWxfcmVzcG9uZF9pbmZfZG5fZ3AkcHZhbHVlX3Bsb3RzJG1mcF9wbG90X292ZXIKZmFpbF9yZXNwb25kX2luZl9kbl9ncCRwdmFsdWVfcGxvdHMka2VnZ19wbG90X292ZXIKZmFpbF9yZXNwb25kX2luZl9kbl9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmZhaWxfcmVzcG9uZF9pbmZfZG5fZ3AkcHZhbHVlX3Bsb3RzJGJwcF9wbG90X292ZXIKCgp1cGdlbmVzX2ZhaWxfcmVzcG9uZF91bmluZmVjdGVkIDwtIGFudGltb255X3NpZ190YWJsZXNbWyJkZXNlcSJdXVtbInVwcyJdXVtbImZhaWxfcmVzcG9uZF9uaWwiXV0KZmFpbF9yZXNwb25kX3VuaW5mX3VwX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIodXBnZW5lc19mYWlsX3Jlc3BvbmRfdW5pbmZlY3RlZCwgZmlyc3RfY29sPSJkZXNlcV9sb2dmYyIpCmZhaWxfcmVzcG9uZF91bmluZl91cF9ncCRwdmFsdWVfcGxvdHMkbWZwX3Bsb3Rfb3ZlcgpmYWlsX3Jlc3BvbmRfdW5pbmZfdXBfZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCmZhaWxfcmVzcG9uZF91bmluZl91cF9ncCRwdmFsdWVfcGxvdHMkdGZfcGxvdF9vdmVyCmZhaWxfcmVzcG9uZF91bmluZl91cF9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmZhaWxfcmVzcG9uZF91bmluZl91cF9ncCRwdmFsdWVfcGxvdHMkYnBwX3Bsb3Rfb3ZlcgoKZG5nZW5lc19mYWlsX3Jlc3BvbmRfdW5pbmZlY3RlZCA8LSBhbnRpbW9ueV9zaWdfdGFibGVzW1siZGVzZXEiXV1bWyJkb3ducyJdXVtbImZhaWxfcmVzcG9uZF9uaWwiXV0KZmFpbF9yZXNwb25kX3VuaW5mX2RuX2dwIDwtIHNpbXBsZV9ncHJvZmlsZXIoZG5nZW5lc19mYWlsX3Jlc3BvbmRfdW5pbmZlY3RlZCwgZmlyc3RfY29sPSJkZXNlcV9sb2dmYyIpCmZhaWxfcmVzcG9uZF91bmluZl9kbl9ncCRwdmFsdWVfcGxvdHMkbWZwX3Bsb3Rfb3ZlcgpmYWlsX3Jlc3BvbmRfdW5pbmZfZG5fZ3AkcHZhbHVlX3Bsb3RzJGtlZ2dfcGxvdF9vdmVyCmZhaWxfcmVzcG9uZF91bmluZl9kbl9ncCRwdmFsdWVfcGxvdHMkdGZfcGxvdF9vdmVyCmZhaWxfcmVzcG9uZF91bmluZl9kbl9ncCRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCmZhaWxfcmVzcG9uZF91bmluZl9kbl9ncCRwdmFsdWVfcGxvdHMkYnBwX3Bsb3Rfb3ZlcgpgYGAKCiMgVHJ5IGEgc2VhcmNoIGZvciBjZWxsIHR5cGVzIGFuZCBHU0VBCgpgYGB7ciBnc2VhX3hDZWxsfQphbnRfZmlsdCA8LSBub3JtYWxpemVfZXhwdChhbnQsIGZpbHRlcj1UUlVFKQpmYWlsX2dzYyA8LSBtYWtlX2dzY19mcm9tX2lkcyhmaXJzdF9pZHM9cm93bmFtZXModXBnZW5lc19mYWlsX3Jlc3BvbmRfaW5mZWN0ZWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfaWRzPXJvd25hbWVzKGRuZ2VuZXNfZmFpbF9yZXNwb25kX2luZmVjdGVkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R1ZHlfbmFtZT0iYW50aW1vbnlfcmVzcG9uc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeV9uYW1lPSJyZXNwb25zZSIpCmZhaWxfZ3N2YSA8LSBzaW1wbGVfZ3N2YShhbnRfZmlsdCkKZXhwdCA8LSBmYWlsX2dzdmEkZXhwdApleCA8LSBleHB0JGV4cHJlc3Npb25zZXQKcmVhY3RvbWVfaWR4IDwtIGdyZXAoeD1yb3duYW1lcyhleHBycyhleCkpLCBwYXR0ZXJuPSJeUkVBQ1RPTUUiKQpyZWFjdG9tZV9pZHMgPC0gcm93bmFtZXMoZXhwcnMoZXgpKVtyZWFjdG9tZV9pZHhdCmV4X3Jvd25hbWVzIDwtIHJvd25hbWVzKGV4cHJzKGV4KSkKZmRfcm93bmFtZXMgPC0gcm93bmFtZXMoZkRhdGEoZXgpKQpleHRyYSA8LSBmZF9yb3duYW1lcyAlaW4lIGV4X3Jvd25hbWVzCmZEYXRhKGV4KSA8LSBmRGF0YShleClbZXh0cmEsIF0KZXhwdCRleHByZXNzaW9uc2V0IDwtIGV4CnJlYWN0b21lIDwtIGV4Y2x1ZGVfZ2VuZXNfZXhwdChleHB0LCBtZXRob2Q9ImtlZXAiLCBpZHM9cmVhY3RvbWVfaWRzKQoKcm93X2xhYmVscyA8LSBnc3ViKHg9cm93bmFtZXMoZXhwcnMocmVhY3RvbWUpKSwgcGF0dGVybj0iXihbWzphbHBoYTpdXStfKT8oLiopJCIsIHJlcGxhY2VtZW50PSJcXDIiKQpnc3ZhX2hlYXQgPC0gcGxvdF9zYW1wbGVfaGVhdG1hcChyZWFjdG9tZSwgcm93X2xhYmVsPXJvd19sYWJlbHMpCgphbnRfeGNlbGwgPC0gc2ltcGxlX3hjZWxsKGFudCkKYW50X3hjZWxsJGhlYXRtYXAKYGBgCgojIFJlcGVhdCB1c2luZyB0aGUgcGFyYXNpdGUgZGF0YQoKYGBge3IgYW50aW1vbmlhbF9wYXJhc2l0ZX0KIyMgUmVyZWFkIHRoZSBwYXJhc2l0ZSBzYW1wbGUgc2hlZXQgdG8gcGxheSB3aXRoIG90aGVyIGNvdmFyaWFudHMKIyMgV293LCBmcm9tIHRoZSBwYXJhc2l0ZSBwZXJzcGVjdGl2ZSwgaXQgc2VlbXMgdGhleSBjbHVzdGVyIG11Y2ggbW9yZSB0aWdodGx5IGJ5IHN0cmFpbgpwYXJhc2l0ZV9leHB0IDwtIHNtKGNyZWF0ZV9leHB0KAogICJzYW1wbGVfc2hlZXRzL29sZC9hbGxfc2FtcGxlcy1scGFuYW1lbnNpcy54bHN4IiwKICBnZW5lX2luZm89bHBfYW5ub3RhdGlvbnMpKQphbnRpcGFyYV9leHB0IDwtIHN1YnNldF9leHB0KHBhcmFzaXRlX2V4cHQsIHN1YnNldD0iY29uZGl0aW9uPT0nYW50X2dvb2QnfGNvbmRpdGlvbj09J2FudF9iYWQnIikKYW50aXBhcmFfZXhwdCA8LSBzZXRfZXhwdF9iYXRjaGVzKGFudGlwYXJhX2V4cHQsIGZhY3Q9InN0cmFpbiIpCmFudGlwYXJhX21ldHJpY3MgPC0gc20oZ3JhcGhfbWV0cmljcyhhbnRpcGFyYV9leHB0KSkKYW50aXBhcmFfbm9ybSA8LSBub3JtYWxpemVfZXhwdChhbnRpcGFyYV9leHB0LCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IikKcGxvdF9wY2EoYW50aXBhcmFfbm9ybSkkcGxvdAoKYW50aXBhcmFfc3ZhIDwtIG5vcm1hbGl6ZV9leHB0KGFudGlwYXJhX2V4cHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyPSJzaW1wbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YXNlcSIpCnBsb3RfcGNhKGFudGlwYXJhX3N2YSkkcGxvdApgYGAKCgojIyMgQWxzbyB0cnkgYW50aW1vbmlhbHMKCgpgYGB7ciBhbnRpbW9ueV9pc19uYXN0eSwgZXZhbD1GQUxTRX0KaHVtYW5fZXhwdCA8LSBjcmVhdGVfZXhwdChmaWxlPSJhbGxfc2FtcGxlcy1oc2FwaWVucy54bHN4IikKYW50aW1vbmlhbF9leHB0IDwtIGV4cHRfc3Vic2V0KGh1bWFuX2V4cHQsIHN1YnNldD0iY29uZGl0aW9uPT0ncmVzcG9uZF9uaWwnfGNvbmRpdGlvbj09J3Jlc3BvbmRfaW5mJ3xjb25kaXRpb249PSdmYWlsX25pbCd8Y29uZGl0aW9uPT0nZmFpbF9pbmYnIikKYW50aW1vbmlhbF9leHB0JGNvbG9ycyA8LSBjKCJibHVlIiwiYmx1ZSIsInJlZCIsInJlZCIsImJsYWNrIiwiYmxhY2siLCJncmVlbiIsImdyZWVuIiwicmVkIiwiZ3JlZW4iLCJibHVlIiwiYmxhY2siKQphbnRpbW9uaWFsX21ldHJpY3MgPC0gZ3JhcGhfbWV0cmljcyhhbnRpbW9uaWFsX2V4cHQpCmFudGltb25pYWxfbWV0cmljcyRsaWJzaXplCmFudGltb25pYWxfbm9ybSA8LSBub3JtYWxpemVfZXhwdChhbnRpbW9uaWFsX2V4cHQsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcl9sb3c9VFJVRSwgbm9ybT0icXVhbnQiKQphbnRpbW9uaWFsbm9ybV9tZXRyaWNzIDwtIGdyYXBoX21ldHJpY3MoYW50aW1vbmlhbF9ub3JtKQphbnRpbW9uaWFsbm9ybV9tZXRyaWNzJHBjYXBsb3QKYW50aW1vbmlhbG5vcm1fbWV0cmljcyRjb3JoZWF0CmFudGltb25pYWxub3JtX21ldHJpY3MkZGlzaGVhdAphbnRpbW9uaWFsX25iIDwtIG5vcm1hbGl6ZV9leHB0KGFudGltb25pYWxfZXhwdCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwgZmlsdGVyX2xvdz1UUlVFLCBub3JtPSJxdWFudCIsIGJhdGNoPSJjb21iYXQiKQphbnRpbW9uaWFsbmJfbWV0cmljcyA8LSBncmFwaF9tZXRyaWNzKGFudGltb25pYWxfbmIpCmFudGltb25pYWxuYl9tZXRyaWNzJHBjYXBsb3QKcHAoImltYWdlcy9hbnRpbW9uaWFsX2JhdGNoX2NvcmhlYXQucG5nIikKYW50aW1vbmlhbG5iX21ldHJpY3MkY29yaGVhdApkZXYub2ZmKCkKCiMjIFJlcmVhZCB0aGUgcGFyYXNpdGUgc2FtcGxlIHNoZWV0IHRvIHBsYXkgd2l0aCBvdGhlciBjb3ZhcmlhbnRzCiMjIFdvdywgZnJvbSB0aGUgcGFyYXNpdGUgcGVyc3BlY3RpdmUsIGl0IHNlZW1zIHRoZXkgY2x1c3RlciBtdWNoIG1vcmUgdGlnaHRseSBieSBzdHJhaW4KcGFyYXNpdGVfZXhwdCA8LSBjcmVhdGVfZXhwdChmaWxlPSJhbGxfc2FtcGxlcy1scGFuYW1lbnNpc19wYXRpZW50YmF0Y2gueGxzeCIpCmFudGlwYXJhX2V4cHQgPC0gIGV4cHRfc3Vic2V0KHBhcmFzaXRlX2V4cHQsIHN1YnNldD0iY29uZGl0aW9uPT0nYW50X2dvb2QnfGNvbmRpdGlvbj09J2FudF9iYWQnIikKYW50aXBhcmFfbWV0cmljcyA8LSBncmFwaF9tZXRyaWNzKGFudGlwYXJhX2V4cHQpCmFudGlwYXJhX21ldHJpY3MkcGNhcGxvdAphbnRpcGFyYV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGFudGlwYXJhX2V4cHQsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcl9sb3c9VFJVRSwgbm9ybT0icXVhbnQiLCBiYXRjaD0iY29tYmF0IikKYW50aXBhcmFub3JtX21ldHJpY3MgPC0gZ3JhcGhfbWV0cmljcyhhbnRpcGFyYV9ub3JtKQphbnRpcGFyYW5vcm1fbWV0cmljcyRwY2FwbG90CmFudGlwYXJhbm9ybV9tZXRyaWNzJGNvcmhlYXQKYGBgCgpgYGB7ciBiZXR0ZXJfaGVhdG1hcHN9CmxpYnJhcnkoQmlvYmFzZSkKbGlicmFyeShIZWF0cGx1cykKaW5mZWN0aW9uX25vcm0gPC0gc20obm9ybWFsaXplX2V4cHQocGFyYXNpdGVfZXhwdCwgdHJhbnNmb3JtPSJyYXciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9InBvZmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtPSJxdWFudCIsIGJhdGNoPSJzdmEiKSkKaW5mZWN0X2RhdGEgPC0gZXhwcnMoaW5mZWN0aW9uX25vcm0kZXhwcmVzc2lvbnNldCkKY29ycmVsYXRpb25zIDwtIGhwZ2xfY29yKGluZmVjdF9kYXRhKQpkaXN0YW5jZXMgPC0gYXMubWF0cml4KGRpc3QodChpbmZlY3RfZGF0YSksIG1ldGhvZD0ibWluayIpKQoKZGVzaWduIDwtIGFzLmRhdGEuZnJhbWUoaW5mZWN0aW9uX25vcm0kZGVzaWduKQpyb3duYW1lcyhjb3JyZWxhdGlvbnMpIDwtIHBhc3RlMChyb3duYW1lcyhjb3JyZWxhdGlvbnMpLCAiXyIsIGFzLmNoYXJhY3RlcihkZXNpZ24kY29uZGl0aW9uKSkKY29sbmFtZXMoY29ycmVsYXRpb25zKSA8LSBwYXN0ZTAoY29sbmFtZXMoY29ycmVsYXRpb25zKSwgIl8iLCBhcy5jaGFyYWN0ZXIoZGVzaWduJGJhdGNoKSkKCmNvbF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUocERhdGEoaW5mZWN0aW9uX25vcm0pWywgYygic3RyYWluIiwgImNvbmRpdGlvbiIpXSkKcm93X2RhdGEgPC0gZGVzaWduWywgYygiYmF0Y2giLCJjb25kaXRpb24iKV0KY29sbmFtZXMoY29sX2RhdGEpIDwtIGMoInN0cmFpbiIsICJzZWxmaGVhbCIpCmNvbG5hbWVzKHJvd19kYXRhKSA8LSBjKCJ2b2x1bnRlZXIiLCJzZWxmaGVhbCIpCnJvd19kYXRhJHNlbGZoZWFsIDwtIGFzLm51bWVyaWMocm93X2RhdGEkc2VsZmhlYWwpCnJvd19kYXRhJHNlbGZoZWFsIDwtIGlmZWxzZShyb3dfZGF0YSRzZWxmaGVhbCA9PSAyLCBUUlVFLCBGQUxTRSkKbXlhbm5vdCA8LSBsaXN0KENvbD1saXN0KGRhdGE9Y29sX2RhdGEpLCBSb3c9bGlzdChkYXRhPXJvd19kYXRhKSkKbXlsYWJlbHMgPC0gbGlzdChSb3c9bGlzdChucm93PTEwKSwgQ29sPWxpc3QobnJvdz0xMCkpCgptYXAxIDwtIGFubkhlYXRtYXAyKGRpc3RhbmNlcywKICAgICAgICAgICAgICAgICAgICBjbHVzdGVyPWxpc3QoY3V0aD03MDAwKSwKICAgICAgICAgICAgICAgICAgICBhbm49bXlhbm5vdCwKICAgICAgICAgICAgICAgICAgICBsYWJlbHM9bXlsYWJlbHMpCiMjIDMgbnVtYmVycywgZGVuZHJvZ3JhbSwgcGxvdCwgYW5ub3RhdGlvbiB3aWR0aC9oZWlnaHQKcGxvdChtYXAxKQpgYGAKCiMgU29tZXRoaW5nIHNpbGx5CgpgYGB7ciBjb3VudF9udW1iZXJzfQp3b3JkcyA8LSBhcy5jaGFyYWN0ZXIodW5saXN0KGFzLmRhdGEuZnJhbWUocmVhZC5jc3YoInNhbXBsZV9zaGVldHMvdGVzdGluZy5jc3YiKSkpKQpudW1iZXJzIDwtIGdzdWIoeD13b3JkcywgcGF0dGVybj0iW1s6cHVuY3Q6XV0iLCByZXBsYWNlbWVudD0iIikKbnVtYmVycyA8LSBnc3ViKHg9bnVtYmVycywgcGF0dGVybj0iW1s6YWxwaGE6XV0iLCByZXBsYWNlbWVudD0iIikKbnVtYmVycyA8LSBhcy5mYWN0b3IoYXMubnVtZXJpYyh1bmxpc3Qoc3Ryc3BsaXQoeD1udW1iZXJzLCBzcGxpdD0iIikpKSkKbnVtYmVycyA8LSBudW1iZXJzWyFpcy5uYShudW1iZXJzKV0KYGBgCgojIFNhdmUgdGhlIHJlc3VsdHMuCgpgYGB7ciBzYXZlbWV9Cm1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQp0aGlzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1ybWRfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKQptZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHRoaXNfc2F2ZSkpCiMjdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQpgYGAKCmBgYHtyIGxvYWRtZSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KdG1wIDwtIHNtKGxvYWRtZShmaWxlbmFtZT10aGlzX3NhdmUpKQojIyBsb2FkKCJ2YXJpYW50c192ZW5uLnJkYSIpCmBgYAo=