1 O QUE É R?

O R é uma linguagem e ambiente voltados para estatística computacional e gráficos. Aberto e gratuito, é compatível com Windows, UNIX e MacOS. Atualmente o R se encontra em sua versão 3.4.3.

Apenas para evitar a confusão, o R pode se referir as duas coisas: ao software utilizado para executar o código escrito na linguagem R e à linguagem em si. Para mais informações, podemos visitar o site do Projeto R

1.1 Bibliografia indicada

  • R in a Nutshell: A Desktop Quick Reference (Adler 2012)
  • Learning R: A Step-by-Step Function Guide to Data Analysis (Cotton 2013)
  • R for Data Science: Import, Tidy, Transform, Visualize, and Model Data (Wickham and Grolemund 2016)
  • 25 Recipes for Getting Started with R (Teetor 2011a)
  • R Cookbook: Proven Recipes for Data Analysis, Statistics, and Graphics (Teetor 2011b)
  • The Essential R Reference (Gardener 2012)

2 INICIANDO O USO DO R

2.1 Instalando o R

Para instalar o R, basta seguir os seguintes passos:

  • Visite um dos CRAN Mirros fazer o download do software. Sugerimos: (https://vps.fmvz.usp.br/CRAN/);
  • Escolha a versão para o seu sistema operacional (Linux, Mac OS ou Windows);
  • Na página seguinte, escolha a versão base;
  • Baixe o arquivo disponível no link e instale!

2.2 Instalando o RStudio

O RStudio é um ambiente de interface gráfica para o R, ou melhor, um IDE (Integrated Development Environment). Atualmente o RStudio é considerado o melhor IDE para quem programa em R. Além de uma interface mais amigável, possui diversas funcionalidades que facilitam o aprendizado e a produtividade. O RStudio possui uma versão para desktop grátis e para baixar e instalar, basta seguir os seguintes passos:

  • Ir até a página de download do RStudio;
  • Clicar em download para a versão grátis;
  • Escolher o instalador de acordo com o seu sistema operacional (Windows, Mac OS, Linux);
  • Após o download, realizar a instalação.

2.3 Preparando o ambiente de trabalho

Uma das primeiras coisas a se fazer antes de começarmos a utilizar o RStudio é definirmos o nosso diretório de trabalho. Para verificar o diretório atual, podemos executar o comando getwd()no console.

3 OPERAÇÕES BÁSICA UTILIZANDO R

3.1 Principais operações aritméticas e lógicas com R

Antes de iniciarmos as primeiras operações com o R, é necessário conhecer os principais operadores aritméticos e lógicos. Segue tabela com os principais operadores e uma breve descrição de cada um.

Principais operadores aritméticos e lógicos
Operador Descrição
+ Operador de adição
- Operador de subtração
* Operador de multiplicação
/ Operador de divisão
: Operador de sequência
^ Operador exponencial
%% Operador de módulo
== Operador de igualdade
> Operador “maior que”
< Operador “menor que”
<= Operador “menor ou igual”
& Operador lógico “E”
| Operador lógico “OU”

Conhecido tais operadores, podemos realizar nossas primeiras operações no console do R. Segue alguns exemplos com os respectivos resultados

#Exemplo de soma
347 + 328
[1] 675
#Exemplo de subtração
567 - 345
[1] 222
#Exemplo de multiplicação
457 * 32
[1] 14624

3.2 Tipos numéricos

Recorrentemente lidamos com diferentes classes numéricas no R. Podemos nos deparar com números inteiros (integer), números decimais (numeric ou double) ou números complexos (complex). Para verificarmos a classe de um número, basta usarmos a função class()no número ou na variável que desejamos testar. Vejamos os exemplos a seguir:

class(3L) #Um número inteiro pode também ser representado acompanhado de um L
[1] "integer"
integer
class(3.435)
[1] "numeric"
numeric
class(3 + 3i)
[1] "complex"
complex

NOTA: Para representar o infinito, o R utiliza Inf e -Inf. Faça o teste realizando a seguinte operação no console: 1 / 0

3.3 Operações lógicas

As operações lógicas são frequentemente utilizadas no R, principalmente na construção de funções. Diversas linguagens de programação utilizam a lógica booleana em que os valores lógicos podem ser TRUE ou FALSE. No R, além dos estados TRUE ou FALSE, há também um terceiro para indicar valor ausente (missing value) identificado por NA. Tais valores são reservados no R, o que indica que você não poderá criar variáveis com tais nomes. É importante destacar que o R é case sensitive, o que indica que existe a diferenciação entre letras maiúsculas e minúsculas. Portanto, quando formos representar os estados TRUE, FALSE ou NA, sempre temos que escrever com todas as letras maiúsculas.

Também podemos representar TRUE e FALSE digitando apenas a primeira letra maiúscula. Faça os exemplos abaixo e analise os resultados do console.

3 > 5

48 != 10

TRUE == T

39 > 100

(30 > 10) & (4 < 3)

F == TRUE

TRUE + TRUE

FALSE / 2

NA + 3

TRUE + NA

class(TRUE)

NOTA: Devemos ter bastante cuidado com os valores ausentes (NA). Caso não haja o tratamento correto, tais valores podem interferir sensivelmente no código executado. Veremos isso com mais clareza ao longo do nosso curso.

3.4 Criando variáveis

Até então realizamos algumas operações sem a necessidade de armazenar dados. No entanto, em operações mais complexas é praticamente impossível não utilizarmos variáveis. Com a criação de uma variável, podemos facilmente reusá-la ao longo de nosso código. Vejamos um exemplo.

x <- 3

x + 10
[1] 13

No exemplo anterior, criamos uma variável x para armazenar o valor numérico 3. Ao realizarmos a operação x + 10, automaticamente o valor atribuído a xé recuperado. Para criarmos uma variável, utilizamos o símbolo <-ou =. No entanto, a notação <- é a mais utilizada e será a adotada ao longo do nosso curso. Faça o exemplo seguinte e analise os resultados.

x <- 25

x = 30

31 -> x

x <- x + 1

Os nomes das variáveis podem conter letras, números, pontos e sublinha (_), mas não podem iniciar com um número ou um ponto seguido de número.

NOTA: Por questão de estética e praticidade, é recomendável que você mantenha os nomes das variáveis apenas com letras minúsculas. As variáveis devem ter nomes curtos e revelar um pouco da informação que guarda. Isso facilitará a leitura do código!

Outra forma de criarmos variáveis é utilizando a função assign(), apesar de menos usual. Vejamos um exemplo a seguir.

assign("x", 99) #Note que é necessária a utilização de aspas para indicar o nome da variável

x
[1] 99

3.5 Outras classes de variáveis

4 VETORES

5 REFERÊNCIAS

Adler, J. 2012. R in a Nutshell: A Desktop Quick Reference. O’Reilly Media. https://books.google.com.br/books?id=YK4Qb5x-hoIC.

Cotton, R. 2013. Learning R: A Step-by-Step Function Guide to Data Analysis. O’Reilly Media. https://books.google.com.br/books?id=7dyzAAAAQBAJ.

Gardener, M. 2012. The Essential R Reference. Wiley. https://books.google.com.br/books?id=xvF6hZ0T9ocC.

Teetor, P. 2011a. 25 Recipes for Getting Started with R: Excerpts from the R Cookbook. O’Reilly Media. https://books.google.com.br/books?id=cQy-1yvvq-UC.

———. 2011b. R Cookbook: Proven Recipes for Data Analysis, Statistics, and Graphics. O’Reilly Media. https://books.google.com.br/books?id=KIHuSXyhawEC.

Wickham, H., and G. Grolemund. 2016. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media. https://books.google.com.br/books?id=I6y3DQAAQBAJ.

LS0tCnRpdGxlOiAiSW50cm9kdcOnw6NvIGFvIFIiCmF1dGhvcjogCiAgLSBuYW1lOiBXZXZlcnRvbiBMaXNib2EgZGUgU2VuYQogIC0gbmFtZTogTHVpeiBIZW5yaXF1ZQpkYXRlOiAiSmFuZWlybyBkZSAyMDE4IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMycKICBwZGZfZG9jdW1lbnQ6CiAgICBrZWVwX3RleDogeWVzCiAgICB0b2M6IHllcwpsaW5rLWNpdGF0aW9uczogeWVzCnN1YnRpdGxlOiBDdXJzbyBCw6FzaWNvIGRlIExpbmd1YWdlbSBSCmJpYmxpb2dyYXBoeTogYmliX2N1cnNvX3IuYmliCi0tLQoKCgojTyBRVUUgw4kgUj8KCk8gUiDDqSB1bWEgbGluZ3VhZ2VtIGUgYW1iaWVudGUgdm9sdGFkb3MgcGFyYSBlc3RhdMOtc3RpY2EgY29tcHV0YWNpb25hbCBlIGdyw6FmaWNvcy4gQWJlcnRvIGUgZ3JhdHVpdG8sCsOpIGNvbXBhdMOtdmVsIGNvbSBXaW5kb3dzLCBVTklYIGUgTWFjT1MuIEF0dWFsbWVudGUgbyBSIHNlIGVuY29udHJhIGVtIHN1YSB2ZXJzw6NvIDMuNC4zLgoKQXBlbmFzIHBhcmEgZXZpdGFyIGEgY29uZnVzw6NvLCBvIFIgcG9kZSBzZSByZWZlcmlyIGFzIGR1YXMgY29pc2FzOiBhbyAqc29mdHdhcmUqIHV0aWxpemFkbyBwYXJhIGV4ZWN1dGFyIG8gY8OzZGlnbyBlc2NyaXRvIG5hIGxpbmd1YWdlbSBSIGUgw6AgbGluZ3VhZ2VtIGVtIHNpLiBQYXJhIG1haXMgaW5mb3JtYcOnw7VlcywgcG9kZW1vcyB2aXNpdGFyIG8gW3NpdGUgZG8gUHJvamV0byBSXShodHRwczovL3d3dy5yLXByb2plY3Qub3JnKQoKIyNCaWJsaW9ncmFmaWEgaW5kaWNhZGEKCiAqIFIgaW4gYSBOdXRzaGVsbDogQSBEZXNrdG9wIFF1aWNrIFJlZmVyZW5jZSBbQGFkbGVyMjAxMnJdCiAqIExlYXJuaW5nIFI6IEEgU3RlcC1ieS1TdGVwIEZ1bmN0aW9uIEd1aWRlIHRvIERhdGEgQW5hbHlzaXMgW0Bjb3R0b24yMDEzbGVhcm5pbmddCiAqIFIgZm9yIERhdGEgU2NpZW5jZTogSW1wb3J0LCBUaWR5LCBUcmFuc2Zvcm0sIFZpc3VhbGl6ZSwgYW5kIE1vZGVsIERhdGEgW0B3aWNraGFtMjAxNnJdCiAqIDI1IFJlY2lwZXMgZm9yIEdldHRpbmcgU3RhcnRlZCB3aXRoIFIgW0B0ZWV0b3IyMDExMjVdCiAqIFIgQ29va2Jvb2s6IFByb3ZlbiBSZWNpcGVzIGZvciBEYXRhIEFuYWx5c2lzLCBTdGF0aXN0aWNzLCBhbmQgR3JhcGhpY3MgW0B0ZWV0b3IyMDExcl0KICogVGhlIEVzc2VudGlhbCBSIFJlZmVyZW5jZSBbQGdhcmRlbmVyMjAxMmVzc2VudGlhbF0KCiNJTklDSUFORE8gTyBVU08gRE8gUgoKIyNJbnN0YWxhbmRvIG8gUgoKUGFyYSBpbnN0YWxhciBvIFIsIGJhc3RhIHNlZ3VpciBvcyBzZWd1aW50ZXMgcGFzc29zOgoKICAqIFZpc2l0ZSB1bSBkb3MgKkNSQU4gTWlycm9zKiBmYXplciBvIGRvd25sb2FkIGRvIHNvZnR3YXJlLiBTdWdlcmltb3M6IChodHRwczovL3Zwcy5mbXZ6LnVzcC5ici9DUkFOLyk7CiAgKiBFc2NvbGhhIGEgdmVyc8OjbyBwYXJhIG8gc2V1IHNpc3RlbWEgb3BlcmFjaW9uYWwgKExpbnV4LCBNYWMgT1Mgb3UgV2luZG93cyk7CiAgKiBOYSBww6FnaW5hIHNlZ3VpbnRlLCBlc2NvbGhhIGEgdmVyc8OjbyAqKmJhc2UqKjsKICAqIEJhaXhlIG8gYXJxdWl2byBkaXNwb27DrXZlbCBubyBsaW5rIGUgaW5zdGFsZSEKCiMjSW5zdGFsYW5kbyBvIFJTdHVkaW8KCk8gUlN0dWRpbyDDqSB1bSBhbWJpZW50ZSBkZSBpbnRlcmZhY2UgZ3LDoWZpY2EgcGFyYSBvIFIsIG91IG1lbGhvciwgdW0gSURFICgqSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCopLiBBdHVhbG1lbnRlIG8gUlN0dWRpbyDDqSBjb25zaWRlcmFkbyBvIG1lbGhvciBJREUgcGFyYSBxdWVtIHByb2dyYW1hIGVtIFIuIEFsw6ltIGRlIHVtYSBpbnRlcmZhY2UgbWFpcyBhbWlnw6F2ZWwsIHBvc3N1aSBkaXZlcnNhcyBmdW5jaW9uYWxpZGFkZXMgcXVlIGZhY2lsaXRhbSBvIGFwcmVuZGl6YWRvIGUgYSBwcm9kdXRpdmlkYWRlLiBPIFJTdHVkaW8gcG9zc3VpIHVtYSB2ZXJzw6NvIHBhcmEgZGVza3RvcCBncsOhdGlzIGUgcGFyYSBiYWl4YXIgZSBpbnN0YWxhciwgYmFzdGEgc2VndWlyIG9zIHNlZ3VpbnRlcyBwYXNzb3M6CgogICogSXIgYXTDqSBhIFtww6FnaW5hIGRlIGRvd25sb2FkIGRvIFJTdHVkaW9dKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQpOwogICogQ2xpY2FyIGVtIGRvd25sb2FkIHBhcmEgYSB2ZXJzw6NvIGdyw6F0aXM7CiAgKiBFc2NvbGhlciBvIGluc3RhbGFkb3IgZGUgYWNvcmRvIGNvbSBvIHNldSBzaXN0ZW1hIG9wZXJhY2lvbmFsIChXaW5kb3dzLCBNYWMgT1MsIExpbnV4KTsKICAqIEFww7NzIG8gZG93bmxvYWQsIHJlYWxpemFyIGEgaW5zdGFsYcOnw6NvLgoKIyNQcmVwYXJhbmRvIG8gYW1iaWVudGUgZGUgdHJhYmFsaG8KCgpVbWEgZGFzIHByaW1laXJhcyBjb2lzYXMgYSBzZSBmYXplciBhbnRlcyBkZSBjb21lw6dhcm1vcyBhIHV0aWxpemFyIG8gUlN0dWRpbyDDqSBkZWZpbmlybW9zIG8gbm9zc28gZGlyZXTDs3JpbyBkZSB0cmFiYWxoby4gUGFyYSB2ZXJpZmljYXIgbyBkaXJldMOzcmlvIGF0dWFsLCBwb2RlbW9zIGV4ZWN1dGFyIG8gY29tYW5kbyBgYGBnZXR3ZCgpYGBgbm8gY29uc29sZS4KCiNPUEVSQcOHw5VFUyBCw4FTSUNBIFVUSUxJWkFORE8gUgoKIyNQcmluY2lwYWlzIG9wZXJhw6fDtWVzIGFyaXRtw6l0aWNhcyBlIGzDs2dpY2FzIGNvbSBSCkFudGVzIGRlIGluaWNpYXJtb3MgYXMgcHJpbWVpcmFzIG9wZXJhw6fDtWVzIGNvbSBvIFIsIMOpIG5lY2Vzc8OhcmlvIGNvbmhlY2VyIG9zIHByaW5jaXBhaXMgb3BlcmFkb3JlcyBhcml0bcOpdGljb3MgZSBsw7NnaWNvcy4gU2VndWUgdGFiZWxhIGNvbSBvcyBwcmluY2lwYWlzIG9wZXJhZG9yZXMgZSB1bWEgYnJldmUgZGVzY3Jpw6fDo28gZGUgY2FkYSB1bS4KCk9wZXJhZG9yICAgIERlc2NyacOnw6NvICAgIAotLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLSAKYGBgK2BgYCAgICAgIE9wZXJhZG9yIGRlIGFkacOnw6NvICAgICAKYGBgLWBgYCAgICAgIE9wZXJhZG9yIGRlIHN1YnRyYcOnw6NvICAgICAgCmBgYCpgYGAgICAgICBPcGVyYWRvciBkZSBtdWx0aXBsaWNhw6fDo28gICAKYGBgL2BgYCAgICAgIE9wZXJhZG9yIGRlIGRpdmlzw6NvCmBgYDpgYGAgICAgICBPcGVyYWRvciBkZSBzZXF1w6puY2lhCmBgYF5gYGAgICAgICBPcGVyYWRvciBleHBvbmVuY2lhbApgYGAlJWBgYCAgICAgT3BlcmFkb3IgZGUgbcOzZHVsbwpgYGA9PWBgYCAgICAgT3BlcmFkb3IgZGUgaWd1YWxkYWRlCmBgYD5gYGAgICAgICBPcGVyYWRvciAibWFpb3IgcXVlIgpgYGA8YGBgICAgICAgT3BlcmFkb3IgIm1lbm9yIHF1ZSIKYGBgPD1gYGAgICAgIE9wZXJhZG9yICJtZW5vciBvdSBpZ3VhbCIKYGBgJmBgYCAgICAgIE9wZXJhZG9yIGzDs2dpY28gIkUiCmBgYHxgYGAgICAgICBPcGVyYWRvciBsw7NnaWNvICJPVSIKClRhYmxlOiBQcmluY2lwYWlzIG9wZXJhZG9yZXMgYXJpdG3DqXRpY29zIGUgbMOzZ2ljb3MKCkNvbmhlY2lkbyB0YWlzIG9wZXJhZG9yZXMsIHBvZGVtb3MgcmVhbGl6YXIgbm9zc2FzIHByaW1laXJhcyBvcGVyYcOnw7VlcyBubyBjb25zb2xlIGRvIFIuIFNlZ3VlIGFsZ3VucyBleGVtcGxvcyBjb20gb3MgcmVzcGVjdGl2b3MgcmVzdWx0YWRvcwoKYGBge3IgT3BlcmHDp8O1ZXMgYsOhc2ljYXN9CiNFeGVtcGxvIGRlIHNvbWEKMzQ3ICsgMzI4CiNFeGVtcGxvIGRlIHN1YnRyYcOnw6NvCjU2NyAtIDM0NQojRXhlbXBsbyBkZSBtdWx0aXBsaWNhw6fDo28KNDU3ICogMzIKYGBgCgojI1RpcG9zIG51bcOpcmljb3MKClJlY29ycmVudGVtZW50ZSBsaWRhbW9zIGNvbSBkaWZlcmVudGVzIGNsYXNzZXMgbnVtw6lyaWNhcyBubyBSLiBQb2RlbW9zIG5vcyBkZXBhcmFyIGNvbSBuw7ptZXJvcyBpbnRlaXJvcyAqKGludGVnZXIpKiwgbsO6bWVyb3MgZGVjaW1haXMgKihudW1lcmljIG91IGRvdWJsZSkqIG91IG7Dum1lcm9zIGNvbXBsZXhvcyAqKGNvbXBsZXgpKi4gUGFyYSB2ZXJpZmljYXJtb3MgYSBjbGFzc2UgZGUgdW0gbsO6bWVybywgYmFzdGEgdXNhcm1vcyBhIGZ1bsOnw6NvIGBgYGNsYXNzKClgYGBubyBuw7ptZXJvIG91IG5hIHZhcmnDoXZlbCBxdWUgZGVzZWphbW9zIHRlc3Rhci4gVmVqYW1vcyBvcyBleGVtcGxvcyBhIHNlZ3VpcjoKCmBgYHtyfQpjbGFzcygzTCkgI1VtIG7Dum1lcm8gaW50ZWlybyBwb2RlIHRhbWLDqW0gc2VyIHJlcHJlc2VudGFkbyBhY29tcGFuaGFkbyBkZSB1bSBMCgpjbGFzcygzLjQzNSkKCmNsYXNzKDMgKyAzaSkKCmBgYAoKCj4qKk5PVEE6KiogKlBhcmEgcmVwcmVzZW50YXIgbyBpbmZpbml0bywgbyBSIHV0aWxpemEgYGBgSW5mYGBgIGUgYGBgLUluZmBgYC4gRmHDp2EgbyB0ZXN0ZSByZWFsaXphbmRvIGEgc2VndWludGUgb3BlcmHDp8OjbyBubyBjb25zb2xlOiBgYGAxIC8gMCBgYGAqCgojI09wZXJhw6fDtWVzIGzDs2dpY2FzCgpBcyBvcGVyYcOnw7VlcyBsw7NnaWNhcyBzw6NvIGZyZXF1ZW50ZW1lbnRlIHV0aWxpemFkYXMgbm8gUiwgcHJpbmNpcGFsbWVudGUgbmEgY29uc3RydcOnw6NvIGRlIGZ1bsOnw7Vlcy4gRGl2ZXJzYXMgbGluZ3VhZ2VucyBkZSBwcm9ncmFtYcOnw6NvIHV0aWxpemFtIGEgbMOzZ2ljYSBib29sZWFuYSBlbSBxdWUgb3MgdmFsb3JlcyBsw7NnaWNvcyBwb2RlbSBzZXIgVFJVRSBvdSBGQUxTRS4gTm8gUiwgYWzDqW0gZG9zIGVzdGFkb3MgYGBgVFJVRWBgYCBvdSBgYGBGQUxTRWBgYCwgaMOhIHRhbWLDqW0gdW0gdGVyY2Vpcm8gcGFyYSBpbmRpY2FyIHZhbG9yIGF1c2VudGUgKihtaXNzaW5nIHZhbHVlKSogaWRlbnRpZmljYWRvIHBvciBgYGBOQWBgYC4gVGFpcyB2YWxvcmVzIHPDo28gcmVzZXJ2YWRvcyBubyBSLCBvIHF1ZSBpbmRpY2EgcXVlIHZvY8OqIG7Do28gcG9kZXLDoSBjcmlhciB2YXJpw6F2ZWlzIGNvbSB0YWlzIG5vbWVzLiDDiSBpbXBvcnRhbnRlIGRlc3RhY2FyIHF1ZSBvIFIgw6kgKmNhc2Ugc2Vuc2l0aXZlKiwgbyBxdWUgaW5kaWNhIHF1ZSBleGlzdGUgYSBkaWZlcmVuY2lhw6fDo28gZW50cmUgbGV0cmFzIG1hacO6c2N1bGFzIGUgbWluw7pzY3VsYXMuIFBvcnRhbnRvLCBxdWFuZG8gZm9ybW9zIHJlcHJlc2VudGFyIG9zIGVzdGFkb3MgYGBgVFJVRWBgYCwgYGBgRkFMU0VgYGAgb3UgYGBgTkFgYGAsIHNlbXByZSB0ZW1vcyBxdWUgZXNjcmV2ZXIgY29tIHRvZGFzIGFzIGxldHJhcyAqKm1hacO6c2N1bGFzKiouIAoKVGFtYsOpbSBwb2RlbW9zIHJlcHJlc2VudGFyIGBgYFRSVUVgYGAgZSBgYGBGQUxTRWBgYCBkaWdpdGFuZG8gYXBlbmFzIGEgcHJpbWVpcmEgbGV0cmEgbWFpw7pzY3VsYS4gRmHDp2Egb3MgZXhlbXBsb3MgYWJhaXhvIGUgYW5hbGlzZSBvcyByZXN1bHRhZG9zIGRvIGNvbnNvbGUuCgpgYGB7ciwgZXZhbD1GQUxTRX0KMyA+IDUKCjQ4ICE9IDEwCgpUUlVFID09IFQKCjM5ID4gMTAwCgooMzAgPiAxMCkgJiAoNCA8IDMpCgpGID09IFRSVUUKClRSVUUgKyBUUlVFCgpGQUxTRSAvIDIKCk5BICsgMwoKVFJVRSArIE5BCgpjbGFzcyhUUlVFKQpgYGAKCj4qKk5PVEE6KiogKkRldmVtb3MgdGVyIGJhc3RhbnRlIGN1aWRhZG8gY29tIG9zIHZhbG9yZXMgYXVzZW50ZXMgKGBgYE5BYGBgKS4gQ2FzbyBuw6NvIGhhamEgbyB0cmF0YW1lbnRvIGNvcnJldG8sIHRhaXMgdmFsb3JlcyBwb2RlbSBpbnRlcmZlcmlyIHNlbnNpdmVsbWVudGUgbm8gY8OzZGlnbyBleGVjdXRhZG8uIFZlcmVtb3MgaXNzbyBjb20gbWFpcyBjbGFyZXphIGFvIGxvbmdvIGRvIG5vc3NvIGN1cnNvLioKCiMjQ3JpYW5kbyB2YXJpw6F2ZWlzCgpBdMOpIGVudMOjbyByZWFsaXphbW9zIGFsZ3VtYXMgb3BlcmHDp8O1ZXMgc2VtIGEgbmVjZXNzaWRhZGUgZGUgYXJtYXplbmFyIGRhZG9zLiBObyBlbnRhbnRvLCBlbSBvcGVyYcOnw7VlcyBtYWlzIGNvbXBsZXhhcyDDqSBwcmF0aWNhbWVudGUgaW1wb3Nzw612ZWwgbsOjbyB1dGlsaXphcm1vcyB2YXJpw6F2ZWlzLiBDb20gYSBjcmlhw6fDo28gZGUgdW1hIHZhcmnDoXZlbCwgcG9kZW1vcyBmYWNpbG1lbnRlIHJldXPDoS1sYSBhbyBsb25nbyBkZSBub3NzbyBjw7NkaWdvLiBWZWphbW9zIHVtIGV4ZW1wbG8uCgpgYGB7cn0KeCA8LSAzCgp4ICsgMTAKYGBgCgpObyBleGVtcGxvIGFudGVyaW9yLCBjcmlhbW9zIHVtYSB2YXJpw6F2ZWwgYGBgeGBgYCBwYXJhIGFybWF6ZW5hciBvIHZhbG9yIG51bcOpcmljbyAzLiBBbyByZWFsaXphcm1vcyBhIG9wZXJhw6fDo28gYGBgeCArIDEwYGBgLCBhdXRvbWF0aWNhbWVudGUgbyB2YWxvciBhdHJpYnXDrWRvIGEgYGBgeGBgYMOpIHJlY3VwZXJhZG8uIFBhcmEgY3JpYXJtb3MgdW1hIHZhcmnDoXZlbCwgdXRpbGl6YW1vcyBvIHPDrW1ib2xvIGBgYDwtYGBgb3UgYGBgPWBgYC4gTm8gZW50YW50bywgYSBub3Rhw6fDo28gYGBgPC1gYGAgw6kgYSBtYWlzIHV0aWxpemFkYSBlIHNlcsOhIGEgYWRvdGFkYSBhbyBsb25nbyBkbyBub3NzbyBjdXJzby4gRmHDp2EgbyBleGVtcGxvIHNlZ3VpbnRlIGUgYW5hbGlzZSBvcyByZXN1bHRhZG9zLiAKCmBgYHtyLCBldmFsPUZBTFNFfQp4IDwtIDI1Cgp4ID0gMzAKCjMxIC0+IHgKCnggPC0geCArIDEKCmBgYAoKT3Mgbm9tZXMgZGFzIHZhcmnDoXZlaXMgcG9kZW0gY29udGVyIGxldHJhcywgbsO6bWVyb3MsIHBvbnRvcyBlIHN1YmxpbmhhIChgYGBfYGBgKSwgbWFzIG7Do28gcG9kZW0gaW5pY2lhciBjb20gdW0gbsO6bWVybyBvdSB1bSBwb250byBzZWd1aWRvIGRlIG7Dum1lcm8uCgo+KipOT1RBOioqICpQb3IgcXVlc3TDo28gZGUgZXN0w6l0aWNhIGUgcHJhdGljaWRhZGUsIMOpIHJlY29tZW5kw6F2ZWwgcXVlIHZvY8OqIG1hbnRlbmhhIG9zIG5vbWVzIGRhcyB2YXJpw6F2ZWlzIGFwZW5hcyBjb20gbGV0cmFzIG1pbsO6c2N1bGFzLiBBcyB2YXJpw6F2ZWlzIGRldmVtIHRlciBub21lcyBjdXJ0b3MgZSByZXZlbGFyIHVtIHBvdWNvIGRhIGluZm9ybWHDp8OjbyBxdWUgZ3VhcmRhLiBJc3NvIGZhY2lsaXRhcsOhIGEgbGVpdHVyYSBkbyBjw7NkaWdvISoKCk91dHJhIGZvcm1hIGRlIGNyaWFybW9zIHZhcmnDoXZlaXMgw6kgdXRpbGl6YW5kbyBhIGZ1bsOnw6NvIGBgYXNzaWduKClgYCwgYXBlc2FyIGRlIG1lbm9zIHVzdWFsLiBWZWphbW9zIHVtIGV4ZW1wbG8gYSBzZWd1aXIuCgpgYGB7cn0KYXNzaWduKCJ4IiwgOTkpICNOb3RlIHF1ZSDDqSBuZWNlc3PDoXJpYSBhIHV0aWxpemHDp8OjbyBkZSBhc3BhcyBwYXJhIGluZGljYXIgbyBub21lIGRhIHZhcmnDoXZlbAoKeApgYGAKCiMjT3V0cmFzIGNsYXNzZXMgZGUgdmFyacOhdmVpcwoKCgoKI1ZFVE9SRVMKCgoKCiNSRUZFUsOKTkNJQVM=