1 Course Description

High-throughput ’omics studies generate ever larger datasets and, as a consequence, complex data interpretation challenges. This course focusses on statistical concepts involved in preprocessing, quantification and differential analysis of high-throughput ’omics data. The core focus will be on shotgun proteomics and (bulk and single-cell) RNA-sequencing. Experimental design is essential to allow for correct interpretation in all ’omics studies, and we will cover how to design a statistically efficient experiment, as well as discuss the impact experimental design has on how we model ’omics data, introducing concepts such as blocking. The course will rely exclusively on free and user-friendly open-source tools in R/Bioconductor. We hope that this will provide a solid basis for beginners, but will also bring new perspectives to those already familiar with standard data analysis workflows for proteomics and next-generation sequencing applications.

2 Target Audience

This course is oriented towards biologists and bioinformaticians with a particular interest in differential analysis for quantitative ’omics data.

3 GitHub repository

All source and data files for this course are available on the accompanying GitHub repository.

4 Prerequisites

The prerequisites for the Statistical Genomics Analysis course are the successful completion of a basic course of statistics that covers topics on data exploration and descriptive statistics, statistical modeling, and inference: linear models, confidence intervals, t-tests, F-tests, anova, chi-squared test. The basis concepts may be revisited in the online course at https://gtpb.github.io/PSLS20/ (English) and in https://statomics.github.io/statistiekCursusNotas/ (Dutch).

In addition, knowledge of programming in R is preferred. A primer to R and Data visualization in R can be found at:

5 Software

  • Participants are required to bring their own laptop with R version 4.1.1 or greater.

  • We also recommend to also install the latest version of RStudio.

  • Installation script: to install all required packages, please copy and paste this line of code in your R console.

source("https://raw.githubusercontent.com/statOmics/SGA21/master/install.R")
  • Participants who have issues with the installation of the R/Rstudio can use an Rstudio instance in the cloud with all packages installed for the course in the mean time. Note, that this is instance is not for routine use.

Binder

6 Detailed Program

  1. Position of the course: PDF

  2. Recap Linear Models (Week 1)

6.1 Module I: Proteomics Data Analysis (Week 1-5)

  1. Bioinformatics for proteomics

  1. Preprocessing & Analysis of Simple Designs (week 3)

  1. Statistical Inference & Analysis of Factorial Designs (Week 3-4)

  2. Advanced materials and reading materials

  3. Solutions

6.2 Module II: Bulk RNA-sequencing

  1. Introduction to sequencing technology, raw data and preprocessing.

  1. Working with count data and generalized linear models.

  1. Analysis of RNA-seq data.

  1. Technical topics in bulk RNA-seq differential expression analysis (DEA).

6.3 Module III: Single-cell RNA-sequencing

  1. General concepts and analysis workflow of single-cell RNA-seq data.

LS0tCnRpdGxlOiAiU3RhdGlzdGljYWwgR2Vub21pY3MgQW5hbHlzaXMgMjAyMS0yMDIyIgotLS0KCgpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiLi9maWd1cmVzL3dwR3JhcGguanBlZyIpCmBgYAoKIyBDb3Vyc2UgRGVzY3JpcHRpb24KCkhpZ2gtdGhyb3VnaHB1dCAnb21pY3Mgc3R1ZGllcyBnZW5lcmF0ZSBldmVyIGxhcmdlciBkYXRhc2V0cyBhbmQsIGFzIGEgY29uc2VxdWVuY2UsIGNvbXBsZXggZGF0YSBpbnRlcnByZXRhdGlvbiBjaGFsbGVuZ2VzLiBUaGlzIGNvdXJzZSBmb2N1c3NlcyBvbiBzdGF0aXN0aWNhbCBjb25jZXB0cyBpbnZvbHZlZCBpbiBwcmVwcm9jZXNzaW5nLCBxdWFudGlmaWNhdGlvbiBhbmQgZGlmZmVyZW50aWFsIGFuYWx5c2lzIG9mIGhpZ2gtdGhyb3VnaHB1dCAnb21pY3MgZGF0YS4gVGhlIGNvcmUgZm9jdXMgd2lsbCBiZSBvbiBzaG90Z3VuIHByb3Rlb21pY3MgYW5kIChidWxrIGFuZCBzaW5nbGUtY2VsbCkgUk5BLXNlcXVlbmNpbmcuIEV4cGVyaW1lbnRhbCBkZXNpZ24gaXMgZXNzZW50aWFsIHRvIGFsbG93IGZvciBjb3JyZWN0IGludGVycHJldGF0aW9uIGluIGFsbCAnb21pY3Mgc3R1ZGllcywgYW5kIHdlIHdpbGwgY292ZXIgaG93IHRvIGRlc2lnbiBhIHN0YXRpc3RpY2FsbHkgZWZmaWNpZW50IGV4cGVyaW1lbnQsIGFzIHdlbGwgYXMgZGlzY3VzcyB0aGUgaW1wYWN0IGV4cGVyaW1lbnRhbCBkZXNpZ24gaGFzIG9uIGhvdyB3ZSBtb2RlbCAnb21pY3MgZGF0YSwgaW50cm9kdWNpbmcgY29uY2VwdHMgc3VjaCBhcyBibG9ja2luZy4gVGhlIGNvdXJzZSB3aWxsIHJlbHkgZXhjbHVzaXZlbHkgb24gZnJlZSBhbmQgdXNlci1mcmllbmRseSBvcGVuLXNvdXJjZSB0b29scyBpbiBSL0Jpb2NvbmR1Y3Rvci4gV2UgaG9wZSB0aGF0IHRoaXMgd2lsbCBwcm92aWRlIGEgc29saWQgYmFzaXMgZm9yIGJlZ2lubmVycywgYnV0IHdpbGwgYWxzbyBicmluZyBuZXcgcGVyc3BlY3RpdmVzIHRvIHRob3NlIGFscmVhZHkgZmFtaWxpYXIgd2l0aCBzdGFuZGFyZCBkYXRhIGFuYWx5c2lzIHdvcmtmbG93cyBmb3IgcHJvdGVvbWljcyBhbmQgbmV4dC1nZW5lcmF0aW9uIHNlcXVlbmNpbmcgYXBwbGljYXRpb25zLgoKIyBUYXJnZXQgQXVkaWVuY2UKClRoaXMgY291cnNlIGlzIG9yaWVudGVkIHRvd2FyZHMgYmlvbG9naXN0cyBhbmQgYmlvaW5mb3JtYXRpY2lhbnMgd2l0aCBhIHBhcnRpY3VsYXIgaW50ZXJlc3QgaW4gZGlmZmVyZW50aWFsIGFuYWx5c2lzIGZvciBxdWFudGl0YXRpdmUgJ29taWNzIGRhdGEuCgojIEdpdEh1YiByZXBvc2l0b3J5CgpBbGwgc291cmNlIGFuZCBkYXRhIGZpbGVzIGZvciB0aGlzIGNvdXJzZSBhcmUgYXZhaWxhYmxlIG9uIHRoZSBhY2NvbXBhbnlpbmcgW0dpdEh1YiByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5jb20vc3RhdE9taWNzL1NHQTIxKS4KCiMgUHJlcmVxdWlzaXRlcwoKVGhlIHByZXJlcXVpc2l0ZXMgZm9yIHRoZSBTdGF0aXN0aWNhbCBHZW5vbWljcyBBbmFseXNpcyBjb3Vyc2UgYXJlIHRoZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYSBiYXNpYyBjb3Vyc2Ugb2Ygc3RhdGlzdGljcyB0aGF0IGNvdmVycyB0b3BpY3Mgb24gZGF0YSBleHBsb3JhdGlvbiBhbmQgZGVzY3JpcHRpdmUgc3RhdGlzdGljcywgc3RhdGlzdGljYWwgbW9kZWxpbmcsIGFuZCBpbmZlcmVuY2U6IGxpbmVhciBtb2RlbHMsIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCB0LXRlc3RzLCBGLXRlc3RzLCBhbm92YSwgY2hpLXNxdWFyZWQgdGVzdC4KVGhlIGJhc2lzIGNvbmNlcHRzIG1heSBiZSByZXZpc2l0ZWQgaW4gdGhlIG9ubGluZSBjb3Vyc2UgYXQgaHR0cHM6Ly9ndHBiLmdpdGh1Yi5pby9QU0xTMjAvIChFbmdsaXNoKSBhbmQgaW4gaHR0cHM6Ly9zdGF0b21pY3MuZ2l0aHViLmlvL3N0YXRpc3RpZWtDdXJzdXNOb3Rhcy8gKER1dGNoKS4KCkluIGFkZGl0aW9uLCBrbm93bGVkZ2Ugb2YgcHJvZ3JhbW1pbmcgaW4gYFJgIGlzIHByZWZlcnJlZC4gQSBwcmltZXIgdG8gYFJgIGFuZCBEYXRhIHZpc3VhbGl6YXRpb24gaW4gYFJgIGNhbiBiZSBmb3VuZCBhdDoKCiAtIGBSYCBCYXNpY3M6IGh0dHBzOi8vZG9kb25hLnVnZW50LmJlL25sL2NvdXJzZXMvMzM1LwogLSBgUmAgRGF0YSBFeHBsb3JhdGlvbjogaHR0cHM6Ly9kb2RvbmEudWdlbnQuYmUvbmwvY291cnNlcy8zNDUvCgoKIyBTb2Z0d2FyZSAKCi0gUGFydGljaXBhbnRzIGFyZSByZXF1aXJlZCB0byBicmluZyB0aGVpciBvd24gbGFwdG9wIHdpdGggW1JdKGh0dHBzOi8vd3d3LnItcHJvamVjdC5vcmcvKSB2ZXJzaW9uIDQuMS4xIG9yIGdyZWF0ZXIuIAoKLSBXZSBhbHNvIHJlY29tbWVuZCB0byBhbHNvIGluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFtSU3R1ZGlvXShodHRwczovL3d3dy5yc3R1ZGlvLmNvbS9wcm9kdWN0cy9yc3R1ZGlvL2Rvd25sb2FkLykuCgotIEluc3RhbGxhdGlvbiBzY3JpcHQ6IHRvIGluc3RhbGwgYWxsIHJlcXVpcmVkIHBhY2thZ2VzLCBwbGVhc2UgY29weSBhbmQgcGFzdGUgdGhpcyBsaW5lIG9mIGNvZGUgaW4geW91ciBSIGNvbnNvbGUuCgpgYGAKc291cmNlKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vc3RhdE9taWNzL1NHQTIxL21hc3Rlci9pbnN0YWxsLlIiKQpgYGAKCi0gUGFydGljaXBhbnRzIHdobyBoYXZlIGlzc3VlcyB3aXRoIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIFIvUnN0dWRpbyBjYW4gdXNlIGFuIFJzdHVkaW8gaW5zdGFuY2UgaW4gdGhlIGNsb3VkIHdpdGggYWxsIHBhY2thZ2VzIGluc3RhbGxlZCBmb3IgdGhlIGNvdXJzZSBpbiB0aGUgbWVhbiB0aW1lLiBOb3RlLCB0aGF0IHRoaXMgaXMgaW5zdGFuY2UgaXMgbm90IGZvciByb3V0aW5lIHVzZS4gCgpbIVtCaW5kZXJdKGh0dHA6Ly9teWJpbmRlci5vcmcvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9teWJpbmRlci5vcmcvdjIvZ2gvc3RhdE9taWNzL1NHQTIxL2JpbmRlcj91cmxwYXRoPXJzdHVkaW8pCgojIERldGFpbGVkIFByb2dyYW0KCgoxLiBQb3NpdGlvbiBvZiB0aGUgY291cnNlOiBbUERGXSguL2RvY3MvaW50cm8ucGRmKSAKCjIuIFJlY2FwIExpbmVhciBNb2RlbHMgKFdlZWsgMSkKCiAgIC0gTGVjdHVyZTogW0hUTUxdKC4vcmVjYXBHZW5lcmFsTGluZWFyTW9kZWwuaHRtbCksIFtQREZdKC4vcmVjYXBHZW5lcmFsTGluZWFyTW9kZWwucGRmKQogICAtIFR1dG9yaWFsIEtQTkEyOiBbSFRNTF0oLi9tdWx0aXBsZVJlZ3Jlc3Npb25fS1BOQTIuaHRtbCksICBbUERGXSguL211bHRpcGxlUmVncmVzc2lvbl9LUE5BMi5wZGYpCgoKIyMgTW9kdWxlIEk6IFByb3Rlb21pY3MgRGF0YSBBbmFseXNpcyAoV2VlayAxLTUpCgoKMS4gQmlvaW5mb3JtYXRpY3MgZm9yIHByb3Rlb21pY3MKICAgCiAgIC0gTGVjdHVyZTogW1BERl0oLi9kb2NzL21hcnRlbnNfcHJvdGVvbWljc19iaW9pbmZvcm1hdGljcy5wZGYpLCBbeW91dHViZV0oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1aZ3dOV1J1bDk4bykKICAgLSBUdXRvcmlhbHM6IFtpZGVudGlmaWNhdGlvbl0oaHR0cHM6Ly93d3cuY29tcG9taWNzLmNvbS9iaW9pbmZvcm1hdGljcy1mb3ItcHJvdGVvbWljcy8pCgpcbmV3bGluZQoKMi4gUHJlcHJvY2Vzc2luZyAmIEFuYWx5c2lzIG9mIFNpbXBsZSBEZXNpZ25zICh3ZWVrIDMpCiAgIAogICAtIExlY3R1cmU6IFtQcmVwcm9jZXNzaW5nXSguL3BkYV9xdWFudGlmaWNhdGlvbl9wcmVwcm9jZXNzaW5nLmh0bWwpIFtbUERGXSguL3BkYV9xdWFudGlmaWNhdGlvbl9wcmVwcm9jZXNzaW5nLnBkZildCiAgIC0gVHV0b3JpYWw6IFtQcmVwcm9jZXNzaW5nXSguL3BkYV90dXRvcmlhbFByZXByb2Nlc3NpbmcuaHRtbCkKICAgLSBXcmFwLXVwOiBbUGVwdGlkZS1iYXNlZCBNb2RlbHNdKC4vcGRhX3JvYnVzdFN1bW1hcmlzYXRpb25fcGVwdGlkZU1vZGVscy5odG1sKSBbW1BERl0oLi9wZGFfcm9idXN0U3VtbWFyaXNhdGlvbl9wZXB0aWRlTW9kZWxzLnBkZildCgpcbmV3bGluZQoKMy4gU3RhdGlzdGljYWwgSW5mZXJlbmNlICYgQW5hbHlzaXMgb2YgRmFjdG9yaWFsIERlc2lnbnMgKFdlZWsgMy00KQogICAKICAgLSBMZWN0dXJlOiBbRGlmZmVyZW50aWFsIEFidW5kYW5jZSBBbmFseXNpc10oLi9wZGFfcXVhbnRpZmljYXRpb25faW5mZXJlbmNlLmh0bWwpIFtbUERGXSguL3BkYV9xdWFudGlmaWNhdGlvbl9pbmZlcmVuY2UucGRmKV0KICAgLSBUdXRvcmlhbDogW0Rlc2lnbl0ocGRhX3R1dG9yaWFsRGVzaWduLmh0bWwpCiAgIC0gV3JhcC11cDogW0Jsb2NraW5nXSguL3BkYV9ibG9ja2luZ193cmFwdXAuaHRtbCkgW1tQREZdKC4vcGRhX2Jsb2NraW5nX3dyYXB1cC5wZGYpXQogICAKNC4gQWR2YW5jZWQgbWF0ZXJpYWxzIGFuZCByZWFkaW5nIG1hdGVyaWFscwoKICAgLSBbVGVjaG5pY2FsIGRldGFpbHM6IEluZmVyZW5jZSB1cG9uIHN1bW1hcml6YXRpb25dKC4vdGVjaG5pY2FsRGV0YWlsc1Byb3Rlb21pY3MuaHRtbCkKICAgLSBbU3RhZ2Utd2lzZSB0ZXN0aW5nXSguL2RvY3Mvc3RhZ2V3aXNlVGVzdGluZy5wZGYpCiAgIAogICAtIFBhcGVyczogCgogICAgICAtIFtTdGlja2VyIGV0IGFsLiAoMjAyMCkgUm9idXN0IHN1bW1hcml6YXRpb24gYW5kIGluZmVyZW5jZSBpbiBwcm90ZW9tZS13aWRlIGxhYmVsLWZyZWUgcXVhbnRpZmljYXRpb25dKGh0dHBzOi8vd3d3LmJpb3J4aXYub3JnL2NvbnRlbnQvMTAuMTEwMS82Njg4NjN2MSkKICAgICAgLSBbTHVkZ2VyIEdvZW1pbm5lOiBFeHRlbnNpdmUgQmFja2dyb3VuZCBvbiBwcm90ZW9taWNzIGFuZCBwcm90ZW9taWNzIGRhdGEgYW5hbHlzaXMgKEludHJvZHVjdGlvbiBvZiBQaEQpXSguL2RvY3MvYmFja2dyb3VuZFByb3Rlb21pY3NEYXRhQW5hbHlzaXMucGRmKQogICAgICAtIFtWYW4gZGVuIEJlcmdlIGV0IGFsLiAoMjAxNykgU3RhZ2Utd2lzZSB0ZXN0aW5nOiBzdGFnZVIgcGFwZXJdKGh0dHBzOi8vZ2Vub21lYmlvbG9neS5iaW9tZWRjZW50cmFsLmNvbS9hcnRpY2xlcy8xMC4xMTg2L3MxMzA1OS0wMTctMTI3Ny0wKQoKNS4gU29sdXRpb25zCgogICAtIENQVEFDIHN0dWR5OiBTZWUgW3dyYXAtdXAgcHJlcHJvY2Vzc2luZ10oLi9wZGFfcm9idXN0U3VtbWFyaXNhdGlvbl9wZXB0aWRlTW9kZWxzLmh0bWwpCiAgIC0gW2NhbmNlciA2eDZdKGNhbmNlcjJfNng2Lmh0bWwpCiAgIC0gbW91c2U6IFNlZSBbd3JhcC11cCBibG9ja2luZ10oLi9wZGFfYmxvY2tpbmdfd3JhcHVwLmh0bWwpCiAgIC0gW0hlYXJ0IHN0dWR5XShoZWFydE1haW5JbnRlcmFjdGlvblN0YWdlUi5odG1sKQogICAKIyMgTW9kdWxlIElJOiBCdWxrIFJOQS1zZXF1ZW5jaW5nCgoKMS4gSW50cm9kdWN0aW9uIHRvIHNlcXVlbmNpbmcgdGVjaG5vbG9neSwgcmF3IGRhdGEgYW5kIHByZXByb2Nlc3NpbmcuCiAgIAogICAtIExlY3R1cmU6IFtJbnRyb2R1Y3Rpb24gdG8gc2VxdWVuY2luZ10oLi9zZXF1ZW5jaW5nX2ludHJvLmh0bWwpIFtbUERGXSguL3NlcXVlbmNpbmdfaW50cm8ucGRmKV0uCiAgIC0gVHV0b3JpYWw6IFtQcmVwcm9jZXNzaW5nIFJOQS1zZXEgZGF0YV0oLi9zZXF1ZW5jaW5nX3ByZXByb2Nlc3Npbmcuc2gpCiAgIC0gUmVjb21tZW5kZWQgcmVhZGluZzogW1JOQSBTZXF1ZW5jaW5nIERhdGE6IEhpdGNoaGlrZXIncyBHdWlkZSB0byBFeHByZXNzaW9uIEFuYWx5c2lzXShodHRwczovL3d3dy5hbm51YWxyZXZpZXdzLm9yZy9kb2kvYWJzLzEwLjExNDYvYW5udXJldi1iaW9kYXRhc2NpLTA3MjAxOC0wMjEyNTUpCgpcbmV3bGluZQoKMi4gV29ya2luZyB3aXRoIGNvdW50IGRhdGEgYW5kIGdlbmVyYWxpemVkIGxpbmVhciBtb2RlbHMuCiAgIAogICAtIExlY3R1cmU6IFtXb3JraW5nIHdpdGggY291bnQgZGF0YSBhbmQgR0xNc10oLi9zZXF1ZW5jaW5nX2NvdW50RGF0YS5odG1sKSBbW1BERl0oLi9zZXF1ZW5jaW5nX2NvdW50RGF0YS5wZGYpXS4KICAgLSBUdXRvcmlhbCBJOiBFbWJlZGRlZCB3aXRoaW4gdGhlIGxlY3R1cmU6IEFuYWx5c2lzIG9mIGJpa2Utc2hhcmluZyBkYXRhLgogICAtIFR1dG9yaWFsIElJOiBbR0xNIGZvciBvbmUgZ2VuZV0oc2VxdWVuY2luZ19sYWJfb25lR2VuZS5odG1sKS4KClxuZXdsaW5lCgozLiBBbmFseXNpcyBvZiBSTkEtc2VxIGRhdGEuCgogICAtIExlY3R1cmUgKyBUdXRvcmlhbDogW0ZvdXIgbWFqb3IgY2hhbGxlbmdlcyBpbiB0aGUgYW5hbHlzaXMgb2YgUk5BLXNlcSBkYXRhc2V0c10oLi9zZXF1ZW5jaW5nX3JuYXNlcUludHJvLmh0bWwpIFtbUERGXSguL3NlcXVlbmNpbmdfcm5hc2VxSW50cm8ucGRmKV0uCiAgIC0gW1doeSB3ZSB1c2Ugb2Zmc2V0cyByYXRoZXIgdGhhbiBjb3VudCBzY2FsaW5nXShzZXF1ZW5jaW5nX3NjYWxpbmdOb3JtYWxpemF0aW9uLmh0bWwpLgoKXG5ld2xpbmUKICAgCjQuIFRlY2huaWNhbCB0b3BpY3MgaW4gYnVsayBSTkEtc2VxIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2lzIChERUEpLgoKICAgLSBMZWN0dXJlOiBbVGVjaG5pY2FsIHRvcGljcyBpbiBERUFdKC4vc2VxdWVuY2luZ190ZWNobmljYWxERS5odG1sKSBbW1BERl0oLi9zZXF1ZW5jaW5nX3RlY2huaWNhbERFLnBkZildLgogICAKIyMgTW9kdWxlIElJSTogU2luZ2xlLWNlbGwgUk5BLXNlcXVlbmNpbmcKCjEuIEdlbmVyYWwgY29uY2VwdHMgYW5kIGFuYWx5c2lzIHdvcmtmbG93IG9mIHNpbmdsZS1jZWxsIFJOQS1zZXEgZGF0YS4KCiAgIC0gTGVjdHVyZTogW1NsaWRlc10oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vcHJlc2VudGF0aW9uL2QvMXNmYnR3NTJxV2dBN1RjRElyR0IzZldrc0xNME11OU83Z0JxWWdHcnQ5Zk0vZWRpdD91c3A9c2hhcmluZykuCiAgICAgIC0gW1ZhcmlhbmNlIHN0YWJpbGl6aW5nIHRyYW5zZm9ybWF0aW9uIGZvciBhIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlXSguL3NpbmdsZUNlbGxfdmFyU3RhYmlsaXphdGlvbi5odG1sKSBbW1BERl0oLi9zaW5nbGVDZWxsX3ZhclN0YWJpbGl6YXRpb24ucGRmKV0uCiAgICAgIC0gW1VuZGVyc3RhbmRpbmcgVU1BUF0oaHR0cHM6Ly9wYWlyLWNvZGUuZ2l0aHViLmlvL3VuZGVyc3RhbmRpbmctdW1hcC8pLgogICAgICAtIFtQb3N0LXNlbGVjdGlvbiBpbmZlcmVuY2Ugc2ltdWxhdGlvbl0oaHR0cHM6Ly9zdGF0b21pY3MuZ2l0aHViLmlvL3NpbmdsZUNlbGxDb3Vyc2UvcG9zdFNlbGVjdGlvbkluZmVyZW5jZS5odG1sKQogICAtIFtBIHJlcHJvZHVjaWJsZSB3b3JrZmxvdyBvbiB0aGUgTWFjb3NrbyBEcm9wLXNlcSBkYXRhc2V0XSguL3NpbmdsZUNlbGxfTWFjb3Nrb1dvcmtmbG93Lmh0bWwpLgoKCiMgSW5zdHJ1Y3RvcnMKCiAtIFtLb2VuIFZhbiBkZW4gQmVyZ2VdKGh0dHBzOi8va29lbnZhbmRlbmJlcmdlLmdpdGh1Yi5pby8pCiAtIFtMaWV2ZW4gQ2xlbWVudF0oLi9pbnN0cnVjdG9ycy5odG1sKQogLSBbTGVubmFydCBNYXJ0ZW5zXShodHRwczovL3d3dy5jb21wb21pY3MuY29tL3Blb3BsZS9sZW5uYXJ0LW1hcnRlbnMvKQoKCgojIExpY2Vuc2UKCjxhIHJlbD0ibGljZW5zZSIgaHJlZj0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLXNhLzQuMCI+PGltZyBhbHQ9IkNyZWF0aXZlIENvbW1vbnMgTGljZW5zZSIgc3R5bGU9ImJvcmRlci13aWR0aDowIiBzcmM9Imh0dHBzOi8vaS5jcmVhdGl2ZWNvbW1vbnMub3JnL2wvYnktbmMtc2EvNC4wLzg4eDMxLnBuZyIgLz48L2E+CgpUaGlzIHByb2plY3QgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFtDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwtU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCAoQ0MgQlktTkMtU0EgNC4wKV0oaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLXNhLzQuMCkKCg==