1. Base de Dados e Pré-processamento
1.1 Carregando a base de dados
#carregando a base de dados em .csv
dados <-
data.table::fread("/Dados/Coorte100m/PBF_SHSM/SHARED/Dataset_SIM_Daiane_geo.csv", select = c("cod_familiar_eq", "idade", "cod_sexo_pessoa_eq", "cod_raca_cor_pessoa_eq", "escolaridade_eq", "regiao", "urban", "cod_destino_lixo_domic_fam_eq", "cod_escoa_sanitario_domic_fam_eq", "cod_abaste_agua_domic_fam_eq", "homicide", "suicide"))
|--------------------------------------------------|
|==================================================|
dados <- dados %>% filter(idade > 10) #retirando criancas menores de 10 anos
1.2 Pre-processando a base original
#funcao para calcular a moda
moda <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
#criando a variavel idade
dados <- dados %>%
mutate(
idade = case_when(
idade < 19~1,
idade >= 20 & idade < 40~2,
idade >= 40 & idade < 60~3,
idade >= 60~4)
)
#criando a variavel homem_familia
dados <- dados %>%
mutate(
homem_familia = case_when(
cod_sexo_pessoa_eq == 1~1,
cod_sexo_pessoa_eq == 2~0)
)
#criando a variavel escolaridade
dados <- dados %>%
mutate(
escolaridade = case_when(
escolaridade_eq == 0~0,
escolaridade_eq == 1~1,
escolaridade_eq == 2~2,
escolaridade_eq == 3~3,
escolaridade_eq == 4~4,
escolaridade_eq == 5 | escolaridade_eq == 6~5)
)
#mudando o rotulo da variavel regiao
dados <- dados %>%
mutate(
regiao = case_when(
regiao == "Nordeste"~1,
regiao == "Norte"~2,
regiao == "Sudeste"~3,
regiao == "Centro-Oeste"~4,
regiao == "Sul"~5)
)
#criando a variavel LivingConditions
#Lixo
dados <- dados %>%
mutate(
lixo = case_when(
cod_destino_lixo_domic_fam_eq == 1 | cod_destino_lixo_domic_fam_eq == 2~1,
TRUE~0)
)
#Escoamento
dados <- dados %>%
mutate(
escoamento = case_when(
cod_escoa_sanitario_domic_fam_eq == 1 | cod_escoa_sanitario_domic_fam_eq == 2 | cod_escoa_sanitario_domic_fam_eq == 3~1,
TRUE~0)
)
#Agua
dados <- dados %>%
mutate(
agua = case_when(
cod_abaste_agua_domic_fam_eq == 1~1,
TRUE~0)
)
#LivingConditions
dados <- dados %>%
mutate(
living_conditions = (lixo + escoamento + agua)
)
1.3 Realizando a mudanca de grao da base
#familias com pelo menos um suicidio
qtd_suic_familia <- dados %>%
group_by(cod_familiar_eq) %>% #agrupando por familias
summarise(
qtd_pesoas_familia = n(),#quantidade de pessoas na familia
qtd_suic_familia = sum(suicide), #quantidade de suicidios na familia
qtd_homic_familia = sum(homicide), #quantidade de homicidio na familia
homem_familia = (sum(homem_familia)/n())*100, #percentual de homens na familia
raca = moda(cod_raca_cor_pessoa_eq), #raca predominante(moda) na familia
regiao = moda(regiao), #regiao predominante (moda) da familia
urban = moda(urban), #predominancia de membros da familia em area urbana
idade = moda(idade), #predominancia (moda) da faixa etaria da familia
escolaridade = moda(escolaridade), #predominancia (moda) da faixa etaria da familia
living_conditions = moda(living_conditions)#condicao de vida predominante(moda) na familia
) %>%
filter(qtd_pesoas_familia > 1) #familias com mais de uma pessoa
#categorizar a quantidade de pessoas na familia
qtd_suic_familia <- qtd_suic_familia %>%
mutate(
pessoas_na_familia = case_when(
qtd_pesoas_familia == 2~"1",
qtd_pesoas_familia == 3~"2",
qtd_pesoas_familia == 4~"2",
qtd_pesoas_familia == 5~"3",
qtd_pesoas_familia == 6~"3",
qtd_pesoas_familia >7~"4")
)
#criando a variavel desfecho
dados_familia <- qtd_suic_familia %>%
mutate( #se teve pelo menos um suicidio (1) e caso contrrario (0)
desfecho = case_when(qtd_suic_familia >= 1~1,TRUE~0)
)
1.4 Salvando a base agregada no grao familia
#salvando a base de dados em .csv
rm(dados)
write.csv(dados_familia,"/Dados/Coorte100m/PBF_SHSM/SHARED/Dataset_SIM_Daiane_geo_Agregada.csv")
rm(dados_familia)
rm(qtd_suic_familia)
gc()
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 2683512 143.4 626419900 33454.5 645755748 34487.1
Vcells 106622989 813.5 3104563892 23686.0 3874748559 29562.0
2. Análise Exploratória dos Dados
2.1 Carregando a base de dados agregada
dados <-
data.table::fread("/Dados/Coorte100m/PBF_SHSM/SHARED/Dataset_SIM_Daiane_geo_Agregada.csv")
#dados <- dados %>% sample_n(10000)
2.2 Tabela de contingência vs Variável binária suicídio
familiar
dados %>%
select( #aqui ta selecionando as variáveis na tabela
qtd_homic_familia,
pessoas_na_familia,
homem_familia,
raca,
regiao,
urban,
idade,
escolaridade,
living_conditions,
desfecho) %>%
tbl_summary(by = desfecho,
statistic = list(all_continuous() ~ "{mean} ({sd})")) %>%
add_p() %>% #adiciona os p-valores dos testes estatísticos
bold_labels()
There was an error in 'add_p()/add_difference()' for variable 'qtd_homic_familia', p-value omitted:
Error in stats::fisher.test(c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, : FEXACT error 40.
Out of workspace.
| Characteristic |
0, N = 21,598,482 |
1, N = 32,727 |
p-value |
| qtd_homic_familia |
|
|
|
| 0 |
21,386,133 (99%) |
32,008 (98%) |
|
| 1 |
206,696 (1.0%) |
699 (2.1%) |
|
| 2 |
5,392 (<0.1%) |
19 (<0.1%) |
|
| 3 |
245 (<0.1%) |
1 (<0.1%) |
|
| 4 |
15 (<0.1%) |
0 (0%) |
|
| 5 |
1 (<0.1%) |
0 (0%) |
|
| pessoas_na_familia |
|
|
<0.001 |
| 1 |
10,088,330 (47%) |
8,787 (28%) |
|
| 2 |
8,659,781 (41%) |
14,924 (47%) |
|
| 3 |
2,333,798 (11%) |
6,902 (22%) |
|
| 4 |
221,379 (1.0%) |
952 (3.0%) |
|
| Unknown |
295,194 |
1,162 |
|
| homem_familia |
46 (22) |
52 (19) |
<0.001 |
| raca |
|
|
<0.001 |
| 1 |
6,573,302 (33%) |
11,776 (39%) |
|
| 2 |
1,502,227 (7.6%) |
2,172 (7.3%) |
|
| 3 |
67,582 (0.3%) |
80 (0.3%) |
|
| 4 |
11,447,985 (58%) |
15,437 (52%) |
|
| 5 |
95,640 (0.5%) |
435 (1.5%) |
|
| Unknown |
1,911,746 |
2,827 |
|
| regiao |
|
|
<0.001 |
| 1 |
8,618,383 (40%) |
12,122 (37%) |
|
| 2 |
2,008,379 (9.3%) |
2,503 (7.7%) |
|
| 3 |
6,858,034 (32%) |
9,110 (28%) |
|
| 4 |
1,474,313 (6.8%) |
2,315 (7.1%) |
|
| 5 |
2,616,703 (12%) |
6,655 (20%) |
|
| Unknown |
22,670 |
22 |
|
| urban |
|
|
<0.001 |
| 0 |
5,254,968 (26%) |
9,500 (30%) |
|
| 1 |
15,333,490 (74%) |
22,013 (70%) |
|
| Unknown |
1,010,024 |
1,214 |
|
| idade |
|
|
<0.001 |
| 1 |
6,138,318 (29%) |
11,405 (35%) |
|
| 2 |
9,704,713 (46%) |
13,632 (42%) |
|
| 3 |
4,119,118 (19%) |
5,858 (18%) |
|
| 4 |
1,353,356 (6.3%) |
1,424 (4.4%) |
|
| Unknown |
282,977 |
408 |
|
| escolaridade |
|
|
<0.001 |
| 0 |
1,996,971 (11%) |
3,363 (12%) |
|
| 1 |
35,890 (0.2%) |
41 (0.2%) |
|
| 2 |
122,090 (0.7%) |
169 (0.6%) |
|
| 3 |
7,129,604 (40%) |
12,132 (45%) |
|
| 4 |
5,958,677 (33%) |
9,393 (35%) |
|
| 5 |
2,780,214 (15%) |
2,101 (7.7%) |
|
| Unknown |
3,575,036 |
5,528 |
|
| living_conditions |
|
|
<0.001 |
| 0 |
2,031,060 (9.4%) |
2,952 (9.0%) |
|
| 1 |
1,860,732 (8.6%) |
3,263 (10.0%) |
|
| 2 |
4,531,631 (21%) |
7,410 (23%) |
|
| 3 |
13,175,059 (61%) |
19,102 (58%) |
|
3. Regressao Logistica
3.1 Construcao do modelo
#modelagem da regressao logistica
m1 <- glm(desfecho ~ qtd_homic_familia + pessoas_na_familia + homem_familia + raca + regiao + urban + idade + escolaridade + living_conditions, data = dados, family = binomial(link = "logit"))
summary(m1)
Call:
glm(formula = desfecho ~ qtd_homic_familia + pessoas_na_familia +
homem_familia + raca + regiao + urban + idade + escolaridade +
living_conditions, family = binomial(link = "logit"), data = dados)
Deviance Residuals:
Min 1Q Median 3Q Max
-0.2991 -0.0611 -0.0482 -0.0397 4.1325
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -7.2878300 0.0416999 -174.768 < 2e-16 ***
qtd_homic_familia 0.4582886 0.0405174 11.311 < 2e-16 ***
pessoas_na_familia2 0.6313746 0.0157501 40.087 < 2e-16 ***
pessoas_na_familia3 1.1551285 0.0197516 58.483 < 2e-16 ***
pessoas_na_familia4 1.5168903 0.0399293 37.989 < 2e-16 ***
homem_familia 0.0113679 0.0003264 34.827 < 2e-16 ***
raca2 -0.1395011 0.0262247 -5.319 1.04e-07 ***
raca3 -0.2563168 0.1247354 -2.055 0.03989 *
raca4 -0.2234810 0.0155999 -14.326 < 2e-16 ***
raca5 0.9052960 0.0534195 16.947 < 2e-16 ***
regiao2 -0.1400343 0.0255728 -5.476 4.35e-08 ***
regiao3 0.0031151 0.0172758 0.180 0.85690
regiao4 0.2060884 0.0261628 7.877 3.35e-15 ***
regiao5 0.5632645 0.0205074 27.466 < 2e-16 ***
urban1 -0.0513244 0.0178476 -2.876 0.00403 **
idade2 0.0802788 0.0157975 5.082 3.74e-07 ***
idade3 -0.0440783 0.0193386 -2.279 0.02265 *
idade4 -0.2742231 0.0322476 -8.504 < 2e-16 ***
escolaridade1 -0.2646262 0.1593179 -1.661 0.09671 .
escolaridade2 -0.1095082 0.0821363 -1.333 0.18245
escolaridade3 -0.1589606 0.0207841 -7.648 2.04e-14 ***
escolaridade4 -0.2661941 0.0221819 -12.001 < 2e-16 ***
escolaridade5 -0.7789799 0.0300139 -25.954 < 2e-16 ***
living_conditions1 0.0264305 0.0337192 0.784 0.43313
living_conditions2 0.0067576 0.0312055 0.217 0.82856
living_conditions3 -0.0129738 0.0322286 -0.403 0.68728
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 374966 on 16913585 degrees of freedom
Residual deviance: 364878 on 16913560 degrees of freedom
(4717623 observations deleted due to missingness)
AIC: 364930
Number of Fisher Scoring iterations: 10
3.2 Tabela de significancia
#construindo tabela
tab_model(m1, file="tabela-suicidio.html")
Profiled confidence intervals may take longer time to compute. Use 'ci_method="wald"' for
faster computation of CIs.
htmltools::includeHTML("tabela-suicidio.html")
| |
desfecho |
| Predictors |
Odds Ratios |
CI |
p |
| (Intercept) |
0.00 |
0.00 – 0.00 |
<0.001 |
| qtd homic familia |
1.58 |
1.46 – 1.71 |
<0.001 |
| pessoas na familia [2] |
1.88 |
1.82 – 1.94 |
<0.001 |
| pessoas na familia [3] |
3.17 |
3.05 – 3.30 |
<0.001 |
| pessoas na familia [4] |
4.56 |
4.21 – 4.93 |
<0.001 |
| homem familia |
1.01 |
1.01 – 1.01 |
<0.001 |
| raca [2] |
0.87 |
0.83 – 0.92 |
<0.001 |
| raca [3] |
0.77 |
0.60 – 0.98 |
0.040 |
| raca [4] |
0.80 |
0.78 – 0.82 |
<0.001 |
| raca [5] |
2.47 |
2.22 – 2.74 |
<0.001 |
| regiao [2] |
0.87 |
0.83 – 0.91 |
<0.001 |
| regiao [3] |
1.00 |
0.97 – 1.04 |
0.857 |
| regiao [4] |
1.23 |
1.17 – 1.29 |
<0.001 |
| regiao [5] |
1.76 |
1.69 – 1.83 |
<0.001 |
| urban [1] |
0.95 |
0.92 – 0.98 |
0.004 |
| idade [2] |
1.08 |
1.05 – 1.12 |
<0.001 |
| idade [3] |
0.96 |
0.92 – 0.99 |
0.023 |
| idade [4] |
0.76 |
0.71 – 0.81 |
<0.001 |
| escolaridade [1] |
0.77 |
0.55 – 1.03 |
0.097 |
| escolaridade [2] |
0.90 |
0.76 – 1.05 |
0.182 |
| escolaridade [3] |
0.85 |
0.82 – 0.89 |
<0.001 |
| escolaridade [4] |
0.77 |
0.73 – 0.80 |
<0.001 |
| escolaridade [5] |
0.46 |
0.43 – 0.49 |
<0.001 |
| living conditions [1] |
1.03 |
0.96 – 1.10 |
0.433 |
| living conditions [2] |
1.01 |
0.95 – 1.07 |
0.829 |
| living conditions [3] |
0.99 |
0.93 – 1.05 |
0.687 |
| Observations |
16913586 |
| R2 Tjur |
0.001 |
NA
LS0tCnRpdGxlOiAiRmF0b3JlcyBkZSBSaXNjbyBTb2NpYWlzIHF1ZSBpbXBhY3RhbSBlbSBTdWljw61kaW8gRmFtaWxpYXIiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgd29yZF9kb2N1bWVudDogZGVmYXVsdAotLS0KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiNhcXVpIGZpY2EgdHVkbyBxdWUgZGV2ZSBzZXIgaW5pY2lhbGl6YWRvIGF1dG9tYXRpY2FtZW50ZSBubyBpbsOtY2lvIGRvIHByb2pldG8KbGlicmFyeSh0aWR5dmVyc2UpICNtYW5pcHVsYXIgZGFkb3MKbGlicmFyeShndHN1bW1hcnkpICNnZXJhciB0YWJlbGFzIGRlIGNvbnRpbmdlbmNpYSBjb20gcC12YWxvcgpsaWJyYXJ5KGZvcm1hdHRhYmxlKSAjZ2VyYXIgdGFiZWxhcwpsaWJyYXJ5KERUKSAjZ2VyYXIgdGFiZWxhcwpsaWJyYXJ5KHJtYXJrZG93bikgI2VzdGlsbyBkbyByZWxhdMOzcmlvCmxpYnJhcnkoZGF0YS50YWJsZSkgI2NhcnJlZ2FyIGdyYW5kZXMgYmFzZXMgZGUgZGFkb3MKbGlicmFyeShzalBsb3QpICNwbG90YSBjb2VmaWNpZW50ZXMgZGUgbW9kZWxvcyBkZSByZWdyZXNzw6NvCmxpYnJhcnkoc2psYWJlbGxlZCkgI3BhcmEgbW9kZWxhciBhIHJlZ3Jlc3NhbyBsb2dpc3RpY2EKbGlicmFyeShzam1pc2MpICNwYXJhIG1vZGVsYXIgYSByZWdyZXNzYW8gbG9naXN0aWNhCgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyAxLiBCYXNlIGRlIERhZG9zIGUgUHLDqS1wcm9jZXNzYW1lbnRvCgojIyAxLjEgQ2FycmVnYW5kbyBhIGJhc2UgZGUgZGFkb3MKYGBge3IgaW1wb3J0LWRhdGFzZXR9CiNjYXJyZWdhbmRvIGEgYmFzZSBkZSBkYWRvcyBlbSAuY3N2CmRhZG9zIDwtIAogIGRhdGEudGFibGU6OmZyZWFkKCIvRGFkb3MvQ29vcnRlMTAwbS9QQkZfU0hTTS9TSEFSRUQvRGF0YXNldF9TSU1fRGFpYW5lX2dlby5jc3YiLCBzZWxlY3QgPSBjKCJjb2RfZmFtaWxpYXJfZXEiLCAiaWRhZGUiLCAiY29kX3NleG9fcGVzc29hX2VxIiwgImNvZF9yYWNhX2Nvcl9wZXNzb2FfZXEiLCAiZXNjb2xhcmlkYWRlX2VxIiwgInJlZ2lhbyIsICJ1cmJhbiIsICJjb2RfZGVzdGlub19saXhvX2RvbWljX2ZhbV9lcSIsICJjb2RfZXNjb2Ffc2FuaXRhcmlvX2RvbWljX2ZhbV9lcSIsICJjb2RfYWJhc3RlX2FndWFfZG9taWNfZmFtX2VxIiwgImhvbWljaWRlIiwgInN1aWNpZGUiKSkgCgoKZGFkb3MgPC0gZGFkb3MgJT4lIGZpbHRlcihpZGFkZSA+IDEwKSAjcmV0aXJhbmRvIGNyaWFuY2FzIG1lbm9yZXMgZGUgMTAgYW5vcwoKCmBgYAoKIyMgMS4yIFByZS1wcm9jZXNzYW5kbyBhIGJhc2Ugb3JpZ2luYWwgCmBgYHtyfQojZnVuY2FvIHBhcmEgY2FsY3VsYXIgYSBtb2RhCm1vZGEgPC0gZnVuY3Rpb24odikgewogIHVuaXF2IDwtIHVuaXF1ZSh2KQogIHVuaXF2W3doaWNoLm1heCh0YWJ1bGF0ZShtYXRjaCh2LCB1bmlxdikpKV0KfQoKI2NyaWFuZG8gYSB2YXJpYXZlbCBpZGFkZQpkYWRvcyA8LSBkYWRvcyAlPiUgCiAgbXV0YXRlKAogICAgaWRhZGUgPSBjYXNlX3doZW4oCiAgICAgIGlkYWRlIDwgMTl+MSwKICAgICAgaWRhZGUgPj0gMjAgJiBpZGFkZSA8IDQwfjIsCiAgICAgIGlkYWRlID49IDQwICYgaWRhZGUgPCA2MH4zLAogICAgICBpZGFkZSA+PSA2MH40KQogICkKCgojY3JpYW5kbyBhIHZhcmlhdmVsIGhvbWVtX2ZhbWlsaWEKZGFkb3MgPC0gZGFkb3MgJT4lIAogIG11dGF0ZSgKICAgIGhvbWVtX2ZhbWlsaWEgPSBjYXNlX3doZW4oCiAgICAgIGNvZF9zZXhvX3Blc3NvYV9lcSA9PSAxfjEsCiAgICAgIGNvZF9zZXhvX3Blc3NvYV9lcSA9PSAyfjApCiAgKQoKCiNjcmlhbmRvIGEgdmFyaWF2ZWwgZXNjb2xhcmlkYWRlCmRhZG9zIDwtIGRhZG9zICU+JSAKICBtdXRhdGUoCiAgICBlc2NvbGFyaWRhZGUgPSBjYXNlX3doZW4oCiAgICAgIGVzY29sYXJpZGFkZV9lcSA9PSAwfjAsCiAgICAgIGVzY29sYXJpZGFkZV9lcSA9PSAxfjEsCiAgICAgIGVzY29sYXJpZGFkZV9lcSA9PSAyfjIsCiAgICAgIGVzY29sYXJpZGFkZV9lcSA9PSAzfjMsCiAgICAgIGVzY29sYXJpZGFkZV9lcSA9PSA0fjQsCiAgICAgIGVzY29sYXJpZGFkZV9lcSA9PSA1IHwgZXNjb2xhcmlkYWRlX2VxID09IDZ+NSkKICApCgoKI211ZGFuZG8gbyByb3R1bG8gZGEgdmFyaWF2ZWwgcmVnaWFvCmRhZG9zIDwtIGRhZG9zICU+JSAKICBtdXRhdGUoCiAgICByZWdpYW8gPSBjYXNlX3doZW4oCiAgICAgIHJlZ2lhbyA9PSAiTm9yZGVzdGUifjEsCiAgICAgIHJlZ2lhbyA9PSAiTm9ydGUifjIsCiAgICAgIHJlZ2lhbyA9PSAiU3VkZXN0ZSJ+MywKICAgICAgcmVnaWFvID09ICJDZW50cm8tT2VzdGUifjQsCiAgICAgIHJlZ2lhbyA9PSAiU3VsIn41KQogICkKCgojY3JpYW5kbyBhIHZhcmlhdmVsIExpdmluZ0NvbmRpdGlvbnMKCiNMaXhvCmRhZG9zIDwtIGRhZG9zICU+JSAKICBtdXRhdGUoCiAgICBsaXhvID0gY2FzZV93aGVuKAogICAgICBjb2RfZGVzdGlub19saXhvX2RvbWljX2ZhbV9lcSA9PSAxIHwgY29kX2Rlc3Rpbm9fbGl4b19kb21pY19mYW1fZXEgPT0gMn4xLAogICAgICBUUlVFfjApCiAgKQoKCiNFc2NvYW1lbnRvCmRhZG9zIDwtIGRhZG9zICU+JSAKICBtdXRhdGUoCiAgICBlc2NvYW1lbnRvID0gY2FzZV93aGVuKAogICAgICBjb2RfZXNjb2Ffc2FuaXRhcmlvX2RvbWljX2ZhbV9lcSA9PSAxIHwgY29kX2VzY29hX3Nhbml0YXJpb19kb21pY19mYW1fZXEgPT0gMiB8IGNvZF9lc2NvYV9zYW5pdGFyaW9fZG9taWNfZmFtX2VxID09IDN+MSwKICAgICAgVFJVRX4wKQogICkKCgoKCiNBZ3VhCmRhZG9zIDwtIGRhZG9zICU+JSAKICBtdXRhdGUoCiAgICBhZ3VhID0gY2FzZV93aGVuKAogICAgICBjb2RfYWJhc3RlX2FndWFfZG9taWNfZmFtX2VxID09IDF+MSwKICAgICAgVFJVRX4wKQogICkKCgojTGl2aW5nQ29uZGl0aW9ucwpkYWRvcyA8LSBkYWRvcyAlPiUgCiAgbXV0YXRlKAogICAgbGl2aW5nX2NvbmRpdGlvbnMgPSAobGl4byArIGVzY29hbWVudG8gKyBhZ3VhKQogICkKCgpgYGAKCiMjIDEuMyBSZWFsaXphbmRvIGEgbXVkYW5jYSBkZSBncmFvIGRhIGJhc2UKYGBge3J9CgojZmFtaWxpYXMgY29tIHBlbG8gbWVub3MgdW0gc3VpY2lkaW8KcXRkX3N1aWNfZmFtaWxpYSA8LSBkYWRvcyAlPiUgCiAgZ3JvdXBfYnkoY29kX2ZhbWlsaWFyX2VxKSAlPiUgI2FncnVwYW5kbyBwb3IgZmFtaWxpYXMKICBzdW1tYXJpc2UoCiAgICBxdGRfcGVzb2FzX2ZhbWlsaWEgPSBuKCksI3F1YW50aWRhZGUgZGUgcGVzc29hcyBuYSBmYW1pbGlhCiAgICBxdGRfc3VpY19mYW1pbGlhID0gc3VtKHN1aWNpZGUpLCAjcXVhbnRpZGFkZSBkZSBzdWljaWRpb3MgbmEgZmFtaWxpYQogICAgcXRkX2hvbWljX2ZhbWlsaWEgPSBzdW0oaG9taWNpZGUpLCAjcXVhbnRpZGFkZSBkZSBob21pY2lkaW8gbmEgZmFtaWxpYQogICAgaG9tZW1fZmFtaWxpYSA9IChzdW0oaG9tZW1fZmFtaWxpYSkvbigpKSoxMDAsICNwZXJjZW50dWFsIGRlIGhvbWVucyBuYSBmYW1pbGlhCiAgICByYWNhID0gbW9kYShjb2RfcmFjYV9jb3JfcGVzc29hX2VxKSwgI3JhY2EgcHJlZG9taW5hbnRlKG1vZGEpIG5hIGZhbWlsaWEKICAgIHJlZ2lhbyA9IG1vZGEocmVnaWFvKSwgI3JlZ2lhbyBwcmVkb21pbmFudGUgKG1vZGEpIGRhIGZhbWlsaWEKICAgIHVyYmFuID0gbW9kYSh1cmJhbiksICNwcmVkb21pbmFuY2lhIGRlIG1lbWJyb3MgZGEgZmFtaWxpYSBlbSBhcmVhIHVyYmFuYQogICAgaWRhZGUgPSBtb2RhKGlkYWRlKSwgI3ByZWRvbWluYW5jaWEgKG1vZGEpIGRhIGZhaXhhIGV0YXJpYSBkYSBmYW1pbGlhCiAgICBlc2NvbGFyaWRhZGUgPSBtb2RhKGVzY29sYXJpZGFkZSksICNwcmVkb21pbmFuY2lhIChtb2RhKSBkYSBmYWl4YSBldGFyaWEgZGEgZmFtaWxpYQogICAgbGl2aW5nX2NvbmRpdGlvbnMgPSBtb2RhKGxpdmluZ19jb25kaXRpb25zKSNjb25kaWNhbyBkZSB2aWRhIHByZWRvbWluYW50ZShtb2RhKSBuYSBmYW1pbGlhCiAgICApICU+JSAKICBmaWx0ZXIocXRkX3Blc29hc19mYW1pbGlhID4gMSkgI2ZhbWlsaWFzIGNvbSBtYWlzIGRlIHVtYSBwZXNzb2EKCgojY2F0ZWdvcml6YXIgYSBxdWFudGlkYWRlIGRlIHBlc3NvYXMgbmEgZmFtaWxpYQpxdGRfc3VpY19mYW1pbGlhIDwtIHF0ZF9zdWljX2ZhbWlsaWEgJT4lIAogIG11dGF0ZSggCiAgICBwZXNzb2FzX25hX2ZhbWlsaWEgPSBjYXNlX3doZW4oCiAgICAgIHF0ZF9wZXNvYXNfZmFtaWxpYSA9PSAyfiIxIiwKICAgICAgcXRkX3Blc29hc19mYW1pbGlhID09IDN+IjIiLAogICAgICBxdGRfcGVzb2FzX2ZhbWlsaWEgPT0gNH4iMiIsCiAgICAgIHF0ZF9wZXNvYXNfZmFtaWxpYSA9PSA1fiIzIiwKICAgICAgcXRkX3Blc29hc19mYW1pbGlhID09IDZ+IjMiLAogICAgICBxdGRfcGVzb2FzX2ZhbWlsaWEgPjd+IjQiKQogICkKICAKCgojY3JpYW5kbyBhIHZhcmlhdmVsIGRlc2ZlY2hvCmRhZG9zX2ZhbWlsaWEgPC0gcXRkX3N1aWNfZmFtaWxpYSAlPiUgCiAgbXV0YXRlKCAjc2UgdGV2ZSBwZWxvIG1lbm9zIHVtIHN1aWNpZGlvICgxKSBlIGNhc28gY29udHJyYXJpbyAoMCkKICAgIGRlc2ZlY2hvID0gY2FzZV93aGVuKHF0ZF9zdWljX2ZhbWlsaWEgPj0gMX4xLFRSVUV+MCkKICApCgoKYGBgCgojIyAxLjQgU2FsdmFuZG8gYSBiYXNlIGFncmVnYWRhIG5vIGdyYW8gZmFtaWxpYQpgYGB7cn0KI3NhbHZhbmRvIGEgYmFzZSBkZSBkYWRvcyBlbSAuY3N2CnJtKGRhZG9zKQp3cml0ZS5jc3YoZGFkb3NfZmFtaWxpYSwiL0RhZG9zL0Nvb3J0ZTEwMG0vUEJGX1NIU00vU0hBUkVEL0RhdGFzZXRfU0lNX0RhaWFuZV9nZW9fQWdyZWdhZGEuY3N2IikKcm0oZGFkb3NfZmFtaWxpYSkKcm0ocXRkX3N1aWNfZmFtaWxpYSkKZ2MoKQpgYGAKCgojIDIuIEFuw6FsaXNlIEV4cGxvcmF0w7NyaWEgZG9zIERhZG9zCgojIyMgMi4xIENhcnJlZ2FuZG8gYSBiYXNlIGRlIGRhZG9zIGFncmVnYWRhCmBgYHtyfQpkYWRvcyA8LSAKICBkYXRhLnRhYmxlOjpmcmVhZCgiL0RhZG9zL0Nvb3J0ZTEwMG0vUEJGX1NIU00vU0hBUkVEL0RhdGFzZXRfU0lNX0RhaWFuZV9nZW9fQWdyZWdhZGEuY3N2IikgCgojZGFkb3MgPC0gZGFkb3MgJT4lIHNhbXBsZV9uKDEwMDAwKQpgYGAKCgojIyAyLjIgVGFiZWxhIGRlIGNvbnRpbmfDqm5jaWEgdnMgVmFyacOhdmVsIGJpbsOhcmlhIHN1aWPDrWRpbyBmYW1pbGlhcgoKYGBge3IsIGxheW91dD0ibC1ib2R5LW91dHNldCJ9CgojdHJhbnNmb3JtYW5kbyBlbSBmYXRvcgpkYWRvcyRkZXNmZWNobyA8LSBmYWN0b3IoZGFkb3MkZGVzZmVjaG8pIApkYWRvcyRyYWNhIDwtIGZhY3RvcihkYWRvcyRyYWNhKSAKZGFkb3MkcmVnaWFvIDwtIGZhY3RvcihkYWRvcyRyZWdpYW8pIApkYWRvcyR1cmJhbiA8LSBmYWN0b3IoZGFkb3MkdXJiYW4pIApkYWRvcyRpZGFkZSA8LSBmYWN0b3IoZGFkb3MkaWRhZGUpIApkYWRvcyRlc2NvbGFyaWRhZGUgPC0gZmFjdG9yKGRhZG9zJGVzY29sYXJpZGFkZSkgCmRhZG9zJGxpdmluZ19jb25kaXRpb25zIDwtIGZhY3RvcihkYWRvcyRsaXZpbmdfY29uZGl0aW9ucykgCmRhZG9zJHBlc3NvYXNfbmFfZmFtaWxpYSA8LSBmYWN0b3IoZGFkb3MkcGVzc29hc19uYV9mYW1pbGlhKSAKCiNjcmlhbmRvIGEgdGFiZWxhIGRlIGNvbnRpbmfDqm5jaWEKZGFkb3MgJT4lIAogIHNlbGVjdCggI2FxdWkgdGEgc2VsZWNpb25hbmRvIGFzIHZhcmnDoXZlaXMgbmEgdGFiZWxhCiAgICBxdGRfaG9taWNfZmFtaWxpYSwKICAgIHBlc3NvYXNfbmFfZmFtaWxpYSwKICAgIGhvbWVtX2ZhbWlsaWEsCiAgICByYWNhLAogICAgcmVnaWFvLAogICAgdXJiYW4sCiAgICBpZGFkZSwKICAgIGVzY29sYXJpZGFkZSwKICAgIGxpdmluZ19jb25kaXRpb25zLAogICAgZGVzZmVjaG8pICU+JSAKICB0Ymxfc3VtbWFyeShieSA9IGRlc2ZlY2hvLAogICAgICAgICAgICAgIHN0YXRpc3RpYyA9IGxpc3QoYWxsX2NvbnRpbnVvdXMoKSB+ICJ7bWVhbn0gKHtzZH0pIikpICU+JSAKICBhZGRfcCgpICU+JSAjYWRpY2lvbmEgb3MgcC12YWxvcmVzIGRvcyB0ZXN0ZXMgZXN0YXTDrXN0aWNvcyAKICAgYm9sZF9sYWJlbHMoKSAKCgpgYGAKCgojIDMuIFJlZ3Jlc3NhbyBMb2dpc3RpY2EKCiMjIDMuMSBDb25zdHJ1Y2FvIGRvIG1vZGVsbwoKYGBge3IgZWNobz1UUlVFfQoKI21vZGVsYWdlbSBkYSByZWdyZXNzYW8gbG9naXN0aWNhCm0xIDwtIGdsbShkZXNmZWNobyB+IHF0ZF9ob21pY19mYW1pbGlhICsgcGVzc29hc19uYV9mYW1pbGlhICsgaG9tZW1fZmFtaWxpYSArIHJhY2EgKyByZWdpYW8gKyB1cmJhbiArIGlkYWRlICsgZXNjb2xhcmlkYWRlICsgbGl2aW5nX2NvbmRpdGlvbnMsIGRhdGEgPSBkYWRvcywgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQoKc3VtbWFyeShtMSkKCmBgYAoKIyMgMy4yIFRhYmVsYSBkZSBzaWduaWZpY2FuY2lhCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CiNjb25zdHJ1aW5kbyB0YWJlbGEKdGFiX21vZGVsKG0xLCBmaWxlPSJ0YWJlbGEtc3VpY2lkaW8uaHRtbCIpCmh0bWx0b29sczo6aW5jbHVkZUhUTUwoInRhYmVsYS1zdWljaWRpby5odG1sIikKCmBgYAoKCiMjIDMuMyBQbG90YW5kbyBvIGdyYWZpY28gY29tIE9kZHMgUmF0aW8KCmBgYHtyfQpwbG90X21vZGVsKG0xLCBjb2xvcnMgPSAiYnciLCBzaG93LnZhbHVlcyA9IFRSVUUsIHZhbHVlLm9mZnNldCA9IC41LCB0aXRsZSA9ICJTdWljaWRpbyBuYSBmYW1pbGlhIikKYGBgCgoKCgoK