diff --git a/analyses/gene-set-enrichment-analysis/01-conduct-gsea-analysis.R b/analyses/gene-set-enrichment-analysis/01-conduct-gsea-analysis.R
index 985bb76eae..9f992792da 100644
--- a/analyses/gene-set-enrichment-analysis/01-conduct-gsea-analysis.R
+++ b/analyses/gene-set-enrichment-analysis/01-conduct-gsea-analysis.R
@@ -34,16 +34,6 @@ library(optparse)
# Magrittr pipe
`%>%` <- dplyr::`%>%`
-if (!("msigdbr" %in% installed.packages())) {
- install.packages("msigdbr")
-}
-if (!("BiocManager" %in% installed.packages())) {
- install.packages("BiocManager")
-}
-library(BiocManager, quietly = TRUE)
-if (!("GSVA" %in% installed.packages())) {
- BiocManager::install("GSVA")
-}
library(msigdbr) ## Contains the hallmark data sets
library(GSVA) ## Performs GSEA analysis
@@ -69,6 +59,7 @@ option_list <- list(
## Read in arguments
opt_parser <- optparse::OptionParser(option_list = option_list)
opt <- optparse::parse_args(opt_parser)
+
if (is.na(opt$input_file)) stop("\n\nERROR: You must provide an input file with expression data with the flag --input, assumed to be in the `data/` directory of the OpenPBTA repository..")
if (is.na(opt$output_file)) stop("\n\nERROR: You must provide an output file for saving GSVA scores with the flag --output, assumed to be placed in the `results/` directory of this analysis.")
diff --git a/analyses/molecular-subtyping-ATRT/01-ATRT-molecular-subtyping-data-prep.Rmd b/analyses/molecular-subtyping-ATRT/01-ATRT-molecular-subtyping-data-prep.Rmd
index 08dd32b1be..712059b7f3 100644
--- a/analyses/molecular-subtyping-ATRT/01-ATRT-molecular-subtyping-data-prep.Rmd
+++ b/analyses/molecular-subtyping-ATRT/01-ATRT-molecular-subtyping-data-prep.Rmd
@@ -22,14 +22,6 @@ of the repository as follows:
```{r}
# Get `magrittr` pipe
`%>%` <- dplyr::`%>%`
-
-# Install `DT` and `htmlwidgets` packages for displaying tables
-if (!("DT" %in% installed.packages())) {
- install.packages("DT")
-}
-if (!("htmlwidgets" %in% installed.packages())) {
- install.packages("htmlwidgets")
-}
```
## Directories and Files
diff --git a/analyses/molecular-subtyping-ATRT/01-ATRT-molecular-subtyping-data-prep.nb.html b/analyses/molecular-subtyping-ATRT/01-ATRT-molecular-subtyping-data-prep.nb.html
index 14c0a343c2..a50873f95e 100644
--- a/analyses/molecular-subtyping-ATRT/01-ATRT-molecular-subtyping-data-prep.nb.html
+++ b/analyses/molecular-subtyping-ATRT/01-ATRT-molecular-subtyping-data-prep.nb.html
@@ -5800,17 +5800,9 @@
Usage
Set Up
-
+
# Get `magrittr` pipe
-`%>%` <- dplyr::`%>%`
-
-# Install `DT` and `htmlwidgets` packages for displaying tables
-if (!("DT" %in% installed.packages())) {
- install.packages("DT")
-}
-if (!("htmlwidgets" %in% installed.packages())) {
- install.packages("htmlwidgets")
-}
+`%>%` <- dplyr::`%>%`
@@ -6327,8 +6319,8 @@ Save final table of results
-
-
+
+
@@ -6381,7 +6373,7 @@ Session Info
-LS0tCnRpdGxlOiAiQVRSVCBNb2xlY3VsYXIgU3VidHlwaW5nIC0gRGF0YSBQcmVwIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQphdXRob3I6IENoYW50ZSBCZXRoZWxsIGZvciBBTFNGIENDREwKZGF0ZTogMjAxOQotLS0KClRoaXMgbm90ZWJvb2sgYWRkcmVzc2VzIHRoZSBpc3N1ZSBvZiBtb2xlY3VsYXIgc3VidHlwaW5nIEFUUlQgc2FtcGxlcy4gCgojIFVzYWdlCgpUaGlzIG5vdGVib29rIGlzIGludGVuZGVkIHRvIGJlIHJ1biB2aWEgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHRoZSB0b3AgZGlyZWN0b3J5Cm9mIHRoZSByZXBvc2l0b3J5IGFzIGZvbGxvd3M6CgpgUnNjcmlwdCAtZSAicm1hcmtkb3duOjpyZW5kZXIoJ2FuYWx5c2VzL21vbGVjdWxhci1zdWJ0eXBpbmctQVRSVC8wMS1BVFJULW1vbGVjdWxhci1zdWJ0eXBpbmctZGF0YS1wcmVwLlJtZCcsIGNsZWFuID0gVFJVRSkiYAoKIyBTZXQgVXAKCmBgYHtyfQojIEdldCBgbWFncml0dHJgIHBpcGUKYCU+JWAgPC0gZHBseXI6OmAlPiVgCgojIEluc3RhbGwgYERUYCBhbmQgYGh0bWx3aWRnZXRzYCBwYWNrYWdlcyBmb3IgZGlzcGxheWluZyB0YWJsZXMKaWYgKCEoIkRUIiAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpKSkgewogIGluc3RhbGwucGFja2FnZXMoIkRUIikKfQppZiAoISgiaHRtbHdpZGdldHMiICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKCkpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygiaHRtbHdpZGdldHMiKQp9CmBgYAoKIyMgRGlyZWN0b3JpZXMgYW5kIEZpbGVzCgpgYGB7cn0KIyBEZXRlY3QgdGhlICIuZ2l0IiBmb2xkZXIgLS0gdGhpcyB3aWxsIGluIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LgojIFVzZSB0aGlzIGFzIHRoZSByb290IGRpcmVjdG9yeSB0byBlbnN1cmUgcHJvcGVyIHNvdXJjaW5nIG9mIGZ1bmN0aW9ucyBubwojIG1hdHRlciB3aGVyZSB0aGlzIGlzIGNhbGxlZCBmcm9tCnJvb3RfZGlyIDwtIHJwcm9qcm9vdDo6ZmluZF9yb290KHJwcm9qcm9vdDo6aGFzX2RpcigiLmdpdCIpKQoKIyBGaWxlIHBhdGggdG8gcmVzdWx0cyBkaXJlY3RvcnkKaW5wdXRfZGlyIDwtCiAgZmlsZS5wYXRoKHJvb3RfZGlyLCAiYW5hbHlzZXMiLCAibW9sZWN1bGFyLXN1YnR5cGluZy1BVFJUIiwgImF0cnQtc3Vic2V0IikKCiMgRmlsZSBwYXRoIHRvIHJlc3VsdHMgZGlyZWN0b3J5CnJlc3VsdHNfZGlyIDwtCiAgZmlsZS5wYXRoKHJvb3RfZGlyLCAiYW5hbHlzZXMiLCAibW9sZWN1bGFyLXN1YnR5cGluZy1BVFJUIiwgInJlc3VsdHMiKQoKaWYgKCFkaXIuZXhpc3RzKHJlc3VsdHNfZGlyKSkgewogIGRpci5jcmVhdGUocmVzdWx0c19kaXIpCn0KCiMgUmVhZCBpbiBub24tc3Vic2V0dGVkIG1ldGFkYXRhCm1ldGFkYXRhIDwtIHJlYWRyOjpyZWFkX3RzdihmaWxlLnBhdGgocm9vdF9kaXIsICJkYXRhIiwgInBidGEtaGlzdG9sb2dpZXMudHN2IikpCgojIFJlYWQgaW4gQVRSVCBzdWJzZXQgbWV0YWRhdGEKc3Vic2V0X21ldGFkYXRhIDwtIG1ldGFkYXRhICU+JQogIGRwbHlyOjpmaWx0ZXIoc2hvcnRfaGlzdG9sb2d5ID09ICJBVFJUIiwKICAgICAgICAgICAgICAgIHNhbXBsZV90eXBlID09ICJUdW1vciIsCiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbiA9PSAiU29saWQgVGlzc3VlIikKCiMgU2VsZWN0IHdhbnRlZCBjb2x1bW5zIGluIG1ldGFkYXRhIGZvciBtZXJnaW5nIGFuZCBhc3NpZ24gdG8gYSBuZXcgb2JqZWN0CnNlbGVjdF9tZXRhZGF0YSA8LSBtZXRhZGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KHNhbXBsZV9pZCwKICAgICAgICAgICAgICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQpCgojIFJlYWQgaW4gQVRSVCBzdWJzZXQgR1NWQSBwYXRod2F5IHNjb3Jlcwpnc3ZhX3N1YnNldCA8LQogIGFzLmRhdGEuZnJhbWUocmVhZHI6OnJlYWRfdHN2KGZpbGUucGF0aChpbnB1dF9kaXIsICJhdHJ0X2dzdmEudHN2IikpKQoKIyBSZWFkIGluIEFUUlQgc3Vic2V0IHotc2NvcmVkIFJOQSBleHByZXNzaW9uIGRhdGEKc3RyYW5kZWRfZXhwcmVzc2lvbiA8LQogIHJlYWRyOjpyZWFkX3JkcygKICAgIGZpbGUucGF0aCgKICAgICAgaW5wdXRfZGlyLAogICAgICAiYXRydF9sb2dfZXhwcmVzc2lvbi5SRFMiCiAgICApCiAgKQoKIyBSZWFkIGluIEFUUlQgc3Vic2V0IGZvY2FsIENOIGRhdGEKY25fZGYgPC0gcmVhZHI6OnJlYWRfdHN2KAogIGZpbGUucGF0aCgKICAgIGlucHV0X2RpciwKICAgICJhdHJ0X2ZvY2FsX2NuLnRzdi5neiIKICApCikKCiMgUmVhZCBpbiBBVFJUIHN1YnNldCBjb25zZW5zdXMgbXV0YXRpb24gZGF0YQp0bWJfZGYgPC0KICBkYXRhLnRhYmxlOjpmcmVhZChmaWxlLnBhdGgoaW5wdXRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXRydF90bWIudHN2IikpCgojIFJlYWQgaW4gQVRSVCBzdWJzZXQgR0lTVElDIGRhdGEKZ2lzdGljX2RmIDwtCiAgcmVhZHI6OnJlYWRfdHN2KGZpbGUucGF0aChpbnB1dF9kaXIsICJhdHJ0X2dpc3RpY19icm9hZF92YWx1ZXMudHN2IikpCgpgYGAKCiMjIEN1c3RvbSBGdW5jdGlvbgoKYGBge3J9CiMgQ3VzdG9tIGRhdGF0YWJsZSBmdW5jdGlvbgojIEZ1bmN0aW9uIGNvZGUgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9ibG9iLzQ5YWNjOThmNWZmZDg2ODUzZmM3MGYyMjA2MjMzMTFlMTNlM2NhOWYvYW5hbHlzZXMvY29sbGFwc2Utcm5hc2VxLzAyLWFuYWx5emUtZHJvcHMuUm1kI0wyMwp2aWV3RGF0YVRhYmxlIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBEVDo6ZGF0YXRhYmxlKAogICAgZGF0YSwKICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICBmaWx0ZXIgPSAiYm90dG9tIiwKICAgIGNsYXNzID0gJ2NlbGwtYm9yZGVyIHN0cmlwZScsCiAgICBvcHRpb25zID0gbGlzdCgKICAgICAgcGFnZUxlbmd0aCA9IDUsCiAgICAgIHNlYXJjaEhpZ2hsaWdodCA9IFRSVUUsCiAgICAgIHNjcm9sbFggPSBUUlVFLAogICAgICBkb20gPSAndHBpJywKICAgICAgaW5pdENvbXBsZXRlID0gaHRtbHdpZGdldHM6OkpTKAogICAgICAgICJmdW5jdGlvbihzZXR0aW5ncywganNvbikgeyIsCiAgICAgICAgIiQodGhpcy5hcGkoKS50YWJsZSgpLmhlYWRlcigpKS5jc3MoeydiYWNrZ3JvdW5kLWNvbG9yJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIzAwNDQ2NycsICdjb2xvcic6ICcjZmZmJ30pOyIsCiAgICAgICAgIn0iCiAgICAgICkKICAgICkKICApCn0KYGBgCgojIFByZXBhcmUgRGF0YQoKIyMgTWV0YWRhdGEKCmBgYHtyfQojIERlZmluZSByZWdpb25zIG9mIHRoZSBicmFpbiAodXNpbmcgQW5hdG9teSBvZiB0aGUgQnJhaW4gZmlndXJlIGZvdW5kIGF0CiMgaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9ib29rcy9OQks2NTkwMy9maWd1cmUvQ0RSMDAwMDU3NDU3M19fMjA1LykKc3VwcmF0ZW50b3JpYWwgPC0KICBjKAogICAgIlNrdWxsIiwKICAgICJUaGFsYW11cyIsCiAgICAiVGVtcG9yYWwgTG9iZSIsCiAgICAiRnJvbnRhbCBMb2JlIiwKICAgICJQYXJpZXRhbCBMb2JlIiwKICAgICJDZXJlYnJ1bSIsCiAgICAiQmFzYWwgR2FuZ2xpYSIsCiAgICAiQ3JhbmlhbCBOZXJ2ZXMgTk9TIiwKICAgICJCYXNhbCBHYW5nbGlhO1RlbXBvcmFsIExvYmUiLAogICAgIkZyb250YWwgTG9iZTtQYXJpZXRhbCBMb2JlO1RlbXBvcmFsIExvYmUiLAogICAgIlBhcmlldGFsIExvYmU7VGVtcG9yYWwgTG9iZSIsCiAgICAiRnJvbnRhbCBMb2JlO1BhcmlldGFsIExvYmUiCiAgKQoKaW5mcmF0ZW50b3JpYWwgPC0KICBjKAogICAgIkNlcmViZWxsdW0vUG9zdGVyaW9yIEZvc3NhIiwKICAgICJCcmFpbiBTdGVtLSBQb25zO0NlcmViZWxsdW0vUG9zdGVyaW9yIEZvc3NhIiwKICAgICJDZXJlYmVsbHVtL1Bvc3RlcmlvciBGb3NzYTtPdGhlciBsb2NhdGlvbnMgTk9TIiwKICAgICJCcmFpbiBTdGVtIiwKICAgICJCcmFpbiBTdGVtLSBNaWRicmFpbi9UZWN0dW07VmVudHJpY2xlcyIsCiAgICAiQ2VyZWJlbGx1bS9Qb3N0ZXJpb3IgRm9zc2E7VmVudHJpY2xlcyIsCiAgICAiQ2VyZWJlbGx1bS9Qb3N0ZXJpb3IgRm9zc2E7U3BpbmFsIENvcmQtIENlcnZpY2FsO1NwaW5hbCBDb3JkLSBMdW1iYXIvVGhlY2FsIFNhYztTcGluYWwgQ29yZC0gVGhvcmFjaWMiLAogICAgIk90aGVyIGxvY2F0aW9ucyBOT1M7U3BpbmFsIENvcmQtIEx1bWJhci9UaGVjYWwgU2FjO1NwaW5hbCBDb3JkLSBUaG9yYWNpYztWZW50cmljbGVzIgogICkKCmNvbGxhcHNlZF9tZXRhZGF0YSA8LSBzdWJzZXRfbWV0YWRhdGEgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGxvY2F0aW9uX3N1bW1hcnkgPSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBwcmltYXJ5X3NpdGUgJWluJSBpbmZyYXRlbnRvcmlhbCB+ICJpbmZyYXRlbnRvcmlhbCIsCiAgICAgIHByaW1hcnlfc2l0ZSAlaW4lIHN1cHJhdGVudG9yaWFsIH4gInN1cHJhdGVudG9yaWFsIiwKICAgICAgVFJVRSB+ICJOQSIKICAgICksCiAgICAjIENvbnZlcnQgYE9TX2RheXNgIHZhbHVlcyB0byBtb250aHMgYW5kIGFzc2lnbiBuZXcgdmFsdWVzIHRvIGBPU19tb250aHNgCiAgICAjIGNvbHVtbgogICAgT1NfbW9udGhzID0gT1NfZGF5cyAvICgzNjUgLyAxMikKICApICU+JQogIGRwbHlyOjpzZWxlY3QoCiAgICBzYW1wbGVfaWQsCiAgICBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELAogICAgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwKICAgIGxvY2F0aW9uX3N1bW1hcnksCiAgICBhZ2VfYXRfZGlhZ25vc2lzX2RheXMsCiAgICBPU19tb250aHMsCiAgICBnZXJtbGluZV9zZXhfZXN0aW1hdGUsCiAgICBwcmltYXJ5X3NpdGUKICApICU+JQogIGRwbHlyOjpncm91cF9ieSgKICAgIHNhbXBsZV9pZCwKICAgIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQKICApICU+JQogIGRwbHlyOjpzdW1tYXJpemVfYWxsKGZ1bmN0aW9uKHgpIHBhc3RlKHNvcnQodW5pcXVlKHgpKSwgY29sbGFwc2UgPSAiLCAiKSkKCiMgRGlzcGxheSBtZXRhZGF0YSBzdWJzZXR0ZWQgZm9yIEFUUlQgc2FtcGxlcwpjb2xsYXBzZWRfbWV0YWRhdGEgJT4lCiAgaGVhZChuID0gMTUpCmBgYAoKIyMgRmlsdGVyIGFuZCBqb2luIFJOQSBleHByZXNzaW9uLCBDTiwgVE1CLCBzc0dTVkEgYW5kIEdJU1RJQyBkYXRhCgojIyMgUk5BIGV4cHJlc3Npb24gZGF0YSAKCmBgYHtyfQojIERlZmluZSB0YXJnZXQgb3ZlcmV4cHJlc3NlZCBnZW5lIHZlY3RvcnMKIyBodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9pc3N1ZXMvMjQ0I2lzc3VlY29tbWVudC01NzY4NTAxNzIKdHlyX2dlbmVzIDwtCiAgYygiVFlSIiwKICAgICJNSVRGIiwKICAgICJEQ1QiLAogICAgIlZFR0ZBIiwKICAgICJETkFIMTEiLAogICAgIlNQRUYxIiwKICAgICJNU1gyIiwKICAgICJTVEFUMyIsCiAgICAiUFJSWDEiLAogICAgIkxNWDEiLAogICAgIk9UWDIiKQpzaGhfZ2VuZXMgPC0KICBjKAogICAgIk1ZQ04iLAogICAgIkdMSTIiLAogICAgIkNESzYiLAogICAgIkFTQ0wxIiwKICAgICJIRVM1IiwKICAgICJIRVM2IiwKICAgICJETEwxIiwKICAgICJETEwzIiwKICAgICJMSFgyIiwKICAgICJURUFEMSIKICApCm15Y19nZW5lcyA8LQogIGMoCiAgICAiTVlDIiwKICAgICJIT1RBSVIiLAogICAgIlRFQUQzIgogICkKCiMgRmlsdGVyIHRvIG9ubHkgdGhlIGdlbmVzIG9mIGludGVyZXN0CmZpbHRlcmVkX2V4cHJlc3Npb24gPC0gc3RyYW5kZWRfZXhwcmVzc2lvblt3aGljaCgKICAgcm93bmFtZXMoc3RyYW5kZWRfZXhwcmVzc2lvbikgJWluJSBjKHR5cl9nZW5lcywgc2hoX2dlbmVzLCBteWNfZ2VuZXMpCiksIF0KCiMgc2NhbGUgZG9lcyBjb2x1bW4gY2VudGVyaW5nLCBzbyB3ZSB0cmFuc3Bvc2UgZmlyc3QKbG9uZ19zdHJhbmRlZF9leHByZXNzaW9uIDwtIHNjYWxlKHQoZmlsdGVyZWRfZXhwcmVzc2lvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gVFJVRSkKCiMgTWVyZ2UgbWV0YWRhdGEgd2l0aCBleHByZXNzaW9uIGRhdGEKZXhwcmVzc2lvbl9tZXRhZGF0YSA8LSBsb25nX3N0cmFuZGVkX2V4cHJlc3Npb24gJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikgJT4lIAogIGRwbHlyOjpsZWZ0X2pvaW4oc2VsZWN0X21ldGFkYXRhLCBieSA9ICJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikgJT4lCiAgZHBseXI6OnNlbGVjdCgtS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCkKCiMgRGlzcGxheSBgZXhwcmVzc2lvbl9tZXRhZGF0YWAKZXhwcmVzc2lvbl9tZXRhZGF0YSAlPiUKICBoZWFkKG4gPSAxNSkKCiMgSm9pbiBleHByZXNzaW9uIGRhdGEgd2l0aCBtZXRhZGF0YSBmaWx0ZXJlZCBmb3IgYEFUUlRgCmF0cnRfZXhwcmVzc2lvbl9kZiA8LSBjb2xsYXBzZWRfbWV0YWRhdGEgJT4lCiAgZHBseXI6OmxlZnRfam9pbihleHByZXNzaW9uX21ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgYnkgPSAic2FtcGxlX2lkIikKCiMgUmVtb3ZlIGRhdGEgd2Ugbm8gbG9uZ2VyIG5lZWQKcm0oZmlsdGVyZWRfZXhwcmVzc2lvbiwgbG9uZ19zdHJhbmRlZF9leHByZXNzaW9uLCBleHByZXNzaW9uX21ldGFkYXRhKQpgYGAKCiMjIyBDTiBkYXRhCgpgYGB7cn0KIyBGaWx0ZXIgZm9jYWwgQ04gZGF0YSBmb3IgU01BUkNCMSBhbmQgU01BUkNBNCBzdGF0dXMKZ2VuZXNfY25fZGYgPC0gY25fZGYgJT4lCiAgZHBseXI6OmZpbHRlcihnZW5lX3N5bWJvbCAlaW4lIGMoIlNNQVJDQjEiLCAiU01BUkNBNCIpKSAlPiUKICB0aWR5cjo6c3ByZWFkKGdlbmVfc3ltYm9sLCBzdGF0dXMsIGZpbGwgPSAibmV1dHJhbCIpICU+JQogIGRwbHlyOjpyZW5hbWUoU01BUkNCMV9mb2NhbF9zdGF0dXMgPSBTTUFSQ0IxLAogICAgICAgICAgICAgICAgU01BUkNBNF9mb2NhbF9zdGF0dXMgPSBTTUFSQ0E0KQoKIyBhZGQgaW4gdGhlIHNhbXBsZXMgdGhhdCBkaWQgbm90IGhhdmUgYW55IGNvcHkgbnVtYmVyIGNoYW5nZXMgZm9yIGVpdGhlcgojIG9mIHRoZXNlIGdlbmVzCm1pc3NpbmdfY25fc2FtcGxlcyA8LSBzZXRkaWZmKHVuaXF1ZShjbl9kZiRzYW1wbGVfaWQpLCBnZW5lc19jbl9kZiRzYW1wbGVfaWQpCmdlbmVzX2NuX2RmIDwtIHN1YnNldF9tZXRhZGF0YSAlPiUKICBkcGx5cjo6ZmlsdGVyKHNhbXBsZV9pZCAlaW4lIG1pc3NpbmdfY25fc2FtcGxlcykgJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGVfaWQsCiAgICAgICAgICAgICAgICBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELAogICAgICAgICAgICAgICAgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCkgJT4lCiAgZHBseXI6OnJlbmFtZShiaW9zcGVjaW1lbl9pZCA9IEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQpICU+JQogICMgYmluZCByb3dzIGZpbGxzIHdpdGggTkFzIC0tIGlmIHNvbWV0aGluZyBpcyBOQSwgdGhlcmUgaXMgbm8gZXZpZGVuY2UgZm9yCiAgIyBhIGNvcHkgbnVtYmVyIGFsdGVyYXRpb24gaW4gdGhhdCBnZW5lIGFuZCB3ZSB3aWxsIGNhbGwgaXQgbmV1dHJhbAogIGRwbHlyOjpiaW5kX3Jvd3MoZ2VuZXNfY25fZGYpICU+JQogIGRwbHlyOjptdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHRpZHlyOjpyZXBsYWNlX25hKHgsICJuZXV0cmFsIikpCgojIERpc3BsYXkgYGdlbmVzX2NuX2RmYApnZW5lc19jbl9kZiAlPiUKICBoZWFkKG4gPSAxNSkKCiMgSm9pbiBBVFJUIGV4cHJlc3Npb24gZGF0YSB3aXRoIGZvY2FsIENOIGRhdGEKYXRydF9leHByZXNzaW9uX2NuX2RmIDwtIGF0cnRfZXhwcmVzc2lvbl9kZiAlPiUKICBkcGx5cjo6bGVmdF9qb2luKGRwbHlyOjpzZWxlY3QoZ2VuZXNfY25fZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1iaW9zcGVjaW1lbl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpLCAKICAgICAgICAgICAgICAgICAgIGJ5ID0gInNhbXBsZV9pZCIpCgojIFJlbW92ZSBkYXRhIHdlIGRvbid0IG5lZWQgCnJtKG1pc3NpbmdfY25fc2FtcGxlcywgY25fZGYsIGF0cnRfZXhwcmVzc2lvbl9kZiwgZ2VuZXNfY25fZGYpCmBgYAoKIyMjIEdTVkEgZGF0YQoKYGBge3J9CiMgRmlsdGVyIHRvIG9ubHkgdGhlIGhhbGxtYXJrIGdlbmUgc2V0cyB0aGF0IHdlcmUgbmFtZWQgaW4gdGhlIGlzc3VlCnJlbGV2YW50X2dlbmVzZXRzIDwtIGMoIkhBTExNQVJLX01ZQ19UQVJHRVRTX1YxIiwKICAgICAgICAgICAgICAgICAgICAgICAiSEFMTE1BUktfTVlDX1RBUkdFVFNfVjIiLAogICAgICAgICAgICAgICAgICAgICAgICJIQUxMTUFSS19OT1RDSF9TSUdOQUxJTkciKQpnc3ZhX2ZpbHRlcmVkIDwtIGdzdmFfc3Vic2V0ICU+JQogIGRwbHlyOjpmaWx0ZXIoaGFsbG1hcmtfbmFtZSAlaW4lIHJlbGV2YW50X2dlbmVzZXRzKQoKIyBNYXRyaXggd2l0aCBnZW5lIHNldCBjb2x1bW5zIHRoYXQgY2FuIGJlIHNjYWxlZApnc3ZhX21hdCA8LSBnc3ZhX2ZpbHRlcmVkICU+JSAKICBkcGx5cjo6c2VsZWN0KC1LaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEKSAlPiUgCiAgdGlkeXI6OnNwcmVhZChoYWxsbWFya19uYW1lLCBnc2VhX3Njb3JlKSAlPiUKICB0aWJibGU6OmNvbHVtbl90b19yb3duYW1lcygic2FtcGxlX2lkIikgJT4lCiAgYXMubWF0cml4KCkKCiMgei1zY29yZSBzY29yZXMgKGhlcmUgdGhleSBhcmUgY29sdW1ucykKc2NhbGVkX2dzdmEgPC0gc2NhbGUoZ3N2YV9tYXQsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCJzYW1wbGVfaWQiKQoKIyBEaXNwbGF5IHNjYWxlZF9nc3ZhCnNjYWxlZF9nc3ZhICU+JQogIGhlYWQobiA9IDE1KQoKIyBKb2luIEFUUlQgZXhwcmVzc2lvbiBhbmQgZm9jYWwgQ04gZGF0YSB3aXRoIEdTVkEgZGF0YQphdHJ0X2V4cHJlc3Npb25fY25fZGYgPC0gYXRydF9leHByZXNzaW9uX2NuX2RmICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oc2NhbGVkX2dzdmEsCiAgICAgICAgICAgICAgICAgICBieSA9ICJzYW1wbGVfaWQiKQoKIyBSZW1vdmUgZGF0YSB3ZSBubyBsb25nZXIgbmVlZApybShnc3ZhX2ZpbHRlcmVkLCBnc3ZhX21hdCwgc2NhbGVkX2dzdmEpCmBgYAoKIyMjIFR1bW9yIG11dGF0aW9uIGJ1cmRlbiBkYXRhCgpgYGB7cn0KIyBEaXNwbGF5IGB0bWJfZGZgCnRtYl9kZiAlPiUKICBoZWFkKG4gPSAxNSkKCiMgSm9pbiBBVFJUIGV4cHJlc3Npb24sIGZvY2FsIENOIGRhdGEgYW5kIHRyYW5zcG9zZWQgc3NHU0VBIGRhdGEgd2l0aCB0dW1vcgojIG11dGF0aW9uIGJ1cmRlbiBkYXRhCmF0cnRfZXhwcmVzc2lvbl9jbl90bWJfZGYgPC0gYXRydF9leHByZXNzaW9uX2NuX2RmICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oZHBseXI6OnNlbGVjdCh0bWJfZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1UdW1vcl9TYW1wbGVfQmFyY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpLCAKICAgICAgICAgICAgICAgICAgIGJ5ID0gInNhbXBsZV9pZCIpCgojIFJlbW92ZSBkYXRhIHdlIG5vIGxvbmdlciBuZWVkCnJtKHRtYl9kZiwgYXRydF9leHByZXNzaW9uX2NuX2RmKQpgYGAKCiMjIyBHSVNUSUMgZGF0YQoKYGBge3J9Cmdpc3RpY19kZiA8LSBnaXN0aWNfZGYgJT4lCiAgZHBseXI6OnNlbGVjdCgtS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZV9pZCkgJT4lCiAgZHBseXI6Om11dGF0ZShjaHJfMjJxX2xvc3MgPSBkcGx5cjo6Y2FzZV93aGVuKGAyMnFgID09IC0xIH4gIlllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTm8iKSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtYDIycWApCgojIERpc3BsYXkgYGdpc3RpY19kZmAKZ2lzdGljX2RmICU+JQogIGhlYWQobiA9IDE1KQoKIyBKb2luIEdJU1RJQyBkYXRhIHdpdGggdGhlIHJ1bm5pbmcgZmluYWwgZGF0YS5mcmFtZQpmaW5hbF9kZiA8LSBhdHJ0X2V4cHJlc3Npb25fY25fdG1iX2RmICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oZ2lzdGljX2RmLCBieSA9ICJzYW1wbGVfaWQiKSAlPiUKICBkcGx5cjo6ZGlzdGluY3QoKQoKIyBSZW1vdmUgZGF0YSB3ZSBubyBsb25nZXIgbmVlZApybShnaXN0aWNfZGYsIGF0cnRfZXhwcmVzc2lvbl9jbl90bWJfZGYpCmBgYAoKIyBTYXZlIGZpbmFsIHRhYmxlIG9mIHJlc3VsdHMKCmBgYHtyfQojIEZvciByZW9yZGVyaW5nIHRoZSBvdXRwdXQsIHdlIHdpbGwgdXNlIHRoZSB2ZWN0b3Igb2YgZ2VuZXMgYXMgaW5wdXQgYnV0IHdlIAojIG5lZWQgdG8gYWNjb3VudCBmb3IgZ2VuZXMgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZSBleHByZXNzaW9uIG1hdHJpeAp0eXJfZ2VuZXMgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKGZpbmFsX2RmKSwgdHlyX2dlbmVzKQpzaGhfZ2VuZXMgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKGZpbmFsX2RmKSwgc2hoX2dlbmVzKQpteWNfZ2VuZXMgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKGZpbmFsX2RmKSwgbXljX2dlbmVzKQoKIyBTYXZlIGZpbmFsIGRhdGEuZnJhbWUKZmluYWxfZGYgPC0gZmluYWxfZGYgJT4lCiAgZHBseXI6OnNlbGVjdCgKICAgIHNhbXBsZV9pZCwKICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsCiAgICBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELAogICAgYWdlX2F0X2RpYWdub3Npc19kYXlzLAogICAgT1NfbW9udGhzLAogICAgZ2VybWxpbmVfc2V4X2VzdGltYXRlLAogICAgcHJpbWFyeV9zaXRlLAogICAgbG9jYXRpb25fc3VtbWFyeSwKICAgIGNocl8yMnFfbG9zcywKICAgIFNNQVJDQjFfZm9jYWxfc3RhdHVzLAogICAgISEhIHJsYW5nOjpzeW1zKHR5cl9nZW5lcyksCiAgICBTTUFSQ0E0X2ZvY2FsX3N0YXR1cywKICAgIEhBTExNQVJLX05PVENIX1NJR05BTElORywKICAgICEhISBybGFuZzo6c3ltcyhzaGhfZ2VuZXMpLAogICAgSEFMTE1BUktfTVlDX1RBUkdFVFNfVjEsCiAgICBIQUxMTUFSS19NWUNfVEFSR0VUU19WMiwKICAgICEhISBybGFuZzo6c3ltcyhteWNfZ2VuZXMpLAogICAgZHBseXI6OmV2ZXJ5dGhpbmcoKQogICkKCiMgV3JpdGUgZmluYWwgdGFibGUgdG8gZmlsZQpyZWFkcjo6d3JpdGVfdHN2KGZpbmFsX2RmLAogICAgICAgICAgICAgICAgIGZpbGUucGF0aChyZXN1bHRzX2RpciwgIkFUUlRfbW9sZWN1bGFyX3N1YnR5cGVzLnRzdiIpKQoKIyBEaXNwbGF5IGBmaW5hbF9kZmAKdmlld0RhdGFUYWJsZShmaW5hbF9kZikgCmBgYAoKIyBTZXNzaW9uIEluZm8KCmBgYHtyfQpzZXNzaW9uSW5mbygpCmBgYAoK
+LS0tCnRpdGxlOiAiQVRSVCBNb2xlY3VsYXIgU3VidHlwaW5nIC0gRGF0YSBQcmVwIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IFRSVUUKICAgIHRvY19mbG9hdDogVFJVRQphdXRob3I6IENoYW50ZSBCZXRoZWxsIGZvciBBTFNGIENDREwKZGF0ZTogMjAxOQotLS0KClRoaXMgbm90ZWJvb2sgYWRkcmVzc2VzIHRoZSBpc3N1ZSBvZiBtb2xlY3VsYXIgc3VidHlwaW5nIEFUUlQgc2FtcGxlcy4gCgojIFVzYWdlCgpUaGlzIG5vdGVib29rIGlzIGludGVuZGVkIHRvIGJlIHJ1biB2aWEgdGhlIGNvbW1hbmQgbGluZSBmcm9tIHRoZSB0b3AgZGlyZWN0b3J5Cm9mIHRoZSByZXBvc2l0b3J5IGFzIGZvbGxvd3M6CgpgUnNjcmlwdCAtZSAicm1hcmtkb3duOjpyZW5kZXIoJ2FuYWx5c2VzL21vbGVjdWxhci1zdWJ0eXBpbmctQVRSVC8wMS1BVFJULW1vbGVjdWxhci1zdWJ0eXBpbmctZGF0YS1wcmVwLlJtZCcsIGNsZWFuID0gVFJVRSkiYAoKIyBTZXQgVXAKCmBgYHtyfQojIEdldCBgbWFncml0dHJgIHBpcGUKYCU+JWAgPC0gZHBseXI6OmAlPiVgCmBgYAoKIyMgRGlyZWN0b3JpZXMgYW5kIEZpbGVzCgpgYGB7cn0KIyBEZXRlY3QgdGhlICIuZ2l0IiBmb2xkZXIgLS0gdGhpcyB3aWxsIGluIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LgojIFVzZSB0aGlzIGFzIHRoZSByb290IGRpcmVjdG9yeSB0byBlbnN1cmUgcHJvcGVyIHNvdXJjaW5nIG9mIGZ1bmN0aW9ucyBubwojIG1hdHRlciB3aGVyZSB0aGlzIGlzIGNhbGxlZCBmcm9tCnJvb3RfZGlyIDwtIHJwcm9qcm9vdDo6ZmluZF9yb290KHJwcm9qcm9vdDo6aGFzX2RpcigiLmdpdCIpKQoKIyBGaWxlIHBhdGggdG8gcmVzdWx0cyBkaXJlY3RvcnkKaW5wdXRfZGlyIDwtCiAgZmlsZS5wYXRoKHJvb3RfZGlyLCAiYW5hbHlzZXMiLCAibW9sZWN1bGFyLXN1YnR5cGluZy1BVFJUIiwgImF0cnQtc3Vic2V0IikKCiMgRmlsZSBwYXRoIHRvIHJlc3VsdHMgZGlyZWN0b3J5CnJlc3VsdHNfZGlyIDwtCiAgZmlsZS5wYXRoKHJvb3RfZGlyLCAiYW5hbHlzZXMiLCAibW9sZWN1bGFyLXN1YnR5cGluZy1BVFJUIiwgInJlc3VsdHMiKQoKaWYgKCFkaXIuZXhpc3RzKHJlc3VsdHNfZGlyKSkgewogIGRpci5jcmVhdGUocmVzdWx0c19kaXIpCn0KCiMgUmVhZCBpbiBub24tc3Vic2V0dGVkIG1ldGFkYXRhCm1ldGFkYXRhIDwtIHJlYWRyOjpyZWFkX3RzdihmaWxlLnBhdGgocm9vdF9kaXIsICJkYXRhIiwgInBidGEtaGlzdG9sb2dpZXMudHN2IikpCgojIFJlYWQgaW4gQVRSVCBzdWJzZXQgbWV0YWRhdGEKc3Vic2V0X21ldGFkYXRhIDwtIG1ldGFkYXRhICU+JQogIGRwbHlyOjpmaWx0ZXIoc2hvcnRfaGlzdG9sb2d5ID09ICJBVFJUIiwKICAgICAgICAgICAgICAgIHNhbXBsZV90eXBlID09ICJUdW1vciIsCiAgICAgICAgICAgICAgICBjb21wb3NpdGlvbiA9PSAiU29saWQgVGlzc3VlIikKCiMgU2VsZWN0IHdhbnRlZCBjb2x1bW5zIGluIG1ldGFkYXRhIGZvciBtZXJnaW5nIGFuZCBhc3NpZ24gdG8gYSBuZXcgb2JqZWN0CnNlbGVjdF9tZXRhZGF0YSA8LSBtZXRhZGF0YSAlPiUKICBkcGx5cjo6c2VsZWN0KHNhbXBsZV9pZCwKICAgICAgICAgICAgICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQpCgojIFJlYWQgaW4gQVRSVCBzdWJzZXQgR1NWQSBwYXRod2F5IHNjb3Jlcwpnc3ZhX3N1YnNldCA8LQogIGFzLmRhdGEuZnJhbWUocmVhZHI6OnJlYWRfdHN2KGZpbGUucGF0aChpbnB1dF9kaXIsICJhdHJ0X2dzdmEudHN2IikpKQoKIyBSZWFkIGluIEFUUlQgc3Vic2V0IHotc2NvcmVkIFJOQSBleHByZXNzaW9uIGRhdGEKc3RyYW5kZWRfZXhwcmVzc2lvbiA8LQogIHJlYWRyOjpyZWFkX3JkcygKICAgIGZpbGUucGF0aCgKICAgICAgaW5wdXRfZGlyLAogICAgICAiYXRydF9sb2dfZXhwcmVzc2lvbi5SRFMiCiAgICApCiAgKQoKIyBSZWFkIGluIEFUUlQgc3Vic2V0IGZvY2FsIENOIGRhdGEKY25fZGYgPC0gcmVhZHI6OnJlYWRfdHN2KAogIGZpbGUucGF0aCgKICAgIGlucHV0X2RpciwKICAgICJhdHJ0X2ZvY2FsX2NuLnRzdi5neiIKICApCikKCiMgUmVhZCBpbiBBVFJUIHN1YnNldCBjb25zZW5zdXMgbXV0YXRpb24gZGF0YQp0bWJfZGYgPC0KICBkYXRhLnRhYmxlOjpmcmVhZChmaWxlLnBhdGgoaW5wdXRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXRydF90bWIudHN2IikpCgojIFJlYWQgaW4gQVRSVCBzdWJzZXQgR0lTVElDIGRhdGEKZ2lzdGljX2RmIDwtCiAgcmVhZHI6OnJlYWRfdHN2KGZpbGUucGF0aChpbnB1dF9kaXIsICJhdHJ0X2dpc3RpY19icm9hZF92YWx1ZXMudHN2IikpCgpgYGAKCiMjIEN1c3RvbSBGdW5jdGlvbgoKYGBge3J9CiMgQ3VzdG9tIGRhdGF0YWJsZSBmdW5jdGlvbgojIEZ1bmN0aW9uIGNvZGUgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9ibG9iLzQ5YWNjOThmNWZmZDg2ODUzZmM3MGYyMjA2MjMzMTFlMTNlM2NhOWYvYW5hbHlzZXMvY29sbGFwc2Utcm5hc2VxLzAyLWFuYWx5emUtZHJvcHMuUm1kI0wyMwp2aWV3RGF0YVRhYmxlIDwtIGZ1bmN0aW9uKGRhdGEpIHsKICBEVDo6ZGF0YXRhYmxlKAogICAgZGF0YSwKICAgIHJvd25hbWVzID0gRkFMU0UsCiAgICBmaWx0ZXIgPSAiYm90dG9tIiwKICAgIGNsYXNzID0gJ2NlbGwtYm9yZGVyIHN0cmlwZScsCiAgICBvcHRpb25zID0gbGlzdCgKICAgICAgcGFnZUxlbmd0aCA9IDUsCiAgICAgIHNlYXJjaEhpZ2hsaWdodCA9IFRSVUUsCiAgICAgIHNjcm9sbFggPSBUUlVFLAogICAgICBkb20gPSAndHBpJywKICAgICAgaW5pdENvbXBsZXRlID0gaHRtbHdpZGdldHM6OkpTKAogICAgICAgICJmdW5jdGlvbihzZXR0aW5ncywganNvbikgeyIsCiAgICAgICAgIiQodGhpcy5hcGkoKS50YWJsZSgpLmhlYWRlcigpKS5jc3MoeydiYWNrZ3JvdW5kLWNvbG9yJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIzAwNDQ2NycsICdjb2xvcic6ICcjZmZmJ30pOyIsCiAgICAgICAgIn0iCiAgICAgICkKICAgICkKICApCn0KYGBgCgojIFByZXBhcmUgRGF0YQoKIyMgTWV0YWRhdGEKCmBgYHtyfQojIERlZmluZSByZWdpb25zIG9mIHRoZSBicmFpbiAodXNpbmcgQW5hdG9teSBvZiB0aGUgQnJhaW4gZmlndXJlIGZvdW5kIGF0CiMgaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9ib29rcy9OQks2NTkwMy9maWd1cmUvQ0RSMDAwMDU3NDU3M19fMjA1LykKc3VwcmF0ZW50b3JpYWwgPC0KICBjKAogICAgIlNrdWxsIiwKICAgICJUaGFsYW11cyIsCiAgICAiVGVtcG9yYWwgTG9iZSIsCiAgICAiRnJvbnRhbCBMb2JlIiwKICAgICJQYXJpZXRhbCBMb2JlIiwKICAgICJDZXJlYnJ1bSIsCiAgICAiQmFzYWwgR2FuZ2xpYSIsCiAgICAiQ3JhbmlhbCBOZXJ2ZXMgTk9TIiwKICAgICJCYXNhbCBHYW5nbGlhO1RlbXBvcmFsIExvYmUiLAogICAgIkZyb250YWwgTG9iZTtQYXJpZXRhbCBMb2JlO1RlbXBvcmFsIExvYmUiLAogICAgIlBhcmlldGFsIExvYmU7VGVtcG9yYWwgTG9iZSIsCiAgICAiRnJvbnRhbCBMb2JlO1BhcmlldGFsIExvYmUiCiAgKQoKaW5mcmF0ZW50b3JpYWwgPC0KICBjKAogICAgIkNlcmViZWxsdW0vUG9zdGVyaW9yIEZvc3NhIiwKICAgICJCcmFpbiBTdGVtLSBQb25zO0NlcmViZWxsdW0vUG9zdGVyaW9yIEZvc3NhIiwKICAgICJDZXJlYmVsbHVtL1Bvc3RlcmlvciBGb3NzYTtPdGhlciBsb2NhdGlvbnMgTk9TIiwKICAgICJCcmFpbiBTdGVtIiwKICAgICJCcmFpbiBTdGVtLSBNaWRicmFpbi9UZWN0dW07VmVudHJpY2xlcyIsCiAgICAiQ2VyZWJlbGx1bS9Qb3N0ZXJpb3IgRm9zc2E7VmVudHJpY2xlcyIsCiAgICAiQ2VyZWJlbGx1bS9Qb3N0ZXJpb3IgRm9zc2E7U3BpbmFsIENvcmQtIENlcnZpY2FsO1NwaW5hbCBDb3JkLSBMdW1iYXIvVGhlY2FsIFNhYztTcGluYWwgQ29yZC0gVGhvcmFjaWMiLAogICAgIk90aGVyIGxvY2F0aW9ucyBOT1M7U3BpbmFsIENvcmQtIEx1bWJhci9UaGVjYWwgU2FjO1NwaW5hbCBDb3JkLSBUaG9yYWNpYztWZW50cmljbGVzIgogICkKCmNvbGxhcHNlZF9tZXRhZGF0YSA8LSBzdWJzZXRfbWV0YWRhdGEgJT4lCiAgZHBseXI6Om11dGF0ZSgKICAgIGxvY2F0aW9uX3N1bW1hcnkgPSBkcGx5cjo6Y2FzZV93aGVuKAogICAgICBwcmltYXJ5X3NpdGUgJWluJSBpbmZyYXRlbnRvcmlhbCB+ICJpbmZyYXRlbnRvcmlhbCIsCiAgICAgIHByaW1hcnlfc2l0ZSAlaW4lIHN1cHJhdGVudG9yaWFsIH4gInN1cHJhdGVudG9yaWFsIiwKICAgICAgVFJVRSB+ICJOQSIKICAgICksCiAgICAjIENvbnZlcnQgYE9TX2RheXNgIHZhbHVlcyB0byBtb250aHMgYW5kIGFzc2lnbiBuZXcgdmFsdWVzIHRvIGBPU19tb250aHNgCiAgICAjIGNvbHVtbgogICAgT1NfbW9udGhzID0gT1NfZGF5cyAvICgzNjUgLyAxMikKICApICU+JQogIGRwbHlyOjpzZWxlY3QoCiAgICBzYW1wbGVfaWQsCiAgICBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELAogICAgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwKICAgIGxvY2F0aW9uX3N1bW1hcnksCiAgICBhZ2VfYXRfZGlhZ25vc2lzX2RheXMsCiAgICBPU19tb250aHMsCiAgICBnZXJtbGluZV9zZXhfZXN0aW1hdGUsCiAgICBwcmltYXJ5X3NpdGUKICApICU+JQogIGRwbHlyOjpncm91cF9ieSgKICAgIHNhbXBsZV9pZCwKICAgIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQKICApICU+JQogIGRwbHlyOjpzdW1tYXJpemVfYWxsKGZ1bmN0aW9uKHgpIHBhc3RlKHNvcnQodW5pcXVlKHgpKSwgY29sbGFwc2UgPSAiLCAiKSkKCiMgRGlzcGxheSBtZXRhZGF0YSBzdWJzZXR0ZWQgZm9yIEFUUlQgc2FtcGxlcwpjb2xsYXBzZWRfbWV0YWRhdGEgJT4lCiAgaGVhZChuID0gMTUpCmBgYAoKIyMgRmlsdGVyIGFuZCBqb2luIFJOQSBleHByZXNzaW9uLCBDTiwgVE1CLCBzc0dTVkEgYW5kIEdJU1RJQyBkYXRhCgojIyMgUk5BIGV4cHJlc3Npb24gZGF0YSAKCmBgYHtyfQojIERlZmluZSB0YXJnZXQgb3ZlcmV4cHJlc3NlZCBnZW5lIHZlY3RvcnMKIyBodHRwczovL2dpdGh1Yi5jb20vQWxleHNMZW1vbmFkZS9PcGVuUEJUQS1hbmFseXNpcy9pc3N1ZXMvMjQ0I2lzc3VlY29tbWVudC01NzY4NTAxNzIKdHlyX2dlbmVzIDwtCiAgYygiVFlSIiwKICAgICJNSVRGIiwKICAgICJEQ1QiLAogICAgIlZFR0ZBIiwKICAgICJETkFIMTEiLAogICAgIlNQRUYxIiwKICAgICJNU1gyIiwKICAgICJTVEFUMyIsCiAgICAiUFJSWDEiLAogICAgIkxNWDEiLAogICAgIk9UWDIiKQpzaGhfZ2VuZXMgPC0KICBjKAogICAgIk1ZQ04iLAogICAgIkdMSTIiLAogICAgIkNESzYiLAogICAgIkFTQ0wxIiwKICAgICJIRVM1IiwKICAgICJIRVM2IiwKICAgICJETEwxIiwKICAgICJETEwzIiwKICAgICJMSFgyIiwKICAgICJURUFEMSIKICApCm15Y19nZW5lcyA8LQogIGMoCiAgICAiTVlDIiwKICAgICJIT1RBSVIiLAogICAgIlRFQUQzIgogICkKCiMgRmlsdGVyIHRvIG9ubHkgdGhlIGdlbmVzIG9mIGludGVyZXN0CmZpbHRlcmVkX2V4cHJlc3Npb24gPC0gc3RyYW5kZWRfZXhwcmVzc2lvblt3aGljaCgKICAgcm93bmFtZXMoc3RyYW5kZWRfZXhwcmVzc2lvbikgJWluJSBjKHR5cl9nZW5lcywgc2hoX2dlbmVzLCBteWNfZ2VuZXMpCiksIF0KCiMgc2NhbGUgZG9lcyBjb2x1bW4gY2VudGVyaW5nLCBzbyB3ZSB0cmFuc3Bvc2UgZmlyc3QKbG9uZ19zdHJhbmRlZF9leHByZXNzaW9uIDwtIHNjYWxlKHQoZmlsdGVyZWRfZXhwcmVzc2lvbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gVFJVRSkKCiMgTWVyZ2UgbWV0YWRhdGEgd2l0aCBleHByZXNzaW9uIGRhdGEKZXhwcmVzc2lvbl9tZXRhZGF0YSA8LSBsb25nX3N0cmFuZGVkX2V4cHJlc3Npb24gJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikgJT4lIAogIGRwbHlyOjpsZWZ0X2pvaW4oc2VsZWN0X21ldGFkYXRhLCBieSA9ICJLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEIikgJT4lCiAgZHBseXI6OnNlbGVjdCgtS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCkKCiMgRGlzcGxheSBgZXhwcmVzc2lvbl9tZXRhZGF0YWAKZXhwcmVzc2lvbl9tZXRhZGF0YSAlPiUKICBoZWFkKG4gPSAxNSkKCiMgSm9pbiBleHByZXNzaW9uIGRhdGEgd2l0aCBtZXRhZGF0YSBmaWx0ZXJlZCBmb3IgYEFUUlRgCmF0cnRfZXhwcmVzc2lvbl9kZiA8LSBjb2xsYXBzZWRfbWV0YWRhdGEgJT4lCiAgZHBseXI6OmxlZnRfam9pbihleHByZXNzaW9uX21ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgYnkgPSAic2FtcGxlX2lkIikKCiMgUmVtb3ZlIGRhdGEgd2Ugbm8gbG9uZ2VyIG5lZWQKcm0oZmlsdGVyZWRfZXhwcmVzc2lvbiwgbG9uZ19zdHJhbmRlZF9leHByZXNzaW9uLCBleHByZXNzaW9uX21ldGFkYXRhKQpgYGAKCiMjIyBDTiBkYXRhCgpgYGB7cn0KIyBGaWx0ZXIgZm9jYWwgQ04gZGF0YSBmb3IgU01BUkNCMSBhbmQgU01BUkNBNCBzdGF0dXMKZ2VuZXNfY25fZGYgPC0gY25fZGYgJT4lCiAgZHBseXI6OmZpbHRlcihnZW5lX3N5bWJvbCAlaW4lIGMoIlNNQVJDQjEiLCAiU01BUkNBNCIpKSAlPiUKICB0aWR5cjo6c3ByZWFkKGdlbmVfc3ltYm9sLCBzdGF0dXMsIGZpbGwgPSAibmV1dHJhbCIpICU+JQogIGRwbHlyOjpyZW5hbWUoU01BUkNCMV9mb2NhbF9zdGF0dXMgPSBTTUFSQ0IxLAogICAgICAgICAgICAgICAgU01BUkNBNF9mb2NhbF9zdGF0dXMgPSBTTUFSQ0E0KQoKIyBhZGQgaW4gdGhlIHNhbXBsZXMgdGhhdCBkaWQgbm90IGhhdmUgYW55IGNvcHkgbnVtYmVyIGNoYW5nZXMgZm9yIGVpdGhlcgojIG9mIHRoZXNlIGdlbmVzCm1pc3NpbmdfY25fc2FtcGxlcyA8LSBzZXRkaWZmKHVuaXF1ZShjbl9kZiRzYW1wbGVfaWQpLCBnZW5lc19jbl9kZiRzYW1wbGVfaWQpCmdlbmVzX2NuX2RmIDwtIHN1YnNldF9tZXRhZGF0YSAlPiUKICBkcGx5cjo6ZmlsdGVyKHNhbXBsZV9pZCAlaW4lIG1pc3NpbmdfY25fc2FtcGxlcykgJT4lCiAgZHBseXI6OnNlbGVjdChzYW1wbGVfaWQsCiAgICAgICAgICAgICAgICBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELAogICAgICAgICAgICAgICAgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCkgJT4lCiAgZHBseXI6OnJlbmFtZShiaW9zcGVjaW1lbl9pZCA9IEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQpICU+JQogICMgYmluZCByb3dzIGZpbGxzIHdpdGggTkFzIC0tIGlmIHNvbWV0aGluZyBpcyBOQSwgdGhlcmUgaXMgbm8gZXZpZGVuY2UgZm9yCiAgIyBhIGNvcHkgbnVtYmVyIGFsdGVyYXRpb24gaW4gdGhhdCBnZW5lIGFuZCB3ZSB3aWxsIGNhbGwgaXQgbmV1dHJhbAogIGRwbHlyOjpiaW5kX3Jvd3MoZ2VuZXNfY25fZGYpICU+JQogIGRwbHlyOjptdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHRpZHlyOjpyZXBsYWNlX25hKHgsICJuZXV0cmFsIikpCgojIERpc3BsYXkgYGdlbmVzX2NuX2RmYApnZW5lc19jbl9kZiAlPiUKICBoZWFkKG4gPSAxNSkKCiMgSm9pbiBBVFJUIGV4cHJlc3Npb24gZGF0YSB3aXRoIGZvY2FsIENOIGRhdGEKYXRydF9leHByZXNzaW9uX2NuX2RmIDwtIGF0cnRfZXhwcmVzc2lvbl9kZiAlPiUKICBkcGx5cjo6bGVmdF9qb2luKGRwbHlyOjpzZWxlY3QoZ2VuZXNfY25fZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1iaW9zcGVjaW1lbl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpLCAKICAgICAgICAgICAgICAgICAgIGJ5ID0gInNhbXBsZV9pZCIpCgojIFJlbW92ZSBkYXRhIHdlIGRvbid0IG5lZWQgCnJtKG1pc3NpbmdfY25fc2FtcGxlcywgY25fZGYsIGF0cnRfZXhwcmVzc2lvbl9kZiwgZ2VuZXNfY25fZGYpCmBgYAoKIyMjIEdTVkEgZGF0YQoKYGBge3J9CiMgRmlsdGVyIHRvIG9ubHkgdGhlIGhhbGxtYXJrIGdlbmUgc2V0cyB0aGF0IHdlcmUgbmFtZWQgaW4gdGhlIGlzc3VlCnJlbGV2YW50X2dlbmVzZXRzIDwtIGMoIkhBTExNQVJLX01ZQ19UQVJHRVRTX1YxIiwKICAgICAgICAgICAgICAgICAgICAgICAiSEFMTE1BUktfTVlDX1RBUkdFVFNfVjIiLAogICAgICAgICAgICAgICAgICAgICAgICJIQUxMTUFSS19OT1RDSF9TSUdOQUxJTkciKQpnc3ZhX2ZpbHRlcmVkIDwtIGdzdmFfc3Vic2V0ICU+JQogIGRwbHlyOjpmaWx0ZXIoaGFsbG1hcmtfbmFtZSAlaW4lIHJlbGV2YW50X2dlbmVzZXRzKQoKIyBNYXRyaXggd2l0aCBnZW5lIHNldCBjb2x1bW5zIHRoYXQgY2FuIGJlIHNjYWxlZApnc3ZhX21hdCA8LSBnc3ZhX2ZpbHRlcmVkICU+JSAKICBkcGx5cjo6c2VsZWN0KC1LaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEKSAlPiUgCiAgdGlkeXI6OnNwcmVhZChoYWxsbWFya19uYW1lLCBnc2VhX3Njb3JlKSAlPiUKICB0aWJibGU6OmNvbHVtbl90b19yb3duYW1lcygic2FtcGxlX2lkIikgJT4lCiAgYXMubWF0cml4KCkKCiMgei1zY29yZSBzY29yZXMgKGhlcmUgdGhleSBhcmUgY29sdW1ucykKc2NhbGVkX2dzdmEgPC0gc2NhbGUoZ3N2YV9tYXQsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCJzYW1wbGVfaWQiKQoKIyBEaXNwbGF5IHNjYWxlZF9nc3ZhCnNjYWxlZF9nc3ZhICU+JQogIGhlYWQobiA9IDE1KQoKIyBKb2luIEFUUlQgZXhwcmVzc2lvbiBhbmQgZm9jYWwgQ04gZGF0YSB3aXRoIEdTVkEgZGF0YQphdHJ0X2V4cHJlc3Npb25fY25fZGYgPC0gYXRydF9leHByZXNzaW9uX2NuX2RmICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oc2NhbGVkX2dzdmEsCiAgICAgICAgICAgICAgICAgICBieSA9ICJzYW1wbGVfaWQiKQoKIyBSZW1vdmUgZGF0YSB3ZSBubyBsb25nZXIgbmVlZApybShnc3ZhX2ZpbHRlcmVkLCBnc3ZhX21hdCwgc2NhbGVkX2dzdmEpCmBgYAoKIyMjIFR1bW9yIG11dGF0aW9uIGJ1cmRlbiBkYXRhCgpgYGB7cn0KIyBEaXNwbGF5IGB0bWJfZGZgCnRtYl9kZiAlPiUKICBoZWFkKG4gPSAxNSkKCiMgSm9pbiBBVFJUIGV4cHJlc3Npb24sIGZvY2FsIENOIGRhdGEgYW5kIHRyYW5zcG9zZWQgc3NHU0VBIGRhdGEgd2l0aCB0dW1vcgojIG11dGF0aW9uIGJ1cmRlbiBkYXRhCmF0cnRfZXhwcmVzc2lvbl9jbl90bWJfZGYgPC0gYXRydF9leHByZXNzaW9uX2NuX2RmICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oZHBseXI6OnNlbGVjdCh0bWJfZGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1UdW1vcl9TYW1wbGVfQmFyY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpLCAKICAgICAgICAgICAgICAgICAgIGJ5ID0gInNhbXBsZV9pZCIpCgojIFJlbW92ZSBkYXRhIHdlIG5vIGxvbmdlciBuZWVkCnJtKHRtYl9kZiwgYXRydF9leHByZXNzaW9uX2NuX2RmKQpgYGAKCiMjIyBHSVNUSUMgZGF0YQoKYGBge3J9Cmdpc3RpY19kZiA8LSBnaXN0aWNfZGYgJT4lCiAgZHBseXI6OnNlbGVjdCgtS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCkgJT4lCiAgZHBseXI6Omdyb3VwX2J5KHNhbXBsZV9pZCkgJT4lCiAgZHBseXI6Om11dGF0ZShjaHJfMjJxX2xvc3MgPSBkcGx5cjo6Y2FzZV93aGVuKGAyMnFgID09IC0xIH4gIlllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTm8iKSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtYDIycWApCgojIERpc3BsYXkgYGdpc3RpY19kZmAKZ2lzdGljX2RmICU+JQogIGhlYWQobiA9IDE1KQoKIyBKb2luIEdJU1RJQyBkYXRhIHdpdGggdGhlIHJ1bm5pbmcgZmluYWwgZGF0YS5mcmFtZQpmaW5hbF9kZiA8LSBhdHJ0X2V4cHJlc3Npb25fY25fdG1iX2RmICU+JQogIGRwbHlyOjpsZWZ0X2pvaW4oZ2lzdGljX2RmLCBieSA9ICJzYW1wbGVfaWQiKSAlPiUKICBkcGx5cjo6ZGlzdGluY3QoKQoKIyBSZW1vdmUgZGF0YSB3ZSBubyBsb25nZXIgbmVlZApybShnaXN0aWNfZGYsIGF0cnRfZXhwcmVzc2lvbl9jbl90bWJfZGYpCmBgYAoKIyBTYXZlIGZpbmFsIHRhYmxlIG9mIHJlc3VsdHMKCmBgYHtyfQojIEZvciByZW9yZGVyaW5nIHRoZSBvdXRwdXQsIHdlIHdpbGwgdXNlIHRoZSB2ZWN0b3Igb2YgZ2VuZXMgYXMgaW5wdXQgYnV0IHdlIAojIG5lZWQgdG8gYWNjb3VudCBmb3IgZ2VuZXMgdGhhdCBhcmUgbWlzc2luZyBmcm9tIHRoZSBleHByZXNzaW9uIG1hdHJpeAp0eXJfZ2VuZXMgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKGZpbmFsX2RmKSwgdHlyX2dlbmVzKQpzaGhfZ2VuZXMgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKGZpbmFsX2RmKSwgc2hoX2dlbmVzKQpteWNfZ2VuZXMgPC0gaW50ZXJzZWN0KGNvbG5hbWVzKGZpbmFsX2RmKSwgbXljX2dlbmVzKQoKIyBTYXZlIGZpbmFsIGRhdGEuZnJhbWUKZmluYWxfZGYgPC0gZmluYWxfZGYgJT4lCiAgZHBseXI6OnNlbGVjdCgKICAgIHNhbXBsZV9pZCwKICAgIEtpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQsCiAgICBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELAogICAgYWdlX2F0X2RpYWdub3Npc19kYXlzLAogICAgT1NfbW9udGhzLAogICAgZ2VybWxpbmVfc2V4X2VzdGltYXRlLAogICAgcHJpbWFyeV9zaXRlLAogICAgbG9jYXRpb25fc3VtbWFyeSwKICAgIGNocl8yMnFfbG9zcywKICAgIFNNQVJDQjFfZm9jYWxfc3RhdHVzLAogICAgISEhIHJsYW5nOjpzeW1zKHR5cl9nZW5lcyksCiAgICBTTUFSQ0E0X2ZvY2FsX3N0YXR1cywKICAgIEhBTExNQVJLX05PVENIX1NJR05BTElORywKICAgICEhISBybGFuZzo6c3ltcyhzaGhfZ2VuZXMpLAogICAgSEFMTE1BUktfTVlDX1RBUkdFVFNfVjEsCiAgICBIQUxMTUFSS19NWUNfVEFSR0VUU19WMiwKICAgICEhISBybGFuZzo6c3ltcyhteWNfZ2VuZXMpLAogICAgZHBseXI6OmV2ZXJ5dGhpbmcoKQogICkKCiMgV3JpdGUgZmluYWwgdGFibGUgdG8gZmlsZQpyZWFkcjo6d3JpdGVfdHN2KGZpbmFsX2RmLAogICAgICAgICAgICAgICAgIGZpbGUucGF0aChyZXN1bHRzX2RpciwgIkFUUlRfbW9sZWN1bGFyX3N1YnR5cGVzLnRzdiIpKQoKIyBEaXNwbGF5IGBmaW5hbF9kZmAKdmlld0RhdGFUYWJsZShmaW5hbF9kZikgCmBgYAoKIyBTZXNzaW9uIEluZm8KCmBgYHtyfQpzZXNzaW9uSW5mbygpCmBgYAoK
diff --git a/analyses/molecular-subtyping-ATRT/02-ATRT-molecular-subtyping-plotting.R b/analyses/molecular-subtyping-ATRT/02-ATRT-molecular-subtyping-plotting.R
index 97327904a5..603ba5b9bd 100644
--- a/analyses/molecular-subtyping-ATRT/02-ATRT-molecular-subtyping-plotting.R
+++ b/analyses/molecular-subtyping-ATRT/02-ATRT-molecular-subtyping-plotting.R
@@ -12,20 +12,6 @@
#### Set Up --------------------------------------------------------------------
-# Install and load in ComplexHeatMap
-if (!("ComplexHeatmap" %in% installed.packages())) {
- install.packages("ComplexHeatmap")
-}
-library(ComplexHeatmap)
-
-if (!("matrixStats" %in% installed.packages())) {
- install.packages("matrixStats")
-}
-
-if (!("ggfortify" %in% installed.packages())) {
- install.packages("ggfortify")
-}
-
library(ggfortify)
library(dplyr)
@@ -102,7 +88,7 @@ annotation_df <- final_df %>%
tibble::column_to_rownames("sample_id")
# Make into an annotation object
-column_annotation <- HeatmapAnnotation(df = annotation_df)
+column_annotation <- ComplexHeatmap::HeatmapAnnotation(df = annotation_df)
# Plot and save the Heatmap
png(
@@ -111,7 +97,7 @@ png(
height = 604,
units = "px"
)
-Heatmap(
+ComplexHeatmap::Heatmap(
high_var_exp,
heatmap_legend_param = list(title = "zscore"),
top_annotation = column_annotation,
diff --git a/analyses/molecular-subtyping-ATRT/plots/atrt_heatmap.png b/analyses/molecular-subtyping-ATRT/plots/atrt_heatmap.png
index 0c49898ad4..50fb5bb13f 100644
Binary files a/analyses/molecular-subtyping-ATRT/plots/atrt_heatmap.png and b/analyses/molecular-subtyping-ATRT/plots/atrt_heatmap.png differ