Regressão Romântica

Os dados

Temos dados descrevendo 5000 encontros relâmpagos (speed dating, procura no google) de 4 minutos envolvendo 310 jovens americanos. Os dados originais foram coletados por professores da Columbia Business School no experimento descrito aqui. Aqui estamos usando uma versão com menos colunas para agilizar para vocês.

Os participantes tinham vários encontros de 4 minutos por noite. Após cada um, preenchiam fichas avaliando aqueles com quem se encontraram. Cada linha nos dados representa um desses encontros.

As perguntas

O que causa atração à primeira vista? E como isso varia para diferentes sexos? Pessoas de diferentes backgrounds? O que são as características mais e menos importantes para um homem/mulher ser percebido bem em um speed date? Que grupos são mais otimistas e pessimistas após o encontro?

As variáveis

OBS : NAs serão omitidas.

  • iid : id do participante p1 no encontro
  • gender : sexo do p1, 0 = mulher
  • order : dos vários encontros realizados em uma noite, esse foi o n-ésimo, segundo essa variável
  • pid : id do participante p2
  • int_corr : correlação entre os interesses de p1 e p2
  • samerace : p1 e p2 são da mesma raça?
  • age_o : idade de p2
  • age : idade de p1
  • field : campo de estudo de p1
  • race : raça de p1. O código é Black/African American=1; European/Caucasian-American=2; Latino/Hispanic American=3; Asian/Pacific Islander/Asian-American=4; Native American=5; Other=6
  • from : de onde p1 é
  • career : que carreira p1 quer seguir
  • sports, tvsports, exercise, dining, museums, art, hiking, gaming, clubbing, reading, tv, theater, movies, concerts, music, shopping, yoga : De 1 a 10, quão interessado p1 é em cada uma dessas atividades.
  • attr : quão atraente p1 achou p2
  • sinc : quão sincero p1 achou p2
  • intel : quão inteligente p1 achou p2
  • fun : quão divertido p1 achou p2
  • amb : quão ambicioso p1 achou p2
  • shar : quanto p1 achou que compartilha interesses e hobbies com p2
  • like : no geral, quanto p1 gostou de p2?
  • prob : que probabiliade p1 acha que p2 tem de querer se encontrar novamente com p- (escala 1-10)
  • attr3_s : quanto p1 acha que é atraente
  • sinc3_s : quanto p1 acha que é sincero
  • intel3_s : quanto p1 acha que é inteligente
  • fun3_s : quanto p1 acha que é divertido
  • amb3_s : quanto p1 acha que é ambicioso
dados <- read_csv("speed-dating/speed-dating2.csv")
Rows: 4918 Columns: 44
-- Column specification ---------------------------------------------------------------------------------------
Delimiter: ","
chr  (4): field, from, career, dec
dbl (40): iid, gender, order, pid, int_corr, samerace, age_o, age, race, sports, tvsports, exercise, dining...

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
dados <- dados %>%
  select(dec, attr, intel, music, fun) %>% 
  na.omit() %>% 
  mutate(dec = as.factor(dec))
#ggpairs(dados, progress = F)
glimpse(dados)
Rows: 4,649
Columns: 5
$ dec   <fct> yes, yes, yes, yes, yes, no, yes, no, yes, yes, no, no, no, yes, no, no, yes, no, yes, yes, no,~
$ attr  <dbl> 6, 7, 5, 7, 5, 4, 7, 4, 7, 5, 5, 8, 5, 7, 6, 8, 7, 5, 7, 6, 7, 9, 7, 9, 9, 8, 8, 7, 9, 8, 4, 8,~
$ intel <dbl> 7, 7, 9, 8, 7, 7, 7, 7, 8, 6, 8, 6, 9, 7, 7, 8, 9, 7, 8, 8, 10, 9, 9, 9, 10, 10, 10, 9, 9, 9, 8~
$ music <dbl> 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, 7,~
$ fun   <dbl> 7, 8, 8, 7, 7, 4, 4, 6, 9, 8, 4, 6, 6, 6, 9, 3, 6, 5, 9, 7, 7, 8, 7, 7, 10, 7, 7, 8, 9, 7, 5, 1~

EDA

Para nossa análise, utilizaremos apenas as variáveis:

  • attr : quão atraente p1 achou p
  • fun : quão divertido p1 achou p2
  • intel : quão inteligente p1 achou p2
  • music : o quanto participante gosta de música
a = dados %>% 
  ggplot(aes(x = music, fill = dec)) + 
  geom_bar(position = "dodge")

b = dados %>% 
  ggplot(aes(x = attr, fill = dec)) + 
  geom_bar(position = "dodge")

c = dados %>% 
  ggplot(aes(x = intel, fill = dec)) + 
  geom_bar(position = "dodge")

d = dados %>% 
  ggplot(aes(x = fun, fill = dec)) + 
  geom_bar(position = "dodge")

grid.arrange(a,b,c,d)

Com o gráfico apresentado acima, podemos observar que ser atraente e divertido com pontuações acima de 7 tem mais chances de acontecer um match, enquanto que gostar de música tem peso um pouco menos relevante na hora dos participantes ecolherem se encontrar de novo. Já se a pessoa é inteligente, começa ter um peso um pouco maior (para match positivo) quando a pontuação passa dos 8, porém esses casos acontecem com menor frequência.

Fit

Há um processo semelhante a OLS para encontrar \(b_0\) e \(b_1\) em um modelo do tipo y = exp(b0 + b1 * x) / (1 + exp(b0 + b1 * x)), ou \(y = \frac{e^{b_0 + b_1.X_1}}{1 + e^{b_0 + b_1.X_1}}\).

Ele se chama máxima verossimilhança, ou maximum likelihood. Não vamos discutí-lo em detalhes, mas vale saber que não há forma fechada para os coeficientes, mas há solução eficiente mesmo para muitas variáveis.

Interpretação

Lembre que temos escrito \(y\), mas nossa variável de resposta é \(p(y = 1 | x)\), ou seja, a probabilidade de \(y=1\) dado o valor de \(x\). Para facilitar, vamos escrever \(p(x)\) para significar \(p(y = 1 | x)\). Se manipularmos \(p(x) = \frac{e^{b_0 + b_1.X_1}}{1 + e^{b_0 + b_1.X_1}}\), chegamos facilmente em:

\(\frac{p(x)}{1-p(x)} = e^{b_0 + b_1.X_1} = e^{b_0}. e^{b_1.X_1}\) O termo \(\frac{p(x)}{1-p(x)}\) tem uma interpretação: ele é o odds do evento \(y = 1\), que é a razão entre a probabilidade de y ser 1 e de y ser 0 quando x tem um certo valor. Ou “quão maior é a chance de y ser 1 do que ser 0”, dado x.

Isso é útil porque \(X_1\) tem um efeito interpretável no odds:

\(x =0: odds = e^{b_0}. e^{b_1.0} = e^{b_0}\\ x =1: odds = e^{b_0}. e^{b_1.1} = e^{b_0}. e^{b_1}\\ x =2: odds = e^{b_0}. e^{b_1.2} = e^{b_0}. e^{b_1}. e^{b_1}\\\)

Ou seja, aumentar uma unidade em \(X_1\) multiplica o odds por $e^{b_1}$. Repare que essa não é uma interpretação do efeito de $X_1$ em $p(x)$. A relação entre $X_1$ em $p(x)$ é mais complexa e não tem uma interpretação mais intuitiva que essa. Por isso tipicamente usamos o odds pra discutir modelos logísticos.

Multivariada:

bm <- glm(dec ~ attr + music + fun + intel, 
          data = dados_t, 
          family = "binomial")

#tidy(bm, conf.int = TRUE)
tidy(bm, conf.int = TRUE, exponentiate = TRUE) %>% select(-p.value)

#glance(bm)
#pR2(bm)

A partir dos valores gerados na tabela acima, a formula que representa o modelo dos dados é a seguinte:

\(p(match) = \frac{e^{0.0062 + attr*1.74 + music*0.97 + fun*1.39 + intel*0.91}}{1 + e^{0.0062 + attr*1.74 + music*0.97 + fun*1.39 + intel*0.91}}\)

\(\frac{p(match)}{1 - p(match)} = e^{0.0062} e^{attr*1.74} e^{music*0.97} e^{fun*1.4} e^{intel*0.91}\)

Todas as variáveis abordadas têm avaliação em escala que varia de 1 a 10, ou seja, para cada variável que aumenta em 1 ponto podemos observar que a variável attr possui um oddis de 74% de chances a mais para acontecer um match. Já o music apresentou um oddis de 3% de chances de ambos escolherem se encontrar de novo. O fun tem 40% a mais da chance de acontercer um match. Por fim, o intel tem 9% de a menos de chance de acontecer um match. Com isso, podemos deduzir que ser atraente tende a ter um peso maior na decisão de ambos optarem por se encontrar de novo. Para reafirmar essa hipotese, vamos verificar os ICs (com confiança de 95%) a seguir:

tidy(bm, conf.int = TRUE, exponentiate = TRUE) %>% 
  filter(term != "(Intercept)") %>% 
  ggplot(aes(x = reorder(term, estimate), y = estimate, ymin = conf.low, ymax = conf.high, color = term)) + 
  geom_point() + 
  geom_linerange() + 
  labs(x = "variáveis")+
  coord_flip()

  • attr [IC 65%, 83%]: mostrou ter um efeito grande positivamente na decisão de um próximo encontro.
  • music [IC -7%, 0,5%]: apresentou um efeito pequeno que pode ser positivo com pouca ou nenhuma relevancia ou ter efeito pequeno e negativo para que aconteça um match.
  • fun [IC 33%, 47%]: apresenta um efeito com variação consideravelmente grande e positivo na decisão de ambos quererem um novo encontro.
  • intel [IC -14%, -3%]: Apresenta um efeito que varia de 3% a 14% negativamente nas chanches de acontecer um futuro encontro novamente.

A seguir podemos verificar o quanto que o modelo criado representa sobre os dados:

pR2(bm)
fitting null model for pseudo-r2
          llh       llhNull            G2      McFadden          r2ML          r2CU 
-2451.4202082 -3170.2966484  1437.7528804     0.2267537     0.2660106     0.3573833 

Para regressão logística não há R2, mas podemos estimar um pseudo R2 para um modelo logístico. Sendo assim, verificamos através do método de McFadden e descobrimos que o modelo explica apenas 23% dos dados. Isso pode significar que ser atraente/ divertido/ gostar de musica/ ser inteligente pode não ter uma forte influência na chance de acontecer um match.

       

LS0tDQp0aXRsZTogIlJlZ3Jlc3PDo28gbG9naXN0aWNhIg0KYXV0aG9yOiAiQWxpc3NvbiBPdMOhdmlvIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHBzY2wpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodGlkeW1vZGVscykNCmxpYnJhcnkobW9kZWxyKQ0KbGlicmFyeSgiZ3JpZEV4dHJhIikNCg0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQpgYGANCg0KIyBSZWdyZXNzw6NvIFJvbcOibnRpY2ENCg0KIyMgT3MgZGFkb3MNCg0KVGVtb3MgZGFkb3MgZGVzY3JldmVuZG8gNTAwMCBlbmNvbnRyb3MgcmVsw6JtcGFnb3MgKHNwZWVkIGRhdGluZywgcHJvY3VyYSBubyBnb29nbGUpIGRlIDQgbWludXRvcyBlbnZvbHZlbmRvIDMxMCBqb3ZlbnMgYW1lcmljYW5vcy4gT3MgZGFkb3Mgb3JpZ2luYWlzIGZvcmFtIGNvbGV0YWRvcyBwb3IgcHJvZmVzc29yZXMgZGEgQ29sdW1iaWEgQnVzaW5lc3MgU2Nob29sIG5vIGV4cGVyaW1lbnRvIGRlc2NyaXRvIGFxdWkuIEFxdWkgZXN0YW1vcyB1c2FuZG8gdW1hIHZlcnPDo28gY29tIG1lbm9zIGNvbHVuYXMgcGFyYSBhZ2lsaXphciBwYXJhIHZvY8Oqcy4NCg0KT3MgcGFydGljaXBhbnRlcyB0aW5oYW0gdsOhcmlvcyBlbmNvbnRyb3MgZGUgNCBtaW51dG9zIHBvciBub2l0ZS4gQXDDs3MgY2FkYSB1bSwgcHJlZW5jaGlhbSBmaWNoYXMgYXZhbGlhbmRvIGFxdWVsZXMgY29tIHF1ZW0gc2UgZW5jb250cmFyYW0uIENhZGEgbGluaGEgbm9zIGRhZG9zIHJlcHJlc2VudGEgdW0gZGVzc2VzIGVuY29udHJvcy4NCg0KIyMgQXMgcGVyZ3VudGFzDQoNCk8gcXVlIGNhdXNhIGF0cmHDp8OjbyDDoCBwcmltZWlyYSB2aXN0YT8gRSBjb21vIGlzc28gdmFyaWEgcGFyYSBkaWZlcmVudGVzIHNleG9zPyBQZXNzb2FzIGRlIGRpZmVyZW50ZXMgYmFja2dyb3VuZHM/IE8gcXVlIHPDo28gYXMgY2FyYWN0ZXLDrXN0aWNhcyBtYWlzIGUgbWVub3MgaW1wb3J0YW50ZXMgcGFyYSB1bSBob21lbS9tdWxoZXIgc2VyIHBlcmNlYmlkbyBiZW0gZW0gdW0gc3BlZWQgZGF0ZT8gUXVlIGdydXBvcyBzw6NvIG1haXMgb3RpbWlzdGFzIGUgcGVzc2ltaXN0YXMgYXDDs3MgbyBlbmNvbnRybz8NCg0KIyMgQXMgdmFyacOhdmVpcw0KDQpPQlMgOiBOQXMgc2Vyw6NvIG9taXRpZGFzLg0KDQotIGlpZCA6IGlkIGRvIHBhcnRpY2lwYW50ZSBwMSBubyBlbmNvbnRybw0KLSBnZW5kZXIgOiBzZXhvIGRvIHAxLCAwID0gbXVsaGVyDQotIG9yZGVyIDogZG9zIHbDoXJpb3MgZW5jb250cm9zIHJlYWxpemFkb3MgZW0gdW1hIG5vaXRlLCBlc3NlIGZvaSBvIG4tw6lzaW1vLCBzZWd1bmRvIGVzc2EgdmFyacOhdmVsDQotIHBpZCA6IGlkIGRvIHBhcnRpY2lwYW50ZSBwMg0KLSBpbnRfY29yciA6IGNvcnJlbGHDp8OjbyBlbnRyZSBvcyBpbnRlcmVzc2VzIGRlIHAxIGUgcDINCi0gc2FtZXJhY2UgOiBwMSBlIHAyIHPDo28gZGEgbWVzbWEgcmHDp2E/DQotIGFnZV9vIDogaWRhZGUgZGUgcDINCi0gYWdlIDogaWRhZGUgZGUgcDENCi0gZmllbGQgOiBjYW1wbyBkZSBlc3R1ZG8gZGUgcDENCi0gcmFjZSA6IHJhw6dhIGRlIHAxLiBPIGPDs2RpZ28gw6kgQmxhY2svQWZyaWNhbiBBbWVyaWNhbj0xOyBFdXJvcGVhbi9DYXVjYXNpYW4tQW1lcmljYW49MjsgTGF0aW5vL0hpc3BhbmljIEFtZXJpY2FuPTM7IEFzaWFuL1BhY2lmaWMgSXNsYW5kZXIvQXNpYW4tQW1lcmljYW49NDsgTmF0aXZlIEFtZXJpY2FuPTU7IE90aGVyPTYNCi0gZnJvbSA6IGRlIG9uZGUgcDEgw6kNCi0gY2FyZWVyIDogcXVlIGNhcnJlaXJhIHAxIHF1ZXIgc2VndWlyDQotIHNwb3J0cywgdHZzcG9ydHMsIGV4ZXJjaXNlLCBkaW5pbmcsIG11c2V1bXMsIGFydCwgaGlraW5nLCBnYW1pbmcsIGNsdWJiaW5nLCByZWFkaW5nLCB0diwgdGhlYXRlciwgbW92aWVzLCBjb25jZXJ0cywgbXVzaWMsIHNob3BwaW5nLCB5b2dhIDogRGUgMSBhIDEwLCBxdcOjbyBpbnRlcmVzc2FkbyBwMSDDqSBlbSBjYWRhIHVtYSBkZXNzYXMgYXRpdmlkYWRlcy4NCi0gYXR0ciA6IHF1w6NvIGF0cmFlbnRlIHAxIGFjaG91IHAyDQotIHNpbmMgOiBxdcOjbyBzaW5jZXJvIHAxIGFjaG91IHAyDQotIGludGVsIDogcXXDo28gaW50ZWxpZ2VudGUgcDEgYWNob3UgcDINCi0gZnVuIDogcXXDo28gZGl2ZXJ0aWRvIHAxIGFjaG91IHAyDQotIGFtYiA6IHF1w6NvIGFtYmljaW9zbyBwMSBhY2hvdSBwMg0KLSBzaGFyIDogcXVhbnRvIHAxIGFjaG91IHF1ZSBjb21wYXJ0aWxoYSBpbnRlcmVzc2VzIGUgaG9iYmllcyBjb20gcDINCi0gbGlrZSA6IG5vIGdlcmFsLCBxdWFudG8gcDEgZ29zdG91IGRlIHAyPw0KLSBwcm9iIDogcXVlIHByb2JhYmlsaWFkZSBwMSBhY2hhIHF1ZSBwMiB0ZW0gZGUgcXVlcmVyIHNlIGVuY29udHJhciBub3ZhbWVudGUgY29tIHAtIChlc2NhbGEgMS0xMCkNCi0gYXR0cjNfcyA6IHF1YW50byBwMSBhY2hhIHF1ZSDDqSBhdHJhZW50ZQ0KLSBzaW5jM19zIDogcXVhbnRvIHAxIGFjaGEgcXVlIMOpIHNpbmNlcm8NCi0gaW50ZWwzX3MgOiBxdWFudG8gcDEgYWNoYSBxdWUgw6kgaW50ZWxpZ2VudGUNCi0gZnVuM19zIDogcXVhbnRvIHAxIGFjaGEgcXVlIMOpIGRpdmVydGlkbw0KLSBhbWIzX3MgOiBxdWFudG8gcDEgYWNoYSBxdWUgw6kgYW1iaWNpb3NvDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpkYWRvcyA8LSByZWFkX2Nzdigic3BlZWQtZGF0aW5nL3NwZWVkLWRhdGluZzIuY3N2IikNCmRhZG9zIDwtIGRhZG9zICU+JQ0KICBzZWxlY3QoZGVjLCBhdHRyLCBpbnRlbCwgbXVzaWMsIGZ1bikgJT4lIA0KICBuYS5vbWl0KCkgJT4lIA0KICBtdXRhdGUoZGVjID0gYXMuZmFjdG9yKGRlYykpDQojZ2dwYWlycyhkYWRvcywgcHJvZ3Jlc3MgPSBGKQ0KZ2xpbXBzZShkYWRvcykNCmBgYA0KDQojIyBFREENCg0KUGFyYSBub3NzYSBhbsOhbGlzZSwgdXRpbGl6YXJlbW9zIGFwZW5hcyBhcyB2YXJpw6F2ZWlzOg0KDQotIGF0dHIgOiBxdcOjbyBhdHJhZW50ZSBwMSBhY2hvdSBwDQotIGZ1biA6IHF1w6NvIGRpdmVydGlkbyBwMSBhY2hvdSBwMg0KLSBpbnRlbCA6IHF1w6NvIGludGVsaWdlbnRlIHAxIGFjaG91IHAyDQotIG11c2ljIDogbyBxdWFudG8gcGFydGljaXBhbnRlIGdvc3RhIGRlIG3DunNpY2ENCg0KDQpgYGB7cn0NCmEgPSBkYWRvcyAlPiUgDQogIGdncGxvdChhZXMoeCA9IG11c2ljLCBmaWxsID0gZGVjKSkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKQ0KDQpiID0gZGFkb3MgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBhdHRyLCBmaWxsID0gZGVjKSkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKQ0KDQpjID0gZGFkb3MgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBpbnRlbCwgZmlsbCA9IGRlYykpICsgDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikNCg0KZCA9IGRhZG9zICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZnVuLCBmaWxsID0gZGVjKSkgKyANCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKQ0KDQpncmlkLmFycmFuZ2UoYSxiLGMsZCkNCg0KYGBgDQpDb20gbyBncsOhZmljbyBhcHJlc2VudGFkbyBhY2ltYSwgcG9kZW1vcyBvYnNlcnZhciBxdWUgKipzZXIgYXRyYWVudGUgZSBkaXZlcnRpZG8qKiBjb20gcG9udHVhw6fDtWVzICoqYWNpbWEgZGUgNyoqIHRlbSBtYWlzICoqY2hhbmNlcyBkZSBhY29udGVjZXIgdW0gbWF0Y2gqKiwgZW5xdWFudG8gcXVlICoqZ29zdGFyIGRlIG3DunNpY2EqKiB0ZW0gcGVzbyB1bSBwb3VjbyAqKm1lbm9zIHJlbGV2YW50ZSoqIG5hIGhvcmEgZG9zIHBhcnRpY2lwYW50ZXMgZWNvbGhlcmVtIHNlIGVuY29udHJhciBkZSBub3ZvLiBKw6Egc2UgYSBwZXNzb2EgKirDqSBpbnRlbGlnZW50ZSoqLCBjb21lw6dhICB0ZXIgdW0gcGVzbyB1bSBwb3VjbyBtYWlvciAocGFyYSBtYXRjaCBwb3NpdGl2bykgKipxdWFuZG8gYSBwb250dWHDp8OjbyBwYXNzYSBkb3MgOCoqLCBwb3LDqW0gZXNzZXMgY2Fzb3MgYWNvbnRlY2VtIGNvbSAqKm1lbm9yIGZyZXF1w6puY2lhKiouDQoNCg0KDQojIyBGaXQNCkjDoSB1bSBwcm9jZXNzbyBzZW1lbGhhbnRlIGEgT0xTIHBhcmEgZW5jb250cmFyICRiXzAkIGUgJGJfMSQgZW0gdW0gbW9kZWxvIGRvIHRpcG8gYHkgPSBleHAoYjAgKyBiMSAqIHgpIC8gKDEgKyBleHAoYjAgKyBiMSAqIHgpKWAsIG91ICR5ID0gXGZyYWN7ZV57Yl8wICsgYl8xLlhfMX19ezEgKyBlXntiXzAgKyBiXzEuWF8xfX0kLg0KDQpFbGUgc2UgY2hhbWEgbcOheGltYSB2ZXJvc3NpbWlsaGFuw6dhLCBvdSBtYXhpbXVtIGxpa2VsaWhvb2QuIE7Do28gdmFtb3MgZGlzY3V0w60tbG8gZW0gZGV0YWxoZXMsIG1hcyB2YWxlIHNhYmVyIHF1ZSBuw6NvIGjDoSBmb3JtYSBmZWNoYWRhIHBhcmEgb3MgY29lZmljaWVudGVzLCBtYXMgaMOhIHNvbHXDp8OjbyBlZmljaWVudGUgbWVzbW8gcGFyYSBtdWl0YXMgdmFyacOhdmVpcy4NCg0KIyMgSW50ZXJwcmV0YcOnw6NvDQoNCkxlbWJyZSBxdWUgdGVtb3MgZXNjcml0byAkeSQsIG1hcyBub3NzYSB2YXJpw6F2ZWwgZGUgcmVzcG9zdGEgw6kgJHAoeSA9IDEgfCB4KSQsIG91IHNlamEsIGEgcHJvYmFiaWxpZGFkZSBkZSAkeT0xJCBkYWRvIG8gdmFsb3IgZGUgJHgkLiBQYXJhIGZhY2lsaXRhciwgdmFtb3MgZXNjcmV2ZXIgJHAoeCkkIHBhcmEgc2lnbmlmaWNhciAkcCh5ID0gMSB8IHgpJC4gU2UgbWFuaXB1bGFybW9zICRwKHgpID0gXGZyYWN7ZV57Yl8wICsgYl8xLlhfMX19ezEgKyBlXntiXzAgKyBiXzEuWF8xfX0kLCBjaGVnYW1vcyBmYWNpbG1lbnRlIGVtOg0KDQokXGZyYWN7cCh4KX17MS1wKHgpfSA9IGVee2JfMCArIGJfMS5YXzF9ID0gZV57Yl8wfS4gZV57Yl8xLlhfMX0kDQogTyB0ZXJtbyAkXGZyYWN7cCh4KX17MS1wKHgpfSQgdGVtIHVtYSBpbnRlcnByZXRhw6fDo286IGVsZSDDqSBvICpvZGRzKiBkbyBldmVudG8gJHkgPSAxJCwgcXVlIMOpIGEgcmF6w6NvIGVudHJlIGEgcHJvYmFiaWxpZGFkZSBkZSB5IHNlciAxIGUgZGUgeSBzZXIgMCBxdWFuZG8geCB0ZW0gdW0gY2VydG8gdmFsb3IuIE91ICJxdcOjbyBtYWlvciDDqSBhIGNoYW5jZSBkZSB5IHNlciAxIGRvIHF1ZSBzZXIgMCIsIGRhZG8geC4NCg0KSXNzbyDDqSDDunRpbCBwb3JxdWUgJFhfMSQgdGVtIHVtIGVmZWl0byBpbnRlcnByZXTDoXZlbCBubyBvZGRzOg0KDQokeCA9MDogb2RkcyA9IGVee2JfMH0uIGVee2JfMS4wfSA9IGVee2JfMH1cXCB4ID0xOiBvZGRzID0gZV57Yl8wfS4gZV57Yl8xLjF9ID0gZV57Yl8wfS4gZV57Yl8xfVxcIHggPTI6IG9kZHMgPSBlXntiXzB9LiBlXntiXzEuMn0gPSBlXntiXzB9LiBlXntiXzF9LiBlXntiXzF9XFwkDQoNCk91IHNlamEsIGF1bWVudGFyIHVtYSB1bmlkYWRlIGVtICRYXzEkIG11bHRpcGxpY2EgbyBvZGRzIHBvciBcJGVcXntiXzF9XCQuIFJlcGFyZSBxdWUgZXNzYSAqKm7Do28gw6kqKiB1bWEgaW50ZXJwcmV0YcOnw6NvIGRvIGVmZWl0byBkZSBcJFhfMVwkIGVtIFwkcCh4KVwkLiBBIHJlbGHDp8OjbyBlbnRyZSBcJFhfMVwkIGVtIFwkcCh4KVwkIMOpIG1haXMgY29tcGxleGEgZSBuw6NvIHRlbSB1bWEgaW50ZXJwcmV0YcOnw6NvIG1haXMgaW50dWl0aXZhIHF1ZSBlc3NhLiBQb3IgaXNzbyB0aXBpY2FtZW50ZSB1c2Ftb3MgbyBvZGRzIHByYSBkaXNjdXRpciBtb2RlbG9zIGxvZ8Otc3RpY29zLg0KDQoNCiMjIE11bHRpdmFyaWFkYToNCg0KDQpgYGB7cn0NCmJtIDwtIGdsbShkZWMgfiBhdHRyICsgbXVzaWMgKyBmdW4gKyBpbnRlbCwgDQogICAgICAgICAgZGF0YSA9IGRhZG9zX3QsIA0KICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIpDQoNCiN0aWR5KGJtLCBjb25mLmludCA9IFRSVUUpDQp0aWR5KGJtLCBjb25mLmludCA9IFRSVUUsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JSBzZWxlY3QoLXAudmFsdWUpDQoNCiNnbGFuY2UoYm0pDQojcFIyKGJtKQ0KDQpgYGANCkEgcGFydGlyIGRvcyB2YWxvcmVzIGdlcmFkb3MgbmEgdGFiZWxhIGFjaW1hLCBhIGZvcm11bGEgcXVlIHJlcHJlc2VudGEgbyBtb2RlbG8gZG9zIGRhZG9zIMOpIGEgc2VndWludGU6DQoNCiRwKG1hdGNoKSA9IFxmcmFje2VeezAuMDA2MiArIGF0dHIqMS43NCArIG11c2ljKjAuOTcgKyBmdW4qMS4zOSArIGludGVsKjAuOTF9fXsxICsgZV57MC4wMDYyICsgYXR0cioxLjc0ICsgbXVzaWMqMC45NyArIGZ1bioxLjM5ICsgaW50ZWwqMC45MX19JA0KDQokXGZyYWN7cChtYXRjaCl9ezEgLSBwKG1hdGNoKX0gPSBlXnswLjAwNjJ9IGVee2F0dHIqMS43NH0gZV57bXVzaWMqMC45N30gZV57ZnVuKjEuNH0gZV57aW50ZWwqMC45MX0kDQoNClRvZGFzIGFzIHZhcmnDoXZlaXMgYWJvcmRhZGFzIHTDqm0gYXZhbGlhw6fDo28gZW0gZXNjYWxhIHF1ZSB2YXJpYSBkZSAxIGEgMTAsIG91IHNlamEsIHBhcmEgY2FkYSB2YXJpw6F2ZWwgcXVlIGF1bWVudGEgZW0gMSBwb250byBwb2RlbW9zIG9ic2VydmFyIHF1ZSBhIHZhcmnDoXZlbCAqKmF0dHIqKiBwb3NzdWkgdW0gb2RkaXMgZGUgKio3NCUgZGUgY2hhbmNlcyBhIG1haXMgcGFyYSBhY29udGVjZXIgdW0gbWF0Y2gqKi4gSsOhIG8gKiptdXNpYyoqIGFwcmVzZW50b3UgdW0gKipvZGRpcyBkZSAzJSBkZSBjaGFuY2VzIGRlIGFtYm9zIGVzY29saGVyZW0gc2UgZW5jb250cmFyIGRlIG5vdm8qKi4gTyAqKmZ1bioqIHRlbSAqKjQwJSBhIG1haXMgZGEgY2hhbmNlIGRlIGFjb250ZXJjZXIgdW0gbWF0Y2gqKi4gUG9yIGZpbSwgbyAqKmludGVsKiogdGVtICoqOSUgZGUgYSBtZW5vcyBkZSBjaGFuY2UgZGUgYWNvbnRlY2VyIHVtIG1hdGNoKiouDQpDb20gaXNzbywgKipwb2RlbW9zIGRlZHV6aXIgcXVlIHNlciBhdHJhZW50ZSB0ZW5kZSBhIHRlciB1bSBwZXNvIG1haW9yIG5hIGRlY2lzw6NvIGRlIGFtYm9zIG9wdGFyZW0gcG9yIHNlIGVuY29udHJhciBkZSBub3ZvKiouIFBhcmEgcmVhZmlybWFyIGVzc2EgaGlwb3Rlc2UsIHZhbW9zIHZlcmlmaWNhciBvcyBJQ3MgKGNvbSBjb25maWFuw6dhIGRlIDk1JSkgYSBzZWd1aXI6IA0KDQpgYGB7cn0NCnRpZHkoYm0sIGNvbmYuaW50ID0gVFJVRSwgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lIA0KICBmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIodGVybSwgZXN0aW1hdGUpLCB5ID0gZXN0aW1hdGUsIHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCwgY29sb3IgPSB0ZXJtKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fbGluZXJhbmdlKCkgKyANCiAgbGFicyh4ID0gInZhcmnDoXZlaXMiKSsNCiAgY29vcmRfZmxpcCgpDQpgYGANCi0gKiphdHRyIFtJQyA2NSUsIDgzJV0qKjogbW9zdHJvdSB0ZXIgdW0gZWZlaXRvIGdyYW5kZSBwb3NpdGl2YW1lbnRlIG5hIGRlY2lzw6NvIGRlIHVtIHByw7N4aW1vIGVuY29udHJvLg0KLSAqKm11c2ljIFtJQyAtNyUsIDAsNSVdKio6IGFwcmVzZW50b3UgdW0gZWZlaXRvIHBlcXVlbm8gcXVlIHBvZGUgc2VyIHBvc2l0aXZvIGNvbSBwb3VjYSBvdSBuZW5odW1hIHJlbGV2YW5jaWEgb3UgdGVyIGVmZWl0byBwZXF1ZW5vIGUgbmVnYXRpdm8gcGFyYSBxdWUgYWNvbnRlw6dhIHVtIG1hdGNoLg0KLSAqKmZ1biBbSUMgMzMlLCA0NyVdKio6IGFwcmVzZW50YSB1bSBlZmVpdG8gY29tIHZhcmlhw6fDo28gY29uc2lkZXJhdmVsbWVudGUgZ3JhbmRlIGUgcG9zaXRpdm8gbmEgZGVjaXPDo28gZGUgYW1ib3MgcXVlcmVyZW0gdW0gbm92byBlbmNvbnRyby4NCi0gKippbnRlbCBbSUMgLTE0JSwgLTMlXSoqOiBBcHJlc2VudGEgdW0gZWZlaXRvIHF1ZSB2YXJpYSBkZSAzJSBhIDE0JSBuZWdhdGl2YW1lbnRlIG5hcyBjaGFuY2hlcyBkZSBhY29udGVjZXIgdW0gZnV0dXJvIGVuY29udHJvIG5vdmFtZW50ZS4NCg0KDQpBIHNlZ3VpciBwb2RlbW9zIHZlcmlmaWNhciBvIHF1YW50byBxdWUgbyBtb2RlbG8gY3JpYWRvIHJlcHJlc2VudGEgc29icmUgb3MgZGFkb3M6DQoNCmBgYHtyfQ0KcFIyKGJtKQ0KYGBgDQpQYXJhIHJlZ3Jlc3PDo28gbG9nw61zdGljYSBuw6NvIGjDoSBSMiwgbWFzIHBvZGVtb3MgZXN0aW1hciB1bSBwc2V1ZG8gUjIgcGFyYSB1bSBtb2RlbG8gbG9nw61zdGljby4gU2VuZG8gYXNzaW0sIHZlcmlmaWNhbW9zIGF0cmF2w6lzIGRvIG3DqXRvZG8gZGUgTWNGYWRkZW4gZSAqKmRlc2NvYnJpbW9zIHF1ZSBvIG1vZGVsbyBleHBsaWNhIGFwZW5hcyAyMyUgZG9zIGRhZG9zLiBJc3NvIHBvZGUgc2lnbmlmaWNhciBxdWUgc2VyIGF0cmFlbnRlLyBkaXZlcnRpZG8vIGdvc3RhciBkZSBtdXNpY2EvIHNlciBpbnRlbGlnZW50ZSBwb2RlIG7Do28gdGVyIHVtYSBmb3J0ZSBpbmZsdcOqbmNpYSBuYSBjaGFuY2UgZGUgYWNvbnRlY2VyIHVtIG1hdGNoKiouIA0KDQoNCg0KDQoNCsKgDQrCoA0KwqANCsKg