Informações Relevantes

Usaremos duas bases de dados reais para realização dessa prova.

As bases de dados serão retiradas de nosso repositório do GitHub e do site brasil.io.

Faça o download dos seguintes conjuntos de dados:

  1. Cursos e notas de corte do PROUNI 2018
  2. Gapminder

O uso do software R é suficiente, mas não necessário. Ou seja, você pode usar qualquer outro software que estiver mais familiarizado, todavia, as dicas que serão dadas em algumas questões abaixo, serão voltadas para os usuários do R.

Por uma questão de organização, num crie seu projeto num diretório por nome prova1 e organize seus dados assim (é só uma sugestão):

prova1/
├── dados/
│   ├── gapminder.csv
│   └── cursos-prouni.csv
├── R/
│   ├── script_gapminder.R
│   └── script_prouni.R
├── img/
│   └── titulo_intimacy.png
└── prova_seu-nome.Rmd  
  1. No diretório dados/, salve os datasets que usaremos;
  2. O diretório R/ é opcional, mas pode servir para scripts de testes; ou seja, você pode fazer os testes para responder as questões separadamente. Então, assim que estiver satisfeito com as respostas (dos códigos) pode inserí-los no arquivo principal (.Rmd)
  3. Note que, a figura titulo_intimacy.png deve estar salva no diretório img/. Também é aconselhável colocar nesse diretório qualquer figura que for usar nas suas respostas (caso use alguma fora dos códigos em R);
  4. O arquivo prova_seu-nome.Rmd é o arquivo principal. Nele você faz a “compilação” com o knit para .html. Você só me entregará o arquivo final, em html.

Identificação

Aluno: Coloque seu nome aqui!
Data: (31/05/2023)

Questões

# importe os dados aqui (read_csv)
## importando os dados do Prouni
notas_cursos <- readr::read_csv("dados/cursos-prouni.csv")
dados_gapminder <- readr::read_csv("dados/gapminder.csv")

I. Sobre o dataset gapminder.csv

Questão 01. Responda aos itens abaixo, mostrando como chegou nas respostas.

  1. Quantas variáveis e quantas observações existem nesse conjunto de dados?
  2. Indentifique os tipos de variáveis (qualitativas vs quantitativas; e suas subdivisões: nominal ou ordinal, discreta ou contínua)

Questão 02. Quantos países existem em cada continente? Ou seja, após agrupar por continente; exiba (distintamtente) a variável pais ; e, conte-os.

Questão 03. Exclua o continente que possui a menor quantidade de países e faça o gráfico de densidade da variável expectativa_de_via, colocando uma transparência de 70% no argumento da densidade (alpha = 0.7). Qual sua interpretação para esse gráfico?

Questão 04. Vamos investigar o contraste entre a relação da expectativa de vida e o pib per capita durante um intervalo de 50 anos (1957 até 2007). Para tanto, construiremos um gráfico de pontos que possui algumas características: o tamanho do ponto relaciona-se ao tamanho da população; e, a cor do ponto realaciona-se com o continente.

Observe que, em 1957, há um país da Ásia que possui um alto pib per capita, embora possua uma expectativa de vida inferior aos 60 anos. Esse alto pib acabou por “aglutinar” os dos outros países. Então, para uma melhor percepção dessas diferenças, mudaremos a escala do PIB (usaremos a escala logarítima):

  1. O que você pode afirmar, de uma forma geral e apenas observando o gráfico, sobre a expectavida de vida dos continentes? Ela aumentou ou diminuiu ao longo desses 50 anos em questão?
  2. Em 1957, qual país da Ásia possuia o maior PIB per capita? E, nesse mesmo ano, qual possuía a maior expectativa de vida?
  3. Em 2007, encontre a expectativa de vida e o pib per capita dos dois países do item (b). O que aconteceu?
  4. Quais são os dois países com maior população (maior diâmetro do ponto) em 1957 e em 2007? O que aconteceu com o pib per capita e a expectativa de vida deles em 50 anos?
  5. Faça um gráfico de pontos relacionando pib per capita e expectativa de vida durante todos os anos do dataset. Coloque uma reta de regressão nesses dados e responda se há uma tendência positiva ou negativa entre essas variáveis. Use uma escala logarítimica no eixo x (para isso, basta adicionar scale_x_log10() à camada do ggplot()).

Questão 05. As seguintes perguntas estão relacionadas ao continente Africano.

  1. Encontre os países com menor e maior expectativa de vida no ano de 1952. Chame o primeiro de pais_menor e o segundo de pais_maior. São os mesmos em 2007?
  2. O seguinte conjunto de códigos produz um gráfico de linhas relacionando a expectativa de vida ao longo dos anos, dos países pais_menor e pais_maior. Substitua os nomes adequados e responda: os gráficos são semelhantes?
dados_gapminder |>
  filter(pais %in% c("pais_menor", "pais_maior")) |>
  ggplot() +
  aes(x = ano, y = expectativa_de_vida, color = pais, group = pais) +
  geom_line() +
  labs(
    x = "",
    y = ""
  ) +
  theme_minimal()

Questão 06. No gráfico da questão anterior, do pais_menor, há uma queda vertiginosa, na década de 90, da expectativa de vida. Pesquise sobre o que poderia ter ocasionado tal queda.

I. Sobre o dataset cursos_prouni.csv

Questão 07 Para responder essa questão, complete adequadamente o código abaixo, referente a construção de um boxplot da varivável nota_integral_ampla, agrupadas pelo turno (estamos considerando a variável dados_cursos, como sendo o dataset cursos_prouni.csv).

dados_cursos %>%
  select(❓❓ , ❓❓) %>% 
  drop_na() %>% 
  ggplot() +
  aes(x = ❓❓, y = ❓❓, fill = ❓❓) +
  geom_boxplot(show.legend = FALSE) +
  labs(
    title = "Comparação das notas por turno",
    x = "",
    y = ""
  ) +
  scale_fill_viridis_d() +
  theme_minimal()
  1. Pelo gráfico, qual dos turnos possui a maior mediana das notas? Explique.
  2. Qual a média e a mediana do turno identificado no item anterior?
  3. Qual dos cinco turnos possui menor homegeneidade na nota integral ampla?
  4. Faça um gráfico de densidade dessas notas, facetando-as nos turnos. Esse gráfico também serviria para comparar as notas por turno? Explique.

Questão 08. Qual a posição ocupa o estado da Bahia, no que se refere à frequência absoluta da variável uf_busca, disposta de forma decrescente?

Questão 09. Quantos cursos foram identificados, distintamente, na variável nome?

Questão 10. Analise o código abaixo e execute-o (estamos considerando a variável dados_curso como sendo o dataset cursos_prouni.csv). O que você pode concluir com respeito aos cursos exibidos, comparativamente? (cite, pelo menos, duas características gráficas).

dados_cursos %>% 
  select(nome, nota_integral_ampla) %>%
  drop_na() %>% 
  filter(nome == "Medicina" | nome == "Direito") %>% 
  ggplot() +
  aes(nota_integral_ampla, nome, fill = nome) +
  geom_density_ridges(show.legend = FALSE) +
  scale_fill_viridis_d() +
  labs(
    title = "Comparação entre Medicina e Direito",
    x = "",
    y = ""
  ) +
  theme_minimal()

Dicas

  • Organize seu ambiente de trabalho com um Projeto em R;
  • Carrege os conjuntos de dados separadamente, pois se a memória do seu computador for pequena, pode causar lentidão;
    • Por exemplo, leia o conjunto de dados contracheque.csv, resolva as questões referente a esse tópico e depois, no console, digite rm(list = ls()). Aí é só carregar um outro conjunto de dados.
    • O comando rm(list = ls()) limpa a memória armazenada até aquele momento pelas variáveis no R.
  • Quando deseja-se comparar qual das variáveis é a mais homogênea (Questão 01, item c), é necessário comparar a variabilidade em relação à média. Se a média é igual em cada grupo, usamos o desvio padrão. Todavia, se a média em cada grupo é diferente, precisamos padronizar essa medida; e, nesse caso, usamos o coeficiente de variação (cv), em porcentagem. Quanto menor a porcentagem do cv, mais homogênea é a distribuição do nota_integral_ampla. Define-se: \[\text{cv} = \frac{\text{desvio padrão}}{média} \cdot 100\]
                                         |//
                                        (o o)
                    +-------------oOO----(_)-----oOO-----------------+
                    | ______              ______                     |
                    | | ___ \             | ___ \                    |
                    | | |_/ / ___   __ _  | |_/ / __ _____   ____ _  |
                    | | ___ \/ _ \ / _` | |  __/ '__/ _ \ \ / / _` | |
                    | | |_/ / (_) | (_| | | |  | | | (_) \ V / (_| | |
                    | \____/ \___/ \__,_| \_|  |_|  \___/ \_/ \__,_| |
                    |                                                |
                    +------------------------------------------------+
                                       |__|__|
                                        || ||
                                       ooO Ooo
LS0tCnRpdGxlOiAiIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgaGlnaGxpZ2h0OiB0YW5nbwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKIVtdKGltZy90aXR1bG9faW50aW1hY3kucG5nKQoKIyMgSW5mb3JtYcOnw7VlcyBSZWxldmFudGVzCgpVc2FyZW1vcyBkdWFzIGJhc2VzIGRlIGRhZG9zIHJlYWlzIHBhcmEgcmVhbGl6YcOnw6NvIGRlc3NhIHByb3ZhLgoKQXMgYmFzZXMgZGUgZGFkb3Mgc2Vyw6NvIHJldGlyYWRhcyBkZSBub3NzbyByZXBvc2l0w7NyaW8gZG8gR2l0SHViIGUgZG8gX3NpdGVfIApbYnJhc2lsLmlvXShicmFzaWwuaW8pLgoKRmHDp2EgbyBfZG93bmxvYWRfIGRvcyBzZWd1aW50ZXMgY29uanVudG9zIGRlIGRhZG9zOgoKMS4gW0N1cnNvcyBlIG5vdGFzIGRlIGNvcnRlIGRvIFBST1VOSSAyMDE4XShodHRwczovL2RyaXZlLmdvb2dsZS5jb20vdS8wL3VjP2lkPTFsbnFZSHlsRVdUOGNONnZQWi1OUlI4S2ZGQVBOcTQzciZleHBvcnQ9ZG93bmxvYWQpCjIuIFtHYXBtaW5kZXJdKGh0dHBzOi8vZG93bmdpdC5ldmVjYWxtLmNvbS8jL2hvbWU/dXJsPWh0dHBzOi8vZ2l0aHViLmNvbS9pY2Fyby1mcmVpcmUvZGFkb3NfY3N2L2Jsb2IvbWFpbi9kYWRvcy9jc3YvZ2FwbWluZGVyLmNzdikKCk8gdXNvIGRvIF9zb2Z0d2FyZV8gYFJgIMOpIHN1ZmljaWVudGUsIG1hcyBuw6NvIG5lY2Vzc8OhcmlvLgpPdSBzZWphLCB2b2PDqiBwb2RlIHVzYXIgcXVhbHF1ZXIgb3V0cm8gX3NvZnR3YXJlXyBxdWUgZXN0aXZlciBtYWlzIGZhbWlsaWFyaXphZG8sIHRvZGF2aWEsIGFzIGRpY2FzIHF1ZSBzZXLDo28gZGFkYXMgZW0gYWxndW1hcyBxdWVzdMO1ZXMgYWJhaXhvLCBzZXLDo28gdm9sdGFkYXMgcGFyYSBvcyB1c3XDoXJpb3MgZG8gYFJgLgoKUG9yIHVtYSBxdWVzdMOjbyBkZSBvcmdhbml6YcOnw6NvLCBudW0gY3JpZSBzZXUgcHJvamV0byBudW0gZGlyZXTDs3JpbyBwb3Igbm9tZSBgcHJvdmExYCBlIG9yZ2FuaXplIHNldXMgZGFkb3MgYXNzaW0gKMOpIHPDsyB1bWEgc3VnZXN0w6NvKToKCmBgYHtiYXNoLCBldmFsPUZBTFNFfQpwcm92YTEvCuKUnOKUgOKUgCBkYWRvcy8K4pSCICAg4pSc4pSA4pSAIGdhcG1pbmRlci5jc3YK4pSCICAg4pSU4pSA4pSAIGN1cnNvcy1wcm91bmkuY3N2CuKUnOKUgOKUgCBSLwrilIIgICDilJzilIDilIAgc2NyaXB0X2dhcG1pbmRlci5SCuKUgiAgIOKUlOKUgOKUgCBzY3JpcHRfcHJvdW5pLlIK4pSc4pSA4pSAIGltZy8K4pSCICAg4pSU4pSA4pSAIHRpdHVsb19pbnRpbWFjeS5wbmcK4pSU4pSA4pSAIHByb3ZhX3NldS1ub21lLlJtZCAgCmBgYAoKYS4gTm8gZGlyZXTDs3JpbyBgZGFkb3MvYCwgc2FsdmUgb3MgX2RhdGFzZXRzXyBxdWUgdXNhcmVtb3M7CmIuIE8gZGlyZXTDs3JpbyBgUi9gIMOpIG9wY2lvbmFsLCBtYXMgcG9kZSBzZXJ2aXIgcGFyYSBfc2NyaXB0c18gZGUgdGVzdGVzOyBvdSBzZWphLCB2b2PDqiBwb2RlIGZhemVyIG9zIHRlc3RlcyBwYXJhIHJlc3BvbmRlciBhcyBxdWVzdMO1ZXMgc2VwYXJhZGFtZW50ZS4gRW50w6NvLCBhc3NpbSBxdWUgZXN0aXZlciBzYXRpc2ZlaXRvIGNvbSBhcyByZXNwb3N0YXMgKGRvcyBjw7NkaWdvcykgcG9kZSBpbnNlcsOtLWxvcyBubyBhcnF1aXZvIHByaW5jaXBhbCAoYC5SbWRgKQpjLiBOb3RlIHF1ZSwgYSBmaWd1cmEgYHRpdHVsb19pbnRpbWFjeS5wbmdgIGRldmUgZXN0YXIgc2FsdmEgbm8gZGlyZXTDs3JpbyBgaW1nL2AuIFRhbWLDqW0gw6kgYWNvbnNlbGjDoXZlbCBjb2xvY2FyIG5lc3NlIGRpcmV0w7NyaW8gcXVhbHF1ZXIgZmlndXJhIHF1ZSBmb3IgdXNhciBuYXMgc3VhcyByZXNwb3N0YXMgKGNhc28gdXNlIGFsZ3VtYSBmb3JhIGRvcyBjw7NkaWdvcyBlbSBSKTsKZC4gTyBhcnF1aXZvIGBwcm92YV9zZXUtbm9tZS5SbWRgIMOpIG8gYXJxdWl2byBwcmluY2lwYWwuIE5lbGUgdm9jw6ogZmF6IGEgImNvbXBpbGHDp8OjbyIgY29tIG8gYGtuaXRgIHBhcmEgYC5odG1sYC4gVm9jw6ogc8OzIG1lIGVudHJlZ2Fyw6EgbyBhcnF1aXZvIGZpbmFsLCBlbSBgaHRtbGAuCgojIyBJZGVudGlmaWNhw6fDo28KCioqQWx1bm86KiogQ29sb3F1ZSBzZXUgbm9tZSBhcXVpISAgPC9icj4KKipEYXRhOioqICAoMzEvMDUvMjAyMykKCiMjIFF1ZXN0w7VlcwoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CiMgaW1wb3J0ZSBvcyBkYWRvcyBhcXVpIChyZWFkX2NzdikKIyMgaW1wb3J0YW5kbyBvcyBkYWRvcyBkbyBQcm91bmkKbm90YXNfY3Vyc29zIDwtIHJlYWRyOjpyZWFkX2NzdigiZGFkb3MvY3Vyc29zLXByb3VuaS5jc3YiKQpkYWRvc19nYXBtaW5kZXIgPC0gcmVhZHI6OnJlYWRfY3N2KCJkYWRvcy9nYXBtaW5kZXIuY3N2IikKYGBgCgojIyMgSS4gU29icmUgbyBfZGF0YXNldF8gYGdhcG1pbmRlci5jc3ZgCgoqKlF1ZXN0w6NvIDAxLioqIFJlc3BvbmRhIGFvcyBpdGVucyBhYmFpeG8sIG1vc3RyYW5kbyBjb21vIGNoZWdvdSBuYXMgcmVzcG9zdGFzLgoKYS4gUXVhbnRhcyB2YXJpw6F2ZWlzIGUgcXVhbnRhcyBvYnNlcnZhw6fDtWVzIGV4aXN0ZW0gbmVzc2UgY29uanVudG8gZGUgZGFkb3M/CmIuIEluZGVudGlmaXF1ZSBvcyB0aXBvcyBkZSB2YXJpw6F2ZWlzIChxdWFsaXRhdGl2YXMgdnMgcXVhbnRpdGF0aXZhczsgZSBzdWFzIHN1YmRpdmlzw7Vlczogbm9taW5hbCBvdSBvcmRpbmFsLCBkaXNjcmV0YSBvdSBjb250w61udWEpCgoqKlF1ZXN0w6NvIDAyLioqIFF1YW50b3MgcGHDrXNlcyBleGlzdGVtIGVtIGNhZGEgY29udGluZW50ZT8gT3Ugc2VqYSwgYXDDs3MgYWdydXBhciBwb3IgYGNvbnRpbmVudGVgOyBleGliYSAoZGlzdGludGFtdGVudGUpIGEgdmFyacOhdmVsIGBwYWlzYCA7IGUsIGNvbnRlLW9zLgoKKipRdWVzdMOjbyAwMy4qKiBFeGNsdWEgbyBjb250aW5lbnRlIHF1ZSBwb3NzdWkgYSBtZW5vciBxdWFudGlkYWRlIGRlIHBhw61zZXMgZSBmYcOnYSBvIGdyw6FmaWNvIGRlIGBkZW5zaWRhZGVgIGRhIHZhcmnDoXZlbCBgZXhwZWN0YXRpdmFfZGVfdmlhYCwgY29sb2NhbmRvIHVtYSB0cmFuc3BhcsOqbmNpYSBkZSA3MCUgbm8gYXJndW1lbnRvIGRhIGRlbnNpZGFkZSAoYGFscGhhID0gMC43YCkuIFF1YWwgc3VhIGludGVycHJldGHDp8OjbyBwYXJhIGVzc2UgZ3LDoWZpY28/CgoqKlF1ZXN0w6NvIDA0LioqIFZhbW9zIGludmVzdGlnYXIgbyBjb250cmFzdGUgZW50cmUgYSByZWxhw6fDo28gZGEgX2V4cGVjdGF0aXZhIGRlIHZpZGFfIGUgbyBfcGliIHBlciBjYXBpdGFfIGR1cmFudGUgdW0gaW50ZXJ2YWxvIGRlIDUwIGFub3MgKDE5NTcgYXTDqSAyMDA3KS4KUGFyYSB0YW50bywgY29uc3RydWlyZW1vcyB1bSBncsOhZmljbyBkZSBwb250b3MgcXVlIHBvc3N1aSBhbGd1bWFzIGNhcmFjdGVyw61zdGljYXM6IG8gdGFtYW5obyBkbyBwb250byByZWxhY2lvbmEtc2UgYW8gdGFtYW5obyBkYSBwb3B1bGHDp8OjbzsgZSwgYSBjb3IgZG8gcG9udG8gcmVhbGFjaW9uYS1zZSBjb20gbyBjb250aW5lbnRlLiAKCmBgYHtyfQpkYWRvc19nYXBtaW5kZXIgfD4KICBmaWx0ZXIoYW5vICVpbiUgYygxOTU3LCAyMDA3KSkgfD4KICBnZ3Bsb3QoKSArCiAgYWVzKAogICAgeCAgICAgPSBwaWJfcGVyX2NhcGl0YSwKICAgIHkgICAgID0gZXhwZWN0YXRpdmFfZGVfdmlkYSwKICAgIGNvbG9yID0gY29udGluZW50ZSwKICAgIHNpemUgID0gcG9wdWxhY2FvCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBmYWNldF9ncmlkKC5+YW5vKSArCiAgbGFicygKICAgIHRpdGxlID0gIlBpYiBQZXIgQ2FwaXRhIHZzIEV4cGVjdGF0aXZhIGRlIFZpZGEiLAogICAgc3VidGl0bGUgPSAiKG51bSBpbnRlcnZhbG8gZGUgNTAgYW5vcykiLAogICAgeCA9ICJwaWIgcGVyIGNhcGl0YSIsCiAgICB5ID0gImV4cGVjdGF0aXZhIGRlIHZpZGEiCiAgKSArCiAgdGhlbWVfYncoKQpgYGAKCk9ic2VydmUgcXVlLCBlbSAxOTU3LCBow6EgdW0gcGHDrXMgZGEgw4FzaWEgcXVlIHBvc3N1aSB1bSBhbHRvIF9waWIgcGVyIGNhcGl0YV8sIGVtYm9yYSBwb3NzdWEgdW1hIGV4cGVjdGF0aXZhIGRlIHZpZGEgaW5mZXJpb3IgYW9zIDYwIGFub3MuIEVzc2UgYWx0byBfcGliXyBhY2Fib3UgcG9yICJhZ2x1dGluYXIiIG9zIGRvcyBvdXRyb3MgcGHDrXNlcy4gRW50w6NvLCBwYXJhIHVtYSBtZWxob3IgcGVyY2Vww6fDo28gZGVzc2FzIGRpZmVyZW7Dp2FzLCBtdWRhcmVtb3MgYSBlc2NhbGEgZG8gUElCICh1c2FyZW1vcyBhIGVzY2FsYSBsb2dhcsOtdGltYSk6CgoKYGBge3J9CmRhZG9zX2dhcG1pbmRlciB8PgogIGZpbHRlcihhbm8gJWluJSBjKDE5NTcsIDIwMDcpKSB8PgogIGdncGxvdCgpICsKICBhZXMoCiAgICB4ICAgICA9IHBpYl9wZXJfY2FwaXRhLAogICAgeSAgICAgPSBleHBlY3RhdGl2YV9kZV92aWRhLAogICAgY29sb3IgPSBjb250aW5lbnRlLAogICAgc2l6ZSAgPSBwb3B1bGFjYW8KICApICsKICBnZW9tX3BvaW50KCkgKwogIGZhY2V0X2dyaWQoLn5hbm8pICsKICBsYWJzKAogICAgeCA9ICJwaWIgcGVyIGNhcGl0YSIsCiAgICB5ID0gImV4cGVjdGF0aXZhIGRlIHZpZGEiCiAgKSArCiAgdGhlbWVfYncoKSArCiAgc2NhbGVfeF9sb2cxMCgpCmBgYAoKYS4gTyBxdWUgdm9jw6ogcG9kZSBhZmlybWFyLCBkZSB1bWEgZm9ybWEgZ2VyYWwgZSBhcGVuYXMgb2JzZXJ2YW5kbyBvIGdyw6FmaWNvLCBzb2JyZSBhIGV4cGVjdGF2aWRhIGRlIHZpZGEgZG9zIGNvbnRpbmVudGVzPyBFbGEgYXVtZW50b3Ugb3UgZGltaW51aXUgYW8gbG9uZ28gZGVzc2VzIDUwIGFub3MgZW0gcXVlc3TDo28/CmIuIEVtIDE5NTcsIHF1YWwgcGHDrXMgZGEgw4FzaWEgcG9zc3VpYSBvIG1haW9yIFBJQiBfcGVyIGNhcGl0YV8/IEUsIG5lc3NlIG1lc21vIGFubywgcXVhbCBwb3NzdcOtYSBhIG1haW9yIGV4cGVjdGF0aXZhIGRlIHZpZGE/CmMuIEVtIDIwMDcsIGVuY29udHJlIGEgZXhwZWN0YXRpdmEgZGUgdmlkYSBlIG8gcGliIF9wZXIgY2FwaXRhXyBkb3MgZG9pcyBwYcOtc2VzIGRvIGl0ZW0gKGIpLiBPIHF1ZSBhY29udGVjZXU/CmQuIFF1YWlzIHPDo28gb3MgZG9pcyBwYcOtc2VzIGNvbSBtYWlvciBwb3B1bGHDp8OjbyAobWFpb3IgZGnDom1ldHJvIGRvIHBvbnRvKSBlbSAxOTU3IGUgZW0gMjAwNz8gTyBxdWUgYWNvbnRlY2V1IGNvbSBvIHBpYiBwZXIgY2FwaXRhIGUgYSBleHBlY3RhdGl2YSBkZSB2aWRhIGRlbGVzIGVtIDUwIGFub3M/CmUuIEZhw6dhIHVtIGdyw6FmaWNvIGRlIHBvbnRvcyByZWxhY2lvbmFuZG8gX3BpYiBwZXIgY2FwaXRhXyBlIF9leHBlY3RhdGl2YSBkZSB2aWRhXyBkdXJhbnRlIHRvZG9zIG9zIGFub3MgZG8gZGF0YXNldC4gQ29sb3F1ZSB1bWEgcmV0YSBkZSByZWdyZXNzw6NvIG5lc3NlcyBkYWRvcyBlIHJlc3BvbmRhIHNlIGjDoSB1bWEgdGVuZMOqbmNpYSBwb3NpdGl2YSBvdSBuZWdhdGl2YSBlbnRyZSBlc3NhcyB2YXJpw6F2ZWlzLiBVc2UgdW1hIGVzY2FsYSBsb2dhcsOtdGltaWNhIG5vIGVpeG8geCAocGFyYSBpc3NvLCBiYXN0YSBhZGljaW9uYXIgYHNjYWxlX3hfbG9nMTAoKWAgw6AgY2FtYWRhIGRvIGBnZ3Bsb3QoKWApLgoKKipRdWVzdMOjbyAwNS4qKiBBcyBzZWd1aW50ZXMgcGVyZ3VudGFzIGVzdMOjbyByZWxhY2lvbmFkYXMgYW8gY29udGluZW50ZSBBZnJpY2Fuby4gCgphLiBFbmNvbnRyZSBvcyBwYcOtc2VzIGNvbSBtZW5vciBlIG1haW9yIGV4cGVjdGF0aXZhIGRlIHZpZGEgbm8gYW5vIGRlIDE5NTIuCkNoYW1lIG8gcHJpbWVpcm8gZGUgYHBhaXNfbWVub3JgIGUgbyBzZWd1bmRvIGRlIGBwYWlzX21haW9yYC4gU8OjbyBvcyBtZXNtb3MgZW0gMjAwNz8KYi4gTyBzZWd1aW50ZSBjb25qdW50byBkZSBjw7NkaWdvcyBwcm9kdXogdW0gZ3LDoWZpY28gZGUgbGluaGFzIHJlbGFjaW9uYW5kbyBhIGV4cGVjdGF0aXZhIGRlIHZpZGEgYW8gbG9uZ28gZG9zIGFub3MsIGRvcyBwYcOtc2VzIGBwYWlzX21lbm9yYCBlIGBwYWlzX21haW9yYC4KU3Vic3RpdHVhIG9zIG5vbWVzIGFkZXF1YWRvcyBlIHJlc3BvbmRhOiBvcyBncsOhZmljb3Mgc8OjbyBzZW1lbGhhbnRlcz8gCgpgYGB7ciwgZXZhbD1GQUxTRX0KZGFkb3NfZ2FwbWluZGVyIHw+CiAgZmlsdGVyKHBhaXMgJWluJSBjKCJwYWlzX21lbm9yIiwgInBhaXNfbWFpb3IiKSkgfD4KICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBhbm8sIHkgPSBleHBlY3RhdGl2YV9kZV92aWRhLCBjb2xvciA9IHBhaXMsIGdyb3VwID0gcGFpcykgKwogIGdlb21fbGluZSgpICsKICBsYWJzKAogICAgeCA9ICIiLAogICAgeSA9ICIiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKKipRdWVzdMOjbyAwNi4qKiBObyBncsOhZmljbyBkYSBxdWVzdMOjbyBhbnRlcmlvciwgZG8gYHBhaXNfbWVub3JgLCBow6EgdW1hIHF1ZWRhIHZlcnRpZ2lub3NhLCBuYSBkw6ljYWRhIGRlIDkwLCBkYSBleHBlY3RhdGl2YSBkZSB2aWRhLiBQZXNxdWlzZSBzb2JyZSBvIHF1ZSBwb2RlcmlhIHRlciBvY2FzaW9uYWRvIHRhbCBxdWVkYS4KCiMjIyBJLiBTb2JyZSBvIF9kYXRhc2V0XyBgY3Vyc29zX3Byb3VuaS5jc3ZgCgoqKlF1ZXN0w6NvIDA3KiogUGFyYSByZXNwb25kZXIgZXNzYSBxdWVzdMOjbywgY29tcGxldGUgYWRlcXVhZGFtZW50ZSBvIGPDs2RpZ28gYWJhaXhvLCByZWZlcmVudGUgYSBjb25zdHJ1w6fDo28gZGUgdW0gKmJveHBsb3QqICBkYSB2YXJpdsOhdmVsIGBub3RhX2ludGVncmFsX2FtcGxhYCwgYWdydXBhZGFzIHBlbG8gYHR1cm5vYCAoZXN0YW1vcyBjb25zaWRlcmFuZG8gYSB2YXJpw6F2ZWwgYGRhZG9zX2N1cnNvc2AsIGNvbW8gc2VuZG8gbyAqZGF0YXNldCogYGN1cnNvc19wcm91bmkuY3N2YCkuCgpgYGB7ciwgZXZhbD1GQUxTRX0KZGFkb3NfY3Vyc29zICU+JQogIHNlbGVjdCjinZPinZMgLCDinZPinZMpICU+JSAKICBkcm9wX25hKCkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IOKdk+KdkywgeSA9IOKdk+KdkywgZmlsbCA9IOKdk+KdkykgKwogIGdlb21fYm94cGxvdChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgbGFicygKICAgIHRpdGxlID0gIkNvbXBhcmHDp8OjbyBkYXMgbm90YXMgcG9yIHR1cm5vIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIgogICkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKCkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCiAgYS4gUGVsbyBncsOhZmljbywgcXVhbCBkb3MgdHVybm9zIHBvc3N1aSBhIG1haW9yIG1lZGlhbmEgZGFzIG5vdGFzPyBFeHBsaXF1ZS4KICBiLiBRdWFsIGEgbcOpZGlhIGUgYSBtZWRpYW5hIGRvIHR1cm5vIGlkZW50aWZpY2FkbyBubyBpdGVtIGFudGVyaW9yPwogIGMuIFF1YWwgZG9zIGNpbmNvIHR1cm5vcyBwb3NzdWkgbWVub3IgaG9tZWdlbmVpZGFkZSBuYSBub3RhIGludGVncmFsIGFtcGxhPwogIGQuIEZhw6dhIHVtIGdyw6FmaWNvIGRlIGRlbnNpZGFkZSBkZXNzYXMgbm90YXMsIGZhY2V0YW5kby1hcyBub3MgdHVybm9zLiBFc3NlIGdyw6FmaWNvIHRhbWLDqW0gc2VydmlyaWEgcGFyYSBjb21wYXJhciBhcyBub3RhcyBwb3IgdHVybm8/IEV4cGxpcXVlLgoKKipRdWVzdMOjbyAwOC4qKiBRdWFsIGEgcG9zacOnw6NvIG9jdXBhIG8gZXN0YWRvIGRhIEJhaGlhLCBubyBxdWUgc2UgcmVmZXJlIMOgIGZyZXF1w6puY2lhIGFic29sdXRhIGRhIHZhcmnDoXZlbCBgdWZfYnVzY2FgLCBkaXNwb3N0YSBkZSBmb3JtYSBkZWNyZXNjZW50ZT8gCgoqKlF1ZXN0w6NvIDA5LioqIFF1YW50b3MgY3Vyc29zIGZvcmFtIGlkZW50aWZpY2Fkb3MsIGRpc3RpbnRhbWVudGUsIG5hIHZhcmnDoXZlbCBgbm9tZWA/CgoqKlF1ZXN0w6NvIDEwLioqIEFuYWxpc2UgbyBjw7NkaWdvIGFiYWl4byBlIGV4ZWN1dGUtbyAoZXN0YW1vcyBjb25zaWRlcmFuZG8gYSB2YXJpw6F2ZWwgYGRhZG9zX2N1cnNvYCBjb21vIHNlbmRvIG8gKmRhdGFzZXQqIGBjdXJzb3NfcHJvdW5pLmNzdmApLiBPIHF1ZSB2b2PDqiBwb2RlIGNvbmNsdWlyIGNvbSByZXNwZWl0byBhb3MgY3Vyc29zIGV4aWJpZG9zLCBjb21wYXJhdGl2YW1lbnRlPyAoY2l0ZSwgcGVsbyBtZW5vcywgZHVhcyBjYXJhY3RlcsOtc3RpY2FzIGdyw6FmaWNhcykuCgpgYGB7ciwgZXZhbD1GQUxTRX0KZGFkb3NfY3Vyc29zICU+JSAKICBzZWxlY3Qobm9tZSwgbm90YV9pbnRlZ3JhbF9hbXBsYSkgJT4lCiAgZHJvcF9uYSgpICU+JSAKICBmaWx0ZXIobm9tZSA9PSAiTWVkaWNpbmEiIHwgbm9tZSA9PSAiRGlyZWl0byIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKG5vdGFfaW50ZWdyYWxfYW1wbGEsIG5vbWUsIGZpbGwgPSBub21lKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArCiAgbGFicygKICAgIHRpdGxlID0gIkNvbXBhcmHDp8OjbyBlbnRyZSBNZWRpY2luYSBlIERpcmVpdG8iLAogICAgeCA9ICIiLAogICAgeSA9ICIiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKLS0tCgojIyBEaWNhcwoKLSBPcmdhbml6ZSBzZXUgYW1iaWVudGUgZGUgdHJhYmFsaG8gY29tIHVtIFByb2pldG8gZW0gUjsKLSBDYXJyZWdlIG9zIGNvbmp1bnRvcyBkZSBkYWRvcyBzZXBhcmFkYW1lbnRlLCBwb2lzIHNlIGEgbWVtw7NyaWEgZG8gc2V1IGNvbXB1dGFkb3IgZm9yIHBlcXVlbmEsIHBvZGUgY2F1c2FyIGxlbnRpZMOjbzsKICArIFBvciBleGVtcGxvLCBsZWlhIG8gY29uanVudG8gZGUgZGFkb3MgYGNvbnRyYWNoZXF1ZS5jc3ZgLCByZXNvbHZhIGFzIHF1ZXN0w7VlcyByZWZlcmVudGUgYSBlc3NlIHTDs3BpY28gZSBkZXBvaXMsIG5vIGNvbnNvbGUsIGRpZ2l0ZSBgcm0obGlzdCA9IGxzKCkpYC4gQcOtIMOpIHPDsyBjYXJyZWdhciB1bSBvdXRybyBjb25qdW50byBkZSBkYWRvcy4KICArIE8gY29tYW5kbyBgcm0obGlzdCA9IGxzKCkpYCBsaW1wYSBhIG1lbcOzcmlhIGFybWF6ZW5hZGEgYXTDqSBhcXVlbGUgbW9tZW50byBwZWxhcyB2YXJpw6F2ZWlzIG5vIGBSYC4KLSBRdWFuZG8gZGVzZWphLXNlIGNvbXBhcmFyIHF1YWwgZGFzIHZhcmnDoXZlaXMgw6kgYSBtYWlzICoqaG9tb2fDqm5lYSoqIChRdWVzdMOjbyAwMSwgaXRlbSBjKSwgw6kgbmVjZXNzw6FyaW8gY29tcGFyYXIgYSB2YXJpYWJpbGlkYWRlIGVtIHJlbGHDp8OjbyDDoCBtw6lkaWEuIFNlIGEgbcOpZGlhIMOpIGlndWFsIGVtIGNhZGEgZ3J1cG8sIHVzYW1vcyBvICoqZGVzdmlvIHBhZHLDo28qKi4gClRvZGF2aWEsIHNlIGEgbcOpZGlhIGVtIGNhZGEgZ3J1cG8gw6kgZGlmZXJlbnRlLCBwcmVjaXNhbW9zIHBhZHJvbml6YXIgZXNzYSBtZWRpZGE7IGUsIG5lc3NlIGNhc28sIHVzYW1vcyBvICoqY29lZmljaWVudGUgZGUgdmFyaWHDp8OjbyoqIChjdiksIGVtIHBvcmNlbnRhZ2VtLiAKUXVhbnRvIG1lbm9yIGEgcG9yY2VudGFnZW0gZG8gYGN2YCwgbWFpcyBob21vZ8OqbmVhIMOpIGEgZGlzdHJpYnVpw6fDo28gZG8gYG5vdGFfaW50ZWdyYWxfYW1wbGFgLgpEZWZpbmUtc2U6ICQkXHRleHR7Y3Z9ID0gXGZyYWN7XHRleHR7ZGVzdmlvIHBhZHLDo299fXttw6lkaWF9IFxjZG90IDEwMCQkCi0tLQoKYGBge3IsIGV2YWw9RkFMU0V9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC8vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobyBvKQogICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tb09PLS0tLShfKS0tLS0tb09PLS0tLS0tLS0tLS0tLS0tLS0rCiAgICAgICAgICAgICAgICAgICAgfCBfX19fX18gICAgICAgICAgICAgIF9fX19fXyAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICB8IHwgX19fIFwgICAgICAgICAgICAgfCBfX18gXCAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgIHwgfCB8Xy8gLyBfX18gICBfXyBfICB8IHxfLyAvIF9fIF9fX19fICAgX19fXyBfICB8CiAgICAgICAgICAgICAgICAgICAgfCB8IF9fXyBcLyBfIFwgLyBfYCB8IHwgIF9fLyAnX18vIF8gXCBcIC8gLyBfYCB8IHwKICAgICAgICAgICAgICAgICAgICB8IHwgfF8vIC8gKF8pIHwgKF98IHwgfCB8ICB8IHwgfCAoXykgXCBWIC8gKF98IHwgfAogICAgICAgICAgICAgICAgICAgIHwgXF9fX18vIFxfX18vIFxfXyxffCBcX3wgIHxffCAgXF9fXy8gXF8vIFxfXyxffCB8CiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X198X198CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvb08gT29vCmBgYAo=