A continuación, la nube de palabras negativas.
Para cerrar, clasificaremos todas las palabras de esta recolección con el diccionario NRC. Este diccionario clasifica palabras según una mayor cantidad de sentimientos.
#carga de diccionario NRC
hashnrc_data <- get_nrc_sentiment(char_v = BaseTokens$word, language = 'spanish')
hashnrc_data <- hashnrc_data %>%
rename('anticipación'=anticipation,
'ira'=anger,
'disgusto'=disgust,
'miedo'=fear,
'alegría'=joy,
'tristeza'=sadness,
'sorpresa'=surprise,
'confianza'=trust,
'negativa'=negative,
'positiva'=positive)
#Manipulación de data
base_emocionhash <- data.frame(t(hashnrc_data))
base_emocionhash <- data.frame(rowSums(base_emocionhash))
names(base_emocionhash)[1] <- "total"
base_emocionhash <- cbind('sentimiento'=rownames(base_emocionhash),base_emocionhash)
rownames(base_emocionhash) <- NULL
#Graficamos
# ggplot(base_emocionhash[1:8,], aes(x = sentimiento, y = round(cuenta/sum(cuenta)*100, 1), fill = sentimiento)) +
# geom_bar(stat = "identity") +
# labs(title='Elecciones Alberto Fernandez - Sentiment Analysis (NRC)',
# subtitle = 'Trabajo Final Taller de Análisis de Texto del CPS',
# caption='Fuente: Twitter',
# x = "Sentimiento",
# y = "Frecuencia") +
# geom_text(aes(label = paste(round(cuenta/sum(cuenta)*100, 1), '%')),
# vjust = 1.5, color = "black",
# size = 4)
base_emocionhash2 <- base_emocionhash %>%
head(8) %>%
mutate(color = case_when(sentimiento == "miedo"~ "#ff4d4d",
sentimiento == "ira"~ "#ff4d4d",
sentimiento == "disgusto"~ "#ff4d4d",
sentimiento == "tristeza"~ "#ff4d4d",
sentimiento == "anticipación"~ "#36b336",
sentimiento == "alegría"~ "#36b336",
sentimiento == "sorpresa"~ "#36b336",
sentimiento == "confianza"~ "#36b336",)) %>%
arrange(total) %>%
mutate("%" = round((total/sum(total)*100),2))
x <- c("total", "%")
y <- sprintf("{point.%s}", c("total", "%"))
tltip <- tooltip_table(x, y)
Grafico11 <- highchart() %>%
hc_title(text="Sentimientos")%>%
#hc_chart(type="column") %>%
hc_xAxis(categories = base_emocionhash2$sentimiento) %>%
hc_add_series(base_emocionhash2,"column", hcaes(base_emocionhash2$sentimiento,base_emocionhash2$`%`, color = base_emocionhash2$color), name = "Sentimientos") %>%
hc_tooltip(useHTML = TRUE,
headerFormat = as.character(tags$small("{point.x: %Y %b}")),
pointFormat = tltip
)
Grafico11
Las palabras vinculadas con el sentimiento de confianza son las mayoritarias.
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBUd2VldHMiDQphdXRob3I6ICJGZXJjaGVybyBKdWFuIEd1aWxsZXJtbyAoQGd1aWxsZWFkaG9ub3JlbSleWyBfU295IHNvY2nDs2xvZ28gKEZTT0MtVUJBKS4gTWUgZGVkaWNvIGFsIGFuYWxpc2lzIGRlIGRhdG9zIGVuIHRlbWFzIGNvbW8gZWwgZXN0dWRpbyBkZSBsYSBvcGluacOzbiBww7pibGljYSwgY29tcG9ydGFtaWVudG8gZWxlY3RvcmFsLCBhbmFsaXNpcyBkZSB0ZXh0bywgcmVkZXMgc29jaWFsZXMgeSBjb25zdW1vcyBjdWx0dXJhbGVzLCB0b2RvIG1lZGlhbnRlIFIgeSBQeXRob24uIERpcmlqbyBlbCBPYnNlcnZhdG9yaW8gZGUgT3BpbmnDs24gUHVibGljYSAgZW5fIFtBQ0RFU10oaHR0cDovL3d3dy5hY2Rlc3dlYi5vcmcvKSBfeSBlc2NyaWJvIGVuXyBbbWkgYmxvZyBkZSB0ZW1hcyBkZSBSXShodHRwczovL3JwdWJzLmNvbS9ndWlsbGVmZXJjaGVybykgX3kgZW5fIFttaSBibG9nIGRlIHRlbWFzIGRlIGdlbmVyYWxlc10oaHR0cHM6Ly9iaXRhY29yYW1vZGVybmFibG9nLndvcmRwcmVzcy5jb20pLiBfQ29udGFjdG9fOiBndWlsbGVmZXJjaGVyb0BnbWFpbC5jb21dIg0KZGF0ZTogIk1hcnpvIGRlIDIwMjAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogVFJVRQ0KICAgIGRlcHRoOiA1DQogICAgYWx3YXlzX2FsbG93X2h0bWw6IHRydWUNCnN1YnRpdGxlOiBFeHBsb3JhbmRvIGxvcyBkaXNjdXJzb3MgZGUgQWxiZXJ0byB5IHN1cyByZXBlcmN1c2lvbmVzDQotLS0NCiAgICANCjxicj4NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSkNCmBgYA0KICAgICANCiMgUHJlc2VudGFjacOzbg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQoNCiMgc2UgYm9ycmFuIHRvZG9zIGxvcyBvYmpldG9zIGRlIGxhIG1lbW9yaWENCg0Kcm0obGlzdCA9bHMoKSkNCg0KIyBzZSBjYXJnYW4gbGlicmVyaWFzIGRlIHRyYWJham8NCmxpYnJhcnkocnR3ZWV0KQ0KbGlicmFyeSgidGlkeXZlcnNlIikNCmxpYnJhcnkodG0pDQpsaWJyYXJ5KGdnd29yZGNsb3VkKQ0KbGlicmFyeShwcm91c3RyKQ0KbGlicmFyeShzeXV6aGV0KQ0KbGlicmFyeShTbm93YmFsbEMpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeSh0aWR5dGV4dCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShoaWdoY2hhcnRlcikNCmxpYnJhcnkod29yZGNsb3VkKQ0KbGlicmFyeShnZ3Rlcm4pDQoNCg0KI0xldmFudGFtb3MgdW5hIHZlcnNpw7NuIGRlIFNEQUwgDQoNCnNkYWwgPC0gcmVhZC5jc3YoJ3NkYWwuY3N2JywgZW5jb2RpbmcgPSAnVVRGLTgnKQ0KDQpgYGANCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpMYSBpZGVhIGRlIGVzdGUgYXJ0w61jdWxvIGVzIGFuYWxpemFyIHRhbnRvIGxhIGFjdGl2aWRhZCBkaXNjdXJzaXZhIGRlbCBQcmVzaWRlbnRlIGRlIEFyZ2VudGluYSBBbGJlcnRvIEZlcm7DoW5kZXogY29tbyBsYXMgcmVwZXJjdXNpb25lcyBkZSBzdXMgcGFsYWJyYXMuIEEgdHJhdsOpcyBkZSBsYSBkZXNjYXJnYSBkZSB0b2RvcyBzdXMgdHdlZXRzIGVtaXRpZG9zIGR1cmFudGUgZWwgcGVyw61vZG8gcXVlIHZhIGRlc2RlIGVsIDEzLzMgaGFzdGEgZWwgMTMvNCwgc2UgZXNwZXJhIHJlY3VwZXJhciBsYXMgcHJpbmNpcGFsZXMgY2lmcmFzIHkgZWxlbWVudG9zIHF1ZSBkZXNjcmliYW4gbGFzIGZvcm1hcyBwb3IgbGFzIGN1YWxlcyBlbGlnZSBjb211bmljYXIgc3VzIG1lbnNhamVzIGVuIGxhIHJlZCB5IGVsIGFsY2FuY2UgZGUgbG9zIG1pc21vcyBlbiBlbCBjb250ZXh0byBkZSBsYSBjcmlzaXMgZGVsIENPVklELTE5LiBQb3Igb3RyYSBwYXJ0ZSwgdGFtYmllbiBzZSBpbmNsdXllIGVuIGVzdGUgYW7DoWxpc2lzIGxvcyBkaXNjdXJzb3MgZW1pdGlkb3MgeSBlbCBhbsOhbGlzaXMgZGUgYWxndW5hcyBtZW5jaW9uZXMgZGUgdXN1YXJpb3MgYWwgUHJlc2lkZW50ZS4NCkxhcyBiYXNlcyBkZSB0cmFiYWpvIGZ1ZXJvbiBjb25mb3JtYWRhcyBtZWRpYW50ZSBsYSBkZXNjYXJnYSBkZSB0d2VldHMgYSB0cmF2w6lzIGRlbCBwYXF1ZXRlIFtSdHdlZXRdKGh0dHBzOi8vcnR3ZWV0LmluZm8vKSB5IGRlbCBwYXF1ZXRlIFt0d2FyY10oaHR0cHM6Ly9naXRodWIuY29tL0RvY05vdy90d2FyYykuIExvcyBkaXNjdXJzb3MgZnVlcm9uIGRlc2NhcmdhZG9zIGRlbCBbc2l0aW9dKGh0dHBzOi8vd3d3LmNhc2Fyb3NhZGEuZ29iLmFyL2luZm9ybWFjaW9uL2Rpc2N1cnNvcykNCg0KDQo8ZGl2Lz4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNMZXZhbnRhbW9zIGxhIGJhc2UgY29uIFR3ZWV0cyBkZSBBbGJlcnRvDQoNCkJhc2UgPC0gcmVhZC5jc3YoImFsYmVydG8uY3N2IiwgZW5jb2RpbmcgPSAiVVRGLTgiKQ0KDQpCYXNlQyA8LSBCYXNlICU+JQ0KICBtdXRhdGUoZmVjaGEgPSBhcy5EYXRlKGRhdGUpKSAlPiUgDQogIGZpbHRlcihmZWNoYSA+PSAnMjAyMC0wMy0xMycpICU+JSANCiAgbXV0YXRlKGhvcmE9YXMubnVtZXJpYyhzdWJzdHIodGltZSwxLDIpKSkNCg0KDQoNCmNhbnRpZGFkIDwtIG5yb3coQmFzZUMpDQoNCmRlc2RlIDwtIG1pbihCYXNlQyRmZWNoYSkNCg0KaGFzdGEgPC0gbWF4KEJhc2VDJGZlY2hhKQ0KDQpgYGANCg0KDQojIyBEZXNjcmlwdGl2b3MNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkx1ZWdvIGRlIGxhIGRlc2NhcmdhIHkgcG9zdGVyaW9yIGxpbXBpZXphIGRlIGxvcyBkYXRvcywgcHJvY2VkZXJlbW9zIGEgYW5hbGl6YXIgbGEgY2FudGlkYWQgZGUgdHdlZXRzIGVtaXRpZG9zIGNvbnNpZGVyYW5kbyB2YXJpYWJsZXMgdGVtcG9yYWxlcy4gTGEgQmFzZSBjb250aWVuZSB1biB0b3RhbCBkZSBgciBjYW50aWRhZGAgZGUgdHdlZXRzIHB1YmxpY2Fkb3MgZGVzZGUgYHIgZGVzZGVgIGhhc3RhIGByIGhhc3RhYC4NCg0KPGRpdi8+DQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojVkVSU0lPTiBISUdIQ0hBUlQNCm9wdGlvbnMoaGlnaGNoYXJ0ZXIudGhlbWUgPSBoY190aGVtZV9nZ3Bsb3QyKCkpDQpUYWJsYV8xIDwtIEJhc2VDICU+JSANCiAgc2VsZWN0KGZlY2hhKSAlPiUNCiAgZ3JvdXBfYnkoZmVjaGEpICU+JQ0KICBhcnJhbmdlKGZlY2hhKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsID0gbigpKSANCg0KDQoNCkdyYWZpY28xIDwtICBoaWdoY2hhcnQoKSAlPiUgDQogIGhjX3RpdGxlKHRleHQ9IkNhbnRpZGFkIGRlIHR3ZWV0cyBwb3IgZMOtYSIpJT4lDQogIGhjX2NoYXJ0KHR5cGU9ImxpbmUiKSAlPiUNCiAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IFRhYmxhXzEkZmVjaGEpICU+JQ0KICBoY19hZGRfc2VyaWVzKFRhYmxhXzEkdG90YWwsIG5hbWU9IkNhbnRpZGFkIGRlIFR3ZWV0cyIpIA0KDQpHcmFmaWNvMQ0KDQpgYGANCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpTZSBhcHJlY2lhIHVuYSBmdWVydGUgYWN0aXZpZGFkIGR1cmFudGUgbG9zIGTDrWFzIHBvc3RlcmlvcmVzIGEgbGEgZW51bmNpYWNpw7NuIGRlIGxhIEN1YXJlbnRlbmEgeSBlbiBsb3MgcHJpbWVyb3MgZMOtYXMgZGUgYWJyaWwuDQoNCjxkaXYvPg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI1ZFUlNJT04gSElHSENIQVJUDQpvcHRpb25zKGhpZ2hjaGFydGVyLnRoZW1lID0gaGNfdGhlbWVfZ2dwbG90MigpKQ0KVGFibGFfMiA8LSBCYXNlQyAlPiUgDQogIHNlbGVjdChob3JhKSAlPiUNCiAgZ3JvdXBfYnkoaG9yYSkgJT4lDQogIGFycmFuZ2UoaG9yYSkgJT4lDQogIHN1bW1hcmlzZSh0b3RhbCA9IG4oKSkgDQoNCg0KDQpHcmFmaWNvMiA8LSAgaGlnaGNoYXJ0KCkgJT4lIA0KICBoY190aXRsZSh0ZXh0PSJOw7ptZXJvIGRlIHR3ZWV0cyBzZWfDum4gaG9yYSIpJT4lDQogIGhjX2NoYXJ0KHR5cGU9ImxpbmUiKSAlPiUNCiAgaGNfY29sb3JzKGNvbG9yID0gIiNCNzFDMUMiKSAlPiUgDQogIGhjX3hBeGlzKGNhdGVnb3JpZXMgPSBUYWJsYV8yJGhvcmEpICU+JQ0KICBoY19hZGRfc2VyaWVzKFRhYmxhXzIkdG90YWwsIG5hbWU9IkNhbnRpZGFkIGRlIFR3ZWV0cyIpIA0KDQpHcmFmaWNvMg0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KU2UgcHVlZGUgdmVyIHBpY29zIGRlIGFjdGl2aWRhZCBkdXJhbnRlIGxhcyBob3JhcyBub2N0dXJuYXMsIGRvbmRlIGVsIFByZXNpZGVudGUgZGVkaWNhIHRpZW1wbyBhIHJlc3BvbmRlciBzYWx1ZG9zIHkgY29uc3VsdGFzLg0KDQpPdHJvIGRhdG8gcmVsZXZhbnRlIGVzIGV2YWx1YXIgbGEgcHJvcG9yY2nDs24gZGUgbWVuc2FqZXMgcXVlIHNlIGVudsOtYW4gc2Vnw7puIGVsIGRpc3Bvc2l0aXZvLiBUYW1iaWVuIGVzIHBvc2libGUgYW5hbGl6YXIgbGEgZXZvbHVjacOzbiBkZSBlc3RhIHZhcmlhYmxlDQoNCjxkaXYvPg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpvcHRpb25zKHNjaXBlbj05OTkpDQoNCkJhc2VBbGJlcnRvIDwtIHJlYWQuY3N2KCJCYXNlVHdlZXRzYWxiZXJ0by5jc3YiKQ0KDQpCYXNlU291cmNlIDwtIEJhc2VBbGJlcnRvICU+JSANCiAgc2VsZWN0KHN0YXR1c19pZCxzb3VyY2UpICU+JSANCiAgcmVuYW1lKGlkID0gc3RhdHVzX2lkLCBkaXNwID0gc291cmNlKQ0KDQpCYXNlQ1MgPC0gbGVmdF9qb2luKEJhc2VDLEJhc2VTb3VyY2UsIGJ5ID0gJ2lkJykNCg0KDQojVkVSU0lPTiBISUdIQ0hBUlQNCm9wdGlvbnMoaGlnaGNoYXJ0ZXIudGhlbWUgPSBoY190aGVtZV9nZ3Bsb3QyKCkpDQpUYWJsYV8zIDwtIEJhc2VDUyAlPiUgDQogIHNlbGVjdChkaXNwKSAlPiUNCiAgZ3JvdXBfYnkoZGlzcCkgJT4lDQogIHN1bW1hcmlzZSh0b3RhbCA9IG4oKSkgJT4lIA0KICBtdXRhdGUocHJvcCA9IHJvdW5kKCh0b3RhbC9zdW0odG90YWwpKjEwMCksMikpICU+JSANCiAgYXJyYW5nZSgtdG90YWwsIC1kaXNwKQ0KDQpQb3JjZW50YWplaXBob25lIDwtIFRhYmxhXzMgJT4lIA0KICBzZWxlY3QoZGlzcCxwcm9wKSAlPiUgDQogIGhlYWQoMSkgJT4lIA0KICBzZWxlY3QocHJvcCkNCg0KZGF0bzEgPC0gUG9yY2VudGFqZWlwaG9uZSRwcm9wDQoNCg0KR3JhZmljbzMgPC0gIGhjaGFydChUYWJsYV8zLCAidHJlZW1hcCIsIGhjYWVzKHggPSBkaXNwLCB2YWx1ZSA9IHRvdGFsLCBjb2xvciA9ICBwcm9wKSklPiUgDQogIGhjX3RpdGxlKHRleHQ9IkNhbnRpZGFkIGRlIHR3ZWV0cyBwb3IgZGlzcG9zaXRpdm8iKQ0KDQpHcmFmaWNvMw0KDQpUYWJsYV80IDwtIEJhc2VDUyAlPiUgDQogIHNlbGVjdChkaXNwLCBmZWNoYSkgJT4lDQogIGdyb3VwX2J5KGRpc3AsZmVjaGEpICU+JQ0KICBhcnJhbmdlKGZlY2hhKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsID0gbigpKSANCg0KDQpHcmFmaWNvNCA8LSAgVGFibGFfNCAlPiUgDQogIGhjaGFydCgibGluZSIsaGNhZXMoeCA9IGZlY2hhLCB5ID0gdG90YWwsIGdyb3VwID0gZGlzcCkpICU+JSANCiAgaGNfdGl0bGUodGV4dD0iQ2FudGlkYWQgZGUgdHdlZXRzIHNlZ8O6biBtw6lzIHBvciBkaXNwb3NpdGl2byIpDQogIA0KR3JhZmljbzQgIA0KDQoNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCklwaG9uZSByZXByZXNlbnRhIGxhIHBsYXRhZm9ybWEgbWF5b3JpdGFyaWEgZW4gcmVsYWNpw7NuIGFsIGVudmlvIGRlIG1lbnNhamVzIGNvbiBlbCBgciBkYXRvMWAlLiANCg0KUG9yIG90cmEgcGFydGUsIHRhbWJpZW4gZXMgcmVwcmVzZW50YXRpdm8gZGUgbGEgZWZlY3RpdmlkYWQgZGUgdW4gbWVuc2FqZSBlbCBkZW5vbWluYWRvIHJhdGlvIGRlIGxvcyB0d2VldHMuIENvbnNpc3RlIGVuIHVuIGPDoWxjdWxvIHF1ZSBlcyBiYXNpY2FtZW50ZSBlbCBjb2NpZW50ZSBlbnRyZSBsYSBjYW50aWRhZCBkZSByZXNwdWVzdGFzIGRlbCB0d2VldCB5IGxhIHN1bWEgZGVsIG7Dum1lcm8gZGUgZmF2cyB5IHJ0LiBEZSBlc3RhIG1hbmVyYSwgc2kgZWwgcmF0aW8gZXMgw6FsdG8gZXMgc2XDsWFsIGRlIHVuYSBtYWxhIGRpZnVzacOzbiBkZSBsb3MgbWVuc2FqZXMuDQoNCjxkaXYvPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KQmFzZVJhdGlvc2VsIDwtIEJhc2VDICU+JSANCiAgc2VsZWN0KGlkLGRhdGUsdGltZSx0d2VldCxyZXBsaWVzX2NvdW50LCByZXR3ZWV0c19jb3VudCwgbGlrZXNfY291bnQpICU+JSANCiAgbXV0YXRlKGZlY2hhID0gYXMuRGF0ZShkYXRlKSkgJT4lIA0KICBtdXRhdGUocmF0aW8gPSByb3VuZChyZXBsaWVzX2NvdW50LyhyZXR3ZWV0c19jb3VudCArIGxpa2VzX2NvdW50KSwyKSwNCiAgICAgICAgIGxhYmVsID0gcmF0aW8pICU+JSANCiAgZmlsdGVyKHJldHdlZXRzX2NvdW50ICE9ICcwJyAmIGxpa2VzX2NvdW50ICE9ICcwJykNCg0KVGFibGFfNSA8LSBCYXNlUmF0aW9zZWwgJT4lIA0KICBzZWxlY3QoZmVjaGEscmF0aW8pICU+JSANCiAgYXJyYW5nZShmZWNoYSkNCg0KDQpHcmFmaWNvNSA8LSAgaGlnaGNoYXJ0KCkgJT4lIA0KICBoY190aXRsZSh0ZXh0PSJFdm9sdWNpw7NuIGRlIFJhdGlvIiklPiUNCiAgaGNfY2hhcnQodHlwZT0ibGluZSIpICU+JQ0KICBoY194QXhpcyhjYXRlZ29yaWVzID0gVGFibGFfNSRmZWNoYSkgJT4lDQogIGhjX2FkZF9zZXJpZXMoVGFibGFfNSRyYXRpbywgbmFtZT0iUmF0aW8iKSAlPiUgDQogIGhjX2NvbG9ycygiIzEyMmM5MSIpDQoNCkdyYWZpY281DQpgYGANCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFbCBncsOhZmljbyBtdWVzdHJhIHVuYSBtdXkgYnVlbmEgcGVyZm9ybWFuY2UgZGUgbG9zIG1lbnNhamVzIGVtaXRpZG9zIHRlbmllbmRvIGVuIGN1ZW50YSBxdWUgbm8gc2Ugc3VwZXJhIGVsIDAsNSBkZSByYXRpby4gRXN0byBzaWduaWZpY2EgcXVlIGxvcyBtZW5zYWplcyBkZWwgUHJlc2lkZW50ZSB0dXZpZXJvbiBtZW5vcyByZXNwdWVzdGFzIGVuIGNvbXBhcmFjacOzbiBjb24gcmV0d2l0cyBvIGZhdnMuDQoNCjxkaXYvPg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpUYWJsYV82IDwtIEJhc2VSYXRpb3NlbCAlPiUgDQogIHNlbGVjdChmZWNoYSxyZXR3ZWV0c19jb3VudCkgJT4lIA0KICBncm91cF9ieShmZWNoYSkgJT4lIA0KICBzdW1tYXJpc2UoUlQ9c3VtKHJldHdlZXRzX2NvdW50KSkgJT4lIA0KICBhcnJhbmdlKGZlY2hhKQ0KDQoNCkdyYWZpY282IDwtICBoaWdoY2hhcnQoKSAlPiUgDQogIGhjX3RpdGxlKHRleHQ9IkV2b2x1Y2nDs24gZGUgUmV0d2VldHMiKSU+JQ0KICBoY19jaGFydCh0eXBlPSJsaW5lIikgJT4lDQogIGhjX3hBeGlzKGNhdGVnb3JpZXMgPSBUYWJsYV82JGZlY2hhKSAlPiUNCiAgaGNfYWRkX3NlcmllcyhUYWJsYV82JFJULCBuYW1lPSJSZXR3ZWV0cyIpICU+JSANCiAgaGNfY29sb3JzKCIjRDU1RTAwIikNCg0KR3JhZmljbzYNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpUYWJsYV83IDwtIEJhc2VSYXRpb3NlbCAlPiUgDQogIHNlbGVjdChmZWNoYSxsaWtlc19jb3VudCkgJT4lIA0KICBncm91cF9ieShmZWNoYSkgJT4lIA0KICBzdW1tYXJpc2UoRkFWUz1zdW0obGlrZXNfY291bnQpKSAlPiUgDQogIGFycmFuZ2UoZmVjaGEpDQoNCg0KR3JhZmljbzcgPC0gIGhpZ2hjaGFydCgpICU+JSANCiAgaGNfdGl0bGUodGV4dD0iRXZvbHVjacOzbiBkZSBGYXZzIiklPiUNCiAgaGNfY2hhcnQodHlwZT0ibGluZSIpICU+JQ0KICBoY194QXhpcyhjYXRlZ29yaWVzID0gVGFibGFfNyRmZWNoYSkgJT4lDQogIGhjX2FkZF9zZXJpZXMoVGFibGFfNyRGQVZTLCBuYW1lPSJGYXZzIikgJT4lIA0KICBoY19jb2xvcnMoIiMwMDEyNDciKQ0KDQpHcmFmaWNvNw0KDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQpBIGNvbnRpbnVhY2nDs24gc2UgbXVlc3RyYSBlbCBtZW5zYWplIG1hcyByZXR1aXRlYWRvIHkgZWwgbWFzIGZhdmVhZG8uDQo8ZGl2Lz4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0Kb3B0aW9ucyhzY2lwZW49OTk5KQ0KDQpNZW5zYWplTWFzUmV0dWl0ZWFkbyA8LSBCYXNlQyAlPiUgDQogIHNlbGVjdChpZCwgdHdlZXQsIHJldHdlZXRzX2NvdW50KSAlPiUgDQogIGFycmFuZ2UoZGVzYyhyZXR3ZWV0c19jb3VudCkpICU+JSANCiAgaGVhZCgxKQ0KDQpNZW5zYWplTWFzRmF2ZWFkbyA8LSBCYXNlQyAlPiUgDQogIHNlbGVjdChpZCwgdHdlZXQsIGxpa2VzX2NvdW50KSAlPiUgDQogIGFycmFuZ2UoZGVzYyhsaWtlc19jb3VudCkpICU+JSANCiAgaGVhZCgxKQ0KDQoNCmZhdiA8LSBNZW5zYWplTWFzRmF2ZWFkbyRpZA0KUlQgPC0gTWVuc2FqZU1hc1JldHVpdGVhZG8kaWQNCg0KIyBrYWJsZShNZW5zYWplTWFzRmF2ZWFkbywgYWxpZ24gPSAiciIpICU+JQ0KIyAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJjZW50ZXIiKSANCiMgDQojIGthYmxlKE1lbnNhamVNYXNSZXR1aXRlYWRvLCBhbGlnbiA9ICJyIikgJT4lDQojICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImNlbnRlciIpDQoNCmBgYA0KPGJyPg0KDQojIyMgVHdlZXQgY29uIG1heW9yIGNhbnRpZGFkIGRlIGZhdnMNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLG91dC53aWR0aCA9ICI4MDBweCIsIG91dC5oZWlnaHQ9IjUwMHB4IixmaWcuYWxpZ249J2xlZnQnfQ0KDQpsaWJyYXJ5KHR3ZWV0cm1kKQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygidHdlZXRmYXZzYWxiZXJ0by5qcGciKQ0KDQoNCg0KYGBgDQoNCg0KDQojIyMgVHdlZXQgY29uIG1heW9yIGNhbnRpZGFkIGRlIFJldHdlZXRzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnR3ZWV0X3NjcmVlbnNob3QodHdlZXRfdXJsKCJhbGZlcmRleiIsIFJUKSkNCg0KYGBgDQoNCiMjIE51YmUgZGUgcGFsYWJyYXMNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQpVbmEgYnVlbmEgbWFuZXJhIGRlIHJlcHJlc2VudGFyIGxhcyBwYWxhYnJhcyB1dGlsaXphZGFzIGNvbnNpc3RlIGVuIGNvbmZvcm1hciBsYXMgbnViZXMgZGUgcGFsYWJyYXMgbyBiYWcgb2Ygd29yZHMuIEJhc2ljYW1lbnRlIHNlIHRyYXRhIGRlIHZpc3VhbGl6YXIgY3VhbGVzIHNvbiBsb3MgdMOpcm1pbm9zIGRlIG1heW9yIHVzbyBtb3N0cmFuZG8gc3UgcGVzbyBlbiByZWxhY2nDs24gYSBsb3Mgb3Ryb3MuDQoNCkVzdGEgZXMgbGEgbnViZSBkZSBwYWxhYnJhcyBkZWwgYcOxbyBlbiBUd2l0dGVyIGRlIEFsYmVydG8gRmVybsOhbmRleg0KDQo8ZGl2Lz4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnBhbGFicmFzX2ludXRpbGVzIDwtIGMoJ3J0JywndScgLCd0LmNvJywgJ2h0dHBzJywgJ3RhbicsICdBbGJlcnRvJywgJ0Zlcm5hbmRleicsICdhbGJlcnRvJywgJ2Zlcm5hbmRleicsICdmZXJuw6FuZGV6JywgJ2NhZGEnKQ0KDQpCYXNlMSA8LSBhcy5kYXRhLmZyYW1lKEJhc2VDUykNCkJhc2UxJHR3ZWV0IDwtIGFzLmNoYXJhY3RlcihCYXNlMSR0d2VldCkNCg0KDQpCYXNlVG9rZW5zIDwtIEJhc2UxICU+JQ0KICBmaWx0ZXIocmV0d2VldD09IkZhbHNlIikgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHBhbGFicmEsIHR3ZWV0KSAlPiUNCiAgICBjb3VudChwYWxhYnJhLCBzb3J0PVRSVUUpICU+JQ0KICAgIGZpbHRlcighcGFsYWJyYSVpbiVzdG9wd29yZHMoJ2VzJykpICU+JQ0KICAgIGZpbHRlcighcGFsYWJyYSVpbiVwYWxhYnJhc19pbnV0aWxlcykgJT4lDQogICAgZmlsdGVyKHN0cl9kZXRlY3QocGFsYWJyYSwgIl5bYS16QS16XXxeI3xeQCIpKSU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICAgIHJlbmFtZSgnd29yZCc9cGFsYWJyYSkNCg0Kd29yZGNsb3VkKEJhc2VUb2tlbnMkd29yZCxCYXNlVG9rZW5zJG4sc2NhbGU9Yyg0LC4xKSxyYW5kb20ub3JkZXI9RkFMU0UscmFuZG9tLmNvbG9yPVRSVUUscm90LnBlcj0wLjQsY29sb3JzPWJyZXdlci5wYWwoNywiRGFyazIiKSkNCg0KDQpgYGANCg0KDQojIyMgUGFsYWJyYXMgcG9zaXRpdmFzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpCYXNlVG9rZW5zU0RBTCA8LSBsZWZ0X2pvaW4oQmFzZVRva2Vucywgc2RhbCkNCg0KVHdlZXRzUG9zIDwtIEJhc2VUb2tlbnNTREFMICU+JSANCiAgZmlsdGVyKCFpcy5uYShtZWRpYV9hZ3JhZG8pKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1lZGlhX2FncmFkbyksIGRlc2MobikpDQogDQpUb2tlblBvcyA8LSBUd2VldHNQb3MgJT4lIA0KICBoZWFkKDEwMCkNCg0KDQp3b3JkY2xvdWQoVG9rZW5Qb3Mkd29yZCxUb2tlblBvcyRuLHNjYWxlPWMoNCwuMSkscmFuZG9tLm9yZGVyPUZBTFNFLHJhbmRvbS5jb2xvcj1UUlVFLHJvdC5wZXI9MC40LGNvbG9ycz1icmV3ZXIucGFsKDcsIkRhcmsyIikpDQpgYGANCg0KDQojIyMgUGFsYWJyYXMgbmVnYXRpdmFzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpCYXNlVG9rZW5zU0RBTCA8LSBsZWZ0X2pvaW4oQmFzZVRva2Vucywgc2RhbCkNCiAgVHdlZXRzTmVnIDwtIEJhc2VUb2tlbnNTREFMICU+JSANCiAgZmlsdGVyKCFpcy5uYShtZWRpYV9hZ3JhZG8pKSAlPiUNCiAgYXJyYW5nZShtZWRpYV9hZ3JhZG8sIGRlc2MobikpDQogIA0KICANClRva2VuTmVnIDwtIFR3ZWV0c05lZyAlPiUgDQpoZWFkKDEwMCkNCg0KDQp3b3JkY2xvdWQoVG9rZW5OZWckd29yZCxUb2tlbk5lZyRuLHNjYWxlPWMoNCwuMSkscmFuZG9tLm9yZGVyPUZBTFNFLHJhbmRvbS5jb2xvcj1UUlVFLHJvdC5wZXI9MC40LGNvbG9ycz1icmV3ZXIucGFsKDcsIkRhcmsyIikpDQpgYGANCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpMYXMgcGFsYWJyYXMgcG9zaXRpdmFzIGVzdMOhbiB2aW5jdWxhZGFzIGEgc2VudGltaWVudG9zIGRlIGNhcmnDsW8geSBzYWx1ZG9zLCBtaWVudHJhcyBxdWUgZW4gbGFzIG5lZ2F0aXZhcyBzZSBlbmN1ZW50cmEgImRpc3RhbmNpYSIgZGViaWRvIGEgbGFzIHJlY29tZW5kYWNpb25lcyBkZSBhaXNsYW1pZW50by4gIA0KIA0KPGRpdi8+DQoNCg0KIyMgRGlzY3Vyc29zDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KTHVlZ28gZGUgYW5hbGl6YXIgbG9zIHR3ZWV0cyBlbWl0aWRvcyBwb3IgZWwgUHJlc2lkZW50ZSwgbGxlZ2EgZWwgdHVybm8gZGUgdmVyIHF1ZSBkaWNlbiBzdXMgZGlzY3Vyc29zLiBUb21hcmVtb3MgbG9zIGRpc2N1cnNvcyBkZWwgZGlhIDEzLCAyMCB5IDMwIGRlIG1hcnpvLCBjb24gZWwgb2JqZXRpdm8gZGUgYW5hbGl6YXIgY3VhbGVzIHNvbiBsYXMgcGFsYWJyYXMgcXVlIGZ1ZXJvbiB0b21hbmRvIG1heW9yIHByb3RhZ29uaXNtby4gDQoNCjxkaXYvPg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0xldmFudGFtb3MgbG9zIGRpc2N1cnNvcw0KDQojdHJhYmFqYW1vcyBlbCBwcmltZXIgZGlzY3Vyc28NCg0KRGlzY3Vyc28xIDwtIHJlYWQudGFibGUoIkRpc2N1cnNvMTMtMDMudHh0Iiwgc2VwPSJcciIsIGVuY29kaW5nID0gIlVURi04IikNCg0KQmFzZUQxIDwtIGFzLmRhdGEuZnJhbWUoRGlzY3Vyc28xKQ0KQmFzZUQxJFYxIDwtIGFzLmNoYXJhY3RlcihCYXNlRDEkVjEpDQpwYWxhYnJhczEgPC0gQmFzZUQxICU+JSANCiAgdW5uZXN0X3Rva2VucyhwYWxhYnJhLCBWMSkgJT4lIA0KICBtdXRhdGUoRmVjaGEgPSAiMTMtMDMiKQ0KDQpjYW50ZDEgPC0gbnJvdyhwYWxhYnJhczEpDQoNCnBhbGFicmFzMS4xIDwtIHBhbGFicmFzMSAlPiUgDQpjb3VudChwYWxhYnJhLCBzb3J0PVRSVUUpICU+JQ0KICAgIGZpbHRlcighcGFsYWJyYSVpbiVzdG9wd29yZHMoJ2VzJykpICU+JQ0KICAgIGZpbHRlcighcGFsYWJyYSVpbiVwYWxhYnJhc19pbnV0aWxlcykgJT4lDQogICAgZmlsdGVyKHN0cl9kZXRlY3QocGFsYWJyYSwgIl5bYS16QS16XXxeI3xeQCIpKSU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICAgIHJlbmFtZSgnd29yZCc9cGFsYWJyYSklPiUgDQogICAgbXV0YXRlKEZlY2hhID0gIjEzLTAzIikNCg0KI3RyYWJhamFtb3MgZWwgc2VndW5kbyBkaXNjdXJzbw0KDQpEaXNjdXJzbzIgPC0gcmVhZC50YWJsZSgiRGlzY3Vyc28yMC0wMy50eHQiLCBzZXA9IlxyIiwgZW5jb2RpbmcgPSAiVVRGLTgiKQ0KDQpCYXNlRDIgPC0gYXMuZGF0YS5mcmFtZShEaXNjdXJzbzIpDQpCYXNlRDIkVjEgPC0gYXMuY2hhcmFjdGVyKEJhc2VEMiRWMSkNCnBhbGFicmFzMiA8LSBCYXNlRDIgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHBhbGFicmEsIFYxKSAlPiUgDQogIG11dGF0ZShGZWNoYSA9ICIyMC0wMyIpDQoNCmNhbnRkMiA8LSBucm93KHBhbGFicmFzMikNCg0KcGFsYWJyYXMyLjEgPC0gcGFsYWJyYXMyICU+JSANCmNvdW50KHBhbGFicmEsIHNvcnQ9VFJVRSkgJT4lDQogICAgZmlsdGVyKCFwYWxhYnJhJWluJXN0b3B3b3JkcygnZXMnKSkgJT4lDQogICAgZmlsdGVyKCFwYWxhYnJhJWluJXBhbGFicmFzX2ludXRpbGVzKSAlPiUNCiAgICBmaWx0ZXIoc3RyX2RldGVjdChwYWxhYnJhLCAiXlthLXpBLXpdfF4jfF5AIikpJT4lDQogICAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogICAgcmVuYW1lKCd3b3JkJz1wYWxhYnJhKSU+JSANCiAgICBtdXRhdGUoRmVjaGEgPSAiMjAtMDMiKQ0KDQojdHJhYmFqYW1vcyBlbCB0ZXJjZXIgZGlzY3Vyc28NCg0KRGlzY3Vyc28zIDwtIHJlYWQudGFibGUoIkRpc2N1cnNvMzAtMDMudHh0Iiwgc2VwPSJcciIsIGVuY29kaW5nID0gIlVURi04IikNCg0KQmFzZUQzIDwtIGFzLmRhdGEuZnJhbWUoRGlzY3Vyc28zKQ0KQmFzZUQzJFYxIDwtIGFzLmNoYXJhY3RlcihCYXNlRDMkVjEpDQpwYWxhYnJhczMgPC0gQmFzZUQzICU+JSANCiAgdW5uZXN0X3Rva2VucyhwYWxhYnJhLCBWMSkgJT4lIA0KICBtdXRhdGUoRmVjaGEgPSAiMzAtMDMiKQ0KDQpjYW50ZDMgPC0gbnJvdyhwYWxhYnJhczMpDQoNCnBhbGFicmFzMy4xIDwtIHBhbGFicmFzMyAlPiUgDQpjb3VudChwYWxhYnJhLCBzb3J0PVRSVUUpICU+JQ0KICAgIGZpbHRlcighcGFsYWJyYSVpbiVzdG9wd29yZHMoJ2VzJykpICU+JQ0KICAgIGZpbHRlcighcGFsYWJyYSVpbiVwYWxhYnJhc19pbnV0aWxlcykgJT4lDQogICAgZmlsdGVyKHN0cl9kZXRlY3QocGFsYWJyYSwgIl5bYS16QS16XXxeI3xeQCIpKSU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICAgIHJlbmFtZSgnd29yZCc9cGFsYWJyYSklPiUgDQogICAgbXV0YXRlKEZlY2hhID0gIjMwLTAzIikNCg0KDQojZ3JhZmljb3MgZGVzY3JpcHRpdm9zDQoNCmRpc2N1cnNvc3RvZG9zIDwtIHJiaW5kKHBhbGFicmFzMSxwYWxhYnJhczIscGFsYWJyYXMzKQ0KcGFsYWJyYXN0b2RvcyA8LSByYmluZChwYWxhYnJhczEuMSxwYWxhYnJhczIuMSxwYWxhYnJhczMuMSkNCg0KVGFibGFfOCA8LSBkaXNjdXJzb3N0b2RvcyAlPiUgDQogIHNlbGVjdChGZWNoYSkgJT4lIA0KICBncm91cF9ieShGZWNoYSkgJT4lIA0KICBzdW1tYXJpc2UocGFsYWJyYXM9bigpKSAlPiUgDQogIGFycmFuZ2UoRmVjaGEpDQoNCg0KR3JhZmljbzggPC0gIGhpZ2hjaGFydCgpICU+JSANCiAgaGNfdGl0bGUodGV4dD0iQ2FudGlkYWQgZGUgUGFsYWJyYXMiKSU+JQ0KICBoY19jaGFydCh0eXBlPSJiYXIiKSAlPiUNCiAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IFRhYmxhXzgkRmVjaGEpICU+JQ0KICBoY19hZGRfc2VyaWVzKFRhYmxhXzgkcGFsYWJyYXMsIG5hbWU9IlBhbGFicmFzIikgJT4lIA0KICBoY19jb2xvcnMoIiMzMTliOTUiKQ0KDQpHcmFmaWNvOA0KDQoNCmBgYA0KDQoNCkxhIGNhbnRpZGFkIGRlIHBhbGFicmFzIGVtaXRpZGFzIGNyZWNpw7MgY29uc2lkZXJhYmxlbWVudGUgZW4gcmVsYWNpw7NuIGFsIHByaW1lciBkaXNjdXJzby4gVmVhbW9zIGFob3JhIGxhcyBudWJlcyBkZSBwYWxhYnJhcyBkZSB0b2RvcyBsb3MgZGlzY3Vyc29zDQoNCiMjIyBEaXNjdXJzbyAxMy0wMw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojbnViZSBkZSBwYWxhYnJhcyBkaXNjdXJzbyAxDQoNCndvcmRjbG91ZChwYWxhYnJhczEuMSR3b3JkLEJhc2VUb2tlbnMkbixzY2FsZT1jKDQsLjEpLHJhbmRvbS5vcmRlcj1GQUxTRSxyYW5kb20uY29sb3I9VFJVRSxyb3QucGVyPTAuNCxjb2xvcnM9YnJld2VyLnBhbCg3LCJEYXJrMiIpKQ0KDQoNCg0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpTZSBvYnNlcnZhIHVuYSBmdWVydGUgeSBsw7NnaWNhIHByZXNlbmNpYSBkZSBsYSBwYWxhYnJhICJDb3JvbmF2aXJ1cyIgYWwgaWd1YWwgcXVlICJwZXJzb25hcyIuIEVsIDIwIGRlIG1hcnpvLCBlbCBQcmVzaWRlbnRlIGRpw7MgaW5pY2lvIGZvcm1hbCBhIGxhIGN1YXJ0ZW50ZW5hIG9ibGlnYXRvcmlhLiBFc3RhcyBmdWVyb24gbGFzIHBhbGFicmFzIG3DoXMgdXRpbGl6YWRhcw0KDQo8ZGl2Lz4NCg0KIyMjIERpc2N1cnNvIDIwLTAzDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojbnViZSBkZSBwYWxhYnJhcyBkaXNjdXJzbyAyDQoNCndvcmRjbG91ZChwYWxhYnJhczIuMSR3b3JkLEJhc2VUb2tlbnMkbixzY2FsZT1jKDQsLjEpLHJhbmRvbS5vcmRlcj1GQUxTRSxyYW5kb20uY29sb3I9VFJVRSxyb3QucGVyPTAuNCxjb2xvcnM9YnJld2VyLnBhbCg3LCJEYXJrMiIpKQ0KDQoNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KVGFsIGN1YWwgc2UgYXByZWNpYSwgbGEgcGFsYWJyYSAiZWNvbm9tw61hIiBjb21pZW56YSBhIHRvbWFyIG1heW9yIHByb3RhZ29uaXNtby4gRWwgZGlhIDMwIGRlIG1hcnpvIHNlIHByb2xvbmfDsyBsYSBjdWFyZW50ZW5hLCBjb24gbG9zIHNpZ3VpZW50ZXMgdMOpcm1pbm9zLiANCg0KPGRpdi8+DQoNCiMjIyBEaXNjdXJzbyAzMC0wMw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KDQoNCndvcmRjbG91ZChwYWxhYnJhczMuMSR3b3JkLEJhc2VUb2tlbnMkbixzY2FsZT1jKDQsLjEpLHJhbmRvbS5vcmRlcj1GQUxTRSxyYW5kb20uY29sb3I9VFJVRSxyb3QucGVyPTAuNCxjb2xvcnM9YnJld2VyLnBhbCg3LCJEYXJrMiIpKQ0KDQoNCg0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFbiBlc3RlIMO6bHRpbW8gZGlzY3Vyc28sIGxhIHBhbGFicmEgcHJvdGFnb25pc3RhIGVzICJjdWFyZW50ZW5hIi4gVGFtYmllbiBwdWVkZSByZXN1bHRhciBzaWduaWZpY2F0aXZvIGV2YWx1YXIgZWwgcGVzbyBkZSBsYSBlY29ub21pYSB5IGxhIHNhbHVkIGVuIGNhZGEgdW5vIGRlIGxvcyBkaXNjdXJzb3MgYW5hbGl6YWRvcy4NCg0KPGRpdi8+DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNClRhYmxhXzkgPC0gcGFsYWJyYXN0b2RvcyAlPiUgDQogIGZpbHRlcih3b3JkICVpbiUgYygnc2FsdWQnLCdlY29ub23DrWEnKSkgJT4lIA0KICBhcnJhbmdlKEZlY2hhKSAlPiUgDQogIHNwcmVhZChrZXkgPSB3b3JkLHZhbHVlID0gbikNCg0KDQoNCkdyYWZpY285IDwtICBoaWdoY2hhcnQoKSAlPiUgDQogIGhjX3RpdGxlKHRleHQ9IkV2b2x1Y2nDs24gZGUgcGFsYWJyYXMgY2xhdmUiKSU+JQ0KICBoY19jaGFydCh0eXBlPSJjb2x1bW4iKSAlPiUNCiAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IFRhYmxhXzkkRmVjaGEpICU+JQ0KICBoY19hZGRfc2VyaWVzKFRhYmxhXzkkc2FsdWQsIG5hbWU9IlNhbHVkIiwgY29sb3IgPSAiIzJjNjk4ZCIgKSAlPiUgDQogIGhjX2FkZF9zZXJpZXMoVGFibGFfOSRlY29ub23DrWEsIG5hbWU9IkVjb25vbcOtYSIsIGNvbG9yID0gIiMyNzI2NDMiICkNCkdyYWZpY285DQoNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KUHVlZGUgYXByZWNpYXJzZSBxdWUgbGEgcGFsYWJyYSAiZWNvbm9tw61hIiBubyBhcGFyZWNlIGVuIGVsIHByaW1lciBkaXNjdXJzbywgc2lubyBlbiBsb3Mgc2lndWllbnRlcy4NCg0KDQo8ZGl2Lz4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KI2xldmFudGFtb3MgYmFzZSBjb24gbWVuY2lvbmVzDQoNCmJhc2VoYXNoIDwtIHJlYWQuY3N2KCJ0d2VldHNBbGJlcnRvaGFzaC5jc3YiLCBlbmNvZGluZyA9ICJVVEYtOCIpDQoNCmNhbnQyIDwtIG5yb3coYmFzZWhhc2gpDQoNCg0KYGBgDQoNCiMjIE1lbmNpb25lcw0KDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpDZXJyYW1vcyBlbCBpbmZvcm1lIGNvbiB1biBicmV2ZSBhbsOhbGlzaXMgZGUgbGFzIG1lbmNpb25lcyBhIGxhIGN1ZW50YSBkZSBBbGJlcnRvIEZlcm5hbmRlei4gRXN0b3MgdHdlZXRzIHB1ZWRlbiBzZXIgcmVzcHVlc3RhcyBhIG1lbnNhamVzIGRlbCBQcmVzaWRlbnRlIGNvbW8gYXNpIHRhbWJpZW4gbWVuc2FqZXMgaGFjaWEgc3UgZmlndXJhLiBMYSBiYXNlIGRlIHRyYWJham8gY29udGllbmUgYHIgY2FudDJgIHR3ZWV0cyByZWNvbGVjdGFkb3MgZW50cmUgZWwgMTMgeSBlbCAxOSBkZSBtYXJ6by4NClZlYW1vcyBjb21vIHNlIGRpc3RyaWJ1eWUgZXN0YSBtdWVzdHJhIHNpIHRvbWFtb3MgZW4gY29uc2lkZXJhY2nDs24gZWwgZGlzcG9zaXRpdm8gcG9yIGVsIGN1YWwgZnVlcm9uIGVtaXRpZG9zIGxvcyBtZW5zYWplcy4NCg0KPGRpdi8+DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNClRhYmxhXzEwIDwtIGJhc2VoYXNoICU+JSANCiAgc2VsZWN0KHNvdXJjZSkgJT4lDQogIGdyb3VwX2J5KHNvdXJjZSkgJT4lDQogIHN1bW1hcmlzZSh0b3RhbCA9IG4oKSkgJT4lIA0KICBtdXRhdGUocHJvcCA9IHJvdW5kKCh0b3RhbC9zdW0odG90YWwpKjEwMCksMikpICU+JSANCiAgYXJyYW5nZSgtdG90YWwsIC1zb3VyY2UpICU+JSANCiAgaGVhZCg2KQ0KDQojIFBvcmNlbnRhamVpcGhvbmUgPC0gVGFibGFfMyAlPiUgDQojICAgc2VsZWN0KGRpc3AscHJvcCkgJT4lIA0KIyAgIGhlYWQoMSkgJT4lIA0KIyAgIHNlbGVjdChwcm9wKQ0KIyANCiMgZGF0bzEgPC0gUG9yY2VudGFqZWlwaG9uZSRwcm9wDQoNCg0KR3JhZmljbzEwIDwtICBoY2hhcnQoVGFibGFfMTAsICJ0cmVlbWFwIiwgaGNhZXMoeCA9IHNvdXJjZSwgdmFsdWUgPSB0b3RhbCwgY29sb3IgPSAgcHJvcCkpJT4lIA0KICBoY190aXRsZSh0ZXh0PSJDYW50aWRhZCBkZSB0d2VldHMgcG9yIGRpc3Bvc2l0aXZvIikNCg0KR3JhZmljbzEwDQoNCg0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpNYXMgZGVsIDYwICUgZGUgbG9zIG1lbnNhamVzIHJlY29sZWN0YWRvcyBmdWVyb24gZW1pdGlkb3MgZGVzZGUgdW4gZGlzcG9zaXRpdm8gQW5kcm9pZC4NCg0KVmVhbW9zIGFob3JhIGxhIG51YmUgZGUgcGFsYWJyYXMgZGUgZXN0b3MgbWVuc2FqZXMNCg0KPGRpdi8+DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCnBhbGFicmFzX2ludXRpbGVzIDwtIGMoJ3J0JywndScgLCd0LmNvJywgJ2h0dHBzJywgJ3RhbicsICdBbGJlcnRvJywgJ0Zlcm5hbmRleicsICdhbGJlcnRvJywgJ2Zlcm5hbmRleicsICdmZXJuw6FuZGV6JywgJ2NhZGEnLCAnYWxmZXJkZXonLCAnbicsJ3MnLCdxJywnbScsJ2QnLCdlc3QnLCdhcycsJ2FsZmVyZGV6cHJlbnNhJywgJ2RhbnRlZm9yZXNpJykNCg0KYmFzZWhhc2ggPC0gYXMuZGF0YS5mcmFtZShiYXNlaGFzaCkNCmJhc2VoYXNoJHRleHQgPC0gYXMuY2hhcmFjdGVyKGJhc2VoYXNoJHRleHQpDQoNCg0KQmFzZVRva2VucyA8LSBiYXNlaGFzaCAlPiUNCiAgdW5uZXN0X3Rva2VucyhwYWxhYnJhLCB0ZXh0KSAlPiUNCiAgICBjb3VudChwYWxhYnJhLCBzb3J0PVRSVUUpICU+JQ0KICAgIGZpbHRlcighcGFsYWJyYSVpbiVzdG9wd29yZHMoJ2VzJykpICU+JQ0KICAgIGZpbHRlcighcGFsYWJyYSVpbiVwYWxhYnJhc19pbnV0aWxlcykgJT4lDQogICAgZmlsdGVyKHN0cl9kZXRlY3QocGFsYWJyYSwgIl5bYS16QS16XXxeI3xeQCIpKSU+JQ0KICAgIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICAgIHJlbmFtZSgnd29yZCc9cGFsYWJyYSkNCg0Kd29yZGNsb3VkKEJhc2VUb2tlbnMkd29yZCxCYXNlVG9rZW5zJG4sc2NhbGU9Yyg0LC4xKSxyYW5kb20ub3JkZXI9RkFMU0UscmFuZG9tLmNvbG9yPUZBTFNFLHJvdC5wZXI9MC40LGNvbG9ycz1icmV3ZXIucGFsKDcsIkRhcmsyIiksbWF4LndvcmRzID0gMTAwKQ0KDQoNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KQSBjb250aW51YWNpw7NuLCBsYSBudWJlIGRlIHBhbGFicmFzIHBvc2l0aXZhcy4NCg0KPGRpdi8+DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCkJhc2VUb2tlbnNTREFMMiA8LSBsZWZ0X2pvaW4oQmFzZVRva2Vucywgc2RhbCkNCg0KVHdlZXRzUG9zIDwtIEJhc2VUb2tlbnNTREFMMiAlPiUgDQogIGZpbHRlcighaXMubmEobWVkaWFfYWdyYWRvKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtZWRpYV9hZ3JhZG8pLCBkZXNjKG4pKQ0KIA0KVG9rZW5Qb3MgPC0gVHdlZXRzUG9zICU+JSANCiAgaGVhZCgxMDApDQoNCg0Kd29yZGNsb3VkKFRva2VuUG9zJHdvcmQsVG9rZW5Qb3MkbixzY2FsZT1jKDQsLjEpLHJhbmRvbS5vcmRlcj1GQUxTRSxyYW5kb20uY29sb3I9VFJVRSxyb3QucGVyPTAuNCxjb2xvcnM9YnJld2VyLnBhbCg3LCJEYXJrMiIpKQ0KDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkEgY29udGludWFjacOzbiwgbGEgbnViZSBkZSBwYWxhYnJhcyBuZWdhdGl2YXMuDQoNCjxkaXYvPg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCkJhc2VUb2tlbnNTREFMMiA8LSBsZWZ0X2pvaW4oQmFzZVRva2Vucywgc2RhbCkNCg0KVHdlZXRzTmVnIDwtIEJhc2VUb2tlbnNTREFMMiAlPiUgDQogIGZpbHRlcighaXMubmEobWVkaWFfYWdyYWRvKSkgJT4lDQogIGFycmFuZ2UobWVkaWFfYWdyYWRvLCBkZXNjKG4pKQ0KIA0KVG9rZW5OZWcgPC0gVHdlZXRzTmVnICU+JSANCiAgaGVhZCgxMDApDQoNCg0Kd29yZGNsb3VkKFRva2VuTmVnJHdvcmQsVG9rZW5OZWckbixzY2FsZT1jKDQsLjEpLHJhbmRvbS5vcmRlcj1GQUxTRSxyYW5kb20uY29sb3I9VFJVRSxyb3QucGVyPTAuNCxjb2xvcnM9YnJld2VyLnBhbCg3LCJEYXJrMiIpKQ0KDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNClBhcmEgY2VycmFyLCBjbGFzaWZpY2FyZW1vcyB0b2RhcyBsYXMgcGFsYWJyYXMgZGUgZXN0YSByZWNvbGVjY2nDs24gY29uIGVsIGRpY2Npb25hcmlvIE5SQy4gRXN0ZSBkaWNjaW9uYXJpbyBjbGFzaWZpY2EgcGFsYWJyYXMgc2Vnw7puIHVuYSBtYXlvciBjYW50aWRhZCBkZSBzZW50aW1pZW50b3MuDQoNCjxkaXYvPg0KDQpgYGB7cn0NCiNjYXJnYSBkZSBkaWNjaW9uYXJpbyBOUkMNCmhhc2hucmNfZGF0YSA8LSBnZXRfbnJjX3NlbnRpbWVudChjaGFyX3YgPSBCYXNlVG9rZW5zJHdvcmQsIGxhbmd1YWdlID0gJ3NwYW5pc2gnKQ0KDQpoYXNobnJjX2RhdGEgPC0gaGFzaG5yY19kYXRhICU+JSANCiAgcmVuYW1lKCdhbnRpY2lwYWNpw7NuJz1hbnRpY2lwYXRpb24sDQogICAgICAgICAgICdpcmEnPWFuZ2VyLA0KICAgICAgICAgICAnZGlzZ3VzdG8nPWRpc2d1c3QsDQogICAgICAgICAgICdtaWVkbyc9ZmVhciwNCiAgICAgICAgICAgJ2FsZWdyw61hJz1qb3ksDQogICAgICAgICAgICd0cmlzdGV6YSc9c2FkbmVzcywNCiAgICAgICAgICAgJ3NvcnByZXNhJz1zdXJwcmlzZSwNCiAgICAgICAgICAgJ2NvbmZpYW56YSc9dHJ1c3QsDQogICAgICAgICAgICduZWdhdGl2YSc9bmVnYXRpdmUsDQogICAgICAgICAgICdwb3NpdGl2YSc9cG9zaXRpdmUpDQoNCiNNYW5pcHVsYWNpw7NuIGRlIGRhdGENCmJhc2VfZW1vY2lvbmhhc2ggPC0gZGF0YS5mcmFtZSh0KGhhc2hucmNfZGF0YSkpDQpiYXNlX2Vtb2Npb25oYXNoIDwtIGRhdGEuZnJhbWUocm93U3VtcyhiYXNlX2Vtb2Npb25oYXNoKSkNCm5hbWVzKGJhc2VfZW1vY2lvbmhhc2gpWzFdIDwtICJ0b3RhbCINCmJhc2VfZW1vY2lvbmhhc2ggPC0gY2JpbmQoJ3NlbnRpbWllbnRvJz1yb3duYW1lcyhiYXNlX2Vtb2Npb25oYXNoKSxiYXNlX2Vtb2Npb25oYXNoKQ0Kcm93bmFtZXMoYmFzZV9lbW9jaW9uaGFzaCkgPC0gTlVMTA0KDQojR3JhZmljYW1vcw0KIyBnZ3Bsb3QoYmFzZV9lbW9jaW9uaGFzaFsxOjgsXSwgYWVzKHggPSBzZW50aW1pZW50bywgeSA9IHJvdW5kKGN1ZW50YS9zdW0oY3VlbnRhKSoxMDAsIDEpLCBmaWxsID0gc2VudGltaWVudG8pKSArIA0KIyAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQojICAgbGFicyh0aXRsZT0nRWxlY2Npb25lcyBBbGJlcnRvIEZlcm5hbmRleiAtIFNlbnRpbWVudCBBbmFseXNpcyAoTlJDKScsDQojICAgICAgICBzdWJ0aXRsZSA9ICdUcmFiYWpvIEZpbmFsIFRhbGxlciBkZSBBbsOhbGlzaXMgZGUgVGV4dG8gZGVsIENQUycsDQojICAgICAgICBjYXB0aW9uPSdGdWVudGU6IFR3aXR0ZXInLA0KIyAgICAgICAgeCA9ICJTZW50aW1pZW50byIsIA0KIyAgICAgICAgeSA9ICJGcmVjdWVuY2lhIikgKw0KIyAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZShyb3VuZChjdWVudGEvc3VtKGN1ZW50YSkqMTAwLCAxKSwgJyUnKSksDQojICAgICAgICAgICAgIHZqdXN0ID0gMS41LCBjb2xvciA9ICJibGFjayIsDQojICAgICAgICAgICAgIHNpemUgPSA0KQ0KDQpiYXNlX2Vtb2Npb25oYXNoMiA8LSBiYXNlX2Vtb2Npb25oYXNoICU+JSANCiAgaGVhZCg4KSAlPiUgDQogIG11dGF0ZShjb2xvciA9IGNhc2Vfd2hlbihzZW50aW1pZW50byA9PSAibWllZG8ifiAiI2ZmNGQ0ZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW1pZW50byA9PSAiaXJhIn4gIiNmZjRkNGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGltaWVudG8gPT0gImRpc2d1c3RvIn4gIiNmZjRkNGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGltaWVudG8gPT0gInRyaXN0ZXphIn4gIiNmZjRkNGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGltaWVudG8gPT0gImFudGljaXBhY2nDs24ifiAiIzM2YjMzNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW1pZW50byA9PSAiYWxlZ3LDrWEifiAiIzM2YjMzNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW1pZW50byA9PSAic29ycHJlc2EifiAiIzM2YjMzNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW1pZW50byA9PSAiY29uZmlhbnphIn4gIiMzNmIzMzYiLCkpICU+JSANCiAgYXJyYW5nZSh0b3RhbCkgJT4lIA0KICBtdXRhdGUoIiUiID0gcm91bmQoKHRvdGFsL3N1bSh0b3RhbCkqMTAwKSwyKSkNCg0KeCA8LSBjKCJ0b3RhbCIsICIlIikNCnkgPC0gc3ByaW50Zigie3BvaW50LiVzfSIsIGMoInRvdGFsIiwgIiUiKSkNCnRsdGlwIDwtIHRvb2x0aXBfdGFibGUoeCwgeSkNCg0KR3JhZmljbzExIDwtICBoaWdoY2hhcnQoKSAlPiUgDQogIGhjX3RpdGxlKHRleHQ9IlNlbnRpbWllbnRvcyIpJT4lDQogICNoY19jaGFydCh0eXBlPSJjb2x1bW4iKSAlPiUNCiAgaGNfeEF4aXMoY2F0ZWdvcmllcyA9IGJhc2VfZW1vY2lvbmhhc2gyJHNlbnRpbWllbnRvKSAlPiUNCiAgaGNfYWRkX3NlcmllcyhiYXNlX2Vtb2Npb25oYXNoMiwiY29sdW1uIiwgaGNhZXMoYmFzZV9lbW9jaW9uaGFzaDIkc2VudGltaWVudG8sYmFzZV9lbW9jaW9uaGFzaDIkYCVgLCBjb2xvciA9IGJhc2VfZW1vY2lvbmhhc2gyJGNvbG9yKSwgbmFtZSA9ICJTZW50aW1pZW50b3MiKSAlPiUgDQogIGhjX3Rvb2x0aXAodXNlSFRNTCA9IFRSVUUsDQogICAgaGVhZGVyRm9ybWF0ID0gYXMuY2hhcmFjdGVyKHRhZ3Mkc21hbGwoIntwb2ludC54OiAlWSAlYn0iKSksDQogICAgcG9pbnRGb3JtYXQgPSB0bHRpcA0KICApDQoNCg0KDQpHcmFmaWNvMTENCg0KDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkxhcyBwYWxhYnJhcyB2aW5jdWxhZGFzIGNvbiBlbCBzZW50aW1pZW50byBkZSBjb25maWFuemEgc29uIGxhcyBtYXlvcml0YXJpYXMuIA0KDQo8ZGl2Lz4NCg==