NOTE: all plots are saved as objects to facilitate placement of individual plots into combined figures. The aesthetics of the plots have been modified to create these figures. If plotted directly in the Markdown document, the figures will likely look poor due to these changed aesthetics.

NOTE: commented out code is code that was not used in the analysis, but was kept for historical purposes. It does not need to be uncommented in order to replicate the analysis.

This pipeline was adapted in part from the training resources at https://github.com/hbctraining/DGE_workshop/tree/master/lessons.

Before starting, ensure that your working directory contains the following files and architecture:

##  gencode_featurecounts.Rmatrix.txt
##  metadata.csv
##  gencode_Output_Files

Libraries

Load the required libraries.

# BiocManager::install("DESeq2")
# BiocManager::install("GeneStructureTools")
# BiocManager::install("limma")
# BiocManager::install("apeglm")
# BiocManager::install("DEGreport")
# BiocManager::install("AnnotationHub")
# BiocManager::install("ensembldb")
# devtools::install_github("stephenturner/annotables")

library(DESeq2)
Loading required package: S4Vectors
Loading required package: stats4
Loading required package: BiocGenerics

Attaching package: ‘BiocGenerics’

The following objects are masked from ‘package:stats’:

    IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

    anyDuplicated, aperm, append, as.data.frame, basename, cbind, colnames, dirname, do.call,
    duplicated, eval, evalq, Filter, Find, get, grep, grepl, intersect, is.unsorted, lapply, Map,
    mapply, match, mget, order, paste, pmax, pmax.int, pmin, pmin.int, Position, rank, rbind, Reduce,
    rownames, sapply, setdiff, sort, table, tapply, union, unique, unsplit, which.max, which.min


Attaching package: ‘S4Vectors’

The following object is masked from ‘package:utils’:

    findMatches

The following objects are masked from ‘package:base’:

    expand.grid, I, unname

Loading required package: IRanges
Loading required package: GenomicRanges
Loading required package: GenomeInfoDb
Loading required package: SummarizedExperiment
Loading required package: MatrixGenerics
Loading required package: matrixStats

Attaching package: ‘MatrixGenerics’

The following objects are masked from ‘package:matrixStats’:

    colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse, colCounts, colCummaxs, colCummins,
    colCumprods, colCumsums, colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs, colMads,
    colMaxs, colMeans2, colMedians, colMins, colOrderStats, colProds, colQuantiles, colRanges, colRanks,
    colSdDiffs, colSds, colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads, colWeightedMeans,
    colWeightedMedians, colWeightedSds, colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
    rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods, rowCumsums, rowDiffs, rowIQRDiffs,
    rowIQRs, rowLogSumExps, rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
    rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks, rowSdDiffs, rowSds, rowSums2,
    rowTabulates, rowVarDiffs, rowVars, rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
    rowWeightedSds, rowWeightedVars

Loading required package: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with 'browseVignettes()'. To cite Bioconductor, see
    'citation("Biobase")', and for packages 'citation("pkgname")'.


Attaching package: ‘Biobase’

The following object is masked from ‘package:MatrixGenerics’:

    rowMedians

The following objects are masked from ‘package:matrixStats’:

    anyMissing, rowMedians
library(tidyverse)
── Attaching core tidyverse packages ───────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.2     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.1     ── Conflicts ─────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ lubridate::%within%() masks IRanges::%within%()
✖ dplyr::collapse()     masks IRanges::collapse()
✖ dplyr::combine()      masks Biobase::combine(), BiocGenerics::combine()
✖ dplyr::count()        masks matrixStats::count()
✖ dplyr::desc()         masks IRanges::desc()
✖ tidyr::expand()       masks S4Vectors::expand()
✖ dplyr::filter()       masks stats::filter()
✖ dplyr::first()        masks S4Vectors::first()
✖ dplyr::lag()          masks stats::lag()
✖ ggplot2::Position()   masks BiocGenerics::Position(), base::Position()
✖ purrr::reduce()       masks GenomicRanges::reduce(), IRanges::reduce()
✖ dplyr::rename()       masks S4Vectors::rename()
✖ lubridate::second()   masks S4Vectors::second()
✖ lubridate::second<-() masks S4Vectors::second<-()
✖ dplyr::slice()        masks IRanges::slice()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(GeneStructureTools)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(limma)

Attaching package: 'limma'

The following object is masked from 'package:DESeq2':

    plotMA

The following object is masked from 'package:BiocGenerics':

    plotMA
library(ggplot2)
library(pheatmap)
library(apeglm)
library(ggrepel)
library(DEGreport)
library(AnnotationHub)
Loading required package: BiocFileCache
Loading required package: dbplyr

Attaching package: 'dbplyr'

The following objects are masked from 'package:dplyr':

    ident, sql


Attaching package: 'AnnotationHub'

The following object is masked from 'package:Biobase':

    cache
library(ensembldb)
Loading required package: GenomicFeatures
Loading required package: AnnotationDbi

Attaching package: 'AnnotationDbi'

The following object is masked from 'package:dplyr':

    select

Loading required package: AnnotationFilter

Attaching package: 'ensembldb'

The following object is masked from 'package:dplyr':

    filter

The following object is masked from 'package:stats':

    filter
library(annotables)
library(pals)
library(patchwork)
library(ggpubr)
library(scales)

Attaching package: 'scales'

The following object is masked from 'package:purrr':

    discard

The following object is masked from 'package:readr':

    col_factor
library(ggiraphExtra)
library(flextable)

Attaching package: 'flextable'

The following objects are masked from 'package:ggpubr':

    border, font, rotate

The following object is masked from 'package:purrr':

    compose

The following object is masked from 'package:SummarizedExperiment':

    width

The following object is masked from 'package:GenomicRanges':

    width

The following object is masked from 'package:IRanges':

    width

The following object is masked from 'package:S4Vectors':

    width

The following object is masked from 'package:BiocGenerics':

    width
library(pals)
library(patchwork)
library(ggiraph)
library(officer)
library(magrittr)

Attaching package: 'magrittr'

The following object is masked from 'package:AnnotationFilter':

    not

The following object is masked from 'package:purrr':

    set_names

The following object is masked from 'package:tidyr':

    extract

The following object is masked from 'package:GenomicRanges':

    subtract
citation("DESeq2")
To cite package 'DESeq2' in publications use:

  Love, M.I., Huber, W., Anders, S. Moderated estimation of fold change and dispersion for RNA-seq data
  with DESeq2 Genome Biology 15(12):550 (2014)

A BibTeX entry for LaTeX users is

  @Article{,
    title = {Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2},
    author = {Michael I. Love and Wolfgang Huber and Simon Anders},
    year = {2014},
    journal = {Genome Biology},
    doi = {10.1186/s13059-014-0550-8},
    volume = {15},
    issue = {12},
    pages = {550},
  }
citation("tidyverse")
To cite package 'tidyverse' in publications use:

  Wickham H, Averick M, Bryan J, Chang W, McGowan LD, François R, Grolemund G, Hayes A, Henry L, Hester
  J, Kuhn M, Pedersen TL, Miller E, Bache SM, Müller K, Ooms J, Robinson D, Seidel DP, Spinu V,
  Takahashi K, Vaughan D, Wilke C, Woo K, Yutani H (2019). "Welcome to the tidyverse." _Journal of Open
  Source Software_, *4*(43), 1686. doi:10.21105/joss.01686 <https://doi.org/10.21105/joss.01686>.

A BibTeX entry for LaTeX users is

  @Article{,
    title = {Welcome to the {tidyverse}},
    author = {Hadley Wickham and Mara Averick and Jennifer Bryan and Winston Chang and Lucy D'Agostino McGowan and Romain François and Garrett Grolemund and Alex Hayes and Lionel Henry and Jim Hester and Max Kuhn and Thomas Lin Pedersen and Evan Miller and Stephan Milton Bache and Kirill Müller and Jeroen Ooms and David Robinson and Dana Paige Seidel and Vitalie Spinu and Kohske Takahashi and Davis Vaughan and Claus Wilke and Kara Woo and Hiroaki Yutani},
    year = {2019},
    journal = {Journal of Open Source Software},
    volume = {4},
    number = {43},
    pages = {1686},
    doi = {10.21105/joss.01686},
  }
citation("GeneStructureTools")
To cite package 'GeneStructureTools' in publications use:

  Signal B (2023). _GeneStructureTools: Tools for spliced gene structure manipulation and analysis_.
  doi:10.18129/B9.bioc.GeneStructureTools <https://doi.org/10.18129/B9.bioc.GeneStructureTools>, R
  package version 1.20.0, <https://bioconductor.org/packages/GeneStructureTools>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {GeneStructureTools: Tools for spliced gene structure manipulation and analysis},
    author = {Beth Signal},
    year = {2023},
    note = {R package version 1.20.0},
    url = {https://bioconductor.org/packages/GeneStructureTools},
    doi = {10.18129/B9.bioc.GeneStructureTools},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and may
need manual editing, see 'help("citation")'.
citation("limma")
To cite package 'limma' in publications use:

  Ritchie, M.E., Phipson, B., Wu, D., Hu, Y., Law, C.W., Shi, W., and Smyth, G.K. (2015). limma powers
  differential expression analyses for RNA-sequencing and microarray studies. Nucleic Acids Research
  43(7), e47.

A BibTeX entry for LaTeX users is

  @Article{,
    author = {Matthew E Ritchie and Belinda Phipson and Di Wu and Yifang Hu and Charity W Law and Wei Shi and Gordon K Smyth},
    title = {{limma} powers differential expression analyses for {RNA}-sequencing and microarray studies},
    journal = {Nucleic Acids Research},
    year = {2015},
    volume = {43},
    number = {7},
    pages = {e47},
    doi = {10.1093/nar/gkv007},
  }
citation("ggplot2")
To cite ggplot2 in publications, please use

  H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.

A BibTeX entry for LaTeX users is

  @Book{,
    author = {Hadley Wickham},
    title = {ggplot2: Elegant Graphics for Data Analysis},
    publisher = {Springer-Verlag New York},
    year = {2016},
    isbn = {978-3-319-24277-4},
    url = {https://ggplot2.tidyverse.org},
  }
citation("pheatmap")
To cite package 'pheatmap' in publications use:

  Kolde R (2019). _pheatmap: Pretty Heatmaps_. R package version 1.0.12,
  <https://CRAN.R-project.org/package=pheatmap>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {pheatmap: Pretty Heatmaps},
    author = {Raivo Kolde},
    year = {2019},
    note = {R package version 1.0.12},
    url = {https://CRAN.R-project.org/package=pheatmap},
  }

ATTENTION: This citation information has been auto-generated from the package DESCRIPTION file and may
need manual editing, see 'help("citation")'.
citation("apeglm")
To cite package 'apeglm' in publications use:

  Zhu, A., Ibrahim, J.G., Love, M.I. Heavy-tailed prior distributions for sequence count data: removing
  the noise and preserving large differences Bioinformatics (2018)

A BibTeX entry for LaTeX users is

  @Article{,
    title = {Heavy-tailed prior distributions for sequence count data: removing the noise and preserving large differences},
    author = {Anqi Zhu and Joseph G. Ibrahim and Michael I. Love},
    year = {2018},
    journal = {Bioinformatics},
    doi = {10.1093/bioinformatics/bty895},
  }
citation("ggrepel")
To cite package 'ggrepel' in publications use:

  Slowikowski K (2023). _ggrepel: Automatically Position Non-Overlapping Text Labels with 'ggplot2'_. R
  package version 0.9.3, <https://CRAN.R-project.org/package=ggrepel>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {ggrepel: Automatically Position Non-Overlapping Text Labels with
'ggplot2'},
    author = {Kamil Slowikowski},
    year = {2023},
    note = {R package version 0.9.3},
    url = {https://CRAN.R-project.org/package=ggrepel},
  }
citation("DEGreport")
To cite package 'DEGreport' in publications use:

  Pantano L (2023). _DEGreport: Report of DEG analysis_. doi:10.18129/B9.bioc.DEGreport
  <https://doi.org/10.18129/B9.bioc.DEGreport>, R package version 1.36.0,
  <https://bioconductor.org/packages/DEGreport>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {DEGreport: Report of DEG analysis},
    author = {Lorena Pantano},
    year = {2023},
    note = {R package version 1.36.0},
    url = {https://bioconductor.org/packages/DEGreport},
    doi = {10.18129/B9.bioc.DEGreport},
  }
citation("AnnotationHub")
To cite package 'AnnotationHub' in publications use:

  Morgan M, Shepherd L (2023). _AnnotationHub: Client to access AnnotationHub resources_.
  doi:10.18129/B9.bioc.AnnotationHub <https://doi.org/10.18129/B9.bioc.AnnotationHub>, R package version
  3.8.0, <https://bioconductor.org/packages/AnnotationHub>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {AnnotationHub: Client to access AnnotationHub resources},
    author = {Martin Morgan and Lori Shepherd},
    year = {2023},
    note = {R package version 3.8.0},
    url = {https://bioconductor.org/packages/AnnotationHub},
    doi = {10.18129/B9.bioc.AnnotationHub},
  }
citation("ensembldb")
To cite the ensembldb package please use:

  Rainer J, Gatto L, Weichenberger CX (2019) ensembldb: an R package to create and use Ensembl-based
  annotation resources. Bioinformatics. doi:10.1093/bioinformatics/btz031

A BibTeX entry for LaTeX users is

  @Article{,
    title = {ensembldb: an R package to create and use Ensembl-based annotation resources.},
    author = {Johannes Rainer and Laurent Gatto and Christian X. Weichenberger},
    year = {2019},
    journal = {Bioinformatics},
    doi = {10.1093/bioinformatics/btz031},
    url = {https://academic.oup.com/bioinformatics/advance-article/doi/10.1093/bioinformatics/btz031/5301311},
  }
citation("annotables")
To cite package 'annotables' in publications use:

  Turner S (2023). _annotables: Ensembl Annotation Tables_. R package version 0.2.0,
  <https://github.com/stephenturner/annotables>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {annotables: Ensembl Annotation Tables},
    author = {Stephen Turner},
    year = {2023},
    note = {R package version 0.2.0},
    url = {https://github.com/stephenturner/annotables},
  }
citation("pals")
To cite package 'pals' in publications use:

  Wright K (2021). _pals: Color Palettes, Colormaps, and Tools to Evaluate Them_. R package version 1.7,
  <https://CRAN.R-project.org/package=pals>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {pals: Color Palettes, Colormaps, and Tools to Evaluate Them},
    author = {Kevin Wright},
    year = {2021},
    note = {R package version 1.7},
    url = {https://CRAN.R-project.org/package=pals},
  }
citation("patchwork")
To cite package 'patchwork' in publications use:

  Pedersen T (2022). _patchwork: The Composer of Plots_. R package version 1.1.2,
  <https://CRAN.R-project.org/package=patchwork>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {patchwork: The Composer of Plots},
    author = {Thomas Lin Pedersen},
    year = {2022},
    note = {R package version 1.1.2},
    url = {https://CRAN.R-project.org/package=patchwork},
  }
citation("ggpubr")
To cite package 'ggpubr' in publications use:

  Kassambara A (2023). _ggpubr: 'ggplot2' Based Publication Ready Plots_. R package version 0.6.0,
  <https://CRAN.R-project.org/package=ggpubr>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {ggpubr: 'ggplot2' Based Publication Ready Plots},
    author = {Alboukadel Kassambara},
    year = {2023},
    note = {R package version 0.6.0},
    url = {https://CRAN.R-project.org/package=ggpubr},
  }
citation("scales")
To cite package 'scales' in publications use:

  Wickham H, Seidel D (2022). _scales: Scale Functions for Visualization_. R package version 1.2.1,
  <https://CRAN.R-project.org/package=scales>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {scales: Scale Functions for Visualization},
    author = {Hadley Wickham and Dana Seidel},
    year = {2022},
    note = {R package version 1.2.1},
    url = {https://CRAN.R-project.org/package=scales},
  }
citation("ggiraphExtra")
To cite package 'ggiraphExtra' in publications use:

  Moon K (2020). _ggiraphExtra: Make Interactive 'ggplot2'. Extension to 'ggplot2' and 'ggiraph'_. R
  package version 0.3.0, <https://CRAN.R-project.org/package=ggiraphExtra>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {ggiraphExtra: Make Interactive 'ggplot2'. Extension to 'ggplot2' and 'ggiraph'},
    author = {Keon-Woong Moon},
    year = {2020},
    note = {R package version 0.3.0},
    url = {https://CRAN.R-project.org/package=ggiraphExtra},
  }
citation("flextable")
To cite package 'flextable' in publications use:

  Gohel D, Skintzos P (2023). _flextable: Functions for Tabular Reporting_. R package version 0.9.2,
  <https://CRAN.R-project.org/package=flextable>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {flextable: Functions for Tabular Reporting},
    author = {David Gohel and Panagiotis Skintzos},
    year = {2023},
    note = {R package version 0.9.2},
    url = {https://CRAN.R-project.org/package=flextable},
  }
citation("pals")
To cite package 'pals' in publications use:

  Wright K (2021). _pals: Color Palettes, Colormaps, and Tools to Evaluate Them_. R package version 1.7,
  <https://CRAN.R-project.org/package=pals>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {pals: Color Palettes, Colormaps, and Tools to Evaluate Them},
    author = {Kevin Wright},
    year = {2021},
    note = {R package version 1.7},
    url = {https://CRAN.R-project.org/package=pals},
  }
citation("patchwork")
To cite package 'patchwork' in publications use:

  Pedersen T (2022). _patchwork: The Composer of Plots_. R package version 1.1.2,
  <https://CRAN.R-project.org/package=patchwork>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {patchwork: The Composer of Plots},
    author = {Thomas Lin Pedersen},
    year = {2022},
    note = {R package version 1.1.2},
    url = {https://CRAN.R-project.org/package=patchwork},
  }
citation("ggiraph")
To cite package 'ggiraph' in publications use:

  Gohel D, Skintzos P (2023). _ggiraph: Make 'ggplot2' Graphics Interactive_. R package version 0.8.7,
  <https://CRAN.R-project.org/package=ggiraph>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {ggiraph: Make 'ggplot2' Graphics Interactive},
    author = {David Gohel and Panagiotis Skintzos},
    year = {2023},
    note = {R package version 0.8.7},
    url = {https://CRAN.R-project.org/package=ggiraph},
  }
citation("officer")
To cite package 'officer' in publications use:

  Gohel D (2023). _officer: Manipulation of Microsoft Word and PowerPoint Documents_. R package version
  0.6.2, <https://CRAN.R-project.org/package=officer>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {officer: Manipulation of Microsoft Word and PowerPoint Documents},
    author = {David Gohel},
    year = {2023},
    note = {R package version 0.6.2},
    url = {https://CRAN.R-project.org/package=officer},
  }
citation("magrittr")
To cite package 'magrittr' in publications use:

  Bache S, Wickham H (2022). _magrittr: A Forward-Pipe Operator for R_. R package version 2.0.3,
  <https://CRAN.R-project.org/package=magrittr>.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {magrittr: A Forward-Pipe Operator for R},
    author = {Stefan Milton Bache and Hadley Wickham},
    year = {2022},
    note = {R package version 2.0.3},
    url = {https://CRAN.R-project.org/package=magrittr},
  }
sessionInfo()
R version 4.3.0 (2023-04-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux 8.9 (Ootpa)

Matrix products: default
BLAS/LAPACK: /usr/lib64/libopenblasp-r0.3.15.so;  LAPACK version 3.9.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

time zone: America/Chicago
tzcode source: system (glibc)

attached base packages:
[1] stats4    stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] magrittr_2.0.3              officer_0.6.2               ggiraph_0.8.7               flextable_0.9.2            
 [5] ggiraphExtra_0.3.0          scales_1.2.1                ggpubr_0.6.0                patchwork_1.1.2            
 [9] pals_1.7                    annotables_0.2.0            ensembldb_2.24.0            AnnotationFilter_1.24.0    
[13] GenomicFeatures_1.52.0      AnnotationDbi_1.62.1        AnnotationHub_3.8.0         BiocFileCache_2.8.0        
[17] dbplyr_2.3.2                DEGreport_1.36.0            ggrepel_0.9.3               apeglm_1.22.1              
[21] pheatmap_1.0.12             limma_3.56.1                GeneStructureTools_1.20.0   lubridate_1.9.2            
[25] forcats_1.0.0               stringr_1.5.0               dplyr_1.1.2                 purrr_1.0.1                
[29] readr_2.1.4                 tidyr_1.3.0                 tibble_3.2.1                ggplot2_3.4.2              
[33] tidyverse_2.0.0             DESeq2_1.40.1               SummarizedExperiment_1.30.1 Biobase_2.60.0             
[37] MatrixGenerics_1.12.0       matrixStats_1.0.0           GenomicRanges_1.52.0        GenomeInfoDb_1.36.0        
[41] IRanges_2.34.0              S4Vectors_0.38.1            BiocGenerics_0.46.0        

loaded via a namespace (and not attached):
  [1] ProtGenerics_1.32.0                bitops_1.0-7                       insight_0.19.3                    
  [4] httr_1.4.6                         RColorBrewer_1.1-3                 doParallel_1.0.17                 
  [7] numDeriv_2016.8-1.1                tools_4.3.0                        backports_1.4.1                   
 [10] sjlabelled_1.2.0                   utf8_1.2.3                         R6_2.5.1                          
 [13] lazyeval_0.2.2                     mgcv_1.8-42                        Gviz_1.44.0                       
 [16] GetoptLong_1.0.5                   withr_2.5.0                        prettyunits_1.1.1                 
 [19] gridExtra_2.3                      textshaping_0.3.6                  cli_3.6.1                         
 [22] logging_0.10-108                   mvtnorm_1.1-3                      askpass_1.1                       
 [25] Rsamtools_2.16.0                   systemfonts_1.0.4                  foreign_0.8-84                    
 [28] gfonts_0.2.0                       stringdist_0.9.10                  dichromat_2.0-0.1                 
 [31] BSgenome_1.68.0                    bbmle_1.0.25                       maps_3.4.1                        
 [34] httpcode_0.3.0                     rstudioapi_0.14                    RSQLite_2.3.1                     
 [37] generics_0.1.3                     shape_1.4.6                        BiocIO_1.10.0                     
 [40] zip_2.3.0                          car_3.1-2                          Matrix_1.5-4.1                    
 [43] interp_1.1-4                       fansi_1.0.4                        abind_1.4-5                       
 [46] lifecycle_1.0.3                    yaml_2.3.7                         edgeR_3.42.4                      
 [49] carData_3.0-5                      grid_4.3.0                         blob_1.2.4                        
 [52] promises_1.2.0.1                   crayon_1.5.2                       ppcor_1.1                         
 [55] bdsmatrix_1.3-6                    lattice_0.21-8                     cowplot_1.1.1                     
 [58] KEGGREST_1.40.0                    mapproj_1.2.11                     pillar_1.9.0                      
 [61] knitr_1.43                         ComplexHeatmap_2.16.0              rjson_0.2.21                      
 [64] codetools_0.2-19                   glue_1.6.2                         fontLiberation_0.1.0              
 [67] data.table_1.14.8                  vctrs_0.6.3                        png_0.1-8                         
 [70] gtable_0.3.3                       emdbook_1.3.12                     cachem_1.0.8                      
 [73] xfun_0.39                          S4Arrays_1.0.4                     mime_0.12                         
 [76] ConsensusClusterPlus_1.64.0        coda_0.19-4                        iterators_1.0.14                  
 [79] interactiveDisplayBase_1.38.0      ellipsis_0.3.2                     nlme_3.1-162                      
 [82] fontquiver_0.2.1                   bit64_4.0.5                        progress_1.2.2                    
 [85] filelock_1.0.2                     rpart_4.1.19                       colorspace_2.1-0                  
 [88] DBI_1.1.3                          Hmisc_5.1-0                        nnet_7.3-19                       
 [91] mnormt_2.1.1                       tidyselect_1.2.0                   bit_4.0.5                         
 [94] compiler_4.3.0                     curl_5.0.0                         htmlTable_2.4.1                   
 [97] BSgenome.Mmusculus.UCSC.mm10_1.4.3 xml2_1.3.4                         fontBitstreamVera_0.1.1           
[100] ggdendro_0.1.23                    DelayedArray_0.26.3                rtracklayer_1.60.0                
[103] checkmate_2.2.0                    psych_2.3.3                        rappdirs_0.3.3                    
[106] digest_0.6.32                      rmarkdown_2.22                     XVector_0.40.0                    
[109] htmltools_0.5.5                    pkgconfig_2.0.3                    jpeg_0.1-10                       
[112] base64enc_0.1-3                    fastmap_1.1.1                      rlang_1.1.1                       
[115] GlobalOptions_0.1.2                htmlwidgets_1.6.2                  shiny_1.7.4                       
[118] jsonlite_1.8.5                     BiocParallel_1.34.2                VariantAnnotation_1.46.0          
[121] RCurl_1.98-1.12                    Formula_1.2-5                      GenomeInfoDbData_1.2.10           
[124] munsell_0.5.0                      Rcpp_1.0.10                        gdtools_0.3.3                     
[127] stringi_1.7.12                     zlibbioc_1.46.0                    MASS_7.3-60                       
[130] plyr_1.8.8                         parallel_4.3.0                     sjmisc_2.8.9                      
[133] deldir_1.0-9                       Biostrings_2.68.1                  splines_4.3.0                     
[136] hms_1.1.3                          circlize_0.4.15                    locfit_1.5-9.7                    
[139] uuid_1.1-0                         ggsignif_0.6.4                     reshape2_1.4.4                    
[142] biomaRt_2.56.1                     crul_1.4.0                         BiocVersion_3.17.1                
[145] XML_3.99-0.14                      evaluate_0.21                      mycor_0.1.1                       
[148] latticeExtra_0.6-30                biovizBase_1.48.0                  BiocManager_1.30.20               
[151] tzdb_0.4.0                         foreach_1.5.2                      httpuv_1.6.11                     
[154] openssl_2.0.6                      reshape_0.8.9                      clue_0.3-64                       
[157] broom_1.0.4                        xtable_1.8-4                       restfulr_0.0.15                   
[160] rstatix_0.7.2                      later_1.3.1                        ragg_1.2.5                        
[163] memoise_2.0.1                      GenomicAlignments_1.36.0           cluster_2.1.4                     
[166] timechange_0.2.0                  

Count Normalization

Reads in the counts and metadata files into R.

counts=read.table(file="PM_gencode_featurecounts.Rmatrix.txt", header=TRUE)
metadata_PB=read.csv(file="metadata_PB_untrimmed.csv", header=TRUE, row.names=1)
metadata_PL=read.csv(file="metadata_PL_untrimmed.csv", header=TRUE, row.names=1)
metadata_PM=read.csv(file="metadata_PM_untrimmed.csv", header=TRUE, row.names=1)
metadata_PS=read.csv(file="metadata_PS_untrimmed.csv", header=TRUE, row.names=1)
metadata_all=read.csv(file="metadata_untrimmed.csv", header=TRUE, row.names=1)

If it is necessary to remove the version numbers from the Ensembl IDs, the following code can be run. Depending on the sample set, this may result in duplicate rows. If so, the data set needs to be de-duplicated as well.

counts$Geneid=removeVersion(counts$Geneid)
counts=plyr::ddply(counts, "Geneid", plyr::numcolwise(sum)) %>%
  remove_rownames %>%
  column_to_rownames(var="Geneid")

Subsets the counts object based on tissue types.

counts_PB=counts[,grepl("PB_RN_BA", colnames(counts))]
counts_PL=counts[,grepl("PL_RN_BA", colnames(counts))]
counts_PM=counts[,grepl("PM_RN_BA", colnames(counts))]
counts_PS=counts[,grepl("PS_RN_BA", colnames(counts))]

Sets the column names of the counts matrix to the row names of the metadata matrix and then confirms they are the same.

# PB
colnames(counts_PB)=rownames(metadata_PB)
all(colnames(counts_PB) %in% rownames(metadata_PB))
[1] TRUE
all(colnames(counts_PB)==rownames(metadata_PB))
[1] TRUE
# PL
colnames(counts_PL)=rownames(metadata_PL)
all(colnames(counts_PL) %in% rownames(metadata_PL))
[1] TRUE
all(colnames(counts_PL)==rownames(metadata_PL))
[1] TRUE
# PM
colnames(counts_PM)=rownames(metadata_PM)
all(colnames(counts_PM) %in% rownames(metadata_PM))
[1] TRUE
all(colnames(counts_PM)==rownames(metadata_PM))
[1] TRUE
# PS
colnames(counts_PS)=rownames(metadata_PS)
all(colnames(counts_PS) %in% rownames(metadata_PS))
[1] TRUE
all(colnames(counts_PS)==rownames(metadata_PS))
[1] TRUE

Generates the DESeqDataSet (dds) objects. The design parameter must correspond with the condition column name in the metadata file. This is the variable(s) by which the differential analysis will be performed. This command will generate a warning that some variables are characters; this is normal and is expected. Ensures that the reference level is set to the control variable.

# PB
dds_PB=DESeqDataSetFromMatrix(countData=counts_PB, colData=metadata_PB, design=~ THC)
Warning: some variables in design formula are characters, converting to factors
dds_PB$group=relevel(dds_PB$THC, ref="negative")

# PL
dds_PL=DESeqDataSetFromMatrix(countData=counts_PL, colData=metadata_PL, design=~ THC)
Warning: some variables in design formula are characters, converting to factors
dds_PL$group=relevel(dds_PL$THC, ref="negative")

# PM
dds_PM=DESeqDataSetFromMatrix(countData=counts_PM, colData=metadata_PM, design=~ THC)
Warning: some variables in design formula are characters, converting to factors
dds_PM$group=relevel(dds_PM$THC, ref="negative")

# PS
dds_PS=DESeqDataSetFromMatrix(countData=counts_PS, colData=metadata_PS, design=~ THC)
Warning: some variables in design formula are characters, converting to factors
dds_PS$group=relevel(dds_PS$THC, ref="negative")

Performs normalization on the dds objects and then writes the normalized counts to a txt file.

# PB
dds_PB=estimateSizeFactors(dds_PB)
sizeFactors(dds_PB)
PM_01_PB_RN_BA_220603 PM_03_PB_RN_BA_220607 PM_04_PB_RN_BA_220607 PM_05_PB_RN_BA_220606 PM_06_PB_RN_BA_220606 
            1.9927487             0.6533585             1.5179348             0.0765266             1.2907222 
PM_07_PB_RN_BA_220608 PM_08_PB_RN_BA_220608 PM_09_PB_RN_BA_220608 PM_10_PB_RN_BA_220608 PM_11_PB_RN_BA_220608 
            1.3418045             0.6808323             1.4021222             0.7180940             1.7293236 
PM_12_PB_RN_BA_220608 PM_13_PB_RN_BA_220608 PM_14_PB_RN_BA_220606 PM_15_PB_RN_BA_220606 PM_16_PB_RN_BA_220607 
            0.3475635             1.4749431             1.4372030             1.2532442             1.4619712 
PM_17_PB_RN_BA_220718 PM_18_PB_RN_BA_220608 PM_19_PB_RN_BA_220607 PM_20_PB_RN_BA_220607 PM_22_PB_RN_BA_220603 
            0.6044018             1.9538787             1.9826549             1.0651692             1.1004654 
PM_23_PB_RN_BA_220606 PM_24_PB_RN_BA_220606 PM_25_PB_RN_BA_220607 PM_26_PB_RN_BA_220608 PM_27_PB_RN_BA_220603 
            1.0663400             1.3711046             1.0738322             1.3351838             1.0590360 
PM_28_PB_RN_BA_220607 PM_29_PB_RN_BA_220608 PM_30_PB_RN_BA_220603 PM_31_PB_RN_BA_220603 PM_32_PB_RN_BA_220603 
            1.4048117             0.2811831             0.2582569             0.7841821             1.0484875 
PM_35_PB_RN_BA_220606 PM_36_PB_RN_BA_220603 PM_37_PB_RN_BA_220606 PM_38_PB_RN_BA_220609 PM_39_PB_RN_BA_220609 
            0.1375362             1.5660193             1.6073976             1.5682022             1.8185940 
PM_40_PB_RN_BA_220603 PM_41_PB_RN_BA_220609 PM_42_PB_RN_BA_220609 PM_43_PB_RN_BA_220609 PM_44_PB_RN_BA_220609 
            1.4885983             0.3197314             1.1066387             0.8736601             1.4449211 
PM_45_PB_RN_BA_220609 PM_46_PB_RN_BA_220609 PM_47_PB_RN_BA_220609 PM_48_PB_RN_BA_220718 PM_49_PB_RN_BA_220718 
            1.4280626             1.7844170             1.0444030             1.7825095             0.6698575 
PM_50_PB_RN_BA_220718 PM_52_PB_RN_BA_220916 PM_53_PB_RN_BA_220916 PM_54_PB_RN_BA_220916 PM_55_PB_RN_BA_220916 
            1.5285517             1.3123926             0.5113159             0.8603980             0.7516655 
PM_56_PB_RN_BA_220916 PM_57_PB_RN_BA_220916 PM_58_PB_RN_BA_220916 
            1.5282431             1.7239848             1.6094768 
normalized_counts_PB=counts(dds_PB, normalized=TRUE)
write.table(normalized_counts_PB, file="gencode_Output_Files/PB_normalizedcounts.txt", 
            sep="\t", quote=FALSE, col.names=NA)

# PL
dds_PL=estimateSizeFactors(dds_PL)
sizeFactors(dds_PL)
PM_01_PL_RN_BA_220622 PM_03_PL_RN_BA_220622 PM_04_PL_RN_BA_220622 PM_06_PL_RN_BA_220622 PM_07_PL_RN_BA_220622 
           1.40297862            0.46367867            2.85696861            0.05537568            2.80900092 
PM_08_PL_RN_BA_220622 PM_09_PL_RN_BA_220622 PM_10_PL_RN_BA_220622 PM_11_PL_RN_BA_220622 PM_12_PL_RN_BA_220622 
           1.58957104            2.00337729            1.17858581            2.09246939            0.36782415 
PM_13_PL_RN_BA_220622 PM_14_PL_RN_BA_220720 PM_15_PL_RN_BA_220622 PM_16_PL_RN_BA_220622 PM_17_PL_RN_BA_220622 
           2.66309782            3.69152590            1.46677811            2.49919006            0.35155524 
PM_18_PL_RN_BA_220622 PM_19_PL_RN_BA_220622 PM_20_PL_RN_BA_220622 PM_21_PL_RN_BA_220622 PM_22_PL_RN_BA_220720 
           0.05415938            2.05344480            0.03270570            2.45919055            0.02814269 
PM_24_PL_RN_BA_220622 PM_25_PL_RN_BA_220622 PM_26_PL_RN_BA_220623 PM_27_PL_RN_BA_220623 PM_28_PL_RN_BA_220623 
           0.09620581            0.86529255            2.24341313            2.02138616            1.50732385 
PM_29_PL_RN_BA_220623 PM_30_PL_RN_BA_220720 PM_31_PL_RN_BA_220623 PM_32_PL_RN_BA_220720 PM_33_PL_RN_BA_220623 
           0.41538316            1.85433641            0.68014153            1.32914721            0.56766953 
PM_36_PL_RN_BA_220623 PM_37_PL_RN_BA_220623 PM_38_PL_RN_BA_220623 PM_39_PL_RN_BA_220720 PM_40_PL_RN_BA_220624 
           1.33532765            2.62394196            3.02302763            0.35657666            3.11030096 
PM_41_PL_RN_BA_220624 PM_42_PL_RN_BA_220624 PM_43_PL_RN_BA_220720 PM_44_PL_RN_BA_220624 PM_45_PL_RN_BA_220624 
           1.05301075            1.51788168            0.30244477            0.85706746            2.18470276 
PM_46_PL_RN_BA_220624 PM_47_PL_RN_BA_220624 PM_48_PL_RN_BA_220720 PM_49_PL_RN_BA_220720 PM_50_PL_RN_BA_220720 
           1.13637430            1.40400835            1.60445764            2.78561615            2.15553491 
PM_51_PL_RN_BA_220920 PM_52_PL_RN_BA_220920 PM_54_PL_RN_BA_220920 PM_55_PL_RN_BA_220920 PM_56_PL_RN_BA_220923 
           2.82774982            0.89931011            1.50238908            0.28197242            1.50707690 
PM_57_PL_RN_BA_220920 PM_58_PL_RN_BA_220923 
           2.06168949            3.80973657 
normalized_counts_PL=counts(dds_PL, normalized=TRUE)
write.table(normalized_counts_PL, file="gencode_Output_Files/PL_normalizedcounts.txt", 
            sep="\t", quote=FALSE, col.names=NA)

# PM
dds_PM=estimateSizeFactors(dds_PM)
sizeFactors(dds_PM)
PM_01_PM_RN_BA_220613 PM_03_PM_RN_BA_220613 PM_04_PM_RN_BA_220613 PM_06_PM_RN_BA_220613 PM_07_PM_RN_BA_220613 
            1.5088832             1.4255698             1.6204817             1.1970366             0.9800432 
PM_08_PM_RN_BA_220613 PM_09_PM_RN_BA_220613 PM_10_PM_RN_BA_220613 PM_11_PM_RN_BA_220613 PM_12_PM_RN_BA_220613 
            1.2978390             1.4868746             1.1757672             1.1081042             1.1678733 
PM_13_PM_RN_BA_220613 PM_14_PM_RN_BA_220614 PM_15_PM_RN_BA_220614 PM_16_PM_RN_BA_220614 PM_17_PM_RN_BA_220719 
            1.1631088             1.8022065             1.0390151             1.2341993             0.6961912 
PM_18_PM_RN_BA_220614 PM_19_PM_RN_BA_220614 PM_20_PM_RN_BA_220614 PM_21_PM_RN_BA_220614 PM_22_PM_RN_BA_220614 
            0.9084388             1.4110597             0.2821348             1.3634059             0.7242727 
PM_23_PM_RN_BA_220719 PM_24_PM_RN_BA_220614 PM_25_PM_RN_BA_220614 PM_26_PM_RN_BA_220615 PM_27_PM_RN_BA_220615 
            0.4507395             1.3024728             1.3538257             1.4185118             1.2038617 
PM_28_PM_RN_BA_220615 PM_29_PM_RN_BA_220615 PM_30_PM_RN_BA_220615 PM_31_PM_RN_BA_220615 PM_33_PM_RN_BA_220615 
            1.3040438             0.6821155             1.1197386             1.5807151             0.1739217 
PM_36_PM_RN_BA_220615 PM_37_PM_RN_BA_220615 PM_38_PM_RN_BA_220615 PM_39_PM_RN_BA_220615 PM_40_PM_RN_BA_220616 
            1.6355448             0.4399030             1.1170166             1.2976556             0.1718784 
PM_41_PM_RN_BA_220616 PM_42_PM_RN_BA_220616 PM_43_PM_RN_BA_220616 PM_44_PM_RN_BA_220616 PM_45_PM_RN_BA_220616 
            0.8429614             0.7767747             0.9374023             1.2488331             1.3410268 
PM_46_PM_RN_BA_220616 PM_47_PM_RN_BA_220616 PM_48_PM_RN_BA_220719 PM_49_PM_RN_BA_220719 PM_50_PM_RN_BA_220719 
            1.1273183             1.1636958             1.4509711             1.2990044             0.5381660 
PM_51_PM_RN_BA_220920 PM_52_PM_RN_BA_220920 PM_53_PM_RN_BA_220920 PM_54_PM_RN_BA_220920 PM_55_PM_RN_BA_220920 
            1.4074151             1.0996795             2.1120325             1.5010878             0.1360339 
PM_56_PM_RN_BA_220920 PM_57_PM_RN_BA_220920 PM_58_PM_RN_BA_220920 
            1.6941223             1.5719031             1.5294640 
normalized_counts_PM=counts(dds_PM, normalized=TRUE)
write.table(normalized_counts_PM, file="gencode_Output_Files/PM_normalizedcounts.txt", 
            sep="\t", quote=FALSE, col.names=NA)

# PS
dds_PS=estimateSizeFactors(dds_PS)
sizeFactors(dds_PS)
PM_01_PS_RN_BA_220627 PM_02_PS_RN_BA_220627 PM_03_PS_RN_BA_220627 PM_04_PS_RN_BA_220627 PM_06_PS_RN_BA_220627 
          1.058600541           0.658393088           1.222699830           1.834500045           4.842249194 
PM_07_PS_RN_BA_220627 PM_08_PS_RN_BA_220627 PM_11_PS_RN_BA_220627 PM_13_PS_RN_BA_220627 PM_14_PS_RN_BA_220628 
          8.126935887           0.398138600           7.237634747           4.384803112           6.038798058 
PM_15_PS_RN_BA_220714 PM_16_PS_RN_BA_220628 PM_17_PS_RN_BA_220628 PM_18_PS_RN_BA_220628 PM_22_PS_RN_BA_220706 
          8.271116876           6.656457794           8.197012251           0.642441448           0.067976354 
PM_23_PS_RN_BA_220628 PM_24_PS_RN_BA_220628 PM_25_PS_RN_BA_220628 PM_27_PS_RN_BA_220628 PM_29_PS_RN_BA_220628 
         12.952010726           0.208645715           0.090946482           0.643588097           0.004792714 
PM_30_PS_RN_BA_220706 PM_31_PS_RN_BA_220630 PM_33_PS_RN_BA_220630 PM_35_PS_RN_BA_220630 PM_36_PS_RN_BA_220630 
          1.432265234           0.110024402           0.043707832           7.299222374           3.312055627 
PM_37_PS_RN_BA_220630 PM_38_PS_RN_BA_220630 PM_39_PS_RN_BA_220630 PM_40_PS_RN_BA_220630 PM_42_PS_RN_BA_220630 
          1.806424448           1.457886987           1.219826843           0.076546734           0.052348316 
PM_43_PS_RN_BA_220630 PM_44_PS_RN_BA_220630 PM_47_PS_RN_BA_220706 PM_48_PS_RN_BA_220714 PM_49_PS_RN_BA_220714 
          0.272828739           6.442905955           1.594276066           0.361234164           0.550746554 
PM_50_PS_RN_BA_220714 PM_52_PS_RN_BA_220921 PM_53_PS_RN_BA_220921 PM_54_PS_RN_BA_220921 PM_55_PS_RN_BA_220921 
          5.975779874           2.006948025           0.479613646           3.565880650           0.126282891 
PM_56_PS_RN_BA_220921 PM_57_PS_RN_BA_220921 PM_58_PS_RN_BA_220921 
          4.111315224           0.544084792           5.130149915 
normalized_counts_PS=counts(dds_PS, normalized=TRUE)
write.table(normalized_counts_PS, file="gencode_Output_Files/PS_normalizedcounts.txt", 
            sep="\t", quote=FALSE, col.names=NA)

QC Analysis

Transforms counts for data visualization.

rld_PB=rlog(dds_PB, blind=TRUE)
rlog() may take a long time with 50 or more samples,
vst() is a much faster transformation
rld_PL=rlog(dds_PL, blind=TRUE)
rlog() may take a long time with 50 or more samples,
vst() is a much faster transformation
rld_PM=rlog(dds_PM, blind=TRUE)
rlog() may take a long time with 50 or more samples,
vst() is a much faster transformation
rld_PS=rlog(dds_PS, blind=TRUE)
rlog() may take a few minutes with 30 or more samples,
vst() is a much faster transformation

Plots the PCA.

# PB
pca1=plotPCA(rld_PB, intgroup=c("THC"))+
  geom_point(alpha=0.75, color="black", pch=21, size=3, show.legend=TRUE)+
  # ggrepel::geom_text_repel(aes(label=name), color="black", force=3, min.segment.length=0.5, box.padding=0.5,
  #                          max.overlaps=10, show.legend=FALSE)+
  scale_color_manual(limits=c("positive", "negative"),
                     labels=c("Positive", "Negative"),
                     values=as.vector(polychrome(2)))+  
  theme_minimal()+
  theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.25)),
        axis.text.x=element_text(color="black", face="bold", size=rel(1.25)),
        axis.title.x=element_text(color="black", face="bold", size=rel(1.1)),
        axis.title.y=element_text(color="black", face="bold", size=rel(1.1)),
        title=element_text(color="black", face="bold", size=rel(0.8)),
        panel.border=element_rect(color="black", linewidth=1, fill=NA),
        strip.background=element_rect(color="black", linewidth=1),
        strip.text=element_text(color="black", face="bold", size=rel(0.8)),
        axis.line=element_blank(),
        axis.ticks=element_line(linewidth=1),
        # legend.title=element_text(color="black", face="bold", size=rel(1)),
        legend.title=element_blank(),
        legend.text=element_text(color="black", face="bold", size=rel(0.8)),
        legend.position="bottom",
        # plot.title=element_text(color="black", face="bold", size=rel(1)))+
        plot.title=element_blank())+
  labs(title="Postmortem Brain", color="THC")  

# PL
pca2=plotPCA(rld_PL, intgroup=c("THC"))+
  geom_point(alpha=0.75, color="black", pch=21, size=3, show.legend=TRUE)+
  # ggrepel::geom_text_repel(aes(label=name), color="black", force=3, min.segment.length=0.5, box.padding=0.5,
  #                          max.overlaps=10, show.legend=FALSE)+
  scale_color_manual(limits=c("positive", "negative"),
                     labels=c("Positive", "Negative"),
                     values=as.vector(polychrome(2)))+  
  theme_minimal()+
  theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.25)),
        axis.text.x=element_text(color="black", face="bold", size=rel(1.25)),
        axis.title.x=element_text(color="black", face="bold", size=rel(1.1)),
        axis.title.y=element_text(color="black", face="bold", size=rel(1.1)),
        title=element_text(color="black", face="bold", size=rel(0.8)),
        panel.border=element_rect(color="black", linewidth=1, fill=NA),
        strip.background=element_rect(color="black", linewidth=1),
        strip.text=element_text(color="black", face="bold", size=rel(0.8)),
        axis.line=element_blank(),
        axis.ticks=element_line(linewidth=1),
        # legend.title=element_text(color="black", face="bold", size=rel(1)),
        legend.title=element_blank(),
        legend.text=element_text(color="black", face="bold", size=rel(0.8)),
        legend.position="bottom",
        # plot.title=element_text(color="black", face="bold", size=rel(1)))+
        plot.title=element_blank())+
  labs(title="Postmortem Lung", color="THC")  

# PM
pca3=plotPCA(rld_PM, intgroup=c("THC"))+
  geom_point(alpha=0.75, color="black", pch=21, size=3, show.legend=TRUE)+
  # ggrepel::geom_text_repel(aes(label=name), color="black", force=3, min.segment.length=0.5, box.padding=0.5,
  #                          max.overlaps=10, show.legend=FALSE)+
  scale_color_manual(limits=c("positive", "negative"),
                     labels=c("Positive", "Negative"),
                     values=as.vector(polychrome(2)))+  
  theme_minimal()+
  theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.25)),
        axis.text.x=element_text(color="black", face="bold", size=rel(1.25)),
        axis.title.x=element_text(color="black", face="bold", size=rel(1.1)),
        axis.title.y=element_text(color="black", face="bold", size=rel(1.1)),
        title=element_text(color="black", face="bold", size=rel(0.8)),
        panel.border=element_rect(color="black", linewidth=1, fill=NA),
        strip.background=element_rect(color="black", linewidth=1),
        strip.text=element_text(color="black", face="bold", size=rel(0.8)),
        axis.line=element_blank(),
        axis.ticks=element_line(linewidth=1),
        # legend.title=element_text(color="black", face="bold", size=rel(1)),
        legend.title=element_blank(),
        legend.text=element_text(color="black", face="bold", size=rel(0.8)),
        legend.position="bottom",
        # plot.title=element_text(color="black", face="bold", size=rel(1)))+
        plot.title=element_blank())+
  labs(title="Postmortem Muscle", color="THC")  

# PS
pca4=plotPCA(rld_PS, intgroup=c("THC"))+
  geom_point(alpha=0.75, color="black", pch=21, size=3, show.legend=TRUE)+
  # ggrepel::geom_text_repel(aes(label=name), color="black", force=3, min.segment.length=0.5, box.padding=0.5,
  #                          max.overlaps=10, show.legend=FALSE)+
  scale_color_manual(limits=c("positive", "negative"),
                     labels=c("Positive", "Negative"),
                     values=as.vector(polychrome(2)))+  
  theme_minimal()+
  theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.25)),
        axis.text.x=element_text(color="black", face="bold", size=rel(1.25)),
        axis.title.x=element_text(color="black", face="bold", size=rel(1.1)),
        axis.title.y=element_text(color="black", face="bold", size=rel(1.1)),
        title=element_text(color="black", face="bold", size=rel(0.8)),
        panel.border=element_rect(color="black", linewidth=1, fill=NA),
        strip.background=element_rect(color="black", linewidth=1),
        strip.text=element_text(color="black", face="bold", size=rel(0.8)),
        axis.line=element_blank(),
        axis.ticks=element_line(linewidth=1),
        # legend.title=element_text(color="black", face="bold", size=rel(1)),
        legend.title=element_blank(),
        legend.text=element_text(color="black", face="bold", size=rel(0.8)),
        legend.position="bottom",
        # plot.title=element_text(color="black", face="bold", size=rel(1)))+
        plot.title=element_blank())+
  labs(title="Postmortem Blood", color="THC")  

Creating figures of the PCAs.

pca_patchwork=(pca1 + pca2 + pca3 + pca4 + plot_layout(ncol=2, guides="collect") & theme(legend.position="bottom"))
pca_patchwork + plot_annotation(tag_levels="A") 
ggsave("PM_pca_plots.png", width=7, height=8.36, unit="in", dpi=320)

Extracts the rlog matrix from rld, computes pairwise correlation values for the samples and then checks its outputs, and then plots the heatmaps.

# PB
rld_mat_PB=assay(rld_PB)
rld_cor_PB=cor(rld_mat_PB)
head(rld_cor_PB)
                      PM_01_PB_RN_BA_220603 PM_03_PB_RN_BA_220607 PM_04_PB_RN_BA_220607 PM_05_PB_RN_BA_220606
PM_01_PB_RN_BA_220603             1.0000000             0.9901091             0.9965209             0.9755158
PM_03_PB_RN_BA_220607             0.9901091             1.0000000             0.9917846             0.9802242
PM_04_PB_RN_BA_220607             0.9965209             0.9917846             1.0000000             0.9756877
PM_05_PB_RN_BA_220606             0.9755158             0.9802242             0.9756877             1.0000000
PM_06_PB_RN_BA_220606             0.9855471             0.9855993             0.9858795             0.9851248
PM_07_PB_RN_BA_220608             0.9863301             0.9839060             0.9872548             0.9746333
                      PM_06_PB_RN_BA_220606 PM_07_PB_RN_BA_220608 PM_08_PB_RN_BA_220608 PM_09_PB_RN_BA_220608
PM_01_PB_RN_BA_220603             0.9855471             0.9863301             0.9785581             0.9842733
PM_03_PB_RN_BA_220607             0.9855993             0.9839060             0.9806932             0.9809368
PM_04_PB_RN_BA_220607             0.9858795             0.9872548             0.9784769             0.9841310
PM_05_PB_RN_BA_220606             0.9851248             0.9746333             0.9861917             0.9817424
PM_06_PB_RN_BA_220606             1.0000000             0.9830799             0.9933317             0.9933161
PM_07_PB_RN_BA_220608             0.9830799             1.0000000             0.9786033             0.9830570
                      PM_10_PB_RN_BA_220608 PM_11_PB_RN_BA_220608 PM_12_PB_RN_BA_220608 PM_13_PB_RN_BA_220608
PM_01_PB_RN_BA_220603             0.9717560             0.9929799             0.9740851             0.9755814
PM_03_PB_RN_BA_220607             0.9716203             0.9877791             0.9813001             0.9723104
PM_04_PB_RN_BA_220607             0.9728802             0.9929132             0.9746039             0.9750949
PM_05_PB_RN_BA_220606             0.9708778             0.9807026             0.9909002             0.9784128
PM_06_PB_RN_BA_220606             0.9801115             0.9932426             0.9876757             0.9890929
PM_07_PB_RN_BA_220608             0.9701029             0.9873095             0.9738313             0.9762802
                      PM_14_PB_RN_BA_220606 PM_15_PB_RN_BA_220606 PM_16_PB_RN_BA_220607 PM_17_PB_RN_BA_220718
PM_01_PB_RN_BA_220603             0.9775747             0.9747433             0.9765312             0.9843602
PM_03_PB_RN_BA_220607             0.9747705             0.9706778             0.9725660             0.9864632
PM_04_PB_RN_BA_220607             0.9769762             0.9741001             0.9759970             0.9843375
PM_05_PB_RN_BA_220606             0.9805473             0.9778020             0.9787977             0.9840879
PM_06_PB_RN_BA_220606             0.9937848             0.9915884             0.9921455             0.9923032
PM_07_PB_RN_BA_220608             0.9775195             0.9754976             0.9770170             0.9808634
                      PM_18_PB_RN_BA_220608 PM_19_PB_RN_BA_220607 PM_20_PB_RN_BA_220607 PM_22_PB_RN_BA_220603
PM_01_PB_RN_BA_220603             0.9957606             0.9871995             0.9849784             0.9821417
PM_03_PB_RN_BA_220607             0.9886438             0.9843303             0.9845239             0.9793116
PM_04_PB_RN_BA_220607             0.9943797             0.9860169             0.9846571             0.9818114
PM_05_PB_RN_BA_220606             0.9777466             0.9806215             0.9832981             0.9793994
PM_06_PB_RN_BA_220606             0.9891921             0.9905778             0.9931690             0.9939133
PM_07_PB_RN_BA_220608             0.9868246             0.9834152             0.9819857             0.9802699
                      PM_23_PB_RN_BA_220606 PM_24_PB_RN_BA_220606 PM_25_PB_RN_BA_220607 PM_26_PB_RN_BA_220608
PM_01_PB_RN_BA_220603             0.9810947             0.9958426             0.9873861             0.9785448
PM_03_PB_RN_BA_220607             0.9775491             0.9908163             0.9834349             0.9754719
PM_04_PB_RN_BA_220607             0.9806034             0.9959215             0.9874594             0.9778489
PM_05_PB_RN_BA_220606             0.9804694             0.9795154             0.9825426             0.9806273
PM_06_PB_RN_BA_220606             0.9925625             0.9900548             0.9942281             0.9939817
PM_07_PB_RN_BA_220608             0.9803718             0.9876731             0.9840954             0.9785637
                      PM_27_PB_RN_BA_220603 PM_28_PB_RN_BA_220607 PM_29_PB_RN_BA_220608 PM_30_PB_RN_BA_220603
PM_01_PB_RN_BA_220603             0.9909775             0.9855913             0.9879817             0.9782437
PM_03_PB_RN_BA_220607             0.9889029             0.9843359             0.9893007             0.9799113
PM_04_PB_RN_BA_220607             0.9905886             0.9852213             0.9883848             0.9778960
PM_05_PB_RN_BA_220606             0.9824394             0.9820877             0.9866963             0.9858239
PM_06_PB_RN_BA_220606             0.9907489             0.9914526             0.9918916             0.9914125
PM_07_PB_RN_BA_220608             0.9855766             0.9831244             0.9849305             0.9780425
                      PM_31_PB_RN_BA_220603 PM_32_PB_RN_BA_220603 PM_35_PB_RN_BA_220606 PM_36_PB_RN_BA_220603
PM_01_PB_RN_BA_220603             0.9754693             0.9793567             0.9773495             0.9950925
PM_03_PB_RN_BA_220607             0.9724432             0.9778665             0.9804925             0.9900565
PM_04_PB_RN_BA_220607             0.9752859             0.9788968             0.9777990             0.9947534
PM_05_PB_RN_BA_220606             0.9790986             0.9818489             0.9839451             0.9805891
PM_06_PB_RN_BA_220606             0.9919468             0.9923454             0.9904186             0.9913215
PM_07_PB_RN_BA_220608             0.9768913             0.9796217             0.9777062             0.9875329
                      PM_37_PB_RN_BA_220606 PM_38_PB_RN_BA_220609 PM_39_PB_RN_BA_220609 PM_40_PB_RN_BA_220603
PM_01_PB_RN_BA_220603             0.9738679             0.9791838             0.9968656             0.9797049
PM_03_PB_RN_BA_220607             0.9711035             0.9779420             0.9909328             0.9776203
PM_04_PB_RN_BA_220607             0.9735817             0.9786025             0.9961988             0.9794711
PM_05_PB_RN_BA_220606             0.9783617             0.9818949             0.9774080             0.9823178
PM_06_PB_RN_BA_220606             0.9920999             0.9907470             0.9880266             0.9926192
PM_07_PB_RN_BA_220608             0.9744059             0.9794491             0.9865220             0.9804671
                      PM_41_PB_RN_BA_220609 PM_42_PB_RN_BA_220609 PM_43_PB_RN_BA_220609 PM_44_PB_RN_BA_220609
PM_01_PB_RN_BA_220603             0.9750532             0.9954317             0.9857752             0.9807207
PM_03_PB_RN_BA_220607             0.9823896             0.9889208             0.9867488             0.9787779
PM_04_PB_RN_BA_220607             0.9758833             0.9945386             0.9853340             0.9803736
PM_05_PB_RN_BA_220606             0.9883736             0.9771400             0.9850938             0.9824471
PM_06_PB_RN_BA_220606             0.9866711             0.9889500             0.9917196             0.9945050
PM_07_PB_RN_BA_220608             0.9780788             0.9857168             0.9814694             0.9807023
                      PM_45_PB_RN_BA_220609 PM_46_PB_RN_BA_220609 PM_47_PB_RN_BA_220609 PM_48_PB_RN_BA_220718
PM_01_PB_RN_BA_220603             0.9930457             0.9930573             0.9919979             0.9944350
PM_03_PB_RN_BA_220607             0.9873628             0.9918957             0.9871815             0.9927051
PM_04_PB_RN_BA_220607             0.9926572             0.9931280             0.9915813             0.9957659
PM_05_PB_RN_BA_220606             0.9810813             0.9812422             0.9790655             0.9779724
PM_06_PB_RN_BA_220606             0.9923422             0.9901902             0.9918409             0.9858069
PM_07_PB_RN_BA_220608             0.9869426             0.9861186             0.9854367             0.9870139
                      PM_49_PB_RN_BA_220718 PM_50_PB_RN_BA_220718 PM_52_PB_RN_BA_220916 PM_53_PB_RN_BA_220916
PM_01_PB_RN_BA_220603             0.9780281             0.9869637             0.9814291             0.9820308
PM_03_PB_RN_BA_220607             0.9782839             0.9854810             0.9754347             0.9811132
PM_04_PB_RN_BA_220607             0.9780459             0.9875752             0.9799466             0.9822948
PM_05_PB_RN_BA_220606             0.9848959             0.9799129             0.9729781             0.9815129
PM_06_PB_RN_BA_220606             0.9944583             0.9900513             0.9844777             0.9922553
PM_07_PB_RN_BA_220608             0.9780897             0.9880291             0.9817195             0.9863578
                      PM_54_PB_RN_BA_220916 PM_55_PB_RN_BA_220916 PM_56_PB_RN_BA_220916 PM_57_PB_RN_BA_220916
PM_01_PB_RN_BA_220603             0.9924716             0.9885575             0.9964062             0.9786740
PM_03_PB_RN_BA_220607             0.9866341             0.9877329             0.9901431             0.9756041
PM_04_PB_RN_BA_220607             0.9915561             0.9879424             0.9959651             0.9779961
PM_05_PB_RN_BA_220606             0.9776259             0.9825420             0.9769205             0.9808700
PM_06_PB_RN_BA_220606             0.9882380             0.9907674             0.9882553             0.9934185
PM_07_PB_RN_BA_220608             0.9848664             0.9824158             0.9866356             0.9790188
                      PM_58_PB_RN_BA_220916
PM_01_PB_RN_BA_220603             0.9958764
PM_03_PB_RN_BA_220607             0.9907376
PM_04_PB_RN_BA_220607             0.9961337
PM_05_PB_RN_BA_220606             0.9789579
PM_06_PB_RN_BA_220606             0.9892049
PM_07_PB_RN_BA_220608             0.9876831
pheatmap(rld_cor_PB,
         # color=colorRampPalette(c("", "", ""))(200),  ## The color palette.
         display_numbers=matrix(ifelse(rld_cor_PB>0.99995, "*", ""), nrow(rld_cor_PB)), fontsize_row=5)


# PL
rld_mat_PL=assay(rld_PL)
rld_cor_PL=cor(rld_mat_PL)
head(rld_cor_PL)
                      PM_01_PL_RN_BA_220622 PM_03_PL_RN_BA_220622 PM_04_PL_RN_BA_220622 PM_06_PL_RN_BA_220622
PM_01_PL_RN_BA_220622             1.0000000             0.9910972             0.9908423             0.9788182
PM_03_PL_RN_BA_220622             0.9910972             1.0000000             0.9891178             0.9800172
PM_04_PL_RN_BA_220622             0.9908423             0.9891178             1.0000000             0.9667516
PM_06_PL_RN_BA_220622             0.9788182             0.9800172             0.9667516             1.0000000
PM_07_PL_RN_BA_220622             0.9885582             0.9876787             0.9956143             0.9652953
PM_08_PL_RN_BA_220622             0.9939659             0.9902991             0.9935189             0.9759458
                      PM_07_PL_RN_BA_220622 PM_08_PL_RN_BA_220622 PM_09_PL_RN_BA_220622 PM_10_PL_RN_BA_220622
PM_01_PL_RN_BA_220622             0.9885582             0.9939659             0.9895170             0.9912643
PM_03_PL_RN_BA_220622             0.9876787             0.9902991             0.9878119             0.9879389
PM_04_PL_RN_BA_220622             0.9956143             0.9935189             0.9956073             0.9867542
PM_06_PL_RN_BA_220622             0.9652953             0.9759458             0.9678336             0.9767337
PM_07_PL_RN_BA_220622             1.0000000             0.9932818             0.9952379             0.9866332
PM_08_PL_RN_BA_220622             0.9932818             1.0000000             0.9930632             0.9925234
                      PM_11_PL_RN_BA_220622 PM_12_PL_RN_BA_220622 PM_13_PL_RN_BA_220622 PM_14_PL_RN_BA_220720
PM_01_PL_RN_BA_220622             0.9889402             0.9907880             0.9869112             0.9764878
PM_03_PL_RN_BA_220622             0.9857152             0.9904311             0.9869310             0.9699733
PM_04_PL_RN_BA_220622             0.9951765             0.9894851             0.9961892             0.9724355
PM_06_PL_RN_BA_220622             0.9648406             0.9724260             0.9637285             0.9591717
PM_07_PL_RN_BA_220622             0.9957924             0.9884486             0.9952194             0.9700284
PM_08_PL_RN_BA_220622             0.9924971             0.9897543             0.9896300             0.9761248
                      PM_15_PL_RN_BA_220622 PM_16_PL_RN_BA_220622 PM_17_PL_RN_BA_220622 PM_18_PL_RN_BA_220622
PM_01_PL_RN_BA_220622             0.9832401             0.9862336             0.9864013             0.9910573
PM_03_PL_RN_BA_220622             0.9827567             0.9859469             0.9861141             0.9892271
PM_04_PL_RN_BA_220622             0.9911250             0.9962128             0.9853669             0.9857015
PM_06_PL_RN_BA_220622             0.9610647             0.9638893             0.9721627             0.9803519
PM_07_PL_RN_BA_220622             0.9914297             0.9952613             0.9865335             0.9850350
PM_08_PL_RN_BA_220622             0.9860369             0.9908062             0.9862337             0.9904943
                      PM_19_PL_RN_BA_220622 PM_20_PL_RN_BA_220622 PM_21_PL_RN_BA_220622 PM_22_PL_RN_BA_220720
PM_01_PL_RN_BA_220622             0.9893315             0.9895382             0.9844077             0.9802875
PM_03_PL_RN_BA_220622             0.9888412             0.9880382             0.9853940             0.9816627
PM_04_PL_RN_BA_220622             0.9971654             0.9867954             0.9937606             0.9788522
PM_06_PL_RN_BA_220622             0.9669540             0.9738614             0.9622983             0.9717783
PM_07_PL_RN_BA_220622             0.9967776             0.9854025             0.9945551             0.9774128
PM_08_PL_RN_BA_220622             0.9931623             0.9905607             0.9885249             0.9803582
                      PM_24_PL_RN_BA_220622 PM_25_PL_RN_BA_220622 PM_26_PL_RN_BA_220623 PM_27_PL_RN_BA_220623
PM_01_PL_RN_BA_220622             0.9910214             0.9922485             0.9928030             0.9790891
PM_03_PL_RN_BA_220622             0.9857184             0.9889739             0.9885774             0.9774138
PM_04_PL_RN_BA_220622             0.9863849             0.9889040             0.9953340             0.9835981
PM_06_PL_RN_BA_220622             0.9737984             0.9778924             0.9693387             0.9605199
PM_07_PL_RN_BA_220622             0.9872452             0.9884993             0.9939113             0.9819150
PM_08_PL_RN_BA_220622             0.9924648             0.9917105             0.9937963             0.9800863
                      PM_28_PL_RN_BA_220623 PM_29_PL_RN_BA_220623 PM_30_PL_RN_BA_220720 PM_31_PL_RN_BA_220623
PM_01_PL_RN_BA_220622             0.9933404             0.9894508             0.9909944             0.9904141
PM_03_PL_RN_BA_220622             0.9866288             0.9900216             0.9878813             0.9911445
PM_04_PL_RN_BA_220622             0.9885498             0.9833870             0.9929728             0.9913255
PM_06_PL_RN_BA_220622             0.9740784             0.9845542             0.9696201             0.9748131
PM_07_PL_RN_BA_220622             0.9899298             0.9812471             0.9942135             0.9896455
PM_08_PL_RN_BA_220622             0.9939345             0.9890249             0.9937233             0.9905585
                      PM_32_PL_RN_BA_220720 PM_33_PL_RN_BA_220623 PM_36_PL_RN_BA_220623 PM_37_PL_RN_BA_220623
PM_01_PL_RN_BA_220622             0.9899136             0.9842380             0.9895537             0.9949305
PM_03_PL_RN_BA_220622             0.9859173             0.9853551             0.9855686             0.9931103
PM_04_PL_RN_BA_220622             0.9896973             0.9765829             0.9909755             0.9904631
PM_06_PL_RN_BA_220622             0.9703771             0.9822009             0.9683041             0.9828744
PM_07_PL_RN_BA_220622             0.9879403             0.9780689             0.9934616             0.9893501
PM_08_PL_RN_BA_220622             0.9918477             0.9862346             0.9922855             0.9940937
                      PM_38_PL_RN_BA_220623 PM_39_PL_RN_BA_220720 PM_40_PL_RN_BA_220624 PM_41_PL_RN_BA_220624
PM_01_PL_RN_BA_220622             0.9891455             0.9898819             0.9902533             0.9908972
PM_03_PL_RN_BA_220622             0.9881962             0.9883877             0.9890439             0.9902173
PM_04_PL_RN_BA_220622             0.9966812             0.9860993             0.9975169             0.9933809
PM_06_PL_RN_BA_220622             0.9655941             0.9751445             0.9657767             0.9686879
PM_07_PL_RN_BA_220622             0.9944172             0.9864230             0.9948443             0.9937233
PM_08_PL_RN_BA_220622             0.9908344             0.9885173             0.9919258             0.9928422
                      PM_42_PL_RN_BA_220624 PM_43_PL_RN_BA_220720 PM_44_PL_RN_BA_220624 PM_45_PL_RN_BA_220624
PM_01_PL_RN_BA_220622             0.9940023             0.9716941             0.9855997             0.9894707
PM_03_PL_RN_BA_220622             0.9924331             0.9754358             0.9851053             0.9896770
PM_04_PL_RN_BA_220622             0.9923110             0.9591240             0.9730816             0.9973428
PM_06_PL_RN_BA_220622             0.9789120             0.9830714             0.9879308             0.9659792
PM_07_PL_RN_BA_220622             0.9884774             0.9577194             0.9712228             0.9946679
PM_08_PL_RN_BA_220622             0.9921656             0.9679535             0.9824618             0.9916550
                      PM_46_PL_RN_BA_220624 PM_47_PL_RN_BA_220624 PM_48_PL_RN_BA_220720 PM_49_PL_RN_BA_220720
PM_01_PL_RN_BA_220622             0.9899534             0.9907368             0.9853260             0.9915726
PM_03_PL_RN_BA_220622             0.9903483             0.9916739             0.9857574             0.9881633
PM_04_PL_RN_BA_220622             0.9825910             0.9948399             0.9934015             0.9960451
PM_06_PL_RN_BA_220622             0.9846138             0.9690746             0.9611666             0.9668113
PM_07_PL_RN_BA_220622             0.9798687             0.9925659             0.9935555             0.9934250
PM_08_PL_RN_BA_220622             0.9875212             0.9916737             0.9886173             0.9931984
                      PM_50_PL_RN_BA_220720 PM_51_PL_RN_BA_220920 PM_52_PL_RN_BA_220920 PM_54_PL_RN_BA_220920
PM_01_PL_RN_BA_220622             0.9937004             0.9885754             0.9864976             0.9927054
PM_03_PL_RN_BA_220622             0.9907624             0.9883850             0.9852506             0.9921812
PM_04_PL_RN_BA_220622             0.9940794             0.9962668             0.9914533             0.9873088
PM_06_PL_RN_BA_220622             0.9735155             0.9667552             0.9666389             0.9831078
PM_07_PL_RN_BA_220622             0.9925445             0.9939848             0.9939015             0.9852994
PM_08_PL_RN_BA_220622             0.9931208             0.9906672             0.9918310             0.9909328
                      PM_55_PL_RN_BA_220920 PM_56_PL_RN_BA_220923 PM_57_PL_RN_BA_220920 PM_58_PL_RN_BA_220923
PM_01_PL_RN_BA_220622             0.9768707             0.9939164             0.9931044             0.9874121
PM_03_PL_RN_BA_220622             0.9800790             0.9914302             0.9884081             0.9867016
PM_04_PL_RN_BA_220622             0.9668560             0.9857882             0.9929644             0.9954676
PM_06_PL_RN_BA_220622             0.9841286             0.9849932             0.9716605             0.9656613
PM_07_PL_RN_BA_220622             0.9655719             0.9837626             0.9933536             0.9966771
PM_08_PL_RN_BA_220622             0.9749519             0.9909946             0.9929169             0.9914692
pheatmap(rld_cor_PL,
         # color=colorRampPalette(c("", "", ""))(200),  ## The color palette.
         display_numbers=matrix(ifelse(rld_cor_PL>0.99995, "*", ""), nrow(rld_cor_PL)), fontsize_row=5)


# PM
rld_mat_PM=assay(rld_PM)
rld_cor_PM=cor(rld_mat_PM)
head(rld_cor_PM)
                      PM_01_PM_RN_BA_220613 PM_03_PM_RN_BA_220613 PM_04_PM_RN_BA_220613 PM_06_PM_RN_BA_220613
PM_01_PM_RN_BA_220613             1.0000000             0.9973757             0.9985904             0.9987619
PM_03_PM_RN_BA_220613             0.9973757             1.0000000             0.9965159             0.9967169
PM_04_PM_RN_BA_220613             0.9985904             0.9965159             1.0000000             0.9986604
PM_06_PM_RN_BA_220613             0.9987619             0.9967169             0.9986604             1.0000000
PM_07_PM_RN_BA_220613             0.9982264             0.9965426             0.9982525             0.9985847
PM_08_PM_RN_BA_220613             0.9983503             0.9969611             0.9984054             0.9986196
                      PM_07_PM_RN_BA_220613 PM_08_PM_RN_BA_220613 PM_09_PM_RN_BA_220613 PM_10_PM_RN_BA_220613
PM_01_PM_RN_BA_220613             0.9982264             0.9983503             0.9988498             0.9978903
PM_03_PM_RN_BA_220613             0.9965426             0.9969611             0.9971380             0.9962465
PM_04_PM_RN_BA_220613             0.9982525             0.9984054             0.9985171             0.9978920
PM_06_PM_RN_BA_220613             0.9985847             0.9986196             0.9983856             0.9977571
PM_07_PM_RN_BA_220613             1.0000000             0.9983868             0.9981028             0.9975851
PM_08_PM_RN_BA_220613             0.9983868             1.0000000             0.9981590             0.9979193
                      PM_11_PM_RN_BA_220613 PM_12_PM_RN_BA_220613 PM_13_PM_RN_BA_220613 PM_14_PM_RN_BA_220614
PM_01_PM_RN_BA_220613             0.9987021             0.9981612             0.9987513             0.9990086
PM_03_PM_RN_BA_220613             0.9971445             0.9967268             0.9969281             0.9973247
PM_04_PM_RN_BA_220613             0.9987208             0.9984499             0.9985884             0.9988004
PM_06_PM_RN_BA_220613             0.9988347             0.9986200             0.9985122             0.9988176
PM_07_PM_RN_BA_220613             0.9986176             0.9983615             0.9983141             0.9985533
PM_08_PM_RN_BA_220613             0.9986957             0.9987288             0.9981208             0.9985569
                      PM_15_PM_RN_BA_220614 PM_16_PM_RN_BA_220614 PM_17_PM_RN_BA_220719 PM_18_PM_RN_BA_220614
PM_01_PM_RN_BA_220613             0.9987772             0.9982192             0.9982712             0.9985237
PM_03_PM_RN_BA_220613             0.9968441             0.9964356             0.9970057             0.9970611
PM_04_PM_RN_BA_220613             0.9987165             0.9983014             0.9979029             0.9983203
PM_06_PM_RN_BA_220613             0.9984843             0.9982547             0.9980772             0.9984894
PM_07_PM_RN_BA_220613             0.9981030             0.9980492             0.9975320             0.9984014
PM_08_PM_RN_BA_220613             0.9980320             0.9983454             0.9979423             0.9982200
                      PM_19_PM_RN_BA_220614 PM_20_PM_RN_BA_220614 PM_21_PM_RN_BA_220614 PM_22_PM_RN_BA_220614
PM_01_PM_RN_BA_220613             0.9983051             0.9923845             0.9984041             0.9974719
PM_03_PM_RN_BA_220613             0.9964955             0.9912391             0.9964212             0.9962789
PM_04_PM_RN_BA_220613             0.9982412             0.9916291             0.9982942             0.9971858
PM_06_PM_RN_BA_220613             0.9977185             0.9922680             0.9978915             0.9978763
PM_07_PM_RN_BA_220613             0.9974616             0.9918770             0.9974821             0.9979052
PM_08_PM_RN_BA_220613             0.9974662             0.9936361             0.9977280             0.9985899
                      PM_23_PM_RN_BA_220719 PM_24_PM_RN_BA_220614 PM_25_PM_RN_BA_220614 PM_26_PM_RN_BA_220615
PM_01_PM_RN_BA_220613             0.9920253             0.9988268             0.9982624             0.9982536
PM_03_PM_RN_BA_220613             0.9903870             0.9971421             0.9969494             0.9964475
PM_04_PM_RN_BA_220613             0.9921391             0.9989218             0.9980160             0.9980085
PM_06_PM_RN_BA_220613             0.9931568             0.9987724             0.9983870             0.9978310
PM_07_PM_RN_BA_220613             0.9930612             0.9984133             0.9979679             0.9974655
PM_08_PM_RN_BA_220613             0.9945537             0.9985643             0.9988006             0.9976686
                      PM_27_PM_RN_BA_220615 PM_28_PM_RN_BA_220615 PM_29_PM_RN_BA_220615 PM_30_PM_RN_BA_220615
PM_01_PM_RN_BA_220613             0.9980094             0.9975200             0.9974110             0.9976490
PM_03_PM_RN_BA_220613             0.9960510             0.9961710             0.9966255             0.9964691
PM_04_PM_RN_BA_220613             0.9980859             0.9974715             0.9974742             0.9977576
PM_06_PM_RN_BA_220613             0.9981876             0.9972144             0.9978113             0.9981469
PM_07_PM_RN_BA_220613             0.9979672             0.9966964             0.9977005             0.9981801
PM_08_PM_RN_BA_220613             0.9984926             0.9970235             0.9983968             0.9989239
                      PM_31_PM_RN_BA_220615 PM_33_PM_RN_BA_220615 PM_36_PM_RN_BA_220615 PM_37_PM_RN_BA_220615
PM_01_PM_RN_BA_220613             0.9977794             0.9973311             0.9986959             0.9985054
PM_03_PM_RN_BA_220613             0.9957756             0.9972537             0.9974029             0.9971031
PM_04_PM_RN_BA_220613             0.9978578             0.9970381             0.9982711             0.9983527
PM_06_PM_RN_BA_220613             0.9981783             0.9972737             0.9982182             0.9984263
PM_07_PM_RN_BA_220613             0.9978319             0.9970234             0.9982121             0.9982932
PM_08_PM_RN_BA_220613             0.9985372             0.9970778             0.9980394             0.9981640
                      PM_38_PM_RN_BA_220615 PM_39_PM_RN_BA_220615 PM_40_PM_RN_BA_220616 PM_41_PM_RN_BA_220616
PM_01_PM_RN_BA_220613             0.9984232             0.9982751             0.9969698             0.9984334
PM_03_PM_RN_BA_220613             0.9963453             0.9968883             0.9964748             0.9966821
PM_04_PM_RN_BA_220613             0.9984750             0.9979667             0.9969069             0.9985163
PM_06_PM_RN_BA_220613             0.9985518             0.9974829             0.9974060             0.9986491
PM_07_PM_RN_BA_220613             0.9983308             0.9972670             0.9973491             0.9983732
PM_08_PM_RN_BA_220613             0.9985519             0.9971138             0.9979958             0.9983455
                      PM_42_PM_RN_BA_220616 PM_43_PM_RN_BA_220616 PM_44_PM_RN_BA_220616 PM_45_PM_RN_BA_220616
PM_01_PM_RN_BA_220613             0.9976977             0.9938385             0.9972014             0.9986992
PM_03_PM_RN_BA_220613             0.9960416             0.9923238             0.9958658             0.9970957
PM_04_PM_RN_BA_220613             0.9979002             0.9938706             0.9974646             0.9986205
PM_06_PM_RN_BA_220613             0.9984540             0.9944048             0.9982074             0.9987075
PM_07_PM_RN_BA_220613             0.9982859             0.9946017             0.9977906             0.9983220
PM_08_PM_RN_BA_220613             0.9985283             0.9948631             0.9982159             0.9985586
                      PM_46_PM_RN_BA_220616 PM_47_PM_RN_BA_220616 PM_48_PM_RN_BA_220719 PM_49_PM_RN_BA_220719
PM_01_PM_RN_BA_220613             0.9987134             0.9962924             0.9984630             0.9976713
PM_03_PM_RN_BA_220613             0.9974159             0.9968620             0.9973488             0.9965995
PM_04_PM_RN_BA_220613             0.9984216             0.9953985             0.9981605             0.9976977
PM_06_PM_RN_BA_220613             0.9981395             0.9959300             0.9981725             0.9980737
PM_07_PM_RN_BA_220613             0.9979053             0.9959119             0.9979720             0.9981773
PM_08_PM_RN_BA_220613             0.9981801             0.9969624             0.9985422             0.9988883
                      PM_50_PM_RN_BA_220719 PM_51_PM_RN_BA_220920 PM_52_PM_RN_BA_220920 PM_53_PM_RN_BA_220920
PM_01_PM_RN_BA_220613             0.9982543             0.9962985             0.9979297             0.9985335
PM_03_PM_RN_BA_220613             0.9968178             0.9946202             0.9962293             0.9975803
PM_04_PM_RN_BA_220613             0.9979204             0.9964866             0.9981757             0.9983194
PM_06_PM_RN_BA_220613             0.9983608             0.9972383             0.9985343             0.9986150
PM_07_PM_RN_BA_220613             0.9980038             0.9970392             0.9985421             0.9984662
PM_08_PM_RN_BA_220613             0.9985258             0.9980670             0.9986091             0.9985065
                      PM_54_PM_RN_BA_220920 PM_55_PM_RN_BA_220920 PM_56_PM_RN_BA_220920 PM_57_PM_RN_BA_220920
PM_01_PM_RN_BA_220613             0.9971791             0.9912566             0.9985562             0.9967177
PM_03_PM_RN_BA_220613             0.9951933             0.9907744             0.9962658             0.9960258
PM_04_PM_RN_BA_220613             0.9973352             0.9914641             0.9985717             0.9958937
PM_06_PM_RN_BA_220613             0.9973462             0.9923627             0.9984169             0.9951978
PM_07_PM_RN_BA_220613             0.9970108             0.9926741             0.9979450             0.9949202
PM_08_PM_RN_BA_220613             0.9978954             0.9930917             0.9981147             0.9950165
                      PM_58_PM_RN_BA_220920
PM_01_PM_RN_BA_220613             0.9977199
PM_03_PM_RN_BA_220613             0.9966960
PM_04_PM_RN_BA_220613             0.9972143
PM_06_PM_RN_BA_220613             0.9967604
PM_07_PM_RN_BA_220613             0.9969378
PM_08_PM_RN_BA_220613             0.9966285
pheatmap(rld_cor_PM,
         # color=colorRampPalette(c("", "", ""))(200),  ## The color palette.
         display_numbers=matrix(ifelse(rld_cor_PM>0.99995, "*", ""), nrow(rld_cor_PM)), fontsize_row=5)


# PS
rld_mat_PS=assay(rld_PS)
rld_cor_PS=cor(rld_mat_PS)
head(rld_cor_PS)
                      PM_01_PS_RN_BA_220627 PM_02_PS_RN_BA_220627 PM_03_PS_RN_BA_220627 PM_04_PS_RN_BA_220627
PM_01_PS_RN_BA_220627             1.0000000             0.9606450             0.8869079             0.9811236
PM_02_PS_RN_BA_220627             0.9606450             1.0000000             0.8948609             0.9613389
PM_03_PS_RN_BA_220627             0.8869079             0.8948609             1.0000000             0.8837305
PM_04_PS_RN_BA_220627             0.9811236             0.9613389             0.8837305             1.0000000
PM_06_PS_RN_BA_220627             0.9831240             0.9534672             0.8675734             0.9784720
PM_07_PS_RN_BA_220627             0.9837870             0.9539435             0.8616793             0.9879060
                      PM_06_PS_RN_BA_220627 PM_07_PS_RN_BA_220627 PM_08_PS_RN_BA_220627 PM_11_PS_RN_BA_220627
PM_01_PS_RN_BA_220627             0.9831240             0.9837870             0.7755913             0.9831499
PM_02_PS_RN_BA_220627             0.9534672             0.9539435             0.7936407             0.9512955
PM_03_PS_RN_BA_220627             0.8675734             0.8616793             0.9555562             0.8592704
PM_04_PS_RN_BA_220627             0.9784720             0.9879060             0.7719992             0.9876247
PM_06_PS_RN_BA_220627             1.0000000             0.9857576             0.7482938             0.9859800
PM_07_PS_RN_BA_220627             0.9857576             1.0000000             0.7426523             0.9953816
                      PM_13_PS_RN_BA_220627 PM_14_PS_RN_BA_220628 PM_15_PS_RN_BA_220714 PM_16_PS_RN_BA_220628
PM_01_PS_RN_BA_220627             0.9759046             0.9849443             0.9826522             0.9865720
PM_02_PS_RN_BA_220627             0.9654009             0.9559280             0.9517803             0.9515115
PM_03_PS_RN_BA_220627             0.9183266             0.8654967             0.8595112             0.8713983
PM_04_PS_RN_BA_220627             0.9758798             0.9864787             0.9877557             0.9833672
PM_06_PS_RN_BA_220627             0.9632580             0.9821050             0.9850207             0.9865273
PM_07_PS_RN_BA_220627             0.9705848             0.9909780             0.9945672             0.9898921
                      PM_17_PS_RN_BA_220628 PM_18_PS_RN_BA_220628 PM_22_PS_RN_BA_220706 PM_23_PS_RN_BA_220628
PM_01_PS_RN_BA_220627             0.9830409             0.9222055             0.7924112             0.9852402
PM_02_PS_RN_BA_220627             0.9532591             0.9268354             0.8256418             0.9555273
PM_03_PS_RN_BA_220627             0.8583692             0.9658484             0.9265663             0.8810603
PM_04_PS_RN_BA_220627             0.9778826             0.9232192             0.7952704             0.9807152
PM_06_PS_RN_BA_220627             0.9869623             0.9038526             0.7637763             0.9850447
PM_07_PS_RN_BA_220627             0.9873818             0.9045864             0.7658308             0.9867451
                      PM_24_PS_RN_BA_220628 PM_25_PS_RN_BA_220628 PM_27_PS_RN_BA_220628 PM_29_PS_RN_BA_220628
PM_01_PS_RN_BA_220627             0.7705787             0.9428463             0.8199152             0.8684170
PM_02_PS_RN_BA_220627             0.7869594             0.9483247             0.8388339             0.8788922
PM_03_PS_RN_BA_220627             0.9489078             0.9262650             0.9715437             0.9646375
PM_04_PS_RN_BA_220627             0.7657202             0.9370881             0.8184634             0.8670901
PM_06_PS_RN_BA_220627             0.7423229             0.9241191             0.7945800             0.8472343
PM_07_PS_RN_BA_220627             0.7361024             0.9248893             0.7907046             0.8471786
                      PM_30_PS_RN_BA_220706 PM_31_PS_RN_BA_220630 PM_33_PS_RN_BA_220630 PM_35_PS_RN_BA_220630
PM_01_PS_RN_BA_220627             0.9799911             0.9266582             0.8227289             0.9811261
PM_02_PS_RN_BA_220627             0.9571301             0.9265018             0.8463876             0.9491906
PM_03_PS_RN_BA_220627             0.8880815             0.9404344             0.9393521             0.8687451
PM_04_PS_RN_BA_220627             0.9669150             0.9287156             0.8204771             0.9775745
PM_06_PS_RN_BA_220627             0.9665778             0.9145174             0.7961030             0.9900084
PM_07_PS_RN_BA_220627             0.9696289             0.9142789             0.7957224             0.9865509
                      PM_36_PS_RN_BA_220630 PM_37_PS_RN_BA_220630 PM_38_PS_RN_BA_220630 PM_39_PS_RN_BA_220630
PM_01_PS_RN_BA_220627             0.9822193             0.9613822             0.9772613             0.9560031
PM_02_PS_RN_BA_220627             0.9535603             0.9580780             0.9583482             0.9669563
PM_03_PS_RN_BA_220627             0.8771271             0.8948083             0.8950081             0.8897202
PM_04_PS_RN_BA_220627             0.9833107             0.9544933             0.9834811             0.9504566
PM_06_PS_RN_BA_220627             0.9798069             0.9492800             0.9787246             0.9487470
PM_07_PS_RN_BA_220627             0.9858837             0.9523343             0.9809602             0.9450771
                      PM_40_PS_RN_BA_220630 PM_42_PS_RN_BA_220630 PM_43_PS_RN_BA_220630 PM_44_PS_RN_BA_220630
PM_01_PS_RN_BA_220627             0.7608749             0.8575425             0.7754604             0.9790492
PM_02_PS_RN_BA_220627             0.8005038             0.8866383             0.7990796             0.9587052
PM_03_PS_RN_BA_220627             0.8929633             0.9311835             0.9523295             0.8659574
PM_04_PS_RN_BA_220627             0.7698169             0.8616466             0.7750679             0.9804302
PM_06_PS_RN_BA_220627             0.7335992             0.8342816             0.7472615             0.9895171
PM_07_PS_RN_BA_220627             0.7395331             0.8390196             0.7443485             0.9859969
                      PM_47_PS_RN_BA_220706 PM_48_PS_RN_BA_220714 PM_49_PS_RN_BA_220714 PM_50_PS_RN_BA_220714
PM_01_PS_RN_BA_220627             0.8937449             0.9550159             0.7635917             0.9821767
PM_02_PS_RN_BA_220627             0.9010620             0.9608715             0.7783919             0.9596088
PM_03_PS_RN_BA_220627             0.9886646             0.9292460             0.9524269             0.8791126
PM_04_PS_RN_BA_220627             0.8920354             0.9551523             0.7581308             0.9899734
PM_06_PS_RN_BA_220627             0.8753964             0.9453726             0.7362177             0.9830774
PM_07_PS_RN_BA_220627             0.8716289             0.9441045             0.7287314             0.9915495
                      PM_52_PS_RN_BA_220921 PM_53_PS_RN_BA_220921 PM_54_PS_RN_BA_220921 PM_55_PS_RN_BA_220921
PM_01_PS_RN_BA_220627             0.9643769             0.7397205             0.9767794             0.7744572
PM_02_PS_RN_BA_220627             0.9581497             0.7510873             0.9769598             0.7982340
PM_03_PS_RN_BA_220627             0.9320928             0.9361341             0.8959031             0.9461651
PM_04_PS_RN_BA_220627             0.9641459             0.7316286             0.9765499             0.7739316
PM_06_PS_RN_BA_220627             0.9520287             0.7127788             0.9753158             0.7466492
PM_07_PS_RN_BA_220627             0.9525584             0.7025515             0.9728629             0.7436672
                      PM_56_PS_RN_BA_220921 PM_57_PS_RN_BA_220921 PM_58_PS_RN_BA_220921
PM_01_PS_RN_BA_220627             0.9843753             0.9088365             0.9800834
PM_02_PS_RN_BA_220627             0.9556750             0.9198265             0.9604107
PM_03_PS_RN_BA_220627             0.8687782             0.9714176             0.8868092
PM_04_PS_RN_BA_220627             0.9837168             0.9056669             0.9882764
PM_06_PS_RN_BA_220627             0.9845354             0.8874210             0.9786215
PM_07_PS_RN_BA_220627             0.9907088             0.8851451             0.9888248
pheatmap(rld_cor_PS,
         # color=colorRampPalette(c("", "", ""))(200),  ## The color palette.
         display_numbers=matrix(ifelse(rld_cor_PS>0.99995, "*", ""), nrow(rld_cor_PS)), fontsize_row=5)

DESeq2 Analysis

Performs the DESeq2 analysis.

dds_PB=DESeq(dds_PB)
using pre-existing size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 872 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
dds_PL=DESeq(dds_PL)
using pre-existing size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 553 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
dds_PM=DESeq(dds_PM)
using pre-existing size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 1023 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing
dds_PS=DESeq(dds_PS)
using pre-existing size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 5513 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing

Step-by-step breakdown to the DESeq2 analysis: Step 1: estimate size factors (check size factors, total number of raw counts per sample, total number of normalized counts per sample)

# PB
sizeFactors(dds_PB)
PM_01_PB_RN_BA_220603 PM_03_PB_RN_BA_220607 PM_04_PB_RN_BA_220607 PM_05_PB_RN_BA_220606 PM_06_PB_RN_BA_220606 
            1.9927487             0.6533585             1.5179348             0.0765266             1.2907222 
PM_07_PB_RN_BA_220608 PM_08_PB_RN_BA_220608 PM_09_PB_RN_BA_220608 PM_10_PB_RN_BA_220608 PM_11_PB_RN_BA_220608 
            1.3418045             0.6808323             1.4021222             0.7180940             1.7293236 
PM_12_PB_RN_BA_220608 PM_13_PB_RN_BA_220608 PM_14_PB_RN_BA_220606 PM_15_PB_RN_BA_220606 PM_16_PB_RN_BA_220607 
            0.3475635             1.4749431             1.4372030             1.2532442             1.4619712 
PM_17_PB_RN_BA_220718 PM_18_PB_RN_BA_220608 PM_19_PB_RN_BA_220607 PM_20_PB_RN_BA_220607 PM_22_PB_RN_BA_220603 
            0.6044018             1.9538787             1.9826549             1.0651692             1.1004654 
PM_23_PB_RN_BA_220606 PM_24_PB_RN_BA_220606 PM_25_PB_RN_BA_220607 PM_26_PB_RN_BA_220608 PM_27_PB_RN_BA_220603 
            1.0663400             1.3711046             1.0738322             1.3351838             1.0590360 
PM_28_PB_RN_BA_220607 PM_29_PB_RN_BA_220608 PM_30_PB_RN_BA_220603 PM_31_PB_RN_BA_220603 PM_32_PB_RN_BA_220603 
            1.4048117             0.2811831             0.2582569             0.7841821             1.0484875 
PM_35_PB_RN_BA_220606 PM_36_PB_RN_BA_220603 PM_37_PB_RN_BA_220606 PM_38_PB_RN_BA_220609 PM_39_PB_RN_BA_220609 
            0.1375362             1.5660193             1.6073976             1.5682022             1.8185940 
PM_40_PB_RN_BA_220603 PM_41_PB_RN_BA_220609 PM_42_PB_RN_BA_220609 PM_43_PB_RN_BA_220609 PM_44_PB_RN_BA_220609 
            1.4885983             0.3197314             1.1066387             0.8736601             1.4449211 
PM_45_PB_RN_BA_220609 PM_46_PB_RN_BA_220609 PM_47_PB_RN_BA_220609 PM_48_PB_RN_BA_220718 PM_49_PB_RN_BA_220718 
            1.4280626             1.7844170             1.0444030             1.7825095             0.6698575 
PM_50_PB_RN_BA_220718 PM_52_PB_RN_BA_220916 PM_53_PB_RN_BA_220916 PM_54_PB_RN_BA_220916 PM_55_PB_RN_BA_220916 
            1.5285517             1.3123926             0.5113159             0.8603980             0.7516655 
PM_56_PB_RN_BA_220916 PM_57_PB_RN_BA_220916 PM_58_PB_RN_BA_220916 
            1.5282431             1.7239848             1.6094768 
colSums(counts(dds_PB))
PM_01_PB_RN_BA_220603 PM_03_PB_RN_BA_220607 PM_04_PB_RN_BA_220607 PM_05_PB_RN_BA_220606 PM_06_PB_RN_BA_220606 
             32610758              26068281              24419181              62243285              28494916 
PM_07_PB_RN_BA_220608 PM_08_PB_RN_BA_220608 PM_09_PB_RN_BA_220608 PM_10_PB_RN_BA_220608 PM_11_PB_RN_BA_220608 
             23656591              24315300              22753815              15612562              26675103 
PM_12_PB_RN_BA_220608 PM_13_PB_RN_BA_220608 PM_14_PB_RN_BA_220606 PM_15_PB_RN_BA_220606 PM_16_PB_RN_BA_220607 
             56362531              23912393              26536451              22286059              24583380 
PM_17_PB_RN_BA_220718 PM_18_PB_RN_BA_220608 PM_19_PB_RN_BA_220607 PM_20_PB_RN_BA_220607 PM_22_PB_RN_BA_220603 
             18031630              34029949              34548855              27721241              23266383 
PM_23_PB_RN_BA_220606 PM_24_PB_RN_BA_220606 PM_25_PB_RN_BA_220607 PM_26_PB_RN_BA_220608 PM_27_PB_RN_BA_220603 
             19886101              21047296              18830666              24774561              18055672 
PM_28_PB_RN_BA_220607 PM_29_PB_RN_BA_220608 PM_30_PB_RN_BA_220603 PM_31_PB_RN_BA_220603 PM_32_PB_RN_BA_220603 
             26475749               9276923              11816620              15226024              21441796 
PM_35_PB_RN_BA_220606 PM_36_PB_RN_BA_220603 PM_37_PB_RN_BA_220606 PM_38_PB_RN_BA_220609 PM_39_PB_RN_BA_220609 
             10168756              29010123              30849112              30061293              28351551 
PM_40_PB_RN_BA_220603 PM_41_PB_RN_BA_220609 PM_42_PB_RN_BA_220609 PM_43_PB_RN_BA_220609 PM_44_PB_RN_BA_220609 
             25347844              23677004              18959347              22222748              29381822 
PM_45_PB_RN_BA_220609 PM_46_PB_RN_BA_220609 PM_47_PB_RN_BA_220609 PM_48_PB_RN_BA_220718 PM_49_PB_RN_BA_220718 
             21823454              33633562              19382950              30596372              19165835 
PM_50_PB_RN_BA_220718 PM_52_PB_RN_BA_220916 PM_53_PB_RN_BA_220916 PM_54_PB_RN_BA_220916 PM_55_PB_RN_BA_220916 
             27842815              20237292              13092332              13189986              19135364 
PM_56_PB_RN_BA_220916 PM_57_PB_RN_BA_220916 PM_58_PB_RN_BA_220916 
             24219328              30964760              26185826 
colSums(counts(dds_PB, normalized=TRUE))
PM_01_PB_RN_BA_220603 PM_03_PB_RN_BA_220607 PM_04_PB_RN_BA_220607 PM_05_PB_RN_BA_220606 PM_06_PB_RN_BA_220606 
             16364712              39898892              16087108             813354863              22076722 
PM_07_PB_RN_BA_220608 PM_08_PB_RN_BA_220608 PM_09_PB_RN_BA_220608 PM_10_PB_RN_BA_220608 PM_11_PB_RN_BA_220608 
             17630431              35714080              16228125              21741670              15425166 
PM_12_PB_RN_BA_220608 PM_13_PB_RN_BA_220608 PM_14_PB_RN_BA_220606 PM_15_PB_RN_BA_220606 PM_16_PB_RN_BA_220607 
            162164702              16212418              18463954              17782694              16815229 
PM_17_PB_RN_BA_220718 PM_18_PB_RN_BA_220608 PM_19_PB_RN_BA_220607 PM_20_PB_RN_BA_220607 PM_22_PB_RN_BA_220603 
             29833845              17416613              17425551              26025201              21142312 
PM_23_PB_RN_BA_220606 PM_24_PB_RN_BA_220606 PM_25_PB_RN_BA_220607 PM_26_PB_RN_BA_220608 PM_27_PB_RN_BA_220603 
             18648931              15350613              17535948              18555169              17049158 
PM_28_PB_RN_BA_220607 PM_29_PB_RN_BA_220608 PM_30_PB_RN_BA_220603 PM_31_PB_RN_BA_220603 PM_32_PB_RN_BA_220603 
             18846475              32992459              45755290              19416439              20450216 
PM_35_PB_RN_BA_220606 PM_36_PB_RN_BA_220603 PM_37_PB_RN_BA_220606 PM_38_PB_RN_BA_220609 PM_39_PB_RN_BA_220609 
             73935128              18524754              19191960              19169271              15589819 
PM_40_PB_RN_BA_220603 PM_41_PB_RN_BA_220609 PM_42_PB_RN_BA_220609 PM_43_PB_RN_BA_220609 PM_44_PB_RN_BA_220609 
             17027995              74052800              17132373              25436377              20334550 
PM_45_PB_RN_BA_220609 PM_46_PB_RN_BA_220609 PM_47_PB_RN_BA_220609 PM_48_PB_RN_BA_220718 PM_49_PB_RN_BA_220718 
             15281861              18848488              18558879              17164774              28611808 
PM_50_PB_RN_BA_220718 PM_52_PB_RN_BA_220916 PM_53_PB_RN_BA_220916 PM_54_PB_RN_BA_220916 PM_55_PB_RN_BA_220916 
             18215161              15420151              25605172              15330099              25457286 
PM_56_PB_RN_BA_220916 PM_57_PB_RN_BA_220916 PM_58_PB_RN_BA_220916 
             15847824              17961156              16269776 
# PL
sizeFactors(dds_PL)
PM_01_PL_RN_BA_220622 PM_03_PL_RN_BA_220622 PM_04_PL_RN_BA_220622 PM_06_PL_RN_BA_220622 PM_07_PL_RN_BA_220622 
           1.40297862            0.46367867            2.85696861            0.05537568            2.80900092 
PM_08_PL_RN_BA_220622 PM_09_PL_RN_BA_220622 PM_10_PL_RN_BA_220622 PM_11_PL_RN_BA_220622 PM_12_PL_RN_BA_220622 
           1.58957104            2.00337729            1.17858581            2.09246939            0.36782415 
PM_13_PL_RN_BA_220622 PM_14_PL_RN_BA_220720 PM_15_PL_RN_BA_220622 PM_16_PL_RN_BA_220622 PM_17_PL_RN_BA_220622 
           2.66309782            3.69152590            1.46677811            2.49919006            0.35155524 
PM_18_PL_RN_BA_220622 PM_19_PL_RN_BA_220622 PM_20_PL_RN_BA_220622 PM_21_PL_RN_BA_220622 PM_22_PL_RN_BA_220720 
           0.05415938            2.05344480            0.03270570            2.45919055            0.02814269 
PM_24_PL_RN_BA_220622 PM_25_PL_RN_BA_220622 PM_26_PL_RN_BA_220623 PM_27_PL_RN_BA_220623 PM_28_PL_RN_BA_220623 
           0.09620581            0.86529255            2.24341313            2.02138616            1.50732385 
PM_29_PL_RN_BA_220623 PM_30_PL_RN_BA_220720 PM_31_PL_RN_BA_220623 PM_32_PL_RN_BA_220720 PM_33_PL_RN_BA_220623 
           0.41538316            1.85433641            0.68014153            1.32914721            0.56766953 
PM_36_PL_RN_BA_220623 PM_37_PL_RN_BA_220623 PM_38_PL_RN_BA_220623 PM_39_PL_RN_BA_220720 PM_40_PL_RN_BA_220624 
           1.33532765            2.62394196            3.02302763            0.35657666            3.11030096 
PM_41_PL_RN_BA_220624 PM_42_PL_RN_BA_220624 PM_43_PL_RN_BA_220720 PM_44_PL_RN_BA_220624 PM_45_PL_RN_BA_220624 
           1.05301075            1.51788168            0.30244477            0.85706746            2.18470276 
PM_46_PL_RN_BA_220624 PM_47_PL_RN_BA_220624 PM_48_PL_RN_BA_220720 PM_49_PL_RN_BA_220720 PM_50_PL_RN_BA_220720 
           1.13637430            1.40400835            1.60445764            2.78561615            2.15553491 
PM_51_PL_RN_BA_220920 PM_52_PL_RN_BA_220920 PM_54_PL_RN_BA_220920 PM_55_PL_RN_BA_220920 PM_56_PL_RN_BA_220923 
           2.82774982            0.89931011            1.50238908            0.28197242            1.50707690 
PM_57_PL_RN_BA_220920 PM_58_PL_RN_BA_220923 
           2.06168949            3.80973657 
colSums(counts(dds_PL))
PM_01_PL_RN_BA_220622 PM_03_PL_RN_BA_220622 PM_04_PL_RN_BA_220622 PM_06_PL_RN_BA_220622 PM_07_PL_RN_BA_220622 
             16972118               6310158              28707632               2338314              32026511 
PM_08_PL_RN_BA_220622 PM_09_PL_RN_BA_220622 PM_10_PL_RN_BA_220622 PM_11_PL_RN_BA_220622 PM_12_PL_RN_BA_220622 
             18320239              23015351              15700609              23659162               5421460 
PM_13_PL_RN_BA_220622 PM_14_PL_RN_BA_220720 PM_15_PL_RN_BA_220622 PM_16_PL_RN_BA_220622 PM_17_PL_RN_BA_220622 
             28759574              47565046              18565452              27103526               7078831 
PM_18_PL_RN_BA_220622 PM_19_PL_RN_BA_220622 PM_20_PL_RN_BA_220622 PM_21_PL_RN_BA_220622 PM_22_PL_RN_BA_220720 
              1241466              22100675               1027920              28509685               2501194 
PM_24_PL_RN_BA_220622 PM_25_PL_RN_BA_220622 PM_26_PL_RN_BA_220623 PM_27_PL_RN_BA_220623 PM_28_PL_RN_BA_220623 
              2117416              12270997              21533902              21784421              20048331 
PM_29_PL_RN_BA_220623 PM_30_PL_RN_BA_220720 PM_31_PL_RN_BA_220623 PM_32_PL_RN_BA_220720 PM_33_PL_RN_BA_220623 
              4401669              24962592               8000917              13171711               7748093 
PM_36_PL_RN_BA_220623 PM_37_PL_RN_BA_220623 PM_38_PL_RN_BA_220623 PM_39_PL_RN_BA_220720 PM_40_PL_RN_BA_220624 
             17344782              28610826              28423069               7481797              30004923 
PM_41_PL_RN_BA_220624 PM_42_PL_RN_BA_220624 PM_43_PL_RN_BA_220720 PM_44_PL_RN_BA_220624 PM_45_PL_RN_BA_220624 
             13261902              17371986               4187739               9030104              22140191 
PM_46_PL_RN_BA_220624 PM_47_PL_RN_BA_220624 PM_48_PL_RN_BA_220720 PM_49_PL_RN_BA_220720 PM_50_PL_RN_BA_220720 
             13415213              14740941              20500476              27367289              22692850 
PM_51_PL_RN_BA_220920 PM_52_PL_RN_BA_220920 PM_54_PL_RN_BA_220920 PM_55_PL_RN_BA_220920 PM_56_PL_RN_BA_220923 
             28682485              14346107              16788965               3608214              19865015 
PM_57_PL_RN_BA_220920 PM_58_PL_RN_BA_220923 
             23736194              43400131 
colSums(counts(dds_PL, normalized=TRUE))
PM_01_PL_RN_BA_220622 PM_03_PL_RN_BA_220622 PM_04_PL_RN_BA_220622 PM_06_PL_RN_BA_220622 PM_07_PL_RN_BA_220622 
             12097204              13608903              10048284              42226371              11401389 
PM_08_PL_RN_BA_220622 PM_09_PL_RN_BA_220622 PM_10_PL_RN_BA_220622 PM_11_PL_RN_BA_220622 PM_12_PL_RN_BA_220622 
             11525272              11488276              13321566              11306814              14739271 
PM_13_PL_RN_BA_220622 PM_14_PL_RN_BA_220720 PM_15_PL_RN_BA_220622 PM_16_PL_RN_BA_220622 PM_17_PL_RN_BA_220622 
             10799293              12884928              12657301              10844924              20135757 
PM_18_PL_RN_BA_220622 PM_19_PL_RN_BA_220622 PM_20_PL_RN_BA_220622 PM_21_PL_RN_BA_220622 PM_22_PL_RN_BA_220720 
             22922456              10762732              31429389              11593117              88875427 
PM_24_PL_RN_BA_220622 PM_25_PL_RN_BA_220622 PM_26_PL_RN_BA_220623 PM_27_PL_RN_BA_220623 PM_28_PL_RN_BA_220623 
             22009232              14181327               9598723              10776971              13300613 
PM_29_PL_RN_BA_220623 PM_30_PL_RN_BA_220720 PM_31_PL_RN_BA_220623 PM_32_PL_RN_BA_220720 PM_33_PL_RN_BA_220623 
             10596648              13461739              11763606               9909896              13648950 
PM_36_PL_RN_BA_220623 PM_37_PL_RN_BA_220623 PM_38_PL_RN_BA_220623 PM_39_PL_RN_BA_220720 PM_40_PL_RN_BA_220624 
             12989158              10903757               9402186              20982296               9646952 
PM_41_PL_RN_BA_220624 PM_42_PL_RN_BA_220624 PM_43_PL_RN_BA_220720 PM_44_PL_RN_BA_220624 PM_45_PL_RN_BA_220624 
             12594270              11444888              13846293              10536048              10134189 
PM_46_PL_RN_BA_220624 PM_47_PL_RN_BA_220624 PM_48_PL_RN_BA_220720 PM_49_PL_RN_BA_220720 PM_50_PL_RN_BA_220720 
             11805277              10499183              12777200               9824501              10527712 
PM_51_PL_RN_BA_220920 PM_52_PL_RN_BA_220920 PM_54_PL_RN_BA_220920 PM_55_PL_RN_BA_220920 PM_56_PL_RN_BA_220923 
             10143219              15952347              11174845              12796337              13181155 
PM_57_PL_RN_BA_220920 PM_58_PL_RN_BA_220923 
             11512982              11391898 
# PM
sizeFactors(dds_PM)
PM_01_PM_RN_BA_220613 PM_03_PM_RN_BA_220613 PM_04_PM_RN_BA_220613 PM_06_PM_RN_BA_220613 PM_07_PM_RN_BA_220613 
            1.5088832             1.4255698             1.6204817             1.1970366             0.9800432 
PM_08_PM_RN_BA_220613 PM_09_PM_RN_BA_220613 PM_10_PM_RN_BA_220613 PM_11_PM_RN_BA_220613 PM_12_PM_RN_BA_220613 
            1.2978390             1.4868746             1.1757672             1.1081042             1.1678733 
PM_13_PM_RN_BA_220613 PM_14_PM_RN_BA_220614 PM_15_PM_RN_BA_220614 PM_16_PM_RN_BA_220614 PM_17_PM_RN_BA_220719 
            1.1631088             1.8022065             1.0390151             1.2341993             0.6961912 
PM_18_PM_RN_BA_220614 PM_19_PM_RN_BA_220614 PM_20_PM_RN_BA_220614 PM_21_PM_RN_BA_220614 PM_22_PM_RN_BA_220614 
            0.9084388             1.4110597             0.2821348             1.3634059             0.7242727 
PM_23_PM_RN_BA_220719 PM_24_PM_RN_BA_220614 PM_25_PM_RN_BA_220614 PM_26_PM_RN_BA_220615 PM_27_PM_RN_BA_220615 
            0.4507395             1.3024728             1.3538257             1.4185118             1.2038617 
PM_28_PM_RN_BA_220615 PM_29_PM_RN_BA_220615 PM_30_PM_RN_BA_220615 PM_31_PM_RN_BA_220615 PM_33_PM_RN_BA_220615 
            1.3040438             0.6821155             1.1197386             1.5807151             0.1739217 
PM_36_PM_RN_BA_220615 PM_37_PM_RN_BA_220615 PM_38_PM_RN_BA_220615 PM_39_PM_RN_BA_220615 PM_40_PM_RN_BA_220616 
            1.6355448             0.4399030             1.1170166             1.2976556             0.1718784 
PM_41_PM_RN_BA_220616 PM_42_PM_RN_BA_220616 PM_43_PM_RN_BA_220616 PM_44_PM_RN_BA_220616 PM_45_PM_RN_BA_220616 
            0.8429614             0.7767747             0.9374023             1.2488331             1.3410268 
PM_46_PM_RN_BA_220616 PM_47_PM_RN_BA_220616 PM_48_PM_RN_BA_220719 PM_49_PM_RN_BA_220719 PM_50_PM_RN_BA_220719 
            1.1273183             1.1636958             1.4509711             1.2990044             0.5381660 
PM_51_PM_RN_BA_220920 PM_52_PM_RN_BA_220920 PM_53_PM_RN_BA_220920 PM_54_PM_RN_BA_220920 PM_55_PM_RN_BA_220920 
            1.4074151             1.0996795             2.1120325             1.5010878             0.1360339 
PM_56_PM_RN_BA_220920 PM_57_PM_RN_BA_220920 PM_58_PM_RN_BA_220920 
            1.6941223             1.5719031             1.5294640 
colSums(counts(dds_PM))
PM_01_PM_RN_BA_220613 PM_03_PM_RN_BA_220613 PM_04_PM_RN_BA_220613 PM_06_PM_RN_BA_220613 PM_07_PM_RN_BA_220613 
             46376872              55014579              43656352              35010196              31094263 
PM_08_PM_RN_BA_220613 PM_09_PM_RN_BA_220613 PM_10_PM_RN_BA_220613 PM_11_PM_RN_BA_220613 PM_12_PM_RN_BA_220613 
             35346930              47533431              39954181              33786727              30577498 
PM_13_PM_RN_BA_220613 PM_14_PM_RN_BA_220614 PM_15_PM_RN_BA_220614 PM_16_PM_RN_BA_220614 PM_17_PM_RN_BA_220719 
             39998832              56743258              32843218              34735488              23196778 
PM_18_PM_RN_BA_220614 PM_19_PM_RN_BA_220614 PM_20_PM_RN_BA_220614 PM_21_PM_RN_BA_220614 PM_22_PM_RN_BA_220614 
             30517047              47242029               7128026              37241719              19605904 
PM_23_PM_RN_BA_220719 PM_24_PM_RN_BA_220614 PM_25_PM_RN_BA_220614 PM_26_PM_RN_BA_220615 PM_27_PM_RN_BA_220615 
              8539845              41821260              38103175              39848440              31824294 
PM_28_PM_RN_BA_220615 PM_29_PM_RN_BA_220615 PM_30_PM_RN_BA_220615 PM_31_PM_RN_BA_220615 PM_33_PM_RN_BA_220615 
             39570810              18318893              27867163              37619368               7699167 
PM_36_PM_RN_BA_220615 PM_37_PM_RN_BA_220615 PM_38_PM_RN_BA_220615 PM_39_PM_RN_BA_220615 PM_40_PM_RN_BA_220616 
             52832937              14847347              30443900              50012859               5653052 
PM_41_PM_RN_BA_220616 PM_42_PM_RN_BA_220616 PM_43_PM_RN_BA_220616 PM_44_PM_RN_BA_220616 PM_45_PM_RN_BA_220616 
             25155474              21967858              29089204              33313500              37297150 
PM_46_PM_RN_BA_220616 PM_47_PM_RN_BA_220616 PM_48_PM_RN_BA_220719 PM_49_PM_RN_BA_220719 PM_50_PM_RN_BA_220719 
             38935423              28303024              44317920              35130201              16121758 
PM_51_PM_RN_BA_220920 PM_52_PM_RN_BA_220920 PM_53_PM_RN_BA_220920 PM_54_PM_RN_BA_220920 PM_55_PM_RN_BA_220920 
             32136838              34048376              64047561              35428780               4583139 
PM_56_PM_RN_BA_220920 PM_57_PM_RN_BA_220920 PM_58_PM_RN_BA_220920 
             43632109              63412833              62072224 
colSums(counts(dds_PM, normalized=TRUE))
PM_01_PM_RN_BA_220613 PM_03_PM_RN_BA_220613 PM_04_PM_RN_BA_220613 PM_06_PM_RN_BA_220613 PM_07_PM_RN_BA_220613 
             30735892              38591291              26940355              29247390              31727440 
PM_08_PM_RN_BA_220613 PM_09_PM_RN_BA_220613 PM_10_PM_RN_BA_220613 PM_11_PM_RN_BA_220613 PM_12_PM_RN_BA_220613 
             27235219              31968689              33981372              30490569              26182204 
PM_13_PM_RN_BA_220613 PM_14_PM_RN_BA_220614 PM_15_PM_RN_BA_220614 PM_16_PM_RN_BA_220614 PM_17_PM_RN_BA_220719 
             34389588              31485437              31609952              28144149              33319550 
PM_18_PM_RN_BA_220614 PM_19_PM_RN_BA_220614 PM_20_PM_RN_BA_220614 PM_21_PM_RN_BA_220614 PM_22_PM_RN_BA_220614 
             33592850              33479822              25264610              27315211              27069782 
PM_23_PM_RN_BA_220719 PM_24_PM_RN_BA_220614 PM_25_PM_RN_BA_220614 PM_26_PM_RN_BA_220615 PM_27_PM_RN_BA_220615 
             18946298              32109124              28144817              28091723              26435175 
PM_28_PM_RN_BA_220615 PM_29_PM_RN_BA_220615 PM_30_PM_RN_BA_220615 PM_31_PM_RN_BA_220615 PM_33_PM_RN_BA_220615 
             30344694              26855997              24887203              23798956              44268004 
PM_36_PM_RN_BA_220615 PM_37_PM_RN_BA_220615 PM_38_PM_RN_BA_220615 PM_39_PM_RN_BA_220615 PM_40_PM_RN_BA_220616 
             32302959              33751408              27254654              38540934              32889841 
PM_41_PM_RN_BA_220616 PM_42_PM_RN_BA_220616 PM_43_PM_RN_BA_220616 PM_44_PM_RN_BA_220616 PM_45_PM_RN_BA_220616 
             29841788              28280860              31031718              26675702              27812383 
PM_46_PM_RN_BA_220616 PM_47_PM_RN_BA_220616 PM_48_PM_RN_BA_220719 PM_49_PM_RN_BA_220719 PM_50_PM_RN_BA_220719 
             34538092              24321668              30543627              27043944              29956850 
PM_51_PM_RN_BA_220920 PM_52_PM_RN_BA_220920 PM_53_PM_RN_BA_220920 PM_54_PM_RN_BA_220920 PM_55_PM_RN_BA_220920 
             22833944              30962092              30325084              23602071              33691145 
PM_56_PM_RN_BA_220920 PM_57_PM_RN_BA_220920 PM_58_PM_RN_BA_220920 
             25754994              40341438              40584299 
# PS
sizeFactors(dds_PS)
PM_01_PS_RN_BA_220627 PM_02_PS_RN_BA_220627 PM_03_PS_RN_BA_220627 PM_04_PS_RN_BA_220627 PM_06_PS_RN_BA_220627 
          1.058600541           0.658393088           1.222699830           1.834500045           4.842249194 
PM_07_PS_RN_BA_220627 PM_08_PS_RN_BA_220627 PM_11_PS_RN_BA_220627 PM_13_PS_RN_BA_220627 PM_14_PS_RN_BA_220628 
          8.126935887           0.398138600           7.237634747           4.384803112           6.038798058 
PM_15_PS_RN_BA_220714 PM_16_PS_RN_BA_220628 PM_17_PS_RN_BA_220628 PM_18_PS_RN_BA_220628 PM_22_PS_RN_BA_220706 
          8.271116876           6.656457794           8.197012251           0.642441448           0.067976354 
PM_23_PS_RN_BA_220628 PM_24_PS_RN_BA_220628 PM_25_PS_RN_BA_220628 PM_27_PS_RN_BA_220628 PM_29_PS_RN_BA_220628 
         12.952010726           0.208645715           0.090946482           0.643588097           0.004792714 
PM_30_PS_RN_BA_220706 PM_31_PS_RN_BA_220630 PM_33_PS_RN_BA_220630 PM_35_PS_RN_BA_220630 PM_36_PS_RN_BA_220630 
          1.432265234           0.110024402           0.043707832           7.299222374           3.312055627 
PM_37_PS_RN_BA_220630 PM_38_PS_RN_BA_220630 PM_39_PS_RN_BA_220630 PM_40_PS_RN_BA_220630 PM_42_PS_RN_BA_220630 
          1.806424448           1.457886987           1.219826843           0.076546734           0.052348316 
PM_43_PS_RN_BA_220630 PM_44_PS_RN_BA_220630 PM_47_PS_RN_BA_220706 PM_48_PS_RN_BA_220714 PM_49_PS_RN_BA_220714 
          0.272828739           6.442905955           1.594276066           0.361234164           0.550746554 
PM_50_PS_RN_BA_220714 PM_52_PS_RN_BA_220921 PM_53_PS_RN_BA_220921 PM_54_PS_RN_BA_220921 PM_55_PS_RN_BA_220921 
          5.975779874           2.006948025           0.479613646           3.565880650           0.126282891 
PM_56_PS_RN_BA_220921 PM_57_PS_RN_BA_220921 PM_58_PS_RN_BA_220921 
          4.111315224           0.544084792           5.130149915 
colSums(counts(dds_PS))
PM_01_PS_RN_BA_220627 PM_02_PS_RN_BA_220627 PM_03_PS_RN_BA_220627 PM_04_PS_RN_BA_220627 PM_06_PS_RN_BA_220627 
              3526585              11237092               3717571               9209448              20212599 
PM_07_PS_RN_BA_220627 PM_08_PS_RN_BA_220627 PM_11_PS_RN_BA_220627 PM_13_PS_RN_BA_220627 PM_14_PS_RN_BA_220628 
             22166010               2972093              20998687              10983762              17703875 
PM_15_PS_RN_BA_220714 PM_16_PS_RN_BA_220628 PM_17_PS_RN_BA_220628 PM_18_PS_RN_BA_220628 PM_22_PS_RN_BA_220706 
             23441702              19927882              21618079               2387938                377162 
PM_23_PS_RN_BA_220628 PM_24_PS_RN_BA_220628 PM_25_PS_RN_BA_220628 PM_27_PS_RN_BA_220628 PM_29_PS_RN_BA_220628 
             30967209               3413665                765909               2435442                  3363 
PM_30_PS_RN_BA_220706 PM_31_PS_RN_BA_220630 PM_33_PS_RN_BA_220630 PM_35_PS_RN_BA_220630 PM_36_PS_RN_BA_220630 
              5795113                393254                421510              21057303              11732248 
PM_37_PS_RN_BA_220630 PM_38_PS_RN_BA_220630 PM_39_PS_RN_BA_220630 PM_40_PS_RN_BA_220630 PM_42_PS_RN_BA_220630 
             11255323               4391577              15039306                446009                212373 
PM_43_PS_RN_BA_220630 PM_44_PS_RN_BA_220630 PM_47_PS_RN_BA_220706 PM_48_PS_RN_BA_220714 PM_49_PS_RN_BA_220714 
              1284454              21334116               4501689               3702169               2662658 
PM_50_PS_RN_BA_220714 PM_52_PS_RN_BA_220921 PM_53_PS_RN_BA_220921 PM_54_PS_RN_BA_220921 PM_55_PS_RN_BA_220921 
             16254131               8875700               2631656              18026037                712422 
PM_56_PS_RN_BA_220921 PM_57_PS_RN_BA_220921 PM_58_PS_RN_BA_220921 
             13346141               1650953              16560610 
colSums(counts(dds_PS, normalized=TRUE))
PM_01_PS_RN_BA_220627 PM_02_PS_RN_BA_220627 PM_03_PS_RN_BA_220627 PM_04_PS_RN_BA_220627 PM_06_PS_RN_BA_220627 
            3331365.2            17067451.4             3040460.9             5020140.5             4174217.0 
PM_07_PS_RN_BA_220627 PM_08_PS_RN_BA_220627 PM_11_PS_RN_BA_220627 PM_13_PS_RN_BA_220627 PM_14_PS_RN_BA_220628 
            2727474.5             7464970.7             2901319.0             2504961.3             2931688.5 
PM_15_PS_RN_BA_220714 PM_16_PS_RN_BA_220628 PM_17_PS_RN_BA_220628 PM_18_PS_RN_BA_220628 PM_22_PS_RN_BA_220706 
            2834164.0             2993766.7             2637312.0             3716973.8             5548429.4 
PM_23_PS_RN_BA_220628 PM_24_PS_RN_BA_220628 PM_25_PS_RN_BA_220628 PM_27_PS_RN_BA_220628 PM_29_PS_RN_BA_220628 
            2390919.0            16361059.7             8421535.2             3784162.6              701690.2 
PM_30_PS_RN_BA_220706 PM_31_PS_RN_BA_220630 PM_33_PS_RN_BA_220630 PM_35_PS_RN_BA_220630 PM_36_PS_RN_BA_220630 
            4046117.2             3574243.5             9643809.5             2884869.4             3542285.9 
PM_37_PS_RN_BA_220630 PM_38_PS_RN_BA_220630 PM_39_PS_RN_BA_220630 PM_40_PS_RN_BA_220630 PM_42_PS_RN_BA_220630 
            6230718.9             3012289.0            12329049.9             5826623.5             4056921.4 
PM_43_PS_RN_BA_220630 PM_44_PS_RN_BA_220630 PM_47_PS_RN_BA_220706 PM_48_PS_RN_BA_220714 PM_49_PS_RN_BA_220714 
            4707913.1             3311256.8             2823657.1            10248668.0             4834634.0 
PM_50_PS_RN_BA_220714 PM_52_PS_RN_BA_220921 PM_53_PS_RN_BA_220921 PM_54_PS_RN_BA_220921 PM_55_PS_RN_BA_220921 
            2720001.6             4422486.2             5487033.2             5055143.1             5641476.8 
PM_56_PS_RN_BA_220921 PM_57_PS_RN_BA_220921 PM_58_PS_RN_BA_220921 
            3246197.5             3034367.1             3228094.7 

The following is quoted directly from https://github.com/hbctraining/DGE_workshop/tree/master/lessons.

Step 2: estimate gene-wide dispersion. The DESeq2 dispersion estimates are inversely related to the mean and directly related to variance. Based on this relationship, the dispersion is higher for small mean counts and lower for large mean counts. Therefore, the dispersion estimates reflect the variance in gene expression for a given mean value. For low mean counts, the variance estimates have a much larger spread; therefore, the dispersion estimates will differ much more between genes with small means. With only a few (3-6) replicates per group, the estimates of variation for each gene are often unreliable (due to the large differences in dispersion for genes with similar means). To address this problem, DESeq2 shares information across genes to generate more accurate estimates of variation based on the mean expression level of the gene using a method called ‘shrinkage’. DESeq2 assumes that genes with similar expression levels have similar dispersion.

Step 3: fit curve to gene-wise dispersion estimates. This curve is displayed as a red line in the figure below, which plots the estimate for the expected dispersion value for genes of a given expression strength. Each black dot is a gene with an associated mean expression level and maximum likelihood estimation (MLE) of the dispersion (Step 1).

Step 4: shrink gene-wise dispersion estimates toward the values predicted by the curve. This shrinkage method is particularly important to reduce false positives in the differential expression analysis. Genes with low dispersion estimates are shrunken towards the curve, and the more accurate, higher shrunken values are output for fitting of the model and differential expression testing. Dispersion estimates that are slightly above the curve are also shrunk toward the curve for better dispersion estimation; however, genes with extremely high dispersion values are not. This is due to the likelihood that the gene does not follow the modeling assumptions and has higher variability than others for biological or technical reasons. Shrinking the values toward the curve could result in false positives, so these values are not shrunken.

Plot dispersion estimates.

plotDispEsts(dds_PB)

plotDispEsts(dds_PL)

plotDispEsts(dds_PM)

plotDispEsts(dds_PS)

Shrunken log2 foldchanges (LFC).

NOTE: Shrinking the log2 fold changes will not change the total number of genes that are identified as significantly differentially expressed. The shrinkage of fold change is to help with downstream assessment of results. For example, if you wanted to subset your significant genes based on fold change for further evaluation, you may want to use shrunken values. Additionally, for functional analysis tools such as GSEA which require fold change values as input you would want to provide shrunken values. In the most recent versions of DESeq2, the shrinkage of LFC estimates is not performed by default. This means that the log2 foldchanges would be the same as those calculated by: log2(normalized_counts_group1 / normalized_counts_group2)

Lists all the coefficient names for apeglm LFC shrinkage.

resultsNames(dds_PB)
[1] "Intercept"                "THC_positive_vs_negative"
resultsNames(dds_PL)
[1] "Intercept"                "THC_positive_vs_negative"
resultsNames(dds_PM)
[1] "Intercept"                "THC_positive_vs_negative"
resultsNames(dds_PS)
[1] "Intercept"                "THC_positive_vs_negative"

Builds results tables for the unshrunken LFC and apeglm LFC shrinkage.

contrast=c("THC", "positive", "negative")

# PB
res_table_unshrunken_PB=results(dds_PB, contrast=contrast, alpha=0.1)
res_table_apeglm_PB=lfcShrink(dds_PB, coef="THC_positive_vs_negative",
                           res=res_table_unshrunken_PB, type="apeglm")
using 'apeglm' for LFC shrinkage. If used in published research, please cite:
    Zhu, A., Ibrahim, J.G., Love, M.I. (2018) Heavy-tailed prior distributions for
    sequence count data: removing the noise and preserving large differences.
    Bioinformatics. https://doi.org/10.1093/bioinformatics/bty895
Warning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precision
# PL
res_table_unshrunken_PL=results(dds_PL, contrast=contrast, alpha=0.1)
res_table_apeglm_PL=lfcShrink(dds_PL, coef="THC_positive_vs_negative",
                           res=res_table_unshrunken_PL, type="apeglm")
using 'apeglm' for LFC shrinkage. If used in published research, please cite:
    Zhu, A., Ibrahim, J.G., Love, M.I. (2018) Heavy-tailed prior distributions for
    sequence count data: removing the noise and preserving large differences.
    Bioinformatics. https://doi.org/10.1093/bioinformatics/bty895
# PM
res_table_unshrunken_PM=results(dds_PM, contrast=contrast, alpha=0.1)
res_table_apeglm_PM=lfcShrink(dds_PM, coef="THC_positive_vs_negative",
                           res=res_table_unshrunken_PM, type="apeglm")
using 'apeglm' for LFC shrinkage. If used in published research, please cite:
    Zhu, A., Ibrahim, J.G., Love, M.I. (2018) Heavy-tailed prior distributions for
    sequence count data: removing the noise and preserving large differences.
    Bioinformatics. https://doi.org/10.1093/bioinformatics/bty895
Warning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precision
# PS
res_table_unshrunken_PS=results(dds_PS, contrast=contrast, alpha=0.1)
res_table_apeglm_PS=lfcShrink(dds_PS, coef="THC_positive_vs_negative",
                           res=res_table_unshrunken_PS, type="apeglm")
using 'apeglm' for LFC shrinkage. If used in published research, please cite:
    Zhu, A., Ibrahim, J.G., Love, M.I. (2018) Heavy-tailed prior distributions for
    sequence count data: removing the noise and preserving large differences.
    Bioinformatics. https://doi.org/10.1093/bioinformatics/bty895
Warning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precisionWarning: the line search routine failed, possibly due to insufficient numeric precision

Creates the MA plot for the apeglm results tables.

options(ggrepel.max.overlaps=Inf)

# PB
# ggmaplot(res_table_unshrunken_PB, main=expression("positive" %->% "negative"),
#          fdr=0.05, fc=1.5, size=0.4,
#          genenames=as.vector(res_table_unshrunken_PB$rownames),
#          legend="top", top=10, select.top.method="padj",
#          font.label=c("bold", 11), label.rectangle=TRUE,
#          font.legend="bold",
#          font.main="bold",
#          ggtheme=ggplot2::theme_minimal())
maplot1=ggmaplot(res_table_apeglm_PB, 
         # main=expression("positive" %->% "negative"),
         main="Brain, THC Positive vs Negative",
         fdr=0.1, fc=1.5, size=0.4,
         legend="top", select.top.method="padj",
         top=0,
         # font.label=c("bold", 8), label.rectangle=TRUE,
         # font.legend="bold",
         font.main=c("bold", 10),
         ggtheme=ggplot2::theme_minimal())

# PL
# ggmaplot(res_table_unshrunken_PL, main=expression("positive" %->% "negative"),
#          fdr=0.05, fc=1.5, size=0.4,
#          genenames=as.vector(res_table_unshrunken_PL$rownames),
#          legend="top", top=10, select.top.method="padj",
#          font.label=c("bold", 11), label.rectangle=TRUE,
#          font.legend="bold",
#          font.main="bold",
#          ggtheme=ggplot2::theme_minimal())
maplot2=ggmaplot(res_table_apeglm_PL, 
         # main=expression("positive" %->% "negative"),
         main="Lung, THC Positive vs Negative",
         fdr=0.1, fc=1.5, size=0.4,
         # genenames=as.vector(res_table_apeglm_PL$rownames),
         legend="top", select.top.method="padj",
         top=0,
         # font.label=c("bold", 8), label.rectangle=TRUE,
         # font.legend="bold",
         font.main=c("bold", 10),
         ggtheme=ggplot2::theme_minimal())


# PM
# ggmaplot(res_table_unshrunken_PM, main=expression("positive" %->% "negative"),
#          fdr=0.05, fc=1.5, size=0.4,
#          genenames=as.vector(res_table_unshrunken_PM$rownames),
#          legend="top", top=10, select.top.method="padj",
#          font.label=c("bold", 11), label.rectangle=TRUE,
#          font.legend="bold",
#          font.main="bold",
#          ggtheme=ggplot2::theme_minimal())
maplot3=ggmaplot(res_table_apeglm_PM, 
         # main=expression("positive" %->% "negative"),
         main="Muscle, THC Positive vs Negative",
         fdr=0.1, fc=1.5, size=0.4,
         # genenames=as.vector(res_table_apeglm_PM$rownames),
         legend="top", select.top.method="padj",
         top=0,
         # font.label=c("bold", 8), label.rectangle=TRUE,
         # font.legend="bold",
         font.main=c("bold", 10),
         ggtheme=ggplot2::theme_minimal())


# PS
# ggmaplot(res_table_unshrunken_PS, main=expression("positive" %->% "negative"),
#          fdr=0.05, fc=1.5, size=0.4,
#          genenames=as.vector(res_table_unshrunken_PS$rownames),
#          legend="top", top=10, select.top.method="padj",
#          font.label=c("bold", 11), label.rectangle=TRUE,
#          font.legend="bold",
#          font.main="bold",
#          ggtheme=ggplot2::theme_minimal())
maplot4=ggmaplot(res_table_apeglm_PS, 
         # main=expression("positive" %->% "negative"),
         main="Blood, THC Positive vs Negative",
         fdr=0.1, fc=1.5, size=0.4,
         # genenames=as.vector(res_table_apeglm_PS$rownames),
         legend="top", select.top.method="padj",
         top=0,
         # font.label=c("bold", 8), label.rectangle=TRUE,
         # font.legend="bold",
         font.main=c("bold", 10),
         ggtheme=ggplot2::theme_minimal())

Creating a figure of all THC MA plots.

ma_THC_patchwork=maplot1 + maplot2 + maplot3 + maplot4 + plot_layout(ncol=2)
ma_THC_patchwork + plot_annotation(tag_levels="A")
ggsave("PM_ma_THC_plots.png", width=7, height=10, unit="in", dpi=320)

Renames the results table; downstream analysis will be using the apeglm shrunken LFC values.

res_table_PB=res_table_apeglm_PB
res_table_PL=res_table_apeglm_PL
res_table_PM=res_table_apeglm_PM
res_table_PS=res_table_apeglm_PS

Results exploration.

# PB
class(res_table_PB)
[1] "DESeqResults"
attr(,"package")
[1] "DESeq2"
mcols(res_table_PB, use.names=TRUE)
DataFrame with 5 rows and 2 columns
                       type            description
                <character>            <character>
baseMean       intermediate mean of normalized c..
log2FoldChange      results log2 fold change (MA..
lfcSE               results posterior SD: THC po..
pvalue              results Wald test p-value: T..
padj                results   BH adjusted p-values
res_table_PB %>% data.frame()

# PL
class(res_table_PL)
[1] "DESeqResults"
attr(,"package")
[1] "DESeq2"
mcols(res_table_PL, use.names=TRUE)
DataFrame with 5 rows and 2 columns
                       type            description
                <character>            <character>
baseMean       intermediate mean of normalized c..
log2FoldChange      results log2 fold change (MA..
lfcSE               results posterior SD: THC po..
pvalue              results Wald test p-value: T..
padj                results   BH adjusted p-values
res_table_PL %>% data.frame()

# PM
class(res_table_PM)
[1] "DESeqResults"
attr(,"package")
[1] "DESeq2"
mcols(res_table_PM, use.names=TRUE)
DataFrame with 5 rows and 2 columns
                       type            description
                <character>            <character>
baseMean       intermediate mean of normalized c..
log2FoldChange      results log2 fold change (MA..
lfcSE               results posterior SD: THC po..
pvalue              results Wald test p-value: T..
padj                results   BH adjusted p-values
res_table_PM %>% data.frame()

# PS
class(res_table_PS)
[1] "DESeqResults"
attr(,"package")
[1] "DESeq2"
mcols(res_table_PS, use.names=TRUE)
DataFrame with 5 rows and 2 columns
                       type            description
                <character>            <character>
baseMean       intermediate mean of normalized c..
log2FoldChange      results log2 fold change (MA..
lfcSE               results posterior SD: THC po..
pvalue              results Wald test p-value: T..
padj                results   BH adjusted p-values
res_table_PS %>% data.frame()

Summarizing results.

summary(res_table_PB)

out of 50232 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up)       : 0, 0%
LFC < 0 (down)     : 1, 0.002%
outliers [1]       : 0, 0%
low counts [2]     : 10, 0.02%
(mean count < 0)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results
summary(res_table_PL)

out of 60183 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up)       : 22, 0.037%
LFC < 0 (down)     : 2, 0.0033%
outliers [1]       : 0, 0%
low counts [2]     : 38420, 64%
(mean count < 8)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results
summary(res_table_PM)

out of 55776 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up)       : 3, 0.0054%
LFC < 0 (down)     : 1, 0.0018%
outliers [1]       : 0, 0%
low counts [2]     : 17, 0.03%
(mean count < 0)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results
summary(res_table_PS)

out of 60084 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up)       : 0, 0%
LFC < 0 (down)     : 0, 0%
outliers [1]       : 0, 0%
low counts [2]     : 1, 0.0017%
(mean count < 0)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results

Extracting significant differentially expressed genes.

##  Set thresholds.
padj.cutoff=0.1
lfc.cutoff=0.58

# PB
##  Convert the results table to a tibble.
res_table_tb_PB=res_table_PB %>%
  data.frame() %>%
  rownames_to_column(var='gene') %>%
  as_tibble()
##  Subset the tibble use pre-defined thresholds and then show the table.
sig_PB=res_table_tb_PB %>%
  dplyr::filter(padj<padj.cutoff & abs(log2FoldChange) > lfc.cutoff) %>%
  dplyr::arrange(padj)
sig_PB %>%
  count()
sig_PB %>%
  dplyr::filter(log2FoldChange>0) %>%
  count()
sig_PB %>%
  dplyr::filter(log2FoldChange<0) %>%
  count()

## Write the full and subsetted results to .txt and .csv files.
write.table(res_table_tb_PB, "gencode_Output_Files/PB_THC_genes.txt", quote=FALSE, row.names=FALSE)
write.csv(res_table_tb_PB, "gencode_Output_Files/PB_THC_genes.csv", quote=FALSE, row.names=FALSE)
write.table(sig_PB, "gencode_Output_Files/PB_THC_sig_DEGs.txt", quote=FALSE, row.names=FALSE) # IPA requires a .txt file
write.csv(sig_PB, "gencode_Output_Files/PB_THC_sig_DEGs.csv", quote=FALSE, row.names=FALSE) # .csv files work better for R

# PL
##  Convert the results table to a tibble.
res_table_tb_PL=res_table_PL %>%
  data.frame() %>%
  rownames_to_column(var='gene') %>%
  as_tibble()
##  Subset the tibble use pre-defined thresholds and then show the table.
sig_PL=res_table_tb_PL %>%
  dplyr::filter(padj<padj.cutoff & abs(log2FoldChange) > lfc.cutoff) %>%
  dplyr::arrange(padj)
sig_PL %>%
  count()
sig_PL %>%
  dplyr::filter(log2FoldChange>0) %>%
  count()
sig_PL %>%
  dplyr::filter(log2FoldChange<0) %>%
  count()

## Write the full and subsetted results to .txt and .csv files.
write.table(res_table_tb_PL, "gencode_Output_Files/PL_THC_genes.txt", quote=FALSE, row.names=FALSE)
write.csv(res_table_tb_PL, "gencode_Output_Files/PL_THC_genes.csv", quote=FALSE, row.names=FALSE)
write.table(sig_PL, "gencode_Output_Files/PL_THC_sig_DEGs.txt", quote=FALSE, row.names=FALSE) # IPA requires a .txt file
write.csv(sig_PL, "gencode_Output_Files/PL_THC_sig_DEGs.csv", quote=FALSE, row.names=FALSE) # .csv files work better for R

# PM
##  Convert the results table to a tibble.
res_table_tb_PM=res_table_PM %>%
  data.frame() %>%
  rownames_to_column(var='gene') %>%
  as_tibble()
##  Subset the tibble use pre-defined thresholds and then show the table.
sig_PM=res_table_tb_PM %>%
  dplyr::filter(padj<padj.cutoff & abs(log2FoldChange) > lfc.cutoff) %>%
  dplyr::arrange(padj)
sig_PM %>%
  count()
sig_PM %>%
  dplyr::filter(log2FoldChange>0) %>%
  count()
sig_PM %>%
  dplyr::filter(log2FoldChange<0) %>%
  count()

## Write the full and subsetted results to .txt and .csv files.
write.table(res_table_tb_PM, "gencode_Output_Files/PM_THC_genes.txt", quote=FALSE, row.names=FALSE)
write.csv(res_table_tb_PM, "gencode_Output_Files/PM_THC_genes.csv", quote=FALSE, row.names=FALSE)
write.table(sig_PM, "gencode_Output_Files/PM_THC_sig_DEGs.txt", quote=FALSE, row.names=FALSE) # IPA requires a .txt file
write.csv(sig_PM, "gencode_Output_Files/PM_THC_sig_DEGs.csv", quote=FALSE, row.names=FALSE) # .csv files work better for R

# PS
##  Convert the results table to a tibble.
res_table_tb_PS=res_table_PS %>%
  data.frame() %>%
  rownames_to_column(var='gene') %>%
  as_tibble()
##  Subset the tibble use pre-defined thresholds and then show the table.
sig_PS=res_table_tb_PS %>%
  dplyr::filter(padj<padj.cutoff & abs(log2FoldChange) > lfc.cutoff) %>%
  dplyr::arrange(padj)
sig_PS %>%
  count()
sig_PS %>%
  dplyr::filter(log2FoldChange>0) %>%
  count()
sig_PS %>%
  dplyr::filter(log2FoldChange<0) %>%
  count()

## Write the full and subsetted results to .txt and .csv files.
write.table(res_table_tb_PS, "gencode_Output_Files/PS_THC_genes.txt", quote=FALSE, row.names=FALSE)
write.csv(res_table_tb_PS, "gencode_Output_Files/PS_THC_genes.csv", quote=FALSE, row.names=FALSE)
write.table(sig_PS, "gencode_Output_Files/PS_THC_sig_DEGs.txt", quote=FALSE, row.names=FALSE) # IPA requires a .txt file
write.csv(sig_PS, "gencode_Output_Files/PS_THC_sig_DEGs.csv", quote=FALSE, row.names=FALSE) # .csv files work better for R

Visualizing Results

Reads in the normalized expression data table.

normalizedcounts_PB=read.table(file="gencode_Output_Files/PB_normalizedcounts.txt", header=TRUE, row.names=1)
normalizedcounts_PL=read.table(file="gencode_Output_Files/PL_normalizedcounts.txt", header=TRUE, row.names=1)
normalizedcounts_PM=read.table(file="gencode_Output_Files/PM_normalizedcounts.txt", header=TRUE, row.names=1)
normalizedcounts_PS=read.table(file="gencode_Output_Files/PS_normalizedcounts.txt", header=TRUE, row.names=1)

Create tibbles including row names from metadata and normalized expression data.

# PB
meta_PB=metadata_PB %>%
  rownames_to_column(var="samplename") %>%
  as_tibble()
normalized_counts_PB=normalizedcounts_PB %>%
  rownames_to_column(var="gene") %>%
  as_tibble()

# PL
meta_PL=metadata_PL %>%
  rownames_to_column(var="samplename") %>%
  as_tibble()
normalized_counts_PL=normalizedcounts_PL %>%
  rownames_to_column(var="gene") %>%
  as_tibble()

# PM
meta_PM=metadata_PM %>%
  rownames_to_column(var="samplename") %>%
  as_tibble()
normalized_counts_PM=normalizedcounts_PM %>%
  rownames_to_column(var="gene") %>%
  as_tibble()

# PS
meta_PS=metadata_PS %>%
  rownames_to_column(var="samplename") %>%
  as_tibble()
normalized_counts_PS=normalizedcounts_PS %>%
  rownames_to_column(var="gene") %>%
  as_tibble()

Using ggplot2 to plot multiple genes (top 20).

# # PB
# ##  Order results by padj values.
# top20_sig_genes_PB=res_table_tb_PB %>%
#   arrange(padj) %>%     ##  Arrange rows by padj values.
#   pull(gene) %>%        ##  Extract character vector of ordered genes.
#   head(n=20)            ##  Extract the top 20 genes.
# ##  Normalized counts for top 20 significant genes.
# top20_sig_norm_PB=normalized_counts_PB %>%
#   dplyr::filter(gene %in% top20_sig_genes_PB)
# ##  Gathering the columns to have normalized to a single column.
# gathered_top20_sig_PB=top20_sig_norm_PB %>%
#   gather(colnames(top20_sig_norm_PB)[2:50], key="samplename", value="normalized_counts")
# ##  Combine metadata with melted normalized counts data.
# gathered_top20_sig_PB=inner_join(meta_PB, gathered_top20_sig_PB)
# ##  Plot using ggplot2.
# ggplot()+
#   geom_point(data=gathered_top20_sig_PB, aes(x=gene, y=normalized_counts, fill=THC),
#              alpha=0.75, color="black", pch=21, size=2)+
#   scale_fill_manual(limits=c("positive", "negative"),
#                      labels=c("Positive", "Negative"),
#                      values=as.vector(polychrome(2)))+    
#   scale_y_log10()+
#   theme_minimal()+
#   theme(axis.text.y=element_text(color="black", face="bold", size=rel(1)),
#         axis.text.x=element_text(angle=45, hjust=1, color="black", size=rel(0.8)),
#         # axis.text.x=element_text(color="black", face="bold", size=rel(1)),
#         # axis.title.x=element_text(color="black", face="bold", size=rel(1)),
#         axis.title.x=element_blank(),
#         axis.title.y=element_text(color="black", face="bold", size=rel(1)),
#         panel.border=element_rect(color="black", linewidth=1, fill=NA),
#         strip.background=element_rect(color="black", linewidth=1),
#         strip.text=element_text(color="black", face="bold", size=rel(0.8)),
#         axis.line=element_blank(),
#         axis.ticks=element_line(linewidth=1),
#         legend.title=element_text(color="black", face="bold", size=rel(1)),
#         # legend.title=element_blank(),
#         legend.text=element_text(color="black", face="bold", size=rel(0.8)),
#         legend.position="bottom",
#         # plot.title=element_text(color="black", face="bold", size=rel(1)))+
#         plot.title=element_blank())+
#   xlab("Genes")+
#   ylab("log10 Normalized Counts")+
#   labs(title="Significant Genes in Brain THC Positive vs Negative", fill="THC")  

# PL
##  Order results by padj values.
top20_sig_genes_PL=res_table_tb_PL %>%
  arrange(padj) %>%     ##  Arrange rows by padj values.
  pull(gene) %>%        ##  Extract character vector of ordered genes.
  head(n=22)            ##  Extract the top 20 genes.
##  Normalized counts for top 20 significant genes.
top20_sig_norm_PL=normalized_counts_PL %>%
  dplyr::filter(gene %in% top20_sig_genes_PL)
##  Gathering the columns to have normalized to a single column.
gathered_top20_sig_PL=top20_sig_norm_PL %>%
  gather(colnames(top20_sig_norm_PL)[2:53], key="samplename", value="normalized_counts")
##  Combine metadata with melted normalized counts data.
gathered_top20_sig_PL=inner_join(meta_PL, gathered_top20_sig_PL)
Joining with `by = join_by(samplename)`
##  Plot using ggplot2.
plot1=ggplot()+
  geom_point(data=gathered_top20_sig_PL, aes(x=gene, y=normalized_counts, fill=THC, shape=THC),
             alpha=0.75, color="black", size=2)+
  scale_fill_manual(limits=c("positive", "negative"),
                    labels=c("Positive", "Negative"),
                    values=as.vector(polychrome(2)))+ 
  scale_shape_manual(limits=c("positive", "negative"),
                     labels=c("Positive", "Negative"),
                     values=c(21, 24))+   
  scale_y_log10()+
  theme_minimal()+
  theme(axis.text.y=element_text(color="black", face="bold", size=rel(1)),
        axis.text.x=element_text(angle=45, hjust=1, color="black", size=rel(0.8)),
        # axis.text.x=element_text(color="black", face="bold", size=rel(1)),
        # axis.title.x=element_text(color="black", face="bold", size=rel(1)),
        axis.title.x=element_blank(),
        axis.title.y=element_text(color="black", face="bold", size=rel(1)),
        panel.border=element_rect(color="black", linewidth=1, fill=NA),
        strip.background=element_rect(color="black", linewidth=1),
        strip.text=element_text(color="black", face="bold", size=rel(0.8)),
        axis.line=element_blank(),
        axis.ticks=element_line(linewidth=1),
        legend.title=element_text(color="black", face="bold", size=rel(1)),
        # legend.title=element_blank(),
        legend.text=element_text(color="black", face="bold", size=rel(0.8)),
        legend.position="bottom",
        # plot.title=element_text(color="black", face="bold", size=rel(1)))+
        plot.title=element_blank())+
  xlab("Genes")+
  ylab("log10 Normalized Counts")+
  labs(title="Significant Genes in Lung THC Positive vs Negative", fill="THC") 

# PM
##  Order results by padj values.
top20_sig_genes_PM=res_table_tb_PM %>%
  arrange(padj) %>%     ##  Arrange rows by padj values.
  pull(gene) %>%        ##  Extract character vector of ordered genes.
  head(n=4)            ##  Extract the top 20 genes.
##  Normalized counts for top 20 significant genes.
top20_sig_norm_PM=normalized_counts_PM %>%
  dplyr::filter(gene %in% top20_sig_genes_PM)
##  Gathering the columns to have normalized to a single column.
gathered_top20_sig_PM=top20_sig_norm_PM %>%
  gather(colnames(top20_sig_norm_PM)[2:54], key="samplename", value="normalized_counts")
##  Combine metadata with melted normalized counts data.
gathered_top20_sig_PM=inner_join(meta_PM, gathered_top20_sig_PM)
Joining with `by = join_by(samplename)`
##  Plot using ggplot2.
plot2=ggplot()+
  geom_point(data=gathered_top20_sig_PM, aes(x=gene, y=normalized_counts, fill=THC, shape=THC),
             alpha=0.75, color="black", size=2)+
  scale_fill_manual(limits=c("positive", "negative"),
                    labels=c("Positive", "Negative"),
                    values=as.vector(polychrome(2)))+
  scale_shape_manual(limits=c("positive", "negative"),
                     labels=c("Positive", "Negative"),
                     values=c(21, 24))+  
  scale_y_log10()+
  theme_minimal()+
  theme(axis.text.y=element_text(color="black", face="bold", size=rel(1)),
        axis.text.x=element_text(angle=45, hjust=1, color="black", size=rel(0.8)),
        # axis.text.x=element_text(color="black", face="bold", size=rel(1)),
        # axis.title.x=element_text(color="black", face="bold", size=rel(1)),
        axis.title.x=element_blank(),
        axis.title.y=element_text(color="black", face="bold", size=rel(1)),
        panel.border=element_rect(color="black", linewidth=1, fill=NA),
        strip.background=element_rect(color="black", linewidth=1),
        strip.text=element_text(color="black", face="bold", size=rel(0.8)),
        axis.line=element_blank(),
        axis.ticks=element_line(linewidth=1),
        legend.title=element_text(color="black", face="bold", size=rel(1)),
        # legend.title=element_blank(),
        legend.text=element_text(color="black", face="bold", size=rel(0.8)),
        legend.position="bottom",
        # plot.title=element_text(color="black", face="bold", size=rel(1)))+
        plot.title=element_blank())+
  xlab("Genes")+
  ylab("log10 Normalized Counts")+
  labs(title="Significant Genes in Muscle THC Positive vs Negative", fill="THC")  

# # PS
# ##  Order results by padj values.
# top20_sig_genes_PS=res_table_tb_PS %>%
#   arrange(padj) %>%     ##  Arrange rows by padj values.
#   pull(gene) %>%        ##  Extract character vector of ordered genes.
#   head(n=20)            ##  Extract the top 20 genes.
# ##  Normalized counts for top 20 significant genes.
# top20_sig_norm_PS=normalized_counts_PS %>%
#   dplyr::filter(gene %in% top20_sig_genes_PS)
# ##  Gathering the columns to have normalized to a single column.
# gathered_top20_sig_PS=top20_sig_norm_PS %>%
#   gather(colnames(top20_sig_norm_PS)[2:29], key="samplename", value="normalized_counts")
# ##  Combine metadata with melted normalized counts data.
# gathered_top20_sig_PS=inner_join(meta_PS, gathered_top20_sig_PS)
# ##  Plot using ggplot2.
# ggplot()+
#   geom_point(data=gathered_top20_sig_PS, aes(x=gene, y=normalized_counts, fill=THC),
#              alpha=0.75, color="black", pch=21, size=2)+
#   scale_fill_manual(limits=c("positive", "negative"),
#                      labels=c("Positive", "Negative"),
#                      values=as.vector(polychrome(2)))+    
#   scale_y_log10()+
#   theme_minimal()+
#   theme(axis.text.y=element_text(color="black", face="bold", size=rel(1)),
#         axis.text.x=element_text(angle=45, hjust=1, color="black", size=rel(0.8)),
#         # axis.text.x=element_text(color="black", face="bold", size=rel(1)),
#         # axis.title.x=element_text(color="black", face="bold", size=rel(1)),
#         axis.title.x=element_blank(),
#         axis.title.y=element_text(color="black", face="bold", size=rel(1)),
#         panel.border=element_rect(color="black", linewidth=1, fill=NA),
#         strip.background=element_rect(color="black", linewidth=1),
#         strip.text=element_text(color="black", face="bold", size=rel(0.8)),
#         axis.line=element_blank(),
#         axis.ticks=element_line(linewidth=1),
#         legend.title=element_text(color="black", face="bold", size=rel(1)),
#         # legend.title=element_blank(),
#         legend.text=element_text(color="black", face="bold", size=rel(0.8)),
#         legend.position="bottom",
#         # plot.title=element_text(color="black", face="bold", size=rel(1)))+
#         plot.title=element_blank())+
#   xlab("Genes")+
#   ylab("log10 Normalized Counts")+
#   labs(title="Significant Genes in Blood THC Positive vs Negative", fill="THC")  

Creating a figure of all significant genes plots.

top_sig_patchwork=plot1 + plot2 + plot_layout(nrow=2)
top_sig_patchwork + plot_annotation(tag_levels="A") + plot_layout(guides="collect") &
  theme(legend.position='bottom')
ggsave("PM_top_sig_THC_plots.png", width=7, height=10, unit="in", dpi=320)

Generating a heatmap.

# # PB
# ##  Extract normalized expression for significant genes from the samples and set the gene column (1) to row names.
# norm_sig_PB=normalized_counts_PB[,c(1,2:54)] %>%
#   dplyr::filter(gene %in% sig_PB$gene) %>%
#   data.frame(check.names=FALSE) %>%
#   column_to_rownames(var="gene")
# ##  Annotate the heatmap.
# annotation_PB=meta_PB %>%
#   dplyr::select(samplename, THC) %>%
#   data.frame(row.names="samplename")
# ##  Set a color palette.
# heat_colors=brewer.pal(6, "YlOrRd")
# ##  Run pheatmap.
# # pheatmap::pheatmap(norm_sig_PB, 
# #          color=heat_colors, 
# #          cluster_rows=TRUE, 
# #          show_rownames=FALSE,
# #          annotation_col=annotation_PB, 
# #          border_color=NA, 
# #          fontsize=9, 
# #          scale="row",     ##  Z-scores are plotted rather than actual normalized count values.
# #          fontsize_row=10, 
# #          height=20,
# #          # annotation_colors=list(group=c(BP="", RN="", RP="")), ## The annotation colors.
# #          annotation_legend=TRUE)
# 
# # PL
# ##  Extract normalized expression for significant genes from the samples and set the gene column (1) to row names.
# norm_sig_PL=normalized_counts_PL[,c(1,2:52)] %>%
#   dplyr::filter(gene %in% sig_PL$gene) %>%
#   data.frame(check.names=FALSE) %>%
#   column_to_rownames(var="gene")
# ##  Annotate the heatmap.
# annotation_PL=meta_PL %>%
#   dplyr::select(samplename, THC) %>%
#   data.frame(row.names="samplename")
# ##  Set a color palette.
# heat_colors=brewer.pal(6, "YlOrRd")
# ##  Run pheatmap.
# pheatmap::pheatmap(norm_sig_PL, 
#          color=heat_colors, 
#          cluster_rows=TRUE, 
#          show_rownames=FALSE,
#          annotation_col=annotation_PL, 
#          border_color=NA, 
#          fontsize=9, 
#          scale="row",     ##  Z-scores are plotted rather than actual normalized count values.
#          fontsize_row=10, 
#          height=20,
#          # annotation_colors=list(group=c(BP="", RN="", RP="")), ## The annotation colors.
#          annotation_legend=TRUE)
# 
# # PM
# ##  Extract normalized expression for significant genes from the samples and set the gene column (1) to row names.
# norm_sig_PM=normalized_counts_PM[,c(1,2:54)] %>%
#   dplyr::filter(gene %in% sig_PM$gene) %>%
#   data.frame(check.names=FALSE) %>%
#   column_to_rownames(var="gene")
# ##  Annotate the heatmap.
# annotation_PM=meta_PM %>%
#   dplyr::select(samplename, THC) %>%
#   data.frame(row.names="samplename")
# ##  Set a color palette.
# heat_colors=brewer.pal(6, "YlOrRd")
# ##  Run pheatmap.
# pheatmap::pheatmap(norm_sig_PM, 
#          color=heat_colors, 
#          cluster_rows=TRUE, 
#          show_rownames=FALSE,
#          annotation_col=annotation_PM, 
#          border_color=NA, 
#          fontsize=9, 
#          scale="row",     ##  Z-scores are plotted rather than actual normalized count values.
#          fontsize_row=10, 
#          height=20,
#          # annotation_colors=list(group=c(BP="", RN="", RP="")), ## The annotation colors.
#          annotation_legend=TRUE)
# 
# # PS
# ##  Extract normalized expression for significant genes from the samples and set the gene column (1) to row names.
# norm_sig_PS=normalized_counts_PS[,c(1,2:44)] %>%
#   dplyr::filter(gene %in% sig_PS$gene) %>%
#   data.frame(check.names=FALSE) %>%
#   column_to_rownames(var="gene")
# ##  Annotate the heatmap.
# annotation_PS=meta_PS %>%
#   dplyr::select(samplename, THC) %>%
#   data.frame(row.names="samplename")
# ##  Set a color palette.
# heat_colors=brewer.pal(6, "YlOrRd")
# ##  Run pheatmap.
# # pheatmap::pheatmap(norm_sig_PS, 
# #          color=heat_colors, 
# #          cluster_rows=TRUE, 
# #          show_rownames=FALSE,
# #          annotation_col=annotation_PS, 
# #          border_color=NA, 
# #          fontsize=9, 
# #          scale="row",     ##  Z-scores are plotted rather than actual normalized count values.
# #          fontsize_row=10, 
# #          height=20,
# #          # annotation_colors=list(group=c(BP="", RN="", RP="")), ## The annotation colors.
# #          annotation_legend=TRUE)

Generating a volcano plot.

# # # PB
# # ##  Obtain logical vector where TRUE values denote padj values < 0.1 and fold change > 1.5 in either direction.
# # res_table_tb_vp_PB=res_table_tb_PB %>%
# #   dplyr::mutate(threshold=padj<0.1 & abs(log2FoldChange)>=0.58)
# # ##  Plots the volcano plot.
# # ggplot()+
# #   geom_point(data=res_table_tb_vp_PB, aes(x=log2FoldChange, y=-log10(padj), color=threshold))+
# #   ggtitle("THC:negative versus THC:positive Expression")+
# #   xlab("log2 fold change")+ 
# #   ylab("-log10 adjusted p-value")+
# #   # scale_color_viridis(option="turbo", discrete=TRUE)+
# #   theme_minimal()+
# #   theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.2)),
# #         axis.text.x=element_text(color="black", face="bold", size=rel(1.2)),
# #         axis.title.x=element_text(color="black", face="bold", size=rel(1)),
# #         axis.title.y=element_text(color="black", face="bold", size=rel(1)),
# #         panel.border=element_rect(color="black", linewidth=1, fill=NA),
# #         strip.background=element_rect(color="black", linewidth=1),
# #         strip.text=element_text(color="black", face="bold", size=rel(0.8)),
# #         axis.line=element_blank(),
# #         axis.ticks=element_line(linewidth=1),
# #         legend.position="none",
# #         legend.title=element_text(color="black", face="bold", size=rel(1)),
# #         legend.text=element_text(color="black", face="bold", size=rel(0.8)),
# #         plot.title=element_text(color="black", face="bold", size=rel(1)))
# # 
# # ##  Label the top 10 genes with the lowest padj (conditional on max.overlaps value).
# # ##  Create a column to indicate which genes to label.
# # res_table_tb_vp_PB=res_table_tb_vp_PB %>% dplyr::arrange(padj) %>% dplyr::mutate(genelabels="")
# # res_table_tb_vp_PB$genelabels[1:10]=res_table_tb_vp_PB$gene[1:10]
# # ##  Plots the volcano plot with an additional layer for geom_text_repel().
# # ggplot(res_table_tb_vp_PB, aes(x=log2FoldChange, y=-log10(padj)))+
# #   geom_point(aes(color=threshold))+
# #   geom_text_repel(aes(label=genelabels), force=3, min.segment.length=0.5, box.padding=0.5)+
# #   ggtitle("THC:negative versus THC:positive Expression")+
# #   xlab("log2 fold change")+ 
# #   ylab("-log10 adjusted p-value")+
# #   # scale_color_viridis(option="turbo", discrete=TRUE)+
# #   theme_minimal()+
# #   theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.2)),
# #         axis.text.x=element_text(color="black", face="bold", size=rel(1.2)),
# #         axis.title.x=element_text(color="black", face="bold", size=rel(1)),
# #         axis.title.y=element_text(color="black", face="bold", size=rel(1)),
# #         panel.border=element_rect(color="black", linewidth=1, fill=NA),
# #         strip.background=element_rect(color="black", linewidth=1),
# #         strip.text=element_text(color="black", face="bold", size=rel(0.8)),
# #         axis.line=element_blank(),
# #         axis.ticks=element_line(linewidth=1),
# #         legend.position="none",
# #         legend.title=element_text(color="black", face="bold", size=rel(1)),
# #         legend.text=element_text(color="black", face="bold", size=rel(0.8)),
# #         plot.title=element_text(color="black", face="bold", size=rel(1)))
# 
# # PL
# ##  Obtain logical vector where TRUE values denote padj values < 0.1 and fold change > 1.5 in either direction.
# res_table_tb_vp_PL=res_table_tb_PL %>%
#   dplyr::mutate(threshold=padj<0.1 & abs(log2FoldChange)>=0.58)
# ##  Plots the volcano plot.
# ggplot()+
#   geom_point(data=res_table_tb_vp_PL, aes(x=log2FoldChange, y=-log10(padj), color=threshold))+
#   ggtitle("THC:negative versus THC:positive Expression")+
#   xlab("log2 fold change")+ 
#   ylab("-log10 adjusted p-value")+
#   # scale_color_viridis(option="turbo", discrete=TRUE)+
#   theme_minimal()+
#   theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.2)),
#         axis.text.x=element_text(color="black", face="bold", size=rel(1.2)),
#         axis.title.x=element_text(color="black", face="bold", size=rel(1)),
#         axis.title.y=element_text(color="black", face="bold", size=rel(1)),
#         panel.border=element_rect(color="black", linewidth=1, fill=NA),
#         strip.background=element_rect(color="black", linewidth=1),
#         strip.text=element_text(color="black", face="bold", size=rel(0.8)),
#         axis.line=element_blank(),
#         axis.ticks=element_line(linewidth=1),
#         legend.position="none",
#         legend.title=element_text(color="black", face="bold", size=rel(1)),
#         legend.text=element_text(color="black", face="bold", size=rel(0.8)),
#         plot.title=element_text(color="black", face="bold", size=rel(1)))
# 
# ##  Label the top 10 genes with the lowest padj (conditional on max.overlaps value).
# ##  Create a column to indicate which genes to label.
# res_table_tb_vp_PL=res_table_tb_vp_PL %>% dplyr::arrange(padj) %>% dplyr::mutate(genelabels="")
# res_table_tb_vp_PL$genelabels[1:29]=res_table_tb_vp_PL$gene[1:29]
# ##  Plots the volcano plot with an additional layer for geom_text_repel().
# ggplot(res_table_tb_vp_PL, aes(x=log2FoldChange, y=-log10(padj)))+
#   geom_point(aes(color=threshold))+
#   geom_text_repel(aes(label=genelabels), force=3, min.segment.length=0.5, box.padding=0.5)+
#   ggtitle("THC:negative versus THC:positive Expression")+
#   xlab("log2 fold change")+ 
#   ylab("-log10 adjusted p-value")+
#   # scale_color_viridis(option="turbo", discrete=TRUE)+
#   theme_minimal()+
#   theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.2)),
#         axis.text.x=element_text(color="black", face="bold", size=rel(1.2)),
#         axis.title.x=element_text(color="black", face="bold", size=rel(1)),
#         axis.title.y=element_text(color="black", face="bold", size=rel(1)),
#         panel.border=element_rect(color="black", linewidth=1, fill=NA),
#         strip.background=element_rect(color="black", linewidth=1),
#         strip.text=element_text(color="black", face="bold", size=rel(0.8)),
#         axis.line=element_blank(),
#         axis.ticks=element_line(linewidth=1),
#         legend.position="none",
#         legend.title=element_text(color="black", face="bold", size=rel(1)),
#         legend.text=element_text(color="black", face="bold", size=rel(0.8)),
#         plot.title=element_text(color="black", face="bold", size=rel(1)))
# 
# # PM
# ##  Obtain logical vector where TRUE values denote padj values < 0.1 and fold change > 1.5 in either direction.
# res_table_tb_vp_PM=res_table_tb_PM %>%
#   dplyr::mutate(threshold=padj<0.1 & abs(log2FoldChange)>=0.58)
# ##  Plots the volcano plot.
# ggplot()+
#   geom_point(data=res_table_tb_vp_PM, aes(x=log2FoldChange, y=-log10(padj), color=threshold))+
#   ggtitle("THC:negative versus THC:positive Expression")+
#   xlab("log2 fold change")+ 
#   ylab("-log10 adjusted p-value")+
#   # scale_color_viridis(option="turbo", discrete=TRUE)+
#   theme_minimal()+
#   theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.2)),
#         axis.text.x=element_text(color="black", face="bold", size=rel(1.2)),
#         axis.title.x=element_text(color="black", face="bold", size=rel(1)),
#         axis.title.y=element_text(color="black", face="bold", size=rel(1)),
#         panel.border=element_rect(color="black", linewidth=1, fill=NA),
#         strip.background=element_rect(color="black", linewidth=1),
#         strip.text=element_text(color="black", face="bold", size=rel(0.8)),
#         axis.line=element_blank(),
#         axis.ticks=element_line(linewidth=1),
#         legend.position="none",
#         legend.title=element_text(color="black", face="bold", size=rel(1)),
#         legend.text=element_text(color="black", face="bold", size=rel(0.8)),
#         plot.title=element_text(color="black", face="bold", size=rel(1)))
# 
# ##  Label the top 10 genes with the lowest padj (conditional on max.overlaps value).
# ##  Create a column to indicate which genes to label.
# res_table_tb_vp_PM=res_table_tb_vp_PM %>% dplyr::arrange(padj) %>% dplyr::mutate(genelabels="")
# res_table_tb_vp_PM$genelabels[1:4]=res_table_tb_vp_PM$gene[1:4]
# ##  Plots the volcano plot with an additional layer for geom_text_repel().
# ggplot(res_table_tb_vp_PM, aes(x=log2FoldChange, y=-log10(padj)))+
#   geom_point(aes(color=threshold))+
#   geom_text_repel(aes(label=genelabels), force=3, min.segment.length=0.5, box.padding=0.5)+
#   ggtitle("THC:negative versus THC:positive Expression")+
#   xlab("log2 fold change")+ 
#   ylab("-log10 adjusted p-value")+
#   # scale_color_viridis(option="turbo", discrete=TRUE)+
#   theme_minimal()+
#   theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.2)),
#         axis.text.x=element_text(color="black", face="bold", size=rel(1.2)),
#         axis.title.x=element_text(color="black", face="bold", size=rel(1)),
#         axis.title.y=element_text(color="black", face="bold", size=rel(1)),
#         panel.border=element_rect(color="black", linewidth=1, fill=NA),
#         strip.background=element_rect(color="black", linewidth=1),
#         strip.text=element_text(color="black", face="bold", size=rel(0.8)),
#         axis.line=element_blank(),
#         axis.ticks=element_line(linewidth=1),
#         legend.position="none",
#         legend.title=element_text(color="black", face="bold", size=rel(1)),
#         legend.text=element_text(color="black", face="bold", size=rel(0.8)),
#         plot.title=element_text(color="black", face="bold", size=rel(1)))
# 
# # # PS
# # ##  Obtain logical vector where TRUE values denote padj values < 0.1 and fold change > 1.5 in either direction.
# # res_table_tb_vp_PS=res_table_tb_PS %>%
# #   dplyr::mutate(threshold=padj<0.1 & abs(log2FoldChange)>=0.58)
# # ##  Plots the volcano plot.
# # ggplot()+
# #   geom_point(data=res_table_tb_vp_PS, aes(x=log2FoldChange, y=-log10(padj), color=threshold))+
# #   ggtitle("THC:negative versus THC:positive Expression")+
# #   xlab("log2 fold change")+ 
# #   ylab("-log10 adjusted p-value")+
# #   # scale_color_viridis(option="turbo", discrete=TRUE)+
# #   theme_minimal()+
# #   theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.2)),
# #         axis.text.x=element_text(color="black", face="bold", size=rel(1.2)),
# #         axis.title.x=element_text(color="black", face="bold", size=rel(1)),
# #         axis.title.y=element_text(color="black", face="bold", size=rel(1)),
# #         panel.border=element_rect(color="black", linewidth=1, fill=NA),
# #         strip.background=element_rect(color="black", linewidth=1),
# #         strip.text=element_text(color="black", face="bold", size=rel(0.8)),
# #         axis.line=element_blank(),
# #         axis.ticks=element_line(linewidth=1),
# #         legend.position="none",
# #         legend.title=element_text(color="black", face="bold", size=rel(1)),
# #         legend.text=element_text(color="black", face="bold", size=rel(0.8)),
# #         plot.title=element_text(color="black", face="bold", size=rel(1)))
# # 
# # ##  Label the top 10 genes with the lowest padj (conditional on max.overlaps value).
# # ##  Create a column to indicate which genes to label.
# # res_table_tb_vp_PS=res_table_tb_vp_PS %>% dplyr::arrange(padj) %>% dplyr::mutate(genelabels="")
# # res_table_tb_vp_PS$genelabels[1:10]=res_table_tb_vp_PS$gene[1:10]
# # ##  Plots the volcano plot with an additional layer for geom_text_repel().
# # ggplot(res_table_tb_vp_PS, aes(x=log2FoldChange, y=-log10(padj)))+
# #   geom_point(aes(color=threshold))+
# #   geom_text_repel(aes(label=genelabels), force=3, min.segment.length=0.5, box.padding=0.5)+
# #   ggtitle("THC:negative versus THC:positive Expression")+
# #   xlab("log2 fold change")+ 
# #   ylab("-log10 adjusted p-value")+
# #   # scale_color_viridis(option="turbo", discrete=TRUE)+
# #   theme_minimal()+
# #   theme(axis.text.y=element_text(color="black", face="bold", size=rel(1.2)),
# #         axis.text.x=element_text(color="black", face="bold", size=rel(1.2)),
# #         axis.title.x=element_text(color="black", face="bold", size=rel(1)),
# #         axis.title.y=element_text(color="black", face="bold", size=rel(1)),
# #         panel.border=element_rect(color="black", linewidth=1, fill=NA),
# #         strip.background=element_rect(color="black", linewidth=1),
# #         strip.text=element_text(color="black", face="bold", size=rel(0.8)),
# #         axis.line=element_blank(),
# #         axis.ticks=element_line(linewidth=1),
# #         legend.position="none",
# #         legend.title=element_text(color="black", face="bold", size=rel(1)),
# #         legend.text=element_text(color="black", face="bold", size=rel(0.8)),
# #         plot.title=element_text(color="black", face="bold", size=rel(1)))

Add Annotation Information (Optional)

Only perform one of the following conversions before continuing on with the rest of the code block. Uncomment/comment out the appropriate conversion code as appropriate. The de-duplication process can result in a considerable number of entries in the results table being removed, so only do this if you absolutely need to add annotation information for downstream processes.

# ##  Convert from gene symbol to Ensembl IDs (only do this if the dds results has gene symbols).
# ##  Return the IDs for the gene symbols in the DE results.
# idx=grch38$symbol %in% rownames(res_table)
# ids=grch38[idx, ]
# ##  The gene names can map to more than one Ensembl ID (some genes change ID over time), so duplicate IDs need to be removed.
# non_duplicates=which(duplicated(ids$symbol) == FALSE)
# ids=ids[non_duplicates, ]
# ## Merge the IDs with the results.
# res_ids=inner_join(sig, ids, by=c("gene"="symbol"))

# PB
##  Convert from Ensembl IDs to Entrez IDs (only do this if the dds results has Ensembl IDs).
##  Return the IDs for the gene symbols in the DE results
idx_PB=grch38$ensgene %in% rownames(res_table_PB)
ids_PB=grch38[idx_PB, ]
##  The Entrez IDs can map to more than one Ensembl ID (some genes change ID over time), so duplicate IDs need to be removed.
non_duplicates_PB=which(duplicated(ids_PB$entrez) == FALSE)
ids_PB=ids_PB[non_duplicates_PB, ]
## Merge the IDs with the results.
# Significant DEGs
res_ids_PB=inner_join(sig_PB, ids_PB, by=c("gene"="ensgene"))
# All genes
all_ids_PB=inner_join(res_table_tb_PB, ids_PB, by=c("gene"="ensgene"))
## Move the Entrez ID and gene symbol columns to after the Ensembl ID column, then show the merged table.
# Significant DEGs
res_ids_PB=res_ids_PB %>%
  relocate(entrez, .after=gene) %>%
  relocate(symbol, .after=entrez)
res_ids_PB
write.csv(res_ids_PB, "gencode_Output_Files/PB_THC_sig_DEGs_annotated.csv", quote=FALSE, row.names=FALSE)
# All genes
all_ids_PB=all_ids_PB %>%
  relocate(entrez, .after=gene) %>%
  relocate(symbol, .after=entrez)
all_ids_PB
write.csv(all_ids_PB, "gencode_Output_Files/PB_THC_all_genes_annotated.csv", quote=FALSE, row.names=FALSE)

# PL
##  Convert from Ensembl IDs to Entrez IDs (only do this if the dds results has Ensembl IDs).
##  Return the IDs for the gene symbols in the DE results
idx_PL=grch38$ensgene %in% rownames(res_table_PL)
ids_PL=grch38[idx_PL, ]
##  The Entrez IDs can map to more than one Ensembl ID (some genes change ID over time), so duplicate IDs need to be removed.
non_duplicates_PL=which(duplicated(ids_PL$entrez) == FALSE)
ids_PL=ids_PL[non_duplicates_PL, ]
## Merge the IDs with the results.
# Significant DEGs
res_ids_PL=inner_join(sig_PL, ids_PL, by=c("gene"="ensgene"))
# All genes
all_ids_PL=inner_join(res_table_tb_PL, ids_PL, by=c("gene"="ensgene"))
## Move the Entrez ID and gene symbol columns to after the Ensembl ID column, then show the merged table.
# Significant DEGs
res_ids_PL=res_ids_PL %>%
  relocate(entrez, .after=gene) %>%
  relocate(symbol, .after=entrez)
res_ids_PL
write.csv(res_ids_PL, "gencode_Output_Files/PL_THC_sig_DEGs_annotated.csv", quote=FALSE, row.names=FALSE)
# All genes
all_ids_PL=all_ids_PL %>%
  relocate(entrez, .after=gene) %>%
  relocate(symbol, .after=entrez)
all_ids_PL
write.csv(all_ids_PL, "gencode_Output_Files/PL_THC_all_genes_annotated.csv", quote=FALSE, row.names=FALSE)

# PM
##  Convert from Ensembl IDs to Entrez IDs (only do this if the dds results has Ensembl IDs).
##  Return the IDs for the gene symbols in the DE results
idx_PM=grch38$ensgene %in% rownames(res_table_PM)
ids_PM=grch38[idx_PM, ]
##  The Entrez IDs can map to more than one Ensembl ID (some genes change ID over time), so duplicate IDs need to be removed.
non_duplicates_PM=which(duplicated(ids_PM$entrez) == FALSE)
ids_PM=ids_PM[non_duplicates_PM, ]
## Merge the IDs with the results.
# Significant DEGs
res_ids_PM=inner_join(sig_PM, ids_PM, by=c("gene"="ensgene"))
# All genes
all_ids_PM=inner_join(res_table_tb_PM, ids_PM, by=c("gene"="ensgene"))
## Move the Entrez ID and gene symbol columns to after the Ensembl ID column, then show the merged table.
# Significant DEGs
res_ids_PM=res_ids_PM %>%
  relocate(entrez, .after=gene) %>%
  relocate(symbol, .after=entrez)
res_ids_PM
write.csv(res_ids_PM, "gencode_Output_Files/PM_THC_sig_DEGs_annotated.csv", quote=FALSE, row.names=FALSE)
# All genes
all_ids_PM=all_ids_PM %>%
  relocate(entrez, .after=gene) %>%
  relocate(symbol, .after=entrez)
all_ids_PM
write.csv(all_ids_PM, "gencode_Output_Files/PM_THC_all_genes_annotated.csv", quote=FALSE, row.names=FALSE)

# PS
##  Convert from Ensembl IDs to Entrez IDs (only do this if the dds results has Ensembl IDs).
##  Return the IDs for the gene symbols in the DE results
idx_PS=grch38$ensgene %in% rownames(res_table_PS)
ids_PS=grch38[idx_PS, ]
##  The Entrez IDs can map to more than one Ensembl ID (some genes change ID over time), so duplicate IDs need to be removed.
non_duplicates_PS=which(duplicated(ids_PS$entrez) == FALSE)
ids_PS=ids_PS[non_duplicates_PS, ]
## Merge the IDs with the results.
# Significant DEGs
res_ids_PS=inner_join(sig_PS, ids_PS, by=c("gene"="ensgene"))
# All genes
all_ids_PS=inner_join(res_table_tb_PS, ids_PS, by=c("gene"="ensgene"))
## Move the Entrez ID and gene symbol columns to after the Ensembl ID column, then show the merged table.
# Significant DEGs
res_ids_PS=res_ids_PS %>%
  relocate(entrez, .after=gene) %>%
  relocate(symbol, .after=entrez)
res_ids_PS
write.csv(res_ids_PS, "gencode_Output_Files/PS_THC_sig_DEGs_annotated.csv", quote=FALSE, row.names=FALSE)
# All genes
all_ids_PS=all_ids_PS %>%
  relocate(entrez, .after=gene) %>%
  relocate(symbol, .after=entrez)
all_ids_PS
write.csv(all_ids_PS, "gencode_Output_Files/PS_THC_all_genes_annotated.csv", quote=FALSE, row.names=FALSE)

Annotated Significant DEG Tables

# PL
final_res_ids_PL=as.data.frame(res_ids_PL)
final_res_ids_PL[,4:6]=as.data.frame(round(final_res_ids_PL[,4:6], digits=3))
final_res_ids_PL[,7:8]=format(final_res_ids_PL[,7:8], scientific=TRUE, digits=3)
table_PL=flextable(data=final_res_ids_PL)
table_PL=table_PL %>%
  bold(bold=TRUE, part="header") %>%
  set_table_properties(layout="autofit") %>%
  fit_to_width(10)
table_PL

gene

entrez

symbol

baseMean

log2FoldChange

lfcSE

pvalue

padj

chr

start

end

strand

biotype

description

ENSG00000063438

57,491

AHRR

39.680

2.281

0.485

4.47e-08

9.72e-04

5

321,714

438,291

1

protein_coding

aryl hydrocarbon receptor repressor

ENSG00000158164

11,013

TMSB15A

21.441

-1.531

0.320

1.08e-07

1.18e-03

X

102,513,682

102,516,739

-1

protein_coding

thymosin beta 15A

ENSG00000154165

2,838

GPR15

17.183

2.215

0.547

9.34e-07

6.78e-03

3

98,531,978

98,534,681

1

protein_coding

G protein-coupled receptor 15

ENSG00000159339

23,569

PADI4

55.639

2.098

0.542

2.59e-06

1.12e-02

1

17,308,195

17,364,004

1

protein_coding

peptidyl arginine deiminase 4

ENSG00000173535

8,794

TNFRSF10C

37.443

1.353

0.340

2.76e-06

1.12e-02

8

23,102,921

23,117,445

1

protein_coding

TNF receptor superfamily member 10c

ENSG00000185669

333,929

SNAI3

19.078

0.825

0.213

3.59e-06

1.12e-02

16

88,677,688

88,686,507

-1

protein_coding

snail family transcriptional repressor 3

ENSG00000205038

93,035

PKHD1L1

681.956

1.212

0.310

3.60e-06

1.12e-02

8

109,362,461

109,537,207

1

protein_coding

PKHD1 like 1

ENSG00000158517

653,361

NCF1

71.617

1.249

0.355

1.48e-05

4.03e-02

7

74,774,011

74,789,315

1

protein_coding

neutrophil cytosolic factor 1

ENSG00000165178

654,817

NCF1C

33.028

1.238

0.365

2.08e-05

4.52e-02

7

75,156,639

75,172,044

-1

unprocessed_pseudogene

neutrophil cytosolic factor 1C pseudogene

ENSG00000116701

4,688

NCF2

532.308

0.762

0.226

2.93e-05

5.11e-02

1

183,554,461

183,590,905

-1

protein_coding

neutrophil cytosolic factor 2

ENSG00000158683

168,507

PKD1L1

200.743

1.035

0.314

3.05e-05

5.11e-02

7

47,740,202

47,948,466

-1

protein_coding

polycystin 1 like 1, transient receptor potential channel interacting

ENSG00000185640

338,785

KRT79

16.521

1.525

0.484

3.87e-05

6.01e-02

12

52,821,408

52,834,311

-1

protein_coding

keratin 79

ENSG00000134955

219,855

SLC37A2

113.411

0.694

0.215

4.73e-05

6.86e-02

11

125,063,302

125,090,516

1

protein_coding

solute carrier family 37 member 2

ENSG00000102575

54

ACP5

265.403

0.674

0.224

9.04e-05

9.62e-02

19

11,574,653

11,579,993

-1

protein_coding

acid phosphatase 5, tartrate resistant

ENSG00000117115

11,240

PADI2

100.079

0.916

0.310

1.03e-04

9.62e-02

1

17,066,761

17,119,451

-1

protein_coding

peptidyl arginine deiminase 2

ENSG00000140465

1,543

CYP1A1

308.918

2.439

0.797

7.14e-05

9.62e-02

15

74,719,542

74,725,536

-1

protein_coding

cytochrome P450 family 1 subfamily A member 1

ENSG00000159399

3,099

HK2

499.815

0.722

0.238

8.89e-05

9.62e-02

2

74,834,127

74,893,359

1

protein_coding

hexokinase 2

ENSG00000167680

10,501

SEMA6B

212.123

0.938

0.312

8.34e-05

9.62e-02

19

4,542,593

4,581,776

-1

protein_coding

semaphorin 6B


# PM
final_res_ids_PM=as.data.frame(res_ids_PM)
final_res_ids_PM[,4:6]=as.data.frame(round(final_res_ids_PM[,4:6], digits=3))
final_res_ids_PM[,7:8]=format(final_res_ids_PM[,7:8], scientific=TRUE, digits=3)
table_PM=flextable(data=final_res_ids_PM)
table_PM=table_PM %>%
  bold(bold=TRUE, part="header") %>%
  set_table_properties(layout="autofit") %>%
  fit_to_width(9.19)
table_PM

gene

entrez

symbol

baseMean

log2FoldChange

lfcSE

pvalue

padj

chr

start

end

strand

biotype

description

ENSG00000140465

1,543

CYP1A1

115.075

2.153

0.644

2.50e-20

1.40e-15

15

74,719,542

74,725,536

-1

protein_coding

cytochrome P450 family 1 subfamily A member 1

ENSG00000124818

221,391

OPN5

12.025

-1.740

0.329

4.50e-09

1.26e-04

6

47,781,982

47,832,780

1

protein_coding

opsin 5

ENSG00000074410

771

CA12

10.452

1.967

0.506

2.97e-06

4.14e-02

15

63,321,378

63,381,846

-1

protein_coding

carbonic anhydrase 12

ENSG00000163435

1,999

ELF3

7.176

2.085

0.533

2.58e-06

4.14e-02

1

202,007,945

202,017,183

1

protein_coding

E74 like ETS transcription factor 3


sect_properties=prop_section(
  page_size=page_size(
    orient="landscape",
    width=8.5, height=11),
  type="continuous",
  page_margins=page_mar())
save_as_docx(table_PL, table_PM,
             path="postmortem_tables.docx", pr_section=sect_properties)

Addendum: RNA Metrics

## Summarize data: omit rows containing NAs, group data by "tissue", then calculate mean and standard deviation for "concentration," "A260_280," "A260_230," and "RIN" and generate a table with the output
tissue_data_na=na.omit(metadata_all)
tissue_data.summary=tissue_data_na %>%
  group_by(tissue) %>%
  summarise(
    mean_conc=mean(concentration),
    sd_conc=sd(concentration),
    mean_RIN=mean(RIN),
    sd_RIN=sd(RIN),
    mean_A260_280=mean(A260_280),
    sd_A260_280=sd(A260_280),
    mean_A260_230=mean(A260_230),
    sd_A260_230=sd(A260_230)
  )
tissue_data.summary

tissue_data_na %>%
  summarise(mean(RIN), sd(RIN))

RNA_stats_PM=as.data.frame(tissue_data.summary)
RNA_stats_PM[,2:9]=as.data.frame(round(RNA_stats_PM[,2:9], digits=3))
table_RNA_stats=flextable(data=RNA_stats_PM)
table_RNA_stats=table_RNA_stats %>%
  bold(bold=TRUE, part="header") %>%
  set_table_properties(layout="autofit") %>%
  fit_to_width(6)
table_RNA_stats

tissue

mean_conc

sd_conc

mean_RIN

sd_RIN

mean_A260_280

sd_A260_280

mean_A260_230

sd_A260_230

blood

242.279

346.551

3.094

1.236

1.992

0.087

2.100

0.218

brain

506.787

457.304

4.196

0.978

2.070

0.027

2.156

0.143

lung

164.391

154.572

3.927

1.417

2.086

0.025

2.132

0.119

muscle

319.542

178.790

5.027

1.467

2.079

0.018

2.134

0.098


save_as_docx(table_RNA_stats, path="postmortem_RNA_tables.docx", pr_section=sect_properties)
# Concentration
RNA1=ggplot()+
  # create boxplot layer
  geom_boxplot(data=tissue_data_na, aes(x=tissue, y=concentration, fill=tissue), 
               width=0.75, lwd=0.75, show.legend=FALSE)+
  # set the x-axis scale to the limits and labels defined below
  scale_x_discrete(limits=c("brain", "lung", "muscle", "blood"),
                   labels=c("Brain", "Lung", "Muscle", "Blood"))+
  # set fill color scale
  scale_fill_manual(values=alpha(c("black", "black", "black", "black", "black", "black"), 0.25), guide="none",
                    limits=c("brain", "lung", "muscle", "blood"),
                    labels=c("Brain", "Lung", "Muscle", "Blood"))+
  # change plot scaling ratio
  coord_fixed(ratio=1/305)+  
  # define theme variables  
  theme_minimal()+
  theme(axis.text.y=element_text(color="black", face="bold", size=rel(1)),
        axis.text.x=element_text(angle=30, hjust=1, color="black", face="bold", size=rel(1)),
        # axis.title.x=element_text(color="black", face="bold", size=rel(0.80)),
        axis.title.x=element_blank(),
        axis.title.y=element_text(color="black", face="bold", size=rel(1)),
        panel.border=element_rect(color="black", linewidth=1, fill=NA),
        panel.grid.minor.y=element_blank(),
        strip.background=element_rect(color="black", linewidth=1),
        strip.text=element_text(color="black", face="bold", size=rel(0.8)),
        axis.line=element_blank(),
        axis.ticks=element_line(linewidth=1),
        legend.position="none",
        legend.key.size=unit(rel(0.50), "cm"), 
        legend.title=element_text(color="black", face="bold", size=rel(0.60)),
        legend.text=element_text(color="black", face="bold", size=rel(0.60)),
        plot.title=element_text(color="black", face="bold", size=rel(1)),
        plot.margin=unit(c(0.10, 0.10, 0.10, 0.10), "cm"))+
  # x-axis label  
  xlab("Tissue")+
  # y-axis label  
  ylab("Concentration (ng/\u00B5L)")

# A260_280
RNA2=ggplot()+
  # create boxplot layer
  geom_boxplot(data=tissue_data_na, aes(x=tissue, y=A260_280, fill=tissue), 
               width=0.75, lwd=0.75, show.legend=FALSE)+
  # set the x-axis scale to the limits and labels defined below
  scale_x_discrete(limits=c("brain", "lung", "muscle", "blood"),
                   labels=c("Brain", "Lung", "Muscle", "Blood"))+
  # set fill color scale
  scale_fill_manual(values=alpha(c("black", "black", "black", "black", "black", "black"), 0.25), guide="none",
                    limits=c("brain", "lung", "muscle", "blood"),
                    labels=c("Brain", "Lung", "Muscle", "Blood"))+
  # change plot scaling ratio
  coord_fixed(ratio=20.5/1)+  
  # define theme variables  
  theme_minimal()+
  theme(axis.text.y=element_text(color="black", face="bold", size=rel(1)),
        axis.text.x=element_text(angle=30, hjust=1, color="black", face="bold", size=rel(1)),
        # axis.title.x=element_text(color="black", face="bold", size=rel(0.80)),
        axis.title.x=element_blank(),
        axis.title.y=element_text(color="black", face="bold", size=rel(1)),
        panel.border=element_rect(color="black", linewidth=1, fill=NA),
        panel.grid.minor.y=element_blank(),
        strip.background=element_rect(color="black", linewidth=1),
        strip.text=element_text(color="black", face="bold", size=rel(0.8)),
        axis.line=element_blank(),
        axis.ticks=element_line(linewidth=1),
        legend.position="none",
        legend.key.size=unit(rel(0.50), "cm"), 
        legend.title=element_text(color="black", face="bold", size=rel(0.60)),
        legend.text=element_text(color="black", face="bold", size=rel(0.60)),
        plot.title=element_text(color="black", face="bold", size=rel(1)),
        plot.margin=unit(c(0.10, 0.10, 0.10, 0.10), "cm"))+
  # x-axis label  
  xlab("Tissue")+
  # y-axis label  
  ylab("A260/280 Ratio")

# A260_230
RNA3=ggplot()+
  # create boxplot layer
  geom_boxplot(data=tissue_data_na, aes(x=tissue, y=A260_230, fill=tissue), 
               width=0.75, lwd=0.75, show.legend=FALSE)+
  # set the x-axis scale to the limits and labels defined below
  scale_x_discrete(limits=c("brain", "lung", "muscle", "blood"),
                   labels=c("Brain", "Lung", "Muscle", "Blood"))+
  # set fill color scale
  scale_fill_manual(values=alpha(c("black", "black", "black", "black", "black", "black"), 0.25), guide="none",
                    limits=c("brain", "lung", "muscle", "blood"),
                    labels=c("Brain", "Lung", "Muscle", "Blood"))+
  # change plot scaling ratio
  coord_fixed(ratio=8.2/1)+  
  # define theme variables  
  theme_minimal()+
  theme(axis.text.y=element_text(color="black", face="bold", size=rel(1)),
        axis.text.x=element_text(angle=30, hjust=1, color="black", face="bold", size=rel(1)),
        # axis.title.x=element_text(color="black", face="bold", size=rel(0.80)),
        axis.title.x=element_blank(),
        axis.title.y=element_text(color="black", face="bold", size=rel(1)),
        panel.border=element_rect(color="black", linewidth=1, fill=NA),
        panel.grid.minor.y=element_blank(),
        strip.background=element_rect(color="black", linewidth=1),
        strip.text=element_text(color="black", face="bold", size=rel(0.8)),
        axis.line=element_blank(),
        axis.ticks=element_line(linewidth=1),
        legend.position="none",
        legend.key.size=unit(rel(0.50), "cm"), 
        legend.title=element_text(color="black", face="bold", size=rel(0.60)),
        legend.text=element_text(color="black", face="bold", size=rel(0.60)),
        plot.title=element_text(color="black", face="bold", size=rel(1)),
        plot.margin=unit(c(0.10, 0.10, 0.10, 0.10), "cm"))+
  # x-axis label  
  xlab("Tissue")+
  # y-axis label  
  ylab("A260/230 Ratio")

# RIN
RNA4=ggplot()+
  # create boxplot layer
  geom_boxplot(data=tissue_data_na, aes(x=tissue, y=RIN, fill=tissue), 
               width=0.75, lwd=0.75, show.legend=FALSE)+
  # set the x-axis scale to the limits and labels defined below
  scale_x_discrete(limits=c("brain", "lung", "muscle", "blood"),
                   labels=c("Brain", "Lung", "Muscle", "Blood"))+
  # set fill color scale
  scale_fill_manual(values=alpha(c("black", "black", "black", "black", "black", "black"), 0.25), guide="none",
                    limits=c("brain", "lung", "muscle", "blood"),
                    labels=c("Brain", "Lung", "Muscle", "Blood"))+
  # change plot scaling ratio
  coord_fixed(ratio=1.25/1)+  
  # define theme variables  
  theme_minimal()+
  theme(axis.text.y=element_text(color="black", face="bold", size=rel(1)),
        axis.text.x=element_text(angle=30, hjust=1, color="black", face="bold", size=rel(1)),
        # axis.title.x=element_text(color="black", face="bold", size=rel(0.80)),
        axis.title.x=element_blank(),
        axis.title.y=element_text(color="black", face="bold", size=rel(1)),
        panel.border=element_rect(color="black", linewidth=1, fill=NA),
        panel.grid.minor.y=element_blank(),
        strip.background=element_rect(color="black", linewidth=1),
        strip.text=element_text(color="black", face="bold", size=rel(0.8)),
        axis.line=element_blank(),
        axis.ticks=element_line(linewidth=1),
        legend.position="none",
        legend.key.size=unit(rel(0.50), "cm"), 
        legend.title=element_text(color="black", face="bold", size=rel(0.60)),
        legend.text=element_text(color="black", face="bold", size=rel(0.60)),
        plot.title=element_text(color="black", face="bold", size=rel(1)),
        plot.margin=unit(c(0.10, 0.10, 0.10, 0.10), "cm"))+
  # x-axis label  
  xlab("Tissue")+
  # y-axis label  
  ylab("RNA Integrity Number")

RNA Statistics Combined Figure

RNA_patchwork=RNA1 + RNA4 + RNA2 + RNA3 + plot_layout(ncol=2)
RNA_patchwork + plot_annotation(tag_levels="A")
ggsave("PM_RNA_plots.png", width=4.845, height=8, unit="in", dpi=320)

LS0tCnRpdGxlOiAiREVTZXEyIEZBQSBHRU4gYW5hbHlzaXM6IFBvc3Rtb3J0ZW0gUHJvamVjdCwgR2VuY29kZSBSZWZlcmVuY2UgR2Vub21lIgphdXRob3I6IENocmlzdG9waGVyIEouIFRyYWN5CmRhdGU6IDIwMjMuMDguMDctMjAyMy4wOC4wOTsgMjAyNC4wMS4xMDsgMjAyNC4wMi4xNApvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKZWRpdG9yX29wdGlvbnM6CiAgbWFya2Rvd246CiAgICB3cmFwOiAxNDQKLS0tCk5PVEU6ICBhbGwgcGxvdHMgYXJlIHNhdmVkIGFzIG9iamVjdHMgdG8gZmFjaWxpdGF0ZSBwbGFjZW1lbnQgb2YgaW5kaXZpZHVhbCBwbG90cyBpbnRvIGNvbWJpbmVkIGZpZ3VyZXMuICBUaGUgYWVzdGhldGljcyBvZiB0aGUgcGxvdHMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGNyZWF0ZSB0aGVzZSBmaWd1cmVzLiAgSWYgcGxvdHRlZCBkaXJlY3RseSBpbiB0aGUgTWFya2Rvd24gZG9jdW1lbnQsIHRoZSBmaWd1cmVzIHdpbGwgbGlrZWx5IGxvb2sgcG9vciBkdWUgdG8gdGhlc2UgY2hhbmdlZCBhZXN0aGV0aWNzLgoKTk9URTogIGNvbW1lbnRlZCBvdXQgY29kZSBpcyBjb2RlIHRoYXQgd2FzIG5vdCB1c2VkIGluIHRoZSBhbmFseXNpcywgYnV0IHdhcyBrZXB0IGZvciBoaXN0b3JpY2FsIHB1cnBvc2VzLiAgSXQgZG9lcyBub3QgbmVlZCB0byBiZSB1bmNvbW1lbnRlZCBpbiBvcmRlciB0byByZXBsaWNhdGUgdGhlIGFuYWx5c2lzLgoKVGhpcyBwaXBlbGluZSB3YXMgYWRhcHRlZCBpbiBwYXJ0IGZyb20gdGhlIHRyYWluaW5nIHJlc291cmNlcyBhdCA8aHR0cHM6Ly9naXRodWIuY29tL2hiY3RyYWluaW5nL0RHRV93b3Jrc2hvcC90cmVlL21hc3Rlci9sZXNzb25zPi4KCkJlZm9yZSBzdGFydGluZywgZW5zdXJlIHRoYXQgeW91ciB3b3JraW5nIGRpcmVjdG9yeSBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpbGVzIGFuZCBhcmNoaXRlY3R1cmU6CmBgYHtyfQojIyAgZ2VuY29kZV9mZWF0dXJlY291bnRzLlJtYXRyaXgudHh0CiMjICBtZXRhZGF0YS5jc3YKIyMgIGdlbmNvZGVfT3V0cHV0X0ZpbGVzCmBgYAoKKipMaWJyYXJpZXMqKgo9PT0KTG9hZCB0aGUgcmVxdWlyZWQgbGlicmFyaWVzLgpgYGB7cn0KIyBCaW9jTWFuYWdlcjo6aW5zdGFsbCgiREVTZXEyIikKIyBCaW9jTWFuYWdlcjo6aW5zdGFsbCgiR2VuZVN0cnVjdHVyZVRvb2xzIikKIyBCaW9jTWFuYWdlcjo6aW5zdGFsbCgibGltbWEiKQojIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJhcGVnbG0iKQojIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJERUdyZXBvcnQiKQojIEJpb2NNYW5hZ2VyOjppbnN0YWxsKCJBbm5vdGF0aW9uSHViIikKIyBCaW9jTWFuYWdlcjo6aW5zdGFsbCgiZW5zZW1ibGRiIikKIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoInN0ZXBoZW50dXJuZXIvYW5ub3RhYmxlcyIpCgpsaWJyYXJ5KERFU2VxMikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoR2VuZVN0cnVjdHVyZVRvb2xzKQpsaWJyYXJ5KGxpbW1hKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGhlYXRtYXApCmxpYnJhcnkoYXBlZ2xtKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkoREVHcmVwb3J0KQpsaWJyYXJ5KEFubm90YXRpb25IdWIpCmxpYnJhcnkoZW5zZW1ibGRiKQpsaWJyYXJ5KGFubm90YWJsZXMpCmxpYnJhcnkocGFscykKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShnZ2lyYXBoRXh0cmEpCmxpYnJhcnkoZmxleHRhYmxlKQpsaWJyYXJ5KHBhbHMpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGdnaXJhcGgpCmxpYnJhcnkob2ZmaWNlcikKbGlicmFyeShtYWdyaXR0cikKCmNpdGF0aW9uKCJERVNlcTIiKQpjaXRhdGlvbigidGlkeXZlcnNlIikKY2l0YXRpb24oIkdlbmVTdHJ1Y3R1cmVUb29scyIpCmNpdGF0aW9uKCJsaW1tYSIpCmNpdGF0aW9uKCJnZ3Bsb3QyIikKY2l0YXRpb24oInBoZWF0bWFwIikKY2l0YXRpb24oImFwZWdsbSIpCmNpdGF0aW9uKCJnZ3JlcGVsIikKY2l0YXRpb24oIkRFR3JlcG9ydCIpCmNpdGF0aW9uKCJBbm5vdGF0aW9uSHViIikKY2l0YXRpb24oImVuc2VtYmxkYiIpCmNpdGF0aW9uKCJhbm5vdGFibGVzIikKY2l0YXRpb24oInBhbHMiKQpjaXRhdGlvbigicGF0Y2h3b3JrIikKY2l0YXRpb24oImdncHViciIpCmNpdGF0aW9uKCJzY2FsZXMiKQpjaXRhdGlvbigiZ2dpcmFwaEV4dHJhIikKY2l0YXRpb24oImZsZXh0YWJsZSIpCmNpdGF0aW9uKCJwYWxzIikKY2l0YXRpb24oInBhdGNod29yayIpCmNpdGF0aW9uKCJnZ2lyYXBoIikKY2l0YXRpb24oIm9mZmljZXIiKQpjaXRhdGlvbigibWFncml0dHIiKQoKc2Vzc2lvbkluZm8oKQpgYGAKCioqQ291bnQgTm9ybWFsaXphdGlvbioqCj09PQpSZWFkcyBpbiB0aGUgY291bnRzIGFuZCBtZXRhZGF0YSBmaWxlcyBpbnRvIFIuCmBgYHtyfQpjb3VudHM9cmVhZC50YWJsZShmaWxlPSJQTV9nZW5jb2RlX2ZlYXR1cmVjb3VudHMuUm1hdHJpeC50eHQiLCBoZWFkZXI9VFJVRSkKbWV0YWRhdGFfUEI9cmVhZC5jc3YoZmlsZT0ibWV0YWRhdGFfUEJfdW50cmltbWVkLmNzdiIsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9MSkKbWV0YWRhdGFfUEw9cmVhZC5jc3YoZmlsZT0ibWV0YWRhdGFfUExfdW50cmltbWVkLmNzdiIsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9MSkKbWV0YWRhdGFfUE09cmVhZC5jc3YoZmlsZT0ibWV0YWRhdGFfUE1fdW50cmltbWVkLmNzdiIsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9MSkKbWV0YWRhdGFfUFM9cmVhZC5jc3YoZmlsZT0ibWV0YWRhdGFfUFNfdW50cmltbWVkLmNzdiIsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9MSkKbWV0YWRhdGFfYWxsPXJlYWQuY3N2KGZpbGU9Im1ldGFkYXRhX3VudHJpbW1lZC5jc3YiLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEpCmBgYAoKSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbW92ZSB0aGUgdmVyc2lvbiBudW1iZXJzIGZyb20gdGhlIEVuc2VtYmwgSURzLCB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHJ1bi4gIERlcGVuZGluZyBvbiB0aGUgc2FtcGxlIHNldCwgdGhpcyBtYXkgcmVzdWx0IGluIGR1cGxpY2F0ZSByb3dzLiAgSWYgc28sIHRoZSBkYXRhIHNldCBuZWVkcyB0byBiZSBkZS1kdXBsaWNhdGVkIGFzIHdlbGwuCmBgYHtyfQpjb3VudHMkR2VuZWlkPXJlbW92ZVZlcnNpb24oY291bnRzJEdlbmVpZCkKY291bnRzPXBseXI6OmRkcGx5KGNvdW50cywgIkdlbmVpZCIsIHBseXI6Om51bWNvbHdpc2Uoc3VtKSkgJT4lCiAgcmVtb3ZlX3Jvd25hbWVzICU+JQogIGNvbHVtbl90b19yb3duYW1lcyh2YXI9IkdlbmVpZCIpCmBgYAoKU3Vic2V0cyB0aGUgY291bnRzIG9iamVjdCBiYXNlZCBvbiB0aXNzdWUgdHlwZXMuCmBgYHtyfQpjb3VudHNfUEI9Y291bnRzWyxncmVwbCgiUEJfUk5fQkEiLCBjb2xuYW1lcyhjb3VudHMpKV0KY291bnRzX1BMPWNvdW50c1ssZ3JlcGwoIlBMX1JOX0JBIiwgY29sbmFtZXMoY291bnRzKSldCmNvdW50c19QTT1jb3VudHNbLGdyZXBsKCJQTV9STl9CQSIsIGNvbG5hbWVzKGNvdW50cykpXQpjb3VudHNfUFM9Y291bnRzWyxncmVwbCgiUFNfUk5fQkEiLCBjb2xuYW1lcyhjb3VudHMpKV0KYGBgCgpTZXRzIHRoZSBjb2x1bW4gbmFtZXMgb2YgdGhlIGNvdW50cyBtYXRyaXggdG8gdGhlIHJvdyBuYW1lcyBvZiB0aGUgbWV0YWRhdGEgbWF0cml4IGFuZCB0aGVuIGNvbmZpcm1zIHRoZXkgYXJlIHRoZSBzYW1lLgpgYGB7cn0KIyBQQgpjb2xuYW1lcyhjb3VudHNfUEIpPXJvd25hbWVzKG1ldGFkYXRhX1BCKQphbGwoY29sbmFtZXMoY291bnRzX1BCKSAlaW4lIHJvd25hbWVzKG1ldGFkYXRhX1BCKSkKYWxsKGNvbG5hbWVzKGNvdW50c19QQik9PXJvd25hbWVzKG1ldGFkYXRhX1BCKSkKCiMgUEwKY29sbmFtZXMoY291bnRzX1BMKT1yb3duYW1lcyhtZXRhZGF0YV9QTCkKYWxsKGNvbG5hbWVzKGNvdW50c19QTCkgJWluJSByb3duYW1lcyhtZXRhZGF0YV9QTCkpCmFsbChjb2xuYW1lcyhjb3VudHNfUEwpPT1yb3duYW1lcyhtZXRhZGF0YV9QTCkpCgojIFBNCmNvbG5hbWVzKGNvdW50c19QTSk9cm93bmFtZXMobWV0YWRhdGFfUE0pCmFsbChjb2xuYW1lcyhjb3VudHNfUE0pICVpbiUgcm93bmFtZXMobWV0YWRhdGFfUE0pKQphbGwoY29sbmFtZXMoY291bnRzX1BNKT09cm93bmFtZXMobWV0YWRhdGFfUE0pKQoKIyBQUwpjb2xuYW1lcyhjb3VudHNfUFMpPXJvd25hbWVzKG1ldGFkYXRhX1BTKQphbGwoY29sbmFtZXMoY291bnRzX1BTKSAlaW4lIHJvd25hbWVzKG1ldGFkYXRhX1BTKSkKYWxsKGNvbG5hbWVzKGNvdW50c19QUyk9PXJvd25hbWVzKG1ldGFkYXRhX1BTKSkKYGBgCgpHZW5lcmF0ZXMgdGhlIERFU2VxRGF0YVNldCAoZGRzKSBvYmplY3RzLiBUaGUgZGVzaWduIHBhcmFtZXRlciBtdXN0IGNvcnJlc3BvbmQgd2l0aCB0aGUgY29uZGl0aW9uIGNvbHVtbiBuYW1lIGluIHRoZSBtZXRhZGF0YSBmaWxlLiBUaGlzIGlzIHRoZSB2YXJpYWJsZShzKSBieSB3aGljaCB0aGUgZGlmZmVyZW50aWFsIGFuYWx5c2lzIHdpbGwgYmUgcGVyZm9ybWVkLiBUaGlzIGNvbW1hbmQgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcgdGhhdCBzb21lIHZhcmlhYmxlcyBhcmUgY2hhcmFjdGVyczsgdGhpcyBpcyBub3JtYWwgYW5kIGlzIGV4cGVjdGVkLiAgRW5zdXJlcyB0aGF0IHRoZSByZWZlcmVuY2UgbGV2ZWwgaXMgc2V0IHRvIHRoZSBjb250cm9sIHZhcmlhYmxlLgpgYGB7cn0KIyBQQgpkZHNfUEI9REVTZXFEYXRhU2V0RnJvbU1hdHJpeChjb3VudERhdGE9Y291bnRzX1BCLCBjb2xEYXRhPW1ldGFkYXRhX1BCLCBkZXNpZ249fiBUSEMpCmRkc19QQiRncm91cD1yZWxldmVsKGRkc19QQiRUSEMsIHJlZj0ibmVnYXRpdmUiKQoKIyBQTApkZHNfUEw9REVTZXFEYXRhU2V0RnJvbU1hdHJpeChjb3VudERhdGE9Y291bnRzX1BMLCBjb2xEYXRhPW1ldGFkYXRhX1BMLCBkZXNpZ249fiBUSEMpCmRkc19QTCRncm91cD1yZWxldmVsKGRkc19QTCRUSEMsIHJlZj0ibmVnYXRpdmUiKQoKIyBQTQpkZHNfUE09REVTZXFEYXRhU2V0RnJvbU1hdHJpeChjb3VudERhdGE9Y291bnRzX1BNLCBjb2xEYXRhPW1ldGFkYXRhX1BNLCBkZXNpZ249fiBUSEMpCmRkc19QTSRncm91cD1yZWxldmVsKGRkc19QTSRUSEMsIHJlZj0ibmVnYXRpdmUiKQoKIyBQUwpkZHNfUFM9REVTZXFEYXRhU2V0RnJvbU1hdHJpeChjb3VudERhdGE9Y291bnRzX1BTLCBjb2xEYXRhPW1ldGFkYXRhX1BTLCBkZXNpZ249fiBUSEMpCmRkc19QUyRncm91cD1yZWxldmVsKGRkc19QUyRUSEMsIHJlZj0ibmVnYXRpdmUiKQpgYGAKClBlcmZvcm1zIG5vcm1hbGl6YXRpb24gb24gdGhlIGRkcyBvYmplY3RzIGFuZCB0aGVuIHdyaXRlcyB0aGUgbm9ybWFsaXplZCBjb3VudHMgdG8gYSB0eHQgZmlsZS4KYGBge3J9CiMgUEIKZGRzX1BCPWVzdGltYXRlU2l6ZUZhY3RvcnMoZGRzX1BCKQpzaXplRmFjdG9ycyhkZHNfUEIpCm5vcm1hbGl6ZWRfY291bnRzX1BCPWNvdW50cyhkZHNfUEIsIG5vcm1hbGl6ZWQ9VFJVRSkKd3JpdGUudGFibGUobm9ybWFsaXplZF9jb3VudHNfUEIsIGZpbGU9ImdlbmNvZGVfT3V0cHV0X0ZpbGVzL1BCX25vcm1hbGl6ZWRjb3VudHMudHh0IiwgCiAgICAgICAgICAgIHNlcD0iXHQiLCBxdW90ZT1GQUxTRSwgY29sLm5hbWVzPU5BKQoKIyBQTApkZHNfUEw9ZXN0aW1hdGVTaXplRmFjdG9ycyhkZHNfUEwpCnNpemVGYWN0b3JzKGRkc19QTCkKbm9ybWFsaXplZF9jb3VudHNfUEw9Y291bnRzKGRkc19QTCwgbm9ybWFsaXplZD1UUlVFKQp3cml0ZS50YWJsZShub3JtYWxpemVkX2NvdW50c19QTCwgZmlsZT0iZ2VuY29kZV9PdXRwdXRfRmlsZXMvUExfbm9ybWFsaXplZGNvdW50cy50eHQiLCAKICAgICAgICAgICAgc2VwPSJcdCIsIHF1b3RlPUZBTFNFLCBjb2wubmFtZXM9TkEpCgojIFBNCmRkc19QTT1lc3RpbWF0ZVNpemVGYWN0b3JzKGRkc19QTSkKc2l6ZUZhY3RvcnMoZGRzX1BNKQpub3JtYWxpemVkX2NvdW50c19QTT1jb3VudHMoZGRzX1BNLCBub3JtYWxpemVkPVRSVUUpCndyaXRlLnRhYmxlKG5vcm1hbGl6ZWRfY291bnRzX1BNLCBmaWxlPSJnZW5jb2RlX091dHB1dF9GaWxlcy9QTV9ub3JtYWxpemVkY291bnRzLnR4dCIsIAogICAgICAgICAgICBzZXA9Ilx0IiwgcXVvdGU9RkFMU0UsIGNvbC5uYW1lcz1OQSkKCiMgUFMKZGRzX1BTPWVzdGltYXRlU2l6ZUZhY3RvcnMoZGRzX1BTKQpzaXplRmFjdG9ycyhkZHNfUFMpCm5vcm1hbGl6ZWRfY291bnRzX1BTPWNvdW50cyhkZHNfUFMsIG5vcm1hbGl6ZWQ9VFJVRSkKd3JpdGUudGFibGUobm9ybWFsaXplZF9jb3VudHNfUFMsIGZpbGU9ImdlbmNvZGVfT3V0cHV0X0ZpbGVzL1BTX25vcm1hbGl6ZWRjb3VudHMudHh0IiwgCiAgICAgICAgICAgIHNlcD0iXHQiLCBxdW90ZT1GQUxTRSwgY29sLm5hbWVzPU5BKQpgYGAKCioqUUMgQW5hbHlzaXMqKgo9PT0KVHJhbnNmb3JtcyBjb3VudHMgZm9yIGRhdGEgdmlzdWFsaXphdGlvbi4KYGBge3J9CnJsZF9QQj1ybG9nKGRkc19QQiwgYmxpbmQ9VFJVRSkKcmxkX1BMPXJsb2coZGRzX1BMLCBibGluZD1UUlVFKQpybGRfUE09cmxvZyhkZHNfUE0sIGJsaW5kPVRSVUUpCnJsZF9QUz1ybG9nKGRkc19QUywgYmxpbmQ9VFJVRSkKYGBgCgpQbG90cyB0aGUgUENBLgpgYGB7ciB3YXJuaW5nPUZBTFNFfQojIFBCCnBjYTE9cGxvdFBDQShybGRfUEIsIGludGdyb3VwPWMoIlRIQyIpKSsKICBnZW9tX3BvaW50KGFscGhhPTAuNzUsIGNvbG9yPSJibGFjayIsIHBjaD0yMSwgc2l6ZT0zLCBzaG93LmxlZ2VuZD1UUlVFKSsKICAjIGdncmVwZWw6Omdlb21fdGV4dF9yZXBlbChhZXMobGFiZWw9bmFtZSksIGNvbG9yPSJibGFjayIsIGZvcmNlPTMsIG1pbi5zZWdtZW50Lmxlbmd0aD0wLjUsIGJveC5wYWRkaW5nPTAuNSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgub3ZlcmxhcHM9MTAsIHNob3cubGVnZW5kPUZBTFNFKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobGltaXRzPWMoInBvc2l0aXZlIiwgIm5lZ2F0aXZlIiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJQb3NpdGl2ZSIsICJOZWdhdGl2ZSIpLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YXMudmVjdG9yKHBvbHljaHJvbWUoMikpKSsgIAogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMjUpKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMjUpKSwKICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjEpKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjEpKSwKICAgICAgICB0aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgIHBhbmVsLmJvcmRlcj1lbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIiwgbGluZXdpZHRoPTEsIGZpbGw9TkEpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xKSwKICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiAgICAgICAgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShsaW5ld2lkdGg9MSksCiAgICAgICAgIyBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgICAgICAjIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSkpKwogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF9ibGFuaygpKSsKICBsYWJzKHRpdGxlPSJQb3N0bW9ydGVtIEJyYWluIiwgY29sb3I9IlRIQyIpICAKCiMgUEwKcGNhMj1wbG90UENBKHJsZF9QTCwgaW50Z3JvdXA9YygiVEhDIikpKwogIGdlb21fcG9pbnQoYWxwaGE9MC43NSwgY29sb3I9ImJsYWNrIiwgcGNoPTIxLCBzaXplPTMsIHNob3cubGVnZW5kPVRSVUUpKwogICMgZ2dyZXBlbDo6Z2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbD1uYW1lKSwgY29sb3I9ImJsYWNrIiwgZm9yY2U9MywgbWluLnNlZ21lbnQubGVuZ3RoPTAuNSwgYm94LnBhZGRpbmc9MC41LAogICMgICAgICAgICAgICAgICAgICAgICAgICAgIG1heC5vdmVybGFwcz0xMCwgc2hvdy5sZWdlbmQ9RkFMU0UpKwogIHNjYWxlX2NvbG9yX21hbnVhbChsaW1pdHM9YygicG9zaXRpdmUiLCAibmVnYXRpdmUiKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIlBvc2l0aXZlIiwgIk5lZ2F0aXZlIiksCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1hcy52ZWN0b3IocG9seWNocm9tZSgyKSkpKyAgCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMS4yNSkpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMS4yNSkpLAogICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMSkpLAogICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMSkpLAogICAgICAgIHRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSwgZmlsbD1OQSksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIiwgbGluZXdpZHRoPTEpLAogICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9saW5lKGxpbmV3aWR0aD0xKSwKICAgICAgICAjIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAogICAgICAgICMgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSkrCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X2JsYW5rKCkpKwogIGxhYnModGl0bGU9IlBvc3Rtb3J0ZW0gTHVuZyIsIGNvbG9yPSJUSEMiKSAgCgojIFBNCnBjYTM9cGxvdFBDQShybGRfUE0sIGludGdyb3VwPWMoIlRIQyIpKSsKICBnZW9tX3BvaW50KGFscGhhPTAuNzUsIGNvbG9yPSJibGFjayIsIHBjaD0yMSwgc2l6ZT0zLCBzaG93LmxlZ2VuZD1UUlVFKSsKICAjIGdncmVwZWw6Omdlb21fdGV4dF9yZXBlbChhZXMobGFiZWw9bmFtZSksIGNvbG9yPSJibGFjayIsIGZvcmNlPTMsIG1pbi5zZWdtZW50Lmxlbmd0aD0wLjUsIGJveC5wYWRkaW5nPTAuNSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgub3ZlcmxhcHM9MTAsIHNob3cubGVnZW5kPUZBTFNFKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobGltaXRzPWMoInBvc2l0aXZlIiwgIm5lZ2F0aXZlIiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJQb3NpdGl2ZSIsICJOZWdhdGl2ZSIpLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YXMudmVjdG9yKHBvbHljaHJvbWUoMikpKSsgIAogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMjUpKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMjUpKSwKICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjEpKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjEpKSwKICAgICAgICB0aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgIHBhbmVsLmJvcmRlcj1lbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIiwgbGluZXdpZHRoPTEsIGZpbGw9TkEpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xKSwKICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiAgICAgICAgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShsaW5ld2lkdGg9MSksCiAgICAgICAgIyBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgICAgICAjIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSkpKwogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF9ibGFuaygpKSsKICBsYWJzKHRpdGxlPSJQb3N0bW9ydGVtIE11c2NsZSIsIGNvbG9yPSJUSEMiKSAgCgojIFBTCnBjYTQ9cGxvdFBDQShybGRfUFMsIGludGdyb3VwPWMoIlRIQyIpKSsKICBnZW9tX3BvaW50KGFscGhhPTAuNzUsIGNvbG9yPSJibGFjayIsIHBjaD0yMSwgc2l6ZT0zLCBzaG93LmxlZ2VuZD1UUlVFKSsKICAjIGdncmVwZWw6Omdlb21fdGV4dF9yZXBlbChhZXMobGFiZWw9bmFtZSksIGNvbG9yPSJibGFjayIsIGZvcmNlPTMsIG1pbi5zZWdtZW50Lmxlbmd0aD0wLjUsIGJveC5wYWRkaW5nPTAuNSwKICAjICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgub3ZlcmxhcHM9MTAsIHNob3cubGVnZW5kPUZBTFNFKSsKICBzY2FsZV9jb2xvcl9tYW51YWwobGltaXRzPWMoInBvc2l0aXZlIiwgIm5lZ2F0aXZlIiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJQb3NpdGl2ZSIsICJOZWdhdGl2ZSIpLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YXMudmVjdG9yKHBvbHljaHJvbWUoMikpKSsgIAogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMjUpKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMjUpKSwKICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjEpKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjEpKSwKICAgICAgICB0aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgIHBhbmVsLmJvcmRlcj1lbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIiwgbGluZXdpZHRoPTEsIGZpbGw9TkEpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xKSwKICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiAgICAgICAgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShsaW5ld2lkdGg9MSksCiAgICAgICAgIyBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIiwKICAgICAgICAjIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSkpKwogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF9ibGFuaygpKSsKICBsYWJzKHRpdGxlPSJQb3N0bW9ydGVtIEJsb29kIiwgY29sb3I9IlRIQyIpICAKYGBgCgpDcmVhdGluZyBmaWd1cmVzIG9mIHRoZSBQQ0FzLgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpwY2FfcGF0Y2h3b3JrPShwY2ExICsgcGNhMiArIHBjYTMgKyBwY2E0ICsgcGxvdF9sYXlvdXQobmNvbD0yLCBndWlkZXM9ImNvbGxlY3QiKSAmIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikpCnBjYV9wYXRjaHdvcmsgKyBwbG90X2Fubm90YXRpb24odGFnX2xldmVscz0iQSIpIApnZ3NhdmUoIlBNX3BjYV9wbG90cy5wbmciLCB3aWR0aD03LCBoZWlnaHQ9OC4zNiwgdW5pdD0iaW4iLCBkcGk9MzIwKQpgYGAKCkV4dHJhY3RzIHRoZSBybG9nIG1hdHJpeCBmcm9tIHJsZCwgY29tcHV0ZXMgcGFpcndpc2UgY29ycmVsYXRpb24gdmFsdWVzIGZvciB0aGUgc2FtcGxlcyBhbmQgdGhlbiBjaGVja3MgaXRzIG91dHB1dHMsIGFuZCB0aGVuIHBsb3RzIHRoZSBoZWF0bWFwcy4KYGBge3J9CiMgUEIKcmxkX21hdF9QQj1hc3NheShybGRfUEIpCnJsZF9jb3JfUEI9Y29yKHJsZF9tYXRfUEIpCmhlYWQocmxkX2Nvcl9QQikKcGhlYXRtYXAocmxkX2Nvcl9QQiwKICAgICAgICAgIyBjb2xvcj1jb2xvclJhbXBQYWxldHRlKGMoIiIsICIiLCAiIikpKDIwMCksICAjIyBUaGUgY29sb3IgcGFsZXR0ZS4KICAgICAgICAgZGlzcGxheV9udW1iZXJzPW1hdHJpeChpZmVsc2UocmxkX2Nvcl9QQj4wLjk5OTk1LCAiKiIsICIiKSwgbnJvdyhybGRfY29yX1BCKSksIGZvbnRzaXplX3Jvdz01KQoKIyBQTApybGRfbWF0X1BMPWFzc2F5KHJsZF9QTCkKcmxkX2Nvcl9QTD1jb3IocmxkX21hdF9QTCkKaGVhZChybGRfY29yX1BMKQpwaGVhdG1hcChybGRfY29yX1BMLAogICAgICAgICAjIGNvbG9yPWNvbG9yUmFtcFBhbGV0dGUoYygiIiwgIiIsICIiKSkoMjAwKSwgICMjIFRoZSBjb2xvciBwYWxldHRlLgogICAgICAgICBkaXNwbGF5X251bWJlcnM9bWF0cml4KGlmZWxzZShybGRfY29yX1BMPjAuOTk5OTUsICIqIiwgIiIpLCBucm93KHJsZF9jb3JfUEwpKSwgZm9udHNpemVfcm93PTUpCgojIFBNCnJsZF9tYXRfUE09YXNzYXkocmxkX1BNKQpybGRfY29yX1BNPWNvcihybGRfbWF0X1BNKQpoZWFkKHJsZF9jb3JfUE0pCnBoZWF0bWFwKHJsZF9jb3JfUE0sCiAgICAgICAgICMgY29sb3I9Y29sb3JSYW1wUGFsZXR0ZShjKCIiLCAiIiwgIiIpKSgyMDApLCAgIyMgVGhlIGNvbG9yIHBhbGV0dGUuCiAgICAgICAgIGRpc3BsYXlfbnVtYmVycz1tYXRyaXgoaWZlbHNlKHJsZF9jb3JfUE0+MC45OTk5NSwgIioiLCAiIiksIG5yb3cocmxkX2Nvcl9QTSkpLCBmb250c2l6ZV9yb3c9NSkKCiMgUFMKcmxkX21hdF9QUz1hc3NheShybGRfUFMpCnJsZF9jb3JfUFM9Y29yKHJsZF9tYXRfUFMpCmhlYWQocmxkX2Nvcl9QUykKcGhlYXRtYXAocmxkX2Nvcl9QUywKICAgICAgICAgIyBjb2xvcj1jb2xvclJhbXBQYWxldHRlKGMoIiIsICIiLCAiIikpKDIwMCksICAjIyBUaGUgY29sb3IgcGFsZXR0ZS4KICAgICAgICAgZGlzcGxheV9udW1iZXJzPW1hdHJpeChpZmVsc2UocmxkX2Nvcl9QUz4wLjk5OTk1LCAiKiIsICIiKSwgbnJvdyhybGRfY29yX1BTKSksIGZvbnRzaXplX3Jvdz01KQpgYGAKCioqREVTZXEyIEFuYWx5c2lzKioKPT09ClBlcmZvcm1zIHRoZSBERVNlcTIgYW5hbHlzaXMuCmBgYHtyfQpkZHNfUEI9REVTZXEoZGRzX1BCKQpkZHNfUEw9REVTZXEoZGRzX1BMKQpkZHNfUE09REVTZXEoZGRzX1BNKQpkZHNfUFM9REVTZXEoZGRzX1BTKQpgYGAKClN0ZXAtYnktc3RlcCBicmVha2Rvd24gdG8gdGhlIERFU2VxMiBhbmFseXNpczoKU3RlcCAxOiBlc3RpbWF0ZSBzaXplIGZhY3RvcnMgKGNoZWNrIHNpemUgZmFjdG9ycywgdG90YWwgbnVtYmVyIG9mIHJhdyBjb3VudHMgcGVyIHNhbXBsZSwgdG90YWwgbnVtYmVyIG9mIG5vcm1hbGl6ZWQgY291bnRzIHBlciBzYW1wbGUpCmBgYHtyfQojIFBCCnNpemVGYWN0b3JzKGRkc19QQikKY29sU3Vtcyhjb3VudHMoZGRzX1BCKSkKY29sU3Vtcyhjb3VudHMoZGRzX1BCLCBub3JtYWxpemVkPVRSVUUpKQoKIyBQTApzaXplRmFjdG9ycyhkZHNfUEwpCmNvbFN1bXMoY291bnRzKGRkc19QTCkpCmNvbFN1bXMoY291bnRzKGRkc19QTCwgbm9ybWFsaXplZD1UUlVFKSkKCiMgUE0Kc2l6ZUZhY3RvcnMoZGRzX1BNKQpjb2xTdW1zKGNvdW50cyhkZHNfUE0pKQpjb2xTdW1zKGNvdW50cyhkZHNfUE0sIG5vcm1hbGl6ZWQ9VFJVRSkpCgojIFBTCnNpemVGYWN0b3JzKGRkc19QUykKY29sU3Vtcyhjb3VudHMoZGRzX1BTKSkKY29sU3Vtcyhjb3VudHMoZGRzX1BTLCBub3JtYWxpemVkPVRSVUUpKQpgYGAKClRoZSBmb2xsb3dpbmcgaXMgcXVvdGVkIGRpcmVjdGx5IGZyb20gPGh0dHBzOi8vZ2l0aHViLmNvbS9oYmN0cmFpbmluZy9ER0Vfd29ya3Nob3AvdHJlZS9tYXN0ZXIvbGVzc29ucz4uCgpTdGVwIDI6IGVzdGltYXRlIGdlbmUtd2lkZSBkaXNwZXJzaW9uLiBUaGUgREVTZXEyIGRpc3BlcnNpb24gZXN0aW1hdGVzIGFyZSBpbnZlcnNlbHkgcmVsYXRlZCB0byB0aGUgbWVhbiBhbmQgZGlyZWN0bHkgcmVsYXRlZCB0byB2YXJpYW5jZS4gQmFzZWQgb24gdGhpcyByZWxhdGlvbnNoaXAsIHRoZSBkaXNwZXJzaW9uIGlzIGhpZ2hlciBmb3Igc21hbGwgbWVhbiBjb3VudHMgYW5kIGxvd2VyIGZvciBsYXJnZSBtZWFuIGNvdW50cy4gVGhlcmVmb3JlLCB0aGUgZGlzcGVyc2lvbiBlc3RpbWF0ZXMgcmVmbGVjdCB0aGUgdmFyaWFuY2UgaW4gZ2VuZSBleHByZXNzaW9uIGZvciBhIGdpdmVuIG1lYW4gdmFsdWUuIEZvciBsb3cgbWVhbiBjb3VudHMsIHRoZSB2YXJpYW5jZSBlc3RpbWF0ZXMgaGF2ZSBhIG11Y2ggbGFyZ2VyIHNwcmVhZDsgdGhlcmVmb3JlLCB0aGUgZGlzcGVyc2lvbiBlc3RpbWF0ZXMgd2lsbCBkaWZmZXIgbXVjaCBtb3JlIGJldHdlZW4gZ2VuZXMgd2l0aCBzbWFsbCBtZWFucy4gV2l0aCBvbmx5IGEgZmV3ICgzLTYpIHJlcGxpY2F0ZXMgcGVyIGdyb3VwLCB0aGUgZXN0aW1hdGVzIG9mIHZhcmlhdGlvbiBmb3IgZWFjaCBnZW5lIGFyZSBvZnRlbiB1bnJlbGlhYmxlIChkdWUgdG8gdGhlIGxhcmdlIGRpZmZlcmVuY2VzIGluIGRpc3BlcnNpb24gZm9yIGdlbmVzIHdpdGggc2ltaWxhciBtZWFucykuIFRvIGFkZHJlc3MgdGhpcyBwcm9ibGVtLCBERVNlcTIgc2hhcmVzIGluZm9ybWF0aW9uIGFjcm9zcyBnZW5lcyB0byBnZW5lcmF0ZSBtb3JlIGFjY3VyYXRlIGVzdGltYXRlcyBvZiB2YXJpYXRpb24gYmFzZWQgb24gdGhlIG1lYW4gZXhwcmVzc2lvbiBsZXZlbCBvZiB0aGUgZ2VuZSB1c2luZyBhIG1ldGhvZCBjYWxsZWQgJ3Nocmlua2FnZScuIERFU2VxMiBhc3N1bWVzIHRoYXQgZ2VuZXMgd2l0aCBzaW1pbGFyIGV4cHJlc3Npb24gbGV2ZWxzIGhhdmUgc2ltaWxhciBkaXNwZXJzaW9uLgoKU3RlcCAzOiBmaXQgY3VydmUgdG8gZ2VuZS13aXNlIGRpc3BlcnNpb24gZXN0aW1hdGVzLiBUaGlzIGN1cnZlIGlzIGRpc3BsYXllZCBhcyBhIHJlZCBsaW5lIGluIHRoZSBmaWd1cmUgYmVsb3csIHdoaWNoIHBsb3RzIHRoZSBlc3RpbWF0ZSBmb3IgdGhlIGV4cGVjdGVkIGRpc3BlcnNpb24gdmFsdWUgZm9yIGdlbmVzIG9mIGEgZ2l2ZW4gZXhwcmVzc2lvbiBzdHJlbmd0aC4gRWFjaCBibGFjayBkb3QgaXMgYSBnZW5lIHdpdGggYW4gYXNzb2NpYXRlZCBtZWFuIGV4cHJlc3Npb24gbGV2ZWwgYW5kIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0aW9uIChNTEUpIG9mIHRoZSBkaXNwZXJzaW9uIChTdGVwIDEpLgoKU3RlcCA0OiBzaHJpbmsgZ2VuZS13aXNlIGRpc3BlcnNpb24gZXN0aW1hdGVzIHRvd2FyZCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUgY3VydmUuIFRoaXMgc2hyaW5rYWdlIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHRvIHJlZHVjZSBmYWxzZSBwb3NpdGl2ZXMgaW4gdGhlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzLiBHZW5lcyB3aXRoIGxvdyBkaXNwZXJzaW9uIGVzdGltYXRlcyBhcmUgc2hydW5rZW4gdG93YXJkcyB0aGUgY3VydmUsIGFuZCB0aGUgbW9yZSBhY2N1cmF0ZSwgaGlnaGVyIHNocnVua2VuIHZhbHVlcyBhcmUgb3V0cHV0IGZvciBmaXR0aW5nIG9mIHRoZSBtb2RlbCBhbmQgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gdGVzdGluZy4gRGlzcGVyc2lvbiBlc3RpbWF0ZXMgdGhhdCBhcmUgc2xpZ2h0bHkgYWJvdmUgdGhlIGN1cnZlIGFyZSBhbHNvIHNocnVuayB0b3dhcmQgdGhlIGN1cnZlIGZvciBiZXR0ZXIgZGlzcGVyc2lvbiBlc3RpbWF0aW9uOyBob3dldmVyLCBnZW5lcyB3aXRoIGV4dHJlbWVseSBoaWdoIGRpc3BlcnNpb24gdmFsdWVzIGFyZSBub3QuIFRoaXMgaXMgZHVlIHRvIHRoZSBsaWtlbGlob29kIHRoYXQgdGhlIGdlbmUgZG9lcyBub3QgZm9sbG93IHRoZSBtb2RlbGluZyBhc3N1bXB0aW9ucyBhbmQgaGFzIGhpZ2hlciB2YXJpYWJpbGl0eSB0aGFuIG90aGVycyBmb3IgYmlvbG9naWNhbCBvciB0ZWNobmljYWwgcmVhc29ucy4gU2hyaW5raW5nIHRoZSB2YWx1ZXMgdG93YXJkIHRoZSBjdXJ2ZSBjb3VsZCByZXN1bHQgaW4gZmFsc2UgcG9zaXRpdmVzLCBzbyB0aGVzZSB2YWx1ZXMgYXJlIG5vdCBzaHJ1bmtlbi4KClBsb3QgZGlzcGVyc2lvbiBlc3RpbWF0ZXMuCmBgYHtyfQpwbG90RGlzcEVzdHMoZGRzX1BCKQpwbG90RGlzcEVzdHMoZGRzX1BMKQpwbG90RGlzcEVzdHMoZGRzX1BNKQpwbG90RGlzcEVzdHMoZGRzX1BTKQpgYGAKClNocnVua2VuIGxvZzIgZm9sZGNoYW5nZXMgKExGQykuCgpOT1RFOiBTaHJpbmtpbmcgdGhlIGxvZzIgZm9sZCBjaGFuZ2VzIHdpbGwgbm90IGNoYW5nZSB0aGUgdG90YWwgbnVtYmVyIG9mIGdlbmVzIHRoYXQgYXJlIGlkZW50aWZpZWQgYXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQuIFRoZSBzaHJpbmthZ2Ugb2YgZm9sZCBjaGFuZ2UgaXMgdG8gaGVscCB3aXRoIGRvd25zdHJlYW0gYXNzZXNzbWVudCBvZiByZXN1bHRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBzdWJzZXQgeW91ciBzaWduaWZpY2FudCBnZW5lcyBiYXNlZCBvbiBmb2xkIGNoYW5nZSBmb3IgZnVydGhlciBldmFsdWF0aW9uLCB5b3UgbWF5IHdhbnQgdG8gdXNlIHNocnVua2VuIHZhbHVlcy4gQWRkaXRpb25hbGx5LCBmb3IgZnVuY3Rpb25hbCBhbmFseXNpcyB0b29scyBzdWNoIGFzIEdTRUEgd2hpY2ggcmVxdWlyZSBmb2xkIGNoYW5nZSB2YWx1ZXMgYXMgaW5wdXQgeW91IHdvdWxkIHdhbnQgdG8gcHJvdmlkZSBzaHJ1bmtlbiB2YWx1ZXMuIEluIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9ucyBvZiBERVNlcTIsIHRoZSBzaHJpbmthZ2Ugb2YgTEZDIGVzdGltYXRlcyBpcyBub3QgcGVyZm9ybWVkIGJ5IGRlZmF1bHQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbG9nMiBmb2xkY2hhbmdlcyB3b3VsZCBiZSB0aGUgc2FtZSBhcyB0aG9zZSBjYWxjdWxhdGVkIGJ5OiBsb2cyKG5vcm1hbGl6ZWRfY291bnRzX2dyb3VwMSAvIG5vcm1hbGl6ZWRfY291bnRzX2dyb3VwMikKCkxpc3RzIGFsbCB0aGUgY29lZmZpY2llbnQgbmFtZXMgZm9yIGFwZWdsbSBMRkMgc2hyaW5rYWdlLgpgYGB7cn0KcmVzdWx0c05hbWVzKGRkc19QQikKcmVzdWx0c05hbWVzKGRkc19QTCkKcmVzdWx0c05hbWVzKGRkc19QTSkKcmVzdWx0c05hbWVzKGRkc19QUykKYGBgCgpCdWlsZHMgcmVzdWx0cyB0YWJsZXMgZm9yIHRoZSB1bnNocnVua2VuIExGQyBhbmQgYXBlZ2xtIExGQyBzaHJpbmthZ2UuCmBgYHtyfQpjb250cmFzdD1jKCJUSEMiLCAicG9zaXRpdmUiLCAibmVnYXRpdmUiKQoKIyBQQgpyZXNfdGFibGVfdW5zaHJ1bmtlbl9QQj1yZXN1bHRzKGRkc19QQiwgY29udHJhc3Q9Y29udHJhc3QsIGFscGhhPTAuMSkKcmVzX3RhYmxlX2FwZWdsbV9QQj1sZmNTaHJpbmsoZGRzX1BCLCBjb2VmPSJUSENfcG9zaXRpdmVfdnNfbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXM9cmVzX3RhYmxlX3Vuc2hydW5rZW5fUEIsIHR5cGU9ImFwZWdsbSIpCgojIFBMCnJlc190YWJsZV91bnNocnVua2VuX1BMPXJlc3VsdHMoZGRzX1BMLCBjb250cmFzdD1jb250cmFzdCwgYWxwaGE9MC4xKQpyZXNfdGFibGVfYXBlZ2xtX1BMPWxmY1NocmluayhkZHNfUEwsIGNvZWY9IlRIQ19wb3NpdGl2ZV92c19uZWdhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcz1yZXNfdGFibGVfdW5zaHJ1bmtlbl9QTCwgdHlwZT0iYXBlZ2xtIikKCiMgUE0KcmVzX3RhYmxlX3Vuc2hydW5rZW5fUE09cmVzdWx0cyhkZHNfUE0sIGNvbnRyYXN0PWNvbnRyYXN0LCBhbHBoYT0wLjEpCnJlc190YWJsZV9hcGVnbG1fUE09bGZjU2hyaW5rKGRkc19QTSwgY29lZj0iVEhDX3Bvc2l0aXZlX3ZzX25lZ2F0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzPXJlc190YWJsZV91bnNocnVua2VuX1BNLCB0eXBlPSJhcGVnbG0iKQoKIyBQUwpyZXNfdGFibGVfdW5zaHJ1bmtlbl9QUz1yZXN1bHRzKGRkc19QUywgY29udHJhc3Q9Y29udHJhc3QsIGFscGhhPTAuMSkKcmVzX3RhYmxlX2FwZWdsbV9QUz1sZmNTaHJpbmsoZGRzX1BTLCBjb2VmPSJUSENfcG9zaXRpdmVfdnNfbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZXM9cmVzX3RhYmxlX3Vuc2hydW5rZW5fUFMsIHR5cGU9ImFwZWdsbSIpCmBgYAoKQ3JlYXRlcyB0aGUgTUEgcGxvdCBmb3IgdGhlIGFwZWdsbSByZXN1bHRzIHRhYmxlcy4KYGBge3Igd2FybmluZz1GQUxTRX0Kb3B0aW9ucyhnZ3JlcGVsLm1heC5vdmVybGFwcz1JbmYpCgojIFBCCiMgZ2dtYXBsb3QocmVzX3RhYmxlX3Vuc2hydW5rZW5fUEIsIG1haW49ZXhwcmVzc2lvbigicG9zaXRpdmUiICUtPiUgIm5lZ2F0aXZlIiksCiMgICAgICAgICAgZmRyPTAuMDUsIGZjPTEuNSwgc2l6ZT0wLjQsCiMgICAgICAgICAgZ2VuZW5hbWVzPWFzLnZlY3RvcihyZXNfdGFibGVfdW5zaHJ1bmtlbl9QQiRyb3duYW1lcyksCiMgICAgICAgICAgbGVnZW5kPSJ0b3AiLCB0b3A9MTAsIHNlbGVjdC50b3AubWV0aG9kPSJwYWRqIiwKIyAgICAgICAgICBmb250LmxhYmVsPWMoImJvbGQiLCAxMSksIGxhYmVsLnJlY3RhbmdsZT1UUlVFLAojICAgICAgICAgIGZvbnQubGVnZW5kPSJib2xkIiwKIyAgICAgICAgICBmb250Lm1haW49ImJvbGQiLAojICAgICAgICAgIGdndGhlbWU9Z2dwbG90Mjo6dGhlbWVfbWluaW1hbCgpKQptYXBsb3QxPWdnbWFwbG90KHJlc190YWJsZV9hcGVnbG1fUEIsIAogICAgICAgICAjIG1haW49ZXhwcmVzc2lvbigicG9zaXRpdmUiICUtPiUgIm5lZ2F0aXZlIiksCiAgICAgICAgIG1haW49IkJyYWluLCBUSEMgUG9zaXRpdmUgdnMgTmVnYXRpdmUiLAogICAgICAgICBmZHI9MC4xLCBmYz0xLjUsIHNpemU9MC40LAogICAgICAgICBsZWdlbmQ9InRvcCIsIHNlbGVjdC50b3AubWV0aG9kPSJwYWRqIiwKICAgICAgICAgdG9wPTAsCiAgICAgICAgICMgZm9udC5sYWJlbD1jKCJib2xkIiwgOCksIGxhYmVsLnJlY3RhbmdsZT1UUlVFLAogICAgICAgICAjIGZvbnQubGVnZW5kPSJib2xkIiwKICAgICAgICAgZm9udC5tYWluPWMoImJvbGQiLCAxMCksCiAgICAgICAgIGdndGhlbWU9Z2dwbG90Mjo6dGhlbWVfbWluaW1hbCgpKQoKIyBQTAojIGdnbWFwbG90KHJlc190YWJsZV91bnNocnVua2VuX1BMLCBtYWluPWV4cHJlc3Npb24oInBvc2l0aXZlIiAlLT4lICJuZWdhdGl2ZSIpLAojICAgICAgICAgIGZkcj0wLjA1LCBmYz0xLjUsIHNpemU9MC40LAojICAgICAgICAgIGdlbmVuYW1lcz1hcy52ZWN0b3IocmVzX3RhYmxlX3Vuc2hydW5rZW5fUEwkcm93bmFtZXMpLAojICAgICAgICAgIGxlZ2VuZD0idG9wIiwgdG9wPTEwLCBzZWxlY3QudG9wLm1ldGhvZD0icGFkaiIsCiMgICAgICAgICAgZm9udC5sYWJlbD1jKCJib2xkIiwgMTEpLCBsYWJlbC5yZWN0YW5nbGU9VFJVRSwKIyAgICAgICAgICBmb250LmxlZ2VuZD0iYm9sZCIsCiMgICAgICAgICAgZm9udC5tYWluPSJib2xkIiwKIyAgICAgICAgICBnZ3RoZW1lPWdncGxvdDI6OnRoZW1lX21pbmltYWwoKSkKbWFwbG90Mj1nZ21hcGxvdChyZXNfdGFibGVfYXBlZ2xtX1BMLCAKICAgICAgICAgIyBtYWluPWV4cHJlc3Npb24oInBvc2l0aXZlIiAlLT4lICJuZWdhdGl2ZSIpLAogICAgICAgICBtYWluPSJMdW5nLCBUSEMgUG9zaXRpdmUgdnMgTmVnYXRpdmUiLAogICAgICAgICBmZHI9MC4xLCBmYz0xLjUsIHNpemU9MC40LAogICAgICAgICAjIGdlbmVuYW1lcz1hcy52ZWN0b3IocmVzX3RhYmxlX2FwZWdsbV9QTCRyb3duYW1lcyksCiAgICAgICAgIGxlZ2VuZD0idG9wIiwgc2VsZWN0LnRvcC5tZXRob2Q9InBhZGoiLAogICAgICAgICB0b3A9MCwKICAgICAgICAgIyBmb250LmxhYmVsPWMoImJvbGQiLCA4KSwgbGFiZWwucmVjdGFuZ2xlPVRSVUUsCiAgICAgICAgICMgZm9udC5sZWdlbmQ9ImJvbGQiLAogICAgICAgICBmb250Lm1haW49YygiYm9sZCIsIDEwKSwKICAgICAgICAgZ2d0aGVtZT1nZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkpCgoKIyBQTQojIGdnbWFwbG90KHJlc190YWJsZV91bnNocnVua2VuX1BNLCBtYWluPWV4cHJlc3Npb24oInBvc2l0aXZlIiAlLT4lICJuZWdhdGl2ZSIpLAojICAgICAgICAgIGZkcj0wLjA1LCBmYz0xLjUsIHNpemU9MC40LAojICAgICAgICAgIGdlbmVuYW1lcz1hcy52ZWN0b3IocmVzX3RhYmxlX3Vuc2hydW5rZW5fUE0kcm93bmFtZXMpLAojICAgICAgICAgIGxlZ2VuZD0idG9wIiwgdG9wPTEwLCBzZWxlY3QudG9wLm1ldGhvZD0icGFkaiIsCiMgICAgICAgICAgZm9udC5sYWJlbD1jKCJib2xkIiwgMTEpLCBsYWJlbC5yZWN0YW5nbGU9VFJVRSwKIyAgICAgICAgICBmb250LmxlZ2VuZD0iYm9sZCIsCiMgICAgICAgICAgZm9udC5tYWluPSJib2xkIiwKIyAgICAgICAgICBnZ3RoZW1lPWdncGxvdDI6OnRoZW1lX21pbmltYWwoKSkKbWFwbG90Mz1nZ21hcGxvdChyZXNfdGFibGVfYXBlZ2xtX1BNLCAKICAgICAgICAgIyBtYWluPWV4cHJlc3Npb24oInBvc2l0aXZlIiAlLT4lICJuZWdhdGl2ZSIpLAogICAgICAgICBtYWluPSJNdXNjbGUsIFRIQyBQb3NpdGl2ZSB2cyBOZWdhdGl2ZSIsCiAgICAgICAgIGZkcj0wLjEsIGZjPTEuNSwgc2l6ZT0wLjQsCiAgICAgICAgICMgZ2VuZW5hbWVzPWFzLnZlY3RvcihyZXNfdGFibGVfYXBlZ2xtX1BNJHJvd25hbWVzKSwKICAgICAgICAgbGVnZW5kPSJ0b3AiLCBzZWxlY3QudG9wLm1ldGhvZD0icGFkaiIsCiAgICAgICAgIHRvcD0wLAogICAgICAgICAjIGZvbnQubGFiZWw9YygiYm9sZCIsIDgpLCBsYWJlbC5yZWN0YW5nbGU9VFJVRSwKICAgICAgICAgIyBmb250LmxlZ2VuZD0iYm9sZCIsCiAgICAgICAgIGZvbnQubWFpbj1jKCJib2xkIiwgMTApLAogICAgICAgICBnZ3RoZW1lPWdncGxvdDI6OnRoZW1lX21pbmltYWwoKSkKCgojIFBTCiMgZ2dtYXBsb3QocmVzX3RhYmxlX3Vuc2hydW5rZW5fUFMsIG1haW49ZXhwcmVzc2lvbigicG9zaXRpdmUiICUtPiUgIm5lZ2F0aXZlIiksCiMgICAgICAgICAgZmRyPTAuMDUsIGZjPTEuNSwgc2l6ZT0wLjQsCiMgICAgICAgICAgZ2VuZW5hbWVzPWFzLnZlY3RvcihyZXNfdGFibGVfdW5zaHJ1bmtlbl9QUyRyb3duYW1lcyksCiMgICAgICAgICAgbGVnZW5kPSJ0b3AiLCB0b3A9MTAsIHNlbGVjdC50b3AubWV0aG9kPSJwYWRqIiwKIyAgICAgICAgICBmb250LmxhYmVsPWMoImJvbGQiLCAxMSksIGxhYmVsLnJlY3RhbmdsZT1UUlVFLAojICAgICAgICAgIGZvbnQubGVnZW5kPSJib2xkIiwKIyAgICAgICAgICBmb250Lm1haW49ImJvbGQiLAojICAgICAgICAgIGdndGhlbWU9Z2dwbG90Mjo6dGhlbWVfbWluaW1hbCgpKQptYXBsb3Q0PWdnbWFwbG90KHJlc190YWJsZV9hcGVnbG1fUFMsIAogICAgICAgICAjIG1haW49ZXhwcmVzc2lvbigicG9zaXRpdmUiICUtPiUgIm5lZ2F0aXZlIiksCiAgICAgICAgIG1haW49IkJsb29kLCBUSEMgUG9zaXRpdmUgdnMgTmVnYXRpdmUiLAogICAgICAgICBmZHI9MC4xLCBmYz0xLjUsIHNpemU9MC40LAogICAgICAgICAjIGdlbmVuYW1lcz1hcy52ZWN0b3IocmVzX3RhYmxlX2FwZWdsbV9QUyRyb3duYW1lcyksCiAgICAgICAgIGxlZ2VuZD0idG9wIiwgc2VsZWN0LnRvcC5tZXRob2Q9InBhZGoiLAogICAgICAgICB0b3A9MCwKICAgICAgICAgIyBmb250LmxhYmVsPWMoImJvbGQiLCA4KSwgbGFiZWwucmVjdGFuZ2xlPVRSVUUsCiAgICAgICAgICMgZm9udC5sZWdlbmQ9ImJvbGQiLAogICAgICAgICBmb250Lm1haW49YygiYm9sZCIsIDEwKSwKICAgICAgICAgZ2d0aGVtZT1nZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkpCgpgYGAKCkNyZWF0aW5nIGEgZmlndXJlIG9mIGFsbCBUSEMgTUEgcGxvdHMuCmBgYHtyIHdhcm5pbmc9RkFMU0V9Cm1hX1RIQ19wYXRjaHdvcms9bWFwbG90MSArIG1hcGxvdDIgKyBtYXBsb3QzICsgbWFwbG90NCArIHBsb3RfbGF5b3V0KG5jb2w9MikKbWFfVEhDX3BhdGNod29yayArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzPSJBIikKZ2dzYXZlKCJQTV9tYV9USENfcGxvdHMucG5nIiwgd2lkdGg9NywgaGVpZ2h0PTEwLCB1bml0PSJpbiIsIGRwaT0zMjApCmBgYAoKUmVuYW1lcyB0aGUgcmVzdWx0cyB0YWJsZTsgZG93bnN0cmVhbSBhbmFseXNpcyB3aWxsIGJlIHVzaW5nIHRoZSBhcGVnbG0gc2hydW5rZW4gTEZDIHZhbHVlcy4KYGBge3J9CnJlc190YWJsZV9QQj1yZXNfdGFibGVfYXBlZ2xtX1BCCnJlc190YWJsZV9QTD1yZXNfdGFibGVfYXBlZ2xtX1BMCnJlc190YWJsZV9QTT1yZXNfdGFibGVfYXBlZ2xtX1BNCnJlc190YWJsZV9QUz1yZXNfdGFibGVfYXBlZ2xtX1BTCmBgYAoKUmVzdWx0cyBleHBsb3JhdGlvbi4KYGBge3J9CiMgUEIKY2xhc3MocmVzX3RhYmxlX1BCKQptY29scyhyZXNfdGFibGVfUEIsIHVzZS5uYW1lcz1UUlVFKQpyZXNfdGFibGVfUEIgJT4lIGRhdGEuZnJhbWUoKQoKIyBQTApjbGFzcyhyZXNfdGFibGVfUEwpCm1jb2xzKHJlc190YWJsZV9QTCwgdXNlLm5hbWVzPVRSVUUpCnJlc190YWJsZV9QTCAlPiUgZGF0YS5mcmFtZSgpCgojIFBNCmNsYXNzKHJlc190YWJsZV9QTSkKbWNvbHMocmVzX3RhYmxlX1BNLCB1c2UubmFtZXM9VFJVRSkKcmVzX3RhYmxlX1BNICU+JSBkYXRhLmZyYW1lKCkKCiMgUFMKY2xhc3MocmVzX3RhYmxlX1BTKQptY29scyhyZXNfdGFibGVfUFMsIHVzZS5uYW1lcz1UUlVFKQpyZXNfdGFibGVfUFMgJT4lIGRhdGEuZnJhbWUoKQpgYGAKClN1bW1hcml6aW5nIHJlc3VsdHMuCmBgYHtyfQpzdW1tYXJ5KHJlc190YWJsZV9QQikKc3VtbWFyeShyZXNfdGFibGVfUEwpCnN1bW1hcnkocmVzX3RhYmxlX1BNKQpzdW1tYXJ5KHJlc190YWJsZV9QUykKYGBgCgpFeHRyYWN0aW5nIHNpZ25pZmljYW50IGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZCBnZW5lcy4KYGBge3J9CiMjICBTZXQgdGhyZXNob2xkcy4KcGFkai5jdXRvZmY9MC4xCmxmYy5jdXRvZmY9MC41OAoKIyBQQgojIyAgQ29udmVydCB0aGUgcmVzdWx0cyB0YWJsZSB0byBhIHRpYmJsZS4KcmVzX3RhYmxlX3RiX1BCPXJlc190YWJsZV9QQiAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhcj0nZ2VuZScpICU+JQogIGFzX3RpYmJsZSgpCiMjICBTdWJzZXQgdGhlIHRpYmJsZSB1c2UgcHJlLWRlZmluZWQgdGhyZXNob2xkcyBhbmQgdGhlbiBzaG93IHRoZSB0YWJsZS4Kc2lnX1BCPXJlc190YWJsZV90Yl9QQiAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGo8cGFkai5jdXRvZmYgJiBhYnMobG9nMkZvbGRDaGFuZ2UpID4gbGZjLmN1dG9mZikgJT4lCiAgZHBseXI6OmFycmFuZ2UocGFkaikKc2lnX1BCICU+JQogIGNvdW50KCkKc2lnX1BCICU+JQogIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2U+MCkgJT4lCiAgY291bnQoKQpzaWdfUEIgJT4lCiAgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZTwwKSAlPiUKICBjb3VudCgpCgojIyBXcml0ZSB0aGUgZnVsbCBhbmQgc3Vic2V0dGVkIHJlc3VsdHMgdG8gLnR4dCBhbmQgLmNzdiBmaWxlcy4Kd3JpdGUudGFibGUocmVzX3RhYmxlX3RiX1BCLCAiZ2VuY29kZV9PdXRwdXRfRmlsZXMvUEJfVEhDX2dlbmVzLnR4dCIsIHF1b3RlPUZBTFNFLCByb3cubmFtZXM9RkFMU0UpCndyaXRlLmNzdihyZXNfdGFibGVfdGJfUEIsICJnZW5jb2RlX091dHB1dF9GaWxlcy9QQl9USENfZ2VuZXMuY3N2IiwgcXVvdGU9RkFMU0UsIHJvdy5uYW1lcz1GQUxTRSkKd3JpdGUudGFibGUoc2lnX1BCLCAiZ2VuY29kZV9PdXRwdXRfRmlsZXMvUEJfVEhDX3NpZ19ERUdzLnR4dCIsIHF1b3RlPUZBTFNFLCByb3cubmFtZXM9RkFMU0UpICMgSVBBIHJlcXVpcmVzIGEgLnR4dCBmaWxlCndyaXRlLmNzdihzaWdfUEIsICJnZW5jb2RlX091dHB1dF9GaWxlcy9QQl9USENfc2lnX0RFR3MuY3N2IiwgcXVvdGU9RkFMU0UsIHJvdy5uYW1lcz1GQUxTRSkgIyAuY3N2IGZpbGVzIHdvcmsgYmV0dGVyIGZvciBSCgojIFBMCiMjICBDb252ZXJ0IHRoZSByZXN1bHRzIHRhYmxlIHRvIGEgdGliYmxlLgpyZXNfdGFibGVfdGJfUEw9cmVzX3RhYmxlX1BMICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4odmFyPSdnZW5lJykgJT4lCiAgYXNfdGliYmxlKCkKIyMgIFN1YnNldCB0aGUgdGliYmxlIHVzZSBwcmUtZGVmaW5lZCB0aHJlc2hvbGRzIGFuZCB0aGVuIHNob3cgdGhlIHRhYmxlLgpzaWdfUEw9cmVzX3RhYmxlX3RiX1BMICU+JQogIGRwbHlyOjpmaWx0ZXIocGFkajxwYWRqLmN1dG9mZiAmIGFicyhsb2cyRm9sZENoYW5nZSkgPiBsZmMuY3V0b2ZmKSAlPiUKICBkcGx5cjo6YXJyYW5nZShwYWRqKQpzaWdfUEwgJT4lCiAgY291bnQoKQpzaWdfUEwgJT4lCiAgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZT4wKSAlPiUKICBjb3VudCgpCnNpZ19QTCAlPiUKICBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlPDApICU+JQogIGNvdW50KCkKCiMjIFdyaXRlIHRoZSBmdWxsIGFuZCBzdWJzZXR0ZWQgcmVzdWx0cyB0byAudHh0IGFuZCAuY3N2IGZpbGVzLgp3cml0ZS50YWJsZShyZXNfdGFibGVfdGJfUEwsICJnZW5jb2RlX091dHB1dF9GaWxlcy9QTF9USENfZ2VuZXMudHh0IiwgcXVvdGU9RkFMU0UsIHJvdy5uYW1lcz1GQUxTRSkKd3JpdGUuY3N2KHJlc190YWJsZV90Yl9QTCwgImdlbmNvZGVfT3V0cHV0X0ZpbGVzL1BMX1RIQ19nZW5lcy5jc3YiLCBxdW90ZT1GQUxTRSwgcm93Lm5hbWVzPUZBTFNFKQp3cml0ZS50YWJsZShzaWdfUEwsICJnZW5jb2RlX091dHB1dF9GaWxlcy9QTF9USENfc2lnX0RFR3MudHh0IiwgcXVvdGU9RkFMU0UsIHJvdy5uYW1lcz1GQUxTRSkgIyBJUEEgcmVxdWlyZXMgYSAudHh0IGZpbGUKd3JpdGUuY3N2KHNpZ19QTCwgImdlbmNvZGVfT3V0cHV0X0ZpbGVzL1BMX1RIQ19zaWdfREVHcy5jc3YiLCBxdW90ZT1GQUxTRSwgcm93Lm5hbWVzPUZBTFNFKSAjIC5jc3YgZmlsZXMgd29yayBiZXR0ZXIgZm9yIFIKCiMgUE0KIyMgIENvbnZlcnQgdGhlIHJlc3VsdHMgdGFibGUgdG8gYSB0aWJibGUuCnJlc190YWJsZV90Yl9QTT1yZXNfdGFibGVfUE0gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXI9J2dlbmUnKSAlPiUKICBhc190aWJibGUoKQojIyAgU3Vic2V0IHRoZSB0aWJibGUgdXNlIHByZS1kZWZpbmVkIHRocmVzaG9sZHMgYW5kIHRoZW4gc2hvdyB0aGUgdGFibGUuCnNpZ19QTT1yZXNfdGFibGVfdGJfUE0gJT4lCiAgZHBseXI6OmZpbHRlcihwYWRqPHBhZGouY3V0b2ZmICYgYWJzKGxvZzJGb2xkQ2hhbmdlKSA+IGxmYy5jdXRvZmYpICU+JQogIGRwbHlyOjphcnJhbmdlKHBhZGopCnNpZ19QTSAlPiUKICBjb3VudCgpCnNpZ19QTSAlPiUKICBkcGx5cjo6ZmlsdGVyKGxvZzJGb2xkQ2hhbmdlPjApICU+JQogIGNvdW50KCkKc2lnX1BNICU+JQogIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2U8MCkgJT4lCiAgY291bnQoKQoKIyMgV3JpdGUgdGhlIGZ1bGwgYW5kIHN1YnNldHRlZCByZXN1bHRzIHRvIC50eHQgYW5kIC5jc3YgZmlsZXMuCndyaXRlLnRhYmxlKHJlc190YWJsZV90Yl9QTSwgImdlbmNvZGVfT3V0cHV0X0ZpbGVzL1BNX1RIQ19nZW5lcy50eHQiLCBxdW90ZT1GQUxTRSwgcm93Lm5hbWVzPUZBTFNFKQp3cml0ZS5jc3YocmVzX3RhYmxlX3RiX1BNLCAiZ2VuY29kZV9PdXRwdXRfRmlsZXMvUE1fVEhDX2dlbmVzLmNzdiIsIHF1b3RlPUZBTFNFLCByb3cubmFtZXM9RkFMU0UpCndyaXRlLnRhYmxlKHNpZ19QTSwgImdlbmNvZGVfT3V0cHV0X0ZpbGVzL1BNX1RIQ19zaWdfREVHcy50eHQiLCBxdW90ZT1GQUxTRSwgcm93Lm5hbWVzPUZBTFNFKSAjIElQQSByZXF1aXJlcyBhIC50eHQgZmlsZQp3cml0ZS5jc3Yoc2lnX1BNLCAiZ2VuY29kZV9PdXRwdXRfRmlsZXMvUE1fVEhDX3NpZ19ERUdzLmNzdiIsIHF1b3RlPUZBTFNFLCByb3cubmFtZXM9RkFMU0UpICMgLmNzdiBmaWxlcyB3b3JrIGJldHRlciBmb3IgUgoKIyBQUwojIyAgQ29udmVydCB0aGUgcmVzdWx0cyB0YWJsZSB0byBhIHRpYmJsZS4KcmVzX3RhYmxlX3RiX1BTPXJlc190YWJsZV9QUyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhcj0nZ2VuZScpICU+JQogIGFzX3RpYmJsZSgpCiMjICBTdWJzZXQgdGhlIHRpYmJsZSB1c2UgcHJlLWRlZmluZWQgdGhyZXNob2xkcyBhbmQgdGhlbiBzaG93IHRoZSB0YWJsZS4Kc2lnX1BTPXJlc190YWJsZV90Yl9QUyAlPiUKICBkcGx5cjo6ZmlsdGVyKHBhZGo8cGFkai5jdXRvZmYgJiBhYnMobG9nMkZvbGRDaGFuZ2UpID4gbGZjLmN1dG9mZikgJT4lCiAgZHBseXI6OmFycmFuZ2UocGFkaikKc2lnX1BTICU+JQogIGNvdW50KCkKc2lnX1BTICU+JQogIGRwbHlyOjpmaWx0ZXIobG9nMkZvbGRDaGFuZ2U+MCkgJT4lCiAgY291bnQoKQpzaWdfUFMgJT4lCiAgZHBseXI6OmZpbHRlcihsb2cyRm9sZENoYW5nZTwwKSAlPiUKICBjb3VudCgpCgojIyBXcml0ZSB0aGUgZnVsbCBhbmQgc3Vic2V0dGVkIHJlc3VsdHMgdG8gLnR4dCBhbmQgLmNzdiBmaWxlcy4Kd3JpdGUudGFibGUocmVzX3RhYmxlX3RiX1BTLCAiZ2VuY29kZV9PdXRwdXRfRmlsZXMvUFNfVEhDX2dlbmVzLnR4dCIsIHF1b3RlPUZBTFNFLCByb3cubmFtZXM9RkFMU0UpCndyaXRlLmNzdihyZXNfdGFibGVfdGJfUFMsICJnZW5jb2RlX091dHB1dF9GaWxlcy9QU19USENfZ2VuZXMuY3N2IiwgcXVvdGU9RkFMU0UsIHJvdy5uYW1lcz1GQUxTRSkKd3JpdGUudGFibGUoc2lnX1BTLCAiZ2VuY29kZV9PdXRwdXRfRmlsZXMvUFNfVEhDX3NpZ19ERUdzLnR4dCIsIHF1b3RlPUZBTFNFLCByb3cubmFtZXM9RkFMU0UpICMgSVBBIHJlcXVpcmVzIGEgLnR4dCBmaWxlCndyaXRlLmNzdihzaWdfUFMsICJnZW5jb2RlX091dHB1dF9GaWxlcy9QU19USENfc2lnX0RFR3MuY3N2IiwgcXVvdGU9RkFMU0UsIHJvdy5uYW1lcz1GQUxTRSkgIyAuY3N2IGZpbGVzIHdvcmsgYmV0dGVyIGZvciBSCmBgYAoKKipWaXN1YWxpemluZyBSZXN1bHRzKioKPT09ClJlYWRzIGluIHRoZSBub3JtYWxpemVkIGV4cHJlc3Npb24gZGF0YSB0YWJsZS4KYGBge3J9Cm5vcm1hbGl6ZWRjb3VudHNfUEI9cmVhZC50YWJsZShmaWxlPSJnZW5jb2RlX091dHB1dF9GaWxlcy9QQl9ub3JtYWxpemVkY291bnRzLnR4dCIsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9MSkKbm9ybWFsaXplZGNvdW50c19QTD1yZWFkLnRhYmxlKGZpbGU9ImdlbmNvZGVfT3V0cHV0X0ZpbGVzL1BMX25vcm1hbGl6ZWRjb3VudHMudHh0IiwgaGVhZGVyPVRSVUUsIHJvdy5uYW1lcz0xKQpub3JtYWxpemVkY291bnRzX1BNPXJlYWQudGFibGUoZmlsZT0iZ2VuY29kZV9PdXRwdXRfRmlsZXMvUE1fbm9ybWFsaXplZGNvdW50cy50eHQiLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzPTEpCm5vcm1hbGl6ZWRjb3VudHNfUFM9cmVhZC50YWJsZShmaWxlPSJnZW5jb2RlX091dHB1dF9GaWxlcy9QU19ub3JtYWxpemVkY291bnRzLnR4dCIsIGhlYWRlcj1UUlVFLCByb3cubmFtZXM9MSkKYGBgCgpDcmVhdGUgdGliYmxlcyBpbmNsdWRpbmcgcm93IG5hbWVzIGZyb20gbWV0YWRhdGEgYW5kIG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBkYXRhLgpgYGB7cn0KIyBQQgptZXRhX1BCPW1ldGFkYXRhX1BCICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXI9InNhbXBsZW5hbWUiKSAlPiUKICBhc190aWJibGUoKQpub3JtYWxpemVkX2NvdW50c19QQj1ub3JtYWxpemVkY291bnRzX1BCICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXI9ImdlbmUiKSAlPiUKICBhc190aWJibGUoKQoKIyBQTAptZXRhX1BMPW1ldGFkYXRhX1BMICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXI9InNhbXBsZW5hbWUiKSAlPiUKICBhc190aWJibGUoKQpub3JtYWxpemVkX2NvdW50c19QTD1ub3JtYWxpemVkY291bnRzX1BMICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXI9ImdlbmUiKSAlPiUKICBhc190aWJibGUoKQoKIyBQTQptZXRhX1BNPW1ldGFkYXRhX1BNICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXI9InNhbXBsZW5hbWUiKSAlPiUKICBhc190aWJibGUoKQpub3JtYWxpemVkX2NvdW50c19QTT1ub3JtYWxpemVkY291bnRzX1BNICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXI9ImdlbmUiKSAlPiUKICBhc190aWJibGUoKQoKIyBQUwptZXRhX1BTPW1ldGFkYXRhX1BTICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXI9InNhbXBsZW5hbWUiKSAlPiUKICBhc190aWJibGUoKQpub3JtYWxpemVkX2NvdW50c19QUz1ub3JtYWxpemVkY291bnRzX1BTICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXI9ImdlbmUiKSAlPiUKICBhc190aWJibGUoKQpgYGAKClVzaW5nIGdncGxvdDIgdG8gcGxvdCBtdWx0aXBsZSBnZW5lcyAodG9wIDIwKS4KYGBge3Igd2FybmluZz1GQUxTRX0KIyAjIFBCCiMgIyMgIE9yZGVyIHJlc3VsdHMgYnkgcGFkaiB2YWx1ZXMuCiMgdG9wMjBfc2lnX2dlbmVzX1BCPXJlc190YWJsZV90Yl9QQiAlPiUKIyAgIGFycmFuZ2UocGFkaikgJT4lICAgICAjIyAgQXJyYW5nZSByb3dzIGJ5IHBhZGogdmFsdWVzLgojICAgcHVsbChnZW5lKSAlPiUgICAgICAgICMjICBFeHRyYWN0IGNoYXJhY3RlciB2ZWN0b3Igb2Ygb3JkZXJlZCBnZW5lcy4KIyAgIGhlYWQobj0yMCkgICAgICAgICAgICAjIyAgRXh0cmFjdCB0aGUgdG9wIDIwIGdlbmVzLgojICMjICBOb3JtYWxpemVkIGNvdW50cyBmb3IgdG9wIDIwIHNpZ25pZmljYW50IGdlbmVzLgojIHRvcDIwX3NpZ19ub3JtX1BCPW5vcm1hbGl6ZWRfY291bnRzX1BCICU+JQojICAgZHBseXI6OmZpbHRlcihnZW5lICVpbiUgdG9wMjBfc2lnX2dlbmVzX1BCKQojICMjICBHYXRoZXJpbmcgdGhlIGNvbHVtbnMgdG8gaGF2ZSBub3JtYWxpemVkIHRvIGEgc2luZ2xlIGNvbHVtbi4KIyBnYXRoZXJlZF90b3AyMF9zaWdfUEI9dG9wMjBfc2lnX25vcm1fUEIgJT4lCiMgICBnYXRoZXIoY29sbmFtZXModG9wMjBfc2lnX25vcm1fUEIpWzI6NTBdLCBrZXk9InNhbXBsZW5hbWUiLCB2YWx1ZT0ibm9ybWFsaXplZF9jb3VudHMiKQojICMjICBDb21iaW5lIG1ldGFkYXRhIHdpdGggbWVsdGVkIG5vcm1hbGl6ZWQgY291bnRzIGRhdGEuCiMgZ2F0aGVyZWRfdG9wMjBfc2lnX1BCPWlubmVyX2pvaW4obWV0YV9QQiwgZ2F0aGVyZWRfdG9wMjBfc2lnX1BCKQojICMjICBQbG90IHVzaW5nIGdncGxvdDIuCiMgZ2dwbG90KCkrCiMgICBnZW9tX3BvaW50KGRhdGE9Z2F0aGVyZWRfdG9wMjBfc2lnX1BCLCBhZXMoeD1nZW5lLCB5PW5vcm1hbGl6ZWRfY291bnRzLCBmaWxsPVRIQyksCiMgICAgICAgICAgICAgIGFscGhhPTAuNzUsIGNvbG9yPSJibGFjayIsIHBjaD0yMSwgc2l6ZT0yKSsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKGxpbWl0cz1jKCJwb3NpdGl2ZSIsICJuZWdhdGl2ZSIpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJQb3NpdGl2ZSIsICJOZWdhdGl2ZSIpLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1hcy52ZWN0b3IocG9seWNocm9tZSgyKSkpKyAgICAKIyAgIHNjYWxlX3lfbG9nMTAoKSsKIyAgIHRoZW1lX21pbmltYWwoKSsKIyAgIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAojICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCBjb2xvcj0iYmxhY2siLCBzaXplPXJlbCgwLjgpKSwKIyAgICAgICAgICMgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgICAgICAgICAjIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKIyAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgICAgICAgICBwYW5lbC5ib3JkZXI9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xLCBmaWxsPU5BKSwKIyAgICAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xKSwKIyAgICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKIyAgICAgICAgIGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShsaW5ld2lkdGg9MSksCiMgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgICAgICAgICAjIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAojICAgICAgICAgIyBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpKSsKIyAgICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF9ibGFuaygpKSsKIyAgIHhsYWIoIkdlbmVzIikrCiMgICB5bGFiKCJsb2cxMCBOb3JtYWxpemVkIENvdW50cyIpKwojICAgbGFicyh0aXRsZT0iU2lnbmlmaWNhbnQgR2VuZXMgaW4gQnJhaW4gVEhDIFBvc2l0aXZlIHZzIE5lZ2F0aXZlIiwgZmlsbD0iVEhDIikgIAoKIyBQTAojIyAgT3JkZXIgcmVzdWx0cyBieSBwYWRqIHZhbHVlcy4KdG9wMjBfc2lnX2dlbmVzX1BMPXJlc190YWJsZV90Yl9QTCAlPiUKICBhcnJhbmdlKHBhZGopICU+JSAgICAgIyMgIEFycmFuZ2Ugcm93cyBieSBwYWRqIHZhbHVlcy4KICBwdWxsKGdlbmUpICU+JSAgICAgICAgIyMgIEV4dHJhY3QgY2hhcmFjdGVyIHZlY3RvciBvZiBvcmRlcmVkIGdlbmVzLgogIGhlYWQobj0yMikgICAgICAgICAgICAjIyAgRXh0cmFjdCB0aGUgdG9wIDIwIGdlbmVzLgojIyAgTm9ybWFsaXplZCBjb3VudHMgZm9yIHRvcCAyMCBzaWduaWZpY2FudCBnZW5lcy4KdG9wMjBfc2lnX25vcm1fUEw9bm9ybWFsaXplZF9jb3VudHNfUEwgJT4lCiAgZHBseXI6OmZpbHRlcihnZW5lICVpbiUgdG9wMjBfc2lnX2dlbmVzX1BMKQojIyAgR2F0aGVyaW5nIHRoZSBjb2x1bW5zIHRvIGhhdmUgbm9ybWFsaXplZCB0byBhIHNpbmdsZSBjb2x1bW4uCmdhdGhlcmVkX3RvcDIwX3NpZ19QTD10b3AyMF9zaWdfbm9ybV9QTCAlPiUKICBnYXRoZXIoY29sbmFtZXModG9wMjBfc2lnX25vcm1fUEwpWzI6NTNdLCBrZXk9InNhbXBsZW5hbWUiLCB2YWx1ZT0ibm9ybWFsaXplZF9jb3VudHMiKQojIyAgQ29tYmluZSBtZXRhZGF0YSB3aXRoIG1lbHRlZCBub3JtYWxpemVkIGNvdW50cyBkYXRhLgpnYXRoZXJlZF90b3AyMF9zaWdfUEw9aW5uZXJfam9pbihtZXRhX1BMLCBnYXRoZXJlZF90b3AyMF9zaWdfUEwpCiMjICBQbG90IHVzaW5nIGdncGxvdDIuCnBsb3QxPWdncGxvdCgpKwogIGdlb21fcG9pbnQoZGF0YT1nYXRoZXJlZF90b3AyMF9zaWdfUEwsIGFlcyh4PWdlbmUsIHk9bm9ybWFsaXplZF9jb3VudHMsIGZpbGw9VEhDLCBzaGFwZT1USEMpLAogICAgICAgICAgICAgYWxwaGE9MC43NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0yKSsKICBzY2FsZV9maWxsX21hbnVhbChsaW1pdHM9YygicG9zaXRpdmUiLCAibmVnYXRpdmUiKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiUG9zaXRpdmUiLCAiTmVnYXRpdmUiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YXMudmVjdG9yKHBvbHljaHJvbWUoMikpKSsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKGxpbWl0cz1jKCJwb3NpdGl2ZSIsICJuZWdhdGl2ZSIpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiUG9zaXRpdmUiLCAiTmVnYXRpdmUiKSwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoMjEsIDI0KSkrICAgCiAgc2NhbGVfeV9sb2cxMCgpKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsIGNvbG9yPSJibGFjayIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgICMgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgIyBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSwgZmlsbD1OQSksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIiwgbGluZXdpZHRoPTEpLAogICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9saW5lKGxpbmV3aWR0aD0xKSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgIyBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAogICAgICAgICMgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSkrCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X2JsYW5rKCkpKwogIHhsYWIoIkdlbmVzIikrCiAgeWxhYigibG9nMTAgTm9ybWFsaXplZCBDb3VudHMiKSsKICBsYWJzKHRpdGxlPSJTaWduaWZpY2FudCBHZW5lcyBpbiBMdW5nIFRIQyBQb3NpdGl2ZSB2cyBOZWdhdGl2ZSIsIGZpbGw9IlRIQyIpIAoKIyBQTQojIyAgT3JkZXIgcmVzdWx0cyBieSBwYWRqIHZhbHVlcy4KdG9wMjBfc2lnX2dlbmVzX1BNPXJlc190YWJsZV90Yl9QTSAlPiUKICBhcnJhbmdlKHBhZGopICU+JSAgICAgIyMgIEFycmFuZ2Ugcm93cyBieSBwYWRqIHZhbHVlcy4KICBwdWxsKGdlbmUpICU+JSAgICAgICAgIyMgIEV4dHJhY3QgY2hhcmFjdGVyIHZlY3RvciBvZiBvcmRlcmVkIGdlbmVzLgogIGhlYWQobj00KSAgICAgICAgICAgICMjICBFeHRyYWN0IHRoZSB0b3AgMjAgZ2VuZXMuCiMjICBOb3JtYWxpemVkIGNvdW50cyBmb3IgdG9wIDIwIHNpZ25pZmljYW50IGdlbmVzLgp0b3AyMF9zaWdfbm9ybV9QTT1ub3JtYWxpemVkX2NvdW50c19QTSAlPiUKICBkcGx5cjo6ZmlsdGVyKGdlbmUgJWluJSB0b3AyMF9zaWdfZ2VuZXNfUE0pCiMjICBHYXRoZXJpbmcgdGhlIGNvbHVtbnMgdG8gaGF2ZSBub3JtYWxpemVkIHRvIGEgc2luZ2xlIGNvbHVtbi4KZ2F0aGVyZWRfdG9wMjBfc2lnX1BNPXRvcDIwX3NpZ19ub3JtX1BNICU+JQogIGdhdGhlcihjb2xuYW1lcyh0b3AyMF9zaWdfbm9ybV9QTSlbMjo1NF0sIGtleT0ic2FtcGxlbmFtZSIsIHZhbHVlPSJub3JtYWxpemVkX2NvdW50cyIpCiMjICBDb21iaW5lIG1ldGFkYXRhIHdpdGggbWVsdGVkIG5vcm1hbGl6ZWQgY291bnRzIGRhdGEuCmdhdGhlcmVkX3RvcDIwX3NpZ19QTT1pbm5lcl9qb2luKG1ldGFfUE0sIGdhdGhlcmVkX3RvcDIwX3NpZ19QTSkKIyMgIFBsb3QgdXNpbmcgZ2dwbG90Mi4KcGxvdDI9Z2dwbG90KCkrCiAgZ2VvbV9wb2ludChkYXRhPWdhdGhlcmVkX3RvcDIwX3NpZ19QTSwgYWVzKHg9Z2VuZSwgeT1ub3JtYWxpemVkX2NvdW50cywgZmlsbD1USEMsIHNoYXBlPVRIQyksCiAgICAgICAgICAgICBhbHBoYT0wLjc1LCBjb2xvcj0iYmxhY2siLCBzaXplPTIpKwogIHNjYWxlX2ZpbGxfbWFudWFsKGxpbWl0cz1jKCJwb3NpdGl2ZSIsICJuZWdhdGl2ZSIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJQb3NpdGl2ZSIsICJOZWdhdGl2ZSIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcz1hcy52ZWN0b3IocG9seWNocm9tZSgyKSkpKwogIHNjYWxlX3NoYXBlX21hbnVhbChsaW1pdHM9YygicG9zaXRpdmUiLCAibmVnYXRpdmUiKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIlBvc2l0aXZlIiwgIk5lZ2F0aXZlIiksCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKDIxLCAyNCkpKyAgCiAgc2NhbGVfeV9sb2cxMCgpKwogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsIGNvbG9yPSJibGFjayIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgICMgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgIyBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSwgZmlsbD1OQSksCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIiwgbGluZXdpZHRoPTEpLAogICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9saW5lKGxpbmV3aWR0aD0xKSwKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgIyBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAogICAgICAgICMgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSkrCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X2JsYW5rKCkpKwogIHhsYWIoIkdlbmVzIikrCiAgeWxhYigibG9nMTAgTm9ybWFsaXplZCBDb3VudHMiKSsKICBsYWJzKHRpdGxlPSJTaWduaWZpY2FudCBHZW5lcyBpbiBNdXNjbGUgVEhDIFBvc2l0aXZlIHZzIE5lZ2F0aXZlIiwgZmlsbD0iVEhDIikgIAoKIyAjIFBTCiMgIyMgIE9yZGVyIHJlc3VsdHMgYnkgcGFkaiB2YWx1ZXMuCiMgdG9wMjBfc2lnX2dlbmVzX1BTPXJlc190YWJsZV90Yl9QUyAlPiUKIyAgIGFycmFuZ2UocGFkaikgJT4lICAgICAjIyAgQXJyYW5nZSByb3dzIGJ5IHBhZGogdmFsdWVzLgojICAgcHVsbChnZW5lKSAlPiUgICAgICAgICMjICBFeHRyYWN0IGNoYXJhY3RlciB2ZWN0b3Igb2Ygb3JkZXJlZCBnZW5lcy4KIyAgIGhlYWQobj0yMCkgICAgICAgICAgICAjIyAgRXh0cmFjdCB0aGUgdG9wIDIwIGdlbmVzLgojICMjICBOb3JtYWxpemVkIGNvdW50cyBmb3IgdG9wIDIwIHNpZ25pZmljYW50IGdlbmVzLgojIHRvcDIwX3NpZ19ub3JtX1BTPW5vcm1hbGl6ZWRfY291bnRzX1BTICU+JQojICAgZHBseXI6OmZpbHRlcihnZW5lICVpbiUgdG9wMjBfc2lnX2dlbmVzX1BTKQojICMjICBHYXRoZXJpbmcgdGhlIGNvbHVtbnMgdG8gaGF2ZSBub3JtYWxpemVkIHRvIGEgc2luZ2xlIGNvbHVtbi4KIyBnYXRoZXJlZF90b3AyMF9zaWdfUFM9dG9wMjBfc2lnX25vcm1fUFMgJT4lCiMgICBnYXRoZXIoY29sbmFtZXModG9wMjBfc2lnX25vcm1fUFMpWzI6MjldLCBrZXk9InNhbXBsZW5hbWUiLCB2YWx1ZT0ibm9ybWFsaXplZF9jb3VudHMiKQojICMjICBDb21iaW5lIG1ldGFkYXRhIHdpdGggbWVsdGVkIG5vcm1hbGl6ZWQgY291bnRzIGRhdGEuCiMgZ2F0aGVyZWRfdG9wMjBfc2lnX1BTPWlubmVyX2pvaW4obWV0YV9QUywgZ2F0aGVyZWRfdG9wMjBfc2lnX1BTKQojICMjICBQbG90IHVzaW5nIGdncGxvdDIuCiMgZ2dwbG90KCkrCiMgICBnZW9tX3BvaW50KGRhdGE9Z2F0aGVyZWRfdG9wMjBfc2lnX1BTLCBhZXMoeD1nZW5lLCB5PW5vcm1hbGl6ZWRfY291bnRzLCBmaWxsPVRIQyksCiMgICAgICAgICAgICAgIGFscGhhPTAuNzUsIGNvbG9yPSJibGFjayIsIHBjaD0yMSwgc2l6ZT0yKSsKIyAgIHNjYWxlX2ZpbGxfbWFudWFsKGxpbWl0cz1jKCJwb3NpdGl2ZSIsICJuZWdhdGl2ZSIpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJQb3NpdGl2ZSIsICJOZWdhdGl2ZSIpLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1hcy52ZWN0b3IocG9seWNocm9tZSgyKSkpKyAgICAKIyAgIHNjYWxlX3lfbG9nMTAoKSsKIyAgIHRoZW1lX21pbmltYWwoKSsKIyAgIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAojICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCBjb2xvcj0iYmxhY2siLCBzaXplPXJlbCgwLjgpKSwKIyAgICAgICAgICMgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgICAgICAgICAjIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKIyAgICAgICAgIGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgICAgICAgICBwYW5lbC5ib3JkZXI9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xLCBmaWxsPU5BKSwKIyAgICAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xKSwKIyAgICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKIyAgICAgICAgIGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShsaW5ld2lkdGg9MSksCiMgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgICAgICAgICAjIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLAojICAgICAgICAgIyBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpKSsKIyAgICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF9ibGFuaygpKSsKIyAgIHhsYWIoIkdlbmVzIikrCiMgICB5bGFiKCJsb2cxMCBOb3JtYWxpemVkIENvdW50cyIpKwojICAgbGFicyh0aXRsZT0iU2lnbmlmaWNhbnQgR2VuZXMgaW4gQmxvb2QgVEhDIFBvc2l0aXZlIHZzIE5lZ2F0aXZlIiwgZmlsbD0iVEhDIikgIApgYGAKCkNyZWF0aW5nIGEgZmlndXJlIG9mIGFsbCBzaWduaWZpY2FudCBnZW5lcyBwbG90cy4KYGBge3Igd2FybmluZz1GQUxTRX0KdG9wX3NpZ19wYXRjaHdvcms9cGxvdDEgKyBwbG90MiArIHBsb3RfbGF5b3V0KG5yb3c9MikKdG9wX3NpZ19wYXRjaHdvcmsgKyBwbG90X2Fubm90YXRpb24odGFnX2xldmVscz0iQSIpICsgcGxvdF9sYXlvdXQoZ3VpZGVzPSJjb2xsZWN0IikgJgogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0nYm90dG9tJykKZ2dzYXZlKCJQTV90b3Bfc2lnX1RIQ19wbG90cy5wbmciLCB3aWR0aD03LCBoZWlnaHQ9MTAsIHVuaXQ9ImluIiwgZHBpPTMyMCkKYGBgCgpHZW5lcmF0aW5nIGEgaGVhdG1hcC4KYGBge3J9CiMgIyBQQgojICMjICBFeHRyYWN0IG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBmb3Igc2lnbmlmaWNhbnQgZ2VuZXMgZnJvbSB0aGUgc2FtcGxlcyBhbmQgc2V0IHRoZSBnZW5lIGNvbHVtbiAoMSkgdG8gcm93IG5hbWVzLgojIG5vcm1fc2lnX1BCPW5vcm1hbGl6ZWRfY291bnRzX1BCWyxjKDEsMjo1NCldICU+JQojICAgZHBseXI6OmZpbHRlcihnZW5lICVpbiUgc2lnX1BCJGdlbmUpICU+JQojICAgZGF0YS5mcmFtZShjaGVjay5uYW1lcz1GQUxTRSkgJT4lCiMgICBjb2x1bW5fdG9fcm93bmFtZXModmFyPSJnZW5lIikKIyAjIyAgQW5ub3RhdGUgdGhlIGhlYXRtYXAuCiMgYW5ub3RhdGlvbl9QQj1tZXRhX1BCICU+JQojICAgZHBseXI6OnNlbGVjdChzYW1wbGVuYW1lLCBUSEMpICU+JQojICAgZGF0YS5mcmFtZShyb3cubmFtZXM9InNhbXBsZW5hbWUiKQojICMjICBTZXQgYSBjb2xvciBwYWxldHRlLgojIGhlYXRfY29sb3JzPWJyZXdlci5wYWwoNiwgIllsT3JSZCIpCiMgIyMgIFJ1biBwaGVhdG1hcC4KIyAjIHBoZWF0bWFwOjpwaGVhdG1hcChub3JtX3NpZ19QQiwgCiMgIyAgICAgICAgICBjb2xvcj1oZWF0X2NvbG9ycywgCiMgIyAgICAgICAgICBjbHVzdGVyX3Jvd3M9VFJVRSwgCiMgIyAgICAgICAgICBzaG93X3Jvd25hbWVzPUZBTFNFLAojICMgICAgICAgICAgYW5ub3RhdGlvbl9jb2w9YW5ub3RhdGlvbl9QQiwgCiMgIyAgICAgICAgICBib3JkZXJfY29sb3I9TkEsIAojICMgICAgICAgICAgZm9udHNpemU9OSwgCiMgIyAgICAgICAgICBzY2FsZT0icm93IiwgICAgICMjICBaLXNjb3JlcyBhcmUgcGxvdHRlZCByYXRoZXIgdGhhbiBhY3R1YWwgbm9ybWFsaXplZCBjb3VudCB2YWx1ZXMuCiMgIyAgICAgICAgICBmb250c2l6ZV9yb3c9MTAsIAojICMgICAgICAgICAgaGVpZ2h0PTIwLAojICMgICAgICAgICAgIyBhbm5vdGF0aW9uX2NvbG9ycz1saXN0KGdyb3VwPWMoQlA9IiIsIFJOPSIiLCBSUD0iIikpLCAjIyBUaGUgYW5ub3RhdGlvbiBjb2xvcnMuCiMgIyAgICAgICAgICBhbm5vdGF0aW9uX2xlZ2VuZD1UUlVFKQojIAojICMgUEwKIyAjIyAgRXh0cmFjdCBub3JtYWxpemVkIGV4cHJlc3Npb24gZm9yIHNpZ25pZmljYW50IGdlbmVzIGZyb20gdGhlIHNhbXBsZXMgYW5kIHNldCB0aGUgZ2VuZSBjb2x1bW4gKDEpIHRvIHJvdyBuYW1lcy4KIyBub3JtX3NpZ19QTD1ub3JtYWxpemVkX2NvdW50c19QTFssYygxLDI6NTIpXSAlPiUKIyAgIGRwbHlyOjpmaWx0ZXIoZ2VuZSAlaW4lIHNpZ19QTCRnZW5lKSAlPiUKIyAgIGRhdGEuZnJhbWUoY2hlY2submFtZXM9RkFMU0UpICU+JQojICAgY29sdW1uX3RvX3Jvd25hbWVzKHZhcj0iZ2VuZSIpCiMgIyMgIEFubm90YXRlIHRoZSBoZWF0bWFwLgojIGFubm90YXRpb25fUEw9bWV0YV9QTCAlPiUKIyAgIGRwbHlyOjpzZWxlY3Qoc2FtcGxlbmFtZSwgVEhDKSAlPiUKIyAgIGRhdGEuZnJhbWUocm93Lm5hbWVzPSJzYW1wbGVuYW1lIikKIyAjIyAgU2V0IGEgY29sb3IgcGFsZXR0ZS4KIyBoZWF0X2NvbG9ycz1icmV3ZXIucGFsKDYsICJZbE9yUmQiKQojICMjICBSdW4gcGhlYXRtYXAuCiMgcGhlYXRtYXA6OnBoZWF0bWFwKG5vcm1fc2lnX1BMLCAKIyAgICAgICAgICBjb2xvcj1oZWF0X2NvbG9ycywgCiMgICAgICAgICAgY2x1c3Rlcl9yb3dzPVRSVUUsIAojICAgICAgICAgIHNob3dfcm93bmFtZXM9RkFMU0UsCiMgICAgICAgICAgYW5ub3RhdGlvbl9jb2w9YW5ub3RhdGlvbl9QTCwgCiMgICAgICAgICAgYm9yZGVyX2NvbG9yPU5BLCAKIyAgICAgICAgICBmb250c2l6ZT05LCAKIyAgICAgICAgICBzY2FsZT0icm93IiwgICAgICMjICBaLXNjb3JlcyBhcmUgcGxvdHRlZCByYXRoZXIgdGhhbiBhY3R1YWwgbm9ybWFsaXplZCBjb3VudCB2YWx1ZXMuCiMgICAgICAgICAgZm9udHNpemVfcm93PTEwLCAKIyAgICAgICAgICBoZWlnaHQ9MjAsCiMgICAgICAgICAgIyBhbm5vdGF0aW9uX2NvbG9ycz1saXN0KGdyb3VwPWMoQlA9IiIsIFJOPSIiLCBSUD0iIikpLCAjIyBUaGUgYW5ub3RhdGlvbiBjb2xvcnMuCiMgICAgICAgICAgYW5ub3RhdGlvbl9sZWdlbmQ9VFJVRSkKIyAKIyAjIFBNCiMgIyMgIEV4dHJhY3Qgbm9ybWFsaXplZCBleHByZXNzaW9uIGZvciBzaWduaWZpY2FudCBnZW5lcyBmcm9tIHRoZSBzYW1wbGVzIGFuZCBzZXQgdGhlIGdlbmUgY29sdW1uICgxKSB0byByb3cgbmFtZXMuCiMgbm9ybV9zaWdfUE09bm9ybWFsaXplZF9jb3VudHNfUE1bLGMoMSwyOjU0KV0gJT4lCiMgICBkcGx5cjo6ZmlsdGVyKGdlbmUgJWluJSBzaWdfUE0kZ2VuZSkgJT4lCiMgICBkYXRhLmZyYW1lKGNoZWNrLm5hbWVzPUZBTFNFKSAlPiUKIyAgIGNvbHVtbl90b19yb3duYW1lcyh2YXI9ImdlbmUiKQojICMjICBBbm5vdGF0ZSB0aGUgaGVhdG1hcC4KIyBhbm5vdGF0aW9uX1BNPW1ldGFfUE0gJT4lCiMgICBkcGx5cjo6c2VsZWN0KHNhbXBsZW5hbWUsIFRIQykgJT4lCiMgICBkYXRhLmZyYW1lKHJvdy5uYW1lcz0ic2FtcGxlbmFtZSIpCiMgIyMgIFNldCBhIGNvbG9yIHBhbGV0dGUuCiMgaGVhdF9jb2xvcnM9YnJld2VyLnBhbCg2LCAiWWxPclJkIikKIyAjIyAgUnVuIHBoZWF0bWFwLgojIHBoZWF0bWFwOjpwaGVhdG1hcChub3JtX3NpZ19QTSwgCiMgICAgICAgICAgY29sb3I9aGVhdF9jb2xvcnMsIAojICAgICAgICAgIGNsdXN0ZXJfcm93cz1UUlVFLCAKIyAgICAgICAgICBzaG93X3Jvd25hbWVzPUZBTFNFLAojICAgICAgICAgIGFubm90YXRpb25fY29sPWFubm90YXRpb25fUE0sIAojICAgICAgICAgIGJvcmRlcl9jb2xvcj1OQSwgCiMgICAgICAgICAgZm9udHNpemU9OSwgCiMgICAgICAgICAgc2NhbGU9InJvdyIsICAgICAjIyAgWi1zY29yZXMgYXJlIHBsb3R0ZWQgcmF0aGVyIHRoYW4gYWN0dWFsIG5vcm1hbGl6ZWQgY291bnQgdmFsdWVzLgojICAgICAgICAgIGZvbnRzaXplX3Jvdz0xMCwgCiMgICAgICAgICAgaGVpZ2h0PTIwLAojICAgICAgICAgICMgYW5ub3RhdGlvbl9jb2xvcnM9bGlzdChncm91cD1jKEJQPSIiLCBSTj0iIiwgUlA9IiIpKSwgIyMgVGhlIGFubm90YXRpb24gY29sb3JzLgojICAgICAgICAgIGFubm90YXRpb25fbGVnZW5kPVRSVUUpCiMgCiMgIyBQUwojICMjICBFeHRyYWN0IG5vcm1hbGl6ZWQgZXhwcmVzc2lvbiBmb3Igc2lnbmlmaWNhbnQgZ2VuZXMgZnJvbSB0aGUgc2FtcGxlcyBhbmQgc2V0IHRoZSBnZW5lIGNvbHVtbiAoMSkgdG8gcm93IG5hbWVzLgojIG5vcm1fc2lnX1BTPW5vcm1hbGl6ZWRfY291bnRzX1BTWyxjKDEsMjo0NCldICU+JQojICAgZHBseXI6OmZpbHRlcihnZW5lICVpbiUgc2lnX1BTJGdlbmUpICU+JQojICAgZGF0YS5mcmFtZShjaGVjay5uYW1lcz1GQUxTRSkgJT4lCiMgICBjb2x1bW5fdG9fcm93bmFtZXModmFyPSJnZW5lIikKIyAjIyAgQW5ub3RhdGUgdGhlIGhlYXRtYXAuCiMgYW5ub3RhdGlvbl9QUz1tZXRhX1BTICU+JQojICAgZHBseXI6OnNlbGVjdChzYW1wbGVuYW1lLCBUSEMpICU+JQojICAgZGF0YS5mcmFtZShyb3cubmFtZXM9InNhbXBsZW5hbWUiKQojICMjICBTZXQgYSBjb2xvciBwYWxldHRlLgojIGhlYXRfY29sb3JzPWJyZXdlci5wYWwoNiwgIllsT3JSZCIpCiMgIyMgIFJ1biBwaGVhdG1hcC4KIyAjIHBoZWF0bWFwOjpwaGVhdG1hcChub3JtX3NpZ19QUywgCiMgIyAgICAgICAgICBjb2xvcj1oZWF0X2NvbG9ycywgCiMgIyAgICAgICAgICBjbHVzdGVyX3Jvd3M9VFJVRSwgCiMgIyAgICAgICAgICBzaG93X3Jvd25hbWVzPUZBTFNFLAojICMgICAgICAgICAgYW5ub3RhdGlvbl9jb2w9YW5ub3RhdGlvbl9QUywgCiMgIyAgICAgICAgICBib3JkZXJfY29sb3I9TkEsIAojICMgICAgICAgICAgZm9udHNpemU9OSwgCiMgIyAgICAgICAgICBzY2FsZT0icm93IiwgICAgICMjICBaLXNjb3JlcyBhcmUgcGxvdHRlZCByYXRoZXIgdGhhbiBhY3R1YWwgbm9ybWFsaXplZCBjb3VudCB2YWx1ZXMuCiMgIyAgICAgICAgICBmb250c2l6ZV9yb3c9MTAsIAojICMgICAgICAgICAgaGVpZ2h0PTIwLAojICMgICAgICAgICAgIyBhbm5vdGF0aW9uX2NvbG9ycz1saXN0KGdyb3VwPWMoQlA9IiIsIFJOPSIiLCBSUD0iIikpLCAjIyBUaGUgYW5ub3RhdGlvbiBjb2xvcnMuCiMgIyAgICAgICAgICBhbm5vdGF0aW9uX2xlZ2VuZD1UUlVFKQpgYGAKCkdlbmVyYXRpbmcgYSB2b2xjYW5vIHBsb3QuCmBgYHtyIHdhcm5pbmc9RkFMU0V9CiMgIyAjIFBCCiMgIyAjIyAgT2J0YWluIGxvZ2ljYWwgdmVjdG9yIHdoZXJlIFRSVUUgdmFsdWVzIGRlbm90ZSBwYWRqIHZhbHVlcyA8IDAuMSBhbmQgZm9sZCBjaGFuZ2UgPiAxLjUgaW4gZWl0aGVyIGRpcmVjdGlvbi4KIyAjIHJlc190YWJsZV90Yl92cF9QQj1yZXNfdGFibGVfdGJfUEIgJT4lCiMgIyAgIGRwbHlyOjptdXRhdGUodGhyZXNob2xkPXBhZGo8MC4xICYgYWJzKGxvZzJGb2xkQ2hhbmdlKT49MC41OCkKIyAjICMjICBQbG90cyB0aGUgdm9sY2FubyBwbG90LgojICMgZ2dwbG90KCkrCiMgIyAgIGdlb21fcG9pbnQoZGF0YT1yZXNfdGFibGVfdGJfdnBfUEIsIGFlcyh4PWxvZzJGb2xkQ2hhbmdlLCB5PS1sb2cxMChwYWRqKSwgY29sb3I9dGhyZXNob2xkKSkrCiMgIyAgIGdndGl0bGUoIlRIQzpuZWdhdGl2ZSB2ZXJzdXMgVEhDOnBvc2l0aXZlIEV4cHJlc3Npb24iKSsKIyAjICAgeGxhYigibG9nMiBmb2xkIGNoYW5nZSIpKyAKIyAjICAgeWxhYigiLWxvZzEwIGFkanVzdGVkIHAtdmFsdWUiKSsKIyAjICAgIyBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbj0idHVyYm8iLCBkaXNjcmV0ZT1UUlVFKSsKIyAjICAgdGhlbWVfbWluaW1hbCgpKwojICMgICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMikpLAojICMgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMikpLAojICMgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgIyAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKIyAjICAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSwgZmlsbD1OQSksCiMgIyAgICAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xKSwKIyAjICAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAojICMgICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLAojICMgICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShsaW5ld2lkdGg9MSksCiMgIyAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiMgIyAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKIyAjICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKIyAjICAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSkKIyAjIAojICMgIyMgIExhYmVsIHRoZSB0b3AgMTAgZ2VuZXMgd2l0aCB0aGUgbG93ZXN0IHBhZGogKGNvbmRpdGlvbmFsIG9uIG1heC5vdmVybGFwcyB2YWx1ZSkuCiMgIyAjIyAgQ3JlYXRlIGEgY29sdW1uIHRvIGluZGljYXRlIHdoaWNoIGdlbmVzIHRvIGxhYmVsLgojICMgcmVzX3RhYmxlX3RiX3ZwX1BCPXJlc190YWJsZV90Yl92cF9QQiAlPiUgZHBseXI6OmFycmFuZ2UocGFkaikgJT4lIGRwbHlyOjptdXRhdGUoZ2VuZWxhYmVscz0iIikKIyAjIHJlc190YWJsZV90Yl92cF9QQiRnZW5lbGFiZWxzWzE6MTBdPXJlc190YWJsZV90Yl92cF9QQiRnZW5lWzE6MTBdCiMgIyAjIyAgUGxvdHMgdGhlIHZvbGNhbm8gcGxvdCB3aXRoIGFuIGFkZGl0aW9uYWwgbGF5ZXIgZm9yIGdlb21fdGV4dF9yZXBlbCgpLgojICMgZ2dwbG90KHJlc190YWJsZV90Yl92cF9QQiwgYWVzKHg9bG9nMkZvbGRDaGFuZ2UsIHk9LWxvZzEwKHBhZGopKSkrCiMgIyAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPXRocmVzaG9sZCkpKwojICMgICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPWdlbmVsYWJlbHMpLCBmb3JjZT0zLCBtaW4uc2VnbWVudC5sZW5ndGg9MC41LCBib3gucGFkZGluZz0wLjUpKwojICMgICBnZ3RpdGxlKCJUSEM6bmVnYXRpdmUgdmVyc3VzIFRIQzpwb3NpdGl2ZSBFeHByZXNzaW9uIikrCiMgIyAgIHhsYWIoImxvZzIgZm9sZCBjaGFuZ2UiKSsgCiMgIyAgIHlsYWIoIi1sb2cxMCBhZGp1c3RlZCBwLXZhbHVlIikrCiMgIyAgICMgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb249InR1cmJvIiwgZGlzY3JldGU9VFJVRSkrCiMgIyAgIHRoZW1lX21pbmltYWwoKSsKIyAjICAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjIpKSwKIyAjICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjIpKSwKIyAjICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAojICMgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgIyAgICAgICAgIHBhbmVsLmJvcmRlcj1lbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIiwgbGluZXdpZHRoPTEsIGZpbGw9TkEpLAojICMgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSksCiMgIyAgICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKIyAjICAgICAgICAgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwKIyAjICAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2xpbmUobGluZXdpZHRoPTEpLAojICMgICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAojICMgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgIyAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiMgIyAgICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSkpCiMgCiMgIyBQTAojICMjICBPYnRhaW4gbG9naWNhbCB2ZWN0b3Igd2hlcmUgVFJVRSB2YWx1ZXMgZGVub3RlIHBhZGogdmFsdWVzIDwgMC4xIGFuZCBmb2xkIGNoYW5nZSA+IDEuNSBpbiBlaXRoZXIgZGlyZWN0aW9uLgojIHJlc190YWJsZV90Yl92cF9QTD1yZXNfdGFibGVfdGJfUEwgJT4lCiMgICBkcGx5cjo6bXV0YXRlKHRocmVzaG9sZD1wYWRqPDAuMSAmIGFicyhsb2cyRm9sZENoYW5nZSk+PTAuNTgpCiMgIyMgIFBsb3RzIHRoZSB2b2xjYW5vIHBsb3QuCiMgZ2dwbG90KCkrCiMgICBnZW9tX3BvaW50KGRhdGE9cmVzX3RhYmxlX3RiX3ZwX1BMLCBhZXMoeD1sb2cyRm9sZENoYW5nZSwgeT0tbG9nMTAocGFkaiksIGNvbG9yPXRocmVzaG9sZCkpKwojICAgZ2d0aXRsZSgiVEhDOm5lZ2F0aXZlIHZlcnN1cyBUSEM6cG9zaXRpdmUgRXhwcmVzc2lvbiIpKwojICAgeGxhYigibG9nMiBmb2xkIGNoYW5nZSIpKyAKIyAgIHlsYWIoIi1sb2cxMCBhZGp1c3RlZCBwLXZhbHVlIikrCiMgICAjIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uPSJ0dXJibyIsIGRpc2NyZXRlPVRSVUUpKwojICAgdGhlbWVfbWluaW1hbCgpKwojICAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjIpKSwKIyAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMS4yKSksCiMgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgICAgICAgICBwYW5lbC5ib3JkZXI9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xLCBmaWxsPU5BKSwKIyAgICAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xKSwKIyAgICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKIyAgICAgICAgIGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShsaW5ld2lkdGg9MSksCiMgICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAojICAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAojICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKIyAgICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSkpCiMgCiMgIyMgIExhYmVsIHRoZSB0b3AgMTAgZ2VuZXMgd2l0aCB0aGUgbG93ZXN0IHBhZGogKGNvbmRpdGlvbmFsIG9uIG1heC5vdmVybGFwcyB2YWx1ZSkuCiMgIyMgIENyZWF0ZSBhIGNvbHVtbiB0byBpbmRpY2F0ZSB3aGljaCBnZW5lcyB0byBsYWJlbC4KIyByZXNfdGFibGVfdGJfdnBfUEw9cmVzX3RhYmxlX3RiX3ZwX1BMICU+JSBkcGx5cjo6YXJyYW5nZShwYWRqKSAlPiUgZHBseXI6Om11dGF0ZShnZW5lbGFiZWxzPSIiKQojIHJlc190YWJsZV90Yl92cF9QTCRnZW5lbGFiZWxzWzE6MjldPXJlc190YWJsZV90Yl92cF9QTCRnZW5lWzE6MjldCiMgIyMgIFBsb3RzIHRoZSB2b2xjYW5vIHBsb3Qgd2l0aCBhbiBhZGRpdGlvbmFsIGxheWVyIGZvciBnZW9tX3RleHRfcmVwZWwoKS4KIyBnZ3Bsb3QocmVzX3RhYmxlX3RiX3ZwX1BMLCBhZXMoeD1sb2cyRm9sZENoYW5nZSwgeT0tbG9nMTAocGFkaikpKSsKIyAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPXRocmVzaG9sZCkpKwojICAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbD1nZW5lbGFiZWxzKSwgZm9yY2U9MywgbWluLnNlZ21lbnQubGVuZ3RoPTAuNSwgYm94LnBhZGRpbmc9MC41KSsKIyAgIGdndGl0bGUoIlRIQzpuZWdhdGl2ZSB2ZXJzdXMgVEhDOnBvc2l0aXZlIEV4cHJlc3Npb24iKSsKIyAgIHhsYWIoImxvZzIgZm9sZCBjaGFuZ2UiKSsgCiMgICB5bGFiKCItbG9nMTAgYWRqdXN0ZWQgcC12YWx1ZSIpKwojICAgIyBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbj0idHVyYm8iLCBkaXNjcmV0ZT1UUlVFKSsKIyAgIHRoZW1lX21pbmltYWwoKSsKIyAgIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMS4yKSksCiMgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMikpLAojICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAojICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAojICAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSwgZmlsbD1OQSksCiMgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSksCiMgICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiMgICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2xpbmUobGluZXdpZHRoPTEpLAojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKIyAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKIyAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiMgICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpKQojIAojICMgUE0KIyAjIyAgT2J0YWluIGxvZ2ljYWwgdmVjdG9yIHdoZXJlIFRSVUUgdmFsdWVzIGRlbm90ZSBwYWRqIHZhbHVlcyA8IDAuMSBhbmQgZm9sZCBjaGFuZ2UgPiAxLjUgaW4gZWl0aGVyIGRpcmVjdGlvbi4KIyByZXNfdGFibGVfdGJfdnBfUE09cmVzX3RhYmxlX3RiX1BNICU+JQojICAgZHBseXI6Om11dGF0ZSh0aHJlc2hvbGQ9cGFkajwwLjEgJiBhYnMobG9nMkZvbGRDaGFuZ2UpPj0wLjU4KQojICMjICBQbG90cyB0aGUgdm9sY2FubyBwbG90LgojIGdncGxvdCgpKwojICAgZ2VvbV9wb2ludChkYXRhPXJlc190YWJsZV90Yl92cF9QTSwgYWVzKHg9bG9nMkZvbGRDaGFuZ2UsIHk9LWxvZzEwKHBhZGopLCBjb2xvcj10aHJlc2hvbGQpKSsKIyAgIGdndGl0bGUoIlRIQzpuZWdhdGl2ZSB2ZXJzdXMgVEhDOnBvc2l0aXZlIEV4cHJlc3Npb24iKSsKIyAgIHhsYWIoImxvZzIgZm9sZCBjaGFuZ2UiKSsgCiMgICB5bGFiKCItbG9nMTAgYWRqdXN0ZWQgcC12YWx1ZSIpKwojICAgIyBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbj0idHVyYm8iLCBkaXNjcmV0ZT1UUlVFKSsKIyAgIHRoZW1lX21pbmltYWwoKSsKIyAgIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMS4yKSksCiMgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMikpLAojICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAojICAgICAgICAgYXhpcy50aXRsZS55PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAojICAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSwgZmlsbD1OQSksCiMgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSksCiMgICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiMgICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2xpbmUobGluZXdpZHRoPTEpLAojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKIyAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKIyAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiMgICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpKQojIAojICMjICBMYWJlbCB0aGUgdG9wIDEwIGdlbmVzIHdpdGggdGhlIGxvd2VzdCBwYWRqIChjb25kaXRpb25hbCBvbiBtYXgub3ZlcmxhcHMgdmFsdWUpLgojICMjICBDcmVhdGUgYSBjb2x1bW4gdG8gaW5kaWNhdGUgd2hpY2ggZ2VuZXMgdG8gbGFiZWwuCiMgcmVzX3RhYmxlX3RiX3ZwX1BNPXJlc190YWJsZV90Yl92cF9QTSAlPiUgZHBseXI6OmFycmFuZ2UocGFkaikgJT4lIGRwbHlyOjptdXRhdGUoZ2VuZWxhYmVscz0iIikKIyByZXNfdGFibGVfdGJfdnBfUE0kZ2VuZWxhYmVsc1sxOjRdPXJlc190YWJsZV90Yl92cF9QTSRnZW5lWzE6NF0KIyAjIyAgUGxvdHMgdGhlIHZvbGNhbm8gcGxvdCB3aXRoIGFuIGFkZGl0aW9uYWwgbGF5ZXIgZm9yIGdlb21fdGV4dF9yZXBlbCgpLgojIGdncGxvdChyZXNfdGFibGVfdGJfdnBfUE0sIGFlcyh4PWxvZzJGb2xkQ2hhbmdlLCB5PS1sb2cxMChwYWRqKSkpKwojICAgZ2VvbV9wb2ludChhZXMoY29sb3I9dGhyZXNob2xkKSkrCiMgICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPWdlbmVsYWJlbHMpLCBmb3JjZT0zLCBtaW4uc2VnbWVudC5sZW5ndGg9MC41LCBib3gucGFkZGluZz0wLjUpKwojICAgZ2d0aXRsZSgiVEhDOm5lZ2F0aXZlIHZlcnN1cyBUSEM6cG9zaXRpdmUgRXhwcmVzc2lvbiIpKwojICAgeGxhYigibG9nMiBmb2xkIGNoYW5nZSIpKyAKIyAgIHlsYWIoIi1sb2cxMCBhZGp1c3RlZCBwLXZhbHVlIikrCiMgICAjIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uPSJ0dXJibyIsIGRpc2NyZXRlPVRSVUUpKwojICAgdGhlbWVfbWluaW1hbCgpKwojICAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjIpKSwKIyAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMS4yKSksCiMgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgICAgICAgICBwYW5lbC5ib3JkZXI9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xLCBmaWxsPU5BKSwKIyAgICAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xKSwKIyAgICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKIyAgICAgICAgIGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShsaW5ld2lkdGg9MSksCiMgICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAojICAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAojICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKIyAgICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSkpCiMgCiMgIyAjIFBTCiMgIyAjIyAgT2J0YWluIGxvZ2ljYWwgdmVjdG9yIHdoZXJlIFRSVUUgdmFsdWVzIGRlbm90ZSBwYWRqIHZhbHVlcyA8IDAuMSBhbmQgZm9sZCBjaGFuZ2UgPiAxLjUgaW4gZWl0aGVyIGRpcmVjdGlvbi4KIyAjIHJlc190YWJsZV90Yl92cF9QUz1yZXNfdGFibGVfdGJfUFMgJT4lCiMgIyAgIGRwbHlyOjptdXRhdGUodGhyZXNob2xkPXBhZGo8MC4xICYgYWJzKGxvZzJGb2xkQ2hhbmdlKT49MC41OCkKIyAjICMjICBQbG90cyB0aGUgdm9sY2FubyBwbG90LgojICMgZ2dwbG90KCkrCiMgIyAgIGdlb21fcG9pbnQoZGF0YT1yZXNfdGFibGVfdGJfdnBfUFMsIGFlcyh4PWxvZzJGb2xkQ2hhbmdlLCB5PS1sb2cxMChwYWRqKSwgY29sb3I9dGhyZXNob2xkKSkrCiMgIyAgIGdndGl0bGUoIlRIQzpuZWdhdGl2ZSB2ZXJzdXMgVEhDOnBvc2l0aXZlIEV4cHJlc3Npb24iKSsKIyAjICAgeGxhYigibG9nMiBmb2xkIGNoYW5nZSIpKyAKIyAjICAgeWxhYigiLWxvZzEwIGFkanVzdGVkIHAtdmFsdWUiKSsKIyAjICAgIyBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbj0idHVyYm8iLCBkaXNjcmV0ZT1UUlVFKSsKIyAjICAgdGhlbWVfbWluaW1hbCgpKwojICMgICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMikpLAojICMgICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuMikpLAojICMgICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgIyAgICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKIyAjICAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSwgZmlsbD1OQSksCiMgIyAgICAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xKSwKIyAjICAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAojICMgICAgICAgICBheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLAojICMgICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShsaW5ld2lkdGg9MSksCiMgIyAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiMgIyAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKIyAjICAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKIyAjICAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSkKIyAjIAojICMgIyMgIExhYmVsIHRoZSB0b3AgMTAgZ2VuZXMgd2l0aCB0aGUgbG93ZXN0IHBhZGogKGNvbmRpdGlvbmFsIG9uIG1heC5vdmVybGFwcyB2YWx1ZSkuCiMgIyAjIyAgQ3JlYXRlIGEgY29sdW1uIHRvIGluZGljYXRlIHdoaWNoIGdlbmVzIHRvIGxhYmVsLgojICMgcmVzX3RhYmxlX3RiX3ZwX1BTPXJlc190YWJsZV90Yl92cF9QUyAlPiUgZHBseXI6OmFycmFuZ2UocGFkaikgJT4lIGRwbHlyOjptdXRhdGUoZ2VuZWxhYmVscz0iIikKIyAjIHJlc190YWJsZV90Yl92cF9QUyRnZW5lbGFiZWxzWzE6MTBdPXJlc190YWJsZV90Yl92cF9QUyRnZW5lWzE6MTBdCiMgIyAjIyAgUGxvdHMgdGhlIHZvbGNhbm8gcGxvdCB3aXRoIGFuIGFkZGl0aW9uYWwgbGF5ZXIgZm9yIGdlb21fdGV4dF9yZXBlbCgpLgojICMgZ2dwbG90KHJlc190YWJsZV90Yl92cF9QUywgYWVzKHg9bG9nMkZvbGRDaGFuZ2UsIHk9LWxvZzEwKHBhZGopKSkrCiMgIyAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPXRocmVzaG9sZCkpKwojICMgICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPWdlbmVsYWJlbHMpLCBmb3JjZT0zLCBtaW4uc2VnbWVudC5sZW5ndGg9MC41LCBib3gucGFkZGluZz0wLjUpKwojICMgICBnZ3RpdGxlKCJUSEM6bmVnYXRpdmUgdmVyc3VzIFRIQzpwb3NpdGl2ZSBFeHByZXNzaW9uIikrCiMgIyAgIHhsYWIoImxvZzIgZm9sZCBjaGFuZ2UiKSsgCiMgIyAgIHlsYWIoIi1sb2cxMCBhZGp1c3RlZCBwLXZhbHVlIikrCiMgIyAgICMgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb249InR1cmJvIiwgZGlzY3JldGU9VFJVRSkrCiMgIyAgIHRoZW1lX21pbmltYWwoKSsKIyAjICAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjIpKSwKIyAjICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjIpKSwKIyAjICAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAojICMgICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgIyAgICAgICAgIHBhbmVsLmJvcmRlcj1lbGVtZW50X3JlY3QoY29sb3I9ImJsYWNrIiwgbGluZXdpZHRoPTEsIGZpbGw9TkEpLAojICMgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSksCiMgIyAgICAgICAgIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgpKSwKIyAjICAgICAgICAgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwKIyAjICAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2xpbmUobGluZXdpZHRoPTEpLAojICMgICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiLAojICMgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiMgIyAgICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiMgIyAgICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSkpCmBgYAoKKipBZGQgQW5ub3RhdGlvbiBJbmZvcm1hdGlvbiAoT3B0aW9uYWwpKioKPT09Ck9ubHkgcGVyZm9ybSBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb252ZXJzaW9ucyBiZWZvcmUgY29udGludWluZyBvbiB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb2RlIGJsb2NrLiBVbmNvbW1lbnQvY29tbWVudCBvdXQgdGhlIGFwcHJvcHJpYXRlIGNvbnZlcnNpb24gY29kZSBhcyBhcHByb3ByaWF0ZS4gIFRoZSBkZS1kdXBsaWNhdGlvbiBwcm9jZXNzIGNhbiByZXN1bHQgaW4gYSBjb25zaWRlcmFibGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHJlc3VsdHMgdGFibGUgYmVpbmcgcmVtb3ZlZCwgc28gb25seSBkbyB0aGlzIGlmIHlvdSBhYnNvbHV0ZWx5IG5lZWQgdG8gYWRkIGFubm90YXRpb24gaW5mb3JtYXRpb24gZm9yIGRvd25zdHJlYW0gcHJvY2Vzc2VzLgpgYGB7cn0KIyAjIyAgQ29udmVydCBmcm9tIGdlbmUgc3ltYm9sIHRvIEVuc2VtYmwgSURzIChvbmx5IGRvIHRoaXMgaWYgdGhlIGRkcyByZXN1bHRzIGhhcyBnZW5lIHN5bWJvbHMpLgojICMjICBSZXR1cm4gdGhlIElEcyBmb3IgdGhlIGdlbmUgc3ltYm9scyBpbiB0aGUgREUgcmVzdWx0cy4KIyBpZHg9Z3JjaDM4JHN5bWJvbCAlaW4lIHJvd25hbWVzKHJlc190YWJsZSkKIyBpZHM9Z3JjaDM4W2lkeCwgXQojICMjICBUaGUgZ2VuZSBuYW1lcyBjYW4gbWFwIHRvIG1vcmUgdGhhbiBvbmUgRW5zZW1ibCBJRCAoc29tZSBnZW5lcyBjaGFuZ2UgSUQgb3ZlciB0aW1lKSwgc28gZHVwbGljYXRlIElEcyBuZWVkIHRvIGJlIHJlbW92ZWQuCiMgbm9uX2R1cGxpY2F0ZXM9d2hpY2goZHVwbGljYXRlZChpZHMkc3ltYm9sKSA9PSBGQUxTRSkKIyBpZHM9aWRzW25vbl9kdXBsaWNhdGVzLCBdCiMgIyMgTWVyZ2UgdGhlIElEcyB3aXRoIHRoZSByZXN1bHRzLgojIHJlc19pZHM9aW5uZXJfam9pbihzaWcsIGlkcywgYnk9YygiZ2VuZSI9InN5bWJvbCIpKQoKIyBQQgojIyAgQ29udmVydCBmcm9tIEVuc2VtYmwgSURzIHRvIEVudHJleiBJRHMgKG9ubHkgZG8gdGhpcyBpZiB0aGUgZGRzIHJlc3VsdHMgaGFzIEVuc2VtYmwgSURzKS4KIyMgIFJldHVybiB0aGUgSURzIGZvciB0aGUgZ2VuZSBzeW1ib2xzIGluIHRoZSBERSByZXN1bHRzCmlkeF9QQj1ncmNoMzgkZW5zZ2VuZSAlaW4lIHJvd25hbWVzKHJlc190YWJsZV9QQikKaWRzX1BCPWdyY2gzOFtpZHhfUEIsIF0KIyMgIFRoZSBFbnRyZXogSURzIGNhbiBtYXAgdG8gbW9yZSB0aGFuIG9uZSBFbnNlbWJsIElEIChzb21lIGdlbmVzIGNoYW5nZSBJRCBvdmVyIHRpbWUpLCBzbyBkdXBsaWNhdGUgSURzIG5lZWQgdG8gYmUgcmVtb3ZlZC4Kbm9uX2R1cGxpY2F0ZXNfUEI9d2hpY2goZHVwbGljYXRlZChpZHNfUEIkZW50cmV6KSA9PSBGQUxTRSkKaWRzX1BCPWlkc19QQltub25fZHVwbGljYXRlc19QQiwgXQojIyBNZXJnZSB0aGUgSURzIHdpdGggdGhlIHJlc3VsdHMuCiMgU2lnbmlmaWNhbnQgREVHcwpyZXNfaWRzX1BCPWlubmVyX2pvaW4oc2lnX1BCLCBpZHNfUEIsIGJ5PWMoImdlbmUiPSJlbnNnZW5lIikpCiMgQWxsIGdlbmVzCmFsbF9pZHNfUEI9aW5uZXJfam9pbihyZXNfdGFibGVfdGJfUEIsIGlkc19QQiwgYnk9YygiZ2VuZSI9ImVuc2dlbmUiKSkKIyMgTW92ZSB0aGUgRW50cmV6IElEIGFuZCBnZW5lIHN5bWJvbCBjb2x1bW5zIHRvIGFmdGVyIHRoZSBFbnNlbWJsIElEIGNvbHVtbiwgdGhlbiBzaG93IHRoZSBtZXJnZWQgdGFibGUuCiMgU2lnbmlmaWNhbnQgREVHcwpyZXNfaWRzX1BCPXJlc19pZHNfUEIgJT4lCiAgcmVsb2NhdGUoZW50cmV6LCAuYWZ0ZXI9Z2VuZSkgJT4lCiAgcmVsb2NhdGUoc3ltYm9sLCAuYWZ0ZXI9ZW50cmV6KQpyZXNfaWRzX1BCCndyaXRlLmNzdihyZXNfaWRzX1BCLCAiZ2VuY29kZV9PdXRwdXRfRmlsZXMvUEJfVEhDX3NpZ19ERUdzX2Fubm90YXRlZC5jc3YiLCBxdW90ZT1GQUxTRSwgcm93Lm5hbWVzPUZBTFNFKQojIEFsbCBnZW5lcwphbGxfaWRzX1BCPWFsbF9pZHNfUEIgJT4lCiAgcmVsb2NhdGUoZW50cmV6LCAuYWZ0ZXI9Z2VuZSkgJT4lCiAgcmVsb2NhdGUoc3ltYm9sLCAuYWZ0ZXI9ZW50cmV6KQphbGxfaWRzX1BCCndyaXRlLmNzdihhbGxfaWRzX1BCLCAiZ2VuY29kZV9PdXRwdXRfRmlsZXMvUEJfVEhDX2FsbF9nZW5lc19hbm5vdGF0ZWQuY3N2IiwgcXVvdGU9RkFMU0UsIHJvdy5uYW1lcz1GQUxTRSkKCiMgUEwKIyMgIENvbnZlcnQgZnJvbSBFbnNlbWJsIElEcyB0byBFbnRyZXogSURzIChvbmx5IGRvIHRoaXMgaWYgdGhlIGRkcyByZXN1bHRzIGhhcyBFbnNlbWJsIElEcykuCiMjICBSZXR1cm4gdGhlIElEcyBmb3IgdGhlIGdlbmUgc3ltYm9scyBpbiB0aGUgREUgcmVzdWx0cwppZHhfUEw9Z3JjaDM4JGVuc2dlbmUgJWluJSByb3duYW1lcyhyZXNfdGFibGVfUEwpCmlkc19QTD1ncmNoMzhbaWR4X1BMLCBdCiMjICBUaGUgRW50cmV6IElEcyBjYW4gbWFwIHRvIG1vcmUgdGhhbiBvbmUgRW5zZW1ibCBJRCAoc29tZSBnZW5lcyBjaGFuZ2UgSUQgb3ZlciB0aW1lKSwgc28gZHVwbGljYXRlIElEcyBuZWVkIHRvIGJlIHJlbW92ZWQuCm5vbl9kdXBsaWNhdGVzX1BMPXdoaWNoKGR1cGxpY2F0ZWQoaWRzX1BMJGVudHJleikgPT0gRkFMU0UpCmlkc19QTD1pZHNfUExbbm9uX2R1cGxpY2F0ZXNfUEwsIF0KIyMgTWVyZ2UgdGhlIElEcyB3aXRoIHRoZSByZXN1bHRzLgojIFNpZ25pZmljYW50IERFR3MKcmVzX2lkc19QTD1pbm5lcl9qb2luKHNpZ19QTCwgaWRzX1BMLCBieT1jKCJnZW5lIj0iZW5zZ2VuZSIpKQojIEFsbCBnZW5lcwphbGxfaWRzX1BMPWlubmVyX2pvaW4ocmVzX3RhYmxlX3RiX1BMLCBpZHNfUEwsIGJ5PWMoImdlbmUiPSJlbnNnZW5lIikpCiMjIE1vdmUgdGhlIEVudHJleiBJRCBhbmQgZ2VuZSBzeW1ib2wgY29sdW1ucyB0byBhZnRlciB0aGUgRW5zZW1ibCBJRCBjb2x1bW4sIHRoZW4gc2hvdyB0aGUgbWVyZ2VkIHRhYmxlLgojIFNpZ25pZmljYW50IERFR3MKcmVzX2lkc19QTD1yZXNfaWRzX1BMICU+JQogIHJlbG9jYXRlKGVudHJleiwgLmFmdGVyPWdlbmUpICU+JQogIHJlbG9jYXRlKHN5bWJvbCwgLmFmdGVyPWVudHJleikKcmVzX2lkc19QTAp3cml0ZS5jc3YocmVzX2lkc19QTCwgImdlbmNvZGVfT3V0cHV0X0ZpbGVzL1BMX1RIQ19zaWdfREVHc19hbm5vdGF0ZWQuY3N2IiwgcXVvdGU9RkFMU0UsIHJvdy5uYW1lcz1GQUxTRSkKIyBBbGwgZ2VuZXMKYWxsX2lkc19QTD1hbGxfaWRzX1BMICU+JQogIHJlbG9jYXRlKGVudHJleiwgLmFmdGVyPWdlbmUpICU+JQogIHJlbG9jYXRlKHN5bWJvbCwgLmFmdGVyPWVudHJleikKYWxsX2lkc19QTAp3cml0ZS5jc3YoYWxsX2lkc19QTCwgImdlbmNvZGVfT3V0cHV0X0ZpbGVzL1BMX1RIQ19hbGxfZ2VuZXNfYW5ub3RhdGVkLmNzdiIsIHF1b3RlPUZBTFNFLCByb3cubmFtZXM9RkFMU0UpCgojIFBNCiMjICBDb252ZXJ0IGZyb20gRW5zZW1ibCBJRHMgdG8gRW50cmV6IElEcyAob25seSBkbyB0aGlzIGlmIHRoZSBkZHMgcmVzdWx0cyBoYXMgRW5zZW1ibCBJRHMpLgojIyAgUmV0dXJuIHRoZSBJRHMgZm9yIHRoZSBnZW5lIHN5bWJvbHMgaW4gdGhlIERFIHJlc3VsdHMKaWR4X1BNPWdyY2gzOCRlbnNnZW5lICVpbiUgcm93bmFtZXMocmVzX3RhYmxlX1BNKQppZHNfUE09Z3JjaDM4W2lkeF9QTSwgXQojIyAgVGhlIEVudHJleiBJRHMgY2FuIG1hcCB0byBtb3JlIHRoYW4gb25lIEVuc2VtYmwgSUQgKHNvbWUgZ2VuZXMgY2hhbmdlIElEIG92ZXIgdGltZSksIHNvIGR1cGxpY2F0ZSBJRHMgbmVlZCB0byBiZSByZW1vdmVkLgpub25fZHVwbGljYXRlc19QTT13aGljaChkdXBsaWNhdGVkKGlkc19QTSRlbnRyZXopID09IEZBTFNFKQppZHNfUE09aWRzX1BNW25vbl9kdXBsaWNhdGVzX1BNLCBdCiMjIE1lcmdlIHRoZSBJRHMgd2l0aCB0aGUgcmVzdWx0cy4KIyBTaWduaWZpY2FudCBERUdzCnJlc19pZHNfUE09aW5uZXJfam9pbihzaWdfUE0sIGlkc19QTSwgYnk9YygiZ2VuZSI9ImVuc2dlbmUiKSkKIyBBbGwgZ2VuZXMKYWxsX2lkc19QTT1pbm5lcl9qb2luKHJlc190YWJsZV90Yl9QTSwgaWRzX1BNLCBieT1jKCJnZW5lIj0iZW5zZ2VuZSIpKQojIyBNb3ZlIHRoZSBFbnRyZXogSUQgYW5kIGdlbmUgc3ltYm9sIGNvbHVtbnMgdG8gYWZ0ZXIgdGhlIEVuc2VtYmwgSUQgY29sdW1uLCB0aGVuIHNob3cgdGhlIG1lcmdlZCB0YWJsZS4KIyBTaWduaWZpY2FudCBERUdzCnJlc19pZHNfUE09cmVzX2lkc19QTSAlPiUKICByZWxvY2F0ZShlbnRyZXosIC5hZnRlcj1nZW5lKSAlPiUKICByZWxvY2F0ZShzeW1ib2wsIC5hZnRlcj1lbnRyZXopCnJlc19pZHNfUE0Kd3JpdGUuY3N2KHJlc19pZHNfUE0sICJnZW5jb2RlX091dHB1dF9GaWxlcy9QTV9USENfc2lnX0RFR3NfYW5ub3RhdGVkLmNzdiIsIHF1b3RlPUZBTFNFLCByb3cubmFtZXM9RkFMU0UpCiMgQWxsIGdlbmVzCmFsbF9pZHNfUE09YWxsX2lkc19QTSAlPiUKICByZWxvY2F0ZShlbnRyZXosIC5hZnRlcj1nZW5lKSAlPiUKICByZWxvY2F0ZShzeW1ib2wsIC5hZnRlcj1lbnRyZXopCmFsbF9pZHNfUE0Kd3JpdGUuY3N2KGFsbF9pZHNfUE0sICJnZW5jb2RlX091dHB1dF9GaWxlcy9QTV9USENfYWxsX2dlbmVzX2Fubm90YXRlZC5jc3YiLCBxdW90ZT1GQUxTRSwgcm93Lm5hbWVzPUZBTFNFKQoKIyBQUwojIyAgQ29udmVydCBmcm9tIEVuc2VtYmwgSURzIHRvIEVudHJleiBJRHMgKG9ubHkgZG8gdGhpcyBpZiB0aGUgZGRzIHJlc3VsdHMgaGFzIEVuc2VtYmwgSURzKS4KIyMgIFJldHVybiB0aGUgSURzIGZvciB0aGUgZ2VuZSBzeW1ib2xzIGluIHRoZSBERSByZXN1bHRzCmlkeF9QUz1ncmNoMzgkZW5zZ2VuZSAlaW4lIHJvd25hbWVzKHJlc190YWJsZV9QUykKaWRzX1BTPWdyY2gzOFtpZHhfUFMsIF0KIyMgIFRoZSBFbnRyZXogSURzIGNhbiBtYXAgdG8gbW9yZSB0aGFuIG9uZSBFbnNlbWJsIElEIChzb21lIGdlbmVzIGNoYW5nZSBJRCBvdmVyIHRpbWUpLCBzbyBkdXBsaWNhdGUgSURzIG5lZWQgdG8gYmUgcmVtb3ZlZC4Kbm9uX2R1cGxpY2F0ZXNfUFM9d2hpY2goZHVwbGljYXRlZChpZHNfUFMkZW50cmV6KSA9PSBGQUxTRSkKaWRzX1BTPWlkc19QU1tub25fZHVwbGljYXRlc19QUywgXQojIyBNZXJnZSB0aGUgSURzIHdpdGggdGhlIHJlc3VsdHMuCiMgU2lnbmlmaWNhbnQgREVHcwpyZXNfaWRzX1BTPWlubmVyX2pvaW4oc2lnX1BTLCBpZHNfUFMsIGJ5PWMoImdlbmUiPSJlbnNnZW5lIikpCiMgQWxsIGdlbmVzCmFsbF9pZHNfUFM9aW5uZXJfam9pbihyZXNfdGFibGVfdGJfUFMsIGlkc19QUywgYnk9YygiZ2VuZSI9ImVuc2dlbmUiKSkKIyMgTW92ZSB0aGUgRW50cmV6IElEIGFuZCBnZW5lIHN5bWJvbCBjb2x1bW5zIHRvIGFmdGVyIHRoZSBFbnNlbWJsIElEIGNvbHVtbiwgdGhlbiBzaG93IHRoZSBtZXJnZWQgdGFibGUuCiMgU2lnbmlmaWNhbnQgREVHcwpyZXNfaWRzX1BTPXJlc19pZHNfUFMgJT4lCiAgcmVsb2NhdGUoZW50cmV6LCAuYWZ0ZXI9Z2VuZSkgJT4lCiAgcmVsb2NhdGUoc3ltYm9sLCAuYWZ0ZXI9ZW50cmV6KQpyZXNfaWRzX1BTCndyaXRlLmNzdihyZXNfaWRzX1BTLCAiZ2VuY29kZV9PdXRwdXRfRmlsZXMvUFNfVEhDX3NpZ19ERUdzX2Fubm90YXRlZC5jc3YiLCBxdW90ZT1GQUxTRSwgcm93Lm5hbWVzPUZBTFNFKQojIEFsbCBnZW5lcwphbGxfaWRzX1BTPWFsbF9pZHNfUFMgJT4lCiAgcmVsb2NhdGUoZW50cmV6LCAuYWZ0ZXI9Z2VuZSkgJT4lCiAgcmVsb2NhdGUoc3ltYm9sLCAuYWZ0ZXI9ZW50cmV6KQphbGxfaWRzX1BTCndyaXRlLmNzdihhbGxfaWRzX1BTLCAiZ2VuY29kZV9PdXRwdXRfRmlsZXMvUFNfVEhDX2FsbF9nZW5lc19hbm5vdGF0ZWQuY3N2IiwgcXVvdGU9RkFMU0UsIHJvdy5uYW1lcz1GQUxTRSkKYGBgCgpBbm5vdGF0ZWQgU2lnbmlmaWNhbnQgREVHIFRhYmxlcwpgYGB7cn0KIyBQTApmaW5hbF9yZXNfaWRzX1BMPWFzLmRhdGEuZnJhbWUocmVzX2lkc19QTCkKZmluYWxfcmVzX2lkc19QTFssNDo2XT1hcy5kYXRhLmZyYW1lKHJvdW5kKGZpbmFsX3Jlc19pZHNfUExbLDQ6Nl0sIGRpZ2l0cz0zKSkKZmluYWxfcmVzX2lkc19QTFssNzo4XT1mb3JtYXQoZmluYWxfcmVzX2lkc19QTFssNzo4XSwgc2NpZW50aWZpYz1UUlVFLCBkaWdpdHM9MykKdGFibGVfUEw9ZmxleHRhYmxlKGRhdGE9ZmluYWxfcmVzX2lkc19QTCkKdGFibGVfUEw9dGFibGVfUEwgJT4lCiAgYm9sZChib2xkPVRSVUUsIHBhcnQ9ImhlYWRlciIpICU+JQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dD0iYXV0b2ZpdCIpICU+JQogIGZpdF90b193aWR0aCgxMCkKdGFibGVfUEwKCiMgUE0KZmluYWxfcmVzX2lkc19QTT1hcy5kYXRhLmZyYW1lKHJlc19pZHNfUE0pCmZpbmFsX3Jlc19pZHNfUE1bLDQ6Nl09YXMuZGF0YS5mcmFtZShyb3VuZChmaW5hbF9yZXNfaWRzX1BNWyw0OjZdLCBkaWdpdHM9MykpCmZpbmFsX3Jlc19pZHNfUE1bLDc6OF09Zm9ybWF0KGZpbmFsX3Jlc19pZHNfUE1bLDc6OF0sIHNjaWVudGlmaWM9VFJVRSwgZGlnaXRzPTMpCnRhYmxlX1BNPWZsZXh0YWJsZShkYXRhPWZpbmFsX3Jlc19pZHNfUE0pCnRhYmxlX1BNPXRhYmxlX1BNICU+JQogIGJvbGQoYm9sZD1UUlVFLCBwYXJ0PSJoZWFkZXIiKSAlPiUKICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQ9ImF1dG9maXQiKSAlPiUKICBmaXRfdG9fd2lkdGgoOS4xOSkKdGFibGVfUE0KCnNlY3RfcHJvcGVydGllcz1wcm9wX3NlY3Rpb24oCiAgcGFnZV9zaXplPXBhZ2Vfc2l6ZSgKICAgIG9yaWVudD0ibGFuZHNjYXBlIiwKICAgIHdpZHRoPTguNSwgaGVpZ2h0PTExKSwKICB0eXBlPSJjb250aW51b3VzIiwKICBwYWdlX21hcmdpbnM9cGFnZV9tYXIoKSkKc2F2ZV9hc19kb2N4KHRhYmxlX1BMLCB0YWJsZV9QTSwKICAgICAgICAgICAgIHBhdGg9InBvc3Rtb3J0ZW1fdGFibGVzLmRvY3giLCBwcl9zZWN0aW9uPXNlY3RfcHJvcGVydGllcykKYGBgCgoqKkFkZGVuZHVtOiBSTkEgTWV0cmljcyoqCj09PQpgYGB7cn0KIyMgU3VtbWFyaXplIGRhdGE6IG9taXQgcm93cyBjb250YWluaW5nIE5BcywgZ3JvdXAgZGF0YSBieSAidGlzc3VlIiwgdGhlbiBjYWxjdWxhdGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciAiY29uY2VudHJhdGlvbiwiICJBMjYwXzI4MCwiICJBMjYwXzIzMCwiIGFuZCAiUklOIiBhbmQgZ2VuZXJhdGUgYSB0YWJsZSB3aXRoIHRoZSBvdXRwdXQKdGlzc3VlX2RhdGFfbmE9bmEub21pdChtZXRhZGF0YV9hbGwpCnRpc3N1ZV9kYXRhLnN1bW1hcnk9dGlzc3VlX2RhdGFfbmEgJT4lCiAgZ3JvdXBfYnkodGlzc3VlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuX2NvbmM9bWVhbihjb25jZW50cmF0aW9uKSwKICAgIHNkX2NvbmM9c2QoY29uY2VudHJhdGlvbiksCiAgICBtZWFuX1JJTj1tZWFuKFJJTiksCiAgICBzZF9SSU49c2QoUklOKSwKICAgIG1lYW5fQTI2MF8yODA9bWVhbihBMjYwXzI4MCksCiAgICBzZF9BMjYwXzI4MD1zZChBMjYwXzI4MCksCiAgICBtZWFuX0EyNjBfMjMwPW1lYW4oQTI2MF8yMzApLAogICAgc2RfQTI2MF8yMzA9c2QoQTI2MF8yMzApCiAgKQp0aXNzdWVfZGF0YS5zdW1tYXJ5Cgp0aXNzdWVfZGF0YV9uYSAlPiUKICBzdW1tYXJpc2UobWVhbihSSU4pLCBzZChSSU4pKQoKUk5BX3N0YXRzX1BNPWFzLmRhdGEuZnJhbWUodGlzc3VlX2RhdGEuc3VtbWFyeSkKUk5BX3N0YXRzX1BNWywyOjldPWFzLmRhdGEuZnJhbWUocm91bmQoUk5BX3N0YXRzX1BNWywyOjldLCBkaWdpdHM9MykpCnRhYmxlX1JOQV9zdGF0cz1mbGV4dGFibGUoZGF0YT1STkFfc3RhdHNfUE0pCnRhYmxlX1JOQV9zdGF0cz10YWJsZV9STkFfc3RhdHMgJT4lCiAgYm9sZChib2xkPVRSVUUsIHBhcnQ9ImhlYWRlciIpICU+JQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dD0iYXV0b2ZpdCIpICU+JQogIGZpdF90b193aWR0aCg2KQp0YWJsZV9STkFfc3RhdHMKCnNhdmVfYXNfZG9jeCh0YWJsZV9STkFfc3RhdHMsIHBhdGg9InBvc3Rtb3J0ZW1fUk5BX3RhYmxlcy5kb2N4IiwgcHJfc2VjdGlvbj1zZWN0X3Byb3BlcnRpZXMpCmBgYApgYGB7cn0KIyBDb25jZW50cmF0aW9uClJOQTE9Z2dwbG90KCkrCiAgIyBjcmVhdGUgYm94cGxvdCBsYXllcgogIGdlb21fYm94cGxvdChkYXRhPXRpc3N1ZV9kYXRhX25hLCBhZXMoeD10aXNzdWUsIHk9Y29uY2VudHJhdGlvbiwgZmlsbD10aXNzdWUpLCAKICAgICAgICAgICAgICAgd2lkdGg9MC43NSwgbHdkPTAuNzUsIHNob3cubGVnZW5kPUZBTFNFKSsKICAjIHNldCB0aGUgeC1heGlzIHNjYWxlIHRvIHRoZSBsaW1pdHMgYW5kIGxhYmVscyBkZWZpbmVkIGJlbG93CiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygiYnJhaW4iLCAibHVuZyIsICJtdXNjbGUiLCAiYmxvb2QiKSwKICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJCcmFpbiIsICJMdW5nIiwgIk11c2NsZSIsICJCbG9vZCIpKSsKICAjIHNldCBmaWxsIGNvbG9yIHNjYWxlCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWFscGhhKGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiksIDAuMjUpLCBndWlkZT0ibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoImJyYWluIiwgImx1bmciLCAibXVzY2xlIiwgImJsb29kIiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkJyYWluIiwgIkx1bmciLCAiTXVzY2xlIiwgIkJsb29kIikpKwogICMgY2hhbmdlIHBsb3Qgc2NhbGluZyByYXRpbwogIGNvb3JkX2ZpeGVkKHJhdGlvPTEvMzA1KSsgIAogICMgZGVmaW5lIHRoZW1lIHZhcmlhYmxlcyAgCiAgdGhlbWVfbWluaW1hbCgpKwogIHRoZW1lKGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMSkpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0zMCwgaGp1c3Q9MSwgY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKICAgICAgICAjIGF4aXMudGl0bGUueD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuODApKSwKICAgICAgICBheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKICAgICAgICBwYW5lbC5ib3JkZXI9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xLCBmaWxsPU5BKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLmJhY2tncm91bmQ9ZWxlbWVudF9yZWN0KGNvbG9yPSJibGFjayIsIGxpbmV3aWR0aD0xKSwKICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC44KSksCiAgICAgICAgYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfbGluZShsaW5ld2lkdGg9MSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgICAgICBsZWdlbmQua2V5LnNpemU9dW5pdChyZWwoMC41MCksICJjbSIpLCAKICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjYwKSksCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjYwKSksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKICAgICAgICBwbG90Lm1hcmdpbj11bml0KGMoMC4xMCwgMC4xMCwgMC4xMCwgMC4xMCksICJjbSIpKSsKICAjIHgtYXhpcyBsYWJlbCAgCiAgeGxhYigiVGlzc3VlIikrCiAgIyB5LWF4aXMgbGFiZWwgIAogIHlsYWIoIkNvbmNlbnRyYXRpb24gKG5nL1x1MDBCNUwpIikKCiMgQTI2MF8yODAKUk5BMj1nZ3Bsb3QoKSsKICAjIGNyZWF0ZSBib3hwbG90IGxheWVyCiAgZ2VvbV9ib3hwbG90KGRhdGE9dGlzc3VlX2RhdGFfbmEsIGFlcyh4PXRpc3N1ZSwgeT1BMjYwXzI4MCwgZmlsbD10aXNzdWUpLCAKICAgICAgICAgICAgICAgd2lkdGg9MC43NSwgbHdkPTAuNzUsIHNob3cubGVnZW5kPUZBTFNFKSsKICAjIHNldCB0aGUgeC1heGlzIHNjYWxlIHRvIHRoZSBsaW1pdHMgYW5kIGxhYmVscyBkZWZpbmVkIGJlbG93CiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygiYnJhaW4iLCAibHVuZyIsICJtdXNjbGUiLCAiYmxvb2QiKSwKICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJCcmFpbiIsICJMdW5nIiwgIk11c2NsZSIsICJCbG9vZCIpKSsKICAjIHNldCBmaWxsIGNvbG9yIHNjYWxlCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWFscGhhKGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiksIDAuMjUpLCBndWlkZT0ibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoImJyYWluIiwgImx1bmciLCAibXVzY2xlIiwgImJsb29kIiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkJyYWluIiwgIkx1bmciLCAiTXVzY2xlIiwgIkJsb29kIikpKwogICMgY2hhbmdlIHBsb3Qgc2NhbGluZyByYXRpbwogIGNvb3JkX2ZpeGVkKHJhdGlvPTIwLjUvMSkrICAKICAjIGRlZmluZSB0aGVtZSB2YXJpYWJsZXMgIAogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEsIGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgIyBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgwKSksCiAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSwgZmlsbD1OQSksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSksCiAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgIGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2xpbmUobGluZXdpZHRoPTEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICAgICAgbGVnZW5kLmtleS5zaXplPXVuaXQocmVsKDAuNTApLCAiY20iKSwgCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC42MCkpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC42MCkpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgcGxvdC5tYXJnaW49dW5pdChjKDAuMTAsIDAuMTAsIDAuMTAsIDAuMTApLCAiY20iKSkrCiAgIyB4LWF4aXMgbGFiZWwgIAogIHhsYWIoIlRpc3N1ZSIpKwogICMgeS1heGlzIGxhYmVsICAKICB5bGFiKCJBMjYwLzI4MCBSYXRpbyIpCgojIEEyNjBfMjMwClJOQTM9Z2dwbG90KCkrCiAgIyBjcmVhdGUgYm94cGxvdCBsYXllcgogIGdlb21fYm94cGxvdChkYXRhPXRpc3N1ZV9kYXRhX25hLCBhZXMoeD10aXNzdWUsIHk9QTI2MF8yMzAsIGZpbGw9dGlzc3VlKSwgCiAgICAgICAgICAgICAgIHdpZHRoPTAuNzUsIGx3ZD0wLjc1LCBzaG93LmxlZ2VuZD1GQUxTRSkrCiAgIyBzZXQgdGhlIHgtYXhpcyBzY2FsZSB0byB0aGUgbGltaXRzIGFuZCBsYWJlbHMgZGVmaW5lZCBiZWxvdwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzPWMoImJyYWluIiwgImx1bmciLCAibXVzY2xlIiwgImJsb29kIiksCiAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQnJhaW4iLCAiTHVuZyIsICJNdXNjbGUiLCAiQmxvb2QiKSkrCiAgIyBzZXQgZmlsbCBjb2xvciBzY2FsZQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1hbHBoYShjKCJibGFjayIsICJibGFjayIsICJibGFjayIsICJibGFjayIsICJibGFjayIsICJibGFjayIpLCAwLjI1KSwgZ3VpZGU9Im5vbmUiLAogICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKCJicmFpbiIsICJsdW5nIiwgIm11c2NsZSIsICJibG9vZCIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJCcmFpbiIsICJMdW5nIiwgIk11c2NsZSIsICJCbG9vZCIpKSsKICAjIGNoYW5nZSBwbG90IHNjYWxpbmcgcmF0aW8KICBjb29yZF9maXhlZChyYXRpbz04LjIvMSkrICAKICAjIGRlZmluZSB0aGVtZSB2YXJpYWJsZXMgIAogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEsIGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgIyBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgwKSksCiAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSwgZmlsbD1OQSksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSksCiAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgIGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2xpbmUobGluZXdpZHRoPTEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICAgICAgbGVnZW5kLmtleS5zaXplPXVuaXQocmVsKDAuNTApLCAiY20iKSwgCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC42MCkpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC42MCkpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgcGxvdC5tYXJnaW49dW5pdChjKDAuMTAsIDAuMTAsIDAuMTAsIDAuMTApLCAiY20iKSkrCiAgIyB4LWF4aXMgbGFiZWwgIAogIHhsYWIoIlRpc3N1ZSIpKwogICMgeS1heGlzIGxhYmVsICAKICB5bGFiKCJBMjYwLzIzMCBSYXRpbyIpCgojIFJJTgpSTkE0PWdncGxvdCgpKwogICMgY3JlYXRlIGJveHBsb3QgbGF5ZXIKICBnZW9tX2JveHBsb3QoZGF0YT10aXNzdWVfZGF0YV9uYSwgYWVzKHg9dGlzc3VlLCB5PVJJTiwgZmlsbD10aXNzdWUpLCAKICAgICAgICAgICAgICAgd2lkdGg9MC43NSwgbHdkPTAuNzUsIHNob3cubGVnZW5kPUZBTFNFKSsKICAjIHNldCB0aGUgeC1heGlzIHNjYWxlIHRvIHRoZSBsaW1pdHMgYW5kIGxhYmVscyBkZWZpbmVkIGJlbG93CiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygiYnJhaW4iLCAibHVuZyIsICJtdXNjbGUiLCAiYmxvb2QiKSwKICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJCcmFpbiIsICJMdW5nIiwgIk11c2NsZSIsICJCbG9vZCIpKSsKICAjIHNldCBmaWxsIGNvbG9yIHNjYWxlCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWFscGhhKGMoImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiwgImJsYWNrIiksIDAuMjUpLCBndWlkZT0ibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoImJyYWluIiwgImx1bmciLCAibXVzY2xlIiwgImJsb29kIiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkJyYWluIiwgIkx1bmciLCAiTXVzY2xlIiwgIkJsb29kIikpKwogICMgY2hhbmdlIHBsb3Qgc2NhbGluZyByYXRpbwogIGNvb3JkX2ZpeGVkKHJhdGlvPTEuMjUvMSkrICAKICAjIGRlZmluZSB0aGVtZSB2YXJpYWJsZXMgIAogIHRoZW1lX21pbmltYWwoKSsKICB0aGVtZShheGlzLnRleHQueT1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEpKSwKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEsIGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgIyBheGlzLnRpdGxlLng9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgwLjgwKSksCiAgICAgICAgYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnk9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgcGFuZWwuYm9yZGVyPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSwgZmlsbD1OQSksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChjb2xvcj0iYmxhY2siLCBsaW5ld2lkdGg9MSksCiAgICAgICAgc3RyaXAudGV4dD1lbGVtZW50X3RleHQoY29sb3I9ImJsYWNrIiwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDAuOCkpLAogICAgICAgIGF4aXMubGluZT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2xpbmUobGluZXdpZHRoPTEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICAgICAgbGVnZW5kLmtleS5zaXplPXVuaXQocmVsKDAuNTApLCAiY20iKSwgCiAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC42MCkpLAogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siLCBmYWNlPSJib2xkIiwgc2l6ZT1yZWwoMC42MCkpLAogICAgICAgIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxKSksCiAgICAgICAgcGxvdC5tYXJnaW49dW5pdChjKDAuMTAsIDAuMTAsIDAuMTAsIDAuMTApLCAiY20iKSkrCiAgIyB4LWF4aXMgbGFiZWwgIAogIHhsYWIoIlRpc3N1ZSIpKwogICMgeS1heGlzIGxhYmVsICAKICB5bGFiKCJSTkEgSW50ZWdyaXR5IE51bWJlciIpCmBgYAoKUk5BIFN0YXRpc3RpY3MgQ29tYmluZWQgRmlndXJlCi0tLQpgYGB7cn0KUk5BX3BhdGNod29yaz1STkExICsgUk5BNCArIFJOQTIgKyBSTkEzICsgcGxvdF9sYXlvdXQobmNvbD0yKQpSTkFfcGF0Y2h3b3JrICsgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHM9IkEiKQpnZ3NhdmUoIlBNX1JOQV9wbG90cy5wbmciLCB3aWR0aD00Ljg0NSwgaGVpZ2h0PTgsIHVuaXQ9ImluIiwgZHBpPTMyMCkKYGBg