1 More Controls with YAML

One can add some additional controls of the knitted document to the YAML header.

  • code_folding: "hide" to hide the code chunk to make the knitted document cleaner.
  • code_download: true to allow downloading RMD source from the HTML page.

2 HTML Tags for YAML

In general, the YAML header lays out the title of the knitted document. It can be decorated using CSS. The content in YAML that passes to the knitted document is enclosed in double quotes. One could also use HTML tags directly to add new features to the title. When doing this, you need to change the default double quotes to single quotes. For example, '<font color = "purple">Some R Markdown Tips</font>' changes the color from navy to purple.

3 Commonly Used HTML Tags

Most frequently used HTML tags

  • <font> </font> - font decoration
  • <a href=""> </a> - hyperlink
  • <img src=""> - including an image
  • <center> </center> -
    alignment
  • <br> - line break
  • hr - horizontal line
  • <div>... </div> - divide
  • <p> </p> - paragraph
  • <ul> </ul> - unordered list
  • <ol> </ol> - ordered list
  • <li> </li> - list (<li>) is used with either <ol> or <ul>. The default is <ul>.
  • <table><tr><td> ... </td></tr></table> - defining HTML table
  • <tr> - defining table row
  • <td> - defining table column
Company Contact Country
Alfreds Futterkiste Maria Anders Germany
Centro comercial Moctezuma Francisco Chang Mexico

4 Figure in Two Columns

Arguments out.width and out.height apply to both existing images and R-generated figures.

Unlike the fig.width and fig.height arguments which only affect dynamic figures, the out.width and out.height arguments can be used with any type of graphic and conveniently can accept sizes in pixels or percentages as a string with % or px as a suffix.

Keep in mind that the % refers to the percent of the HTML container. For example, if the block of text that the image is in is 1000px wide then the image will be 200px using 20%.

out.width can also be used to lay out multi-column figures.

boxplot(1:10)
plot(rnorm(10))
plot(density(rnorm(100)))

5 Turn Sections to Tabs

Tab format HTML documents are sometimes easy for readers to read the document. R Markdown can convert section-format documents to tab-format documents easily. The following is a simple example based on the popular R mtcars dataset.

5.1 An Example of Tab Format Document

5.1.1 Scatter Plot

As an example, the following scatter plot shows the relationship between gross horsepower and mile per gallon.

mtcars %>% 
  ggplot(aes(x = hp, y = mpg)) +
  geom_point()

5.1.2 Summary Table

The following summarized table gives the distributional information of the data set.

summary(mtcars)
      mpg             cyl             disp             hp       
 Min.   :10.40   Min.   :4.000   Min.   : 71.1   Min.   : 52.0  
 1st Qu.:15.43   1st Qu.:4.000   1st Qu.:120.8   1st Qu.: 96.5  
 Median :19.20   Median :6.000   Median :196.3   Median :123.0  
 Mean   :20.09   Mean   :6.188   Mean   :230.7   Mean   :146.7  
 3rd Qu.:22.80   3rd Qu.:8.000   3rd Qu.:326.0   3rd Qu.:180.0  
 Max.   :33.90   Max.   :8.000   Max.   :472.0   Max.   :335.0  
      drat             wt             qsec             vs        
 Min.   :2.760   Min.   :1.513   Min.   :14.50   Min.   :0.0000  
 1st Qu.:3.080   1st Qu.:2.581   1st Qu.:16.89   1st Qu.:0.0000  
 Median :3.695   Median :3.325   Median :17.71   Median :0.0000  
 Mean   :3.597   Mean   :3.217   Mean   :17.85   Mean   :0.4375  
 3rd Qu.:3.920   3rd Qu.:3.610   3rd Qu.:18.90   3rd Qu.:1.0000  
 Max.   :4.930   Max.   :5.424   Max.   :22.90   Max.   :1.0000  
       am              gear            carb      
 Min.   :0.0000   Min.   :3.000   Min.   :1.000  
 1st Qu.:0.0000   1st Qu.:3.000   1st Qu.:2.000  
 Median :0.0000   Median :4.000   Median :2.000  
 Mean   :0.4062   Mean   :3.688   Mean   :2.812  
 3rd Qu.:1.0000   3rd Qu.:4.000   3rd Qu.:4.000  
 Max.   :1.0000   Max.   :5.000   Max.   :8.000  

6 GIF Animation

R has several animation libraries one can use to generate animated graphs to explain some of the complex concepts visually. Sometimes people can generate a series of related images and then use software programs to make a GIF image. This external GIF can also be included in the R Markdown document.

for (i in 1:5) {
  pie(c(i %% 5, 1, 3), col = c('red', 'yellow', "blue"), labels = paste(i))
}

7 Load An External image

In addition to the R-generated graphics, we can also include external images in different formats in the R Markdown document. out.width= and out.height= options should be used to control the size of the images.

include_graphics("https://editor.analyticsvidhya.com/uploads/75819stats_1050x520.png")

8 Inline Chunk Options

If too many chunk options are required to lay out the figure, it is not convenient to put all of them in the code chunk. One way to handle this situation is to use inline chunk options.

plot_ly(x=mtcars$wt,y=mtcars$mpg,mode = "markers",color = as.factor(mtcars$vs))

My caption

9 Including CSS

There are three ways of inserting a style sheet in the RMarkdown document: inline CSS, internal CSS, and external CSS. We have used all three different formats of CSS in this RMD to format the text or decorate the layout on different occasions. To summarize,

  • inline CSS: This is an example showing how to change the font size, face, color, etc.

  • internal CSS: The internal CSS was included at YAML and setup code chunk (Here Is the screenshot)

  • External CSS: The external CSS style file used in this document can be found (here)

10 Verbatim Code Chunks

Typically we write code chunks and inline expressions that we want to be parsed and evaluated by knitr. However, if we are trying to write a tutorial on using knitr`, we may need to generate a verbatim code chunk or inline expression that is not parsed by knitr, and we want to display the content of the chunk header and all related options.


```{r out.width=c('50%', '50%'), fig.show='hold'}
boxplot(1:10)
plot(rnorm(10))
plot(density(rnorm(100)))
```
LS0tDQp0aXRsZTogJzxmb250IGNvbG9yID0gInB1cnBsZSI+PEI+U29tZSBSIE1hcmtkb3duIFRpcHM8L2I+PC9mb250PicNCmF1dGhvcjogIkNoZW5nIFBlbmciDQpkYXRlOiAiV2VzdCBDaGVzdGVyIFVuaXZlcnNpdHkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGNzczogY3NzL2NwUk1Ec3R5bGUuY3NzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQovKiBUYWIgZmVhdHVyZXMgKi8NCi5uYXY+bGk+YSB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIGRpc3BsYXk6IGJsb2NrOw0KICAgIHBhZGRpbmc6IDEwcHggMTVweDsNCiAgICBjb2xvcjogcHVycGxlOw0KfQ0KLm5hdi1waWxscz5saS5hY3RpdmU+YSwgLm5hdi1waWxscz5saS5hY3RpdmU+YTpob3ZlciwgLm5hdi1waWxscz5saS5hY3RpdmU+YTpmb2N1cyB7DQogICAgY29sb3I6IGRhcmtyZWQNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBwdXJwbGU7DQp9DQoNCi8qDQpuYXYtcGlsbHM+bGk6bnRoLWNoaWxkKDIpIHsNCiAgICBiYWNrZ3JvdW5kOiBkYXJrcmVkOw0KIH0NCiAqLw0KPC9zdHlsZT4NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgiZ2lmc2tpIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdpZnNraSIpDQogICBsaWJyYXJ5KGdpZnNraSkNCn0NCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogICBsaWJyYXJ5KHBsb3RseSkNCn0NCiMga25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiQzpcXFNUQTQ5MFxcdzA1IikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSkNCmBgYA0KDQpcDQoNCg0KIyBNb3JlIENvbnRyb2xzIHdpdGggWUFNTA0KDQpPbmUgY2FuIGFkZCBzb21lIGFkZGl0aW9uYWwgY29udHJvbHMgb2YgdGhlIGtuaXR0ZWQgZG9jdW1lbnQgdG8gdGhlIFlBTUwgaGVhZGVyLg0KDQoqIGBjb2RlX2ZvbGRpbmc6ICJoaWRlImAgdG8gaGlkZSB0aGUgY29kZSBjaHVuayB0byBtYWtlIHRoZSBrbml0dGVkIGRvY3VtZW50IGNsZWFuZXIuDQoqIGBjb2RlX2Rvd25sb2FkOiB0cnVlYCB0byBhbGxvdyBkb3dubG9hZGluZyBSTUQgc291cmNlIGZyb20gdGhlIEhUTUwgcGFnZS4NCg0KDQojIEhUTUwgVGFncyBmb3IgWUFNTA0KDQpJbiBnZW5lcmFsLCB0aGUgWUFNTCBoZWFkZXIgbGF5cyBvdXQgdGhlIHRpdGxlIG9mIHRoZSBrbml0dGVkIGRvY3VtZW50LiBJdCBjYW4gYmUgZGVjb3JhdGVkIHVzaW5nIENTUy4gVGhlIGNvbnRlbnQgaW4gWUFNTCB0aGF0IHBhc3NlcyB0byB0aGUga25pdHRlZCBkb2N1bWVudCBpcyBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzLiBPbmUgY291bGQgYWxzbyB1c2UgSFRNTCB0YWdzIGRpcmVjdGx5IHRvIGFkZCBuZXcgZmVhdHVyZXMgdG8gdGhlIHRpdGxlLiBXaGVuIGRvaW5nIHRoaXMsIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBkb3VibGUgcXVvdGVzIHRvIHNpbmdsZSBxdW90ZXMuDQpGb3IgZXhhbXBsZSwgYCc8Zm9udCBjb2xvciA9ICJwdXJwbGUiPlNvbWUgUiBNYXJrZG93biBUaXBzPC9mb250PidgIGNoYW5nZXMgdGhlIGNvbG9yIGZyb20gYG5hdnlgIHRvIGBwdXJwbGVgLg0KDQoNCg0KIyBDb21tb25seSBVc2VkIEhUTUwgVGFncw0KDQpNb3N0IGZyZXF1ZW50bHkgdXNlZCBIVE1MIHRhZ3MNCg0KKiBgPGZvbnQ+IDwvZm9udD5gIC0gPGZvbnQgY29sb3I9ICJyZWQiIHNpemUgPTQgYWxpZ249ImNlbnRlciIgPjxiPiBmb250IGRlY29yYXRpb24gPC9iPjwvZm9udD4NCiogYDxhIGhyZWY9IiI+IDwvYT5gIC08YSBocmVmPSJodHRwczovL3Blbmdkc2NpLmdpdGh1Yi5pby9TVEE0OTAvIj4gaHlwZXJsaW5rPC9hPg0KKiBgPGltZyBzcmM9IiI+YCAtIDxpbWcgc3JjID0gImh0dHBzOi8vcGtncy5yc3R1ZGlvLmNvbS9ybWFya2Rvd24vcmVmZXJlbmNlL2ZpZ3VyZXMvbG9nby5wbmciIHdpZHRoPTUwIGhlaWdodD01MD4gaW5jbHVkaW5nIGFuIGltYWdlIA0KKiBgPGNlbnRlcj4gPC9jZW50ZXI+YCAtIDxjZW50ZXI+PGZvbnQgY29sb3IgPSAic2t5Ymx1ZSI+PGI+YWxpZ25tZW50PC9iPjwvZm9udD48L2NlbnRlcj4NCiogYDxicj5gIC0gbGluZSBicmVhaw0KKiBgaHJgIC0gaG9yaXpvbnRhbCBsaW5lDQoqIGA8ZGl2Pi4uLiA8L2Rpdj5gIC0gZGl2aWRlIA0KKiBgPHA+IDwvcD5gIC0gcGFyYWdyYXBoIA0KKiBgPHVsPiA8L3VsPmAgLSB1bm9yZGVyZWQgbGlzdA0KKiBgPG9sPiA8L29sPmAgLSBvcmRlcmVkIGxpc3QNCiogYDxsaT4gPC9saT5gIC0gbGlzdCAoYDxsaT5gKSBpcyB1c2VkIHdpdGggZWl0aGVyIGA8b2w+YCBvciBgPHVsPmAuIFRoZSBkZWZhdWx0IGlzIGA8dWw+YC4NCiogYDx0YWJsZT48dHI+PHRkPiAuLi4gPC90ZD48L3RyPjwvdGFibGU+YCAtIGRlZmluaW5nIEhUTUwgdGFibGUgDQoqIGA8dHI+YCAtIGRlZmluaW5nIHRhYmxlIHJvdw0KKiBgPHRkPmAgLSBkZWZpbmluZyB0YWJsZSBjb2x1bW4NCg0KPHRhYmxlIGJvcmRlciA9ICIyIiBib3JkZXJjb2xvcj0iZ3JlZW4iICBiZ2NvbG9yPSJncmF5IiAgd2lkdGg9IjkwJSI+DQogIDx0ciBib3JkZXJjb2xvcj0icmVkIj4NCiAgICA8dGg+Q29tcGFueTwvdGg+DQogICAgPHRoPkNvbnRhY3Q8L3RoPg0KICAgIDx0aD5Db3VudHJ5PC90aD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZD5BbGZyZWRzIEZ1dHRlcmtpc3RlPC90ZD4NCiAgICA8dGQ+TWFyaWEgQW5kZXJzPC90ZD4NCiAgICA8dGQ+R2VybWFueTwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQ+Q2VudHJvIGNvbWVyY2lhbCBNb2N0ZXp1bWE8L3RkPg0KICAgIDx0ZD5GcmFuY2lzY28gQ2hhbmc8L3RkPg0KICAgIDx0ZD5NZXhpY288L3RkPg0KICA8L3RyPg0KPC90YWJsZT4NCg0KDQojIEZpZ3VyZSBpbiBUd28gQ29sdW1ucw0KDQpBcmd1bWVudHMgYG91dC53aWR0aGAgYW5kIGBvdXQuaGVpZ2h0YCBhcHBseSB0byBib3RoIGV4aXN0aW5nIGltYWdlcyBhbmQgUi1nZW5lcmF0ZWQgZmlndXJlcy4gDQoNClVubGlrZSB0aGUgYGZpZy53aWR0aGAgYW5kIGBmaWcuaGVpZ2h0YCBhcmd1bWVudHMgd2hpY2ggb25seSBhZmZlY3QgZHluYW1pYyBmaWd1cmVzLCB0aGUgYG91dC53aWR0aGAgYW5kIGBvdXQuaGVpZ2h0YCBhcmd1bWVudHMgY2FuIGJlIHVzZWQgd2l0aCBhbnkgdHlwZSBvZiBncmFwaGljIGFuZCBjb252ZW5pZW50bHkgY2FuIGFjY2VwdCBzaXplcyBpbiBwaXhlbHMgb3IgcGVyY2VudGFnZXMgYXMgYSBzdHJpbmcgd2l0aCAlIG9yIHB4IGFzIGEgc3VmZml4Lg0KDQpLZWVwIGluIG1pbmQgdGhhdCB0aGUgJSByZWZlcnMgdG8gdGhlIHBlcmNlbnQgb2YgdGhlIEhUTUwgY29udGFpbmVyLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGJsb2NrIG9mIHRleHQgdGhhdCB0aGUgaW1hZ2UgaXMgaW4gaXMgMTAwMHB4IHdpZGUgdGhlbiB0aGUgaW1hZ2Ugd2lsbCBiZSAyMDBweCB1c2luZyAyMCUuDQoNCg0KYG91dC53aWR0aGAgY2FuIGFsc28gYmUgdXNlZCB0byBsYXkgb3V0IG11bHRpLWNvbHVtbiBmaWd1cmVzLg0KDQoNCmBgYHtyIG91dC53aWR0aD1jKCc1MCUnLCAnNTAlJyksIGZpZy5zaG93PSdob2xkJ30NCmJveHBsb3QoMToxMCkNCnBsb3Qocm5vcm0oMTApKQ0KcGxvdChkZW5zaXR5KHJub3JtKDEwMCkpKQ0KYGBgDQoNCiMgVHVybiBTZWN0aW9ucyB0byBUYWJzDQoNClRhYiBmb3JtYXQgSFRNTCBkb2N1bWVudHMgYXJlIHNvbWV0aW1lcyBlYXN5IGZvciByZWFkZXJzIHRvIHJlYWQgdGhlIGRvY3VtZW50LiBSIE1hcmtkb3duIGNhbiBjb252ZXJ0IHNlY3Rpb24tZm9ybWF0IGRvY3VtZW50cyB0byB0YWItZm9ybWF0IGRvY3VtZW50cyBlYXNpbHkuIFRoZSBmb2xsb3dpbmcgaXMgYSBzaW1wbGUgZXhhbXBsZSBiYXNlZCBvbiB0aGUgcG9wdWxhciBbUiBtdGNhcnMgZGF0YXNldF0oaHR0cHM6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vNjE4MDBfZmFlYTkzNTQ4YzZiNDljYzkxY2QwYzVlZjUwNTk4OTQuaHRtbCkuDQoNCiMjIEFuIEV4YW1wbGUgb2YgVGFiIEZvcm1hdCBEb2N1bWVudCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIFNjYXR0ZXIgUGxvdA0KDQpBcyBhbiBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHNjYXR0ZXIgcGxvdCBzaG93cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYGdyb3NzIGhvcnNlcG93ZXJgIGFuZCBgbWlsZSBwZXIgZ2FsbG9uYC4NCg0KDQpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTN9DQptdGNhcnMgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBocCwgeSA9IG1wZykpICsNCiAgZ2VvbV9wb2ludCgpDQpgYGANCg0KIyMjIFN1bW1hcnkgVGFibGUNCg0KVGhlIGZvbGxvd2luZyBzdW1tYXJpemVkIHRhYmxlIGdpdmVzIHRoZSBkaXN0cmlidXRpb25hbCBpbmZvcm1hdGlvbiBvZiB0aGUgZGF0YSBzZXQuDQoNCmBgYHtyfQ0KI3wgY29sbGFwc2UgPSBGQUxTRQ0Kc3VtbWFyeShtdGNhcnMpDQpgYGANCg0KDQojIEdJRiBBbmltYXRpb24NCg0KUiBoYXMgc2V2ZXJhbCBhbmltYXRpb24gbGlicmFyaWVzIG9uZSBjYW4gdXNlIHRvIGdlbmVyYXRlIGFuaW1hdGVkIGdyYXBocyB0byBleHBsYWluIHNvbWUgb2YgdGhlIGNvbXBsZXggY29uY2VwdHMgdmlzdWFsbHkuIFNvbWV0aW1lcyBwZW9wbGUgY2FuIGdlbmVyYXRlIGEgc2VyaWVzIG9mIHJlbGF0ZWQgaW1hZ2VzIGFuZCB0aGVuIHVzZSBzb2Z0d2FyZSBwcm9ncmFtcyB0byBtYWtlIGEgR0lGIGltYWdlLiBUaGlzIGV4dGVybmFsIEdJRiBjYW4gYWxzbyBiZSBpbmNsdWRlZCBpbiB0aGUgUiBNYXJrZG93biBkb2N1bWVudC4gDQoNCmBgYHtyLCBhbmltYXRpb24uaG9vaz0nZ2lmc2tpJ30NCmZvciAoaSBpbiAxOjUpIHsNCiAgcGllKGMoaSAlJSA1LCAxLCAzKSwgY29sID0gYygncmVkJywgJ3llbGxvdycsICJibHVlIiksIGxhYmVscyA9IHBhc3RlKGkpKQ0KfQ0KYGBgDQoNCiMgTG9hZCBBbiBFeHRlcm5hbCBpbWFnZQ0KDQpJbiBhZGRpdGlvbiB0byB0aGUgUi1nZW5lcmF0ZWQgZ3JhcGhpY3MsIHdlIGNhbiBhbHNvIGluY2x1ZGUgZXh0ZXJuYWwgaW1hZ2VzIGluIGRpZmZlcmVudCBmb3JtYXRzIGluIHRoZSBSIE1hcmtkb3duIGRvY3VtZW50LiBgb3V0LndpZHRoPWAgYW5kIGBvdXQuaGVpZ2h0PWAgb3B0aW9ucyBzaG91bGQgYmUgdXNlZCB0byBjb250cm9sIHRoZSBzaXplIG9mIHRoZSBpbWFnZXMuIA0KDQpgYGB7ciwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGggPSAiNTAlIn0NCmluY2x1ZGVfZ3JhcGhpY3MoImh0dHBzOi8vZWRpdG9yLmFuYWx5dGljc3ZpZGh5YS5jb20vdXBsb2Fkcy83NTgxOXN0YXRzXzEwNTB4NTIwLnBuZyIpDQpgYGANCg0KIyBJbmxpbmUgQ2h1bmsgT3B0aW9ucw0KDQpJZiB0b28gbWFueSBjaHVuayBvcHRpb25zIGFyZSByZXF1aXJlZCB0byBsYXkgb3V0IHRoZSBmaWd1cmUsIGl0IGlzIG5vdCBjb252ZW5pZW50IHRvIHB1dCBhbGwgb2YgdGhlbSBpbiB0aGUgY29kZSBjaHVuay4gT25lIHdheSB0byBoYW5kbGUgdGhpcyBzaXR1YXRpb24gaXMgdG8gdXNlIGlubGluZSBjaHVuayBvcHRpb25zLg0KDQoNCmBgYHtyfQ0KI3wgZmlnLndpZHRoID0gNSwgZmlnLmhlaWdodCA9IDQsDQojfCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXAgPSAiTXkgY2FwdGlvbiINCg0KcGxvdF9seSh4PW10Y2FycyR3dCx5PW10Y2FycyRtcGcsbW9kZSA9ICJtYXJrZXJzIixjb2xvciA9IGFzLmZhY3RvcihtdGNhcnMkdnMpKQ0KYGBgDQoNCiMgSW5jbHVkaW5nIENTUw0KDQpUaGVyZSBhcmUgdGhyZWUgd2F5cyBvZiBpbnNlcnRpbmcgYSBzdHlsZSBzaGVldCBpbiB0aGUgUk1hcmtkb3duIGRvY3VtZW50OiBpbmxpbmUgQ1NTLCBpbnRlcm5hbCBDU1MsIGFuZCBleHRlcm5hbCBDU1MuIFdlIGhhdmUgdXNlZCBhbGwgdGhyZWUgZGlmZmVyZW50IGZvcm1hdHMgb2YgQ1NTIGluIHRoaXMgUk1EIHRvIGZvcm1hdCB0aGUgdGV4dCBvciBkZWNvcmF0ZSB0aGUgbGF5b3V0IG9uIGRpZmZlcmVudCBvY2Nhc2lvbnMuIFRvIHN1bW1hcml6ZSwNCg0KKiAqKmlubGluZSBDU1MqKjogVGhpcyBpcyBhbiBleGFtcGxlIHNob3dpbmcgaG93IHRvIGNoYW5nZSB0aGUgPGZvbnQgc3R5bGUgPSAiZm9udC1zaXplOiAxMHB4OyBjb2xvcjogZGFya3JlZDsgZm9udC13ZWlnaHQ6Ym9sZDsgZm9udC1mYW1pbHk6dmVyZGFuYTsiPiBmb250IHNpemUsIGZhY2UsIGNvbG9yLCBldGMuPC9mb250Pg0KDQoqICoqaW50ZXJuYWwgQ1NTKio6IFRoZSBpbnRlcm5hbCBDU1Mgd2FzIGluY2x1ZGVkIGF0IFlBTUwgYW5kIHNldHVwIGNvZGUgY2h1bmsgKFtIZXJlIElzIHRoZSBzY3JlZW5zaG90XShodHRwczovL3Blbmdkc2NpLmdpdGh1Yi5pby9TVEE0OTAvdzAxL2ltZy9pbnRlcm5hbENTUy5wbmcpKQ0KDQoqICoqRXh0ZXJuYWwgQ1NTKio6IFRoZSBleHRlcm5hbCBDU1Mgc3R5bGUgZmlsZSB1c2VkIGluIHRoaXMgZG9jdW1lbnQgY2FuIGJlIGZvdW5kIChbaGVyZV0oaHR0cHM6Ly9wZW5nZHNjaS5naXRodWIuaW8vU1RBNDkwL3cwMS9jc3MvY3BSTURzdHlsZS5jc3MpKQ0KDQoNCiMgIFZlcmJhdGltIENvZGUgQ2h1bmtzDQoNClR5cGljYWxseSB3ZSB3cml0ZSBjb2RlIGNodW5rcyBhbmQgaW5saW5lIGV4cHJlc3Npb25zIHRoYXQgd2Ugd2FudCB0byBiZSBwYXJzZWQgYW5kIGV2YWx1YXRlZCBieSBga25pdHJgLiBIb3dldmVyLCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHdyaXRlIGEgdHV0b3JpYWwgb24gdXNpbmcga25pdHJgLCB3ZSBtYXkgbmVlZCB0byBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvZGUgY2h1bmsgb3IgaW5saW5lIGV4cHJlc3Npb24gdGhhdCBpcyBub3QgcGFyc2VkIGJ5IGtuaXRyLCBhbmQgd2Ugd2FudCB0byBkaXNwbGF5IHRoZSBjb250ZW50IG9mIHRoZSBjaHVuayBoZWFkZXIgYW5kIGFsbCByZWxhdGVkIG9wdGlvbnMuDQoNCmBgYGB7dmVyYmF0aW19DQoNCmBgYHtyIG91dC53aWR0aD1jKCc1MCUnLCAnNTAlJyksIGZpZy5zaG93PSdob2xkJ30NCmJveHBsb3QoMToxMCkNCnBsb3Qocm5vcm0oMTApKQ0KcGxvdChkZW5zaXR5KHJub3JtKDEwMCkpKQ0KYGBgDQoNCmBgYGANCg0K