마크다운 텍스트에 대해 설명한다. RStudio에는 팬독 바이너리가 들어있고, 문서 변환기로서의 기능은 대부분은 Rmarkdown패키지에 녹아있다.

팬독 마크다운 문법

R에서는 rmarkdown 패키지에 의해 제공되는 Rmarkdown을 사용한다. rmarkdown은 pandoc마크다운을 내부적으로 사용하고, 팬독에 대한 래퍼 역학을 한다.

YAML 헤더

---
title: "Untitled"
author: "sunny"
output: html_document
---

앞뒤 — 는 다른 텍스트와 구별되는 경계
그 안에 필요한 내용을 [키:값]쌍으로 기재
YAML header 는 문서의 메타 정보를 입력하는 곳

단락

[code]
단락은 특별한 표시 없이 그대로 입력

단락의 구분은 하나 이상의 빈 줄로

그냥 엔터만 한줄쳐서 작성한다면
이는 그냥 한 단락으로 간주

줄을 강제로 바꾸기 위해서는  
스페이스를 두 번 누르고 엔터를 하거나

줄을 강제로 바꾸기 위해서는 끝에\
벡슬래시를 입력하고 엔터키 누르기

[result]
단락은 특별한 표시 없이 그대로 입력

단락의 구분은 하나 이상의 빈 줄로

그냥 엔터만 한줄쳐서 작성한다면 이는 그냥 한 단락으로 간주

줄을 강제로 바꾸기 위해서는
스페이스를 두 번 누르고 엔터를 하거나

줄을 강제로 바꾸기 위해서는 끝에
벡슬래시를 입력하고 엔터키 누르기

제목

[code]
# Header1

## Header2

### Header3

(헤더 앞에는 적어도 빈 줄 하나가 필요)

나는 베스킨라빈스 아이스크림 중
#22번과 #5번을 좋아한다.

나는 베스킨라빈스 아이스크림 중

#22번과 #5번을 좋아한다.

[result]

Header1

Header2

Header3

헤더는 행의 시작에 올 수 있다.

나는 베스킨라빈스 아이스크림 중 #22번과 #5번을 좋아한다.

나는 베스킬라빈스 아이스크림중

22번과 #5번을 좋아한다.

제목의 아이디와 클래스

팬독은 제목 부분에 HTML의 class, id 속성들을 정할 수 있는 문법 제공

{}안에 #은 아이디, “,”로 시작하는 것은 클래스

## 팬독 사용법 {#UsingPandoc .unnumbered}

UsingPandoc은 아이디, unnumbered는 클래스

한글 제목을 사용하는 경우에는 영문으로 아이디를 지정해줘야 함!

한글 제목만 사용경우, 자동으로 생성되는 내부 링크가 제대로 작동하지 않을 가능성이 높음. 이를 어기면 HTML 문서에서 toc:true 라는 옵션을 사용하여 만든 목차에서 링크를 제대로 찾지 못하는 현상이 나타난다. 따라서 제목과 아이디 부여하는 습관 갖도록 하자.

블록 인용

> This is a block quote. This
> paragraph has two lines.
>
> 1. This is a list inside a block quote.
> 2. Second item.

This is a block quote. This paragraph has two lines.

  1. This is a list inside a block quote.
  2. Second item.

있는 그대로 (Verbatim)

띄어쓰기(space) 4번

[code]
    library(ggplot2)
    ggplot(diamonds, aes(carat,price))+geom_point()

(경계사용코드)
~~~
library(ggplot2)
ggplot(diamonds, aes(carat,price)+geom_point())
~~~

[result]

library(ggplot2)
ggplot(diamonds, aes(carat,price))+geom_point()
library(ggplot2)
ggplot(diamonds, aes(carat,price)+geom_point())
library(ggplot2)
ggplot(diamonds, aes(carat,price)+geom_point())

행 블록(Line blocks)

일부러 텍스트의 구조를 바꿔 표현할 때.

수직 바 또는 파이프 기호 | 와 공백(space)하나로 시작하는 행으로 구성된 블록 사용.

[code]

| The limerick packs laughs anatomical
| In space that is quite economical.
|    But the good ones I've seen
|    So seldom are clean
| And the clean ones so seldom are comical

| 200 Main St.
| Berkeley, CA 94718

[result]

The limerick packs laughs anatomical In space that is quite economical.    But the good ones I’ve seen    So seldom are clean And the clean ones so seldom are comical
200 Main St. Berkeley, CA 94718

목록

팬독에는 목록을 위한 문법이 풍부하다

구분점 목록(Bullet List)

[code] +,*,- 중 하나로 사용 가능
- 하나
- 둘
- 셋

+ 하나
+ 둘
+ 셋

* 하나
* 둘
* 셋

[result]

  • 하나
  • 하나
  • 하나
[code]
*The bullets need not be flush with the left margin; they may be
indented one, two, or three spaces. The bullet must be followed by
whitespace.

[result]

  • The bullets need not be flush with the left margin; they may be indented one, two, or three spaces. The bullet must be followed by whitespace.

4-스페이스 규칙

[code]
* 첫 번째 단락
    첫 번째 단락에 포함된 서브 단락으로 공백 4개를 사용

* 두 번째 단락인데, 이 단락이 코드 블록을 포함하고 있을 때는 8개의 공백으로 표시
        library(ggolot2)
        ggplot(diamonds, aes(carat, price))+geom_point()

[result]

  • 첫 번째 단락

    첫 번째 단락에 포함된 서브 단락으로 공백 4개를 사용

  • 두 번째 단락인데, 이 단락이 코드 블록을 포함하고 있을 때는 8개의 공백으로 표시

    library(ggolot2)
    ggplot(diamonds, aes(carat, price))+geom_point()
[code]
* fruits
    + apples
        - macintosh
        - red delicious
    + pears
    + peaches
* vegetables
    + broccoli
    + chard

[result]

  • fruits
    • apples
      • macintosh
      • red delicious
    • pears
    • peaches
  • vegetables
    • broccoli
    • chard

순서 있는 목록(Ordered List)

숫자를 쓰고, 마침표를 쓰고, 하나의 공백을 주고 나서 내용을 입력한다. 이때 숫자는 의미가 없고 그냥 순서가 자동으로 정해진다.

[code]
1.  one
2.  two
3.  three
5.  one
7.  two
1.  three

[result]

  1. one
  2. two
  3. three
  4. one
  5. two
  6. three

로마 숫자로 구분점 만드는 것도 가능

[code]
(I)  one
(I)  two
(I)  three

[result]

  1. one
  2. two
  3. three

알파벳으로구분점 만드는 것도 가능

[code]
A)  one
A)  two
A)  three

[result]

  1. one
  2. two
  3. three

시작하는 번호

팬독은 목록에서 구분점과 시작번호를 주목함.

같은 구분점을 가지는 항목들은 하나의 목록으로 취급

[code]
 9)  Ninth
10)  Tenth
11)  Eleventh
       i. subone
      ii. subtwo
     iii. subthree

[result]

  1. Ninth
  2. Tenth
  3. Eleventh
    1. subone
    2. subtwo
    3. subthree

정의 목록(Definition List)

정의 목록은 용어의 정의 등을 입력할 때 쓰인다.

Term 1

:   Definition of term1

Term 2 with *inline markup*

:   about definition of term2

        library(ggplot2)
        ggplot(diamonds, aes(carat,price)+geom_point())
        
    Third paragraph of definition 2.)
Term 1

Definition of term1

Term 2 with inline markup

about definition of term2

library(ggplot2)
ggplot(diamonds, aes(carat,price)+geom_point())

Third paragraph of definition 2.)

수평선

+,-,_ 기호 3개 이상 ==> 수평선

***

---

___



팬독이 제공하는 표 문법은

  • 심플
  • 멀티라인
  • 그리드
  • 파이프

총 4가지. 처리하기 까다로움. 자세히는 설명하지 않는다.

CJK(중국, 일본, 한국)언어는 더블-바이트 언어라 문자의 폭에 문제가 생긴다. D2Coding과 같은 한글 고정폭 폰트 사용하면 조금은 해결가능. but, 부족한 경우 많음

백슬래시 이스케이프

\*\*있는 그대로\*\*

**있는 그대로**

**있는 그대로**

있는 그대로

인라인 포매팅

강조: _ 기호나 *

*약한 강조*, **강한 강조**

약한 강조, 강한 강조

텍스트 삭제 표시

이것은 ~~삭제된 단어~~입니다.

이것은 삭제된 단어입니다.

윗첨자, 아랫첨자

^기호와 ~기호를 사용하면 된다. 첨자로 들어간 부분에 띄어쓰기가 있다면 백슬레시(\)쓰고 한 칸을 띄어 주고 사용.

이것은 연습^위의 첨자^이고, 또 이것은 연습~아래의 첨자~이다.

이것은 연습^위의 첨자^이고, 또 이것은 연습~아래의 첨자~이다.

이것은 연습^위의\ 첨자^이고, 또 이것은 연습~아래의\ 첨자~이다.

이것은 연습위의 첨자이고, 또 이것은 연습아래의 첨자이다.

수식

rmarkdown은 HTML 문서를 랜더링할 때 MathJax 사용.

인라인 수식의 경우 $감싸고, 블록 수식인 경우 $$감싼다.   그 안에는 레이텍에서 사용하는 수식 쓰면 된다.

ex1.
비율은 $y = \frac{a}{a+b}$ 로 표시한다.

비율은 \(y = \frac{a}{a+b}\) 로 표시한다.

ex2.
$$\begin{array}{ccc}
x_{11} & x_{12} & x_{13}\\
x_{21} & x_{22} & x_{23}
\end{array}$$

\[\begin{array}{ccc} x_{11} & x_{12} & x_{13}\\ x_{21} & x_{22} & x_{23} \end{array}\]


  1. Here is the footnote.

  2. Here’s one with multiple blocks.

    Subsequent paragraphs are indented to show that they belong to the previous footnote.

    { some.code }

    The whole paragraph can be indented, or just the first line. In this way, multi-paragraph footnotes work like multi-paragraph list items.

LS0tDQp0aXRsZTogIjQg7Yys64+FIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KbWFpbmZvbnQ6IEQyQ29kaW5nDQotLS0NCuuniO2BrOuLpOyatCDthY3siqTtirjsl5Ag64yA7ZW0IOyEpOuqhe2VnOuLpC4gUlN0dWRpb+yXkOuKlCDtjKzrj4Ug67CU7J2064SI66as6rCAIOuTpOyWtOyeiOqzoCwg66y47IScIOuzgO2ZmOq4sOuhnOyEnOydmCDquLDriqXsnYAg64yA67aA67aE7J2AIFJtYXJrZG93bu2MqO2CpOyngOyXkCDrhbnslYTsnojri6QuDQoNCiMj7Yys64+FIOuniO2BrOuLpOyatCDrrLjrspUNClLsl5DshJzripQgcm1hcmtkb3duIO2MqO2CpOyngOyXkCDsnZjtlbQg7KCc6rO165CY64qUIFJtYXJrZG93buydhCDsgqzsmqntlZzri6QuIHJtYXJrZG93buydgCBwYW5kb2Prp4jtgazri6TsmrTsnYQg64K067aA7KCB7Jy866GcIOyCrOyaqe2VmOqzoCwg7Yys64+F7JeQIOuMgO2VnCDrnpjtjbwg7Jet7ZWZ7J2EIO2VnOuLpC4NCg0KIyMgWUFNTCDtl6TrjZQNCg0KICAgIC0tLQ0KICAgIHRpdGxlOiAiVW50aXRsZWQiDQogICAgYXV0aG9yOiAic3VubnkiDQogICAgb3V0cHV0OiBodG1sX2RvY3VtZW50DQogICAgLS0tDQrslZ7rkqQgLS0tIOuKlCDri6Trpbgg7YWN7Iqk7Yq47JmAIOq1rOuzhOuQmOuKlCDqsr3qs4RcDQrqt7gg7JWI7JeQIO2VhOyalO2VnCDrgrTsmqnsnYQgW+2CpDrqsJJd7IyN7Jy866GcIOq4sOyerFwNCllBTUwgaGVhZGVyIOuKlCDrrLjshJzsnZgg66mU7YOAIOygleuztOulvCDsnoXroKXtlZjripQg6rOzXA0KDQoNCiMj64uo6529DQoNCg0KICAgIFtjb2RlXQ0KICAgIOuLqOudveydgCDtirnrs4TtlZwg7ZGc7IucIOyXhuydtCDqt7jrjIDroZwg7J6F66ClDQogICAgDQogICAg64uo65297J2YIOq1rOu2hOydgCDtlZjrgpgg7J207IOB7J2YIOu5iCDspITroZwNCiAgICANCiAgICDqt7jrg6Ug7JeU7YSw66eMIO2VnOykhOyzkOyEnCDsnpHshLHtlZzri6TrqbQNCiAgICDsnbTripQg6re464OlIO2VnCDri6jrnb3snLzroZwg6rCE7KO8DQogICAgDQogICAg7KSE7J2EIOqwleygnOuhnCDrsJTqvrjquLAg7JyE7ZW07ISc64qUICANCiAgICDsiqTtjpjsnbTsiqTrpbwg65GQIOuyiCDriITrpbTqs6Ag7JeU7YSw66W8IO2VmOqxsOuCmA0KICAgIA0KICAgIOykhOydhCDqsJXsoJzroZwg67CU6r646riwIOychO2VtOyEnOuKlCDrgZ3sl5BcDQogICAg67Kh7Iqs656Y7Iuc66W8IOyeheugpe2VmOqzoCDsl5TthLDtgqQg64iE66W06riwDQoNCg0KW3Jlc3VsdF1cDQrri6jrnb3snYAg7Yq567OE7ZWcIO2RnOyLnCDsl4bsnbQg6re464yA66GcIOyeheugpQ0KDQrri6jrnb3snZgg6rWs67aE7J2AIO2VmOuCmCDsnbTsg4HsnZgg67mIIOykhOuhnA0KDQrqt7jrg6Ug7JeU7YSw66eMIO2VnOykhOyzkOyEnCDsnpHshLHtlZzri6TrqbQNCuydtOuKlCDqt7jrg6Ug7ZWcIOuLqOudveycvOuhnCDqsITso7wNCg0K7KSE7J2EIOqwleygnOuhnCDrsJTqvrjquLAg7JyE7ZW07ISc64qUICANCuyKpO2OmOydtOyKpOulvCDrkZAg67KIIOuIhOultOqzoCDsl5TthLDrpbwg7ZWY6rGw64KYDQoNCuykhOydhCDqsJXsoJzroZwg67CU6r646riwIOychO2VtOyEnOuKlCDrgZ3sl5BcDQrrsqHsiqzrnpjsi5zrpbwg7J6F66Cl7ZWY6rOgIOyXlO2EsO2CpCDriITrpbTquLAgDQoNCg0KIyPsoJzrqqkNCg0KICAgIFtjb2RlXQ0KICAgICMgSGVhZGVyMQ0KICAgIA0KICAgICMjIEhlYWRlcjINCiAgICANCiAgICAjIyMgSGVhZGVyMw0KICAgIA0KICAgICjtl6TrjZQg7JWe7JeQ64qUIOyggeyWtOuPhCDruYgg7KSEIO2VmOuCmOqwgCDtlYTsmpQpDQogICAgDQogICAg64KY64qUIOuyoOyKpO2CqOudvOu5iOyKpCDslYTsnbTsiqTtgazrprwg7KSRDQogICAgIzIy67KI6rO8ICM167KI7J2EIOyii+yVhO2VnOuLpC4NCiAgICANCiAgICDrgpjripQg67Kg7Iqk7YKo652867mI7IqkIOyVhOydtOyKpO2BrOumvCDspJENCiAgICANCiAgICAjMjLrsojqs7wgIzXrsojsnYQg7KKL7JWE7ZWc64ukLg0KDQpbcmVzdWx0XQ0KDQojIEhlYWRlcjENCg0KIyMgSGVhZGVyMg0KDQojIyMgSGVhZGVyMw0KDQrtl6TrjZTripQg7ZaJ7J2YIOyLnOyekeyXkCAg7JisIOyImCDsnojri6QuIA0KDQrrgpjripQg67Kg7Iqk7YKo652867mI7IqkIOyVhOydtOyKpO2BrOumvCDspJENCiMyMuuyiOqzvCAjNeuyiOydhCDsoovslYTtlZzri6QuIA0KDQrrgpjripQg67Kg7Iqk7YKs652867mI7IqkIOyVhOydtOyKpO2BrOumvOykkQ0KIA0KIzIy67KI6rO8ICM167KI7J2EIOyii+yVhO2VnOuLpC4NCiANCiANCiANCiMj7KCc66qp7J2YIOyVhOydtOuUlOyZgCDtgbTrnpjsiqQNCu2MrOuPheydgCDsoJzrqqkg67aA67aE7JeQIEhUTUzsnZggY2xhc3MsIGlkIOyGjeyEseuTpOydhCDsoJXtlaAg7IiYIOyeiOuKlCDrrLjrspUg7KCc6rO1DQoNCnt97JWI7JeQICPsnYAg7JWE7J2065SULCAiLCLroZwg7Iuc7J6R7ZWY64qUIOqyg+ydgCDtgbTrnpjsiqQNCg0KDQogICAgIyMg7Yys64+FIOyCrOyaqeuylSB7I1VzaW5nUGFuZG9jIC51bm51bWJlcmVkfQ0KDQpVc2luZ1BhbmRvY+ydgCDslYTsnbTrlJQsIHVubnVtYmVyZWTripQg7YG0656Y7IqkDQoNCu2VnOq4gCDsoJzrqqnsnYQg7IKs7Jqp7ZWY64qUIOqyveyasOyXkOuKlCAq7JiB66y47Jy866GcIOyVhOydtOuUlCrrpbwg7KeA7KCV7ZW07KSY7JW8IO2VqCENCg0K7ZWc6riAIOygnOuqqeunjCDsgqzsmqnqsr3smrAsIOyekOuPmeycvOuhnCDsg53shLHrkJjripQg64K067aAIOunge2BrOqwgCDsoJzrjIDroZwg7J6R64+Z7ZWY7KeAIOyViuydhCDqsIDriqXshLHsnbQg64aS7J2MLiDsnbTrpbwg7Ja06riw66m0IEhUTUwg66y47ISc7JeQ7IScIHRvYzp0cnVlIOudvOuKlCDsmLXshZjsnYQg7IKs7Jqp7ZWY7JesIOunjOuToCDrqqnssKjsl5DshJwg66eB7YGs66W8IOygnOuMgOuhnCDssL7sp4Ag66q77ZWY64qUIO2YhOyDgeydtCDrgpjtg4Drgpzri6QuIOuUsOudvOyEnCDsoJzrqqnqs7wg7JWE7J2065SUIOu2gOyXrO2VmOuKlCDsirXqtIAg6rCW64+E66GdIO2VmOyekC4NCg0KIyMg67iU66GdIOyduOyaqQ0KYGBge3J9DQo+IFRoaXMgaXMgYSBibG9jayBxdW90ZS4gVGhpcw0KPiBwYXJhZ3JhcGggaGFzIHR3byBsaW5lcy4NCj4NCj4gMS4gVGhpcyBpcyBhIGxpc3QgaW5zaWRlIGEgYmxvY2sgcXVvdGUuDQo+IDIuIFNlY29uZCBpdGVtLg0KYGBgDQoNCj4gVGhpcyBpcyBhIGJsb2NrIHF1b3RlLiBUaGlzDQo+IHBhcmFncmFwaCBoYXMgdHdvIGxpbmVzLg0KPg0KPiAxLiBUaGlzIGlzIGEgbGlzdCBpbnNpZGUgYSBibG9jayBxdW90ZS4NCj4gMi4gU2Vjb25kIGl0ZW0uDQoNCg0KIyMg7J6I64qUIOq3uOuMgOuhnCAoVmVyYmF0aW0pDQrrnYTslrTsk7DquLAoc3BhY2UpIDTrsogNCmBgYHtyfQ0KW2NvZGVdDQogICAgbGlicmFyeShnZ3Bsb3QyKQ0KICAgIGdncGxvdChkaWFtb25kcywgYWVzKGNhcmF0LHByaWNlKSkrZ2VvbV9wb2ludCgpDQoNCijqsr3qs4TsgqzsmqnsvZTrk5wpDQp+fn4NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChkaWFtb25kcywgYWVzKGNhcmF0LHByaWNlKStnZW9tX3BvaW50KCkpDQp+fn4NCmBgYA0KW3Jlc3VsdF0NCg0KICAgIGxpYnJhcnkoZ2dwbG90MikNCiAgICBnZ3Bsb3QoZGlhbW9uZHMsIGFlcyhjYXJhdCxwcmljZSkpK2dlb21fcG9pbnQoKQ0KDQoNCn5+fg0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGRpYW1vbmRzLCBhZXMoY2FyYXQscHJpY2UpK2dlb21fcG9pbnQoKSkNCn5+fg0KDQp+fn5+IHsjbXljb2RlIC5yIC5udW1iZXJMaW5lcyBzdGFydEZyb209IjEifQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGRpYW1vbmRzLCBhZXMoY2FyYXQscHJpY2UpK2dlb21fcG9pbnQoKSkNCn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQoNCiMjIO2WiSDruJTroZ0oTGluZSBibG9ja3MpDQrsnbzrtoDrn6wg7YWN7Iqk7Yq47J2YIOq1rOyhsOulvCDrsJTqv5Qg7ZGc7ZiE7ZWgIOuVjC4gDQoNCuyImOyngSDrsJQg65iQ64qUIO2MjOydtO2UhCDquLDtmLggfCDsmYAg6rO167CxKHNwYWNlKe2VmOuCmOuhnCDsi5zsnpHtlZjripQg7ZaJ7Jy866GcIOq1rOyEseuQnCDruJTroZ0g7IKs7JqpLg0KDQpbY29kZV0NCg0KICAgIHwgVGhlIGxpbWVyaWNrIHBhY2tzIGxhdWdocyBhbmF0b21pY2FsDQogICAgfCBJbiBzcGFjZSB0aGF0IGlzIHF1aXRlIGVjb25vbWljYWwuDQogICAgfCAgICBCdXQgdGhlIGdvb2Qgb25lcyBJJ3ZlIHNlZW4NCiAgICB8ICAgIFNvIHNlbGRvbSBhcmUgY2xlYW4NCiAgICB8IEFuZCB0aGUgY2xlYW4gb25lcyBzbyBzZWxkb20gYXJlIGNvbWljYWwNCg0KICAgIHwgMjAwIE1haW4gU3QuDQogICAgfCBCZXJrZWxleSwgQ0EgOTQ3MTgNCg0KW3Jlc3VsdF0NCg0KfCBUaGUgbGltZXJpY2sgcGFja3MgbGF1Z2hzIGFuYXRvbWljYWwNCnwgSW4gc3BhY2UgdGhhdCBpcyBxdWl0ZSBlY29ub21pY2FsLg0KfCAgICBCdXQgdGhlIGdvb2Qgb25lcyBJJ3ZlIHNlZW4NCnwgICAgU28gc2VsZG9tIGFyZSBjbGVhbg0KfCBBbmQgdGhlIGNsZWFuIG9uZXMgc28gc2VsZG9tIGFyZSBjb21pY2FsDQoNCnwgMjAwIE1haW4gU3QuDQp8IEJlcmtlbGV5LCBDQSA5NDcxOA0KDQojIyDrqqnroZ0gDQog7Yys64+F7JeQ64qUIOuqqeuhneydhCDsnITtlZwg66y467KV7J20IO2Sjeu2gO2VmOuLpA0KIA0KIyMjIOq1rOu2hOygkCDrqqnroZ0oQnVsbGV0IExpc3QpDQoNCiAgICBbY29kZV0gKywqLC0g7KSRIO2VmOuCmOuhnCDsgqzsmqkg6rCA64qlDQogICAgLSDtlZjrgpgNCiAgICAtIOuRmA0KICAgIC0g7IWLDQogICAgDQogICAgKyDtlZjrgpgNCiAgICArIOuRmA0KICAgICsg7IWLDQogICAgDQogICAgKiDtlZjrgpgNCiAgICAqIOuRmA0KICAgICog7IWLDQogICAgDQpbcmVzdWx0XQ0KDQotIO2VmOuCmA0KLSDrkZgNCi0g7IWLDQogICAgDQorIO2VmOuCmA0KKyDrkZgNCisg7IWLDQogICAgDQoqIO2VmOuCmA0KKiDrkZgNCiog7IWLDQoNCmBgYHtyfQ0KW2NvZGVdDQoqVGhlIGJ1bGxldHMgbmVlZCBub3QgYmUgZmx1c2ggd2l0aCB0aGUgbGVmdCBtYXJnaW47IHRoZXkgbWF5IGJlDQppbmRlbnRlZCBvbmUsIHR3bywgb3IgdGhyZWUgc3BhY2VzLiBUaGUgYnVsbGV0IG11c3QgYmUgZm9sbG93ZWQgYnkNCndoaXRlc3BhY2UuDQpgYGANCiAgICANCltyZXN1bHRdDQoNCiogVGhlIGJ1bGxldHMgbmVlZCBub3QgYmUgZmx1c2ggd2l0aCB0aGUgbGVmdCBtYXJnaW47IHRoZXkgbWF5IGJlIGluZGVudGVkIG9uZSwgdHdvLCBvciB0aHJlZSBzcGFjZXMuIFRoZSBidWxsZXQgbXVzdCBiZSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLg0KDQoNCg0KDQojIyMgNC3siqTtjpjsnbTsiqQg6rec7LmZDQoNCmBgYHtyfQ0KW2NvZGVdDQoqIOyyqyDrsojsp7gg64uo6529DQogICAg7LKrIOuyiOynuCDri6jrnb3sl5Ag7Y+s7ZWo65CcIOyEnOu4jCDri6jrnb3snLzroZwg6rO167CxIDTqsJzrpbwg7IKs7JqpDQoNCiog65GQIOuyiOynuCDri6jrnb3snbjrjbAsIOydtCDri6jrnb3snbQg7L2U65OcIOu4lOuhneydhCDtj6ztlajtlZjqs6Ag7J6I7J2EIOuVjOuKlCA46rCc7J2YIOqzteuwseycvOuhnCDtkZzsi5wNCiAgICAgICAgbGlicmFyeShnZ29sb3QyKQ0KICAgICAgICBnZ3Bsb3QoZGlhbW9uZHMsIGFlcyhjYXJhdCwgcHJpY2UpKStnZW9tX3BvaW50KCkNCmBgYA0KW3Jlc3VsdF0NCg0KKiDssqsg67KI7Ke4IOuLqOudvQ0KDQogICAg7LKrIOuyiOynuCDri6jrnb3sl5Ag7Y+s7ZWo65CcIOyEnOu4jCDri6jrnb3snLzroZwg6rO167CxIDTqsJzrpbwg7IKs7JqpDQoNCiog65GQIOuyiOynuCDri6jrnb3snbjrjbAsIOydtCDri6jrnb3snbQg7L2U65OcIOu4lOuhneydhCDtj6ztlajtlZjqs6Ag7J6I7J2EIOuVjOuKlCA46rCc7J2YIOqzteuwseycvOuhnCDtkZzsi5wNCg0KICAgICAgICBsaWJyYXJ5KGdnb2xvdDIpDQogICAgICAgIGdncGxvdChkaWFtb25kcywgYWVzKGNhcmF0LCBwcmljZSkpK2dlb21fcG9pbnQoKQ0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIA0KYGBge3J9DQpbY29kZV0NCiogZnJ1aXRzDQogICAgKyBhcHBsZXMNCiAgICAgICAgLSBtYWNpbnRvc2gNCiAgICAgICAgLSByZWQgZGVsaWNpb3VzDQogICAgKyBwZWFycw0KICAgICsgcGVhY2hlcw0KKiB2ZWdldGFibGVzDQogICAgKyBicm9jY29saQ0KICAgICsgY2hhcmQNCmBgYA0KDQpbcmVzdWx0XQ0KDQoqIGZydWl0cw0KICAgICsgYXBwbGVzDQogICAgICAgIC0gbWFjaW50b3NoDQogICAgICAgIC0gcmVkIGRlbGljaW91cw0KICAgICsgcGVhcnMNCiAgICArIHBlYWNoZXMNCiogdmVnZXRhYmxlcw0KICAgICsgYnJvY2NvbGkNCiAgICArIGNoYXJkDQogICAgDQogICAgDQogICAgDQojIyMg7Iic7IScIOyeiOuKlCDrqqnroZ0oT3JkZXJlZCBMaXN0KQ0K7Iir7J6Q66W8IOyTsOqzoCwg66eI7Lmo7ZGc66W8IOyTsOqzoCwg7ZWY64KY7J2YIOqzteuwseydhCDso7zqs6Ag64KY7IScIOuCtOyaqeydhCDsnoXroKXtlZzri6QuIOydtOuVjCDsiKvsnpDripQg7J2Y66+46rCAIOyXhuqzoCDqt7jrg6Ug7Iic7ISc6rCAIOyekOuPmeycvOuhnCDsoJXtlbTsp4Tri6QuDQoNCiAgICBbY29kZV0NCiAgICAxLiAgb25lDQogICAgMi4gIHR3bw0KICAgIDMuICB0aHJlZQ0KICAgIDUuICBvbmUNCiAgICA3LiAgdHdvDQogICAgMS4gIHRocmVlDQogICAgDQpbcmVzdWx0XQ0KDQoxLiAgb25lDQoyLiAgdHdvDQozLiAgdGhyZWUNCjUuICBvbmUNCjcuICB0d28NCjEuICB0aHJlZQ0KDQoNCuuhnOuniCDsiKvsnpDroZwg6rWs67aE7KCQIOunjOuTnOuKlCDqsoPrj4Qg6rCA64qlDQoNCiAgICBbY29kZV0NCiAgICAoSSkgIG9uZQ0KICAgIChJKSAgdHdvDQogICAgKEkpICB0aHJlZQ0KDQpbcmVzdWx0XQ0KDQooSSkgIG9uZQ0KKEkpICB0d28NCihJKSB0aHJlZQ0KDQrslYztjIzrsrPsnLzroZzqtazrtoTsoJAg66eM65Oc64qUIOqyg+uPhCDqsIDriqUNCg0KDQogICAgW2NvZGVdDQogICAgQSkgIG9uZQ0KICAgIEEpICB0d28NCiAgICBBKSAgdGhyZWUNCiAgICANCg0KW3Jlc3VsdF0NCg0KQSkgIG9uZQ0KQSkgIHR3bw0KQSkgdGhyZWUNCg0KDQojIyMj7Iuc7J6R7ZWY64qUIOuyiO2YuA0K7Yys64+F7J2AIOuqqeuhneyXkOyEnCDqtazrtoTsoJDqs7wg7Iuc7J6R67KI7Zi466W8IOyjvOuqqe2VqC4NCg0K6rCZ7J2AIOq1rOu2hOygkOydhCDqsIDsp4DripQg7ZWt66qp65Ok7J2AIO2VmOuCmOydmCDrqqnroZ3snLzroZwg7Leo6riJDQoNCg0KICAgIFtjb2RlXQ0KICAgICA5KSAgTmludGgNCiAgICAxMCkgIFRlbnRoDQogICAgMTEpICBFbGV2ZW50aA0KICAgICAgICAgICBpLiBzdWJvbmUNCiAgICAgICAgICBpaS4gc3VidHdvDQogICAgICAgICBpaWkuIHN1YnRocmVlDQogICAgDQoNCltyZXN1bHRdDQoNCiA5KSAgTmludGgNCjEwKSAgVGVudGgNCjExKSAgRWxldmVudGgNCiAgICAgICBpLiBzdWJvbmUNCiAgICAgIGlpLiBzdWJ0d28NCiAgICAgaWlpLiBzdWJ0aHJlZQ0KICAgICANCiAgICAgDQogICAgIA0KIyMg7KCV7J2YIOuqqeuhnShEZWZpbml0aW9uIExpc3QpDQrsoJXsnZgg66qp66Gd7J2AIOyaqeyWtOydmCDsoJXsnZgg65Ox7J2EIOyeheugpe2VoCDrlYwg7JOw7J2464ukLg0KDQogICAgVGVybSAxDQogICAgDQogICAgOiAgIERlZmluaXRpb24gb2YgdGVybTENCiAgICANCiAgICBUZXJtIDIgd2l0aCAqaW5saW5lIG1hcmt1cCoNCiAgICANCiAgICA6ICAgYWJvdXQgZGVmaW5pdGlvbiBvZiB0ZXJtMg0KICAgIA0KICAgICAgICAgICAgbGlicmFyeShnZ3Bsb3QyKQ0KICAgICAgICAgICAgZ2dwbG90KGRpYW1vbmRzLCBhZXMoY2FyYXQscHJpY2UpK2dlb21fcG9pbnQoKSkNCiAgICAgICAgICAgIA0KICAgICAgICBUaGlyZCBwYXJhZ3JhcGggb2YgZGVmaW5pdGlvbiAyLikNCg0KDQpUZXJtIDENCg0KOiAgIERlZmluaXRpb24gb2YgdGVybTENCg0KVGVybSAyIHdpdGggKmlubGluZSBtYXJrdXAqDQoNCjogICBhYm91dCBkZWZpbml0aW9uIG9mIHRlcm0yDQoNCiAgICAgICAgbGlicmFyeShnZ3Bsb3QyKQ0KICAgICAgICBnZ3Bsb3QoZGlhbW9uZHMsIGFlcyhjYXJhdCxwcmljZSkrZ2VvbV9wb2ludCgpKQ0KICAgICAgICANCg0KICAgIFRoaXJkIHBhcmFncmFwaCBvZiBkZWZpbml0aW9uIDIuKQ0KDQogICAgIA0KIyMg7IiY7Y+J7ISgDQorLC0sXyDquLDtmLggM+qwnCDsnbTsg4EgPT0+IOyImO2PieyEoA0KDQogICAgKioqDQogICAgDQogICAgLS0tDQogICAgDQogICAgX19fDQogICAgDQogICAgDQoqKioNCg0KLS0tDQoNCl9fXw0KDQoNCg0KIyMg7ZGcDQrtjKzrj4XsnbQg7KCc6rO17ZWY64qUIO2RnCDrrLjrspXsnYANCg0KKiDsi6ztlIwNCiog66mA7Yuw65287J24DQoqIOq3uOumrOuTnA0KKiDtjIzsnbTtlIQNCg0K7LSdIDTqsIDsp4AuIOyymOumrO2VmOq4sCDquYzri6TroZzsm4AuIOyekOyEuO2eiOuKlCDshKTrqoXtlZjsp4Ag7JWK64qU64ukLg0KDQpDSkso7KSR6rWtLCDsnbzrs7gsIO2VnOq1rSnslrjslrTripQg642U67iULeuwlOydtO2KuCDslrjslrTrnbwg66y47J6Q7J2YIO2PreyXkCDrrLjsoJzqsIAg7IOd6ri064ukLg0KRDJDb2Rpbmfqs7wg6rCZ7J2AIO2VnOq4gCDqs6DsoJXtj60g7Y+w7Yq4IOyCrOyaqe2VmOuptCDsobDquIjsnYAg7ZW06rKw6rCA64qlLiBidXQsIOu2gOyhse2VnCDqsr3smrAg66eO7J2MIA0KDQojIyDrsLHsiqzrnpjsi5wg7J207Iqk7LyA7J207ZSEDQoNCiAgICBcKlwq7J6I64qUIOq3uOuMgOuhnFwqXCoNCiAgICANCiAgICAqKuyeiOuKlCDqt7jrjIDroZwqKg0KICAgIA0KXCpcKuyeiOuKlCDqt7jrjIDroZxcKlwqDQoNCioq7J6I64qUIOq3uOuMgOuhnCoqDQoNCiMjIOyduOudvOyduCDtj6zrp6TtjIUNCg0KIyMjICDqsJXsobA6IF8g6riw7Zi464KYICoNCg0KICAgICrslb3tlZwg6rCV7KGwKiwgKirqsJXtlZwg6rCV7KGwKioNCg0KKuyVve2VnCDqsJXsobAqLCAqKuqwle2VnCDqsJXsobAqKg0KDQojIyMg7YWN7Iqk7Yq4IOyCreygnCDtkZzsi5wNCg0KICAgIOydtOqyg+ydgCB+fuyCreygnOuQnCDri6jslrR+fuyeheuLiOuLpC4NCg0K7J206rKD7J2AIH5+7IKt7KCc65CcIOuLqOyWtH5+7J6F64uI64ukLg0KDQojIyMg7JyX7LKo7J6QLCDslYTrnqvssqjsnpANClxe6riw7Zi47JmAIFx+6riw7Zi466W8IOyCrOyaqe2VmOuptCDrkJzri6QuIOyyqOyekOuhnCDrk6TslrTqsIQg67aA67aE7JeQIOudhOyWtOyTsOq4sOqwgCDsnojri6TrqbQg67Cx7Iqs66CI7IucXChcXClc66W8IOyTsOqzoCDtlZwg7Lm47J2EIOudhOyWtCDso7zqs6Ag7IKs7JqpLg0KDQogICAg7J206rKD7J2AIOyXsOyKtV7snITsnZgg7LKo7J6QXuydtOqzoCwg65iQIOydtOqyg+ydgCDsl7DsirV+7JWE656Y7J2YIOyyqOyekH7snbTri6QuDQogICAgDQrsnbTqsoPsnYAg7Jew7Iq1XuychOydmCDssqjsnpBe7J206rOgLCDrmJAg7J206rKD7J2AIOyXsOyKtX7slYTrnpjsnZgg7LKo7J6QfuydtOuLpC4NCg0KICAgIOydtOqyg+ydgCDsl7DsirVe7JyE7J2YXCDssqjsnpBe7J206rOgLCDrmJAg7J206rKD7J2AIOyXsOyKtX7slYTrnpjsnZhcIOyyqOyekH7snbTri6QuDQogICAgDQrsnbTqsoPsnYAg7Jew7Iq1XuychOydmFwg7LKo7J6QXuydtOqzoCwg65iQIOydtOqyg+ydgCDsl7DsirV+7JWE656Y7J2YXCDssqjsnpB+7J2064ukLg0KDQoNCiMjIyDsiJjsi50NCnJtYXJrZG93buydgCBIVE1MIOusuOyEnOulvCDrnpzrjZTrp4HtlaAg65WMIE1hdGhKYXgg7IKs7JqpLg0KDQrsnbjrnbzsnbgg7IiY7Iud7J2YIOqyveyasCBcJFzroZwg6rCQ7Iu46rOgLCDruJTroZ0g7IiY7Iud7J24IOqyveyasCBcJCRc66GcIOqwkOyLvOuLpC4gXCAgDQrqt7gg7JWI7JeQ64qUIOugiOydtO2FjeyXkOyEnCDsgqzsmqntlZjripQg7IiY7IudIOyTsOuptCDrkJzri6QuDQoNCiAgICBleDEuDQogICAg67mE7Jyo7J2AICR5ID0gXGZyYWN7YX17YStifSQg66GcIO2RnOyLnO2VnOuLpC4NCg0KIOu5hOycqOydgCAkeSA9IFxmcmFje2F9e2ErYn0kIOuhnCDtkZzsi5ztlZzri6QuDQoNCiAgICBleDIuDQogICAgJCRcYmVnaW57YXJyYXl9e2NjY30NCiAgICB4X3sxMX0gJiB4X3sxMn0gJiB4X3sxM31cXA0KICAgIHhfezIxfSAmIHhfezIyfSAmIHhfezIzfQ0KICAgIFxlbmR7YXJyYXl9JCQNCiAgICANCiQkXGJlZ2lue2FycmF5fXtjY2N9DQp4X3sxMX0gJiB4X3sxMn0gJiB4X3sxM31cXA0KeF97MjF9ICYgeF97MjJ9ICYgeF97MjN9DQpcZW5ke2FycmF5fSQkDQoNCg0KIyMgTGluaw0KDQojIyMg7J6Q64+ZIOunge2BrA0KVXJsIOydtOuCmCDsnbTrqZTsnbwg7KO87IaMIOuTseydhCBcPD5cIOyViOyXkCDrhKPsnLzrqbQg66eB7YGs66GcIOuenOuNlOungSDrkJzri6QuDQoNCiAgICA8aHR0cDovL25hdmVyLmNvbT4NCiAgICANCiAgICA8c3Vuc21pbGluZ0BuYXZlci5jb20+DQoNCjxodHRwOi8vbmF2ZXIuY29tPg0KDQo8c3Vuc21pbGluZ0BuYXZlci5jb20+DQoNCg0KIyMjIOyduOudvOyduCDrp4HtgawNCuyduOudvOyduCDrp4HtgazripQgW+unge2BrCDshKTrqoUg7YWN7Iqk7Yq4XSwgKOunge2BrOydmCBVUkwpIOusuOuylSDsgqzsmqkuDQrsnbjrnbzsnbgg66eB7YGs7JeQ7IScIOuplOydvOydhCDrs7TrgrTqs6DsnpAg7ZWgIOuVjOuKlCBtYWlsdG86IOulvCDsnoXroKXtlZjrqbQg65Cc64ukLg0KDQogICAgW3N1bm55IHNpdGVdKGh0dHA6Ly9zbWlsaW5nLXN1bi50aXN0b3J5LmNvbS8p7JeQIOuGgOufrOyYpOyEuOyalC4NCiAgICANCiAgICBb7J206rOz7Jy866GcXShtYWlsdG86c3Vuc21pbGluZ0BuYXZlci5jb20p7Jy866GcIOuplOydvOydhCDrs7TrgrTshLjsmpQNCg0KW3N1bm55IHNpdGVdKGh0dHA6Ly9zbWlsaW5nLXN1bi50aXN0b3J5LmNvbS8p7JeQIOuGgOufrOyYpOyEuOyalC4NCg0KW+ydtOqzs+ycvOuhnF0obWFpbHRvOnN1bnNtaWxpbmdAbmF2ZXIuY29tKeycvOuhnCDrqZTsnbzsnYQg67O064K07IS47JqUDQoNCg0KDQojIyMg66CI7Y2865+w7IqkIOunge2BrA0K7ZSE66Gc6re4656Y67CN7JeQ7IScIOuzgOyImOyymOufvCwg7J6Q7KO8IOyCrOyaqe2VmOuKlCDsm7kg7KO87IaM65Ox7J2EIOyggOyepe2VtOuGk+qzoCDsk7DripQg67Cp67KVLiDslYTrrLTrjbDshJzrgpgg7IKs7JqpIOqwgOuKpSjslYjrs7TsnoQpLg0KDQpb67OA7IiY66qFXSwg7L2c66GgKDopLCBzcGFjZSwgVVJMDQoNCiAgICBb6rWs6riAXTogaHR0cDovL3d3dy5nb29nbGUuY28ua3INCg0KICAgIFvtjKzrj4Ug7IKs7J207Yq4XTogaHR0cDovL3BhbmRvYy5vcmcvaW5kZXguaHRtbA0KICAgIA0KICAgIFvqtazquIBd7JeQ7IScIOqygOyDie2VtOuztOuptCAuLi4NCg0KDQoNClvqtazquIBdOiBodHRwOi8vd3d3Lmdvb2dsZS5jby5rcg0KDQpb7Yys64+FIOyCrOydtO2KuF06IGh0dHA6Ly9wYW5kb2Mub3JnL2luZGV4Lmh0bWwNCg0KW+q1rOq4gF3sl5DshJwg6rKA7IOJ7ZW067O066m0IC4uLg0KDQoNCiMjIyDrrLjshJwg64K067aAIOunge2BrA0KDQrslZ7shJwg7Zek642U7JeQIOyVhOydtOuUlCDso7zripQg67Cp67KVOg0KDQogICAgW+yEnOuhoF0gKCNBYm91dE1hcmtkb3duKQ0KICAgIA0K66y47ISc7JeQIOuCtOu2gCDrp4Htgawg7KO864qUIOuwqeuylTogDQoNCiAgICBb66eB7YGs7J24642x7IqkXSguL2h0bWzrrLjshJwjSUQpDQogICAgDQpBIOusuOyEnOydmCBb7KCA7J6Q7J2Y6rKsXSguL0EuaHRtbCNvcGluaW9uKeydhCDrs7TrqbQNCg0KDQojIyMg6re466a8IOyCveyehQ0KcGRm7JeQ7ISc64qUIOygnOuMgOuhnCDrnpzrjZTrp4Eg65CY7KeA66eMLCBodG1sLCBkb2Nz7JeQ7ISc64qUIOygnOuMgOuhnCDrnpzrjZTrp4Eg65CY7KeAIOyViuycvOuvgOuhnCBrbmly7Yyo7YKk7KeA7J2YIGluY2x1ZGVfZ3JhcGhpY3MoKSDtlajsiJjsmYAg7YGs6riwLCDsnITsuZgg7KGw7KCV7ZWY64qUIOyyre2BrCDsmLXshZgg7IKs7Jqp7ZWgIOqyg+ydhCDqtozsnpANCg0KICAgICFb7J2066+47KeAXSh1cmwvdG8vdGhlL2ltYWdlLnBuZykNCg0KIVvsnbTrr7jsp4BdKGh0dHA6Ly93d3cuYWt0dWFsZS5tay93cC1jb250ZW50L3VwbG9hZHMvMjAxNi8wNi8xMzcxOTItMzAweDE5OS5qcGcpDQoNCiMjIyAuUm1k7YyM7J287JeQ7IScIOywuOqzoCDrrLjtl4zqs7wg7J247JqpIO2RnOyLnA0KDQotIOuLpOyWke2VnCDtj6zrqafqs7wg7ZmV7J6l7J6QIOyhtOyerA0KLSDtjKzrj4Xsl5DshJzripQg7Jik7ZSI7IaM7Iqk7LC46rOg66y47ZeMIOq0gOumrCDrjbDsnbTthLDrsqDsnbTsiqQg7Y+s66mn7J2EIOyngOybkA0KLSBSbWQg7YyM7J287JeQIOywuOqzoOusuO2XjCBEQuulvCDstpTqsIDtlaAg65WM64qUIFlBTUwg7Zek642U7J2YIGJpYmlvZ3JhcGh5652864qUIO2VhOuTnOyXkCBEQiDtjIzsnbzrqoXsnLzroZwg7ZWt66qp7J2EIOyngOyglQ0KICAgIA0KICAgIC8tLS0NCiAgICANCiAgICB0aXRsZTog7JWM66eI7YGs64uk7Jq07JeQIOuMgO2VmOyXrA0KICAgIA0KICAgIGF1dGhvcjogU0JLbw0KICAgIA0KICAgIGJpYmxpb2dyYXBoeTogZXhhbXBsZS5iaWJ0ZXgNCiAgICANCiAgICBvdXRwdXQ6DQogICAgDQogICAgIGh0bWxfZG9jdW1lbnQ6DQogICAgDQogICAgICB0b2M6IHRydWUNCiAgICANCiAgICAvLS0tDQogICAgDQogICAg7JWM66eI7YGs64uk7Jq0IO2MqOyngFtAYWxsYWlyZTIwMTRd7JeQIOuUsOultOuptA0KDQotIOyKpO2DgOydvCDsp4DsoJXtlZjquLANCu2VmeyIoOyngOuniOuLpOydmCDsoJXtlbTsp4Qg7Iqk7YOA7J28LijtjKzrj4XsnZggZGVmYXVsdDogJ+yggOyekC3sl7Drj4QnKQ0KDQrsiqTtg4DsnbzsnYQg67CU6r646riwIOychO2VtOyEnOuKlCDsiqTtg4Dsnbwg7KCV7J2YIOyLnO2KuCDtjIzsnbwoLmNzbCnsnYQg64uk7Jq067Cb7JWELCBZQU1MIO2VtOuNlOyXkOyEnCBjc2wg7ZWE65Oc66W8IOyCrOyaqe2VmOuptCDrkJzri6QuDQoNCiMjIyDso7zshJ0g64us6riwDQoNCiAgICBIZXJlIGlzIGEgZm9vdG5vdGUgcmVmZXJlbmNlLFteMV0gYW5kIGFub3RoZXIuW15sb25nbm90ZV0NCiAgICANCiAgICBbXjFdOiBIZXJlIGlzIHRoZSBmb290bm90ZS4NCiAgICANCiAgICBbXmxvbmdub3RlXTogSGVyZSdzIG9uZSB3aXRoIG11bHRpcGxlIGJsb2Nrcy4NCiAgICANCiAgICAgICAgU3Vic2VxdWVudCBwYXJhZ3JhcGhzIGFyZSBpbmRlbnRlZCB0byBzaG93IHRoYXQgdGhleQ0KICAgICAgICBiZWxvbmcgdG8gdGhlIHByZXZpb3VzIGZvb3Rub3RlLg0KICAgIA0KICAgICAgICAgICAgeyBzb21lLmNvZGUgfQ0KICAgIA0KICAgICAgICBUaGUgd2hvbGUgcGFyYWdyYXBoIGNhbiBiZSBpbmRlbnRlZCwgb3IganVzdCB0aGUgZmlyc3QNCiAgICAgICAgbGluZS4gIEluIHRoaXMgd2F5LCBtdWx0aS1wYXJhZ3JhcGggZm9vdG5vdGVzIHdvcmsgbGlrZQ0KICAgICAgICBtdWx0aS1wYXJhZ3JhcGggbGlzdCBpdGVtcy4NCiAgICANCiAgICBUaGlzIHBhcmFncmFwaCB3b24ndCBiZSBwYXJ0IG9mIHRoZSBub3RlLCBiZWNhdXNlIGl0DQogICAgaXNuJ3QgaW5kZW50ZWQuDQogICAgDQpIZXJlIGlzIGEgZm9vdG5vdGUgcmVmZXJlbmNlLFteMV0gYW5kIGFub3RoZXIuW15sb25nbm90ZV0NCg0KW14xXTogSGVyZSBpcyB0aGUgZm9vdG5vdGUuDQoNCltebG9uZ25vdGVdOiBIZXJlJ3Mgb25lIHdpdGggbXVsdGlwbGUgYmxvY2tzLg0KDQogICAgU3Vic2VxdWVudCBwYXJhZ3JhcGhzIGFyZSBpbmRlbnRlZCB0byBzaG93IHRoYXQgdGhleQ0KYmVsb25nIHRvIHRoZSBwcmV2aW91cyBmb290bm90ZS4NCg0KICAgICAgICB7IHNvbWUuY29kZSB9DQoNCiAgICBUaGUgd2hvbGUgcGFyYWdyYXBoIGNhbiBiZSBpbmRlbnRlZCwgb3IganVzdCB0aGUgZmlyc3QNCiAgICBsaW5lLiAgSW4gdGhpcyB3YXksIG11bHRpLXBhcmFncmFwaCBmb290bm90ZXMgd29yayBsaWtlDQogICAgbXVsdGktcGFyYWdyYXBoIGxpc3QgaXRlbXMuDQoNClRoaXMgcGFyYWdyYXBoIHdvbid0IGJlIHBhcnQgb2YgdGhlIG5vdGUsIGJlY2F1c2UgaXQNCmlzbid0IGluZGVudGVkLg0KDQo=