Introdução ao RMarkdown



1 Uma visão geral sobre o R Markdown

1.1 O que é R Markdown?

R Markdown é uma linguagem de marcação1 que combina o poder do R com a simplicidade do Markdown. Essa ferramenta versátil foi desenvolvida para facilitar a criação de documentos dinâmicos e reprodutíveis, integrando código, texto e resultados em um único ambiente.

1.2 Um pouco de história

O R Markdown teve suas origens no ecossistema do R, uma linguagem de programação2 estatística popular entre cientistas de dados e pesquisadores. A ideia era criar um formato de documento que permitisse a incorporação de análises de dados diretamente no texto, facilitando a comunicação e a reprodução dos resultados. O R Markdown é uma extensão do Markdown, que por sua vez foi criado por John Gruber e Aaron Swartz em 2004.

1.3 Desenvolvimento do R Markdown

A criação do R Markdown é atribuída a Yihui Xie, um estatístico e desenvolvedor chinês que contribuiu significativamente para a comunidade R. Yihui Xie percebeu a necessidade de um formato de documento que fosse mais flexível e permitisse a integração fluida de código R em documentos de texto. Em 2012, ele lançou o pacote knitr para o R, que facilitou a execução de código R incorporado em documentos. O R Markdown surgiu como uma evolução natural desse trabalho, proporcionando uma experiência mais simplificada e amigável para os usuários.
Os objetivos principais por trás do R Markdown eram fornecer uma maneira fácil e eficiente de combinar narrativas, código e resultados em um único documento.

1.4 Benefícios do R Markdown

Algumas características e benefícios importantes incluem:

  • Reprodutibilidade:
    A capacidade de incorporar código diretamente no documento permite a reprodução fácil e rápida dos resultados, garantindo a transparência e a confiabilidade.
  • Comunicação Efetiva:
    Ao integrar análises de dados diretamente no texto, o R Markdown torna a comunicação de resultados mais clara e compreensível, tornando a análise de dados mais acessível para um público mais amplo.
  • Flexibilidade:
    Suporte para vários formatos de saída, como HTML, PDF, Word, entre outros, proporciona flexibilidade na apresentação dos resultados.

2 Como criar o seu arquivo Markdown

Para começar a utilizar o Markdown, você precisa ter algumas ferramentas instaladas no seu ambiente de desenvolvimento. Aqui estão as principais ferramentas que você precisa:

  • R:
    O R é uma linguagem de programação estatística amplamente utilizada.
  • RStudio:
    Embora não seja estritamente necessário, o RStudio é um ambiente de desenvolvimento integrado (IDE) muito popular para o R e é altamente recomendado para trabalhar com R Markdown devido à sua integração perfeita.
  • Pandoc:
    O Pandoc é uma ferramenta de conversão de documentos que o R Markdown utiliza para converter documentos Markdown em vários formatos de saída, como HTML, PDF, Word, etc. O RStudio instala automaticamente o Pandoc. No entanto, se você não estiver usando o RStudio ou precisar de uma versão mais recente do Pandoc, você pode baixá-lo diretamente do site oficial.

Para começar, utilizaremos exclusivamente o R e o RStudio. Após a instalação de ambos, você deve abrir o RStudio para iniciar o documento RMarkdown.


Obs: Serão apresentadas aqui duas formas de como você pode armazenar seu documento RMarkdown. O autor deste guia utiliza e recomenda a segunda forma.

2.1 Primeira forma

Com o Rstudio aberto, você deve ir no canto superior esquerdo em File > New File > R Markdown.



Após isso você deve informar o título do seu documento, o seu nome e o formato de saída (é possível, após a criação do arquivo, mudar o formato de saída).



Com o arquivo criado sua tela aparecerá mais ou menos da seguinte forma. Não se assuste com esse script gerado pelo próprio RMarkdown, os seus elementos serão explicados em breve.



Você pode apagar tudo que está abaixo do cabeçalho YAML, o qual é delimitado por três traços ---. Observe, também, que abaixo do arquivo RMarkdown tem uma outra janela chamada console. Com essa janela é possível utilizar códigos do R para fazer diversas coisas, inclusive baixar pacotes necessários ao funcionamento do rmarkdown.



Antes de começar, é preciso entender como guardar, da forma correta, o arquivo criado. Para isso, crie uma pasta no explorador de arquivos, ela será a pasta dos seus projetos de RMarkdown. Dentro dessa pasta, crie outra pasta que conterá o seu arquivo RMarkdown e outros arquivos necessários ao funcionamento do RMarkdown que futuramente você precisará guardar. Com isso feito, volte para o Rstudio, clique Ctrl+Alt+S e escolha a pasta que você criou.
Com a pasta criada, agora é preciso defini-la como o seu diretório de trabalho3 a ser utilizado. Você pode verificar o diretório de trabalho atual no console (na parte inferior esquerda é possível ver onde é o console) do rstudio usando a função getwd() e alterá-lo para a pasta mais interna que você criou usando a função setwd(). Por exemplo:

getwd() # Retorna o diretório de trabalho sendo utilizado
## [1] "C:/Users/Administrator/Documents/Projetos_R/PET_Projetos/PET_RMardown"

#setwd("C:/Users/Administrator/Documents/PET_Projetos/PET_RMardown") # Altera o diretório de trabaho

# Obseve as barras de separação do caminho em setwd() 
# Quando você copia um caminho no windows, esse caminho é colocado com uma barra diferente (\)



2.2 Segunda foma

Com o Rstudio aberto, você deve ir no canto superior esquerdo em File > New Project....



Agora escolha a opção New Directory para iniciar um projeto ne um novo diretório de trabalho4.



Escolha a opção New Project para criar um novo projeto em um diretório vazio.



Coloque um nome no seu diretório. Após isso, vá no seu Explorador de Arquivos e crie uma pasta para ser seu subdiretório. Você pode utilizar um único subdiretório para armazenar vários diretórios.



Volte para o Rstudio e vá na opção Browse... para selecionar a pasta que você criou como subdiretório.



Lembre de deixar selecionado a opção Use renv with this project para que seja utilizado um caminho relativo.




Feito isso, basta ir em Create Project para criar o seu novo projeto.




Com o projeto criado, basta criar o arquivo Markdown. Você pode fazer de duas formas: a primeira mostrada será a recomendada para quem está começando ou para quem está querendo seguir este guia de RMarkdown à risca, e a segunda forma é para quem já sabe um pouco de Markdown, inclusive fazer uma cabeçalho YAML, o que será mostrado nos ultimos capítulos deste guia.

2.2.1 Primeira forma de criar o arquivo RMarkdown

Para a primeira forma, vá em File > New File > R Markdown....



Após isso você deve informar o título do seu documento, o seu nome e o formato de saída (é possível, após a criação do arquivo, mudar o formato de saída).



Com o arquivo criado, sua tela aparecerá mais ou menos da seguinte forma. Não se assuste com esse script gerado pelo pelo próprio RMarkdown, os seus elementos serão explicados em breve.



Você pode apagar tudo que está abaixo do cabeçalho YAML, o qual é delimitado por três traços ---. Observe, também, que abaixo do arquivo do RMarkdown tem uma outra janela chamada console. Com essa janela é possível utilizar códigos do R para fazer diversas coisas, inclusive baixar pacotes necessários ao funcionamento do rmarkdown.

Observe que você criou o seu arquivo RMarkdown mas não o salvou em seu diretório de trabalho. Você pode apertar Ctrl + S para salvar ou apertar Ctrl + Shift + K que, embora sirva para renderizar o seu arquivo, também o salva automaticamente.Você deve selecionar o seu diretório de trabaho, aquele dentro do subdiretório, para salvar o seu arquivo.



Após esses passos você pode iniciar com o pé direito na parte da syntax do RMarkdown. Aproveite!

2.2.2 Segunda forma de criar o seu arquivo

A segunda forma de criar seu arquivo RMarkdown faz um Script em branco, sem aquele gerado automaticamente pelo próprio RMarkdown. Dessa forma, você cria tudo do zero, inclusive o cabeçalho YAML. Para fazê-lo, vá em New Blank File > R Markdown... e digite um nome para o seu arquivo.



Ao criar seu arquivo você poderá vê-lo na aba Files no canto inferior direito. Além disso, se for pedido a instalação de algum pacote para o correto funcionamento do RMarkdown então aperte em Install.

Após esses passos você pode iniciar com o pé direito na parte da sintaxe do RMarkdown. Aproveite!

3 Renderização do documento no RMarkdown

Para começar, escreva qualquer coisa que venha na sua mente abaixo do cabeçalho YAML. Após isso aperte Ctrl+Shift+k ou clique no botão Knit para renderizar o documento, igual na seguinte imagem.

4 Cabeçalhos

Para inserir seções de diferentes níveis, vulgo cabeçalhos, você vai utilizar a seguinte sintaxe

# Cabeçalho 1
## Cabeçalho 2
### Cabeçalho 3
#### Cabeçalho 4
##### Cabeçalho 5
###### Cabeçalho 6

Cabeçalho 1

Cabeçalho 2

Cabeçalho 3

Cabeçalho 4

Cabeçalho 5
Cabeçalho 6

Observe a relação entre os cabeçalhos: os de nível mais alto estão aninhados dentro dos de nível mais baixo, desde que os de nível mais alto sejam posicionados após os de nível mais baixos.

Opções de output para cabeçalho

Sem numeração e não listado no índice

O RMarkdown permite utilizar algumas opções que mudam o output do cabeçalho. Nos cabeçalhos anteriores você deve ter percebido que não há numeração e eles também não são colocados no índice. Para que isso ocorra, use o seguinte código em que .unlisted tira o cabeçalho do índice e .unnumbered tira a numeração.

#### Cabeçalho sem numeração e não listado no índice {.unlisted .unnumbered}

Cabeçalho sem numeração e não listado no índice

Abas iterativas

Também é possível tranformar os cabeçalhos em abas iterativas a partir da opção.tabset. Outra opção como .tabset-fade permite deixar a transição entre as abas mais suave. O exemplo a seguir ilustra esses comandos.

#### Seções com Abas {.tabset .tabset-fade .unlisted .unnumbered}

##### Aba 1 {.unlisted .unnumbered}
Este é o conteúdo da Aba 1.

##### Aba 2 {.unlisted .unnumbered}
Este é o conteúdo da Aba 2.

##### Aba 3 {.unlisted .unnumbered}
Este é o conteúdo da Aba 3.

Seções com Abas

Aba 1

Este é o conteúdo da Aba 1.

Aba 2

Este é o conteúdo da Aba 2.

Aba 3

Este é o conteúdo da Aba 3.

5 Quebra de linha

Para fazer quebra de linha basta colocar dois espaços no final de um texto ou adicionar uma barra invertida, de acordo com o seguinte código.

Aqui vai ser realizado uma quebra de linha  
Aqui também será feito uma quebra de linha\

Aqui vai ser realizado uma quebra de linha
Aqui também será feito uma quebra de linha

Além disso, se você quer adicionar mais quebras de linhas, mas em linhas sem nenhuma informação, é possível fazer o seguinte código html.

Aqui será realizado ...\
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
... várias quebras de linha\

Aqui será realizado …























… várias quebras de linha

6 Algumas opções de formatação de texto

Código Saída
*itálico* itálico
_itálico_ itálico
*em*apenas*algumas*letras emapenasalgumasletras
**negrito** negrito
__negrito__ negrito
**em**apenas**algumas**letras emapenasalgumasletras
sobrescrito^2^ sobrescrito2
subscrito~2~ subscrito2
~~sublinhado~~ sublinhado

7 Como deixar o código de forma literal

7.1 Para um caractere

Para fazer isso em um caractere basta usar a barra invertida (\), veja só:

**negrito**\
\*\*negrito\*\*

negrito
**negrito**

7.2 Para várias palavras em uma linha

Para várias palavras você utiliza crases:

`Código de forma literal`

Código de forma literal

7.3 Para várias linhas:

Para utilizar código literal em várias linhas você pode usar três crases juntas ```:

```
Várias
linhas
de
código
literal
```

Várias
linhas
de
código
literal

8 Bloco de citação

Para adicionar um bloco de citação você utilizará a seguinte syntax:

> Aqui você fará sua citação
> Veja que a quebra de linha não é automática

Aqui você fará sua citação Veja que a quebra de linha não é automática

9 Traço, travessão e reta de separação

Para adicionar um traço e um travessão faça o seguinte:

Código Saída
Traço: -- Traço: –
Travessão: --- Travessão: —

Para adicionar uma reta horizontal de separação você pode utiizar duas formas, veja:

Três estrelas ou mais:

***


Três traços ou mais:

---


10 Listas

10.1 Lista não ordenada

Há três formas de fazer uma lista não ordenada. Observe e pratique:

Primeira forma

- Lista não ordenada
  - Item
    - Item
      - Item

  • Lista não ordenada
    • Item
      • Item
        • Item


Segunda forma

+ Lista não ordenada
  + Item
    + Item
      + Item

  • Lista não ordenada
    • Item
      • Item
        • Item


Terceira forma

* Lista não ordenada
  * Item
    * Item
      * Item

  • Lista não ordenada
    • Item
      • Item
        • Item

10.2 Lista Ordenada

Você pode fazer listas ordenadas da seguinte forma.

1. Lista ordenada
    1. Item
    1. Item
2. Lista ordenada
    1. Item
        1. Item
2. Lista ordenada
    - Item
      * Item
- Lista não ordenada
    + Item
3. Ordenção automática sem funcionamento

  1. Lista ordenada
    1. Item
    2. Item
  2. Lista ordenada
    1. Item
      1. Item
  3. Lista ordenada
    • Item
      • Item
  • Lista não ordenada
    • Item
  1. Ordenção automática sem funcionamento

10.3 Lista com opções de marcação

Você pode fazer listas com opção de marcar junto ao que foi mostrado de listas não ordenadas e ordenadas, olhe só:

- [x] Primeira opção
  * [ ] Item
  + [x] Item
    1. [ ] Item
    2. [ ] Item
    - [ ] Item
    * [ ] Item
    + [ ] Item

- [ ] Segunda opção
  * [x] Item
    + [ ] Item
      1. [ ] Item
      1. [ ] Item
      1. [ ] Item
    
- [x] Terceira opção

12 Imagens

Parecido com os links, as imagens podem ser adicionadas de três formas.


  • A primeira forma é a seguinte:
<div style="text-align:center">
![Universidade Federal do Ceará](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTyblZQAVU4rkTuEx-8wocoM7XxO2a31Nsu3L5Y3Guj0w&s 'Logo UFC'){ width=20% }
</div>
Universidade Federal do Ceará
Universidade Federal do Ceará

Observe que esses códigos com <div alguma-coisa> são adicionais do html que você pode está utilizando. Então não se preocupe se não entendê-los porque para entender markdown basta focar nas outras partes.


  • A segunda maneira, melhor para adicionar a mesma imagem várias vezes ou para ter uma maior organização, é a seguinte:
![Universidade Federal do Ceará][link-2]

![Logo da UFC][link-2]

[link-2]:https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTyblZQAVU4rkTuEx-8wocoM7XxO2a31Nsu3L5Y3Guj0w&s 'Logo UFC'
Universidade Federal do Ceará
Universidade Federal do Ceará
Logo da UFC
Logo da UFC

13 Notas de Rodapé

Utilize a seguinte syntax para adicionar uma nota de rodapé:

Isso é uma nota de rodapé: [^def]

[^def]: definição

Isso é uma nota de rodapé: 5

Note que não é necessário fazer a numeração das notas de rodapé porque elas são numeradas automaticamente. Além disso, a nota de rodapé é clicável, levando o usuário ao final do documento, onde se encontram todas notas de rodapé.

14 Bibliográfia

14.1 Arquivo .bib

Para criar um arquivo .bib6 você deve abrir um arquivo de texto. Para preenchê-lo você irá utilizar os dados bibliográficos no formato BibTeX. É possível pegar esses dados já feitos no Google Acadêmico.

Por exemplo, digamos que você quer citar o livro Estatística Básica. Basta você pesquisar o nome do livro e ir na opção Citar.



Após isso, basta escolher a opção BibTeX.




Depois, é só copiar e colar no seu arquivo de texto. Você pode ir adicionando essas referências a qualquer momento no seu arquivo de texto, então já é possível salvá-lo dentro do seu diretório. Lembre de salvar o seu arquivo com o “.bib” no final ao invés de “.txt”.

Com isso, no próximo tópico você irá aprender a como colocar o seu arquvo .bib em funcionamento dentro do RMarkdown.

14.2 A opção de bibliografia no YAML HEADER

Para colocar seu arquivo .bib em funcionamento basta adicionar bibliography: Nome.bib em seu cabeçalho YAML. Veja o seguinte exemplo com o arquivo criado na seção anterior:

---
title: "Novo_Arquivo"
author: "Jonas"
date: "2024-02-08"
bibliography: bibliografia.bib
output: html_document
---

Observe que apenas colocar essa opção no cabeçalho YAML não vai adicionar suas citações ou referências ao arquivo. Além disso, é importante observar se o arquivo .bib está no seu diretório de trabalho para não haver erros.

14.3 Citações

Para fazer uma citação você vai utiizar o @. Por exemplo, para citar o livro Estatística Básica, o qual já está no arquivo .bib criado anteriormente, você vai pegar a primeira informação na citação BibTeX e colocá-la após o @.



Após renderizar o seu arquivo você verá que além da citação foi colocado automaticamente no final do output a referência da citação.



Se você quiser uma citação entre parênteses basta colocar colchetes no código anterior.



Caso você queira que apenas o ano apareça na citação, você pode utilizar a syntax anterior com um - na frente do @.

14.3.1 Citação clicável

Para que seja possível clicar na citação e ir direto para as referências é possível colocar a opção link-citations: TRUE no cabeçalho YAML.

14.3.2 Mudança de idioma

Além disso, você deve ter percebido que as citações estão em outra língua. Adicione a opção lang: pt-br no cabeçalho YAML para que fique no idioma do Brasil, semelhante ao seguinte exemplo.

---
title: "Novo_Arquivo"
author: "Jonas"
date: "*07 de janeiro,  2025*"
bibliography: bibliografia.bib
link-citations: TRUE
lang: pt-br
output: html_document
---

14.3.3 Referência sem citação

Se caso você quiser fazer apenas a referência sem precisar fazer a citação ao longo do seu documento, então coloque a opção notice.


Se forem várias referências, então você pode fazer a separação com vírgulas.

15 Equações matemáticas

Você pode inserir equações matemáticas no RMarkdown da mesma maneira que o faria no LaTeX. Se você não está familiarizado com esse formato, recomendamos acessar o site do Overleaf para obter mais detalhes. Abaixo estão dois exemplos que demonstram como adicionar equações matemáticas em seu documento.

15.1 Equação em linha

Essa forma permite colocar uma equação matemática na mesma linha que o seu texto. Você pode fazer isso utilizando a seguinte syntax.

$SuaEquação$

Por exemplo, esta é a fórmula do desvio padrão:

Desvio Padrão: $\sqrt{\frac{\sum_{i=1}^{n}x_i^2-n\overline{x}^2}{n-1}}$

Desvio Padrão: \(\sqrt{\frac{\sum_{i=1}^{n}x_i^2-n\overline{x}^2}{n-1}}\)

Veja que a equação foi colocada junto ao texto normal em uma única linha.

15.2 Equação em bloco

Esta forma de escrita não possibilita a inserção de texto normal na mesma linha que a equação, no entanto, centraliza automaticamente a equação e deixa ela maior, o que dá um maior destaque. A sua syntax é a seguinte:

$$SuaEquação$$

O seguinte exemplo faz uma equação em bloco na qual a variável W tem distribuição normal padrão.

$$W = \frac{\displaystyle\sum_{i=1}^{n}X{i}-n\mu}{\sqrt{n}\sigma}$$

\[W = \frac{\displaystyle\sum_{i=1}^{n}X{i}-n\mu}{\sqrt{n}\sigma}\]

16 Chunks

Chunks permitem que códigos de diferentes linguagens (como R, python, SQL, LaTeX, entre outras) sejam adicionadas ao arquivo do RMarkdown, o que permite reproduzir, por exemplo, tabelas, gráficos e cálculos dentro do seu arquivo. Para adiconar um chunk que permite a reprodução de código R realize o seguinte código.

```\{r\}
# Aqui dentro é onde irá ficar seu código R.
```

Uma observação a se fazer é que as barras invertidas que estam aparecendo não fazem parte da sintaxe, foram apenas necessárias para conseguir mostrar as chaves.

Para adicionar um chunk que reproduza qualquer linguagem, faça o seguinte código substituindo nome pelo nome da línguagem de interesse (python, r, bash, sql, php, etc).

```\{nome\}
Digite o seu código aqui.
```

Chunks oferecem opções que permitem mudar o output do código. Para adicionar uma ou mais opções, faça o seguinte código.

```\{nome opcao1, opcao2, ..., opcaon\}
Digite o seu código aqui.
```

A seguir são apresentadas algumas das opções disponíveis no RMarkdown para mudar o output do chunk.

Opção O que ela faz
echo=FALSE Oculta o código, mostrando apenas o resultado.
message=FALSE Retira os avisos que aparecem no código.
eval=FALSE O código não é executado, mas será exibido no documento.
include=FALSE Oculta o código e os resultados, mas executa o código.
warning=FALSE Tira os avisos do output.
results=‘hide’ Oculta os resultados do código.
error=TRUE Renderiza o arquivo mesmo ocorrendo erros.
collapse=TRUE Junta todas as saídas de um chunk em um único bloco.

Para exemplificar a utilização de chunks com a linguagem r, a seguir é feito um diagrama de disperção utilizando ggplot.

```\{r chunk-label, echo=TRUE, message=FALSE, warning=FALSE\}
library(tidyverse)
library(palmerpenguins)
library(ggthemes)

ggplot(data = penguins,
       mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
  geom_point(mapping = aes(color = species)) +
  geom_smooth(method = 'lm')
```
library(tidyverse)
library(palmerpenguins)
library(ggthemes)

ggplot(data = penguins,
       mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
  geom_point(mapping = aes(color = species)) +
  geom_smooth(method = 'lm')

Tambem é possível apresentar resultados numéricos dentro do seu texto, como no seguinte exemplo.

A massa corporal média dos pinguins é `\r round(mean(penguins$body_mass_g, na.rm = T), 2)`

A massa corporal média dos pinguins é 4201.75

É importante ressaltar que a barra invertida não faz parte da sintaxe, mas foi necessária para que todo o código seja mostrado.

17 Tabelas

17.1 Tabela feita na mão

Para fazer uma tabela sem a utilização do R diretamente no RMarkdown, observe e execute o seguinte código.

|direita|esquerda|padrão|centralizado|
|---:|:---|---|:---:|
|12|12|12|12|
|123|123|123|123|
|2|2|2|2|
direita esquerda padrão centralizado
12 12 12 12
123 123 123 123
2 2 2 2

Veja que o caractere | é utilizado para delimitar o que fica dentro de cada célula, alem da segunda linha do código ter traços e pontos que dizem como vai ser o alinhamento do texto e delimita quem é nome das colunas.

17.2 Tabelas com R

Há duas maneira interessantes de adicionar uma tabela com a utilização do R.

  • Para a primeira é necessário ter o pacote knitr, o pacote kableExtra e o pacote palmerpenguins instalados no seu pc. Execute o código install.packages("knitr"), install.packages("kableExtra") e install.packages("palmerpenguins") em seu console. Após isso você vai utilizar a função library(knitr) e library(kableExtra) para carregar o pacote e para poder ter acesso a sua função kable() e kable_styling(). Se você não quiser usar o library, é possível carregar o pacote e usar a função ao mesmo tempo com knitr::kable() e kableExtra::kable_styling(). Com isso em mente, observe e execute o seguinte código.
library(palmerpenguins)

knitr::kable(head(penguins, 10)) |> 
  kableExtra::kable_styling(full_width = TRUE,
                            bootstrap_options = c("striped", "hover", "condensed", "responsive") 
                            )
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
Adelie Torgersen 39.1 18.7 181 3750 male 2007
Adelie Torgersen 39.5 17.4 186 3800 female 2007
Adelie Torgersen 40.3 18.0 195 3250 female 2007
Adelie Torgersen NA NA NA NA NA 2007
Adelie Torgersen 36.7 19.3 193 3450 female 2007
Adelie Torgersen 39.3 20.6 190 3650 male 2007
Adelie Torgersen 38.9 17.8 181 3625 female 2007
Adelie Torgersen 39.2 19.6 195 4675 male 2007
Adelie Torgersen 34.1 18.1 193 3475 NA 2007
Adelie Torgersen 42.0 20.2 190 4250 NA 2007

Algumas informações importantes sobre os parâmetros utilizados nas funções:

Código Conceito
palmerpenguins É o pacote onde está localizado o tibble (um tipo de base de dados) penguins
kable(head(penguins, 10)) Faz uma tabela com as 10 primeiras linhas
kable_styling() Pemite mudar várias opções visuais. Os códigos dentro dessa função apenas especificam propriedades visuais
full_width = TRUE Essa opção faz a tabela pegar toda a extensão do relatório
striped deixa as cores das linhas alternadas
hover destaca a linha quando passa o mouse
condensed deixa a tabela mais condensada
responsive quando diminui muito a tela ele adapta a tabela


  • Para a outra forma de fazer uma tabela com R você vai precisar do pacote rmarkdown. Desse modo, execute install.packages("rmarkdown"). Após isso, observe e execute o seguinte código.
library(palmerpenguins)

rmarkdown::paged_table(penguins)

Com isso você tem uma boa forma para apresentar, dependendo do que for mais coveniente, poucos dados de uma tabela ou muitos dados de uma tabela.

Você deve ter percebido a forte integração entre Markdown e R aqui no RStudio. Além de criar tabelas, você pode incorporar gráficos gerados pelo R e até mesmo realizar cálculos complexos com base em conjuntos de dados. Essa integração oferece uma ampla gama de possibilidades para criar documentos dinâmicos e interativos que combinam texto, código e resultados em um único ambiente.

Referências

GRUBER, J. Markdown: Syntax. URL http://daringfireball. net/projects/markdown/syntax. Retrieved on June, v. 24, p. 640, 2012.
XIE, Y. Dynamic Documents with R and knitr. [s.l.] CRC Press, 2017.
XIE, Y.; ALLAIRE, J. J.; GROLEMUND, G. R markdown: The definitive guide. [s.l.] CRC Press, 2018.
XIE, Y.; DERVIEUX, C.; RIEDERER, E. R markdown cookbook. [s.l.] CRC Press, 2020.

  1. Uma linguagem de marcação é um conjunto de regras e convenções usadas para estruturar e formatar documentos de texto. Ela adiciona marcações ou tags ao texto para indicar como o documento deve ser apresentado ou estruturado quando renderizado ou processado. As linguagens de marcação são comumente usadas na criação de documentos, páginas web, e-mails e outros tipos de conteúdo textual.↩︎

  2. Uma linguagem de programação é um conjunto de regras, símbolos e convenções usados para escrever instruções que um computador pode seguir para realizar uma tarefa específica. Ela serve como um meio de comunicação entre um programador e um computador, permitindo que o programador transmita suas intenções para a máquina de forma compreensível.↩︎

  3. O diretório de trabalho no R é o local no sistema de arquivos onde o R procura por arquivos e onde ele salva novos arquivos por padrão, a menos que um caminho seja especificado. Quando você inicia uma sessão do R, o diretório de trabalho padrão é definido como o diretório em que o R foi iniciado. Isso significa que qualquer arquivo que você carrega ou salva sem especificar um caminho será relativo a esse diretório.↩︎

  4. O diretório de trabalho no R é o local no sistema de arquivos onde o R procura por arquivos e onde ele salva novos arquivos por padrão, a menos que um caminho seja especificado. Quando você inicia uma sessão do R, o diretório de trabalho padrão é definido como o diretório em que o R foi iniciado. Isso significa que qualquer arquivo que você carrega ou salva sem especificar um caminho será relativo a esse diretório.↩︎

  5. definição↩︎

  6. Um arquivo .bib é um arquivo de banco de dados bibliográfico usado comumente com o software de gerenciamento de referências bibliográficas, como BibTeX. Esse tipo de arquivo é frequentemente utilizado em trabalhos acadêmicos, como teses, dissertações, artigos de revistas e outros documentos que requerem citações e referências bibliográficas. O formato .bib geralmente contém informações bibliográficas sobre obras, como livros, artigos de periódicos, conferências, entre outros. Essas informações incluem detalhes como autor(es), título, ano de publicação, editora, número de páginas, ISSN ou ISBN, e outras informações relevantes.↩︎

LS0tDQp0aXRsZTogfA0KICA6Ojogey5mbG9hdHRpbmd9DQoNCiAgYGBge3Igb3V0LndpZHRoPScxOCUnLCBvdXQuZXh0cmE9J3N0eWxlPSJmbG9hdDpsZWZ0OyBwYWRkaW5nOjEwcHgiJywgZWNobz1GQUxTRX0NCg0KICBrbml0cjo6aW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly9pLmltZ3VyLmNvbS9PeGRIY0x6LnBuZyIpDQogIGBgYA0KICAqKkludHJvZHXDp8OjbyBhbyBSbWFya2Rvd24qKg0KICA6OjoNCmF1dGhvcjogJypQRVQgRXN0YXTDrXN0aWNhIFVGQyonDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICcqJWQgZGUgJUIsICAlWSonKWAiDQpsaW5rLWNpdGF0aW9uczogdHJ1ZQ0KYmlibGlvZ3JhcGh5OiByZWZfaW50cm9fcm1hcmtkb3duLmJpYg0KY3NsOiAiYXNzb2NpYWNhby1icmFzaWxlaXJhLWRlLW5vcm1hcy10ZWNuaWNhcy5jc2wiDQpsYW5nOiAicHQtYnIiDQpub3RpY2U6IHwNCiAgQGdydWJlcjIwMTJtYXJrZG93biwgQHhpZTIwMTdkeW5hbWljLCBAeGllMjAxOHIsIEB4aWUyMDIwcg0KdG9jLXRpdGxlOiB8DQogIDxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCiAgSW50cm9kdcOnw6NvIGFvIFJNYXJrZG93bg0KICA8L2Rpdj4NCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZToNCiAgICAgIGJvb3Rzd2F0Y2g6IHN1cGVyaGVybw0KICAgIHNjc3M6IF9ib290c3dhdGNoICgyKS5zY3NzDQogICAgaGlnaGxpZ2h0OiBicmVlemVkYXJrDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgYW5jaG9yX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGZpZ19jYXB0aW9uOiB0cnVlDQogICAgY2l0YXRpb25fcGFja2FnZTogYmlibGF0ZXgNCi0tLQ0KDQo8YnI+DQoNCi0tLQ0KDQojIFVtYSB2aXPDo28gZ2VyYWwgc29icmUgbyBSIE1hcmtkb3duDQojIyBPIHF1ZSDDqSBSIE1hcmtkb3duPw0KUiBNYXJrZG93biDDqSB1bWEgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5saW5ndWFnZW0gZGUgbWFyY2HDp8Ojbzwvc3Bhbj5bXjFdIHF1ZSBjb21iaW5hIG8gcG9kZXIgZG8gUiBjb20gYSBzaW1wbGljaWRhZGUgZG8gTWFya2Rvd24uIEVzc2EgZmVycmFtZW50YSB2ZXJzw6F0aWwgZm9pIGRlc2Vudm9sdmlkYSBwYXJhIGZhY2lsaXRhciBhIGNyaWHDp8OjbyBkZSBkb2N1bWVudG9zIGRpbsOibWljb3MgZSByZXByb2R1dMOtdmVpcywgaW50ZWdyYW5kbyBjw7NkaWdvLCB0ZXh0byBlIHJlc3VsdGFkb3MgZW0gdW0gw7puaWNvIGFtYmllbnRlLlwNCg0KW14xXTogVW1hIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+bGluZ3VhZ2VtIGRlIG1hcmNhw6fDo288L3NwYW4+IMOpIHVtIGNvbmp1bnRvIGRlIHJlZ3JhcyBlIGNvbnZlbsOnw7VlcyB1c2FkYXMgcGFyYSBlc3RydXR1cmFyIGUgZm9ybWF0YXIgZG9jdW1lbnRvcyBkZSB0ZXh0by4gRWxhIGFkaWNpb25hIG1hcmNhw6fDtWVzIG91IHRhZ3MgYW8gdGV4dG8gcGFyYSBpbmRpY2FyIGNvbW8gbyBkb2N1bWVudG8gZGV2ZSBzZXIgYXByZXNlbnRhZG8gb3UgZXN0cnV0dXJhZG8gcXVhbmRvIHJlbmRlcml6YWRvIG91IHByb2Nlc3NhZG8uIEFzIGxpbmd1YWdlbnMgZGUgbWFyY2HDp8OjbyBzw6NvIGNvbXVtZW50ZSB1c2FkYXMgbmEgY3JpYcOnw6NvIGRlIGRvY3VtZW50b3MsIHDDoWdpbmFzIHdlYiwgZS1tYWlscyBlIG91dHJvcyB0aXBvcyBkZSBjb250ZcO6ZG8gdGV4dHVhbC4NCg0KIyMgVW0gcG91Y28gZGUgaGlzdMOzcmlhDQpPIFIgTWFya2Rvd24gdGV2ZSBzdWFzIG9yaWdlbnMgbm8gZWNvc3Npc3RlbWEgZG8gUiwgdW1hIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+bGluZ3VhZ2VtIGRlIHByb2dyYW1hw6fDo288L3NwYW4+W14yXSBlc3RhdMOtc3RpY2EgcG9wdWxhciBlbnRyZSBjaWVudGlzdGFzIGRlIGRhZG9zIGUgcGVzcXVpc2Fkb3Jlcy4gQSBpZGVpYSBlcmEgY3JpYXIgdW0gZm9ybWF0byBkZSBkb2N1bWVudG8gcXVlIHBlcm1pdGlzc2UgYSBpbmNvcnBvcmHDp8OjbyBkZSBhbsOhbGlzZXMgZGUgZGFkb3MgZGlyZXRhbWVudGUgbm8gdGV4dG8sIGZhY2lsaXRhbmRvIGEgY29tdW5pY2HDp8OjbyBlIGEgcmVwcm9kdcOnw6NvIGRvcyByZXN1bHRhZG9zLiBPIFIgTWFya2Rvd24gw6kgdW1hIGV4dGVuc8OjbyBkbyBNYXJrZG93biwgcXVlIHBvciBzdWEgdmV6IGZvaSBjcmlhZG8gcG9yIEpvaG4gR3J1YmVyIGUgQWFyb24gU3dhcnR6IGVtIDIwMDQuXA0KDQpbXjJdOiBVbWEgPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5saW5ndWFnZW0gZGUgcHJvZ3JhbWHDp8Ojbzwvc3Bhbj4gw6kgdW0gY29uanVudG8gZGUgcmVncmFzLCBzw61tYm9sb3MgZSBjb252ZW7Dp8O1ZXMgdXNhZG9zIHBhcmEgZXNjcmV2ZXIgaW5zdHJ1w6fDtWVzIHF1ZSB1bSBjb21wdXRhZG9yIHBvZGUgc2VndWlyIHBhcmEgcmVhbGl6YXIgdW1hIHRhcmVmYSBlc3BlY8OtZmljYS4gRWxhIHNlcnZlIGNvbW8gdW0gbWVpbyBkZSBjb211bmljYcOnw6NvIGVudHJlIHVtIHByb2dyYW1hZG9yIGUgdW0gY29tcHV0YWRvciwgcGVybWl0aW5kbyBxdWUgbyBwcm9ncmFtYWRvciB0cmFuc21pdGEgc3VhcyBpbnRlbsOnw7VlcyBwYXJhIGEgbcOhcXVpbmEgZGUgZm9ybWEgY29tcHJlZW5zw612ZWwuDQoNCiMjIERlc2Vudm9sdmltZW50byBkbyBSIE1hcmtkb3duDQpBIGNyaWHDp8OjbyBkbyBSIE1hcmtkb3duIMOpIGF0cmlidcOtZGEgYSBZaWh1aSBYaWUsIHVtIGVzdGF0w61zdGljbyBlIGRlc2Vudm9sdmVkb3IgY2hpbsOqcyBxdWUgY29udHJpYnVpdSBzaWduaWZpY2F0aXZhbWVudGUgcGFyYSBhIGNvbXVuaWRhZGUgUi4gWWlodWkgWGllIHBlcmNlYmV1IGEgbmVjZXNzaWRhZGUgZGUgdW0gZm9ybWF0byBkZSBkb2N1bWVudG8gcXVlIGZvc3NlIG1haXMgZmxleMOtdmVsIGUgcGVybWl0aXNzZSBhIGludGVncmHDp8OjbyBmbHVpZGEgZGUgY8OzZGlnbyBSIGVtIGRvY3VtZW50b3MgZGUgdGV4dG8uIEVtIDIwMTIsIGVsZSBsYW7Dp291IG8gcGFjb3RlIFtrbml0cl0oaHR0cHM6Ly95aWh1aS5vcmcva25pdHIvICJrbml0cjogDQpFbGVnYW50LCBmbGV4aWJsZSwgYW5kIGZhc3QgZHluYW1pYyByZXBvcnQgZ2VuZXJhdGlvbiB3aXRoIFIiKSBwYXJhIG8gUiwgcXVlIGZhY2lsaXRvdSBhIGV4ZWN1w6fDo28gZGUgY8OzZGlnbyBSIGluY29ycG9yYWRvIGVtIGRvY3VtZW50b3MuIE8gUiBNYXJrZG93biBzdXJnaXUgY29tbyB1bWEgZXZvbHXDp8OjbyBuYXR1cmFsIGRlc3NlIHRyYWJhbGhvLCBwcm9wb3JjaW9uYW5kbyB1bWEgZXhwZXJpw6puY2lhIG1haXMgc2ltcGxpZmljYWRhIGUgYW1pZ8OhdmVsIHBhcmEgb3MgdXN1w6FyaW9zLlwNCk9zIG9iamV0aXZvcyBwcmluY2lwYWlzIHBvciB0csOhcyBkbyBSIE1hcmtkb3duIGVyYW0gZm9ybmVjZXIgdW1hIG1hbmVpcmEgZsOhY2lsIGUgZWZpY2llbnRlIGRlIGNvbWJpbmFyIG5hcnJhdGl2YXMsIGPDs2RpZ28gZSByZXN1bHRhZG9zIGVtIHVtIMO6bmljbyBkb2N1bWVudG8uIA0KDQojIyBCZW5lZsOtY2lvcyBkbyBSIE1hcmtkb3duDQpBbGd1bWFzIGNhcmFjdGVyw61zdGljYXMgZSBiZW5lZsOtY2lvcyBpbXBvcnRhbnRlcyBpbmNsdWVtOlwNCg0KLSBSZXByb2R1dGliaWxpZGFkZToNCjogICBBIGNhcGFjaWRhZGUgZGUgaW5jb3Jwb3JhciBjw7NkaWdvIGRpcmV0YW1lbnRlIG5vIGRvY3VtZW50byBwZXJtaXRlIGEgcmVwcm9kdcOnw6NvIGbDoWNpbCBlIHLDoXBpZGEgZG9zIHJlc3VsdGFkb3MsIGdhcmFudGluZG8gYSB0cmFuc3BhcsOqbmNpYSBlIGEgY29uZmlhYmlsaWRhZGUuXA0KDQoqIENvbXVuaWNhw6fDo28gRWZldGl2YToNCjogICBBbyBpbnRlZ3JhciBhbsOhbGlzZXMgZGUgZGFkb3MgZGlyZXRhbWVudGUgbm8gdGV4dG8sIG8gUiBNYXJrZG93biB0b3JuYSBhIGNvbXVuaWNhw6fDo28gZGUgcmVzdWx0YWRvcyBtYWlzIGNsYXJhIGUgY29tcHJlZW5zw612ZWwsIHRvcm5hbmRvIGEgYW7DoWxpc2UgZGUgZGFkb3MgbWFpcyBhY2Vzc8OtdmVsIHBhcmEgdW0gcMO6YmxpY28gbWFpcyBhbXBsby5cDQoNCisgRmxleGliaWxpZGFkZToNCjogICBTdXBvcnRlIHBhcmEgdsOhcmlvcyBmb3JtYXRvcyBkZSBzYcOtZGEsIGNvbW8gSFRNTCwgUERGLCBXb3JkLCBlbnRyZSBvdXRyb3MsIHByb3BvcmNpb25hIGZsZXhpYmlsaWRhZGUgbmEgYXByZXNlbnRhw6fDo28gZG9zIHJlc3VsdGFkb3MuXA0KDQoNCiMgQ29tbyBjcmlhciBvIHNldSBhcnF1aXZvIE1hcmtkb3duIHsudGFic2V0IC50YWJzZXQtZmFkZX0NClBhcmEgY29tZcOnYXIgYSB1dGlsaXphciBvIE1hcmtkb3duLCB2b2PDqiBwcmVjaXNhIHRlciBhbGd1bWFzIGZlcnJhbWVudGFzIGluc3RhbGFkYXMgbm8gc2V1IGFtYmllbnRlIGRlIGRlc2Vudm9sdmltZW50by4gQXF1aSBlc3TDo28gYXMgcHJpbmNpcGFpcyBmZXJyYW1lbnRhcyBxdWUgdm9jw6ogcHJlY2lzYTpcDQoNCi0gW1JdKGh0dHBzOi8vd3d3LnItcHJvamVjdC5vcmcvICJUaGUgUiBQcm9qZWN0IGZvciBTdGF0aXN0aWNhbCBDb21wdXRpbmciKToNCjogICBPIFIgw6kgdW1hIGxpbmd1YWdlbSBkZSBwcm9ncmFtYcOnw6NvIGVzdGF0w61zdGljYSBhbXBsYW1lbnRlIHV0aWxpemFkYS5cDQoNCiogW1JTdHVkaW9dKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvICJSU3R1ZGlvIERlc2t0b3AiKToNCjogICBFbWJvcmEgbsOjbyBzZWphIGVzdHJpdGFtZW50ZSBuZWNlc3PDoXJpbywgbyBSU3R1ZGlvIMOpIHVtIGFtYmllbnRlIGRlIGRlc2Vudm9sdmltZW50byBpbnRlZ3JhZG8gKElERSkgbXVpdG8gcG9wdWxhciBwYXJhIG8gUiBlIMOpIGFsdGFtZW50ZSByZWNvbWVuZGFkbyBwYXJhIHRyYWJhbGhhciBjb20gUiBNYXJrZG93biBkZXZpZG8gw6Agc3VhIGludGVncmHDp8OjbyBwZXJmZWl0YS5cDQoNCi0gW1BhbmRvY10oaHR0cHM6Ly9wYW5kb2Mub3JnL2luc3RhbGxpbmcuaHRtbCAiUGFuZG9jICAgYSB1bml2ZXJzYWwgZG9jdW1lbnQgY29udmVydGVyIik6DQo6ICAgTyBQYW5kb2Mgw6kgdW1hIGZlcnJhbWVudGEgZGUgY29udmVyc8OjbyBkZSBkb2N1bWVudG9zIHF1ZSBvIFIgTWFya2Rvd24gdXRpbGl6YSBwYXJhIGNvbnZlcnRlciBkb2N1bWVudG9zIE1hcmtkb3duIGVtIHbDoXJpb3MgZm9ybWF0b3MgZGUgc2HDrWRhLCBjb21vIEhUTUwsIFBERiwgV29yZCwgZXRjLiBPIFJTdHVkaW8gKippbnN0YWxhIGF1dG9tYXRpY2FtZW50ZSoqIG8gUGFuZG9jLiBObyBlbnRhbnRvLCBzZSB2b2PDqiBuw6NvIGVzdGl2ZXIgdXNhbmRvIG8gUlN0dWRpbyBvdSBwcmVjaXNhciBkZSB1bWEgdmVyc8OjbyBtYWlzIHJlY2VudGUgZG8gUGFuZG9jLCB2b2PDqiBwb2RlIGJhaXjDoS1sbyBkaXJldGFtZW50ZSBkbyBzaXRlIG9maWNpYWwuXA0KDQpQYXJhIGNvbWXDp2FyLCB1dGlsaXphcmVtb3MgZXhjbHVzaXZhbWVudGUgbyBSIGUgbyBSU3R1ZGlvLiBBcMOzcyBhIGluc3RhbGHDp8OjbyBkZSBhbWJvcywgdm9jw6ogZGV2ZSBhYnJpciBvIFJTdHVkaW8gcGFyYSBpbmljaWFyIG8gZG9jdW1lbnRvIFJNYXJrZG93bi5cDQoNCjxicj4NCg0KKipPYnM6KiogU2Vyw6NvIGFwcmVzZW50YWRhcyBhcXVpIGR1YXMgZm9ybWFzIGRlIGNvbW8gdm9jw6ogcG9kZSBhcm1hemVuYXIgc2V1IGRvY3VtZW50byBSTWFya2Rvd24uIE8gYXV0b3IgZGVzdGUgZ3VpYSB1dGlsaXphIGUgcmVjb21lbmRhIGEgc2VndW5kYSBmb3JtYS4NCg0KIyMgUHJpbWVpcmEgZm9ybWENCg0KDQpDb20gbyBSc3R1ZGlvIGFiZXJ0bywgdm9jw6ogZGV2ZSBpciBubyBjYW50byBzdXBlcmlvciBlc3F1ZXJkbyBlbSBgRmlsZWAgPiBgTmV3IEZpbGVgID4gYFIgTWFya2Rvd25gLlwNCiFbXShodHRwczovL2kuaW1ndXIuY29tLzJCSDNRVlQucG5nICJDcmlhw6fDo28gZGUgTm92byBBcnF1aXZvIilcDQoNCjxicj4NCjxicj4NCg0KQXDDs3MgaXNzbyB2b2PDqiBkZXZlIGluZm9ybWFyIG8gYHTDrXR1bG9gIGRvIHNldSBkb2N1bWVudG8sIG8gYHNldSBub21lYCBlIG8gYGZvcm1hdG8gZGUgc2HDrWRhYCAow6kgcG9zc8OtdmVsLCBhcMOzcyBhIGNyaWHDp8OjbyBkbyBhcnF1aXZvLCBtdWRhciBvIGZvcm1hdG8gZGUgc2HDrWRhKS5cDQohW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9INjNiR1F6LnBuZyAiRXNwZWNpZmljYcOnw6NvIGRlIGFsZ3VtYXMgaW5mb3JtYcOnw7VlcyBwYXJhIG8gY2FiZcOnYWxobyBZQU1MIilcDQo8YnI+DQo8YnI+DQoNCkNvbSBvIGFycXVpdm8gY3JpYWRvIHN1YSB0ZWxhIGFwYXJlY2Vyw6EgbWFpcyBvdSBtZW5vcyBkYSBzZWd1aW50ZSBmb3JtYS4gTsOjbyBzZSBhc3N1c3RlIGNvbSBlc3NlIHNjcmlwdCBnZXJhZG8gcGVsbyBwcsOzcHJpbyBSTWFya2Rvd24sIG9zIHNldXMgZWxlbWVudG9zIHNlcsOjbyBleHBsaWNhZG9zIGVtIGJyZXZlLlwNCiFbXShodHRwczovL2kuaW1ndXIuY29tL1NnV01CRGQucG5nICJBcnF1aXZvIGNyaWFkbyIpXA0KPGJyPg0KPGJyPg0KDQpWb2PDqiBwb2RlIGFwYWdhciB0dWRvIHF1ZSBlc3TDoSBhYmFpeG8gZG8gY2FiZcOnYWxobyBZQU1MLCBvIHF1YWwgw6kgZGVsaW1pdGFkbyBwb3IgdHLDqnMgdHJhw6dvcyBgLS0tYC4gT2JzZXJ2ZSwgdGFtYsOpbSwgcXVlIGFiYWl4byBkbyBhcnF1aXZvIFJNYXJrZG93biB0ZW0gdW1hIG91dHJhIGphbmVsYSBjaGFtYWRhIGNvbnNvbGUuIENvbSBlc3NhIGphbmVsYSDDqSBwb3Nzw612ZWwgdXRpbGl6YXIgY8OzZGlnb3MgZG8gUiBwYXJhIGZhemVyIGRpdmVyc2FzIGNvaXNhcywgaW5jbHVzaXZlIGJhaXhhciBwYWNvdGVzIG5lY2Vzc8OhcmlvcyBhbyBmdW5jaW9uYW1lbnRvIGRvIHJtYXJrZG93bi5cDQohW10oaHR0cHM6Ly9pLmltZ3VyLmNvbS9pS3NDS0pJLnBuZyAiQXJxdWl2byBhcGVuYXMgY29tIG8gY2FiZcOnYWxobyBZQU1MIilcDQo8YnI+DQo8YnI+DQoNCkFudGVzIGRlIGNvbWXDp2FyLCDDqSBwcmVjaXNvIGVudGVuZGVyIGNvbW8gZ3VhcmRhciwgZGEgZm9ybWEgY29ycmV0YSwgbyBhcnF1aXZvIGNyaWFkby4gUGFyYSBpc3NvLCBjcmllIHVtYSBwYXN0YSBubyBleHBsb3JhZG9yIGRlIGFycXVpdm9zLCBlbGEgc2Vyw6EgYSBwYXN0YSBkb3Mgc2V1cyBwcm9qZXRvcyBkZSBSTWFya2Rvd24uIERlbnRybyBkZXNzYSBwYXN0YSwgY3JpZSBvdXRyYSBwYXN0YSBxdWUgY29udGVyw6EgbyBzZXUgYXJxdWl2byBSTWFya2Rvd24gZSBvdXRyb3MgYXJxdWl2b3MgbmVjZXNzw6FyaW9zIGFvIGZ1bmNpb25hbWVudG8gZG8gUk1hcmtkb3duIHF1ZSBmdXR1cmFtZW50ZSB2b2PDqiBwcmVjaXNhcsOhIGd1YXJkYXIuIENvbSBpc3NvIGZlaXRvLCB2b2x0ZSBwYXJhIG8gUnN0dWRpbywgY2xpcXVlIGBDdHJsYCtgQWx0YCtgU2AgZSBlc2NvbGhhIGEgcGFzdGEgcXVlIHZvY8OqIGNyaW91LlwNCkNvbSBhIHBhc3RhIGNyaWFkYSwgYWdvcmEgw6kgcHJlY2lzbyBkZWZpbmktbGEgY29tbyBvIHNldSA8c3BhbiBzdHlsZT0iY29sb3I6IHZpb2xldDsiPmRpcmV0w7NyaW8gZGUgdHJhYmFsaG88L3NwYW4+W14zXSBhIHNlciB1dGlsaXphZG8uIFZvY8OqIHBvZGUgdmVyaWZpY2FyIG8gZGlyZXTDs3JpbyBkZSB0cmFiYWxobyBhdHVhbCBubyBjb25zb2xlIChuYSBwYXJ0ZSBpbmZlcmlvciBlc3F1ZXJkYSDDqSBwb3Nzw612ZWwgdmVyIG9uZGUgw6kgbyBjb25zb2xlKSBkbyByc3R1ZGlvIHVzYW5kbyBhIGZ1bsOnw6NvIGdldHdkKCkgZSBhbHRlcsOhLWxvIHBhcmEgYSBwYXN0YSBtYWlzIGludGVybmEgcXVlIHZvY8OqIGNyaW91IHVzYW5kbyBhIGZ1bsOnw6NvIHNldHdkKCkuIFBvciBleGVtcGxvOg0KYGBge3IgY29sbGFwc2U9VFJVRX0NCmdldHdkKCkgIyBSZXRvcm5hIG8gZGlyZXTDs3JpbyBkZSB0cmFiYWxobyBzZW5kbyB1dGlsaXphZG8NCg0KI3NldHdkKCJDOi9Vc2Vycy9BZG1pbmlzdHJhdG9yL0RvY3VtZW50cy9QRVRfUHJvamV0b3MvUEVUX1JNYXJkb3duIikgIyBBbHRlcmEgbyBkaXJldMOzcmlvIGRlIHRyYWJhaG8NCg0KIyBPYnNldmUgYXMgYmFycmFzIGRlIHNlcGFyYcOnw6NvIGRvIGNhbWluaG8gZW0gc2V0d2QoKSANCiMgUXVhbmRvIHZvY8OqIGNvcGlhIHVtIGNhbWluaG8gbm8gd2luZG93cywgZXNzZSBjYW1pbmhvIMOpIGNvbG9jYWRvIGNvbSB1bWEgYmFycmEgZGlmZXJlbnRlIChcKQ0KYGBgDQo8YnI+DQo8YnI+DQoNCiMjIFNlZ3VuZGEgZm9tYSB7LnRhYnNldCAudGFic2V0LWZhZGV9DQoNCkNvbSBvIFJzdHVkaW8gYWJlcnRvLCB2b2PDqiBkZXZlIGlyIG5vIGNhbnRvIHN1cGVyaW9yIGVzcXVlcmRvIGVtIGBGaWxlYCA+IGBOZXcgUHJvamVjdC4uLmAuXA0KIVtdKEltYWdlbnMvY3JpYXJfcHJvamV0by5wbmcpXA0KPGJyPg0KPGJyPg0KDQpBZ29yYSBlc2NvbGhhIGEgb3DDp8OjbyBgTmV3IERpcmVjdG9yeWAgcGFyYSBpbmljaWFyIHVtIHByb2pldG8gbmUgdW0gbm92byA8c3BhbiBzdHlsZT0iY29sb3I6IHZpb2xldDsiPmRpcmV0w7NyaW8gZGUgdHJhYmFsaG88L3NwYW4+W14zXS5cDQohW10oSW1hZ2Vucy9jcmlhcl9wcm9qZXRvX25ld19kaXJlY3RvcnkucG5nKVwNCg0KPGJyPg0KPGJyPg0KDQpFc2NvbGhhIGEgb3DDp8OjbyBgTmV3IFByb2plY3RgIHBhcmEgY3JpYXIgdW0gbm92byBwcm9qZXRvIGVtIHVtIGRpcmV0w7NyaW8gdmF6aW8uXA0KIVtdKEltYWdlbnMvY3JpYXJfcHJvamV0b19uZXdfcHJvamVjdC5wbmcpXA0KDQo8YnI+DQo8YnI+DQoNCkNvbG9xdWUgdW0gbm9tZSBubyBzZXUgZGlyZXTDs3Jpby4gQXDDs3MgaXNzbywgdsOhIG5vIHNldSBgRXhwbG9yYWRvciBkZSBBcnF1aXZvc2AgZSBjcmllIHVtYSBwYXN0YSBwYXJhIHNlciBzZXUgc3ViZGlyZXTDs3Jpby4gVm9jw6ogcG9kZSB1dGlsaXphciB1bSDDum5pY28gc3ViZGlyZXTDs3JpbyBwYXJhIGFybWF6ZW5hciB2w6FyaW9zIGRpcmV0w7NyaW9zLlwNCiFbXShJbWFnZW5zL2NyZWF0ZV9uZXdfcHJvamVjdC5wbmcpXA0KDQo8YnI+DQo8YnI+DQoNClZvbHRlIHBhcmEgbyBSc3R1ZGlvIGUgdsOhIG5hIG9ww6fDo28gYEJyb3dzZS4uLmAgcGFyYSBzZWxlY2lvbmFyIGEgcGFzdGEgcXVlIHZvY8OqIGNyaW91IGNvbW8gc3ViZGlyZXTDs3Jpby5cDQohW10oSW1hZ2Vucy9jcmlhcl9wcm9qZXRvX3N1YmRpcmV0b3Jpby5wbmcpXA0KDQo8YnI+DQo8YnI+DQoNCkxlbWJyZSBkZSBkZWl4YXIgc2VsZWNpb25hZG8gYSBvcMOnw6NvIGBVc2UgcmVudiB3aXRoIHRoaXMgcHJvamVjdGAgcGFyYSBxdWUgc2VqYSB1dGlsaXphZG8gdW0gKipjYW1pbmhvIHJlbGF0aXZvKiouXA0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KIVtdKEltYWdlbnMvY2FtaW5ob19yZWxhdGl2by5wbmcpXA0KPC9kaXY+DQoNCjxicj4NCjxicj4NCg0KRmVpdG8gaXNzbywgYmFzdGEgaXIgZW0gYENyZWF0ZSBQcm9qZWN0YCBwYXJhIGNyaWFyIG8gc2V1IG5vdm8gcHJvamV0by5cDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+DQohW10oSW1hZ2Vucy9jcmVhdGVfcHJvamVjdC5wbmcpXA0KPC9kaXY+DQoNCjxicj4NCjxicj4NCg0KQ29tIG8gcHJvamV0byBjcmlhZG8sIGJhc3RhIGNyaWFyIG8gYXJxdWl2byBNYXJrZG93bi4gVm9jw6ogcG9kZSBmYXplciBkZSBkdWFzIGZvcm1hczogYSBwcmltZWlyYSBtb3N0cmFkYSBzZXLDoSBhIHJlY29tZW5kYWRhIHBhcmEgcXVlbSBlc3TDoSBjb21lw6dhbmRvIG91IHBhcmEgcXVlbSBlc3TDoSBxdWVyZW5kbyBzZWd1aXIgZXN0ZSBndWlhIGRlIFJNYXJrZG93biDDoCByaXNjYSwgZSBhIHNlZ3VuZGEgZm9ybWEgw6kgcGFyYSBxdWVtIGrDoSBzYWJlIHVtIHBvdWNvIGRlIE1hcmtkb3duLCBpbmNsdXNpdmUgZmF6ZXIgdW1hIGNhYmXDp2FsaG8gWUFNTCwgbyBxdWUgc2Vyw6EgbW9zdHJhZG8gbm9zIHVsdGltb3MgY2Fww610dWxvcyBkZXN0ZSBndWlhLg0KDQojIyMgUHJpbWVpcmEgZm9ybWEgZGUgY3JpYXIgbyBhcnF1aXZvIFJNYXJrZG93bg0KUGFyYSBhIHByaW1laXJhIGZvcm1hLCB2w6EgZW0gYEZpbGVgID4gYE5ldyBGaWxlYCA+IGBSIE1hcmtkb3duLi4uYC5cDQohW10oSW1hZ2Vucy9uZXdfcm1hcmtkb3duX2ZpbGUucG5nKVwNCg0KPGJyPg0KPGJyPg0KQXDDs3MgaXNzbyB2b2PDqiBkZXZlIGluZm9ybWFyIG8gYHTDrXR1bG9gIGRvIHNldSBkb2N1bWVudG8sIG8gYHNldSBub21lYCBlIG8gYGZvcm1hdG8gZGUgc2HDrWRhYCAow6kgcG9zc8OtdmVsLCBhcMOzcyBhIGNyaWHDp8OjbyBkbyBhcnF1aXZvLCBtdWRhciBvIGZvcm1hdG8gZGUgc2HDrWRhKS5cDQohW10oSW1hZ2Vucy9jcmlhcl9ybWFya2Rvd25zLnBuZylcDQoNCjxicj4NCjxicj4NCg0KQ29tIG8gYXJxdWl2byBjcmlhZG8sIHN1YSB0ZWxhIGFwYXJlY2Vyw6EgbWFpcyBvdSBtZW5vcyBkYSBzZWd1aW50ZSBmb3JtYS4gTsOjbyBzZSBhc3N1c3RlIGNvbSBlc3NlIHNjcmlwdCBnZXJhZG8gcGVsbyBwZWxvIHByw7NwcmlvIFJNYXJrZG93biwgb3Mgc2V1cyBlbGVtZW50b3Mgc2Vyw6NvIGV4cGxpY2Fkb3MgZW0gYnJldmUuXA0KIVtdKEltYWdlbnMvdGVsYV9hcG9zX2NyaWFjYW8ucG5nKVwNCg0KPGJyPg0KPGJyPg0KDQpWb2PDqiBwb2RlIGFwYWdhciB0dWRvIHF1ZSBlc3TDoSBhYmFpeG8gZG8gY2FiZcOnYWxobyBZQU1MLCBvIHF1YWwgw6kgZGVsaW1pdGFkbyBwb3IgdHLDqnMgdHJhw6dvcyBgLS0tYC4gT2JzZXJ2ZSwgdGFtYsOpbSwgcXVlIGFiYWl4byBkbyBhcnF1aXZvIGRvIFJNYXJrZG93biB0ZW0gdW1hIG91dHJhIGphbmVsYSBjaGFtYWRhIGNvbnNvbGUuIENvbSBlc3NhIGphbmVsYSDDqSBwb3Nzw612ZWwgdXRpbGl6YXIgY8OzZGlnb3MgZG8gUiBwYXJhIGZhemVyIGRpdmVyc2FzIGNvaXNhcywgaW5jbHVzaXZlIGJhaXhhciBwYWNvdGVzIG5lY2Vzc8OhcmlvcyBhbyBmdW5jaW9uYW1lbnRvIGRvIHJtYXJrZG93bi5cDQohW10oSW1hZ2Vucy9hbWJpZW50ZS5wbmcpXA0KDQpPYnNlcnZlIHF1ZSB2b2PDqiBjcmlvdSBvIHNldSBhcnF1aXZvIFJNYXJrZG93biBtYXMgbsOjbyBvIHNhbHZvdSBlbSBzZXUgZGlyZXTDs3JpbyBkZSB0cmFiYWxoby4gVm9jw6ogcG9kZSBhcGVydGFyIGBDdHJsYCArIGBTYCBwYXJhIHNhbHZhciBvdSBhcGVydGFyIGBDdHJsYCArIGBTaGlmdGAgKyBgS2AgcXVlLCBlbWJvcmEgc2lydmEgcGFyYSByZW5kZXJpemFyIG8gc2V1IGFycXVpdm8sIHRhbWLDqW0gbyBzYWx2YSBhdXRvbWF0aWNhbWVudGUuVm9jw6ogZGV2ZSBzZWxlY2lvbmFyIG8gc2V1IGRpcmV0w7NyaW8gZGUgdHJhYmFobywgYXF1ZWxlIGRlbnRybyBkbyBzdWJkaXJldMOzcmlvLCBwYXJhIHNhbHZhciBvIHNldSBhcnF1aXZvLlwNCg0KPGJyPg0KPGJyPg0KDQpBcMOzcyBlc3NlcyBwYXNzb3Mgdm9jw6ogcG9kZSBpbmljaWFyIGNvbSBvIHDDqSBkaXJlaXRvIG5hIHBhcnRlIGRhIFtzeW50YXhdKCNzeW50YXgpIGRvIFJNYXJrZG93bi4gQXByb3ZlaXRlIQ0KDQojIyMgU2VndW5kYSBmb3JtYSBkZSBjcmlhciBvIHNldSBhcnF1aXZvDQoNCkEgc2VndW5kYSBmb3JtYSBkZSBjcmlhciBzZXUgYXJxdWl2byBSTWFya2Rvd24gZmF6IHVtIFNjcmlwdCBlbSBicmFuY28sIHNlbSBhcXVlbGUgZ2VyYWRvIGF1dG9tYXRpY2FtZW50ZSBwZWxvIHByw7NwcmlvIFJNYXJrZG93bi4gRGVzc2EgZm9ybWEsIHZvY8OqIGNyaWEgdHVkbyBkbyB6ZXJvLCBpbmNsdXNpdmUgbyBjYWJlw6dhbGhvIFlBTUwuIFBhcmEgZmF6w6otbG8sIHbDoSBlbSBgTmV3IEJsYW5rIEZpbGVgID4gYFIgTWFya2Rvd24uLi5gIGUgZGlnaXRlIHVtIG5vbWUgcGFyYSBvIHNldSBhcnF1aXZvLlwNCiFbXShJbWFnZW5zL2FycXVpdm9fbWFya2Rvd24ucG5nKVwNCg0KPGJyPg0KPGJyPg0KDQpBbyBjcmlhciBzZXUgYXJxdWl2byB2b2PDqiBwb2RlcsOhIHbDqi1sbyBuYSBhYmEgYEZpbGVzYCBubyBjYW50byBpbmZlcmlvciBkaXJlaXRvLiBBbMOpbSBkaXNzbywgc2UgZm9yIHBlZGlkbyBhIGluc3RhbGHDp8OjbyBkZSBhbGd1bSBwYWNvdGUgcGFyYSBvIGNvcnJldG8gZnVuY2lvbmFtZW50byBkbyBSTWFya2Rvd24gZW50w6NvIGFwZXJ0ZSBlbSBgSW5zdGFsbGAuXA0KIVtdKEltYWdlbnMvaW5pY2lvX21hcmtkb3duLnBuZylcDQoNCg0KQXDDs3MgZXNzZXMgcGFzc29zIHZvY8OqIHBvZGUgaW5pY2lhciBjb20gbyBww6kgZGlyZWl0byBuYSBwYXJ0ZSBkYSBzaW50YXhlIGRvIFJNYXJrZG93bi4gQXByb3ZlaXRlIQ0KDQpbXjNdOiBPIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+ZGlyZXTDs3JpbyBkZSB0cmFiYWxobzwvc3Bhbj4gbm8gUiDDqSBvIGxvY2FsIG5vIHNpc3RlbWEgZGUgYXJxdWl2b3Mgb25kZSBvIFIgcHJvY3VyYSBwb3IgYXJxdWl2b3MgZSBvbmRlIGVsZSBzYWx2YSBub3ZvcyBhcnF1aXZvcyBwb3IgcGFkcsOjbywgYSBtZW5vcyBxdWUgdW0gY2FtaW5obyBzZWphIGVzcGVjaWZpY2Fkby4gUXVhbmRvIHZvY8OqIGluaWNpYSB1bWEgc2Vzc8OjbyBkbyBSLCBvIGRpcmV0w7NyaW8gZGUgdHJhYmFsaG8gcGFkcsOjbyDDqSBkZWZpbmlkbyBjb21vIG8gZGlyZXTDs3JpbyBlbSBxdWUgbyBSIGZvaSBpbmljaWFkby4gSXNzbyBzaWduaWZpY2EgcXVlIHF1YWxxdWVyIGFycXVpdm8gcXVlIHZvY8OqIGNhcnJlZ2Egb3Ugc2FsdmEgc2VtIGVzcGVjaWZpY2FyIHVtIGNhbWluaG8gc2Vyw6EgcmVsYXRpdm8gYSBlc3NlIGRpcmV0w7NyaW8uDQoNCg0KIyBSZW5kZXJpemHDp8OjbyBkbyBkb2N1bWVudG8gbm8gUk1hcmtkb3duDQpQYXJhIGNvbWXDp2FyLCBlc2NyZXZhIHF1YWxxdWVyIGNvaXNhIHF1ZSB2ZW5oYSBuYSBzdWEgbWVudGUgYWJhaXhvIGRvIGNhYmXDp2FsaG8gWUFNTC4gQXDDs3MgaXNzbyBhcGVydGUgYEN0cmxgK2BTaGlmdGArYGtgIG91IGNsaXF1ZSBubyBib3TDo28gYEtuaXRgIHBhcmEgcmVuZGVyaXphciBvIGRvY3VtZW50bywgaWd1YWwgbmEgc2VndWludGUgaW1hZ2VtLg0KIVtdKGh0dHBzOi8vaS5pbWd1ci5jb20veWtka2lKcC5wbmcgUmVuZGVucml6YcOnw6NvIGRvIFJNYXJrZG93bikNCjxicj4NCjxicj4NCg0KIyBDYWJlw6dhbGhvcw0KDQpQYXJhIGluc2VyaXIgc2XDp8O1ZXMgZGUgZGlmZXJlbnRlcyBuw612ZWlzLCB2dWxnbyBjYWJlw6dhbGhvcywgdm9jw6ogdmFpIHV0aWxpemFyIGEgc2VndWludGUgc2ludGF4ZVwNCg0KYGBgIE1hcmtkb3duDQojIENhYmXDp2FsaG8gMQ0KIyMgQ2FiZcOnYWxobyAyDQojIyMgQ2FiZcOnYWxobyAzDQojIyMjIENhYmXDp2FsaG8gNA0KIyMjIyMgQ2FiZcOnYWxobyA1DQojIyMjIyMgQ2FiZcOnYWxobyA2DQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KDQojIENhYmXDp2FsaG8gMSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KIyMgQ2FiZcOnYWxobyAyIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQojIyMgQ2FiZcOnYWxobyAzIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQojIyMjIENhYmXDp2FsaG8gNCB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KIyMjIyMgQ2FiZcOnYWxobyA1IHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQojIyMjIyMgQ2FiZcOnYWxobyA2IHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCjwvc3Bhbj4NCg0KT2JzZXJ2ZSBhIHJlbGHDp8OjbyBlbnRyZSBvcyBjYWJlw6dhbGhvczogb3MgZGUgbsOtdmVsIG1haXMgYWx0byBlc3TDo28gYW5pbmhhZG9zIGRlbnRybyBkb3MgZGUgbsOtdmVsIG1haXMgYmFpeG8sIGRlc2RlIHF1ZSBvcyBkZSBuw612ZWwgbWFpcyBhbHRvIHNlamFtIHBvc2ljaW9uYWRvcyBhcMOzcyBvcyBkZSBuw612ZWwgbWFpcyBiYWl4b3MuXA0KDQojIyBPcMOnw7VlcyBkZSBvdXRwdXQgcGFyYSBjYWJlw6dhbGhvIHsudGFic2V0IC51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KIyMjIFNlbSBudW1lcmHDp8OjbyBlIG7Do28gbGlzdGFkbyBubyDDrW5kaWNlIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCk8gUk1hcmtkb3duIHBlcm1pdGUgdXRpbGl6YXIgYWxndW1hcyBvcMOnw7VlcyBxdWUgbXVkYW0gbyBvdXRwdXQgZG8gY2FiZcOnYWxoby4gTm9zIGNhYmXDp2FsaG9zIGFudGVyaW9yZXMgdm9jw6ogZGV2ZSB0ZXIgcGVyY2ViaWRvIHF1ZSBuw6NvIGjDoSBudW1lcmHDp8OjbyBlIGVsZXMgdGFtYsOpbSBuw6NvIHPDo28gY29sb2NhZG9zIG5vIMOtbmRpY2UuIFBhcmEgcXVlIGlzc28gb2NvcnJhLCB1c2UgbyBzZWd1aW50ZSBjw7NkaWdvIGVtIHF1ZSBgLnVubGlzdGVkYCB0aXJhIG8gY2FiZcOnYWxobyBkbyDDrW5kaWNlIGUgYC51bm51bWJlcmVkYCB0aXJhIGEgbnVtZXJhw6fDo28uDQpgYGAgTWFya2Rvd24NCiMjIyMgQ2FiZcOnYWxobyBzZW0gbnVtZXJhw6fDo28gZSBuw6NvIGxpc3RhZG8gbm8gw61uZGljZSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KYGBgDQojIyMjIENhYmXDp2FsaG8gc2VtIG51bWVyYcOnw6NvIGUgbsOjbyBsaXN0YWRvIG5vIMOtbmRpY2Ugey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KIyMjIEFiYXMgaXRlcmF0aXZhcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KVGFtYsOpbSDDqSBwb3Nzw612ZWwgdHJhbmZvcm1hciBvcyBjYWJlw6dhbGhvcyBlbSBhYmFzIGl0ZXJhdGl2YXMgYSBwYXJ0aXIgZGEgb3DDp8Ojb2AudGFic2V0YC4gT3V0cmEgb3DDp8OjbyBjb21vIGAudGFic2V0LWZhZGVgIHBlcm1pdGUgZGVpeGFyIGEgdHJhbnNpw6fDo28gZW50cmUgYXMgYWJhcyBtYWlzIHN1YXZlLiBPIGV4ZW1wbG8gYSBzZWd1aXIgaWx1c3RyYSBlc3NlcyBjb21hbmRvcy4NCg0KYGBgDQojIyMjIFNlw6fDtWVzIGNvbSBBYmFzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCiMjIyMjIEFiYSAxIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpFc3RlIMOpIG8gY29udGXDumRvIGRhIEFiYSAxLg0KDQojIyMjIyBBYmEgMiB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KRXN0ZSDDqSBvIGNvbnRlw7pkbyBkYSBBYmEgMi4NCg0KIyMjIyMgQWJhIDMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCkVzdGUgw6kgbyBjb250ZcO6ZG8gZGEgQWJhIDMuDQpgYGANCg0KIyMjIyBTZcOnw7VlcyBjb20gQWJhcyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQojIyMjIyBBYmEgMSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KRXN0ZSDDqSBvIGNvbnRlw7pkbyBkYSBBYmEgMS4NCg0KIyMjIyMgQWJhIDIgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCkVzdGUgw6kgbyBjb250ZcO6ZG8gZGEgQWJhIDIuDQoNCiMjIyMjIEFiYSAzIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQpFc3RlIMOpIG8gY29udGXDumRvIGRhIEFiYSAzLg0KDQoNCiMgUXVlYnJhIGRlIGxpbmhhDQpQYXJhIGZhemVyIHF1ZWJyYSBkZSBsaW5oYSBiYXN0YSBjb2xvY2FyIGRvaXMgZXNwYcOnb3Mgbm8gZmluYWwgZGUgdW0gdGV4dG8gb3UgYWRpY2lvbmFyIHVtYSBiYXJyYSBpbnZlcnRpZGEsIGRlIGFjb3JkbyBjb20gbyBzZWd1aW50ZSBjw7NkaWdvLg0KYGBgIG1hcmtkb3duDQpBcXVpIHZhaSBzZXIgcmVhbGl6YWRvIHVtYSBxdWVicmEgZGUgbGluaGEgIA0KQXF1aSB0YW1iw6ltIHNlcsOhIGZlaXRvIHVtYSBxdWVicmEgZGUgbGluaGFcDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KQXF1aSB2YWkgc2VyIHJlYWxpemFkbyB1bWEgcXVlYnJhIGRlIGxpbmhhICANCkFxdWkgdGFtYsOpbSBzZXLDoSBmZWl0byB1bWEgcXVlYnJhIGRlIGxpbmhhXA0KPC9zcGFuPg0KDQpBbMOpbSBkaXNzbywgc2Ugdm9jw6ogcXVlciBhZGljaW9uYXIgbWFpcyBxdWVicmFzIGRlIGxpbmhhcywgbWFzIGVtIGxpbmhhcyBzZW0gbmVuaHVtYSBpbmZvcm1hw6fDo28sIMOpIHBvc3PDrXZlbCBmYXplciBvIHNlZ3VpbnRlIGPDs2RpZ28gaHRtbC4NCmBgYCBodG1sDQpBcXVpIHNlcsOhIHJlYWxpemFkbyAuLi5cDQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQouLi4gdsOhcmlhcyBxdWVicmFzIGRlIGxpbmhhXA0KYGBgDQo8c3BhbiBzdHlsZT0iY29sb3I6IGdyZXk7Ij4NCkFxdWkgc2Vyw6EgcmVhbGl6YWRvIC4uLlwNCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCjxicj4NCi4uLiB2w6FyaWFzIHF1ZWJyYXMgZGUgbGluaGFcDQo8L3NwYW4+DQoNCiMgQWxndW1hcyBvcMOnw7VlcyBkZSBmb3JtYXRhw6fDo28gZGUgdGV4dG8NCg0KfEPDs2RpZ298U2HDrWRhfA0KfDotLS06fDotLS06fA0KfFwqaXTDoWxpY29cKnwqaXTDoWxpY28qfA0KfFxfaXTDoWxpY29cX3xfaXTDoWxpY29ffA0KfFwqZW1cKmFwZW5hc1wqYWxndW1hc1wqbGV0cmFzfCplbSphcGVuYXMqYWxndW1hcypsZXRyYXN8DQp8XCpcKm5lZ3JpdG9cKlwqfCoqbmVncml0byoqfA0KfFxfXF9uZWdyaXRvXF9cX3xfX25lZ3JpdG9fX3wNCnxcKlwqZW1cKlwqYXBlbmFzXCpcKmFsZ3VtYXNcKlwqbGV0cmFzfCoqZW0qKmFwZW5hcyoqYWxndW1hcyoqbGV0cmFzfA0KfHNvYnJlc2NyaXRvXF4yXF58c29icmVzY3JpdG9eMl58DQp8c3Vic2NyaXRvXH4yXH58c3Vic2NyaXRvfjJ+fA0KfFx+XH5zdWJsaW5oYWRvXH5cfnx+fnN1YmxpbmhhZG9+fnwNCg0KIyBDb21vIGRlaXhhciBvIGPDs2RpZ28gZGUgZm9ybWEgbGl0ZXJhbCB7LnRhYnNldCAudGFic2V0LWZhZGV9DQojIyBQYXJhIHVtIGNhcmFjdGVyZQ0KUGFyYSBmYXplciBpc3NvIGVtIHVtIGNhcmFjdGVyZSBiYXN0YSB1c2FyIGEgYmFycmEgaW52ZXJ0aWRhIChcXCksIHZlamEgc8OzOg0KYGBgIG1hcmtkb3duDQoqKm5lZ3JpdG8qKlwNClwqXCpuZWdyaXRvXCpcKg0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KKipuZWdyaXRvKipcDQpcKlwqbmVncml0b1wqXCpcDQo8L3NwYW4+DQoNCiMjIFBhcmEgdsOhcmlhcyBwYWxhdnJhcyBlbSB1bWEgbGluaGENClBhcmEgdsOhcmlhcyBwYWxhdnJhcyB2b2PDqiB1dGlsaXphIGNyYXNlczoNCmBgYCBNYXJrZG93bg0KYEPDs2RpZ28gZGUgZm9ybWEgbGl0ZXJhbGANCg0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KYEPDs2RpZ28gZGUgZm9ybWEgbGl0ZXJhbGANCjwvc3Bhbj4NCg0KIyMgUGFyYSB2w6FyaWFzIGxpbmhhczoNClBhcmEgdXRpbGl6YXIgY8OzZGlnbyBsaXRlcmFsIGVtIHbDoXJpYXMgbGluaGFzIHZvY8OqIHBvZGUgdXNhciB0csOqcyBjcmFzZXMganVudGFzIGBgYGBgYCBgYGAgYGBgYGBgOg0KDQpgYGBgYGBgYGBtYXJrZG93bg0KYGBgDQpWw6FyaWFzDQpsaW5oYXMNCmRlDQpjw7NkaWdvDQpsaXRlcmFsDQpgYGANCmBgYGBgYGBgYA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6IGdyZXk7Ij4NCmBgYA0KVsOhcmlhcw0KbGluaGFzDQpkZQ0KY8OzZGlnbw0KbGl0ZXJhbA0KYGBgDQo8L3NwYW4+DQoNCiMgQmxvY28gZGUgY2l0YcOnw6NvDQpQYXJhIGFkaWNpb25hciB1bSBibG9jbyBkZSBjaXRhw6fDo28gdm9jw6ogdXRpbGl6YXLDoSBhIHNlZ3VpbnRlIHN5bnRheDoNCmBgYE1hcmtkb3duDQo+IEFxdWkgdm9jw6ogZmFyw6Egc3VhIGNpdGHDp8Ojbw0KPiBWZWphIHF1ZSBhIHF1ZWJyYSBkZSBsaW5oYSBuw6NvIMOpIGF1dG9tw6F0aWNhDQpgYGANCj4gQXF1aSB2b2PDqiBmYXLDoSBzdWEgY2l0YcOnw6NvDQo+IFZlamEgcXVlIGEgcXVlYnJhIGRlIGxpbmhhIG7Do28gw6kgYXV0b23DoXRpY2ENCg0KIyBUcmHDp28sIHRyYXZlc3PDo28gZSByZXRhIGRlIHNlcGFyYcOnw6NvDQpQYXJhIGFkaWNpb25hciB1bSB0cmHDp28gZSB1bSB0cmF2ZXNzw6NvIGZhw6dhIG8gc2VndWludGU6DQoNCnxDw7NkaWdvfFNhw61kYXwNCnw6LS0tOnw6LS0tOnwNCnxUcmHDp286IFwtXC18VHJhw6dvOiAtLXwNCnxUcmF2ZXNzw6NvOiBcLVwtXC18VHJhdmVzc8OjbzogLS0tfA0KDQpQYXJhIGFkaWNpb25hciB1bWEgcmV0YSBob3Jpem9udGFsIGRlIHNlcGFyYcOnw6NvIHZvY8OqIHBvZGUgdXRpaXphciBkdWFzIGZvcm1hcywgdmVqYTpcDQoNClRyw6pzIGVzdHJlbGFzIG91IG1haXM6DQoNCmAqKipgXA0KDQoqKioNCg0KVHLDqnMgdHJhw6dvcyBvdSBtYWlzOg0KDQpgLS0tYA0KDQotLS0NCg0KIyBMaXN0YXMgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KIyMgTGlzdGEgbsOjbyBvcmRlbmFkYQ0KSMOhIHRyw6pzIGZvcm1hcyBkZSBmYXplciB1bWEgbGlzdGEgbsOjbyBvcmRlbmFkYS4gT2JzZXJ2ZSBlIHByYXRpcXVlOg0KPGJyPg0KDQoqKlByaW1laXJhIGZvcm1hKioNCmBgYCBtYXJrZG93bg0KLSBMaXN0YSBuw6NvIG9yZGVuYWRhDQogIC0gSXRlbQ0KICAgIC0gSXRlbQ0KICAgICAgLSBJdGVtDQpgYGANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiBncmV5OyI+DQoNCi0gTGlzdGEgbsOjbyBvcmRlbmFkYQ0KICAtIEl0ZW0NCiAgICAtIEl0ZW0NCiAgICAgIC0gSXRlbQ0KDQo8L3NwYW4+DQoNCjxicj4NCg0KKipTZWd1bmRhIGZvcm1hKioNCmBgYCBtYXJrZG93bg0KKyBMaXN0YSBuw6NvIG9yZGVuYWRhDQogICsgSXRlbQ0KICAgICsgSXRlbQ0KICAgICAgKyBJdGVtDQpgYGANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiBncmV5OyI+DQoNCisgTGlzdGEgbsOjbyBvcmRlbmFkYQ0KICArIEl0ZW0NCiAgICArIEl0ZW0NCiAgICAgICsgSXRlbQ0KDQo8L3NwYW4+DQoNCjxicj4NCg0KKipUZXJjZWlyYSBmb3JtYSoqDQpgYGAgbWFya2Rvd24NCiogTGlzdGEgbsOjbyBvcmRlbmFkYQ0KICAqIEl0ZW0NCiAgICAqIEl0ZW0NCiAgICAgICogSXRlbQ0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KDQoqIExpc3RhIG7Do28gb3JkZW5hZGENCiAgKiBJdGVtDQogICAgKiBJdGVtDQogICAgICAqIEl0ZW0NCg0KPC9zcGFuPg0KICAgICAgDQojIyBMaXN0YSBPcmRlbmFkYQ0KVm9jw6ogcG9kZSBmYXplciBsaXN0YXMgb3JkZW5hZGFzIGRhIHNlZ3VpbnRlIGZvcm1hLg0KDQpgYGAgTWFya2Rvd24NCjEuIExpc3RhIG9yZGVuYWRhDQogICAgMS4gSXRlbQ0KICAgIDEuIEl0ZW0NCjIuIExpc3RhIG9yZGVuYWRhDQogICAgMS4gSXRlbQ0KICAgICAgICAxLiBJdGVtDQoyLiBMaXN0YSBvcmRlbmFkYQ0KICAgIC0gSXRlbQ0KICAgICAgKiBJdGVtDQotIExpc3RhIG7Do28gb3JkZW5hZGENCiAgICArIEl0ZW0NCjMuIE9yZGVuw6fDo28gYXV0b23DoXRpY2Egc2VtIGZ1bmNpb25hbWVudG8NCg0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KDQoxLiBMaXN0YSBvcmRlbmFkYQ0KICAgIDEuIEl0ZW0NCiAgICAxLiBJdGVtDQoyLiBMaXN0YSBvcmRlbmFkYQ0KICAgIDEuIEl0ZW0NCiAgICAgICAgMS4gSXRlbQ0KMi4gTGlzdGEgb3JkZW5hZGENCiAgICAtIEl0ZW0NCiAgICAgICogSXRlbQ0KLSBMaXN0YSBuw6NvIG9yZGVuYWRhDQogICAgKyBJdGVtDQozLiBPcmRlbsOnw6NvIGF1dG9tw6F0aWNhIHNlbSBmdW5jaW9uYW1lbnRvDQoNCjwvc3Bhbj4NCg0KIyMgTGlzdGEgY29tIG9ww6fDtWVzIGRlIG1hcmNhw6fDo28NClZvY8OqIHBvZGUgZmF6ZXIgbGlzdGFzIGNvbSBvcMOnw6NvIGRlIG1hcmNhciBqdW50byBhbyBxdWUgZm9pIG1vc3RyYWRvIGRlIGxpc3RhcyBuw6NvIG9yZGVuYWRhcyBlIG9yZGVuYWRhcywgb2xoZSBzw7M6DQoNCmBgYCBNYXJrZG93bg0KLSBbeF0gUHJpbWVpcmEgb3DDp8Ojbw0KICAqIFsgXSBJdGVtDQogICsgW3hdIEl0ZW0NCiAgICAxLiBbIF0gSXRlbQ0KICAgIDIuIFsgXSBJdGVtDQogICAgLSBbIF0gSXRlbQ0KICAgICogWyBdIEl0ZW0NCiAgICArIFsgXSBJdGVtDQoNCi0gWyBdIFNlZ3VuZGEgb3DDp8Ojbw0KICAqIFt4XSBJdGVtDQogICAgKyBbIF0gSXRlbQ0KICAgICAgMS4gWyBdIEl0ZW0NCiAgICAgIDEuIFsgXSBJdGVtDQogICAgICAxLiBbIF0gSXRlbQ0KICAgIA0KLSBbeF0gVGVyY2VpcmEgb3DDp8Ojbw0KYGBgDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KDQotIFt4XSBQcmltZWlyYSBvcMOnw6NvDQogICogWyBdIEl0ZW0NCiAgKyBbeF0gSXRlbQ0KICAgIDEuIFsgXSBJdGVtDQogICAgMi4gWyBdIEl0ZW0NCiAgICAtIFsgXSBJdGVtDQogICAgKiBbIF0gSXRlbQ0KICAgICsgWyBdIEl0ZW0NCg0KLSBbIF0gU2VndW5kYSBvcMOnw6NvDQogICogW3hdIEl0ZW0NCiAgICArIFsgXSBJdGVtDQogICAgICAxLiBbIF0gSXRlbQ0KICAgICAgMS4gWyBdIEl0ZW0NCiAgICAgIDEuIFsgXSBJdGVtDQogICAgDQotIFt4XSBUZXJjZWlyYSBvcMOnw6NvDQoNCjwvc3Bhbj4NCg0KDQojIExpbmtzDQpIw6EgdHLDqnMgbWFuZWlyYXMgZGUgYWRpY2lvbmFyIGxpbmtzIGNsaWPDoXZlaXMgbm8gUk1hcmtkb3duLCBhbWJhcyBpbnRlcmVzc2FudGVzIHBhcmEgZGlmZXJlbnRlcyBjYXNvcy4gDQoNCjxicj4NCg0KKiBQYXJhIGZhemVyIGEgcHJpbWVpcmEgbWFuZWlyYSByZWFsaXplIG8gc2VndWludGUgY8OzZGlnby5cDQoNCmBgYCBtYXJrZG93bg0KUHJpbWVpcm8gZXN0aWxvIGRlIGxpbms6IDxodHRwczovL2xpbmt0ci5lZS9wZXRfZXN0YXRpc3RpY2F1ZmM+DQpgYGANClByaW1laXJvIGVzdGlsbyBkZSBsaW5rOiA8aHR0cHM6Ly9saW5rdHIuZWUvcGV0X2VzdGF0aXN0aWNhdWZjPlwNCg0KPGJyPg0KDQoqIEEgc2VndW5kYSBtYW5laXJhIGRlaXhhIG8gbGluayB2aXN1YWxtZW50ZSBtYWlzIGJvbml0bywgb2JzZXJ2ZTpcDQoNCmBgYCBtYXJrZG93bg0KU2VndW5kbyBlc3RpbG8gZGUgbGluazogW1BFVCBFc3RhdMOtc3RpY2EgVUZDXShodHRwczovL2xpbmt0ci5lZS9wZXRfZXN0YXRpc3RpY2F1ZmMgIlBFVCBFc3RhdMOtc3RpY2EiKQ0KYGBgDQoNClNlZ3VuZG8gZXN0aWxvIGRlIGxpbms6IFtQRVQgRXN0YXTDrXN0aWNhIFVGQ10oaHR0cHM6Ly9saW5rdHIuZWUvcGV0X2VzdGF0aXN0aWNhdWZjICJQRVQgRXN0YXTDrXN0aWNhIilcDQoNCjxicj4NCg0KKiBBIHRlcmNlaXJhIG1hbmVpcmEgw6kgaW50ZXJlc3NhbnRlIHBhcmEgYWRpY2lvbmFyIG8gbWVzbW8gbGluayB2w6FyaWFzIHZlemVzIGVtIGRpZmVyZW50ZXMgcGFsYXZyYXMsIHZlamE6XA0KDQpgYGAgbWFya2Rvd24NClRlcmNlaXJvIGVzdGlsbyBkZSBsaW5rOiBbUEVUIEVzdGF0w61zdGljYSBVRkNdW0xpbmstMV1cDQpPIE1lc21vIGxpbmsgY29tIG91dHJvIG5vbWU6IFtQcm9ncmFtYSBkZSBFZHVjYcOnw6NvIFR1dG9yaWFsIGRhIEVzdGF0w61zdGljYV1bTGluay0xXQ0KDQpbTGluay0xXTpodHRwczovL2xpbmt0ci5lZS9wZXRfZXN0YXRpc3RpY2F1ZmMgJ1BFVCBFc3RhdMOtc3RpY2EnDQpgYGANCg0KVGVyY2Vpcm8gZXN0aWxvIGRlIGxpbms6IFtQRVQgRXN0YXTDrXN0aWNhIFVGQ11bTGluay0xXVwNCk8gTWVzbW8gbGluayBjb20gb3V0cm8gbm9tZTogW1Byb2dyYW1hIGRlIEVkdWNhw6fDo28gVHV0b3JpYWwgZGEgRXN0YXTDrXN0aWNhXVtMaW5rLTFdDQoNCltMaW5rLTFdOmh0dHBzOi8vbGlua3RyLmVlL3BldF9lc3RhdGlzdGljYXVmYyAnUEVUIEVzdGF0w61zdGljYScNCg0KIyBJbWFnZW5zDQpQYXJlY2lkbyBjb20gb3MgbGlua3MsIGFzIGltYWdlbnMgcG9kZW0gc2VyIGFkaWNpb25hZGFzIGRlIHRyw6pzIGZvcm1hcy5cDQoNCjxicj4NCg0KKiBBIHByaW1laXJhIGZvcm1hIMOpIGEgc2VndWludGU6DQoNCmBgYCBtYXJrZG93bg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KIVtVbml2ZXJzaWRhZGUgRmVkZXJhbCBkbyBDZWFyw6FdKGh0dHBzOi8vZW5jcnlwdGVkLXRibjAuZ3N0YXRpYy5jb20vaW1hZ2VzP3E9dGJuOkFOZDlHY1R5YmxaUUFWVTRya1R1RXgtOHdvY29NN1h4TzJhMzFOc3UzTDVZM0d1ajB3JnMgJ0xvZ28gVUZDJyl7IHdpZHRoPTIwJSB9DQo8L2Rpdj4NCmBgYA0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KIVtVbml2ZXJzaWRhZGUgRmVkZXJhbCBkbyBDZWFyw6FdKGh0dHBzOi8vZW5jcnlwdGVkLXRibjAuZ3N0YXRpYy5jb20vaW1hZ2VzP3E9dGJuOkFOZDlHY1R5YmxaUUFWVTRya1R1RXgtOHdvY29NN1h4TzJhMzFOc3UzTDVZM0d1ajB3JnMgJ0xvZ28gVUZDJyl7IHdpZHRoPTIwJSB9DQo8L2Rpdj4NCg0KT2JzZXJ2ZSBxdWUgZXNzZXMgY8OzZGlnb3MgY29tIGA8ZGl2IGFsZ3VtYS1jb2lzYT5gIHPDo28gYWRpY2lvbmFpcyBkbyBodG1sIHF1ZSB2b2PDqiBwb2RlIGVzdMOhIHV0aWxpemFuZG8uIEVudMOjbyBuw6NvIHNlIHByZW9jdXBlIHNlIG7Do28gZW50ZW5kw6otbG9zIHBvcnF1ZSBwYXJhIGVudGVuZGVyIG1hcmtkb3duIGJhc3RhIGZvY2FyIG5hcyBvdXRyYXMgcGFydGVzLg0KDQo8YnI+DQoNCiogQSBzZWd1bmRhIG1hbmVpcmEsIG1lbGhvciBwYXJhIGFkaWNpb25hciBhIG1lc21hIGltYWdlbSB2w6FyaWFzIHZlemVzIG91IHBhcmEgdGVyIHVtYSBtYWlvciBvcmdhbml6YcOnw6NvLCDDqSBhIHNlZ3VpbnRlOg0KDQpgYGAgbWFya2Rvd24NCiFbVW5pdmVyc2lkYWRlIEZlZGVyYWwgZG8gQ2VhcsOhXVtsaW5rLTJdDQoNCiFbTG9nbyBkYSBVRkNdW2xpbmstMl0NCg0KW2xpbmstMl06aHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjVHlibFpRQVZVNHJrVHVFeC04d29jb003WHhPMmEzMU5zdTNMNVkzR3VqMHcmcyAnTG9nbyBVRkMnDQpgYGANCg0KIVtVbml2ZXJzaWRhZGUgRmVkZXJhbCBkbyBDZWFyw6FdW2xpbmstMl0NCg0KIVtMb2dvIGRhIFVGQ11bbGluay0yXQ0KDQpbbGluay0yXTpodHRwczovL2VuY3J5cHRlZC10Ym4wLmdzdGF0aWMuY29tL2ltYWdlcz9xPXRibjpBTmQ5R2NUeWJsWlFBVlU0cmtUdUV4LTh3b2NvTTdYeE8yYTMxTnN1M0w1WTNHdWowdyZzICdMb2dvIFVGQycNCg0KIyBOb3RhcyBkZSBSb2RhcMOpDQpVdGlsaXplIGEgc2VndWludGUgc3ludGF4IHBhcmEgYWRpY2lvbmFyIHVtYSBub3RhIGRlIHJvZGFww6k6XA0KYGBgU1FMDQpJc3NvIMOpIHVtYSBub3RhIGRlIHJvZGFww6k6IFteZGVmXQ0KDQpbXmRlZl06IGRlZmluacOnw6NvDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KSXNzbyDDqSB1bWEgbm90YSBkZSByb2RhcMOpOiBbXmRlZl0NCjwvc3Bhbj4NCg0KDQpbXmRlZl06IGRlZmluacOnw6NvICANCg0KTm90ZSBxdWUgbsOjbyDDqSBuZWNlc3PDoXJpbyBmYXplciBhIG51bWVyYcOnw6NvIGRhcyBub3RhcyBkZSByb2RhcMOpIHBvcnF1ZSBlbGFzIHPDo28gbnVtZXJhZGFzIGF1dG9tYXRpY2FtZW50ZS4gQWzDqW0gZGlzc28sIGEgbm90YSBkZSByb2RhcMOpIMOpIGNsaWPDoXZlbCwgbGV2YW5kbyBvIHVzdcOhcmlvIGFvIGZpbmFsIGRvIGRvY3VtZW50bywgb25kZSBzZSBlbmNvbnRyYW0gdG9kYXMgbm90YXMgZGUgcm9kYXDDqS5cDQoNCiMgQmlibGlvZ3LDoWZpYSB7LnRhYnNldCAudGFic2V0LWZhZGV9DQojIyBBcnF1aXZvIC5iaWINClBhcmEgY3JpYXIgdW0gPHNwYW4gc3R5bGU9ImNvbG9yOiB2aW9sZXQ7Ij5hcnF1aXZvIC5iaWI8L3NwYW4+W15iaWJdIHZvY8OqIGRldmUgYWJyaXIgdW0gYXJxdWl2byBkZSB0ZXh0by4gUGFyYSBwcmVlbmNow6otbG8gdm9jw6ogaXLDoSB1dGlsaXphciBvcyBkYWRvcyBiaWJsaW9ncsOhZmljb3Mgbm8gZm9ybWF0byBCaWJUZVguIMOJIHBvc3PDrXZlbCBwZWdhciBlc3NlcyBkYWRvcyBqw6EgZmVpdG9zIG5vIFtHb29nbGUgQWNhZMOqbWljb10oaHR0cHM6Ly9zY2hvbGFyLmdvb2dsZS5jb20uYnIvP2hsPXB0KS5cDQoNClBvciBleGVtcGxvLCBkaWdhbW9zIHF1ZSB2b2PDqiBxdWVyIGNpdGFyIG8gbGl2cm8gRXN0YXTDrXN0aWNhIELDoXNpY2EuIEJhc3RhIHZvY8OqIHBlc3F1aXNhciBvIG5vbWUgZG8gbGl2cm8gZSBpciBuYSBvcMOnw6NvIGBDaXRhcmAuXA0KIVtdKEltYWdlbnMvZ29vZ2xlX2FjYWRlbWljby5wbmcpXA0KDQo8YnI+DQo8YnI+DQoNCkFww7NzIGlzc28sIGJhc3RhIGVzY29saGVyIGEgb3DDp8OjbyBCaWJUZVguXA0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPg0KIVtdKEltYWdlbnMvZ29vZ2xlX2FjYWRlbWljbzIucG5nKVwNCjwvZGl2Pg0KDQo8YnI+DQo8YnI+DQoNCkRlcG9pcywgw6kgc8OzIGNvcGlhciBlIGNvbGFyIG5vIHNldSBhcnF1aXZvIGRlIHRleHRvLiBWb2PDqiBwb2RlIGlyIGFkaWNpb25hbmRvIGVzc2FzIHJlZmVyw6puY2lhcyBhIHF1YWxxdWVyIG1vbWVudG8gbm8gc2V1IGFycXVpdm8gZGUgdGV4dG8sIGVudMOjbyBqw6Egw6kgcG9zc8OtdmVsIHNhbHbDoS1sbyBkZW50cm8gZG8gc2V1IGRpcmV0w7NyaW8uIExlbWJyZSBkZSBzYWx2YXIgbyBzZXUgYXJxdWl2byBjb20gbyAiLmJpYiIgbm8gZmluYWwgYW8gaW52w6lzIGRlICIudHh0Ii5cDQohW10oSW1hZ2Vucy9iaWIucG5nKVwNCg0KQ29tIGlzc28sIG5vIHByw7N4aW1vIHTDs3BpY28gdm9jw6ogaXLDoSBhcHJlbmRlciBhIGNvbW8gY29sb2NhciBvIHNldSBhcnF1dm8gLmJpYiBlbSBmdW5jaW9uYW1lbnRvIGRlbnRybyBkbyBSTWFya2Rvd24uXA0KDQpbXmJpYl06IFVtIDxzcGFuIHN0eWxlPSJjb2xvcjogdmlvbGV0OyI+YXJxdWl2byAuYmliPC9zcGFuPiDDqSB1bSBhcnF1aXZvIGRlIGJhbmNvIGRlIGRhZG9zIGJpYmxpb2dyw6FmaWNvIHVzYWRvIGNvbXVtZW50ZSBjb20gbyBzb2Z0d2FyZSBkZSBnZXJlbmNpYW1lbnRvIGRlIHJlZmVyw6puY2lhcyBiaWJsaW9ncsOhZmljYXMsIGNvbW8gQmliVGVYLiBFc3NlIHRpcG8gZGUgYXJxdWl2byDDqSBmcmVxdWVudGVtZW50ZSB1dGlsaXphZG8gZW0gdHJhYmFsaG9zIGFjYWTDqm1pY29zLCBjb21vIHRlc2VzLCBkaXNzZXJ0YcOnw7VlcywgYXJ0aWdvcyBkZSByZXZpc3RhcyBlIG91dHJvcyBkb2N1bWVudG9zIHF1ZSByZXF1ZXJlbSBjaXRhw6fDtWVzIGUgcmVmZXLDqm5jaWFzIGJpYmxpb2dyw6FmaWNhcy4gTyBmb3JtYXRvIC5iaWIgZ2VyYWxtZW50ZSBjb250w6ltIGluZm9ybWHDp8O1ZXMgYmlibGlvZ3LDoWZpY2FzIHNvYnJlIG9icmFzLCBjb21vIGxpdnJvcywgYXJ0aWdvcyBkZSBwZXJpw7NkaWNvcywgY29uZmVyw6puY2lhcywgZW50cmUgb3V0cm9zLiBFc3NhcyBpbmZvcm1hw6fDtWVzIGluY2x1ZW0gZGV0YWxoZXMgY29tbyBhdXRvcihlcyksIHTDrXR1bG8sIGFubyBkZSBwdWJsaWNhw6fDo28sIGVkaXRvcmEsIG7Dum1lcm8gZGUgcMOhZ2luYXMsIElTU04gb3UgSVNCTiwgZSBvdXRyYXMgaW5mb3JtYcOnw7VlcyByZWxldmFudGVzLg0KDQojIyBBIG9ww6fDo28gZGUgYmlibGlvZ3JhZmlhIG5vIFlBTUwgSEVBREVSIHsjYmlifQ0KUGFyYSBjb2xvY2FyIHNldSBhcnF1aXZvIC5iaWIgZW0gZnVuY2lvbmFtZW50byBiYXN0YSBhZGljaW9uYXIgYGJpYmxpb2dyYXBoeTogTm9tZS5iaWJgIGVtIHNldSBjYWJlw6dhbGhvIFlBTUwuIFZlamEgbyBzZWd1aW50ZSBleGVtcGxvIGNvbSBvIGFycXVpdm8gY3JpYWRvIG5hIHNlw6fDo28gYW50ZXJpb3I6XA0KYGBgTWFya2Rvd24NCi0tLQ0KdGl0bGU6ICJOb3ZvX0FycXVpdm8iDQphdXRob3I6ICJKb25hcyINCmRhdGU6ICIyMDI0LTAyLTA4Ig0KYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFmaWEuYmliDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQpgYGANCk9ic2VydmUgcXVlIGFwZW5hcyBjb2xvY2FyIGVzc2Egb3DDp8OjbyBubyBjYWJlw6dhbGhvIFlBTUwgbsOjbyB2YWkgYWRpY2lvbmFyIHN1YXMgY2l0YcOnw7VlcyBvdSByZWZlcsOqbmNpYXMgYW8gYXJxdWl2by4gQWzDqW0gZGlzc28sIMOpIGltcG9ydGFudGUgb2JzZXJ2YXIgc2UgbyBhcnF1aXZvIC5iaWIgZXN0w6Egbm8gc2V1IGRpcmV0w7NyaW8gZGUgdHJhYmFsaG8gcGFyYSBuw6NvIGhhdmVyIGVycm9zLg0KDQojIyBDaXRhw6fDtWVzDQpQYXJhIGZhemVyIHVtYSBjaXRhw6fDo28gdm9jw6ogdmFpIHV0aWl6YXIgbyBgQGAuIFBvciBleGVtcGxvLCBwYXJhIGNpdGFyIG8gbGl2cm8gRXN0YXTDrXN0aWNhIELDoXNpY2EsIG8gcXVhbCBqw6EgZXN0w6Egbm8gYXJxdWl2byAuYmliIGNyaWFkbyBhbnRlcmlvcm1lbnRlLCB2b2PDqiB2YWkgcGVnYXIgYSBwcmltZWlyYSBpbmZvcm1hw6fDo28gbmEgY2l0YcOnw6NvIEJpYlRlWCBlIGNvbG9jw6EtbGEgYXDDs3MgbyBgQGAuXA0KIVtdKEltYWdlbnMvY2l0YWNhby5wbmcpXA0KPGJyPg0KPGJyPg0KQXDDs3MgcmVuZGVyaXphciBvIHNldSBhcnF1aXZvIHZvY8OqIHZlcsOhIHF1ZSBhbMOpbSBkYSBjaXRhw6fDo28gZm9pIGNvbG9jYWRvIGF1dG9tYXRpY2FtZW50ZSBubyBmaW5hbCBkbyBvdXRwdXQgYSByZWZlcsOqbmNpYSBkYSBjaXRhw6fDo28uXA0KIVtdKEltYWdlbnMvb3V0cHV0X2NpdGFjYW8yLnBuZylcDQo8YnI+DQo8YnI+DQpTZSB2b2PDqiBxdWlzZXIgdW1hIGNpdGHDp8OjbyBlbnRyZSBwYXLDqm50ZXNlcyBiYXN0YSBjb2xvY2FyIGNvbGNoZXRlcyBubyBjw7NkaWdvIGFudGVyaW9yLlwNCiFbXShJbWFnZW5zL2NpdGFjYW8yLnBuZylcDQo8YnI+DQo8YnI+DQpDYXNvIHZvY8OqIHF1ZWlyYSBxdWUgYXBlbmFzIG8gYW5vIGFwYXJlw6dhIG5hIGNpdGHDp8Ojbywgdm9jw6ogcG9kZSB1dGlsaXphciBhIHN5bnRheCBhbnRlcmlvciBjb20gdW0gYC1gIG5hIGZyZW50ZSBkbyBgQGAuXA0KIVtdKEltYWdlbnMvY2l0YWNhbzMucG5nKVwNCg0KIyMjIENpdGHDp8OjbyBjbGljw6F2ZWwNClBhcmEgcXVlIHNlamEgcG9zc8OtdmVsIGNsaWNhciBuYSBjaXRhw6fDo28gZSBpciBkaXJldG8gcGFyYSBhcyByZWZlcsOqbmNpYXMgw6kgcG9zc8OtdmVsIGNvbG9jYXIgYSBvcMOnw6NvIGBsaW5rLWNpdGF0aW9uczogVFJVRWAgbm8gY2FiZcOnYWxobyBZQU1MLlwNCiFbXShJbWFnZW5zL2xpbmstY2l0YXRpb24ucG5nKVwNCg0KIyMjIE11ZGFuw6dhIGRlIGlkaW9tYQ0KQWzDqW0gZGlzc28sIHZvY8OqIGRldmUgdGVyIHBlcmNlYmlkbyBxdWUgYXMgY2l0YcOnw7VlcyBlc3TDo28gZW0gb3V0cmEgbMOtbmd1YS4gQWRpY2lvbmUgYSBvcMOnw6NvIGBsYW5nOiBwdC1icmAgbm8gY2FiZcOnYWxobyBZQU1MIHBhcmEgcXVlIGZpcXVlIG5vIGlkaW9tYSBkbyBCcmFzaWwsIHNlbWVsaGFudGUgYW8gc2VndWludGUgZXhlbXBsby5cDQpgYGBNYXJrZG93bg0KLS0tDQp0aXRsZTogIk5vdm9fQXJxdWl2byINCmF1dGhvcjogIkpvbmFzIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnKiVkIGRlICVCLCAgJVkqJylgIg0KYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFmaWEuYmliDQpsaW5rLWNpdGF0aW9uczogVFJVRQ0KbGFuZzogcHQtYnINCm91dHB1dDogaHRtbF9kb2N1bWVudA0KLS0tDQoNCmBgYA0KDQojIyMgUmVmZXLDqm5jaWEgc2VtIGNpdGHDp8Ojbw0KDQpTZSBjYXNvIHZvY8OqIHF1aXNlciBmYXplciBhcGVuYXMgYSByZWZlcsOqbmNpYSBzZW0gcHJlY2lzYXIgZmF6ZXIgYSBjaXRhw6fDo28gYW8gbG9uZ28gZG8gc2V1IGRvY3VtZW50bywgZW50w6NvIGNvbG9xdWUgYSBvcMOnw6NvIGBub3RpY2VgLlwNCg0KIVtdKEltYWdlbnMvYXBlbmFzX3JlZi5wbmcpXA0KDQpTZSBmb3JlbSB2w6FyaWFzIHJlZmVyw6puY2lhcywgZW50w6NvIHZvY8OqIHBvZGUgZmF6ZXIgYSBzZXBhcmHDp8OjbyBjb20gdsOtcmd1bGFzLlwNCiFbXShJbWFnZW5zL2FwZW5hc19yZWYyLnBuZylcDQoNCg0KIyBFcXVhw6fDtWVzIG1hdGVtw6F0aWNhcyB7LnRhYnNldCAudGFic2V0LWZhZGV9DQpWb2PDqiBwb2RlIGluc2VyaXIgZXF1YcOnw7VlcyBtYXRlbcOhdGljYXMgbm8gUk1hcmtkb3duIGRhIG1lc21hIG1hbmVpcmEgcXVlIG8gZmFyaWEgbm8gTGFUZVguIFNlIHZvY8OqIG7Do28gZXN0w6EgZmFtaWxpYXJpemFkbyBjb20gZXNzZSBmb3JtYXRvLCByZWNvbWVuZGFtb3MgYWNlc3NhciBvIFtzaXRlIGRvIE92ZXJsZWFmXShodHRwczovL3d3dy5vdmVybGVhZi5jb20vbGVhcm4vbGF0ZXgvTWF0aGVtYXRpY2FsX2V4cHJlc3Npb25zICJNYXRoZW1hdGljYWwgZXhwcmVzc2lvbnMiKSBwYXJhIG9idGVyIG1haXMgZGV0YWxoZXMuIEFiYWl4byBlc3TDo28gZG9pcyBleGVtcGxvcyBxdWUgZGVtb25zdHJhbSBjb21vIGFkaWNpb25hciBlcXVhw6fDtWVzIG1hdGVtw6F0aWNhcyBlbSBzZXUgZG9jdW1lbnRvLg0KDQojIyBFcXVhw6fDo28gZW0gbGluaGENCkVzc2EgZm9ybWEgcGVybWl0ZSBjb2xvY2FyIHVtYSBlcXVhw6fDo28gbWF0ZW3DoXRpY2EgbmEgbWVzbWEgbGluaGEgcXVlIG8gc2V1IHRleHRvLiBWb2PDqiBwb2RlIGZhemVyIGlzc28gdXRpbGl6YW5kbyBhIHNlZ3VpbnRlIHN5bnRheC4NCmBgYExhdGV4DQokU3VhRXF1YcOnw6NvJA0KYGBgDQoNClBvciBleGVtcGxvLCBlc3RhIMOpIGEgZsOzcm11bGEgZG8gZGVzdmlvIHBhZHLDo286DQpgYGBMYXRleA0KRGVzdmlvIFBhZHLDo286ICRcc3FydHtcZnJhY3tcc3VtX3tpPTF9XntufXhfaV4yLW5cb3ZlcmxpbmV7eH1eMn17bi0xfX0kDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KRGVzdmlvIFBhZHLDo286ICRcc3FydHtcZnJhY3tcc3VtX3tpPTF9XntufXhfaV4yLW5cb3ZlcmxpbmV7eH1eMn17bi0xfX0kXA0KPC9zcGFuPg0KDQpWZWphIHF1ZSBhIGVxdWHDp8OjbyBmb2kgY29sb2NhZGEganVudG8gYW8gdGV4dG8gbm9ybWFsIGVtIHVtYSDDum5pY2EgbGluaGEuDQoNCg0KIyMgRXF1YcOnw6NvIGVtIGJsb2NvDQpFc3RhIGZvcm1hIGRlIGVzY3JpdGEgbsOjbyBwb3NzaWJpbGl0YSBhIGluc2Vyw6fDo28gZGUgdGV4dG8gbm9ybWFsIG5hIG1lc21hIGxpbmhhIHF1ZSBhIGVxdWHDp8Ojbywgbm8gZW50YW50bywgY2VudHJhbGl6YSBhdXRvbWF0aWNhbWVudGUgYSBlcXVhw6fDo28gZSBkZWl4YSBlbGEgbWFpb3IsIG8gcXVlIGTDoSB1bSBtYWlvciBkZXN0YXF1ZS4gQSBzdWEgc3ludGF4IMOpIGEgc2VndWludGU6DQpgYGBMYXRleA0KJCRTdWFFcXVhw6fDo28kJA0KYGBgDQoNCk8gc2VndWludGUgZXhlbXBsbyBmYXogdW1hIGVxdWHDp8OjbyBlbSBibG9jbyBuYSBxdWFsIGEgdmFyacOhdmVsICoqVyoqIHRlbSBkaXN0cmlidWnDp8OjbyBub3JtYWwgcGFkcsOjby4NCmBgYExhdGV4DQokJFcgPSBcZnJhY3tcZGlzcGxheXN0eWxlXHN1bV97aT0xfV57bn1Ye2l9LW5cbXV9e1xzcXJ0e259XHNpZ21hfSQkDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KJCRXID0gXGZyYWN7XGRpc3BsYXlzdHlsZVxzdW1fe2k9MX1ee259WHtpfS1uXG11fXtcc3FydHtufVxzaWdtYX0kJA0KPC9zcGFuPg0KDQojIENodW5rcw0KQ2h1bmtzIHBlcm1pdGVtIHF1ZSBjw7NkaWdvcyBkZSBkaWZlcmVudGVzIGxpbmd1YWdlbnMgKGNvbW8gUiwgcHl0aG9uLCBTUUwsIExhVGVYLCBlbnRyZSBvdXRyYXMpIHNlamFtIGFkaWNpb25hZGFzIGFvIGFycXVpdm8gZG8gUk1hcmtkb3duLCBvIHF1ZSBwZXJtaXRlIHJlcHJvZHV6aXIsIHBvciBleGVtcGxvLCB0YWJlbGFzLCBncsOhZmljb3MgZSBjw6FsY3Vsb3MgZGVudHJvIGRvIHNldSBhcnF1aXZvLiBQYXJhIGFkaWNvbmFyIHVtIGNodW5rIHF1ZSBwZXJtaXRlIGEgcmVwcm9kdcOnw6NvIGRlIGPDs2RpZ28gUiByZWFsaXplIG8gc2VndWludGUgY8OzZGlnby5cDQoNCmBgYGBgYGBgYGBgYE1hcmtkb3duDQpgYGBce3JcfQ0KIyBBcXVpIGRlbnRybyDDqSBvbmRlIGlyw6EgZmljYXIgc2V1IGPDs2RpZ28gUi4NCmBgYA0KYGBgYGBgYGBgYGBgDQoNClVtYSBvYnNlcnZhw6fDo28gYSBzZSBmYXplciDDqSBxdWUgYXMgYmFycmFzIGludmVydGlkYXMgcXVlIGVzdGFtIGFwYXJlY2VuZG8gbsOjbyBmYXplbSBwYXJ0ZSBkYSBzaW50YXhlLCBmb3JhbSBhcGVuYXMgbmVjZXNzw6FyaWFzIHBhcmEgY29uc2VndWlyIG1vc3RyYXIgYXMgY2hhdmVzLlwNCg0KUGFyYSBhZGljaW9uYXIgdW0gY2h1bmsgcXVlIHJlcHJvZHV6YSBxdWFscXVlciBsaW5ndWFnZW0sIGZhw6dhIG8gc2VndWludGUgY8OzZGlnbyBzdWJzdGl0dWluZG8gYG5vbWVgIHBlbG8gbm9tZSBkYSBsw61uZ3VhZ2VtIGRlIGludGVyZXNzZSAocHl0aG9uLCByLCBiYXNoLCBzcWwsIHBocCwgZXRjKS4NCg0KYGBgYGBgYGBgYGBgTWFya2Rvd24NCmBgYFx7bm9tZVx9DQpEaWdpdGUgbyBzZXUgY8OzZGlnbyBhcXVpLg0KYGBgDQpgYGBgYGBgYGBgYGANCkNodW5rcyBvZmVyZWNlbSBvcMOnw7VlcyBxdWUgcGVybWl0ZW0gbXVkYXIgbyBvdXRwdXQgZG8gY8OzZGlnby4gUGFyYSBhZGljaW9uYXIgdW1hIG91IG1haXMgb3DDp8O1ZXMsIGZhw6dhIG8gc2VndWludGUgY8OzZGlnby4NCg0KYGBgYGBgYGBgYGBgTWFya2Rvd24NCmBgYFx7bm9tZSBvcGNhbzEsIG9wY2FvMiwgLi4uLCBvcGNhb25cfQ0KRGlnaXRlIG8gc2V1IGPDs2RpZ28gYXF1aS4NCmBgYA0KYGBgYGBgYGBgYGBgDQpBIHNlZ3VpciBzw6NvIGFwcmVzZW50YWRhcyBhbGd1bWFzIGRhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgbm8gUk1hcmtkb3duIHBhcmEgbXVkYXIgbyBvdXRwdXQgZG8gY2h1bmsuXA0KDQp8T3DDp8Ojb3xPIHF1ZSBlbGEgZmF6fA0KfDotLS06fDotLS18DQp8ZWNobz1GQUxTRXxPY3VsdGEgbyBjw7NkaWdvLCBtb3N0cmFuZG8gYXBlbmFzIG8gcmVzdWx0YWRvLnwNCnxtZXNzYWdlPUZBTFNFfFJldGlyYSBvcyBhdmlzb3MgcXVlIGFwYXJlY2VtIG5vIGPDs2RpZ28ufA0KfGV2YWw9RkFMU0V8TyBjw7NkaWdvIG7Do28gw6kgZXhlY3V0YWRvLCBtYXMgc2Vyw6EgZXhpYmlkbyBubyBkb2N1bWVudG8ufA0KfGluY2x1ZGU9RkFMU0V8T2N1bHRhIG8gY8OzZGlnbyBlIG9zIHJlc3VsdGFkb3MsIG1hcyBleGVjdXRhIG8gY8OzZGlnby58DQp8d2FybmluZz1GQUxTRXxUaXJhIG9zIGF2aXNvcyBkbyBvdXRwdXQufA0KfHJlc3VsdHM9J2hpZGUnfE9jdWx0YSBvcyByZXN1bHRhZG9zIGRvIGPDs2RpZ28ufA0KfGVycm9yPVRSVUV8UmVuZGVyaXphIG8gYXJxdWl2byBtZXNtbyBvY29ycmVuZG8gZXJyb3MufA0KfGNvbGxhcHNlPVRSVUV8SnVudGEgdG9kYXMgYXMgc2HDrWRhcyBkZSB1bSBjaHVuayBlbSB1bSDDum5pY28gYmxvY28ufA0KDQpQYXJhIGV4ZW1wbGlmaWNhciBhIHV0aWxpemHDp8OjbyBkZSBjaHVua3MgY29tIGEgbGluZ3VhZ2VtIHIsIGEgc2VndWlyIMOpIGZlaXRvIHVtIGRpYWdyYW1hIGRlIGRpc3BlcsOnw6NvIHV0aWxpemFuZG8gZ2dwbG90Lg0KYGBgYGBgYGBgYGBgTWFya2Rvd24NCmBgYFx7ciBjaHVuay1sYWJlbCwgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFXH0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwYWxtZXJwZW5ndWlucykNCmxpYnJhcnkoZ2d0aGVtZXMpDQoNCmdncGxvdChkYXRhID0gcGVuZ3VpbnMsDQogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gZmxpcHBlcl9sZW5ndGhfbW0sIHkgPSBib2R5X21hc3NfZykNCikgKw0KICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoY29sb3IgPSBzcGVjaWVzKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nKQ0KYGBgDQpgYGBgYGBgYGBgYGANCg0KYGBge3IgY2h1bmstbGFiZWwsIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwYWxtZXJwZW5ndWlucykNCmxpYnJhcnkoZ2d0aGVtZXMpDQoNCmdncGxvdChkYXRhID0gcGVuZ3VpbnMsDQogICAgICAgbWFwcGluZyA9IGFlcyh4ID0gZmxpcHBlcl9sZW5ndGhfbW0sIHkgPSBib2R5X21hc3NfZykNCikgKw0KICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoY29sb3IgPSBzcGVjaWVzKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nKQ0KYGBgDQoNClRhbWJlbSDDqSBwb3Nzw612ZWwgYXByZXNlbnRhciByZXN1bHRhZG9zIG51bcOpcmljb3MgZGVudHJvIGRvIHNldSB0ZXh0bywgY29tbyBubyBzZWd1aW50ZSBleGVtcGxvLg0KYGBgTWFya2Rvd24NCkEgbWFzc2EgY29ycG9yYWwgbcOpZGlhIGRvcyBwaW5ndWlucyDDqSBgXHIgcm91bmQobWVhbihwZW5ndWlucyRib2R5X21hc3NfZywgbmEucm0gPSBUKSwgMilgDQpgYGANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JleTsiPg0KDQpBIG1hc3NhIGNvcnBvcmFsIG3DqWRpYSBkb3MgcGluZ3VpbnMgw6kgYHIgcm91bmQobWVhbihwZW5ndWlucyRib2R5X21hc3NfZywgbmEucm0gPSBUKSwgMilgXA0KDQo8L3NwYW4+DQoNCsOJIGltcG9ydGFudGUgcmVzc2FsdGFyIHF1ZSBhIGJhcnJhIGludmVydGlkYSBuw6NvIGZheiBwYXJ0ZSBkYSBzaW50YXhlLCBtYXMgZm9pIG5lY2Vzc8OhcmlhIHBhcmEgcXVlIHRvZG8gbyBjw7NkaWdvIHNlamEgbW9zdHJhZG8uDQoNCiMgVGFiZWxhcyB7LnRhYnNldCAudGFic2V0LWZhZGV9DQoNCiMjIFRhYmVsYSBmZWl0YSBuYSBtw6NvDQpQYXJhIGZhemVyIHVtYSB0YWJlbGEgc2VtIGEgdXRpbGl6YcOnw6NvIGRvIFIgZGlyZXRhbWVudGUgbm8gUk1hcmtkb3duLCBvYnNlcnZlIGUgZXhlY3V0ZSBvIHNlZ3VpbnRlIGPDs2RpZ28uDQoNCmBgYCBtYXJrZG93bg0KfGRpcmVpdGF8ZXNxdWVyZGF8cGFkcsOjb3xjZW50cmFsaXphZG98DQp8LS0tOnw6LS0tfC0tLXw6LS0tOnwNCnwxMnwxMnwxMnwxMnwNCnwxMjN8MTIzfDEyM3wxMjN8DQp8MnwyfDJ8MnwNCmBgYA0KDQp8IGRpcmVpdGEgfCBlc3F1ZXJkYSB8IHBhZHLDo28gfCBjZW50cmFsaXphZG8gfA0KfC0tLS0tLS0tOnw6LS0tLS0tLS0tfC0tLS0tLS0tfDotLS0tLS0tLS0tLS06fA0KfCAgICAgIDEyIHwgMTIgICAgICAgfCAxMiAgICAgfCAgICAgIDEyICAgICAgfA0KfCAgICAgMTIzIHwgMTIzICAgICAgfCAxMjMgICAgfCAgICAgMTIzICAgICAgfA0KfCAgICAgICAyIHwgMiAgICAgICAgfCAyICAgICAgfCAgICAgIDIgICAgICAgfA0KDQpWZWphIHF1ZSBvIGNhcmFjdGVyZSBgfGAgw6kgdXRpbGl6YWRvIHBhcmEgZGVsaW1pdGFyIG8gcXVlIGZpY2EgZGVudHJvIGRlIGNhZGEgY8OpbHVsYSwgYWxlbSBkYSBzZWd1bmRhIGxpbmhhIGRvIGPDs2RpZ28gdGVyIHRyYcOnb3MgZSBwb250b3MgcXVlIGRpemVtIGNvbW8gdmFpIHNlciBvIGFsaW5oYW1lbnRvIGRvIHRleHRvIGUgZGVsaW1pdGEgcXVlbSDDqSBub21lIGRhcyBjb2x1bmFzLg0KDQojIyBUYWJlbGFzIGNvbSBSDQpIw6EgZHVhcyBtYW5laXJhIGludGVyZXNzYW50ZXMgZGUgYWRpY2lvbmFyIHVtYSB0YWJlbGEgY29tIGEgdXRpbGl6YcOnw6NvIGRvIFIuXA0KPGJyPg0KDQotIFBhcmEgYSBwcmltZWlyYSDDqSBuZWNlc3PDoXJpbyB0ZXIgbyBwYWNvdGUgYGtuaXRyYCwgbyBwYWNvdGUgYGthYmxlRXh0cmFgIGUgbyBwYWNvdGUgYHBhbG1lcnBlbmd1aW5zYCBpbnN0YWxhZG9zIG5vIHNldSBwYy4gRXhlY3V0ZSBvIGPDs2RpZ28gYGluc3RhbGwucGFja2FnZXMoImtuaXRyIilgLCBgaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpYCBlIGBpbnN0YWxsLnBhY2thZ2VzKCJwYWxtZXJwZW5ndWlucyIpYCBlbSBzZXUgY29uc29sZS4gQXDDs3MgaXNzbyB2b2PDqiB2YWkgdXRpbGl6YXIgYSBmdW7Dp8OjbyBgbGlicmFyeShrbml0cilgIGUgYGxpYnJhcnkoa2FibGVFeHRyYSlgIHBhcmEgY2FycmVnYXIgbyBwYWNvdGUgZSBwYXJhIHBvZGVyIHRlciBhY2Vzc28gYSBzdWEgZnVuw6fDo28gYGthYmxlKClgIGUgYGthYmxlX3N0eWxpbmcoKWAuIFNlIHZvY8OqIG7Do28gcXVpc2VyIHVzYXIgbyBsaWJyYXJ5LCDDqSBwb3Nzw612ZWwgY2FycmVnYXIgbyBwYWNvdGUgZSB1c2FyIGEgZnVuw6fDo28gYW8gbWVzbW8gdGVtcG8gY29tIGBrbml0cjo6a2FibGUoKWAgZSBga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZygpYC4gQ29tIGlzc28gZW0gbWVudGUsIG9ic2VydmUgZSBleGVjdXRlIG8gc2VndWludGUgY8OzZGlnby4NCmBgYHtyfQ0KbGlicmFyeShwYWxtZXJwZW5ndWlucykNCg0Ka25pdHI6OmthYmxlKGhlYWQocGVuZ3VpbnMsIDEwKSkgfD4gDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQpgYGANCkFsZ3VtYXMgaW5mb3JtYcOnw7VlcyBpbXBvcnRhbnRlcyBzb2JyZSBvcyBwYXLDom1ldHJvcyB1dGlsaXphZG9zIG5hcyBmdW7Dp8O1ZXM6DQoNCnxDw7NkaWdvfENvbmNlaXRvfA0KfDotLS06fDotLS06fA0KfGBwYWxtZXJwZW5ndWluc2B8w4kgbyBwYWNvdGUgb25kZSBlc3TDoSBsb2NhbGl6YWRvIG8gdGliYmxlICh1bSB0aXBvIGRlIGJhc2UgZGUgZGFkb3MpIHBlbmd1aW5zfA0KfGBrYWJsZShoZWFkKHBlbmd1aW5zLCAxMCkpYHxGYXogdW1hIHRhYmVsYSBjb20gYXMgMTAgcHJpbWVpcmFzIGxpbmhhc3wNCnxga2FibGVfc3R5bGluZygpYHxQZW1pdGUgbXVkYXIgdsOhcmlhcyBvcMOnw7VlcyB2aXN1YWlzLiBPcyBjw7NkaWdvcyBkZW50cm8gZGVzc2EgZnVuw6fDo28gYXBlbmFzIGVzcGVjaWZpY2FtIHByb3ByaWVkYWRlcyB2aXN1YWlzfA0KfGBmdWxsX3dpZHRoID0gVFJVRWB8RXNzYSBvcMOnw6NvIGZheiBhIHRhYmVsYSBwZWdhciB0b2RhIGEgZXh0ZW5zw6NvIGRvIHJlbGF0w7NyaW98DQp8YHN0cmlwZWRgfGRlaXhhIGFzIGNvcmVzIGRhcyBsaW5oYXMgYWx0ZXJuYWRhc3wNCnxgaG92ZXJgfGRlc3RhY2EgYSBsaW5oYSBxdWFuZG8gcGFzc2EgbyBtb3VzZXwNCnxgY29uZGVuc2VkYHxkZWl4YSBhIHRhYmVsYSBtYWlzIGNvbmRlbnNhZGF8DQp8YHJlc3BvbnNpdmVgfHF1YW5kbyBkaW1pbnVpIG11aXRvIGEgdGVsYSBlbGUgYWRhcHRhIGEgdGFiZWxhfA0KDQo8YnI+DQoNCi0gUGFyYSBhIG91dHJhIGZvcm1hIGRlIGZhemVyIHVtYSB0YWJlbGEgY29tIFIgdm9jw6ogdmFpIHByZWNpc2FyIGRvIHBhY290ZSBgcm1hcmtkb3duYC4gRGVzc2UgbW9kbywgZXhlY3V0ZSBgaW5zdGFsbC5wYWNrYWdlcygicm1hcmtkb3duIilgLiBBcMOzcyBpc3NvLCBvYnNlcnZlIGUgZXhlY3V0ZSBvIHNlZ3VpbnRlIGPDs2RpZ28uDQpgYGB7cn0NCmxpYnJhcnkocGFsbWVycGVuZ3VpbnMpDQoNCnJtYXJrZG93bjo6cGFnZWRfdGFibGUocGVuZ3VpbnMpDQpgYGANCg0KQ29tIGlzc28gdm9jw6ogdGVtIHVtYSBib2EgZm9ybWEgcGFyYSBhcHJlc2VudGFyLCBkZXBlbmRlbmRvIGRvIHF1ZSBmb3IgbWFpcyBjb3ZlbmllbnRlLCBwb3Vjb3MgZGFkb3MgZGUgdW1hIHRhYmVsYSBvdSBtdWl0b3MgZGFkb3MgZGUgdW1hIHRhYmVsYS5cDQo8YnI+DQpWb2PDqiBkZXZlIHRlciBwZXJjZWJpZG8gYSBmb3J0ZSBpbnRlZ3Jhw6fDo28gZW50cmUgTWFya2Rvd24gZSBSIGFxdWkgbm8gUlN0dWRpby4gQWzDqW0gZGUgY3JpYXIgdGFiZWxhcywgdm9jw6ogcG9kZSBpbmNvcnBvcmFyIGdyw6FmaWNvcyBnZXJhZG9zIHBlbG8gUiBlIGF0w6kgbWVzbW8gcmVhbGl6YXIgY8OhbGN1bG9zIGNvbXBsZXhvcyBjb20gYmFzZSBlbSBjb25qdW50b3MgZGUgZGFkb3MuIEVzc2EgaW50ZWdyYcOnw6NvIG9mZXJlY2UgdW1hIGFtcGxhIGdhbWEgZGUgcG9zc2liaWxpZGFkZXMgcGFyYSBjcmlhciBkb2N1bWVudG9zIGRpbsOibWljb3MgZSBpbnRlcmF0aXZvcyBxdWUgY29tYmluYW0gdGV4dG8sIGPDs2RpZ28gZSByZXN1bHRhZG9zIGVtIHVtIMO6bmljbyBhbWJpZW50ZS4NCg0KDQoNCiMgUmVmZXLDqm5jaWFzDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K