Outline
- Homework
- RMarkdown syntax
- R Notebook formatting
- NYC Open Data
- In-class exercise
R Notebook display options
As you have noticed, you don’t always want to display the output from
your code. You can define how your code displays using chunk options in
2 ways:
- globally: defines the default for every code chunk
- by chunk: defines the display options for the chunk
only
The most common chunk options are:
include = FALSE
prevents code and results from
appearing in the finished file. R Markdown still runs the code in the
chunk, and the results can be used by other chunks.
echo = FALSE
prevents code, but not the results from
appearing in the finished file. This is a useful way to embed
figures.
message = FALSE
prevents messages that are generated by
code from appearing in the finished file.
warning = FALSE
prevents warnings that are generated by
code from appearing in the finished.
fig.cap = "..."
adds a caption to graphical
results.
See the R Markdown Reference Guide for a complete list of
knitr chunk options.
global display options
At the top of your R Notebook, under the title insert a code chunk
with global options using the
knitr::opts_chunk$set
parameter. These will define the
default display options for all code chunks in the Notebook. For
example, the following :

names the chunk “setup”
uses include=FALSE
: do not display this code chunk
in the output
echo = T
: defines global default to show the code
chunk
quietly = T
: defines global default to suppress
messages
message = F
: defines global default to suppress
messages (different and more robust method)
This code chunk should be alone - it should not include any other
code
code chunk display options
To change those global display options for one code chunk (like
load_acs which is very noisy), add any chunk options within the
{r}
of your code chunk. For example, to display the output,
but the not the code for a code chunk:

This chunk displays the following formatted table using the
knitr
package, but doesn’t display the code.

YAML
You can also add define pre-designed themes, add table of contents,
and much more in the title section called the yaml (Yet Another
Markup Language = stupid coding joke). The formatting is very finicky,
when you are following an example make it look EXACTLY
the same. It is complicated but we’ll learn a few.
See this chapter for more details on adjusting the html
document in the title section.
Theme
- add styles with pre-packaged themes
- this notebook uses yeti, see here for more
Table of Contents
toc: true
: create a table of contents _
toc_depth: 3
: create entries in the Table of Contents for
Header 3 and higher
toc_float: true
: toc sticks to the side so you can
always see it

NYC Open Data
NYC Open Data is free public data published by New York City agencies
and other partners.
https://opendata.cityofnewyork.us/
There is a vast amount of data. You can download data from NYC Open
Data, or use the RSocrata
to import the data directly into
R.
We’ll use an example from Boyan Kostadinov at City Tech.
In-class exercise:
The goal of this activity is to explore the 2021 DOE Middle School Directory data from the New
York City Open Data Portal. This activity is an introduction to
exploratory data analysis and visualizations using R and RStudio.
Install three new packages:
RSocrata
: for loading the data from NYC Open Data
knitr
: for printing tables
DT
: for interactive tables in html format
Create a new R Notebook
- name it
nyc_middle_schools.Rmd
- save it in
part2/scripts
- load the tidyverse and the three new packages
Import middle school data
- Go to the NYC Open Data Portal
- Find the 2021 DOE Middle School Directory data
- We can use the RSocrata package to load the data in the CSV format,
directly from the API tab in the NYC Open Data Portal, using the unique
identifier f6s7-vytj for the data.
- Find the link for the data by clicking on the API button, and
copying the link for the CSV version of the data

library(tidyverse)
library(RSocrata)
library(knitr)
library(DT)
# import the data directly into RStudio using url path
data <- read.socrata("https://data.cityofnewyork.us/resource/f6s7-vytj.csv")
## Warning in
## read.socrata("https://data.cityofnewyork.us/resource/f6s7-vytj.csv"): Dates and
## currency fields will be converted to character
Explore and process the data
Follow the instructions in Kostadinov’s R Notebook to select columns, and
create summary statistics of the number of math professors, and correct
some missing values.
Use this dataset to test out different ways to style and format an R
Notebook
Create an R Notebook to share
Asssignment 12a: NYC Open Data analysis
Explore NYC Open Data to see what data is available. Select
a dataset to import via R Socrata and answer a research question about
New York City or related to your final project. Create a R Notebook to
share your analysis. Include:
- Define global display options
- Define display options for at least one code chunk
- Use the
kable
or datatable
functions to
create at least one formatted tables
- Create at least one plot or map
Some suggestions:
- Noise Complaints on 311 on one week:
- import this dataset of all 311 calls in New York City for one
month
- filter to noise complaints
- summarize by Borough or Neighborhood Tabulation Area to see how many 311
calls to report a noise complaint in Sunset Park vs other
neighborhoods
- Motor Vehicle Collisions - Crashes
- import the dataset of all crashes in NYC
- summarize by Borough or Zip Code to see how many crashes occurred in
one neighbohood vs other neighborhoods in the last year
- filter the crashes in the Zip codes in your chosen neighborhood and
use the Lat/Long to create a map of the crash locations in one
neighbohood (hint: use
st_as_sf()
)
Add the link to 2 Notebooks on CANVAS: for your in-class assignment
and for this analysis.
LS0tCnRpdGxlOiAiUiBOb3RlYm9va3MgJiBOWUMgT3BlbiBEYXRhIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiB5ZXRpCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVCwKICAgICAgICAgICAgICAgICAgICAgIHF1aWV0bHkgPSBULAogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEYpCmBgYAoKIyMgT3V0bGluZQoKLSAgIEhvbWV3b3JrCi0gICBSTWFya2Rvd24gc3ludGF4Ci0gICBSIE5vdGVib29rIGZvcm1hdHRpbmcKLSAgIE5ZQyBPcGVuIERhdGEKLSAgIEluLWNsYXNzIGV4ZXJjaXNlCgo8L2JyPgo8L2JyPgoKIyMgSG9tZXdvcmsgUXVlc3Rpb25zCgo8L2JyPgoKUiBOb3RlYm9vayBleGFtcGxlOiBbVW5lbXBsb3ltZW50IGluIE5ldyBKZXJzZXldKGh0dHBzOi8vcnB1YnMuY29tL3NwYXRpYWxjb2xsZWN0aW9ucy9uai11bmVtcGxveW1lbnQpe3RhcmdldD0iX2JsYW5rIn0KCgoKIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjpwdXJwbGUiPldobyBlbHNlIHdhbnRzIHRvIHNoYXJlIHRoZWlyIFJOb3RlYm9vaz88L3NwYW4+Cgo8L2JyPgo8L2JyPjwvYnI+CgojIyBSIE5vdGVib29rIGRpc3BsYXkgb3B0aW9ucwoKQXMgeW91IGhhdmUgbm90aWNlZCwgeW91IGRvbid0IGFsd2F5cyB3YW50IHRvIGRpc3BsYXkgdGhlIG91dHB1dCBmcm9tIHlvdXIgY29kZS4gWW91IGNhbiBkZWZpbmUgaG93IHlvdXIgY29kZSBkaXNwbGF5cyB1c2luZyBjaHVuayBvcHRpb25zIGluIDIgd2F5czoKCi0gICAqZ2xvYmFsbHkqOiBkZWZpbmVzIHRoZSBkZWZhdWx0IGZvciBldmVyeSBjb2RlIGNodW5rCi0gICAqYnkgY2h1bmsqOiBkZWZpbmVzIHRoZSBkaXNwbGF5IG9wdGlvbnMgZm9yIHRoZSBjaHVuayBvbmx5CgpUaGUgbW9zdCBjb21tb24gY2h1bmsgb3B0aW9ucyBhcmU6CgotICAgYGluY2x1ZGUgPSBGQUxTRWAgcHJldmVudHMgY29kZSBhbmQgcmVzdWx0cyBmcm9tIGFwcGVhcmluZyBpbiB0aGUgZmluaXNoZWQgZmlsZS4gUiBNYXJrZG93biBzdGlsbCBydW5zIHRoZSBjb2RlIGluIHRoZSBjaHVuaywgYW5kIHRoZSByZXN1bHRzIGNhbiBiZSB1c2VkIGJ5IG90aGVyIGNodW5rcy4KLSAgIGBlY2hvID0gRkFMU0VgIHByZXZlbnRzIGNvZGUsIGJ1dCBub3QgdGhlIHJlc3VsdHMgZnJvbSBhcHBlYXJpbmcgaW4gdGhlIGZpbmlzaGVkIGZpbGUuIFRoaXMgaXMgYSB1c2VmdWwgd2F5IHRvIGVtYmVkIGZpZ3VyZXMuCi0gICBgbWVzc2FnZSA9IEZBTFNFYCBwcmV2ZW50cyBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgY29kZSBmcm9tIGFwcGVhcmluZyBpbiB0aGUgZmluaXNoZWQgZmlsZS4KLSAgIGB3YXJuaW5nID0gRkFMU0VgIHByZXZlbnRzIHdhcm5pbmdzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBjb2RlIGZyb20gYXBwZWFyaW5nIGluIHRoZSBmaW5pc2hlZC4KLSAgIGBmaWcuY2FwID0gIi4uLiJgIGFkZHMgYSBjYXB0aW9uIHRvIGdyYXBoaWNhbCByZXN1bHRzLgoKU2VlIHRoZSBbUiBNYXJrZG93biBSZWZlcmVuY2UgR3VpZGVdKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzAzL3JtYXJrZG93bi1yZWZlcmVuY2UucGRmP19nYT0yLjE3MzA2ODE5Ni42NjI4NzU1ODUuMTY2ODM1NzQzOS0yMDk1MDQ5MTkzLjE2MzAyNzQ3MzUpe3RhcmdldD0iX2JsYW5rIn0gZm9yIGEgY29tcGxldGUgbGlzdCBvZiBrbml0ciBjaHVuayBvcHRpb25zLgoKIyMjIGdsb2JhbCBkaXNwbGF5IG9wdGlvbnMKCkF0IHRoZSB0b3Agb2YgeW91ciBSIE5vdGVib29rLCB1bmRlciB0aGUgdGl0bGUgaW5zZXJ0IGEgY29kZSBjaHVuayB3aXRoIGdsb2JhbCBvcHRpb25zIHVzaW5nIHRoZSBga25pdHI6Om9wdHNfY2h1bmskc2V0YHBhcmFtZXRlci4gVGhlc2Ugd2lsbCBkZWZpbmUgdGhlIGRlZmF1bHQgZGlzcGxheSBvcHRpb25zIGZvciBhbGwgY29kZSBjaHVua3MgaW4gdGhlIE5vdGVib29rLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyA6Cgo8YnI+CgohW10oaW1nL2dsb2JhbC5wbmcpIAoKLSBuYW1lcyB0aGUgY2h1bmsgInNldHVwIgoKLSB1c2VzIGBpbmNsdWRlPUZBTFNFYCA6IGRvIG5vdCBkaXNwbGF5IHRoaXMgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0CgotIGBlY2hvID0gVGAgOiBkZWZpbmVzIGdsb2JhbCBkZWZhdWx0IHRvIHNob3cgdGhlIGNvZGUgY2h1bmsKCi0gYHF1aWV0bHkgPSBUYCA6IGRlZmluZXMgZ2xvYmFsIGRlZmF1bHQgdG8gc3VwcHJlc3MgbWVzc2FnZXMKCi0gYG1lc3NhZ2UgPSBGYCA6IGRlZmluZXMgZ2xvYmFsIGRlZmF1bHQgdG8gc3VwcHJlc3MgbWVzc2FnZXMgKGRpZmZlcmVudCBhbmQgbW9yZSByb2J1c3QgbWV0aG9kKQoKVGhpcyBjb2RlIGNodW5rIHNob3VsZCBiZSBhbG9uZSAtIGl0IHNob3VsZCBub3QgaW5jbHVkZSBhbnkgb3RoZXIgY29kZQoKPGJyPgoKIyMjIGNvZGUgY2h1bmsgZGlzcGxheSBvcHRpb25zCgpUbyBjaGFuZ2UgdGhvc2UgZ2xvYmFsIGRpc3BsYXkgb3B0aW9ucyBmb3Igb25lIGNvZGUgY2h1bmsgKGxpa2UgbG9hZF9hY3Mgd2hpY2ggaXMgdmVyeSAqbm9pc3kqKSwgYWRkIGFueSBjaHVuayBvcHRpb25zIHdpdGhpbiB0aGUgYHtyfWAgb2YgeW91ciBjb2RlIGNodW5rLiBGb3IgZXhhbXBsZSwgdG8gZGlzcGxheSB0aGUgb3V0cHV0LCBidXQgdGhlIG5vdCB0aGUgY29kZSBmb3IgYSBjb2RlIGNodW5rOgoKIVtdKGltZy9lY2hvX2ZhbHNlLnBuZykKCjxicj4KClRoaXMgY2h1bmsgZGlzcGxheXMgdGhlIGZvbGxvd2luZyBmb3JtYXR0ZWQgdGFibGUgdXNpbmcgdGhlIGBrbml0cmAgcGFja2FnZSwgYnV0IGRvZXNuJ3QgZGlzcGxheSB0aGUgY29kZS4KCiFbXShpbWcva2FibGVfb3V0cHV0LnBuZykKCiMjIyBZQU1MCgpZb3UgY2FuIGFsc28gYWRkIGRlZmluZSBwcmUtZGVzaWduZWQgdGhlbWVzLCBhZGQgdGFibGUgb2YgY29udGVudHMsIGFuZCBtdWNoIG1vcmUgaW4gdGhlIHRpdGxlIHNlY3Rpb24gY2FsbGVkIHRoZSAqeWFtbCogKFlldCBBbm90aGVyIE1hcmt1cCBMYW5ndWFnZSA9IHN0dXBpZCBjb2Rpbmcgam9rZSkuIFRoZSBmb3JtYXR0aW5nIGlzIHZlcnkgZmluaWNreSwgd2hlbiB5b3UgYXJlIGZvbGxvd2luZyBhbiBleGFtcGxlIG1ha2UgaXQgbG9vayAqKkVYQUNUTFkqKiB0aGUgc2FtZS4gSXQgaXMgY29tcGxpY2F0ZWQgYnV0IHdlJ2xsIGxlYXJuIGEgZmV3LgoKU2VlIFt0aGlzIGNoYXB0ZXJdKGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9odG1sLWRvY3VtZW50Lmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gZm9yIG1vcmUgZGV0YWlscyBvbiBhZGp1c3RpbmcgdGhlIGh0bWwgZG9jdW1lbnQgaW4gdGhlIHRpdGxlIHNlY3Rpb24uCgo8YnI+CgotICAgVGhlbWUKCiAgICAtICAgYWRkIHN0eWxlcyB3aXRoIHByZS1wYWNrYWdlZCB0aGVtZXMKICAgIC0gICB0aGlzIG5vdGVib29rIHVzZXMgeWV0aSwgc2VlIFtoZXJlXShodHRwczovL3d3dy5kYXRhZHJlYW1pbmcub3JnL3Bvc3Qvci1tYXJrZG93bi10aGVtZS1nYWxsZXJ5Lyl7dGFyZ2V0PSJfYmxhbmsifSBmb3IgbW9yZQoKLSAgIFRhYmxlIG9mIENvbnRlbnRzCgogICAgLSAgIGB0b2M6IHRydWVgOiBjcmVhdGUgYSB0YWJsZSBvZiBjb250ZW50cyBcXyBgdG9jX2RlcHRoOiAzYDogY3JlYXRlIGVudHJpZXMgaW4gdGhlIFRhYmxlIG9mIENvbnRlbnRzIGZvciBIZWFkZXIgMyBhbmQgaGlnaGVyCiAgICAtICAgYHRvY19mbG9hdDogdHJ1ZWA6IHRvYyBzdGlja3MgdG8gdGhlIHNpZGUgc28geW91IGNhbiBhbHdheXMgc2VlIGl0CgohW10oaW1nL3lhbWwucG5nKQoKPGJyPiA8YnI+CgojIyBOWUMgT3BlbiBEYXRhCgpOWUMgT3BlbiBEYXRhIGlzIGZyZWUgcHVibGljIGRhdGEgcHVibGlzaGVkIGJ5IE5ldyBZb3JrIENpdHkgYWdlbmNpZXMgYW5kIG90aGVyIHBhcnRuZXJzLgoKW2h0dHBzOi8vb3BlbmRhdGEuY2l0eW9mbmV3eW9yay51cy9dKGh0dHBzOi8vb3BlbmRhdGEuY2l0eW9mbmV3eW9yay51cy8pe3RhcmdldD0iX2JsYW5rIn0KCjxicj4KClRoZXJlIGlzIGEgdmFzdCBhbW91bnQgb2YgZGF0YS4gWW91IGNhbiBkb3dubG9hZCBkYXRhIGZyb20gTllDIE9wZW4gRGF0YSwgb3IgdXNlIHRoZSBgUlNvY3JhdGFgIHRvIGltcG9ydCB0aGUgZGF0YSBkaXJlY3RseSBpbnRvIFIuCgpXZSdsbCB1c2UgYW4gW2V4YW1wbGUgZnJvbSBCb3lhbiBLb3N0YWRpbm92XShodHRwczovL3JwdWJzLmNvbS9ia29zdGFkaS9kYXRhX2FuYWx5c2lzX2NpdGUyMDIyKXt0YXJnZXQ9Il9ibGFuayJ9IGF0IENpdHkgVGVjaC4KCiMjIEluLWNsYXNzIGV4ZXJjaXNlOgoKVGhlIGdvYWwgb2YgdGhpcyBhY3Rpdml0eSBpcyB0byBleHBsb3JlIHRoZSBbMjAyMSBET0UgTWlkZGxlIFNjaG9vbCBEaXJlY3RvcnkgZGF0YV0oaHR0cHM6Ly9kYXRhLmNpdHlvZm5ld3lvcmsudXMvRWR1Y2F0aW9uLzIwMjEtRE9FLU1pZGRsZS1TY2hvb2wtRGlyZWN0b3J5L2Y2czctdnl0ail7dGFyZ2V0PSJfYmxhbmsifSBmcm9tIHRoZSBOZXcgWW9yayBDaXR5IE9wZW4gRGF0YSBQb3J0YWwuIFRoaXMgYWN0aXZpdHkgaXMgYW4gaW50cm9kdWN0aW9uIHRvIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMgYW5kIHZpc3VhbGl6YXRpb25zIHVzaW5nIFIgYW5kIFJTdHVkaW8uCgojIyMgSW5zdGFsbCB0aHJlZSBuZXcgcGFja2FnZXM6CgotICAgYFJTb2NyYXRhYDogZm9yIGxvYWRpbmcgdGhlIGRhdGEgZnJvbSBOWUMgT3BlbiBEYXRhCi0gICBga25pdHJgOiBmb3IgcHJpbnRpbmcgdGFibGVzCi0gICBgRFRgOiBmb3IgaW50ZXJhY3RpdmUgdGFibGVzIGluIGh0bWwgZm9ybWF0CgojIyMgQ3JlYXRlIGEgbmV3IFIgTm90ZWJvb2sKCi0gICBuYW1lIGl0IGBueWNfbWlkZGxlX3NjaG9vbHMuUm1kYAotICAgc2F2ZSBpdCBpbiBgcGFydDIvc2NyaXB0c2AKLSAgIGxvYWQgdGhlIHRpZHl2ZXJzZSBhbmQgdGhlIHRocmVlIG5ldyBwYWNrYWdlcwoKIyMjIEltcG9ydCBtaWRkbGUgc2Nob29sIGRhdGEKCi0gICBHbyB0byB0aGUgTllDIE9wZW4gRGF0YSBQb3J0YWwKLSAgIEZpbmQgdGhlIFsyMDIxIERPRSBNaWRkbGUgU2Nob29sIERpcmVjdG9yeSBkYXRhXShodHRwczovL2RhdGEuY2l0eW9mbmV3eW9yay51cy9FZHVjYXRpb24vMjAyMS1ET0UtTWlkZGxlLVNjaG9vbC1EaXJlY3RvcnkvZjZzNy12eXRqKXt0YXJnZXQ9Il9ibGFuayJ9CiAgICAtICAgV2UgY2FuIHVzZSB0aGUgUlNvY3JhdGEgcGFja2FnZSB0byBsb2FkIHRoZSBkYXRhIGluIHRoZSBDU1YgZm9ybWF0LCBkaXJlY3RseSBmcm9tIHRoZSBBUEkgdGFiIGluIHRoZSBOWUMgT3BlbiBEYXRhIFBvcnRhbCwgdXNpbmcgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGY2czctdnl0aiBmb3IgdGhlIGRhdGEuCiAgICAtICAgRmluZCB0aGUgbGluayBmb3IgdGhlIGRhdGEgYnkgY2xpY2tpbmcgb24gdGhlIEFQSSBidXR0b24sIGFuZCBjb3B5aW5nIHRoZSBsaW5rIGZvciB0aGUgQ1NWIHZlcnNpb24gb2YgdGhlIGRhdGEKCiFbXShpbWcvbWlkZGxlX3NjaG9vbC5wbmcpCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoUlNvY3JhdGEpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoRFQpCgojIGltcG9ydCB0aGUgZGF0YSBkaXJlY3RseSBpbnRvIFJTdHVkaW8gdXNpbmcgdXJsIHBhdGgKZGF0YSA8LSByZWFkLnNvY3JhdGEoImh0dHBzOi8vZGF0YS5jaXR5b2ZuZXd5b3JrLnVzL3Jlc291cmNlL2Y2czctdnl0ai5jc3YiKQoKYGBgCgojIyMgRXhwbG9yZSBhbmQgcHJvY2VzcyB0aGUgZGF0YQoKRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gW0tvc3RhZGlub3YncyBSIE5vdGVib29rXShodHRwczovL3JwdWJzLmNvbS9ia29zdGFkaS9kYXRhX2FuYWx5c2lzX2NpdGUyMDIyKXt0YXJnZXQ9Il9ibGFuayJ9IHRvIHNlbGVjdCBjb2x1bW5zLCBhbmQgY3JlYXRlIHN1bW1hcnkgc3RhdGlzdGljcyBvZiB0aGUgbnVtYmVyIG9mIG1hdGggcHJvZmVzc29ycywgYW5kIGNvcnJlY3Qgc29tZSBtaXNzaW5nIHZhbHVlcy4KClVzZSB0aGlzIGRhdGFzZXQgdG8gdGVzdCBvdXQgZGlmZmVyZW50IHdheXMgdG8gc3R5bGUgYW5kIGZvcm1hdCBhbiBSIE5vdGVib29rCgojIyMgQ3JlYXRlIGFuIFIgTm90ZWJvb2sgdG8gc2hhcmUKCi0gICBDcmVhdGUgYSBuZXcgUiBOb3RlYm9vayB0byBzaGFyZSB5b3VyIG1pZGRsZSBzY2hvb2wgbWF0aCB0ZWFjaGVyIGFuYWx5c2lzLgoKICAgIC0gICBEZWZpbmUgZ2xvYmFsIGRpc3BsYXkgb3B0aW9ucwogICAgLSAgIERlZmluZSBkaXNwbGF5IG9wdGlvbnMgZm9yIGF0IGxlYXN0IG9uZSBjb2RlIGNodW5rCiAgICAtICAgVXNlIHRoZSBga2FibGVgIG9yIGBkYXRhdGFibGVgIGZ1bmN0aW9ucyB0byBjcmVhdGUgZm9ybWF0dGVkIHRhYmxlcwoKIyMgQXNzc2lnbm1lbnQgMTJhOiBOWUMgT3BlbiBEYXRhIGFuYWx5c2lzCgpFeHBsb3JlIFtOWUMgT3BlbiBEYXRhXShodHRwczovL29wZW5kYXRhLmNpdHlvZm5ld3lvcmsudXMvKXt0YXJnZXQ9Il9ibGFuayJ9IHRvIHNlZSB3aGF0IGRhdGEgaXMgYXZhaWxhYmxlLiBTZWxlY3QgYSBkYXRhc2V0IHRvIGltcG9ydCB2aWEgUiBTb2NyYXRhIGFuZCBhbnN3ZXIgYSByZXNlYXJjaCBxdWVzdGlvbiBhYm91dCBOZXcgWW9yayBDaXR5IG9yIHJlbGF0ZWQgdG8geW91ciBmaW5hbCBwcm9qZWN0LiBDcmVhdGUgYSBSIE5vdGVib29rIHRvIHNoYXJlIHlvdXIgYW5hbHlzaXMuIEluY2x1ZGU6CgotICAgRGVmaW5lIGdsb2JhbCBkaXNwbGF5IG9wdGlvbnMKLSAgIERlZmluZSBkaXNwbGF5IG9wdGlvbnMgZm9yIGF0IGxlYXN0IG9uZSBjb2RlIGNodW5rCi0gICBVc2UgdGhlIGBrYWJsZWAgb3IgYGRhdGF0YWJsZWAgZnVuY3Rpb25zIHRvIGNyZWF0ZSBhdCBsZWFzdCBvbmUgZm9ybWF0dGVkIHRhYmxlcwotICAgQ3JlYXRlIGF0IGxlYXN0IG9uZSBwbG90IG9yIG1hcAoKU29tZSBzdWdnZXN0aW9uczoKCi0gICBbTm9pc2UgQ29tcGxhaW50cyBvbiAzMTEgb24gb25lIHdlZWtdKGh0dHBzOi8vZGF0YS5jaXR5b2ZuZXd5b3JrLnVzL0NpdHktR292ZXJubWVudC8zMTEtQ2FsbC1DZW50ZXItSW5xdWlyeS93ZXdwLW1tM3AvYWJvdXRfZGF0YSl7dGFyZ2V0PSJfYmxhbmsifToKICAgIC0gICBpbXBvcnQgdGhpcyBkYXRhc2V0IG9mIGFsbCAzMTEgY2FsbHMgaW4gTmV3IFlvcmsgQ2l0eSBmb3Igb25lIG1vbnRoCiAgICAtICAgZmlsdGVyIHRvIG5vaXNlIGNvbXBsYWludHMgCiAgICAtICAgc3VtbWFyaXplIGJ5IEJvcm91Z2ggb3IgW05laWdoYm9yaG9vZCBUYWJ1bGF0aW9uIEFyZWFdKGh0dHBzOi8vZGF0YS5jaXR5b2ZuZXd5b3JrLnVzL0NpdHktR292ZXJubWVudC9OVEEtbWFwL2QzcWstcGZ5eil7dGFyZ2V0PSJfYmxhbmsifSB0byBzZWUgaG93IG1hbnkgMzExIGNhbGxzIHRvIHJlcG9ydCBhIG5vaXNlIGNvbXBsYWludCBpbiBTdW5zZXQgUGFyayB2cyBvdGhlciBuZWlnaGJvcmhvb2RzCi0gICBbTW90b3IgVmVoaWNsZSBDb2xsaXNpb25zIC0gQ3Jhc2hlc10oaHR0cHM6Ly9kYXRhLmNpdHlvZm5ld3lvcmsudXMvUHVibGljLVNhZmV0eS9Nb3Rvci1WZWhpY2xlLUNvbGxpc2lvbnMtQ3Jhc2hlcy9oOWdpLW54OTUpe3RhcmdldD0iX2JsYW5rIn0KICAgIC0gICBpbXBvcnQgdGhlIGRhdGFzZXQgb2YgYWxsIGNyYXNoZXMgaW4gTllDCiAgICAtICAgc3VtbWFyaXplIGJ5IEJvcm91Z2ggb3IgWmlwIENvZGUgdG8gc2VlIGhvdyBtYW55IGNyYXNoZXMgb2NjdXJyZWQgaW4gb25lIG5laWdoYm9ob29kIHZzIG90aGVyIG5laWdoYm9yaG9vZHMgaW4gdGhlIGxhc3QgeWVhcgogICAgLSAgIGZpbHRlciB0aGUgY3Jhc2hlcyBpbiB0aGUgWmlwIGNvZGVzIGluIHlvdXIgY2hvc2VuIG5laWdoYm9yaG9vZCBhbmQgdXNlIHRoZSBMYXQvTG9uZyB0byBjcmVhdGUgYSBtYXAgb2YgdGhlIGNyYXNoIGxvY2F0aW9ucyBpbiBvbmUgbmVpZ2hib2hvb2QgKGhpbnQ6IHVzZSBgc3RfYXNfc2YoKWApCgpBZGQgdGhlIGxpbmsgdG8gMiBOb3RlYm9va3Mgb24gQ0FOVkFTOiBmb3IgeW91ciBpbi1jbGFzcyBhc3NpZ25tZW50IGFuZCBmb3IgdGhpcyBhbmFseXNpcy4KCjxicj4gPGJyPgoKCg==