rm(list=ls(all=TRUE))
dados_orig<- read_excel("dados.xlsx", col_types = c("text",
"text", "text", "text", "text", "text",
"text", "text", "text", "text", "text",
"text", "text", "text", "text","text", "numeric",
"text", "text", "text", "text", "numeric",
"text", "text", "text", "text", "text",
"text", "text", "text"))
dados_orig$q1 <-factor(dados_orig$q1, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q2 <-factor(dados_orig$q2, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q3 <-factor(dados_orig$q3, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q4 <-factor(dados_orig$q4, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q5 <-factor(dados_orig$q5, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q6 <-factor(dados_orig$q6, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q7 <-factor(dados_orig$q7, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q8 <-factor(dados_orig$q8, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q9 <-factor(dados_orig$q9, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q10 <-factor(dados_orig$q10, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q11 <-factor(dados_orig$q11, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
dados_orig$q12 <-factor(dados_orig$q12, levels = c("1","2","3","4","5","6","7"), labels = c("1","2","3","4","5","6","7"))
#dados_orig$sexo <-factor(dados_orig$sexo, levels = c("Masculino","Feminino"), labels = c("1","2"))
dados_orig <-remove_missing(dados_orig[,c(1:30)])
#dados_orig$estado
dados = dados_orig[,c(1:12)]
rownames(dados) <- dados_orig$regiao_orig
#rownames(dados)
Descrição simples
#glimpse(dados)
# Summary
#stats4::summary(dados)
#for (i in 1:12) {
#plot(dados_orig[,i], main=colnames(dados_orig)[i],
#ylab = "Frequência", col="steelblue", las = 2)
#}
likert_q1 <- likert(as.data.frame(dados), nlevels = 7)
likert.bar.plot(likert_q1,plot.percents=F,legend = "Legenda", low.color = "red", text.size=4) + ggtitle("") + labs( x = "Questões", y = "Porcentagem") + theme_minimal() + theme(legend.position = "bottom")

kable(summary(likert_q1)[,1:6],digits =2, row.names = F,longtable = TRUE, align=c('c', 'c','c','c','c', 'c', 'c'), booktabs = T, format.args = list(decimal.mark = ","))
|
Item
|
low
|
neutral
|
high
|
mean
|
sd
|
|
q4
|
0,86
|
0,29
|
98,86
|
6,67
|
0,71
|
|
q7
|
3,86
|
0,86
|
95,28
|
6,35
|
1,12
|
|
q11
|
5,72
|
3,00
|
91,27
|
6,13
|
1,31
|
|
q1
|
8,15
|
1,86
|
89,99
|
5,89
|
1,34
|
|
q9
|
7,01
|
8,15
|
84,84
|
5,67
|
1,28
|
|
q10
|
18,31
|
6,15
|
75,54
|
5,28
|
1,69
|
|
q8
|
17,31
|
8,87
|
73,82
|
4,99
|
1,61
|
|
q6
|
24,61
|
1,72
|
73,68
|
5,08
|
1,94
|
|
q2
|
26,75
|
2,00
|
71,24
|
5,17
|
2,18
|
|
q5
|
51,22
|
1,43
|
47,35
|
3,86
|
2,12
|
|
q12
|
44,35
|
22,75
|
32,90
|
3,59
|
2,04
|
|
q3
|
94,13
|
1,14
|
4,72
|
1,51
|
1,12
|
Método
1. Cálculo da distância de Gower. Artigo base para criar cluster com variáveis quali e quanti - Gower, J. C. (1971) A general coefficient of similarity and some of its properties, Biometrics 27, 857–874.
2. Escolha do algoritmo para formar os cluters. Foi empregado o algoritmo não hierárquico partitioning around medoids (PAM).
3. Selecionar o número de clusters. Usaremos a largura da silhueta, uma métrica de validação interna que é uma medida agregada de como a observação é semelhante ao seu próprio cluster em comparação com o cluster vizinho mais próximo.
Cálculo das distâncias
243951 dissimilarities, summarized :
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0000 0.5833 0.6667 0.6823 0.8333 1.0000
Metric : mixed ; Types = N, N, N, N, N, N, N, N, N, N, N, N
Number of objects : 699
[1] 0.5833333 0.7500000 0.7500000 0.8333333 0.9166667 0.9166667
Verificar a mais similar e mais dissimilar
Algoritmo não hierárquico PAM
Cálculo da silhueta - “Plot sihouette width (higher is better)”

Gráfico custer plot e medoids
grp = pam_fit$clustering
# como fazer com as dist? só lançar data como matriz de distâncias
fviz_cluster(list(data = gower_dist, cluster = grp),
#palette = c("orange", "green","red","brown", "blue"),
ellipse.type = "euclid", # Concentration ellipse
repel = TRUE, # Avoid label overplotting (slow)
show.clust.cent = T, ggtheme = theme_minimal()
)

Descrição dos grupos pelo algoritmo PAM
[[1]]
q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12
1: 13 1: 48 1:452 1: 3 1:126 1: 33 1: 10 1: 39 1: 9 1: 13 1: 13 1:164
2: 5 2: 16 2: 15 2: 2 2: 80 2: 19 2: 3 2: 21 2: 7 2: 37 2: 10 2: 73
3: 16 3: 25 3: 18 3: 1 3: 84 3: 38 3: 5 3: 30 3: 12 3: 21 3: 5 3: 33
4: 10 4: 6 4: 4 4: 2 4: 6 4: 4 4: 2 4: 46 4: 32 4: 24 4: 13 4:103
5: 68 5: 44 5: 8 5: 8 5: 92 5: 99 5: 27 5:128 5: 62 5: 81 5: 36 5: 48
6:138 6: 72 6: 2 6: 29 6: 31 6:115 6: 72 6:166 6:212 6:152 6:108 6: 30
7:254 7:293 7: 5 7:459 7: 85 7:196 7:385 7: 74 7:170 7:176 7:319 7: 53
cluster
Min. :1
1st Qu.:1
Median :1
Mean :1
3rd Qu.:1
Max. :1
[[2]]
q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12
1: 2 1:36 1:62 1: 0 1: 3 1:25 1: 1 1: 2 1: 2 1: 3 1: 1 1: 6
2: 4 2:35 2:92 2: 0 2:31 2:32 2: 2 2:18 2: 7 2:31 2: 7 2:20
3: 17 3:27 3:19 3: 0 3:34 3:25 3: 6 3:11 3:12 3:23 3: 4 3:14
4: 3 4: 8 4: 4 4: 0 4: 4 4: 8 4: 4 4:16 4:25 4:19 4: 8 4:56
5: 44 5:24 5:10 5: 16 5:48 5:40 5: 33 5:54 5:48 5:38 5: 24 5:31
6:105 6:61 6: 6 6:114 6:53 6:61 6:109 6:85 6:96 6:73 6:110 6:45
7: 20 7: 4 7: 2 7: 65 7:22 7: 4 7: 40 7: 9 7: 5 7: 8 7: 41 7:23
cluster
Min. :2
1st Qu.:2
Median :2
Mean :2
3rd Qu.:2
Max. :2
Quantidade em cada grupo por região
| |
1 |
2 |
| CENTRO-OESTE |
16 |
6 |
| Não nasci no Brasil, porém morei grande parte da minha vida no Sudeste |
0 |
1 |
| NE |
95 |
34 |
| NORTE |
12 |
2 |
| SUDESTE |
358 |
138 |
| SUL |
23 |
14 |
Resultados por Estado
[[1]]
q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12
1: 13 1: 48 1:452 1: 3 1:126 1: 33 1: 10 1: 39 1: 9 1: 13 1: 13 1:164
2: 5 2: 16 2: 15 2: 2 2: 80 2: 19 2: 3 2: 21 2: 7 2: 37 2: 10 2: 73
3: 16 3: 25 3: 18 3: 1 3: 84 3: 38 3: 5 3: 30 3: 12 3: 21 3: 5 3: 33
4: 10 4: 6 4: 4 4: 2 4: 6 4: 4 4: 2 4: 46 4: 32 4: 24 4: 13 4:103
5: 68 5: 44 5: 8 5: 8 5: 92 5: 99 5: 27 5:128 5: 62 5: 81 5: 36 5: 48
6:138 6: 72 6: 2 6: 29 6: 31 6:115 6: 72 6:166 6:212 6:152 6:108 6: 30
7:254 7:293 7: 5 7:459 7: 85 7:196 7:385 7: 74 7:170 7:176 7:319 7: 53
cluster
Min. :1
1st Qu.:1
Median :1
Mean :1
3rd Qu.:1
Max. :1
[[2]]
q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12
1: 2 1:36 1:62 1: 0 1: 3 1:25 1: 1 1: 2 1: 2 1: 3 1: 1 1: 6
2: 4 2:35 2:92 2: 0 2:31 2:32 2: 2 2:18 2: 7 2:31 2: 7 2:20
3: 17 3:27 3:19 3: 0 3:34 3:25 3: 6 3:11 3:12 3:23 3: 4 3:14
4: 3 4: 8 4: 4 4: 0 4: 4 4: 8 4: 4 4:16 4:25 4:19 4: 8 4:56
5: 44 5:24 5:10 5: 16 5:48 5:40 5: 33 5:54 5:48 5:38 5: 24 5:31
6:105 6:61 6: 6 6:114 6:53 6:61 6:109 6:85 6:96 6:73 6:110 6:45
7: 20 7: 4 7: 2 7: 65 7:22 7: 4 7: 40 7: 9 7: 5 7: 8 7: 41 7:23
cluster
Min. :2
1st Qu.:2
Median :2
Mean :2
3rd Qu.:2
Max. :2
| |
1 |
2 |
| Alagoas |
2 |
0 |
| Amapá |
1 |
0 |
| Amazonas |
6 |
2 |
| Aposentado |
2 |
0 |
| Bahia |
55 |
12 |
| Ceará |
2 |
1 |
| Desempregada |
1 |
0 |
| Distrito Federal |
4 |
5 |
| Espírito Santo |
6 |
2 |
| Goiás |
3 |
1 |
| Maranhão |
5 |
1 |
| Mato Grosso |
1 |
2 |
| Mato Grosso do Sul |
2 |
0 |
| Minas Gerais |
14 |
10 |
| Não Trabalho |
14 |
7 |
| Pará |
3 |
2 |
| Paraná |
7 |
2 |
| Pernambuco |
2 |
1 |
| Piauí |
0 |
1 |
| Rio de Janeiro |
277 |
109 |
| Rio Grande do Norte |
2 |
0 |
| Rio Grande do Sul |
8 |
3 |
| Rondônia |
1 |
0 |
| Roraima |
3 |
0 |
| Santa Catarina |
4 |
1 |
| São Paulo |
65 |
25 |
| Sergipe |
1 |
6 |
| Tocantins |
13 |
2 |
LS0tDQp0aXRsZTogIk8gbcOqcyBxdWUgYSBUZXJyYSBwYXJvdSwgY29yb25hdsOtcnVzIGUgUHNpY29sb2dpYSBDb21wbGV4YS4iDQphdXRob3I6ICJQcm9mZXNzb3IgRHIuIExlb25pLCBSLkMuIChBTUFOKS4iDQpkYXRlOiAnUmVsYXTDs3JpbyBnZXJhZG8gZW06IGByIGZvcm1hdChTeXMudGltZSgpLCAiJWQgZGUgJUIgZGUgJVkiKWAnDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBoaWdobGlnaHQ6IGVzcHJlc3NvDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KZW1haWw6IGxlb25pLnJvYmVydG9AYW1hbi5lYi5taWwuYnINCi0tLQ0KYGBge3Igc2V0dXAsIGVjaG89RkFMU0V9DQpybShsaXN0PWxzKGFsbD1UUlVFKSkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShlc3F1aXNzZSkgIyBwYWNvdGUgZ2dwbG90DQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShjbHVzdGVyKQ0KbGlicmFyeShOYkNsdXN0KQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KHJvYnVzdFgpDQpsaWJyYXJ5KGRlbmRleHRlbmQpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShjbHVzdE1peFR5cGUpDQpsaWJyYXJ5KGRwbHlyKSAjIGZvciBkYXRhIGNsZWFuaW5nDQpsaWJyYXJ5KElTTFIpICMgZm9yIGNvbGxlZ2UgZGF0YXNldA0KbGlicmFyeShSdHNuZSkgIyBmb3IgdC1TTkUgcGxvdA0KbGlicmFyeShnZ3Bsb3QyKSAjIGZvciB2aXN1YWxpemF0aW9uDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh4dGFibGUpDQpsaWJyYXJ5KGxpa2VydCkNCiNsaWJyYXJ5KHJlYWR4bCkNCiNsaWJyYXJ5KHBseXIpDQojbGlicmFyeShDbHVNaXgpDQpgYGANCg0KDQogIA0KDQpgYGB7cn0NCiM/ZGFpc3koKQ0KI2FydGlnbyBiYXNlIHBhcmEgY3JpYXIgY2x1c3RlciBjb20gdmFyacOhdmVpcyBxdWFsaSBlIHF1YW50aSAtIEdvd2VyLCBKLiBDLiAoMTk3MSkgQSBnZW5lcmFsIGNvZWZmaWNpZW50IG9mIHNpbWlsYXJpdHkgYW5kIHNvbWUgb2YgaXRzIHByb3BlcnRpZXMsIEJpb21ldHJpY3MgMjcsIDg1N+KAkzg3NC4NCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9Riwgd2FybmluZz1GQUxTRX0NCnJtKGxpc3Q9bHMoYWxsPVRSVUUpKQ0KDQpkYWRvc19vcmlnPC0gcmVhZF9leGNlbCgiZGFkb3MueGxzeCIsIGNvbF90eXBlcyA9IGMoInRleHQiLCANCiAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwidGV4dCIsICJudW1lcmljIiwgDQogICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsIA0KICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiKSkNCg0KZGFkb3Nfb3JpZyRxMSA8LWZhY3RvcihkYWRvc19vcmlnJHExLCBsZXZlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiksIGxhYmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSkNCmRhZG9zX29yaWckcTIgPC1mYWN0b3IoZGFkb3Nfb3JpZyRxMiwgbGV2ZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpLCBsYWJlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IikpDQpkYWRvc19vcmlnJHEzIDwtZmFjdG9yKGRhZG9zX29yaWckcTMsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KZGFkb3Nfb3JpZyRxNCA8LWZhY3RvcihkYWRvc19vcmlnJHE0LCBsZXZlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiksIGxhYmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSkNCmRhZG9zX29yaWckcTUgPC1mYWN0b3IoZGFkb3Nfb3JpZyRxNSwgbGV2ZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpLCBsYWJlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IikpDQpkYWRvc19vcmlnJHE2IDwtZmFjdG9yKGRhZG9zX29yaWckcTYsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KZGFkb3Nfb3JpZyRxNyA8LWZhY3RvcihkYWRvc19vcmlnJHE3LCBsZXZlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiksIGxhYmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSkNCmRhZG9zX29yaWckcTggPC1mYWN0b3IoZGFkb3Nfb3JpZyRxOCwgbGV2ZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpLCBsYWJlbHMgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IikpDQpkYWRvc19vcmlnJHE5IDwtZmFjdG9yKGRhZG9zX29yaWckcTksIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KZGFkb3Nfb3JpZyRxMTAgPC1mYWN0b3IoZGFkb3Nfb3JpZyRxMTAsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KZGFkb3Nfb3JpZyRxMTEgPC1mYWN0b3IoZGFkb3Nfb3JpZyRxMTEsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KZGFkb3Nfb3JpZyRxMTIgPC1mYWN0b3IoZGFkb3Nfb3JpZyRxMTIsIGxldmVscyA9IGMoIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciKSwgbGFiZWxzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIpKQ0KI2RhZG9zX29yaWckc2V4byA8LWZhY3RvcihkYWRvc19vcmlnJHNleG8sIGxldmVscyA9IGMoIk1hc2N1bGlubyIsIkZlbWluaW5vIiksIGxhYmVscyA9IGMoIjEiLCIyIikpDQpkYWRvc19vcmlnIDwtcmVtb3ZlX21pc3NpbmcoZGFkb3Nfb3JpZ1ssYygxOjMwKV0pDQojZGFkb3Nfb3JpZyRlc3RhZG8NCmRhZG9zID0gZGFkb3Nfb3JpZ1ssYygxOjEyKV0NCnJvd25hbWVzKGRhZG9zKSA8LSBkYWRvc19vcmlnJHJlZ2lhb19vcmlnDQojcm93bmFtZXMoZGFkb3MpDQpgYGANCg0KIyBEZXNjcmnDp8OjbyBzaW1wbGVzDQoNCmBgYHtyIG1lc3NhZ2U9Riwgd2FybmluZz1GQUxTRX0NCiNnbGltcHNlKGRhZG9zKQ0KIyBTdW1tYXJ5IA0KI3N0YXRzNDo6c3VtbWFyeShkYWRvcykNCiNmb3IgKGkgaW4gMToxMikgew0KI3Bsb3QoZGFkb3Nfb3JpZ1ssaV0sIG1haW49Y29sbmFtZXMoZGFkb3Nfb3JpZylbaV0sDQojeWxhYiA9ICJGcmVxdcOqbmNpYSIsIGNvbD0ic3RlZWxibHVlIiwgbGFzID0gMikNCiN9DQoNCmxpa2VydF9xMSA8LSBsaWtlcnQoYXMuZGF0YS5mcmFtZShkYWRvcyksIG5sZXZlbHMgPSA3KQ0KbGlrZXJ0LmJhci5wbG90KGxpa2VydF9xMSxwbG90LnBlcmNlbnRzPUYsbGVnZW5kID0gIkxlZ2VuZGEiLCBsb3cuY29sb3IgPSAicmVkIiwgdGV4dC5zaXplPTQpICsgZ2d0aXRsZSgiIikgKyBsYWJzKCB4ID0gIlF1ZXN0w7VlcyIsIHkgPSAiUG9yY2VudGFnZW0iKSArIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQprYWJsZShzdW1tYXJ5KGxpa2VydF9xMSlbLDE6Nl0sZGlnaXRzID0yLCByb3cubmFtZXMgPSBGLGxvbmd0YWJsZSA9IFRSVUUsIGFsaWduPWMoJ2MnLCAnYycsJ2MnLCdjJywnYycsICdjJywgJ2MnKSwgYm9va3RhYnMgPSBULCBmb3JtYXQuYXJncyA9IGxpc3QoZGVjaW1hbC5tYXJrID0gIiwiKSkNCmBgYA0KDQojIE3DqXRvZG8gIA0KICANCiAgICAxLiBDw6FsY3VsbyBkYSBkaXN0w6JuY2lhIGRlIEdvd2VyLiBBcnRpZ28gYmFzZSBwYXJhIGNyaWFyIGNsdXN0ZXIgY29tIHZhcmnDoXZlaXMgcXVhbGkgZSBxdWFudGkgLSBHb3dlciwgSi4gQy4gKDE5NzEpIEEgZ2VuZXJhbCBjb2VmZmljaWVudCBvZiBzaW1pbGFyaXR5IGFuZCBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzLCBCaW9tZXRyaWNzIDI3LCA4NTfigJM4NzQuDQogICAgDQogICAgMi4gRXNjb2xoYSBkbyBhbGdvcml0bW8gcGFyYSBmb3JtYXIgb3MgY2x1dGVycy4gRm9pIGVtcHJlZ2FkbyBvIGFsZ29yaXRtbyBuw6NvIGhpZXLDoXJxdWljbyBwYXJ0aXRpb25pbmcgYXJvdW5kIG1lZG9pZHMgKFBBTSkuICANCiAgICANCiAgICAzLiBTZWxlY2lvbmFyIG8gbsO6bWVybyBkZSBjbHVzdGVycy4gVXNhcmVtb3MgYSBsYXJndXJhIGRhIHNpbGh1ZXRhLCB1bWEgbcOpdHJpY2EgZGUgdmFsaWRhw6fDo28gaW50ZXJuYSBxdWUgw6kgdW1hIG1lZGlkYSBhZ3JlZ2FkYSBkZSBjb21vIGEgb2JzZXJ2YcOnw6NvIMOpIHNlbWVsaGFudGUgYW8gc2V1IHByw7NwcmlvIGNsdXN0ZXIgZW0gY29tcGFyYcOnw6NvIGNvbSBvIGNsdXN0ZXIgdml6aW5obyBtYWlzIHByw7N4aW1vLg0KDQoNCiMgQ8OhbGN1bG8gZGFzIGRpc3TDom5jaWFzDQoNCmBgYHtyfQ0KIyBFc2NvbGhhIGEgbcOpdHJpY2ENCmdvd2VyX2Rpc3QgPC0gZGFpc3koZGFkb3MsIG1ldHJpYyA9ICJnb3dlciIpDQoNCiNnb3dlcl9kaXN0IDwtIGRpc3QoZGFkb3MsIG1ldGhvZCA9ICJtaW5rb3dza2kiLHA9MSkNCg0KI2dvd2VyDQojIENoZWNrIGF0dHJpYnV0ZXMgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IG1ldGhvZHMgYXJlIGJlaW5nIHVzZWQNCiMgKEkgPSBpbnRlcnZhbCcsJyBOID0gbm9taW5hbCkNCiNnb3dlcl9kaXN0DQpzdW1tYXJ5KGdvd2VyX2Rpc3QpDQpoZWFkKGdvd2VyX2Rpc3QpDQoNCmBgYA0KDQojIFZlcmlmaWNhciBhIG1haXMgc2ltaWxhciBlIG1haXMgZGlzc2ltaWxhcg0KYGBge3J9DQpnb3dlcl9tYXQgPC0gYXMubWF0cml4KGdvd2VyX2Rpc3QpDQojIE91dHB1dCBtb3N0IHNpbWlsYXIgcGFpcg0KZGFkb3NbDQogIHdoaWNoKGdvd2VyX21hdCA9PSBtaW4oZ293ZXJfbWF0W2dvd2VyX21hdCAhPSBtaW4oZ293ZXJfbWF0KV0pLA0KICAgICAgICBhcnIuaW5kID0gVFJVRSlbMSwgXSwgXQ0KZGFkb3NbDQogIHdoaWNoKGdvd2VyX21hdCA9PSBtYXgoZ293ZXJfbWF0W2dvd2VyX21hdCAhPSBtYXgoZ293ZXJfbWF0KV0pLA0KICAgICAgICBhcnIuaW5kID0gVFJVRSlbMSwgXSwgXQ0KYGBgDQoNCiMgQWxnb3JpdG1vIG7Do28gaGllcsOhcnF1aWNvIFBBTQ0KDQojIyBDw6FsY3VsbyBkYSBzaWxodWV0YSAtICJQbG90IHNpaG91ZXR0ZSB3aWR0aCAoaGlnaGVyIGlzIGJldHRlcikiDQpgYGB7cn0NCiMgQ2FsY3VsYXRlIHNpbGhvdWV0dGUgd2lkdGggZm9yIG1hbnkgayB1c2luZyBQQU0NCiNnb3dlcl9kaXN0IC0gbWF0cml6IGNvbSBhcyBkaXN0w6JuY2lhcw0Kc2lsX3dpZHRoIDwtIGMoTkEpDQpmb3IoaSBpbiAyOjUpew0KICBwYW1fZml0IDwtIHBhbShnb3dlcl9kaXN0LA0KICAgICAgICAgICAgICAgICBkaXNzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgayA9IGkpDQogIHNpbF93aWR0aFtpXSA8LSBwYW1fZml0JHNpbGluZm8kYXZnLndpZHRoDQp9DQojIFBsb3Qgc2lob3VldHRlIHdpZHRoIChoaWdoZXIgaXMgYmV0dGVyKQ0KI3Bsb3QoMTo1LCBzaWxfd2lkdGgsDQojICAgICB4bGFiID0gIk51bWJlciBvZiBjbHVzdGVycyIsDQojICAgICB5bGFiID0gIlNpbGhvdWV0dGUgV2lkdGgiKQ0KI2xpbmVzKDE6NSwgc2lsX3dpZHRoKQ0KDQojIE91dHJhIGZ1bsOnw6NvDQojIHBhcmEgbyBQQU0NCmZ2aXpfbmJjbHVzdChnb3dlcl9tYXQscGFtLG1ldGhvZCA9ICJzaWxob3VldHRlIikgKyB0aGVtZV9jbGFzc2ljKCkNCg0KIyBwYXJhIGstbWVhbnMNCiNmdml6X25iY2x1c3QoZ293ZXJfbWF0LGttZWFucyxtZXRob2QgPSAid3NzIikgKyB0aGVtZV9jbGFzc2ljKCkNCg0KYGBgDQoNCiMjIEdyw6FmaWNvIGN1c3RlciBwbG90IGUgbWVkb2lkcw0KYGBge3IgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTE4LCB3YXJuaW5nPUZ9DQprPTINCg0KcGFtX2ZpdCA8LSBwYW0oZ293ZXJfZGlzdCwgZGlzcyA9IFRSVUUsIGspDQojcGFtX2ZpdCRjbHVzdGVyaW5nDQojYXMubWF0cml4KGRhZG9zW3BhbV9maXQkbWVkb2lkcywgXSkNCiNwcmludChwYW1fZml0KQ0KbWVkb2lkcz1wYW1fZml0JG1lZG9pZHMNCg0KZGFkb3Nfb3JpZyAlPiUgZmlsdGVyKHJlZ2lhb19vcmlnPT1jKG1lZG9pZHMpKQ0KDQoNCmdycCA9IHBhbV9maXQkY2x1c3RlcmluZw0KIyAgY29tbyBmYXplciBjb20gYXMgZGlzdD8gIHPDsyBsYW7Dp2FyIGRhdGEgY29tbyBtYXRyaXogZGUgZGlzdMOibmNpYXMNCg0KZnZpel9jbHVzdGVyKGxpc3QoZGF0YSA9IGdvd2VyX2Rpc3QsIGNsdXN0ZXIgPSBncnApLA0KI3BhbGV0dGUgPSBjKCJvcmFuZ2UiLCAiZ3JlZW4iLCJyZWQiLCJicm93biIsICJibHVlIiksDQplbGxpcHNlLnR5cGUgPSAiZXVjbGlkIiwgIyBDb25jZW50cmF0aW9uIGVsbGlwc2UNCnJlcGVsID0gVFJVRSwgIyBBdm9pZCBsYWJlbCBvdmVycGxvdHRpbmcgKHNsb3cpDQpzaG93LmNsdXN0LmNlbnQgPSBULCBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpDQopDQpgYGANCg0KDQojIyBEZXNjcmnDp8OjbyBkb3MgZ3J1cG9zIHBlbG8gYWxnb3JpdG1vIFBBTQ0KYGBge3J9DQpwYW1fcmVzdWx0cyA8LSBkYWRvcyAlPiUNCiAgZHBseXI6Om11dGF0ZShjbHVzdGVyID0gcGFtX2ZpdCRjbHVzdGVyaW5nKSAlPiUNCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lDQogIGRvKHRoZV9zdW1tYXJ5ID0gc3VtbWFyeSguKSkNCg0KcGFtX3Jlc3VsdHMkdGhlX3N1bW1hcnkNCg0KZGFkb3Nfb3JpZyA8LSBkYWRvc19vcmlnICU+JSBtdXRhdGUoZ3J1cG8gPSBwYW1fZml0JGNsdXN0ZXJpbmcgKSANCg0KDQpgYGANCg0KIyMgUXVhbnRpZGFkZSBlbSBjYWRhIGdydXBvIHBvciByZWdpw6NvDQoNCmBgYHtyfQ0Ka2FibGVFeHRyYTo6a2FibGUodGFibGUoZGFkb3Nfb3JpZyRyZWdpYW8sIGRhZG9zX29yaWckZ3J1cG8pKSU+JSBrYWJsZV9zdHlsaW5nKCkNCg0KYGBgDQoNCg0KIyMgUmVzdWx0YWRvcyBwb3IgRXN0YWRvDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQpyb3duYW1lcyhkYWRvcykgPC0gZGFkb3Nfb3JpZyRlc3RhZG9fdHJhYg0KIyMgRGVzY3Jpw6fDo28gZG9zIGdydXBvcyBwZWxvIGFsZ29yaXRtbyBQQU0NCnBhbV9yZXN1bHRzIDwtIGRhZG9zICU+JQ0KICBkcGx5cjo6bXV0YXRlKGNsdXN0ZXIgPSBwYW1fZml0JGNsdXN0ZXJpbmcpICU+JQ0KICBncm91cF9ieShjbHVzdGVyKSAlPiUNCiAgZG8odGhlX3N1bW1hcnkgPSBzdW1tYXJ5KC4pKQ0KDQpwYW1fcmVzdWx0cyR0aGVfc3VtbWFyeQ0KDQpkYWRvc19vcmlnIDwtIGRhZG9zX29yaWcgJT4lIG11dGF0ZShncnVwbyA9IHBhbV9maXQkY2x1c3RlcmluZyApIA0KdGFiIDwtIHRhYmxlKGRhZG9zX29yaWckZXN0YWRvLCBkYWRvc19vcmlnJGdydXBvKQ0Ka2FibGVFeHRyYTo6a2FibGUodGFiKSAlPiUga2FibGVfc3R5bGluZygpDQoNCg0KI0dyw6FmaWNvIGRlIENvbHVuYXMgb3UgYmFycmFzIHZlcnRpY2FpcyBwb3Igc2V4bw0KZ3JhZmljb19jb2x1bmE9Z2dwbG90KGRhZG9zX29yaWcsYWVzKGdydXBvLGZpbGw9ZXN0YWRvKSkgKyANCiAgICAgICAgICAgICAgIGdlb21fYmFyKCkgKw0KICAgICAgICAgICAgICAgZ2d0aXRsZSgiIikrDQogICAgICAgICAgICAgICB4bGFiKCJHcnVwb3MiKSArDQogICAgICAgICAgICAgICB5bGFiKCJGcmVxLiIpIA0KICAgICAgICAgICAgIA0KZ2dwbG90bHkoZ3JhZmljb19jb2x1bmEpDQoNCg0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=