1 Sample Estimation, Biopsy: 20171110

2 RNA sequencing of Leishmania panamensis of cell biopsies

3 Test out the biopsy samples

hs_biopsy <- subset_expt(hs_expt, subset="experimentname=='biopsy'")
hs_biopsy <- set_expt_colors(expt=hs_biopsy,
                               colors=c("darkblue", "darkred", "lightblue", "red"))
##biopsy_expt$colors <- c("lightblue","lightblue","darkblue","darkblue","red","darkred")
hs_biopsy$batches
## HPGL0644 HPGL0645 HPGL0646 HPGL0647 HPGL0648 HPGL0649 
##  "d1016"  "d1016"  "d1021"  "d1021"  "d2040"  "d2040"
hs_biopsy_metrics <- graph_metrics(hs_biopsy)
## 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 entries are 0.  We are on log scale, adding 1 to the data.
## Changed 170832 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 entries are 0.  We are on log scale, setting them to 0.5.
## Changed 170832 zero count features.
## Plotting the representation of the top-n genes.
## Printing a color to condition legend.
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
hs_biopsy_norm <- normalize_expt(hs_biopsy, transform="log2", filter=TRUE, batch="fsva")
## This function will replace the expt$expressionset slot with:
## log2(fsva(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 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 36873 low-count genes (14168 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## Step 4: transforming the data with log2.
## transform_counts: Found 146 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with fsva.
## Note to self:  If you get an error like 'x contains missing values'; I think this
##  means that the data has too many 0's and needs to have a better low-count filter applied.
## batch_counts: Before batch correction, 146 entries are >= 0.
## batch_counts: Using sva::fsva for batch correction.
## The number of elements which are < 0 after batch correction is: 45
## The variable low_to_zero sets whether to change <0 values to 0 and is: FALSE
hs_biopsynorm_metrics <- graph_metrics(hs_biopsy_norm)
## 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 the representation of the top-n genes.
## Printing a color to condition legend.
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse
info <- pca_information(hs_biopsy_norm,
                        expt_factors=c("condition","batch","time","rnaqcpassed","rnangul"))
## More shallow curves in these plots suggest more genes in this principle component.
## The u and v components of SVD have only 4 columns, but the list of factors is 5 long.
## Therefore, only searching for 4 PCs.

4 Lets try 2 things:

  1. Set condition to pre/post and ignore cure/fail
  2. Set condition to cure/fail and ignore pre/post

Then see if anything jumps out that makes sense.

hs_biopsy_prepost <- set_expt_conditions(expt=hs_biopsy, fact="time")
hs_biopsy_prepost_norm <- normalize_expt(hs_biopsy_prepost, transform="log2", filter=TRUE, batch="fsva")
## This function will replace the expt$expressionset slot with:
## log2(fsva(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 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 36873 low-count genes (14168 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## Step 4: transforming the data with log2.
## transform_counts: Found 146 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with fsva.
## Note to self:  If you get an error like 'x contains missing values'; I think this
##  means that the data has too many 0's and needs to have a better low-count filter applied.
## batch_counts: Before batch correction, 146 entries are >= 0.
## batch_counts: Using sva::fsva for batch correction.
## The number of elements which are < 0 after batch correction is: 64
## The variable low_to_zero sets whether to change <0 values to 0 and is: FALSE
hs_biopsy_prepost_metrics <- graph_metrics(hs_biopsy_prepost_norm)
## 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 the representation of the top-n genes.
## Printing a color to condition legend.
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

hs_biopsy_prepost_metrics$pcaplot
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

hs_biopsy_prepost_norm <- normalize_expt(hs_biopsy_prepost_norm, norm="quant", conver="cpm")
## This function will replace the expt$expressionset slot with:
## cpm(quant(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
## 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.
## 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: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: not transforming the data.
## Step 5: not doing batch correction.
hs_biopsy_prepost_metrics <- graph_metrics(hs_biopsy_prepost_norm)
## 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 the representation of the top-n genes.
## Printing a color to condition legend.
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

hs_biopsy_prepost_metrics$tsneplot
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

hs_biopsy_prepost <- set_expt_conditions(expt=hs_biopsy, fact="state")
hs_biopsy_prepost_norm <- normalize_expt(hs_biopsy_prepost, transform="log2", filter=TRUE, batch="fsva")
## This function will replace the expt$expressionset slot with:
## log2(fsva(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 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 36873 low-count genes (14168 remaining).
## Step 2: not normalizing the data.
## Step 3: not converting the data.
## Step 4: transforming the data with log2.
## transform_counts: Found 146 values equal to 0, adding 1 to the matrix.
## Step 5: doing batch correction with fsva.
## Note to self:  If you get an error like 'x contains missing values'; I think this
##  means that the data has too many 0's and needs to have a better low-count filter applied.
## batch_counts: Before batch correction, 146 entries are >= 0.
## batch_counts: Using sva::fsva for batch correction.
## The number of elements which are < 0 after batch correction is: 54
## The variable low_to_zero sets whether to change <0 values to 0 and is: FALSE
hs_biopsy_prepost_metrics <- graph_metrics(hs_biopsy_prepost_norm)
## 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 the representation of the top-n genes.
## Printing a color to condition legend.
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

hs_biopsy_prepost_metrics$pcaplot
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

hs_biopsy_prepost_norm <- normalize_expt(hs_biopsy_prepost_norm, norm="quant", conver="cpm")
## This function will replace the expt$expressionset slot with:
## cpm(quant(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
## 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.
## 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: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: not transforming the data.
## Step 5: not doing batch correction.
hs_biopsy_prepost_metrics <- graph_metrics(hs_biopsy_prepost_norm)
## 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 the representation of the top-n genes.
## Printing a color to condition legend.
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

hs_biopsy_prepost_metrics$pcaplot
## Too few points to calculate an ellipse
## Too few points to calculate an ellipse

if (!isTRUE(get0("skip_load"))) {
  pander::pander(sessionInfo())
  message(paste0("This is hpgltools commit: ", get_git_commit()))
  this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
  message(paste0("Saving to ", this_save))
  tmp <- sm(saveme(filename=this_save))
}
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 2a0661d6e37f8a3d8831eb3bbd6347c0d9c4b3b7
## R> packrat::restore()
## This is hpgltools commit: Thu Mar 29 16:59:07 2018 -0400: 2a0661d6e37f8a3d8831eb3bbd6347c0d9c4b3b7
## Saving to 02_estimation_biopsy-v20171110.rda.xz
LS0tCnRpdGxlOiAiTC5wYW5hbWVuc2lzIGJpb3BzaWVzIDIwMTY6IFNhbXBsZSBFc3RpbWF0aW9uLiIKYXV0aG9yOiAiYXRiIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKIGh0bWxfZG9jdW1lbnQ6CiAgY29kZV9kb3dubG9hZDogdHJ1ZQogIGNvZGVfZm9sZGluZzogc2hvdwogIGZpZ19jYXB0aW9uOiB0cnVlCiAgZmlnX2hlaWdodDogNwogIGZpZ193aWR0aDogNwogIGhpZ2hsaWdodDogZGVmYXVsdAogIGtlZXBfbWQ6IGZhbHNlCiAgbW9kZTogc2VsZmNvbnRhaW5lZAogIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgdGhlbWU6IHJlYWRhYmxlCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OgogICAgY29sbGFwc2VkOiBmYWxzZQogICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGU+CiAgYm9keSAubWFpbi1jb250YWluZXIgewogICAgbWF4LXdpZHRoOiAxNjAwcHg7CiAgfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KaWYgKCFpc1RSVUUoZ2V0MCgic2tpcF9sb2FkIikpKSB7CiAgbGlicmFyeShocGdsdG9vbHMpCiAgdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCiAga25pdHI6Om9wdHNfa25pdCRzZXQocHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9OTAsCiAgICAgICAgICAgICAgICAgICAgICAgZWNobz1UUlVFKQogIGtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGg9OCwKICAgICAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodD04LAogICAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCiAgb2xkX29wdGlvbnMgPC0gb3B0aW9ucyhkaWdpdHM9NCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKICBnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKICB2ZXIgPC0gIjIwMTcxMTEwIgogIHByZXZpb3VzX2ZpbGUgPC0gIjAxX2Fubm90YXRpb24uUm1kIgoKICB0bXAgPC0gdHJ5KHNtKGxvYWRtZShmaWxlbmFtZT1wYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXByZXZpb3VzX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikpKSkKICBybWRfZmlsZSA8LSAiMDJfZXN0aW1hdGlvbl9iaW9wc3kuUm1kIgp9CmBgYAoKIyBTYW1wbGUgRXN0aW1hdGlvbiwgQmlvcHN5OiBgciB2ZXJgCgoKUk5BIHNlcXVlbmNpbmcgb2YgTGVpc2htYW5pYSBwYW5hbWVuc2lzIG9mIGNlbGwgYmlvcHNpZXMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMgVGVzdCBvdXQgdGhlIGJpb3BzeSBzYW1wbGVzCgpgYGB7ciBiaW9wc3ksIGZpZy5zaG93PSJoaWRlIn0KaHNfYmlvcHN5IDwtIHN1YnNldF9leHB0KGhzX2V4cHQsIHN1YnNldD0iZXhwZXJpbWVudG5hbWU9PSdiaW9wc3knIikKaHNfYmlvcHN5IDwtIHNldF9leHB0X2NvbG9ycyhleHB0PWhzX2Jpb3BzeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jKCJkYXJrYmx1ZSIsICJkYXJrcmVkIiwgImxpZ2h0Ymx1ZSIsICJyZWQiKSkKIyNiaW9wc3lfZXhwdCRjb2xvcnMgPC0gYygibGlnaHRibHVlIiwibGlnaHRibHVlIiwiZGFya2JsdWUiLCJkYXJrYmx1ZSIsInJlZCIsImRhcmtyZWQiKQpoc19iaW9wc3kkYmF0Y2hlcwpoc19iaW9wc3lfbWV0cmljcyA8LSBncmFwaF9tZXRyaWNzKGhzX2Jpb3BzeSkKCmhzX2Jpb3BzeV9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2Jpb3BzeSwgdHJhbnNmb3JtPSJsb2cyIiwgZmlsdGVyPVRSVUUsIGJhdGNoPSJmc3ZhIikKaHNfYmlvcHN5bm9ybV9tZXRyaWNzIDwtIGdyYXBoX21ldHJpY3MoaHNfYmlvcHN5X25vcm0pCgppbmZvIDwtIHBjYV9pbmZvcm1hdGlvbihoc19iaW9wc3lfbm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwdF9mYWN0b3JzPWMoImNvbmRpdGlvbiIsImJhdGNoIiwidGltZSIsInJuYXFjcGFzc2VkIiwicm5hbmd1bCIpKQpgYGAKCiMjIFByaW50IG1ldHJpY3MKCldlIHNldCB1cCBzb21lIHJhdyBhbmQgbm9ybWFsaXplZCBtZXRyaWNzIGFib3ZlLCBub3cgbGV0cyBwcmludCB0aGVtLgoKYGBge3IgYmlvcHN5X2ZpZ3VyZXN9CmhzX2Jpb3BzeV9tZXRyaWNzJGxpYnNpemUKaHNfYmlvcHN5X21ldHJpY3MkcGNhcGxvdApoc19iaW9wc3lfbWV0cmljcyRjb3JoZWF0CmhzX2Jpb3BzeV9tZXRyaWNzJGRpc2hlYXQKCmhzX2Jpb3BzeW5vcm1fbWV0cmljcyRwY2FwbG90CmhzX2Jpb3BzeW5vcm1fbWV0cmljcyR0c25lcGxvdApoc19iaW9wc3lub3JtX21ldHJpY3MkY29yaGVhdApoc19iaW9wc3lub3JtX21ldHJpY3MkZGlzaGVhdAoKaW5mbyRwY2FfY29yCmluZm8kYW5vdmFfZnN0YXRfaGVhdG1hcApgYGAKCiMgTGV0cyB0cnkgMiB0aGluZ3M6CgoxLiAgU2V0IGNvbmRpdGlvbiB0byBwcmUvcG9zdCBhbmQgaWdub3JlIGN1cmUvZmFpbAoyLiAgU2V0IGNvbmRpdGlvbiB0byBjdXJlL2ZhaWwgYW5kIGlnbm9yZSBwcmUvcG9zdAoKVGhlbiBzZWUgaWYgYW55dGhpbmcganVtcHMgb3V0IHRoYXQgbWFrZXMgc2Vuc2UuCgpgYGB7ciBsb29rX3ByZV9wb3N0fQpoc19iaW9wc3lfcHJlcG9zdCA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGV4cHQ9aHNfYmlvcHN5LCBmYWN0PSJ0aW1lIikKaHNfYmlvcHN5X3ByZXBvc3Rfbm9ybSA8LSBub3JtYWxpemVfZXhwdChoc19iaW9wc3lfcHJlcG9zdCwgdHJhbnNmb3JtPSJsb2cyIiwgZmlsdGVyPVRSVUUsIGJhdGNoPSJmc3ZhIikKaHNfYmlvcHN5X3ByZXBvc3RfbWV0cmljcyA8LSBncmFwaF9tZXRyaWNzKGhzX2Jpb3BzeV9wcmVwb3N0X25vcm0pCmhzX2Jpb3BzeV9wcmVwb3N0X21ldHJpY3MkcGNhcGxvdApoc19iaW9wc3lfcHJlcG9zdF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2Jpb3BzeV9wcmVwb3N0X25vcm0sIG5vcm09InF1YW50IiwgY29udmVyPSJjcG0iKQpoc19iaW9wc3lfcHJlcG9zdF9tZXRyaWNzIDwtIGdyYXBoX21ldHJpY3MoaHNfYmlvcHN5X3ByZXBvc3Rfbm9ybSkKaHNfYmlvcHN5X3ByZXBvc3RfbWV0cmljcyR0c25lcGxvdAoKaHNfYmlvcHN5X3ByZXBvc3QgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhleHB0PWhzX2Jpb3BzeSwgZmFjdD0ic3RhdGUiKQpoc19iaW9wc3lfcHJlcG9zdF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KGhzX2Jpb3BzeV9wcmVwb3N0LCB0cmFuc2Zvcm09ImxvZzIiLCBmaWx0ZXI9VFJVRSwgYmF0Y2g9ImZzdmEiKQpoc19iaW9wc3lfcHJlcG9zdF9tZXRyaWNzIDwtIGdyYXBoX21ldHJpY3MoaHNfYmlvcHN5X3ByZXBvc3Rfbm9ybSkKaHNfYmlvcHN5X3ByZXBvc3RfbWV0cmljcyRwY2FwbG90CmhzX2Jpb3BzeV9wcmVwb3N0X25vcm0gPC0gbm9ybWFsaXplX2V4cHQoaHNfYmlvcHN5X3ByZXBvc3Rfbm9ybSwgbm9ybT0icXVhbnQiLCBjb252ZXI9ImNwbSIpCmhzX2Jpb3BzeV9wcmVwb3N0X21ldHJpY3MgPC0gZ3JhcGhfbWV0cmljcyhoc19iaW9wc3lfcHJlcG9zdF9ub3JtKQpoc19iaW9wc3lfcHJlcG9zdF9tZXRyaWNzJHBjYXBsb3QKYGBgCgpgYGB7ciBzYXZlbWV9CmlmICghaXNUUlVFKGdldDAoInNraXBfbG9hZCIpKSkgewogIHBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCiAgbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCiAgdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKICBtZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHRoaXNfc2F2ZSkpCiAgdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQp9CmBgYAo=