Lendo os dados
l_gonzaga = read_csv(here("data/gonzaga_musicas.csv"))
-- Column specification --------------------------------------------------------------------------------------
cols(
.default = col_double(),
album_uri = col_character(),
album_name = col_character(),
album_img = col_character(),
album_release_date = col_character(),
album_release_year = col_date(format = ""),
track_name = col_character(),
track_uri = col_character(),
key = col_character(),
mode = col_character(),
key_mode = col_character()
)
i Use `spec()` for the full column specifications.
Nessa nossa primeira análise iremos mostrar dois valores, conhecidos como:
- Energy: Normalmente, faixas energéticas que se parecem rápidas, altas e barulhentas
- Valence: Faixas com alta valência soam mais positivas (por exemplo, feliz, alegre, eufórico), enquanto faixas com baixa valência soam mais negativas (por exemplo, triste, deprimido, com raiva)
Vamos começar nossa análise buscando explorar quais são os 10 albuns mais e menos populares do Luiz gonzaga, podemos tentar visualizar se esses albuns possuem similaridades ou diferenças de tal maneira que o fizeram se destacar ou não, observando em quesitos de energia e valência.
pop_albuns = l_gonzaga %>%
group_by(album_name) %>%
summarise(album_popularity = max(album_popularity))
menos_pop = pop_albuns[order(pop_albuns$album_popularity),] %>%
head(10)
menos_pop = l_gonzaga %>%
filter(album_name %in% menos_pop$album_name)
mais_pop = pop_albuns[order(pop_albuns$album_popularity),] %>%
tail(10)
mais_pop = l_gonzaga %>%
filter(album_name %in% mais_pop$album_name)
menos_pop$pop <- 'menos popular'
mais_pop$pop <- 'mais popular'
pops <- rbind(menos_pop, mais_pop)
pops %>%
arrange(album_release_date) %>%
ggplot(aes(x = energy,
group = pop,
label = track_name,
y = valence)) +
stat_density2d(aes(fill=..level..), geom="polygon", n = 100, h = .25) +
scale_fill_viridis() + # escalas de cores contínuas mais legíveis que as default
# geom_density2d() + # ou o stat_density ou geom_density
facet_wrap(~pop) +
scale_x_continuous(limits = c(-.05, 1.05)) +
scale_y_continuous(limits = c(-.05, 1.05)) +
theme(legend.position = "None") +
labs(title = "Emoção nas gravações tropicalistas segundo o spotify",
subtitle = "A partir da análise de áudio de algumas centenas de faixas de cada um",
x = "Energia (+ = rápida, alta, cheia de sons)",
y = "Valência (+ = animada, alegre, eufórica)")

Aqui temos um gráfico de densidade para as músicas dos 10 albuns mais e menos populares do Luiz gonzaga, a princípio poderíamos pensar que os albuns menos populares pudessem ser diferentes se tratando de ambas as características, energia e valência, porém vemos no gráfico que o rei do baião se manteve com sua identidade com músicas mais animadas, alegres e rápidas.
Tá mais e ai ? será que os anos de lançamento dos albuns influenciaram na popularidade das músicas do Luiz gonzaga ?
# Plot
pops %>%
mutate(album_name = fct_reorder(album_name, album_release_year)) %>%
ggplot( aes(y=album_release_year, x=album_popularity, fill=album_name)) +
geom_density_ridges(alpha=0.6, stat="binline", bins=20) +
theme_ridges(
center = TRUE
) +
labs(title = "Popularidade dos albuns do Luiz Gonzaga ao longo dos anos") +
theme(
plot.title = element_text(hjust = 0.5),
legend.position="bottom",
panel.spacing = unit(0.1, "lines"),
strip.text.x = element_text(size = 2)
) +
xlab("Popularidade do album") +
ylab("Ano de lançamento do album") +
guides(fill=guide_legend(title="Nome do album"))

Com esse gráfico podemos observar que para os nossos 20 albuns anteriormente escolhidos como, 10 mais populares e 10 menos populares, a sua distribuição de popularidade ao longo dos anos possui um evidente limiar a partir dos albuns lançados entre os anos de 1990 e 2000, isso não quer dizer que seus albuns mais famosos foram lançados a partir dessa data, até porque ele faleceu no ano de 1989, oque podemos tentar sugerir é que alguns albuns conhecidos foram provavelmente re-lançados com melhor qualidade e portanto se torna um fator importante para as pessoas que querem escutar suas músicas.
Para finalizar que tal tentarmos obter a correlação entre todas os seguintes dados para cada música.
- danceability: Descreve como uma faixa é adequada para dançar combinando elementos musicais; tempo, ritmo, batida e regularidade geral
- energy: Normalmente, faixas energéticas que se parecem rápidas, altas e barulhentas.
- loudness: O volume ou nível de audibilidade do som.
- speechiness: Detecta a presença de palavras faladas em uma faixa.
- acoustiness: Representa se a faixa é acústica ou não.
- instrumentalness: Este valor representa a quantidade de vocais na música, ou seja, quanto mais próximo a 1 mais significia que é uma música instrumental.
- liveness: Este valor descreve a probabilidade de a música ter sido gravada com um público ao vivo.
- valence: Faixas com alta valência soam mais positivas (por exemplo, feliz, alegre, eufórico), enquanto faixas com baixa valência soam mais negativas (por exemplo, triste, deprimido, com raiva).
- Tempo da música: :p
- Tonalidade da música: :p
- Popularidade da música: :p
OBS: Para a tonalidade da música, que pode ser maior ou menor, optamos por transformar o dado em 1 para músicas com tonalidade maior e -1 para músicas com tonalidade menor.
new_l_gonzaga <- l_gonzaga %>%
mutate(mode_c = ifelse(test = (mode == 'major'),
yes = 1,
no = -1
)) %>%
select(danceability, energy, loudness, speechiness, acousticness, instrumentalness, liveness, valence, tempo, mode_c, track_popularity)
ggp = ggpairs(new_l_gonzaga, title="Correlações")
print(ggp, progress = F) # no progress bar

Podemos visualizar que os seguintes dados possuem um certa e esperada correlação entre si!
- Valence e Danceability: Faz sentido! visto que ambas indicam músicas com volume mais altos ou mais animadas.
- Valence e Energy: Aqui o mesmo se repete! para músicas altas, rápidas e barulhentas.
- Acoustiness e Energy: Interessante! aqui para as músicas do Luiz, quanto mais acustica é a música, mais ela tende a ter valores menores de energia, e vice e versa.
- Loudness e Energy: Similar as outras correlações vistas, dado que o volume da música tende a aumentar quando ela é mais animada!
LS0tDQp0aXRsZTogIkFuw6FsaXNlIGRhcyBtw7pzaWNhcyBkZSBMdWl6IEdvbnphZ2Egbm8gU3BvdGlmeSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyMgQW7DoWxpc2UgZSBwZXNxdWlzYSBmZWl0YXMgcG9yOg0KDQotIExlb25hcmRvIExpbWEgRmVsaXggZGEgU2lsdmEsIGluc3RhZ3JhbTogQGxlb19taXJhY2gNCi0gSm9zw6kgQXVndXN0byBCZXplcnJhIE5ldG8sIGluc3RhZ3JhbTogQGF1Z3VzdG9ubnQNCg0KQmVtIHZpbmRvcyBhIGVzdGEgaHVtaWxkZSBwb3N0YWdlbSBxdWUgdGVudGFyw6EgdmlzdWFsaXphciBhbGd1bWFzIGluZm9ybWHDp8O1ZXMgY29udGlkYXMgbm9zIGRhZG9zIGRhcyBtw7pzaWNhcyBkbyByZWkgZG8gYmFpw6NvIChjb25mZXNzbyBxdWUgZXN0b3UgZXNjdXRhbmRvIGFnb3JhIG1lc21vKS4NCkEgcHJpbmPDrXBpbyBwb2RlbW9zIG9ic2VydmFyIGNvbW8gc8OjbyBjb21wb3N0b3Mgbm9zc29zIGRhZG9zIGV4dHJhw61kb3MgZGEgQVBJIGRvIFNwb3RpZnksIHF1YWlzIGNhbXBvcyB0ZW1vcyA/IHF1YWlzIHNldXMgdGlwb3MgPyBjb21vIHBvZGVtb3MgdmlzdWFsaXrDoS1sb3MgbWVsaG9yID8NCg0KIyMjIyBJbXBvcnRhbmRvIGxpYnMNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShoZXJlKQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShnZ3JpZGdlcykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeShHR2FsbHkpDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCmBgYA0KDQojIyMjIExlbmRvIG9zIGRhZG9zDQoNCmBgYHtyfQ0KbF9nb256YWdhID0gcmVhZF9jc3YoDQogICAgaGVyZSgiZGF0YS9nb256YWdhX211c2ljYXMuY3N2IiksDQogICAgY29sX3R5cGVzID0gY29scygNCiAgICAgIC5kZWZhdWx0ID0gY29sX2RvdWJsZSgpLA0KICAgICAgYWxidW1fdXJpID0gY29sX2NoYXJhY3RlcigpLA0KICAgICAgYWxidW1fbmFtZSA9IGNvbF9jaGFyYWN0ZXIoKSwNCiAgICAgIGFsYnVtX2ltZyA9IGNvbF9jaGFyYWN0ZXIoKSwNCiAgICAgIGFsYnVtX3JlbGVhc2VfZGF0ZSA9IGNvbF9jaGFyYWN0ZXIoKSwNCiAgICAgIGFsYnVtX3JlbGVhc2VfeWVhciA9IGNvbF9kYXRlKGZvcm1hdCA9ICIiKSwNCiAgICAgIHRyYWNrX25hbWUgPSBjb2xfY2hhcmFjdGVyKCksDQogICAgICB0cmFja191cmkgPSBjb2xfY2hhcmFjdGVyKCksDQogICAgICBrZXkgPSBjb2xfY2hhcmFjdGVyKCksDQogICAgICBtb2RlID0gY29sX2NoYXJhY3RlcigpLA0KICAgICAga2V5X21vZGUgPSBjb2xfY2hhcmFjdGVyKCkNCiAgICApDQopDQpgYGANCg0KTmVzc2Egbm9zc2EgcHJpbWVpcmEgYW7DoWxpc2UgaXJlbW9zIG1vc3RyYXIgZG9pcyB2YWxvcmVzLCBjb25oZWNpZG9zIGNvbW86IA0KDQotICoqRW5lcmd5OioqIE5vcm1hbG1lbnRlLCBmYWl4YXMgZW5lcmfDqXRpY2FzIHF1ZSBzZSBwYXJlY2VtIHLDoXBpZGFzLCBhbHRhcyBlIGJhcnVsaGVudGFzDQotICoqVmFsZW5jZToqKiBGYWl4YXMgY29tIGFsdGEgdmFsw6puY2lhIHNvYW0gbWFpcyBwb3NpdGl2YXMgKHBvciBleGVtcGxvLCBmZWxpeiwgYWxlZ3JlLCBldWbDs3JpY28pLCBlbnF1YW50byBmYWl4YXMgY29tIGJhaXhhIHZhbMOqbmNpYSBzb2FtIG1haXMgbmVnYXRpdmFzIChwb3IgZXhlbXBsbywgdHJpc3RlLCBkZXByaW1pZG8sIGNvbSByYWl2YSkNCg0KKipWYW1vcyBjb21lw6dhcioqIG5vc3NhIGFuw6FsaXNlIGJ1c2NhbmRvIGV4cGxvcmFyIHF1YWlzIHPDo28gb3MgMTAgYWxidW5zIG1haXMgZSBtZW5vcyBwb3B1bGFyZXMgZG8gTHVpeiBnb256YWdhLCBwb2RlbW9zIHRlbnRhciB2aXN1YWxpemFyIHNlIGVzc2VzIGFsYnVucyBwb3NzdWVtIHNpbWlsYXJpZGFkZXMgb3UgZGlmZXJlbsOnYXMgZGUgdGFsIG1hbmVpcmEgcXVlIG8gZml6ZXJhbSBzZSBkZXN0YWNhciBvdSBuw6NvLCBvYnNlcnZhbmRvIGVtIHF1ZXNpdG9zIGRlIGVuZXJnaWEgZSB2YWzDqm5jaWEuDQoNCmBgYHtyfQ0KcG9wX2FsYnVucyA9IGxfZ29uemFnYSAlPiUNCiAgICBncm91cF9ieShhbGJ1bV9uYW1lKSAlPiUNCiAgICBzdW1tYXJpc2UoYWxidW1fcG9wdWxhcml0eSA9IG1heChhbGJ1bV9wb3B1bGFyaXR5KSkNCg0KbWVub3NfcG9wID0gcG9wX2FsYnVuc1tvcmRlcihwb3BfYWxidW5zJGFsYnVtX3BvcHVsYXJpdHkpLF0gJT4lDQogICAgaGVhZCgxMCkNCg0KbWVub3NfcG9wID0gbF9nb256YWdhICU+JSANCiAgICBmaWx0ZXIoYWxidW1fbmFtZSAlaW4lIG1lbm9zX3BvcCRhbGJ1bV9uYW1lKQ0KDQptYWlzX3BvcCA9IHBvcF9hbGJ1bnNbb3JkZXIocG9wX2FsYnVucyRhbGJ1bV9wb3B1bGFyaXR5KSxdICU+JQ0KICAgIHRhaWwoMTApDQoNCm1haXNfcG9wID0gbF9nb256YWdhICU+JSANCiAgICBmaWx0ZXIoYWxidW1fbmFtZSAlaW4lIG1haXNfcG9wJGFsYnVtX25hbWUpDQoNCm1lbm9zX3BvcCRwb3AgPC0gJ21lbm9zIHBvcHVsYXInDQptYWlzX3BvcCRwb3AgPC0gJ21haXMgcG9wdWxhcicNCg0KcG9wcyA8LSByYmluZChtZW5vc19wb3AsIG1haXNfcG9wKQ0KYGBgDQoNCg0KYGBge3J9DQpwb3BzICU+JSANCiAgICBhcnJhbmdlKGFsYnVtX3JlbGVhc2VfZGF0ZSkgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGVuZXJneSwgDQogICAgICAgICAgICAgICBncm91cCA9IHBvcCwNCiAgICAgICAgICAgICAgIGxhYmVsID0gdHJhY2tfbmFtZSwNCiAgICAgICAgICAgICAgIHkgPSB2YWxlbmNlKSkgKyANCiAgICBzdGF0X2RlbnNpdHkyZChhZXMoZmlsbD0uLmxldmVsLi4pLCBnZW9tPSJwb2x5Z29uIiwgbiA9IDEwMCwgaCA9IC4yNSkgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsgICMgZXNjYWxhcyBkZSBjb3JlcyBjb250w61udWFzIG1haXMgbGVnw612ZWlzIHF1ZSBhcyBkZWZhdWx0DQogICAgIyBnZW9tX2RlbnNpdHkyZCgpICsgIyBvdSBvIHN0YXRfZGVuc2l0eSBvdSBnZW9tX2RlbnNpdHkNCiAgICBmYWNldF93cmFwKH5wb3ApICsgDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLS4wNSwgMS4wNSkpICsgDQogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLS4wNSwgMS4wNSkpICsgDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIk5vbmUiKSArIA0KICAgIGxhYnModGl0bGUgPSAiRW1vw6fDo28gbmFzIGdyYXZhw6fDtWVzIHRyb3BpY2FsaXN0YXMgc2VndW5kbyBvIHNwb3RpZnkiLCANCiAgICAgICAgIHN1YnRpdGxlID0gIkEgcGFydGlyIGRhIGFuw6FsaXNlIGRlIMOhdWRpbyBkZSBhbGd1bWFzIGNlbnRlbmFzIGRlIGZhaXhhcyBkZSBjYWRhIHVtIiwgDQogICAgICAgICB4ID0gIkVuZXJnaWEgKCsgPSByw6FwaWRhLCBhbHRhLCBjaGVpYSBkZSBzb25zKSIsIA0KICAgICAgICAgeSA9ICJWYWzDqm5jaWEgKCsgPSBhbmltYWRhLCBhbGVncmUsIGV1ZsOzcmljYSkiKQ0KYGBgDQpBcXVpIHRlbW9zIHVtIGdyw6FmaWNvIGRlIGRlbnNpZGFkZSBwYXJhIGFzIG3DunNpY2FzIGRvcyAxMCBhbGJ1bnMgbWFpcyBlIG1lbm9zIHBvcHVsYXJlcyBkbyBMdWl6IGdvbnphZ2EsIGEgcHJpbmPDrXBpbyBwb2RlcsOtYW1vcyBwZW5zYXIgcXVlIG9zIGFsYnVucyBtZW5vcyBwb3B1bGFyZXMgcHVkZXNzZW0gc2VyIGRpZmVyZW50ZXMgc2UgdHJhdGFuZG8gZGUgYW1iYXMgYXMgY2FyYWN0ZXLDrXN0aWNhcywgZW5lcmdpYSBlIHZhbMOqbmNpYSwgcG9yw6ltIHZlbW9zIG5vIGdyw6FmaWNvIHF1ZSBvIHJlaSBkbyBiYWnDo28gc2UgbWFudGV2ZSBjb20gc3VhIGlkZW50aWRhZGUgY29tIG3DunNpY2FzIG1haXMgYW5pbWFkYXMsIGFsZWdyZXMgZSByw6FwaWRhcy4gIA0KDQoqKlTDoSBtYWlzIGUgYWkgPyoqIHNlcsOhIHF1ZSBvcyBhbm9zIGRlIGxhbsOnYW1lbnRvIGRvcyBhbGJ1bnMgaW5mbHVlbmNpYXJhbSBuYSBwb3B1bGFyaWRhZGUgZGFzIG3DunNpY2FzIGRvIEx1aXogZ29uemFnYSA/DQoNCmBgYHtyLCBmaWcud2lkdGggPSAyMiwgZmlnLmhlaWdodD0gOH0NCiMgUGxvdA0KcG9wcyAlPiUNCiAgbXV0YXRlKGFsYnVtX25hbWUgPSBmY3RfcmVvcmRlcihhbGJ1bV9uYW1lLCBhbGJ1bV9yZWxlYXNlX3llYXIpKSAlPiUNCiAgZ2dwbG90KCBhZXMoeT1hbGJ1bV9yZWxlYXNlX3llYXIsIHg9YWxidW1fcG9wdWxhcml0eSwgZmlsbD1hbGJ1bV9uYW1lKSkgKw0KICAgIGdlb21fZGVuc2l0eV9yaWRnZXMoYWxwaGE9MC42LCBzdGF0PSJiaW5saW5lIiwgYmlucz0yMCkgKw0KICAgIHRoZW1lX3JpZGdlcygNCiAgICAgICAgY2VudGVyID0gVFJVRQ0KICAgICkgKw0KICAgIGxhYnModGl0bGUgPSAiUG9wdWxhcmlkYWRlIGRvcyBhbGJ1bnMgZG8gTHVpeiBHb256YWdhIGFvIGxvbmdvIGRvcyBhbm9zIikgKw0KICAgIHRoZW1lKA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJib3R0b20iLA0KICAgICAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCgwLjEsICJsaW5lcyIpLA0KICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIpDQogICAgKSArDQogICAgeGxhYigiUG9wdWxhcmlkYWRlIGRvIGFsYnVtIikgKw0KICAgIHlsYWIoIkFubyBkZSBsYW7Dp2FtZW50byBkbyBhbGJ1bSIpICsNCiAgICBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQodGl0bGU9Ik5vbWUgZG8gYWxidW0iKSkNCmBgYA0KQ29tIGVzc2UgZ3LDoWZpY28gcG9kZW1vcyBvYnNlcnZhciBxdWUgcGFyYSBvcyBub3Nzb3MgMjAgYWxidW5zIGFudGVyaW9ybWVudGUgZXNjb2xoaWRvcyBjb21vLCAxMCBtYWlzIHBvcHVsYXJlcyBlIDEwIG1lbm9zIHBvcHVsYXJlcywgYSBzdWEgZGlzdHJpYnVpw6fDo28gZGUgcG9wdWxhcmlkYWRlIGFvIGxvbmdvIGRvcyBhbm9zIHBvc3N1aSB1bSBldmlkZW50ZSBsaW1pYXIgYSBwYXJ0aXIgZG9zIGFsYnVucyBsYW7Dp2Fkb3MgZW50cmUgb3MgYW5vcyBkZSAxOTkwIGUgMjAwMCwgaXNzbyBuw6NvIHF1ZXIgZGl6ZXIgcXVlIHNldXMgYWxidW5zIG1haXMgZmFtb3NvcyBmb3JhbSBsYW7Dp2Fkb3MgYSBwYXJ0aXIgZGVzc2EgZGF0YSwgYXTDqSBwb3JxdWUgZWxlIGZhbGVjZXUgbm8gYW5vIGRlIDE5ODksIG9xdWUgcG9kZW1vcyB0ZW50YXIgc3VnZXJpciDDqSBxdWUgYWxndW5zIGFsYnVucyBjb25oZWNpZG9zIGZvcmFtIHByb3ZhdmVsbWVudGUgcmUtbGFuw6dhZG9zIGNvbSBtZWxob3IgcXVhbGlkYWRlIGUgcG9ydGFudG8gc2UgdG9ybmEgdW0gZmF0b3IgaW1wb3J0YW50ZSBwYXJhIGFzIHBlc3NvYXMgcXVlIHF1ZXJlbSBlc2N1dGFyIHN1YXMgbcO6c2ljYXMuDQoNCioqUGFyYSBmaW5hbGl6YXIqKiBxdWUgdGFsIHRlbnRhcm1vcyBvYnRlciBhIGNvcnJlbGHDp8OjbyBlbnRyZSB0b2RhcyBvcyBzZWd1aW50ZXMgZGFkb3MgcGFyYSBjYWRhIG3DunNpY2EuIA0KDQotICoqZGFuY2VhYmlsaXR5OioqIERlc2NyZXZlIGNvbW8gdW1hIGZhaXhhIMOpIGFkZXF1YWRhIHBhcmEgZGFuw6dhciBjb21iaW5hbmRvIGVsZW1lbnRvcyBtdXNpY2FpczsgdGVtcG8sIHJpdG1vLCBiYXRpZGEgZSByZWd1bGFyaWRhZGUgZ2VyYWwNCi0gKiplbmVyZ3k6KiogTm9ybWFsbWVudGUsIGZhaXhhcyBlbmVyZ8OpdGljYXMgcXVlIHNlIHBhcmVjZW0gcsOhcGlkYXMsIGFsdGFzIGUgYmFydWxoZW50YXMuDQotICoqbG91ZG5lc3M6KiogTyB2b2x1bWUgb3UgbsOtdmVsIGRlIGF1ZGliaWxpZGFkZSBkbyBzb20uDQotICoqc3BlZWNoaW5lc3M6KiogRGV0ZWN0YSBhIHByZXNlbsOnYSBkZSBwYWxhdnJhcyBmYWxhZGFzIGVtIHVtYSBmYWl4YS4NCi0gKiphY291c3RpbmVzczoqKiBSZXByZXNlbnRhIHNlIGEgZmFpeGEgw6kgYWPDunN0aWNhIG91IG7Do28uDQotICoqaW5zdHJ1bWVudGFsbmVzczoqKiBFc3RlIHZhbG9yIHJlcHJlc2VudGEgYSBxdWFudGlkYWRlIGRlIHZvY2FpcyBuYSBtw7pzaWNhLCBvdSBzZWphLCBxdWFudG8gbWFpcyBwcsOzeGltbyBhIDEgbWFpcyBzaWduaWZpY2lhIHF1ZSDDqSB1bWEgbcO6c2ljYSBpbnN0cnVtZW50YWwuDQotICoqbGl2ZW5lc3M6KiogRXN0ZSB2YWxvciBkZXNjcmV2ZSBhIHByb2JhYmlsaWRhZGUgZGUgYSBtw7pzaWNhIHRlciBzaWRvIGdyYXZhZGEgY29tIHVtIHDDumJsaWNvIGFvIHZpdm8uDQotICoqdmFsZW5jZToqKiBGYWl4YXMgY29tIGFsdGEgdmFsw6puY2lhIHNvYW0gbWFpcyBwb3NpdGl2YXMgKHBvciBleGVtcGxvLCBmZWxpeiwgYWxlZ3JlLCBldWbDs3JpY28pLCBlbnF1YW50byBmYWl4YXMgY29tIGJhaXhhIHZhbMOqbmNpYSBzb2FtIG1haXMgbmVnYXRpdmFzIChwb3IgZXhlbXBsbywgdHJpc3RlLCBkZXByaW1pZG8sIGNvbSByYWl2YSkuDQotICoqVGVtcG8gZGEgbcO6c2ljYToqKiA6cA0KLSAqKlRvbmFsaWRhZGUgZGEgbcO6c2ljYToqKiA6cA0KLSAqKlBvcHVsYXJpZGFkZSBkYSBtw7pzaWNhOioqIDpwDQoNCk9CUzogUGFyYSBhIHRvbmFsaWRhZGUgZGEgbcO6c2ljYSwgcXVlIHBvZGUgc2VyIG1haW9yIG91IG1lbm9yLCBvcHRhbW9zIHBvciB0cmFuc2Zvcm1hciBvIGRhZG8gZW0gMSBwYXJhIG3DunNpY2FzIGNvbSB0b25hbGlkYWRlIG1haW9yIGUgLTEgcGFyYSBtw7pzaWNhcyBjb20gdG9uYWxpZGFkZSBtZW5vci4NCg0KYGBge3IsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm5ld19sX2dvbnphZ2EgPC0gbF9nb256YWdhICU+JQ0KICAgIG11dGF0ZShtb2RlX2MgPSBpZmVsc2UodGVzdCA9IChtb2RlID09ICdtYWpvcicpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vID0gLTENCiAgICApKSAlPiUgDQogICAgc2VsZWN0KGRhbmNlYWJpbGl0eSwgZW5lcmd5LCBsb3VkbmVzcywgc3BlZWNoaW5lc3MsIGFjb3VzdGljbmVzcywgaW5zdHJ1bWVudGFsbmVzcywgbGl2ZW5lc3MsIHZhbGVuY2UsIHRlbXBvLCBtb2RlX2MsIHRyYWNrX3BvcHVsYXJpdHkpDQoNCmdncCA9IGdncGFpcnMobmV3X2xfZ29uemFnYSwgdGl0bGU9IkNvcnJlbGHDp8O1ZXMiKSANCnByaW50KGdncCwgcHJvZ3Jlc3MgPSBGKSAgIyBubyBwcm9ncmVzcyBiYXINCmBgYA0KUG9kZW1vcyB2aXN1YWxpemFyIHF1ZSBvcyBzZWd1aW50ZXMgZGFkb3MgcG9zc3VlbSB1bSBjZXJ0YSBlIGVzcGVyYWRhIGNvcnJlbGHDp8OjbyBlbnRyZSBzaSENCg0KLSAqKlZhbGVuY2UgZSBEYW5jZWFiaWxpdHkqKjogRmF6IHNlbnRpZG8hIHZpc3RvIHF1ZSBhbWJhcyBpbmRpY2FtIG3DunNpY2FzIGNvbSB2b2x1bWUgbWFpcyBhbHRvcyBvdSBtYWlzIGFuaW1hZGFzLg0KLSAqKlZhbGVuY2UgZSBFbmVyZ3kqKjogQXF1aSBvIG1lc21vIHNlIHJlcGV0ZSEgcGFyYSBtw7pzaWNhcyBhbHRhcywgcsOhcGlkYXMgZSBiYXJ1bGhlbnRhcy4NCi0gKipBY291c3RpbmVzcyBlIEVuZXJneSoqOiBJbnRlcmVzc2FudGUhIGFxdWkgcGFyYSBhcyBtw7pzaWNhcyBkbyBMdWl6LCBxdWFudG8gbWFpcyBhY3VzdGljYSDDqSBhIG3DunNpY2EsIG1haXMgZWxhIHRlbmRlIGEgdGVyIHZhbG9yZXMgbWVub3JlcyBkZSBlbmVyZ2lhLCBlIHZpY2UgZSB2ZXJzYS4NCi0gKipMb3VkbmVzcyBlIEVuZXJneSoqOiBTaW1pbGFyIGFzIG91dHJhcyBjb3JyZWxhw6fDtWVzIHZpc3RhcywgZGFkbyBxdWUgbyB2b2x1bWUgZGEgbcO6c2ljYSB0ZW5kZSBhIGF1bWVudGFyIHF1YW5kbyBlbGEgw6kgbWFpcyBhbmltYWRhIQ0K