What is R?
- We will use R via RStudio in this course to analyse securities risk and returns, and construct and portfolios.
After installing the software, open RStudio
- It should look something like this.

Set the folder RStudio uses when not in a project
From “Preferences” set the default folder to your documents or other convenient folder.
I set mine to my Dropbox folder.
After you have set the folder, quit and reopen RStudio.

Make a “project” for this course
A project is a folder where you can keep data, code and documents together.
You can have several different projects and set R to start up differently for each project. Projects allow you to keep your files organised, and let you customise how R works.
If you use R for other classes, your seminar or other purposes, you can create other projects for those.
Each project will have a separate folder and files to save the data in your environment, your history of code executed in the console, and the way you have R configured.
Make a new project from the Projects menu at the top-right of the screen.

Click “New Directory” for your project

Select “New Project”

Give the project folder a name

Your desktop should look something like this

Set the “Project Options”
- Find the “Project Options” from the project menu at the top-right of your screen.

Set the three options to “Yes”
- This means your data and history of commands will be saved quen you quit and restored when you open your project the next time.

RStudio has four panes

Pane 2 is the console where you can enter and execute code.
Pane 3 contains the environment and history tabs. The environment shows all objects that are loaded for use (it is empty now). The history tab shows the code you have executed in the console.
Pane 4 contains a number of tabs showing your folders and files, plots you have drawn, packages, a help window.
Packages

Packages extend the functionality of R.
Packages contain functions, data and other objects. They are designed to perform certain types of data manipulation, analysis, estimation, visualisation, optimisation, document creation, etc.
Some packages are part of the default R installation, called “Base R,” and there are a huge number of additional packages available that allow you to do almost anything with R.
We will use several packages in this course.
There are two steps to using a package.
Install the package. This downloads the latest verson of the package from an R repository and saves it on your computer.
Load a package for use. When you want to use a package you must load it first with the library command.
To install a package, click the install button, type in the name of the package and hit install.
Install the following packages: AER, dynlm, fGarch, FinCal, kableExtra, MASS, reshape2, stargazer, tidyquant, tidyverse, wesanderson, xtable.
- Note that R is case-sensitive, thus upper- and lower-case letters are interpreted as being different.

- Alternatively, install the packages by running the following code in the console.
install.packages("AER", "dynlm", "fGarch", "FinCal", "kableExtra", "MASS", "reshape2", "stargazer", "tidyquant", "tidyverse", "wesanderson", "xtable", dependencies = TRUE)
Packages need only be installed on your computer once, but they should be updated from time to time.
When you wish to use a package, it must be loaded using the library command. For example, to load the AER package:
library(AER)
- Another way to load a package is to tick the box next to the package in the Packages tab. The packages tab shows you all packages that you have installed.

- If you get an error saying R cannot find a function when you are trying to execute code, it is almost always because you have either a) not loaded the package that contains the function, or b) mistyped the function.
Where are my files?
getwd()
setwd("/Users/Clinton/Dropbox/syncd_r_data/econometrics")
- If you your working directory is a folder on a network drive or on the cloud (like Dropbox or Google Drive) that is synced to your computer’s hard drive, you will be able to use it with RStudio on multiple computers.
Special HIDDEN R files in your working directory
- Here are the hidden files in my working directory shown in red and the project file which holds information about my project in blue.:

Rmarkdown and Notebooks
Rmarkdown allows dynamic documents to be created in R that contain written text, R code and output from the code.
I will ask you to do some assignments in an R Notebook using markdown.
- This guide for setting-up R and RStudio was made in an R Notebook. If you look at the top of the page you can see a button labelled “Code” which alows you to download the code I used to make this HTML file.
A markdown document is written in using coding called markdown, which is an easy-to-write plain text format that is related to TeX (or LaTeX).
A TeX installation is required to use Rmarkdown, such as MacTex (for Mac OS) http://www.tug.org/mactex/ or MiKTeX (cross-platform) https://miktex.org/download. If you use LaTeX to write documents, you will already have this. If not, the easiest way to get a TeX installation for markdown is via the TinyTeX package.
Install TinyTeX using the package called tinytex
- You have already installed the package called tinytex. Executing the code below in the console will download the TinyTeX files from the internet and install them on your computer so that you can make markdown documents.
tinytex::install_tinytex()
This will take some time to download.
Note that you do not need to do this if you use RStudio Cloud as TinyTeX is pre-installed.
When the installation has finished, restart RStudio.
Test your Rmarkdown environment

- The notebook already contains example text and R code that plots a simple chart.

- Run the code by pressing “Run All” from the “Run” menu.

After you have run the code, you should see the plot appear.
Include your name as I have at the top of the Notebook.

- Save the file to your working directory.


- Open the HTML file with your browser. It should look like this:

- Well done! You have created a Notebook.
CRAN Task Views
CRAN Task Views provide information about packages that can be used with R. Packages extend the functionality of R. They provide routines for various types of data manipulation, mathematical and econometric models, optimisation methods, financial models and more. Packages are constantly being developed and updated by R users.
Three Task Views are useful this course:
R-Bloggers
R-Bloggers is a blog site containing many helpful posts on using R: http://www.r-bloggers.com/
The posts on the site show the wide variety of problems that coding in R can be applied to (not just finance). For example:
Search
Lots of information is posted online by R users including questions and answers.
If you are stuck, search for information that will help you answer your question.
rseek is a search engine for R: www.rseek.org
Using another search engine like Google:
RStudio Keyboard Shortcuts (for Mac)
- Code completion:
- Type part of the function you want and then press the Tab key.
- Also works for function arguments, that is press Tab when yo uare inside the brackets of a function.
- Also recalls object names.
- View a list of previous commands:
- Press Control (or Command) and the up arrow.
- View a list of previous commands that match a prefix:
- Type the prefix and press Control (orCommand) and the up arrow.
- Enter a line of code from an R script to the console:
- Enter a line of code from history to and R script:
© Copyright Clinton Watkins 2021
References
Andrecut, M. 2010.
“Portfolio Optimization in R.” Cornell University, arXiv:1307.0450 [q-fin.PM].
https://doi.org/10.1201/b17178.
Bennett, Mark J., and Dirk L. Hugen. 2016.
Financial analytics with R : building a laptop laboratory for data science. Cambridge University Press.
https://op.lib.kobe-u.ac.jp/opac/opac_link/bibid/2002211471.
Cowpertwait, Paul S. P., and Andrew V. Metcalfe. 2009.
Introductory Time Series with R. Springer.
https://doi.org/10.1007/978-0-387-88698-5.
Kleiber, Christian, and Achim Zeileis. 2008.
Applied Econometrics with R. 1st ed. New York: Springer US.
https://doi.org/10.1007/978-0-387-77318-6.
Matloff, Norman. 2011.
The Art of R Programming: A Tour of Statistical Software Design. No Starch Press.
https://www.nostarch.com/artofr.htm.
Tsay, Ruey S. 2010. Analysis of financial time series. Wiley.
———. 2014. Multivariate time series analysis : with R and financial applications. Wiley.
Venables, W. N., D. M. Smith, and R Core Team. 2019.
“An Introduction to R.” https://doi.org/10.1201/9781420035025.ch1.
LS0tCnRpdGxlOiAiUG9ydGZvbGlvIE1hbmFnZW1lbnQgW0VDTjM0N10iCnN1YnRpdGxlOiAiQSBHdWlkZSB0byBTZXR0aW5nLXVwIFIgYW5kIFJTdHVkaW8iCmF1dGhvcjogPGJyPiBDbGludG9uIFdhdGtpbnMKb3V0cHV0OiBodG1sX25vdGVib29rCmJpYmxpb2dyYXBoeTogLi4vLi4vLi4vLi4vLi4vLi4vYmlidGV4L1BvcnRmb2xpb01hbmFnZW1lbnQuYmliCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KaDEudGl0bGUgewogIGZvbnQtc2l6ZTogMjRwdDsKICBjb2xvcjogZGFya2JsdWU7Cn0KCmgzLnN1YnRpdGxlIHsKICBmb250LXNpemU6IDI0cHQ7CiAgY29sb3I6IGRhcmtibHVlOwp9CgpoMiB7CiAgZm9udC1zaXplOiAxOHB0Owp9Cgpib2R5LCB0ZCB7CiAgIGZvbnQtc2l6ZTogMTFwdDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiA5cHQ7Cn0KcHJlIHsKICBmb250LXNpemU6IDlwdAp9Cjwvc3R5bGU+CgpgYGB7ciwgaW5jbHVkZT1GfQpybShsaXN0ID0gbHMoKSkKYGBgCgo8YnI+CgotLS0tCgojIyBXaGF0IGlzIFI/Cgo8cD4KCi0gX19SX18gaXMgYW4gb3BlbnNvdXJjZSBwb3dlcmZ1bCBwcm9ncmFtbWluZyBsYW5ndWFnZSBzdWl0ZWQgdG8gbWF0aGVtYXRpY2FsIGFuZCBzdGF0aXN0aWNhbCBjb21wdXRpbmcsIGFuYWx5c2lzIGFuZCBncmFwaGljcy4gCgogICAgLSBEb3dubG9hZCBSIGZyb20gaGVyZTogaHR0cHM6Ly93d3cuci1wcm9qZWN0Lm9yZy8gCiAgICAKPHA+CgotIF9fUlN0dWRpb19fIHByb3ZpZGVzIGEgY29udmVuaWVudCBpbnRlcmZhY2UgZm9yIHVzaW5nIFIuIEJvdGggUiBhbmQgUlN0dWRpbyBhcmUgZnJlZS4KCiAgICAtIERvd25sb2FkIFJTdHVkaW8gKGZyZWUgRGVza3RvcCBPcGVuIFNvdXJjZSBFZGl0aW9uKSBmcm9tIGhlcmU6IGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tLyAgCiAgICAtIF9fUlN0dWRpbyBDbG91ZF9fIHByb3ZpZGVzIFIgYW5kIFJTdHVkaW8gdmlhIGEgd2ViIGJyb3dzZXIuIFlvdSBjYW4gbWFrZSBhIGZyZWUgYWNjb3VudCBidXQgdGhlIGFtb3VudCBvZiB0aW1lIHlvdSBjYW4gdXNlIHRoZSBzZXJ2aWNlIGZvciBmcmVlIGlzIGxpbWl0ZWQuIFRoaXMgbWF5IGJlIGEgZ29vZCBvcHRpb24gaWYgeW91IGhhdmUgZGlmZmljdWx0aWVzIHNldHRpbmcgdXAgdGhlIHNvZnR3YXJlIG9uIHlvdXIgb3duIGNvbXB1dGVyLiBSZW1lbWJlciB0byBjb3B5IGFueSBmaWxlcyB5b3UgbWFrZSBmcm9tIFJTdHVkaW8gQ2xvdWQgdG8geW91ciBvd24gY29tcHV0ZXIgc28gdGhhdCB5b3UgZG8gbm90IHJpc2sgbG9zaW5nIHlvdXIgd29yay4gUlN0dWRpbyBDbG91ZCBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9yc3R1ZGlvLmNsb3VkLwoKPHA+CgotIFdlIHdpbGwgdXNlIFIgdmlhIFJTdHVkaW8gaW4gdGhpcyBjb3Vyc2UgdG8gYW5hbHlzZSBzZWN1cml0aWVzIHJpc2sgYW5kIHJldHVybnMsIGFuZCBjb25zdHJ1Y3QgYW5kIHBvcnRmb2xpb3MuCgo8IS0tIFlvdSBhcmUgd2VsY29tZSB0byBicmluZyB5b3VyIG93biBub3RlYm9vayBjb21wdXRlciB0byB0aGUgbGFiIHNlc3Npb25zIGlmIHlvdSB3aXNoLiBZb3Ugd2lsbCBiZWVuIHRvIGNvbm5lY3QgdG8gdGhlIGludGVybmV0LiAtLT4KCi0tLS0KCiMjIEFmdGVyIGluc3RhbGxpbmcgdGhlIHNvZnR3YXJlLCBvcGVuIFJTdHVkaW8KCjxwPgoKLSBJdCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzLgoKPHA+CgohW10oYXNzZXRzL3AxLnBuZykKCi0tLS0KCiMjIyBTZXQgdGhlIGZvbGRlciBSU3R1ZGlvIHVzZXMgd2hlbiBub3QgaW4gYSBwcm9qZWN0Cgo8cD4KCi0gRnJvbSAiUHJlZmVyZW5jZXMiIHNldCB0aGUgZGVmYXVsdCBmb2xkZXIgdG8geW91ciBkb2N1bWVudHMgb3Igb3RoZXIgY29udmVuaWVudCBmb2xkZXIuIAoKLSBJIHNldCBtaW5lIHRvIG15IERyb3Bib3ggZm9sZGVyLgoKLSBBZnRlciB5b3UgaGF2ZSBzZXQgdGhlIGZvbGRlciwgcXVpdCBhbmQgcmVvcGVuIFJTdHVkaW8uCgo8cD4KCiFbXShhc3NldHMvcDIucG5nKQoKLS0tLQoKIyMgTWFrZSBhICJwcm9qZWN0IiBmb3IgdGhpcyBjb3Vyc2UKCjxwPgoKLSBBIHByb2plY3QgaXMgYSBmb2xkZXIgd2hlcmUgeW91IGNhbiBrZWVwIGRhdGEsIGNvZGUgYW5kIGRvY3VtZW50cyB0b2dldGhlci4KCi0gWW91IGNhbiBoYXZlIHNldmVyYWwgZGlmZmVyZW50IHByb2plY3RzIGFuZCBzZXQgUiB0byBzdGFydCB1cCBkaWZmZXJlbnRseSBmb3IgZWFjaCBwcm9qZWN0LiBQcm9qZWN0cyBhbGxvdyB5b3UgdG8ga2VlcCB5b3VyIGZpbGVzIG9yZ2FuaXNlZCwgYW5kIGxldCB5b3UgY3VzdG9taXNlIGhvdyBSIHdvcmtzLiAKCi0gSWYgeW91IHVzZSBSIGZvciBvdGhlciBjbGFzc2VzLCB5b3VyIHNlbWluYXIgb3Igb3RoZXIgcHVycG9zZXMsIHlvdSBjYW4gY3JlYXRlIG90aGVyIHByb2plY3RzIGZvciB0aG9zZS4gCgotIEVhY2ggcHJvamVjdCB3aWxsIGhhdmUgYSBzZXBhcmF0ZSBmb2xkZXIgYW5kIGZpbGVzIHRvIHNhdmUgdGhlIGRhdGEgaW4geW91ciBlbnZpcm9ubWVudCwgeW91ciBoaXN0b3J5IG9mIGNvZGUgZXhlY3V0ZWQgaW4gdGhlIGNvbnNvbGUsIGFuZCB0aGUgd2F5IHlvdSBoYXZlIFIgY29uZmlndXJlZC4KCi0gTWFrZSBhIG5ldyBwcm9qZWN0IGZyb20gdGhlIFByb2plY3RzIG1lbnUgYXQgdGhlIHRvcC1yaWdodCBvZiB0aGUgc2NyZWVuLgoKPHA+CgohW10oYXNzZXRzL3AzLnBuZykKCi0tLS0KCiMjIENsaWNrICJOZXcgRGlyZWN0b3J5IiBmb3IgeW91ciBwcm9qZWN0Cgo8cD4KCiFbXShhc3NldHMvcDQucG5nKQoKLS0tLQoKIyMgU2VsZWN0ICJOZXcgUHJvamVjdCIKCjxwPgoKIVtdKGFzc2V0cy9wNS5wbmcpCgotLS0tCgojIyBHaXZlIHRoZSBwcm9qZWN0IGZvbGRlciBhIG5hbWUKCjxwPgoKLSBJIHVzZSB0aGUgbmFtZSAicG9ydGZvbGlvbW5ndCIuCgotIENsaWNrICJDcmVhdGUgUHJvamVjdCIuCgo8cD4KCiFbXShhc3NldHMvcDYucG5nKQoKLS0tLQoKIyMgWW91ciBkZXNrdG9wIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMKCjxwPgoKIVtdKGFzc2V0cy9wNy5wbmcpCgo8IS0tIDxicj4gLS0+Cgo8IS0tIC0gVXNlIHRoZSBmb2xsb3dpbmcgY29kZSB0byBjaGVjayB0aGF0IHlvdXIgUiBzZXNzaW9uIGlzIG9wZXJhdGluZyBpbiB5b3VyIHByb2plY3QgZm9sZGVyLiAtLT4KCjwhLS0gPHA+IC0tPgoKPCEtLSBgYGB7ciwgZXZhbD1GQUxTRX0gLS0+CjwhLS0gZ2V0d2QoKSAtLT4KPCEtLSBgYGAgLS0+CgotLS0tCgojIyBTZXQgdGhlICJQcm9qZWN0IE9wdGlvbnMiCgo8cD4KCi0gRmluZCB0aGUgIlByb2plY3QgT3B0aW9ucyIgZnJvbSB0aGUgcHJvamVjdCBtZW51IGF0IHRoZSB0b3AtcmlnaHQgb2YgeW91ciBzY3JlZW4uCgo8cD4KCiFbXShhc3NldHMvcDgucG5nKQoKLS0tLQoKIyMgU2V0IHRoZSB0aHJlZSBvcHRpb25zIHRvICJZZXMiCgo8cD4KCi0gVGhpcyBtZWFucyB5b3VyIGRhdGEgYW5kIGhpc3Rvcnkgb2YgY29tbWFuZHMgd2lsbCBiZSBzYXZlZCBxdWVuIHlvdSBxdWl0IGFuZCByZXN0b3JlZCB3aGVuIHlvdSBvcGVuIHlvdXIgcHJvamVjdCB0aGUgbmV4dCB0aW1lLgoKPHA+CgohW10oYXNzZXRzL3A5LnBuZykKCi0tLS0KCiMjIFJTdHVkaW8gaGFzIGZvdXIgcGFuZXMKCjxwPgoKIVtdKGFzc2V0cy9wMTAucG5nKQoKPHA+CgotIFBhbmUgMSBpcyB0aGUgc291cmNlIHBhbmUgd2hlcmUgeW91IGNhbiBvcGVuIGFuZCB3b3JrIG9uIHZhcmlvdXMgdHlwZXMgb2YgY29kZSBmaWxlcyBvciBkb2N1bWVudHMuIFlvdSBhbHNvIGRpc3BsYXkgb2JqZWN0cyBpbiB0aGUgc291cmNlIHBhbmUuIAoKICAgIC0gUiBpcyBhbiBvYmplY3Qgb3JpZW50ZWQgbGFuZ3VhZ2Ugd2hpY2ggbWVhbnMgZXZlcnl0aGluZyBpcyBhbiBvYmplY3Qgd2l0aCBjZXJ0YWluIGF0dHJpYnV0ZXMsIGUuZy4gYSBtYXRyaXggb2YgZGF0YSBvciBhIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyBkYXRhLgogICAgCiAgICAtIE9iamVjdHMgY2FuIGludGVyYWN0IHdpdGggZWFjaCBvdGhlciB0byBjaGFuZ2UgdGhlaXIgYXR0cmlidXRlcywgb3IgY3JlYXRlIG90aGVyIG9iamVjdHMuCiAgICAKICAgIC0gU29tZSBpbXBvcnRhbnQgdHlwZXMgb2Ygb2JqZWN0cyBhcmU6IHZlY3RvcnMsIGxpc3RzLCBhcnJheXMsIG1hdHJpY2VzLCB0YWJsZXMsIGRhdGEgZnJhbWVzLCBmdW5jdGlvbnMuCgo8cD4KCi0gUGFuZSAyIGlzIHRoZSBjb25zb2xlIHdoZXJlIHlvdSBjYW4gZW50ZXIgYW5kIGV4ZWN1dGUgY29kZS4KCi0gUGFuZSAzIGNvbnRhaW5zIHRoZSBlbnZpcm9ubWVudCBhbmQgaGlzdG9yeSB0YWJzLiBUaGUgZW52aXJvbm1lbnQgc2hvd3MgYWxsIG9iamVjdHMgdGhhdCBhcmUgbG9hZGVkIGZvciB1c2UgKGl0IGlzIGVtcHR5IG5vdykuIFRoZSBoaXN0b3J5IHRhYiBzaG93cyB0aGUgY29kZSB5b3UgaGF2ZSBleGVjdXRlZCBpbiB0aGUgY29uc29sZS4gCgotIFBhbmUgNCBjb250YWlucyBhIG51bWJlciBvZiB0YWJzIHNob3dpbmcgeW91ciBmb2xkZXJzIGFuZCBmaWxlcywgcGxvdHMgeW91IGhhdmUgZHJhd24sIHBhY2thZ2VzLCBhIGhlbHAgd2luZG93LgoKLS0tLQoKIyMgUGFja2FnZXMKCjxwPgoKIVtdKGFzc2V0cy9wMTEucG5nKQoKPHA+CgotIFBhY2thZ2VzIGV4dGVuZCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBSLgoKLSBQYWNrYWdlcyBjb250YWluIGZ1bmN0aW9ucywgZGF0YSBhbmQgb3RoZXIgb2JqZWN0cy4gVGhleSBhcmUgZGVzaWduZWQgdG8gcGVyZm9ybSBjZXJ0YWluIHR5cGVzIG9mIGRhdGEgbWFuaXB1bGF0aW9uLCBhbmFseXNpcywgZXN0aW1hdGlvbiwgdmlzdWFsaXNhdGlvbiwgb3B0aW1pc2F0aW9uLCBkb2N1bWVudCBjcmVhdGlvbiwgZXRjLiAKCi0gU29tZSBwYWNrYWdlcyBhcmUgcGFydCBvZiB0aGUgZGVmYXVsdCBSIGluc3RhbGxhdGlvbiwgY2FsbGVkICJCYXNlIFIiLCBhbmQgdGhlcmUgYXJlIGEgaHVnZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYWNrYWdlcyBhdmFpbGFibGUgdGhhdCBhbGxvdyB5b3UgdG8gZG8gYWxtb3N0IGFueXRoaW5nIHdpdGggUi4KCi0gV2Ugd2lsbCB1c2Ugc2V2ZXJhbCBwYWNrYWdlcyBpbiB0aGlzIGNvdXJzZS4KCi0gVGhlcmUgYXJlIHR3byBzdGVwcyB0byB1c2luZyBhIHBhY2thZ2UuCgogICAgMS4gSW5zdGFsbCB0aGUgcGFja2FnZS4gVGhpcyBkb3dubG9hZHMgdGhlIGxhdGVzdCB2ZXJzb24gb2YgdGhlIHBhY2thZ2UgZnJvbSBhbiBSIHJlcG9zaXRvcnkgYW5kIHNhdmVzIGl0IG9uIHlvdXIgY29tcHV0ZXIuCgogICAgMi4gTG9hZCBhIHBhY2thZ2UgZm9yIHVzZS4gV2hlbiB5b3Ugd2FudCB0byB1c2UgYSBwYWNrYWdlIHlvdSBtdXN0IGxvYWQgaXQgZmlyc3Qgd2l0aCB0aGUgbGlicmFyeSBjb21tYW5kLiAKCjxwPgoKLSBUbyBpbnN0YWxsIGEgcGFja2FnZSwgY2xpY2sgdGhlIGluc3RhbGwgYnV0dG9uLCB0eXBlIGluIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGFuZCBoaXQgaW5zdGFsbC4KCi0gSW5zdGFsbCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOiBBRVIsIGR5bmxtLCBmR2FyY2gsIEZpbkNhbCwga2FibGVFeHRyYSwgTUFTUywgcmVzaGFwZTIsIHN0YXJnYXplciwgdGlkeXF1YW50LCB0aWR5dmVyc2UsIHdlc2FuZGVyc29uLCB4dGFibGUuCgogICAgLSBOb3RlIHRoYXQgUiBpcyBjYXNlLXNlbnNpdGl2ZSwgdGh1cyB1cHBlci0gYW5kIGxvd2VyLWNhc2UgbGV0dGVycyBhcmUgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgZGlmZmVyZW50LgoKPHA+CgohW10oYXNzZXRzL3AxMi5wbmcpCgo8cD4KCi0gQWx0ZXJuYXRpdmVseSwgaW5zdGFsbCB0aGUgcGFja2FnZXMgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nIGNvZGUgaW4gdGhlIGNvbnNvbGUuCgo8cD4KCmBgYHtyLCBldmFsPUZBTFNFfQppbnN0YWxsLnBhY2thZ2VzKCJBRVIiLCAiZHlubG0iLCAiZkdhcmNoIiwgIkZpbkNhbCIsICJrYWJsZUV4dHJhIiwgIk1BU1MiLCAicmVzaGFwZTIiLCAic3RhcmdhemVyIiwgInRpZHlxdWFudCIsICJ0aWR5dmVyc2UiLCAid2VzYW5kZXJzb24iLCAieHRhYmxlIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKYGBgCgo8cD4KCi0gSW5zdGFsbGF0aW9uIG9mIHBhY2thZ2VzIHdpbGwgdGFrZSBzb21lIHRpbWUuIE91ciBsaXN0IG9mIHBhY2thZ2VzIHdpbGwgcmVxdWlyZSBzZXZlcmFsIGFkZGl0aW9uYWwgcGFja2FnZXMsIGNhbGxlZGUgZGVwZW5kZW5jaWVzLCB0byBiZSBkb3dubG9hZGVkLgoKICAgIC0gSWYgeW91IGFyZSBhc2tlZCBfIkRvIHlvdSB3YW50IHRvIGluc3RhbGwgZnJvbSBzb3VyY2VzIHRoZSBwYWNrYWdlcyB3aGljaCBuZWVkIGNvbXBpbGF0aW9uPyAoWWVzL25vL2NhbmNlbCkiXyBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24sIHlvdSBjYW4gYW5zd2VyICJuIi4KCiAgICAtIElmIGFuIGluc3RhbGxhdGlvbiByZXN1bHRzIGluIGEgbWVzc2FnZSBsaWtlIF8iSW5zdGFsbGF0aW9uIG9mIHBhY2thZ2UgWCBoYWQgbm9uLXplcm8gZXhpdCBzdGF0dXMiXyB0aGUgcGFja2FnZSB3YXMgbm90IGluc3RhbGxlZC4gVHJ5IGFnYWluLiBJZiB5b3Ugc3RpbGwgaGF2ZSBhIHByb2JsZW0sIGNvbnRhY3QgbWUuCiAgICAKICAgIC0gQSBtZXNzYWdlIGxpa2UgXyJUaGUgZG93bmxvYWRlZCBzb3VyY2UgcGFja2FnZXMgYXJlIGluICdmb2xkZXIgbG9jYXRpb24nIl8gbWVhbnMgdGhlIHBhY2thZ2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZC4KICAgIAo8cD4KCi0gUGFja2FnZXMgbmVlZCBvbmx5IGJlIGluc3RhbGxlZCBvbiB5b3VyIGNvbXB1dGVyIG9uY2UsIGJ1dCB0aGV5IHNob3VsZCBiZSB1cGRhdGVkIGZyb20gdGltZSB0byB0aW1lLiAKCi0gV2hlbiB5b3Ugd2lzaCB0byB1c2UgYSBwYWNrYWdlLCBpdCBtdXN0IGJlIGxvYWRlZCB1c2luZyB0aGUgbGlicmFyeSBjb21tYW5kLiBGb3IgZXhhbXBsZSwgdG8gbG9hZCB0aGUgQUVSIHBhY2thZ2U6Cgo8cD4KCmBgYHtyLCBldmFsPUZBTFNFfQpsaWJyYXJ5KEFFUikKYGBgCgo8cD4KCi0gQW5vdGhlciB3YXkgdG8gbG9hZCBhIHBhY2thZ2UgaXMgdG8gdGljayB0aGUgYm94IG5leHQgdG8gdGhlIHBhY2thZ2UgaW4gdGhlIFBhY2thZ2VzIHRhYi4gVGhlIHBhY2thZ2VzIHRhYiBzaG93cyB5b3UgYWxsIHBhY2thZ2VzIHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkLgoKPHA+CgohW10oYXNzZXRzL3AxMy5wbmcpCgo8cD4KCi0gSWYgeW91IGdldCBhbiBlcnJvciBzYXlpbmcgUiBjYW5ub3QgZmluZCBhIGZ1bmN0aW9uIHdoZW4geW91IGFyZSB0cnlpbmcgdG8gZXhlY3V0ZSBjb2RlLCBpdCBpcyBhbG1vc3QgYWx3YXlzIGJlY2F1c2UgeW91IGhhdmUgZWl0aGVyIGEpIF9fbm90IGxvYWRlZCB0aGUgcGFja2FnZV9fIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uLCBvciBiKSBfX21pc3R5cGVkIHRoZSBmdW5jdGlvbl9fLgoKLS0tLQoKIyMgV2hlcmUgYXJlIG15IGZpbGVzPwoKPHA+CgotIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyB3aGVyZSBSIHdpbGwgbG9vayBmb3IgeW91ciBmaWxlcyBhbmQgc2F2ZSBmaWxlcy4KCi0gU2hvdyB5b3VyIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnk6Cgo8cD4KCmBgYHtyLCBldmFsPUZBTFNFfQpnZXR3ZCgpCmBgYAogCiA8cD4KIAotIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBpcyBzZXQgYnkgeW91ciBwcm9qZWN0LgogCi0gSWYgeW91IHdhbnQgdG8gY2hhbmdlIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgdGVtcG9yYXJpbHkgeW91IGNhbiBzZXQgaXQgdG8gYW5vdGhlciBwYXRoLiBIZXJlIGlzIGFuIGV4YW1wbGUgZm9yIG15IGZvbGRlcnM6CgpgYGB7cixldmFsPUZBTFNFfQpzZXR3ZCgiL1VzZXJzL0NsaW50b24vRHJvcGJveC9zeW5jZF9yX2RhdGEvZWNvbm9tZXRyaWNzIikKYGBgCgotIElmIHlvdSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGlzIGEgZm9sZGVyIG9uIGEgbmV0d29yayBkcml2ZSBvciBvbiB0aGUgY2xvdWQgKGxpa2UgRHJvcGJveCBvciBHb29nbGUgRHJpdmUpIHRoYXQgaXMgc3luY2VkIHRvIHlvdXIgY29tcHV0ZXIncyBoYXJkIGRyaXZlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSBpdCB3aXRoIFJTdHVkaW8gb24gbXVsdGlwbGUgY29tcHV0ZXJzLgoKLS0tLSAgCgojIyBTcGVjaWFsIEhJRERFTiBSIGZpbGVzIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgIAoKPHA+CgotIFJTdHVkaW8gdXNlcyB0aHJlZSBpbXBvcnRhbnQgaGlkZGVuIGZpbGVzLiBZb3UgY2FuIHNlZSB0aGVtIGluIHRoZSBSU3R1ZGlvIGZpbGVzIHBhbmUgYnV0IHVzdWFsbHkgbm90IGluIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KCiAgICAtIF9fLlJEYXRhX18gaG9sZHMgdGhlIG9iamVjdHMgdGhhdCBhcmUgbG9hZGVkIGluIHlvdXIgZW52aXJvbm1lbnQuCgogICAgLSBfXy5SSGlzdG9yeV9fIGhvbGRzIHRoZSBoaXN0b3J5IG9mIHRoZSBjb2RlIHlvdSBoYXZlIGV4ZWN1dGVkIGluIHRoZSBjb25zb2xlLgoKICAgIC0gX18uUnByb2ZpbGVfXyBob2xkcyBzcGVjaWZpYyBzZXQtdXAgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0IHlvdSBhcmUgd29ya2luZyBpbi4KCjxwPgoKLSBIZXJlIGFyZSB0aGUgaGlkZGVuIGZpbGVzIGluIG15IHdvcmtpbmcgZGlyZWN0b3J5IHNob3duIGluIHJlZCBhbmQgdGhlIHByb2plY3QgZmlsZSB3aGljaCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBteSBwcm9qZWN0IGluIGJsdWUuOgoKPHA+CgohW10oYXNzZXRzL3AxNC5wbmcpCgotLS0tCgojIyBVc2luZyB0aGUgIi5ScHJvZmlsZSIgZmlsZSB0byBjb25maWd1cmUgYW4gUiBzZXNzaW9uCgo8cD4KCi0gVGhlIC5ScHJvZmlsZSBmaWxlIGV4ZWN1dGVzIGNvZGUgYXMgUiBzdGFydHMgdXAuIFlvdSBjYW4gdXNlIHRoaXMgZmlsZSB0byBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIHBhY2thZ2VzIHlvdSB3aWxsIG5lZWQgdG8gdXNlIGZvciB0aGlzIGNvdXJzZSBhbmQgdG8gc2V0IHNvbWUgUiBvcHRpb25zLiBUaHVzIC5ScHJvZmlsZSBhbGxvd3MgeW91IHRvIGN1c3RvbWlzZSB0aGUgc3RhcnQtdXAgb2YgUi4KCiAgICAtIFJlbWVtYmVyIHRoYXQgdGhlIHBhY2thZ2VzIG11c3QgYWxyZWFkeSBiZSBpbnN0YWxsZWQgb24geW91ciBjb21wdXRlciB0byBiZSBsb2FkZWQgYnkgdGhlIC5ScHJvZmlsZSBmaWxlLgogICAgCjxwPgoKLSBIZXJlIGlzIHRoZSBjb2RlIHlvdSB3aWxsIG5lZWQgaW4geW91ciAuUnByb2ZpbGUgZmlsZSBmb3IgdGhpcyBjb3Vyc2UuCgpgYGB7ciwgZXZhbD1GQUxTRX0KIyBQb3J0Zm9saW8gTWFuYWdlbWVudCAuUnByb2ZpbGUgZmlsZQoKIyBBdXRvLWxvYWQgcGFja2FnZXM6CmxpYnJhcnkoQUVSKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoZHlubG0pCmxpYnJhcnkoZkJhc2ljcykKbGlicmFyeShmR2FyY2gpCmxpYnJhcnkoRmluQ2FsKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShNQVNTKQpsaWJyYXJ5KG1hdHJpeFN0YXRzKQpsaWJyYXJ5KHF1YWRwcm9nKQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KHRpbWVTZXJpZXMpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeSh3ZXNhbmRlcnNvbikKbGlicmFyeSh4dGFibGUpCmxpYnJhcnkoeHRzKQpsaWJyYXJ5KHRpZHlxdWFudCkKbGlicmFyeSh0aWR5dmVyc2UpCgojIFNldCBzb21lIG9mIFIgb3B0aW9uczoKb3B0aW9ucyhwcm9tcHQ9IlI+ICIsIHNjaXBlbj05OTksIGRpZ2l0cz00LCB3aWR0aD04MCkKYGBgCgo8cD4KCi0gVG8gbWFrZSB5b3VyIC5ScHJvZmlsZSBmaWxlLCBmb2xsb3cgdGhlc2Ugc3RlcHMuCgotIENyZWF0ZSBhIG5ldyBSIFNjcmlwdCBmaWxlLgogICAgCjxwPgoKIVtdKGFzc2V0cy9wMTUucG5nKQoKPHA+CgotIFlvdXIgUiBTY3JpcHQgZmlsZSBpcyBzaG93biBiZWxvdy4gQW4gUiBTY3JpcHQgZmlsZSBpcyBhIHRleHQgZmlsZSB0aGF0IHlvdSBjYW4gc2F2ZSBjb2RlIGluLgoKPHA+CgohW10oYXNzZXRzL3AxNi5wbmcpCgo8cD4KCi0gQ29weSBhbGwgb2YgdGhlIGNvZGUgZnJvbSB0aGUgUG9ydGZvbGlvIE1hbmFnZW1lbnQgLlJwcm9maWxlIGZpbGUgYWJvdmUgYW5kIHBhc3RlIGl0IGludG8geW91ciBSIFNjcmlwdCBmaWxlLiAKCjxwPgoKIVtdKGFzc2V0cy9wMTcucG5nKQoKPHA+CgotIFNhdmUgdGhlIFIgU2NyaXB0IGZpbGUgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeSAoeW91ciBwcm9qZWN0IGRpcmVjdG9yeSkuIFRoZSBmaWxlIG5hbWUgZG9lcyBub3QgbWF0dGVyIGZvciBub3cuCgo8cD4KCiFbXShhc3NldHMvcDE4LnBuZykKPHA+CgohW10oYXNzZXRzL3AxOS5wbmcpCgo8cD4KCi0gUmVuYW1lIHRoZSBmaWxlIGFzICIuUnByb2ZpbGUiLgoKPHA+CgohW10oYXNzZXRzL3AyMC5wbmcpCjxwPgoKIVtdKGFzc2V0cy9wMjEucG5nKQo8cD4KCi0gWW91IHNob3VsZCBub3cgaGF2ZSB5b3VyIC5ScHJvZmlsZSBmaWxlIGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkuIElmIHlvdSByZXN0YXJ0IFJTdHVkaW8sIHlvdXIgcGFja2FnZXMgc2hvdWxkIGxvYWQgYXV0b21hdGljYWxseS4KCi0gWW91IG1heSBlZGl0IHRoZSAuUnByb2ZpbGUgZmlsZSB0byBhZGQgbGlicmFyeSBjb21tYW5kcyBmb3IgYWRkaXRpb25hbCBwYWNrYWdlcyB5b3UgbWlnaHQgd2FudCB0byBsb2FkIHdoZW4gUiBzdGFydHMgdXAuCgotLS0tCgojIyBSbWFya2Rvd24gYW5kIE5vdGVib29rcwoKPHA+CgotIF9fUm1hcmtkb3duX18gYWxsb3dzIGR5bmFtaWMgZG9jdW1lbnRzIHRvIGJlIGNyZWF0ZWQgaW4gUiB0aGF0IGNvbnRhaW4gd3JpdHRlbiB0ZXh0LCBSIGNvZGUgYW5kIG91dHB1dCBmcm9tIHRoZSBjb2RlLiAKCi0gSSB3aWxsIGFzayB5b3UgdG8gZG8gc29tZSBhc3NpZ25tZW50cyBpbiBhbiBSIE5vdGVib29rIHVzaW5nIG1hcmtkb3duLiAKCiAgICAtIFRoaXMgZ3VpZGUgZm9yIHNldHRpbmctdXAgUiBhbmQgUlN0dWRpbyB3YXMgbWFkZSBpbiBhbiBSIE5vdGVib29rLiBJZiB5b3UgbG9vayBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIHlvdSBjYW4gc2VlIGEgYnV0dG9uIGxhYmVsbGVkICJDb2RlIiB3aGljaCBhbG93cyB5b3UgdG8gZG93bmxvYWQgdGhlIGNvZGUgSSB1c2VkIHRvIG1ha2UgdGhpcyBIVE1MIGZpbGUuCiAgICAKPHA+CgotIEEgbWFya2Rvd24gZG9jdW1lbnQgaXMgd3JpdHRlbiBpbiB1c2luZyBjb2RpbmcgY2FsbGVkIG1hcmtkb3duLCB3aGljaCBpcyBhbiBlYXN5LXRvLXdyaXRlIHBsYWluIHRleHQgZm9ybWF0IHRoYXQgaXMgcmVsYXRlZCB0byBUZVggKG9yIExhVGVYKS4KCi0gQSBUZVggaW5zdGFsbGF0aW9uIGlzIHJlcXVpcmVkIHRvIHVzZSBSbWFya2Rvd24sIHN1Y2ggYXMgTWFjVGV4IChmb3IgTWFjIE9TKSBodHRwOi8vd3d3LnR1Zy5vcmcvbWFjdGV4LyBvciBNaUtUZVggKGNyb3NzLXBsYXRmb3JtKSBodHRwczovL21pa3RleC5vcmcvZG93bmxvYWQuIElmIHlvdSB1c2UgTGFUZVggdG8gd3JpdGUgZG9jdW1lbnRzLCB5b3Ugd2lsbCBhbHJlYWR5IGhhdmUgdGhpcy4gSWYgbm90LCB0aGUgZWFzaWVzdCB3YXkgdG8gZ2V0IGEgVGVYIGluc3RhbGxhdGlvbiBmb3IgbWFya2Rvd24gaXMgdmlhIHRoZSBUaW55VGVYIHBhY2thZ2UuCgotLS0tCgojIyBJbnN0YWxsIFRpbnlUZVggdXNpbmcgdGhlIHBhY2thZ2UgY2FsbGVkIHRpbnl0ZXgKCjxwPgoKLSBZb3UgaGF2ZSBhbHJlYWR5IGluc3RhbGxlZCB0aGUgcGFja2FnZSBjYWxsZWQgdGlueXRleC4gRXhlY3V0aW5nIHRoZSBjb2RlIGJlbG93IGluIHRoZSBjb25zb2xlIHdpbGwgZG93bmxvYWQgdGhlIFRpbnlUZVggZmlsZXMgZnJvbSB0aGUgaW50ZXJuZXQgYW5kIGluc3RhbGwgdGhlbSBvbiB5b3VyIGNvbXB1dGVyIHNvIHRoYXQgeW91IGNhbiBtYWtlIG1hcmtkb3duIGRvY3VtZW50cy4gCgo8cD4KCmBgYHtyLCBldmFsPUYsIG1lc3NhZ2U9RkFMU0V9CnRpbnl0ZXg6Omluc3RhbGxfdGlueXRleCgpCmBgYAoKPHA+CgotIFRoaXMgd2lsbCB0YWtlIHNvbWUgdGltZSB0byBkb3dubG9hZC4KCi0gTm90ZSB0aGF0IHlvdSBkbyBub3QgbmVlZCB0byBkbyB0aGlzIGlmIHlvdSB1c2UgUlN0dWRpbyBDbG91ZCBhcyBUaW55VGVYIGlzIHByZS1pbnN0YWxsZWQuCgotIFdoZW4gdGhlIGluc3RhbGxhdGlvbiBoYXMgZmluaXNoZWQsIHJlc3RhcnQgUlN0dWRpby4KCi0tLS0KCiMjIFRlc3QgeW91ciBSbWFya2Rvd24gZW52aXJvbm1lbnQKCi0gUnVuIHRocm91Z2ggYSBzaW1wbGUgdGVzdCB0byBzZWUgaWYgeW91IGNhbiBtYWtlIGFuIFIgTm90ZWJvb2ssIGFzIGZvbGxvd3MuCgotIE9wZW4gYSBuZXcgUiBOb3RlYm9vay4KCjxwPgoKIVtdKGFzc2V0cy9wMjIucG5nKQoKPHA+CgotIFRoZSBub3RlYm9vayBhbHJlYWR5IGNvbnRhaW5zIGV4YW1wbGUgdGV4dCBhbmQgUiBjb2RlIHRoYXQgcGxvdHMgYSBzaW1wbGUgY2hhcnQuCgo8cD4KCiFbXShhc3NldHMvcDIzLnBuZykKCjxwPgoKLSBSdW4gdGhlIGNvZGUgYnkgcHJlc3NpbmcgIlJ1biBBbGwiIGZyb20gdGhlICJSdW4iIG1lbnUuCgo8cD4KCiFbXShhc3NldHMvcDI0LnBuZykKCjxwPgoKLSBBZnRlciB5b3UgaGF2ZSBydW4gdGhlIGNvZGUsIHlvdSAgc2hvdWxkIHNlZSB0aGUgcGxvdCBhcHBlYXIuCgotIEluY2x1ZGUgeW91ciBuYW1lIGFzIEkgaGF2ZSBhdCB0aGUgdG9wIG9mIHRoZSBOb3RlYm9vay4KCjxwPgoKIVtdKGFzc2V0cy9wMjUucG5nKQoKPHA+CgotIFNhdmUgdGhlIGZpbGUgdG8geW91ciB3b3JraW5nIGRpcmVjdG9yeS4gCgo8cD4KCiFbXShhc3NldHMvcDI2LnBuZykKCjxwPgoKLSBZb3Ugc2hvdWxkIHNlZSB0d28gZmlsZXMgYXBwZWFyLiAKCiAgICAtIFlvdXIgY29kZSBpcyBpbiB0aGUgZmlsZSB3aXRoIHRoZSBleHRlbnNpb24gIi5SbWQiLgogICAgCiAgICAtIFlvdXIgSFRNTCBSIE5vdGVib29rIGhhcyB0aGUgZXh0ZW5zaW9uICIubmIuaHRtbCIuIAogICAgCiAgICA8cD4KCiFbXShhc3NldHMvcDI3LnBuZykKCjxwPgoKLSBPcGVuIHRoZSBIVE1MIGZpbGUgd2l0aCB5b3VyIGJyb3dzZXIuIEl0IHNob3VsZCBsb29rIGxpa2UgdGhpczoKCjxwPgoKIVtdKGFzc2V0cy9wMjgucG5nKQoKPHA+CgotIFdlbGwgZG9uZSEgWW91IGhhdmUgY3JlYXRlZCBhIE5vdGVib29rLgoKLS0tLQoKIyMgSW5mb3JtYXRpb24gb24gUm1hcmtkb3duIGFuZCBUaW55VGVYCgotIEluZm9ybWF0aW9uIG9uIFJtYXJrZG93biBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20vIGFuZCBhIHVzZWZ1bCBndWlkZSBpcyBhdCBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vIGFuZCBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2svIGFuZCBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vLiBFYXN5IGFuZCBoZWxwZnVsIHZpZGVvIGxlc3NvbnMgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tL2xlc3Nvbi0xLmh0bWwuCgotIFJlZmVyZW5jZSBtYXRlcmlhbCBmb3IgVGlueVRlWCBpcyBhdCBodHRwczovL3lpaHVpLm5hbWUvdGlueXRleC8uCgotLS0tCgojIyBSZXNvdXJjZXMgZm9yIFIKCjxwPgoKLSBUaGVyZSBhcmUgbWFueSBndWlkZXMgdG8gdXNpbmcgUiBhdmFpbGFibGUgb25saW5lLCBib3RoIGRvY3VtZW50cyBhbmQgdmlkZW9zLiAKCi0gQSBjb21wcmVoZW5zaXZlIGludHJvZHVjdGlvbiBpcyBhdmFpbGFibGUgb24gQUlNUyBAVmVuYWJsZXMyMDE5IGFuZCBhdCBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy9kb2MvbWFudWFscy9yLXJlbGVhc2UvUi1pbnRyby5wZGYuIAoKLSBPdGhlciBSIGRvY3VtZW50YXRpb24gYW5kIGd1aWRlcyBmb3IgdmFyaW91cyBhcHBsaWNhdGlvbnMgY29udHJpYnV0ZWQgYnkgUiB1c2VycyBjYW4gYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvb3RoZXItZG9jcy5odG1sI2VuZ2xpc2guCgotIE15IFRBIGF0IEtvYmUgVW5pdmVyc2l0eSBwcm9kdWNlZCB0aGUgZm9sbG93aW5nIGd1aWRlcywgYXZhaWxhYmxlIGF0IFtNYXNzaW1pbGlhbm8ncyBSIFBhZ2Ugb24gR2l0SHViXShodHRwczovL2dpdGh1Yi5jb20vbWFzc2ltaWxpYW5vai9SX2JlZ2lubmVycykuCgogICAgLSBSIGZvciBCZWdpbm5lcnMgIAogICAgLSBSIE1hcmtkb3duOiBOb3RlcyBmb3IgRWRpdGluZyAgCiAgICAtIExhVGVYOiBFZGl0aW5nIGZvciBNYXRoZW1hdGljcyAgCgotLS0tCgojIyBDUkFOIFRhc2sgVmlld3MKCjxwPgoKLSBDUkFOIFRhc2sgVmlld3MgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggUi4gUGFja2FnZXMgZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFIuIFRoZXkgcHJvdmlkZSByb3V0aW5lcyBmb3IgdmFyaW91cyB0eXBlcyBvZiBkYXRhIG1hbmlwdWxhdGlvbiwgbWF0aGVtYXRpY2FsIGFuZCBlY29ub21ldHJpYyBtb2RlbHMsIG9wdGltaXNhdGlvbiBtZXRob2RzLCBmaW5hbmNpYWwgbW9kZWxzIGFuZCBtb3JlLiBQYWNrYWdlcyBhcmUgY29uc3RhbnRseSBiZWluZyBkZXZlbG9wZWQgYW5kIHVwZGF0ZWQgYnkgUiB1c2Vycy4KCi0gVGhyZWUgVGFzayBWaWV3cyBhcmUgdXNlZnVsIHRoaXMgY291cnNlOiAgCgogICAgLSBFbXBpcmljYWwgZmluYW5jZTogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3ZpZXdzL0ZpbmFuY2UuaHRtbCAKCiAgICAtIEVjb25vbWV0cmljczogaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3ZpZXdzL0Vjb25vbWV0cmljcy5odG1sICAKCiAgICAtIFRpbWUgc2VyaWVzOiBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvdmlld3MvVGltZVNlcmllcy5odG1sICAKIAotLS0tCgojIyBCb29rcyBvbiBSCgo8cD4KCi0gTWFueSBib29rcyBoYXZlIGJlZW4gcHVibGlzaGVkIG9uIHVzaW5nIFIsIHByb2dyYW1taW5nIHdpdGggUiwgYW5kIHVzaW5nIFIgZm9yIGZpbmFuY2UuCgogICAgLSBGaW5hbmNlOiBAQmVubmV0dDIwMTYsIEBBbmRyZWN1dDIwMTAsIEBUc2F5MjAxMCwgQFRzYXkyMDE0CgogICAgLSBFY29ub21ldHJpY3M6IEBLbGVpYmVyMjAwOCwgQEhvcm5pazIwMDkKICAgIAogICAgLSBDb2Rpbmc6IEBNYXRsb2ZmMjAxMQoKLS0tLQoKIyMgUi1CbG9nZ2VycyAgCgo8cD4KCi0gUi1CbG9nZ2VycyBpcyBhIGJsb2cgc2l0ZSBjb250YWluaW5nIG1hbnkgaGVscGZ1bCBwb3N0cyBvbiB1c2luZyBSOiBodHRwOi8vd3d3LnItYmxvZ2dlcnMuY29tLyAgCgotIFRoZSBwb3N0cyBvbiB0aGUgc2l0ZSBzaG93IHRoZSB3aWRlIHZhcmlldHkgb2YgcHJvYmxlbXMgdGhhdCBjb2RpbmcgaW4gUiBjYW4gYmUgYXBwbGllZCB0byAobm90IGp1c3QgZmluYW5jZSkuIEZvciBleGFtcGxlOgoKICAgIC0gaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vd2hvLXdyb3RlLXRoYXQtYW5vbnltb3VzLW55dC1vcC1lZC10ZXh0LXNpbWlsYXJpdHktYW5hbHlzZXMtd2l0aC1yLwoKICAgIC0gaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vaG93LXRvLWJ1aWxkLWFuaW1hdGVkLWJhci1wbG90cy11c2luZy1yLwoKPHA+CgotIEEgZ29vZCBpbnRyb2R1Y3Rpb24gdG8gbGVhcm5pbmcgUjogaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vaG93LXRvLWxlYXJuLXItMi8KCi0tLS0KCiMjIFNlYXJjaCAgCgo8cD4KCi0gTG90cyBvZiBpbmZvcm1hdGlvbiBpcyBwb3N0ZWQgb25saW5lIGJ5IFIgdXNlcnMgaW5jbHVkaW5nIHF1ZXN0aW9ucyBhbmQgYW5zd2Vycy4gIAoKLSBJZiB5b3UgYXJlIHN0dWNrLCBzZWFyY2ggZm9yIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBoZWxwIHlvdSBhbnN3ZXIgeW91ciBxdWVzdGlvbi4gCgotIHJzZWVrIGlzIGEgc2VhcmNoIGVuZ2luZSBmb3IgUjogd3d3LnJzZWVrLm9yZwoKLSBVc2luZyBhbm90aGVyIHNlYXJjaCBlbmdpbmUgbGlrZSBHb29nbGU6ICAKCiAgICAtICJmaWxldHlwZTpSIHJlZ3Jlc3Npb24g4oCTcmVib2wiICAKCiAgICAtICJDUkFOIHJlZ3Jlc3Npb24iICAgCgotLS0tCgojIyBSU3R1ZGlvIEtleWJvYXJkIFNob3J0Y3V0cyAoZm9yIE1hYykKCjxwPgoKLSBDb2RlIGNvbXBsZXRpb246CiAgICAtIFR5cGUgcGFydCBvZiB0aGUgZnVuY3Rpb24geW91IHdhbnQgYW5kIHRoZW4gcHJlc3MgdGhlIFRhYiBrZXkuICAKICAgIC0gQWxzbyB3b3JrcyBmb3IgZnVuY3Rpb24gYXJndW1lbnRzLCB0aGF0IGlzIHByZXNzIFRhYiB3aGVuIHlvIHVhcmUgaW5zaWRlIHRoZSBicmFja2V0cyBvZiBhIGZ1bmN0aW9uLiAgCiAgICAtIEFsc28gcmVjYWxscyBvYmplY3QgbmFtZXMuCgo8cD4KCi0gUHJlc3MgRjEgKG9yIGZuK0YxKSBmb3IgaGVscCBvbiBhIGZ1bmN0aW9uLiAKICAKLSBSZXRyaWV2ZSBwcmV2aW91cyBjb21tYW5kczogIAogICAgLSBQcmVzcyB0aGUgdXAgb3IgZG93biBhcnJvd3MgdG8gc2Nyb2xsIHRocm91Z2ggeW91ciBjb2RlIGhpc3RvcnkuCiAgCjxwPgoKLSBWaWV3IGEgbGlzdCBvZiBwcmV2aW91cyBjb21tYW5kczogIAogICAgLSBQcmVzcyBDb250cm9sIChvciBDb21tYW5kKSBhbmQgdGhlIHVwIGFycm93LgoKPHA+CgotIFZpZXcgYSBsaXN0IG9mIHByZXZpb3VzIGNvbW1hbmRzIHRoYXQgbWF0Y2ggYSBwcmVmaXg6ICAKICAgIC0gVHlwZSB0aGUgcHJlZml4IGFuZCBwcmVzcyBDb250cm9sIChvckNvbW1hbmQpIGFuZCB0aGUgdXAgYXJyb3cuIAoKPHA+CgotIEVudGVyIGEgbGluZSBvZiBjb2RlIGZyb20gYW4gUiBzY3JpcHQgdG8gdGhlIGNvbnNvbGU6CiAgICAtIENvbW1hbmQgYW5kIGVudGVyLgoKPHA+CgotIEVudGVyIGEgbGluZSBvZiBjb2RlIGZyb20gaGlzdG9yeSB0byBhbmQgUiBzY3JpcHQ6CiAgICAtIFNoaWZ0IGFuZCBlbnRlci4KCjxwPgoKLSBNb3JlOiAgCiAgICAtIFRvb2xzIC0+IEtleWJvYXJkIFNob3J0Y3V0cyBIZWxwICAKICAgIC0gaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVzLzIwMDcxMTg1MyAgCiAgICAKLS0tLQoKPHA+CgogwqkgQ29weXJpZ2h0IENsaW50b24gV2F0a2lucyAyMDIxCiAKLS0tLQoKIyMgUmVmZXJlbmNlcwoKPHA+Cg==